summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-04-20 10:00:54 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-04-20 10:00:54 +0000
commit3cccd102ba543e02725d247893729e5c73b38295 (patch)
treef36a04ec38517f5deaaacb5acc7d949688d1e187
parent205943281328046ef7b4528031b90fbda70c75ac (diff)
downloadgitlab-ce-3cccd102ba543e02725d247893729e5c73b38295.tar.gz
Add latest changes from gitlab-org/gitlab@14-10-stable-eev14.10.0-rc42
-rw-r--r--.editorconfig3
-rw-r--r--.eslintrc.yml6
-rw-r--r--.git-blame-ignore-revs130
-rw-r--r--.gitlab-ci.yml7
-rw-r--r--.gitlab/CODEOWNERS453
-rw-r--r--.gitlab/ci/cng.gitlab-ci.yml51
-rw-r--r--.gitlab/ci/docs.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml13
-rw-r--r--.gitlab/ci/global.gitlab-ci.yml33
-rw-r--r--.gitlab/ci/graphql.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/qa.gitlab-ci.yml20
-rw-r--r--.gitlab/ci/rails.gitlab-ci.yml8
-rw-r--r--.gitlab/ci/reports.gitlab-ci.yml6
-rw-r--r--.gitlab/ci/review-apps/qa.gitlab-ci.yml62
-rw-r--r--.gitlab/ci/review.gitlab-ci.yml12
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml91
-rw-r--r--.gitlab/ci/setup.gitlab-ci.yml9
-rw-r--r--.gitlab/ci/static-analysis.gitlab-ci.yml23
-rw-r--r--.gitlab/ci/yaml.gitlab-ci.yml12
-rw-r--r--.gitlab/issue_templates/Default.md11
-rw-r--r--.gitlab/issue_templates/Doc_cleanup.md33
-rw-r--r--.gitlab/issue_templates/Feature Flag Roll Out.md15
-rw-r--r--.gitlab/issue_templates/Feature proposal - detailed.md2
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new Git repository type.md13
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new blob type.md13
-rw-r--r--.gitlab/issue_templates/Implementation.md12
-rw-r--r--.gitlab/issue_templates/Vulnerability Disclosure.md98
-rw-r--r--.gitlab/merge_request_templates/Default.md44
-rw-r--r--.gitlab/merge_request_templates/Documentation.md18
-rw-r--r--.gitpod.yml2
-rw-r--r--.haml-lint.yml1
-rw-r--r--.rubocop.yml10
-rw-r--r--.rubocop_todo.yml307
-rw-r--r--.rubocop_todo/capybara/visibility_matcher.yml87
-rw-r--r--.rubocop_todo/database/disable_referential_integrity.yml4
-rw-r--r--.rubocop_todo/layout/argument_alignment.yml953
-rw-r--r--.rubocop_todo/layout/first_array_element_indentation.yml357
-rw-r--r--.rubocop_todo/layout/first_hash_element_indentation.yml567
-rw-r--r--.rubocop_todo/layout/hash_alignment.yml732
-rw-r--r--.rubocop_todo/layout/line_length.yml6603
-rw-r--r--.rubocop_todo/layout/multiline_operation_indentation.yml106
-rw-r--r--.rubocop_todo/layout/space_around_method_call_operator.yml32
-rw-r--r--.rubocop_todo/layout/space_in_lambda_literal.yml402
-rw-r--r--.rubocop_todo/layout/space_inside_block_braces.yml770
-rw-r--r--.rubocop_todo/layout/space_inside_parens.yml440
-rw-r--r--.rubocop_todo/lint/binary_operator_with_identical_operands.yml15
-rw-r--r--.rubocop_todo/lint/constant_definition_in_block.yml53
-rw-r--r--.rubocop_todo/lint/missing_cop_enable_directive.yml196
-rw-r--r--.rubocop_todo/lint/struct_new_override.yml6
-rw-r--r--.rubocop_todo/metrics/abc_size.yml14
-rw-r--r--.rubocop_todo/metrics/cyclomatic_complexity.yml23
-rw-r--r--.rubocop_todo/metrics/perceived_complexity.yml24
-rw-r--r--.rubocop_todo/naming/heredoc_delimiter_case.yml8
-rw-r--r--.rubocop_todo/performance/string_include.yml15
-rw-r--r--.rubocop_todo/rails/inquiry.yml4
-rw-r--r--.rubocop_todo/rails/render_inline.yml4
-rw-r--r--.rubocop_todo/rspec/any_instance_of.yml2
-rw-r--r--.rubocop_todo/rspec/empty_example_group.yml5
-rw-r--r--.rubocop_todo/rspec/verified_doubles.yml4
-rw-r--r--.rubocop_todo/style/array_coercion.yml10
-rw-r--r--.rubocop_todo/style/combinable_loops.yml10
-rw-r--r--.rubocop_todo/style/open_struct_use.yml8
-rw-r--r--.stylelintrc4
-rw-r--r--CHANGELOG.md69
-rw-r--r--Dangerfile14
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_KAS_VERSION2
-rw-r--r--GITLAB_SHELL_VERSION2
-rw-r--r--Gemfile19
-rw-r--r--Gemfile.lock170
-rwxr-xr-xRakefile3
-rw-r--r--app/assets/images/auth_buttons/alicloud_64.pngbin0 -> 3538 bytes
-rw-r--r--app/assets/images/checkmark.pngbin596 -> 0 bytes
-rw-r--r--app/assets/images/learn_gitlab/graduation_hat.svg1
-rw-r--r--app/assets/javascripts/access_tokens/graphql/queries/get_projects.query.graphql2
-rw-r--r--app/assets/javascripts/admin/topics/components/remove_avatar.vue13
-rw-r--r--app/assets/javascripts/admin/topics/index.js3
-rw-r--r--app/assets/javascripts/admin/users/components/actions/delete.vue39
-rw-r--r--app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue39
-rw-r--r--app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue52
-rw-r--r--app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue112
-rw-r--r--app/assets/javascripts/admin/users/components/modals/delete_user_modal_event_hub.js5
-rw-r--r--app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue77
-rw-r--r--app/assets/javascripts/admin/users/constants.js6
-rw-r--r--app/assets/javascripts/admin/users/index.js47
-rw-r--r--app/assets/javascripts/analytics/devops_reports/components/service_ping_disabled.vue2
-rw-r--r--app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue8
-rw-r--r--app/assets/javascripts/analytics/shared/utils.js2
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql2
-rw-r--r--app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql2
-rw-r--r--app/assets/javascripts/api.js53
-rw-r--r--app/assets/javascripts/api/alert_management_alerts_api.js62
-rw-r--r--app/assets/javascripts/api/projects_api.js2
-rw-r--r--app/assets/javascripts/attention_requests/components/navigation_popover.vue4
-rw-r--r--app/assets/javascripts/behaviors/gl_emoji.js59
-rw-r--r--app/assets/javascripts/behaviors/markdown/render_gfm.js2
-rw-r--r--app/assets/javascripts/behaviors/markdown/render_kroki.js2
-rw-r--r--app/assets/javascripts/behaviors/secret_values.js4
-rw-r--r--app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js31
-rw-r--r--app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js2
-rw-r--r--app/assets/javascripts/behaviors/shortcuts/shortcuts_wiki.js2
-rw-r--r--app/assets/javascripts/blob/balsamiq/balsamiq_viewer.js111
-rw-r--r--app/assets/javascripts/blob/balsamiq_viewer.js22
-rw-r--r--app/assets/javascripts/blob/line_highlighter.js2
-rw-r--r--app/assets/javascripts/blob/pdf/pdf_viewer.vue2
-rw-r--r--app/assets/javascripts/blob/viewer/index.js8
-rw-r--r--app/assets/javascripts/boards/boards_util.js3
-rw-r--r--app/assets/javascripts/boards/components/board_app.vue3
-rw-r--r--app/assets/javascripts/boards/components/board_card_inner.vue4
-rw-r--r--app/assets/javascripts/boards/components/board_content.vue4
-rw-r--r--app/assets/javascripts/boards/components/board_filtered_search.vue30
-rw-r--r--app/assets/javascripts/boards/components/board_form.vue6
-rw-r--r--app/assets/javascripts/boards/components/board_list.vue8
-rw-r--r--app/assets/javascripts/boards/components/board_list_header.vue12
-rw-r--r--app/assets/javascripts/boards/components/board_top_bar.vue54
-rw-r--r--app/assets/javascripts/boards/components/boards_selector.vue47
-rw-r--r--app/assets/javascripts/boards/components/config_toggle.vue11
-rw-r--r--app/assets/javascripts/boards/components/issuable_title.vue21
-rw-r--r--app/assets/javascripts/boards/components/issue_board_filtered_search.vue12
-rw-r--r--app/assets/javascripts/boards/components/issue_time_estimate.vue2
-rw-r--r--app/assets/javascripts/boards/components/item_count.vue2
-rw-r--r--app/assets/javascripts/boards/components/toggle_focus.vue9
-rw-r--r--app/assets/javascripts/boards/config_toggle.js25
-rw-r--r--app/assets/javascripts/boards/graphql/group_projects.query.graphql2
-rw-r--r--app/assets/javascripts/boards/index.js94
-rw-r--r--app/assets/javascripts/boards/mixins/sortable_default_options.js31
-rw-r--r--app/assets/javascripts/boards/mount_filtered_search_issue_boards.js42
-rw-r--r--app/assets/javascripts/boards/mount_multiple_boards_switcher.js50
-rw-r--r--app/assets/javascripts/boards/new_board.js29
-rw-r--r--app/assets/javascripts/boards/toggle_epics_swimlanes.js1
-rw-r--r--app/assets/javascripts/boards/toggle_focus.js18
-rw-r--r--app/assets/javascripts/boards/toggle_labels.js1
-rw-r--r--app/assets/javascripts/branches/divergence_graph.js4
-rw-r--r--app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue19
-rw-r--r--app/assets/javascripts/ci_variable_list/ci_variable_list.js8
-rw-r--r--app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue2
-rw-r--r--app/assets/javascripts/clusters/agents/graphql/queries/get_cluster_agent.query.graphql2
-rw-r--r--app/assets/javascripts/clusters/clusters_bundle.js8
-rw-r--r--app/assets/javascripts/clusters/forms/stores/state.js2
-rw-r--r--app/assets/javascripts/clusters/services/clusters_service.js2
-rw-r--r--app/assets/javascripts/clusters/stores/clusters_store.js2
-rw-r--r--app/assets/javascripts/clusters_list/clusters_util.js13
-rw-r--r--app/assets/javascripts/clusters_list/components/agent_empty_state.vue47
-rw-r--r--app/assets/javascripts/clusters_list/components/agent_table.vue2
-rw-r--r--app/assets/javascripts/clusters_list/components/agent_token.vue35
-rw-r--r--app/assets/javascripts/clusters_list/components/agents.vue4
-rw-r--r--app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue21
-rw-r--r--app/assets/javascripts/clusters_list/components/clusters_actions.vue102
-rw-r--r--app/assets/javascripts/clusters_list/components/clusters_empty_state.vue40
-rw-r--r--app/assets/javascripts/clusters_list/components/clusters_view_all.vue67
-rw-r--r--app/assets/javascripts/clusters_list/components/install_agent_modal.vue2
-rw-r--r--app/assets/javascripts/clusters_list/constants.js56
-rw-r--r--app/assets/javascripts/clusters_list/graphql/queries/get_agents.query.graphql2
-rw-r--r--app/assets/javascripts/clusters_list/index.js2
-rw-r--r--app/assets/javascripts/code_navigation/components/app.vue8
-rw-r--r--app/assets/javascripts/code_navigation/store/actions.js6
-rw-r--r--app/assets/javascripts/code_navigation/store/mutations.js3
-rw-r--r--app/assets/javascripts/code_navigation/store/state.js1
-rw-r--r--app/assets/javascripts/code_navigation/utils/dom_utils.js31
-rw-r--r--app/assets/javascripts/code_navigation/utils/index.js17
-rw-r--r--app/assets/javascripts/confidential_merge_request/components/project_form_group.vue10
-rw-r--r--app/assets/javascripts/content_editor/components/code_block_bubble_menu.vue146
-rw-r--r--app/assets/javascripts/content_editor/components/content_editor.vue3
-rw-r--r--app/assets/javascripts/content_editor/components/formatting_bubble_menu.vue13
-rw-r--r--app/assets/javascripts/content_editor/components/loading_indicator.vue1
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/image.vue32
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/media.vue51
-rw-r--r--app/assets/javascripts/content_editor/extensions/code_block_highlight.js43
-rw-r--r--app/assets/javascripts/content_editor/extensions/diagram.js56
-rw-r--r--app/assets/javascripts/content_editor/extensions/image.js4
-rw-r--r--app/assets/javascripts/content_editor/extensions/playable.js11
-rw-r--r--app/assets/javascripts/content_editor/services/code_block_language_loader.js283
-rw-r--r--app/assets/javascripts/content_editor/services/content_editor.js19
-rw-r--r--app/assets/javascripts/content_editor/services/create_content_editor.js10
-rw-r--r--app/assets/javascripts/content_editor/services/markdown_serializer.js11
-rw-r--r--app/assets/javascripts/content_editor/services/serialization_helpers.js8
-rw-r--r--app/assets/javascripts/content_editor/services/track_input_rules_and_shortcuts.js4
-rw-r--r--app/assets/javascripts/content_editor/services/upload_helpers.js24
-rw-r--r--app/assets/javascripts/contextual_sidebar.js25
-rw-r--r--app/assets/javascripts/crm/components/contact_form.vue224
-rw-r--r--app/assets/javascripts/crm/components/contacts_root.vue187
-rw-r--r--app/assets/javascripts/crm/components/form.vue67
-rw-r--r--app/assets/javascripts/crm/components/new_organization_form.vue164
-rw-r--r--app/assets/javascripts/crm/components/organizations_root.vue140
-rw-r--r--app/assets/javascripts/crm/contacts/bundle.js (renamed from app/assets/javascripts/crm/contacts_bundle.js)0
-rw-r--r--app/assets/javascripts/crm/contacts/components/contact_form_wrapper.vue78
-rw-r--r--app/assets/javascripts/crm/contacts/components/contacts_root.vue148
-rw-r--r--app/assets/javascripts/crm/contacts/components/graphql/create_contact.mutation.graphql (renamed from app/assets/javascripts/crm/components/queries/create_contact.mutation.graphql)0
-rw-r--r--app/assets/javascripts/crm/contacts/components/graphql/crm_contact_fields.fragment.graphql (renamed from app/assets/javascripts/crm/components/queries/crm_contact_fields.fragment.graphql)0
-rw-r--r--app/assets/javascripts/crm/contacts/components/graphql/get_group_contacts.query.graphql (renamed from app/assets/javascripts/crm/components/queries/get_group_contacts.query.graphql)0
-rw-r--r--app/assets/javascripts/crm/contacts/components/graphql/update_contact.mutation.graphql (renamed from app/assets/javascripts/crm/components/queries/update_contact.mutation.graphql)0
-rw-r--r--app/assets/javascripts/crm/contacts/routes.js20
-rw-r--r--app/assets/javascripts/crm/organizations/bundle.js (renamed from app/assets/javascripts/crm/organizations_bundle.js)0
-rw-r--r--app/assets/javascripts/crm/organizations/components/graphql/create_organization.mutation.graphql (renamed from app/assets/javascripts/crm/components/queries/create_organization.mutation.graphql)0
-rw-r--r--app/assets/javascripts/crm/organizations/components/graphql/crm_organization_fields.fragment.graphql (renamed from app/assets/javascripts/crm/components/queries/crm_organization_fields.fragment.graphql)0
-rw-r--r--app/assets/javascripts/crm/organizations/components/graphql/get_group_organizations.query.graphql (renamed from app/assets/javascripts/crm/components/queries/get_group_organizations.query.graphql)0
-rw-r--r--app/assets/javascripts/crm/organizations/components/graphql/update_organization.mutation.graphql10
-rw-r--r--app/assets/javascripts/crm/organizations/components/organization_form_wrapper.vue80
-rw-r--r--app/assets/javascripts/crm/organizations/components/organizations_root.vue142
-rw-r--r--app/assets/javascripts/crm/organizations/routes.js20
-rw-r--r--app/assets/javascripts/crm/routes.js16
-rw-r--r--app/assets/javascripts/deprecated_notes.js89
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_discussion.vue26
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_note.vue49
-rw-r--r--app/assets/javascripts/diffs/components/app.vue62
-rw-r--r--app/assets/javascripts/diffs/components/commit_item.vue4
-rw-r--r--app/assets/javascripts/diffs/components/compare_versions.vue2
-rw-r--r--app/assets/javascripts/diffs/components/diff_content.vue7
-rw-r--r--app/assets/javascripts/diffs/components/diff_discussions.vue2
-rw-r--r--app/assets/javascripts/diffs/components/diff_file.vue2
-rw-r--r--app/assets/javascripts/diffs/components/diff_file_header.vue4
-rw-r--r--app/assets/javascripts/diffs/components/diff_gutter_avatars.vue1
-rw-r--r--app/assets/javascripts/diffs/components/diff_line_note_form.vue12
-rw-r--r--app/assets/javascripts/diffs/components/no_changes.vue2
-rw-r--r--app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js4
-rw-r--r--app/assets/javascripts/diffs/store/actions.js30
-rw-r--r--app/assets/javascripts/diffs/utils/performance.js2
-rw-r--r--app/assets/javascripts/editor/components/source_editor_toolbar.vue70
-rw-r--r--app/assets/javascripts/editor/components/source_editor_toolbar_button.vue89
-rw-r--r--app/assets/javascripts/editor/constants.js3
-rw-r--r--app/assets/javascripts/editor/graphql/get_item.query.graphql9
-rw-r--r--app/assets/javascripts/editor/graphql/get_items.query.graphql5
-rw-r--r--app/assets/javascripts/editor/graphql/update_item.mutation.graphql3
-rw-r--r--app/assets/javascripts/editor/schema/ci.json19
-rw-r--r--app/assets/javascripts/emoji/awards_app/index.js2
-rw-r--r--app/assets/javascripts/emoji/index.js9
-rw-r--r--app/assets/javascripts/emoji/support/unicode_support_map.js2
-rw-r--r--app/assets/javascripts/environments/components/empty_state.vue31
-rw-r--r--app/assets/javascripts/environments/components/environment_item.vue68
-rw-r--r--app/assets/javascripts/environments/components/environments_app.vue2
-rw-r--r--app/assets/javascripts/environments/components/new_environment_item.vue13
-rw-r--r--app/assets/javascripts/environments/folder/environments_folder_bundle.js2
-rw-r--r--app/assets/javascripts/environments/graphql/resolvers.js2
-rw-r--r--app/assets/javascripts/environments/mixins/environments_mixin.js10
-rw-r--r--app/assets/javascripts/environments/mixins/environments_pagination_api_mixin.js2
-rw-r--r--app/assets/javascripts/feature_highlight/feature_highlight_helper.js4
-rw-r--r--app/assets/javascripts/filtered_search/services/recent_searches_service.js2
-rw-r--r--app/assets/javascripts/flash.js4
-rw-r--r--app/assets/javascripts/google_cloud/components/app.vue2
-rw-r--r--app/assets/javascripts/google_tag_manager/index.js47
-rw-r--r--app/assets/javascripts/graphql_shared/constants.js2
-rw-r--r--app/assets/javascripts/graphql_shared/fragments/page_info.fragment.graphql (renamed from app/assets/javascripts/graphql_shared/fragments/pageInfo.fragment.graphql)0
-rw-r--r--app/assets/javascripts/graphql_shared/fragments/page_info_cursors_only.fragment.graphql (renamed from app/assets/javascripts/graphql_shared/fragments/pageInfoCursorsOnly.fragment.graphql)0
-rw-r--r--app/assets/javascripts/graphql_shared/possibleTypes.json1
-rw-r--r--app/assets/javascripts/graphql_shared/possible_types.json129
-rw-r--r--app/assets/javascripts/graphql_shared/queries/get_users_projects.query.graphql2
-rw-r--r--app/assets/javascripts/groups/components/group_folder.vue2
-rw-r--r--app/assets/javascripts/groups/components/group_item.vue6
-rw-r--r--app/assets/javascripts/groups/components/groups.vue2
-rw-r--r--app/assets/javascripts/groups/components/item_stats.vue4
-rw-r--r--app/assets/javascripts/groups/components/item_type_icon.vue9
-rw-r--r--app/assets/javascripts/groups/constants.js2
-rw-r--r--app/assets/javascripts/header.js5
-rw-r--r--app/assets/javascripts/header_search/components/app.vue25
-rw-r--r--app/assets/javascripts/header_search/components/header_search_autocomplete_items.vue74
-rw-r--r--app/assets/javascripts/header_search/components/header_search_scoped_items.vue6
-rw-r--r--app/assets/javascripts/header_search/constants.js8
-rw-r--r--app/assets/javascripts/header_search/store/actions.js4
-rw-r--r--app/assets/javascripts/header_search/store/getters.js1
-rw-r--r--app/assets/javascripts/ide/components/commit_sidebar/form.vue2
-rw-r--r--app/assets/javascripts/ide/components/commit_sidebar/message_field.vue2
-rw-r--r--app/assets/javascripts/ide/components/ide.vue2
-rw-r--r--app/assets/javascripts/ide/components/ide_status_bar.vue4
-rw-r--r--app/assets/javascripts/ide/components/jobs/detail.vue2
-rw-r--r--app/assets/javascripts/ide/components/jobs/detail/description.vue2
-rw-r--r--app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue2
-rw-r--r--app/assets/javascripts/ide/components/jobs/stage.vue2
-rw-r--r--app/assets/javascripts/ide/components/nav_dropdown_button.vue4
-rw-r--r--app/assets/javascripts/ide/stores/actions/project.js2
-rw-r--r--app/assets/javascripts/ide/stores/actions/tree.js2
-rw-r--r--app/assets/javascripts/ide/stores/modules/commit/getters.js2
-rw-r--r--app/assets/javascripts/ide/stores/modules/merge_requests/actions.js4
-rw-r--r--app/assets/javascripts/ide/stores/modules/pipelines/actions.js6
-rw-r--r--app/assets/javascripts/ide/stores/plugins/terminal.js8
-rw-r--r--app/assets/javascripts/image_diff/helpers/init_image_diff.js2
-rw-r--r--app/assets/javascripts/import_entities/components/import_status.vue133
-rw-r--r--app/assets/javascripts/import_entities/constants.js41
-rw-r--r--app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue2
-rw-r--r--app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue14
-rw-r--r--app/assets/javascripts/import_entities/import_projects/index.js3
-rw-r--r--app/assets/javascripts/import_entities/import_projects/store/mutations.js6
-rw-r--r--app/assets/javascripts/incidents/components/incidents_list.vue25
-rw-r--r--app/assets/javascripts/incidents/constants.js1
-rw-r--r--app/assets/javascripts/integrations/edit/components/integration_form.vue41
-rw-r--r--app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue145
-rw-r--r--app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue19
-rw-r--r--app/assets/javascripts/integrations/edit/index.js7
-rw-r--r--app/assets/javascripts/invite_members/components/group_select.vue23
-rw-r--r--app/assets/javascripts/invite_members/components/invite_groups_modal.vue9
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_modal.vue63
-rw-r--r--app/assets/javascripts/invite_members/components/invite_modal_base.vue74
-rw-r--r--app/assets/javascripts/invite_members/components/members_token_select.vue2
-rw-r--r--app/assets/javascripts/invite_members/components/user_limit_notification.vue97
-rw-r--r--app/assets/javascripts/invite_members/constants.js5
-rw-r--r--app/assets/javascripts/invite_members/init_invite_members_modal.js78
-rw-r--r--app/assets/javascripts/invite_members/utils/response_message_parser.js34
-rw-r--r--app/assets/javascripts/issuable/components/csv_import_export_buttons.vue1
-rw-r--r--app/assets/javascripts/issuable/components/issue_milestone.vue2
-rw-r--r--app/assets/javascripts/issuable/issuable_form.js6
-rw-r--r--app/assets/javascripts/issues/create_merge_request_dropdown.js14
-rw-r--r--app/assets/javascripts/issues/index.js12
-rw-r--r--app/assets/javascripts/issues/list/components/issue_card_time_info.vue15
-rw-r--r--app/assets/javascripts/issues/list/components/issues_list_app.vue95
-rw-r--r--app/assets/javascripts/issues/list/queries/get_issues.query.graphql2
-rw-r--r--app/assets/javascripts/issues/list/queries/issue.fragment.graphql2
-rw-r--r--app/assets/javascripts/issues/manual_ordering.js7
-rw-r--r--app/assets/javascripts/issues/show/components/app.vue22
-rw-r--r--app/assets/javascripts/issues/show/components/description.vue143
-rw-r--r--app/assets/javascripts/issues/show/components/edited.vue2
-rw-r--r--app/assets/javascripts/issues/show/components/fields/description.vue18
-rw-r--r--app/assets/javascripts/issues/show/components/fields/description_template.vue9
-rw-r--r--app/assets/javascripts/issues/show/components/fields/title.vue9
-rw-r--r--app/assets/javascripts/issues/show/components/form.vue21
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue30
-rw-r--r--app/assets/javascripts/issues/show/components/locked_warning.vue7
-rw-r--r--app/assets/javascripts/issues/show/index.js2
-rw-r--r--app/assets/javascripts/issues/show/mixins/update.js1
-rw-r--r--app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue4
-rw-r--r--app/assets/javascripts/jira_connect/branches/graphql/queries/get_projects.query.graphql2
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue4
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/app.vue22
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/browser_support_alert.vue30
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/compatibility_alert.vue5
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/group_item_name.vue9
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue2
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue8
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/index.js4
-rw-r--r--app/assets/javascripts/jira_import/components/jira_import_form.vue12
-rw-r--r--app/assets/javascripts/jira_import/index.js1
-rw-r--r--app/assets/javascripts/jobs/components/environments_block.vue2
-rw-r--r--app/assets/javascripts/jobs/components/filtered_search/jobs_filtered_search.vue42
-rw-r--r--app/assets/javascripts/jobs/components/filtered_search/tokens/job_status_token.vue122
-rw-r--r--app/assets/javascripts/jobs/components/table/cells/actions_cell.vue6
-rw-r--r--app/assets/javascripts/jobs/components/table/cells/duration_cell.vue18
-rw-r--r--app/assets/javascripts/jobs/components/table/constants.js3
-rw-r--r--app/assets/javascripts/jobs/components/table/graphql/cache_config.js30
-rw-r--r--app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql1
-rw-r--r--app/assets/javascripts/jobs/components/table/index.js2
-rw-r--r--app/assets/javascripts/jobs/components/table/jobs_table_app.vue92
-rw-r--r--app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue50
-rw-r--r--app/assets/javascripts/jobs/components/trigger_block.vue8
-rw-r--r--app/assets/javascripts/jobs/store/utils.js2
-rw-r--r--app/assets/javascripts/lib/gfm/index.js38
-rw-r--r--app/assets/javascripts/lib/graphql.js5
-rw-r--r--app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue32
-rw-r--r--app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js12
-rw-r--r--app/assets/javascripts/lib/utils/css_utils.js4
-rw-r--r--app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js14
-rw-r--r--app/assets/javascripts/lib/utils/datetime/date_format_utility.js22
-rw-r--r--app/assets/javascripts/lib/utils/datetime/timeago_utility.js48
-rw-r--r--app/assets/javascripts/lib/utils/text_markdown.js11
-rw-r--r--app/assets/javascripts/lib/utils/unit_format/formatter_factory.js52
-rw-r--r--app/assets/javascripts/lib/utils/unit_format/index.js108
-rw-r--r--app/assets/javascripts/lib/utils/webpack.js2
-rw-r--r--app/assets/javascripts/logs/components/environment_logs.vue2
-rw-r--r--app/assets/javascripts/main.js3
-rw-r--r--app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue2
-rw-r--r--app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue5
-rw-r--r--app/assets/javascripts/members/components/table/members_table.vue10
-rw-r--r--app/assets/javascripts/members/constants.js18
-rw-r--r--app/assets/javascripts/members/utils.js2
-rw-r--r--app/assets/javascripts/merge_conflicts/utils.js4
-rw-r--r--app/assets/javascripts/merge_request.js6
-rw-r--r--app/assets/javascripts/milestones/components/milestone_combobox.vue13
-rw-r--r--app/assets/javascripts/milestones/components/milestone_results_section.vue12
-rw-r--r--app/assets/javascripts/mirrors/ssh_mirror.js4
-rw-r--r--app/assets/javascripts/monitoring/components/charts/bar.vue8
-rw-r--r--app/assets/javascripts/monitoring/components/create_dashboard_modal.vue2
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard.vue10
-rw-r--r--app/assets/javascripts/monitoring/components/dashboards_dropdown.vue4
-rw-r--r--app/assets/javascripts/monitoring/queries/get_annotations.query.graphql (renamed from app/assets/javascripts/monitoring/queries/getAnnotations.query.graphql)0
-rw-r--r--app/assets/javascripts/monitoring/queries/get_dashboard_validation_warnings.query.graphql (renamed from app/assets/javascripts/monitoring/queries/getDashboardValidationWarnings.query.graphql)0
-rw-r--r--app/assets/javascripts/monitoring/queries/get_environments.query.graphql (renamed from app/assets/javascripts/monitoring/queries/getEnvironments.query.graphql)0
-rw-r--r--app/assets/javascripts/monitoring/stores/actions.js12
-rw-r--r--app/assets/javascripts/monitoring/stores/utils.js16
-rw-r--r--app/assets/javascripts/monitoring/utils.js2
-rw-r--r--app/assets/javascripts/mr_notes/stores/actions.js25
-rw-r--r--app/assets/javascripts/mr_notes/stores/modules/index.js1
-rw-r--r--app/assets/javascripts/mr_notes/stores/mutation_types.js1
-rw-r--r--app/assets/javascripts/mr_notes/stores/mutations.js3
-rw-r--r--app/assets/javascripts/mr_popover/components/mr_popover.vue4
-rw-r--r--app/assets/javascripts/network/branch_graph.js4
-rw-r--r--app/assets/javascripts/notes/components/diff_discussion_header.vue2
-rw-r--r--app/assets/javascripts/notes/components/diff_with_note.vue2
-rw-r--r--app/assets/javascripts/notes/components/discussion_filter.vue2
-rw-r--r--app/assets/javascripts/notes/components/note_actions.vue48
-rw-r--r--app/assets/javascripts/notes/components/note_body.vue9
-rw-r--r--app/assets/javascripts/notes/components/note_edited_text.vue2
-rw-r--r--app/assets/javascripts/notes/components/note_form.vue8
-rw-r--r--app/assets/javascripts/notes/components/note_header.vue22
-rw-r--r--app/assets/javascripts/notes/components/noteable_discussion.vue3
-rw-r--r--app/assets/javascripts/notes/components/noteable_note.vue13
-rw-r--r--app/assets/javascripts/notes/components/notes_app.vue12
-rw-r--r--app/assets/javascripts/notes/components/sort_discussion.vue1
-rw-r--r--app/assets/javascripts/notes/components/timeline_toggle.vue6
-rw-r--r--app/assets/javascripts/notes/components/toggle_replies_widget.vue2
-rw-r--r--app/assets/javascripts/notes/mixins/autosave.js4
-rw-r--r--app/assets/javascripts/notes/mixins/discussion_navigation.js2
-rw-r--r--app/assets/javascripts/notes/stores/actions.js16
-rw-r--r--app/assets/javascripts/notes/stores/mutations.js2
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/delete_button.vue33
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue19
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue17
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js3
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js4
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql2
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/index.js4
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue10
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue104
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql2
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list.vue42
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list_header.vue67
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list_row.vue84
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/constants/common.js29
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/constants/details.js39
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/constants/index.js3
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/constants/list.js33
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/index.js78
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/mock_api.js200
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/pages/details.vue0
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/pages/index.vue5
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/pages/list.vue177
-rw-r--r--app/assets/javascripts/packages_and_registries/harbor_registry/router.js35
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/actions.js1
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue1
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql2
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue12
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js2
-rw-r--r--app/assets/javascripts/packages_and_registries/shared/components/cleanup_policy_enabled_alert.vue54
-rw-r--r--app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue3
-rw-r--r--app/assets/javascripts/pager.js19
-rw-r--r--app/assets/javascripts/pages/admin/abuse_reports/abuse_reports.js2
-rw-r--r--app/assets/javascripts/pages/admin/admin.js2
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/payload_downloader.js4
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/payload_previewer.js4
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js1
-rw-r--r--app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js88
-rw-r--r--app/assets/javascripts/pages/admin/groups/new/index.js4
-rw-r--r--app/assets/javascripts/pages/admin/index.js4
-rw-r--r--app/assets/javascripts/pages/groups/clusters/index/index.js8
-rw-r--r--app/assets/javascripts/pages/groups/crm/contacts/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/crm/organizations/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/edit/index.js28
-rw-r--r--app/assets/javascripts/pages/groups/group_members/index.js26
-rw-r--r--app/assets/javascripts/pages/groups/harbor/repositories/index.js8
-rw-r--r--app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue4
-rw-r--r--app/assets/javascripts/pages/import/history/components/import_error_details.vue43
-rw-r--r--app/assets/javascripts/pages/import/history/components/import_history_app.vue199
-rw-r--r--app/assets/javascripts/pages/import/history/index.js21
-rw-r--r--app/assets/javascripts/pages/import/history/utils/error_messages.js3
-rw-r--r--app/assets/javascripts/pages/profiles/preferences/show/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/commit/show/index.js32
-rw-r--r--app/assets/javascripts/pages/projects/harbor/repositories/index.js8
-rw-r--r--app/assets/javascripts/pages/projects/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue8
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_card.vue24
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue100
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/index/index.js5
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js12
-rw-r--r--app/assets/javascripts/pages/projects/network/network.js2
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedules_callout.vue3
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js18
-rw-r--r--app/assets/javascripts/pages/projects/project.js2
-rw-r--r--app/assets/javascripts/pages/projects/project_members/index.js11
-rw-r--r--app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js54
-rw-r--r--app/assets/javascripts/pages/projects/settings/repository/show/index.js8
-rw-r--r--app/assets/javascripts/pages/projects/shared/permissions/components/project_feature_setting.vue16
-rw-r--r--app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue20
-rw-r--r--app/assets/javascripts/pages/projects/snippets/show/index.js9
-rw-r--r--app/assets/javascripts/pages/projects/tags/new/index.js6
-rw-r--r--app/assets/javascripts/pages/projects/tree/show/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/wikis/show/index.js2
-rw-r--r--app/assets/javascripts/pages/sessions/new/index.js2
-rw-r--r--app/assets/javascripts/pages/sessions/new/length_validator.js2
-rw-r--r--app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue92
-rw-r--r--app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue146
-rw-r--r--app/assets/javascripts/pages/shared/wikis/edit.js4
-rw-r--r--app/assets/javascripts/pages/shared/wikis/render_gfm_facade.js5
-rw-r--r--app/assets/javascripts/pages/shared/wikis/show.js27
-rw-r--r--app/assets/javascripts/performance_bar/services/performance_bar_service.js2
-rw-r--r--app/assets/javascripts/persistent_user_callouts.js1
-rw-r--r--app/assets/javascripts/pipeline_editor/components/drawer/cards/first_pipeline_card.vue37
-rw-r--r--app/assets/javascripts/pipeline_editor/components/drawer/cards/getting_started_card.vue27
-rw-r--r--app/assets/javascripts/pipeline_editor/components/drawer/cards/pipeline_config_reference_card.vue89
-rw-r--r--app/assets/javascripts/pipeline_editor/components/drawer/cards/visualize_and_lint_card.vue14
-rw-r--r--app/assets/javascripts/pipeline_editor/components/drawer/pipeline_editor_drawer.vue106
-rw-r--r--app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue21
-rw-r--r--app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue6
-rw-r--r--app/assets/javascripts/pipeline_editor/components/ui/pipeline_editor_empty_state.vue2
-rw-r--r--app/assets/javascripts/pipeline_editor/constants.js4
-rw-r--r--app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue2
-rw-r--r--app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue16
-rw-r--r--app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue3
-rw-r--r--app/assets/javascripts/pipeline_wizard/components/input.vue1
-rw-r--r--app/assets/javascripts/pipeline_wizard/components/wrapper.vue39
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue1
-rw-r--r--app/assets/javascripts/pipelines/components/graph/job_item.vue3
-rw-r--r--app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue4
-rw-r--r--app/assets/javascripts/pipelines/components/graph/stage_column_component.vue4
-rw-r--r--app/assets/javascripts/pipelines/components/header_component.vue4
-rw-r--r--app/assets/javascripts/pipelines/components/jobs_shared/job_name_component.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_tabs.vue50
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ci_templates.vue81
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue173
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_triggerer.vue22
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue11
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue219
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue6
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue32
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue8
-rw-r--r--app/assets/javascripts/pipelines/graphql/queries/get_pipeline_jobs.query.graphql2
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_bundle.js77
-rw-r--r--app/assets/javascripts/pipelines/pipeline_tabs.js44
-rw-r--r--app/assets/javascripts/pipelines/services/pipelines_service.js2
-rw-r--r--app/assets/javascripts/pipelines/stores/pipelines_store.js2
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/actions.js1
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/utils.js2
-rw-r--r--app/assets/javascripts/profile/preferences/components/diffs_colors.vue107
-rw-r--r--app/assets/javascripts/profile/preferences/components/diffs_colors_preview.vue231
-rw-r--r--app/assets/javascripts/profile/preferences/components/integration_view.vue56
-rw-r--r--app/assets/javascripts/profile/preferences/components/profile_preferences.vue15
-rw-r--r--app/assets/javascripts/profile/preferences/profile_preferences_diffs_colors.js21
-rw-r--r--app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue54
-rw-r--r--app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_status.vue74
-rw-r--r--app/assets/javascripts/projects/commit_box/info/constants.js7
-rw-r--r--app/assets/javascripts/projects/commit_box/info/graphql/queries/get_latest_pipeline_status.query.graphql14
-rw-r--r--app/assets/javascripts/projects/commit_box/info/graphql/queries/get_pipeline_stages.query.graphql19
-rw-r--r--app/assets/javascripts/projects/commit_box/info/index.js3
-rw-r--r--app/assets/javascripts/projects/commit_box/info/init_commit_pipeline_mini_graph.js5
-rw-r--r--app/assets/javascripts/projects/commit_box/info/init_commit_pipeline_status.js34
-rw-r--r--app/assets/javascripts/projects/commit_box/info/utils.js14
-rw-r--r--app/assets/javascripts/projects/components/shared/delete_button.vue1
-rw-r--r--app/assets/javascripts/projects/default_project_templates.js6
-rw-r--r--app/assets/javascripts/projects/new/components/deployment_target_select.vue33
-rw-r--r--app/assets/javascripts/projects/new/components/new_project_url_select.vue35
-rw-r--r--app/assets/javascripts/projects/new/constants.js5
-rw-r--r--app/assets/javascripts/projects/new/index.js1
-rw-r--r--app/assets/javascripts/projects/project_new.js47
-rw-r--r--app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue4
-rw-r--r--app/assets/javascripts/related_issues/components/related_issues_list.vue4
-rw-r--r--app/assets/javascripts/releases/components/app_edit_new.vue2
-rw-r--r--app/assets/javascripts/releases/components/app_index.vue287
-rw-r--r--app/assets/javascripts/releases/components/app_index_apollo_client.vue275
-rw-r--r--app/assets/javascripts/releases/components/release_block_footer.vue2
-rw-r--r--app/assets/javascripts/releases/components/releases_pagination.vue20
-rw-r--r--app/assets/javascripts/releases/components/releases_pagination_apollo_client.vue37
-rw-r--r--app/assets/javascripts/releases/components/releases_sort.vue71
-rw-r--r--app/assets/javascripts/releases/components/releases_sort_apollo_client.vue91
-rw-r--r--app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql92
-rw-r--r--app/assets/javascripts/releases/mount_index.js52
-rw-r--r--app/assets/javascripts/releases/stores/modules/index/actions.js65
-rw-r--r--app/assets/javascripts/releases/stores/modules/index/index.js10
-rw-r--r--app/assets/javascripts/releases/stores/modules/index/mutation_types.js4
-rw-r--r--app/assets/javascripts/releases/stores/modules/index/mutations.js44
-rw-r--r--app/assets/javascripts/releases/stores/modules/index/state.js24
-rw-r--r--app/assets/javascripts/reports/codequality_report/components/codequality_issue_body.vue2
-rw-r--r--app/assets/javascripts/reports/components/report_section.vue8
-rw-r--r--app/assets/javascripts/reports/components/summary_row.vue6
-rw-r--r--app/assets/javascripts/reports/grouped_test_report/store/actions.js6
-rw-r--r--app/assets/javascripts/repository/components/blob_content_viewer.vue3
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/index.js1
-rw-r--r--app/assets/javascripts/repository/components/breadcrumbs.vue36
-rw-r--r--app/assets/javascripts/repository/components/last_commit.vue10
-rw-r--r--app/assets/javascripts/repository/components/table/index.vue2
-rw-r--r--app/assets/javascripts/repository/components/tree_content.vue2
-rw-r--r--app/assets/javascripts/runner/admin_runners/admin_runners_app.vue48
-rw-r--r--app/assets/javascripts/runner/admin_runners/index.js17
-rw-r--r--app/assets/javascripts/runner/components/cells/runner_actions_cell.vue19
-rw-r--r--app/assets/javascripts/runner/components/cells/runner_summary_cell.vue13
-rw-r--r--app/assets/javascripts/runner/components/registration/registration_token.vue74
-rw-r--r--app/assets/javascripts/runner/components/runner_assigned_item.vue10
-rw-r--r--app/assets/javascripts/runner/components/runner_bulk_delete.vue111
-rw-r--r--app/assets/javascripts/runner/components/runner_delete_button.vue85
-rw-r--r--app/assets/javascripts/runner/components/runner_jobs.vue2
-rw-r--r--app/assets/javascripts/runner/components/runner_list.vue90
-rw-r--r--app/assets/javascripts/runner/components/runner_pause_button.vue2
-rw-r--r--app/assets/javascripts/runner/components/runner_projects.vue2
-rw-r--r--app/assets/javascripts/runner/components/runner_status_badge.vue31
-rw-r--r--app/assets/javascripts/runner/components/runner_status_popover.vue75
-rw-r--r--app/assets/javascripts/runner/components/runner_update_form.vue6
-rw-r--r--app/assets/javascripts/runner/components/search_tokens/paused_token_config.js28
-rw-r--r--app/assets/javascripts/runner/components/search_tokens/status_token_config.js4
-rw-r--r--app/assets/javascripts/runner/constants.js53
-rw-r--r--app/assets/javascripts/runner/graphql/details/runner_jobs.query.graphql2
-rw-r--r--app/assets/javascripts/runner/graphql/details/runner_projects.query.graphql2
-rw-r--r--app/assets/javascripts/runner/graphql/list/admin_runners.query.graphql4
-rw-r--r--app/assets/javascripts/runner/graphql/list/admin_runners_count.query.graphql3
-rw-r--r--app/assets/javascripts/runner/graphql/list/checked_runner_ids.query.graphql3
-rw-r--r--app/assets/javascripts/runner/graphql/list/group_runners.query.graphql5
-rw-r--r--app/assets/javascripts/runner/graphql/list/group_runners_count.query.graphql2
-rw-r--r--app/assets/javascripts/runner/graphql/list/local_state.js63
-rw-r--r--app/assets/javascripts/runner/graphql/list/typedefs.graphql3
-rw-r--r--app/assets/javascripts/runner/group_runners/group_runners_app.vue30
-rw-r--r--app/assets/javascripts/runner/group_runners/index.js4
-rw-r--r--app/assets/javascripts/runner/runner_search_utils.js49
-rw-r--r--app/assets/javascripts/runner/utils.js3
-rw-r--r--app/assets/javascripts/search/store/actions.js34
-rw-r--r--app/assets/javascripts/search/store/utils.js2
-rw-r--r--app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue4
-rw-r--r--app/assets/javascripts/search_settings/components/search_settings.vue45
-rw-r--r--app/assets/javascripts/security_configuration/components/app.vue9
-rw-r--r--app/assets/javascripts/security_configuration/components/constants.js29
-rw-r--r--app/assets/javascripts/security_configuration/components/feature_card.vue41
-rw-r--r--app/assets/javascripts/security_configuration/components/feature_card_badge.vue40
-rw-r--r--app/assets/javascripts/security_configuration/components/training_provider_list.vue31
-rw-r--r--app/assets/javascripts/security_configuration/index.js2
-rw-r--r--app/assets/javascripts/security_configuration/utils.js4
-rw-r--r--app/assets/javascripts/serverless/components/missing_prometheus.vue2
-rw-r--r--app/assets/javascripts/serverless/components/url.vue2
-rw-r--r--app/assets/javascripts/set_status_modal/emoji_menu_in_modal.js20
-rw-r--r--app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue65
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/assignees_realtime.vue43
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue1
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue20
-rw-r--r--app/assets/javascripts/sidebar/components/attention_requested_toggle.vue32
-rw-r--r--app/assets/javascripts/sidebar/components/copy_email_to_clipboard.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/incidents/escalation_status.vue11
-rw-r--r--app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/participants/participants.vue15
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue4
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue28
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/help_state.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue2
-rw-r--r--app/assets/javascripts/sidebar/graphql.js3
-rw-r--r--app/assets/javascripts/sidebar/queries/issuable_labels.subscription.graphql22
-rw-r--r--app/assets/javascripts/sidebar/queries/sidebar_details.query.graphql (renamed from app/assets/javascripts/sidebar/queries/sidebarDetails.query.graphql)0
-rw-r--r--app/assets/javascripts/sidebar/queries/sidebar_details_mr.query.graphql (renamed from app/assets/javascripts/sidebar/queries/sidebarDetailsMR.query.graphql)0
-rw-r--r--app/assets/javascripts/sidebar/queries/update_status.mutation.graphql (renamed from app/assets/javascripts/sidebar/queries/updateStatus.mutation.graphql)0
-rw-r--r--app/assets/javascripts/sidebar/services/sidebar_service.js4
-rw-r--r--app/assets/javascripts/snippets/components/edit.vue10
-rw-r--r--app/assets/javascripts/snippets/components/snippet_header.vue8
-rw-r--r--app/assets/javascripts/snippets/fragments/snippet_base.fragment.graphql (renamed from app/assets/javascripts/snippets/fragments/snippetBase.fragment.graphql)0
-rw-r--r--app/assets/javascripts/snippets/mutations/create_snippet.mutation.graphql (renamed from app/assets/javascripts/snippets/mutations/createSnippet.mutation.graphql)0
-rw-r--r--app/assets/javascripts/snippets/mutations/delete_snippet.mutation.graphql (renamed from app/assets/javascripts/snippets/mutations/deleteSnippet.mutation.graphql)0
-rw-r--r--app/assets/javascripts/snippets/mutations/update_snippet.mutation.graphql (renamed from app/assets/javascripts/snippets/mutations/updateSnippet.mutation.graphql)0
-rw-r--r--app/assets/javascripts/sortable/constants.js19
-rw-r--r--app/assets/javascripts/sortable/sortable_config.js8
-rw-r--r--app/assets/javascripts/sortable/utils.js31
-rw-r--r--app/assets/javascripts/static_site_editor/components/edit_meta_modal.vue1
-rw-r--r--app/assets/javascripts/terraform/components/empty_state.vue23
-rw-r--r--app/assets/javascripts/terraform/components/states_table_actions.vue3
-rw-r--r--app/assets/javascripts/terraform/graphql/queries/get_states.query.graphql2
-rw-r--r--app/assets/javascripts/tracking/tracking.js70
-rw-r--r--app/assets/javascripts/user_lists/components/user_list_form.vue2
-rw-r--r--app/assets/javascripts/users_select/index.js10
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals_summary.vue6
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue25
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue26
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/source_branch_removal_status.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/issues.js3
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js39
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js82
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js55
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue16
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/services/mr_widget_service.js2
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue11
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/index.js12
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/service.js43
-rw-r--r--app/assets/javascripts/vue_shared/components/awards_list.vue26
-rw-r--r--app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue17
-rw-r--r--app/assets/javascripts/vue_shared/components/content_viewer/viewers/download_viewer.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/deprecated_project_avatar/default.vue47
-rw-r--r--app/assets/javascripts/vue_shared/components/deprecated_project_avatar/image.vue81
-rw-r--r--app/assets/javascripts/vue_shared/components/dismissible_feedback_alert.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue44
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/header_ci_component.vue12
-rw-r--r--app/assets/javascripts/vue_shared/components/help_popover.vue9
-rw-r--r--app/assets/javascripts/vue_shared/components/identicon.vue35
-rw-r--r--app/assets/javascripts/vue_shared/components/line_numbers.vue31
-rw-r--r--app/assets/javascripts/vue_shared/components/local_storage_sync.vue33
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue12
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/field.vue15
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/header.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestion_diff.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue13
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestions.vue10
-rw-r--r--app/assets/javascripts/vue_shared/components/metric_images/metric_images_tab.vue119
-rw-r--r--app/assets/javascripts/vue_shared/components/metric_images/metric_images_table.vue266
-rw-r--r--app/assets/javascripts/vue_shared/components/metric_images/store/actions.js85
-rw-r--r--app/assets/javascripts/vue_shared/components/metric_images/store/index.js14
-rw-r--r--app/assets/javascripts/vue_shared/components/metric_images/store/mutation_types.js13
-rw-r--r--app/assets/javascripts/vue_shared/components/metric_images/store/mutations.js39
-rw-r--r--app/assets/javascripts/vue_shared/components/metric_images/store/state.js10
-rw-r--r--app/assets/javascripts/vue_shared/components/notes/system_note.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/project_avatar.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue11
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/persisted_dropdown_selection.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/title_area.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue50
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/components/chunk.vue103
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_line.vue74
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/constants.js25
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue169
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/utils.js28
-rw-r--r--app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/web_ide_link.vue1
-rw-r--r--app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue7
-rw-r--r--app/assets/javascripts/vue_shared/mixins/timeago.js22
-rw-r--r--app/assets/javascripts/vue_shared/translate.js2
-rw-r--r--app/assets/javascripts/webpack.js2
-rw-r--r--app/assets/javascripts/work_items/components/item_title.vue12
-rw-r--r--app/assets/javascripts/work_items/components/work_item_actions.vue93
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail.vue73
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail_modal.vue83
-rw-r--r--app/assets/javascripts/work_items/components/work_item_title.vue73
-rw-r--r--app/assets/javascripts/work_items/constants.js9
-rw-r--r--app/assets/javascripts/work_items/graphql/create_work_item.mutation.graphql13
-rw-r--r--app/assets/javascripts/work_items/graphql/create_work_item_from_task.mutation.graphql9
-rw-r--r--app/assets/javascripts/work_items/graphql/delete_work_item.mutation.graphql5
-rw-r--r--app/assets/javascripts/work_items/graphql/provider.js32
-rw-r--r--app/assets/javascripts/work_items/graphql/resolvers.js29
-rw-r--r--app/assets/javascripts/work_items/graphql/typedefs.graphql56
-rw-r--r--app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql13
-rw-r--r--app/assets/javascripts/work_items/graphql/widget.fragment.graphql3
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item.fragment.graphql8
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item.query.graphql15
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_title.subscription.graphql8
-rw-r--r--app/assets/javascripts/work_items/pages/create_work_item.vue135
-rw-r--r--app/assets/javascripts/work_items/pages/work_item_root.vue82
-rw-r--r--app/assets/stylesheets/bootstrap_migration.scss324
-rw-r--r--app/assets/stylesheets/bootstrap_migration_components.scss216
-rw-r--r--app/assets/stylesheets/bootstrap_migration_reset.scss94
-rw-r--r--app/assets/stylesheets/bootstrap_migration_variables.scss15
-rw-r--r--app/assets/stylesheets/components/milestone_combobox.scss9
-rw-r--r--app/assets/stylesheets/framework/awards.scss10
-rw-r--r--app/assets/stylesheets/framework/broadcast_messages.scss4
-rw-r--r--app/assets/stylesheets/framework/common.scss3
-rw-r--r--app/assets/stylesheets/framework/dropdowns.scss21
-rw-r--r--app/assets/stylesheets/framework/header.scss12
-rw-r--r--app/assets/stylesheets/framework/markdown_area.scss4
-rw-r--r--app/assets/stylesheets/framework/sidebar.scss26
-rw-r--r--app/assets/stylesheets/framework/tables.scss2
-rw-r--r--app/assets/stylesheets/framework/variables.scss1
-rw-r--r--app/assets/stylesheets/highlight/diff_custom_colors_addition.scss36
-rw-r--r--app/assets/stylesheets/highlight/diff_custom_colors_deletion.scss36
-rw-r--r--app/assets/stylesheets/highlight/hljs.scss125
-rw-r--r--app/assets/stylesheets/highlight/themes/dark.scss36
-rw-r--r--app/assets/stylesheets/highlight/themes/monokai.scss5
-rw-r--r--app/assets/stylesheets/highlight/themes/none.scss5
-rw-r--r--app/assets/stylesheets/highlight/themes/solarized-dark.scss5
-rw-r--r--app/assets/stylesheets/highlight/themes/solarized-light.scss5
-rw-r--r--app/assets/stylesheets/highlight/themes/white.scss5
-rw-r--r--app/assets/stylesheets/highlight/white_base.scss2
-rw-r--r--app/assets/stylesheets/notify_base.scss3
-rw-r--r--app/assets/stylesheets/notify_enhanced.scss30
-rw-r--r--app/assets/stylesheets/page_bundles/boards.scss2
-rw-r--r--app/assets/stylesheets/page_bundles/import.scss10
-rw-r--r--app/assets/stylesheets/page_bundles/jira_connect_users.scss14
-rw-r--r--app/assets/stylesheets/page_bundles/learn_gitlab.scss8
-rw-r--r--app/assets/stylesheets/page_bundles/milestone.scss14
-rw-r--r--app/assets/stylesheets/pages/clusters.scss8
-rw-r--r--app/assets/stylesheets/pages/issues.scss4
-rw-r--r--app/assets/stylesheets/pages/search.scss30
-rw-r--r--app/assets/stylesheets/pages/settings.scss7
-rw-r--r--app/assets/stylesheets/snippets.scss4
-rw-r--r--app/assets/stylesheets/startup/startup-dark.scss53
-rw-r--r--app/assets/stylesheets/startup/startup-general.scss44
-rw-r--r--app/assets/stylesheets/startup/startup-signin.scss17
-rw-r--r--app/assets/stylesheets/themes/_dark.scss2
-rw-r--r--app/assets/stylesheets/themes/dark_mode_overrides.scss4
-rw-r--r--app/assets/stylesheets/themes/theme_helper.scss5
-rw-r--r--app/assets/stylesheets/utilities.scss5
-rw-r--r--app/components/diffs/base_component.rb10
-rw-r--r--app/components/diffs/overflow_warning_component.html.haml9
-rw-r--r--app/components/diffs/overflow_warning_component.rb73
-rw-r--r--app/components/diffs/stats_component.html.haml1
-rw-r--r--app/components/diffs/stats_component.rb67
-rw-r--r--app/components/pajamas/alert_component.html.haml13
-rw-r--r--app/components/pajamas/alert_component.rb45
-rw-r--r--app/controllers/admin/application_settings_controller.rb3
-rw-r--r--app/controllers/admin/background_jobs_controller.rb2
-rw-r--r--app/controllers/admin/background_migrations_controller.rb8
-rw-r--r--app/controllers/admin/broadcast_messages_controller.rb6
-rw-r--r--app/controllers/admin/dashboard_controller.rb2
-rw-r--r--app/controllers/admin/health_check_controller.rb2
-rw-r--r--app/controllers/admin/integrations_controller.rb4
-rw-r--r--app/controllers/admin/plan_limits_controller.rb10
-rw-r--r--app/controllers/admin/requests_profiles_controller.rb2
-rw-r--r--app/controllers/admin/runners_controller.rb3
-rw-r--r--app/controllers/admin/spam_logs_controller.rb2
-rw-r--r--app/controllers/admin/system_info_controller.rb2
-rw-r--r--app/controllers/admin/version_check_controller.rb2
-rw-r--r--app/controllers/application_controller.rb21
-rw-r--r--app/controllers/autocomplete_controller.rb1
-rw-r--r--app/controllers/clusters/clusters_controller.rb14
-rw-r--r--app/controllers/concerns/enforces_two_factor_authentication.rb16
-rw-r--r--app/controllers/concerns/integrations/params.rb2
-rw-r--r--app/controllers/concerns/sessionless_authentication.rb25
-rw-r--r--app/controllers/concerns/wiki_actions.rb12
-rw-r--r--app/controllers/dashboard/application_controller.rb2
-rw-r--r--app/controllers/explore/projects_controller.rb5
-rw-r--r--app/controllers/graphql_controller.rb8
-rw-r--r--app/controllers/groups/boards_controller.rb6
-rw-r--r--app/controllers/groups/children_controller.rb3
-rw-r--r--app/controllers/groups/crm/organizations_controller.rb4
-rw-r--r--app/controllers/groups/email_campaigns_controller.rb7
-rw-r--r--app/controllers/groups/group_links_controller.rb24
-rw-r--r--app/controllers/groups/group_members_controller.rb5
-rw-r--r--app/controllers/groups/releases_controller.rb4
-rw-r--r--app/controllers/groups/runners_controller.rb2
-rw-r--r--app/controllers/groups/settings/integrations_controller.rb4
-rw-r--r--app/controllers/groups_controller.rb17
-rw-r--r--app/controllers/help_controller.rb2
-rw-r--r--app/controllers/ide_controller.rb2
-rw-r--r--app/controllers/import/base_controller.rb10
-rw-r--r--app/controllers/import/bitbucket_controller.rb23
-rw-r--r--app/controllers/import/github_controller.rb26
-rw-r--r--app/controllers/import/gitlab_groups_controller.rb5
-rw-r--r--app/controllers/import/history_controller.rb5
-rw-r--r--app/controllers/jira_connect/application_controller.rb2
-rw-r--r--app/controllers/jira_connect/events_controller.rb4
-rw-r--r--app/controllers/jira_connect/subscriptions_controller.rb4
-rw-r--r--app/controllers/jwt_controller.rb2
-rw-r--r--app/controllers/oauth/jira/authorizations_controller.rb59
-rw-r--r--app/controllers/oauth/jira_dvcs/authorizations_controller.rb59
-rw-r--r--app/controllers/profiles/chat_names_controller.rb2
-rw-r--r--app/controllers/profiles/notifications_controller.rb2
-rw-r--r--app/controllers/profiles/preferences_controller.rb2
-rw-r--r--app/controllers/profiles/two_factor_auths_controller.rb24
-rw-r--r--app/controllers/projects/artifacts_controller.rb2
-rw-r--r--app/controllers/projects/boards_controller.rb6
-rw-r--r--app/controllers/projects/branches_controller.rb6
-rw-r--r--app/controllers/projects/commit_controller.rb6
-rw-r--r--app/controllers/projects/compare_controller.rb2
-rw-r--r--app/controllers/projects/environments_controller.rb6
-rw-r--r--app/controllers/projects/google_cloud/base_controller.rb6
-rw-r--r--app/controllers/projects/graphs_controller.rb2
-rw-r--r--app/controllers/projects/group_links_controller.rb21
-rw-r--r--app/controllers/projects/incidents_controller.rb5
-rw-r--r--app/controllers/projects/issues_controller.rb22
-rw-r--r--app/controllers/projects/jobs_controller.rb14
-rw-r--r--app/controllers/projects/learn_gitlab_controller.rb5
-rw-r--r--app/controllers/projects/merge_requests_controller.rb36
-rw-r--r--app/controllers/projects/milestones_controller.rb1
-rw-r--r--app/controllers/projects/packages/infrastructure_registry_controller.rb1
-rw-r--r--app/controllers/projects/pipeline_schedules_controller.rb4
-rw-r--r--app/controllers/projects/pipelines/tests_controller.rb12
-rw-r--r--app/controllers/projects/pipelines_controller.rb8
-rw-r--r--app/controllers/projects/project_members_controller.rb2
-rw-r--r--app/controllers/projects/refs_controller.rb12
-rw-r--r--app/controllers/projects/releases_controller.rb3
-rw-r--r--app/controllers/projects/security/configuration_controller.rb1
-rw-r--r--app/controllers/projects/serverless/functions_controller.rb2
-rw-r--r--app/controllers/projects/services_controller.rb4
-rw-r--r--app/controllers/projects/snippets_controller.rb4
-rw-r--r--app/controllers/projects/static_site_editor_controller.rb24
-rw-r--r--app/controllers/projects/tree_controller.rb1
-rw-r--r--app/controllers/projects/uploads_controller.rb2
-rw-r--r--app/controllers/projects/usage_quotas_controller.rb2
-rw-r--r--app/controllers/projects/web_ide_schemas_controller.rb2
-rw-r--r--app/controllers/projects/web_ide_terminals_controller.rb10
-rw-r--r--app/controllers/projects/work_items_controller.rb6
-rw-r--r--app/controllers/projects_controller.rb33
-rw-r--r--app/controllers/sandbox_controller.rb2
-rw-r--r--app/controllers/search_controller.rb12
-rw-r--r--app/controllers/sent_notifications_controller.rb2
-rw-r--r--app/controllers/sessions_controller.rb2
-rw-r--r--app/controllers/snippets/blobs_controller.rb1
-rw-r--r--app/controllers/uploads_controller.rb7
-rw-r--r--app/controllers/users_controller.rb9
-rw-r--r--app/events/ci/pipeline_created_event.rb1
-rw-r--r--app/experiments/application_experiment.rb10
-rw-r--r--app/experiments/ios_specific_templates_experiment.rb30
-rw-r--r--app/experiments/logged_out_marketing_header_experiment.rb9
-rw-r--r--app/experiments/new_project_sast_enabled_experiment.rb15
-rw-r--r--app/experiments/video_tutorials_continuous_onboarding_experiment.rb6
-rw-r--r--app/finders/bulk_imports/entities_finder.rb17
-rw-r--r--app/finders/bulk_imports/imports_finder.rb17
-rw-r--r--app/finders/ci/jobs_finder.rb2
-rw-r--r--app/finders/concerns/finder_methods.rb23
-rw-r--r--app/finders/keys_finder.rb10
-rw-r--r--app/finders/packages/build_infos_for_many_packages_finder.rb92
-rw-r--r--app/finders/packages/group_packages_finder.rb6
-rw-r--r--app/finders/packages/packages_finder.rb6
-rw-r--r--app/finders/releases/group_releases_finder.rb44
-rw-r--r--app/finders/user_recent_events_finder.rb16
-rw-r--r--app/finders/users_finder.rb10
-rw-r--r--app/graphql/graphql_triggers.rb4
-rw-r--r--app/graphql/mutations/ci/job/retry.rb18
-rw-r--r--app/graphql/mutations/ci/pipeline/cancel.rb2
-rw-r--r--app/graphql/mutations/environments/canary_ingress/update.rb13
-rw-r--r--app/graphql/mutations/notes/update/note.rb3
-rw-r--r--app/graphql/mutations/saved_replies/base.rb2
-rw-r--r--app/graphql/mutations/saved_replies/destroy.rb23
-rw-r--r--app/graphql/mutations/saved_replies/update.rb2
-rw-r--r--app/graphql/mutations/todos/mark_all_done.rb29
-rw-r--r--app/graphql/mutations/user_preferences/update.rb17
-rw-r--r--app/graphql/mutations/work_items/create.rb2
-rw-r--r--app/graphql/mutations/work_items/create_from_task.rb2
-rw-r--r--app/graphql/mutations/work_items/delete.rb2
-rw-r--r--app/graphql/mutations/work_items/update.rb2
-rw-r--r--app/graphql/queries/container_registry/get_container_repositories.query.graphql2
-rw-r--r--app/graphql/queries/releases/all_releases.query.graphql109
-rw-r--r--app/graphql/resolvers/base_issues_resolver.rb13
-rw-r--r--app/graphql/resolvers/base_resolver.rb2
-rw-r--r--app/graphql/resolvers/concerns/issue_resolver_arguments.rb1
-rw-r--r--app/graphql/resolvers/groups_resolver.rb2
-rw-r--r--app/graphql/resolvers/work_item_resolver.rb2
-rw-r--r--app/graphql/resolvers/work_items/types_resolver.rb10
-rw-r--r--app/graphql/types/base_object.rb7
-rw-r--r--app/graphql/types/ci/job_kind_enum.rb12
-rw-r--r--app/graphql/types/ci/job_type.rb8
-rw-r--r--app/graphql/types/ci/runner_upgrade_status_type_enum.rb21
-rw-r--r--app/graphql/types/container_repository_type.rb1
-rw-r--r--app/graphql/types/dependency_proxy/manifest_type.rb4
-rw-r--r--app/graphql/types/dependency_proxy/manifest_type_enum.rb11
-rw-r--r--app/graphql/types/issue_connection.rb15
-rw-r--r--app/graphql/types/issue_sort_enum.rb2
-rw-r--r--app/graphql/types/mutation_type.rb1
-rw-r--r--app/graphql/types/repository/blob_type.rb4
-rw-r--r--app/graphql/types/subscription_type.rb3
-rw-r--r--app/graphql/types/user_interface.rb3
-rw-r--r--app/helpers/admin/background_migrations_helper.rb10
-rw-r--r--app/helpers/application_settings_helper.rb59
-rw-r--r--app/helpers/auth_helper.rb1
-rw-r--r--app/helpers/boards_helper.rb30
-rw-r--r--app/helpers/broadcast_messages_helper.rb22
-rw-r--r--app/helpers/button_helper.rb2
-rw-r--r--app/helpers/ci/jobs_helper.rb4
-rw-r--r--app/helpers/ci/pipeline_editor_helper.rb4
-rw-r--r--app/helpers/ci/pipelines_helper.rb6
-rw-r--r--app/helpers/ci/runners_helper.rb30
-rw-r--r--app/helpers/clusters_helper.rb1
-rw-r--r--app/helpers/colors_helper.rb23
-rw-r--r--app/helpers/commits_helper.rb4
-rw-r--r--app/helpers/diff_helper.rb69
-rw-r--r--app/helpers/emails_helper.rb17
-rw-r--r--app/helpers/environment_helper.rb2
-rw-r--r--app/helpers/environments_helper.rb2
-rw-r--r--app/helpers/external_link_helper.rb2
-rw-r--r--app/helpers/groups/group_members_helper.rb32
-rw-r--r--app/helpers/ide_helper.rb8
-rw-r--r--app/helpers/invite_members_helper.rb3
-rw-r--r--app/helpers/issuables_helper.rb2
-rw-r--r--app/helpers/issues_helper.rb12
-rw-r--r--app/helpers/merge_requests_helper.rb6
-rw-r--r--app/helpers/namespaces_helper.rb9
-rw-r--r--app/helpers/packages_helper.rb2
-rw-r--r--app/helpers/preferences_helper.rb16
-rw-r--r--app/helpers/projects/alert_management_helper.rb5
-rw-r--r--app/helpers/projects/pipeline_helper.rb16
-rw-r--r--app/helpers/projects/project_members_helper.rb6
-rw-r--r--app/helpers/projects/security/configuration_helper.rb4
-rw-r--r--app/helpers/projects_helper.rb20
-rw-r--r--app/helpers/routing/projects_helper.rb4
-rw-r--r--app/helpers/routing/pseudonymization_helper.rb4
-rw-r--r--app/helpers/search_helper.rb19
-rw-r--r--app/helpers/snippets_helper.rb4
-rw-r--r--app/helpers/sorting_helper.rb17
-rw-r--r--app/helpers/submodule_helper.rb2
-rw-r--r--app/helpers/timeboxes_helper.rb15
-rw-r--r--app/helpers/users/callouts_helper.rb5
-rw-r--r--app/helpers/users/group_callouts_helper.rb2
-rw-r--r--app/helpers/wiki_helper.rb14
-rw-r--r--app/helpers/workhorse_helper.rb4
-rw-r--r--app/mailers/emails/merge_requests.rb9
-rw-r--r--app/mailers/emails/profile.rb11
-rw-r--r--app/mailers/emails/reviews.rb4
-rw-r--r--app/mailers/previews/notify_preview.rb4
-rw-r--r--app/models/alert_management/alert.rb5
-rw-r--r--app/models/alert_management/metric_image.rb25
-rw-r--r--app/models/analytics/cycle_analytics/aggregation.rb40
-rw-r--r--app/models/application_setting.rb16
-rw-r--r--app/models/application_setting_implementation.rb30
-rw-r--r--app/models/award_emoji.rb8
-rw-r--r--app/models/blob.rb6
-rw-r--r--app/models/blob_viewer/balsamiq.rb14
-rw-r--r--app/models/broadcast_message.rb13
-rw-r--r--app/models/bulk_import.rb9
-rw-r--r--app/models/bulk_imports/entity.rb13
-rw-r--r--app/models/bulk_imports/export_status.rb6
-rw-r--r--app/models/bulk_imports/tracker.rb5
-rw-r--r--app/models/ci/bridge.rb20
-rw-r--r--app/models/ci/build.rb36
-rw-r--r--app/models/ci/job_artifact.rb5
-rw-r--r--app/models/ci/namespace_mirror.rb20
-rw-r--r--app/models/ci/pipeline.rb14
-rw-r--r--app/models/ci/processable.rb6
-rw-r--r--app/models/ci/secure_file.rb8
-rw-r--r--app/models/clusters/agent_token.rb2
-rw-r--r--app/models/clusters/applications/runner.rb2
-rw-r--r--app/models/commit_status.rb2
-rw-r--r--app/models/concerns/batch_nullify_dependent_associations.rb27
-rw-r--r--app/models/concerns/bulk_users_by_email_load.rb24
-rw-r--r--app/models/concerns/featurable.rb38
-rw-r--r--app/models/concerns/from_set_operator.rb7
-rw-r--r--app/models/concerns/issuable.rb21
-rw-r--r--app/models/concerns/issuable_link.rb2
-rw-r--r--app/models/concerns/metric_image_uploading.rb54
-rw-r--r--app/models/concerns/sensitive_serializable_hash.rb7
-rw-r--r--app/models/concerns/spammable.rb3
-rw-r--r--app/models/concerns/taskable.rb8
-rw-r--r--app/models/container_repository.rb142
-rw-r--r--app/models/custom_emoji.rb13
-rw-r--r--app/models/customer_relations/contact.rb32
-rw-r--r--app/models/customer_relations/issue_contact.rb16
-rw-r--r--app/models/customer_relations/organization.rb28
-rw-r--r--app/models/deploy_token.rb5
-rw-r--r--app/models/deployment.rb13
-rw-r--r--app/models/discussion.rb8
-rw-r--r--app/models/environment.rb76
-rw-r--r--app/models/environment_status.rb2
-rw-r--r--app/models/error_tracking/project_error_tracking_setting.rb2
-rw-r--r--app/models/event.rb4
-rw-r--r--app/models/group.rb81
-rw-r--r--app/models/group_group_link.rb13
-rw-r--r--app/models/groups/feature_setting.rb24
-rw-r--r--app/models/integration.rb98
-rw-r--r--app/models/integrations/base_chat_notification.rb5
-rw-r--r--app/models/integrations/base_issue_tracker.rb13
-rw-r--r--app/models/integrations/base_third_party_wiki.rb39
-rw-r--r--app/models/integrations/buildkite.rb4
-rw-r--r--app/models/integrations/confluence.rb15
-rw-r--r--app/models/integrations/emails_on_push.rb4
-rw-r--r--app/models/integrations/field.rb6
-rw-r--r--app/models/integrations/jira.rb25
-rw-r--r--app/models/integrations/pipelines_email.rb5
-rw-r--r--app/models/integrations/prometheus.rb6
-rw-r--r--app/models/integrations/shimo.rb17
-rw-r--r--app/models/issue.rb22
-rw-r--r--app/models/key.rb12
-rw-r--r--app/models/member.rb30
-rw-r--r--app/models/members/project_member.rb9
-rw-r--r--app/models/merge_request.rb28
-rw-r--r--app/models/milestone.rb8
-rw-r--r--app/models/namespace.rb5
-rw-r--r--app/models/namespace/root_storage_statistics.rb8
-rw-r--r--app/models/namespaces/traversal/linear.rb27
-rw-r--r--app/models/note.rb58
-rw-r--r--app/models/onboarding_progress.rb3
-rw-r--r--app/models/packages/package.rb4
-rw-r--r--app/models/packages/package_file.rb2
-rw-r--r--app/models/preloaders/group_root_ancestor_preloader.rb32
-rw-r--r--app/models/programming_language.rb7
-rw-r--r--app/models/project.rb68
-rw-r--r--app/models/project_feature.rb26
-rw-r--r--app/models/project_group_link.rb1
-rw-r--r--app/models/project_import_state.rb23
-rw-r--r--app/models/project_setting.rb11
-rw-r--r--app/models/projects/build_artifacts_size_refresh.rb2
-rw-r--r--app/models/projects/topic.rb4
-rw-r--r--app/models/repository.rb22
-rw-r--r--app/models/repository_language.rb4
-rw-r--r--app/models/review.rb4
-rw-r--r--app/models/snippet.rb1
-rw-r--r--app/models/suggestion.rb6
-rw-r--r--app/models/todo.rb6
-rw-r--r--app/models/user.rb121
-rw-r--r--app/models/user_custom_attribute.rb10
-rw-r--r--app/models/user_preference.rb3
-rw-r--r--app/models/users/callout.rb3
-rw-r--r--app/models/users/group_callout.rb4
-rw-r--r--app/models/users/in_product_marketing_email.rb7
-rw-r--r--app/models/vulnerability.rb2
-rw-r--r--app/models/wiki.rb97
-rw-r--r--app/models/wiki_page.rb6
-rw-r--r--app/models/work_items/type.rb2
-rw-r--r--app/policies/alert_management/alert_policy.rb12
-rw-r--r--app/policies/environment_policy.rb6
-rw-r--r--app/policies/project_member_policy.rb7
-rw-r--r--app/policies/project_policy.rb4
-rw-r--r--app/policies/suggestion_policy.rb4
-rw-r--r--app/policies/user_policy.rb1
-rw-r--r--app/presenters/README.md8
-rw-r--r--app/presenters/ci/bridge_presenter.rb4
-rw-r--r--app/presenters/ci/build_presenter.rb6
-rw-r--r--app/presenters/ci/build_runner_presenter.rb57
-rw-r--r--app/presenters/clusterable_presenter.rb4
-rw-r--r--app/presenters/commit_status_presenter.rb2
-rw-r--r--app/presenters/dev_ops_report/metric_presenter.rb44
-rw-r--r--app/presenters/event_presenter.rb2
-rw-r--r--app/presenters/gitlab/blame_presenter.rb22
-rw-r--r--app/presenters/instance_clusterable_presenter.rb5
-rw-r--r--app/presenters/issue_presenter.rb16
-rw-r--r--app/presenters/label_presenter.rb2
-rw-r--r--app/presenters/pages_domain_presenter.rb2
-rw-r--r--app/presenters/projects/security/configuration_presenter.rb3
-rw-r--r--app/serializers/deployment_entity.rb1
-rw-r--r--app/serializers/environment_entity.rb2
-rw-r--r--app/serializers/environment_status_entity.rb2
-rw-r--r--app/serializers/group_link/group_group_link_entity.rb16
-rw-r--r--app/serializers/group_link/group_link_entity.rb27
-rw-r--r--app/serializers/group_link/project_group_link_entity.rb12
-rw-r--r--app/serializers/issue_entity.rb2
-rw-r--r--app/serializers/member_user_entity.rb3
-rw-r--r--app/serializers/merge_request_noteable_entity.rb2
-rw-r--r--app/serializers/merge_request_serializer.rb2
-rw-r--r--app/services/alert_management/metric_images/upload_service.rb46
-rw-r--r--app/services/audit_event_service.rb7
-rw-r--r--app/services/auth/container_registry_authentication_service.rb6
-rw-r--r--app/services/base_container_service.rb4
-rw-r--r--app/services/bulk_imports/relation_export_service.rb5
-rw-r--r--app/services/ci/after_requeue_job_service.rb12
-rw-r--r--app/services/ci/create_downstream_pipeline_service.rb10
-rw-r--r--app/services/ci/create_pipeline_service.rb1
-rw-r--r--app/services/ci/job_artifacts/destroy_all_expired_service.rb12
-rw-r--r--app/services/ci/job_artifacts/destroy_batch_service.rb6
-rw-r--r--app/services/ci/job_artifacts/update_unknown_locked_status_service.rb79
-rw-r--r--app/services/ci/play_build_service.rb5
-rw-r--r--app/services/ci/register_job_service.rb3
-rw-r--r--app/services/ci/retry_build_service.rb94
-rw-r--r--app/services/ci/retry_job_service.rb94
-rw-r--r--app/services/ci/retry_pipeline_service.rb2
-rw-r--r--app/services/concerns/deploy_token_methods.rb5
-rw-r--r--app/services/concerns/incident_management/usage_data.rb5
-rw-r--r--app/services/concerns/members/bulk_create_users.rb12
-rw-r--r--app/services/database/consistency_check_service.rb109
-rw-r--r--app/services/deployments/update_environment_service.rb8
-rw-r--r--app/services/emails/base_service.rb4
-rw-r--r--app/services/emails/create_service.rb1
-rw-r--r--app/services/environments/stop_service.rb6
-rw-r--r--app/services/event_create_service.rb5
-rw-r--r--app/services/files/base_service.rb2
-rw-r--r--app/services/files/create_service.rb3
-rw-r--r--app/services/files/update_service.rb3
-rw-r--r--app/services/git/branch_push_service.rb7
-rw-r--r--app/services/groups/create_service.rb5
-rw-r--r--app/services/groups/deploy_tokens/create_service.rb2
-rw-r--r--app/services/groups/transfer_service.rb33
-rw-r--r--app/services/import/github_service.rb2
-rw-r--r--app/services/incident_management/issuable_escalation_statuses/build_service.rb34
-rw-r--r--app/services/incident_management/issuable_escalation_statuses/create_service.rb19
-rw-r--r--app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb6
-rw-r--r--app/services/issuable_base_service.rb14
-rw-r--r--app/services/issuable_links/create_service.rb26
-rw-r--r--app/services/issuable_links/destroy_service.rb6
-rw-r--r--app/services/issue_links/create_service.rb2
-rw-r--r--app/services/issue_links/destroy_service.rb2
-rw-r--r--app/services/issues/update_service.rb1
-rw-r--r--app/services/jira/requests/base.rb2
-rw-r--r--app/services/loose_foreign_keys/process_deleted_records_service.rb2
-rw-r--r--app/services/members/create_service.rb63
-rw-r--r--app/services/members/creator_service.rb64
-rw-r--r--app/services/members/groups/creator_service.rb12
-rw-r--r--app/services/members/invite_service.rb55
-rw-r--r--app/services/members/projects/creator_service.rb25
-rw-r--r--app/services/merge_requests/base_service.rb2
-rw-r--r--app/services/merge_requests/update_service.rb1
-rw-r--r--app/services/namespaces/in_product_marketing_emails_service.rb5
-rw-r--r--app/services/namespaces/invite_team_email_service.rb61
-rw-r--r--app/services/notes/create_service.rb2
-rw-r--r--app/services/notes/update_service.rb14
-rw-r--r--app/services/notification_service.rb30
-rw-r--r--app/services/packages/rubygems/metadata_extraction_service.rb6
-rw-r--r--app/services/projects/apple_target_platform_detector_service.rb58
-rw-r--r--app/services/projects/container_repository/third_party/delete_tags_service.rb2
-rw-r--r--app/services/projects/create_service.rb13
-rw-r--r--app/services/projects/deploy_tokens/create_service.rb2
-rw-r--r--app/services/projects/import_export/export_service.rb46
-rw-r--r--app/services/projects/operations/update_service.rb3
-rw-r--r--app/services/projects/participants_service.rb6
-rw-r--r--app/services/projects/record_target_platforms_service.rb29
-rw-r--r--app/services/projects/refresh_build_artifacts_size_statistics_service.rb2
-rw-r--r--app/services/projects/transfer_service.rb14
-rw-r--r--app/services/quick_actions/interpret_service.rb7
-rw-r--r--app/services/resource_access_tokens/create_service.rb1
-rw-r--r--app/services/suggestions/apply_service.rb2
-rw-r--r--app/services/users/destroy_service.rb4
-rw-r--r--app/services/users/migrate_to_ghost_user_service.rb4
-rw-r--r--app/services/users/registrations_build_service.rb2
-rw-r--r--app/services/users/saved_replies/destroy_service.rb23
-rw-r--r--app/services/users/saved_replies/update_service.rb5
-rw-r--r--app/services/web_hook_service.rb16
-rw-r--r--app/uploaders/ci/secure_file_uploader.rb2
-rw-r--r--app/uploaders/metric_image_uploader.rb20
-rw-r--r--app/validators/gitlab/emoji_name_validator.rb19
-rw-r--r--app/validators/key_restriction_validator.rb15
-rw-r--r--app/views/admin/application_settings/_account_and_limit.html.haml32
-rw-r--r--app/views/admin/application_settings/_ci_cd.html.haml164
-rw-r--r--app/views/admin/application_settings/_eks.html.haml8
-rw-r--r--app/views/admin/application_settings/_email.html.haml30
-rw-r--r--app/views/admin/application_settings/_external_authorization_service_form.html.haml11
-rw-r--r--app/views/admin/application_settings/_floc.html.haml7
-rw-r--r--app/views/admin/application_settings/_git_lfs_limits.html.haml11
-rw-r--r--app/views/admin/application_settings/_gitpod.html.haml7
-rw-r--r--app/views/admin/application_settings/_grafana.html.haml11
-rw-r--r--app/views/admin/application_settings/_help_page.html.haml7
-rw-r--r--app/views/admin/application_settings/_kroki.html.haml13
-rw-r--r--app/views/admin/application_settings/_localization.html.haml12
-rw-r--r--app/views/admin/application_settings/_mailgun.html.haml7
-rw-r--r--app/views/admin/application_settings/_note_limits.html.haml4
-rw-r--r--app/views/admin/application_settings/_outbound.html.haml24
-rw-r--r--app/views/admin/application_settings/_pages.html.haml36
-rw-r--r--app/views/admin/application_settings/_performance.html.haml13
-rw-r--r--app/views/admin/application_settings/_performance_bar.html.haml9
-rw-r--r--app/views/admin/application_settings/_plantuml.html.haml7
-rw-r--r--app/views/admin/application_settings/_protected_paths.html.haml11
-rw-r--r--app/views/admin/application_settings/_registry.html.haml28
-rw-r--r--app/views/admin/application_settings/_repository_check.html.haml30
-rw-r--r--app/views/admin/application_settings/_repository_mirrors_form.html.haml10
-rw-r--r--app/views/admin/application_settings/_sentry.html.haml6
-rw-r--r--app/views/admin/application_settings/_signup.html.haml4
-rw-r--r--app/views/admin/application_settings/_snowplow.html.haml6
-rw-r--r--app/views/admin/application_settings/_sourcegraph.html.haml12
-rw-r--r--app/views/admin/application_settings/_spam.html.haml50
-rw-r--r--app/views/admin/application_settings/_terms.html.haml8
-rw-r--r--app/views/admin/application_settings/_third_party_offers.html.haml7
-rw-r--r--app/views/admin/application_settings/_usage.html.haml99
-rw-r--r--app/views/admin/application_settings/_users_api_limits.html.haml4
-rw-r--r--app/views/admin/application_settings/_visibility_and_access.html.haml24
-rw-r--r--app/views/admin/application_settings/appearances/_form.html.haml4
-rw-r--r--app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml11
-rw-r--r--app/views/admin/application_settings/ci_cd.html.haml3
-rw-r--r--app/views/admin/application_settings/general.html.haml13
-rw-r--r--app/views/admin/application_settings/repository.html.haml2
-rw-r--r--app/views/admin/application_settings/service_usage_data.html.haml27
-rw-r--r--app/views/admin/applications/_delete_form.html.haml3
-rw-r--r--app/views/admin/applications/_form.html.haml4
-rw-r--r--app/views/admin/applications/index.html.haml77
-rw-r--r--app/views/admin/background_migrations/_migration.html.haml2
-rw-r--r--app/views/admin/broadcast_messages/_form.html.haml32
-rw-r--r--app/views/admin/broadcast_messages/_preview.html.haml3
-rw-r--r--app/views/admin/dashboard/_security_newsletter_callout.html.haml13
-rw-r--r--app/views/admin/groups/_form.html.haml4
-rw-r--r--app/views/admin/groups/index.html.haml3
-rw-r--r--app/views/admin/hooks/_form.html.haml32
-rw-r--r--app/views/admin/hooks/edit.html.haml2
-rw-r--r--app/views/admin/hooks/index.html.haml2
-rw-r--r--app/views/admin/identities/index.html.haml2
-rw-r--r--app/views/admin/impersonation_tokens/index.html.haml2
-rw-r--r--app/views/admin/projects/show.html.haml6
-rw-r--r--app/views/admin/runners/edit.html.haml5
-rw-r--r--app/views/admin/topics/_form.html.haml2
-rw-r--r--app/views/admin/users/_access_levels.html.haml20
-rw-r--r--app/views/admin/users/_modals.html.haml20
-rw-r--r--app/views/admin/users/_users.html.haml7
-rw-r--r--app/views/admin/users/keys.html.haml1
-rw-r--r--app/views/admin/users/projects.html.haml2
-rw-r--r--app/views/admin/users/show.html.haml5
-rw-r--r--app/views/clusters/clusters/_banner.html.haml12
-rw-r--r--app/views/clusters/clusters/_deprecation_alert.html.haml7
-rw-r--r--app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml6
-rw-r--r--app/views/clusters/clusters/_sidebar.html.haml14
-rw-r--r--app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml11
-rw-r--r--app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml8
-rw-r--r--app/views/clusters/clusters/connect.html.haml10
-rw-r--r--app/views/clusters/clusters/new.html.haml10
-rw-r--r--app/views/clusters/clusters/new_cluster_docs.html.haml13
-rw-r--r--app/views/dashboard/milestones/index.html.haml35
-rw-r--r--app/views/devise/sessions/_new_base.html.haml17
-rw-r--r--app/views/devise/shared/_email_opted_in.html.haml3
-rw-r--r--app/views/errors/_footer.html.haml4
-rw-r--r--app/views/groups/_group_admin_settings.html.haml23
-rw-r--r--app/views/groups/_import_group_from_another_instance_panel.html.haml4
-rw-r--r--app/views/groups/_import_group_from_file_panel.html.haml4
-rw-r--r--app/views/groups/_subgroups_and_projects.html.haml3
-rw-r--r--app/views/groups/crm/contacts/index.html.haml8
-rw-r--r--app/views/groups/crm/organizations/index.html.haml8
-rw-r--r--app/views/groups/dependency_proxies/show.html.haml2
-rw-r--r--app/views/groups/edit.html.haml1
-rw-r--r--app/views/groups/group_members/index.html.haml6
-rw-r--r--app/views/groups/harbor/repositories/index.html.haml6
-rw-r--r--app/views/groups/milestones/index.html.haml43
-rw-r--r--app/views/groups/runners/_settings.html.haml186
-rw-r--r--app/views/groups/runners/_sort_dropdown.html.haml11
-rw-r--r--app/views/groups/settings/_export.html.haml28
-rw-r--r--app/views/groups/settings/_permissions.html.haml2
-rw-r--r--app/views/groups/settings/_remove_button.html.haml3
-rw-r--r--app/views/groups/settings/_transfer.html.haml3
-rw-r--r--app/views/groups/settings/ci_cd/_auto_devops_form.html.haml18
-rw-r--r--app/views/groups/settings/ci_cd/show.html.haml1
-rw-r--r--app/views/groups/show.html.haml21
-rw-r--r--app/views/import/_githubish_status.html.haml2
-rw-r--r--app/views/import/github/new.html.haml3
-rw-r--r--app/views/import/github/status.html.haml2
-rw-r--r--app/views/import/history/index.html.haml4
-rw-r--r--app/views/import/shared/_errors.html.haml5
-rw-r--r--app/views/jira_connect/users/show.html.haml14
-rw-r--r--app/views/layouts/_diffs_colors_css.haml20
-rw-r--r--app/views/layouts/_header_search.html.haml7
-rw-r--r--app/views/layouts/_page.html.haml1
-rw-r--r--app/views/layouts/_snowplow.html.haml2
-rw-r--r--app/views/layouts/_startup_css.haml3
-rw-r--r--app/views/layouts/application.html.haml2
-rw-r--r--app/views/layouts/errors.html.haml4
-rw-r--r--app/views/layouts/header/_current_user_dropdown.html.haml1
-rw-r--r--app/views/layouts/header/_default.html.haml2
-rw-r--r--app/views/layouts/header/_registration_enabled_callout.html.haml8
-rw-r--r--app/views/layouts/header/_storage_enforcement_banner.html.haml7
-rw-r--r--app/views/layouts/nav/sidebar/_admin.html.haml15
-rw-r--r--app/views/notify/_note_email.html.haml17
-rw-r--r--app/views/notify/_note_email.text.erb7
-rw-r--r--app/views/notify/issue_due_email.html.haml4
-rw-r--r--app/views/notify/issue_moved_email.html.haml8
-rw-r--r--app/views/notify/issue_status_changed_email.html.haml2
-rw-r--r--app/views/notify/merge_request_status_email.html.haml4
-rw-r--r--app/views/notify/merge_request_status_email.text.haml6
-rw-r--r--app/views/notify/merge_request_unmergeable_email.html.haml2
-rw-r--r--app/views/notify/merge_request_unmergeable_email.text.haml6
-rw-r--r--app/views/notify/merged_merge_request_email.html.haml2
-rw-r--r--app/views/notify/merged_merge_request_email.text.haml6
-rw-r--r--app/views/notify/new_email_address_added_email.erb5
-rw-r--r--app/views/notify/new_email_address_added_email.haml6
-rw-r--r--app/views/notify/new_merge_request_email.html.haml23
-rw-r--r--app/views/notify/new_review_email.html.haml14
-rw-r--r--app/views/notify/new_review_email.text.erb4
-rw-r--r--app/views/notify/push_to_merge_request_email.html.haml11
-rw-r--r--app/views/notify/service_desk_new_note_email.html.haml2
-rw-r--r--app/views/profiles/accounts/show.html.haml11
-rw-r--r--app/views/profiles/keys/_form.html.haml6
-rw-r--r--app/views/profiles/keys/index.html.haml2
-rw-r--r--app/views/profiles/notifications/_email_settings.html.haml4
-rw-r--r--app/views/profiles/notifications/show.html.haml24
-rw-r--r--app/views/profiles/preferences/show.html.haml65
-rw-r--r--app/views/profiles/two_factor_auths/show.html.haml6
-rw-r--r--app/views/projects/_deletion_failed.html.haml4
-rw-r--r--app/views/projects/_files.html.haml2
-rw-r--r--app/views/projects/_import_project_pane.html.haml8
-rw-r--r--app/views/projects/_last_push.html.haml5
-rw-r--r--app/views/projects/_new_project_fields.html.haml35
-rw-r--r--app/views/projects/_new_project_initialize_with_sast.html.haml16
-rw-r--r--app/views/projects/_transfer.html.haml5
-rw-r--r--app/views/projects/alert_management/details.html.haml2
-rw-r--r--app/views/projects/blame/show.html.haml2
-rw-r--r--app/views/projects/blob/_upload.html.haml4
-rw-r--r--app/views/projects/blob/edit.html.haml5
-rw-r--r--app/views/projects/blob/viewers/_balsamiq.html.haml1
-rw-r--r--app/views/projects/branches/_branch.html.haml1
-rw-r--r--app/views/projects/branches/_panel.html.haml2
-rw-r--r--app/views/projects/branches/index.html.haml5
-rw-r--r--app/views/projects/branches/new.html.haml4
-rw-r--r--app/views/projects/commit/_commit_box.html.haml6
-rw-r--r--app/views/projects/commit/show.html.haml1
-rw-r--r--app/views/projects/commits/_commits.html.haml5
-rw-r--r--app/views/projects/commits/show.html.haml2
-rw-r--r--app/views/projects/compare/show.html.haml1
-rw-r--r--app/views/projects/deploy_keys/edit.html.haml2
-rw-r--r--app/views/projects/diffs/_diffs.html.haml7
-rw-r--r--app/views/projects/diffs/_file.html.haml1
-rw-r--r--app/views/projects/diffs/_line.html.haml2
-rw-r--r--app/views/projects/diffs/_parallel_view.html.haml4
-rw-r--r--app/views/projects/diffs/_stats.html.haml1
-rw-r--r--app/views/projects/diffs/_text_file.html.haml2
-rw-r--r--app/views/projects/diffs/_warning.html.haml13
-rw-r--r--app/views/projects/edit.html.haml6
-rw-r--r--app/views/projects/empty.html.haml1
-rw-r--r--app/views/projects/forks/error.html.haml5
-rw-r--r--app/views/projects/forks/index.html.haml13
-rw-r--r--app/views/projects/harbor/repositories/index.html.haml6
-rw-r--r--app/views/projects/hooks/edit.html.haml2
-rw-r--r--app/views/projects/hooks/index.html.haml2
-rw-r--r--app/views/projects/imports/new.html.haml2
-rw-r--r--app/views/projects/issues/_alert_moved_from_service_desk.html.haml6
-rw-r--r--app/views/projects/issues/_form.html.haml4
-rw-r--r--app/views/projects/issues/_new_branch.html.haml8
-rw-r--r--app/views/projects/jobs/index.html.haml4
-rw-r--r--app/views/projects/mattermosts/_no_teams.html.haml6
-rw-r--r--app/views/projects/merge_requests/_form.html.haml2
-rw-r--r--app/views/projects/merge_requests/_mr_title.html.haml5
-rw-r--r--app/views/projects/merge_requests/creations/_new_submit.html.haml2
-rw-r--r--app/views/projects/merge_requests/invalid.html.haml5
-rw-r--r--app/views/projects/milestones/index.html.haml46
-rw-r--r--app/views/projects/milestones/show.html.haml6
-rw-r--r--app/views/projects/mirrors/_mirror_repos.html.haml6
-rw-r--r--app/views/projects/mirrors/_ssh_host_keys.html.haml2
-rw-r--r--app/views/projects/no_repo.html.haml2
-rw-r--r--app/views/projects/pages/_pages_settings.html.haml19
-rw-r--r--app/views/projects/pages_domains/_form.html.haml3
-rw-r--r--app/views/projects/pipeline_schedules/_form.html.haml7
-rw-r--r--app/views/projects/pipeline_schedules/index.html.haml2
-rw-r--r--app/views/projects/pipelines/index.html.haml2
-rw-r--r--app/views/projects/pipelines/show.html.haml6
-rw-r--r--app/views/projects/project_members/index.html.haml2
-rw-r--r--app/views/projects/protected_branches/shared/_protected_branch.html.haml2
-rw-r--r--app/views/projects/registry/repositories/index.html.haml2
-rw-r--r--app/views/projects/runners/_runner.html.haml6
-rw-r--r--app/views/projects/security/configuration/show.html.haml1
-rw-r--r--app/views/projects/services/_form.html.haml7
-rw-r--r--app/views/projects/services/prometheus/_configuration_banner.html.haml26
-rw-r--r--app/views/projects/services/prometheus/_help.html.haml3
-rw-r--r--app/views/projects/services/prometheus/_top.html.haml3
-rw-r--r--app/views/projects/settings/_archive.html.haml4
-rw-r--r--app/views/projects/settings/ci_cd/_autodevops_form.html.haml17
-rw-r--r--app/views/projects/settings/ci_cd/_form.html.haml39
-rw-r--r--app/views/projects/settings/ci_cd/show.html.haml2
-rw-r--r--app/views/projects/settings/operations/_configuration_banner.html.haml24
-rw-r--r--app/views/projects/settings/operations/_prometheus.html.haml2
-rw-r--r--app/views/projects/settings/operations/show.html.haml2
-rw-r--r--app/views/projects/settings/packages_and_registries/show.html.haml2
-rw-r--r--app/views/projects/show.html.haml2
-rw-r--r--app/views/projects/tags/index.html.haml13
-rw-r--r--app/views/projects/tracings/show.html.haml2
-rw-r--r--app/views/registrations/welcome/show.html.haml2
-rw-r--r--app/views/search/results/_blob_highlight.html.haml4
-rw-r--r--app/views/shared/_allow_request_access.html.haml3
-rw-r--r--app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml6
-rw-r--r--app/views/shared/_broadcast_message.html.haml37
-rw-r--r--app/views/shared/_global_alert.html.haml21
-rw-r--r--app/views/shared/_import_form.html.haml5
-rw-r--r--app/views/shared/_milestones_sort_dropdown.html.haml26
-rw-r--r--app/views/shared/_no_password.html.haml5
-rw-r--r--app/views/shared/_no_ssh.html.haml5
-rw-r--r--app/views/shared/_outdated_browser.html.haml3
-rw-r--r--app/views/shared/_project_limit.html.haml5
-rw-r--r--app/views/shared/_prometheus_configuration_banner.html.haml27
-rw-r--r--app/views/shared/_service_ping_consent.html.haml4
-rw-r--r--app/views/shared/_two_factor_auth_recovery_settings_check.html.haml9
-rw-r--r--app/views/shared/access_tokens/_form.html.haml4
-rw-r--r--app/views/shared/boards/_show.html.haml2
-rw-r--r--app/views/shared/boards/_switcher.html.haml12
-rw-r--r--app/views/shared/deploy_keys/_form.html.haml7
-rw-r--r--app/views/shared/deploy_keys/_project_group_form.html.haml10
-rw-r--r--app/views/shared/doorkeeper/applications/_form.html.haml23
-rw-r--r--app/views/shared/empty_states/_issues.html.haml2
-rw-r--r--app/views/shared/empty_states/_milestones.html.haml8
-rw-r--r--app/views/shared/empty_states/_milestones_tab.html.haml17
-rw-r--r--app/views/shared/errors/_gitaly_unavailable.html.haml5
-rw-r--r--app/views/shared/groups/_dropdown.html.haml27
-rw-r--r--app/views/shared/hook_logs/_content.html.haml13
-rw-r--r--app/views/shared/integrations/edit.html.haml2
-rw-r--r--app/views/shared/issuable/_assignees.html.haml2
-rw-r--r--app/views/shared/issuable/_form.html.haml5
-rw-r--r--app/views/shared/issuable/_label_page_create.html.haml2
-rw-r--r--app/views/shared/issuable/_merge_request_assignees.html.haml2
-rw-r--r--app/views/shared/issuable/_merge_request_reviewers.html.haml2
-rw-r--r--app/views/shared/issuable/_reviewers.html.haml2
-rw-r--r--app/views/shared/issuable/_search_bar.html.haml357
-rw-r--r--app/views/shared/issuable/_sidebar.html.haml2
-rw-r--r--app/views/shared/issuable/form/_contribution.html.haml15
-rw-r--r--app/views/shared/issuable/form/_metadata.html.haml6
-rw-r--r--app/views/shared/issue_type/_details_content.html.haml10
-rw-r--r--app/views/shared/milestones/_milestone_complete_alert.html.haml5
-rw-r--r--app/views/shared/projects/_list.html.haml4
-rw-r--r--app/views/shared/runners/_runner_type_alert.html.haml24
-rw-r--r--app/views/shared/tokens/_scopes_form.html.haml15
-rw-r--r--app/views/shared/web_hooks/_form.html.haml141
-rw-r--r--app/views/shared/web_hooks/_hook_errors.html.haml18
-rw-r--r--app/views/shared/wikis/_form.html.haml2
-rw-r--r--app/views/shared/wikis/_main_links.html.haml2
-rw-r--r--app/views/shared/wikis/show.html.haml3
-rw-r--r--app/views/users/show.html.haml2
-rw-r--r--app/workers/all_queues.yml65
-rw-r--r--app/workers/bulk_import_worker.rb22
-rw-r--r--app/workers/bulk_imports/entity_worker.rb37
-rw-r--r--app/workers/bulk_imports/export_request_worker.rb10
-rw-r--r--app/workers/bulk_imports/pipeline_worker.rb41
-rw-r--r--app/workers/bulk_imports/relation_export_worker.rb4
-rw-r--r--app/workers/bulk_imports/stuck_import_worker.rb31
-rw-r--r--app/workers/ci/update_locked_unknown_artifacts_worker.rb26
-rw-r--r--app/workers/concerns/chaos_queue.rb2
-rw-r--r--app/workers/concerns/git_garbage_collect_methods.rb6
-rw-r--r--app/workers/concerns/packages/cleanup_artifact_worker.rb6
-rw-r--r--app/workers/concerns/reactive_cacheable_worker.rb5
-rw-r--r--app/workers/concerns/worker_attributes.rb8
-rw-r--r--app/workers/container_registry/migration/enqueuer_worker.rb107
-rw-r--r--app/workers/container_registry/migration/guard_worker.rb52
-rw-r--r--app/workers/database/batched_background_migration/ci_database_worker.rb4
-rw-r--r--app/workers/database/batched_background_migration/single_database_worker.rb6
-rw-r--r--app/workers/database/batched_background_migration_worker.rb4
-rw-r--r--app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb28
-rw-r--r--app/workers/database/ci_project_mirrors_consistency_check_worker.rb28
-rw-r--r--app/workers/delete_stored_files_worker.rb2
-rw-r--r--app/workers/environments/auto_stop_worker.rb6
-rw-r--r--app/workers/flush_counter_increments_worker.rb5
-rw-r--r--app/workers/namespaces/invite_team_email_worker.rb22
-rw-r--r--app/workers/namespaces/root_statistics_worker.rb9
-rw-r--r--app/workers/object_storage/background_move_worker.rb2
-rw-r--r--app/workers/object_storage/migrate_uploads_worker.rb2
-rw-r--r--app/workers/project_export_worker.rb16
-rw-r--r--app/workers/projects/record_target_platforms_worker.rb55
-rw-r--r--app/workers/quality/test_data_cleanup_worker.rb33
-rw-r--r--config.ru2
-rw-r--r--config/application.rb27
-rw-r--r--config/events/1649272430_projectsnew_visit_docs.yml18
-rw-r--r--config/feature_categories.yml3
-rw-r--r--config/feature_flags/development/about_your_company_registration_flow.yml8
-rw-r--r--config/feature_flags/development/admin_application_settings_service_usage_data_center.yml8
-rw-r--r--config/feature_flags/development/admin_runners_bulk_delete.yml8
-rw-r--r--config/feature_flags/development/allow_non_blocking_member_refresh.yml8
-rw-r--r--config/feature_flags/development/arkose_labs_login_challenge.yml8
-rw-r--r--config/feature_flags/development/arkose_labs_prevent_login.yml8
-rw-r--r--config/feature_flags/development/bulk_expire_project_artifacts.yml8
-rw-r--r--config/feature_flags/development/ci_artifact_fast_removal_large_loop_limit.yml8
-rw-r--r--config/feature_flags/development/ci_destroy_all_expired_service.yml8
-rw-r--r--config/feature_flags/development/ci_expand_environment_name_and_url.yml8
-rw-r--r--config/feature_flags/development/ci_fix_order_of_subsequent_jobs.yml8
-rw-r--r--config/feature_flags/development/ci_job_artifacts_backlog_large_loop_limit.yml8
-rw-r--r--config/feature_flags/development/ci_job_artifacts_backlog_work.yml8
-rw-r--r--config/feature_flags/development/ci_namespace_mirrors_consistency_check.yml8
-rw-r--r--config/feature_flags/development/ci_owned_runners_unnest_index.yml8
-rw-r--r--config/feature_flags/development/ci_project_mirrors_consistency_check.yml8
-rw-r--r--config/feature_flags/development/ci_skip_legacy_extra_minutes_recalculation.yml8
-rw-r--r--config/feature_flags/development/ci_test_report_artifacts_expired.yml8
-rw-r--r--config/feature_flags/development/ci_throttle_pipelines_creation.yml8
-rw-r--r--config/feature_flags/development/ci_throttle_pipelines_creation_dry_run.yml8
-rw-r--r--config/feature_flags/development/ci_trigger_forward_variables.yml2
-rw-r--r--config/feature_flags/development/ci_validate_job_length.yml8
-rw-r--r--config/feature_flags/development/ci_variables_builder_config_variables.yml8
-rw-r--r--config/feature_flags/development/ci_variables_builder_memoize_secret_variables.yml8
-rw-r--r--config/feature_flags/development/container_registry_migration_phase2_all_plans.yml8
-rw-r--r--config/feature_flags/development/container_security_policy_selection.yml8
-rw-r--r--config/feature_flags/development/convert_diff_to_utf8_with_replacement_symbol.yml8
-rw-r--r--config/feature_flags/development/create_project_settings.yml8
-rw-r--r--config/feature_flags/development/deployment_approval_rules.yml8
-rw-r--r--config/feature_flags/development/diff_settings_usage_data.yml8
-rw-r--r--config/feature_flags/development/distribute_github_parallel_import.yml8
-rw-r--r--config/feature_flags/development/enforce_security_report_validation.yml8
-rw-r--r--config/feature_flags/development/enhanced_notify_css.yml2
-rw-r--r--config/feature_flags/development/env_last_deployment_by_finished_at.yml8
-rw-r--r--config/feature_flags/development/environment_multiple_stop_actions.yml8
-rw-r--r--config/feature_flags/development/fix_related_environments_for_merge_requests.yml8
-rw-r--r--config/feature_flags/development/geo_token_user_authentication.yml8
-rw-r--r--config/feature_flags/development/geo_use_clone_on_first_sync.yml8
-rw-r--r--config/feature_flags/development/gitaly_backup.yml8
-rw-r--r--config/feature_flags/development/gitaly_replace_wiki_update_page.yml8
-rw-r--r--config/feature_flags/development/group_ci_cd_analytics_page.yml8
-rw-r--r--config/feature_flags/development/group_import_export.yml8
-rw-r--r--config/feature_flags/development/group_member_inherited_group.yml8
-rw-r--r--config/feature_flags/development/group_projects_api_preload_groups.yml8
-rw-r--r--config/feature_flags/development/group_wiki_settings_toggle.yml8
-rw-r--r--config/feature_flags/development/header_read_timeout_buffered_io.yml8
-rw-r--r--config/feature_flags/development/import_project_from_remote_file.yml8
-rw-r--r--config/feature_flags/development/improved_emoji_picker.yml8
-rw-r--r--config/feature_flags/development/incident_escalations.yml2
-rw-r--r--config/feature_flags/development/incident_timeline.yml8
-rw-r--r--config/feature_flags/development/incident_timeline_event_tab.yml8
-rw-r--r--config/feature_flags/development/incremental_repository_backup.yml2
-rw-r--r--config/feature_flags/development/integration_form_sections.yml8
-rw-r--r--config/feature_flags/development/ipynb_semantic_diff.yml8
-rw-r--r--config/feature_flags/development/iteration_cadences.yml8
-rw-r--r--config/feature_flags/development/jira_connect_installation_update.yml8
-rw-r--r--config/feature_flags/development/jobs_table_vue_search.yml8
-rw-r--r--config/feature_flags/development/merge_service_ping_instrumented_metrics.yml8
-rw-r--r--config/feature_flags/development/mrc_api_use_raw_diffs_from_gitaly.yml8
-rw-r--r--config/feature_flags/development/new_dir_modal.yml8
-rw-r--r--config/feature_flags/development/new_header_search.yml2
-rw-r--r--config/feature_flags/development/new_vulnerability_form.yml2
-rw-r--r--config/feature_flags/development/nullify_in_batches_on_user_deletion.yml8
-rw-r--r--config/feature_flags/development/omniauth_initializer_fullhost_proc.yml8
-rw-r--r--config/feature_flags/development/optimized_followed_users_queries.yml8
-rw-r--r--config/feature_flags/development/pipeline_schedules_with_tags.yml8
-rw-r--r--config/feature_flags/development/pipeline_tabs_vue.yml8
-rw-r--r--config/feature_flags/development/prevent_sensitive_fields_from_serializable_hash.yml8
-rw-r--r--config/feature_flags/development/realtime_labels.yml8
-rw-r--r--config/feature_flags/development/record_projects_target_platforms.yml8
-rw-r--r--config/feature_flags/development/refactor_blob_viewer.yml2
-rw-r--r--config/feature_flags/development/releases_index_apollo_client.yml8
-rw-r--r--config/feature_flags/development/remove_import_data_on_failure.yml8
-rw-r--r--config/feature_flags/development/runner_list_group_view_vue_ui.yml2
-rw-r--r--config/feature_flags/development/sbom_survey.yml8
-rw-r--r--config/feature_flags/development/show_minute_limit_banner.yml8
-rw-r--r--config/feature_flags/development/show_report_validation_warnings.yml8
-rw-r--r--config/feature_flags/development/spread_parallel_import.yml8
-rw-r--r--config/feature_flags/development/track_editor_edit_actions.yml8
-rw-r--r--config/feature_flags/development/track_error_tracking_activity.yml8
-rw-r--r--config/feature_flags/development/uncached_mr_attention_requests_count.yml8
-rw-r--r--config/feature_flags/development/usage_data_diff_searches.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_code_review_user_gitlab_cli_api_request.yml8
-rw-r--r--config/feature_flags/development/use_api_for_payment_validation.yml8
-rw-r--r--config/feature_flags/development/use_model_load_balancing.yml8
-rw-r--r--config/feature_flags/development/user_other_role_details.yml2
-rw-r--r--config/feature_flags/development/users_expanding_widgets_usage_data.yml8
-rw-r--r--config/feature_flags/development/verify_protected_tags_for_pull_mirror.yml8
-rw-r--r--config/feature_flags/development/vsa_consistency_worker.yml4
-rw-r--r--config/feature_flags/development/vsa_reaggregation_worker.yml8
-rw-r--r--config/feature_flags/development/vue_issues_list.yml2
-rw-r--r--config/feature_flags/development/vulnerability_reads_table.yml2
-rw-r--r--config/feature_flags/development/vulnerability_report_pagination.yml2
-rw-r--r--config/feature_flags/development/wiki_switch_between_content_editor_raw_markdown.yml8
-rw-r--r--config/feature_flags/experiment/bypass_registration.yml8
-rw-r--r--config/feature_flags/experiment/invite_team_email.yml8
-rw-r--r--config/feature_flags/experiment/ios_specific_templates.yml8
-rw-r--r--config/feature_flags/experiment/new_project_sast_enabled.yml8
-rw-r--r--config/feature_flags/experiment/pql_three_cta_test.yml2
-rw-r--r--config/feature_flags/experiment/video_tutorials_continuous_onboarding.yml8
-rw-r--r--config/feature_flags/ops/api_kaminari_count_with_limit.yml8
-rw-r--r--config/feature_flags/ops/ci_secure_files_read_only.yml8
-rw-r--r--config/feature_flags/ops/execute_batched_migrations_on_schedule_ci_database.yml8
-rw-r--r--config/feature_flags/ops/global_search_users_tab.yml8
-rw-r--r--config/feature_flags/ops/purge_stale_security_findings.yml2
-rw-r--r--config/gitlab.yml.example8
-rw-r--r--config/gitlab_loose_foreign_keys.yml7
-rw-r--r--config/initializers/1_settings.rb15
-rw-r--r--config/initializers/7_prometheus_metrics.rb57
-rw-r--r--config/initializers/gitlab_experiment.rb2
-rw-r--r--config/initializers/graphql.rb5
-rw-r--r--config/initializers/load_balancing.rb15
-rw-r--r--config/initializers/multi_json.rb2
-rw-r--r--config/initializers/omniauth.rb10
-rw-r--r--config/initializers_before_autoloader/004_zeitwerk.rb1
-rw-r--r--config/metrics/aggregates/code_review.yml2
-rw-r--r--config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175055_merge_requests.yml3
-rw-r--r--config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml2
-rw-r--r--config/metrics/counts_28d/20210216181057_projects_with_packages.yml2
-rwxr-xr-x[-rw-r--r--]config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml3
-rw-r--r--config/metrics/counts_28d/20220307150912_p_ci_templates_database_liquibase_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20220310184327_p_ci_templates_matlab_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20220322194931_users_gitlab_cli_api_request_monthly.yml26
-rw-r--r--config/metrics/counts_28d/20220407125907_p_ci_templates_themekit_monthly.yml25
-rwxr-xr-x[-rw-r--r--]config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml3
-rw-r--r--config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml3
-rw-r--r--config/metrics/counts_7d/20220307150854_p_ci_templates_database_liquibase_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20220310184320_p_ci_templates_matlab_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20220322194922_users_gitlab_cli_api_request_weekly.yml26
-rw-r--r--config/metrics/counts_7d/20220407125901_p_ci_templates_themekit_weekly.yml25
-rw-r--r--config/metrics/counts_all/20210216175045_merge_requests.yml3
-rw-r--r--config/routes.rb6
-rw-r--r--config/routes/admin.rb3
-rw-r--r--config/routes/group.rb4
-rw-r--r--config/routes/import.rb2
-rw-r--r--config/routes/project.rb2
-rw-r--r--config/routes/uploads.rb6
-rw-r--r--config/sidekiq_queues.yml6
-rw-r--r--config/webpack.config.js9
-rw-r--r--config/webpack.vendor.config.js1
-rw-r--r--danger/Dangerfile-bundle_size41
-rw-r--r--danger/bundle_size/Dangerfile40
-rw-r--r--danger/ci_templates/Dangerfile2
-rw-r--r--danger/database/Dangerfile4
-rw-r--r--danger/feature_flag/Dangerfile8
-rw-r--r--danger/product_intelligence/Dangerfile21
-rw-r--r--danger/specialization_labels/Dangerfile4
-rw-r--r--danger/specs/Dangerfile2
-rw-r--r--danger/z_metadata/Dangerfile10
-rw-r--r--data/deprecations/14-0-nfs-fot-git-repository-storage.yml11
-rw-r--r--data/deprecations/14-10-deprecate-toggle-notes-confidentiality.yml9
-rw-r--r--data/deprecations/14-10-manual-iteration-management.yml34
-rw-r--r--data/deprecations/14-10-old-search-migration-removal.yml12
-rw-r--r--data/deprecations/14-5-runner-api-status-does-contain-paused.yml6
-rw-r--r--data/deprecations/14-8-ci-build-variables.yml21
-rw-r--r--data/deprecations/14-8-compliance-status-check-api-field.yml6
-rw-r--r--data/deprecations/14-8-nfs_support.yml28
-rw-r--r--data/deprecations/14-9-deprecate-debian-9.yml2
-rw-r--r--data/deprecations/14-9-system_monitoring.yml8
-rw-r--r--data/deprecations/15-0-deprecate-monitor-metrics.yml4
-rw-r--r--data/deprecations/templates/_deprecation_template.md.erb6
-rw-r--r--db/docs/abuse_reports.yml9
-rw-r--r--db/docs/agent_activity_events.yml9
-rw-r--r--db/docs/agent_group_authorizations.yml9
-rw-r--r--db/docs/agent_project_authorizations.yml9
-rw-r--r--db/docs/alert_management_alert_assignees.yml9
-rw-r--r--db/docs/alert_management_alert_metric_images.yml9
-rw-r--r--db/docs/alert_management_alert_user_mentions.yml9
-rw-r--r--db/docs/alert_management_alerts.yml9
-rw-r--r--db/docs/alert_management_http_integrations.yml9
-rw-r--r--db/docs/allowed_email_domains.yml9
-rw-r--r--db/docs/analytics_cycle_analytics_aggregations.yml9
-rw-r--r--db/docs/analytics_cycle_analytics_group_stages.yml9
-rw-r--r--db/docs/analytics_cycle_analytics_group_value_streams.yml9
-rw-r--r--db/docs/analytics_cycle_analytics_issue_stage_events.yml9
-rw-r--r--db/docs/analytics_cycle_analytics_merge_request_stage_events.yml9
-rw-r--r--db/docs/analytics_cycle_analytics_project_stages.yml9
-rw-r--r--db/docs/analytics_cycle_analytics_project_value_streams.yml9
-rw-r--r--db/docs/analytics_cycle_analytics_stage_event_hashes.yml9
-rw-r--r--db/docs/analytics_devops_adoption_segments.yml9
-rw-r--r--db/docs/analytics_devops_adoption_snapshots.yml9
-rw-r--r--db/docs/analytics_language_trend_repository_languages.yml9
-rw-r--r--db/docs/analytics_usage_trends_measurements.yml9
-rw-r--r--db/docs/appearances.yml9
-rw-r--r--db/docs/application_setting_terms.yml9
-rw-r--r--db/docs/application_settings.yml14
-rw-r--r--db/docs/approval_merge_request_rule_sources.yml9
-rw-r--r--db/docs/approval_merge_request_rules.yml9
-rw-r--r--db/docs/approval_merge_request_rules_approved_approvers.yml8
-rw-r--r--db/docs/approval_merge_request_rules_groups.yml8
-rw-r--r--db/docs/approval_merge_request_rules_users.yml8
-rw-r--r--db/docs/approval_project_rules.yml9
-rw-r--r--db/docs/approval_project_rules_groups.yml8
-rw-r--r--db/docs/approval_project_rules_protected_branches.yml9
-rw-r--r--db/docs/approval_project_rules_users.yml8
-rw-r--r--db/docs/approvals.yml9
-rw-r--r--db/docs/approver_groups.yml9
-rw-r--r--db/docs/approvers.yml9
-rw-r--r--db/docs/ar_internal_metadata.yml8
-rw-r--r--db/docs/atlassian_identities.yml9
-rw-r--r--db/docs/audit_events.yml9
-rw-r--r--db/docs/audit_events_external_audit_event_destinations.yml9
-rw-r--r--db/docs/authentication_events.yml9
-rw-r--r--db/docs/award_emoji.yml9
-rw-r--r--db/docs/aws_roles.yml9
-rw-r--r--db/docs/background_migration_jobs.yml9
-rw-r--r--db/docs/badges.yml11
-rw-r--r--db/docs/banned_users.yml9
-rw-r--r--db/docs/batched_background_migration_job_transition_logs.yml9
-rw-r--r--db/docs/batched_background_migration_jobs.yml9
-rw-r--r--db/docs/batched_background_migrations.yml9
-rw-r--r--db/docs/board_assignees.yml9
-rw-r--r--db/docs/board_group_recent_visits.yml9
-rw-r--r--db/docs/board_labels.yml9
-rw-r--r--db/docs/board_project_recent_visits.yml9
-rw-r--r--db/docs/board_user_preferences.yml9
-rw-r--r--db/docs/boards.yml9
-rw-r--r--db/docs/boards_epic_board_labels.yml9
-rw-r--r--db/docs/boards_epic_board_positions.yml9
-rw-r--r--db/docs/boards_epic_board_recent_visits.yml9
-rw-r--r--db/docs/boards_epic_boards.yml9
-rw-r--r--db/docs/boards_epic_list_user_preferences.yml9
-rw-r--r--db/docs/boards_epic_lists.yml9
-rw-r--r--db/docs/boards_epic_user_preferences.yml9
-rw-r--r--db/docs/broadcast_messages.yml9
-rw-r--r--db/docs/bulk_import_configurations.yml9
-rw-r--r--db/docs/bulk_import_entities.yml9
-rw-r--r--db/docs/bulk_import_export_uploads.yml9
-rw-r--r--db/docs/bulk_import_exports.yml9
-rw-r--r--db/docs/bulk_import_failures.yml9
-rw-r--r--db/docs/bulk_import_trackers.yml9
-rw-r--r--db/docs/bulk_imports.yml9
-rw-r--r--db/docs/chat_names.yml9
-rw-r--r--db/docs/chat_teams.yml9
-rw-r--r--db/docs/ci_build_needs.yml9
-rw-r--r--db/docs/ci_build_pending_states.yml9
-rw-r--r--db/docs/ci_build_report_results.yml9
-rw-r--r--db/docs/ci_build_trace_chunks.yml9
-rw-r--r--db/docs/ci_build_trace_metadata.yml9
-rw-r--r--db/docs/ci_builds.yml13
-rw-r--r--db/docs/ci_builds_metadata.yml9
-rw-r--r--db/docs/ci_builds_runner_session.yml9
-rw-r--r--db/docs/ci_daily_build_group_report_results.yml9
-rw-r--r--db/docs/ci_deleted_objects.yml9
-rw-r--r--db/docs/ci_freeze_periods.yml9
-rw-r--r--db/docs/ci_group_variables.yml9
-rw-r--r--db/docs/ci_instance_variables.yml9
-rw-r--r--db/docs/ci_job_artifact_states.yml9
-rw-r--r--db/docs/ci_job_artifacts.yml10
-rw-r--r--db/docs/ci_job_token_project_scope_links.yml9
-rw-r--r--db/docs/ci_job_variables.yml9
-rw-r--r--db/docs/ci_minutes_additional_packs.yml9
-rw-r--r--db/docs/ci_namespace_mirrors.yml9
-rw-r--r--db/docs/ci_namespace_monthly_usages.yml9
-rw-r--r--db/docs/ci_pending_builds.yml9
-rw-r--r--db/docs/ci_pipeline_artifacts.yml9
-rw-r--r--db/docs/ci_pipeline_chat_data.yml9
-rw-r--r--db/docs/ci_pipeline_messages.yml9
-rw-r--r--db/docs/ci_pipeline_schedule_variables.yml9
-rw-r--r--db/docs/ci_pipeline_schedules.yml9
-rw-r--r--db/docs/ci_pipeline_variables.yml9
-rw-r--r--db/docs/ci_pipelines.yml9
-rw-r--r--db/docs/ci_pipelines_config.yml9
-rw-r--r--db/docs/ci_platform_metrics.yml9
-rw-r--r--db/docs/ci_project_mirrors.yml9
-rw-r--r--db/docs/ci_project_monthly_usages.yml9
-rw-r--r--db/docs/ci_refs.yml9
-rw-r--r--db/docs/ci_resource_groups.yml9
-rw-r--r--db/docs/ci_resources.yml9
-rw-r--r--db/docs/ci_runner_namespaces.yml9
-rw-r--r--db/docs/ci_runner_projects.yml9
-rw-r--r--db/docs/ci_runners.yml9
-rw-r--r--db/docs/ci_running_builds.yml9
-rw-r--r--db/docs/ci_secure_files.yml9
-rw-r--r--db/docs/ci_sources_pipelines.yml9
-rw-r--r--db/docs/ci_sources_projects.yml9
-rw-r--r--db/docs/ci_stages.yml9
-rw-r--r--db/docs/ci_subscriptions_projects.yml9
-rw-r--r--db/docs/ci_trigger_requests.yml9
-rw-r--r--db/docs/ci_triggers.yml9
-rw-r--r--db/docs/ci_unit_test_failures.yml9
-rw-r--r--db/docs/ci_unit_tests.yml9
-rw-r--r--db/docs/ci_variables.yml9
-rw-r--r--db/docs/cluster_agent_tokens.yml9
-rw-r--r--db/docs/cluster_agents.yml9
-rw-r--r--db/docs/cluster_groups.yml9
-rw-r--r--db/docs/cluster_platforms_kubernetes.yml9
-rw-r--r--db/docs/cluster_projects.yml9
-rw-r--r--db/docs/cluster_providers_aws.yml9
-rw-r--r--db/docs/cluster_providers_gcp.yml9
-rw-r--r--db/docs/clusters.yml9
-rw-r--r--db/docs/clusters_applications_cert_managers.yml9
-rw-r--r--db/docs/clusters_applications_cilium.yml9
-rw-r--r--db/docs/clusters_applications_crossplane.yml9
-rw-r--r--db/docs/clusters_applications_elastic_stacks.yml9
-rw-r--r--db/docs/clusters_applications_helm.yml9
-rw-r--r--db/docs/clusters_applications_ingress.yml9
-rw-r--r--db/docs/clusters_applications_jupyter.yml9
-rw-r--r--db/docs/clusters_applications_knative.yml9
-rw-r--r--db/docs/clusters_applications_prometheus.yml9
-rw-r--r--db/docs/clusters_applications_runners.yml9
-rw-r--r--db/docs/clusters_integration_elasticstack.yml9
-rw-r--r--db/docs/clusters_integration_prometheus.yml9
-rw-r--r--db/docs/clusters_kubernetes_namespaces.yml9
-rw-r--r--db/docs/commit_user_mentions.yml9
-rw-r--r--db/docs/compliance_management_frameworks.yml9
-rw-r--r--db/docs/container_expiration_policies.yml9
-rw-r--r--db/docs/container_repositories.yml9
-rw-r--r--db/docs/content_blocked_states.yml8
-rw-r--r--db/docs/conversational_development_index_metrics.yml9
-rw-r--r--db/docs/coverage_fuzzing_corpuses.yml9
-rw-r--r--db/docs/csv_issue_imports.yml9
-rw-r--r--db/docs/custom_emoji.yml9
-rw-r--r--db/docs/customer_relations_contacts.yml9
-rw-r--r--db/docs/customer_relations_organizations.yml9
-rw-r--r--db/docs/dast_profile_schedules.yml9
-rw-r--r--db/docs/dast_profiles.yml9
-rw-r--r--db/docs/dast_profiles_pipelines.yml9
-rw-r--r--db/docs/dast_scanner_profiles.yml9
-rw-r--r--db/docs/dast_scanner_profiles_builds.yml9
-rw-r--r--db/docs/dast_site_profile_secret_variables.yml9
-rw-r--r--db/docs/dast_site_profiles.yml9
-rw-r--r--db/docs/dast_site_profiles_builds.yml9
-rw-r--r--db/docs/dast_site_profiles_pipelines.yml8
-rw-r--r--db/docs/dast_site_tokens.yml9
-rw-r--r--db/docs/dast_site_validations.yml9
-rw-r--r--db/docs/dast_sites.yml9
-rw-r--r--db/docs/dependency_proxy_blobs.yml9
-rw-r--r--db/docs/dependency_proxy_group_settings.yml9
-rw-r--r--db/docs/dependency_proxy_image_ttl_group_policies.yml9
-rw-r--r--db/docs/dependency_proxy_manifests.yml9
-rw-r--r--db/docs/deploy_keys_projects.yml9
-rw-r--r--db/docs/deploy_tokens.yml9
-rw-r--r--db/docs/deployment_approvals.yml9
-rw-r--r--db/docs/deployment_clusters.yml9
-rw-r--r--db/docs/deployment_merge_requests.yml9
-rw-r--r--db/docs/deployments.yml9
-rw-r--r--db/docs/description_versions.yml9
-rw-r--r--db/docs/design_management_designs.yml9
-rw-r--r--db/docs/design_management_designs_versions.yml9
-rw-r--r--db/docs/design_management_versions.yml9
-rw-r--r--db/docs/design_user_mentions.yml9
-rw-r--r--db/docs/detached_partitions.yml17
-rw-r--r--db/docs/diff_note_positions.yml9
-rw-r--r--db/docs/dora_daily_metrics.yml9
-rw-r--r--db/docs/draft_notes.yml11
-rw-r--r--db/docs/elastic_index_settings.yml9
-rw-r--r--db/docs/elastic_reindexing_slices.yml9
-rw-r--r--db/docs/elastic_reindexing_subtasks.yml9
-rw-r--r--db/docs/elastic_reindexing_tasks.yml9
-rw-r--r--db/docs/elasticsearch_indexed_namespaces.yml9
-rw-r--r--db/docs/elasticsearch_indexed_projects.yml9
-rw-r--r--db/docs/emails.yml9
-rw-r--r--db/docs/environments.yml9
-rw-r--r--db/docs/epic_issues.yml9
-rw-r--r--db/docs/epic_metrics.yml9
-rw-r--r--db/docs/epic_user_mentions.yml9
-rw-r--r--db/docs/epics.yml9
-rw-r--r--db/docs/error_tracking_client_keys.yml9
-rw-r--r--db/docs/error_tracking_error_events.yml9
-rw-r--r--db/docs/error_tracking_errors.yml9
-rw-r--r--db/docs/events.yml10
-rw-r--r--db/docs/evidences.yml9
-rw-r--r--db/docs/experiment_subjects.yml9
-rw-r--r--db/docs/experiment_users.yml9
-rw-r--r--db/docs/experiments.yml9
-rw-r--r--db/docs/external_approval_rules.yml8
-rw-r--r--db/docs/external_approval_rules_protected_branches.yml8
-rw-r--r--db/docs/external_pull_requests.yml9
-rw-r--r--db/docs/external_status_checks.yml9
-rw-r--r--db/docs/external_status_checks_protected_branches.yml8
-rw-r--r--db/docs/feature_gates.yml10
-rw-r--r--db/docs/features.yml10
-rw-r--r--db/docs/fork_network_members.yml9
-rw-r--r--db/docs/fork_networks.yml9
-rw-r--r--db/docs/geo_cache_invalidation_events.yml9
-rw-r--r--db/docs/geo_container_repository_updated_events.yml9
-rw-r--r--db/docs/geo_event_log.yml9
-rw-r--r--db/docs/geo_events.yml9
-rw-r--r--db/docs/geo_hashed_storage_attachments_events.yml9
-rw-r--r--db/docs/geo_hashed_storage_migrated_events.yml9
-rw-r--r--db/docs/geo_job_artifact_deleted_events.yml9
-rw-r--r--db/docs/geo_lfs_object_deleted_events.yml8
-rw-r--r--db/docs/geo_node_namespace_links.yml9
-rw-r--r--db/docs/geo_node_statuses.yml9
-rw-r--r--db/docs/geo_nodes.yml9
-rw-r--r--db/docs/geo_repositories_changed_events.yml9
-rw-r--r--db/docs/geo_repository_created_events.yml9
-rw-r--r--db/docs/geo_repository_deleted_events.yml9
-rw-r--r--db/docs/geo_repository_renamed_events.yml9
-rw-r--r--db/docs/geo_repository_updated_events.yml9
-rw-r--r--db/docs/geo_reset_checksum_events.yml9
-rw-r--r--db/docs/gitlab_subscription_histories.yml9
-rw-r--r--db/docs/gitlab_subscriptions.yml9
-rw-r--r--db/docs/gpg_key_subkeys.yml9
-rw-r--r--db/docs/gpg_keys.yml9
-rw-r--r--db/docs/gpg_signatures.yml9
-rw-r--r--db/docs/grafana_integrations.yml9
-rw-r--r--db/docs/group_crm_settings.yml9
-rw-r--r--db/docs/group_custom_attributes.yml9
-rw-r--r--db/docs/group_deletion_schedules.yml9
-rw-r--r--db/docs/group_deploy_keys.yml9
-rw-r--r--db/docs/group_deploy_keys_groups.yml9
-rw-r--r--db/docs/group_deploy_tokens.yml9
-rw-r--r--db/docs/group_group_links.yml9
-rw-r--r--db/docs/group_import_states.yml9
-rw-r--r--db/docs/group_merge_request_approval_settings.yml9
-rw-r--r--db/docs/group_repository_storage_moves.yml9
-rw-r--r--db/docs/group_wiki_repositories.yml9
-rw-r--r--db/docs/historical_data.yml9
-rw-r--r--db/docs/identities.yml9
-rw-r--r--db/docs/import_export_uploads.yml9
-rw-r--r--db/docs/import_failures.yml9
-rw-r--r--db/docs/in_product_marketing_emails.yml9
-rw-r--r--db/docs/incident_management_escalation_policies.yml9
-rw-r--r--db/docs/incident_management_escalation_rules.yml9
-rw-r--r--db/docs/incident_management_issuable_escalation_statuses.yml9
-rw-r--r--db/docs/incident_management_oncall_participants.yml9
-rw-r--r--db/docs/incident_management_oncall_rotations.yml9
-rw-r--r--db/docs/incident_management_oncall_schedules.yml9
-rw-r--r--db/docs/incident_management_oncall_shifts.yml9
-rw-r--r--db/docs/incident_management_pending_alert_escalations.yml9
-rw-r--r--db/docs/incident_management_pending_issue_escalations.yml9
-rw-r--r--db/docs/incident_management_timeline_events.yml9
-rw-r--r--db/docs/index_statuses.yml9
-rw-r--r--db/docs/insights.yml9
-rw-r--r--db/docs/integrations.yml55
-rw-r--r--db/docs/internal_ids.yml10
-rw-r--r--db/docs/ip_restrictions.yml9
-rw-r--r--db/docs/issuable_metric_images.yml9
-rw-r--r--db/docs/issuable_severities.yml9
-rw-r--r--db/docs/issuable_slas.yml9
-rw-r--r--db/docs/issue_assignees.yml9
-rw-r--r--db/docs/issue_customer_relations_contacts.yml9
-rw-r--r--db/docs/issue_email_participants.yml9
-rw-r--r--db/docs/issue_emails.yml9
-rw-r--r--db/docs/issue_links.yml9
-rw-r--r--db/docs/issue_metrics.yml9
-rw-r--r--db/docs/issue_search_data.yml9
-rw-r--r--db/docs/issue_tracker_data.yml9
-rw-r--r--db/docs/issue_user_mentions.yml9
-rw-r--r--db/docs/issues.yml10
-rw-r--r--db/docs/issues_prometheus_alert_events.yml8
-rw-r--r--db/docs/issues_self_managed_prometheus_alert_events.yml8
-rw-r--r--db/docs/iterations_cadences.yml9
-rw-r--r--db/docs/jira_connect_installations.yml9
-rw-r--r--db/docs/jira_connect_subscriptions.yml9
-rw-r--r--db/docs/jira_imports.yml9
-rw-r--r--db/docs/jira_tracker_data.yml9
-rw-r--r--db/docs/keys.yml11
-rw-r--r--db/docs/label_links.yml9
-rw-r--r--db/docs/label_priorities.yml9
-rw-r--r--db/docs/labels.yml11
-rw-r--r--db/docs/ldap_group_links.yml9
-rw-r--r--db/docs/lfs_file_locks.yml9
-rw-r--r--db/docs/lfs_object_states.yml9
-rw-r--r--db/docs/lfs_objects.yml9
-rw-r--r--db/docs/lfs_objects_projects.yml10
-rw-r--r--db/docs/licenses.yml9
-rw-r--r--db/docs/list_user_preferences.yml9
-rw-r--r--db/docs/lists.yml9
-rw-r--r--db/docs/loose_foreign_keys_deleted_records.yml9
-rw-r--r--db/docs/member_tasks.yml9
-rw-r--r--db/docs/members.yml13
-rw-r--r--db/docs/merge_request_assignees.yml9
-rw-r--r--db/docs/merge_request_blocks.yml9
-rw-r--r--db/docs/merge_request_cleanup_schedules.yml9
-rw-r--r--db/docs/merge_request_context_commit_diff_files.yml9
-rw-r--r--db/docs/merge_request_context_commits.yml9
-rw-r--r--db/docs/merge_request_diff_commit_users.yml9
-rw-r--r--db/docs/merge_request_diff_commits.yml9
-rw-r--r--db/docs/merge_request_diff_details.yml9
-rw-r--r--db/docs/merge_request_diff_files.yml9
-rw-r--r--db/docs/merge_request_diffs.yml9
-rw-r--r--db/docs/merge_request_metrics.yml10
-rw-r--r--db/docs/merge_request_reviewers.yml9
-rw-r--r--db/docs/merge_request_user_mentions.yml9
-rw-r--r--db/docs/merge_requests.yml9
-rw-r--r--db/docs/merge_requests_closing_issues.yml9
-rw-r--r--db/docs/merge_requests_compliance_violations.yml9
-rw-r--r--db/docs/merge_trains.yml9
-rw-r--r--db/docs/metrics_dashboard_annotations.yml9
-rw-r--r--db/docs/metrics_users_starred_dashboards.yml9
-rw-r--r--db/docs/milestone_releases.yml9
-rw-r--r--db/docs/milestones.yml9
-rw-r--r--db/docs/namespace_admin_notes.yml9
-rw-r--r--db/docs/namespace_aggregation_schedules.yml9
-rw-r--r--db/docs/namespace_limits.yml9
-rw-r--r--db/docs/namespace_package_settings.yml9
-rw-r--r--db/docs/namespace_root_storage_statistics.yml9
-rw-r--r--db/docs/namespace_settings.yml9
-rw-r--r--db/docs/namespace_statistics.yml9
-rw-r--r--db/docs/namespaces.yml12
-rw-r--r--db/docs/namespaces_sync_events.yml9
-rw-r--r--db/docs/note_diff_files.yml9
-rw-r--r--db/docs/notes.yml18
-rw-r--r--db/docs/notification_settings.yml9
-rw-r--r--db/docs/oauth_access_grants.yml10
-rw-r--r--db/docs/oauth_access_tokens.yml10
-rw-r--r--db/docs/oauth_applications.yml9
-rw-r--r--db/docs/oauth_openid_requests.yml9
-rw-r--r--db/docs/onboarding_progresses.yml9
-rw-r--r--db/docs/operations_feature_flag_scopes.yml8
-rw-r--r--db/docs/operations_feature_flags.yml9
-rw-r--r--db/docs/operations_feature_flags_clients.yml9
-rw-r--r--db/docs/operations_feature_flags_issues.yml9
-rw-r--r--db/docs/operations_scopes.yml9
-rw-r--r--db/docs/operations_strategies.yml9
-rw-r--r--db/docs/operations_strategies_user_lists.yml9
-rw-r--r--db/docs/operations_user_lists.yml9
-rw-r--r--db/docs/packages_build_infos.yml9
-rw-r--r--db/docs/packages_composer_cache_files.yml9
-rw-r--r--db/docs/packages_composer_metadata.yml9
-rw-r--r--db/docs/packages_conan_file_metadata.yml9
-rw-r--r--db/docs/packages_conan_metadata.yml9
-rw-r--r--db/docs/packages_debian_file_metadata.yml9
-rw-r--r--db/docs/packages_debian_group_architectures.yml9
-rw-r--r--db/docs/packages_debian_group_component_files.yml9
-rw-r--r--db/docs/packages_debian_group_components.yml9
-rw-r--r--db/docs/packages_debian_group_distribution_keys.yml9
-rw-r--r--db/docs/packages_debian_group_distributions.yml9
-rw-r--r--db/docs/packages_debian_project_architectures.yml9
-rw-r--r--db/docs/packages_debian_project_component_files.yml9
-rw-r--r--db/docs/packages_debian_project_components.yml9
-rw-r--r--db/docs/packages_debian_project_distribution_keys.yml9
-rw-r--r--db/docs/packages_debian_project_distributions.yml9
-rw-r--r--db/docs/packages_debian_publications.yml9
-rw-r--r--db/docs/packages_dependencies.yml9
-rw-r--r--db/docs/packages_dependency_links.yml9
-rw-r--r--db/docs/packages_events.yml9
-rw-r--r--db/docs/packages_helm_file_metadata.yml9
-rw-r--r--db/docs/packages_maven_metadata.yml9
-rw-r--r--db/docs/packages_npm_metadata.yml9
-rw-r--r--db/docs/packages_nuget_dependency_link_metadata.yml9
-rw-r--r--db/docs/packages_nuget_metadata.yml9
-rw-r--r--db/docs/packages_package_file_build_infos.yml9
-rw-r--r--db/docs/packages_package_files.yml9
-rw-r--r--db/docs/packages_packages.yml9
-rw-r--r--db/docs/packages_pypi_metadata.yml9
-rw-r--r--db/docs/packages_rubygems_metadata.yml9
-rw-r--r--db/docs/packages_tags.yml9
-rw-r--r--db/docs/pages_deployment_states.yml9
-rw-r--r--db/docs/pages_deployments.yml9
-rw-r--r--db/docs/pages_domain_acme_orders.yml9
-rw-r--r--db/docs/pages_domains.yml9
-rw-r--r--db/docs/path_locks.yml9
-rw-r--r--db/docs/personal_access_tokens.yml9
-rw-r--r--db/docs/plan_limits.yml9
-rw-r--r--db/docs/plans.yml9
-rw-r--r--db/docs/pool_repositories.yml9
-rw-r--r--db/docs/postgres_async_indexes.yml11
-rw-r--r--db/docs/postgres_reindex_actions.yml12
-rw-r--r--db/docs/postgres_reindex_queued_actions.yml11
-rw-r--r--db/docs/product_analytics_events_experimental.yml9
-rw-r--r--db/docs/programming_languages.yml9
-rw-r--r--db/docs/project_access_tokens.yml8
-rw-r--r--db/docs/project_alerting_settings.yml9
-rw-r--r--db/docs/project_aliases.yml9
-rw-r--r--db/docs/project_authorizations.yml9
-rw-r--r--db/docs/project_auto_devops.yml9
-rw-r--r--db/docs/project_ci_cd_settings.yml9
-rw-r--r--db/docs/project_ci_feature_usages.yml10
-rw-r--r--db/docs/project_compliance_framework_settings.yml9
-rw-r--r--db/docs/project_custom_attributes.yml9
-rw-r--r--db/docs/project_daily_statistics.yml9
-rw-r--r--db/docs/project_deploy_tokens.yml9
-rw-r--r--db/docs/project_error_tracking_settings.yml9
-rw-r--r--db/docs/project_export_jobs.yml9
-rw-r--r--db/docs/project_feature_usages.yml9
-rw-r--r--db/docs/project_features.yml9
-rw-r--r--db/docs/project_group_links.yml9
-rw-r--r--db/docs/project_import_data.yml9
-rw-r--r--db/docs/project_incident_management_settings.yml9
-rw-r--r--db/docs/project_metrics_settings.yml9
-rw-r--r--db/docs/project_mirror_data.yml9
-rw-r--r--db/docs/project_pages_metadata.yml9
-rw-r--r--db/docs/project_repositories.yml9
-rw-r--r--db/docs/project_repository_states.yml9
-rw-r--r--db/docs/project_repository_storage_moves.yml9
-rw-r--r--db/docs/project_security_settings.yml9
-rw-r--r--db/docs/project_settings.yml9
-rw-r--r--db/docs/project_statistics.yml9
-rw-r--r--db/docs/project_topics.yml9
-rw-r--r--db/docs/project_tracing_settings.yml9
-rw-r--r--db/docs/projects.yml9
-rw-r--r--db/docs/projects_sync_events.yml9
-rw-r--r--db/docs/prometheus_alert_events.yml9
-rw-r--r--db/docs/prometheus_alerts.yml9
-rw-r--r--db/docs/prometheus_metrics.yml9
-rw-r--r--db/docs/protected_branch_merge_access_levels.yml9
-rw-r--r--db/docs/protected_branch_push_access_levels.yml9
-rw-r--r--db/docs/protected_branch_unprotect_access_levels.yml9
-rw-r--r--db/docs/protected_branches.yml10
-rw-r--r--db/docs/protected_environment_deploy_access_levels.yml9
-rw-r--r--db/docs/protected_environments.yml9
-rw-r--r--db/docs/protected_tag_create_access_levels.yml9
-rw-r--r--db/docs/protected_tags.yml9
-rw-r--r--db/docs/push_event_payloads.yml9
-rw-r--r--db/docs/push_rules.yml9
-rw-r--r--db/docs/raw_usage_data.yml9
-rw-r--r--db/docs/redirect_routes.yml10
-rw-r--r--db/docs/related_epic_links.yml9
-rw-r--r--db/docs/release_links.yml9
-rw-r--r--db/docs/releases.yml9
-rw-r--r--db/docs/remote_mirrors.yml9
-rw-r--r--db/docs/repository_languages.yml9
-rw-r--r--db/docs/required_code_owners_sections.yml9
-rw-r--r--db/docs/requirements.yml9
-rw-r--r--db/docs/requirements_management_test_reports.yml9
-rw-r--r--db/docs/resource_iteration_events.yml9
-rw-r--r--db/docs/resource_label_events.yml9
-rw-r--r--db/docs/resource_milestone_events.yml9
-rw-r--r--db/docs/resource_state_events.yml9
-rw-r--r--db/docs/resource_weight_events.yml9
-rw-r--r--db/docs/reviews.yml9
-rw-r--r--db/docs/routes.yml11
-rw-r--r--db/docs/saml_group_links.yml9
-rw-r--r--db/docs/saml_providers.yml9
-rw-r--r--db/docs/saved_replies.yml9
-rw-r--r--db/docs/schema_migrations.yml10
-rw-r--r--db/docs/scim_identities.yml9
-rw-r--r--db/docs/scim_oauth_access_tokens.yml9
-rw-r--r--db/docs/security_findings.yml9
-rw-r--r--db/docs/security_orchestration_policy_configurations.yml9
-rw-r--r--db/docs/security_orchestration_policy_rule_schedules.yml9
-rw-r--r--db/docs/security_scans.yml9
-rw-r--r--db/docs/security_training_providers.yml9
-rw-r--r--db/docs/security_trainings.yml9
-rw-r--r--db/docs/self_managed_prometheus_alert_events.yml9
-rw-r--r--db/docs/sent_notifications.yml9
-rw-r--r--db/docs/sentry_issues.yml9
-rw-r--r--db/docs/serverless_domain_cluster.yml9
-rw-r--r--db/docs/service_desk_settings.yml9
-rw-r--r--db/docs/shards.yml9
-rw-r--r--db/docs/slack_integrations.yml9
-rw-r--r--db/docs/smartcard_identities.yml9
-rw-r--r--db/docs/snippet_repositories.yml9
-rw-r--r--db/docs/snippet_repository_storage_moves.yml9
-rw-r--r--db/docs/snippet_statistics.yml9
-rw-r--r--db/docs/snippet_user_mentions.yml9
-rw-r--r--db/docs/snippets.yml11
-rw-r--r--db/docs/software_license_policies.yml9
-rw-r--r--db/docs/software_licenses.yml9
-rw-r--r--db/docs/spam_logs.yml9
-rw-r--r--db/docs/sprints.yml9
-rw-r--r--db/docs/status_check_responses.yml9
-rw-r--r--db/docs/status_page_published_incidents.yml9
-rw-r--r--db/docs/status_page_settings.yml9
-rw-r--r--db/docs/subscriptions.yml9
-rw-r--r--db/docs/suggestions.yml9
-rw-r--r--db/docs/system_note_metadata.yml9
-rw-r--r--db/docs/taggings.yml9
-rw-r--r--db/docs/tags.yml9
-rw-r--r--db/docs/term_agreements.yml9
-rw-r--r--db/docs/terraform_state_versions.yml9
-rw-r--r--db/docs/terraform_states.yml9
-rw-r--r--db/docs/timelogs.yml9
-rw-r--r--db/docs/todos.yml9
-rw-r--r--db/docs/token_with_ivs.yml9
-rw-r--r--db/docs/topics.yml9
-rw-r--r--db/docs/trending_projects.yml9
-rw-r--r--db/docs/u2f_registrations.yml9
-rw-r--r--db/docs/upcoming_reconciliations.yml9
-rw-r--r--db/docs/upload_states.yml9
-rw-r--r--db/docs/uploads.yml9
-rw-r--r--db/docs/user_agent_details.yml9
-rw-r--r--db/docs/user_callouts.yml9
-rw-r--r--db/docs/user_canonical_emails.yml9
-rw-r--r--db/docs/user_credit_card_validations.yml9
-rw-r--r--db/docs/user_custom_attributes.yml9
-rw-r--r--db/docs/user_details.yml9
-rw-r--r--db/docs/user_follow_users.yml9
-rw-r--r--db/docs/user_group_callouts.yml9
-rw-r--r--db/docs/user_highest_roles.yml9
-rw-r--r--db/docs/user_interacted_projects.yml9
-rw-r--r--db/docs/user_permission_export_uploads.yml9
-rw-r--r--db/docs/user_preferences.yml9
-rw-r--r--db/docs/user_statuses.yml9
-rw-r--r--db/docs/user_synced_attributes_metadata.yml9
-rw-r--r--db/docs/users.yml11
-rw-r--r--db/docs/users_ops_dashboard_projects.yml9
-rw-r--r--db/docs/users_security_dashboard_projects.yml9
-rw-r--r--db/docs/users_star_projects.yml9
-rw-r--r--db/docs/users_statistics.yml9
-rw-r--r--db/docs/verification_codes.yml8
-rw-r--r--db/docs/vulnerabilities.yml9
-rw-r--r--db/docs/vulnerability_exports.yml9
-rw-r--r--db/docs/vulnerability_external_issue_links.yml9
-rw-r--r--db/docs/vulnerability_feedback.yml9
-rw-r--r--db/docs/vulnerability_finding_evidences.yml9
-rw-r--r--db/docs/vulnerability_finding_links.yml9
-rw-r--r--db/docs/vulnerability_finding_signatures.yml9
-rw-r--r--db/docs/vulnerability_findings_remediations.yml9
-rw-r--r--db/docs/vulnerability_flags.yml9
-rw-r--r--db/docs/vulnerability_historical_statistics.yml9
-rw-r--r--db/docs/vulnerability_identifiers.yml9
-rw-r--r--db/docs/vulnerability_issue_links.yml9
-rw-r--r--db/docs/vulnerability_occurrence_identifiers.yml9
-rw-r--r--db/docs/vulnerability_occurrence_pipelines.yml9
-rw-r--r--db/docs/vulnerability_occurrences.yml9
-rw-r--r--db/docs/vulnerability_reads.yml9
-rw-r--r--db/docs/vulnerability_remediations.yml9
-rw-r--r--db/docs/vulnerability_scanners.yml9
-rw-r--r--db/docs/vulnerability_statistics.yml9
-rw-r--r--db/docs/vulnerability_user_mentions.yml9
-rw-r--r--db/docs/web_hook_logs.yml9
-rw-r--r--db/docs/web_hooks.yml13
-rw-r--r--db/docs/webauthn_registrations.yml9
-rw-r--r--db/docs/wiki_page_meta.yml9
-rw-r--r--db/docs/wiki_page_slugs.yml9
-rw-r--r--db/docs/work_item_types.yml9
-rw-r--r--db/docs/x509_certificates.yml9
-rw-r--r--db/docs/x509_commit_signatures.yml9
-rw-r--r--db/docs/x509_issuers.yml9
-rw-r--r--db/docs/zentao_tracker_data.yml9
-rw-r--r--db/docs/zoom_meetings.yml9
-rw-r--r--db/fixtures/development/02_users.rb110
-rw-r--r--db/fixtures/development/03_project.rb113
-rw-r--r--db/fixtures/development/03_project_1_user_projects.rb31
-rw-r--r--db/fixtures/development/03_project_2_group_projects.rb31
-rw-r--r--db/fixtures/development/03_project_3_features.rb39
-rw-r--r--db/fixtures/development/03_project_4_routes.rb40
-rw-r--r--db/fixtures/development/04_labels.rb12
-rw-r--r--db/fixtures/development/06_teams.rb2
-rw-r--r--db/fixtures/development/32_crm.rb4
-rw-r--r--db/fixtures/development/33_triage_ops.rb4
-rw-r--r--db/migrate/20220113164801_add_diffs_colors_to_user_preferences.rb13
-rw-r--r--db/migrate/20220113164901_add_text_limit_to_user_preferences_diffs_colors.rb15
-rw-r--r--db/migrate/20220120160625_remove_temp_index_on_id_from_vulnerability_occurrences.rb15
-rw-r--r--db/migrate/20220302110724_add_group_features_table.rb19
-rw-r--r--db/migrate/20220310011530_add_database_grafana_config_to_application_settings.rb13
-rw-r--r--db/migrate/20220310011613_add_text_limit_to_database_grafana_application_settings.rb15
-rw-r--r--db/migrate/20220314184009_create_protected_environment_approval_rules.rb30
-rw-r--r--db/migrate/20220314184109_add_user_fk_to_protected_environment_approval_rules.rb15
-rw-r--r--db/migrate/20220314184209_add_group_fk_to_protected_environment_approval_rules.rb15
-rw-r--r--db/migrate/20220314194009_add_approval_rule_id_to_deployment_approvals.rb7
-rw-r--r--db/migrate/20220314204009_add_approval_rule_fk_to_deployment_approvals.rb20
-rw-r--r--db/migrate/20220316095126_add_creator_id_to_deploy_tokens.rb7
-rw-r--r--db/migrate/20220316202200_add_migration_plan_to_container_repositories.rb10
-rw-r--r--db/migrate/20220316202402_add_text_limit_to_container_repositories_migration_plan.rb13
-rw-r--r--db/migrate/20220317170122_add_notification_level_to_namespace_root_storage_statistics.rb13
-rw-r--r--db/migrate/20220318120802_add_target_platforms_to_project_setting.rb7
-rw-r--r--db/migrate/20220318141037_add_pages_onboarding_state.rb11
-rw-r--r--db/migrate/20220321150028_add_started_at_to_batched_background_migrations_table.rb7
-rw-r--r--db/migrate/20220321234317_remove_all_issuable_escalation_statuses.rb30
-rw-r--r--db/migrate/20220322143441_add_dora_incidents_count.rb7
-rw-r--r--db/migrate/20220322205004_change_search_rate_limit_default_values.rb8
-rw-r--r--db/migrate/20220324171254_add_public_git_lab_runner_releases_url_to_application_settings.rb10
-rw-r--r--db/migrate/20220324173554_add_text_limit_to_public_git_lab_runner_releases_url_application_settings.rb13
-rw-r--r--db/migrate/20220324175325_add_key_data_to_secure_files.rb17
-rw-r--r--db/migrate/20220329061545_add_repository_size_to_plan_limits.rb11
-rw-r--r--db/migrate/20220329095632_add_theme_to_broadcast_message.rb7
-rw-r--r--db/migrate/20220329110630_add_ci_namespace_mirrors_unnest_index_on_traversal_ids.rb25
-rw-r--r--db/migrate/20220331174026_add_submit_field_to_dast_site_profiles.rb10
-rw-r--r--db/migrate/20220331174459_add_text_limit_to_submit_field_dast_site_profiles.rb13
-rw-r--r--db/migrate/20220401044858_add_user_id_and_state_index_to_merge_request_assignees.rb15
-rw-r--r--db/migrate/20220401045116_add_user_id_and_state_index_to_merge_request_reviewers.rb15
-rw-r--r--db/migrate/20220401110443_add_on_hold_until_column_for_batched_migration.rb8
-rw-r--r--db/migrate/20220401110511_add_runtime_data_columns_to_vsa_aggregations.rb23
-rw-r--r--db/migrate/20220401113123_add_check_constraint_to_vsa_aggregation_runtime_data_columns.rb23
-rw-r--r--db/migrate/20220404114106_add_container_registry_size_to_project_statistics.rb9
-rw-r--r--db/migrate/20220404170446_add_index_for_non_requested_non_invited_awaiting_members.rb18
-rw-r--r--db/migrate/20220405061122_add_license_scanning_action_to_onboarding_progresses.rb7
-rw-r--r--db/migrate/20220405125459_add_non_migrated_index_to_container_repositories.rb20
-rw-r--r--db/migrate/20220405181814_add_arkose_settings_to_application_settings.rb26
-rw-r--r--db/migrate/20220405203843_add_text_limit_to_arkose_verify_url_application_settings.rb13
-rw-r--r--db/migrate/20220406113217_add_inactive_project_deletion_to_application_settings.rb11
-rw-r--r--db/migrate/20220406121831_add_index_on_status_for_batched_background_migrations.rb13
-rw-r--r--db/migrate/20220407135820_add_epics_relative_position.rb18
-rw-r--r--db/migrate/20220408001450_add_work_item_type_name_unique_index_null_namespaces.rb19
-rw-r--r--db/migrate/20220408135815_update_index_on_greated_done_at_on_container_repositories.rb24
-rw-r--r--db/migrate/20220412171810_add_otp_secret_expires_at.rb11
-rw-r--r--db/migrate/20220413075921_update_index_on_packages_build_infos.rb22
-rw-r--r--db/post_migrate/20211214012507_backfill_incident_issue_escalation_statuses.rb23
-rw-r--r--db/post_migrate/20220204095121_backfill_namespace_statistics_with_dependency_proxy_size.rb25
-rw-r--r--db/post_migrate/20220223124428_schedule_merge_topics_with_same_name.rb23
-rw-r--r--db/post_migrate/20220302114046_backfill_group_features.rb29
-rw-r--r--db/post_migrate/20220311010352_create_scan_id_and_id_index_on_security_findings.rb15
-rw-r--r--db/post_migrate/20220315171027_add_tmp_index_to_support_leaky_regex_cleanup.rb19
-rw-r--r--db/post_migrate/20220315171129_cleanup_draft_data_from_faulty_regex.rb42
-rw-r--r--db/post_migrate/20220315181125_remove_issues_work_item_type_id_index.rb15
-rw-r--r--db/post_migrate/20220315181130_add_temporary_issue_type_index_for_work_item_types.rb15
-rw-r--r--db/post_migrate/20220315181136_backfill_work_item_type_id_on_issues.rb40
-rw-r--r--db/post_migrate/20220315211043_add_index_to_vulnerability_reads.rb23
-rw-r--r--db/post_migrate/20220316102900_add_index_to_deploy_tokens_on_creator_id.rb15
-rw-r--r--db/post_migrate/20220316102902_add_user_foreign_key_to_deploy_tokens.rb15
-rw-r--r--db/post_migrate/20220316112118_update_organizations_name_index_add_id.rb20
-rw-r--r--db/post_migrate/20220316112206_add_contacts_index_on_group_email_and_id.rb15
-rw-r--r--db/post_migrate/20220316165539_add_index_to_vulnerabilities.rb22
-rw-r--r--db/post_migrate/20220316202640_populate_container_repositories_migration_plan.rb23
-rw-r--r--db/post_migrate/20220317161914_remove_ci_runners_ci_builds_runner_id_fk.rb19
-rw-r--r--db/post_migrate/20220318111040_add_indexes_for_primary_email_second_cleanup_migration.rb28
-rw-r--r--db/post_migrate/20220318111729_cleanup_after_fixing_issue_when_admin_changed_primary_email.rb55
-rw-r--r--db/post_migrate/20220318111949_drop_temporary_indexes_for_primary_email_migration_second_cleanup.rb28
-rw-r--r--db/post_migrate/20220321025720_alter_constraint_remote_import_url.rb14
-rw-r--r--db/post_migrate/20220321201912_remove_user_email_lookup_limit.rb13
-rw-r--r--db/post_migrate/20220322023800_add_tmp_index_routes_id_for_project_namespaces.rb17
-rw-r--r--db/post_migrate/20220322035654_add_migration_plan_index_to_container_repositories.rb17
-rw-r--r--db/post_migrate/20220322071127_finalize_project_namespaces_backfill.rb21
-rw-r--r--db/post_migrate/20220322094410_remove_wiki_notes.rb20
-rw-r--r--db/post_migrate/20220322132242_update_pages_onboarding_state.rb32
-rw-r--r--db/post_migrate/20220322205008_change_search_rate_limit_values.rb18
-rw-r--r--db/post_migrate/20220323023800_backfill_namespace_id_for_project_routes.rb29
-rw-r--r--db/post_migrate/20220323130000_add_temp_index_on_null_project_namespace_ids.rb15
-rw-r--r--db/post_migrate/20220323152202_add_index_on_visible_deployments.rb19
-rw-r--r--db/post_migrate/20220324032250_migrate_shimo_confluence_service_category.rb21
-rw-r--r--db/post_migrate/20220324081709_fix_and_backfill_project_namespaces_for_projects_with_duplicate_name.rb27
-rw-r--r--db/post_migrate/20220324110247_untrack_deletions_on_ci_job_artifacts.rb15
-rw-r--r--db/post_migrate/20220324180717_remove_project_pages_metadata_artifacts_archive_id_column.rb21
-rw-r--r--db/post_migrate/20220325000000_prepare_index_for_ci_job_artifacts_unlocked_with_expire_at.rb15
-rw-r--r--db/post_migrate/20220325000001_finalize_index_for_ci_job_artifacts_unlocked_with_expire_at.rb17
-rw-r--r--db/post_migrate/20220325050642_drop_integrations_template_column.rb9
-rw-r--r--db/post_migrate/20220325155953_steal_background_job_for_fixing_conflicting_project_names_and_paths.rb11
-rw-r--r--db/post_migrate/20220325160153_create_unique_index_on_projects_name_and_namespace_id.rb15
-rw-r--r--db/post_migrate/20220326161803_add_cascade_delete_fk_on_project_namespace_id.rb41
-rw-r--r--db/post_migrate/20220326163653_add_not_null_contraint_to_project_namespace_id.rb13
-rw-r--r--db/post_migrate/20220329175119_remove_leftover_ci_job_artifact_deletions.rb30
-rw-r--r--db/post_migrate/20220331074722_add_notes_null_discussion_id_temp_index_async.rb14
-rw-r--r--db/post_migrate/20220401045621_remove_state_index_on_merge_request_assignees.rb15
-rw-r--r--db/post_migrate/20220401045642_remove_state_index_on_merge_request_reviewers.rb15
-rw-r--r--db/post_migrate/20220404183350_add_forbidden_state_index_to_users.rb17
-rw-r--r--db/post_migrate/20220404184814_drop_broader_expired_artifact_index.rb16
-rw-r--r--db/post_migrate/20220404194649_replace_work_item_type_backfill_next_batch_strategy.rb21
-rw-r--r--db/post_migrate/20220409160628_add_async_index_for_events_followed_users.rb13
-rw-r--r--db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb12
-rw-r--r--db/post_migrate/20220412143551_add_partial_index_on_unencrypted_integrations.rb18
-rw-r--r--db/post_migrate/20220412143552_consume_remaining_encrypt_integration_property_jobs.rb23
-rw-r--r--db/post_migrate/20220413011328_remove_partial_index_on_unencrypted_integrations.rb19
-rw-r--r--db/schema_migrations/202201131648011
-rw-r--r--db/schema_migrations/202201131649011
-rw-r--r--db/schema_migrations/202201201606251
-rw-r--r--db/schema_migrations/202202040951211
-rw-r--r--db/schema_migrations/202202231244281
-rw-r--r--db/schema_migrations/202203021107241
-rw-r--r--db/schema_migrations/202203021140461
-rw-r--r--db/schema_migrations/202203100115301
-rw-r--r--db/schema_migrations/202203100116131
-rw-r--r--db/schema_migrations/202203110103521
-rw-r--r--db/schema_migrations/202203141840091
-rw-r--r--db/schema_migrations/202203141841091
-rw-r--r--db/schema_migrations/202203141842091
-rw-r--r--db/schema_migrations/202203141940091
-rw-r--r--db/schema_migrations/202203142040091
-rw-r--r--db/schema_migrations/202203151710271
-rw-r--r--db/schema_migrations/202203151711291
-rw-r--r--db/schema_migrations/202203151811251
-rw-r--r--db/schema_migrations/202203151811301
-rw-r--r--db/schema_migrations/202203151811361
-rw-r--r--db/schema_migrations/202203152110431
-rw-r--r--db/schema_migrations/202203160951261
-rw-r--r--db/schema_migrations/202203161029001
-rw-r--r--db/schema_migrations/202203161029021
-rw-r--r--db/schema_migrations/202203161121181
-rw-r--r--db/schema_migrations/202203161122061
-rw-r--r--db/schema_migrations/202203161655391
-rw-r--r--db/schema_migrations/202203162022001
-rw-r--r--db/schema_migrations/202203162024021
-rw-r--r--db/schema_migrations/202203162026401
-rw-r--r--db/schema_migrations/202203171619141
-rw-r--r--db/schema_migrations/202203171701221
-rw-r--r--db/schema_migrations/202203181110401
-rw-r--r--db/schema_migrations/202203181117291
-rw-r--r--db/schema_migrations/202203181119491
-rw-r--r--db/schema_migrations/202203181208021
-rw-r--r--db/schema_migrations/202203181410371
-rw-r--r--db/schema_migrations/202203210257201
-rw-r--r--db/schema_migrations/202203211500281
-rw-r--r--db/schema_migrations/202203212019121
-rw-r--r--db/schema_migrations/202203212343171
-rw-r--r--db/schema_migrations/202203220238001
-rw-r--r--db/schema_migrations/202203220356541
-rw-r--r--db/schema_migrations/202203220711271
-rw-r--r--db/schema_migrations/202203220944101
-rw-r--r--db/schema_migrations/202203221322421
-rw-r--r--db/schema_migrations/202203221434411
-rw-r--r--db/schema_migrations/202203222050041
-rw-r--r--db/schema_migrations/202203222050081
-rw-r--r--db/schema_migrations/202203230238001
-rw-r--r--db/schema_migrations/202203231300001
-rw-r--r--db/schema_migrations/202203231522021
-rw-r--r--db/schema_migrations/202203240322501
-rw-r--r--db/schema_migrations/202203240817091
-rw-r--r--db/schema_migrations/202203241102471
-rw-r--r--db/schema_migrations/202203241712541
-rw-r--r--db/schema_migrations/202203241735541
-rw-r--r--db/schema_migrations/202203241753251
-rw-r--r--db/schema_migrations/202203241807171
-rw-r--r--db/schema_migrations/202203250000001
-rw-r--r--db/schema_migrations/202203250000011
-rw-r--r--db/schema_migrations/202203250506421
-rw-r--r--db/schema_migrations/202203251559531
-rw-r--r--db/schema_migrations/202203251601531
-rw-r--r--db/schema_migrations/202203261618031
-rw-r--r--db/schema_migrations/202203261636531
-rw-r--r--db/schema_migrations/202203290615451
-rw-r--r--db/schema_migrations/202203290956321
-rw-r--r--db/schema_migrations/202203291106301
-rw-r--r--db/schema_migrations/202203291751191
-rw-r--r--db/schema_migrations/202203310747221
-rw-r--r--db/schema_migrations/202203311740261
-rw-r--r--db/schema_migrations/202203311744591
-rw-r--r--db/schema_migrations/202204010448581
-rw-r--r--db/schema_migrations/202204010451161
-rw-r--r--db/schema_migrations/202204010456211
-rw-r--r--db/schema_migrations/202204010456421
-rw-r--r--db/schema_migrations/202204011104431
-rw-r--r--db/schema_migrations/202204011105111
-rw-r--r--db/schema_migrations/202204011131231
-rw-r--r--db/schema_migrations/202204041141061
-rw-r--r--db/schema_migrations/202204041704461
-rw-r--r--db/schema_migrations/202204041833501
-rw-r--r--db/schema_migrations/202204041848141
-rw-r--r--db/schema_migrations/202204041946491
-rw-r--r--db/schema_migrations/202204050611221
-rw-r--r--db/schema_migrations/202204051254591
-rw-r--r--db/schema_migrations/202204051818141
-rw-r--r--db/schema_migrations/202204052038431
-rw-r--r--db/schema_migrations/202204061132171
-rw-r--r--db/schema_migrations/202204061218311
-rw-r--r--db/schema_migrations/202204071358201
-rw-r--r--db/schema_migrations/202204080014501
-rw-r--r--db/schema_migrations/202204081358151
-rw-r--r--db/schema_migrations/202204091606281
-rw-r--r--db/schema_migrations/202204120449061
-rw-r--r--db/schema_migrations/202204121435511
-rw-r--r--db/schema_migrations/202204121435521
-rw-r--r--db/schema_migrations/202204121718101
-rw-r--r--db/schema_migrations/202204130113281
-rw-r--r--db/schema_migrations/202204130759211
-rw-r--r--db/structure.sql221
-rw-r--r--doc/.vale/gitlab/SubstitutionWarning.yml1
-rw-r--r--doc/.vale/gitlab/Uppercase.yml12
-rw-r--r--doc/.vale/gitlab/Wordy.yml1
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt7
-rw-r--r--doc/administration/audit_event_streaming.md70
-rw-r--r--doc/administration/auditor_users.md3
-rw-r--r--doc/administration/auth/index.md1
-rw-r--r--doc/administration/auth/ldap/index.md12
-rw-r--r--doc/administration/auth/ldap/ldap-troubleshooting.md23
-rw-r--r--doc/administration/auth/oidc.md2
-rw-r--r--doc/administration/clusters/kas.md2
-rw-r--r--doc/administration/compliance.md2
-rw-r--r--doc/administration/file_hooks.md6
-rw-r--r--doc/administration/geo/disaster_recovery/planned_failover.md32
-rw-r--r--doc/administration/geo/replication/geo_validation_tests.md14
-rw-r--r--doc/administration/geo/replication/troubleshooting.md46
-rw-r--r--doc/administration/geo/replication/usage.md2
-rw-r--r--doc/administration/geo/replication/version_specific_updates.md2
-rw-r--r--doc/administration/get_started.md9
-rw-r--r--doc/administration/gitaly/configure_gitaly.md5
-rw-r--r--doc/administration/gitaly/index.md57
-rw-r--r--doc/administration/gitaly/praefect.md14
-rw-r--r--doc/administration/gitaly/troubleshooting.md5
-rw-r--r--doc/administration/housekeeping.md2
-rw-r--r--doc/administration/incoming_email.md19
-rw-r--r--doc/administration/index.md9
-rw-r--r--doc/administration/instance_limits.md31
-rw-r--r--doc/administration/integration/kroki.md2
-rw-r--r--doc/administration/integration/plantuml.md2
-rw-r--r--doc/administration/job_artifacts.md29
-rw-r--r--doc/administration/monitoring/gitlab_self_monitoring_project/index.md6
-rw-r--r--doc/administration/monitoring/performance/request_profiling.md2
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md1
-rw-r--r--doc/administration/nfs.md2
-rw-r--r--doc/administration/object_storage.md2
-rw-r--r--doc/administration/operations/fast_ssh_key_lookup.md5
-rw-r--r--doc/administration/operations/puma.md8
-rw-r--r--doc/administration/package_information/postgresql_versions.md4
-rw-r--r--doc/administration/package_information/supported_os.md9
-rw-r--r--doc/administration/packages/container_registry.md4
-rw-r--r--doc/administration/packages/dependency_proxy.md26
-rw-r--r--doc/administration/packages/index.md4
-rw-r--r--doc/administration/pages/index.md17
-rw-r--r--doc/administration/pages/source.md4
-rw-r--r--doc/administration/raketasks/doctor.md11
-rw-r--r--doc/administration/raketasks/maintenance.md7
-rw-r--r--doc/administration/reference_architectures/10k_users.md105
-rw-r--r--doc/administration/reference_architectures/1k_users.md2
-rw-r--r--doc/administration/reference_architectures/25k_users.md111
-rw-r--r--doc/administration/reference_architectures/2k_users.md44
-rw-r--r--doc/administration/reference_architectures/3k_users.md104
-rw-r--r--doc/administration/reference_architectures/50k_users.md107
-rw-r--r--doc/administration/reference_architectures/5k_users.md103
-rw-r--r--doc/administration/reference_architectures/index.md115
-rw-r--r--doc/administration/repository_checks.md2
-rw-r--r--doc/administration/sidekiq_health_check.md4
-rw-r--r--doc/administration/system_hooks.md771
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md7
-rw-r--r--doc/administration/troubleshooting/group_saml_scim.md15
-rw-r--r--doc/administration/troubleshooting/img/GoogleWorkspace-basic-SAML_v14_10.pngbin0 -> 69719 bytes
-rw-r--r--doc/administration/troubleshooting/img/GoogleWorkspace-claims_v14_10.pngbin0 -> 54548 bytes
-rw-r--r--doc/administration/troubleshooting/img/GoogleWorkspace-linkscert_v14_10.pngbin0 -> 77766 bytes
-rw-r--r--doc/administration/troubleshooting/log_parsing.md39
-rw-r--r--doc/api/api_resources.md148
-rw-r--r--doc/api/bulk_imports.md33
-rw-r--r--doc/api/cluster_agents.md238
-rw-r--r--doc/api/commits.md14
-rw-r--r--doc/api/deployments.md78
-rw-r--r--doc/api/discussions.md15
-rw-r--r--doc/api/dora/metrics.md21
-rw-r--r--doc/api/events.md2
-rw-r--r--doc/api/feature_flags_legacy.md16
-rw-r--r--doc/api/features.md28
-rw-r--r--doc/api/geo_nodes.md6
-rw-r--r--doc/api/graphql/reference/index.md137
-rw-r--r--doc/api/group_access_tokens.md47
-rw-r--r--doc/api/group_badges.md2
-rw-r--r--doc/api/group_protected_environments.md1
-rw-r--r--doc/api/group_releases.md77
-rw-r--r--doc/api/groups.md74
-rw-r--r--doc/api/index.md4
-rw-r--r--doc/api/integrations.md17
-rw-r--r--doc/api/invitations.md18
-rw-r--r--doc/api/issues.md12
-rw-r--r--doc/api/job_artifacts.md7
-rw-r--r--doc/api/linked_epics.md236
-rw-r--r--doc/api/members.md118
-rw-r--r--doc/api/merge_request_approvals.md94
-rw-r--r--doc/api/notes.md62
-rw-r--r--doc/api/oauth2.md74
-rw-r--r--doc/api/packages/composer.md5
-rw-r--r--doc/api/pages.md4
-rw-r--r--doc/api/pages_domains.md4
-rw-r--r--doc/api/project_access_tokens.md51
-rw-r--r--doc/api/project_import_export.md8
-rw-r--r--doc/api/project_level_variables.md2
-rw-r--r--doc/api/projects.md11
-rw-r--r--doc/api/protected_environments.md23
-rw-r--r--doc/api/releases/index.md10
-rw-r--r--doc/api/releases/links.md10
-rw-r--r--doc/api/remote_mirrors.md57
-rw-r--r--doc/api/repository_files.md13
-rw-r--r--doc/api/runners.md10
-rw-r--r--doc/api/secure_files.md15
-rw-r--r--doc/api/settings.md12
-rw-r--r--doc/api/system_hooks.md2
-rw-r--r--doc/api/templates/gitlab_ci_ymls.md2
-rw-r--r--doc/api/users.md57
-rw-r--r--doc/architecture/blueprints/container_registry_metadata_database/index.md2
-rw-r--r--doc/ci/docker/using_kaniko.md7
-rw-r--r--doc/ci/environments/deployment_approvals.md57
-rw-r--r--doc/ci/environments/index.md49
-rw-r--r--doc/ci/examples/authenticating-with-hashicorp-vault/index.md16
-rw-r--r--doc/ci/examples/laravel_with_gitlab_and_envoy/index.md2
-rw-r--r--doc/ci/index.md117
-rw-r--r--doc/ci/jobs/ci_job_token.md3
-rw-r--r--doc/ci/jobs/index.md23
-rw-r--r--doc/ci/lint.md6
-rw-r--r--doc/ci/migration/jenkins.md2
-rw-r--r--doc/ci/pipelines/merge_request_pipelines.md11
-rw-r--r--doc/ci/pipelines/multi_project_pipelines.md2
-rw-r--r--doc/ci/pipelines/settings.md11
-rw-r--r--doc/ci/review_apps/index.md27
-rw-r--r--doc/ci/runners/runners_scope.md33
-rw-r--r--doc/ci/runners/saas/macos/environment.md3
-rw-r--r--doc/ci/runners/saas/macos_saas_runner.md2
-rw-r--r--doc/ci/secrets/index.md4
-rw-r--r--doc/ci/secure_files/index.md98
-rw-r--r--doc/ci/ssh_keys/index.md4
-rw-r--r--doc/ci/unit_test_reports.md2
-rw-r--r--doc/ci/variables/index.md1
-rw-r--r--doc/ci/variables/predefined_variables.md4
-rw-r--r--doc/ci/variables/where_variables_can_be_used.md2
-rw-r--r--doc/ci/yaml/artifacts_reports.md31
-rw-r--r--doc/ci/yaml/index.md43
-rw-r--r--doc/cloud_seed/index.md120
-rw-r--r--doc/development/api_graphql_styleguide.md57
-rw-r--r--doc/development/application_limits.md30
-rw-r--r--doc/development/application_slis/index.md2
-rw-r--r--doc/development/application_slis/rails_request_apdex.md4
-rw-r--r--doc/development/audit_event_guide/index.md28
-rw-r--r--doc/development/avoiding_downtime_in_migrations.md494
-rw-r--r--doc/development/backend/create_source_code_be/index.md4
-rw-r--r--doc/development/background_migrations.md500
-rw-r--r--doc/development/batched_background_migrations.md319
-rw-r--r--doc/development/cached_queries.md4
-rw-r--r--doc/development/chatops_on_gitlabcom.md1
-rw-r--r--doc/development/cicd/schema.md87
-rw-r--r--doc/development/code_review.md66
-rw-r--r--doc/development/contributing/design.md8
-rw-r--r--doc/development/contributing/issue_workflow.md6
-rw-r--r--doc/development/contributing/merge_request_workflow.md8
-rw-r--r--doc/development/contributing/verify/index.md5
-rw-r--r--doc/development/dangerbot.md4
-rw-r--r--doc/development/database/add_foreign_key_to_existing_column.md2
-rw-r--r--doc/development/database/avoiding_downtime_in_migrations.md491
-rw-r--r--doc/development/database/background_migrations.md504
-rw-r--r--doc/development/database/client_side_connection_pool.md7
-rw-r--r--doc/development/database/database_lab.md101
-rw-r--r--doc/development/database/database_reviewer_guidelines.md2
-rw-r--r--doc/development/database/deleting_migrations.md39
-rw-r--r--doc/development/database/index.md10
-rw-r--r--doc/development/database/keyset_pagination.md6
-rw-r--r--doc/development/database/layout_and_access_patterns.md61
-rw-r--r--doc/development/database/loose_foreign_keys.md423
-rw-r--r--doc/development/database/migrations_for_multiple_databases.md390
-rw-r--r--doc/development/database/multiple_databases.md169
-rw-r--r--doc/development/database/not_null_constraints.md2
-rw-r--r--doc/development/database/post_deployment_migrations.md81
-rw-r--r--doc/development/database/rename_database_tables.md2
-rw-r--r--doc/development/database/strings_and_the_text_data_type.md4
-rw-r--r--doc/development/database/table_partitioning.md2
-rw-r--r--doc/development/database_review.md11
-rw-r--r--doc/development/deleting_migrations.md42
-rw-r--r--doc/development/diffs.md4
-rw-r--r--doc/development/documentation/feature_flags.md47
-rw-r--r--doc/development/documentation/index.md3
-rw-r--r--doc/development/documentation/restful_api_styleguide.md16
-rw-r--r--doc/development/documentation/site_architecture/index.md2
-rw-r--r--doc/development/documentation/styleguide/index.md173
-rw-r--r--doc/development/documentation/styleguide/word_list.md62
-rw-r--r--doc/development/documentation/testing.md31
-rw-r--r--doc/development/ee_features.md7
-rw-r--r--doc/development/event_store.md39
-rw-r--r--doc/development/experiment_guide/index.md4
-rw-r--r--doc/development/fe_guide/accessibility.md2
-rw-r--r--doc/development/fe_guide/emojis.md2
-rw-r--r--doc/development/fe_guide/graphql.md122
-rw-r--r--doc/development/fe_guide/performance.md2
-rw-r--r--doc/development/fe_guide/registry_architecture.md90
-rw-r--r--doc/development/fe_guide/source_editor.md10
-rw-r--r--doc/development/fe_guide/vue.md8
-rw-r--r--doc/development/fe_guide/vue3_migration.md2
-rw-r--r--doc/development/feature_categorization/index.md5
-rw-r--r--doc/development/feature_flags/process.md11
-rw-r--r--doc/development/gemfile.md6
-rw-r--r--doc/development/gitlab_flavored_markdown/index.md20
-rw-r--r--doc/development/gitlab_flavored_markdown/specification_guide/index.md717
-rw-r--r--doc/development/go_guide/go_upgrade.md29
-rw-r--r--doc/development/i18n/externalization.md2
-rw-r--r--doc/development/i18n/proofreader.md6
-rw-r--r--doc/development/img/merge_request_reports_v14_7.pngbin66876 -> 21202 bytes
-rw-r--r--doc/development/img/merge_widget_v14_7.pngbin56335 -> 16526 bytes
-rw-r--r--doc/development/index.md18
-rw-r--r--doc/development/integrations/jira_connect.md2
-rw-r--r--doc/development/integrations/secure.md15
-rw-r--r--doc/development/internal_api/index.md7
-rw-r--r--doc/development/iterating_tables_in_batches.md2
-rw-r--r--doc/development/licensed_feature_availability.md2
-rw-r--r--doc/development/merge_request_concepts/index.md4
-rw-r--r--doc/development/merge_request_performance_guidelines.md2
-rw-r--r--doc/development/migration_style_guide.md44
-rw-r--r--doc/development/new_fe_guide/modules/widget_extensions.md1
-rw-r--r--doc/development/pipelines.md2
-rw-r--r--doc/development/post_deployment_migrations.md84
-rw-r--r--doc/development/product_qualified_lead_guide/index.md48
-rw-r--r--doc/development/project_templates.md157
-rw-r--r--doc/development/pry_debugging.md12
-rw-r--r--doc/development/query_recorder.md4
-rw-r--r--doc/development/scalability.md2
-rw-r--r--doc/development/secure_coding_guidelines.md6
-rw-r--r--doc/development/service_ping/implement.md2
-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_instrumentation.md31
-rw-r--r--doc/development/service_ping/metrics_lifecycle.md8
-rw-r--r--doc/development/service_ping/troubleshooting.md2
-rw-r--r--doc/development/sidekiq/compatibility_across_updates.md2
-rw-r--r--doc/development/single_table_inheritance.md8
-rw-r--r--doc/development/snowplow/implementation.md35
-rw-r--r--doc/development/snowplow/index.md17
-rw-r--r--doc/development/snowplow/schemas.md9
-rw-r--r--doc/development/snowplow/troubleshooting.md4
-rw-r--r--doc/development/spam_protection_and_captcha/graphql_api.md44
-rw-r--r--doc/development/spam_protection_and_captcha/index.md2
-rw-r--r--doc/development/spam_protection_and_captcha/rest_api.md90
-rw-r--r--doc/development/spam_protection_and_captcha/web_ui.md4
-rw-r--r--doc/development/sql.md10
-rw-r--r--doc/development/stage_group_dashboards.md276
-rw-r--r--doc/development/stage_group_observability/dashboards/error_budget_detail.md127
-rw-r--r--doc/development/stage_group_observability/dashboards/img/error_budget_detail_7d_budget.pngbin0 -> 20753 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/error_budget_detail_sli.pngbin0 -> 50340 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/error_budget_detail_sli_detail.pngbin0 -> 97895 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/error_budget_detail_stage_group_aggregation.pngbin0 -> 25253 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_28d_budget.pngbin0 -> 16913 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_annotation.png (renamed from doc/development/img/stage_group_dashboards_annotation.png)bin13544 -> 13544 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_debug_1.png (renamed from doc/development/img/stage_group_dashboards_debug_1.png)bin41296 -> 41296 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_debug_2.png (renamed from doc/development/img/stage_group_dashboards_debug_2.png)bin37361 -> 37361 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_debug_3.png (renamed from doc/development/img/stage_group_dashboards_debug_3.png)bin51282 -> 51282 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_filters.png (renamed from doc/development/img/stage_group_dashboards_filters.png)bin10648 -> 10648 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_metrics.png (renamed from doc/development/img/stage_group_dashboards_metrics.png)bin38776 -> 38776 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_time_customization.png (renamed from doc/development/img/stage_group_dashboards_time_customization.png)bin20025 -> 20025 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_time_filter.png (renamed from doc/development/img/stage_group_dashboards_time_filter.png)bin22641 -> 22641 bytes
-rw-r--r--doc/development/stage_group_observability/dashboards/index.md70
-rw-r--r--doc/development/stage_group_observability/dashboards/stage_group_dashboard.md200
-rw-r--r--doc/development/stage_group_observability/img/stage_group_dashboards_error_attribution.png (renamed from doc/development/img/stage_group_dashboards_error_attribution.png)bin61561 -> 61561 bytes
-rw-r--r--doc/development/stage_group_observability/img/stage_group_dashboards_service_sli_detail.png (renamed from doc/development/img/stage_group_dashboards_service_sli_detail.png)bin41130 -> 41130 bytes
-rw-r--r--doc/development/stage_group_observability/index.md138
-rw-r--r--doc/development/testing_guide/best_practices.md8
-rw-r--r--doc/development/testing_guide/end_to_end/best_practices.md3
-rw-r--r--doc/development/testing_guide/end_to_end/execution_context_selection.md4
-rw-r--r--doc/development/testing_guide/end_to_end/feature_flags.md44
-rw-r--r--doc/development/testing_guide/end_to_end/index.md3
-rw-r--r--doc/development/testing_guide/end_to_end/rspec_metadata_tests.md77
-rw-r--r--doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md4
-rw-r--r--doc/development/testing_guide/end_to_end/troubleshooting.md69
-rw-r--r--doc/development/testing_guide/review_apps.md192
-rw-r--r--doc/development/workhorse/channel.md201
-rw-r--r--doc/development/workhorse/configuration.md218
-rw-r--r--doc/development/workhorse/gitlab_features.md73
-rw-r--r--doc/development/workhorse/index.md84
-rw-r--r--doc/development/workhorse/new_features.md78
-rw-r--r--doc/gitlab-basics/create-branch.md22
-rw-r--r--doc/gitlab-basics/index.md52
-rw-r--r--doc/gitlab-basics/start-using-git.md86
-rw-r--r--doc/index.md26
-rw-r--r--doc/install/aws/manual_install_aws.md4
-rw-r--r--doc/install/azure/index.md2
-rw-r--r--doc/install/cloud_native/index.md51
-rw-r--r--doc/install/index.md6
-rw-r--r--doc/install/installation.md10
-rw-r--r--doc/install/pivotal/index.md11
-rw-r--r--doc/install/requirements.md8
-rw-r--r--doc/integration/alicloud.md91
-rw-r--r--doc/integration/elasticsearch.md8
-rw-r--r--doc/integration/gitpod.md2
-rw-r--r--doc/integration/img/alicloud_scope.pngbin0 -> 107994 bytes
-rw-r--r--doc/integration/index.md6
-rw-r--r--doc/integration/jira/configure.md3
-rw-r--r--doc/integration/jira/connect-app.md2
-rw-r--r--doc/integration/jira/development_panel.md22
-rw-r--r--doc/integration/jira/index.md2
-rw-r--r--doc/integration/jira/issues.md2
-rw-r--r--doc/integration/mattermost/index.md4
-rw-r--r--doc/integration/omniauth.md6
-rw-r--r--doc/integration/salesforce.md2
-rw-r--r--doc/integration/saml.md7
-rw-r--r--doc/operations/incident_management/alerts.md24
-rw-r--r--doc/operations/incident_management/img/alert_detail_metrics_v13_2.pngbin27616 -> 0 bytes
-rw-r--r--doc/operations/incident_management/img/incident_list_v13_5.pngbin43685 -> 0 bytes
-rw-r--r--doc/operations/incident_management/img/incident_metrics_tab_text_link_modal_v14_9.pngbin53167 -> 20989 bytes
-rw-r--r--doc/operations/incident_management/img/timeline_view_toggle_v13_5.pngbin5651 -> 0 bytes
-rw-r--r--doc/operations/incident_management/img/timeline_view_toggle_v14_10.pngbin0 -> 8423 bytes
-rw-r--r--doc/operations/incident_management/incidents.md26
-rw-r--r--doc/operations/incident_management/paging.md8
-rw-r--r--doc/operations/index.md6
-rw-r--r--doc/operations/metrics/alerts.md2
-rw-r--r--doc/operations/metrics/dashboards/default.md2
-rw-r--r--doc/operations/metrics/dashboards/develop.md2
-rw-r--r--doc/operations/metrics/dashboards/index.md2
-rw-r--r--doc/operations/metrics/dashboards/panel_types.md2
-rw-r--r--doc/operations/metrics/dashboards/settings.md2
-rw-r--r--doc/operations/metrics/dashboards/templating_variables.md2
-rw-r--r--doc/operations/metrics/dashboards/variables.md2
-rw-r--r--doc/operations/metrics/dashboards/yaml.md2
-rw-r--r--doc/operations/metrics/embed.md8
-rw-r--r--doc/operations/tracing.md2
-rw-r--r--doc/public_access/public_access.md101
-rw-r--r--doc/raketasks/backup_restore.md88
-rw-r--r--doc/raketasks/migrate_snippets.md2
-rw-r--r--doc/security/index.md1
-rw-r--r--doc/security/reset_user_password.md8
-rw-r--r--doc/security/responding_to_security_incidents.md65
-rw-r--r--doc/security/ssh_keys_restrictions.md2
-rw-r--r--doc/security/two_factor_authentication.md2
-rw-r--r--doc/security/user_file_uploads.md2
-rw-r--r--doc/ssh/index.md500
-rw-r--r--doc/subscriptions/bronze_starter.md2
-rw-r--r--doc/subscriptions/img/support-diagram.pngbin49941 -> 0 bytes
-rw-r--r--doc/subscriptions/img/support_diagram_c.pngbin0 -> 161323 bytes
-rw-r--r--doc/subscriptions/index.md9
-rw-r--r--doc/subscriptions/self_managed/index.md38
-rw-r--r--doc/system_hooks/system_hooks.md774
-rw-r--r--doc/tools/email.md63
-rw-r--r--doc/topics/authentication/index.md2
-rw-r--r--doc/topics/git/how_to_install_git/index.md2
-rw-r--r--doc/topics/git/index.md3
-rw-r--r--doc/topics/git/lfs/index.md24
-rw-r--r--doc/topics/git/terminology.md62
-rw-r--r--doc/topics/git/troubleshooting_git.md37
-rw-r--r--doc/topics/offline/quick_start_guide.md12
-rw-r--r--doc/topics/release_your_application.md5
-rw-r--r--doc/topics/set_up_organization.md2
-rw-r--r--doc/topics/use_gitlab.md24
-rw-r--r--doc/tutorials/img/branches_dropdown_v14_10.pngbin0 -> 56137 bytes
-rw-r--r--doc/tutorials/img/clone_project_v14_9.pngbin0 -> 30075 bytes
-rw-r--r--doc/tutorials/img/commit_message_v14_10.pngbin0 -> 4616 bytes
-rw-r--r--doc/tutorials/index.md5
-rw-r--r--doc/tutorials/make_your_first_git_commit.md273
-rw-r--r--doc/update/deprecations.md142
-rw-r--r--doc/update/index.md61
-rw-r--r--doc/update/upgrading_from_source.md11
-rw-r--r--doc/update/zero_downtime.md80
-rw-r--r--doc/user/admin_area/analytics/dev_ops_report.md74
-rw-r--r--doc/user/admin_area/analytics/dev_ops_reports.md73
-rw-r--r--doc/user/admin_area/analytics/index.md2
-rw-r--r--doc/user/admin_area/email_from_gitlab.md60
-rw-r--r--doc/user/admin_area/img/email1.png (renamed from doc/tools/email1.png)bin9590 -> 9590 bytes
-rw-r--r--doc/user/admin_area/img/email2.png (renamed from doc/tools/email2.png)bin14902 -> 14902 bytes
-rw-r--r--doc/user/admin_area/index.md25
-rw-r--r--doc/user/admin_area/license.md20
-rw-r--r--doc/user/admin_area/license_file.md4
-rw-r--r--doc/user/admin_area/merge_requests_approvals.md2
-rw-r--r--doc/user/admin_area/monitoring/background_migrations.md9
-rw-r--r--doc/user/admin_area/settings/account_and_limit_settings.md2
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md50
-rw-r--r--doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_input_v14_10.pngbin0 -> 10770 bytes
-rw-r--r--doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_0.pngbin80106 -> 0 bytes
-rw-r--r--doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_10.pngbin0 -> 9849 bytes
-rw-r--r--doc/user/admin_area/settings/visibility_and_access_controls.md8
-rw-r--r--doc/user/analytics/ci_cd_analytics.md28
-rw-r--r--doc/user/analytics/index.md114
-rw-r--r--doc/user/application_security/api_fuzzing/index.md356
-rw-r--r--doc/user/application_security/container_scanning/index.md30
-rw-r--r--doc/user/application_security/dast/checks/598.2.md30
-rw-r--r--doc/user/application_security/dast/checks/598.3.md31
-rw-r--r--doc/user/application_security/dast/checks/829.1.md48
-rw-r--r--doc/user/application_security/dast/checks/829.2.md47
-rw-r--r--doc/user/application_security/dast/checks/index.md4
-rw-r--r--doc/user/application_security/dast/index.md17
-rw-r--r--doc/user/application_security/dast_api/index.md693
-rw-r--r--doc/user/application_security/dependency_scanning/index.md99
-rw-r--r--doc/user/application_security/iac_scanning/index.md45
-rw-r--r--doc/user/application_security/index.md22
-rw-r--r--doc/user/application_security/policies/img/association_diagram.pngbin0 -> 6624 bytes
-rw-r--r--doc/user/application_security/policies/index.md97
-rw-r--r--doc/user/application_security/policies/scan-execution-policies.md4
-rw-r--r--doc/user/application_security/policies/scan-result-policies.md6
-rw-r--r--doc/user/application_security/sast/index.md95
-rw-r--r--doc/user/application_security/secret_detection/index.md59
-rw-r--r--doc/user/application_security/security_dashboard/index.md6
-rw-r--r--doc/user/application_security/threat_monitoring/index.md2
-rw-r--r--doc/user/application_security/vulnerabilities/index.md2
-rw-r--r--doc/user/application_security/vulnerability_report/index.md10
-rw-r--r--doc/user/clusters/agent/ci_cd_tunnel.md8
-rw-r--r--doc/user/clusters/agent/gitops.md36
-rw-r--r--doc/user/clusters/agent/index.md6
-rw-r--r--doc/user/clusters/agent/install/index.md182
-rw-r--r--doc/user/clusters/agent/repository.md8
-rw-r--r--doc/user/clusters/agent/troubleshooting.md44
-rw-r--r--doc/user/compliance/compliance_report/img/failed_icon_v13_3.pngbin4118 -> 0 bytes
-rw-r--r--doc/user/compliance/compliance_report/img/success_icon_v13_3.pngbin4121 -> 0 bytes
-rw-r--r--doc/user/compliance/compliance_report/img/warning_icon_v13_3.pngbin4095 -> 0 bytes
-rw-r--r--doc/user/compliance/compliance_report/index.md122
-rw-r--r--doc/user/crm/crm_contacts_v14_10.pngbin0 -> 18015 bytes
-rw-r--r--doc/user/crm/crm_contacts_v14_6.pngbin19864 -> 0 bytes
-rw-r--r--doc/user/crm/crm_organizations_v14_10.pngbin0 -> 13787 bytes
-rw-r--r--doc/user/crm/crm_organizations_v14_6.pngbin8244 -> 0 bytes
-rw-r--r--doc/user/crm/index.md34
-rw-r--r--doc/user/discussions/index.md42
-rw-r--r--doc/user/gitlab_com/index.md47
-rw-r--r--doc/user/group/contribution_analytics/index.md2
-rw-r--r--doc/user/group/epics/img/related_epic_block_v14_9.pngbin31319 -> 11800 bytes
-rw-r--r--doc/user/group/epics/img/related_epics_add_v14_9.pngbin27785 -> 9862 bytes
-rw-r--r--doc/user/group/epics/index.md14
-rw-r--r--doc/user/group/epics/manage_epics.md120
-rw-r--r--doc/user/group/import/index.md19
-rw-r--r--doc/user/group/index.md27
-rw-r--r--doc/user/group/iterations/index.md150
-rw-r--r--doc/user/group/saml_sso/index.md14
-rw-r--r--doc/user/group/saml_sso/scim_setup.md6
-rw-r--r--doc/user/group/settings/group_access_tokens.md11
-rw-r--r--doc/user/group/subgroups/index.md15
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_aggregated_data_toggle_v14_9.pngbin0 -> 145830 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_12.pngbin36706 -> 0 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_overview_stage_v13_11.pngbin21148 -> 0 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_path_nav_v13_11.pngbin22421 -> 0 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_stage_table_v14_7.pngbin79595 -> 0 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_time_metrics_v13_12.pngbin18354 -> 0 bytes
-rw-r--r--doc/user/group/value_stream_analytics/index.md80
-rw-r--r--doc/user/index.md263
-rw-r--r--doc/user/infrastructure/clusters/connect/new_eks_cluster.md5
-rw-r--r--doc/user/infrastructure/clusters/connect/new_gke_cluster.md12
-rw-r--r--doc/user/infrastructure/clusters/deploy/inventory_object.md4
-rw-r--r--doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md10
-rw-r--r--doc/user/infrastructure/iac/index.md149
-rw-r--r--doc/user/infrastructure/iac/mr_integration.md2
-rw-r--r--doc/user/infrastructure/iac/terraform_state.md27
-rw-r--r--doc/user/infrastructure/iac/troubleshooting.md27
-rw-r--r--doc/user/markdown.md36
-rw-r--r--doc/user/packages/composer_repository/index.md12
-rw-r--r--doc/user/packages/conan_repository/index.md22
-rw-r--r--doc/user/packages/container_registry/index.md13
-rw-r--r--doc/user/packages/container_registry/reduce_container_registry_storage.md20
-rw-r--r--doc/user/packages/dependency_proxy/index.md11
-rw-r--r--doc/user/packages/maven_repository/index.md7
-rw-r--r--doc/user/packages/package_registry/index.md20
-rw-r--r--doc/user/permissions.md312
-rw-r--r--doc/user/profile/index.md67
-rw-r--r--doc/user/profile/notifications.md62
-rw-r--r--doc/user/profile/personal_access_tokens.md4
-rw-r--r--doc/user/profile/preferences.md14
-rw-r--r--doc/user/project/clusters/protect/container_host_security/index.md2
-rw-r--r--doc/user/project/clusters/protect/container_host_security/quick_start_guide.md2
-rw-r--r--doc/user/project/clusters/protect/container_network_security/index.md2
-rw-r--r--doc/user/project/clusters/protect/container_network_security/quick_start_guide.md2
-rw-r--r--doc/user/project/clusters/protect/index.md2
-rw-r--r--doc/user/project/code_intelligence.md4
-rw-r--r--doc/user/project/code_owners.md9
-rw-r--r--doc/user/project/deploy_keys/img/deploy_keys_v13_0.pngbin27295 -> 0 bytes
-rw-r--r--doc/user/project/deploy_keys/index.md4
-rw-r--r--doc/user/project/deploy_tokens/index.md4
-rw-r--r--doc/user/project/img/promote_to_parent_group_workaround_v14_10.pngbin0 -> 10991 bytes
-rw-r--r--doc/user/project/import/bitbucket.md4
-rw-r--r--doc/user/project/import/bitbucket_server.md28
-rw-r--r--doc/user/project/import/github.md2
-rw-r--r--doc/user/project/import/img/gitlab_import_history_page_v14_10.pngbin0 -> 103923 bytes
-rw-r--r--doc/user/project/import/index.md24
-rw-r--r--doc/user/project/index.md16
-rw-r--r--doc/user/project/integrations/asana.md4
-rw-r--r--doc/user/project/integrations/bugzilla.md3
-rw-r--r--doc/user/project/integrations/discord_notifications.md5
-rw-r--r--doc/user/project/integrations/emails_on_push.md19
-rw-r--r--doc/user/project/integrations/ewm.md3
-rw-r--r--doc/user/project/integrations/gitlab_slack_application.md2
-rw-r--r--doc/user/project/integrations/harbor.md4
-rw-r--r--doc/user/project/integrations/img/failed_badges.pngbin46485 -> 15999 bytes
-rw-r--r--doc/user/project/integrations/img/failed_banner.pngbin17440 -> 6783 bytes
-rw-r--r--doc/user/project/integrations/img/gitlab_slack_app_landing_page.pngbin32992 -> 0 bytes
-rw-r--r--doc/user/project/integrations/irker.md5
-rw-r--r--doc/user/project/integrations/mattermost.md46
-rw-r--r--doc/user/project/integrations/overview.md10
-rw-r--r--doc/user/project/integrations/pivotal_tracker.md4
-rw-r--r--doc/user/project/integrations/prometheus.md15
-rw-r--r--doc/user/project/integrations/prometheus_library/cloudwatch.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/haproxy.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/index.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/kubernetes.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/nginx.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/nginx_ingress.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md2
-rw-r--r--doc/user/project/integrations/redmine.md3
-rw-r--r--doc/user/project/integrations/slack_slash_commands.md2
-rw-r--r--doc/user/project/integrations/unify_circuit.md3
-rw-r--r--doc/user/project/integrations/webhook_events.md28
-rw-r--r--doc/user/project/integrations/webhooks.md112
-rw-r--r--doc/user/project/integrations/youtrack.md3
-rw-r--r--doc/user/project/issues/design_management.md330
-rw-r--r--doc/user/project/issues/img/adding_note_to_design_1.pngbin98647 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/adding_note_to_design_2.pngbin99057 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/confirm_design_deletion_v12_4.pngbin120256 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/delete_multiple_designs_v12_4.pngbin108361 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/design_added_v12_3.pngbin99155 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/design_comments_v12_3.pngbin94900 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/design_drag_and_drop_uploads_v13_2.pngbin120300 -> 32258 bytes
-rw-r--r--doc/user/project/issues/img/design_management_upload_v13.3.pngbin15001 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/design_management_v13_2.pngbin106442 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/design_management_v14_10.pngbin0 -> 139386 bytes
-rw-r--r--doc/user/project/issues/img/design_modified_v12_3.pngbin61647 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/design_todo_button_v13_5.pngbin79978 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/design_zooming_v12_7.pngbin221570 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/resolve_design-discussion_checkbox_v13_1.pngbin15228 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/resolve_design-discussion_icon_v13_1.pngbin11426 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/select_designs_v12_4.pngbin109286 -> 0 bytes
-rw-r--r--doc/user/project/issues/issue_data_and_actions.md11
-rw-r--r--doc/user/project/issues/managing_issues.md2
-rw-r--r--doc/user/project/issues/sorting_issue_lists.md21
-rw-r--r--doc/user/project/labels.md45
-rw-r--r--doc/user/project/members/index.md9
-rw-r--r--doc/user/project/merge_requests/approvals/settings.md2
-rw-r--r--doc/user/project/merge_requests/fast_forward_merge.md7
-rw-r--r--doc/user/project/merge_requests/img/attention_request_list_v14_10.pngbin0 -> 11932 bytes
-rw-r--r--doc/user/project/merge_requests/img/attention_request_sidebar_v14_10.pngbin0 -> 20471 bytes
-rw-r--r--doc/user/project/merge_requests/img/ff_merge_rebase_v14_9.pngbin17903 -> 6552 bytes
-rw-r--r--doc/user/project/merge_requests/index.md47
-rw-r--r--doc/user/project/merge_requests/reviews/index.md8
-rw-r--r--doc/user/project/merge_requests/reviews/suggestions.md2
-rw-r--r--doc/user/project/merge_requests/status_checks.md3
-rw-r--r--doc/user/project/merge_requests/test_coverage_visualization.md29
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/dns_concepts.md4
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/index.md4
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md6
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/ssl_tls_concepts.md4
-rw-r--r--doc/user/project/pages/getting_started/pages_ci_cd_template.md4
-rw-r--r--doc/user/project/pages/getting_started/pages_forked_sample_project.md4
-rw-r--r--doc/user/project/pages/getting_started/pages_from_scratch.md4
-rw-r--r--doc/user/project/pages/getting_started/pages_new_project_template.md4
-rw-r--r--doc/user/project/pages/getting_started_part_one.md4
-rw-r--r--doc/user/project/pages/index.md4
-rw-r--r--doc/user/project/pages/introduction.md4
-rw-r--r--doc/user/project/pages/lets_encrypt_for_gitlab_pages.md11
-rw-r--r--doc/user/project/pages/pages_access_control.md4
-rw-r--r--doc/user/project/pages/redirects.md4
-rw-r--r--doc/user/project/protected_branches.md4
-rw-r--r--doc/user/project/push_options.md2
-rw-r--r--doc/user/project/quick_actions.md1
-rw-r--r--doc/user/project/repository/forking_workflow.md2
-rw-r--r--doc/user/project/repository/jupyter_notebooks/index.md12
-rw-r--r--doc/user/project/repository/mirror/index.md16
-rw-r--r--doc/user/project/repository/repository_mirroring.md9
-rw-r--r--doc/user/project/repository/web_editor.md7
-rw-r--r--doc/user/project/repository/x509_signed_commits/index.md2
-rw-r--r--doc/user/project/requirements/index.md2
-rw-r--r--doc/user/project/service_desk.md33
-rw-r--r--doc/user/project/settings/import_export.md29
-rw-r--r--doc/user/project/settings/index.md17
-rw-r--r--doc/user/project/settings/project_access_tokens.md17
-rw-r--r--doc/user/project/static_site_editor/index.md2
-rw-r--r--doc/user/project/web_ide/index.md2
-rw-r--r--doc/user/project/wiki/index.md8
-rw-r--r--doc/user/project/working_with_projects.md42
-rw-r--r--doc/user/public_access.md98
-rw-r--r--doc/user/reserved_names.md2
-rw-r--r--doc/user/search/advanced_search.md70
-rw-r--r--doc/user/search/global_search/advanced_search_syntax.md49
-rw-r--r--doc/user/search/img/advanced_search_v13.10.pngbin46767 -> 0 bytes
-rw-r--r--doc/user/search/img/code_search_git_blame_v14_9.pngbin40505 -> 13872 bytes
-rw-r--r--doc/user/search/img/sort_projects.pngbin59495 -> 0 bytes
-rw-r--r--doc/user/search/index.md35
-rw-r--r--doc/user/shortcuts.md6
-rw-r--r--doc/user/snippets.md2
-rw-r--r--doc/user/ssh.md497
-rw-r--r--doc/user/todos.md2
-rw-r--r--generator_templates/active_record/migration/migration.rb4
-rw-r--r--generator_templates/post_deployment_migration/post_deployment_migration/migration.rb4
-rw-r--r--haml_lint/linter/documentation_links.rb10
-rw-r--r--jest.config.base.js46
-rw-r--r--lefthook.yml4
-rw-r--r--lib/api/admin/instance_clusters.rb2
-rw-r--r--lib/api/admin/plan_limits.rb2
-rw-r--r--lib/api/admin/sidekiq.rb2
-rw-r--r--lib/api/alert_management_alerts.rb137
-rw-r--r--lib/api/api.rb8
-rw-r--r--lib/api/bulk_imports.rb10
-rw-r--r--lib/api/ci/helpers/runner.rb5
-rw-r--r--lib/api/ci/job_artifacts.rb12
-rw-r--r--lib/api/ci/jobs.rb11
-rw-r--r--lib/api/ci/pipelines.rb2
-rw-r--r--lib/api/ci/secure_files.rb5
-rw-r--r--lib/api/ci/variables.rb2
-rw-r--r--lib/api/clusters/agents.rb81
-rw-r--r--lib/api/composer_packages.rb13
-rw-r--r--lib/api/entities/application_setting.rb3
-rw-r--r--lib/api/entities/award_emoji.rb1
-rw-r--r--lib/api/entities/basic_release_details.rb16
-rw-r--r--lib/api/entities/ci/job_request/artifacts.rb2
-rw-r--r--lib/api/entities/clusters/agent.rb3
-rw-r--r--lib/api/entities/commit_with_link.rb8
-rw-r--r--lib/api/entities/issue.rb4
-rw-r--r--lib/api/entities/member.rb1
-rw-r--r--lib/api/entities/merge_request_changes.rb2
-rw-r--r--lib/api/entities/metric_image.rb9
-rw-r--r--lib/api/entities/project.rb5
-rw-r--r--lib/api/entities/release.rb8
-rw-r--r--lib/api/entities/user_with_admin.rb1
-rw-r--r--lib/api/entities/wiki_attachment.rb4
-rw-r--r--lib/api/environments.rb2
-rw-r--r--lib/api/files.rb7
-rw-r--r--lib/api/group_export.rb2
-rw-r--r--lib/api/groups.rb32
-rw-r--r--lib/api/helpers.rb8
-rw-r--r--lib/api/integrations.rb2
-rw-r--r--lib/api/internal/base.rb2
-rw-r--r--lib/api/internal/kubernetes.rb6
-rw-r--r--lib/api/invitations.rb14
-rw-r--r--lib/api/issue_links.rb10
-rw-r--r--lib/api/lint.rb2
-rw-r--r--lib/api/markdown.rb2
-rw-r--r--lib/api/members.rb3
-rw-r--r--lib/api/metrics/dashboard/annotations.rb2
-rw-r--r--lib/api/namespaces.rb8
-rw-r--r--lib/api/notes.rb2
-rw-r--r--lib/api/notification_settings.rb2
-rw-r--r--lib/api/project_events.rb3
-rw-r--r--lib/api/project_export.rb2
-rw-r--r--lib/api/project_import.rb2
-rw-r--r--lib/api/project_snippets.rb2
-rw-r--r--lib/api/projects.rb17
-rw-r--r--lib/api/projects_relation_builder.rb20
-rw-r--r--lib/api/releases.rb58
-rw-r--r--lib/api/remote_mirrors.rb35
-rw-r--r--lib/api/resource_access_tokens.rb22
-rw-r--r--lib/api/settings.rb5
-rw-r--r--lib/api/sidekiq_metrics.rb2
-rw-r--r--lib/api/snippets.rb4
-rw-r--r--lib/api/users.rb18
-rw-r--r--lib/api/validations/validators/limit.rb2
-rw-r--r--lib/api/version.rb2
-rw-r--r--lib/api/wikis.rb6
-rw-r--r--lib/backup/artifacts.rb14
-rw-r--r--lib/backup/builds.rb14
-rw-r--r--lib/backup/database.rb7
-rw-r--r--lib/backup/files.rb15
-rw-r--r--lib/backup/gitaly_backup.rb12
-rw-r--r--lib/backup/gitaly_rpc_backup.rb129
-rw-r--r--lib/backup/lfs.rb14
-rw-r--r--lib/backup/manager.rb339
-rw-r--r--lib/backup/packages.rb14
-rw-r--r--lib/backup/pages.rb18
-rw-r--r--lib/backup/registry.rb19
-rw-r--r--lib/backup/repositories.rb144
-rw-r--r--lib/backup/task.rb15
-rw-r--r--lib/backup/terraform_state.rb14
-rw-r--r--lib/backup/uploads.rb14
-rw-r--r--lib/banzai/filter/base_sanitization_filter.rb3
-rw-r--r--lib/banzai/filter/custom_emoji_filter.rb12
-rw-r--r--lib/banzai/filter/image_link_filter.rb7
-rw-r--r--lib/banzai/filter/kroki_filter.rb16
-rw-r--r--lib/banzai/filter/plantuml_filter.rb10
-rw-r--r--lib/banzai/filter/repository_link_filter.rb2
-rw-r--r--lib/banzai/pipeline/gfm_pipeline.rb2
-rw-r--r--lib/bulk_imports/common/pipelines/entity_finisher.rb2
-rw-r--r--lib/bulk_imports/groups/stage.rb14
-rw-r--r--lib/bulk_imports/stage.rb9
-rw-r--r--lib/container_registry/base_client.rb16
-rw-r--r--lib/container_registry/gitlab_api_client.rb36
-rw-r--r--lib/container_registry/migration.rb23
-rw-r--r--lib/error_tracking/sentry_client.rb10
-rw-r--r--lib/error_tracking/sentry_client/event.rb6
-rw-r--r--lib/error_tracking/sentry_client/issue.rb13
-rw-r--r--lib/error_tracking/sentry_client/pagination_parser.rb2
-rw-r--r--lib/error_tracking/sentry_client/projects.rb4
-rw-r--r--lib/error_tracking/sentry_client/repo.rb2
-rw-r--r--lib/event_filter.rb156
-rw-r--r--lib/expand_variables.rb3
-rw-r--r--lib/gitlab/application_context.rb44
-rw-r--r--lib/gitlab/application_rate_limiter.rb3
-rw-r--r--lib/gitlab/asciidoc/include_processor.rb2
-rw-r--r--lib/gitlab/auth/ldap/dn.rb2
-rw-r--r--lib/gitlab/auth/o_auth/provider.rb1
-rw-r--r--lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_group_features.rb47
-rw-r--r--lib/gitlab/background_migration/backfill_incident_issue_escalation_statuses.rb32
-rw-r--r--lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb58
-rw-r--r--lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb73
-rw-r--r--lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy.rb19
-rw-r--r--lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb17
-rw-r--r--lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex.rb48
-rw-r--r--lib/gitlab/background_migration/encrypt_static_object_token.rb4
-rw-r--r--lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb82
-rw-r--r--lib/gitlab/background_migration/merge_topics_with_same_name.rb76
-rw-r--r--lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb27
-rw-r--r--lib/gitlab/background_migration/populate_container_repository_migration_plan.rb51
-rw-r--r--lib/gitlab/background_migration/populate_namespace_statistics.rb33
-rw-r--r--lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb12
-rw-r--r--lib/gitlab/blame.rb17
-rw-r--r--lib/gitlab/ci/ansi2html.rb3
-rw-r--r--lib/gitlab/ci/config.rb25
-rw-r--r--lib/gitlab/ci/config/entry/processable.rb2
-rw-r--r--lib/gitlab/ci/config/external/context.rb12
-rw-r--r--lib/gitlab/ci/config/external/file/artifact.rb16
-rw-r--r--lib/gitlab/ci/config/external/file/base.rb33
-rw-r--r--lib/gitlab/ci/config/external/file/local.rb8
-rw-r--r--lib/gitlab/ci/config/external/file/project.rb28
-rw-r--r--lib/gitlab/ci/config/external/file/remote.rb8
-rw-r--r--lib/gitlab/ci/config/external/file/template.rb8
-rw-r--r--lib/gitlab/ci/config/external/mapper.rb34
-rw-r--r--lib/gitlab/ci/parsers/security/common.rb47
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schema_validator.rb134
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/cluster-image-scanning-report-format.json977
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/container-scanning-report-format.json911
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/coverage-fuzzing-report-format.json874
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/dast-report-format.json1291
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/dependency-scanning-report-format.json968
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/sast-report-format.json869
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/secret-detection-report-format.json892
-rw-r--r--lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb72
-rw-r--r--lib/gitlab/ci/pipeline/chain/template_usage.rb2
-rw-r--r--lib/gitlab/ci/reports/security/report.rb5
-rw-r--r--lib/gitlab/ci/reports/security/scanner.rb1
-rw-r--r--lib/gitlab/ci/reports/test_suite.rb1
-rw-r--r--lib/gitlab/ci/runner_releases.rb65
-rw-r--r--lib/gitlab/ci/runner_upgrade_check.rb62
-rw-r--r--lib/gitlab/ci/status/build/manual.rb22
-rw-r--r--lib/gitlab/ci/templates/C++.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Go.gitlab-ci.yml20
-rw-r--r--lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml45
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml9
-rw-r--r--lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml9
-rw-r--r--lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml13
-rw-r--r--lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml96
-rw-r--r--lib/gitlab/ci/templates/Python.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml27
-rw-r--r--lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml8
-rw-r--r--lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml9
-rw-r--r--lib/gitlab/ci/templates/ThemeKit.gitlab-ci.yml27
-rw-r--r--lib/gitlab/ci/templates/liquibase.gitlab-ci.yml149
-rw-r--r--lib/gitlab/ci/variables/builder.rb76
-rw-r--r--lib/gitlab/content_security_policy/config_loader.rb4
-rw-r--r--lib/gitlab/data_builder/deployment.rb18
-rw-r--r--lib/gitlab/data_builder/note.rb5
-rw-r--r--lib/gitlab/database.rb48
-rw-r--r--lib/gitlab/database/background_migration/batch_metrics.rb15
-rw-r--r--lib/gitlab/database/background_migration/batched_job.rb27
-rw-r--r--lib/gitlab/database/background_migration/batched_migration.rb72
-rw-r--r--lib/gitlab/database/background_migration/batched_migration_runner.rb17
-rw-r--r--lib/gitlab/database/background_migration/batched_migration_wrapper.rb83
-rw-r--r--lib/gitlab/database/background_migration/prometheus_metrics.rb93
-rw-r--r--lib/gitlab/database/consistency_checker.rb122
-rw-r--r--lib/gitlab/database/each_database.rb4
-rw-r--r--lib/gitlab/database/gitlab_schemas.yml12
-rw-r--r--lib/gitlab/database/load_balancing/configuration.rb6
-rw-r--r--lib/gitlab/database/load_balancing/connection_proxy.rb7
-rw-r--r--lib/gitlab/database/load_balancing/setup.rb47
-rw-r--r--lib/gitlab/database/migration.rb27
-rw-r--r--lib/gitlab/database/migration_helpers.rb8
-rw-r--r--lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb14
-rw-r--r--lib/gitlab/database/migration_helpers/v2.rb4
-rw-r--r--lib/gitlab/database/migrations/batched_background_migration_helpers.rb4
-rw-r--r--lib/gitlab/database/migrations/instrumentation.rb10
-rw-r--r--lib/gitlab/database/migrations/runner.rb15
-rw-r--r--lib/gitlab/database/migrations/test_background_runner.rb30
-rw-r--r--lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb20
-rw-r--r--lib/gitlab/database/query_analyzers/gitlab_schemas_metrics.rb8
-rw-r--r--lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb18
-rw-r--r--lib/gitlab/database/reindexing/grafana_notifier.rb22
-rw-r--r--lib/gitlab/diff/custom_diff.rb43
-rw-r--r--lib/gitlab/diff/file.rb12
-rw-r--r--lib/gitlab/diff/line.rb17
-rw-r--r--lib/gitlab/diff/parallel_diff.rb2
-rw-r--r--lib/gitlab/diff/rendered/notebook/diff_file.rb51
-rw-r--r--lib/gitlab/email/handler/service_desk_handler.rb22
-rw-r--r--lib/gitlab/email/message/in_product_marketing.rb2
-rw-r--r--lib/gitlab/email/message/in_product_marketing/invite_team.rb53
-rw-r--r--lib/gitlab/emoji.rb9
-rw-r--r--lib/gitlab/encoding_helper.rb35
-rw-r--r--lib/gitlab/experiment/rollout/feature.rb5
-rw-r--r--lib/gitlab/fips.rb11
-rw-r--r--lib/gitlab/gfm/uploads_rewriter.rb2
-rw-r--r--lib/gitlab/git/blame.rb40
-rw-r--r--lib/gitlab/git/diff.rb11
-rw-r--r--lib/gitlab/git/diff_collection.rb17
-rw-r--r--lib/gitlab/git/ref.rb2
-rw-r--r--lib/gitlab/git/repository.rb4
-rw-r--r--lib/gitlab/gitaly_client/commit_service.rb7
-rw-r--r--lib/gitlab/gitaly_client/repository_service.rb6
-rw-r--r--lib/gitlab/github_import/object_counter.rb2
-rw-r--r--lib/gitlab/github_import/parallel_scheduling.rb8
-rw-r--r--lib/gitlab/gon_helper.rb11
-rw-r--r--lib/gitlab/graphql/deprecation.rb2
-rw-r--r--lib/gitlab/graphql/known_operations.rb5
-rw-r--r--lib/gitlab/graphql/pagination/active_record_array_connection.rb90
-rw-r--r--lib/gitlab/graphql/pagination/keyset/connection.rb4
-rw-r--r--lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb17
-rw-r--r--lib/gitlab/graphql/project/dast_profile_connection_extension.rb2
-rw-r--r--lib/gitlab/hook_data/issuable_builder.rb7
-rw-r--r--lib/gitlab/hook_data/merge_request_builder.rb1
-rw-r--r--lib/gitlab/http_connection_adapter.rb12
-rw-r--r--lib/gitlab/i18n.rb24
-rw-r--r--lib/gitlab/i18n/po_linter.rb3
-rw-r--r--lib/gitlab/import_export/after_export_strategies/base_after_export_strategy.rb8
-rw-r--r--lib/gitlab/import_export/avatar_saver.rb16
-rw-r--r--lib/gitlab/import_export/command_line_util.rb2
-rw-r--r--lib/gitlab/import_export/duration_measuring.rb23
-rw-r--r--lib/gitlab/import_export/fast_hash_serializer.rb2
-rw-r--r--lib/gitlab/import_export/json/streaming_serializer.rb6
-rw-r--r--lib/gitlab/import_export/lfs_saver.rb19
-rw-r--r--lib/gitlab/import_export/members_mapper.rb4
-rw-r--r--lib/gitlab/import_export/project/tree_saver.rb8
-rw-r--r--lib/gitlab/import_export/repo_saver.rb8
-rw-r--r--lib/gitlab/import_export/snippets_repo_saver.rb15
-rw-r--r--lib/gitlab/import_export/uploads_saver.rb12
-rw-r--r--lib/gitlab/import_export/version_saver.rb11
-rw-r--r--lib/gitlab/insecure_key_fingerprint.rb7
-rw-r--r--lib/gitlab/integrations/sti_type.rb4
-rw-r--r--lib/gitlab/lazy.rb4
-rw-r--r--lib/gitlab/lfs_token.rb2
-rw-r--r--lib/gitlab/omniauth_initializer.rb4
-rw-r--r--lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb4
-rw-r--r--lib/gitlab/pagination/keyset/order.rb6
-rw-r--r--lib/gitlab/pagination/keyset/simple_order_builder.rb163
-rw-r--r--lib/gitlab/pagination/offset_pagination.rb9
-rw-r--r--lib/gitlab/patch/database_config.rb111
-rw-r--r--lib/gitlab/patch/legacy_database_config.rb100
-rw-r--r--lib/gitlab/project_template.rb4
-rw-r--r--lib/gitlab/quick_actions/merge_request_actions.rb4
-rw-r--r--lib/gitlab/relative_positioning/item_context.rb6
-rw-r--r--lib/gitlab/security/scan_configuration.rb2
-rw-r--r--lib/gitlab/seeder.rb23
-rw-r--r--lib/gitlab/setup_helper.rb8
-rw-r--r--lib/gitlab/ssh_public_key.rb16
-rw-r--r--lib/gitlab/suggestions/commit_message.rb6
-rw-r--r--lib/gitlab/suggestions/suggestion_set.rb8
-rw-r--r--lib/gitlab/task_helpers.rb1
-rw-r--r--lib/gitlab/time_tracking_formatter.rb5
-rw-r--r--lib/gitlab/tracking.rb17
-rw-r--r--lib/gitlab/url_sanitizer.rb5
-rw-r--r--lib/gitlab/usage/service_ping/instrumented_payload.rb2
-rw-r--r--lib/gitlab/usage/service_ping_report.rb11
-rw-r--r--lib/gitlab/usage_data.rb18
-rw-r--r--lib/gitlab/usage_data_counters/ci_template_unique_counter.rb9
-rw-r--r--lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter.rb28
-rw-r--r--lib/gitlab/usage_data_counters/hll_redis_counter.rb13
-rw-r--r--lib/gitlab/usage_data_counters/known_events/ci_templates.yml12
-rw-r--r--lib/gitlab/usage_data_counters/known_events/code_review_events.yml18
-rw-r--r--lib/gitlab/usage_data_counters/known_events/common.yml8
-rw-r--r--lib/gitlab/usage_data_counters/known_events/epic_events.yml30
-rw-r--r--lib/gitlab/usage_data_counters/known_events/error_tracking.yml2
-rw-r--r--lib/gitlab/usage_data_queries.rb13
-rw-r--r--lib/gitlab/utils/delegator_override/validator.rb8
-rw-r--r--lib/gitlab/view/presenter/base.rb18
-rw-r--r--lib/gitlab/workhorse.rb7
-rw-r--r--lib/mattermost/session.rb7
-rw-r--r--lib/prometheus/cleanup_multiproc_dir_service.rb19
-rw-r--r--lib/sidebars/groups/menus/group_information_menu.rb2
-rw-r--r--lib/sidebars/projects/menus/infrastructure_menu.rb5
-rw-r--r--lib/sidebars/projects/menus/learn_gitlab_menu.rb6
-rw-r--r--lib/sidebars/projects/menus/packages_registries_menu.rb4
-rw-r--r--lib/sidebars/projects/menus/zentao_menu.rb31
-rw-r--r--lib/system_check/app/git_user_default_ssh_config_check.rb2
-rw-r--r--lib/system_check/base_check.rb12
-rw-r--r--lib/tasks/ci/build_artifacts.rake20
-rw-r--r--lib/tasks/dev.rake52
-rw-r--r--lib/tasks/gitlab/background_migrations.rake6
-rw-r--r--lib/tasks/gitlab/db.rake124
-rw-r--r--lib/tasks/gitlab/db/validate_config.rake113
-rw-r--r--lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake36
-rw-r--r--lib/tasks/gitlab/setup.rake22
-rw-r--r--lib/tasks/gitlab/tw/codeowners.rake23
-rw-r--r--lib/tasks/gitlab_danger.rake19
-rw-r--r--locale/am_ET/gitlab.po2095
-rw-r--r--locale/ar_SA/gitlab.po2143
-rw-r--r--locale/as_IN/gitlab.po2091
-rw-r--r--locale/az_AZ/gitlab.po2091
-rw-r--r--locale/ba_RU/gitlab.po2078
-rw-r--r--locale/bg/gitlab.po2091
-rw-r--r--locale/bn_BD/gitlab.po2091
-rw-r--r--locale/bn_IN/gitlab.po2091
-rw-r--r--locale/br_FR/gitlab.po2130
-rw-r--r--locale/bs_BA/gitlab.po2106
-rw-r--r--locale/ca_ES/gitlab.po2091
-rw-r--r--locale/cs_CZ/gitlab.po2117
-rw-r--r--locale/cy_GB/gitlab.po2143
-rw-r--r--locale/da_DK/gitlab.po2145
-rw-r--r--locale/de/gitlab.po2197
-rw-r--r--locale/el_GR/gitlab.po2091
-rw-r--r--locale/eo/gitlab.po2091
-rw-r--r--locale/es/gitlab.po2147
-rw-r--r--locale/et_EE/gitlab.po2091
-rw-r--r--locale/fa_IR/gitlab.po2091
-rw-r--r--locale/fi_FI/gitlab.po2091
-rw-r--r--locale/fil_PH/gitlab.po2091
-rw-r--r--locale/fr/gitlab.po2103
-rw-r--r--locale/gitlab.pot1579
-rw-r--r--locale/gl_ES/gitlab.po2091
-rw-r--r--locale/he_IL/gitlab.po2117
-rw-r--r--locale/hi_IN/gitlab.po2091
-rw-r--r--locale/hr_HR/gitlab.po2104
-rw-r--r--locale/hu_HU/gitlab.po2091
-rw-r--r--locale/hy_AM/gitlab.po2091
-rw-r--r--locale/id_ID/gitlab.po2078
-rw-r--r--locale/ig_NG/gitlab.po2078
-rw-r--r--locale/is_IS/gitlab.po2091
-rw-r--r--locale/it/gitlab.po2091
-rw-r--r--locale/ja/gitlab.po2380
-rw-r--r--locale/ka_GE/gitlab.po2091
-rw-r--r--locale/kab/gitlab.po2091
-rw-r--r--locale/ko/gitlab.po2088
-rw-r--r--locale/ku_TR/gitlab.po2091
-rw-r--r--locale/ky_KG/gitlab.po2091
-rw-r--r--locale/lt_LT/gitlab.po2117
-rw-r--r--locale/mk_MK/gitlab.po2091
-rw-r--r--locale/ml_IN/gitlab.po45603
-rw-r--r--locale/mn_MN/gitlab.po2091
-rw-r--r--locale/nb_NO/gitlab.po2121
-rw-r--r--locale/nl_NL/gitlab.po2091
-rw-r--r--locale/or_IN/gitlab.po2091
-rw-r--r--locale/pa_IN/gitlab.po2091
-rw-r--r--locale/pl_PL/gitlab.po2117
-rw-r--r--locale/pt_BR/gitlab.po2739
-rw-r--r--locale/pt_PT/gitlab.po2093
-rw-r--r--locale/ro_RO/gitlab.po6714
-rw-r--r--locale/ru/gitlab.po2149
-rw-r--r--locale/si_LK/gitlab.po2185
-rw-r--r--locale/sk_SK/gitlab.po2117
-rw-r--r--locale/sl_SI/gitlab.po2117
-rw-r--r--locale/sq_AL/gitlab.po2091
-rw-r--r--locale/sr_CS/gitlab.po2104
-rw-r--r--locale/sr_SP/gitlab.po2104
-rw-r--r--locale/sv_SE/gitlab.po2091
-rw-r--r--locale/sw_KE/gitlab.po2091
-rw-r--r--locale/ta_IN/gitlab.po2091
-rw-r--r--locale/tr_TR/gitlab.po2101
-rw-r--r--locale/uk/gitlab.po2363
-rw-r--r--locale/ur_PK/gitlab.po2091
-rw-r--r--locale/uz_UZ/gitlab.po2091
-rw-r--r--locale/vi_VN/gitlab.po2078
-rw-r--r--locale/zh_CN/gitlab.po3198
-rw-r--r--locale/zh_HK/gitlab.po2078
-rw-r--r--locale/zh_TW/gitlab.po2150
-rw-r--r--metrics_server/metrics_server.rb2
-rw-r--r--package.json41
-rw-r--r--qa/.confiner/master.yml34
-rw-r--r--qa/.confiner/nightly.yml19
-rw-r--r--qa/.confiner/quarantine.yml15
-rw-r--r--qa/.gitignore4
-rw-r--r--qa/.rspec_internal4
-rw-r--r--qa/Gemfile4
-rw-r--r--qa/Gemfile.lock8
-rw-r--r--qa/qa/fixtures/package_managers/npm/npm_upload_install_package_project.yaml.erb1
-rw-r--r--qa/qa/fixtures/script_extensions/test.html6
-rw-r--r--qa/qa/flow/pipeline.rb21
-rw-r--r--qa/qa/page/admin/settings/component/performance_bar.rb2
-rw-r--r--qa/qa/page/admin/settings/component/snowplow.rb4
-rw-r--r--qa/qa/page/admin/settings/component/usage_statistics.rb2
-rw-r--r--qa/qa/page/base.rb10
-rw-r--r--qa/qa/page/component/access_tokens.rb4
-rw-r--r--qa/qa/page/component/confirm_modal.rb12
-rw-r--r--qa/qa/page/component/members_filter.rb9
-rw-r--r--qa/qa/page/component/wiki_page_form.rb1
-rw-r--r--qa/qa/page/dashboard/todos.rb6
-rw-r--r--qa/qa/page/main/login.rb15
-rw-r--r--qa/qa/page/main/menu.rb9
-rw-r--r--qa/qa/page/project/import/github.rb3
-rw-r--r--qa/qa/page/project/infrastructure/kubernetes/index.rb7
-rw-r--r--qa/qa/page/project/new.rb5
-rw-r--r--qa/qa/page/project/pipeline/index.rb50
-rw-r--r--qa/qa/page/project/pipeline/new.rb12
-rw-r--r--qa/qa/page/project/pipeline/show.rb40
-rw-r--r--qa/qa/page/project/pipeline_editor/show.rb22
-rw-r--r--qa/qa/page/project/settings/services/jenkins.rb16
-rw-r--r--qa/qa/resource/bulk_import_group.rb16
-rw-r--r--qa/qa/resource/project.rb40
-rw-r--r--qa/qa/resource/runner.rb41
-rw-r--r--qa/qa/runtime/api/repository_storage_moves.rb2
-rw-r--r--qa/qa/runtime/browser.rb23
-rw-r--r--qa/qa/runtime/env.rb8
-rw-r--r--qa/qa/runtime/script_extensions/interceptor.js158
-rw-r--r--qa/qa/scenario/bootable.rb2
-rw-r--r--qa/qa/scenario/shared_attributes.rb1
-rw-r--r--qa/qa/service/docker_run/base.rb6
-rw-r--r--qa/qa/service/docker_run/gitlab_runner.rb6
-rw-r--r--qa/qa/service/praefect_manager.rb8
-rw-r--r--qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb4
-rw-r--r--qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb57
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb412
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb6
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb20
-rw-r--r--qa/qa/specs/features/api/3_create/integrations/webhook_events_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb38
-rw-r--r--qa/qa/specs/features/api/4_verify/remove_runner_spec.rb18
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/log_into_mattermost_via_gitlab_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb64
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb91
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb18
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/multi-project_pipelines_spec.rb105
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb119
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb118
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb14
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb22
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_dependent_relationship_spec.rb113
-rw-r--r--qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_independent_relationship_spec.rb112
-rw-r--r--qa/qa/specs/helpers/feature_flag.rb34
-rw-r--r--qa/qa/specs/runner.rb19
-rw-r--r--qa/qa/support/api.rb13
-rw-r--r--qa/qa/support/formatters/feature_flag_formatter.rb36
-rw-r--r--qa/qa/support/formatters/test_stats_formatter.rb1
-rw-r--r--qa/qa/support/helpers/mask_token.rb19
-rw-r--r--qa/qa/support/helpers/plan.rb5
-rw-r--r--qa/qa/support/loglinking.rb4
-rw-r--r--qa/qa/support/matchers/have_matcher.rb1
-rw-r--r--qa/qa/support/page_error_checker.rb45
-rw-r--r--qa/qa/support/wait_for_requests.rb6
-rw-r--r--qa/qa/tools/reliable_report.rb125
-rw-r--r--qa/qa/tools/test_resources_handler.rb8
-rw-r--r--qa/qa/vendor/jenkins/page/configure_job.rb5
-rw-r--r--qa/spec/page/base_spec.rb43
-rw-r--r--qa/spec/page/logging_spec.rb32
-rw-r--r--qa/spec/resource/api_fabricator_spec.rb2
-rw-r--r--qa/spec/resource/base_spec.rb3
-rw-r--r--qa/spec/runtime/script_extensions/interceptor_spec.rb119
-rw-r--r--qa/spec/service/docker_run/gitlab_runner_spec.rb1
-rw-r--r--qa/spec/spec_helper.rb16
-rw-r--r--qa/spec/specs/allure_report_spec.rb13
-rw-r--r--qa/spec/specs/helpers/feature_flag_spec.rb164
-rw-r--r--qa/spec/specs/runner_spec.rb35
-rw-r--r--qa/spec/specs/scenario_shared_examples.rb76
-rw-r--r--qa/spec/specs/spec_helper.rb5
-rw-r--r--qa/spec/support/formatters/test_stats_formatter_spec.rb67
-rw-r--r--qa/spec/support/loglinking_spec.rb4
-rw-r--r--qa/spec/support/page_error_checker_spec.rb82
-rw-r--r--qa/spec/support/shared_contexts/merge_train_spec_with_user_prep.rb88
-rw-r--r--qa/spec/support/shared_contexts/variable_inheritance_shared_context.rb150
-rw-r--r--qa/spec/support/shared_examples/scenario_shared_examples.rb76
-rw-r--r--qa/spec/support/wait_for_requests_spec.rb17
-rw-r--r--qa/spec/tools/reliable_report_spec.rb76
-rw-r--r--rubocop/cop/database/disable_referential_integrity.rb32
-rw-r--r--rubocop/cop/gitlab/avoid_feature_category_not_owned.rb43
-rw-r--r--rubocop/cop/gitlab/mark_used_feature_flags.rb1
-rw-r--r--rubocop/cop/qa/duplicate_testcase_link.rb46
-rw-r--r--rubocop/cop/qa/testcase_link_format.rb45
-rwxr-xr-xscripts/frontend/graphql_possible_types_extraction.js69
-rw-r--r--scripts/frontend/startup_css/constants.js2
-rw-r--r--scripts/frontend/stylelint/stylelint-duplicate-selectors.js25
-rw-r--r--scripts/frontend/stylelint/stylelint-utility-classes.js25
-rw-r--r--scripts/frontend/stylelint/stylelint-utility-map.js64
-rw-r--r--scripts/frontend/stylelint/stylelint_duplicate_selectors.js25
-rw-r--r--scripts/frontend/stylelint/stylelint_utility_classes.js25
-rw-r--r--scripts/frontend/stylelint/stylelint_utility_map.js64
-rw-r--r--scripts/frontend/stylelint/stylelint_utils.js (renamed from scripts/frontend/stylelint/stylelint-utils.js)0
-rw-r--r--scripts/frontend/stylelint/utility_classes_map.js (renamed from scripts/frontend/stylelint/utility-classes-map.js)0
-rw-r--r--scripts/gitlab_workhorse_component_helpers.sh1
-rwxr-xr-xscripts/lint-doc.sh2
-rwxr-xr-xscripts/merge-simplecov5
-rwxr-xr-xscripts/qa/testcases-check79
-rw-r--r--scripts/review_apps/base-config.yaml13
-rwxr-xr-xscripts/review_apps/review-apps.sh4
-rwxr-xr-xscripts/static-analysis1
-rwxr-xr-xscripts/vendor_template57
-rwxr-xr-xscripts/verify-tff-mapping2
-rw-r--r--sidekiq_cluster/cli.rb12
-rw-r--r--spec/commands/sidekiq_cluster/cli_spec.rb12
-rw-r--r--spec/components/diffs/overflow_warning_component_spec.rb184
-rw-r--r--spec/components/diffs/stats_component_spec.rb67
-rw-r--r--spec/components/pajamas/alert_component_spec.rb104
-rw-r--r--spec/controllers/concerns/import_url_params_spec.rb18
-rw-r--r--spec/controllers/explore/projects_controller_spec.rb7
-rw-r--r--spec/controllers/graphql_controller_spec.rb63
-rw-r--r--spec/controllers/groups/group_links_controller_spec.rb117
-rw-r--r--spec/controllers/groups/runners_controller_spec.rb14
-rw-r--r--spec/controllers/groups_controller_spec.rb34
-rw-r--r--spec/controllers/help_controller_spec.rb6
-rw-r--r--spec/controllers/import/bitbucket_controller_spec.rb150
-rw-r--r--spec/controllers/import/github_controller_spec.rb42
-rw-r--r--spec/controllers/jira_connect/events_controller_spec.rb11
-rw-r--r--spec/controllers/jira_connect/subscriptions_controller_spec.rb18
-rw-r--r--spec/controllers/oauth/jira/authorizations_controller_spec.rb55
-rw-r--r--spec/controllers/oauth/jira_dvcs/authorizations_controller_spec.rb55
-rw-r--r--spec/controllers/profiles/accounts_controller_spec.rb2
-rw-r--r--spec/controllers/profiles/keys_controller_spec.rb20
-rw-r--r--spec/controllers/profiles/preferences_controller_spec.rb24
-rw-r--r--spec/controllers/profiles/two_factor_auths_controller_spec.rb25
-rw-r--r--spec/controllers/projects/artifacts_controller_spec.rb3
-rw-r--r--spec/controllers/projects/branches_controller_spec.rb14
-rw-r--r--spec/controllers/projects/commit_controller_spec.rb46
-rw-r--r--spec/controllers/projects/compare_controller_spec.rb32
-rw-r--r--spec/controllers/projects/environments_controller_spec.rb28
-rw-r--r--spec/controllers/projects/group_links_controller_spec.rb130
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb7
-rw-r--r--spec/controllers/projects/jobs_controller_spec.rb2
-rw-r--r--spec/controllers/projects/notes_controller_spec.rb16
-rw-r--r--spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb12
-rw-r--r--spec/controllers/projects/pipelines/tests_controller_spec.rb68
-rw-r--r--spec/controllers/projects/services_controller_spec.rb5
-rw-r--r--spec/controllers/projects/static_site_editor_controller_spec.rb65
-rw-r--r--spec/controllers/projects/todos_controller_spec.rb2
-rw-r--r--spec/controllers/projects/usage_quotas_controller_spec.rb37
-rw-r--r--spec/controllers/projects_controller_spec.rb63
-rw-r--r--spec/controllers/search_controller_spec.rb1
-rw-r--r--spec/controllers/sessions_controller_spec.rb10
-rw-r--r--spec/controllers/uploads_controller_spec.rb18
-rw-r--r--spec/db/migration_spec.rb32
-rw-r--r--spec/db/schema_spec.rb35
-rw-r--r--spec/deprecation_toolkit_env.rb3
-rw-r--r--spec/events/ci/pipeline_created_event_spec.rb27
-rw-r--r--spec/experiments/ios_specific_templates_experiment_spec.rb62
-rw-r--r--spec/experiments/new_project_sast_enabled_experiment_spec.rb20
-rw-r--r--spec/experiments/video_tutorials_continuous_onboarding_experiment_spec.rb9
-rw-r--r--spec/factories/alert_management/metric_images.rb16
-rw-r--r--spec/factories/application_settings.rb1
-rw-r--r--spec/factories/ci/builds.rb72
-rw-r--r--spec/factories/ci/job_artifacts.rb50
-rw-r--r--spec/factories/custom_emoji.rb3
-rw-r--r--spec/factories/events.rb5
-rw-r--r--spec/factories/gitlab/database/background_migration/batched_migrations.rb20
-rw-r--r--spec/factories/go_module_versions.rb14
-rw-r--r--spec/factories/groups.rb9
-rw-r--r--spec/factories/integrations.rb2
-rw-r--r--spec/factories/issues.rb5
-rw-r--r--spec/factories/keys.rb8
-rw-r--r--spec/factories/merge_requests.rb3
-rw-r--r--spec/factories/project_statistics.rb1
-rw-r--r--spec/factories/projects.rb13
-rw-r--r--spec/factories/work_items/work_item_types.rb5
-rw-r--r--spec/fast_spec_helper.rb1
-rw-r--r--spec/features/admin/admin_broadcast_messages_spec.rb7
-rw-r--r--spec/features/admin/admin_dev_ops_report_spec.rb68
-rw-r--r--spec/features/admin/admin_dev_ops_reports_spec.rb68
-rw-r--r--spec/features/admin/admin_runners_spec.rb292
-rw-r--r--spec/features/admin/admin_sees_background_migrations_spec.rb10
-rw-r--r--spec/features/admin/admin_settings_spec.rb93
-rw-r--r--spec/features/admin/admin_users_impersonation_tokens_spec.rb4
-rw-r--r--spec/features/admin/clusters/eks_spec.rb4
-rw-r--r--spec/features/boards/boards_spec.rb2
-rw-r--r--spec/features/boards/focus_mode_spec.rb2
-rw-r--r--spec/features/boards/multi_select_spec.rb6
-rw-r--r--spec/features/clusters/create_agent_spec.rb4
-rw-r--r--spec/features/commit_spec.rb4
-rw-r--r--spec/features/commits_spec.rb3
-rw-r--r--spec/features/error_tracking/user_searches_sentry_errors_spec.rb2
-rw-r--r--spec/features/groups/clusters/eks_spec.rb4
-rw-r--r--spec/features/groups/clusters/user_spec.rb3
-rw-r--r--spec/features/groups/group_runners_spec.rb168
-rw-r--r--spec/features/groups/import_export/export_file_spec.rb16
-rw-r--r--spec/features/groups/members/manage_groups_spec.rb149
-rw-r--r--spec/features/groups/members/manage_members_spec.rb139
-rw-r--r--spec/features/groups/members/sort_members_spec.rb40
-rw-r--r--spec/features/groups/milestone_spec.rb2
-rw-r--r--spec/features/groups/milestones_sorting_spec.rb14
-rw-r--r--spec/features/groups/settings/ci_cd_spec.rb81
-rw-r--r--spec/features/issuables/shortcuts_issuable_spec.rb12
-rw-r--r--spec/features/issues/incident_issue_spec.rb32
-rw-r--r--spec/features/issues/user_creates_issue_spec.rb6
-rw-r--r--spec/features/issues/user_edits_issue_spec.rb6
-rw-r--r--spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb37
-rw-r--r--spec/features/jira_connect/subscriptions_spec.rb2
-rw-r--r--spec/features/jira_oauth_provider_authorize_spec.rb6
-rw-r--r--spec/features/merge_request/user_merges_merge_request_spec.rb21
-rw-r--r--spec/features/merge_request/user_posts_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb3
-rw-r--r--spec/features/merge_request/user_suggests_changes_on_diff_spec.rb37
-rw-r--r--spec/features/merge_requests/user_mass_updates_spec.rb2
-rw-r--r--spec/features/milestones/user_deletes_milestone_spec.rb2
-rw-r--r--spec/features/oauth_login_spec.rb2
-rw-r--r--spec/features/profiles/personal_access_tokens_spec.rb4
-rw-r--r--spec/features/profiles/user_edit_profile_spec.rb25
-rw-r--r--spec/features/profiles/user_visits_profile_preferences_page_spec.rb8
-rw-r--r--spec/features/projects/blobs/balsamiq_spec.rb17
-rw-r--r--spec/features/projects/blobs/blob_line_permalink_updater_spec.rb8
-rw-r--r--spec/features/projects/branches_spec.rb10
-rw-r--r--spec/features/projects/cluster_agents_spec.rb1
-rw-r--r--spec/features/projects/clusters/eks_spec.rb2
-rw-r--r--spec/features/projects/clusters/gcp_spec.rb5
-rw-r--r--spec/features/projects/clusters/user_spec.rb5
-rw-r--r--spec/features/projects/clusters_spec.rb5
-rw-r--r--spec/features/projects/commits/multi_view_diff_spec.rb79
-rw-r--r--spec/features/projects/environments/environments_spec.rb6
-rw-r--r--spec/features/projects/import_export/import_file_spec.rb6
-rw-r--r--spec/features/projects/issues/design_management/user_uploads_designs_spec.rb4
-rw-r--r--spec/features/projects/jobs/user_browses_jobs_spec.rb11
-rw-r--r--spec/features/projects/members/groups_with_access_list_spec.rb5
-rw-r--r--spec/features/projects/members/invite_group_spec.rb116
-rw-r--r--spec/features/projects/members/list_spec.rb206
-rw-r--r--spec/features/projects/members/manage_members_spec.rb205
-rw-r--r--spec/features/projects/members/sorting_spec.rb40
-rw-r--r--spec/features/projects/milestones/milestones_sorting_spec.rb62
-rw-r--r--spec/features/projects/new_project_spec.rb11
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb13
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb1
-rw-r--r--spec/features/projects/releases/user_views_releases_spec.rb154
-rw-r--r--spec/features/projects/terraform_spec.rb2
-rw-r--r--spec/features/projects/user_creates_project_spec.rb28
-rw-r--r--spec/features/projects/user_sorts_projects_spec.rb28
-rw-r--r--spec/features/projects_spec.rb39
-rw-r--r--spec/features/refactor_blob_viewer_disabled/projects/blobs/balsamiq_spec.rb18
-rw-r--r--spec/features/runners_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_projects_spec.rb2
-rw-r--r--spec/features/search/user_uses_header_search_field_spec.rb38
-rw-r--r--spec/features/static_site_editor_spec.rb113
-rw-r--r--spec/features/task_lists_spec.rb16
-rw-r--r--spec/features/users/login_spec.rb11
-rw-r--r--spec/finders/bulk_imports/entities_finder_spec.rb32
-rw-r--r--spec/finders/bulk_imports/imports_finder_spec.rb24
-rw-r--r--spec/finders/ci/jobs_finder_spec.rb22
-rw-r--r--spec/finders/concerns/finder_methods_spec.rb51
-rw-r--r--spec/finders/concerns/finder_with_cross_project_access_spec.rb4
-rw-r--r--spec/finders/keys_finder_spec.rb55
-rw-r--r--spec/finders/packages/build_infos_for_many_packages_finder_spec.rb136
-rw-r--r--spec/finders/packages/group_packages_finder_spec.rb16
-rw-r--r--spec/finders/packages/packages_finder_spec.rb16
-rw-r--r--spec/finders/releases/group_releases_finder_spec.rb15
-rw-r--r--spec/finders/user_recent_events_finder_spec.rb356
-rw-r--r--spec/finders/users_finder_spec.rb50
-rw-r--r--spec/fixtures/api/schemas/entities/member_user.json15
-rw-r--r--spec/fixtures/api/schemas/group_link/group_group_link.json15
-rw-r--r--spec/fixtures/api/schemas/group_link/group_link.json10
-rw-r--r--spec/fixtures/api/schemas/group_link/project_group_link.json14
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/agent.json18
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/agents.json4
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/issue.json1
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/issue_links.json9
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/project_identity.json22
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/related_issues.json26
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/release/release_for_guest.json1
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/resource_access_token.json31
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/resource_access_tokens.json4
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/user/admin.json3
-rw-r--r--spec/fixtures/avatars/avatar1.pngbin0 -> 1461 bytes
-rw-r--r--spec/fixtures/avatars/avatar2.pngbin0 -> 1665 bytes
-rw-r--r--spec/fixtures/avatars/avatar3.pngbin0 -> 1767 bytes
-rw-r--r--spec/fixtures/avatars/avatar4.pngbin0 -> 1624 bytes
-rw-r--r--spec/fixtures/avatars/avatar5.pngbin0 -> 1700 bytes
-rw-r--r--spec/fixtures/emails/service_desk_reply_to_and_from.eml28
-rw-r--r--spec/fixtures/markdown/markdown_golden_master_examples.yml28
-rw-r--r--spec/fixtures/security_reports/master/gl-sast-report-bandit.json43
-rw-r--r--spec/fixtures/security_reports/master/gl-sast-report-gosec.json68
-rw-r--r--spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-bandit.json71
-rw-r--r--spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-gosec.json70
-rw-r--r--spec/frontend/__helpers__/matchers/index.js1
-rw-r--r--spec/frontend/__helpers__/matchers/to_validate_json_schema.js34
-rw-r--r--spec/frontend/__helpers__/matchers/to_validate_json_schema_spec.js65
-rw-r--r--spec/frontend/__helpers__/mock_apollo_helper.js2
-rw-r--r--spec/frontend/__helpers__/mock_dom_observer.js4
-rw-r--r--spec/frontend/__helpers__/vuex_action_helper.js1
-rw-r--r--spec/frontend/__helpers__/yaml_transformer.js11
-rw-r--r--spec/frontend/access_tokens/components/__snapshots__/expires_at_field_spec.js.snap2
-rw-r--r--spec/frontend/add_context_commits_modal/store/actions_spec.js67
-rw-r--r--spec/frontend/admin/statistics_panel/store/actions_spec.js37
-rw-r--r--spec/frontend/admin/topics/components/remove_avatar_spec.js11
-rw-r--r--spec/frontend/admin/users/components/actions/actions_spec.js42
-rw-r--r--spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap174
-rw-r--r--spec/frontend/admin/users/components/modals/delete_user_modal_spec.js104
-rw-r--r--spec/frontend/admin/users/components/modals/user_modal_manager_spec.js126
-rw-r--r--spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js3
-rw-r--r--spec/frontend/alerts_settings/components/mocks/apollo_mock.js2
-rw-r--r--spec/frontend/api/alert_management_alerts_api_spec.js140
-rw-r--r--spec/frontend/api_spec.js600
-rw-r--r--spec/frontend/authentication/u2f/authenticate_spec.js15
-rw-r--r--spec/frontend/authentication/u2f/register_spec.js4
-rw-r--r--spec/frontend/badges/components/badge_spec.js6
-rw-r--r--spec/frontend/badges/store/actions_spec.js260
-rw-r--r--spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js98
-rw-r--r--spec/frontend/behaviors/gl_emoji_spec.js6
-rw-r--r--spec/frontend/blob/balsamiq/balsamiq_viewer_spec.js363
-rw-r--r--spec/frontend/boards/boards_util_spec.js30
-rw-r--r--spec/frontend/boards/components/board_filtered_search_spec.js4
-rw-r--r--spec/frontend/boards/components/board_form_spec.js2
-rw-r--r--spec/frontend/boards/components/board_top_bar_spec.js88
-rw-r--r--spec/frontend/boards/components/boards_selector_spec.js14
-rw-r--r--spec/frontend/boards/components/issuable_title_spec.js33
-rw-r--r--spec/frontend/boards/components/issue_board_filtered_search_spec.js3
-rw-r--r--spec/frontend/boards/components/issue_time_estimate_spec.js8
-rw-r--r--spec/frontend/boards/components/item_count_spec.js6
-rw-r--r--spec/frontend/boards/stores/actions_spec.js70
-rw-r--r--spec/frontend/captcha/apollo_captcha_link_spec.js94
-rw-r--r--spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js2
-rw-r--r--spec/frontend/ci_variable_list/store/actions_spec.js92
-rw-r--r--spec/frontend/clusters_list/components/agent_empty_state_spec.js20
-rw-r--r--spec/frontend/clusters_list/components/agent_table_spec.js2
-rw-r--r--spec/frontend/clusters_list/components/agent_token_spec.js8
-rw-r--r--spec/frontend/clusters_list/components/agents_spec.js2
-rw-r--r--spec/frontend/clusters_list/components/available_agents_dropwdown_spec.js21
-rw-r--r--spec/frontend/clusters_list/components/clusters_actions_spec.js107
-rw-r--r--spec/frontend/clusters_list/components/clusters_empty_state_spec.js45
-rw-r--r--spec/frontend/clusters_list/components/clusters_view_all_spec.js93
-rw-r--r--spec/frontend/clusters_list/mocks/apollo.js1
-rw-r--r--spec/frontend/clusters_list/store/actions_spec.js101
-rw-r--r--spec/frontend/code_navigation/components/app_spec.js7
-rw-r--r--spec/frontend/code_navigation/store/actions_spec.js64
-rw-r--r--spec/frontend/code_navigation/store/mutations_spec.js2
-rw-r--r--spec/frontend/code_navigation/utils/index_spec.js30
-rw-r--r--spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js57
-rw-r--r--spec/frontend/commit/components/commit_box_pipeline_status_spec.js150
-rw-r--r--spec/frontend/commit/mock_data.js46
-rw-r--r--spec/frontend/commit/pipelines/pipelines_table_spec.js16
-rw-r--r--spec/frontend/commit/pipelines/utils_spec.js59
-rw-r--r--spec/frontend/commits_spec.js28
-rw-r--r--spec/frontend/confidential_merge_request/components/__snapshots__/project_form_group_spec.js.snap8
-rw-r--r--spec/frontend/content_editor/components/code_block_bubble_menu_spec.js142
-rw-r--r--spec/frontend/content_editor/components/formatting_bubble_menu_spec.js2
-rw-r--r--spec/frontend/content_editor/components/wrappers/image_spec.js66
-rw-r--r--spec/frontend/content_editor/components/wrappers/media_spec.js69
-rw-r--r--spec/frontend/content_editor/extensions/attachment_spec.js79
-rw-r--r--spec/frontend/content_editor/extensions/code_block_highlight_spec.js74
-rw-r--r--spec/frontend/content_editor/extensions/frontmatter_spec.js2
-rw-r--r--spec/frontend/content_editor/services/code_block_language_loader_spec.js120
-rw-r--r--spec/frontend/content_editor/services/content_editor_spec.js24
-rw-r--r--spec/frontend/contributors/store/actions_spec.js26
-rw-r--r--spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js25
-rw-r--r--spec/frontend/crm/contact_form_spec.js157
-rw-r--r--spec/frontend/crm/contact_form_wrapper_spec.js88
-rw-r--r--spec/frontend/crm/contacts_root_spec.js77
-rw-r--r--spec/frontend/crm/form_spec.js51
-rw-r--r--spec/frontend/crm/mock_data.js25
-rw-r--r--spec/frontend/crm/new_organization_form_spec.js109
-rw-r--r--spec/frontend/crm/organization_form_wrapper_spec.js88
-rw-r--r--spec/frontend/crm/organizations_root_spec.js51
-rw-r--r--spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap28
-rw-r--r--spec/frontend/design_management/components/design_notes/design_discussion_spec.js7
-rw-r--r--spec/frontend/design_management/components/design_notes/design_note_spec.js37
-rw-r--r--spec/frontend/design_management/pages/index_spec.js2
-rw-r--r--spec/frontend/diffs/components/commit_item_spec.js9
-rw-r--r--spec/frontend/diffs/components/diff_line_note_form_spec.js19
-rw-r--r--spec/frontend/diffs/store/actions_spec.js439
-rw-r--r--spec/frontend/diffs/store/utils_spec.js2
-rw-r--r--spec/frontend/editor/components/helpers.js12
-rw-r--r--spec/frontend/editor/components/source_editor_toolbar_button_spec.js146
-rw-r--r--spec/frontend/editor/components/source_editor_toolbar_spec.js116
-rw-r--r--spec/frontend/editor/schema/ci/ci_schema_spec.js90
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/negative_tests/default_no_additional_properties.json12
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/negative_tests/inherit_default_no_additional_properties.json8
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/negative_tests/job_variables_must_not_contain_objects.json12
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_empty.json13
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_invalid_link_type.json24
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_missing.json11
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/negative_tests/retry_unknown_when.json9
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/allow_failure.json19
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/environment.json75
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci-dependencies.json68
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json350
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/inherit.json54
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/multiple-caches.json24
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/retry.json60
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/terraform_report.json50
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/variables.json22
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/variables_mix_string_and_user_input.json10
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/negative_tests/cache.yml15
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/negative_tests/include.yml17
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/positive_tests/cache.yml25
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/positive_tests/filter.yml18
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/positive_tests/include.yml32
-rw-r--r--spec/frontend/editor/schema/ci/yaml_tests/positive_tests/rules.yml13
-rw-r--r--spec/frontend/environments/deploy_board_component_spec.js16
-rw-r--r--spec/frontend/environments/empty_state_spec.js53
-rw-r--r--spec/frontend/environments/emtpy_state_spec.js24
-rw-r--r--spec/frontend/environments/environment_item_spec.js53
-rw-r--r--spec/frontend/environments/environment_table_spec.js5
-rw-r--r--spec/frontend/environments/graphql/mock_data.js2
-rw-r--r--spec/frontend/environments/new_environment_item_spec.js28
-rw-r--r--spec/frontend/error_tracking/store/actions_spec.js19
-rw-r--r--spec/frontend/error_tracking/store/details/actions_spec.js26
-rw-r--r--spec/frontend/error_tracking/store/list/actions_spec.js16
-rw-r--r--spec/frontend/error_tracking_settings/store/actions_spec.js72
-rw-r--r--spec/frontend/feature_flags/store/edit/actions_spec.js55
-rw-r--r--spec/frontend/feature_flags/store/index/actions_spec.js86
-rw-r--r--spec/frontend/feature_flags/store/new/actions_spec.js25
-rw-r--r--spec/frontend/filtered_search/droplab/plugins/ajax_filter_spec.js22
-rw-r--r--spec/frontend/filtered_search/filtered_search_manager_spec.js18
-rw-r--r--spec/frontend/filtered_search/services/recent_searches_service_spec.js58
-rw-r--r--spec/frontend/filtered_search/visual_token_value_spec.js91
-rw-r--r--spec/frontend/fixtures/startup_css.rb8
-rw-r--r--spec/frontend/frequent_items/store/actions_spec.js70
-rw-r--r--spec/frontend/google_cloud/components/app_spec.js2
-rw-r--r--spec/frontend/gpg_badges_spec.js52
-rw-r--r--spec/frontend/groups/components/item_type_icon_spec.js25
-rw-r--r--spec/frontend/header_search/components/app_spec.js14
-rw-r--r--spec/frontend/header_search/components/header_search_autocomplete_items_spec.js98
-rw-r--r--spec/frontend/header_search/components/header_search_scoped_items_spec.js31
-rw-r--r--spec/frontend/header_search/mock_data.js131
-rw-r--r--spec/frontend/header_spec.js10
-rw-r--r--spec/frontend/ide/components/commit_sidebar/form_spec.js2
-rw-r--r--spec/frontend/ide/components/ide_side_bar_spec.js2
-rw-r--r--spec/frontend/ide/components/new_dropdown/upload_spec.js22
-rw-r--r--spec/frontend/ide/stores/actions/merge_request_spec.js387
-rw-r--r--spec/frontend/ide/stores/actions/project_spec.js172
-rw-r--r--spec/frontend/ide/stores/actions/tree_spec.js92
-rw-r--r--spec/frontend/ide/stores/actions_spec.js537
-rw-r--r--spec/frontend/ide/stores/modules/branches/actions_spec.js30
-rw-r--r--spec/frontend/ide/stores/modules/clientside/actions_spec.js8
-rw-r--r--spec/frontend/ide/stores/modules/commit/actions_spec.js384
-rw-r--r--spec/frontend/ide/stores/modules/file_templates/actions_spec.js62
-rw-r--r--spec/frontend/ide/stores/modules/merge_requests/actions_spec.js35
-rw-r--r--spec/frontend/ide/stores/modules/pane/actions_spec.js27
-rw-r--r--spec/frontend/ide/stores/modules/pipelines/actions_spec.js152
-rw-r--r--spec/frontend/ide/stores/modules/terminal_sync/actions_spec.js31
-rw-r--r--spec/frontend/ide/stores/plugins/terminal_spec.js16
-rw-r--r--spec/frontend/image_diff/init_discussion_tab_spec.js6
-rw-r--r--spec/frontend/image_diff/replaced_image_diff_spec.js64
-rw-r--r--spec/frontend/import_entities/components/import_status_spec.js145
-rw-r--r--spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js2
-rw-r--r--spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js7
-rw-r--r--spec/frontend/import_entities/import_projects/store/mutations_spec.js29
-rw-r--r--spec/frontend/incidents/components/incidents_list_spec.js30
-rw-r--r--spec/frontend/integrations/edit/components/integration_form_spec.js63
-rw-r--r--spec/frontend/integrations/edit/components/jira_issues_fields_spec.js44
-rw-r--r--spec/frontend/invite_members/components/group_select_spec.js5
-rw-r--r--spec/frontend/invite_members/components/invite_groups_modal_spec.js13
-rw-r--r--spec/frontend/invite_members/components/invite_members_modal_spec.js131
-rw-r--r--spec/frontend/invite_members/components/invite_modal_base_spec.js24
-rw-r--r--spec/frontend/invite_members/components/members_token_select_spec.js4
-rw-r--r--spec/frontend/invite_members/components/user_limit_notification_spec.js71
-rw-r--r--spec/frontend/invite_members/mock_data/api_responses.js62
-rw-r--r--spec/frontend/invite_members/mock_data/group_modal.js1
-rw-r--r--spec/frontend/invite_members/mock_data/member_modal.js1
-rw-r--r--spec/frontend/invite_members/utils/response_message_parser_spec.js28
-rw-r--r--spec/frontend/issuable/issuable_form_spec.js44
-rw-r--r--spec/frontend/issues/create_merge_request_dropdown_spec.js19
-rw-r--r--spec/frontend/issues/list/components/issue_card_time_info_spec.js13
-rw-r--r--spec/frontend/issues/list/components/issues_list_app_spec.js27
-rw-r--r--spec/frontend/issues/list/mock_data.js2
-rw-r--r--spec/frontend/issues/related_merge_requests/store/actions_spec.js40
-rw-r--r--spec/frontend/issues/show/components/app_spec.js84
-rw-r--r--spec/frontend/issues/show/components/description_spec.js170
-rw-r--r--spec/frontend/issues/show/components/fields/description_spec.js5
-rw-r--r--spec/frontend/issues/show/components/fields/description_template_spec.js101
-rw-r--r--spec/frontend/issues/show/components/fields/title_spec.js4
-rw-r--r--spec/frontend/issues/show/components/incidents/incident_tabs_spec.js18
-rw-r--r--spec/frontend/issues/show/mock_data/mock_data.js15
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js2
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/app_spec.js28
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/browser_support_alert_spec.js37
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/compatibility_alert_spec.js2
-rw-r--r--spec/frontend/jira_connect/subscriptions/pages/sign_in_spec.js2
-rw-r--r--spec/frontend/jira_import/components/jira_import_form_spec.js21
-rw-r--r--spec/frontend/jobs/components/filtered_search/jobs_filtered_search_spec.js49
-rw-r--r--spec/frontend/jobs/components/filtered_search/tokens/job_status_token_spec.js57
-rw-r--r--spec/frontend/jobs/components/job_app_spec.js23
-rw-r--r--spec/frontend/jobs/components/table/graphql/cache_config_spec.js20
-rw-r--r--spec/frontend/jobs/components/table/job_table_app_spec.js105
-rw-r--r--spec/frontend/jobs/components/table/jobs_table_tabs_spec.js46
-rw-r--r--spec/frontend/jobs/components/trigger_block_spec.js7
-rw-r--r--spec/frontend/jobs/mock_data.js16
-rw-r--r--spec/frontend/jobs/store/actions_spec.js138
-rw-r--r--spec/frontend/labels/components/promote_label_modal_spec.js38
-rw-r--r--spec/frontend/lib/apollo/suppress_network_errors_during_navigation_link_spec.js39
-rw-r--r--spec/frontend/lib/gfm/index_spec.js46
-rw-r--r--spec/frontend/lib/utils/apollo_startup_js_link_spec.js51
-rw-r--r--spec/frontend/lib/utils/common_utils_spec.js69
-rw-r--r--spec/frontend/lib/utils/confirm_via_gl_modal/confirm_modal_spec.js26
-rw-r--r--spec/frontend/lib/utils/datetime/date_calculation_utility_spec.js17
-rw-r--r--spec/frontend/lib/utils/datetime/date_format_utility_spec.js12
-rw-r--r--spec/frontend/lib/utils/datetime/timeago_utility_spec.js50
-rw-r--r--spec/frontend/lib/utils/poll_spec.js60
-rw-r--r--spec/frontend/lib/utils/text_markdown_spec.js17
-rw-r--r--spec/frontend/lib/utils/unit_format/formatter_factory_spec.js50
-rw-r--r--spec/frontend/lib/utils/unit_format/index_spec.js15
-rw-r--r--spec/frontend/lib/utils/users_cache_spec.js108
-rw-r--r--spec/frontend/members/components/table/members_table_spec.js19
-rw-r--r--spec/frontend/members/mock_data.js3
-rw-r--r--spec/frontend/merge_conflicts/store/actions_spec.js85
-rw-r--r--spec/frontend/milestones/components/delete_milestone_modal_spec.js37
-rw-r--r--spec/frontend/milestones/components/milestone_combobox_spec.js22
-rw-r--r--spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap8
-rw-r--r--spec/frontend/monitoring/components/__snapshots__/empty_state_spec.js.snap3
-rw-r--r--spec/frontend/monitoring/components/__snapshots__/group_empty_state_spec.js.snap7
-rw-r--r--spec/frontend/monitoring/components/dashboard_actions_menu_spec.js4
-rw-r--r--spec/frontend/monitoring/components/dashboard_url_time_spec.js2
-rw-r--r--spec/frontend/monitoring/store/actions_spec.js335
-rw-r--r--spec/frontend/monitoring/store/utils_spec.js4
-rw-r--r--spec/frontend/mr_notes/stores/actions_spec.js88
-rw-r--r--spec/frontend/notes/components/diff_discussion_header_spec.js2
-rw-r--r--spec/frontend/notes/components/note_actions_spec.js3
-rw-r--r--spec/frontend/notes/components/note_form_spec.js9
-rw-r--r--spec/frontend/notes/components/note_header_spec.js28
-rw-r--r--spec/frontend/notes/components/noteable_discussion_spec.js1
-rw-r--r--spec/frontend/notes/components/noteable_note_spec.js2
-rw-r--r--spec/frontend/notes/components/notes_app_spec.js8
-rw-r--r--spec/frontend/notes/components/sort_discussion_spec.js4
-rw-r--r--spec/frontend/notes/deprecated_notes_spec.js11
-rw-r--r--spec/frontend/notes/stores/actions_spec.js407
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/delete_button_spec.js67
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js10
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js10
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js2
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/pages/list_spec.js31
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/app_spec.js70
-rw-r--r--spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_header_spec.js88
-rw-r--r--spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_row_spec.js99
-rw-r--r--spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_spec.js39
-rw-r--r--spec/frontend/packages_and_registries/harbor_registry/mock_data.js175
-rw-r--r--spec/frontend/packages_and_registries/harbor_registry/pages/index_spec.js24
-rw-r--r--spec/frontend/packages_and_registries/harbor_registry/pages/list_spec.js140
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/actions_spec.js108
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap2
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/list/stores/actions_spec.js129
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/packages_search_spec.js1
-rw-r--r--spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap2
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js24
-rw-r--r--spec/frontend/packages_and_registries/shared/components/__snapshots__/cleanup_policy_enabled_alert_spec.js.snap19
-rw-r--r--spec/frontend/packages_and_registries/shared/components/__snapshots__/registry_breadcrumb_spec.js.snap10
-rw-r--r--spec/frontend/packages_and_registries/shared/components/cleanup_policy_enabled_alert_spec.js49
-rw-r--r--spec/frontend/packages_and_registries/shared/components/registry_breadcrumb_spec.js8
-rw-r--r--spec/frontend/pager_spec.js57
-rw-r--r--spec/frontend/pages/admin/application_settings/account_and_limits_spec.js3
-rw-r--r--spec/frontend/pages/admin/jobs/index/components/stop_jobs_modal_spec.js22
-rw-r--r--spec/frontend/pages/dashboard/todos/index/todos_spec.js8
-rw-r--r--spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js10
-rw-r--r--spec/frontend/pages/import/history/components/import_error_details_spec.js66
-rw-r--r--spec/frontend/pages/import/history/components/import_history_app_spec.js205
-rw-r--r--spec/frontend/pages/profiles/show/emoji_menu_spec.js16
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_section_card_spec.js.snap37
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap452
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js53
-rw-r--r--spec/frontend/pages/projects/shared/permissions/components/project_feature_settings_spec.js30
-rw-r--r--spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js63
-rw-r--r--spec/frontend/pages/shared/wikis/components/wiki_content_spec.js97
-rw-r--r--spec/frontend/pages/shared/wikis/components/wiki_form_spec.js192
-rw-r--r--spec/frontend/pdf/page_spec.js16
-rw-r--r--spec/frontend/pipeline_editor/components/drawer/pipeline_editor_drawer_spec.js137
-rw-r--r--spec/frontend/pipeline_editor/components/editor/ci_editor_header_spec.js53
-rw-r--r--spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js1
-rw-r--r--spec/frontend/pipeline_editor/pipeline_editor_home_spec.js99
-rw-r--r--spec/frontend/pipeline_wizard/components/wrapper_spec.js84
-rw-r--r--spec/frontend/pipeline_wizard/mock/yaml.js11
-rw-r--r--spec/frontend/pipelines/components/pipeline_tabs_spec.js61
-rw-r--r--spec/frontend/pipelines/components/pipelines_filtered_search_spec.js2
-rw-r--r--spec/frontend/pipelines/empty_state/ci_templates_spec.js85
-rw-r--r--spec/frontend/pipelines/empty_state/pipelines_ci_templates_spec.js158
-rw-r--r--spec/frontend/pipelines/empty_state_spec.js2
-rw-r--r--spec/frontend/pipelines/graph/action_component_spec.js11
-rw-r--r--spec/frontend/pipelines/graph/graph_component_wrapper_spec.js6
-rw-r--r--spec/frontend/pipelines/pipeline_triggerer_spec.js81
-rw-r--r--spec/frontend/pipelines/pipeline_url_spec.js25
-rw-r--r--spec/frontend/pipelines/pipelines_ci_templates_spec.js206
-rw-r--r--spec/frontend/pipelines/pipelines_spec.js2
-rw-r--r--spec/frontend/pipelines/test_reports/stores/actions_spec.js51
-rw-r--r--spec/frontend/profile/add_ssh_key_validation_spec.js2
-rw-r--r--spec/frontend/profile/preferences/components/__snapshots__/diffs_colors_preview_spec.js.snap915
-rw-r--r--spec/frontend/profile/preferences/components/diffs_colors_preview_spec.js23
-rw-r--r--spec/frontend/profile/preferences/components/diffs_colors_spec.js153
-rw-r--r--spec/frontend/profile/preferences/components/integration_view_spec.js33
-rw-r--r--spec/frontend/projects/commit/store/actions_spec.js16
-rw-r--r--spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap2
-rw-r--r--spec/frontend/projects/new/components/deployment_target_select_spec.js39
-rw-r--r--spec/frontend/projects/new/components/new_project_url_select_spec.js37
-rw-r--r--spec/frontend/releases/components/app_index_apollo_client_spec.js398
-rw-r--r--spec/frontend/releases/components/app_index_spec.js483
-rw-r--r--spec/frontend/releases/components/app_show_spec.js6
-rw-r--r--spec/frontend/releases/components/releases_pagination_apollo_client_spec.js126
-rw-r--r--spec/frontend/releases/components/releases_pagination_spec.js180
-rw-r--r--spec/frontend/releases/components/releases_sort_apollo_client_spec.js103
-rw-r--r--spec/frontend/releases/components/releases_sort_spec.js122
-rw-r--r--spec/frontend/releases/stores/modules/list/actions_spec.js197
-rw-r--r--spec/frontend/releases/stores/modules/list/helpers.js5
-rw-r--r--spec/frontend/releases/stores/modules/list/mutations_spec.js81
-rw-r--r--spec/frontend/reports/accessibility_report/store/actions_spec.js30
-rw-r--r--spec/frontend/reports/codequality_report/components/codequality_issue_body_spec.js1
-rw-r--r--spec/frontend/reports/codequality_report/grouped_codequality_reports_app_spec.js4
-rw-r--r--spec/frontend/reports/codequality_report/store/actions_spec.js44
-rw-r--r--spec/frontend/reports/components/report_section_spec.js31
-rw-r--r--spec/frontend/reports/components/summary_row_spec.js34
-rw-r--r--spec/frontend/reports/grouped_test_report/store/actions_spec.js44
-rw-r--r--spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap111
-rw-r--r--spec/frontend/repository/components/blob_content_viewer_spec.js19
-rw-r--r--spec/frontend/repository/components/breadcrumbs_spec.js45
-rw-r--r--spec/frontend/repository/components/last_commit_spec.js23
-rw-r--r--spec/frontend/runner/admin_runners/admin_runners_app_spec.js111
-rw-r--r--spec/frontend/runner/components/__snapshots__/runner_status_popover_spec.js.snap3
-rw-r--r--spec/frontend/runner/components/cells/runner_actions_cell_spec.js22
-rw-r--r--spec/frontend/runner/components/cells/runner_summary_cell_spec.js6
-rw-r--r--spec/frontend/runner/components/registration/registration_dropdown_spec.js17
-rw-r--r--spec/frontend/runner/components/registration/registration_token_spec.js75
-rw-r--r--spec/frontend/runner/components/runner_assigned_item_spec.js3
-rw-r--r--spec/frontend/runner/components/runner_bulk_delete_spec.js103
-rw-r--r--spec/frontend/runner/components/runner_delete_button_spec.js64
-rw-r--r--spec/frontend/runner/components/runner_filtered_search_bar_spec.js6
-rw-r--r--spec/frontend/runner/components/runner_jobs_spec.js2
-rw-r--r--spec/frontend/runner/components/runner_list_spec.js65
-rw-r--r--spec/frontend/runner/components/runner_pause_button_spec.js4
-rw-r--r--spec/frontend/runner/components/runner_projects_spec.js2
-rw-r--r--spec/frontend/runner/components/runner_status_badge_spec.js25
-rw-r--r--spec/frontend/runner/components/runner_status_popover_spec.js36
-rw-r--r--spec/frontend/runner/graphql/local_state_spec.js72
-rw-r--r--spec/frontend/runner/group_runners/group_runners_app_spec.js56
-rw-r--r--spec/frontend/runner/mock_data.js4
-rw-r--r--spec/frontend/runner/runner_search_utils_spec.js40
-rw-r--r--spec/frontend/runner/utils_spec.js4
-rw-r--r--spec/frontend/search/store/actions_spec.js20
-rw-r--r--spec/frontend/search_autocomplete_spec.js32
-rw-r--r--spec/frontend/search_settings/components/search_settings_spec.js41
-rw-r--r--spec/frontend/security_configuration/components/app_spec.js14
-rw-r--r--spec/frontend/security_configuration/components/feature_card_badge_spec.js40
-rw-r--r--spec/frontend/security_configuration/components/feature_card_spec.js27
-rw-r--r--spec/frontend/security_configuration/components/training_provider_list_spec.js16
-rw-r--r--spec/frontend/self_monitor/store/actions_spec.js50
-rw-r--r--spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap2
-rw-r--r--spec/frontend/serverless/store/actions_spec.js46
-rw-r--r--spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js44
-rw-r--r--spec/frontend/shortcuts_spec.js2
-rw-r--r--spec/frontend/sidebar/assignees_realtime_spec.js23
-rw-r--r--spec/frontend/sidebar/components/incidents/escalation_status_spec.js34
-rw-r--r--spec/frontend/sidebar/mock_data.js22
-rw-r--r--spec/frontend/sidebar/participants_spec.js5
-rw-r--r--spec/frontend/snippets/components/edit_spec.js4
-rw-r--r--spec/frontend/snippets/components/snippet_header_spec.js2
-rw-r--r--spec/frontend/task_list_spec.js32
-rw-r--r--spec/frontend/terraform/components/empty_state_spec.js13
-rw-r--r--spec/frontend/terraform/components/mock_data.js35
-rw-r--r--spec/frontend/terraform/components/states_table_actions_spec.js3
-rw-r--r--spec/frontend/tracking/tracking_spec.js66
-rw-r--r--spec/frontend/user_lists/components/edit_user_list_spec.js2
-rw-r--r--spec/frontend/user_lists/components/new_user_list_spec.js2
-rw-r--r--spec/frontend/user_lists/components/user_list_form_spec.js2
-rw-r--r--spec/frontend/user_lists/components/user_list_spec.js2
-rw-r--r--spec/frontend/user_lists/components/user_lists_spec.js2
-rw-r--r--spec/frontend/user_lists/components/user_lists_table_spec.js2
-rw-r--r--spec/frontend/user_lists/store/edit/actions_spec.js2
-rw-r--r--spec/frontend/user_lists/store/edit/mutations_spec.js2
-rw-r--r--spec/frontend/user_lists/store/index/actions_spec.js51
-rw-r--r--spec/frontend/user_lists/store/index/mutations_spec.js2
-rw-r--r--spec/frontend/user_lists/store/new/actions_spec.js2
-rw-r--r--spec/frontend/vue_mr_widget/components/approvals/approvals_spec.js70
-rw-r--r--spec/frontend/vue_mr_widget/components/extensions/utils_spec.js2
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js44
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js31
-rw-r--r--spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js149
-rw-r--r--spec/frontend/vue_mr_widget/mr_widget_options_spec.js121
-rw-r--r--spec/frontend/vue_mr_widget/stores/artifacts_list/actions_spec.js35
-rw-r--r--spec/frontend/vue_mr_widget/test_extensions.js9
-rw-r--r--spec/frontend/vue_shared/alert_details/alert_details_spec.js30
-rw-r--r--spec/frontend/vue_shared/alert_details/service_spec.js44
-rw-r--r--spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap127
-rw-r--r--spec/frontend/vue_shared/components/__snapshots__/identicon_spec.js.snap21
-rw-r--r--spec/frontend/vue_shared/components/awards_list_spec.js3
-rw-r--r--spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js17
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js32
-rw-r--r--spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js10
-rw-r--r--spec/frontend/vue_shared/components/help_popover_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/identicon_spec.js50
-rw-r--r--spec/frontend/vue_shared/components/line_numbers_spec.js37
-rw-r--r--spec/frontend/vue_shared/components/local_storage_sync_spec.js277
-rw-r--r--spec/frontend/vue_shared/components/markdown/apply_suggestion_spec.js23
-rw-r--r--spec/frontend/vue_shared/components/markdown/field_spec.js17
-rw-r--r--spec/frontend/vue_shared/components/markdown/header_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/metric_images/__snapshots__/metric_images_table_spec.js.snap73
-rw-r--r--spec/frontend/vue_shared/components/metric_images/metric_images_tab_spec.js174
-rw-r--r--spec/frontend/vue_shared/components/metric_images/metric_images_table_spec.js230
-rw-r--r--spec/frontend/vue_shared/components/metric_images/mock_data.js5
-rw-r--r--spec/frontend/vue_shared/components/metric_images/store/actions_spec.js158
-rw-r--r--spec/frontend/vue_shared/components/metric_images/store/mutations_spec.js147
-rw-r--r--spec/frontend/vue_shared/components/notes/placeholder_note_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/project_avatar/default_spec.js50
-rw-r--r--spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js9
-rw-r--r--spec/frontend/vue_shared/components/registry/persisted_dropdown_selection_spec.js4
-rw-r--r--spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap8
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js74
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js35
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/mock_data.js28
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/components/chunk_line_spec.js69
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/components/chunk_spec.js82
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js107
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/utils_spec.js26
-rw-r--r--spec/frontend/vue_shared/components/user_avatar/user_avatar_image_new_spec.js32
-rw-r--r--spec/frontend/vue_shared/components/user_avatar/user_avatar_image_old_spec.js39
-rw-r--r--spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js25
-rw-r--r--spec/frontend/vue_shared/components/user_select_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/web_ide_link_spec.js5
-rw-r--r--spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js7
-rw-r--r--spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js39
-rw-r--r--spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js40
-rw-r--r--spec/frontend/vuex_shared/modules/modal/actions_spec.js16
-rw-r--r--spec/frontend/work_items/components/item_title_spec.js4
-rw-r--r--spec/frontend/work_items/components/work_item_actions_spec.js103
-rw-r--r--spec/frontend/work_items/components/work_item_detail_modal_spec.js58
-rw-r--r--spec/frontend/work_items/components/work_item_detail_spec.js40
-rw-r--r--spec/frontend/work_items/components/work_item_title_spec.js117
-rw-r--r--spec/frontend/work_items/mock_data.js97
-rw-r--r--spec/frontend/work_items/pages/create_work_item_spec.js73
-rw-r--r--spec/frontend/work_items/pages/work_item_detail_spec.js99
-rw-r--r--spec/frontend/work_items/pages/work_item_root_spec.js91
-rw-r--r--spec/frontend/work_items/router_spec.js2
-rw-r--r--spec/frontend_integration/content_editor/content_editor_integration_spec.js63
-rw-r--r--spec/graphql/graphql_triggers_spec.rb16
-rw-r--r--spec/graphql/mutations/ci/runner/delete_spec.rb9
-rw-r--r--spec/graphql/mutations/environments/canary_ingress/update_spec.rb14
-rw-r--r--spec/graphql/mutations/saved_replies/destroy_spec.rb46
-rw-r--r--spec/graphql/resolvers/blobs_resolver_spec.rb14
-rw-r--r--spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/issues_resolver_spec.rb44
-rw-r--r--spec/graphql/resolvers/project_jobs_resolver_spec.rb17
-rw-r--r--spec/graphql/resolvers/users_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/work_item_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/work_items/types_resolver_spec.rb10
-rw-r--r--spec/graphql/types/base_object_spec.rb20
-rw-r--r--spec/graphql/types/ci/job_kind_enum_spec.rb11
-rw-r--r--spec/graphql/types/ci/job_type_spec.rb1
-rw-r--r--spec/graphql/types/container_repository_details_type_spec.rb4
-rw-r--r--spec/graphql/types/container_repository_type_spec.rb4
-rw-r--r--spec/graphql/types/dependency_proxy/manifest_type_spec.rb2
-rw-r--r--spec/graphql/types/issue_sort_enum_spec.rb2
-rw-r--r--spec/graphql/types/range_input_type_spec.rb2
-rw-r--r--spec/graphql/types/repository/blob_type_spec.rb3
-rw-r--r--spec/graphql/types/subscription_type_spec.rb1
-rw-r--r--spec/haml_lint/linter/documentation_links_spec.rb6
-rw-r--r--spec/helpers/admin/background_migrations_helper_spec.rb10
-rw-r--r--spec/helpers/application_settings_helper_spec.rb15
-rw-r--r--spec/helpers/boards_helper_spec.rb17
-rw-r--r--spec/helpers/broadcast_messages_helper_spec.rb29
-rw-r--r--spec/helpers/button_helper_spec.rb2
-rw-r--r--spec/helpers/ci/pipeline_editor_helper_spec.rb8
-rw-r--r--spec/helpers/ci/pipelines_helper_spec.rb41
-rw-r--r--spec/helpers/ci/runners_helper_spec.rb45
-rw-r--r--spec/helpers/clusters_helper_spec.rb4
-rw-r--r--spec/helpers/colors_helper_spec.rb89
-rw-r--r--spec/helpers/commits_helper_spec.rb10
-rw-r--r--spec/helpers/diff_helper_spec.rb57
-rw-r--r--spec/helpers/environment_helper_spec.rb2
-rw-r--r--spec/helpers/environments_helper_spec.rb2
-rw-r--r--spec/helpers/groups/group_members_helper_spec.rb62
-rw-r--r--spec/helpers/invite_members_helper_spec.rb2
-rw-r--r--spec/helpers/issuables_helper_spec.rb2
-rw-r--r--spec/helpers/issues_helper_spec.rb14
-rw-r--r--spec/helpers/namespaces_helper_spec.rb11
-rw-r--r--spec/helpers/packages_helper_spec.rb4
-rw-r--r--spec/helpers/preferences_helper_spec.rb61
-rw-r--r--spec/helpers/projects/alert_management_helper_spec.rb23
-rw-r--r--spec/helpers/projects/pipeline_helper_spec.rb23
-rw-r--r--spec/helpers/projects/security/configuration_helper_spec.rb6
-rw-r--r--spec/helpers/projects_helper_spec.rb48
-rw-r--r--spec/helpers/routing/pseudonymization_helper_spec.rb6
-rw-r--r--spec/helpers/search_helper_spec.rb46
-rw-r--r--spec/helpers/timeboxes_helper_spec.rb28
-rw-r--r--spec/helpers/wiki_helper_spec.rb4
-rw-r--r--spec/initializers/mail_encoding_patch_spec.rb3
-rw-r--r--spec/initializers/omniauth_spec.rb46
-rw-r--r--spec/lib/api/entities/application_setting_spec.rb31
-rw-r--r--spec/lib/api/validations/validators/limit_spec.rb6
-rw-r--r--spec/lib/backup/artifacts_spec.rb24
-rw-r--r--spec/lib/backup/files_spec.rb26
-rw-r--r--spec/lib/backup/gitaly_backup_spec.rb38
-rw-r--r--spec/lib/backup/gitaly_rpc_backup_spec.rb154
-rw-r--r--spec/lib/backup/lfs_spec.rb26
-rw-r--r--spec/lib/backup/manager_spec.rb300
-rw-r--r--spec/lib/backup/object_backup_spec.rb35
-rw-r--r--spec/lib/backup/pages_spec.rb25
-rw-r--r--spec/lib/backup/repositories_spec.rb153
-rw-r--r--spec/lib/backup/task_spec.rb8
-rw-r--r--spec/lib/backup/uploads_spec.rb25
-rw-r--r--spec/lib/banzai/filter/custom_emoji_filter_spec.rb9
-rw-r--r--spec/lib/banzai/filter/image_link_filter_spec.rb10
-rw-r--r--spec/lib/banzai/filter/kroki_filter_spec.rb6
-rw-r--r--spec/lib/banzai/filter/plantuml_filter_spec.rb4
-rw-r--r--spec/lib/bulk_imports/common/pipelines/entity_finisher_spec.rb2
-rw-r--r--spec/lib/bulk_imports/groups/stage_spec.rb37
-rw-r--r--spec/lib/bulk_imports/projects/stage_spec.rb4
-rw-r--r--spec/lib/container_registry/gitlab_api_client_spec.rb189
-rw-r--r--spec/lib/container_registry/migration_spec.rb36
-rw-r--r--spec/lib/error_tracking/sentry_client/issue_spec.rb54
-rw-r--r--spec/lib/gitlab/application_context_spec.rb13
-rw-r--r--spec/lib/gitlab/auth/o_auth/user_spec.rb47
-rw-r--r--spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb16
-rw-r--r--spec/lib/gitlab/background_migration/backfill_group_features_spec.rb28
-rw-r--r--spec/lib/gitlab/background_migration/backfill_incident_issue_escalation_statuses_spec.rb27
-rw-r--r--spec/lib/gitlab/background_migration/backfill_issue_search_data_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/backfill_namespace_id_for_project_route_spec.rb53
-rw-r--r--spec/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues_spec.rb67
-rw-r--r--spec/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy_spec.rb135
-rw-r--r--spec/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb29
-rw-r--r--spec/lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex_spec.rb54
-rw-r--r--spec/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/encrypt_static_object_token_spec.rb8
-rw-r--r--spec/lib/gitlab/background_migration/fix_duplicate_project_name_and_path_spec.rb65
-rw-r--r--spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb135
-rw-r--r--spec/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category_spec.rb28
-rw-r--r--spec/lib/gitlab/background_migration/populate_container_repository_migration_plan_spec.rb44
-rw-r--r--spec/lib/gitlab/background_migration/populate_namespace_statistics_spec.rb71
-rw-r--r--spec/lib/gitlab/background_migration/populate_vulnerability_reads_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb2
-rw-r--r--spec/lib/gitlab/blame_spec.rb79
-rw-r--r--spec/lib/gitlab/ci/build/image_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/entry/image_spec.rb16
-rw-r--r--spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/entry/root_spec.rb14
-rw-r--r--spec/lib/gitlab/ci/config/external/file/artifact_spec.rb71
-rw-r--r--spec/lib/gitlab/ci/config/external/file/base_spec.rb75
-rw-r--r--spec/lib/gitlab/ci/config/external/file/local_spec.rb42
-rw-r--r--spec/lib/gitlab/ci/config/external/file/project_spec.rb83
-rw-r--r--spec/lib/gitlab/ci/config/external/file/remote_spec.rb48
-rw-r--r--spec/lib/gitlab/ci/config/external/file/template_spec.rb27
-rw-r--r--spec/lib/gitlab/ci/config/external/mapper_spec.rb77
-rw-r--r--spec/lib/gitlab/ci/config/external/processor_spec.rb64
-rw-r--r--spec/lib/gitlab/ci/config_spec.rb74
-rw-r--r--spec/lib/gitlab/ci/parsers/security/common_spec.rb236
-rw-r--r--spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb662
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb179
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/reports/security/report_spec.rb16
-rw-r--r--spec/lib/gitlab/ci/reports/security/scanner_spec.rb1
-rw-r--r--spec/lib/gitlab/ci/runner_releases_spec.rb114
-rw-r--r--spec/lib/gitlab/ci/runner_upgrade_check_spec.rb89
-rw-r--r--spec/lib/gitlab/ci/status/build/manual_spec.rb18
-rw-r--r--spec/lib/gitlab/ci/templates/MATLAB_spec.rb26
-rw-r--r--spec/lib/gitlab/ci/templates/templates_spec.rb3
-rw-r--r--spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb60
-rw-r--r--spec/lib/gitlab/ci/variables/builder_spec.rb362
-rw-r--r--spec/lib/gitlab/ci/yaml_processor_spec.rb28
-rw-r--r--spec/lib/gitlab/config/loader/yaml_spec.rb10
-rw-r--r--spec/lib/gitlab/content_security_policy/config_loader_spec.rb20
-rw-r--r--spec/lib/gitlab/data_builder/deployment_spec.rb37
-rw-r--r--spec/lib/gitlab/data_builder/note_spec.rb79
-rw-r--r--spec/lib/gitlab/database/background_migration/batch_metrics_spec.rb30
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_job_spec.rb87
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb40
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_spec.rb120
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb110
-rw-r--r--spec/lib/gitlab/database/background_migration/prometheus_metrics_spec.rb118
-rw-r--r--spec/lib/gitlab/database/consistency_checker_spec.rb189
-rw-r--r--spec/lib/gitlab/database/each_database_spec.rb9
-rw-r--r--spec/lib/gitlab/database/load_balancing/setup_spec.rb89
-rw-r--r--spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb22
-rw-r--r--spec/lib/gitlab/database/migration_helpers/v2_spec.rb6
-rw-r--r--spec/lib/gitlab/database/migration_helpers_spec.rb13
-rw-r--r--spec/lib/gitlab/database/migration_spec.rb2
-rw-r--r--spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb2
-rw-r--r--spec/lib/gitlab/database/migrations/instrumentation_spec.rb25
-rw-r--r--spec/lib/gitlab/database/migrations/runner_spec.rb12
-rw-r--r--spec/lib/gitlab/database/migrations/test_background_runner_spec.rb53
-rw-r--r--spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb26
-rw-r--r--spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb76
-rw-r--r--spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb58
-rw-r--r--spec/lib/gitlab/database/schema_cache_with_renamed_table_spec.rb4
-rw-r--r--spec/lib/gitlab/database_spec.rb74
-rw-r--r--spec/lib/gitlab/diff/custom_diff_spec.rb53
-rw-r--r--spec/lib/gitlab/diff/file_spec.rb98
-rw-r--r--spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb22
-rw-r--r--spec/lib/gitlab/email/handler/service_desk_handler_spec.rb14
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb1
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing/invite_team_spec.rb39
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing_spec.rb1
-rw-r--r--spec/lib/gitlab/encoding_helper_spec.rb10
-rw-r--r--spec/lib/gitlab/gfm/uploads_rewriter_spec.rb2
-rw-r--r--spec/lib/gitlab/git/blame_spec.rb98
-rw-r--r--spec/lib/gitlab/git/diff_spec.rb58
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb2
-rw-r--r--spec/lib/gitlab/gitaly_client/commit_service_spec.rb35
-rw-r--r--spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb6
-rw-r--r--spec/lib/gitlab/github_import/importer/issues_importer_spec.rb6
-rw-r--r--spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb6
-rw-r--r--spec/lib/gitlab/github_import/importer/notes_importer_spec.rb6
-rw-r--r--spec/lib/gitlab/github_import/object_counter_spec.rb10
-rw-r--r--spec/lib/gitlab/github_import/parallel_scheduling_spec.rb11
-rw-r--r--spec/lib/gitlab/gon_helper_spec.rb28
-rw-r--r--spec/lib/gitlab/graphql/known_operations_spec.rb6
-rw-r--r--spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb135
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb13
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb127
-rw-r--r--spec/lib/gitlab/hook_data/issuable_builder_spec.rb8
-rw-r--r--spec/lib/gitlab/hook_data/merge_request_builder_spec.rb1
-rw-r--r--spec/lib/gitlab/http_connection_adapter_spec.rb10
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml1
-rw-r--r--spec/lib/gitlab/import_export/command_line_util_spec.rb2
-rw-r--r--spec/lib/gitlab/import_export/duration_measuring_spec.rb35
-rw-r--r--spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb2
-rw-r--r--spec/lib/gitlab/import_export/version_checker_spec.rb3
-rw-r--r--spec/lib/gitlab/insecure_key_fingerprint_spec.rb9
-rw-r--r--spec/lib/gitlab/legacy_github_import/project_creator_spec.rb4
-rw-r--r--spec/lib/gitlab/metrics/rails_slis_spec.rb6
-rw-r--r--spec/lib/gitlab/omniauth_initializer_spec.rb12
-rw-r--r--spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb16
-rw-r--r--spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb39
-rw-r--r--spec/lib/gitlab/pagination/keyset/iterator_spec.rb12
-rw-r--r--spec/lib/gitlab/pagination/keyset/order_spec.rb57
-rw-r--r--spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb107
-rw-r--r--spec/lib/gitlab/pagination/offset_pagination_spec.rb70
-rw-r--r--spec/lib/gitlab/patch/database_config_spec.rb126
-rw-r--r--spec/lib/gitlab/patch/legacy_database_config_spec.rb126
-rw-r--r--spec/lib/gitlab/path_regex_spec.rb2
-rw-r--r--spec/lib/gitlab/project_template_spec.rb2
-rw-r--r--spec/lib/gitlab/quick_actions/command_definition_spec.rb7
-rw-r--r--spec/lib/gitlab/search_context/builder_spec.rb1
-rw-r--r--spec/lib/gitlab/security/scan_configuration_spec.rb10
-rw-r--r--spec/lib/gitlab/seeder_spec.rb27
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb2
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb2
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb2
-rw-r--r--spec/lib/gitlab/ssh_public_key_spec.rb74
-rw-r--r--spec/lib/gitlab/suggestions/commit_message_spec.rb131
-rw-r--r--spec/lib/gitlab/suggestions/suggestion_set_spec.rb116
-rw-r--r--spec/lib/gitlab/tracking_spec.rb38
-rw-r--r--spec/lib/gitlab/url_sanitizer_spec.rb17
-rw-r--r--spec/lib/gitlab/usage/service_ping_report_spec.rb137
-rw-r--r--spec/lib/gitlab/usage_data_counters/ci_template_unique_counter_spec.rb44
-rw-r--r--spec/lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter_spec.rb15
-rw-r--r--spec/lib/gitlab/usage_data_queries_spec.rb12
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb5
-rw-r--r--spec/lib/gitlab/utils/delegator_override/validator_spec.rb9
-rw-r--r--spec/lib/gitlab/view/presenter/base_spec.rb34
-rw-r--r--spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb4
-rw-r--r--spec/lib/gitlab/web_ide/config_spec.rb4
-rw-r--r--spec/lib/gitlab/workhorse_spec.rb8
-rw-r--r--spec/lib/mattermost/session_spec.rb6
-rw-r--r--spec/lib/prometheus/cleanup_multiproc_dir_service_spec.rb28
-rw-r--r--spec/lib/sidebars/groups/menus/group_information_menu_spec.rb14
-rw-r--r--spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb32
-rw-r--r--spec/lib/sidebars/projects/panel_spec.rb36
-rw-r--r--spec/lib/system_check/app/git_user_default_ssh_config_check_spec.rb24
-rw-r--r--spec/mailers/emails/in_product_marketing_spec.rb7
-rw-r--r--spec/mailers/emails/profile_spec.rb23
-rw-r--r--spec/mailers/notify_spec.rb167
-rw-r--r--spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb1
-rw-r--r--spec/migrations/20211214012507_backfill_incident_issue_escalation_statuses_spec.rb25
-rw-r--r--spec/migrations/20220204095121_backfill_namespace_statistics_with_dependency_proxy_size_spec.rb64
-rw-r--r--spec/migrations/20220223124428_schedule_merge_topics_with_same_name_spec.rb36
-rw-r--r--spec/migrations/20220315171129_cleanup_draft_data_from_faulty_regex_spec.rb40
-rw-r--r--spec/migrations/20220316202640_populate_container_repositories_migration_plan_spec.rb34
-rw-r--r--spec/migrations/20220321234317_remove_all_issuable_escalation_statuses_spec.rb20
-rw-r--r--spec/migrations/20220322132242_update_pages_onboarding_state_spec.rb53
-rw-r--r--spec/migrations/20220324032250_migrate_shimo_confluence_service_category_spec.rb34
-rw-r--r--spec/migrations/20220329175119_remove_leftover_ci_job_artifact_deletions_spec.rb92
-rw-r--r--spec/migrations/20220412143552_consume_remaining_encrypt_integration_property_jobs_spec.rb42
-rw-r--r--spec/migrations/add_epics_relative_position_spec.rb29
-rw-r--r--spec/migrations/backfill_group_features_spec.rb31
-rw-r--r--spec/migrations/backfill_namespace_id_for_project_routes_spec.rb29
-rw-r--r--spec/migrations/backfill_work_item_type_id_on_issues_spec.rb52
-rw-r--r--spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb40
-rw-r--r--spec/migrations/finalize_project_namespaces_backfill_spec.rb69
-rw-r--r--spec/migrations/finalize_traversal_ids_background_migrations_spec.rb60
-rw-r--r--spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb51
-rw-r--r--spec/migrations/remove_wiki_notes_spec.rb33
-rw-r--r--spec/migrations/replace_work_item_type_backfill_next_batch_strategy_spec.rb55
-rw-r--r--spec/models/alert_management/metric_image_spec.rb26
-rw-r--r--spec/models/analytics/cycle_analytics/aggregation_spec.rb77
-rw-r--r--spec/models/application_setting_spec.rb49
-rw-r--r--spec/models/award_emoji_spec.rb80
-rw-r--r--spec/models/blob_spec.rb14
-rw-r--r--spec/models/board_spec.rb4
-rw-r--r--spec/models/bulk_import_spec.rb15
-rw-r--r--spec/models/bulk_imports/entity_spec.rb6
-rw-r--r--spec/models/bulk_imports/export_status_spec.rb18
-rw-r--r--spec/models/bulk_imports/tracker_spec.rb4
-rw-r--r--spec/models/ci/bridge_spec.rb26
-rw-r--r--spec/models/ci/build_dependencies_spec.rb4
-rw-r--r--spec/models/ci/build_spec.rb136
-rw-r--r--spec/models/ci/job_artifact_spec.rb13
-rw-r--r--spec/models/ci/namespace_mirror_spec.rb47
-rw-r--r--spec/models/ci/pipeline_spec.rb73
-rw-r--r--spec/models/ci/processable_spec.rb94
-rw-r--r--spec/models/ci/runner_spec.rb8
-rw-r--r--spec/models/ci/secure_file_spec.rb32
-rw-r--r--spec/models/clusters/agent_spec.rb17
-rw-r--r--spec/models/commit_status_spec.rb7
-rw-r--r--spec/models/concerns/approvable_base_spec.rb4
-rw-r--r--spec/models/concerns/batch_nullify_dependent_associations_spec.rb49
-rw-r--r--spec/models/concerns/featurable_spec.rb172
-rw-r--r--spec/models/concerns/issuable_spec.rb10
-rw-r--r--spec/models/concerns/sensitive_serializable_hash_spec.rb10
-rw-r--r--spec/models/concerns/taskable_spec.rb10
-rw-r--r--spec/models/container_repository_spec.rb327
-rw-r--r--spec/models/custom_emoji_spec.rb2
-rw-r--r--spec/models/customer_relations/contact_spec.rb40
-rw-r--r--spec/models/customer_relations/issue_contact_spec.rb12
-rw-r--r--spec/models/customer_relations/organization_spec.rb28
-rw-r--r--spec/models/deploy_token_spec.rb1
-rw-r--r--spec/models/deployment_spec.rb44
-rw-r--r--spec/models/environment_spec.rb261
-rw-r--r--spec/models/environment_status_spec.rb7
-rw-r--r--spec/models/error_tracking/project_error_tracking_setting_spec.rb86
-rw-r--r--spec/models/group_group_link_spec.rb48
-rw-r--r--spec/models/group_spec.rb175
-rw-r--r--spec/models/groups/feature_setting_spec.rb13
-rw-r--r--spec/models/integration_spec.rb202
-rw-r--r--spec/models/integrations/base_third_party_wiki_spec.rb42
-rw-r--r--spec/models/integrations/emails_on_push_spec.rb3
-rw-r--r--spec/models/integrations/external_wiki_spec.rb2
-rw-r--r--spec/models/integrations/field_spec.rb12
-rw-r--r--spec/models/integrations/jira_spec.rb2
-rw-r--r--spec/models/integrations/slack_spec.rb4
-rw-r--r--spec/models/issue_spec.rb39
-rw-r--r--spec/models/key_spec.rb52
-rw-r--r--spec/models/member_spec.rb102
-rw-r--r--spec/models/merge_request_spec.rb16
-rw-r--r--spec/models/namespace_spec.rb6
-rw-r--r--spec/models/namespaces/project_namespace_spec.rb4
-rw-r--r--spec/models/note_spec.rb125
-rw-r--r--spec/models/packages/package_file_spec.rb22
-rw-r--r--spec/models/packages/package_spec.rb4
-rw-r--r--spec/models/plan_limits_spec.rb1
-rw-r--r--spec/models/preloaders/environments/deployment_preloader_spec.rb10
-rw-r--r--spec/models/preloaders/group_root_ancestor_preloader_spec.rb63
-rw-r--r--spec/models/programming_language_spec.rb18
-rw-r--r--spec/models/project_feature_spec.rb95
-rw-r--r--spec/models/project_import_state_spec.rb59
-rw-r--r--spec/models/project_setting_spec.rb30
-rw-r--r--spec/models/project_spec.rb284
-rw-r--r--spec/models/project_statistics_spec.rb4
-rw-r--r--spec/models/projects/build_artifacts_size_refresh_spec.rb6
-rw-r--r--spec/models/projects/topic_spec.rb8
-rw-r--r--spec/models/user_preference_spec.rb42
-rw-r--r--spec/models/user_spec.rb179
-rw-r--r--spec/models/users/in_product_marketing_email_spec.rb18
-rw-r--r--spec/models/web_ide_terminal_spec.rb6
-rw-r--r--spec/models/wiki_page_spec.rb15
-rw-r--r--spec/policies/alert_management/alert_policy_spec.rb52
-rw-r--r--spec/policies/note_policy_spec.rb33
-rw-r--r--spec/policies/project_member_policy_spec.rb6
-rw-r--r--spec/policies/project_policy_spec.rb30
-rw-r--r--spec/presenters/ci/bridge_presenter_spec.rb9
-rw-r--r--spec/presenters/ci/build_runner_presenter_spec.rb60
-rw-r--r--spec/presenters/gitlab/blame_presenter_spec.rb29
-rw-r--r--spec/presenters/issue_presenter_spec.rb61
-rw-r--r--spec/presenters/project_clusterable_presenter_spec.rb6
-rw-r--r--spec/presenters/projects/security/configuration_presenter_spec.rb1
-rw-r--r--spec/requests/admin/background_migrations_controller_spec.rb6
-rw-r--r--spec/requests/api/alert_management_alerts_spec.rb411
-rw-r--r--spec/requests/api/award_emoji_spec.rb17
-rw-r--r--spec/requests/api/bulk_imports_spec.rb23
-rw-r--r--spec/requests/api/ci/job_artifacts_spec.rb23
-rw-r--r--spec/requests/api/ci/jobs_spec.rb9
-rw-r--r--spec/requests/api/ci/runner/jobs_request_post_spec.rb42
-rw-r--r--spec/requests/api/ci/secure_files_spec.rb153
-rw-r--r--spec/requests/api/clusters/agents_spec.rb153
-rw-r--r--spec/requests/api/composer_packages_spec.rb49
-rw-r--r--spec/requests/api/files_spec.rb100
-rw-r--r--spec/requests/api/graphql/ci/job_spec.rb1
-rw-r--r--spec/requests/api/graphql/ci/jobs_spec.rb50
-rw-r--r--spec/requests/api/graphql/ci/runner_spec.rb57
-rw-r--r--spec/requests/api/graphql/ci/runners_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/boards/create_spec.rb10
-rw-r--r--spec/requests/api/graphql/mutations/ci/job_retry_spec.rb20
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_cancel_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/issues/update_spec.rb22
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_labels_spec.rb8
-rw-r--r--spec/requests/api/graphql/mutations/notes/create/note_spec.rb23
-rw-r--r--spec/requests/api/graphql/mutations/notes/update/note_spec.rb36
-rw-r--r--spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb31
-rw-r--r--spec/requests/api/graphql/mutations/user_preferences/update_spec.rb22
-rw-r--r--spec/requests/api/graphql_spec.rb2
-rw-r--r--spec/requests/api/group_export_spec.rb129
-rw-r--r--spec/requests/api/groups_spec.rb34
-rw-r--r--spec/requests/api/integrations_spec.rb29
-rw-r--r--spec/requests/api/internal/container_registry/migration_spec.rb15
-rw-r--r--spec/requests/api/invitations_spec.rb153
-rw-r--r--spec/requests/api/issue_links_spec.rb20
-rw-r--r--spec/requests/api/issues/get_project_issues_spec.rb30
-rw-r--r--spec/requests/api/issues/issues_spec.rb21
-rw-r--r--spec/requests/api/keys_spec.rb66
-rw-r--r--spec/requests/api/lint_spec.rb6
-rw-r--r--spec/requests/api/members_spec.rb8
-rw-r--r--spec/requests/api/merge_requests_spec.rb6
-rw-r--r--spec/requests/api/notes_spec.rb2
-rw-r--r--spec/requests/api/project_attributes.yml5
-rw-r--r--spec/requests/api/project_export_spec.rb23
-rw-r--r--spec/requests/api/project_import_spec.rb90
-rw-r--r--spec/requests/api/projects_spec.rb52
-rw-r--r--spec/requests/api/releases_spec.rb91
-rw-r--r--spec/requests/api/remote_mirrors_spec.rb66
-rw-r--r--spec/requests/api/repositories_spec.rb2
-rw-r--r--spec/requests/api/resource_access_tokens_spec.rb99
-rw-r--r--spec/requests/api/settings_spec.rb51
-rw-r--r--spec/requests/api/users_spec.rb60
-rw-r--r--spec/requests/api/v3/github_spec.rb2
-rw-r--r--spec/requests/groups/crm/contacts_controller_spec.rb15
-rw-r--r--spec/requests/groups/crm/organizations_controller_spec.rb15
-rw-r--r--spec/requests/groups/email_campaigns_controller_spec.rb10
-rw-r--r--spec/requests/import/gitlab_groups_controller_spec.rb14
-rw-r--r--spec/requests/jira_authorizations_spec.rb2
-rw-r--r--spec/requests/projects/work_items_spec.rb38
-rw-r--r--spec/routing/admin_routing_spec.rb11
-rw-r--r--spec/routing/project_routing_spec.rb7
-rw-r--r--spec/routing/uploads_routing_spec.rb11
-rw-r--r--spec/rubocop/cop/database/disable_referential_integrity_spec.rb36
-rw-r--r--spec/rubocop/cop/gitlab/avoid_feature_category_not_owned_spec.rb69
-rw-r--r--spec/rubocop/cop/qa/duplicate_testcase_link_spec.rb36
-rw-r--r--spec/rubocop/cop/qa/testcase_link_format_spec.rb45
-rw-r--r--spec/serializers/commit_entity_spec.rb9
-rw-r--r--spec/serializers/deployment_entity_spec.rb6
-rw-r--r--spec/serializers/environment_serializer_spec.rb28
-rw-r--r--spec/serializers/group_link/group_group_link_entity_spec.rb50
-rw-r--r--spec/serializers/group_link/project_group_link_entity_spec.rb2
-rw-r--r--spec/serializers/member_user_entity_spec.rb10
-rw-r--r--spec/services/alert_management/metric_images/upload_service_spec.rb79
-rw-r--r--spec/services/audit_event_service_spec.rb28
-rw-r--r--spec/services/bulk_imports/relation_export_service_spec.rb12
-rw-r--r--spec/services/bulk_update_integration_service_spec.rb12
-rw-r--r--spec/services/ci/after_requeue_job_service_spec.rb23
-rw-r--r--spec/services/ci/create_pipeline_service/rate_limit_spec.rb91
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb14
-rw-r--r--spec/services/ci/create_web_ide_terminal_service_spec.rb2
-rw-r--r--spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb46
-rw-r--r--spec/services/ci/job_artifacts/destroy_batch_service_spec.rb12
-rw-r--r--spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb145
-rw-r--r--spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb6
-rw-r--r--spec/services/ci/register_job_service_spec.rb14
-rw-r--r--spec/services/ci/retry_build_service_spec.rb397
-rw-r--r--spec/services/ci/retry_job_service_spec.rb413
-rw-r--r--spec/services/ci/retry_pipeline_service_spec.rb2
-rw-r--r--spec/services/database/consistency_check_service_spec.rb154
-rw-r--r--spec/services/deployments/update_environment_service_spec.rb31
-rw-r--r--spec/services/emails/create_service_spec.rb29
-rw-r--r--spec/services/environments/stop_service_spec.rb25
-rw-r--r--spec/services/event_create_service_spec.rb32
-rw-r--r--spec/services/git/branch_push_service_spec.rb10
-rw-r--r--spec/services/groups/create_service_spec.rb37
-rw-r--r--spec/services/groups/transfer_service_spec.rb122
-rw-r--r--spec/services/import/github_service_spec.rb4
-rw-r--r--spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb20
-rw-r--r--spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb23
-rw-r--r--spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb7
-rw-r--r--spec/services/issues/update_service_spec.rb29
-rw-r--r--spec/services/members/create_service_spec.rb66
-rw-r--r--spec/services/members/creator_service_spec.rb26
-rw-r--r--spec/services/members/invite_service_spec.rb447
-rw-r--r--spec/services/merge_requests/update_service_spec.rb15
-rw-r--r--spec/services/metrics/dashboard/custom_dashboard_service_spec.rb2
-rw-r--r--spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb2
-rw-r--r--spec/services/metrics/dashboard/default_embed_service_spec.rb2
-rw-r--r--spec/services/metrics/dashboard/dynamic_embed_service_spec.rb2
-rw-r--r--spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb2
-rw-r--r--spec/services/metrics/dashboard/system_dashboard_service_spec.rb2
-rw-r--r--spec/services/metrics/dashboard/transient_embed_service_spec.rb2
-rw-r--r--spec/services/namespaces/in_product_marketing_email_records_spec.rb6
-rw-r--r--spec/services/namespaces/in_product_marketing_emails_service_spec.rb2
-rw-r--r--spec/services/namespaces/invite_team_email_service_spec.rb128
-rw-r--r--spec/services/notes/build_service_spec.rb202
-rw-r--r--spec/services/notes/create_service_spec.rb17
-rw-r--r--spec/services/notes/update_service_spec.rb39
-rw-r--r--spec/services/notification_recipients/builder/default_spec.rb2
-rw-r--r--spec/services/notification_service_spec.rb75
-rw-r--r--spec/services/packages/rubygems/metadata_extraction_service_spec.rb8
-rw-r--r--spec/services/projects/apple_target_platform_detector_service_spec.rb61
-rw-r--r--spec/services/projects/container_repository/cleanup_tags_service_spec.rb2
-rw-r--r--spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb14
-rw-r--r--spec/services/projects/create_service_spec.rb28
-rw-r--r--spec/services/projects/operations/update_service_spec.rb31
-rw-r--r--spec/services/projects/record_target_platforms_service_spec.rb66
-rw-r--r--spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb13
-rw-r--r--spec/services/projects/transfer_service_spec.rb72
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb26
-rw-r--r--spec/services/service_ping/build_payload_service_spec.rb4
-rw-r--r--spec/services/task_list_toggle_service_spec.rb21
-rw-r--r--spec/services/users/destroy_service_spec.rb35
-rw-r--r--spec/services/users/saved_replies/destroy_service_spec.rb35
-rw-r--r--spec/services/users/saved_replies/update_service_spec.rb2
-rw-r--r--spec/services/web_hook_service_spec.rb15
-rw-r--r--spec/spec_helper.rb12
-rw-r--r--spec/support/database_cleaner.rb3
-rw-r--r--spec/support/fips.rb27
-rw-r--r--spec/support/gitlab_stubs/gitlab_ci.yml2
-rw-r--r--spec/support/helpers/cycle_analytics_helpers.rb19
-rw-r--r--spec/support/helpers/features/invite_members_modal_helper.rb40
-rw-r--r--spec/support/helpers/features/runner_helpers.rb68
-rw-r--r--spec/support/helpers/gitaly_setup.rb2
-rw-r--r--spec/support/helpers/login_helpers.rb2
-rw-r--r--spec/support/helpers/navbar_structure_helper.rb12
-rw-r--r--spec/support/helpers/search_helpers.rb7
-rw-r--r--spec/support/helpers/test_env.rb5
-rw-r--r--spec/support/helpers/usage_data_helpers.rb1
-rw-r--r--spec/support/matchers/graphql_matchers.rb10
-rw-r--r--spec/support/matchers/markdown_matchers.rb2
-rw-r--r--spec/support/matchers/project_namespace_matcher.rb2
-rw-r--r--spec/support/services/deploy_token_shared_examples.rb4
-rw-r--r--spec/support/services/issuable_update_service_shared_examples.rb44
-rw-r--r--spec/support/shared_contexts/container_repositories_shared_context.rb14
-rw-r--r--spec/support/shared_contexts/finders/users_finder_shared_contexts.rb4
-rw-r--r--spec/support/shared_contexts/lib/container_registry/client_stubs_shared_context.rb4
-rw-r--r--spec/support/shared_contexts/markdown_golden_master_shared_examples.rb3
-rw-r--r--spec/support/shared_contexts/navbar_structure_context.rb10
-rw-r--r--spec/support/shared_contexts/serializers/group_group_link_shared_context.rb6
-rw-r--r--spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb9
-rw-r--r--spec/support/shared_contexts/url_shared_context.rb4
-rw-r--r--spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb37
-rw-r--r--spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb11
-rw-r--r--spec/support/shared_examples/features/access_tokens_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/features/content_editor_shared_examples.rb46
-rw-r--r--spec/support/shared_examples/features/inviting_members_shared_examples.rb175
-rw-r--r--spec/support/shared_examples/features/project_upload_files_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/runners_shared_examples.rb141
-rw-r--r--spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb1
-rw-r--r--spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb13
-rw-r--r--spec/support/shared_examples/graphql/mutations/boards_create_shared_examples.rb10
-rw-r--r--spec/support/shared_examples/graphql/notes_creation_shared_examples.rb11
-rw-r--r--spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/helpers/wiki_helpers_shared_examples.rb20
-rw-r--r--spec/support/shared_examples/incident_management/issuable_escalation_statuses/build_examples.rb20
-rw-r--r--spec/support/shared_examples/lib/gitlab/event_store_shared_examples.rb18
-rw-r--r--spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/lib/sidebars/projects/menus/zentao_menu_shared_examples.rb12
-rw-r--r--spec/support/shared_examples/lib/wikis_api_examples.rb6
-rw-r--r--spec/support/shared_examples/models/application_setting_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/models/concerns/bulk_users_by_email_load_shared_examples.rb39
-rw-r--r--spec/support/shared_examples/models/concerns/from_set_operator_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/models/group_shared_examples.rb43
-rw-r--r--spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb61
-rw-r--r--spec/support/shared_examples/models/issuable_link_shared_examples.rb13
-rw-r--r--spec/support/shared_examples/models/member_shared_examples.rb60
-rw-r--r--spec/support/shared_examples/models/project_shared_examples.rb27
-rw-r--r--spec/support/shared_examples/models/wiki_shared_examples.rb140
-rw-r--r--spec/support/shared_examples/policies/wiki_policies_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb90
-rw-r--r--spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/requests/api/issuable_participants_examples.rb30
-rw-r--r--spec/support/shared_examples/requests/api/notes_shared_examples.rb79
-rw-r--r--spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb19
-rw-r--r--spec/support/shared_examples/services/boards/boards_list_service_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb94
-rw-r--r--spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/views/milestone_shared_examples.rb78
-rw-r--r--spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb70
-rw-r--r--spec/tasks/dev_rake_spec.rb112
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb46
-rw-r--r--spec/tasks/gitlab/db/validate_config_rake_spec.rb205
-rw-r--r--spec/tasks/gitlab/db_rake_spec.rb513
-rw-r--r--spec/tasks/gitlab/refresh_project_statistics_build_artifacts_size_rake_spec.rb44
-rw-r--r--spec/tasks/gitlab/setup_rake_spec.rb21
-rw-r--r--spec/tooling/danger/product_intelligence_spec.rb103
-rw-r--r--spec/tooling/danger/project_helper_spec.rb34
-rw-r--r--spec/uploaders/ci/secure_file_uploader_spec.rb4
-rw-r--r--spec/validators/addressable_url_validator_spec.rb4
-rw-r--r--spec/views/admin/application_settings/_ci_cd.html.haml_spec.rb87
-rw-r--r--spec/views/admin/application_settings/_repository_storage.html.haml_spec.rb32
-rw-r--r--spec/views/dashboard/milestones/index.html.haml_spec.rb7
-rw-r--r--spec/views/groups/milestones/index.html.haml_spec.rb7
-rw-r--r--spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb21
-rw-r--r--spec/views/groups/show.html.haml_spec.rb118
-rw-r--r--spec/views/profiles/keys/_form.html.haml_spec.rb4
-rw-r--r--spec/views/projects/commit/show.html.haml_spec.rb1
-rw-r--r--spec/views/projects/milestones/index.html.haml_spec.rb7
-rw-r--r--spec/views/projects/pipelines/show.html.haml_spec.rb1
-rw-r--r--spec/views/shared/_global_alert.html.haml_spec.rb46
-rw-r--r--spec/views/shared/_milestones_sort_dropdown.html.haml_spec.rb27
-rw-r--r--spec/views/shared/groups/_dropdown.html.haml_spec.rb27
-rw-r--r--spec/views/shared/projects/_list.html.haml_spec.rb12
-rw-r--r--spec/workers/bulk_import_worker_spec.rb25
-rw-r--r--spec/workers/bulk_imports/entity_worker_spec.rb45
-rw-r--r--spec/workers/bulk_imports/export_request_worker_spec.rb18
-rw-r--r--spec/workers/bulk_imports/pipeline_worker_spec.rb65
-rw-r--r--spec/workers/bulk_imports/stuck_import_worker_spec.rb36
-rw-r--r--spec/workers/ci/update_locked_unknown_artifacts_worker_spec.rb44
-rw-r--r--spec/workers/concerns/application_worker_spec.rb2
-rw-r--r--spec/workers/container_registry/migration/enqueuer_worker_spec.rb192
-rw-r--r--spec/workers/container_registry/migration/guard_worker_spec.rb72
-rw-r--r--spec/workers/database/batched_background_migration/ci_database_worker_spec.rb2
-rw-r--r--spec/workers/database/batched_background_migration_worker_spec.rb2
-rw-r--r--spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb67
-rw-r--r--spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb67
-rw-r--r--spec/workers/every_sidekiq_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/import_issue_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/import_note_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb2
-rw-r--r--spec/workers/merge_requests/update_head_pipeline_worker_spec.rb6
-rw-r--r--spec/workers/namespaces/invite_team_email_worker_spec.rb27
-rw-r--r--spec/workers/namespaces/root_statistics_worker_spec.rb2
-rw-r--r--spec/workers/namespaces/update_root_statistics_worker_spec.rb6
-rw-r--r--spec/workers/packages/cleanup_package_file_worker_spec.rb60
-rw-r--r--spec/workers/project_export_worker_spec.rb26
-rw-r--r--spec/workers/projects/post_creation_worker_spec.rb2
-rw-r--r--spec/workers/projects/record_target_platforms_worker_spec.rb87
-rw-r--r--spec/workers/quality/test_data_cleanup_worker_spec.rb44
-rwxr-xr-xtooling/bin/find_app_sec_approval33
-rw-r--r--tooling/danger/product_intelligence.rb25
-rw-r--r--tooling/danger/project_helper.rb32
-rw-r--r--vendor/project_templates/middleman.tar.gzbin0 -> 10917 bytes
-rw-r--r--vendor/project_templates/sse_middleman.tar.gzbin7368 -> 0 bytes
-rw-r--r--workhorse/README.md43
-rw-r--r--workhorse/doc/architecture/channel.md204
-rw-r--r--workhorse/doc/architecture/gitlab_features.md77
-rw-r--r--workhorse/doc/channel.md15
-rw-r--r--workhorse/doc/development/new_features.md49
-rw-r--r--workhorse/doc/development/tests.md25
-rw-r--r--workhorse/doc/operations/configuration.md221
-rw-r--r--workhorse/doc/operations/install.md52
-rw-r--r--workhorse/go.mod2
-rw-r--r--workhorse/go.sum6
-rw-r--r--workhorse/internal/api/api.go23
-rw-r--r--workhorse/internal/api/api_test.go47
-rw-r--r--workhorse/internal/git/info-refs.go37
-rw-r--r--workhorse/internal/headers/content_headers.go55
-rw-r--r--workhorse/internal/lsif_transformer/parser/errors.go30
-rw-r--r--workhorse/internal/lsif_transformer/parser/errors_test.go26
-rw-r--r--workhorse/internal/lsif_transformer/parser/hovers.go9
-rw-r--r--workhorse/internal/lsif_transformer/parser/ranges.go9
-rw-r--r--workhorse/internal/lsif_transformer/parser/references.go9
-rw-r--r--workhorse/internal/proxy/proxy.go26
-rw-r--r--workhorse/internal/senddata/contentprocessor/contentprocessor_test.go52
-rw-r--r--workhorse/internal/upload/artifacts_upload_test.go2
-rw-r--r--workhorse/internal/upload/destination/destination.go21
-rw-r--r--workhorse/internal/upload/destination/objectstore/s3_session.go19
-rw-r--r--workhorse/internal/upload/destination/objectstore/s3_session_test.go25
-rw-r--r--workhorse/internal/upload/destination/upload_opts.go4
-rw-r--r--workhorse/internal/upload/destination/upload_opts_test.go4
-rw-r--r--workhorse/internal/upstream/upstream.go31
-rw-r--r--workhorse/internal/upstream/upstream_test.go59
-rw-r--r--workhorse/proxy_test.go38
-rw-r--r--workhorse/tools.go3
-rw-r--r--yarn.lock1648
4754 files changed, 261619 insertions, 82073 deletions
diff --git a/.editorconfig b/.editorconfig
index 932acffe9fc..0edad7878b5 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -16,3 +16,6 @@ charset = utf-8
[*.{md,markdown,js.snap}]
trim_trailing_whitespace = false
+
+[*.rb]
+max_line_length = 120
diff --git a/.eslintrc.yml b/.eslintrc.yml
index f5814639b36..7f45fd912a9 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -93,6 +93,10 @@ rules:
group: internal
alphabetize:
order: ignore
+ 'no-restricted-syntax':
+ - error
+ - selector: ImportSpecifier[imported.name='GlSkeletonLoading']
+ message: 'Migrate to GlSkeletonLoader, or import GlDeprecatedSkeletonLoading.'
overrides:
- files:
- '{,ee/,jh/}spec/frontend*/**/*'
@@ -107,6 +111,8 @@ overrides:
message: 'Using $nextTick from a component instance is discouraged. Import nextTick directly from the Vue package.'
- selector: Identifier[name='setImmediate']
message: 'Prefer explicit waitForPromises (or equivalent), or jest.runAllTimers (or equivalent) to vague setImmediate calls.'
+ - selector: ImportSpecifier[imported.name='GlSkeletonLoading']
+ message: 'Migrate to GlSkeletonLoader, or import GlDeprecatedSkeletonLoading.'
- files:
- 'config/**/*'
- 'scripts/**/*'
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644
index 00000000000..91542cdbc00
--- /dev/null
+++ b/.git-blame-ignore-revs
@@ -0,0 +1,130 @@
+# This file contains revisions to be ignored by git blame.
+# These revisions are expected to be formatting-only changes.
+#
+# Calling `git blame --ignore-revs-file .git-blame-ignore-revs` will
+# tell git blame to ignore changes made by these revisions when assigning
+# assigning blame, as if the change never happened.
+#
+# You can enable this as a default for your local repository by running
+# `git config blame.ignoreRevsFile .git-blame-ignore-revs`
+# This will probably be automatically picked by your IDE
+# (VSCode+GitLens and JetBrains products are confirmed to this)
+#
+# Important: if you are switching to the branch without this file,
+# `git blame` will fail with an error
+#
+# Guidelines:
+# - Only large automated refactorings are expected to be included in this file.
+# Do not add new revision just because it feels unimportant
+# - When adding sinle revision use inline comment to link relevant issue/MR
+# Example:
+## d4a8b7307acc2dc8a8833ccfa65426ad28b3ffc9 # https://gitlab.com/gitlab-org/frontend/rfcs/-/issues/60
+# - When adding multiple revisions precede each addition (this could be multiple revisions) with a link to
+# line with word START and link to relevant issue/MR/epic and conclude with line END and link to the
+# same issue/MR/epic
+# Example:
+# # START https://gitlab.com/gitlab-org/issues/12345
+# 6f0bd2d8a1e6cd2e794cd39976e9756e0c85ac66
+# d53974df11dbc22cbea9dc7dcbc9896c25979a27
+# ... <rest of the list>
+# # END https://gitlab.com/gitlab-org/issues/12345
+# - Please append new lines to the end of the file, no matter of real chronological
+# order of revisions
+# - Since this is using hashes for reformatting it might be a good idea to update
+# this file in separate MR when relevant changes already landed in master. By
+# utilizing this manner you will be safe from random rebase/squash issues
+# - Only put full 40-character hashes on this list
+
+# START https://gitlab.com/gitlab-org/frontend/rfcs/-/issues/60
+f2d28d7ab8525944fda634241a780006594fbe1a
+94cfbb0ce38e893edda33ebc069bfa616a08a961
+b69f448f0685ad96edc474f75a17e0278a6d6011
+52907ac20c3af337544bdf18023730b9ada4b157
+d4a8b7307acc2dc8a8833ccfa65426ad28b3ffc9
+468cb9f0a4b88bf686f3e78250834f7c9d31ff76
+a536349d1d219f0b79a7a711d37dd1c705e49128
+6f0bd2d8a1e6cd2e794cd39976e9756e0c85ac66
+d53974df11dbc22cbea9dc7dcbc9896c25979a27
+818537524d13469cbc7ac5cb89263378b4cddca4
+bcbbcb2e708868099301ad5039badfba2128d47b
+a4c662da544b38b7e593eb79f24b24c5cb2f205e
+9aa1f6207a91a76940b34c921ce89894fcd74a06
+66da09846a17435f332296f73af44919ff2cfb52
+216f795bab0e8fbf6023f22f6e54cc07514a04ec
+e820c22892d207e138bdff717100e5240f8ffd94
+2f8dbd483242575f9ceca0a2947c9b21e5ab59a0
+e7d50054818ada29751539f548ef72f46deca8bb
+00827a74cf3bfef985ed6046fb2d42f29cbb19ac
+333bad893e98068053c888f6b020632f1c6f472e
+85af3689eea96b4d9131d80d8c5c8936de520074
+325fb305ea395a7f44ae1eea0a3e77e46e10c2b6
+e37a6d7aa61039734025474ce901f2907283e239
+dff561fa8c50e9b96aec9800b6b88ad6c7a2777b
+19b0ba7265cfb154505f74b6856e73662829af2e
+7c1fa749efcd59e81b565d6803285f6bd4bcefaf
+5c23cb94c5d1aed2a4b02b7c1f3e5a53a0aa4760
+c35cc92c80969e7c87bbcda7db6cbd04f6719589
+280a79c0ec4c1383e49480f3028f5b2025a2a76b
+e94556e9f9a145374bf26feb5e1823dae8a4004d
+b6a8d9baf700dbb3f780b27d9a9820c9cb7a346c
+9180eaee4d58a9e91c5f960148290b5271ba870c
+0fdc1fc0380056836dff7aba9be3b1e4b531daea
+157e117fcb530436561e3fb8faba6f751dc19e91
+7cfe360c9e5460a595dfe729e81cf404c1106638
+e3aca8c8f8488c55a199fc28595709b393f5040b
+3b1593f2d53b735299381ad0878959cbc2fc9923
+39bb37cc0d18f620006d85dfdff7b9a54077708e
+cdc1a4a8eec43e6a3df05403af8d05ab6ea7a213
+87ad67fef574cd102887f3dde98917f3b2bbcab8
+99bff4450248457ba877dec0388241625fb0144b
+d1b6d05c08e0730463084acd1a387cd9d6acea8b
+557c22a8242d1d7ccf2228b9b3156e2aa0dd05aa
+7f4e951ce8073b50a245ebe216a8961c88846cfa
+7dae714f23f423ff362d73e0d16da7b3a6cd721f
+cfb368284545a4bd1e759cfe9e3e3bde54a1ec6f
+aa653d5a380d88493050b22d84df36ae6df2cddd
+96ed4677c602e8f9c83b28fbc0d802aa26527ab8
+72c11eb5a15735dc52dcd893e9112a10444d46e4
+b48e14b89b94a1a87affabd09bc603a67fc6bb01
+d46581c1fbcef34cfdd85c6c542fb4ac1b974861
+ef02363c9cd41a9ce41443661efed1c0399c5551
+075a78b319466aff9e94149c41c286544af91782
+9f4b4de2df17268732ae198d5f48c9b99d071a35
+0a8f575e365804239d29b45562ca6594b9da59e9
+c04bd24738b1775b963bba3f78b48007fccce37e
+1173c801ea53c9d814fdf27d878f73a1702eb4e9
+a2f5e7395004c255ecaadef30d7a6b5bf453d372
+80f1ea7e3f11063a4f15bdd4a2e4a1ca7f770d87
+0e6e345f3b4dcb7b51403bcd096e6d3d294743f4
+06ee932e0844fa4cc91c15d5ca581de262d7bedd
+b3ece842f7c05230f77055ad11e3c4a07c34e1e9
+5ebea3a48831351169e0a312e9d6985b31c9975b
+02fad0bc640f5f91c748d692c01d6221c9b03b6e
+16d4df3c7130b5a0995fdc685b272bef65ff84d5
+281cc7306ab92d2e053d0bb2d79e4f3646b980f6
+1877bf550016eac9ecac53ec498ec83bdd24339c
+7e9741c59d1e3612017925a7b7cf0946bbdd6eca
+b282f7dda6d7e93fcb0f000db8aa6634ac8d1b88
+81e82875704ffb35842534433216e797c41f89c3
+4914a729d17efbe250ac2cab2153f72caef3a7b7
+792e349390327fa11721e2f744cafec3b05f51f4
+8869ce0866823b229a863e435aa108c5d4fcf448
+a223014afe14686a4e18a826fd0bac9bdaaf969b
+482d756cf69e3f0dd5997ea0e58d35c0eb694e35
+4700ac1d1da533cfefd50bd640db77a12c458fda
+21fa9ca4832cfb57f791ff057e7c5987349aa964
+8b24c8d64d9328e0884725a2075a4a21faa76842
+86ce5406c3b60757f40d4c434b5ce7dfc602a643
+da4eea76b3cc1d68d4bfd2705bb86e904d1b54bc
+8ac8a1f21a21840b53175e9f4a423b9ffa083f71
+ed189d0e9925eb08f3eb444176fad2614a3a4f83
+6e183d5016afc50e60892c7f1cf79035619c2deb
+9b1d8b4c2897792be067e33442ebf3ce0961a5d0
+57da632154bfc193224d5a290b9c2b6cbd7fa0ad
+1e3190b0049ba1b502918dc018681808b9203803
+0e334037bf0f93ff6f7bc922c48fa97556f39808
+07f5bc94bd983e77361c9a5020f8f229da3a465a
+888002a62696ba66d8eb49f1dfe83a5a49bdf421
+c152d51445d9d9dd7c2c328ca8c407fa5438d16b
+26b68c70df73289210aa600fa3c1fe45f05afee4
+# END https://gitlab.com/gitlab-org/frontend/rfcs/-/issues/60
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 05d4c2bb6d4..ae2e054d714 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -16,7 +16,7 @@ stages:
# in cases where jobs require Docker-in-Docker, the job
# definition must be extended with `.use-docker-in-docker`
default:
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-11-graphicsmagick-1.3.36
+ image: $DEFAULT_CI_IMAGE
tags:
- gitlab-org
# All jobs are interruptible by default
@@ -58,6 +58,8 @@ workflow:
- if: '$CI_COMMIT_BRANCH =~ /^security\//'
variables:
+ PG_VERSION: "12"
+ DEFAULT_CI_IMAGE: "${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-${PG_VERSION}-graphicsmagick-1.3.36"
RAILS_ENV: "test"
NODE_ENV: "test"
BUNDLE_WITHOUT: "production:development"
@@ -91,10 +93,11 @@ variables:
CHECK_PRECOMPILED_ASSETS: "true"
FF_USE_FASTZIP: "true"
SKIP_FLAKY_TESTS_AUTOMATICALLY: "true"
+ RETRY_FAILED_TESTS_IN_NEW_PROCESS: "true"
# Run with decomposed databases by default
DECOMPOSED_DB: "true"
- DOCS_REVIEW_APPS_DOMAIN: "178.62.207.141.nip.io"
+ DOCS_REVIEW_APPS_DOMAIN: "35.193.151.162.nip.io"
DOCS_GITLAB_REPO_SUFFIX: "ee"
REVIEW_APPS_DOMAIN: "gitlab-review.app"
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 26ce20e976d..2aee22dbb9e 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -2,11 +2,11 @@
# project here: https://gitlab.com/gitlab-org/gitlab/-/project_members
# As described in https://docs.gitlab.com/ee/user/project/code_owners.html
-[Backend]
+^[Backend]
*.rb @gitlab-org/maintainers/rails-backend
*.rake @gitlab-org/maintainers/rails-backend
-[Frontend]
+^[Frontend]
*.scss @annabeldunstone @gitlab-org/maintainers/frontend
*.js @gitlab-org/maintainers/frontend
/app/assets/ @gitlab-org/maintainers/frontend
@@ -16,7 +16,7 @@
/spec/frontend_integration/ @gitlab-org/maintainers/frontend
/ee/spec/frontend_integration/ @gitlab-org/maintainers/frontend
-[Database]
+^[Database]
/db/ @gitlab-org/maintainers/database
/ee/db/ @gitlab-org/maintainers/database
/lib/gitlab/background_migration/ @gitlab-org/maintainers/database
@@ -28,7 +28,7 @@
/ee/app/finders/ @gitlab-org/maintainers/database
/rubocop/rubocop-migrations.yml @gitlab-org/maintainers/database
-[Engineering Productivity]
+^[Engineering Productivity]
/.gitlab-ci.yml @gl-quality/eng-prod
/.gitlab/ci/ @gl-quality/eng-prod
/.gitlab/ci/docs.gitlab-ci.yml @gl-quality/eng-prod @gl-docsteam
@@ -43,33 +43,33 @@ Dangerfile @gl-quality/eng-prod
/scripts/review_apps/seed-dast-test-data.sh @dappelt @ngeorge1 @gl-quality/eng-prod
.editorconfig @gl-quality/eng-prod
-[Backend Static Code Analysis]
+^[Backend Static Code Analysis]
.rubocop*.yml @dstull @splattael @gl-quality/eng-prod
.rubocop_todo.yml @dstull @splattael @gl-quality/eng-prod
.rubocop_todo/ @dstull @splattael @gl-quality/eng-prod
/rubocop/ @dstull @splattael @gl-quality/eng-prod
/spec/rubocop/ @dstull @splattael @gl-quality/eng-prod
-[End-to-end]
+^[End-to-end]
/qa/ @gl-quality
-[LDAP]
+^[LDAP]
/ee/lib/ee/gitlab/auth/ldap/ @dblessing @mkozono
/lib/gitlab/auth/ldap/ @dblessing @mkozono
-[Templates]
+^[Templates]
/lib/gitlab/ci/templates/ @gitlab-org/maintainers/cicd-templates
/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml @DylanGriffith @mayra-cabrera @tkuah
/lib/gitlab/ci/templates/Security/ @gonzoyumo @twoodham @sethgitlab @thiagocsf
/lib/gitlab/ci/templates/Security/Container-Scanning.*.yml @gitlab-org/protect/container-security-backend
-[Project Alias]
+^[Project Alias]
/ee/app/models/project_alias.rb @patrickbajao
/ee/lib/api/project_aliases.rb @patrickbajao
# Secure & Threat Management ownership delineation
# https://about.gitlab.com/handbook/engineering/development/threat-management/delineate-secure-threat-management.html#technical-boundaries
-[Threat Insights]
+^[Threat Insights]
/app/finders/security/ @gitlab-org/secure/threat-insights-backend-team
/app/models/vulnerability.rb @gitlab-org/secure/threat-insights-backend-team
/ee/app/finders/security/ @gitlab-org/secure/threat-insights-backend-team
@@ -83,7 +83,7 @@ Dangerfile @gl-quality/eng-prod
/ee/spec/policies/vulnerability*.rb @gitlab-org/secure/threat-insights-backend-team
/ee/spec/presenters/projects/security/ @gitlab-org/secure/threat-insights-backend-team
-[Secure]
+^[Secure]
/ee/lib/gitlab/ci/parsers/license_compliance/ @gitlab-org/secure/composition-analysis-be
/ee/lib/gitlab/ci/parsers/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/lib/gitlab/ci/reports/coverage_fuzzing/ @gitlab-org/secure/fuzzing-be
@@ -92,7 +92,7 @@ Dangerfile @gl-quality/eng-prod
/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/app_sec/dast/ @gitlab-org/secure/dynamic-analysis-be
-[Container Security]
+^[Container Security]
/ee/app/views/projects/threat_monitoring/** @gitlab-org/protect/container-security-frontend
/ee/app/views/projects/security/policies/** @gitlab-org/protect/container-security-frontend
/ee/spec/views/projects/security/policies/** @gitlab-org/protect/container-security-frontend
@@ -127,13 +127,13 @@ Dangerfile @gl-quality/eng-prod
/ee/lib/gitlab/usage_data_counters/network_policy_counter.rb @gitlab-org/protect/container-security-backend
/ee/spec/lib/gitlab/usage_data_counters/network_policy_counter_spec.rb @gitlab-org/protect/container-security-backend
-[Code Owners]
+^[Code Owners]
/ee/lib/gitlab/code_owners.rb @reprazent @kerrizor @garyh
/ee/lib/gitlab/code_owners/ @reprazent @kerrizor @garyh
/ee/spec/lib/gitlab/code_owners/ @reprazent @kerrizor @garyh
/doc/user/project/code_owners.md @reprazent @kerrizor @garyh
-[Merge Requests]
+^[Merge Requests]
/app/controllers/projects/merge_requests/ @garyh @patrickbajao @marc_shaw @kerrizor
/app/models/merge_request.rb @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/app/services/merge_requests/ @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
@@ -164,14 +164,13 @@ Dangerfile @gl-quality/eng-prod
/spec/frontend/diffs/ @viktomas @jboyson @iamphill @thomasrandolph
/spec/frontend/batch_comments/ @viktomas @jboyson @iamphill @thomasrandolph
-
-[Product Intelligence]
+^[Product Intelligence]
/ee/lib/gitlab/usage_data_counters/ @gitlab-org/growth/product-intelligence/engineers
/ee/lib/ee/gitlab/usage_data.rb @gitlab-org/growth/product-intelligence/engineers
/lib/gitlab/usage_data.rb @gitlab-org/growth/product_intelligence/engineers
/lib/gitlab/usage_data_counters/ @gitlab-org/growth/product-intelligence/engineers
-[Growth Experiments]
+^[Growth Experiments]
/app/experiments/ @gitlab-org/growth/experiment-devs
/app/models/experiment.rb @gitlab-org/growth/experiment-devs
/app/models/experiment_subject.rb @gitlab-org/growth/experiment-devs
@@ -186,16 +185,16 @@ Dangerfile @gl-quality/eng-prod
/lib/gitlab/experimentation_logger.rb @gitlab-org/growth/experiment-devs
/ee/spec/requests/api/experiments_spec.rb @gitlab-org/growth/experiment-devs
-[Legal]
+^[Legal]
/config/dependency_decisions.yml @gitlab-org/legal-reviewers
-[Workhorse]
+^[Workhorse]
/workhorse/ @jacobvosmaer-gitlab @nick.thomas @nolith @patrickbajao
-[Application Security]
+^[Application Security]
/lib/gitlab/content_security_policy/ @gitlab-com/gl-security/appsec
-[Gitaly]
+^[Gitaly]
lib/gitlab/git_access.rb @proglottis @toon @zj-gitlab
lib/gitlab/git_access_*.rb @proglottis @toon @zj-gitlab
ee/lib/ee/gitlab/git_access.rb @proglottis @toon @zj-gitlab
@@ -203,32 +202,21 @@ ee/lib/ee/gitlab/git_access_*.rb @proglottis @toon @zj-gitlab
ee/lib/ee/gitlab/checks/** @proglottis @toon @zj-gitlab
lib/gitlab/checks/** @proglottis @toon @zj-gitlab
-[Documentation Directories]
-.markdownlint.yml @marcel.amirault @eread @aqualls @cnorris
-/doc/.markdownlint @marcel.amirault @eread @aqualls @cnorris
+^[Documentation Directories]
+.markdownlint.yml @marcel.amirault @eread @aqualls @dianalogan
+/doc/.markdownlint @marcel.amirault @eread @aqualls @dianalogan
/doc/ @gl-docsteam
-/doc/.vale/ @marcel.amirault @eread @aqualls @cnorris
+/doc/.vale/ @marcel.amirault @eread @aqualls @dianalogan
-[Documentation Pages]
-/doc/administration/application_settings_cache.md @marcel.amirault
+^[Documentation Pages]
+/doc/administration/application_settings_cache.md @marcia
/doc/administration/audit_event_streaming.md @eread
/doc/administration/audit_events.md @eread
/doc/administration/audit_reports.md @eread
-/doc/administration/auditor_users.md @axil
-/doc/administration/auth/atlassian.md @eread
-/doc/administration/auth/authentiq.md @eread
-/doc/administration/auth/cognito.md @eread
-/doc/administration/auth/crowd.md @eread
-/doc/administration/auth/index.md @eread
-/doc/administration/auth/ldap/google_secure_ldap.md @eread
-/doc/administration/auth/jwt.md @eread
-/doc/administration/auth/ldap/ldap-troubleshooting.md @eread
-/doc/administration/auth/ldap/ldap_synchronization.md @eread
-/doc/administration/auth/ldap/index.md @eread
-/doc/administration/auth/oidc.md @eread
-/doc/administration/auth/smartcard.md @eread
+/doc/administration/auditor_users.md @eread
+/doc/administration/auth/ @eread
/doc/administration/cicd.md @marcel.amirault
-/doc/administration/clusters/kas.md @sselhorn
+/doc/administration/clusters/kas.md @marcia
/doc/administration/compliance.md @eread
/doc/administration/configure.md @axil
/doc/administration/consul.md @axil
@@ -252,27 +240,27 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/administration/integration/terminal.md @kpaizee
/doc/administration/invalidate_markdown_cache.md @msedlakjakubowski
/doc/administration/issue_closing_pattern.md @aqualls
-/doc/administration/job_artifacts.md @eread
+/doc/administration/job_artifacts.md @marcel.amirault
/doc/administration/job_logs.md @sselhorn
/doc/administration/lfs/index.md @aqualls
/doc/administration/libravatar.md @axil
/doc/administration/load_balancer.md @axil
-/doc/administration/logs.md @ngaskill
+/doc/administration/logs.md @msedlakjakubowski
/doc/administration/maintenance_mode/index.md @axil
/doc/administration/merge_request_diffs.md @aqualls
-/doc/administration/monitoring/ @ngaskill
+/doc/administration/monitoring/ @msedlakjakubowski
/doc/administration/monitoring/prometheus/index.md @axil
/doc/administration/nfs.md @axil
/doc/administration/object_storage.md @axil
/doc/administration/operations/ @axil
/doc/administration/operations/moving_repositories.md @eread
-/doc/administration/operations/sidekiq_memory_killer.md @marcel.amirault
+/doc/administration/operations/sidekiq_memory_killer.md @marcia
/doc/administration/package_information/ @axil
-/doc/administration/packages/ @ngaskill
-/doc/administration/pages/index.md @rdickenson
-/doc/administration/pages/source.md @rdickenson
+/doc/administration/packages/ @claytoncornell
+/doc/administration/pages/index.md @aqualls
+/doc/administration/pages/source.md @aqualls
/doc/administration/polling.md @axil
-/doc/administration/postgresql/ @aqualls
+/doc/administration/postgresql/ @marcia
/doc/administration/pseudonymizer.md @axil
/doc/administration/raketasks/ @axil
/doc/administration/raketasks/praefect.md @eread
@@ -291,17 +279,19 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/administration/smime_signing_email.md @axil
/doc/administration/snippets/index.md @aqualls
/doc/administration/static_objects_external_storage.md @aqualls
-/doc/administration/terraform_state.md @sselhorn
+/doc/administration/system_hooks.md @kpaizee
+/doc/administration/terraform_state.md @marcia
/doc/administration/timezone.md @axil
/doc/administration/troubleshooting/ @axil
/doc/administration/troubleshooting/elasticsearch.md @rdickenson
-/doc/administration/troubleshooting/postgresql.md @aqualls
+/doc/administration/troubleshooting/postgresql.md @marcia
/doc/administration/uploads.md @axil
/doc/administration/user_settings.md @eread
/doc/administration/whats-new.md @kpaizee
/doc/administration/wikis/index.md @aqualls
/doc/api/access_requests.md @eread
/doc/api/admin_sidekiq_queues.md @axil
+/doc/api/alert_management_alerts.md @msedlakjakubowski
/doc/api/api_resources.md @kpaizee
/doc/api/appearance.md @eread
/doc/api/applications.md @eread
@@ -311,12 +301,13 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/boards.md @msedlakjakubowski
/doc/api/branches.md @aqualls
/doc/api/broadcast_messages.md @kpaizee
-/doc/api/bulk_imports.md @ngaskill
+/doc/api/bulk_imports.md @eread
+/doc/api/cluster_agents.md @marcia
/doc/api/commits.md @aqualls
-/doc/api/container_registry.md @ngaskill
+/doc/api/container_registry.md @claytoncornell
/doc/api/custom_attributes.md @kpaizee
/doc/api/dependencies.md @rdickenson
-/doc/api/dependency_proxy.md @ngaskill
+/doc/api/dependency_proxy.md @claytoncornell
/doc/api/deploy_keys.md @rdickenson
/doc/api/deploy_tokens.md @rdickenson
/doc/api/deployments.md @rdickenson
@@ -327,12 +318,11 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/epic_issues.md @msedlakjakubowski
/doc/api/epic_links.md @msedlakjakubowski
/doc/api/epics.md @msedlakjakubowski
-/doc/api/error_tracking.md @ngaskill
+/doc/api/error_tracking.md @msedlakjakubowski
/doc/api/events.md @eread
/doc/api/experiments.md @kpaizee
/doc/api/feature_flag_specs.md @rdickenson
/doc/api/feature_flag_user_lists.md @rdickenson
-/doc/api/feature_flags_legacy.md @rdickenson
/doc/api/feature_flags.md @rdickenson
/doc/api/features.md @rdickenson
/doc/api/freeze_periods.md @rdickenson
@@ -340,23 +330,25 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/graphql/ @kpaizee
/doc/api/graphql/custom_emoji.md @msedlakjakubowski
/doc/api/graphql/sample_issue_boards.md @msedlakjakubowski
+/doc/api/group_access_tokens.md @eread
/doc/api/group_activity_analytics.md @fneill
-/doc/api/group_badges.md @eread
+/doc/api/group_badges.md @fneill
/doc/api/group_boards.md @msedlakjakubowski
-/doc/api/group_clusters.md @sselhorn
-/doc/api/group_import_export.md @ngaskill
+/doc/api/group_clusters.md @marcia
+/doc/api/group_import_export.md @eread
/doc/api/group_iterations.md @msedlakjakubowski
/doc/api/group_labels.md @msedlakjakubowski
/doc/api/group_level_variables.md @marcel.amirault
/doc/api/group_milestones.md @msedlakjakubowski
/doc/api/group_protected_environments.md @rdickenson
-/doc/api/group_relations_export.md @ngaskill
+/doc/api/group_relations_export.md @eread
+/doc/api/group_releases.md @rdickenson
/doc/api/group_repository_storage_moves.md @aqualls
/doc/api/group_wikis.md @aqualls
-/doc/api/groups.md @eread
-/doc/api/import.md @ngaskill
+/doc/api/groups.md @fneill
+/doc/api/import.md @eread
/doc/api/index.md @kpaizee
-/doc/api/instance_clusters.md @sselhorn
+/doc/api/instance_clusters.md @marcia
/doc/api/instance_level_ci_variables.md @marcel.amirault
/doc/api/integrations.md @kpaizee
/doc/api/invitations.md @kpaizee
@@ -364,11 +356,12 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/issues_statistics.md @msedlakjakubowski
/doc/api/issues.md @msedlakjakubowski
/doc/api/iterations.md @msedlakjakubowski
-/doc/api/job_artifacts.md @eread
+/doc/api/job_artifacts.md @marcel.amirault
/doc/api/jobs.md @marcel.amirault
/doc/api/keys.md @aqualls
/doc/api/labels.md @msedlakjakubowski
/doc/api/license.md @kpaizee
+/doc/api/linked_epics.md @msedlakjakubowski
/doc/api/lint.md @marcel.amirault
/doc/api/managed_licenses.md @kpaizee
/doc/api/markdown.md @aqualls
@@ -377,29 +370,30 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/merge_request_context_commits.md @aqualls
/doc/api/merge_requests.md @aqualls
/doc/api/merge_trains.md @marcel.amirault
-/doc/api/metrics_dashboard_annotations.md @ngaskill
-/doc/api/metrics_user_starred_dashboards.md @ngaskill
+/doc/api/metrics_dashboard_annotations.md @msedlakjakubowski
+/doc/api/metrics_user_starred_dashboards.md @msedlakjakubowski
/doc/api/milestones.md @msedlakjakubowski
/doc/api/namespaces.md @eread
/doc/api/notes.md @msedlakjakubowski
/doc/api/notification_settings.md @msedlakjakubowski
/doc/api/oauth2.md @eread
/doc/api/openapi/openapi_interactive.md @kpaizee
-/doc/api/packages.md @ngaskill
-/doc/api/packages/ @ngaskill
-/doc/api/pages_domains.md @rdickenson
-/doc/api/pages.md @rdickenson
+/doc/api/packages.md @claytoncornell
+/doc/api/packages/ @claytoncornell
+/doc/api/pages_domains.md @aqualls
+/doc/api/pages.md @aqualls
/doc/api/personal_access_tokens.md @eread
/doc/api/pipeline_schedules.md @marcel.amirault
/doc/api/pipeline_triggers.md @marcel.amirault
/doc/api/pipelines.md @marcel.amirault
/doc/api/plan_limits.md @eread
+/doc/api/project_access_tokens.md @eread
/doc/api/project_aliases.md @aqualls
/doc/api/project_badges.md @aqualls
-/doc/api/project_clusters.md @sselhorn
+/doc/api/project_clusters.md @marcia
/doc/api/project_import_export.md @aqualls
/doc/api/project_level_variables.md @marcel.amirault
-/doc/api/project_relations_export.md @ngaskill
+/doc/api/project_relations_export.md @eread
/doc/api/project_repository_storage_moves.md @eread
/doc/api/project_snippets.md @aqualls
/doc/api/project_statistics.md @aqualls
@@ -440,19 +434,19 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/templates/licenses.md @rdickenson
/doc/api/todos.md @msedlakjakubowski
/doc/api/topics.md @fneill
-/doc/api/usage_data.md @fneill
+/doc/api/usage_data.md @claytoncornell
/doc/api/users.md @eread
/doc/api/version.md @kpaizee
-/doc/api/visual_review_discussions.md @eread
-/doc/api/vulnerabilities.md @fneill
-/doc/api/vulnerability_exports.md @fneill
-/doc/api/vulnerability_findings.md @fneill
+/doc/api/visual_review_discussions.md @marcel.amirault
+/doc/api/vulnerabilities.md @claytoncornell
+/doc/api/vulnerability_exports.md @claytoncornell
+/doc/api/vulnerability_findings.md @claytoncornell
/doc/api/wikis.md @aqualls
-/doc/architecture/blueprints/container_registry_metadata_database/index.md @ngaskill
-/doc/architecture/blueprints/database/scalability/patterns/ @aqualls
-/doc/architecture/blueprints/gitlab_to_kubernetes_communication/index.md @sselhorn
+/doc/architecture/blueprints/container_registry_metadata_database/index.md @claytoncornell
+/doc/architecture/blueprints/database/scalability/patterns/ @marcia
+/doc/architecture/blueprints/gitlab_to_kubernetes_communication/index.md @marcia
/doc/ci/caching/index.md @marcel.amirault
-/doc/ci/chatops/index.md @sselhorn
+/doc/ci/chatops/index.md @marcia
/doc/ci/ci_cd_for_external_repos/ @marcel.amirault
/doc/ci/cloud_deployment/ecs/quick_start_guide.md @rdickenson
/doc/ci/cloud_deployment/index.md @rdickenson
@@ -467,11 +461,11 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/ci/examples/authenticating-with-hashicorp-vault/index.md @marcel.amirault
/doc/ci/examples/deployment/composer-npm-deploy.md @rdickenson
/doc/ci/examples/deployment/index.md @rdickenson
-/doc/ci/examples/end_to_end_testing_webdriverio/index.md @eread
+/doc/ci/examples/end_to_end_testing_webdriverio/index.md @marcel.amirault
/doc/ci/examples/index.md @marcel.amirault
/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md @marcel.amirault
/doc/ci/examples/php.md @marcel.amirault
-/doc/ci/examples/semantic-release.md @ngaskill
+/doc/ci/examples/semantic-release.md @claytoncornell
/doc/ci/git_submodules.md @marcel.amirault
/doc/ci/index.md @marcel.amirault
/doc/ci/interactive_web_terminal/index.md @sselhorn
@@ -481,16 +475,14 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/ci/jobs/job_control.md @marcel.amirault
/doc/ci/large_repositories/index.md @sselhorn
/doc/ci/lint.md @marcel.amirault
-/doc/ci/metrics_reports.md @eread
+/doc/ci/metrics_reports.md @marcel.amirault
/doc/ci/migration/circleci.md @marcel.amirault
/doc/ci/migration/jenkins.md @marcel.amirault
/doc/ci/pipeline_editor/index.md @marcel.amirault
/doc/ci/pipelines/ @marcel.amirault
-/doc/ci/pipelines/job_artifacts.md @eread
-/doc/ci/pipelines/pipeline_artifacts.md @eread
/doc/ci/quick_start/index.md @marcel.amirault
/doc/ci/resource_groups/index.md @rdickenson
-/doc/ci/review_apps/index.md @eread
+/doc/ci/review_apps/index.md @marcel.amirault
/doc/ci/runners/ @sselhorn
/doc/ci/secrets/index.md @marcel.amirault
/doc/ci/services/ @sselhorn
@@ -498,101 +490,123 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/ci/test_cases/index.md @msedlakjakubowski
/doc/ci/triggers/index.md @marcel.amirault
/doc/ci/troubleshooting.md @marcel.amirault
-/doc/ci/unit_test_reports.md @eread
+/doc/ci/unit_test_reports.md @marcel.amirault
/doc/ci/variables/ @marcel.amirault
/doc/ci/yaml/ @marcel.amirault
-/doc/ci/yaml/artifacts_reports.md @eread
-/doc/development/adding_database_indexes.md @aqualls
+/doc/development/adding_database_indexes.md @marcia
/doc/development/application_limits.md @axil
/doc/development/approval_rules.md @aqualls
/doc/development/audit_event_guide/index.md @eread
-/doc/development/auto_devops.md @sselhorn
-/doc/development/avoiding_downtime_in_migrations.md @aqualls
+/doc/development/auto_devops.md @marcia
/doc/development/backend/create_source_code_be/index.md @aqualls
+/doc/development/backend/ruby_style_guide.md @marcia
+/doc/development/batched_background_migrations.md @marcia
/doc/development/build_test_package.md @axil
-/doc/development/bulk_import.md @ngaskill
+/doc/development/bulk_import.md @eread
+/doc/development/cached_queries.md @marcia
/doc/development/cascading_settings.md @eread
-/doc/development/chatops_on_gitlabcom.md @sselhorn
+/doc/development/chatops_on_gitlabcom.md @marcia
/doc/development/cicd/cicd_reference_documentation_guide.md @marcel.amirault
/doc/development/cicd/index.md @marcel.amirault
/doc/development/cicd/schema.md @marcel.amirault
/doc/development/cicd/templates.md @marcel.amirault
/doc/development/code_intelligence/index.md @aqualls
-/doc/development/creating_enums.md @aqualls
-/doc/development/database_debugging.md @aqualls
-/doc/development/database_query_comments.md @aqualls
-/doc/development/database_review.md @aqualls
-/doc/development/database/ @aqualls
-/doc/development/db_dump.md @aqualls
+/doc/development/contributing/ @marcia
+/doc/development/contributing/merge_request_workflow.md @aqualls
+/doc/development/creating_enums.md @marcia
+/doc/development/database_debugging.md @marcia
+/doc/development/database_query_comments.md @marcia
+/doc/development/database_review.md @marcia
+/doc/development/database/ @marcia
+/doc/development/database/multiple_databases.md @marcia
+/doc/development/db_dump.md @marcia
/doc/development/developing_with_solargraph.md @aqualls
-/doc/development/distributed_tracing.md @ngaskill
+/doc/development/diffs.md @aqualls
+/doc/development/distributed_tracing.md @msedlakjakubowski
/doc/development/documentation/feature_flags.md @sselhorn
/doc/development/documentation/graphql_styleguide.md @sselhorn
-/doc/development/documentation/index.md @cnorris
-/doc/development/documentation/redirects.md @cnorris
-/doc/development/documentation/review_apps.md @cnorris
+/doc/development/documentation/index.md @dianalogan
+/doc/development/documentation/redirects.md @dianalogan
+/doc/development/documentation/review_apps.md @dianalogan
/doc/development/documentation/structure.md @sselhorn
/doc/development/documentation/styleguide/ @sselhorn
-/doc/development/documentation/testing.md @cnorris
-/doc/development/elasticsearch.md @rdickenson
-/doc/development/experiment_guide/ @kpaizee
-/doc/development/export_csv.md @ngaskill
+/doc/development/documentation/testing.md @dianalogan
+/doc/development/elasticsearch.md @marcia
+/doc/development/experiment_guide/gitlab_experiment.md @kpaizee
+/doc/development/experiment_guide/index.md @kpaizee
+/doc/development/export_csv.md @eread
/doc/development/fe_guide/content_editor.md @aqualls
+/doc/development/fe_guide/dark_mode.md @marcia
+/doc/development/fe_guide/graphql.md @marcia
/doc/development/fe_guide/source_editor.md @aqualls
+/doc/development/feature_categorization/index.md @marcia
+/doc/development/feature_flags/controls.md @marcia
+/doc/development/feature_flags/index.md @marcia
/doc/development/filtering_by_label.md @msedlakjakubowski
-/doc/development/foreign_keys.md @aqualls
+/doc/development/foreign_keys.md @marcia
/doc/development/geo.md @axil
/doc/development/geo/framework.md @axil
/doc/development/git_object_deduplication.md @eread
/doc/development/gitaly.md @eread
/doc/development/graphql_guide/ @kpaizee
-/doc/development/graphql_guide/batchloader.md @aqualls
-/doc/development/hash_indexes.md @aqualls
-/doc/development/i18n/ @ngaskill
-/doc/development/image_scaling.md @marcel.amirault
-/doc/development/import_export.md @ngaskill
-/doc/development/insert_into_tables_in_batches.md @aqualls
-/doc/development/integrations/jenkins.md @kpaizee
-/doc/development/integrations/jira_connect.md @kpaizee
+/doc/development/graphql_guide/batchloader.md @marcia
+/doc/development/hash_indexes.md @marcia
+/doc/development/i18n/ @eread
+/doc/development/image_scaling.md @marcia
+/doc/development/import_export.md @eread
+/doc/development/index.md @marcia
+/doc/development/insert_into_tables_in_batches.md @marcia
+/doc/development/integrations/ @kpaizee
+/doc/development/integrations/codesandbox.md @marcia
/doc/development/integrations/secure_partner_integration.md @rdickenson
-/doc/development/integrations/secure.md @ngaskill
+/doc/development/integrations/secure.md @claytoncornell
/doc/development/internal_api/ @aqualls
+/doc/development/internal_users.md @marcia
/doc/development/issuable-like-models.md @msedlakjakubowski
/doc/development/issue_types.md @msedlakjakubowski
-/doc/development/iterating_tables_in_batches.md @aqualls
-/doc/development/kubernetes.md @sselhorn
+/doc/development/iterating_tables_in_batches.md @marcia
+/doc/development/kubernetes.md @marcia
/doc/development/lfs.md @aqualls
/doc/development/licensed_feature_availability.md @sselhorn
+/doc/development/logging.md @msedlakjakubowski
/doc/development/maintenance_mode.md @axil
/doc/development/new_fe_guide/modules/widget_extensions.md @aqualls
+/doc/development/new_fe_guide/tips.md @marcia
/doc/development/omnibus.md @axil
-/doc/development/ordering_table_columns.md @aqualls
-/doc/development/packages.md @ngaskill
+/doc/development/ordering_table_columns.md @marcia
+/doc/development/packages.md @claytoncornell
+/doc/development/permissions.md @eread
+/doc/development/policies.md @eread
/doc/development/product_qualified_lead_guide/index.md @kpaizee
-/doc/development/query_performance.md @aqualls
+/doc/development/project_templates.md @fneill
+/doc/development/prometheus_metrics.md @msedlakjakubowski
+/doc/development/query_performance.md @marcia
+/doc/development/query_recorder.md @marcia
/doc/development/real_time.md @msedlakjakubowski
-/doc/development/serializing_data.md @aqualls
-/doc/development/service_ping/ @fneill
-/doc/development/snowplow/ @fneill
-/doc/development/sql.md @aqualls
-/doc/development/swapping_tables.md @aqualls
-/doc/development/understanding_explain_plans.md @aqualls
+/doc/development/secure_coding_guidelines.md @marcia
+/doc/development/serializing_data.md @marcia
+/doc/development/service_ping/ @claytoncornell
+/doc/development/single_table_inheritance.md @marcia
+/doc/development/snowplow/ @claytoncornell
+/doc/development/spam_protection_and_captcha/ @eread
+/doc/development/sql.md @marcia
+/doc/development/swapping_tables.md @marcia
+/doc/development/testing_guide/best_practices.md @marcia
+/doc/development/testing_guide/end_to_end/best_practices.md @marcia
+/doc/development/understanding_explain_plans.md @marcia
/doc/development/value_stream_analytics.md @fneill
/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md @fneill
-/doc/development/verifying_database_capabilities.md @aqualls
+/doc/development/verifying_database_capabilities.md @marcia
/doc/development/wikis.md @aqualls
-/doc/development/work_items.md @msedlakjakubowski
/doc/development/work_items_widgets.md @msedlakjakubowski
+/doc/development/work_items.md @msedlakjakubowski
+/doc/development/workhorse/ @aqualls
+/doc/development/workspace/index.md @marcia
/doc/downgrade_ee_to_ce/index.md @axil
-/doc/gitlab-basics/add-file.md @aqualls
-/doc/gitlab-basics/command-line-commands.md @aqualls
-/doc/gitlab-basics/create-branch.md @aqualls
-/doc/gitlab-basics/feature_branch_workflow.md @aqualls
-/doc/gitlab-basics/index.md @aqualls
-/doc/gitlab-basics/start-using-git.md @aqualls
+/doc/gitlab-basics/ @aqualls
/doc/install/ @axil
/doc/integration/ @kpaizee
-/doc/integration/elasticsearch.md @rdickenson
+/doc/integration/elasticsearch.md @marcia
/doc/integration/gitpod.md @aqualls
/doc/integration/kerberos.md @eread
/doc/integration/mattermost/index.md @axil
@@ -600,42 +614,40 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/integration/saml.md @eread
/doc/integration/security_partners/index.md @rdickenson
/doc/integration/sourcegraph.md @aqualls
-/doc/integration/vault.md @sselhorn
-/doc/operations/ @ngaskill
+/doc/integration/vault.md @marcia
+/doc/operations/ @msedlakjakubowski
/doc/operations/feature_flags.md @rdickenson
-/doc/operations/product_analytics.md @fneill
+/doc/operations/product_analytics.md @claytoncornell
/doc/policy/ @axil
-/doc/public_access/public_access.md @fneill
/doc/raketasks/ @axil
-/doc/raketasks/generate_sample_prometheus_data.md @ngaskill
+/doc/raketasks/generate_sample_prometheus_data.md @msedlakjakubowski
/doc/raketasks/migrate_snippets.md @aqualls
/doc/raketasks/spdx.md @rdickenson
/doc/raketasks/x509_signatures.md @aqualls
/doc/security/ @eread
-/doc/ssh/index.md @eread
-/doc/subscriptions/ @fneill
-/doc/system_hooks/system_hooks.md @kpaizee
+/doc/subscriptions/ @sselhorn
/doc/topics/authentication/index.md @eread
-/doc/topics/autodevops/ @sselhorn
+/doc/topics/autodevops/ @marcia
/doc/topics/git/ @aqualls
/doc/topics/gitlab_flow.md @aqualls
/doc/topics/offline/ @axil
/doc/topics/plan_and_track.md @msedlakjakubowski
/doc/update/ @axil
-/doc/update/mysql_to_postgresql.md @aqualls
-/doc/update/upgrading_postgresql_using_slony.md @aqualls
+/doc/update/mysql_to_postgresql.md @marcia
+/doc/update/upgrading_postgresql_using_slony.md @marcia
/doc/user/admin_area/analytics/ @fneill
/doc/user/admin_area/broadcast_messages.md @kpaizee
/doc/user/admin_area/credentials_inventory.md @eread
-/doc/user/admin_area/custom_project_templates.md @ngaskill
+/doc/user/admin_area/custom_project_templates.md @eread
/doc/user/admin_area/diff_limits.md @aqualls
/doc/user/admin_area/geo_nodes.md @axil
/doc/user/admin_area/labels.md @msedlakjakubowski
+/doc/user/admin_area/license_file.md @sselhorn
/doc/user/admin_area/license.md @kpaizee
/doc/user/admin_area/merge_requests_approvals.md @aqualls
/doc/user/admin_area/moderate_users.md @eread
-/doc/user/admin_area/monitoring/background_migrations.md @aqualls
-/doc/user/admin_area/monitoring/health_check.md @ngaskill
+/doc/user/admin_area/monitoring/background_migrations.md @marcia
+/doc/user/admin_area/monitoring/health_check.md @msedlakjakubowski
/doc/user/admin_area/reporting/spamcheck.md @axil
/doc/user/admin_area/review_abuse_reports.md @eread
/doc/user/admin_area/settings/account_and_limit_settings.md @aqualls
@@ -646,10 +658,10 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/admin_area/settings/files_api_rate_limits.md @aqualls
/doc/user/admin_area/settings/git_lfs_rate_limits.md @aqualls
/doc/user/admin_area/settings/gitaly_timeouts.md @eread
-/doc/user/admin_area/settings/import_export_rate_limits.md @ngaskill
+/doc/user/admin_area/settings/import_export_rate_limits.md @eread
/doc/user/admin_area/settings/index.md @aqualls
/doc/user/admin_area/settings/instance_template_repository.md @aqualls
-/doc/user/admin_area/settings/package_registry_rate_limits.md @ngaskill
+/doc/user/admin_area/settings/package_registry_rate_limits.md @claytoncornell
/doc/user/admin_area/settings/project_integration_management.md @kpaizee
/doc/user/admin_area/settings/push_event_activities_limit.md @aqualls
/doc/user/admin_area/settings/rate_limit_on_issues_creation.md @msedlakjakubowski
@@ -657,66 +669,74 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/admin_area/settings/rate_limit_on_users_api.md @eread
/doc/user/admin_area/settings/third_party_offers.md @fneill
/doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls
-/doc/user/analytics/ci_cd_analytics.md @rdickenson
/doc/user/analytics/ @fneill
+/doc/user/analytics/ci_cd_analytics.md @rdickenson
/doc/user/application_security/ @rdickenson
-/doc/user/application_security/cluster_image_scanning/index.md @ngaskill
-/doc/user/application_security/container_scanning/index.md @ngaskill
-/doc/user/application_security/cve_id_request.md @fneill
-/doc/user/application_security/policies/ @ngaskill
-/doc/user/application_security/security_dashboard/index.md @fneill
-/doc/user/application_security/threat_monitoring/index.md @ngaskill
-/doc/user/application_security/vulnerabilities/ @fneill
-/doc/user/application_security/vulnerability_report/index.md @fneill
+/doc/user/application_security/cluster_image_scanning/index.md @claytoncornell
+/doc/user/application_security/container_scanning/index.md @claytoncornell
+/doc/user/application_security/coverage_fuzzing/index.md @rdickenson
+/doc/user/application_security/cve_id_request.md @claytoncornell
+/doc/user/application_security/policies/ @claytoncornell
+/doc/user/application_security/security_dashboard/index.md @claytoncornell
+/doc/user/application_security/threat_monitoring/index.md @claytoncornell
+/doc/user/application_security/vulnerabilities/index.md @claytoncornell
+/doc/user/application_security/vulnerabilities/severities.md @claytoncornell
+/doc/user/application_security/vulnerability_report/index.md @claytoncornell
/doc/user/asciidoc.md @aqualls
/doc/user/award_emojis.md @msedlakjakubowski
-/doc/user/clusters/ @sselhorn
+/doc/user/clusters/ @marcia
/doc/user/compliance/compliance_report/index.md @eread
/doc/user/compliance/index.md @eread
/doc/user/compliance/license_compliance/index.md @rdickenson
/doc/user/crm/index.md @msedlakjakubowski
/doc/user/discussions/index.md @aqualls
-/doc/user/group/clusters/index.md @sselhorn
+/doc/user/feature_flags.md @marcia
+/doc/user/group/clusters/index.md @marcia
/doc/user/group/contribution_analytics/index.md @fneill
-/doc/user/group/custom_project_templates.md @ngaskill
+/doc/user/group/custom_project_templates.md @eread
/doc/user/group/devops_adoption/index.md @fneill
/doc/user/group/epics/epic_boards.md @msedlakjakubowski
/doc/user/group/epics/index.md @msedlakjakubowski
+/doc/user/group/epics/linked_epics.md @msedlakjakubowski
/doc/user/group/epics/manage_epics.md @msedlakjakubowski
-/doc/user/group/import/index.md @ngaskill
-/doc/user/group/index.md @eread
+/doc/user/group/import/index.md @eread
+/doc/user/group/index.md @fneill
/doc/user/group/insights/index.md @fneill
/doc/user/group/issues_analytics/index.md @msedlakjakubowski
/doc/user/group/iterations/index.md @msedlakjakubowski
/doc/user/group/planning_hierarchy/index.md @msedlakjakubowski
-/doc/user/group/repositories_analytics/index.md @eread
+/doc/user/group/repositories_analytics/index.md @marcel.amirault
/doc/user/group/roadmap/index.md @msedlakjakubowski
/doc/user/group/saml_sso/group_managed_accounts.md @eread
/doc/user/group/saml_sso/index.md @eread
/doc/user/group/saml_sso/scim_setup.md @eread
-/doc/user/group/settings/import_export.md @ngaskill
-/doc/user/group/subgroups/index.md @eread
+/doc/user/group/settings/group_access_tokens.md @eread
+/doc/user/group/settings/import_export.md @eread
+/doc/user/group/subgroups/index.md @fneill
/doc/user/group/value_stream_analytics/index.md @fneill
-/doc/user/infrastructure/clusters/ @sselhorn
-/doc/user/infrastructure/clusters/manage/management_project_applications/apparmor.md @ngaskill
-/doc/user/infrastructure/clusters/manage/management_project_applications/cilium.md @ngaskill
-/doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md @ngaskill
-/doc/user/infrastructure/clusters/manage/management_project_applications/falco.md @ngaskill
-/doc/user/infrastructure/clusters/manage/management_project_applications/fluentd.md @ngaskill
-/doc/user/infrastructure/iac/ @sselhorn
-/doc/user/infrastructure/index.md @ssehorn
+/doc/user/infrastructure/clusters/ @marcia
+/doc/user/infrastructure/clusters/manage/management_project_applications/apparmor.md @claytoncornell
+/doc/user/infrastructure/clusters/manage/management_project_applications/cilium.md @claytoncornell
+/doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md @msedlakjakubowski
+/doc/user/infrastructure/clusters/manage/management_project_applications/falco.md @claytoncornell
+/doc/user/infrastructure/clusters/manage/management_project_applications/fluentd.md @claytoncornell
+/doc/user/infrastructure/clusters/manage/management_project_applications/prometheus.md @msedlakjakubowski
+/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md @marcia
+/doc/user/infrastructure/clusters/manage/management_project_applications/sentry.md @msedlakjakubowski
+/doc/user/infrastructure/iac/ @marcia
+/doc/user/infrastructure/index.md @marcia
/doc/user/markdown.md @aqualls
-/doc/user/packages/ @ngaskill
-/doc/user/packages/infrastructure_registry/index.md @sselhorn
-/doc/user/packages/terraform_module_registry/index.md @sselhorn
+/doc/user/packages/ @claytoncornell
+/doc/user/packages/infrastructure_registry/index.md @marcia
+/doc/user/packages/terraform_module_registry/index.md @marcia
/doc/user/permissions.md @eread
/doc/user/profile/ @eread
/doc/user/profile/notifications.md @msedlakjakubowski
/doc/user/project/autocomplete_characters.md @aqualls
/doc/user/project/badges.md @aqualls
-/doc/user/project/clusters/ @sselhorn
-/doc/user/project/clusters/kubernetes_pod_logs.md @ngaskill
-/doc/user/project/clusters/protect/ @ngaskill
+/doc/user/project/clusters/ @marcia
+/doc/user/project/clusters/kubernetes_pod_logs.md @msedlakjakubowski
+/doc/user/project/clusters/protect/ @claytoncornell
/doc/user/project/code_intelligence.md @aqualls
/doc/user/project/code_owners.md @aqualls
/doc/user/project/deploy_boards.md @rdickenson
@@ -726,32 +746,31 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/project/file_lock.md @aqualls
/doc/user/project/git_attributes.md @aqualls
/doc/user/project/highlighting.md @aqualls
-/doc/user/project/import/ @ngaskill
+/doc/user/project/import/ @eread
/doc/user/project/import/jira.md @msedlakjakubowski
/doc/user/project/index.md @fneill
/doc/user/project/integrations/ @kpaizee
-/doc/user/project/integrations/prometheus_library/ @ngaskill
-/doc/user/project/integrations/prometheus.md @ngaskill
+/doc/user/project/integrations/prometheus_library/ @msedlakjakubowski
+/doc/user/project/integrations/prometheus.md @msedlakjakubowski
/doc/user/project/issue_board.md @msedlakjakubowski
/doc/user/project/issues/ @msedlakjakubowski
+/doc/user/project/issues/csv_import.md @eread
/doc/user/project/labels.md @msedlakjakubowski
-/doc/user/project/members/index.md @eread
+/doc/user/project/members/index.md @fneill
/doc/user/project/members/share_project_with_groups.md @fneill
/doc/user/project/merge_requests/ @aqualls
-/doc/user/project/merge_requests/accessibility_testing.md @eread
-/doc/user/project/merge_requests/browser_performance_testing.md @eread
+/doc/user/project/merge_requests/accessibility_testing.md @marcel.amirault
+/doc/user/project/merge_requests/browser_performance_testing.md @marcel.amirault
/doc/user/project/merge_requests/code_quality.md @rdickenson
/doc/user/project/merge_requests/csv_export.md @eread
-/doc/user/project/merge_requests/fail_fast_testing.md @eread
-/doc/user/project/merge_requests/load_performance_testing.md @eread
+/doc/user/project/merge_requests/fail_fast_testing.md @marcel.amirault
+/doc/user/project/merge_requests/load_performance_testing.md @marcel.amirault
+/doc/user/project/merge_requests/reviews/index.md @aqualls
/doc/user/project/merge_requests/status_checks.md @eread
-/doc/user/project/merge_requests/test_coverage_visualization.md @eread
-/doc/user/project/merge_requests/testing_and_reports_in_merge_requests.md @eread
+/doc/user/project/merge_requests/test_coverage_visualization.md @marcel.amirault
+/doc/user/project/merge_requests/testing_and_reports_in_merge_requests.md @marcel.amirault
/doc/user/project/milestones/ @msedlakjakubowski
-/doc/user/project/pages/ @rdickenson
-/doc/user/project/protected_branches.md @aqualls
-/doc/user/project/protected_tags.md @aqualls
-/doc/user/project/push_options.md @aqualls
+/doc/user/project/pages/ @aqualls
/doc/user/project/quick_actions.md @msedlakjakubowski
/doc/user/project/releases/index.md @rdickenson
/doc/user/project/releases/release_cli.md @rdickenson
@@ -759,7 +778,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/project/repository/reducing_the_repo_size_using_git.md @eread
/doc/user/project/requirements/index.md @msedlakjakubowski
/doc/user/project/service_desk.md @msedlakjakubowski
-/doc/user/project/settings/import_export.md @ngaskill
+/doc/user/project/settings/import_export.md @eread
/doc/user/project/settings/index.md @fneill
/doc/user/project/settings/project_access_tokens.md @eread
/doc/user/project/static_site_editor/index.md @aqualls
@@ -768,12 +787,42 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/project/wiki/group.md @aqualls
/doc/user/project/wiki/index.md @aqualls
/doc/user/project/working_with_projects.md @fneill
+/doc/user/public_access.md @fneill
/doc/user/reserved_names.md @fneill
-/doc/user/search/advanced_search.md @rdickenson
+/doc/user/search/advanced_search.md @marcia
/doc/user/search/index.md @aqualls
/doc/user/shortcuts.md @aqualls
/doc/user/snippets.md @aqualls
+/doc/user/ssh.md @eread
/doc/user/tasks.md @msedlakjakubowski
/doc/user/todos.md @msedlakjakubowski
-/doc/user/usage_quotas.md @fneill
+/doc/user/usage_quotas.md @sselhorn
/doc/user/workspace/index.md @fneill
+
+[Authentication and Authorization]
+/app/**/*password* @gitlab-org/manage/authentication-and-authorization
+/ee/app/**/*password* @gitlab-org/manage/authentication-and-authorization
+/config/**/*password* @gitlab-org/manage/authentication-and-authorization
+/ee/config/**/*password* @gitlab-org/manage/authentication-and-authorization
+/lib/**/*password* @gitlab-org/manage/authentication-and-authorization
+/ee/lib/**/*password* @gitlab-org/manage/authentication-and-authorization
+/app/controllers/**/*password* @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/**/*password* @gitlab-org/manage/authentication-and-authorization
+
+/app/**/*auth* @gitlab-org/manage/authentication-and-authorization
+/ee/app/**/*auth* @gitlab-org/manage/authentication-and-authorization
+/config/**/*auth* @gitlab-org/manage/authentication-and-authorization
+/ee/config/**/*auth* @gitlab-org/manage/authentication-and-authorization
+/lib/**/*auth* @gitlab-org/manage/authentication-and-authorization
+/ee/lib/**/*auth* @gitlab-org/manage/authentication-and-authorization
+/app/controllers/**/*auth* @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/**/*auth* @gitlab-org/manage/authentication-and-authorization
+
+/app/**/*token* @gitlab-org/manage/authentication-and-authorization
+/ee/app/**/*token* @gitlab-org/manage/authentication-and-authorization
+/config/**/*token* @gitlab-org/manage/authentication-and-authorization
+/ee/config/**/*token* @gitlab-org/manage/authentication-and-authorization
+/lib/**/*token* @gitlab-org/manage/authentication-and-authorization
+/ee/lib/**/*token* @gitlab-org/manage/authentication-and-authorization
+/app/controllers/**/*token* @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/**/*token* @gitlab-org/manage/authentication-and-authorization
diff --git a/.gitlab/ci/cng.gitlab-ci.yml b/.gitlab/ci/cng.gitlab-ci.yml
deleted file mode 100644
index d720ec5ae45..00000000000
--- a/.gitlab/ci/cng.gitlab-ci.yml
+++ /dev/null
@@ -1,51 +0,0 @@
-cloud-native-image-env:
- extends:
- - .default-retry
- - .cng:rules
- image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine3.13
- stage: post-test
- before_script:
- - source ./scripts/utils.sh
- - install_gitlab_gem
- script:
- - 'ruby -r./scripts/trigger-build.rb -e "puts Trigger.variables_for_env_file(Trigger::CNG.new.variables)" > build.env'
- - cat build.env
- artifacts:
- reports:
- dotenv: build.env
- paths:
- - build.env
- expire_in: 7 days
- when: always
-
-cloud-native-image:
- extends: .cng:rules
- stage: post-test
- needs: ["cloud-native-image-env"]
- inherit:
- variables: false
- variables:
- TOP_UPSTREAM_SOURCE_PROJECT: "${TOP_UPSTREAM_SOURCE_PROJECT}"
- TOP_UPSTREAM_SOURCE_REF: "${TOP_UPSTREAM_SOURCE_REF}"
- TOP_UPSTREAM_SOURCE_JOB: "${TOP_UPSTREAM_SOURCE_JOB}"
- TOP_UPSTREAM_SOURCE_SHA: "${TOP_UPSTREAM_SOURCE_SHA}"
- TOP_UPSTREAM_MERGE_REQUEST_PROJECT_ID: "${TOP_UPSTREAM_MERGE_REQUEST_PROJECT_ID}"
- TOP_UPSTREAM_MERGE_REQUEST_IID: "${TOP_UPSTREAM_MERGE_REQUEST_IID}"
- GITLAB_REF_SLUG: "${GITLAB_REF_SLUG}"
- # CNG pipeline specific variables
- GITLAB_VERSION: "${GITLAB_VERSION}"
- GITLAB_TAG: "${GITLAB_TAG}"
- GITLAB_ASSETS_TAG: "${GITLAB_ASSETS_TAG}"
- FORCE_RAILS_IMAGE_BUILDS: "${FORCE_RAILS_IMAGE_BUILDS}"
- CE_PIPELINE: "${CE_PIPELINE}" # Based on https://docs.gitlab.com/ee/ci/jobs/job_control.html#check-if-a-variable-exists, `if: '$CE_PIPELINE'` will evaluate to `false` when this variable is empty
- EE_PIPELINE: "${EE_PIPELINE}" # Based on https://docs.gitlab.com/ee/ci/jobs/job_control.html#check-if-a-variable-exists, `if: '$EE_PIPELINE'` will evaluate to `false` when this variable is empty
- GITLAB_SHELL_VERSION: "${GITLAB_SHELL_VERSION}"
- GITLAB_ELASTICSEARCH_INDEXER_VERSION: "${GITLAB_ELASTICSEARCH_INDEXER_VERSION}"
- GITLAB_KAS_VERSION: "${GITLAB_KAS_VERSION}"
- GITLAB_WORKHORSE_VERSION: "${GITLAB_WORKHORSE_VERSION}"
- GITLAB_PAGES_VERSION: "${GITLAB_PAGES_VERSION}"
- GITALY_SERVER_VERSION: "${GITALY_SERVER_VERSION}"
- trigger:
- project: gitlab-org/build/CNG
- branch: $TRIGGER_BRANCH
- strategy: depend
diff --git a/.gitlab/ci/docs.gitlab-ci.yml b/.gitlab/ci/docs.gitlab-ci.yml
index 8b7691045cb..217da6506bf 100644
--- a/.gitlab/ci/docs.gitlab-ci.yml
+++ b/.gitlab/ci/docs.gitlab-ci.yml
@@ -44,7 +44,7 @@ docs-lint markdown:
- .default-retry
- .docs:rules:docs-lint
# When updating the image version here, update it in /scripts/lint-doc.sh too.
- image: registry.gitlab.com/gitlab-org/gitlab-docs/lint-markdown:alpine-3.15-vale-2.15.0-markdownlint-0.31.0
+ image: registry.gitlab.com/gitlab-org/gitlab-docs/lint-markdown:alpine-3.15-vale-2.15.5-markdownlint-0.31.1
stage: lint
needs: []
script:
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index cb07384676d..6e84d4f3914 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -293,14 +293,14 @@ coverage-frontend:
- *yarn-install
- run_timed_command "retry yarn run webpack-prod"
-qa-frontend-node:12:
- extends: .qa-frontend-node
- image: ${GITLAB_DEPENDENCY_PROXY}node:12
-
qa-frontend-node:14:
extends: .qa-frontend-node
image: ${GITLAB_DEPENDENCY_PROXY}node:14
+qa-frontend-node:16:
+ extends: .qa-frontend-node
+ image: ${GITLAB_DEPENDENCY_PROXY}node:16
+
qa-frontend-node:latest:
extends:
- .qa-frontend-node
@@ -335,10 +335,13 @@ bundle-size-review:
stage: test
needs: ["compile-production-assets"]
script:
+ - source scripts/utils.sh
- mkdir -p bundle-size-review
- cp webpack-report/index.html bundle-size-review/bundle-report.html
- yarn global add https://gitlab.com/gitlab-org/frontend/playground/webpack-memory-metrics.git
- - danger --dangerfile=danger/bundle_size/Dangerfile --fail-on-errors=true --verbose --danger_id=bundle-size-review
+ - |
+ danger_id=$(echo -n ${DANGER_GITLAB_API_TOKEN} | md5sum | awk '{print $1}' | cut -c5-10)
+ run_timed_command "danger --dangerfile=danger/Dangerfile-bundle_size --fail-on-errors=true --verbose --danger_id=bundle-size-review-${danger_id}"
artifacts:
when: always
name: bundle-size-review
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index 146a7067acd..4069dfe9a2b 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -41,18 +41,19 @@
key:
files:
- GITALY_SERVER_VERSION
+ - lib/gitlab/setup_helper.rb
prefix: "gitaly-binaries-${DEBIAN-VERSION}"
paths:
- - tmp/tests/gitaly/_build/bin/
- - tmp/tests/gitaly/_build/deps/git/install/
- - tmp/tests/gitaly/config.toml
- - tmp/tests/gitaly/gitaly2.config.toml
- - tmp/tests/gitaly/internal/
- - tmp/tests/gitaly/internal_gitaly2/
- - tmp/tests/gitaly/internal_sockets/
- - tmp/tests/gitaly/Makefile
- - tmp/tests/gitaly/praefect.config.toml
- - tmp/tests/gitaly/ruby/
+ - ${TMP_TEST_FOLDER}/gitaly/_build/bin/
+ - ${TMP_TEST_FOLDER}/gitaly/_build/deps/git/install/
+ - ${TMP_TEST_FOLDER}/gitaly/config.toml
+ - ${TMP_TEST_FOLDER}/gitaly/gitaly2.config.toml
+ - ${TMP_TEST_FOLDER}/gitaly/internal/
+ - ${TMP_TEST_FOLDER}/gitaly/run/
+ - ${TMP_TEST_FOLDER}/gitaly/run2/
+ - ${TMP_TEST_FOLDER}/gitaly/Makefile
+ - ${TMP_TEST_FOLDER}/gitaly/praefect.config.toml
+ - ${TMP_TEST_FOLDER}/gitaly/ruby/
policy: pull
.go-pkg-cache: &go-pkg-cache
@@ -213,34 +214,33 @@
- *storybook-node-modules-cache-push
.use-pg11:
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-11-graphicsmagick-1.3.36
services:
- name: postgres:11.6
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:5.0-alpine
variables:
POSTGRES_HOST_AUTH_METHOD: trust
+ PG_VERSION: "11"
.use-pg12:
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-12-graphicsmagick-1.3.36
services:
- name: postgres:12
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:6.0-alpine
variables:
POSTGRES_HOST_AUTH_METHOD: trust
+ PG_VERSION: "12"
.use-pg13:
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-13-graphicsmagick-1.3.36
services:
- name: postgres:13
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:5.0-alpine
variables:
POSTGRES_HOST_AUTH_METHOD: trust
+ PG_VERSION: "13"
.use-pg11-ee:
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-11-graphicsmagick-1.3.36
services:
- name: postgres:11.6
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
@@ -249,9 +249,9 @@
command: ["elasticsearch", "-E", "discovery.type=single-node"]
variables:
POSTGRES_HOST_AUTH_METHOD: trust
+ PG_VERSION: "11"
.use-pg12-ee:
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-12-graphicsmagick-1.3.36
services:
- name: postgres:12
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
@@ -260,9 +260,9 @@
command: ["elasticsearch", "-E", "discovery.type=single-node"]
variables:
POSTGRES_HOST_AUTH_METHOD: trust
+ PG_VERSION: "12"
.use-pg13-ee:
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-13-graphicsmagick-1.3.36
services:
- name: postgres:13
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
@@ -271,6 +271,7 @@
command: ["elasticsearch", "-E", "discovery.type=single-node"]
variables:
POSTGRES_HOST_AUTH_METHOD: trust
+ PG_VERSION: "13"
.use-kaniko:
image:
diff --git a/.gitlab/ci/graphql.gitlab-ci.yml b/.gitlab/ci/graphql.gitlab-ci.yml
index 1a05f68b178..c4c4d500fb5 100644
--- a/.gitlab/ci/graphql.gitlab-ci.yml
+++ b/.gitlab/ci/graphql.gitlab-ci.yml
@@ -11,3 +11,5 @@ graphql-verify:
script:
- bundle exec rake gitlab:graphql:validate
- bundle exec rake gitlab:graphql:check_docs
+ - bundle exec rake gitlab:graphql:schema:dump
+ - node scripts/frontend/graphql_possible_types_extraction.js --check
diff --git a/.gitlab/ci/qa.gitlab-ci.yml b/.gitlab/ci/qa.gitlab-ci.yml
index 77d12a3e848..8881a4c486d 100644
--- a/.gitlab/ci/qa.gitlab-ci.yml
+++ b/.gitlab/ci/qa.gitlab-ci.yml
@@ -16,14 +16,14 @@
qa:internal:
extends:
- .qa-job-base
- - .qa:rules:ee-and-foss
+ - .qa:rules:internal
script:
- - bundle exec rspec
+ - bundle exec rspec -O .rspec_internal
qa:internal-as-if-foss:
extends:
- qa:internal
- - .qa:rules:as-if-foss
+ - .qa:rules:internal-as-if-foss
- .as-if-foss
qa:selectors:
@@ -33,15 +33,25 @@ qa:selectors:
script:
- bundle exec bin/qa Test::Sanity::Selectors
-qa:auto_quarantine:
+qa:master-auto-quarantine-dequarantine:
+ extends:
+ - .qa-job-base
+ rules:
+ - if: '$QA_TRIGGER_AUTO_QUARANTINE =~ /true|yes|1/i'
+ script:
+ - bundle exec confiner -r .confiner/master.yml
+ allow_failure: true
+
+qa:nightly-auto-quarantine-dequarantine:
extends:
- .qa-job-base
rules:
- if: '$QA_TRIGGER_AUTO_QUARANTINE =~ /true|yes|1/i'
script:
- - bundle exec confiner -r .confiner/quarantine.yml
+ - bundle exec confiner -r .confiner/nightly.yml
allow_failure: true
+
qa:selectors-as-if-foss:
extends:
- qa:selectors
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 1c745e6d986..9ca125a0b2a 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -24,8 +24,6 @@
.single-db-rspec:
extends: .single-db
- variables:
- GITLAB_USE_MODEL_LOAD_BALANCING: "false"
.rspec-base:
extends:
@@ -208,8 +206,8 @@ setup-test-env:
- ${TMP_TEST_FOLDER}/gitaly/config.toml
- ${TMP_TEST_FOLDER}/gitaly/gitaly2.config.toml
- ${TMP_TEST_FOLDER}/gitaly/internal/
- - ${TMP_TEST_FOLDER}/gitaly/internal_gitaly2/
- - ${TMP_TEST_FOLDER}/gitaly/internal_sockets/
+ - ${TMP_TEST_FOLDER}/gitaly/run/
+ - ${TMP_TEST_FOLDER}/gitaly/run2/
- ${TMP_TEST_FOLDER}/gitaly/Makefile
- ${TMP_TEST_FOLDER}/gitaly/praefect.config.toml
- ${TMP_TEST_FOLDER}/gitaly/ruby/
@@ -387,8 +385,6 @@ db:migrate-from-previous-major-version:
SETUP_DB: "false"
PROJECT_TO_CHECKOUT: "gitlab-foss"
TAG_TO_CHECKOUT: "v13.12.9"
- # FIXME: make this job work with `GITLAB_USE_MODEL_LOAD_BALANCING: true`, see https://gitlab.com/gitlab-org/gitlab/-/issues/355573
- GITLAB_USE_MODEL_LOAD_BALANCING: "false"
before_script:
- !reference [.default-before_script, before_script]
- '[[ -d "ee/" ]] || export PROJECT_TO_CHECKOUT="gitlab"'
diff --git a/.gitlab/ci/reports.gitlab-ci.yml b/.gitlab/ci/reports.gitlab-ci.yml
index d040abfe902..3628013fc9b 100644
--- a/.gitlab/ci/reports.gitlab-ci.yml
+++ b/.gitlab/ci/reports.gitlab-ci.yml
@@ -87,12 +87,6 @@ gemnasium-dependency_scanning:
- apk add git-lfs
rules: !reference [".reports:rules:gemnasium-dependency_scanning", rules]
-bundler-audit-dependency_scanning:
- rules: !reference [".reports:rules:bundler-audit-dependency_scanning", rules]
-
-retire-js-dependency_scanning:
- rules: !reference [".reports:rules:retire-js-dependency_scanning", rules]
-
gemnasium-python-dependency_scanning:
rules: !reference [".reports:rules:gemnasium-python-dependency_scanning", rules]
diff --git a/.gitlab/ci/review-apps/qa.gitlab-ci.yml b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
index a955096992f..d2192a7511a 100644
--- a/.gitlab/ci/review-apps/qa.gitlab-ci.yml
+++ b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
@@ -1,3 +1,10 @@
+include:
+ - project: gitlab-org/quality/pipeline-common
+ ref: 0.3.6
+ file:
+ - /ci/allure-report.yml
+ - /ci/knapsack-report.yml
+
.review-qa-base:
extends:
- .use-docker-in-docker
@@ -43,27 +50,13 @@
when: always
.allure-report-base:
- image:
- name: ${GITLAB_DEPENDENCY_PROXY}andrcuns/allure-report-publisher:0.4.2
- entrypoint: [""]
+ extends: .generate-allure-report-base
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
+ ALLURE_RESULTS_GLOB: qa/tmp/allure-results/*
review-qa-smoke:
extends:
@@ -121,23 +114,19 @@ review-performance:
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-reliable:
+# Generate single report for both smoke and reliable test jobs
+# Both job types are essentially the same:
+# * always executed
+# * always blocking
+allure-report-qa-blocking:
extends:
- .allure-report-base
- - .review:rules:review-qa-reliable-report
- needs: ["review-qa-reliable"]
+ - .review:rules:review-qa-blocking-report
+ needs:
+ - review-qa-smoke
+ - review-qa-reliable
variables:
- ALLURE_REPORT_PATH_PREFIX: gitlab-review-reliable
- ALLURE_JOB_NAME: review-qa-reliable
+ ALLURE_JOB_NAME: review-qa-blocking
allure-report-qa-all:
extends:
@@ -145,18 +134,11 @@ allure-report-qa-all:
- .review:rules:review-qa-all-report
needs: ["review-qa-all"]
variables:
- ALLURE_REPORT_PATH_PREFIX: gitlab-review-all
ALLURE_JOB_NAME: review-qa-all
knapsack-report:
extends:
- - .review:rules:knapsack-report
- image:
- name: ${QA_IMAGE}
- entrypoint: [""]
+ - .generate-knapsack-report-base
stage: post-qa
- allow_failure: true
- before_script:
- - cd qa
- script:
- - bundle exec rake 'knapsack:upload[tmp/knapsack/*/*.json]'
+ variables:
+ QA_KNAPSACK_REPORT_FILE_PATTERN: $CI_PROJECT_DIR/tmp/knapsack/*/*.json
diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml
index b90af076a56..03223e64b23 100644
--- a/.gitlab/ci/review.gitlab-ci.yml
+++ b/.gitlab/ci/review.gitlab-ci.yml
@@ -1,3 +1,6 @@
+include:
+ - remote: 'https://gitlab.com/gitlab-org/modelops/applied-ml/review-recommender/ci-templates/-/raw/v0.2.1/recommender/Reviewers.gitlab-ci.yml'
+
review-cleanup:
extends:
- .default-retry
@@ -55,7 +58,8 @@ danger-review:
if [ -z "$DANGER_GITLAB_API_TOKEN" ]; then
run_timed_command danger_as_local
else
- run_timed_command "bundle exec danger --fail-on-errors=true --verbose"
+ danger_id=$(echo -n ${DANGER_GITLAB_API_TOKEN} | md5sum | awk '{print $1}' | cut -c5-10)
+ run_timed_command "bundle exec danger --fail-on-errors=true --verbose --danger_id=${danger_id}"
fi
danger-review-local:
@@ -64,3 +68,9 @@ danger-review-local:
- .review:rules:danger-local
script:
- run_timed_command danger_as_local
+
+reviewers-recommender:
+ extends:
+ - .default-retry
+ stage: test
+ needs: []
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index 70b532b97f4..142341e5741 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -13,6 +13,9 @@
.if-jh: &if-jh
if: '$CI_PROJECT_PATH =~ /^gitlab-(jh|cn)\/.*/'
+.if-force-ci: &if-force-ci
+ if: '$FORCE_GITLAB_CI'
+
.if-default-refs: &if-default-refs
if: '$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH || $CI_COMMIT_REF_NAME =~ /^[\d-]+-stable(-ee)?$/ || $CI_COMMIT_REF_NAME =~ /^\d+-\d+-auto-deploy-\d+$/ || $CI_COMMIT_REF_NAME =~ /^security\// || $CI_MERGE_REQUEST_IID || $CI_COMMIT_TAG || $FORCE_GITLAB_CI'
@@ -70,6 +73,9 @@
.if-merge-request-labels-skip-undercoverage: &if-merge-request-labels-skip-undercoverage
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:skip-undercoverage/'
+.if-merge-request-labels-jh-contribution: &if-merge-request-labels-jh-contribution
+ if: '$CI_MERGE_REQUEST_LABELS =~ /JiHu contribution/'
+
.if-security-merge-request: &if-security-merge-request
if: '$CI_PROJECT_NAMESPACE == "gitlab-org/security" && $CI_MERGE_REQUEST_IID'
@@ -158,6 +164,7 @@
.gitaly-patterns: &gitaly-patterns
- "GITALY_SERVER_VERSION"
+ - "lib/gitlab/setup_helper.rb"
.workhorse-patterns: &workhorse-patterns
- "GITLAB_WORKHORSE_VERSION"
@@ -257,6 +264,8 @@
- ".gitlab/ci/**/*"
- "*_VERSION"
- "scripts/rspec_helpers.sh"
+ # Mapped patterns (see tests.yml)
+ - "data/whats_new/*.yml"
# DB patterns + .ci-patterns
.db-patterns: &db-patterns
@@ -269,7 +278,9 @@
- "lib/gitlab/markdown_cache/active_record/**/*"
- "config/prometheus/common_metrics.yml" # Used by Gitlab::DatabaseImporters::CommonMetrics::Importer
- "{,ee/,jh/}app/models/project_statistics.rb" # Used to calculate sizes in migration specs
- - "GITALY_SERVER_VERSION" # Has interactions with background migrations:https://gitlab.com/gitlab-org/gitlab/-/issues/336538
+ # Gitaly has interactions with background migrations: https://gitlab.com/gitlab-org/gitlab/-/issues/336538
+ - "GITALY_SERVER_VERSION"
+ - "lib/gitlab/setup_helper.rb"
# CI changes
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
@@ -311,10 +322,11 @@
- "config.ru"
- "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- - "data/whats_new/*.yml"
# CI changes
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
+ # Mapped patterns (see tests.yml)
+ - "data/whats_new/*.yml"
# .code-patterns + .backstage-patterns
.code-backstage-patterns: &code-backstage-patterns
@@ -335,7 +347,6 @@
- "config.ru"
- "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- - "data/whats_new/*.yml"
# CI changes
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
@@ -346,6 +357,8 @@
- "{,ee/,jh/}rubocop/**/*"
- "{,ee/,jh/}spec/**/*"
- "{,spec/}tooling/**/*"
+ # Mapped patterns (see tests.yml)
+ - "data/whats_new/*.yml"
# .code-patterns + .qa-patterns
.code-qa-patterns: &code-qa-patterns
@@ -366,13 +379,14 @@
- "config.ru"
- "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- - "data/whats_new/*.yml"
# CI changes
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
# QA changes
- ".dockerignore"
- "qa/**/*"
+ # Mapped patterns (see tests.yml)
+ - "data/whats_new/*.yml"
# .code-patterns + .backstage-patterns + .qa-patterns
.code-backstage-qa-patterns: &code-backstage-qa-patterns
@@ -393,7 +407,6 @@
- "config.ru"
- "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- - "data/whats_new/*.yml"
# CI changes
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
@@ -407,6 +420,8 @@
# QA changes
- ".dockerignore"
- "qa/**/*"
+ # Mapped patterns (see tests.yml)
+ - "data/whats_new/*.yml"
# .code-backstage-qa-patterns + .workhorse-patterns
.setup-test-env-patterns: &setup-test-env-patterns
@@ -597,6 +612,7 @@
- <<: *if-dot-com-gitlab-org-default-branch
changes: *code-qa-patterns
- <<: *if-dot-com-gitlab-org-schedule
+ - <<: *if-force-ci
.build-images:rules:build-assets-image:
rules:
@@ -607,15 +623,6 @@
- changes: *ci-build-images-patterns
- changes: *code-qa-patterns
-#############
-# CNG rules #
-#############
-.cng:rules:
- rules:
- - <<: *if-dot-com-gitlab-org-and-security-tag
- when: manual
- allow_failure: true
-
######################
# CI Templates Rules #
######################
@@ -842,6 +849,11 @@
############
# QA rules #
############
+.qa:rules:internal:
+ rules:
+ - <<: *if-default-refs
+ changes: *qa-patterns
+
.qa:rules:ee-and-foss:
rules:
- <<: *if-default-refs
@@ -857,6 +869,12 @@
- <<: *if-merge-request
changes: *ci-patterns
+.qa:rules:internal-as-if-foss:
+ rules:
+ - !reference [".strict-ee-only-rules", rules]
+ - <<: *if-default-refs
+ changes: *qa-patterns
+
.qa:rules:package-and-qa:
rules:
- <<: *if-not-ee
@@ -865,6 +883,9 @@
changes: *feature-flag-development-config-patterns
when: never
- <<: *if-dot-com-gitlab-org-and-security-merge-request
+ changes: *nodejs-patterns
+ allow_failure: true
+ - <<: *if-dot-com-gitlab-org-and-security-merge-request
changes: *ci-qa-patterns
allow_failure: true
- <<: *if-dot-com-gitlab-org-and-security-merge-request
@@ -876,6 +897,9 @@
allow_failure: true
- <<: *if-dot-com-gitlab-org-schedule
allow_failure: true
+ - <<: *if-force-ci
+ when: manual
+ allow_failure: true
.qa:rules:package-and-qa:feature-flags:
rules:
@@ -1352,6 +1376,10 @@
rules:
- changes: *code-backstage-qa-patterns
+.static-analysis:rules:ee-and-foss-qa:
+ rules:
+ - changes: *qa-patterns
+
.static-analysis:rules:ee:
rules:
- <<: *if-not-ee
@@ -1450,18 +1478,6 @@
when: never
- changes: *dependency-patterns
-.reports:rules:bundler-audit-dependency_scanning:
- rules:
- - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /bundler-audit/ || $DS_DEFAULT_ANALYZERS !~ /bundler-audit/'
- when: never
- - changes: *bundler-patterns
-
-.reports:rules:retire-js-dependency_scanning:
- rules:
- - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /retire.js/ || $DS_DEFAULT_ANALYZERS !~ /retire.js/'
- when: never
- - changes: *nodejs-patterns
-
.reports:rules:gemnasium-python-dependency_scanning:
rules:
- if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium-python/ || $DS_DEFAULT_ANALYZERS !~ /gemnasium-python/'
@@ -1565,17 +1581,12 @@
#
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76756
-# Since `review-qa-smoke` isn't allowed to fail, we need to use `when: always` for `review-qa-smoke-report`.
-.review:rules:review-qa-smoke-report:
- rules:
- - when: always
-
.review:rules:review-qa-reliable:
rules:
- when: on_success
# Since `review-qa-reliable` isn't allowed to fail, we need to use `when: always`for `review-qa-reliable-report`.
-.review:rules:review-qa-reliable-report:
+.review:rules:review-qa-blocking-report:
rules:
- when: always
@@ -1595,19 +1606,10 @@
- when: on_success
- when: on_failure
-.review:rules:knapsack-report:
- rules:
- - if: '$KNAPSACK_GENERATE_REPORT == "true"'
- when: always
-
.review:rules:review-cleanup:
rules:
- <<: *if-not-ee
when: never
- - <<: *if-dot-com-gitlab-org-merge-request
- changes: *code-qa-patterns
- when: manual
- allow_failure: true
- <<: *if-dot-com-gitlab-org-schedule
allow_failure: true
@@ -1670,6 +1672,13 @@
- <<: *if-default-refs
changes: *code-backstage-patterns
+.setup:rules:jh-contribution:
+ rules:
+ - <<: *if-jh
+ when: never
+ - <<: *if-merge-request-labels-jh-contribution
+
+
.setup:rules:generate-frontend-fixtures-mapping:
rules:
- <<: *if-not-ee
diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml
index ad500fe0ddc..4339251897c 100644
--- a/.gitlab/ci/setup.gitlab-ci.yml
+++ b/.gitlab/ci/setup.gitlab-ci.yml
@@ -68,6 +68,15 @@ verify-tests-yml:
- install_tff_gem
- scripts/verify-tff-mapping
+verify-approvals:
+ extends:
+ - .setup:rules:jh-contribution
+ needs: []
+ script:
+ - source scripts/utils.sh
+ - install_gitlab_gem
+ - tooling/bin/find_app_sec_approval
+
generate-frontend-fixtures-mapping:
extends:
- .setup:rules:generate-frontend-fixtures-mapping
diff --git a/.gitlab/ci/static-analysis.gitlab-ci.yml b/.gitlab/ci/static-analysis.gitlab-ci.yml
index a5cc02303f3..f5f0dcfe7f8 100644
--- a/.gitlab/ci/static-analysis.gitlab-ci.yml
+++ b/.gitlab/ci/static-analysis.gitlab-ci.yml
@@ -114,10 +114,27 @@ rubocop:
qa:testcases:
extends:
- .static-analysis-base
- - .rubocop-job-cache
- - .static-analysis:rules:ee-and-foss
+ - .static-analysis:rules:ee-and-foss-qa
+ before_script:
+ - !reference [.default-before_script, before_script]
+ - cd qa/
+ - bundle_install_script
script:
- - run_timed_command "bundle exec rubocop qa/qa/specs/features/**/* --only QA/DuplicateTestcaseLink"
+ - run_timed_command "bundle exec bin/qa Test::Instance::All http://localhost:3000 --test-metadata-only"
+ - cd ..
+ - run_timed_command "./scripts/qa/testcases-check qa/tmp/test-metadata.json"
+ variables:
+ USE_BUNDLE_INSTALL: "false"
+ SETUP_DB: "false"
+ QA_EXPORT_TEST_METRICS: "false"
+ # 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"
+ artifacts:
+ expire_in: 31d
+ when: always
+ paths:
+ - qa/tmp/
feature-flags-usage:
extends:
diff --git a/.gitlab/ci/yaml.gitlab-ci.yml b/.gitlab/ci/yaml.gitlab-ci.yml
index 606bb385325..ac32e4226e2 100644
--- a/.gitlab/ci/yaml.gitlab-ci.yml
+++ b/.gitlab/ci/yaml.gitlab-ci.yml
@@ -11,3 +11,15 @@ lint-yaml:
LINT_PATHS: .gitlab-ci.yml .gitlab/ci lib/gitlab/ci/templates data/deprecations data/removals data/whats_new
script:
- yamllint --strict -f colored $LINT_PATHS
+
+lint-metrics-yaml:
+ extends:
+ - .default-retry
+ - .yaml-lint:rules
+ image: pipelinecomponents/yamllint:latest
+ stage: lint
+ needs: []
+ variables:
+ LINT_PATHS: config/metrics
+ script:
+ - 'yamllint --strict -f colored -d "{extends: default, rules: {line-length: disable, document-start: disable, indentation: {spaces: 2, indent-sequences: whatever}}}" $LINT_PATHS'
diff --git a/.gitlab/issue_templates/Default.md b/.gitlab/issue_templates/Default.md
new file mode 100644
index 00000000000..f87b82e341b
--- /dev/null
+++ b/.gitlab/issue_templates/Default.md
@@ -0,0 +1,11 @@
+Before raising an issue to the GitLab issue tracker, please read through our guide for finding help to determine the best place to post:
+
+* https://about.gitlab.com/getting-help/
+
+If you are experiencing an issue when using GitLab.com, your first port of call should be the Community Forum. Your issue may have already been reported there by another user. Please check:
+
+* https://forum.gitlab.com/
+
+If you feel that your issue can be categorized as a reproducible bug or a feature proposal, please use one of the issue templates provided and include as much information as possible.
+
+Thank you for helping to make GitLab a better product.
diff --git a/.gitlab/issue_templates/Doc_cleanup.md b/.gitlab/issue_templates/Doc_cleanup.md
index 69caea1ae1e..58a51e15803 100644
--- a/.gitlab/issue_templates/Doc_cleanup.md
+++ b/.gitlab/issue_templates/Doc_cleanup.md
@@ -7,6 +7,26 @@
* feature development should use the Feature Request template.
-->
+If you are a community contributor:
+
+1. To work on an issue, type `@gl-docsteam I would like to work on this issue.`
+ in a comment. A technical writer
+ will assign the issue to you. Do not work on the issue before it is assigned to you.
+ If someone has already chosen the issue, pick another or view docs [in the docs directory](https://gitlab.com/gitlab-org/gitlab/-/tree/master/doc)
+ and open a merge request for any page you feel can be improved.
+1. Create a merge request for the issue. If this is for a Hackathon, do not create the merge request
+ before the Hackathon has started or it will not be counted towards the Hackathon. If you were not
+ assigned the issue, do not create a merge request. It will not be accepted.
+1. Copy the link to this issue and add it to the merge request's description, which will link
+ the merge request and the issue together.
+1. After your merge request is accepted and merged, close this issue.
+
+If you notice things you'd like to fix that are not part of the issue, open separate merge requests for those issues.
+
+We're sorry for all the rules but we want everyone to have a good experience, and it can be hard when we get an influx of contributions.
+
+Thank you again for contributing to the GitLab documentation!
+
## Identified documentation issue
<!--
@@ -19,19 +39,6 @@
* the opportunities for contributors.
-->
-## Process
-
-If you, as a contributor, decide to take this work on, assign this issue to yourself, and create one or more linked
-merge requests that resolve this issue. Be sure to close this issue after all linked merge requests are completed.
-
-The work for this issue should involve only what's listed in the previous section. If you identify other work that
-needs to be done, create separate, unlinked MRs as needed to address those items.
-
-When using automated test results for identified work, use this issue to work only on the listed lines. For
-example, if the tests list several lines that show the word "admin" as needing to possibly be "administrator,"
-do not modify other parts of the page that may also include "admin," as the testing may have excluded those lines
-(for example, they may be part of the **Admin Area** of GitLab).
-
## Additional information
<!--
diff --git a/.gitlab/issue_templates/Feature Flag Roll Out.md b/.gitlab/issue_templates/Feature Flag Roll Out.md
index 0d150bcb56c..0462742513c 100644
--- a/.gitlab/issue_templates/Feature Flag Roll Out.md
+++ b/.gitlab/issue_templates/Feature Flag Roll Out.md
@@ -65,6 +65,9 @@ _Consider adding links to check for Sentry errors, Production logs for 5xx, 302s
- [ ] `/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.
+ The best environment to validate the feature in is [staging-canary](https://about.gitlab.com/handbook/engineering/infrastructure/environments/#staging-canary)
+ as this is the first environment deployed to. Note you will need to make sure you are configured to use canary as outlined [here](https://about.gitlab.com/handbook/engineering/infrastructure/environments/canary-stage/)
+ when accessing the staging environment in order to make sure you are testing appropriately.
### Specific rollout on production
@@ -116,10 +119,10 @@ To do so, follow these steps:
- [ ] Create a merge request with the following changes. Ask for review and merge it.
- [ ] Set the `default_enabled` attribute in [the feature flag definition](https://docs.gitlab.com/ee/development/feature_flags/#feature-flag-definition-and-validation) to `true`.
- [ ] Create [a changelog entry](https://docs.gitlab.com/ee/development/feature_flags/#changelog).
-- [ ] Ensure that the default-enabling MR has been deployed to both production and canary.
- If the merge request was deployed before [the code cutoff](https://about.gitlab.com/handbook/engineering/releases/#self-managed-releases-1),
+- [ ] Ensure that the default-enabling MR has been included in the release package.
+ If the merge request was deployed before [the monthly release was tagged](https://about.gitlab.com/handbook/engineering/releases/#self-managed-releases-1),
the feature can be officially announced in a release blog post.
- - [ ] `/chatops run auto_deploy status <merge-commit-of-default-enabling-mr>`
+ - [ ] `/chatops run release check <merge-request-url> <milestone>`
- [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
- [ ] Set the next milestone to this rollout issue for scheduling [the flag removal](#release-the-feature).
- [ ] (Optional) You can [create a separate issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Feature%20Flag%20Cleanup) for scheduling the steps below to [Release the feature](#release-the-feature).
@@ -149,10 +152,10 @@ You can either [create a follow-up issue for Feature Flag Cleanup](https://gitla
- [ ] Remove all references to the feature flag from the codebase.
- [ ] Remove the YAML definitions for the feature from the repository.
- [ ] Create [a changelog entry](https://docs.gitlab.com/ee/development/feature_flags/#changelog).
-- [ ] Ensure that the cleanup MR has been deployed to both production and canary.
- If the merge request was deployed before [the code cutoff](https://about.gitlab.com/handbook/engineering/releases/#self-managed-releases-1),
+- [ ] Ensure that the cleanup MR has been included in the release package.
+ If the merge request was deployed before [the monthly release was tagged](https://about.gitlab.com/handbook/engineering/releases/#self-managed-releases-1),
the feature can be officially announced in a release blog post.
- - [ ] `/chatops run auto_deploy status <merge-commit-of-cleanup-mr>`
+ - [ ] `/chatops run release check <merge-request-url> <milestone>`
- [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
- [ ] Clean up the feature flag from all environments by running these chatops command in `#production` channel:
- [ ] `/chatops run feature delete <feature-flag-name> --dev`
diff --git a/.gitlab/issue_templates/Feature proposal - detailed.md b/.gitlab/issue_templates/Feature proposal - detailed.md
index d60b5f24dee..9f8a0a92a58 100644
--- a/.gitlab/issue_templates/Feature proposal - detailed.md
+++ b/.gitlab/issue_templates/Feature proposal - detailed.md
@@ -117,6 +117,8 @@ In which enterprise tier should this feature go? See https://about.gitlab.com/ha
<!-- Communicate if this change will affect multiple Stage Groups or product areas. We recommend always start with the assumption that a feature request will have an impact into another Group. Loop in the most relevant PM and Product Designer from that Group to provide strategic support to help align the Group's broader plan and vision, as well as to avoid UX and technical debt. https://about.gitlab.com/handbook/product/#cross-stage-features -->
+### What is the competitive advantage or differentiation for this feature?
+
### Links / references
<!-- Label reminders - you should have one of each of the following labels.
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 6d37fc678af..e858f80ffaa 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
@@ -193,6 +193,8 @@ That's all of the required database changes.
include ::Geo::ReplicableModel
include ::Geo::VerifiableModel
+ delegate(*::Geo::VerificationState::VERIFICATION_METHODS, to: :cool_widget_state)
+
with_replicator Geo::CoolWidgetReplicator
mount_uploader :file, CoolWidgetUploader
@@ -201,16 +203,6 @@ That's all of the required database changes.
after_save :save_verification_details
- delegate :verification_retry_at, :verification_retry_at=,
- :verified_at, :verified_at=,
- :verification_checksum, :verification_checksum=,
- :verification_failure, :verification_failure=,
- :verification_retry_count, :verification_retry_count=,
- :verification_state=, :verification_state,
- :verification_started_at=, :verification_started_at,
- to: :cool_widget_state
- ...
-
scope :with_verification_state, ->(state) { joins(:cool_widget_state).where(cool_widget_states: { verification_state: verification_state_value(state) }) }
scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) }
scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) }
@@ -487,6 +479,7 @@ That's all of the required database changes.
module Geo
class CoolWidgetState < ApplicationRecord
include EachBatch
+ include ::Geo::VerificationStateDefinition
self.primary_key = :cool_widget_id
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 35bb28ad170..0cbfd79c958 100644
--- a/.gitlab/issue_templates/Geo Replicate a new blob type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new blob type.md
@@ -195,6 +195,8 @@ That's all of the required database changes.
include ::Geo::ReplicableModel
include ::Geo::VerifiableModel
+ delegate(*::Geo::VerificationState::VERIFICATION_METHODS, to: :cool_widget_state)
+
with_replicator Geo::CoolWidgetReplicator
mount_uploader :file, CoolWidgetUploader
@@ -203,16 +205,6 @@ That's all of the required database changes.
after_save :save_verification_details
- delegate :verification_retry_at, :verification_retry_at=,
- :verified_at, :verified_at=,
- :verification_checksum, :verification_checksum=,
- :verification_failure, :verification_failure=,
- :verification_retry_count, :verification_retry_count=,
- :verification_state=, :verification_state,
- :verification_started_at=, :verification_started_at,
- to: :cool_widget_state
- ...
-
scope :with_verification_state, ->(state) { joins(:cool_widget_state).where(cool_widget_states: { verification_state: verification_state_value(state) }) }
scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) }
scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) }
@@ -451,6 +443,7 @@ That's all of the required database changes.
module Geo
class CoolWidgetState < ApplicationRecord
include EachBatch
+ include ::Geo::VerificationStateDefinition
self.primary_key = :cool_widget_id
diff --git a/.gitlab/issue_templates/Implementation.md b/.gitlab/issue_templates/Implementation.md
index 058834264b0..f57bfae4da3 100644
--- a/.gitlab/issue_templates/Implementation.md
+++ b/.gitlab/issue_templates/Implementation.md
@@ -59,5 +59,17 @@ Other settings you might want to include when creating the issue.
# /epic &
-->
+## Verification steps
+<!--
+Add verification steps to help GitLab team members test the implementation. This is particularly useful
+during the MR review and the ~"workflow::verification" step. You may not know exactly what the
+verification steps should be during issue refinement, so you can always come back later to add
+them.
+
+1. Check-out the corresponding branch
+1. ...
+1. Profit!
+-->
+
/label ~"workflow::refinement"
/milestone %Backlog
diff --git a/.gitlab/issue_templates/Vulnerability Disclosure.md b/.gitlab/issue_templates/Vulnerability Disclosure.md
new file mode 100644
index 00000000000..9f143a76e0e
--- /dev/null
+++ b/.gitlab/issue_templates/Vulnerability Disclosure.md
@@ -0,0 +1,98 @@
+<!---
+Please read this!
+
+This template is for reporting a security vulnerability about GitLab or
+GitLab.com
+
+Strongly consider reporting via https://hackerone.com/gitlab, as
+HackerOne is our preferred disclosure platform.
+
+See also:
+
+- https://about.gitlab.com/security/disclosure/
+- https://about.gitlab.com/handbook/engineering/security/#creating-new-security-issues
+- https://about.gitlab.com/handbook/engineering/security/#engaging-the-security-on-call
+
+--->
+
+### Summary
+
+<!-- Summarize the bug encountered concisely. -->
+
+### Steps to reproduce
+
+<!-- Describe how one can reproduce the issue - this is very important. Please use an ordered list. -->
+
+### Example Project
+
+<!-- If possible, please create an example project here on GitLab.com that exhibits the problematic
+behavior, and link to it here in the bug report. If you are using an older version of GitLab, this
+will also determine whether the bug is fixed in a more recent version. -->
+
+### What is the current *bug* behavior?
+
+<!-- Describe what actually happens. -->
+
+### What is the expected *correct* behavior?
+
+<!-- Describe what you should see instead. -->
+
+### Relevant logs and/or screenshots
+
+<!-- Paste any relevant logs - please use code blocks (```) to format console output, logs, and code
+ as it's tough to read otherwise. -->
+
+### Output of checks
+
+<!-- If you are reporting a bug on GitLab.com, write: This bug happens on GitLab.com -->
+
+#### Results of GitLab environment info
+
+<!-- Input any relevant GitLab environment information if needed. -->
+
+<details>
+<summary>Expand for output related to GitLab environment info</summary>
+
+<pre>
+
+(For installations with omnibus-gitlab package run and paste the output of:
+`sudo gitlab-rake gitlab:env:info`)
+
+(For installations from source run and paste the output of:
+`sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production`)
+
+</pre>
+</details>
+
+#### Results of GitLab application Check
+
+<!-- Input any relevant GitLab application check information if needed. -->
+
+<details>
+<summary>Expand for output related to the GitLab application check</summary>
+<pre>
+
+(For installations with omnibus-gitlab package run and paste the output of:
+`sudo gitlab-rake gitlab:check SANITIZE=true`)
+
+(For installations from source run and paste the output of:
+`sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production SANITIZE=true`)
+
+(we will only investigate if the tests are passing)
+
+</pre>
+</details>
+
+### Possible fixes
+
+<!-- If you can, link to the line of code that might be responsible for the problem. -->
+
+
+---
+
+<!-- Do not edit past here unless you are certain of the impact -->
+
+cc @gitlab-com/gl-security/appsec
+
+/label ~"type::bug" ~"bug::vulnerability"
+/confidential
diff --git a/.gitlab/merge_request_templates/Default.md b/.gitlab/merge_request_templates/Default.md
new file mode 100644
index 00000000000..9d5ab41afbe
--- /dev/null
+++ b/.gitlab/merge_request_templates/Default.md
@@ -0,0 +1,44 @@
+## What does this MR do and why?
+
+_Describe in detail what your merge request does and why._
+
+<!--
+Please keep this description updated with any discussion that takes place so
+that reviewers can understand your intent. Keeping the description updated is
+especially important if they didn't participate in the discussion.
+-->
+
+## Screenshots or screen recordings
+
+_These are strongly recommended to assist reviewers and reduce the time to merge your change._
+
+<!--
+Please include any relevant screenshots or screen recordings that will assist
+reviewers and future readers. If you need help visually verifying the change,
+please leave a comment and ping a GitLab reviewer, maintainer, or MR coach.
+-->
+
+## How to set up and validate locally
+
+_Numbered steps to set up and validate the change are strongly suggested._
+
+<!--
+Example below:
+
+1. Enable the invite modal
+ ```ruby
+ Feature.enable(:invite_members_group_modal)
+ ```
+1. In rails console enable the experiment fully
+ ```ruby
+ Feature.enable(:member_areas_of_focus)
+ ```
+1. Visit any group or project member pages such as `http://127.0.0.1:3000/groups/flightjs/-/group_members`
+1. Click the `invite members` button.
+-->
+
+## MR acceptance checklist
+
+This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
+
+* [ ] I have evaluated the [MR acceptance checklist](https://docs.gitlab.com/ee/development/code_review.html#acceptance-checklist) for this MR.
diff --git a/.gitlab/merge_request_templates/Documentation.md b/.gitlab/merge_request_templates/Documentation.md
index d3ea9682d34..49d1d0f79bf 100644
--- a/.gitlab/merge_request_templates/Documentation.md
+++ b/.gitlab/merge_request_templates/Documentation.md
@@ -8,17 +8,17 @@
## Author's checklist
-- [ ] Consider taking [the GitLab Technical Writing Fundamentals course](https://gitlab.edcast.com/pathways/ECL-02528ee2-c334-4e16-abf3-e9d8b8260de4).
+- [ ] Optional. Consider taking [the GitLab Technical Writing Fundamentals course](https://gitlab.edcast.com/pathways/ECL-02528ee2-c334-4e16-abf3-e9d8b8260de4).
- [ ] Follow the:
- [Documentation process](https://docs.gitlab.com/ee/development/documentation/workflow.html).
- [Documentation guidelines](https://docs.gitlab.com/ee/development/documentation/).
- [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide/).
-- [ ] Ensure that the [product tier badge](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#product-tier-badges) is added to topic's `h1`.
-- [ ] [Request a review](https://docs.gitlab.com/ee/development/code_review.html#dogfooding-the-reviewers-feature) based on:
- - The documentation page's [metadata](https://docs.gitlab.com/ee/development/documentation/#metadata).
- - The [associated Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments).
+- [ ] If you're adding or changing the main heading of the page (H1), ensure that the [product tier badge](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#product-tier-badges) is added.
+- [ ] If you are a GitLab team member, [request a review](https://docs.gitlab.com/ee/development/code_review.html#dogfooding-the-attention-request-feature) based on:
+ - The documentation page's [metadata](https://docs.gitlab.com/ee/development/documentation/#metadata).
+ - The [associated Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments).
-If you are only adding documentation, do not add any of the following labels:
+If you are a GitLab team member and only adding documentation, do not add any of the following labels:
- `~"frontend"`
- `~"backend"`
@@ -27,7 +27,7 @@ If you are only adding documentation, do not add any of the following labels:
These labels cause the MR to be added to code verification QA issues.
-## Review checklist
+## Reviewer's checklist
Documentation-related MRs should be reviewed by a Technical Writer for a non-blocking review, based on [Documentation Guidelines](https://docs.gitlab.com/ee/development/documentation/) and the [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide/).
@@ -35,13 +35,13 @@ Documentation-related MRs should be reviewed by a Technical Writer for a non-blo
- Technical writer review items:
- [ ] Ensure docs metadata is present and up-to-date.
- [ ] Ensure the appropriate [labels](https://about.gitlab.com/handbook/engineering/ux/technical-writing/workflow/#labels) are added to this MR.
+ - [ ] Ensure a release milestone is set.
- If relevant to this MR, ensure [content topic type](https://docs.gitlab.com/ee/development/documentation/structure.html) principles are in use, including:
- [ ] The headings should be something you'd do a Google search for. Instead of `Default behavior`, say something like `Default behavior when you close an issue`.
- [ ] The headings (other than the page title) should be active. Instead of `Configuring GDK`, say something like `Configure GDK`.
- [ ] Any task steps should be written as a numbered list.
- If the content still needs to be edited for topic types, you can create a follow-up issue with the ~"docs-technical-debt" label.
- [ ] Review by assigned maintainer, who can always request/require the reviews above. Maintainer's review can occur before or after a technical writer review.
-- [ ] Ensure a release milestone is set.
-/label ~documentation ~"type::maintenance"
+/label ~documentation ~"type::maintenance" ~"docs::improvement"
/assign me
diff --git a/.gitpod.yml b/.gitpod.yml
index d1a709c55ea..6ddd090f924 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -103,6 +103,8 @@ ports:
onOpen: ignore
- port: 9000 # object_store / minio
onOpen: ignore
+ - port: 9122 # gitlab-shell
+ onOpen: ignore
vscode:
extensions:
diff --git a/.haml-lint.yml b/.haml-lint.yml
index 8d084a0c356..75139cb43dd 100644
--- a/.haml-lint.yml
+++ b/.haml-lint.yml
@@ -124,7 +124,6 @@ linters:
- Performance/RedundantMatch
- Performance/StringReplacement
- Rails/LinkToBlank
- - Rails/Presence
- Rails/RequestReferer
- Style/ColonMethodCall
- Style/ConditionalAssignment
diff --git a/.rubocop.yml b/.rubocop.yml
index 99424713bd8..50729efd1ce 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -48,6 +48,7 @@ AllCops:
Metrics/ParameterLists:
Exclude:
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/356771
- 'app/components/**/*'
Cop/AvoidKeywordArgumentsInSidekiqWorkers:
@@ -94,6 +95,10 @@ Style/FrozenStringLiteralComment:
Enabled: true
EnforcedStyle: always_true
+Style/SpecialGlobalVars:
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/358427
+ EnforcedStyle: use_perl_names
+
RSpec/FilePath:
Exclude:
- 'qa/**/*'
@@ -134,6 +139,7 @@ Naming/FileName:
- 'qa/qa/specs/**/*'
- 'qa/tasks/**/*.rake'
- '**/*.ru'
+ - 'app/graphql/types/issue_connection.rb'
IgnoreExecutableScripts: true
AllowedAcronyms:
@@ -732,10 +738,6 @@ QA/SelectorUsage:
Exclude:
- 'spec/rubocop/**/*_spec.rb'
-QA/DuplicateTestcaseLink:
- # this cop is executed in static-analysis.gitlab-ci.yml since it cannot be run in parallel
- Enabled: false
-
Performance/ActiveRecordSubtransactions:
Exclude:
- 'spec/**/*.rb'
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 2ffe70b4461..78e462cdc7a 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -6,107 +6,11 @@
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
-# Offense count: 221
-Capybara/VisibilityMatcher:
- Enabled: false
-
# Offense count: 1
Gitlab/PolicyRuleBoolean:
Exclude:
- 'ee/app/policies/ee/identity_provider_policy.rb'
-# Offense count: 2270
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle, IndentationWidth.
-# SupportedStyles: with_first_argument, with_fixed_indentation
-Layout/ArgumentAlignment:
- Enabled: false
-
-# Offense count: 771
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle, IndentationWidth.
-# SupportedStyles: special_inside_parentheses, consistent, align_brackets
-Layout/FirstArrayElementIndentation:
- Enabled: false
-
-# Offense count: 1684
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle, IndentationWidth.
-# SupportedStyles: special_inside_parentheses, consistent, align_braces
-Layout/FirstHashElementIndentation:
- Enabled: false
-
-# Offense count: 3233
-# Cop supports --auto-correct.
-# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
-# SupportedHashRocketStyles: key, separator, table
-# SupportedColonStyles: key, separator, table
-# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
-Layout/HashAlignment:
- Enabled: false
-
-# Offense count: 14544
-# Cop supports --auto-correct.
-# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
-# URISchemes: http, https
-Layout/LineLength:
- Max: 1313
-
-# Offense count: 170
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle, IndentationWidth.
-# SupportedStyles: aligned, indented
-Layout/MultilineOperationIndentation:
- Enabled: false
-
-# Offense count: 53
-# Cop supports --auto-correct.
-Layout/SpaceAroundMethodCallOperator:
- Enabled: false
-
-# Offense count: 754
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: require_no_space, require_space
-Layout/SpaceInLambdaLiteral:
- Enabled: false
-
-# Offense count: 1209
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
-# SupportedStyles: space, no_space
-# SupportedStylesForEmptyBraces: space, no_space
-Layout/SpaceInsideBlockBraces:
- Enabled: false
- EnforcedStyle: space
-
-# Offense count: 585
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: space, no_space
-Layout/SpaceInsideParens:
- Enabled: false
-
-# Offense count: 18
-Lint/BinaryOperatorWithIdenticalOperands:
- Exclude:
- - 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
- - 'spec/helpers/visibility_level_helper_spec.rb'
- - 'spec/lib/gitlab/conan_token_spec.rb'
- - 'spec/lib/gitlab/git/conflict/parser_spec.rb'
- - 'spec/lib/gitlab/graphql/lazy_spec.rb'
- - 'spec/models/ci/build_trace_chunk_spec.rb'
- - 'spec/models/clusters/platforms/kubernetes_spec.rb'
- - 'spec/models/concerns/where_composite_spec.rb'
- - 'spec/models/metrics/dashboard/annotation_spec.rb'
- - 'spec/models/repository_spec.rb'
- - 'spec/models/ssh_host_key_spec.rb'
- - 'spec/tooling/danger/sidekiq_queues_spec.rb'
-
-# Offense count: 84
-Lint/ConstantDefinitionInBlock:
- Enabled: false
-
# Offense count: 2
# Configuration parameters: AllowComments.
Lint/EmptyFile:
@@ -114,11 +18,6 @@ Lint/EmptyFile:
- 'db/seeds.rb'
- 'ee/db/geo/seeds.rb'
-# Offense count: 208
-# Configuration parameters: MaximumRangeSize.
-Lint/MissingCopEnableDirective:
- Enabled: false
-
# Offense count: 13
Lint/MixedRegexpCaptureTypes:
Exclude:
@@ -141,50 +40,12 @@ Lint/MixedRegexpCaptureTypes:
Lint/RedundantCopDisableDirective:
Enabled: false
-# Offense count: 1
-Lint/SelfAssignment:
- Exclude:
- - 'spec/lib/gitlab/search_context/builder_spec.rb'
-
-# Offense count: 3
-Lint/StructNewOverride:
- Exclude:
- - 'app/presenters/sentry_error_presenter.rb'
- - 'app/serializers/environment_serializer.rb'
- - 'lib/gitlab/ci/pipeline/duration.rb'
-
# Offense count: 22
# Cop supports --auto-correct.
# Configuration parameters: AllowComments.
Lint/UselessMethodDefinition:
Enabled: false
-# Offense count: 5
-# Configuration parameters: IgnoredMethods.
-Metrics/AbcSize:
- Max: 61
-
-# Offense count: 13
-# Configuration parameters: IgnoredMethods.
-Metrics/CyclomaticComplexity:
- Max: 25
-
-# Offense count: 14
-# Configuration parameters: IgnoredMethods.
-Metrics/PerceivedComplexity:
- Max: 25
-
-# Offense count: 11
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: lowercase, uppercase
-Naming/HeredocDelimiterCase:
- Exclude:
- - 'spec/lib/gitlab/diff/parser_spec.rb'
- - 'spec/lib/json_web_token/rsa_token_spec.rb'
- - 'spec/models/commit_spec.rb'
- - 'spec/support/helpers/repo_helpers.rb'
- - 'spec/support/helpers/seed_repo.rb'
-
# Offense count: 321
# Configuration parameters: ForbiddenDelimiters.
# ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
@@ -218,61 +79,16 @@ Performance/CollectionLiteralInLoop:
Performance/ConstantRegexp:
Enabled: false
-# Offense count: 14
-# Cop supports --auto-correct.
-# Configuration parameters: SafeMultiline.
-Performance/DeletePrefix:
- Exclude:
- - 'app/helpers/submodule_helper.rb'
- - 'app/workers/concerns/application_worker.rb'
- - 'ee/lib/gitlab/geo/git_ssh_proxy.rb'
- - 'lib/banzai/filter/repository_link_filter.rb'
- - 'lib/gitlab/auth/ldap/dn.rb'
- - 'lib/gitlab/gfm/uploads_rewriter.rb'
- - 'lib/gitlab/git/ref.rb'
- - 'lib/gitlab/project_template.rb'
- - 'lib/gitlab/setup_helper.rb'
- - 'lib/gitlab/time_tracking_formatter.rb'
- - 'spec/controllers/projects/artifacts_controller_spec.rb'
- - 'spec/lib/gitlab/gfm/uploads_rewriter_spec.rb'
- - 'spec/support/helpers/test_env.rb'
-
# Offense count: 121
Performance/MethodObjectAsBlock:
Enabled: false
-# Offense count: 18
-# Cop supports --auto-correct.
-# Configuration parameters: AutoCorrect.
-Performance/StringInclude:
- Exclude:
- - 'app/models/snippet_repository.rb'
- - 'config/initializers/macos.rb'
- - 'config/spring.rb'
- - 'ee/app/models/ee/container_registry/event.rb'
- - 'ee/lib/gitlab/auth/smartcard/certificate.rb'
- - 'lib/gitlab/database/migration_helpers.rb'
- - 'lib/kramdown/parser/atlassian_document_format.rb'
- - 'lib/prometheus/pid_provider.rb'
- - 'qa/qa/ee/page/merge_request/show.rb'
- - 'qa/qa/specs/runner.rb'
- - 'spec/features/projects/jobs_spec.rb'
- - 'spec/spec_helper.rb'
- - 'spec/support_specs/helpers/active_record/query_recorder_spec.rb'
-
# Offense count: 15209
# Configuration parameters: Prefixes.
# Prefixes: when, with, without
RSpec/ContextWording:
Enabled: false
-# Offense count: 4
-# Configuration parameters: CustomIncludeMethods.
-RSpec/EmptyExampleGroup:
- Exclude:
- - 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
- - 'spec/services/projects/prometheus/alerts/notify_service_spec.rb'
-
# Offense count: 1428
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
@@ -311,26 +127,6 @@ RSpec/ReturnFromStub:
RSpec/ScatteredLet:
Enabled: false
-# Offense count: 10
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: symbols, strings
-RSpec/VariableDefinition:
- Exclude:
- - 'spec/initializers/mail_encoding_patch_spec.rb'
-
-# Offense count: 24
-# Configuration parameters: EnforcedStyle, IgnoredPatterns.
-# SupportedStyles: snake_case, camelCase
-RSpec/VariableName:
- Exclude:
- - 'spec/features/projects/import_export/import_file_spec.rb'
- - 'spec/features/task_lists_spec.rb'
- - 'spec/initializers/mail_encoding_patch_spec.rb'
- - 'spec/models/board_spec.rb'
- - 'spec/support/shared_contexts/url_shared_context.rb'
- - 'spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb'
- - 'spec/support/shared_examples/services/boards/boards_list_service_shared_examples.rb'
-
# Offense count: 26
# Cop supports --auto-correct.
# Configuration parameters: Include.
@@ -353,13 +149,6 @@ Rails/ApplicationController:
- 'spec/controllers/concerns/continue_params_spec.rb'
- 'spec/lib/marginalia_spec.rb'
-# Offense count: 3
-# Cop supports --auto-correct.
-Rails/BelongsTo:
- Exclude:
- - 'app/models/deployment.rb'
- - 'app/models/environment.rb'
-
# Offense count: 155
# Cop supports --auto-correct.
Rails/ContentTag:
@@ -377,22 +166,6 @@ Rails/CreateTableWithTimestamps:
Rails/FilePath:
Enabled: false
-# Offense count: 15
-# Cop supports --auto-correct.
-Rails/FindById:
- Exclude:
- - 'app/controllers/projects/pipelines_controller.rb'
- - 'app/services/concerns/deploy_token_methods.rb'
- - 'ee/app/controllers/ee/groups/group_members_controller.rb'
- - 'ee/lib/api/audit_events.rb'
- - 'ee/lib/api/merge_request_approval_rules.rb'
- - 'ee/lib/ee/api/groups.rb'
- - 'ee/lib/ee/api/projects.rb'
- - 'ee/spec/finders/audit_log_finder_spec.rb'
- - 'lib/api/snippets.rb'
- - 'spec/finders/concerns/finder_methods_spec.rb'
- - 'spec/finders/concerns/finder_with_cross_project_access_spec.rb'
-
# Offense count: 354
# Configuration parameters: Include.
# Include: app/models/**/*.rb
@@ -410,11 +183,6 @@ Rails/HelperInstanceVariable:
Rails/IndexWith:
Enabled: false
-# Offense count: 1
-Rails/Inquiry:
- Exclude:
- - 'spec/helpers/labels_helper_spec.rb'
-
# Offense count: 118
# Configuration parameters: Include.
# Include: app/models/**/*.rb
@@ -463,11 +231,6 @@ Rails/RakeEnvironment:
Rails/RedundantForeignKey:
Enabled: false
-# Offense count: 1
-Rails/RenderInline:
- Exclude:
- - 'ee/app/controllers/sitemap_controller.rb'
-
# Offense count: 1144
# Configuration parameters: ForbiddenMethods, AllowedMethods.
# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
@@ -493,22 +256,6 @@ Rails/WhereExists:
Style/AccessorGrouping:
Enabled: false
-# Offense count: 11
-# Cop supports --auto-correct.
-Style/ArrayCoercion:
- Exclude:
- - 'app/controllers/admin/ci/variables_controller.rb'
- - 'app/controllers/groups/variables_controller.rb'
- - 'app/controllers/projects/variables_controller.rb'
- - 'db/migrate/20190620105427_change_null_private_profile_to_false.rb'
- - 'db/post_migrate/20190812070645_migrate_private_profile_nulls.rb'
- - 'db/post_migrate/20200311130802_schedule_populate_user_highest_roles_table.rb'
- - 'db/post_migrate/20200805152108_migrate_null_external_diff_store_to_local_value.rb'
- - 'db/post_migrate/20200806173633_migrate_null_package_files_file_store_to_local_value.rb'
- - 'ee/app/services/geo/repository_verification_secondary_service.rb'
- - 'ee/lib/ee/banzai/pipeline/gfm_pipeline.rb'
- - 'spec/support/helpers/lfs_http_helpers.rb'
-
# Offense count: 188
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
@@ -516,42 +263,11 @@ Style/ArrayCoercion:
Style/BarePercentLiterals:
Enabled: false
-# Offense count: 6
-# Cop supports --auto-correct.
-Style/BisectedAttrAccessor:
- Exclude:
- - 'lib/system_check/base_check.rb'
- - 'qa/qa/resource/api_fabricator.rb'
-
# Offense count: 42
# Cop supports --auto-correct.
Style/CaseLikeIf:
Enabled: false
-# Offense count: 13
-Style/CombinableLoops:
- Exclude:
- - 'ee/db/fixtures/development/30_customizable_cycle_analytics.rb'
- - 'ee/lib/gitlab/audit/events/preloader.rb'
- - 'ee/spec/finders/snippets_finder_spec.rb'
- - 'ee/spec/lib/ee/gitlab/background_migration/remove_duplicate_cs_findings_spec.rb'
- - 'spec/features/merge_request/user_suggests_changes_on_diff_spec.rb'
- - 'spec/finders/packages/group_packages_finder_spec.rb'
- - 'spec/migrations/cleanup_optimistic_locking_nulls_pt2_fixed_spec.rb'
- - 'spec/migrations/cleanup_optimistic_locking_nulls_spec.rb'
- - 'spec/requests/api/members_spec.rb'
- - 'spec/support/shared_examples/features/protected_branches_access_control_ce_shared_examples.rb'
-
-# Offense count: 5
-# Cop supports --auto-correct.
-Style/EachWithObject:
- Exclude:
- - 'lib/expand_variables.rb'
- - 'lib/gitlab/ci/ansi2html.rb'
- - 'lib/gitlab/hook_data/issuable_builder.rb'
- - 'lib/gitlab/i18n/po_linter.rb'
- - 'lib/gitlab/import_export/members_mapper.rb'
-
# Offense count: 55
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
@@ -566,13 +282,6 @@ Style/EmptyElse:
Style/EmptyMethod:
Enabled: false
-# Offense count: 2
-# Cop supports --auto-correct.
-Style/ExpandPathArguments:
- Exclude:
- - 'cable/config.ru'
- - 'config.ru'
-
# Offense count: 118
# Cop supports --auto-correct.
Style/ExplicitBlockArgument:
@@ -628,15 +337,6 @@ Style/Lambda:
Style/MissingRespondToMissing:
Enabled: false
-# Offense count: 5
-Style/MixinUsage:
- Exclude:
- - 'spec/factories/ci/builds.rb'
- - 'spec/factories/ci/job_artifacts.rb'
- - 'spec/factories/lfs_objects.rb'
- - 'spec/factories/notes.rb'
- - 'spec/lib/gitlab/import_export/version_checker_spec.rb'
-
# Offense count: 35
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinBodyLength.
@@ -687,13 +387,6 @@ Style/SingleArgumentDig:
Style/SoleNestedConditional:
Enabled: false
-# Offense count: 120
-# Cop supports --auto-correct.
-# Configuration parameters: .
-# SupportedStyles: use_perl_names, use_english_names
-Style/SpecialGlobalVars:
- EnforcedStyle: use_perl_names
-
# Offense count: 562
# Cop supports --auto-correct.
Style/StringConcatenation:
diff --git a/.rubocop_todo/capybara/visibility_matcher.yml b/.rubocop_todo/capybara/visibility_matcher.yml
new file mode 100644
index 00000000000..015e246344d
--- /dev/null
+++ b/.rubocop_todo/capybara/visibility_matcher.yml
@@ -0,0 +1,87 @@
+---
+Capybara/VisibilityMatcher:
+ # Offense count: 213
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/spec/features/billings/billing_plans_spec.rb'
+ - 'ee/spec/features/boards/sidebar_spec.rb'
+ - 'ee/spec/features/epics/epic_show_spec.rb'
+ - 'ee/spec/features/epics/todo_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb'
+ - 'ee/spec/features/groups/issues_spec.rb'
+ - 'ee/spec/features/groups/saml_enforcement_spec.rb'
+ - 'ee/spec/features/issues/related_issues_spec.rb'
+ - 'ee/spec/features/projects/integrations/user_activates_jira_spec.rb'
+ - 'ee/spec/features/projects/path_locks_spec.rb'
+ - 'ee/spec/features/projects/quality/test_case_show_spec.rb'
+ - 'ee/spec/features/projects/requirements_management/requirements_list_spec.rb'
+ - 'ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb'
+ - 'ee/spec/features/promotion_spec.rb'
+ - 'ee/spec/features/refactor_blob_viewer_disabled/projects/path_locks_spec.rb'
+ - 'ee/spec/features/registrations/welcome_spec.rb'
+ - 'ee/spec/support/shared_examples/views/issuable_bulk_dropdown_shared_examples.rb'
+ - 'ee/spec/views/layouts/_search.html.haml_spec.rb'
+ - 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
+ - 'spec/features/admin/admin_mode_spec.rb'
+ - 'spec/features/dashboard/merge_requests_spec.rb'
+ - 'spec/features/dashboard/todos/todos_spec.rb'
+ - 'spec/features/groups/group_settings_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_emoji_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_hint_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/service_desk_spec.rb'
+ - 'spec/features/issues/todo_spec.rb'
+ - 'spec/features/issues/user_creates_branch_and_merge_request_spec.rb'
+ - 'spec/features/issues/user_creates_issue_spec.rb'
+ - 'spec/features/merge_request/user_posts_notes_spec.rb'
+ - 'spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb'
+ - 'spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb'
+ - 'spec/features/merge_request/user_sees_diff_spec.rb'
+ - 'spec/features/merge_request/user_sees_merge_widget_spec.rb'
+ - 'spec/features/merge_request/user_views_diffs_commit_spec.rb'
+ - 'spec/features/merge_request/user_views_diffs_spec.rb'
+ - 'spec/features/projects/blobs/blob_show_spec.rb'
+ - 'spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb'
+ - 'spec/features/projects/ci/lint_spec.rb'
+ - 'spec/features/projects/commit/comments/user_adds_comment_spec.rb'
+ - 'spec/features/projects/commits/user_browses_commits_spec.rb'
+ - 'spec/features/projects/integrations/user_activates_jira_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_views_designs_with_svg_xss_spec.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/features/projects/network_graph_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/settings/lfs_settings_spec.rb'
+ - 'spec/features/projects/settings/packages_settings_spec.rb'
+ - 'spec/features/projects/settings/visibility_settings_spec.rb'
+ - 'spec/features/projects/show/user_manages_notifications_spec.rb'
+ - 'spec/features/projects/tags/user_edits_tags_spec.rb'
+ - 'spec/features/projects/user_changes_project_visibility_spec.rb'
+ - 'spec/features/projects/user_sees_user_popover_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb'
+ - 'spec/features/search/user_searches_for_commits_spec.rb'
+ - 'spec/features/snippets/notes_on_personal_snippets_spec.rb'
+ - 'spec/features/task_lists_spec.rb'
+ - 'spec/features/u2f_spec.rb'
+ - 'spec/features/uploads/user_uploads_file_to_note_spec.rb'
+ - 'spec/features/users/overview_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/support/helpers/features/canonical_link_helpers.rb'
+ - 'spec/support/shared_examples/features/discussion_comments_shared_example.rb'
+ - 'spec/support/shared_examples/features/page_description_shared_examples.rb'
+ - 'spec/support/shared_examples/features/rss_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/file_attachments_shared_examples.rb'
+ - 'spec/views/import/gitlab_projects/new.html.haml_spec.rb'
+ - 'spec/views/layouts/_header_search.html.haml_spec.rb'
+ - 'spec/views/layouts/_search.html.haml_spec.rb'
+ - 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
+ - 'spec/views/profiles/preferences/show.html.haml_spec.rb'
+ - 'spec/views/projects/merge_requests/edit.html.haml_spec.rb'
+ - 'spec/views/projects/merge_requests/show.html.haml_spec.rb'
diff --git a/.rubocop_todo/database/disable_referential_integrity.yml b/.rubocop_todo/database/disable_referential_integrity.yml
new file mode 100644
index 00000000000..95cfc5920d4
--- /dev/null
+++ b/.rubocop_todo/database/disable_referential_integrity.yml
@@ -0,0 +1,4 @@
+---
+Database/DisableReferentialIntegrity:
+ Exclude:
+ - 'spec/lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects_spec.rb'
diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml
new file mode 100644
index 00000000000..acb8e8157cc
--- /dev/null
+++ b/.rubocop_todo/layout/argument_alignment.yml
@@ -0,0 +1,953 @@
+---
+# Cop supports --auto-correct.
+Layout/ArgumentAlignment:
+ # Offense count: 2502
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/application_controller.rb'
+ - 'app/controllers/concerns/notes_actions.rb'
+ - 'app/controllers/concerns/page_limiter.rb'
+ - 'app/controllers/concerns/snippets_actions.rb'
+ - 'app/controllers/concerns/wiki_actions.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/import/gitea_controller.rb'
+ - 'app/controllers/import/github_controller.rb'
+ - 'app/controllers/import/gitlab_groups_controller.rb'
+ - 'app/controllers/passwords_controller.rb'
+ - 'app/controllers/profiles_controller.rb'
+ - 'app/controllers/projects/branches_controller.rb'
+ - 'app/controllers/projects/jobs_controller.rb'
+ - 'app/controllers/projects/merge_requests/creations_controller.rb'
+ - 'app/controllers/projects/pages_domains_controller.rb'
+ - 'app/controllers/projects/pipeline_schedules_controller.rb'
+ - 'app/controllers/projects/uploads_controller.rb'
+ - 'app/controllers/projects/web_ide_terminals_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/controllers/registrations_controller.rb'
+ - 'app/controllers/repositories/git_http_controller.rb'
+ - 'app/controllers/sessions_controller.rb'
+ - 'app/finders/issues_finder.rb'
+ - 'app/finders/projects/prometheus/alerts_finder.rb'
+ - 'app/graphql/mutations/boards/destroy.rb'
+ - 'app/graphql/mutations/boards/lists/base_update.rb'
+ - 'app/graphql/mutations/boards/lists/destroy.rb'
+ - 'app/graphql/mutations/boards/lists/update.rb'
+ - 'app/graphql/mutations/ci/ci_cd_settings_update.rb'
+ - 'app/graphql/mutations/ci/job_token_scope/add_project.rb'
+ - 'app/graphql/mutations/ci/job_token_scope/remove_project.rb'
+ - 'app/graphql/mutations/ci/pipeline/base.rb'
+ - 'app/graphql/mutations/ci/runners_registration_token/reset.rb'
+ - 'app/graphql/mutations/customer_relations/contacts/update.rb'
+ - 'app/graphql/mutations/customer_relations/organizations/update.rb'
+ - 'app/graphql/mutations/dependency_proxy/group_settings/update.rb'
+ - 'app/graphql/mutations/dependency_proxy/image_ttl_group_policy/update.rb'
+ - 'app/graphql/mutations/discussions/toggle_resolve.rb'
+ - 'app/graphql/mutations/metrics/dashboard/annotations/create.rb'
+ - 'app/graphql/mutations/metrics/dashboard/annotations/delete.rb'
+ - 'app/graphql/mutations/namespace/package_settings/update.rb'
+ - 'app/graphql/mutations/notes/create/base.rb'
+ - 'app/graphql/mutations/notes/create/diff_note.rb'
+ - 'app/graphql/mutations/notes/create/image_diff_note.rb'
+ - 'app/graphql/mutations/notes/create/note.rb'
+ - 'app/graphql/mutations/notes/reposition_image_diff_note.rb'
+ - 'app/graphql/mutations/security/ci_configuration/configure_sast.rb'
+ - 'app/graphql/mutations/terraform/state/base.rb'
+ - 'app/graphql/mutations/user_callouts/create.rb'
+ - 'app/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver.rb'
+ - 'app/graphql/resolvers/alert_management/alert_resolver.rb'
+ - 'app/graphql/resolvers/alert_management/alert_status_counts_resolver.rb'
+ - 'app/graphql/resolvers/base_issues_resolver.rb'
+ - 'app/graphql/resolvers/ci/jobs_resolver.rb'
+ - 'app/graphql/resolvers/ci/project_pipeline_counts_resolver.rb'
+ - 'app/graphql/resolvers/ci/test_suite_resolver.rb'
+ - 'app/graphql/resolvers/clusters/agents_resolver.rb'
+ - 'app/graphql/resolvers/concerns/group_issuable_resolver.rb'
+ - 'app/graphql/resolvers/concerns/search_arguments.rb'
+ - 'app/graphql/resolvers/container_repositories_resolver.rb'
+ - 'app/graphql/resolvers/container_repository_tags_resolver.rb'
+ - 'app/graphql/resolvers/environments_resolver.rb'
+ - 'app/graphql/resolvers/error_tracking/sentry_detailed_error_resolver.rb'
+ - 'app/graphql/resolvers/error_tracking/sentry_error_stack_trace_resolver.rb'
+ - 'app/graphql/resolvers/error_tracking/sentry_errors_resolver.rb'
+ - 'app/graphql/resolvers/group_members_resolver.rb'
+ - 'app/graphql/resolvers/group_packages_resolver.rb'
+ - 'app/graphql/resolvers/members_resolver.rb'
+ - 'app/graphql/resolvers/namespace_projects_resolver.rb'
+ - 'app/graphql/resolvers/package_details_resolver.rb'
+ - 'app/graphql/resolvers/packages_base_resolver.rb'
+ - 'app/graphql/resolvers/paginated_tree_resolver.rb'
+ - 'app/graphql/resolvers/project_jobs_resolver.rb'
+ - 'app/graphql/resolvers/project_members_resolver.rb'
+ - 'app/graphql/resolvers/projects/snippets_resolver.rb'
+ - 'app/graphql/resolvers/release_resolver.rb'
+ - 'app/graphql/resolvers/repository_branch_names_resolver.rb'
+ - 'app/graphql/resolvers/snippets_resolver.rb'
+ - 'app/graphql/resolvers/terraform/states_resolver.rb'
+ - 'app/graphql/resolvers/tree_resolver.rb'
+ - 'app/graphql/resolvers/users_resolver.rb'
+ - 'app/graphql/subscriptions/issuable_updated.rb'
+ - 'app/graphql/types/ci_configuration/sast/analyzers_entity_input_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/input_type.rb'
+ - 'app/graphql/types/error_tracking/sentry_error_frequency_type.rb'
+ - 'app/graphql/types/error_tracking/sentry_error_tags_type.rb'
+ - 'app/graphql/types/issues/negated_issue_filter_input_type.rb'
+ - 'app/graphql/types/merge_request_state_event_enum.rb'
+ - 'app/graphql/types/project_type.rb'
+ - 'app/graphql/types/release_asset_link_shared_input_arguments.rb'
+ - 'app/graphql/types/saved_reply_type.rb'
+ - 'app/graphql/types/user_preferences_type.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/button_helper.rb'
+ - 'app/helpers/ci/status_helper.rb'
+ - 'app/helpers/events_helper.rb'
+ - 'app/helpers/markup_helper.rb'
+ - 'app/helpers/members_helper.rb'
+ - 'app/helpers/notes_helper.rb'
+ - 'app/helpers/repository_languages_helper.rb'
+ - 'app/helpers/wiki_helper.rb'
+ - 'app/models/alert_management/http_integration.rb'
+ - 'app/models/alerting/project_alerting_setting.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/aws/role.rb'
+ - 'app/models/bulk_imports/configuration.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/bulk_imports/failure.rb'
+ - 'app/models/bulk_imports/tracker.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/processable.rb'
+ - 'app/models/ci/resource_group.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/ci_platform_metric.rb'
+ - 'app/models/clusters/agent.rb'
+ - 'app/models/clusters/applications/helm.rb'
+ - 'app/models/clusters/applications/prometheus.rb'
+ - 'app/models/clusters/integrations/prometheus.rb'
+ - 'app/models/clusters/kubernetes_namespace.rb'
+ - 'app/models/clusters/platforms/kubernetes.rb'
+ - 'app/models/clusters/providers/aws.rb'
+ - 'app/models/clusters/providers/gcp.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/compare.rb'
+ - 'app/models/concerns/blocks_unsafe_serialization.rb'
+ - 'app/models/concerns/bulk_insert_safe.rb'
+ - 'app/models/concerns/ci/has_variable.rb'
+ - 'app/models/concerns/ci/new_has_variable.rb'
+ - 'app/models/concerns/each_batch.rb'
+ - 'app/models/concerns/integrations/has_issue_tracker_fields.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/merge_request_reviewer_state.rb'
+ - 'app/models/concerns/nullify_if_blank.rb'
+ - 'app/models/concerns/packages/debian/architecture.rb'
+ - 'app/models/concerns/packages/debian/component.rb'
+ - 'app/models/concerns/packages/debian/distribution.rb'
+ - 'app/models/concerns/packages/debian/distribution_key.rb'
+ - 'app/models/concerns/repository_storage_movable.rb'
+ - 'app/models/concerns/storage/legacy_namespace.rb'
+ - 'app/models/concerns/with_uploads.rb'
+ - 'app/models/custom_emoji.rb'
+ - 'app/models/deploy_token.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/design_management/design_action.rb'
+ - 'app/models/error_tracking/error.rb'
+ - 'app/models/error_tracking/project_error_tracking_setting.rb'
+ - 'app/models/event.rb'
+ - 'app/models/gpg_key.rb'
+ - 'app/models/gpg_key_subkey.rb'
+ - 'app/models/grafana_integration.rb'
+ - 'app/models/group.rb'
+ - 'app/models/incident_management/project_incident_management_setting.rb'
+ - 'app/models/integrations/bamboo.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/integrations/teamcity.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/key.rb'
+ - 'app/models/lfs_object.rb'
+ - 'app/models/member.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/merge_request_diff_commit.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/note.rb'
+ - 'app/models/operations/feature_flag.rb'
+ - 'app/models/operations/feature_flags/strategy.rb'
+ - 'app/models/operations/feature_flags/user_list.rb'
+ - 'app/models/packages/conan/file_metadatum.rb'
+ - 'app/models/packages/debian/file_metadatum.rb'
+ - 'app/models/packages/debian/publication.rb'
+ - 'app/models/packages/dependency_link.rb'
+ - 'app/models/packages/helm/file_metadatum.rb'
+ - 'app/models/packages/maven/metadatum.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_ci_cd_setting.rb'
+ - 'app/models/project_feature.rb'
+ - 'app/models/project_metrics_setting.rb'
+ - 'app/models/redirect_route.rb'
+ - 'app/models/route.rb'
+ - 'app/models/serverless/domain_cluster.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/terraform/state.rb'
+ - 'app/models/user.rb'
+ - 'app/models/users/callout.rb'
+ - 'app/models/users/saved_reply.rb'
+ - 'app/presenters/ci/pipeline_presenter.rb'
+ - 'app/presenters/gitlab/blame_presenter.rb'
+ - 'app/presenters/label_presenter.rb'
+ - 'app/presenters/merge_request_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/serializers/build_details_entity.rb'
+ - 'app/serializers/diffs_entity.rb'
+ - 'app/serializers/environment_entity.rb'
+ - 'app/serializers/error_tracking/error_entity.rb'
+ - 'app/serializers/stage_entity.rb'
+ - 'app/serializers/triggered_pipeline_entity.rb'
+ - 'app/services/ci/archive_trace_service.rb'
+ - 'app/services/ci/job_artifacts/create_service.rb'
+ - 'app/services/ci/parse_dotenv_artifact_service.rb'
+ - 'app/services/ci/register_job_service.rb'
+ - 'app/services/ci/stuck_builds/drop_helpers.rb'
+ - 'app/services/ci/update_build_state_service.rb'
+ - 'app/services/concerns/exclusive_lease_guard.rb'
+ - 'app/services/discussions/capture_diff_note_position_service.rb'
+ - 'app/services/error_tracking/base_service.rb'
+ - 'app/services/gravatar_service.rb'
+ - 'app/services/issues/clone_service.rb'
+ - 'app/services/jira/requests/base.rb'
+ - 'app/services/merge_requests/merge_to_ref_service.rb'
+ - 'app/services/metrics/dashboard/update_dashboard_service.rb'
+ - 'app/services/packages/conan/create_package_service.rb'
+ - 'app/services/packages/create_temporary_package_service.rb'
+ - 'app/services/packages/go/create_package_service.rb'
+ - 'app/services/packages/maven/create_package_service.rb'
+ - 'app/services/prometheus/proxy_variable_substitution_service.rb'
+ - 'app/services/web_hook_service.rb'
+ - 'app/services/webauthn/authenticate_service.rb'
+ - 'app/uploaders/object_storage.rb'
+ - 'app/workers/run_pipeline_schedule_worker.rb'
+ - 'config/application.rb'
+ - 'config/initializers/zz_metrics.rb'
+ - 'config/routes.rb'
+ - 'config/routes/legacy_builds.rb'
+ - 'config/routes/project.rb'
+ - 'config/routes/repository_deprecated.rb'
+ - 'config/routes/snippets.rb'
+ - 'config/routes/uploads.rb'
+ - 'config/routes/user.rb'
+ - 'db/migrate/20210305002016_update_terraform_states_locked_by_user_id_foreign_key.rb'
+ - 'db/migrate/20210308190413_change_batched_background_migrations_batch_class_name_default.rb'
+ - 'db/migrate/20210324112439_add_index_mirror_data_on_retry_next_execution_where_status.rb'
+ - 'db/migrate/20210329191850_add_finding_signature_table.rb'
+ - 'db/migrate/20210413121101_add_created_at_web_hook_id_index_to_partitioned_web_hook_log.rb'
+ - 'db/migrate/20210413123832_add_index_on_web_hook_id_to_partitioned_web_hook_log.rb'
+ - 'db/migrate/20210505070612_create_packages_debian_group_distribution_keys.rb'
+ - 'db/migrate/20210505070812_create_packages_debian_project_distribution_keys.rb'
+ - 'db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb'
+ - 'db/migrate/20210609013512_add_unique_index_for_batched_background_migrations.rb'
+ - 'db/migrate/20210625094554_create_error_tracking_error_events.rb'
+ - 'db/migrate/20210720130006_create_error_tracking_client_keys.rb'
+ - 'db/migrate/20210721174441_update_escalation_rule_fk_for_pending_alert_escalations.rb'
+ - 'db/migrate/20210722074256_add_user_index_to_escalation_rules.rb'
+ - 'db/migrate/20210723173132_create_index_on_environments_auto_delete_at.rb'
+ - 'db/migrate/20210813111909_create_ci_build_trace_metadata.rb'
+ - 'db/migrate/20210817084338_add_foreign_key_from_ci_build_metadata_to_ci_job_artifacts.rb'
+ - 'db/migrate/20210820171834_add_foreign_keys_for_pending_issue_escalations.rb'
+ - 'db/migrate/20210923042325_index_meta_data_on_user_credit_card_validations.rb'
+ - 'db/migrate/20210928155022_improve_index_for_error_tracking.rb'
+ - 'db/migrate/20211013080716_index_include_network_on_user_credit_card_validations.rb'
+ - 'db/migrate/20211109101010_support_partition_query_in_loose_fk_table.rb'
+ - 'db/migrate/20220119170426_remove_temporary_vulnerability_occurrences_deduplication_index.rb'
+ - 'db/migrate/20220301003502_add_security_orchestration_policy_configuration_namespace_index.rb'
+ - 'db/post_migrate/20210330130420_drop_finding_fingerprint_table.rb'
+ - 'db/post_migrate/20210413130011_add_partitioned_web_hook_log_fk.rb'
+ - 'db/post_migrate/20210415101228_backfill_ci_build_needs_for_bigint_conversion.rb'
+ - 'db/post_migrate/20210422023046_backfill_ci_sources_pipelines_source_job_id_for_bigint_conversion.rb'
+ - 'db/post_migrate/20210611080951_fix_missing_traversal_ids.rb'
+ - 'db/post_migrate/20210622045705_finalize_events_bigint_conversion.rb'
+ - 'db/post_migrate/20210701033622_finalize_ci_builds_needs_bigint_conversion.rb'
+ - 'db/post_migrate/20210706212710_finalize_ci_job_artifacts_bigint_conversion.rb'
+ - 'db/post_migrate/20210713042153_finalize_ci_sources_pipelines_bigint_conversion.rb'
+ - 'db/post_migrate/20210804151444_prepare_indexes_for_ci_job_artifact_bigint_conversion.rb'
+ - 'db/post_migrate/20210804153307_prepare_indexes_for_tagging_bigint_conversion.rb'
+ - 'db/post_migrate/20210809143931_finalize_job_id_conversion_to_bigint_for_ci_job_artifacts.rb'
+ - 'db/post_migrate/20210817024335_prepare_indexes_for_events_bigint_conversion.rb'
+ - 'db/post_migrate/20210901184511_prepare_async_indexes_for_ci_builds.rb'
+ - 'db/post_migrate/20210915202900_prepare_index_resource_group_status_commit_id_for_ci_builds.rb'
+ - 'db/post_migrate/20210922084115_concurrent_index_resource_group_status_commit_id_for_ci_builds.rb'
+ - 'db/post_migrate/20211007093340_remove_analytics_snapshots_segment_id_column.rb'
+ - 'db/post_migrate/20211011104843_add_new_loose_fk_index.rb'
+ - 'db/post_migrate/20211031152417_add_indexes_to_issue_stage_events.rb'
+ - 'db/post_migrate/20211031154919_add_indexes_to_merge_request_stage_events.rb'
+ - 'db/post_migrate/20211109112454_drop_old_loose_fk_deleted_records_index.rb'
+ - 'db/post_migrate/20220310134207_add_index_project_id_and_released_at_and_id_on_releases.rb'
+ - 'ee/app/controllers/concerns/insights_actions.rb'
+ - 'ee/app/controllers/customers_dot/proxy_controller.rb'
+ - 'ee/app/controllers/ee/groups_controller.rb'
+ - 'ee/app/controllers/ee/passwords_controller.rb'
+ - 'ee/app/controllers/groups/analytics/productivity_analytics_controller.rb'
+ - 'ee/app/controllers/projects/integrations/jira/issues_controller.rb'
+ - 'ee/app/controllers/subscriptions_controller.rb'
+ - 'ee/app/finders/geo/registry_finder.rb'
+ - 'ee/app/graphql/ee/mutations/boards/issues/issue_move_list.rb'
+ - 'ee/app/graphql/ee/mutations/ci/ci_cd_settings_update.rb'
+ - 'ee/app/graphql/ee/types/ci/pipeline_type.rb'
+ - 'ee/app/graphql/ee/types/deprecated_mutations.rb'
+ - 'ee/app/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create.rb'
+ - 'ee/app/graphql/mutations/app_sec/fuzzing/coverage/corpus/create.rb'
+ - 'ee/app/graphql/mutations/boards/epic_boards/epic_move_list.rb'
+ - 'ee/app/graphql/mutations/boards/epic_lists/update.rb'
+ - 'ee/app/graphql/mutations/concerns/mutations/shared_epic_arguments.rb'
+ - 'ee/app/graphql/mutations/dast/profiles/create.rb'
+ - 'ee/app/graphql/mutations/dast_scanner_profiles/create.rb'
+ - 'ee/app/graphql/mutations/epics/update.rb'
+ - 'ee/app/graphql/mutations/requirements_management/update_requirement.rb'
+ - 'ee/app/graphql/mutations/vulnerabilities/create.rb'
+ - 'ee/app/graphql/resolvers/boards/board_list_epics_resolver.rb'
+ - 'ee/app/graphql/resolvers/ci/code_coverage_activities_resolver.rb'
+ - 'ee/app/graphql/resolvers/concerns/common_requirement_arguments.rb'
+ - 'ee/app/graphql/resolvers/epics_resolver.rb'
+ - 'ee/app/graphql/resolvers/iterations_resolver.rb'
+ - 'ee/app/graphql/resolvers/security_orchestration/scan_execution_policy_resolver.rb'
+ - 'ee/app/graphql/resolvers/security_training_urls_resolver.rb'
+ - 'ee/app/graphql/resolvers/vulnerabilities_grade_resolver.rb'
+ - 'ee/app/graphql/types/alert_management/payload_alert_field_input_type.rb'
+ - 'ee/app/graphql/types/dast/profile_cadence_input_type.rb'
+ - 'ee/app/graphql/types/dast/profile_schedule_input_type.rb'
+ - 'ee/app/graphql/types/incident_management/escalation_rule_input_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_participant_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_active_period_input_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_date_input_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_length_input_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_user_input_type.rb'
+ - 'ee/app/graphql/types/push_rules_type.rb'
+ - 'ee/app/graphql/types/vulnerability_identifier_input_type.rb'
+ - 'ee/app/graphql/types/vulnerability_scanner_input_type.rb'
+ - 'ee/app/graphql/types/vulnerability_scanner_vendor_input_type.rb'
+ - 'ee/app/helpers/ee/button_helper.rb'
+ - 'ee/app/models/concerns/approval_rule_like.rb'
+ - 'ee/app/models/concerns/security/scan_execution_policy.rb'
+ - 'ee/app/models/dast/site_profile_secret_variable.rb'
+ - 'ee/app/models/ee/identity.rb'
+ - 'ee/app/models/ee/incident_management/project_incident_management_setting.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/lfs_object.rb'
+ - 'ee/app/models/ee/list.rb'
+ - 'ee/app/models/ee/merge_request_diff.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/pages_deployment.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/geo/event_log.rb'
+ - 'ee/app/models/geo/repository_renamed_event.rb'
+ - 'ee/app/models/project_alias.rb'
+ - 'ee/app/models/status_page/project_setting.rb'
+ - 'ee/app/serializers/vulnerability_entity.rb'
+ - 'ee/app/services/ci/minutes/update_project_and_namespace_usage_service.rb'
+ - 'ee/app/services/ee/ci/queue/build_queue_service.rb'
+ - 'ee/app/services/geo/event_store.rb'
+ - 'ee/app/services/geo/repository_base_sync_service.rb'
+ - 'ee/app/services/timebox_report_service.rb'
+ - 'ee/db/geo/migrate/20180405074130_add_partial_index_project_repository_verification.rb'
+ - 'ee/lib/api/epic_issues.rb'
+ - 'ee/lib/api/managed_licenses.rb'
+ - 'ee/lib/bulk_imports/groups/pipelines/iterations_pipeline.rb'
+ - 'ee/lib/ee/api/entities/approval_settings.rb'
+ - 'ee/lib/ee/api/members.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'ee/lib/ee/gitlab/ci/config/entry/job.rb'
+ - 'ee/lib/ee/gitlab/ci/config/entry/need.rb'
+ - 'ee/lib/ee/gitlab/event_store.rb'
+ - 'ee/lib/ee/gitlab/web_ide/config/entry/global.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/summary/group/stage_summary.rb'
+ - 'ee/lib/gitlab/web_ide/config/entry/schema.rb'
+ - 'ee/spec/controllers/admin/clusters_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/variables_controller_spec.rb'
+ - 'ee/spec/controllers/groups/clusters_controller_spec.rb'
+ - 'ee/spec/controllers/groups/todos_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/controllers/projects/protected_environments_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/scanned_resources_controller_spec.rb'
+ - 'ee/spec/controllers/projects_controller_spec.rb'
+ - 'ee/spec/controllers/subscriptions_controller_spec.rb'
+ - 'ee/spec/factories/epic_tree_nodes.rb'
+ - 'ee/spec/factories/groups.rb'
+ - 'ee/spec/factories/namespaces.rb'
+ - 'ee/spec/factories/users.rb'
+ - 'ee/spec/features/billings/billing_plans_spec.rb'
+ - 'ee/spec/features/ide/user_commits_changes_spec.rb'
+ - 'ee/spec/features/merge_request/user_approves_spec.rb'
+ - 'ee/spec/features/merge_request/user_merges_immediately_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_approval_widget_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_merge_widget_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_mr_approvals_promo_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/environments/environments_spec.rb'
+ - 'ee/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb'
+ - 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'ee/spec/features/uncompleted_learn_gitlab_link_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/search.rb'
+ - 'ee/spec/graphql/mutations/incident_management/timeline_event/create_spec.rb'
+ - 'ee/spec/graphql/mutations/requirements_management/export_requirements_spec.rb'
+ - 'ee/spec/helpers/billing_plans_helper_spec.rb'
+ - 'ee/spec/helpers/ee/users/callouts_helper_spec.rb'
+ - 'ee/spec/helpers/projects/security/policies_helper_spec.rb'
+ - 'ee/spec/helpers/routing/pseudonymization_helper_spec.rb'
+ - 'ee/spec/helpers/trial_status_widget_helper_spec.rb'
+ - 'ee/spec/lib/analytics/group_activity_calculator_spec.rb'
+ - 'ee/spec/lib/banzai/filter/cross_project_issuable_information_filter_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/analytics/group_activity_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/minutes/cost_factor_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/pipeline/chain/limit/size_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/security_orchestration_policies/lazy_dast_profile_aggregate_spec.rb'
+ - 'ee/spec/lib/incident_management/oncall_shift_generator_spec.rb'
+ - 'ee/spec/models/approval_wrapped_code_owner_rule_spec.rb'
+ - 'ee/spec/models/ci/minutes/limit_spec.rb'
+ - 'ee/spec/models/ci/minutes/namespace_monthly_usage_spec.rb'
+ - 'ee/spec/models/ci/minutes/project_monthly_usage_spec.rb'
+ - 'ee/spec/models/ee/audit_event_spec.rb'
+ - 'ee/spec/models/ee/ci/build_dependencies_spec.rb'
+ - 'ee/spec/models/ee/ci/runner_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/ee/service_desk_setting_spec.rb'
+ - 'ee/spec/models/integrations/github_spec.rb'
+ - 'ee/spec/models/ldap_group_link_spec.rb'
+ - 'ee/spec/models/merge_request_spec.rb'
+ - 'ee/spec/models/merge_train_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/vulnerabilities/read_spec.rb'
+ - 'ee/spec/policies/merge_request_policy_spec.rb'
+ - 'ee/spec/requests/api/ci/runner/jobs_put_spec.rb'
+ - 'ee/spec/requests/api/ci/runner/jobs_trace_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/epic_board_list_epics_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/epic_boards_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/epic_lists_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/dast_profile_schedule_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epics/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epics/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/requirements_management/create_requirement_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/requirements_management/update_requirement_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/assign_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/create_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/unassign_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/destroy_external_issue_link_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/finding_dismiss_spec.rb'
+ - 'ee/spec/requests/api/graphql/namespace/projects_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/security_report_summary_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/requirements_management/test_reports_spec.rb'
+ - 'ee/spec/requests/api/group_hooks_spec.rb'
+ - 'ee/spec/requests/api/groups_spec.rb'
+ - 'ee/spec/requests/api/invitations_spec.rb'
+ - 'ee/spec/requests/api/issues_spec.rb'
+ - 'ee/spec/requests/api/managed_licenses_spec.rb'
+ - 'ee/spec/requests/api/project_push_rule_spec.rb'
+ - 'ee/spec/requests/api/settings_spec.rb'
+ - 'ee/spec/requests/groups_controller_spec.rb'
+ - 'ee/spec/requests/projects/mirrors_controller_spec.rb'
+ - 'ee/spec/requests/projects/requirements_management/requirements_controller_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/finding_entity_spec.rb'
+ - 'ee/spec/services/approval_rules/update_service_spec.rb'
+ - 'ee/spec/services/audit_events/export_csv_service_spec.rb'
+ - 'ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb'
+ - 'ee/spec/services/auto_merge/merge_train_service_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/cross_needs_artifacts_spec.rb'
+ - 'ee/spec/services/ci/external_pull_requests/process_github_event_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/batch_reset_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/update_build_minutes_service_spec.rb'
+ - 'ee/spec/services/ci/pipeline_creation/drop_not_runnable_builds_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/ee/protected_branches/create_service_spec.rb'
+ - 'ee/spec/services/epics/update_service_spec.rb'
+ - 'ee/spec/services/geo/file_download_service_spec.rb'
+ - 'ee/spec/services/geo/file_registry_removal_service_spec.rb'
+ - 'ee/spec/services/geo/repository_verification_primary_service_spec.rb'
+ - 'ee/spec/services/groups/recent_merge_requests_count_service_spec.rb'
+ - 'ee/spec/services/merge_requests/reset_approvals_service_spec.rb'
+ - 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/namespaces/check_storage_size_service_spec.rb'
+ - 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
+ - 'ee/spec/services/projects/restore_service_spec.rb'
+ - 'ee/spec/services/security/merge_reports_service_spec.rb'
+ - 'ee/spec/services/security/report_summary_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/rule_schedule_service_spec.rb'
+ - 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/support/helpers/ee/geo_helpers.rb'
+ - 'ee/spec/support/shared_examples/features/credentials_inventory_shared_examples.rb'
+ - 'ee/spec/views/groups/feature_discovery_moments/advanced_features_dashboard.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/_search.html.haml_spec.rb'
+ - 'ee/spec/workers/adjourned_group_deletion_worker_spec.rb'
+ - 'ee/spec/workers/ci/batch_reset_minutes_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb'
+ - 'lib/api/admin/ci/variables.rb'
+ - 'lib/api/ci/job_artifacts.rb'
+ - 'lib/api/commits.rb'
+ - 'lib/api/concerns/packages/npm_endpoints.rb'
+ - 'lib/api/deploy_keys.rb'
+ - 'lib/api/deployments.rb'
+ - 'lib/api/entities/ci/pipeline_schedule_details.rb'
+ - 'lib/api/entities/diff_position.rb'
+ - 'lib/api/entities/event.rb'
+ - 'lib/api/entities/internal/pages/lookup_path.rb'
+ - 'lib/api/entities/merge_request_diff.rb'
+ - 'lib/api/entities/pages_domain.rb'
+ - 'lib/api/entities/pages_domain_basic.rb'
+ - 'lib/api/feature_flags.rb'
+ - 'lib/api/feature_flags_user_lists.rb'
+ - 'lib/api/features.rb'
+ - 'lib/api/helm_packages.rb'
+ - 'lib/api/helpers/internal_helpers.rb'
+ - 'lib/api/helpers/merge_requests_helpers.rb'
+ - 'lib/api/issues.rb'
+ - 'lib/api/merge_requests.rb'
+ - 'lib/api/project_container_repositories.rb'
+ - 'lib/api/project_import.rb'
+ - 'lib/api/releases.rb'
+ - 'lib/api/remote_mirrors.rb'
+ - 'lib/api/repositories.rb'
+ - 'lib/api/search.rb'
+ - 'lib/api/tags.rb'
+ - 'lib/api/users.rb'
+ - 'lib/api/wikis.rb'
+ - 'lib/banzai/filter/commit_trailers_filter.rb'
+ - 'lib/banzai/filter/references/commit_range_reference_filter.rb'
+ - 'lib/banzai/filter/references/merge_request_reference_filter.rb'
+ - 'lib/banzai/filter/references/snippet_reference_filter.rb'
+ - 'lib/banzai/pipeline.rb'
+ - 'lib/banzai/reference_parser/base_parser.rb'
+ - 'lib/bulk_imports/common/pipelines/badges_pipeline.rb'
+ - 'lib/feature.rb'
+ - 'lib/gem_extensions/active_record/disable_joins/associations/association_scope.rb'
+ - 'lib/generators/gitlab/usage_metric_definition_generator.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_queuing_tables.rb'
+ - 'lib/gitlab/background_migration/backfill_project_repositories.rb'
+ - 'lib/gitlab/background_migration/batching_strategies/base_strategy.rb'
+ - 'lib/gitlab/background_migration/legacy_upload_mover.rb'
+ - 'lib/gitlab/background_migration/migrate_stage_status.rb'
+ - 'lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb'
+ - 'lib/gitlab/ci/config/entry/artifacts.rb'
+ - 'lib/gitlab/ci/config/entry/bridge.rb'
+ - 'lib/gitlab/ci/config/entry/cache.rb'
+ - 'lib/gitlab/ci/config/entry/default.rb'
+ - 'lib/gitlab/ci/config/entry/environment.rb'
+ - 'lib/gitlab/ci/config/entry/image.rb'
+ - 'lib/gitlab/ci/config/entry/include.rb'
+ - 'lib/gitlab/ci/config/entry/inherit.rb'
+ - 'lib/gitlab/ci/config/entry/job.rb'
+ - 'lib/gitlab/ci/config/entry/key.rb'
+ - 'lib/gitlab/ci/config/entry/need.rb'
+ - 'lib/gitlab/ci/config/entry/processable.rb'
+ - 'lib/gitlab/ci/config/entry/product/parallel.rb'
+ - 'lib/gitlab/ci/config/entry/root.rb'
+ - 'lib/gitlab/ci/config/entry/rules/rule.rb'
+ - 'lib/gitlab/ci/config/entry/service.rb'
+ - 'lib/gitlab/ci/config/entry/trigger.rb'
+ - 'lib/gitlab/ci/config/entry/workflow.rb'
+ - 'lib/gitlab/ci/pipeline/chain/config/process.rb'
+ - 'lib/gitlab/ci/trace.rb'
+ - 'lib/gitlab/ci/variables/builder.rb'
+ - 'lib/gitlab/config/loader/yaml.rb'
+ - 'lib/gitlab/conflict/file.rb'
+ - 'lib/gitlab/data_builder/pipeline.rb'
+ - 'lib/gitlab/database/background_migration/batched_job.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration.rb'
+ - 'lib/gitlab/database/load_balancing/resolver.rb'
+ - 'lib/gitlab/database/partitioning/replace_table.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb'
+ - 'lib/gitlab/database_importers/instance_administrators/create_group.rb'
+ - 'lib/gitlab/database_importers/self_monitoring/project/create_service.rb'
+ - 'lib/gitlab/database_importers/self_monitoring/project/delete_service.rb'
+ - 'lib/gitlab/diff/custom_diff.rb'
+ - 'lib/gitlab/diff/file.rb'
+ - 'lib/gitlab/diff/file_collection/base.rb'
+ - 'lib/gitlab/diff/suggestion.rb'
+ - 'lib/gitlab/error_tracking/error.rb'
+ - 'lib/gitlab/git/repository.rb'
+ - 'lib/gitlab/gitaly_client/operation_service.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_importer.rb'
+ - 'lib/gitlab/github_import/representation/diff_note.rb'
+ - 'lib/gitlab/gpg.rb'
+ - 'lib/gitlab/graphs/commits.rb'
+ - 'lib/gitlab/kubernetes/kube_client.rb'
+ - 'lib/gitlab/legacy_github_import/client.rb'
+ - 'lib/gitlab/middleware/read_only/controller.rb'
+ - 'lib/gitlab/net_http_adapter.rb'
+ - 'lib/gitlab/phabricator_import/cache/map.rb'
+ - 'lib/gitlab/quick_actions/command_definition.rb'
+ - 'lib/gitlab/search/abuse_detection.rb'
+ - 'lib/gitlab/spamcheck/client.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/gitlab/utils/delegator_override/validator.rb'
+ - 'lib/gitlab/web_ide/config.rb'
+ - 'lib/gitlab/web_ide/config/entry/global.rb'
+ - 'lib/gitlab/web_ide/config/entry/terminal.rb'
+ - 'lib/mattermost/command.rb'
+ - 'lib/safe_zip/extract.rb'
+ - 'lib/tasks/gitlab/shell.rake'
+ - 'lib/tasks/gitlab/update_templates.rake'
+ - 'qa/qa/page/base.rb'
+ - 'qa/qa/scenario/shared_attributes.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb'
+ - 'qa/qa/tools/generate_perf_testdata.rb'
+ - 'qa/spec/git/repository_spec.rb'
+ - 'qa/spec/runtime/env_spec.rb'
+ - 'scripts/changed-feature-flags'
+ - 'sidekiq_cluster/cli.rb'
+ - 'spec/bin/feature_flag_spec.rb'
+ - 'spec/controllers/admin/ci/variables_controller_spec.rb'
+ - 'spec/controllers/admin/clusters_controller_spec.rb'
+ - 'spec/controllers/concerns/renders_commits_spec.rb'
+ - 'spec/controllers/groups/clusters_controller_spec.rb'
+ - 'spec/controllers/groups/milestones_controller_spec.rb'
+ - 'spec/controllers/groups/variables_controller_spec.rb'
+ - 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/controllers/profiles_controller_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/branches_controller_spec.rb'
+ - 'spec/controllers/projects/clusters_controller_spec.rb'
+ - 'spec/controllers/projects/commit_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_clients_controller_spec.rb'
+ - 'spec/controllers/projects/forks_controller_spec.rb'
+ - 'spec/controllers/projects/grafana_api_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/jobs_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/pipeline_schedules_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines/tests_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/controllers/projects/serverless/functions_controller_spec.rb'
+ - 'spec/controllers/projects/settings/operations_controller_spec.rb'
+ - 'spec/controllers/projects/tags_controller_spec.rb'
+ - 'spec/controllers/projects/todos_controller_spec.rb'
+ - 'spec/controllers/projects/variables_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/factories/ci/pipelines.rb'
+ - 'spec/factories/clusters/clusters.rb'
+ - 'spec/factories/draft_note.rb'
+ - 'spec/factories/integrations.rb'
+ - 'spec/factories/merge_requests.rb'
+ - 'spec/factories/notes.rb'
+ - 'spec/factories/projects.rb'
+ - 'spec/factories/snippets.rb'
+ - 'spec/features/dashboard/merge_requests_spec.rb'
+ - 'spec/features/issuables/issuable_list_spec.rb'
+ - 'spec/features/issues/filtered_search/filter_issues_spec.rb'
+ - 'spec/features/merge_request/user_creates_mr_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_outdated_diff_discussions_spec.rb'
+ - 'spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_sees_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_pipelines_spec.rb'
+ - 'spec/features/merge_request/user_sees_versions_spec.rb'
+ - 'spec/features/merge_requests/user_lists_merge_requests_spec.rb'
+ - 'spec/features/merge_requests/user_views_open_merge_requests_spec.rb'
+ - 'spec/features/projects/branches_spec.rb'
+ - 'spec/features/projects/commit/mini_pipeline_graph_spec.rb'
+ - 'spec/features/projects/environments/environment_spec.rb'
+ - 'spec/features/projects/environments/environments_spec.rb'
+ - 'spec/features/projects/files/editing_a_file_spec.rb'
+ - 'spec/features/projects/files/project_owner_creates_license_file_spec.rb'
+ - 'spec/features/projects/files/user_reads_pipeline_status_spec.rb'
+ - 'spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/features/projects/milestones/milestones_sorting_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/pipelines/pipelines_spec.rb'
+ - 'spec/features/projects/serverless/functions_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/files/editing_a_file_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/files/project_owner_creates_license_file_spec.rb'
+ - 'spec/finders/ci/commit_statuses_finder_spec.rb'
+ - 'spec/finders/ci/pipelines_for_merge_request_finder_spec.rb'
+ - 'spec/finders/clusters/knative_services_finder_spec.rb'
+ - 'spec/finders/clusters/kubernetes_namespace_finder_spec.rb'
+ - 'spec/finders/group_descendants_finder_spec.rb'
+ - 'spec/finders/keys_finder_spec.rb'
+ - 'spec/finders/merge_requests_finder_spec.rb'
+ - 'spec/finders/personal_access_tokens_finder_spec.rb'
+ - 'spec/finders/projects/serverless/functions_finder_spec.rb'
+ - 'spec/frontend/fixtures/issues.rb'
+ - 'spec/frontend/fixtures/merge_requests.rb'
+ - 'spec/frontend/fixtures/merge_requests_diffs.rb'
+ - 'spec/frontend/fixtures/projects_json.rb'
+ - 'spec/frontend/fixtures/search.rb'
+ - 'spec/graphql/mutations/ci/job_token_scope/remove_project_spec.rb'
+ - 'spec/graphql/mutations/customer_relations/contacts/create_spec.rb'
+ - 'spec/graphql/mutations/customer_relations/organizations/create_spec.rb'
+ - 'spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb'
+ - 'spec/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb'
+ - 'spec/graphql/mutations/namespace/package_settings/update_spec.rb'
+ - 'spec/graphql/types/project_statistics_type_spec.rb'
+ - 'spec/graphql/types/root_storage_statistics_type_spec.rb'
+ - 'spec/helpers/notes_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/helpers/todos_helper_spec.rb'
+ - 'spec/initializers/secret_token_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/serializers/feature_flag_entity_spec.rb'
+ - 'spec/lib/backup/manager_spec.rb'
+ - 'spec/lib/banzai/filter/syntax_highlight_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/wiki_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline_spec.rb'
+ - 'spec/lib/banzai/reference_redactor_spec.rb'
+ - 'spec/lib/constraints/group_url_constrainer_spec.rb'
+ - 'spec/lib/constraints/project_url_constrainer_spec.rb'
+ - 'spec/lib/constraints/user_url_constrainer_spec.rb'
+ - 'spec/lib/feature_spec.rb'
+ - 'spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb'
+ - 'spec/lib/gitlab/api_authentication/builder_spec.rb'
+ - 'spec/lib/gitlab/asciidoc_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb'
+ - 'spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb'
+ - 'spec/lib/gitlab/checks/matching_merge_request_spec.rb'
+ - 'spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb'
+ - 'spec/lib/gitlab/ci/build/policy/variables_spec.rb'
+ - 'spec/lib/gitlab/ci/build/rules/rule_spec.rb'
+ - 'spec/lib/gitlab/ci/build/rules_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/job_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/processable_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/artifact_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/test/junit_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/remove_unwanted_chat_jobs_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/validate/abilities_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb'
+ - 'spec/lib/gitlab/ci/status/bridge/common_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/group_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/project_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder_spec.rb'
+ - 'spec/lib/gitlab/config/entry/composable_hash_spec.rb'
+ - 'spec/lib/gitlab/config/entry/configurable_spec.rb'
+ - 'spec/lib/gitlab/current_settings_spec.rb'
+ - 'spec/lib/gitlab/data_builder/pipeline_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb'
+ - 'spec/lib/gitlab/database/batch_count_spec.rb'
+ - 'spec/lib/gitlab/database/gitlab_schema_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/index_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces_spec.rb'
+ - 'spec/lib/gitlab/email/message/repository_push_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/external_authorization/client_spec.rb'
+ - 'spec/lib/gitlab/fogbugz_import/project_creator_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/exception_logger_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/queue_duration_logger_spec.rb'
+ - 'spec/lib/gitlab/import_export/importer_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/object_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importer_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator/post_schema_validator_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/conduit/response_spec.rb'
+ - 'spec/lib/gitlab/spamcheck/client_spec.rb'
+ - 'spec/lib/gitlab/url_blocker_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/query_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/designs_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/snippet_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/static_site_editor_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/wiki_page_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_queries_spec.rb'
+ - 'spec/lib/mattermost/session_spec.rb'
+ - 'spec/lib/peek/views/detailed_view_spec.rb'
+ - 'spec/lib/system_check/base_check_spec.rb'
+ - 'spec/mailers/emails/pipelines_spec.rb'
+ - 'spec/mailers/notify_spec.rb'
+ - 'spec/models/active_session_spec.rb'
+ - 'spec/models/ci/build_dependencies_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/build_trace_metadata_spec.rb'
+ - 'spec/models/ci/commit_with_pipeline_spec.rb'
+ - 'spec/models/ci/job_token/project_scope_link_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/clusters/applications/knative_spec.rb'
+ - 'spec/models/concerns/bulk_insert_safe_spec.rb'
+ - 'spec/models/concerns/deployment_platform_spec.rb'
+ - 'spec/models/design_management/design_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/external_pull_request_spec.rb'
+ - 'spec/models/instance_configuration_spec.rb'
+ - 'spec/models/integrations/pipelines_email_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/u2f_registration_spec.rb'
+ - 'spec/presenters/blob_presenter_spec.rb'
+ - 'spec/requests/api/admin/ci/variables_spec.rb'
+ - 'spec/requests/api/badges_spec.rb'
+ - 'spec/requests/api/broadcast_messages_spec.rb'
+ - 'spec/requests/api/ci/job_artifacts_spec.rb'
+ - 'spec/requests/api/ci/pipeline_schedules_spec.rb'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/triggers_spec.rb'
+ - 'spec/requests/api/commit_statuses_spec.rb'
+ - 'spec/requests/api/discussions_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb'
+ - 'spec/requests/api/graphql/group/group_members_spec.rb'
+ - 'spec/requests/api/graphql/group/milestones_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/add_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/job_token_scope/remove_project_spec.rb'
+ - 'spec/requests/api/graphql/mutations/commits/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/discussions/toggle_resolve_spec.rb'
+ - 'spec/requests/api/graphql/mutations/labels/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/notes/create/note_spec.rb'
+ - 'spec/requests/api/graphql/project/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/version_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/versions_spec.rb'
+ - 'spec/requests/api/graphql/project/project_members_spec.rb'
+ - 'spec/requests/api/graphql/project/release_spec.rb'
+ - 'spec/requests/api/graphql/project/releases_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/states_spec.rb'
+ - 'spec/requests/api/graphql/tasks/task_completion_status_spec.rb'
+ - 'spec/requests/api/import_github_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/issues/get_project_issues_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/issues/put_projects_issues_spec.rb'
+ - 'spec/requests/api/labels_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/namespaces_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/oauth_tokens_spec.rb'
+ - 'spec/requests/api/project_hooks_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/protected_tags_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/settings_spec.rb'
+ - 'spec/requests/api/system_hooks_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/requests/oauth_tokens_spec.rb'
+ - 'spec/requests/openid_connect_spec.rb'
+ - 'spec/requests/self_monitoring_project_spec.rb'
+ - 'spec/routing/project_routing_spec.rb'
+ - 'spec/rubocop/cop/rspec/be_success_matcher_spec.rb'
+ - 'spec/serializers/feature_flag_entity_spec.rb'
+ - 'spec/serializers/feature_flag_serializer_spec.rb'
+ - 'spec/serializers/pipeline_serializer_spec.rb'
+ - 'spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb'
+ - 'spec/services/award_emojis/destroy_service_spec.rb'
+ - 'spec/services/bulk_update_integration_service_spec.rb'
+ - 'spec/services/ci/archive_trace_service_spec.rb'
+ - 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/custom_config_content_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/create_service_spec.rb'
+ - 'spec/services/ci/job_token_scope/remove_project_service_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb'
+ - 'spec/services/ci/register_job_service_spec.rb'
+ - 'spec/services/ci/retry_pipeline_service_spec.rb'
+ - 'spec/services/dependency_proxy/group_settings/update_service_spec.rb'
+ - 'spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb'
+ - 'spec/services/deployments/update_environment_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_positions_service_spec.rb'
+ - 'spec/services/environments/stop_service_spec.rb'
+ - 'spec/services/files/delete_service_spec.rb'
+ - 'spec/services/files/update_service_spec.rb'
+ - 'spec/services/issues/resolve_discussions_spec.rb'
+ - 'spec/services/merge_requests/create_pipeline_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/post_merge_service_spec.rb'
+ - 'spec/services/merge_requests/rebase_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/merge_requests/retarget_chain_service_spec.rb'
+ - 'spec/services/merge_requests/squash_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/metrics/dashboard/clone_dashboard_service_spec.rb'
+ - 'spec/services/namespaces/package_settings/update_service_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/packages/debian/extract_metadata_service_spec.rb'
+ - 'spec/services/pod_logs/kubernetes_service_spec.rb'
+ - 'spec/services/projects/destroy_service_spec.rb'
+ - 'spec/services/security/merge_reports_service_spec.rb'
+ - 'spec/services/system_notes/design_management_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/upload_service_spec.rb'
+ - 'spec/sidekiq_cluster/sidekiq_cluster_spec.rb'
+ - 'spec/support/database/prevent_cross_database_modification.rb'
+ - 'spec/support/database/prevent_cross_joins.rb'
+ - 'spec/support/helpers/cycle_analytics_helpers.rb'
+ - 'spec/support/helpers/feature_flag_helpers.rb'
+ - 'spec/support/helpers/project_forks_helper.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/shared_contexts/requests/api/graphql/jira_import/jira_projects_context.rb'
+ - 'spec/support/shared_examples/ci/pipeline_email_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/concerns/integrations/integrations_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/snippets_sort_order_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/mutations/boards_create_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb'
+ - 'spec/support/shared_examples/models/active_record_enum_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/from_set_operator_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb'
+ - 'spec/support/shared_examples/models/diff_note_after_commit_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/merge_request/merge_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/diff_discussions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/discussions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_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/merge_requests_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/notes_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/resolvable_discussions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/graphql_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/rack_attack_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/boards_recent_visit_shared_examples.rb'
+ - 'spec/support/trace/trace_helpers.rb'
+ - 'spec/tooling/quality/test_level_spec.rb'
+ - 'spec/uploaders/file_uploader_spec.rb'
+ - 'spec/uploaders/packages/composer/cache_uploader_spec.rb'
+ - 'spec/views/layouts/_search.html.haml_spec.rb'
+ - 'spec/views/projects/merge_requests/_commits.html.haml_spec.rb'
+ - 'spec/views/projects/merge_requests/edit.html.haml_spec.rb'
+ - 'spec/views/projects/tags/index.html.haml_spec.rb'
+ - 'spec/workers/expire_job_cache_worker_spec.rb'
+ - 'spec/workers/expire_pipeline_cache_worker_spec.rb'
+ - 'spec/workers/pipeline_notification_worker_spec.rb'
+ - 'spec/workers/remove_unreferenced_lfs_objects_worker_spec.rb'
+ - 'spec/workers/update_external_pull_requests_worker_spec.rb'
+ - 'spec/workers/web_hook_worker_spec.rb'
diff --git a/.rubocop_todo/layout/first_array_element_indentation.yml b/.rubocop_todo/layout/first_array_element_indentation.yml
new file mode 100644
index 00000000000..d613d083f9f
--- /dev/null
+++ b/.rubocop_todo/layout/first_array_element_indentation.yml
@@ -0,0 +1,357 @@
+---
+# Cop supports --auto-correct.
+Layout/FirstArrayElementIndentation:
+ # Offense count: 1133
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/abuse_reports_controller.rb'
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/admin/broadcast_messages_controller.rb'
+ - 'app/controllers/admin/plan_limits_controller.rb'
+ - 'app/controllers/boards/issues_controller.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/controllers/projects/pipelines_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/finders/issuable_finder.rb'
+ - 'app/finders/merge_requests/by_approvals_finder.rb'
+ - 'app/finders/user_groups_counter.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/models/ci/job_token/scope.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/group.rb'
+ - 'app/models/integration.rb'
+ - 'app/models/integrations/bamboo.rb'
+ - 'app/models/internal_id.rb'
+ - 'app/models/member.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/project.rb'
+ - 'app/models/projects/topic.rb'
+ - 'app/models/todo.rb'
+ - 'app/models/user.rb'
+ - 'app/services/ci/delete_objects_service.rb'
+ - 'app/services/labels/transfer_service.rb'
+ - 'app/services/milestones/transfer_service.rb'
+ - 'app/workers/ssh_keys/expired_notification_worker.rb'
+ - 'config/initializers/postgres_partitioning.rb'
+ - 'db/post_migrate/20210812013042_remove_duplicate_project_authorizations.rb'
+ - 'ee/app/controllers/projects/vulnerability_feedback_controller.rb'
+ - 'ee/app/finders/autocomplete/project_invited_groups_finder.rb'
+ - 'ee/app/finders/geo/project_registry_finder.rb'
+ - 'ee/app/finders/merge_requests/by_approvers_finder.rb'
+ - 'ee/app/graphql/mutations/vulnerabilities/create.rb'
+ - 'ee/app/helpers/ee/application_settings_helper.rb'
+ - 'ee/app/helpers/ee/trial_helper.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/protected_environment.rb'
+ - 'ee/app/serializers/dashboard_environments_serializer.rb'
+ - 'ee/app/serializers/merge_request_compliance_entity.rb'
+ - 'ee/app/services/app_sec/dast/profiles/update_service.rb'
+ - 'ee/app/services/vulnerabilities/create_service_base.rb'
+ - 'ee/lib/ee/api/helpers/award_emoji.rb'
+ - 'ee/lib/ee/gitlab/geo_git_access.rb'
+ - 'ee/lib/gitlab/elastic/helper.rb'
+ - 'ee/lib/gitlab/sitemaps/url_extractor.rb'
+ - 'ee/lib/tasks/gitlab/seed/metrics.rake'
+ - 'ee/spec/controllers/admin/audit_log_reports_controller_spec.rb'
+ - 'ee/spec/controllers/admin/licenses/usage_exports_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/coverage_reports_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/merge_commit_reports_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/features/admin/admin_dev_ops_reports_spec.rb'
+ - 'ee/spec/features/boards/boards_licensed_features_spec.rb'
+ - 'ee/spec/features/groups/group_roadmap_spec.rb'
+ - 'ee/spec/finders/billed_users_finder_spec.rb'
+ - 'ee/spec/finders/merge_requests/by_approvers_finder_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/frontend/fixtures/search.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/create_spec.rb'
+ - 'ee/spec/graphql/resolvers/dora_metrics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/timebox_report_resolver_spec.rb'
+ - 'ee/spec/graphql/types/ci/pipeline_type_spec.rb'
+ - 'ee/spec/graphql/types/dast_scanner_profile_type_spec.rb'
+ - 'ee/spec/graphql/types/dast_site_profile_type_spec.rb'
+ - 'ee/spec/helpers/paid_feature_callout_helper_spec.rb'
+ - 'ee/spec/helpers/trial_status_widget_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/access_levels_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/gitlab/checks/diff_check_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/config/security_orchestration_policies/processor_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/browser_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/dast_default_branch_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/load_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/epics/epic_node_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_block_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/loaders/bulk_epic_aggregate_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_builds_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_ci_builds_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/vulnerabilities/parser_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/group_value_stream_spec.rb'
+ - 'ee/spec/models/application_setting_spec.rb'
+ - 'ee/spec/models/approval_state_spec.rb'
+ - 'ee/spec/models/burndown_spec.rb'
+ - 'ee/spec/models/concerns/ee/noteable_spec.rb'
+ - 'ee/spec/models/concerns/geo/verification_state_spec.rb'
+ - 'ee/spec/models/ee/iterations/cadence_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/ee/release_spec.rb'
+ - 'ee/spec/models/group_wiki_repository_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/requirements_management/test_report_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_configuration_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_rule_schedule_spec.rb'
+ - 'ee/spec/models/security/scan_spec.rb'
+ - 'ee/spec/models/security/training_provider_spec.rb'
+ - 'ee/spec/models/snippet_repository_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/requests/admin/user_permission_exports_controller_spec.rb'
+ - 'ee/spec/requests/api/analytics/project_deployment_frequency_spec.rb'
+ - 'ee/spec/requests/api/experiments_spec.rb'
+ - 'ee/spec/requests/api/graphql/analytics/devops_adoption/enabled_namespaces_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/quality_management/test_cases/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/alert_management/payload_fields_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/escalation_policy/rules_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/merge_requests_spec.rb'
+ - 'ee/spec/requests/api/ldap_group_links_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/value_streams/update_service_spec.rb'
+ - 'ee/spec/services/audit_events/export_csv_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/fetch_purchase_eligible_namespaces_service_spec.rb'
+ - 'ee/spec/services/groups/seat_usage_export_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/create_iterations_in_advance_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/create_service_spec.rb'
+ - 'ee/spec/services/protected_environments/base_service_spec.rb'
+ - 'ee/spec/services/search_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/process_scan_result_policy_service_spec.rb'
+ - 'ee/spec/services/security/store_findings_metadata_service_spec.rb'
+ - 'ee/spec/services/timebox_report_service_spec.rb'
+ - 'ee/spec/services/user_permissions/export_service_spec.rb'
+ - 'ee/spec/support/shared_examples/services/search_notes_shared_examples.rb'
+ - 'ee/spec/workers/geo/scheduler/scheduler_worker_spec.rb'
+ - 'lib/gitlab/background_migration/fix_merge_request_diff_commit_users.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/team.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/trial.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
+ - 'lib/gitlab/import_export/base/relation_factory.rb'
+ - 'lib/gitlab/import_export/json/streaming_serializer.rb'
+ - 'lib/gitlab/integrations/sti_type.rb'
+ - 'lib/gitlab/kroki.rb'
+ - 'lib/gitlab/object_hierarchy.rb'
+ - 'lib/gitlab/pagination/keyset/simple_order_builder.rb'
+ - 'lib/gitlab/project_authorizations.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/system_check/app/authorized_keys_permission_check.rb'
+ - 'qa/qa/resource/protected_branch.rb'
+ - 'qa/qa/specs/features/api/1_manage/project_access_token_spec.rb'
+ - 'qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/gitaly_mtls_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb'
+ - 'qa/qa/specs/features/ee/api/1_manage/user/minimal_access_user_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/advanced_global_advanced_syntax_search_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/elasticsearch_api_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/index_tests/main_index/blob_index_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/nightly_elasticsearch_test_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/code_owners_with_protected_branch_and_squashed_commits_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/4_verify/new_discussion_not_dropping_merge_trains_mr_spec.rb'
+ - 'spec/controllers/concerns/send_file_upload_spec.rb'
+ - 'spec/controllers/graphql_controller_spec.rb'
+ - 'spec/controllers/projects/ci/daily_build_group_report_results_controller_spec.rb'
+ - 'spec/controllers/projects/ci/lints_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines/tests_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/deprecation_toolkit_env.rb'
+ - 'spec/experiments/new_project_sast_enabled_experiment_spec.rb'
+ - 'spec/features/clusters/create_agent_spec.rb'
+ - 'spec/features/issues/filtered_search/filter_issues_spec.rb'
+ - 'spec/features/issues/filtered_search/visual_tokens_spec.rb'
+ - 'spec/finders/ci/daily_build_group_report_results_finder_spec.rb'
+ - 'spec/finders/deploy_tokens/tokens_finder_spec.rb'
+ - 'spec/frontend/fixtures/search.rb'
+ - 'spec/graphql/mutations/commits/create_spec.rb'
+ - 'spec/graphql/resolvers/ci/test_suite_resolver_spec.rb'
+ - 'spec/graphql/types/ci/runner_architecture_type_spec.rb'
+ - 'spec/graphql/types/ci/runner_platform_type_spec.rb'
+ - 'spec/graphql/types/metrics/dashboard_type_spec.rb'
+ - 'spec/graphql/types/packages/composer/metadatum_type_spec.rb'
+ - 'spec/graphql/types/packages/tag_type_spec.rb'
+ - 'spec/helpers/application_settings_helper_spec.rb'
+ - 'spec/helpers/commits_helper_spec.rb'
+ - 'spec/helpers/issuables_description_templates_helper_spec.rb'
+ - 'spec/helpers/listbox_helper_spec.rb'
+ - 'spec/helpers/users_helper_spec.rb'
+ - 'spec/lib/api/helpers/merge_requests_helpers_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/csv_builders/stream_spec.rb'
+ - 'spec/lib/expand_variables_spec.rb'
+ - 'spec/lib/gitlab/analytics/usage_trends/workers_argument_builder_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_integrations_type_new_spec.rb'
+ - 'spec/lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects_spec.rb'
+ - 'spec/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users_spec.rb'
+ - 'spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/product/parallel_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/root_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/codequality_reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/codequality_reports_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/group_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/project_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/collection/sort_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor/result_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/database/each_database_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sticking_spec.rb'
+ - 'spec/lib/gitlab/database/obsolete_ignored_columns_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/sliding_list_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/time_partition_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_spec.rb'
+ - 'spec/lib/gitlab/database/similarity_score_spec.rb'
+ - 'spec/lib/gitlab/diff/char_diff_spec.rb'
+ - 'spec/lib/gitlab/diff/file_collection_sorter_spec.rb'
+ - 'spec/lib/gitlab/elasticsearch/logs/pods_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/blob_service_spec.rb'
+ - 'spec/lib/gitlab/github_import/parallel_scheduling_spec.rb'
+ - 'spec/lib/gitlab/gitlab_import/importer_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/formatters/lograge_with_timestamp_spec.rb'
+ - 'spec/lib/gitlab/hook_data/release_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/rollout_instances_spec.rb'
+ - 'spec/lib/gitlab/middleware/handle_malformed_strings_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/iterator_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/order_spec.rb'
+ - 'spec/lib/gitlab/project_transfer_spec.rb'
+ - 'spec/lib/gitlab/prometheus_client_spec.rb'
+ - 'spec/lib/gitlab/push_options_spec.rb'
+ - 'spec/lib/gitlab/rack_attack/request_spec.rb'
+ - 'spec/lib/gitlab/search/abuse_detection_spec.rb'
+ - 'spec/lib/gitlab/search/found_blob_spec.rb'
+ - 'spec/lib/gitlab/serializer/ci/variables_spec.rb'
+ - 'spec/lib/gitlab/ssh_public_key_spec.rb'
+ - 'spec/lib/gitlab/usage_data/topology_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/webpack/manifest_spec.rb'
+ - 'spec/lib/peek/views/bullet_detailed_spec.rb'
+ - 'spec/lib/system_check/incoming_email_check_spec.rb'
+ - 'spec/migrations/add_premium_and_ultimate_plan_limits_spec.rb'
+ - 'spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb'
+ - 'spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb'
+ - 'spec/models/analytics/cycle_analytics/project_stage_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/build_trace_spec.rb'
+ - 'spec/models/ci/daily_build_group_report_result_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/unit_test_spec.rb'
+ - 'spec/models/clusters/applications/cert_manager_spec.rb'
+ - 'spec/models/clusters/applications/elastic_stack_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/commit_collection_spec.rb'
+ - 'spec/models/compare_spec.rb'
+ - 'spec/models/concerns/id_in_ordered_spec.rb'
+ - 'spec/models/concerns/noteable_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/discussion_spec.rb'
+ - 'spec/models/group_group_link_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/integration_spec.rb'
+ - 'spec/models/integrations/chat_message/issue_message_spec.rb'
+ - 'spec/models/integrations/chat_message/wiki_page_message_spec.rb'
+ - 'spec/models/label_note_spec.rb'
+ - 'spec/models/merge_request/cleanup_schedule_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/operations/feature_flags/strategy_spec.rb'
+ - 'spec/models/project_group_link_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/wiki_directory_spec.rb'
+ - 'spec/policies/concerns/crud_policy_helpers_spec.rb'
+ - 'spec/presenters/ci/build_runner_presenter_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/runners_spec.rb'
+ - 'spec/requests/api/deploy_tokens_spec.rb'
+ - 'spec/requests/api/graphql/ci/config_spec.rb'
+ - 'spec/requests/api/graphql/ci/jobs_spec.rb'
+ - 'spec/requests/api/graphql/project/cluster_agents_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/designs/designs_spec.rb'
+ - 'spec/requests/api/graphql/project/milestones_spec.rb'
+ - 'spec/requests/api/graphql/usage_trends_measurements_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/issues/put_projects_issues_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/task_completion_status_spec.rb'
+ - 'spec/requests/projects/ci/promeheus_metrics/histograms_controller_spec.rb'
+ - 'spec/requests/projects/issues_controller_spec.rb'
+ - 'spec/serializers/build_trace_entity_spec.rb'
+ - 'spec/serializers/ci/daily_build_group_report_result_serializer_spec.rb'
+ - 'spec/serializers/merge_request_poll_widget_entity_spec.rb'
+ - 'spec/services/award_emojis/copy_service_spec.rb'
+ - 'spec/services/ci/compare_test_reports_service_spec.rb'
+ - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
+ - 'spec/services/design_management/move_designs_service_spec.rb'
+ - 'spec/services/git/tag_hooks_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/create_project_service_spec.rb'
+ - 'spec/services/jira_connect/sync_service_spec.rb'
+ - 'spec/services/merge_requests/link_lfs_objects_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/repositories/changelog_service_spec.rb'
+ - 'spec/services/resource_events/synthetic_milestone_notes_builder_service_spec.rb'
+ - 'spec/services/security/merge_reports_service_spec.rb'
+ - 'spec/services/users/destroy_service_spec.rb'
+ - 'spec/simplecov_env.rb'
+ - 'spec/support/atlassian/jira_connect/schemata.rb'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/helpers/usage_data_helpers.rb'
+ - 'spec/support/matchers/background_migrations_matchers.rb'
+ - 'spec/support/matchers/exceed_query_limit.rb'
+ - 'spec/support/migrations_helpers/vulnerabilities_findings_helper.rb'
+ - 'spec/support/prometheus/additional_metrics_shared_examples.rb'
+ - 'spec/support/shared_contexts/policies/group_policy_shared_context.rb'
+ - 'spec/support/shared_examples/graphql/label_fields.rb'
+ - 'spec/support/shared_examples/lib/gitlab/middleware/multipart_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb'
+ - 'spec/views/projects/issues/_related_branches.html.haml_spec.rb'
+ - 'tooling/lib/tooling/helm3_client.rb'
diff --git a/.rubocop_todo/layout/first_hash_element_indentation.yml b/.rubocop_todo/layout/first_hash_element_indentation.yml
new file mode 100644
index 00000000000..6d6d99ab869
--- /dev/null
+++ b/.rubocop_todo/layout/first_hash_element_indentation.yml
@@ -0,0 +1,567 @@
+---
+# Cop supports --auto-correct.
+Layout/FirstHashElementIndentation:
+ # Offense count: 1995
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/system_info_controller.rb'
+ - 'app/controllers/boards/issues_controller.rb'
+ - 'app/controllers/concerns/issuable_actions.rb'
+ - 'app/controllers/concerns/milestone_actions.rb'
+ - 'app/controllers/concerns/render_service_results.rb'
+ - 'app/controllers/concerns/sourcegraph_decorator.rb'
+ - 'app/controllers/profiles/two_factor_auths_controller.rb'
+ - 'app/controllers/projects/badges_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/controllers/repositories/lfs_locks_api_controller.rb'
+ - 'app/experiments/concerns/project_commit_count.rb'
+ - 'app/graphql/mutations/clusters/agent_tokens/create.rb'
+ - 'app/graphql/mutations/notes/create/diff_note.rb'
+ - 'app/graphql/mutations/notes/create/image_diff_note.rb'
+ - 'app/graphql/mutations/notes/create/note.rb'
+ - 'app/graphql/mutations/todos/restore_many.rb'
+ - 'app/graphql/resolvers/group_packages_resolver.rb'
+ - 'app/helpers/avatars_helper.rb'
+ - 'app/helpers/breadcrumbs_helper.rb'
+ - 'app/helpers/broadcast_messages_helper.rb'
+ - 'app/helpers/commits_helper.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/environments_helper.rb'
+ - 'app/helpers/icons_helper.rb'
+ - 'app/helpers/keyset_helper.rb'
+ - 'app/helpers/listbox_helper.rb'
+ - 'app/helpers/page_layout_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/sorting_helper.rb'
+ - 'app/helpers/ssh_keys_helper.rb'
+ - 'app/helpers/tags_helper.rb'
+ - 'app/helpers/tree_helper.rb'
+ - 'app/helpers/users_helper.rb'
+ - 'app/mailers/emails/issues.rb'
+ - 'app/mailers/emails/merge_requests.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/build_metadata.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/clusters/applications/crossplane.rb'
+ - 'app/models/concerns/cross_database_modification.rb'
+ - 'app/models/concerns/featurable.rb'
+ - 'app/models/concerns/has_wiki_page_slug_attributes.rb'
+ - 'app/models/concerns/integrations/enable_ssl_verification.rb'
+ - 'app/models/concerns/subscribable.rb'
+ - 'app/models/concerns/taskable.rb'
+ - 'app/models/diff_note.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/jira_connect_installation.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/note.rb'
+ - 'app/models/operations/feature_flags/strategy.rb'
+ - 'app/models/project.rb'
+ - 'app/models/wiki.rb'
+ - 'app/presenters/ci/build_metadata_presenter.rb'
+ - 'app/presenters/packages/helm/index_presenter.rb'
+ - 'app/serializers/cluster_serializer.rb'
+ - 'app/serializers/detailed_status_entity.rb'
+ - 'app/services/award_emojis/base_service.rb'
+ - 'app/services/google_cloud/create_service_accounts_service.rb'
+ - 'app/services/members/create_service.rb'
+ - 'app/services/notification_service.rb'
+ - 'app/services/packages/composer/create_package_service.rb'
+ - 'app/services/resource_events/change_milestone_service.rb'
+ - 'app/services/spam/ham_service.rb'
+ - 'app/validators/addressable_url_validator.rb'
+ - 'app/workers/concerns/cluster_cleanup_methods.rb'
+ - 'ee/app/controllers/groups/analytics/tasks_by_type_controller.rb'
+ - 'ee/app/graphql/mutations/boards/epic_lists/destroy.rb'
+ - 'ee/app/graphql/mutations/boards/epics/create.rb'
+ - 'ee/app/graphql/mutations/iterations/cadences/update.rb'
+ - 'ee/app/graphql/mutations/iterations/create.rb'
+ - 'ee/app/graphql/mutations/iterations/update.rb'
+ - 'ee/app/graphql/mutations/projects/set_compliance_framework.rb'
+ - 'ee/app/graphql/mutations/security_policy/commit_scan_execution_policy.rb'
+ - 'ee/app/helpers/ee/ci/jobs_helper.rb'
+ - 'ee/app/helpers/ee/geo_helper.rb'
+ - 'ee/app/helpers/ee/groups/group_members_helper.rb'
+ - 'ee/app/helpers/ee/ide_helper.rb'
+ - 'ee/app/helpers/ee/projects_helper.rb'
+ - 'ee/app/helpers/ee/sidebars_helper.rb'
+ - 'ee/app/helpers/ee/tree_helper.rb'
+ - 'ee/app/helpers/incident_management/escalation_policy_helper.rb'
+ - 'ee/app/helpers/paid_feature_callout_helper.rb'
+ - 'ee/app/helpers/projects/on_demand_scans_helper.rb'
+ - 'ee/app/helpers/projects/security/dast_profiles_helper.rb'
+ - 'ee/app/mailers/ee/emails/issues.rb'
+ - 'ee/app/models/ee/list.rb'
+ - 'ee/app/serializers/ee/environment_serializer.rb'
+ - 'ee/app/services/app_sec/dast/profiles/update_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/update_service.rb'
+ - 'ee/app/services/ee/auth/container_registry_authentication_service.rb'
+ - 'ee/app/services/ee/ci/register_job_service.rb'
+ - 'ee/app/services/ee/issues/export_csv_service.rb'
+ - 'ee/app/services/elastic/cluster_reindexing_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/plan_upgrade_service.rb'
+ - 'ee/app/services/jira/requests/issues/list_service.rb'
+ - 'ee/app/services/projects/slack_application_install_service.rb'
+ - 'ee/app/services/security/token_revocation_service.rb'
+ - 'ee/app/services/timebox_report_service.rb'
+ - 'ee/app/workers/elastic_delete_project_worker.rb'
+ - 'ee/app/workers/groups/create_event_worker.rb'
+ - 'ee/lib/api/epic_links.rb'
+ - 'ee/lib/ee/container_registry/client.rb'
+ - 'ee/lib/ee/gitlab/ci/parsers.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/elastic/latest/application_class_proxy.rb'
+ - 'ee/lib/elastic/latest/issue_class_proxy.rb'
+ - 'ee/lib/gitlab/geo/project_log_helpers.rb'
+ - 'ee/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate.rb'
+ - 'ee/lib/gitlab/status_page/storage/s3_multipart_upload.rb'
+ - 'ee/spec/controllers/admin/application_settings_controller_spec.rb'
+ - 'ee/spec/controllers/boards/issues_controller_spec.rb'
+ - 'ee/spec/controllers/boards/lists_controller_spec.rb'
+ - 'ee/spec/controllers/boards/users_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/jobs_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/variables_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epic_boards_controller_spec.rb'
+ - 'ee/spec/controllers/groups/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/boards_controller_spec.rb'
+ - 'ee/spec/controllers/projects/feature_flag_issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/imports_controller_spec.rb'
+ - 'ee/spec/controllers/projects/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
+ - 'ee/spec/controllers/projects_controller_spec.rb'
+ - 'ee/spec/controllers/security/projects_controller_spec.rb'
+ - 'ee/spec/elastic/migrate/20210421140400_add_new_data_to_merge_requests_documents_spec.rb'
+ - 'ee/spec/elastic/migrate/20210623081800_add_upvotes_to_issues_spec.rb'
+ - 'ee/spec/factories/dependencies.rb'
+ - 'ee/spec/factories/licenses.rb'
+ - 'ee/spec/finders/epics_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/frontend/fixtures/on_demand_dast_scans.rb'
+ - 'ee/spec/frontend/fixtures/search.rb'
+ - 'ee/spec/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_request_response_header_type_spec.rb'
+ - 'ee/spec/helpers/billing_plans_helper_spec.rb'
+ - 'ee/spec/helpers/ee/access_tokens_helper_spec.rb'
+ - 'ee/spec/helpers/ee/labels_helper_spec.rb'
+ - 'ee/spec/helpers/ee/projects/security/dast_configuration_helper_spec.rb'
+ - 'ee/spec/helpers/ee/projects/security/sast_configuration_helper_spec.rb'
+ - 'ee/spec/helpers/groups/sso_helper_spec.rb'
+ - 'ee/spec/helpers/nav/new_dropdown_helper_spec.rb'
+ - 'ee/spec/helpers/projects/security/policies_helper_spec.rb'
+ - 'ee/spec/helpers/projects/threat_monitoring_helper_spec.rb'
+ - 'ee/spec/helpers/projects_helper_spec.rb'
+ - 'ee/spec/helpers/routing/pseudonymization_helper_spec.rb'
+ - 'ee/spec/helpers/search_helper_spec.rb'
+ - 'ee/spec/helpers/security_helper_spec.rb'
+ - 'ee/spec/helpers/trial_registrations/reassurances_helper_spec.rb'
+ - 'ee/spec/lib/container_registry/client_spec.rb'
+ - 'ee/spec/lib/ee/audit/project_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/access_levels_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/config/entry/bridge_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/parsers/security/common_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_summary_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/type_of_work/tasks_by_type_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/membership_updater_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/san_extension_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/config/entry/job_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/dast_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/coverage_fuzzing/report_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/security/finding_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/subscription_portal/clients/graphql_spec.rb'
+ - 'ee/spec/lib/gitlab/web_ide/config/entry/schemas_spec.rb'
+ - 'ee/spec/mailers/credentials_inventory_mailer_spec.rb'
+ - 'ee/spec/mailers/emails/requirements_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb'
+ - 'ee/spec/models/concerns/elastic/application_versioned_search_spec.rb'
+ - 'ee/spec/models/concerns/elastic/merge_request_spec.rb'
+ - 'ee/spec/models/concerns/elastic/milestone_spec.rb'
+ - 'ee/spec/models/concerns/elastic/snippet_spec.rb'
+ - 'ee/spec/models/security/finding_spec.rb'
+ - 'ee/spec/requests/api/analytics/project_deployment_frequency_spec.rb'
+ - 'ee/spec/requests/api/experiments_spec.rb'
+ - 'ee/spec/requests/api/graphql/app_sec/fuzzing/api/ci_configuration_type_spec.rb'
+ - 'ee/spec/requests/api/graphql/app_sec/fuzzing/coverage/corpus_type_spec.rb'
+ - 'ee/spec/requests/api/graphql/ci/minutes/usage_spec.rb'
+ - 'ee/spec/requests/api/graphql/merge_requests/approval_state_spec.rb'
+ - 'ee/spec/requests/api/graphql/milestone_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/gitlab_subscriptions/activate_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/create_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/internal/upcoming_reconciliations_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/requests/api/merge_requests_spec.rb'
+ - 'ee/spec/requests/groups/group_members_controller_spec.rb'
+ - 'ee/spec/requests/projects/issue_feature_flags_controller_spec.rb'
+ - 'ee/spec/requests/projects/mirrors_controller_spec.rb'
+ - 'ee/spec/serializers/issues/linked_issue_feature_flag_entity_spec.rb'
+ - 'ee/spec/serializers/license_entity_spec.rb'
+ - 'ee/spec/serializers/linked_feature_flag_issue_entity_spec.rb'
+ - 'ee/spec/services/alert_management/network_alert_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/data_loader_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profile_schedules/audit/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/audit/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/destroy_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scanner_profiles/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scanner_profiles/destroy_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profiles/audit/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profiles/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profiles/destroy_service_spec.rb'
+ - 'ee/spec/services/app_sec/fuzzing/api/ci_configuration_create_service_spec.rb'
+ - 'ee/spec/services/app_sec/fuzzing/coverage/corpuses/create_service_spec.rb'
+ - 'ee/spec/services/approval_rules/create_service_spec.rb'
+ - 'ee/spec/services/approval_rules/update_service_spec.rb'
+ - 'ee/spec/services/audit_event_service_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/ee/alert_management/http_integrations/create_service_spec.rb'
+ - 'ee/spec/services/ee/alert_management/http_integrations/update_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/ee/post_receive_service_spec.rb'
+ - 'ee/spec/services/geo/node_status_request_service_spec.rb'
+ - 'ee/spec/services/geo/registry_consistency_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/check_future_renewal_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/plan_upgrade_service_spec.rb'
+ - 'ee/spec/services/groups/create_service_spec.rb'
+ - 'ee/spec/services/groups/destroy_service_spec.rb'
+ - 'ee/spec/services/iterations/create_service_spec.rb'
+ - 'ee/spec/services/projects/create_service_spec.rb'
+ - 'ee/spec/services/projects/group_links/create_service_spec.rb'
+ - 'ee/spec/services/projects/group_links/destroy_service_spec.rb'
+ - 'ee/spec/services/projects/transfer_service_spec.rb'
+ - 'ee/spec/services/security/report_summary_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/security/token_revocation_service_spec.rb'
+ - 'ee/spec/services/security/track_scan_service_spec.rb'
+ - 'ee/spec/services/timebox_report_service_spec.rb'
+ - 'ee/spec/support/helpers/ee/login_helpers.rb'
+ - 'ee/spec/support/shared_contexts/fixtures/analytics_shared_context.rb'
+ - 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
+ - 'lib/api/admin/instance_clusters.rb'
+ - 'lib/api/group_clusters.rb'
+ - 'lib/api/project_clusters.rb'
+ - 'lib/atlassian/jira_connect/client.rb'
+ - 'lib/banzai/filter/commit_trailers_filter.rb'
+ - 'lib/banzai/filter/playable_link_filter.rb'
+ - 'lib/banzai/reference_parser/user_parser.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/records_fetcher.rb'
+ - 'lib/gitlab/asciidoc.rb'
+ - 'lib/gitlab/asciidoc/include_processor.rb'
+ - 'lib/gitlab/auth/otp/strategies/forti_token_cloud.rb'
+ - 'lib/gitlab/ci/config/entry/processable.rb'
+ - 'lib/gitlab/config_checker/external_database_checker.rb'
+ - 'lib/gitlab/database/query_analyzers/gitlab_schemas_metrics.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/github_import/importer/diff_note_importer.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb'
+ - 'lib/gitlab/gitlab_import/client.rb'
+ - 'lib/gitlab/graphql/query_analyzers/logger_analyzer.rb'
+ - 'lib/gitlab/graphql/query_analyzers/recursion_analyzer.rb'
+ - 'lib/gitlab/hook_data/issue_builder.rb'
+ - 'lib/gitlab/hook_data/release_builder.rb'
+ - 'lib/gitlab/kubernetes.rb'
+ - 'lib/gitlab/kubernetes/namespace.rb'
+ - 'lib/gitlab/kubernetes/rollout_instances.rb'
+ - 'lib/gitlab/legacy_github_import/client.rb'
+ - 'lib/gitlab/nav/top_nav_view_model_builder.rb'
+ - 'lib/gitlab/push_options.rb'
+ - 'lib/gitlab/quick_actions/issuable_actions.rb'
+ - 'lib/gitlab/usage_data_counters/track_unique_events.rb'
+ - 'lib/object_storage/direct_upload.rb'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'qa/qa/ee/resource/board/board_list/project/assignee_board_list.rb'
+ - 'qa/qa/ee/resource/board/board_list/project/milestone_board_list.rb'
+ - 'qa/qa/resource/snippet.rb'
+ - 'qa/qa/specs/features/api/5_package/container_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/container_registry/online_garbage_collection_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/4_verify/new_discussion_not_dropping_merge_trains_mr_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/9_enablement/elasticsearch/elasticsearch_reindexing_spec.rb'
+ - 'spec/config/object_store_settings_spec.rb'
+ - 'spec/config/smime_signature_settings_spec.rb'
+ - 'spec/controllers/admin/groups_controller_spec.rb'
+ - 'spec/controllers/application_controller_spec.rb'
+ - 'spec/controllers/boards/issues_controller_spec.rb'
+ - 'spec/controllers/boards/lists_controller_spec.rb'
+ - 'spec/controllers/concerns/import_url_params_spec.rb'
+ - 'spec/controllers/concerns/issuable_collections_spec.rb'
+ - 'spec/controllers/groups/boards_controller_spec.rb'
+ - 'spec/controllers/groups/group_members_controller_spec.rb'
+ - 'spec/controllers/groups/packages_controller_spec.rb'
+ - 'spec/controllers/groups/registry/repositories_controller_spec.rb'
+ - 'spec/controllers/import/available_namespaces_controller_spec.rb'
+ - 'spec/controllers/import/manifest_controller_spec.rb'
+ - 'spec/controllers/projects/boards_controller_spec.rb'
+ - 'spec/controllers/projects/branches_controller_spec.rb'
+ - 'spec/controllers/projects/commit_controller_spec.rb'
+ - 'spec/controllers/projects/commits_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_controller_spec.rb'
+ - 'spec/controllers/projects/grafana_api_controller_spec.rb'
+ - 'spec/controllers/projects/group_links_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/jobs_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/drafts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/milestones_controller_spec.rb'
+ - 'spec/controllers/projects/notes_controller_spec.rb'
+ - 'spec/controllers/projects/packages/packages_controller_spec.rb'
+ - 'spec/controllers/projects/pipeline_schedules_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/controllers/projects/project_members_controller_spec.rb'
+ - 'spec/controllers/projects/registry/repositories_controller_spec.rb'
+ - 'spec/controllers/projects/registry/tags_controller_spec.rb'
+ - 'spec/controllers/projects/web_ide_terminals_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/factories/ci/builds.rb'
+ - 'spec/factories/container_repositories.rb'
+ - 'spec/factories/packages/debian/file_metadatum.rb'
+ - 'spec/features/gitlab_experiments_spec.rb'
+ - 'spec/frontend/fixtures/autocomplete_sources.rb'
+ - 'spec/frontend/fixtures/blob.rb'
+ - 'spec/frontend/fixtures/runner.rb'
+ - 'spec/graphql/mutations/release_asset_links/create_spec.rb'
+ - 'spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb'
+ - 'spec/graphql/types/ci/detailed_status_type_spec.rb'
+ - 'spec/helpers/admin/deploy_key_helper_spec.rb'
+ - 'spec/helpers/analytics/cycle_analytics_helper_spec.rb'
+ - 'spec/helpers/ci/builds_helper_spec.rb'
+ - 'spec/helpers/ci/jobs_helper_spec.rb'
+ - 'spec/helpers/ci/pipeline_editor_helper_spec.rb'
+ - 'spec/helpers/ci/runners_helper_spec.rb'
+ - 'spec/helpers/deploy_tokens_helper_spec.rb'
+ - 'spec/helpers/groups/settings_helper_spec.rb'
+ - 'spec/helpers/issuables_helper_spec.rb'
+ - 'spec/helpers/namespaces_helper_spec.rb'
+ - 'spec/helpers/page_layout_helper_spec.rb'
+ - 'spec/helpers/projects/cluster_agents_helper_spec.rb'
+ - 'spec/helpers/releases_helper_spec.rb'
+ - 'spec/helpers/routing/pseudonymization_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/helpers/sorting_helper_spec.rb'
+ - 'spec/helpers/storage_helper_spec.rb'
+ - 'spec/initializers/direct_upload_support_spec.rb'
+ - 'spec/lib/api/entities/bulk_imports/export_status_spec.rb'
+ - 'spec/lib/api/entities/design_management/design_spec.rb'
+ - 'spec/lib/api/entities/merge_request_approvals_spec.rb'
+ - 'spec/lib/api/entities/personal_access_token_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/client_spec.rb'
+ - 'spec/lib/backup/database_spec.rb'
+ - 'spec/lib/banzai/filter/audio_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/repository_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/video_link_filter_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/milestones_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/pipelines/project_entities_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/container_expiration_policy_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/project_feature_pipeline_spec.rb'
+ - 'spec/lib/container_registry/client_spec.rb'
+ - 'spec/lib/feature/definition_spec.rb'
+ - 'spec/lib/gitlab/alert_management/payload/base_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/records_fetcher_spec.rb'
+ - 'spec/lib/gitlab/api_authentication/builder_spec.rb'
+ - 'spec/lib/gitlab/asciidoc_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/config_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/request_authenticator_spec.rb'
+ - 'spec/lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata_spec.rb'
+ - 'spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb'
+ - 'spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_import/importer_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_server_import/importer_spec.rb'
+ - 'spec/lib/gitlab/changes_list_spec.rb'
+ - 'spec/lib/gitlab/checks/changes_access_spec.rb'
+ - 'spec/lib/gitlab/ci/build/cache_spec.rb'
+ - 'spec/lib/gitlab/ci/build/step_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/bridge_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/product/variables_spec.rb'
+ - 'spec/lib/gitlab/ci/config/yaml/tags/resolver_spec.rb'
+ - 'spec/lib/gitlab/ci/config_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/codequality/code_climate_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/populate_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/coverage_reports_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/identifier_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/scanner_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/terraform_reports_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/config_checker/external_database_checker_spec.rb'
+ - 'spec/lib/gitlab/config_checker/puma_rugged_checker_spec.rb'
+ - 'spec/lib/gitlab/data_builder/build_spec.rb'
+ - 'spec/lib/gitlab/data_builder/pipeline_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/setup_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/database_spec.rb'
+ - 'spec/lib/gitlab/diff/position_spec.rb'
+ - 'spec/lib/gitlab/experimentation/controller_concern_spec.rb'
+ - 'spec/lib/gitlab/experimentation_spec.rb'
+ - 'spec/lib/gitlab/git/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/git/hook_env_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/operation_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/logger_spec.rb'
+ - 'spec/lib/gitlab/github_import/object_counter_spec.rb'
+ - 'spec/lib/gitlab/gpg_spec.rb'
+ - 'spec/lib/gitlab/graphql/query_analyzers/logger_analyzer_spec.rb'
+ - 'spec/lib/gitlab/graphql/tracers/logger_tracer_spec.rb'
+ - 'spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb'
+ - 'spec/lib/gitlab/hook_data/issuable_builder_spec.rb'
+ - 'spec/lib/gitlab/http_spec.rb'
+ - 'spec/lib/gitlab/i18n_spec.rb'
+ - 'spec/lib/gitlab/import/logger_spec.rb'
+ - 'spec/lib/gitlab/import_export/attributes_finder_spec.rb'
+ - 'spec/lib/gitlab/import_export/members_mapper_spec.rb'
+ - 'spec/lib/gitlab/instrumentation_helper_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kubeconfig/template_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/rollout_instances_spec.rb'
+ - 'spec/lib/gitlab/legacy_github_import/label_formatter_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/action_cable_spec.rb'
+ - 'spec/lib/gitlab/middleware/multipart/handler_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/conduit/user_spec.rb'
+ - 'spec/lib/gitlab/prometheus_client_spec.rb'
+ - 'spec/lib/gitlab/push_options_spec.rb'
+ - 'spec/lib/gitlab/submodule_links_spec.rb'
+ - 'spec/lib/gitlab/usage_data/topology_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/web_ide/config/entry/global_spec.rb'
+ - 'spec/lib/mattermost/team_spec.rb'
+ - 'spec/lib/microsoft_teams/activity_spec.rb'
+ - 'spec/lib/peek/views/memory_spec.rb'
+ - 'spec/mailers/emails/merge_requests_spec.rb'
+ - 'spec/models/active_session_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci_platform_metric_spec.rb'
+ - 'spec/models/clusters/applications/prometheus_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/gpg_key_spec.rb'
+ - 'spec/models/integrations/base_chat_notification_spec.rb'
+ - 'spec/models/integrations/chat_message/deployment_message_spec.rb'
+ - 'spec/models/integrations/chat_message/issue_message_spec.rb'
+ - 'spec/models/integrations/chat_message/merge_message_spec.rb'
+ - 'spec/models/integrations/chat_message/note_message_spec.rb'
+ - 'spec/models/integrations/chat_message/pipeline_message_spec.rb'
+ - 'spec/models/integrations/chat_message/push_message_spec.rb'
+ - 'spec/models/integrations/chat_message/wiki_page_message_spec.rb'
+ - 'spec/models/integrations/packagist_spec.rb'
+ - 'spec/models/integrations/prometheus_spec.rb'
+ - 'spec/models/loose_foreign_keys/modification_tracker_spec.rb'
+ - 'spec/models/merge_request_diff_commit_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/requests/api/ci/runner/runners_post_spec.rb'
+ - 'spec/requests/api/commit_statuses_spec.rb'
+ - 'spec/requests/api/feature_flags_spec.rb'
+ - 'spec/requests/api/feature_flags_user_lists_spec.rb'
+ - 'spec/requests/api/graphql/ci/config_spec.rb'
+ - 'spec/requests/api/graphql/group/milestones_spec.rb'
+ - 'spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb'
+ - 'spec/requests/api/graphql/project/cluster_agents_spec.rb'
+ - 'spec/requests/api/graphql/project/release_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/state_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/states_spec.rb'
+ - 'spec/requests/api/graphql/project_query_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/project_import_spec.rb'
+ - 'spec/requests/api/project_snapshots_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/repositories_spec.rb'
+ - 'spec/requests/api/settings_spec.rb'
+ - 'spec/requests/api/task_completion_status_spec.rb'
+ - 'spec/requests/api/unleash_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/groups/email_campaigns_controller_spec.rb'
+ - 'spec/requests/jira_authorizations_spec.rb'
+ - 'spec/requests/jira_connect/installations_controller_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/serializers/blob_entity_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
+ - 'spec/services/ci/play_manual_stage_service_spec.rb'
+ - 'spec/services/clusters/agents/create_service_spec.rb'
+ - 'spec/services/clusters/applications/check_ingress_ip_address_service_spec.rb'
+ - 'spec/services/clusters/aws/authorize_role_service_spec.rb'
+ - 'spec/services/clusters/update_service_spec.rb'
+ - 'spec/services/commits/tag_service_spec.rb'
+ - 'spec/services/git/branch_push_service_spec.rb'
+ - 'spec/services/import/github_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_spec.rb'
+ - 'spec/services/merge_requests/create_service_spec.rb'
+ - 'spec/services/merge_requests/get_urls_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/metrics/dashboard/transient_embed_service_spec.rb'
+ - 'spec/services/notes/render_service_spec.rb'
+ - 'spec/services/packages/debian/parse_debian822_service_spec.rb'
+ - 'spec/services/pod_logs/base_service_spec.rb'
+ - 'spec/services/pod_logs/elasticsearch_service_spec.rb'
+ - 'spec/services/pod_logs/kubernetes_service_spec.rb'
+ - 'spec/services/projects/container_repository/delete_tags_service_spec.rb'
+ - 'spec/services/projects/create_from_template_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
+ - 'spec/services/projects/operations/update_service_spec.rb'
+ - 'spec/services/projects/update_service_spec.rb'
+ - 'spec/services/snippets/count_service_spec.rb'
+ - 'spec/sidekiq_cluster/sidekiq_cluster_spec.rb'
+ - 'spec/support/atlassian/jira_connect/schemata.rb'
+ - 'spec/support/helpers/kubernetes_helpers.rb'
+ - 'spec/support/helpers/login_helpers.rb'
+ - 'spec/support/helpers/prometheus_helpers.rb'
+ - 'spec/support/helpers/stub_object_storage.rb'
+ - 'spec/support/helpers/wiki_helpers.rb'
+ - 'spec/support/migrations_helpers/namespaces_helper.rb'
+ - 'spec/support/migrations_helpers/vulnerabilities_findings_helper.rb'
+ - 'spec/support/shared_contexts/fixtures/analytics_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/container_registry/client_shared_context.rb'
+ - 'spec/support/shared_examples/graphql/spam_protection_shared_examples.rb'
+ - 'spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb'
+ - 'spec/support/shared_examples/models/clusters/prometheus_client_shared.rb'
+ - 'spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb'
+ - 'spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/rack_attack_shared_examples.rb'
+ - 'spec/support_specs/graphql/arguments_spec.rb'
+ - 'spec/support_specs/graphql/field_selection_spec.rb'
+ - 'spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tooling/danger/datateam_spec.rb'
+ - 'spec/tooling/lib/tooling/kubernetes_client_spec.rb'
+ - 'spec/workers/concerns/gitlab/github_import/object_importer_spec.rb'
diff --git a/.rubocop_todo/layout/hash_alignment.yml b/.rubocop_todo/layout/hash_alignment.yml
new file mode 100644
index 00000000000..afcaab17ae1
--- /dev/null
+++ b/.rubocop_todo/layout/hash_alignment.yml
@@ -0,0 +1,732 @@
+---
+# Cop supports --auto-correct.
+Layout/HashAlignment:
+ # Offense count: 3804
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/ci/variables_controller.rb'
+ - 'app/controllers/admin/system_info_controller.rb'
+ - 'app/controllers/oauth/token_info_controller.rb'
+ - 'app/controllers/projects/feature_flags_controller.rb'
+ - 'app/controllers/repositories/git_http_client_controller.rb'
+ - 'app/controllers/repositories/lfs_api_controller.rb'
+ - 'app/controllers/repositories/lfs_locks_api_controller.rb'
+ - 'app/controllers/uploads_controller.rb'
+ - 'app/graphql/mutations/award_emojis/toggle.rb'
+ - 'app/graphql/mutations/ci/runner/update.rb'
+ - 'app/graphql/mutations/design_management/move.rb'
+ - 'app/graphql/mutations/issues/set_severity.rb'
+ - 'app/graphql/mutations/security/ci_configuration/base_security_analyzer.rb'
+ - 'app/graphql/resolvers/ci/template_resolver.rb'
+ - 'app/graphql/resolvers/projects_resolver.rb'
+ - 'app/graphql/resolvers/users_resolver.rb'
+ - 'app/graphql/types/access_level_type.rb'
+ - 'app/graphql/types/admin/analytics/usage_trends/measurement_type.rb'
+ - 'app/graphql/types/board_list_type.rb'
+ - 'app/graphql/types/board_type.rb'
+ - 'app/graphql/types/ci/analytics_type.rb'
+ - 'app/graphql/types/ci/application_setting_type.rb'
+ - 'app/graphql/types/ci/build_need_type.rb'
+ - 'app/graphql/types/ci/ci_cd_setting_type.rb'
+ - 'app/graphql/types/ci/config/config_type.rb'
+ - 'app/graphql/types/ci/config/group_type.rb'
+ - 'app/graphql/types/ci/config/job_restriction_type.rb'
+ - 'app/graphql/types/ci/config/job_type.rb'
+ - 'app/graphql/types/ci/config/need_type.rb'
+ - 'app/graphql/types/ci/config/stage_type.rb'
+ - 'app/graphql/types/ci/detailed_status_type.rb'
+ - 'app/graphql/types/ci/group_type.rb'
+ - 'app/graphql/types/ci/job_artifact_type.rb'
+ - 'app/graphql/types/ci/job_token_scope_type.rb'
+ - 'app/graphql/types/ci/job_type.rb'
+ - 'app/graphql/types/ci/pipeline_message_type.rb'
+ - 'app/graphql/types/ci/pipeline_type.rb'
+ - 'app/graphql/types/ci/recent_failures_type.rb'
+ - 'app/graphql/types/ci/runner_architecture_type.rb'
+ - 'app/graphql/types/ci/runner_platform_type.rb'
+ - 'app/graphql/types/ci/runner_setup_type.rb'
+ - 'app/graphql/types/ci/runner_type.rb'
+ - 'app/graphql/types/ci/runner_web_url_edge.rb'
+ - 'app/graphql/types/ci/stage_type.rb'
+ - 'app/graphql/types/ci/status_action_type.rb'
+ - 'app/graphql/types/ci/template_type.rb'
+ - 'app/graphql/types/ci/test_case_type.rb'
+ - 'app/graphql/types/ci/test_report_summary_type.rb'
+ - 'app/graphql/types/ci/test_report_total_type.rb'
+ - 'app/graphql/types/ci/test_suite_summary_type.rb'
+ - 'app/graphql/types/ci/test_suite_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/analyzers_entity_input_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/analyzers_entity_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/entity_input_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/entity_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/options_entity_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/type.rb'
+ - 'app/graphql/types/commit_action_type.rb'
+ - 'app/graphql/types/commit_type.rb'
+ - 'app/graphql/types/countable_connection_type.rb'
+ - 'app/graphql/types/design_management/design_collection_type.rb'
+ - 'app/graphql/types/design_management/design_fields.rb'
+ - 'app/graphql/types/design_management/version_type.rb'
+ - 'app/graphql/types/diff_paths_input_type.rb'
+ - 'app/graphql/types/diff_refs_type.rb'
+ - 'app/graphql/types/diff_stats_summary_type.rb'
+ - 'app/graphql/types/diff_stats_type.rb'
+ - 'app/graphql/types/environment_type.rb'
+ - 'app/graphql/types/evidence_type.rb'
+ - 'app/graphql/types/grafana_integration_type.rb'
+ - 'app/graphql/types/group_invitation_type.rb'
+ - 'app/graphql/types/group_member_type.rb'
+ - 'app/graphql/types/group_type.rb'
+ - 'app/graphql/types/invitation_interface.rb'
+ - 'app/graphql/types/issue_type.rb'
+ - 'app/graphql/types/jira_import_type.rb'
+ - 'app/graphql/types/jira_user_type.rb'
+ - 'app/graphql/types/label_type.rb'
+ - 'app/graphql/types/member_interface.rb'
+ - 'app/graphql/types/merge_request_connection_type.rb'
+ - 'app/graphql/types/merge_request_type.rb'
+ - 'app/graphql/types/metadata/kas_type.rb'
+ - 'app/graphql/types/metadata_type.rb'
+ - 'app/graphql/types/metrics/dashboard_type.rb'
+ - 'app/graphql/types/metrics/dashboards/annotation_type.rb'
+ - 'app/graphql/types/milestone_stats_type.rb'
+ - 'app/graphql/types/milestone_type.rb'
+ - 'app/graphql/types/namespace_type.rb'
+ - 'app/graphql/types/notes/diff_image_position_input_type.rb'
+ - 'app/graphql/types/notes/diff_position_base_input_type.rb'
+ - 'app/graphql/types/notes/diff_position_input_type.rb'
+ - 'app/graphql/types/notes/diff_position_type.rb'
+ - 'app/graphql/types/notes/discussion_type.rb'
+ - 'app/graphql/types/notes/note_type.rb'
+ - 'app/graphql/types/packages/package_details_type.rb'
+ - 'app/graphql/types/packages/package_file_type.rb'
+ - 'app/graphql/types/packages/package_type.rb'
+ - 'app/graphql/types/project_invitation_type.rb'
+ - 'app/graphql/types/project_member_type.rb'
+ - 'app/graphql/types/project_statistics_type.rb'
+ - 'app/graphql/types/project_type.rb'
+ - 'app/graphql/types/projects/service_type.rb'
+ - 'app/graphql/types/projects/services/jira_project_type.rb'
+ - 'app/graphql/types/projects/topic_type.rb'
+ - 'app/graphql/types/prometheus_alert_type.rb'
+ - 'app/graphql/types/release_asset_link_type.rb'
+ - 'app/graphql/types/release_assets_type.rb'
+ - 'app/graphql/types/release_links_type.rb'
+ - 'app/graphql/types/release_source_type.rb'
+ - 'app/graphql/types/release_type.rb'
+ - 'app/graphql/types/repository/blob_type.rb'
+ - 'app/graphql/types/repository_type.rb'
+ - 'app/graphql/types/resolvable_interface.rb'
+ - 'app/graphql/types/snippet_type.rb'
+ - 'app/graphql/types/snippets/blob_connection_type.rb'
+ - 'app/graphql/types/snippets/blob_type.rb'
+ - 'app/graphql/types/subscription_type.rb'
+ - 'app/graphql/types/task_completion_status.rb'
+ - 'app/graphql/types/tree/blob_type.rb'
+ - 'app/graphql/types/tree/entry_type.rb'
+ - 'app/graphql/types/tree/submodule_type.rb'
+ - 'app/graphql/types/tree/tree_entry_type.rb'
+ - 'app/graphql/types/tree/tree_type.rb'
+ - 'app/graphql/types/user_callout_type.rb'
+ - 'app/graphql/types/user_interface.rb'
+ - 'app/graphql/types/user_status_type.rb'
+ - 'app/graphql/types/work_item_type.rb'
+ - 'app/graphql/types/work_items/type_type.rb'
+ - 'app/helpers/avatars_helper.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/commits_helper.rb'
+ - 'app/helpers/environments_helper.rb'
+ - 'app/helpers/events_helper.rb'
+ - 'app/helpers/markup_helper.rb'
+ - 'app/helpers/preferences_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/sorting_helper.rb'
+ - 'app/helpers/todos_helper.rb'
+ - 'app/helpers/wiki_helper.rb'
+ - 'app/mailers/abuse_report_mailer.rb'
+ - 'app/mailers/emails/projects.rb'
+ - 'app/models/bulk_imports/configuration.rb'
+ - 'app/models/ci/bridge.rb'
+ - 'app/models/ci/build_trace_metadata.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/compare.rb'
+ - 'app/models/concerns/ci/has_status.rb'
+ - 'app/models/concerns/enums/data_visualization_palette.rb'
+ - 'app/models/concerns/featurable.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/triggerable_hooks.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/design_management/design.rb'
+ - 'app/models/design_management/design_action.rb'
+ - 'app/models/event.rb'
+ - 'app/models/grafana_integration.rb'
+ - 'app/models/group.rb'
+ - 'app/models/hooks/web_hook.rb'
+ - 'app/models/integrations/emails_on_push.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/issuable_severity.rb'
+ - 'app/models/jira_connect_installation.rb'
+ - 'app/models/loose_foreign_keys/deleted_record.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/project.rb'
+ - 'app/models/prometheus_alert.rb'
+ - 'app/models/serverless/domain_cluster.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/terraform/state.rb'
+ - 'app/models/user.rb'
+ - 'app/models/user_status.rb'
+ - 'app/models/wiki.rb'
+ - 'app/models/work_items/type.rb'
+ - 'app/presenters/analytics/cycle_analytics/stage_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/serializers/rollout_status_entity.rb'
+ - 'app/services/chat_names/authorize_user_service.rb'
+ - 'app/services/ci/archive_trace_service.rb'
+ - 'app/services/ci/job_artifacts/destroy_batch_service.rb'
+ - 'app/services/ci/list_config_variables_service.rb'
+ - 'app/services/ci/parse_dotenv_artifact_service.rb'
+ - 'app/services/ci/stuck_builds/drop_helpers.rb'
+ - 'app/services/groups/import_export/import_service.rb'
+ - 'app/services/issuable/import_csv/base_service.rb'
+ - 'app/services/issues/export_csv_service.rb'
+ - 'app/services/jira/requests/base.rb'
+ - 'app/services/merge_requests/mergeability_check_service.rb'
+ - 'app/services/merge_requests/push_options_handler_service.rb'
+ - 'app/services/merge_requests/toggle_attention_requested_service.rb'
+ - 'app/services/packages/conan/create_package_file_service.rb'
+ - 'app/services/packages/create_package_file_service.rb'
+ - 'app/services/packages/debian/create_package_file_service.rb'
+ - 'app/services/packages/npm/create_package_service.rb'
+ - 'app/services/projects/fork_service.rb'
+ - 'app/services/projects/lfs_pointers/lfs_download_service.rb'
+ - 'app/services/projects/update_remote_mirror_service.rb'
+ - 'app/uploaders/file_uploader.rb'
+ - 'app/workers/emails_on_push_worker.rb'
+ - 'app/workers/x509_issuer_crl_check_worker.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'config/initializers/default_url_options.rb'
+ - 'config/initializers/rest-client-hostname_override.rb'
+ - 'config/routes/profile.rb'
+ - 'config/routes/project.rb'
+ - 'config/routes/unmatched_project.rb'
+ - 'config/routes/uploads.rb'
+ - 'db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb'
+ - 'db/migrate/20210804150320_create_base_work_item_types.rb'
+ - 'db/migrate/20210831203408_upsert_base_work_item_types.rb'
+ - 'db/migrate/20210901065504_add_index_on_name_and_id_to_public_groups.rb'
+ - 'db/post_migrate/20210311120156_backfill_push_event_payload_event_id_for_bigint_conversion.rb'
+ - 'db/post_migrate/20210622045705_finalize_events_bigint_conversion.rb'
+ - 'db/post_migrate/20210701141346_finalize_ci_builds_stage_id_bigint_conversion.rb'
+ - 'db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb'
+ - 'db/post_migrate/20210708011426_finalize_ci_builds_metadata_bigint_conversion.rb'
+ - 'db/post_migrate/20210802043253_finalize_push_event_payloads_bigint_conversion_3.rb'
+ - 'db/post_migrate/20210804151444_prepare_indexes_for_ci_job_artifact_bigint_conversion.rb'
+ - 'db/post_migrate/20210804153307_prepare_indexes_for_tagging_bigint_conversion.rb'
+ - 'db/post_migrate/20210804154407_prepare_indexes_for_ci_stage_bigint_conversion.rb'
+ - 'db/post_migrate/20210817024335_prepare_indexes_for_events_bigint_conversion.rb'
+ - 'db/post_migrate/20210824174615_prepare_ci_builds_metadata_and_ci_build_async_indexes.rb'
+ - 'ee/app/controllers/ee/search_controller.rb'
+ - 'ee/app/controllers/projects/integrations/zentao/issues_controller.rb'
+ - 'ee/app/graphql/ee/types/board_list_type.rb'
+ - 'ee/app/graphql/ee/types/board_type.rb'
+ - 'ee/app/graphql/ee/types/ci/runner_type.rb'
+ - 'ee/app/graphql/ee/types/group_type.rb'
+ - 'ee/app/graphql/ee/types/issue_type.rb'
+ - 'ee/app/graphql/ee/types/merge_request_type.rb'
+ - 'ee/app/graphql/ee/types/project_type.rb'
+ - 'ee/app/graphql/ee/types/repository/blob_type.rb'
+ - 'ee/app/graphql/mutations/iterations/cadences/create.rb'
+ - 'ee/app/graphql/mutations/iterations/cadences/destroy.rb'
+ - 'ee/app/graphql/mutations/iterations/cadences/update.rb'
+ - 'ee/app/graphql/mutations/iterations/delete.rb'
+ - 'ee/app/graphql/mutations/projects/set_locked.rb'
+ - 'ee/app/graphql/resolvers/iterations/cadences_resolver.rb'
+ - 'ee/app/graphql/resolvers/vulnerabilities_count_per_day_resolver.rb'
+ - 'ee/app/graphql/types/admin/cloud_licenses/current_license_type.rb'
+ - 'ee/app/graphql/types/admin/cloud_licenses/license_type.rb'
+ - 'ee/app/graphql/types/admin/cloud_licenses/subscription_future_entry_type.rb'
+ - 'ee/app/graphql/types/analytics/devops_adoption/enabled_namespace_type.rb'
+ - 'ee/app/graphql/types/analytics/devops_adoption/snapshot_type.rb'
+ - 'ee/app/graphql/types/app_sec/fuzzing/api/ci_configuration_type.rb'
+ - 'ee/app/graphql/types/app_sec/fuzzing/api/scan_profile_type.rb'
+ - 'ee/app/graphql/types/app_sec/fuzzing/coverage/corpus_type.rb'
+ - 'ee/app/graphql/types/boards/board_epic_type.rb'
+ - 'ee/app/graphql/types/boards/epic_board_type.rb'
+ - 'ee/app/graphql/types/boards/epic_list_metadata_type.rb'
+ - 'ee/app/graphql/types/boards/epic_list_type.rb'
+ - 'ee/app/graphql/types/boards/epic_user_preferences_type.rb'
+ - 'ee/app/graphql/types/burnup_chart_daily_totals_type.rb'
+ - 'ee/app/graphql/types/ci/code_coverage_activity_type.rb'
+ - 'ee/app/graphql/types/ci/code_coverage_summary_type.rb'
+ - 'ee/app/graphql/types/ci/code_quality_degradation_type.rb'
+ - 'ee/app/graphql/types/ci/minutes/namespace_monthly_usage_type.rb'
+ - 'ee/app/graphql/types/ci/minutes/project_monthly_usage_type.rb'
+ - 'ee/app/graphql/types/compliance_management/merge_requests/compliance_violation_type.rb'
+ - 'ee/app/graphql/types/dast/profile_branch_type.rb'
+ - 'ee/app/graphql/types/dast/profile_schedule_type.rb'
+ - 'ee/app/graphql/types/dast/profile_type.rb'
+ - 'ee/app/graphql/types/dast_scanner_profile_type.rb'
+ - 'ee/app/graphql/types/dast_site_profile_type.rb'
+ - 'ee/app/graphql/types/dast_site_validation_type.rb'
+ - 'ee/app/graphql/types/dora_metric_type.rb'
+ - 'ee/app/graphql/types/dora_type.rb'
+ - 'ee/app/graphql/types/epic_descendant_weight_sum_type.rb'
+ - 'ee/app/graphql/types/epic_issue_type.rb'
+ - 'ee/app/graphql/types/epic_type.rb'
+ - 'ee/app/graphql/types/external_issue_type.rb'
+ - 'ee/app/graphql/types/group_release_stats_type.rb'
+ - 'ee/app/graphql/types/instance_security_dashboard_type.rb'
+ - 'ee/app/graphql/types/iteration_type.rb'
+ - 'ee/app/graphql/types/iterations/cadence_type.rb'
+ - 'ee/app/graphql/types/merge_requests/approval_state_type.rb'
+ - 'ee/app/graphql/types/metric_image_type.rb'
+ - 'ee/app/graphql/types/path_lock_type.rb'
+ - 'ee/app/graphql/types/requirements_management/requirement_type.rb'
+ - 'ee/app/graphql/types/requirements_management/test_report_type.rb'
+ - 'ee/app/graphql/types/security/training_type.rb'
+ - 'ee/app/graphql/types/security/training_url_type.rb'
+ - 'ee/app/graphql/types/security_report_summary_type.rb'
+ - 'ee/app/graphql/types/security_scanners.rb'
+ - 'ee/app/graphql/types/time_report_stats_type.rb'
+ - 'ee/app/graphql/types/timebox_metrics_type.rb'
+ - 'ee/app/graphql/types/timebox_report_interface.rb'
+ - 'ee/app/graphql/types/timebox_report_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities/asset_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities/link_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities_count_by_day_type.rb'
+ - 'ee/app/graphql/types/vulnerability/external_issue_link_type.rb'
+ - 'ee/app/graphql/types/vulnerability/issue_link_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/base_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/boolean_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/code_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/commit_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/diff_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/file_location_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/int_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/list_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/markdown_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/module_location_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/table_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/text_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/url_type.rb'
+ - 'ee/app/graphql/types/vulnerability_evidence_source_type.rb'
+ - 'ee/app/graphql/types/vulnerability_evidence_supporting_message_type.rb'
+ - 'ee/app/graphql/types/vulnerability_evidence_type.rb'
+ - 'ee/app/graphql/types/vulnerability_identifier_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/cluster_image_scanning_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/container_scanning_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/coverage_fuzzing_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/dast_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/dependency_scanning_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/generic_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/sast_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/secret_detection_type.rb'
+ - 'ee/app/graphql/types/vulnerability_request_response_header_type.rb'
+ - 'ee/app/graphql/types/vulnerability_request_type.rb'
+ - 'ee/app/graphql/types/vulnerability_response_type.rb'
+ - 'ee/app/graphql/types/vulnerability_scanner_type.rb'
+ - 'ee/app/graphql/types/vulnerability_severities_count_type.rb'
+ - 'ee/app/graphql/types/vulnerability_type.rb'
+ - 'ee/app/graphql/types/vulnerable_dependency_type.rb'
+ - 'ee/app/graphql/types/vulnerable_kubernetes_resource_type.rb'
+ - 'ee/app/graphql/types/vulnerable_package_type.rb'
+ - 'ee/app/graphql/types/vulnerable_projects_by_grade_type.rb'
+ - 'ee/app/helpers/ee/feature_flags_helper.rb'
+ - 'ee/app/helpers/ee/sorting_helper.rb'
+ - 'ee/app/models/allowed_email_domain.rb'
+ - 'ee/app/models/ci/minutes/quota.rb'
+ - 'ee/app/models/ee/application_setting.rb'
+ - 'ee/app/models/elastic/reindexing_task.rb'
+ - 'ee/app/models/gitlab_subscriptions/features.rb'
+ - 'ee/app/models/gitlab_subscriptions/upcoming_reconciliation.rb'
+ - 'ee/app/models/historical_data.rb'
+ - 'ee/app/models/incident_management/escalation_rule.rb'
+ - 'ee/app/models/incident_management/oncall_rotation.rb'
+ - 'ee/app/models/scim_identity.rb'
+ - 'ee/app/models/status_page/project_setting.rb'
+ - 'ee/app/serializers/ee/evidences/release_entity.rb'
+ - 'ee/app/services/audit_events/repository_push_audit_event_service.rb'
+ - 'ee/app/services/ci/external_pull_requests/process_github_event_service.rb'
+ - 'ee/app/services/ci_cd/setup_project.rb'
+ - 'ee/app/services/ee/issues/base_service.rb'
+ - 'ee/app/services/elastic/cluster_reindexing_service.rb'
+ - 'ee/app/services/elastic/process_bookkeeping_service.rb'
+ - 'ee/app/services/epics/issue_promote_service.rb'
+ - 'ee/app/services/external_status_checks/create_service.rb'
+ - 'ee/app/services/groups/memberships/export_service.rb'
+ - 'ee/app/services/namespaces/check_excess_storage_size_service.rb'
+ - 'ee/app/services/projects/setup_ci_cd.rb'
+ - 'ee/app/services/security/security_orchestration_policies/on_demand_scan_pipeline_configuration_service.rb'
+ - 'ee/config/routes/project.rb'
+ - 'ee/config/routes/uploads.rb'
+ - 'ee/lib/api/iterations.rb'
+ - 'ee/lib/api/merge_trains.rb'
+ - 'ee/lib/api/vulnerability_exports.rb'
+ - 'ee/lib/api/vulnerability_findings.rb'
+ - 'ee/lib/ee/api/helpers/issues_helpers.rb'
+ - 'ee/lib/ee/api/helpers/protected_branches_helpers.rb'
+ - 'ee/lib/ee/api/merge_requests.rb'
+ - 'ee/lib/ee/audit/project_changes_auditor.rb'
+ - 'ee/lib/ee/banzai/filter/references/epic_reference_filter.rb'
+ - 'ee/lib/ee/banzai/filter/references/vulnerability_reference_filter.rb'
+ - 'ee/lib/ee/gitlab/ci/pipeline/chain/validate/after_config.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/issue_actions.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/elastic/latest/config.rb'
+ - 'ee/lib/elastic/latest/merge_request_config.rb'
+ - 'ee/lib/gem_extensions/elasticsearch/model/indexing/instance_methods.rb'
+ - 'ee/lib/gitlab/auth/smartcard/certificate.rb'
+ - 'ee/lib/gitlab/auth/smartcard/ldap_certificate.rb'
+ - 'ee/lib/gitlab/ci/parsers/security/formatters/dependency_list.rb'
+ - 'ee/lib/gitlab/elastic/helper.rb'
+ - 'ee/lib/gitlab/elastic/indexer.rb'
+ - 'ee/lib/gitlab/geo/replication/base_transfer.rb'
+ - 'ee/lib/gitlab/prometheus/queries/packet_flow_query.rb'
+ - 'ee/spec/controllers/ee/projects/variables_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epic_boards_controller_spec.rb'
+ - 'ee/spec/controllers/groups/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/network_policies_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/operations_controller_spec.rb'
+ - 'ee/spec/controllers/trials_controller_spec.rb'
+ - 'ee/spec/factories/dependencies.rb'
+ - 'ee/spec/features/billings/billing_plans_spec.rb'
+ - 'ee/spec/features/projects/environments/environments_spec.rb'
+ - 'ee/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb'
+ - 'ee/spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb'
+ - 'ee/spec/finders/epics_finder_spec.rb'
+ - 'ee/spec/finders/merge_requests_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/graphql/ee/mutations/ci/runner/update_spec.rb'
+ - 'ee/spec/helpers/billing_plans_helper_spec.rb'
+ - 'ee/spec/helpers/routing/pseudonymization_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/access_levels_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/config_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/fix_incorrect_max_seats_used_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/config/entry/need_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/matching/runner_matcher_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/certificate_spec.rb'
+ - 'ee/spec/lib/gitlab/custom_file_templates_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/client_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/template/custom_templates_spec.rb'
+ - 'ee/spec/models/application_setting_spec.rb'
+ - 'ee/spec/models/approval_merge_request_rule_spec.rb'
+ - 'ee/spec/models/member_spec.rb'
+ - 'ee/spec/models/vulnerabilities/statistic_spec.rb'
+ - 'ee/spec/requests/api/graphql/app_sec/fuzzing/coverage/corpus_type_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epics_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/issues_spec.rb'
+ - 'ee/spec/requests/api/templates_spec.rb'
+ - 'ee/spec/requests/ee/projects/service_desk_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_site_profiles_controller_spec.rb'
+ - 'ee/spec/requests/rack_attack_global_spec.rb'
+ - 'ee/spec/serializers/integrations/zentao_serializers/issue_entity_spec.rb'
+ - 'ee/spec/services/alert_management/network_alert_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/create_associations_service_spec.rb'
+ - 'ee/spec/services/audit_events/protected_branch_audit_event_service_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/cross_needs_artifacts_spec.rb'
+ - 'ee/spec/services/ci/process_pipeline_service_spec.rb'
+ - 'ee/spec/services/ci/retry_pipeline_service_spec.rb'
+ - 'ee/spec/services/ci/subscribe_bridge_service_spec.rb'
+ - 'ee/spec/services/merge_trains/check_status_service_spec.rb'
+ - 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb'
+ - 'ee/spec/services/merge_trains/refresh_service_spec.rb'
+ - 'ee/spec/services/status_page/trigger_publish_service_spec.rb'
+ - 'ee/spec/services/status_page/unpublish_details_service_spec.rb'
+ - 'ee/spec/support/shared_examples/status_page/publish_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/status_page/reference_links_examples.rb'
+ - 'ee/spec/workers/scan_security_report_secrets_worker_spec.rb'
+ - 'lib/api/applications.rb'
+ - 'lib/api/broadcast_messages.rb'
+ - 'lib/api/bulk_imports.rb'
+ - 'lib/api/ci/job_artifacts.rb'
+ - 'lib/api/ci/jobs.rb'
+ - 'lib/api/ci/pipelines.rb'
+ - 'lib/api/ci/runner.rb'
+ - 'lib/api/ci/runners.rb'
+ - 'lib/api/concerns/packages/debian_distribution_endpoints.rb'
+ - 'lib/api/debian_project_packages.rb'
+ - 'lib/api/deploy_tokens.rb'
+ - 'lib/api/entities/project.rb'
+ - 'lib/api/feature_flags.rb'
+ - 'lib/api/group_labels.rb'
+ - 'lib/api/group_packages.rb'
+ - 'lib/api/groups.rb'
+ - 'lib/api/helm_packages.rb'
+ - 'lib/api/helpers/groups_helpers.rb'
+ - 'lib/api/helpers/merge_requests_helpers.rb'
+ - 'lib/api/helpers/snippets_helpers.rb'
+ - 'lib/api/issue_links.rb'
+ - 'lib/api/issues.rb'
+ - 'lib/api/labels.rb'
+ - 'lib/api/maven_packages.rb'
+ - 'lib/api/members.rb'
+ - 'lib/api/merge_requests.rb'
+ - 'lib/api/metrics/dashboard/annotations.rb'
+ - 'lib/api/metrics/user_starred_dashboards.rb'
+ - 'lib/api/milestone_responses.rb'
+ - 'lib/api/notes.rb'
+ - 'lib/api/pages_domains.rb'
+ - 'lib/api/project_packages.rb'
+ - 'lib/api/project_templates.rb'
+ - 'lib/api/projects.rb'
+ - 'lib/api/protected_branches.rb'
+ - 'lib/api/releases.rb'
+ - 'lib/api/rubygem_packages.rb'
+ - 'lib/api/sidekiq_metrics.rb'
+ - 'lib/api/users.rb'
+ - 'lib/backup/gitaly_backup.rb'
+ - 'lib/banzai/filter/references/abstract_reference_filter.rb'
+ - 'lib/banzai/reference_redactor.rb'
+ - 'lib/bulk_imports/projects/pipelines/project_attributes_pipeline.rb'
+ - 'lib/gitlab/abuse.rb'
+ - 'lib/gitlab/access.rb'
+ - 'lib/gitlab/application_rate_limiter.rb'
+ - 'lib/gitlab/auth/ldap/config.rb'
+ - 'lib/gitlab/auth/o_auth/auth_hash.rb'
+ - 'lib/gitlab/auth/o_auth/provider.rb'
+ - 'lib/gitlab/auth/o_auth/user.rb'
+ - 'lib/gitlab/background_migration/backfill_project_repositories.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/ansi2json/parser.rb'
+ - 'lib/gitlab/ci/config/entry/processable.rb'
+ - 'lib/gitlab/ci/jwt_v2.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/external.rb'
+ - 'lib/gitlab/ci/reports/security/scanner.rb'
+ - 'lib/gitlab/database/partitioning/sliding_list_strategy.rb'
+ - 'lib/gitlab/database/reflection.rb'
+ - 'lib/gitlab/diff/file_collection/compare.rb'
+ - 'lib/gitlab/email/attachment_uploader.rb'
+ - 'lib/gitlab/emoji.rb'
+ - 'lib/gitlab/etag_caching/middleware.rb'
+ - 'lib/gitlab/experimentation.rb'
+ - 'lib/gitlab/fogbugz_import/importer.rb'
+ - 'lib/gitlab/git/repository.rb'
+ - 'lib/gitlab/gitaly_client/commit_service.rb'
+ - 'lib/gitlab/gitaly_client/operation_service.rb'
+ - 'lib/gitlab/hook_data/project_member_builder.rb'
+ - 'lib/gitlab/import_export/group/legacy_tree_restorer.rb'
+ - 'lib/gitlab/import_export/group/relation_factory.rb'
+ - 'lib/gitlab/import_export/group/relation_tree_restorer.rb'
+ - 'lib/gitlab/import_export/members_mapper.rb'
+ - 'lib/gitlab/import_export/project/import_task.rb'
+ - 'lib/gitlab/import_export/shared.rb'
+ - 'lib/gitlab/kubernetes.rb'
+ - 'lib/gitlab/marginalia/comment.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb'
+ - 'lib/gitlab/metrics/dashboard/transformers/yml/v1/prometheus_metrics.rb'
+ - 'lib/gitlab/metrics/dashboard/validator/client.rb'
+ - 'lib/gitlab/metrics/exporter/metrics_middleware.rb'
+ - 'lib/gitlab/metrics/samplers/puma_sampler.rb'
+ - 'lib/gitlab/metrics/samplers/ruby_sampler.rb'
+ - 'lib/gitlab/no_cache_headers.rb'
+ - 'lib/gitlab/sidekiq_daemon/memory_killer.rb'
+ - 'lib/gitlab/sidekiq_middleware/server_metrics.rb'
+ - 'lib/gitlab/slash_commands/presenters/base.rb'
+ - 'lib/gitlab/template/gitignore_template.rb'
+ - 'lib/gitlab/visibility_level.rb'
+ - 'lib/product_analytics/event_params.rb'
+ - 'lib/sidebars/projects/menus/infrastructure_menu.rb'
+ - 'lib/tasks/gitlab/import_export/export.rake'
+ - 'lib/tasks/gitlab/import_export/import.rake'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb'
+ - 'qa/qa/support/loglinking.rb'
+ - 'qa/spec/support/loglinking_spec.rb'
+ - 'spec/controllers/concerns/product_analytics_tracking_spec.rb'
+ - 'spec/controllers/concerns/redis_tracking_spec.rb'
+ - 'spec/controllers/oauth/token_info_controller_spec.rb'
+ - 'spec/controllers/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_controller_spec.rb'
+ - 'spec/controllers/projects/grafana_api_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/registry/tags_controller_spec.rb'
+ - 'spec/controllers/projects/service_desk_controller_spec.rb'
+ - 'spec/controllers/search_controller_spec.rb'
+ - 'spec/factories/ci/builds.rb'
+ - 'spec/factories/ci/stages.rb'
+ - 'spec/factories/groups.rb'
+ - 'spec/features/dashboard/datetime_on_tooltips_spec.rb'
+ - 'spec/features/groups/issues_spec.rb'
+ - 'spec/features/profiles/active_sessions_spec.rb'
+ - 'spec/features/projects/badges/coverage_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/jobs/user_browses_jobs_spec.rb'
+ - 'spec/features/projects/milestones/milestones_sorting_spec.rb'
+ - 'spec/features/projects/new_project_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/pipelines/pipelines_spec.rb'
+ - 'spec/features/snippets/user_creates_snippet_spec.rb'
+ - 'spec/features/users/login_spec.rb'
+ - 'spec/finders/ci/pipelines_for_merge_request_finder_spec.rb'
+ - 'spec/finders/group_descendants_finder_spec.rb'
+ - 'spec/finders/group_members_finder_spec.rb'
+ - 'spec/finders/template_finder_spec.rb'
+ - 'spec/graphql/mutations/releases/update_spec.rb'
+ - 'spec/graphql/resolvers/ci/config_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/versions_resolver_spec.rb'
+ - 'spec/helpers/sorting_helper_spec.rb'
+ - 'spec/helpers/storage_helper_spec.rb'
+ - 'spec/helpers/wiki_helper_spec.rb'
+ - 'spec/initializers/00_rails_disable_joins_spec.rb'
+ - 'spec/lib/backup/gitaly_backup_spec.rb'
+ - 'spec/lib/banzai/filter/repository_link_filter_spec.rb'
+ - 'spec/lib/gitlab/asciidoc_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/config_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_token_cloud_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb'
+ - 'spec/lib/gitlab/background_migration/encrypt_integration_properties_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/port_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/root_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper_spec.rb'
+ - 'spec/lib/gitlab/ci/lint_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/data_builder/note_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/sliding_list_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table_spec.rb'
+ - 'spec/lib/gitlab/database_importers/self_monitoring/project/create_service_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_cache_spec.rb'
+ - 'spec/lib/gitlab/diff/lines_unfolder_spec.rb'
+ - 'spec/lib/gitlab/diff/position_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/processor/context_payload_processor_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb'
+ - 'spec/lib/gitlab/etag_caching/middleware_spec.rb'
+ - 'spec/lib/gitlab/etag_caching/router/graphql_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/formatters/lograge_with_timestamp_spec.rb'
+ - 'spec/lib/gitlab/hook_data/issuable_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/attributes_finder_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/object_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/relation_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/sample/relation_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_sources_spec.rb'
+ - 'spec/lib/gitlab/instrumentation_helper_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator/errors_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator_spec.rb'
+ - 'spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/action_view_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/active_record_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb'
+ - 'spec/lib/gitlab/metrics/web_transaction_spec.rb'
+ - 'spec/lib/gitlab/omniauth_initializer_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb'
+ - 'spec/lib/gitlab/slug/environment_spec.rb'
+ - 'spec/lib/gitlab/tracking_spec.rb'
+ - 'spec/lib/gitlab/usage_data/topology_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/note_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/word_diff/parser_spec.rb'
+ - 'spec/lib/marginalia_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_build_action_spec.rb'
+ - 'spec/mailers/emails/pipelines_spec.rb'
+ - 'spec/migrations/20210804150320_create_base_work_item_types_spec.rb'
+ - 'spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb'
+ - 'spec/migrations/20211117084814_migrate_remaining_u2f_registrations_spec.rb'
+ - 'spec/migrations/20211126204445_add_task_to_work_item_types_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/container_registry/event_spec.rb'
+ - 'spec/models/design_management/version_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/integrations/chat_message/pipeline_message_spec.rb'
+ - 'spec/models/integrations/drone_ci_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/operations/feature_flag_spec.rb'
+ - 'spec/models/pages_domain_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/presenters/clusters/cluster_presenter_spec.rb'
+ - 'spec/presenters/project_presenter_spec.rb'
+ - 'spec/requests/api/ci/job_artifacts_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/feature_flags_spec.rb'
+ - 'spec/requests/api/graphql/ci/config_spec.rb'
+ - 'spec/requests/api/graphql/ci/runner_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'spec/requests/api/graphql/packages/conan_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/version_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/state_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/states_spec.rb'
+ - 'spec/requests/api/graphql/query_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/suggestions_spec.rb'
+ - 'spec/requests/api/unleash_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/openid_connect_spec.rb'
+ - 'spec/requests/projects/merge_requests_discussions_spec.rb'
+ - 'spec/routing/project_routing_spec.rb'
+ - 'spec/serializers/ci/lint/job_entity_spec.rb'
+ - 'spec/serializers/container_repository_entity_spec.rb'
+ - 'spec/serializers/merge_request_metrics_helper_spec.rb'
+ - 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/logger_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/tags_spec.rb'
+ - 'spec/services/ci/job_artifacts/create_service_spec.rb'
+ - 'spec/services/ci/retry_build_service_spec.rb'
+ - 'spec/services/deployments/link_merge_requests_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_positions_service_spec.rb'
+ - 'spec/services/groups/import_export/import_service_spec.rb'
+ - 'spec/services/issuable/bulk_update_service_spec.rb'
+ - 'spec/services/issues/create_service_spec.rb'
+ - 'spec/services/merge_requests/build_service_spec.rb'
+ - 'spec/services/merge_requests/create_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/metrics/dashboard/clone_dashboard_service_spec.rb'
+ - 'spec/services/notes/create_service_spec.rb'
+ - 'spec/services/notes/destroy_service_spec.rb'
+ - 'spec/services/packages/debian/parse_debian822_service_spec.rb'
+ - 'spec/services/projects/destroy_service_spec.rb'
+ - 'spec/services/suggestions/apply_service_spec.rb'
+ - 'spec/support/helpers/create_environments_helpers.rb'
+ - 'spec/support/helpers/kubernetes_helpers.rb'
+ - 'spec/support/helpers/migrations_helpers/work_item_types_helper.rb'
+ - 'spec/support/helpers/seed_helper.rb'
+ - 'spec/support/helpers/stub_object_storage.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/helpers/usage_data_helpers.rb'
+ - 'spec/support/migrations_helpers/vulnerabilities_findings_helper.rb'
+ - 'spec/support/shared_contexts/bulk_imports_requests_shared_context.rb'
+ - 'spec/support/shared_contexts/design_management_shared_contexts.rb'
+ - 'spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb'
+ - 'spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/database/background_migration_job_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb'
+ - 'spec/support/shared_examples/routing/resource_routing_shared_examples.rb'
+ - 'spec/support/shared_examples/routing/wiki_routing_shared_examples.rb'
+ - 'spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb'
+ - 'spec/tooling/danger/datateam_spec.rb'
+ - 'spec/views/projects/tags/index.html.haml_spec.rb'
+ - 'spec/workers/emails_on_push_worker_spec.rb'
+ - 'spec/workers/pages_domain_ssl_renewal_cron_worker_spec.rb'
diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml
new file mode 100644
index 00000000000..8a922a1f163
--- /dev/null
+++ b/.rubocop_todo/layout/line_length.yml
@@ -0,0 +1,6603 @@
+---
+# Cop supports --auto-correct.
+Layout/LineLength:
+ Exclude:
+ - 'app/controllers/abuse_reports_controller.rb'
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/admin/groups_controller.rb'
+ - 'app/controllers/admin/identities_controller.rb'
+ - 'app/controllers/admin/impersonation_tokens_controller.rb'
+ - 'app/controllers/admin/keys_controller.rb'
+ - 'app/controllers/admin/projects_controller.rb'
+ - 'app/controllers/admin/runners_controller.rb'
+ - 'app/controllers/admin/sessions_controller.rb'
+ - 'app/controllers/admin/topics_controller.rb'
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/application_controller.rb'
+ - 'app/controllers/boards/lists_controller.rb'
+ - 'app/controllers/clusters/clusters_controller.rb'
+ - 'app/controllers/concerns/access_tokens_actions.rb'
+ - 'app/controllers/concerns/analytics/cycle_analytics/stage_actions.rb'
+ - 'app/controllers/concerns/clientside_preview_csp.rb'
+ - 'app/controllers/concerns/confirm_email_warning.rb'
+ - 'app/controllers/concerns/cycle_analytics_params.rb'
+ - 'app/controllers/concerns/integrations/actions.rb'
+ - 'app/controllers/concerns/issuable_actions.rb'
+ - 'app/controllers/concerns/issuable_collections.rb'
+ - 'app/controllers/concerns/membership_actions.rb'
+ - 'app/controllers/concerns/metrics_dashboard.rb'
+ - 'app/controllers/concerns/notes_actions.rb'
+ - 'app/controllers/concerns/one_trust_csp.rb'
+ - 'app/controllers/concerns/product_analytics_tracking.rb'
+ - 'app/controllers/concerns/routable_actions.rb'
+ - 'app/controllers/concerns/send_file_upload.rb'
+ - 'app/controllers/concerns/sourcegraph_decorator.rb'
+ - 'app/controllers/concerns/spammable_actions/akismet_mark_as_spam_action.rb'
+ - 'app/controllers/concerns/static_object_external_storage_csp.rb'
+ - 'app/controllers/concerns/wiki_actions.rb'
+ - 'app/controllers/confirmations_controller.rb'
+ - 'app/controllers/dashboard/projects_controller.rb'
+ - 'app/controllers/dashboard/todos_controller.rb'
+ - 'app/controllers/explore/projects_controller.rb'
+ - 'app/controllers/groups/dependency_proxy_for_containers_controller.rb'
+ - 'app/controllers/groups/email_campaigns_controller.rb'
+ - 'app/controllers/groups/group_members_controller.rb'
+ - 'app/controllers/groups/runners_controller.rb'
+ - 'app/controllers/groups/settings/applications_controller.rb'
+ - 'app/controllers/groups/settings/ci_cd_controller.rb'
+ - 'app/controllers/groups/settings/integrations_controller.rb'
+ - 'app/controllers/groups/settings/repository_controller.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/import/available_namespaces_controller.rb'
+ - 'app/controllers/import/base_controller.rb'
+ - 'app/controllers/import/bitbucket_controller.rb'
+ - 'app/controllers/import/bitbucket_server_controller.rb'
+ - 'app/controllers/import/bulk_imports_controller.rb'
+ - 'app/controllers/import/fogbugz_controller.rb'
+ - 'app/controllers/import/gitea_controller.rb'
+ - 'app/controllers/import/gitlab_controller.rb'
+ - 'app/controllers/import/gitlab_groups_controller.rb'
+ - 'app/controllers/import/gitlab_projects_controller.rb'
+ - 'app/controllers/invites_controller.rb'
+ - 'app/controllers/jira_connect/application_controller.rb'
+ - 'app/controllers/jira_connect/events_controller.rb'
+ - 'app/controllers/jira_connect/subscriptions_controller.rb'
+ - 'app/controllers/jwt_controller.rb'
+ - 'app/controllers/omniauth_callbacks_controller.rb'
+ - 'app/controllers/profiles/chat_names_controller.rb'
+ - 'app/controllers/profiles/passwords_controller.rb'
+ - 'app/controllers/profiles/two_factor_auths_controller.rb'
+ - 'app/controllers/projects/analytics/cycle_analytics/summary_controller.rb'
+ - 'app/controllers/projects/blame_controller.rb'
+ - 'app/controllers/projects/blob_controller.rb'
+ - 'app/controllers/projects/branches_controller.rb'
+ - 'app/controllers/projects/build_artifacts_controller.rb'
+ - 'app/controllers/projects/commit_controller.rb'
+ - 'app/controllers/projects/commits_controller.rb'
+ - 'app/controllers/projects/compare_controller.rb'
+ - 'app/controllers/projects/cycle_analytics/events_controller.rb'
+ - 'app/controllers/projects/cycle_analytics_controller.rb'
+ - 'app/controllers/projects/discussions_controller.rb'
+ - 'app/controllers/projects/environments/sample_metrics_controller.rb'
+ - 'app/controllers/projects/environments_controller.rb'
+ - 'app/controllers/projects/error_tracking/stack_traces_controller.rb'
+ - 'app/controllers/projects/forks_controller.rb'
+ - 'app/controllers/projects/google_cloud/gcp_regions_controller.rb'
+ - 'app/controllers/projects/imports_controller.rb'
+ - 'app/controllers/projects/integrations/shimos_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/jobs_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/controllers/projects/logs_controller.rb'
+ - 'app/controllers/projects/merge_requests/conflicts_controller.rb'
+ - 'app/controllers/projects/merge_requests/creations_controller.rb'
+ - 'app/controllers/projects/merge_requests/diffs_controller.rb'
+ - 'app/controllers/projects/merge_requests/drafts_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/controllers/projects/milestones_controller.rb'
+ - 'app/controllers/projects/notes_controller.rb'
+ - 'app/controllers/projects/performance_monitoring/dashboards_controller.rb'
+ - 'app/controllers/projects/pipeline_schedules_controller.rb'
+ - 'app/controllers/projects/pipelines/tests_controller.rb'
+ - 'app/controllers/projects/pipelines_controller.rb'
+ - 'app/controllers/projects/prometheus/metrics_controller.rb'
+ - 'app/controllers/projects/raw_controller.rb'
+ - 'app/controllers/projects/services_controller.rb'
+ - 'app/controllers/projects/settings/ci_cd_controller.rb'
+ - 'app/controllers/projects/settings/operations_controller.rb'
+ - 'app/controllers/projects/settings/repository_controller.rb'
+ - 'app/controllers/projects/templates_controller.rb'
+ - 'app/controllers/projects/tree_controller.rb'
+ - 'app/controllers/projects/triggers_controller.rb'
+ - 'app/controllers/projects/web_ide_schemas_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/controllers/registrations_controller.rb'
+ - 'app/controllers/repositories/git_http_client_controller.rb'
+ - 'app/controllers/repositories/git_http_controller.rb'
+ - 'app/controllers/search_controller.rb'
+ - 'app/controllers/sessions_controller.rb'
+ - 'app/controllers/snippets/notes_controller.rb'
+ - 'app/controllers/users_controller.rb'
+ - 'app/finders/analytics/cycle_analytics/stage_finder.rb'
+ - 'app/finders/ci/runners_finder.rb'
+ - 'app/finders/clusters/agent_authorizations_finder.rb'
+ - 'app/finders/group_descendants_finder.rb'
+ - 'app/finders/group_members_finder.rb'
+ - 'app/finders/group_projects_finder.rb'
+ - 'app/finders/issuable_finder.rb'
+ - 'app/finders/issuable_finder/params.rb'
+ - 'app/finders/issuables/assignee_filter.rb'
+ - 'app/finders/issuables/label_filter.rb'
+ - 'app/finders/issues_finder.rb'
+ - 'app/finders/members_finder.rb'
+ - 'app/finders/metrics/users_starred_dashboards_finder.rb'
+ - 'app/finders/packages/group_packages_finder.rb'
+ - 'app/finders/personal_access_tokens_finder.rb'
+ - 'app/finders/projects/export_job_finder.rb'
+ - 'app/finders/projects/members/effective_access_level_finder.rb'
+ - 'app/finders/projects_finder.rb'
+ - 'app/finders/prometheus_metrics_finder.rb'
+ - 'app/finders/releases/group_releases_finder.rb'
+ - 'app/finders/security/security_jobs_finder.rb'
+ - 'app/finders/todos_finder.rb'
+ - 'app/finders/user_group_notification_settings_finder.rb'
+ - 'app/finders/user_recent_events_finder.rb'
+ - 'app/graphql/batch_loaders/merge_request_diff_summary_batch_loader.rb'
+ - 'app/graphql/mutations/alert_management/http_integration/create.rb'
+ - 'app/graphql/mutations/alert_management/http_integration/http_integration_base.rb'
+ - 'app/graphql/mutations/alert_management/http_integration/update.rb'
+ - 'app/graphql/mutations/customer_relations/contacts/create.rb'
+ - 'app/graphql/mutations/customer_relations/contacts/update.rb'
+ - 'app/graphql/mutations/customer_relations/organizations/create.rb'
+ - 'app/graphql/mutations/customer_relations/organizations/update.rb'
+ - 'app/graphql/mutations/environments/canary_ingress/update.rb'
+ - 'app/graphql/mutations/issues/create.rb'
+ - 'app/graphql/mutations/issues/move.rb'
+ - 'app/graphql/mutations/issues/set_confidential.rb'
+ - 'app/graphql/mutations/issues/set_crm_contacts.rb'
+ - 'app/graphql/mutations/issues/set_locked.rb'
+ - 'app/graphql/mutations/issues/update.rb'
+ - 'app/graphql/mutations/merge_requests/accept.rb'
+ - 'app/graphql/mutations/merge_requests/create.rb'
+ - 'app/graphql/mutations/merge_requests/reviewer_rereview.rb'
+ - 'app/graphql/mutations/merge_requests/set_draft.rb'
+ - 'app/graphql/mutations/merge_requests/set_labels.rb'
+ - 'app/graphql/mutations/merge_requests/set_locked.rb'
+ - 'app/graphql/mutations/merge_requests/set_milestone.rb'
+ - 'app/graphql/mutations/merge_requests/toggle_attention_requested.rb'
+ - 'app/graphql/mutations/metrics/dashboard/annotations/create.rb'
+ - 'app/graphql/mutations/namespace/package_settings/update.rb'
+ - 'app/graphql/mutations/notes/create/note.rb'
+ - 'app/graphql/mutations/packages/destroy.rb'
+ - 'app/graphql/mutations/releases/create.rb'
+ - 'app/graphql/mutations/releases/update.rb'
+ - 'app/graphql/mutations/saved_replies/create.rb'
+ - 'app/graphql/mutations/saved_replies/update.rb'
+ - 'app/graphql/mutations/snippets/create.rb'
+ - 'app/graphql/mutations/snippets/update.rb'
+ - 'app/graphql/mutations/todos/create.rb'
+ - 'app/graphql/mutations/todos/mark_all_done.rb'
+ - 'app/graphql/mutations/work_items/create.rb'
+ - 'app/graphql/mutations/work_items/create_from_task.rb'
+ - 'app/graphql/mutations/work_items/delete.rb'
+ - 'app/graphql/mutations/work_items/update.rb'
+ - 'app/graphql/resolvers/ci/job_token_scope_resolver.rb'
+ - 'app/graphql/resolvers/ci/runner_jobs_resolver.rb'
+ - 'app/graphql/resolvers/ci/runner_status_resolver.rb'
+ - 'app/graphql/resolvers/concerns/issue_resolver_arguments.rb'
+ - 'app/graphql/resolvers/concerns/time_frame_arguments.rb'
+ - 'app/graphql/resolvers/container_repository_tags_resolver.rb'
+ - 'app/graphql/resolvers/group_packages_resolver.rb'
+ - 'app/graphql/resolvers/package_details_resolver.rb'
+ - 'app/graphql/resolvers/project_jobs_resolver.rb'
+ - 'app/graphql/resolvers/project_merge_requests_resolver.rb'
+ - 'app/graphql/resolvers/projects_resolver.rb'
+ - 'app/graphql/resolvers/user_discussions_count_resolver.rb'
+ - 'app/graphql/types/admin/sidekiq_queues/delete_jobs_response_type.rb'
+ - 'app/graphql/types/alert_management/prometheus_integration_type.rb'
+ - 'app/graphql/types/alert_management/status_enum.rb'
+ - 'app/graphql/types/base_field.rb'
+ - 'app/graphql/types/boards/board_issuable_input_base_type.rb'
+ - 'app/graphql/types/ci/job_artifact_file_type_enum.rb'
+ - 'app/graphql/types/ci/job_type.rb'
+ - 'app/graphql/types/ci/pipeline_config_source_enum.rb'
+ - 'app/graphql/types/ci/pipeline_type.rb'
+ - 'app/graphql/types/ci/runner_membership_filter_enum.rb'
+ - 'app/graphql/types/ci/runner_setup_type.rb'
+ - 'app/graphql/types/ci/runner_status_enum.rb'
+ - 'app/graphql/types/ci/runner_type.rb'
+ - 'app/graphql/types/ci/runner_web_url_edge.rb'
+ - 'app/graphql/types/container_expiration_policy_type.rb'
+ - 'app/graphql/types/container_repository_cleanup_status_enum.rb'
+ - 'app/graphql/types/container_repository_details_type.rb'
+ - 'app/graphql/types/container_repository_type.rb'
+ - 'app/graphql/types/dependency_proxy/group_setting_type.rb'
+ - 'app/graphql/types/dependency_proxy/image_ttl_group_policy_type.rb'
+ - 'app/graphql/types/environment_type.rb'
+ - 'app/graphql/types/error_tracking/sentry_error_status_enum.rb'
+ - 'app/graphql/types/eventable_type.rb'
+ - 'app/graphql/types/group_member_relation_enum.rb'
+ - 'app/graphql/types/group_type.rb'
+ - 'app/graphql/types/incident_management/escalation_status_enum.rb'
+ - 'app/graphql/types/issue_sort_enum.rb'
+ - 'app/graphql/types/issue_type.rb'
+ - 'app/graphql/types/member_interface.rb'
+ - 'app/graphql/types/merge_request_type.rb'
+ - 'app/graphql/types/milestone_sort_enum.rb'
+ - 'app/graphql/types/milestone_type.rb'
+ - 'app/graphql/types/namespace/package_settings_type.rb'
+ - 'app/graphql/types/notes/diff_position_input_type.rb'
+ - 'app/graphql/types/notes/noteable_interface.rb'
+ - 'app/graphql/types/packages/composer/metadatum_type.rb'
+ - 'app/graphql/types/packages/conan/file_metadatum_type.rb'
+ - 'app/graphql/types/packages/helm/dependency_type.rb'
+ - 'app/graphql/types/packages/helm/metadata_type.rb'
+ - 'app/graphql/types/packages/metadata_type.rb'
+ - 'app/graphql/types/packages/nuget/dependency_link_metadatum_type.rb'
+ - 'app/graphql/types/packages/package_dependency_link_type.rb'
+ - 'app/graphql/types/packages/package_details_type.rb'
+ - 'app/graphql/types/packages/package_type.rb'
+ - 'app/graphql/types/packages/package_type_enum.rb'
+ - 'app/graphql/types/packages/pypi/metadatum_type.rb'
+ - 'app/graphql/types/project_type.rb'
+ - 'app/graphql/types/query_type.rb'
+ - 'app/graphql/types/repository/blob_type.rb'
+ - 'app/graphql/types/repository_type.rb'
+ - 'app/graphql/types/root_storage_statistics_type.rb'
+ - 'app/graphql/types/snippets/visibility_scopes_enum.rb'
+ - 'app/graphql/types/todo_action_enum.rb'
+ - 'app/helpers/analytics/cycle_analytics_helper.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/application_settings_helper.rb'
+ - 'app/helpers/award_emoji_helper.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/button_helper.rb'
+ - 'app/helpers/ci/jobs_helper.rb'
+ - 'app/helpers/ci/pipeline_editor_helper.rb'
+ - 'app/helpers/ci/pipelines_helper.rb'
+ - 'app/helpers/ci/runners_helper.rb'
+ - 'app/helpers/ci/status_helper.rb'
+ - 'app/helpers/clusters_helper.rb'
+ - 'app/helpers/commits_helper.rb'
+ - 'app/helpers/compare_helper.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/dropdowns_helper.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/environments_helper.rb'
+ - 'app/helpers/events_helper.rb'
+ - 'app/helpers/export_helper.rb'
+ - 'app/helpers/external_link_helper.rb'
+ - 'app/helpers/gitpod_helper.rb'
+ - 'app/helpers/groups/group_members_helper.rb'
+ - 'app/helpers/groups_helper.rb'
+ - 'app/helpers/icons_helper.rb'
+ - 'app/helpers/ide_helper.rb'
+ - 'app/helpers/import_helper.rb'
+ - 'app/helpers/in_product_marketing_helper.rb'
+ - 'app/helpers/integrations_helper.rb'
+ - 'app/helpers/invite_members_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/jira_connect_helper.rb'
+ - 'app/helpers/labels_helper.rb'
+ - 'app/helpers/merge_requests_helper.rb'
+ - 'app/helpers/mirror_helper.rb'
+ - 'app/helpers/namespaces_helper.rb'
+ - 'app/helpers/nav/new_dropdown_helper.rb'
+ - 'app/helpers/nav/top_nav_helper.rb'
+ - 'app/helpers/nav_helper.rb'
+ - 'app/helpers/notify_helper.rb'
+ - 'app/helpers/operations_helper.rb'
+ - 'app/helpers/packages_helper.rb'
+ - 'app/helpers/preferences_helper.rb'
+ - 'app/helpers/profiles_helper.rb'
+ - 'app/helpers/projects/alert_management_helper.rb'
+ - 'app/helpers/projects/pipeline_helper.rb'
+ - 'app/helpers/projects/security/configuration_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/registrations_helper.rb'
+ - 'app/helpers/reminder_emails_helper.rb'
+ - 'app/helpers/repository_languages_helper.rb'
+ - 'app/helpers/routing/pseudonymization_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/sorting_helper.rb'
+ - 'app/helpers/ssh_keys_helper.rb'
+ - 'app/helpers/startupjs_helper.rb'
+ - 'app/helpers/storage_helper.rb'
+ - 'app/helpers/submodule_helper.rb'
+ - 'app/helpers/tags_helper.rb'
+ - 'app/helpers/timeboxes_helper.rb'
+ - 'app/helpers/tree_helper.rb'
+ - 'app/helpers/users/callouts_helper.rb'
+ - 'app/helpers/users_helper.rb'
+ - 'app/helpers/version_check_helper.rb'
+ - 'app/helpers/visibility_level_helper.rb'
+ - 'app/helpers/whats_new_helper.rb'
+ - 'app/helpers/wiki_helper.rb'
+ - 'app/helpers/wiki_page_version_helper.rb'
+ - 'app/mailers/emails/members.rb'
+ - 'app/mailers/emails/merge_requests.rb'
+ - 'app/mailers/emails/pages_domains.rb'
+ - 'app/mailers/emails/profile.rb'
+ - 'app/mailers/previews/notify_preview.rb'
+ - 'app/models/alert_management/alert.rb'
+ - 'app/models/analytics/cycle_analytics/aggregation.rb'
+ - 'app/models/analytics/cycle_analytics/issue_stage_event.rb'
+ - 'app/models/analytics/cycle_analytics/merge_request_stage_event.rb'
+ - 'app/models/analytics/cycle_analytics/project_stage.rb'
+ - 'app/models/analytics/cycle_analytics/stage_event_hash.rb'
+ - 'app/models/application_record.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/application_setting_implementation.rb'
+ - 'app/models/award_emoji.rb'
+ - 'app/models/blob_viewer/base.rb'
+ - 'app/models/broadcast_message.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/job_artifact.rb'
+ - 'app/models/ci/namespace_mirror.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/pipeline_artifact.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/ci/secure_file.rb'
+ - 'app/models/ci/unit_test.rb'
+ - 'app/models/clusters/agent.rb'
+ - 'app/models/clusters/applications/cert_manager.rb'
+ - 'app/models/clusters/applications/elastic_stack.rb'
+ - 'app/models/clusters/applications/knative.rb'
+ - 'app/models/clusters/applications/prometheus.rb'
+ - 'app/models/clusters/cluster.rb'
+ - 'app/models/commit_range.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
+ - 'app/models/concerns/analytics/cycle_analytics/stage_event_model.rb'
+ - 'app/models/concerns/avatarable.rb'
+ - 'app/models/concerns/bulk_insert_safe.rb'
+ - 'app/models/concerns/bulk_users_by_email_load.rb'
+ - 'app/models/concerns/cache_markdown_field.rb'
+ - 'app/models/concerns/cacheable_attributes.rb'
+ - 'app/models/concerns/cascading_namespace_setting_attribute.rb'
+ - 'app/models/concerns/ci/has_status.rb'
+ - 'app/models/concerns/each_batch.rb'
+ - 'app/models/concerns/enums/ci/pipeline.rb'
+ - 'app/models/concerns/enums/prometheus_metric.rb'
+ - 'app/models/concerns/enums/vulnerability.rb'
+ - 'app/models/concerns/fast_destroy_all.rb'
+ - 'app/models/concerns/group_descendant.rb'
+ - 'app/models/concerns/has_user_type.rb'
+ - 'app/models/concerns/id_in_ordered.rb'
+ - 'app/models/concerns/ignorable_columns.rb'
+ - 'app/models/concerns/iid_routes.rb'
+ - 'app/models/concerns/integrations/has_data_fields.rb'
+ - 'app/models/concerns/integrations/has_issue_tracker_fields.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/limitable.rb'
+ - 'app/models/concerns/mentionable/reference_regexes.rb'
+ - 'app/models/concerns/milestoneable.rb'
+ - 'app/models/concerns/noteable.rb'
+ - 'app/models/concerns/packages/debian/architecture.rb'
+ - 'app/models/concerns/packages/debian/component.rb'
+ - 'app/models/concerns/packages/debian/component_file.rb'
+ - 'app/models/concerns/packages/debian/distribution.rb'
+ - 'app/models/concerns/packages/debian/distribution_key.rb'
+ - 'app/models/concerns/partitioned_table.rb'
+ - 'app/models/concerns/protected_ref.rb'
+ - 'app/models/concerns/redis_cacheable.rb'
+ - 'app/models/concerns/restricted_signup.rb'
+ - 'app/models/concerns/routable.rb'
+ - 'app/models/concerns/sha256_attribute.rb'
+ - 'app/models/concerns/shardable.rb'
+ - 'app/models/concerns/sortable.rb'
+ - 'app/models/concerns/storage/legacy_namespace.rb'
+ - 'app/models/concerns/subscribable.rb'
+ - 'app/models/concerns/timebox.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/base.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/encrypted.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/encryption_helper.rb'
+ - 'app/models/concerns/update_highest_role.rb'
+ - 'app/models/concerns/update_project_statistics.rb'
+ - 'app/models/concerns/x509_serial_number_attribute.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/customer_relations/issue_contact.rb'
+ - 'app/models/deploy_key.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/design_management/repository.rb'
+ - 'app/models/diff_note.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/error_tracking/project_error_tracking_setting.rb'
+ - 'app/models/event_collection.rb'
+ - 'app/models/exported_protected_branch.rb'
+ - 'app/models/group.rb'
+ - 'app/models/incident_management/project_incident_management_setting.rb'
+ - 'app/models/instance_configuration.rb'
+ - 'app/models/integration.rb'
+ - 'app/models/integrations/asana.rb'
+ - 'app/models/integrations/bamboo.rb'
+ - 'app/models/integrations/base_chat_notification.rb'
+ - 'app/models/integrations/base_issue_tracker.rb'
+ - 'app/models/integrations/bugzilla.rb'
+ - 'app/models/integrations/campfire.rb'
+ - 'app/models/integrations/chat_message/deployment_message.rb'
+ - 'app/models/integrations/chat_message/merge_message.rb'
+ - 'app/models/integrations/chat_message/note_message.rb'
+ - 'app/models/integrations/chat_message/pipeline_message.rb'
+ - 'app/models/integrations/chat_message/wiki_page_message.rb'
+ - 'app/models/integrations/confluence.rb'
+ - 'app/models/integrations/custom_issue_tracker.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/models/integrations/discord.rb'
+ - 'app/models/integrations/drone_ci.rb'
+ - 'app/models/integrations/emails_on_push.rb'
+ - 'app/models/integrations/ewm.rb'
+ - 'app/models/integrations/external_wiki.rb'
+ - 'app/models/integrations/flowdock.rb'
+ - 'app/models/integrations/hangouts_chat.rb'
+ - 'app/models/integrations/harbor.rb'
+ - 'app/models/integrations/irker.rb'
+ - 'app/models/integrations/jenkins.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/integrations/mattermost.rb'
+ - 'app/models/integrations/microsoft_teams.rb'
+ - 'app/models/integrations/mock_ci.rb'
+ - 'app/models/integrations/pipelines_email.rb'
+ - 'app/models/integrations/pivotaltracker.rb'
+ - 'app/models/integrations/prometheus.rb'
+ - 'app/models/integrations/pushover.rb'
+ - 'app/models/integrations/redmine.rb'
+ - 'app/models/integrations/teamcity.rb'
+ - 'app/models/integrations/unify_circuit.rb'
+ - 'app/models/integrations/webex_teams.rb'
+ - 'app/models/integrations/youtrack.rb'
+ - 'app/models/integrations/zentao.rb'
+ - 'app/models/internal_id.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/issue_email_participant.rb'
+ - 'app/models/jira_connect_subscription.rb'
+ - 'app/models/key.rb'
+ - 'app/models/label.rb'
+ - 'app/models/lfs_object.rb'
+ - 'app/models/lfs_objects_project.rb'
+ - 'app/models/list.rb'
+ - 'app/models/loose_foreign_keys/modification_tracker.rb'
+ - 'app/models/member.rb'
+ - 'app/models/members_preloader.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request_assignee.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/merge_request_reviewer.rb'
+ - 'app/models/merge_requests_closing_issues.rb'
+ - 'app/models/metrics/dashboard/annotation.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/namespace/package_setting.rb'
+ - 'app/models/namespace_setting.rb'
+ - 'app/models/namespace_statistics.rb'
+ - 'app/models/namespaces/traversal/linear.rb'
+ - 'app/models/notification_setting.rb'
+ - 'app/models/oauth_access_token.rb'
+ - 'app/models/operations/feature_flag.rb'
+ - 'app/models/packages/composer/metadatum.rb'
+ - 'app/models/packages/debian/file_entry.rb'
+ - 'app/models/packages/debian/project_distribution.rb'
+ - 'app/models/packages/dependency.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/packages/package_file.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/performance_monitoring/prometheus_dashboard.rb'
+ - 'app/models/personal_access_token.rb'
+ - 'app/models/preloaders/environments/deployment_preloader.rb'
+ - 'app/models/preloaders/single_hierarchy_project_group_plans_preloader.rb'
+ - 'app/models/preloaders/user_max_access_level_in_groups_preloader.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_feature.rb'
+ - 'app/models/project_statistics.rb'
+ - 'app/models/projects/topic.rb'
+ - 'app/models/prometheus_metric.rb'
+ - 'app/models/protected_branch/push_access_level.rb'
+ - 'app/models/release.rb'
+ - 'app/models/releases/link.rb'
+ - 'app/models/remote_mirror.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/serverless/domain.rb'
+ - 'app/models/service_desk_setting.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/suggestion.rb'
+ - 'app/models/terraform/state.rb'
+ - 'app/models/todo.rb'
+ - 'app/models/upload.rb'
+ - 'app/models/user.rb'
+ - 'app/models/user_detail.rb'
+ - 'app/models/wiki_page.rb'
+ - 'app/policies/base_policy.rb'
+ - 'app/policies/global_policy.rb'
+ - 'app/policies/group_member_policy.rb'
+ - 'app/policies/group_policy.rb'
+ - 'app/policies/project_policy.rb'
+ - 'app/presenters/blob_presenter.rb'
+ - 'app/presenters/ci/build_runner_presenter.rb'
+ - 'app/presenters/ci/pipeline_presenter.rb'
+ - 'app/presenters/clusters/cluster_presenter.rb'
+ - 'app/presenters/commit_status_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/packages/composer/packages_presenter.rb'
+ - 'app/presenters/packages/conan/package_presenter.rb'
+ - 'app/presenters/pages_domain_presenter.rb'
+ - 'app/presenters/project_clusterable_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/presenters/snippet_blob_presenter.rb'
+ - 'app/serializers/base_discussion_entity.rb'
+ - 'app/serializers/build_details_entity.rb'
+ - 'app/serializers/ci/pipeline_entity.rb'
+ - 'app/serializers/deploy_key_entity.rb'
+ - 'app/serializers/deployment_cluster_entity.rb'
+ - 'app/serializers/deployment_entity.rb'
+ - 'app/serializers/diff_file_base_entity.rb'
+ - 'app/serializers/diff_file_entity.rb'
+ - 'app/serializers/diffs_entity.rb'
+ - 'app/serializers/issue_board_entity.rb'
+ - 'app/serializers/jira_connect/app_data_serializer.rb'
+ - 'app/serializers/merge_request_poll_cached_widget_entity.rb'
+ - 'app/serializers/merge_request_poll_widget_entity.rb'
+ - 'app/serializers/merge_request_sidebar_extras_entity.rb'
+ - 'app/serializers/merge_request_user_entity.rb'
+ - 'app/serializers/merge_request_widget_entity.rb'
+ - 'app/serializers/note_entity.rb'
+ - 'app/serializers/project_note_entity.rb'
+ - 'app/serializers/prometheus_alert_entity.rb'
+ - 'app/services/application_settings/update_service.rb'
+ - 'app/services/auth/container_registry_authentication_service.rb'
+ - 'app/services/auto_merge/base_service.rb'
+ - 'app/services/auto_merge/merge_when_pipeline_succeeds_service.rb'
+ - 'app/services/boards/base_items_list_service.rb'
+ - 'app/services/boards/destroy_service.rb'
+ - 'app/services/boards/issues/create_service.rb'
+ - 'app/services/boards/issues/move_service.rb'
+ - 'app/services/boards/lists/base_create_service.rb'
+ - 'app/services/branches/delete_service.rb'
+ - 'app/services/bulk_create_integration_service.rb'
+ - 'app/services/bulk_imports/file_decompression_service.rb'
+ - 'app/services/bulk_imports/uploads_export_service.rb'
+ - 'app/services/bulk_update_integration_service.rb'
+ - 'app/services/ci/create_pipeline_service.rb'
+ - 'app/services/ci/drop_pipeline_service.rb'
+ - 'app/services/ci/generate_coverage_reports_service.rb'
+ - 'app/services/ci/job_artifacts/destroy_all_expired_service.rb'
+ - 'app/services/ci/job_artifacts/destroy_batch_service.rb'
+ - 'app/services/ci/job_artifacts/expire_project_build_artifacts_service.rb'
+ - 'app/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service.rb'
+ - 'app/services/ci/pipelines/add_job_service.rb'
+ - 'app/services/ci/prometheus_metrics/observe_histograms_service.rb'
+ - 'app/services/ci/queue/builds_table_strategy.rb'
+ - 'app/services/ci/queue/pending_builds_strategy.rb'
+ - 'app/services/ci/runners/register_runner_service.rb'
+ - 'app/services/ci/runners/unregister_runner_service.rb'
+ - 'app/services/clusters/agent_tokens/create_service.rb'
+ - 'app/services/clusters/agents/delete_service.rb'
+ - 'app/services/clusters/applications/check_progress_service.rb'
+ - 'app/services/clusters/applications/check_uninstall_progress_service.rb'
+ - 'app/services/clusters/applications/prometheus_update_service.rb'
+ - 'app/services/clusters/aws/finalize_creation_service.rb'
+ - 'app/services/clusters/aws/verify_provision_status_service.rb'
+ - 'app/services/clusters/build_kubernetes_namespace_service.rb'
+ - 'app/services/clusters/gcp/finalize_creation_service.rb'
+ - 'app/services/clusters/gcp/verify_provision_status_service.rb'
+ - 'app/services/clusters/integrations/create_service.rb'
+ - 'app/services/clusters/integrations/prometheus_health_check_service.rb'
+ - 'app/services/clusters/kubernetes/create_or_update_service_account_service.rb'
+ - 'app/services/clusters/management/validate_management_project_permissions_service.rb'
+ - 'app/services/compare_service.rb'
+ - 'app/services/concerns/base_service_utility.rb'
+ - 'app/services/concerns/exclusive_lease_guard.rb'
+ - 'app/services/concerns/members/bulk_create_users.rb'
+ - 'app/services/concerns/merge_requests/assigns_merge_params.rb'
+ - 'app/services/concerns/rate_limited_service.rb'
+ - 'app/services/concerns/schedule_bulk_repository_shard_moves_methods.rb'
+ - 'app/services/concerns/update_repository_storage_methods.rb'
+ - 'app/services/container_expiration_policies/cleanup_service.rb'
+ - 'app/services/dependency_proxy/group_settings/update_service.rb'
+ - 'app/services/dependency_proxy/image_ttl_group_policies/update_service.rb'
+ - 'app/services/design_management/copy_design_collection/copy_service.rb'
+ - 'app/services/design_management/copy_design_collection/queue_service.rb'
+ - 'app/services/design_management/generate_image_versions_service.rb'
+ - 'app/services/design_management/save_designs_service.rb'
+ - 'app/services/discussions/resolve_service.rb'
+ - 'app/services/draft_notes/publish_service.rb'
+ - 'app/services/emails/create_service.rb'
+ - 'app/services/environments/reset_auto_stop_service.rb'
+ - 'app/services/environments/schedule_to_delete_review_apps_service.rb'
+ - 'app/services/event_create_service.rb'
+ - 'app/services/feature_flags/update_service.rb'
+ - 'app/services/git/branch_hooks_service.rb'
+ - 'app/services/git/process_ref_changes_service.rb'
+ - 'app/services/google_cloud/create_service_accounts_service.rb'
+ - 'app/services/google_cloud/generate_pipeline_service.rb'
+ - 'app/services/google_cloud/service_accounts_service.rb'
+ - 'app/services/groups/create_service.rb'
+ - 'app/services/groups/destroy_service.rb'
+ - 'app/services/groups/import_export/import_service.rb'
+ - 'app/services/groups/open_issues_count_service.rb'
+ - 'app/services/groups/transfer_service.rb'
+ - 'app/services/groups/update_service.rb'
+ - 'app/services/import/bitbucket_server_service.rb'
+ - 'app/services/import/github_service.rb'
+ - 'app/services/import/validate_remote_git_endpoint_service.rb'
+ - 'app/services/issuable/clone/attributes_rewriter.rb'
+ - 'app/services/issuable/import_csv/base_service.rb'
+ - 'app/services/issuable/process_assignees.rb'
+ - 'app/services/issuable_base_service.rb'
+ - 'app/services/issuable_links/create_service.rb'
+ - 'app/services/issues/base_service.rb'
+ - 'app/services/issues/clone_service.rb'
+ - 'app/services/issues/close_service.rb'
+ - 'app/services/issues/duplicate_service.rb'
+ - 'app/services/issues/move_service.rb'
+ - 'app/services/issues/referenced_merge_requests_service.rb'
+ - 'app/services/issues/relative_position_rebalancing_service.rb'
+ - 'app/services/issues/set_crm_contacts_service.rb'
+ - 'app/services/issues/update_service.rb'
+ - 'app/services/issues/zoom_link_service.rb'
+ - 'app/services/jira/requests/base.rb'
+ - 'app/services/jira/requests/projects/list_service.rb'
+ - 'app/services/jira_connect_installations/destroy_service.rb'
+ - 'app/services/jira_import/start_import_service.rb'
+ - 'app/services/jira_import/users_importer.rb'
+ - 'app/services/jira_import/users_mapper_service.rb'
+ - 'app/services/labels/create_service.rb'
+ - 'app/services/lfs/unlock_file_service.rb'
+ - 'app/services/loose_foreign_keys/batch_cleaner_service.rb'
+ - 'app/services/loose_foreign_keys/cleaner_service.rb'
+ - 'app/services/members/approve_access_request_service.rb'
+ - 'app/services/members/destroy_service.rb'
+ - 'app/services/members/invitation_reminder_email_service.rb'
+ - 'app/services/members/mailgun/process_webhook_service.rb'
+ - 'app/services/members/update_service.rb'
+ - 'app/services/merge_requests/add_context_service.rb'
+ - 'app/services/merge_requests/assign_issues_service.rb'
+ - 'app/services/merge_requests/base_service.rb'
+ - 'app/services/merge_requests/build_service.rb'
+ - 'app/services/merge_requests/create_from_issue_service.rb'
+ - 'app/services/merge_requests/create_pipeline_service.rb'
+ - 'app/services/merge_requests/merge_base_service.rb'
+ - 'app/services/merge_requests/merge_service.rb'
+ - 'app/services/merge_requests/mergeability/run_checks_service.rb'
+ - 'app/services/merge_requests/mergeability_check_service.rb'
+ - 'app/services/merge_requests/push_options_handler_service.rb'
+ - 'app/services/merge_requests/refresh_service.rb'
+ - 'app/services/merge_requests/squash_service.rb'
+ - 'app/services/merge_requests/update_service.rb'
+ - 'app/services/metrics/dashboard/annotations/create_service.rb'
+ - 'app/services/metrics/dashboard/clone_dashboard_service.rb'
+ - 'app/services/metrics/dashboard/panel_preview_service.rb'
+ - 'app/services/metrics/dashboard/update_dashboard_service.rb'
+ - 'app/services/milestones/destroy_service.rb'
+ - 'app/services/namespace_settings/update_service.rb'
+ - 'app/services/notes/build_service.rb'
+ - 'app/services/notes/copy_service.rb'
+ - 'app/services/notes/quick_actions_service.rb'
+ - 'app/services/notes/resolve_service.rb'
+ - 'app/services/notification_recipients/builder/default.rb'
+ - 'app/services/notification_service.rb'
+ - 'app/services/packages/conan/create_package_file_service.rb'
+ - 'app/services/packages/create_dependency_service.rb'
+ - 'app/services/packages/create_package_file_service.rb'
+ - 'app/services/packages/debian/create_distribution_service.rb'
+ - 'app/services/packages/debian/extract_changes_metadata_service.rb'
+ - 'app/services/packages/debian/extract_deb_metadata_service.rb'
+ - 'app/services/packages/debian/generate_distribution_service.rb'
+ - 'app/services/packages/debian/parse_debian822_service.rb'
+ - 'app/services/packages/debian/update_distribution_service.rb'
+ - 'app/services/packages/go/create_package_service.rb'
+ - 'app/services/packages/go/sync_packages_service.rb'
+ - 'app/services/packages/maven/find_or_create_package_service.rb'
+ - 'app/services/packages/maven/metadata/append_package_file_service.rb'
+ - 'app/services/packages/maven/metadata/sync_service.rb'
+ - 'app/services/packages/npm/create_package_service.rb'
+ - 'app/services/packages/nuget/search_service.rb'
+ - 'app/services/packages/nuget/update_package_from_metadata_service.rb'
+ - 'app/services/packages/rubygems/dependency_resolver_service.rb'
+ - 'app/services/pages/migrate_from_legacy_storage_service.rb'
+ - 'app/services/pages/migrate_legacy_storage_to_deployment_service.rb'
+ - 'app/services/personal_access_tokens/create_service.rb'
+ - 'app/services/personal_access_tokens/revoke_service.rb'
+ - 'app/services/pod_logs/elasticsearch_service.rb'
+ - 'app/services/pod_logs/kubernetes_service.rb'
+ - 'app/services/projects/branches_by_mode_service.rb'
+ - 'app/services/projects/container_repository/cleanup_tags_service.rb'
+ - 'app/services/projects/container_repository/gitlab/delete_tags_service.rb'
+ - 'app/services/projects/container_repository/third_party/delete_tags_service.rb'
+ - 'app/services/projects/create_from_template_service.rb'
+ - 'app/services/projects/create_service.rb'
+ - 'app/services/projects/destroy_service.rb'
+ - 'app/services/projects/fork_service.rb'
+ - 'app/services/projects/hashed_storage/base_attachment_service.rb'
+ - 'app/services/projects/hashed_storage/base_repository_service.rb'
+ - 'app/services/projects/hashed_storage/migrate_attachments_service.rb'
+ - 'app/services/projects/hashed_storage/migrate_repository_service.rb'
+ - 'app/services/projects/hashed_storage/rollback_repository_service.rb'
+ - 'app/services/projects/import_service.rb'
+ - 'app/services/projects/lfs_pointers/lfs_download_service.rb'
+ - 'app/services/projects/operations/update_service.rb'
+ - 'app/services/projects/overwrite_project_service.rb'
+ - 'app/services/projects/transfer_service.rb'
+ - 'app/services/projects/unlink_fork_service.rb'
+ - 'app/services/projects/update_pages_service.rb'
+ - 'app/services/projects/update_service.rb'
+ - 'app/services/protected_branches/update_service.rb'
+ - 'app/services/quick_actions/target_service.rb'
+ - 'app/services/repository_archive_clean_up_service.rb'
+ - 'app/services/resource_access_tokens/create_service.rb'
+ - 'app/services/resource_access_tokens/revoke_service.rb'
+ - 'app/services/resource_events/change_labels_service.rb'
+ - 'app/services/search/global_service.rb'
+ - 'app/services/search_service.rb'
+ - 'app/services/security/ci_configuration/container_scanning_create_service.rb'
+ - 'app/services/security/ci_configuration/dependency_scanning_create_service.rb'
+ - 'app/services/security/ci_configuration/sast_create_service.rb'
+ - 'app/services/security/ci_configuration/sast_iac_create_service.rb'
+ - 'app/services/security/ci_configuration/sast_parser_service.rb'
+ - 'app/services/security/ci_configuration/secret_detection_create_service.rb'
+ - 'app/services/service_ping/devops_report_service.rb'
+ - 'app/services/service_ping/submit_service.rb'
+ - 'app/services/snippets/count_service.rb'
+ - 'app/services/snippets/create_service.rb'
+ - 'app/services/spam/spam_action_service.rb'
+ - 'app/services/spam/spam_verdict_service.rb'
+ - 'app/services/system_note_service.rb'
+ - 'app/services/system_notes/issuables_service.rb'
+ - 'app/services/system_notes/zoom_service.rb'
+ - 'app/services/tags/destroy_service.rb'
+ - 'app/services/tasks_to_be_done/base_service.rb'
+ - 'app/services/two_factor/destroy_service.rb'
+ - 'app/services/users/approve_service.rb'
+ - 'app/services/users/banned_user_base_service.rb'
+ - 'app/services/users/build_service.rb'
+ - 'app/services/users/reject_service.rb'
+ - 'app/services/webauthn/authenticate_service.rb'
+ - 'app/services/work_items/task_list_reference_replacement_service.rb'
+ - 'app/uploaders/content_type_whitelist.rb'
+ - 'app/uploaders/job_artifact_uploader.rb'
+ - 'app/uploaders/packages/debian/component_file_uploader.rb'
+ - 'app/uploaders/personal_file_uploader.rb'
+ - 'app/validators/addressable_url_validator.rb'
+ - 'app/validators/array_members_validator.rb'
+ - 'app/validators/cron_freeze_period_timezone_validator.rb'
+ - 'app/validators/feature_flag_strategies_validator.rb'
+ - 'app/validators/feature_flag_user_xids_validator.rb'
+ - 'app/validators/nested_attributes_duplicates_validator.rb'
+ - 'app/views/projects/merge_requests/index.atom.builder'
+ - 'app/workers/analytics/usage_trends/counter_job_worker.rb'
+ - 'app/workers/background_migration/single_database_worker.rb'
+ - 'app/workers/clusters/applications/deactivate_service_worker.rb'
+ - 'app/workers/concerns/application_worker.rb'
+ - 'app/workers/concerns/each_shard_worker.rb'
+ - 'app/workers/concerns/limited_capacity/worker.rb'
+ - 'app/workers/concerns/project_import_options.rb'
+ - 'app/workers/concerns/worker_attributes.rb'
+ - 'app/workers/container_registry/migration/guard_worker.rb'
+ - 'app/workers/database/batched_background_migration/single_database_worker.rb'
+ - 'app/workers/error_tracking_issue_link_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/finish_import_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_notes_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_repository_worker.rb'
+ - 'app/workers/gitlab/import/stuck_import_job.rb'
+ - 'app/workers/gitlab/jira_import/stage/import_attachments_worker.rb'
+ - 'app/workers/gitlab/jira_import/stage/import_labels_worker.rb'
+ - 'app/workers/gitlab/jira_import/stage/import_notes_worker.rb'
+ - 'app/workers/integrations/create_external_cross_reference_worker.rb'
+ - 'app/workers/issuable_export_csv_worker.rb'
+ - 'app/workers/issue_rebalancing_worker.rb'
+ - 'app/workers/issues/rebalancing_worker.rb'
+ - 'app/workers/jira_connect/sync_branch_worker.rb'
+ - 'app/workers/jira_connect/sync_merge_request_worker.rb'
+ - 'app/workers/jira_connect/sync_project_worker.rb'
+ - 'app/workers/merge_request_mergeability_check_worker.rb'
+ - 'app/workers/object_storage/migrate_uploads_worker.rb'
+ - 'app/workers/packages/maven/metadata/sync_worker.rb'
+ - 'app/workers/personal_access_tokens/expired_notification_worker.rb'
+ - 'app/workers/pipeline_metrics_worker.rb'
+ - 'app/workers/quality/test_data_cleanup_worker.rb'
+ - 'app/workers/repository_fork_worker.rb'
+ - 'app/workers/repository_import_worker.rb'
+ - 'app/workers/ssh_keys/expired_notification_worker.rb'
+ - 'config/application.rb'
+ - 'config/initializers/00_rails_disable_joins.rb'
+ - 'config/initializers/01_secret_token.rb'
+ - 'config/initializers/0_marginalia.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'config/initializers/5_backend.rb'
+ - 'config/initializers/7_prometheus_metrics.rb'
+ - 'config/initializers/8_devise.rb'
+ - 'config/initializers/active_record_force_reconnects.rb'
+ - 'config/initializers/active_record_keyset_pagination.rb'
+ - 'config/initializers/active_record_schema_versions.rb'
+ - 'config/initializers/active_record_transaction_observer.rb'
+ - 'config/initializers/carrierwave_patch.rb'
+ - 'config/initializers/content_security_policy.rb'
+ - 'config/initializers/database_query_analyzers.rb'
+ - 'config/initializers/deprecations.rb'
+ - 'config/initializers/devise_dynamic_password_length_validation.rb'
+ - 'config/initializers/direct_upload_support.rb'
+ - 'config/initializers/doorkeeper.rb'
+ - 'config/initializers/elastic_client_setup.rb'
+ - 'config/initializers/google_api_client.rb'
+ - 'config/initializers/google_api_client_patch.rb'
+ - 'config/initializers/kaminari_active_record_relation_methods_with_limit.rb'
+ - 'config/initializers/pages_storage_check.rb'
+ - 'config/initializers/rails_host_authorization.rb'
+ - 'config/initializers/session_store.rb'
+ - 'config/initializers/sidekiq.rb'
+ - 'config/initializers/validate_database_config.rb'
+ - 'config/initializers/validate_puma.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'config/initializers/zz_metrics.rb'
+ - 'config/object_store_settings.rb'
+ - 'config/puma.rb'
+ - 'config/routes.rb'
+ - 'config/routes/admin.rb'
+ - 'config/routes/api.rb'
+ - 'config/routes/group.rb'
+ - 'config/routes/import.rb'
+ - 'config/routes/project.rb'
+ - 'config/routes/repository.rb'
+ - 'config/routes/uploads.rb'
+ - 'config/routes/user.rb'
+ - 'config/settings.rb'
+ - 'danger/ce_ee_vue_templates/Dangerfile'
+ - 'danger/ci_config/Dangerfile'
+ - 'danger/documentation/Dangerfile'
+ - 'danger/feature_flag/Dangerfile'
+ - 'danger/pajamas/Dangerfile'
+ - 'danger/roulette/Dangerfile'
+ - 'danger/vue_shared_documentation/Dangerfile'
+ - 'danger/z_metadata/Dangerfile'
+ - 'db/migrate/20210302103851_add_deployed_deployment_id_index_to_project_pages_metadata.rb'
+ - 'db/migrate/20210302155904_remove_index_for_security_orchestration_policy.rb'
+ - 'db/migrate/20210302160544_add_index_to_security_orchestration_policy.rb'
+ - 'db/migrate/20210305031822_create_dast_site_profile_variables.rb'
+ - 'db/migrate/20210305182855_create_ci_unit_test_failures.rb'
+ - 'db/migrate/20210313045845_add_verification_indexes_to_snippet_repositories.rb'
+ - 'db/migrate/20210316171009_create_packages_helm_file_metadata.rb'
+ - 'db/migrate/20210317035357_create_dast_profiles_pipelines.rb'
+ - 'db/migrate/20210317123054_add_throttle_package_registry_columns.rb'
+ - 'db/migrate/20210323131543_add_external_approval_rule_foreign_key_to_status_check_responses.rb'
+ - 'db/migrate/20210325152011_add_verification_indexes_to_ci_pipeline_artifacts.rb'
+ - 'db/migrate/20210326190903_create_vulnerability_finding_evidences.rb'
+ - 'db/migrate/20210409084242_create_index_on_notes_for_cherry_picked_merge_requests.rb'
+ - 'db/migrate/20210412111213_create_security_orchestration_policy_rule_schedule.rb'
+ - 'db/migrate/20210414133310_add_bulk_import_export_uploads_table.rb'
+ - 'db/migrate/20210415142700_add_url_limit_to_pipeline_validation.rb'
+ - 'db/migrate/20210415172516_create_vulnerability_finding_evidence_requests.rb'
+ - 'db/migrate/20210416172516_create_vulnerability_finding_evidence_responses.rb'
+ - 'db/migrate/20210420173030_add_verification_indexes_to_terraform_state_versions.rb'
+ - 'db/migrate/20210420210642_recreate_index_for_project_deployments_with_environment_id_and_date_at.rb'
+ - 'db/migrate/20210422142647_add_project_id_next_run_at_index_to_container_expiration_policies.rb'
+ - 'db/migrate/20210422195929_create_elastic_reindexing_slices.rb'
+ - 'db/migrate/20210423054022_create_dast_site_profiles_pipelines.rb'
+ - 'db/migrate/20210423054537_add_dast_site_profile_id_fk_to_dast_site_profiles_pipelines.rb'
+ - 'db/migrate/20210423054846_add_ci_pipeline_id_fk_to_dast_site_profiles_pipelines.rb'
+ - 'db/migrate/20210423171304_re_order_fk_source_project_id_in_merge_requests.rb'
+ - 'db/migrate/20210427062807_add_index_to_batched_migration_jobs_status.rb'
+ - 'db/migrate/20210427094931_add_execution_order_index_to_batched_background_migration_jobs.rb'
+ - 'db/migrate/20210429032320_add_escalation_rules.rb'
+ - 'db/migrate/20210505170152_add_verification_indexes_to_merge_request_diff_details_table.rb'
+ - 'db/migrate/20210506150833_create_vulnerability_finding_evidence_headers.rb'
+ - 'db/migrate/20210511104929_add_epic_board_recent_visits_table.rb'
+ - 'db/migrate/20210511165250_add_foreign_key_to_lfs_objects_projects.rb'
+ - 'db/migrate/20210512120122_add_pending_builds_table.rb'
+ - 'db/migrate/20210521073920_drop_devops_adoption_namespace_uniqueness.rb'
+ - 'db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb'
+ - 'db/migrate/20210527194558_create_ci_job_token_project_scope_links.rb'
+ - 'db/migrate/20210529164247_change_iterations_title_uniqueness_index.rb'
+ - 'db/migrate/20210601123341_add_running_builds_table.rb'
+ - 'db/migrate/20210601125410_add_runners_created_at_index.rb'
+ - 'db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb'
+ - 'db/migrate/20210601133459_replace_runners_contacted_at_index.rb'
+ - 'db/migrate/20210602122233_add_runners_description_index.rb'
+ - 'db/migrate/20210604032738_create_dast_site_profiles_builds.rb'
+ - 'db/migrate/20210604034354_add_dast_site_profile_id_fk_to_dast_site_profiles_builds.rb'
+ - 'db/migrate/20210604051330_create_dast_scanner_profiles_builds.rb'
+ - 'db/migrate/20210604051917_add_dast_scanner_profile_id_fk_to_dast_scanner_profiles_builds.rb'
+ - 'db/migrate/20210604085600_rename_status_check_responses_approval_rule.rb'
+ - 'db/migrate/20210609192728_add_status_check_foreign_key_to_external_status_check_id.rb'
+ - 'db/migrate/20210609193101_add_status_check_foreign_key_to_protected_branch_id.rb'
+ - 'db/migrate/20210614143954_add_unique_index_for_helm_packages.rb'
+ - 'db/migrate/20210617161348_cascade_delete_freeze_periods.rb'
+ - 'db/migrate/20210622135221_add_foreign_key_for_environment_id_to_environments.rb'
+ - 'db/migrate/20210623163342_add_index_to_compliance_management_frameworks_pipeline_configuration.rb'
+ - 'db/migrate/20210630224625_generate_customers_dot_jwt_signing_key.rb'
+ - 'db/migrate/20210705130919_create_container_repos_on_exp_cleanup_status_project_id_start_date_index.rb'
+ - 'db/migrate/20210706084713_add_devops_adoption_snapshots_index.rb'
+ - 'db/migrate/20210707151536_create_vulnerability_finding_evidence_sources.rb'
+ - 'db/migrate/20210707171536_create_vulnerability_finding_evidence_assets.rb'
+ - 'db/migrate/20210707181536_create_vulnerability_finding_evidence_supporting_messages.rb'
+ - 'db/migrate/20210709085759_index_batched_migration_jobs_by_max_value.rb'
+ - 'db/migrate/20210713070842_update_merge_request_cleanup_schedules_scheduled_at_index.rb'
+ - 'db/migrate/20210713211008_create_banned_users.rb'
+ - 'db/migrate/20210714043818_add_index_for_label_applied_to_issuable_sla.rb'
+ - 'db/migrate/20210721174441_update_escalation_rule_fk_for_pending_alert_escalations.rb'
+ - 'db/migrate/20210722074339_add_xor_check_constraint_for_escalation_rules.rb'
+ - 'db/migrate/20210729202143_create_incident_management_issuable_escalation_statuses.rb'
+ - 'db/migrate/20210730102952_add_stage_hash_fk_to_project_stages.rb'
+ - 'db/migrate/20210730103808_add_stage_hash_fk_to_group_stages.rb'
+ - 'db/migrate/20210803110920_add_unique_index_to_vulnerability_flags_table.rb'
+ - 'db/migrate/20210804150320_create_base_work_item_types.rb'
+ - 'db/migrate/20210804200114_create_customer_relations_organizations.rb'
+ - 'db/migrate/20210804202057_add_tmp_index_approval_project_rules_scanners.rb'
+ - 'db/migrate/20210811120204_create_customer_relations_contacts.rb'
+ - 'db/migrate/20210811193033_add_unique_index_to_vulnerability_finding_links.rb'
+ - 'db/migrate/20210812171704_create_project_ci_feature_usages.rb'
+ - 'db/migrate/20210817130415_add_project_id_name_version_id_to_npm_packages.rb'
+ - 'db/migrate/20210819120243_add_throttle_files_api_columns.rb'
+ - 'db/migrate/20210819152723_remove_tmp_index_approval_project_rules_scanners.rb'
+ - 'db/migrate/20210819185500_create_external_audit_event_destinations_table.rb'
+ - 'db/migrate/20210820171834_add_foreign_keys_for_pending_issue_escalations.rb'
+ - 'db/migrate/20210823213417_create_dependency_proxy_image_ttl_group_policies.rb'
+ - 'db/migrate/20210826124311_add_index_to_error_tracking_error.rb'
+ - 'db/migrate/20210826170902_add_throttle_unauthenticated_api_columns.rb'
+ - 'db/migrate/20210830085837_add_throttle_authenticated_git_lfs_columns.rb'
+ - 'db/migrate/20210831203408_upsert_base_work_item_types.rb'
+ - 'db/migrate/20210908140437_add_sidekiq_limits_to_application_settings.rb'
+ - 'db/migrate/20210909184349_add_index_package_id_id_on_package_files.rb'
+ - 'db/migrate/20210910015047_add_app_settings_dep_proxy_ttl_worker_capacity_check_constraint.rb'
+ - 'db/migrate/20210913224558_update_dependency_proxy_manifests_uniqueness_constraint.rb'
+ - 'db/migrate/20210914145810_add_throttle_deprecated_api_columns.rb'
+ - 'db/migrate/20210917153905_remove_pipeline_fk_from_packages_package_file_build_infos.rb'
+ - 'db/migrate/20210921063924_index_labels_using_varchar_pattern_ops.rb'
+ - 'db/migrate/20210928155022_improve_index_for_error_tracking.rb'
+ - 'db/migrate/20210929031049_add_unique_index_phone_on_user_details.rb'
+ - 'db/migrate/20210929115340_add_security_policy_configurations_management_project_id_foreign_key.rb'
+ - 'db/migrate/20210930081208_fix_deprecated_api_throttle_defaults.rb'
+ - 'db/migrate/20211005093558_add_range_partitioned_loose_fk_table.rb'
+ - 'db/migrate/20211006103122_change_helm_channel_length.rb'
+ - 'db/migrate/20211011004242_create_content_blocked_states.rb'
+ - 'db/migrate/20211013014228_add_content_validation_endpoint_to_application_settings.rb'
+ - 'db/migrate/20211013192749_add_states_into_approval_project_rules.rb'
+ - 'db/migrate/20211028132247_create_packages_npm_metadata.rb'
+ - 'db/migrate/20211101165656_create_upload_states.rb'
+ - 'db/migrate/20211110015252_add_agent_activity_events_foreign_keys.rb'
+ - 'db/migrate/20211111112425_create_merge_requests_compliance_violations.rb'
+ - 'db/migrate/20211116093739_add_foreign_key_to_incident_management_timeline_events_on_updated_by_user.rb'
+ - 'db/migrate/20211117174209_create_vulnerability_reads.rb'
+ - 'db/migrate/20211119111006_create_job_artifact_states.rb'
+ - 'db/migrate/20211119154221_create_pages_deployment_states.rb'
+ - 'db/migrate/20211126042235_add_sequence_column_to_sprints_table.rb'
+ - 'db/migrate/20211126115449_encrypt_static_objects_external_storage_auth_token.rb'
+ - 'db/migrate/20211130151724_add_foreign_key_to_incident_management_timeline_events_on_note.rb'
+ - 'db/migrate/20211130205719_add_uniqueness_for_evidence_occurrence_id.rb'
+ - 'db/migrate/20211201143042_create_lfs_object_states.rb'
+ - 'db/migrate/20211202094944_move_loose_fk_deleted_records_to_dynamic_schema.rb'
+ - 'db/migrate/20211207154413_add_ci_runners_index_on_created_at_where_active_is_false.rb'
+ - 'db/migrate/20211207154414_add_ci_runners_index_on_contacted_at_where_active_is_false.rb'
+ - 'db/migrate/20211216135651_add_index_to_cluster_agent_id.rb'
+ - 'db/migrate/20211217050753_remove_artifacts_archive_id_foreign_key_from_project_pages_metadata.rb'
+ - 'db/migrate/20220106230629_add_registry_migration_application_settings.rb'
+ - 'db/migrate/20220107091629_add_route_namespace_index.rb'
+ - 'db/migrate/20220111154951_add_index_to_ci_runners_token_expires_at.rb'
+ - 'db/migrate/20220112232605_add_member_namespace_index.rb'
+ - 'db/migrate/20220113125401_create_security_trainings.rb'
+ - 'db/migrate/20220118155846_add_runner_token_expiration_interval_settings_to_application_settings.rb'
+ - 'db/migrate/20220118155847_add_runner_token_expiration_interval_settings_to_namespace_settings.rb'
+ - 'db/migrate/20220119094023_add_unique_index_to_aed_verification_token.rb'
+ - 'db/migrate/20220120033115_create_alert_management_alert_metric_images.rb'
+ - 'db/migrate/20220120211831_temp_index_for_group_namespace_member_backfill.rb'
+ - 'db/migrate/20220125122725_add_topics_non_private_projects_count_index.rb'
+ - 'db/migrate/20220202115350_add_migration_indexes_to_container_repositories.rb'
+ - 'db/migrate/20220203091304_fix_unique_packages_index_excluding_pending_destruction_status.rb'
+ - 'db/migrate/20220204093120_create_analytics_cycle_analytics_aggregations.rb'
+ - 'db/migrate/20220207083129_add_users_get_by_id_limit_to_application_setting.rb'
+ - 'db/migrate/20220208171826_update_default_scan_method_of_dast_site_profile.rb'
+ - 'db/migrate/20220215164709_update_application_settings_container_registry_exp_pol_worker_capacity_default.rb'
+ - 'db/migrate/20220216110023_create_saved_replies.rb'
+ - 'db/migrate/20220217100008_add_container_registry_expiration_policies_caching_to_application_settings.rb'
+ - 'db/migrate/20220221102333_change_maintenance_note_limit_in_ci_runner.rb db/migrate/20220221102333_change_maintainer_note_limit_in_ci_runner.rb'
+ - 'db/migrate/20220222072536_add_target_access_levels_to_broadcast_messages.rb'
+ - 'db/migrate/20220301003502_add_security_orchestration_policy_configuration_namespace_index.rb'
+ - 'db/migrate/20220301175104_change_security_orchestration_policy_configuration_project_index.rb'
+ - 'db/migrate/20220304062107_remove_unique_index_for_sprints_on_project_id_and_title.rb'
+ - 'db/migrate/20220310101118_update_holder_name_limit.rb'
+ - 'db/migrate/20220314184209_add_group_fk_to_protected_environment_approval_rules.rb'
+ - 'db/migrate/20220314204009_add_approval_rule_fk_to_deployment_approvals.rb'
+ - 'db/optional_migrations/composite_primary_keys.rb'
+ - 'db/post_migrate/20210328214434_remove_temporary_index_from_vulnerabilities_table.rb'
+ - 'db/post_migrate/20210401131948_move_container_registry_enabled_to_project_features2.rb'
+ - 'db/post_migrate/20210402005225_add_source_and_level_index_on_notification_settings.rb'
+ - 'db/post_migrate/20210407150240_confirm_support_bot_user.rb'
+ - 'db/post_migrate/20210415155043_move_container_registry_enabled_to_project_features3.rb'
+ - 'db/post_migrate/20210430121542_backfill_ci_build_trace_sections_for_bigint_conversion.rb'
+ - 'db/post_migrate/20210505092746_create_partial_covering_index_for_pending_builds.rb'
+ - 'db/post_migrate/20210513163904_cleanup_move_container_registry_enabled_to_project_feature.rb'
+ - 'db/post_migrate/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects.rb'
+ - 'db/post_migrate/20210526160133_remove_segment_selections_table.rb'
+ - 'db/post_migrate/20210606143426_add_index_for_container_registry_access_level.rb'
+ - 'db/post_migrate/20210611080951_fix_missing_traversal_ids.rb'
+ - 'db/post_migrate/20210615234935_fix_batched_migrations_old_format_job_arguments.rb'
+ - 'db/post_migrate/20210621111747_add_ci_artifacts_devops_adoption_index.rb'
+ - 'db/post_migrate/20210622041846_finalize_push_event_payloads_bigint_conversion.rb'
+ - 'db/post_migrate/20210622045705_finalize_events_bigint_conversion.rb'
+ - 'db/post_migrate/20210622141148_schedule_delete_orphaned_deployments.rb'
+ - 'db/post_migrate/20210629101712_remove_deprecated_modsecurity_columns.rb'
+ - 'db/post_migrate/20210701033622_finalize_ci_builds_needs_bigint_conversion.rb'
+ - 'db/post_migrate/20210701111909_backfill_issues_upvotes_count.rb'
+ - 'db/post_migrate/20210701141346_finalize_ci_builds_stage_id_bigint_conversion.rb'
+ - 'db/post_migrate/20210706212710_finalize_ci_job_artifacts_bigint_conversion.rb'
+ - 'db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb'
+ - 'db/post_migrate/20210708011426_finalize_ci_builds_metadata_bigint_conversion.rb'
+ - 'db/post_migrate/20210713042153_finalize_ci_sources_pipelines_bigint_conversion.rb'
+ - 'db/post_migrate/20210714015537_finalize_ci_build_trace_chunks_bigint_conversion.rb'
+ - 'db/post_migrate/20210721174521_add_non_null_constraint_for_escalation_rule_on_pending_alert_escalations.rb'
+ - 'db/post_migrate/20210722155635_finalize_convert_geo_job_artifact_deleted_events_bigint.rb'
+ - 'db/post_migrate/20210729163312_re_schedule_latest_pipeline_id_population_with_all_security_related_artifact_types.rb'
+ - 'db/post_migrate/20210729192959_drop_ci_test_case_failures_table.rb'
+ - 'db/post_migrate/20210731132939_backfill_stage_event_hash.rb'
+ - 'db/post_migrate/20210802043253_finalize_push_event_payloads_bigint_conversion_3.rb'
+ - 'db/post_migrate/20210802131812_finalize_convert_deployments_bigint.rb'
+ - 'db/post_migrate/20210804150624_remove_cluster_image_scanning_from_approval_project_rules.rb'
+ - 'db/post_migrate/20210804153307_prepare_indexes_for_tagging_bigint_conversion.rb'
+ - 'db/post_migrate/20210805131510_finalize_ci_builds_runner_session_bigint_conversion.rb'
+ - 'db/post_migrate/20210806131706_finalize_taggins_bigint_conversion.rb'
+ - 'db/post_migrate/20210809123658_orphaned_invite_tokens_cleanup.rb'
+ - 'db/post_migrate/20210809143931_finalize_job_id_conversion_to_bigint_for_ci_job_artifacts.rb'
+ - 'db/post_migrate/20210811122206_update_external_project_bots.rb'
+ - 'db/post_migrate/20210813151908_replace_external_wiki_triggers.rb'
+ - 'db/post_migrate/20210824174615_prepare_ci_builds_metadata_and_ci_build_async_indexes.rb'
+ - 'db/post_migrate/20210825193652_backfill_cadence_id_for_boards_scoped_to_iteration.rb'
+ - 'db/post_migrate/20210901184511_prepare_async_indexes_for_ci_builds.rb'
+ - 'db/post_migrate/20210907211557_finalize_ci_builds_bigint_conversion.rb'
+ - 'db/post_migrate/20210923135909_remove_delayed_project_removal_from_namespaces.rb'
+ - 'db/post_migrate/20210927153807_update_issues_relative_position_indexes.rb'
+ - 'db/post_migrate/20211007093340_remove_analytics_snapshots_segment_id_column.rb'
+ - 'db/post_migrate/20211012155931_remove_schedule_and_status_from_pending_alert_escalations.rb'
+ - 'db/post_migrate/20211021140426_remove_geo_upload_deprecated_fields.rb'
+ - 'db/post_migrate/20211031152417_add_indexes_to_issue_stage_events.rb'
+ - 'db/post_migrate/20211031154919_add_indexes_to_merge_request_stage_events.rb'
+ - 'db/post_migrate/20211104165220_remove_vulnerability_finding_links.rb'
+ - 'db/post_migrate/20211105135157_drop_ci_build_trace_sections.rb'
+ - 'db/post_migrate/20211112113300_remove_ci_pipeline_chat_data_fk_on_chat_names.rb'
+ - 'db/post_migrate/20211118194239_drop_invalid_remediations.rb'
+ - 'db/post_migrate/20211201101541_drop_clusters_applications_runners_ci_runners_fk.rb'
+ - 'db/post_migrate/20211206162601_cleanup_after_add_primary_email_to_emails_if_user_confirmed.rb'
+ - 'db/post_migrate/20211207173510_remove_extra_finding_evidence_tables_foreign_keys.rb'
+ - 'db/post_migrate/20211207173511_remove_extra_finding_evidence_tables.rb'
+ - 'db/post_migrate/20211209103048_backfill_project_namespaces_for_group.rb'
+ - 'db/post_migrate/20211210140000_add_temporary_static_object_token_index.rb'
+ - 'db/post_migrate/20211210173137_remove_vulnerability_finding_links_again.rb'
+ - 'db/post_migrate/20211213102111_drop_ci_pipelines_mr_metrics_fk.rb'
+ - 'db/post_migrate/20211220120402_add_index_on_ci_pipelines_user_id_id_failure_reason.rb'
+ - 'db/post_migrate/20220104060049_remove_foreign_key_ci_group_variables_group_id.rb'
+ - 'db/post_migrate/20220105020514_remove_ci_minutes_additional_packs_namespace_id_foreign_key_constraint.rb'
+ - 'db/post_migrate/20220106231518_remove_foreign_key_ci_daily_build_group_report_results_group_id.rb'
+ - 'db/post_migrate/20220106233459_remove_foreign_key_ci_pending_builds_namespace_id.rb'
+ - 'db/post_migrate/20220106235626_remove_foreign_key_ci_runner_namespaces_namespace_id.rb'
+ - 'db/post_migrate/20220110224913_remove_dast_scanner_profiles_builds_ci_build_id_fk.rb'
+ - 'db/post_migrate/20220110231420_remove_requirements_management_test_reports_build_id_fk.rb'
+ - 'db/post_migrate/20220110233155_remove_dast_site_profiles_builds_ci_build_id_fk.rb'
+ - 'db/post_migrate/20220111002756_remove_security_scans_build_id_fk.rb'
+ - 'db/post_migrate/20220111221516_remove_projects_ci_pending_builds_fk.rb'
+ - 'db/post_migrate/20220112015940_remove_projects_ci_running_builds_fk.rb'
+ - 'db/post_migrate/20220112230642_remove_projects_ci_unit_tests_project_id_fk.rb'
+ - 'db/post_migrate/20220112232723_remove_projects_ci_daily_build_group_report_results_project_id_fk.rb'
+ - 'db/post_migrate/20220113013319_remove_projects_ci_freeze_periods_project_id_fk.rb'
+ - 'db/post_migrate/20220113014438_remove_projects_ci_resource_groups_project_id_fk.rb'
+ - 'db/post_migrate/20220113015830_remove_projects_ci_build_report_results_project_id_fk.rb'
+ - 'db/post_migrate/20220113035519_remove_users_ci_job_token_project_scope_links_added_by_id_fk.rb'
+ - 'db/post_migrate/20220113040447_remove_users_ci_pipeline_schedules_owner_id_fk.rb'
+ - 'db/post_migrate/20220113111440_schedule_fix_incorrect_max_seats_used.rb'
+ - 'db/post_migrate/20220119141736_remove_projects_ci_pipeline_artifacts_project_id_fk.rb'
+ - 'db/post_migrate/20220119143130_remove_projects_ci_sources_pipelines_source_project_id_fk.rb'
+ - 'db/post_migrate/20220119144458_remove_users_ci_triggers_owner_id_fk.rb'
+ - 'db/post_migrate/20220119151221_remove_merge_requests_ci_pipelines_merge_request_id_fk.rb'
+ - 'db/post_migrate/20220119153706_remove_ci_pipelines_merge_trains_pipeline_id_fk.rb'
+ - 'db/post_migrate/20220119154442_remove_ci_pipelines_merge_requests_head_pipeline_id_fk.rb'
+ - 'db/post_migrate/20220119193130_remove_ci_pipelines_dast_profiles_pipelines_ci_pipeline_id_fk.rb'
+ - 'db/post_migrate/20220119201340_remove_ci_pipelines_vulnerability_statistics_latest_pipeline_id_fk.rb'
+ - 'db/post_migrate/20220119203119_remove_ci_pipelines_vulnerability_occurrence_pipelines_pipeline_id_fk.rb'
+ - 'db/post_migrate/20220120123700_add_tmp_index_routes_id_for_namespaces.rb'
+ - 'db/post_migrate/20220121214752_remove_projects_ci_stages_project_id_fk.rb'
+ - 'db/post_migrate/20220121221651_remove_projects_ci_variables_project_id_fk.rb'
+ - 'db/post_migrate/20220124130028_dedup_runner_projects.rb'
+ - 'db/post_migrate/20220124145019_remove_projects_external_pull_requests_project_id_fk.rb'
+ - 'db/post_migrate/20220124151456_remove_projects_ci_triggers_project_id_fk.rb'
+ - 'db/post_migrate/20220124151949_remove_projects_ci_runner_projects_project_id_fk.rb'
+ - 'db/post_migrate/20220124152824_remove_projects_ci_subscriptions_projects_downstream_project_id_fk.rb'
+ - 'db/post_migrate/20220124153233_remove_projects_ci_job_artifacts_project_id_fk.rb'
+ - 'db/post_migrate/20220124180704_remove_projects_ci_builds_metadata_project_id_fk.rb'
+ - 'db/post_migrate/20220124184338_remove_projects_ci_subscriptions_projects_upstream_project_id_fk.rb'
+ - 'db/post_migrate/20220124204046_remove_projects_ci_sources_pipelines_project_id_fk.rb'
+ - 'db/post_migrate/20220124214131_remove_projects_ci_refs_project_id_fk.rb'
+ - 'db/post_migrate/20220124215857_remove_projects_ci_job_token_project_scope_links_source_project_id_fk.rb'
+ - 'db/post_migrate/20220124221521_remove_projects_ci_project_monthly_usages_project_id_fk.rb'
+ - 'db/post_migrate/20220125083520_remove_ci_pipelines_dast_site_profiles_pipelines_ci_pipeline_id_fk.rb'
+ - 'db/post_migrate/20220125084348_remove_ci_pipelines_vulnerability_feedback_pipeline_id_fk.rb'
+ - 'db/post_migrate/20220126201752_remove_projects_ci_job_token_project_scope_links_target_project_id_fk.rb'
+ - 'db/post_migrate/20220126202654_remove_projects_ci_sources_projects_source_project_id_fk.rb'
+ - 'db/post_migrate/20220126203421_remove_projects_ci_pipeline_schedules_project_id_fk.rb'
+ - 'db/post_migrate/20220126210021_remove_projects_ci_builds_project_id_fk.rb'
+ - 'db/post_migrate/20220126210657_remove_projects_ci_pipelines_project_id_fk.rb'
+ - 'db/post_migrate/20220128155814_fix_approval_rules_code_owners_rule_type_index.rb'
+ - 'db/post_migrate/20220131000000_index_job_artifacts_on_trace_type_and_expire_at.rb'
+ - 'db/post_migrate/20220201193033_add_unique_index_to_vulnerability_finding_links_with_truncate.rb'
+ - 'db/post_migrate/20220207080758_update_api_indexes_for_projects.rb'
+ - 'db/post_migrate/20220212120735_schedule_fix_incorrect_max_seats_used2.rb'
+ - 'db/post_migrate/20220224000000_async_build_trace_expire_at_index.rb'
+ - 'db/post_migrate/20220305223212_add_security_training_providers.rb'
+ - 'db/post_migrate/20220307192610_remove_duplicate_project_tag_releases.rb'
+ - 'db/post_migrate/20220308115219_schedule_reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb'
+ - 'db/post_migrate/20220308115502_schedule_reset_duplicate_ci_runners_token_values_on_projects.rb'
+ - 'db/post_migrate/20220315171027_add_tmp_index_to_support_leaky_regex_cleanup.rb'
+ - 'db/post_migrate/20220316102902_add_user_foreign_key_to_deploy_tokens.rb'
+ - 'db/post_migrate/20220317161914_remove_ci_runners_ci_builds_runner_id_fk.rb'
+ - 'db/post_migrate/20220318111729_cleanup_after_fixing_issue_when_admin_changed_primary_email.rb'
+ - 'db/post_migrate/20220322205008_change_search_rate_limit_values.rb'
+ - 'db/post_migrate/20220323130000_add_temp_index_on_null_project_namespace_ids.rb'
+ - 'ee/app/controllers/admin/elasticsearch_controller.rb'
+ - 'ee/app/controllers/admin/geo/application_controller.rb'
+ - 'ee/app/controllers/admin/geo/projects_controller.rb'
+ - 'ee/app/controllers/admin/licenses_controller.rb'
+ - 'ee/app/controllers/concerns/audit_events/audit_logs_params.rb'
+ - 'ee/app/controllers/concerns/audit_events/date_range.rb'
+ - 'ee/app/controllers/concerns/credentials_inventory_actions.rb'
+ - 'ee/app/controllers/concerns/ee/issuable_collections.rb'
+ - 'ee/app/controllers/concerns/group_invite_members.rb'
+ - 'ee/app/controllers/concerns/insights_actions.rb'
+ - 'ee/app/controllers/concerns/registrations/create_project.rb'
+ - 'ee/app/controllers/ee/admin/dev_ops_report_controller.rb'
+ - 'ee/app/controllers/ee/admin/users_controller.rb'
+ - 'ee/app/controllers/ee/application_controller.rb'
+ - 'ee/app/controllers/ee/groups/group_members_controller.rb'
+ - 'ee/app/controllers/ee/groups_controller.rb'
+ - 'ee/app/controllers/ee/projects/deploy_tokens_controller.rb'
+ - 'ee/app/controllers/ee/projects/pipelines_controller.rb'
+ - 'ee/app/controllers/ee/projects/settings/operations_controller.rb'
+ - 'ee/app/controllers/ee/projects/settings/repository_controller.rb'
+ - 'ee/app/controllers/ee/projects_controller.rb'
+ - 'ee/app/controllers/ee/repositories/git_http_client_controller.rb'
+ - 'ee/app/controllers/ee/repositories/git_http_controller.rb'
+ - 'ee/app/controllers/ee/repositories/lfs_api_controller.rb'
+ - 'ee/app/controllers/ee/search_controller.rb'
+ - 'ee/app/controllers/ee/sessions_controller.rb'
+ - 'ee/app/controllers/groups/analytics/cycle_analytics/stages_controller.rb'
+ - 'ee/app/controllers/groups/analytics/cycle_analytics/summary_controller.rb'
+ - 'ee/app/controllers/groups/analytics/cycle_analytics/value_streams_controller.rb'
+ - 'ee/app/controllers/groups/analytics/cycle_analytics_controller.rb'
+ - 'ee/app/controllers/groups/analytics/productivity_analytics_controller.rb'
+ - 'ee/app/controllers/groups/hooks_controller.rb'
+ - 'ee/app/controllers/groups/ldap_settings_controller.rb'
+ - 'ee/app/controllers/groups/omniauth_callbacks_controller.rb'
+ - 'ee/app/controllers/groups/saml_group_links_controller.rb'
+ - 'ee/app/controllers/groups/sso_controller.rb'
+ - 'ee/app/controllers/groups/usage_quotas_controller.rb'
+ - 'ee/app/controllers/oauth/geo_auth_controller.rb'
+ - 'ee/app/controllers/operations_controller.rb'
+ - 'ee/app/controllers/profiles/usage_quotas_controller.rb'
+ - 'ee/app/controllers/projects/audit_events_controller.rb'
+ - 'ee/app/controllers/projects/insights_controller.rb'
+ - 'ee/app/controllers/projects/integrations/zentao/issues_controller.rb'
+ - 'ee/app/controllers/projects/licenses_controller.rb'
+ - 'ee/app/controllers/projects/protected_environments_controller.rb'
+ - 'ee/app/controllers/projects/requirements_management/requirements_controller.rb'
+ - 'ee/app/controllers/projects/security/network_policies_controller.rb'
+ - 'ee/app/controllers/projects/security/policies_controller.rb'
+ - 'ee/app/controllers/projects/security/vulnerabilities/notes_controller.rb'
+ - 'ee/app/controllers/projects/threat_monitoring_controller.rb'
+ - 'ee/app/controllers/registrations/groups_controller.rb'
+ - 'ee/app/controllers/registrations/groups_projects_controller.rb'
+ - 'ee/app/controllers/subscriptions_controller.rb'
+ - 'ee/app/controllers/trial_registrations_controller.rb'
+ - 'ee/app/controllers/trials_controller.rb'
+ - 'ee/app/enums/vulnerabilities/dismissal_reason_enum.rb'
+ - 'ee/app/finders/compliance_management/merge_requests/compliance_violations_finder.rb'
+ - 'ee/app/finders/incident_management/escalation_rules_finder.rb'
+ - 'ee/app/finders/iterations_finder.rb'
+ - 'ee/app/finders/merge_requests/by_approvers_finder.rb'
+ - 'ee/app/finders/projects/integrations/jira/by_ids_finder.rb'
+ - 'ee/app/finders/projects/integrations/jira/issues_finder.rb'
+ - 'ee/app/finders/security/findings_finder.rb'
+ - 'ee/app/finders/security/pipeline_vulnerabilities_finder.rb'
+ - 'ee/app/finders/security/vulnerabilities_finder.rb'
+ - 'ee/app/graphql/ee/mutations/boards/lists/create.rb'
+ - 'ee/app/graphql/ee/mutations/ci/runner/update.rb'
+ - 'ee/app/graphql/ee/mutations/issues/create.rb'
+ - 'ee/app/graphql/ee/resolvers/base_issues_resolver.rb'
+ - 'ee/app/graphql/ee/types/deprecated_mutations.rb'
+ - 'ee/app/graphql/ee/types/group_type.rb'
+ - 'ee/app/graphql/ee/types/merge_request_type.rb'
+ - 'ee/app/graphql/ee/types/project_type.rb'
+ - 'ee/app/graphql/ee/types/query_type.rb'
+ - 'ee/app/graphql/mutations/analytics/devops_adoption/enabled_namespaces/bulk_enable.rb'
+ - 'ee/app/graphql/mutations/audit_events/external_audit_event_destinations/create.rb'
+ - 'ee/app/graphql/mutations/audit_events/external_audit_event_destinations/update.rb'
+ - 'ee/app/graphql/mutations/boards/epic_boards/epic_move_list.rb'
+ - 'ee/app/graphql/mutations/boards/scoped_issue_board_arguments.rb'
+ - 'ee/app/graphql/mutations/compliance_management/frameworks/destroy.rb'
+ - 'ee/app/graphql/mutations/concerns/mutations/shared_epic_arguments.rb'
+ - 'ee/app/graphql/mutations/dast/profiles/create.rb'
+ - 'ee/app/graphql/mutations/dast/profiles/update.rb'
+ - 'ee/app/graphql/mutations/dast_scanner_profiles/create.rb'
+ - 'ee/app/graphql/mutations/dast_scanner_profiles/update.rb'
+ - 'ee/app/graphql/mutations/dast_site_profiles/create.rb'
+ - 'ee/app/graphql/mutations/dast_site_profiles/update.rb'
+ - 'ee/app/graphql/mutations/epic_tree/reorder.rb'
+ - 'ee/app/graphql/mutations/incident_management/oncall_rotation/base.rb'
+ - 'ee/app/graphql/mutations/incident_management/oncall_rotation/create.rb'
+ - 'ee/app/graphql/mutations/incident_management/oncall_rotation/update.rb'
+ - 'ee/app/graphql/mutations/instance_security_dashboard/remove_project.rb'
+ - 'ee/app/graphql/mutations/iterations/create.rb'
+ - 'ee/app/graphql/mutations/iterations/update.rb'
+ - 'ee/app/graphql/mutations/security/training_provider_update.rb'
+ - 'ee/app/graphql/mutations/security_policy/assign_security_policy_project.rb'
+ - 'ee/app/graphql/mutations/security_policy/commit_scan_execution_policy.rb'
+ - 'ee/app/graphql/mutations/vulnerabilities/create.rb'
+ - 'ee/app/graphql/mutations/vulnerabilities/create_external_issue_link.rb'
+ - 'ee/app/graphql/resolvers/admin/cloud_licenses/subscription_future_entries_resolver.rb'
+ - 'ee/app/graphql/resolvers/app_sec/dast/profile_resolver.rb'
+ - 'ee/app/graphql/resolvers/board_groupings/epics_resolver.rb'
+ - 'ee/app/graphql/resolvers/boards/epic_lists_resolver.rb'
+ - 'ee/app/graphql/resolvers/ci/code_coverage_activities_resolver.rb'
+ - 'ee/app/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver.rb'
+ - 'ee/app/graphql/resolvers/concerns/resolves_orchestration_policy.rb'
+ - 'ee/app/graphql/resolvers/dora_metrics_resolver.rb'
+ - 'ee/app/graphql/resolvers/epics_resolver.rb'
+ - 'ee/app/graphql/resolvers/external_issue_resolver.rb'
+ - 'ee/app/graphql/resolvers/incident_management/oncall_rotations_resolver.rb'
+ - 'ee/app/graphql/resolvers/incident_management/oncall_schedule_resolver.rb'
+ - 'ee/app/graphql/resolvers/iterations/cadences_resolver.rb'
+ - 'ee/app/graphql/resolvers/iterations_resolver.rb'
+ - 'ee/app/graphql/resolvers/network_policy_resolver.rb'
+ - 'ee/app/graphql/resolvers/security_orchestration/scan_execution_policy_resolver.rb'
+ - 'ee/app/graphql/resolvers/security_report_summary_resolver.rb'
+ - 'ee/app/graphql/resolvers/timebox_report_resolver.rb'
+ - 'ee/app/graphql/resolvers/vulnerabilities_count_per_day_resolver.rb'
+ - 'ee/app/graphql/resolvers/vulnerabilities_resolver.rb'
+ - 'ee/app/graphql/resolvers/vulnerability_severities_count_resolver.rb'
+ - 'ee/app/graphql/types/analytics/devops_adoption/enabled_namespace_type.rb'
+ - 'ee/app/graphql/types/approval_rule_type.rb'
+ - 'ee/app/graphql/types/ci/code_quality_degradation_type.rb'
+ - 'ee/app/graphql/types/compliance_management/compliance_framework_input_type.rb'
+ - 'ee/app/graphql/types/compliance_management/compliance_framework_type.rb'
+ - 'ee/app/graphql/types/compliance_management/merge_requests/compliance_violation_sort_enum.rb'
+ - 'ee/app/graphql/types/dast_scan_type_enum.rb'
+ - 'ee/app/graphql/types/dast_scanner_profile_type.rb'
+ - 'ee/app/graphql/types/dast_site_profile_type.rb'
+ - 'ee/app/graphql/types/dora_metric_type_enum.rb'
+ - 'ee/app/graphql/types/epic_health_status_type.rb'
+ - 'ee/app/graphql/types/epic_sort_enum.rb'
+ - 'ee/app/graphql/types/epic_type.rb'
+ - 'ee/app/graphql/types/geo/geo_node_type.rb'
+ - 'ee/app/graphql/types/geo/registry_type.rb'
+ - 'ee/app/graphql/types/geo/terraform_state_version_registry_type.rb'
+ - 'ee/app/graphql/types/incident_management/escalation_rule_status_enum.rb'
+ - 'ee/app/graphql/types/incident_management/escalation_rule_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_participant_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_user_input_type.rb'
+ - 'ee/app/graphql/types/instance_security_dashboard_type.rb'
+ - 'ee/app/graphql/types/iteration_sort_enum.rb'
+ - 'ee/app/graphql/types/iteration_type.rb'
+ - 'ee/app/graphql/types/merge_requests/approval_state_type.rb'
+ - 'ee/app/graphql/types/network_policy_type.rb'
+ - 'ee/app/graphql/types/scanned_resource_type.rb'
+ - 'ee/app/graphql/types/security/training_url_request_status_enum.rb'
+ - 'ee/app/graphql/types/security_orchestration/orchestration_policy_type.rb'
+ - 'ee/app/graphql/types/security_report_summary_section_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities_count_by_day_type.rb'
+ - 'ee/app/graphql/types/vulnerability/external_issue_link_external_tracker_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_confidence_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_detail_type.rb'
+ - 'ee/app/graphql/types/vulnerability_request_type.rb'
+ - 'ee/app/graphql/types/vulnerability_type.rb'
+ - 'ee/app/helpers/admin/emails_helper.rb'
+ - 'ee/app/helpers/admin/ip_restriction_helper.rb'
+ - 'ee/app/helpers/admin/repo_size_limit_helper.rb'
+ - 'ee/app/helpers/analytics/code_review_helper.rb'
+ - 'ee/app/helpers/billing_plans_helper.rb'
+ - 'ee/app/helpers/ee/application_helper.rb'
+ - 'ee/app/helpers/ee/application_settings_helper.rb'
+ - 'ee/app/helpers/ee/button_helper.rb'
+ - 'ee/app/helpers/ee/environments_helper.rb'
+ - 'ee/app/helpers/ee/feature_flags_helper.rb'
+ - 'ee/app/helpers/ee/geo_helper.rb'
+ - 'ee/app/helpers/ee/groups/analytics/cycle_analytics_helper.rb'
+ - 'ee/app/helpers/ee/groups/settings_helper.rb'
+ - 'ee/app/helpers/ee/groups_helper.rb'
+ - 'ee/app/helpers/ee/import_helper.rb'
+ - 'ee/app/helpers/ee/integrations_helper.rb'
+ - 'ee/app/helpers/ee/issues_helper.rb'
+ - 'ee/app/helpers/ee/labels_helper.rb'
+ - 'ee/app/helpers/ee/lock_helper.rb'
+ - 'ee/app/helpers/ee/merge_requests_helper.rb'
+ - 'ee/app/helpers/ee/mirror_helper.rb'
+ - 'ee/app/helpers/ee/nav/top_nav_helper.rb'
+ - 'ee/app/helpers/ee/notes_helper.rb'
+ - 'ee/app/helpers/ee/personal_access_tokens_helper.rb'
+ - 'ee/app/helpers/ee/profiles_helper.rb'
+ - 'ee/app/helpers/ee/projects_helper.rb'
+ - 'ee/app/helpers/ee/search_helper.rb'
+ - 'ee/app/helpers/ee/subscribable_banner_helper.rb'
+ - 'ee/app/helpers/ee/trial_helper.rb'
+ - 'ee/app/helpers/ee/users/callouts_helper.rb'
+ - 'ee/app/helpers/epics_helper.rb'
+ - 'ee/app/helpers/gitlab_subscriptions/upcoming_reconciliation_helper.rb'
+ - 'ee/app/helpers/groups/feature_discovery_moments_helper.rb'
+ - 'ee/app/helpers/groups/security_features_helper.rb'
+ - 'ee/app/helpers/groups/sso_helper.rb'
+ - 'ee/app/helpers/license_helper.rb'
+ - 'ee/app/helpers/projects/on_demand_scans_helper.rb'
+ - 'ee/app/helpers/projects/security/api_fuzzing_configuration_helper.rb'
+ - 'ee/app/helpers/projects/security/dast_configuration_helper.rb'
+ - 'ee/app/helpers/projects/security/dast_profiles_helper.rb'
+ - 'ee/app/helpers/projects/security/discover_helper.rb'
+ - 'ee/app/helpers/projects/security/policies_helper.rb'
+ - 'ee/app/helpers/push_rules_helper.rb'
+ - 'ee/app/helpers/seats_count_alert_helper.rb'
+ - 'ee/app/helpers/security_helper.rb'
+ - 'ee/app/helpers/trial_status_widget_helper.rb'
+ - 'ee/app/helpers/vulnerabilities_helper.rb'
+ - 'ee/app/mailers/ee/emails/profile.rb'
+ - 'ee/app/mailers/ee/emails/projects.rb'
+ - 'ee/app/mailers/ee/preview/notify_preview.rb'
+ - 'ee/app/mailers/emails/namespace_storage_usage_mailer.rb'
+ - 'ee/app/models/analytics/cycle_analytics/group_stage.rb'
+ - 'ee/app/models/approval_merge_request_rule.rb'
+ - 'ee/app/models/approval_project_rule.rb'
+ - 'ee/app/models/approval_state.rb'
+ - 'ee/app/models/boards/epic_list.rb'
+ - 'ee/app/models/boards/epic_list_user_preference.rb'
+ - 'ee/app/models/compliance_management/compliance_framework/project_settings.rb'
+ - 'ee/app/models/concerns/approval_rule_like.rb'
+ - 'ee/app/models/concerns/approver_migrate_hook.rb'
+ - 'ee/app/models/concerns/ee/ci/artifactable.rb'
+ - 'ee/app/models/concerns/ee/issuable_link.rb'
+ - 'ee/app/models/concerns/ee/weight_eventable.rb'
+ - 'ee/app/models/concerns/elastic/application_versioned_search.rb'
+ - 'ee/app/models/concerns/elastic/repositories_search.rb'
+ - 'ee/app/models/concerns/geo/replicable_model.rb'
+ - 'ee/app/models/concerns/geo/verification_state.rb'
+ - 'ee/app/models/concerns/geo/verification_state_definition.rb'
+ - 'ee/app/models/concerns/issue_widgets/acts_like_requirement.rb'
+ - 'ee/app/models/concerns/security/scan_execution_policy.rb'
+ - 'ee/app/models/dast/profile.rb'
+ - 'ee/app/models/dast/profile_schedule.rb'
+ - 'ee/app/models/dast/site_profile_secret_variable.rb'
+ - 'ee/app/models/dora/lead_time_for_changes_metric.rb'
+ - 'ee/app/models/ee/alert_management/alert.rb'
+ - 'ee/app/models/ee/analytics/cycle_analytics/stage_event_hash.rb'
+ - 'ee/app/models/ee/application_setting.rb'
+ - 'ee/app/models/ee/ci/build.rb'
+ - 'ee/app/models/ee/ci/daily_build_group_report_result.rb'
+ - 'ee/app/models/ee/ci/job_artifact.rb'
+ - 'ee/app/models/ee/ci/pipeline.rb'
+ - 'ee/app/models/ee/container_repository.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/group.rb'
+ - 'ee/app/models/ee/integrations/jira.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/key.rb'
+ - 'ee/app/models/ee/lfs_object.rb'
+ - 'ee/app/models/ee/list.rb'
+ - 'ee/app/models/ee/member.rb'
+ - 'ee/app/models/ee/merge_request/metrics.rb'
+ - 'ee/app/models/ee/merge_request_diff.rb'
+ - 'ee/app/models/ee/milestone_release.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/namespace/root_storage_size.rb'
+ - 'ee/app/models/ee/packages/package_file.rb'
+ - 'ee/app/models/ee/pages_deployment.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/project_feature.rb'
+ - 'ee/app/models/ee/resource_label_event.rb'
+ - 'ee/app/models/ee/snippet_repository.rb'
+ - 'ee/app/models/ee/terraform/state_version.rb'
+ - 'ee/app/models/ee/upload.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/elastic/migration_record.rb'
+ - 'ee/app/models/elastic/reindexing_slice.rb'
+ - 'ee/app/models/epic_issue.rb'
+ - 'ee/app/models/geo/container_repository_registry.rb'
+ - 'ee/app/models/geo/project_registry.rb'
+ - 'ee/app/models/geo/secondary_usage_data.rb'
+ - 'ee/app/models/geo_node.rb'
+ - 'ee/app/models/geo_node_status.rb'
+ - 'ee/app/models/gitlab_subscription.rb'
+ - 'ee/app/models/gitlab_subscriptions/features.rb'
+ - 'ee/app/models/incident_management/escalation_policy.rb'
+ - 'ee/app/models/incident_management/oncall_rotation.rb'
+ - 'ee/app/models/incident_management/timeline_event.rb'
+ - 'ee/app/models/integrations/github.rb'
+ - 'ee/app/models/issuable_sla.rb'
+ - 'ee/app/models/iterations/cadence.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/app/models/merge_requests/compliance_violation.rb'
+ - 'ee/app/models/merge_requests/external_status_check.rb'
+ - 'ee/app/models/productivity_analytics.rb'
+ - 'ee/app/models/project_repository_state.rb'
+ - 'ee/app/models/protected_environment.rb'
+ - 'ee/app/models/requirements_management/requirement.rb'
+ - 'ee/app/models/requirements_management/test_report.rb'
+ - 'ee/app/models/security/orchestration_policy_configuration.rb'
+ - 'ee/app/models/security/training_provider.rb'
+ - 'ee/app/models/users_security_dashboard_project.rb'
+ - 'ee/app/models/vulnerabilities/external_issue_link.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/models/vulnerabilities/finding_identifier.rb'
+ - 'ee/app/models/vulnerabilities/finding_link.rb'
+ - 'ee/app/models/vulnerabilities/finding_pipeline.rb'
+ - 'ee/app/models/vulnerabilities/finding_remediation.rb'
+ - 'ee/app/models/vulnerabilities/flag.rb'
+ - 'ee/app/models/vulnerabilities/historical_statistic.rb'
+ - 'ee/app/models/vulnerabilities/identifier.rb'
+ - 'ee/app/models/vulnerabilities/issue_link.rb'
+ - 'ee/app/models/vulnerabilities/projects_grade.rb'
+ - 'ee/app/models/vulnerabilities/read.rb'
+ - 'ee/app/models/vulnerabilities/remediation.rb'
+ - 'ee/app/models/vulnerabilities/scanner.rb'
+ - 'ee/app/models/vulnerabilities/stat_diff.rb'
+ - 'ee/app/policies/ee/group_policy.rb'
+ - 'ee/app/policies/ee/identity_provider_policy.rb'
+ - 'ee/app/policies/ee/project_policy.rb'
+ - 'ee/app/presenters/dast/site_profile_presenter.rb'
+ - 'ee/app/presenters/ee/commit_status_presenter.rb'
+ - 'ee/app/presenters/ee/merge_request_presenter.rb'
+ - 'ee/app/serializers/dashboard_environment_entity.rb'
+ - 'ee/app/serializers/ee/environment_entity.rb'
+ - 'ee/app/serializers/ee/merge_request_poll_widget_entity.rb'
+ - 'ee/app/serializers/ee/merge_request_user_entity.rb'
+ - 'ee/app/serializers/ee/merge_request_widget_entity.rb'
+ - 'ee/app/serializers/ee/note_user_entity.rb'
+ - 'ee/app/serializers/ee/user_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/feedback_entity.rb'
+ - 'ee/app/services/alert_management/metric_images/upload_service.rb'
+ - 'ee/app/services/analytics/cycle_analytics/consistency_check_service.rb'
+ - 'ee/app/services/analytics/cycle_analytics/value_streams/create_service.rb'
+ - 'ee/app/services/analytics/devops_adoption/enabled_namespaces/find_or_create_service.rb'
+ - 'ee/app/services/analytics/devops_adoption/snapshots/calculate_and_save_service.rb'
+ - 'ee/app/services/app_sec/dast/builds/associate_service.rb'
+ - 'ee/app/services/app_sec/dast/profiles/build_config_service.rb'
+ - 'ee/app/services/app_sec/dast/profiles/create_associations_service.rb'
+ - 'ee/app/services/app_sec/dast/profiles/update_service.rb'
+ - 'ee/app/services/app_sec/dast/scan_configs/build_service.rb'
+ - 'ee/app/services/app_sec/dast/scanner_profiles/destroy_service.rb'
+ - 'ee/app/services/app_sec/dast/scanner_profiles/update_service.rb'
+ - 'ee/app/services/app_sec/dast/scans/create_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profile_secret_variables/create_or_update_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profile_secret_variables/destroy_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/destroy_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/update_service.rb'
+ - 'ee/app/services/app_sec/dast/site_validations/runner_service.rb'
+ - 'ee/app/services/audit_events/runner_audit_event_service.rb'
+ - 'ee/app/services/audit_events/runner_custom_audit_event_service.rb'
+ - 'ee/app/services/audit_events/user_impersonation_group_audit_event_service.rb'
+ - 'ee/app/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service.rb'
+ - 'ee/app/services/boards/epics/create_service.rb'
+ - 'ee/app/services/boards/epics/move_service.rb'
+ - 'ee/app/services/ci/compare_security_reports_service.rb'
+ - 'ee/app/services/ci/minutes/track_live_consumption_service.rb'
+ - 'ee/app/services/ci/sync_reports_to_approval_rules_service.rb'
+ - 'ee/app/services/compliance_management/frameworks/create_service.rb'
+ - 'ee/app/services/compliance_management/merge_requests/create_compliance_violations_service.rb'
+ - 'ee/app/services/concerns/incident_management/oncall_rotations/shared_rotation_logic.rb'
+ - 'ee/app/services/dashboard/projects/create_service.rb'
+ - 'ee/app/services/deployments/approval_service.rb'
+ - 'ee/app/services/dora/aggregate_metrics_service.rb'
+ - 'ee/app/services/ee/allowed_email_domains/update_service.rb'
+ - 'ee/app/services/ee/analytics/cycle_analytics/stages/base_service.rb'
+ - 'ee/app/services/ee/analytics/cycle_analytics/stages/list_service.rb'
+ - 'ee/app/services/ee/application_settings/update_service.rb'
+ - 'ee/app/services/ee/applications/create_service.rb'
+ - 'ee/app/services/ee/auth/container_registry_authentication_service.rb'
+ - 'ee/app/services/ee/boards/base_service.rb'
+ - 'ee/app/services/ee/ci/job_artifacts/destroy_batch_service.rb'
+ - 'ee/app/services/ee/ci/queue/build_queue_service.rb'
+ - 'ee/app/services/ee/ci/register_job_service.rb'
+ - 'ee/app/services/ee/ci/retry_pipeline_service.rb'
+ - 'ee/app/services/ee/groups/autocomplete_service.rb'
+ - 'ee/app/services/ee/groups/create_service.rb'
+ - 'ee/app/services/ee/groups/deploy_tokens/create_service.rb'
+ - 'ee/app/services/ee/groups/deploy_tokens/destroy_service.rb'
+ - 'ee/app/services/ee/groups/deploy_tokens/revoke_service.rb'
+ - 'ee/app/services/ee/groups/import_export/import_service.rb'
+ - 'ee/app/services/ee/groups/update_service.rb'
+ - 'ee/app/services/ee/ip_restrictions/update_service.rb'
+ - 'ee/app/services/ee/issuable/common_system_notes_service.rb'
+ - 'ee/app/services/ee/issues/base_service.rb'
+ - 'ee/app/services/ee/issues/clone_service.rb'
+ - 'ee/app/services/ee/issues/move_service.rb'
+ - 'ee/app/services/ee/merge_requests/base_service.rb'
+ - 'ee/app/services/ee/merge_requests/merge_base_service.rb'
+ - 'ee/app/services/ee/merge_requests/refresh_service.rb'
+ - 'ee/app/services/ee/notification_service.rb'
+ - 'ee/app/services/ee/personal_access_tokens/create_service.rb'
+ - 'ee/app/services/ee/personal_access_tokens/revoke_service.rb'
+ - 'ee/app/services/ee/projects/create_from_template_service.rb'
+ - 'ee/app/services/ee/projects/create_service.rb'
+ - 'ee/app/services/ee/projects/deploy_tokens/create_service.rb'
+ - 'ee/app/services/ee/projects/deploy_tokens/destroy_service.rb'
+ - 'ee/app/services/ee/projects/gitlab_projects_import_service.rb'
+ - 'ee/app/services/ee/projects/group_links/create_service.rb'
+ - 'ee/app/services/ee/projects/transfer_service.rb'
+ - 'ee/app/services/ee/projects/update_service.rb'
+ - 'ee/app/services/ee/protected_branches/api_service.rb'
+ - 'ee/app/services/ee/protected_branches/create_service.rb'
+ - 'ee/app/services/ee/protected_branches/update_service.rb'
+ - 'ee/app/services/ee/resource_access_tokens/create_service.rb'
+ - 'ee/app/services/ee/resource_events/change_labels_service.rb'
+ - 'ee/app/services/ee/system_note_service.rb'
+ - 'ee/app/services/ee/users/update_service.rb'
+ - 'ee/app/services/elastic/cluster_reindexing_service.rb'
+ - 'ee/app/services/elastic/indexing_control_service.rb'
+ - 'ee/app/services/epic_links/create_service.rb'
+ - 'ee/app/services/epic_links/list_service.rb'
+ - 'ee/app/services/epics/issue_promote_service.rb'
+ - 'ee/app/services/epics/update_service.rb'
+ - 'ee/app/services/external_status_checks/create_service.rb'
+ - 'ee/app/services/external_status_checks/dispatch_service.rb'
+ - 'ee/app/services/geo/blob_upload_service.rb'
+ - 'ee/app/services/geo/event_service.rb'
+ - 'ee/app/services/geo/file_registry_removal_service.rb'
+ - 'ee/app/services/geo/framework_repository_sync_service.rb'
+ - 'ee/app/services/geo/hashed_storage_attachments_migration_service.rb'
+ - 'ee/app/services/geo/hashed_storage_migration_service.rb'
+ - 'ee/app/services/geo/repository_base_sync_service.rb'
+ - 'ee/app/services/geo/request_service.rb'
+ - 'ee/app/services/geo/verification_state_backfill_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/plan_upgrade_service.rb'
+ - 'ee/app/services/group_saml/group_managed_accounts/transfer_membership_service.rb'
+ - 'ee/app/services/group_saml/saml_provider/base_service.rb'
+ - 'ee/app/services/group_saml/sign_up_service.rb'
+ - 'ee/app/services/groups/memberships/export_service.rb'
+ - 'ee/app/services/groups/sync_service.rb'
+ - 'ee/app/services/incident_management/create_incident_sla_exceeded_label_service.rb'
+ - 'ee/app/services/incident_management/escalation_policies/base_service.rb'
+ - 'ee/app/services/incident_management/incidents/upload_metric_service.rb'
+ - 'ee/app/services/incident_management/oncall_rotations/create_service.rb'
+ - 'ee/app/services/incident_management/oncall_rotations/edit_service.rb'
+ - 'ee/app/services/incident_management/oncall_schedules/update_service.rb'
+ - 'ee/app/services/incident_management/pending_escalations/process_service.rb'
+ - 'ee/app/services/issues/create_from_vulnerability_data_service.rb'
+ - 'ee/app/services/iterations/cadences/create_iterations_in_advance_service.rb'
+ - 'ee/app/services/iterations/cadences/create_service.rb'
+ - 'ee/app/services/iterations/cadences/destroy_service.rb'
+ - 'ee/app/services/iterations/cadences/update_service.rb'
+ - 'ee/app/services/iterations/delete_service.rb'
+ - 'ee/app/services/iterations/roll_over_issues_service.rb'
+ - 'ee/app/services/iterations/update_service.rb'
+ - 'ee/app/services/jira/jql_builder_service.rb'
+ - 'ee/app/services/jira/requests/issues/list_service.rb'
+ - 'ee/app/services/merge_requests/create_from_vulnerability_data_service.rb'
+ - 'ee/app/services/merge_trains/create_pipeline_service.rb'
+ - 'ee/app/services/merge_trains/refresh_merge_request_service.rb'
+ - 'ee/app/services/namespaces/check_excess_storage_size_service.rb'
+ - 'ee/app/services/namespaces/check_storage_size_service.rb'
+ - 'ee/app/services/network_policies/resources_service.rb'
+ - 'ee/app/services/network_policies/types.rb'
+ - 'ee/app/services/personal_access_tokens/rotation_verifier_service.rb'
+ - 'ee/app/services/projects/licenses/create_policy_service.rb'
+ - 'ee/app/services/projects/mark_for_deletion_service.rb'
+ - 'ee/app/services/projects/update_mirror_service.rb'
+ - 'ee/app/services/requirements_management/update_requirement_service.rb'
+ - 'ee/app/services/resource_events/change_weight_service.rb'
+ - 'ee/app/services/security/auto_fix_service.rb'
+ - 'ee/app/services/security/dependency_list_service.rb'
+ - 'ee/app/services/security/ingestion/bulk_updatable_task.rb'
+ - 'ee/app/services/security/ingestion/finding_map.rb'
+ - 'ee/app/services/security/ingestion/tasks/ingest_remediations.rb'
+ - 'ee/app/services/security/ingestion/tasks/ingest_vulnerabilities/create.rb'
+ - 'ee/app/services/security/override_uuids_service.rb'
+ - 'ee/app/services/security/report_summary_service.rb'
+ - 'ee/app/services/security/scanned_resources_counting_service.rb'
+ - 'ee/app/services/security/scanned_resources_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/create_pipeline_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/fetch_policy_approvers_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/on_demand_scan_pipeline_configuration_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/policy_commit_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/policy_configuration_validation_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/process_policy_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/project_create_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/rule_schedule_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/validate_policy_service.rb'
+ - 'ee/app/services/security/store_scan_service.rb'
+ - 'ee/app/services/security/track_scan_service.rb'
+ - 'ee/app/services/security/vulnerability_counting_service.rb'
+ - 'ee/app/services/start_pull_mirroring_service.rb'
+ - 'ee/app/services/system_notes/escalations_service.rb'
+ - 'ee/app/services/timebox_report_service.rb'
+ - 'ee/app/services/vulnerabilities/base_service.rb'
+ - 'ee/app/services/vulnerabilities/confirm_service.rb'
+ - 'ee/app/services/vulnerabilities/dismiss_service.rb'
+ - 'ee/app/services/vulnerabilities/historical_statistics/adjustment_service.rb'
+ - 'ee/app/services/vulnerabilities/resolve_service.rb'
+ - 'ee/app/services/vulnerabilities/revert_to_detected_service.rb'
+ - 'ee/app/services/vulnerabilities/statistics/adjustment_service.rb'
+ - 'ee/app/services/vulnerabilities/update_service.rb'
+ - 'ee/app/services/vulnerability_external_issue_links/create_service.rb'
+ - 'ee/app/services/vulnerability_feedback/create_service.rb'
+ - 'ee/app/services/vulnerability_feedback/destroy_service.rb'
+ - 'ee/app/services/vulnerability_feedback_module/update_service.rb'
+ - 'ee/app/services/vulnerability_issue_links/create_service.rb'
+ - 'ee/app/workers/analytics/cycle_analytics/consistency_worker.rb'
+ - 'ee/app/workers/analytics/devops_adoption/create_snapshot_worker.rb'
+ - 'ee/app/workers/app_sec/dast/scanner_profiles_builds/consistency_worker.rb'
+ - 'ee/app/workers/audit_events/audit_event_streaming_worker.rb'
+ - 'ee/app/workers/concerns/elastic/migration_backfill_helper.rb'
+ - 'ee/app/workers/concerns/elastic/migration_obsolete.rb'
+ - 'ee/app/workers/elastic/migration_worker.rb'
+ - 'ee/app/workers/elastic_commit_indexer_worker.rb'
+ - 'ee/app/workers/elastic_delete_project_worker.rb'
+ - 'ee/app/workers/elastic_namespace_rollout_worker.rb'
+ - 'ee/app/workers/geo/batch/project_registry_scheduler_worker.rb'
+ - 'ee/app/workers/geo/batch/project_registry_worker.rb'
+ - 'ee/app/workers/geo/destroy_worker.rb'
+ - 'ee/app/workers/geo/file_registry_removal_worker.rb'
+ - 'ee/app/workers/geo/repositories_clean_up_worker.rb'
+ - 'ee/app/workers/geo/repository_shard_sync_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/secondary/shard_worker.rb'
+ - 'ee/app/workers/geo/scheduler/scheduler_worker.rb'
+ - 'ee/app/workers/geo/secondary/registry_consistency_worker.rb'
+ - 'ee/app/workers/geo/verification_worker.rb'
+ - 'ee/app/workers/geo_repository_destroy_worker.rb'
+ - 'ee/app/workers/repository_update_mirror_worker.rb'
+ - 'ee/app/workers/security/orchestration_policy_rule_schedule_namespace_worker.rb'
+ - 'ee/app/workers/security/orchestration_policy_rule_schedule_worker.rb'
+ - 'ee/app/workers/update_all_mirrors_worker.rb'
+ - 'ee/app/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker.rb'
+ - 'ee/config/routes/group.rb'
+ - 'ee/config/routes/project.rb'
+ - 'ee/db/fixtures/development/20_burndown.rb'
+ - 'ee/db/fixtures/development/30_customizable_cycle_analytics.rb'
+ - 'ee/db/fixtures/development/90_productivity_analytics.rb'
+ - 'ee/db/geo/migrate/20170627195211_add_index_to_project_registry.rb'
+ - 'ee/db/geo/migrate/20180314175612_add_partial_index_to_project_registy_verification_failure_columns.rb'
+ - 'ee/db/geo/migrate/20180315222132_add_partial_index_to_project_registy_checksum_columns.rb'
+ - 'ee/db/geo/migrate/20180327071612_add_partial_index_to_project_registy_checksum_sha_columns.rb'
+ - 'ee/db/geo/migrate/20180402170913_add_missing_on_primary_to_job_artifact_registry..rb'
+ - 'ee/db/geo/migrate/20180803160048_add_synced_repositories_partial_index.rb'
+ - 'ee/db/geo/migrate/20180806011909_add_failed_synchronizations_partial_index.rb'
+ - 'ee/db/geo/migrate/20180806020615_add_pending_synchronizations_partial_index.rb'
+ - 'ee/db/geo/migrate/20200710194046_create_vulnerability_export_registry.rb'
+ - 'ee/db/geo/migrate/20201208031224_add_verification_indexes_to_package_file_registry.rb'
+ - 'ee/db/geo/migrate/20210111912220_prepare_job_artifact_registry_for_ssf_indecies.rb'
+ - 'ee/db/geo/migrate/20210223111722_create_group_wiki_repository_registry.rb'
+ - 'ee/db/geo/migrate/20210313051642_add_verification_indexes_to_snippet_repository_registry.rb'
+ - 'ee/db/geo/migrate/20210325150435_create_pipeline_artifact_registry.rb'
+ - 'ee/db/geo/migrate/20210420180119_add_indexes_to_terraform_state_version_registry.rb'
+ - 'ee/db/geo/migrate/20210505170208_add_indexes_to_merge_request_diff_registry_table.rb'
+ - 'ee/db/geo/migrate/20211102121712_create_file_registry_verification_indexies.rb'
+ - 'ee/db/geo/migrate/20211124000002_add_indexes_to_lfs_object_registry.rb'
+ - 'ee/db/geo/migrate/20211207162157_add_indexes_to_pages_deployment_registry.rb'
+ - 'ee/db/geo/post_migrate/20220202101354_migrate_job_artifact_registry.rb'
+ - 'ee/elastic/migrate/20210302104500_migrate_notes_to_separate_index.rb'
+ - 'ee/elastic/migrate/20210421140400_add_new_data_to_merge_requests_documents.rb'
+ - 'ee/elastic/migrate/20210429154500_migrate_merge_requests_to_separate_index.rb'
+ - 'ee/elastic/migrate/20210510113500_delete_merge_requests_from_original_index.rb'
+ - 'ee/elastic/migrate/20210510143200_delete_notes_from_original_index.rb'
+ - 'ee/lib/analytics/devops_adoption/snapshot_calculator.rb'
+ - 'ee/lib/analytics/productivity_analytics_request_params.rb'
+ - 'ee/lib/api/alert_management_alerts.rb'
+ - 'ee/lib/api/analytics/code_review_analytics.rb'
+ - 'ee/lib/api/audit_events.rb'
+ - 'ee/lib/api/ci/minutes.rb'
+ - 'ee/lib/api/dependencies.rb'
+ - 'ee/lib/api/epic_issues.rb'
+ - 'ee/lib/api/epic_links.rb'
+ - 'ee/lib/api/epics.rb'
+ - 'ee/lib/api/geo_nodes.rb'
+ - 'ee/lib/api/group_hooks.rb'
+ - 'ee/lib/api/group_push_rule.rb'
+ - 'ee/lib/api/group_repository_storage_moves.rb'
+ - 'ee/lib/api/helpers/project_approval_rules_helpers.rb'
+ - 'ee/lib/api/iterations.rb'
+ - 'ee/lib/api/license.rb'
+ - 'ee/lib/api/managed_licenses.rb'
+ - 'ee/lib/api/merge_request_approval_rules.rb'
+ - 'ee/lib/api/merge_request_approval_settings.rb'
+ - 'ee/lib/api/project_approval_rules.rb'
+ - 'ee/lib/api/project_approvals.rb'
+ - 'ee/lib/api/project_mirror.rb'
+ - 'ee/lib/api/project_push_rule.rb'
+ - 'ee/lib/api/protected_environments.rb'
+ - 'ee/lib/api/resource_iteration_events.rb'
+ - 'ee/lib/api/scim.rb'
+ - 'ee/lib/api/status_checks.rb'
+ - 'ee/lib/api/vulnerability_findings.rb'
+ - 'ee/lib/api/vulnerability_issue_links.rb'
+ - 'ee/lib/ee/api/deployments.rb'
+ - 'ee/lib/ee/api/entities/application_setting.rb'
+ - 'ee/lib/ee/api/entities/dependency.rb'
+ - 'ee/lib/ee/api/entities/epic.rb'
+ - 'ee/lib/ee/api/entities/group.rb'
+ - 'ee/lib/ee/api/entities/issue.rb'
+ - 'ee/lib/ee/api/entities/member.rb'
+ - 'ee/lib/ee/api/entities/namespace.rb'
+ - 'ee/lib/ee/api/entities/project.rb'
+ - 'ee/lib/ee/api/entities/project_approval_rule.rb'
+ - 'ee/lib/ee/api/entities/user_basic.rb'
+ - 'ee/lib/ee/api/entities/user_path.rb'
+ - 'ee/lib/ee/api/geo.rb'
+ - 'ee/lib/ee/api/helpers/groups_helpers.rb'
+ - 'ee/lib/ee/api/helpers/issues_helpers.rb'
+ - 'ee/lib/ee/api/helpers/projects_helpers.rb'
+ - 'ee/lib/ee/api/helpers/protected_branches_helpers.rb'
+ - 'ee/lib/ee/api/helpers/settings_helpers.rb'
+ - 'ee/lib/ee/api/helpers/users_helpers.rb'
+ - 'ee/lib/ee/api/internal/base.rb'
+ - 'ee/lib/ee/api/internal/kubernetes.rb'
+ - 'ee/lib/ee/api/issues.rb'
+ - 'ee/lib/ee/api/members.rb'
+ - 'ee/lib/ee/api/merge_request_approvals.rb'
+ - 'ee/lib/ee/api/merge_requests.rb'
+ - 'ee/lib/ee/api/namespaces.rb'
+ - 'ee/lib/ee/api/protected_branches.rb'
+ - 'ee/lib/ee/audit/project_changes_auditor.rb'
+ - 'ee/lib/ee/audit/protected_branches_changes_auditor.rb'
+ - 'ee/lib/ee/banzai/filter/references/iteration_reference_filter.rb'
+ - 'ee/lib/ee/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb'
+ - 'ee/lib/ee/gitlab/analytics/cycle_analytics/data_collector.rb'
+ - 'ee/lib/ee/gitlab/analytics/cycle_analytics/stage_events.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/access.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/group.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/group.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/users.rb'
+ - 'ee/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb'
+ - 'ee/lib/ee/gitlab/background_migration/create_security_setting.rb'
+ - 'ee/lib/ee/gitlab/background_migration/drop_invalid_remediations.rb'
+ - 'ee/lib/ee/gitlab/background_migration/fix_incorrect_max_seats_used.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_namespace_statistics.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_status_column_of_security_scans.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings.rb'
+ - 'ee/lib/ee/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings.rb'
+ - 'ee/lib/ee/gitlab/background_migration/update_vulnerability_occurrences_location.rb'
+ - 'ee/lib/ee/gitlab/checks/diff_check.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/commit_check.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/file_size_check.rb'
+ - 'ee/lib/ee/gitlab/ci/config_ee.rb'
+ - 'ee/lib/ee/gitlab/ci/pipeline/chain/create_cross_database_associations.rb'
+ - 'ee/lib/ee/gitlab/ci/pipeline/chain/validate/after_config.rb'
+ - 'ee/lib/ee/gitlab/ci/pipeline/chain/validate/security_orchestration_policy.rb'
+ - 'ee/lib/ee/gitlab/ci/reports/security/reports.rb'
+ - 'ee/lib/ee/gitlab/ci/status/build/manual.rb'
+ - 'ee/lib/ee/gitlab/git_access.rb'
+ - 'ee/lib/ee/gitlab/graphql/pagination/keyset/order_info.rb'
+ - 'ee/lib/ee/gitlab/import_export/after_export_strategies/custom_template_export_import_strategy.rb'
+ - 'ee/lib/ee/gitlab/middleware/read_only/controller.rb'
+ - 'ee/lib/ee/gitlab/project_template.rb'
+ - 'ee/lib/ee/gitlab/prometheus/queries/query_additional_metrics.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/epic_actions.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/issue_actions.rb'
+ - 'ee/lib/ee/gitlab/rack_attack.rb'
+ - 'ee/lib/ee/gitlab/repository_size_checker.rb'
+ - 'ee/lib/ee/gitlab/scim/deprovision_service.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/ee/sidebars/groups/menus/issues_menu.rb'
+ - 'ee/lib/ee/sidebars/groups/panel.rb'
+ - 'ee/lib/ee/sidebars/projects/menus/issues_menu.rb'
+ - 'ee/lib/ee/sidebars/projects/menus/security_compliance_menu.rb'
+ - 'ee/lib/elastic/latest/application_class_proxy.rb'
+ - 'ee/lib/elastic/latest/config.rb'
+ - 'ee/lib/elastic/latest/custom_language_analyzers.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/elastic/latest/git_instance_proxy.rb'
+ - 'ee/lib/elastic/latest/issue_class_proxy.rb'
+ - 'ee/lib/elastic/latest/issue_instance_proxy.rb'
+ - 'ee/lib/elastic/latest/merge_request_class_proxy.rb'
+ - 'ee/lib/elastic/latest/note_class_proxy.rb'
+ - 'ee/lib/elastic/latest/project_class_proxy.rb'
+ - 'ee/lib/elastic/latest/repository_class_proxy.rb'
+ - 'ee/lib/elastic/latest/repository_instance_proxy.rb'
+ - 'ee/lib/elastic/metrics_update_service.rb'
+ - 'ee/lib/gem_extensions/elasticsearch/model/adapter/active_record/importing.rb'
+ - 'ee/lib/gem_extensions/elasticsearch/model/indexing/instance_methods.rb'
+ - 'ee/lib/gitlab/alert_management.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/distinct_stage_loader.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_added.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_removed.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/label_based_stage_event.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_label_added.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_label_removed.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/summary/base_time.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/summary/group/deployment_frequency.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/summary/lead_time.rb'
+ - 'ee/lib/gitlab/auth/group_saml/response_check.rb'
+ - 'ee/lib/gitlab/auth/group_saml/session_enforcer.rb'
+ - 'ee/lib/gitlab/auth/group_saml/user.rb'
+ - 'ee/lib/gitlab/auth/group_saml/xml_response.rb'
+ - 'ee/lib/gitlab/authority_analyzer.rb'
+ - 'ee/lib/gitlab/ci/config/security_orchestration_policies/processor.rb'
+ - 'ee/lib/gitlab/ci/reports/dependency_list/report.rb'
+ - 'ee/lib/gitlab/ci/reports/security/locations/cluster_image_scanning.rb'
+ - 'ee/lib/gitlab/contribution_analytics/data_collector.rb'
+ - 'ee/lib/gitlab/elastic/group_search_results.rb'
+ - 'ee/lib/gitlab/elastic/indexer.rb'
+ - 'ee/lib/gitlab/elastic/project_search_results.rb'
+ - 'ee/lib/gitlab/elastic/search_results.rb'
+ - 'ee/lib/gitlab/email/message/account_validation.rb'
+ - 'ee/lib/gitlab/expiring_subscription_message.rb'
+ - 'ee/lib/gitlab/geo.rb'
+ - 'ee/lib/gitlab/geo/geo_node_status_check.rb'
+ - 'ee/lib/gitlab/geo/git_ssh_proxy.rb'
+ - 'ee/lib/gitlab/geo/health_check.rb'
+ - 'ee/lib/gitlab/geo/jwt_request_decoder.rb'
+ - 'ee/lib/gitlab/geo/log_cursor/events/repository_created_event.rb'
+ - 'ee/lib/gitlab/geo/registry_batcher.rb'
+ - 'ee/lib/gitlab/geo/replication/base_downloader.rb'
+ - 'ee/lib/gitlab/geo/replication/base_transfer.rb'
+ - 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
+ - 'ee/lib/gitlab/geo/replicator.rb'
+ - 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb'
+ - 'ee/lib/gitlab/graphql/aggregations/security_orchestration_policies/lazy_dast_profile_aggregate.rb'
+ - 'ee/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate.rb'
+ - 'ee/lib/gitlab/graphql/loaders/bulk_epic_aggregate_loader.rb'
+ - 'ee/lib/gitlab/insights/finders/issuable_finder.rb'
+ - 'ee/lib/gitlab/insights/project_insights_config.rb'
+ - 'ee/lib/gitlab/insights/reducers/count_per_period_reducer.rb'
+ - 'ee/lib/gitlab/insights/serializers/chartjs/bar_serializer.rb'
+ - 'ee/lib/gitlab/insights/serializers/chartjs/multi_series_serializer.rb'
+ - 'ee/lib/gitlab/insights/validators/params_validator.rb'
+ - 'ee/lib/gitlab/ip_restriction/enforcer.rb'
+ - 'ee/lib/gitlab/manual_quarterly_co_term_banner.rb'
+ - 'ee/lib/gitlab/sitemaps/generator.rb'
+ - 'ee/lib/gitlab/status_page/storage/s3_client.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/approval_project_rules_with_user_metric.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/count_ci_builds_metric.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/count_users_creating_ci_builds_metric.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb'
+ - 'ee/lib/gitlab/usage_data_counters/license_testing_counter.rb'
+ - 'ee/lib/pseudonymizer/filter.rb'
+ - 'ee/lib/system_check/app/elasticsearch_check.rb'
+ - 'ee/lib/system_check/geo/authorized_keys_check.rb'
+ - 'ee/lib/system_check/geo/current_node_check.rb'
+ - 'ee/lib/system_check/geo/geo_database_configured_check.rb'
+ - 'ee/lib/tasks/geo.rake'
+ - 'ee/lib/tasks/geo/git.rake'
+ - 'ee/lib/tasks/gitlab/elastic.rake'
+ - 'ee/lib/tasks/gitlab/elastic/test.rake'
+ - 'ee/lib/tasks/gitlab/seed/metrics.rake'
+ - 'ee/lib/world.rb'
+ - 'ee/spec/config/metrics/every_metric_definition_spec.rb'
+ - 'ee/spec/controllers/admin/elasticsearch_controller_spec.rb'
+ - 'ee/spec/controllers/admin/geo/projects_controller_spec.rb'
+ - 'ee/spec/controllers/admin/impersonations_controller_spec.rb'
+ - 'ee/spec/controllers/admin/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/admin/projects_controller_spec.rb'
+ - 'ee/spec/controllers/admin/users_controller_spec.rb'
+ - 'ee/spec/controllers/boards/issues_controller_spec.rb'
+ - 'ee/spec/controllers/concerns/ee/routable_actions/sso_enforcement_redirect_spec.rb'
+ - 'ee/spec/controllers/ee/dashboard/projects_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/jobs_controller_spec.rb'
+ - 'ee/spec/controllers/ee/search_controller_spec.rb'
+ - 'ee/spec/controllers/ee/uploads_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/cycle_analytics/value_streams_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/cycle_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/tasks_by_type_controller_spec.rb'
+ - 'ee/spec/controllers/groups/audit_events_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epic_issues_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epic_links_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/group_members_controller_spec.rb'
+ - 'ee/spec/controllers/groups/groups_controller_spec.rb'
+ - 'ee/spec/controllers/groups/insights_controller_spec.rb'
+ - 'ee/spec/controllers/groups/omniauth_callbacks_controller_spec.rb'
+ - 'ee/spec/controllers/groups/saml_group_links_controller_spec.rb'
+ - 'ee/spec/controllers/groups/saml_providers_controller_spec.rb'
+ - 'ee/spec/controllers/oauth/applications_controller_spec.rb'
+ - 'ee/spec/controllers/oauth/geo_auth_controller_spec.rb'
+ - 'ee/spec/controllers/operations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/analytics/cycle_analytics/summary_controller_spec.rb'
+ - 'ee/spec/controllers/projects/audit_events_controller_spec.rb'
+ - 'ee/spec/controllers/projects/dependencies_controller_spec.rb'
+ - 'ee/spec/controllers/projects/insights_controller_spec.rb'
+ - 'ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/integrations/zentao/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/controllers/projects/mirrors_controller_spec.rb'
+ - 'ee/spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'ee/spec/controllers/projects/protected_environments_controller_spec.rb'
+ - 'ee/spec/controllers/projects/push_rules_controller_spec.rb'
+ - 'ee/spec/controllers/projects/runners_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/configuration_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/network_policies_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/vulnerabilities_controller_spec.rb'
+ - 'ee/spec/controllers/projects/subscriptions_controller_spec.rb'
+ - 'ee/spec/controllers/projects/threat_monitoring_controller_spec.rb'
+ - 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
+ - 'ee/spec/controllers/projects_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/groups_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/welcome_controller_spec.rb'
+ - 'ee/spec/controllers/subscriptions/groups_controller_spec.rb'
+ - 'ee/spec/controllers/subscriptions_controller_spec.rb'
+ - 'ee/spec/controllers/trials_controller_spec.rb'
+ - 'ee/spec/elastic/migrate/20210201104800_migrate_notes_to_separate_index_spec.rb'
+ - 'ee/spec/elastic/migrate/20210421140400_add_new_data_to_merge_requests_documents_spec.rb'
+ - 'ee/spec/elastic/migrate/20210429154500_migrate_merge_requests_to_separate_index_spec.rb'
+ - 'ee/spec/elastic/migrate/20210510113500_delete_merge_requests_from_original_index_spec.rb'
+ - 'ee/spec/elastic/migrate/20210510143200_delete_notes_from_original_index_spec.rb'
+ - 'ee/spec/elastic/migrate/migration_shared_examples.rb'
+ - 'ee/spec/factories/ci/builds.rb'
+ - 'ee/spec/factories/ci/job_artifacts.rb'
+ - 'ee/spec/factories/ci/pipelines.rb'
+ - 'ee/spec/factories/ci/reports/license_scanning/report.rb'
+ - 'ee/spec/factories/ci/reports/security/locations/container_scanning.rb'
+ - 'ee/spec/factories/ci/reports/security/locations/dependency_scanning.rb'
+ - 'ee/spec/factories/compliance_management/frameworks.rb'
+ - 'ee/spec/factories/geo/container_repository_registry.rb'
+ - 'ee/spec/factories/iterations.rb'
+ - 'ee/spec/factories/namespaces.rb'
+ - 'ee/spec/factories/requirements_management/requirements.rb'
+ - 'ee/spec/factories/vulnerabilities/exports.rb'
+ - 'ee/spec/factories/vulnerabilities/findings.rb'
+ - 'ee/spec/features/admin/admin_audit_logs_spec.rb'
+ - 'ee/spec/features/admin/admin_credentials_inventory_spec.rb'
+ - 'ee/spec/features/admin/admin_settings_spec.rb'
+ - 'ee/spec/features/admin/admin_users_spec.rb'
+ - 'ee/spec/features/admin/geo/admin_geo_nodes_spec.rb'
+ - 'ee/spec/features/admin/groups/admin_changes_plan_spec.rb'
+ - 'ee/spec/features/admin/groups/admin_subscription_alerts_spec.rb'
+ - 'ee/spec/features/admin/licenses/admin_uploads_license_spec.rb'
+ - 'ee/spec/features/admin/subscriptions/admin_views_subscription_spec.rb'
+ - 'ee/spec/features/billings/billing_plans_spec.rb'
+ - 'ee/spec/features/billings/extend_reactivate_trial_spec.rb'
+ - '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/user_visits_board_spec.rb'
+ - 'ee/spec/features/burnup_charts_spec.rb'
+ - 'ee/spec/features/ci_shared_runner_warnings_spec.rb'
+ - 'ee/spec/features/dashboards/operations_spec.rb'
+ - 'ee/spec/features/epic_boards/epic_boards_spec.rb'
+ - 'ee/spec/features/epics/epic_issues_spec.rb'
+ - 'ee/spec/features/epics/epic_show_spec.rb'
+ - 'ee/spec/features/epics/epics_list_spec.rb'
+ - 'ee/spec/features/epics/issue_promotion_spec.rb'
+ - 'ee/spec/features/geo_node_spec.rb'
+ - 'ee/spec/features/gitlab_subscriptions/seats_count_alert_spec.rb'
+ - 'ee/spec/features/google_analytics_datalayer_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb'
+ - '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/feature_discovery_moments_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/iterations/iterations_list_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/members/manage_groups_spec.rb'
+ - 'ee/spec/features/groups/members/manage_members_spec.rb'
+ - 'ee/spec/features/groups/members/override_ldap_memberships_spec.rb'
+ - 'ee/spec/features/groups/saml_providers_spec.rb'
+ - 'ee/spec/features/groups/scim_token_spec.rb'
+ - 'ee/spec/features/groups/security/compliance_dashboards_spec.rb'
+ - 'ee/spec/features/groups/sso_spec.rb'
+ - 'ee/spec/features/groups/usage_quotas_spec.rb'
+ - 'ee/spec/features/incidents/incident_details_spec.rb'
+ - 'ee/spec/features/integrations/jira/jira_issues_list_spec.rb'
+ - 'ee/spec/features/invites_spec.rb'
+ - 'ee/spec/features/issues/filtered_search/filter_issues_weight_spec.rb'
+ - 'ee/spec/features/issues/form_spec.rb'
+ - 'ee/spec/features/issues/issue_sidebar_spec.rb'
+ - 'ee/spec/features/issues/user_sees_empty_state_spec.rb'
+ - 'ee/spec/features/labels_hierarchy_spec.rb'
+ - 'ee/spec/features/merge_request/user_approves_spec.rb'
+ - 'ee/spec/features/merge_request/user_approves_with_password_spec.rb'
+ - 'ee/spec/features/merge_request/user_edits_multiple_reviewers_mr_spec.rb'
+ - 'ee/spec/features/merge_request/user_merges_with_push_rules_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_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_approvers_spec.rb'
+ - 'ee/spec/features/merge_requests/user_filters_by_approvers_spec.rb'
+ - 'ee/spec/features/merge_requests/user_views_all_merge_requests_spec.rb'
+ - 'ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb'
+ - 'ee/spec/features/pending_group_memberships_spec.rb'
+ - 'ee/spec/features/projects/audit_events_spec.rb'
+ - 'ee/spec/features/projects/custom_projects_template_spec.rb'
+ - 'ee/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb'
+ - 'ee/spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb'
+ - 'ee/spec/features/projects/integrations/prometheus_custom_metrics_spec.rb'
+ - 'ee/spec/features/projects/integrations/user_activates_jira_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/licenses/maintainer_views_policies_spec.rb'
+ - 'ee/spec/features/projects/members/member_is_removed_from_project_spec.rb'
+ - 'ee/spec/features/projects/members/member_leaves_project_spec.rb'
+ - 'ee/spec/features/projects/new_project_spec.rb'
+ - 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'ee/spec/features/projects/quality/test_case_list_spec.rb'
+ - 'ee/spec/features/projects/quality/test_case_show_spec.rb'
+ - 'ee/spec/features/projects/requirements_management/requirements_list_spec.rb'
+ - 'ee/spec/features/projects/settings/ee/service_desk_setting_spec.rb'
+ - 'ee/spec/features/projects/settings/issues_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/merge_requests_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/protected_environments_spec.rb'
+ - 'ee/spec/features/projects/user_applies_custom_file_template_spec.rb'
+ - 'ee/spec/features/projects_spec.rb'
+ - 'ee/spec/features/promotion_spec.rb'
+ - 'ee/spec/features/read_only_spec.rb'
+ - 'ee/spec/features/registrations/combined_registration_spec.rb'
+ - 'ee/spec/features/search/elastic/global_search_spec.rb'
+ - 'ee/spec/features/search/elastic/project_search_spec.rb'
+ - 'ee/spec/features/search/elastic/snippet_search_spec.rb'
+ - 'ee/spec/features/subscriptions_spec.rb'
+ - 'ee/spec/features/trial_registrations/company_information_spec.rb'
+ - 'ee/spec/features/uncompleted_learn_gitlab_link_spec.rb'
+ - 'ee/spec/features/users/login_spec.rb'
+ - 'ee/spec/finders/analytics/devops_adoption/enabled_namespaces_finder_spec.rb'
+ - 'ee/spec/finders/analytics/devops_adoption/snapshots_finder_spec.rb'
+ - 'ee/spec/finders/audit_log_finder_spec.rb'
+ - 'ee/spec/finders/billed_users_finder_spec.rb'
+ - 'ee/spec/finders/boards/users_finder_spec.rb'
+ - 'ee/spec/finders/compliance_management/merge_requests/compliance_violations_finder_spec.rb'
+ - 'ee/spec/finders/custom_project_templates_finder_spec.rb'
+ - 'ee/spec/finders/dast_site_validations_finder_spec.rb'
+ - 'ee/spec/finders/ee/alert_management/http_integrations_finder_spec.rb'
+ - 'ee/spec/finders/ee/group_members_finder_spec.rb'
+ - 'ee/spec/finders/ee/projects_finder_spec.rb'
+ - 'ee/spec/finders/epics_finder_spec.rb'
+ - 'ee/spec/finders/geo/container_repository_registry_finder_spec.rb'
+ - 'ee/spec/finders/geo/job_artifact_legacy_registry_finder_spec.rb'
+ - 'ee/spec/finders/geo/project_registry_finder_spec.rb'
+ - 'ee/spec/finders/geo/project_registry_status_finder_spec.rb'
+ - 'ee/spec/finders/group_projects_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/escalation_policies_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/escalation_rules_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/member_oncall_rotations_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/oncall_rotations_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/oncall_users_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/timeline_events_finder_spec.rb'
+ - 'ee/spec/finders/issues_finder_spec.rb'
+ - 'ee/spec/finders/iterations/cadences_finder_spec.rb'
+ - 'ee/spec/finders/iterations_finder_spec.rb'
+ - 'ee/spec/finders/license_template_finder_spec.rb'
+ - 'ee/spec/finders/merge_requests/by_approvers_finder_spec.rb'
+ - 'ee/spec/finders/merge_requests_finder_spec.rb'
+ - 'ee/spec/finders/notes_finder_spec.rb'
+ - 'ee/spec/finders/productivity_analytics_finder_spec.rb'
+ - 'ee/spec/finders/projects/integrations/jira/by_ids_finder_spec.rb'
+ - 'ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb'
+ - 'ee/spec/finders/requirements_management/requirements_finder_spec.rb'
+ - 'ee/spec/finders/security/findings_finder_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/training_providers/base_url_finder_spec.rb'
+ - 'ee/spec/finders/security/training_providers/kontra_url_finder_spec.rb'
+ - 'ee/spec/finders/security/training_providers/secure_code_warrior_url_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerability_reads_finder_spec.rb'
+ - 'ee/spec/finders/snippets_finder_spec.rb'
+ - 'ee/spec/finders/template_finder_spec.rb'
+ - 'ee/spec/finders/users_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/analytics/devops_reports/devops_adoption/enabled_namespaces.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/frontend/fixtures/epic.rb'
+ - 'ee/spec/frontend/fixtures/on_demand_dast_scans.rb'
+ - 'ee/spec/frontend/fixtures/project_quality_summary.rb'
+ - 'ee/spec/frontend/fixtures/projects.rb'
+ - 'ee/spec/graphql/ee/mutations/boards/lists/create_spec.rb'
+ - 'ee/spec/graphql/ee/resolvers/board_list_issues_resolver_spec.rb'
+ - 'ee/spec/graphql/ee/resolvers/issues_resolver_spec.rb'
+ - 'ee/spec/graphql/ee/types/board_type_spec.rb'
+ - 'ee/spec/graphql/ee/types/issue_sort_enum_spec.rb'
+ - 'ee/spec/graphql/ee/types/merge_request_type_spec.rb'
+ - 'ee/spec/graphql/ee/types/mutation_type_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/create_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epics/create_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/lists/update_limit_metrics_spec.rb'
+ - 'ee/spec/graphql/mutations/compliance_management/frameworks/update_spec.rb'
+ - 'ee/spec/graphql/mutations/dast/profiles/run_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_on_demand_scans/create_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_scanner_profiles/delete_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_scanner_profiles/update_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_profiles/create_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_profiles/update_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/create_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/update_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_rotation/create_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_rotation/update_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_schedule/create_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_schedule/update_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/timeline_event/update_spec.rb'
+ - 'ee/spec/graphql/mutations/instance_security_dashboard/add_project_spec.rb'
+ - 'ee/spec/graphql/mutations/instance_security_dashboard/remove_project_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/create_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/promote_to_epic_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/set_epic_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/set_escalation_policy_spec.rb'
+ - 'ee/spec/graphql/mutations/projects/set_compliance_framework_spec.rb'
+ - 'ee/spec/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/graphql/mutations/security/training_provider_update_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/assign_security_policy_project_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/unassign_security_policy_project_spec.rb'
+ - 'ee/spec/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb'
+ - 'ee/spec/graphql/mutations/vulnerabilities/create_spec.rb'
+ - 'ee/spec/graphql/resolvers/analytics/devops_adoption/enabled_namespaces_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/boards/board_list_epics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/ci/code_coverage_activities_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/dast_site_validation_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/dora_metrics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/epics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/external_issue_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/escalation_policies_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/oncall_rotations_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/oncall_schedule_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/iterations/cadences_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/iterations_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/network_policy_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/path_locks_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/pipeline_security_report_findings_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/requirements_management/requirements_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/requirements_management/test_reports_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/security_report_summary_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/timebox_report_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities/details_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities/issue_links_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities/scanners_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities_count_per_day_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerability_severities_count_resolver_spec.rb'
+ - 'ee/spec/graphql/types/alert_management/payload_alert_field_name_enum_spec.rb'
+ - 'ee/spec/graphql/types/asset_type_spec.rb'
+ - 'ee/spec/graphql/types/ci/minutes/namespace_monthly_usage_type_spec.rb'
+ - 'ee/spec/graphql/types/dast/profile_schedule_type_spec.rb'
+ - 'ee/spec/graphql/types/dast_scanner_profile_type_spec.rb'
+ - 'ee/spec/graphql/types/dast_site_profile_type_spec.rb'
+ - 'ee/spec/graphql/types/epic_sort_enum_spec.rb'
+ - 'ee/spec/graphql/types/incident_management/escalation_rule_input_type_spec.rb'
+ - 'ee/spec/graphql/types/issue_type_spec.rb'
+ - 'ee/spec/graphql/types/network_policy_type_spec.rb'
+ - 'ee/spec/graphql/types/permission_types/vulnerability_spec.rb'
+ - 'ee/spec/graphql/types/pipeline_security_report_finding_type_spec.rb'
+ - 'ee/spec/graphql/types/project_type_spec.rb'
+ - 'ee/spec/graphql/types/security_scanner_type_enum_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_details/file_location_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_evidence_source_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_evidence_supporting_message_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_evidence_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_report_type_enum_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_request_response_header_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_request_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_response_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_sort_enum_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_type_spec.rb'
+ - 'ee/spec/helpers/admin/emails_helper_spec.rb'
+ - 'ee/spec/helpers/analytics/code_review_helper_spec.rb'
+ - 'ee/spec/helpers/application_helper_spec.rb'
+ - 'ee/spec/helpers/billing_plans_helper_spec.rb'
+ - 'ee/spec/helpers/compliance_management/compliance_framework/group_settings_helper_spec.rb'
+ - 'ee/spec/helpers/ee/access_tokens_helper_spec.rb'
+ - 'ee/spec/helpers/ee/application_settings_helper_spec.rb'
+ - 'ee/spec/helpers/ee/branches_helper_spec.rb'
+ - 'ee/spec/helpers/ee/ci/pipelines_helper_spec.rb'
+ - 'ee/spec/helpers/ee/dashboard_helper_spec.rb'
+ - 'ee/spec/helpers/ee/feature_flags_helper_spec.rb'
+ - 'ee/spec/helpers/ee/gitlab_routing_helper_spec.rb'
+ - 'ee/spec/helpers/ee/groups/group_members_helper_spec.rb'
+ - 'ee/spec/helpers/ee/groups/settings_helper_spec.rb'
+ - 'ee/spec/helpers/ee/groups_helper_spec.rb'
+ - 'ee/spec/helpers/ee/integrations_helper_spec.rb'
+ - 'ee/spec/helpers/ee/issuables_helper_spec.rb'
+ - 'ee/spec/helpers/ee/issues_helper_spec.rb'
+ - 'ee/spec/helpers/ee/lock_helper_spec.rb'
+ - 'ee/spec/helpers/ee/operations_helper_spec.rb'
+ - 'ee/spec/helpers/ee/personal_access_tokens_helper_spec.rb'
+ - 'ee/spec/helpers/ee/projects/pipeline_helper_spec.rb'
+ - 'ee/spec/helpers/ee/projects/security/api_fuzzing_configuration_helper_spec.rb'
+ - 'ee/spec/helpers/ee/projects/security/dast_configuration_helper_spec.rb'
+ - 'ee/spec/helpers/ee/registrations_helper_spec.rb'
+ - 'ee/spec/helpers/ee/subscribable_banner_helper_spec.rb'
+ - 'ee/spec/helpers/ee/users/callouts_helper_spec.rb'
+ - 'ee/spec/helpers/ee/version_check_helper_spec.rb'
+ - 'ee/spec/helpers/ee/welcome_helper_spec.rb'
+ - 'ee/spec/helpers/epics_helper_spec.rb'
+ - 'ee/spec/helpers/gitlab_subscriptions/upcoming_reconciliation_helper_spec.rb'
+ - 'ee/spec/helpers/groups/security_features_helper_spec.rb'
+ - 'ee/spec/helpers/groups/sso_helper_spec.rb'
+ - 'ee/spec/helpers/license_helper_spec.rb'
+ - 'ee/spec/helpers/license_monitoring_helper_spec.rb'
+ - 'ee/spec/helpers/notes_helper_spec.rb'
+ - 'ee/spec/helpers/paid_feature_callout_helper_spec.rb'
+ - 'ee/spec/helpers/projects/on_demand_scans_helper_spec.rb'
+ - 'ee/spec/helpers/projects/project_members_helper_spec.rb'
+ - 'ee/spec/helpers/projects/security/dast_profiles_helper_spec.rb'
+ - 'ee/spec/helpers/projects_helper_spec.rb'
+ - 'ee/spec/helpers/push_rules_helper_spec.rb'
+ - 'ee/spec/helpers/routing/pseudonymization_helper_spec.rb'
+ - 'ee/spec/helpers/search_helper_spec.rb'
+ - 'ee/spec/helpers/seats_count_alert_helper_spec.rb'
+ - 'ee/spec/helpers/security_helper_spec.rb'
+ - 'ee/spec/helpers/subscriptions_helper_spec.rb'
+ - 'ee/spec/helpers/timeboxes_helper_spec.rb'
+ - 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
+ - 'ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb'
+ - 'ee/spec/lib/analytics/merge_request_metrics_calculator_spec.rb'
+ - 'ee/spec/lib/analytics/merge_request_metrics_refresh_spec.rb'
+ - 'ee/spec/lib/analytics/productivity_analytics_request_params_spec.rb'
+ - 'ee/spec/lib/audit/details_spec.rb'
+ - 'ee/spec/lib/banzai/filter/jira_private_image_link_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/epic_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/vulnerability_reference_filters_spec.rb'
+ - 'ee/spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb'
+ - 'ee/spec/lib/bulk_imports/projects/pipelines/protected_branches_pipeline_spec.rb'
+ - 'ee/spec/lib/bulk_imports/projects/pipelines/push_rule_pipeline_spec.rb'
+ - 'ee/spec/lib/compliance_management/merge_request_approval_settings/resolver_spec.rb'
+ - 'ee/spec/lib/container_registry/client_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/billable_member_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/deployment_extended_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/vulnerability_export_spec.rb'
+ - 'ee/spec/lib/ee/api/helpers_spec.rb'
+ - 'ee/spec/lib/ee/audit/compliance_framework_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/protected_branches_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/alert_management/payload/generic_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/drop_invalid_remediations_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/fix_incorrect_max_seats_used_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/populate_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/recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/update_vulnerability_occurrences_location_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rule_check_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rules/branch_check_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rules/commit_check_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rules/file_size_check_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/config_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/parsers/security/common_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/security_orchestration_policy_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/quota/job_activity_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/reports/security/reports_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/status/build/manual_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/elastic/helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/etag_caching/router/rails_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/git_access_snippet_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/gon_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/group_search_results_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/wiki_repo_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/repo_path_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/repository_size_checker_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/scim/deprovision_service_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/security/scan_configuration_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/url_builder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage/service_ping/payload_keys_processor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_counters/hll_redis_counter_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_non_sql_metrics_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/groups/menus/issues_menu_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/groups/menus/settings_menu_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/projects/menus/analytics_menu_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/projects/menus/ci_cd_menu_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/projects/menus/issues_menu_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/projects/menus/security_compliance_menu_spec.rb'
+ - 'ee/spec/lib/elastic/latest/config_shared_examples.rb'
+ - 'ee/spec/lib/elastic/latest/custom_language_analyzers_spec.rb'
+ - 'ee/spec/lib/elastic/latest/git_class_proxy_spec.rb'
+ - 'ee/spec/lib/elastic/multi_version_class_proxy_spec.rb'
+ - 'ee/spec/lib/elastic/multi_version_instance_proxy_spec.rb'
+ - 'ee/spec/lib/gem_extensions/elasticsearch/model/adapter/active_record/records_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/aggregated/data_for_duration_chart_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_for_duration_chart_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/distinct_stage_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_first_associated_with_milestone_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_added_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_removed_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_closed_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_first_commit_at_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_label_added_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_label_removed_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_summary_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/stage_time_summary_spec.rb'
+ - 'ee/spec/lib/gitlab/audit/events/preloader_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/group_lookup_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/membership_updater_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/response_check_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/user_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/access_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/user_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/migrate_requirements_to_work_items_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/populate_test_reports_issue_id_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'ee/spec/lib/gitlab/checks/diff_check_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/config/entry/job_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/config/security_orchestration_policies/processor_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/minutes/cost_factor_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/minutes/runners_availability_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/license_compliance/license_scanning_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/cluster_image_scanning_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/container_scanning_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/dast_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/dependency_list_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/dependency_scanning_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/formatters/dast_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/pipeline/chain/create_cross_database_associations_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/dependency_list/dependency_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/dependency_list/report_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/license_scanning/dependency_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/license_scanning/report_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/security/finding_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dependency_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/loader_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners_spec.rb'
+ - 'ee/spec/lib/gitlab/custom_file_templates_spec.rb'
+ - 'ee/spec/lib/gitlab/data_builder/vulnerability_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/bulk_indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/client_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/group_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/project_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/snippet_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
+ - 'ee/spec/lib/gitlab/email/message/account_validation_spec.rb'
+ - 'ee/spec/lib/gitlab/expiring_subscription_message_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/cron_manager_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/event_gap_tracking_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/geo_tasks_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/git_ssh_proxy_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/health_check_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/lease_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/oauth/login_state_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/oauth/logout_token_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/file_retriever_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/job_artifact_downloader_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/job_artifact_retriever_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/job_artifact_transfer_spec.rb'
+ - 'ee/spec/lib/gitlab/geo_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_wiki_spec.rb'
+ - 'ee/spec/lib/gitlab/gl_repository/repo_type_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/epics/epic_node_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/security_orchestration_policies/lazy_dast_profile_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/vulnerabilities/lazy_user_notes_count_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/loaders/bulk_epic_aggregate_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/pagination/keyset/order_info_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/attributes_permitter_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/group/group_and_descendants_repo_restorer_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/finders/issuable_finder_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/reducers/count_per_label_reducer_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/reducers/count_per_period_reducer_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/reducers/label_count_per_period_reducer_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/serializers/chartjs/bar_serializer_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/serializers/chartjs/bar_time_series_serializer_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/serializers/chartjs/multi_series_serializer_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/validators/params_validator_spec.rb'
+ - 'ee/spec/lib/gitlab/instrumentation/elasticsearch_transport_spec.rb'
+ - 'ee/spec/lib/gitlab/mirror_spec.rb'
+ - 'ee/spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'ee/spec/lib/gitlab/prometheus/queries/cluster_query_spec.rb'
+ - 'ee/spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'ee/spec/lib/gitlab/search/aggregation_spec.rb'
+ - 'ee/spec/lib/gitlab/sitemaps/generator_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/filter/image_filter_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/filter/mention_anonymization_filter_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/storage/s3_multipart_upload_spec.rb'
+ - 'ee/spec/lib/gitlab/subscription_portal/clients/graphql_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/approval_project_rules_with_user_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_builds_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_distinct_merged_merge_requests_using_approval_rules_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_event_streaming_destinations_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_groups_with_event_streaming_destinations_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_projects_with_external_status_checks_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_users_associating_group_milestones_to_releases_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_ci_builds_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/license_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage_data_metrics_spec.rb'
+ - 'ee/spec/lib/gitlab_subscriptions/upcoming_reconciliation_entity_spec.rb'
+ - 'ee/spec/lib/incident_management/oncall_shift_generator_spec.rb'
+ - 'ee/spec/lib/omni_auth/strategies/group_saml_spec.rb'
+ - 'ee/spec/lib/peek/views/elasticsearch_spec.rb'
+ - 'ee/spec/lib/sidebars/groups/menus/security_compliance_menu_spec.rb'
+ - 'ee/spec/lib/system_check/app/elasticsearch_check_spec.rb'
+ - 'ee/spec/lib/system_check/geo/authorized_keys_check_spec.rb'
+ - 'ee/spec/lib/system_check/geo/http_connection_check_spec.rb'
+ - 'ee/spec/mailers/ee/emails/issues_spec.rb'
+ - 'ee/spec/mailers/ee/emails/projects_spec.rb'
+ - 'ee/spec/mailers/emails/group_memberships_spec.rb'
+ - 'ee/spec/mailers/emails/requirements_spec.rb'
+ - 'ee/spec/mailers/license_mailer_spec.rb'
+ - 'ee/spec/mailers/notify_spec.rb'
+ - 'ee/spec/migrations/add_non_null_constraint_for_escalation_rule_on_pending_alert_escalations_spec.rb'
+ - 'ee/spec/migrations/drop_invalid_remediations_spec.rb'
+ - 'ee/spec/migrations/geo/migrate_ci_job_artifacts_to_separate_registry_spec.rb'
+ - 'ee/spec/migrations/geo/migrate_lfs_objects_to_separate_registry_spec.rb'
+ - 'ee/spec/migrations/geo/set_resync_flag_for_retried_projects_spec.rb'
+ - 'ee/spec/migrations/remove_schedule_and_status_null_constraints_from_pending_escalations_alert_spec.rb'
+ - 'ee/spec/migrations/schedule_populate_test_reports_issue_id_spec.rb'
+ - 'ee/spec/migrations/schedule_requirements_migration_spec.rb'
+ - 'ee/spec/migrations/schedule_trace_expiry_removal_spec.rb'
+ - 'ee/spec/migrations/update_vulnerability_occurrences_location_spec.rb'
+ - 'ee/spec/models/allowed_email_domain_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/group_level_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/group_stage_spec.rb'
+ - 'ee/spec/models/analytics/devops_adoption/enabled_namespace_spec.rb'
+ - 'ee/spec/models/analytics/devops_adoption/snapshot_spec.rb'
+ - 'ee/spec/models/app_sec/fuzzing/coverage/corpus_spec.rb'
+ - 'ee/spec/models/application_setting_spec.rb'
+ - 'ee/spec/models/approval_merge_request_rule_spec.rb'
+ - 'ee/spec/models/approval_project_rule_spec.rb'
+ - 'ee/spec/models/approval_state_spec.rb'
+ - 'ee/spec/models/approval_wrapped_code_owner_rule_spec.rb'
+ - 'ee/spec/models/approval_wrapped_rule_spec.rb'
+ - 'ee/spec/models/approvals/scan_finding_wrapped_rule_set_spec.rb'
+ - 'ee/spec/models/approvals/wrapped_rule_set_spec.rb'
+ - 'ee/spec/models/boards/epic_board_position_spec.rb'
+ - 'ee/spec/models/burndown_spec.rb'
+ - 'ee/spec/models/ci/build_spec.rb'
+ - 'ee/spec/models/ci/daily_build_group_report_result_spec.rb'
+ - 'ee/spec/models/ci/minutes/namespace_monthly_usage_spec.rb'
+ - 'ee/spec/models/ci/minutes/project_monthly_usage_spec.rb'
+ - 'ee/spec/models/ci/minutes/quota_spec.rb'
+ - 'ee/spec/models/ci/pipeline_spec.rb'
+ - 'ee/spec/models/ci/subscriptions/project_spec.rb'
+ - 'ee/spec/models/concerns/ee/clusters/agents/authorization_config_scopes_spec.rb'
+ - 'ee/spec/models/concerns/ee/issuable_spec.rb'
+ - 'ee/spec/models/concerns/ee/noteable_spec.rb'
+ - 'ee/spec/models/concerns/ee/project_security_scanners_information_spec.rb'
+ - 'ee/spec/models/concerns/elastic/application_versioned_search_spec.rb'
+ - 'ee/spec/models/concerns/elastic/issue_spec.rb'
+ - 'ee/spec/models/concerns/elastic/merge_request_spec.rb'
+ - 'ee/spec/models/concerns/elastic/note_spec.rb'
+ - 'ee/spec/models/concerns/elastic/project_spec.rb'
+ - 'ee/spec/models/concerns/elastic/repository_spec.rb'
+ - 'ee/spec/models/concerns/epic_tree_sorting_spec.rb'
+ - 'ee/spec/models/concerns/geo/verification_state_spec.rb'
+ - 'ee/spec/models/concerns/scim_paginatable_spec.rb'
+ - 'ee/spec/models/container_repository_spec.rb'
+ - 'ee/spec/models/dast/branch_spec.rb'
+ - 'ee/spec/models/dast/profile_schedule_spec.rb'
+ - 'ee/spec/models/dast/profile_spec.rb'
+ - 'ee/spec/models/dast/scanner_profiles_build_spec.rb'
+ - 'ee/spec/models/dast/site_profile_secret_variable_spec.rb'
+ - 'ee/spec/models/dast_scanner_profile_spec.rb'
+ - 'ee/spec/models/dast_site_profile_spec.rb'
+ - 'ee/spec/models/dast_site_spec.rb'
+ - 'ee/spec/models/deployments/approval_spec.rb'
+ - 'ee/spec/models/dora/base_metric_spec.rb'
+ - 'ee/spec/models/dora/daily_metrics_spec.rb'
+ - 'ee/spec/models/dora/lead_time_for_changes_metric_spec.rb'
+ - 'ee/spec/models/dora/time_to_restore_service_metric_spec.rb'
+ - 'ee/spec/models/ee/alert_management/alert_spec.rb'
+ - 'ee/spec/models/ee/audit_event_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/group_spec.rb'
+ - 'ee/spec/models/ee/incident_management/project_incident_management_setting_spec.rb'
+ - 'ee/spec/models/ee/integrations/jira_spec.rb'
+ - 'ee/spec/models/ee/iteration_spec.rb'
+ - 'ee/spec/models/ee/iterations/cadence_spec.rb'
+ - 'ee/spec/models/ee/lfs_object_spec.rb'
+ - 'ee/spec/models/ee/merge_request_diff_spec.rb'
+ - 'ee/spec/models/ee/namespace/root_storage_size_spec.rb'
+ - 'ee/spec/models/ee/namespace/root_storage_statistics_spec.rb'
+ - 'ee/spec/models/ee/namespace_limit_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/ee/namespace_statistics_spec.rb'
+ - 'ee/spec/models/ee/preloaders/group_policy_preloader_spec.rb'
+ - 'ee/spec/models/ee/project_authorization_spec.rb'
+ - 'ee/spec/models/ee/protected_branch_spec.rb'
+ - 'ee/spec/models/ee/service_desk_setting_spec.rb'
+ - 'ee/spec/models/ee/user_highest_role_spec.rb'
+ - 'ee/spec/models/ee/user_spec.rb'
+ - 'ee/spec/models/ee/vulnerability_spec.rb'
+ - 'ee/spec/models/elastic/migration_record_spec.rb'
+ - 'ee/spec/models/elastic/reindexing_task_spec.rb'
+ - 'ee/spec/models/elasticsearch_indexed_namespace_spec.rb'
+ - 'ee/spec/models/environment_spec.rb'
+ - 'ee/spec/models/epic_spec.rb'
+ - 'ee/spec/models/geo/container_repository_registry_spec.rb'
+ - 'ee/spec/models/geo/event_log_spec.rb'
+ - 'ee/spec/models/geo/job_artifact_registry_spec.rb'
+ - 'ee/spec/models/geo/package_file_registry_spec.rb'
+ - 'ee/spec/models/geo/project_registry_spec.rb'
+ - 'ee/spec/models/geo/secondary_usage_data_spec.rb'
+ - 'ee/spec/models/geo_node_spec.rb'
+ - 'ee/spec/models/geo_node_status_spec.rb'
+ - 'ee/spec/models/gitlab_subscription_spec.rb'
+ - 'ee/spec/models/gitlab_subscriptions/features_spec.rb'
+ - 'ee/spec/models/group_member_spec.rb'
+ - 'ee/spec/models/historical_data_spec.rb'
+ - 'ee/spec/models/incident_management/escalation_policy_spec.rb'
+ - 'ee/spec/models/incident_management/escalation_rule_spec.rb'
+ - 'ee/spec/models/incident_management/issuable_escalation_status_spec.rb'
+ - 'ee/spec/models/incident_management/oncall_rotation_spec.rb'
+ - 'ee/spec/models/incident_management/oncall_shift_spec.rb'
+ - 'ee/spec/models/incident_management/timeline_event_spec.rb'
+ - 'ee/spec/models/instance_security_dashboard_spec.rb'
+ - 'ee/spec/models/integrations/chat_message/vulnerability_message_spec.rb'
+ - 'ee/spec/models/integrations/github_spec.rb'
+ - 'ee/spec/models/issuable_sla_spec.rb'
+ - 'ee/spec/models/issue_spec.rb'
+ - 'ee/spec/models/license_spec.rb'
+ - 'ee/spec/models/member_spec.rb'
+ - 'ee/spec/models/merge_request_spec.rb'
+ - 'ee/spec/models/merge_requests/compliance_violation_spec.rb'
+ - 'ee/spec/models/merge_requests/external_status_check_spec.rb'
+ - 'ee/spec/models/merge_train_spec.rb'
+ - 'ee/spec/models/namespace_setting_spec.rb'
+ - 'ee/spec/models/note_spec.rb'
+ - 'ee/spec/models/packages/package_file_spec.rb'
+ - 'ee/spec/models/project_import_data_spec.rb'
+ - 'ee/spec/models/project_import_state_spec.rb'
+ - 'ee/spec/models/project_member_spec.rb'
+ - 'ee/spec/models/project_security_setting_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/protected_branch/unprotect_access_level_spec.rb'
+ - 'ee/spec/models/protected_environment_spec.rb'
+ - 'ee/spec/models/protected_environments/approval_rule_spec.rb'
+ - 'ee/spec/models/release_highlight_spec.rb'
+ - 'ee/spec/models/repository_spec.rb'
+ - 'ee/spec/models/requirements_management/requirement_spec.rb'
+ - 'ee/spec/models/requirements_management/test_report_spec.rb'
+ - 'ee/spec/models/saml_provider_spec.rb'
+ - 'ee/spec/models/sca/license_compliance_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_configuration_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_rule_schedule_spec.rb'
+ - 'ee/spec/models/security/scan_spec.rb'
+ - 'ee/spec/models/security/training_provider_spec.rb'
+ - 'ee/spec/models/software_license_policy_spec.rb'
+ - 'ee/spec/models/software_license_spec.rb'
+ - 'ee/spec/models/upload_spec.rb'
+ - 'ee/spec/models/visible_approvable_spec.rb'
+ - 'ee/spec/models/vulnerabilities/external_issue_link_spec.rb'
+ - 'ee/spec/models/vulnerabilities/feedback_spec.rb'
+ - 'ee/spec/models/vulnerabilities/finding_spec.rb'
+ - 'ee/spec/models/vulnerabilities/flag_spec.rb'
+ - 'ee/spec/models/vulnerabilities/historical_statistic_spec.rb'
+ - 'ee/spec/models/vulnerabilities/projects_grade_spec.rb'
+ - 'ee/spec/models/vulnerabilities/read_spec.rb'
+ - 'ee/spec/models/vulnerabilities/statistic_spec.rb'
+ - 'ee/spec/policies/group_policy_spec.rb'
+ - 'ee/spec/policies/issuable_policy_spec.rb'
+ - 'ee/spec/policies/issue_policy_spec.rb'
+ - 'ee/spec/policies/merge_request_policy_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/policies/protected_branch_policy_spec.rb'
+ - 'ee/spec/policies/vulnerabilities/export_policy_spec.rb'
+ - 'ee/spec/policies/vulnerabilities/external_issue_link_policy_spec.rb'
+ - 'ee/spec/presenters/audit_event_presenter_spec.rb'
+ - 'ee/spec/presenters/ci/build_runner_presenter_spec.rb'
+ - 'ee/spec/presenters/ci/pipeline_presenter_spec.rb'
+ - 'ee/spec/presenters/ee/issue_presenter_spec.rb'
+ - 'ee/spec/presenters/epic_issue_presenter_spec.rb'
+ - 'ee/spec/presenters/epic_presenter_spec.rb'
+ - 'ee/spec/presenters/group_member_presenter_spec.rb'
+ - 'ee/spec/presenters/merge_request_presenter_spec.rb'
+ - 'ee/spec/presenters/security/scan_presenter_spec.rb'
+ - 'ee/spec/presenters/vulnerabilities/finding_presenter_spec.rb'
+ - 'ee/spec/presenters/vulnerability_presenter_spec.rb'
+ - 'ee/spec/replicators/geo/upload_replicator_spec.rb'
+ - 'ee/spec/requests/admin/credentials_controller_spec.rb'
+ - 'ee/spec/requests/admin/geo/replicables_controller_spec.rb'
+ - 'ee/spec/requests/admin/user_permission_exports_controller_spec.rb'
+ - 'ee/spec/requests/api/alert_management_alerts_spec.rb'
+ - 'ee/spec/requests/api/analytics/code_review_analytics_spec.rb'
+ - 'ee/spec/requests/api/audit_events_spec.rb'
+ - 'ee/spec/requests/api/branches_spec.rb'
+ - 'ee/spec/requests/api/ci/jobs_spec.rb'
+ - 'ee/spec/requests/api/ci/minutes_spec.rb'
+ - 'ee/spec/requests/api/ci/pipelines_spec.rb'
+ - 'ee/spec/requests/api/ci/variables_spec.rb'
+ - 'ee/spec/requests/api/commits_spec.rb'
+ - 'ee/spec/requests/api/deployments_spec.rb'
+ - 'ee/spec/requests/api/elasticsearch_indexed_namespaces_spec.rb'
+ - 'ee/spec/requests/api/epic_issues_spec.rb'
+ - 'ee/spec/requests/api/epics_spec.rb'
+ - 'ee/spec/requests/api/geo_nodes_spec.rb'
+ - 'ee/spec/requests/api/geo_spec.rb'
+ - 'ee/spec/requests/api/graphql/analytics/devops_adoption/enabled_namespaces_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/board_list_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/board_lists_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/epic_boards_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/compliance_management/merge_requests/compliance_violations_spec.rb'
+ - 'ee/spec/requests/api/graphql/current_user/groups_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/epics/epic_resolver_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/dast_profile_schedule_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_aggregate_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epics_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/external_audit_event_destinations_spec.rb'
+ - 'ee/spec/requests/api/graphql/group_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/instance_security_dashboard_spec.rb'
+ - 'ee/spec/requests/api/graphql/iteration_spec.rb'
+ - 'ee/spec/requests/api/graphql/iterations/cadences_spec.rb'
+ - 'ee/spec/requests/api/graphql/iterations/iterations_spec.rb'
+ - 'ee/spec/requests/api/graphql/milestone_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/alert_management/http_integration/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/analytics/devops_adoption/enabled_namespaces/bulk_enable_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/analytics/devops_adoption/enabled_namespaces/disable_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/analytics/devops_adoption/enabled_namespaces/enable_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/audit_events/external_audit_event_destinations/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/lists/update_limit_metrics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/update_epic_user_preferences_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/update_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_on_demand_scans/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_scanner_profiles/delete_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_scanner_profiles/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_site_profiles/delete_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_site_profiles/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epic_tree/reorder_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epics/add_issue_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/set_weight_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/cadences/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/projects/set_compliance_framework_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/requirements_management/create_requirement_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/requirements_management/export_requirements_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/create_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/unassign_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/destroy_external_issue_link_spec.rb'
+ - 'ee/spec/requests/api/graphql/namespace/compliance_frameworks_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/alert_management/http_integrations_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/code_coverage_summary_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_profile_schedule_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_profiles_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/escalation_policies_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/escalation_policy/rules_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/oncall_shifts_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/security_report_summary_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/requirements_management/requirements_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/requirements_management/test_reports_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/vulnerability_severities_count_spec.rb'
+ - 'ee/spec/requests/api/graphql/projects/compliance_frameworks_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/description_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/external_issue_links_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/issue_links_spec.rb'
+ - 'ee/spec/requests/api/group_milestones_spec.rb'
+ - 'ee/spec/requests/api/group_push_rule_spec.rb'
+ - 'ee/spec/requests/api/group_variables_spec.rb'
+ - 'ee/spec/requests/api/groups_spec.rb'
+ - 'ee/spec/requests/api/internal/app_sec/dast/site_validations_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/internal/kubernetes_spec.rb'
+ - 'ee/spec/requests/api/internal/upcoming_reconciliations_spec.rb'
+ - 'ee/spec/requests/api/invitations_spec.rb'
+ - 'ee/spec/requests/api/issues_spec.rb'
+ - 'ee/spec/requests/api/iterations_spec.rb'
+ - 'ee/spec/requests/api/ldap_group_links_spec.rb'
+ - 'ee/spec/requests/api/license_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approval_rules_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approvals_spec.rb'
+ - 'ee/spec/requests/api/merge_requests_spec.rb'
+ - 'ee/spec/requests/api/namespaces_spec.rb'
+ - '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_milestones_spec.rb'
+ - 'ee/spec/requests/api/project_push_rule_spec.rb'
+ - 'ee/spec/requests/api/projects_spec.rb'
+ - 'ee/spec/requests/api/protected_environments_spec.rb'
+ - 'ee/spec/requests/api/related_epic_links_spec.rb'
+ - 'ee/spec/requests/api/releases_spec.rb'
+ - 'ee/spec/requests/api/resource_iteration_events_spec.rb'
+ - 'ee/spec/requests/api/scim_spec.rb'
+ - 'ee/spec/requests/api/search_spec.rb'
+ - 'ee/spec/requests/api/settings_spec.rb'
+ - 'ee/spec/requests/api/status_checks_spec.rb'
+ - 'ee/spec/requests/api/users_spec.rb'
+ - 'ee/spec/requests/api/visual_review_discussions_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_exports_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_findings_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_issue_links_spec.rb'
+ - 'ee/spec/requests/git_http_geo_spec.rb'
+ - 'ee/spec/requests/git_http_spec.rb'
+ - 'ee/spec/requests/groups/epics/related_epic_links_controller_spec.rb'
+ - 'ee/spec/requests/groups/group_members_controller_spec.rb'
+ - 'ee/spec/requests/groups/roadmap_controller_spec.rb'
+ - 'ee/spec/requests/groups/security/credentials_controller_spec.rb'
+ - 'ee/spec/requests/groups_controller_spec.rb'
+ - 'ee/spec/requests/jwt_controller_spec.rb'
+ - 'ee/spec/requests/lfs_http_spec.rb'
+ - 'ee/spec/requests/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/requests/projects/pipelines_controller_spec.rb'
+ - 'ee/spec/requests/projects/requirements_management/requirements_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_scanner_profiles_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_site_profiles_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/policies_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/scanned_resources_controller_spec.rb'
+ - 'ee/spec/requests/rack_attack_global_spec.rb'
+ - 'ee/spec/requests/repositories/git_http_controller_spec.rb'
+ - 'ee/spec/requests/smartcard_controller_spec.rb'
+ - 'ee/spec/requests/survey_responses_controller_spec.rb'
+ - 'ee/spec/routing/admin_routing_spec.rb'
+ - 'ee/spec/routing/group_routing_spec.rb'
+ - 'ee/spec/routing/groups/cadences_routing_spec.rb'
+ - 'ee/spec/routing/project_routing_spec.rb'
+ - 'ee/spec/routing/projects/security/configuration_controller_routing_spec.rb'
+ - 'ee/spec/serializers/analytics/cycle_analytics/stage_entity_spec.rb'
+ - 'ee/spec/serializers/ee/deployment_entity_spec.rb'
+ - 'ee/spec/serializers/ee/environment_serializer_spec.rb'
+ - 'ee/spec/serializers/ee/note_entity_spec.rb'
+ - 'ee/spec/serializers/ee/user_serializer_spec.rb'
+ - 'ee/spec/serializers/environment_entity_spec.rb'
+ - 'ee/spec/serializers/epic_entity_spec.rb'
+ - 'ee/spec/serializers/fork_namespace_entity_spec.rb'
+ - 'ee/spec/serializers/integrations/jira_serializers/issue_detail_entity_spec.rb'
+ - 'ee/spec/serializers/integrations/jira_serializers/issue_entity_spec.rb'
+ - 'ee/spec/serializers/member_entity_spec.rb'
+ - 'ee/spec/serializers/merge_request_compliance_entity_spec.rb'
+ - 'ee/spec/serializers/project_mirror_entity_spec.rb'
+ - 'ee/spec/serializers/security/license_policy_entity_spec.rb'
+ - 'ee/spec/serializers/status_page/renderer_spec.rb'
+ - 'ee/spec/serializers/user_analytics_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/finding_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/finding_reports_comparer_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/finding_serializer_spec.rb'
+ - 'ee/spec/services/alert_management/metric_images/upload_service_spec.rb'
+ - 'ee/spec/services/alert_management/network_alert_service_spec.rb'
+ - 'ee/spec/services/alert_management/process_prometheus_alert_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/consistency_check_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/data_loader_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/stages/create_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/stages/delete_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/stages/list_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/stages/update_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/value_streams/update_service_spec.rb'
+ - 'ee/spec/services/analytics/devops_adoption/enabled_namespaces/bulk_delete_service_spec.rb'
+ - 'ee/spec/services/analytics/devops_adoption/enabled_namespaces/bulk_find_or_create_service_spec.rb'
+ - 'ee/spec/services/analytics/devops_adoption/enabled_namespaces/create_service_spec.rb'
+ - 'ee/spec/services/analytics/devops_adoption/enabled_namespaces/delete_service_spec.rb'
+ - 'ee/spec/services/analytics/devops_adoption/enabled_namespaces/find_or_create_service_spec.rb'
+ - 'ee/spec/services/analytics/devops_adoption/snapshots/calculate_and_save_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/builds/associate_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scan_configs/build_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scanner_profiles/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scans/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scans/run_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profile_secret_variables/create_or_update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profile_secret_variables/destroy_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profiles/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profiles/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_tokens/find_or_create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_validations/find_or_create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_validations/revoke_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_validations/runner_service_spec.rb'
+ - 'ee/spec/services/application_settings/update_service_spec.rb'
+ - 'ee/spec/services/approval_rules/create_service_spec.rb'
+ - 'ee/spec/services/approval_rules/finalize_service_spec.rb'
+ - 'ee/spec/services/approval_rules/params_filtering_service_spec.rb'
+ - 'ee/spec/services/arkose/user_verification_service_spec.rb'
+ - 'ee/spec/services/audit_events/protected_branch_audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/register_runner_audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/release_associate_milestone_audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/release_created_audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/user_impersonation_group_audit_event_service_spec.rb'
+ - 'ee/spec/services/auto_merge/merge_train_service_spec.rb'
+ - 'ee/spec/services/award_emojis/add_service_spec.rb'
+ - 'ee/spec/services/award_emojis/destroy_service_spec.rb'
+ - 'ee/spec/services/boards/epic_user_preferences/update_service_spec.rb'
+ - 'ee/spec/services/boards/epics/position_create_service_spec.rb'
+ - 'ee/spec/services/boards/lists/update_service_spec.rb'
+ - 'ee/spec/services/ci/compare_license_scanning_reports_service_spec.rb'
+ - 'ee/spec/services/ci/compare_security_reports_service_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/compliance_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/dast_configuration_spec.rb'
+ - 'ee/spec/services/ci/minutes/batch_reset_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/refresh_cached_data_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/update_project_and_namespace_usage_service_spec.rb'
+ - 'ee/spec/services/ci/process_build_service_spec.rb'
+ - 'ee/spec/services/ci/sync_reports_to_approval_rules_service_spec.rb'
+ - 'ee/spec/services/compliance_management/frameworks/update_service_spec.rb'
+ - 'ee/spec/services/dashboard/operations/list_service_spec.rb'
+ - 'ee/spec/services/dashboard/projects/create_service_spec.rb'
+ - 'ee/spec/services/deployments/approval_service_spec.rb'
+ - 'ee/spec/services/deployments/auto_rollback_service_spec.rb'
+ - 'ee/spec/services/ee/alert_management/http_integrations/update_service_spec.rb'
+ - 'ee/spec/services/ee/allowed_email_domains/update_service_spec.rb'
+ - 'ee/spec/services/ee/auth/container_registry_authentication_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/create_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/list_service_spec.rb'
+ - 'ee/spec/services/ee/boards/lists/max_limits_spec.rb'
+ - 'ee/spec/services/ee/ci/pipeline_processing/atomic_processing_service_spec.rb'
+ - 'ee/spec/services/ee/commits/create_service_spec.rb'
+ - 'ee/spec/services/ee/git/wiki_push_service_spec.rb'
+ - 'ee/spec/services/ee/groups/autocomplete_service_spec.rb'
+ - 'ee/spec/services/ee/groups/deploy_tokens/create_service_spec.rb'
+ - 'ee/spec/services/ee/groups/import_export/export_service_spec.rb'
+ - 'ee/spec/services/ee/incident_management/issuable_escalation_statuses/after_update_service_spec.rb'
+ - 'ee/spec/services/ee/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb'
+ - 'ee/spec/services/ee/ip_restrictions/update_service_spec.rb'
+ - 'ee/spec/services/ee/issuable/common_system_notes_service_spec.rb'
+ - 'ee/spec/services/ee/issuable/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/issue_links/create_service_spec.rb'
+ - 'ee/spec/services/ee/issues/clone_service_spec.rb'
+ - 'ee/spec/services/ee/issues/create_from_vulnerability_data_service_spec.rb'
+ - 'ee/spec/services/ee/issues/create_service_spec.rb'
+ - 'ee/spec/services/ee/issues/move_service_spec.rb'
+ - 'ee/spec/services/ee/issues/update_service_spec.rb'
+ - 'ee/spec/services/ee/members/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/after_create_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/create_from_vulnerability_data_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/post_merge_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/refresh_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/update_service_spec.rb'
+ - 'ee/spec/services/ee/notes/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/projects/autocomplete_service_spec.rb'
+ - 'ee/spec/services/ee/projects/deploy_tokens/create_service_spec.rb'
+ - 'ee/spec/services/ee/resource_events/merge_into_notes_service_spec.rb'
+ - 'ee/spec/services/ee/service_ping/service_ping_settings_spec.rb'
+ - 'ee/spec/services/ee/system_notes/issuables_service_spec.rb'
+ - 'ee/spec/services/ee/users/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/users/migrate_to_ghost_user_service_spec.rb'
+ - 'ee/spec/services/ee/users/update_service_spec.rb'
+ - 'ee/spec/services/elastic/cluster_reindexing_service_spec.rb'
+ - 'ee/spec/services/elastic/data_migration_service_spec.rb'
+ - 'ee/spec/services/elastic/indexing_control_service_spec.rb'
+ - 'ee/spec/services/elastic/process_initial_bookkeeping_service_spec.rb'
+ - 'ee/spec/services/epic_issues/create_service_spec.rb'
+ - 'ee/spec/services/epic_links/create_service_spec.rb'
+ - 'ee/spec/services/epics/issue_promote_service_spec.rb'
+ - 'ee/spec/services/epics/related_epic_links/create_service_spec.rb'
+ - 'ee/spec/services/epics/tree_reorder_service_spec.rb'
+ - 'ee/spec/services/epics/update_dates_service_spec.rb'
+ - 'ee/spec/services/epics/update_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/update_service_spec.rb'
+ - 'ee/spec/services/geo/blob_download_service_spec.rb'
+ - 'ee/spec/services/geo/blob_upload_service_spec.rb'
+ - 'ee/spec/services/geo/container_repository_sync_spec.rb'
+ - 'ee/spec/services/geo/file_download_service_spec.rb'
+ - 'ee/spec/services/geo/framework_repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb'
+ - 'ee/spec/services/geo/hashed_storage_migration_service_spec.rb'
+ - 'ee/spec/services/geo/metrics_update_service_spec.rb'
+ - 'ee/spec/services/geo/project_housekeeping_service_spec.rb'
+ - 'ee/spec/services/geo/rename_repository_service_spec.rb'
+ - 'ee/spec/services/geo/repository_destroy_service_spec.rb'
+ - 'ee/spec/services/geo/repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/repository_updated_service_spec.rb'
+ - 'ee/spec/services/geo/repository_verification_secondary_service_spec.rb'
+ - 'ee/spec/services/geo/wiki_sync_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/check_future_renewal_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/create_service_spec.rb'
+ - 'ee/spec/services/groups/create_service_spec.rb'
+ - 'ee/spec/services/groups/memberships/export_service_spec.rb'
+ - 'ee/spec/services/groups/transfer_service_spec.rb'
+ - 'ee/spec/services/groups/update_repository_storage_service_spec.rb'
+ - 'ee/spec/services/incident_management/escalation_policies/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/escalation_policies/destroy_service_spec.rb'
+ - 'ee/spec/services/incident_management/escalation_policies/update_service_spec.rb'
+ - 'ee/spec/services/incident_management/escalation_rules/destroy_service_spec.rb'
+ - 'ee/spec/services/incident_management/incidents/create_sla_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/destroy_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/edit_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/remove_participant_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/destroy_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/update_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_shifts/read_service_spec.rb'
+ - 'ee/spec/services/incident_management/pending_escalations/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/pending_escalations/process_service_spec.rb'
+ - 'ee/spec/services/issues/build_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/create_iterations_in_advance_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/destroy_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/update_service_spec.rb'
+ - 'ee/spec/services/iterations/create_service_spec.rb'
+ - 'ee/spec/services/iterations/delete_service_spec.rb'
+ - 'ee/spec/services/jira/jql_builder_service_spec.rb'
+ - 'ee/spec/services/jira/requests/issues/list_service_spec.rb'
+ - 'ee/spec/services/ldap_group_reset_service_spec.rb'
+ - 'ee/spec/services/members/activate_service_spec.rb'
+ - 'ee/spec/services/merge_commits/export_csv_service_spec.rb'
+ - 'ee/spec/services/merge_requests/merge_service_spec.rb'
+ - 'ee/spec/services/merge_requests/merge_to_ref_service_spec.rb'
+ - 'ee/spec/services/merge_requests/push_options_handler_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/merge_trains/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb'
+ - 'ee/spec/services/merge_trains/refresh_service_spec.rb'
+ - 'ee/spec/services/namespaces/check_excess_storage_size_service_spec.rb'
+ - 'ee/spec/services/network_policies/delete_resource_service_spec.rb'
+ - 'ee/spec/services/network_policies/deploy_resource_service_spec.rb'
+ - 'ee/spec/services/network_policies/find_resource_service_spec.rb'
+ - 'ee/spec/services/network_policies/resources_service_spec.rb'
+ - 'ee/spec/services/personal_access_tokens/create_service_audit_log_spec.rb'
+ - 'ee/spec/services/personal_access_tokens/rotation_verifier_service_spec.rb'
+ - 'ee/spec/services/projects/alerting/notify_service_spec.rb'
+ - 'ee/spec/services/projects/cleanup_service_spec.rb'
+ - 'ee/spec/services/projects/gitlab_projects_import_service_spec.rb'
+ - 'ee/spec/services/projects/group_links/create_service_spec.rb'
+ - 'ee/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
+ - 'ee/spec/services/projects/import_export/export_service_spec.rb'
+ - 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
+ - 'ee/spec/services/projects/transfer_service_spec.rb'
+ - 'ee/spec/services/projects/update_mirror_service_spec.rb'
+ - 'ee/spec/services/projects/update_service_spec.rb'
+ - 'ee/spec/services/quick_actions/interpret_service_spec.rb'
+ - 'ee/spec/services/requirements_management/export_csv_service_spec.rb'
+ - 'ee/spec/services/requirements_management/update_requirement_service_spec.rb'
+ - 'ee/spec/services/resource_events/change_weight_service_spec.rb'
+ - 'ee/spec/services/search/global_service_spec.rb'
+ - 'ee/spec/services/search/group_service_spec.rb'
+ - 'ee/spec/services/search/project_service_spec.rb'
+ - 'ee/spec/services/search/snippet_service_spec.rb'
+ - 'ee/spec/services/search_service_spec.rb'
+ - 'ee/spec/services/security/dependency_list_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/finding_map_collection_spec.rb'
+ - 'ee/spec/services/security/ingestion/ingest_report_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/ingest_report_slice_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/ingest_reports_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/attach_findings_to_vulnerabilities_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_finding_pipelines_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_findings_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_identifiers_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_remediations_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_vulnerabilities_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_vulnerability_flags_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_vulnerability_statistics_spec.rb'
+ - 'ee/spec/services/security/merge_reports_service_spec.rb'
+ - 'ee/spec/services/security/orchestration/assign_service_spec.rb'
+ - 'ee/spec/services/security/override_uuids_service_spec.rb'
+ - 'ee/spec/services/security/report_summary_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/fetch_policy_approvers_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/on_demand_scan_pipeline_configuration_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/policy_commit_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/policy_configuration_validation_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/process_policy_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/process_rule_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/process_scan_result_policy_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/project_create_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/rule_schedule_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/scan_pipeline_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/validate_policy_service_spec.rb'
+ - 'ee/spec/services/security/store_grouped_scans_service_spec.rb'
+ - 'ee/spec/services/security/track_scan_service_spec.rb'
+ - 'ee/spec/services/security/update_training_service_spec.rb'
+ - 'ee/spec/services/security/vulnerability_counting_service_spec.rb'
+ - 'ee/spec/services/start_pull_mirroring_service_spec.rb'
+ - 'ee/spec/services/status_page/publish_attachments_service_spec.rb'
+ - 'ee/spec/services/system_notes/escalations_service_spec.rb'
+ - 'ee/spec/services/system_notes/incidents_service_spec.rb'
+ - 'ee/spec/services/system_notes/merge_train_service_spec.rb'
+ - 'ee/spec/services/timebox_report_service_spec.rb'
+ - 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/services/user_permissions/export_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/destroy_dismissal_feedback_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/dismiss_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/finding_dismiss_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/historical_statistics/adjustment_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/manually_create_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/revert_to_detected_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/starboard_vulnerability_resolve_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/statistics/adjustment_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/update_service_spec.rb'
+ - 'ee/spec/services/vulnerability_exports/create_service_spec.rb'
+ - 'ee/spec/services/vulnerability_exports/export_service_spec.rb'
+ - 'ee/spec/services/vulnerability_exports/exporters/csv_service_spec.rb'
+ - 'ee/spec/services/vulnerability_external_issue_links/create_service_spec.rb'
+ - 'ee/spec/services/vulnerability_external_issue_links/destroy_service_spec.rb'
+ - 'ee/spec/services/vulnerability_feedback/create_service_spec.rb'
+ - 'ee/spec/services/vulnerability_feedback/destroy_service_spec.rb'
+ - 'ee/spec/services/vulnerability_scanners/list_service_spec.rb'
+ - 'ee/spec/services/wiki_pages/create_service_spec.rb'
+ - 'ee/spec/services/wiki_pages/destroy_service_spec.rb'
+ - 'ee/spec/services/wiki_pages/update_service_spec.rb'
+ - 'ee/spec/support/elastic.rb'
+ - 'ee/spec/support/features/redacted_search_results_examples.rb'
+ - 'ee/spec/support/helpers/search_results_helpers.rb'
+ - 'ee/spec/support/helpers/subscription_portal_helpers.rb'
+ - 'ee/spec/support/helpers/vulnerability_helpers.rb'
+ - 'ee/spec/support/license_scanning_reports/license_scanning_report_helper.rb'
+ - 'ee/spec/support/matchers/ee/epic_aggregate_matchers.rb'
+ - 'ee/spec/support/matchers/locked_schema.rb'
+ - 'ee/spec/support/prometheus/additional_metrics_shared_examples.rb'
+ - 'ee/spec/support/protected_tags/access_control_shared_examples.rb'
+ - 'ee/spec/support/shared_contexts/lib/gitlab/insights/reducers/reducers_shared_contexts.rb'
+ - 'ee/spec/support/shared_contexts/push_rules_checks_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/status_page/status_page_list_objects.rb'
+ - 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/concerns/description_diff_actions_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/projects/license_scanning_report_comparison_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/registrations/groups_controller_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/registrations/projects_controller_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/epics_filtered_search_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/over_free_user_limit_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/sidebar_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/finders/geo/file_registry_finder_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/finders/geo/registry_finder_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/graphql/mutations/set_multiple_assignees_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/graphql/resolvers/security_orchestration/resolves_orchestration_policy_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/git_access_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/issuable_links_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/repository_replicator_strategy_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_batcher_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/member_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/protected_environments/authorizable_examples.rb'
+ - 'ee/spec/support/shared_examples/policies/protected_environments_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/quick_actions/issuable/assign_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/quick_actions/issuable/unassign_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/quick_actions/issue/page_quick_action_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/quick_actions/merge_request/assign_reviewer_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/quick_actions/merge_request/unassign_reviewer_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/api/graphql/geo/registries_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/api/project_approval_rules_api_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/serializers/license_compliance/comparer_entity_examples.rb'
+ - 'ee/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/boards/base_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/build_execute_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/ci/play_job_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/dast_on_demand_scans_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/geo/geo_request_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/group_saml/saml_provider/base_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/issue_epic_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/network_policies/kubeclient_error_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/scoped_label_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/search_notes_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/sync_issue_and_requirement_state_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/vulnerabilities/calls_vulnerability_statistics_utility_services_in_order.rb'
+ - 'ee/spec/support/shared_examples/views/subscription_shared_examples.rb'
+ - 'ee/spec/tasks/geo/git_rake_spec.rb'
+ - 'ee/spec/tasks/geo_rake_spec.rb'
+ - 'ee/spec/tasks/gitlab/geo_rake_spec.rb'
+ - 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
+ - 'ee/spec/validators/json_schema_validator_spec.rb'
+ - 'ee/spec/views/admin/application_settings/_elasticsearch_form.html.haml_spec.rb'
+ - 'ee/spec/views/admin/application_settings/general.html.haml_spec.rb'
+ - 'ee/spec/views/admin/dashboard/index.html.haml_spec.rb'
+ - 'ee/spec/views/compliance_management/compliance_framework/_project_settings.html.haml_spec.rb'
+ - 'ee/spec/views/groups/feature_discovery_moments/advanced_features_dashboard.html.haml_spec.rb'
+ - 'ee/spec/views/groups/security/discover/show.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/header/_current_user_dropdown.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/header/help_dropdown/_cross_stage_fdm.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
+ - 'ee/spec/views/operations/environments.html.haml_spec.rb'
+ - 'ee/spec/views/projects/protected_environments/_protected_environment.html.haml_spec.rb'
+ - 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
+ - 'ee/spec/views/registrations/groups_projects/new.html.haml_spec.rb'
+ - 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_mirror_status.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_namespace_user_cap_reached_alert.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_user_over_limit_free_plan_alert.html.haml_spec.rb'
+ - 'ee/spec/views/shared/access_tokens/_table.html.haml_spec.rb'
+ - 'ee/spec/views/shared/billings/_eoa_bronze_plan_banner.html.haml_spec.rb'
+ - 'ee/spec/views/shared/billings/_trial_status.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/personal_access_tokens/_personal_access_token.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/project_access_tokens/_project_access_token.html.haml_spec.rb'
+ - 'ee/spec/views/shared/promotions/_promotion_link_project.html.haml_spec.rb'
+ - 'ee/spec/views/subscriptions/groups/edit.html.haml_spec.rb'
+ - 'ee/spec/views/trial_registrations/new.html.haml_spec.rb'
+ - 'ee/spec/workers/active_user_count_threshold_worker_spec.rb'
+ - 'ee/spec/workers/adjourned_group_deletion_worker_spec.rb'
+ - 'ee/spec/workers/adjourned_projects_deletion_cron_worker_spec.rb'
+ - 'ee/spec/workers/analytics/cycle_analytics/consistency_worker_spec.rb'
+ - 'ee/spec/workers/analytics/cycle_analytics/incremental_worker_spec.rb'
+ - 'ee/spec/workers/analytics/devops_adoption/create_all_snapshots_worker_spec.rb'
+ - 'ee/spec/workers/analytics/devops_adoption/create_snapshot_worker_spec.rb'
+ - 'ee/spec/workers/app_sec/dast/profile_schedule_worker_spec.rb'
+ - 'ee/spec/workers/audit_events/audit_event_streaming_worker_spec.rb'
+ - 'ee/spec/workers/ci/minutes/refresh_cached_data_worker_spec.rb'
+ - 'ee/spec/workers/ci/minutes/update_project_and_namespace_usage_worker_spec.rb'
+ - 'ee/spec/workers/ci/upstream_projects_subscriptions_cleanup_worker_spec.rb'
+ - 'ee/spec/workers/compliance_management/merge_requests/compliance_violations_worker_spec.rb'
+ - 'ee/spec/workers/concerns/elastic/indexing_control_spec.rb'
+ - 'ee/spec/workers/elastic/migration_worker_spec.rb'
+ - 'ee/spec/workers/elastic_association_indexer_worker_spec.rb'
+ - 'ee/spec/workers/elastic_commit_indexer_worker_spec.rb'
+ - 'ee/spec/workers/geo/batch/project_registry_scheduler_worker_spec.rb'
+ - 'ee/spec/workers/geo/container_repository_sync_dispatch_worker_spec.rb'
+ - 'ee/spec/workers/geo/destroy_worker_spec.rb'
+ - 'ee/spec/workers/geo/file_download_dispatch_worker_spec.rb'
+ - 'ee/spec/workers/geo/project_sync_worker_spec.rb'
+ - 'ee/spec/workers/geo/prune_event_log_worker_spec.rb'
+ - 'ee/spec/workers/geo/registry_sync_worker_spec.rb'
+ - 'ee/spec/workers/geo/repositories_clean_up_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_shard_sync_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/secondary/shard_worker_spec.rb'
+ - 'ee/spec/workers/geo/scheduler/per_shard_scheduler_worker_spec.rb'
+ - 'ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb'
+ - 'ee/spec/workers/geo/verification_batch_worker_spec.rb'
+ - 'ee/spec/workers/geo/verification_timeout_worker_spec.rb'
+ - 'ee/spec/workers/geo/verification_worker_spec.rb'
+ - 'ee/spec/workers/import_software_licenses_worker_spec.rb'
+ - 'ee/spec/workers/incident_management/oncall_rotations/persist_all_rotations_shifts_job_spec.rb'
+ - 'ee/spec/workers/incident_management/oncall_rotations/persist_shifts_job_spec.rb'
+ - 'ee/spec/workers/iterations/cadences/create_iterations_worker_spec.rb'
+ - 'ee/spec/workers/iterations/cadences/schedule_create_iterations_worker_spec.rb'
+ - 'ee/spec/workers/iterations/roll_over_issues_worker_spec.rb'
+ - 'ee/spec/workers/iterations_update_status_worker_spec.rb'
+ - 'ee/spec/workers/merge_request_reset_approvals_worker_spec.rb'
+ - 'ee/spec/workers/network_policy_metrics_worker_spec.rb'
+ - 'ee/spec/workers/new_epic_worker_spec.rb'
+ - 'ee/spec/workers/refresh_license_compliance_checks_worker_spec.rb'
+ - 'ee/spec/workers/repository_import_worker_spec.rb'
+ - 'ee/spec/workers/scan_security_report_secrets_worker_spec.rb'
+ - 'ee/spec/workers/security/create_orchestration_policy_worker_spec.rb'
+ - 'ee/spec/workers/security/orchestration_policy_rule_schedule_namespace_worker_spec.rb'
+ - 'ee/spec/workers/security/orchestration_policy_rule_schedule_worker_spec.rb'
+ - 'ee/spec/workers/store_security_reports_worker_spec.rb'
+ - 'ee/spec/workers/sync_seat_link_request_worker_spec.rb'
+ - 'ee/spec/workers/update_all_mirrors_worker_spec.rb'
+ - 'ee/spec/workers/vulnerability_exports/export_deletion_worker_spec.rb'
+ - 'lib/api/admin/instance_clusters.rb'
+ - 'lib/api/admin/plan_limits.rb'
+ - 'lib/api/api.rb'
+ - 'lib/api/appearance.rb'
+ - 'lib/api/award_emoji.rb'
+ - 'lib/api/boards_responses.rb'
+ - 'lib/api/branches.rb'
+ - 'lib/api/broadcast_messages.rb'
+ - 'lib/api/ci/jobs.rb'
+ - 'lib/api/ci/pipeline_schedules.rb'
+ - 'lib/api/ci/pipelines.rb'
+ - 'lib/api/ci/runner.rb'
+ - 'lib/api/ci/runners.rb'
+ - 'lib/api/ci/secure_files.rb'
+ - 'lib/api/ci/variables.rb'
+ - 'lib/api/commit_statuses.rb'
+ - 'lib/api/commits.rb'
+ - 'lib/api/composer_packages.rb'
+ - 'lib/api/concerns/packages/conan_endpoints.rb'
+ - 'lib/api/concerns/packages/debian_distribution_endpoints.rb'
+ - 'lib/api/concerns/packages/debian_package_endpoints.rb'
+ - 'lib/api/concerns/packages/nuget_endpoints.rb'
+ - 'lib/api/debian_group_packages.rb'
+ - 'lib/api/debian_project_packages.rb'
+ - 'lib/api/deploy_keys.rb'
+ - 'lib/api/deploy_tokens.rb'
+ - 'lib/api/deployments.rb'
+ - 'lib/api/discussions.rb'
+ - 'lib/api/entities/application_setting.rb'
+ - 'lib/api/entities/basic_project_details.rb'
+ - 'lib/api/entities/branch.rb'
+ - 'lib/api/entities/broadcast_message.rb'
+ - 'lib/api/entities/container_registry.rb'
+ - 'lib/api/entities/deploy_key.rb'
+ - 'lib/api/entities/issue_basic.rb'
+ - 'lib/api/entities/merge_request.rb'
+ - 'lib/api/entities/namespace.rb'
+ - 'lib/api/entities/package.rb'
+ - 'lib/api/entities/project.rb'
+ - 'lib/api/entities/user.rb'
+ - 'lib/api/environments.rb'
+ - 'lib/api/error_tracking/project_settings.rb'
+ - 'lib/api/feature_flags.rb'
+ - 'lib/api/files.rb'
+ - 'lib/api/generic_packages.rb'
+ - 'lib/api/go_proxy.rb'
+ - 'lib/api/group_clusters.rb'
+ - 'lib/api/group_container_repositories.rb'
+ - 'lib/api/group_import.rb'
+ - 'lib/api/group_labels.rb'
+ - 'lib/api/group_packages.rb'
+ - 'lib/api/group_variables.rb'
+ - 'lib/api/groups.rb'
+ - 'lib/api/helm_packages.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/api/helpers/authentication.rb'
+ - 'lib/api/helpers/caching.rb'
+ - 'lib/api/helpers/container_registry_helpers.rb'
+ - 'lib/api/helpers/custom_attributes.rb'
+ - 'lib/api/helpers/file_upload_helpers.rb'
+ - 'lib/api/helpers/groups_helpers.rb'
+ - 'lib/api/helpers/integrations_helpers.rb'
+ - 'lib/api/helpers/internal_helpers.rb'
+ - 'lib/api/helpers/label_helpers.rb'
+ - 'lib/api/helpers/members_helpers.rb'
+ - 'lib/api/helpers/merge_requests_helpers.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/api/helpers/packages/dependency_proxy_helpers.rb'
+ - 'lib/api/helpers/projects_helpers.rb'
+ - 'lib/api/helpers/related_resources_helpers.rb'
+ - 'lib/api/helpers/snippets_helpers.rb'
+ - 'lib/api/helpers/users_helpers.rb'
+ - 'lib/api/helpers/wikis_helpers.rb'
+ - 'lib/api/internal/base.rb'
+ - 'lib/api/internal/kubernetes.rb'
+ - 'lib/api/internal/mail_room.rb'
+ - 'lib/api/internal/pages.rb'
+ - 'lib/api/invitations.rb'
+ - 'lib/api/issues.rb'
+ - 'lib/api/lint.rb'
+ - 'lib/api/markdown.rb'
+ - 'lib/api/maven_packages.rb'
+ - 'lib/api/members.rb'
+ - 'lib/api/merge_request_diffs.rb'
+ - 'lib/api/merge_requests.rb'
+ - 'lib/api/metrics/dashboard/annotations.rb'
+ - 'lib/api/metrics/user_starred_dashboards.rb'
+ - 'lib/api/milestone_responses.rb'
+ - 'lib/api/namespaces.rb'
+ - 'lib/api/notes.rb'
+ - 'lib/api/notification_settings.rb'
+ - 'lib/api/npm_project_packages.rb'
+ - 'lib/api/nuget_group_packages.rb'
+ - 'lib/api/nuget_project_packages.rb'
+ - 'lib/api/pages_domains.rb'
+ - 'lib/api/project_clusters.rb'
+ - 'lib/api/project_container_repositories.rb'
+ - 'lib/api/project_hooks.rb'
+ - 'lib/api/project_import.rb'
+ - 'lib/api/project_packages.rb'
+ - 'lib/api/project_repository_storage_moves.rb'
+ - 'lib/api/project_snippets.rb'
+ - 'lib/api/project_templates.rb'
+ - 'lib/api/projects.rb'
+ - 'lib/api/projects_relation_builder.rb'
+ - 'lib/api/pypi_packages.rb'
+ - 'lib/api/releases.rb'
+ - 'lib/api/repositories.rb'
+ - 'lib/api/resource_access_tokens.rb'
+ - 'lib/api/resource_label_events.rb'
+ - 'lib/api/resource_milestone_events.rb'
+ - 'lib/api/resource_state_events.rb'
+ - 'lib/api/rubygem_packages.rb'
+ - 'lib/api/search.rb'
+ - 'lib/api/settings.rb'
+ - 'lib/api/snippet_repository_storage_moves.rb'
+ - 'lib/api/snippets.rb'
+ - 'lib/api/submodules.rb'
+ - 'lib/api/suggestions.rb'
+ - 'lib/api/tags.rb'
+ - 'lib/api/templates.rb'
+ - 'lib/api/terraform/modules/v1/packages.rb'
+ - 'lib/api/terraform/state.rb'
+ - 'lib/api/time_tracking_endpoints.rb'
+ - 'lib/api/todos.rb'
+ - 'lib/api/users.rb'
+ - 'lib/api/wikis.rb'
+ - 'lib/atlassian/jira_connect/asymmetric_jwt.rb'
+ - 'lib/atlassian/jira_connect/client.rb'
+ - 'lib/atlassian/jira_connect/serializers/repository_entity.rb'
+ - 'lib/backup.rb'
+ - 'lib/backup/files.rb'
+ - 'lib/backup/gitaly_backup.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/banzai/filter/autolink_filter.rb'
+ - 'lib/banzai/filter/inline_diff_filter.rb'
+ - 'lib/banzai/filter/markdown_post_escape_filter.rb'
+ - 'lib/banzai/filter/references/external_issue_reference_filter.rb'
+ - 'lib/banzai/filter/references/issue_reference_filter.rb'
+ - 'lib/banzai/filter/references/iteration_reference_filter.rb'
+ - 'lib/banzai/filter/references/milestone_reference_filter.rb'
+ - 'lib/banzai/filter/references/reference_filter.rb'
+ - 'lib/banzai/filter/references/vulnerability_reference_filter.rb'
+ - 'lib/banzai/filter/spaced_link_filter.rb'
+ - 'lib/banzai/filter/syntax_highlight_filter.rb'
+ - 'lib/banzai/object_renderer.rb'
+ - 'lib/banzai/reference_parser/project_parser.rb'
+ - 'lib/bitbucket/connection.rb'
+ - 'lib/bitbucket_server/client.rb'
+ - 'lib/bulk_imports/clients/http.rb'
+ - 'lib/bulk_imports/common/pipelines/badges_pipeline.rb'
+ - 'lib/bulk_imports/common/pipelines/wiki_pipeline.rb'
+ - 'lib/bulk_imports/common/transformers/prohibited_attributes_transformer.rb'
+ - 'lib/bulk_imports/groups/loaders/group_loader.rb'
+ - 'lib/bulk_imports/projects/pipelines/project_attributes_pipeline.rb'
+ - 'lib/bulk_imports/projects/pipelines/project_pipeline.rb'
+ - 'lib/bulk_imports/projects/pipelines/repository_pipeline.rb'
+ - 'lib/bulk_imports/projects/transformers/project_attributes_transformer.rb'
+ - 'lib/container_registry/base_client.rb'
+ - 'lib/declarative_enum.rb'
+ - 'lib/error_tracking/collector/payload_validator.rb'
+ - 'lib/error_tracking/sentry_client/issue.rb'
+ - 'lib/feature.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/file_size_validator.rb'
+ - 'lib/gem_extensions/active_record/disable_joins/associations/association_scope.rb'
+ - 'lib/generators/gitlab/usage_metric_generator.rb'
+ - 'lib/gitlab/access.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/data_collector.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/stage_query_helpers.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/base_query_builder.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/request_params.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/plan_stage_start.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_query_helpers.rb'
+ - 'lib/gitlab/analytics/unique_visits.rb'
+ - 'lib/gitlab/application_context.rb'
+ - 'lib/gitlab/application_rate_limiter.rb'
+ - 'lib/gitlab/asciidoc.rb'
+ - 'lib/gitlab/auth.rb'
+ - 'lib/gitlab/auth/auth_finders.rb'
+ - 'lib/gitlab/auth/current_user_mode.rb'
+ - 'lib/gitlab/auth/ldap/adapter.rb'
+ - 'lib/gitlab/auth/ldap/dn.rb'
+ - 'lib/gitlab/auth/ldap/person.rb'
+ - 'lib/gitlab/auth/o_auth/session.rb'
+ - 'lib/gitlab/auth/o_auth/user.rb'
+ - 'lib/gitlab/auth/saml/auth_hash.rb'
+ - 'lib/gitlab/auth/user_access_denied_reason.rb'
+ - 'lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb'
+ - 'lib/gitlab/background_migration/backfill_issue_search_data.rb'
+ - 'lib/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb'
+ - 'lib/gitlab/background_migration/backfill_snippet_repositories.rb'
+ - 'lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb'
+ - 'lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects.rb'
+ - 'lib/gitlab/background_migration/copy_column_using_background_migration_job.rb'
+ - 'lib/gitlab/background_migration/create_security_setting.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_remediations.rb'
+ - 'lib/gitlab/background_migration/fix_incorrect_max_seats_used.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_project_feature.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_in_batch.rb'
+ - 'lib/gitlab/background_migration/migrate_job_artifact_registry_to_ssf.rb'
+ - 'lib/gitlab/background_migration/migrate_project_taggings_context_from_tags_to_topics.rb'
+ - 'lib/gitlab/background_migration/migrate_requirements_to_work_items.rb'
+ - 'lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature.rb'
+ - 'lib/gitlab/background_migration/populate_namespace_statistics.rb'
+ - 'lib/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'lib/gitlab/background_migration/populate_uuids_for_security_findings.rb'
+ - 'lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
+ - 'lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings.rb'
+ - 'lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb'
+ - 'lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects.rb'
+ - 'lib/gitlab/background_migration/update_vulnerability_occurrences_location.rb'
+ - 'lib/gitlab/batch_pop_queueing.rb'
+ - 'lib/gitlab/bitbucket_import/importer.rb'
+ - 'lib/gitlab/bitbucket_server_import/importer.rb'
+ - 'lib/gitlab/buffered_io.rb'
+ - 'lib/gitlab/bullet/exclusions.rb'
+ - 'lib/gitlab/cache/helpers.rb'
+ - 'lib/gitlab/changelog/config.rb'
+ - 'lib/gitlab/checks/branch_check.rb'
+ - 'lib/gitlab/checks/lfs_check.rb'
+ - 'lib/gitlab/checks/lfs_integrity.rb'
+ - 'lib/gitlab/checks/matching_merge_request.rb'
+ - 'lib/gitlab/checks/snippet_check.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/build/releaser.rb'
+ - 'lib/gitlab/ci/config.rb'
+ - 'lib/gitlab/ci/config/entry/artifacts.rb'
+ - 'lib/gitlab/ci/config/entry/environment.rb'
+ - 'lib/gitlab/ci/config/entry/job.rb'
+ - 'lib/gitlab/ci/config/entry/port.rb'
+ - 'lib/gitlab/ci/config/entry/processable.rb'
+ - 'lib/gitlab/ci/config/entry/reports/coverage_report.rb'
+ - 'lib/gitlab/ci/config/entry/trigger.rb'
+ - 'lib/gitlab/ci/config/external/file/project.rb'
+ - 'lib/gitlab/ci/config/external/file/remote.rb'
+ - 'lib/gitlab/ci/config/external/mapper.rb'
+ - 'lib/gitlab/ci/parsers/coverage/cobertura.rb'
+ - 'lib/gitlab/ci/parsers/coverage/sax_document.rb'
+ - 'lib/gitlab/ci/parsers/security/common.rb'
+ - 'lib/gitlab/ci/parsers/security/validators/schema_validator.rb'
+ - 'lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines.rb'
+ - 'lib/gitlab/ci/pipeline/chain/create_cross_database_associations.rb'
+ - 'lib/gitlab/ci/pipeline/chain/template_usage.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/abilities.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/after_config.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/external.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/security_orchestration_policy.rb'
+ - 'lib/gitlab/ci/pipeline/seed/build.rb'
+ - 'lib/gitlab/ci/reports/codequality_reports.rb'
+ - 'lib/gitlab/ci/reports/security/finding.rb'
+ - 'lib/gitlab/ci/reports/security/reports.rb'
+ - 'lib/gitlab/ci/reports/test_case.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/ci/reports/test_suite_comparer.rb'
+ - 'lib/gitlab/ci/runner_instructions.rb'
+ - 'lib/gitlab/ci/runner_releases.rb'
+ - 'lib/gitlab/ci/runner_upgrade_check.rb'
+ - 'lib/gitlab/ci/status/build/manual.rb'
+ - 'lib/gitlab/ci/status/build/waiting_for_approval.rb'
+ - 'lib/gitlab/ci/variables/builder.rb'
+ - 'lib/gitlab/cleanup/project_uploads.rb'
+ - 'lib/gitlab/cluster/puma_worker_killer_observer.rb'
+ - 'lib/gitlab/composer/version_index.rb'
+ - 'lib/gitlab/config/entry/configurable.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/config_checker/external_database_checker.rb'
+ - 'lib/gitlab/config_checker/puma_rugged_checker.rb'
+ - 'lib/gitlab/conflict/file.rb'
+ - 'lib/gitlab/conflict/file_collection.rb'
+ - 'lib/gitlab/content_security_policy/config_loader.rb'
+ - 'lib/gitlab/content_security_policy/directives.rb'
+ - 'lib/gitlab/current_settings.rb'
+ - 'lib/gitlab/cycle_analytics/summary/deploy.rb'
+ - 'lib/gitlab/cycle_analytics/summary/deployment_frequency.rb'
+ - 'lib/gitlab/data_builder/push.rb'
+ - 'lib/gitlab/database.rb'
+ - 'lib/gitlab/database/as_with_materialized.rb'
+ - 'lib/gitlab/database/async_indexes/migration_helpers.rb'
+ - 'lib/gitlab/database/background_migration/batched_job.rb'
+ - 'lib/gitlab/database/background_migration/batched_job_transition_log.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration_runner.rb'
+ - 'lib/gitlab/database/batch_count.rb'
+ - 'lib/gitlab/database/batch_counter.rb'
+ - 'lib/gitlab/database/count/reltuples_count_strategy.rb'
+ - 'lib/gitlab/database/gitlab_schema.rb'
+ - 'lib/gitlab/database/load_balancing/configuration.rb'
+ - 'lib/gitlab/database/load_balancing/host.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/migration_helpers/cascading_namespace_settings.rb'
+ - 'lib/gitlab/database/migration_helpers/v2.rb'
+ - 'lib/gitlab/database/migrations/background_migration_helpers.rb'
+ - 'lib/gitlab/database/migrations/batched_background_migration_helpers.rb'
+ - 'lib/gitlab/database/migrations/runner.rb'
+ - 'lib/gitlab/database/migrations/test_background_runner.rb'
+ - 'lib/gitlab/database/partitioning/detached_partition_dropper.rb'
+ - 'lib/gitlab/database/partitioning/partition_manager.rb'
+ - 'lib/gitlab/database/partitioning/partition_monitoring.rb'
+ - 'lib/gitlab/database/partitioning/replace_table.rb'
+ - 'lib/gitlab/database/partitioning/single_numeric_list_partition.rb'
+ - 'lib/gitlab/database/partitioning/sliding_list_strategy.rb'
+ - 'lib/gitlab/database/partitioning/time_partition.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb'
+ - 'lib/gitlab/database/postgres_foreign_key.rb'
+ - 'lib/gitlab/database/postgres_hll/batch_distinct_counter.rb'
+ - 'lib/gitlab/database/postgres_hll/buckets.rb'
+ - 'lib/gitlab/database/postgres_index.rb'
+ - 'lib/gitlab/database/postgres_partition.rb'
+ - 'lib/gitlab/database/postgres_partitioned_table.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb'
+ - 'lib/gitlab/database/reflection.rb'
+ - 'lib/gitlab/database/reindexing.rb'
+ - 'lib/gitlab/database/reindexing/coordinator.rb'
+ - 'lib/gitlab/database/reindexing/grafana_notifier.rb'
+ - 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
+ - 'lib/gitlab/database/schema_cleaner.rb'
+ - 'lib/gitlab/database/schema_migrations/context.rb'
+ - 'lib/gitlab/database/similarity_score.rb'
+ - 'lib/gitlab/database/with_lock_retries.rb'
+ - 'lib/gitlab/database/with_lock_retries_outside_transaction.rb'
+ - 'lib/gitlab/database_importers/instance_administrators/create_group.rb'
+ - 'lib/gitlab/database_importers/self_monitoring/project/create_service.rb'
+ - 'lib/gitlab/dependency_linker/base_linker.rb'
+ - 'lib/gitlab/dependency_linker/go_mod_linker.rb'
+ - 'lib/gitlab/dependency_linker/go_sum_linker.rb'
+ - 'lib/gitlab/diff/file.rb'
+ - 'lib/gitlab/diff/file_collection/base.rb'
+ - 'lib/gitlab/diff/formatters/base_formatter.rb'
+ - 'lib/gitlab/diff/highlight_cache.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/diff/rendered/notebook/diff_file.rb'
+ - 'lib/gitlab/elasticsearch/logs/lines.rb'
+ - 'lib/gitlab/email/failure_handler.rb'
+ - 'lib/gitlab/email/handler/create_issue_handler.rb'
+ - 'lib/gitlab/email/handler/create_merge_request_handler.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/base.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/create.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/experience.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/team.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/trial.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/trial_short.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
+ - 'lib/gitlab/encrypted_command_base.rb'
+ - 'lib/gitlab/encrypted_configuration.rb'
+ - 'lib/gitlab/endpoint_attributes/config.rb'
+ - 'lib/gitlab/event_store/event.rb'
+ - 'lib/gitlab/event_store/store.rb'
+ - 'lib/gitlab/event_store/subscription.rb'
+ - 'lib/gitlab/experimentation.rb'
+ - 'lib/gitlab/experimentation/controller_concern.rb'
+ - 'lib/gitlab/external_authorization/client.rb'
+ - 'lib/gitlab/faraday/error_callback.rb'
+ - 'lib/gitlab/file_detector.rb'
+ - 'lib/gitlab/fips.rb'
+ - 'lib/gitlab/fogbugz_import/client.rb'
+ - 'lib/gitlab/fogbugz_import/importer.rb'
+ - 'lib/gitlab/fogbugz_import/project_creator.rb'
+ - 'lib/gitlab/git/blob.rb'
+ - 'lib/gitlab/git/conflict/file.rb'
+ - 'lib/gitlab/git/conflict/resolver.rb'
+ - 'lib/gitlab/git/remote_mirror.rb'
+ - 'lib/gitlab/git/repository.rb'
+ - 'lib/gitlab/git/rugged_impl/repository.rb'
+ - 'lib/gitlab/git/user.rb'
+ - 'lib/gitlab/git/wiki.rb'
+ - 'lib/gitlab/git_access.rb'
+ - 'lib/gitlab/git_access_project.rb'
+ - 'lib/gitlab/git_access_snippet.rb'
+ - 'lib/gitlab/git_access_wiki.rb'
+ - 'lib/gitlab/gitaly_client.rb'
+ - 'lib/gitlab/gitaly_client/blob_service.rb'
+ - 'lib/gitlab/gitaly_client/call.rb'
+ - 'lib/gitlab/gitaly_client/commit_service.rb'
+ - 'lib/gitlab/gitaly_client/conflicts_service.rb'
+ - 'lib/gitlab/gitaly_client/operation_service.rb'
+ - 'lib/gitlab/gitaly_client/praefect_info_service.rb'
+ - 'lib/gitlab/gitaly_client/ref_service.rb'
+ - 'lib/gitlab/gitaly_client/remote_service.rb'
+ - 'lib/gitlab/gitaly_client/repository_service.rb'
+ - 'lib/gitlab/gitaly_client/server_service.rb'
+ - 'lib/gitlab/gitaly_client/wiki_service.rb'
+ - 'lib/gitlab/github_import.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_importer.rb'
+ - 'lib/gitlab/github_import/issuable_finder.rb'
+ - 'lib/gitlab/github_import/parallel_scheduling.rb'
+ - 'lib/gitlab/gitlab_import/client.rb'
+ - 'lib/gitlab/gitlab_import/importer.rb'
+ - 'lib/gitlab/gl_repository.rb'
+ - 'lib/gitlab/global_id/deprecations.rb'
+ - 'lib/gitlab/golang.rb'
+ - 'lib/gitlab/gpg/invalid_gpg_signature_updater.rb'
+ - 'lib/gitlab/grape_logging/formatters/lograge_with_timestamp.rb'
+ - 'lib/gitlab/grape_logging/loggers/client_env_logger.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/query_builder.rb'
+ - 'lib/gitlab/graphql/query_analyzers/logger_analyzer.rb'
+ - 'lib/gitlab/graphql/query_analyzers/recursion_analyzer.rb'
+ - 'lib/gitlab/graphql/timeout.rb'
+ - 'lib/gitlab/group_search_results.rb'
+ - 'lib/gitlab/hashed_storage/migrator.rb'
+ - 'lib/gitlab/hook_data/key_builder.rb'
+ - 'lib/gitlab/hotlinking_detector.rb'
+ - 'lib/gitlab/http_io.rb'
+ - 'lib/gitlab/i18n/po_linter.rb'
+ - 'lib/gitlab/import_export/attribute_cleaner.rb'
+ - 'lib/gitlab/import_export/attributes_permitter.rb'
+ - 'lib/gitlab/import_export/base/object_builder.rb'
+ - 'lib/gitlab/import_export/base/relation_factory.rb'
+ - 'lib/gitlab/import_export/base/relation_object_saver.rb'
+ - 'lib/gitlab/import_export/file_importer.rb'
+ - 'lib/gitlab/import_export/group/relation_tree_restorer.rb'
+ - 'lib/gitlab/import_export/importer.rb'
+ - 'lib/gitlab/import_export/json/legacy_reader.rb'
+ - 'lib/gitlab/import_export/json/streaming_serializer.rb'
+ - 'lib/gitlab/import_export/lfs_saver.rb'
+ - 'lib/gitlab/import_export/members_mapper.rb'
+ - 'lib/gitlab/import_export/project/export_task.rb'
+ - 'lib/gitlab/import_export/project/relation_factory.rb'
+ - 'lib/gitlab/import_export/project/sample/relation_factory.rb'
+ - 'lib/gitlab/import_export/snippet_repo_restorer.rb'
+ - 'lib/gitlab/import_export/version_checker.rb'
+ - 'lib/gitlab/instrumentation/redis_base.rb'
+ - 'lib/gitlab/instrumentation_helper.rb'
+ - 'lib/gitlab/issues/rebalancing/state.rb'
+ - 'lib/gitlab/jira/http_client.rb'
+ - 'lib/gitlab/jira_import.rb'
+ - 'lib/gitlab/jira_import/base_importer.rb'
+ - 'lib/gitlab/jira_import/issues_importer.rb'
+ - 'lib/gitlab/kubernetes/cilium_network_policy.rb'
+ - 'lib/gitlab/kubernetes/helm/pod.rb'
+ - 'lib/gitlab/kubernetes/kubectl_cmd.rb'
+ - 'lib/gitlab/kubernetes/network_policy.rb'
+ - 'lib/gitlab/kubernetes/pod_cmd.rb'
+ - 'lib/gitlab/legacy_github_import/importer.rb'
+ - 'lib/gitlab/legacy_github_import/project_creator.rb'
+ - 'lib/gitlab/local_and_remote_storage_migration/base_migrater.rb'
+ - 'lib/gitlab/lograge/custom_options.rb'
+ - 'lib/gitlab/mail_room/authenticator.rb'
+ - 'lib/gitlab/markdown_cache/active_record/extension.rb'
+ - 'lib/gitlab/merge_requests/commit_message_generator.rb'
+ - 'lib/gitlab/metrics/dashboard/importer.rb'
+ - 'lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/alerts_inserter.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/cluster_endpoint_inserter.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/custom_metrics_details_inserter.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/metric_endpoint_inserter.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/variable_endpoint_inserter.rb'
+ - 'lib/gitlab/metrics/dashboard/url.rb'
+ - 'lib/gitlab/metrics/dashboard/validator.rb'
+ - 'lib/gitlab/metrics/dashboard/validator/errors.rb'
+ - 'lib/gitlab/metrics/rails_slis.rb'
+ - 'lib/gitlab/metrics/samplers/action_cable_sampler.rb'
+ - 'lib/gitlab/metrics/samplers/puma_sampler.rb'
+ - 'lib/gitlab/metrics/samplers/ruby_sampler.rb'
+ - 'lib/gitlab/metrics/subscribers/active_record.rb'
+ - 'lib/gitlab/metrics/transaction.rb'
+ - 'lib/gitlab/metrics/web_transaction.rb'
+ - 'lib/gitlab/middleware/go.rb'
+ - 'lib/gitlab/middleware/read_only/controller.rb'
+ - 'lib/gitlab/middleware/speedscope.rb'
+ - 'lib/gitlab/object_hierarchy.rb'
+ - 'lib/gitlab/octokit/middleware.rb'
+ - 'lib/gitlab/pagination/keyset/column_order_definition.rb'
+ - 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb'
+ - 'lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb'
+ - 'lib/gitlab/pagination/keyset/order.rb'
+ - 'lib/gitlab/pagination/keyset/pager.rb'
+ - 'lib/gitlab/pagination/keyset/paginator.rb'
+ - 'lib/gitlab/pagination/keyset/simple_order_builder.rb'
+ - 'lib/gitlab/pagination/offset_header_builder.rb'
+ - 'lib/gitlab/pagination/offset_pagination.rb'
+ - 'lib/gitlab/patch/database_config.rb'
+ - 'lib/gitlab/path_regex.rb'
+ - 'lib/gitlab/profiler.rb'
+ - 'lib/gitlab/project_search_results.rb'
+ - 'lib/gitlab/project_template.rb'
+ - 'lib/gitlab/prometheus/queries/base_query.rb'
+ - 'lib/gitlab/prometheus/queries/deployment_query.rb'
+ - 'lib/gitlab/prometheus/queries/query_additional_metrics.rb'
+ - 'lib/gitlab/prometheus_client.rb'
+ - 'lib/gitlab/query_limiting/active_support_subscriber.rb'
+ - 'lib/gitlab/quick_actions/issuable_actions.rb'
+ - 'lib/gitlab/quick_actions/issue_actions.rb'
+ - 'lib/gitlab/quick_actions/issue_and_merge_request_actions.rb'
+ - 'lib/gitlab/quick_actions/merge_request_actions.rb'
+ - 'lib/gitlab/quick_actions/relate_actions.rb'
+ - 'lib/gitlab/rack_attack.rb'
+ - 'lib/gitlab/redis/wrapper.rb'
+ - 'lib/gitlab/reference_extractor.rb'
+ - 'lib/gitlab/regex.rb'
+ - 'lib/gitlab/relative_positioning/item_context.rb'
+ - 'lib/gitlab/repository_size_error_message.rb'
+ - 'lib/gitlab/sample_data_template.rb'
+ - 'lib/gitlab/sanitizers/svg/whitelist.rb'
+ - 'lib/gitlab/search/abuse_detection.rb'
+ - 'lib/gitlab/search_results.rb'
+ - 'lib/gitlab/setup_helper.rb'
+ - 'lib/gitlab/sidekiq_config.rb'
+ - 'lib/gitlab/sidekiq_config/worker_router.rb'
+ - 'lib/gitlab/sidekiq_daemon/memory_killer.rb'
+ - 'lib/gitlab/sidekiq_daemon/monitor.rb'
+ - 'lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb'
+ - 'lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/deduplicates_when_scheduling.rb'
+ - 'lib/gitlab/sidekiq_middleware/memory_killer.rb'
+ - 'lib/gitlab/sidekiq_middleware/server_metrics.rb'
+ - 'lib/gitlab/sidekiq_middleware/size_limiter/compressor.rb'
+ - 'lib/gitlab/sidekiq_versioning.rb'
+ - 'lib/gitlab/slash_commands/issue_new.rb'
+ - 'lib/gitlab/sql/pattern.rb'
+ - 'lib/gitlab/ssh_public_key.rb'
+ - 'lib/gitlab/static_site_editor/config/generated_config.rb'
+ - 'lib/gitlab/subscription_portal.rb'
+ - 'lib/gitlab/tracking.rb'
+ - 'lib/gitlab/tracking/destinations/snowplow.rb'
+ - 'lib/gitlab/tracking/event_definition.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/gitlab/usage/metric_definition.rb'
+ - 'lib/gitlab/usage/metrics/aggregates/aggregate.rb'
+ - 'lib/gitlab/usage/metrics/aggregates/sources/calculations/intersection.rb'
+ - 'lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb'
+ - 'lib/gitlab/usage/metrics/instrumentations/database_metric.rb'
+ - 'lib/gitlab/usage/metrics/name_suggestion.rb'
+ - 'lib/gitlab/usage/metrics/names_suggestions/generator.rb'
+ - 'lib/gitlab/usage/service_ping_report.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/gitlab/usage_data/topology.rb'
+ - 'lib/gitlab/usage_data_counters/base_counter.rb'
+ - 'lib/gitlab/usage_data_counters/editor_unique_counter.rb'
+ - 'lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter.rb'
+ - 'lib/gitlab/usage_data_counters/hll_redis_counter.rb'
+ - 'lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb'
+ - 'lib/gitlab/usage_data_counters/jetbrains_plugin_activity_unique_counter.rb'
+ - 'lib/gitlab/usage_data_counters/track_unique_events.rb'
+ - 'lib/gitlab/utils/delegator_override/error.rb'
+ - 'lib/gitlab/utils/markdown.rb'
+ - 'lib/gitlab/utils/override.rb'
+ - 'lib/gitlab/utils/usage_data.rb'
+ - 'lib/gitlab/webpack/manifest.rb'
+ - 'lib/gitlab/wiki_pages/front_matter_parser.rb'
+ - 'lib/gitlab/word_diff/parser.rb'
+ - 'lib/gitlab/x509/tag.rb'
+ - 'lib/google_api/cloud_platform/client.rb'
+ - 'lib/peek/views/memory.rb'
+ - 'lib/quality/seeders/issues.rb'
+ - 'lib/rouge/formatters/html_gitlab.rb'
+ - 'lib/security/ci_configuration/base_build_action.rb'
+ - 'lib/security/ci_configuration/sast_build_action.rb'
+ - 'lib/sidebars/groups/menus/packages_registries_menu.rb'
+ - 'lib/sidebars/groups/menus/settings_menu.rb'
+ - 'lib/sidebars/menu_item.rb'
+ - 'lib/sidebars/projects/menus/infrastructure_menu.rb'
+ - 'lib/sidebars/projects/menus/packages_registries_menu.rb'
+ - 'lib/sidebars/projects/menus/repository_menu.rb'
+ - 'lib/sidebars/projects/panel.rb'
+ - 'lib/system_check/app/orphaned_group_members_check.rb'
+ - 'lib/system_check/app/redis_version_check.rb'
+ - 'lib/system_check/incoming_email/mail_room_enabled_check.rb'
+ - 'lib/system_check/incoming_email/mail_room_running_check.rb'
+ - 'lib/tasks/dev.rake'
+ - 'lib/tasks/gitlab/assets.rake'
+ - 'lib/tasks/gitlab/db.rake'
+ - 'lib/tasks/gitlab/db/validate_config.rake'
+ - 'lib/tasks/gitlab/dependency_proxy/migrate.rake'
+ - 'lib/tasks/gitlab/docs/redirect.rake'
+ - 'lib/tasks/gitlab/external_diffs.rake'
+ - 'lib/tasks/gitlab/generate_sample_prometheus_data.rake'
+ - 'lib/tasks/gitlab/graphql.rake'
+ - 'lib/tasks/gitlab/info.rake'
+ - 'lib/tasks/gitlab/packages/events.rake'
+ - 'lib/tasks/gitlab/packages/migrate.rake'
+ - 'lib/tasks/gitlab/pages.rake'
+ - 'lib/tasks/gitlab/seed/group_seed.rake'
+ - 'lib/tasks/gitlab/shell.rake'
+ - 'lib/tasks/gitlab/sidekiq.rake'
+ - 'lib/tasks/gitlab/snippets.rake'
+ - 'lib/tasks/gitlab/storage.rake'
+ - 'lib/tasks/gitlab/terraform/migrate.rake'
+ - 'lib/tasks/gitlab/update_templates.rake'
+ - 'lib/tasks/gitlab/usage_data.rake'
+ - 'lib/tasks/gitlab/user_management.rake'
+ - 'lib/tasks/gitlab/workhorse.rake'
+ - 'lib/tasks/import.rake'
+ - 'lib/tasks/migrate/schema_check.rake'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'lib/tasks/test.rake'
+ - 'lib/uploaded_file.rb'
+ - 'qa/qa/ee/page/group/secure/show.rb'
+ - 'qa/qa/ee/page/group/settings/general.rb'
+ - 'qa/qa/ee/page/group/settings/saml_sso.rb'
+ - 'qa/qa/ee/page/merge_request/show.rb'
+ - 'qa/qa/ee/page/project/job/show.rb'
+ - 'qa/qa/ee/page/project/secure/license_compliance.rb'
+ - 'qa/qa/ee/page/project/secure/security_dashboard.rb'
+ - 'qa/qa/ee/page/project/secure/show.rb'
+ - 'qa/qa/ee/resource/license.rb'
+ - 'qa/qa/fixtures/auto_devops_rack/config.ru'
+ - 'qa/qa/flow/sign_up.rb'
+ - 'qa/qa/git/repository.rb'
+ - 'qa/qa/page/base.rb'
+ - 'qa/qa/page/component/ci_badge_link.rb'
+ - 'qa/qa/page/component/design_management.rb'
+ - 'qa/qa/page/component/invite_members_modal.rb'
+ - 'qa/qa/page/component/issuable/sidebar.rb'
+ - 'qa/qa/page/component/select2.rb'
+ - 'qa/qa/page/dashboard/snippet/index.rb'
+ - 'qa/qa/page/dashboard/todos.rb'
+ - 'qa/qa/page/group/settings/group_deploy_tokens.rb'
+ - 'qa/qa/page/group/settings/package_registries.rb'
+ - 'qa/qa/page/merge_request/new.rb'
+ - 'qa/qa/page/project/import/repo_by_url.rb'
+ - 'qa/qa/page/project/issue/index.rb'
+ - 'qa/qa/page/project/registry/show.rb'
+ - 'qa/qa/page/project/settings/protected_branches.rb'
+ - 'qa/qa/page/project/web_ide/edit.rb'
+ - 'qa/qa/resource/api_fabricator.rb'
+ - 'qa/qa/resource/file.rb'
+ - 'qa/qa/resource/members.rb'
+ - 'qa/qa/resource/project.rb'
+ - 'qa/qa/resource/protected_branch.rb'
+ - 'qa/qa/resource/registry_repository.rb'
+ - 'qa/qa/resource/repository/push.rb'
+ - 'qa/qa/resource/reusable.rb'
+ - 'qa/qa/resource/reusable_collection.rb'
+ - 'qa/qa/resource/reusable_group.rb'
+ - 'qa/qa/resource/reusable_project.rb'
+ - 'qa/qa/resource/runner.rb'
+ - 'qa/qa/resource/snippet.rb'
+ - 'qa/qa/resource/wiki/group_page.rb'
+ - 'qa/qa/runtime/api/repository_storage_moves.rb'
+ - 'qa/qa/runtime/application_settings.rb'
+ - 'qa/qa/runtime/browser.rb'
+ - 'qa/qa/runtime/env.rb'
+ - 'qa/qa/runtime/feature.rb'
+ - 'qa/qa/runtime/fixtures.rb'
+ - 'qa/qa/runtime/ip_address.rb'
+ - 'qa/qa/runtime/search.rb'
+ - 'qa/qa/scenario/bootable.rb'
+ - 'qa/qa/scenario/template.rb'
+ - 'qa/qa/service/cluster_provider/gcloud.rb'
+ - 'qa/qa/service/cluster_provider/k3s.rb'
+ - 'qa/qa/service/cluster_provider/k3s_cilium.rb'
+ - 'qa/qa/service/kubernetes_cluster.rb'
+ - 'qa/qa/service/praefect_manager.rb'
+ - 'qa/qa/specs/features/api/1_manage/project_access_token_spec.rb'
+ - 'qa/qa/specs/features/api/1_manage/rate_limits_spec.rb'
+ - 'qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb'
+ - 'qa/qa/specs/features/api/1_manage/users_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_connectivity_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/integrations/webhook_events_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/repository/files_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/snippet/snippet_repository_storage_move_spec.rb'
+ - 'qa/qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb'
+ - 'qa/qa/specs/features/api/5_package/container_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/14_non_devops/performance_bar_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/group/create_group_with_mattermost_team_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/log_in_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/log_into_mattermost_via_gitlab_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/maintain_log_in_mixed_env_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/project_access_token_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/issue_suggestions_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/transient/comment_on_discussion_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/design_management/modify_design_content_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/jira/jira_basic_integration_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/add_list_delete_branches_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/delete_file_via_web_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/file_with_unusual_name_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/create_first_file_in_web_ide_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/open_web_ide_from_diff_tab_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_content_creation_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_content_manipulation_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_list_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_page_deletion_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/mr_event_rule_pipeline_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/container_registry/online_garbage_collection_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/6_release/pages/pages_pipeline_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/6_release/pipeline/multi-project_pipelines_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_dependent_relationship_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_independent_relationship_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb'
+ - 'qa/qa/specs/features/ee/api/12_geo/geo_nodes_spec.rb'
+ - 'qa/qa/specs/features/ee/api/1_manage/user/minimal_access_user_spec.rb'
+ - 'qa/qa/specs/features/ee/api/2_plan/epics_milestone_dates_spec.rb'
+ - 'qa/qa/specs/features/ee/api/3_create/wiki/group_wiki_repository_storage_move_spec.rb'
+ - 'qa/qa/specs/features/ee/api/7_configure/kubernetes/kubernetes_agent_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/advanced_global_advanced_syntax_search_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/elasticsearch_api_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/index_tests/issues_index/issue_index_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/index_tests/main_index/blob_index_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/index_tests/merge_request_index/merge_request_index_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/index_tests/notes_index/note_index_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/nightly_elasticsearch_test_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/10_protect/policies_list_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/10_protect/policy_alerts_list_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/free_trial_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_ci_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_storage_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/upgrade_group_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/user_registration_billing_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/attachment_replication_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/database_delete_replication_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/geo_replication_ci_job_log_artifacts_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/geo_replication_maven_package_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/geo_replication_npm_registry_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/geo_replication_project_snippets_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/http_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/http_push_to_secondary_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/ssh_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/ssh_push_to_secondary_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_http_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_http_push_to_secondary_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_ssh_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_ssh_push_to_secondary_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/create_merge_request_with_secure_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/license_compliance_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/merge_request_license_widget_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/security_reports_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/vulnerability_management_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_1_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_2_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_enforced_sso_git_access_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_enforced_sso_new_account_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_non_enforced_sso_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/prevent_forking_outside_group_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/restrict_by_ip_address_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/share_group_with_group_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/instance/instance_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/ldap/admin_ldap_sync_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/user/minimal_access_user_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/burndown_chart/burndown_chart_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/custom_email/custom_email_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issue/default_issue_template_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issue_boards/configure_issue_board_by_label_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issue_boards/create_group_issue_board_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issue_boards/group_issue_boards_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issue_boards/read_only_board_configuration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issue_boards/sum_of_issues_weights_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issues_analytics/issues_analytics_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issues_weight/issue_weight_visualization_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/iterations/assign_group_iteration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/iterations/create_group_iteration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/four_assignees_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/merge_request/add_batch_comments_in_merge_request_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/merge_request/default_merge_request_template_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/code_owners_with_protected_branch_and_squashed_commits_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_root_group_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_subgroup_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/4_verify/cancelling_merge_request_in_merge_train_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/4_verify/pipeline_status_on_operation_dashboard_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/4_verify/pipeline_subscription_with_group_owned_project_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/4_verify/transient/merge_trains_transient_bug_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/5_package/dependency_proxy_sso_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/9_enablement/elasticsearch/elasticsearch_reindexing_spec.rb'
+ - 'qa/qa/specs/helpers/context_selector.rb'
+ - 'qa/qa/specs/parallel_runner.rb'
+ - 'qa/qa/specs/runner.rb'
+ - 'qa/qa/support/loglinking.rb'
+ - 'qa/qa/support/page_error_checker.rb'
+ - 'qa/qa/support/run.rb'
+ - 'qa/qa/support/ssh.rb'
+ - 'qa/qa/support/wait_for_requests.rb'
+ - 'qa/qa/tools/delete_projects.rb'
+ - 'qa/qa/tools/delete_subgroups.rb'
+ - 'qa/qa/tools/delete_test_ssh_keys.rb'
+ - 'qa/qa/tools/delete_test_users.rb'
+ - 'qa/qa/tools/generate_perf_testdata.rb'
+ - 'qa/qa/tools/initialize_gitlab_auth.rb'
+ - 'qa/qa/tools/revoke_all_personal_access_tokens.rb'
+ - 'qa/qa/tools/test_resources_handler.rb'
+ - 'qa/qa/vendor/jenkins/page/configure_job.rb'
+ - 'qa/qa/vendor/jenkins/page/login.rb'
+ - 'qa/spec/git/repository_spec.rb'
+ - 'qa/spec/page/logging_spec.rb'
+ - 'qa/spec/qa_deprecation_toolkit_env.rb'
+ - 'qa/spec/resource/api_fabricator_spec.rb'
+ - 'qa/spec/runtime/env_spec.rb'
+ - 'qa/spec/runtime/feature_spec.rb'
+ - 'qa/spec/scenario/template_spec.rb'
+ - 'qa/spec/spec_helper.rb'
+ - 'qa/spec/specs/helpers/context_selector_spec.rb'
+ - 'qa/spec/specs/helpers/quarantine_spec.rb'
+ - 'qa/spec/specs/runner_spec.rb'
+ - 'qa/spec/support/loglinking_spec.rb'
+ - 'qa/spec/support/page_error_checker_spec.rb'
+ - 'qa/spec/support/repeater_spec.rb'
+ - 'qa/spec/support/run_spec.rb'
+ - 'qa/spec/support/ssh_spec.rb'
+ - 'rubocop/cop/active_model_errors_direct_manipulation.rb'
+ - 'rubocop/cop/avoid_break_from_strong_memoize.rb'
+ - 'rubocop/cop/gitlab/avoid_uploaded_file_from_params.rb'
+ - 'rubocop/cop/gitlab/feature_available_usage.rb'
+ - 'rubocop/cop/gitlab/mark_used_feature_flags.rb'
+ - 'rubocop/cop/inject_enterprise_edition_module.rb'
+ - 'rubocop/cop/migration/add_limit_to_text_columns.rb'
+ - 'rubocop/cop/migration/add_reference.rb'
+ - 'rubocop/cop/migration/prevent_global_enable_lock_retries_with_disable_ddl_transaction.rb'
+ - 'rubocop/cop/migration/safer_boolean_column.rb'
+ - 'rubocop/cop/migration/versioned_migration_class.rb'
+ - 'rubocop/cop/migration/with_lock_retries_disallowed_method.rb'
+ - 'rubocop/cop/performance/ar_exists_and_present_blank.rb'
+ - 'rubocop/cop/qa/selector_usage.rb'
+ - 'rubocop/cop/rspec/top_level_describe_path.rb'
+ - 'rubocop/cop/static_translation_definition.rb'
+ - 'rubocop/cop/usage_data/large_table.rb'
+ - 'scripts/api/cancel_pipeline.rb'
+ - 'scripts/api/download_job_artifact.rb'
+ - 'scripts/api/get_job_id.rb'
+ - 'scripts/changed-feature-flags'
+ - 'scripts/failed_tests.rb'
+ - 'scripts/flaky_examples/prune-old-flaky-examples'
+ - 'scripts/lib/gitlab.rb'
+ - 'scripts/lint_templates_bash.rb'
+ - 'scripts/no-dir-check'
+ - 'scripts/perf/query_limiting_report.rb'
+ - 'scripts/pipeline_test_report_builder.rb'
+ - 'scripts/review_apps/automated_cleanup.rb'
+ - 'scripts/rubocop-max-files-in-cache-check'
+ - 'scripts/security-harness'
+ - 'scripts/static-analysis'
+ - 'scripts/trigger-build.rb'
+ - 'scripts/verify-tff-mapping'
+ - 'sidekiq_cluster/cli.rb'
+ - 'sidekiq_cluster/sidekiq_cluster.rb'
+ - 'spec/benchmarks/banzai_benchmark.rb'
+ - 'spec/commands/metrics_server/metrics_server_spec.rb'
+ - 'spec/commands/sidekiq_cluster/cli_spec.rb'
+ - 'spec/components/pajamas/alert_component_spec.rb'
+ - 'spec/config/metrics/aggregates/aggregated_metrics_spec.rb'
+ - 'spec/config/settings_spec.rb'
+ - 'spec/controllers/admin/application_settings_controller_spec.rb'
+ - 'spec/controllers/admin/groups_controller_spec.rb'
+ - 'spec/controllers/admin/impersonations_controller_spec.rb'
+ - 'spec/controllers/admin/projects_controller_spec.rb'
+ - 'spec/controllers/admin/requests_profiles_controller_spec.rb'
+ - 'spec/controllers/admin/users_controller_spec.rb'
+ - 'spec/controllers/application_controller_spec.rb'
+ - 'spec/controllers/boards/issues_controller_spec.rb'
+ - 'spec/controllers/concerns/check_rate_limit_spec.rb'
+ - 'spec/controllers/concerns/confirm_email_warning_spec.rb'
+ - 'spec/controllers/concerns/issuable_actions_spec.rb'
+ - 'spec/controllers/concerns/metrics_dashboard_spec.rb'
+ - 'spec/controllers/concerns/product_analytics_tracking_spec.rb'
+ - 'spec/controllers/concerns/send_file_upload_spec.rb'
+ - 'spec/controllers/concerns/sourcegraph_decorator_spec.rb'
+ - 'spec/controllers/concerns/spammable_actions/akismet_mark_as_spam_action_spec.rb'
+ - 'spec/controllers/concerns/static_object_external_storage_spec.rb'
+ - 'spec/controllers/dashboard/milestones_controller_spec.rb'
+ - 'spec/controllers/dashboard/projects_controller_spec.rb'
+ - 'spec/controllers/every_controller_spec.rb'
+ - 'spec/controllers/explore/projects_controller_spec.rb'
+ - 'spec/controllers/groups/children_controller_spec.rb'
+ - 'spec/controllers/groups/clusters_controller_spec.rb'
+ - 'spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb'
+ - 'spec/controllers/groups/labels_controller_spec.rb'
+ - 'spec/controllers/groups/milestones_controller_spec.rb'
+ - 'spec/controllers/groups/releases_controller_spec.rb'
+ - 'spec/controllers/groups/settings/applications_controller_spec.rb'
+ - 'spec/controllers/groups/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/groups/settings/integrations_controller_spec.rb'
+ - 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/controllers/import/available_namespaces_controller_spec.rb'
+ - 'spec/controllers/import/bitbucket_controller_spec.rb'
+ - 'spec/controllers/import/bitbucket_server_controller_spec.rb'
+ - 'spec/controllers/import/bulk_imports_controller_spec.rb'
+ - 'spec/controllers/import/fogbugz_controller_spec.rb'
+ - 'spec/controllers/import/gitea_controller_spec.rb'
+ - 'spec/controllers/import/github_controller_spec.rb'
+ - 'spec/controllers/import/gitlab_controller_spec.rb'
+ - 'spec/controllers/invites_controller_spec.rb'
+ - 'spec/controllers/jira_connect/app_descriptor_controller_spec.rb'
+ - 'spec/controllers/jira_connect/events_controller_spec.rb'
+ - 'spec/controllers/jira_connect/subscriptions_controller_spec.rb'
+ - 'spec/controllers/metrics_controller_spec.rb'
+ - 'spec/controllers/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/passwords_controller_spec.rb'
+ - 'spec/controllers/profiles/accounts_controller_spec.rb'
+ - 'spec/controllers/profiles/notifications_controller_spec.rb'
+ - 'spec/controllers/profiles/webauthn_registrations_controller_spec.rb'
+ - 'spec/controllers/profiles_controller_spec.rb'
+ - 'spec/controllers/projects/alerting/notifications_controller_spec.rb'
+ - 'spec/controllers/projects/analytics/cycle_analytics/summary_controller_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/autocomplete_sources_controller_spec.rb'
+ - 'spec/controllers/projects/blob_controller_spec.rb'
+ - 'spec/controllers/projects/branches_controller_spec.rb'
+ - 'spec/controllers/projects/clusters_controller_spec.rb'
+ - 'spec/controllers/projects/commit_controller_spec.rb'
+ - 'spec/controllers/projects/compare_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb'
+ - 'spec/controllers/projects/discussions_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_controller_spec.rb'
+ - 'spec/controllers/projects/forks_controller_spec.rb'
+ - 'spec/controllers/projects/group_links_controller_spec.rb'
+ - 'spec/controllers/projects/imports_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/jobs_controller_spec.rb'
+ - 'spec/controllers/projects/labels_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/conflicts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/content_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/diffs_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/drafts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/milestones_controller_spec.rb'
+ - 'spec/controllers/projects/mirrors_controller_spec.rb'
+ - 'spec/controllers/projects/notes_controller_spec.rb'
+ - 'spec/controllers/projects/performance_monitoring/dashboards_controller_spec.rb'
+ - 'spec/controllers/projects/pipeline_schedules_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines/tests_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/controllers/projects/project_members_controller_spec.rb'
+ - 'spec/controllers/projects/prometheus/metrics_controller_spec.rb'
+ - 'spec/controllers/projects/registry/tags_controller_spec.rb'
+ - 'spec/controllers/projects/repositories_controller_spec.rb'
+ - 'spec/controllers/projects/runners_controller_spec.rb'
+ - 'spec/controllers/projects/serverless/functions_controller_spec.rb'
+ - 'spec/controllers/projects/service_desk_controller_spec.rb'
+ - 'spec/controllers/projects/service_ping_controller_spec.rb'
+ - 'spec/controllers/projects/services_controller_spec.rb'
+ - 'spec/controllers/projects/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/projects/settings/operations_controller_spec.rb'
+ - 'spec/controllers/projects/settings/repository_controller_spec.rb'
+ - 'spec/controllers/projects/snippets_controller_spec.rb'
+ - 'spec/controllers/projects/templates_controller_spec.rb'
+ - 'spec/controllers/projects/tree_controller_spec.rb'
+ - 'spec/controllers/projects/uploads_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/registrations_controller_spec.rb'
+ - 'spec/controllers/repositories/git_http_controller_spec.rb'
+ - 'spec/controllers/repositories/lfs_storage_controller_spec.rb'
+ - 'spec/controllers/search_controller_spec.rb'
+ - 'spec/controllers/sent_notifications_controller_spec.rb'
+ - 'spec/controllers/sessions_controller_spec.rb'
+ - 'spec/controllers/uploads_controller_spec.rb'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/deprecation_toolkit_env.rb'
+ - 'spec/experiments/application_experiment_spec.rb'
+ - 'spec/experiments/concerns/project_commit_count_spec.rb'
+ - 'spec/experiments/require_verification_for_namespace_creation_experiment_spec.rb'
+ - 'spec/factories/ci/builds.rb'
+ - 'spec/factories/ci/job_artifacts.rb'
+ - 'spec/factories/ci/pipelines.rb'
+ - 'spec/factories/ci/reports/codequality_degradations.rb'
+ - 'spec/factories/container_repositories.rb'
+ - 'spec/factories/dependency_proxy.rb'
+ - 'spec/factories/deployments.rb'
+ - 'spec/factories/design_management/designs.rb'
+ - 'spec/factories/design_management/versions.rb'
+ - 'spec/factories/draft_note.rb'
+ - 'spec/factories/error_tracking/detailed_error.rb'
+ - 'spec/factories/keys.rb'
+ - 'spec/factories/namespaces.rb'
+ - 'spec/factories/notes.rb'
+ - 'spec/factories/packages/debian/file_metadatum.rb'
+ - 'spec/factories/packages/package_files.rb'
+ - 'spec/factories/project_members.rb'
+ - 'spec/factories/projects.rb'
+ - 'spec/factories/usage_data.rb'
+ - 'spec/factories_spec.rb'
+ - 'spec/features/action_cable_logging_spec.rb'
+ - 'spec/features/admin/admin_abuse_reports_spec.rb'
+ - 'spec/features/admin/admin_mode/login_spec.rb'
+ - 'spec/features/admin/admin_runners_spec.rb'
+ - 'spec/features/admin/admin_sees_background_migrations_spec.rb'
+ - 'spec/features/admin/admin_sees_project_statistics_spec.rb'
+ - 'spec/features/admin/admin_settings_spec.rb'
+ - 'spec/features/admin/admin_users_spec.rb'
+ - 'spec/features/admin/users/user_spec.rb'
+ - 'spec/features/alert_management/user_filters_alerts_by_status_spec.rb'
+ - 'spec/features/alert_management/user_updates_alert_status_spec.rb'
+ - 'spec/features/alert_management_spec.rb'
+ - 'spec/features/atom/dashboard_issues_spec.rb'
+ - 'spec/features/atom/issues_spec.rb'
+ - 'spec/features/boards/board_filters_spec.rb'
+ - 'spec/features/boards/boards_spec.rb'
+ - 'spec/features/boards/issue_ordering_spec.rb'
+ - 'spec/features/boards/multi_select_spec.rb'
+ - 'spec/features/boards/sidebar_assignee_spec.rb'
+ - 'spec/features/boards/sidebar_labels_spec.rb'
+ - 'spec/features/boards/user_visits_board_spec.rb'
+ - 'spec/features/calendar_spec.rb'
+ - 'spec/features/callouts/registration_enabled_spec.rb'
+ - 'spec/features/clusters/cluster_detail_page_spec.rb'
+ - 'spec/features/commits_spec.rb'
+ - 'spec/features/contextual_sidebar_spec.rb'
+ - 'spec/features/cycle_analytics_spec.rb'
+ - 'spec/features/dashboard/issues_spec.rb'
+ - 'spec/features/dashboard/projects_spec.rb'
+ - 'spec/features/dashboard/todos/todos_spec.rb'
+ - 'spec/features/dashboard/user_filters_projects_spec.rb'
+ - 'spec/features/error_tracking/user_filters_errors_by_status_spec.rb'
+ - 'spec/features/file_uploads/ci_artifact_spec.rb'
+ - 'spec/features/file_uploads/maven_package_spec.rb'
+ - 'spec/features/file_uploads/multipart_invalid_uploads_spec.rb'
+ - 'spec/features/frequently_visited_projects_and_groups_spec.rb'
+ - 'spec/features/groups/board_spec.rb'
+ - 'spec/features/groups/clusters/user_spec.rb'
+ - 'spec/features/groups/container_registry_spec.rb'
+ - 'spec/features/groups/group_settings_spec.rb'
+ - 'spec/features/groups/integrations/user_activates_mattermost_slash_command_spec.rb'
+ - 'spec/features/groups/labels/edit_spec.rb'
+ - 'spec/features/groups/members/manage_members_spec.rb'
+ - 'spec/features/groups/members/sort_members_spec.rb'
+ - 'spec/features/groups/merge_requests_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/access_tokens_spec.rb'
+ - 'spec/features/groups/settings/group_badges_spec.rb'
+ - 'spec/features/groups/settings/repository_spec.rb'
+ - 'spec/features/groups_spec.rb'
+ - 'spec/features/ide/static_object_external_storage_csp_spec.rb'
+ - 'spec/features/incidents/user_views_incident_spec.rb'
+ - 'spec/features/invites_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/shortcuts_issuable_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/filtered_search/filter_issues_spec.rb'
+ - 'spec/features/issues/filtered_search/recent_searches_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/issue_detail_spec.rb'
+ - 'spec/features/issues/note_polling_spec.rb'
+ - 'spec/features/issues/notes_on_issues_spec.rb'
+ - 'spec/features/issues/service_desk_spec.rb'
+ - 'spec/features/issues/spam_akismet_issue_creation_spec.rb'
+ - 'spec/features/issues/user_creates_branch_and_merge_request_spec.rb'
+ - 'spec/features/issues/user_creates_issue_spec.rb'
+ - 'spec/features/issues/user_edits_issue_spec.rb'
+ - 'spec/features/issues/user_interacts_with_awards_spec.rb'
+ - 'spec/features/issues/user_sees_empty_state_spec.rb'
+ - 'spec/features/issues/user_sees_live_update_spec.rb'
+ - 'spec/features/issues/user_views_issue_spec.rb'
+ - 'spec/features/jira_connect/subscriptions_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/mermaid_spec.rb'
+ - 'spec/features/markdown/metrics_spec.rb'
+ - 'spec/features/merge_request/batch_comments_spec.rb'
+ - 'spec/features/merge_request/maintainer_edits_fork_spec.rb'
+ - 'spec/features/merge_request/user_accepts_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb'
+ - 'spec/features/merge_request/user_assigns_themselves_spec.rb'
+ - 'spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb'
+ - 'spec/features/merge_request/user_comments_on_diff_spec.rb'
+ - 'spec/features/merge_request/user_creates_image_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_creates_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_edits_assignees_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_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_resolves_conflicts_spec.rb'
+ - 'spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_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_scrolls_to_note_on_load_spec.rb'
+ - 'spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb'
+ - 'spec/features/merge_request/user_sees_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_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_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_views_user_status_on_merge_request_spec.rb'
+ - 'spec/features/merge_requests/filters_generic_behavior_spec.rb'
+ - 'spec/features/merge_requests/user_exports_as_csv_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_approvals_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_assignees_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_draft_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_labels_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/milestone_spec.rb'
+ - 'spec/features/milestones/user_views_milestone_spec.rb'
+ - 'spec/features/milestones/user_views_milestones_spec.rb'
+ - 'spec/features/oauth_login_spec.rb'
+ - 'spec/features/profiles/active_sessions_spec.rb'
+ - 'spec/features/profiles/password_spec.rb'
+ - 'spec/features/profiles/personal_access_tokens_spec.rb'
+ - 'spec/features/profiles/two_factor_auths_spec.rb'
+ - 'spec/features/profiles/user_edit_profile_spec.rb'
+ - 'spec/features/projects/artifacts/file_spec.rb'
+ - 'spec/features/projects/artifacts/user_browses_artifacts_spec.rb'
+ - 'spec/features/projects/artifacts/user_downloads_artifacts_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_follows_pipeline_suggest_nudge_spec.rb'
+ - 'spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb'
+ - 'spec/features/projects/branches_spec.rb'
+ - 'spec/features/projects/ci/editor_spec.rb'
+ - 'spec/features/projects/commit/cherry_pick_spec.rb'
+ - 'spec/features/projects/commit/user_reverts_commit_spec.rb'
+ - 'spec/features/projects/commits/multi_view_diff_spec.rb'
+ - 'spec/features/projects/commits/user_browses_commits_spec.rb'
+ - 'spec/features/projects/compare_spec.rb'
+ - 'spec/features/projects/container_registry_spec.rb'
+ - 'spec/features/projects/diffs/diff_show_spec.rb'
+ - 'spec/features/projects/environments/environment_spec.rb'
+ - 'spec/features/projects/environments/environments_spec.rb'
+ - 'spec/features/projects/features_visibility_spec.rb'
+ - 'spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb'
+ - 'spec/features/projects/files/user_browses_files_spec.rb'
+ - 'spec/features/projects/files/user_edits_files_spec.rb'
+ - 'spec/features/projects/infrastructure_registry_spec.rb'
+ - 'spec/features/projects/integrations/prometheus_external_alerts_spec.rb'
+ - 'spec/features/projects/integrations/user_activates_issue_tracker_spec.rb'
+ - 'spec/features/projects/integrations/user_activates_jira_spec.rb'
+ - 'spec/features/projects/integrations/user_uses_inherited_settings_spec.rb'
+ - 'spec/features/projects/issuable_templates_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_uploads_designs_spec.rb'
+ - 'spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb'
+ - 'spec/features/projects/jobs/permissions_spec.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/features/projects/labels/user_edits_labels_spec.rb'
+ - 'spec/features/projects/labels/user_removes_labels_spec.rb'
+ - 'spec/features/projects/labels/user_sees_links_to_issuables_spec.rb'
+ - 'spec/features/projects/members/group_members_spec.rb'
+ - 'spec/features/projects/members/sorting_spec.rb'
+ - 'spec/features/projects/members/user_requests_access_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/pipeline_schedules_spec.rb'
+ - 'spec/features/projects/pipelines/pipelines_spec.rb'
+ - 'spec/features/projects/releases/user_creates_release_spec.rb'
+ - 'spec/features/projects/releases/user_views_edit_release_spec.rb'
+ - 'spec/features/projects/releases/user_views_releases_spec.rb'
+ - 'spec/features/projects/settings/access_tokens_spec.rb'
+ - 'spec/features/projects/settings/project_badges_spec.rb'
+ - 'spec/features/projects/settings/project_settings_spec.rb'
+ - 'spec/features/projects/settings/registry_settings_spec.rb'
+ - 'spec/features/projects/settings/service_desk_setting_spec.rb'
+ - 'spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb'
+ - 'spec/features/projects/settings/user_renames_a_project_spec.rb'
+ - 'spec/features/projects/settings/visibility_settings_spec.rb'
+ - 'spec/features/projects/show/no_password_spec.rb'
+ - 'spec/features/projects/show/schema_markup_spec.rb'
+ - 'spec/features/projects/show/user_sees_deletion_failure_message_spec.rb'
+ - 'spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb'
+ - 'spec/features/projects/tags/user_edits_tags_spec.rb'
+ - 'spec/features/projects/terraform_spec.rb'
+ - 'spec/features/projects/tree/upload_file_spec.rb'
+ - 'spec/features/projects/view_on_env_spec.rb'
+ - 'spec/features/projects_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_line_permalink_updater_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/shortcuts_blob_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/user_views_pipeline_editor_button_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_files_spec.rb'
+ - 'spec/features/runners_spec.rb'
+ - 'spec/features/search/user_searches_for_comments_spec.rb'
+ - 'spec/features/search/user_searches_for_merge_requests_spec.rb'
+ - 'spec/features/search/user_searches_for_projects_spec.rb'
+ - 'spec/features/search/user_uses_header_search_field_spec.rb'
+ - 'spec/features/security/project/internal_access_spec.rb'
+ - 'spec/features/security/project/public_access_spec.rb'
+ - 'spec/features/security/project/snippet/internal_access_spec.rb'
+ - 'spec/features/security/project/snippet/public_access_spec.rb'
+ - 'spec/features/signed_commits_spec.rb'
+ - 'spec/features/snippets/embedded_snippet_spec.rb'
+ - 'spec/features/snippets/spam_snippets_spec.rb'
+ - 'spec/features/snippets/user_edits_snippet_spec.rb'
+ - 'spec/features/task_lists_spec.rb'
+ - 'spec/features/topic_show_spec.rb'
+ - 'spec/features/unsubscribe_links_spec.rb'
+ - 'spec/features/user_sorts_things_spec.rb'
+ - 'spec/features/users/login_spec.rb'
+ - 'spec/features/users/overview_spec.rb'
+ - 'spec/features/users/show_spec.rb'
+ - 'spec/features/users/signup_spec.rb'
+ - 'spec/features/users/user_browses_projects_on_user_page_spec.rb'
+ - 'spec/features/webauthn_spec.rb'
+ - 'spec/finders/access_requests_finder_spec.rb'
+ - 'spec/finders/admin/projects_finder_spec.rb'
+ - 'spec/finders/alert_management/alerts_finder_spec.rb'
+ - 'spec/finders/applications_finder_spec.rb'
+ - 'spec/finders/autocomplete/users_finder_spec.rb'
+ - 'spec/finders/award_emojis_finder_spec.rb'
+ - 'spec/finders/branches_finder_spec.rb'
+ - 'spec/finders/ci/commit_statuses_finder_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/agent_authorizations_finder_spec.rb'
+ - 'spec/finders/clusters_finder_spec.rb'
+ - 'spec/finders/deploy_tokens/tokens_finder_spec.rb'
+ - 'spec/finders/deployments_finder_spec.rb'
+ - 'spec/finders/environments/environments_by_deployments_finder_spec.rb'
+ - 'spec/finders/environments/environments_finder_spec.rb'
+ - 'spec/finders/error_tracking/errors_finder_spec.rb'
+ - 'spec/finders/events_finder_spec.rb'
+ - 'spec/finders/fork_targets_finder_spec.rb'
+ - 'spec/finders/group_descendants_finder_spec.rb'
+ - 'spec/finders/group_members_finder_spec.rb'
+ - 'spec/finders/group_projects_finder_spec.rb'
+ - 'spec/finders/groups/user_groups_finder_spec.rb'
+ - 'spec/finders/groups_finder_spec.rb'
+ - 'spec/finders/issues_finder_spec.rb'
+ - 'spec/finders/keys_finder_spec.rb'
+ - 'spec/finders/labels_finder_spec.rb'
+ - 'spec/finders/members_finder_spec.rb'
+ - 'spec/finders/merge_requests/by_approvals_finder_spec.rb'
+ - 'spec/finders/merge_requests_finder_spec.rb'
+ - 'spec/finders/metrics/dashboards/annotations_finder_spec.rb'
+ - 'spec/finders/metrics/users_starred_dashboards_finder_spec.rb'
+ - 'spec/finders/milestones_finder_spec.rb'
+ - 'spec/finders/namespaces/projects_finder_spec.rb'
+ - 'spec/finders/notes_finder_spec.rb'
+ - 'spec/finders/packages/build_infos_finder_spec.rb'
+ - 'spec/finders/packages/go/version_finder_spec.rb'
+ - 'spec/finders/packages/group_packages_finder_spec.rb'
+ - 'spec/finders/packages/maven/package_finder_spec.rb'
+ - 'spec/finders/packages/npm/package_finder_spec.rb'
+ - 'spec/finders/packages/nuget/package_finder_spec.rb'
+ - 'spec/finders/packages/packages_finder_spec.rb'
+ - 'spec/finders/personal_access_tokens_finder_spec.rb'
+ - 'spec/finders/personal_projects_finder_spec.rb'
+ - 'spec/finders/projects/groups_finder_spec.rb'
+ - 'spec/finders/projects/prometheus/alerts_finder_spec.rb'
+ - 'spec/finders/projects_finder_spec.rb'
+ - 'spec/finders/repositories/tree_finder_spec.rb'
+ - 'spec/finders/security/security_jobs_finder_spec.rb'
+ - 'spec/finders/serverless_domain_finder_spec.rb'
+ - 'spec/finders/snippets_finder_spec.rb'
+ - 'spec/finders/tags_finder_spec.rb'
+ - 'spec/finders/todos_finder_spec.rb'
+ - 'spec/finders/user_group_notification_settings_finder_spec.rb'
+ - 'spec/finders/user_groups_counter_spec.rb'
+ - 'spec/finders/user_recent_events_finder_spec.rb'
+ - 'spec/finders/users_finder_spec.rb'
+ - 'spec/frontend/fixtures/api_deploy_keys.rb'
+ - 'spec/frontend/fixtures/blob.rb'
+ - 'spec/frontend/fixtures/deploy_keys.rb'
+ - 'spec/frontend/fixtures/freeze_period.rb'
+ - 'spec/frontend/fixtures/issues.rb'
+ - 'spec/frontend/fixtures/jobs.rb'
+ - 'spec/frontend/fixtures/merge_requests.rb'
+ - 'spec/frontend/fixtures/merge_requests_diffs.rb'
+ - 'spec/frontend/fixtures/pipeline_schedules.rb'
+ - 'spec/frontend/fixtures/projects.rb'
+ - 'spec/frontend/fixtures/runner.rb'
+ - 'spec/frontend/fixtures/snippet.rb'
+ - 'spec/graphql/features/feature_flag_spec.rb'
+ - 'spec/graphql/gitlab_schema_spec.rb'
+ - 'spec/graphql/mutations/boards/issues/issue_move_list_spec.rb'
+ - 'spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb'
+ - 'spec/graphql/mutations/ci/job_token_scope/remove_project_spec.rb'
+ - 'spec/graphql/mutations/ci/runner/delete_spec.rb'
+ - 'spec/graphql/mutations/clusters/agents/create_spec.rb'
+ - 'spec/graphql/mutations/commits/create_spec.rb'
+ - 'spec/graphql/mutations/container_expiration_policies/update_spec.rb'
+ - 'spec/graphql/mutations/custom_emoji/create_spec.rb'
+ - 'spec/graphql/mutations/customer_relations/contacts/create_spec.rb'
+ - 'spec/graphql/mutations/customer_relations/contacts/update_spec.rb'
+ - 'spec/graphql/mutations/customer_relations/organizations/create_spec.rb'
+ - 'spec/graphql/mutations/customer_relations/organizations/update_spec.rb'
+ - 'spec/graphql/mutations/discussions/toggle_resolve_spec.rb'
+ - 'spec/graphql/mutations/groups/update_spec.rb'
+ - 'spec/graphql/mutations/issues/create_spec.rb'
+ - 'spec/graphql/mutations/issues/move_spec.rb'
+ - 'spec/graphql/mutations/issues/set_escalation_status_spec.rb'
+ - 'spec/graphql/mutations/issues/update_spec.rb'
+ - 'spec/graphql/mutations/merge_requests/set_labels_spec.rb'
+ - 'spec/graphql/mutations/namespace/package_settings/update_spec.rb'
+ - 'spec/graphql/mutations/release_asset_links/update_spec.rb'
+ - 'spec/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/graphql/mutations/releases/update_spec.rb'
+ - 'spec/graphql/mutations/saved_replies/create_spec.rb'
+ - 'spec/graphql/mutations/saved_replies/update_spec.rb'
+ - 'spec/graphql/mutations/security/ci_configuration/base_security_analyzer_spec.rb'
+ - 'spec/graphql/mutations/security/ci_configuration/configure_sast_spec.rb'
+ - 'spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb'
+ - 'spec/graphql/resolvers/alert_management/alert_resolver_spec.rb'
+ - 'spec/graphql/resolvers/base_resolver_spec.rb'
+ - 'spec/graphql/resolvers/board_list_issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/group_runners_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/runners_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/template_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/test_report_summary_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/test_suite_resolver_spec.rb'
+ - 'spec/graphql/resolvers/concerns/resolves_pipelines_spec.rb'
+ - 'spec/graphql/resolvers/group_issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_labels_resolver_spec.rb'
+ - 'spec/graphql/resolvers/issue_status_counts_resolver_spec.rb'
+ - 'spec/graphql/resolvers/issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/merge_requests_resolver_spec.rb'
+ - 'spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb'
+ - 'spec/graphql/resolvers/metrics/dashboards/annotation_resolver_spec.rb'
+ - 'spec/graphql/resolvers/namespace_projects_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_jobs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_resolver_spec.rb'
+ - 'spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb'
+ - 'spec/graphql/resolvers/releases_resolver_spec.rb'
+ - 'spec/graphql/resolvers/snippets_resolver_spec.rb'
+ - 'spec/graphql/resolvers/todo_resolver_spec.rb'
+ - 'spec/graphql/resolvers/user_discussions_count_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users/group_count_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users/groups_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users/participants_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users/snippets_resolver_spec.rb'
+ - 'spec/graphql/subscriptions/issuable_updated_spec.rb'
+ - 'spec/graphql/types/access_level_enum_spec.rb'
+ - 'spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb'
+ - 'spec/graphql/types/award_emojis/award_emoji_type_spec.rb'
+ - 'spec/graphql/types/base_field_spec.rb'
+ - 'spec/graphql/types/commit_type_spec.rb'
+ - 'spec/graphql/types/container_expiration_policy_type_spec.rb'
+ - 'spec/graphql/types/container_repository_details_type_spec.rb'
+ - 'spec/graphql/types/container_repository_type_spec.rb'
+ - 'spec/graphql/types/environment_type_spec.rb'
+ - 'spec/graphql/types/global_id_type_spec.rb'
+ - 'spec/graphql/types/group_type_spec.rb'
+ - 'spec/graphql/types/issue_sort_enum_spec.rb'
+ - 'spec/graphql/types/issue_type_spec.rb'
+ - 'spec/graphql/types/merge_request_type_spec.rb'
+ - 'spec/graphql/types/mutation_type_spec.rb'
+ - 'spec/graphql/types/packages/helm/metadata_type_spec.rb'
+ - 'spec/graphql/types/packages/package_dependency_type_enum_spec.rb'
+ - 'spec/graphql/types/packages/package_group_sort_enum_spec.rb'
+ - 'spec/graphql/types/packages/package_sort_enum_spec.rb'
+ - 'spec/graphql/types/packages/package_type_enum_spec.rb'
+ - 'spec/graphql/types/projects/service_type_spec.rb'
+ - 'spec/graphql/types/query_type_spec.rb'
+ - 'spec/graphql/types/snippets/blob_viewer_type_spec.rb'
+ - 'spec/graphql/types/terraform/state_version_type_spec.rb'
+ - 'spec/graphql/types/tree/blob_type_spec.rb'
+ - 'spec/graphql/types/tree/submodule_type_spec.rb'
+ - 'spec/graphql/types/tree/tree_entry_type_spec.rb'
+ - 'spec/graphql/types/user_type_spec.rb'
+ - 'spec/graphql/types/work_item_id_type_spec.rb'
+ - 'spec/helpers/admin/deploy_key_helper_spec.rb'
+ - 'spec/helpers/application_helper_spec.rb'
+ - 'spec/helpers/application_settings_helper_spec.rb'
+ - 'spec/helpers/auth_helper_spec.rb'
+ - 'spec/helpers/auto_devops_helper_spec.rb'
+ - 'spec/helpers/award_emoji_helper_spec.rb'
+ - 'spec/helpers/blob_helper_spec.rb'
+ - 'spec/helpers/boards_helper_spec.rb'
+ - 'spec/helpers/branches_helper_spec.rb'
+ - 'spec/helpers/broadcast_messages_helper_spec.rb'
+ - 'spec/helpers/button_helper_spec.rb'
+ - 'spec/helpers/ci/pipeline_editor_helper_spec.rb'
+ - 'spec/helpers/clusters_helper_spec.rb'
+ - 'spec/helpers/commits_helper_spec.rb'
+ - 'spec/helpers/cookies_helper_spec.rb'
+ - 'spec/helpers/dev_ops_report_helper_spec.rb'
+ - 'spec/helpers/diff_helper_spec.rb'
+ - 'spec/helpers/emails_helper_spec.rb'
+ - 'spec/helpers/environments_helper_spec.rb'
+ - 'spec/helpers/events_helper_spec.rb'
+ - 'spec/helpers/external_link_helper_spec.rb'
+ - 'spec/helpers/feature_flags_helper_spec.rb'
+ - 'spec/helpers/gitlab_routing_helper_spec.rb'
+ - 'spec/helpers/gitlab_script_tag_helper_spec.rb'
+ - 'spec/helpers/groups/group_members_helper_spec.rb'
+ - 'spec/helpers/groups_helper_spec.rb'
+ - 'spec/helpers/icons_helper_spec.rb'
+ - 'spec/helpers/invite_members_helper_spec.rb'
+ - 'spec/helpers/issuables_helper_spec.rb'
+ - 'spec/helpers/issues_helper_spec.rb'
+ - 'spec/helpers/labels_helper_spec.rb'
+ - 'spec/helpers/markup_helper_spec.rb'
+ - 'spec/helpers/members_helper_spec.rb'
+ - 'spec/helpers/namespaces_helper_spec.rb'
+ - 'spec/helpers/nav/new_dropdown_helper_spec.rb'
+ - 'spec/helpers/notes_helper_spec.rb'
+ - 'spec/helpers/operations_helper_spec.rb'
+ - 'spec/helpers/page_layout_helper_spec.rb'
+ - 'spec/helpers/profiles_helper_spec.rb'
+ - 'spec/helpers/projects/pipeline_helper_spec.rb'
+ - 'spec/helpers/projects/project_members_helper_spec.rb'
+ - 'spec/helpers/projects/security/configuration_helper_spec.rb'
+ - 'spec/helpers/projects_helper_spec.rb'
+ - 'spec/helpers/registrations_helper_spec.rb'
+ - 'spec/helpers/routing/pseudonymization_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/helpers/sidebars_helper_spec.rb'
+ - 'spec/helpers/sidekiq_helper_spec.rb'
+ - 'spec/helpers/snippets_helper_spec.rb'
+ - 'spec/helpers/sorting_helper_spec.rb'
+ - 'spec/helpers/sourcegraph_helper_spec.rb'
+ - 'spec/helpers/storage_helper_spec.rb'
+ - 'spec/helpers/submodule_helper_spec.rb'
+ - 'spec/helpers/tab_helper_spec.rb'
+ - 'spec/helpers/time_zone_helper_spec.rb'
+ - 'spec/helpers/timeboxes_helper_spec.rb'
+ - 'spec/helpers/users/callouts_helper_spec.rb'
+ - 'spec/helpers/users_helper_spec.rb'
+ - 'spec/helpers/visibility_level_helper_spec.rb'
+ - 'spec/helpers/webpack_helper_spec.rb'
+ - 'spec/helpers/wiki_helper_spec.rb'
+ - 'spec/helpers/wiki_page_version_helper_spec.rb'
+ - 'spec/initializers/00_rails_disable_joins_spec.rb'
+ - 'spec/initializers/6_validations_spec.rb'
+ - 'spec/initializers/carrierwave_patch_spec.rb'
+ - 'spec/initializers/direct_upload_support_spec.rb'
+ - 'spec/initializers/global_id_spec.rb'
+ - 'spec/initializers/lograge_spec.rb'
+ - 'spec/initializers/mail_encoding_patch_spec.rb'
+ - 'spec/initializers/pages_storage_check_spec.rb'
+ - 'spec/initializers/secret_token_spec.rb'
+ - 'spec/initializers/session_store_spec.rb'
+ - 'spec/initializers/settings_spec.rb'
+ - 'spec/initializers/trusted_proxies_spec.rb'
+ - 'spec/lib/api/entities/ci/pipeline_spec.rb'
+ - 'spec/lib/api/entities/project_import_status_spec.rb'
+ - 'spec/lib/api/entities/projects/repository_storage_move_spec.rb'
+ - 'spec/lib/api/entities/release_spec.rb'
+ - 'spec/lib/api/entities/snippets/repository_storage_move_spec.rb'
+ - 'spec/lib/api/entities/user_spec.rb'
+ - 'spec/lib/api/entities/wiki_page_spec.rb'
+ - 'spec/lib/api/every_api_endpoint_spec.rb'
+ - 'spec/lib/api/helpers/authentication_spec.rb'
+ - 'spec/lib/api/helpers/common_helpers_spec.rb'
+ - 'spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb'
+ - 'spec/lib/api/helpers/packages_helpers_spec.rb'
+ - 'spec/lib/api/helpers/rate_limiter_spec.rb'
+ - 'spec/lib/api/helpers_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/client_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/serializers/feature_flag_entity_spec.rb'
+ - 'spec/lib/atlassian/jira_issue_key_extractor_spec.rb'
+ - 'spec/lib/backup/artifacts_spec.rb'
+ - 'spec/lib/backup/database_spec.rb'
+ - 'spec/lib/backup/files_spec.rb'
+ - 'spec/lib/backup/gitaly_backup_spec.rb'
+ - 'spec/lib/backup/lfs_spec.rb'
+ - 'spec/lib/backup/manager_spec.rb'
+ - 'spec/lib/backup/object_backup_spec.rb'
+ - 'spec/lib/backup/pages_spec.rb'
+ - 'spec/lib/backup/repositories_spec.rb'
+ - 'spec/lib/backup/uploads_spec.rb'
+ - 'spec/lib/banzai/commit_renderer_spec.rb'
+ - 'spec/lib/banzai/filter/ascii_doc_post_processing_filter_spec.rb'
+ - 'spec/lib/banzai/filter/ascii_doc_sanitization_filter_spec.rb'
+ - 'spec/lib/banzai/filter/broadcast_message_sanitization_filter_spec.rb'
+ - 'spec/lib/banzai/filter/custom_emoji_filter_spec.rb'
+ - 'spec/lib/banzai/filter/external_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/gollum_tags_filter_spec.rb'
+ - 'spec/lib/banzai/filter/image_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/inline_alert_metrics_filter_spec.rb'
+ - 'spec/lib/banzai/filter/inline_diff_filter_spec.rb'
+ - 'spec/lib/banzai/filter/inline_metrics_filter_spec.rb'
+ - 'spec/lib/banzai/filter/kroki_filter_spec.rb'
+ - 'spec/lib/banzai/filter/math_filter_spec.rb'
+ - 'spec/lib/banzai/filter/mermaid_filter_spec.rb'
+ - 'spec/lib/banzai/filter/plantuml_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/abstract_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/project_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/reference_cache_spec.rb'
+ - 'spec/lib/banzai/filter/references/reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/repository_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/suggestion_filter_spec.rb'
+ - 'spec/lib/banzai/filter/syntax_highlight_filter_spec.rb'
+ - 'spec/lib/banzai/filter/task_list_filter_spec.rb'
+ - 'spec/lib/banzai/filter/wiki_link_filter_spec.rb'
+ - 'spec/lib/banzai/object_renderer_spec.rb'
+ - 'spec/lib/banzai/pipeline/gfm_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline/wiki_pipeline_spec.rb'
+ - 'spec/lib/banzai/reference_parser/merge_request_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/snippet_parser_spec.rb'
+ - 'spec/lib/banzai/reference_redactor_spec.rb'
+ - 'spec/lib/bitbucket/representation/pull_request_spec.rb'
+ - 'spec/lib/bitbucket_server/client_spec.rb'
+ - 'spec/lib/bitbucket_server/connection_spec.rb'
+ - 'spec/lib/bitbucket_server/paginator_spec.rb'
+ - 'spec/lib/bulk_imports/clients/graphql_spec.rb'
+ - 'spec/lib/bulk_imports/clients/http_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/lfs_objects_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/members_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/milestones_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/uploads_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb'
+ - 'spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/stage_spec.rb'
+ - 'spec/lib/bulk_imports/ndjson_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/external_pull_requests_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/project_feature_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/project_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/protected_branches_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/snippets_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/users_mapper_spec.rb'
+ - 'spec/lib/container_registry/client_spec.rb'
+ - 'spec/lib/container_registry/gitlab_api_client_spec.rb'
+ - 'spec/lib/container_registry/registry_spec.rb'
+ - 'spec/lib/csv_builder_spec.rb'
+ - 'spec/lib/declarative_enum_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/issue_link_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/issue_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/pagination_parser_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/projects_spec.rb'
+ - 'spec/lib/event_filter_spec.rb'
+ - 'spec/lib/feature_spec.rb'
+ - 'spec/lib/generators/gitlab/snowplow_event_definition_generator_spec.rb'
+ - 'spec/lib/generators/gitlab/usage_metric_definition/redis_hll_generator_spec.rb'
+ - 'spec/lib/generators/gitlab/usage_metric_definition_generator_spec.rb'
+ - 'spec/lib/generators/gitlab/usage_metric_generator_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/sorting_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_first_mentioned_in_commit_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_first_deployed_to_production_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_finished_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_started_spec.rb'
+ - 'spec/lib/gitlab/api_authentication/builder_spec.rb'
+ - 'spec/lib/gitlab/api_authentication/token_type_builder_spec.rb'
+ - 'spec/lib/gitlab/app_json_logger_spec.rb'
+ - 'spec/lib/gitlab/application_rate_limiter_spec.rb'
+ - 'spec/lib/gitlab/asciidoc_spec.rb'
+ - 'spec/lib/gitlab/audit/ci_runner_token_author_spec.rb'
+ - 'spec/lib/gitlab/audit/null_author_spec.rb'
+ - 'spec/lib/gitlab/auth/auth_finders_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/config_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/dn_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/user_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/request_authenticator_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'spec/lib/gitlab/auth/user_access_denied_reason_spec.rb'
+ - 'spec/lib/gitlab/auth_spec.rb'
+ - 'spec/lib/gitlab/authorized_keys_spec.rb'
+ - 'spec/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_issue_search_data_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_member_namespace_for_group_members_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_project_repositories_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb'
+ - 'spec/lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects_spec.rb'
+ - 'spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb'
+ - 'spec/lib/gitlab/background_migration/delete_orphaned_deployments_spec.rb'
+ - 'spec/lib/gitlab/background_migration/drop_invalid_security_findings_spec.rb'
+ - 'spec/lib/gitlab/background_migration/drop_invalid_vulnerabilities_spec.rb'
+ - 'spec/lib/gitlab/background_migration/extract_project_topics_into_separate_table_spec.rb'
+ - 'spec/lib/gitlab/background_migration/fix_duplicate_project_name_and_path_spec.rb'
+ - 'spec/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at_spec.rb'
+ - 'spec/lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata_spec.rb'
+ - 'spec/lib/gitlab/background_migration/job_coordinator_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb'
+ - 'spec/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users_spec.rb'
+ - 'spec/lib/gitlab/background_migration/migrate_personal_namespace_project_maintainer_to_owner_spec.rb'
+ - 'spec/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature_spec.rb'
+ - 'spec/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds_spec.rb'
+ - 'spec/lib/gitlab/background_migration/populate_container_repository_migration_plan_spec.rb'
+ - 'spec/lib/gitlab/background_migration/populate_vulnerability_reads_spec.rb'
+ - 'spec/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces_spec.rb'
+ - 'spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_vulnerability_finding_links_spec.rb'
+ - 'spec/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url_spec.rb'
+ - 'spec/lib/gitlab/background_migration/update_timelogs_null_spent_at_spec.rb'
+ - 'spec/lib/gitlab/background_migration/update_timelogs_project_id_spec.rb'
+ - 'spec/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group_spec.rb'
+ - 'spec/lib/gitlab/bare_repository_import/importer_spec.rb'
+ - 'spec/lib/gitlab/batch_pop_queueing_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_import/importer_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_server_import/importer_spec.rb'
+ - 'spec/lib/gitlab/buffered_io_spec.rb'
+ - 'spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb'
+ - 'spec/lib/gitlab/chat/output_spec.rb'
+ - 'spec/lib/gitlab/checks/branch_check_spec.rb'
+ - 'spec/lib/gitlab/checks/changes_access_spec.rb'
+ - 'spec/lib/gitlab/checks/diff_check_spec.rb'
+ - 'spec/lib/gitlab/checks/push_check_spec.rb'
+ - 'spec/lib/gitlab/checks/snippet_check_spec.rb'
+ - 'spec/lib/gitlab/checks/tag_check_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2html_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json/style_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json_spec.rb'
+ - 'spec/lib/gitlab/ci/badge/coverage/report_spec.rb'
+ - 'spec/lib/gitlab/ci/build/releaser_spec.rb'
+ - 'spec/lib/gitlab/ci/build/step_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/cache_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/environment_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/reports_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/root_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/services_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/artifact_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/base_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/local_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/project_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/remote_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/template_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/processor_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/rules_spec.rb'
+ - 'spec/lib/gitlab/ci/config/yaml/tags/reference_spec.rb'
+ - 'spec/lib/gitlab/ci/cron_parser_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/coverage/cobertura_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/coverage/sax_document_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/sast_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/test/junit_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/ensure_resource_groups_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/limit/deployments_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/expression/lexeme/and_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/expression/lexeme/or_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/expression/lexer_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/expression/parser_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/preloader_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline_object_hierarchy_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/codequality_mr_diff_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/flag_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/link_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/reports_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/scanner_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/runner_releases_spec.rb'
+ - 'spec/lib/gitlab/ci/runner_upgrade_check_spec.rb'
+ - 'spec/lib/gitlab/ci/status/bridge/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/manual_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/waiting_for_approval_spec.rb'
+ - 'spec/lib/gitlab/ci/status/stage/play_manual_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/5_minute_production_app_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/deploy_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/npm_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/cleanup/orphan_lfs_file_references_spec.rb'
+ - 'spec/lib/gitlab/cleanup/project_uploads_spec.rb'
+ - 'spec/lib/gitlab/closing_issue_extractor_spec.rb'
+ - 'spec/lib/gitlab/cluster/lifecycle_events_spec.rb'
+ - 'spec/lib/gitlab/code_navigation_path_spec.rb'
+ - 'spec/lib/gitlab/composer/cache_spec.rb'
+ - 'spec/lib/gitlab/composer/version_index_spec.rb'
+ - 'spec/lib/gitlab/config_checker/external_database_checker_spec.rb'
+ - 'spec/lib/gitlab/config_checker/puma_rugged_checker_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/consul/internal_spec.rb'
+ - 'spec/lib/gitlab/content_security_policy/config_loader_spec.rb'
+ - 'spec/lib/gitlab/crypto_helper_spec.rb'
+ - 'spec/lib/gitlab/current_settings_spec.rb'
+ - 'spec/lib/gitlab/data_builder/alert_spec.rb'
+ - 'spec/lib/gitlab/data_builder/build_spec.rb'
+ - 'spec/lib/gitlab/data_builder/pipeline_spec.rb'
+ - 'spec/lib/gitlab/data_builder/wiki_page_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batch_optimizer_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_job_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_job_transition_log_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_spec.rb'
+ - 'spec/lib/gitlab/database/batch_count_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/configuration_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/host_list_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/setup_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/srv_resolver_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/cascading_namespace_settings_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/loose_foreign_key_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/v2_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migration_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/instrumentation_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/lock_retry_mixin_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/runner_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/test_background_runner_spec.rb'
+ - 'spec/lib/gitlab/database/no_cross_db_foreign_keys_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/partition_manager_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/partition_monitoring_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/sliding_list_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/index_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_foreign_key_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_hll/batch_distinct_counter_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_hll/buckets_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_partition_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_partitioned_table_spec.rb'
+ - 'spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzer_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/reindex_concurrently_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb'
+ - 'spec/lib/gitlab/database/transaction/observer_spec.rb'
+ - 'spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb'
+ - 'spec/lib/gitlab/database/with_lock_retries_spec.rb'
+ - 'spec/lib/gitlab/database_importers/self_monitoring/project/create_service_spec.rb'
+ - 'spec/lib/gitlab/database_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/package_json_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/requirements_txt_linker_spec.rb'
+ - 'spec/lib/gitlab/diff/diff_refs_spec.rb'
+ - 'spec/lib/gitlab/diff/file_collection/base_spec.rb'
+ - 'spec/lib/gitlab/diff/file_spec.rb'
+ - 'spec/lib/gitlab/diff/formatters/text_formatter_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_cache_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_spec.rb'
+ - 'spec/lib/gitlab/diff/inline_diff_marker_spec.rb'
+ - 'spec/lib/gitlab/diff/position_tracer/image_strategy_spec.rb'
+ - 'spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb'
+ - 'spec/lib/gitlab/diff/suggestion_spec.rb'
+ - 'spec/lib/gitlab/elasticsearch/logs/lines_spec.rb'
+ - 'spec/lib/gitlab/email/failure_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_issue_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb'
+ - '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/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler_spec.rb'
+ - 'spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/team_short_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/team_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/trial_short_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/trial_spec.rb'
+ - 'spec/lib/gitlab/email/receiver_spec.rb'
+ - 'spec/lib/gitlab/email/reply_parser_spec.rb'
+ - 'spec/lib/gitlab/emoji_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/encrypted_configuration_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/processor/grpc_error_processor_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/processor/sanitize_error_message_processor_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb'
+ - 'spec/lib/gitlab/etag_caching/router/graphql_spec.rb'
+ - 'spec/lib/gitlab/etag_caching/router/rails_spec.rb'
+ - 'spec/lib/gitlab/exception_log_formatter_spec.rb'
+ - 'spec/lib/gitlab/experimentation/controller_concern_spec.rb'
+ - 'spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb'
+ - 'spec/lib/gitlab/git/base_error_spec.rb'
+ - 'spec/lib/gitlab/git/commit_spec.rb'
+ - 'spec/lib/gitlab/git/compare_spec.rb'
+ - 'spec/lib/gitlab/git/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/git/cross_repo_comparer_spec.rb'
+ - 'spec/lib/gitlab/git/diff_spec.rb'
+ - 'spec/lib/gitlab/git/raw_diff_change_spec.rb'
+ - 'spec/lib/gitlab/git/remote_mirror_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git/tree_spec.rb'
+ - 'spec/lib/gitlab/git_access_snippet_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/blobs_stitcher_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/commit_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/conflicts_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/operation_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/praefect_info_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/remote_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/repository_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/lfs_object_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/object_counter_spec.rb'
+ - 'spec/lib/gitlab/github_import/user_finder_spec.rb'
+ - 'spec/lib/gitlab/github_import_spec.rb'
+ - 'spec/lib/gitlab/gl_repository/repo_type_spec.rb'
+ - 'spec/lib/gitlab/global_id/deprecations_spec.rb'
+ - 'spec/lib/gitlab/gpg/commit_spec.rb'
+ - 'spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb'
+ - 'spec/lib/gitlab/graphql/loaders/batch_lfs_oid_loader_spec.rb'
+ - 'spec/lib/gitlab/graphql/markdown_field_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/connections_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/conditions/not_null_condition_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/conditions/null_condition_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/order_info_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/query_builder_spec.rb'
+ - 'spec/lib/gitlab/graphql/present/field_extension_spec.rb'
+ - 'spec/lib/gitlab/graphql/tracers/application_context_tracer_spec.rb'
+ - 'spec/lib/gitlab/graphs/commits_spec.rb'
+ - 'spec/lib/gitlab/hashed_storage/migrator_spec.rb'
+ - 'spec/lib/gitlab/health_checks/gitaly_check_spec.rb'
+ - 'spec/lib/gitlab/health_checks/simple_check_shared.rb'
+ - 'spec/lib/gitlab/highlight_spec.rb'
+ - 'spec/lib/gitlab/hook_data/project_member_builder_spec.rb'
+ - 'spec/lib/gitlab/hotlinking_detector_spec.rb'
+ - 'spec/lib/gitlab/http_spec.rb'
+ - 'spec/lib/gitlab/i18n/po_linter_spec.rb'
+ - 'spec/lib/gitlab/import/set_async_jid_spec.rb'
+ - 'spec/lib/gitlab/import_export/attribute_cleaner_spec.rb'
+ - 'spec/lib/gitlab/import_export/attribute_configuration_spec.rb'
+ - 'spec/lib/gitlab/import_export/attributes_permitter_spec.rb'
+ - 'spec/lib/gitlab/import_export/base/object_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/base/relation_object_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/command_line_util_spec.rb'
+ - 'spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/import_failure_service_spec.rb'
+ - 'spec/lib/gitlab/import_export/importer_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/ndjson_reader_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/ndjson_writer_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/members_mapper_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/export_task_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/import_task_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/object_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/sample/relation_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/references_configuration_spec.rb'
+ - 'spec/lib/gitlab/import_export/shared_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippets_repo_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/uploads_manager_spec.rb'
+ - 'spec/lib/gitlab/import_export/version_checker_spec.rb'
+ - 'spec/lib/gitlab/import_sources_spec.rb'
+ - 'spec/lib/gitlab/incoming_email_spec.rb'
+ - 'spec/lib/gitlab/instrumentation/redis_interceptor_spec.rb'
+ - 'spec/lib/gitlab/internal_post_receive/response_spec.rb'
+ - 'spec/lib/gitlab/issuable_metadata_spec.rb'
+ - 'spec/lib/gitlab/issues/rebalancing/state_spec.rb'
+ - 'spec/lib/gitlab/jira/dvcs_spec.rb'
+ - 'spec/lib/gitlab/jira_import/base_importer_spec.rb'
+ - 'spec/lib/gitlab/jira_import/labels_importer_spec.rb'
+ - 'spec/lib/gitlab/jira_import_spec.rb'
+ - 'spec/lib/gitlab/kas/client_spec.rb'
+ - 'spec/lib/gitlab/kas_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/deployment_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/api_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/pod_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kubeconfig/template_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kubectl_cmd_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/namespace_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/network_policy_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/pod_cmd_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/rollout_status_spec.rb'
+ - 'spec/lib/gitlab/kubernetes_spec.rb'
+ - 'spec/lib/gitlab/legacy_github_import/client_spec.rb'
+ - 'spec/lib/gitlab/legacy_github_import/importer_spec.rb'
+ - 'spec/lib/gitlab/legacy_github_import/project_creator_spec.rb'
+ - 'spec/lib/gitlab/legacy_github_import/pull_request_formatter_spec.rb'
+ - 'spec/lib/gitlab/lfs/client_spec.rb'
+ - 'spec/lib/gitlab/mail_room/authenticator_spec.rb'
+ - 'spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb'
+ - 'spec/lib/gitlab/metrics/background_transaction_spec.rb'
+ - 'spec/lib/gitlab/metrics/boot_time_tracker_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/finder_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/stages/grafana_formatter_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/url_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator_spec.rb'
+ - 'spec/lib/gitlab/metrics/elasticsearch_rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/metrics/method_call_spec.rb'
+ - 'spec/lib/gitlab/metrics/rails_slis_spec.rb'
+ - 'spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/metrics/samplers/threads_sampler_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/active_record_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb'
+ - 'spec/lib/gitlab/metrics/system_spec.rb'
+ - 'spec/lib/gitlab/metrics/web_transaction_spec.rb'
+ - 'spec/lib/gitlab/middleware/go_spec.rb'
+ - 'spec/lib/gitlab/middleware/handle_malformed_strings_spec.rb'
+ - 'spec/lib/gitlab/middleware/multipart/handler_spec.rb'
+ - 'spec/lib/gitlab/middleware/multipart_spec.rb'
+ - 'spec/lib/gitlab/middleware/same_site_cookies_spec.rb'
+ - 'spec/lib/gitlab/middleware/speedscope_spec.rb'
+ - 'spec/lib/gitlab/object_hierarchy_spec.rb'
+ - 'spec/lib/gitlab/omniauth_initializer_spec.rb'
+ - 'spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/cursor_based_request_context_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/array_scope_columns_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/iterator_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/order_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/paginator_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_header_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_pagination_spec.rb'
+ - 'spec/lib/gitlab/path_regex_spec.rb'
+ - 'spec/lib/gitlab/performance_bar/redis_adapter_when_peek_enabled_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/conduit/response_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/conduit/user_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/user_finder_spec.rb'
+ - 'spec/lib/gitlab/project_search_results_spec.rb'
+ - 'spec/lib/gitlab/project_template_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/deployment_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/knative_invocation_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/query_variables_spec.rb'
+ - 'spec/lib/gitlab/prometheus_client_spec.rb'
+ - 'spec/lib/gitlab/puma_logging/json_formatter_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/dsl_spec.rb'
+ - 'spec/lib/gitlab/rack_attack/request_spec.rb'
+ - 'spec/lib/gitlab/rack_attack_spec.rb'
+ - 'spec/lib/gitlab/redis/hll_spec.rb'
+ - 'spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'spec/lib/gitlab/regex_spec.rb'
+ - 'spec/lib/gitlab/repo_path_spec.rb'
+ - 'spec/lib/gitlab/repository_size_error_message_spec.rb'
+ - 'spec/lib/gitlab/route_map_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/exif_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/svg_spec.rb'
+ - 'spec/lib/gitlab/search/found_blob_spec.rb'
+ - 'spec/lib/gitlab/search_results_spec.rb'
+ - 'spec/lib/gitlab/serializer/pagination_spec.rb'
+ - 'spec/lib/gitlab/serverless/service_spec.rb'
+ - 'spec/lib/gitlab/shell_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_config/worker_router_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/compressor_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/presenters/issue_new_spec.rb'
+ - 'spec/lib/gitlab/spamcheck/client_spec.rb'
+ - 'spec/lib/gitlab/sql/pattern_spec.rb'
+ - 'spec/lib/gitlab/ssh_public_key_spec.rb'
+ - 'spec/lib/gitlab/string_range_marker_spec.rb'
+ - 'spec/lib/gitlab/string_regex_marker_spec.rb'
+ - 'spec/lib/gitlab/suggestions/commit_message_spec.rb'
+ - 'spec/lib/gitlab/template/issue_template_spec.rb'
+ - 'spec/lib/gitlab/template/merge_request_template_spec.rb'
+ - 'spec/lib/gitlab/throttle_spec.rb'
+ - 'spec/lib/gitlab/tracking/event_definition_spec.rb'
+ - 'spec/lib/gitlab/tracking/standard_context_spec.rb'
+ - 'spec/lib/gitlab/tracking_spec.rb'
+ - 'spec/lib/gitlab/url_blocker_spec.rb'
+ - 'spec/lib/gitlab/url_builder_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_definition_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/aggregates/sources/calculations/intersection_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/aggregates/sources/redis_hll_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_issues_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/redis_hll_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/redis_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/name_suggestion_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/constraints_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/joins_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/query_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping/payload_keys_processor_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping_report_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/ci_template_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/code_review_events_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/jetbrains_plugin_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/track_unique_events_spec.rb'
+ - 'spec/lib/gitlab/usage_data_metrics_spec.rb'
+ - 'spec/lib/gitlab/usage_data_non_sql_metrics_spec.rb'
+ - 'spec/lib/gitlab/usage_data_queries_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/gitlab/user_access_spec.rb'
+ - 'spec/lib/gitlab/utils/delegator_override/error_spec.rb'
+ - 'spec/lib/gitlab/utils/measuring_spec.rb'
+ - 'spec/lib/gitlab/utils/nokogiri_spec.rb'
+ - 'spec/lib/gitlab/utils/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/web_ide/config/entry/global_spec.rb'
+ - 'spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb'
+ - 'spec/lib/gitlab/webpack/file_loader_spec.rb'
+ - 'spec/lib/gitlab/webpack/manifest_spec.rb'
+ - 'spec/lib/gitlab/word_diff/parser_spec.rb'
+ - 'spec/lib/gitlab/workhorse_spec.rb'
+ - 'spec/lib/gitlab/x509/certificate_spec.rb'
+ - 'spec/lib/gitlab/x509/signature_spec.rb'
+ - 'spec/lib/gitlab_spec.rb'
+ - 'spec/lib/google_api/cloud_platform/client_spec.rb'
+ - 'spec/lib/grafana/validator_spec.rb'
+ - 'spec/lib/kramdown/kramdown_spec.rb'
+ - 'spec/lib/kramdown/parser/atlassian_document_format_spec.rb'
+ - 'spec/lib/learn_gitlab/project_spec.rb'
+ - 'spec/lib/mattermost/command_spec.rb'
+ - 'spec/lib/microsoft_teams/notifier_spec.rb'
+ - 'spec/lib/object_storage/config_spec.rb'
+ - 'spec/lib/object_storage/direct_upload_spec.rb'
+ - 'spec/lib/peek/views/active_record_spec.rb'
+ - 'spec/lib/peek/views/memory_spec.rb'
+ - 'spec/lib/rouge/formatters/html_gitlab_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_build_action_spec.rb'
+ - 'spec/lib/sidebars/menu_item_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/analytics_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/ci_cd_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/external_issue_tracker_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/hidden_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/monitor_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/packages_registries_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/security_compliance_menu_spec.rb'
+ - 'spec/lib/uploaded_file_spec.rb'
+ - 'spec/mailers/devise_mailer_spec.rb'
+ - 'spec/mailers/emails/merge_requests_spec.rb'
+ - 'spec/mailers/emails/pages_domains_spec.rb'
+ - 'spec/mailers/emails/profile_spec.rb'
+ - 'spec/mailers/emails/releases_spec.rb'
+ - 'spec/mailers/emails/service_desk_spec.rb'
+ - 'spec/mailers/notify_spec.rb'
+ - 'spec/migrations/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url_spec.rb'
+ - 'spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb'
+ - 'spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb'
+ - 'spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb'
+ - 'spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb'
+ - 'spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb'
+ - 'spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb'
+ - 'spec/migrations/20210713042000_fix_ci_sources_pipelines_index_names_spec.rb'
+ - 'spec/migrations/20210722150102_operations_feature_flags_correct_flexible_rollout_values_spec.rb'
+ - 'spec/migrations/20210805192450_update_trial_plans_ci_daily_pipeline_schedule_triggers_spec.rb'
+ - 'spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb'
+ - 'spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb'
+ - 'spec/migrations/20210907211557_finalize_ci_builds_bigint_conversion_spec.rb'
+ - 'spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb'
+ - 'spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb'
+ - 'spec/migrations/20211018152654_schedule_remove_duplicate_vulnerabilities_findings3_spec.rb'
+ - 'spec/migrations/20211110143306_add_not_null_constraint_to_security_findings_uuid_spec.rb'
+ - 'spec/migrations/20211110151350_schedule_drop_invalid_security_findings_spec.rb'
+ - 'spec/migrations/20211116111644_schedule_remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/migrations/20211117084814_migrate_remaining_u2f_registrations_spec.rb'
+ - 'spec/migrations/20211126204445_add_task_to_work_item_types_spec.rb'
+ - 'spec/migrations/20211130165043_backfill_sequence_column_for_sprints_table_spec.rb'
+ - 'spec/migrations/20211203091642_add_index_to_projects_on_marked_for_deletion_at_spec.rb'
+ - 'spec/migrations/20211207135331_schedule_recalculate_uuid_on_vulnerabilities_occurrences4_spec.rb'
+ - 'spec/migrations/20211210140629_encrypt_static_object_token_spec.rb'
+ - 'spec/migrations/20220106111958_add_insert_or_update_vulnerability_reads_trigger_spec.rb'
+ - 'spec/migrations/20220106112043_add_update_vulnerability_reads_trigger_spec.rb'
+ - 'spec/migrations/20220106112085_add_update_vulnerability_reads_location_trigger_spec.rb'
+ - 'spec/migrations/20220106163326_add_has_issues_on_vulnerability_reads_trigger_spec.rb'
+ - 'spec/migrations/20220107064845_populate_vulnerability_reads_spec.rb'
+ - 'spec/migrations/20220222192524_create_not_null_constraint_releases_tag_spec.rb'
+ - 'spec/migrations/20220309084954_remove_leftover_external_pull_request_deletions_spec.rb'
+ - 'spec/migrations/active_record/schema_spec.rb'
+ - 'spec/migrations/add_upvotes_count_index_to_issues_spec.rb'
+ - 'spec/migrations/associate_existing_dast_builds_with_variables_spec.rb'
+ - 'spec/migrations/backfill_all_project_namespaces_spec.rb'
+ - 'spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb'
+ - 'spec/migrations/backfill_clusters_integration_prometheus_enabled_spec.rb'
+ - 'spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb'
+ - 'spec/migrations/backfill_nuget_temporary_packages_to_processing_status_spec.rb'
+ - 'spec/migrations/backfill_project_namespaces_for_group_spec.rb'
+ - 'spec/migrations/backfill_work_item_type_id_on_issues_spec.rb'
+ - 'spec/migrations/cleanup_after_add_primary_email_to_emails_if_user_confirmed_spec.rb'
+ - 'spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb'
+ - 'spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb'
+ - 'spec/migrations/confirm_support_bot_user_spec.rb'
+ - 'spec/migrations/delete_security_findings_without_uuid_spec.rb'
+ - 'spec/migrations/disable_job_token_scope_when_unused_spec.rb'
+ - 'spec/migrations/finalize_project_namespaces_backfill_spec.rb'
+ - 'spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb'
+ - 'spec/migrations/fix_batched_migrations_old_format_job_arguments_spec.rb'
+ - 'spec/migrations/populate_audit_event_streaming_verification_token_spec.rb'
+ - 'spec/migrations/populate_dismissal_information_for_vulnerabilities_spec.rb'
+ - 'spec/migrations/re_schedule_latest_pipeline_id_population_with_all_security_related_artifact_types_spec.rb'
+ - 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb'
+ - 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb'
+ - 'spec/migrations/remove_duplicate_dast_site_tokens_spec.rb'
+ - 'spec/migrations/remove_duplicate_dast_site_tokens_with_same_token_spec.rb'
+ - 'spec/migrations/remove_not_null_contraint_on_title_from_sprints_spec.rb'
+ - 'spec/migrations/rename_services_to_integrations_spec.rb'
+ - 'spec/migrations/replace_external_wiki_triggers_spec.rb'
+ - 'spec/migrations/reset_severity_levels_to_new_default_spec.rb'
+ - 'spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb'
+ - 'spec/migrations/schedule_copy_ci_builds_columns_to_security_scans2_spec.rb'
+ - 'spec/migrations/schedule_migrate_pages_to_zip_storage_spec.rb'
+ - 'spec/migrations/schedule_populate_status_column_of_security_scans_spec.rb'
+ - 'spec/migrations/schedule_recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
+ - 'spec/migrations/schedule_update_timelogs_null_spent_at_spec.rb'
+ - 'spec/migrations/schedule_update_timelogs_project_id_spec.rb'
+ - 'spec/migrations/schedule_update_users_where_two_factor_auth_required_from_group_spec.rb'
+ - 'spec/migrations/update_invalid_member_states_spec.rb'
+ - 'spec/models/active_session_spec.rb'
+ - 'spec/models/acts_as_taggable_on/tag_spec.rb'
+ - 'spec/models/acts_as_taggable_on/tagging_spec.rb'
+ - 'spec/models/alert_management/alert_spec.rb'
+ - 'spec/models/analytics/cycle_analytics/aggregation_spec.rb'
+ - 'spec/models/analytics/cycle_analytics/project_stage_spec.rb'
+ - 'spec/models/appearance_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/audit_event_spec.rb'
+ - 'spec/models/authentication_event_spec.rb'
+ - 'spec/models/award_emoji_spec.rb'
+ - 'spec/models/badge_spec.rb'
+ - 'spec/models/badges/project_badge_spec.rb'
+ - 'spec/models/blob_viewer/go_mod_spec.rb'
+ - 'spec/models/blob_viewer/metrics_dashboard_yml_spec.rb'
+ - 'spec/models/broadcast_message_spec.rb'
+ - 'spec/models/bulk_import_spec.rb'
+ - 'spec/models/bulk_imports/entity_spec.rb'
+ - 'spec/models/bulk_imports/file_transfer/project_config_spec.rb'
+ - 'spec/models/ci/artifact_blob_spec.rb'
+ - 'spec/models/ci/build_runner_session_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/build_trace_chunk_spec.rb'
+ - 'spec/models/ci/daily_build_group_report_result_spec.rb'
+ - 'spec/models/ci/freeze_period_status_spec.rb'
+ - 'spec/models/ci/group_variable_spec.rb'
+ - 'spec/models/ci/instance_variable_spec.rb'
+ - 'spec/models/ci/job_artifact_spec.rb'
+ - 'spec/models/ci/job_token/scope_spec.rb'
+ - 'spec/models/ci/namespace_mirror_spec.rb'
+ - 'spec/models/ci/pipeline_schedule_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/processable_spec.rb'
+ - 'spec/models/ci/ref_spec.rb'
+ - 'spec/models/ci/resource_group_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/ci/variable_spec.rb'
+ - 'spec/models/clusters/agent_spec.rb'
+ - 'spec/models/clusters/applications/cert_manager_spec.rb'
+ - 'spec/models/clusters/applications/ingress_spec.rb'
+ - 'spec/models/clusters/applications/knative_spec.rb'
+ - 'spec/models/clusters/applications/prometheus_spec.rb'
+ - 'spec/models/clusters/cluster_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/commit_spec.rb'
+ - 'spec/models/concerns/bulk_insert_safe_spec.rb'
+ - 'spec/models/concerns/cache_markdown_field_spec.rb'
+ - 'spec/models/concerns/cacheable_attributes_spec.rb'
+ - 'spec/models/concerns/cascading_namespace_setting_attribute_spec.rb'
+ - 'spec/models/concerns/ci/artifactable_spec.rb'
+ - 'spec/models/concerns/clusters/agents/authorization_config_scopes_spec.rb'
+ - 'spec/models/concerns/deployment_platform_spec.rb'
+ - 'spec/models/concerns/group_descendant_spec.rb'
+ - 'spec/models/concerns/has_user_type_spec.rb'
+ - 'spec/models/concerns/id_in_ordered_spec.rb'
+ - 'spec/models/concerns/ignorable_columns_spec.rb'
+ - 'spec/models/concerns/integrations/has_data_fields_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/concerns/limitable_spec.rb'
+ - 'spec/models/concerns/milestoneable_spec.rb'
+ - 'spec/models/concerns/milestoneish_spec.rb'
+ - 'spec/models/concerns/noteable_spec.rb'
+ - 'spec/models/concerns/partitioned_table_spec.rb'
+ - 'spec/models/concerns/pg_full_text_searchable_spec.rb'
+ - 'spec/models/concerns/project_features_compatibility_spec.rb'
+ - 'spec/models/concerns/prometheus_adapter_spec.rb'
+ - 'spec/models/concerns/resolvable_discussion_spec.rb'
+ - 'spec/models/concerns/resolvable_note_spec.rb'
+ - 'spec/models/concerns/routable_spec.rb'
+ - 'spec/models/concerns/sensitive_serializable_hash_spec.rb'
+ - 'spec/models/concerns/sortable_spec.rb'
+ - 'spec/models/concerns/token_authenticatable_spec.rb'
+ - 'spec/models/concerns/token_authenticatable_strategies/encryption_helper_spec.rb'
+ - 'spec/models/concerns/x509_serial_number_attribute_spec.rb'
+ - 'spec/models/container_registry/event_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/context_commits_diff_spec.rb'
+ - 'spec/models/customer_relations/issue_contact_spec.rb'
+ - 'spec/models/deploy_key_spec.rb'
+ - 'spec/models/deployment_metrics_spec.rb'
+ - 'spec/models/design_management/design_spec.rb'
+ - 'spec/models/diff_discussion_spec.rb'
+ - 'spec/models/discussion_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/error_tracking/error_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/experiment_spec.rb'
+ - 'spec/models/gpg_key_spec.rb'
+ - 'spec/models/grafana_integration_spec.rb'
+ - 'spec/models/group_deploy_key_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/identity_spec.rb'
+ - 'spec/models/import_export_upload_spec.rb'
+ - 'spec/models/import_failure_spec.rb'
+ - 'spec/models/instance_configuration_spec.rb'
+ - 'spec/models/integration_spec.rb'
+ - 'spec/models/integrations/bamboo_spec.rb'
+ - 'spec/models/integrations/base_chat_notification_spec.rb'
+ - 'spec/models/integrations/base_issue_tracker_spec.rb'
+ - 'spec/models/integrations/chat_message/base_message_spec.rb'
+ - 'spec/models/integrations/chat_message/deployment_message_spec.rb'
+ - 'spec/models/integrations/chat_message/issue_message_spec.rb'
+ - 'spec/models/integrations/chat_message/merge_message_spec.rb'
+ - 'spec/models/integrations/chat_message/note_message_spec.rb'
+ - 'spec/models/integrations/chat_message/pipeline_message_spec.rb'
+ - 'spec/models/integrations/chat_message/push_message_spec.rb'
+ - 'spec/models/integrations/chat_message/wiki_page_message_spec.rb'
+ - 'spec/models/integrations/datadog_spec.rb'
+ - 'spec/models/integrations/discord_spec.rb'
+ - 'spec/models/integrations/drone_ci_spec.rb'
+ - 'spec/models/integrations/emails_on_push_spec.rb'
+ - 'spec/models/integrations/jenkins_spec.rb'
+ - 'spec/models/integrations/jira_spec.rb'
+ - 'spec/models/integrations/jira_tracker_data_spec.rb'
+ - 'spec/models/integrations/packagist_spec.rb'
+ - 'spec/models/integrations/prometheus_spec.rb'
+ - 'spec/models/integrations/slack_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/jira_import_state_spec.rb'
+ - 'spec/models/key_spec.rb'
+ - 'spec/models/lfs_download_object_spec.rb'
+ - 'spec/models/lfs_object_spec.rb'
+ - 'spec/models/loose_foreign_keys/deleted_record_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/members/last_group_owner_assigner_spec.rb'
+ - 'spec/models/members/project_member_spec.rb'
+ - 'spec/models/merge_request_assignee_spec.rb'
+ - 'spec/models/merge_request_context_commit_spec.rb'
+ - 'spec/models/merge_request_diff_commit_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/metrics/dashboard/annotation_spec.rb'
+ - 'spec/models/metrics/users_starred_dashboard_spec.rb'
+ - 'spec/models/milestone_spec.rb'
+ - 'spec/models/namespace/package_setting_spec.rb'
+ - 'spec/models/namespace/root_storage_statistics_spec.rb'
+ - 'spec/models/namespace_setting_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/namespace_statistics_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/notification_setting_spec.rb'
+ - 'spec/models/onboarding_progress_spec.rb'
+ - 'spec/models/packages/composer/cache_file_spec.rb'
+ - 'spec/models/packages/composer/metadatum_spec.rb'
+ - 'spec/models/packages/conan/metadatum_spec.rb'
+ - 'spec/models/packages/debian/file_entry_spec.rb'
+ - 'spec/models/packages/debian/file_metadatum_spec.rb'
+ - 'spec/models/packages/debian/publication_spec.rb'
+ - 'spec/models/packages/dependency_link_spec.rb'
+ - 'spec/models/packages/dependency_spec.rb'
+ - 'spec/models/packages/go/module_version_spec.rb'
+ - 'spec/models/packages/nuget/dependency_link_metadatum_spec.rb'
+ - 'spec/models/packages/nuget/metadatum_spec.rb'
+ - 'spec/models/packages/package_file_spec.rb'
+ - 'spec/models/packages/package_spec.rb'
+ - 'spec/models/pages/virtual_domain_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_dashboard_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_panel_spec.rb'
+ - 'spec/models/personal_access_token_spec.rb'
+ - 'spec/models/postgresql/detached_partition_spec.rb'
+ - 'spec/models/postgresql/replication_slot_spec.rb'
+ - 'spec/models/preloaders/environments/deployment_preloader_spec.rb'
+ - 'spec/models/preloaders/group_policy_preloader_spec.rb'
+ - 'spec/models/preloaders/group_root_ancestor_preloader_spec.rb'
+ - 'spec/models/preloaders/user_max_access_level_in_groups_preloader_spec.rb'
+ - 'spec/models/project_authorization_spec.rb'
+ - 'spec/models/project_feature_spec.rb'
+ - 'spec/models/project_import_state_spec.rb'
+ - 'spec/models/project_label_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/project_team_spec.rb'
+ - 'spec/models/projects/build_artifacts_size_refresh_spec.rb'
+ - 'spec/models/projects/repository_storage_move_spec.rb'
+ - 'spec/models/projects/topic_spec.rb'
+ - 'spec/models/projects/triggered_hooks_spec.rb'
+ - 'spec/models/prometheus_metric_spec.rb'
+ - 'spec/models/protected_branch/merge_access_level_spec.rb'
+ - 'spec/models/protected_branch/push_access_level_spec.rb'
+ - 'spec/models/protected_branch_spec.rb'
+ - 'spec/models/redirect_route_spec.rb'
+ - 'spec/models/release_highlight_spec.rb'
+ - 'spec/models/releases/link_spec.rb'
+ - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/resource_label_event_spec.rb'
+ - 'spec/models/resource_state_event_spec.rb'
+ - 'spec/models/sent_notification_spec.rb'
+ - 'spec/models/sentry_issue_spec.rb'
+ - 'spec/models/serverless/domain_spec.rb'
+ - 'spec/models/service_desk_setting_spec.rb'
+ - 'spec/models/snippet_input_action_spec.rb'
+ - 'spec/models/snippet_repository_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/state_note_spec.rb'
+ - 'spec/models/suggestion_spec.rb'
+ - 'spec/models/terraform/state_spec.rb'
+ - 'spec/models/timelog_spec.rb'
+ - 'spec/models/todo_spec.rb'
+ - 'spec/models/upload_spec.rb'
+ - 'spec/models/uploads/fog_spec.rb'
+ - 'spec/models/user_detail_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/users/in_product_marketing_email_spec.rb'
+ - 'spec/models/wiki_page_spec.rb'
+ - 'spec/models/x509_certificate_spec.rb'
+ - 'spec/policies/ci/build_policy_spec.rb'
+ - 'spec/policies/issuable_policy_spec.rb'
+ - 'spec/policies/issue_policy_spec.rb'
+ - 'spec/policies/merge_request_policy_spec.rb'
+ - 'spec/policies/namespaces/user_namespace_policy_spec.rb'
+ - 'spec/policies/note_policy_spec.rb'
+ - 'spec/policies/project_policy_spec.rb'
+ - 'spec/presenters/alert_management/alert_presenter_spec.rb'
+ - 'spec/presenters/blob_presenter_spec.rb'
+ - 'spec/presenters/blobs/notebook_presenter_spec.rb'
+ - 'spec/presenters/ci/legacy_stage_presenter_spec.rb'
+ - 'spec/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter_spec.rb'
+ - 'spec/presenters/ci/pipeline_presenter_spec.rb'
+ - 'spec/presenters/clusters/cluster_presenter_spec.rb'
+ - 'spec/presenters/commit_status_presenter_spec.rb'
+ - 'spec/presenters/gitlab/blame_presenter_spec.rb'
+ - 'spec/presenters/issue_presenter_spec.rb'
+ - 'spec/presenters/merge_request_presenter_spec.rb'
+ - 'spec/presenters/packages/composer/packages_presenter_spec.rb'
+ - 'spec/presenters/packages/conan/package_presenter_spec.rb'
+ - 'spec/presenters/packages/detail/package_presenter_spec.rb'
+ - 'spec/presenters/packages/helm/index_presenter_spec.rb'
+ - 'spec/presenters/packages/npm/package_presenter_spec.rb'
+ - 'spec/presenters/packages/nuget/package_metadata_presenter_spec.rb'
+ - 'spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb'
+ - 'spec/presenters/packages/nuget/search_results_presenter_spec.rb'
+ - 'spec/presenters/packages/pypi/package_presenter_spec.rb'
+ - 'spec/presenters/projects/security/configuration_presenter_spec.rb'
+ - 'spec/presenters/prometheus_alert_presenter_spec.rb'
+ - 'spec/presenters/service_hook_presenter_spec.rb'
+ - 'spec/presenters/snippet_blob_presenter_spec.rb'
+ - 'spec/presenters/tree_entry_presenter_spec.rb'
+ - 'spec/rack_servers/puma_spec.rb'
+ - 'spec/requests/admin/background_migrations_controller_spec.rb'
+ - 'spec/requests/api/access_requests_spec.rb'
+ - 'spec/requests/api/admin/instance_clusters_spec.rb'
+ - 'spec/requests/api/admin/plan_limits_spec.rb'
+ - 'spec/requests/api/admin/sidekiq_spec.rb'
+ - 'spec/requests/api/appearance_spec.rb'
+ - 'spec/requests/api/applications_spec.rb'
+ - 'spec/requests/api/award_emoji_spec.rb'
+ - 'spec/requests/api/badges_spec.rb'
+ - 'spec/requests/api/branches_spec.rb'
+ - 'spec/requests/api/broadcast_messages_spec.rb'
+ - 'spec/requests/api/bulk_imports_spec.rb'
+ - 'spec/requests/api/ci/job_artifacts_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/ci/pipeline_schedules_spec.rb'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_artifacts_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/runner/runners_post_spec.rb'
+ - 'spec/requests/api/ci/runner/runners_reset_spec.rb'
+ - 'spec/requests/api/ci/runners_spec.rb'
+ - 'spec/requests/api/ci/secure_files_spec.rb'
+ - 'spec/requests/api/ci/triggers_spec.rb'
+ - 'spec/requests/api/ci/variables_spec.rb'
+ - 'spec/requests/api/commit_statuses_spec.rb'
+ - 'spec/requests/api/commits_spec.rb'
+ - 'spec/requests/api/composer_packages_spec.rb'
+ - 'spec/requests/api/conan_instance_packages_spec.rb'
+ - 'spec/requests/api/conan_project_packages_spec.rb'
+ - 'spec/requests/api/debian_group_packages_spec.rb'
+ - 'spec/requests/api/debian_project_packages_spec.rb'
+ - 'spec/requests/api/deploy_keys_spec.rb'
+ - 'spec/requests/api/deploy_tokens_spec.rb'
+ - 'spec/requests/api/deployments_spec.rb'
+ - 'spec/requests/api/discussions_spec.rb'
+ - 'spec/requests/api/doorkeeper_access_spec.rb'
+ - 'spec/requests/api/environments_spec.rb'
+ - 'spec/requests/api/events_spec.rb'
+ - 'spec/requests/api/feature_flags_spec.rb'
+ - 'spec/requests/api/features_spec.rb'
+ - 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/generic_packages_spec.rb'
+ - 'spec/requests/api/go_proxy_spec.rb'
+ - 'spec/requests/api/graphql/boards/board_list_issues_query_spec.rb'
+ - 'spec/requests/api/graphql/boards/board_list_query_spec.rb'
+ - 'spec/requests/api/graphql/ci/application_setting_spec.rb'
+ - 'spec/requests/api/graphql/ci/jobs_spec.rb'
+ - 'spec/requests/api/graphql/ci/runner_spec.rb'
+ - 'spec/requests/api/graphql/ci/runners_spec.rb'
+ - 'spec/requests/api/graphql/container_repository/container_repository_details_spec.rb'
+ - 'spec/requests/api/graphql/current_user/groups_query_spec.rb'
+ - 'spec/requests/api/graphql/current_user/todos_query_spec.rb'
+ - 'spec/requests/api/graphql/current_user_query_spec.rb'
+ - 'spec/requests/api/graphql/gitlab_schema_spec.rb'
+ - 'spec/requests/api/graphql/group/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_image_ttl_policy_spec.rb'
+ - 'spec/requests/api/graphql/group/milestones_spec.rb'
+ - 'spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb'
+ - 'spec/requests/api/graphql/metrics/dashboard_query_spec.rb'
+ - 'spec/requests/api/graphql/milestone_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/job_token_scope/remove_project_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb'
+ - 'spec/requests/api/graphql/mutations/clusters/agent_tokens/agent_tokens/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/commits/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/set_crm_contacts_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/jira_import/start_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/set_labels_spec.rb'
+ - 'spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/metrics/dashboard/annotations/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/create_from_task_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/delete_spec.rb'
+ - 'spec/requests/api/graphql/namespace/root_storage_statistics_spec.rb'
+ - 'spec/requests/api/graphql/namespace_query_spec.rb'
+ - 'spec/requests/api/graphql/packages/package_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/metrics_dashboard_url_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/notes_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alerts_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/integrations_spec.rb'
+ - 'spec/requests/api/graphql/project/cluster_agents_spec.rb'
+ - 'spec/requests/api/graphql/project/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/designs/designs_spec.rb'
+ - 'spec/requests/api/graphql/project/issues_spec.rb'
+ - 'spec/requests/api/graphql/project/jira_import_spec.rb'
+ - 'spec/requests/api/graphql/project/jobs_spec.rb'
+ - 'spec/requests/api/graphql/project/milestones_spec.rb'
+ - 'spec/requests/api/graphql/project/pipeline_spec.rb'
+ - 'spec/requests/api/graphql/project/project_members_spec.rb'
+ - 'spec/requests/api/graphql/project/project_statistics_spec.rb'
+ - 'spec/requests/api/graphql/project/release_spec.rb'
+ - 'spec/requests/api/graphql/usage_trends_measurements_spec.rb'
+ - 'spec/requests/api/graphql/user/group_member_query_spec.rb'
+ - 'spec/requests/api/graphql/user/project_member_query_spec.rb'
+ - 'spec/requests/api/graphql/users_spec.rb'
+ - 'spec/requests/api/group_clusters_spec.rb'
+ - 'spec/requests/api/group_debian_distributions_spec.rb'
+ - 'spec/requests/api/group_labels_spec.rb'
+ - 'spec/requests/api/group_milestones_spec.rb'
+ - 'spec/requests/api/group_packages_spec.rb'
+ - 'spec/requests/api/group_variables_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/helm_packages_spec.rb'
+ - 'spec/requests/api/helpers_spec.rb'
+ - 'spec/requests/api/import_bitbucket_server_spec.rb'
+ - 'spec/requests/api/import_github_spec.rb'
+ - 'spec/requests/api/integrations_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/internal/kubernetes_spec.rb'
+ - 'spec/requests/api/internal/mail_room_spec.rb'
+ - 'spec/requests/api/internal/pages_spec.rb'
+ - 'spec/requests/api/invitations_spec.rb'
+ - 'spec/requests/api/issue_links_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/issues/get_project_issues_spec.rb'
+ - 'spec/requests/api/issues/issues_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/issues/put_projects_issues_spec.rb'
+ - 'spec/requests/api/keys_spec.rb'
+ - 'spec/requests/api/labels_spec.rb'
+ - 'spec/requests/api/lint_spec.rb'
+ - 'spec/requests/api/markdown_spec.rb'
+ - 'spec/requests/api/maven_packages_spec.rb'
+ - 'spec/requests/api/members_spec.rb'
+ - 'spec/requests/api/merge_request_diffs_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/metrics/dashboard/annotations_spec.rb'
+ - 'spec/requests/api/metrics/user_starred_dashboards_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/notification_settings_spec.rb'
+ - 'spec/requests/api/npm_project_packages_spec.rb'
+ - 'spec/requests/api/nuget_group_packages_spec.rb'
+ - 'spec/requests/api/nuget_project_packages_spec.rb'
+ - 'spec/requests/api/oauth_tokens_spec.rb'
+ - 'spec/requests/api/pages/internal_access_spec.rb'
+ - 'spec/requests/api/pages/private_access_spec.rb'
+ - 'spec/requests/api/pages/public_access_spec.rb'
+ - 'spec/requests/api/pages_domains_spec.rb'
+ - 'spec/requests/api/project_clusters_spec.rb'
+ - 'spec/requests/api/project_container_repositories_spec.rb'
+ - 'spec/requests/api/project_debian_distributions_spec.rb'
+ - 'spec/requests/api/project_events_spec.rb'
+ - 'spec/requests/api/project_export_spec.rb'
+ - 'spec/requests/api/project_hooks_spec.rb'
+ - 'spec/requests/api/project_import_spec.rb'
+ - 'spec/requests/api/project_milestones_spec.rb'
+ - 'spec/requests/api/project_packages_spec.rb'
+ - 'spec/requests/api/project_snippets_spec.rb'
+ - 'spec/requests/api/project_statistics_spec.rb'
+ - 'spec/requests/api/project_templates_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/pypi_packages_spec.rb'
+ - 'spec/requests/api/release/links_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/repositories_spec.rb'
+ - 'spec/requests/api/resource_state_events_spec.rb'
+ - 'spec/requests/api/rubygem_packages_spec.rb'
+ - 'spec/requests/api/search_spec.rb'
+ - 'spec/requests/api/settings_spec.rb'
+ - 'spec/requests/api/snippets_spec.rb'
+ - 'spec/requests/api/terraform/modules/v1/packages_spec.rb'
+ - 'spec/requests/api/todos_spec.rb'
+ - 'spec/requests/api/topics_spec.rb'
+ - 'spec/requests/api/unleash_spec.rb'
+ - 'spec/requests/api/user_counts_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/requests/api/v3/github_spec.rb'
+ - 'spec/requests/dashboard_controller_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/groups/email_campaigns_controller_spec.rb'
+ - 'spec/requests/groups/milestones_controller_spec.rb'
+ - 'spec/requests/groups/settings/access_tokens_controller_spec.rb'
+ - 'spec/requests/groups_controller_spec.rb'
+ - 'spec/requests/ide_controller_spec.rb'
+ - 'spec/requests/jira_connect/installations_controller_spec.rb'
+ - 'spec/requests/jira_connect/users_controller_spec.rb'
+ - 'spec/requests/jwt_controller_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/requests/oauth/tokens_controller_spec.rb'
+ - 'spec/requests/openid_connect_spec.rb'
+ - 'spec/requests/projects/ci/promeheus_metrics/histograms_controller_spec.rb'
+ - 'spec/requests/projects/commits_controller_spec.rb'
+ - 'spec/requests/projects/cycle_analytics_events_spec.rb'
+ - 'spec/requests/projects/google_cloud/deployments_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/gcp_regions_controller_spec.rb'
+ - 'spec/requests/projects/incident_management/pagerduty_incidents_spec.rb'
+ - 'spec/requests/projects/issue_links_controller_spec.rb'
+ - 'spec/requests/projects/issues/discussions_spec.rb'
+ - 'spec/requests/projects/issues_controller_spec.rb'
+ - 'spec/requests/projects/merge_requests/content_spec.rb'
+ - 'spec/requests/projects/merge_requests/context_commit_diffs_spec.rb'
+ - 'spec/requests/projects/merge_requests_controller_spec.rb'
+ - 'spec/requests/projects/merge_requests_discussions_spec.rb'
+ - 'spec/requests/projects/merge_requests_spec.rb'
+ - 'spec/requests/projects/metrics/dashboards/builder_spec.rb'
+ - 'spec/requests/projects/noteable_notes_spec.rb'
+ - 'spec/requests/projects/releases_controller_spec.rb'
+ - 'spec/requests/projects/settings/access_tokens_controller_spec.rb'
+ - 'spec/requests/projects/tags_controller_spec.rb'
+ - 'spec/requests/projects_controller_spec.rb'
+ - 'spec/requests/rack_attack_global_spec.rb'
+ - 'spec/requests/recursive_webhook_detection_spec.rb'
+ - 'spec/requests/request_profiler_spec.rb'
+ - 'spec/requests/users_controller_spec.rb'
+ - 'spec/routing/admin_routing_spec.rb'
+ - 'spec/routing/group_routing_spec.rb'
+ - 'spec/routing/import_routing_spec.rb'
+ - 'spec/routing/notifications_routing_spec.rb'
+ - 'spec/routing/project_routing_spec.rb'
+ - 'spec/routing/projects/security/configuration_controller_routing_spec.rb'
+ - 'spec/routing/routing_spec.rb'
+ - 'spec/routing/uploads_routing_spec.rb'
+ - 'spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb'
+ - 'spec/rubocop/cop/lint/last_keyword_argument_spec.rb'
+ - 'spec/rubocop/cop/migration/safer_boolean_column_spec.rb'
+ - 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
+ - 'spec/rubocop/cop/performance/readlines_each_spec.rb'
+ - 'spec/rubocop/cop/qa/testcase_link_format_spec.rb'
+ - 'spec/rubocop/cop/rspec/env_assignment_spec.rb'
+ - 'spec/rubocop/cop/rspec/expect_gitlab_tracking_spec.rb'
+ - 'spec/rubocop/cop/scalability/file_uploads_spec.rb'
+ - 'spec/scripts/changed-feature-flags_spec.rb'
+ - 'spec/scripts/failed_tests_spec.rb'
+ - 'spec/scripts/pipeline_test_report_builder_spec.rb'
+ - 'spec/serializers/accessibility_error_entity_spec.rb'
+ - 'spec/serializers/accessibility_reports_comparer_entity_spec.rb'
+ - 'spec/serializers/analytics/cycle_analytics/stage_entity_spec.rb'
+ - 'spec/serializers/base_discussion_entity_spec.rb'
+ - 'spec/serializers/build_details_entity_spec.rb'
+ - 'spec/serializers/clusters/kubernetes_error_entity_spec.rb'
+ - 'spec/serializers/codequality_degradation_entity_spec.rb'
+ - 'spec/serializers/commit_entity_spec.rb'
+ - 'spec/serializers/container_repositories_serializer_spec.rb'
+ - 'spec/serializers/context_commits_diff_entity_spec.rb'
+ - 'spec/serializers/diff_file_base_entity_spec.rb'
+ - 'spec/serializers/diff_file_entity_spec.rb'
+ - 'spec/serializers/diffs_entity_spec.rb'
+ - 'spec/serializers/diffs_metadata_entity_spec.rb'
+ - 'spec/serializers/discussion_entity_spec.rb'
+ - 'spec/serializers/environment_entity_spec.rb'
+ - 'spec/serializers/environment_serializer_spec.rb'
+ - 'spec/serializers/evidences/issue_entity_spec.rb'
+ - 'spec/serializers/fork_namespace_entity_spec.rb'
+ - 'spec/serializers/group_child_entity_spec.rb'
+ - 'spec/serializers/group_link/group_link_entity_spec.rb'
+ - 'spec/serializers/group_link/project_group_link_entity_spec.rb'
+ - 'spec/serializers/issue_board_entity_spec.rb'
+ - 'spec/serializers/issue_sidebar_basic_entity_spec.rb'
+ - 'spec/serializers/jira_connect/app_data_serializer_spec.rb'
+ - 'spec/serializers/job_artifact_report_entity_spec.rb'
+ - 'spec/serializers/member_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_serializer_spec.rb'
+ - 'spec/serializers/merge_request_widget_entity_spec.rb'
+ - 'spec/serializers/paginated_diff_entity_spec.rb'
+ - 'spec/serializers/pipeline_serializer_spec.rb'
+ - 'spec/serializers/review_app_setup_entity_spec.rb'
+ - 'spec/serializers/service_field_entity_spec.rb'
+ - 'spec/services/alert_management/alerts/update_service_spec.rb'
+ - 'spec/services/alert_management/create_alert_issue_service_spec.rb'
+ - 'spec/services/alert_management/http_integrations/create_service_spec.rb'
+ - 'spec/services/alert_management/http_integrations/update_service_spec.rb'
+ - 'spec/services/application_settings/update_service_spec.rb'
+ - 'spec/services/authorized_project_update/find_records_due_for_refresh_service_spec.rb'
+ - 'spec/services/authorized_project_update/project_create_service_spec.rb'
+ - 'spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb'
+ - 'spec/services/boards/issues/create_service_spec.rb'
+ - 'spec/services/boards/issues/list_service_spec.rb'
+ - 'spec/services/boards/issues/move_service_spec.rb'
+ - 'spec/services/branches/delete_merged_service_spec.rb'
+ - 'spec/services/branches/delete_service_spec.rb'
+ - 'spec/services/bulk_create_integration_service_spec.rb'
+ - 'spec/services/bulk_update_integration_service_spec.rb'
+ - 'spec/services/ci/abort_pipelines_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/custom_config_content_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/rules_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/tags_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/daily_build_group_report_result_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/job_artifacts/delete_project_artifacts_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/destroy_batch_service_spec.rb'
+ - 'spec/services/ci/parse_dotenv_artifact_service_spec.rb'
+ - 'spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb'
+ - 'spec/services/ci/register_job_service_spec.rb'
+ - 'spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb'
+ - 'spec/services/ci/retry_job_service_spec.rb'
+ - 'spec/services/ci/runners/register_runner_service_spec.rb'
+ - 'spec/services/ci/test_failure_history_service_spec.rb'
+ - 'spec/services/ci/unlock_artifacts_service_spec.rb'
+ - 'spec/services/ci/update_pending_build_service_spec.rb'
+ - 'spec/services/clusters/applications/check_installation_progress_service_spec.rb'
+ - 'spec/services/clusters/applications/check_uninstall_progress_service_spec.rb'
+ - 'spec/services/clusters/applications/create_service_spec.rb'
+ - 'spec/services/clusters/applications/schedule_update_service_spec.rb'
+ - 'spec/services/clusters/applications/uninstall_service_spec.rb'
+ - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
+ - 'spec/services/clusters/aws/provision_service_spec.rb'
+ - 'spec/services/clusters/create_service_spec.rb'
+ - 'spec/services/clusters/integrations/prometheus_health_check_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/configure_istio_ingress_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
+ - 'spec/services/clusters/management/validate_management_project_permissions_service_spec.rb'
+ - 'spec/services/clusters/update_service_spec.rb'
+ - 'spec/services/commits/cherry_pick_service_spec.rb'
+ - 'spec/services/concerns/exclusive_lease_guard_spec.rb'
+ - 'spec/services/concerns/merge_requests/assigns_merge_params_spec.rb'
+ - 'spec/services/concerns/rate_limited_service_spec.rb'
+ - 'spec/services/container_expiration_policies/cleanup_service_spec.rb'
+ - 'spec/services/container_expiration_policies/update_service_spec.rb'
+ - 'spec/services/customer_relations/contacts/create_service_spec.rb'
+ - 'spec/services/customer_relations/contacts/update_service_spec.rb'
+ - 'spec/services/customer_relations/organizations/create_service_spec.rb'
+ - 'spec/services/dependency_proxy/find_cached_manifest_service_spec.rb'
+ - 'spec/services/deployments/link_merge_requests_service_spec.rb'
+ - 'spec/services/deployments/update_environment_service_spec.rb'
+ - 'spec/services/design_management/copy_design_collection/copy_service_spec.rb'
+ - 'spec/services/design_management/delete_designs_service_spec.rb'
+ - 'spec/services/design_management/design_user_notes_count_service_spec.rb'
+ - 'spec/services/design_management/save_designs_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_positions_service_spec.rb'
+ - 'spec/services/discussions/resolve_service_spec.rb'
+ - 'spec/services/draft_notes/publish_service_spec.rb'
+ - 'spec/services/environments/reset_auto_stop_service_spec.rb'
+ - 'spec/services/environments/schedule_to_delete_review_apps_service_spec.rb'
+ - 'spec/services/environments/stop_service_spec.rb'
+ - 'spec/services/error_tracking/base_service_spec.rb'
+ - 'spec/services/events/destroy_service_spec.rb'
+ - 'spec/services/feature_flags/create_service_spec.rb'
+ - 'spec/services/feature_flags/update_service_spec.rb'
+ - 'spec/services/files/delete_service_spec.rb'
+ - 'spec/services/files/multi_service_spec.rb'
+ - 'spec/services/files/update_service_spec.rb'
+ - 'spec/services/git/branch_hooks_service_spec.rb'
+ - 'spec/services/git/branch_push_service_spec.rb'
+ - 'spec/services/google_cloud/enable_cloud_run_service_spec.rb'
+ - 'spec/services/google_cloud/gcp_region_add_or_replace_service_spec.rb'
+ - 'spec/services/google_cloud/service_accounts_service_spec.rb'
+ - 'spec/services/groups/autocomplete_service_spec.rb'
+ - 'spec/services/groups/create_service_spec.rb'
+ - 'spec/services/groups/group_links/destroy_service_spec.rb'
+ - 'spec/services/groups/open_issues_count_service_spec.rb'
+ - 'spec/services/groups/transfer_service_spec.rb'
+ - 'spec/services/groups/update_service_spec.rb'
+ - 'spec/services/groups/update_shared_runners_service_spec.rb'
+ - 'spec/services/import/bitbucket_server_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/create_project_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/file_upload_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_spec.rb'
+ - 'spec/services/import/validate_remote_git_endpoint_service_spec.rb'
+ - 'spec/services/incident_management/incidents/create_service_spec.rb'
+ - 'spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb'
+ - 'spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb'
+ - 'spec/services/incident_management/pager_duty/process_webhook_service_spec.rb'
+ - 'spec/services/integrations/propagate_service_spec.rb'
+ - 'spec/services/issuable/bulk_update_service_spec.rb'
+ - 'spec/services/issuable/clone/attributes_rewriter_spec.rb'
+ - 'spec/services/issuable/common_system_notes_service_spec.rb'
+ - 'spec/services/issuable/destroy_service_spec.rb'
+ - 'spec/services/issue_links/create_service_spec.rb'
+ - 'spec/services/issue_links/list_service_spec.rb'
+ - 'spec/services/issues/after_create_service_spec.rb'
+ - 'spec/services/issues/build_service_spec.rb'
+ - 'spec/services/issues/clone_service_spec.rb'
+ - 'spec/services/issues/close_service_spec.rb'
+ - 'spec/services/issues/create_service_spec.rb'
+ - 'spec/services/issues/duplicate_service_spec.rb'
+ - 'spec/services/issues/export_csv_service_spec.rb'
+ - 'spec/services/issues/move_service_spec.rb'
+ - 'spec/services/issues/referenced_merge_requests_service_spec.rb'
+ - 'spec/services/issues/relative_position_rebalancing_service_spec.rb'
+ - 'spec/services/issues/resolve_discussions_spec.rb'
+ - 'spec/services/issues/set_crm_contacts_service_spec.rb'
+ - 'spec/services/issues/update_service_spec.rb'
+ - 'spec/services/jira/requests/projects/list_service_spec.rb'
+ - 'spec/services/jira_connect_installations/destroy_service_spec.rb'
+ - 'spec/services/jira_import/cloud_users_mapper_service_spec.rb'
+ - 'spec/services/jira_import/server_users_mapper_service_spec.rb'
+ - 'spec/services/jira_import/start_import_service_spec.rb'
+ - 'spec/services/jira_import/users_importer_spec.rb'
+ - 'spec/services/labels/available_labels_service_spec.rb'
+ - 'spec/services/labels/promote_service_spec.rb'
+ - 'spec/services/labels/transfer_service_spec.rb'
+ - 'spec/services/lfs/push_service_spec.rb'
+ - 'spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb'
+ - 'spec/services/loose_foreign_keys/cleaner_service_spec.rb'
+ - 'spec/services/members/approve_access_request_service_spec.rb'
+ - 'spec/services/members/create_service_spec.rb'
+ - 'spec/services/members/destroy_service_spec.rb'
+ - 'spec/services/members/invitation_reminder_email_service_spec.rb'
+ - 'spec/services/members/unassign_issuables_service_spec.rb'
+ - 'spec/services/members/update_service_spec.rb'
+ - 'spec/services/merge_requests/add_context_service_spec.rb'
+ - 'spec/services/merge_requests/after_create_service_spec.rb'
+ - 'spec/services/merge_requests/assign_issues_service_spec.rb'
+ - 'spec/services/merge_requests/base_service_spec.rb'
+ - 'spec/services/merge_requests/build_service_spec.rb'
+ - 'spec/services/merge_requests/bulk_remove_attention_requested_service_spec.rb'
+ - 'spec/services/merge_requests/cleanup_refs_service_spec.rb'
+ - 'spec/services/merge_requests/conflicts/list_service_spec.rb'
+ - 'spec/services/merge_requests/create_from_issue_service_spec.rb'
+ - 'spec/services/merge_requests/create_pipeline_service_spec.rb'
+ - 'spec/services/merge_requests/create_service_spec.rb'
+ - 'spec/services/merge_requests/ff_merge_service_spec.rb'
+ - 'spec/services/merge_requests/get_urls_service_spec.rb'
+ - 'spec/services/merge_requests/handle_assignees_change_service_spec.rb'
+ - 'spec/services/merge_requests/link_lfs_objects_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/merge_to_ref_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/check_broken_status_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/check_discussions_status_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/run_checks_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability_check_service_spec.rb'
+ - 'spec/services/merge_requests/push_options_handler_service_spec.rb'
+ - 'spec/services/merge_requests/rebase_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/merge_requests/request_review_service_spec.rb'
+ - 'spec/services/merge_requests/squash_service_spec.rb'
+ - 'spec/services/merge_requests/toggle_attention_requested_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/metrics/dashboard/annotations/create_service_spec.rb'
+ - 'spec/services/metrics/dashboard/clone_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/update_dashboard_service_spec.rb'
+ - 'spec/services/metrics/users_starred_dashboards/create_service_spec.rb'
+ - 'spec/services/metrics/users_starred_dashboards/delete_service_spec.rb'
+ - 'spec/services/milestones/transfer_service_spec.rb'
+ - 'spec/services/namespace_settings/update_service_spec.rb'
+ - 'spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
+ - 'spec/services/namespaces/package_settings/update_service_spec.rb'
+ - 'spec/services/notes/build_service_spec.rb'
+ - 'spec/services/notes/copy_service_spec.rb'
+ - 'spec/services/notes/create_service_spec.rb'
+ - 'spec/services/notes/destroy_service_spec.rb'
+ - 'spec/services/notes/quick_actions_service_spec.rb'
+ - 'spec/services/notes/update_service_spec.rb'
+ - 'spec/services/notification_recipients/build_service_spec.rb'
+ - 'spec/services/notification_recipients/builder/default_spec.rb'
+ - 'spec/services/notification_recipients/builder/new_note_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/packages/composer/create_package_service_spec.rb'
+ - 'spec/services/packages/create_dependency_service_spec.rb'
+ - 'spec/services/packages/debian/create_distribution_service_spec.rb'
+ - 'spec/services/packages/debian/extract_changes_metadata_service_spec.rb'
+ - 'spec/services/packages/debian/extract_metadata_service_spec.rb'
+ - 'spec/services/packages/debian/parse_debian822_service_spec.rb'
+ - 'spec/services/packages/debian/process_changes_service_spec.rb'
+ - 'spec/services/packages/debian/sign_distribution_service_spec.rb'
+ - 'spec/services/packages/debian/update_distribution_service_spec.rb'
+ - 'spec/services/packages/generic/create_package_file_service_spec.rb'
+ - 'spec/services/packages/helm/extract_file_metadata_service_spec.rb'
+ - 'spec/services/packages/helm/process_file_service_spec.rb'
+ - 'spec/services/packages/maven/find_or_create_package_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/sync_service_spec.rb'
+ - 'spec/services/packages/npm/create_package_service_spec.rb'
+ - 'spec/services/packages/npm/create_tag_service_spec.rb'
+ - 'spec/services/packages/nuget/create_dependency_service_spec.rb'
+ - 'spec/services/packages/nuget/metadata_extraction_service_spec.rb'
+ - 'spec/services/packages/nuget/search_service_spec.rb'
+ - 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb'
+ - 'spec/services/packages/rubygems/process_gem_service_spec.rb'
+ - 'spec/services/packages/terraform_module/create_package_service_spec.rb'
+ - 'spec/services/pages/migrate_from_legacy_storage_service_spec.rb'
+ - 'spec/services/pages/migrate_legacy_storage_to_deployment_service_spec.rb'
+ - 'spec/services/personal_access_tokens/create_service_spec.rb'
+ - 'spec/services/personal_access_tokens/revoke_service_spec.rb'
+ - 'spec/services/pod_logs/elasticsearch_service_spec.rb'
+ - 'spec/services/pod_logs/kubernetes_service_spec.rb'
+ - 'spec/services/post_receive_service_spec.rb'
+ - 'spec/services/projects/apple_target_platform_detector_service_spec.rb'
+ - 'spec/services/projects/autocomplete_service_spec.rb'
+ - 'spec/services/projects/branches_by_mode_service_spec.rb'
+ - 'spec/services/projects/cleanup_service_spec.rb'
+ - 'spec/services/projects/container_repository/cleanup_tags_service_spec.rb'
+ - 'spec/services/projects/container_repository/delete_tags_service_spec.rb'
+ - 'spec/services/projects/container_repository/destroy_service_spec.rb'
+ - 'spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb'
+ - 'spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb'
+ - 'spec/services/projects/create_service_spec.rb'
+ - 'spec/services/projects/destroy_service_spec.rb'
+ - 'spec/services/projects/download_service_spec.rb'
+ - 'spec/services/projects/fetch_statistics_increment_service_spec.rb'
+ - 'spec/services/projects/fork_service_spec.rb'
+ - 'spec/services/projects/git_deduplication_service_spec.rb'
+ - 'spec/services/projects/group_links/destroy_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migration_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_repository_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_service_spec.rb'
+ - 'spec/services/projects/import_error_filter_spec.rb'
+ - 'spec/services/projects/import_export/export_service_spec.rb'
+ - 'spec/services/projects/import_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_import_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb'
+ - 'spec/services/projects/open_issues_count_service_spec.rb'
+ - 'spec/services/projects/operations/update_service_spec.rb'
+ - 'spec/services/projects/overwrite_project_service_spec.rb'
+ - 'spec/services/projects/transfer_service_spec.rb'
+ - 'spec/services/projects/unlink_fork_service_spec.rb'
+ - 'spec/services/projects/update_pages_service_spec.rb'
+ - 'spec/services/projects/update_repository_storage_service_spec.rb'
+ - 'spec/services/projects/update_service_spec.rb'
+ - 'spec/services/protected_branches/create_service_spec.rb'
+ - 'spec/services/quick_actions/interpret_service_spec.rb'
+ - 'spec/services/repositories/destroy_service_spec.rb'
+ - 'spec/services/repository_archive_clean_up_service_spec.rb'
+ - 'spec/services/resource_access_tokens/create_service_spec.rb'
+ - 'spec/services/resource_access_tokens/revoke_service_spec.rb'
+ - 'spec/services/resource_events/change_labels_service_spec.rb'
+ - 'spec/services/resource_events/change_state_service_spec.rb'
+ - 'spec/services/resource_events/synthetic_milestone_notes_builder_service_spec.rb'
+ - 'spec/services/search/global_service_spec.rb'
+ - 'spec/services/search/group_service_spec.rb'
+ - 'spec/services/search/snippet_service_spec.rb'
+ - 'spec/services/search_service_spec.rb'
+ - 'spec/services/security/ci_configuration/sast_create_service_spec.rb'
+ - 'spec/services/security/merge_reports_service_spec.rb'
+ - 'spec/services/service_ping/service_ping_settings_spec.rb'
+ - 'spec/services/service_ping/submit_service_ping_service_spec.rb'
+ - 'spec/services/snippets/create_service_spec.rb'
+ - 'spec/services/snippets/update_repository_storage_service_spec.rb'
+ - 'spec/services/snippets/update_service_spec.rb'
+ - 'spec/services/spam/spam_action_service_spec.rb'
+ - 'spec/services/spam/spam_verdict_service_spec.rb'
+ - 'spec/services/system_note_service_spec.rb'
+ - 'spec/services/system_notes/commit_service_spec.rb'
+ - 'spec/services/system_notes/design_management_service_spec.rb'
+ - 'spec/services/system_notes/incident_service_spec.rb'
+ - 'spec/services/system_notes/issuables_service_spec.rb'
+ - 'spec/services/system_notes/merge_requests_service_spec.rb'
+ - 'spec/services/system_notes/time_tracking_service_spec.rb'
+ - 'spec/services/tags/destroy_service_spec.rb'
+ - 'spec/services/test_hooks/system_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/todos/allowed_target_filter_service_spec.rb'
+ - 'spec/services/users/approve_service_spec.rb'
+ - 'spec/services/users/ban_service_spec.rb'
+ - 'spec/services/users/create_service_spec.rb'
+ - 'spec/services/users/migrate_to_ghost_user_service_spec.rb'
+ - 'spec/services/users/reject_service_spec.rb'
+ - 'spec/services/users/unban_service_spec.rb'
+ - 'spec/services/users/upsert_credit_card_validation_service_spec.rb'
+ - 'spec/services/web_hook_service_spec.rb'
+ - 'spec/services/web_hooks/log_execution_service_spec.rb'
+ - 'spec/services/work_items/create_and_link_service_spec.rb'
+ - 'spec/services/work_items/create_from_task_service_spec.rb'
+ - 'spec/services/work_items/create_service_spec.rb'
+ - 'spec/services/work_items/task_list_reference_replacement_service_spec.rb'
+ - 'spec/services/work_items/update_service_spec.rb'
+ - 'spec/services/x509_certificate_revoke_service_spec.rb'
+ - 'spec/sidekiq_cluster/sidekiq_cluster_spec.rb'
+ - 'spec/simplecov_env.rb'
+ - 'spec/spec_helper.rb'
+ - 'spec/support/atlassian/jira_connect/schemata.rb'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/cycle_analytics_helpers/test_generation.rb'
+ - 'spec/support/database/multiple_databases.rb'
+ - 'spec/support/database/prevent_cross_database_modification.rb'
+ - 'spec/support/database/prevent_cross_joins.rb'
+ - 'spec/support/db_cleaner.rb'
+ - 'spec/support/flaky_tests.rb'
+ - 'spec/support/helpers/api_helpers.rb'
+ - 'spec/support/helpers/board_helpers.rb'
+ - 'spec/support/helpers/cycle_analytics_helpers.rb'
+ - 'spec/support/helpers/dns_helpers.rb'
+ - 'spec/support/helpers/drag_to_helper.rb'
+ - 'spec/support/helpers/email_helpers.rb'
+ - 'spec/support/helpers/feature_flag_helpers.rb'
+ - 'spec/support/helpers/filtered_search_helpers.rb'
+ - 'spec/support/helpers/git_http_helpers.rb'
+ - 'spec/support/helpers/global_id_deprecation_helpers.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/helpers/javascript_fixtures_helpers.rb'
+ - 'spec/support/helpers/jira_service_helper.rb'
+ - 'spec/support/helpers/kubernetes_helpers.rb'
+ - 'spec/support/helpers/lets_encrypt_helpers.rb'
+ - 'spec/support/helpers/live_debugger.rb'
+ - 'spec/support/helpers/login_helpers.rb'
+ - 'spec/support/helpers/merge_request_diff_helpers.rb'
+ - 'spec/support/helpers/prometheus_helpers.rb'
+ - 'spec/support/helpers/seed_repo.rb'
+ - 'spec/support/helpers/selection_helper.rb'
+ - 'spec/support/helpers/stub_feature_flags.rb'
+ - 'spec/support/helpers/stub_gitlab_calls.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/helpers/usage_data_helpers.rb'
+ - 'spec/support/helpers/workhorse_helpers.rb'
+ - 'spec/support/helpers/x509_helpers.rb'
+ - 'spec/support/matchers/background_migrations_matchers.rb'
+ - 'spec/support/matchers/pagination_matcher.rb'
+ - 'spec/support/matchers/project_namespace_matcher.rb'
+ - 'spec/support/matchers/query_matcher.rb'
+ - 'spec/support/matchers/route_to_route_not_found_matcher.rb'
+ - 'spec/support/migrations_helpers/schema_version_finder.rb'
+ - 'spec/support/migrations_helpers/vulnerabilities_findings_helper.rb'
+ - 'spec/support/prometheus/additional_metrics_shared_examples.rb'
+ - 'spec/support/redis/redis_shared_examples.rb'
+ - 'spec/support/services/deploy_token_shared_examples.rb'
+ - 'spec/support/services/issuable_update_service_shared_examples.rb'
+ - 'spec/support/shared_contexts/bulk_imports_requests_shared_context.rb'
+ - 'spec/support/shared_contexts/container_repositories_shared_context.rb'
+ - 'spec/support/shared_contexts/finders/group_projects_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/fixtures/analytics_shared_context.rb'
+ - 'spec/support/shared_contexts/graphql/resolvers/runners_resolver_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb'
+ - 'spec/support/shared_contexts/presenters/nuget_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/debian_repository_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/go_modules_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/workhorse_shared_context.rb'
+ - 'spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb'
+ - 'spec/support/shared_contexts/services/packages/debian/distribution_shared_context.rb'
+ - 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
+ - 'spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb'
+ - 'spec/support/shared_examples/ci/badge_template_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/deploy_token_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/destroy_hook_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/hotlink_interceptor_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/set_sort_order_from_user_preference_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/features/2fa_shared_examples.rb'
+ - 'spec/support/shared_examples/features/archive_download_buttons_shared_examples.rb'
+ - 'spec/support/shared_examples/features/container_registry_shared_examples.rb'
+ - 'spec/support/shared_examples/features/discussion_comments_shared_example.rb'
+ - 'spec/support/shared_examples/features/editable_merge_request_shared_examples.rb'
+ - 'spec/support/shared_examples/features/error_tracking_shared_example.rb'
+ - 'spec/support/shared_examples/features/manage_applications_shared_examples.rb'
+ - 'spec/support/shared_examples/features/page_description_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar/sidebar_milestone_shared_examples.rb'
+ - 'spec/support/shared_examples/features/variable_list_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_asciidoc_page_with_includes_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_empty_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/packages/debian/distributions_finder_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/security/jobs_finder_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/snippet_visibility_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/mutations/http_integrations_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/mutations/security/ci_configuration_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/notes_creation_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/spam_protection_shared_examples.rb'
+ - 'spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/cache_helpers_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/background_migration/backfill_project_repositories_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ci/build/rules/rule/clause/clause_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/diff_file_collections_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ldap_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/local_and_remote_storage_migration_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/middleware/multipart_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/position_formatters_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/search_results_sorted_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sidekiq_middleware/metrics_middleware_with_worker_attribution_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sidekiq_middleware/strategy_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/usage_data_counters/code_review_extension_request_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb'
+ - 'spec/support/shared_examples/loose_foreign_keys/have_loose_foreign_key.rb'
+ - 'spec/support/shared_examples/mailers/notify_shared_examples.rb'
+ - 'spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb'
+ - 'spec/support/shared_examples/metrics/transaction_metrics_with_labels_shared_examples.rb'
+ - 'spec/support/shared_examples/models/application_setting_shared_examples.rb'
+ - 'spec/support/shared_examples/models/atomic_internal_id_shared_examples.rb'
+ - 'spec/support/shared_examples/models/chat_integration_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/can_move_repository_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/has_repository_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/incident_management/escalatable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/issuable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/limitable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/repositories/can_housekeep_repository_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/repository_storage_movable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb'
+ - 'spec/support/shared_examples/models/diff_note_after_commit_shared_examples.rb'
+ - 'spec/support/shared_examples/models/issuable_link_shared_examples.rb'
+ - 'spec/support/shared_examples/models/label_note_shared_examples.rb'
+ - 'spec/support/shared_examples/models/member_shared_examples.rb'
+ - 'spec/support/shared_examples/models/mentionable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/architecture_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/component_file_shared_example.rb'
+ - 'spec/support/shared_examples/models/packages/debian/component_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/distribution_key_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb'
+ - 'spec/support/shared_examples/models/relative_positioning_shared_examples.rb'
+ - 'spec/support/shared_examples/models/resource_timebox_event_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/versioned_description_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/support/shared_examples/namespaces/traversal_examples.rb'
+ - 'spec/support/shared_examples/namespaces/traversal_scope_examples.rb'
+ - 'spec/support/shared_examples/nav_sidebar_shared_examples.rb'
+ - 'spec/support/shared_examples/policies/project_policy_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/clone_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/move_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/merge_request/rebase_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/custom_attributes_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/debian_distributions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/diff_discussions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/discussions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/mutations/destroy_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/projects/alert_management/integrations_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/milestones_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/notes_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/read_user_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/resource_label_events_api_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/resource_milestone_events_api_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/snippets_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/time_tracking_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/rack_attack_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/sessionless_auth_request_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/snippet_shared_examples.rb'
+ - 'spec/support/shared_examples/routing/git_http_routing_shared_examples.rb'
+ - 'spec/support/shared_examples/serializers/diff_file_entity_shared_examples.rb'
+ - 'spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb'
+ - 'spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/boards_recent_visit_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/issues_move_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/container_expiration_policy_shared_examples.rb'
+ - 'spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb'
+ - 'spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb'
+ - 'spec/support/shared_examples/services/jira/requests/base_shared_examples.rb'
+ - 'spec/support/shared_examples/services/jira_import/user_mapper_services_shared_examples.rb'
+ - 'spec/support/shared_examples/services/merge_request_shared_examples.rb'
+ - 'spec/support/shared_examples/services/metrics/dashboard_shared_examples.rb'
+ - 'spec/support/shared_examples/services/namespace_package_settings_shared_examples.rb'
+ - 'spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb'
+ - 'spec/support/shared_examples/services/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/rate_limited_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb'
+ - 'spec/support/shared_examples/services/resource_events/change_milestone_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb'
+ - 'spec/support/shared_examples/snippet_blob_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/upload_type_shared_examples.rb'
+ - 'spec/support/shared_examples/views/registration_features_prompt_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/concerns/dependency_proxy/cleanup_worker_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/gitlab/jira_import/jira_import_workers_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/project_export_shared_examples.rb'
+ - 'spec/support_specs/database/multiple_databases_spec.rb'
+ - 'spec/support_specs/database/prevent_cross_joins_spec.rb'
+ - 'spec/support_specs/helpers/active_record/query_recorder_spec.rb'
+ - 'spec/support_specs/helpers/graphql_helpers_spec.rb'
+ - 'spec/support_specs/helpers/stub_feature_flags_spec.rb'
+ - 'spec/tasks/dev_rake_spec.rb'
+ - 'spec/tasks/gitlab/artifacts/check_rake_spec.rb'
+ - 'spec/tasks/gitlab/background_migrations_rake_spec.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tasks/gitlab/db/validate_config_rake_spec.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
+ - 'spec/tasks/gitlab/external_diffs_rake_spec.rb'
+ - 'spec/tasks/gitlab/generate_sample_prometheus_data_spec.rb'
+ - 'spec/tasks/gitlab/gitaly_rake_spec.rb'
+ - 'spec/tasks/gitlab/ldap_rake_spec.rb'
+ - 'spec/tasks/gitlab/lfs/check_rake_spec.rb'
+ - 'spec/tasks/gitlab/password_rake_spec.rb'
+ - 'spec/tasks/gitlab/praefect_rake_spec.rb'
+ - 'spec/tasks/gitlab/refresh_project_statistics_build_artifacts_size_rake_spec.rb'
+ - 'spec/tasks/gitlab/smtp_rake_spec.rb'
+ - 'spec/tasks/gitlab/snippets_rake_spec.rb'
+ - 'spec/tasks/gitlab/storage_rake_spec.rb'
+ - 'spec/tasks/gitlab/task_helpers_spec.rb'
+ - 'spec/tasks/gitlab/terraform/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/update_templates_rake_spec.rb'
+ - 'spec/tasks/gitlab/uploads/check_rake_spec.rb'
+ - 'spec/tasks/gitlab/workhorse_rake_spec.rb'
+ - 'spec/tasks/migrate/schema_check_rake_spec.rb'
+ - 'spec/tooling/danger/datateam_spec.rb'
+ - 'spec/tooling/danger/feature_flag_spec.rb'
+ - 'spec/tooling/danger/product_intelligence_spec.rb'
+ - 'spec/tooling/danger/project_helper_spec.rb'
+ - 'spec/tooling/danger/sidekiq_queues_spec.rb'
+ - 'spec/tooling/danger/specs_spec.rb'
+ - 'spec/tooling/lib/tooling/kubernetes_client_spec.rb'
+ - 'spec/tooling/lib/tooling/test_map_generator_spec.rb'
+ - 'spec/tooling/quality/test_level_spec.rb'
+ - 'spec/tooling/rspec_flaky/config_spec.rb'
+ - 'spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb'
+ - 'spec/tooling/rspec_flaky/report_spec.rb'
+ - 'spec/uploaders/ci/pipeline_artifact_uploader_spec.rb'
+ - 'spec/uploaders/external_diff_uploader_spec.rb'
+ - 'spec/uploaders/file_mover_spec.rb'
+ - 'spec/uploaders/file_uploader_spec.rb'
+ - 'spec/uploaders/job_artifact_uploader_spec.rb'
+ - 'spec/uploaders/lfs_object_uploader_spec.rb'
+ - 'spec/uploaders/namespace_file_uploader_spec.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
+ - 'spec/uploaders/pages/deployment_uploader_spec.rb'
+ - 'spec/validators/import/gitlab_projects/remote_file_validator_spec.rb'
+ - 'spec/validators/json_schema_validator_spec.rb'
+ - 'spec/validators/nested_attributes_duplicates_validator_spec.rb'
+ - 'spec/views/admin/application_settings/_package_registry.html.haml_spec.rb'
+ - 'spec/views/admin/application_settings/general.html.haml_spec.rb'
+ - 'spec/views/admin/application_settings/repository.html.haml_spec.rb'
+ - 'spec/views/admin/broadcast_messages/index.html.haml_spec.rb'
+ - 'spec/views/admin/dashboard/index.html.haml_spec.rb'
+ - 'spec/views/devise/shared/_signin_box.html.haml_spec.rb'
+ - 'spec/views/groups/edit.html.haml_spec.rb'
+ - 'spec/views/help/index.html.haml_spec.rb'
+ - 'spec/views/layouts/_head.html.haml_spec.rb'
+ - 'spec/views/layouts/application.html.haml_spec.rb'
+ - 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
+ - 'spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb'
+ - 'spec/views/notify/change_in_merge_request_draft_status_email.text.erb_spec.rb'
+ - 'spec/views/notify/push_to_merge_request_email.text.haml_spec.rb'
+ - 'spec/views/profiles/keys/_form.html.haml_spec.rb'
+ - 'spec/views/projects/artifacts/_artifact.html.haml_spec.rb'
+ - 'spec/views/projects/commits/_commit.html.haml_spec.rb'
+ - 'spec/views/projects/edit.html.haml_spec.rb'
+ - 'spec/views/projects/imports/new.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/pages_domains/show.html.haml_spec.rb'
+ - 'spec/views/projects/pipeline_schedules/_pipeline_schedule.html.haml_spec.rb'
+ - 'spec/views/projects/settings/ci_cd/_autodevops_form.html.haml_spec.rb'
+ - 'spec/views/projects/settings/operations/show.html.haml_spec.rb'
+ - 'spec/views/projects/tags/index.html.haml_spec.rb'
+ - 'spec/views/projects/tree/show.html.haml_spec.rb'
+ - 'spec/views/search/_results.html.haml_spec.rb'
+ - 'spec/views/shared/access_tokens/_table.html.haml_spec.rb'
+ - 'spec/views/shared/milestones/_issuable.html.haml_spec.rb'
+ - 'spec/views/shared/projects/_project.html.haml_spec.rb'
+ - 'spec/views/shared/snippets/_snippet.html.haml_spec.rb'
+ - 'spec/views/shared/ssh_keys/_key_details.html.haml_spec.rb'
+ - 'spec/views/shared/wikis/_sidebar.html.haml_spec.rb'
+ - 'spec/workers/analytics/usage_trends/counter_job_worker_spec.rb'
+ - 'spec/workers/authorized_project_update/project_recalculate_per_user_worker_spec.rb'
+ - 'spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb'
+ - 'spec/workers/auto_devops/disable_worker_spec.rb'
+ - 'spec/workers/background_migration/ci_database_worker_spec.rb'
+ - 'spec/workers/build_success_worker_spec.rb'
+ - 'spec/workers/bulk_import_worker_spec.rb'
+ - 'spec/workers/bulk_imports/export_request_worker_spec.rb'
+ - 'spec/workers/bulk_imports/stuck_import_worker_spec.rb'
+ - 'spec/workers/ci/job_artifacts/expire_project_build_artifacts_worker_spec.rb'
+ - 'spec/workers/ci/merge_requests/add_todo_when_build_fails_worker_spec.rb'
+ - 'spec/workers/ci/pending_builds/update_group_worker_spec.rb'
+ - 'spec/workers/ci/pending_builds/update_project_worker_spec.rb'
+ - 'spec/workers/ci/pipeline_artifacts/create_quality_report_worker_spec.rb'
+ - 'spec/workers/ci/pipeline_success_unlock_artifacts_worker_spec.rb'
+ - 'spec/workers/ci/ref_delete_unlock_artifacts_worker_spec.rb'
+ - 'spec/workers/ci/resource_groups/assign_resource_from_resource_group_worker_spec.rb'
+ - 'spec/workers/cluster_wait_for_app_update_worker_spec.rb'
+ - 'spec/workers/clusters/applications/activate_service_worker_spec.rb'
+ - 'spec/workers/clusters/applications/deactivate_service_worker_spec.rb'
+ - 'spec/workers/clusters/integrations/check_prometheus_health_worker_spec.rb'
+ - 'spec/workers/concerns/application_worker_spec.rb'
+ - 'spec/workers/concerns/project_import_options_spec.rb'
+ - 'spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb'
+ - 'spec/workers/container_expiration_policy_worker_spec.rb'
+ - 'spec/workers/container_registry/migration/guard_worker_spec.rb'
+ - 'spec/workers/container_registry/migration/observer_worker_spec.rb'
+ - 'spec/workers/create_pipeline_worker_spec.rb'
+ - 'spec/workers/database/batched_background_migration/ci_database_worker_spec.rb'
+ - 'spec/workers/database/batched_background_migration_worker_spec.rb'
+ - 'spec/workers/dependency_proxy/image_ttl_group_policy_worker_spec.rb'
+ - 'spec/workers/deployments/hooks_worker_spec.rb'
+ - 'spec/workers/deployments/update_environment_worker_spec.rb'
+ - 'spec/workers/disallow_two_factor_for_subgroups_worker_spec.rb'
+ - 'spec/workers/email_receiver_worker_spec.rb'
+ - 'spec/workers/emails_on_push_worker_spec.rb'
+ - 'spec/workers/every_sidekiq_worker_spec.rb'
+ - 'spec/workers/gitlab/import/stuck_import_job_spec.rb'
+ - 'spec/workers/gitlab/jira_import/import_issue_worker_spec.rb'
+ - 'spec/workers/group_export_worker_spec.rb'
+ - 'spec/workers/incident_management/pager_duty/process_incident_worker_spec.rb'
+ - 'spec/workers/incident_management/process_alert_worker_v2_spec.rb'
+ - 'spec/workers/invalid_gpg_signature_update_worker_spec.rb'
+ - 'spec/workers/issue_placement_worker_spec.rb'
+ - 'spec/workers/issue_rebalancing_worker_spec.rb'
+ - 'spec/workers/issues/placement_worker_spec.rb'
+ - 'spec/workers/issues/rebalancing_worker_spec.rb'
+ - 'spec/workers/issues/reschedule_stuck_issue_rebalances_worker_spec.rb'
+ - 'spec/workers/jira_connect/forward_event_worker_spec.rb'
+ - 'spec/workers/jira_connect/sync_branch_worker_spec.rb'
+ - 'spec/workers/jira_connect/sync_merge_request_worker_spec.rb'
+ - 'spec/workers/jira_connect/sync_project_worker_spec.rb'
+ - 'spec/workers/loose_foreign_keys/cleanup_worker_spec.rb'
+ - 'spec/workers/members_destroyer/unassign_issuables_worker_spec.rb'
+ - 'spec/workers/merge_requests/create_pipeline_worker_spec.rb'
+ - 'spec/workers/merge_requests/update_head_pipeline_worker_spec.rb'
+ - 'spec/workers/new_issue_worker_spec.rb'
+ - 'spec/workers/new_merge_request_worker_spec.rb'
+ - 'spec/workers/packages/cleanup_package_file_worker_spec.rb'
+ - 'spec/workers/packages/cleanup_package_registry_worker_spec.rb'
+ - 'spec/workers/packages/composer/cache_update_worker_spec.rb'
+ - 'spec/workers/packages/go/sync_packages_worker_spec.rb'
+ - 'spec/workers/packages/maven/metadata/sync_worker_spec.rb'
+ - 'spec/workers/packages/nuget/extraction_worker_spec.rb'
+ - 'spec/workers/personal_access_tokens/expired_notification_worker_spec.rb'
+ - 'spec/workers/personal_access_tokens/expiring_worker_spec.rb'
+ - 'spec/workers/post_receive_spec.rb'
+ - 'spec/workers/projects/post_creation_worker_spec.rb'
+ - 'spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb'
+ - 'spec/workers/propagate_integration_inherit_descendant_worker_spec.rb'
+ - 'spec/workers/remove_expired_members_worker_spec.rb'
+ - 'spec/workers/repository_check/dispatch_worker_spec.rb'
+ - 'spec/workers/repository_fork_worker_spec.rb'
+ - 'spec/workers/run_pipeline_schedule_worker_spec.rb'
+ - 'spec/workers/service_desk_email_receiver_worker_spec.rb'
+ - 'spec/workers/stuck_merge_jobs_worker_spec.rb'
+ - 'spec/workers/todos_destroyer/confidential_issue_worker_spec.rb'
+ - 'spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb'
+ - 'spec/workers/users/deactivate_dormant_users_worker_spec.rb'
+ - 'spec/workers/web_hooks/destroy_worker_spec.rb'
+ - 'tooling/bin/find_changes'
+ - 'tooling/bin/qa/check_if_qa_only_spec_changes'
+ - 'tooling/danger/product_intelligence.rb'
+ - 'tooling/danger/project_helper.rb'
+ - 'tooling/danger/specs.rb'
+ - 'tooling/graphql/docs/helper.rb'
+ - 'tooling/lib/tooling/helm3_client.rb'
+ - 'tooling/lib/tooling/kubernetes_client.rb'
+ - 'tooling/merge_request_rspec_failure_rake_task.rb'
+ - 'tooling/quality/test_level.rb'
+ - 'tooling/rspec_flaky/listener.rb'
+ - 'tooling/rspec_flaky/report.rb'
diff --git a/.rubocop_todo/layout/multiline_operation_indentation.yml b/.rubocop_todo/layout/multiline_operation_indentation.yml
new file mode 100644
index 00000000000..0f2404ee3cc
--- /dev/null
+++ b/.rubocop_todo/layout/multiline_operation_indentation.yml
@@ -0,0 +1,106 @@
+---
+# Cop supports --auto-correct.
+Layout/MultilineOperationIndentation:
+ # Offense count: 252
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/projects/application_controller.rb'
+ - 'app/controllers/repositories/git_http_client_controller.rb'
+ - 'app/controllers/sent_notifications_controller.rb'
+ - 'app/graphql/types/ci/stage_type.rb'
+ - 'app/helpers/application_settings_helper.rb'
+ - 'app/helpers/auth_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/mirror_helper.rb'
+ - 'app/helpers/packages_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/storage_helper.rb'
+ - 'app/helpers/visibility_level_helper.rb'
+ - 'app/helpers/whats_new_helper.rb'
+ - 'app/models/concerns/admin_changed_password_notifier.rb'
+ - 'app/models/integrations/prometheus.rb'
+ - 'app/models/namespaces/traversal/linear_scopes.rb'
+ - 'app/models/packages/conan/metadatum.rb'
+ - 'app/models/packages/sem_ver.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_statistics.rb'
+ - 'app/models/user.rb'
+ - 'app/services/ci/create_downstream_pipeline_service.rb'
+ - 'app/services/ci/create_pipeline_service.rb'
+ - 'app/services/git/branch_hooks_service.rb'
+ - 'app/services/groups/group_links/create_service.rb'
+ - 'app/services/groups/transfer_service.rb'
+ - 'app/services/issues/update_service.rb'
+ - 'app/services/labels/promote_service.rb'
+ - 'app/services/labels/transfer_service.rb'
+ - 'app/services/projects/container_repository/cleanup_tags_service.rb'
+ - 'app/services/webauthn/authenticate_service.rb'
+ - 'app/validators/feature_flag_strategies_validator.rb'
+ - 'app/workers/container_expiration_policies/cleanup_container_repository_worker.rb'
+ - 'config/initializers/devise_dynamic_password_length_validation.rb'
+ - 'danger/utility_css/Dangerfile'
+ - 'ee/app/controllers/smartcard_controller.rb'
+ - 'ee/app/graphql/resolvers/boards/epic_lists_resolver.rb'
+ - 'ee/app/helpers/ee/application_settings_helper.rb'
+ - 'ee/app/helpers/ee/boards_helper.rb'
+ - 'ee/app/helpers/groups/security_features_helper.rb'
+ - 'ee/app/helpers/groups/sso_helper.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/namespace/root_storage_size.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/vulnerabilities/finding_signature.rb'
+ - 'ee/app/policies/ee/base_policy.rb'
+ - 'ee/app/services/analytics/cycle_analytics/value_streams/update_service.rb'
+ - 'ee/app/services/ee/merge_requests/build_service.rb'
+ - 'ee/app/services/ee/projects/operations/update_service.rb'
+ - 'ee/lib/ee/api/entities/group.rb'
+ - 'ee/lib/ee/api/helpers.rb'
+ - 'ee/lib/ee/gitlab/middleware/read_only/controller.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/issue_actions.rb'
+ - 'ee/lib/ee/sidebars/projects/menus/ci_cd_menu.rb'
+ - 'ee/lib/ee/sidebars/projects/menus/issues_menu.rb'
+ - 'ee/lib/elastic/latest/issue_class_proxy.rb'
+ - 'ee/lib/sidebars/groups/menus/analytics_menu.rb'
+ - 'ee/lib/sidebars/groups/menus/security_compliance_menu.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/dast_configuration_spec.rb'
+ - 'lib/api/maven_packages.rb'
+ - 'lib/api/users.rb'
+ - 'lib/api/validations/validators/array_none_any.rb'
+ - 'lib/gitlab/ci/reports/security/finding_key.rb'
+ - 'lib/gitlab/database/load_balancing/connection_proxy.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/elasticsearch/logs/lines.rb'
+ - 'lib/gitlab/form_builders/gitlab_ui_form_builder.rb'
+ - 'lib/gitlab/git_access.rb'
+ - 'lib/gitlab/gl_repository/repo_type.rb'
+ - 'lib/gitlab/jwt_token.rb'
+ - 'lib/gitlab/kubernetes/helm/v2/install_command.rb'
+ - 'lib/gitlab/kubernetes/helm/v2/patch_command.rb'
+ - 'lib/gitlab/kubernetes/helm/v3/install_command.rb'
+ - 'lib/gitlab/kubernetes/helm/v3/patch_command.rb'
+ - 'lib/gitlab/pagination/cursor_based_keyset.rb'
+ - 'lib/gitlab/quick_actions/issue_and_merge_request_actions.rb'
+ - 'lib/gitlab/rack_attack/request.rb'
+ - 'lib/gitlab/x509/signature.rb'
+ - 'lib/gitlab_edition.rb'
+ - 'lib/kramdown/converter/commonmark.rb'
+ - 'lib/sidebars/groups/menus/packages_registries_menu.rb'
+ - 'lib/sidebars/projects/menus/analytics_menu.rb'
+ - 'lib/sidebars/projects/menus/deployments_menu.rb'
+ - 'lib/sidebars/projects/menus/hidden_menu.rb'
+ - 'lib/sidebars/projects/menus/monitor_menu.rb'
+ - 'lib/sidebars/projects/menus/settings_menu.rb'
+ - 'qa/qa/ee/page/group/roadmap.rb'
+ - 'qa/qa/page/component/snippet.rb'
+ - 'qa/qa/runtime/api/repository_storage_moves.rb'
+ - 'rubocop/cop/gitlab/keys_first_and_values_first.rb'
+ - 'rubocop/cop/migration/hash_index.rb'
+ - 'rubocop/migration_helpers.rb'
+ - 'spec/frontend/fixtures/tabs.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/projects/import_export/export_service_spec.rb'
+ - 'spec/support/shared_examples/lib/gitlab/database/background_migration_job_shared_examples.rb'
+ - 'spec/support/shared_examples/models/with_debian_distributions_shared_examples.rb'
diff --git a/.rubocop_todo/layout/space_around_method_call_operator.yml b/.rubocop_todo/layout/space_around_method_call_operator.yml
new file mode 100644
index 00000000000..bc174a43d77
--- /dev/null
+++ b/.rubocop_todo/layout/space_around_method_call_operator.yml
@@ -0,0 +1,32 @@
+---
+# Cop supports --auto-correct.
+Layout/SpaceAroundMethodCallOperator:
+ # Offense count: 35
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/helpers/badges_helper.rb'
+ - 'app/services/google_cloud/create_service_accounts_service.rb'
+ - 'app/services/google_cloud/enable_cloud_run_service.rb'
+ - 'app/services/google_cloud/generate_pipeline_service.rb'
+ - 'ee/spec/lib/gitlab/ci/config/entry/dast_configuration_spec.rb'
+ - 'ee/spec/migrations/geo/set_resync_flag_for_retried_projects_spec.rb'
+ - 'ee/spec/models/approval_project_rule_spec.rb'
+ - 'ee/spec/models/integrations/github/status_message_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/move_service_spec.rb'
+ - 'ee/spec/services/ee/issues/create_service_spec.rb'
+ - 'ee/spec/services/geo/repository_base_sync_service_spec.rb'
+ - 'ee/spec/services/requirements_management/create_requirement_service_spec.rb'
+ - 'ee/spec/services/requirements_management/update_requirement_service_spec.rb'
+ - 'spec/graphql/types/base_field_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/command_spec.rb'
+ - 'spec/lib/gitlab/database/shared_model_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_spec.rb'
+ - 'spec/lib/gitlab/spamcheck/client_spec.rb'
+ - 'spec/migrations/20220128155251_remove_dangling_running_builds_spec.rb'
+ - 'spec/models/integrations/chat_message/issue_message_spec.rb'
+ - 'spec/models/milestone_spec.rb'
+ - 'spec/presenters/alert_management/alert_presenter_spec.rb'
+ - 'spec/requests/api/graphql/custom_emoji_query_spec.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
+ - 'spec/workers/concerns/limited_capacity/job_tracker_spec.rb'
diff --git a/.rubocop_todo/layout/space_in_lambda_literal.yml b/.rubocop_todo/layout/space_in_lambda_literal.yml
new file mode 100644
index 00000000000..7a2bd752b6e
--- /dev/null
+++ b/.rubocop_todo/layout/space_in_lambda_literal.yml
@@ -0,0 +1,402 @@
+---
+# Cop supports --auto-correct.
+Layout/SpaceInLambdaLiteral:
+ # Offense count: 986
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/concerns/issuable_actions.rb'
+ - 'app/controllers/projects/ci/daily_build_group_report_results_controller.rb'
+ - 'app/controllers/projects/merge_requests/diffs_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/finders/releases/group_releases_finder.rb'
+ - 'app/finders/user_recent_events_finder.rb'
+ - 'app/graphql/types/permission_types/base_permission_type.rb'
+ - 'app/models/abuse_report.rb'
+ - 'app/models/alert_management/alert.rb'
+ - 'app/models/alert_management/http_integration.rb'
+ - 'app/models/analytics/cycle_analytics/aggregation.rb'
+ - 'app/models/analytics/usage_trends/measurement.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/audit_event.rb'
+ - 'app/models/award_emoji.rb'
+ - 'app/models/board_group_recent_visit.rb'
+ - 'app/models/board_project_recent_visit.rb'
+ - 'app/models/bulk_import.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/bulk_imports/tracker.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/daily_build_group_report_result.rb'
+ - 'app/models/ci/group_variable.rb'
+ - 'app/models/ci/instance_variable.rb'
+ - 'app/models/ci/job_artifact.rb'
+ - 'app/models/ci/namespace_mirror.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/processable.rb'
+ - 'app/models/ci/project_mirror.rb'
+ - 'app/models/ci/resource.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/ci/unit_test.rb'
+ - 'app/models/ci/variable.rb'
+ - 'app/models/clusters/agent.rb'
+ - 'app/models/clusters/agent_token.rb'
+ - 'app/models/clusters/agents/activity_event.rb'
+ - 'app/models/clusters/applications/knative.rb'
+ - 'app/models/clusters/cluster.rb'
+ - 'app/models/clusters/kubernetes_namespace.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
+ - 'app/models/concerns/analytics/cycle_analytics/stage_event_model.rb'
+ - 'app/models/concerns/approvable_base.rb'
+ - 'app/models/concerns/ci/artifactable.rb'
+ - 'app/models/concerns/ci/has_status.rb'
+ - 'app/models/concerns/ci/has_variable.rb'
+ - 'app/models/concerns/has_environment_scope.rb'
+ - 'app/models/concerns/has_unique_internal_users.rb'
+ - 'app/models/concerns/id_in_ordered.rb'
+ - 'app/models/concerns/incident_management/escalatable.rb'
+ - 'app/models/concerns/mentionable.rb'
+ - 'app/models/concerns/milestoneable.rb'
+ - 'app/models/concerns/protected_ref_access.rb'
+ - 'app/models/concerns/reactive_caching.rb'
+ - 'app/models/concerns/shardable.rb'
+ - 'app/models/concerns/timebox.rb'
+ - 'app/models/custom_emoji.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/design_management/action.rb'
+ - 'app/models/design_management/design.rb'
+ - 'app/models/design_management/version.rb'
+ - 'app/models/diff_note.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/error_tracking/error.rb'
+ - 'app/models/event_collection.rb'
+ - 'app/models/external_pull_request.rb'
+ - 'app/models/group.rb'
+ - 'app/models/integration.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/models/internal_id.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/issue/metrics.rb'
+ - 'app/models/jira_connect_installation.rb'
+ - 'app/models/jira_connect_subscription.rb'
+ - 'app/models/jira_import_state.rb'
+ - 'app/models/key.rb'
+ - 'app/models/label.rb'
+ - 'app/models/label_link.rb'
+ - 'app/models/lfs_object.rb'
+ - 'app/models/lfs_objects_project.rb'
+ - 'app/models/loose_foreign_keys/deleted_record.rb'
+ - 'app/models/member.rb'
+ - 'app/models/members/group_member.rb'
+ - 'app/models/members/member_task.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/namespace_statistics.rb'
+ - 'app/models/note.rb'
+ - 'app/models/note_diff_file.rb'
+ - 'app/models/onboarding_progress.rb'
+ - 'app/models/operations/feature_flags/user_list.rb'
+ - 'app/models/packages/build_info.rb'
+ - 'app/models/packages/maven/metadatum.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/packages/tag.rb'
+ - 'app/models/pages_deployment.rb'
+ - 'app/models/personal_access_token.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_daily_statistic.rb'
+ - 'app/models/project_feature_usage.rb'
+ - 'app/models/project_group_link.rb'
+ - 'app/models/project_statistics.rb'
+ - 'app/models/projects/topic.rb'
+ - 'app/models/prometheus_alert.rb'
+ - 'app/models/prometheus_alert_event.rb'
+ - 'app/models/prometheus_metric.rb'
+ - 'app/models/protected_branch.rb'
+ - 'app/models/redirect_route.rb'
+ - 'app/models/release.rb'
+ - 'app/models/route.rb'
+ - 'app/models/service_desk_setting.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/snippet_input_action.rb'
+ - 'app/models/terraform/state.rb'
+ - 'app/models/timelog.rb'
+ - 'app/models/todo.rb'
+ - 'app/models/user.rb'
+ - 'app/models/user_highest_role.rb'
+ - 'app/models/users/in_product_marketing_email.rb'
+ - 'app/models/users_star_project.rb'
+ - 'app/models/zoom_meeting.rb'
+ - 'app/serializers/analytics/cycle_analytics/stage_entity.rb'
+ - 'app/serializers/base_discussion_entity.rb'
+ - 'app/serializers/blob_entity.rb'
+ - 'app/serializers/build_action_entity.rb'
+ - 'app/serializers/build_details_entity.rb'
+ - 'app/serializers/ci/dag_job_entity.rb'
+ - 'app/serializers/ci/job_entity.rb'
+ - 'app/serializers/ci/pipeline_entity.rb'
+ - 'app/serializers/ci/trigger_entity.rb'
+ - 'app/serializers/cluster_application_entity.rb'
+ - 'app/serializers/concerns/user_status_tooltip.rb'
+ - 'app/serializers/container_repository_entity.rb'
+ - 'app/serializers/container_tag_entity.rb'
+ - 'app/serializers/deploy_key_entity.rb'
+ - 'app/serializers/deployment_cluster_entity.rb'
+ - 'app/serializers/deployment_entity.rb'
+ - 'app/serializers/detailed_status_entity.rb'
+ - 'app/serializers/diff_file_base_entity.rb'
+ - 'app/serializers/diff_file_entity.rb'
+ - 'app/serializers/diffs_entity.rb'
+ - 'app/serializers/discussion_entity.rb'
+ - 'app/serializers/draft_note_entity.rb'
+ - 'app/serializers/environment_entity.rb'
+ - 'app/serializers/feature_flag_entity.rb'
+ - 'app/serializers/issue_board_entity.rb'
+ - 'app/serializers/issue_entity.rb'
+ - 'app/serializers/issue_sidebar_basic_entity.rb'
+ - 'app/serializers/label_entity.rb'
+ - 'app/serializers/member_entity.rb'
+ - 'app/serializers/member_user_entity.rb'
+ - 'app/serializers/merge_request_current_user_entity.rb'
+ - 'app/serializers/merge_request_noteable_entity.rb'
+ - 'app/serializers/merge_request_poll_cached_widget_entity.rb'
+ - 'app/serializers/merge_request_poll_widget_entity.rb'
+ - 'app/serializers/merge_request_widget_entity.rb'
+ - 'app/serializers/note_entity.rb'
+ - 'app/serializers/project_note_entity.rb'
+ - 'app/serializers/review_app_setup_entity.rb'
+ - 'app/serializers/rollout_status_entity.rb'
+ - 'app/serializers/runner_entity.rb'
+ - 'app/serializers/service_event_entity.rb'
+ - 'app/serializers/stage_entity.rb'
+ - 'app/serializers/test_case_entity.rb'
+ - 'app/serializers/test_suite_entity.rb'
+ - 'app/serializers/triggered_pipeline_entity.rb'
+ - 'app/services/ci/drop_pipeline_service.rb'
+ - 'app/services/ci/job_artifacts/expire_project_build_artifacts_service.rb'
+ - 'app/services/ci/register_job_service.rb'
+ - 'app/services/environments/auto_stop_service.rb'
+ - 'app/services/issues/export_csv_service.rb'
+ - 'app/services/issues/referenced_merge_requests_service.rb'
+ - 'app/services/jira_connect_subscriptions/create_service.rb'
+ - 'app/services/merge_requests/export_csv_service.rb'
+ - 'app/services/projects/fork_service.rb'
+ - 'app/services/resource_access_tokens/create_service.rb'
+ - 'app/workers/issues/reschedule_stuck_issue_rebalances_worker.rb'
+ - 'config/initializers/deprecations.rb'
+ - 'config/routes/project.rb'
+ - 'db/post_migrate/20210303121224_update_gitlab_subscriptions_start_at_post_eoa.rb'
+ - 'ee/app/controllers/groups/analytics/coverage_reports_controller.rb'
+ - 'ee/app/controllers/projects/on_demand_scans_controller.rb'
+ - 'ee/app/controllers/projects/security/dast_site_profiles_controller.rb'
+ - 'ee/app/models/analytics/devops_adoption/enabled_namespace.rb'
+ - 'ee/app/models/analytics/devops_adoption/snapshot.rb'
+ - 'ee/app/models/app_sec/fuzzing/coverage/corpus.rb'
+ - 'ee/app/models/approval_merge_request_rule.rb'
+ - 'ee/app/models/boards/epic_board_recent_visit.rb'
+ - 'ee/app/models/boards/epic_user_preference.rb'
+ - 'ee/app/models/ci/minutes/namespace_monthly_usage.rb'
+ - 'ee/app/models/ci/minutes/project_monthly_usage.rb'
+ - 'ee/app/models/concerns/approval_rule_like.rb'
+ - 'ee/app/models/concerns/ee/protected_ref.rb'
+ - 'ee/app/models/concerns/issue_widgets/acts_like_requirement.rb'
+ - 'ee/app/models/dast/profile.rb'
+ - 'ee/app/models/dast/profile_schedule.rb'
+ - 'ee/app/models/dast/site_profile_secret_variable.rb'
+ - 'ee/app/models/dast_scanner_profile.rb'
+ - 'ee/app/models/dast_site_profile.rb'
+ - 'ee/app/models/dast_site_validation.rb'
+ - 'ee/app/models/dora/daily_metrics.rb'
+ - 'ee/app/models/ee/audit_event.rb'
+ - 'ee/app/models/ee/ci/build.rb'
+ - 'ee/app/models/ee/ci/job_artifact.rb'
+ - 'ee/app/models/ee/environment.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/gpg_key.rb'
+ - 'ee/app/models/ee/group.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/list.rb'
+ - 'ee/app/models/ee/member.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/release.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/elasticsearch_indexed_namespace.rb'
+ - 'ee/app/models/geo_node.rb'
+ - 'ee/app/models/gitlab_subscription.rb'
+ - 'ee/app/models/incident_management/escalation_policy.rb'
+ - 'ee/app/models/incident_management/escalation_rule.rb'
+ - 'ee/app/models/incident_management/oncall_participant.rb'
+ - 'ee/app/models/incident_management/oncall_rotation.rb'
+ - 'ee/app/models/incident_management/oncall_schedule.rb'
+ - 'ee/app/models/incident_management/oncall_shift.rb'
+ - 'ee/app/models/iterations/cadence.rb'
+ - 'ee/app/models/merge_request_block.rb'
+ - 'ee/app/models/merge_requests/compliance_violation.rb'
+ - 'ee/app/models/merge_train.rb'
+ - 'ee/app/models/requirements_management/requirement.rb'
+ - 'ee/app/models/resource_iteration_event.rb'
+ - 'ee/app/models/saml_group_link.rb'
+ - 'ee/app/models/sca/license_compliance.rb'
+ - 'ee/app/models/security/finding.rb'
+ - 'ee/app/models/security/orchestration_policy_configuration.rb'
+ - 'ee/app/models/security/scan.rb'
+ - 'ee/app/models/security/training.rb'
+ - 'ee/app/models/security/training_provider.rb'
+ - 'ee/app/models/software_license.rb'
+ - 'ee/app/models/software_license_policy.rb'
+ - 'ee/app/models/vulnerabilities/external_issue_link.rb'
+ - 'ee/app/models/vulnerabilities/feedback.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/models/vulnerabilities/finding_link.rb'
+ - 'ee/app/models/vulnerabilities/finding_remediation.rb'
+ - 'ee/app/models/vulnerabilities/finding_signature.rb'
+ - 'ee/app/models/vulnerabilities/historical_statistic.rb'
+ - 'ee/app/models/vulnerabilities/identifier.rb'
+ - 'ee/app/models/vulnerabilities/issue_link.rb'
+ - 'ee/app/models/vulnerabilities/read.rb'
+ - 'ee/app/models/vulnerabilities/remediation.rb'
+ - 'ee/app/models/vulnerabilities/scanner.rb'
+ - 'ee/app/serializers/blocking_merge_request_entity.rb'
+ - 'ee/app/serializers/clusters/environment_entity.rb'
+ - 'ee/app/serializers/dashboard_operations_project_entity.rb'
+ - 'ee/app/serializers/ee/blob_entity.rb'
+ - 'ee/app/serializers/ee/build_detail_entity.rb'
+ - 'ee/app/serializers/ee/environment_entity.rb'
+ - 'ee/app/serializers/ee/evidences/release_entity.rb'
+ - 'ee/app/serializers/ee/issue_entity.rb'
+ - 'ee/app/serializers/ee/issue_sidebar_basic_entity.rb'
+ - 'ee/app/serializers/ee/issue_sidebar_extras_entity.rb'
+ - 'ee/app/serializers/ee/merge_request_poll_cached_widget_entity.rb'
+ - 'ee/app/serializers/ee/merge_request_poll_widget_entity.rb'
+ - 'ee/app/serializers/ee/merge_request_widget_entity.rb'
+ - 'ee/app/serializers/ee/note_entity.rb'
+ - 'ee/app/serializers/epic_base_entity.rb'
+ - 'ee/app/serializers/epic_entity.rb'
+ - 'ee/app/serializers/epic_note_entity.rb'
+ - 'ee/app/serializers/linked_epic_issue_entity.rb'
+ - 'ee/app/serializers/merge_request_compliance_entity.rb'
+ - 'ee/app/serializers/metrics_report_metric_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/feedback_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/finding_entity.rb'
+ - 'ee/app/serializers/vulnerability_note_entity.rb'
+ - 'ee/app/services/analytics/cycle_analytics/consistency_check_service.rb'
+ - 'ee/app/services/analytics/cycle_analytics/data_loader_service.rb'
+ - 'ee/app/services/audit_events/export_csv_service.rb'
+ - 'ee/app/services/ee/ci/register_job_service.rb'
+ - 'ee/app/services/groups/memberships/export_service.rb'
+ - 'ee/app/services/groups/seat_usage_export_service.rb'
+ - 'ee/app/services/historical_user_data/csv_service.rb'
+ - 'ee/app/services/merge_commits/export_csv_service.rb'
+ - 'ee/app/services/requirements_management/map_export_fields_service.rb'
+ - 'ee/app/services/user_permissions/export_service.rb'
+ - 'ee/app/services/vulnerability_exports/exporters/csv_service.rb'
+ - 'ee/app/workers/update_all_mirrors_worker.rb'
+ - 'ee/lib/api/entities/iteration.rb'
+ - 'ee/lib/api/entities/pending_member.rb'
+ - 'ee/lib/ee/api/entities/ci/job_request/response.rb'
+ - 'ee/lib/ee/api/entities/epic.rb'
+ - 'ee/lib/ee/api/entities/geo_node_status.rb'
+ - 'ee/lib/ee/api/entities/issue.rb'
+ - 'ee/lib/ee/api/entities/list.rb'
+ - 'ee/lib/ee/api/entities/member.rb'
+ - 'ee/lib/ee/api/entities/project_approval_rule.rb'
+ - 'ee/lib/ee/api/entities/user_basic.rb'
+ - 'ee/lib/ee/api/entities/vulnerability_issue_link.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_status_column_of_security_scans.rb'
+ - 'ee/lib/ee/gitlab/ci/config/entry/need.rb'
+ - 'ee/lib/ee/gitlab/event_store.rb'
+ - 'ee/lib/gitlab/ci/config/entry/vault/secret.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/security/locations/container_scanning_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approval_rules_spec.rb'
+ - 'lib/api/api.rb'
+ - 'lib/api/branches.rb'
+ - 'lib/api/entities/basic_project_details.rb'
+ - 'lib/api/entities/ci/job.rb'
+ - 'lib/api/entities/ci/job_basic.rb'
+ - 'lib/api/entities/ci/lint/result.rb'
+ - 'lib/api/entities/ci/reset_token_result.rb'
+ - 'lib/api/entities/ci/variable.rb'
+ - 'lib/api/entities/container_registry.rb'
+ - 'lib/api/entities/deploy_key.rb'
+ - 'lib/api/entities/environment.rb'
+ - 'lib/api/entities/event.rb'
+ - 'lib/api/entities/group.rb'
+ - 'lib/api/entities/invitation.rb'
+ - 'lib/api/entities/issue.rb'
+ - 'lib/api/entities/merge_request.rb'
+ - 'lib/api/entities/merge_request_basic.rb'
+ - 'lib/api/entities/milestone.rb'
+ - 'lib/api/entities/namespace.rb'
+ - 'lib/api/entities/project.rb'
+ - 'lib/api/entities/release.rb'
+ - 'lib/api/entities/todo.rb'
+ - 'lib/api/events.rb'
+ - 'lib/api/feature_flags_user_lists.rb'
+ - 'lib/api/files.rb'
+ - 'lib/api/helm_packages.rb'
+ - 'lib/api/helpers/caching.rb'
+ - 'lib/api/metrics/dashboard/annotations.rb'
+ - 'lib/api/releases.rb'
+ - 'lib/api/repositories.rb'
+ - 'lib/api/settings.rb'
+ - 'lib/api/tags.rb'
+ - 'lib/api/users.rb'
+ - 'lib/api/version.rb'
+ - 'lib/atlassian/jira_connect/serializers/author_entity.rb'
+ - 'lib/container_registry/base_client.rb'
+ - 'lib/container_registry/client.rb'
+ - 'lib/file_size_validator.rb'
+ - 'lib/gitlab/background_migration/backfill_artifact_expiry_date.rb'
+ - 'lib/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'lib/gitlab/background_migration/remove_all_trace_expiration_dates.rb'
+ - 'lib/gitlab/cache/helpers.rb'
+ - 'lib/gitlab/ci/config/entry/inherit/default.rb'
+ - 'lib/gitlab/ci/config/entry/inherit/variables.rb'
+ - 'lib/gitlab/ci/config/entry/key.rb'
+ - 'lib/gitlab/ci/config/entry/need.rb'
+ - 'lib/gitlab/ci/config/entry/policy.rb'
+ - 'lib/gitlab/ci/config/entry/product/parallel.rb'
+ - 'lib/gitlab/ci/config/entry/retry.rb'
+ - 'lib/gitlab/ci/config/entry/trigger.rb'
+ - 'lib/gitlab/database/background_migration_job.rb'
+ - 'lib/gitlab/email/handler/unsubscribe_handler.rb'
+ - 'lib/gitlab/gl_repository.rb'
+ - 'lib/gitlab/import_export/import_failure_service.rb'
+ - 'lib/gitlab/merge_requests/commit_message_generator.rb'
+ - 'lib/gitlab/metrics/dashboard/transformers/yml/v1/prometheus_metrics.rb'
+ - 'lib/gitlab/metrics/exporter/base_exporter.rb'
+ - 'lib/gitlab/visibility_level.rb'
+ - 'rubocop/cop/rspec/modify_sidekiq_middleware.rb'
+ - 'rubocop/cop/rspec/timecop_freeze.rb'
+ - 'rubocop/cop/rspec/timecop_travel.rb'
+ - 'spec/deprecation_toolkit_env.rb'
+ - 'spec/features/admin/users/user_spec.rb'
+ - 'spec/helpers/namespaces_helper_spec.rb'
+ - 'spec/lib/backup/gitaly_backup_spec.rb'
+ - 'spec/lib/container_registry/client_spec.rb'
+ - 'spec/lib/csv_builder_spec.rb'
+ - 'spec/lib/gitlab/batch_worker_context_spec.rb'
+ - 'spec/lib/gitlab/config/entry/simplifiable_spec.rb'
+ - 'spec/lib/gitlab/database/consistency_spec.rb'
+ - 'spec/lib/gitlab/event_store/store_spec.rb'
+ - 'spec/lib/gitlab/graphql/markdown_field_spec.rb'
+ - 'spec/lib/gitlab/middleware/handle_ip_spoof_attack_error_spec.rb'
+ - 'spec/lib/gitlab/middleware/request_context_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb'
+ - 'spec/lib/gitlab/query_limiting/middleware_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_signals_spec.rb'
+ - 'spec/lib/gitlab/utils/sanitize_node_link_spec.rb'
+ - 'spec/models/ability_spec.rb'
+ - 'spec/models/broadcast_message_spec.rb'
+ - 'spec/models/concerns/participable_spec.rb'
+ - 'spec/models/concerns/uniquify_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/support/shared_examples/lib/cache_helpers_shared_examples.rb'
+ - 'spec/workers/concerns/worker_context_spec.rb'
diff --git a/.rubocop_todo/layout/space_inside_block_braces.yml b/.rubocop_todo/layout/space_inside_block_braces.yml
new file mode 100644
index 00000000000..fc838ccadd8
--- /dev/null
+++ b/.rubocop_todo/layout/space_inside_block_braces.yml
@@ -0,0 +1,770 @@
+---
+# Cop supports --auto-correct.
+Layout/SpaceInsideBlockBraces:
+ # Offense count: 1508
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ EnforcedStyle: space
+ Exclude:
+ - 'app/controllers/groups/boards_controller.rb'
+ - 'app/controllers/profiles/two_factor_auths_controller.rb'
+ - 'app/controllers/projects/boards_controller.rb'
+ - 'app/experiments/security_reports_mr_widget_prompt_experiment.rb'
+ - 'app/experiments/video_tutorials_continuous_onboarding_experiment.rb'
+ - 'app/graphql/types/concerns/find_closest.rb'
+ - 'app/helpers/favicon_helper.rb'
+ - 'app/helpers/time_zone_helper.rb'
+ - 'app/helpers/todos_helper.rb'
+ - 'app/models/authentication_event.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/concerns/cache_markdown_field.rb'
+ - 'app/models/concerns/featurable.rb'
+ - 'app/models/integrations/bamboo.rb'
+ - 'app/models/integrations/buildkite.rb'
+ - 'app/models/integrations/teamcity.rb'
+ - 'app/models/network/graph.rb'
+ - 'app/models/operations/feature_flag.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/preloaders/labels_preloader.rb'
+ - 'app/models/project.rb'
+ - 'app/models/release.rb'
+ - 'app/models/release_highlight.rb'
+ - 'app/services/authorized_project_update/project_recalculate_service.rb'
+ - 'app/services/notification_service.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb'
+ - 'db/post_migrate/20210802043253_finalize_push_event_payloads_bigint_conversion_3.rb'
+ - 'ee/app/finders/security/training_providers/base_url_finder.rb'
+ - 'ee/app/graphql/mutations/incident_management/oncall_rotation/base.rb'
+ - 'ee/app/helpers/ee/dashboard_helper.rb'
+ - 'ee/app/models/approvals/scan_finding_wrapped_rule_set.rb'
+ - 'ee/app/models/compliance_management/framework.rb'
+ - 'ee/app/models/dora/daily_metrics.rb'
+ - 'ee/app/models/ee/application_setting.rb'
+ - 'ee/app/models/ee/member.rb'
+ - 'ee/app/models/vulnerabilities/identifier.rb'
+ - 'ee/app/serializers/vulnerabilities/finding_entity.rb'
+ - 'ee/app/services/elastic/cluster_reindexing_service.rb'
+ - 'ee/lib/ee/banzai/filter/references/iteration_reference_filter.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/group.rb'
+ - 'ee/lib/ee/gitlab/background_migration/drop_invalid_remediations.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/gitlab/auth/smartcard/san_extension.rb'
+ - 'ee/lib/pseudonymizer/dumper.rb'
+ - 'ee/lib/world.rb'
+ - 'ee/spec/controllers/autocomplete_controller_spec.rb'
+ - 'ee/spec/controllers/countries_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epics_controller_spec.rb'
+ - 'ee/spec/controllers/projects/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'ee/spec/controllers/subscriptions_controller_spec.rb'
+ - 'ee/spec/elastic_integration/global_search_spec.rb'
+ - 'ee/spec/factories/dast/profiles_pipelines.rb'
+ - 'ee/spec/factories/licenses.rb'
+ - 'ee/spec/features/billings/billing_plans_spec.rb'
+ - 'ee/spec/features/boards/board_filters_spec.rb'
+ - 'ee/spec/features/boards/scoped_issue_board_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_filtering_spec.rb'
+ - 'ee/spec/features/epics/todo_spec.rb'
+ - 'ee/spec/features/google_analytics_datalayer_spec.rb'
+ - 'ee/spec/features/groups/issues_spec.rb'
+ - 'ee/spec/features/issues/filtered_search/filter_issues_by_iteration_spec.rb'
+ - 'ee/spec/features/issues/form_spec.rb'
+ - 'ee/spec/features/issues/issue_sidebar_spec.rb'
+ - 'ee/spec/features/issues/user_edits_issue_spec.rb'
+ - 'ee/spec/features/merge_request/user_edits_multiple_reviewers_mr_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_closing_issues_message_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/projects/integrations/user_activates_github_spec.rb'
+ - 'ee/spec/features/projects/push_rules_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/settings/ee/service_desk_setting_spec.rb'
+ - 'ee/spec/finders/billed_users_finder_spec.rb'
+ - 'ee/spec/finders/clusters/environments_finder_spec.rb'
+ - 'ee/spec/finders/dast/profiles_finder_spec.rb'
+ - 'ee/spec/finders/ee/namespaces/projects_finder_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/training_providers/kontra_url_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerability_reads_finder_spec.rb'
+ - 'ee/spec/finders/status_page/incidents_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/epic.rb'
+ - 'ee/spec/frontend/fixtures/projects.rb'
+ - 'ee/spec/graphql/ee/resolvers/namespace_projects_resolver_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epics/create_spec.rb'
+ - 'ee/spec/graphql/mutations/compliance_management/frameworks/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_validations/revoke_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/create_spec.rb'
+ - 'ee/spec/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/graphql/mutations/vulnerabilities/destroy_external_issue_link_spec.rb'
+ - 'ee/spec/graphql/resolvers/iterations_resolver_spec.rb'
+ - 'ee/spec/helpers/ee/projects/pipeline_helper_spec.rb'
+ - 'ee/spec/helpers/ee/projects/security/dast_configuration_helper_spec.rb'
+ - 'ee/spec/helpers/ee/registrations_helper_spec.rb'
+ - 'ee/spec/helpers/ee/trial_helper_spec.rb'
+ - 'ee/spec/helpers/projects/on_demand_scans_helper_spec.rb'
+ - 'ee/spec/lib/analytics/group_activity_calculator_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/alert_management/payload/generic_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/drop_invalid_remediations_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_job_artifact_registry_to_ssf_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/reports/security/reports_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/groups/menus/issues_menu_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/groups/menus/settings_menu_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/projects/menus/ci_cd_menu_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/projects/menus/issues_menu_spec.rb'
+ - 'ee/spec/lib/ee/sidebars/projects/menus/repository_menu_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/gma_membership_enforcer_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/otp/session_enforcer_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/container_scanning_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/license_scanning/dependency_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/security/finding_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dependency_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/git_ssh_proxy_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/repository_renamed_event_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/loaders/bulk_epic_aggregate_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/ip_address_state_spec.rb'
+ - 'ee/spec/lib/gitlab/search_context/builder_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/filter/image_filter_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/approval_project_rules_with_user_metric_spec.rb'
+ - 'ee/spec/lib/pseudonymizer/pager_spec.rb'
+ - 'ee/spec/lib/pseudonymizer/uploader_spec.rb'
+ - 'ee/spec/mailers/credentials_inventory_mailer_spec.rb'
+ - 'ee/spec/migrations/geo/migrate_job_artifact_registry_spec.rb'
+ - 'ee/spec/models/analytics/devops_adoption/enabled_namespace_spec.rb'
+ - 'ee/spec/models/analytics/devops_adoption/snapshot_spec.rb'
+ - 'ee/spec/models/approval_project_rule_spec.rb'
+ - 'ee/spec/models/approval_state_spec.rb'
+ - 'ee/spec/models/approvals/scan_finding_wrapped_rule_set_spec.rb'
+ - 'ee/spec/models/ci/minutes/limit_spec.rb'
+ - 'ee/spec/models/compliance_management/framework_spec.rb'
+ - 'ee/spec/models/concerns/ee/clusters/agents/authorization_config_scopes_spec.rb'
+ - 'ee/spec/models/concerns/elastic/issue_spec.rb'
+ - 'ee/spec/models/dast/profile_schedule_spec.rb'
+ - 'ee/spec/models/ee/audit_event_spec.rb'
+ - 'ee/spec/models/ee/ci/build_dependencies_spec.rb'
+ - 'ee/spec/models/ee/iteration_spec.rb'
+ - 'ee/spec/models/ee/namespace/root_storage_size_spec.rb'
+ - 'ee/spec/models/ee/namespace_limit_spec.rb'
+ - 'ee/spec/models/environment_spec.rb'
+ - 'ee/spec/models/epic_spec.rb'
+ - 'ee/spec/models/gitlab/seat_link_data_spec.rb'
+ - 'ee/spec/models/gitlab_subscription_spec.rb'
+ - 'ee/spec/models/member_spec.rb'
+ - 'ee/spec/models/milestone_release_spec.rb'
+ - 'ee/spec/models/project_member_spec.rb'
+ - 'ee/spec/models/protected_environment_spec.rb'
+ - 'ee/spec/models/push_rule_spec.rb'
+ - 'ee/spec/models/requirements_management/test_report_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_rule_schedule_spec.rb'
+ - 'ee/spec/models/vulnerabilities/feedback_spec.rb'
+ - 'ee/spec/models/vulnerabilities/finding_spec.rb'
+ - 'ee/spec/presenters/epic_issue_presenter_spec.rb'
+ - 'ee/spec/requests/api/analytics/code_review_analytics_spec.rb'
+ - 'ee/spec/requests/api/analytics/group_activity_analytics_spec.rb'
+ - 'ee/spec/requests/api/ci/minutes_spec.rb'
+ - 'ee/spec/requests/api/epic_links_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/board_lists_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_aggregate_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/group_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/iteration_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_site_validations/revoke_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epic_tree/reorder_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_profiles_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_site_validations_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/projects/compliance_frameworks_spec.rb'
+ - 'ee/spec/requests/api/group_variables_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/managed_licenses_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/requests/api/projects_spec.rb'
+ - 'ee/spec/requests/api/protected_branches_spec.rb'
+ - 'ee/spec/requests/api/releases_spec.rb'
+ - 'ee/spec/requests/groups/contribution_analytics_spec.rb'
+ - 'ee/spec/requests/lfs_http_spec.rb'
+ - 'ee/spec/requests/projects/security/policies_controller_spec.rb'
+ - 'ee/spec/requests/survey_responses_controller_spec.rb'
+ - 'ee/spec/serializers/member_user_entity_spec.rb'
+ - 'ee/spec/serializers/merge_request_poll_widget_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/finding_reports_comparer_entity_spec.rb'
+ - 'ee/spec/services/audit_events/register_runner_audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/unregister_runner_audit_event_service_spec.rb'
+ - 'ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb'
+ - 'ee/spec/services/auto_merge/merge_train_service_spec.rb'
+ - 'ee/spec/services/ci/runners/register_runner_service_spec.rb'
+ - 'ee/spec/services/ee/design_management/delete_designs_service_spec.rb'
+ - 'ee/spec/services/ee/design_management/save_designs_service_spec.rb'
+ - 'ee/spec/services/ee/issuable/bulk_update_service_spec.rb'
+ - 'ee/spec/services/ee/notes/quick_actions_service_spec.rb'
+ - 'ee/spec/services/ee/notification_service_spec.rb'
+ - 'ee/spec/services/ee/vulnerability_feedback_module/update_service_spec.rb'
+ - 'ee/spec/services/epic_issues/create_service_spec.rb'
+ - 'ee/spec/services/epics/create_service_spec.rb'
+ - 'ee/spec/services/epics/descendant_count_service_spec.rb'
+ - 'ee/spec/services/epics/transfer_service_spec.rb'
+ - 'ee/spec/services/geo/container_repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/framework_repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb'
+ - 'ee/spec/services/geo/repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/wiki_sync_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/activate_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/apply_trial_service_spec.rb'
+ - 'ee/spec/services/group_saml/sign_up_service_spec.rb'
+ - 'ee/spec/services/groups/epics_count_service_spec.rb'
+ - 'ee/spec/services/groups/memberships/export_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/create_iterations_in_advance_service_spec.rb'
+ - 'ee/spec/services/merge_trains/check_status_service_spec.rb'
+ - 'ee/spec/services/personal_access_tokens/groups/update_lifetime_service_spec.rb'
+ - 'ee/spec/services/projects/destroy_service_spec.rb'
+ - 'ee/spec/services/projects/update_mirror_service_spec.rb'
+ - 'ee/spec/services/quick_actions/interpret_service_spec.rb'
+ - 'ee/spec/services/requirements_management/create_requirement_service_spec.rb'
+ - 'ee/spec/services/requirements_management/update_requirement_service_spec.rb'
+ - 'ee/spec/services/resource_access_tokens/create_service_spec.rb'
+ - 'ee/spec/services/search/group_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_findings_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/policy_commit_service_spec.rb'
+ - 'ee/spec/services/sitemap/create_service_spec.rb'
+ - 'ee/spec/services/software_license_policies/update_service_spec.rb'
+ - 'ee/spec/services/status_page/publish_attachments_service_spec.rb'
+ - 'ee/spec/services/system_notes/epics_service_spec.rb'
+ - 'ee/spec/services/vulnerability_external_issue_links/create_service_spec.rb'
+ - 'ee/spec/services/vulnerability_feedback/destroy_service_spec.rb'
+ - 'ee/spec/support/shared_examples/features/ultimate_trial_callout_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/api/project_approval_rules_api_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/boards/base_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/search_notes_shared_examples.rb'
+ - 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
+ - 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
+ - 'ee/spec/views/registrations/groups_projects/new.html.haml_spec.rb'
+ - 'ee/spec/views/shared/billings/_eoa_bronze_plan_banner.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/_expiry_date.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/personal_access_tokens/_personal_access_token.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/ssh_keys/_ssh_key.html.haml_spec.rb'
+ - 'ee/spec/workers/adjourned_project_deletion_worker_spec.rb'
+ - 'ee/spec/workers/adjourned_projects_deletion_cron_worker_spec.rb'
+ - 'ee/spec/workers/security/create_orchestration_policy_worker_spec.rb'
+ - 'ee/spec/workers/security/orchestration_policy_rule_schedule_worker_spec.rb'
+ - 'lib/api/commits.rb'
+ - 'lib/api/helpers/merge_requests_helpers.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/banzai/filter/references/label_reference_filter.rb'
+ - 'lib/banzai/filter/references/milestone_reference_filter.rb'
+ - 'lib/bitbucket/representation/base.rb'
+ - 'lib/bitbucket_server/representation/base.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb'
+ - 'lib/gitlab/contributions_calendar.rb'
+ - 'lib/gitlab/database/migrations/test_background_runner.rb'
+ - 'lib/gitlab/database/postgres_hll/buckets.rb'
+ - 'lib/gitlab/elasticsearch/logs/lines.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
+ - 'lib/gitlab/issues/rebalancing/state.rb'
+ - 'lib/gitlab/profiler.rb'
+ - 'lib/kramdown/converter/commonmark.rb'
+ - 'lib/release_highlights/validator/entry.rb'
+ - 'lib/security/ci_configuration/sast_build_action.rb'
+ - 'lib/tasks/gitlab/db.rake'
+ - 'lib/tasks/gitlab/info.rake'
+ - 'lib/tasks/gitlab/praefect.rake'
+ - 'lib/tasks/gitlab/shell.rake'
+ - 'lib/tasks/gitlab/tw/codeowners.rake'
+ - 'qa/qa/service/praefect_manager.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/project_access_token_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/geo_replication_npm_registry_spec.rb'
+ - 'qa/spec/scenario/test/integration/mattermost_spec.rb'
+ - 'qa/spec/support/page_error_checker_spec.rb'
+ - 'rubocop/cop/migration/add_limit_to_text_columns.rb'
+ - 'spec/config/settings_spec.rb'
+ - 'spec/controllers/admin/application_settings_controller_spec.rb'
+ - 'spec/controllers/application_controller_spec.rb'
+ - 'spec/controllers/groups/labels_controller_spec.rb'
+ - 'spec/controllers/groups/releases_controller_spec.rb'
+ - 'spec/controllers/groups/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/import/manifest_controller_spec.rb'
+ - 'spec/controllers/projects/blame_controller_spec.rb'
+ - 'spec/controllers/projects/deploy_keys_controller_spec.rb'
+ - 'spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_controller_spec.rb'
+ - 'spec/controllers/projects/jobs_controller_spec.rb'
+ - 'spec/controllers/projects/labels_controller_spec.rb'
+ - 'spec/controllers/projects/notes_controller_spec.rb'
+ - 'spec/controllers/projects/releases_controller_spec.rb'
+ - 'spec/controllers/projects/tree_controller_spec.rb'
+ - 'spec/controllers/registrations/welcome_controller_spec.rb'
+ - 'spec/controllers/snippets/notes_controller_spec.rb'
+ - 'spec/dependencies/omniauth_saml_spec.rb'
+ - 'spec/experiments/application_experiment_spec.rb'
+ - 'spec/factories/ci/build_trace_chunks.rb'
+ - 'spec/factories/ci/job_artifacts.rb'
+ - 'spec/factories/ci/pipeline_artifacts.rb'
+ - 'spec/factories/commit_statuses.rb'
+ - 'spec/factories/emails.rb'
+ - 'spec/factories/external_pull_requests.rb'
+ - 'spec/factories/gitlab/database/postgres_index.rb'
+ - 'spec/factories/packages/dependencies.rb'
+ - 'spec/factories/packages/package_tags.rb'
+ - 'spec/factories/packages/packages.rb'
+ - 'spec/factories/prometheus_alert.rb'
+ - 'spec/factories/prometheus_metrics.rb'
+ - 'spec/features/admin/admin_mode/login_spec.rb'
+ - 'spec/features/admin/users/users_spec.rb'
+ - 'spec/features/boards/board_filters_spec.rb'
+ - 'spec/features/boards/reload_boards_on_browser_back_spec.rb'
+ - 'spec/features/dashboard/archived_projects_spec.rb'
+ - 'spec/features/error_tracking/user_filters_errors_by_status_spec.rb'
+ - 'spec/features/groups/issues_spec.rb'
+ - 'spec/features/groups_spec.rb'
+ - 'spec/features/issuables/user_sees_sidebar_spec.rb'
+ - 'spec/features/issues/gfm_autocomplete_spec.rb'
+ - 'spec/features/issues/todo_spec.rb'
+ - 'spec/features/issues/user_bulk_edits_issues_spec.rb'
+ - 'spec/features/issues/user_interacts_with_awards_spec.rb'
+ - 'spec/features/issues/user_uses_quick_actions_spec.rb'
+ - 'spec/features/merge_request/user_approves_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_sees_closing_issues_message_spec.rb'
+ - 'spec/features/merge_request/user_sees_deployment_widget_spec.rb'
+ - 'spec/features/merge_request/user_sees_diff_spec.rb'
+ - 'spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb'
+ - 'spec/features/merge_request/user_sees_versions_spec.rb'
+ - 'spec/features/merge_request/user_uses_quick_actions_spec.rb'
+ - 'spec/features/profiles/user_edit_profile_spec.rb'
+ - 'spec/features/projects/cluster_agents_spec.rb'
+ - 'spec/features/projects/commits/user_browses_commits_spec.rb'
+ - 'spec/features/projects/environments/environment_spec.rb'
+ - 'spec/features/projects/files/user_browses_files_spec.rb'
+ - 'spec/features/projects/pipelines/pipelines_spec.rb'
+ - 'spec/features/projects/settings/service_desk_setting_spec.rb'
+ - 'spec/features/projects/tree/tree_show_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/files/user_browses_files_spec.rb'
+ - 'spec/features/users/login_spec.rb'
+ - 'spec/finders/ci/jobs_finder_spec.rb'
+ - 'spec/finders/ci/runners_finder_spec.rb'
+ - 'spec/finders/concerns/packages/finder_helper_spec.rb'
+ - 'spec/finders/container_repositories_finder_spec.rb'
+ - 'spec/finders/design_management/versions_finder_spec.rb'
+ - 'spec/finders/milestones_finder_spec.rb'
+ - 'spec/finders/packages/group_packages_finder_spec.rb'
+ - 'spec/finders/packages/npm/package_finder_spec.rb'
+ - 'spec/finders/projects_finder_spec.rb'
+ - 'spec/frontend/fixtures/api_merge_requests.rb'
+ - 'spec/frontend/fixtures/api_projects.rb'
+ - 'spec/frontend/fixtures/application_settings.rb'
+ - 'spec/frontend/fixtures/blob.rb'
+ - 'spec/frontend/fixtures/branches.rb'
+ - 'spec/frontend/fixtures/clusters.rb'
+ - 'spec/frontend/fixtures/deploy_keys.rb'
+ - 'spec/frontend/fixtures/groups.rb'
+ - 'spec/frontend/fixtures/issues.rb'
+ - 'spec/frontend/fixtures/jobs.rb'
+ - 'spec/frontend/fixtures/labels.rb'
+ - 'spec/frontend/fixtures/merge_requests.rb'
+ - 'spec/frontend/fixtures/merge_requests_diffs.rb'
+ - 'spec/frontend/fixtures/metrics_dashboard.rb'
+ - 'spec/frontend/fixtures/pipeline_schedules.rb'
+ - 'spec/frontend/fixtures/pipelines.rb'
+ - 'spec/frontend/fixtures/projects.rb'
+ - 'spec/frontend/fixtures/prometheus_service.rb'
+ - 'spec/frontend/fixtures/raw.rb'
+ - 'spec/frontend/fixtures/services.rb'
+ - 'spec/frontend/fixtures/snippet.rb'
+ - 'spec/frontend/fixtures/todos.rb'
+ - 'spec/graphql/mutations/merge_requests/set_labels_spec.rb'
+ - 'spec/graphql/mutations/releases/create_spec.rb'
+ - 'spec/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/graphql/mutations/releases/update_spec.rb'
+ - 'spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_jobs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/projects/grafana_integration_resolver_spec.rb'
+ - 'spec/graphql/resolvers/projects_resolver_spec.rb'
+ - 'spec/graphql/types/ci/job_token_scope_type_spec.rb'
+ - 'spec/graphql/types/issue_type_spec.rb'
+ - 'spec/graphql/types/user_type_spec.rb'
+ - 'spec/helpers/application_settings_helper_spec.rb'
+ - 'spec/helpers/blob_helper_spec.rb'
+ - 'spec/helpers/gitlab_script_tag_helper_spec.rb'
+ - 'spec/helpers/issuables_helper_spec.rb'
+ - 'spec/helpers/projects/pipeline_helper_spec.rb'
+ - 'spec/helpers/routing/pseudonymization_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/helpers/wiki_page_version_helper_spec.rb'
+ - 'spec/initializers/carrierwave_patch_spec.rb'
+ - 'spec/initializers/trusted_proxies_spec.rb'
+ - 'spec/lib/api/entities/ci/job_request/image_spec.rb'
+ - 'spec/lib/api/entities/ci/job_request/port_spec.rb'
+ - 'spec/lib/api/helpers/sse_helpers_spec.rb'
+ - 'spec/lib/api/helpers_spec.rb'
+ - 'spec/lib/banzai/cross_project_reference_spec.rb'
+ - 'spec/lib/banzai/filter/broadcast_message_placeholders_filter_spec.rb'
+ - 'spec/lib/banzai/filter/commit_trailers_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb'
+ - 'spec/lib/banzai/renderer_spec.rb'
+ - 'spec/lib/bitbucket_server/connection_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/lfs_objects_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/uploads_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/snippets_repository_pipeline_spec.rb'
+ - 'spec/lib/feature/definition_spec.rb'
+ - 'spec/lib/feature_spec.rb'
+ - 'spec/lib/gitlab/application_context_spec.rb'
+ - 'spec/lib/gitlab/asciidoc_spec.rb'
+ - 'spec/lib/gitlab/audit/ci_runner_token_author_spec.rb'
+ - 'spec/lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans_spec.rb'
+ - 'spec/lib/gitlab/batch_pop_queueing_spec.rb'
+ - 'spec/lib/gitlab/chat_name_token_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2html_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json_spec.rb'
+ - 'spec/lib/gitlab/ci/build/prerequisite/kubernetes_namespace_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/processable_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/release_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/tags_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/base_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/local_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/remote_spec.rb'
+ - 'spec/lib/gitlab/ci/config/normalizer_spec.rb'
+ - 'spec/lib/gitlab/ci/cron_parser_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/seed_block_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/reports_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/test_suite_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/canceled_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/created_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/manual_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/pending_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/skipped_spec.rb'
+ - 'spec/lib/gitlab/ci/status/processable/waiting_for_resource_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/remote_checksum_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/composer/cache_spec.rb'
+ - 'spec/lib/gitlab/data_builder/build_spec.rb'
+ - 'spec/lib/gitlab/data_builder/pipeline_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/v2_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/lock_retry_mixin_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/runner_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb'
+ - 'spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb'
+ - 'spec/lib/gitlab/database/with_lock_retries_spec.rb'
+ - 'spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb'
+ - 'spec/lib/gitlab/database_spec.rb'
+ - 'spec/lib/gitlab/elasticsearch/logs/lines_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/create_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/team_short_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/team_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/trial_short_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/trial_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/verify_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb'
+ - 'spec/lib/gitlab/exclusive_lease_helpers_spec.rb'
+ - 'spec/lib/gitlab/file_markdown_link_builder_spec.rb'
+ - 'spec/lib/gitlab/git/blob_spec.rb'
+ - 'spec/lib/gitlab/git/commit_spec.rb'
+ - 'spec/lib/gitlab/git/diff_collection_spec.rb'
+ - 'spec/lib/gitlab/git/raw_diff_change_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git/rugged_impl/use_rugged_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/commit_service_spec.rb'
+ - 'spec/lib/gitlab/github_import/client_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb'
+ - 'spec/lib/gitlab/gpg_spec.rb'
+ - 'spec/lib/gitlab/graphql/markdown_field_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb'
+ - 'spec/lib/gitlab/graphs/commits_spec.rb'
+ - 'spec/lib/gitlab/highlight_spec.rb'
+ - 'spec/lib/gitlab/import_export/import_test_coverage_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/ndjson_writer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/version_checker_spec.rb'
+ - 'spec/lib/gitlab/jira/dvcs_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/rollout_status_spec.rb'
+ - 'spec/lib/gitlab/metrics/background_transaction_spec.rb'
+ - 'spec/lib/gitlab/metrics/web_transaction_spec.rb'
+ - 'spec/lib/gitlab/middleware/compressed_json_spec.rb'
+ - 'spec/lib/gitlab/middleware/sidekiq_web_static_spec.rb'
+ - 'spec/lib/gitlab/otp_key_rotator_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/conduit/response_spec.rb'
+ - 'spec/lib/gitlab/prometheus_client_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/command_definition_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/extractor_spec.rb'
+ - 'spec/lib/gitlab/rack_attack/instrumented_cache_store_spec.rb'
+ - 'spec/lib/gitlab/rack_attack/user_allowlist_spec.rb'
+ - 'spec/lib/gitlab/redis/hll_spec.rb'
+ - 'spec/lib/gitlab/reference_counter_spec.rb'
+ - 'spec/lib/gitlab/regex_spec.rb'
+ - 'spec/lib/gitlab/search/abuse_detection_spec.rb'
+ - 'spec/lib/gitlab/search_context/builder_spec.rb'
+ - 'spec/lib/gitlab/session_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb'
+ - 'spec/lib/gitlab/spamcheck/client_spec.rb'
+ - 'spec/lib/gitlab/suggestions/file_suggestion_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/name_suggestion_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb'
+ - 'spec/lib/gitlab/utils/sanitize_node_link_spec.rb'
+ - 'spec/lib/gitlab/utils/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/verify/uploads_spec.rb'
+ - 'spec/lib/gitlab/version_info_spec.rb'
+ - 'spec/lib/json_web_token/rsa_token_spec.rb'
+ - 'spec/lib/marginalia_spec.rb'
+ - 'spec/lib/mattermost/session_spec.rb'
+ - 'spec/lib/microsoft_teams/notifier_spec.rb'
+ - 'spec/lib/sidebars/groups/menus/group_information_menu_spec.rb'
+ - 'spec/lib/sidebars/menu_spec.rb'
+ - 'spec/mailers/emails/service_desk_spec.rb'
+ - 'spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb'
+ - 'spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb'
+ - 'spec/migrations/confirm_support_bot_user_spec.rb'
+ - 'spec/migrations/reset_job_token_scope_enabled_again_spec.rb'
+ - 'spec/migrations/reset_job_token_scope_enabled_spec.rb'
+ - 'spec/migrations/reset_severity_levels_to_new_default_spec.rb'
+ - 'spec/migrations/schedule_copy_ci_builds_columns_to_security_scans2_spec.rb'
+ - 'spec/models/active_session_spec.rb'
+ - 'spec/models/aws/role_spec.rb'
+ - 'spec/models/ci/build_dependencies_spec.rb'
+ - 'spec/models/ci/build_runner_session_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/daily_build_group_report_result_spec.rb'
+ - 'spec/models/ci/job_artifact_spec.rb'
+ - 'spec/models/ci/pipeline_schedule_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/clusters/applications/elastic_stack_spec.rb'
+ - 'spec/models/clusters/cluster_spec.rb'
+ - 'spec/models/commit_status_spec.rb'
+ - 'spec/models/concerns/chronic_duration_attribute_spec.rb'
+ - 'spec/models/concerns/counter_attribute_spec.rb'
+ - 'spec/models/concerns/nullify_if_blank_spec.rb'
+ - 'spec/models/concerns/reactive_caching_spec.rb'
+ - 'spec/models/concerns/token_authenticatable_spec.rb'
+ - 'spec/models/container_expiration_policy_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/hooks/web_hook_log_spec.rb'
+ - 'spec/models/integrations/chat_message/wiki_page_message_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/jira_import_state_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/namespace/root_storage_statistics_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/onboarding_progress_spec.rb'
+ - 'spec/models/packages/conan/metadatum_spec.rb'
+ - 'spec/models/packages/package_file_spec.rb'
+ - 'spec/models/packages/package_spec.rb'
+ - 'spec/models/postgresql/replication_slot_spec.rb'
+ - 'spec/models/preloaders/labels_preloader_spec.rb'
+ - 'spec/models/preloaders/user_max_access_level_in_groups_preloader_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/release_spec.rb'
+ - 'spec/models/releases/link_spec.rb'
+ - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/snippet_input_action_collection_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/users/calloutable_spec.rb'
+ - 'spec/models/wiki_page/meta_spec.rb'
+ - 'spec/policies/clusters/agent_policy_spec.rb'
+ - 'spec/policies/group_member_policy_spec.rb'
+ - 'spec/policies/issue_policy_spec.rb'
+ - 'spec/policies/project_policy_spec.rb'
+ - 'spec/policies/terraform/state_policy_spec.rb'
+ - 'spec/policies/terraform/state_version_policy_spec.rb'
+ - 'spec/presenters/packages/composer/packages_presenter_spec.rb'
+ - 'spec/presenters/packages/conan/package_presenter_spec.rb'
+ - 'spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb'
+ - 'spec/presenters/packages/pypi/package_presenter_spec.rb'
+ - 'spec/presenters/project_presenter_spec.rb'
+ - 'spec/requests/api/branches_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_trace_spec.rb'
+ - 'spec/requests/api/ci/secure_files_spec.rb'
+ - 'spec/requests/api/ci/triggers_spec.rb'
+ - 'spec/requests/api/ci/variables_spec.rb'
+ - 'spec/requests/api/commits_spec.rb'
+ - 'spec/requests/api/conan_instance_packages_spec.rb'
+ - 'spec/requests/api/conan_project_packages_spec.rb'
+ - 'spec/requests/api/dependency_proxy_spec.rb'
+ - 'spec/requests/api/go_proxy_spec.rb'
+ - 'spec/requests/api/graphql/boards/board_list_issues_query_spec.rb'
+ - 'spec/requests/api/graphql/boards/board_lists_query_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/add_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/create_spec.rb'
+ - 'spec/requests/api/graphql/namespace/root_storage_statistics_spec.rb'
+ - 'spec/requests/api/graphql/packages/conan_spec.rb'
+ - 'spec/requests/api/graphql/packages/helm_spec.rb'
+ - 'spec/requests/api/graphql/packages/package_spec.rb'
+ - 'spec/requests/api/graphql/project/base_service_spec.rb'
+ - 'spec/requests/api/graphql/project/jira_import_spec.rb'
+ - 'spec/requests/api/group_variables_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/helpers_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/markdown_spec.rb'
+ - 'spec/requests/api/maven_packages_spec.rb'
+ - 'spec/requests/api/metrics/dashboard/annotations_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/npm_project_packages_spec.rb'
+ - 'spec/requests/api/nuget_group_packages_spec.rb'
+ - 'spec/requests/api/pages/pages_spec.rb'
+ - 'spec/requests/api/pages_domains_spec.rb'
+ - 'spec/requests/api/personal_access_tokens_spec.rb'
+ - 'spec/requests/api/project_hooks_spec.rb'
+ - 'spec/requests/api/project_templates_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/pypi_packages_spec.rb'
+ - 'spec/requests/api/release/links_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/snippets_spec.rb'
+ - 'spec/requests/api/unleash_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/groups/milestones_controller_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/requests/oauth/tokens_controller_spec.rb'
+ - 'spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb'
+ - 'spec/serializers/cluster_entity_spec.rb'
+ - 'spec/serializers/deploy_key_entity_spec.rb'
+ - 'spec/serializers/import/provider_repo_serializer_spec.rb'
+ - 'spec/services/auto_merge/base_service_spec.rb'
+ - 'spec/services/auto_merge_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb'
+ - 'spec/services/ci/parse_dotenv_artifact_service_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb'
+ - 'spec/services/ci/process_build_service_spec.rb'
+ - 'spec/services/ci/runners/register_runner_service_spec.rb'
+ - 'spec/services/ci/runners/update_runner_service_spec.rb'
+ - 'spec/services/ci/stuck_builds/drop_pending_service_spec.rb'
+ - 'spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb'
+ - 'spec/services/clusters/integrations/create_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
+ - 'spec/services/deployments/create_for_build_service_spec.rb'
+ - 'spec/services/git/branch_push_service_spec.rb'
+ - 'spec/services/groups/destroy_service_spec.rb'
+ - 'spec/services/groups/merge_requests_count_service_spec.rb'
+ - 'spec/services/groups/update_service_spec.rb'
+ - 'spec/services/groups/update_statistics_service_spec.rb'
+ - 'spec/services/import/validate_remote_git_endpoint_service_spec.rb'
+ - 'spec/services/issues/referenced_merge_requests_service_spec.rb'
+ - 'spec/services/jira_import/start_import_service_spec.rb'
+ - 'spec/services/lfs/push_service_spec.rb'
+ - 'spec/services/members/invite_service_spec.rb'
+ - 'spec/services/merge_requests/push_options_handler_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/milestones/transfer_service_spec.rb'
+ - 'spec/services/notes/copy_service_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/packages/composer/create_package_service_spec.rb'
+ - 'spec/services/packages/create_dependency_service_spec.rb'
+ - 'spec/services/packages/debian/extract_deb_metadata_service_spec.rb'
+ - 'spec/services/packages/debian/parse_debian822_service_spec.rb'
+ - 'spec/services/packages/debian/sign_distribution_service_spec.rb'
+ - 'spec/services/packages/helm/process_file_service_spec.rb'
+ - 'spec/services/packages/npm/create_package_service_spec.rb'
+ - 'spec/services/packages/rubygems/dependency_resolver_service_spec.rb'
+ - 'spec/services/pages/delete_service_spec.rb'
+ - 'spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb'
+ - 'spec/services/projects/enable_deploy_key_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb'
+ - 'spec/services/projects/participants_service_spec.rb'
+ - 'spec/services/projects/update_statistics_service_spec.rb'
+ - 'spec/services/quick_actions/interpret_service_spec.rb'
+ - 'spec/services/releases/destroy_service_spec.rb'
+ - 'spec/services/releases/update_service_spec.rb'
+ - 'spec/services/resource_access_tokens/create_service_spec.rb'
+ - 'spec/services/search/group_service_spec.rb'
+ - 'spec/services/snippets/update_service_spec.rb'
+ - 'spec/services/suggestions/apply_service_spec.rb'
+ - 'spec/services/system_notes/merge_requests_service_spec.rb'
+ - 'spec/services/terraform/remote_state_handler_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/todos/destroy/design_service_spec.rb'
+ - 'spec/services/todos/destroy/entity_leave_service_spec.rb'
+ - 'spec/services/web_hook_service_spec.rb'
+ - 'spec/support/helpers/cycle_analytics_helpers.rb'
+ - 'spec/support/redis/redis_shared_examples.rb'
+ - 'spec/support/shared_contexts/features/integrations/integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/graphql/requests/packages_shared_context.rb'
+ - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
+ - 'spec/support/shared_contexts/requests/api/conan_packages_shared_context.rb'
+ - 'spec/support/shared_examples/controllers/error_tracking_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/snippets_sort_order_shared_examples.rb'
+ - 'spec/support/shared_examples/features/board_sidebar_labels_examples.rb'
+ - 'spec/support/shared_examples/features/snippets_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_asciidoc_page_with_includes_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sql/set_operator_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cluster_application_core_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/has_repository_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/incident_management/escalatable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/label_note_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb'
+ - 'spec/support/shared_examples/models/project_latest_successful_build_for_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/issues/merge_requests_count_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/labels_api_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/lfs_http_shared_examples.rb'
+ - 'spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/issues_move_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/merge_request_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
+ - 'spec/tasks/gitlab/snippets_rake_spec.rb'
+ - 'spec/uploaders/packages/debian/distribution_release_file_uploader_spec.rb'
+ - 'spec/validators/addressable_url_validator_spec.rb'
+ - 'spec/views/help/instance_configuration.html.haml_spec.rb'
+ - 'spec/views/layouts/_header_search.html.haml_spec.rb'
+ - 'spec/views/layouts/_published_experiments.html.haml_spec.rb'
+ - 'spec/views/shared/runners/_runner_details.html.haml_spec.rb'
+ - 'spec/workers/bulk_imports/export_request_worker_spec.rb'
+ - 'spec/workers/clusters/cleanup/project_namespace_worker_spec.rb'
+ - 'spec/workers/packages/helm/extraction_worker_spec.rb'
+ - 'spec/workers/pages_worker_spec.rb'
+ - 'spec/workers/purge_dependency_proxy_cache_worker_spec.rb'
+ - 'spec/workers/releases/manage_evidence_worker_spec.rb'
+ - 'spec/workers/repository_remove_remote_worker_spec.rb'
diff --git a/.rubocop_todo/layout/space_inside_parens.yml b/.rubocop_todo/layout/space_inside_parens.yml
new file mode 100644
index 00000000000..62d33391a25
--- /dev/null
+++ b/.rubocop_todo/layout/space_inside_parens.yml
@@ -0,0 +1,440 @@
+---
+# Cop supports --auto-correct.
+Layout/SpaceInsideParens:
+ # Offense count: 701
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/projects/environments_controller.rb'
+ - 'app/controllers/projects/pipeline_schedules_controller.rb'
+ - 'app/graphql/mutations/ci/job/base.rb'
+ - 'app/helpers/icons_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/reminder_emails_helper.rb'
+ - 'app/models/alert_management/alert.rb'
+ - 'app/models/ci/build_metadata.rb'
+ - 'app/models/concerns/milestoneable.rb'
+ - 'app/models/concerns/mirror_authentication.rb'
+ - 'app/models/concerns/protected_ref_access.rb'
+ - 'app/models/cycle_analytics/project_level_stage_adapter.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/project.rb'
+ - 'app/services/ci/archive_trace_service.rb'
+ - 'app/services/jira_import/start_import_service.rb'
+ - 'app/services/labels/transfer_service.rb'
+ - 'app/services/packages/debian/create_distribution_service.rb'
+ - 'app/services/packages/debian/update_distribution_service.rb'
+ - 'app/services/packages/npm/create_package_service.rb'
+ - 'app/services/personal_access_tokens/revoke_service.rb'
+ - 'app/services/snippets/create_service.rb'
+ - 'app/services/spam/spam_verdict_service.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'db/post_migrate/20210722042939_update_issuable_slas_where_issue_closed.rb'
+ - 'ee/app/graphql/resolvers/external_issue_resolver.rb'
+ - 'ee/app/helpers/billing_plans_helper.rb'
+ - 'ee/app/helpers/ee/boards_helper.rb'
+ - 'ee/app/models/ee/lfs_object.rb'
+ - 'ee/app/models/ee/merge_request_diff.rb'
+ - 'ee/app/models/ee/pages_deployment.rb'
+ - 'ee/app/models/ee/upload.rb'
+ - 'ee/app/models/requirements_management/requirement.rb'
+ - 'ee/app/models/resource_iteration_event.rb'
+ - 'ee/app/services/compliance_management/frameworks/create_service.rb'
+ - 'ee/app/services/compliance_management/frameworks/destroy_service.rb'
+ - 'ee/app/services/compliance_management/frameworks/update_service.rb'
+ - 'ee/app/services/elastic/cluster_reindexing_service.rb'
+ - 'ee/app/services/namespaces/check_storage_size_service.rb'
+ - 'ee/app/services/sitemap/create_service.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/access.rb'
+ - 'ee/lib/gitlab/auth/smartcard/session.rb'
+ - 'ee/spec/controllers/admin/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/productivity_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/projects/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/vulnerabilities_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/operations_controller_spec.rb'
+ - 'ee/spec/features/account_recovery_regular_check_spec.rb'
+ - 'ee/spec/features/billings/billing_plans_spec.rb'
+ - 'ee/spec/features/boards/board_filters_spec.rb'
+ - 'ee/spec/features/boards/group_boards/board_deletion_spec.rb'
+ - 'ee/spec/features/boards/user_visits_board_spec.rb'
+ - 'ee/spec/features/groups/analytics/ci_cd_analytics_spec.rb'
+ - 'ee/spec/features/groups/issues_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/merge_request/user_edits_multiple_reviewers_mr_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_trains/two_merge_requests_on_train_spec.rb'
+ - 'ee/spec/finders/ee/alert_management/alerts_finder_spec.rb'
+ - 'ee/spec/finders/ee/alert_management/http_integrations_finder_spec.rb'
+ - 'ee/spec/finders/epics_finder_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/analytics/devops_reports/devops_adoption/enabled_namespaces.rb'
+ - 'ee/spec/frontend/fixtures/epic.rb'
+ - 'ee/spec/frontend/fixtures/projects.rb'
+ - 'ee/spec/graphql/ee/resolvers/board_lists_resolver_spec.rb'
+ - 'ee/spec/graphql/mutations/app_sec/fuzzing/coverage/corpus/create_spec.rb'
+ - 'ee/spec/graphql/mutations/dast/profiles/create_spec.rb'
+ - 'ee/spec/graphql/resolvers/epics_resolver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/drop_invalid_remediations_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/auth_hash_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/dynamic_settings_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/group_lookup_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/otp/session_enforcer_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/ldap_certificate_spec.rb'
+ - 'ee/spec/lib/gitlab/auth_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/cluster_image_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/coverage_fuzzing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_runner_validation_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/secure_binaries_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/git_ssh_proxy_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/event_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/storage/s3_client_spec.rb'
+ - 'ee/spec/mailers/notify_spec.rb'
+ - 'ee/spec/migrations/add_non_null_constraint_for_escalation_rule_on_pending_alert_escalations_spec.rb'
+ - 'ee/spec/migrations/drop_invalid_remediations_spec.rb'
+ - 'ee/spec/models/allowed_email_domain_spec.rb'
+ - 'ee/spec/models/boards/epic_board_position_spec.rb'
+ - 'ee/spec/models/dora/change_failure_rate_metric_spec.rb'
+ - 'ee/spec/models/ee/integrations/jira_spec.rb'
+ - 'ee/spec/models/ee/iteration_spec.rb'
+ - 'ee/spec/models/ee/key_spec.rb'
+ - 'ee/spec/models/ee/system_note_metadata_spec.rb'
+ - 'ee/spec/models/geo/every_geo_event_spec.rb'
+ - 'ee/spec/models/incident_management/escalation_rule_spec.rb'
+ - 'ee/spec/models/ip_restriction_spec.rb'
+ - 'ee/spec/models/issue_spec.rb'
+ - 'ee/spec/models/ldap_group_link_spec.rb'
+ - 'ee/spec/models/license_spec.rb'
+ - 'ee/spec/models/member_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/release_highlight_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_configuration_spec.rb'
+ - 'ee/spec/models/vulnerabilities/feedback_spec.rb'
+ - 'ee/spec/requests/api/boards_spec.rb'
+ - 'ee/spec/requests/api/epics_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/projects/compliance_frameworks_spec.rb'
+ - 'ee/spec/requests/api/group_boards_spec.rb'
+ - 'ee/spec/requests/api/iterations_spec.rb'
+ - 'ee/spec/requests/api/ldap_group_links_spec.rb'
+ - 'ee/spec/requests/api/project_milestones_spec.rb'
+ - 'ee/spec/requests/customers_dot/proxy_controller_spec.rb'
+ - 'ee/spec/requests/survey_responses_controller_spec.rb'
+ - 'ee/spec/serializers/member_user_entity_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profile_secret_variables/create_or_update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_validations/runner_service_spec.rb'
+ - 'ee/spec/services/app_sec/fuzzing/coverage/corpuses/create_service_spec.rb'
+ - 'ee/spec/services/ci_cd/github_integration_setup_service_spec.rb'
+ - 'ee/spec/services/ci_cd/github_setup_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/list_service_spec.rb'
+ - 'ee/spec/services/ee/notification_service_spec.rb'
+ - 'ee/spec/services/ee/users/update_service_spec.rb'
+ - 'ee/spec/services/epic_issues/update_service_spec.rb'
+ - 'ee/spec/services/geo/container_repository_sync_spec.rb'
+ - 'ee/spec/services/geo/replication_toggle_request_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/create_service_spec.rb'
+ - 'ee/spec/services/projects/update_mirror_service_spec.rb'
+ - 'ee/spec/services/search/group_service_spec.rb'
+ - 'ee/spec/services/search/project_service_spec.rb'
+ - 'ee/spec/services/security/merge_reports_service_spec.rb'
+ - 'ee/spec/services/vulnerability_exports/exporters/csv_service_spec.rb'
+ - 'ee/spec/support/shared_examples/services/geo/geo_request_service_shared_examples.rb'
+ - 'ee/spec/workers/elastic/migration_worker_spec.rb'
+ - 'ee/spec/workers/geo/container_repository_sync_dispatch_worker_spec.rb'
+ - 'ee/spec/workers/security/auto_fix_worker_spec.rb'
+ - 'ee/spec/workers/security/create_orchestration_policy_worker_spec.rb'
+ - 'lib/backup/files.rb'
+ - 'lib/gitlab/ci/reports/security/finding.rb'
+ - 'lib/gitlab/ci/runner_instructions.rb'
+ - 'lib/gitlab/database/partitioning/single_numeric_list_partition.rb'
+ - 'lib/gitlab/database/postgres_hll/buckets.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/diff/rendered/notebook/diff_file.rb'
+ - 'lib/gitlab/gitaly_client/commit_service.rb'
+ - 'lib/gitlab/prometheus_client.rb'
+ - 'lib/gitlab/sidekiq_daemon/memory_killer.rb'
+ - 'lib/gitlab/tracking/incident_management.rb'
+ - 'lib/gitlab/visibility_level.rb'
+ - 'lib/security/ci_configuration/sast_build_action.rb'
+ - 'qa/qa/page/group/settings/group_deploy_tokens.rb'
+ - 'qa/qa/page/merge_request/show.rb'
+ - 'qa/qa/tools/delete_subgroups.rb'
+ - 'qa/spec/runtime/feature_spec.rb'
+ - 'qa/spec/scenario/template_spec.rb'
+ - 'spec/controllers/boards/issues_controller_spec.rb'
+ - 'spec/controllers/groups/children_controller_spec.rb'
+ - 'spec/controllers/groups/registry/repositories_controller_spec.rb'
+ - 'spec/controllers/groups/releases_controller_spec.rb'
+ - 'spec/controllers/groups/runners_controller_spec.rb'
+ - 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/controllers/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/registry/repositories_controller_spec.rb'
+ - 'spec/controllers/projects/runners_controller_spec.rb'
+ - 'spec/dependencies/omniauth_saml_spec.rb'
+ - 'spec/factories/usage_data.rb'
+ - 'spec/features/admin/admin_runners_spec.rb'
+ - 'spec/features/boards/board_filters_spec.rb'
+ - 'spec/features/boards/user_visits_board_spec.rb'
+ - 'spec/features/dashboard/datetime_on_tooltips_spec.rb'
+ - 'spec/features/graphql_known_operations_spec.rb'
+ - 'spec/features/groups/activity_spec.rb'
+ - 'spec/features/groups/board_sidebar_spec.rb'
+ - 'spec/features/groups/empty_states_spec.rb'
+ - 'spec/features/groups/issues_spec.rb'
+ - 'spec/features/groups/milestone_spec.rb'
+ - 'spec/features/groups/milestones_sorting_spec.rb'
+ - 'spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_edits_assignees_sidebar_spec.rb'
+ - 'spec/features/profiles/two_factor_auths_spec.rb'
+ - 'spec/features/projects/branches/user_views_branches_spec.rb'
+ - 'spec/features/projects/fork_spec.rb'
+ - 'spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/features/projects/pipeline_schedules_spec.rb'
+ - 'spec/features/projects/releases/user_views_edit_release_spec.rb'
+ - 'spec/features/projects/releases/user_views_releases_spec.rb'
+ - 'spec/finders/alert_management/http_integrations_finder_spec.rb'
+ - 'spec/finders/events_finder_spec.rb'
+ - 'spec/finders/labels_finder_spec.rb'
+ - 'spec/frontend/fixtures/api_merge_requests.rb'
+ - 'spec/frontend/fixtures/api_projects.rb'
+ - 'spec/frontend/fixtures/application_settings.rb'
+ - 'spec/frontend/fixtures/blob.rb'
+ - 'spec/frontend/fixtures/branches.rb'
+ - 'spec/frontend/fixtures/clusters.rb'
+ - 'spec/frontend/fixtures/deploy_keys.rb'
+ - 'spec/frontend/fixtures/issues.rb'
+ - 'spec/frontend/fixtures/jobs.rb'
+ - 'spec/frontend/fixtures/labels.rb'
+ - 'spec/frontend/fixtures/merge_requests.rb'
+ - 'spec/frontend/fixtures/merge_requests_diffs.rb'
+ - 'spec/frontend/fixtures/metrics_dashboard.rb'
+ - 'spec/frontend/fixtures/pipeline_schedules.rb'
+ - 'spec/frontend/fixtures/pipelines.rb'
+ - 'spec/frontend/fixtures/projects.rb'
+ - 'spec/frontend/fixtures/prometheus_service.rb'
+ - 'spec/frontend/fixtures/raw.rb'
+ - 'spec/frontend/fixtures/services.rb'
+ - 'spec/frontend/fixtures/snippet.rb'
+ - 'spec/frontend/fixtures/todos.rb'
+ - 'spec/graphql/mutations/todos/restore_many_spec.rb'
+ - 'spec/graphql/resolvers/board_list_issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/board_lists_resolver_spec.rb'
+ - 'spec/graphql/resolvers/board_resolver_spec.rb'
+ - 'spec/graphql/resolvers/boards_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_packages_resolver_spec.rb'
+ - 'spec/graphql/resolvers/projects_resolver_spec.rb'
+ - 'spec/graphql/resolvers/recent_boards_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users_resolver_spec.rb'
+ - 'spec/helpers/badges_helper_spec.rb'
+ - 'spec/helpers/ci/builds_helper_spec.rb'
+ - 'spec/helpers/ci/runners_helper_spec.rb'
+ - 'spec/helpers/dev_ops_report_helper_spec.rb'
+ - 'spec/helpers/git_helper_spec.rb'
+ - 'spec/helpers/gitlab_routing_helper_spec.rb'
+ - 'spec/helpers/gitlab_script_tag_helper_spec.rb'
+ - 'spec/helpers/tab_helper_spec.rb'
+ - 'spec/initializers/carrierwave_patch_spec.rb'
+ - 'spec/initializers/rdoc_segfault_patch_spec.rb'
+ - 'spec/lib/api/entities/snippet_spec.rb'
+ - 'spec/lib/banzai/filter/references/alert_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/feature_flag_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/snippet_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/repository_link_filter_spec.rb'
+ - 'spec/lib/bitbucket_server/representation/comment_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/lfs_objects_pipeline_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/projects_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/repo_spec.rb'
+ - 'spec/lib/gitlab/app_text_logger_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/ci/build/image_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/reports_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/trigger_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/test_suite_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/5_minute_production_app_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Terraform/base_latest_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/flutter_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/kaniko_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/npm_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_job_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/runner_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/reindex_concurrently_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_projects_spec.rb'
+ - 'spec/lib/gitlab/database_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_cache_spec.rb'
+ - 'spec/lib/gitlab/exclusive_lease_helpers_spec.rb'
+ - 'spec/lib/gitlab/git/blob_spec.rb'
+ - 'spec/lib/gitlab/git/commit_spec.rb'
+ - 'spec/lib/gitlab/git/diff_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/queue_duration_logger_spec.rb'
+ - 'spec/lib/gitlab/graphql/lazy_spec.rb'
+ - 'spec/lib/gitlab/graphql/markdown_field_spec.rb'
+ - 'spec/lib/gitlab/health_checks/simple_check_shared.rb'
+ - 'spec/lib/gitlab/highlight_spec.rb'
+ - 'spec/lib/gitlab/import_export/attributes_permitter_spec.rb'
+ - 'spec/lib/gitlab/import_export/file_importer_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/export_task_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/issuables_count_for_state_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/rollout_status_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/processor_spec.rb'
+ - 'spec/lib/gitlab/middleware/same_site_cookies_spec.rb'
+ - 'spec/lib/gitlab/puma_logging/json_formatter_spec.rb'
+ - 'spec/lib/gitlab/rack_attack/instrumented_cache_store_spec.rb'
+ - 'spec/lib/gitlab/redis/cache_spec.rb'
+ - 'spec/lib/gitlab/redis/queues_spec.rb'
+ - 'spec/lib/gitlab/redis/shared_state_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executed_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_definition_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/generic_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/name_suggestion_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils/delegator_override/validator_spec.rb'
+ - 'spec/lib/gitlab/utils/usage_data_spec.rb'
+ - 'spec/lib/security/ci_configuration/container_scanning_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_iac_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb'
+ - 'spec/mailers/emails/profile_spec.rb'
+ - 'spec/migrations/20211130165043_backfill_sequence_column_for_sprints_table_spec.rb'
+ - 'spec/migrations/backfill_issues_upvotes_count_spec.rb'
+ - 'spec/migrations/schedule_copy_ci_builds_columns_to_security_scans2_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/build_trace_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/trigger_request_spec.rb'
+ - 'spec/models/clusters/applications/prometheus_spec.rb'
+ - 'spec/models/deploy_token_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/environment_status_spec.rb'
+ - 'spec/models/experiment_spec.rb'
+ - 'spec/models/exported_protected_branch_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/integrations/jira_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/metrics/dashboard/annotation_spec.rb'
+ - 'spec/models/namespace_setting_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/network/graph_spec.rb'
+ - 'spec/models/packages/package_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/users/calloutable_spec.rb'
+ - 'spec/policies/clusters/agent_policy_spec.rb'
+ - 'spec/presenters/ci/build_presenter_spec.rb'
+ - 'spec/presenters/packages/conan/package_presenter_spec.rb'
+ - 'spec/requests/api/boards_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_artifacts_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/runners_reset_registration_token_spec.rb'
+ - 'spec/requests/api/ci/runners_spec.rb'
+ - 'spec/requests/api/dependency_proxy_spec.rb'
+ - 'spec/requests/api/deployments_spec.rb'
+ - 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/go_proxy_spec.rb'
+ - 'spec/requests/api/graphql/boards/board_list_issues_query_spec.rb'
+ - 'spec/requests/api/graphql/ci/jobs_spec.rb'
+ - 'spec/requests/api/graphql/ci/pipelines_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/remove_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb'
+ - 'spec/requests/api/group_boards_spec.rb'
+ - 'spec/requests/api/issues/issues_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/labels_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/pages/pages_spec.rb'
+ - 'spec/requests/api/project_milestones_spec.rb'
+ - 'spec/requests/api/project_snippets_spec.rb'
+ - 'spec/requests/api/snippets_spec.rb'
+ - 'spec/requests/api/submodules_spec.rb'
+ - 'spec/requests/jwt_controller_spec.rb'
+ - 'spec/requests/projects/merge_requests/diffs_spec.rb'
+ - 'spec/requests/projects/merge_requests_spec.rb'
+ - 'spec/requests/projects/releases_controller_spec.rb'
+ - 'spec/requests/search_controller_spec.rb'
+ - 'spec/serializers/analytics_build_entity_spec.rb'
+ - 'spec/serializers/merge_request_user_entity_spec.rb'
+ - 'spec/services/authorized_project_update/project_create_service_spec.rb'
+ - 'spec/services/authorized_project_update/project_group_link_create_service_spec.rb'
+ - 'spec/services/boards/issues/list_service_spec.rb'
+ - 'spec/services/ci/compare_test_reports_service_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb'
+ - 'spec/services/ci/retry_job_service_spec.rb'
+ - 'spec/services/clusters/gcp/provision_service_spec.rb'
+ - 'spec/services/clusters/gcp/verify_provision_status_service_spec.rb'
+ - 'spec/services/groups/destroy_service_spec.rb'
+ - 'spec/services/groups/update_shared_runners_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/file_upload_spec.rb'
+ - 'spec/services/issues/export_csv_service_spec.rb'
+ - 'spec/services/labels/promote_service_spec.rb'
+ - 'spec/services/members/invite_service_spec.rb'
+ - 'spec/services/notes/update_service_spec.rb'
+ - 'spec/services/packages/composer/composer_json_service_spec.rb'
+ - 'spec/services/packages/npm/create_package_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
+ - 'spec/services/search/group_service_spec.rb'
+ - 'spec/services/security/merge_reports_service_spec.rb'
+ - 'spec/services/suggestions/apply_service_spec.rb'
+ - 'spec/services/system_notes/issuables_service_spec.rb'
+ - 'spec/services/users/destroy_service_spec.rb'
+ - 'spec/services/x509_certificate_revoke_service_spec.rb'
+ - 'spec/support/helpers/database/partitioning_helpers.rb'
+ - 'spec/support/helpers/dependency_proxy_helpers.rb'
+ - 'spec/support/helpers/javascript_fixtures_helpers.rb'
+ - 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
+ - 'spec/support/shared_examples/ci/badge_template_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/destroy_hook_shared_examples.rb'
+ - 'spec/support/shared_examples/features/project_features_apply_to_issuables_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/packages/debian/distributions_finder_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/position_formatters_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sidekiq_middleware/strategy_shared_examples.rb'
+ - 'spec/support/shared_examples/mailers/notify_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/releases_shared_examples.rb'
+ - 'spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
+ - 'spec/validators/devise_email_validator_spec.rb'
+ - 'spec/views/shared/runners/_runner_details.html.haml_spec.rb'
+ - 'spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb'
+ - 'spec/workers/pipeline_schedule_worker_spec.rb'
+ - 'spec/workers/purge_dependency_proxy_cache_worker_spec.rb'
+ - 'spec/workers/releases/manage_evidence_worker_spec.rb'
+ - 'spec/workers/run_pipeline_schedule_worker_spec.rb'
diff --git a/.rubocop_todo/lint/binary_operator_with_identical_operands.yml b/.rubocop_todo/lint/binary_operator_with_identical_operands.yml
new file mode 100644
index 00000000000..90c3a76d3b1
--- /dev/null
+++ b/.rubocop_todo/lint/binary_operator_with_identical_operands.yml
@@ -0,0 +1,15 @@
+---
+Lint/BinaryOperatorWithIdenticalOperands:
+ Exclude:
+ - 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
+ - 'spec/helpers/visibility_level_helper_spec.rb'
+ - 'spec/lib/gitlab/conan_token_spec.rb'
+ - 'spec/lib/gitlab/git/conflict/parser_spec.rb'
+ - 'spec/lib/gitlab/graphql/lazy_spec.rb'
+ - 'spec/models/ci/build_trace_chunk_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/concerns/where_composite_spec.rb'
+ - 'spec/models/metrics/dashboard/annotation_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/tooling/danger/sidekiq_queues_spec.rb'
diff --git a/.rubocop_todo/lint/constant_definition_in_block.yml b/.rubocop_todo/lint/constant_definition_in_block.yml
new file mode 100644
index 00000000000..1ffea85dfb0
--- /dev/null
+++ b/.rubocop_todo/lint/constant_definition_in_block.yml
@@ -0,0 +1,53 @@
+---
+Lint/ConstantDefinitionInBlock:
+ # Offense count: 105
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/concerns/ignorable_columns.rb'
+ - 'app/models/concerns/partitioned_table.rb'
+ - 'app/workers/concerns/worker_context.rb'
+ - 'config/application.rb'
+ - 'config/initializers/direct_upload_support.rb'
+ - 'config/initializers/elastic_client_setup.rb'
+ - 'ee/app/models/concerns/ee/issuable_link.rb'
+ - 'ee/app/models/ee/application_setting.rb'
+ - 'ee/app/models/ee/ci/job_artifact.rb'
+ - 'ee/app/models/ee/ci/pipeline.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/merge_request_diff.rb'
+ - 'ee/app/models/ee/plan.rb'
+ - 'ee/app/models/ee/project_import_state.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/presenters/ee/commit_status_presenter.rb'
+ - 'ee/app/services/ee/notes/quick_actions_service.rb'
+ - 'ee/lib/ee/api/search.rb'
+ - 'ee/lib/ee/gitlab/ci/status/build/failed.rb'
+ - 'ee/lib/gitlab/subscription_portal/clients/rest.rb'
+ - 'ee/lib/tasks/geo.rake'
+ - 'ee/spec/db/schema_support.rb'
+ - 'ee/spec/support/matchers/locked_schema.rb'
+ - 'lib/api/search.rb'
+ - 'lib/gitlab/quick_actions/issue_actions.rb'
+ - 'lib/tasks/cache.rake'
+ - 'lib/tasks/dev.rake'
+ - 'lib/tasks/gitlab/docs/compile_deprecations.rake'
+ - 'lib/tasks/gitlab/graphql.rake'
+ - 'lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake'
+ - 'lib/tasks/gitlab/snippets.rake'
+ - 'lib/tasks/gitlab/tw/codeowners.rake'
+ - 'lib/tasks/gitlab/update_templates.rake'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/dsl_spec.rb'
+ - 'spec/lib/marginalia_spec.rb'
+ - 'spec/mailers/notify_spec.rb'
+ - 'spec/models/concerns/batch_destroy_dependent_associations_spec.rb'
+ - 'spec/models/concerns/bulk_insert_safe_spec.rb'
+ - 'spec/models/concerns/bulk_insertable_associations_spec.rb'
+ - 'spec/models/concerns/triggerable_hooks_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/services/clusters/applications/check_installation_progress_service_spec.rb'
+ - 'spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb'
diff --git a/.rubocop_todo/lint/missing_cop_enable_directive.yml b/.rubocop_todo/lint/missing_cop_enable_directive.yml
new file mode 100644
index 00000000000..a8edf6c85dc
--- /dev/null
+++ b/.rubocop_todo/lint/missing_cop_enable_directive.yml
@@ -0,0 +1,196 @@
+---
+Lint/MissingCopEnableDirective:
+ # Offense count: 199
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/projects/forks_controller.rb'
+ - 'app/finders/projects/serverless/functions_finder.rb'
+ - 'app/graphql/resolvers/group_issues_resolver.rb'
+ - 'app/graphql/resolvers/issues_resolver.rb'
+ - 'app/graphql/resolvers/project_members_resolver.rb'
+ - 'app/graphql/resolvers/project_milestones_resolver.rb'
+ - 'app/graphql/resolvers/projects/snippets_resolver.rb'
+ - 'app/graphql/resolvers/snippets_resolver.rb'
+ - 'app/graphql/resolvers/users/snippets_resolver.rb'
+ - 'app/graphql/types/access_level_type.rb'
+ - 'app/graphql/types/base_enum.rb'
+ - 'app/graphql/types/boards/board_issue_input_base_type.rb'
+ - 'app/graphql/types/ci/analytics_type.rb'
+ - 'app/graphql/types/ci/build_need_type.rb'
+ - 'app/graphql/types/ci/config/config_type.rb'
+ - 'app/graphql/types/ci/config/group_type.rb'
+ - 'app/graphql/types/ci/config/job_restriction_type.rb'
+ - 'app/graphql/types/ci/config/job_type.rb'
+ - 'app/graphql/types/ci/config/need_type.rb'
+ - 'app/graphql/types/ci/config/stage_type.rb'
+ - 'app/graphql/types/ci/group_type.rb'
+ - 'app/graphql/types/ci/job_artifact_type.rb'
+ - 'app/graphql/types/ci/job_type.rb'
+ - 'app/graphql/types/ci/pipeline_message_type.rb'
+ - 'app/graphql/types/ci/runner_architecture_type.rb'
+ - 'app/graphql/types/ci/runner_platform_type.rb'
+ - 'app/graphql/types/ci/runner_setup_type.rb'
+ - 'app/graphql/types/ci/runner_web_url_edge.rb'
+ - 'app/graphql/types/ci/status_action_type.rb'
+ - 'app/graphql/types/ci/template_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/analyzers_entity_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/entity_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/options_entity_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/type.rb'
+ - 'app/graphql/types/countable_connection_type.rb'
+ - 'app/graphql/types/design_management_type.rb'
+ - 'app/graphql/types/issue_connection_type.rb'
+ - 'app/graphql/types/merge_request_connection_type.rb'
+ - 'app/graphql/types/packages/composer/json_type.rb'
+ - 'app/graphql/types/packages/helm/dependency_type.rb'
+ - 'app/graphql/types/packages/helm/maintainer_type.rb'
+ - 'app/graphql/types/packages/helm/metadata_type.rb'
+ - 'app/graphql/types/packages/package_dependency_type.rb'
+ - 'app/graphql/types/repository/blob_type.rb'
+ - 'app/graphql/types/snippets/blob_connection_type.rb'
+ - 'app/graphql/types/user_preferences_type.rb'
+ - 'app/graphql/types/user_status_type.rb'
+ - 'app/models/commit_collection.rb'
+ - 'app/models/concerns/batch_destroy_dependent_associations.rb'
+ - 'app/models/concerns/deployment_platform.rb'
+ - 'app/models/token_with_iv.rb'
+ - 'app/models/wiki_page.rb'
+ - 'app/services/ci/queue/build_queue_service.rb'
+ - 'app/services/commits/change_service.rb'
+ - 'app/services/labels/promote_service.rb'
+ - 'app/services/notification_service.rb'
+ - 'app/services/projects/container_repository/third_party/delete_tags_service.rb'
+ - 'app/services/search/global_service.rb'
+ - 'config/initializers_before_autoloader/003_gc_compact.rb'
+ - 'danger/feature_flag/Dangerfile'
+ - 'danger/pajamas/Dangerfile'
+ - 'danger/z_metadata/Dangerfile'
+ - 'db/migrate/20210807101621_add_timezone_to_dast_profile_schedules.rb'
+ - 'db/migrate/20210816095826_add_unique_index_on_dast_profile_to_dast_profile_schedules.rb'
+ - 'db/migrate/20210818061156_remove_project_profile_compound_index_from_dast_profile_schedules.rb'
+ - 'db/migrate/20210818115613_add_index_project_id_on_dast_profile_schedule.rb'
+ - 'db/migrate/20211013014228_add_content_validation_endpoint_to_application_settings.rb'
+ - 'db/post_migrate/20210825182303_remove_duplicate_dast_site_tokens_with_same_token.rb'
+ - 'ee/app/controllers/ee/admin/dashboard_controller.rb'
+ - 'ee/app/controllers/ee/admin/groups_controller.rb'
+ - 'ee/app/controllers/ee/admin/users_controller.rb'
+ - 'ee/app/controllers/ee/projects/settings/ci_cd_controller.rb'
+ - 'ee/app/graphql/resolvers/vulnerabilities_base_resolver.rb'
+ - 'ee/app/graphql/types/admin/cloud_licenses/current_license_type.rb'
+ - 'ee/app/graphql/types/admin/cloud_licenses/license_history_entry_type.rb'
+ - 'ee/app/graphql/types/admin/cloud_licenses/subscription_future_entry_type.rb'
+ - 'ee/app/graphql/types/analytics/devops_adoption/enabled_namespace_type.rb'
+ - 'ee/app/graphql/types/analytics/devops_adoption/snapshot_type.rb'
+ - 'ee/app/graphql/types/burnup_chart_daily_totals_type.rb'
+ - 'ee/app/graphql/types/ci/code_coverage_activity_type.rb'
+ - 'ee/app/graphql/types/ci/code_coverage_summary_type.rb'
+ - 'ee/app/graphql/types/ci/code_quality_degradation_type.rb'
+ - 'ee/app/graphql/types/ci/minutes/namespace_monthly_usage_type.rb'
+ - 'ee/app/graphql/types/ci/minutes/project_monthly_usage_type.rb'
+ - 'ee/app/graphql/types/compliance_management/compliance_framework_type.rb'
+ - 'ee/app/graphql/types/dast/profile_cadence_type.rb'
+ - 'ee/app/graphql/types/geo/group_wiki_repository_registry_type.rb'
+ - 'ee/app/graphql/types/geo/job_artifact_registry_type.rb'
+ - 'ee/app/graphql/types/geo/lfs_object_registry_type.rb'
+ - 'ee/app/graphql/types/geo/merge_request_diff_registry_type.rb'
+ - 'ee/app/graphql/types/geo/package_file_registry_type.rb'
+ - 'ee/app/graphql/types/geo/pages_deployment_registry_type.rb'
+ - 'ee/app/graphql/types/geo/pipeline_artifact_registry_type.rb'
+ - 'ee/app/graphql/types/geo/snippet_repository_registry_type.rb'
+ - 'ee/app/graphql/types/geo/terraform_state_version_registry_type.rb'
+ - 'ee/app/graphql/types/geo/upload_registry_type.rb'
+ - 'ee/app/graphql/types/network_policy_type.rb'
+ - 'ee/app/graphql/types/scan_type.rb'
+ - 'ee/app/graphql/types/scanned_resource_type.rb'
+ - 'ee/app/graphql/types/security_report_summary_section_type.rb'
+ - 'ee/app/graphql/types/security_report_summary_type.rb'
+ - 'ee/app/graphql/types/security_scanners.rb'
+ - 'ee/app/graphql/types/time_report_stats_type.rb'
+ - 'ee/app/graphql/types/timebox_metrics_type.rb'
+ - 'ee/app/graphql/types/timebox_report_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities_count_by_day_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/base_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/boolean_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/code_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/commit_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/diff_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/file_location_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/int_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/list_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/markdown_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/module_location_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/table_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/text_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/url_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/cluster_image_scanning_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/container_scanning_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/coverage_fuzzing_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/dast_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/dependency_scanning_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/generic_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/sast_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/secret_detection_type.rb'
+ - 'ee/app/graphql/types/vulnerability_severities_count_type.rb'
+ - 'ee/app/graphql/types/vulnerable_dependency_type.rb'
+ - 'ee/app/graphql/types/vulnerable_kubernetes_resource_type.rb'
+ - 'ee/app/graphql/types/vulnerable_package_type.rb'
+ - 'ee/app/workers/groups/export_memberships_worker.rb'
+ - 'ee/app/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker.rb'
+ - 'ee/lib/api/ldap_group_links.rb'
+ - 'ee/lib/api/scim.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/gitlab/spdx/license.rb'
+ - 'lib/gitlab/auth/ldap/dn.rb'
+ - 'lib/gitlab/background_migration/backfill_issue_search_data.rb'
+ - 'lib/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots.rb'
+ - 'lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb'
+ - 'lib/gitlab/background_migration/fix_incorrect_max_seats_used.rb'
+ - 'lib/gitlab/background_migration/mailers/unconfirm_mailer.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_in_batch.rb'
+ - 'lib/gitlab/background_migration/migrate_job_artifact_registry_to_ssf.rb'
+ - 'lib/gitlab/background_migration/migrate_stage_status.rb'
+ - 'lib/gitlab/background_migration/migrate_u2f_webauthn.rb'
+ - 'lib/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'lib/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'lib/gitlab/background_migration/populate_test_reports_issue_id.rb'
+ - 'lib/gitlab/background_migration/populate_uuids_for_security_findings.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings.rb'
+ - 'lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings.rb'
+ - 'lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb'
+ - 'lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb'
+ - 'lib/gitlab/ci/reports/test_suite_summary.rb'
+ - 'lib/gitlab/data_builder/push.rb'
+ - 'lib/gitlab/database/load_balancing/connection_proxy.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/postgresql_adapter/type_map_cache.rb'
+ - 'lib/gitlab/github_import/client.rb'
+ - 'lib/gitlab/github_import/importer/diff_note_importer.rb'
+ - 'lib/gitlab/gon_helper.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/last_items.rb'
+ - 'lib/gitlab/graphql/standard_graphql_error.rb'
+ - 'lib/gitlab/metrics/methods.rb'
+ - 'lib/gitlab/patch/action_cable_redis_listener.rb'
+ - 'lib/gitlab/patch/prependable.rb'
+ - 'lib/gitlab/project_search_results.rb'
+ - 'lib/gitlab/task_helpers.rb'
+ - 'lib/gitlab/testing/request_blocker_middleware.rb'
+ - 'lib/gitlab/testing/request_inspector_middleware.rb'
+ - 'lib/gitlab/testing/robots_blocker_middleware.rb'
+ - 'qa/qa/scenario/test/integration/registry_with_cdn.rb'
+ - 'spec/benchmarks/banzai_benchmark.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/server_spec.rb'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/cycle_analytics_helpers/test_generation.rb'
+ - 'spec/support/google_api/cloud_platform_helpers.rb'
+ - 'tooling/danger/product_intelligence.rb'
diff --git a/.rubocop_todo/lint/struct_new_override.yml b/.rubocop_todo/lint/struct_new_override.yml
new file mode 100644
index 00000000000..db6fe41903b
--- /dev/null
+++ b/.rubocop_todo/lint/struct_new_override.yml
@@ -0,0 +1,6 @@
+---
+Lint/StructNewOverride:
+ Exclude:
+ - 'app/presenters/sentry_error_presenter.rb'
+ - 'app/serializers/environment_serializer.rb'
+ - 'lib/gitlab/ci/pipeline/duration.rb'
diff --git a/.rubocop_todo/metrics/abc_size.yml b/.rubocop_todo/metrics/abc_size.yml
new file mode 100644
index 00000000000..747ef3823f5
--- /dev/null
+++ b/.rubocop_todo/metrics/abc_size.yml
@@ -0,0 +1,14 @@
+---
+Metrics/AbcSize:
+ Exclude:
+ - 'app/controllers/concerns/issuable_actions.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/nav/top_nav_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/models/instance_configuration.rb'
+ - 'app/services/projects/create_service.rb'
+ - 'ee/app/workers/elastic/migration_worker.rb'
+ - 'ee/lib/ee/audit/project_changes_auditor.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/request_params.rb'
+ - 'lib/gitlab/sidekiq_middleware/server_metrics.rb'
+ - 'qa/qa/resource/repository/push.rb'
diff --git a/.rubocop_todo/metrics/cyclomatic_complexity.yml b/.rubocop_todo/metrics/cyclomatic_complexity.yml
new file mode 100644
index 00000000000..71efe9d5a3a
--- /dev/null
+++ b/.rubocop_todo/metrics/cyclomatic_complexity.yml
@@ -0,0 +1,23 @@
+---
+Metrics/CyclomaticComplexity:
+ Exclude:
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/finders/deployments_finder.rb'
+ - 'app/helpers/button_helper.rb'
+ - 'app/helpers/nav/top_nav_helper.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/services/projects/create_service.rb'
+ - 'ee/app/controllers/ee/groups_controller.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/gitlab/ci/parsers/security/formatters/dependency_list.rb'
+ - 'lib/banzai/filter/references/abstract_reference_filter.rb'
+ - 'lib/gitlab/conflict/file.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/utils/merge_hash.rb'
+ - 'lib/kramdown/parser/atlassian_document_format.rb'
+ - 'qa/qa/runtime/browser.rb'
+ - 'qa/qa/support/repeater.rb'
+ - 'rubocop/cop/gitlab/mark_used_feature_flags.rb'
+ - 'sidekiq_cluster/cli.rb'
+ - 'spec/support/cycle_analytics_helpers/test_generation.rb'
diff --git a/.rubocop_todo/metrics/perceived_complexity.yml b/.rubocop_todo/metrics/perceived_complexity.yml
new file mode 100644
index 00000000000..0f2d3030064
--- /dev/null
+++ b/.rubocop_todo/metrics/perceived_complexity.yml
@@ -0,0 +1,24 @@
+---
+Metrics/PerceivedComplexity:
+ Exclude:
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/finders/deployments_finder.rb'
+ - 'app/helpers/button_helper.rb'
+ - 'app/helpers/nav/top_nav_helper.rb'
+ - 'app/helpers/submodule_helper.rb'
+ - 'app/services/projects/create_service.rb'
+ - 'ee/app/controllers/ee/groups_controller.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'lib/banzai/filter/references/abstract_reference_filter.rb'
+ - 'lib/banzai/renderer.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
+ - 'lib/gitlab/conflict/file.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/utils/merge_hash.rb'
+ - 'qa/qa/runtime/browser.rb'
+ - 'qa/qa/specs/runner.rb'
+ - 'qa/qa/support/repeater.rb'
+ - 'rubocop/cop/gitlab/mark_used_feature_flags.rb'
+ - 'sidekiq_cluster/cli.rb'
+ - 'spec/support/cycle_analytics_helpers/test_generation.rb'
diff --git a/.rubocop_todo/naming/heredoc_delimiter_case.yml b/.rubocop_todo/naming/heredoc_delimiter_case.yml
new file mode 100644
index 00000000000..8779831da21
--- /dev/null
+++ b/.rubocop_todo/naming/heredoc_delimiter_case.yml
@@ -0,0 +1,8 @@
+---
+Naming/HeredocDelimiterCase:
+ Exclude:
+ - 'spec/lib/gitlab/diff/parser_spec.rb'
+ - 'spec/lib/json_web_token/rsa_token_spec.rb'
+ - 'spec/models/commit_spec.rb'
+ - 'spec/support/helpers/repo_helpers.rb'
+ - 'spec/support/helpers/seed_repo.rb'
diff --git a/.rubocop_todo/performance/string_include.yml b/.rubocop_todo/performance/string_include.yml
new file mode 100644
index 00000000000..cb6e566094e
--- /dev/null
+++ b/.rubocop_todo/performance/string_include.yml
@@ -0,0 +1,15 @@
+---
+# Cop supports --auto-correct.
+Performance/StringInclude:
+ Exclude:
+ - 'app/models/snippet_repository.rb'
+ - 'config/initializers/macos.rb'
+ - 'config/spring.rb'
+ - 'ee/app/models/ee/container_registry/event.rb'
+ - 'ee/lib/gitlab/auth/smartcard/certificate.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/kramdown/parser/atlassian_document_format.rb'
+ - 'lib/prometheus/pid_provider.rb'
+ - 'qa/qa/specs/runner.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/spec_helper.rb'
diff --git a/.rubocop_todo/rails/inquiry.yml b/.rubocop_todo/rails/inquiry.yml
new file mode 100644
index 00000000000..3c999dfbc47
--- /dev/null
+++ b/.rubocop_todo/rails/inquiry.yml
@@ -0,0 +1,4 @@
+---
+Rails/Inquiry:
+ Exclude:
+ - 'spec/helpers/labels_helper_spec.rb'
diff --git a/.rubocop_todo/rails/render_inline.yml b/.rubocop_todo/rails/render_inline.yml
new file mode 100644
index 00000000000..fbebec72cd7
--- /dev/null
+++ b/.rubocop_todo/rails/render_inline.yml
@@ -0,0 +1,4 @@
+---
+Rails/RenderInline:
+ Exclude:
+ - 'ee/app/controllers/sitemap_controller.rb'
diff --git a/.rubocop_todo/rspec/any_instance_of.yml b/.rubocop_todo/rspec/any_instance_of.yml
index bf1bc408b66..1809dd74dc9 100644
--- a/.rubocop_todo/rspec/any_instance_of.yml
+++ b/.rubocop_todo/rspec/any_instance_of.yml
@@ -141,7 +141,7 @@ RSpec/AnyInstanceOf:
- spec/controllers/groups/settings/ci_cd_controller_spec.rb
- spec/controllers/groups_controller_spec.rb
- spec/controllers/import/bitbucket_controller_spec.rb
- - spec/controllers/oauth/jira/authorizations_controller_spec.rb
+ - spec/controllers/oauth/jira_dvcs/authorizations_controller_spec.rb
- spec/controllers/omniauth_callbacks_controller_spec.rb
- spec/controllers/projects/artifacts_controller_spec.rb
- spec/controllers/projects/branches_controller_spec.rb
diff --git a/.rubocop_todo/rspec/empty_example_group.yml b/.rubocop_todo/rspec/empty_example_group.yml
new file mode 100644
index 00000000000..09906638cd8
--- /dev/null
+++ b/.rubocop_todo/rspec/empty_example_group.yml
@@ -0,0 +1,5 @@
+---
+RSpec/EmptyExampleGroup:
+ Exclude:
+ - 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
+ - 'spec/services/projects/prometheus/alerts/notify_service_spec.rb'
diff --git a/.rubocop_todo/rspec/verified_doubles.yml b/.rubocop_todo/rspec/verified_doubles.yml
index 7cffea49d3a..9df856ea4a7 100644
--- a/.rubocop_todo/rspec/verified_doubles.yml
+++ b/.rubocop_todo/rspec/verified_doubles.yml
@@ -295,7 +295,7 @@ RSpec/VerifiedDoubles:
- spec/controllers/import/gitea_controller_spec.rb
- spec/controllers/import/github_controller_spec.rb
- spec/controllers/import/gitlab_controller_spec.rb
- - spec/controllers/oauth/jira/authorizations_controller_spec.rb
+ - spec/controllers/oauth/jira_dvcs/authorizations_controller_spec.rb
- spec/controllers/omniauth_callbacks_controller_spec.rb
- spec/controllers/profiles/two_factor_auths_controller_spec.rb
- spec/controllers/projects/blob_controller_spec.rb
@@ -437,7 +437,6 @@ RSpec/VerifiedDoubles:
- spec/lib/error_tracking/collector/dsn_spec.rb
- spec/lib/error_tracking/collector/sentry_auth_parser_spec.rb
- spec/lib/error_tracking/collector/sentry_request_parser_spec.rb
- - spec/lib/error_tracking/sentry_client/issue_spec.rb
- spec/lib/extracts_path_spec.rb
- spec/lib/feature_spec.rb
- spec/lib/gitaly/server_spec.rb
@@ -878,7 +877,6 @@ RSpec/VerifiedDoubles:
- spec/models/design_management/design_at_version_spec.rb
- spec/models/diff_viewer/image_spec.rb
- spec/models/environment_spec.rb
- - spec/models/error_tracking/project_error_tracking_setting_spec.rb
- spec/models/event_spec.rb
- spec/models/external_issue_spec.rb
- spec/models/hooks/web_hook_spec.rb
diff --git a/.rubocop_todo/style/array_coercion.yml b/.rubocop_todo/style/array_coercion.yml
new file mode 100644
index 00000000000..a49fc42967d
--- /dev/null
+++ b/.rubocop_todo/style/array_coercion.yml
@@ -0,0 +1,10 @@
+---
+# Cop supports --auto-correct.
+Style/ArrayCoercion:
+ Exclude:
+ - 'app/controllers/admin/ci/variables_controller.rb'
+ - 'app/controllers/groups/variables_controller.rb'
+ - 'app/controllers/projects/variables_controller.rb'
+ - 'ee/app/services/geo/repository_verification_secondary_service.rb'
+ - 'ee/lib/ee/banzai/pipeline/gfm_pipeline.rb'
+ - 'spec/support/helpers/lfs_http_helpers.rb'
diff --git a/.rubocop_todo/style/combinable_loops.yml b/.rubocop_todo/style/combinable_loops.yml
new file mode 100644
index 00000000000..c8b8cbb979d
--- /dev/null
+++ b/.rubocop_todo/style/combinable_loops.yml
@@ -0,0 +1,10 @@
+---
+Style/CombinableLoops:
+ Exclude:
+ - 'ee/db/fixtures/development/30_customizable_cycle_analytics.rb'
+ - 'ee/lib/gitlab/audit/events/preloader.rb'
+ - 'ee/spec/finders/snippets_finder_spec.rb'
+ - 'spec/features/merge_request/user_suggests_changes_on_diff_spec.rb'
+ - 'spec/finders/packages/group_packages_finder_spec.rb'
+ - 'spec/requests/api/members_spec.rb'
+ - 'spec/support/shared_examples/features/protected_branches_access_control_ce_shared_examples.rb'
diff --git a/.rubocop_todo/style/open_struct_use.yml b/.rubocop_todo/style/open_struct_use.yml
index c459ea9d49c..e6af3b7bf24 100644
--- a/.rubocop_todo/style/open_struct_use.yml
+++ b/.rubocop_todo/style/open_struct_use.yml
@@ -1,18 +1,12 @@
---
Style/OpenStructUse:
Exclude:
- - app/helpers/application_settings_helper.rb
- ee/spec/features/projects/new_project_spec.rb
- ee/spec/finders/template_finder_spec.rb
- ee/spec/helpers/ee/blob_helper_spec.rb
- ee/spec/lib/gitlab/auth/group_saml/failure_handler_spec.rb
- ee/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb
- - lib/api/wikis.rb
- - lib/gitlab/git/diff_collection.rb
- - lib/gitlab/import_export/after_export_strategies/base_after_export_strategy.rb
- lib/gitlab/testing/request_inspector_middleware.rb
- - lib/mattermost/session.rb
- - spec/factories/go_module_versions.rb
- spec/factories/wiki_pages.rb
- spec/graphql/mutations/branches/create_spec.rb
- spec/graphql/mutations/clusters/agent_tokens/create_spec.rb
@@ -23,7 +17,5 @@ Style/OpenStructUse:
- spec/helpers/profiles_helper_spec.rb
- spec/lib/gitlab/gitaly_client/blobs_stitcher_spec.rb
- spec/lib/gitlab/gitaly_client/diff_stitcher_spec.rb
- - spec/lib/gitlab/legacy_github_import/project_creator_spec.rb
- - spec/lib/gitlab/quick_actions/command_definition_spec.rb
- spec/services/system_note_service_spec.rb
- spec/support/helpers/repo_helpers.rb
diff --git a/.stylelintrc b/.stylelintrc
index 6e3999fec3b..458fd51bdd7 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -9,8 +9,8 @@
"app/assets/stylesheets/lazy_bundles/cropper.css"
],
"plugins":[
- "./scripts/frontend/stylelint/stylelint-duplicate-selectors.js",
- "./scripts/frontend/stylelint/stylelint-utility-classes.js",
+ "./scripts/frontend/stylelint/stylelint_duplicate_selectors.js",
+ "./scripts/frontend/stylelint/stylelint_utility_classes.js",
],
"rules":{
"stylelint-gitlab/utility-classes":[true,{ "severity": "warning" }],
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0c34381e64a..e02c646674e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -638,6 +638,32 @@ entry.
- [Clean up issue_boards_filtered_search feature flag](gitlab-org/gitlab@a97ed09ffb0d88007b21a314ab48b2e50d7c4bfa) ([merge request](gitlab-org/gitlab!80771))
- [Add table for storing issue tsvector](gitlab-org/gitlab@ceabf5a8ad0d67768b05a58a84b242495645a57c) ([merge request](gitlab-org/gitlab!71913))
+## 14.8.5 (2022-03-31)
+
+### Security (21 changes)
+
+- [Update to commonmarker 0.23.4](gitlab-org/security/gitlab@51532ccc5f1b6b053d4ca6c54496607e62f8f25c) ([merge request](gitlab-org/security/gitlab!2282))
+- [Revert merge request approval groups behavior](gitlab-org/security/gitlab@dd9724e429033974da6c3852dc6fd33f0f2b0a46) ([merge request](gitlab-org/security/gitlab!2334))
+- [Disallow login if password matches a fixed list](gitlab-org/security/gitlab@6779d5f2948425a7ad7f19a6e10f82cc10b80989) ([merge request](gitlab-org/security/gitlab!2358))
+- [Update devise-two-factor to 4.0.2](gitlab-org/security/gitlab@0329d2d82a9064c0bae36e7b993ee40df7c999bc) ([merge request](gitlab-org/security/gitlab!2350))
+- [Limit the number of tags associated with a CI runner](gitlab-org/security/gitlab@8d5938c08fe66c22f1bc54ff76cc9daf2de86b1a) ([merge request](gitlab-org/security/gitlab!2302))
+- [GitLab Pages Security Updates for 14.9](gitlab-org/security/gitlab@5a5a862c8a9e37ca2ea84133f92b216eaa7cd148) ([merge request](gitlab-org/security/gitlab!2328))
+- [Upgrade swagger-ui dependency](gitlab-org/security/gitlab@afcb570867db61347bb6a4e243bb2557340191be) ([merge request](gitlab-org/security/gitlab!2337))
+- [Modify release link format check to avoid regex if string is too long](gitlab-org/security/gitlab@a3ab0ff9c470c1c6e5b4fd055ddd02dffce32652) ([merge request](gitlab-org/security/gitlab!2243))
+- [Masks variables in error messages](gitlab-org/security/gitlab@94236bbdb8eef6600562bdc4e242e07eaed8c50f) ([merge request](gitlab-org/security/gitlab!2291))
+- [Escape user provided string to prevent XSS](gitlab-org/security/gitlab@03e695d4c34546582b503b3f7712246206b56b99) ([merge request](gitlab-org/security/gitlab!2314))
+- [Monkey patch of RDoc to prevent Ruby segfault](gitlab-org/security/gitlab@14eec4487387bc0c999f1c48b046a3ed3848c5a1) ([merge request](gitlab-org/security/gitlab!2232))
+- [Project import maps members' created_by_id users based on source user ID](gitlab-org/security/gitlab@7fd7ab3f57e8d8b4e0aed42aebe9a8b7436a6255) ([merge request](gitlab-org/security/gitlab!2238))
+- [Redact InvalidURIError error messages](gitlab-org/security/gitlab@0592c182bfd60aee501c4c66f47a71c9469f2bcd) ([merge request](gitlab-org/security/gitlab!2296))
+- [Fix access for approval rules API](gitlab-org/security/gitlab@987e06bacba224519adf94cda73b5a8b2e7b917a) ([merge request](gitlab-org/security/gitlab!2323))
+- [Fix kroki exploit](gitlab-org/security/gitlab@bf056c683af25ec4b94c0efa7166eea399ed6502) ([merge request](gitlab-org/security/gitlab!2277))
+- [Fix blind SSRF when looking up SSH host keys for mirroring](gitlab-org/security/gitlab@3c853a32a73aba15e309d05111b744455a360cca) ([merge request](gitlab-org/security/gitlab!2310))
+- [Escape original content in reference redactor](gitlab-org/security/gitlab@00ee99bc3834d9d59572272064c9ad6abeae5975) ([merge request](gitlab-org/security/gitlab!2318))
+- [Security fix for CI/CD analytics visibility](gitlab-org/security/gitlab@691d69be77ae3c8e0a2598b75ccf336b672fd540) ([merge request](gitlab-org/security/gitlab!2273))
+- [Latest commit exposed through fork of a private project](gitlab-org/security/gitlab@6ca7a3b040edac06b23a697bfc2bf46f457d6b81) ([merge request](gitlab-org/security/gitlab!2271))
+- [Fix Asana integration restricted branch filter](gitlab-org/security/gitlab@4c1db692b4e99fab6cdbb818cf02fb879f6d4886) ([merge request](gitlab-org/security/gitlab!2218))
+- [Revert "JH need more complex passwords"](gitlab-org/security/gitlab@919aa2b28645d49fb71508362a0c61da39893c69) ([merge request](gitlab-org/security/gitlab!2353))
+
## 14.8.4 (2022-03-16)
### Added (1 change)
@@ -1353,6 +1379,43 @@ entry.
- [Use `ssh_data` gem instead of `net-ssh` and `sshkey` where possible](gitlab-org/gitlab@59a0ee8605d509753c9aec719f8e0da77bcc679d) ([merge request](gitlab-org/gitlab!77424))
- [Remove feature flag already default enabled](gitlab-org/gitlab@9b7059a4bf9dc2ecdce1910a931cc6967d05b5ad) ([merge request](gitlab-org/gitlab!78238)) **GitLab Enterprise Edition**
+## 14.7.7 (2022-03-31)
+
+### Security (21 changes)
+
+- [Update to commonmarker 0.23.4](gitlab-org/security/gitlab@eb4b231173c86901f93b5b7781716b1f7706dad1) ([merge request](gitlab-org/security/gitlab!2283))
+- [Revert merge request approval groups behavior](gitlab-org/security/gitlab@08e3ecced649f6ad241db6de7050b1502f7bef21) ([merge request](gitlab-org/security/gitlab!2333))
+- [Disallow login if password matches a fixed list](gitlab-org/security/gitlab@02a69ab32da1ac67d855de3ee388d0bd2bb6586e) ([merge request](gitlab-org/security/gitlab!2359))
+- [Update devise-two-factor to 4.0.2](gitlab-org/security/gitlab@c9fde96c7780f5b883cd1ac63d7ac3d5f4d78dc6) ([merge request](gitlab-org/security/gitlab!2351))
+- [Limit the number of tags associated with a CI runner](gitlab-org/security/gitlab@00124d5f8ba0d7437d1f6f19b029754bf481185b) ([merge request](gitlab-org/security/gitlab!2305))
+- [GitLab Pages Security Updates for 14.9](gitlab-org/security/gitlab@d335917e233658fa9d4452053469c3582ef38368) ([merge request](gitlab-org/security/gitlab!2325))
+- [Upgrade swagger-ui dependency](gitlab-org/security/gitlab@7a8ce32f70fd0338817705651ee0dbe0a277d5f1) ([merge request](gitlab-org/security/gitlab!2338))
+- [Modify release link format check to avoid regex if string is too long](gitlab-org/security/gitlab@e18dc2be245bca7e192c8536d1ba7de2ad798c43) ([merge request](gitlab-org/security/gitlab!2244))
+- [Masks variables in error messages](gitlab-org/security/gitlab@1706c5cf9b939a6ab0682db7b8945feb851a3f8b) ([merge request](gitlab-org/security/gitlab!2292))
+- [Escape user provided string to prevent XSS](gitlab-org/security/gitlab@c57edf9ab52810d455e41d71bad4e4d12c098cad) ([merge request](gitlab-org/security/gitlab!2315))
+- [Monkey patch of RDoc to prevent Ruby segfault](gitlab-org/security/gitlab@f9e5597d1864d03bf1f0103787becbc84886968d) ([merge request](gitlab-org/security/gitlab!2233))
+- [Project import maps members' created_by_id users based on source user ID](gitlab-org/security/gitlab@3ea1e477e0596f15e040f42b59fa86953d057128) ([merge request](gitlab-org/security/gitlab!2239))
+- [Redact InvalidURIError error messages](gitlab-org/security/gitlab@a42ede835e32f44b68c1affe78a7ee48332bb30a) ([merge request](gitlab-org/security/gitlab!2297))
+- [Fix access for approval rules API](gitlab-org/security/gitlab@b8c3997763d1e041dc2b82e464a99a5b2f15a798) ([merge request](gitlab-org/security/gitlab!2324))
+- [Fix kroki exploit](gitlab-org/security/gitlab@ad123e33510103af4fb00378ef1fc8dae4cacb21) ([merge request](gitlab-org/security/gitlab!2278))
+- [Fix blind SSRF when looking up SSH host keys for mirroring](gitlab-org/security/gitlab@0209f44cb4876f0a9ef13d4c8875a95a0cda1e2f) ([merge request](gitlab-org/security/gitlab!2311))
+- [Escape original content in reference redactor](gitlab-org/security/gitlab@f63861d8fe7b2b8d161162063e7995782cbfada8) ([merge request](gitlab-org/security/gitlab!2319))
+- [Security fix for CI/CD analytics visibility](gitlab-org/security/gitlab@fea6a4ff80862f9dba493405d03d82cf129e8854) ([merge request](gitlab-org/security/gitlab!2274))
+- [Latest commit exposed through fork of a private project](gitlab-org/security/gitlab@b573cea38cdce020e5f25fb9de60e0e506c87a9b) ([merge request](gitlab-org/security/gitlab!2272))
+- [Fix Asana integration restricted branch filter](gitlab-org/security/gitlab@56e2d9ae3de4f587d2c8a5aa111c2922553d6b7b) ([merge request](gitlab-org/security/gitlab!2214))
+- [Revert "JH need more complex passwords"](gitlab-org/security/gitlab@2419522b02700ce98e0c4d6e7bfd4d28b6464506) ([merge request](gitlab-org/security/gitlab!2354))
+
+## 14.7.6 (2022-03-24)
+
+### Added (1 change)
+
+- [Detect and fix artifacts with backfilled expire_at](gitlab-org/gitlab@92938348905581798fa669051a61c107d082d908) ([merge request](gitlab-org/gitlab!83054))
+
+### Changed (2 changes)
+
+- [Enable feature flags to resume artifact removal on self-managed](gitlab-org/gitlab@45e4aba7099e0b6963674d192dc87edfe9ff8cdb) ([merge request](gitlab-org/gitlab!83054))
+- [Remove runners token prefix feature flags](gitlab-org/gitlab@d57e7e1966cac500ba830dca7843cb315a34a4e4) ([merge request](gitlab-org/gitlab!82121))
+
## 14.7.5 (2022-03-09)
### Fixed (1 change)
@@ -1851,6 +1914,12 @@ See https://about.gitlab.com/releases/2022/02/03/security-release-gitlab-14-7-1-
- [Fix Gitlab/DelegatePredicateMethods offenses](gitlab-org/gitlab@518700a11025b0000ff3ce011638417a882612b0) by @edith007 ([merge request](gitlab-org/gitlab!76001))
- [Fix Rails/SaveBang offenses](gitlab-org/gitlab@513b0e1dbdf95ea595e7548ff26929e0be30ce29) by @edith007 ([merge request](gitlab-org/gitlab!75894)) **GitLab Enterprise Edition**
+## 14.6.7 (2022-03-31)
+
+### Changed (1 change)
+
+- [Remove runners token prefix feature flags](gitlab-org/gitlab@70330bc3f8c34c4620d7e5c4a9943ec3574e5ee6) ([merge request](gitlab-org/gitlab!82122))
+
## 14.6.6 (2022-03-01)
### Fixed (3 changes)
diff --git a/Dangerfile b/Dangerfile
index aaa1aae813b..280a73d432c 100644
--- a/Dangerfile
+++ b/Dangerfile
@@ -11,16 +11,8 @@ project_name = ee? ? 'gitlab' : 'gitlab-foss'
Gitlab::Dangerfiles.for_project(self, project_name) do |gitlab_dangerfiles|
gitlab_dangerfiles.import_plugins
+ gitlab_dangerfiles.config.ci_only_rules = ProjectHelper::CI_ONLY_RULES
+ gitlab_dangerfiles.config.files_to_category = ProjectHelper::CATEGORIES
- unless helper.release_automation?
- danger.import_plugin('danger/plugins/*.rb')
- gitlab_dangerfiles.import_dangerfiles(except: %w[simple_roulette])
- gitlab_dangerfiles.config.files_to_category = ProjectHelper::CATEGORIES
- end
-end
-
-return if helper.release_automation?
-
-project_helper.rule_names.each do |rule|
- danger.import_dangerfile(path: File.join('danger', rule))
+ gitlab_dangerfiles.import_dangerfiles(except: %w[simple_roulette])
end
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index cb408008f92..48808496065 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-14.9.3 \ No newline at end of file
+c311109b15c26e1981c855bfa5c87aef02d27560
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index 44a5e718d50..6242bb49da0 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-14.9.0
+14.10.0
diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION
index 7e13e2ba8d4..5dd2f9ec06b 100644
--- a/GITLAB_SHELL_VERSION
+++ b/GITLAB_SHELL_VERSION
@@ -1 +1 @@
-13.24.0
+13.25.1
diff --git a/Gemfile b/Gemfile
index 7423bba8e62..6f9340ebd7d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -2,7 +2,7 @@
source 'https://rubygems.org'
-gem 'rails', '~> 6.1.4.6'
+gem 'rails', '~> 6.1.4.7'
gem 'bootsnap', '~> 1.9.1', require: false
@@ -41,6 +41,7 @@ gem 'omniauth-azure-activedirectory-v2', '~> 1.0'
gem 'omniauth-azure-oauth2', '~> 0.0.9' # Deprecated v1 version
gem 'omniauth-cas3', '~> 1.1.4'
gem 'omniauth-dingtalk-oauth2', '~> 1.0'
+gem 'omniauth-alicloud', '~> 1.0.1'
gem 'omniauth-facebook', '~> 4.0.0'
gem 'omniauth-github', '~> 1.4'
gem 'omniauth-gitlab', '~> 1.0.2'
@@ -163,7 +164,7 @@ gem 'org-ruby', '~> 0.9.12'
gem 'creole', '~> 0.5.0'
gem 'wikicloth', '0.8.1'
gem 'asciidoctor', '~> 2.0.10'
-gem 'asciidoctor-include-ext', '~> 0.3.1', require: false
+gem 'asciidoctor-include-ext', '~> 0.4.0', require: false
gem 'asciidoctor-plantuml', '~> 0.0.12'
gem 'asciidoctor-kroki', '~> 0.5.0', require: false
gem 'rouge', '~> 3.27.0'
@@ -285,7 +286,7 @@ gem 'fast_blank'
gem 'gitlab-chronic', '~> 0.10.5'
gem 'gitlab_chronic_duration', '~> 0.10.6.2'
-gem 'rack-proxy', '~> 0.6.0'
+gem 'rack-proxy', '~> 0.7.2'
gem 'sassc-rails', '~> 2.1.0'
gem 'autoprefixer-rails', '10.2.5.1'
@@ -344,7 +345,7 @@ gem 'warning', '~> 1.2.0'
group :development do
gem 'lefthook', '~> 0.7.0', require: false
- gem 'solargraph', '~> 0.43', require: false
+ gem 'solargraph', '~> 0.44.3', require: false
gem 'letter_opener_web', '~> 2.0.0'
@@ -389,7 +390,7 @@ group :development, :test do
gem 'knapsack', '~> 1.21.1'
gem 'crystalball', '~> 0.7.0', require: false
- gem 'simple_po_parser', '~> 1.1.2', require: false
+ gem 'simple_po_parser', '~> 1.1.6', require: false
gem 'timecop', '~> 0.9.1'
@@ -403,7 +404,7 @@ group :development, :test do
end
group :development, :test, :danger do
- gem 'gitlab-dangerfiles', '~> 2.11.0', require: false
+ gem 'gitlab-dangerfiles', '~> 3.0', require: false
end
group :development, :test, :coverage do
@@ -481,7 +482,7 @@ gem 'ssh_data', '~> 1.2'
gem 'spamcheck', '~> 0.1.0'
# Gitaly GRPC protocol definitions
-gem 'gitaly', '~> 14.9.0.pre.rc4'
+gem 'gitaly', '~> 14.10.0-rc1'
# KAS GRPC protocol definitions
gem 'kas-grpc', '~> 0.0.2'
@@ -497,7 +498,7 @@ gem 'flipper', '~> 0.21.0'
gem 'flipper-active_record', '~> 0.21.0'
gem 'flipper-active_support_cache_store', '~> 0.21.0'
gem 'unleash', '~> 3.2.2'
-gem 'gitlab-experiment', '~> 0.7.0'
+gem 'gitlab-experiment', '~> 0.7.1'
# Structured logging
gem 'lograge', '~> 0.5'
@@ -542,4 +543,4 @@ gem 'ipaddress', '~> 0.8.3'
gem 'parslet', '~> 1.8'
-gem 'ipynbdiff', '0.4.4'
+gem 'ipynbdiff', '0.4.5'
diff --git a/Gemfile.lock b/Gemfile.lock
index f97c2bf67ec..9a67aa1b017 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -11,63 +11,63 @@ GEM
RedCloth (4.3.2)
acme-client (2.0.9)
faraday (>= 0.17, < 2.0.0)
- actioncable (6.1.4.6)
- actionpack (= 6.1.4.6)
- activesupport (= 6.1.4.6)
+ actioncable (6.1.4.7)
+ actionpack (= 6.1.4.7)
+ activesupport (= 6.1.4.7)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailbox (6.1.4.6)
- actionpack (= 6.1.4.6)
- activejob (= 6.1.4.6)
- activerecord (= 6.1.4.6)
- activestorage (= 6.1.4.6)
- activesupport (= 6.1.4.6)
+ actionmailbox (6.1.4.7)
+ actionpack (= 6.1.4.7)
+ activejob (= 6.1.4.7)
+ activerecord (= 6.1.4.7)
+ activestorage (= 6.1.4.7)
+ activesupport (= 6.1.4.7)
mail (>= 2.7.1)
- actionmailer (6.1.4.6)
- actionpack (= 6.1.4.6)
- actionview (= 6.1.4.6)
- activejob (= 6.1.4.6)
- activesupport (= 6.1.4.6)
+ actionmailer (6.1.4.7)
+ actionpack (= 6.1.4.7)
+ actionview (= 6.1.4.7)
+ activejob (= 6.1.4.7)
+ activesupport (= 6.1.4.7)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
- actionpack (6.1.4.6)
- actionview (= 6.1.4.6)
- activesupport (= 6.1.4.6)
+ actionpack (6.1.4.7)
+ actionview (= 6.1.4.7)
+ activesupport (= 6.1.4.7)
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.4.6)
- actionpack (= 6.1.4.6)
- activerecord (= 6.1.4.6)
- activestorage (= 6.1.4.6)
- activesupport (= 6.1.4.6)
+ actiontext (6.1.4.7)
+ actionpack (= 6.1.4.7)
+ activerecord (= 6.1.4.7)
+ activestorage (= 6.1.4.7)
+ activesupport (= 6.1.4.7)
nokogiri (>= 1.8.5)
- actionview (6.1.4.6)
- activesupport (= 6.1.4.6)
+ actionview (6.1.4.7)
+ activesupport (= 6.1.4.7)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
- activejob (6.1.4.6)
- activesupport (= 6.1.4.6)
+ activejob (6.1.4.7)
+ activesupport (= 6.1.4.7)
globalid (>= 0.3.6)
- activemodel (6.1.4.6)
- activesupport (= 6.1.4.6)
- activerecord (6.1.4.6)
- activemodel (= 6.1.4.6)
- activesupport (= 6.1.4.6)
+ activemodel (6.1.4.7)
+ activesupport (= 6.1.4.7)
+ activerecord (6.1.4.7)
+ activemodel (= 6.1.4.7)
+ activesupport (= 6.1.4.7)
activerecord-explain-analyze (0.1.0)
activerecord (>= 4)
pg
- activestorage (6.1.4.6)
- actionpack (= 6.1.4.6)
- activejob (= 6.1.4.6)
- activerecord (= 6.1.4.6)
- activesupport (= 6.1.4.6)
+ activestorage (6.1.4.7)
+ actionpack (= 6.1.4.7)
+ activejob (= 6.1.4.7)
+ activerecord (= 6.1.4.7)
+ activesupport (= 6.1.4.7)
marcel (~> 1.0.0)
mini_mime (>= 1.1.0)
- activesupport (6.1.4.6)
+ activesupport (6.1.4.7)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
@@ -89,7 +89,7 @@ GEM
faraday_middleware-multi_json (~> 0.0)
oauth2 (~> 1.4)
asciidoctor (2.0.15)
- asciidoctor-include-ext (0.3.1)
+ asciidoctor-include-ext (0.4.0)
asciidoctor (>= 1.5.6, < 3.0.0)
asciidoctor-kroki (0.5.0)
asciidoctor (~> 2.0)
@@ -137,7 +137,7 @@ GEM
base32 (0.3.2)
batch-loader (2.0.1)
bcrypt (3.1.16)
- benchmark (0.1.1)
+ benchmark (0.2.0)
benchmark-ips (2.3.0)
benchmark-malloc (0.2.0)
benchmark-memory (0.1.2)
@@ -203,7 +203,7 @@ GEM
coderay (1.1.3)
colored2 (3.1.2)
commonmarker (0.23.4)
- concurrent-ruby (1.1.9)
+ concurrent-ruby (1.1.10)
connection_pool (2.2.5)
contracts (0.11.0)
cork (0.3.0)
@@ -224,7 +224,7 @@ GEM
css_parser (1.7.0)
addressable
daemons (1.3.1)
- danger (8.4.5)
+ danger (8.5.0)
claide (~> 1.0)
claide-plugins (>= 0.9.2)
colored2 (~> 3.1)
@@ -455,7 +455,7 @@ GEM
rails (>= 3.2.0)
git (1.7.0)
rchardet (~> 1.8)
- gitaly (14.9.0.pre.rc4)
+ gitaly (14.10.0.pre.rc1)
grpc (~> 1.0)
github-markup (1.7.0)
gitlab (4.16.1)
@@ -463,10 +463,11 @@ GEM
terminal-table (~> 1.5, >= 1.5.1)
gitlab-chronic (0.10.5)
numerizer (~> 0.2)
- gitlab-dangerfiles (2.11.0)
+ gitlab-dangerfiles (3.0.0)
danger (>= 8.4.5)
danger-gitlab (>= 8.0.0)
- gitlab-experiment (0.7.0)
+ rake
+ gitlab-experiment (0.7.1)
activesupport (>= 3.0)
request_store (>= 1.0)
gitlab-fog-azure-rm (1.2.0)
@@ -533,7 +534,7 @@ GEM
signet (~> 0.12)
google-cloud-env (1.5.0)
faraday (>= 0.17.3, < 2.0)
- google-protobuf (3.19.1)
+ google-protobuf (3.19.4)
googleapis-common-protos-types (1.3.0)
google-protobuf (~> 3.14)
googleauth (0.14.0)
@@ -654,7 +655,7 @@ GEM
invisible_captcha (1.1.0)
rails (>= 4.2)
ipaddress (0.8.3)
- ipynbdiff (0.4.4)
+ ipynbdiff (0.4.5)
diffy (~> 3.3)
json (~> 2.5, >= 2.5.1)
jaeger-client (1.1.0)
@@ -736,7 +737,7 @@ GEM
activesupport (>= 4)
railties (>= 4)
request_store (~> 1.0)
- loofah (2.12.0)
+ loofah (2.16.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
lru_redux (1.1.0)
@@ -755,8 +756,8 @@ GEM
mime-types-data (3.2020.0512)
mini_histogram (0.3.1)
mini_magick (4.10.1)
- mini_mime (1.1.1)
- mini_portile2 (2.6.1)
+ mini_mime (1.1.2)
+ mini_portile2 (2.8.0)
minitest (5.11.3)
mixlib-cli (2.1.8)
mixlib-config (3.0.9)
@@ -794,8 +795,8 @@ GEM
netrc (0.11.0)
nio4r (2.5.8)
no_proxy_fix (0.1.2)
- nokogiri (1.12.5)
- mini_portile2 (~> 2.6.1)
+ nokogiri (1.13.3)
+ mini_portile2 (~> 2.8.0)
racc (~> 1.4)
notiffany (0.1.3)
nenv (~> 0.1)
@@ -828,6 +829,8 @@ GEM
omniauth (1.9.1)
hashie (>= 3.4.6)
rack (>= 1.6.2, < 3)
+ omniauth-alicloud (1.0.1)
+ omniauth-oauth2 (~> 1.7.1)
omniauth-atlassian-oauth2 (0.2.0)
omniauth (>= 1.1.1)
omniauth-oauth2 (>= 1.5)
@@ -968,25 +971,25 @@ GEM
httpclient
json-jwt (>= 1.11.0)
rack (>= 2.1.0)
- rack-proxy (0.6.0)
+ rack-proxy (0.7.2)
rack
rack-test (1.1.0)
rack (>= 1.0, < 3)
rack-timeout (0.5.2)
- rails (6.1.4.6)
- actioncable (= 6.1.4.6)
- actionmailbox (= 6.1.4.6)
- actionmailer (= 6.1.4.6)
- actionpack (= 6.1.4.6)
- actiontext (= 6.1.4.6)
- actionview (= 6.1.4.6)
- activejob (= 6.1.4.6)
- activemodel (= 6.1.4.6)
- activerecord (= 6.1.4.6)
- activestorage (= 6.1.4.6)
- activesupport (= 6.1.4.6)
+ rails (6.1.4.7)
+ actioncable (= 6.1.4.7)
+ actionmailbox (= 6.1.4.7)
+ actionmailer (= 6.1.4.7)
+ actionpack (= 6.1.4.7)
+ actiontext (= 6.1.4.7)
+ actionview (= 6.1.4.7)
+ activejob (= 6.1.4.7)
+ activemodel (= 6.1.4.7)
+ activerecord (= 6.1.4.7)
+ activestorage (= 6.1.4.7)
+ activesupport (= 6.1.4.7)
bundler (>= 1.15.0)
- railties (= 6.1.4.6)
+ railties (= 6.1.4.7)
sprockets-rails (>= 2.0.0)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
@@ -1000,9 +1003,9 @@ GEM
rails-i18n (6.0.0)
i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 7)
- railties (6.1.4.6)
- actionpack (= 6.1.4.6)
- activesupport (= 6.1.4.6)
+ railties (6.1.4.7)
+ actionpack (= 6.1.4.7)
+ activesupport (= 6.1.4.7)
method_source
rake (>= 0.13)
thor (~> 1.0)
@@ -1206,7 +1209,7 @@ GEM
faraday (>= 0.17.3, < 2.0)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
- simple_po_parser (1.1.2)
+ simple_po_parser (1.1.6)
simplecov (0.21.2)
docile (~> 1.1)
simplecov-html (~> 0.11)
@@ -1220,7 +1223,7 @@ GEM
slack-messenger (2.3.4)
snowplow-tracker (0.6.1)
contracts (~> 0.7, <= 0.11)
- solargraph (0.43.0)
+ solargraph (0.44.3)
backport (~> 1.2)
benchmark
bundler (>= 1.17.2)
@@ -1247,11 +1250,11 @@ GEM
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
- sprockets-rails (3.2.2)
- actionpack (>= 4.0)
- activesupport (>= 4.0)
+ sprockets-rails (3.4.2)
+ actionpack (>= 5.2)
+ activesupport (>= 5.2)
sprockets (>= 3.0.0)
- sqlite3 (1.3.13)
+ sqlite3 (1.4.2)
ssh_data (1.2.0)
ssrf_filter (1.0.7)
stackprof (0.2.15)
@@ -1417,7 +1420,7 @@ DEPENDENCIES
apollo_upload_server (~> 2.1.0)
asana (~> 0.10.3)
asciidoctor (~> 2.0.10)
- asciidoctor-include-ext (~> 0.3.1)
+ asciidoctor-include-ext (~> 0.4.0)
asciidoctor-kroki (~> 0.5.0)
asciidoctor-plantuml (~> 0.0.12)
atlassian-jwt (~> 0.2.0)
@@ -1491,11 +1494,11 @@ DEPENDENCIES
gettext (~> 3.3)
gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3)
- gitaly (~> 14.9.0.pre.rc4)
+ gitaly (~> 14.10.0.pre.rc1)
github-markup (~> 1.7.0)
gitlab-chronic (~> 0.10.5)
- gitlab-dangerfiles (~> 2.11.0)
- gitlab-experiment (~> 0.7.0)
+ gitlab-dangerfiles (~> 3.0)
+ gitlab-experiment (~> 0.7.1)
gitlab-fog-azure-rm (~> 1.2.0)
gitlab-labkit (~> 0.22.0)
gitlab-license (~> 2.1.0)
@@ -1535,7 +1538,7 @@ DEPENDENCIES
icalendar
invisible_captcha (~> 1.1.0)
ipaddress (~> 0.8.3)
- ipynbdiff (= 0.4.4)
+ ipynbdiff (= 0.4.5)
jira-ruby (~> 2.1.4)
js_regex (~> 3.7)
json (~> 2.5.1)
@@ -1569,6 +1572,7 @@ DEPENDENCIES
ohai (~> 16.10)
oj (~> 3.10.6)
omniauth (~> 1.8)
+ omniauth-alicloud (~> 1.0.1)
omniauth-atlassian-oauth2 (~> 0.2.0)
omniauth-auth0 (~> 2.0.0)
omniauth-authentiq (~> 0.3.3)
@@ -1605,9 +1609,9 @@ DEPENDENCIES
rack-attack (~> 6.3.0)
rack-cors (~> 1.0.6)
rack-oauth2 (~> 1.16.0)
- rack-proxy (~> 0.6.0)
+ rack-proxy (~> 0.7.2)
rack-timeout (~> 0.5.1)
- rails (~> 6.1.4.6)
+ rails (~> 6.1.4.7)
rails-controller-testing
rails-i18n (~> 6.0)
rainbow (~> 3.0)
@@ -1652,13 +1656,13 @@ DEPENDENCIES
sidekiq (~> 6.4)
sidekiq-cron (~> 1.2)
sigdump (~> 0.2.4)
- simple_po_parser (~> 1.1.2)
+ simple_po_parser (~> 1.1.6)
simplecov (~> 0.21)
simplecov-cobertura (~> 1.3.1)
simplecov-lcov (~> 0.8.0)
slack-messenger (~> 2.3.4)
snowplow-tracker (~> 0.6.1)
- solargraph (~> 0.43)
+ solargraph (~> 0.44.3)
spamcheck (~> 0.1.0)
spring (~> 2.1.0)
spring-commands-rspec (~> 1.0.4)
diff --git a/Rakefile b/Rakefile
index 9545516d2a9..9a651fda7a0 100755
--- a/Rakefile
+++ b/Rakefile
@@ -16,3 +16,6 @@ require File.expand_path('config/initializers/01_active_record_database_tasks_co
Gitlab::Application.load_tasks
Knapsack.load_tasks if defined?(Knapsack)
+
+require 'gitlab-dangerfiles'
+Gitlab::Dangerfiles.load_tasks
diff --git a/app/assets/images/auth_buttons/alicloud_64.png b/app/assets/images/auth_buttons/alicloud_64.png
new file mode 100644
index 00000000000..bd67a199e13
--- /dev/null
+++ b/app/assets/images/auth_buttons/alicloud_64.png
Binary files differ
diff --git a/app/assets/images/checkmark.png b/app/assets/images/checkmark.png
deleted file mode 100644
index 6e47fda5cdc..00000000000
--- a/app/assets/images/checkmark.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/learn_gitlab/graduation_hat.svg b/app/assets/images/learn_gitlab/graduation_hat.svg
deleted file mode 100644
index 998d8d9b935..00000000000
--- a/app/assets/images/learn_gitlab/graduation_hat.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="16" height="17" xmlns="http://www.w3.org/2000/svg"><path fill="#fffff" d="M1.53 7.639l-.476.88.476-.88zm0-1.758L1.054 5l.476.88zm2.257 2.982h1v-.596l-.523-.283-.477.879zm8.424 0l-.476-.88-.524.284v.596h1zm2.257-1.224l.477.88-.477-.88zm0-1.758l-.476.879.476-.88zM8.476 2.632l-.477.88.477-.88zm-.953 0l.476.88-.476-.88zM2.007 6.76l-.953-1.758c-1.396.756-1.396 2.76 0 3.516l.953-1.758zm2.257 1.224L2.007 6.76l-.953 1.758L3.31 9.742l.953-1.758zm.523 1.995V8.863h-2v1.116h2zM8 12.5c-1.949 0-3.212-1.289-3.212-2.52h-2c0 2.656 2.51 4.52 5.212 4.52v-2zm3.212-2.52c0 1.231-1.262 2.52-3.212 2.52v2c2.704 0 5.212-1.864 5.212-4.52h-2zm0-1.117v1.116h2V8.863h-2zm2.78-2.103l-2.256 1.223.953 1.759 2.257-1.224-.953-1.758zm0 0l.954 1.758c1.396-.757 1.396-2.76 0-3.516l-.953 1.758zM8 3.51l5.993 3.249.953-1.758-5.993-3.249L8 3.511zm0 0l.953-1.758a2 2 0 00-1.906 0L8 3.511zM2.007 6.76l5.992-3.25-.953-1.758-5.992 3.249.953 1.758z"/><path fill="#fffff" d="M7.228 7.541c-.187-.112-.277-.427-.201-.704.076-.276.288-.41.475-.297L11 8.644v5.316c0 .298-.163.54-.365.54-.2 0-.364-.242-.364-.54V9.37L7.228 7.54z"/></svg> \ No newline at end of file
diff --git a/app/assets/javascripts/access_tokens/graphql/queries/get_projects.query.graphql b/app/assets/javascripts/access_tokens/graphql/queries/get_projects.query.graphql
index cdc8a952ead..a5fc70b9ca6 100644
--- a/app/assets/javascripts/access_tokens/graphql/queries/get_projects.query.graphql
+++ b/app/assets/javascripts/access_tokens/graphql/queries/get_projects.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query accessTokensGetProjects(
$search: String = ""
diff --git a/app/assets/javascripts/admin/topics/components/remove_avatar.vue b/app/assets/javascripts/admin/topics/components/remove_avatar.vue
index 5e94d6185e0..a54c30a8336 100644
--- a/app/assets/javascripts/admin/topics/components/remove_avatar.vue
+++ b/app/assets/javascripts/admin/topics/components/remove_avatar.vue
@@ -1,6 +1,6 @@
<script>
import { uniqueId } from 'lodash';
-import { GlButton, GlModal, GlModalDirective } from '@gitlab/ui';
+import { GlButton, GlModal, GlModalDirective, GlSprintf } from '@gitlab/ui';
import { __ } from '~/locale';
import csrf from '~/lib/utils/csrf';
@@ -8,11 +8,12 @@ export default {
components: {
GlButton,
GlModal,
+ GlSprintf,
},
directives: {
GlModal: GlModalDirective,
},
- inject: ['path'],
+ inject: ['path', 'name'],
data() {
return {
modalId: uniqueId('remove-topic-avatar-'),
@@ -25,8 +26,8 @@ export default {
},
i18n: {
remove: __('Remove avatar'),
- title: __('Confirm remove avatar'),
- body: __('Avatar will be removed. Are you sure?'),
+ title: __('Remove topic avatar'),
+ body: __('Topic avatar for %{name} will be removed. This cannot be undone.'),
},
modal: {
actionPrimary: {
@@ -57,7 +58,9 @@ export default {
:modal-id="modalId"
size="sm"
@primary="deleteApplication"
- >{{ $options.i18n.body }}
+ ><gl-sprintf :message="$options.i18n.body"
+ ><template #name>{{ name }}</template></gl-sprintf
+ >
<form ref="deleteForm" method="post" :action="path">
<input type="hidden" name="_method" value="delete" />
<input type="hidden" name="authenticity_token" :value="$options.csrf.token" />
diff --git a/app/assets/javascripts/admin/topics/index.js b/app/assets/javascripts/admin/topics/index.js
index 8fbcadf3369..09e9b20f220 100644
--- a/app/assets/javascripts/admin/topics/index.js
+++ b/app/assets/javascripts/admin/topics/index.js
@@ -8,12 +8,13 @@ export default () => {
return false;
}
- const { path } = el.dataset;
+ const { path, name } = el.dataset;
return new Vue({
el,
provide: {
path,
+ name,
},
render(h) {
return h(RemoveAvatar);
diff --git a/app/assets/javascripts/admin/users/components/actions/delete.vue b/app/assets/javascripts/admin/users/components/actions/delete.vue
index e6dde5898e7..ae0c6731271 100644
--- a/app/assets/javascripts/admin/users/components/actions/delete.vue
+++ b/app/assets/javascripts/admin/users/components/actions/delete.vue
@@ -1,9 +1,11 @@
<script>
-import SharedDeleteAction from './shared/shared_delete_action.vue';
+import { GlDropdownItem } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import eventHub, { EVENT_OPEN_DELETE_USER_MODAL } from '../modals/delete_user_modal_event_hub';
export default {
components: {
- SharedDeleteAction,
+ GlDropdownItem,
},
props: {
username: {
@@ -20,17 +22,32 @@ export default {
default: () => [],
},
},
+ methods: {
+ onClick() {
+ const { username, paths, userDeletionObstacles } = this;
+ eventHub.$emit(EVENT_OPEN_DELETE_USER_MODAL, {
+ username,
+ blockPath: paths.block,
+ deletePath: paths.delete,
+ userDeletionObstacles,
+ i18n: {
+ title: s__('AdminUsers|Delete User %{username}?'),
+ primaryButtonLabel: s__('AdminUsers|Delete user'),
+ messageBody: s__(`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.`),
+ },
+ });
+ },
+ },
};
</script>
<template>
- <shared-delete-action
- modal-type="delete"
- :username="username"
- :paths="paths"
- :delete-path="paths.delete"
- :user-deletion-obstacles="userDeletionObstacles"
- >
- <slot></slot>
- </shared-delete-action>
+ <gl-dropdown-item @click="onClick">
+ <span class="gl-text-red-500">
+ <slot></slot>
+ </span>
+ </gl-dropdown-item>
</template>
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 bd920a91516..a39df1cbfb6 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
@@ -1,9 +1,11 @@
<script>
-import SharedDeleteAction from './shared/shared_delete_action.vue';
+import { GlDropdownItem } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import eventHub, { EVENT_OPEN_DELETE_USER_MODAL } from '../modals/delete_user_modal_event_hub';
export default {
components: {
- SharedDeleteAction,
+ GlDropdownItem,
},
props: {
username: {
@@ -20,17 +22,32 @@ export default {
default: () => [],
},
},
+ methods: {
+ onClick() {
+ const { username, paths, userDeletionObstacles } = this;
+ eventHub.$emit(EVENT_OPEN_DELETE_USER_MODAL, {
+ username,
+ blockPath: paths.block,
+ deletePath: paths.deleteWithContributions,
+ userDeletionObstacles,
+ i18n: {
+ title: s__('AdminUsers|Delete User %{username} and contributions?'),
+ primaryButtonLabel: s__('AdminUsers|Delete user and contributions'),
+ messageBody: s__(`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.`),
+ },
+ });
+ },
+ },
};
</script>
<template>
- <shared-delete-action
- modal-type="delete-with-contributions"
- :username="username"
- :paths="paths"
- :delete-path="paths.deleteWithContributions"
- :user-deletion-obstacles="userDeletionObstacles"
- >
- <slot></slot>
- </shared-delete-action>
+ <gl-dropdown-item @click="onClick">
+ <span class="gl-text-red-500">
+ <slot></slot>
+ </span>
+ </gl-dropdown-item>
</template>
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
deleted file mode 100644
index c9f29b55dbf..00000000000
--- a/app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue
+++ /dev/null
@@ -1,52 +0,0 @@
-<script>
-import { GlDropdownItem } from '@gitlab/ui';
-
-export default {
- components: {
- GlDropdownItem,
- },
- props: {
- username: {
- type: String,
- required: true,
- },
- paths: {
- type: Object,
- required: true,
- },
- deletePath: {
- type: String,
- required: true,
- },
- modalType: {
- type: String,
- required: true,
- },
- userDeletionObstacles: {
- type: Array,
- required: true,
- },
- },
- computed: {
- modalAttributes() {
- return {
- 'data-block-user-url': this.paths.block,
- 'data-delete-user-url': this.deletePath,
- 'data-gl-modal-action': this.modalType,
- 'data-username': this.username,
- 'data-user-deletion-obstacles': JSON.stringify(this.userDeletionObstacles),
- };
- },
- },
-};
-</script>
-
-<template>
- <div class="js-delete-user-modal-button" v-bind="{ ...modalAttributes }">
- <gl-dropdown-item>
- <span class="gl-text-red-500">
- <slot></slot>
- </span>
- </gl-dropdown-item>
- </div>
-</template>
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 d7c08096376..31fe86775ee 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
@@ -1,8 +1,8 @@
<script>
import { GlModal, GlButton, GlFormInput, GlSprintf } from '@gitlab/ui';
-import * as Sentry from '@sentry/browser';
import { s__, sprintf } from '~/locale';
import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
+import eventHub, { EVENT_OPEN_DELETE_USER_MODAL } from './delete_user_modal_event_hub';
export default {
components: {
@@ -13,47 +13,23 @@ export default {
UserDeletionObstaclesList,
},
props: {
- title: {
- type: String,
- required: true,
- },
- content: {
- type: String,
- required: true,
- },
- action: {
- type: String,
- required: true,
- },
- secondaryAction: {
- type: String,
- required: true,
- },
- deleteUserUrl: {
- type: String,
- required: true,
- },
- blockUserUrl: {
- type: String,
- required: true,
- },
- username: {
- type: String,
- required: true,
- },
csrfToken: {
type: String,
required: true,
},
- userDeletionObstacles: {
- type: String,
- required: false,
- default: '[]',
- },
},
data() {
return {
enteredUsername: '',
+ username: '',
+ blockPath: '',
+ deletePath: '',
+ userDeletionObstacles: [],
+ i18n: {
+ title: '',
+ primaryButtonLabel: '',
+ messageBody: '',
+ },
};
},
computed: {
@@ -61,75 +37,80 @@ export default {
return this.username.trim();
},
modalTitle() {
- return sprintf(this.title, { username: this.trimmedUsername }, false);
- },
- secondaryButtonLabel() {
- return s__('AdminUsers|Block user');
+ return sprintf(this.i18n.title, { username: this.trimmedUsername }, false);
},
canSubmit() {
- return this.enteredUsername === this.trimmedUsername;
+ return this.enteredUsername && this.enteredUsername === this.trimmedUsername;
},
- obstacles() {
- try {
- return JSON.parse(this.userDeletionObstacles);
- } catch (e) {
- Sentry.captureException(e);
- }
- return [];
+ secondaryButtonLabel() {
+ return s__('AdminUsers|Block user');
},
},
+ mounted() {
+ eventHub.$on(EVENT_OPEN_DELETE_USER_MODAL, this.onOpenEvent);
+ },
+ destroyed() {
+ eventHub.$off(EVENT_OPEN_DELETE_USER_MODAL, this.onOpenEvent);
+ },
methods: {
- show() {
+ onOpenEvent({ username, blockPath, deletePath, userDeletionObstacles, i18n }) {
+ this.username = username;
+ this.blockPath = blockPath;
+ this.deletePath = deletePath;
+ this.userDeletionObstacles = userDeletionObstacles;
+ this.i18n = i18n;
+ this.openModal();
+ },
+ openModal() {
this.$refs.modal.show();
},
+ onSubmit() {
+ this.$refs.form.submit();
+ this.enteredUsername = '';
+ },
onCancel() {
this.enteredUsername = '';
this.$refs.modal.hide();
},
onSecondaryAction() {
const { form } = this.$refs;
-
- form.action = this.blockUserUrl;
+ form.action = this.blockPath;
this.$refs.method.value = 'put';
-
form.submit();
},
- onSubmit() {
- this.$refs.form.submit();
- this.enteredUsername = '';
- },
},
};
</script>
-
<template>
<gl-modal ref="modal" modal-id="delete-user-modal" :title="modalTitle" kind="danger">
<p>
- <gl-sprintf :message="content">
+ <gl-sprintf :message="i18n.messageBody">
<template #username>
- <strong>{{ trimmedUsername }}</strong>
+ <strong data-testid="message-username">{{ trimmedUsername }}</strong>
</template>
- <template #strong="props">
- <strong>{{ props.content }}</strong>
+ <template #strong="{ content }">
+ <strong>{{ content }}</strong>
</template>
</gl-sprintf>
</p>
<user-deletion-obstacles-list
- v-if="obstacles.length"
- :obstacles="obstacles"
+ v-if="userDeletionObstacles.length"
+ :obstacles="userDeletionObstacles"
:user-name="trimmedUsername"
/>
<p>
<gl-sprintf :message="s__('AdminUsers|To confirm, type %{username}')">
<template #username>
- <code class="gl-white-space-pre-wrap">{{ trimmedUsername }}</code>
+ <code data-testid="confirm-username" class="gl-white-space-pre-wrap">{{
+ trimmedUsername
+ }}</code>
</template>
</gl-sprintf>
</p>
- <form ref="form" :action="deleteUserUrl" method="post" @submit.prevent>
+ <form ref="form" :action="deletePath" method="post" @submit.prevent>
<input ref="method" type="hidden" name="_method" value="delete" />
<input :value="csrfToken" type="hidden" name="authenticity_token" />
<gl-form-input
@@ -140,6 +121,7 @@ export default {
autocomplete="off"
/>
</form>
+
<template #modal-footer>
<gl-button @click="onCancel">{{ __('Cancel') }}</gl-button>
<gl-button
@@ -148,10 +130,10 @@ export default {
variant="danger"
@click="onSecondaryAction"
>
- {{ secondaryAction }}
+ {{ secondaryButtonLabel }}
</gl-button>
<gl-button :disabled="!canSubmit" category="primary" variant="danger" @click="onSubmit">{{
- action
+ i18n.primaryButtonLabel
}}</gl-button>
</template>
</gl-modal>
diff --git a/app/assets/javascripts/admin/users/components/modals/delete_user_modal_event_hub.js b/app/assets/javascripts/admin/users/components/modals/delete_user_modal_event_hub.js
new file mode 100644
index 00000000000..001061dcc6b
--- /dev/null
+++ b/app/assets/javascripts/admin/users/components/modals/delete_user_modal_event_hub.js
@@ -0,0 +1,5 @@
+import createEventHub from '~/helpers/event_hub_factory';
+
+export default createEventHub();
+
+export const EVENT_OPEN_DELETE_USER_MODAL = Symbol('OPEN');
diff --git a/app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue b/app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue
deleted file mode 100644
index 1dfea3f1e7b..00000000000
--- a/app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-<script>
-import DeleteUserModal from './delete_user_modal.vue';
-
-export default {
- components: { DeleteUserModal },
- props: {
- modalConfiguration: {
- required: true,
- type: Object,
- },
- csrfToken: {
- required: true,
- type: String,
- },
- selector: {
- required: true,
- type: String,
- },
- },
- data() {
- return {
- currentModalData: null,
- };
- },
- computed: {
- activeModal() {
- return Boolean(this.currentModalData);
- },
-
- modalProps() {
- const { glModalAction: requestedAction } = this.currentModalData;
- return {
- ...this.modalConfiguration[requestedAction],
- ...this.currentModalData,
- csrfToken: this.csrfToken,
- };
- },
- },
-
- mounted() {
- /*
- * Here we're looking for every button that needs to launch a modal
- * on click, and then attaching a click event handler to show the modal
- * if it's correctly configured.
- *
- * TODO: Replace this with integrated modal components https://gitlab.com/gitlab-org/gitlab/-/issues/320922
- */
- document.querySelectorAll(this.selector).forEach((button) => {
- button.addEventListener('click', (e) => {
- if (!button.dataset.glModalAction) return;
-
- e.preventDefault();
- this.show(button.dataset);
- });
- });
- },
-
- methods: {
- show(modalData) {
- const { glModalAction: requestedAction } = modalData;
-
- if (!this.modalConfiguration[requestedAction]) {
- throw new Error(`Modal action ${requestedAction} has no configuration in HTML`);
- }
-
- this.currentModalData = modalData;
-
- return this.$nextTick().then(() => {
- this.$refs.modal.show();
- });
- },
- },
-};
-</script>
-<template>
- <delete-user-modal v-if="activeModal" ref="modal" v-bind="modalProps" />
-</template>
diff --git a/app/assets/javascripts/admin/users/constants.js b/app/assets/javascripts/admin/users/constants.js
index 4636c8705a5..9cd61d6b1db 100644
--- a/app/assets/javascripts/admin/users/constants.js
+++ b/app/assets/javascripts/admin/users/constants.js
@@ -20,9 +20,3 @@ export const I18N_USER_ACTIONS = {
ban: s__('AdminUsers|Ban user'),
unban: s__('AdminUsers|Unban user'),
};
-
-export const CONFIRM_DELETE_BUTTON_SELECTOR = '.js-delete-user-modal-button';
-
-export const MODAL_TEXTS_CONTAINER_SELECTOR = '#js-modal-texts';
-
-export const MODAL_MANAGER_SELECTOR = '#js-delete-user-modal';
diff --git a/app/assets/javascripts/admin/users/index.js b/app/assets/javascripts/admin/users/index.js
index 0c485d2a239..2bd37d3fffe 100644
--- a/app/assets/javascripts/admin/users/index.js
+++ b/app/assets/javascripts/admin/users/index.js
@@ -4,13 +4,8 @@ import createDefaultClient from '~/lib/graphql';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import csrf from '~/lib/utils/csrf';
import AdminUsersApp from './components/app.vue';
-import ModalManager from './components/modals/user_modal_manager.vue';
+import DeleteUserModal from './components/modals/delete_user_modal.vue';
import UserActions from './components/user_actions.vue';
-import {
- CONFIRM_DELETE_BUTTON_SELECTOR,
- MODAL_TEXTS_CONTAINER_SELECTOR,
- MODAL_MANAGER_SELECTOR,
-} from './constants';
Vue.use(VueApollo);
@@ -46,43 +41,13 @@ export const initAdminUserActions = (el = document.querySelector('#js-admin-user
initApp(el, UserActions, 'user', { showButtonLabels: true });
export const initDeleteUserModals = () => {
- const modalsMountElement = document.querySelector(MODAL_TEXTS_CONTAINER_SELECTOR);
-
- if (!modalsMountElement) {
- return;
- }
-
- const modalConfiguration = Array.from(modalsMountElement.children).reduce((accumulator, node) => {
- const { modal, ...config } = node.dataset;
-
- return {
- ...accumulator,
- [modal]: {
- title: node.dataset.title,
- ...config,
- content: node.innerHTML,
- },
- };
- }, {});
-
- // eslint-disable-next-line no-new
- new Vue({
- el: MODAL_MANAGER_SELECTOR,
+ return new Vue({
functional: true,
- methods: {
- show(...args) {
- this.$refs.manager.show(...args);
- },
- },
- render(h) {
- return h(ModalManager, {
- ref: 'manager',
+ render: (createElement) =>
+ createElement(DeleteUserModal, {
props: {
- selector: CONFIRM_DELETE_BUTTON_SELECTOR,
- modalConfiguration,
csrfToken: csrf.token,
},
- });
- },
- });
+ }),
+ }).$mount();
};
diff --git a/app/assets/javascripts/analytics/devops_reports/components/service_ping_disabled.vue b/app/assets/javascripts/analytics/devops_reports/components/service_ping_disabled.vue
index 400326e41e1..b9501107e37 100644
--- a/app/assets/javascripts/analytics/devops_reports/components/service_ping_disabled.vue
+++ b/app/assets/javascripts/analytics/devops_reports/components/service_ping_disabled.vue
@@ -43,7 +43,7 @@ export default {
{{ s__('ServicePing|Turn on service ping to review instance-level analytics.') }}
</p>
- <gl-button category="primary" variant="success" :href="primaryButtonPath">
+ <gl-button category="primary" variant="confirm" :href="primaryButtonPath">
{{ s__('ServicePing|Turn on service ping') }}
</gl-button>
</template>
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 b3ae671d611..b2b033de75d 100644
--- a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
+++ b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
@@ -11,6 +11,7 @@ import {
import { debounce } from 'lodash';
import { filterBySearchTerm } from '~/analytics/shared/utils';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { n__, s__, __ } from '~/locale';
import getProjects from '../graphql/projects.query.graphql';
@@ -204,6 +205,7 @@ export default {
return getIdFromGraphQLId(project.id);
},
},
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
<template>
@@ -227,7 +229,7 @@ export default {
:entity-id="getEntityId(selectedProjects[0])"
:entity-name="selectedProjects[0].name"
:size="16"
- shape="rect"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
:alt="selectedProjects[0].name"
class="gl-display-inline-flex gl-vertical-align-middle gl-mr-2"
/>
@@ -255,7 +257,7 @@ export default {
:entity-id="getEntityId(project)"
:entity-name="project.name"
:src="project.avatarUrl"
- shape="rect"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
/>
<div>
<div data-testid="project-name">{{ project.name }}</div>
@@ -279,7 +281,7 @@ export default {
:entity-id="getEntityId(project)"
:entity-name="project.name"
:src="project.avatarUrl"
- shape="rect"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
/>
<div>
<div data-testid="project-name">{{ project.name }}</div>
diff --git a/app/assets/javascripts/analytics/shared/utils.js b/app/assets/javascripts/analytics/shared/utils.js
index dde429ab278..71b7ca29bad 100644
--- a/app/assets/javascripts/analytics/shared/utils.js
+++ b/app/assets/javascripts/analytics/shared/utils.js
@@ -19,6 +19,7 @@ export const toYmd = (date) => dateFormat(date, dateFormats.isoDate);
* @returns {Object}
*/
export const extractFilterQueryParameters = (url = '') => {
+ /* eslint-disable camelcase */
const {
source_branch_name = null,
target_branch_name = null,
@@ -27,6 +28,7 @@ export const extractFilterQueryParameters = (url = '') => {
assignee_username = [],
label_name = [],
} = urlQueryToFilter(url);
+ /* eslint-enable camelcase */
return {
selectedSourceBranch: source_branch_name,
diff --git a/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql
index 2a5546efb68..f9311626cc3 100644
--- a/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/usage_count.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
#import "../fragments/count.fragment.graphql"
query getCount($identifier: MeasurementIdentifier!, $first: Int, $after: String) {
diff --git a/app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql b/app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql
index 7c02ac49a42..d7638458b03 100644
--- a/app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql
+++ b/app/assets/javascripts/analytics/usage_trends/graphql/queries/users.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
#import "../fragments/count.fragment.graphql"
query getUsersCount($first: Int, $after: String) {
diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js
index 35fc64d43e5..64812e52849 100644
--- a/app/assets/javascripts/api.js
+++ b/app/assets/javascripts/api.js
@@ -42,6 +42,7 @@ const Api = {
projectMergeRequestVersionsPath: '/api/:version/projects/:id/merge_requests/:mrid/versions',
projectRunnersPath: '/api/:version/projects/:id/runners',
projectProtectedBranchesPath: '/api/:version/projects/:id/protected_branches',
+ projectProtectedBranchesNamePath: '/api/:version/projects/:id/protected_branches/:name',
projectSearchPath: '/api/:version/projects/:id/search',
projectSharePath: '/api/:version/projects/:id/share',
projectMilestonesPath: '/api/:version/projects/:id/milestones',
@@ -93,6 +94,7 @@ const Api = {
notificationSettingsPath: '/api/:version/notification_settings',
deployKeysPath: '/api/:version/deploy_keys',
secureFilesPath: '/api/:version/projects/:project_id/secure_files',
+ dependencyProxyPath: '/api/:version/groups/:id/dependency_proxy/cache',
group(groupId, callback = () => {}) {
const url = Api.buildUrl(Api.groupPath).replace(':id', groupId);
@@ -154,13 +156,7 @@ const Api = {
});
},
- addGroupMembersByUserId(id, data) {
- const url = Api.buildUrl(this.groupMembersPath).replace(':id', encodeURIComponent(id));
-
- return axios.post(url, data);
- },
-
- inviteGroupMembersByEmail(id, data) {
+ inviteGroupMembers(id, data) {
const url = Api.buildUrl(this.groupInvitationsPath).replace(':id', encodeURIComponent(id));
return axios.post(url, data);
@@ -234,7 +230,7 @@ const Api = {
return axios
.get(url, {
- params: Object.assign(defaults, options),
+ params: { ...defaults, ...options },
})
.then(({ data, headers }) => {
callback(data);
@@ -256,13 +252,7 @@ const Api = {
.then(({ data }) => data);
},
- addProjectMembersByUserId(id, data) {
- const url = Api.buildUrl(this.projectMembersPath).replace(':id', encodeURIComponent(id));
-
- return axios.post(url, data);
- },
-
- inviteProjectMembersByEmail(id, data) {
+ inviteProjectMembers(id, data) {
const url = Api.buildUrl(this.projectInvitationsPath).replace(':id', encodeURIComponent(id));
return axios.post(url, data);
@@ -371,6 +361,14 @@ const Api = {
.then(({ data }) => data);
},
+ projectProtectedBranch(id, branchName) {
+ const url = Api.buildUrl(Api.projectProtectedBranchesNamePath)
+ .replace(':id', encodeURIComponent(id))
+ .replace(':name', branchName);
+
+ return axios.get(url).then(({ data }) => data);
+ },
+
projectSearch(id, options = {}) {
const url = Api.buildUrl(Api.projectSearchPath).replace(':id', encodeURIComponent(id));
@@ -445,7 +443,7 @@ const Api = {
},
// Return group projects list. Filtered by query
- groupProjects(groupId, query, options, callback) {
+ groupProjects(groupId, query, options, callback = () => {}, useCustomErrorHandler = false) {
const url = Api.buildUrl(Api.groupProjectsPath).replace(':id', groupId);
const defaults = {
search: query,
@@ -455,14 +453,21 @@ const Api = {
.get(url, {
params: { ...defaults, ...options },
})
- .then(({ data }) => (callback ? callback(data) : data))
- .catch(() => {
+ .then(({ data, headers }) => {
+ callback(data);
+
+ return { data, headers };
+ })
+ .catch((error) => {
+ if (useCustomErrorHandler) {
+ throw error;
+ }
+
createFlash({
message: __('Something went wrong while fetching projects'),
});
- if (callback) {
- callback();
- }
+
+ callback();
});
},
@@ -992,6 +997,12 @@ const Api = {
return result;
},
+
+ deleteDependencyProxyCacheList(groupId, options = {}) {
+ const url = Api.buildUrl(this.dependencyProxyPath).replace(':id', groupId);
+
+ return axios.delete(url, { params: { ...options } });
+ },
};
export default Api;
diff --git a/app/assets/javascripts/api/alert_management_alerts_api.js b/app/assets/javascripts/api/alert_management_alerts_api.js
new file mode 100644
index 00000000000..fa66ca5b3dd
--- /dev/null
+++ b/app/assets/javascripts/api/alert_management_alerts_api.js
@@ -0,0 +1,62 @@
+import axios from '~/lib/utils/axios_utils';
+import { buildApiUrl } from '~/api/api_utils';
+import { ContentTypeMultipartFormData } from '~/lib/utils/headers';
+
+const ALERT_METRIC_IMAGES_PATH =
+ '/api/:version/projects/:id/alert_management_alerts/:alert_iid/metric_images';
+const ALERT_SINGLE_METRIC_IMAGE_PATH =
+ '/api/:version/projects/:id/alert_management_alerts/:alert_iid/metric_images/:image_id';
+
+export function fetchAlertMetricImages({ alertIid, id }) {
+ const metricImagesUrl = buildApiUrl(ALERT_METRIC_IMAGES_PATH)
+ .replace(':id', encodeURIComponent(id))
+ .replace(':alert_iid', encodeURIComponent(alertIid));
+
+ return axios.get(metricImagesUrl);
+}
+
+export function uploadAlertMetricImage({ alertIid, id, file, url = null, urlText = null }) {
+ const options = { headers: { ...ContentTypeMultipartFormData } };
+ const metricImagesUrl = buildApiUrl(ALERT_METRIC_IMAGES_PATH)
+ .replace(':id', encodeURIComponent(id))
+ .replace(':alert_iid', encodeURIComponent(alertIid));
+
+ // Construct multipart form data
+ const formData = new FormData();
+ formData.append('file', file);
+ if (url) {
+ formData.append('url', url);
+ }
+ if (urlText) {
+ formData.append('url_text', urlText);
+ }
+
+ return axios.post(metricImagesUrl, formData, options);
+}
+
+export function updateAlertMetricImage({ alertIid, id, imageId, url = null, urlText = null }) {
+ const metricImagesUrl = buildApiUrl(ALERT_SINGLE_METRIC_IMAGE_PATH)
+ .replace(':id', encodeURIComponent(id))
+ .replace(':alert_iid', encodeURIComponent(alertIid))
+ .replace(':image_id', encodeURIComponent(imageId));
+
+ // Construct multipart form data
+ const formData = new FormData();
+ if (url != null) {
+ formData.append('url', url);
+ }
+ if (urlText != null) {
+ formData.append('url_text', urlText);
+ }
+
+ return axios.put(metricImagesUrl, formData);
+}
+
+export function deleteAlertMetricImage({ alertIid, id, imageId }) {
+ const individualMetricImageUrl = buildApiUrl(ALERT_SINGLE_METRIC_IMAGE_PATH)
+ .replace(':id', encodeURIComponent(id))
+ .replace(':alert_iid', encodeURIComponent(alertIid))
+ .replace(':image_id', encodeURIComponent(imageId));
+
+ return axios.delete(individualMetricImageUrl);
+}
diff --git a/app/assets/javascripts/api/projects_api.js b/app/assets/javascripts/api/projects_api.js
index b018db9a02d..7666f558eb5 100644
--- a/app/assets/javascripts/api/projects_api.js
+++ b/app/assets/javascripts/api/projects_api.js
@@ -2,6 +2,8 @@ import { DEFAULT_PER_PAGE } from '~/api';
import axios from '../lib/utils/axios_utils';
import { buildApiUrl } from './api_utils';
+export * from './alert_management_alerts_api';
+
const PROJECTS_PATH = '/api/:version/projects.json';
const PROJECT_IMPORT_MEMBERS_PATH = '/api/:version/projects/:id/import_project_members/:project_id';
diff --git a/app/assets/javascripts/attention_requests/components/navigation_popover.vue b/app/assets/javascripts/attention_requests/components/navigation_popover.vue
index 1542bc9a7e9..804eda8f321 100644
--- a/app/assets/javascripts/attention_requests/components/navigation_popover.vue
+++ b/app/assets/javascripts/attention_requests/components/navigation_popover.vue
@@ -82,7 +82,9 @@ export default {
return 'bottom';
},
},
- docsPage: helpPagePath('development/code_review.html'),
+ docsPage: helpPagePath('user/project/merge_requests/index.md', {
+ anchor: 'request-attention-to-a-merge-request',
+ }),
};
</script>
diff --git a/app/assets/javascripts/behaviors/gl_emoji.js b/app/assets/javascripts/behaviors/gl_emoji.js
index 8fd03d3132d..29204020058 100644
--- a/app/assets/javascripts/behaviors/gl_emoji.js
+++ b/app/assets/javascripts/behaviors/gl_emoji.js
@@ -1,10 +1,4 @@
-import {
- initEmojiMap,
- getEmojiInfo,
- emojiFallbackImageSrc,
- emojiImageTag,
- FALLBACK_EMOJI_KEY,
-} from '../emoji';
+import { initEmojiMap, getEmojiInfo, emojiFallbackImageSrc, emojiImageTag } from '../emoji';
import isEmojiUnicodeSupported from '../emoji/support';
class GlEmoji extends HTMLElement {
@@ -22,10 +16,6 @@ class GlEmoji extends HTMLElement {
if (emojiInfo) {
if (name !== emojiInfo.name) {
- if (emojiInfo.name === FALLBACK_EMOJI_KEY && this.innerHTML) {
- return; // When fallback emoji is used, but there is a <img> provided, use the <img> instead
- }
-
({ name } = emojiInfo);
this.dataset.name = emojiInfo.name;
}
@@ -43,34 +33,29 @@ class GlEmoji extends HTMLElement {
this.childNodes &&
Array.prototype.every.call(this.childNodes, (childNode) => childNode.nodeType === 3);
- if (
- emojiUnicode &&
- isEmojiUnicode &&
- !isEmojiUnicodeSupported(emojiUnicode, unicodeVersion)
- ) {
- const hasImageFallback = fallbackSrc && fallbackSrc.length > 0;
- const hasCssSpriteFallback = fallbackSpriteClass && fallbackSpriteClass.length > 0;
+ const hasImageFallback = fallbackSrc?.length > 0;
+ const hasCssSpriteFallback = fallbackSpriteClass?.length > 0;
- // CSS sprite fallback takes precedence over image fallback
- if (hasCssSpriteFallback) {
- if (!gon.emoji_sprites_css_added && gon.emoji_sprites_css_path) {
- const emojiSpriteLinkTag = document.createElement('link');
- emojiSpriteLinkTag.setAttribute('rel', 'stylesheet');
- emojiSpriteLinkTag.setAttribute('href', gon.emoji_sprites_css_path);
- document.head.appendChild(emojiSpriteLinkTag);
- gon.emoji_sprites_css_added = true;
- }
- // IE 11 doesn't like adding multiple at once :(
- this.classList.add('emoji-icon');
- this.classList.add(fallbackSpriteClass);
- } else if (hasImageFallback) {
- this.innerHTML = '';
- this.appendChild(emojiImageTag(name, fallbackSrc));
- } else {
- const src = emojiFallbackImageSrc(name);
- this.innerHTML = '';
- this.appendChild(emojiImageTag(name, src));
+ if (emojiUnicode && isEmojiUnicode && isEmojiUnicodeSupported(emojiUnicode, unicodeVersion)) {
+ // noop
+ } else if (hasCssSpriteFallback) {
+ if (!gon.emoji_sprites_css_added && gon.emoji_sprites_css_path) {
+ const emojiSpriteLinkTag = document.createElement('link');
+ emojiSpriteLinkTag.setAttribute('rel', 'stylesheet');
+ emojiSpriteLinkTag.setAttribute('href', gon.emoji_sprites_css_path);
+ document.head.appendChild(emojiSpriteLinkTag);
+ gon.emoji_sprites_css_added = true;
}
+ // IE 11 doesn't like adding multiple at once :(
+ this.classList.add('emoji-icon');
+ this.classList.add(fallbackSpriteClass);
+ } else if (hasImageFallback) {
+ this.innerHTML = '';
+ this.appendChild(emojiImageTag(name, fallbackSrc));
+ } else {
+ const src = emojiFallbackImageSrc(name);
+ this.innerHTML = '';
+ this.appendChild(emojiImageTag(name, src));
}
});
}
diff --git a/app/assets/javascripts/behaviors/markdown/render_gfm.js b/app/assets/javascripts/behaviors/markdown/render_gfm.js
index 6236e3bdefc..063393c9cd1 100644
--- a/app/assets/javascripts/behaviors/markdown/render_gfm.js
+++ b/app/assets/javascripts/behaviors/markdown/render_gfm.js
@@ -26,7 +26,7 @@ $.fn.renderGFM = function renderGFM() {
const mrPopoverElements = this.find('.gfm-merge_request').get();
if (mrPopoverElements.length) {
- import(/* webpackChunkName: 'MrPopoverBundle' */ '../../mr_popover')
+ import(/* webpackChunkName: 'MrPopoverBundle' */ '~/mr_popover')
.then(({ default: initMRPopovers }) => {
initMRPopovers(mrPopoverElements);
})
diff --git a/app/assets/javascripts/behaviors/markdown/render_kroki.js b/app/assets/javascripts/behaviors/markdown/render_kroki.js
index 7843df0cd8e..abe71694d73 100644
--- a/app/assets/javascripts/behaviors/markdown/render_kroki.js
+++ b/app/assets/javascripts/behaviors/markdown/render_kroki.js
@@ -51,7 +51,7 @@ export function renderKroki(krokiImages) {
return;
}
- const parent = krokiImage.closest('.js-markdown-code');
+ const parent = krokiImage.parentElement;
// A single Kroki image is processed multiple times for some reason,
// so this condition ensures we only create one alert per Kroki image
diff --git a/app/assets/javascripts/behaviors/secret_values.js b/app/assets/javascripts/behaviors/secret_values.js
index a34d5dcaef8..b6ed14611cd 100644
--- a/app/assets/javascripts/behaviors/secret_values.js
+++ b/app/assets/javascripts/behaviors/secret_values.js
@@ -1,5 +1,5 @@
-import { parseBoolean } from '../lib/utils/common_utils';
-import { n__ } from '../locale';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import { n__ } from '~/locale';
export default class SecretValues {
constructor({
diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
index e58c51104c5..6124befd3b6 100644
--- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
+++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
@@ -4,7 +4,7 @@ import { clickCopyToClipboardButton } from '~/behaviors/copy_to_clipboard';
import { getSelectedFragment } from '~/lib/utils/common_utils';
import { isElementVisible } from '~/lib/utils/dom_utils';
import { DEBOUNCE_DROPDOWN_DELAY } from '~/vue_shared/components/sidebar/labels_select_widget/constants';
-import Sidebar from '../../right_sidebar';
+import Sidebar from '~/right_sidebar';
import { CopyAsGFM } from '../markdown/copy_as_gfm';
import {
keysFor,
@@ -33,10 +33,37 @@ export default class ShortcutsIssuable extends Shortcuts {
Mousetrap.bind(keysFor(ISSUABLE_COMMENT_OR_REPLY), ShortcutsIssuable.replyWithSelectedText);
Mousetrap.bind(keysFor(ISSUABLE_EDIT_DESCRIPTION), ShortcutsIssuable.editIssue);
Mousetrap.bind(keysFor(MR_COPY_SOURCE_BRANCH_NAME), ShortcutsIssuable.copyBranchName);
+
+ /**
+ * We're attaching a global focus event listener on document for
+ * every markdown input field.
+ */
+ $(document).on(
+ 'focus',
+ '.js-vue-markdown-field .js-gfm-input',
+ ShortcutsIssuable.handleMarkdownFieldFocus,
+ );
+ }
+
+ /**
+ * This event handler preserves last focused markdown input field.
+ * @param {Object} event
+ */
+ static handleMarkdownFieldFocus({ currentTarget }) {
+ ShortcutsIssuable.$lastFocusedReplyField = $(currentTarget);
}
static replyWithSelectedText() {
- const $replyField = $('.js-main-target-form .js-vue-comment-form');
+ let $replyField = $('.js-main-target-form .js-vue-comment-form');
+
+ // Ensure that markdown input is still present in the DOM
+ // otherwise fall back to main comment input field.
+ if (
+ ShortcutsIssuable.$lastFocusedReplyField &&
+ isElementVisible(ShortcutsIssuable.$lastFocusedReplyField?.get(0))
+ ) {
+ $replyField = ShortcutsIssuable.$lastFocusedReplyField;
+ }
if (!$replyField.length || $replyField.is(':hidden') /* Other tab selected in MR */) {
return false;
diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js
index 7d8e4dd490c..e0ef49b60d3 100644
--- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js
+++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js
@@ -1,6 +1,6 @@
import Mousetrap from 'mousetrap';
import { visitUrl, constructWebIDEPath } from '~/lib/utils/url_utility';
-import findAndFollowLink from '../../lib/utils/navigation_utility';
+import findAndFollowLink from '~/lib/utils/navigation_utility';
import {
keysFor,
GO_TO_PROJECT_OVERVIEW,
diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_wiki.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_wiki.js
index 59c1d2654bc..b2801f9118d 100644
--- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_wiki.js
+++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_wiki.js
@@ -1,5 +1,5 @@
import Mousetrap from 'mousetrap';
-import findAndFollowLink from '../../lib/utils/navigation_utility';
+import findAndFollowLink from '~/lib/utils/navigation_utility';
import { keysFor, EDIT_WIKI_PAGE } from './keybindings';
import ShortcutsNavigation from './shortcuts_navigation';
diff --git a/app/assets/javascripts/blob/balsamiq/balsamiq_viewer.js b/app/assets/javascripts/blob/balsamiq/balsamiq_viewer.js
deleted file mode 100644
index 313bec7e01a..00000000000
--- a/app/assets/javascripts/blob/balsamiq/balsamiq_viewer.js
+++ /dev/null
@@ -1,111 +0,0 @@
-import { template as _template } from 'lodash';
-import sqljs from 'sql.js';
-import axios from '~/lib/utils/axios_utils';
-import { successCodes } from '~/lib/utils/http_status';
-
-const PREVIEW_TEMPLATE = _template(`
- <div class="card">
- <div class="card-header"><%- name %></div>
- <div class="card-body">
- <img class="img-thumbnail" src="data:image/png;base64,<%- image %>"/>
- </div>
- </div>
-`);
-
-class BalsamiqViewer {
- constructor(viewer) {
- this.viewer = viewer;
- }
-
- loadFile(endpoint) {
- return axios
- .get(endpoint, {
- responseType: 'arraybuffer',
- validateStatus(status) {
- return status !== successCodes.OK;
- },
- })
- .then(({ data }) => {
- this.renderFile(data);
- })
- .catch((e) => {
- throw new Error(e);
- });
- }
-
- renderFile(fileBuffer) {
- const container = document.createElement('ul');
-
- this.initDatabase(fileBuffer);
-
- const previews = this.getPreviews();
- previews.forEach((preview) => {
- const renderedPreview = this.renderPreview(preview);
-
- container.appendChild(renderedPreview);
- });
-
- container.classList.add('list-inline');
- container.classList.add('previews');
-
- this.viewer.appendChild(container);
- }
-
- initDatabase(data) {
- const previewBinary = new Uint8Array(data);
-
- this.database = new sqljs.Database(previewBinary);
- }
-
- getPreviews() {
- const thumbnails = this.database.exec('SELECT * FROM thumbnails');
-
- return thumbnails[0].values.map(BalsamiqViewer.parsePreview);
- }
-
- getResource(resourceID) {
- const resources = this.database.exec(`SELECT * FROM resources WHERE id = '${resourceID}'`);
-
- return resources[0];
- }
-
- renderPreview(preview) {
- const previewElement = document.createElement('li');
-
- previewElement.classList.add('preview');
- previewElement.innerHTML = this.renderTemplate(preview);
-
- return previewElement;
- }
-
- renderTemplate(preview) {
- const resource = this.getResource(preview.resourceID);
- const name = BalsamiqViewer.parseTitle(resource);
- const { image } = preview;
-
- const template = PREVIEW_TEMPLATE({
- name,
- image,
- });
-
- return template;
- }
-
- static parsePreview(preview) {
- return JSON.parse(preview[1]);
- }
-
- /*
- * resource = {
- * columns: ['ID', 'BRANCHID', 'ATTRIBUTES', 'DATA'],
- * values: [['id', 'branchId', 'attributes', 'data']],
- * }
- *
- * 'attributes' being a JSON string containing the `name` property.
- */
- static parseTitle(resource) {
- return JSON.parse(resource.values[0][2]).name;
- }
-}
-
-export default BalsamiqViewer;
diff --git a/app/assets/javascripts/blob/balsamiq_viewer.js b/app/assets/javascripts/blob/balsamiq_viewer.js
deleted file mode 100644
index af8e8a4cd3d..00000000000
--- a/app/assets/javascripts/blob/balsamiq_viewer.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import createFlash from '~/flash';
-import { __ } from '~/locale';
-import BalsamiqViewer from './balsamiq/balsamiq_viewer';
-
-function onError() {
- const flash = createFlash({
- message: __('Balsamiq file could not be loaded.'),
- });
-
- return flash;
-}
-
-export default function loadBalsamiqFile() {
- const viewer = document.getElementById('js-balsamiq-viewer');
-
- if (!(viewer instanceof Element)) return;
-
- const { endpoint } = viewer.dataset;
-
- const balsamiqViewer = new BalsamiqViewer(viewer);
- balsamiqViewer.loadFile(endpoint).catch(onError);
-}
diff --git a/app/assets/javascripts/blob/line_highlighter.js b/app/assets/javascripts/blob/line_highlighter.js
index a1f59aa1b54..a8932f8c73b 100644
--- a/app/assets/javascripts/blob/line_highlighter.js
+++ b/app/assets/javascripts/blob/line_highlighter.js
@@ -37,6 +37,7 @@ const LineHighlighter = function (options = {}) {
options.fileHolderSelector = options.fileHolderSelector || '.file-holder';
options.scrollFileHolder = options.scrollFileHolder || false;
options.hash = options.hash || window.location.hash;
+ options.scrollBehavior = options.scrollBehavior || 'smooth';
this.options = options;
this._hash = options.hash;
@@ -74,6 +75,7 @@ LineHighlighter.prototype.highlightHash = function (newHash) {
// Scroll to the first highlighted line on initial load
// Add an offset of -100 for some context
offset: -100,
+ behavior: this.options.scrollBehavior,
});
}
}
diff --git a/app/assets/javascripts/blob/pdf/pdf_viewer.vue b/app/assets/javascripts/blob/pdf/pdf_viewer.vue
index a1a62abeb6f..e07e415d6cf 100644
--- a/app/assets/javascripts/blob/pdf/pdf_viewer.vue
+++ b/app/assets/javascripts/blob/pdf/pdf_viewer.vue
@@ -1,6 +1,6 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
-import PdfLab from '../../pdf/index.vue';
+import PdfLab from '~/pdf/index.vue';
export default {
components: {
diff --git a/app/assets/javascripts/blob/viewer/index.js b/app/assets/javascripts/blob/viewer/index.js
index 1bda7d4e3f0..a6eed4ecae3 100644
--- a/app/assets/javascripts/blob/viewer/index.js
+++ b/app/assets/javascripts/blob/viewer/index.js
@@ -11,14 +11,12 @@ import {
} from '~/performance/constants';
import { performanceMarkAndMeasure } from '~/performance/utils';
import { fixTitle } from '~/tooltips';
-import axios from '../../lib/utils/axios_utils';
-import { handleLocationHash } from '../../lib/utils/common_utils';
-import eventHub from '../../notes/event_hub';
+import axios from '~/lib/utils/axios_utils';
+import { handleLocationHash } from '~/lib/utils/common_utils';
+import eventHub from '~/notes/event_hub';
const loadRichBlobViewer = (type) => {
switch (type) {
- case 'balsamiq':
- return import(/* webpackChunkName: 'balsamiq_viewer' */ '../balsamiq_viewer');
case 'notebook':
return import(/* webpackChunkName: 'notebook_viewer' */ '../notebook_viewer');
case 'openapi':
diff --git a/app/assets/javascripts/boards/boards_util.js b/app/assets/javascripts/boards/boards_util.js
index 96cc774a280..9fca9860282 100644
--- a/app/assets/javascripts/boards/boards_util.js
+++ b/app/assets/javascripts/boards/boards_util.js
@@ -111,7 +111,7 @@ export function fullLabelId(label) {
export function formatIssueInput(issueInput, boardConfig) {
const { labelIds = [], assigneeIds = [] } = issueInput;
- const { labels, assigneeId, milestoneId } = boardConfig;
+ const { labels, assigneeId, milestoneId, weight } = boardConfig;
return {
...issueInput,
@@ -121,6 +121,7 @@ export function formatIssueInput(issueInput, boardConfig) {
: issueInput?.milestoneId,
labelIds: [...labelIds, ...(labels?.map((l) => fullLabelId(l)) || [])],
assigneeIds: [...assigneeIds, ...(assigneeId ? [fullUserId(assigneeId)] : [])],
+ weight: weight > -1 ? weight : undefined,
};
}
diff --git a/app/assets/javascripts/boards/components/board_app.vue b/app/assets/javascripts/boards/components/board_app.vue
index 28f4a267077..858aabb0f05 100644
--- a/app/assets/javascripts/boards/components/board_app.vue
+++ b/app/assets/javascripts/boards/components/board_app.vue
@@ -2,11 +2,13 @@
import { mapActions, mapGetters } from 'vuex';
import BoardContent from '~/boards/components/board_content.vue';
import BoardSettingsSidebar from '~/boards/components/board_settings_sidebar.vue';
+import BoardTopBar from '~/boards/components/board_top_bar.vue';
export default {
components: {
BoardContent,
BoardSettingsSidebar,
+ BoardTopBar,
},
inject: ['disabled'],
computed: {
@@ -23,6 +25,7 @@ export default {
<template>
<div class="boards-app gl-relative" :class="{ 'is-compact': isSidebarOpen }">
+ <board-top-bar />
<board-content :disabled="disabled" />
<board-settings-sidebar />
</div>
diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
index aee61a5b2a5..814ff16efec 100644
--- a/app/assets/javascripts/boards/components/board_card_inner.vue
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -13,7 +13,7 @@ import boardCardInner from 'ee_else_ce/boards/mixins/board_card_inner';
import { isScopedLabel } from '~/lib/utils/common_utils';
import { sprintf, __, n__ } from '~/locale';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
-import UserAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
+import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import { ListType } from '../constants';
import BoardBlockedIcon from './board_blocked_icon.vue';
import IssueDueDate from './issue_due_date.vue';
@@ -240,7 +240,7 @@ export default {
class="board-card-footer gl-display-flex gl-justify-content-space-between gl-align-items-flex-end"
>
<div
- class="gl-display-flex align-items-start flex-wrap-reverse board-card-number-container gl-overflow-hidden js-board-card-number-container"
+ class="gl-display-flex align-items-start flex-wrap-reverse board-card-number-container gl-overflow-hidden"
>
<gl-loading-icon v-if="item.isLoading" size="md" class="mt-3" />
<span
diff --git a/app/assets/javascripts/boards/components/board_content.vue b/app/assets/javascripts/boards/components/board_content.vue
index 27ea2e7a608..1d6a71aca47 100644
--- a/app/assets/javascripts/boards/components/board_content.vue
+++ b/app/assets/javascripts/boards/components/board_content.vue
@@ -4,7 +4,7 @@ import { sortBy } from 'lodash';
import Draggable from 'vuedraggable';
import { mapState, mapGetters, mapActions } from 'vuex';
import BoardAddNewColumn from 'ee_else_ce/boards/components/board_add_new_column.vue';
-import defaultSortableConfig from '~/sortable/sortable_config';
+import { defaultSortableOptions } from '~/sortable/constants';
import { DraggableItemTypes } from '../constants';
import BoardColumn from './board_column.vue';
@@ -43,7 +43,7 @@ export default {
},
draggableOptions() {
const options = {
- ...defaultSortableConfig,
+ ...defaultSortableOptions,
disabled: this.disabled,
draggable: '.is-draggable',
fallbackOnBody: false,
diff --git a/app/assets/javascripts/boards/components/board_filtered_search.vue b/app/assets/javascripts/boards/components/board_filtered_search.vue
index 95d4fd5bc0a..aeb2cee590d 100644
--- a/app/assets/javascripts/boards/components/board_filtered_search.vue
+++ b/app/assets/javascripts/boards/components/board_filtered_search.vue
@@ -4,7 +4,10 @@ import { mapActions } from 'vuex';
import { getIdFromGraphQLId, isGid } from '~/graphql_shared/utils';
import { updateHistory, setUrlParams } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
-import { FILTERED_SEARCH_TERM } from '~/vue_shared/components/filtered_search_bar/constants';
+import {
+ FILTERED_SEARCH_TERM,
+ FILTER_ANY,
+} from '~/vue_shared/components/filtered_search_bar/constants';
import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
import { AssigneeFilterType } from '~/boards/constants';
@@ -42,6 +45,7 @@ export default {
search,
milestoneTitle,
iterationId,
+ iterationCadenceId,
types,
weight,
epicId,
@@ -95,10 +99,20 @@ export default {
});
}
- if (iterationId) {
+ let iterationData = null;
+
+ if (iterationId && iterationCadenceId) {
+ iterationData = `${iterationId}&${iterationCadenceId}`;
+ } else if (iterationCadenceId) {
+ iterationData = `${FILTER_ANY}&${iterationCadenceId}`;
+ } else if (iterationId) {
+ iterationData = iterationId;
+ }
+
+ if (iterationData) {
filteredSearchValue.push({
type: 'iteration',
- value: { data: iterationId, operator: '=' },
+ value: { data: iterationData, operator: '=' },
});
}
@@ -228,9 +242,12 @@ export default {
epicId,
myReactionEmoji,
iterationId,
+ iterationCadenceId,
releaseTag,
confidential,
} = this.filterParams;
+ let iteration = iterationId;
+ let cadence = iterationCadenceId;
let notParams = {};
if (Object.prototype.hasOwnProperty.call(this.filterParams, 'not')) {
@@ -251,6 +268,10 @@ export default {
);
}
+ if (iterationId?.includes('&')) {
+ [iteration, cadence] = iterationId.split('&');
+ }
+
return mapValues(
{
...notParams,
@@ -259,7 +280,8 @@ export default {
assignee_username: assigneeUsername,
assignee_id: assigneeId,
milestone_title: milestoneTitle,
- iteration_id: iterationId,
+ iteration_id: iteration,
+ iteration_cadence_id: cadence,
search,
types,
weight,
diff --git a/app/assets/javascripts/boards/components/board_form.vue b/app/assets/javascripts/boards/components/board_form.vue
index 5fcf9514708..a874c9e070a 100644
--- a/app/assets/javascripts/boards/components/board_form.vue
+++ b/app/assets/javascripts/boards/components/board_form.vue
@@ -48,7 +48,7 @@ export default {
fullPath: {
default: '',
},
- rootPath: {
+ boardBaseUrl: {
default: '',
},
},
@@ -209,7 +209,7 @@ export default {
if (this.isDeleteForm) {
try {
await this.deleteBoard();
- visitUrl(this.rootPath);
+ visitUrl(this.boardBaseUrl);
} catch {
this.setError({ message: this.$options.i18n.deleteErrorMessage });
} finally {
@@ -289,7 +289,7 @@ export default {
<p v-if="isDeleteForm" data-testid="delete-confirmation-message">
{{ $options.i18n.deleteConfirmationMessage }}
</p>
- <form v-else class="js-board-config-modal" data-testid="board-form-wrapper" @submit.prevent>
+ <form v-else data-testid="board-form-wrapper" @submit.prevent>
<div v-if="!readonly" class="gl-mb-5" data-testid="board-form">
<label class="gl-font-weight-bold gl-font-lg" for="board-new-name">
{{ $options.i18n.titleFieldLabel }}
diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue
index 1024be61359..47f25f34d0c 100644
--- a/app/assets/javascripts/boards/components/board_list.vue
+++ b/app/assets/javascripts/boards/components/board_list.vue
@@ -2,9 +2,9 @@
import { GlLoadingIcon, GlIntersectionObserver } from '@gitlab/ui';
import Draggable from 'vuedraggable';
import { mapActions, mapGetters, mapState } from 'vuex';
-import { sortableStart, sortableEnd } from '~/boards/mixins/sortable_default_options';
import { sprintf, __ } from '~/locale';
-import defaultSortableConfig from '~/sortable/sortable_config';
+import { defaultSortableOptions } from '~/sortable/constants';
+import { sortableStart, sortableEnd } from '~/sortable/utils';
import Tracking from '~/tracking';
import listQuery from 'ee_else_ce/boards/graphql/board_lists_deferred.query.graphql';
import { toggleFormEventPrefix, DraggableItemTypes } from '../constants';
@@ -121,7 +121,7 @@ export default {
},
treeRootOptions() {
const options = {
- ...defaultSortableConfig,
+ ...defaultSortableOptions,
fallbackOnBody: false,
group: 'board-list',
tag: 'ul',
@@ -287,7 +287,7 @@ export default {
:data-board-type="list.listType"
:class="{ 'bg-danger-100': boardItemsSizeExceedsMax }"
draggable=".board-card"
- class="board-list gl-w-full gl-h-full gl-list-style-none gl-mb-0 gl-p-2 js-board-list"
+ class="board-list gl-w-full gl-h-full gl-list-style-none gl-mb-0 gl-p-2"
data-testid="tree-root-wrapper"
@start="handleDragOnStart"
@end="handleDragOnEnd"
diff --git a/app/assets/javascripts/boards/components/board_list_header.vue b/app/assets/javascripts/boards/components/board_list_header.vue
index 46b28d20da9..9f70c84931f 100644
--- a/app/assets/javascripts/boards/components/board_list_header.vue
+++ b/app/assets/javascripts/boards/components/board_list_header.vue
@@ -18,7 +18,7 @@ import Tracking from '~/tracking';
import { formatDate } from '~/lib/utils/datetime_utility';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import listQuery from 'ee_else_ce/boards/graphql/board_lists_deferred.query.graphql';
-import AccessorUtilities from '../../lib/utils/accessor';
+import AccessorUtilities from '~/lib/utils/accessor';
import { inactiveId, LIST, ListType, toggleFormEventPrefix } from '../constants';
import eventHub from '../eventhub';
import ItemCount from './item_count.vue';
@@ -57,6 +57,9 @@ export default {
currentUserId: {
default: null,
},
+ canCreateEpic: {
+ default: false,
+ },
},
props: {
list: {
@@ -129,7 +132,7 @@ export default {
return (this.listType === ListType.backlog || this.showListHeaderButton) && !this.isEpicBoard;
},
isNewEpicShown() {
- return this.isEpicBoard && this.listType !== ListType.closed;
+ return this.isEpicBoard && this.canCreateEpic && this.listType !== ListType.closed;
},
isSettingsShown() {
return (
@@ -262,7 +265,7 @@ export default {
'gl-py-2': list.collapsed && isSwimlanesHeader,
'gl-flex-direction-column': list.collapsed,
}"
- class="board-title gl-m-0 gl-display-flex gl-align-items-center gl-font-base gl-px-3 js-board-handle"
+ class="board-title gl-m-0 gl-display-flex gl-align-items-center gl-font-base gl-px-3"
>
<gl-button
v-gl-tooltip.hover
@@ -443,12 +446,11 @@ export default {
ref="settingsBtn"
v-gl-tooltip.hover
:aria-label="$options.i18n.listSettings"
- class="no-drag js-board-settings-button"
+ class="no-drag"
:title="$options.i18n.listSettings"
icon="settings"
@click="openSidebarSettings"
/>
- <gl-tooltip :target="() => $refs.settingsBtn">{{ $options.i18n.listSettings }}</gl-tooltip>
</gl-button-group>
</h3>
</header>
diff --git a/app/assets/javascripts/boards/components/board_top_bar.vue b/app/assets/javascripts/boards/components/board_top_bar.vue
new file mode 100644
index 00000000000..f90ac1e9079
--- /dev/null
+++ b/app/assets/javascripts/boards/components/board_top_bar.vue
@@ -0,0 +1,54 @@
+<script>
+import { mapGetters } from 'vuex';
+import BoardAddNewColumnTrigger from '~/boards/components/board_add_new_column_trigger.vue';
+import BoardsSelector from 'ee_else_ce/boards/components/boards_selector.vue';
+import IssueBoardFilteredSearch from 'ee_else_ce/boards/components/issue_board_filtered_search.vue';
+import ConfigToggle from './config_toggle.vue';
+import NewBoardButton from './new_board_button.vue';
+import ToggleFocus from './toggle_focus.vue';
+
+export default {
+ components: {
+ BoardAddNewColumnTrigger,
+ BoardsSelector,
+ IssueBoardFilteredSearch,
+ ConfigToggle,
+ NewBoardButton,
+ ToggleFocus,
+ ToggleLabels: () => import('ee_component/boards/components/toggle_labels.vue'),
+ ToggleEpicsSwimlanes: () => import('ee_component/boards/components/toggle_epics_swimlanes.vue'),
+ EpicBoardFilteredSearch: () =>
+ import('ee_component/boards/components/epic_filtered_search.vue'),
+ },
+ inject: ['swimlanesFeatureAvailable', 'canAdminList', 'isSignedIn'],
+ computed: {
+ ...mapGetters(['isEpicBoard']),
+ },
+};
+</script>
+
+<template>
+ <div class="issues-filters">
+ <div
+ class="issues-details-filters filtered-search-block gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row row-content-block second-block"
+ >
+ <div
+ class="gl-display-flex gl-flex-direction-column gl-md-flex-direction-row gl-flex-grow-1 gl-lg-mb-0! mb-md-2 mb-sm-0 gl-w-full"
+ >
+ <boards-selector />
+ <new-board-button />
+ <epic-board-filtered-search v-if="isEpicBoard" />
+ <issue-board-filtered-search v-else />
+ </div>
+ <div
+ class="filter-dropdown-container gl-display-flex gl-flex-direction-column gl-md-flex-direction-row gl-align-items-flex-start"
+ >
+ <toggle-labels />
+ <toggle-epics-swimlanes v-if="swimlanesFeatureAvailable && isSignedIn" />
+ <config-toggle />
+ <board-add-new-column-trigger v-if="canAdminList" />
+ <toggle-focus />
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/boards/components/boards_selector.vue b/app/assets/javascripts/boards/components/boards_selector.vue
index 91fdfd668fc..2951eda1112 100644
--- a/app/assets/javascripts/boards/components/boards_selector.vue
+++ b/app/assets/javascripts/boards/components/boards_selector.vue
@@ -40,37 +40,21 @@ export default {
directives: {
GlModalDirective,
},
- inject: ['fullPath'],
+ inject: [
+ 'boardBaseUrl',
+ 'fullPath',
+ 'canAdminBoard',
+ 'multipleIssueBoardsAvailable',
+ 'hasMissingBoards',
+ 'scopedIssueBoardFeatureEnabled',
+ 'weights',
+ ],
props: {
throttleDuration: {
type: Number,
default: 200,
required: false,
},
- boardBaseUrl: {
- type: String,
- required: true,
- },
- hasMissingBoards: {
- type: Boolean,
- required: true,
- },
- canAdminBoard: {
- type: Boolean,
- required: true,
- },
- multipleIssueBoardsAvailable: {
- type: Boolean,
- required: true,
- },
- scopedIssueBoardFeatureEnabled: {
- type: Boolean,
- required: true,
- },
- weights: {
- type: Array,
- required: true,
- },
},
data() {
return {
@@ -255,11 +239,12 @@ export default {
</script>
<template>
- <div class="boards-switcher js-boards-selector gl-mr-3">
- <span class="boards-selector-wrapper js-boards-selector-wrapper">
+ <div class="boards-switcher gl-mr-3" data-testid="boards-selector">
+ <span class="boards-selector-wrapper">
<gl-dropdown
+ data-testid="boards-dropdown"
data-qa-selector="boards_dropdown"
- toggle-class="dropdown-menu-toggle js-dropdown-toggle"
+ toggle-class="dropdown-menu-toggle"
menu-class="flex-column dropdown-extended-height"
:loading="isBoardLoading"
:text="board.name"
@@ -292,8 +277,8 @@ export default {
<gl-dropdown-item
v-for="recentBoard in recentBoards"
:key="`recent-${recentBoard.id}`"
- class="js-dropdown-item"
:href="`${boardBaseUrl}/${recentBoard.id}`"
+ data-testid="dropdown-item"
>
{{ recentBoard.name }}
</gl-dropdown-item>
@@ -308,8 +293,8 @@ export default {
<gl-dropdown-item
v-for="otherBoard in filteredBoards"
:key="otherBoard.id"
- class="js-dropdown-item"
:href="`${boardBaseUrl}/${otherBoard.id}`"
+ data-testid="dropdown-item"
>
{{ otherBoard.name }}
</gl-dropdown-item>
@@ -347,7 +332,7 @@ export default {
<gl-dropdown-item
v-if="showDelete"
v-gl-modal-directive="'board-config-modal'"
- class="text-danger js-delete-board"
+ class="text-danger"
@click.prevent="showPage('delete')"
>
{{ s__('IssueBoards|Delete board') }}
diff --git a/app/assets/javascripts/boards/components/config_toggle.vue b/app/assets/javascripts/boards/components/config_toggle.vue
index f39e4d90357..4746f598ab7 100644
--- a/app/assets/javascripts/boards/components/config_toggle.vue
+++ b/app/assets/javascripts/boards/components/config_toggle.vue
@@ -14,16 +14,7 @@ export default {
GlModalDirective,
},
mixins: [Tracking.mixin()],
- props: {
- canAdminList: {
- type: Boolean,
- required: true,
- },
- hasScope: {
- type: Boolean,
- required: true,
- },
- },
+ inject: ['canAdminList', 'hasScope'],
computed: {
buttonText() {
return this.canAdminList ? s__('Boards|Edit board') : s__('Boards|View scope');
diff --git a/app/assets/javascripts/boards/components/issuable_title.vue b/app/assets/javascripts/boards/components/issuable_title.vue
deleted file mode 100644
index 40627a9fab8..00000000000
--- a/app/assets/javascripts/boards/components/issuable_title.vue
+++ /dev/null
@@ -1,21 +0,0 @@
-<script>
-export default {
- props: {
- title: {
- type: String,
- required: true,
- },
- refPath: {
- type: String,
- required: true,
- },
- },
-};
-</script>
-
-<template>
- <div data-testid="issue-title">
- <p class="gl-font-weight-bold">{{ title }}</p>
- <p class="gl-mb-0">{{ refPath }}</p>
- </div>
-</template>
diff --git a/app/assets/javascripts/boards/components/issue_board_filtered_search.vue b/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
index 6bfdbb674a2..bab6fe26978 100644
--- a/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
+++ b/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
@@ -41,17 +41,7 @@ export default {
confidential: __('Confidential'),
},
components: { BoardFilteredSearch },
- inject: ['isSignedIn', 'releasesFetchPath'],
- props: {
- fullPath: {
- type: String,
- required: true,
- },
- boardType: {
- type: String,
- required: true,
- },
- },
+ inject: ['isSignedIn', 'releasesFetchPath', 'fullPath', 'boardType'],
computed: {
isGroupBoard() {
return this.boardType === BoardType.group;
diff --git a/app/assets/javascripts/boards/components/issue_time_estimate.vue b/app/assets/javascripts/boards/components/issue_time_estimate.vue
index 1ab7deebfaf..9312db06efe 100644
--- a/app/assets/javascripts/boards/components/issue_time_estimate.vue
+++ b/app/assets/javascripts/boards/components/issue_time_estimate.vue
@@ -43,7 +43,7 @@ export default {
<gl-tooltip
:target="() => $refs.issueTimeEstimate"
placement="bottom"
- class="js-issue-time-estimate"
+ data-testid="issue-time-estimate"
>
<span class="gl-font-weight-bold gl-display-block">{{ $options.i18n.timeEstimate }}</span>
{{ title }}
diff --git a/app/assets/javascripts/boards/components/item_count.vue b/app/assets/javascripts/boards/components/item_count.vue
index 9b1ff254766..a11c23e5625 100644
--- a/app/assets/javascripts/boards/components/item_count.vue
+++ b/app/assets/javascripts/boards/components/item_count.vue
@@ -29,7 +29,7 @@ export default {
<span :class="{ 'text-danger': issuesExceedMax }" data-testid="board-items-count">
{{ itemsSize }}
</span>
- <span v-if="isMaxLimitSet" class="js-max-issue-size">
+ <span v-if="isMaxLimitSet" class="max-issue-size">
{{ maxIssueCount }}
</span>
</div>
diff --git a/app/assets/javascripts/boards/components/toggle_focus.vue b/app/assets/javascripts/boards/components/toggle_focus.vue
index 49f5e7d20a9..71612e0742f 100644
--- a/app/assets/javascripts/boards/components/toggle_focus.vue
+++ b/app/assets/javascripts/boards/components/toggle_focus.vue
@@ -10,12 +10,6 @@ export default {
directives: {
GlTooltip,
},
- props: {
- issueBoardsContentSelector: {
- type: String,
- required: true,
- },
- },
data() {
return {
isFullscreen: false,
@@ -25,7 +19,7 @@ export default {
toggleFocusMode() {
hide(this.$refs.toggleFocusModeButton);
- const issueBoardsContent = document.querySelector(this.issueBoardsContentSelector);
+ const issueBoardsContent = document.querySelector('.content-wrapper > .js-focus-mode-board');
issueBoardsContent.classList.toggle('is-focused');
this.isFullscreen = !this.isFullscreen;
@@ -44,7 +38,6 @@ export default {
v-gl-tooltip
category="tertiary"
:icon="isFullscreen ? 'minimize' : 'maximize'"
- class="js-focus-mode-btn"
data-qa-selector="focus_mode_button"
:title="$options.i18n.toggleFocusMode"
:aria-label="$options.i18n.toggleFocusMode"
diff --git a/app/assets/javascripts/boards/config_toggle.js b/app/assets/javascripts/boards/config_toggle.js
deleted file mode 100644
index 1e54c2511b8..00000000000
--- a/app/assets/javascripts/boards/config_toggle.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import Vue from 'vue';
-import { parseBoolean } from '~/lib/utils/common_utils';
-import ConfigToggle from './components/config_toggle.vue';
-
-export default () => {
- const el = document.querySelector('.js-board-config');
-
- if (!el) {
- return;
- }
-
- // eslint-disable-next-line no-new
- new Vue({
- el,
- name: 'ConfigToggleRoot',
- render(h) {
- return h(ConfigToggle, {
- props: {
- canAdminList: parseBoolean(el.dataset.canAdminList),
- hasScope: parseBoolean(el.dataset.hasScope),
- },
- });
- },
- });
-};
diff --git a/app/assets/javascripts/boards/graphql/group_projects.query.graphql b/app/assets/javascripts/boards/graphql/group_projects.query.graphql
index 0da14d0b872..e0a3cb0ee21 100644
--- a/app/assets/javascripts/boards/graphql/group_projects.query.graphql
+++ b/app/assets/javascripts/boards/graphql/group_projects.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query boardsGetGroupProjects($fullPath: ID!, $search: String, $after: String) {
group(fullPath: $fullPath) {
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index b31b56e6839..77c5994b5a1 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -1,22 +1,19 @@
import PortalVue from 'portal-vue';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
-
-import toggleEpicsSwimlanes from 'ee_else_ce/boards/toggle_epics_swimlanes';
-import toggleLabels from 'ee_else_ce/boards/toggle_labels';
-import BoardAddNewColumnTrigger from '~/boards/components/board_add_new_column_trigger.vue';
import BoardApp from '~/boards/components/board_app.vue';
import '~/boards/filters/due_date_filters';
import { issuableTypes } from '~/boards/constants';
-import initBoardsFilteredSearch from '~/boards/mount_filtered_search_issue_boards';
import store from '~/boards/stores';
-import toggleFocusMode from '~/boards/toggle_focus';
-import { NavigationType, isLoggedIn, parseBoolean } from '~/lib/utils/common_utils';
+import {
+ NavigationType,
+ isLoggedIn,
+ parseBoolean,
+ convertObjectPropsToCamelCase,
+} from '~/lib/utils/common_utils';
+import { queryToObject } from '~/lib/utils/url_utility';
import { fullBoardId } from './boards_util';
-import boardConfigToggle from './config_toggle';
-import initNewBoard from './new_board';
import { gqlClient } from './graphql';
-import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher';
Vue.use(VueApollo);
Vue.use(PortalVue);
@@ -28,6 +25,12 @@ const apolloProvider = new VueApollo({
function mountBoardApp(el) {
const { boardId, groupId, fullPath, rootPath } = el.dataset;
+ const rawFilterParams = queryToObject(window.location.search, { gatherArrays: true });
+
+ const initialFilterParams = {
+ ...convertObjectPropsToCamelCase(rawFilterParams),
+ };
+
store.dispatch('fetchBoard', {
fullPath,
fullBoardId: fullBoardId(boardId),
@@ -54,26 +57,41 @@ function mountBoardApp(el) {
boardId,
groupId: Number(groupId),
rootPath,
+ fullPath,
+ initialFilterParams,
+ boardBaseUrl: el.dataset.boardBaseUrl,
+ boardType: el.dataset.parent,
currentUserId: gon.current_user_id || null,
- canUpdate: parseBoolean(el.dataset.canUpdate),
- canAdminList: parseBoolean(el.dataset.canAdminList),
+ boardWeight: el.dataset.boardWeight ? parseInt(el.dataset.boardWeight, 10) : null,
labelsManagePath: el.dataset.labelsManagePath,
labelsFilterBasePath: el.dataset.labelsFilterBasePath,
+ releasesFetchPath: el.dataset.releasesFetchPath,
timeTrackingLimitToHours: parseBoolean(el.dataset.timeTrackingLimitToHours),
+ issuableType: issuableTypes.issue,
+ emailsDisabled: parseBoolean(el.dataset.emailsDisabled),
+ hasScope: parseBoolean(el.dataset.hasScope),
+ hasMissingBoards: parseBoolean(el.dataset.hasMissingBoards),
+ weights: el.dataset.weights ? JSON.parse(el.dataset.weights) : [],
+ // Permissions
+ canUpdate: parseBoolean(el.dataset.canUpdate),
+ canAdminList: parseBoolean(el.dataset.canAdminList),
+ canAdminBoard: parseBoolean(el.dataset.canAdminBoard),
+ allowLabelCreate: parseBoolean(el.dataset.canUpdate),
+ allowLabelEdit: parseBoolean(el.dataset.canUpdate),
+ isSignedIn: isLoggedIn(),
+ // Features
multipleAssigneesFeatureAvailable: parseBoolean(el.dataset.multipleAssigneesFeatureAvailable),
epicFeatureAvailable: parseBoolean(el.dataset.epicFeatureAvailable),
iterationFeatureAvailable: parseBoolean(el.dataset.iterationFeatureAvailable),
weightFeatureAvailable: parseBoolean(el.dataset.weightFeatureAvailable),
- boardWeight: el.dataset.boardWeight ? parseInt(el.dataset.boardWeight, 10) : null,
scopedLabelsAvailable: parseBoolean(el.dataset.scopedLabels),
milestoneListsAvailable: parseBoolean(el.dataset.milestoneListsAvailable),
assigneeListsAvailable: parseBoolean(el.dataset.assigneeListsAvailable),
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),
+ swimlanesFeatureAvailable: gon.licensed_features?.swimlanes,
+ multipleIssueBoardsAvailable: parseBoolean(el.dataset.multipleBoardsAvailable),
+ scopedIssueBoardFeatureEnabled: parseBoolean(el.dataset.scopedIssueBoardFeatureEnabled),
},
render: (createComponent) => createComponent(BoardApp),
});
@@ -92,47 +110,5 @@ export default () => {
}
});
- const { releasesFetchPath, epicFeatureAvailable, iterationFeatureAvailable } = $boardApp.dataset;
- initBoardsFilteredSearch(
- apolloProvider,
- isLoggedIn(),
- releasesFetchPath,
- parseBoolean(epicFeatureAvailable),
- parseBoolean(iterationFeatureAvailable),
- );
-
mountBoardApp($boardApp);
-
- const createColumnTriggerEl = document.querySelector('.js-create-column-trigger');
- if (createColumnTriggerEl) {
- // eslint-disable-next-line no-new
- new Vue({
- el: createColumnTriggerEl,
- name: 'BoardAddNewColumnTriggerRoot',
- components: {
- BoardAddNewColumnTrigger,
- },
- store,
- render(createElement) {
- return createElement('board-add-new-column-trigger');
- },
- });
- }
-
- boardConfigToggle();
- initNewBoard();
-
- toggleFocusMode();
- toggleLabels();
-
- if (gon.licensed_features?.swimlanes) {
- toggleEpicsSwimlanes();
- }
-
- mountMultipleBoardsSwitcher({
- fullPath: $boardApp.dataset.fullPath,
- rootPath: $boardApp.dataset.boardsEndpoint,
- allowScopedLabels: $boardApp.dataset.scopedLabels,
- labelsManagePath: $boardApp.dataset.labelsManagePath,
- });
};
diff --git a/app/assets/javascripts/boards/mixins/sortable_default_options.js b/app/assets/javascripts/boards/mixins/sortable_default_options.js
deleted file mode 100644
index 1bb0ee5b7e3..00000000000
--- a/app/assets/javascripts/boards/mixins/sortable_default_options.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/* global DocumentTouch */
-
-import sortableConfig from '~/sortable/sortable_config';
-
-export function sortableStart() {
- document.body.classList.add('is-dragging');
-}
-
-export function sortableEnd() {
- document.body.classList.remove('is-dragging');
-}
-
-export function getBoardSortableDefaultOptions(obj) {
- const touchEnabled =
- 'ontouchstart' in window || (window.DocumentTouch && document instanceof DocumentTouch);
-
- const defaultSortOptions = {
- ...sortableConfig,
- filter: '.no-drag',
- delay: touchEnabled ? 100 : 0,
- scrollSensitivity: touchEnabled ? 60 : 100,
- scrollSpeed: 20,
- onStart: sortableStart,
- onEnd: sortableEnd,
- };
-
- Object.keys(obj).forEach((key) => {
- defaultSortOptions[key] = obj[key];
- });
- return defaultSortOptions;
-}
diff --git a/app/assets/javascripts/boards/mount_filtered_search_issue_boards.js b/app/assets/javascripts/boards/mount_filtered_search_issue_boards.js
deleted file mode 100644
index bb659eb075a..00000000000
--- a/app/assets/javascripts/boards/mount_filtered_search_issue_boards.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import Vue from 'vue';
-import IssueBoardFilteredSearch from 'ee_else_ce/boards/components/issue_board_filtered_search.vue';
-import store from '~/boards/stores';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
-import { queryToObject } from '~/lib/utils/url_utility';
-
-export default (
- apolloProvider,
- isSignedIn,
- releasesFetchPath,
- epicFeatureAvailable,
- iterationFeatureAvailable,
-) => {
- const el = document.getElementById('js-issue-board-filtered-search');
- const rawFilterParams = queryToObject(window.location.search, { gatherArrays: true });
-
- const initialFilterParams = {
- ...convertObjectPropsToCamelCase(rawFilterParams, {}),
- };
-
- if (!el) {
- return null;
- }
-
- return new Vue({
- el,
- name: 'BoardFilteredSearchRoot',
- provide: {
- initialFilterParams,
- isSignedIn,
- releasesFetchPath,
- epicFeatureAvailable,
- iterationFeatureAvailable,
- },
- store, // TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/324094
- apolloProvider,
- render: (createElement) =>
- createElement(IssueBoardFilteredSearch, {
- props: { fullPath: store.state?.fullPath || '', boardType: store.state?.boardType || '' },
- }),
- });
-};
diff --git a/app/assets/javascripts/boards/mount_multiple_boards_switcher.js b/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
deleted file mode 100644
index 0bc9cfbd867..00000000000
--- a/app/assets/javascripts/boards/mount_multiple_boards_switcher.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import BoardsSelector from 'ee_else_ce/boards/components/boards_selector.vue';
-import store from '~/boards/stores';
-import createDefaultClient from '~/lib/graphql';
-import { parseBoolean } from '~/lib/utils/common_utils';
-
-Vue.use(VueApollo);
-
-const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
-});
-
-export default (params = {}) => {
- const boardsSwitcherElement = document.getElementById('js-multiple-boards-switcher');
- const { dataset } = boardsSwitcherElement;
- return new Vue({
- el: boardsSwitcherElement,
- name: 'BoardsSelectorRoot',
- components: {
- BoardsSelector,
- },
- apolloProvider,
- store,
- provide: {
- fullPath: params.fullPath,
- rootPath: params.rootPath,
- allowScopedLabels: params.allowScopedLabels,
- labelsManagePath: params.labelsManagePath,
- allowLabelCreate: parseBoolean(dataset.canAdminBoard),
- },
- data() {
- const boardsSelectorProps = {
- ...dataset,
- hasMissingBoards: parseBoolean(dataset.hasMissingBoards),
- canAdminBoard: parseBoolean(dataset.canAdminBoard),
- multipleIssueBoardsAvailable: parseBoolean(dataset.multipleIssueBoardsAvailable),
- scopedIssueBoardFeatureEnabled: parseBoolean(dataset.scopedIssueBoardFeatureEnabled),
- weights: JSON.parse(dataset.weights),
- };
-
- return { boardsSelectorProps };
- },
- render(createElement) {
- return createElement(BoardsSelector, {
- props: this.boardsSelectorProps,
- });
- },
- });
-};
diff --git a/app/assets/javascripts/boards/new_board.js b/app/assets/javascripts/boards/new_board.js
deleted file mode 100644
index 34f2fea79a9..00000000000
--- a/app/assets/javascripts/boards/new_board.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import Vue from 'vue';
-import { parseBoolean } from '~/lib/utils/common_utils';
-import { getExperimentVariant } from '~/experimentation/utils';
-import { CANDIDATE_VARIANT } from '~/experimentation/constants';
-import NewBoardButton from './components/new_board_button.vue';
-
-export default () => {
- if (getExperimentVariant('prominent_create_board_btn') !== CANDIDATE_VARIANT) {
- return;
- }
-
- const el = document.querySelector('.js-new-board');
-
- if (!el) {
- return;
- }
-
- // eslint-disable-next-line no-new
- new Vue({
- el,
- provide: {
- multipleIssueBoardsAvailable: parseBoolean(el.dataset.multipleIssueBoardsAvailable),
- canAdminBoard: parseBoolean(el.dataset.canAdminBoard),
- },
- render(h) {
- return h(NewBoardButton);
- },
- });
-};
diff --git a/app/assets/javascripts/boards/toggle_epics_swimlanes.js b/app/assets/javascripts/boards/toggle_epics_swimlanes.js
deleted file mode 100644
index 2d1ec238274..00000000000
--- a/app/assets/javascripts/boards/toggle_epics_swimlanes.js
+++ /dev/null
@@ -1 +0,0 @@
-export default () => {};
diff --git a/app/assets/javascripts/boards/toggle_focus.js b/app/assets/javascripts/boards/toggle_focus.js
deleted file mode 100644
index 8f057e192dd..00000000000
--- a/app/assets/javascripts/boards/toggle_focus.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import Vue from 'vue';
-import ToggleFocus from './components/toggle_focus.vue';
-
-export default () => {
- const issueBoardsContentSelector = '.content-wrapper > .js-focus-mode-board';
-
- return new Vue({
- el: '#js-toggle-focus-btn',
- name: 'ToggleFocusRoot',
- render(h) {
- return h(ToggleFocus, {
- props: {
- issueBoardsContentSelector,
- },
- });
- },
- });
-};
diff --git a/app/assets/javascripts/boards/toggle_labels.js b/app/assets/javascripts/boards/toggle_labels.js
deleted file mode 100644
index 2d1ec238274..00000000000
--- a/app/assets/javascripts/boards/toggle_labels.js
+++ /dev/null
@@ -1 +0,0 @@
-export default () => {};
diff --git a/app/assets/javascripts/branches/divergence_graph.js b/app/assets/javascripts/branches/divergence_graph.js
index 31cf9a18077..17fd3939441 100644
--- a/app/assets/javascripts/branches/divergence_graph.js
+++ b/app/assets/javascripts/branches/divergence_graph.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import createFlash from '~/flash';
-import axios from '../lib/utils/axios_utils';
-import { __ } from '../locale';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
import DivergenceGraph from './components/divergence_graph.vue';
export function createGraphVueApp(el, data, maxCommits, defaultBranch) {
diff --git a/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue b/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue
index 4156717908d..5e5d799d627 100644
--- a/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue
+++ b/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue
@@ -1,10 +1,9 @@
<script>
-import { GlTable, GlButton, GlBadge, GlTooltipDirective } from '@gitlab/ui';
+import { GlTable, GlButton, GlBadge, GlTooltipDirective, GlAvatarLink, GlAvatar } from '@gitlab/ui';
import { s__ } from '~/locale';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
-import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
export default {
i18n: {
@@ -21,7 +20,8 @@ export default {
GlBadge,
ClipboardButton,
TooltipOnTruncate,
- UserAvatarLink,
+ GlAvatarLink,
+ GlAvatar,
TimeAgoTooltip,
},
directives: {
@@ -102,13 +102,14 @@ export default {
</template>
<template #cell(owner)="{ item }">
<span class="trigger-owner sr-only">{{ item.owner.name }}</span>
- <user-avatar-link
+ <gl-avatar-link
v-if="item.owner"
- :link-href="item.owner.path"
- :img-src="item.owner.avatarUrl"
- :tooltip-text="item.owner.name"
- :img-alt="item.owner.name"
- />
+ v-gl-tooltip
+ :href="item.owner.path"
+ :title="item.owner.name"
+ >
+ <gl-avatar :size="24" :src="item.owner.avatarUrl" />
+ </gl-avatar-link>
</template>
<template #cell(lastUsed)="{ item }">
<time-ago-tooltip v-if="item.lastUsed" :time="item.lastUsed" />
diff --git a/app/assets/javascripts/ci_variable_list/ci_variable_list.js b/app/assets/javascripts/ci_variable_list/ci_variable_list.js
index 055e2f83e33..574a5e7fd99 100644
--- a/app/assets/javascripts/ci_variable_list/ci_variable_list.js
+++ b/app/assets/javascripts/ci_variable_list/ci_variable_list.js
@@ -1,8 +1,8 @@
import $ from 'jquery';
-import SecretValues from '../behaviors/secret_values';
-import CreateItemDropdown from '../create_item_dropdown';
-import { parseBoolean } from '../lib/utils/common_utils';
-import { s__ } from '../locale';
+import SecretValues from '~/behaviors/secret_values';
+import CreateItemDropdown from '~/create_item_dropdown';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import { s__ } from '~/locale';
const ALL_ENVIRONMENTS_STRING = s__('CiVariable|All environments');
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue b/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
index 2e198c59926..be2366108b3 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
+++ b/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
@@ -405,7 +405,7 @@ export default {
<gl-button
ref="updateOrAddVariable"
:disabled="!canSubmit"
- variant="success"
+ variant="confirm"
category="primary"
data-qa-selector="ci_variable_save_button"
@click="updateOrAddVariable"
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
index 3610662afc0..d7a8e447071 100644
--- 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
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
#import "../fragments/cluster_agent_token.fragment.graphql"
query getClusterAgent(
diff --git a/app/assets/javascripts/clusters/clusters_bundle.js b/app/assets/javascripts/clusters/clusters_bundle.js
index 8dcab55ac61..a8fef372637 100644
--- a/app/assets/javascripts/clusters/clusters_bundle.js
+++ b/app/assets/javascripts/clusters/clusters_bundle.js
@@ -4,10 +4,10 @@ import Vue from 'vue';
import createFlash from '~/flash';
import AccessorUtilities from '~/lib/utils/accessor';
import initProjectSelectDropdown from '~/project_select';
-import Poll from '../lib/utils/poll';
-import { s__ } from '../locale';
-import PersistentUserCallout from '../persistent_user_callout';
-import initSettingsPanels from '../settings_panels';
+import Poll from '~/lib/utils/poll';
+import { s__ } from '~/locale';
+import PersistentUserCallout from '~/persistent_user_callout';
+import initSettingsPanels from '~/settings_panels';
import RemoveClusterConfirmation from './components/remove_cluster_confirmation.vue';
import ClustersService from './services/clusters_service';
import ClustersStore from './stores/clusters_store';
diff --git a/app/assets/javascripts/clusters/forms/stores/state.js b/app/assets/javascripts/clusters/forms/stores/state.js
index 74a00b97603..7d6ac1925d8 100644
--- a/app/assets/javascripts/clusters/forms/stores/state.js
+++ b/app/assets/javascripts/clusters/forms/stores/state.js
@@ -1,4 +1,4 @@
-import { parseBoolean } from '../../../lib/utils/common_utils';
+import { parseBoolean } from '~/lib/utils/common_utils';
export default (initialState = {}) => {
return {
diff --git a/app/assets/javascripts/clusters/services/clusters_service.js b/app/assets/javascripts/clusters/services/clusters_service.js
index 7300bb3137a..072b9827f5a 100644
--- a/app/assets/javascripts/clusters/services/clusters_service.js
+++ b/app/assets/javascripts/clusters/services/clusters_service.js
@@ -1,4 +1,4 @@
-import axios from '../../lib/utils/axios_utils';
+import axios from '~/lib/utils/axios_utils';
export default class ClusterService {
constructor(options = {}) {
diff --git a/app/assets/javascripts/clusters/stores/clusters_store.js b/app/assets/javascripts/clusters/stores/clusters_store.js
index db6e7bad6cc..6fb850f009a 100644
--- a/app/assets/javascripts/clusters/stores/clusters_store.js
+++ b/app/assets/javascripts/clusters/stores/clusters_store.js
@@ -1,4 +1,4 @@
-import { parseBoolean } from '../../lib/utils/common_utils';
+import { parseBoolean } from '~/lib/utils/common_utils';
export default class ClusterStore {
constructor() {
diff --git a/app/assets/javascripts/clusters_list/clusters_util.js b/app/assets/javascripts/clusters_list/clusters_util.js
index c78c93fe1ba..e7ad2f45c75 100644
--- a/app/assets/javascripts/clusters_list/clusters_util.js
+++ b/app/assets/javascripts/clusters_list/clusters_util.js
@@ -1,10 +1,11 @@
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 -`;
+ return `helm repo add gitlab https://charts.gitlab.io
+helm repo update
+helm upgrade --install gitlab-agent gitlab/gitlab-agent \\
+ --namespace gitlab-agent \\
+ --create-namespace \\
+ --set config.token=${agentToken} \\
+ --set config.kasAddress=${kasAddress}`;
}
export function getAgentConfigPath(clusterAgentName) {
diff --git a/app/assets/javascripts/clusters_list/components/agent_empty_state.vue b/app/assets/javascripts/clusters_list/components/agent_empty_state.vue
index f54f7b11414..2f45ef8a862 100644
--- a/app/assets/javascripts/clusters_list/components/agent_empty_state.vue
+++ b/app/assets/javascripts/clusters_list/components/agent_empty_state.vue
@@ -1,55 +1,30 @@
<script>
-import { GlButton, GlEmptyState, GlLink, GlSprintf, GlModalDirective } from '@gitlab/ui';
+import { GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
-import { INSTALL_AGENT_MODAL_ID, I18N_AGENTS_EMPTY_STATE } from '../constants';
+import { I18N_AGENTS_EMPTY_STATE } from '../constants';
export default {
i18n: I18N_AGENTS_EMPTY_STATE,
- modalId: INSTALL_AGENT_MODAL_ID,
agentDocsUrl: helpPagePath('user/clusters/agent/index'),
components: {
- GlButton,
GlEmptyState,
GlLink,
GlSprintf,
},
- directives: {
- GlModalDirective,
- },
inject: ['emptyStateImage'],
- props: {
- isChildComponent: {
- default: false,
- required: false,
- type: Boolean,
- },
- },
};
</script>
<template>
- <gl-empty-state :svg-path="emptyStateImage" title="" class="agents-empty-state">
- <template #description>
- <p class="gl-text-left">
- <gl-sprintf :message="$options.i18n.introText">
- <template #link="{ content }">
- <gl-link :href="$options.agentDocsUrl">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </template>
-
- <template #actions>
- <gl-button
- v-if="!isChildComponent"
- v-gl-modal-directive="$options.modalId"
- category="primary"
- variant="confirm"
- >
- {{ $options.i18n.buttonText }}
- </gl-button>
+ <gl-empty-state :svg-path="emptyStateImage" :svg-height="100">
+ <template #title>
+ <gl-sprintf :message="$options.i18n.introText">
+ <template #link="{ content }">
+ <gl-link :href="$options.agentDocsUrl">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
</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
index 1144ce68e2c..2decdb5307b 100644
--- a/app/assets/javascripts/clusters_list/components/agent_table.vue
+++ b/app/assets/javascripts/clusters_list/components/agent_table.vue
@@ -37,7 +37,7 @@ export default {
anchor: 'update-the-agent-version',
}),
configHelpLink: helpPagePath('user/clusters/agent/install/index', {
- anchor: 'create-an-agent-without-configuration-file',
+ anchor: 'create-an-agent-configuration-file',
}),
inject: ['gitlabVersion'],
props: {
diff --git a/app/assets/javascripts/clusters_list/components/agent_token.vue b/app/assets/javascripts/clusters_list/components/agent_token.vue
index eab3fc3ed63..751ad9795dd 100644
--- a/app/assets/javascripts/clusters_list/components/agent_token.vue
+++ b/app/assets/javascripts/clusters_list/components/agent_token.vue
@@ -8,11 +8,8 @@ import { I18N_AGENT_TOKEN } from '../constants';
export default {
i18n: I18N_AGENT_TOKEN,
- basicInstallPath: helpPagePath('user/clusters/agent/install/index', {
- anchor: 'install-the-agent-into-the-cluster',
- }),
advancedInstallPath: helpPagePath('user/clusters/agent/install/index', {
- anchor: 'advanced-installation',
+ anchor: 'advanced-installation-method',
}),
components: {
GlAlert,
@@ -43,27 +40,7 @@ export default {
<template>
<div>
- <p>
- <strong>{{ $options.i18n.tokenTitle }}</strong>
- </p>
-
- <p>
- <gl-sprintf :message="$options.i18n.tokenBody">
- <template #link="{ content }">
- <gl-link :href="$options.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 class="gl-mb-3">{{ $options.i18n.tokenLabel }}</p>
<p>
<gl-form-input-group readonly :value="agentToken" :select-on-click="true">
@@ -78,6 +55,14 @@ export default {
</p>
<p>
+ {{ $options.i18n.tokenSubtitle }}
+ </p>
+
+ <gl-alert :dismissible="false" variant="warning" class="gl-mb-5">
+ {{ $options.i18n.tokenSingleUseWarningTitle }}
+ </gl-alert>
+
+ <p>
<strong>{{ $options.i18n.basicInstallTitle }}</strong>
</p>
diff --git a/app/assets/javascripts/clusters_list/components/agents.vue b/app/assets/javascripts/clusters_list/components/agents.vue
index 70b9b8ac3c9..89b18ed6d06 100644
--- a/app/assets/javascripts/clusters_list/components/agents.vue
+++ b/app/assets/javascripts/clusters_list/components/agents.vue
@@ -20,7 +20,7 @@ export default {
'ClusterAgents|We would love to learn more about your experience with the GitLab Agent.',
),
feedbackBannerButton: s__('ClusterAgents|Give feedback'),
- error: s__('ClusterAgents|An error occurred while loading your Agents'),
+ error: s__('ClusterAgents|An error occurred while loading your agents'),
},
AGENT_FEEDBACK_ISSUE,
AGENT_FEEDBACK_KEY,
@@ -208,7 +208,7 @@ export default {
</div>
</div>
- <agent-empty-state v-else :is-child-component="isChildComponent" />
+ <agent-empty-state v-else />
</section>
<gl-alert v-else variant="danger" :dismissible="false">
diff --git a/app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue b/app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue
index 662cf2a7e36..bde76c46b4b 100644
--- a/app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue
+++ b/app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue
@@ -3,6 +3,7 @@ import {
GlDropdown,
GlDropdownItem,
GlDropdownDivider,
+ GlDropdownText,
GlSearchBoxByType,
GlSprintf,
} from '@gitlab/ui';
@@ -15,6 +16,7 @@ export default {
GlDropdown,
GlDropdownItem,
GlDropdownDivider,
+ GlDropdownText,
GlSearchBoxByType,
GlSprintf,
},
@@ -73,13 +75,24 @@ export default {
this.clearSearch();
this.focusSearch();
},
+ onKeyEnter() {
+ if (!this.searchTerm?.length) {
+ return;
+ }
+ this.$refs.dropdown.hide();
+ this.selectAgent(this.searchTerm);
+ },
},
};
</script>
<template>
- <gl-dropdown :text="dropdownText" :loading="isRegistering" @shown="handleShow">
+ <gl-dropdown ref="dropdown" :text="dropdownText" :loading="isRegistering" @shown="handleShow">
<template #header>
- <gl-search-box-by-type ref="searchInput" v-model.trim="searchTerm" />
+ <gl-search-box-by-type
+ ref="searchInput"
+ v-model.trim="searchTerm"
+ @keydown.enter.stop.prevent="onKeyEnter"
+ />
</template>
<gl-dropdown-item
v-for="agent in filteredResults"
@@ -90,9 +103,9 @@ export default {
>
{{ agent }}
</gl-dropdown-item>
- <gl-dropdown-item v-if="!filteredResults.length" ref="noMatchingResults">{{
+ <gl-dropdown-text v-if="!filteredResults.length" ref="noMatchingResults">{{
$options.i18n.noResults
- }}</gl-dropdown-item>
+ }}</gl-dropdown-text>
<template v-if="shouldRenderCreateButton">
<gl-dropdown-divider />
<gl-dropdown-item data-testid="create-config-button" @click="selectAgent(searchTerm)">
diff --git a/app/assets/javascripts/clusters_list/components/clusters_actions.vue b/app/assets/javascripts/clusters_list/components/clusters_actions.vue
index ccb973f1eb8..8fd759bd3e9 100644
--- a/app/assets/javascripts/clusters_list/components/clusters_actions.vue
+++ b/app/assets/javascripts/clusters_list/components/clusters_actions.vue
@@ -1,13 +1,5 @@
<script>
-import {
- GlButton,
- GlDropdown,
- GlDropdownItem,
- GlModalDirective,
- GlTooltipDirective,
- GlDropdownDivider,
- GlDropdownSectionHeader,
-} from '@gitlab/ui';
+import { GlDropdown, GlDropdownItem, GlModalDirective, GlTooltip } from '@gitlab/ui';
import { INSTALL_AGENT_MODAL_ID, CLUSTERS_ACTIONS } from '../constants';
@@ -15,37 +7,40 @@ export default {
i18n: CLUSTERS_ACTIONS,
INSTALL_AGENT_MODAL_ID,
components: {
- GlButton,
GlDropdown,
GlDropdownItem,
- GlDropdownDivider,
- GlDropdownSectionHeader,
+ GlTooltip,
},
directives: {
GlModalDirective,
- GlTooltip: GlTooltipDirective,
},
inject: [
'newClusterPath',
'addClusterPath',
+ 'newClusterDocsPath',
'canAddCluster',
'displayClusterAgents',
'certificateBasedClustersEnabled',
],
computed: {
- tooltip() {
- const { connectWithAgent, connectExistingCluster, dropdownDisabledHint } = this.$options.i18n;
+ shouldTriggerModal() {
+ return this.canAddCluster && this.displayClusterAgents;
+ },
+ defaultActionText() {
+ const { connectCluster, connectWithAgent, connectClusterDeprecated } = this.$options.i18n;
- if (!this.canAddCluster) {
- return dropdownDisabledHint;
- } else if (this.displayClusterAgents) {
- return connectWithAgent;
+ if (!this.displayClusterAgents) {
+ return connectClusterDeprecated;
+ } else if (!this.certificateBasedClustersEnabled) {
+ return connectCluster;
}
-
- return connectExistingCluster;
+ return connectWithAgent;
},
- shouldTriggerModal() {
- return this.canAddCluster && this.displayClusterAgents;
+ defaultActionUrl() {
+ if (this.displayClusterAgents) {
+ return null;
+ }
+ return this.addClusterPath;
},
},
};
@@ -53,46 +48,51 @@ export default {
<template>
<div class="nav-controls gl-ml-auto">
+ <gl-tooltip
+ v-if="!canAddCluster"
+ :target="() => $refs.dropdown.$el"
+ :title="$options.i18n.dropdownDisabledHint"
+ />
+
<gl-dropdown
- v-if="certificateBasedClustersEnabled"
ref="dropdown"
v-gl-modal-directive="shouldTriggerModal && $options.INSTALL_AGENT_MODAL_ID"
- v-gl-tooltip="tooltip"
+ data-qa-selector="clusters_actions_button"
category="primary"
variant="confirm"
- :text="$options.i18n.actionsButton"
+ :text="defaultActionText"
:disabled="!canAddCluster"
- :split="displayClusterAgents"
+ :split-href="defaultActionUrl"
+ split
right
>
- <template v-if="displayClusterAgents">
- <gl-dropdown-section-header>{{ $options.i18n.agent }}</gl-dropdown-section-header>
- <gl-dropdown-item
- v-gl-modal-directive="$options.INSTALL_AGENT_MODAL_ID"
- data-testid="connect-new-agent-link"
- >
- {{ $options.i18n.connectWithAgent }}
+ <gl-dropdown-item
+ v-if="displayClusterAgents"
+ :href="newClusterDocsPath"
+ data-testid="create-cluster-link"
+ @click.stop
+ >
+ {{ $options.i18n.createCluster }}
+ </gl-dropdown-item>
+
+ <template v-if="displayClusterAgents && certificateBasedClustersEnabled">
+ <gl-dropdown-item :href="newClusterPath" data-testid="new-cluster-link" @click.stop>
+ {{ $options.i18n.createClusterCertificate }}
+ </gl-dropdown-item>
+
+ <gl-dropdown-item :href="addClusterPath" data-testid="connect-cluster-link" @click.stop>
+ {{ $options.i18n.connectClusterCertificate }}
</gl-dropdown-item>
- <gl-dropdown-divider />
- <gl-dropdown-section-header>{{ $options.i18n.certificate }}</gl-dropdown-section-header>
</template>
- <gl-dropdown-item :href="newClusterPath" data-testid="new-cluster-link" @click.stop>
- {{ $options.i18n.createNewCluster }}
- </gl-dropdown-item>
- <gl-dropdown-item :href="addClusterPath" data-testid="connect-cluster-link" @click.stop>
- {{ $options.i18n.connectExistingCluster }}
+ <gl-dropdown-item
+ v-if="certificateBasedClustersEnabled && !displayClusterAgents"
+ :href="newClusterPath"
+ data-testid="new-cluster-link"
+ @click.stop
+ >
+ {{ $options.i18n.createClusterDeprecated }}
</gl-dropdown-item>
</gl-dropdown>
- <gl-button
- v-else
- v-gl-modal-directive="$options.INSTALL_AGENT_MODAL_ID"
- v-gl-tooltip="tooltip"
- :disabled="!canAddCluster"
- category="primary"
- variant="confirm"
- >
- {{ $options.i18n.connectWithAgent }}
- </gl-button>
</div>
</template>
diff --git a/app/assets/javascripts/clusters_list/components/clusters_empty_state.vue b/app/assets/javascripts/clusters_list/components/clusters_empty_state.vue
index 76bec05cfc7..f4134ab5072 100644
--- a/app/assets/javascripts/clusters_list/components/clusters_empty_state.vue
+++ b/app/assets/javascripts/clusters_list/components/clusters_empty_state.vue
@@ -1,6 +1,5 @@
<script>
-import { GlEmptyState, GlButton, GlLink, GlSprintf, GlAlert } from '@gitlab/ui';
-import { mapState } from 'vuex';
+import { GlEmptyState, GlLink, GlSprintf, GlAlert } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
import { I18N_CLUSTERS_EMPTY_STATE } from '../constants';
@@ -8,35 +7,24 @@ export default {
i18n: I18N_CLUSTERS_EMPTY_STATE,
components: {
GlEmptyState,
- GlButton,
GlLink,
GlSprintf,
GlAlert,
},
- inject: ['emptyStateHelpText', 'clustersEmptyStateImage', 'addClusterPath'],
- props: {
- isChildComponent: {
- default: false,
- required: false,
- type: Boolean,
- },
- },
+ inject: ['emptyStateHelpText', 'clustersEmptyStateImage'],
clustersHelpUrl: helpPagePath('user/infrastructure/clusters/index', {
anchor: 'certificate-based-kubernetes-integration-deprecated',
}),
blogPostUrl:
'https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/',
- computed: {
- ...mapState(['canAddCluster']),
- },
};
</script>
<template>
<div>
- <gl-empty-state :svg-path="clustersEmptyStateImage" title="">
- <template #description>
- <p class="gl-text-left">
+ <gl-empty-state :svg-path="clustersEmptyStateImage" :svg-height="100">
+ <template #title>
+ <p>
<gl-sprintf :message="$options.i18n.introText">
<template #link="{ content }">
<gl-link :href="$options.clustersHelpUrl">{{ content }}</gl-link>
@@ -48,28 +36,12 @@ export default {
{{ emptyStateHelpText }}
</p>
</template>
-
- <template #actions>
- <gl-button
- v-if="!isChildComponent"
- data-testid="integration-primary-button"
- data-qa-selector="add_kubernetes_cluster_link"
- category="primary"
- variant="confirm"
- :disabled="!canAddCluster"
- :href="addClusterPath"
- >
- {{ $options.i18n.buttonText }}
- </gl-button>
- </template>
</gl-empty-state>
<gl-alert variant="warning" :dismissible="false">
<gl-sprintf :message="$options.i18n.alertText">
<template #link="{ content }">
- <gl-link :href="$options.blogPostUrl" target="_blank">
- {{ content }}
- </gl-link>
+ <gl-link :href="$options.blogPostUrl" target="_blank">{{ content }}</gl-link>
</template>
</gl-sprintf>
</gl-alert>
diff --git a/app/assets/javascripts/clusters_list/components/clusters_view_all.vue b/app/assets/javascripts/clusters_list/components/clusters_view_all.vue
index b730c0adfa2..73ca804e111 100644
--- a/app/assets/javascripts/clusters_list/components/clusters_view_all.vue
+++ b/app/assets/javascripts/clusters_list/components/clusters_view_all.vue
@@ -1,22 +1,7 @@
<script>
-import {
- GlCard,
- GlSprintf,
- GlPopover,
- GlLink,
- GlButton,
- GlBadge,
- GlLoadingIcon,
- GlModalDirective,
- GlTooltipDirective,
-} from '@gitlab/ui';
+import { GlCard, GlSprintf, GlPopover, GlLink, GlBadge, GlLoadingIcon } from '@gitlab/ui';
import { mapState } from 'vuex';
-import {
- AGENT_CARD_INFO,
- CERTIFICATE_BASED_CARD_INFO,
- MAX_CLUSTERS_LIST,
- INSTALL_AGENT_MODAL_ID,
-} from '../constants';
+import { AGENT_CARD_INFO, CERTIFICATE_BASED_CARD_INFO, MAX_CLUSTERS_LIST } from '../constants';
import Clusters from './clusters.vue';
import Agents from './agents.vue';
@@ -26,23 +11,16 @@ export default {
GlSprintf,
GlPopover,
GlLink,
- GlButton,
GlBadge,
GlLoadingIcon,
Clusters,
Agents,
},
- directives: {
- GlModalDirective,
- GlTooltip: GlTooltipDirective,
- },
MAX_CLUSTERS_LIST,
- INSTALL_AGENT_MODAL_ID,
i18n: {
agent: AGENT_CARD_INFO,
certificate: CERTIFICATE_BASED_CARD_INFO,
},
- inject: ['addClusterPath', 'canAddCluster'],
props: {
defaultBranchName: {
default: '.noBranch',
@@ -93,14 +71,6 @@ export default {
return cardTitle;
},
- installAgentTooltip() {
- return this.canAddCluster ? '' : this.$options.i18n.agent.installAgentDisabledHint;
- },
- connectExistingClusterTooltip() {
- return this.canAddCluster
- ? ''
- : this.$options.i18n.certificate.connectExistingClusterDisabledHint;
- },
},
methods: {
cardFooterNumber(number) {
@@ -177,21 +147,6 @@ export default {
><template #number>{{ cardFooterNumber(totalAgents) }}</template></gl-sprintf
></gl-link
>
- <div
- v-gl-tooltip="installAgentTooltip"
- class="gl-display-inline-block"
- tabindex="-1"
- data-testid="install-agent-button-tooltip"
- >
- <gl-button
- v-gl-modal-directive="$options.INSTALL_AGENT_MODAL_ID"
- class="gl-ml-4"
- category="secondary"
- variant="confirm"
- :disabled="!canAddCluster"
- >{{ $options.i18n.agent.actionText }}</gl-button
- >
- </div>
</template>
</gl-card>
@@ -214,7 +169,7 @@ export default {
<gl-badge variant="warning">{{ $options.i18n.certificate.badgeText }}</gl-badge>
</template>
- <clusters :limit="$options.MAX_CLUSTERS_LIST" :is-child-component="true" />
+ <clusters :limit="$options.MAX_CLUSTERS_LIST" />
<template #footer>
<gl-link
@@ -226,22 +181,6 @@ export default {
><template #number>{{ cardFooterNumber(totalClusters) }}</template></gl-sprintf
></gl-link
>
- <div
- v-gl-tooltip="connectExistingClusterTooltip"
- class="gl-display-inline-block"
- tabindex="-1"
- data-testid="connect-existing-cluster-button-tooltip"
- >
- <gl-button
- category="secondary"
- data-qa-selector="connect_existing_cluster_button"
- variant="confirm"
- class="gl-ml-4"
- :href="addClusterPath"
- :disabled="!canAddCluster"
- >{{ $options.i18n.certificate.actionText }}</gl-button
- >
- </div>
</template>
</gl-card>
</div>
diff --git a/app/assets/javascripts/clusters_list/components/install_agent_modal.vue b/app/assets/javascripts/clusters_list/components/install_agent_modal.vue
index ae0affe4c8b..3b39c3aac45 100644
--- a/app/assets/javascripts/clusters_list/components/install_agent_modal.vue
+++ b/app/assets/javascripts/clusters_list/components/install_agent_modal.vue
@@ -31,7 +31,7 @@ export default {
EVENT_LABEL_MODAL,
enableKasPath: helpPagePath('administration/clusters/kas'),
registerAgentPath: helpPagePath('user/clusters/agent/install/index', {
- anchor: 'register-an-agent-with-gitlab',
+ anchor: 'register-the-agent-with-gitlab',
}),
components: {
AvailableAgentsDropdown,
diff --git a/app/assets/javascripts/clusters_list/constants.js b/app/assets/javascripts/clusters_list/constants.js
index c914ee518b2..4a168e811aa 100644
--- a/app/assets/javascripts/clusters_list/constants.js
+++ b/app/assets/javascripts/clusters_list/constants.js
@@ -90,26 +90,20 @@ export const I18N_AGENT_TABLE = {
export const I18N_AGENT_TOKEN = {
copyToken: s__('ClusterAgents|Copy token'),
copyCommand: s__('ClusterAgents|Copy command'),
- tokenTitle: s__('ClusterAgents|Registration token'),
-
- tokenBody: s__(
- `ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}`,
- ),
+ tokenLabel: s__('ClusterAgents|Agent access token:'),
tokenSingleUseWarningTitle: s__(
'ClusterAgents|You cannot see this token again after you close this window.',
),
- tokenSingleUseWarningBody: s__(
- `ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window.`,
- ),
+ tokenSubtitle: s__('ClusterAgents|The agent uses the token to connect with GitLab.'),
- basicInstallTitle: s__('ClusterAgents|Recommended installation method'),
- basicInstallBody: __(
- `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.`,
+ basicInstallTitle: s__('ClusterAgents|Install using Helm (recommended)'),
+ basicInstallBody: s__(
+ 'ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included in the command.',
),
advancedInstallTitle: s__('ClusterAgents|Advanced installation methods'),
advancedInstallBody: s__(
- 'ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}.',
+ 'ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available.',
),
};
@@ -118,20 +112,15 @@ export const I18N_AGENT_MODAL = {
close: __('Close'),
cancel: __('Cancel'),
- modalTitle: s__('ClusterAgents|Connect a cluster through an agent'),
+ modalTitle: s__('ClusterAgents|Connect a Kubernetes cluster'),
modalBody: s__(
'ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:',
),
enableKasText: s__(
"ClusterAgents|Your instance doesn't have the %{linkStart}GitLab Agent Server (KAS)%{linkEnd} set up. Ask a GitLab Administrator to install it.",
),
- altText: s__('ClusterAgents|GitLab Agent for Kubernetes'),
+ altText: s__('ClusterAgents|GitLab agent for Kubernetes'),
learnMoreLink: s__('ClusterAgents|How do I register an agent?'),
- 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. %{linkStart}What are registration tokens?%{linkEnd}`,
- ),
registrationErrorTitle: s__('ClusterAgents|Failed to register an agent'),
unknownError: s__('ClusterAgents|An unknown error occurred. Please try again.'),
};
@@ -180,16 +169,14 @@ export const AGENT_STATUSES = {
export const I18N_AGENTS_EMPTY_STATE = {
introText: s__(
- 'ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more.',
+ 'ClusterIntegration|Use the %{linkStart}GitLab agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more.',
),
- buttonText: s__('ClusterAgents|Connect with the GitLab Agent'),
};
export const I18N_CLUSTERS_EMPTY_STATE = {
introText: s__(
'ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}.',
),
- buttonText: s__('ClusterIntegration|Connect with a certificate'),
alertText: s__(
'ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5.',
),
@@ -201,19 +188,15 @@ export const AGENT_CARD_INFO = {
emptyTitle: s__('ClusterAgents|No agents'),
tooltip: {
label: s__('ClusterAgents|Recommended'),
- title: s__('ClusterAgents|GitLab Agent'),
+ title: s__('ClusterAgents|GitLab agent'),
text: sprintf(
s__(
- 'ClusterAgents|The GitLab Agent provides an increased level of security when connecting Kubernetes clusters to GitLab. %{linkStart}Learn more about the GitLab Agent.%{linkEnd}',
+ 'ClusterAgents|The GitLab agent provides an increased level of security when connecting Kubernetes clusters to GitLab. %{linkStart}Learn more about the GitLab agent.%{linkEnd}',
),
),
link: helpPagePath('user/clusters/agent/index'),
},
- actionText: s__('ClusterAgents|Install a new agent'),
footerText: sprintf(s__('ClusterAgents|View all %{number} agents')),
- installAgentDisabledHint: s__(
- 'ClusterAgents|Requires a Maintainer or greater role to install new agents',
- ),
};
export const CERTIFICATE_BASED_CARD_INFO = {
@@ -222,12 +205,8 @@ export const CERTIFICATE_BASED_CARD_INFO = {
s__('ClusterAgents|%{number} of %{total} clusters connected through cluster certificates'),
),
emptyTitle: s__('ClusterAgents|No clusters connected through cluster certificates'),
- actionText: s__('ClusterAgents|Connect existing cluster'),
footerText: sprintf(s__('ClusterAgents|View all %{number} clusters')),
badgeText: s__('ClusterAgents|Deprecated'),
- connectExistingClusterDisabledHint: s__(
- 'ClusterAgents|Requires a maintainer or greater role to connect existing clusters',
- ),
};
export const MAX_CLUSTERS_LIST = 6;
@@ -252,12 +231,13 @@ export const CERTIFICATE_TAB = {
export const CLUSTERS_TABS = [ALL_TAB, AGENT_TAB, CERTIFICATE_TAB];
export const CLUSTERS_ACTIONS = {
- actionsButton: s__('ClusterAgents|Actions'),
- createNewCluster: s__('ClusterAgents|Create a new cluster'),
- connectWithAgent: s__('ClusterAgents|Connect with an agent'),
- connectExistingCluster: s__('ClusterAgents|Connect with a certificate'),
- agent: s__('ClusterAgents|Agent'),
- certificate: s__('ClusterAgents|Certificate'),
+ connectCluster: s__('ClusterAgents|Connect a cluster'),
+ connectWithAgent: s__('ClusterAgents|Connect a cluster (agent)'),
+ connectClusterDeprecated: s__('ClusterAgents|Connect a cluster (deprecated)'),
+ createClusterDeprecated: s__('ClusterAgents|Create a cluster (deprecated)'),
+ createCluster: s__('ClusterAgents|Create a cluster'),
+ createClusterCertificate: s__('ClusterAgents|Create a cluster (certificate - deprecated)'),
+ connectClusterCertificate: s__('ClusterAgents|Connect a cluster (certificate - deprecated)'),
dropdownDisabledHint: s__(
'ClusterAgents|Requires a Maintainer or greater role to perform these actions',
),
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
index 7743ffba5de..76920a0aef4 100644
--- a/app/assets/javascripts/clusters_list/graphql/queries/get_agents.query.graphql
+++ b/app/assets/javascripts/clusters_list/graphql/queries/get_agents.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
#import "../fragments/cluster_agent.fragment.graphql"
query getAgents(
diff --git a/app/assets/javascripts/clusters_list/index.js b/app/assets/javascripts/clusters_list/index.js
index 27eebc9d891..f6dfb96ffd9 100644
--- a/app/assets/javascripts/clusters_list/index.js
+++ b/app/assets/javascripts/clusters_list/index.js
@@ -25,6 +25,7 @@ export default () => {
kasAddress,
newClusterPath,
addClusterPath,
+ newClusterDocsPath,
emptyStateHelpText,
clustersEmptyStateImage,
canAddCluster,
@@ -43,6 +44,7 @@ export default () => {
kasAddress,
newClusterPath,
addClusterPath,
+ newClusterDocsPath,
emptyStateHelpText,
clustersEmptyStateImage,
canAddCluster: parseBoolean(canAddCluster),
diff --git a/app/assets/javascripts/code_navigation/components/app.vue b/app/assets/javascripts/code_navigation/components/app.vue
index 5c77f087d63..81edbb4182e 100644
--- a/app/assets/javascripts/code_navigation/components/app.vue
+++ b/app/assets/javascripts/code_navigation/components/app.vue
@@ -1,6 +1,6 @@
<script>
import { mapActions, mapState } from 'vuex';
-import eventHub from '../../notes/event_hub';
+import eventHub from '~/notes/event_hub';
import Popover from './popover.vue';
export default {
@@ -23,6 +23,11 @@ export default {
required: false,
default: null,
},
+ wrapTextNodes: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
...mapState([
@@ -37,6 +42,7 @@ export default {
const initialData = {
blobs: [{ path: this.blobPath, codeNavigationPath: this.codeNavigationPath }],
definitionPathPrefix: this.pathPrefix,
+ wrapTextNodes: this.wrapTextNodes,
};
this.setInitialData(initialData);
}
diff --git a/app/assets/javascripts/code_navigation/store/actions.js b/app/assets/javascripts/code_navigation/store/actions.js
index 0b6b8437db5..562b78a891a 100644
--- a/app/assets/javascripts/code_navigation/store/actions.js
+++ b/app/assets/javascripts/code_navigation/store/actions.js
@@ -22,7 +22,7 @@ export default {
...d,
definitionLineNumber: parseInt(d.definition_path?.split('#L').pop() || 0, 10),
};
- addInteractionClass(path, d);
+ addInteractionClass({ path, d, wrapTextNodes: state.wrapTextNodes });
}
return acc;
}, {});
@@ -34,7 +34,9 @@ export default {
},
showBlobInteractionZones({ state }, path) {
if (state.data && state.data[path]) {
- Object.values(state.data[path]).forEach((d) => addInteractionClass(path, d));
+ Object.values(state.data[path]).forEach((d) =>
+ addInteractionClass({ path, d, wrapTextNodes: state.wrapTextNodes }),
+ );
}
},
showDefinition({ commit, state }, { target: el }) {
diff --git a/app/assets/javascripts/code_navigation/store/mutations.js b/app/assets/javascripts/code_navigation/store/mutations.js
index 07b190c7476..98beffe231c 100644
--- a/app/assets/javascripts/code_navigation/store/mutations.js
+++ b/app/assets/javascripts/code_navigation/store/mutations.js
@@ -1,9 +1,10 @@
import * as types from './mutation_types';
export default {
- [types.SET_INITIAL_DATA](state, { blobs, definitionPathPrefix }) {
+ [types.SET_INITIAL_DATA](state, { blobs, definitionPathPrefix, wrapTextNodes }) {
state.blobs = blobs;
state.definitionPathPrefix = definitionPathPrefix;
+ state.wrapTextNodes = wrapTextNodes;
},
[types.REQUEST_DATA](state) {
state.loading = true;
diff --git a/app/assets/javascripts/code_navigation/store/state.js b/app/assets/javascripts/code_navigation/store/state.js
index 569d2f7b319..17505b8392c 100644
--- a/app/assets/javascripts/code_navigation/store/state.js
+++ b/app/assets/javascripts/code_navigation/store/state.js
@@ -2,6 +2,7 @@ export default () => ({
blobs: [],
loading: false,
data: null,
+ wrapTextNodes: false,
currentDefinition: null,
currentDefinitionPosition: null,
currentBlobPath: null,
diff --git a/app/assets/javascripts/code_navigation/utils/dom_utils.js b/app/assets/javascripts/code_navigation/utils/dom_utils.js
new file mode 100644
index 00000000000..1a65c1a64a2
--- /dev/null
+++ b/app/assets/javascripts/code_navigation/utils/dom_utils.js
@@ -0,0 +1,31 @@
+const TEXT_NODE = 3;
+
+const isTextNode = ({ nodeType }) => nodeType === TEXT_NODE;
+
+const isBlank = (str) => !str || /^\s*$/.test(str);
+
+const isMatch = (s1, s2) => !isBlank(s1) && s1.trim() === s2.trim();
+
+const createSpan = (content) => {
+ const span = document.createElement('span');
+ span.innerText = content;
+ return span;
+};
+
+const wrapSpacesWithSpans = (text) => text.replace(/ /g, createSpan(' ').outerHTML);
+
+const wrapTextWithSpan = (el, text) => {
+ if (isTextNode(el) && isMatch(el.textContent, text)) {
+ const newEl = createSpan(text.trim());
+ el.replaceWith(newEl);
+ }
+};
+
+const wrapNodes = (text) => {
+ const wrapper = createSpan();
+ wrapper.innerHTML = wrapSpacesWithSpans(text);
+ wrapper.childNodes.forEach((el) => wrapTextWithSpan(el, text));
+ return wrapper.childNodes;
+};
+
+export { wrapNodes, isTextNode };
diff --git a/app/assets/javascripts/code_navigation/utils/index.js b/app/assets/javascripts/code_navigation/utils/index.js
index 6c078891ed4..0d72153d8fe 100644
--- a/app/assets/javascripts/code_navigation/utils/index.js
+++ b/app/assets/javascripts/code_navigation/utils/index.js
@@ -1,9 +1,11 @@
+import { wrapNodes, isTextNode } from './dom_utils';
+
export const cachedData = new Map();
export const getCurrentHoverElement = () => cachedData.get('current');
export const setCurrentHoverElement = (el) => cachedData.set('current', el);
-export const addInteractionClass = (path, d) => {
+export const addInteractionClass = ({ path, d, wrapTextNodes }) => {
const lineNumber = d.start_line + 1;
const lines = document
.querySelector(`[data-path="${path}"]`)
@@ -12,13 +14,24 @@ export const addInteractionClass = (path, d) => {
lines.forEach((line) => {
let charCount = 0;
+
+ if (wrapTextNodes) {
+ line.childNodes.forEach((elm) => {
+ if (isTextNode(elm)) {
+ // Highlight.js does not wrap all text nodes by default
+ // We need all text nodes to be wrapped in order to append code nav attributes
+ elm.replaceWith(...wrapNodes(elm.textContent));
+ }
+ });
+ }
+
const el = [...line.childNodes].find(({ textContent }) => {
if (charCount === d.start_char) return true;
charCount += textContent.length;
return false;
});
- if (el) {
+ if (el && !isTextNode(el)) {
el.setAttribute('data-char-index', d.start_char);
el.setAttribute('data-line-index', d.start_line);
el.classList.add('cursor-pointer', 'code-navigation', 'js-code-navigation');
diff --git a/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue b/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
index 59066162960..32d9159ee34 100644
--- a/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
+++ b/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
@@ -1,8 +1,8 @@
<script>
import { GlIcon, GlLink, GlSprintf } from '@gitlab/ui';
import createFlash from '~/flash';
-import Api from '../../api';
-import { __ } from '../../locale';
+import Api from '~/api';
+import { __ } from '~/locale';
import state from '../state';
import Dropdown from './dropdown.vue';
@@ -87,7 +87,7 @@ export default {
},
showWarning() {
if (this.warningText) {
- this.warningText.classList.remove('hidden');
+ this.warningText.classList.remove('gl-display-none');
}
if (this.createBtn) {
@@ -120,7 +120,7 @@ export default {
:selected-project="selectedProject"
@click="selectProject"
/>
- <p class="text-muted mt-1 mb-0">
+ <p class="gl-text-gray-600 gl-mt-1 gl-mb-0">
<template v-if="projects.length">
{{ $options.i18n.privateForkSelected }}
</template>
@@ -134,7 +134,7 @@ export default {
</template>
<gl-link
:href="helpPagePath"
- class="w-auto p-0 d-inline-block text-primary bg-transparent"
+ class="gl-w-auto gl-p-0 gl-display-inline-block gl-bg-transparent"
target="_blank"
>
<span class="sr-only">{{ $options.i18n.readMore }}</span>
diff --git a/app/assets/javascripts/content_editor/components/code_block_bubble_menu.vue b/app/assets/javascripts/content_editor/components/code_block_bubble_menu.vue
new file mode 100644
index 00000000000..87f22a27856
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/code_block_bubble_menu.vue
@@ -0,0 +1,146 @@
+<script>
+import {
+ GlButton,
+ GlButtonGroup,
+ GlDropdown,
+ GlDropdownItem,
+ GlSearchBoxByType,
+ GlTooltipDirective as GlTooltip,
+} from '@gitlab/ui';
+import { BubbleMenu } from '@tiptap/vue-2';
+import codeBlockLanguageLoader from '../services/code_block_language_loader';
+import CodeBlockHighlight from '../extensions/code_block_highlight';
+import Diagram from '../extensions/diagram';
+import Frontmatter from '../extensions/frontmatter';
+import EditorStateObserver from './editor_state_observer.vue';
+
+const CODE_BLOCK_NODE_TYPES = [CodeBlockHighlight.name, Diagram.name, Frontmatter.name];
+
+export default {
+ components: {
+ BubbleMenu,
+ GlButton,
+ GlButtonGroup,
+ GlDropdown,
+ GlDropdownItem,
+ GlSearchBoxByType,
+ EditorStateObserver,
+ },
+ directives: {
+ GlTooltip,
+ },
+ inject: ['tiptapEditor'],
+ data() {
+ return {
+ selectedLanguage: {},
+ filterTerm: '',
+ filteredLanguages: [],
+ };
+ },
+ watch: {
+ filterTerm: {
+ handler(val) {
+ this.filteredLanguages = codeBlockLanguageLoader.filterLanguages(val);
+ },
+ immediate: true,
+ },
+ },
+ methods: {
+ shouldShow: ({ editor }) => {
+ return CODE_BLOCK_NODE_TYPES.some((type) => editor.isActive(type));
+ },
+
+ getSelectedLanguage() {
+ const { language } = this.tiptapEditor.getAttributes(this.getCodeBlockType());
+
+ this.selectedLanguage = codeBlockLanguageLoader.findLanguageBySyntax(language);
+ },
+
+ async setSelectedLanguage(language) {
+ this.selectedLanguage = language;
+
+ await codeBlockLanguageLoader.loadLanguages([language.syntax]);
+
+ this.tiptapEditor.commands.setCodeBlock({ language: this.selectedLanguage.syntax });
+ },
+
+ tippyOnBeforeUpdate(tippy, props) {
+ if (props.getReferenceClientRect) {
+ // eslint-disable-next-line no-param-reassign
+ props.getReferenceClientRect = () => {
+ const { view } = this.tiptapEditor;
+ const { from } = this.tiptapEditor.state.selection;
+
+ for (let { node } = view.domAtPos(from); node; node = node.parentElement) {
+ if (node.nodeName?.toLowerCase() === 'pre') {
+ return node.getBoundingClientRect();
+ }
+ }
+
+ return new DOMRect(-1000, -1000, 0, 0);
+ };
+ }
+ },
+
+ deleteCodeBlock() {
+ this.tiptapEditor.chain().focus().deleteNode(this.getCodeBlockType()).run();
+ },
+
+ getCodeBlockType() {
+ return (
+ CODE_BLOCK_NODE_TYPES.find((type) => this.tiptapEditor.isActive(type)) ||
+ CodeBlockHighlight.name
+ );
+ },
+ },
+};
+</script>
+<template>
+ <bubble-menu
+ data-testid="code-block-bubble-menu"
+ class="gl-shadow gl-rounded-base"
+ :editor="tiptapEditor"
+ plugin-key="bubbleMenuCodeBlock"
+ :should-show="shouldShow"
+ :tippy-options="{ onBeforeUpdate: tippyOnBeforeUpdate }"
+ >
+ <editor-state-observer @transaction="getSelectedLanguage">
+ <gl-button-group>
+ <gl-dropdown contenteditable="false" boundary="viewport" :text="selectedLanguage.label">
+ <template #header>
+ <gl-search-box-by-type
+ v-model="filterTerm"
+ :clear-button-title="__('Clear')"
+ :placeholder="__('Search')"
+ />
+ </template>
+
+ <template #highlighted-items>
+ <gl-dropdown-item :key="selectedLanguage.syntax" is-check-item :is-checked="true">
+ {{ selectedLanguage.label }}
+ </gl-dropdown-item>
+ </template>
+
+ <gl-dropdown-item
+ v-for="language in filteredLanguages"
+ v-show="selectedLanguage.syntax !== language.syntax"
+ :key="language.syntax"
+ @click="setSelectedLanguage(language)"
+ >
+ {{ language.label }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ <gl-button
+ v-gl-tooltip
+ variant="default"
+ category="primary"
+ size="medium"
+ :aria-label="__('Delete code block')"
+ :title="__('Delete code block')"
+ icon="remove"
+ @click="deleteCodeBlock"
+ />
+ </gl-button-group>
+ </editor-state-observer>
+ </bubble-menu>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/content_editor.vue b/app/assets/javascripts/content_editor/components/content_editor.vue
index a942c9f1149..5b3f4f4ddf2 100644
--- a/app/assets/javascripts/content_editor/components/content_editor.vue
+++ b/app/assets/javascripts/content_editor/components/content_editor.vue
@@ -5,6 +5,7 @@ import ContentEditorAlert from './content_editor_alert.vue';
import ContentEditorProvider from './content_editor_provider.vue';
import EditorStateObserver from './editor_state_observer.vue';
import FormattingBubbleMenu from './formatting_bubble_menu.vue';
+import CodeBlockBubbleMenu from './code_block_bubble_menu.vue';
import TopToolbar from './top_toolbar.vue';
import LoadingIndicator from './loading_indicator.vue';
@@ -16,6 +17,7 @@ export default {
TiptapEditorContent,
TopToolbar,
FormattingBubbleMenu,
+ CodeBlockBubbleMenu,
EditorStateObserver,
},
props: {
@@ -89,6 +91,7 @@ export default {
<top-toolbar ref="toolbar" class="gl-mb-4" />
<div class="gl-relative">
<formatting-bubble-menu />
+ <code-block-bubble-menu />
<tiptap-editor-content class="md" :editor="contentEditor.tiptapEditor" />
<loading-indicator />
</div>
diff --git a/app/assets/javascripts/content_editor/components/formatting_bubble_menu.vue b/app/assets/javascripts/content_editor/components/formatting_bubble_menu.vue
index 14a553ff30b..103079534bc 100644
--- a/app/assets/javascripts/content_editor/components/formatting_bubble_menu.vue
+++ b/app/assets/javascripts/content_editor/components/formatting_bubble_menu.vue
@@ -3,6 +3,10 @@ import { GlButtonGroup } from '@gitlab/ui';
import { BubbleMenu } from '@tiptap/vue-2';
import { BUBBLE_MENU_TRACKING_ACTION } from '../constants';
import trackUIControl from '../services/track_ui_control';
+import Code from '../extensions/code';
+import CodeBlockHighlight from '../extensions/code_block_highlight';
+import Diagram from '../extensions/diagram';
+import Frontmatter from '../extensions/frontmatter';
import ToolbarButton from './toolbar_button.vue';
export default {
@@ -16,6 +20,14 @@ export default {
trackToolbarControlExecution({ contentType, value }) {
trackUIControl({ action: BUBBLE_MENU_TRACKING_ACTION, property: contentType, value });
},
+
+ shouldShow: ({ editor, from, to }) => {
+ if (from === to) return false;
+
+ const exclude = [Code.name, CodeBlockHighlight.name, Diagram.name, Frontmatter.name];
+
+ return !exclude.some((type) => editor.isActive(type));
+ },
},
};
</script>
@@ -24,6 +36,7 @@ export default {
data-testid="formatting-bubble-menu"
class="gl-shadow gl-rounded-base"
:editor="tiptapEditor"
+ :should-show="shouldShow"
>
<gl-button-group>
<toolbar-button
diff --git a/app/assets/javascripts/content_editor/components/loading_indicator.vue b/app/assets/javascripts/content_editor/components/loading_indicator.vue
index 5b9383d6e11..620324adb06 100644
--- a/app/assets/javascripts/content_editor/components/loading_indicator.vue
+++ b/app/assets/javascripts/content_editor/components/loading_indicator.vue
@@ -30,6 +30,7 @@ export default {
>
<div
v-if="isLoading"
+ data-testid="content-editor-loading-indicator"
class="gl-w-full gl-display-flex gl-justify-content-center gl-align-items-center gl-absolute gl-top-0 gl-bottom-0"
>
<div class="gl-bg-white gl-absolute gl-w-full gl-h-full gl-opacity-3"></div>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/image.vue b/app/assets/javascripts/content_editor/components/wrappers/image.vue
deleted file mode 100644
index 5b81e5fddcc..00000000000
--- a/app/assets/javascripts/content_editor/components/wrappers/image.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-<script>
-import { GlLoadingIcon } from '@gitlab/ui';
-import { NodeViewWrapper } from '@tiptap/vue-2';
-
-export default {
- name: 'ImageWrapper',
- components: {
- NodeViewWrapper,
- GlLoadingIcon,
- },
- props: {
- node: {
- type: Object,
- required: true,
- },
- },
-};
-</script>
-<template>
- <node-view-wrapper class="gl-display-inline-block">
- <span class="gl-relative">
- <img
- data-testid="image"
- class="gl-max-w-full gl-h-auto"
- :title="node.attrs.title"
- :class="{ 'gl-opacity-5': node.attrs.uploading }"
- :src="node.attrs.src"
- />
- <gl-loading-icon v-if="node.attrs.uploading" class="gl-absolute gl-left-50p gl-top-half" />
- </span>
- </node-view-wrapper>
-</template>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/media.vue b/app/assets/javascripts/content_editor/components/wrappers/media.vue
new file mode 100644
index 00000000000..37119bdd066
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/wrappers/media.vue
@@ -0,0 +1,51 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import { NodeViewWrapper } from '@tiptap/vue-2';
+
+const tagNameMap = {
+ image: 'img',
+ video: 'video',
+ audio: 'audio',
+};
+
+export default {
+ name: 'MediaWrapper',
+ components: {
+ NodeViewWrapper,
+ GlLoadingIcon,
+ },
+ props: {
+ node: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ tagName() {
+ return tagNameMap[this.node.type.name] || 'img';
+ },
+ },
+};
+</script>
+<template>
+ <node-view-wrapper class="gl-display-inline-block">
+ <span class="gl-relative" :class="{ [`media-container ${tagName}-container`]: true }">
+ <gl-loading-icon v-if="node.attrs.uploading" class="gl-absolute gl-left-50p gl-top-half" />
+ <component
+ :is="tagName"
+ data-testid="media"
+ :class="{
+ 'gl-max-w-full gl-h-auto': tagName !== 'audio',
+ 'gl-opacity-5': node.attrs.uploading,
+ }"
+ :title="node.attrs.title || node.attrs.alt"
+ :alt="node.attrs.alt"
+ :src="node.attrs.src"
+ controls="true"
+ />
+ <a v-if="tagName !== 'img'" :href="node.attrs.canonicalSrc || node.attrs.src" @click.prevent>
+ {{ node.attrs.title || node.attrs.alt }}
+ </a>
+ </span>
+ </node-view-wrapper>
+</template>
diff --git a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
index 204ac07d401..61f379fc0a2 100644
--- a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
+++ b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
@@ -1,10 +1,21 @@
import { CodeBlockLowlight } from '@tiptap/extension-code-block-lowlight';
-import { lowlight } from 'lowlight/lib/all';
+import { textblockTypeInputRule } from '@tiptap/core';
+import codeBlockLanguageLoader from '../services/code_block_language_loader';
const extractLanguage = (element) => element.getAttribute('lang');
+export const backtickInputRegex = /^```([a-z]+)?[\s\n]$/;
+export const tildeInputRegex = /^~~~([a-z]+)?[\s\n]$/;
export default CodeBlockLowlight.extend({
isolating: true,
+ exitOnArrowDown: false,
+
+ addOptions() {
+ return {
+ ...this.parent?.(),
+ languageLoader: codeBlockLanguageLoader,
+ };
+ },
addAttributes() {
return {
@@ -18,16 +29,40 @@ export default CodeBlockLowlight.extend({
},
};
},
+ addInputRules() {
+ const { languageLoader } = this.options;
+ const getAttributes = (match) => languageLoader?.loadLanguageFromInputRule(match) || {};
+
+ return [
+ textblockTypeInputRule({
+ find: backtickInputRegex,
+ type: this.type,
+ getAttributes,
+ }),
+ textblockTypeInputRule({
+ find: tildeInputRegex,
+ type: this.type,
+ getAttributes,
+ }),
+ ];
+ },
+ parseHTML() {
+ return [
+ ...(this.parent?.() || []),
+ {
+ tag: 'div.markdown-code-block',
+ skip: true,
+ },
+ ];
+ },
renderHTML({ HTMLAttributes }) {
return [
'pre',
{
...HTMLAttributes,
- class: `content-editor-code-block ${HTMLAttributes.class}`,
+ class: `content-editor-code-block ${gon.user_color_scheme} ${HTMLAttributes.class}`,
},
['code', {}, 0],
];
},
-}).configure({
- lowlight,
});
diff --git a/app/assets/javascripts/content_editor/extensions/diagram.js b/app/assets/javascripts/content_editor/extensions/diagram.js
new file mode 100644
index 00000000000..d192b815092
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/diagram.js
@@ -0,0 +1,56 @@
+import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
+import CodeBlockHighlight from './code_block_highlight';
+
+export default CodeBlockHighlight.extend({
+ name: 'diagram',
+
+ isolating: true,
+
+ addAttributes() {
+ return {
+ language: {
+ default: null,
+ parseHTML: (element) => {
+ return element.dataset.diagram;
+ },
+ },
+ };
+ },
+
+ parseHTML() {
+ return [
+ {
+ priority: PARSE_HTML_PRIORITY_HIGHEST,
+ tag: '[data-diagram]',
+ getContent(element, schema) {
+ const source = atob(element.dataset.diagramSrc.replace('data:text/plain;base64,', ''));
+ const node = schema.node('paragraph', {}, [schema.text(source)]);
+ return node.content;
+ },
+ },
+ ];
+ },
+
+ renderHTML({ HTMLAttributes: { language, ...HTMLAttributes } }) {
+ return [
+ 'div',
+ [
+ 'pre',
+ {
+ language,
+ class: `content-editor-code-block code highlight`,
+ ...HTMLAttributes,
+ },
+ ['code', {}, 0],
+ ],
+ ];
+ },
+
+ addCommands() {
+ return {};
+ },
+
+ addInputRules() {
+ return [];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/image.js b/app/assets/javascripts/content_editor/extensions/image.js
index 519f7f168ce..311db8151cb 100644
--- a/app/assets/javascripts/content_editor/extensions/image.js
+++ b/app/assets/javascripts/content_editor/extensions/image.js
@@ -1,6 +1,6 @@
import { Image } from '@tiptap/extension-image';
import { VueNodeViewRenderer } from '@tiptap/vue-2';
-import ImageWrapper from '../components/wrappers/image.vue';
+import MediaWrapper from '../components/wrappers/media.vue';
import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
const resolveImageEl = (element) =>
@@ -78,6 +78,6 @@ export default Image.extend({
];
},
addNodeView() {
- return VueNodeViewRenderer(ImageWrapper);
+ return VueNodeViewRenderer(MediaWrapper);
},
});
diff --git a/app/assets/javascripts/content_editor/extensions/playable.js b/app/assets/javascripts/content_editor/extensions/playable.js
index 0062bc563db..2c5269377c5 100644
--- a/app/assets/javascripts/content_editor/extensions/playable.js
+++ b/app/assets/javascripts/content_editor/extensions/playable.js
@@ -1,6 +1,8 @@
/* eslint-disable @gitlab/require-i18n-strings */
import { Node } from '@tiptap/core';
+import { VueNodeViewRenderer } from '@tiptap/vue-2';
+import MediaWrapper from '../components/wrappers/media.vue';
const queryPlayableElement = (element, mediaType) => element.querySelector(mediaType);
@@ -11,6 +13,9 @@ export default Node.create({
addAttributes() {
return {
+ uploading: {
+ default: false,
+ },
src: {
default: null,
parseHTML: (element) => {
@@ -60,7 +65,11 @@ export default Node.create({
...this.extraElementAttrs,
},
],
- ['a', { href: node.attrs.src }, node.attrs.alt],
+ ['a', { href: node.attrs.src }, node.attrs.title || node.attrs.alt || ''],
];
},
+
+ addNodeView() {
+ return VueNodeViewRenderer(MediaWrapper);
+ },
});
diff --git a/app/assets/javascripts/content_editor/services/code_block_language_loader.js b/app/assets/javascripts/content_editor/services/code_block_language_loader.js
new file mode 100644
index 00000000000..081400cfd9a
--- /dev/null
+++ b/app/assets/javascripts/content_editor/services/code_block_language_loader.js
@@ -0,0 +1,283 @@
+import { lowlight } from 'lowlight/lib/core';
+import { __, sprintf } from '~/locale';
+
+/* eslint-disable @gitlab/require-i18n-strings */
+// List of languages referenced from https://github.com/wooorm/lowlight#data
+const CODE_BLOCK_LANGUAGES = [
+ { syntax: '1c', label: '1C:Enterprise' },
+ { syntax: 'abnf', label: 'Augmented Backus-Naur Form' },
+ { syntax: 'accesslog', label: 'Apache Access Log' },
+ { syntax: 'actionscript', variants: 'as', label: 'ActionScript' },
+ { syntax: 'ada', label: 'Ada' },
+ { syntax: 'angelscript', variants: 'asc', label: 'AngelScript' },
+ { syntax: 'apache', variants: 'apacheconf', label: 'Apache config' },
+ { syntax: 'applescript', variants: 'osascript', label: 'AppleScript' },
+ { syntax: 'arcade', label: 'ArcGIS Arcade' },
+ { syntax: 'arduino', variants: 'ino', label: 'Arduino' },
+ { syntax: 'armasm', variants: 'arm', label: 'ARM Assembly' },
+ { syntax: 'asciidoc', variants: 'adoc', label: 'AsciiDoc' },
+ { syntax: 'aspectj', label: 'AspectJ' },
+ { syntax: 'autohotkey', variants: 'ahk', label: 'AutoHotkey' },
+ { syntax: 'autoit', label: 'AutoIt' },
+ { syntax: 'avrasm', label: 'AVR Assembly' },
+ { syntax: 'awk', label: 'Awk' },
+ { syntax: 'axapta', variants: 'x++', label: 'X++' },
+ { syntax: 'bash', variants: 'sh', label: 'Bash' },
+ { syntax: 'basic', label: 'BASIC' },
+ { syntax: 'bnf', label: 'Backus-Naur Form' },
+ { syntax: 'brainfuck', variants: 'bf', label: 'Brainfuck' },
+ { syntax: 'c', variants: 'h', label: 'C' },
+ { syntax: 'cal', label: 'C/AL' },
+ { syntax: 'capnproto', variants: 'capnp', label: "Cap'n Proto" },
+ { syntax: 'ceylon', label: 'Ceylon' },
+ { syntax: 'clean', variants: 'icl, dcl', label: 'Clean' },
+ { syntax: 'clojure', variants: 'clj, edn', label: 'Clojure' },
+ { syntax: 'clojure-repl', label: 'Clojure REPL' },
+ { syntax: 'cmake', variants: 'cmake.in', label: 'CMake' },
+ { syntax: 'coffeescript', variants: 'coffee, cson, iced', label: 'CoffeeScript' },
+ { syntax: 'coq', label: 'Coq' },
+ { syntax: 'cos', variants: 'cls', label: 'Caché Object Script' },
+ { syntax: 'cpp', variants: 'cc, c++, h++, hpp, hh, hxx, cxx', label: 'C++' },
+ { syntax: 'crmsh', variants: 'crm, pcmk', label: 'crmsh' },
+ { syntax: 'crystal', variants: 'cr', label: 'Crystal' },
+ { syntax: 'csharp', variants: 'cs, c#', label: 'C#' },
+ { syntax: 'csp', label: 'CSP' },
+ { syntax: 'css', label: 'CSS' },
+ { syntax: 'd', label: 'D' },
+ { syntax: 'dart', label: 'Dart' },
+ { syntax: 'delphi', variants: 'dpr, dfm, pas, pascal', label: 'Delphi' },
+ { syntax: 'diff', variants: 'patch', label: 'Diff' },
+ { syntax: 'django', variants: 'jinja', label: 'Django' },
+ { syntax: 'dns', variants: 'bind, zone', label: 'DNS Zone' },
+ { syntax: 'dockerfile', variants: 'docker', label: 'Dockerfile' },
+ { syntax: 'dos', variants: 'bat, cmd', label: 'Batch file (DOS)' },
+ { syntax: 'dsconfig', label: 'DSConfig' },
+ { syntax: 'dts', label: 'Device Tree' },
+ { syntax: 'dust', variants: 'dst', label: 'Dust' },
+ { syntax: 'ebnf', label: 'Extended Backus-Naur Form' },
+ { syntax: 'elixir', variants: 'ex, exs', label: 'Elixir' },
+ { syntax: 'elm', label: 'Elm' },
+ { syntax: 'erb', label: 'ERB' },
+ { syntax: 'erlang', variants: 'erl', label: 'Erlang' },
+ { syntax: 'erlang-repl', label: 'Erlang REPL' },
+ { syntax: 'excel', variants: 'xlsx, xls', label: 'Excel formulae' },
+ { syntax: 'fix', label: 'FIX' },
+ { syntax: 'flix', label: 'Flix' },
+ { syntax: 'fortran', variants: 'f90, f95', label: 'Fortran' },
+ { syntax: 'fsharp', variants: 'fs, f#', label: 'F#' },
+ { syntax: 'gams', variants: 'gms', label: 'GAMS' },
+ { syntax: 'gauss', variants: 'gss', label: 'GAUSS' },
+ { syntax: 'gcode', variants: 'nc', label: 'G-code (ISO 6983)' },
+ { syntax: 'gherkin', variants: 'feature', label: 'Gherkin' },
+ { syntax: 'glsl', label: 'GLSL' },
+ { syntax: 'gml', label: 'GML' },
+ { syntax: 'go', variants: 'golang', label: 'Go' },
+ { syntax: 'golo', label: 'Golo' },
+ { syntax: 'gradle', label: 'Gradle' },
+ { syntax: 'graphql', variants: 'gql', label: 'GraphQL' },
+ { syntax: 'groovy', label: 'Groovy' },
+ { syntax: 'haml', label: 'HAML' },
+ {
+ syntax: 'handlebars',
+ variants: 'hbs, html.hbs, html.handlebars, htmlbars',
+ label: 'Handlebars',
+ },
+ { syntax: 'haskell', variants: 'hs', label: 'Haskell' },
+ { syntax: 'haxe', variants: 'hx', label: 'Haxe' },
+ { syntax: 'hsp', label: 'HSP' },
+ { syntax: 'http', variants: 'https', label: 'HTTP' },
+ { syntax: 'hy', variants: 'hylang', label: 'Hy' },
+ { syntax: 'inform7', variants: 'i7', label: 'Inform 7' },
+ { syntax: 'ini', variants: 'toml', label: 'TOML, also INI' },
+ { syntax: 'irpf90', label: 'IRPF90' },
+ { syntax: 'isbl', label: 'ISBL' },
+ { syntax: 'java', variants: 'jsp', label: 'Java' },
+ { syntax: 'javascript', variants: 'js, jsx, mjs, cjs', label: 'Javascript' },
+ { syntax: 'jboss-cli', variants: 'wildfly-cli', label: 'JBoss CLI' },
+ { syntax: 'json', label: 'JSON' },
+ { syntax: 'julia', label: 'Julia' },
+ { syntax: 'julia-repl', variants: 'jldoctest', label: 'Julia REPL' },
+ { syntax: 'kotlin', variants: 'kt, kts', label: 'Kotlin' },
+ { syntax: 'lasso', variants: 'ls, lassoscript', label: 'Lasso' },
+ { syntax: 'latex', variants: 'tex', label: 'LaTeX' },
+ { syntax: 'ldif', label: 'LDIF' },
+ { syntax: 'leaf', label: 'Leaf' },
+ { syntax: 'less', label: 'Less' },
+ { syntax: 'lisp', label: 'Lisp' },
+ { syntax: 'livecodeserver', label: 'LiveCode' },
+ { syntax: 'livescript', variants: 'ls', label: 'LiveScript' },
+ { syntax: 'llvm', label: 'LLVM IR' },
+ { syntax: 'lsl', label: 'LSL (Linden Scripting Language)' },
+ { syntax: 'lua', label: 'Lua' },
+ { syntax: 'makefile', variants: 'mk, mak, make', label: 'Makefile' },
+ { syntax: 'markdown', variants: 'md, mkdown, mkd', label: 'Markdown' },
+ { syntax: 'mathematica', variants: 'mma, wl', label: 'Mathematica' },
+ { syntax: 'matlab', label: 'Matlab' },
+ { syntax: 'maxima', label: 'Maxima' },
+ { syntax: 'mel', label: 'MEL' },
+ { syntax: 'mercury', variants: 'm, moo', label: 'Mercury' },
+ { syntax: 'mipsasm', variants: 'mips', label: 'MIPS Assembly' },
+ { syntax: 'mizar', label: 'Mizar' },
+ { syntax: 'mojolicious', label: 'Mojolicious' },
+ { syntax: 'monkey', label: 'Monkey' },
+ { syntax: 'moonscript', variants: 'moon', label: 'MoonScript' },
+ { syntax: 'n1ql', label: 'N1QL' },
+ { syntax: 'nestedtext', variants: 'nt', label: 'Nested Text' },
+ { syntax: 'nginx', variants: 'nginxconf', label: 'Nginx config' },
+ { syntax: 'nim', label: 'Nim' },
+ { syntax: 'nix', variants: 'nixos', label: 'Nix' },
+ { syntax: 'node-repl', label: 'Node REPL' },
+ { syntax: 'nsis', label: 'NSIS' },
+ {
+ syntax: 'objectivec',
+ variants: 'mm, objc, obj-c, obj-c++, objective-c++',
+ label: 'Objective-C',
+ },
+ { syntax: 'ocaml', variants: 'ml', label: 'OCaml' },
+ { syntax: 'openscad', variants: 'scad', label: 'OpenSCAD' },
+ { syntax: 'oxygene', label: 'Oxygene' },
+ { syntax: 'parser3', label: 'Parser3' },
+ { syntax: 'perl', variants: 'pl, pm', label: 'Perl' },
+ { syntax: 'pf', variants: 'pf.conf', label: 'Packet Filter config' },
+ { syntax: 'pgsql', variants: 'postgres, postgresql', label: 'PostgreSQL' },
+ { syntax: 'php', label: 'PHP' },
+ { syntax: 'php-template', label: 'PHP template' },
+ { syntax: 'plaintext', variants: 'text, txt', label: 'Plain text' },
+ { syntax: 'pony', label: 'Pony' },
+ { syntax: 'powershell', variants: 'pwsh, ps, ps1', label: 'PowerShell' },
+ { syntax: 'processing', variants: 'pde', label: 'Processing' },
+ { syntax: 'profile', label: 'Python profiler' },
+ { syntax: 'prolog', label: 'Prolog' },
+ { syntax: 'properties', label: '.properties' },
+ { syntax: 'protobuf', label: 'Protocol Buffers' },
+ { syntax: 'puppet', variants: 'pp', label: 'Puppet' },
+ { syntax: 'purebasic', variants: 'pb, pbi', label: 'PureBASIC' },
+ { syntax: 'python', variants: 'py, gyp, ipython', label: 'Python' },
+ { syntax: 'python-repl', variants: 'pycon', label: 'Python REPL' },
+ { syntax: 'q', variants: 'k, kdb', label: 'Q' },
+ { syntax: 'qml', variants: 'qt', label: 'QML' },
+ { syntax: 'r', label: 'R' },
+ { syntax: 'reasonml', variants: 're', label: 'ReasonML' },
+ { syntax: 'rib', label: 'RenderMan RIB' },
+ { syntax: 'roboconf', variants: 'graph, instances', label: 'Roboconf' },
+ { syntax: 'routeros', variants: 'mikrotik', label: 'Microtik RouterOS script' },
+ { syntax: 'rsl', label: 'RenderMan RSL' },
+ { syntax: 'ruby', variants: 'rb, gemspec, podspec, thor, irb', label: 'Ruby' },
+ { syntax: 'ruleslanguage', label: 'Oracle Rules Language' },
+ { syntax: 'rust', variants: 'rs', label: 'Rust' },
+ { syntax: 'sas', label: 'SAS' },
+ { syntax: 'scala', label: 'Scala' },
+ { syntax: 'scheme', label: 'Scheme' },
+ { syntax: 'scilab', variants: 'sci', label: 'Scilab' },
+ { syntax: 'scss', label: 'SCSS' },
+ { syntax: 'shell', variants: 'console, shellsession', label: 'Shell Session' },
+ { syntax: 'smali', label: 'Smali' },
+ { syntax: 'smalltalk', variants: 'st', label: 'Smalltalk' },
+ { syntax: 'sml', variants: 'ml', label: 'SML (Standard ML)' },
+ { syntax: 'sqf', label: 'SQF' },
+ { syntax: 'sql', label: 'SQL' },
+ { syntax: 'stan', variants: 'stanfuncs', label: 'Stan' },
+ { syntax: 'stata', variants: 'do, ado', label: 'Stata' },
+ { syntax: 'step21', variants: 'p21, step, stp', label: 'STEP Part 21' },
+ { syntax: 'stylus', variants: 'styl', label: 'Stylus' },
+ { syntax: 'subunit', label: 'SubUnit' },
+ { syntax: 'swift', label: 'Swift' },
+ { syntax: 'taggerscript', label: 'Tagger Script' },
+ { syntax: 'tap', label: 'Test Anything Protocol' },
+ { syntax: 'tcl', variants: 'tk', label: 'Tcl' },
+ { syntax: 'thrift', label: 'Thrift' },
+ { syntax: 'tp', label: 'TP' },
+ { syntax: 'twig', variants: 'craftcms', label: 'Twig' },
+ { syntax: 'typescript', variants: 'ts, tsx', label: 'TypeScript' },
+ { syntax: 'vala', label: 'Vala' },
+ { syntax: 'vbnet', variants: 'vb', label: 'Visual Basic .NET' },
+ { syntax: 'vbscript', variants: 'vbs', label: 'VBScript' },
+ { syntax: 'vbscript-html', label: 'VBScript in HTML' },
+ { syntax: 'verilog', variants: 'v, sv, svh', label: 'Verilog' },
+ { syntax: 'vhdl', label: 'VHDL' },
+ { syntax: 'vim', label: 'Vim Script' },
+ { syntax: 'wasm', label: 'WebAssembly' },
+ { syntax: 'wren', label: 'Wren' },
+ { syntax: 'x86asm', label: 'Intel x86 Assembly' },
+ { syntax: 'xl', variants: 'tao', label: 'XL' },
+ {
+ syntax: 'xml',
+ variants: 'html, xhtml, rss, atom, xjb, xsd, xsl, plist, wsf, svg',
+ label: 'HTML, XML',
+ },
+ { syntax: 'xquery', variants: 'xpath, xq', label: 'XQuery' },
+ { syntax: 'yaml', variants: 'yml', label: 'YAML' },
+ { syntax: 'zephir', variants: 'zep', label: 'Zephir' },
+];
+/* eslint-enable @gitlab/require-i18n-strings */
+
+const codeBlockLanguageLoader = {
+ lowlight,
+
+ allLanguages: CODE_BLOCK_LANGUAGES,
+
+ findLanguageBySyntax(value) {
+ const lowercaseValue = value?.toLowerCase() || 'plaintext';
+ return (
+ this.allLanguages.find(
+ ({ syntax, variants }) =>
+ syntax === lowercaseValue || variants?.toLowerCase().split(', ').includes(lowercaseValue),
+ ) || {
+ syntax: lowercaseValue,
+ label: sprintf(__(`Custom (%{language})`), { language: lowercaseValue }),
+ }
+ );
+ },
+
+ filterLanguages(value) {
+ if (!value) return this.allLanguages;
+
+ const lowercaseValue = value?.toLowerCase() || '';
+ return this.allLanguages.filter(
+ ({ syntax, label, variants }) =>
+ syntax.toLowerCase().includes(lowercaseValue) ||
+ label.toLowerCase().includes(lowercaseValue) ||
+ variants?.toLowerCase().includes(lowercaseValue),
+ );
+ },
+
+ isLanguageLoaded(language) {
+ return this.lowlight.registered(language);
+ },
+
+ loadLanguagesFromDOM(domTree) {
+ const languages = [];
+
+ domTree.querySelectorAll('pre').forEach((preElement) => {
+ languages.push(preElement.getAttribute('lang'));
+ });
+
+ return this.loadLanguages(languages);
+ },
+
+ loadLanguageFromInputRule(match) {
+ const { syntax } = this.findLanguageBySyntax(match[1]);
+
+ this.loadLanguages([syntax]);
+
+ return { language: syntax };
+ },
+
+ loadLanguages(languageList = []) {
+ const loaders = languageList
+ .filter((languageName) => !this.isLanguageLoaded(languageName))
+ .map((languageName) => {
+ return import(
+ /* webpackChunkName: 'highlight.language.js' */ `highlight.js/lib/languages/${languageName}`
+ )
+ .then(({ default: language }) => {
+ this.lowlight.registerLanguage(languageName, language);
+ })
+ .catch(() => false);
+ });
+
+ return Promise.all(loaders);
+ },
+};
+
+export default codeBlockLanguageLoader;
diff --git a/app/assets/javascripts/content_editor/services/content_editor.js b/app/assets/javascripts/content_editor/services/content_editor.js
index c5638da2daf..56badf965ee 100644
--- a/app/assets/javascripts/content_editor/services/content_editor.js
+++ b/app/assets/javascripts/content_editor/services/content_editor.js
@@ -3,11 +3,12 @@ import { LOADING_CONTENT_EVENT, LOADING_SUCCESS_EVENT, LOADING_ERROR_EVENT } fro
/* eslint-disable no-underscore-dangle */
export class ContentEditor {
- constructor({ tiptapEditor, serializer, deserializer, eventHub }) {
+ constructor({ tiptapEditor, serializer, deserializer, eventHub, languageLoader }) {
this._tiptapEditor = tiptapEditor;
this._serializer = serializer;
this._deserializer = deserializer;
this._eventHub = eventHub;
+ this._languageLoader = languageLoader;
}
get tiptapEditor() {
@@ -34,23 +35,33 @@ export class ContentEditor {
}
async setSerializedContent(serializedContent) {
- const { _tiptapEditor: editor, _deserializer: deserializer, _eventHub: eventHub } = this;
+ const {
+ _tiptapEditor: editor,
+ _deserializer: deserializer,
+ _eventHub: eventHub,
+ _languageLoader: languageLoader,
+ } = this;
const { doc, tr } = editor.state;
const selection = TextSelection.create(doc, 0, doc.content.size);
try {
eventHub.$emit(LOADING_CONTENT_EVENT);
- const { document } = await deserializer.deserialize({
+ const result = await deserializer.deserialize({
schema: editor.schema,
content: serializedContent,
});
- if (document) {
+ if (Object.keys(result).length !== 0) {
+ const { document, dom } = result;
+
+ await languageLoader.loadLanguagesFromDOM(dom);
+
tr.setSelection(selection)
.replaceSelectionWith(document, false)
.setMeta('preventUpdate', true);
editor.view.dispatch(tr);
}
+
eventHub.$emit(LOADING_SUCCESS_EVENT);
} catch (e) {
eventHub.$emit(LOADING_ERROR_EVENT, e);
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 d9d39a387d0..af19a0ab0e4 100644
--- a/app/assets/javascripts/content_editor/services/create_content_editor.js
+++ b/app/assets/javascripts/content_editor/services/create_content_editor.js
@@ -1,5 +1,6 @@
import { Editor } from '@tiptap/vue-2';
import { isFunction } from 'lodash';
+import { lowlight } from 'lowlight/lib/core';
import eventHubFactory from '~/helpers/event_hub_factory';
import { PROVIDE_SERIALIZER_OR_RENDERER_ERROR } from '../constants';
import Attachment from '../extensions/attachment';
@@ -14,6 +15,7 @@ import DescriptionItem from '../extensions/description_item';
import DescriptionList from '../extensions/description_list';
import Details from '../extensions/details';
import DetailsContent from '../extensions/details_content';
+import Diagram from '../extensions/diagram';
import Division from '../extensions/division';
import Document from '../extensions/document';
import Dropcursor from '../extensions/dropcursor';
@@ -58,6 +60,7 @@ import { ContentEditor } from './content_editor';
import createMarkdownSerializer from './markdown_serializer';
import createMarkdownDeserializer from './markdown_deserializer';
import trackInputRulesAndShortcuts from './track_input_rules_and_shortcuts';
+import languageLoader from './code_block_language_loader';
const createTiptapEditor = ({ extensions = [], ...options } = {}) =>
new Editor({
@@ -91,12 +94,13 @@ export const createContentEditor = ({
BulletList,
Code,
ColorChip,
- CodeBlockHighlight,
+ CodeBlockHighlight.configure({ lowlight, languageLoader }),
DescriptionItem,
DescriptionList,
Details,
DetailsContent,
Document,
+ Diagram,
Division,
Dropcursor,
Emoji,
@@ -105,7 +109,7 @@ export const createContentEditor = ({
FootnoteDefinition,
FootnoteReference,
FootnotesSection,
- Frontmatter,
+ Frontmatter.configure({ lowlight }),
Gapcursor,
HardBreak,
Heading,
@@ -144,5 +148,5 @@ export const createContentEditor = ({
const serializer = createMarkdownSerializer({ serializerConfig });
const deserializer = createMarkdownDeserializer({ render: renderMarkdown });
- return new ContentEditor({ tiptapEditor, serializer, eventHub, deserializer });
+ return new ContentEditor({ tiptapEditor, serializer, eventHub, deserializer, languageLoader });
};
diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js
index eaaf69c3068..c2be7bc9195 100644
--- a/app/assets/javascripts/content_editor/services/markdown_serializer.js
+++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js
@@ -13,6 +13,7 @@ import DescriptionList from '../extensions/description_list';
import Details from '../extensions/details';
import DetailsContent from '../extensions/details_content';
import Division from '../extensions/division';
+import Diagram from '../extensions/diagram';
import Emoji from '../extensions/emoji';
import Figure from '../extensions/figure';
import FigureCaption from '../extensions/figure_caption';
@@ -48,6 +49,7 @@ import Video from '../extensions/video';
import WordBreak from '../extensions/word_break';
import {
isPlainURL,
+ renderCodeBlock,
renderHardBreak,
renderTable,
renderTableCell,
@@ -130,13 +132,8 @@ const defaultSerializerConfig = {
}
},
[BulletList.name]: defaultMarkdownSerializer.nodes.bullet_list,
- [CodeBlockHighlight.name]: (state, node) => {
- state.write(`\`\`\`${node.attrs.language || ''}\n`);
- state.text(node.textContent, false);
- state.ensureNewLine();
- state.write('```');
- state.closeBlock(node);
- },
+ [CodeBlockHighlight.name]: renderCodeBlock,
+ [Diagram.name]: renderCodeBlock,
[Division.name]: (state, node) => {
if (node.attrs.className?.includes('js-markdown-code')) {
state.renderInline(node);
diff --git a/app/assets/javascripts/content_editor/services/serialization_helpers.js b/app/assets/javascripts/content_editor/services/serialization_helpers.js
index 5fdd294aa96..3e48434c6f9 100644
--- a/app/assets/javascripts/content_editor/services/serialization_helpers.js
+++ b/app/assets/javascripts/content_editor/services/serialization_helpers.js
@@ -341,3 +341,11 @@ export function renderImage(state, node) {
export function renderPlayable(state, node) {
renderImage(state, node);
}
+
+export function renderCodeBlock(state, node) {
+ state.write(`\`\`\`${node.attrs.language || ''}\n`);
+ state.text(node.textContent, false);
+ state.ensureNewLine();
+ state.write('```');
+ state.closeBlock(node);
+}
diff --git a/app/assets/javascripts/content_editor/services/track_input_rules_and_shortcuts.js b/app/assets/javascripts/content_editor/services/track_input_rules_and_shortcuts.js
index eb1e4885ba6..b844b414343 100644
--- a/app/assets/javascripts/content_editor/services/track_input_rules_and_shortcuts.js
+++ b/app/assets/javascripts/content_editor/services/track_input_rules_and_shortcuts.js
@@ -8,12 +8,12 @@ import {
INPUT_RULE_TRACKING_ACTION,
} from '../constants';
-const trackKeyboardShortcut = (contentType, commandFn, shortcut) => () => {
+const trackKeyboardShortcut = (contentType, commandFn, shortcut) => (...args) => {
Tracking.event(undefined, KEYBOARD_SHORTCUT_TRACKING_ACTION, {
label: CONTENT_EDITOR_TRACKING_LABEL,
property: `${contentType}.${shortcut}`,
});
- return commandFn();
+ return commandFn(...args);
};
const trackInputRule = (contentType, inputRule) => {
diff --git a/app/assets/javascripts/content_editor/services/upload_helpers.js b/app/assets/javascripts/content_editor/services/upload_helpers.js
index 1abecb8f414..ed2c4b39131 100644
--- a/app/assets/javascripts/content_editor/services/upload_helpers.js
+++ b/app/assets/javascripts/content_editor/services/upload_helpers.js
@@ -5,6 +5,16 @@ import { extractFilename, readFileAsDataURL } from './utils';
export const acceptedMimes = {
image: ['image/jpeg', 'image/png', 'image/gif', 'image/jpg'],
+ audio: [
+ 'audio/basic',
+ 'audio/mid',
+ 'audio/mpeg',
+ 'audio/x-aiff',
+ 'audio/ogg',
+ 'audio/vorbis',
+ 'audio/vnd.wav',
+ ],
+ video: ['video/mp4', 'video/quicktime'],
};
const extractAttachmentLinkUrl = (html) => {
@@ -50,11 +60,11 @@ export const uploadFile = async ({ uploadsPath, renderMarkdown, file }) => {
return extractAttachmentLinkUrl(rendered);
};
-const uploadImage = async ({ editor, file, uploadsPath, renderMarkdown, eventHub }) => {
+const uploadContent = async ({ type, editor, file, uploadsPath, renderMarkdown, eventHub }) => {
const encodedSrc = await readFileAsDataURL(file);
const { view } = editor;
- editor.commands.setImage({ uploading: true, src: encodedSrc });
+ editor.commands.insertContent({ type, attrs: { uploading: true, src: encodedSrc } });
const { state } = view;
const position = state.selection.from - 1;
@@ -74,7 +84,7 @@ const uploadImage = async ({ editor, file, uploadsPath, renderMarkdown, eventHub
} catch (e) {
editor.commands.deleteRange({ from: position, to: position + 1 });
eventHub.$emit('alert', {
- message: __('An error occurred while uploading the image. Please try again.'),
+ message: __('An error occurred while uploading the file. Please try again.'),
variant: VARIANT_DANGER,
});
}
@@ -114,10 +124,12 @@ const uploadAttachment = async ({ editor, file, uploadsPath, renderMarkdown, eve
export const handleFileEvent = ({ editor, file, uploadsPath, renderMarkdown, eventHub }) => {
if (!file) return false;
- if (acceptedMimes.image.includes(file?.type)) {
- uploadImage({ editor, file, uploadsPath, renderMarkdown, eventHub });
+ for (const [type, mimes] of Object.entries(acceptedMimes)) {
+ if (mimes.includes(file?.type)) {
+ uploadContent({ type, editor, file, uploadsPath, renderMarkdown, eventHub });
- return true;
+ return true;
+ }
}
uploadAttachment({ editor, file, uploadsPath, renderMarkdown, eventHub });
diff --git a/app/assets/javascripts/contextual_sidebar.js b/app/assets/javascripts/contextual_sidebar.js
index d1a68e80608..f2ff77daf02 100644
--- a/app/assets/javascripts/contextual_sidebar.js
+++ b/app/assets/javascripts/contextual_sidebar.js
@@ -2,8 +2,6 @@ import { GlBreakpointInstance as bp, breakpoints } from '@gitlab/ui/dist/utils';
import $ from 'jquery';
import { debounce } from 'lodash';
import { getCookie, setCookie, parseBoolean } from '~/lib/utils/common_utils';
-import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
-import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
export const SIDEBAR_COLLAPSED_CLASS = 'js-sidebar-collapsed';
@@ -114,7 +112,26 @@ export default class ContextualSidebar {
this.toggleCollapsedSidebar(collapse, true);
}
- initInviteMembersModal();
- initInviteMembersTrigger();
+ const modalEl = document.querySelector('.js-invite-members-modal');
+ if (modalEl) {
+ import(
+ /* webpackChunkName: 'initInviteMembersModal' */ '~/invite_members/init_invite_members_modal'
+ )
+ .then(({ default: initInviteMembersModal }) => {
+ initInviteMembersModal();
+ })
+ .catch(() => {});
+
+ const inviteTriggers = document.querySelectorAll('.js-invite-members-trigger');
+ if (inviteTriggers) {
+ import(
+ /* webpackChunkName: 'initInviteMembersTrigger' */ '~/invite_members/init_invite_members_trigger'
+ )
+ .then(({ default: initInviteMembersTrigger }) => {
+ initInviteMembersTrigger();
+ })
+ .catch(() => {});
+ }
+ }
}
}
diff --git a/app/assets/javascripts/crm/components/contact_form.vue b/app/assets/javascripts/crm/components/contact_form.vue
deleted file mode 100644
index 81ae5c246be..00000000000
--- a/app/assets/javascripts/crm/components/contact_form.vue
+++ /dev/null
@@ -1,224 +0,0 @@
-<script>
-import { GlAlert, GlButton, GlDrawer, GlFormGroup, GlFormInput } from '@gitlab/ui';
-import { produce } from 'immer';
-import { __, s__ } from '~/locale';
-import { convertToGraphQLId } from '~/graphql_shared/utils';
-import { TYPE_GROUP } from '~/graphql_shared/constants';
-import createContactMutation from './queries/create_contact.mutation.graphql';
-import updateContactMutation from './queries/update_contact.mutation.graphql';
-import getGroupContactsQuery from './queries/get_group_contacts.query.graphql';
-
-export default {
- components: {
- GlAlert,
- GlButton,
- GlDrawer,
- GlFormGroup,
- GlFormInput,
- },
- inject: ['groupFullPath', 'groupId'],
- props: {
- drawerOpen: {
- type: Boolean,
- required: true,
- },
- contact: {
- type: Object,
- required: false,
- default: () => {},
- },
- },
- data() {
- return {
- firstName: '',
- lastName: '',
- phone: '',
- email: '',
- description: '',
- submitting: false,
- errorMessages: [],
- };
- },
- computed: {
- invalid() {
- const { firstName, lastName, email } = this;
-
- return firstName.trim() === '' || lastName.trim() === '' || email.trim() === '';
- },
- editMode() {
- return Boolean(this.contact);
- },
- title() {
- return this.editMode ? this.$options.i18n.editTitle : this.$options.i18n.newTitle;
- },
- buttonLabel() {
- return this.editMode
- ? this.$options.i18n.editButtonLabel
- : this.$options.i18n.createButtonLabel;
- },
- mutation() {
- return this.editMode ? updateContactMutation : createContactMutation;
- },
- variables() {
- const { contact, firstName, lastName, phone, email, description, editMode, groupId } = this;
-
- const variables = {
- input: {
- firstName,
- lastName,
- phone,
- email,
- description,
- },
- };
-
- if (editMode) {
- variables.input.id = contact.id;
- } else {
- variables.input.groupId = convertToGraphQLId(TYPE_GROUP, groupId);
- }
-
- return variables;
- },
- },
- mounted() {
- if (this.editMode) {
- const { contact } = this;
-
- this.firstName = contact.firstName || '';
- this.lastName = contact.lastName || '';
- this.phone = contact.phone || '';
- this.email = contact.email || '';
- this.description = contact.description || '';
- }
- },
- methods: {
- save() {
- const { mutation, variables, updateCache, close } = this;
-
- this.submitting = true;
-
- return this.$apollo
- .mutate({
- mutation,
- variables,
- update: updateCache,
- })
- .then(({ data }) => {
- if (
- data.customerRelationsContactCreate?.errors.length === 0 ||
- data.customerRelationsContactUpdate?.errors.length === 0
- ) {
- close(true);
- }
-
- this.submitting = false;
- })
- .catch(() => {
- this.errorMessages = [this.$options.i18n.somethingWentWrong];
- this.submitting = false;
- });
- },
- close(success) {
- this.$emit('close', success);
- },
- updateCache(store, { data }) {
- const mutationData =
- data.customerRelationsContactCreate || data.customerRelationsContactUpdate;
-
- if (mutationData?.errors.length > 0) {
- this.errorMessages = mutationData.errors;
- return;
- }
-
- const queryArgs = {
- query: getGroupContactsQuery,
- variables: { groupFullPath: this.groupFullPath },
- };
-
- const sourceData = store.readQuery(queryArgs);
-
- queryArgs.data = produce(sourceData, (draftState) => {
- draftState.group.contacts.nodes = [
- ...sourceData.group.contacts.nodes.filter(({ id }) => id !== this.contact?.id),
- mutationData.contact,
- ];
- });
-
- store.writeQuery(queryArgs);
- },
- getDrawerHeaderHeight() {
- const wrapperEl = document.querySelector('.content-wrapper');
-
- if (wrapperEl) {
- return `${wrapperEl.offsetTop}px`;
- }
-
- return '';
- },
- },
- i18n: {
- createButtonLabel: s__('Crm|Create new contact'),
- editButtonLabel: __('Save changes'),
- cancel: __('Cancel'),
- firstName: s__('Crm|First name'),
- lastName: s__('Crm|Last name'),
- email: s__('Crm|Email'),
- phone: s__('Crm|Phone number (optional)'),
- description: s__('Crm|Description (optional)'),
- newTitle: s__('Crm|New contact'),
- editTitle: s__('Crm|Edit contact'),
- somethingWentWrong: __('Something went wrong. Please try again.'),
- },
-};
-</script>
-
-<template>
- <gl-drawer
- class="gl-drawer-responsive"
- :open="drawerOpen"
- :header-height="getDrawerHeaderHeight()"
- @close="close(false)"
- >
- <template #title>
- <h3>{{ title }}</h3>
- </template>
- <gl-alert v-if="errorMessages.length" variant="danger" @dismiss="errorMessages = []">
- <ul class="gl-mb-0! gl-ml-5">
- <li v-for="error in errorMessages" :key="error">
- {{ error }}
- </li>
- </ul>
- </gl-alert>
- <form @submit.prevent="save">
- <gl-form-group :label="$options.i18n.firstName" label-for="contact-first-name">
- <gl-form-input id="contact-first-name" v-model="firstName" />
- </gl-form-group>
- <gl-form-group :label="$options.i18n.lastName" label-for="contact-last-name">
- <gl-form-input id="contact-last-name" v-model="lastName" />
- </gl-form-group>
- <gl-form-group :label="$options.i18n.email" label-for="contact-email">
- <gl-form-input id="contact-email" v-model="email" />
- </gl-form-group>
- <gl-form-group :label="$options.i18n.phone" label-for="contact-phone">
- <gl-form-input id="contact-phone" v-model="phone" />
- </gl-form-group>
- <gl-form-group :label="$options.i18n.description" label-for="contact-description">
- <gl-form-input id="contact-description" v-model="description" />
- </gl-form-group>
- <span class="gl-float-right">
- <gl-button data-testid="cancel-button" @click="close(false)">
- {{ $options.i18n.cancel }}
- </gl-button>
- <gl-button
- variant="confirm"
- :disabled="invalid"
- :loading="submitting"
- data-testid="save-contact-button"
- type="submit"
- >{{ buttonLabel }}</gl-button
- >
- </span>
- </form>
- </gl-drawer>
-</template>
diff --git a/app/assets/javascripts/crm/components/contacts_root.vue b/app/assets/javascripts/crm/components/contacts_root.vue
deleted file mode 100644
index 178ce84c64d..00000000000
--- a/app/assets/javascripts/crm/components/contacts_root.vue
+++ /dev/null
@@ -1,187 +0,0 @@
-<script>
-import { GlAlert, GlButton, GlLoadingIcon, GlTable, GlTooltipDirective } from '@gitlab/ui';
-import { parseBoolean } from '~/lib/utils/common_utils';
-import { s__, __ } from '~/locale';
-import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { TYPE_CRM_CONTACT } from '~/graphql_shared/constants';
-import { INDEX_ROUTE_NAME, NEW_ROUTE_NAME, EDIT_ROUTE_NAME } from '../constants';
-import getGroupContactsQuery from './queries/get_group_contacts.query.graphql';
-import ContactForm from './contact_form.vue';
-
-export default {
- components: {
- GlAlert,
- GlButton,
- GlLoadingIcon,
- GlTable,
- ContactForm,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- inject: ['groupFullPath', 'groupIssuesPath', 'canAdminCrmContact'],
- data() {
- return {
- contacts: [],
- error: false,
- };
- },
- apollo: {
- contacts: {
- query() {
- return getGroupContactsQuery;
- },
- variables() {
- return {
- groupFullPath: this.groupFullPath,
- };
- },
- update(data) {
- return this.extractContacts(data);
- },
- error() {
- this.error = true;
- },
- },
- },
- computed: {
- isLoading() {
- return this.$apollo.queries.contacts.loading;
- },
- showNewForm() {
- return this.$route.name === NEW_ROUTE_NAME;
- },
- showEditForm() {
- return !this.isLoading && this.$route.name === EDIT_ROUTE_NAME;
- },
- canAdmin() {
- return parseBoolean(this.canAdminCrmContact);
- },
- editingContact() {
- return this.contacts.find(
- (contact) => contact.id === convertToGraphQLId(TYPE_CRM_CONTACT, this.$route.params.id),
- );
- },
- },
- methods: {
- extractContacts(data) {
- const contacts = data?.group?.contacts?.nodes || [];
- return contacts.slice().sort((a, b) => a.firstName.localeCompare(b.firstName));
- },
- displayNewForm() {
- if (this.showNewForm) return;
-
- this.$router.push({ name: NEW_ROUTE_NAME });
- },
- hideNewForm(success) {
- if (success) this.$toast.show(s__('Crm|Contact has been added'));
-
- this.$router.replace({ name: INDEX_ROUTE_NAME });
- },
- hideEditForm(success) {
- if (success) this.$toast.show(s__('Crm|Contact has been updated'));
-
- this.editingContactId = 0;
- this.$router.replace({ name: INDEX_ROUTE_NAME });
- },
- getIssuesPath(path, value) {
- return `${path}?scope=all&state=opened&crm_contact_id=${value}`;
- },
- edit(value) {
- if (this.showEditForm) return;
-
- this.editingContactId = value;
- this.$router.push({ name: EDIT_ROUTE_NAME, params: { id: value } });
- },
- },
- fields: [
- { key: 'firstName', sortable: true },
- { key: 'lastName', sortable: true },
- { key: 'email', sortable: true },
- { key: 'phone', sortable: true },
- { key: 'description', sortable: true },
- {
- key: 'organization',
- formatter: (organization) => {
- return organization?.name;
- },
- sortable: true,
- },
- {
- key: 'id',
- label: '',
- formatter: (id) => {
- return getIdFromGraphQLId(id);
- },
- },
- ],
- i18n: {
- emptyText: s__('Crm|No contacts found'),
- issuesButtonLabel: __('View issues'),
- editButtonLabel: __('Edit'),
- title: s__('Crm|Customer Relations Contacts'),
- newContact: s__('Crm|New contact'),
- errorText: __('Something went wrong. Please try again.'),
- },
-};
-</script>
-
-<template>
- <div>
- <gl-alert v-if="error" variant="danger" class="gl-mt-6" @dismiss="error = false">
- {{ $options.i18n.errorText }}
- </gl-alert>
- <div
- class="gl-display-flex gl-align-items-baseline gl-flex-direction-row gl-justify-content-space-between gl-mt-6"
- >
- <h2 class="gl-font-size-h2 gl-my-0">
- {{ $options.i18n.title }}
- </h2>
- <div class="gl-display-none gl-md-display-flex gl-align-items-center gl-justify-content-end">
- <gl-button
- v-if="canAdmin"
- variant="confirm"
- data-testid="new-contact-button"
- @click="displayNewForm"
- >
- {{ $options.i18n.newContact }}
- </gl-button>
- </div>
- </div>
- <contact-form v-if="showNewForm" :drawer-open="showNewForm" @close="hideNewForm" />
- <contact-form
- v-if="showEditForm"
- :contact="editingContact"
- :drawer-open="showEditForm"
- @close="hideEditForm"
- />
- <gl-loading-icon v-if="isLoading" class="gl-mt-5" size="lg" />
- <gl-table
- v-else
- class="gl-mt-5"
- :items="contacts"
- :fields="$options.fields"
- :empty-text="$options.i18n.emptyText"
- show-empty
- >
- <template #cell(id)="data">
- <gl-button
- v-gl-tooltip.hover.bottom="$options.i18n.issuesButtonLabel"
- class="gl-mr-3"
- data-testid="issues-link"
- icon="issues"
- :aria-label="$options.i18n.issuesButtonLabel"
- :href="getIssuesPath(groupIssuesPath, data.value)"
- />
- <gl-button
- v-if="canAdmin"
- v-gl-tooltip.hover.bottom="$options.i18n.editButtonLabel"
- data-testid="edit-contact-button"
- icon="pencil"
- :aria-label="$options.i18n.editButtonLabel"
- @click="edit(data.value)"
- />
- </template>
- </gl-table>
- </div>
-</template>
diff --git a/app/assets/javascripts/crm/components/form.vue b/app/assets/javascripts/crm/components/form.vue
index b24de1e95e8..4f94898ff63 100644
--- a/app/assets/javascripts/crm/components/form.vue
+++ b/app/assets/javascripts/crm/components/form.vue
@@ -61,11 +61,6 @@ export default {
required: false,
default: null,
},
- existingModel: {
- type: Object,
- required: false,
- default: () => ({}),
- },
additionalCreateParams: {
type: Object,
required: false,
@@ -76,25 +71,42 @@ export default {
required: false,
default: () => MSG_SAVE_CHANGES,
},
+ existingId: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
data() {
- const initialModel = this.fields.reduce(
- (map, field) =>
- Object.assign(map, {
- [field.name]: this.existingModel ? this.existingModel[field.name] : null,
- }),
- {},
- );
-
return {
- model: initialModel,
+ model: null,
submitting: false,
errorMessages: [],
+ records: [],
+ loading: true,
};
},
+ apollo: {
+ records: {
+ query() {
+ return this.getQuery.query;
+ },
+ variables() {
+ return this.getQuery.variables;
+ },
+ update(data) {
+ this.records = getPropValueByPath(data, this.getQueryNodePath).nodes || [];
+ this.setInitialModel();
+ this.loading = false;
+ },
+ error() {
+ this.errorMessages = [MSG_ERROR];
+ },
+ },
+ },
computed: {
isEditMode() {
- return this.existingModel?.id;
+ return this.existingId;
},
isInvalid() {
const { fields, model } = this;
@@ -115,13 +127,24 @@ export default {
);
if (isEditMode) {
- return { input: { id: this.existingModel.id, ...variables } };
+ return { input: { id: this.existingId, ...variables } };
}
return { input: { ...additionalCreateParams, ...variables } };
},
},
methods: {
+ setInitialModel() {
+ const existingModel = this.records.find(({ id }) => id === this.existingId);
+
+ this.model = this.fields.reduce(
+ (map, field) =>
+ Object.assign(map, {
+ [field.name]: !this.isEditMode || !existingModel ? null : existingModel[field.name],
+ }),
+ {},
+ );
+ },
formatValue(model, field) {
if (!isEmpty(model[field.name]) && field.input?.type === 'number') {
return parseFloat(model[field.name]);
@@ -173,7 +196,7 @@ export default {
const sourceData = store.readQuery(getQuery);
const newData = produce(sourceData, (draftState) => {
- getPropValueByPath(draftState, getQueryNodePath).nodes.push(getFirstPropertyValue(result));
+ getPropValueByPath(draftState, getQueryNodePath).nodes.push(this.getPayload(result));
});
store.writeQuery({
@@ -185,6 +208,14 @@ export default {
const optionalSuffix = field.required ? '' : ` ${MSG_OPTIONAL}`;
return field.label + optionalSuffix;
},
+ getPayload(data) {
+ if (!data) return null;
+
+ const keys = Object.keys(data);
+ if (keys[0] === '__typename') return data[keys[1]];
+
+ return data[keys[0]];
+ },
},
MSG_CANCEL,
INDEX_ROUTE_NAME,
@@ -192,7 +223,7 @@ export default {
</script>
<template>
- <mounting-portal mount-to="#js-crm-form-portal" append>
+ <mounting-portal v-if="!loading" mount-to="#js-crm-form-portal" append>
<gl-drawer class="gl-drawer-responsive gl-absolute" :open="drawerOpen" @close="close(false)">
<template #title>
<h3>{{ title }}</h3>
diff --git a/app/assets/javascripts/crm/components/new_organization_form.vue b/app/assets/javascripts/crm/components/new_organization_form.vue
deleted file mode 100644
index 3b11edc6935..00000000000
--- a/app/assets/javascripts/crm/components/new_organization_form.vue
+++ /dev/null
@@ -1,164 +0,0 @@
-<script>
-import { GlAlert, GlButton, GlDrawer, GlFormGroup, GlFormInput } from '@gitlab/ui';
-import { produce } from 'immer';
-import { __, s__ } from '~/locale';
-import { convertToGraphQLId } from '~/graphql_shared/utils';
-import { TYPE_GROUP } from '~/graphql_shared/constants';
-import createOrganization from './queries/create_organization.mutation.graphql';
-import getGroupOrganizationsQuery from './queries/get_group_organizations.query.graphql';
-
-export default {
- components: {
- GlAlert,
- GlButton,
- GlDrawer,
- GlFormGroup,
- GlFormInput,
- },
- inject: ['groupFullPath', 'groupId'],
- props: {
- drawerOpen: {
- type: Boolean,
- required: true,
- },
- },
- data() {
- return {
- name: '',
- defaultRate: null,
- description: '',
- submitting: false,
- errorMessages: [],
- };
- },
- computed: {
- invalid() {
- return this.name.trim() === '';
- },
- },
- methods: {
- save() {
- this.submitting = true;
- return this.$apollo
- .mutate({
- mutation: createOrganization,
- variables: {
- input: {
- groupId: convertToGraphQLId(TYPE_GROUP, this.groupId),
- name: this.name,
- defaultRate: this.defaultRate ? parseFloat(this.defaultRate) : null,
- description: this.description,
- },
- },
- update: this.updateCache,
- })
- .then(({ data }) => {
- if (data.customerRelationsOrganizationCreate.errors.length === 0) this.close(true);
-
- this.submitting = false;
- })
- .catch(() => {
- this.errorMessages = [this.$options.i18n.somethingWentWrong];
- this.submitting = false;
- });
- },
- close(success) {
- this.$emit('close', success);
- },
- updateCache(store, { data: { customerRelationsOrganizationCreate } }) {
- if (customerRelationsOrganizationCreate.errors.length > 0) {
- this.errorMessages = customerRelationsOrganizationCreate.errors;
- return;
- }
-
- const variables = {
- groupFullPath: this.groupFullPath,
- };
- const sourceData = store.readQuery({
- query: getGroupOrganizationsQuery,
- variables,
- });
-
- const data = produce(sourceData, (draftState) => {
- draftState.group.organizations.nodes = [
- ...sourceData.group.organizations.nodes,
- customerRelationsOrganizationCreate.organization,
- ];
- });
-
- store.writeQuery({
- query: getGroupOrganizationsQuery,
- variables,
- data,
- });
- },
- getDrawerHeaderHeight() {
- const wrapperEl = document.querySelector('.content-wrapper');
-
- if (wrapperEl) {
- return `${wrapperEl.offsetTop}px`;
- }
-
- return '';
- },
- },
- i18n: {
- buttonLabel: s__('Crm|Create organization'),
- cancel: __('Cancel'),
- name: __('Name'),
- defaultRate: s__('Crm|Default rate (optional)'),
- description: __('Description (optional)'),
- title: s__('Crm|New Organization'),
- somethingWentWrong: __('Something went wrong. Please try again.'),
- },
-};
-</script>
-
-<template>
- <gl-drawer
- class="gl-drawer-responsive"
- :open="drawerOpen"
- :header-height="getDrawerHeaderHeight()"
- @close="close(false)"
- >
- <template #title>
- <h4>{{ $options.i18n.title }}</h4>
- </template>
- <gl-alert v-if="errorMessages.length" variant="danger" @dismiss="errorMessages = []">
- <ul class="gl-mb-0! gl-ml-5">
- <li v-for="error in errorMessages" :key="error">
- {{ error }}
- </li>
- </ul>
- </gl-alert>
- <form @submit.prevent="save">
- <gl-form-group :label="$options.i18n.name" label-for="organization-name">
- <gl-form-input id="organization-name" v-model="name" />
- </gl-form-group>
- <gl-form-group :label="$options.i18n.defaultRate" label-for="organization-default-rate">
- <gl-form-input
- id="organization-default-rate"
- v-model="defaultRate"
- type="number"
- step="0.01"
- />
- </gl-form-group>
- <gl-form-group :label="$options.i18n.description" label-for="organization-description">
- <gl-form-input id="organization-description" v-model="description" />
- </gl-form-group>
- <span class="gl-float-right">
- <gl-button data-testid="cancel-button" @click="close(false)">
- {{ $options.i18n.cancel }}
- </gl-button>
- <gl-button
- variant="confirm"
- :disabled="invalid"
- :loading="submitting"
- data-testid="create-new-organization-button"
- type="submit"
- >{{ $options.i18n.buttonLabel }}</gl-button
- >
- </span>
- </form>
- </gl-drawer>
-</template>
diff --git a/app/assets/javascripts/crm/components/organizations_root.vue b/app/assets/javascripts/crm/components/organizations_root.vue
deleted file mode 100644
index 9370c6377e9..00000000000
--- a/app/assets/javascripts/crm/components/organizations_root.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<script>
-import { GlAlert, GlButton, GlLoadingIcon, GlTable, GlTooltipDirective } from '@gitlab/ui';
-import { parseBoolean } from '~/lib/utils/common_utils';
-import { s__, __ } from '~/locale';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { INDEX_ROUTE_NAME, NEW_ROUTE_NAME } from '../constants';
-import getGroupOrganizationsQuery from './queries/get_group_organizations.query.graphql';
-import NewOrganizationForm from './new_organization_form.vue';
-
-export default {
- components: {
- GlAlert,
- GlButton,
- GlLoadingIcon,
- GlTable,
- NewOrganizationForm,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- inject: ['canAdminCrmOrganization', 'groupFullPath', 'groupIssuesPath'],
- data() {
- return {
- error: false,
- organizations: [],
- };
- },
- apollo: {
- organizations: {
- query() {
- return getGroupOrganizationsQuery;
- },
- variables() {
- return {
- groupFullPath: this.groupFullPath,
- };
- },
- update(data) {
- return this.extractOrganizations(data);
- },
- error() {
- this.error = true;
- },
- },
- },
- computed: {
- isLoading() {
- return this.$apollo.queries.organizations.loading;
- },
- showNewForm() {
- return this.$route.name === NEW_ROUTE_NAME;
- },
- canCreateNew() {
- return parseBoolean(this.canAdminCrmOrganization);
- },
- },
- methods: {
- extractOrganizations(data) {
- const organizations = data?.group?.organizations?.nodes || [];
- return organizations.slice().sort((a, b) => a.name.localeCompare(b.name));
- },
- getIssuesPath(path, value) {
- return `${path}?scope=all&state=opened&crm_organization_id=${value}`;
- },
- displayNewForm() {
- if (this.showNewForm) return;
-
- this.$router.push({ name: NEW_ROUTE_NAME });
- },
- hideNewForm(success) {
- if (success) this.$toast.show(this.$options.i18n.organizationAdded);
-
- this.$router.replace({ name: INDEX_ROUTE_NAME });
- },
- },
- fields: [
- { key: 'name', sortable: true },
- { key: 'defaultRate', sortable: true },
- { key: 'description', sortable: true },
- {
- key: 'id',
- label: __('Issues'),
- formatter: (id) => {
- return getIdFromGraphQLId(id);
- },
- },
- ],
- i18n: {
- emptyText: s__('Crm|No organizations found'),
- issuesButtonLabel: __('View issues'),
- title: s__('Crm|Customer Relations Organizations'),
- newOrganization: s__('Crm|New organization'),
- errorText: __('Something went wrong. Please try again.'),
- organizationAdded: s__('Crm|Organization has been added'),
- },
-};
-</script>
-
-<template>
- <div>
- <gl-alert v-if="error" variant="danger" class="gl-mt-6" @dismiss="error = false">
- {{ $options.i18n.errorText }}
- </gl-alert>
- <div
- class="gl-display-flex gl-align-items-baseline gl-flex-direction-row gl-justify-content-space-between gl-mt-6"
- >
- <h2 class="gl-font-size-h2 gl-my-0">
- {{ $options.i18n.title }}
- </h2>
- <div
- v-if="canCreateNew"
- class="gl-display-none gl-md-display-flex gl-align-items-center gl-justify-content-end"
- >
- <gl-button variant="confirm" data-testid="new-organization-button" @click="displayNewForm">
- {{ $options.i18n.newOrganization }}
- </gl-button>
- </div>
- </div>
- <new-organization-form v-if="showNewForm" :drawer-open="showNewForm" @close="hideNewForm" />
- <gl-loading-icon v-if="isLoading" class="gl-mt-5" size="lg" />
- <gl-table
- v-else
- class="gl-mt-5"
- :items="organizations"
- :fields="$options.fields"
- :empty-text="$options.i18n.emptyText"
- show-empty
- >
- <template #cell(id)="data">
- <gl-button
- v-gl-tooltip.hover.bottom="$options.i18n.issuesButtonLabel"
- data-testid="issues-link"
- icon="issues"
- :aria-label="$options.i18n.issuesButtonLabel"
- :href="getIssuesPath(groupIssuesPath, data.value)"
- />
- </template>
- </gl-table>
- </div>
-</template>
diff --git a/app/assets/javascripts/crm/contacts_bundle.js b/app/assets/javascripts/crm/contacts/bundle.js
index f49ec64210f..f49ec64210f 100644
--- a/app/assets/javascripts/crm/contacts_bundle.js
+++ b/app/assets/javascripts/crm/contacts/bundle.js
diff --git a/app/assets/javascripts/crm/contacts/components/contact_form_wrapper.vue b/app/assets/javascripts/crm/contacts/components/contact_form_wrapper.vue
new file mode 100644
index 00000000000..58eaabfbb7f
--- /dev/null
+++ b/app/assets/javascripts/crm/contacts/components/contact_form_wrapper.vue
@@ -0,0 +1,78 @@
+<script>
+import { s__, __ } from '~/locale';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
+import { TYPE_CRM_CONTACT, TYPE_GROUP } from '~/graphql_shared/constants';
+import ContactForm from '../../components/form.vue';
+import getGroupContactsQuery from './graphql/get_group_contacts.query.graphql';
+import createContactMutation from './graphql/create_contact.mutation.graphql';
+import updateContactMutation from './graphql/update_contact.mutation.graphql';
+
+export default {
+ components: {
+ ContactForm,
+ },
+ inject: ['groupFullPath', 'groupId'],
+ props: {
+ isEditMode: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ contactGraphQLId() {
+ if (!this.isEditMode) return null;
+
+ return convertToGraphQLId(TYPE_CRM_CONTACT, this.$route.params.id);
+ },
+ groupGraphQLId() {
+ return convertToGraphQLId(TYPE_GROUP, this.groupId);
+ },
+ mutation() {
+ if (this.isEditMode) return updateContactMutation;
+
+ return createContactMutation;
+ },
+ getQuery() {
+ return {
+ query: getGroupContactsQuery,
+ variables: { groupFullPath: this.groupFullPath },
+ };
+ },
+ title() {
+ if (this.isEditMode) return s__('Crm|Edit contact');
+
+ return s__('Crm|New contact');
+ },
+ successMessage() {
+ if (this.isEditMode) return s__('Crm|Contact has been updated.');
+
+ return s__('Crm|Contact has been added.');
+ },
+ additionalCreateParams() {
+ return { groupId: this.groupGraphQLId };
+ },
+ },
+ fields: [
+ { name: 'firstName', label: __('First name'), required: true },
+ { name: 'lastName', label: __('Last name'), required: true },
+ { name: 'email', label: __('Email'), required: true },
+ { name: 'phone', label: __('Phone') },
+ { name: 'description', label: __('Description') },
+ ],
+};
+</script>
+
+<template>
+ <contact-form
+ :drawer-open="true"
+ :get-query="getQuery"
+ get-query-node-path="group.contacts"
+ :mutation="mutation"
+ :additional-create-params="additionalCreateParams"
+ :existing-id="contactGraphQLId"
+ :fields="$options.fields"
+ :title="title"
+ :success-message="successMessage"
+ />
+</template>
diff --git a/app/assets/javascripts/crm/contacts/components/contacts_root.vue b/app/assets/javascripts/crm/contacts/components/contacts_root.vue
new file mode 100644
index 00000000000..17be3800256
--- /dev/null
+++ b/app/assets/javascripts/crm/contacts/components/contacts_root.vue
@@ -0,0 +1,148 @@
+<script>
+import { GlAlert, GlButton, GlLoadingIcon, GlTable, GlTooltipDirective } from '@gitlab/ui';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import { s__, __ } from '~/locale';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { EDIT_ROUTE_NAME, NEW_ROUTE_NAME } from '../../constants';
+import getGroupContactsQuery from './graphql/get_group_contacts.query.graphql';
+
+export default {
+ components: {
+ GlAlert,
+ GlButton,
+ GlLoadingIcon,
+ GlTable,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ inject: ['canAdminCrmContact', 'groupFullPath', 'groupIssuesPath'],
+ data() {
+ return {
+ contacts: [],
+ error: false,
+ };
+ },
+ apollo: {
+ contacts: {
+ query() {
+ return getGroupContactsQuery;
+ },
+ variables() {
+ return {
+ groupFullPath: this.groupFullPath,
+ };
+ },
+ update(data) {
+ return this.extractContacts(data);
+ },
+ error() {
+ this.error = true;
+ },
+ },
+ },
+ computed: {
+ isLoading() {
+ return this.$apollo.queries.contacts.loading;
+ },
+ canAdmin() {
+ return parseBoolean(this.canAdminCrmContact);
+ },
+ },
+ methods: {
+ extractContacts(data) {
+ const contacts = data?.group?.contacts?.nodes || [];
+ return contacts.slice().sort((a, b) => a.firstName.localeCompare(b.firstName));
+ },
+ getIssuesPath(path, value) {
+ return `${path}?scope=all&state=opened&crm_contact_id=${value}`;
+ },
+ getEditRoute(id) {
+ return { name: this.$options.EDIT_ROUTE_NAME, params: { id } };
+ },
+ },
+ fields: [
+ { key: 'firstName', sortable: true },
+ { key: 'lastName', sortable: true },
+ { key: 'email', sortable: true },
+ { key: 'phone', sortable: true },
+ { key: 'description', sortable: true },
+ {
+ key: 'organization',
+ formatter: (organization) => {
+ return organization?.name;
+ },
+ sortable: true,
+ },
+ {
+ key: 'id',
+ label: '',
+ formatter: (id) => {
+ return getIdFromGraphQLId(id);
+ },
+ },
+ ],
+ i18n: {
+ emptyText: s__('Crm|No contacts found'),
+ issuesButtonLabel: __('View issues'),
+ editButtonLabel: __('Edit'),
+ title: s__('Crm|Customer relations contacts'),
+ newContact: s__('Crm|New contact'),
+ errorText: __('Something went wrong. Please try again.'),
+ },
+ EDIT_ROUTE_NAME,
+ NEW_ROUTE_NAME,
+};
+</script>
+
+<template>
+ <div>
+ <gl-alert v-if="error" variant="danger" class="gl-mt-6" @dismiss="error = false">
+ {{ $options.i18n.errorText }}
+ </gl-alert>
+ <div
+ class="gl-display-flex gl-align-items-baseline gl-flex-direction-row gl-justify-content-space-between gl-mt-6"
+ >
+ <h2 class="gl-font-size-h2 gl-my-0">
+ {{ $options.i18n.title }}
+ </h2>
+ <div v-if="canAdmin">
+ <router-link :to="{ name: $options.NEW_ROUTE_NAME }">
+ <gl-button variant="confirm" data-testid="new-contact-button">
+ {{ $options.i18n.newContact }}
+ </gl-button>
+ </router-link>
+ </div>
+ </div>
+ <router-view />
+ <gl-loading-icon v-if="isLoading" class="gl-mt-5" size="lg" />
+ <gl-table
+ v-else
+ class="gl-mt-5"
+ :items="contacts"
+ :fields="$options.fields"
+ :empty-text="$options.i18n.emptyText"
+ show-empty
+ >
+ <template #cell(id)="{ value: id }">
+ <gl-button
+ v-gl-tooltip.hover.bottom="$options.i18n.issuesButtonLabel"
+ class="gl-mr-3"
+ data-testid="issues-link"
+ icon="issues"
+ :aria-label="$options.i18n.issuesButtonLabel"
+ :href="getIssuesPath(groupIssuesPath, id)"
+ />
+ <router-link :to="getEditRoute(id)">
+ <gl-button
+ v-if="canAdmin"
+ v-gl-tooltip.hover.bottom="$options.i18n.editButtonLabel"
+ data-testid="edit-contact-button"
+ icon="pencil"
+ :aria-label="$options.i18n.editButtonLabel"
+ />
+ </router-link>
+ </template>
+ </gl-table>
+ </div>
+</template>
diff --git a/app/assets/javascripts/crm/components/queries/create_contact.mutation.graphql b/app/assets/javascripts/crm/contacts/components/graphql/create_contact.mutation.graphql
index e0192459609..e0192459609 100644
--- a/app/assets/javascripts/crm/components/queries/create_contact.mutation.graphql
+++ b/app/assets/javascripts/crm/contacts/components/graphql/create_contact.mutation.graphql
diff --git a/app/assets/javascripts/crm/components/queries/crm_contact_fields.fragment.graphql b/app/assets/javascripts/crm/contacts/components/graphql/crm_contact_fields.fragment.graphql
index cef4083b446..cef4083b446 100644
--- a/app/assets/javascripts/crm/components/queries/crm_contact_fields.fragment.graphql
+++ b/app/assets/javascripts/crm/contacts/components/graphql/crm_contact_fields.fragment.graphql
diff --git a/app/assets/javascripts/crm/components/queries/get_group_contacts.query.graphql b/app/assets/javascripts/crm/contacts/components/graphql/get_group_contacts.query.graphql
index 2a8150e42e3..2a8150e42e3 100644
--- a/app/assets/javascripts/crm/components/queries/get_group_contacts.query.graphql
+++ b/app/assets/javascripts/crm/contacts/components/graphql/get_group_contacts.query.graphql
diff --git a/app/assets/javascripts/crm/components/queries/update_contact.mutation.graphql b/app/assets/javascripts/crm/contacts/components/graphql/update_contact.mutation.graphql
index f55f6a10e0a..f55f6a10e0a 100644
--- a/app/assets/javascripts/crm/components/queries/update_contact.mutation.graphql
+++ b/app/assets/javascripts/crm/contacts/components/graphql/update_contact.mutation.graphql
diff --git a/app/assets/javascripts/crm/contacts/routes.js b/app/assets/javascripts/crm/contacts/routes.js
new file mode 100644
index 00000000000..18768e1c775
--- /dev/null
+++ b/app/assets/javascripts/crm/contacts/routes.js
@@ -0,0 +1,20 @@
+import { INDEX_ROUTE_NAME, NEW_ROUTE_NAME, EDIT_ROUTE_NAME } from '../constants';
+import ContactFormWrapper from './components/contact_form_wrapper.vue';
+
+export default [
+ {
+ name: INDEX_ROUTE_NAME,
+ path: '/',
+ },
+ {
+ name: NEW_ROUTE_NAME,
+ path: '/new',
+ component: ContactFormWrapper,
+ },
+ {
+ name: EDIT_ROUTE_NAME,
+ path: '/:id/edit',
+ component: ContactFormWrapper,
+ props: { isEditMode: true },
+ },
+];
diff --git a/app/assets/javascripts/crm/organizations_bundle.js b/app/assets/javascripts/crm/organizations/bundle.js
index 828d7cd426c..828d7cd426c 100644
--- a/app/assets/javascripts/crm/organizations_bundle.js
+++ b/app/assets/javascripts/crm/organizations/bundle.js
diff --git a/app/assets/javascripts/crm/components/queries/create_organization.mutation.graphql b/app/assets/javascripts/crm/organizations/components/graphql/create_organization.mutation.graphql
index 2cc7e53ee9b..2cc7e53ee9b 100644
--- a/app/assets/javascripts/crm/components/queries/create_organization.mutation.graphql
+++ b/app/assets/javascripts/crm/organizations/components/graphql/create_organization.mutation.graphql
diff --git a/app/assets/javascripts/crm/components/queries/crm_organization_fields.fragment.graphql b/app/assets/javascripts/crm/organizations/components/graphql/crm_organization_fields.fragment.graphql
index 4adc5742d3a..4adc5742d3a 100644
--- a/app/assets/javascripts/crm/components/queries/crm_organization_fields.fragment.graphql
+++ b/app/assets/javascripts/crm/organizations/components/graphql/crm_organization_fields.fragment.graphql
diff --git a/app/assets/javascripts/crm/components/queries/get_group_organizations.query.graphql b/app/assets/javascripts/crm/organizations/components/graphql/get_group_organizations.query.graphql
index e8d8109431e..e8d8109431e 100644
--- a/app/assets/javascripts/crm/components/queries/get_group_organizations.query.graphql
+++ b/app/assets/javascripts/crm/organizations/components/graphql/get_group_organizations.query.graphql
diff --git a/app/assets/javascripts/crm/organizations/components/graphql/update_organization.mutation.graphql b/app/assets/javascripts/crm/organizations/components/graphql/update_organization.mutation.graphql
new file mode 100644
index 00000000000..a4c46d1f0fa
--- /dev/null
+++ b/app/assets/javascripts/crm/organizations/components/graphql/update_organization.mutation.graphql
@@ -0,0 +1,10 @@
+#import "./crm_organization_fields.fragment.graphql"
+
+mutation updateOrganization($input: CustomerRelationsOrganizationUpdateInput!) {
+ customerRelationsOrganizationUpdate(input: $input) {
+ organization {
+ ...OrganizationFragment
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/crm/organizations/components/organization_form_wrapper.vue b/app/assets/javascripts/crm/organizations/components/organization_form_wrapper.vue
new file mode 100644
index 00000000000..38468e1f4e4
--- /dev/null
+++ b/app/assets/javascripts/crm/organizations/components/organization_form_wrapper.vue
@@ -0,0 +1,80 @@
+<script>
+import { s__, __ } from '~/locale';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
+import { TYPE_CRM_ORGANIZATION, TYPE_GROUP } from '~/graphql_shared/constants';
+import OrganizationForm from '../../components/form.vue';
+import getGroupOrganizationsQuery from './graphql/get_group_organizations.query.graphql';
+import createOrganizationMutation from './graphql/create_organization.mutation.graphql';
+import updateOrganizationMutation from './graphql/update_organization.mutation.graphql';
+
+export default {
+ components: {
+ OrganizationForm,
+ },
+ inject: ['groupFullPath', 'groupId'],
+ props: {
+ isEditMode: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ organizationGraphQLId() {
+ if (!this.isEditMode) return null;
+
+ return convertToGraphQLId(TYPE_CRM_ORGANIZATION, this.$route.params.id);
+ },
+ groupGraphQLId() {
+ return convertToGraphQLId(TYPE_GROUP, this.groupId);
+ },
+ mutation() {
+ if (this.isEditMode) return updateOrganizationMutation;
+
+ return createOrganizationMutation;
+ },
+ getQuery() {
+ return {
+ query: getGroupOrganizationsQuery,
+ variables: { groupFullPath: this.groupFullPath },
+ };
+ },
+ title() {
+ if (this.isEditMode) return s__('Crm|Edit organization');
+
+ return s__('Crm|New organization');
+ },
+ successMessage() {
+ if (this.isEditMode) return s__('Crm|Organization has been updated.');
+
+ return s__('Crm|Organization has been added.');
+ },
+ additionalCreateParams() {
+ return { groupId: this.groupGraphQLId };
+ },
+ },
+ fields: [
+ { name: 'name', label: __('Name'), required: true },
+ {
+ name: 'defaultRate',
+ label: s__('Crm|Default rate'),
+ input: { type: 'number', step: '0.01' },
+ },
+ { name: 'description', label: __('Description') },
+ ],
+};
+</script>
+
+<template>
+ <organization-form
+ :drawer-open="true"
+ :get-query="getQuery"
+ get-query-node-path="group.organizations"
+ :mutation="mutation"
+ :additional-create-params="additionalCreateParams"
+ :existing-id="organizationGraphQLId"
+ :fields="$options.fields"
+ :title="title"
+ :success-message="successMessage"
+ />
+</template>
diff --git a/app/assets/javascripts/crm/organizations/components/organizations_root.vue b/app/assets/javascripts/crm/organizations/components/organizations_root.vue
new file mode 100644
index 00000000000..522e29eb2af
--- /dev/null
+++ b/app/assets/javascripts/crm/organizations/components/organizations_root.vue
@@ -0,0 +1,142 @@
+<script>
+import { GlAlert, GlButton, GlLoadingIcon, GlTable, GlTooltipDirective } from '@gitlab/ui';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import { s__, __ } from '~/locale';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { EDIT_ROUTE_NAME, NEW_ROUTE_NAME } from '../../constants';
+import getGroupOrganizationsQuery from './graphql/get_group_organizations.query.graphql';
+
+export default {
+ components: {
+ GlAlert,
+ GlButton,
+ GlLoadingIcon,
+ GlTable,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ inject: ['canAdminCrmOrganization', 'groupFullPath', 'groupIssuesPath'],
+ data() {
+ return {
+ organizations: [],
+ error: false,
+ };
+ },
+ apollo: {
+ organizations: {
+ query() {
+ return getGroupOrganizationsQuery;
+ },
+ variables() {
+ return {
+ groupFullPath: this.groupFullPath,
+ };
+ },
+ update(data) {
+ return this.extractOrganizations(data);
+ },
+ error() {
+ this.error = true;
+ },
+ },
+ },
+ computed: {
+ isLoading() {
+ return this.$apollo.queries.organizations.loading;
+ },
+ canAdmin() {
+ return parseBoolean(this.canAdminCrmOrganization);
+ },
+ },
+ methods: {
+ extractOrganizations(data) {
+ const organizations = data?.group?.organizations?.nodes || [];
+ return organizations.slice().sort((a, b) => a.name.localeCompare(b.name));
+ },
+ getIssuesPath(path, value) {
+ return `${path}?scope=all&state=opened&crm_organization_id=${value}`;
+ },
+ getEditRoute(id) {
+ return { name: this.$options.EDIT_ROUTE_NAME, params: { id } };
+ },
+ },
+ fields: [
+ { key: 'name', sortable: true },
+ { key: 'defaultRate', sortable: true },
+ { key: 'description', sortable: true },
+ {
+ key: 'id',
+ label: '',
+ formatter: (id) => {
+ return getIdFromGraphQLId(id);
+ },
+ },
+ ],
+ i18n: {
+ emptyText: s__('Crm|No organizations found'),
+ issuesButtonLabel: __('View issues'),
+ editButtonLabel: __('Edit'),
+ title: s__('Crm|Customer relations organizations'),
+ newOrganization: s__('Crm|New organization'),
+ errorText: __('Something went wrong. Please try again.'),
+ },
+ EDIT_ROUTE_NAME,
+ NEW_ROUTE_NAME,
+};
+</script>
+
+<template>
+ <div>
+ <gl-alert v-if="error" variant="danger" class="gl-mt-6" @dismiss="error = false">
+ {{ $options.i18n.errorText }}
+ </gl-alert>
+ <div
+ class="gl-display-flex gl-align-items-baseline gl-flex-direction-row gl-justify-content-space-between gl-mt-6"
+ >
+ <h2 class="gl-font-size-h2 gl-my-0">
+ {{ $options.i18n.title }}
+ </h2>
+ <div
+ v-if="canAdmin"
+ class="gl-display-none gl-md-display-flex gl-align-items-center gl-justify-content-end"
+ >
+ <router-link :to="{ name: $options.NEW_ROUTE_NAME }">
+ <gl-button variant="confirm" data-testid="new-organization-button">
+ {{ $options.i18n.newOrganization }}
+ </gl-button>
+ </router-link>
+ </div>
+ </div>
+ <router-view />
+ <gl-loading-icon v-if="isLoading" class="gl-mt-5" size="lg" />
+ <gl-table
+ v-else
+ class="gl-mt-5"
+ :items="organizations"
+ :fields="$options.fields"
+ :empty-text="$options.i18n.emptyText"
+ show-empty
+ >
+ <template #cell(id)="{ value: id }">
+ <gl-button
+ v-gl-tooltip.hover.bottom="$options.i18n.issuesButtonLabel"
+ class="gl-mr-3"
+ data-testid="issues-link"
+ icon="issues"
+ :aria-label="$options.i18n.issuesButtonLabel"
+ :href="getIssuesPath(groupIssuesPath, id)"
+ />
+ <router-link :to="getEditRoute(id)">
+ <gl-button
+ v-if="canAdmin"
+ v-gl-tooltip.hover.bottom="$options.i18n.editButtonLabel"
+ data-testid="edit-organization-button"
+ icon="pencil"
+ :aria-label="$options.i18n.editButtonLabel"
+ />
+ </router-link>
+ </template>
+ </gl-table>
+ </div>
+</template>
diff --git a/app/assets/javascripts/crm/organizations/routes.js b/app/assets/javascripts/crm/organizations/routes.js
new file mode 100644
index 00000000000..85bd3b32877
--- /dev/null
+++ b/app/assets/javascripts/crm/organizations/routes.js
@@ -0,0 +1,20 @@
+import { INDEX_ROUTE_NAME, NEW_ROUTE_NAME, EDIT_ROUTE_NAME } from '../constants';
+import OrganizationFormWrapper from './components/organization_form_wrapper.vue';
+
+export default [
+ {
+ name: INDEX_ROUTE_NAME,
+ path: '/',
+ },
+ {
+ name: NEW_ROUTE_NAME,
+ path: '/new',
+ component: OrganizationFormWrapper,
+ },
+ {
+ name: EDIT_ROUTE_NAME,
+ path: '/:id/edit',
+ component: OrganizationFormWrapper,
+ props: { isEditMode: true },
+ },
+];
diff --git a/app/assets/javascripts/crm/routes.js b/app/assets/javascripts/crm/routes.js
deleted file mode 100644
index 12aa17d73b6..00000000000
--- a/app/assets/javascripts/crm/routes.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { INDEX_ROUTE_NAME, NEW_ROUTE_NAME, EDIT_ROUTE_NAME } from './constants';
-
-export default [
- {
- name: INDEX_ROUTE_NAME,
- path: '/',
- },
- {
- name: NEW_ROUTE_NAME,
- path: '/new',
- },
- {
- name: EDIT_ROUTE_NAME,
- path: '/:id/edit',
- },
-];
diff --git a/app/assets/javascripts/deprecated_notes.js b/app/assets/javascripts/deprecated_notes.js
index 0707ae02872..73d872cf962 100644
--- a/app/assets/javascripts/deprecated_notes.js
+++ b/app/assets/javascripts/deprecated_notes.js
@@ -1,4 +1,4 @@
-/* eslint-disable no-restricted-properties, babel/camelcase,
+/* eslint-disable no-restricted-properties, camelcase,
no-unused-expressions, default-case,
consistent-return, no-param-reassign,
no-shadow, no-useless-escape,
@@ -143,7 +143,7 @@ export default class Notes {
// resolve a discussion
this.$wrapperEl.on('click', '.js-comment-resolve-button', this.postComment);
// remove a note (in general)
- this.$wrapperEl.on('click', '.js-note-delete', this.removeNote);
+ this.$wrapperEl.on('ajax:success', '.js-note-delete', this.removeNote);
// delete note attachment
this.$wrapperEl.on('click', '.js-note-attachment-delete', this.removeAttachment);
// update the file name when an attachment is selected
@@ -188,7 +188,7 @@ export default class Notes {
cleanBinding() {
this.$wrapperEl.off('click', '.js-note-edit');
this.$wrapperEl.off('click', '.note-edit-cancel');
- this.$wrapperEl.off('click', '.js-note-delete');
+ this.$wrapperEl.off('ajax:success', '.js-note-delete');
this.$wrapperEl.off('click', '.js-note-attachment-delete');
this.$wrapperEl.off('click', '.js-discussion-reply-button');
this.$wrapperEl.off('click', '.js-add-diff-note-button');
@@ -827,50 +827,53 @@ export default class Notes {
*/
removeNote(e) {
const $note = $(e.currentTarget).closest('.note');
- const noteElId = $note.attr('id');
- $(`.note[id="${noteElId}"]`).each((i, el) => {
- // A same note appears in the "Discussion" and in the "Changes" tab, we have
- // to remove all. Using $('.note[id='noteId']') ensure we get all the notes,
- // where $('#noteId') would return only one.
- const $note = $(el);
- const $notes = $note.closest('.discussion-notes');
- const discussionId = $('.notes', $notes).data('discussionId');
-
- $note.remove();
-
- // check if this is the last note for this line
- if ($notes.find('.note').length === 0) {
- const notesTr = $notes.closest('tr');
-
- // "Discussions" tab
- $notes.closest('.timeline-entry').remove();
-
- $(`.js-diff-avatars-${discussionId}`).trigger('remove.vue');
-
- // The notes tr can contain multiple lists of notes, like on the parallel diff
- // notesTr does not exist for image diffs
- if (notesTr.find('.discussion-notes').length > 1 || notesTr.length === 0) {
- const $diffFile = $notes.closest('.diff-file');
- if ($diffFile.length > 0) {
- const removeBadgeEvent = new CustomEvent('removeBadge.imageDiff', {
- detail: {
- // badgeNumber's start with 1 and index starts with 0
- badgeNumber: $notes.index() + 1,
- },
- });
- $diffFile[0].dispatchEvent(removeBadgeEvent);
- }
+ $note.one('ajax:complete', () => {
+ const noteElId = $note.attr('id');
+ $(`.note[id="${noteElId}"]`).each((i, el) => {
+ // A same note appears in the "Discussion" and in the "Changes" tab, we have
+ // to remove all. Using $('.note[id='noteId']') ensure we get all the notes,
+ // where $('#noteId') would return only one.
+ const $note = $(el);
+ const $notes = $note.closest('.discussion-notes');
+ const discussionId = $('.notes', $notes).data('discussionId');
+
+ $note.remove();
+
+ // check if this is the last note for this line
+ if ($notes.find('.note').length === 0) {
+ const notesTr = $notes.closest('tr');
+
+ // "Discussions" tab
+ $notes.closest('.timeline-entry').remove();
+
+ $(`.js-diff-avatars-${discussionId}`).trigger('remove.vue');
+
+ // The notes tr can contain multiple lists of notes, like on the parallel diff
+ // notesTr does not exist for image diffs
+ if (notesTr.find('.discussion-notes').length > 1 || notesTr.length === 0) {
+ const $diffFile = $notes.closest('.diff-file');
+ if ($diffFile.length > 0) {
+ const removeBadgeEvent = new CustomEvent('removeBadge.imageDiff', {
+ detail: {
+ // badgeNumber's start with 1 and index starts with 0
+ badgeNumber: $notes.index() + 1,
+ },
+ });
+
+ $diffFile[0].dispatchEvent(removeBadgeEvent);
+ }
- $notes.remove();
- } else if (notesTr.length > 0) {
- notesTr.remove();
+ $notes.remove();
+ } else if (notesTr.length > 0) {
+ notesTr.remove();
+ }
}
- }
- });
+ });
- Notes.checkMergeRequestStatus();
- return this.updateNotesCount(-1);
+ Notes.checkMergeRequestStatus();
+ return this.updateNotesCount(-1);
+ });
}
/**
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue b/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
index 7fefbab977d..618096c5bea 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
@@ -1,5 +1,5 @@
<script>
-import { GlTooltipDirective, GlIcon, GlLoadingIcon, GlLink } from '@gitlab/ui';
+import { GlButton, GlLink, GlTooltipDirective } from '@gitlab/ui';
import { ApolloMutation } from 'vue-apollo';
import createFlash from '~/flash';
import { s__ } from '~/locale';
@@ -26,15 +26,14 @@ export default {
components: {
ApolloMutation,
DesignNote,
+ DesignNotePin,
DesignNoteSignedOut,
- ReplyPlaceholder,
DesignReplyForm,
- GlIcon,
- GlLoadingIcon,
+ GlButton,
GlLink,
- ToggleRepliesWidget,
+ ReplyPlaceholder,
TimeAgoTooltip,
- DesignNotePin,
+ ToggleRepliesWidget,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -239,18 +238,17 @@ export default {
@error="$emit('update-note-error', $event)"
>
<template v-if="isLoggedIn && discussion.resolvable" #resolve-discussion>
- <button
+ <gl-button
v-gl-tooltip
- :class="{ 'is-active': discussion.resolved }"
- :title="resolveCheckboxText"
:aria-label="resolveCheckboxText"
- class="line-resolve-btn note-action-button gl-mr-3"
+ :icon="resolveIconName"
+ :title="resolveCheckboxText"
+ :loading="isResolving"
+ category="tertiary"
data-testid="resolve-button"
+ size="small"
@click.stop="toggleResolvedStatus"
- >
- <gl-icon v-if="!isResolving" :name="resolveIconName" data-testid="resolve-icon" />
- <gl-loading-icon v-else size="sm" inline />
- </button>
+ />
</template>
<template v-if="discussion.resolved" #resolved-status>
<p class="gl-text-gray-500 gl-font-sm gl-m-0 gl-mt-5" data-testid="resolved-message">
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_note.vue b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
index 1e1f5135290..5fb5989e11a 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_note.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
@@ -1,11 +1,17 @@
<script>
-import { GlTooltipDirective, GlIcon, GlLink, GlSafeHtmlDirective } from '@gitlab/ui';
+import {
+ GlAvatar,
+ GlAvatarLink,
+ GlButton,
+ GlLink,
+ GlSafeHtmlDirective,
+ GlTooltipDirective,
+} from '@gitlab/ui';
import { ApolloMutation } from 'vue-apollo';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __ } from '~/locale';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
-import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import updateNoteMutation from '../../graphql/mutations/update_note.mutation.graphql';
import { hasErrors } from '../../utils/cache_update';
import { findNoteId, extractDesignNoteId } from '../../utils/design_management_utils';
@@ -16,13 +22,14 @@ export default {
editCommentLabel: __('Edit comment'),
},
components: {
- UserAvatarLink,
- TimelineEntryItem,
- TimeAgoTooltip,
- DesignReplyForm,
ApolloMutation,
- GlIcon,
+ DesignReplyForm,
+ GlAvatar,
+ GlAvatarLink,
+ GlButton,
GlLink,
+ TimeAgoTooltip,
+ TimelineEntryItem,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -86,18 +93,17 @@ export default {
<template>
<timeline-entry-item :id="`note_${noteAnchorId}`" class="design-note note-form">
- <user-avatar-link
- :link-href="author.webUrl"
- :img-src="author.avatarUrl"
- :img-alt="author.username"
- :img-size="40"
- />
+ <gl-avatar-link :href="author.webUrl" class="gl-float-left gl-mr-3">
+ <gl-avatar :size="32" :src="author.avatarUrl" :entity-name="author.username" />
+ </gl-avatar-link>
+
<div class="gl-display-flex gl-justify-content-space-between">
<div>
<gl-link
v-once
:href="author.webUrl"
class="js-user-link"
+ data-testid="user-link"
:data-user-id="authorId"
:data-username="author.username"
>
@@ -117,24 +123,25 @@ export default {
</div>
<div class="gl-display-flex gl-align-items-baseline">
<slot name="resolve-discussion"></slot>
- <button
+ <gl-button
v-if="isEditButtonVisible"
v-gl-tooltip
- type="button"
- :title="$options.i18n.editCommentLabel"
:aria-label="$options.i18n.editCommentLabel"
- class="note-action-button js-note-edit btn btn-transparent qa-note-edit-button"
+ :title="$options.i18n.editCommentLabel"
+ category="tertiary"
+ data-testid="note-edit"
+ icon="pencil"
+ size="small"
@click="isEditing = true"
- >
- <gl-icon name="pencil" class="link-highlight" />
- </button>
+ />
</div>
</div>
<template v-if="!isEditing">
<div
v-safe-html="note.bodyHtml"
- class="note-text js-note-text md"
+ class="note-text md"
data-qa-selector="note_content"
+ data-testid="note-text"
></div>
<slot name="resolved-status"></slot>
</template>
diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue
index 5707e4d67f9..c86f2c8451c 100644
--- a/app/assets/javascripts/diffs/components/app.vue
+++ b/app/assets/javascripts/diffs/components/app.vue
@@ -21,7 +21,7 @@ import MrWidgetHowToMergeModal from '~/vue_merge_request_widget/components/mr_wi
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 notesEventHub from '~/notes/event_hub';
import {
TREE_LIST_WIDTH_STORAGE_KEY,
INITIAL_TREE_WIDTH,
@@ -347,36 +347,34 @@ export default {
this.setHighlightedRow(id.split('diff-content').pop().slice(1));
}
- if (window.gon?.features?.diffSettingsUsageData) {
- const events = [];
+ const events = [];
- if (this.renderTreeList) {
- events.push(TRACKING_FILE_BROWSER_TREE);
- } else {
- events.push(TRACKING_FILE_BROWSER_LIST);
- }
-
- if (this.diffViewType === INLINE_DIFF_VIEW_TYPE) {
- events.push(TRACKING_DIFF_VIEW_INLINE);
- } else {
- events.push(TRACKING_DIFF_VIEW_PARALLEL);
- }
+ if (this.renderTreeList) {
+ events.push(TRACKING_FILE_BROWSER_TREE);
+ } else {
+ events.push(TRACKING_FILE_BROWSER_LIST);
+ }
- if (this.showWhitespace) {
- events.push(TRACKING_WHITESPACE_SHOW);
- } else {
- events.push(TRACKING_WHITESPACE_HIDE);
- }
+ if (this.diffViewType === INLINE_DIFF_VIEW_TYPE) {
+ events.push(TRACKING_DIFF_VIEW_INLINE);
+ } else {
+ events.push(TRACKING_DIFF_VIEW_PARALLEL);
+ }
- if (this.viewDiffsFileByFile) {
- events.push(TRACKING_SINGLE_FILE_MODE);
- } else {
- events.push(TRACKING_MULTIPLE_FILES_MODE);
- }
+ if (this.showWhitespace) {
+ events.push(TRACKING_WHITESPACE_SHOW);
+ } else {
+ events.push(TRACKING_WHITESPACE_HIDE);
+ }
- queueRedisHllEvents(events);
+ if (this.viewDiffsFileByFile) {
+ events.push(TRACKING_SINGLE_FILE_MODE);
+ } else {
+ events.push(TRACKING_MULTIPLE_FILES_MODE);
}
+ queueRedisHllEvents(events);
+
this.subscribeToVirtualScrollingEvents();
},
beforeCreate() {
@@ -534,10 +532,8 @@ export default {
if (delta >= 0 && delta < 1000) {
this.disableVirtualScroller();
- if (window.gon?.features?.usageDataDiffSearches) {
- api.trackRedisHllUserEvent('i_code_review_user_searches_diff');
- api.trackRedisCounterEvent('diff_searches');
- }
+ api.trackRedisHllUserEvent('i_code_review_user_searches_diff');
+ api.trackRedisCounterEvent('diff_searches');
}
}
});
@@ -574,12 +570,8 @@ export default {
this.scrollVirtualScrollerToIndex(index);
}
},
- async scrollVirtualScrollerToIndex(index) {
+ scrollVirtualScrollerToIndex(index) {
this.virtualScrollCurrentIndex = index;
-
- await this.$nextTick();
-
- this.virtualScrollCurrentIndex = -1;
},
scrollVirtualScrollerToDiffNote() {
const id = window?.location?.hash;
@@ -705,7 +697,7 @@ export default {
</dynamic-scroller-item>
</template>
</pre-renderer>
- <virtual-scroller-scroll-sync :index="virtualScrollCurrentIndex" />
+ <virtual-scroller-scroll-sync v-model="virtualScrollCurrentIndex" />
</template>
</dynamic-scroller>
<template v-else>
diff --git a/app/assets/javascripts/diffs/components/commit_item.vue b/app/assets/javascripts/diffs/components/commit_item.vue
index ba10f6deb29..42f4ea8eb58 100644
--- a/app/assets/javascripts/diffs/components/commit_item.vue
+++ b/app/assets/javascripts/diffs/components/commit_item.vue
@@ -103,7 +103,7 @@ export default {
>
<div
v-if="commit.signature_html"
- v-safe-html:[$options.safeHtmlConfig]="commit.signature_html"
+ v-html="commit.signature_html /* eslint-disable-line vue/no-v-html */"
></div>
<commit-pipeline-status
v-if="commit.pipeline_status_path"
@@ -137,7 +137,7 @@ export default {
:link-href="authorUrl"
:img-src="authorAvatar"
:img-alt="authorName"
- :img-size="40"
+ :img-size="32"
class="avatar-cell d-none d-sm-block"
/>
</div>
diff --git a/app/assets/javascripts/diffs/components/compare_versions.vue b/app/assets/javascripts/diffs/components/compare_versions.vue
index 2b871680d5e..4dfd672f99b 100644
--- a/app/assets/javascripts/diffs/components/compare_versions.vue
+++ b/app/assets/javascripts/diffs/components/compare_versions.vue
@@ -2,7 +2,7 @@
import { GlTooltipDirective, GlIcon, GlLink, GlButtonGroup, GlButton, GlSprintf } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
import { __ } from '~/locale';
-import { setUrlParams } from '../../lib/utils/url_utility';
+import { setUrlParams } from '~/lib/utils/url_utility';
import { EVT_EXPAND_ALL_FILES } from '../constants';
import eventHub from '../event_hub';
import CompareDropdownLayout from './compare_dropdown_layout.vue';
diff --git a/app/assets/javascripts/diffs/components/diff_content.vue b/app/assets/javascripts/diffs/components/diff_content.vue
index 7ed5713ebfa..b4bffdcb07f 100644
--- a/app/assets/javascripts/diffs/components/diff_content.vue
+++ b/app/assets/javascripts/diffs/components/diff_content.vue
@@ -9,9 +9,9 @@ import diffLineNoteFormMixin from '~/notes/mixins/diff_line_note_form';
import DiffViewer from '~/vue_shared/components/diff_viewer/diff_viewer.vue';
import NoPreviewViewer from '~/vue_shared/components/diff_viewer/viewers/no_preview.vue';
import NotDiffableViewer from '~/vue_shared/components/diff_viewer/viewers/not_diffable.vue';
-import NoteForm from '../../notes/components/note_form.vue';
-import eventHub from '../../notes/event_hub';
-import userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
+import NoteForm from '~/notes/components/note_form.vue';
+import eventHub from '~/notes/event_hub';
+import userAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import { IMAGE_DIFF_POSITION_TYPE } from '../constants';
import { getDiffMode } from '../store/utils';
import DiffDiscussions from './diff_discussions.vue';
@@ -170,7 +170,6 @@ export default {
<note-form
v-if="diffFileCommentForm"
ref="noteForm"
- :is-editing="false"
:save-button-title="__('Comment')"
class="diff-comment-form new-note discussion-form discussion-form-container"
@handleFormUpdateAddToReview="addToReview"
diff --git a/app/assets/javascripts/diffs/components/diff_discussions.vue b/app/assets/javascripts/diffs/components/diff_discussions.vue
index 47a05ce11cc..b39b50c4cdc 100644
--- a/app/assets/javascripts/diffs/components/diff_discussions.vue
+++ b/app/assets/javascripts/diffs/components/diff_discussions.vue
@@ -2,7 +2,7 @@
import { GlIcon } from '@gitlab/ui';
import { mapActions } from 'vuex';
import DesignNotePin from '~/vue_shared/components/design_management/design_note_pin.vue';
-import noteableDiscussion from '../../notes/components/noteable_discussion.vue';
+import noteableDiscussion from '~/notes/components/noteable_discussion.vue';
export default {
components: {
diff --git a/app/assets/javascripts/diffs/components/diff_file.vue b/app/assets/javascripts/diffs/components/diff_file.vue
index 4e77bf81c1e..d8f27a967df 100644
--- a/app/assets/javascripts/diffs/components/diff_file.vue
+++ b/app/assets/javascripts/diffs/components/diff_file.vue
@@ -17,7 +17,7 @@ import { diffViewerErrors } from '~/ide/constants';
import { scrollToElement } from '~/lib/utils/common_utils';
import { sprintf } from '~/locale';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import notesEventHub from '../../notes/event_hub';
+import notesEventHub from '~/notes/event_hub';
import {
DIFF_FILE_AUTOMATIC_COLLAPSE,
diff --git a/app/assets/javascripts/diffs/components/diff_file_header.vue b/app/assets/javascripts/diffs/components/diff_file_header.vue
index 495c87a695c..8cdbd2b7dbc 100644
--- a/app/assets/javascripts/diffs/components/diff_file_header.vue
+++ b/app/assets/javascripts/diffs/components/diff_file_header.vue
@@ -340,6 +340,7 @@ export default {
:title="__('Copy file path')"
:text="diffFile.file_path"
:gfm="gfmCopyText"
+ size="small"
data-testid="diff-file-copy-clipboard"
category="tertiary"
data-track-action="click_copy_file_button"
@@ -392,6 +393,7 @@ export default {
/>
<gl-dropdown
v-gl-tooltip.hover.focus="$options.i18n.optionsDropdownTitle"
+ size="small"
right
toggle-class="btn-icon js-diff-more-actions"
class="gl-pt-0!"
@@ -400,7 +402,7 @@ export default {
@hidden="setMoreActionsShown(false)"
>
<template #button-content>
- <gl-icon name="ellipsis_v" class="mr-0" />
+ <gl-icon name="ellipsis_v" class="mr-0" :size="12" />
<span class="sr-only">{{ $options.i18n.optionsDropdownTitle }}</span>
</template>
<gl-dropdown-item
diff --git a/app/assets/javascripts/diffs/components/diff_gutter_avatars.vue b/app/assets/javascripts/diffs/components/diff_gutter_avatars.vue
index e2f3f9cad7b..a077c8ae3af 100644
--- a/app/assets/javascripts/diffs/components/diff_gutter_avatars.vue
+++ b/app/assets/javascripts/diffs/components/diff_gutter_avatars.vue
@@ -74,6 +74,7 @@ export default {
v-for="note in notesInGutter"
:key="note.id"
:img-src="note.author.avatar_url"
+ :size="24"
:tooltip-text="getTooltipText(note)"
lazy
class="diff-comment-avatar js-diff-comment-avatar"
diff --git a/app/assets/javascripts/diffs/components/diff_line_note_form.vue b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
index 9d355c96af1..7a30740e31b 100644
--- a/app/assets/javascripts/diffs/components/diff_line_note_form.vue
+++ b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
@@ -4,13 +4,10 @@ import { s__ } from '~/locale';
import diffLineNoteFormMixin from '~/notes/mixins/diff_line_note_form';
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import MultilineCommentForm from '../../notes/components/multiline_comment_form.vue';
-import {
- commentLineOptions,
- formatLineRange,
-} from '../../notes/components/multiline_comment_utils';
-import noteForm from '../../notes/components/note_form.vue';
-import autosave from '../../notes/mixins/autosave';
+import MultilineCommentForm from '~/notes/components/multiline_comment_form.vue';
+import { commentLineOptions, formatLineRange } from '~/notes/components/multiline_comment_utils';
+import noteForm from '~/notes/components/note_form.vue';
+import autosave from '~/notes/mixins/autosave';
import {
DIFF_NOTE_TYPE,
INLINE_DIFF_LINES_KEY,
@@ -221,7 +218,6 @@ export default {
</div>
<note-form
ref="noteForm"
- :is-editing="false"
:line-code="line.line_code"
:line="line"
:lines="commentLines"
diff --git a/app/assets/javascripts/diffs/components/no_changes.vue b/app/assets/javascripts/diffs/components/no_changes.vue
index ab518fcfb16..42af2ab7880 100644
--- a/app/assets/javascripts/diffs/components/no_changes.vue
+++ b/app/assets/javascripts/diffs/components/no_changes.vue
@@ -61,7 +61,7 @@ export default {
</gl-sprintf>
</div>
<div class="text-center">
- <gl-button :href="getNoteableData.new_blob_path" variant="success" category="primary">{{
+ <gl-button :href="getNoteableData.new_blob_path" variant="confirm" category="primary">{{
__('Create commit')
}}</gl-button>
</div>
diff --git a/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js b/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js
index 984c6f8c0c9..d44dffecc38 100644
--- a/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js
+++ b/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js
@@ -2,6 +2,9 @@ import { handleLocationHash } from '~/lib/utils/common_utils';
export default {
inject: ['vscrollParent'],
+ model: {
+ prop: 'index',
+ },
props: {
index: {
type: Number,
@@ -39,6 +42,7 @@ export default {
methods: {
scrollToIndex(index) {
this.vscrollParent.scrollToItem(index);
+ this.$emit('update', -1);
setTimeout(() => {
handleLocationHash();
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js
index e967be23f42..d5cd4af4d06 100644
--- a/app/assets/javascripts/diffs/store/actions.js
+++ b/app/assets/javascripts/diffs/store/actions.js
@@ -13,7 +13,7 @@ import httpStatusCodes from '~/lib/utils/http_status';
import Poll from '~/lib/utils/poll';
import { mergeUrlParams, getLocationHash } from '~/lib/utils/url_utility';
import { __, s__ } from '~/locale';
-import notesEventHub from '../../notes/event_hub';
+import notesEventHub from '~/notes/event_hub';
import {
PARALLEL_DIFF_VIEW_TYPE,
INLINE_DIFF_VIEW_TYPE,
@@ -376,9 +376,7 @@ export const setInlineDiffViewType = ({ commit }) => {
const url = mergeUrlParams({ view: INLINE_DIFF_VIEW_TYPE }, window.location.href);
historyPushState(url);
- if (window.gon?.features?.diffSettingsUsageData) {
- queueRedisHllEvents([TRACKING_CLICK_DIFF_VIEW_SETTING, TRACKING_DIFF_VIEW_INLINE]);
- }
+ queueRedisHllEvents([TRACKING_CLICK_DIFF_VIEW_SETTING, TRACKING_DIFF_VIEW_INLINE]);
};
export const setParallelDiffViewType = ({ commit }) => {
@@ -388,9 +386,7 @@ export const setParallelDiffViewType = ({ commit }) => {
const url = mergeUrlParams({ view: PARALLEL_DIFF_VIEW_TYPE }, window.location.href);
historyPushState(url);
- if (window.gon?.features?.diffSettingsUsageData) {
- queueRedisHllEvents([TRACKING_CLICK_DIFF_VIEW_SETTING, TRACKING_DIFF_VIEW_PARALLEL]);
- }
+ queueRedisHllEvents([TRACKING_CLICK_DIFF_VIEW_SETTING, TRACKING_DIFF_VIEW_PARALLEL]);
};
export const showCommentForm = ({ commit }, { lineCode, fileHash }) => {
@@ -576,7 +572,7 @@ export const setRenderTreeList = ({ commit }, { renderTreeList, trackClick = tru
localStorage.setItem(TREE_LIST_STORAGE_KEY, renderTreeList);
- if (window.gon?.features?.diffSettingsUsageData && trackClick) {
+ if (trackClick) {
const events = [TRACKING_CLICK_FILE_BROWSER_SETTING];
if (renderTreeList) {
@@ -600,7 +596,7 @@ export const setShowWhitespace = async (
commit(types.SET_SHOW_WHITESPACE, showWhitespace);
notesEventHub.$emit('refetchDiffData');
- if (window.gon?.features?.diffSettingsUsageData && trackClick) {
+ if (trackClick) {
const events = [TRACKING_CLICK_WHITESPACE_SETTING];
if (showWhitespace) {
@@ -827,18 +823,16 @@ export const navigateToDiffFileIndex = ({ commit, state }, index) => {
export const setFileByFile = ({ state, commit }, { fileByFile }) => {
commit(types.SET_FILE_BY_FILE, fileByFile);
- if (window.gon?.features?.diffSettingsUsageData) {
- const events = [TRACKING_CLICK_SINGLE_FILE_SETTING];
-
- if (fileByFile) {
- events.push(TRACKING_SINGLE_FILE_MODE);
- } else {
- events.push(TRACKING_MULTIPLE_FILES_MODE);
- }
+ const events = [TRACKING_CLICK_SINGLE_FILE_SETTING];
- queueRedisHllEvents(events);
+ if (fileByFile) {
+ events.push(TRACKING_SINGLE_FILE_MODE);
+ } else {
+ events.push(TRACKING_MULTIPLE_FILES_MODE);
}
+ queueRedisHllEvents(events);
+
return axios
.put(state.endpointUpdateUser, {
view_diffs_file_by_file: fileByFile,
diff --git a/app/assets/javascripts/diffs/utils/performance.js b/app/assets/javascripts/diffs/utils/performance.js
index 50bf17001a6..ad768c333e2 100644
--- a/app/assets/javascripts/diffs/utils/performance.js
+++ b/app/assets/javascripts/diffs/utils/performance.js
@@ -7,7 +7,7 @@ import {
MR_DIFFS_MARK_DIFF_FILES_END,
MR_DIFFS_MEASURE_FILE_TREE_DONE,
MR_DIFFS_MEASURE_DIFF_FILES_DONE,
-} from '../../performance/constants';
+} from '~/performance/constants';
import {
EVT_PERF_MARK_FILE_TREE_START,
diff --git a/app/assets/javascripts/editor/components/source_editor_toolbar.vue b/app/assets/javascripts/editor/components/source_editor_toolbar.vue
new file mode 100644
index 00000000000..1427f2df461
--- /dev/null
+++ b/app/assets/javascripts/editor/components/source_editor_toolbar.vue
@@ -0,0 +1,70 @@
+<script>
+import { isEmpty } from 'lodash';
+import { GlButtonGroup } from '@gitlab/ui';
+import getToolbarItemsQuery from '~/editor/graphql/get_items.query.graphql';
+import { EDITOR_TOOLBAR_LEFT_GROUP, EDITOR_TOOLBAR_RIGHT_GROUP } from '~/editor/constants';
+import SourceEditorToolbarButton from './source_editor_toolbar_button.vue';
+
+export default {
+ name: 'SourceEditorToolbar',
+ components: {
+ SourceEditorToolbarButton,
+ GlButtonGroup,
+ },
+ data() {
+ return {
+ items: [],
+ };
+ },
+ apollo: {
+ items: {
+ query: getToolbarItemsQuery,
+ update(data) {
+ return this.setDefaultGroup(data?.items?.nodes);
+ },
+ },
+ },
+ computed: {
+ isVisible() {
+ return this.items.length;
+ },
+ },
+ methods: {
+ setDefaultGroup(nodes = []) {
+ return nodes.map((item) => {
+ return {
+ ...item,
+ group:
+ (this.$options.groups.includes(item.group) && item.group) || EDITOR_TOOLBAR_RIGHT_GROUP,
+ };
+ });
+ },
+ getGroupItems(group) {
+ return this.items.filter((item) => item.group === group);
+ },
+ hasGroupItems(group) {
+ return !isEmpty(this.getGroupItems(group));
+ },
+ },
+ groups: [EDITOR_TOOLBAR_LEFT_GROUP, EDITOR_TOOLBAR_RIGHT_GROUP],
+};
+</script>
+<template>
+ <section
+ v-if="isVisible"
+ id="se-toolbar"
+ class="gl-py-3 gl-px-5 gl-bg-white gl-border-t gl-border-b gl-display-flex gl-justify-content-space-between gl-align-items-center"
+ >
+ <template v-for="group in $options.groups">
+ <gl-button-group v-if="hasGroupItems(group)" :key="group">
+ <template v-for="item in getGroupItems(group)">
+ <source-editor-toolbar-button
+ :key="item.id"
+ :button="item"
+ @click="$emit('click', item)"
+ />
+ </template>
+ </gl-button-group>
+ </template>
+ </section>
+</template>
diff --git a/app/assets/javascripts/editor/components/source_editor_toolbar_button.vue b/app/assets/javascripts/editor/components/source_editor_toolbar_button.vue
new file mode 100644
index 00000000000..2595d67af34
--- /dev/null
+++ b/app/assets/javascripts/editor/components/source_editor_toolbar_button.vue
@@ -0,0 +1,89 @@
+<script>
+import { GlButton, GlTooltipDirective } from '@gitlab/ui';
+import updateToolbarItemMutation from '~/editor/graphql/update_item.mutation.graphql';
+import getToolbarItemQuery from '~/editor/graphql/get_item.query.graphql';
+
+export default {
+ name: 'SourceEditorToolbarButton',
+ components: {
+ GlButton,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ button: {
+ type: Object,
+ required: false,
+ default() {
+ return {};
+ },
+ },
+ },
+ data() {
+ return {
+ buttonItem: this.button,
+ };
+ },
+ apollo: {
+ buttonItem: {
+ query: getToolbarItemQuery,
+ variables() {
+ return {
+ id: this.button.id,
+ };
+ },
+ update({ item }) {
+ return item;
+ },
+ skip() {
+ return !this.button.id;
+ },
+ },
+ },
+ computed: {
+ icon() {
+ return this.buttonItem.selected
+ ? this.buttonItem.selectedIcon || this.buttonItem.icon
+ : this.buttonItem.icon;
+ },
+ label() {
+ return this.buttonItem.selected
+ ? this.buttonItem.selectedLabel || this.buttonItem.label
+ : this.buttonItem.label;
+ },
+ },
+ methods: {
+ clickHandler() {
+ if (this.buttonItem.onClick) {
+ this.buttonItem.onClick();
+ }
+ this.$apollo.mutate({
+ mutation: updateToolbarItemMutation,
+ variables: {
+ id: this.buttonItem.id,
+ propsToUpdate: {
+ selected: !this.buttonItem.selected,
+ },
+ },
+ });
+ this.$emit('click');
+ },
+ },
+};
+</script>
+<template>
+ <div>
+ <gl-button
+ v-gl-tooltip.hover
+ :category="buttonItem.category"
+ :variant="buttonItem.variant"
+ type="button"
+ :selected="buttonItem.selected"
+ :icon="icon"
+ :title="label"
+ :aria-label="label"
+ @click="clickHandler"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/editor/constants.js b/app/assets/javascripts/editor/constants.js
index 2ae9c377683..361122d8890 100644
--- a/app/assets/javascripts/editor/constants.js
+++ b/app/assets/javascripts/editor/constants.js
@@ -12,6 +12,9 @@ export const EDITOR_TYPE_DIFF = 'vs.editor.IDiffEditor';
export const EDITOR_CODE_INSTANCE_FN = 'createInstance';
export const EDITOR_DIFF_INSTANCE_FN = 'createDiffInstance';
+export const EDITOR_TOOLBAR_LEFT_GROUP = 'left';
+export const EDITOR_TOOLBAR_RIGHT_GROUP = 'right';
+
export const SOURCE_EDITOR_INSTANCE_ERROR_NO_EL = s__(
'SourceEditor|"el" parameter is required for createInstance()',
);
diff --git a/app/assets/javascripts/editor/graphql/get_item.query.graphql b/app/assets/javascripts/editor/graphql/get_item.query.graphql
new file mode 100644
index 00000000000..7c8bc09f7b0
--- /dev/null
+++ b/app/assets/javascripts/editor/graphql/get_item.query.graphql
@@ -0,0 +1,9 @@
+query ToolbarItem($id: String!) {
+ item(id: $id) @client {
+ id
+ label
+ icon
+ selected
+ group
+ }
+}
diff --git a/app/assets/javascripts/editor/graphql/get_items.query.graphql b/app/assets/javascripts/editor/graphql/get_items.query.graphql
new file mode 100644
index 00000000000..bfac816d276
--- /dev/null
+++ b/app/assets/javascripts/editor/graphql/get_items.query.graphql
@@ -0,0 +1,5 @@
+query ToolbarItems {
+ items @client {
+ nodes
+ }
+}
diff --git a/app/assets/javascripts/editor/graphql/update_item.mutation.graphql b/app/assets/javascripts/editor/graphql/update_item.mutation.graphql
new file mode 100644
index 00000000000..f8424c65181
--- /dev/null
+++ b/app/assets/javascripts/editor/graphql/update_item.mutation.graphql
@@ -0,0 +1,3 @@
+mutation updateItem($id: String!, $propsToUpdate: Item!) {
+ updateToolbarItem(id: $id, propsToUpdate: $propsToUpdate) @client
+}
diff --git a/app/assets/javascripts/editor/schema/ci.json b/app/assets/javascripts/editor/schema/ci.json
index 1c56327c03c..fe3229ac91b 100644
--- a/app/assets/javascripts/editor/schema/ci.json
+++ b/app/assets/javascripts/editor/schema/ci.json
@@ -187,6 +187,21 @@
}
]
},
+ "coverage_report": {
+ "type": "object",
+ "description": "Used to collect coverage reports from the job.",
+ "properties": {
+ "coverage_format": {
+ "description": "Code coverage format used by the test framework.",
+ "enum": ["cobertura"]
+ },
+ "path": {
+ "description": "Path to the coverage report file that should be parsed.",
+ "type": "string",
+ "minLength": 1
+ }
+ }
+ },
"codequality": {
"$ref": "#/definitions/string_file_list",
"description": "Path to file or list of files with code quality report(s) (such as Code Climate)."
@@ -1276,7 +1291,7 @@
},
"pipeline_variables": {
"type": "boolean",
- "description": "Variables added for manual pipeline runs are passed to downstream pipelines.",
+ "description": "Variables added for manual pipeline runs and scheduled pipelines are passed to downstream pipelines.",
"default": false
}
}
@@ -1392,7 +1407,7 @@
},
"pipeline_variables": {
"type": "boolean",
- "description": "Variables added for manual pipeline runs are passed to downstream pipelines.",
+ "description": "Variables added for manual pipeline runs and scheduled pipelines are passed to downstream pipelines.",
"default": false
}
}
diff --git a/app/assets/javascripts/emoji/awards_app/index.js b/app/assets/javascripts/emoji/awards_app/index.js
index 0986533dcd1..931407f4cf7 100644
--- a/app/assets/javascripts/emoji/awards_app/index.js
+++ b/app/assets/javascripts/emoji/awards_app/index.js
@@ -5,6 +5,8 @@ import AwardsList from '~/vue_shared/components/awards_list.vue';
import createstore from './store';
export default (el) => {
+ if (!el) return null;
+
const {
dataset: { path },
} = el;
diff --git a/app/assets/javascripts/emoji/index.js b/app/assets/javascripts/emoji/index.js
index aaae1624bee..4fdcdcc1b04 100644
--- a/app/assets/javascripts/emoji/index.js
+++ b/app/assets/javascripts/emoji/index.js
@@ -245,5 +245,12 @@ export function glEmojiTag(inputName, options) {
? `data-fallback-sprite-class="${escape(fallbackSpriteClass)}" `
: '';
- return `<gl-emoji ${fallbackSpriteAttribute}data-name="${escape(name)}"></gl-emoji>`;
+ const fallbackUrl = opts.url;
+ const fallbackSrcAttribute = fallbackUrl
+ ? `data-fallback-src="${fallbackUrl}" data-unicode-version="custom"`
+ : '';
+
+ return `<gl-emoji ${fallbackSrcAttribute}${fallbackSpriteAttribute}data-name="${escape(
+ name,
+ )}"></gl-emoji>`;
}
diff --git a/app/assets/javascripts/emoji/support/unicode_support_map.js b/app/assets/javascripts/emoji/support/unicode_support_map.js
index d90a774c293..9642993bd7d 100644
--- a/app/assets/javascripts/emoji/support/unicode_support_map.js
+++ b/app/assets/javascripts/emoji/support/unicode_support_map.js
@@ -1,4 +1,4 @@
-import AccessorUtilities from '../../lib/utils/accessor';
+import AccessorUtilities from '~/lib/utils/accessor';
const GL_EMOJI_VERSION = '0.2.0';
diff --git a/app/assets/javascripts/environments/components/empty_state.vue b/app/assets/javascripts/environments/components/empty_state.vue
index 36b9b647af7..563fa6c96fb 100644
--- a/app/assets/javascripts/environments/components/empty_state.vue
+++ b/app/assets/javascripts/environments/components/empty_state.vue
@@ -1,4 +1,7 @@
<script>
+import { s__ } from '~/locale';
+import { ENVIRONMENTS_SCOPE } from '../constants';
+
export default {
name: 'EnvironmentsEmptyState',
props: {
@@ -6,6 +9,25 @@ export default {
type: String,
required: true,
},
+ scope: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ title() {
+ return this.$options.i18n.title[this.scope];
+ },
+ },
+ i18n: {
+ title: {
+ [ENVIRONMENTS_SCOPE.AVAILABLE]: s__("Environments|You don't have any environments."),
+ [ENVIRONMENTS_SCOPE.STOPPED]: s__("Environments|You don't have any stopped environments."),
+ },
+ content: s__(
+ 'Environments|Environments are places where code gets deployed, such as staging or production.',
+ ),
+ link: s__('Environments|How do I create an environment?'),
},
};
</script>
@@ -13,14 +35,11 @@ export default {
<div class="empty-state">
<div class="text-content">
<h4 class="js-blank-state-title">
- {{ s__("Environments|You don't have any environments right now") }}
+ {{ title }}
</h4>
<p>
- {{
- s__(`Environments|Environments are places where
- code gets deployed, such as staging or production.`)
- }}
- <a :href="helpPath"> {{ s__('Environments|More information') }} </a>
+ {{ $options.i18n.content }}
+ <a :href="helpPath"> {{ $options.i18n.link }} </a>
</p>
</div>
</div>
diff --git a/app/assets/javascripts/environments/components/environment_item.vue b/app/assets/javascripts/environments/components/environment_item.vue
index cfe35d26b94..7ffe8140a21 100644
--- a/app/assets/javascripts/environments/components/environment_item.vue
+++ b/app/assets/javascripts/environments/components/environment_item.vue
@@ -1,12 +1,20 @@
<script>
-import { GlDropdown, GlTooltipDirective, GlIcon, GlLink, GlSprintf, GlBadge } from '@gitlab/ui';
+import {
+ GlDropdown,
+ GlTooltipDirective,
+ GlIcon,
+ GlLink,
+ GlSprintf,
+ GlBadge,
+ GlAvatar,
+ GlAvatarLink,
+} from '@gitlab/ui';
import { isEmpty } from 'lodash';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { __, s__, sprintf } from '~/locale';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import CommitComponent from '~/vue_shared/components/commit.vue';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
-import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import timeagoMixin from '~/vue_shared/mixins/timeago';
import eventHub from '../event_hub';
import ActionsComponent from './environment_actions.vue';
@@ -41,7 +49,8 @@ export default {
StopComponent,
TerminalButtonComponent,
TooltipOnTruncate,
- UserAvatarLink,
+ GlAvatar,
+ GlAvatarLink,
CiIcon,
},
directives: {
@@ -649,22 +658,27 @@ export default {
class="table-section deployment-column d-none d-md-block"
:class="tableData.deploy.spacing"
role="gridcell"
- data-testid="enviornment-deployment-id-cell"
+ data-testid="environment-deployment-id-cell"
>
<span v-if="shouldRenderDeploymentID" class="text-break-word">
{{ deploymentInternalId }}
</span>
- <span v-if="!isFolder && deploymentHasUser" class="text-break-word">
+ <span
+ v-if="!isFolder && deploymentHasUser"
+ class="text-break-word gl-display-inline-flex gl-align-items-center"
+ >
<gl-sprintf :message="s__('Environments|by %{avatar}')">
<template #avatar>
- <user-avatar-link
- :link-href="deploymentUser.web_url"
- :img-src="deploymentUser.avatar_url"
- :img-alt="userImageAltDescription"
- :tooltip-text="deploymentUser.username"
- class="js-deploy-user-container float-none"
- />
+ <gl-avatar-link :href="deploymentUser.web_url" class="gl-ml-2">
+ <gl-avatar
+ :src="deploymentUser.avatar_url"
+ :entity-name="deploymentUser.username"
+ :title="deploymentUser.username"
+ :alt="userImageAltDescription"
+ :size="24"
+ />
+ </gl-avatar-link>
</template>
</gl-sprintf>
</span>
@@ -753,20 +767,24 @@ export default {
<ci-icon class="gl-mr-2" :status="upcomingDeployment.deployable.status" />
</gl-link>
</div>
- <div class="gl-display-flex">
- <span v-if="upcomingDeployment.user" class="text-break-word">
- <gl-sprintf :message="s__('Environments|by %{avatar}')">
- <template #avatar>
- <user-avatar-link
- :link-href="upcomingDeployment.user.web_url"
- :img-src="upcomingDeployment.user.avatar_url"
- :img-alt="upcomingDeploymentUserImageAltDescription"
- :tooltip-text="upcomingDeployment.user.username"
+ <span
+ v-if="upcomingDeployment.user"
+ class="text-break-word gl-display-inline-flex gl-align-items-center gl-mt-2"
+ >
+ <gl-sprintf :message="s__('Environments|by %{avatar}')">
+ <template #avatar>
+ <gl-avatar-link :href="upcomingDeployment.user.web_url" class="gl-ml-2">
+ <gl-avatar
+ :src="upcomingDeployment.user.avatar_url"
+ :alt="upcomingDeploymentUserImageAltDescription"
+ :entity-name="upcomingDeployment.user.username"
+ :title="upcomingDeployment.user.username"
+ :size="24"
/>
- </template>
- </gl-sprintf>
- </span>
- </div>
+ </gl-avatar-link>
+ </template>
+ </gl-sprintf>
+ </span>
</div>
</div>
diff --git a/app/assets/javascripts/environments/components/environments_app.vue b/app/assets/javascripts/environments/components/environments_app.vue
index c7008c03099..f44182e822b 100644
--- a/app/assets/javascripts/environments/components/environments_app.vue
+++ b/app/assets/javascripts/environments/components/environments_app.vue
@@ -253,7 +253,7 @@ export default {
@change="resetPolling"
/>
</template>
- <empty-state v-else :help-path="helpPagePath" />
+ <empty-state v-else :help-path="helpPagePath" :scope="scope" />
<gl-pagination
align="center"
:total-items="totalItems"
diff --git a/app/assets/javascripts/environments/components/new_environment_item.vue b/app/assets/javascripts/environments/components/new_environment_item.vue
index f35fabccae7..f5e9d612316 100644
--- a/app/assets/javascripts/environments/components/new_environment_item.vue
+++ b/app/assets/javascripts/environments/components/new_environment_item.vue
@@ -2,6 +2,7 @@
import {
GlCollapse,
GlDropdown,
+ GlBadge,
GlButton,
GlLink,
GlSprintf,
@@ -26,6 +27,7 @@ export default {
components: {
GlCollapse,
GlDropdown,
+ GlBadge,
GlButton,
GlLink,
GlSprintf,
@@ -74,6 +76,7 @@ export default {
'Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}',
),
autoStopIn: s__('Environment|Auto stop %{time}'),
+ tierTooltip: s__('Environment|Deployment tier'),
},
data() {
return { visible: false };
@@ -100,6 +103,9 @@ export default {
hasDeployment() {
return Boolean(this.environment?.upcomingDeployment || this.environment?.lastDeployment);
},
+ tier() {
+ return this.lastDeployment?.tierInYaml;
+ },
hasOpenedAlert() {
return this.environment?.hasOpenedAlert;
},
@@ -206,6 +212,13 @@ export default {
>
{{ displayName }}
</gl-link>
+ <gl-badge
+ v-if="tier"
+ v-gl-tooltip
+ :title="$options.i18n.tierTooltip"
+ class="gl-ml-3 gl-font-monospace"
+ >{{ tier }}</gl-badge
+ >
</div>
<div class="gl-display-flex gl-align-items-center">
<p v-if="canShowAutoStopDate" class="gl-font-sm gl-text-gray-700 gl-mr-5 gl-mb-0">
diff --git a/app/assets/javascripts/environments/folder/environments_folder_bundle.js b/app/assets/javascripts/environments/folder/environments_folder_bundle.js
index 206381e0b7e..4e5fe511f8a 100644
--- a/app/assets/javascripts/environments/folder/environments_folder_bundle.js
+++ b/app/assets/javascripts/environments/folder/environments_folder_bundle.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
-import Translate from '../../vue_shared/translate';
+import Translate from '~/vue_shared/translate';
import environmentsFolderApp from './environments_folder_view.vue';
Vue.use(Translate);
diff --git a/app/assets/javascripts/environments/graphql/resolvers.js b/app/assets/javascripts/environments/graphql/resolvers.js
index a7866c1e778..722bb78bcf9 100644
--- a/app/assets/javascripts/environments/graphql/resolvers.js
+++ b/app/assets/javascripts/environments/graphql/resolvers.js
@@ -24,7 +24,7 @@ const mapNestedEnvironment = (env) => ({
__typename: 'NestedLocalEnvironment',
});
const mapEnvironment = (env) => ({
- ...convertObjectPropsToCamelCase(env),
+ ...convertObjectPropsToCamelCase(env, { deep: true }),
__typename: 'LocalEnvironment',
});
diff --git a/app/assets/javascripts/environments/mixins/environments_mixin.js b/app/assets/javascripts/environments/mixins/environments_mixin.js
index 0f9741784d6..8957a3074ed 100644
--- a/app/assets/javascripts/environments/mixins/environments_mixin.js
+++ b/app/assets/javascripts/environments/mixins/environments_mixin.js
@@ -4,11 +4,11 @@
import { isEqual, isFunction, omitBy } from 'lodash';
import Visibility from 'visibilityjs';
import createFlash from '~/flash';
-import Poll from '../../lib/utils/poll';
-import { getParameterByName } from '../../lib/utils/url_utility';
-import { s__, __ } from '../../locale';
-import tabs from '../../vue_shared/components/navigation_tabs.vue';
-import tablePagination from '../../vue_shared/components/pagination/table_pagination.vue';
+import Poll from '~/lib/utils/poll';
+import { getParameterByName } from '~/lib/utils/url_utility';
+import { s__, __ } from '~/locale';
+import tabs from '~/vue_shared/components/navigation_tabs.vue';
+import tablePagination from '~/vue_shared/components/pagination/table_pagination.vue';
import container from '../components/container.vue';
import environmentTable from '../components/environments_table.vue';
import eventHub from '../event_hub';
diff --git a/app/assets/javascripts/environments/mixins/environments_pagination_api_mixin.js b/app/assets/javascripts/environments/mixins/environments_pagination_api_mixin.js
index a76c8e445ed..55e2536e283 100644
--- a/app/assets/javascripts/environments/mixins/environments_pagination_api_mixin.js
+++ b/app/assets/javascripts/environments/mixins/environments_pagination_api_mixin.js
@@ -4,7 +4,7 @@
* Components need to have `scope`, `page` and `requestData`
*/
import { validateParams } from '~/pipelines/utils';
-import { historyPushState, buildUrlWithCurrentLocation } from '../../lib/utils/common_utils';
+import { historyPushState, buildUrlWithCurrentLocation } from '~/lib/utils/common_utils';
export default {
methods: {
diff --git a/app/assets/javascripts/feature_highlight/feature_highlight_helper.js b/app/assets/javascripts/feature_highlight/feature_highlight_helper.js
index 747f368b671..b26a96499ba 100644
--- a/app/assets/javascripts/feature_highlight/feature_highlight_helper.js
+++ b/app/assets/javascripts/feature_highlight/feature_highlight_helper.js
@@ -1,6 +1,6 @@
import createFlash from '~/flash';
-import axios from '../lib/utils/axios_utils';
-import { __ } from '../locale';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
export const getSelector = (highlightId) => `.js-feature-highlight[data-highlight=${highlightId}]`;
diff --git a/app/assets/javascripts/filtered_search/services/recent_searches_service.js b/app/assets/javascripts/filtered_search/services/recent_searches_service.js
index c3514198ad9..c147dd20c84 100644
--- a/app/assets/javascripts/filtered_search/services/recent_searches_service.js
+++ b/app/assets/javascripts/filtered_search/services/recent_searches_service.js
@@ -1,4 +1,4 @@
-import AccessorUtilities from '../../lib/utils/accessor';
+import AccessorUtilities from '~/lib/utils/accessor';
import RecentSearchesServiceError from './recent_searches_service_error';
class RecentSearchesService {
diff --git a/app/assets/javascripts/flash.js b/app/assets/javascripts/flash.js
index fa605f8c056..24ec16bf20e 100644
--- a/app/assets/javascripts/flash.js
+++ b/app/assets/javascripts/flash.js
@@ -94,10 +94,10 @@ const addDismissFlashClickListener = (flashEl, fadeTransition) => {
*
* 1. Render a new alert
*
- * import { createAlert, ALERT_VARIANTS } from '~/flash';
+ * import { createAlert, VARIANT_WARNING } from '~/flash';
*
* createAlert({ message: 'My error message' });
- * createAlert({ message: 'My warning message', variant: ALERT_VARIANTS.WARNING });
+ * createAlert({ message: 'My warning message', variant: VARIANT_WARNING });
*
* 2. Dismiss this alert programmatically
*
diff --git a/app/assets/javascripts/google_cloud/components/app.vue b/app/assets/javascripts/google_cloud/components/app.vue
index 03b256297f6..b3d773e6bee 100644
--- a/app/assets/javascripts/google_cloud/components/app.vue
+++ b/app/assets/javascripts/google_cloud/components/app.vue
@@ -45,7 +45,7 @@ export default {
},
methods: {
feedbackUrl(template) {
- return `https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/meta/-/issues/new?issuable_template=${template}`;
+ return `https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/feedback/-/issues/new?issuable_template=${template}`;
},
},
};
diff --git a/app/assets/javascripts/google_tag_manager/index.js b/app/assets/javascripts/google_tag_manager/index.js
index f42152006d2..a44a5b30e1e 100644
--- a/app/assets/javascripts/google_tag_manager/index.js
+++ b/app/assets/javascripts/google_tag_manager/index.js
@@ -232,35 +232,40 @@ export const trackTransaction = (transactionDetails) => {
pushEnhancedEcommerceEvent('EECtransactionSuccess', eventData);
};
-export const trackAddToCartUsageTab = () => {
+export const pushEECproductAddToCartEvent = () => {
if (!isSupported()) {
return;
}
- const getStartedButton = document.querySelector('.js-buy-additional-minutes');
- getStartedButton.addEventListener('click', () => {
- window.dataLayer.push({
- event: 'EECproductAddToCart',
- ecommerce: {
- currencyCode: 'USD',
- add: {
- products: [
- {
- name: 'CI/CD Minutes',
- id: '0003',
- price: '10',
- brand: 'GitLab',
- category: 'DevOps',
- variant: 'add-on',
- quantity: 1,
- },
- ],
- },
+ window.dataLayer.push({
+ event: 'EECproductAddToCart',
+ ecommerce: {
+ currencyCode: 'USD',
+ add: {
+ products: [
+ {
+ name: 'CI/CD Minutes',
+ id: '0003',
+ price: '10',
+ brand: 'GitLab',
+ category: 'DevOps',
+ variant: 'add-on',
+ quantity: 1,
+ },
+ ],
},
- });
+ },
});
};
+export const trackAddToCartUsageTab = () => {
+ const getStartedButton = document.querySelector('.js-buy-additional-minutes');
+ if (!getStartedButton) {
+ return;
+ }
+ getStartedButton.addEventListener('click', pushEECproductAddToCartEvent);
+};
+
export const trackCombinedGroupProjectForm = () => {
if (!isSupported()) {
return;
diff --git a/app/assets/javascripts/graphql_shared/constants.js b/app/assets/javascripts/graphql_shared/constants.js
index 4ebb49b4756..22fa2912881 100644
--- a/app/assets/javascripts/graphql_shared/constants.js
+++ b/app/assets/javascripts/graphql_shared/constants.js
@@ -3,6 +3,7 @@ export const MINIMUM_SEARCH_LENGTH = 3;
export const TYPE_BOARD = 'Board';
export const TYPE_CI_RUNNER = 'Ci::Runner';
export const TYPE_CRM_CONTACT = 'CustomerRelations::Contact';
+export const TYPE_CRM_ORGANIZATION = 'CustomerRelations::Organization';
export const TYPE_DISCUSSION = 'Discussion';
export const TYPE_EPIC = 'Epic';
export const TYPE_EPIC_BOARD = 'Boards::EpicBoard';
@@ -19,3 +20,4 @@ export const TYPE_SCANNER_PROFILE = 'DastScannerProfile';
export const TYPE_SITE_PROFILE = 'DastSiteProfile';
export const TYPE_USER = 'User';
export const TYPE_VULNERABILITY = 'Vulnerability';
+export const TYPE_WORK_ITEM = 'WorkItem';
diff --git a/app/assets/javascripts/graphql_shared/fragments/pageInfo.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/page_info.fragment.graphql
index e6f5d7db11a..e6f5d7db11a 100644
--- a/app/assets/javascripts/graphql_shared/fragments/pageInfo.fragment.graphql
+++ b/app/assets/javascripts/graphql_shared/fragments/page_info.fragment.graphql
diff --git a/app/assets/javascripts/graphql_shared/fragments/pageInfoCursorsOnly.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/page_info_cursors_only.fragment.graphql
index 22bcefbecd3..22bcefbecd3 100644
--- a/app/assets/javascripts/graphql_shared/fragments/pageInfoCursorsOnly.fragment.graphql
+++ b/app/assets/javascripts/graphql_shared/fragments/page_info_cursors_only.fragment.graphql
diff --git a/app/assets/javascripts/graphql_shared/possibleTypes.json b/app/assets/javascripts/graphql_shared/possibleTypes.json
deleted file mode 100644
index 01116067887..00000000000
--- a/app/assets/javascripts/graphql_shared/possibleTypes.json
+++ /dev/null
@@ -1 +0,0 @@
-{"AlertManagementIntegration":["AlertManagementHttpIntegration","AlertManagementPrometheusIntegration"],"CurrentUserTodos":["BoardEpic","Design","Epic","EpicIssue","Issue","MergeRequest"],"DependencyLinkMetadata":["NugetDependencyLinkMetadata"],"DesignFields":["Design","DesignAtVersion"],"Entry":["Blob","Submodule","TreeEntry"],"Eventable":["BoardEpic","Epic"],"Issuable":["Epic","Issue","MergeRequest","WorkItem"],"JobNeedUnion":["CiBuildNeed","CiJob"],"MemberInterface":["GroupMember","ProjectMember"],"NoteableInterface":["AlertManagementAlert","BoardEpic","Design","Epic","EpicIssue","Issue","MergeRequest","Snippet","Vulnerability"],"NoteableType":["Design","Issue","MergeRequest"],"OrchestrationPolicy":["ScanExecutionPolicy","ScanResultPolicy"],"PackageFileMetadata":["ConanFileMetadata","HelmFileMetadata"],"PackageMetadata":["ComposerMetadata","ConanMetadata","MavenMetadata","NugetMetadata","PypiMetadata"],"ResolvableInterface":["Discussion","Note"],"Service":["BaseService","JiraService"],"TimeboxReportInterface":["Iteration","Milestone"],"Todoable":["AlertManagementAlert","BoardEpic","Commit","Design","Epic","EpicIssue","Issue","MergeRequest"],"User":["MergeRequestAssignee","MergeRequestAuthor","MergeRequestParticipant","MergeRequestReviewer","UserCore"],"VulnerabilityDetail":["VulnerabilityDetailBase","VulnerabilityDetailBoolean","VulnerabilityDetailCode","VulnerabilityDetailCommit","VulnerabilityDetailDiff","VulnerabilityDetailFileLocation","VulnerabilityDetailInt","VulnerabilityDetailList","VulnerabilityDetailMarkdown","VulnerabilityDetailModuleLocation","VulnerabilityDetailTable","VulnerabilityDetailText","VulnerabilityDetailUrl"],"VulnerabilityLocation":["VulnerabilityLocationClusterImageScanning","VulnerabilityLocationContainerScanning","VulnerabilityLocationCoverageFuzzing","VulnerabilityLocationDast","VulnerabilityLocationDependencyScanning","VulnerabilityLocationGeneric","VulnerabilityLocationSast","VulnerabilityLocationSecretDetection"]} \ No newline at end of file
diff --git a/app/assets/javascripts/graphql_shared/possible_types.json b/app/assets/javascripts/graphql_shared/possible_types.json
new file mode 100644
index 00000000000..3d6360fc4f8
--- /dev/null
+++ b/app/assets/javascripts/graphql_shared/possible_types.json
@@ -0,0 +1,129 @@
+{
+ "AlertManagementIntegration": [
+ "AlertManagementHttpIntegration",
+ "AlertManagementPrometheusIntegration"
+ ],
+ "CurrentUserTodos": [
+ "BoardEpic",
+ "Design",
+ "Epic",
+ "EpicIssue",
+ "Issue",
+ "MergeRequest"
+ ],
+ "DependencyLinkMetadata": [
+ "NugetDependencyLinkMetadata"
+ ],
+ "DesignFields": [
+ "Design",
+ "DesignAtVersion"
+ ],
+ "Entry": [
+ "Blob",
+ "Submodule",
+ "TreeEntry"
+ ],
+ "Eventable": [
+ "BoardEpic",
+ "Epic"
+ ],
+ "Issuable": [
+ "Epic",
+ "Issue",
+ "MergeRequest",
+ "WorkItem"
+ ],
+ "JobNeedUnion": [
+ "CiBuildNeed",
+ "CiJob"
+ ],
+ "MemberInterface": [
+ "GroupMember",
+ "ProjectMember"
+ ],
+ "NoteableInterface": [
+ "AlertManagementAlert",
+ "BoardEpic",
+ "Design",
+ "Epic",
+ "EpicIssue",
+ "Issue",
+ "MergeRequest",
+ "Snippet",
+ "Vulnerability"
+ ],
+ "NoteableType": [
+ "Design",
+ "Issue",
+ "MergeRequest"
+ ],
+ "OrchestrationPolicy": [
+ "ScanExecutionPolicy",
+ "ScanResultPolicy"
+ ],
+ "PackageFileMetadata": [
+ "ConanFileMetadata",
+ "HelmFileMetadata"
+ ],
+ "PackageMetadata": [
+ "ComposerMetadata",
+ "ConanMetadata",
+ "MavenMetadata",
+ "NugetMetadata",
+ "PypiMetadata"
+ ],
+ "ResolvableInterface": [
+ "Discussion",
+ "Note"
+ ],
+ "Service": [
+ "BaseService",
+ "JiraService"
+ ],
+ "TimeboxReportInterface": [
+ "Iteration",
+ "Milestone"
+ ],
+ "Todoable": [
+ "AlertManagementAlert",
+ "BoardEpic",
+ "Commit",
+ "Design",
+ "Epic",
+ "EpicIssue",
+ "Issue",
+ "MergeRequest"
+ ],
+ "User": [
+ "MergeRequestAssignee",
+ "MergeRequestAuthor",
+ "MergeRequestParticipant",
+ "MergeRequestReviewer",
+ "UserCore"
+ ],
+ "VulnerabilityDetail": [
+ "VulnerabilityDetailBase",
+ "VulnerabilityDetailBoolean",
+ "VulnerabilityDetailCode",
+ "VulnerabilityDetailCommit",
+ "VulnerabilityDetailDiff",
+ "VulnerabilityDetailFileLocation",
+ "VulnerabilityDetailInt",
+ "VulnerabilityDetailList",
+ "VulnerabilityDetailMarkdown",
+ "VulnerabilityDetailModuleLocation",
+ "VulnerabilityDetailTable",
+ "VulnerabilityDetailText",
+ "VulnerabilityDetailUrl"
+ ],
+ "VulnerabilityLocation": [
+ "VulnerabilityLocationClusterImageScanning",
+ "VulnerabilityLocationContainerScanning",
+ "VulnerabilityLocationCoverageFuzzing",
+ "VulnerabilityLocationDast",
+ "VulnerabilityLocationDependencyScanning",
+ "VulnerabilityLocationGeneric",
+ "VulnerabilityLocationSast",
+ "VulnerabilityLocationSecretDetection"
+ ]
+}
diff --git a/app/assets/javascripts/graphql_shared/queries/get_users_projects.query.graphql b/app/assets/javascripts/graphql_shared/queries/get_users_projects.query.graphql
index 58b7b4c898d..b59bd781537 100644
--- a/app/assets/javascripts/graphql_shared/queries/get_users_projects.query.graphql
+++ b/app/assets/javascripts/graphql_shared/queries/get_users_projects.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getProjects(
$search: String!
diff --git a/app/assets/javascripts/groups/components/group_folder.vue b/app/assets/javascripts/groups/components/group_folder.vue
index 5f169832ee4..042d818338a 100644
--- a/app/assets/javascripts/groups/components/group_folder.vue
+++ b/app/assets/javascripts/groups/components/group_folder.vue
@@ -1,6 +1,6 @@
<script>
import { GlIcon } from '@gitlab/ui';
-import { n__ } from '../../locale';
+import { n__ } from '~/locale';
import { MAX_CHILDREN_COUNT } from '../constants';
export default {
diff --git a/app/assets/javascripts/groups/components/group_item.vue b/app/assets/javascripts/groups/components/group_item.vue
index 707008ec493..4f21f68fa65 100644
--- a/app/assets/javascripts/groups/components/group_item.vue
+++ b/app/assets/javascripts/groups/components/group_item.vue
@@ -9,6 +9,7 @@ import {
} from '@gitlab/ui';
import { visitUrl } from '~/lib/utils/url_utility';
import UserAccessRoleBadge from '~/vue_shared/components/user_access_role_badge.vue';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
import { VISIBILITY_TYPE_ICON, GROUP_VISIBILITY_TYPE } from '../constants';
import eventHub from '../event_hub';
@@ -112,6 +113,7 @@ export default {
},
},
safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
@@ -131,7 +133,7 @@ export default {
>
<div class="folder-toggle-wrap gl-mr-2 d-flex align-items-center">
<item-caret :is-group-open="group.isOpen" />
- <item-type-icon :item-type="group.type" :is-group-open="group.isOpen" />
+ <item-type-icon :item-type="group.type" />
</div>
<gl-loading-icon
v-if="group.isChildrenLoading"
@@ -145,7 +147,7 @@ export default {
:aria-label="group.name"
>
<gl-avatar
- shape="rect"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
:entity-name="group.name"
:src="group.avatarUrl"
:alt="group.name"
diff --git a/app/assets/javascripts/groups/components/groups.vue b/app/assets/javascripts/groups/components/groups.vue
index 18a6d487703..313c8dadd1f 100644
--- a/app/assets/javascripts/groups/components/groups.vue
+++ b/app/assets/javascripts/groups/components/groups.vue
@@ -1,6 +1,6 @@
<script>
import PaginationLinks from '~/vue_shared/components/pagination_links.vue';
-import { getParameterByName } from '../../lib/utils/url_utility';
+import { getParameterByName } from '~/lib/utils/url_utility';
import eventHub from '../event_hub';
export default {
diff --git a/app/assets/javascripts/groups/components/item_stats.vue b/app/assets/javascripts/groups/components/item_stats.vue
index 3620c884c5f..2aa812250a0 100644
--- a/app/assets/javascripts/groups/components/item_stats.vue
+++ b/app/assets/javascripts/groups/components/item_stats.vue
@@ -55,7 +55,7 @@ export default {
:title="__('Subgroups')"
:value="item.subgroupCount"
css-class="number-subgroups gl-ml-5"
- icon-name="folder-o"
+ icon-name="subgroup"
data-testid="subgroups-count"
/>
<item-stats-value
@@ -63,7 +63,7 @@ export default {
:title="__('Projects')"
:value="item.projectCount"
css-class="number-projects gl-ml-5"
- icon-name="bookmark"
+ icon-name="project"
data-testid="projects-count"
/>
<item-stats-value
diff --git a/app/assets/javascripts/groups/components/item_type_icon.vue b/app/assets/javascripts/groups/components/item_type_icon.vue
index c3787c2df21..7821e604700 100644
--- a/app/assets/javascripts/groups/components/item_type_icon.vue
+++ b/app/assets/javascripts/groups/components/item_type_icon.vue
@@ -11,18 +11,13 @@ export default {
type: String,
required: true,
},
- isGroupOpen: {
- type: Boolean,
- required: true,
- default: false,
- },
},
computed: {
iconClass() {
if (this.itemType === ITEM_TYPE.GROUP) {
- return this.isGroupOpen ? 'folder-open' : 'folder-o';
+ return 'subgroup';
}
- return 'bookmark';
+ return 'project';
},
},
};
diff --git a/app/assets/javascripts/groups/constants.js b/app/assets/javascripts/groups/constants.js
index 005bac1e7b5..cacba2dfd23 100644
--- a/app/assets/javascripts/groups/constants.js
+++ b/app/assets/javascripts/groups/constants.js
@@ -1,4 +1,4 @@
-import { __, s__ } from '../locale';
+import { __, s__ } from '~/locale';
export const MAX_CHILDREN_COUNT = 20;
diff --git a/app/assets/javascripts/header.js b/app/assets/javascripts/header.js
index c2ef6414716..360a8d3bf8d 100644
--- a/app/assets/javascripts/header.js
+++ b/app/assets/javascripts/header.js
@@ -95,15 +95,10 @@ function trackShowUserDropdownLink(trackEvent, elToTrack, el) {
export function initNavUserDropdownTracking() {
const el = document.querySelector('.js-nav-user-dropdown');
const buyEl = document.querySelector('.js-buy-pipeline-minutes-link');
- const upgradeEl = document.querySelector('.js-upgrade-plan-link');
if (el && buyEl) {
trackShowUserDropdownLink('show_buy_ci_minutes', buyEl, el);
}
-
- if (el && upgradeEl) {
- trackShowUserDropdownLink('show_upgrade_link', upgradeEl, el);
- }
}
requestIdleCallback(initStatusTriggers);
diff --git a/app/assets/javascripts/header_search/components/app.vue b/app/assets/javascripts/header_search/components/app.vue
index 36fc48a2ba8..4406cacdf3f 100644
--- a/app/assets/javascripts/header_search/components/app.vue
+++ b/app/assets/javascripts/header_search/components/app.vue
@@ -11,6 +11,7 @@ import {
SEARCH_BOX_INDEX,
SEARCH_INPUT_DESCRIPTION,
SEARCH_RESULTS_DESCRIPTION,
+ SEARCH_SHORTCUTS_MIN_CHARACTERS,
} from '../constants';
import HeaderSearchAutocompleteItems from './header_search_autocomplete_items.vue';
import HeaderSearchDefaultItems from './header_search_default_items.vue';
@@ -50,7 +51,7 @@ export default {
},
computed: {
...mapState(['search', 'loading']),
- ...mapGetters(['searchQuery', 'searchOptions']),
+ ...mapGetters(['searchQuery', 'searchOptions', 'autocompleteGroupedSearchOptions']),
searchText: {
get() {
return this.search;
@@ -66,14 +67,20 @@ export default {
return this.currentFocusedOption?.html_id;
},
isLoggedIn() {
- return gon?.current_username;
+ return Boolean(gon?.current_username);
},
showSearchDropdown() {
- return this.showDropdown && this.isLoggedIn;
+ const hasResultsUnderMinCharacters =
+ this.searchText?.length === 1 ? this?.autocompleteGroupedSearchOptions?.length > 0 : true;
+
+ return this.showDropdown && this.isLoggedIn && hasResultsUnderMinCharacters;
},
showDefaultItems() {
return !this.searchText;
},
+ showShortcuts() {
+ return this.searchText && this.searchText?.length >= SEARCH_SHORTCUTS_MIN_CHARACTERS;
+ },
defaultIndex() {
if (this.showDefaultItems) {
return SEARCH_BOX_INDEX;
@@ -105,6 +112,9 @@ export default {
count: this.searchOptions.length,
});
},
+ headerSearchActivityDescriptor() {
+ return this.showDropdown ? 'is-active' : 'is-not-active';
+ },
},
methods: {
...mapActions(['setSearch', 'fetchAutocompleteOptions', 'clearAutocomplete']),
@@ -136,13 +146,15 @@ export default {
v-outside="closeDropdown"
role="search"
:aria-label="$options.i18n.searchGitlab"
- class="header-search gl-relative"
+ class="header-search gl-relative gl-rounded-base"
+ :class="headerSearchActivityDescriptor"
>
<gl-search-box-by-type
id="search"
v-model="searchText"
role="searchbox"
class="gl-z-index-1"
+ data-qa-selector="search_term_field"
autocomplete="off"
:placeholder="$options.i18n.searchGitlab"
:aria-activedescendant="currentFocusedId"
@@ -182,7 +194,10 @@ export default {
:current-focused-option="currentFocusedOption"
/>
<template v-else>
- <header-search-scoped-items :current-focused-option="currentFocusedOption" />
+ <header-search-scoped-items
+ v-if="showShortcuts"
+ :current-focused-option="currentFocusedOption"
+ />
<header-search-autocomplete-items :current-focused-option="currentFocusedOption" />
</template>
</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
index c0e2c18bece..025c48f355d 100644
--- a/app/assets/javascripts/header_search/components/header_search_autocomplete_items.vue
+++ b/app/assets/javascripts/header_search/components/header_search_autocomplete_items.vue
@@ -11,7 +11,18 @@ import {
import { mapState, mapGetters } from 'vuex';
import { s__ } from '~/locale';
import highlight from '~/lib/utils/highlight';
-import { GROUPS_CATEGORY, PROJECTS_CATEGORY, LARGE_AVATAR_PX, SMALL_AVATAR_PX } from '../constants';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
+import { truncateNamespace } from '~/lib/utils/text_utility';
+
+import {
+ GROUPS_CATEGORY,
+ PROJECTS_CATEGORY,
+ MERGE_REQUEST_CATEGORY,
+ ISSUES_CATEGORY,
+ RECENT_EPICS_CATEGORY,
+ LARGE_AVATAR_PX,
+ SMALL_AVATAR_PX,
+} from '../constants';
export default {
name: 'HeaderSearchAutocompleteItems',
@@ -39,7 +50,7 @@ export default {
},
},
computed: {
- ...mapState(['search', 'loading', 'autocompleteError']),
+ ...mapState(['search', 'loading', 'autocompleteError', 'searchContext']),
...mapGetters(['autocompleteGroupedSearchOptions']),
},
watch: {
@@ -52,6 +63,13 @@ export default {
},
},
methods: {
+ truncateNamespace(string) {
+ if (string.split(' / ').length > 2) {
+ return truncateNamespace(string);
+ }
+
+ return string;
+ },
highlightedName(val) {
return highlight(val, this.search);
},
@@ -65,15 +83,45 @@ export default {
isOptionFocused(data) {
return this.currentFocusedOption?.html_id === data.html_id;
},
+ isProjectsCategory(data) {
+ return data.category === PROJECTS_CATEGORY;
+ },
+ getEntityId(data) {
+ switch (data.category) {
+ case GROUPS_CATEGORY:
+ case RECENT_EPICS_CATEGORY:
+ return data.group_id || data.id || this.searchContext?.group?.id;
+ case PROJECTS_CATEGORY:
+ case ISSUES_CATEGORY:
+ case MERGE_REQUEST_CATEGORY:
+ return data.project_id || data.id || this.searchContext?.project?.id;
+ default:
+ return data.id;
+ }
+ },
+ getEntitytName(data) {
+ switch (data.category) {
+ case GROUPS_CATEGORY:
+ case RECENT_EPICS_CATEGORY:
+ return data.group_name || data.value || data.label || this.searchContext?.group?.name;
+ case PROJECTS_CATEGORY:
+ case ISSUES_CATEGORY:
+ case MERGE_REQUEST_CATEGORY:
+ return data.project_name || data.value || data.label || this.searchContext?.project?.name;
+ default:
+ return data.label;
+ }
+ },
},
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
<template>
<div>
<template v-if="!loading">
- <div v-for="option in autocompleteGroupedSearchOptions" :key="option.category">
- <gl-dropdown-divider />
+ <div v-for="(option, index) in autocompleteGroupedSearchOptions" :key="option.category">
+ <gl-dropdown-divider v-if="index > 0" />
<gl-dropdown-section-header>{{ option.category }}</gl-dropdown-section-header>
<gl-dropdown-item
v-for="data in option.data"
@@ -90,12 +138,22 @@ export default {
<gl-avatar
v-if="data.avatar_url !== undefined"
:src="data.avatar_url"
- :entity-id="data.id"
- :entity-name="data.label"
+ :entity-id="getEntityId(data)"
+ :entity-name="getEntitytName(data)"
:size="avatarSize(data)"
- shape="square"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
/>
- <span v-safe-html="highlightedName(data.label)"></span>
+ <span class="gl-display-flex gl-flex-direction-column">
+ <span
+ v-safe-html="highlightedName(data.value || data.label)"
+ class="gl-text-gray-900"
+ ></span>
+ <span
+ v-if="data.value"
+ v-safe-html="truncateNamespace(data.label)"
+ class="gl-font-sm gl-text-gray-500"
+ ></span>
+ </span>
</div>
</gl-dropdown-item>
</div>
diff --git a/app/assets/javascripts/header_search/components/header_search_scoped_items.vue b/app/assets/javascripts/header_search/components/header_search_scoped_items.vue
index 3aebee71509..34d1bd71399 100644
--- a/app/assets/javascripts/header_search/components/header_search_scoped_items.vue
+++ b/app/assets/javascripts/header_search/components/header_search_scoped_items.vue
@@ -1,5 +1,5 @@
<script>
-import { GlDropdownItem } from '@gitlab/ui';
+import { GlDropdownItem, GlDropdownDivider } from '@gitlab/ui';
import { mapState, mapGetters } from 'vuex';
import { __, sprintf } from '~/locale';
@@ -7,6 +7,7 @@ export default {
name: 'HeaderSearchScopedItems',
components: {
GlDropdownItem,
+ GlDropdownDivider,
},
props: {
currentFocusedOption: {
@@ -17,7 +18,7 @@ export default {
},
computed: {
...mapState(['search']),
- ...mapGetters(['scopedSearchOptions']),
+ ...mapGetters(['scopedSearchOptions', 'autocompleteGroupedSearchOptions']),
},
methods: {
isOptionFocused(option) {
@@ -53,5 +54,6 @@ export default {
<span v-if="option.scope" class="gl-font-style-italic">{{ option.scope }}</span>
</span>
</gl-dropdown-item>
+ <gl-dropdown-divider v-if="autocompleteGroupedSearchOptions.length > 0" />
</div>
</template>
diff --git a/app/assets/javascripts/header_search/constants.js b/app/assets/javascripts/header_search/constants.js
index b2e45fcd648..045a552efb0 100644
--- a/app/assets/javascripts/header_search/constants.js
+++ b/app/assets/javascripts/header_search/constants.js
@@ -20,6 +20,12 @@ export const GROUPS_CATEGORY = 'Groups';
export const PROJECTS_CATEGORY = 'Projects';
+export const ISSUES_CATEGORY = 'Recent issues';
+
+export const MERGE_REQUEST_CATEGORY = 'Recent merge requests';
+
+export const RECENT_EPICS_CATEGORY = 'Recent epics';
+
export const LARGE_AVATAR_PX = 32;
export const SMALL_AVATAR_PX = 16;
@@ -28,6 +34,8 @@ export const FIRST_DROPDOWN_INDEX = 0;
export const SEARCH_BOX_INDEX = -1;
+export const SEARCH_SHORTCUTS_MIN_CHARACTERS = 2;
+
export const SEARCH_INPUT_DESCRIPTION = 'search-input-description';
export const SEARCH_RESULTS_DESCRIPTION = 'search-results-description';
diff --git a/app/assets/javascripts/header_search/store/actions.js b/app/assets/javascripts/header_search/store/actions.js
index ee4c312fed0..3a86dcca409 100644
--- a/app/assets/javascripts/header_search/store/actions.js
+++ b/app/assets/javascripts/header_search/store/actions.js
@@ -5,7 +5,9 @@ export const fetchAutocompleteOptions = ({ commit, getters }) => {
commit(types.REQUEST_AUTOCOMPLETE);
return axios
.get(getters.autocompleteQuery)
- .then(({ data }) => commit(types.RECEIVE_AUTOCOMPLETE_SUCCESS, data))
+ .then(({ data }) => {
+ commit(types.RECEIVE_AUTOCOMPLETE_SUCCESS, data);
+ })
.catch(() => {
commit(types.RECEIVE_AUTOCOMPLETE_ERROR);
});
diff --git a/app/assets/javascripts/header_search/store/getters.js b/app/assets/javascripts/header_search/store/getters.js
index 87dec95153f..7d08aa859fb 100644
--- a/app/assets/javascripts/header_search/store/getters.js
+++ b/app/assets/javascripts/header_search/store/getters.js
@@ -190,7 +190,6 @@ export const autocompleteGroupedSearchOptions = (state) => {
results.push(groupedOptions[option.category]);
}
});
-
return results;
};
diff --git a/app/assets/javascripts/ide/components/commit_sidebar/form.vue b/app/assets/javascripts/ide/components/commit_sidebar/form.vue
index 44f543d9a76..38f3b094b7c 100644
--- a/app/assets/javascripts/ide/components/commit_sidebar/form.vue
+++ b/app/assets/javascripts/ide/components/commit_sidebar/form.vue
@@ -160,7 +160,7 @@ export default {
data-testid="begin-commit-button"
@click="beginCommit"
>
- {{ __('Commit…') }}
+ {{ __('Create commit...') }}
</gl-button>
</div>
<p class="text-center bold">{{ overviewText }}</p>
diff --git a/app/assets/javascripts/ide/components/commit_sidebar/message_field.vue b/app/assets/javascripts/ide/components/commit_sidebar/message_field.vue
index 8f0e5aef456..2799ea1378e 100644
--- a/app/assets/javascripts/ide/components/commit_sidebar/message_field.vue
+++ b/app/assets/javascripts/ide/components/commit_sidebar/message_field.vue
@@ -1,6 +1,6 @@
<script>
import { GlIcon, GlPopover } from '@gitlab/ui';
-import { __, sprintf } from '../../../locale';
+import { __, sprintf } from '~/locale';
import { MAX_TITLE_LENGTH, MAX_BODY_LENGTH } from '../../constants';
export default {
diff --git a/app/assets/javascripts/ide/components/ide.vue b/app/assets/javascripts/ide/components/ide.vue
index e345e5dc099..45bbf93ebc9 100644
--- a/app/assets/javascripts/ide/components/ide.vue
+++ b/app/assets/javascripts/ide/components/ide.vue
@@ -166,7 +166,7 @@ export default {
}}
</p>
<gl-button
- variant="success"
+ variant="confirm"
category="primary"
:title="__('New file')"
:aria-label="__('New file')"
diff --git a/app/assets/javascripts/ide/components/ide_status_bar.vue b/app/assets/javascripts/ide/components/ide_status_bar.vue
index 28ca1b6750f..32f87cb0a92 100644
--- a/app/assets/javascripts/ide/components/ide_status_bar.vue
+++ b/app/assets/javascripts/ide/components/ide_status_bar.vue
@@ -3,8 +3,8 @@
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { mapActions, mapState, mapGetters } from 'vuex';
import timeAgoMixin from '~/vue_shared/mixins/timeago';
-import CiIcon from '../../vue_shared/components/ci_icon.vue';
-import userAvatarImage from '../../vue_shared/components/user_avatar/user_avatar_image.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import userAvatarImage from '~/vue_shared/components/user_avatar/user_avatar_image.vue';
import { rightSidebarViews } from '../constants';
import IdeStatusList from './ide_status_list.vue';
import IdeStatusMr from './ide_status_mr.vue';
diff --git a/app/assets/javascripts/ide/components/jobs/detail.vue b/app/assets/javascripts/ide/components/jobs/detail.vue
index 55ae5501cdb..8d6a0b99e0c 100644
--- a/app/assets/javascripts/ide/components/jobs/detail.vue
+++ b/app/assets/javascripts/ide/components/jobs/detail.vue
@@ -2,7 +2,7 @@
import { GlTooltipDirective, GlButton, GlIcon, GlSafeHtmlDirective } from '@gitlab/ui';
import { throttle } from 'lodash';
import { mapActions, mapState } from 'vuex';
-import { __ } from '../../../locale';
+import { __ } from '~/locale';
import JobDescription from './detail/description.vue';
import ScrollButton from './detail/scroll_button.vue';
diff --git a/app/assets/javascripts/ide/components/jobs/detail/description.vue b/app/assets/javascripts/ide/components/jobs/detail/description.vue
index 9eaeabad5ef..8fd1973267c 100644
--- a/app/assets/javascripts/ide/components/jobs/detail/description.vue
+++ b/app/assets/javascripts/ide/components/jobs/detail/description.vue
@@ -1,6 +1,6 @@
<script>
import { GlIcon } from '@gitlab/ui';
-import CiIcon from '../../../../vue_shared/components/ci_icon.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
export default {
components: {
diff --git a/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue b/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue
index 6e1929a1948..bcbc68421c2 100644
--- a/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue
+++ b/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue
@@ -1,6 +1,6 @@
<script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
-import { __ } from '../../../../locale';
+import { __ } from '~/locale';
const directions = {
up: 'up',
diff --git a/app/assets/javascripts/ide/components/jobs/stage.vue b/app/assets/javascripts/ide/components/jobs/stage.vue
index 796ca1349c5..7797850f097 100644
--- a/app/assets/javascripts/ide/components/jobs/stage.vue
+++ b/app/assets/javascripts/ide/components/jobs/stage.vue
@@ -1,6 +1,6 @@
<script>
import { GlLoadingIcon, GlIcon, GlTooltipDirective, GlBadge } from '@gitlab/ui';
-import CiIcon from '../../../vue_shared/components/ci_icon.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
import Item from './item.vue';
export default {
diff --git a/app/assets/javascripts/ide/components/nav_dropdown_button.vue b/app/assets/javascripts/ide/components/nav_dropdown_button.vue
index 3699073adb8..6c26cde42e3 100644
--- a/app/assets/javascripts/ide/components/nav_dropdown_button.vue
+++ b/app/assets/javascripts/ide/components/nav_dropdown_button.vue
@@ -30,12 +30,12 @@ export default {
</script>
<template>
- <dropdown-button>
+ <dropdown-button class="gl-w-full!">
<span class="row gl-flex-nowrap">
<span class="col-auto flex-fill text-truncate">
<gl-icon :size="16" :aria-label="__('Current Branch')" name="branch" /> {{ branchLabel }}
</span>
- <span v-if="showMergeRequests" class="col-5 pl-0 text-truncate">
+ <span v-if="showMergeRequests" class="col-auto pl-0 text-truncate">
<gl-icon :size="16" :aria-label="__('Merge request')" name="merge-request" />
{{ mergeRequestLabel }}
</span>
diff --git a/app/assets/javascripts/ide/stores/actions/project.js b/app/assets/javascripts/ide/stores/actions/project.js
index 0ec808339fb..37a405e3fac 100644
--- a/app/assets/javascripts/ide/stores/actions/project.js
+++ b/app/assets/javascripts/ide/stores/actions/project.js
@@ -2,7 +2,7 @@ import { escape } from 'lodash';
import createFlash from '~/flash';
import { __, sprintf } from '~/locale';
import { logError } from '~/lib/logger';
-import api from '../../../api';
+import api from '~/api';
import service from '../../services';
import * as types from '../mutation_types';
diff --git a/app/assets/javascripts/ide/stores/actions/tree.js b/app/assets/javascripts/ide/stores/actions/tree.js
index f46d3cbe946..20d8dc3381d 100644
--- a/app/assets/javascripts/ide/stores/actions/tree.js
+++ b/app/assets/javascripts/ide/stores/actions/tree.js
@@ -5,7 +5,7 @@ import {
WEBIDE_MARK_FETCH_FILES_START,
} from '~/performance/constants';
import { performanceMarkAndMeasure } from '~/performance/utils';
-import { __ } from '../../../locale';
+import { __ } from '~/locale';
import { decorateFiles } from '../../lib/files';
import service from '../../services';
import * as types from '../mutation_types';
diff --git a/app/assets/javascripts/ide/stores/modules/commit/getters.js b/app/assets/javascripts/ide/stores/modules/commit/getters.js
index 05e3601f381..0e7254e67be 100644
--- a/app/assets/javascripts/ide/stores/modules/commit/getters.js
+++ b/app/assets/javascripts/ide/stores/modules/commit/getters.js
@@ -1,4 +1,4 @@
-import { __ } from '../../../../locale';
+import { __ } from '~/locale';
import { COMMIT_TO_NEW_BRANCH } from './constants';
const BRANCH_SUFFIX_COUNT = 5;
diff --git a/app/assets/javascripts/ide/stores/modules/merge_requests/actions.js b/app/assets/javascripts/ide/stores/modules/merge_requests/actions.js
index 8446b93d14a..3408245b245 100644
--- a/app/assets/javascripts/ide/stores/modules/merge_requests/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/merge_requests/actions.js
@@ -1,5 +1,5 @@
-import Api from '../../../../api';
-import { __ } from '../../../../locale';
+import Api from '~/api';
+import { __ } from '~/locale';
import { scopes } from './constants';
import * as types from './mutation_types';
diff --git a/app/assets/javascripts/ide/stores/modules/pipelines/actions.js b/app/assets/javascripts/ide/stores/modules/pipelines/actions.js
index 51872993f16..62476b7fc63 100644
--- a/app/assets/javascripts/ide/stores/modules/pipelines/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/pipelines/actions.js
@@ -1,8 +1,8 @@
import axios from 'axios';
import Visibility from 'visibilityjs';
-import httpStatus from '../../../../lib/utils/http_status';
-import Poll from '../../../../lib/utils/poll';
-import { __ } from '../../../../locale';
+import httpStatus from '~/lib/utils/http_status';
+import Poll from '~/lib/utils/poll';
+import { __ } from '~/locale';
import { rightSidebarViews } from '../../../constants';
import service from '../../../services';
import * as types from './mutation_types';
diff --git a/app/assets/javascripts/ide/stores/plugins/terminal.js b/app/assets/javascripts/ide/stores/plugins/terminal.js
index 94139d5bdf0..f7ed3075b0c 100644
--- a/app/assets/javascripts/ide/stores/plugins/terminal.js
+++ b/app/assets/javascripts/ide/stores/plugins/terminal.js
@@ -3,10 +3,10 @@ import terminalModule from '../modules/terminal';
function getPathsFromData(el) {
return {
- webTerminalSvgPath: el.dataset.eeWebTerminalSvgPath,
- webTerminalHelpPath: el.dataset.eeWebTerminalHelpPath,
- webTerminalConfigHelpPath: el.dataset.eeWebTerminalConfigHelpPath,
- webTerminalRunnersHelpPath: el.dataset.eeWebTerminalRunnersHelpPath,
+ webTerminalSvgPath: el.dataset.webTerminalSvgPath,
+ webTerminalHelpPath: el.dataset.webTerminalHelpPath,
+ webTerminalConfigHelpPath: el.dataset.webTerminalConfigHelpPath,
+ webTerminalRunnersHelpPath: el.dataset.webTerminalRunnersHelpPath,
};
}
diff --git a/app/assets/javascripts/image_diff/helpers/init_image_diff.js b/app/assets/javascripts/image_diff/helpers/init_image_diff.js
index 51168b94e6d..55e1d802201 100644
--- a/app/assets/javascripts/image_diff/helpers/init_image_diff.js
+++ b/app/assets/javascripts/image_diff/helpers/init_image_diff.js
@@ -1,4 +1,4 @@
-import ImageFile from '../../commit/image_file';
+import ImageFile from '~/commit/image_file';
import ImageDiff from '../image_diff';
import ReplacedImageDiff from '../replaced_image_diff';
diff --git a/app/assets/javascripts/import_entities/components/import_status.vue b/app/assets/javascripts/import_entities/components/import_status.vue
index cc6a057f587..9262a4e1e95 100644
--- a/app/assets/javascripts/import_entities/components/import_status.vue
+++ b/app/assets/javascripts/import_entities/components/import_status.vue
@@ -1,10 +1,66 @@
<script>
-import { GlIcon } from '@gitlab/ui';
-import STATUS_MAP from '../constants';
+import { GlAccordion, GlAccordionItem, GlBadge, GlIcon } from '@gitlab/ui';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { __, s__ } from '~/locale';
+import { STATUSES } from '../constants';
+
+const STATISTIC_ITEMS = {
+ diff_note: __('Diff notes'),
+ issue: __('Issues'),
+ label: __('Labels'),
+ milestone: __('Milestones'),
+ note: __('Notes'),
+ pull_request: s__('GithubImporter|Pull requests'),
+ pull_request_merged_by: s__('GithubImporter|PR mergers'),
+ pull_request_review: s__('GithubImporter|PR reviews'),
+ release: __('Releases'),
+};
+
+// support both camel case and snake case versions
+Object.assign(STATISTIC_ITEMS, convertObjectPropsToCamelCase(STATISTIC_ITEMS));
+
+const SCHEDULED_STATUS = {
+ icon: 'status-scheduled',
+ text: __('Pending'),
+ variant: 'muted',
+};
+
+const STATUS_MAP = {
+ [STATUSES.NONE]: {
+ icon: 'status-waiting',
+ text: __('Not started'),
+ variant: 'muted',
+ },
+ [STATUSES.SCHEDULING]: SCHEDULED_STATUS,
+ [STATUSES.SCHEDULED]: SCHEDULED_STATUS,
+ [STATUSES.CREATED]: SCHEDULED_STATUS,
+ [STATUSES.STARTED]: {
+ icon: 'status-running',
+ text: __('Importing...'),
+ variant: 'info',
+ },
+ [STATUSES.FAILED]: {
+ icon: 'status-failed',
+ text: __('Failed'),
+ variant: 'danger',
+ },
+ [STATUSES.CANCELLED]: {
+ icon: 'status-stopped',
+ text: __('Cancelled'),
+ variant: 'neutral',
+ },
+};
+
+function isIncompleteImport(stats) {
+ return Object.keys(stats.fetched).some((key) => stats.fetched[key] !== stats.imported[key]);
+}
export default {
name: 'ImportStatus',
components: {
+ GlAccordion,
+ GlAccordionItem,
+ GlBadge,
GlIcon,
},
props: {
@@ -12,19 +68,88 @@ export default {
type: String,
required: true,
},
+ stats: {
+ type: Object,
+ required: false,
+ default: () => ({ fetched: {}, imported: {} }),
+ },
},
computed: {
+ knownStats() {
+ const knownStatisticKeys = Object.keys(STATISTIC_ITEMS);
+ return Object.keys(this.stats.fetched).filter((key) => knownStatisticKeys.includes(key));
+ },
+
+ hasStats() {
+ return this.stats && this.knownStats.length > 0;
+ },
+
mappedStatus() {
+ if (this.status === STATUSES.FINISHED) {
+ const isIncomplete = this.stats && isIncompleteImport(this.stats);
+ return {
+ icon: 'status-success',
+ ...(isIncomplete
+ ? {
+ text: __('Partial import'),
+ variant: 'warning',
+ }
+ : {
+ text: __('Complete'),
+ variant: 'success',
+ }),
+ };
+ }
+
return STATUS_MAP[this.status];
},
},
+
+ methods: {
+ getStatisticIconProps(key) {
+ const fetched = this.stats.fetched[key];
+ const imported = this.stats.imported[key];
+
+ if (fetched === imported) {
+ return { name: 'status-success', class: 'gl-text-green-400' };
+ } else if (imported === 0) {
+ return { name: 'status-scheduled', class: 'gl-text-gray-400' };
+ }
+
+ return { name: 'status-running', class: 'gl-text-blue-400' };
+ },
+ },
+
+ STATISTIC_ITEMS,
};
</script>
<template>
<div>
- <gl-icon :name="mappedStatus.icon" :class="mappedStatus.iconClass" :size="12" class="gl-mr-2" />
- <span>{{ mappedStatus.text }}</span>
+ <div class="gl-display-inline-block gl-w-13">
+ <gl-badge :icon="mappedStatus.icon" :variant="mappedStatus.variant" size="md" class="gl-mr-2">
+ {{ mappedStatus.text }}
+ </gl-badge>
+ </div>
+ <gl-accordion v-if="hasStats" :header-level="3">
+ <gl-accordion-item :title="__('Details')">
+ <ul class="gl-p-0 gl-list-style-none gl-font-sm">
+ <li v-for="key in knownStats" :key="key">
+ <div class="gl-display-flex gl-w-20 gl-align-items-center">
+ <gl-icon
+ :size="12"
+ class="gl-mr-3 gl-flex-shrink-0"
+ v-bind="getStatisticIconProps(key)"
+ />
+ <span class="">{{ $options.STATISTIC_ITEMS[key] }}</span>
+ <span class="gl-ml-auto">
+ {{ stats.imported[key] || 0 }}/{{ stats.fetched[key] }}
+ </span>
+ </div>
+ </li>
+ </ul>
+ </gl-accordion-item>
+ </gl-accordion>
</div>
</template>
diff --git a/app/assets/javascripts/import_entities/constants.js b/app/assets/javascripts/import_entities/constants.js
index 156e92e2d00..20a4d2d84b4 100644
--- a/app/assets/javascripts/import_entities/constants.js
+++ b/app/assets/javascripts/import_entities/constants.js
@@ -1,5 +1,3 @@
-import { __ } from '../locale';
-
// The `scheduling` status is only present on the client-side,
// it is used as the status when we are requesting to start an import.
@@ -13,42 +11,3 @@ export const STATUSES = {
SCHEDULING: 'scheduling',
CANCELLED: 'cancelled',
};
-
-const SCHEDULED_STATUS = {
- icon: 'status-scheduled',
- text: __('Pending'),
- iconClass: 'gl-text-orange-400',
-};
-
-const STATUS_MAP = {
- [STATUSES.NONE]: {
- icon: 'status-waiting',
- text: __('Not started'),
- iconClass: 'gl-text-gray-400',
- },
- [STATUSES.SCHEDULING]: SCHEDULED_STATUS,
- [STATUSES.SCHEDULED]: SCHEDULED_STATUS,
- [STATUSES.CREATED]: SCHEDULED_STATUS,
- [STATUSES.STARTED]: {
- icon: 'status-running',
- text: __('Importing...'),
- iconClass: 'gl-text-blue-400',
- },
- [STATUSES.FINISHED]: {
- icon: 'status-success',
- text: __('Complete'),
- iconClass: 'gl-text-green-400',
- },
- [STATUSES.FAILED]: {
- icon: 'status-failed',
- text: __('Failed'),
- iconClass: 'gl-text-red-600',
- },
- [STATUSES.CANCELLED]: {
- icon: 'status-stopped',
- text: __('Cancelled'),
- iconClass: 'gl-text-red-600',
- },
-};
-
-export default STATUS_MAP;
diff --git a/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue b/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue
index bd0f4cd5dd7..e0703a77424 100644
--- a/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue
+++ b/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue
@@ -109,7 +109,7 @@ export default {
</template>
<div class="gl-display-flex gl-justify-content-space-between gl-flex-wrap gl-mb-5">
<gl-button
- variant="success"
+ variant="confirm"
:loading="isImportingAnyRepo"
:disabled="!hasImportableRepos"
type="button"
diff --git a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue
index c3d0ca4ed8c..e4090a378e1 100644
--- a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue
+++ b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue
@@ -69,6 +69,10 @@ export default {
return getImportStatus(this.repo);
},
+ stats() {
+ return this.repo.importedProject?.stats;
+ },
+
importTarget() {
return this.getImportTarget(this.repo.importSource.id);
},
@@ -101,11 +105,11 @@ export default {
<template>
<tr
- class="gl-h-11 gl-border-0 gl-border-solid gl-border-t-1 gl-border-gray-100 gl-h-11"
+ class="gl-h-11 gl-border-0 gl-border-solid gl-border-t-1 gl-border-gray-100 gl-h-11 gl-vertical-align-top"
data-qa-selector="project_import_row"
:data-qa-source-project="repo.importSource.fullName"
>
- <td class="gl-p-4">
+ <td class="gl-p-4 gl-vertical-align-top">
<gl-link :href="repo.importSource.providerLink" target="_blank" data-testid="providerLink"
>{{ repo.importSource.fullName }}
<gl-icon v-if="repo.importSource.providerLink" name="external-link" />
@@ -156,10 +160,10 @@ export default {
</template>
<template v-else-if="repo.importedProject">{{ displayFullPath }}</template>
</td>
- <td class="gl-p-4" data-qa-selector="import_status_indicator">
- <import-status :status="importStatus" />
+ <td class="gl-p-4 gl-vertical-align-top" data-qa-selector="import_status_indicator">
+ <import-status :status="importStatus" :stats="stats" />
</td>
- <td data-testid="actions">
+ <td data-testid="actions" class="gl-vertical-align-top gl-pt-4">
<gl-button
v-if="isFinished"
class="btn btn-default"
diff --git a/app/assets/javascripts/import_entities/import_projects/index.js b/app/assets/javascripts/import_entities/import_projects/index.js
index 110cc77b20d..5146a0eb461 100644
--- a/app/assets/javascripts/import_entities/import_projects/index.js
+++ b/app/assets/javascripts/import_entities/import_projects/index.js
@@ -16,12 +16,13 @@ export function initStoreFromElement(element) {
jobsPath,
importPath,
namespacesPath,
+ defaultTargetNamespace,
paginatable,
} = element.dataset;
return createStore({
initialState: {
- defaultTargetNamespace: gon.current_username,
+ defaultTargetNamespace,
ciCdOnly: parseBoolean(ciCdOnly),
canSelectNamespace: parseBoolean(canSelectNamespace),
provider,
diff --git a/app/assets/javascripts/import_entities/import_projects/store/mutations.js b/app/assets/javascripts/import_entities/import_projects/store/mutations.js
index 45f7a684161..163a19976de 100644
--- a/app/assets/javascripts/import_entities/import_projects/store/mutations.js
+++ b/app/assets/javascripts/import_entities/import_projects/store/mutations.js
@@ -113,7 +113,11 @@ export default {
updatedProjects.forEach((updatedProject) => {
const repo = state.repositories.find((p) => p.importedProject?.id === updatedProject.id);
if (repo?.importedProject) {
- repo.importedProject.importStatus = updatedProject.importStatus;
+ repo.importedProject = {
+ ...repo.importedProject,
+ stats: updatedProject.stats,
+ importStatus: updatedProject.importStatus,
+ };
}
});
},
diff --git a/app/assets/javascripts/incidents/components/incidents_list.vue b/app/assets/javascripts/incidents/components/incidents_list.vue
index 324797ad645..bfc5bd823a2 100644
--- a/app/assets/javascripts/incidents/components/incidents_list.vue
+++ b/app/assets/javascripts/incidents/components/incidents_list.vue
@@ -33,6 +33,7 @@ import {
TH_CREATED_AT_TEST_ID,
TH_INCIDENT_SLA_TEST_ID,
TH_SEVERITY_TEST_ID,
+ TH_ESCALATION_STATUS_TEST_ID,
TH_PUBLISHED_TEST_ID,
INCIDENT_DETAILS_PATH,
trackIncidentCreateNewOptions,
@@ -67,8 +68,11 @@ export default {
{
key: 'escalationStatus',
label: s__('IncidentManagement|Status'),
- thClass: `${thClass} gl-w-eighth gl-pointer-events-none`,
- tdClass,
+ thClass: `${thClass} gl-w-eighth`,
+ tdClass: `${tdClass} sortable-cell`,
+ actualSortKey: 'ESCALATION_STATUS',
+ sortable: true,
+ thAttr: TH_ESCALATION_STATUS_TEST_ID,
},
{
key: 'createdAt',
@@ -354,7 +358,7 @@ export default {
:loading="redirecting"
:disabled="redirecting"
category="primary"
- variant="success"
+ variant="confirm"
:href="newIncidentPath"
@click="navigateToCreateNewIncident"
>
@@ -388,19 +392,24 @@ export default {
</template>
<template #cell(title)="{ item }">
- <div :class="{ 'gl-display-flex gl-align-items-center': item.state === 'closed' }">
+ <div
+ :class="{
+ 'gl-display-flex gl-align-items-center gl-max-w-full': item.state === 'closed',
+ }"
+ >
<gl-link
- v-gl-tooltip
- :title="item.title"
data-testid="incident-link"
:href="showIncidentLink(item)"
+ class="gl-min-w-0"
>
- {{ item.title }}
+ <tooltip-on-truncate :title="item.title" class="gl-text-truncate gl-display-block">
+ {{ item.title }}
+ </tooltip-on-truncate>
</gl-link>
<gl-icon
v-if="item.state === 'closed'"
name="issue-close"
- class="gl-mx-1 gl-fill-blue-500 gl-flex-shrink-0"
+ class="gl-ml-2 gl-fill-blue-500 gl-flex-shrink-0"
:size="16"
data-testid="incident-closed"
/>
diff --git a/app/assets/javascripts/incidents/constants.js b/app/assets/javascripts/incidents/constants.js
index 21cdbef05a1..ee3f30de880 100644
--- a/app/assets/javascripts/incidents/constants.js
+++ b/app/assets/javascripts/incidents/constants.js
@@ -47,6 +47,7 @@ export const ESCALATION_STATUSES = {
export const DEFAULT_PAGE_SIZE = 20;
export const TH_CREATED_AT_TEST_ID = { 'data-testid': 'incident-management-created-at-sort' };
export const TH_SEVERITY_TEST_ID = { 'data-testid': 'incident-management-severity-sort' };
+export const TH_ESCALATION_STATUS_TEST_ID = { 'data-testid': 'incident-management-status-sort' };
export const TH_INCIDENT_SLA_TEST_ID = { 'data-testid': 'incident-management-sla' };
export const TH_PUBLISHED_TEST_ID = { 'data-testid': 'incident-management-published-sort' };
export const INCIDENT_DETAILS_PATH = 'incident';
diff --git a/app/assets/javascripts/integrations/edit/components/integration_form.vue b/app/assets/javascripts/integrations/edit/components/integration_form.vue
index 6e89872ff68..661299920c7 100644
--- a/app/assets/javascripts/integrations/edit/components/integration_form.vue
+++ b/app/assets/javascripts/integrations/edit/components/integration_form.vue
@@ -4,7 +4,6 @@ import axios from 'axios';
import * as Sentry from '@sentry/browser';
import { mapState, mapActions, mapGetters } from 'vuex';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import {
I18N_FETCH_TEST_SETTINGS_DEFAULT_ERROR_MESSAGE,
I18N_DEFAULT_ERROR_MESSAGE,
@@ -18,8 +17,6 @@ import { testIntegrationSettings } from '../api';
import ActiveCheckbox from './active_checkbox.vue';
import ConfirmationModal from './confirmation_modal.vue';
import DynamicField from './dynamic_field.vue';
-import JiraIssuesFields from './jira_issues_fields.vue';
-import JiraTriggerFields from './jira_trigger_fields.vue';
import OverrideDropdown from './override_dropdown.vue';
import ResetConfirmationModal from './reset_confirmation_modal.vue';
import TriggerFields from './trigger_fields.vue';
@@ -29,8 +26,6 @@ export default {
components: {
OverrideDropdown,
ActiveCheckbox,
- JiraTriggerFields,
- JiraIssuesFields,
TriggerFields,
DynamicField,
ConfirmationModal,
@@ -54,12 +49,6 @@ export default {
GlModal: GlModalDirective,
SafeHtml,
},
- mixins: [glFeatureFlagsMixin()],
- provide() {
- return {
- hasSections: this.hasSections,
- };
- },
inject: {
helpHtml: {
default: '',
@@ -80,9 +69,6 @@ export default {
isEditable() {
return this.propsSource.editable;
},
- isJira() {
- return this.propsSource.type === 'jira';
- },
isInstanceOrGroupLevel() {
return (
this.customState.integrationLevel === integrationLevels.INSTANCE ||
@@ -98,14 +84,11 @@ export default {
disableButtons() {
return Boolean(this.isSaving || this.isResetting || this.isTesting);
},
- sectionsEnabled() {
- return this.glFeatures.integrationFormSections;
- },
hasSections() {
- return this.sectionsEnabled && this.customState.sections.length !== 0;
+ return this.customState.sections.length !== 0;
},
fieldsWithoutSection() {
- return this.sectionsEnabled
+ return this.hasSections
? this.propsSource.fields.filter((field) => !field.section)
: this.propsSource.fields;
},
@@ -184,6 +167,9 @@ export default {
this.integrationActive = integrationActive;
},
},
+ descriptionHtmlConfig: {
+ ADD_ATTR: ['target'], // allow external links, can be removed after https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1427 is implemented
+ },
helpHtmlConfig: {
ADD_ATTR: ['target'], // allow external links, can be removed after https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1427 is implemented
ADD_TAGS: ['use'], // to support icon SVGs
@@ -229,7 +215,7 @@ export default {
<div class="row">
<div class="col-lg-4">
<h4 class="gl-mt-0">{{ section.title }}</h4>
- <p v-safe-html="section.description"></p>
+ <p v-safe-html:[$options.descriptionHtmlConfig]="section.description"></p>
</div>
<div class="col-lg-8">
@@ -257,14 +243,8 @@ export default {
:key="`${currentKey}-active-checkbox`"
@toggle-integration-active="onToggleIntegrationState"
/>
- <jira-trigger-fields
- v-if="isJira && !hasSections"
- :key="`${currentKey}-jira-trigger-fields`"
- v-bind="propsSource.triggerFieldsProps"
- :is-validated="isValidated"
- />
<trigger-fields
- v-else-if="propsSource.triggerEvents.length && !hasSections"
+ v-if="propsSource.triggerEvents.length && !hasSections"
:key="`${currentKey}-trigger-fields`"
:events="propsSource.triggerEvents"
:type="propsSource.type"
@@ -275,13 +255,6 @@ export default {
v-bind="field"
:is-validated="isValidated"
/>
- <jira-issues-fields
- v-if="isJira && !isInstanceOrGroupLevel && !hasSections"
- :key="`${currentKey}-jira-issues-fields`"
- v-bind="propsSource.jiraIssuesProps"
- :is-validated="isValidated"
- @request-jira-issue-types="onRequestJiraIssueTypes"
- />
</div>
</div>
diff --git a/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue b/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
index 7cf8e11f162..f00339c92fa 100644
--- a/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
+++ b/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
@@ -1,5 +1,5 @@
<script>
-import { GlFormGroup, GlFormCheckbox, GlFormInput, GlSprintf, GlLink } from '@gitlab/ui';
+import { GlFormGroup, GlFormCheckbox, GlFormInput } from '@gitlab/ui';
import { mapGetters } from 'vuex';
import { s__, __ } from '~/locale';
import JiraUpgradeCta from './jira_upgrade_cta.vue';
@@ -10,17 +10,10 @@ export default {
GlFormGroup,
GlFormCheckbox,
GlFormInput,
- GlSprintf,
- GlLink,
JiraUpgradeCta,
JiraIssueCreationVulnerabilities: () =>
import('ee_component/integrations/edit/components/jira_issue_creation_vulnerabilities.vue'),
},
- inject: {
- hasSections: {
- default: false,
- },
- },
props: {
showJiraIssuesIntegration: {
type: Boolean,
@@ -52,21 +45,11 @@ export default {
required: false,
default: null,
},
- gitlabIssuesEnabled: {
- type: Boolean,
- required: false,
- default: true,
- },
upgradePlanPath: {
type: String,
required: false,
default: '',
},
- editProjectPath: {
- type: String,
- required: false,
- default: '',
- },
isValidated: {
type: Boolean,
required: false,
@@ -86,7 +69,6 @@ export default {
},
},
i18n: {
- sectionTitle: s__('JiraService|View Jira issues in GitLab'),
sectionDescription: s__(
'JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues.',
),
@@ -97,89 +79,70 @@ export default {
projectKeyLabel: s__('JiraService|Jira project key'),
projectKeyPlaceholder: s__('JiraService|For example, AB'),
requiredFieldFeedback: __('This field is required.'),
- issueTrackerConflictWarning: s__(
- 'JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used.',
- ),
},
};
</script>
<template>
<div>
- <gl-form-group
- :label="hasSections ? null : $options.i18n.sectionTitle"
- label-for="jira-issue-settings"
- >
- <div id="jira-issue-settings">
- <p v-if="!hasSections">
- {{ $options.i18n.sectionDescription }}
- </p>
- <template v-if="showJiraIssuesIntegration">
- <input name="service[issues_enabled]" type="hidden" :value="enableJiraIssues || false" />
- <gl-form-checkbox
- v-model="enableJiraIssues"
- :disabled="isInheriting"
- data-qa-selector="service_jira_issues_enabled_checkbox"
- >
- {{ $options.i18n.enableCheckboxLabel }}
- <template #help>
- {{ $options.i18n.enableCheckboxHelp }}
- </template>
- </gl-form-checkbox>
- <template v-if="enableJiraIssues">
- <jira-issue-creation-vulnerabilities
- :project-key="projectKey"
- :initial-is-enabled="initialEnableJiraVulnerabilities"
- :initial-issue-type-id="initialVulnerabilitiesIssuetype"
- :show-full-feature="showJiraVulnerabilitiesIntegration"
- data-testid="jira-for-vulnerabilities"
- @request-jira-issue-types="$emit('request-jira-issue-types')"
- />
- <jira-upgrade-cta
- v-if="!showJiraVulnerabilitiesIntegration"
- class="gl-mt-2 gl-ml-6"
- data-testid="ultimate-upgrade-cta"
- show-ultimate-message
- :upgrade-plan-path="upgradePlanPath"
- />
- </template>
+ <template v-if="showJiraIssuesIntegration">
+ <input name="service[issues_enabled]" type="hidden" :value="enableJiraIssues || false" />
+ <gl-form-checkbox
+ v-model="enableJiraIssues"
+ :disabled="isInheriting"
+ data-qa-selector="service_jira_issues_enabled_checkbox"
+ >
+ {{ $options.i18n.enableCheckboxLabel }}
+ <template #help>
+ {{ $options.i18n.enableCheckboxHelp }}
</template>
+ </gl-form-checkbox>
+
+ <div v-if="enableJiraIssues" class="gl-pl-6 gl-mt-3">
+ <gl-form-group
+ :label="$options.i18n.projectKeyLabel"
+ label-for="service_project_key"
+ :invalid-feedback="$options.i18n.requiredFieldFeedback"
+ :state="validProjectKey"
+ class="gl-max-w-26"
+ data-testid="project-key-form-group"
+ >
+ <gl-form-input
+ id="service_project_key"
+ v-model="projectKey"
+ name="service[project_key]"
+ data-qa-selector="service_jira_project_key_field"
+ :placeholder="$options.i18n.projectKeyPlaceholder"
+ :required="enableJiraIssues"
+ :state="validProjectKey"
+ :readonly="isInheriting"
+ />
+ </gl-form-group>
+
+ <jira-issue-creation-vulnerabilities
+ :project-key="projectKey"
+ :initial-is-enabled="initialEnableJiraVulnerabilities"
+ :initial-issue-type-id="initialVulnerabilitiesIssuetype"
+ :show-full-feature="showJiraVulnerabilitiesIntegration"
+ class="gl-mt-6"
+ data-testid="jira-for-vulnerabilities"
+ @request-jira-issue-types="$emit('request-jira-issue-types')"
+ />
<jira-upgrade-cta
- v-else
- class="gl-mt-2"
- data-testid="premium-upgrade-cta"
- show-premium-message
+ v-if="!showJiraVulnerabilitiesIntegration"
+ class="gl-mt-2 gl-ml-6"
+ data-testid="ultimate-upgrade-cta"
+ show-ultimate-message
:upgrade-plan-path="upgradePlanPath"
/>
</div>
- </gl-form-group>
- <template v-if="showJiraIssuesIntegration">
- <gl-form-group
- :label="$options.i18n.projectKeyLabel"
- label-for="service_project_key"
- :invalid-feedback="$options.i18n.requiredFieldFeedback"
- :state="validProjectKey"
- data-testid="project-key-form-group"
- >
- <gl-form-input
- id="service_project_key"
- v-model="projectKey"
- name="service[project_key]"
- data-qa-selector="service_jira_project_key_field"
- :placeholder="$options.i18n.projectKeyPlaceholder"
- :required="enableJiraIssues"
- :state="validProjectKey"
- :disabled="!enableJiraIssues"
- :readonly="isInheriting"
- />
- </gl-form-group>
- <p v-if="gitlabIssuesEnabled" data-testid="conflict-warning-text">
- <gl-sprintf :message="$options.i18n.issueTrackerConflictWarning">
- <template #link="{ content }">
- <gl-link :href="editProjectPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </p>
</template>
+
+ <jira-upgrade-cta
+ v-else
+ data-testid="premium-upgrade-cta"
+ show-premium-message
+ :upgrade-plan-path="upgradePlanPath"
+ />
</div>
</template>
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 3c06660e7c5..c7cbdff72e3 100644
--- a/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue
+++ b/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue
@@ -62,11 +62,6 @@ export default {
GlLink,
GlSprintf,
},
- inject: {
- hasSections: {
- default: false,
- },
- },
props: {
initialTriggerCommit: {
type: Boolean,
@@ -138,17 +133,7 @@ export default {
<template>
<div>
- <gl-form-group
- :label="hasSections ? null : __('Trigger')"
- label-for="service[trigger]"
- :description="
- hasSections
- ? null
- : s__(
- 'JiraService|When a Jira issue is mentioned in a commit or merge request, a remote link and comment (if enabled) will be created.',
- )
- "
- >
+ <div class="gl-mb-5">
<input name="service[commit_events]" type="hidden" :value="triggerCommit || false" />
<gl-form-checkbox v-model="triggerCommit" :disabled="isInheriting">
{{ __('Commit') }}
@@ -162,7 +147,7 @@ export default {
<gl-form-checkbox v-model="triggerMergeRequest" :disabled="isInheriting">
{{ __('Merge request') }}
</gl-form-checkbox>
- </gl-form-group>
+ </div>
<gl-form-group
v-show="showTriggerSettings"
diff --git a/app/assets/javascripts/integrations/edit/index.js b/app/assets/javascripts/integrations/edit/index.js
index 3e58dd0be99..9a9aae36657 100644
--- a/app/assets/javascripts/integrations/edit/index.js
+++ b/app/assets/javascripts/integrations/edit/index.js
@@ -1,9 +1,12 @@
import Vue from 'vue';
+import { GlToast } from '@gitlab/ui';
import { convertObjectPropsToCamelCase, parseBoolean } from '~/lib/utils/common_utils';
import IntegrationForm from './components/integration_form.vue';
import { createStore } from './store';
+Vue.use(GlToast);
+
function parseBooleanInData(data) {
const result = {};
Object.entries(data).forEach(([key, value]) => {
@@ -19,7 +22,6 @@ function parseDatasetToProps(data) {
commentDetail,
projectKey,
upgradePlanPath,
- editProjectPath,
learnMorePath,
triggerEvents,
sections,
@@ -49,7 +51,6 @@ function parseDatasetToProps(data) {
showJiraVulnerabilitiesIntegration,
enableJiraIssues,
enableJiraVulnerabilities,
- gitlabIssuesEnabled,
} = parseBooleanInData(booleanAttributes);
return {
@@ -78,9 +79,7 @@ function parseDatasetToProps(data) {
initialEnableJiraVulnerabilities: enableJiraVulnerabilities,
initialVulnerabilitiesIssuetype: vulnerabilitiesIssuetype,
initialProjectKey: projectKey,
- gitlabIssuesEnabled,
upgradePlanPath,
- editProjectPath,
},
learnMorePath,
triggerEvents: JSON.parse(triggerEvents),
diff --git a/app/assets/javascripts/invite_members/components/group_select.vue b/app/assets/javascripts/invite_members/components/group_select.vue
index 04a8ec3400f..fc14b2eba6a 100644
--- a/app/assets/javascripts/invite_members/components/group_select.vue
+++ b/app/assets/javascripts/invite_members/components/group_select.vue
@@ -24,10 +24,6 @@ export default {
prop: 'selectedGroup',
},
props: {
- accessLevels: {
- type: Object,
- required: true,
- },
groupsFilter: {
type: String,
required: false,
@@ -58,13 +54,6 @@ export default {
isFetchResultEmpty() {
return this.groups.length === 0;
},
- defaultFetchOptions() {
- return {
- exclude_internal: true,
- active: true,
- min_access_level: this.accessLevels.Guest,
- };
- },
},
watch: {
searchTerm() {
@@ -107,9 +96,13 @@ export default {
fetchGroups() {
switch (this.groupsFilter) {
case GROUP_FILTERS.DESCENDANT_GROUPS:
- return getDescendentGroups(this.parentGroupId, this.searchTerm, this.defaultFetchOptions);
+ return getDescendentGroups(
+ this.parentGroupId,
+ this.searchTerm,
+ this.$options.defaultFetchOptions,
+ );
default:
- return getGroups(this.searchTerm, this.defaultFetchOptions);
+ return getGroups(this.searchTerm, this.$options.defaultFetchOptions);
}
},
},
@@ -118,6 +111,10 @@ export default {
searchPlaceholder: s__('GroupSelect|Search groups'),
emptySearchResult: s__('GroupSelect|No matching results'),
},
+ defaultFetchOptions: {
+ exclude_internal: true,
+ active: true,
+ },
};
</script>
<template>
diff --git a/app/assets/javascripts/invite_members/components/invite_groups_modal.vue b/app/assets/javascripts/invite_members/components/invite_groups_modal.vue
index f266d978ffa..2ad4bb1a11a 100644
--- a/app/assets/javascripts/invite_members/components/invite_groups_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_groups_modal.vue
@@ -2,11 +2,11 @@
import { uniqueId } from 'lodash';
import Api from '~/api';
import { BV_SHOW_MODAL, BV_HIDE_MODAL } from '~/lib/utils/constants';
+import InviteModalBase from 'ee_else_ce/invite_members/components/invite_modal_base.vue';
import { GROUP_FILTERS, GROUP_MODAL_LABELS } from '../constants';
import eventHub from '../event_hub';
import { getInvalidFeedbackMessage } from '../utils/get_invalid_feedback_message';
import GroupSelect from './group_select.vue';
-import InviteModalBase from './invite_modal_base.vue';
export default {
name: 'InviteMembersModal',
@@ -19,6 +19,10 @@ export default {
type: String,
required: true,
},
+ rootId: {
+ type: String,
+ required: true,
+ },
isProject: {
type: Boolean,
required: true,
@@ -147,6 +151,8 @@ export default {
:label-intro-text="labelIntroText"
:label-search-field="$options.labels.searchField"
:submit-disabled="inviteDisabled"
+ :new-group-to-invite="groupToBeSharedWith.id"
+ :root-group-id="rootId"
:invalid-feedback-message="invalidFeedbackMessage"
:is-loading="isLoading"
@reset="resetFields"
@@ -155,7 +161,6 @@ export default {
<template #select>
<group-select
v-model="groupToBeSharedWith"
- :access-levels="accessLevels"
:groups-filter="groupSelectFilter"
:parent-group-id="groupSelectParentId"
:invalid-groups="invalidGroups"
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 be48a58d838..a9aa0e9b760 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
@@ -24,6 +24,7 @@ import { responseMessageFromSuccess } from '../utils/response_message_parser';
import { getInvalidFeedbackMessage } from '../utils/get_invalid_feedback_message';
import ModalConfetti from './confetti.vue';
import MembersTokenSelect from './members_token_select.vue';
+import UserLimitNotification from './user_limit_notification.vue';
export default {
name: 'InviteMembersModal',
@@ -37,6 +38,7 @@ export default {
InviteModalBase,
MembersTokenSelect,
ModalConfetti,
+ UserLimitNotification,
},
inject: ['newProjectPath'],
props: {
@@ -44,6 +46,10 @@ export default {
type: String,
required: true,
},
+ rootId: {
+ type: String,
+ required: true,
+ },
isProject: {
type: Boolean,
required: true,
@@ -187,46 +193,28 @@ export default {
this.invalidFeedbackMessage = '';
const [usersToInviteByEmail, usersToAddById] = this.partitionNewUsersToInvite();
- const promises = [];
- const baseData = {
+
+ const apiAddByInvite = this.isProject
+ ? Api.inviteProjectMembers.bind(Api)
+ : Api.inviteGroupMembers.bind(Api);
+
+ const email = usersToInviteByEmail !== '' ? { email: usersToInviteByEmail } : {};
+ const userId = usersToAddById !== '' ? { user_id: usersToAddById } : {};
+
+ this.trackinviteMembersForTask();
+
+ apiAddByInvite(this.id, {
format: 'json',
expires_at: expiresAt,
access_level: accessLevel,
invite_source: this.source,
tasks_to_be_done: this.tasksToBeDoneForPost,
tasks_project_id: this.tasksProjectForPost,
- };
-
- if (usersToInviteByEmail !== '') {
- const apiInviteByEmail = this.isProject
- ? Api.inviteProjectMembersByEmail.bind(Api)
- : Api.inviteGroupMembersByEmail.bind(Api);
-
- promises.push(
- apiInviteByEmail(this.id, {
- ...baseData,
- email: usersToInviteByEmail,
- }),
- );
- }
-
- if (usersToAddById !== '') {
- const apiAddByUserId = this.isProject
- ? Api.addProjectMembersByUserId.bind(Api)
- : Api.addGroupMembersByUserId.bind(Api);
-
- promises.push(
- apiAddByUserId(this.id, {
- ...baseData,
- user_id: usersToAddById,
- }),
- );
- }
- this.trackinviteMembersForTask();
-
- Promise.all(promises)
- .then((responses) => {
- const message = responseMessageFromSuccess(responses);
+ ...email,
+ ...userId,
+ })
+ .then((response) => {
+ const message = responseMessageFromSuccess(response);
if (message) {
this.showInvalidFeedbackMessage({
@@ -290,6 +278,8 @@ export default {
:submit-disabled="inviteDisabled"
:invalid-feedback-message="invalidFeedbackMessage"
:is-loading="isLoading"
+ :new-users-to-invite="newUsersToInvite"
+ :root-group-id="rootId"
@reset="resetFields"
@submit="sendInvite"
@access-level="onAccessLevelUpdate"
@@ -302,6 +292,11 @@ export default {
<span v-if="isCelebration">{{ $options.labels.modal.celebrate.intro }} </span>
<modal-confetti v-if="isCelebration" />
</template>
+
+ <template #user-limit-notification>
+ <user-limit-notification />
+ </template>
+
<template #select="{ validationState, labelId }">
<members-token-select
v-model="newUsersToInvite"
diff --git a/app/assets/javascripts/invite_members/components/invite_modal_base.vue b/app/assets/javascripts/invite_members/components/invite_modal_base.vue
index bafbe94b8bd..d9297614a7e 100644
--- a/app/assets/javascripts/invite_members/components/invite_modal_base.vue
+++ b/app/assets/javascripts/invite_members/components/invite_modal_base.vue
@@ -7,7 +7,6 @@ import {
GlDatepicker,
GlLink,
GlSprintf,
- GlButton,
GlFormInput,
} from '@gitlab/ui';
import { sprintf } from '~/locale';
@@ -41,7 +40,6 @@ export default {
GlDropdown,
GlDropdownItem,
GlSprintf,
- GlButton,
GlFormInput,
ContentTransition,
},
@@ -104,6 +102,11 @@ export default {
required: false,
default: INVITE_BUTTON_TEXT,
},
+ cancelButtonText: {
+ type: String,
+ required: false,
+ default: CANCEL_BUTTON_TEXT,
+ },
currentSlot: {
type: String,
required: false,
@@ -114,6 +117,11 @@ export default {
required: false,
default: () => [],
},
+ preventCancelDefault: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
// Be sure to check out reset!
@@ -141,6 +149,22 @@ export default {
contentSlots() {
return [...DEFAULT_SLOTS, ...(this.extraSlots || [])];
},
+ actionPrimary() {
+ return {
+ text: this.submitButtonText,
+ attributes: {
+ variant: 'confirm',
+ disabled: this.submitDisabled,
+ loading: this.isLoading,
+ 'data-qa-selector': 'invite_button',
+ },
+ };
+ },
+ actionCancel() {
+ return {
+ text: this.cancelButtonText,
+ };
+ },
},
watch: {
selectedAccessLevel: {
@@ -151,7 +175,7 @@ export default {
},
},
methods: {
- reset() {
+ onReset() {
// This component isn't necessarily disposed,
// so we might need to reset it's state.
this.selectedAccessLevel = this.defaultAccessLevel;
@@ -159,14 +183,23 @@ export default {
this.$emit('reset');
},
- closeModal() {
- this.reset();
- this.$refs.modal.hide();
+ onCloseModal(e) {
+ if (this.preventCancelDefault) {
+ e.preventDefault();
+ } else {
+ this.onReset();
+ this.$refs.modal.hide();
+ }
+
+ this.$emit('cancel');
},
changeSelectedItem(item) {
this.selectedAccessLevel = item;
},
- submit() {
+ onSubmit(e) {
+ // We never want to hide when submitting
+ e.preventDefault();
+
this.$emit('submit', {
accessLevel: this.selectedAccessLevel,
expiresAt: this.selectedDate,
@@ -192,9 +225,11 @@ export default {
size="sm"
:title="modalTitle"
:header-close-label="$options.HEADER_CLOSE_LABEL"
- @hidden="reset"
- @close="reset"
- @hide="reset"
+ :action-primary="actionPrimary"
+ :action-cancel="actionCancel"
+ @primary="onSubmit"
+ @cancel="onCloseModal"
+ @hidden="onReset"
>
<content-transition
class="gl-display-grid"
@@ -215,6 +250,8 @@ export default {
<slot name="intro-text-after"></slot>
</div>
+ <slot name="user-limit-notification"></slot>
+
<gl-form-group
:invalid-feedback="invalidFeedbackMessage"
:state="validationState"
@@ -280,22 +317,5 @@ export default {
<slot :name="key"></slot>
</template>
</content-transition>
- <template #modal-footer>
- <slot name="cancel-button">
- <gl-button data-testid="cancel-button" @click="closeModal">
- {{ $options.CANCEL_BUTTON_TEXT }}
- </gl-button>
- </slot>
- <gl-button
- :disabled="submitDisabled"
- :loading="isLoading"
- variant="confirm"
- data-qa-selector="invite_button"
- data-testid="invite-button"
- @click="submit"
- >
- {{ submitButtonText }}
- </gl-button>
- </template>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/invite_members/components/members_token_select.vue b/app/assets/javascripts/invite_members/components/members_token_select.vue
index e299e3f27b3..0a191f6d406 100644
--- a/app/assets/javascripts/invite_members/components/members_token_select.vue
+++ b/app/assets/javascripts/invite_members/components/members_token_select.vue
@@ -117,7 +117,7 @@ export default {
this.$emit('clear');
},
},
- defaultQueryOptions: { exclude_internal: true, active: true },
+ defaultQueryOptions: { without_project_bots: true, active: true },
i18n: {
inviteTextMessage: __('Invite "%{email}" by email'),
},
diff --git a/app/assets/javascripts/invite_members/components/user_limit_notification.vue b/app/assets/javascripts/invite_members/components/user_limit_notification.vue
new file mode 100644
index 00000000000..beef1aef8a1
--- /dev/null
+++ b/app/assets/javascripts/invite_members/components/user_limit_notification.vue
@@ -0,0 +1,97 @@
+<script>
+import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
+import { s__, n__, sprintf } from '~/locale';
+
+const CLOSE_TO_LIMIT_COUNT = 2;
+
+const WARNING_ALERT_TITLE = s__(
+ 'InviteMembersModal|You only have space for %{count} more %{members} in %{name}',
+);
+
+const DANGER_ALERT_TITLE = s__(
+ "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}",
+);
+
+const CLOSE_TO_LIMIT_MESSAGE = s__(
+ 'InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier.',
+);
+
+const REACHED_LIMIT_MESSAGE = s__(
+ 'InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need.',
+).concat(' ', CLOSE_TO_LIMIT_MESSAGE);
+
+export default {
+ name: 'UserLimitNotification',
+ components: { GlAlert, GlSprintf, GlLink },
+ inject: ['name', 'newTrialRegistrationPath', 'purchasePath', 'freeUsersLimit', 'membersCount'],
+ computed: {
+ reachedLimit() {
+ return this.isLimit();
+ },
+ closeToLimit() {
+ return this.isLimit(CLOSE_TO_LIMIT_COUNT);
+ },
+ warningAlertTitle() {
+ return sprintf(WARNING_ALERT_TITLE, {
+ count: this.freeUsersLimit - this.membersCount,
+ members: this.pluralMembers(this.freeUsersLimit - this.membersCount),
+ name: this.name,
+ });
+ },
+ dangerAlertTitle() {
+ return sprintf(DANGER_ALERT_TITLE, {
+ count: this.freeUsersLimit,
+ members: this.pluralMembers(this.freeUsersLimit),
+ name: this.name,
+ });
+ },
+ variant() {
+ return this.reachedLimit ? 'danger' : 'warning';
+ },
+ title() {
+ return this.reachedLimit ? this.dangerAlertTitle : this.warningAlertTitle;
+ },
+ message() {
+ if (this.reachedLimit) {
+ return this.$options.i18n.reachedLimitMessage;
+ }
+
+ return this.$options.i18n.closeToLimitMessage;
+ },
+ },
+ methods: {
+ isLimit(deviation = 0) {
+ if (this.freeUsersLimit && this.membersCount) {
+ return this.membersCount >= this.freeUsersLimit - deviation;
+ }
+
+ return false;
+ },
+ pluralMembers(count) {
+ return n__('member', 'members', count);
+ },
+ },
+ i18n: {
+ reachedLimitMessage: REACHED_LIMIT_MESSAGE,
+ closeToLimitMessage: CLOSE_TO_LIMIT_MESSAGE,
+ },
+};
+</script>
+
+<template>
+ <gl-alert
+ v-if="reachedLimit || closeToLimit"
+ :variant="variant"
+ :dismissible="false"
+ :title="title"
+ >
+ <gl-sprintf :message="message">
+ <template #trialLink="{ content }">
+ <gl-link :href="newTrialRegistrationPath" class="gl-label-link">{{ content }}</gl-link>
+ </template>
+ <template #upgradeLink="{ content }">
+ <gl-link :href="purchasePath" class="gl-label-link">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
+</template>
diff --git a/app/assets/javascripts/invite_members/constants.js b/app/assets/javascripts/invite_members/constants.js
index cf2ee508184..3cd0bfc0181 100644
--- a/app/assets/javascripts/invite_members/constants.js
+++ b/app/assets/javascripts/invite_members/constants.js
@@ -1,4 +1,4 @@
-import { __, s__ } from '~/locale';
+import { s__ } from '~/locale';
export const SEARCH_DELAY = 200;
@@ -14,9 +14,6 @@ export const GROUP_FILTERS = {
DESCENDANT_GROUPS: 'descendant_groups',
};
-export const API_MESSAGES = {
- EMAIL_ALREADY_INVITED: __('Invite email has already been taken'),
-};
export const USERS_FILTER_ALL = 'all';
export const USERS_FILTER_SAML_PROVIDER_ID = 'saml_provider_id';
export const TRIGGER_ELEMENT_BUTTON = 'button';
diff --git a/app/assets/javascripts/invite_members/init_invite_members_modal.js b/app/assets/javascripts/invite_members/init_invite_members_modal.js
index e9d620cedf0..958121ad735 100644
--- a/app/assets/javascripts/invite_members/init_invite_members_modal.js
+++ b/app/assets/javascripts/invite_members/init_invite_members_modal.js
@@ -5,45 +5,47 @@ import { parseBoolean } from '~/lib/utils/common_utils';
Vue.use(GlToast);
-let initedInviteMembersModal;
+export default (function initInviteMembersModal() {
+ let inviteMembersModal;
-export default function initInviteMembersModal() {
- if (initedInviteMembersModal) {
- // if we already loaded this in another part of the dom, we don't want to do it again
- // else we will stack the modals
- return false;
- }
+ return () => {
+ if (!inviteMembersModal) {
+ // https://gitlab.com/gitlab-org/gitlab/-/issues/344955
+ // bug lying in wait here for someone to put group and project invite in same screen
+ // once that happens we'll need to mount these differently, perhaps split
+ // group/project to each mount one, with many ways to open it.
+ const el = document.querySelector('.js-invite-members-modal');
- // https://gitlab.com/gitlab-org/gitlab/-/issues/344955
- // bug lying in wait here for someone to put group and project invite in same screen
- // once that happens we'll need to mount these differently, perhaps split
- // group/project to each mount one, with many ways to open it.
- const el = document.querySelector('.js-invite-members-modal');
+ if (!el) {
+ return false;
+ }
- if (!el) {
- return false;
- }
-
- initedInviteMembersModal = true;
-
- return new Vue({
- el,
- name: 'InviteMembersModalRoot',
- provide: {
- newProjectPath: el.dataset.newProjectPath,
- },
- render: (createElement) =>
- createElement(InviteMembersModal, {
- props: {
- ...el.dataset,
- isProject: parseBoolean(el.dataset.isProject),
- accessLevels: JSON.parse(el.dataset.accessLevels),
- defaultAccessLevel: parseInt(el.dataset.defaultAccessLevel, 10),
- tasksToBeDoneOptions: JSON.parse(el.dataset.tasksToBeDoneOptions || '[]'),
- projects: JSON.parse(el.dataset.projects || '[]'),
- usersFilter: el.dataset.usersFilter,
- filterId: parseInt(el.dataset.filterId, 10),
+ inviteMembersModal = new Vue({
+ el,
+ name: 'InviteMembersModalRoot',
+ provide: {
+ name: el.dataset.name,
+ newProjectPath: el.dataset.newProjectPath,
+ newTrialRegistrationPath: el.dataset.newTrialRegistrationPath,
+ purchasePath: el.dataset.purchasePath,
+ freeUsersLimit: el.dataset.freeUsersLimit && parseInt(el.dataset.freeUsersLimit, 10),
+ membersCount: el.dataset.membersCount && parseInt(el.dataset.membersCount, 10),
},
- }),
- });
-}
+ render: (createElement) =>
+ createElement(InviteMembersModal, {
+ props: {
+ ...el.dataset,
+ isProject: parseBoolean(el.dataset.isProject),
+ accessLevels: JSON.parse(el.dataset.accessLevels),
+ defaultAccessLevel: parseInt(el.dataset.defaultAccessLevel, 10),
+ tasksToBeDoneOptions: JSON.parse(el.dataset.tasksToBeDoneOptions || '[]'),
+ projects: JSON.parse(el.dataset.projects || '[]'),
+ usersFilter: el.dataset.usersFilter,
+ filterId: parseInt(el.dataset.filterId, 10),
+ },
+ }),
+ });
+ }
+ return inviteMembersModal;
+ };
+})();
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 52ec3be3205..db8ac303dc4 100644
--- a/app/assets/javascripts/invite_members/utils/response_message_parser.js
+++ b/app/assets/javascripts/invite_members/utils/response_message_parser.js
@@ -1,28 +1,15 @@
import { isString } from 'lodash';
-import { API_MESSAGES } from '~/invite_members/constants';
function responseKeyedMessageParsed(keyedMessage) {
try {
const keys = Object.keys(keyedMessage);
const msg = keyedMessage[keys[0]];
- if (msg === API_MESSAGES.EMAIL_ALREADY_INVITED) {
- return '';
- }
return msg;
} catch {
return '';
}
}
-function responseMessageStringForMultiple(message) {
- return message.includes(':');
-}
-function responseMessageStringFirstPart(message) {
- const firstPart = message.split(':')[1];
- const firstMsg = firstPart.split(/ and [\w-]*$/)[0].trim();
-
- return firstMsg;
-}
export function responseMessageFromError(response) {
if (!response?.response?.data) {
@@ -33,36 +20,25 @@ export function responseMessageFromError(response) {
response: { data },
} = response;
- return (
- data.error ||
- data.message?.user?.[0] ||
- data.message?.access_level?.[0] ||
- data.message?.error ||
- data.message ||
- ''
- );
+ return data.error || data.message?.error || data.message || '';
}
export function responseMessageFromSuccess(response) {
- if (!response?.[0]?.data) {
+ if (!response?.data) {
return '';
}
- const { data } = response[0];
+ const { data } = response;
- if (data.message && !data.message.user) {
+ if (data.message) {
const { message } = data;
if (isString(message)) {
- if (responseMessageStringForMultiple(message)) {
- return responseMessageStringFirstPart(message);
- }
-
return message;
}
return responseKeyedMessageParsed(message);
}
- return data.message || data.message?.user || data.error || '';
+ return data.error || '';
}
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 269f720bac9..dadb1419649 100644
--- a/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue
+++ b/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue
@@ -102,6 +102,7 @@ export default {
:text="$options.i18n.importIssuesText"
:text-sr-only="!showLabel"
:icon="importButtonIcon"
+ class="gl-w-full gl-md-w-auto"
>
<gl-dropdown-item v-gl-modal="importModalId">
{{ $options.i18n.importCsvText }}
diff --git a/app/assets/javascripts/issuable/components/issue_milestone.vue b/app/assets/javascripts/issuable/components/issue_milestone.vue
index 6a0c21602bd..11fc032f34f 100644
--- a/app/assets/javascripts/issuable/components/issue_milestone.vue
+++ b/app/assets/javascripts/issuable/components/issue_milestone.vue
@@ -72,7 +72,7 @@ export default {
</script>
<template>
<div ref="milestoneDetails" class="issue-milestone-details">
- <gl-icon :size="16" class="gl-mr-2" name="clock" />
+ <gl-icon :size="16" class="gl-mr-2 flex-shrink-0" name="clock" />
<span class="milestone-title d-inline-block">{{ milestone.title }}</span>
<gl-tooltip :target="() => $refs.milestoneDetails" placement="bottom" class="js-item-milestone">
<span class="bold">{{ __('Milestone') }}</span> <br />
diff --git a/app/assets/javascripts/issuable/issuable_form.js b/app/assets/javascripts/issuable/issuable_form.js
index 88c1748db0b..018cadad50f 100644
--- a/app/assets/javascripts/issuable/issuable_form.js
+++ b/app/assets/javascripts/issuable/issuable_form.js
@@ -12,6 +12,7 @@ import ZenMode from '~/zen_mode';
const MR_SOURCE_BRANCH = 'merge_request[source_branch]';
const MR_TARGET_BRANCH = 'merge_request[target_branch]';
+const DATA_ISSUES_NEW_PATH = 'data-new-issue-path';
function organizeQuery(obj, isFallbackKey = false) {
if (!obj[MR_SOURCE_BRANCH] && !obj[MR_TARGET_BRANCH]) {
@@ -68,6 +69,7 @@ export default class IssuableForm {
this.reviewersSelect = new UsersSelect(undefined, '.js-reviewer-search');
this.zenMode = new ZenMode();
+ this.newIssuePath = form[0].getAttribute(DATA_ISSUES_NEW_PATH);
this.titleField = this.form.find('input[name*="[title]"]');
this.descriptionField = this.form.find('textarea[name*="[description]"]');
if (!(this.titleField.length && this.descriptionField.length)) {
@@ -104,8 +106,8 @@ export default class IssuableForm {
}
initAutosave() {
- const { search } = document.location;
- const searchTerm = format(search);
+ const { search, pathname } = document.location;
+ const searchTerm = this.newIssuePath === pathname ? '' : format(search);
const fallbackKey = getFallbackKey();
this.autosave = new Autosave(
diff --git a/app/assets/javascripts/issues/create_merge_request_dropdown.js b/app/assets/javascripts/issues/create_merge_request_dropdown.js
index 247f8dd0bd6..c96af6da720 100644
--- a/app/assets/javascripts/issues/create_merge_request_dropdown.js
+++ b/app/assets/javascripts/issues/create_merge_request_dropdown.js
@@ -43,7 +43,7 @@ export default class CreateMergeRequestDropdown {
this.refInput = this.wrapperEl.querySelector('.js-ref');
this.refMessage = this.wrapperEl.querySelector('.js-ref-message');
this.unavailableButton = this.wrapperEl.querySelector('.unavailable');
- this.unavailableButtonSpinner = this.unavailableButton.querySelector('.gl-spinner');
+ this.unavailableButtonSpinner = this.unavailableButton.querySelector('.js-create-mr-spinner');
this.unavailableButtonText = this.unavailableButton.querySelector('.text');
this.branchCreated = false;
@@ -453,7 +453,7 @@ export default class CreateMergeRequestDropdown {
removeMessage(target) {
const { input, message } = this.getTargetData(target);
const inputClasses = ['gl-field-error-outline', 'gl-field-success-outline'];
- const messageClasses = ['text-muted', 'text-danger', 'text-success'];
+ const messageClasses = ['gl-text-gray-600', 'gl-text-red-500', 'gl-text-green-500'];
inputClasses.forEach((cssClass) => input.classList.remove(cssClass));
messageClasses.forEach((cssClass) => message.classList.remove(cssClass));
@@ -462,10 +462,10 @@ export default class CreateMergeRequestDropdown {
setUnavailableButtonState(isLoading = true) {
if (isLoading) {
- this.unavailableButtonSpinner.classList.remove('hide');
+ this.unavailableButtonSpinner.classList.remove('gl-display-none');
this.unavailableButtonText.textContent = __('Checking branch availability...');
} else {
- this.unavailableButtonSpinner.classList.add('hide');
+ this.unavailableButtonSpinner.classList.add('gl-display-none');
this.unavailableButtonText.textContent = __('New branch unavailable');
}
}
@@ -476,7 +476,7 @@ export default class CreateMergeRequestDropdown {
this.removeMessage(target);
input.classList.add('gl-field-success-outline');
- message.classList.add('text-success');
+ message.classList.add('gl-text-green-500');
message.textContent = sprintf(__('%{text} is available'), { text });
message.style.display = 'inline-block';
}
@@ -486,7 +486,7 @@ export default class CreateMergeRequestDropdown {
const text = target === 'branch' ? __('branch name') : __('source');
this.removeMessage(target);
- message.classList.add('text-muted');
+ message.classList.add('gl-text-gray-600');
message.textContent = sprintf(__('Checking %{text} availability…'), { text });
message.style.display = 'inline-block';
}
@@ -498,7 +498,7 @@ export default class CreateMergeRequestDropdown {
this.removeMessage(target);
input.classList.add('gl-field-error-outline');
- message.classList.add('text-danger');
+ message.classList.add('gl-text-red-500');
message.textContent = text;
message.style.display = 'inline-block';
}
diff --git a/app/assets/javascripts/issues/index.js b/app/assets/javascripts/issues/index.js
index 2ee9ac2a682..bcd729785b3 100644
--- a/app/assets/javascripts/issues/index.js
+++ b/app/assets/javascripts/issues/index.js
@@ -1,6 +1,5 @@
import $ from 'jquery';
import IssuableForm from 'ee_else_ce/issuable/issuable_form';
-import loadAwardsHandler from '~/awards_handler';
import ShortcutsIssuable from '~/behaviors/shortcuts/shortcuts_issuable';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import GLForm from '~/gl_form';
@@ -22,6 +21,7 @@ import MilestoneSelect from '~/milestones/milestone_select';
import initNotesApp from '~/notes';
import { store } from '~/notes/stores';
import ZenMode from '~/zen_mode';
+import initAwardsApp from '~/emoji/awards_app';
import FilteredSearchServiceDesk from './filtered_search_service_desk';
export function initFilteredSearchServiceDesk() {
@@ -72,15 +72,7 @@ export function initShow() {
initRelatedMergeRequests();
initSentryErrorStackTrace();
- const awardEmojiEl = document.getElementById('js-vue-awards-block');
-
- if (awardEmojiEl) {
- import('~/emoji/awards_app')
- .then((m) => m.default(awardEmojiEl))
- .catch(() => {});
- } else {
- loadAwardsHandler();
- }
+ initAwardsApp(document.getElementById('js-vue-awards-block'));
import(/* webpackChunkName: 'design_management' */ '~/design_management')
.then((module) => module.default())
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 aece7372182..1139861ae78 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
@@ -1,11 +1,13 @@
<script>
import { GlLink, GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import { IssuableStatus } from '~/issues/constants';
import {
dateInWords,
getTimeRemainingInWords,
isInFuture,
isInPast,
isToday,
+ newDateAsLocaleTime,
} from '~/lib/utils/datetime_utility';
import { __ } from '~/locale';
@@ -27,7 +29,7 @@ export default {
milestoneDate() {
if (this.issue.milestone?.dueDate) {
const { dueDate, startDate } = this.issue.milestone;
- const date = dateInWords(new Date(dueDate), true);
+ const date = dateInWords(newDateAsLocaleTime(dueDate), true);
const remainingTime = this.milestoneRemainingTime(dueDate, startDate);
return `${date} (${remainingTime})`;
}
@@ -37,10 +39,13 @@ export default {
return this.issue.milestone.webPath || this.issue.milestone.webUrl;
},
dueDate() {
- return this.issue.dueDate && dateInWords(new Date(this.issue.dueDate), true);
+ return this.issue.dueDate && dateInWords(newDateAsLocaleTime(this.issue.dueDate), true);
},
showDueDateInRed() {
- return isInPast(new Date(this.issue.dueDate)) && !this.issue.closedAt;
+ return (
+ isInPast(newDateAsLocaleTime(this.issue.dueDate)) &&
+ this.issue.state !== IssuableStatus.Closed
+ );
},
timeEstimate() {
return this.issue.humanTimeEstimate || this.issue.timeStats?.humanTimeEstimate;
@@ -48,8 +53,8 @@ export default {
},
methods: {
milestoneRemainingTime(dueDate, startDate) {
- const due = new Date(dueDate);
- const start = new Date(startDate);
+ const due = newDateAsLocaleTime(dueDate);
+ const start = newDateAsLocaleTime(startDate);
if (dueDate && isInPast(due)) {
return __('Past due');
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 a532fa5b771..a43aed6c521 100644
--- a/app/assets/javascripts/issues/list/components/issues_list_app.vue
+++ b/app/assets/javascripts/issues/list/components/issues_list_app.vue
@@ -19,6 +19,7 @@ import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
import { ITEM_TYPE } from '~/groups/constants';
import CsvImportExportButtons from '~/issuable/components/csv_import_export_buttons.vue';
import IssuableByEmail from '~/issuable/components/issuable_by_email.vue';
+import { IssuableStatus } from '~/issues/constants';
import axios from '~/lib/utils/axios_utils';
import { scrollUp } from '~/lib/utils/scroll_utils';
import { getParameterByName, joinPaths } from '~/lib/utils/url_utility';
@@ -260,6 +261,9 @@ export default {
showCsvButtons() {
return this.isProject && this.isSignedIn;
},
+ showIssuableByEmail() {
+ return this.initialEmail && this.isSignedIn;
+ },
showNewIssueDropdown() {
return !this.isProject && this.hasAnyProjects;
},
@@ -477,10 +481,10 @@ export default {
return `${this.exportCsvPath}${window.location.search}`;
},
getStatus(issue) {
- if (issue.closedAt && issue.moved) {
+ if (issue.state === IssuableStatus.Closed && issue.moved) {
return this.$options.i18n.closedMoved;
}
- if (issue.closedAt) {
+ if (issue.state === IssuableStatus.Closed) {
return this.$options.i18n.closed;
}
return undefined;
@@ -624,8 +628,9 @@ export default {
</script>
<template>
- <div v-if="hasAnyIssues">
+ <div>
<issuable-list
+ v-if="hasAnyIssues"
:namespace="fullPath"
recent-searches-storage-key="issues"
:search-input-placeholder="$options.i18n.searchPlaceholder"
@@ -768,50 +773,50 @@ export default {
</template>
</issuable-list>
- <issuable-by-email v-if="initialEmail" class="gl-text-center gl-pt-5 gl-pb-7" />
- </div>
+ <template v-else-if="isSignedIn">
+ <gl-empty-state
+ :description="$options.i18n.noIssuesSignedInDescription"
+ :title="$options.i18n.noIssuesSignedInTitle"
+ :svg-path="emptyStateSvgPath"
+ >
+ <template #actions>
+ <gl-button v-if="showNewIssueLink" :href="newIssuePath" variant="confirm">
+ {{ $options.i18n.newIssueLabel }}
+ </gl-button>
+ <csv-import-export-buttons
+ v-if="showCsvButtons"
+ class="gl-w-full gl-sm-w-auto gl-sm-mr-3"
+ :export-csv-path="exportCsvPathWithQuery"
+ :issuable-count="currentTabCount"
+ />
+ <new-issue-dropdown v-if="showNewIssueDropdown" />
+ </template>
+ </gl-empty-state>
+ <hr />
+ <p class="gl-text-center gl-font-weight-bold gl-mb-0">
+ {{ $options.i18n.jiraIntegrationTitle }}
+ </p>
+ <p class="gl-text-center gl-mb-0">
+ <gl-sprintf :message="$options.i18n.jiraIntegrationMessage">
+ <template #jiraDocsLink="{ content }">
+ <gl-link :href="jiraIntegrationPath">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ <p class="gl-text-center gl-text-gray-500">
+ {{ $options.i18n.jiraIntegrationSecondaryMessage }}
+ </p>
+ </template>
- <div v-else-if="isSignedIn">
<gl-empty-state
- :description="$options.i18n.noIssuesSignedInDescription"
- :title="$options.i18n.noIssuesSignedInTitle"
+ v-else
+ :description="$options.i18n.noIssuesSignedOutDescription"
+ :title="$options.i18n.noIssuesSignedOutTitle"
:svg-path="emptyStateSvgPath"
- >
- <template #actions>
- <gl-button v-if="showNewIssueLink" :href="newIssuePath" variant="confirm">
- {{ $options.i18n.newIssueLabel }}
- </gl-button>
- <csv-import-export-buttons
- v-if="showCsvButtons"
- class="gl-mr-3"
- :export-csv-path="exportCsvPathWithQuery"
- :issuable-count="currentTabCount"
- />
- <new-issue-dropdown v-if="showNewIssueDropdown" />
- </template>
- </gl-empty-state>
- <hr />
- <p class="gl-text-center gl-font-weight-bold gl-mb-0">
- {{ $options.i18n.jiraIntegrationTitle }}
- </p>
- <p class="gl-text-center gl-mb-0">
- <gl-sprintf :message="$options.i18n.jiraIntegrationMessage">
- <template #jiraDocsLink="{ content }">
- <gl-link :href="jiraIntegrationPath">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </p>
- <p class="gl-text-center gl-text-gray-500">
- {{ $options.i18n.jiraIntegrationSecondaryMessage }}
- </p>
- </div>
+ :primary-button-text="$options.i18n.noIssuesSignedOutButtonText"
+ :primary-button-link="signInPath"
+ />
- <gl-empty-state
- v-else
- :description="$options.i18n.noIssuesSignedOutDescription"
- :title="$options.i18n.noIssuesSignedOutTitle"
- :svg-path="emptyStateSvgPath"
- :primary-button-text="$options.i18n.noIssuesSignedOutButtonText"
- :primary-button-link="signInPath"
- />
+ <issuable-by-email v-if="showIssuableByEmail" class="gl-text-center gl-pt-5 gl-pb-7" />
+ </div>
</template>
diff --git a/app/assets/javascripts/issues/list/queries/get_issues.query.graphql b/app/assets/javascripts/issues/list/queries/get_issues.query.graphql
index 529262d2162..ec24ea7c56a 100644
--- a/app/assets/javascripts/issues/list/queries/get_issues.query.graphql
+++ b/app/assets/javascripts/issues/list/queries/get_issues.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
#import "./issue.fragment.graphql"
query getIssues(
diff --git a/app/assets/javascripts/issues/list/queries/issue.fragment.graphql b/app/assets/javascripts/issues/list/queries/issue.fragment.graphql
index 430d494deab..d09e4d9df2b 100644
--- a/app/assets/javascripts/issues/list/queries/issue.fragment.graphql
+++ b/app/assets/javascripts/issues/list/queries/issue.fragment.graphql
@@ -2,7 +2,6 @@ fragment IssueFragment on Issue {
__typename
id
iid
- closedAt
confidential
createdAt
downvotes
@@ -11,6 +10,7 @@ fragment IssueFragment on Issue {
humanTimeEstimate
mergeRequestsCount
moved
+ state
title
updatedAt
upvotes
diff --git a/app/assets/javascripts/issues/manual_ordering.js b/app/assets/javascripts/issues/manual_ordering.js
index 8fb891f62f7..bc1cffef943 100644
--- a/app/assets/javascripts/issues/manual_ordering.js
+++ b/app/assets/javascripts/issues/manual_ordering.js
@@ -1,11 +1,8 @@
import Sortable from 'sortablejs';
-import {
- getBoardSortableDefaultOptions,
- sortableStart,
-} from '~/boards/mixins/sortable_default_options';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { s__ } from '~/locale';
+import { getSortableDefaultOptions, sortableStart } from '~/sortable/utils';
const updateIssue = (url, { move_before_id, move_after_id }) =>
axios
@@ -28,7 +25,7 @@ const initManualOrdering = () => {
Sortable.create(
issueList,
- getBoardSortableDefaultOptions({
+ getSortableDefaultOptions({
scroll: true,
fallbackTolerance: 1,
dataIdAttr: 'data-id',
diff --git a/app/assets/javascripts/issues/show/components/app.vue b/app/assets/javascripts/issues/show/components/app.vue
index 0490728c6bc..456a2029703 100644
--- a/app/assets/javascripts/issues/show/components/app.vue
+++ b/app/assets/javascripts/issues/show/components/app.vue
@@ -185,6 +185,11 @@ export default {
required: false,
default: false,
},
+ issueId: {
+ type: Number,
+ required: false,
+ default: null,
+ },
},
data() {
const store = new Store({
@@ -322,9 +327,12 @@ export default {
});
},
+ updateFormState(state) {
+ this.store.setFormState(state);
+ },
+
updateAndShowForm(templates = {}) {
if (!this.showForm) {
- this.showForm = true;
this.store.setFormState({
title: this.state.titleText,
description: this.state.descriptionText,
@@ -333,6 +341,7 @@ export default {
updateLoading: false,
issuableTemplates: templates,
});
+ this.showForm = true;
}
},
@@ -364,6 +373,10 @@ export default {
},
updateIssuable() {
+ this.store.setFormState({
+ updateLoading: true,
+ });
+
const {
store: { formState },
issueState,
@@ -371,7 +384,9 @@ export default {
const issuablePayload = issueState.isDirty
? { ...formState, issue_type: issueState.issueType }
: formState;
+
this.clearFlash();
+
return this.service
.updateIssuable(issuablePayload)
.then((res) => res.data)
@@ -426,7 +441,7 @@ export default {
clearFlash() {
if (this.flashContainer) {
- this.flashContainer.style.display = 'none';
+ this.flashContainer.close();
this.flashContainer = null;
}
},
@@ -468,6 +483,7 @@ export default {
:can-attach-file="canAttachFile"
:enable-autocomplete="enableAutocomplete"
:issuable-type="issuableType"
+ @updateForm="updateFormState"
/>
</div>
<div v-else>
@@ -534,6 +550,7 @@ export default {
<component
:is="descriptionComponent"
+ :issue-id="issueId"
:can-update="canUpdate"
:description-html="state.descriptionHtml"
:description-text="state.descriptionText"
@@ -545,6 +562,7 @@ export default {
@taskListUpdateStarted="taskListUpdateStarted"
@taskListUpdateSucceeded="taskListUpdateSucceeded"
@taskListUpdateFailed="taskListUpdateFailed"
+ @updateDescription="state.descriptionHtml = $event"
/>
<edited-component
diff --git a/app/assets/javascripts/issues/show/components/description.vue b/app/assets/javascripts/issues/show/components/description.vue
index 68ed7bb4062..0b7e128c47b 100644
--- a/app/assets/javascripts/issues/show/components/description.vue
+++ b/app/assets/javascripts/issues/show/components/description.vue
@@ -2,13 +2,18 @@
import {
GlSafeHtmlDirective as SafeHtml,
GlModal,
+ GlToast,
+ GlTooltip,
GlModalDirective,
- GlPopover,
- GlButton,
} from '@gitlab/ui';
import $ from 'jquery';
+import Vue from 'vue';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
+import { TYPE_WORK_ITEM } from '~/graphql_shared/constants';
import createFlash from '~/flash';
-import { __, sprintf } from '~/locale';
+import { isPositiveInteger } from '~/lib/utils/number_utils';
+import { getParameterByName, setUrlParams, updateHistory } from '~/lib/utils/url_utility';
+import { __, s__, sprintf } from '~/locale';
import TaskList from '~/task_list';
import Tracking from '~/tracking';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -16,6 +21,8 @@ import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.
import CreateWorkItem from '~/work_items/pages/create_work_item.vue';
import animateMixin from '../mixins/animate';
+Vue.use(GlToast);
+
export default {
directives: {
SafeHtml,
@@ -23,9 +30,8 @@ export default {
},
components: {
GlModal,
- GlPopover,
CreateWorkItem,
- GlButton,
+ GlTooltip,
WorkItemDetailModal,
},
mixins: [animateMixin, glFeatureFlagMixin(), Tracking.mixin()],
@@ -63,15 +69,24 @@ export default {
required: false,
default: 0,
},
+ issueId: {
+ type: Number,
+ required: false,
+ default: null,
+ },
},
data() {
+ const workItemId = getParameterByName('work_item_id');
+
return {
preAnimation: false,
pulseAnimation: false,
initialUpdate: true,
taskButtons: [],
activeTask: {},
- workItemId: null,
+ workItemId: isPositiveInteger(workItemId)
+ ? convertToGraphQLId(TYPE_WORK_ITEM, workItemId)
+ : undefined,
};
},
computed: {
@@ -81,6 +96,9 @@ export default {
workItemsEnabled() {
return this.glFeatures.workItems;
},
+ issueGid() {
+ return this.issueId ? convertToGraphQLId(TYPE_WORK_ITEM, this.issueId) : null;
+ },
},
watch: {
descriptionHtml(newDescription, oldDescription) {
@@ -92,6 +110,9 @@ export default {
this.$nextTick(() => {
this.renderGFM();
+ if (this.workItemsEnabled) {
+ this.renderTaskActions();
+ }
});
},
taskStatus() {
@@ -168,9 +189,25 @@ export default {
return;
}
+ this.taskButtons = [];
const taskListFields = this.$el.querySelectorAll('.task-list-item');
taskListFields.forEach((item, index) => {
+ const taskLink = item.querySelector('.gfm-issue');
+ if (taskLink) {
+ const { issue, referenceType } = taskLink.dataset;
+ taskLink.addEventListener('click', (e) => {
+ e.preventDefault();
+ this.workItemId = convertToGraphQLId(TYPE_WORK_ITEM, issue);
+ this.updateWorkItemIdUrlQuery(issue);
+ this.track('viewed_work_item_from_modal', {
+ category: 'workItems:show',
+ label: 'work_item_view',
+ property: `type_${referenceType}`,
+ });
+ });
+ return;
+ }
const button = document.createElement('button');
button.classList.add(
'btn',
@@ -188,59 +225,44 @@ export default {
this.taskButtons.push(button.id);
button.innerHTML = `
<svg data-testid="ellipsis_v-icon" role="img" aria-hidden="true" class="dropdown-icon gl-icon s14">
- <use href="${gon.sprite_icons}#ellipsis_v"></use>
+ <use href="${gon.sprite_icons}#doc-new"></use>
</svg>
`;
+ button.setAttribute('aria-label', s__('WorkItem|Convert to work item'));
+ button.addEventListener('click', () => this.openCreateTaskModal(button.id));
item.prepend(button);
});
},
openCreateTaskModal(id) {
- this.activeTask = { id, title: this.$el.querySelector(`#${id}`).parentElement.innerText };
+ const { parentElement } = this.$el.querySelector(`#${id}`);
+ const lineNumbers = parentElement.getAttribute('data-sourcepos').match(/\b\d+(?=:)/g);
+ this.activeTask = {
+ id,
+ title: parentElement.innerText,
+ lineNumberStart: lineNumbers[0],
+ lineNumberEnd: lineNumbers[1],
+ };
this.$refs.modal.show();
},
closeCreateTaskModal() {
this.$refs.modal.hide();
},
closeWorkItemDetailModal() {
- this.workItemId = null;
+ this.workItemId = undefined;
+ this.updateWorkItemIdUrlQuery(undefined);
},
- handleWorkItemDetailModalError(message) {
- createFlash({ message });
- },
- handleCreateTask({ id, title, type }) {
- const listItem = this.$el.querySelector(`#${this.activeTask.id}`).parentElement;
- const taskBadge = document.createElement('span');
- taskBadge.innerHTML = `
- <svg data-testid="issue-open-m-icon" role="img" aria-hidden="true" class="gl-icon gl-fill-green-500 s12">
- <use href="${gon.sprite_icons}#issue-open-m"></use>
- </svg>
- <span class="badge badge-info badge-pill gl-badge sm gl-mr-1">
- ${__('Task')}
- </span>
- `;
- const button = this.createWorkItemDetailButton(id, title, type);
- taskBadge.append(button);
-
- listItem.insertBefore(taskBadge, listItem.lastChild);
- listItem.removeChild(listItem.lastChild);
+ handleCreateTask(description) {
+ this.$emit('updateDescription', description);
this.closeCreateTaskModal();
},
- createWorkItemDetailButton(id, title, type) {
- const button = document.createElement('button');
- button.addEventListener('click', () => {
- this.workItemId = id;
- this.track('viewed_work_item_from_modal', {
- category: 'workItems:show',
- label: 'work_item_view',
- property: `type_${type}`,
- });
- });
- button.classList.add('btn-link');
- button.innerText = title;
- return button;
+ handleDeleteTask() {
+ this.$toast.show(s__('WorkItem|Work item deleted'));
},
- focusButton() {
- this.$refs.convertButton[0].$el.focus();
+ updateWorkItemIdUrlQuery(workItemId) {
+ updateHistory({
+ url: setUrlParams({ work_item_id: workItemId }),
+ replace: true,
+ });
},
},
safeHtmlConfig: { ADD_TAGS: ['gl-emoji', 'copy-code'] },
@@ -266,17 +288,17 @@ export default {
}"
class="md"
></div>
- <!-- eslint-disable vue/no-mutating-props -->
+
<textarea
v-if="descriptionText"
- v-model="descriptionText"
+ :value="descriptionText"
:data-update-url="updateUrl"
class="hidden js-task-list-field"
dir="auto"
data-testid="textarea"
>
</textarea>
- <!-- eslint-enable vue/no-mutating-props -->
+
<gl-modal
ref="modal"
modal-id="create-task-modal"
@@ -285,36 +307,27 @@ export default {
body-class="gl-p-0!"
>
<create-work-item
- :is-modal="true"
+ is-modal
:initial-title="activeTask.title"
+ :issue-gid="issueGid"
+ :lock-version="lockVersion"
+ :line-number-start="activeTask.lineNumberStart"
+ :line-number-end="activeTask.lineNumberEnd"
@closeModal="closeCreateTaskModal"
@onCreate="handleCreateTask"
/>
</gl-modal>
<work-item-detail-modal
+ :can-update="canUpdate"
:visible="showWorkItemDetailModal"
:work-item-id="workItemId"
+ @workItemDeleted="handleDeleteTask"
@close="closeWorkItemDetailModal"
- @error="handleWorkItemDetailModalError"
/>
<template v-if="workItemsEnabled">
- <gl-popover
- v-for="item in taskButtons"
- :key="item"
- :target="item"
- placement="top"
- triggers="focus"
- @shown="focusButton"
- >
- <gl-button
- ref="convertButton"
- variant="link"
- data-testid="convert-to-task"
- class="gl-text-gray-900! gl-text-decoration-none! gl-outline-0!"
- @click="openCreateTaskModal(item)"
- >{{ s__('WorkItem|Convert to work item') }}</gl-button
- >
- </gl-popover>
+ <gl-tooltip v-for="item in taskButtons" :key="item" :target="item">
+ {{ s__('WorkItem|Convert to work item') }}
+ </gl-tooltip>
</template>
</div>
</template>
diff --git a/app/assets/javascripts/issues/show/components/edited.vue b/app/assets/javascripts/issues/show/components/edited.vue
index 0da1900a6d0..41cc3964055 100644
--- a/app/assets/javascripts/issues/show/components/edited.vue
+++ b/app/assets/javascripts/issues/show/components/edited.vue
@@ -32,7 +32,7 @@ export default {
</script>
<template>
- <small class="edited-text">
+ <small class="edited-text js-issue-widgets">
Edited
<time-ago-tooltip v-if="updatedAt" :time="updatedAt" tooltip-placement="bottom" />
<span v-if="hasUpdatedBy">
diff --git a/app/assets/javascripts/issues/show/components/fields/description.vue b/app/assets/javascripts/issues/show/components/fields/description.vue
index d5ac7b28afc..0bb5e7cb2ee 100644
--- a/app/assets/javascripts/issues/show/components/fields/description.vue
+++ b/app/assets/javascripts/issues/show/components/fields/description.vue
@@ -1,5 +1,6 @@
<script>
import markdownField from '~/vue_shared/components/markdown/field.vue';
+import { helpPagePath } from '~/helpers/help_page_helper';
import updateMixin from '../../mixins/update';
export default {
@@ -8,8 +9,8 @@ export default {
},
mixins: [updateMixin],
props: {
- formState: {
- type: Object,
+ value: {
+ type: String,
required: true,
},
markdownPreviewPath: {
@@ -31,6 +32,11 @@ export default {
default: true,
},
},
+ computed: {
+ quickActionsDocsPath() {
+ return helpPagePath('user/project/quick_actions');
+ },
+ },
mounted() {
this.$refs.textarea.focus();
},
@@ -43,26 +49,26 @@ export default {
<markdown-field
:markdown-preview-path="markdownPreviewPath"
:markdown-docs-path="markdownDocsPath"
+ :quick-actions-docs-path="quickActionsDocsPath"
:can-attach-file="canAttachFile"
:enable-autocomplete="enableAutocomplete"
- :textarea-value="formState.description"
+ :textarea-value="value"
>
<template #textarea>
- <!-- eslint-disable vue/no-mutating-props -->
<textarea
id="issue-description"
ref="textarea"
- v-model="formState.description"
+ :value="value"
class="note-textarea js-gfm-input js-autosize markdown-area qa-description-textarea"
dir="auto"
data-supports-quick-actions="true"
:aria-label="__('Description')"
:placeholder="__('Write a comment or drag your files here…')"
+ @input="$emit('input', $event.target.value)"
@keydown.meta.enter="updateIssuable"
@keydown.ctrl.enter="updateIssuable"
>
</textarea>
- <!-- eslint-enable vue/no-mutating-props -->
</template>
</markdown-field>
</div>
diff --git a/app/assets/javascripts/issues/show/components/fields/description_template.vue b/app/assets/javascripts/issues/show/components/fields/description_template.vue
index d528641dcb6..98f92c97f77 100644
--- a/app/assets/javascripts/issues/show/components/fields/description_template.vue
+++ b/app/assets/javascripts/issues/show/components/fields/description_template.vue
@@ -8,8 +8,8 @@ export default {
GlIcon,
},
props: {
- formState: {
- type: Object,
+ value: {
+ type: String,
required: true,
},
issuableTemplates: {
@@ -39,10 +39,9 @@ export default {
// Create the editor for the template
const editor = document.querySelector('.detail-page-description .note-textarea') || {};
editor.setValue = (val) => {
- // eslint-disable-next-line vue/no-mutating-props
- this.formState.description = val;
+ this.$emit('input', val);
};
- editor.getValue = () => this.formState.description;
+ editor.getValue = () => this.value;
this.issuableTemplate = new IssuableTemplateSelectors({
$dropdowns: $(this.$refs.toggle),
diff --git a/app/assets/javascripts/issues/show/components/fields/title.vue b/app/assets/javascripts/issues/show/components/fields/title.vue
index a73926575d0..594d1a65700 100644
--- a/app/assets/javascripts/issues/show/components/fields/title.vue
+++ b/app/assets/javascripts/issues/show/components/fields/title.vue
@@ -4,8 +4,8 @@ import updateMixin from '../../mixins/update';
export default {
mixins: [updateMixin],
props: {
- formState: {
- type: Object,
+ value: {
+ type: String,
required: true,
},
},
@@ -15,19 +15,18 @@ export default {
<template>
<fieldset>
<label class="sr-only" for="issuable-title">{{ __('Title') }}</label>
- <!-- eslint-disable vue/no-mutating-props -->
<input
id="issuable-title"
ref="input"
- v-model="formState.title"
+ :value="value"
class="form-control qa-title-input gl-border-gray-200"
dir="auto"
type="text"
:placeholder="__('Title')"
:aria-label="__('Title')"
+ @input="$emit('input', $event.target.value)"
@keydown.meta.enter="updateIssuable"
@keydown.ctrl.enter="updateIssuable"
/>
- <!-- eslint-enable vue/no-mutating-props -->
</fieldset>
</template>
diff --git a/app/assets/javascripts/issues/show/components/form.vue b/app/assets/javascripts/issues/show/components/form.vue
index 6447ec85b4e..e2c12edf46d 100644
--- a/app/assets/javascripts/issues/show/components/form.vue
+++ b/app/assets/javascripts/issues/show/components/form.vue
@@ -86,6 +86,10 @@ export default {
},
data() {
return {
+ formData: {
+ title: this.formState.title,
+ description: this.formState.description,
+ },
showOutdatedDescriptionWarning: false,
};
},
@@ -100,6 +104,14 @@ export default {
return this.issuableType === IssuableType.Issue;
},
},
+ watch: {
+ formData: {
+ handler(value) {
+ this.$emit('updateForm', value);
+ },
+ deep: true,
+ },
+ },
created() {
eventHub.$on('delete.issuable', this.resetAutosave);
eventHub.$on('update.issuable', this.resetAutosave);
@@ -191,16 +203,17 @@ export default {
>
<div class="row gl-mb-3">
<div class="col-12">
- <issuable-title-field ref="title" :form-state="formState" />
+ <issuable-title-field ref="title" v-model="formData.title" />
</div>
</div>
<div class="row">
<div v-if="isIssueType" class="col-12 col-md-4 pr-md-0">
<issuable-type-field ref="issue-type" />
</div>
+
<div v-if="hasIssuableTemplates" class="col-12 col-md-4 pl-md-2">
<description-template-field
- :form-state="formState"
+ v-model="formData.description"
:issuable-templates="issuableTemplates"
:project-path="projectPath"
:project-id="projectId"
@@ -208,14 +221,16 @@ export default {
/>
</div>
</div>
+
<description-field
ref="description"
- :form-state="formState"
+ v-model="formData.description"
:markdown-preview-path="markdownPreviewPath"
:markdown-docs-path="markdownDocsPath"
:can-attach-file="canAttachFile"
:enable-autocomplete="enableAutocomplete"
/>
+
<edit-actions
:endpoint="endpoint"
:form-state="formState"
diff --git a/app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue b/app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue
index 04ddc7f3501..ea0e15adfed 100644
--- a/app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue
+++ b/app/assets/javascripts/issues/show/components/incidents/incident_tabs.vue
@@ -17,12 +17,13 @@ export default {
GlTab,
GlTabs,
HighlightBar,
- MetricsTab: () => import('ee_component/issues/show/components/incidents/metrics_tab.vue'),
TimelineTab: () =>
import('ee_component/issues/show/components/incidents/timeline_events_tab.vue'),
+ IncidentMetricTab: () =>
+ import('ee_component/issues/show/components/incidents/incident_metric_tab.vue'),
},
mixins: [glFeatureFlagsMixin()],
- inject: ['fullPath', 'iid', 'uploadMetricsFeatureAvailable'],
+ inject: ['fullPath', 'iid'],
apollo: {
alert: {
query: getAlert,
@@ -52,7 +53,7 @@ export default {
return this.$apollo.queries.alert.loading;
},
incidentTabEnabled() {
- return this.glFeatures.incidentTimelineEvents && this.glFeatures.incidentTimelineEventTab;
+ return this.glFeatures.incidentTimelineEvents && this.glFeatures.incidentTimeline;
},
},
mounted() {
@@ -63,18 +64,37 @@ export default {
const { category, action } = trackIncidentDetailsViewsOptions;
Tracking.event(category, action);
},
+ handleTabChange(tabIndex) {
+ const parent = document.querySelector('.js-issue-details');
+
+ if (parent !== null) {
+ const itemsToHide = parent.querySelectorAll('.js-issue-widgets');
+ const lineSeparator = parent.querySelector('.js-detail-page-description');
+
+ lineSeparator.classList.toggle('gl-border-b-0', tabIndex > 0);
+
+ itemsToHide.forEach(function hide(item) {
+ item.classList.toggle('gl-display-none', tabIndex > 0);
+ });
+ }
+ },
},
};
</script>
<template>
<div>
- <gl-tabs content-class="gl-reset-line-height" class="gl-mt-n3" data-testid="incident-tabs">
+ <gl-tabs
+ content-class="gl-reset-line-height"
+ class="gl-mt-n3"
+ data-testid="incident-tabs"
+ @input="handleTabChange"
+ >
<gl-tab :title="s__('Incident|Summary')">
<highlight-bar :alert="alert" />
<description-component v-bind="$attrs" />
</gl-tab>
- <metrics-tab v-if="uploadMetricsFeatureAvailable" data-testid="metrics-tab" />
+ <incident-metric-tab />
<gl-tab
v-if="alert"
class="alert-management-details"
diff --git a/app/assets/javascripts/issues/show/components/locked_warning.vue b/app/assets/javascripts/issues/show/components/locked_warning.vue
index 4b99888ae73..12feacb027b 100644
--- a/app/assets/javascripts/issues/show/components/locked_warning.vue
+++ b/app/assets/javascripts/issues/show/components/locked_warning.vue
@@ -1,5 +1,5 @@
<script>
-import { GlSprintf, GlLink } from '@gitlab/ui';
+import { GlSprintf, GlLink, GlAlert } from '@gitlab/ui';
import { __ } from '~/locale';
const alertMessage = __(
@@ -11,6 +11,7 @@ export default {
components: {
GlSprintf,
GlLink,
+ GlAlert,
},
computed: {
currentPath() {
@@ -21,7 +22,7 @@ export default {
</script>
<template>
- <div class="alert alert-danger">
+ <gl-alert variant="danger" class="gl-mb-5" :dismissible="false">
<gl-sprintf :message="$options.alertMessage">
<template #link="{ content }">
<gl-link :href="currentPath" target="_blank" rel="nofollow">
@@ -29,5 +30,5 @@ export default {
</gl-link>
</template>
</gl-sprintf>
- </div>
+ </gl-alert>
</template>
diff --git a/app/assets/javascripts/issues/show/index.js b/app/assets/javascripts/issues/show/index.js
index c9af5d9b4a7..4a5ebf9615b 100644
--- a/app/assets/javascripts/issues/show/index.js
+++ b/app/assets/javascripts/issues/show/index.js
@@ -102,7 +102,7 @@ export function initIssueApp(issueData, store) {
isConfidential: this.getNoteableData?.confidential,
isLocked: this.getNoteableData?.discussion_locked,
issuableStatus: this.getNoteableData?.state,
- id: this.getNoteableData?.id,
+ issueId: this.getNoteableData?.id,
},
});
},
diff --git a/app/assets/javascripts/issues/show/mixins/update.js b/app/assets/javascripts/issues/show/mixins/update.js
index 72be65b426f..31b29de580c 100644
--- a/app/assets/javascripts/issues/show/mixins/update.js
+++ b/app/assets/javascripts/issues/show/mixins/update.js
@@ -3,7 +3,6 @@ import eventHub from '../event_hub';
export default {
methods: {
updateIssuable() {
- this.formState.updateLoading = true;
eventHub.$emit('update.issuable');
},
},
diff --git a/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue b/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue
index 88005cccd89..9b36642feb7 100644
--- a/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue
+++ b/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue
@@ -7,6 +7,7 @@ import {
GlAvatarLabeled,
} from '@gitlab/ui';
import { __ } from '~/locale';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
import { PROJECTS_PER_PAGE } from '../constants';
import getProjectsQuery from '../graphql/queries/get_projects.query.graphql';
@@ -80,6 +81,7 @@ export default {
i18n: {
selectProjectText: __('Select a project'),
},
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
@@ -107,7 +109,7 @@ export default {
>
<gl-avatar-labeled
class="gl-text-truncate"
- shape="rect"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
:size="32"
:src="project.avatarUrl"
:label="project.name"
diff --git a/app/assets/javascripts/jira_connect/branches/graphql/queries/get_projects.query.graphql b/app/assets/javascripts/jira_connect/branches/graphql/queries/get_projects.query.graphql
index 03e8e3e986b..d9fba40688d 100644
--- a/app/assets/javascripts/jira_connect/branches/graphql/queries/get_projects.query.graphql
+++ b/app/assets/javascripts/jira_connect/branches/graphql/queries/get_projects.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query jiraGetProjects(
$search: String!
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue b/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue
index 005c3bcd0e3..1fc40e5c0d6 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue
@@ -43,7 +43,9 @@ export default {
message: s__(
'Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}',
),
- linkUrl: helpPagePath('integration/jira_development_panel.html', { anchor: 'usage' }),
+ linkUrl: helpPagePath('integration/jira_development_panel.html', {
+ anchor: 'use-the-integration',
+ }),
variant: 'success',
});
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
index afdb414e82c..51db3e784aa 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
@@ -3,12 +3,15 @@ import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
import { isEmpty } from 'lodash';
import { mapState, mapMutations } from 'vuex';
import { retrieveAlert } from '~/jira_connect/subscriptions/utils';
+import AccessorUtilities from '~/lib/utils/accessor';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { I18N_DEFAULT_SIGN_IN_ERROR_MESSAGE } from '../constants';
import { SET_ALERT } from '../store/mutation_types';
import SignInPage from '../pages/sign_in.vue';
import SubscriptionsPage from '../pages/subscriptions.vue';
import UserLink from './user_link.vue';
import CompatibilityAlert from './compatibility_alert.vue';
+import BrowserSupportAlert from './browser_support_alert.vue';
export default {
name: 'JiraConnectApp',
@@ -18,9 +21,11 @@ export default {
GlSprintf,
UserLink,
CompatibilityAlert,
+ BrowserSupportAlert,
SignInPage,
SubscriptionsPage,
},
+ mixins: [glFeatureFlagMixin()],
inject: {
usersPath: {
default: '',
@@ -45,6 +50,16 @@ export default {
userSignedIn() {
return Boolean(!this.usersPath || this.user);
},
+ isOauthEnabled() {
+ return this.glFeatures.jiraConnectOauth;
+ },
+ /**
+ * Returns false if the GitLab for Jira app doesn't support the user's browser.
+ * Any web API that the GitLab for Jira app depends on should be checked here.
+ */
+ isBrowserSupported() {
+ return !this.isOauthEnabled || AccessorUtilities.canUseCrypto();
+ },
},
created() {
this.setInitialAlert();
@@ -71,14 +86,15 @@ export default {
</script>
<template>
- <div>
- <compatibility-alert />
+ <browser-support-alert v-if="!isBrowserSupported" class="gl-mb-7" />
+ <div v-else data-testid="jira-connect-app">
+ <compatibility-alert class="gl-mb-7" />
<gl-alert
v-if="shouldShowAlert"
- class="gl-mb-7"
:variant="alert.variant"
:title="alert.title"
+ class="gl-mb-5"
data-testid="jira-connect-persisted-alert"
@dismiss="setAlert"
>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/browser_support_alert.vue b/app/assets/javascripts/jira_connect/subscriptions/components/browser_support_alert.vue
new file mode 100644
index 00000000000..ea7db5be0c4
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/browser_support_alert.vue
@@ -0,0 +1,30 @@
+<script>
+import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
+
+export default {
+ name: 'BrowserSupportAlert',
+ components: {
+ GlAlert,
+ GlSprintf,
+ GlLink,
+ },
+ i18n: {
+ title: s__('Integrations|Your browser is not supported'),
+ body: s__(
+ 'Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app.',
+ ),
+ },
+ DOCS_LINK_URL: helpPagePath('install/requirements', { anchor: 'supported-web-browsers' }),
+};
+</script>
+<template>
+ <gl-alert variant="danger" :title="$options.i18n.title" :dismissible="false">
+ <gl-sprintf :message="$options.i18n.body">
+ <template #link="{ content }">
+ <gl-link :href="$options.DOCS_LINK_URL" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
+</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/compatibility_alert.vue b/app/assets/javascripts/jira_connect/subscriptions/components/compatibility_alert.vue
index 3cfbd87ac53..c5b56535247 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/compatibility_alert.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/compatibility_alert.vue
@@ -46,16 +46,13 @@ export default {
>
<gl-alert
v-if="shouldShowAlert"
- class="gl-mb-7"
variant="info"
:title="$options.i18n.title"
@dismiss="dismissAlert"
>
<gl-sprintf :message="$options.i18n.body">
<template #link="{ content }">
- <gl-link :href="$options.DOCS_LINK_URL" target="_blank" rel="noopener noreferrer">{{
- content
- }}</gl-link>
+ <gl-link :href="$options.DOCS_LINK_URL" target="_blank">{{ content }}</gl-link>
</template>
</gl-sprintf>
</gl-alert>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/group_item_name.vue b/app/assets/javascripts/jira_connect/subscriptions/components/group_item_name.vue
index e6c172dae9e..509a32460bb 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/group_item_name.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/group_item_name.vue
@@ -1,5 +1,6 @@
<script>
import { GlAvatar, GlIcon } from '@gitlab/ui';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
export default {
components: {
@@ -12,6 +13,7 @@ export default {
required: true,
},
},
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
@@ -19,7 +21,12 @@ export default {
<div class="gl-display-flex gl-align-items-center">
<gl-icon name="folder-o" class="gl-mr-3" />
<div class="gl-display-none gl-flex-shrink-0 gl-sm-display-flex gl-mr-3">
- <gl-avatar :size="32" shape="rect" :entity-name="group.name" :src="group.avatar_url" />
+ <gl-avatar
+ :size="32"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
+ :entity-name="group.name"
+ :src="group.avatar_url"
+ />
</div>
<div>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue b/app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue
index d7ec909cb28..dfed57df7d6 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue
@@ -24,7 +24,7 @@ export default {
canUseCrypto: AccessorUtilities.canUseCrypto(),
};
},
- mounted() {
+ created() {
window.addEventListener('message', this.handleWindowMessage);
},
beforeDestroy() {
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue b/app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue
index 33126040c16..0251728c896 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton, GlTable } from '@gitlab/ui';
+import { GlButton, GlTableLite } from '@gitlab/ui';
import { isEmpty } from 'lodash';
import { mapMutations } from 'vuex';
import { removeSubscription } from '~/jira_connect/subscriptions/api';
@@ -12,7 +12,7 @@ import GroupItemName from './group_item_name.vue';
export default {
components: {
GlButton,
- GlTable,
+ GlTableLite,
GroupItemName,
TimeagoTooltip,
},
@@ -78,7 +78,7 @@ export default {
</script>
<template>
- <gl-table :items="subscriptions" :fields="$options.fields">
+ <gl-table-lite :items="subscriptions" :fields="$options.fields">
<template #cell(name)="{ item }">
<group-item-name :group="item.group" />
</template>
@@ -95,5 +95,5 @@ export default {
>{{ __('Unlink') }}</gl-button
>
</template>
- </gl-table>
+ </gl-table-lite>
</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/index.js b/app/assets/javascripts/jira_connect/subscriptions/index.js
index 320f0f8aa6c..3b584b5fe98 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/index.js
+++ b/app/assets/javascripts/jira_connect/subscriptions/index.js
@@ -1,4 +1,4 @@
-import '../../webpack';
+import '~/webpack';
import setConfigs from '@gitlab/ui/dist/config';
import Vue from 'vue';
@@ -48,4 +48,4 @@ export function initJiraConnect() {
});
}
-document.addEventListener('DOMContentLoaded', initJiraConnect);
+initJiraConnect();
diff --git a/app/assets/javascripts/jira_import/components/jira_import_form.vue b/app/assets/javascripts/jira_import/components/jira_import_form.vue
index 1b6e365fdb2..af4a26a7352 100644
--- a/app/assets/javascripts/jira_import/components/jira_import_form.vue
+++ b/app/assets/javascripts/jira_import/components/jira_import_form.vue
@@ -12,7 +12,7 @@ import {
GlLoadingIcon,
GlSearchBoxByType,
GlSprintf,
- GlTable,
+ GlTableLite,
} from '@gitlab/ui';
import { debounce } from 'lodash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
@@ -45,7 +45,7 @@ export default {
GlLoadingIcon,
GlSearchBoxByType,
GlSprintf,
- GlTable,
+ GlTableLite,
},
currentUsername: gon.current_username,
dropdownLabel,
@@ -295,7 +295,7 @@ export default {
<p>{{ $options.userMappingMessage }}</p>
- <gl-table :fields="$options.tableConfig" :items="userMappings" fixed>
+ <gl-table-lite :fields="$options.tableConfig" :items="userMappings" fixed>
<template #cell(arrow)>
<gl-icon name="arrow-right" :aria-label="__('Will be mapped to')" />
</template>
@@ -326,9 +326,9 @@ export default {
</gl-dropdown-text>
</gl-dropdown>
</template>
- </gl-table>
+ </gl-table-lite>
- <gl-loading-icon v-if="isInitialLoadingState" size="sm" />
+ <gl-loading-icon v-if="isInitialLoadingState" size="md" />
<gl-button
v-if="hasMoreUsers"
@@ -343,7 +343,7 @@ export default {
<gl-button
type="submit"
category="primary"
- variant="success"
+ variant="confirm"
class="js-no-auto-disable"
:loading="isSubmitting"
data-qa-selector="jira_issues_import_button"
diff --git a/app/assets/javascripts/jira_import/index.js b/app/assets/javascripts/jira_import/index.js
index 695a237bf50..c1701cd94c2 100644
--- a/app/assets/javascripts/jira_import/index.js
+++ b/app/assets/javascripts/jira_import/index.js
@@ -20,6 +20,7 @@ export default function mountJiraImportApp() {
return new Vue({
el,
+ name: 'JiraImportRoot',
apolloProvider,
render(createComponent) {
return createComponent(App, {
diff --git a/app/assets/javascripts/jobs/components/environments_block.vue b/app/assets/javascripts/jobs/components/environments_block.vue
index 9d451f94e8a..da72cbeb856 100644
--- a/app/assets/javascripts/jobs/components/environments_block.vue
+++ b/app/assets/javascripts/jobs/components/environments_block.vue
@@ -2,7 +2,7 @@
import { GlSprintf, GlLink } from '@gitlab/ui';
import { isEmpty } from 'lodash';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import { __ } from '../../locale';
+import { __ } from '~/locale';
export default {
creatingEnvironment: 'creating',
diff --git a/app/assets/javascripts/jobs/components/filtered_search/jobs_filtered_search.vue b/app/assets/javascripts/jobs/components/filtered_search/jobs_filtered_search.vue
new file mode 100644
index 00000000000..fe7b7428c6e
--- /dev/null
+++ b/app/assets/javascripts/jobs/components/filtered_search/jobs_filtered_search.vue
@@ -0,0 +1,42 @@
+<script>
+import { GlFilteredSearch } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
+import JobStatusToken from './tokens/job_status_token.vue';
+
+export default {
+ tokenTypes: {
+ status: 'status',
+ },
+ components: {
+ GlFilteredSearch,
+ },
+ computed: {
+ tokens() {
+ return [
+ {
+ type: this.$options.tokenTypes.status,
+ icon: 'status',
+ title: s__('Jobs|Status'),
+ unique: true,
+ token: JobStatusToken,
+ operators: OPERATOR_IS_ONLY,
+ },
+ ];
+ },
+ },
+ methods: {
+ onSubmit(filters) {
+ this.$emit('filterJobsBySearch', filters);
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-filtered-search
+ :placeholder="s__('Jobs|Filter jobs')"
+ :available-tokens="tokens"
+ @submit="onSubmit"
+ />
+</template>
diff --git a/app/assets/javascripts/jobs/components/filtered_search/tokens/job_status_token.vue b/app/assets/javascripts/jobs/components/filtered_search/tokens/job_status_token.vue
new file mode 100644
index 00000000000..aad86ded80a
--- /dev/null
+++ b/app/assets/javascripts/jobs/components/filtered_search/tokens/job_status_token.vue
@@ -0,0 +1,122 @@
+<script>
+import { GlFilteredSearchToken, GlFilteredSearchSuggestion, GlIcon } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+export default {
+ components: {
+ GlFilteredSearchToken,
+ GlFilteredSearchSuggestion,
+ GlIcon,
+ },
+ props: {
+ config: {
+ type: Object,
+ required: true,
+ },
+ value: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ statuses() {
+ return [
+ {
+ class: 'ci-status-icon-canceled',
+ icon: 'status_canceled',
+ text: s__('Job|Canceled'),
+ value: 'CANCELED',
+ },
+ {
+ class: 'ci-status-icon-created',
+ icon: 'status_created',
+ text: s__('Job|Created'),
+ value: 'CREATED',
+ },
+ {
+ class: 'ci-status-icon-failed',
+ icon: 'status_failed',
+ text: s__('Job|Failed'),
+ value: 'FAILED',
+ },
+ {
+ class: 'ci-status-icon-manual',
+ icon: 'status_manual',
+ text: s__('Job|Manual'),
+ value: 'MANUAL',
+ },
+ {
+ class: 'ci-status-icon-success',
+ icon: 'status_success',
+ text: s__('Job|Passed'),
+ value: 'SUCCESS',
+ },
+ {
+ class: 'ci-status-icon-pending',
+ icon: 'status_pending',
+ text: s__('Job|Pending'),
+ value: 'PENDING',
+ },
+ {
+ class: 'ci-status-icon-preparing',
+ icon: 'status_preparing',
+ text: s__('Job|Preparing'),
+ value: 'PREPARING',
+ },
+ {
+ class: 'ci-status-icon-running',
+ icon: 'status_running',
+ text: s__('Job|Running'),
+ value: 'RUNNING',
+ },
+ {
+ class: 'ci-status-icon-scheduled',
+ icon: 'status_scheduled',
+ text: s__('Job|Scheduled'),
+ value: 'SCHEDULED',
+ },
+ {
+ class: 'ci-status-icon-skipped',
+ icon: 'status_skipped',
+ text: s__('Job|Skipped'),
+ value: 'SKIPPED',
+ },
+ {
+ class: 'ci-status-icon-waiting-for-resource',
+ icon: 'status-waiting',
+ text: s__('Job|Waiting for resource'),
+ value: 'WAITING_FOR_RESOURCE',
+ },
+ ];
+ },
+ findActiveStatus() {
+ return this.statuses.find((status) => status.value === this.value.data);
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-filtered-search-token v-bind="{ ...$props, ...$attrs }" v-on="$listeners">
+ <template #view>
+ <div class="gl-display-flex gl-align-items-center">
+ <div :class="findActiveStatus.class">
+ <gl-icon :name="findActiveStatus.icon" class="gl-mr-2 gl-display-block" />
+ </div>
+ <span>{{ findActiveStatus.text }}</span>
+ </div>
+ </template>
+ <template #suggestions>
+ <gl-filtered-search-suggestion
+ v-for="(status, index) in statuses"
+ :key="index"
+ :value="status.value"
+ >
+ <div class="gl-display-flex" :class="status.class">
+ <gl-icon :name="status.icon" class="gl-mr-3" />
+ <span>{{ status.text }}</span>
+ </div>
+ </gl-filtered-search-suggestion>
+ </template>
+ </gl-filtered-search-token>
+</template>
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 753a15871ab..f16e0287d5d 100644
--- a/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
+++ b/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
@@ -171,6 +171,7 @@ export default {
data-testid="cancel-button"
icon="cancel"
:title="$options.CANCEL"
+ :aria-label="$options.CANCEL"
:disabled="cancelBtnDisabled"
@click="cancelJob()"
/>
@@ -182,6 +183,7 @@ export default {
v-gl-modal-directive="$options.playJobModalId"
icon="play"
:title="$options.ACTIONS_START_NOW"
+ :aria-label="$options.ACTIONS_START_NOW"
data-testid="play-scheduled"
/>
<gl-modal
@@ -196,6 +198,7 @@ export default {
<gl-button
icon="time-out"
:title="$options.ACTIONS_UNSCHEDULE"
+ :aria-label="$options.ACTIONS_UNSCHEDULE"
:disabled="unscheduleBtnDisabled"
data-testid="unschedule"
@click="unscheduleJob()"
@@ -207,6 +210,7 @@ export default {
v-if="manualJobPlayable"
icon="play"
:title="$options.ACTIONS_PLAY"
+ :aria-label="$options.ACTIONS_PLAY"
:disabled="playManualBtnDisabled"
data-testid="play"
@click="playJob()"
@@ -215,6 +219,7 @@ export default {
v-else-if="isRetryable"
icon="repeat"
:title="$options.ACTIONS_RETRY"
+ :aria-label="$options.ACTIONS_RETRY"
:method="currentJobMethod"
:disabled="retryBtnDisabled"
data-testid="retry"
@@ -226,6 +231,7 @@ export default {
v-if="shouldDisplayArtifacts"
icon="download"
:title="$options.ACTIONS_DOWNLOAD_ARTIFACTS"
+ :aria-label="$options.ACTIONS_DOWNLOAD_ARTIFACTS"
:href="artifactDownloadPath"
rel="nofollow"
download
diff --git a/app/assets/javascripts/jobs/components/table/cells/duration_cell.vue b/app/assets/javascripts/jobs/components/table/cells/duration_cell.vue
index 19594c4955d..120f01db8f0 100644
--- a/app/assets/javascripts/jobs/components/table/cells/duration_cell.vue
+++ b/app/assets/javascripts/jobs/components/table/cells/duration_cell.vue
@@ -1,6 +1,6 @@
<script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
-import timeagoMixin from '~/vue_shared/mixins/timeago';
+import { formatDate, getTimeago, durationTimeFormatted } from '~/lib/utils/datetime_utility';
export default {
iconSize: 12,
@@ -10,7 +10,6 @@ export default {
components: {
GlIcon,
},
- mixins: [timeagoMixin],
props: {
job: {
type: Object,
@@ -24,6 +23,15 @@ export default {
duration() {
return this.job?.duration;
},
+ timeFormatted() {
+ return getTimeago().format(this.finishedTime);
+ },
+ tooltipTitle() {
+ return formatDate(this.finishedTime);
+ },
+ durationFormatted() {
+ return durationTimeFormatted(this.duration);
+ },
},
};
</script>
@@ -32,18 +40,18 @@ export default {
<div>
<div v-if="duration" data-testid="job-duration">
<gl-icon name="timer" :size="$options.iconSize" data-testid="duration-icon" />
- {{ durationTimeFormatted(duration) }}
+ {{ durationFormatted }}
</div>
<div v-if="finishedTime" data-testid="job-finished-time">
<gl-icon name="calendar" :size="$options.iconSize" data-testid="finished-time-icon" />
<time
v-gl-tooltip
- :title="tooltipTitle(finishedTime)"
+ :title="tooltipTitle"
:datetime="finishedTime"
data-placement="top"
data-container="body"
>
- {{ timeFormatted(finishedTime) }}
+ {{ timeFormatted }}
</time>
</div>
</div>
diff --git a/app/assets/javascripts/jobs/components/table/constants.js b/app/assets/javascripts/jobs/components/table/constants.js
index 951d9324813..853834ed51d 100644
--- a/app/assets/javascripts/jobs/components/table/constants.js
+++ b/app/assets/javascripts/jobs/components/table/constants.js
@@ -4,6 +4,9 @@ import { DEFAULT_TH_CLASSES } from '~/lib/utils/constants';
/* Error constants */
export const POST_FAILURE = 'post_failure';
export const DEFAULT = 'default';
+export const RAW_TEXT_WARNING = s__(
+ 'Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens.',
+);
/* Job Status Constants */
export const JOB_SCHEDULED = 'SCHEDULED';
diff --git a/app/assets/javascripts/jobs/components/table/graphql/cache_config.js b/app/assets/javascripts/jobs/components/table/graphql/cache_config.js
index b9946925c95..8bcd7ffd10f 100644
--- a/app/assets/javascripts/jobs/components/table/graphql/cache_config.js
+++ b/app/assets/javascripts/jobs/components/table/graphql/cache_config.js
@@ -13,16 +13,40 @@ export default {
merge(existing = {}, incoming, { args = {} }) {
let nodes;
+ const areNodesEqual = isEqual(existing.nodes, incoming.nodes);
+ const statuses = Array.isArray(args.statuses) ? [...args.statuses] : args.statuses;
+ const { pageInfo } = incoming;
+
if (Object.keys(existing).length !== 0 && isEqual(existing?.statuses, args?.statuses)) {
- nodes = [...existing.nodes, ...incoming.nodes];
+ if (areNodesEqual) {
+ if (incoming.pageInfo.hasNextPage) {
+ nodes = [...existing.nodes, ...incoming.nodes];
+ } else {
+ nodes = [...incoming.nodes];
+ }
+ } else {
+ if (!existing.pageInfo?.hasNextPage) {
+ nodes = [...incoming.nodes];
+
+ return {
+ nodes,
+ statuses,
+ pageInfo,
+ count: incoming.count,
+ };
+ }
+
+ nodes = [...existing.nodes, ...incoming.nodes];
+ }
} else {
nodes = [...incoming.nodes];
}
return {
nodes,
- statuses: Array.isArray(args.statuses) ? [...args.statuses] : args.statuses,
- pageInfo: incoming.pageInfo,
+ statuses,
+ pageInfo,
+ count: incoming.count,
};
},
},
diff --git a/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql
index 151e49af87e..f3ca958b3ca 100644
--- a/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql
+++ b/app/assets/javascripts/jobs/components/table/graphql/queries/get_jobs.query.graphql
@@ -3,6 +3,7 @@ query getJobs($fullPath: ID!, $after: String, $statuses: [CiJobStatus!]) {
id
__typename
jobs(after: $after, first: 30, statuses: $statuses) {
+ count
pageInfo {
endCursor
hasNextPage
diff --git a/app/assets/javascripts/jobs/components/table/index.js b/app/assets/javascripts/jobs/components/table/index.js
index 1b9c7cdcfdd..88da1169e01 100644
--- a/app/assets/javascripts/jobs/components/table/index.js
+++ b/app/assets/javascripts/jobs/components/table/index.js
@@ -27,7 +27,6 @@ export default (containerId = 'js-jobs-table') => {
const {
fullPath,
- jobCounts,
jobStatuses,
pipelineEditorPath,
emptyStateSvgPath,
@@ -42,7 +41,6 @@ export default (containerId = 'js-jobs-table') => {
fullPath,
pipelineEditorPath,
jobStatuses: JSON.parse(jobStatuses),
- jobCounts: JSON.parse(jobCounts),
admin: parseBoolean(admin),
},
render(createElement) {
diff --git a/app/assets/javascripts/jobs/components/table/jobs_table_app.vue b/app/assets/javascripts/jobs/components/table/jobs_table_app.vue
index 864e322eecd..3ea50dfb7a3 100644
--- a/app/assets/javascripts/jobs/components/table/jobs_table_app.vue
+++ b/app/assets/javascripts/jobs/components/table/jobs_table_app.vue
@@ -1,26 +1,34 @@
<script>
import { GlAlert, GlSkeletonLoader, GlIntersectionObserver, GlLoadingIcon } from '@gitlab/ui';
import { __ } from '~/locale';
+import createFlash from '~/flash';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import JobsFilteredSearch from '../filtered_search/jobs_filtered_search.vue';
import eventHub from './event_hub';
import GetJobs from './graphql/queries/get_jobs.query.graphql';
import JobsTable from './jobs_table.vue';
import JobsTableEmptyState from './jobs_table_empty_state.vue';
import JobsTableTabs from './jobs_table_tabs.vue';
+import { RAW_TEXT_WARNING } from './constants';
export default {
i18n: {
errorMsg: __('There was an error fetching the jobs for your project.'),
loadingAriaLabel: __('Loading'),
},
+ filterSearchBoxStyles:
+ 'gl-my-0 gl-p-5 gl-bg-gray-10 gl-text-gray-900 gl-border-gray-100 gl-border-b',
components: {
GlAlert,
GlSkeletonLoader,
+ JobsFilteredSearch,
JobsTable,
JobsTableEmptyState,
JobsTableTabs,
GlIntersectionObserver,
GlLoadingIcon,
},
+ mixins: [glFeatureFlagMixin()],
inject: {
fullPath: {
default: '',
@@ -35,10 +43,11 @@ export default {
};
},
update(data) {
- const { jobs: { nodes: list = [], pageInfo = {} } = {} } = data.project || {};
+ const { jobs: { nodes: list = [], pageInfo = {}, count } = {} } = data.project || {};
return {
list,
pageInfo,
+ count,
};
},
error() {
@@ -54,19 +63,52 @@ export default {
hasError: false,
isAlertDismissed: false,
scope: null,
- firstLoad: true,
+ infiniteScrollingTriggered: false,
+ filterSearchTriggered: false,
+ count: 0,
};
},
computed: {
+ loading() {
+ return this.$apollo.queries.jobs.loading;
+ },
shouldShowAlert() {
return this.hasError && !this.isAlertDismissed;
},
+ // Show when on All tab with no jobs
+ // Show only when not loading and filtered search has not been triggered
+ // So we don't show empty state when results are empty on a filtered search
showEmptyState() {
- return this.jobs.list.length === 0 && !this.scope;
+ return (
+ this.jobs.list.length === 0 && !this.scope && !this.loading && !this.filterSearchTriggered
+ );
},
hasNextPage() {
return this.jobs?.pageInfo?.hasNextPage;
},
+ showLoadingSpinner() {
+ return this.loading && this.infiniteScrollingTriggered;
+ },
+ showSkeletonLoader() {
+ return this.loading && !this.showLoadingSpinner;
+ },
+ showFilteredSearch() {
+ return this.glFeatures?.jobsTableVueSearch && !this.scope;
+ },
+ jobsCount() {
+ return this.jobs.count;
+ },
+ },
+ watch: {
+ // this watcher ensures that the count on the all tab
+ // is not updated when switching to the finished tab
+ jobsCount(newCount, oldCount) {
+ if (this.scope) {
+ this.count = oldCount;
+ } else {
+ this.count = newCount;
+ }
+ },
},
mounted() {
eventHub.$on('jobActionPerformed', this.handleJobAction);
@@ -79,16 +121,38 @@ export default {
this.$apollo.queries.jobs.refetch({ statuses: this.scope });
},
fetchJobsByStatus(scope) {
- this.firstLoad = true;
+ this.infiniteScrollingTriggered = false;
this.scope = scope;
this.$apollo.queries.jobs.refetch({ statuses: scope });
},
+ filterJobsBySearch(filters) {
+ this.infiniteScrollingTriggered = false;
+ this.filterSearchTriggered = true;
+
+ // Eventually there will be more tokens available
+ // this code is written to scale for those tokens
+ filters.forEach((filter) => {
+ // Raw text input in filtered search does not have a type
+ // when a user enters raw text we alert them that it is
+ // not supported and we do not make an additional API call
+ if (!filter.type) {
+ createFlash({
+ message: RAW_TEXT_WARNING,
+ type: 'warning',
+ });
+ }
+
+ if (filter.type === 'status') {
+ this.$apollo.queries.jobs.refetch({ statuses: filter.value.data });
+ }
+ });
+ },
fetchMoreJobs() {
- this.firstLoad = false;
+ if (!this.loading) {
+ this.infiniteScrollingTriggered = true;
- if (!this.$apollo.queries.jobs.loading) {
this.$apollo.queries.jobs.fetchMore({
variables: {
fullPath: this.fullPath,
@@ -113,9 +177,19 @@ export default {
{{ $options.i18n.errorMsg }}
</gl-alert>
- <jobs-table-tabs @fetchJobsByStatus="fetchJobsByStatus" />
+ <jobs-table-tabs
+ :all-jobs-count="count"
+ :loading="loading"
+ @fetchJobsByStatus="fetchJobsByStatus"
+ />
+
+ <jobs-filtered-search
+ v-if="showFilteredSearch"
+ :class="$options.filterSearchBoxStyles"
+ @filterJobsBySearch="filterJobsBySearch"
+ />
- <div v-if="$apollo.loading && firstLoad" class="gl-mt-5">
+ <div v-if="showSkeletonLoader" class="gl-mt-5">
<gl-skeleton-loader :width="1248" :height="73">
<circle cx="748.031" cy="37.7193" r="15.0307" />
<circle cx="787.241" cy="37.7193" r="15.0307" />
@@ -138,7 +212,7 @@ export default {
<gl-intersection-observer v-if="hasNextPage" @appear="fetchMoreJobs">
<gl-loading-icon
- v-if="$apollo.loading"
+ v-if="showLoadingSpinner"
size="md"
:aria-label="$options.i18n.loadingAriaLabel"
/>
diff --git a/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue b/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue
index 26791e4284d..0a25dc5bea5 100644
--- a/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue
+++ b/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue
@@ -1,56 +1,56 @@
<script>
-import { GlBadge, GlTab, GlTabs } from '@gitlab/ui';
-import { __ } from '~/locale';
+import { GlBadge, GlTab, GlTabs, GlLoadingIcon } from '@gitlab/ui';
+import { s__ } from '~/locale';
export default {
components: {
GlBadge,
GlTab,
GlTabs,
+ GlLoadingIcon,
},
inject: {
- jobCounts: {
- default: {},
- },
jobStatuses: {
default: {},
},
},
+ props: {
+ allJobsCount: {
+ type: Number,
+ required: true,
+ },
+ loading: {
+ type: Boolean,
+ required: true,
+ },
+ },
computed: {
tabs() {
return [
{
- text: __('All'),
- count: this.jobCounts.all,
+ text: s__('Jobs|All'),
+ count: this.allJobsCount,
scope: null,
testId: 'jobs-all-tab',
+ showBadge: true,
},
{
- text: __('Pending'),
- count: this.jobCounts.pending,
- scope: this.jobStatuses.pending,
- testId: 'jobs-pending-tab',
- },
- {
- text: __('Running'),
- count: this.jobCounts.running,
- scope: this.jobStatuses.running,
- testId: 'jobs-running-tab',
- },
- {
- text: __('Finished'),
- count: this.jobCounts.finished,
+ text: s__('Jobs|Finished'),
scope: [this.jobStatuses.success, this.jobStatuses.failed, this.jobStatuses.canceled],
testId: 'jobs-finished-tab',
+ showBadge: false,
},
];
},
+ showLoadingIcon() {
+ return this.loading && !this.allJobsCount;
+ },
},
};
</script>
<template>
- <gl-tabs content-class="gl-pb-0">
+ <gl-tabs content-class="gl-py-0">
<gl-tab
v-for="tab in tabs"
:key="tab.text"
@@ -59,7 +59,11 @@ export default {
>
<template #title>
<span>{{ tab.text }}</span>
- <gl-badge size="sm" class="gl-tab-counter-badge">{{ tab.count }}</gl-badge>
+ <gl-loading-icon v-if="showLoadingIcon && tab.showBadge" class="gl-ml-2" />
+
+ <gl-badge v-else-if="tab.showBadge" size="sm" class="gl-tab-counter-badge">
+ {{ tab.count }}
+ </gl-badge>
</template>
</gl-tab>
</gl-tabs>
diff --git a/app/assets/javascripts/jobs/components/trigger_block.vue b/app/assets/javascripts/jobs/components/trigger_block.vue
index b1ddede8fe8..1afc1c9a595 100644
--- a/app/assets/javascripts/jobs/components/trigger_block.vue
+++ b/app/assets/javascripts/jobs/components/trigger_block.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton, GlTable } from '@gitlab/ui';
+import { GlButton, GlTableLite } from '@gitlab/ui';
import { __ } from '~/locale';
const DEFAULT_TD_CLASSES = 'gl-w-half gl-font-sm! gl-border-gray-200!';
@@ -25,7 +25,7 @@ export default {
],
components: {
GlButton,
- GlTable,
+ GlTableLite,
},
props: {
trigger: {
@@ -84,7 +84,7 @@ export default {
>
</p>
- <gl-table :items="trigger.variables" :fields="$options.fields" small bordered fixed>
+ <gl-table-lite :items="trigger.variables" :fields="$options.fields" small bordered fixed>
<template #cell(key)="{ item }">
<span class="gl-overflow-break-word">{{ item.key }}</span>
</template>
@@ -92,7 +92,7 @@ export default {
<template #cell(value)="data">
<span class="gl-overflow-break-word">{{ getDisplayValue(data.value) }}</span>
</template>
- </gl-table>
+ </gl-table-lite>
</template>
</div>
</template>
diff --git a/app/assets/javascripts/jobs/store/utils.js b/app/assets/javascripts/jobs/store/utils.js
index 8bca448ee11..7dfe24afa23 100644
--- a/app/assets/javascripts/jobs/store/utils.js
+++ b/app/assets/javascripts/jobs/store/utils.js
@@ -1,4 +1,4 @@
-import { parseBoolean } from '../../lib/utils/common_utils';
+import { parseBoolean } from '~/lib/utils/common_utils';
/**
* Adds the line number property
diff --git a/app/assets/javascripts/lib/gfm/index.js b/app/assets/javascripts/lib/gfm/index.js
new file mode 100644
index 00000000000..07388f1fdfa
--- /dev/null
+++ b/app/assets/javascripts/lib/gfm/index.js
@@ -0,0 +1,38 @@
+import { unified } from 'unified';
+import remarkParse from 'remark-parse';
+import remarkRehype from 'remark-rehype';
+import rehypeRaw from 'rehype-raw';
+
+const createParser = () => {
+ return unified().use(remarkParse).use(remarkRehype, { allowDangerousHtml: true }).use(rehypeRaw);
+};
+
+const compilerFactory = (renderer) =>
+ function compiler() {
+ Object.assign(this, {
+ Compiler(tree) {
+ return renderer(tree);
+ },
+ });
+ };
+
+/**
+ * Parses a Markdown string and provides the result Abstract
+ * Syntax Tree (AST) to a renderer function to convert the
+ * tree in any desired representation
+ *
+ * @param {String} params.markdown Markdown to parse
+ * @param {(tree: MDast -> any)} params.renderer A function that accepts mdast
+ * AST tree and returns an object of any type that represents the result of
+ * rendering the tree. See the references below to for more information
+ * about MDast.
+ *
+ * MDastTree documentation https://github.com/syntax-tree/mdast
+ * @returns {Promise<any>} Returns a promise with the result of rendering
+ * the MDast tree
+ */
+export const render = async ({ markdown, renderer }) => {
+ const { value } = await createParser().use(compilerFactory(renderer)).process(markdown);
+
+ return value;
+};
diff --git a/app/assets/javascripts/lib/graphql.js b/app/assets/javascripts/lib/graphql.js
index f533ba3671c..451950346b0 100644
--- a/app/assets/javascripts/lib/graphql.js
+++ b/app/assets/javascripts/lib/graphql.js
@@ -3,7 +3,7 @@ import { BatchHttpLink } from '@apollo/client/link/batch-http';
import { createUploadLink } from 'apollo-upload-client';
import ActionCableLink from '~/actioncable_link';
import { apolloCaptchaLink } from '~/captcha/apollo_captcha_link';
-import possibleTypes from '~/graphql_shared/possibleTypes.json';
+import possibleTypes from '~/graphql_shared/possible_types.json';
import { StartupJSLink } from '~/lib/utils/apollo_startup_js_link';
import csrf from '~/lib/utils/csrf';
import { objectToQuery, queryToObject } from '~/lib/utils/url_utility';
@@ -47,6 +47,9 @@ export const typePolicies = {
DesignCollection: {
merge: true,
},
+ TreeEntry: {
+ keyFields: ['webPath'],
+ },
};
export const stripWhitespaceFromQuery = (url, path) => {
diff --git a/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue b/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue
index f3380b7b4ba..1d8eb73d3d7 100644
--- a/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue
+++ b/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue
@@ -26,6 +26,16 @@ export default {
required: false,
default: 'confirm',
},
+ secondaryText: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ secondaryVariant: {
+ type: String,
+ required: false,
+ default: 'confirm',
+ },
modalHtmlMessage: {
type: String,
required: false,
@@ -39,7 +49,26 @@ export default {
},
computed: {
primaryAction() {
- return { text: this.primaryText, attributes: { variant: this.primaryVariant } };
+ return {
+ text: this.primaryText,
+ attributes: {
+ variant: this.primaryVariant,
+ 'data-qa-selector': 'confirm_ok_button',
+ },
+ };
+ },
+ secondaryAction() {
+ if (!this.secondaryText) {
+ return null;
+ }
+
+ return {
+ text: this.secondaryText,
+ attributes: {
+ variant: this.secondaryVariant,
+ category: 'secondary',
+ },
+ };
},
cancelAction() {
return this.hideCancel ? null : this.$options.cancelAction;
@@ -63,6 +92,7 @@ export default {
:title="title"
:action-primary="primaryAction"
:action-cancel="cancelAction"
+ :action-secondary="secondaryAction"
:hide-header="!shouldShowHeader"
@primary="$emit('confirmed')"
@hidden="$emit('closed')"
diff --git a/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js b/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js
index a8a89d0644a..1adb6f9c26f 100644
--- a/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js
+++ b/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js
@@ -2,7 +2,15 @@ import Vue from 'vue';
export function confirmAction(
message,
- { primaryBtnVariant, primaryBtnText, modalHtmlMessage, title, hideCancel } = {},
+ {
+ primaryBtnVariant,
+ primaryBtnText,
+ secondaryBtnVariant,
+ secondaryBtnText,
+ modalHtmlMessage,
+ title,
+ hideCancel,
+ } = {},
) {
return new Promise((resolve) => {
let confirmed = false;
@@ -16,6 +24,8 @@ export function confirmAction(
'confirm-modal',
{
props: {
+ secondaryText: secondaryBtnText,
+ secondaryVariant: secondaryBtnVariant,
primaryVariant: primaryBtnVariant,
primaryText: primaryBtnText,
title,
diff --git a/app/assets/javascripts/lib/utils/css_utils.js b/app/assets/javascripts/lib/utils/css_utils.js
index 76ac442a470..e4f68dd1b6c 100644
--- a/app/assets/javascripts/lib/utils/css_utils.js
+++ b/app/assets/javascripts/lib/utils/css_utils.js
@@ -19,3 +19,7 @@ export function loadCSSFile(path) {
}
});
}
+
+export function getCssVariable(variable) {
+ return getComputedStyle(document.documentElement).getPropertyValue(variable).trim();
+}
diff --git a/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js b/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js
index 396c1703c1e..4e7086e62c5 100644
--- a/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js
@@ -1,5 +1,5 @@
import { isNumber } from 'lodash';
-import { __, n__ } from '../../../locale';
+import { __, n__ } from '~/locale';
import { getDayName, parseSeconds } from './date_format_utility';
const DAYS_IN_WEEK = 7;
@@ -189,13 +189,21 @@ export const getDateInFuture = (date, daysInFuture) =>
*/
export const isValidDate = (date) => date instanceof Date && !Number.isNaN(date.getTime());
-/*
+/**
* Appending T00:00:00 makes JS assume local time and prevents it from shifting the date
* to match the user's time zone. We want to display the date in server time for now, to
* be consistent with the "edit issue -> due date" UI.
+ *
+ * @param {String} date Date without time, e.g. `2022-03-22`
+ * @return {Date} new Date object
*/
-
export const newDateAsLocaleTime = (date) => {
+ if (!date || typeof date !== 'string') {
+ return null;
+ }
+ if (date.includes('T')) {
+ return new Date(date);
+ }
const suffix = 'T00:00:00';
return new Date(`${date}${suffix}`);
};
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 7bff2bf3e47..830f4604382 100644
--- a/app/assets/javascripts/lib/utils/datetime/date_format_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime/date_format_utility.js
@@ -2,7 +2,7 @@ import dateFormat from 'dateformat';
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';
+import { s__, n__, __, sprintf } from '~/locale';
/**
* Returns i18n month names array.
@@ -386,3 +386,23 @@ export const formatTimeAsSummary = ({ seconds, hours, days, minutes, weeks, mont
}
return '-';
};
+
+export const durationTimeFormatted = (duration) => {
+ const date = new Date(duration * 1000);
+
+ let hh = date.getUTCHours();
+ let mm = date.getUTCMinutes();
+ let ss = date.getSeconds();
+
+ if (hh < 10) {
+ hh = `0${hh}`;
+ }
+ if (mm < 10) {
+ mm = `0${mm}`;
+ }
+ if (ss < 10) {
+ ss = `0${ss}`;
+ }
+
+ return `${hh}:${mm}:${ss}`;
+};
diff --git a/app/assets/javascripts/lib/utils/datetime/timeago_utility.js b/app/assets/javascripts/lib/utils/datetime/timeago_utility.js
index d68682ebed1..095a29a2eff 100644
--- a/app/assets/javascripts/lib/utils/datetime/timeago_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime/timeago_utility.js
@@ -1,5 +1,5 @@
import * as timeago from 'timeago.js';
-import { languageCode, s__, createDateTimeFormat } from '../../../locale';
+import { languageCode, s__, createDateTimeFormat } from '~/locale';
import { formatDate } from './date_format_utility';
/**
@@ -70,8 +70,41 @@ const memoizedLocale = () => {
};
};
+/**
+ * Registers timeago time duration
+ */
+const memoizedLocaleDuration = () => {
+ const cache = [];
+
+ const durations = [
+ () => [s__('Duration|%s seconds')],
+ () => [s__('Duration|%s seconds')],
+ () => [s__('Duration|1 minute')],
+ () => [s__('Duration|%s minutes')],
+ () => [s__('Duration|1 hour')],
+ () => [s__('Duration|%s hours')],
+ () => [s__('Duration|1 day')],
+ () => [s__('Duration|%s days')],
+ () => [s__('Duration|1 week')],
+ () => [s__('Duration|%s weeks')],
+ () => [s__('Duration|1 month')],
+ () => [s__('Duration|%s months')],
+ () => [s__('Duration|1 year')],
+ () => [s__('Duration|%s years')],
+ ];
+
+ return (_, index) => {
+ if (cache[index]) {
+ return cache[index];
+ }
+ cache[index] = durations[index] && durations[index]();
+ return cache[index];
+ };
+};
+
timeago.register(timeagoLanguageCode, memoizedLocale());
timeago.register(`${timeagoLanguageCode}-remaining`, memoizedLocaleRemaining());
+timeago.register(`${timeagoLanguageCode}-duration`, memoizedLocaleDuration());
let memoizedFormatter = null;
@@ -133,3 +166,16 @@ export const timeFor = (time, expiredLabel) => {
}
return timeago.format(time, `${timeagoLanguageCode}-remaining`).trim();
};
+
+/**
+ * Returns a duration of time given an amount.
+ *
+ * @param {number} milliseconds - Duration in milliseconds.
+ * @returns {string} A formatted duration, e.g. "10 minutes".
+ */
+export const duration = (milliseconds) => {
+ const now = new Date();
+ return timeago
+ .format(now.getTime() - Math.abs(milliseconds), `${timeagoLanguageCode}-duration`)
+ .trim();
+};
diff --git a/app/assets/javascripts/lib/utils/text_markdown.js b/app/assets/javascripts/lib/utils/text_markdown.js
index ac2eb34260c..52fa90c7791 100644
--- a/app/assets/javascripts/lib/utils/text_markdown.js
+++ b/app/assets/javascripts/lib/utils/text_markdown.js
@@ -9,7 +9,10 @@ const LINK_TAG_PATTERN = '[{text}](url)';
// a bullet point character (*+-) and an optional checkbox ([ ] [x])
// OR a number with a . after it and an optional checkbox ([ ] [x])
// followed by one or more whitespace characters
-const LIST_LINE_HEAD_PATTERN = /^(?<indent>\s*)(?<leader>((?<isUl>[*+-])|(?<isOl>\d+\.))( \[([x ])\])?\s)(?<content>.)?/;
+const LIST_LINE_HEAD_PATTERN = /^(?<indent>\s*)(?<leader>((?<isUl>[*+-])|(?<isOl>\d+\.))( \[([xX\s])\])?\s)(?<content>.)?/;
+
+// detect a horizontal rule that might be mistaken for a list item (not full pattern for an <hr>)
+const HR_PATTERN = /^((\s{0,3}-+\s*-+\s*-+\s*[\s-]*)|(\s{0,3}\*+\s*\*+\s*\*+\s*[\s*]*))$/;
function selectedText(text, textarea) {
return text.substring(textarea.selectionStart, textarea.selectionEnd);
@@ -381,16 +384,20 @@ function handleContinueList(e, textArea) {
let itemToInsert;
+ // Behaviors specific to either `ol` or `ul`
if (isOl) {
const nextLine = lineAfter(textArea.value, textArea, false);
const nextLineResult = nextLine.match(LIST_LINE_HEAD_PATTERN);
itemToInsert = continueOlText(result, nextLineResult);
} else {
- // isUl
+ if (currentLine.match(HR_PATTERN)) return;
+
itemToInsert = `${indent}${leader}`;
}
+ itemToInsert = itemToInsert.replace(/\[x\]/i, '[ ]');
+
e.preventDefault();
updateText({
diff --git a/app/assets/javascripts/lib/utils/unit_format/formatter_factory.js b/app/assets/javascripts/lib/utils/unit_format/formatter_factory.js
index 418cc69bf5a..08c32944181 100644
--- a/app/assets/javascripts/lib/utils/unit_format/formatter_factory.js
+++ b/app/assets/javascripts/lib/utils/unit_format/formatter_factory.js
@@ -5,7 +5,7 @@ import { formatNumber } from '~/locale';
*
* @param {Number} number to be converted
*
- * @param {options.maxCharLength} Max output char length at the
+ * @param {options.maxLength} Max output char length at the
* expense of precision, if the output is longer than this,
* the formatter switches to using exponential notation.
*
@@ -16,10 +16,10 @@ import { formatNumber } from '~/locale';
* `formatNumber` such as `valueFactor`, `unit` and `style`.
*
*/
-const formatNumberNormalized = (value, { maxCharLength, valueFactor = 1, ...options }) => {
+const formatNumberNormalized = (value, { maxLength, valueFactor = 1, ...options }) => {
const formatted = formatNumber(value * valueFactor, options);
- if (maxCharLength !== undefined && formatted.length > maxCharLength) {
+ if (maxLength !== undefined && formatted.length > maxLength) {
// 123456 becomes 1.23e+8
return value.toExponential(2);
}
@@ -27,6 +27,25 @@ const formatNumberNormalized = (value, { maxCharLength, valueFactor = 1, ...opti
};
/**
+ * This function converts the old positional arguments into an options
+ * object.
+ *
+ * This is done so we can support legacy fractionDigits and maxLength as positional
+ * arguments, as well as the better options object.
+ *
+ * @param {Object|Number} options
+ * @returns {Object} options given to the formatter
+ */
+const getFormatterArguments = (options) => {
+ if (typeof options === 'object' && options !== null) {
+ return options;
+ }
+ return {
+ maxLength: options,
+ };
+};
+
+/**
* Formats a number as a string scaling it up according to units.
*
* While the number is scaled down, the units are scaled up.
@@ -40,7 +59,9 @@ const scaledFormatter = (units, unitFactor = 1000) => {
return new RangeError(`unitFactor cannot have the value 0.`);
}
- return (value, fractionDigits) => {
+ return (value, fractionDigits, options) => {
+ const { maxLength, unitSeparator = '' } = getFormatterArguments(options);
+
if (value === null) {
return '';
}
@@ -66,11 +87,13 @@ const scaledFormatter = (units, unitFactor = 1000) => {
}
const unit = units[scale];
+ const length = maxLength !== undefined ? maxLength - unit.length : undefined;
return `${formatNumberNormalized(num, {
+ maxLength: length,
maximumFractionDigits: fractionDigits,
minimumFractionDigits: fractionDigits,
- })}${unit}`;
+ })}${unitSeparator}${unit}`;
};
};
@@ -78,14 +101,16 @@ const scaledFormatter = (units, unitFactor = 1000) => {
* Returns a function that formats a number as a string.
*/
export const numberFormatter = (style = 'decimal', valueFactor = 1) => {
- return (value, fractionDigits, maxCharLength) => {
- return `${formatNumberNormalized(value, {
- maxCharLength,
+ return (value, fractionDigits, options) => {
+ const { maxLength } = getFormatterArguments(options);
+
+ return formatNumberNormalized(value, {
+ maxLength,
valueFactor,
style,
maximumFractionDigits: fractionDigits,
minimumFractionDigits: fractionDigits,
- })}`;
+ });
};
};
@@ -93,15 +118,16 @@ export const numberFormatter = (style = 'decimal', valueFactor = 1) => {
* Returns a function that formats a number as a string with a suffix.
*/
export const suffixFormatter = (unit = '', valueFactor = 1) => {
- return (value, fractionDigits, maxCharLength) => {
- const length = maxCharLength !== undefined ? maxCharLength - unit.length : undefined;
+ return (value, fractionDigits, options) => {
+ const { maxLength, unitSeparator = '' } = getFormatterArguments(options);
+ const length = maxLength !== undefined ? maxLength - unit.length : undefined;
return `${formatNumberNormalized(value, {
- maxCharLength: length,
+ maxLength: length,
valueFactor,
maximumFractionDigits: fractionDigits,
minimumFractionDigits: fractionDigits,
- })}${unit}`;
+ })}${unitSeparator}${unit}`;
};
};
diff --git a/app/assets/javascripts/lib/utils/unit_format/index.js b/app/assets/javascripts/lib/utils/unit_format/index.js
index bc82c6aa74d..5c5210027e4 100644
--- a/app/assets/javascripts/lib/utils/unit_format/index.js
+++ b/app/assets/javascripts/lib/utils/unit_format/index.js
@@ -126,9 +126,11 @@ export const getFormatter = (format = SUPPORTED_FORMATS.engineering) => {
*
* @function
* @param {Number} value - Number to format
- * @param {Number} fractionDigits - precision decimals
- * @param {Number} maxLength - Max length of formatted number
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
* if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const number = getFormatter(SUPPORTED_FORMATS.number);
@@ -137,9 +139,11 @@ export const number = getFormatter(SUPPORTED_FORMATS.number);
*
* @function
* @param {Number} value - Number to format, `1` is rendered as `100%`
- * @param {Number} fractionDigits - number of precision decimals
- * @param {Number} maxLength - Max length of formatted number
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
* if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const percent = getFormatter(SUPPORTED_FORMATS.percent);
@@ -148,9 +152,11 @@ export const percent = getFormatter(SUPPORTED_FORMATS.percent);
*
* @function
* @param {Number} value - Number to format, `100` is rendered as `100%`
- * @param {Number} fractionDigits - number of precision decimals
- * @param {Number} maxLength - Max length of formatted number
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
* if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const percentHundred = getFormatter(SUPPORTED_FORMATS.percentHundred);
@@ -159,9 +165,11 @@ export const percentHundred = getFormatter(SUPPORTED_FORMATS.percentHundred);
*
* @function
* @param {Number} value - Number to format, `1` is rendered as `1s`
- * @param {Number} fractionDigits - number of precision decimals
- * @param {Number} maxLength - Max length of formatted number
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
* if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const seconds = getFormatter(SUPPORTED_FORMATS.seconds);
@@ -170,9 +178,11 @@ export const seconds = getFormatter(SUPPORTED_FORMATS.seconds);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1ms`
- * @param {Number} fractionDigits - number of precision decimals
- * @param {Number} maxLength - Max length of formatted number
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
* if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const milliseconds = getFormatter(SUPPORTED_FORMATS.milliseconds);
@@ -182,7 +192,11 @@ export const milliseconds = getFormatter(SUPPORTED_FORMATS.milliseconds);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1B`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const decimalBytes = getFormatter(SUPPORTED_FORMATS.decimalBytes);
@@ -192,7 +206,11 @@ export const decimalBytes = getFormatter(SUPPORTED_FORMATS.decimalBytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1kB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const kilobytes = getFormatter(SUPPORTED_FORMATS.kilobytes);
@@ -202,7 +220,11 @@ export const kilobytes = getFormatter(SUPPORTED_FORMATS.kilobytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1MB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const megabytes = getFormatter(SUPPORTED_FORMATS.megabytes);
@@ -212,7 +234,11 @@ export const megabytes = getFormatter(SUPPORTED_FORMATS.megabytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1GB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const gigabytes = getFormatter(SUPPORTED_FORMATS.gigabytes);
@@ -222,7 +248,11 @@ export const gigabytes = getFormatter(SUPPORTED_FORMATS.gigabytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1GB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const terabytes = getFormatter(SUPPORTED_FORMATS.terabytes);
@@ -232,7 +262,11 @@ export const terabytes = getFormatter(SUPPORTED_FORMATS.terabytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1PB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const petabytes = getFormatter(SUPPORTED_FORMATS.petabytes);
@@ -242,7 +276,11 @@ export const petabytes = getFormatter(SUPPORTED_FORMATS.petabytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1B`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const bytes = getFormatter(SUPPORTED_FORMATS.bytes);
@@ -252,7 +290,11 @@ export const bytes = getFormatter(SUPPORTED_FORMATS.bytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1kB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const kibibytes = getFormatter(SUPPORTED_FORMATS.kibibytes);
@@ -262,7 +304,11 @@ export const kibibytes = getFormatter(SUPPORTED_FORMATS.kibibytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1MB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const mebibytes = getFormatter(SUPPORTED_FORMATS.mebibytes);
@@ -272,7 +318,11 @@ export const mebibytes = getFormatter(SUPPORTED_FORMATS.mebibytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1GB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const gibibytes = getFormatter(SUPPORTED_FORMATS.gibibytes);
@@ -282,7 +332,11 @@ export const gibibytes = getFormatter(SUPPORTED_FORMATS.gibibytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1GB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const tebibytes = getFormatter(SUPPORTED_FORMATS.tebibytes);
@@ -292,7 +346,11 @@ export const tebibytes = getFormatter(SUPPORTED_FORMATS.tebibytes);
*
* @function
* @param {Number} value - Number to format, `1` is formatted as `1PB`
- * @param {Number} fractionDigits - number of precision decimals
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - number of precision decimals
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const pebibytes = getFormatter(SUPPORTED_FORMATS.pebibytes);
@@ -301,6 +359,10 @@ export const pebibytes = getFormatter(SUPPORTED_FORMATS.pebibytes);
*
* @function
* @param {Number} value - Value to format
- * @param {Number} fractionDigits - precision decimals - Defaults to 2
+ * @param {Object} options - Formatting options
+ * @param {Number} options.fractionDigits - precision decimals, defaults to 2
+ * @param {Number} options.maxLength - Max length of formatted number
+ * if length is exceeded, exponential format is used.
+ * @param {String} options.unitSeparator - Separator between value and unit
*/
export const engineering = getFormatter();
diff --git a/app/assets/javascripts/lib/utils/webpack.js b/app/assets/javascripts/lib/utils/webpack.js
index a88f1bd82fc..38d2f3d7551 100644
--- a/app/assets/javascripts/lib/utils/webpack.js
+++ b/app/assets/javascripts/lib/utils/webpack.js
@@ -10,5 +10,5 @@ export function resetServiceWorkersPublicPath() {
// see: https://webpack.js.org/guides/public-path/
const relativeRootPath = (gon && gon.relative_url_root) || '';
const webpackAssetPath = joinPaths(relativeRootPath, '/assets/webpack/');
- __webpack_public_path__ = webpackAssetPath; // eslint-disable-line babel/camelcase
+ __webpack_public_path__ = webpackAssetPath; // eslint-disable-line camelcase
}
diff --git a/app/assets/javascripts/logs/components/environment_logs.vue b/app/assets/javascripts/logs/components/environment_logs.vue
index b0d31ca315e..609592edc3b 100644
--- a/app/assets/javascripts/logs/components/environment_logs.vue
+++ b/app/assets/javascripts/logs/components/environment_logs.vue
@@ -163,7 +163,7 @@ export default {
<gl-sprintf
:message="
s__(
- 'Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0.',
+ 'Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0.',
)
"
>
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index b3cb93e74f2..8fc54be9c28 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -127,7 +127,8 @@ function deferredInitialisation() {
// In case the user started searching before we bootstrapped, let's pass the search along.
const initialSearchValue = searchInputBox.value;
await initHeaderSearchApp(initialSearchValue);
- searchInputBox.focus();
+ // this is new #search input element. We need to re-find it.
+ document.querySelector('#search').focus();
})
.catch(() => {});
} else {
diff --git a/app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue b/app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue
index 00973100e15..112f722c632 100644
--- a/app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue
+++ b/app/assets/javascripts/members/components/action_buttons/approve_access_request_button.vue
@@ -40,7 +40,7 @@ export default {
:title="$options.title"
:aria-label="$options.title"
icon="check"
- variant="success"
+ variant="confirm"
type="submit"
/>
</gl-form>
diff --git a/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue b/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue
index ca60f876c6f..cb7b963b698 100644
--- a/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue
+++ b/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue
@@ -18,6 +18,8 @@ export default {
name: 'MembersFilteredSearchBar',
components: { FilteredSearchBar },
availableTokens: AVAILABLE_FILTERED_SEARCH_TOKENS,
+ searchButtonAttributes: { 'data-qa-selector': 'search_button' },
+ searchInputAttributes: { 'data-qa-selector': 'search_bar_input' },
inject: {
namespace: {},
sourceId: {},
@@ -127,8 +129,9 @@ export default {
:recent-searches-storage-key="filteredSearchBar.recentSearchesStorageKey"
:search-input-placeholder="filteredSearchBar.placeholder"
:initial-filter-value="initialFilterValue"
+ :search-button-attributes="$options.searchButtonAttributes"
+ :search-input-attributes="$options.searchInputAttributes"
data-testid="members-filtered-search-bar"
- data-qa-selector="members_filtered_search_bar_content"
@onFilter="handleFilter"
/>
</template>
diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue
index b4ba9aa36e7..0b97ce7e33e 100644
--- a/app/assets/javascripts/members/components/table/members_table.vue
+++ b/app/assets/javascripts/members/components/table/members_table.vue
@@ -5,6 +5,7 @@ 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 UserDate from '~/vue_shared/components/user_date.vue';
import {
FIELD_KEY_ACTIONS,
FIELDS,
@@ -40,6 +41,7 @@ export default {
RemoveGroupLinkModal,
RemoveMemberModal,
ExpirationDatepicker,
+ UserDate,
LdapOverrideConfirmationModal: () =>
import('ee_component/members/components/ldap/ldap_override_confirmation_modal.vue'),
},
@@ -287,6 +289,14 @@ export default {
</members-table-cell>
</template>
+ <template #cell(userCreatedAt)="{ item: member }">
+ <user-date :date="member.user.createdAt" />
+ </template>
+
+ <template #cell(lastActivityOn)="{ item: member }">
+ <user-date :date="member.user.lastActivityOn" />
+ </template>
+
<template #cell(actions)="{ item: member }">
<members-table-cell #default="{ memberType, isCurrentUser, permissions }" :member="member">
<member-action-buttons
diff --git a/app/assets/javascripts/members/constants.js b/app/assets/javascripts/members/constants.js
index 49ce00a1689..c66a19c4765 100644
--- a/app/assets/javascripts/members/constants.js
+++ b/app/assets/javascripts/members/constants.js
@@ -9,6 +9,8 @@ export const FIELD_KEY_GRANTED = 'granted';
export const FIELD_KEY_INVITED = 'invited';
export const FIELD_KEY_REQUESTED = 'requested';
export const FIELD_KEY_MAX_ROLE = 'maxRole';
+export const FIELD_KEY_USER_CREATED_AT = 'userCreatedAt';
+export const FIELD_KEY_LAST_ACTIVITY_ON = 'lastActivityOn';
export const FIELD_KEY_EXPIRATION = 'expiration';
export const FIELD_KEY_LAST_SIGN_IN = 'lastSignIn';
export const FIELD_KEY_ACTIONS = 'actions';
@@ -67,6 +69,22 @@ export const FIELDS = [
tdClass: 'col-expiration',
},
{
+ key: FIELD_KEY_USER_CREATED_AT,
+ label: __('Created on'),
+ sort: {
+ asc: 'oldest_created_user',
+ desc: 'recent_created_user',
+ },
+ },
+ {
+ key: FIELD_KEY_LAST_ACTIVITY_ON,
+ label: __('Last activity'),
+ sort: {
+ asc: 'oldest_last_activity',
+ desc: 'recent_last_activity',
+ },
+ },
+ {
key: FIELD_KEY_LAST_SIGN_IN,
label: __('Last sign-in'),
sort: {
diff --git a/app/assets/javascripts/members/utils.js b/app/assets/javascripts/members/utils.js
index 05f086c8f4f..7ec083646e9 100644
--- a/app/assets/javascripts/members/utils.js
+++ b/app/assets/javascripts/members/utils.js
@@ -32,7 +32,7 @@ export const isGroup = (member) => {
};
export const isDirectMember = (member) => {
- return isGroup(member) || member.isDirectMember;
+ return member.isDirectMember;
};
export const isCurrentUser = (member, currentUserId) => {
diff --git a/app/assets/javascripts/merge_conflicts/utils.js b/app/assets/javascripts/merge_conflicts/utils.js
index e42703ef0a5..cf7a7c304e3 100644
--- a/app/assets/javascripts/merge_conflicts/utils.js
+++ b/app/assets/javascripts/merge_conflicts/utils.js
@@ -9,7 +9,7 @@ import {
export const getFilePath = (file) => {
const { old_path, new_path } = file;
- // eslint-disable-next-line babel/camelcase
+ // eslint-disable-next-line camelcase
return old_path === new_path ? new_path : `${old_path} → ${new_path}`;
};
@@ -71,7 +71,7 @@ export const getLineForParallelView = (line, id, lineType, isHead) => {
isHead: hasConflict && isHead,
isOrigin: hasConflict && !isHead,
hasMatch: lineType === 'match',
- // eslint-disable-next-line babel/camelcase
+ // eslint-disable-next-line camelcase
lineNumber: isHead ? new_line : old_line,
section: isHead ? 'head' : 'origin',
richText: rich_text,
diff --git a/app/assets/javascripts/merge_request.js b/app/assets/javascripts/merge_request.js
index 244cf1e150a..829e2264152 100644
--- a/app/assets/javascripts/merge_request.js
+++ b/app/assets/javascripts/merge_request.js
@@ -72,11 +72,15 @@ MergeRequest.prototype.initMRBtnListeners = function () {
const wipEvent = getParameterValues('merge_request[wip_event]', url)[0];
const mobileDropdown = draftToggle.closest('.dropdown.show');
+ const loader = document.createElement('span');
+ loader.classList.add('gl-spinner', 'gl-mr-3');
+
if (mobileDropdown) {
$(mobileDropdown.firstElementChild).dropdown('toggle');
}
draftToggle.setAttribute('disabled', 'disabled');
+ draftToggle.prepend(loader);
axios
.put(draftToggle.href, null, { params: { format: 'json' } })
@@ -124,7 +128,7 @@ MergeRequest.prototype.submitNoteForm = function (form, $button) {
MergeRequest.decreaseCounter = function (by = 1) {
const $el = $('.js-merge-counter');
- const count = Math.max(parseInt($el.text().replace(/[^\d]/, ''), 10) - by, 0);
+ const count = Math.max(parseInt($el.first().text().replace(/[^\d]/, ''), 10) - by, 0);
$el.text(addDelimiter(count));
};
diff --git a/app/assets/javascripts/milestones/components/milestone_combobox.vue b/app/assets/javascripts/milestones/components/milestone_combobox.vue
index a840e696386..d7ffdfd7c5f 100644
--- a/app/assets/javascripts/milestones/components/milestone_combobox.vue
+++ b/app/assets/javascripts/milestones/components/milestone_combobox.vue
@@ -192,10 +192,12 @@ export default {
@keydown.enter.prevent="onSearchBoxEnter"
/>
- <gl-dropdown-item @click="selectNoMilestone()">
- <span :class="{ 'gl-pl-6': true, 'selected-item': selectedMilestones.length === 0 }">
- {{ $options.translations.noMilestone }}
- </span>
+ <gl-dropdown-item
+ :is-checked="selectedMilestones.length === 0"
+ is-check-item
+ @click="selectNoMilestone()"
+ >
+ {{ $options.translations.noMilestone }}
</gl-dropdown-item>
<gl-dropdown-divider />
@@ -241,9 +243,10 @@ export default {
v-for="(item, idx) in extraLinks"
:key="idx"
:href="item.url"
+ :is-check-item="true"
data-testid="milestone-combobox-extra-links"
>
- <span class="gl-pl-6">{{ item.text }}</span>
+ {{ item.text }}
</gl-dropdown-item>
</gl-dropdown>
</template>
diff --git a/app/assets/javascripts/milestones/components/milestone_results_section.vue b/app/assets/javascripts/milestones/components/milestone_results_section.vue
index b866977b974..e3c691b14c7 100644
--- a/app/assets/javascripts/milestones/components/milestone_results_section.vue
+++ b/app/assets/javascripts/milestones/components/milestone_results_section.vue
@@ -77,10 +77,14 @@ export default {
</div>
</template>
<template v-else>
- <gl-dropdown-item v-for="{ title } in items" :key="title" @click="$emit('selected', title)">
- <span class="gl-pl-6" :class="{ 'selected-item': isSelectedMilestone(title) }">
- {{ title }}
- </span>
+ <gl-dropdown-item
+ v-for="{ title } in items"
+ :key="title"
+ :is-checked="isSelectedMilestone(title)"
+ is-check-item
+ @click="$emit('selected', title)"
+ >
+ {{ title }}
</gl-dropdown-item>
<gl-dropdown-divider />
</template>
diff --git a/app/assets/javascripts/mirrors/ssh_mirror.js b/app/assets/javascripts/mirrors/ssh_mirror.js
index 5138c450feb..e375435436e 100644
--- a/app/assets/javascripts/mirrors/ssh_mirror.js
+++ b/app/assets/javascripts/mirrors/ssh_mirror.js
@@ -76,7 +76,7 @@ export default class SSHMirror {
// Disable button while we make request
this.$btnDetectHostKeys.disable();
- $btnLoadSpinner.removeClass('d-none');
+ $btnLoadSpinner.removeClass('gl-display-none');
// Make backOff polling to get data
backOff((next, stop) => {
@@ -101,7 +101,7 @@ export default class SSHMirror {
.catch(stop);
})
.then((res) => {
- $btnLoadSpinner.addClass('d-none');
+ $btnLoadSpinner.addClass('gl-display-none');
// Once data is received, we show verification info along with Host keys and fingerprints
this.$hostKeysInformation
.find('.js-fingerprint-verification')
diff --git a/app/assets/javascripts/monitoring/components/charts/bar.vue b/app/assets/javascripts/monitoring/components/charts/bar.vue
index 1e0f4b10297..df91bd078d1 100644
--- a/app/assets/javascripts/monitoring/components/charts/bar.vue
+++ b/app/assets/javascripts/monitoring/components/charts/bar.vue
@@ -36,12 +36,12 @@ export default {
return xLabel;
},
yAxisTitle() {
- const { y_label = '' } = this.graphData;
- return y_label; // eslint-disable-line babel/camelcase
+ const { y_label: yLabel = '' } = this.graphData;
+ return yLabel;
},
xAxisType() {
- const { x_type = 'value' } = this.graphData;
- return x_type; // eslint-disable-line babel/camelcase
+ const { x_type: xType = 'value' } = this.graphData;
+ return xType;
},
dataZoomConfig() {
const handleIcon = this.svgs['scroll-handle'];
diff --git a/app/assets/javascripts/monitoring/components/create_dashboard_modal.vue b/app/assets/javascripts/monitoring/components/create_dashboard_modal.vue
index bfaf8b2bd28..288487d25a5 100644
--- a/app/assets/javascripts/monitoring/components/create_dashboard_modal.vue
+++ b/app/assets/javascripts/monitoring/components/create_dashboard_modal.vue
@@ -55,7 +55,7 @@ export default {
{{ s__('Metrics|View documentation') }}
</gl-button>
<gl-button
- variant="success"
+ variant="confirm"
data-testid="create-dashboard-modal-repo-button"
:href="projectPath"
>
diff --git a/app/assets/javascripts/monitoring/components/dashboard.vue b/app/assets/javascripts/monitoring/components/dashboard.vue
index 6467d953500..c4392dd3748 100644
--- a/app/assets/javascripts/monitoring/components/dashboard.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard.vue
@@ -409,17 +409,13 @@ export default {
<div>
<gl-alert
v-if="!isDeprecationNoticeDismissed"
- :title="__('Feature deprecation and removal')"
+ :title="__('Feature deprecation')"
class="mb-3"
- variant="danger"
+ variant="warning"
@dismiss="isDeprecationNoticeDismissed = true"
>
<gl-sprintf
- :message="
- s__(
- 'Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0.',
- )
- "
+ :message="s__('Deprecations|The metrics feature was deprecated in GitLab 14.7.')"
>
<template #epic="{ content }">
<gl-link href="https://gitlab.com/groups/gitlab-org/-/epics/7188" target="_blank">{{
diff --git a/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue b/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue
index 1238996154d..568c66cf152 100644
--- a/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue
+++ b/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue
@@ -48,8 +48,8 @@ export default {
},
filteredDashboards() {
- return this.allDashboards.filter(({ display_name = '' }) =>
- display_name.toLowerCase().includes(this.searchTerm.toLowerCase()),
+ return this.allDashboards.filter(({ display_name: displayName = '' }) =>
+ displayName.toLowerCase().includes(this.searchTerm.toLowerCase()),
);
},
shouldShowNoMsgContainer() {
diff --git a/app/assets/javascripts/monitoring/queries/getAnnotations.query.graphql b/app/assets/javascripts/monitoring/queries/get_annotations.query.graphql
index 32b982ff195..32b982ff195 100644
--- a/app/assets/javascripts/monitoring/queries/getAnnotations.query.graphql
+++ b/app/assets/javascripts/monitoring/queries/get_annotations.query.graphql
diff --git a/app/assets/javascripts/monitoring/queries/getDashboardValidationWarnings.query.graphql b/app/assets/javascripts/monitoring/queries/get_dashboard_validation_warnings.query.graphql
index a61d601cd34..a61d601cd34 100644
--- a/app/assets/javascripts/monitoring/queries/getDashboardValidationWarnings.query.graphql
+++ b/app/assets/javascripts/monitoring/queries/get_dashboard_validation_warnings.query.graphql
diff --git a/app/assets/javascripts/monitoring/queries/getEnvironments.query.graphql b/app/assets/javascripts/monitoring/queries/get_environments.query.graphql
index 48d0a780fc7..48d0a780fc7 100644
--- a/app/assets/javascripts/monitoring/queries/getEnvironments.query.graphql
+++ b/app/assets/javascripts/monitoring/queries/get_environments.query.graphql
diff --git a/app/assets/javascripts/monitoring/stores/actions.js b/app/assets/javascripts/monitoring/stores/actions.js
index 215b4b7b2d7..5c99dbc0d98 100644
--- a/app/assets/javascripts/monitoring/stores/actions.js
+++ b/app/assets/javascripts/monitoring/stores/actions.js
@@ -2,13 +2,13 @@ import * as Sentry from '@sentry/browser';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import { convertObjectPropsToCamelCase } from '../../lib/utils/common_utils';
-import { s__, sprintf } from '../../locale';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { s__, sprintf } from '~/locale';
import { ENVIRONMENT_AVAILABLE_STATE, OVERVIEW_DASHBOARD_PATH, VARIABLE_TYPES } from '../constants';
import trackDashboardLoad from '../monitoring_tracking_helper';
-import getAnnotations from '../queries/getAnnotations.query.graphql';
-import getDashboardValidationWarnings from '../queries/getDashboardValidationWarnings.query.graphql';
-import getEnvironments from '../queries/getEnvironments.query.graphql';
+import getAnnotations from '../queries/get_annotations.query.graphql';
+import getDashboardValidationWarnings from '../queries/get_dashboard_validation_warnings.query.graphql';
+import getEnvironments from '../queries/get_environments.query.graphql';
import { getDashboard, getPrometheusQueryData } from '../requests';
import * as types from './mutation_types';
@@ -385,7 +385,7 @@ export const fetchDashboardValidationWarnings = ({ state, dispatch, getters }) =
dashboardPath,
},
})
- .then((resp) => resp.data?.project?.environments?.nodes?.[0]?.metricsDashboard)
+ .then((resp) => resp.data?.project?.environments?.nodes?.[0]?.metricsDashboard || undefined)
.then(({ schemaValidationWarnings } = {}) => {
const hasWarnings = schemaValidationWarnings && schemaValidationWarnings.length !== 0;
/**
diff --git a/app/assets/javascripts/monitoring/stores/utils.js b/app/assets/javascripts/monitoring/stores/utils.js
index 20f7c5cdb60..7f75a501635 100644
--- a/app/assets/javascripts/monitoring/stores/utils.js
+++ b/app/assets/javascripts/monitoring/stores/utils.js
@@ -29,7 +29,7 @@ export const gqClient = createGqClient(
* @param {String} metric.id - User-defined identifier
* @returns {Object} - normalized metric with a uniqueID
*/
-// eslint-disable-next-line babel/camelcase
+// eslint-disable-next-line camelcase
export const uniqMetricsId = ({ metric_id, id }) => `${metric_id || NOT_IN_DB_PREFIX}_${id}`;
/**
@@ -45,7 +45,7 @@ export const removeLeadingSlash = (str) => (str || '').replace(/^\/+/, '');
/**
* GraphQL environments API returns only id and name.
* For the environments dropdown we need metrics_path.
- * This method parses the results and add neccessart attrs
+ * This method parses the results and add necessary attrs
*
* @param {Array} response Environments API result
* @param {String} projectPath Current project path
@@ -57,7 +57,7 @@ export const parseEnvironmentsResponse = (response = [], projectPath) =>
return {
...env,
id,
- metrics_path: `${projectPath}/environments/${id}/metrics`,
+ metrics_path: `${projectPath}/-/metrics?environment=${id}`,
};
});
@@ -169,10 +169,10 @@ export const mapPanelToViewModel = ({
id = null,
title = '',
type,
- x_axis = {},
+ x_axis = {}, // eslint-disable-line camelcase
x_label,
y_label,
- y_axis = {},
+ y_axis = {}, // eslint-disable-line camelcase
field,
metrics = [],
links = [],
@@ -184,11 +184,11 @@ export const mapPanelToViewModel = ({
}) => {
// Both `x_axis.name` and `x_label` are supported for now
// https://gitlab.com/gitlab-org/gitlab/issues/210521
- const xAxis = mapXAxisToViewModel({ name: x_label, ...x_axis }); // eslint-disable-line babel/camelcase
+ const xAxis = mapXAxisToViewModel({ name: x_label, ...x_axis }); // eslint-disable-line camelcase
// Both `y_axis.name` and `y_label` are supported for now
// https://gitlab.com/gitlab-org/gitlab/issues/208385
- const yAxis = mapYAxisToViewModel({ name: y_label, ...y_axis }); // eslint-disable-line babel/camelcase
+ const yAxis = mapYAxisToViewModel({ name: y_label, ...y_axis }); // eslint-disable-line camelcase
return {
id,
@@ -295,7 +295,7 @@ export const mapToDashboardViewModel = ({
dashboard = '',
templating = {},
links = [],
- panel_groups = [],
+ panel_groups = [], // eslint-disable-line camelcase
}) => {
return {
dashboard,
diff --git a/app/assets/javascripts/monitoring/utils.js b/app/assets/javascripts/monitoring/utils.js
index 336b613b620..221f28e923b 100644
--- a/app/assets/javascripts/monitoring/utils.js
+++ b/app/assets/javascripts/monitoring/utils.js
@@ -294,7 +294,7 @@ export const expandedPanelPayloadFromUrl = (dashboard, search = window.location.
if (params.group || params.title || params.y_label) {
const panelGroup = dashboard.panelGroups.find(({ group }) => params.group === group);
const panel = panelGroup.panels.find(
- // eslint-disable-next-line babel/camelcase
+ // eslint-disable-next-line camelcase
({ y_label, title }) => y_label === params.y_label && title === params.title,
);
diff --git a/app/assets/javascripts/mr_notes/stores/actions.js b/app/assets/javascripts/mr_notes/stores/actions.js
index bc66d1dd68f..0200a8aefc8 100644
--- a/app/assets/javascripts/mr_notes/stores/actions.js
+++ b/app/assets/javascripts/mr_notes/stores/actions.js
@@ -10,23 +10,14 @@ export function setEndpoints({ commit }, endpoints) {
commit(types.SET_ENDPOINTS, endpoints);
}
-export function setMrMetadata({ commit }, metadata) {
- commit(types.SET_MR_METADATA, metadata);
-}
-
-export function fetchMrMetadata({ dispatch, state }) {
+export async function fetchMrMetadata({ state, commit }) {
if (state.endpoints?.metadata) {
- axios
- .get(state.endpoints.metadata)
- .then((response) => {
- dispatch('setMrMetadata', response.data);
- })
- .catch(() => {
- // https://gitlab.com/gitlab-org/gitlab/-/issues/324740
- // We can't even do a simple console warning here because
- // the pipeline will fail. However, the issue above will
- // eventually handle errors appropriately.
- // console.warn('Failed to load MR Metadata for the Overview tab.');
- });
+ commit(types.SET_FAILED_TO_LOAD_METADATA, false);
+ try {
+ const { data } = await axios.get(state.endpoints.metadata);
+ commit(types.SET_MR_METADATA, data);
+ } catch (error) {
+ commit(types.SET_FAILED_TO_LOAD_METADATA, true);
+ }
}
}
diff --git a/app/assets/javascripts/mr_notes/stores/modules/index.js b/app/assets/javascripts/mr_notes/stores/modules/index.js
index 52e12ba664c..75b2b2f4dc6 100644
--- a/app/assets/javascripts/mr_notes/stores/modules/index.js
+++ b/app/assets/javascripts/mr_notes/stores/modules/index.js
@@ -7,6 +7,7 @@ export default () => ({
endpoints: {},
activeTab: null,
mrMetadata: {},
+ failedToLoadMetadata: false,
},
actions,
getters,
diff --git a/app/assets/javascripts/mr_notes/stores/mutation_types.js b/app/assets/javascripts/mr_notes/stores/mutation_types.js
index 88cf6e48988..91d75e77a60 100644
--- a/app/assets/javascripts/mr_notes/stores/mutation_types.js
+++ b/app/assets/javascripts/mr_notes/stores/mutation_types.js
@@ -2,4 +2,5 @@ export default {
SET_ACTIVE_TAB: 'SET_ACTIVE_TAB',
SET_ENDPOINTS: 'SET_ENDPOINTS',
SET_MR_METADATA: 'SET_MR_METADATA',
+ SET_FAILED_TO_LOAD_METADATA: 'SET_FAILED_TO_LOAD_METADATA',
};
diff --git a/app/assets/javascripts/mr_notes/stores/mutations.js b/app/assets/javascripts/mr_notes/stores/mutations.js
index 6af6adb4e18..8b17f63cfb1 100644
--- a/app/assets/javascripts/mr_notes/stores/mutations.js
+++ b/app/assets/javascripts/mr_notes/stores/mutations.js
@@ -10,4 +10,7 @@ export default {
[types.SET_MR_METADATA](state, metadata) {
Object.assign(state, { mrMetadata: metadata });
},
+ [types.SET_FAILED_TO_LOAD_METADATA](state, value) {
+ Object.assign(state, { failedToLoadMetadata: value });
+ },
};
diff --git a/app/assets/javascripts/mr_popover/components/mr_popover.vue b/app/assets/javascripts/mr_popover/components/mr_popover.vue
index d99a3adb358..fef75b6d5d0 100644
--- a/app/assets/javascripts/mr_popover/components/mr_popover.vue
+++ b/app/assets/javascripts/mr_popover/components/mr_popover.vue
@@ -1,8 +1,8 @@
<script>
/* eslint-disable @gitlab/vue-require-i18n-strings */
import { GlPopover, GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
-import CiIcon from '../../vue_shared/components/ci_icon.vue';
-import timeagoMixin from '../../vue_shared/mixins/timeago';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import timeagoMixin from '~/vue_shared/mixins/timeago';
import { mrStates, humanMRStates } from '../constants';
import query from '../queries/merge_request.query.graphql';
diff --git a/app/assets/javascripts/network/branch_graph.js b/app/assets/javascripts/network/branch_graph.js
index 71894b4ff3e..5ae68d22667 100644
--- a/app/assets/javascripts/network/branch_graph.js
+++ b/app/assets/javascripts/network/branch_graph.js
@@ -1,8 +1,8 @@
/* eslint-disable func-names, consistent-return */
import $ from 'jquery';
-import axios from '../lib/utils/axios_utils';
-import { __ } from '../locale';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
import Raphael from './raphael';
export default class BranchGraph {
diff --git a/app/assets/javascripts/notes/components/diff_discussion_header.vue b/app/assets/javascripts/notes/components/diff_discussion_header.vue
index 0ce1eb8191a..45d97f278dc 100644
--- a/app/assets/javascripts/notes/components/diff_discussion_header.vue
+++ b/app/assets/javascripts/notes/components/diff_discussion_header.vue
@@ -6,7 +6,7 @@ import { mapActions } from 'vuex';
import { truncateSha } from '~/lib/utils/text_utility';
import { s__, __, sprintf } from '~/locale';
-import userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
+import userAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import noteEditedText from './note_edited_text.vue';
import noteHeader from './note_header.vue';
diff --git a/app/assets/javascripts/notes/components/diff_with_note.vue b/app/assets/javascripts/notes/components/diff_with_note.vue
index b4f7ba5f960..e2b0c7fee32 100644
--- a/app/assets/javascripts/notes/components/diff_with_note.vue
+++ b/app/assets/javascripts/notes/components/diff_with_note.vue
@@ -9,7 +9,7 @@ import ImageDiffOverlay from '~/diffs/components/image_diff_overlay.vue';
import { getDiffMode } from '~/diffs/store/utils';
import { diffViewerModes } from '~/ide/constants';
import DiffViewer from '~/vue_shared/components/diff_viewer/diff_viewer.vue';
-import { isCollapsed } from '../../diffs/utils/diff_file';
+import { isCollapsed } from '~/diffs/utils/diff_file';
const FIRST_CHAR_REGEX = /^(\+|-| )/;
diff --git a/app/assets/javascripts/notes/components/discussion_filter.vue b/app/assets/javascripts/notes/components/discussion_filter.vue
index d5a7fc36ace..15887c2738d 100644
--- a/app/assets/javascripts/notes/components/discussion_filter.vue
+++ b/app/assets/javascripts/notes/components/discussion_filter.vue
@@ -1,7 +1,7 @@
<script>
import { GlDropdown, GlDropdownItem, GlDropdownDivider } from '@gitlab/ui';
import { mapGetters, mapActions } from 'vuex';
-import { getLocationHash, doesHashExistInUrl } from '../../lib/utils/url_utility';
+import { getLocationHash, doesHashExistInUrl } from '~/lib/utils/url_utility';
import {
DISCUSSION_FILTERS_DEFAULT_VALUE,
HISTORY_ONLY_FILTER_VALUE,
diff --git a/app/assets/javascripts/notes/components/note_actions.vue b/app/assets/javascripts/notes/components/note_actions.vue
index e2a2edd7344..1bd2f879e6c 100644
--- a/app/assets/javascripts/notes/components/note_actions.vue
+++ b/app/assets/javascripts/notes/components/note_actions.vue
@@ -9,7 +9,7 @@ import { __, sprintf } from '~/locale';
import eventHub from '~/sidebar/event_hub';
import UserAccessRoleBadge from '~/vue_shared/components/user_access_role_badge.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { splitCamelCase } from '../../lib/utils/text_utility';
+import { splitCamelCase } from '~/lib/utils/text_utility';
import ReplyButton from './note_actions/reply_button.vue';
export default {
@@ -292,40 +292,18 @@ export default {
class="line-resolve-btn note-action-button"
@click="onResolve"
/>
- <template v-if="canAwardEmoji">
- <emoji-picker
- v-if="glFeatures.improvedEmojiPicker"
- toggle-class="note-action-button note-emoji-button gl-text-gray-600 gl-m-3 gl-p-0! gl-shadow-none! gl-bg-transparent!"
- @click="setAwardEmoji"
- >
- <template #button-content>
- <gl-icon class="link-highlight award-control-icon-neutral gl-m-0!" name="slight-smile" />
- <gl-icon class="link-highlight award-control-icon-positive gl-m-0!" name="smiley" />
- <gl-icon class="link-highlight award-control-icon-super-positive gl-m-0!" name="smile" />
- </template>
- </emoji-picker>
- <gl-button
- v-else
- v-gl-tooltip
- :class="{ 'js-user-authored': isAuthoredByCurrentUser }"
- class="note-action-button note-emoji-button add-reaction-button js-add-award js-note-emoji"
- category="tertiary"
- variant="default"
- :title="$options.i18n.addReactionLabel"
- :aria-label="$options.i18n.addReactionLabel"
- data-position="right"
- >
- <span class="reaction-control-icon reaction-control-icon-neutral">
- <gl-icon name="slight-smile" />
- </span>
- <span class="reaction-control-icon reaction-control-icon-positive">
- <gl-icon name="smiley" />
- </span>
- <span class="reaction-control-icon reaction-control-icon-super-positive">
- <gl-icon name="smile" />
- </span>
- </gl-button>
- </template>
+ <emoji-picker
+ v-if="canAwardEmoji"
+ toggle-class="note-action-button note-emoji-button gl-text-gray-600 gl-m-3 gl-p-0! gl-shadow-none! gl-bg-transparent!"
+ data-testid="note-emoji-button"
+ @click="setAwardEmoji"
+ >
+ <template #button-content>
+ <gl-icon class="link-highlight award-control-icon-neutral gl-m-0!" name="slight-smile" />
+ <gl-icon class="link-highlight award-control-icon-positive gl-m-0!" name="smiley" />
+ <gl-icon class="link-highlight award-control-icon-super-positive gl-m-0!" name="smile" />
+ </template>
+ </emoji-picker>
<reply-button
v-if="showReply"
ref="replyButton"
diff --git a/app/assets/javascripts/notes/components/note_body.vue b/app/assets/javascripts/notes/components/note_body.vue
index f465ad23a06..fe17a061c0a 100644
--- a/app/assets/javascripts/notes/components/note_body.vue
+++ b/app/assets/javascripts/notes/components/note_body.vue
@@ -57,14 +57,15 @@ export default {
computed: {
...mapGetters(['getDiscussion', 'suggestionsCount', 'getSuggestionsFilePaths']),
...mapGetters('diffs', ['suggestionCommitMessage']),
+ ...mapState({
+ batchSuggestionsInfo: (state) => state.notes.batchSuggestionsInfo,
+ failedToLoadMetadata: (state) => state.page.failedToLoadMetadata,
+ }),
discussion() {
if (!this.note.isDraft) return {};
return this.getDiscussion(this.note.discussion_id);
},
- ...mapState({
- batchSuggestionsInfo: (state) => state.notes.batchSuggestionsInfo,
- }),
noteBody() {
return this.note.note;
},
@@ -165,6 +166,7 @@ export default {
:line-type="lineType"
:help-page-path="helpPagePath"
:default-commit-message="commitMessage"
+ :failed-to-load-metadata="failedToLoadMetadata"
@apply="applySuggestion"
@applyBatch="applySuggestionBatch"
@addToBatch="addSuggestionToBatch"
@@ -174,7 +176,6 @@ export default {
<note-form
v-if="isEditing"
ref="noteForm"
- :is-editing="isEditing"
:note-body="noteBody"
:note-id="note.id"
:line="line"
diff --git a/app/assets/javascripts/notes/components/note_edited_text.vue b/app/assets/javascripts/notes/components/note_edited_text.vue
index 7c052320c98..03cbdf45ddd 100644
--- a/app/assets/javascripts/notes/components/note_edited_text.vue
+++ b/app/assets/javascripts/notes/components/note_edited_text.vue
@@ -1,6 +1,6 @@
<script>
/* eslint-disable @gitlab/vue-require-i18n-strings */
-import timeAgoTooltip from '../../vue_shared/components/time_ago_tooltip.vue';
+import timeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
export default {
name: 'EditedNoteText',
diff --git a/app/assets/javascripts/notes/components/note_form.vue b/app/assets/javascripts/notes/components/note_form.vue
index ee22c118e11..c1e763d81ee 100644
--- a/app/assets/javascripts/notes/components/note_form.vue
+++ b/app/assets/javascripts/notes/components/note_form.vue
@@ -41,10 +41,6 @@ export default {
required: false,
default: () => ({}),
},
- isEditing: {
- type: Boolean,
- required: true,
- },
lineCode: {
type: String,
required: false,
@@ -184,7 +180,7 @@ export default {
return this.getNotesDataByProp('markdownDocsPath');
},
quickActionsDocsPath() {
- return !this.isEditing ? this.getNotesDataByProp('quickActionsDocsPath') : undefined;
+ return this.getNotesDataByProp('quickActionsDocsPath');
},
currentUserId() {
return this.getUserDataByProp('id');
@@ -348,7 +344,7 @@ export default {
ref="textarea"
v-model="updatedNoteBody"
:disabled="isSubmitting"
- :data-supports-quick-actions="!isEditing"
+ data-supports-quick-actions="true"
name="note[note]"
class="note-textarea js-gfm-input js-note-text js-autosize markdown-area js-vue-issue-note-form"
data-qa-selector="reply_field"
diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue
index 71d767c3b95..11b427b9346 100644
--- a/app/assets/javascripts/notes/components/note_header.vue
+++ b/app/assets/javascripts/notes/components/note_header.vue
@@ -6,9 +6,11 @@ import {
GlSafeHtmlDirective as SafeHtml,
} from '@gitlab/ui';
import { mapActions } from 'vuex';
-import { __ } from '~/locale';
+import { __, s__ } from '~/locale';
import timeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
-import UserNameWithStatus from '../../sidebar/components/assignees/user_name_with_status.vue';
+import UserNameWithStatus from '~/sidebar/components/assignees/user_name_with_status.vue';
+
+import { NOTEABLE_TYPE_MAPPING } from '../constants';
export default {
safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
@@ -45,6 +47,11 @@ export default {
required: false,
default: null,
},
+ noteableType: {
+ type: String,
+ required: false,
+ default: '',
+ },
includeToggle: {
type: Boolean,
required: false,
@@ -103,6 +110,15 @@ export default {
authorName() {
return this.author.name;
},
+ noteConfidentialityTooltip() {
+ if (
+ this.noteableType === NOTEABLE_TYPE_MAPPING.Issue ||
+ this.noteableType === NOTEABLE_TYPE_MAPPING.MergeRequest
+ ) {
+ return s__('Notes|This comment is confidential and only visible to project members');
+ }
+ return s__('Notes|This comment is confidential and only visible to group members');
+ },
},
mounted() {
this.emojiTitle = this.emojiElement ? this.emojiElement.getAttribute('title') : '';
@@ -226,7 +242,7 @@ export default {
data-testid="confidentialIndicator"
name="eye-slash"
:size="16"
- :title="s__('Notes|This comment is confidential and only visible to project members')"
+ :title="noteConfidentialityTooltip"
class="gl-ml-1 gl-text-orange-700 align-middle"
/>
<slot name="extra-controls"></slot>
diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue
index c4602363da1..000eb3bdff3 100644
--- a/app/assets/javascripts/notes/components/noteable_discussion.vue
+++ b/app/assets/javascripts/notes/components/noteable_discussion.vue
@@ -10,7 +10,7 @@ import { ignoreWhilePending } from '~/lib/utils/ignore_while_pending';
import { s__, __ } from '~/locale';
import diffLineNoteFormMixin from '~/notes/mixins/diff_line_note_form';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
-import userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
+import userAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import eventHub from '../event_hub';
import noteable from '../mixins/noteable';
import resolvable from '../mixins/resolvable';
@@ -307,7 +307,6 @@ export default {
v-if="isReplying"
ref="noteForm"
:discussion="discussion"
- :is-editing="false"
:line="diffLine"
save-button-title="Comment"
:autosave-key="autosaveKey"
diff --git a/app/assets/javascripts/notes/components/noteable_note.vue b/app/assets/javascripts/notes/components/noteable_note.vue
index a271ac91f6e..a2fbb242222 100644
--- a/app/assets/javascripts/notes/components/noteable_note.vue
+++ b/app/assets/javascripts/notes/components/noteable_note.vue
@@ -10,8 +10,8 @@ import httpStatusCodes from '~/lib/utils/http_status';
import { ignoreWhilePending } from '~/lib/utils/ignore_while_pending';
import { truncateSha } from '~/lib/utils/text_utility';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
-import { __, s__, sprintf } from '../../locale';
-import userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
+import { __, s__, sprintf } from '~/locale';
+import userAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import eventHub from '../event_hub';
import noteable from '../mixins/noteable';
import resolvable from '../mixins/resolvable';
@@ -357,7 +357,13 @@ export default {
}) {
if (shouldConfirm && isDirty) {
const msg = __('Are you sure you want to cancel editing this comment?');
- const confirmed = await confirmAction(msg);
+ const confirmed = await confirmAction(msg, {
+ primaryBtnText: __('Cancel editing'),
+ primaryBtnVariant: 'danger',
+ secondaryBtnVariant: 'default',
+ secondaryBtnText: __('Continue editing'),
+ hideCancel: true,
+ });
if (!confirmed) return;
}
this.$refs.noteBody.resetAutoSave();
@@ -432,6 +438,7 @@ export default {
:created-at="note.created_at"
:note-id="note.id"
:is-confidential="note.confidential"
+ :noteable-type="noteableType"
>
<template #note-header-info>
<slot name="note-header-info"></slot>
diff --git a/app/assets/javascripts/notes/components/notes_app.vue b/app/assets/javascripts/notes/components/notes_app.vue
index c4924cd41f5..7d8d23335e0 100644
--- a/app/assets/javascripts/notes/components/notes_app.vue
+++ b/app/assets/javascripts/notes/components/notes_app.vue
@@ -7,12 +7,12 @@ import initUserPopovers from '~/user_popovers';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import OrderedLayout from '~/vue_shared/components/ordered_layout.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import draftNote from '../../batch_comments/components/draft_note.vue';
-import { getLocationHash, doesHashExistInUrl } from '../../lib/utils/url_utility';
-import placeholderNote from '../../vue_shared/components/notes/placeholder_note.vue';
-import placeholderSystemNote from '../../vue_shared/components/notes/placeholder_system_note.vue';
-import skeletonLoadingContainer from '../../vue_shared/components/notes/skeleton_note.vue';
-import systemNote from '../../vue_shared/components/notes/system_note.vue';
+import draftNote from '~/batch_comments/components/draft_note.vue';
+import { getLocationHash, doesHashExistInUrl } from '~/lib/utils/url_utility';
+import placeholderNote from '~/vue_shared/components/notes/placeholder_note.vue';
+import placeholderSystemNote from '~/vue_shared/components/notes/placeholder_system_note.vue';
+import skeletonLoadingContainer from '~/vue_shared/components/notes/skeleton_note.vue';
+import systemNote from '~/vue_shared/components/notes/system_note.vue';
import * as constants from '../constants';
import eventHub from '../event_hub';
import commentForm from './comment_form.vue';
diff --git a/app/assets/javascripts/notes/components/sort_discussion.vue b/app/assets/javascripts/notes/components/sort_discussion.vue
index 92c39fbb9f0..bcc5d12b7c8 100644
--- a/app/assets/javascripts/notes/components/sort_discussion.vue
+++ b/app/assets/javascripts/notes/components/sort_discussion.vue
@@ -57,6 +57,7 @@ export default {
:value="sortDirection"
:storage-key="storageKey"
:persist="persistSortOrder"
+ as-string
@input="setDiscussionSortDirection({ direction: $event })"
/>
<gl-dropdown :text="dropdownText" class="js-dropdown-text full-width-mobile">
diff --git a/app/assets/javascripts/notes/components/timeline_toggle.vue b/app/assets/javascripts/notes/components/timeline_toggle.vue
index 87d22e5b986..e4d89f54652 100644
--- a/app/assets/javascripts/notes/components/timeline_toggle.vue
+++ b/app/assets/javascripts/notes/components/timeline_toggle.vue
@@ -7,8 +7,8 @@ import { COMMENTS_ONLY_FILTER_VALUE, DESC } from '../constants';
import notesEventHub from '../event_hub';
import { trackToggleTimelineView } from '../utils';
-export const timelineEnabledTooltip = s__('Timeline|Turn timeline view off');
-export const timelineDisabledTooltip = s__('Timeline|Turn timeline view on');
+export const timelineEnabledTooltip = s__('Timeline|Turn recent updates view off');
+export const timelineDisabledTooltip = s__('Timeline|Turn recent updates view on');
export default {
components: {
@@ -49,7 +49,7 @@ export default {
<gl-button
v-gl-tooltip
v-track-event="trackToggleTimelineView(timelineEnabled)"
- icon="comments"
+ icon="history"
:selected="timelineEnabled"
:title="tooltip"
:aria-label="tooltip"
diff --git a/app/assets/javascripts/notes/components/toggle_replies_widget.vue b/app/assets/javascripts/notes/components/toggle_replies_widget.vue
index 01e3f84d00e..65b3fd6f8b3 100644
--- a/app/assets/javascripts/notes/components/toggle_replies_widget.vue
+++ b/app/assets/javascripts/notes/components/toggle_replies_widget.vue
@@ -57,7 +57,7 @@ export default {
:link-href="author.path"
:img-alt="author.name"
:img-src="author.avatar_url"
- :img-size="26"
+ :img-size="24"
:tooltip-text="author.name"
tooltip-placement="bottom"
/>
diff --git a/app/assets/javascripts/notes/mixins/autosave.js b/app/assets/javascripts/notes/mixins/autosave.js
index d670d0bd4c5..61cb4ab2a10 100644
--- a/app/assets/javascripts/notes/mixins/autosave.js
+++ b/app/assets/javascripts/notes/mixins/autosave.js
@@ -1,7 +1,7 @@
import $ from 'jquery';
import { s__ } from '~/locale';
-import Autosave from '../../autosave';
-import { capitalizeFirstCharacter } from '../../lib/utils/text_utility';
+import Autosave from '~/autosave';
+import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
export default {
methods: {
diff --git a/app/assets/javascripts/notes/mixins/discussion_navigation.js b/app/assets/javascripts/notes/mixins/discussion_navigation.js
index 93236b05100..754a534e055 100644
--- a/app/assets/javascripts/notes/mixins/discussion_navigation.js
+++ b/app/assets/javascripts/notes/mixins/discussion_navigation.js
@@ -1,6 +1,6 @@
import { mapGetters, mapActions, mapState } from 'vuex';
import { scrollToElementWithContext, scrollToElement } from '~/lib/utils/common_utils';
-import { updateHistory } from '../../lib/utils/url_utility';
+import { updateHistory } from '~/lib/utils/url_utility';
import eventHub from '../event_hub';
/**
diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js
index 50b05ea9d69..204e704e504 100644
--- a/app/assets/javascripts/notes/stores/actions.js
+++ b/app/assets/javascripts/notes/stores/actions.js
@@ -9,14 +9,14 @@ import { __, sprintf } from '~/locale';
import { confidentialWidget } from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
import updateIssueLockMutation from '~/sidebar/components/lock/mutations/update_issue_lock.mutation.graphql';
import updateMergeRequestLockMutation from '~/sidebar/components/lock/mutations/update_merge_request_lock.mutation.graphql';
-import loadAwardsHandler from '../../awards_handler';
-import { isInViewport, scrollToElement, isInMRPage } from '../../lib/utils/common_utils';
-import Poll from '../../lib/utils/poll';
-import { create } from '../../lib/utils/recurrence';
-import { mergeUrlParams } from '../../lib/utils/url_utility';
-import sidebarTimeTrackingEventHub from '../../sidebar/event_hub';
-import TaskList from '../../task_list';
-import mrWidgetEventHub from '../../vue_merge_request_widget/event_hub';
+import loadAwardsHandler from '~/awards_handler';
+import { isInViewport, scrollToElement, isInMRPage } from '~/lib/utils/common_utils';
+import Poll from '~/lib/utils/poll';
+import { create } from '~/lib/utils/recurrence';
+import { mergeUrlParams } from '~/lib/utils/url_utility';
+import sidebarTimeTrackingEventHub from '~/sidebar/event_hub';
+import TaskList from '~/task_list';
+import mrWidgetEventHub from '~/vue_merge_request_widget/event_hub';
import * as constants from '../constants';
import eventHub from '../event_hub';
import * as types from './mutation_types';
diff --git a/app/assets/javascripts/notes/stores/mutations.js b/app/assets/javascripts/notes/stores/mutations.js
index ba19ecd0c04..5cc2c673391 100644
--- a/app/assets/javascripts/notes/stores/mutations.js
+++ b/app/assets/javascripts/notes/stores/mutations.js
@@ -1,5 +1,5 @@
import { isEqual } from 'lodash';
-import { isInMRPage } from '../../lib/utils/common_utils';
+import { isInMRPage } from '~/lib/utils/common_utils';
import * as constants from '../constants';
import * as types from './mutation_types';
import * as utils from './utils';
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/delete_button.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/delete_button.vue
index e4a1a1a8266..bb1dac40b92 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/delete_button.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/delete_button.vue
@@ -1,13 +1,13 @@
<script>
-import { GlTooltipDirective, GlButton } from '@gitlab/ui';
+import { GlButton, GlLink, GlTooltip, GlSprintf } from '@gitlab/ui';
export default {
name: 'DeleteButton',
components: {
GlButton,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
+ GlLink,
+ GlTooltip,
+ GlSprintf,
},
props: {
title: {
@@ -18,6 +18,11 @@ export default {
type: String,
required: true,
},
+ tooltipLink: {
+ type: String,
+ default: '',
+ required: false,
+ },
disabled: {
type: Boolean,
default: false,
@@ -29,21 +34,12 @@ export default {
required: false,
},
},
- computed: {
- tooltipConfiguration() {
- return {
- disabled: this.tooltipDisabled,
- title: this.tooltipTitle,
- };
- },
- },
};
</script>
<template>
- <div v-gl-tooltip="tooltipConfiguration">
+ <div ref="deleteImageButton">
<gl-button
- v-gl-tooltip
:disabled="disabled"
:title="title"
:aria-label="title"
@@ -52,5 +48,14 @@ export default {
icon="remove"
@click="$emit('delete')"
/>
+ <gl-tooltip :target="() => $refs.deleteImageButton" :disabled="tooltipDisabled" placement="top">
+ <gl-sprintf :message="tooltipTitle">
+ <template #docLink="{ content }">
+ <gl-link v-if="tooltipLink" :href="tooltipLink" target="_blank">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-tooltip>
</div>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue
index c1ec523574a..484903354e8 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue
@@ -8,11 +8,13 @@ import ListItem from '~/vue_shared/components/registry/list_item.vue';
import {
ASYNC_DELETE_IMAGE_ERROR_MESSAGE,
LIST_DELETE_BUTTON_DISABLED,
+ LIST_DELETE_BUTTON_DISABLED_FOR_MIGRATION,
REMOVE_REPOSITORY_LABEL,
ROW_SCHEDULED_FOR_DELETION,
CLEANUP_TIMED_OUT_ERROR_MESSAGE,
IMAGE_DELETE_SCHEDULED_STATUS,
IMAGE_FAILED_DELETED_STATUS,
+ IMAGE_MIGRATING_STATE,
ROOT_IMAGE_TEXT,
} from '../../constants/index';
import DeleteButton from '../delete_button.vue';
@@ -32,6 +34,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
+ inject: ['config'],
props: {
item: {
type: Object,
@@ -44,13 +47,12 @@ export default {
},
},
i18n: {
- LIST_DELETE_BUTTON_DISABLED,
REMOVE_REPOSITORY_LABEL,
ROW_SCHEDULED_FOR_DELETION,
},
computed: {
disabledDelete() {
- return !this.item.canDelete || this.deleting;
+ return !this.item.canDelete || this.deleting || this.migrating;
},
id() {
return getIdFromGraphQLId(this.item.id);
@@ -58,6 +60,9 @@ export default {
deleting() {
return this.item.status === IMAGE_DELETE_SCHEDULED_STATUS;
},
+ migrating() {
+ return this.item.migrationState === IMAGE_MIGRATING_STATE;
+ },
failedDelete() {
return this.item.status === IMAGE_FAILED_DELETED_STATUS;
},
@@ -83,6 +88,11 @@ export default {
routerLinkEvent() {
return this.deleting ? '' : 'click';
},
+ deleteButtonTooltipTitle() {
+ return this.migrating
+ ? LIST_DELETE_BUTTON_DISABLED_FOR_MIGRATION
+ : LIST_DELETE_BUTTON_DISABLED;
+ },
},
};
</script>
@@ -144,8 +154,9 @@ export default {
<delete-button
:title="$options.i18n.REMOVE_REPOSITORY_LABEL"
:disabled="disabledDelete"
- :tooltip-disabled="item.canDelete"
- :tooltip-title="$options.i18n.LIST_DELETE_BUTTON_DISABLED"
+ :tooltip-disabled="!disabledDelete"
+ :tooltip-link="config.containerRegistryImportingHelpPagePath"
+ :tooltip-title="deleteButtonTooltipTitle"
@delete="$emit('delete', item)"
/>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue
index 6d2ff9ea7b6..154e176dc6e 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue
@@ -1,4 +1,5 @@
<script>
+import { GlLink } from '@gitlab/ui';
import { approximateDuration, calculateRemainingMilliseconds } from '~/lib/utils/datetime_utility';
import { n__, sprintf } from '~/locale';
import MetadataItem from '~/vue_shared/components/registry/metadata_item.vue';
@@ -9,6 +10,7 @@ import {
LIST_INTRO_TEXT,
EXPIRATION_POLICY_WILL_RUN_IN,
EXPIRATION_POLICY_DISABLED_TEXT,
+ SET_UP_CLEANUP,
} from '../../constants/index';
export default {
@@ -16,6 +18,7 @@ export default {
components: {
TitleArea,
MetadataItem,
+ GlLink,
},
props: {
expirationPolicy: {
@@ -43,6 +46,16 @@ export default {
required: false,
default: false,
},
+ cleanupPoliciesSettingsPath: {
+ type: String,
+ default: '',
+ required: false,
+ },
+ showCleanupPolicyLink: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
loader: {
repeat: 10,
@@ -51,6 +64,7 @@ export default {
},
i18n: {
CONTAINER_REGISTRY_TITLE,
+ SET_UP_CLEANUP,
},
computed: {
imagesCountText() {
@@ -105,6 +119,9 @@ export default {
:text="expirationPolicyText"
size="xl"
/>
+ <gl-link v-if="showCleanupPolicyLink" class="gl-ml-2" :href="cleanupPoliciesSettingsPath">{{
+ $options.i18n.SET_UP_CLEANUP
+ }}</gl-link>
</template>
</title-area>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js
index 40f9b09a982..e584da23edb 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js
@@ -4,7 +4,7 @@ export const EXPIRATION_POLICY_WILL_RUN_IN = s__(
'ContainerRegistry|Expiration policy will run in %{time}',
);
export const EXPIRATION_POLICY_DISABLED_TEXT = s__(
- 'ContainerRegistry|Expiration policy is disabled',
+ 'ContainerRegistry|Expiration policy is disabled.',
);
export const DELETE_ALERT_TITLE = s__('ContainerRegistry|Some tags were not deleted');
export const DELETE_ALERT_LINK_TEXT = s__(
@@ -13,3 +13,4 @@ export const DELETE_ALERT_LINK_TEXT = s__(
export const CLEANUP_TIMED_OUT_ERROR_MESSAGE = s__(
'ContainerRegistry|Cleanup timed out before it could delete all tags',
);
+export const SET_UP_CLEANUP = s__('ContainerRegistry|Set up cleanup');
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js
index 7fa950ccfd0..c7022d6070f 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js
@@ -14,6 +14,9 @@ export const LIST_INTRO_TEXT = s__(
export const LIST_DELETE_BUTTON_DISABLED = s__(
'ContainerRegistry|Missing or insufficient permission, delete button disabled',
);
+export const LIST_DELETE_BUTTON_DISABLED_FOR_MIGRATION = s__(
+ `ContainerRegistry|Image repository temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}`,
+);
export const REMOVE_REPOSITORY_LABEL = s__('ContainerRegistry|Remove repository');
export const REMOVE_REPOSITORY_MODAL_TEXT = s__(
'ContainerRegistry|You are about to remove repository %{title}. Once you confirm, this repository will be permanently deleted.',
@@ -45,6 +48,7 @@ export const EMPTY_RESULT_MESSAGE = s__(
export const IMAGE_DELETE_SCHEDULED_STATUS = 'DELETE_SCHEDULED';
export const IMAGE_FAILED_DELETED_STATUS = 'DELETE_FAILED';
+export const IMAGE_MIGRATING_STATE = 'importing';
export const GRAPHQL_PAGE_SIZE = 10;
export const SORT_FIELDS = [
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql
index d753d33a02c..8c577cc7b17 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getContainerRepositoryTags(
$id: ID!
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/index.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/index.js
index ca5bd8d6964..a558550c91f 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/index.js
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/index.js
@@ -35,7 +35,7 @@ export default () => {
expirationPolicy,
isGroupPage,
isAdmin,
- showCleanupPolicyOnAlert,
+ showCleanupPolicyLink,
showUnfinishedTagCleanupCallout,
connectionError,
invalidPathError,
@@ -68,7 +68,7 @@ export default () => {
expirationPolicy: expirationPolicy ? JSON.parse(expirationPolicy) : undefined,
isGroupPage: parseBoolean(isGroupPage),
isAdmin: parseBoolean(isAdmin),
- showCleanupPolicyOnAlert: parseBoolean(showCleanupPolicyOnAlert),
+ showCleanupPolicyLink: parseBoolean(showCleanupPolicyLink),
showUnfinishedTagCleanupCallout: parseBoolean(showUnfinishedTagCleanupCallout),
connectionError: parseBoolean(connectionError),
invalidPathError: parseBoolean(invalidPathError),
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue
index 5f9e614bebb..d1cab406984 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue
@@ -11,7 +11,6 @@ import {
import { get } from 'lodash';
import getContainerRepositoriesQuery from 'shared_queries/container_registry/get_container_repositories.query.graphql';
import createFlash from '~/flash';
-import CleanupPolicyEnabledAlert from '~/packages_and_registries/shared/components/cleanup_policy_enabled_alert.vue';
import { FILTERED_SEARCH_TERM } from '~/packages_and_registries/shared/constants';
import Tracking from '~/tracking';
import PersistedSearch from '~/packages_and_registries/shared/components/persisted_search.vue';
@@ -60,7 +59,6 @@ export default {
GlSkeletonLoader,
RegistryHeader,
DeleteImage,
- CleanupPolicyEnabledAlert,
PersistedSearch,
},
directives: {
@@ -273,12 +271,6 @@ export default {
</gl-sprintf>
</gl-alert>
- <cleanup-policy-enabled-alert
- v-if="config.showCleanupPolicyOnAlert"
- :project-path="config.projectPath"
- :cleanup-policies-settings-path="config.cleanupPoliciesSettingsPath"
- />
-
<gl-empty-state
v-if="showConnectionError"
:title="$options.i18n.CONNECTION_ERROR_TITLE"
@@ -304,6 +296,8 @@ export default {
:expiration-policy="config.expirationPolicy"
:help-page-path="config.helpPagePath"
:hide-expiration-policy-data="config.isGroupPage"
+ :cleanup-policies-settings-path="config.cleanupPoliciesSettingsPath"
+ :show-cleanup-policy-link="config.showCleanupPolicyLink"
>
<template #commands>
<cli-commands
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue b/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
index eb112238c11..67c2ca02d20 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
@@ -1,13 +1,18 @@
<script>
import {
GlAlert,
+ GlDropdown,
+ GlDropdownItem,
GlEmptyState,
GlFormGroup,
GlFormInputGroup,
+ GlModal,
+ GlModalDirective,
GlSkeletonLoader,
GlSprintf,
} from '@gitlab/ui';
-import { s__ } from '~/locale';
+import { __, s__, n__, sprintf } from '~/locale';
+import Api from '~/api';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import TitleArea from '~/vue_shared/components/registry/title_area.vue';
import ManifestsList from '~/packages_and_registries/dependency_proxy/components/manifests_list.vue';
@@ -22,16 +27,22 @@ import getDependencyProxyDetailsQuery from '~/packages_and_registries/dependency
export default {
components: {
GlAlert,
+ GlDropdown,
+ GlDropdownItem,
GlEmptyState,
GlFormGroup,
GlFormInputGroup,
+ GlModal,
GlSkeletonLoader,
GlSprintf,
ClipboardButton,
TitleArea,
ManifestsList,
},
- inject: ['groupPath', 'dependencyProxyAvailable', 'noManifestsIllustration'],
+ directives: {
+ GlModalDirective,
+ },
+ inject: ['groupPath', 'groupId', 'dependencyProxyAvailable', 'noManifestsIllustration'],
i18n: {
proxyNotAvailableText: s__(
'DependencyProxy|Dependency Proxy feature is limited to public groups for now.',
@@ -41,6 +52,20 @@ export default {
blobCountAndSize: s__('DependencyProxy|Contains %{count} blobs of images (%{size})'),
pageTitle: s__('DependencyProxy|Dependency Proxy'),
noManifestTitle: s__('DependencyProxy|There are no images in the cache'),
+ deleteCacheAlertMessageSuccess: s__(
+ 'DependencyProxy|All items in the cache are scheduled for removal.',
+ ),
+ clearCache: s__('DependencyProxy|Clear cache'),
+ },
+ confirmClearCacheModal: 'confirm-clear-cache-modal',
+ modalButtons: {
+ primary: {
+ text: s__('DependencyProxy|Clear cache'),
+ attributes: [{ variant: 'danger' }],
+ },
+ secondary: {
+ text: __('Cancel'),
+ },
},
links: {
DEPENDENCY_PROXY_DOCS_PATH,
@@ -48,6 +73,8 @@ export default {
data() {
return {
group: {},
+ showDeleteCacheAlert: false,
+ deleteCacheAlertMessage: '',
};
},
apollo: {
@@ -80,6 +107,33 @@ export default {
manifests() {
return this.group.dependencyProxyManifests.nodes;
},
+ modalTitleWithCount() {
+ return sprintf(
+ n__(
+ 'Clear %{count} image from cache?',
+ 'Clear %{count} images from cache?',
+ this.group.dependencyProxyBlobCount,
+ ),
+ {
+ count: this.group.dependencyProxyBlobCount,
+ },
+ );
+ },
+ modalConfirmationMessageWithCount() {
+ return sprintf(
+ n__(
+ 'You are about to clear %{count} image from the cache. Once you confirm, the next time a pipeline runs it must pull an image or tag from Docker Hub. Are you sure?',
+ 'You are about to clear %{count} images from the cache. Once you confirm, the next time a pipeline runs it must pull an image or tag from Docker Hub. Are you sure?',
+ this.group.dependencyProxyBlobCount,
+ ),
+ {
+ count: this.group.dependencyProxyBlobCount,
+ },
+ );
+ },
+ showDeleteDropdown() {
+ return this.group.dependencyProxyBlobCount > 0;
+ },
},
methods: {
fetchNextPage() {
@@ -103,13 +157,47 @@ export default {
},
});
},
+ async submit() {
+ try {
+ await Api.deleteDependencyProxyCacheList(this.groupId);
+
+ this.deleteCacheAlertMessage = this.$options.i18n.deleteCacheAlertMessageSuccess;
+ this.showDeleteCacheAlert = true;
+ } catch (err) {
+ this.deleteCacheAlertMessage = err;
+ this.showDeleteCacheAlert = true;
+ }
+ },
},
};
</script>
<template>
<div>
- <title-area :title="$options.i18n.pageTitle" :info-messages="infoMessages" />
+ <gl-alert
+ v-if="showDeleteCacheAlert"
+ data-testid="delete-cache-alert"
+ @dismiss="showDeleteCacheAlert = false"
+ >
+ {{ deleteCacheAlertMessage }}
+ </gl-alert>
+ <title-area :title="$options.i18n.pageTitle" :info-messages="infoMessages">
+ <template v-if="showDeleteDropdown" #right-actions>
+ <gl-dropdown
+ icon="ellipsis_v"
+ text="More actions"
+ :text-sr-only="true"
+ category="tertiary"
+ no-caret
+ >
+ <gl-dropdown-item
+ v-gl-modal-directive="$options.confirmClearCacheModal"
+ variant="danger"
+ >{{ $options.i18n.clearCache }}</gl-dropdown-item
+ >
+ </gl-dropdown>
+ </template>
+ </title-area>
<gl-alert
v-if="!dependencyProxyAvailable"
:dismissible="false"
@@ -159,5 +247,15 @@ export default {
:title="$options.i18n.noManifestTitle"
/>
</div>
+
+ <gl-modal
+ :modal-id="$options.confirmClearCacheModal"
+ :title="modalTitleWithCount"
+ :action-primary="$options.modalButtons.primary"
+ :action-secondary="$options.modalButtons.secondary"
+ @primary="submit"
+ >
+ {{ modalConfirmationMessageWithCount }}
+ </gl-modal>
</div>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql b/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql
index 9241dccb2d5..5c43b10a5e3 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getDependencyProxyDetails(
$fullPath: ID!
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list.vue b/app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list.vue
new file mode 100644
index 00000000000..c1b5367c96a
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list.vue
@@ -0,0 +1,42 @@
+<script>
+import RegistryList from '~/packages_and_registries/shared/components/registry_list.vue';
+import HarborListRow from '~/packages_and_registries/harbor_registry/components/list/harbor_list_row.vue';
+
+export default {
+ name: 'HarborList',
+ components: {
+ RegistryList,
+ HarborListRow,
+ },
+ props: {
+ images: {
+ type: Array,
+ required: true,
+ },
+ metadataLoading: {
+ type: Boolean,
+ default: false,
+ required: false,
+ },
+ pageInfo: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <registry-list
+ :items="images"
+ :hidden-delete="true"
+ :pagination="pageInfo"
+ id-property="name"
+ @prev-page="$emit('prev-page')"
+ @next-page="$emit('next-page')"
+ >
+ <template #default="{ item }">
+ <harbor-list-row :item="item" :metadata-loading="metadataLoading" />
+ </template>
+ </registry-list>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list_header.vue b/app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list_header.vue
new file mode 100644
index 00000000000..086b9c73d75
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list_header.vue
@@ -0,0 +1,67 @@
+<script>
+import { sprintf } from '~/locale';
+import TitleArea from '~/vue_shared/components/registry/title_area.vue';
+import {
+ HARBOR_REGISTRY_TITLE,
+ LIST_INTRO_TEXT,
+ imagesCountInfoText,
+} from '~/packages_and_registries/harbor_registry/constants';
+import MetadataItem from '~/vue_shared/components/registry/metadata_item.vue';
+
+export default {
+ name: 'HarborListHeader',
+ components: {
+ TitleArea,
+ MetadataItem,
+ },
+ props: {
+ imagesCount: {
+ type: Number,
+ default: 0,
+ required: false,
+ },
+ helpPagePath: {
+ type: String,
+ default: '',
+ required: false,
+ },
+ metadataLoading: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ i18n: {
+ HARBOR_REGISTRY_TITLE,
+ },
+ computed: {
+ imagesCountText() {
+ const pluralisedString = imagesCountInfoText(this.imagesCount);
+ return sprintf(pluralisedString, { count: this.imagesCount });
+ },
+ infoMessages() {
+ return [{ text: LIST_INTRO_TEXT, link: this.helpPagePath }];
+ },
+ },
+};
+</script>
+
+<template>
+ <title-area
+ :title="$options.i18n.HARBOR_REGISTRY_TITLE"
+ :info-messages="infoMessages"
+ :metadata-loading="metadataLoading"
+ >
+ <template #right-actions>
+ <slot name="commands"></slot>
+ </template>
+ <template #metadata-count>
+ <metadata-item
+ v-if="imagesCount"
+ data-testid="images-count"
+ icon="container-image"
+ :text="imagesCountText"
+ />
+ </template>
+ </title-area>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list_row.vue b/app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list_row.vue
new file mode 100644
index 00000000000..258472fe16e
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/components/list/harbor_list_row.vue
@@ -0,0 +1,84 @@
+<script>
+import { GlIcon, GlSprintf, GlSkeletonLoader } from '@gitlab/ui';
+import { n__ } from '~/locale';
+
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+import ListItem from '~/vue_shared/components/registry/list_item.vue';
+
+export default {
+ name: 'HarborListRow',
+ components: {
+ ClipboardButton,
+ GlSprintf,
+ GlIcon,
+ ListItem,
+ GlSkeletonLoader,
+ },
+ props: {
+ item: {
+ type: Object,
+ required: true,
+ },
+ metadataLoading: {
+ type: Boolean,
+ default: false,
+ required: false,
+ },
+ },
+ computed: {
+ id() {
+ return this.item.id;
+ },
+ artifactCountText() {
+ return n__(
+ 'HarborRegistry|%{count} Tag',
+ 'HarborRegistry|%{count} Tags',
+ this.item.artifactCount,
+ );
+ },
+ imageName() {
+ return this.item.name;
+ },
+ },
+};
+</script>
+
+<template>
+ <list-item v-bind="$attrs">
+ <template #left-primary>
+ <router-link
+ class="gl-text-body gl-font-weight-bold"
+ data-testid="details-link"
+ data-qa-selector="registry_image_content"
+ :to="{ name: 'details', params: { id } }"
+ >
+ {{ imageName }}
+ </router-link>
+ <clipboard-button
+ v-if="item.location"
+ :text="item.location"
+ :title="item.location"
+ category="tertiary"
+ />
+ </template>
+ <template #left-secondary>
+ <template v-if="!metadataLoading">
+ <span class="gl-display-flex gl-align-items-center" data-testid="tags-count">
+ <gl-icon name="tag" class="gl-mr-2" />
+ <gl-sprintf :message="artifactCountText">
+ <template #count>
+ {{ item.artifactCount }}
+ </template>
+ </gl-sprintf>
+ </span>
+ </template>
+
+ <div v-else class="gl-w-full">
+ <gl-skeleton-loader :width="900" :height="16" preserve-aspect-ratio="xMinYMax meet">
+ <circle cx="6" cy="8" r="6" />
+ <rect x="16" y="4" width="100" height="8" rx="4" />
+ </gl-skeleton-loader>
+ </div>
+ </template>
+ </list-item>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/constants/common.js b/app/assets/javascripts/packages_and_registries/harbor_registry/constants/common.js
new file mode 100644
index 00000000000..a7891821755
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/constants/common.js
@@ -0,0 +1,29 @@
+import { s__, __ } from '~/locale';
+
+export const ROOT_IMAGE_TEXT = s__('HarborRegistry|Root image');
+export const NAME_SORT_FIELD = { orderBy: 'NAME', label: __('Name') };
+
+export const ASCENDING_ORDER = 'asc';
+export const DESCENDING_ORDER = 'desc';
+
+export const NAME_SORT_FIELD_KEY = 'name';
+export const UPDATED_SORT_FIELD_KEY = 'update_time';
+export const CREATED_SORT_FIELD_KEY = 'creation_time';
+
+export const SORT_FIELD_MAPPING = {
+ NAME: NAME_SORT_FIELD_KEY,
+ UPDATED: UPDATED_SORT_FIELD_KEY,
+ CREATED: CREATED_SORT_FIELD_KEY,
+};
+
+/* eslint-disable @gitlab/require-i18n-strings */
+export const dockerBuildCommand = (repositoryUrl) => {
+ return `docker build -t ${repositoryUrl} .`;
+};
+export const dockerPushCommand = (repositoryUrl) => {
+ return `docker push ${repositoryUrl}`;
+};
+export const dockerLoginCommand = (registryHostUrlWithPort) => {
+ return `docker login ${registryHostUrlWithPort}`;
+};
+/* eslint-enable @gitlab/require-i18n-strings */
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/constants/details.js b/app/assets/javascripts/packages_and_registries/harbor_registry/constants/details.js
new file mode 100644
index 00000000000..2519f6b74a2
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/constants/details.js
@@ -0,0 +1,39 @@
+import { s__, __ } from '~/locale';
+
+export const UPDATED_AT = s__('HarborRegistry|Last updated %{time}');
+
+export const MISSING_OR_DELETED_IMAGE_TITLE = s__(
+ 'HarborRegistry|The image repository could not be found.',
+);
+
+export const MISSING_OR_DELETED_IMAGE_MESSAGE = s__(
+ 'HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page.',
+);
+
+export const NO_TAGS_TITLE = s__('HarborRegistry|This image has no active tags');
+
+export const NO_TAGS_MESSAGE = s__(
+ `HarborRegistry|The last tag related to this image was recently removed.
+This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process.
+If you have any questions, contact your administrator.`,
+);
+
+export const NO_TAGS_MATCHING_FILTERS_TITLE = s__('HarborRegistry|The filter returned no results');
+
+export const NO_TAGS_MATCHING_FILTERS_DESCRIPTION = s__(
+ 'HarborRegistry|Please try different search criteria',
+);
+
+export const DIGEST_LABEL = s__('HarborRegistry|Digest: %{imageId}');
+export const CREATED_AT_LABEL = s__('HarborRegistry|Published %{timeInfo}');
+export const PUBLISHED_DETAILS_ROW_TEXT = s__(
+ 'HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}',
+);
+export const MANIFEST_DETAILS_ROW_TEST = s__('HarborRegistry|Manifest digest: %{digest}');
+export const CONFIGURATION_DETAILS_ROW_TEST = s__('HarborRegistry|Configuration digest: %{digest}');
+export const MISSING_MANIFEST_WARNING_TOOLTIP = s__(
+ 'HarborRegistry|Invalid tag: missing manifest digest',
+);
+
+export const NOT_AVAILABLE_TEXT = __('N/A');
+export const NOT_AVAILABLE_SIZE = __('0 bytes');
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/constants/index.js b/app/assets/javascripts/packages_and_registries/harbor_registry/constants/index.js
new file mode 100644
index 00000000000..22f462e0b97
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/constants/index.js
@@ -0,0 +1,3 @@
+export * from './common';
+export * from './list';
+export * from './details';
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/constants/list.js b/app/assets/javascripts/packages_and_registries/harbor_registry/constants/list.js
new file mode 100644
index 00000000000..a6cd59918ff
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/constants/list.js
@@ -0,0 +1,33 @@
+import { s__, __, n__ } from '~/locale';
+import { NAME_SORT_FIELD } from './common';
+
+// Translations strings
+
+export const HARBOR_REGISTRY_TITLE = s__('HarborRegistry|Harbor Registry');
+
+export const CONNECTION_ERROR_TITLE = s__('HarborRegistry|Harbor connection error');
+export const CONNECTION_ERROR_MESSAGE = s__(
+ `HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}.`,
+);
+export const LIST_INTRO_TEXT = s__(
+ `HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}`,
+);
+
+export const imagesCountInfoText = (count) => {
+ return n__(
+ 'HarborRegistry|%{count} Image repository',
+ 'HarborRegistry|%{count} Image repositories',
+ count,
+ );
+};
+
+export const EMPTY_RESULT_TITLE = s__('HarborRegistry|Sorry, your filter produced no results.');
+export const EMPTY_RESULT_MESSAGE = s__(
+ 'HarborRegistry|To widen your search, change or remove the filters above.',
+);
+
+export const SORT_FIELDS = [
+ { orderBy: 'UPDATED', label: __('Updated') },
+ { orderBy: 'CREATED', label: __('Created') },
+ NAME_SORT_FIELD,
+];
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/index.js b/app/assets/javascripts/packages_and_registries/harbor_registry/index.js
new file mode 100644
index 00000000000..ecfefead61a
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/index.js
@@ -0,0 +1,78 @@
+import { GlToast } from '@gitlab/ui';
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import PerformancePlugin from '~/performance/vue_performance_plugin';
+import Translate from '~/vue_shared/translate';
+import RegistryBreadcrumb from '~/packages_and_registries/shared/components/registry_breadcrumb.vue';
+import { renderBreadcrumb } from '~/packages_and_registries/shared/utils';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import {
+ dockerBuildCommand,
+ dockerPushCommand,
+ dockerLoginCommand,
+} from '~/packages_and_registries/harbor_registry/constants';
+import createRouter from './router';
+import HarborRegistryExplorer from './pages/index.vue';
+
+Vue.use(Translate);
+Vue.use(GlToast);
+
+Vue.use(PerformancePlugin, {
+ components: [
+ 'RegistryListPage',
+ 'ListHeader',
+ 'ImageListRow',
+ 'RegistryDetailsPage',
+ 'DetailsHeader',
+ 'TagsList',
+ ],
+});
+
+export default (id) => {
+ const el = document.getElementById(id);
+
+ if (!el) {
+ return null;
+ }
+
+ const { endpoint, connectionError, invalidPathError, isGroupPage, ...config } = el.dataset;
+
+ const breadCrumbState = Vue.observable({
+ name: '',
+ updateName(value) {
+ this.name = value;
+ },
+ });
+
+ const router = createRouter(endpoint, breadCrumbState);
+
+ const attachMainComponent = () => {
+ return new Vue({
+ el,
+ router,
+ provide() {
+ return {
+ breadCrumbState,
+ config: {
+ ...config,
+ connectionError: parseBoolean(connectionError),
+ invalidPathError: parseBoolean(invalidPathError),
+ isGroupPage: parseBoolean(isGroupPage),
+ helpPagePath: helpPagePath('user/packages/container_registry/index'),
+ },
+ dockerBuildCommand: dockerBuildCommand(config.repositoryUrl),
+ dockerPushCommand: dockerPushCommand(config.repositoryUrl),
+ dockerLoginCommand: dockerLoginCommand(config.registryHostUrlWithPort),
+ };
+ },
+ render(createElement) {
+ return createElement(HarborRegistryExplorer);
+ },
+ });
+ };
+
+ return {
+ attachBreadcrumb: renderBreadcrumb(router, null, RegistryBreadcrumb),
+ attachMainComponent,
+ };
+};
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/mock_api.js b/app/assets/javascripts/packages_and_registries/harbor_registry/mock_api.js
new file mode 100644
index 00000000000..50c7df1483c
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/mock_api.js
@@ -0,0 +1,200 @@
+const mockRequestFn = (mockData) => {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ resolve(mockData);
+ }, 2000);
+ });
+};
+export const harborListResponse = () => {
+ const harborListResponseData = {
+ repositories: [
+ {
+ artifactCount: 1,
+ creationTime: '2022-03-02T06:35:53.205Z',
+ id: 25,
+ name: 'shao/flinkx',
+ projectId: 21,
+ pullCount: 0,
+ updateTime: '2022-03-02T06:35:53.205Z',
+ location: 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
+ },
+ {
+ artifactCount: 1,
+ creationTime: '2022-03-02T06:35:53.205Z',
+ id: 26,
+ name: 'shao/flinkx1',
+ projectId: 21,
+ pullCount: 0,
+ updateTime: '2022-03-02T06:35:53.205Z',
+ location: 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
+ },
+ {
+ artifactCount: 1,
+ creationTime: '2022-03-02T06:35:53.205Z',
+ id: 27,
+ name: 'shao/flinkx2',
+ projectId: 21,
+ pullCount: 0,
+ updateTime: '2022-03-02T06:35:53.205Z',
+ location: 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
+ },
+ ],
+ totalCount: 3,
+ pageInfo: {
+ hasNextPage: false,
+ hasPreviousPage: false,
+ },
+ };
+
+ return mockRequestFn(harborListResponseData);
+};
+
+export const getHarborRegistryImageDetail = () => {
+ const harborRegistryImageDetailData = {
+ artifactCount: 1,
+ creationTime: '2022-03-02T06:35:53.205Z',
+ id: 25,
+ name: 'shao/flinkx',
+ projectId: 21,
+ pullCount: 0,
+ updateTime: '2022-03-02T06:35:53.205Z',
+ location: 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
+ tagsCount: 10,
+ };
+
+ return mockRequestFn(harborRegistryImageDetailData);
+};
+
+export const harborTagsResponse = () => {
+ const harborTagsResponseData = {
+ tags: [
+ {
+ digest: 'sha256:7f386a1844faf341353e1c20f2f39f11f397604fedc475435d13f756eeb235d1',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:02310e655103823920157bc4410ea361dc638bc2cda59667d2cb1f2a988e264c',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:02310e655103823920157bc4410ea361dc638bc2cda59667d2cb1f2a988e264c',
+ name: '02310e655103823920157bc4410ea361dc638bc2cda59667d2cb1f2a988e264c',
+ revision: 'f53bde3d44699e04e11cf15fb415046a0913e2623d878d89bc21adb2cbda5255',
+ shortRevision: 'f53bde3d4',
+ createdAt: '2022-03-02T23:59:05+00:00',
+ totalSize: '6623124',
+ },
+ {
+ digest: 'sha256:4554416b84c4568fe93086620b637064ed029737aabe7308b96d50e3d9d92ed7',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:02deb4dddf177212b50e883d5e4f6c03731fad1a18cd27261736cd9dbba79160',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:02deb4dddf177212b50e883d5e4f6c03731fad1a18cd27261736cd9dbba79160',
+ name: '02deb4dddf177212b50e883d5e4f6c03731fad1a18cd27261736cd9dbba79160',
+ revision: 'e1fe52d8bab66d71bd54a6b8784d3b9edbc68adbd6ea87f5fa44d9974144ef9e',
+ shortRevision: 'e1fe52d8b',
+ createdAt: '2022-02-10T01:09:56+00:00',
+ totalSize: '920760',
+ },
+ {
+ digest: 'sha256:14f37b60e52b9ce0e9f8f7094b311d265384798592f783487c30aaa3d58e6345',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:03bc5971bab1e849ba52a20a31e7273053f22b2ddb1d04bd6b77d53a2635727a',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:03bc5971bab1e849ba52a20a31e7273053f22b2ddb1d04bd6b77d53a2635727a',
+ name: '03bc5971bab1e849ba52a20a31e7273053f22b2ddb1d04bd6b77d53a2635727a',
+ revision: 'c72770c6eb93c421bc496964b4bffc742b1ec2e642cdab876be7afda1856029f',
+ shortRevision: 'c72770c6e',
+ createdAt: '2021-12-22T04:48:48+00:00',
+ totalSize: '48609053',
+ },
+ {
+ digest: 'sha256:e925e3b8277ea23f387ed5fba5e78280cfac7cfb261a78cf046becf7b6a3faae',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:03f495bc5714bff78bb14293320d336afdf47fd47ddff0c3c5f09f8da86d5d19',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:03f495bc5714bff78bb14293320d336afdf47fd47ddff0c3c5f09f8da86d5d19',
+ name: '03f495bc5714bff78bb14293320d336afdf47fd47ddff0c3c5f09f8da86d5d19',
+ revision: '1ac2a43194f4e15166abdf3f26e6ec92215240490b9cac834d63de1a3d87494a',
+ shortRevision: '1ac2a4319',
+ createdAt: '2022-03-09T11:02:27+00:00',
+ totalSize: '35141894',
+ },
+ {
+ digest: 'sha256:7d8303fd5c077787a8c879f8f66b69e2b5605f48ccd3f286e236fb0749fcc1ca',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:05a4e58231e54b70aab2d6f22ba4fbe10e48aa4ddcbfef11c5662241c2ae4fda',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:05a4e58231e54b70aab2d6f22ba4fbe10e48aa4ddcbfef11c5662241c2ae4fda',
+ name: '05a4e58231e54b70aab2d6f22ba4fbe10e48aa4ddcbfef11c5662241c2ae4fda',
+ revision: 'cf8fee086701016e1a84e6824f0c896951fef4cce9d4745459558b87eec3232c',
+ shortRevision: 'cf8fee086',
+ createdAt: '2022-01-21T11:31:43+00:00',
+ totalSize: '48716070',
+ },
+ {
+ digest: 'sha256:b33611cefe20e4a41a6e0dce356a5d7ef3c177ea7536a58652f5b3a4f2f83549',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:093d2746876997723541aec8b88687a4cdb3b5bbb0279c5089b7891317741a9a',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:093d2746876997723541aec8b88687a4cdb3b5bbb0279c5089b7891317741a9a',
+ name: '093d2746876997723541aec8b88687a4cdb3b5bbb0279c5089b7891317741a9a',
+ revision: '1a4b48198b13d55242c5164e64d41c4e9f75b5d9506bc6e0efc1534dd0dd1f15',
+ shortRevision: '1a4b48198',
+ createdAt: '2022-01-21T11:31:51+00:00',
+ totalSize: '6623127',
+ },
+ {
+ digest: 'sha256:d25c3c020e2dbd4711a67b9fe308f4cbb7b0bb21815e722a02f91c570dc5d519',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:09698b3fae81dfd6e02554dbc82930f304a6356c8f541c80e8598a42aed985f7',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:09698b3fae81dfd6e02554dbc82930f304a6356c8f541c80e8598a42aed985f7',
+ name: '09698b3fae81dfd6e02554dbc82930f304a6356c8f541c80e8598a42aed985f7',
+ revision: '03e2e2777dde01c30469ee8c710973dd08a7a4f70494d7dc1583c24b525d7f61',
+ shortRevision: '03e2e2777',
+ createdAt: '2022-03-02T23:58:20+00:00',
+ totalSize: '911377',
+ },
+ {
+ digest: 'sha256:fb760e4d2184e9e8e39d6917534d4610fe01009734698a5653b2de1391ba28f4',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:09b830c3eaf80d547f3b523d8e242a2c411085c349dab86c520f36c7b7644f95',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:09b830c3eaf80d547f3b523d8e242a2c411085c349dab86c520f36c7b7644f95',
+ name: '09b830c3eaf80d547f3b523d8e242a2c411085c349dab86c520f36c7b7644f95',
+ revision: '350e78d60646bf6967244448c6aaa14d21ecb9a0c6cf87e9ff0361cbe59b9012',
+ shortRevision: '350e78d60',
+ createdAt: '2022-01-19T13:49:14+00:00',
+ totalSize: '48710241',
+ },
+ {
+ digest: 'sha256:407250f380cea92729cbc038c420e74900f53b852e11edc6404fe75a0fd2c402',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:0d03504a17b467eafc8c96bde70af26c74bd459a32b7eb2dd189dd6b3c121557',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:0d03504a17b467eafc8c96bde70af26c74bd459a32b7eb2dd189dd6b3c121557',
+ name: '0d03504a17b467eafc8c96bde70af26c74bd459a32b7eb2dd189dd6b3c121557',
+ revision: '76038370b7f3904364891457c4a6a234897255e6b9f45d0a852bf3a7e5257e18',
+ shortRevision: '76038370b',
+ createdAt: '2022-01-24T12:56:22+00:00',
+ totalSize: '280065',
+ },
+ {
+ digest: 'sha256:ada87f25218542951ce6720c27f3d0758e90c2540bd129f5cfb9e15b31e07b07',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:0eb20a4a7cac2ebea821d420b3279654fe550fd8502f1785c1927aa84e5949eb',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:0eb20a4a7cac2ebea821d420b3279654fe550fd8502f1785c1927aa84e5949eb',
+ name: '0eb20a4a7cac2ebea821d420b3279654fe550fd8502f1785c1927aa84e5949eb',
+ revision: '3d4b49a7bbb36c48bb721f4d0e76e7950bec3878ee29cdfdd6da39f575d6d37f',
+ shortRevision: '3d4b49a7b',
+ createdAt: '2022-02-17T17:37:52+00:00',
+ totalSize: '48655767',
+ },
+ ],
+ totalCount: 10,
+ pageInfo: {
+ hasNextPage: false,
+ hasPreviousPage: true,
+ },
+ };
+
+ return mockRequestFn(harborTagsResponseData);
+};
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/pages/details.vue b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/details.vue
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/details.vue
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/pages/index.vue b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/index.vue
new file mode 100644
index 00000000000..dca63e1a569
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/index.vue
@@ -0,0 +1,5 @@
+<template>
+ <div>
+ <router-view ref="router-view" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/pages/list.vue b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/list.vue
new file mode 100644
index 00000000000..7aaef2ed57a
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/list.vue
@@ -0,0 +1,177 @@
+<script>
+import { GlEmptyState, GlSprintf, GlLink, GlSkeletonLoader } from '@gitlab/ui';
+import HarborListHeader from '~/packages_and_registries/harbor_registry/components/list/harbor_list_header.vue';
+import PersistedSearch from '~/packages_and_registries/shared/components/persisted_search.vue';
+import HarborList from '~/packages_and_registries/harbor_registry/components/list/harbor_list.vue';
+import { FILTERED_SEARCH_TERM } from '~/packages_and_registries/shared/constants';
+import {
+ SORT_FIELDS,
+ CONNECTION_ERROR_TITLE,
+ CONNECTION_ERROR_MESSAGE,
+ EMPTY_RESULT_TITLE,
+ EMPTY_RESULT_MESSAGE,
+} from '~/packages_and_registries/harbor_registry/constants';
+import Tracking from '~/tracking';
+import { harborListResponse } from '../mock_api';
+
+export default {
+ name: 'HarborListPage',
+ components: {
+ HarborListHeader,
+ HarborList,
+ GlSkeletonLoader,
+ GlEmptyState,
+ GlSprintf,
+ GlLink,
+ PersistedSearch,
+ CliCommands: () =>
+ import(
+ /* webpackChunkName: 'harbor_registry_components' */ '~/packages_and_registries/shared/components/cli_commands.vue'
+ ),
+ },
+ mixins: [Tracking.mixin()],
+ inject: ['config', 'dockerBuildCommand', 'dockerPushCommand', 'dockerLoginCommand'],
+ loader: {
+ repeat: 10,
+ width: 1000,
+ height: 40,
+ },
+ i18n: {
+ CONNECTION_ERROR_TITLE,
+ CONNECTION_ERROR_MESSAGE,
+ EMPTY_RESULT_TITLE,
+ EMPTY_RESULT_MESSAGE,
+ },
+ searchConfig: SORT_FIELDS,
+ data() {
+ return {
+ images: [],
+ totalCount: 0,
+ pageInfo: {},
+ filter: [],
+ isLoading: true,
+ sorting: null,
+ name: null,
+ };
+ },
+ computed: {
+ showCommands() {
+ return !this.isLoading && !this.config?.isGroupPage && this.images?.length;
+ },
+ showConnectionError() {
+ return this.config.connectionError || this.config.invalidPathError;
+ },
+ },
+ methods: {
+ fetchHarborImages() {
+ // TODO: Waiting for harbor api integration to finish: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82777
+ this.isLoading = true;
+
+ harborListResponse()
+ .then((res) => {
+ this.images = res?.repositories || [];
+ this.totalCount = res?.totalCount || 0;
+ this.pageInfo = res?.pageInfo || {};
+ this.isLoading = false;
+ })
+ .catch(() => {});
+ },
+ handleSearchUpdate({ sort, filters }) {
+ this.sorting = sort;
+
+ const search = filters.find((i) => i.type === FILTERED_SEARCH_TERM);
+ this.name = search?.value?.data;
+
+ this.fetchHarborImages();
+ },
+ fetchPrevPage() {
+ // TODO: Waiting for harbor api integration to finish: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82777
+ this.fetchHarborImages();
+ },
+ fetchNextPage() {
+ // TODO: Waiting for harbor api integration to finish: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82777
+ this.fetchHarborImages();
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <gl-empty-state
+ v-if="showConnectionError"
+ :title="$options.i18n.CONNECTION_ERROR_TITLE"
+ :svg-path="config.containersErrorImage"
+ >
+ <template #description>
+ <p>
+ <gl-sprintf :message="$options.i18n.CONNECTION_ERROR_MESSAGE">
+ <template #docLink="{ content }">
+ <gl-link :href="`${config.helpPagePath}#docker-connection-error`" target="_blank">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ </template>
+ </gl-empty-state>
+ <template v-else>
+ <harbor-list-header
+ :metadata-loading="isLoading"
+ :images-count="totalCount"
+ :help-page-path="config.helpPagePath"
+ >
+ <template #commands>
+ <cli-commands
+ v-if="showCommands"
+ :docker-build-command="dockerBuildCommand"
+ :docker-push-command="dockerPushCommand"
+ :docker-login-command="dockerLoginCommand"
+ />
+ </template>
+ </harbor-list-header>
+ <persisted-search
+ :sortable-fields="$options.searchConfig"
+ :default-order="$options.searchConfig[0].orderBy"
+ default-sort="desc"
+ @update="handleSearchUpdate"
+ />
+
+ <div v-if="isLoading" class="gl-mt-5">
+ <gl-skeleton-loader
+ v-for="index in $options.loader.repeat"
+ :key="index"
+ :width="$options.loader.width"
+ :height="$options.loader.height"
+ preserve-aspect-ratio="xMinYMax meet"
+ >
+ <rect width="500" x="10" y="10" height="20" rx="4" />
+ <circle cx="525" cy="20" r="10" />
+ <rect x="960" y="0" width="40" height="40" rx="4" />
+ </gl-skeleton-loader>
+ </div>
+ <template v-else>
+ <template v-if="images.length > 0 || name">
+ <harbor-list
+ v-if="images.length"
+ :images="images"
+ :meta-data-loading="isLoading"
+ :page-info="pageInfo"
+ @prev-page="fetchPrevPage"
+ @next-page="fetchNextPage"
+ />
+ <gl-empty-state
+ v-else
+ :svg-path="config.noContainersImage"
+ data-testid="emptySearch"
+ :title="$options.i18n.EMPTY_RESULT_TITLE"
+ >
+ <template #description>
+ {{ $options.i18n.EMPTY_RESULT_MESSAGE }}
+ </template>
+ </gl-empty-state>
+ </template>
+ </template>
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/router.js b/app/assets/javascripts/packages_and_registries/harbor_registry/router.js
new file mode 100644
index 00000000000..572dd382be3
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/harbor_registry/router.js
@@ -0,0 +1,35 @@
+import Vue from 'vue';
+import VueRouter from 'vue-router';
+import { HARBOR_REGISTRY_TITLE } from './constants/index';
+import List from './pages/list.vue';
+import Details from './pages/details.vue';
+
+Vue.use(VueRouter);
+
+export default function createRouter(base, breadCrumbState) {
+ const router = new VueRouter({
+ base,
+ mode: 'history',
+ routes: [
+ {
+ name: 'list',
+ path: '/',
+ component: List,
+ meta: {
+ nameGenerator: () => HARBOR_REGISTRY_TITLE,
+ root: true,
+ },
+ },
+ {
+ name: 'details',
+ path: '/:id',
+ component: Details,
+ meta: {
+ nameGenerator: () => breadCrumbState.name,
+ },
+ },
+ ],
+ });
+
+ return router;
+}
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/actions.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/actions.js
index 488860e5bc2..408d34fbe93 100644
--- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/actions.js
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/actions.js
@@ -26,6 +26,7 @@ export const receivePackagesListSuccess = ({ commit }, { data, headers }) => {
export const requestPackagesList = ({ dispatch, state }, params = {}) => {
dispatch('setLoading', true);
+ // eslint-disable-next-line camelcase
const { page = DEFAULT_PAGE, per_page = DEFAULT_PAGE_SIZE } = params;
const { sort, orderBy } = state.sorting;
const type = state.config.forceTerraform
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 c27083261b5..7a88e04d1f9 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
@@ -99,7 +99,6 @@ export default {
<local-storage-sync
storage-key="package_registry_list_sorting"
:value="sorting"
- as-json
@input="updateSorting"
>
<url-sync>
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
index 4b913590949..5bde5f08e56 100644
--- 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
@@ -1,5 +1,5 @@
#import "~/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql"
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getPackages(
$fullPath: ID!
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 7be3bba7cae..854c88b2ad3 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
@@ -9,7 +9,6 @@ import {
UNAVAILABLE_ADMIN_FEATURE_TEXT,
} from '~/packages_and_registries/settings/project/constants';
import expirationPolicyQuery from '~/packages_and_registries/settings/project/graphql/queries/get_expiration_policy.query.graphql';
-import CleanupPolicyEnabledAlert from '~/packages_and_registries/shared/components/cleanup_policy_enabled_alert.vue';
import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
import SettingsForm from './settings_form.vue';
@@ -18,19 +17,11 @@ export default {
components: {
SettingsBlock,
SettingsForm,
- CleanupPolicyEnabledAlert,
GlAlert,
GlSprintf,
GlLink,
},
- inject: [
- 'projectPath',
- 'isAdmin',
- 'adminSettingsPath',
- 'enableHistoricEntries',
- 'helpPagePath',
- 'showCleanupPolicyOnAlert',
- ],
+ inject: ['projectPath', 'isAdmin', 'adminSettingsPath', 'enableHistoricEntries', 'helpPagePath'],
i18n: {
UNAVAILABLE_FEATURE_TITLE,
UNAVAILABLE_FEATURE_INTRO_TEXT,
@@ -87,7 +78,6 @@ export default {
<template>
<section data-testid="registry-settings-app">
- <cleanup-policy-enabled-alert v-if="showCleanupPolicyOnAlert" :project-path="projectPath" />
<settings-block :collapsible="false">
<template #title> {{ __('Clean up image tags') }}</template>
<template #description>
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js b/app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js
index 2a3e2c28fa6..17c33073668 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js
+++ b/app/assets/javascripts/packages_and_registries/settings/project/registry_settings_bundle.js
@@ -20,7 +20,6 @@ export default () => {
adminSettingsPath,
tagsRegexHelpPagePath,
helpPagePath,
- showCleanupPolicyOnAlert,
} = el.dataset;
return new Vue({
el,
@@ -35,7 +34,6 @@ export default () => {
adminSettingsPath,
tagsRegexHelpPagePath,
helpPagePath,
- showCleanupPolicyOnAlert: parseBoolean(showCleanupPolicyOnAlert),
},
render(createElement) {
return createElement('registry-settings-app', {});
diff --git a/app/assets/javascripts/packages_and_registries/shared/components/cleanup_policy_enabled_alert.vue b/app/assets/javascripts/packages_and_registries/shared/components/cleanup_policy_enabled_alert.vue
deleted file mode 100644
index d51c62e0623..00000000000
--- a/app/assets/javascripts/packages_and_registries/shared/components/cleanup_policy_enabled_alert.vue
+++ /dev/null
@@ -1,54 +0,0 @@
-<script>
-import { GlSprintf, GlAlert, GlLink } from '@gitlab/ui';
-import { s__ } from '~/locale';
-import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
-
-export default {
- components: {
- GlAlert,
- GlLink,
- GlSprintf,
- LocalStorageSync,
- },
- props: {
- projectPath: {
- type: String,
- required: true,
- },
- cleanupPoliciesSettingsPath: {
- type: String,
- required: false,
- default: '',
- },
- },
- data() {
- return {
- dismissed: false,
- };
- },
- computed: {
- storageKey() {
- return `cleanup_policy_enabled_for_project_${this.projectPath}`;
- },
- },
- i18n: {
- message: s__(
- 'ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}',
- ),
- },
-};
-</script>
-
-<template>
- <local-storage-sync v-model="dismissed" :storage-key="storageKey">
- <gl-alert v-if="!dismissed" class="gl-mt-2" dismissible @dismiss="dismissed = true">
- <gl-sprintf :message="$options.i18n.message">
- <template #link="{ content }">
- <gl-link v-if="cleanupPoliciesSettingsPath" :href="cleanupPoliciesSettingsPath">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- </gl-alert>
- </local-storage-sync>
-</template>
diff --git a/app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue b/app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue
index 79381f82009..cc345fda7e8 100644
--- a/app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue
+++ b/app/assets/javascripts/packages_and_registries/shared/components/registry_list.vue
@@ -13,7 +13,8 @@ export default {
props: {
title: {
type: String,
- required: true,
+ default: '',
+ required: false,
},
isLoading: {
type: Boolean,
diff --git a/app/assets/javascripts/pager.js b/app/assets/javascripts/pager.js
index aa2f539b6e2..e15766a7839 100644
--- a/app/assets/javascripts/pager.js
+++ b/app/assets/javascripts/pager.js
@@ -22,7 +22,10 @@ export default {
this.prepareData = prepareData;
this.successCallback = successCallback;
this.errorCallback = errorCallback;
- this.loading = $(`${container} .loading`).first();
+ this.$container = $(container);
+ this.$loading = this.$container.length
+ ? this.$container.find('.loading').first()
+ : $('.loading').first();
if (preload) {
this.offset = 0;
this.getOld();
@@ -31,7 +34,7 @@ export default {
},
getOld() {
- this.loading.show();
+ this.$loading.show();
const url = $('.content_list').data('href') || removeParams(['limit', 'offset']);
axios
@@ -49,11 +52,11 @@ export default {
if (!this.disable && !this.isScrollable()) {
this.getOld();
} else {
- this.loading.hide();
+ this.$loading.hide();
}
})
.catch((err) => this.errorCallback(err))
- .finally(() => this.loading.hide());
+ .finally(() => this.$loading.hide());
},
append(count, html) {
@@ -83,8 +86,12 @@ export default {
fireOnce: true,
ceaseFire: () => this.disable === true,
callback: () => {
- if (!this.loading.is(':visible')) {
- this.loading.show();
+ if (this.$container.length && !this.$container.is(':visible')) {
+ return;
+ }
+
+ if (!this.$loading.is(':visible')) {
+ this.$loading.show();
this.getOld();
}
},
diff --git a/app/assets/javascripts/pages/admin/abuse_reports/abuse_reports.js b/app/assets/javascripts/pages/admin/abuse_reports/abuse_reports.js
index e78b3f9ec95..29e92a8abad 100644
--- a/app/assets/javascripts/pages/admin/abuse_reports/abuse_reports.js
+++ b/app/assets/javascripts/pages/admin/abuse_reports/abuse_reports.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import { parseBoolean } from '~/lib/utils/common_utils';
-import { truncate } from '../../../lib/utils/text_utility';
+import { truncate } from '~/lib/utils/text_utility';
const MAX_MESSAGE_LENGTH = 500;
const MESSAGE_CELL_SELECTOR = '.abuse-reports .message';
diff --git a/app/assets/javascripts/pages/admin/admin.js b/app/assets/javascripts/pages/admin/admin.js
index 6b7bfbf217d..e6c1d6d147b 100644
--- a/app/assets/javascripts/pages/admin/admin.js
+++ b/app/assets/javascripts/pages/admin/admin.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import { refreshCurrentPage } from '../../lib/utils/url_utility';
+import { refreshCurrentPage } from '~/lib/utils/url_utility';
export default function adminInit() {
$('input#user_force_random_password').on('change', function randomPasswordClick() {
diff --git a/app/assets/javascripts/pages/admin/application_settings/payload_downloader.js b/app/assets/javascripts/pages/admin/application_settings/payload_downloader.js
index 67eee2c3209..7c81cf80dc6 100644
--- a/app/assets/javascripts/pages/admin/application_settings/payload_downloader.js
+++ b/app/assets/javascripts/pages/admin/application_settings/payload_downloader.js
@@ -1,6 +1,6 @@
import createFlash from '~/flash';
-import axios from '../../../lib/utils/axios_utils';
-import { __ } from '../../../locale';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
export default class PayloadDownloader {
constructor(trigger) {
diff --git a/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js b/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js
index c017cf0afa2..ae08806fe4c 100644
--- a/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js
+++ b/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js
@@ -1,6 +1,6 @@
import createFlash from '~/flash';
-import axios from '../../../lib/utils/axios_utils';
-import { __ } from '../../../locale';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
export default class PayloadPreviewer {
constructor(trigger) {
diff --git a/app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js b/app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js
index 70b896f6372..a50d8de0e88 100644
--- a/app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js
+++ b/app/assets/javascripts/pages/admin/application_settings/signup_restrictions.js
@@ -23,6 +23,7 @@ export default function initSignupRestrictions(elementSelector = '#js-signup-for
return new Vue({
el,
+ name: 'SignupRestrictions',
provide: {
...parsedDataset,
},
diff --git a/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js b/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js
index 2a7e6a45cdd..18ba89f8856 100644
--- a/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js
+++ b/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js
@@ -2,52 +2,41 @@ import $ from 'jquery';
import { debounce } from 'lodash';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import { textColorForBackground } from '~/lib/utils/color_utils';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { __ } from '~/locale';
export default () => {
- const $broadcastMessageColor = $('.js-broadcast-message-color');
+ const $broadcastMessageTheme = $('.js-broadcast-message-theme');
const $broadcastMessageType = $('.js-broadcast-message-type');
- const $broadcastBannerMessagePreview = $('.js-broadcast-banner-message-preview');
+ const $broadcastBannerMessagePreview = $('.js-broadcast-banner-message-preview [role="alert"]');
const $broadcastMessage = $('.js-broadcast-message-message');
- const $jsBroadcastMessagePreview = $('.js-broadcast-message-preview');
+ const $jsBroadcastMessagePreview = $('#broadcast-message-preview');
const reloadPreview = function reloadPreview() {
const previewPath = $broadcastMessage.data('previewPath');
const message = $broadcastMessage.val();
const type = $broadcastMessageType.val();
-
- if (message === '') {
- $jsBroadcastMessagePreview.text(__('Your message here'));
- } else {
- axios
- .post(previewPath, {
- broadcast_message: {
- message,
- broadcast_type: type,
- },
- })
- .then(({ data }) => {
- $jsBroadcastMessagePreview.html(data.message);
- })
- .catch(() =>
- createFlash({
- message: __('An error occurred while rendering preview broadcast message'),
- }),
- );
- }
+ const theme = $broadcastMessageTheme.val();
+
+ axios
+ .post(previewPath, {
+ broadcast_message: {
+ message,
+ broadcast_type: type,
+ theme,
+ },
+ })
+ .then(({ data }) => {
+ $jsBroadcastMessagePreview.html(data);
+ })
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while rendering preview broadcast message'),
+ }),
+ );
};
- $broadcastMessageColor.on('input', function onMessageColorInput() {
- const previewColor = $(this).val();
- $broadcastBannerMessagePreview.css('background-color', previewColor);
- });
-
- $('input#broadcast_message_font').on('input', function onMessageFontInput() {
- const previewColor = $(this).val();
- $broadcastBannerMessagePreview.css('color', previewColor);
- });
+ $broadcastMessageTheme.on('change', reloadPreview);
$broadcastMessageType.on('change', () => {
const $broadcastMessageColorFormGroup = $('.js-broadcast-message-background-color-form-group');
@@ -68,37 +57,4 @@ export default () => {
reloadPreview();
}, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
);
-
- const updateColorPreview = () => {
- const selectedBackgroundColor = $broadcastMessageColor.val();
- const contrastTextColor = textColorForBackground(selectedBackgroundColor);
-
- // save contrastTextColor to hidden input field
- $('input.text-font-color').val(contrastTextColor);
-
- // Updates the preview color with the hex-color input
- const selectedColorStyle = {
- backgroundColor: selectedBackgroundColor,
- color: contrastTextColor,
- };
-
- $('.label-color-preview').css(selectedColorStyle);
-
- return $jsBroadcastMessagePreview.css(selectedColorStyle);
- };
-
- const setSuggestedColor = (e) => {
- const color = $(e.currentTarget).data('color');
- $broadcastMessageColor
- .val(color)
- // Notify the form, that color has changed
- .trigger('input');
- // Only banner supports colors
- if ($broadcastMessageType === 'banner') {
- updateColorPreview();
- }
- return e.preventDefault();
- };
-
- $(document).on('click', '.suggest-colors a', setSuggestedColor);
};
diff --git a/app/assets/javascripts/pages/admin/groups/new/index.js b/app/assets/javascripts/pages/admin/groups/new/index.js
index 1630cfb8253..710d2d72f4c 100644
--- a/app/assets/javascripts/pages/admin/groups/new/index.js
+++ b/app/assets/javascripts/pages/admin/groups/new/index.js
@@ -1,6 +1,6 @@
import initFilePickers from '~/file_pickers';
-import BindInOut from '../../../../behaviors/bind_in_out';
-import Group from '../../../../group';
+import BindInOut from '~/behaviors/bind_in_out';
+import Group from '~/group';
(() => {
BindInOut.initAll();
diff --git a/app/assets/javascripts/pages/admin/index.js b/app/assets/javascripts/pages/admin/index.js
index f0f85b82e2b..a249864fa36 100644
--- a/app/assets/javascripts/pages/admin/index.js
+++ b/app/assets/javascripts/pages/admin/index.js
@@ -1,6 +1,6 @@
import initGitlabVersionCheck from '~/gitlab_version_check';
-import initAdminStatisticsPanel from '../../admin/statistics_panel/index';
-import initVueAlerts from '../../vue_alerts';
+import initAdminStatisticsPanel from '~/admin/statistics_panel/index';
+import initVueAlerts from '~/vue_alerts';
import initAdmin from './admin';
initVueAlerts();
diff --git a/app/assets/javascripts/pages/groups/clusters/index/index.js b/app/assets/javascripts/pages/groups/clusters/index/index.js
index a99e0dfa4f0..a1ba920b322 100644
--- a/app/assets/javascripts/pages/groups/clusters/index/index.js
+++ b/app/assets/javascripts/pages/groups/clusters/index/index.js
@@ -1,8 +1,6 @@
import initClustersListApp from '~/clusters_list';
import PersistentUserCallout from '~/persistent_user_callout';
-document.addEventListener('DOMContentLoaded', () => {
- const callout = document.querySelector('.gcp-signup-offer');
- PersistentUserCallout.factory(callout);
- initClustersListApp();
-});
+const callout = document.querySelector('.gcp-signup-offer');
+PersistentUserCallout.factory(callout);
+initClustersListApp();
diff --git a/app/assets/javascripts/pages/groups/crm/contacts/index.js b/app/assets/javascripts/pages/groups/crm/contacts/index.js
index a595246957f..6af47621c1d 100644
--- a/app/assets/javascripts/pages/groups/crm/contacts/index.js
+++ b/app/assets/javascripts/pages/groups/crm/contacts/index.js
@@ -1,3 +1,3 @@
-import initCrmContactsApp from '~/crm/contacts_bundle';
+import initCrmContactsApp from '~/crm/contacts/bundle';
initCrmContactsApp();
diff --git a/app/assets/javascripts/pages/groups/crm/organizations/index.js b/app/assets/javascripts/pages/groups/crm/organizations/index.js
index 16479b43d52..2ad0904688e 100644
--- a/app/assets/javascripts/pages/groups/crm/organizations/index.js
+++ b/app/assets/javascripts/pages/groups/crm/organizations/index.js
@@ -1,3 +1,3 @@
-import initCrmOrganizationsApp from '~/crm/organizations_bundle';
+import initCrmOrganizationsApp from '~/crm/organizations/bundle';
initCrmOrganizationsApp();
diff --git a/app/assets/javascripts/pages/groups/edit/index.js b/app/assets/javascripts/pages/groups/edit/index.js
index 96487e14e30..58ca195d7b9 100644
--- a/app/assets/javascripts/pages/groups/edit/index.js
+++ b/app/assets/javascripts/pages/groups/edit/index.js
@@ -10,21 +10,19 @@ import initSearchSettings from '~/search_settings';
import initSettingsPanels from '~/settings_panels';
import initConfirmDanger from '~/init_confirm_danger';
-document.addEventListener('DOMContentLoaded', () => {
- initFilePickers();
- initConfirmDanger();
- initSettingsPanels();
- initTransferGroupForm();
- dirtySubmitFactory(
- document.querySelectorAll('.js-general-settings-form, .js-general-permissions-form'),
- );
- mountBadgeSettings(GROUP_BADGE);
+initFilePickers();
+initConfirmDanger();
+initSettingsPanels();
+initTransferGroupForm();
+dirtySubmitFactory(
+ document.querySelectorAll('.js-general-settings-form, .js-general-permissions-form'),
+);
+mountBadgeSettings(GROUP_BADGE);
- // Initialize Subgroups selector
- groupsSelect();
+// Initialize Subgroups selector
+groupsSelect();
- projectSelect();
+projectSelect();
- initSearchSettings();
- initCascadingSettingsLockPopovers();
-});
+initSearchSettings();
+initCascadingSettingsLockPopovers();
diff --git a/app/assets/javascripts/pages/groups/group_members/index.js b/app/assets/javascripts/pages/groups/group_members/index.js
index 280b544af3c..79ac31f1659 100644
--- a/app/assets/javascripts/pages/groups/group_members/index.js
+++ b/app/assets/javascripts/pages/groups/group_members/index.js
@@ -12,9 +12,16 @@ const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions'];
initMembersApp(document.querySelector('.js-group-members-list-app'), {
[MEMBER_TYPES.user]: {
- tableFields: SHARED_FIELDS.concat(['source', 'granted']),
+ tableFields: SHARED_FIELDS.concat(['source', 'granted', 'userCreatedAt', 'lastActivityOn']),
tableAttrs: { tr: { 'data-qa-selector': 'member_row' } },
- tableSortableFields: ['account', 'granted', 'maxRole', 'lastSignIn'],
+ tableSortableFields: [
+ 'account',
+ 'granted',
+ 'maxRole',
+ 'lastSignIn',
+ 'userCreatedAt',
+ 'lastActivityOn',
+ ],
requestFormatter: groupMemberRequestFormatter,
filteredSearchBar: {
show: true,
@@ -25,12 +32,25 @@ initMembersApp(document.querySelector('.js-group-members-list-app'), {
},
},
[MEMBER_TYPES.group]: {
- tableFields: SHARED_FIELDS.concat('granted'),
+ tableFields: gon?.features?.groupMemberInheritedGroup
+ ? SHARED_FIELDS.concat(['source', 'granted'])
+ : SHARED_FIELDS.concat(['granted']),
tableAttrs: {
table: { 'data-qa-selector': 'groups_list' },
tr: { 'data-qa-selector': 'group_row' },
},
requestFormatter: groupLinkRequestFormatter,
+ ...(gon?.features?.groupMemberInheritedGroup
+ ? {
+ filteredSearchBar: {
+ show: true,
+ tokens: ['with_inherited_permissions'],
+ searchParam: 'search_groups',
+ placeholder: s__('Members|Filter groups'),
+ recentSearchesStorageKey: 'group_links_members',
+ },
+ }
+ : {}),
},
[MEMBER_TYPES.invite]: {
tableFields: SHARED_FIELDS.concat('invited'),
diff --git a/app/assets/javascripts/pages/groups/harbor/repositories/index.js b/app/assets/javascripts/pages/groups/harbor/repositories/index.js
new file mode 100644
index 00000000000..0ecce44be54
--- /dev/null
+++ b/app/assets/javascripts/pages/groups/harbor/repositories/index.js
@@ -0,0 +1,8 @@
+import HarborRegistryExplorer from '~/packages_and_registries/harbor_registry/index';
+
+const explorer = HarborRegistryExplorer('js-harbor-registry-list-group');
+
+if (explorer) {
+ explorer.attachBreadcrumb();
+ explorer.attachMainComponent();
+}
diff --git a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
index 0ec382983a5..9a4054eb110 100644
--- a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
+++ b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
@@ -111,7 +111,7 @@ export default {
},
getFullDestinationUrl(params) {
- return joinPaths(gon.relative_url_root || '', this.getDestinationUrl(params));
+ return joinPaths(gon.relative_url_root || '', '/', this.getDestinationUrl(params));
},
},
@@ -161,7 +161,7 @@ export default {
>
</template>
<template #row-details="{ item }">
- <pre>{{ item.failures }}</pre>
+ <pre><code>{{ item.failures }}</code></pre>
</template>
</gl-table>
<pagination-bar
diff --git a/app/assets/javascripts/pages/import/history/components/import_error_details.vue b/app/assets/javascripts/pages/import/history/components/import_error_details.vue
new file mode 100644
index 00000000000..33ba73317f8
--- /dev/null
+++ b/app/assets/javascripts/pages/import/history/components/import_error_details.vue
@@ -0,0 +1,43 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import API from '~/api';
+import { createAlert } from '~/flash';
+import { DEFAULT_ERROR } from '../utils/error_messages';
+
+export default {
+ components: {
+ GlLoadingIcon,
+ },
+ props: {
+ id: {
+ type: Number,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ loading: true,
+ error: null,
+ };
+ },
+ async mounted() {
+ try {
+ const {
+ data: { import_error: importError },
+ } = await API.project(this.id);
+ this.error = importError;
+ } catch (e) {
+ createAlert({ message: DEFAULT_ERROR });
+ this.error = null;
+ } finally {
+ this.loading = false;
+ }
+ },
+};
+</script>
+<template>
+ <gl-loading-icon v-if="loading" size="md" />
+ <pre
+ v-else
+ ><code>{{ error || s__('BulkImport|No additional information provided.') }}</code></pre>
+</template>
diff --git a/app/assets/javascripts/pages/import/history/components/import_history_app.vue b/app/assets/javascripts/pages/import/history/components/import_history_app.vue
new file mode 100644
index 00000000000..557e25f66e2
--- /dev/null
+++ b/app/assets/javascripts/pages/import/history/components/import_history_app.vue
@@ -0,0 +1,199 @@
+<script>
+import { GlButton, GlEmptyState, GlIcon, GlLink, GlLoadingIcon, GlTable } from '@gitlab/ui';
+import { s__, __ } from '~/locale';
+import createFlash from '~/flash';
+import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
+import { getProjects } from '~/rest_api';
+import ImportStatus from '~/import_entities/components/import_status.vue';
+import PaginationBar from '~/vue_shared/components/pagination_bar/pagination_bar.vue';
+import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
+import { DEFAULT_ERROR } from '../utils/error_messages';
+import ImportErrorDetails from './import_error_details.vue';
+
+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,
+ GlIcon,
+ GlLink,
+ GlLoadingIcon,
+ GlTable,
+ PaginationBar,
+ ImportStatus,
+ ImportErrorDetails,
+ TimeAgo,
+ },
+
+ inject: ['assets'],
+
+ data() {
+ return {
+ loading: true,
+ historyItems: [],
+ paginationConfig: {
+ page: 1,
+ perPage: DEFAULT_PER_PAGE,
+ },
+ pageInfo: {},
+ };
+ },
+
+ fields: [
+ tableCell({
+ key: 'source',
+ label: s__('BulkImport|Source'),
+ thClass: `${DEFAULT_TH_CLASSES} gl-w-30p`,
+ }),
+ tableCell({
+ key: 'destination',
+ label: s__('BulkImport|Destination'),
+ 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 getProjects(undefined, {
+ imported: true,
+ simple: false,
+ 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;
+ }
+ },
+
+ hasHttpProtocol(url) {
+ try {
+ const parsedUrl = new URL(url);
+ return ['http:', 'https:'].includes(parsedUrl.protocol);
+ } catch (e) {
+ return false;
+ }
+ },
+
+ setPageSize(size) {
+ this.paginationConfig.perPage = size;
+ this.paginationConfig.page = 1;
+ },
+ },
+};
+</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="assets.gitlabLogo" class="gl-w-6 gl-h-6 gl-mb-2 gl-display-inline gl-mr-2" />
+ {{ s__('BulkImport|Project 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 projects 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(source)="{ item }">
+ <template v-if="item.import_url">
+ <gl-link
+ v-if="hasHttpProtocol(item.import_url)"
+ :href="item.import_url"
+ target="_blank"
+ >
+ {{ item.import_url }}
+ <gl-icon name="external-link" class="gl-vertical-align-middle" />
+ </gl-link>
+ <span v-else>{{ item.import_url }}</span>
+ </template>
+ <span v-else>{{
+ s__('BulkImport|Template / File-based import / GitLab Migration')
+ }}</span>
+ </template>
+ <template #cell(destination)="{ item }">
+ <gl-link :href="item.http_url_to_repo">
+ {{ item.path_with_namespace }}
+ </gl-link>
+ </template>
+ <template #cell(created_at)="{ value }">
+ <time-ago :time="value" />
+ </template>
+ <template #cell(status)="{ item, toggleDetails, detailsShowing }">
+ <import-status :status="item.import_status" class="gl-display-inline-block gl-w-13" />
+ <gl-button
+ v-if="item.import_status === 'failed'"
+ class="gl-ml-3"
+ :selected="detailsShowing"
+ @click="toggleDetails"
+ >{{ __('Details') }}</gl-button
+ >
+ </template>
+ <template #row-details="{ item }">
+ <import-error-details :id="item.id" />
+ </template>
+ </gl-table>
+ <pagination-bar
+ :page-info="pageInfo"
+ class="gl-m-0 gl-mt-3"
+ @set-page="paginationConfig.page = $event"
+ @set-page-size="setPageSize"
+ />
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pages/import/history/index.js b/app/assets/javascripts/pages/import/history/index.js
new file mode 100644
index 00000000000..d540272c266
--- /dev/null
+++ b/app/assets/javascripts/pages/import/history/index.js
@@ -0,0 +1,21 @@
+import Vue from 'vue';
+import ImportHistoryApp from './components/import_history_app.vue';
+
+function mountImportHistoryApp(mountElement) {
+ if (!mountElement) return undefined;
+
+ return new Vue({
+ el: mountElement,
+ name: 'ImportHistoryRoot',
+ provide: {
+ assets: {
+ gitlabLogo: mountElement.dataset.logo,
+ },
+ },
+ render(createElement) {
+ return createElement(ImportHistoryApp);
+ },
+ });
+}
+
+mountImportHistoryApp(document.querySelector('#import-history-mount-element'));
diff --git a/app/assets/javascripts/pages/import/history/utils/error_messages.js b/app/assets/javascripts/pages/import/history/utils/error_messages.js
new file mode 100644
index 00000000000..24669e22ade
--- /dev/null
+++ b/app/assets/javascripts/pages/import/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/preferences/show/index.js b/app/assets/javascripts/pages/profiles/preferences/show/index.js
index d489ed80f46..76939434680 100644
--- a/app/assets/javascripts/pages/profiles/preferences/show/index.js
+++ b/app/assets/javascripts/pages/profiles/preferences/show/index.js
@@ -1,3 +1,5 @@
import initProfilePreferences from '~/profile/preferences/profile_preferences_bundle';
+import initProfilePreferencesDiffsColors from '~/profile/preferences/profile_preferences_diffs_colors';
-document.addEventListener('DOMContentLoaded', initProfilePreferences);
+initProfilePreferences();
+initProfilePreferencesDiffsColors();
diff --git a/app/assets/javascripts/pages/projects/commit/show/index.js b/app/assets/javascripts/pages/projects/commit/show/index.js
index c6a76df7bde..eca3cf7ab13 100644
--- a/app/assets/javascripts/pages/projects/commit/show/index.js
+++ b/app/assets/javascripts/pages/projects/commit/show/index.js
@@ -1,5 +1,6 @@
/* eslint-disable no-new */
import $ from 'jquery';
+import Vue from 'vue';
import loadAwardsHandler from '~/awards_handler';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import Diff from '~/diff';
@@ -14,6 +15,7 @@ import { initCommitBoxInfo } from '~/projects/commit_box/info';
import syntaxHighlight from '~/syntax_highlight';
import ZenMode from '~/zen_mode';
import '~/sourcegraph/load';
+import DiffStats from '~/diffs/components/diff_stats.vue';
const hasPerfBar = document.querySelector('.with-performance-bar');
const performanceHeight = hasPerfBar ? 35 : 0;
@@ -25,6 +27,33 @@ initCommitBoxInfo();
initDeprecatedNotes();
+const loadDiffStats = () => {
+ const diffStatsElements = document.querySelectorAll('#js-diff-stats');
+
+ if (diffStatsElements.length) {
+ diffStatsElements.forEach((diffStatsEl) => {
+ const { addedLines, removedLines, oldSize, newSize, viewerName } = diffStatsEl.dataset;
+
+ new Vue({
+ el: diffStatsEl,
+ render(createElement) {
+ return createElement(DiffStats, {
+ props: {
+ diffFile: {
+ old_size: oldSize,
+ new_size: newSize,
+ viewer: { name: viewerName },
+ },
+ addedLines: Number(addedLines),
+ removedLines: Number(removedLines),
+ },
+ });
+ },
+ });
+ });
+ }
+};
+
const filesContainer = $('.js-diffs-batch');
if (filesContainer.length) {
@@ -37,12 +66,15 @@ if (filesContainer.length) {
syntaxHighlight(filesContainer);
handleLocationHash();
new Diff();
+ loadDiffStats();
})
.catch(() => {
createFlash({ message: __('An error occurred while retrieving diff files') });
});
} else {
new Diff();
+ loadDiffStats();
}
+
loadAwardsHandler();
initCommitActions();
diff --git a/app/assets/javascripts/pages/projects/harbor/repositories/index.js b/app/assets/javascripts/pages/projects/harbor/repositories/index.js
new file mode 100644
index 00000000000..efbe24ac346
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/harbor/repositories/index.js
@@ -0,0 +1,8 @@
+import HarborRegistryExplorer from '~/packages_and_registries/harbor_registry/index';
+
+const explorer = HarborRegistryExplorer('js-harbor-registry-list-project');
+
+if (explorer) {
+ explorer.attachBreadcrumb();
+ explorer.attachMainComponent();
+}
diff --git a/app/assets/javascripts/pages/projects/index.js b/app/assets/javascripts/pages/projects/index.js
index 8ec6e5e66b3..7380055cbbf 100644
--- a/app/assets/javascripts/pages/projects/index.js
+++ b/app/assets/javascripts/pages/projects/index.js
@@ -1,5 +1,5 @@
-import ShortcutsNavigation from '../../behaviors/shortcuts/shortcuts_navigation';
-import initTerraformNotification from '../../projects/terraform_notification';
+import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
+import initTerraformNotification from '~/projects/terraform_notification';
import { initSidebarTracking } from '../shared/nav/sidebar_tracking';
import Project from './project';
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue
index 67962d69fa5..db9ef4df8af 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab.vue
@@ -127,8 +127,12 @@ export default {
</p>
<gl-progress-bar :value="progressValue" :max="$options.maxValue" />
</div>
- <div class="row row-cols-1 row-cols-md-3 gl-mt-5">
- <div v-for="section in $options.actionSections" :key="section" class="col gl-mb-6">
+ <div class="row">
+ <div
+ v-for="section in $options.actionSections"
+ :key="section"
+ class="gl-mt-5 col-sm-12 col-mb-6 col-lg-4"
+ >
<learn-gitlab-section-card
:section="section"
:svg="svgFor(section)"
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_card.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_card.vue
index 6a196687a76..e8f0e6c47ee 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_card.vue
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_card.vue
@@ -34,17 +34,23 @@ export default {
};
</script>
<template>
- <gl-card class="gl-pt-0 learn-gitlab-section-card">
- <div class="learn-gitlab-section-card-header">
+ <gl-card
+ class="gl-pt-0 h-100"
+ header-class="gl-bg-white gl-border-0 gl-pb-0"
+ body-class="gl-pt-0"
+ >
+ <template #header>
<img :src="svg" />
<h2 class="gl-font-lg gl-mb-3">{{ $options.i18n[section].title }}</h2>
<p class="gl-text-gray-700 gl-mb-6">{{ $options.i18n[section].description }}</p>
- </div>
- <learn-gitlab-section-link
- v-for="[action, value] in sortedActions"
- :key="action"
- :action="action"
- :value="value"
- />
+ </template>
+ <template #default>
+ <learn-gitlab-section-link
+ v-for="[action, value] in sortedActions"
+ :key="action"
+ :action="action"
+ :value="value"
+ />
+ </template>
</gl-card>
</template>
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue
index 573f996a254..1667f2c3576 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue
@@ -1,16 +1,25 @@
<script>
-import { GlLink, GlIcon } from '@gitlab/ui';
+import { GlLink, GlIcon, GlButton, GlTooltipDirective as GlTooltip } from '@gitlab/ui';
+import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
import { isExperimentVariant } from '~/experimentation/utils';
import eventHub from '~/invite_members/event_hub';
-import { s__ } from '~/locale';
+import { s__, __ } from '~/locale';
import { ACTION_LABELS } from '../constants';
export default {
name: 'LearnGitlabSectionLink',
- components: { GlLink, GlIcon },
+ components: {
+ GlLink,
+ GlIcon,
+ GlButton,
+ GitlabExperiment,
+ },
+ directives: {
+ GlTooltip,
+ },
i18n: {
- ACTION_LABELS,
trialOnly: s__('LearnGitlab|Trial only'),
+ watchHow: __('Watch how'),
},
props: {
action: {
@@ -23,6 +32,9 @@ export default {
},
},
computed: {
+ linkTitle() {
+ return ACTION_LABELS[this.action].title;
+ },
trialOnly() {
return ACTION_LABELS[this.action].trialRequired;
},
@@ -34,6 +46,9 @@ export default {
openInNewTab() {
return ACTION_LABELS[this.action]?.openInNewTab === true || this.value.openInNewTab === true;
},
+ linkToVideoTutorial() {
+ return ACTION_LABELS[this.action].videoTutorial;
+ },
},
methods: {
openModal() {
@@ -44,32 +59,55 @@ export default {
</script>
<template>
<div class="gl-mb-4">
- <span v-if="value.completed" class="gl-text-green-500">
- <gl-icon name="check-circle-filled" :size="16" data-testid="completed-icon" />
- {{ $options.i18n.ACTION_LABELS[action].title }}
- </span>
- <gl-link
- v-else-if="showInviteModalLink"
- data-track-action="click_link"
- :data-track-label="$options.i18n.ACTION_LABELS[action].title"
- data-track-property="Growth::Activation::Experiment::InviteForHelpContinuousOnboarding"
- data-testid="invite-for-help-continuous-onboarding-experiment-link"
- @click="openModal"
- >
- {{ $options.i18n.ACTION_LABELS[action].title }}
- </gl-link>
- <gl-link
- v-else
- :target="openInNewTab ? '_blank' : '_self'"
- :href="value.url"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- :data-track-label="$options.i18n.ACTION_LABELS[action].title"
- >
- {{ $options.i18n.ACTION_LABELS[action].title }}
- </gl-link>
- <span v-if="trialOnly" class="gl-font-style-italic gl-text-gray-500" data-testid="trial-only">
- - {{ $options.i18n.trialOnly }}
- </span>
+ <div v-if="trialOnly" class="gl-font-style-italic gl-text-gray-500" data-testid="trial-only">
+ {{ $options.i18n.trialOnly }}
+ </div>
+ <div class="flex align-items-center">
+ <span v-if="value.completed" class="gl-text-green-500">
+ <gl-icon name="check-circle-filled" :size="16" data-testid="completed-icon" />
+ {{ linkTitle }}
+ </span>
+ <gl-link
+ v-else-if="showInviteModalLink"
+ data-track-action="click_link"
+ :data-track-label="linkTitle"
+ data-track-property="Growth::Activation::Experiment::InviteForHelpContinuousOnboarding"
+ data-testid="invite-for-help-continuous-onboarding-experiment-link"
+ @click="openModal"
+ >
+ {{ linkTitle }}
+ </gl-link>
+ <gl-link
+ v-else
+ :target="openInNewTab ? '_blank' : '_self'"
+ :href="value.url"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ :data-track-label="linkTitle"
+ >
+ {{ linkTitle }}
+ </gl-link>
+ <gitlab-experiment name="video_tutorials_continuous_onboarding">
+ <template #control></template>
+ <template #candidate>
+ <gl-button
+ v-if="linkToVideoTutorial"
+ v-gl-tooltip
+ category="tertiary"
+ icon="live-preview"
+ :title="$options.i18n.watchHow"
+ :aria-label="$options.i18n.watchHow"
+ :href="linkToVideoTutorial"
+ target="_blank"
+ class="ml-auto"
+ data-testid="video-tutorial-link"
+ data-track-action="click_video_link"
+ :data-track-label="linkTitle"
+ data-track-property="Growth::Conversion::Experiment::LearnGitLab"
+ data-track-experiment="video_tutorials_continuous_onboarding"
+ />
+ </template>
+ </gitlab-experiment>
+ </div>
</div>
</template>
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js b/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
index 1887c48dd1b..9ba5e17237a 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
@@ -40,6 +40,7 @@ export const ACTION_LABELS = {
trialRequired: true,
section: 'workspace',
position: 4,
+ videoTutorial: 'https://vimeo.com/670896787',
},
requiredMrApprovalsEnabled: {
title: s__('LearnGitLab|Add merge request approval'),
@@ -48,6 +49,7 @@ export const ACTION_LABELS = {
trialRequired: true,
section: 'workspace',
position: 5,
+ videoTutorial: 'https://vimeo.com/670904904',
},
mergeRequestCreated: {
title: s__('LearnGitLab|Submit a merge request'),
diff --git a/app/assets/javascripts/pages/projects/learn_gitlab/index/index.js b/app/assets/javascripts/pages/projects/learn_gitlab/index/index.js
index 63357ea9c72..af4a6f8a0c9 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/index/index.js
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/index/index.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
+import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import LearnGitlab from '../components/learn_gitlab.vue';
@@ -24,5 +25,7 @@ function initLearnGitlab() {
});
}
-initLearnGitlab();
initInviteMembersModal();
+initInviteMembersTrigger();
+
+initLearnGitlab();
diff --git a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js
index c548ea9bb80..0e0c1475eda 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js
@@ -1,6 +1,5 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
-import loadAwardsHandler from '~/awards_handler';
import ShortcutsIssuable from '~/behaviors/shortcuts/shortcuts_issuable';
import { initPipelineCountListener } from '~/commit/pipelines/utils';
import { initIssuableSidebar } from '~/issuable';
@@ -8,23 +7,16 @@ import StatusBox from '~/issuable/components/status_box.vue';
import createDefaultClient from '~/lib/graphql';
import initSourcegraph from '~/sourcegraph';
import ZenMode from '~/zen_mode';
+import initAwardsApp from '~/emoji/awards_app';
import getStateQuery from './queries/get_state.query.graphql';
export default function initMergeRequestShow() {
- const awardEmojiEl = document.getElementById('js-vue-awards-block');
-
new ZenMode(); // eslint-disable-line no-new
initPipelineCountListener(document.querySelector('#commit-pipeline-table-view'));
new ShortcutsIssuable(true); // eslint-disable-line no-new
initSourcegraph();
initIssuableSidebar();
- if (awardEmojiEl) {
- import('~/emoji/awards_app')
- .then((m) => m.default(awardEmojiEl))
- .catch(() => {});
- } else {
- loadAwardsHandler();
- }
+ initAwardsApp(document.getElementById('js-vue-awards-block'));
const el = document.querySelector('.js-mr-status-box');
const apolloProvider = new VueApollo({
diff --git a/app/assets/javascripts/pages/projects/network/network.js b/app/assets/javascripts/pages/projects/network/network.js
index 5f2014f1631..b88127384dc 100644
--- a/app/assets/javascripts/pages/projects/network/network.js
+++ b/app/assets/javascripts/pages/projects/network/network.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import BranchGraph from '../../../network/branch_graph';
+import BranchGraph from '~/network/branch_graph';
const vph = $(window).height() - 250;
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedules_callout.vue b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedules_callout.vue
index ee70ff858be..37e8a316ee4 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedules_callout.vue
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/pipeline_schedules_callout.vue
@@ -2,8 +2,7 @@
import { GlButton } from '@gitlab/ui';
import Vue from 'vue';
import { getCookie, setCookie, parseBoolean } from '~/lib/utils/common_utils';
-
-import Translate from '../../../../../vue_shared/translate';
+import Translate from '~/vue_shared/translate';
Vue.use(Translate);
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js
index 9c039a6be81..5dae812bbcb 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/init_form.js
@@ -3,9 +3,9 @@ import Vue from 'vue';
import { __ } from '~/locale';
import RefSelector from '~/ref/components/ref_selector.vue';
import { REF_TYPE_BRANCHES, REF_TYPE_TAGS } from '~/ref/constants';
-import setupNativeFormVariableList from '../../../../ci_variable_list/native_form_variable_list';
-import GlFieldErrors from '../../../../gl_field_errors';
-import Translate from '../../../../vue_shared/translate';
+import setupNativeFormVariableList from '~/ci_variable_list/native_form_variable_list';
+import GlFieldErrors from '~/gl_field_errors';
+import Translate from '~/vue_shared/translate';
import intervalPatternInput from './components/interval_pattern_input.vue';
import TimezoneDropdown from './components/timezone_dropdown';
@@ -33,13 +33,7 @@ function initIntervalPatternInput() {
}
function getEnabledRefTypes() {
- const refTypes = [REF_TYPE_BRANCHES];
-
- if (gon.features.pipelineSchedulesWithTags) {
- refTypes.push(REF_TYPE_TAGS);
- }
-
- return refTypes;
+ return [REF_TYPE_BRANCHES, REF_TYPE_TAGS];
}
function initTargetRefDropdown() {
@@ -61,9 +55,7 @@ function initTargetRefDropdown() {
value: $refField.value,
useSymbolicRefNames: true,
translations: {
- dropdownHeader: gon.features.pipelineSchedulesWithTags
- ? __('Select target branch or tag')
- : __('Select target branch'),
+ dropdownHeader: __('Select target branch or tag'),
},
},
class: 'gl-w-full',
diff --git a/app/assets/javascripts/pages/projects/project.js b/app/assets/javascripts/pages/projects/project.js
index 0c17bf2f344..4f57e1308df 100644
--- a/app/assets/javascripts/pages/projects/project.js
+++ b/app/assets/javascripts/pages/projects/project.js
@@ -9,7 +9,7 @@ import axios from '~/lib/utils/axios_utils';
import { serializeForm } from '~/lib/utils/forms';
import { mergeUrlParams } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
-import projectSelect from '../../project_select';
+import projectSelect from '~/project_select';
export default class Project {
constructor() {
diff --git a/app/assets/javascripts/pages/projects/project_members/index.js b/app/assets/javascripts/pages/projects/project_members/index.js
index 2c0394dc12c..bf4fb5f3b7e 100644
--- a/app/assets/javascripts/pages/projects/project_members/index.js
+++ b/app/assets/javascripts/pages/projects/project_members/index.js
@@ -18,9 +18,16 @@ initInviteGroupTrigger();
const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions'];
initMembersApp(document.querySelector('.js-project-members-list-app'), {
[MEMBER_TYPES.user]: {
- tableFields: SHARED_FIELDS.concat(['source', 'granted']),
+ tableFields: SHARED_FIELDS.concat(['source', 'granted', 'userCreatedAt', 'lastActivityOn']),
tableAttrs: { tr: { 'data-qa-selector': 'member_row' } },
- tableSortableFields: ['account', 'granted', 'maxRole', 'lastSignIn'],
+ tableSortableFields: [
+ 'account',
+ 'granted',
+ 'maxRole',
+ 'lastSignIn',
+ 'userCreatedAt',
+ 'lastActivityOn',
+ ],
requestFormatter: projectMemberRequestFormatter,
filteredSearchBar: {
show: true,
diff --git a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
index e88dbf20e1b..43ab829f5f9 100644
--- a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
@@ -10,36 +10,34 @@ import initSharedRunnersToggle from '~/projects/settings/mount_shared_runners_to
import initSettingsPanels from '~/settings_panels';
import { initTokenAccess } from '~/token_access';
-document.addEventListener('DOMContentLoaded', () => {
- // Initialize expandable settings panels
- initSettingsPanels();
+// Initialize expandable settings panels
+initSettingsPanels();
- const runnerToken = document.querySelector('.js-secret-runner-token');
- if (runnerToken) {
- const runnerTokenSecretValue = new SecretValues({
- container: runnerToken,
- });
- runnerTokenSecretValue.init();
- }
-
- initVariableList();
-
- // hide extra auto devops settings based checkbox state
- const autoDevOpsExtraSettings = document.querySelector('.js-extra-settings');
- const instanceDefaultBadge = document.querySelector('.js-instance-default-badge');
- document.querySelector('.js-toggle-extra-settings').addEventListener('click', (event) => {
- const { target } = event;
- if (instanceDefaultBadge) instanceDefaultBadge.style.display = 'none';
- autoDevOpsExtraSettings.classList.toggle('hidden', !target.checked);
+const runnerToken = document.querySelector('.js-secret-runner-token');
+if (runnerToken) {
+ const runnerTokenSecretValue = new SecretValues({
+ container: runnerToken,
});
+ runnerTokenSecretValue.init();
+}
- registrySettingsApp();
- initDeployFreeze();
+initVariableList();
- initSettingsPipelinesTriggers();
- initArtifactsSettings();
- initSharedRunnersToggle();
- initInstallRunner();
- initRunnerAwsDeployments();
- initTokenAccess();
+// hide extra auto devops settings based checkbox state
+const autoDevOpsExtraSettings = document.querySelector('.js-extra-settings');
+const instanceDefaultBadge = document.querySelector('.js-instance-default-badge');
+document.querySelector('.js-toggle-extra-settings').addEventListener('click', (event) => {
+ const { target } = event;
+ if (instanceDefaultBadge) instanceDefaultBadge.style.display = 'none';
+ autoDevOpsExtraSettings.classList.toggle('hidden', !target.checked);
});
+
+registrySettingsApp();
+initDeployFreeze();
+
+initSettingsPipelinesTriggers();
+initArtifactsSettings();
+initSharedRunnersToggle();
+initInstallRunner();
+initRunnerAwsDeployments();
+initTokenAccess();
diff --git a/app/assets/javascripts/pages/projects/settings/repository/show/index.js b/app/assets/javascripts/pages/projects/settings/repository/show/index.js
index e90954c14c5..d45052d76f4 100644
--- a/app/assets/javascripts/pages/projects/settings/repository/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/repository/show/index.js
@@ -1,9 +1,7 @@
import MirrorRepos from '~/mirrors/mirror_repos';
import initForm from '../form';
-document.addEventListener('DOMContentLoaded', () => {
- initForm();
+initForm();
- const mirrorReposContainer = document.querySelector('.js-mirror-settings');
- if (mirrorReposContainer) new MirrorRepos(mirrorReposContainer).init();
-});
+const mirrorReposContainer = document.querySelector('.js-mirror-settings');
+if (mirrorReposContainer) new MirrorRepos(mirrorReposContainer).init();
diff --git a/app/assets/javascripts/pages/projects/shared/permissions/components/project_feature_setting.vue b/app/assets/javascripts/pages/projects/shared/permissions/components/project_feature_setting.vue
index 9fb8be3fdb9..b2d32c2c943 100644
--- a/app/assets/javascripts/pages/projects/shared/permissions/components/project_feature_setting.vue
+++ b/app/assets/javascripts/pages/projects/shared/permissions/components/project_feature_setting.vue
@@ -44,6 +44,15 @@ export default {
},
},
computed: {
+ internalValue: {
+ get() {
+ return this.value;
+ },
+ set(value) {
+ this.$emit('change', value);
+ },
+ },
+
featureEnabled() {
return this.value !== 0;
},
@@ -68,10 +77,6 @@ export default {
this.$emit('change', firstOptionValue);
}
},
-
- selectOption(e) {
- this.$emit('change', Number(e.target.value));
- },
},
};
</script>
@@ -93,15 +98,14 @@ export default {
/>
<div class="select-wrapper gl-flex-grow-1">
<select
+ v-model="internalValue"
:disabled="displaySelectInput"
class="form-control project-repo-select select-control"
- @change="selectOption"
>
<option
v-for="[optionValue, optionName] in displayOptions"
:key="optionValue"
:value="optionValue"
- :selected="optionValue === value"
>
{{ optionName }}
</option>
diff --git a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue
index 184bda4410f..03bab0fa773 100644
--- a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue
+++ b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue
@@ -9,7 +9,6 @@ import {
featureAccessLevelMembers,
featureAccessLevelEveryone,
featureAccessLevel,
- featureAccessLevelNone,
CVE_ID_REQUEST_BUTTON_I18N,
featureAccessLevelDescriptions,
} from '../constants';
@@ -225,8 +224,6 @@ export default {
},
operationsFeatureAccessLevelOptions() {
- if (!this.operationsEnabled) return [featureAccessLevelNone];
-
return this.featureAccessLevelOptions.filter(
([value]) => value <= this.operationsAccessLevel,
);
@@ -251,10 +248,6 @@ export default {
return options;
},
- metricsOptionsDropdownDisabled() {
- return this.operationsFeatureAccessLevelOptions.length < 2 || !this.operationsEnabled;
- },
-
operationsEnabled() {
return this.operationsAccessLevel > featureAccessLevel.NOT_ENABLED;
},
@@ -392,6 +385,15 @@ export default {
else if (oldValue === featureAccessLevel.NOT_ENABLED)
toggleHiddenClassBySelector('.merge-requests-feature', false);
},
+
+ operationsAccessLevel(value, oldValue) {
+ if (value < oldValue) {
+ // sub-features cannot have more permissive access level
+ this.metricsDashboardAccessLevel = Math.min(this.metricsDashboardAccessLevel, value);
+ } else if (oldValue === 0) {
+ this.metricsDashboardAccessLevel = value;
+ }
+ },
},
methods: {
@@ -590,7 +592,9 @@ export default {
:help-path="packagesHelpPath"
:label="$options.i18n.packagesLabel"
:help-text="
- s__('ProjectSettings|Every project can have its own space to store its packages.')
+ s__(
+ 'ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public.',
+ )
"
>
<gl-toggle
diff --git a/app/assets/javascripts/pages/projects/snippets/show/index.js b/app/assets/javascripts/pages/projects/snippets/show/index.js
index c719601ee0b..77baa6d77a5 100644
--- a/app/assets/javascripts/pages/projects/snippets/show/index.js
+++ b/app/assets/javascripts/pages/projects/snippets/show/index.js
@@ -1,9 +1,4 @@
import '~/snippet/snippet_show';
+import initAwardsApp from '~/emoji/awards_app';
-const awardEmojiEl = document.getElementById('js-vue-awards-block');
-
-if (awardEmojiEl) {
- import('~/emoji/awards_app')
- .then((m) => m.default(awardEmojiEl))
- .catch(() => {});
-}
+initAwardsApp(document.getElementById('js-vue-awards-block'));
diff --git a/app/assets/javascripts/pages/projects/tags/new/index.js b/app/assets/javascripts/pages/projects/tags/new/index.js
index b071e7a45fc..9ef1017f9f2 100644
--- a/app/assets/javascripts/pages/projects/tags/new/index.js
+++ b/app/assets/javascripts/pages/projects/tags/new/index.js
@@ -1,7 +1,7 @@
import $ from 'jquery';
-import GLForm from '../../../../gl_form';
-import RefSelectDropdown from '../../../../ref_select_dropdown';
-import ZenMode from '../../../../zen_mode';
+import GLForm from '~/gl_form';
+import RefSelectDropdown from '~/ref_select_dropdown';
+import ZenMode from '~/zen_mode';
new ZenMode(); // eslint-disable-line no-new
new GLForm($('.tag-form')); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/tree/show/index.js b/app/assets/javascripts/pages/projects/tree/show/index.js
index 4bb461aadad..cf7162f477d 100644
--- a/app/assets/javascripts/pages/projects/tree/show/index.js
+++ b/app/assets/javascripts/pages/projects/tree/show/index.js
@@ -1,8 +1,8 @@
import $ from 'jquery';
import initTree from 'ee_else_ce/repository';
import initBlob from '~/blob_edit/blob_bundle';
-import ShortcutsNavigation from '../../../../behaviors/shortcuts/shortcuts_navigation';
-import NewCommitForm from '../../../../new_commit_form';
+import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
+import NewCommitForm from '~/new_commit_form';
new NewCommitForm($('.js-create-dir-form')); // eslint-disable-line no-new
initBlob();
diff --git a/app/assets/javascripts/pages/projects/wikis/show/index.js b/app/assets/javascripts/pages/projects/wikis/show/index.js
index c08a10122b6..7ca5f6964cd 100644
--- a/app/assets/javascripts/pages/projects/wikis/show/index.js
+++ b/app/assets/javascripts/pages/projects/wikis/show/index.js
@@ -1,3 +1,5 @@
+import { mountApplications } from '~/pages/shared/wikis/show';
import { mountApplications as mountEditApplications } from '~/pages/shared/wikis/async_edit';
+mountApplications();
mountEditApplications();
diff --git a/app/assets/javascripts/pages/sessions/new/index.js b/app/assets/javascripts/pages/sessions/new/index.js
index 8c2fd624a83..b62417cf595 100644
--- a/app/assets/javascripts/pages/sessions/new/index.js
+++ b/app/assets/javascripts/pages/sessions/new/index.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import initVueAlerts from '~/vue_alerts';
-import NoEmojiValidator from '../../../emoji/no_emoji_validator';
+import NoEmojiValidator from '~/emoji/no_emoji_validator';
import LengthValidator from './length_validator';
import OAuthRememberMe from './oauth_remember_me';
import preserveUrlFragment from './preserve_url_fragment';
diff --git a/app/assets/javascripts/pages/sessions/new/length_validator.js b/app/assets/javascripts/pages/sessions/new/length_validator.js
index 17acad10bc1..b2074fb1e39 100644
--- a/app/assets/javascripts/pages/sessions/new/length_validator.js
+++ b/app/assets/javascripts/pages/sessions/new/length_validator.js
@@ -1,4 +1,4 @@
-import InputValidator from '../../../validators/input_validator';
+import InputValidator from '~/validators/input_validator';
const errorMessageClass = 'gl-field-error';
diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue
new file mode 100644
index 00000000000..7c23f60954a
--- /dev/null
+++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_content.vue
@@ -0,0 +1,92 @@
+<script>
+import { GlSkeletonLoader, GlSafeHtmlDirective, GlAlert } from '@gitlab/ui';
+import createFlash from '~/flash';
+import { __ } from '~/locale';
+import axios from '~/lib/utils/axios_utils';
+import { renderGFM } from '../render_gfm_facade';
+
+export default {
+ components: {
+ GlSkeletonLoader,
+ GlAlert,
+ },
+ directives: {
+ SafeHtml: GlSafeHtmlDirective,
+ },
+ props: {
+ getWikiContentUrl: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ isLoadingContent: false,
+ loadingContentFailed: false,
+ content: null,
+ };
+ },
+ mounted() {
+ this.loadWikiContent();
+ },
+ methods: {
+ async loadWikiContent() {
+ this.loadingContentFailed = false;
+ this.isLoadingContent = true;
+
+ try {
+ const {
+ data: { content },
+ } = await axios.get(this.getWikiContentUrl, { params: { render_html: true } });
+ this.content = content;
+
+ this.$nextTick()
+ .then(() => {
+ renderGFM(this.$refs.content);
+ })
+ .catch(() =>
+ createFlash({
+ message: this.$options.i18n.renderingContentFailed,
+ }),
+ );
+ } catch (e) {
+ this.loadingContentFailed = true;
+ } finally {
+ this.isLoadingContent = false;
+ }
+ },
+ },
+ i18n: {
+ loadingContentFailed: __(
+ 'The content for this wiki page failed to load. To fix this error, reload the page.',
+ ),
+ retryLoadingContent: __('Retry'),
+ renderingContentFailed: __('The content for this wiki page failed to render.'),
+ },
+};
+</script>
+<template>
+ <gl-skeleton-loader v-if="isLoadingContent" :width="830" :height="113">
+ <rect width="540" height="16" rx="4" />
+ <rect y="49" width="701" height="16" rx="4" />
+ <rect y="24" width="830" height="16" rx="4" />
+ <rect y="73" width="540" height="16" rx="4" />
+ </gl-skeleton-loader>
+ <gl-alert
+ v-else-if="loadingContentFailed"
+ :dismissible="false"
+ variant="danger"
+ :primary-button-text="$options.i18n.retryLoadingContent"
+ @primaryAction="loadWikiContent"
+ >
+ {{ $options.i18n.loadingContentFailed }}
+ </gl-alert>
+ <div
+ v-else-if="!loadingContentFailed && !isLoadingContent"
+ ref="content"
+ data-qa-selector="wiki_page_content"
+ data-testid="wiki_page_content"
+ class="js-wiki-page-content md"
+ v-html="content /* eslint-disable-line vue/no-v-html */"
+ ></div>
+</template>
diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
index 8ef31b9b983..024b3bc9595 100644
--- a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
+++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
@@ -1,21 +1,11 @@
<script>
-import {
- GlForm,
- GlIcon,
- GlLink,
- GlButton,
- GlSprintf,
- GlAlert,
- GlModal,
- GlModalDirective,
-} from '@gitlab/ui';
+import { GlForm, GlIcon, GlLink, GlButton, GlSprintf, GlAlert } from '@gitlab/ui';
import axios from '~/lib/utils/axios_utils';
import csrf from '~/lib/utils/csrf';
import { setUrlFragment } from '~/lib/utils/url_utility';
-import { __, s__, sprintf } from '~/locale';
+import { s__, sprintf } from '~/locale';
import Tracking from '~/tracking';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
-import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import {
CONTENT_EDITOR_LOADED_ACTION,
SAVED_USING_CONTENT_EDITOR_ACTION,
@@ -64,31 +54,6 @@ export default {
),
primaryAction: s__('WikiPage|Retry'),
},
- useNewEditor: {
- primaryLabel: s__('WikiPage|Use the new editor'),
- secondaryLabel: s__('WikiPage|Try this later'),
- title: s__('WikiPage|Get a richer editing experience'),
- text: s__(
- "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported.",
- ),
- },
- switchToOldEditor: {
- label: s__('WikiPage|Switch me back to the classic editor.'),
- helpText: s__(
- "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.",
- ),
- modal: {
- title: s__('WikiPage|Are you sure you want to switch back to the classic editor?'),
- primary: s__('WikiPage|Switch to classic editor'),
- cancel: s__('WikiPage|Keep editing'),
- text: s__(
- "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor.",
- ),
- },
- },
- feedbackTip: __(
- 'Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}.',
- ),
},
linksHelpText: s__(
'WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}.',
@@ -108,7 +73,6 @@ export default {
editSourceButtonText: s__('WikiPage|Edit source'),
editRichTextButtonText: s__('WikiPage|Edit rich text'),
},
- contentEditorFeedbackIssue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332629',
components: {
GlAlert,
GlForm,
@@ -116,24 +80,19 @@ export default {
GlIcon,
GlLink,
GlButton,
- GlModal,
MarkdownField,
ContentEditor: () =>
import(
/* webpackChunkName: 'content_editor' */ '~/content_editor/components/content_editor.vue'
),
},
- directives: {
- GlModalDirective,
- },
- mixins: [trackingMixin, glFeatureFlagMixin()],
+ mixins: [trackingMixin],
inject: ['formatOptions', 'pageInfo'],
data() {
return {
title: this.pageInfo.title?.trim() || '',
format: this.pageInfo.format || 'markdown',
content: this.pageInfo.content || '',
- isContentEditorAlertDismissed: false,
useContentEditor: false,
commitMessage: '',
isDirty: false,
@@ -194,25 +153,9 @@ export default {
isMarkdownFormat() {
return this.format === 'markdown';
},
- showContentEditorAlert() {
- return (
- !this.glFeatures.wikiSwitchBetweenContentEditorRawMarkdown &&
- this.isMarkdownFormat &&
- !this.useContentEditor &&
- !this.isContentEditorAlertDismissed
- );
- },
- showSwitchEditingModeButton() {
- return this.glFeatures.wikiSwitchBetweenContentEditorRawMarkdown && this.isMarkdownFormat;
- },
displayWikiSpecificMarkdownHelp() {
return !this.isContentEditorActive;
},
- displaySwitchBackToClassicEditorMessage() {
- return (
- !this.glFeatures.wikiSwitchBetweenContentEditorRawMarkdown && this.isContentEditorActive
- );
- },
disableSubmitButton() {
return this.noContent || !this.title || this.contentEditorRenderFailed;
},
@@ -312,23 +255,6 @@ export default {
this.commitMessage = newCommitMessage;
},
- initContentEditor() {
- this.useContentEditor = true;
- },
-
- switchToOldEditor() {
- this.useContentEditor = false;
- },
-
- confirmSwitchToOldEditor() {
- if (this.contentEditorRenderFailed) {
- this.contentEditorRenderFailed = false;
- this.switchToOldEditor();
- } else {
- this.$refs.confirmSwitchToOldEditorModal.show();
- }
- },
-
trackContentEditorLoaded() {
this.track(CONTENT_EDITOR_LOADED_ACTION);
},
@@ -349,10 +275,6 @@ export default {
},
});
},
-
- dismissContentEditorAlert() {
- this.isContentEditorAlertDismissed = true;
- },
},
};
</script>
@@ -438,10 +360,7 @@ export default {
}}</label>
</div>
<div class="col-sm-10">
- <div
- v-if="showSwitchEditingModeButton"
- class="gl-display-flex gl-justify-content-end gl-mb-3"
- >
+ <div v-if="isMarkdownFormat" class="gl-display-flex gl-justify-content-end gl-mb-3">
<gl-button
data-testid="toggle-editing-mode-button"
data-qa-selector="editing_mode_button"
@@ -451,42 +370,6 @@ export default {
>{{ toggleEditingModeButtonText }}</gl-button
>
</div>
- <gl-alert
- v-if="showContentEditorAlert"
- class="gl-mb-6"
- variant="info"
- data-qa-selector="try_new_editor_container"
- :primary-button-text="$options.i18n.contentEditor.useNewEditor.primaryLabel"
- :secondary-button-text="$options.i18n.contentEditor.useNewEditor.secondaryLabel"
- :dismiss-label="$options.i18n.contentEditor.useNewEditor.secondaryLabel"
- :title="$options.i18n.contentEditor.useNewEditor.title"
- @primaryAction="initContentEditor"
- @secondaryAction="dismissContentEditorAlert"
- @dismiss="dismissContentEditorAlert"
- >
- <gl-sprintf :message="$options.i18n.contentEditor.useNewEditor.text">
- <template
- #link="// eslint-disable-next-line vue/no-template-shadow
- { content }"
- ><gl-link
- :href="contentEditorHelpPath"
- target="_blank"
- data-testid="content-editor-help-link"
- >{{ content }}</gl-link
- ></template
- >
- </gl-sprintf>
- </gl-alert>
- <gl-modal
- ref="confirmSwitchToOldEditorModal"
- modal-id="confirm-switch-to-old-editor"
- :title="$options.i18n.contentEditor.switchToOldEditor.modal.title"
- :action-primary="{ text: $options.i18n.contentEditor.switchToOldEditor.modal.primary }"
- :action-cancel="{ text: $options.i18n.contentEditor.switchToOldEditor.modal.cancel }"
- @primary="switchToOldEditor"
- >
- {{ $options.i18n.contentEditor.switchToOldEditor.modal.text }}
- </gl-modal>
<markdown-field
v-if="!isContentEditorActive"
:markdown-preview-path="pageInfo.markdownPreviewPath"
@@ -516,22 +399,7 @@ export default {
</textarea>
</template>
</markdown-field>
-
<div v-if="isContentEditorActive">
- <gl-alert class="gl-mb-6" variant="tip" :dismissible="false">
- <gl-sprintf :message="$options.i18n.contentEditor.feedbackTip">
- <template
- #link="// eslint-disable-next-line vue/no-template-shadow
- { content }"
- ><gl-link
- :href="$options.contentEditorFeedbackIssue"
- target="_blank"
- data-testid="wiki-markdown-help-link"
- >{{ content }}</gl-link
- ></template
- >
- </gl-sprintf>
- </gl-alert>
<content-editor
:render-markdown="renderMarkdown"
:uploads-path="pageInfo.uploadsPath"
@@ -560,12 +428,6 @@ export default {
></template
>
</gl-sprintf>
- <span v-if="displaySwitchBackToClassicEditorMessage">
- {{ $options.i18n.contentEditor.switchToOldEditor.helpText }}
- <gl-button variant="link" @click="confirmSwitchToOldEditor">{{
- $options.i18n.contentEditor.switchToOldEditor.label
- }}</gl-button>
- </span>
</div>
</div>
</div>
diff --git a/app/assets/javascripts/pages/shared/wikis/edit.js b/app/assets/javascripts/pages/shared/wikis/edit.js
index beeabfde1a6..02878633916 100644
--- a/app/assets/javascripts/pages/shared/wikis/edit.js
+++ b/app/assets/javascripts/pages/shared/wikis/edit.js
@@ -3,8 +3,8 @@ 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 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';
diff --git a/app/assets/javascripts/pages/shared/wikis/render_gfm_facade.js b/app/assets/javascripts/pages/shared/wikis/render_gfm_facade.js
new file mode 100644
index 00000000000..90cc2983153
--- /dev/null
+++ b/app/assets/javascripts/pages/shared/wikis/render_gfm_facade.js
@@ -0,0 +1,5 @@
+import $ from 'jquery';
+
+export const renderGFM = (el) => {
+ return $(el).renderGFM();
+};
diff --git a/app/assets/javascripts/pages/shared/wikis/show.js b/app/assets/javascripts/pages/shared/wikis/show.js
new file mode 100644
index 00000000000..9906cb595f8
--- /dev/null
+++ b/app/assets/javascripts/pages/shared/wikis/show.js
@@ -0,0 +1,27 @@
+import Vue from 'vue';
+import Wikis from './wikis';
+import WikiContent from './components/wiki_content.vue';
+
+const mountWikiContentApp = () => {
+ const el = document.querySelector('.js-async-wiki-page-content');
+
+ if (el) {
+ const { getWikiContentUrl } = el.dataset;
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el,
+ render(createElement) {
+ return createElement(WikiContent, {
+ props: { getWikiContentUrl },
+ });
+ },
+ });
+ }
+};
+
+export const mountApplications = () => {
+ // eslint-disable-next-line no-new
+ new Wikis();
+ mountWikiContentApp();
+};
diff --git a/app/assets/javascripts/performance_bar/services/performance_bar_service.js b/app/assets/javascripts/performance_bar/services/performance_bar_service.js
index a614342c858..4c0293f5b78 100644
--- a/app/assets/javascripts/performance_bar/services/performance_bar_service.js
+++ b/app/assets/javascripts/performance_bar/services/performance_bar_service.js
@@ -1,5 +1,5 @@
import { parseBoolean } from '~/lib/utils/common_utils';
-import axios from '../../lib/utils/axios_utils';
+import axios from '~/lib/utils/axios_utils';
export default class PerformanceBarService {
static interceptor = null;
diff --git a/app/assets/javascripts/persistent_user_callouts.js b/app/assets/javascripts/persistent_user_callouts.js
index f6de21ec0c5..dee832c01d5 100644
--- a/app/assets/javascripts/persistent_user_callouts.js
+++ b/app/assets/javascripts/persistent_user_callouts.js
@@ -12,6 +12,7 @@ const PERSISTENT_USER_CALLOUTS = [
'.js-security-newsletter-callout',
'.js-approaching-seats-count-threshold',
'.js-storage-enforcement-banner',
+ '.js-user-over-limit-free-plan-alert',
];
const initCallouts = () => {
diff --git a/app/assets/javascripts/pipeline_editor/components/drawer/cards/first_pipeline_card.vue b/app/assets/javascripts/pipeline_editor/components/drawer/cards/first_pipeline_card.vue
index a8ad56ab6a5..897bd2dcccf 100644
--- a/app/assets/javascripts/pipeline_editor/components/drawer/cards/first_pipeline_card.vue
+++ b/app/assets/javascripts/pipeline_editor/components/drawer/cards/first_pipeline_card.vue
@@ -1,5 +1,5 @@
<script>
-import { GlCard, GlLink, GlSprintf } from '@gitlab/ui';
+import { GlLink, GlSprintf } from '@gitlab/ui';
import { s__ } from '~/locale';
export default {
@@ -22,7 +22,6 @@ export default {
),
},
components: {
- GlCard,
GlLink,
GlSprintf,
},
@@ -30,22 +29,20 @@ export default {
};
</script>
<template>
- <gl-card>
- <template #default>
- <h4 class="gl-font-lg gl-mt-0">{{ $options.i18n.title }}</h4>
- <p class="gl-mb-3">{{ $options.i18n.firstParagraph }}</p>
- <ol class="gl-mb-3">
- <li v-for="(item, i) in $options.i18n.listItems" :key="`li-${i}`">{{ item }}</li>
- </ol>
- <p class="gl-mb-0">
- <gl-sprintf :message="$options.i18n.note">
- <template #link="{ content }">
- <gl-link :href="runnerHelpPagePath" target="_blank">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </template>
- </gl-card>
+ <div>
+ <h3 class="gl-font-lg gl-mt-0 gl-mb-5">{{ $options.i18n.title }}</h3>
+ <p class="gl-mb-3">{{ $options.i18n.firstParagraph }}</p>
+ <ol class="gl-mb-3">
+ <li v-for="(item, i) in $options.i18n.listItems" :key="`li-${i}`">{{ item }}</li>
+ </ol>
+ <p class="gl-mb-0">
+ <gl-sprintf :message="$options.i18n.note">
+ <template #link="{ content }">
+ <gl-link :href="runnerHelpPagePath" target="_blank">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ </div>
</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/drawer/cards/getting_started_card.vue b/app/assets/javascripts/pipeline_editor/components/drawer/cards/getting_started_card.vue
index 3da535f5f94..d2682cf6326 100644
--- a/app/assets/javascripts/pipeline_editor/components/drawer/cards/getting_started_card.vue
+++ b/app/assets/javascripts/pipeline_editor/components/drawer/cards/getting_started_card.vue
@@ -1,5 +1,5 @@
<script>
-import { GlCard, GlSprintf } from '@gitlab/ui';
+import { GlSprintf } from '@gitlab/ui';
import { s__ } from '~/locale';
export default {
@@ -13,23 +13,20 @@ export default {
),
},
components: {
- GlCard,
GlSprintf,
},
};
</script>
<template>
- <gl-card>
- <template #default>
- <h4 class="gl-font-lg gl-mt-0">{{ $options.i18n.title }}</h4>
- <p class="gl-mb-3">{{ $options.i18n.firstParagraph }}</p>
- <p class="gl-mb-0">
- <gl-sprintf :message="$options.i18n.secondParagraph">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
- </template>
- </gl-card>
+ <div>
+ <h3 class="gl-font-lg gl-mt-0 gl-mb-5">{{ $options.i18n.title }}</h3>
+ <p class="gl-mb-3">{{ $options.i18n.firstParagraph }}</p>
+ <p class="gl-mb-0">
+ <gl-sprintf :message="$options.i18n.secondParagraph">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
+ </div>
</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/drawer/cards/pipeline_config_reference_card.vue b/app/assets/javascripts/pipeline_editor/components/drawer/cards/pipeline_config_reference_card.vue
index f714f6411f1..04140434af2 100644
--- a/app/assets/javascripts/pipeline_editor/components/drawer/cards/pipeline_config_reference_card.vue
+++ b/app/assets/javascripts/pipeline_editor/components/drawer/cards/pipeline_config_reference_card.vue
@@ -1,5 +1,5 @@
<script>
-import { GlCard, GlLink, GlSprintf } from '@gitlab/ui';
+import { GlLink, GlSprintf } from '@gitlab/ui';
import { s__ } from '~/locale';
export default {
@@ -20,7 +20,6 @@ export default {
),
},
components: {
- GlCard,
GlLink,
GlSprintf,
},
@@ -28,48 +27,46 @@ export default {
};
</script>
<template>
- <gl-card>
- <template #default>
- <h4 class="gl-font-lg gl-mt-0">{{ $options.i18n.title }}</h4>
- <p class="gl-mb-3">{{ $options.i18n.firstParagraph }}</p>
- <ul>
- <li>
- <gl-sprintf :message="$options.i18n.browseExamples">
- <template #link="{ content }">
- <gl-link :href="ciExamplesHelpPagePath" target="_blank">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </li>
- <li>
- <gl-sprintf :message="$options.i18n.viewSyntaxRef">
- <template #link="{ content }">
- <gl-link :href="ymlHelpPagePath" target="_blank">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </li>
- <li>
- <gl-sprintf :message="$options.i18n.learnMore">
- <template #link="{ content }">
- <gl-link :href="ciHelpPagePath" target="_blank">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </li>
- <li>
- <gl-sprintf :message="$options.i18n.needs">
- <template #link="{ content }">
- <gl-link :href="needsHelpPagePath" target="_blank">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </li>
- </ul>
- </template>
- </gl-card>
+ <div>
+ <h3 class="gl-font-lg gl-mt-0 gl-mb-5">{{ $options.i18n.title }}</h3>
+ <p class="gl-mb-3">{{ $options.i18n.firstParagraph }}</p>
+ <ul>
+ <li>
+ <gl-sprintf :message="$options.i18n.browseExamples">
+ <template #link="{ content }">
+ <gl-link :href="ciExamplesHelpPagePath" target="_blank">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </li>
+ <li>
+ <gl-sprintf :message="$options.i18n.viewSyntaxRef">
+ <template #link="{ content }">
+ <gl-link :href="ymlHelpPagePath" target="_blank">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </li>
+ <li>
+ <gl-sprintf :message="$options.i18n.learnMore">
+ <template #link="{ content }">
+ <gl-link :href="ciHelpPagePath" target="_blank">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </li>
+ <li>
+ <gl-sprintf :message="$options.i18n.needs">
+ <template #link="{ content }">
+ <gl-link :href="needsHelpPagePath" target="_blank">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </li>
+ </ul>
+ </div>
</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/drawer/cards/visualize_and_lint_card.vue b/app/assets/javascripts/pipeline_editor/components/drawer/cards/visualize_and_lint_card.vue
index 512414f0246..aeeb52319d2 100644
--- a/app/assets/javascripts/pipeline_editor/components/drawer/cards/visualize_and_lint_card.vue
+++ b/app/assets/javascripts/pipeline_editor/components/drawer/cards/visualize_and_lint_card.vue
@@ -1,5 +1,4 @@
<script>
-import { GlCard } from '@gitlab/ui';
import { s__ } from '~/locale';
export default {
@@ -9,16 +8,11 @@ export default {
'PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes.',
),
},
- components: {
- GlCard,
- },
};
</script>
<template>
- <gl-card>
- <template #default>
- <h4 class="gl-font-lg gl-mt-0">{{ $options.i18n.title }}</h4>
- <p class="gl-mb-0">{{ $options.i18n.firstParagraph }}</p>
- </template>
- </gl-card>
+ <div>
+ <h3 class="gl-font-lg gl-mt-0 gl-mb-5">{{ $options.i18n.title }}</h3>
+ <p class="gl-mb-0">{{ $options.i18n.firstParagraph }}</p>
+ </div>
</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/drawer/pipeline_editor_drawer.vue b/app/assets/javascripts/pipeline_editor/components/drawer/pipeline_editor_drawer.vue
index 9cb070a5517..375db7f3054 100644
--- a/app/assets/javascripts/pipeline_editor/components/drawer/pipeline_editor_drawer.vue
+++ b/app/assets/javascripts/pipeline_editor/components/drawer/pipeline_editor_drawer.vue
@@ -1,101 +1,61 @@
<script>
-import { GlButton, GlIcon } from '@gitlab/ui';
+import { GlDrawer } from '@gitlab/ui';
import { __ } from '~/locale';
-import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
-import { DRAWER_EXPANDED_KEY } from '../../constants';
import FirstPipelineCard from './cards/first_pipeline_card.vue';
import GettingStartedCard from './cards/getting_started_card.vue';
import PipelineConfigReferenceCard from './cards/pipeline_config_reference_card.vue';
import VisualizeAndLintCard from './cards/visualize_and_lint_card.vue';
+const DRAWER_CARD_STYLES = ['gl-border-bottom-0', 'gl-pt-6!', 'gl-pb-0!', 'gl-line-height-20'];
+
export default {
- width: {
- expanded: '482px',
- collapsed: '58px',
- },
+ DRAWER_CARD_STYLES,
i18n: {
- toggleTxt: __('Collapse'),
+ title: __('Help'),
},
- localDrawerKey: DRAWER_EXPANDED_KEY,
components: {
FirstPipelineCard,
GettingStartedCard,
- GlButton,
- GlIcon,
- LocalStorageSync,
+ GlDrawer,
PipelineConfigReferenceCard,
VisualizeAndLintCard,
},
- data() {
- return {
- isExpanded: false,
- topPosition: 0,
- };
+ props: {
+ isVisible: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
- buttonIconName() {
- return this.isExpanded ? 'chevron-double-lg-right' : 'chevron-double-lg-left';
- },
- buttonClass() {
- return this.isExpanded ? 'gl-justify-content-end!' : '';
+ drawerCardStyles() {
+ return '';
},
- rootStyle() {
- const { expanded, collapsed } = this.$options.width;
- const top = this.topPosition;
- const style = { top: `${top}px` };
-
- return this.isExpanded ? { ...style, width: expanded } : { ...style, width: collapsed };
+ drawerHeightOffset() {
+ const wrapperEl = document.querySelector('.content-wrapper');
+ return wrapperEl ? `${wrapperEl.offsetTop}px` : '';
},
},
- mounted() {
- this.setTopPosition();
- },
methods: {
- setTopPosition() {
- const navbarEl = document.querySelector('.js-navbar');
-
- if (navbarEl) {
- this.topPosition = navbarEl.getBoundingClientRect().bottom;
- }
- },
- toggleDrawer() {
- this.isExpanded = !this.isExpanded;
+ closeDrawer() {
+ this.$emit('close-drawer');
},
},
};
</script>
<template>
- <local-storage-sync v-model="isExpanded" :storage-key="$options.localDrawerKey" as-json>
- <aside
- aria-live="polite"
- class="gl-fixed gl-right-0 gl-bg-gray-10 gl-shadow-drawer gl-transition-property-width gl-transition-duration-medium gl-border-l-solid gl-border-1 gl-border-gray-100 gl-h-full gl-z-index-200 gl-overflow-y-auto"
- :style="rootStyle"
- >
- <gl-button
- category="tertiary"
- class="gl-w-full gl-h-9 gl-rounded-0! gl-border-none! gl-border-b-solid! gl-border-1! gl-border-gray-100 gl-text-decoration-none! gl-outline-0! gl-display-flex"
- :class="buttonClass"
- :title="__('Toggle sidebar')"
- data-qa-selector="toggle_sidebar_collapse_button"
- @click="toggleDrawer"
- >
- <span v-if="isExpanded" class="gl-text-gray-500 gl-mr-3" data-testid="collapse-text">
- {{ __('Collapse') }}
- </span>
- <gl-icon data-testid="toggle-icon" :name="buttonIconName" />
- </gl-button>
- <div
- v-if="isExpanded"
- class="gl-h-full gl-p-5"
- data-testid="drawer-content"
- data-qa-selector="drawer_content"
- >
- <getting-started-card class="gl-mb-4" />
- <first-pipeline-card class="gl-mb-4" />
- <visualize-and-lint-card class="gl-mb-4" />
- <pipeline-config-reference-card />
- <div class="gl-h-13"></div>
- </div>
- </aside>
- </local-storage-sync>
+ <gl-drawer
+ :header-height="drawerHeightOffset"
+ :open="isVisible"
+ :z-index="200"
+ @close="closeDrawer"
+ >
+ <template #title>
+ <h2 class="gl-m-0 gl-font-lg">{{ $options.i18n.title }}</h2>
+ </template>
+ <getting-started-card :class="$options.DRAWER_CARD_STYLES" />
+ <first-pipeline-card :class="$options.DRAWER_CARD_STYLES" />
+ <visualize-and-lint-card :class="$options.DRAWER_CARD_STYLES" />
+ <pipeline-config-reference-card :class="$options.DRAWER_CARD_STYLES" />
+ </gl-drawer>
</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue b/app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue
index b4e9ab81d38..9765d669fc1 100644
--- a/app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue
+++ b/app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue
@@ -7,13 +7,23 @@ import { pipelineEditorTrackingOptions, TEMPLATE_REPOSITORY_URL } from '../../co
export default {
i18n: {
browseTemplates: __('Browse templates'),
+ help: __('Help'),
},
TEMPLATE_REPOSITORY_URL,
components: {
GlButton,
},
mixins: [Tracking.mixin()],
+ props: {
+ showDrawer: {
+ type: Boolean,
+ required: true,
+ },
+ },
methods: {
+ toggleDrawer() {
+ this.$emit(this.showDrawer ? 'close-drawer' : 'open-drawer');
+ },
trackTemplateBrowsing() {
const { label, actions } = pipelineEditorTrackingOptions;
@@ -30,9 +40,20 @@ export default {
size="small"
icon="external-link"
target="_blank"
+ data-testid="template-repo-link"
+ data-qa-selector="template_repo_link"
@click="trackTemplateBrowsing"
>
{{ $options.i18n.browseTemplates }}
</gl-button>
+ <gl-button
+ icon="information-o"
+ size="small"
+ data-testid="drawer-toggle"
+ data-qa-selector="drawer_toggle"
+ @click="toggleDrawer"
+ >
+ {{ $options.i18n.help }}
+ </gl-button>
</div>
</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue b/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
index 5cff93c884f..d50e6f9a623 100644
--- a/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
+++ b/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
@@ -86,6 +86,10 @@ export default {
type: Boolean,
required: true,
},
+ showDrawer: {
+ type: Boolean,
+ required: true,
+ },
},
apollo: {
appStatus: {
@@ -157,7 +161,7 @@ export default {
@click="setCurrentTab($options.tabConstants.CREATE_TAB)"
>
<walkthrough-popover v-if="isNewCiConfigFile" v-on="$listeners" />
- <ci-editor-header />
+ <ci-editor-header :show-drawer="showDrawer" v-on="$listeners" />
<text-editor :commit-sha="commitSha" :value="ciFileContent" v-on="$listeners" />
</editor-tab>
<editor-tab
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 aee71999373..3e87088e77e 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
@@ -14,7 +14,7 @@ export default {
body: __(
'Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started.',
),
- btnText: __('Create new CI/CD pipeline'),
+ btnText: __('Configure pipeline'),
},
inject: {
emptyStateIllustrationPath: {
diff --git a/app/assets/javascripts/pipeline_editor/constants.js b/app/assets/javascripts/pipeline_editor/constants.js
index 2ebc4306405..9b4732b26d2 100644
--- a/app/assets/javascripts/pipeline_editor/constants.js
+++ b/app/assets/javascripts/pipeline_editor/constants.js
@@ -45,8 +45,6 @@ export const TAB_QUERY_PARAM = 'tab';
export const COMMIT_ACTION_CREATE = 'CREATE';
export const COMMIT_ACTION_UPDATE = 'UPDATE';
-export const DRAWER_EXPANDED_KEY = 'pipeline_editor_drawer_expanded';
-
export const BRANCH_PAGINATION_LIMIT = 20;
export const BRANCH_SEARCH_DEBOUNCE = '500';
export const SOURCE_EDITOR_DEBOUNCE = 500;
@@ -102,7 +100,5 @@ export const I18N = {
subtitle: s__(
"Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD.",
),
- description: s__('Pipelines|CI/CD template to test and deploy your %{name} project.'),
- cta: s__('Pipelines|Use template'),
},
};
diff --git a/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue b/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
index a5436ca63cb..4e6a4ffa6d2 100644
--- a/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
+++ b/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
@@ -388,7 +388,7 @@ export default {
@createEmptyConfigFile="setNewEmptyCiConfigFile"
@refetchContent="refetchContent"
/>
- <div v-else class="gl-pr-10">
+ <div v-else>
<pipeline-editor-messages
:failure-type="failureType"
:failure-reasons="failureReasons"
diff --git a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
index 631dd8a2c00..23e3ce10d5a 100644
--- a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
+++ b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
@@ -60,6 +60,7 @@ export default {
currentTab: CREATE_TAB,
scrollToCommitForm: false,
shouldLoadNewBranch: false,
+ showDrawer: false,
showSwitchBranchModal: false,
};
},
@@ -72,9 +73,15 @@ export default {
closeBranchModal() {
this.showSwitchBranchModal = false;
},
+ closeDrawer() {
+ this.showDrawer = false;
+ },
handleConfirmSwitchBranch() {
this.showSwitchBranchModal = true;
},
+ openDrawer() {
+ this.showDrawer = true;
+ },
switchBranch() {
this.showSwitchBranchModal = false;
this.shouldLoadNewBranch = true;
@@ -122,7 +129,10 @@ export default {
:ci-file-content="ciFileContent"
:commit-sha="commitSha"
:is-new-ci-config-file="isNewCiConfigFile"
+ :show-drawer="showDrawer"
v-on="$listeners"
+ @open-drawer="openDrawer"
+ @close-drawer="closeDrawer"
@set-current-tab="setCurrentTab"
@walkthrough-popover-cta-clicked="setScrollToCommitForm"
/>
@@ -137,6 +147,10 @@ export default {
@scrolled-to-commit-form="setScrollToCommitForm(false)"
v-on="$listeners"
/>
- <pipeline-editor-drawer />
+ <pipeline-editor-drawer
+ :is-visible="showDrawer"
+ v-on="$listeners"
+ @close-drawer="closeDrawer"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue b/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
index d74b6e8edf6..32e1e18b684 100644
--- a/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
+++ b/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
@@ -396,6 +396,7 @@ export default {
:key="variable.uniqueId"
class="gl-mb-3 gl-ml-n3 gl-pb-2"
data-testid="ci-variable-row"
+ data-qa-selector="ci_variable_row_container"
>
<div
class="gl-display-flex gl-align-items-stretch gl-flex-direction-column gl-md-flex-direction-row"
@@ -411,6 +412,7 @@ export default {
:placeholder="s__('CiVariables|Input variable key')"
:class="$options.formElementClasses"
data-testid="pipeline-form-ci-variable-key"
+ data-qa-selector="ci_variable_key_field"
@change="addEmptyVariable(refFullName)"
/>
<gl-form-textarea
@@ -420,6 +422,7 @@ export default {
:style="$options.textAreaStyle"
:no-resize="false"
data-testid="pipeline-form-ci-variable-value"
+ data-qa-selector="ci_variable_value_field"
/>
<template v-if="variables.length > 1">
diff --git a/app/assets/javascripts/pipeline_wizard/components/input.vue b/app/assets/javascripts/pipeline_wizard/components/input.vue
index 9a0c8026648..5efae2471e5 100644
--- a/app/assets/javascripts/pipeline_wizard/components/input.vue
+++ b/app/assets/javascripts/pipeline_wizard/components/input.vue
@@ -92,6 +92,7 @@ export default {
ref="widget"
:validate="validate"
v-bind="$attrs"
+ :data-input-target="target"
@input="onModelChange"
@update:valid="onValidationStateChange"
/>
diff --git a/app/assets/javascripts/pipeline_wizard/components/wrapper.vue b/app/assets/javascripts/pipeline_wizard/components/wrapper.vue
index b7207576ddc..f50cd175510 100644
--- a/app/assets/javascripts/pipeline_wizard/components/wrapper.vue
+++ b/app/assets/javascripts/pipeline_wizard/components/wrapper.vue
@@ -1,6 +1,7 @@
<script>
import { GlProgressBar } from '@gitlab/ui';
import { Document } from 'yaml';
+import { uniqueId } from 'lodash';
import { merge } from '~/lib/utils/yaml';
import { __ } from '~/locale';
import { isValidStepSeq } from '~/pipeline_wizard/validators';
@@ -57,15 +58,6 @@ export default {
};
},
computed: {
- currentStepConfig() {
- return this.steps.get(this.currentStepIndex);
- },
- currentStepInputs() {
- return this.currentStepConfig.get('inputs').toJSON();
- },
- currentStepTemplate() {
- return this.currentStepConfig.get('template', true);
- },
currentStep() {
return this.currentStepIndex + 1;
},
@@ -78,6 +70,13 @@ export default {
isLastStep() {
return this.currentStep === this.stepCount;
},
+ stepList() {
+ return this.steps.items.map((_, i) => ({
+ id: uniqueId(),
+ inputs: this.steps.get(i).get('inputs').toJSON(),
+ template: this.steps.get(i).get('template', true),
+ }));
+ },
},
watch: {
isLastStep(value) {
@@ -85,6 +84,9 @@ export default {
},
},
methods: {
+ getStep(index) {
+ return this.steps.get(index);
+ },
resetHighlight() {
this.highlightPath = null;
},
@@ -119,8 +121,8 @@ export default {
</header>
<section class="gl-mb-4">
<commit-step
- v-if="isLastStep"
- ref="step"
+ v-show="isLastStep"
+ data-testid="step"
:default-branch="defaultBranch"
:file-content="pipelineBlob"
:filename="filename"
@@ -128,15 +130,16 @@ export default {
@back="currentStepIndex--"
/>
<wizard-step
- v-else
- :key="currentStepIndex"
- ref="step"
+ v-for="(step, i) in stepList"
+ v-show="i === currentStepIndex"
+ :key="step.id"
+ data-testid="step"
:compiled.sync="compiled"
- :has-next-step="currentStepIndex < steps.items.length"
- :has-previous-step="currentStepIndex > 0"
+ :has-next-step="i < steps.items.length"
+ :has-previous-step="i > 0"
:highlight.sync="highlightPath"
- :inputs="currentStepInputs"
- :template="currentStepTemplate"
+ :inputs="step.inputs"
+ :template="step.template"
@back="currentStepIndex--"
@next="currentStepIndex++"
@update:compiled="onUpdate"
diff --git a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
index e995d400907..534ad25a35d 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
@@ -273,6 +273,7 @@ export default {
<local-storage-sync
:storage-key="$options.viewTypeKey"
:value="currentViewType"
+ as-string
@input="updateViewType"
>
<graph-view-selector
diff --git a/app/assets/javascripts/pipelines/components/graph/job_item.vue b/app/assets/javascripts/pipelines/components/graph/job_item.vue
index 795b95421c7..f69b25dfa7c 100644
--- a/app/assets/javascripts/pipelines/components/graph/job_item.vue
+++ b/app/assets/javascripts/pipelines/components/graph/job_item.vue
@@ -234,8 +234,9 @@ export default {
:title="tooltipText"
:class="jobClasses"
:href="detailsPath"
- class="js-pipeline-graph-job-link qa-job-link menu-item gl-text-gray-900 gl-active-text-decoration-none gl-focus-text-decoration-none gl-hover-text-decoration-none gl-w-full"
+ class="js-pipeline-graph-job-link menu-item gl-text-gray-900 gl-active-text-decoration-none gl-focus-text-decoration-none gl-hover-text-decoration-none gl-w-full"
:data-testid="testId"
+ data-qa-selector="job_link"
@click="jobItemClick"
@mouseout="hideTooltips"
>
diff --git a/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue b/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
index c59f56fc68f..d59802196af 100644
--- a/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
+++ b/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
@@ -133,7 +133,7 @@ export default {
class="gl-h-full gl-display-flex! gl-border-solid gl-border-gray-100 gl-border-1"
:class="flexDirection"
:title="tooltipText"
- data-qa-selector="child_pipeline"
+ data-qa-selector="linked_pipeline_container"
@mouseover="onDownstreamHovered"
@mouseleave="onDownstreamHoverLeave"
>
@@ -171,7 +171,7 @@ export default {
:icon="expandedIcon"
:aria-label="__('Expand pipeline')"
data-testid="expand-pipeline-button"
- data-qa-selector="expand_pipeline_button"
+ data-qa-selector="expand_linked_pipeline_button"
@click="onClickLinkedPipeline"
/>
</div>
diff --git a/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue b/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue
index b0f375c9aeb..6ab4eb58977 100644
--- a/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue
@@ -141,7 +141,9 @@ export default {
class="gl-display-flex gl-justify-content-space-between gl-relative"
:class="$options.titleClasses"
>
- <div>{{ formattedTitle }}</div>
+ <span :title="formattedTitle" class="gl-text-truncate gl-pr-3 gl-w-85p">
+ {{ formattedTitle }}
+ </span>
<action-component
v-if="hasAction && canUpdatePipeline"
:action-icon="action.icon"
diff --git a/app/assets/javascripts/pipelines/components/header_component.vue b/app/assets/javascripts/pipelines/components/header_component.vue
index ac97c9d2743..04b78b8aa23 100644
--- a/app/assets/javascripts/pipelines/components/header_component.vue
+++ b/app/assets/javascripts/pipelines/components/header_component.vue
@@ -249,8 +249,7 @@ export default {
:title="$options.BUTTON_TOOLTIP_RETRY"
:loading="isRetrying"
:disabled="isRetrying"
- category="secondary"
- variant="info"
+ variant="confirm"
data-testid="retryPipeline"
class="js-retry-button"
@click="retryPipeline()"
@@ -262,7 +261,6 @@ export default {
v-if="canCancelPipeline"
:loading="isCanceling"
:disabled="isCanceling"
- class="gl-ml-3"
variant="danger"
data-testid="cancelPipeline"
@click="cancelPipeline()"
diff --git a/app/assets/javascripts/pipelines/components/jobs_shared/job_name_component.vue b/app/assets/javascripts/pipelines/components/jobs_shared/job_name_component.vue
index fffd8e1818a..70d1a5c08cc 100644
--- a/app/assets/javascripts/pipelines/components/jobs_shared/job_name_component.vue
+++ b/app/assets/javascripts/pipelines/components/jobs_shared/job_name_component.vue
@@ -1,5 +1,5 @@
<script>
-import ciIcon from '../../../vue_shared/components/ci_icon.vue';
+import ciIcon from '~/vue_shared/components/ci_icon.vue';
/**
* Component that renders both the CI icon status and the job name.
diff --git a/app/assets/javascripts/pipelines/components/pipeline_tabs.vue b/app/assets/javascripts/pipelines/components/pipeline_tabs.vue
new file mode 100644
index 00000000000..62c785d7ad2
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipeline_tabs.vue
@@ -0,0 +1,50 @@
+<script>
+import { GlTabs, GlTab } from '@gitlab/ui';
+import { __ } from '~/locale';
+import PipelineGraphWrapper from './graph/graph_component_wrapper.vue';
+import Dag from './dag/dag.vue';
+import JobsApp from './jobs/jobs_app.vue';
+import TestReports from './test_reports/test_reports.vue';
+
+export default {
+ i18n: {
+ tabs: {
+ failedJobsTitle: __('Failed Jobs'),
+ jobsTitle: __('Jobs'),
+ needsTitle: __('Needs'),
+ pipelineTitle: __('Pipeline'),
+ testsTitle: __('Tests'),
+ },
+ },
+ components: {
+ Dag,
+ GlTab,
+ GlTabs,
+ JobsApp,
+ FailedJobsApp: JobsApp,
+ PipelineGraphWrapper,
+ TestReports,
+ },
+};
+</script>
+
+<template>
+ <gl-tabs>
+ <gl-tab :title="$options.i18n.tabs.pipelineTitle" data-testid="pipeline-tab">
+ <pipeline-graph-wrapper />
+ </gl-tab>
+ <gl-tab :title="$options.i18n.tabs.needsTitle" data-testid="dag-tab">
+ <dag />
+ </gl-tab>
+ <gl-tab :title="$options.i18n.tabs.jobsTitle" data-testid="jobs-tab">
+ <jobs-app />
+ </gl-tab>
+ <gl-tab :title="$options.i18n.tabs.failedJobsTitle" data-testid="failed-jobs-tab">
+ <failed-jobs-app />
+ </gl-tab>
+ <gl-tab :title="$options.i18n.tabs.testsTitle" data-testid="tests-tab">
+ <test-reports />
+ </gl-tab>
+ <slot></slot>
+ </gl-tabs>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
index 0380ba646cc..5a9c85a0f10 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
@@ -1,7 +1,7 @@
<script>
import { GlEmptyState } from '@gitlab/ui';
import { s__ } from '~/locale';
-import PipelinesCiTemplates from './pipelines_ci_templates.vue';
+import PipelinesCiTemplates from './empty_state/pipelines_ci_templates.vue';
export default {
i18n: {
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ci_templates.vue b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ci_templates.vue
new file mode 100644
index 00000000000..3b312e78d11
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ci_templates.vue
@@ -0,0 +1,81 @@
+<script>
+import { GlAvatar, GlButton } from '@gitlab/ui';
+import { s__, sprintf } from '~/locale';
+import { mergeUrlParams } from '~/lib/utils/url_utility';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
+import Tracking from '~/tracking';
+
+export default {
+ components: {
+ GlAvatar,
+ GlButton,
+ },
+ mixins: [Tracking.mixin()],
+ inject: ['pipelineEditorPath', 'suggestedCiTemplates'],
+ data() {
+ const templates = this.suggestedCiTemplates.map(({ name, logo }) => {
+ return {
+ name,
+ logo,
+ link: mergeUrlParams({ template: name }, this.pipelineEditorPath),
+ description: sprintf(this.$options.i18n.description, { name }),
+ };
+ });
+
+ return {
+ templates,
+ };
+ },
+ methods: {
+ trackEvent(template) {
+ this.track('template_clicked', {
+ label: template,
+ });
+ },
+ },
+ i18n: {
+ description: s__('Pipelines|CI/CD template to test and deploy your %{name} project.'),
+ cta: s__('Pipelines|Use template'),
+ },
+ AVATAR_SHAPE_OPTION_RECT,
+};
+</script>
+<template>
+ <ul class="gl-list-style-none gl-pl-0">
+ <li v-for="template in templates" :key="template.name">
+ <div
+ class="gl-display-flex gl-align-items-center gl-justify-content-space-between gl-border-b-solid gl-border-b-1 gl-border-b-gray-100 gl-pb-3 gl-pt-3"
+ >
+ <div class="gl-display-flex gl-flex-direction-row gl-align-items-center">
+ <gl-avatar
+ :src="template.logo"
+ :size="48"
+ class="gl-mr-5 gl-bg-white dark-mode-override"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
+ :alt="template.name"
+ data-testid="template-logo"
+ />
+ <div class="gl-flex-direction-row">
+ <div class="gl-mb-3">
+ <strong class="gl-text-gray-800" data-testid="template-name">
+ {{ template.name }}
+ </strong>
+ </div>
+ <p class="gl-mb-0 gl-font-sm" data-testid="template-description">
+ {{ template.description }}
+ </p>
+ </div>
+ </div>
+ <gl-button
+ category="primary"
+ variant="confirm"
+ :href="template.link"
+ data-testid="template-link"
+ @click="trackEvent(template.name)"
+ >
+ {{ $options.i18n.cta }}
+ </gl-button>
+ </div>
+ </li>
+ </ul>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue
new file mode 100644
index 00000000000..be46a7f5cec
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue
@@ -0,0 +1,173 @@
+<script>
+import { GlButton, GlCard, GlSprintf, GlIcon, GlLink } from '@gitlab/ui';
+import { mergeUrlParams } from '~/lib/utils/url_utility';
+import {
+ STARTER_TEMPLATE_NAME,
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
+ RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
+ RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
+ I18N,
+} from '~/pipeline_editor/constants';
+import Tracking from '~/tracking';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { isExperimentVariant } from '~/experimentation/utils';
+import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
+import ExperimentTracking from '~/experimentation/experiment_tracking';
+import CiTemplates from './ci_templates.vue';
+
+export default {
+ components: {
+ GlButton,
+ GlCard,
+ GlSprintf,
+ GlIcon,
+ GlLink,
+ GitlabExperiment,
+ CiTemplates,
+ },
+ mixins: [Tracking.mixin()],
+ STARTER_TEMPLATE_NAME,
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
+ RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
+ RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
+ I18N,
+ inject: ['pipelineEditorPath'],
+ props: {
+ ciRunnerSettingsPath: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ anyRunnersAvailable: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+ },
+ data() {
+ return {
+ gettingStartedTemplateUrl: mergeUrlParams(
+ { template: STARTER_TEMPLATE_NAME },
+ this.pipelineEditorPath,
+ ),
+ tracker: null,
+ };
+ },
+ computed: {
+ sharedRunnersHelpPagePath() {
+ return helpPagePath('ci/runners/runners_scope', { anchor: 'shared-runners' });
+ },
+ runnersAvailabilitySectionExperimentEnabled() {
+ return isExperimentVariant(RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME);
+ },
+ },
+ created() {
+ this.tracker = new ExperimentTracking(RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME);
+ },
+ methods: {
+ trackEvent(template) {
+ this.track('template_clicked', {
+ label: template,
+ });
+ },
+ trackExperimentEvent(action) {
+ this.tracker.event(action);
+ },
+ },
+};
+</script>
+<template>
+ <div>
+ <h2 class="gl-font-size-h2 gl-text-gray-900">{{ $options.I18N.title }}</h2>
+
+ <gitlab-experiment :name="$options.RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME">
+ <template #candidate>
+ <div v-if="anyRunnersAvailable">
+ <h2 class="gl-font-base gl-text-gray-900">
+ <gl-icon name="check-circle-filled" class="gl-text-green-500 gl-mr-2" :size="12" />
+ {{ $options.I18N.runners.title }}
+ </h2>
+ <p class="gl-text-gray-800 gl-mb-6">
+ <gl-sprintf :message="$options.I18N.runners.subtitle">
+ <template #settingsLink="{ content }">
+ <gl-link
+ data-testid="settings-link"
+ :href="ciRunnerSettingsPath"
+ @click="trackExperimentEvent($options.RUNNERS_SETTINGS_LINK_CLICKED_EVENT)"
+ >{{ content }}</gl-link
+ >
+ </template>
+ <template #docsLink="{ content }">
+ <gl-link
+ data-testid="documentation-link"
+ :href="sharedRunnersHelpPagePath"
+ @click="trackExperimentEvent($options.RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT)"
+ >{{ content }}</gl-link
+ >
+ </template>
+ </gl-sprintf>
+ </p>
+ </div>
+
+ <div v-else>
+ <h2 class="gl-font-base gl-text-gray-900">
+ <gl-icon name="warning-solid" class="gl-text-red-600 gl-mr-2" :size="14" />
+ {{ $options.I18N.noRunners.title }}
+ </h2>
+ <p class="gl-text-gray-800 gl-mb-6">{{ $options.I18N.noRunners.subtitle }}</p>
+ <gl-button
+ data-testid="settings-button"
+ category="primary"
+ variant="confirm"
+ :href="ciRunnerSettingsPath"
+ @click="trackExperimentEvent($options.RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT)"
+ >
+ {{ $options.I18N.noRunners.cta }}
+ </gl-button>
+ </div>
+ </template>
+ </gitlab-experiment>
+
+ <template v-if="!runnersAvailabilitySectionExperimentEnabled || anyRunnersAvailable">
+ <h2 class="gl-font-lg gl-text-gray-900">{{ $options.I18N.learnBasics.title }}</h2>
+ <p class="gl-text-gray-800 gl-mb-6">
+ <gl-sprintf :message="$options.I18N.learnBasics.subtitle">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <div class="gl-lg-w-25p gl-lg-pr-5 gl-mb-8">
+ <gl-card>
+ <div class="gl-flex-direction-row">
+ <div class="gl-py-5"><gl-emoji class="gl-font-size-h2-xl" data-name="wave" /></div>
+ <div class="gl-mb-3">
+ <strong class="gl-text-gray-800 gl-mb-2">
+ {{ $options.I18N.learnBasics.gettingStarted.title }}
+ </strong>
+ </div>
+ <p class="gl-font-sm">{{ $options.I18N.learnBasics.gettingStarted.description }}</p>
+ </div>
+
+ <gl-button
+ category="primary"
+ variant="confirm"
+ :href="gettingStartedTemplateUrl"
+ data-testid="test-template-link"
+ @click="trackEvent($options.STARTER_TEMPLATE_NAME)"
+ >
+ {{ $options.I18N.learnBasics.gettingStarted.cta }}
+ </gl-button>
+ </gl-card>
+ </div>
+
+ <h2 class="gl-font-lg gl-text-gray-900">{{ $options.I18N.templates.title }}</h2>
+ <p class="gl-text-gray-800 gl-mb-6">{{ $options.I18N.templates.subtitle }}</p>
+
+ <ci-templates />
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_triggerer.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_triggerer.vue
index b29c8426301..2a73795db0a 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_triggerer.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_triggerer.vue
@@ -1,10 +1,14 @@
<script>
-import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
+import { GlAvatarLink, GlAvatar, GlTooltipDirective } from '@gitlab/ui';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
components: {
- UserAvatarLink,
+ GlAvatarLink,
+ GlAvatar,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
},
mixins: [glFeatureFlagMixin()],
props: {
@@ -22,15 +26,11 @@ export default {
</script>
<template>
<div class="pipeline-triggerer" data-testid="pipeline-triggerer">
- <user-avatar-link
- v-if="user"
- :link-href="user.path"
- :img-src="user.avatar_url"
- :img-size="32"
- :tooltip-text="user.name"
- class="gl-ml-3 js-pipeline-url-user"
- />
- <span v-else class="gl-ml-3 js-pipeline-url-api api">
+ <gl-avatar-link v-if="user" v-gl-tooltip :href="user.path" :title="user.name" class="gl-ml-3">
+ <gl-avatar :size="32" :src="user.avatar_url" />
+ </gl-avatar-link>
+
+ <span v-else class="gl-ml-3">
{{ s__('Pipelines|API') }}
</span>
</div>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
index 1dcbd77a92d..63c492c8bcd 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
@@ -2,6 +2,7 @@
import { GlIcon, GlLink, GlTooltipDirective } from '@gitlab/ui';
import { __ } from '~/locale';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
+import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import { ICONS } from '../../constants';
import PipelineLabels from './pipeline_labels.vue';
@@ -11,6 +12,7 @@ export default {
GlLink,
PipelineLabels,
TooltipOnTruncate,
+ UserAvatarLink,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -169,6 +171,15 @@ export default {
<gl-link :href="commitUrl" class="commit-sha mr-0" data-testid="commit-short-sha">{{
commitShortSha
}}</gl-link>
+ <user-avatar-link
+ v-if="commitAuthor"
+ :link-href="commitAuthor.path"
+ :img-src="commitAuthor.avatar_url"
+ :img-size="16"
+ :img-alt="commitAuthor.name"
+ :tooltip-text="commitAuthor.name"
+ class="gl-ml-1"
+ />
<!--End of commit row-->
</div>
<pipeline-labels :pipeline-schedule-url="pipelineScheduleUrl" :pipeline="pipeline" />
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue
deleted file mode 100644
index d50229e47c4..00000000000
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue
+++ /dev/null
@@ -1,219 +0,0 @@
-<script>
-import { GlAvatar, GlButton, GlCard, GlSprintf, GlIcon, GlLink } from '@gitlab/ui';
-import { mergeUrlParams } from '~/lib/utils/url_utility';
-import { sprintf } from '~/locale';
-import {
- STARTER_TEMPLATE_NAME,
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
- RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
- RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
- I18N,
-} from '~/pipeline_editor/constants';
-import { helpPagePath } from '~/helpers/help_page_helper';
-import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
-import ExperimentTracking from '~/experimentation/experiment_tracking';
-import { isExperimentVariant } from '~/experimentation/utils';
-import Tracking from '~/tracking';
-
-export default {
- components: {
- GlAvatar,
- GlButton,
- GlCard,
- GlSprintf,
- GlIcon,
- GlLink,
- GitlabExperiment,
- },
- mixins: [Tracking.mixin()],
- STARTER_TEMPLATE_NAME,
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
- RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
- RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
- I18N,
- inject: ['pipelineEditorPath', 'suggestedCiTemplates'],
- props: {
- ciRunnerSettingsPath: {
- type: String,
- required: false,
- default: null,
- },
- anyRunnersAvailable: {
- type: Boolean,
- required: false,
- default: true,
- },
- },
- data() {
- const templates = this.suggestedCiTemplates.map(({ name, logo }) => {
- return {
- name,
- logo,
- link: mergeUrlParams({ template: name }, this.pipelineEditorPath),
- description: sprintf(this.$options.I18N.templates.description, { name }),
- };
- });
-
- return {
- templates,
- gettingStartedTemplateUrl: mergeUrlParams(
- { template: STARTER_TEMPLATE_NAME },
- this.pipelineEditorPath,
- ),
- tracker: null,
- };
- },
- computed: {
- sharedRunnersHelpPagePath() {
- return helpPagePath('ci/runners/runners_scope', { anchor: 'shared-runners' });
- },
- runnersAvailabilitySectionExperimentEnabled() {
- return isExperimentVariant(RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME);
- },
- },
- created() {
- this.tracker = new ExperimentTracking(RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME);
- },
- methods: {
- trackEvent(template) {
- this.track('template_clicked', {
- label: template,
- });
- },
- trackExperimentEvent(action) {
- this.tracker.event(action);
- },
- },
-};
-</script>
-<template>
- <div>
- <h2 class="gl-font-size-h2 gl-text-gray-900">{{ $options.I18N.title }}</h2>
-
- <gitlab-experiment :name="$options.RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME">
- <template #candidate>
- <div v-if="anyRunnersAvailable">
- <h2 class="gl-font-base gl-text-gray-900">
- <gl-icon name="check-circle-filled" class="gl-text-green-500 gl-mr-2" :size="12" />
- {{ $options.I18N.runners.title }}
- </h2>
- <p class="gl-text-gray-800 gl-mb-6">
- <gl-sprintf :message="$options.I18N.runners.subtitle">
- <template #settingsLink="{ content }">
- <gl-link
- data-testid="settings-link"
- :href="ciRunnerSettingsPath"
- @click="trackExperimentEvent($options.RUNNERS_SETTINGS_LINK_CLICKED_EVENT)"
- >{{ content }}</gl-link
- >
- </template>
- <template #docsLink="{ content }">
- <gl-link
- data-testid="documentation-link"
- :href="sharedRunnersHelpPagePath"
- @click="trackExperimentEvent($options.RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT)"
- >{{ content }}</gl-link
- >
- </template>
- </gl-sprintf>
- </p>
- </div>
-
- <div v-else>
- <h2 class="gl-font-base gl-text-gray-900">
- <gl-icon name="warning-solid" class="gl-text-red-600 gl-mr-2" :size="14" />
- {{ $options.I18N.noRunners.title }}
- </h2>
- <p class="gl-text-gray-800 gl-mb-6">{{ $options.I18N.noRunners.subtitle }}</p>
- <gl-button
- data-testid="settings-button"
- category="primary"
- variant="confirm"
- :href="ciRunnerSettingsPath"
- @click="trackExperimentEvent($options.RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT)"
- >
- {{ $options.I18N.noRunners.cta }}
- </gl-button>
- </div>
- </template>
- </gitlab-experiment>
-
- <template v-if="!runnersAvailabilitySectionExperimentEnabled || anyRunnersAvailable">
- <h2 class="gl-font-lg gl-text-gray-900">{{ $options.I18N.learnBasics.title }}</h2>
- <p class="gl-text-gray-800 gl-mb-6">
- <gl-sprintf :message="$options.I18N.learnBasics.subtitle">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
-
- <div class="gl-lg-w-25p gl-lg-pr-5 gl-mb-8">
- <gl-card>
- <div class="gl-flex-direction-row">
- <div class="gl-py-5"><gl-emoji class="gl-font-size-h2-xl" data-name="wave" /></div>
- <div class="gl-mb-3">
- <strong class="gl-text-gray-800 gl-mb-2">
- {{ $options.I18N.learnBasics.gettingStarted.title }}
- </strong>
- </div>
- <p class="gl-font-sm">{{ $options.I18N.learnBasics.gettingStarted.description }}</p>
- </div>
-
- <gl-button
- category="primary"
- variant="confirm"
- :href="gettingStartedTemplateUrl"
- data-testid="test-template-link"
- @click="trackEvent($options.STARTER_TEMPLATE_NAME)"
- >
- {{ $options.I18N.learnBasics.gettingStarted.cta }}
- </gl-button>
- </gl-card>
- </div>
-
- <h2 class="gl-font-lg gl-text-gray-900">{{ $options.I18N.templates.title }}</h2>
- <p class="gl-text-gray-800 gl-mb-6">{{ $options.I18N.templates.subtitle }}</p>
-
- <ul class="gl-list-style-none gl-pl-0">
- <li v-for="template in templates" :key="template.name">
- <div
- class="gl-display-flex gl-align-items-center gl-justify-content-space-between gl-border-b-solid gl-border-b-1 gl-border-b-gray-100 gl-pb-3 gl-pt-3"
- >
- <div class="gl-display-flex gl-flex-direction-row gl-align-items-center">
- <gl-avatar
- :src="template.logo"
- :size="48"
- class="gl-mr-5 gl-bg-white dark-mode-override"
- shape="rect"
- :alt="template.name"
- data-testid="template-logo"
- />
- <div class="gl-flex-direction-row">
- <div class="gl-mb-3">
- <strong class="gl-text-gray-800" data-testid="template-name">
- {{ template.name }}
- </strong>
- </div>
- <p class="gl-mb-0 gl-font-sm" data-testid="template-description">
- {{ template.description }}
- </p>
- </div>
- </div>
- <gl-button
- category="primary"
- variant="confirm"
- :href="template.link"
- data-testid="template-link"
- @click="trackEvent(template.name)"
- >
- {{ $options.I18N.templates.cta }}
- </gl-button>
- </div>
- </li>
- </ul>
- </template>
- </div>
-</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
index 6f0e67e1ae0..77b9c2b5203 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
@@ -127,6 +127,10 @@ export default {
eventHub.$emit('refreshPipelinesTable');
},
},
+ TBODY_TR_ATTR: {
+ 'data-testid': 'pipeline-table-row',
+ 'data-qa-selector': 'pipeline_row_container',
+ },
};
</script>
<template>
@@ -135,7 +139,7 @@ export default {
:fields="$options.tableFields"
:items="pipelines"
tbody-tr-class="commit"
- :tbody-tr-attr="{ 'data-testid': 'pipeline-table-row' }"
+ :tbody-tr-attr="$options.TBODY_TR_ATTR"
stacked="lg"
fixed
>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue b/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
index cde963e4051..387438fb726 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
@@ -1,13 +1,12 @@
<script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
-import timeagoMixin from '~/vue_shared/mixins/timeago';
+import { formatDate, getTimeago, durationTimeFormatted } from '~/lib/utils/datetime_utility';
export default {
directives: {
GlTooltip: GlTooltipDirective,
},
components: { GlIcon },
- mixins: [timeagoMixin],
props: {
pipeline: {
type: Object,
@@ -28,24 +27,7 @@ export default {
return this.pipeline.flags.stuck;
},
durationFormatted() {
- const date = new Date(this.duration * 1000);
-
- let hh = date.getUTCHours();
- let mm = date.getUTCMinutes();
- let ss = date.getSeconds();
-
- // left pad
- if (hh < 10) {
- hh = `0${hh}`;
- }
- if (mm < 10) {
- mm = `0${mm}`;
- }
- if (ss < 10) {
- ss = `0${ss}`;
- }
-
- return `${hh}:${mm}:${ss}`;
+ return durationTimeFormatted(this.duration);
},
showInProgress() {
return !this.duration && !this.finishedTime && !this.skipped;
@@ -53,6 +35,12 @@ export default {
showSkipped() {
return !this.duration && !this.finishedTime && this.skipped;
},
+ timeFormatted() {
+ return getTimeago().format(this.finishedTime);
+ },
+ tooltipTitle() {
+ return formatDate(this.finishedTime);
+ },
},
};
</script>
@@ -85,12 +73,12 @@ export default {
<time
v-gl-tooltip
- :title="tooltipTitle(finishedTime)"
+ :title="tooltipTitle"
:datetime="finishedTime"
data-placement="top"
data-container="body"
>
- {{ timeFormatted(finishedTime) }}
+ {{ timeFormatted }}
</time>
</p>
</div>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue
index 33115d72b9c..746cf238646 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue
@@ -83,13 +83,7 @@ export default {
@input="searchAuthors"
>
<template #view="{ inputValue }">
- <gl-avatar
- v-if="activeUser"
- :size="16"
- :src="activeUser.avatar_url"
- shape="circle"
- class="gl-mr-2"
- />
+ <gl-avatar v-if="activeUser" :size="16" :src="activeUser.avatar_url" class="gl-mr-2" />
<span>{{ activeUser ? activeUser.name : inputValue }}</span>
</template>
<template #suggestions>
diff --git a/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_jobs.query.graphql b/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_jobs.query.graphql
index 5fe47e09d9c..641ec7a3cf6 100644
--- a/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_jobs.query.graphql
+++ b/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_jobs.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getPipelineJobs($fullPath: ID!, $iid: ID!, $after: String) {
project(fullPath: $fullPath) {
diff --git a/app/assets/javascripts/pipelines/pipeline_details_bundle.js b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
index 801f71cb364..338de65e795 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_bundle.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
@@ -13,6 +13,7 @@ const SELECTORS = {
PIPELINE_GRAPH: '#js-pipeline-graph-vue',
PIPELINE_HEADER: '#js-pipeline-header-vue',
PIPELINE_NOTIFICATION: '#js-pipeline-notification',
+ PIPELINE_TABS: '#js-pipeline-tabs',
PIPELINE_TESTS: '#js-pipeline-tests-detail',
PIPELINE_JOBS: '#js-pipeline-jobs-vue',
};
@@ -29,22 +30,6 @@ export default async function initPipelineDetailsBundle() {
}
try {
- createPipelinesDetailApp(SELECTORS.PIPELINE_GRAPH, apolloProvider, dataset);
- } catch {
- createFlash({
- message: __('An error occurred while loading the pipeline.'),
- });
- }
-
- try {
- createPipelineHeaderApp(SELECTORS.PIPELINE_HEADER, apolloProvider, dataset.graphqlResourceEtag);
- } catch {
- createFlash({
- message: __('An error occurred while loading a section of this page.'),
- });
- }
-
- try {
createPipelineNotificationApp(SELECTORS.PIPELINE_NOTIFICATION, apolloProvider);
} catch {
createFlash({
@@ -52,27 +37,47 @@ export default async function initPipelineDetailsBundle() {
});
}
- try {
- createDagApp(apolloProvider);
- } catch {
- createFlash({
- message: __('An error occurred while loading the Needs tab.'),
- });
- }
+ if (gon.features?.pipelineTabsVue) {
+ const { createPipelineTabs } = await import('./pipeline_tabs');
- try {
- createTestDetails(SELECTORS.PIPELINE_TESTS);
- } catch {
- createFlash({
- message: __('An error occurred while loading the Test Reports tab.'),
- });
- }
+ try {
+ createPipelineTabs(SELECTORS.PIPELINE_TABS, apolloProvider);
+ } catch {
+ createFlash({
+ message: __('An error occurred while loading a section of this page.'),
+ });
+ }
+ } else {
+ try {
+ createPipelinesDetailApp(SELECTORS.PIPELINE_GRAPH, apolloProvider, dataset);
+ } catch {
+ createFlash({
+ message: __('An error occurred while loading the pipeline.'),
+ });
+ }
- try {
- createPipelineJobsApp(SELECTORS.PIPELINE_JOBS);
- } catch {
- createFlash({
- message: __('An error occurred while loading the Jobs tab.'),
- });
+ try {
+ createDagApp(apolloProvider);
+ } catch {
+ createFlash({
+ message: __('An error occurred while loading the Needs tab.'),
+ });
+ }
+
+ try {
+ createTestDetails(SELECTORS.PIPELINE_TESTS);
+ } catch {
+ createFlash({
+ message: __('An error occurred while loading the Test Reports tab.'),
+ });
+ }
+
+ try {
+ createPipelineJobsApp(SELECTORS.PIPELINE_JOBS);
+ } catch {
+ createFlash({
+ message: __('An error occurred while loading the Jobs tab.'),
+ });
+ }
}
}
diff --git a/app/assets/javascripts/pipelines/pipeline_tabs.js b/app/assets/javascripts/pipelines/pipeline_tabs.js
new file mode 100644
index 00000000000..ff88c6215e5
--- /dev/null
+++ b/app/assets/javascripts/pipelines/pipeline_tabs.js
@@ -0,0 +1,44 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import PipelineTabs from 'ee_else_ce/pipelines/components/pipeline_tabs.vue';
+import { reportToSentry } from './utils';
+
+Vue.use(VueApollo);
+
+const createPipelineTabs = (selector, apolloProvider) => {
+ const el = document.querySelector(selector);
+
+ if (!el) return;
+
+ const { dataset } = document.querySelector(selector);
+ const {
+ canGenerateCodequalityReports,
+ codequalityReportDownloadPath,
+ downloadablePathForReportType,
+ exposeSecurityDashboard,
+ exposeLicenseScanningData,
+ } = dataset;
+ // eslint-disable-next-line no-new
+ new Vue({
+ el: selector,
+ components: {
+ PipelineTabs,
+ },
+ apolloProvider,
+ provide: {
+ canGenerateCodequalityReports: JSON.parse(canGenerateCodequalityReports),
+ codequalityReportDownloadPath,
+ downloadablePathForReportType,
+ exposeSecurityDashboard: JSON.parse(exposeSecurityDashboard),
+ exposeLicenseScanningData: JSON.parse(exposeLicenseScanningData),
+ },
+ errorCaptured(err, _vm, info) {
+ reportToSentry('pipeline_tabs', `error: ${err}, info: ${info}`);
+ },
+ render(createElement) {
+ return createElement(PipelineTabs);
+ },
+ });
+};
+
+export { createPipelineTabs };
diff --git a/app/assets/javascripts/pipelines/services/pipelines_service.js b/app/assets/javascripts/pipelines/services/pipelines_service.js
index 523ca13b6c3..3ec563c95bb 100644
--- a/app/assets/javascripts/pipelines/services/pipelines_service.js
+++ b/app/assets/javascripts/pipelines/services/pipelines_service.js
@@ -1,5 +1,5 @@
import Api from '~/api';
-import axios from '../../lib/utils/axios_utils';
+import axios from '~/lib/utils/axios_utils';
import { validateParams } from '../utils';
export default class PipelinesService {
diff --git a/app/assets/javascripts/pipelines/stores/pipelines_store.js b/app/assets/javascripts/pipelines/stores/pipelines_store.js
index a4bbada89c8..765441560d8 100644
--- a/app/assets/javascripts/pipelines/stores/pipelines_store.js
+++ b/app/assets/javascripts/pipelines/stores/pipelines_store.js
@@ -1,4 +1,4 @@
-import { parseIntPagination, normalizeHeaders } from '../../lib/utils/common_utils';
+import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
export default class PipelinesStore {
constructor() {
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/actions.js b/app/assets/javascripts/pipelines/stores/test_reports/actions.js
index 7b28d48b5b6..b7f590a7b3c 100644
--- a/app/assets/javascripts/pipelines/stores/test_reports/actions.js
+++ b/app/assets/javascripts/pipelines/stores/test_reports/actions.js
@@ -30,6 +30,7 @@ export const fetchTestSuite = ({ state, commit, dispatch }, index) => {
dispatch('toggleLoading');
+ // eslint-disable-next-line camelcase
const { build_ids = [] } = state.testReports?.test_suites?.[index] || {};
// Replacing `/:suite_name.json` with the name of the suite. Including the extra characters
// to ensure that we replace exactly the template part of the URL string
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/utils.js b/app/assets/javascripts/pipelines/stores/test_reports/utils.js
index 63a58798958..6b616601bc5 100644
--- a/app/assets/javascripts/pipelines/stores/test_reports/utils.js
+++ b/app/assets/javascripts/pipelines/stores/test_reports/utils.js
@@ -1,4 +1,4 @@
-import { __, sprintf } from '../../../locale';
+import { __, sprintf } from '~/locale';
import { TestStatus } from '../../constants';
/**
diff --git a/app/assets/javascripts/profile/preferences/components/diffs_colors.vue b/app/assets/javascripts/profile/preferences/components/diffs_colors.vue
new file mode 100644
index 00000000000..1992819ab82
--- /dev/null
+++ b/app/assets/javascripts/profile/preferences/components/diffs_colors.vue
@@ -0,0 +1,107 @@
+<script>
+import { validateHexColor, hexToRgb } from '~/lib/utils/color_utils';
+import { s__ } from '~/locale';
+import { getCssVariable } from '~/lib/utils/css_utils';
+import ColorPicker from '~/vue_shared/components/color_picker/color_picker.vue';
+import DiffsColorsPreview from './diffs_colors_preview.vue';
+
+export default {
+ components: {
+ ColorPicker,
+ DiffsColorsPreview,
+ },
+ inject: ['deletion', 'addition'],
+ data() {
+ return {
+ deletionColor: this.deletion || '',
+ additionColor: this.addition || '',
+ defaultDeletionColor: getCssVariable('--default-diff-color-deletion'),
+ defaultAdditionColor: getCssVariable('--default-diff-color-addition'),
+ };
+ },
+ computed: {
+ suggestedColors() {
+ const colors = {
+ '#d99530': s__('SuggestedColors|Orange'),
+ '#1f75cb': s__('SuggestedColors|Blue'),
+ };
+ if (this.isValidColor(this.deletion)) {
+ colors[this.deletion] = s__('SuggestedColors|Current removal color');
+ }
+ if (this.isValidColor(this.addition)) {
+ colors[this.addition] = s__('SuggestedColors|Current addition color');
+ }
+ if (this.isValidColor(this.defaultDeletionColor)) {
+ colors[this.defaultDeletionColor] = s__('SuggestedColors|Default removal color');
+ }
+ if (this.isValidColor(this.defaultAdditionColor)) {
+ colors[this.defaultAdditionColor] = s__('SuggestedColors|Default addition color');
+ }
+ return colors;
+ },
+ previewClasses() {
+ return {
+ 'diff-custom-addition-color': this.isValidColor(this.additionColor),
+ 'diff-custom-deletion-color': this.isValidColor(this.deletionColor),
+ };
+ },
+ previewStyle() {
+ let style = {};
+ if (this.isValidColor(this.deletionColor)) {
+ const colorRgb = hexToRgb(this.deletionColor).join();
+ style = {
+ ...style,
+ '--diff-deletion-color': `rgba(${colorRgb},0.2)`,
+ };
+ }
+ if (this.isValidColor(this.additionColor)) {
+ const colorRgb = hexToRgb(this.additionColor).join();
+ style = {
+ ...style,
+ '--diff-addition-color': `rgba(${colorRgb},0.2)`,
+ };
+ }
+ return style;
+ },
+ },
+ methods: {
+ isValidColor(color) {
+ return validateHexColor(color);
+ },
+ },
+ i18n: {
+ colorDeletionInputLabel: s__('Preferences|Color for removed lines'),
+ colorAdditionInputLabel: s__('Preferences|Color for added lines'),
+ previewLabel: s__('Preferences|Preview'),
+ },
+};
+</script>
+<template>
+ <div :style="previewStyle" :class="previewClasses">
+ <diffs-colors-preview />
+ <color-picker
+ v-model="deletionColor"
+ :label="$options.i18n.colorDeletionInputLabel"
+ :state="isValidColor(deletionColor)"
+ :suggested-colors="suggestedColors"
+ />
+ <input
+ id="user_diffs_deletion_color"
+ v-model="deletionColor"
+ name="user[diffs_deletion_color]"
+ type="hidden"
+ />
+ <color-picker
+ v-model="additionColor"
+ :label="$options.i18n.colorAdditionInputLabel"
+ :state="isValidColor(additionColor)"
+ :suggested-colors="suggestedColors"
+ />
+ <input
+ id="user_diffs_addition_color"
+ v-model="additionColor"
+ name="user[diffs_addition_color]"
+ type="hidden"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/profile/preferences/components/diffs_colors_preview.vue b/app/assets/javascripts/profile/preferences/components/diffs_colors_preview.vue
new file mode 100644
index 00000000000..74dd2d5628a
--- /dev/null
+++ b/app/assets/javascripts/profile/preferences/components/diffs_colors_preview.vue
@@ -0,0 +1,231 @@
+<script>
+import { s__ } from '~/locale';
+
+export default {
+ computed: {
+ themeClass() {
+ return window.gon?.user_color_scheme;
+ },
+ },
+ i18n: {
+ previewLabel: s__('Preferences|Preview'),
+ },
+};
+</script>
+<template>
+ <div class="form-group">
+ <label>{{ $options.i18n.previewLabel }}</label>
+ <!-- eslint-disable @gitlab/vue-require-i18n-strings -->
+ <table :class="themeClass" class="code">
+ <tbody>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="1"></a>
+ </td>
+ <td class="line_content parallel left-side old">
+ <span
+ ><span class="c1"># <span class="idiff deletion">Removed</span> content</span></span
+ >
+ </td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="1"></a>
+ </td>
+ <td class="line_content parallel right-side new">
+ <span
+ ><span class="c1"># <span class="idiff addition">Added</span> content</span></span
+ >
+ </td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="2"></a>
+ </td>
+ <td class="line_content parallel left-side old">
+ <span><span class="n">v</span> <span class="o">=</span> <span class="mi">1</span></span>
+ </td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="2"></a>
+ </td>
+ <td class="line_content parallel right-side new">
+ <span><span class="n">v</span> <span class="o">=</span> <span class="mi">1</span></span>
+ </td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="3"></a>
+ </td>
+ <td class="line_content parallel left-side old">
+ <span
+ ><span class="n">s</span> <span class="o">=</span>
+ <span class="s">"string"</span></span
+ >
+ </td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="3"></a>
+ </td>
+ <td class="line_content parallel right-side new">
+ <span
+ ><span class="n">s</span> <span class="o">=</span>
+ <span class="s">"string"</span></span
+ >
+ </td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="4"></a>
+ </td>
+ <td class="line_content parallel left-side old"><span></span></td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="4"></a>
+ </td>
+ <td class="line_content parallel right-side new"><span></span></td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="5"></a>
+ </td>
+ <td class="line_content parallel left-side old">
+ <span
+ ><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span>
+ <span class="nb">range</span><span class="p">(</span><span class="o">-</span
+ ><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span
+ ><span class="p">):</span></span
+ >
+ </td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="5"></a>
+ </td>
+ <td class="line_content parallel right-side new">
+ <span
+ ><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span>
+ <span class="nb">range</span><span class="p">(</span><span class="o">-</span
+ ><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span
+ ><span class="p">):</span></span
+ >
+ </td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="6"></a>
+ </td>
+ <td class="line_content parallel left-side old">
+ <span>
+ <span>{{ ' ' }}</span>
+ <span class="k">print</span><span class="p">(</span><span class="n">i</span>
+ <span class="o">+</span> <span class="mi">1</span><span class="p">)</span></span
+ >
+ </td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="6"></a>
+ </td>
+ <td class="line_content parallel right-side new">
+ <span>
+ <span>{{ ' ' }}</span>
+ <span class="k">print</span><span class="p">(</span><span class="n">i</span>
+ <span class="o">+</span> <span class="mi">1</span><span class="p">)</span></span
+ >
+ </td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="7"></a>
+ </td>
+ <td class="line_content parallel left-side old"><span></span></td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="7"></a>
+ </td>
+ <td class="line_content parallel right-side new"><span></span></td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="8"></a>
+ </td>
+ <td class="line_content parallel left-side old">
+ <span
+ ><span class="k">class</span> <span class="nc">LinkedList</span
+ ><span class="p">(</span><span class="nb">object</span><span class="p">):</span></span
+ >
+ </td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="8"></a>
+ </td>
+ <td class="line_content parallel right-side new">
+ <span
+ ><span class="k">class</span> <span class="nc">LinkedList</span
+ ><span class="p">(</span><span class="nb">object</span><span class="p">):</span></span
+ >
+ </td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="9"></a>
+ </td>
+ <td class="line_content parallel left-side old">
+ <span>
+ <span>{{ ' ' }}</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span
+ ><span class="bp">self</span><span class="p">,</span> <span class="n">x</span
+ ><span class="p">):</span></span
+ >
+ </td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="9"></a>
+ </td>
+ <td class="line_content parallel right-side new">
+ <span>
+ <span>{{ ' ' }}</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span
+ ><span class="bp">self</span><span class="p">,</span> <span class="n">x</span
+ ><span class="p">):</span></span
+ >
+ </td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="10"></a>
+ </td>
+ <td class="line_content parallel left-side old">
+ <span>
+ <span>{{ ' ' }}</span>
+ <span class="bp">self</span><span class="p">.</span><span class="n">val</span>
+ <span class="o">=</span> <span class="n">x</span></span
+ >
+ </td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="10"></a>
+ </td>
+ <td class="line_content parallel right-side new">
+ <span>
+ <span>{{ ' ' }}</span>
+ <span class="bp">self</span><span class="p">.</span><span class="n">val</span>
+ <span class="o">=</span> <span class="n">x</span></span
+ >
+ </td>
+ </tr>
+ <tr class="line_holder parallel">
+ <td class="old_line diff-line-num old">
+ <a data-linenumber="11"></a>
+ </td>
+ <td class="line_content parallel left-side old">
+ <span>
+ <span>{{ ' ' }}</span>
+ <span class="bp">self</span><span class="p">.</span><span class="nb">next</span>
+ <span class="o">=</span> <span class="bp">None</span></span
+ >
+ </td>
+ <td class="new_line diff-line-num new">
+ <a data-linenumber="11"></a>
+ </td>
+ <td class="line_content parallel right-side new">
+ <span>
+ <span>{{ ' ' }}</span>
+ <span class="bp">self</span><span class="p">.</span><span class="nb">next</span>
+ <span class="o">=</span> <span class="bp">None</span></span
+ >
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <!-- eslint-enable @gitlab/vue-require-i18n-strings -->
+ </div>
+</template>
diff --git a/app/assets/javascripts/profile/preferences/components/integration_view.vue b/app/assets/javascripts/profile/preferences/components/integration_view.vue
index c2952629a5d..9924f248b89 100644
--- a/app/assets/javascripts/profile/preferences/components/integration_view.vue
+++ b/app/assets/javascripts/profile/preferences/components/integration_view.vue
@@ -1,13 +1,14 @@
<script>
-import { GlFormText, GlIcon, GlLink } from '@gitlab/ui';
+import { GlIcon, GlLink, GlFormGroup, GlFormCheckbox } from '@gitlab/ui';
import IntegrationHelpText from '~/vue_shared/components/integrations_help_text.vue';
export default {
name: 'IntegrationView',
components: {
- GlFormText,
GlIcon,
GlLink,
+ GlFormGroup,
+ GlFormCheckbox,
IntegrationHelpText,
},
inject: ['userFields'],
@@ -31,7 +32,7 @@ export default {
},
data() {
return {
- isEnabled: this.userFields[this.config.formName],
+ isEnabled: this.userFields[this.config.formName] ? '1' : '0',
};
},
computed: {
@@ -46,36 +47,25 @@ export default {
</script>
<template>
- <div>
- <label class="label-bold">
+ <gl-form-group>
+ <template #label>
{{ config.title }}
- </label>
- <gl-link class="has-tooltip" title="More information" :href="helpLink">
- <gl-icon name="question-o" class="vertical-align-middle" />
- </gl-link>
- <div class="form-group form-check" data-testid="profile-preferences-integration-form-group">
- <!-- Necessary for Rails to receive the value when not checked -->
- <input
- :name="formName"
- type="hidden"
- value="0"
- data-testid="profile-preferences-integration-hidden-field"
- />
- <input
- :id="formId"
- v-model="isEnabled"
- type="checkbox"
- class="form-check-input"
- :name="formName"
- value="1"
- data-testid="profile-preferences-integration-checkbox"
- />
- <label class="form-check-label" :for="formId">
- {{ config.label }}
- </label>
- <gl-form-text tag="div">
+ <gl-link class="has-tooltip" title="More information" :href="helpLink">
+ <gl-icon name="question-o" class="vertical-align-middle" />
+ </gl-link>
+ </template>
+ <!-- Necessary for Rails to receive the value when not checked -->
+ <input
+ :name="formName"
+ type="hidden"
+ value="0"
+ data-testid="profile-preferences-integration-hidden-field"
+ />
+ <gl-form-checkbox :id="formId" :checked="isEnabled" :name="formName" value="1"
+ >{{ config.label }}
+ <template #help>
<integration-help-text :message="message" :message-url="messageUrl" />
- </gl-form-text>
- </div>
- </div>
+ </template>
+ </gl-form-checkbox>
+ </gl-form-group>
</template>
diff --git a/app/assets/javascripts/profile/preferences/components/profile_preferences.vue b/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
index 757a66ef148..7542f81a361 100644
--- a/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
+++ b/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
@@ -45,7 +45,7 @@ export default {
return {
isSubmitEnabled: true,
darkModeOnCreate: null,
- darkModeOnSubmit: null,
+ schemeOnCreate: null,
};
},
computed: {
@@ -61,6 +61,7 @@ export default {
this.formEl.addEventListener('ajax:success', this.handleSuccess);
this.formEl.addEventListener('ajax:error', this.handleError);
this.darkModeOnCreate = this.darkModeSelected();
+ this.schemeOnCreate = this.getSelectedScheme();
},
beforeDestroy() {
this.formEl.removeEventListener('ajax:beforeSend', this.handleLoading);
@@ -76,15 +77,19 @@ export default {
const themeId = new FormData(this.formEl).get('user[theme_id]');
return this.applicationThemes[themeId] ?? null;
},
+ getSelectedScheme() {
+ return new FormData(this.formEl).get('user[color_scheme_id]');
+ },
handleLoading() {
this.isSubmitEnabled = false;
- this.darkModeOnSubmit = this.darkModeSelected();
},
handleSuccess(customEvent) {
// Reload the page if the theme has changed from light to dark mode or vice versa
- // to correctly load all required styles.
- const modeChanged = this.darkModeOnCreate ? !this.darkModeOnSubmit : this.darkModeOnSubmit;
- if (modeChanged) {
+ // or if color scheme has changed to correctly load all required styles.
+ if (
+ this.darkModeOnCreate !== this.darkModeSelected() ||
+ this.schemeOnCreate !== this.getSelectedScheme()
+ ) {
window.location.reload();
return;
}
diff --git a/app/assets/javascripts/profile/preferences/profile_preferences_diffs_colors.js b/app/assets/javascripts/profile/preferences/profile_preferences_diffs_colors.js
new file mode 100644
index 00000000000..1b200187610
--- /dev/null
+++ b/app/assets/javascripts/profile/preferences/profile_preferences_diffs_colors.js
@@ -0,0 +1,21 @@
+import Vue from 'vue';
+import DiffsColors from './components/diffs_colors.vue';
+
+export default () => {
+ const el = document.querySelector('#js-profile-preferences-diffs-colors-app');
+
+ if (!el) return false;
+
+ const { deletion, addition } = el.dataset;
+
+ return new Vue({
+ el,
+ provide: {
+ deletion,
+ addition,
+ },
+ render(createElement) {
+ return createElement(DiffsColors);
+ },
+ });
+};
diff --git a/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue
index da14b1e8470..8511f9bdb0f 100644
--- a/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue
+++ b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue
@@ -3,11 +3,20 @@ import { GlLoadingIcon } from '@gitlab/ui';
import createFlash from '~/flash';
import { __ } from '~/locale';
import PipelineMiniGraph from '~/pipelines/components/pipelines_list/pipeline_mini_graph.vue';
+import {
+ getQueryHeaders,
+ toggleQueryPollingByVisibility,
+} from '~/pipelines/components/graph/utils';
+import { formatStages } from '../utils';
import getLinkedPipelinesQuery from '../graphql/queries/get_linked_pipelines.query.graphql';
+import getPipelineStagesQuery from '../graphql/queries/get_pipeline_stages.query.graphql';
+import { COMMIT_BOX_POLL_INTERVAL } from '../constants';
export default {
i18n: {
linkedPipelinesFetchError: __('There was a problem fetching linked pipelines.'),
+ stageConversionError: __('There was a problem handling the pipeline data.'),
+ stagesFetchError: __('There was a problem fetching the pipeline stages.'),
},
components: {
GlLoadingIcon,
@@ -22,6 +31,9 @@ export default {
iid: {
default: '',
},
+ graphqlResourceEtag: {
+ default: '',
+ },
},
props: {
stages: {
@@ -48,10 +60,31 @@ export default {
createFlash({ message: this.$options.i18n.linkedPipelinesFetchError });
},
},
+ pipelineStages: {
+ context() {
+ return getQueryHeaders(this.graphqlResourceEtag);
+ },
+ query: getPipelineStagesQuery,
+ pollInterval: COMMIT_BOX_POLL_INTERVAL,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ iid: this.iid,
+ };
+ },
+ update({ project }) {
+ return project?.pipeline?.stages?.nodes || [];
+ },
+ error() {
+ createFlash({ message: this.$options.i18n.stagesFetchError });
+ },
+ },
},
data() {
return {
+ formattedStages: [],
pipeline: null,
+ pipelineStages: [],
};
},
computed: {
@@ -65,6 +98,25 @@ export default {
return this.pipeline?.upstream;
},
},
+ watch: {
+ pipelineStages() {
+ // pipelineStages are from GraphQL
+ // stages are from REST
+ // we do this to use dropdown_path for fetching jobs on stage click
+ try {
+ this.formattedStages = formatStages(this.pipelineStages, this.stages);
+ } catch (error) {
+ createFlash({
+ message: this.$options.i18n.stageConversionError,
+ captureError: true,
+ error,
+ });
+ }
+ },
+ },
+ mounted() {
+ toggleQueryPollingByVisibility(this.$apollo.queries.pipelineStages);
+ },
};
</script>
@@ -79,7 +131,7 @@ export default {
/>
<pipeline-mini-graph
- :stages="stages"
+ :stages="formattedStages"
class="gl-display-inline"
data-testid="commit-box-mini-graph"
/>
diff --git a/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_status.vue b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_status.vue
new file mode 100644
index 00000000000..5a9d3129809
--- /dev/null
+++ b/app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_status.vue
@@ -0,0 +1,74 @@
+<script>
+import { GlLoadingIcon, GlLink } from '@gitlab/ui';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import createFlash from '~/flash';
+import {
+ getQueryHeaders,
+ toggleQueryPollingByVisibility,
+} from '~/pipelines/components/graph/utils';
+import getLatestPipelineStatusQuery from '../graphql/queries/get_latest_pipeline_status.query.graphql';
+import { COMMIT_BOX_POLL_INTERVAL, PIPELINE_STATUS_FETCH_ERROR } from '../constants';
+
+export default {
+ PIPELINE_STATUS_FETCH_ERROR,
+ components: {
+ CiIcon,
+ GlLoadingIcon,
+ GlLink,
+ },
+ inject: {
+ fullPath: {
+ default: '',
+ },
+ iid: {
+ default: '',
+ },
+ graphqlResourceEtag: {
+ default: '',
+ },
+ },
+ apollo: {
+ pipelineStatus: {
+ context() {
+ return getQueryHeaders(this.graphqlResourceEtag);
+ },
+ query: getLatestPipelineStatusQuery,
+ pollInterval: COMMIT_BOX_POLL_INTERVAL,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ iid: this.iid,
+ };
+ },
+ update({ project }) {
+ return project?.pipeline?.detailedStatus || {};
+ },
+ error() {
+ createFlash({ message: this.$options.PIPELINE_STATUS_FETCH_ERROR });
+ },
+ },
+ },
+ data() {
+ return {
+ pipelineStatus: {},
+ };
+ },
+ computed: {
+ loading() {
+ return this.$apollo.queries.pipelineStatus.loading;
+ },
+ },
+ mounted() {
+ toggleQueryPollingByVisibility(this.$apollo.queries.pipelineStatus);
+ },
+};
+</script>
+
+<template>
+ <div class="gl-display-inline-block gl-vertical-align-middle gl-mr-2">
+ <gl-loading-icon v-if="loading" />
+ <gl-link v-else :href="pipelineStatus.detailsPath">
+ <ci-icon :status="pipelineStatus" :size="24" />
+ </gl-link>
+ </div>
+</template>
diff --git a/app/assets/javascripts/projects/commit_box/info/constants.js b/app/assets/javascripts/projects/commit_box/info/constants.js
new file mode 100644
index 00000000000..be0bf715314
--- /dev/null
+++ b/app/assets/javascripts/projects/commit_box/info/constants.js
@@ -0,0 +1,7 @@
+import { __ } from '~/locale';
+
+export const COMMIT_BOX_POLL_INTERVAL = 10000;
+
+export const PIPELINE_STATUS_FETCH_ERROR = __(
+ 'There was a problem fetching the latest pipeline status.',
+);
diff --git a/app/assets/javascripts/projects/commit_box/info/graphql/queries/get_latest_pipeline_status.query.graphql b/app/assets/javascripts/projects/commit_box/info/graphql/queries/get_latest_pipeline_status.query.graphql
new file mode 100644
index 00000000000..cec96f82336
--- /dev/null
+++ b/app/assets/javascripts/projects/commit_box/info/graphql/queries/get_latest_pipeline_status.query.graphql
@@ -0,0 +1,14 @@
+query getLatestPipelineStatus($fullPath: ID!, $iid: ID!) {
+ project(fullPath: $fullPath) {
+ id
+ pipeline(iid: $iid) {
+ id
+ detailedStatus {
+ id
+ detailsPath
+ icon
+ group
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/projects/commit_box/info/graphql/queries/get_pipeline_stages.query.graphql b/app/assets/javascripts/projects/commit_box/info/graphql/queries/get_pipeline_stages.query.graphql
new file mode 100644
index 00000000000..69a29947b16
--- /dev/null
+++ b/app/assets/javascripts/projects/commit_box/info/graphql/queries/get_pipeline_stages.query.graphql
@@ -0,0 +1,19 @@
+query getPipelineStages($fullPath: ID!, $iid: ID!) {
+ project(fullPath: $fullPath) {
+ id
+ pipeline(iid: $iid) {
+ id
+ stages {
+ nodes {
+ id
+ name
+ detailedStatus {
+ id
+ icon
+ group
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/projects/commit_box/info/index.js b/app/assets/javascripts/projects/commit_box/info/index.js
index 69fe2d30489..7500c152b6a 100644
--- a/app/assets/javascripts/projects/commit_box/info/index.js
+++ b/app/assets/javascripts/projects/commit_box/info/index.js
@@ -2,6 +2,7 @@ import { fetchCommitMergeRequests } from '~/commit_merge_requests';
import { initCommitPipelineMiniGraph } from './init_commit_pipeline_mini_graph';
import { initDetailsButton } from './init_details_button';
import { loadBranches } from './load_branches';
+import initCommitPipelineStatus from './init_commit_pipeline_status';
export const initCommitBoxInfo = () => {
// Display commit related branches
@@ -14,4 +15,6 @@ export const initCommitBoxInfo = () => {
initCommitPipelineMiniGraph();
initDetailsButton();
+
+ initCommitPipelineStatus();
};
diff --git a/app/assets/javascripts/projects/commit_box/info/init_commit_pipeline_mini_graph.js b/app/assets/javascripts/projects/commit_box/info/init_commit_pipeline_mini_graph.js
index 1d4ec4c110b..c206e648561 100644
--- a/app/assets/javascripts/projects/commit_box/info/init_commit_pipeline_mini_graph.js
+++ b/app/assets/javascripts/projects/commit_box/info/init_commit_pipeline_mini_graph.js
@@ -5,7 +5,7 @@ import createDefaultClient from '~/lib/graphql';
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient({}, { useGet: true }),
});
export const initCommitPipelineMiniGraph = async (selector = '.js-commit-pipeline-mini-graph') => {
@@ -15,7 +15,7 @@ export const initCommitPipelineMiniGraph = async (selector = '.js-commit-pipelin
return;
}
- const { stages, fullPath, iid } = el.dataset;
+ const { stages, fullPath, iid, graphqlResourceEtag } = el.dataset;
// Some commits have no pipeline, code splitting to load the pipeline optionally
const { default: CommitBoxPipelineMiniGraph } = await import(
@@ -30,6 +30,7 @@ export const initCommitPipelineMiniGraph = async (selector = '.js-commit-pipelin
fullPath,
iid,
dataMethod: 'graphql',
+ graphqlResourceEtag,
},
render(createElement) {
return createElement(CommitBoxPipelineMiniGraph, {
diff --git a/app/assets/javascripts/projects/commit_box/info/init_commit_pipeline_status.js b/app/assets/javascripts/projects/commit_box/info/init_commit_pipeline_status.js
new file mode 100644
index 00000000000..d5e62531283
--- /dev/null
+++ b/app/assets/javascripts/projects/commit_box/info/init_commit_pipeline_status.js
@@ -0,0 +1,34 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+import CommitBoxPipelineStatus from './components/commit_box_pipeline_status.vue';
+
+Vue.use(VueApollo);
+
+const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient({}, { useGet: true }),
+});
+
+export default (selector = '.js-commit-pipeline-status') => {
+ const el = document.querySelector(selector);
+
+ if (!el) {
+ return;
+ }
+
+ const { fullPath, iid, graphqlResourceEtag } = el.dataset;
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el,
+ apolloProvider,
+ provide: {
+ fullPath,
+ iid,
+ graphqlResourceEtag,
+ },
+ render(createElement) {
+ return createElement(CommitBoxPipelineStatus);
+ },
+ });
+};
diff --git a/app/assets/javascripts/projects/commit_box/info/utils.js b/app/assets/javascripts/projects/commit_box/info/utils.js
new file mode 100644
index 00000000000..ea7eb35cbaf
--- /dev/null
+++ b/app/assets/javascripts/projects/commit_box/info/utils.js
@@ -0,0 +1,14 @@
+export const formatStages = (graphQLStages = [], restStages = []) => {
+ if (graphQLStages.length !== restStages.length) {
+ throw new Error('Rest stages and graphQl stages must be the same length');
+ }
+
+ return graphQLStages.map((stage, index) => {
+ return {
+ name: stage.name,
+ status: stage.detailedStatus,
+ dropdown_path: restStages[index]?.dropdown_path || '',
+ title: restStages[index].title || '',
+ };
+ });
+};
diff --git a/app/assets/javascripts/projects/components/shared/delete_button.vue b/app/assets/javascripts/projects/components/shared/delete_button.vue
index fd71a246a26..277af2f281e 100644
--- a/app/assets/javascripts/projects/components/shared/delete_button.vue
+++ b/app/assets/javascripts/projects/components/shared/delete_button.vue
@@ -104,7 +104,6 @@ export default {
<gl-modal
ref="removeModal"
:modal-id="modalId"
- size="sm"
ok-variant="danger"
footer-class="gl-bg-gray-10 gl-p-5"
title-class="gl-text-red-500"
diff --git a/app/assets/javascripts/projects/default_project_templates.js b/app/assets/javascripts/projects/default_project_templates.js
index 0393d82ca36..6708b7bd9e2 100644
--- a/app/assets/javascripts/projects/default_project_templates.js
+++ b/app/assets/javascripts/projects/default_project_templates.js
@@ -57,9 +57,9 @@ export default {
text: s__('ProjectTemplates|Pages/Hexo'),
icon: '.template-option .icon-hexo',
},
- sse_middleman: {
- text: s__('ProjectTemplates|Static Site Editor/Middleman'),
- icon: '.template-option .icon-sse_middleman',
+ middleman: {
+ text: s__('ProjectTemplates|Pages/Middleman'),
+ icon: '.template-option .icon-middleman',
},
gitpod_spring_petclinic: {
text: s__('ProjectTemplates|Gitpod/Spring Petclinic'),
diff --git a/app/assets/javascripts/projects/new/components/deployment_target_select.vue b/app/assets/javascripts/projects/new/components/deployment_target_select.vue
index f3b7e39f148..0003134f15c 100644
--- a/app/assets/javascripts/projects/new/components/deployment_target_select.vue
+++ b/app/assets/javascripts/projects/new/components/deployment_target_select.vue
@@ -1,12 +1,15 @@
<script>
-import { GlFormGroup, GlFormSelect } from '@gitlab/ui';
+import { GlFormGroup, GlFormSelect, GlFormText, GlSprintf, GlLink } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
import { s__ } from '~/locale';
import Tracking from '~/tracking';
import {
DEPLOYMENT_TARGET_SELECTIONS,
DEPLOYMENT_TARGET_LABEL,
DEPLOYMENT_TARGET_EVENT,
+ VISIT_DOCS_EVENT,
NEW_PROJECT_FORM,
+ K8S_OPTION,
} from '../constants';
const trackingMixin = Tracking.mixin({ label: DEPLOYMENT_TARGET_LABEL });
@@ -15,12 +18,21 @@ export default {
i18n: {
deploymentTargetLabel: s__('Deployment Target|Project deployment target (optional)'),
defaultOption: s__('Deployment Target|Select the deployment target'),
+ k8sEducationText: s__(
+ 'Deployment Target|%{linkStart}How to provision or deploy to Kubernetes clusters from GitLab?%{linkEnd}',
+ ),
},
deploymentTargets: DEPLOYMENT_TARGET_SELECTIONS,
+ VISIT_DOCS_EVENT,
+ DEPLOYMENT_TARGET_LABEL,
selectId: 'deployment-target-select',
+ helpPageUrl: helpPagePath('user/clusters/agent/index'),
components: {
GlFormGroup,
GlFormSelect,
+ GlFormText,
+ GlSprintf,
+ GlLink,
},
mixins: [trackingMixin],
data() {
@@ -29,6 +41,11 @@ export default {
formSubmitted: false,
};
},
+ computed: {
+ isK8sOptionSelected() {
+ return this.selectedTarget === K8S_OPTION;
+ },
+ },
mounted() {
const form = document.getElementById(NEW_PROJECT_FORM);
form.addEventListener('submit', () => {
@@ -52,10 +69,24 @@ export default {
:id="$options.selectId"
v-model="selectedTarget"
:options="$options.deploymentTargets"
+ class="input-lg"
>
<template #first>
<option :value="null" disabled>{{ $options.i18n.defaultOption }}</option>
</template>
</gl-form-select>
+
+ <gl-form-text v-if="isK8sOptionSelected">
+ <gl-sprintf :message="$options.i18n.k8sEducationText">
+ <template #link="{ content }">
+ <gl-link
+ :href="$options.helpPageUrl"
+ :data-track-action="$options.VISIT_DOCS_EVENT"
+ :data-track-label="$options.DEPLOYMENT_TARGET_LABEL"
+ >{{ content }}</gl-link
+ >
+ </template>
+ </gl-sprintf>
+ </gl-form-text>
</gl-form-group>
</template>
diff --git a/app/assets/javascripts/projects/new/components/new_project_url_select.vue b/app/assets/javascripts/projects/new/components/new_project_url_select.vue
index f4a21c6057c..506f1ec5ffd 100644
--- a/app/assets/javascripts/projects/new/components/new_project_url_select.vue
+++ b/app/assets/javascripts/projects/new/components/new_project_url_select.vue
@@ -13,6 +13,7 @@ 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 { s__ } from '~/locale';
import searchNamespacesWhereUserCanCreateProjectsQuery from '../queries/search_namespaces_where_user_can_create_projects.query.graphql';
import eventHub from '../event_hub';
@@ -43,14 +44,7 @@ export default {
debounce: DEBOUNCE_DELAY,
},
},
- inject: [
- 'namespaceFullPath',
- 'namespaceId',
- 'rootUrl',
- 'trackLabel',
- 'userNamespaceFullPath',
- 'userNamespaceId',
- ],
+ inject: ['namespaceFullPath', 'namespaceId', 'rootUrl', 'trackLabel', 'userNamespaceId'],
data() {
return {
currentUser: {},
@@ -62,10 +56,11 @@ export default {
fullPath: this.namespaceFullPath,
}
: {
- id: this.userNamespaceId,
- fullPath: this.userNamespaceFullPath,
+ id: undefined,
+ fullPath: s__('ProjectsNew|Pick a group or namespace'),
},
shouldSkipQuery: true,
+ userNamespaceId: this.userNamespaceId,
};
},
computed: {
@@ -92,6 +87,9 @@ export default {
hasNoMatches() {
return !this.hasGroupMatches && !this.hasNamespaceMatches;
},
+ dropdownPlaceholderClass() {
+ return this.selectedNamespace.id ? '' : 'gl-text-gray-500!';
+ },
},
created() {
eventHub.$on('select-template', this.handleSelectTemplate);
@@ -130,11 +128,18 @@ export default {
</script>
<template>
- <gl-button-group class="input-lg">
- <gl-button class="gl-text-truncate" label :title="rootUrl">{{ rootUrl }}</gl-button>
+ <gl-button-group class="gl-w-full">
+ <gl-button
+ class="js-group-namespace-button gl-text-truncate gl-flex-grow-0!"
+ 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"
+ class="js-group-namespace-dropdown gl-flex-grow-1"
+ :toggle-class="`gl-rounded-top-right-base! gl-rounded-bottom-right-base! gl-w-20 ${dropdownPlaceholderClass}`"
data-qa-selector="select_namespace_dropdown"
@show="track('activate_form_input', { label: trackLabel, property: 'project_path' })"
@shown="handleDropdownShown"
@@ -166,11 +171,13 @@ export default {
</template>
</gl-dropdown>
+ <input type="hidden" name="project[selected_namespace_id]" :value="selectedNamespace.id" />
+
<input
id="project_namespace_id"
type="hidden"
name="project[namespace_id]"
- :value="selectedNamespace.id"
+ :value="selectedNamespace.id || userNamespaceId"
/>
</gl-button-group>
</template>
diff --git a/app/assets/javascripts/projects/new/constants.js b/app/assets/javascripts/projects/new/constants.js
index c5e6722981b..e52a84dc07e 100644
--- a/app/assets/javascripts/projects/new/constants.js
+++ b/app/assets/javascripts/projects/new/constants.js
@@ -1,7 +1,9 @@
import { s__ } from '~/locale';
+export const K8S_OPTION = s__('DeploymentTarget|Kubernetes (GKE, EKS, OpenShift, and so on)');
+
export const DEPLOYMENT_TARGET_SELECTIONS = [
- s__('DeploymentTarget|Kubernetes (GKE, EKS, OpenShift, and so on)'),
+ K8S_OPTION,
s__('DeploymentTarget|Managed container runtime (Fargate, Cloud Run, DigitalOcean App)'),
s__('DeploymentTarget|Self-managed container runtime (Podman, Docker Swarm, Docker Compose)'),
s__('DeploymentTarget|Heroku'),
@@ -18,3 +20,4 @@ export const DEPLOYMENT_TARGET_SELECTIONS = [
export const NEW_PROJECT_FORM = 'new_project';
export const DEPLOYMENT_TARGET_LABEL = 'new_project_deployment_target';
export const DEPLOYMENT_TARGET_EVENT = 'select_deployment_target';
+export const VISIT_DOCS_EVENT = 'visit_docs';
diff --git a/app/assets/javascripts/projects/new/index.js b/app/assets/javascripts/projects/new/index.js
index 4de9b8a6f47..a72172a4f5e 100644
--- a/app/assets/javascripts/projects/new/index.js
+++ b/app/assets/javascripts/projects/new/index.js
@@ -58,7 +58,6 @@ export function initNewProjectUrlSelect() {
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/projects/project_new.js b/app/assets/javascripts/projects/project_new.js
index f1b7e3df7d6..3e1c471f015 100644
--- a/app/assets/javascripts/projects/project_new.js
+++ b/app/assets/javascripts/projects/project_new.js
@@ -3,6 +3,7 @@ import { debounce } from 'lodash';
import DEFAULT_PROJECT_TEMPLATES from 'ee_else_ce/projects/default_project_templates';
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '../lib/utils/constants';
+import { ENTER_KEY } from '../lib/utils/keys';
import axios from '../lib/utils/axios_utils';
import {
convertToTitleCase,
@@ -14,6 +15,7 @@ import {
let hasUserDefinedProjectPath = false;
let hasUserDefinedProjectName = false;
const invalidInputClass = 'gl-field-error-outline';
+const invalidDropdownClass = 'gl-inset-border-1-red-400!';
const cancelSource = axios.CancelToken.source();
const endpoint = `${gon.relative_url_root}/import/url/validate`;
@@ -50,6 +52,25 @@ const onProjectPathChange = ($projectNameInput, $projectPathInput, hasExistingPr
}
};
+const selectedNamespaceId = () => document.querySelector('[name="project[selected_namespace_id]"]');
+const dropdownButton = () => document.querySelector('.js-group-namespace-dropdown > button');
+const namespaceButton = () => document.querySelector('.js-group-namespace-button');
+const namespaceError = () => document.querySelector('.js-group-namespace-error');
+
+const validateGroupNamespaceDropdown = (e) => {
+ if (selectedNamespaceId() && !selectedNamespaceId().attributes.value) {
+ document.querySelector('input[data-qa-selector="project_name"]').reportValidity();
+ e.preventDefault();
+ dropdownButton().classList.add(invalidDropdownClass);
+ namespaceButton().classList.add(invalidDropdownClass);
+ namespaceError().classList.remove('gl-display-none');
+ } else {
+ dropdownButton().classList.remove(invalidDropdownClass);
+ namespaceButton().classList.remove(invalidDropdownClass);
+ namespaceError().classList.add('gl-display-none');
+ }
+};
+
const setProjectNamePathHandlers = ($projectNameInput, $projectPathInput) => {
const specialRepo = document.querySelector('.js-user-readme-repo');
@@ -70,6 +91,10 @@ const setProjectNamePathHandlers = ($projectNameInput, $projectPathInput) => {
$projectPathInput.val() !== $projectPathInput.data('username'),
);
});
+
+ document.querySelector('.js-create-project-button').addEventListener('click', (e) => {
+ validateGroupNamespaceDropdown(e);
+ });
};
const deriveProjectPathFromUrl = ($projectImportUrl) => {
@@ -158,7 +183,11 @@ const bindEvents = () => {
$projectTemplateButtons.addClass('hidden');
$projectFieldsForm.addClass('selected');
$selectedIcon.empty();
- const value = $(this).val();
+
+ const $selectedTemplate = $(this);
+ $selectedTemplate.prop('checked', true);
+
+ const value = $selectedTemplate.val();
const selectedTemplate = DEFAULT_PROJECT_TEMPLATES[value];
$selectedTemplateText.text(selectedTemplate.text);
@@ -170,7 +199,21 @@ const bindEvents = () => {
setProjectNamePathHandlers($activeTabProjectName, $activeTabProjectPath);
}
- $useTemplateBtn.on('change', chooseTemplate);
+ function toggleActiveClassOnLabel(event) {
+ const $label = $(event.target).parent();
+ $label.toggleClass('active');
+ }
+
+ function chooseTemplateOnEnter(event) {
+ if (event.code === ENTER_KEY) {
+ chooseTemplate.call(this);
+ }
+ }
+
+ $useTemplateBtn.on('click', chooseTemplate);
+
+ $useTemplateBtn.on('focus focusout', toggleActiveClassOnLabel);
+ $useTemplateBtn.on('keypress', chooseTemplateOnEnter);
$changeTemplateBtn.on('click', () => {
$projectTemplateButtons.removeClass('hidden');
diff --git a/app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue b/app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue
index e8b0e95b142..d4c97cbf038 100644
--- a/app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue
+++ b/app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue
@@ -1,6 +1,7 @@
<script>
import { GlTokenSelector, GlAvatarLabeled } from '@gitlab/ui';
import { s__ } from '~/locale';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
import searchProjectTopics from '../queries/project_topics_search.query.graphql';
export default {
@@ -65,6 +66,7 @@ export default {
this.$emit('update', tokens);
},
},
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
<template>
@@ -85,7 +87,7 @@ export default {
:entity-name="dropdownItem.name"
:label="dropdownItem.name"
:size="32"
- shape="rect"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
/>
</template>
</gl-token-selector>
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 174049b15fe..9ed895e90fb 100644
--- a/app/assets/javascripts/related_issues/components/related_issues_list.vue
+++ b/app/assets/javascripts/related_issues/components/related_issues_list.vue
@@ -1,8 +1,8 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
import Sortable from 'sortablejs';
-import sortableConfig from '~/sortable/sortable_config';
import RelatedIssuableItem from '~/issuable/components/related_issuable_item.vue';
+import { defaultSortableOptions } from '~/sortable/constants';
export default {
name: 'RelatedIssuesList',
@@ -53,7 +53,7 @@ export default {
mounted() {
if (this.canReorder) {
this.sortable = Sortable.create(this.$refs.list, {
- ...sortableConfig,
+ ...defaultSortableOptions,
onStart: this.addDraggingCursor,
onEnd: this.reordered,
});
diff --git a/app/assets/javascripts/releases/components/app_edit_new.vue b/app/assets/javascripts/releases/components/app_edit_new.vue
index 39140216bc5..8365e6a5ab0 100644
--- a/app/assets/javascripts/releases/components/app_edit_new.vue
+++ b/app/assets/javascripts/releases/components/app_edit_new.vue
@@ -185,7 +185,7 @@ export default {
<gl-button
class="mr-auto js-no-auto-disable"
category="primary"
- variant="success"
+ variant="confirm"
type="submit"
:disabled="isFormSubmissionDisabled"
data-testid="submit-button"
diff --git a/app/assets/javascripts/releases/components/app_index.vue b/app/assets/javascripts/releases/components/app_index.vue
index e53bfea7389..59fa2fca736 100644
--- a/app/assets/javascripts/releases/components/app_index.vue
+++ b/app/assets/javascripts/releases/components/app_index.vue
@@ -1,67 +1,237 @@
<script>
-import { GlEmptyState, GlLink, GlButton } from '@gitlab/ui';
-import { mapState, mapActions } from 'vuex';
-import { getParameterByName } from '~/lib/utils/url_utility';
+import { GlButton } from '@gitlab/ui';
+import createFlash from '~/flash';
+import { historyPushState } from '~/lib/utils/common_utils';
+import { scrollUp } from '~/lib/utils/scroll_utils';
+import { setUrlParams, getParameterByName } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
+import { PAGE_SIZE, DEFAULT_SORT } from '~/releases/constants';
+import { convertAllReleasesGraphQLResponse } from '~/releases/util';
+import allReleasesQuery from '../graphql/queries/all_releases.query.graphql';
import ReleaseBlock from './release_block.vue';
import ReleaseSkeletonLoader from './release_skeleton_loader.vue';
+import ReleasesEmptyState from './releases_empty_state.vue';
import ReleasesPagination from './releases_pagination.vue';
import ReleasesSort from './releases_sort.vue';
export default {
- name: 'ReleasesApp',
+ name: 'ReleasesIndexApp',
components: {
- GlEmptyState,
- GlLink,
GlButton,
ReleaseBlock,
- ReleasesPagination,
ReleaseSkeletonLoader,
+ ReleasesEmptyState,
+ ReleasesPagination,
ReleasesSort,
},
+ inject: {
+ projectPath: {
+ default: '',
+ },
+ newReleasePath: {
+ default: '',
+ },
+ },
+ apollo: {
+ /**
+ * The same query as `fullGraphqlResponse`, except that it limits its
+ * results to a single item. This causes this request to complete much more
+ * quickly than `fullGraphqlResponse`, which allows the page to show
+ * meaningful content to the user much earlier.
+ */
+ singleGraphqlResponse: {
+ query: allReleasesQuery,
+ // This trick only works when paginating _forward_.
+ // When paginating backwards, limiting the query to a single item loads
+ // the _last_ item in the page, which is not useful for our purposes.
+ skip() {
+ return !this.includeSingleQuery;
+ },
+ variables() {
+ return {
+ ...this.queryVariables,
+ first: 1,
+ };
+ },
+ update(data) {
+ return { data };
+ },
+ error() {
+ this.singleRequestError = true;
+ },
+ },
+ fullGraphqlResponse: {
+ query: allReleasesQuery,
+ variables() {
+ return this.queryVariables;
+ },
+ update(data) {
+ return { data };
+ },
+ error(error) {
+ this.fullRequestError = true;
+
+ createFlash({
+ message: this.$options.i18n.errorMessage,
+ captureError: true,
+ error,
+ });
+ },
+ },
+ },
+ data() {
+ return {
+ singleRequestError: false,
+ fullRequestError: false,
+ cursors: {
+ before: getParameterByName('before'),
+ after: getParameterByName('after'),
+ },
+ sort: DEFAULT_SORT,
+ };
+ },
computed: {
- ...mapState('index', [
- 'documentationPath',
- 'illustrationPath',
- 'newReleasePath',
- 'isLoading',
- 'releases',
- 'hasError',
- ]),
- shouldRenderEmptyState() {
- return !this.releases.length && !this.hasError && !this.isLoading;
+ queryVariables() {
+ let paginationParams = { first: PAGE_SIZE };
+ if (this.cursors.after) {
+ paginationParams = {
+ after: this.cursors.after,
+ first: PAGE_SIZE,
+ };
+ } else if (this.cursors.before) {
+ paginationParams = {
+ before: this.cursors.before,
+ last: PAGE_SIZE,
+ };
+ }
+
+ return {
+ fullPath: this.projectPath,
+ ...paginationParams,
+ sort: this.sort,
+ };
+ },
+ /**
+ * @returns {Boolean} Whether or not to request/include
+ * the results of the single-item query
+ */
+ includeSingleQuery() {
+ return Boolean(!this.cursors.before || this.cursors.after);
+ },
+ isSingleRequestLoading() {
+ return this.$apollo.queries.singleGraphqlResponse.loading;
},
- shouldRenderSuccessState() {
- return this.releases.length && !this.isLoading && !this.hasError;
+ isFullRequestLoading() {
+ return this.$apollo.queries.fullGraphqlResponse.loading;
+ },
+ /**
+ * @returns {Boolean} `true` if the `singleGraphqlResponse`
+ * query has finished loading without errors
+ */
+ isSingleRequestLoaded() {
+ return Boolean(!this.isSingleRequestLoading && this.singleGraphqlResponse?.data.project);
+ },
+ /**
+ * @returns {Boolean} `true` if the `fullGraphqlResponse`
+ * query has finished loading without errors
+ */
+ isFullRequestLoaded() {
+ return Boolean(!this.isFullRequestLoading && this.fullGraphqlResponse?.data.project);
+ },
+ releases() {
+ if (this.isFullRequestLoaded) {
+ return convertAllReleasesGraphQLResponse(this.fullGraphqlResponse).data;
+ }
+
+ if (this.isSingleRequestLoaded && this.includeSingleQuery) {
+ return convertAllReleasesGraphQLResponse(this.singleGraphqlResponse).data;
+ }
+
+ return [];
},
- emptyStateText() {
- return __(
- "Releases are based on Git tags and mark specific points in a project's development history. They can contain information about the type of changes and can also deliver binaries, like compiled versions of your software.",
+ pageInfo() {
+ if (!this.isFullRequestLoaded) {
+ return {
+ hasPreviousPage: false,
+ hasNextPage: false,
+ };
+ }
+
+ return this.fullGraphqlResponse.data.project.releases.pageInfo;
+ },
+ shouldRenderEmptyState() {
+ return this.isFullRequestLoaded && this.releases.length === 0;
+ },
+ shouldRenderLoadingIndicator() {
+ return (
+ (this.isSingleRequestLoading && !this.singleRequestError && !this.isFullRequestLoaded) ||
+ (this.isFullRequestLoading && !this.fullRequestError)
);
},
+ shouldRenderPagination() {
+ return this.isFullRequestLoaded && !this.shouldRenderEmptyState;
+ },
},
created() {
- this.fetchReleases();
+ this.updateQueryParamsFromUrl();
- window.addEventListener('popstate', this.fetchReleases);
+ window.addEventListener('popstate', this.updateQueryParamsFromUrl);
+ },
+ destroyed() {
+ window.removeEventListener('popstate', this.updateQueryParamsFromUrl);
},
methods: {
- ...mapActions('index', {
- fetchReleasesStoreAction: 'fetchReleases',
- }),
- fetchReleases() {
- this.fetchReleasesStoreAction({
- before: getParameterByName('before'),
- after: getParameterByName('after'),
- });
+ getReleaseKey(release, index) {
+ return [release.tagName, release.name, index].join('|');
+ },
+ updateQueryParamsFromUrl() {
+ this.cursors.before = getParameterByName('before');
+ this.cursors.after = getParameterByName('after');
+ },
+ onPaginationButtonPress() {
+ this.updateQueryParamsFromUrl();
+
+ // In some cases, Apollo Client is able to pull its results from the cache instead of making
+ // a new network request. In these cases, the page's content gets swapped out immediately without
+ // changing the page's scroll, leaving the user looking at the bottom of the new page.
+ // To make the experience consistent, regardless of how the data is sourced, we manually
+ // scroll to the top of the page every time a pagination button is pressed.
+ scrollUp();
+ },
+ onSortChanged(newSort) {
+ if (this.sort === newSort) {
+ return;
+ }
+
+ // Remove the "before" and "after" query parameters from the URL,
+ // effectively placing the user back on page 1 of the results.
+ // This prevents the frontend from requesting the results sorted
+ // by one field (e.g. `released_at`) while using a pagination cursor
+ // intended for a different field (e.g.) `created_at`).
+ // For more details, see the MR that introduced this change:
+ // https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63434
+ historyPushState(
+ setUrlParams({
+ before: null,
+ after: null,
+ }),
+ );
+
+ this.updateQueryParamsFromUrl();
+
+ this.sort = newSort;
},
},
+ i18n: {
+ newRelease: __('New release'),
+ errorMessage: __('An error occurred while fetching the releases. Please try again.'),
+ },
};
</script>
<template>
<div class="flex flex-column mt-2">
<div class="gl-align-self-end gl-mb-3">
- <releases-sort class="gl-mr-2" @sort:changed="fetchReleases" />
+ <releases-sort :value="sort" class="gl-mr-2" @input="onSortChanged" />
<gl-button
v-if="newReleasePath"
@@ -69,44 +239,27 @@ export default {
:aria-describedby="shouldRenderEmptyState && 'releases-description'"
category="primary"
variant="confirm"
- data-testid="new-release-button"
+ >{{ $options.i18n.newRelease }}</gl-button
>
- {{ __('New release') }}
- </gl-button>
</div>
- <release-skeleton-loader v-if="isLoading" />
-
- <gl-empty-state
- v-else-if="shouldRenderEmptyState"
- data-testid="empty-state"
- :title="__('Getting started with releases')"
- :svg-path="illustrationPath"
- >
- <template #description>
- <span id="releases-description">
- {{ emptyStateText }}
- <gl-link
- :href="documentationPath"
- :aria-label="__('Releases documentation')"
- target="_blank"
- >
- {{ __('More information') }}
- </gl-link>
- </span>
- </template>
- </gl-empty-state>
-
- <div v-else-if="shouldRenderSuccessState" data-testid="success-state">
- <release-block
- v-for="(release, index) in releases"
- :key="index"
- :release="release"
- :class="{ 'linked-card': releases.length > 1 && index !== releases.length - 1 }"
- />
- </div>
+ <releases-empty-state v-if="shouldRenderEmptyState" />
+
+ <release-block
+ v-for="(release, index) in releases"
+ :key="getReleaseKey(release, index)"
+ :release="release"
+ :class="{ 'linked-card': releases.length > 1 && index !== releases.length - 1 }"
+ />
+
+ <release-skeleton-loader v-if="shouldRenderLoadingIndicator" />
- <releases-pagination v-if="!isLoading" />
+ <releases-pagination
+ v-if="shouldRenderPagination"
+ :page-info="pageInfo"
+ @prev="onPaginationButtonPress"
+ @next="onPaginationButtonPress"
+ />
</div>
</template>
<style>
diff --git a/app/assets/javascripts/releases/components/app_index_apollo_client.vue b/app/assets/javascripts/releases/components/app_index_apollo_client.vue
deleted file mode 100644
index f49c44a399f..00000000000
--- a/app/assets/javascripts/releases/components/app_index_apollo_client.vue
+++ /dev/null
@@ -1,275 +0,0 @@
-<script>
-import { GlButton } from '@gitlab/ui';
-import allReleasesQuery from 'shared_queries/releases/all_releases.query.graphql';
-import createFlash from '~/flash';
-import { historyPushState } from '~/lib/utils/common_utils';
-import { scrollUp } from '~/lib/utils/scroll_utils';
-import { setUrlParams, getParameterByName } from '~/lib/utils/url_utility';
-import { __ } from '~/locale';
-import { PAGE_SIZE, DEFAULT_SORT } from '~/releases/constants';
-import { convertAllReleasesGraphQLResponse } from '~/releases/util';
-import ReleaseBlock from './release_block.vue';
-import ReleaseSkeletonLoader from './release_skeleton_loader.vue';
-import ReleasesEmptyState from './releases_empty_state.vue';
-import ReleasesPaginationApolloClient from './releases_pagination_apollo_client.vue';
-import ReleasesSortApolloClient from './releases_sort_apollo_client.vue';
-
-export default {
- name: 'ReleasesIndexApolloClientApp',
- components: {
- GlButton,
- ReleaseBlock,
- ReleaseSkeletonLoader,
- ReleasesEmptyState,
- ReleasesPaginationApolloClient,
- ReleasesSortApolloClient,
- },
- inject: {
- projectPath: {
- default: '',
- },
- newReleasePath: {
- default: '',
- },
- },
- apollo: {
- /**
- * The same query as `fullGraphqlResponse`, except that it limits its
- * results to a single item. This causes this request to complete much more
- * quickly than `fullGraphqlResponse`, which allows the page to show
- * meaningful content to the user much earlier.
- */
- singleGraphqlResponse: {
- query: allReleasesQuery,
- // This trick only works when paginating _forward_.
- // When paginating backwards, limiting the query to a single item loads
- // the _last_ item in the page, which is not useful for our purposes.
- skip() {
- return !this.includeSingleQuery;
- },
- variables() {
- return {
- ...this.queryVariables,
- first: 1,
- };
- },
- update(data) {
- return { data };
- },
- error() {
- this.singleRequestError = true;
- },
- },
- fullGraphqlResponse: {
- query: allReleasesQuery,
- variables() {
- return this.queryVariables;
- },
- update(data) {
- return { data };
- },
- error(error) {
- this.fullRequestError = true;
-
- createFlash({
- message: this.$options.i18n.errorMessage,
- captureError: true,
- error,
- });
- },
- },
- },
- data() {
- return {
- singleRequestError: false,
- fullRequestError: false,
- cursors: {
- before: getParameterByName('before'),
- after: getParameterByName('after'),
- },
- sort: DEFAULT_SORT,
- };
- },
- computed: {
- queryVariables() {
- let paginationParams = { first: PAGE_SIZE };
- if (this.cursors.after) {
- paginationParams = {
- after: this.cursors.after,
- first: PAGE_SIZE,
- };
- } else if (this.cursors.before) {
- paginationParams = {
- before: this.cursors.before,
- last: PAGE_SIZE,
- };
- }
-
- return {
- fullPath: this.projectPath,
- ...paginationParams,
- sort: this.sort,
- };
- },
- /**
- * @returns {Boolean} Whether or not to request/include
- * the results of the single-item query
- */
- includeSingleQuery() {
- return Boolean(!this.cursors.before || this.cursors.after);
- },
- isSingleRequestLoading() {
- return this.$apollo.queries.singleGraphqlResponse.loading;
- },
- isFullRequestLoading() {
- return this.$apollo.queries.fullGraphqlResponse.loading;
- },
- /**
- * @returns {Boolean} `true` if the `singleGraphqlResponse`
- * query has finished loading without errors
- */
- isSingleRequestLoaded() {
- return Boolean(!this.isSingleRequestLoading && this.singleGraphqlResponse?.data.project);
- },
- /**
- * @returns {Boolean} `true` if the `fullGraphqlResponse`
- * query has finished loading without errors
- */
- isFullRequestLoaded() {
- return Boolean(!this.isFullRequestLoading && this.fullGraphqlResponse?.data.project);
- },
- releases() {
- if (this.isFullRequestLoaded) {
- return convertAllReleasesGraphQLResponse(this.fullGraphqlResponse).data;
- }
-
- if (this.isSingleRequestLoaded && this.includeSingleQuery) {
- return convertAllReleasesGraphQLResponse(this.singleGraphqlResponse).data;
- }
-
- return [];
- },
- pageInfo() {
- if (!this.isFullRequestLoaded) {
- return {
- hasPreviousPage: false,
- hasNextPage: false,
- };
- }
-
- return this.fullGraphqlResponse.data.project.releases.pageInfo;
- },
- shouldRenderEmptyState() {
- return this.isFullRequestLoaded && this.releases.length === 0;
- },
- shouldRenderLoadingIndicator() {
- return (
- (this.isSingleRequestLoading && !this.singleRequestError && !this.isFullRequestLoaded) ||
- (this.isFullRequestLoading && !this.fullRequestError)
- );
- },
- shouldRenderPagination() {
- return this.isFullRequestLoaded && !this.shouldRenderEmptyState;
- },
- },
- created() {
- this.updateQueryParamsFromUrl();
-
- window.addEventListener('popstate', this.updateQueryParamsFromUrl);
- },
- destroyed() {
- window.removeEventListener('popstate', this.updateQueryParamsFromUrl);
- },
- methods: {
- getReleaseKey(release, index) {
- return [release.tagName, release.name, index].join('|');
- },
- updateQueryParamsFromUrl() {
- this.cursors.before = getParameterByName('before');
- this.cursors.after = getParameterByName('after');
- },
- onPaginationButtonPress() {
- this.updateQueryParamsFromUrl();
-
- // In some cases, Apollo Client is able to pull its results from the cache instead of making
- // a new network request. In these cases, the page's content gets swapped out immediately without
- // changing the page's scroll, leaving the user looking at the bottom of the new page.
- // To make the experience consistent, regardless of how the data is sourced, we manually
- // scroll to the top of the page every time a pagination button is pressed.
- scrollUp();
- },
- onSortChanged(newSort) {
- if (this.sort === newSort) {
- return;
- }
-
- // Remove the "before" and "after" query parameters from the URL,
- // effectively placing the user back on page 1 of the results.
- // This prevents the frontend from requesting the results sorted
- // by one field (e.g. `released_at`) while using a pagination cursor
- // intended for a different field (e.g.) `created_at`).
- // For more details, see the MR that introduced this change:
- // https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63434
- historyPushState(
- setUrlParams({
- before: null,
- after: null,
- }),
- );
-
- this.updateQueryParamsFromUrl();
-
- this.sort = newSort;
- },
- },
- i18n: {
- newRelease: __('New release'),
- errorMessage: __('An error occurred while fetching the releases. Please try again.'),
- },
-};
-</script>
-<template>
- <div class="flex flex-column mt-2">
- <div class="gl-align-self-end gl-mb-3">
- <releases-sort-apollo-client :value="sort" class="gl-mr-2" @input="onSortChanged" />
-
- <gl-button
- v-if="newReleasePath"
- :href="newReleasePath"
- :aria-describedby="shouldRenderEmptyState && 'releases-description'"
- category="primary"
- variant="success"
- >{{ $options.i18n.newRelease }}</gl-button
- >
- </div>
-
- <releases-empty-state v-if="shouldRenderEmptyState" />
-
- <release-block
- v-for="(release, index) in releases"
- :key="getReleaseKey(release, index)"
- :release="release"
- :class="{ 'linked-card': releases.length > 1 && index !== releases.length - 1 }"
- />
-
- <release-skeleton-loader v-if="shouldRenderLoadingIndicator" />
-
- <releases-pagination-apollo-client
- v-if="shouldRenderPagination"
- :page-info="pageInfo"
- @prev="onPaginationButtonPress"
- @next="onPaginationButtonPress"
- />
- </div>
-</template>
-<style>
-.linked-card::after {
- width: 1px;
- content: ' ';
- border: 1px solid #e5e5e5;
- height: 17px;
- top: 100%;
- position: absolute;
- left: 32px;
-}
-</style>
diff --git a/app/assets/javascripts/releases/components/release_block_footer.vue b/app/assets/javascripts/releases/components/release_block_footer.vue
index cb795b3cba7..91d6d0911a4 100644
--- a/app/assets/javascripts/releases/components/release_block_footer.vue
+++ b/app/assets/javascripts/releases/components/release_block_footer.vue
@@ -104,9 +104,11 @@ export default {
<div v-if="author" class="d-flex">
<span class="text-secondary">{{ __('by') }}&nbsp;</span>
<user-avatar-link
+ class="gl-my-n1"
:link-href="author.webUrl"
:img-src="author.avatarUrl"
:img-alt="userImageAltDescription"
+ :img-size="24"
:tooltip-text="author.username"
tooltip-placement="bottom"
/>
diff --git a/app/assets/javascripts/releases/components/releases_pagination.vue b/app/assets/javascripts/releases/components/releases_pagination.vue
index fddf85ead1e..52ad991d61a 100644
--- a/app/assets/javascripts/releases/components/releases_pagination.vue
+++ b/app/assets/javascripts/releases/components/releases_pagination.vue
@@ -1,26 +1,24 @@
<script>
import { GlKeysetPagination } from '@gitlab/ui';
-import { mapActions, mapState } from 'vuex';
+import { isBoolean } from 'lodash';
import { historyPushState, buildUrlWithCurrentLocation } from '~/lib/utils/common_utils';
export default {
- name: 'ReleasesPaginationGraphql',
+ name: 'ReleasesPagination',
components: { GlKeysetPagination },
- computed: {
- ...mapState('index', ['pageInfo']),
- showPagination() {
- return this.pageInfo.hasPreviousPage || this.pageInfo.hasNextPage;
+ props: {
+ pageInfo: {
+ type: Object,
+ required: true,
+ validator: (info) => isBoolean(info.hasPreviousPage) && isBoolean(info.hasNextPage),
},
},
methods: {
- ...mapActions('index', ['fetchReleases']),
onPrev(before) {
historyPushState(buildUrlWithCurrentLocation(`?before=${before}`));
- this.fetchReleases({ before });
},
onNext(after) {
historyPushState(buildUrlWithCurrentLocation(`?after=${after}`));
- this.fetchReleases({ after });
},
},
};
@@ -28,8 +26,10 @@ export default {
<template>
<div class="gl-display-flex gl-justify-content-center">
<gl-keyset-pagination
- v-if="showPagination"
v-bind="pageInfo"
+ :prev-text="__('Prev')"
+ :next-text="__('Next')"
+ v-on="$listeners"
@prev="onPrev($event)"
@next="onNext($event)"
/>
diff --git a/app/assets/javascripts/releases/components/releases_pagination_apollo_client.vue b/app/assets/javascripts/releases/components/releases_pagination_apollo_client.vue
deleted file mode 100644
index 73339677a4b..00000000000
--- a/app/assets/javascripts/releases/components/releases_pagination_apollo_client.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-<script>
-import { GlKeysetPagination } from '@gitlab/ui';
-import { isBoolean } from 'lodash';
-import { historyPushState, buildUrlWithCurrentLocation } from '~/lib/utils/common_utils';
-
-export default {
- name: 'ReleasesPaginationApolloClient',
- components: { GlKeysetPagination },
- props: {
- pageInfo: {
- type: Object,
- required: true,
- validator: (info) => isBoolean(info.hasPreviousPage) && isBoolean(info.hasNextPage),
- },
- },
- methods: {
- onPrev(before) {
- historyPushState(buildUrlWithCurrentLocation(`?before=${before}`));
- },
- onNext(after) {
- historyPushState(buildUrlWithCurrentLocation(`?after=${after}`));
- },
- },
-};
-</script>
-<template>
- <div class="gl-display-flex gl-justify-content-center">
- <gl-keyset-pagination
- v-bind="pageInfo"
- :prev-text="__('Prev')"
- :next-text="__('Next')"
- v-on="$listeners"
- @prev="onPrev($event)"
- @next="onNext($event)"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/releases/components/releases_sort.vue b/app/assets/javascripts/releases/components/releases_sort.vue
index d4210dad19c..0f14b579da0 100644
--- a/app/assets/javascripts/releases/components/releases_sort.vue
+++ b/app/assets/javascripts/releases/components/releases_sort.vue
@@ -1,7 +1,17 @@
<script>
import { GlSorting, GlSortingItem } from '@gitlab/ui';
-import { mapState, mapActions } from 'vuex';
-import { ASCENDING_ORDER, DESCENDING_ORDER, SORT_OPTIONS } from '../constants';
+import {
+ ASCENDING_ORDER,
+ DESCENDING_ORDER,
+ SORT_OPTIONS,
+ RELEASED_AT,
+ CREATED_AT,
+ RELEASED_AT_ASC,
+ RELEASED_AT_DESC,
+ CREATED_ASC,
+ ALL_SORTS,
+ SORT_MAP,
+} from '../constants';
export default {
name: 'ReleasesSort',
@@ -9,35 +19,54 @@ export default {
GlSorting,
GlSortingItem,
},
+ props: {
+ value: {
+ type: String,
+ required: true,
+ validator: (sort) => ALL_SORTS.includes(sort),
+ },
+ },
computed: {
- ...mapState('index', {
- orderBy: (state) => state.sorting.orderBy,
- sort: (state) => state.sorting.sort,
- }),
+ orderBy() {
+ if (this.value === RELEASED_AT_ASC || this.value === RELEASED_AT_DESC) {
+ return RELEASED_AT;
+ }
+
+ return CREATED_AT;
+ },
+ direction() {
+ if (this.value === RELEASED_AT_ASC || this.value === CREATED_ASC) {
+ return ASCENDING_ORDER;
+ }
+
+ return DESCENDING_ORDER;
+ },
sortOptions() {
return SORT_OPTIONS;
},
sortText() {
- const option = this.sortOptions.find((s) => s.orderBy === this.orderBy);
- return option.label;
+ return this.sortOptions.find((s) => s.orderBy === this.orderBy).label;
},
- isSortAscending() {
- return this.sort === ASCENDING_ORDER;
+ isDirectionAscending() {
+ return this.direction === ASCENDING_ORDER;
},
},
methods: {
- ...mapActions('index', ['setSorting']),
onDirectionChange() {
- const sort = this.isSortAscending ? DESCENDING_ORDER : ASCENDING_ORDER;
- this.setSorting({ sort });
- this.$emit('sort:changed');
+ const direction = this.isDirectionAscending ? DESCENDING_ORDER : ASCENDING_ORDER;
+ this.emitInputEventIfChanged(this.orderBy, direction);
},
onSortItemClick(item) {
- this.setSorting({ orderBy: item });
- this.$emit('sort:changed');
+ this.emitInputEventIfChanged(item.orderBy, this.direction);
},
isActiveSortItem(item) {
- return this.orderBy === item;
+ return this.orderBy === item.orderBy;
+ },
+ emitInputEventIfChanged(orderBy, direction) {
+ const newSort = SORT_MAP[orderBy][direction];
+ if (newSort !== this.value) {
+ this.$emit('input', SORT_MAP[orderBy][direction]);
+ }
},
},
};
@@ -46,15 +75,15 @@ export default {
<template>
<gl-sorting
:text="sortText"
- :is-ascending="isSortAscending"
+ :is-ascending="isDirectionAscending"
data-testid="releases-sort"
@sortDirectionChange="onDirectionChange"
>
<gl-sorting-item
- v-for="item in sortOptions"
+ v-for="item of sortOptions"
:key="item.orderBy"
- :active="isActiveSortItem(item.orderBy)"
- @click="onSortItemClick(item.orderBy)"
+ :active="isActiveSortItem(item)"
+ @click="onSortItemClick(item)"
>
{{ item.label }}
</gl-sorting-item>
diff --git a/app/assets/javascripts/releases/components/releases_sort_apollo_client.vue b/app/assets/javascripts/releases/components/releases_sort_apollo_client.vue
deleted file mode 100644
index 7257b34bbf6..00000000000
--- a/app/assets/javascripts/releases/components/releases_sort_apollo_client.vue
+++ /dev/null
@@ -1,91 +0,0 @@
-<script>
-import { GlSorting, GlSortingItem } from '@gitlab/ui';
-import {
- ASCENDING_ORDER,
- DESCENDING_ORDER,
- SORT_OPTIONS,
- RELEASED_AT,
- CREATED_AT,
- RELEASED_AT_ASC,
- RELEASED_AT_DESC,
- CREATED_ASC,
- ALL_SORTS,
- SORT_MAP,
-} from '../constants';
-
-export default {
- name: 'ReleasesSortApolloclient',
- components: {
- GlSorting,
- GlSortingItem,
- },
- props: {
- value: {
- type: String,
- required: true,
- validator: (sort) => ALL_SORTS.includes(sort),
- },
- },
- computed: {
- orderBy() {
- if (this.value === RELEASED_AT_ASC || this.value === RELEASED_AT_DESC) {
- return RELEASED_AT;
- }
-
- return CREATED_AT;
- },
- direction() {
- if (this.value === RELEASED_AT_ASC || this.value === CREATED_ASC) {
- return ASCENDING_ORDER;
- }
-
- return DESCENDING_ORDER;
- },
- sortOptions() {
- return SORT_OPTIONS;
- },
- sortText() {
- return this.sortOptions.find((s) => s.orderBy === this.orderBy).label;
- },
- isDirectionAscending() {
- return this.direction === ASCENDING_ORDER;
- },
- },
- methods: {
- onDirectionChange() {
- const direction = this.isDirectionAscending ? DESCENDING_ORDER : ASCENDING_ORDER;
- this.emitInputEventIfChanged(this.orderBy, direction);
- },
- onSortItemClick(item) {
- this.emitInputEventIfChanged(item.orderBy, this.direction);
- },
- isActiveSortItem(item) {
- return this.orderBy === item.orderBy;
- },
- emitInputEventIfChanged(orderBy, direction) {
- const newSort = SORT_MAP[orderBy][direction];
- if (newSort !== this.value) {
- this.$emit('input', SORT_MAP[orderBy][direction]);
- }
- },
- },
-};
-</script>
-
-<template>
- <gl-sorting
- :text="sortText"
- :is-ascending="isDirectionAscending"
- data-testid="releases-sort"
- @sortDirectionChange="onDirectionChange"
- >
- <gl-sorting-item
- v-for="item of sortOptions"
- :key="item.orderBy"
- :active="isActiveSortItem(item)"
- @click="onSortItemClick(item)"
- >
- {{ item.label }}
- </gl-sorting-item>
- </gl-sorting>
-</template>
diff --git a/app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql b/app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql
index 7f67f7d11a3..bda7ac52a47 100644
--- a/app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql
+++ b/app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql
@@ -1,12 +1,4 @@
-#import "../fragments/release.fragment.graphql"
-
-# This query is identical to
-# `app/graphql/queries/releases/all_releases.query.graphql`.
-# These two queries should be kept in sync.
-# When the `releases_index_apollo_client` feature flag is
-# removed, this query should be removed entirely.
-
-query allReleasesDeprecated(
+query allReleases(
$fullPath: ID!
$first: Int
$last: Int
@@ -20,7 +12,87 @@ query allReleasesDeprecated(
releases(first: $first, last: $last, before: $before, after: $after, sort: $sort) {
__typename
nodes {
- ...Release
+ __typename
+ name
+ tagName
+ tagPath
+ descriptionHtml
+ releasedAt
+ createdAt
+ upcomingRelease
+ assets {
+ __typename
+ count
+ sources {
+ __typename
+ nodes {
+ __typename
+ format
+ url
+ }
+ }
+ links {
+ __typename
+ nodes {
+ __typename
+ id
+ name
+ url
+ directAssetUrl
+ linkType
+ external
+ }
+ }
+ }
+ evidences {
+ __typename
+ nodes {
+ __typename
+ id
+ filepath
+ collectedAt
+ sha
+ }
+ }
+ links {
+ __typename
+ editUrl
+ selfUrl
+ openedIssuesUrl
+ closedIssuesUrl
+ openedMergeRequestsUrl
+ mergedMergeRequestsUrl
+ closedMergeRequestsUrl
+ }
+ commit {
+ __typename
+ id
+ sha
+ webUrl
+ title
+ }
+ author {
+ __typename
+ id
+ webUrl
+ avatarUrl
+ username
+ }
+ milestones {
+ __typename
+ nodes {
+ __typename
+ id
+ title
+ description
+ webPath
+ stats {
+ __typename
+ totalIssuesCount
+ closedIssuesCount
+ }
+ }
+ }
}
pageInfo {
__typename
diff --git a/app/assets/javascripts/releases/mount_index.js b/app/assets/javascripts/releases/mount_index.js
index 86fa72d1496..afb8ab461cd 100644
--- a/app/assets/javascripts/releases/mount_index.js
+++ b/app/assets/javascripts/releases/mount_index.js
@@ -1,50 +1,32 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
-import Vuex from 'vuex';
import createDefaultClient from '~/lib/graphql';
import ReleaseIndexApp from './components/app_index.vue';
-import ReleaseIndexApollopClientApp from './components/app_index_apollo_client.vue';
-import createStore from './stores';
-import createIndexModule from './stores/modules/index';
export default () => {
const el = document.getElementById('js-releases-page');
- if (window.gon?.features?.releasesIndexApolloClient) {
- Vue.use(VueApollo);
+ Vue.use(VueApollo);
- const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(
- {},
- {
- // This page attempts to decrease the perceived loading time
- // by sending two requests: one request for the first item only (which
- // completes relatively quickly), and one for all the items (which is slower).
- // By default, Apollo Client batches these requests together, which defeats
- // the purpose of making separate requests. So we explicitly
- // disable batching on this page.
- batchMax: 1,
- },
- ),
- });
-
- return new Vue({
- el,
- apolloProvider,
- provide: { ...el.dataset },
- render: (h) => h(ReleaseIndexApollopClientApp),
- });
- }
-
- Vue.use(Vuex);
+ const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(
+ {},
+ {
+ // This page attempts to decrease the perceived loading time
+ // by sending two requests: one request for the first item only (which
+ // completes relatively quickly), and one for all the items (which is slower).
+ // By default, Apollo Client batches these requests together, which defeats
+ // the purpose of making separate requests. So we explicitly
+ // disable batching on this page.
+ batchMax: 1,
+ },
+ ),
+ });
return new Vue({
el,
- store: createStore({
- modules: {
- index: createIndexModule(el.dataset),
- },
- }),
+ apolloProvider,
+ provide: { ...el.dataset },
render: (h) => h(ReleaseIndexApp),
});
};
diff --git a/app/assets/javascripts/releases/stores/modules/index/actions.js b/app/assets/javascripts/releases/stores/modules/index/actions.js
deleted file mode 100644
index d3bb11cab30..00000000000
--- a/app/assets/javascripts/releases/stores/modules/index/actions.js
+++ /dev/null
@@ -1,65 +0,0 @@
-import createFlash from '~/flash';
-import { __ } from '~/locale';
-import { PAGE_SIZE } from '~/releases/constants';
-import allReleasesQuery from '~/releases/graphql/queries/all_releases.query.graphql';
-import { gqClient, convertAllReleasesGraphQLResponse } from '~/releases/util';
-import * as types from './mutation_types';
-
-/**
- * Gets a paginated list of releases from the GraphQL endpoint
- *
- * @param {Object} vuexParams
- * @param {Object} actionParams
- * @param {String} [actionParams.before] A GraphQL cursor. If provided,
- * the items returned will proceed the provided cursor.
- * @param {String} [actionParams.after] A GraphQL cursor. If provided,
- * the items returned will follow the provided cursor.
- */
-export const fetchReleases = ({ dispatch, commit, state }, { before, after }) => {
- commit(types.REQUEST_RELEASES);
-
- const { sort, orderBy } = state.sorting;
- const orderByParam = orderBy === 'created_at' ? 'created' : orderBy;
- const sortParams = `${orderByParam}_${sort}`.toUpperCase();
-
- let paginationParams;
- if (!before && !after) {
- paginationParams = { first: PAGE_SIZE };
- } else if (before && !after) {
- paginationParams = { last: PAGE_SIZE, before };
- } else if (!before && after) {
- paginationParams = { first: PAGE_SIZE, after };
- } else {
- throw new Error(
- 'Both a `before` and an `after` parameter were provided to fetchReleases. These parameters cannot be used together.',
- );
- }
-
- gqClient
- .query({
- query: allReleasesQuery,
- variables: {
- fullPath: state.projectPath,
- sort: sortParams,
- ...paginationParams,
- },
- })
- .then((response) => {
- const { data, paginationInfo: pageInfo } = convertAllReleasesGraphQLResponse(response);
-
- commit(types.RECEIVE_RELEASES_SUCCESS, {
- data,
- pageInfo,
- });
- })
- .catch(() => dispatch('receiveReleasesError'));
-};
-
-export const receiveReleasesError = ({ commit }) => {
- commit(types.RECEIVE_RELEASES_ERROR);
- createFlash({
- message: __('An error occurred while fetching the releases. Please try again.'),
- });
-};
-
-export const setSorting = ({ commit }, data) => commit(types.SET_SORTING, data);
diff --git a/app/assets/javascripts/releases/stores/modules/index/index.js b/app/assets/javascripts/releases/stores/modules/index/index.js
deleted file mode 100644
index d5ca191153a..00000000000
--- a/app/assets/javascripts/releases/stores/modules/index/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import * as actions from './actions';
-import mutations from './mutations';
-import createState from './state';
-
-export default (initialState) => ({
- namespaced: true,
- actions,
- mutations,
- state: createState(initialState),
-});
diff --git a/app/assets/javascripts/releases/stores/modules/index/mutation_types.js b/app/assets/javascripts/releases/stores/modules/index/mutation_types.js
deleted file mode 100644
index 669168efb88..00000000000
--- a/app/assets/javascripts/releases/stores/modules/index/mutation_types.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export const REQUEST_RELEASES = 'REQUEST_RELEASES';
-export const RECEIVE_RELEASES_SUCCESS = 'RECEIVE_RELEASES_SUCCESS';
-export const RECEIVE_RELEASES_ERROR = 'RECEIVE_RELEASES_ERROR';
-export const SET_SORTING = 'SET_SORTING';
diff --git a/app/assets/javascripts/releases/stores/modules/index/mutations.js b/app/assets/javascripts/releases/stores/modules/index/mutations.js
deleted file mode 100644
index 55a8a488be8..00000000000
--- a/app/assets/javascripts/releases/stores/modules/index/mutations.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import * as types from './mutation_types';
-
-export default {
- /**
- * Sets isLoading to true while the request is being made.
- * @param {Object} state
- */
- [types.REQUEST_RELEASES](state) {
- state.isLoading = true;
- },
-
- /**
- * Sets isLoading to false.
- * Sets hasError to false.
- * Sets the received data
- * Sets the received pagination information
- * @param {Object} state
- * @param {Object} resp
- */
- [types.RECEIVE_RELEASES_SUCCESS](state, { data, pageInfo }) {
- state.hasError = false;
- state.isLoading = false;
- state.releases = data;
- state.pageInfo = pageInfo;
- },
-
- /**
- * Sets isLoading to false.
- * Sets hasError to true.
- * Resets the data
- * @param {Object} state
- * @param {Object} data
- */
- [types.RECEIVE_RELEASES_ERROR](state) {
- state.isLoading = false;
- state.releases = [];
- state.hasError = true;
- state.pageInfo = {};
- },
-
- [types.SET_SORTING](state, sorting) {
- state.sorting = { ...state.sorting, ...sorting };
- },
-};
diff --git a/app/assets/javascripts/releases/stores/modules/index/state.js b/app/assets/javascripts/releases/stores/modules/index/state.js
deleted file mode 100644
index 5e1aaab7b58..00000000000
--- a/app/assets/javascripts/releases/stores/modules/index/state.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import { DESCENDING_ORDER, RELEASED_AT } from '../../../constants';
-
-export default ({
- projectId,
- projectPath,
- documentationPath,
- illustrationPath,
- newReleasePath = '',
-}) => ({
- projectId,
- projectPath,
- documentationPath,
- illustrationPath,
- newReleasePath,
-
- isLoading: false,
- hasError: false,
- releases: [],
- pageInfo: {},
- sorting: {
- sort: DESCENDING_ORDER,
- orderBy: RELEASED_AT,
- },
-});
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 59bd54eab60..fb2ef850e4f 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
@@ -34,7 +34,7 @@ export default {
return `${this.severityLabel} - ${this.issue.name}`;
},
issueSeverity() {
- return this.issue.severity.toLowerCase();
+ return this.issue.severity?.toLowerCase();
},
isStatusSuccess() {
return this.status === STATUS_SUCCESS;
diff --git a/app/assets/javascripts/reports/components/report_section.vue b/app/assets/javascripts/reports/components/report_section.vue
index 7a490210f0b..0714d88b392 100644
--- a/app/assets/javascripts/reports/components/report_section.vue
+++ b/app/assets/javascripts/reports/components/report_section.vue
@@ -3,7 +3,7 @@ import { GlButton } from '@gitlab/ui';
import api from '~/api';
import { __ } from '~/locale';
import StatusIcon from '~/vue_merge_request_widget/components/mr_widget_status_icon.vue';
-import Popover from '~/vue_shared/components/help_popover.vue';
+import HelpPopover from '~/vue_shared/components/help_popover.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { status, SLOT_SUCCESS, SLOT_LOADING, SLOT_ERROR } from '../constants';
import IssuesList from './issues_list.vue';
@@ -13,7 +13,7 @@ export default {
components: {
GlButton,
IssuesList,
- Popover,
+ HelpPopover,
StatusIcon,
},
mixins: [glFeatureFlagsMixin()],
@@ -172,7 +172,7 @@ export default {
},
methods: {
toggleCollapsed() {
- if (this.trackAction && this.glFeatures.usersExpandingWidgetsUsageData) {
+ if (this.trackAction) {
api.trackRedisHllUserEvent(this.trackAction);
}
@@ -193,7 +193,7 @@ export default {
<div class="gl-display-flex gl-align-items-center">
<p class="gl-line-height-normal gl-m-0">{{ headerText }}</p>
<slot :name="slotName"></slot>
- <popover
+ <help-popover
v-if="hasPopover"
:options="popoverOptions"
class="gl-ml-2 gl-display-inline-flex"
diff --git a/app/assets/javascripts/reports/components/summary_row.vue b/app/assets/javascripts/reports/components/summary_row.vue
index 6b7d81c4878..7419b5b59d6 100644
--- a/app/assets/javascripts/reports/components/summary_row.vue
+++ b/app/assets/javascripts/reports/components/summary_row.vue
@@ -1,7 +1,7 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import Popover from '~/vue_shared/components/help_popover.vue';
+import HelpPopover from '~/vue_shared/components/help_popover.vue';
import { ICON_WARNING } from '../constants';
/**
@@ -16,7 +16,7 @@ export default {
name: 'ReportSummaryRow',
components: {
CiIcon,
- Popover,
+ HelpPopover,
GlLoadingIcon,
},
props: {
@@ -79,7 +79,7 @@ export default {
<div class="report-block-list-issue-description-text" data-testid="summary-row-description">
<slot name="summary">{{ summary }}</slot
><span v-if="popoverOptions" class="text-nowrap"
- >&nbsp;<popover v-if="popoverOptions" :options="popoverOptions" class="align-top" />
+ >&nbsp;<help-popover v-if="popoverOptions" :options="popoverOptions" class="align-top" />
</span>
</div>
</div>
diff --git a/app/assets/javascripts/reports/grouped_test_report/store/actions.js b/app/assets/javascripts/reports/grouped_test_report/store/actions.js
index e3db57ad846..73f8df016b6 100644
--- a/app/assets/javascripts/reports/grouped_test_report/store/actions.js
+++ b/app/assets/javascripts/reports/grouped_test_report/store/actions.js
@@ -1,7 +1,7 @@
import Visibility from 'visibilityjs';
-import axios from '../../../lib/utils/axios_utils';
-import httpStatusCodes from '../../../lib/utils/http_status';
-import Poll from '../../../lib/utils/poll';
+import axios from '~/lib/utils/axios_utils';
+import httpStatusCodes from '~/lib/utils/http_status';
+import Poll from '~/lib/utils/poll';
import * as types from './mutation_types';
export const setPaths = ({ commit }, paths) => commit(types.SET_PATHS, paths);
diff --git a/app/assets/javascripts/repository/components/blob_content_viewer.vue b/app/assets/javascripts/repository/components/blob_content_viewer.vue
index 85652301f4d..c9e4aab1db1 100644
--- a/app/assets/javascripts/repository/components/blob_content_viewer.vue
+++ b/app/assets/javascripts/repository/components/blob_content_viewer.vue
@@ -12,6 +12,7 @@ import { redirectTo } from '~/lib/utils/url_utility';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import WebIdeLink from '~/vue_shared/components/web_ide_link.vue';
import CodeIntelligence from '~/code_navigation/components/app.vue';
+import LineHighlighter from '~/blob/line_highlighter';
import getRefMixin from '../mixins/get_ref';
import blobInfoQuery from '../queries/blob_info.query.graphql';
import userInfoQuery from '../queries/user_info.query.graphql';
@@ -192,6 +193,7 @@ export default {
window.requestIdleCallback(() => {
this.isRenderingLegacyTextViewer = false;
+ new LineHighlighter(); // eslint-disable-line no-new
});
} else {
this.legacyRichViewer = html;
@@ -301,6 +303,7 @@ export default {
:code-navigation-path="blobInfo.codeNavigationPath"
:blob-path="blobInfo.path"
:path-prefix="blobInfo.projectBlobPathRoot"
+ :wrap-text-nodes="glFeatures.highlightJs"
/>
</div>
</div>
diff --git a/app/assets/javascripts/repository/components/blob_viewers/index.js b/app/assets/javascripts/repository/components/blob_viewers/index.js
index cbe18ea396e..81d2168e2ce 100644
--- a/app/assets/javascripts/repository/components/blob_viewers/index.js
+++ b/app/assets/javascripts/repository/components/blob_viewers/index.js
@@ -8,6 +8,7 @@ const viewers = {
pdf: () => import('./pdf_viewer.vue'),
lfs: () => import('./lfs_viewer.vue'),
audio: () => import('./audio_viewer.vue'),
+ svg: () => import('./image_viewer.vue'),
};
export const loadViewer = (type, isUsingLfs) => {
diff --git a/app/assets/javascripts/repository/components/breadcrumbs.vue b/app/assets/javascripts/repository/components/breadcrumbs.vue
index 08faf19d12a..84c9f9d0bbe 100644
--- a/app/assets/javascripts/repository/components/breadcrumbs.vue
+++ b/app/assets/javascripts/repository/components/breadcrumbs.vue
@@ -9,8 +9,7 @@ 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 { __ } 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';
@@ -58,7 +57,7 @@ export default {
directives: {
GlModal: GlModalDirective,
},
- mixins: [getRefMixin, glFeatureFlagsMixin()],
+ mixins: [getRefMixin],
props: {
currentPath: {
type: String,
@@ -176,11 +175,7 @@ export default {
return this.canEditTree && !this.$apollo.queries.userPermissions.loading;
},
showNewDirectoryModal() {
- return (
- this.glFeatures.newDirModal &&
- this.canEditTree &&
- !this.$apollo.queries.userPermissions.loading
- );
+ return this.canEditTree && !this.$apollo.queries.userPermissions.loading;
},
dropdownItems() {
const items = [];
@@ -209,24 +204,13 @@ export default {
},
);
- 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'),
- });
- }
+ items.push({
+ attrs: {
+ href: '#modal-create-new-dir',
+ },
+ text: __('New directory'),
+ modalId: NEW_DIRECTORY_MODAL_ID,
+ });
} else if (this.canCreateMrFromFork) {
items.push(
{
diff --git a/app/assets/javascripts/repository/components/last_commit.vue b/app/assets/javascripts/repository/components/last_commit.vue
index c3d121505b6..2810db33e64 100644
--- a/app/assets/javascripts/repository/components/last_commit.vue
+++ b/app/assets/javascripts/repository/components/last_commit.vue
@@ -10,10 +10,10 @@ import {
import defaultAvatarUrl from 'images/no_avatar.png';
import pathLastCommitQuery from 'shared_queries/repository/path_last_commit.query.graphql';
import { sprintf, s__ } from '~/locale';
-import CiIcon from '../../vue_shared/components/ci_icon.vue';
-import ClipboardButton from '../../vue_shared/components/clipboard_button.vue';
-import TimeagoTooltip from '../../vue_shared/components/time_ago_tooltip.vue';
-import UserAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import getRefMixin from '../mixins/get_ref';
import projectPathQuery from '../queries/project_path.query.graphql';
@@ -171,7 +171,7 @@ export default {
<div class="commit-actions flex-row">
<div
v-if="commit.signatureHtml"
- v-safe-html:[$options.safeHtmlConfig]="commit.signatureHtml"
+ v-html="commit.signatureHtml /* eslint-disable-line vue/no-v-html */"
></div>
<div v-if="commit.pipeline" class="ci-status-link">
<gl-link
diff --git a/app/assets/javascripts/repository/components/table/index.vue b/app/assets/javascripts/repository/components/table/index.vue
index 0a2ed753e38..c2323d6b286 100644
--- a/app/assets/javascripts/repository/components/table/index.vue
+++ b/app/assets/javascripts/repository/components/table/index.vue
@@ -1,7 +1,7 @@
<script>
import { GlDeprecatedSkeletonLoading as GlSkeletonLoading, GlButton } from '@gitlab/ui';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { sprintf, __ } from '../../../locale';
+import { sprintf, __ } from '~/locale';
import getRefMixin from '../../mixins/get_ref';
import projectPathQuery from '../../queries/project_path.query.graphql';
import TableHeader from './header.vue';
diff --git a/app/assets/javascripts/repository/components/tree_content.vue b/app/assets/javascripts/repository/components/tree_content.vue
index 130ebf77361..2200e999c75 100644
--- a/app/assets/javascripts/repository/components/tree_content.vue
+++ b/app/assets/javascripts/repository/components/tree_content.vue
@@ -2,7 +2,7 @@
import paginatedTreeQuery from 'shared_queries/repository/paginated_tree.query.graphql';
import createFlash from '~/flash';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { __ } from '../../locale';
+import { __ } from '~/locale';
import {
TREE_PAGE_SIZE,
TREE_INITIAL_FETCH_COUNT,
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 8aba91eedf7..accc9926a57 100644
--- a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
+++ b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
@@ -1,12 +1,14 @@
<script>
import { GlBadge, GlLink } from '@gitlab/ui';
import { createAlert } from '~/flash';
-import { fetchPolicies } from '~/lib/graphql';
import { updateHistory } from '~/lib/utils/url_utility';
import { formatNumber } from '~/locale';
+import { fetchPolicies } from '~/lib/graphql';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import RegistrationDropdown from '../components/registration/registration_dropdown.vue';
import RunnerFilteredSearchBar from '../components/runner_filtered_search_bar.vue';
+import RunnerBulkDelete from '../components/runner_bulk_delete.vue';
import RunnerList from '../components/runner_list.vue';
import RunnerName from '../components/runner_name.vue';
import RunnerStats from '../components/stat/runner_stats.vue';
@@ -14,6 +16,7 @@ import RunnerPagination from '../components/runner_pagination.vue';
import RunnerTypeTabs from '../components/runner_type_tabs.vue';
import RunnerActionsCell from '../components/cells/runner_actions_cell.vue';
+import { pausedTokenConfig } from '../components/search_tokens/paused_token_config';
import { statusTokenConfig } from '../components/search_tokens/status_token_config';
import { tagTokenConfig } from '../components/search_tokens/tag_token_config';
import {
@@ -37,7 +40,7 @@ import { captureException } from '../sentry_utils';
const runnersCountSmartQuery = {
query: runnersAdminCountQuery,
- fetchPolicy: fetchPolicies.CACHE_AND_NETWORK,
+ fetchPolicy: fetchPolicies.NETWORK_ONLY,
update(data) {
return data?.runners?.count;
},
@@ -53,6 +56,7 @@ export default {
GlLink,
RegistrationDropdown,
RunnerFilteredSearchBar,
+ RunnerBulkDelete,
RunnerList,
RunnerName,
RunnerStats,
@@ -60,6 +64,8 @@ export default {
RunnerTypeTabs,
RunnerActionsCell,
},
+ mixins: [glFeatureFlagMixin()],
+ inject: ['localMutations'],
props: {
registrationToken: {
type: String,
@@ -78,10 +84,7 @@ export default {
apollo: {
runners: {
query: runnersAdminQuery,
- // Runners can be updated by users directly in this list.
- // A "cache and network" policy prevents outdated filtered
- // results.
- fetchPolicy: fetchPolicies.CACHE_AND_NETWORK,
+ fetchPolicy: fetchPolicies.NETWORK_ONLY,
variables() {
return this.variables;
},
@@ -176,6 +179,7 @@ export default {
},
searchTokens() {
return [
+ pausedTokenConfig,
statusTokenConfig,
{
...tagTokenConfig,
@@ -183,6 +187,11 @@ export default {
},
];
},
+ isBulkDeleteEnabled() {
+ // Feature flag: admin_runners_bulk_delete
+ // Rollout issue: https://gitlab.com/gitlab-org/gitlab/-/issues/353981
+ return this.glFeatures.adminRunnersBulkDelete;
+ },
},
watch: {
search: {
@@ -224,13 +233,29 @@ export default {
}
return '';
},
+ refetchFilteredCounts() {
+ this.$apollo.queries.allRunnersCount.refetch();
+ this.$apollo.queries.instanceRunnersCount.refetch();
+ this.$apollo.queries.groupRunnersCount.refetch();
+ this.$apollo.queries.projectRunnersCount.refetch();
+ },
+ onToggledPaused() {
+ // When a runner is Paused, the tab count can
+ // become stale, refetch outdated counts.
+ this.refetchFilteredCounts();
+ },
onDeleted({ message }) {
this.$root.$toast?.show(message);
- this.$apollo.queries.runners.refetch();
},
reportToSentry(error) {
captureException({ error, component: this.$options.name });
},
+ onChecked({ runner, isChecked }) {
+ this.localMutations.setRunnerChecked({
+ runner,
+ isChecked,
+ });
+ },
},
filteredSearchNamespace: ADMIN_FILTERED_SEARCH_NAMESPACE,
INSTANCE_TYPE,
@@ -279,7 +304,13 @@ export default {
{{ __('No runners found') }}
</div>
<template v-else>
- <runner-list :runners="runners.items" :loading="runnersLoading">
+ <runner-bulk-delete v-if="isBulkDeleteEnabled" />
+ <runner-list
+ :runners="runners.items"
+ :loading="runnersLoading"
+ :checkable="isBulkDeleteEnabled"
+ @checked="onChecked"
+ >
<template #runner-name="{ runner }">
<gl-link :href="runner.adminUrl">
<runner-name :runner="runner" />
@@ -289,6 +320,7 @@ export default {
<runner-actions-cell
:runner="runner"
:edit-url="runner.editAdminUrl"
+ @toggledPaused="onToggledPaused"
@deleted="onDeleted"
/>
</template>
diff --git a/app/assets/javascripts/runner/admin_runners/index.js b/app/assets/javascripts/runner/admin_runners/index.js
index 3b8a8fe9cd1..12e2cb2ee9f 100644
--- a/app/assets/javascripts/runner/admin_runners/index.js
+++ b/app/assets/javascripts/runner/admin_runners/index.js
@@ -1,9 +1,10 @@
import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
-import createDefaultClient from '~/lib/graphql';
import { visitUrl } from '~/lib/utils/url_utility';
import { updateOutdatedUrl } from '~/runner/runner_search_utils';
+import createDefaultClient from '~/lib/graphql';
+import { createLocalState } from '../graphql/list/local_state';
import AdminRunnersApp from './admin_runners_app.vue';
Vue.use(GlToast);
@@ -25,10 +26,17 @@ export const initAdminRunners = (selector = '#js-admin-runners') => {
return null;
}
- const { runnerInstallHelpPage, registrationToken } = el.dataset;
+ const {
+ runnerInstallHelpPage,
+ registrationToken,
+ onlineContactTimeoutSecs,
+ staleTimeoutSecs,
+ } = el.dataset;
+
+ const { cacheConfig, typeDefs, localMutations } = createLocalState();
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient({}, { cacheConfig, typeDefs }),
});
return new Vue({
@@ -36,6 +44,9 @@ export const initAdminRunners = (selector = '#js-admin-runners') => {
apolloProvider,
provide: {
runnerInstallHelpPage,
+ localMutations,
+ onlineContactTimeoutSecs,
+ staleTimeoutSecs,
},
render(h) {
return h(AdminRunnersApp, {
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 c69321de001..7a4760f81ee 100644
--- a/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue
+++ b/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue
@@ -23,7 +23,7 @@ export default {
required: false,
},
},
- emits: ['deleted'],
+ emits: ['toggledPaused', 'deleted'],
computed: {
canUpdate() {
return this.runner.userPermissions?.updateRunner;
@@ -33,6 +33,9 @@ export default {
},
},
methods: {
+ onToggledPaused() {
+ this.$emit('toggledPaused');
+ },
onDeleted(value) {
this.$emit('deleted', value);
},
@@ -43,7 +46,17 @@ export default {
<template>
<gl-button-group>
<runner-edit-button v-if="canUpdate && editUrl" :href="editUrl" />
- <runner-pause-button v-if="canUpdate" :runner="runner" :compact="true" />
- <runner-delete-button v-if="canDelete" :runner="runner" :compact="true" @deleted="onDeleted" />
+ <runner-pause-button
+ v-if="canUpdate"
+ :runner="runner"
+ :compact="true"
+ @toggledPaused="onToggledPaused"
+ />
+ <runner-delete-button
+ :disabled="!canDelete"
+ :runner="runner"
+ :compact="true"
+ @deleted="onDeleted"
+ />
</gl-button-group>
</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
index 937ec631633..1eb383a1904 100644
--- a/app/assets/javascripts/runner/components/cells/runner_summary_cell.vue
+++ b/app/assets/javascripts/runner/components/cells/runner_summary_cell.vue
@@ -33,6 +33,9 @@ export default {
description() {
return this.runner.description;
},
+ ipAddress() {
+ return this.runner.ipAddress;
+ },
},
i18n: {
I18N_LOCKED_RUNNER_DESCRIPTION,
@@ -53,10 +56,12 @@ export default {
:title="$options.i18n.I18N_LOCKED_RUNNER_DESCRIPTION"
name="lock"
/>
- <tooltip-on-truncate class="gl-display-block" :title="description" truncate-target="child">
- <div class="gl-text-truncate">
- {{ description }}
- </div>
+ <tooltip-on-truncate class="gl-display-block gl-text-truncate" :title="description">
+ {{ description }}
+ </tooltip-on-truncate>
+ <tooltip-on-truncate class="gl-display-block gl-text-truncate" :title="ipAddress">
+ <span class="gl-md-display-none gl-lg-display-inline">{{ __('IP Address') }}</span>
+ <strong>{{ ipAddress }}</strong>
</tooltip-on-truncate>
</div>
</template>
diff --git a/app/assets/javascripts/runner/components/registration/registration_token.vue b/app/assets/javascripts/runner/components/registration/registration_token.vue
index d54a66ff0e4..68c6429a056 100644
--- a/app/assets/javascripts/runner/components/registration/registration_token.vue
+++ b/app/assets/javascripts/runner/components/registration/registration_token.vue
@@ -1,16 +1,10 @@
<script>
-import { GlButtonGroup, GlButton, GlTooltipDirective } from '@gitlab/ui';
-import { s__, __ } from '~/locale';
-import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
+import { s__ } from '~/locale';
+import InputCopyToggleVisibility from '~/vue_shared/components/form/input_copy_toggle_visibility.vue';
export default {
components: {
- GlButtonGroup,
- GlButton,
- ModalCopyButton,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
+ InputCopyToggleVisibility,
},
props: {
value: {
@@ -19,65 +13,21 @@ export default {
default: '',
},
},
- data() {
- return {
- isMasked: true,
- };
- },
- computed: {
- maskLabel() {
- if (this.isMasked) {
- return __('Click to reveal');
- }
- return __('Click to hide');
- },
- maskIcon() {
- if (this.isMasked) {
- return 'eye';
- }
- return 'eye-slash';
- },
- displayedValue() {
- if (this.isMasked && this.value?.length) {
- return '*'.repeat(this.value.length);
- }
- return this.value;
- },
- },
methods: {
- onToggleMasked() {
- this.isMasked = !this.isMasked;
- },
- onCopied() {
+ onCopy() {
// value already in the clipboard, simply notify the user
this.$toast?.show(s__('Runners|Registration token copied!'));
},
},
- i18n: {
- copyLabel: s__('Runners|Copy registration token'),
- },
+ I18N_COPY_BUTTON_TITLE: s__('Runners|Copy registration token'),
};
</script>
<template>
- <gl-button-group>
- <gl-button class="gl-font-monospace" data-testid="token-value" label>
- {{ displayedValue }}
- </gl-button>
- <gl-button
- v-gl-tooltip
- :aria-label="maskLabel"
- :title="maskLabel"
- :icon="maskIcon"
- class="gl-w-auto! gl-flex-shrink-0!"
- data-testid="toggle-masked"
- @click.stop="onToggleMasked"
- />
- <modal-copy-button
- class="gl-w-auto! gl-flex-shrink-0!"
- :aria-label="$options.i18n.copyLabel"
- :title="$options.i18n.copyLabel"
- :text="value"
- @success="onCopied"
- />
- </gl-button-group>
+ <input-copy-toggle-visibility
+ class="gl-m-0"
+ :value="value"
+ data-testid="token-value"
+ :copy-button-title="$options.I18N_COPY_BUTTON_TITLE"
+ @copy="onCopy"
+ />
</template>
diff --git a/app/assets/javascripts/runner/components/runner_assigned_item.vue b/app/assets/javascripts/runner/components/runner_assigned_item.vue
index ea8074199a6..38bdfecb7df 100644
--- a/app/assets/javascripts/runner/components/runner_assigned_item.vue
+++ b/app/assets/javascripts/runner/components/runner_assigned_item.vue
@@ -1,5 +1,6 @@
<script>
import { GlAvatar, GlLink } from '@gitlab/ui';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
export default {
components: {
@@ -25,13 +26,20 @@ export default {
default: null,
},
},
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
<template>
<div class="gl-display-flex gl-align-items-center gl-py-5">
<gl-link :href="href" data-testid="item-avatar" class="gl-text-decoration-none! gl-mr-3">
- <gl-avatar shape="rect" :entity-name="name" :alt="name" :src="avatarUrl" :size="48" />
+ <gl-avatar
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
+ :entity-name="name"
+ :alt="name"
+ :src="avatarUrl"
+ :size="48"
+ />
</gl-link>
<gl-link :href="href" class="gl-font-weight-bold gl-text-gray-900!">{{ fullName }}</gl-link>
diff --git a/app/assets/javascripts/runner/components/runner_bulk_delete.vue b/app/assets/javascripts/runner/components/runner_bulk_delete.vue
new file mode 100644
index 00000000000..50791de0bda
--- /dev/null
+++ b/app/assets/javascripts/runner/components/runner_bulk_delete.vue
@@ -0,0 +1,111 @@
+<script>
+import { GlButton, GlModalDirective, GlSprintf } from '@gitlab/ui';
+import { n__, sprintf } from '~/locale';
+import { ignoreWhilePending } from '~/lib/utils/ignore_while_pending';
+import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
+import checkedRunnerIdsQuery from '../graphql/list/checked_runner_ids.query.graphql';
+
+export default {
+ components: {
+ GlButton,
+ GlSprintf,
+ },
+ directives: {
+ GlModal: GlModalDirective,
+ },
+ inject: ['localMutations'],
+ data() {
+ return {
+ checkedRunnerIds: [],
+ };
+ },
+ apollo: {
+ checkedRunnerIds: {
+ query: checkedRunnerIdsQuery,
+ },
+ },
+ computed: {
+ checkedCount() {
+ return this.checkedRunnerIds.length || 0;
+ },
+ bannerMessage() {
+ return sprintf(
+ n__(
+ 'Runners|%{strongStart}%{count}%{strongEnd} runner selected',
+ 'Runners|%{strongStart}%{count}%{strongEnd} runners selected',
+ this.checkedCount,
+ ),
+ {
+ count: this.checkedCount,
+ },
+ );
+ },
+ modalTitle() {
+ return n__('Runners|Delete %d runner', 'Runners|Delete %d runners', this.checkedCount);
+ },
+ modalHtmlMessage() {
+ return sprintf(
+ n__(
+ 'Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?',
+ 'Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?',
+ this.checkedCount,
+ ),
+ {
+ strongStart: '<strong>',
+ strongEnd: '</strong>',
+ count: this.checkedCount,
+ },
+ false,
+ );
+ },
+ primaryBtnText() {
+ return n__(
+ 'Runners|Permanently delete %d runner',
+ 'Runners|Permanently delete %d runners',
+ this.checkedCount,
+ );
+ },
+ },
+ methods: {
+ onClearChecked() {
+ this.localMutations.clearChecked();
+ },
+ onClickDelete: ignoreWhilePending(async function onClickDelete() {
+ const confirmed = await confirmAction(null, {
+ title: this.modalTitle,
+ modalHtmlMessage: this.modalHtmlMessage,
+ primaryBtnVariant: 'danger',
+ primaryBtnText: this.primaryBtnText,
+ });
+
+ if (confirmed) {
+ // TODO Call $apollo.mutate with list of runner
+ // ids in `this.checkedRunnerIds`.
+ // See https://gitlab.com/gitlab-org/gitlab/-/issues/339525/
+ }
+ }),
+ },
+};
+</script>
+
+<template>
+ <div v-if="checkedCount" class="gl-my-4 gl-p-4 gl-border-1 gl-border-solid gl-border-gray-100">
+ <div class="gl-display-flex gl-align-items-center">
+ <div>
+ <gl-sprintf :message="bannerMessage">
+ <template #strong="{ content }">
+ <strong>{{ content }}</strong>
+ </template>
+ </gl-sprintf>
+ </div>
+ <div class="gl-ml-auto">
+ <gl-button data-testid="clear-btn" variant="default" @click="onClearChecked">{{
+ s__('Runners|Clear selection')
+ }}</gl-button>
+ <gl-button data-testid="delete-btn" variant="danger" @click="onClickDelete">{{
+ s__('Runners|Delete selected')
+ }}</gl-button>
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/runner/components/runner_delete_button.vue b/app/assets/javascripts/runner/components/runner_delete_button.vue
index 854c983f4da..b58665ecbc9 100644
--- a/app/assets/javascripts/runner/components/runner_delete_button.vue
+++ b/app/assets/javascripts/runner/components/runner_delete_button.vue
@@ -5,7 +5,12 @@ import { createAlert } from '~/flash';
import { sprintf } from '~/locale';
import { captureException } from '~/runner/sentry_utils';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { I18N_DELETE_RUNNER, I18N_DELETED_TOAST } from '../constants';
+import {
+ I18N_DELETE_DISABLED_MANY_PROJECTS,
+ I18N_DELETE_DISABLED_UNKNOWN_REASON,
+ I18N_DELETE_RUNNER,
+ I18N_DELETED_TOAST,
+} from '../constants';
import RunnerDeleteModal from './runner_delete_modal.vue';
export default {
@@ -26,6 +31,11 @@ export default {
return runner?.id && runner?.shortSha;
},
},
+ disabled: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
compact: {
type: Boolean,
required: false,
@@ -75,7 +85,14 @@ export default {
return null;
},
tooltip() {
- // Only show tooltip when compact.
+ if (this.disabled && this.runner.projectCount > 1) {
+ return I18N_DELETE_DISABLED_MANY_PROJECTS;
+ }
+ if (this.disabled) {
+ return I18N_DELETE_DISABLED_UNKNOWN_REASON;
+ }
+
+ // Only show basic "delete" tooltip when compact.
// Also prevent a "sticky" tooltip: If this button is
// disabled, mouseout listeners don't run leaving the tooltip stuck
if (this.compact && !this.deleting) {
@@ -83,6 +100,14 @@ export default {
}
return '';
},
+ wrapperTabindex() {
+ if (this.disabled) {
+ // Trigger tooltip on keyboard-focusable wrapper
+ // See https://bootstrap-vue.org/docs/directives/tooltip
+ return '0';
+ }
+ return null;
+ },
},
methods: {
async onDelete() {
@@ -90,31 +115,37 @@ export default {
// should only change back if the operation fails.
this.deleting = true;
try {
- const {
- data: {
- runnerDelete: { errors },
- },
- } = await this.$apollo.mutate({
+ await this.$apollo.mutate({
mutation: runnerDeleteMutation,
variables: {
input: {
id: this.runner.id,
},
},
+ update: (cache, { data }) => {
+ const { errors } = data.runnerDelete;
+
+ if (errors?.length) {
+ this.onError(new Error(errors.join(' ')));
+ return;
+ }
+
+ this.$emit('deleted', {
+ message: sprintf(I18N_DELETED_TOAST, { name: this.runnerName }),
+ });
+
+ // Remove deleted runner from the cache
+ const cacheId = cache.identify(this.runner);
+ cache.evict({ id: cacheId });
+ cache.gc();
+ },
});
- if (errors && errors.length) {
- throw new Error(errors.join(' '));
- } else {
- this.$emit('deleted', {
- message: sprintf(I18N_DELETED_TOAST, { name: this.runnerName }),
- });
- }
} catch (e) {
- this.deleting = false;
this.onError(e);
}
},
onError(error) {
+ this.deleting = false;
const { message } = error;
createAlert({ message });
@@ -125,20 +156,22 @@ export default {
</script>
<template>
- <gl-button
- v-gl-tooltip.hover.viewport="tooltip"
- v-gl-modal="runnerDeleteModalId"
- :aria-label="ariaLabel"
- :icon="icon"
- :class="buttonClass"
- :loading="deleting"
- variant="danger"
- >
- {{ buttonContent }}
+ <div v-gl-tooltip="tooltip" class="btn-group" :tabindex="wrapperTabindex">
+ <gl-button
+ v-gl-modal="runnerDeleteModalId"
+ :aria-label="ariaLabel"
+ :icon="icon"
+ :class="buttonClass"
+ :loading="deleting"
+ :disabled="disabled"
+ variant="danger"
+ >
+ {{ buttonContent }}
+ </gl-button>
<runner-delete-modal
:modal-id="runnerDeleteModalId"
:runner-name="runnerName"
@primary="onDelete"
/>
- </gl-button>
+ </div>
</template>
diff --git a/app/assets/javascripts/runner/components/runner_jobs.vue b/app/assets/javascripts/runner/components/runner_jobs.vue
index eb77babcc57..b25d92d049e 100644
--- a/app/assets/javascripts/runner/components/runner_jobs.vue
+++ b/app/assets/javascripts/runner/components/runner_jobs.vue
@@ -1,5 +1,5 @@
<script>
-import { GlSkeletonLoading } from '@gitlab/ui';
+import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
import { createAlert } from '~/flash';
import runnerJobsQuery from '../graphql/details/runner_jobs.query.graphql';
import { I18N_FETCH_ERROR, I18N_NO_JOBS_FOUND, RUNNER_DETAILS_JOBS_PAGE_SIZE } from '../constants';
diff --git a/app/assets/javascripts/runner/components/runner_list.vue b/app/assets/javascripts/runner/components/runner_list.vue
index 51749b0255f..dcfd4b84dd2 100644
--- a/app/assets/javascripts/runner/components/runner_list.vue
+++ b/app/assets/javascripts/runner/components/runner_list.vue
@@ -4,17 +4,30 @@ import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/toolt
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __, s__ } from '~/locale';
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
+import checkedRunnerIdsQuery from '../graphql/list/checked_runner_ids.query.graphql';
import { formatJobCount, tableField } from '../utils';
import RunnerSummaryCell from './cells/runner_summary_cell.vue';
+import RunnerStatusPopover from './runner_status_popover.vue';
import RunnerStatusCell from './cells/runner_status_cell.vue';
import RunnerTags from './runner_tags.vue';
+const defaultFields = [
+ tableField({ key: 'status', label: s__('Runners|Status') }),
+ tableField({ key: 'summary', label: s__('Runners|Runner'), thClasses: ['gl-lg-w-25p'] }),
+ tableField({ key: 'version', label: __('Version') }),
+ tableField({ key: 'jobCount', label: __('Jobs') }),
+ tableField({ key: 'tagList', label: __('Tags'), thClasses: ['gl-lg-w-25p'] }),
+ tableField({ key: 'contactedAt', label: __('Last contact') }),
+ tableField({ key: 'actions', label: '' }),
+];
+
export default {
components: {
GlTableLite,
GlSkeletonLoader,
TooltipOnTruncate,
TimeAgo,
+ RunnerStatusPopover,
RunnerSummaryCell,
RunnerTags,
RunnerStatusCell,
@@ -22,7 +35,20 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
+ apollo: {
+ checkedRunnerIds: {
+ query: checkedRunnerIdsQuery,
+ skip() {
+ return !this.checkable;
+ },
+ },
+ },
props: {
+ checkable: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
loading: {
type: Boolean,
required: false,
@@ -33,6 +59,10 @@ export default {
required: true,
},
},
+ emits: ['checked'],
+ data() {
+ return { checkedRunnerIds: [] };
+ },
computed: {
tableClass() {
// <gl-table-lite> does not provide a busy state, add
@@ -42,6 +72,18 @@ export default {
'gl-opacity-6': this.loading,
};
},
+ fields() {
+ if (this.checkable) {
+ const checkboxField = tableField({
+ key: 'checkbox',
+ label: s__('Runners|Checkbox'),
+ thClasses: ['gl-w-9'],
+ tdClass: ['gl-text-center'],
+ });
+ return [checkboxField, ...defaultFields];
+ }
+ return defaultFields;
+ },
},
methods: {
formatJobCount(jobCount) {
@@ -55,17 +97,16 @@ export default {
}
return {};
},
+ onCheckboxChange(runner, isChecked) {
+ this.$emit('checked', {
+ runner,
+ isChecked,
+ });
+ },
+ isChecked(runner) {
+ return this.checkedRunnerIds.includes(runner.id);
+ },
},
- fields: [
- tableField({ key: 'status', label: s__('Runners|Status') }),
- tableField({ key: 'summary', label: s__('Runners|Runner'), thClasses: ['gl-lg-w-25p'] }),
- tableField({ key: 'version', label: __('Version') }),
- tableField({ key: 'ipAddress', label: __('IP') }),
- tableField({ key: 'jobCount', label: __('Jobs') }),
- tableField({ key: 'tagList', label: __('Tags'), thClasses: ['gl-lg-w-25p'] }),
- tableField({ key: 'contactedAt', label: __('Last contact') }),
- tableField({ key: 'actions', label: '' }),
- ],
};
</script>
<template>
@@ -74,13 +115,34 @@ export default {
:aria-busy="loading"
:class="tableClass"
:items="runners"
- :fields="$options.fields"
+ :fields="fields"
:tbody-tr-attr="runnerTrAttr"
data-testid="runner-list"
stacked="md"
primary-key="id"
fixed
>
+ <template #head(checkbox)>
+ <!--
+ Checkbox to select all to be added here
+ See https://gitlab.com/gitlab-org/gitlab/-/issues/339525/
+ -->
+ <span></span>
+ </template>
+
+ <template #cell(checkbox)="{ item }">
+ <input
+ type="checkbox"
+ :checked="isChecked(item)"
+ @change="onCheckboxChange(item, $event.target.checked)"
+ />
+ </template>
+
+ <template #head(status)="{ label }">
+ {{ label }}
+ <runner-status-popover />
+ </template>
+
<template #cell(status)="{ item }">
<runner-status-cell :runner="item" />
</template>
@@ -99,12 +161,6 @@ export default {
</tooltip-on-truncate>
</template>
- <template #cell(ipAddress)="{ item: { ipAddress } }">
- <tooltip-on-truncate class="gl-display-block gl-text-truncate" :title="ipAddress">
- {{ ipAddress }}
- </tooltip-on-truncate>
- </template>
-
<template #cell(jobCount)="{ item: { jobCount } }">
{{ formatJobCount(jobCount) }}
</template>
diff --git a/app/assets/javascripts/runner/components/runner_pause_button.vue b/app/assets/javascripts/runner/components/runner_pause_button.vue
index c88634bfbd9..334e5f6023a 100644
--- a/app/assets/javascripts/runner/components/runner_pause_button.vue
+++ b/app/assets/javascripts/runner/components/runner_pause_button.vue
@@ -24,6 +24,7 @@ export default {
default: false,
},
},
+ emits: ['toggledPaused'],
data() {
return {
updating: false,
@@ -83,6 +84,7 @@ export default {
if (errors && errors.length) {
throw new Error(errors.join(' '));
}
+ this.$emit('toggledPaused');
} catch (e) {
this.onError(e);
} finally {
diff --git a/app/assets/javascripts/runner/components/runner_projects.vue b/app/assets/javascripts/runner/components/runner_projects.vue
index f8ec29b8a24..d080d34fdd3 100644
--- a/app/assets/javascripts/runner/components/runner_projects.vue
+++ b/app/assets/javascripts/runner/components/runner_projects.vue
@@ -1,5 +1,5 @@
<script>
-import { GlSkeletonLoading } from '@gitlab/ui';
+import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
import { sprintf, formatNumber } from '~/locale';
import { createAlert } from '~/flash';
import runnerProjectsQuery from '../graphql/details/runner_projects.query.graphql';
diff --git a/app/assets/javascripts/runner/components/runner_status_badge.vue b/app/assets/javascripts/runner/components/runner_status_badge.vue
index 6d0445ecb7a..073d0a49f59 100644
--- a/app/assets/javascripts/runner/components/runner_status_badge.vue
+++ b/app/assets/javascripts/runner/components/runner_status_badge.vue
@@ -3,10 +3,11 @@ import { GlBadge, GlTooltipDirective } from '@gitlab/ui';
import { __, s__, sprintf } from '~/locale';
import { getTimeago } from '~/lib/utils/datetime_utility';
import {
- I18N_ONLINE_RUNNER_TIMEAGO_DESCRIPTION,
- I18N_NEVER_CONTACTED_RUNNER_DESCRIPTION,
- I18N_OFFLINE_RUNNER_TIMEAGO_DESCRIPTION,
- I18N_STALE_RUNNER_DESCRIPTION,
+ I18N_ONLINE_TIMEAGO_TOOLTIP,
+ I18N_NEVER_CONTACTED_TOOLTIP,
+ I18N_OFFLINE_TIMEAGO_TOOLTIP,
+ I18N_STALE_TIMEAGO_TOOLTIP,
+ I18N_STALE_NEVER_CONTACTED_TOOLTIP,
STATUS_ONLINE,
STATUS_NEVER_CONTACTED,
STATUS_OFFLINE,
@@ -32,7 +33,7 @@ export default {
return getTimeago().format(this.runner.contactedAt);
}
// Prevent "just now" from being rendered, in case data is missing.
- return __('n/a');
+ return __('never');
},
badge() {
switch (this.runner?.status) {
@@ -40,35 +41,39 @@ export default {
return {
variant: 'success',
label: s__('Runners|online'),
- tooltip: sprintf(I18N_ONLINE_RUNNER_TIMEAGO_DESCRIPTION, {
- timeAgo: this.contactedAtTimeAgo,
- }),
+ tooltip: this.timeAgoTooltip(I18N_ONLINE_TIMEAGO_TOOLTIP),
};
case STATUS_NEVER_CONTACTED:
return {
variant: 'muted',
label: s__('Runners|never contacted'),
- tooltip: I18N_NEVER_CONTACTED_RUNNER_DESCRIPTION,
+ tooltip: I18N_NEVER_CONTACTED_TOOLTIP,
};
case STATUS_OFFLINE:
return {
variant: 'muted',
label: s__('Runners|offline'),
- tooltip: sprintf(I18N_OFFLINE_RUNNER_TIMEAGO_DESCRIPTION, {
- timeAgo: this.contactedAtTimeAgo,
- }),
+ tooltip: this.timeAgoTooltip(I18N_OFFLINE_TIMEAGO_TOOLTIP),
};
case STATUS_STALE:
return {
variant: 'warning',
label: s__('Runners|stale'),
- tooltip: I18N_STALE_RUNNER_DESCRIPTION,
+ // runner may have contacted (or not) and be stale: consider both cases.
+ tooltip: this.runner.contactedAt
+ ? this.timeAgoTooltip(I18N_STALE_TIMEAGO_TOOLTIP)
+ : I18N_STALE_NEVER_CONTACTED_TOOLTIP,
};
default:
return null;
}
},
},
+ methods: {
+ timeAgoTooltip(text) {
+ return sprintf(text, { timeAgo: this.contactedAtTimeAgo });
+ },
+ },
};
</script>
<template>
diff --git a/app/assets/javascripts/runner/components/runner_status_popover.vue b/app/assets/javascripts/runner/components/runner_status_popover.vue
new file mode 100644
index 00000000000..5b22f7828a1
--- /dev/null
+++ b/app/assets/javascripts/runner/components/runner_status_popover.vue
@@ -0,0 +1,75 @@
+<script>
+import { GlSprintf } from '@gitlab/ui';
+import { duration } from '~/lib/utils/datetime/timeago_utility';
+import HelpPopover from '~/vue_shared/components/help_popover.vue';
+import {
+ I18N_STATUS_POPOVER_TITLE,
+ I18N_STATUS_POPOVER_NEVER_CONTACTED,
+ I18N_STATUS_POPOVER_NEVER_CONTACTED_DESCRIPTION,
+ I18N_STATUS_POPOVER_ONLINE,
+ I18N_STATUS_POPOVER_ONLINE_DESCRIPTION,
+ I18N_STATUS_POPOVER_OFFLINE,
+ I18N_STATUS_POPOVER_OFFLINE_DESCRIPTION,
+ I18N_STATUS_POPOVER_STALE,
+ I18N_STATUS_POPOVER_STALE_DESCRIPTION,
+} from '~/runner/constants';
+
+export default {
+ name: 'RunnerStatusPopover',
+ components: {
+ GlSprintf,
+ HelpPopover,
+ },
+ inject: ['onlineContactTimeoutSecs', 'staleTimeoutSecs'],
+ computed: {
+ onlineContactTimeoutDuration() {
+ return duration(this.onlineContactTimeoutSecs * 1000);
+ },
+ staleTimeoutDuration() {
+ return duration(this.staleTimeoutSecs * 1000);
+ },
+ },
+ I18N_STATUS_POPOVER_TITLE,
+ I18N_STATUS_POPOVER_NEVER_CONTACTED,
+ I18N_STATUS_POPOVER_NEVER_CONTACTED_DESCRIPTION,
+ I18N_STATUS_POPOVER_ONLINE,
+ I18N_STATUS_POPOVER_ONLINE_DESCRIPTION,
+ I18N_STATUS_POPOVER_OFFLINE,
+ I18N_STATUS_POPOVER_OFFLINE_DESCRIPTION,
+ I18N_STATUS_POPOVER_STALE,
+ I18N_STATUS_POPOVER_STALE_DESCRIPTION,
+};
+</script>
+
+<template>
+ <help-popover>
+ <template #title>{{ $options.I18N_STATUS_POPOVER_TITLE }}</template>
+
+ <p class="gl-mb-0">
+ <strong>{{ $options.I18N_STATUS_POPOVER_NEVER_CONTACTED }}</strong>
+ <gl-sprintf :message="$options.I18N_STATUS_POPOVER_NEVER_CONTACTED_DESCRIPTION">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
+ <p class="gl-mb-0">
+ <strong>{{ $options.I18N_STATUS_POPOVER_ONLINE }}</strong>
+ <gl-sprintf :message="$options.I18N_STATUS_POPOVER_ONLINE_DESCRIPTION">
+ <template #elapsedTime>{{ onlineContactTimeoutDuration }}</template>
+ </gl-sprintf>
+ </p>
+ <p class="gl-mb-0">
+ <strong>{{ $options.I18N_STATUS_POPOVER_OFFLINE }}</strong>
+ <gl-sprintf :message="$options.I18N_STATUS_POPOVER_OFFLINE_DESCRIPTION">
+ <template #elapsedTime>{{ onlineContactTimeoutDuration }}</template>
+ </gl-sprintf>
+ </p>
+ <p class="gl-mb-0">
+ <strong>{{ $options.I18N_STATUS_POPOVER_STALE }}</strong>
+ <gl-sprintf :message="$options.I18N_STATUS_POPOVER_STALE_DESCRIPTION">
+ <template #elapsedTime>{{ staleTimeoutDuration }}</template>
+ </gl-sprintf>
+ </p>
+ </help-popover>
+</template>
diff --git a/app/assets/javascripts/runner/components/runner_update_form.vue b/app/assets/javascripts/runner/components/runner_update_form.vue
index e44450a2a8d..119e5236f85 100644
--- a/app/assets/javascripts/runner/components/runner_update_form.vue
+++ b/app/assets/javascripts/runner/components/runner_update_form.vue
@@ -138,7 +138,11 @@ export default {
>
{{ __('Lock to current projects') }}
<template #help>
- {{ s__('Runners|Use the runner for the currently assigned projects only.') }}
+ {{
+ s__(
+ 'Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects.',
+ )
+ }}
</template>
</gl-form-checkbox>
diff --git a/app/assets/javascripts/runner/components/search_tokens/paused_token_config.js b/app/assets/javascripts/runner/components/search_tokens/paused_token_config.js
new file mode 100644
index 00000000000..1bab875a8a1
--- /dev/null
+++ b/app/assets/javascripts/runner/components/search_tokens/paused_token_config.js
@@ -0,0 +1,28 @@
+import { __, s__ } from '~/locale';
+import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
+import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
+import { PARAM_KEY_PAUSED } from '../../constants';
+
+const options = [
+ { value: 'true', title: __('Yes') },
+ { value: 'false', title: __('No') },
+];
+
+export const pausedTokenConfig = {
+ icon: 'pause',
+ title: s__('Runners|Paused'),
+ type: PARAM_KEY_PAUSED,
+ token: BaseToken,
+ unique: true,
+ options: options.map(({ value, title }) => ({
+ value,
+ // Replace whitespace with a special character to avoid
+ // splitting this value.
+ // Replacing in each option, as translations may also
+ // contain spaces!
+ // see: https://gitlab.com/gitlab-org/gitlab/-/issues/344142
+ // see: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1438
+ title: title.replace(' ', '\u00a0'),
+ })),
+ operators: OPERATOR_IS_ONLY,
+};
diff --git a/app/assets/javascripts/runner/components/search_tokens/status_token_config.js b/app/assets/javascripts/runner/components/search_tokens/status_token_config.js
index 79038eb8228..f28bd491ea5 100644
--- a/app/assets/javascripts/runner/components/search_tokens/status_token_config.js
+++ b/app/assets/javascripts/runner/components/search_tokens/status_token_config.js
@@ -2,8 +2,6 @@ import { __, s__ } from '~/locale';
import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
import {
- STATUS_ACTIVE,
- STATUS_PAUSED,
STATUS_ONLINE,
STATUS_OFFLINE,
STATUS_NEVER_CONTACTED,
@@ -12,8 +10,6 @@ import {
} from '../../constants';
const options = [
- { value: STATUS_ACTIVE, title: s__('Runners|Active') },
- { value: STATUS_PAUSED, title: s__('Runners|Paused') },
{ value: STATUS_ONLINE, title: s__('Runners|Online') },
{ value: STATUS_OFFLINE, title: s__('Runners|Offline') },
{ value: STATUS_NEVER_CONTACTED, title: s__('Runners|Never contacted') },
diff --git a/app/assets/javascripts/runner/constants.js b/app/assets/javascripts/runner/constants.js
index bd5be2175ad..b9621c26b59 100644
--- a/app/assets/javascripts/runner/constants.js
+++ b/app/assets/javascripts/runner/constants.js
@@ -21,18 +21,39 @@ export const I18N_GROUP_RUNNER_DESCRIPTION = s__(
);
export const I18N_PROJECT_RUNNER_DESCRIPTION = s__('Runners|Associated with one or more projects');
-// Status
-export const I18N_ONLINE_RUNNER_TIMEAGO_DESCRIPTION = s__(
+// Status help popover
+export const I18N_STATUS_POPOVER_TITLE = s__('Runners|Runner statuses');
+
+export const I18N_STATUS_POPOVER_NEVER_CONTACTED = s__('Runners|Never contacted:');
+export const I18N_STATUS_POPOVER_NEVER_CONTACTED_DESCRIPTION = s__(
+ 'Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)',
+);
+export const I18N_STATUS_POPOVER_ONLINE = s__('Runners|Online:');
+export const I18N_STATUS_POPOVER_ONLINE_DESCRIPTION = s__(
+ 'Runners|Runner has contacted GitLab within the last %{elapsedTime}',
+);
+export const I18N_STATUS_POPOVER_OFFLINE = s__('Runners|Offline:');
+export const I18N_STATUS_POPOVER_OFFLINE_DESCRIPTION = s__(
+ 'Runners|Runner has not contacted GitLab in more than %{elapsedTime}',
+);
+export const I18N_STATUS_POPOVER_STALE = s__('Runners|Stale:');
+export const I18N_STATUS_POPOVER_STALE_DESCRIPTION = s__(
+ 'Runners|Runner has not contacted GitLab in more than %{elapsedTime}',
+);
+
+// Status tooltips
+export const I18N_ONLINE_TIMEAGO_TOOLTIP = s__(
'Runners|Runner is online; last contact was %{timeAgo}',
);
-export const I18N_NEVER_CONTACTED_RUNNER_DESCRIPTION = s__(
- 'Runners|This runner has never contacted this instance',
+export const I18N_NEVER_CONTACTED_TOOLTIP = s__('Runners|Runner has never contacted this instance');
+export const I18N_OFFLINE_TIMEAGO_TOOLTIP = s__(
+ 'Runners|Runner is offline; last contact was %{timeAgo}',
);
-export const I18N_OFFLINE_RUNNER_TIMEAGO_DESCRIPTION = s__(
- 'Runners|No recent contact from this runner; last contact was %{timeAgo}',
+export const I18N_STALE_TIMEAGO_TOOLTIP = s__(
+ 'Runners|Runner is stale; last contact was %{timeAgo}',
);
-export const I18N_STALE_RUNNER_DESCRIPTION = s__(
- 'Runners|No contact from this runner in over 3 months',
+export const I18N_STALE_NEVER_CONTACTED_TOOLTIP = s__(
+ 'Runners|Runner is stale; it has never contacted this instance',
);
// Actions
@@ -46,15 +67,23 @@ export const I18N_RESUME = __('Resume');
export const I18N_RESUME_TOOLTIP = s__('Runners|Resume accepting jobs');
export const I18N_DELETE_RUNNER = s__('Runners|Delete runner');
+export const I18N_DELETE_DISABLED_MANY_PROJECTS = s__(
+ 'Runners|Multi-project runners cannot be deleted',
+);
+export const I18N_DELETE_DISABLED_UNKNOWN_REASON = s__(
+ 'Runners|Runner cannot be deleted, please contact your administrator',
+);
export const I18N_DELETED_TOAST = s__('Runners|Runner %{name} was deleted');
-export const I18N_LOCKED_RUNNER_DESCRIPTION = s__('Runners|You cannot assign to other projects');
+export const I18N_LOCKED_RUNNER_DESCRIPTION = s__(
+ 'Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects.',
+);
// Runner details
export const I18N_ASSIGNED_PROJECTS = s__('Runners|Assigned Projects (%{projectCount})');
export const I18N_NONE = __('None');
-export const I18N_NO_JOBS_FOUND = s__('Runner|This runner has not run any jobs.');
+export const I18N_NO_JOBS_FOUND = s__('Runners|This runner has not run any jobs.');
// Styles
@@ -66,6 +95,7 @@ export const RUNNER_TAG_BG_CLASS = 'gl-bg-blue-100';
// - GlFilteredSearch tokens type
export const PARAM_KEY_STATUS = 'status';
+export const PARAM_KEY_PAUSED = 'paused';
export const PARAM_KEY_RUNNER_TYPE = 'runner_type';
export const PARAM_KEY_TAG = 'tag';
export const PARAM_KEY_SEARCH = 'search';
@@ -83,9 +113,6 @@ export const PROJECT_TYPE = 'PROJECT_TYPE';
// CiRunnerStatus
-export const STATUS_ACTIVE = 'ACTIVE';
-export const STATUS_PAUSED = 'PAUSED';
-
export const STATUS_ONLINE = 'ONLINE';
export const STATUS_NEVER_CONTACTED = 'NEVER_CONTACTED';
export const STATUS_OFFLINE = 'OFFLINE';
diff --git a/app/assets/javascripts/runner/graphql/details/runner_jobs.query.graphql b/app/assets/javascripts/runner/graphql/details/runner_jobs.query.graphql
index 2b1decd3ddd..14585e62bf2 100644
--- a/app/assets/javascripts/runner/graphql/details/runner_jobs.query.graphql
+++ b/app/assets/javascripts/runner/graphql/details/runner_jobs.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getRunnerJobs($id: CiRunnerID!, $first: Int, $last: Int, $before: String, $after: String) {
runner(id: $id) {
diff --git a/app/assets/javascripts/runner/graphql/details/runner_projects.query.graphql b/app/assets/javascripts/runner/graphql/details/runner_projects.query.graphql
index f97237b8267..cb27de7c200 100644
--- a/app/assets/javascripts/runner/graphql/details/runner_projects.query.graphql
+++ b/app/assets/javascripts/runner/graphql/details/runner_projects.query.graphql
@@ -1,4 +1,4 @@
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getRunnerProjects(
$id: CiRunnerID!
diff --git a/app/assets/javascripts/runner/graphql/list/admin_runners.query.graphql b/app/assets/javascripts/runner/graphql/list/admin_runners.query.graphql
index 8df4c2fc65c..5d0450e7418 100644
--- a/app/assets/javascripts/runner/graphql/list/admin_runners.query.graphql
+++ b/app/assets/javascripts/runner/graphql/list/admin_runners.query.graphql
@@ -1,11 +1,12 @@
#import "~/runner/graphql/list/list_item.fragment.graphql"
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getRunners(
$before: String
$after: String
$first: Int
$last: Int
+ $paused: Boolean
$status: CiRunnerStatus
$type: CiRunnerType
$tagList: [String!]
@@ -17,6 +18,7 @@ query getRunners(
after: $after
first: $first
last: $last
+ paused: $paused
status: $status
type: $type
tagList: $tagList
diff --git a/app/assets/javascripts/runner/graphql/list/admin_runners_count.query.graphql b/app/assets/javascripts/runner/graphql/list/admin_runners_count.query.graphql
index 181a4495cae..1dd258a3524 100644
--- a/app/assets/javascripts/runner/graphql/list/admin_runners_count.query.graphql
+++ b/app/assets/javascripts/runner/graphql/list/admin_runners_count.query.graphql
@@ -1,10 +1,11 @@
query getRunnersCount(
+ $paused: Boolean
$status: CiRunnerStatus
$type: CiRunnerType
$tagList: [String!]
$search: String
) {
- runners(status: $status, type: $type, tagList: $tagList, search: $search) {
+ runners(paused: $paused, status: $status, type: $type, tagList: $tagList, search: $search) {
count
}
}
diff --git a/app/assets/javascripts/runner/graphql/list/checked_runner_ids.query.graphql b/app/assets/javascripts/runner/graphql/list/checked_runner_ids.query.graphql
new file mode 100644
index 00000000000..c01f1edb451
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/list/checked_runner_ids.query.graphql
@@ -0,0 +1,3 @@
+query getCheckedRunnerIds {
+ checkedRunnerIds @client
+}
diff --git a/app/assets/javascripts/runner/graphql/list/group_runners.query.graphql b/app/assets/javascripts/runner/graphql/list/group_runners.query.graphql
index b517f5e89a8..b4f2b5cd8c8 100644
--- a/app/assets/javascripts/runner/graphql/list/group_runners.query.graphql
+++ b/app/assets/javascripts/runner/graphql/list/group_runners.query.graphql
@@ -1,5 +1,5 @@
#import "~/runner/graphql/list/list_item.fragment.graphql"
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getGroupRunners(
$groupFullPath: ID!
@@ -7,6 +7,7 @@ query getGroupRunners(
$after: String
$first: Int
$last: Int
+ $paused: Boolean
$status: CiRunnerStatus
$type: CiRunnerType
$search: String
@@ -20,6 +21,7 @@ query getGroupRunners(
after: $after
first: $first
last: $last
+ paused: $paused
status: $status
type: $type
search: $search
@@ -30,6 +32,7 @@ query getGroupRunners(
editUrl
node {
...ListItem
+ projectCount # Used to determine why some project runners can't be deleted
}
}
pageInfo {
diff --git a/app/assets/javascripts/runner/graphql/list/group_runners_count.query.graphql b/app/assets/javascripts/runner/graphql/list/group_runners_count.query.graphql
index 554eb09e372..958b4ea0dd3 100644
--- a/app/assets/javascripts/runner/graphql/list/group_runners_count.query.graphql
+++ b/app/assets/javascripts/runner/graphql/list/group_runners_count.query.graphql
@@ -1,5 +1,6 @@
query getGroupRunnersCount(
$groupFullPath: ID!
+ $paused: Boolean
$status: CiRunnerStatus
$type: CiRunnerType
$tagList: [String!]
@@ -9,6 +10,7 @@ query getGroupRunnersCount(
id # Apollo required
runners(
membership: DESCENDANTS
+ paused: $paused
status: $status
type: $type
tagList: $tagList
diff --git a/app/assets/javascripts/runner/graphql/list/local_state.js b/app/assets/javascripts/runner/graphql/list/local_state.js
new file mode 100644
index 00000000000..e87bc72c86a
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/list/local_state.js
@@ -0,0 +1,63 @@
+import { makeVar } from '@apollo/client/core';
+import typeDefs from './typedefs.graphql';
+
+/**
+ * Local state for checkable runner items.
+ *
+ * Usage:
+ *
+ * ```
+ * import { createLocalState } from '~/runner/graphql/list/local_state';
+ *
+ * // initialize local state
+ * const { cacheConfig, typeDefs, localMutations } = createLocalState();
+ *
+ * // configure the client
+ * apolloClient = createApolloClient({}, { cacheConfig, typeDefs });
+ *
+ * // modify local state
+ * localMutations.setRunnerChecked( ... )
+ * ```
+ *
+ * Note: Currently only in use behind a feature flag:
+ * admin_runners_bulk_delete for the admin list, rollout issue:
+ * https://gitlab.com/gitlab-org/gitlab/-/issues/353981
+ *
+ * @returns {Object} An object to configure an Apollo client:
+ * contains cacheConfig, typeDefs, localMutations.
+ */
+export const createLocalState = () => {
+ const checkedRunnerIdsVar = makeVar({});
+
+ const cacheConfig = {
+ typePolicies: {
+ Query: {
+ fields: {
+ checkedRunnerIds() {
+ return Object.entries(checkedRunnerIdsVar())
+ .filter(([, isChecked]) => isChecked)
+ .map(([key]) => key);
+ },
+ },
+ },
+ },
+ };
+
+ const localMutations = {
+ setRunnerChecked({ runner, isChecked }) {
+ checkedRunnerIdsVar({
+ ...checkedRunnerIdsVar(),
+ [runner.id]: isChecked,
+ });
+ },
+ clearChecked() {
+ checkedRunnerIdsVar({});
+ },
+ };
+
+ return {
+ cacheConfig,
+ typeDefs,
+ localMutations,
+ };
+};
diff --git a/app/assets/javascripts/runner/graphql/list/typedefs.graphql b/app/assets/javascripts/runner/graphql/list/typedefs.graphql
new file mode 100644
index 00000000000..24e9e20cc8c
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/list/typedefs.graphql
@@ -0,0 +1,3 @@
+extend type Query {
+ checkedRunnerIds: [ID!]!
+}
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 35fd7fff6d3..b299d7c40fe 100644
--- a/app/assets/javascripts/runner/group_runners/group_runners_app.vue
+++ b/app/assets/javascripts/runner/group_runners/group_runners_app.vue
@@ -1,9 +1,9 @@
<script>
import { GlBadge, GlLink } from '@gitlab/ui';
import { createAlert } from '~/flash';
-import { fetchPolicies } from '~/lib/graphql';
import { updateHistory } from '~/lib/utils/url_utility';
import { formatNumber } from '~/locale';
+import { fetchPolicies } from '~/lib/graphql';
import RegistrationDropdown from '../components/registration/registration_dropdown.vue';
import RunnerFilteredSearchBar from '../components/runner_filtered_search_bar.vue';
@@ -14,6 +14,7 @@ import RunnerPagination from '../components/runner_pagination.vue';
import RunnerTypeTabs from '../components/runner_type_tabs.vue';
import RunnerActionsCell from '../components/cells/runner_actions_cell.vue';
+import { pausedTokenConfig } from '../components/search_tokens/paused_token_config';
import { statusTokenConfig } from '../components/search_tokens/status_token_config';
import {
GROUP_FILTERED_SEARCH_NAMESPACE,
@@ -35,7 +36,7 @@ import { captureException } from '../sentry_utils';
const runnersCountSmartQuery = {
query: groupRunnersCountQuery,
- fetchPolicy: fetchPolicies.CACHE_AND_NETWORK,
+ fetchPolicy: fetchPolicies.NETWORK_ONLY,
update(data) {
return data?.group?.runners?.count;
},
@@ -85,10 +86,7 @@ export default {
apollo: {
runners: {
query: groupRunnersQuery,
- // Runners can be updated by users directly in this list.
- // A "cache and network" policy prevents outdated filtered
- // results.
- fetchPolicy: fetchPolicies.CACHE_AND_NETWORK,
+ fetchPolicy: fetchPolicies.NETWORK_ONLY,
variables() {
return this.variables;
},
@@ -192,7 +190,7 @@ export default {
return !this.runnersLoading && !this.runners.items.length;
},
searchTokens() {
- return [statusTokenConfig];
+ return [pausedTokenConfig, statusTokenConfig];
},
filteredSearchNamespace() {
return `${GROUP_FILTERED_SEARCH_NAMESPACE}/${this.groupFullPath}`;
@@ -241,9 +239,18 @@ export default {
editUrl(runner) {
return this.runners.urlsById[runner.id]?.edit;
},
+ refetchFilteredCounts() {
+ this.$apollo.queries.allRunnersCount.refetch();
+ this.$apollo.queries.groupRunnersCount.refetch();
+ this.$apollo.queries.projectRunnersCount.refetch();
+ },
+ onToggledPaused() {
+ // When a runner is Paused, the tab count can
+ // become stale, refetch outdated counts.
+ this.refetchFilteredCounts();
+ },
onDeleted({ message }) {
this.$root.$toast?.show(message);
- this.$apollo.queries.runners.refetch();
},
reportToSentry(error) {
captureException({ error, component: this.$options.name });
@@ -302,7 +309,12 @@ export default {
</gl-link>
</template>
<template #runner-actions-cell="{ runner }">
- <runner-actions-cell :runner="runner" :edit-url="editUrl(runner)" @deleted="onDeleted" />
+ <runner-actions-cell
+ :runner="runner"
+ :edit-url="editUrl(runner)"
+ @toggledPaused="onToggledPaused"
+ @deleted="onDeleted"
+ />
</template>
</runner-list>
<runner-pagination
diff --git a/app/assets/javascripts/runner/group_runners/index.js b/app/assets/javascripts/runner/group_runners/index.js
index 60b7a7ab541..0dade30f820 100644
--- a/app/assets/javascripts/runner/group_runners/index.js
+++ b/app/assets/javascripts/runner/group_runners/index.js
@@ -20,6 +20,8 @@ export const initGroupRunners = (selector = '#js-group-runners') => {
groupId,
groupFullPath,
groupRunnersLimitedCount,
+ onlineContactTimeoutSecs,
+ staleTimeoutSecs,
} = el.dataset;
const apolloProvider = new VueApollo({
@@ -32,6 +34,8 @@ export const initGroupRunners = (selector = '#js-group-runners') => {
provide: {
runnerInstallHelpPage,
groupId,
+ onlineContactTimeoutSecs: parseInt(onlineContactTimeoutSecs, 10),
+ staleTimeoutSecs: parseInt(staleTimeoutSecs, 10),
},
render(h) {
return h(GroupRunnersApp, {
diff --git a/app/assets/javascripts/runner/runner_search_utils.js b/app/assets/javascripts/runner/runner_search_utils.js
index fe141332be3..5e3c412ddb6 100644
--- a/app/assets/javascripts/runner/runner_search_utils.js
+++ b/app/assets/javascripts/runner/runner_search_utils.js
@@ -5,7 +5,9 @@ import {
urlQueryToFilter,
prepareTokens,
} from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
+import { parseBoolean } from '~/lib/utils/common_utils';
import {
+ PARAM_KEY_PAUSED,
PARAM_KEY_STATUS,
PARAM_KEY_RUNNER_TYPE,
PARAM_KEY_TAG,
@@ -83,6 +85,19 @@ const getPaginationFromParams = (params) => {
// Outdated URL parameters
const STATUS_NOT_CONNECTED = 'NOT_CONNECTED';
+const STATUS_ACTIVE = 'ACTIVE';
+const STATUS_PAUSED = 'PAUSED';
+
+/**
+ * Replaces params into a URL
+ *
+ * @param {String} url - Original URL
+ * @param {Object} params - Query parameters to update
+ * @returns Updated URL
+ */
+const updateUrlParams = (url, params = {}) => {
+ return setUrlParams(params, url, false, true, true);
+};
/**
* Returns an updated URL for old (or deprecated) admin runner URLs.
@@ -98,14 +113,26 @@ export const updateOutdatedUrl = (url = window.location.href) => {
const params = queryToObject(query, { gatherArrays: true });
- const runnerType = params[PARAM_KEY_STATUS]?.[0] || null;
- if (runnerType === STATUS_NOT_CONNECTED) {
- const updatedParams = {
- [PARAM_KEY_STATUS]: [STATUS_NEVER_CONTACTED],
- };
- return setUrlParams(updatedParams, url, false, true, true);
+ const status = params[PARAM_KEY_STATUS]?.[0] || null;
+
+ switch (status) {
+ case STATUS_NOT_CONNECTED:
+ return updateUrlParams(url, {
+ [PARAM_KEY_STATUS]: [STATUS_NEVER_CONTACTED],
+ });
+ case STATUS_ACTIVE:
+ return updateUrlParams(url, {
+ [PARAM_KEY_PAUSED]: ['false'],
+ [PARAM_KEY_STATUS]: [], // Important! clear PARAM_KEY_STATUS to avoid a redirection loop!
+ });
+ case STATUS_PAUSED:
+ return updateUrlParams(url, {
+ [PARAM_KEY_PAUSED]: ['true'],
+ [PARAM_KEY_STATUS]: [], // Important! clear PARAM_KEY_STATUS to avoid a redirection loop!
+ });
+ default:
+ return null;
}
- return null;
};
/**
@@ -121,7 +148,7 @@ export const fromUrlQueryToSearch = (query = window.location.search) => {
runnerType,
filters: prepareTokens(
urlQueryToFilter(query, {
- filterNamesAllowList: [PARAM_KEY_STATUS, PARAM_KEY_TAG],
+ filterNamesAllowList: [PARAM_KEY_PAUSED, PARAM_KEY_STATUS, PARAM_KEY_TAG],
filteredSearchTermKey: PARAM_KEY_SEARCH,
}),
),
@@ -195,6 +222,12 @@ export const fromSearchToVariables = ({
filterVariables.search = queryObj[PARAM_KEY_SEARCH];
filterVariables.tagList = queryObj[PARAM_KEY_TAG];
+ if (queryObj[PARAM_KEY_PAUSED]) {
+ filterVariables.paused = parseBoolean(queryObj[PARAM_KEY_PAUSED]);
+ } else {
+ filterVariables.paused = undefined;
+ }
+
if (runnerType) {
filterVariables.type = runnerType;
}
diff --git a/app/assets/javascripts/runner/utils.js b/app/assets/javascripts/runner/utils.js
index 6e4c8c45e7b..1f7794720de 100644
--- a/app/assets/javascripts/runner/utils.js
+++ b/app/assets/javascripts/runner/utils.js
@@ -24,7 +24,7 @@ export const formatJobCount = (jobCount) => {
* @param {Object} options
* @returns Field object to add to GlTable fields
*/
-export const tableField = ({ key, label = '', thClasses = [] }) => {
+export const tableField = ({ key, label = '', thClasses = [], ...options }) => {
return {
key,
label,
@@ -32,6 +32,7 @@ export const tableField = ({ key, label = '', thClasses = [] }) => {
tdAttr: {
'data-testid': `td-${key}`,
},
+ ...options,
};
};
diff --git a/app/assets/javascripts/search/store/actions.js b/app/assets/javascripts/search/store/actions.js
index a6af5644681..40513a7f363 100644
--- a/app/assets/javascripts/search/store/actions.js
+++ b/app/assets/javascripts/search/store/actions.js
@@ -18,31 +18,35 @@ export const fetchGroups = ({ commit }, search) => {
});
};
-export const fetchProjects = ({ commit, state }, search) => {
+export const fetchProjects = ({ commit, state }, search, emptyCallback = () => {}) => {
commit(types.REQUEST_PROJECTS);
const groupId = state.query?.group_id;
- const callback = (data) => {
- if (data) {
- commit(types.RECEIVE_PROJECTS_SUCCESS, data);
- } else {
- createFlash({ message: __('There was an error fetching projects') });
- commit(types.RECEIVE_PROJECTS_ERROR);
- }
+
+ const handleCatch = () => {
+ createFlash({ message: __('There was an error fetching projects') });
+ commit(types.RECEIVE_PROJECTS_ERROR);
+ };
+ const handleSuccess = ({ data }) => {
+ commit(types.RECEIVE_PROJECTS_SUCCESS, data);
};
if (groupId) {
- // TODO (https://gitlab.com/gitlab-org/gitlab/-/issues/323331): For errors `createFlash` is called twice; in `callback` and in `Api.groupProjects`
Api.groupProjects(
groupId,
search,
- { order_by: 'similarity', with_shared: false, include_subgroups: true },
- callback,
- );
+ {
+ order_by: 'similarity',
+ with_shared: false,
+ include_subgroups: true,
+ },
+ emptyCallback,
+ true,
+ )
+ .then(handleSuccess)
+ .catch(handleCatch);
} else {
// The .catch() is due to the API method not handling a rejection properly
- Api.projects(search, { order_by: 'similarity' }, callback).catch(() => {
- callback();
- });
+ Api.projects(search, { order_by: 'similarity' }).then(handleSuccess).catch(handleCatch);
}
};
diff --git a/app/assets/javascripts/search/store/utils.js b/app/assets/javascripts/search/store/utils.js
index 6b56ff0b5e5..f8198017bf8 100644
--- a/app/assets/javascripts/search/store/utils.js
+++ b/app/assets/javascripts/search/store/utils.js
@@ -1,4 +1,4 @@
-import AccessorUtilities from '../../lib/utils/accessor';
+import AccessorUtilities from '~/lib/utils/accessor';
import { MAX_FREQUENT_ITEMS, MAX_FREQUENCY, SIDEBAR_PARAMS } from './constants';
function extractKeys(object, keyList) {
diff --git a/app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue b/app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue
index 42d6444e690..a4254a355a2 100644
--- a/app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue
+++ b/app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue
@@ -2,6 +2,7 @@
import { GlDropdownItem, GlAvatar, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import highlight from '~/lib/utils/highlight';
import { truncateNamespace } from '~/lib/utils/text_utility';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
export default {
name: 'SearchableDropdownItem',
@@ -46,6 +47,7 @@ export default {
return highlight(this.item[this.name], this.searchText);
},
},
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
@@ -61,7 +63,7 @@ export default {
:src="item.avatar_url"
:entity-id="item.id"
:entity-name="item[name]"
- shape="rect"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
:size="32"
/>
<div class="gl-display-flex gl-flex-direction-column">
diff --git a/app/assets/javascripts/search_settings/components/search_settings.vue b/app/assets/javascripts/search_settings/components/search_settings.vue
index 3e23b8a3435..f6439c6f4c4 100644
--- a/app/assets/javascripts/search_settings/components/search_settings.vue
+++ b/app/assets/javascripts/search_settings/components/search_settings.vue
@@ -1,6 +1,6 @@
<script>
import { GlSearchBoxByType } from '@gitlab/ui';
-import { uniq, escapeRegExp } from 'lodash';
+import { escapeRegExp } from 'lodash';
import {
EXCLUDED_NODES,
HIDE_CLASS,
@@ -60,41 +60,42 @@ const hideSectionsExcept = (sectionSelector, visibleSections) => {
});
};
-const transformMatchElement = (element, searchTerm) => {
- const textStr = element.textContent;
+const highlightTextNode = (textNode, searchTerm) => {
const escapedSearchTerm = new RegExp(`(${escapeRegExp(searchTerm)})`, 'gi');
+ const textList = textNode.data.split(escapedSearchTerm);
+
+ return textList.reduce((documentFragment, text) => {
+ let addElement;
- 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;
+ } else {
+ addElement = document.createTextNode(text);
}
- replaceFragment.appendChild(addElement);
- });
- return replaceFragment;
+ documentFragment.appendChild(addElement);
+ return documentFragment;
+ }, document.createDocumentFragment());
};
-const highlightElements = (elements = [], searchTerm) => {
- elements.forEach((element) => {
- const replaceFragment = transformMatchElement(element, searchTerm);
- element.innerHTML = '';
- element.appendChild(replaceFragment);
+const highlightText = (textNodes = [], searchTerm) => {
+ textNodes.forEach((textNode) => {
+ const fragmentWithHighlights = highlightTextNode(textNode, searchTerm);
+ textNode.parentElement.replaceChild(fragmentWithHighlights, textNode);
});
};
-const displayResults = ({ sectionSelector, expandSection, searchTerm }, matches) => {
- const elements = matches.map((match) => match.parentElement);
- const sections = uniq(elements.map((element) => findSettingsSection(sectionSelector, element)));
+const displayResults = ({ sectionSelector, expandSection, searchTerm }, matchingTextNodes) => {
+ const sections = Array.from(
+ new Set(matchingTextNodes.map((node) => findSettingsSection(sectionSelector, node))),
+ );
hideSectionsExcept(sectionSelector, sections);
sections.forEach(expandSection);
- highlightElements(elements, searchTerm);
+ highlightText(matchingTextNodes, searchTerm);
};
const clearResults = (params) => {
@@ -114,13 +115,13 @@ const search = (root, searchTerm) => {
: NodeFilter.FILTER_REJECT;
},
});
- const results = [];
+ const textNodes = [];
for (let currentNode = iterator.nextNode(); currentNode; currentNode = iterator.nextNode()) {
- results.push(currentNode);
+ textNodes.push(currentNode);
}
- return results;
+ return textNodes;
};
export default {
diff --git a/app/assets/javascripts/security_configuration/components/app.vue b/app/assets/javascripts/security_configuration/components/app.vue
index c48c9067250..ba0120a0a70 100644
--- a/app/assets/javascripts/security_configuration/components/app.vue
+++ b/app/assets/javascripts/security_configuration/components/app.vue
@@ -30,6 +30,7 @@ export const i18n = {
securityTrainingDescription: s__(
'SecurityConfiguration|Enable security training to help your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability.',
),
+ securityTrainingDoc: s__('SecurityConfiguration|Learn more about vulnerability training'),
};
export default {
@@ -50,7 +51,7 @@ export default {
TrainingProviderList,
},
mixins: [glFeatureFlagsMixin()],
- inject: ['projectFullPath'],
+ inject: ['projectFullPath', 'vulnerabilityTrainingDocsPath'],
props: {
augmentedSecurityFeatures: {
type: Array,
@@ -143,7 +144,6 @@ export default {
<local-storage-sync
v-model="autoDevopsEnabledAlertDismissedProjects"
:storage-key="$options.autoDevopsEnabledAlertStorageKey"
- as-json
/>
<user-callout-dismisser
@@ -262,6 +262,11 @@ export default {
<p>
{{ $options.i18n.securityTrainingDescription }}
</p>
+ <p>
+ <gl-link :href="vulnerabilityTrainingDocsPath">{{
+ $options.i18n.securityTrainingDoc
+ }}</gl-link>
+ </p>
</template>
<template #features>
<training-provider-list />
diff --git a/app/assets/javascripts/security_configuration/components/constants.js b/app/assets/javascripts/security_configuration/components/constants.js
index 39a2939f52a..6db28ef0fad 100644
--- a/app/assets/javascripts/security_configuration/components/constants.js
+++ b/app/assets/javascripts/security_configuration/components/constants.js
@@ -50,18 +50,24 @@ export const SAST_IAC_CONFIG_HELP_PATH = helpPagePath(
export const DAST_NAME = __('Dynamic Application Security Testing (DAST)');
export const DAST_SHORT_NAME = s__('ciReport|DAST');
-export const DAST_DESCRIPTION = __('Analyze a review version of your web application.');
+export const DAST_DESCRIPTION = s__(
+ 'ciReport|Analyze a deployed version of your web application for known vulnerabilities by examining it from the outside in. DAST works by simulating external attacks on your application while it is running.',
+);
export const DAST_HELP_PATH = helpPagePath('user/application_security/dast/index');
export const DAST_CONFIG_HELP_PATH = helpPagePath('user/application_security/dast/index', {
anchor: 'enable-dast',
});
+export const DAST_BADGE_TEXT = __('Available on-demand');
+export const DAST_BADGE_TOOLTIP = __(
+ 'On-demand scans run outside of the DevOps cycle and find vulnerabilities in your projects',
+);
-export const DAST_PROFILES_NAME = __('DAST Scans');
+export const DAST_PROFILES_NAME = __('DAST profiles');
export const DAST_PROFILES_DESCRIPTION = s__(
'SecurityConfiguration|Manage profiles for use by DAST scans.',
);
export const DAST_PROFILES_HELP_PATH = helpPagePath('user/application_security/dast/index');
-export const DAST_PROFILES_CONFIG_TEXT = s__('SecurityConfiguration|Manage scans');
+export const DAST_PROFILES_CONFIG_TEXT = s__('SecurityConfiguration|Manage profiles');
export const SECRET_DETECTION_NAME = __('Secret Detection');
export const SECRET_DETECTION_DESCRIPTION = __(
@@ -171,18 +177,23 @@ export const securityFeatures = [
type: REPORT_TYPE_SAST_IAC,
},
{
- name: DAST_NAME,
- shortName: DAST_SHORT_NAME,
- description: DAST_DESCRIPTION,
- helpPath: DAST_HELP_PATH,
- configurationHelpPath: DAST_CONFIG_HELP_PATH,
- type: REPORT_TYPE_DAST,
+ badge: {
+ text: DAST_BADGE_TEXT,
+ tooltipText: DAST_BADGE_TOOLTIP,
+ variant: 'info',
+ },
secondary: {
type: REPORT_TYPE_DAST_PROFILES,
name: DAST_PROFILES_NAME,
description: DAST_PROFILES_DESCRIPTION,
configurationText: DAST_PROFILES_CONFIG_TEXT,
},
+ name: DAST_NAME,
+ shortName: DAST_SHORT_NAME,
+ description: DAST_DESCRIPTION,
+ helpPath: DAST_HELP_PATH,
+ configurationHelpPath: DAST_CONFIG_HELP_PATH,
+ type: REPORT_TYPE_DAST,
},
{
name: DEPENDENCY_SCANNING_NAME,
diff --git a/app/assets/javascripts/security_configuration/components/feature_card.vue b/app/assets/javascripts/security_configuration/components/feature_card.vue
index cd5ad86e1a8..309e5f21445 100644
--- a/app/assets/javascripts/security_configuration/components/feature_card.vue
+++ b/app/assets/javascripts/security_configuration/components/feature_card.vue
@@ -1,7 +1,9 @@
<script>
import { GlButton, GlCard, GlIcon, GlLink } from '@gitlab/ui';
import { __, s__, sprintf } from '~/locale';
+import { REPORT_TYPE_SAST_IAC } from '~/vue_shared/security_reports/constants';
import ManageViaMr from '~/vue_shared/security_configuration/components/manage_via_mr.vue';
+import FeatureCardBadge from './feature_card_badge.vue';
export default {
components: {
@@ -9,6 +11,7 @@ export default {
GlCard,
GlIcon,
GlLink,
+ FeatureCardBadge,
ManageViaMr,
},
props: {
@@ -36,11 +39,14 @@ export default {
text: this.$options.i18n.enableFeature,
};
- button.category = 'secondary';
+ button.category = this.feature.category || 'secondary';
button.text = sprintf(button.text, { feature: this.shortName });
return button;
},
+ manageViaMrButtonCategory() {
+ return this.feature.category || 'secondary';
+ },
showManageViaMr() {
return ManageViaMr.canRender(this.feature);
},
@@ -48,19 +54,32 @@ export default {
return { 'gl-bg-gray-10': !this.available };
},
statusClasses() {
- const { enabled } = this;
+ const { enabled, hasBadge } = this;
return {
'gl-ml-auto': true,
'gl-flex-shrink-0': true,
'gl-text-gray-500': !enabled,
'gl-text-green-500': enabled,
+ 'gl-w-full': hasBadge,
+ 'gl-justify-content-space-between': hasBadge,
+ 'gl-display-flex': hasBadge,
+ 'gl-mb-4': hasBadge,
};
},
hasSecondary() {
const { name, description, configurationText } = this.feature.secondary ?? {};
return Boolean(name && description && configurationText);
},
+ // This condition is a temporary hack to not display any wrong information
+ // until this BE Bug is fixed: https://gitlab.com/gitlab-org/gitlab/-/issues/350307.
+ // More Information: https://gitlab.com/gitlab-org/gitlab/-/issues/350307#note_825447417
+ isNotSastIACTemporaryHack() {
+ return this.feature.type !== REPORT_TYPE_SAST_IAC;
+ },
+ hasBadge() {
+ return Boolean(this.available && this.feature.badge?.text);
+ },
},
methods: {
onError(message) {
@@ -81,21 +100,31 @@ export default {
<template>
<gl-card :class="cardClasses">
- <div class="gl-display-flex gl-align-items-baseline">
+ <div
+ class="gl-display-flex gl-align-items-baseline"
+ :class="{ 'gl-flex-direction-column-reverse': hasBadge }"
+ >
<h3 class="gl-font-lg gl-m-0 gl-mr-3">{{ feature.name }}</h3>
<div
+ v-if="isNotSastIACTemporaryHack"
:class="statusClasses"
data-testid="feature-status"
:data-qa-selector="`${feature.type}_status`"
>
+ <feature-card-badge
+ v-if="hasBadge"
+ :badge="feature.badge"
+ :badge-href="feature.badge.badgeHref"
+ />
+
<template v-if="enabled">
<gl-icon name="check-circle-filled" />
<span class="gl-text-green-700">{{ $options.i18n.enabled }}</span>
</template>
<template v-else-if="available">
- {{ $options.i18n.notEnabled }}
+ <span>{{ $options.i18n.notEnabled }}</span>
</template>
<template v-else>
@@ -109,7 +138,7 @@ export default {
<gl-link :href="feature.helpPath">{{ $options.i18n.learnMore }}</gl-link>
</p>
- <template v-if="available">
+ <template v-if="available && isNotSastIACTemporaryHack">
<gl-button
v-if="feature.configurationPath"
:href="feature.configurationPath"
@@ -125,7 +154,7 @@ export default {
v-else-if="showManageViaMr"
:feature="feature"
variant="confirm"
- category="secondary"
+ :category="manageViaMrButtonCategory"
class="gl-mt-5"
:data-qa-selector="`${feature.type}_mr_button`"
@error="onError"
diff --git a/app/assets/javascripts/security_configuration/components/feature_card_badge.vue b/app/assets/javascripts/security_configuration/components/feature_card_badge.vue
new file mode 100644
index 00000000000..0907e33c8e2
--- /dev/null
+++ b/app/assets/javascripts/security_configuration/components/feature_card_badge.vue
@@ -0,0 +1,40 @@
+<script>
+import { GlBadge, GlTooltip } from '@gitlab/ui';
+
+export default {
+ components: {
+ GlBadge,
+ GlTooltip,
+ },
+ props: {
+ badge: {
+ type: Object,
+ required: true,
+ },
+ badgeHref: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+};
+</script>
+
+<template>
+ <span>
+ <gl-tooltip
+ v-if="badge.tooltipText"
+ placement="top"
+ boundary="window"
+ title="Tooltip title"
+ :target="() => $refs.badge"
+ >
+ {{ badge.tooltipText }}
+ </gl-tooltip>
+ <span ref="badge">
+ <gl-badge size="sm" :href="badgeHref" :variant="badge.variant">
+ {{ badge.text }}
+ </gl-badge>
+ </span>
+ </span>
+</template>
diff --git a/app/assets/javascripts/security_configuration/components/training_provider_list.vue b/app/assets/javascripts/security_configuration/components/training_provider_list.vue
index bb540303cfd..ef50d085ae8 100644
--- a/app/assets/javascripts/security_configuration/components/training_provider_list.vue
+++ b/app/assets/javascripts/security_configuration/components/training_provider_list.vue
@@ -3,6 +3,7 @@ import {
GlAlert,
GlTooltipDirective,
GlCard,
+ GlFormRadio,
GlToggle,
GlLink,
GlSkeletonLoader,
@@ -44,6 +45,7 @@ export default {
components: {
GlAlert,
GlCard,
+ GlFormRadio,
GlToggle,
GlLink,
GlSkeletonLoader,
@@ -79,6 +81,9 @@ export default {
};
},
computed: {
+ primaryProviderId() {
+ return this.securityTrainingProviders.find(({ isPrimary }) => isPrimary)?.id;
+ },
enabledProviders() {
return this.securityTrainingProviders.filter(({ isEnabled }) => isEnabled);
},
@@ -256,31 +261,19 @@ export default {
{{ __('Learn more.') }}
</gl-link>
</p>
- <!-- Note: The following `div` and it's content will be replaced by 'GlFormRadio' once https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1720#note_857342988 is resolved -->
- <div
- class="gl-form-radio custom-control custom-radio"
- data-testid="primary-provider-radio"
+ <gl-form-radio
+ :checked="primaryProviderId"
+ :disabled="!provider.isEnabled"
+ :value="provider.id"
+ @change="setPrimaryProvider(provider)"
>
- <input
- :id="`security-training-provider-${provider.id}`"
- type="radio"
- :checked="provider.isPrimary"
- class="custom-control-input"
- :disabled="!provider.isEnabled"
- @change="setPrimaryProvider(provider)"
- />
- <label
- class="custom-control-label"
- :for="`security-training-provider-${provider.id}`"
- >
- {{ $options.i18n.primaryTraining }}
- </label>
+ {{ $options.i18n.primaryTraining }}
<gl-icon
v-gl-tooltip="$options.i18n.primaryTrainingDescription"
name="information-o"
class="gl-ml-2 gl-cursor-help"
/>
- </div>
+ </gl-form-radio>
</div>
</div>
</gl-card>
diff --git a/app/assets/javascripts/security_configuration/index.js b/app/assets/javascripts/security_configuration/index.js
index 8416692dd27..65cf1ec27a3 100644
--- a/app/assets/javascripts/security_configuration/index.js
+++ b/app/assets/javascripts/security_configuration/index.js
@@ -25,6 +25,7 @@ export const initSecurityConfiguration = (el) => {
gitlabCiHistoryPath,
autoDevopsHelpPagePath,
autoDevopsPath,
+ vulnerabilityTrainingDocsPath,
} = el.dataset;
const { augmentedSecurityFeatures, augmentedComplianceFeatures } = augmentFeatures(
@@ -41,6 +42,7 @@ export const initSecurityConfiguration = (el) => {
upgradePath,
autoDevopsHelpPagePath,
autoDevopsPath,
+ vulnerabilityTrainingDocsPath,
},
render(createElement) {
return createElement(SecurityConfigurationApp, {
diff --git a/app/assets/javascripts/security_configuration/utils.js b/app/assets/javascripts/security_configuration/utils.js
index 173560f8370..df23698ba7e 100644
--- a/app/assets/javascripts/security_configuration/utils.js
+++ b/app/assets/javascripts/security_configuration/utils.js
@@ -30,6 +30,10 @@ export const augmentFeatures = (securityFeatures, complianceFeatures, features =
augmented.secondary = { ...augmented.secondary, ...featuresByType[feature.secondary.type] };
}
+ if (augmented.badge && augmented.metaInfoPath) {
+ augmented.badge.badgeHref = augmented.metaInfoPath;
+ }
+
return augmented;
};
diff --git a/app/assets/javascripts/serverless/components/missing_prometheus.vue b/app/assets/javascripts/serverless/components/missing_prometheus.vue
index 0023c64e3e4..d9e6bb5009e 100644
--- a/app/assets/javascripts/serverless/components/missing_prometheus.vue
+++ b/app/assets/javascripts/serverless/components/missing_prometheus.vue
@@ -1,7 +1,7 @@
<script>
import { GlButton, GlLink } from '@gitlab/ui';
import { mapState } from 'vuex';
-import { s__ } from '../../locale';
+import { s__ } from '~/locale';
export default {
components: {
diff --git a/app/assets/javascripts/serverless/components/url.vue b/app/assets/javascripts/serverless/components/url.vue
index 79a1f39c7dd..b105f49e475 100644
--- a/app/assets/javascripts/serverless/components/url.vue
+++ b/app/assets/javascripts/serverless/components/url.vue
@@ -1,5 +1,5 @@
<script>
-import ClipboardButton from '../../vue_shared/components/clipboard_button.vue';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
export default {
components: {
diff --git a/app/assets/javascripts/set_status_modal/emoji_menu_in_modal.js b/app/assets/javascripts/set_status_modal/emoji_menu_in_modal.js
deleted file mode 100644
index 3a8631a196f..00000000000
--- a/app/assets/javascripts/set_status_modal/emoji_menu_in_modal.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { AwardsHandler } from '~/awards_handler';
-
-class EmojiMenuInModal extends AwardsHandler {
- constructor(emoji, toggleButtonSelector, menuClass, selectEmojiCallback, targetContainerEl) {
- super(emoji);
-
- this.selectEmojiCallback = selectEmojiCallback;
- this.toggleButtonSelector = toggleButtonSelector;
- this.menuClass = menuClass;
- this.targetContainerEl = targetContainerEl;
-
- this.bindEvents();
- }
-
- postEmoji($emojiButton, awardUrl, selectedEmoji) {
- this.selectEmojiCallback(selectedEmoji, this.emoji.glEmojiTag(selectedEmoji));
- }
-}
-
-export default EmojiMenuInModal;
diff --git a/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue b/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
index a746642c191..eb0931c6fe2 100644
--- a/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
+++ b/app/assets/javascripts/set_status_modal/set_status_modal_wrapper.vue
@@ -19,10 +19,8 @@ import { __, s__, sprintf } from '~/locale';
import { updateUserStatus } from '~/rest_api';
import { timeRanges } from '~/vue_shared/constants';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import EmojiMenuInModal from './emoji_menu_in_modal';
import { isUserBusy } from './utils';
-const emojiMenuClass = 'js-modal-status-emoji-menu';
export const AVAILABILITY_STATUS = {
BUSY: 'busy',
NOT_SET: 'not_set',
@@ -83,7 +81,6 @@ export default {
emoji: this.currentEmoji,
emojiMenu: null,
emojiTag: '',
- isEmojiMenuVisible: false,
message: this.currentMessage,
modalId: 'set-user-status-modal',
noEmoji: true,
@@ -105,17 +102,11 @@ export default {
mounted() {
this.$root.$emit(BV_SHOW_MODAL, this.modalId);
},
- beforeDestroy() {
- if (this.emojiMenu) {
- this.emojiMenu.destroy();
- }
- },
methods: {
closeModal() {
this.$root.$emit(BV_HIDE_MODAL, this.modalId);
},
setupEmojiListAndAutocomplete() {
- const toggleEmojiMenuButtonSelector = '#set-user-status-modal .js-toggle-emoji-menu';
const emojiAutocomplete = new GfmAutoComplete();
emojiAutocomplete.setup($(this.$refs.statusMessageField), { emojis: true });
@@ -127,16 +118,6 @@ export default {
this.noEmoji = this.emoji === '';
this.defaultEmojiTag = Emoji.glEmojiTag(this.defaultEmoji);
- if (!this.glFeatures.improvedEmojiPicker) {
- this.emojiMenu = new EmojiMenuInModal(
- Emoji,
- toggleEmojiMenuButtonSelector,
- emojiMenuClass,
- this.setEmoji,
- this.$refs.userStatusForm,
- );
- }
-
this.setDefaultEmoji();
})
.catch(() =>
@@ -145,19 +126,6 @@ export default {
}),
);
},
- showEmojiMenu(e) {
- e.stopPropagation();
- this.isEmojiMenuVisible = true;
- this.emojiMenu.showEmojiMenu($(this.$refs.toggleEmojiMenuButton));
- },
- hideEmojiMenu() {
- if (!this.isEmojiMenuVisible) {
- return;
- }
-
- this.isEmojiMenuVisible = false;
- this.emojiMenu.hideMenuElement($(`.${emojiMenuClass}`));
- },
setDefaultEmoji() {
const { emojiTag } = this;
const hasStatusMessage = Boolean(this.message.length);
@@ -173,16 +141,12 @@ export default {
this.clearEmoji();
}
},
- setEmoji(emoji, emojiTag) {
+ setEmoji(emoji) {
this.emoji = emoji;
this.noEmoji = false;
this.clearEmoji();
- if (this.glFeatures.improvedEmojiPicker) {
- this.emojiTag = Emoji.glEmojiTag(this.emoji);
- } else {
- this.emojiTag = emojiTag;
- }
+ this.emojiTag = Emoji.glEmojiTag(this.emoji);
},
clearEmoji() {
if (this.emojiTag) {
@@ -194,7 +158,6 @@ export default {
this.message = '';
this.noEmoji = true;
this.clearEmoji();
- this.hideEmojiMenu();
},
removeStatus() {
this.availability = false;
@@ -249,7 +212,6 @@ export default {
:action-secondary="$options.actionSecondary"
modal-class="set-user-status-modal"
@shown="setupEmojiListAndAutocomplete"
- @hide="hideEmojiMenu"
@primary="setStatus"
@secondary="removeStatus"
>
@@ -264,7 +226,6 @@ export default {
<div class="input-group gl-mb-5">
<span class="input-group-prepend">
<emoji-picker
- v-if="glFeatures.improvedEmojiPicker"
dropdown-class="gl-h-full"
toggle-class="btn emoji-menu-toggle-button gl-px-4! gl-rounded-top-right-none! gl-rounded-bottom-right-none!"
boundary="viewport"
@@ -283,27 +244,6 @@ export default {
</span>
</template>
</emoji-picker>
- <button
- v-else
- ref="toggleEmojiMenuButton"
- v-gl-tooltip.bottom.hover
- :title="s__('SetStatusModal|Add status emoji')"
- :aria-label="s__('SetStatusModal|Add status emoji')"
- name="button"
- type="button"
- class="js-toggle-emoji-menu emoji-menu-toggle-button btn"
- @click="showEmojiMenu"
- >
- <span v-safe-html:[$options.safeHtmlConfig]="emojiTag"></span>
- <span
- v-show="noEmoji"
- class="js-no-emoji-placeholder no-emoji-placeholder position-relative"
- >
- <gl-icon name="slight-smile" class="award-control-icon-neutral" />
- <gl-icon name="smiley" class="award-control-icon-positive" />
- <gl-icon name="smile" class="award-control-icon-super-positive" />
- </span>
- </button>
</span>
<input
ref="statusMessageField"
@@ -314,7 +254,6 @@ export default {
name="user[status][message]"
@keyup="setDefaultEmoji"
@keyup.enter.prevent
- @click="hideEmojiMenu"
/>
<span v-show="isDirty" class="input-group-append">
<button
diff --git a/app/assets/javascripts/sidebar/components/assignees/assignees_realtime.vue b/app/assets/javascripts/sidebar/components/assignees/assignees_realtime.vue
index 2387fe64b8f..78d12ac113b 100644
--- a/app/assets/javascripts/sidebar/components/assignees/assignees_realtime.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/assignees_realtime.vue
@@ -1,6 +1,5 @@
<script>
-import produce from 'immer';
-import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { IssuableType } from '~/issues/constants';
import { assigneesQueries } from '~/sidebar/constants';
@@ -17,10 +16,6 @@ export default {
type: String,
required: true,
},
- issuableId: {
- type: Number,
- required: true,
- },
queryVariables: {
type: Object,
required: true,
@@ -30,6 +25,9 @@ export default {
issuableClass() {
return Object.keys(IssuableType).find((key) => IssuableType[key] === this.issuableType);
},
+ issuableId() {
+ return this.issuable?.id;
+ },
},
apollo: {
issuable: {
@@ -48,29 +46,36 @@ export default {
},
variables() {
return {
- issuableId: convertToGraphQLId(this.issuableClass, this.issuableId),
+ issuableId: this.issuableId,
};
},
- updateQuery(prev, { subscriptionData }) {
- if (prev && subscriptionData?.data?.issuableAssigneesUpdated) {
- const data = produce(prev, (draftData) => {
- draftData.workspace.issuable.assignees.nodes =
- subscriptionData.data.issuableAssigneesUpdated.assignees.nodes;
- });
+ skip() {
+ return !this.issuableId;
+ },
+ updateQuery(
+ _,
+ {
+ subscriptionData: {
+ data: { issuableAssigneesUpdated },
+ },
+ },
+ ) {
+ if (issuableAssigneesUpdated) {
+ const {
+ id,
+ assignees: { nodes },
+ } = issuableAssigneesUpdated;
if (this.mediator) {
- this.handleFetchResult(data);
+ this.handleFetchResult(nodes);
}
- return data;
+ this.$emit('assigneesUpdated', { id, assignees: nodes });
}
- return prev;
},
},
},
},
methods: {
- handleFetchResult(data) {
- const { nodes } = data.workspace.issuable.assignees;
-
+ handleFetchResult(nodes) {
const assignees = nodes.map((n) => ({
...n,
avatar_url: n.avatarUrl,
diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue
index 7743004a293..14f6c9d3a15 100644
--- a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue
@@ -232,6 +232,7 @@ export default {
:issuable-type="issuableType"
:issuable-id="issuableId"
:query-variables="queryVariables"
+ @assigneesUpdated="$emit('assignees-updated', $event)"
/>
<sidebar-editable-item
ref="toggle"
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 558fe8ca2aa..8717d205dcb 100644
--- a/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
@@ -109,20 +109,18 @@ export default {
:key="user.id"
:class="{
'user-item': !showVerticalList,
+ 'gl-display-inline-block': !showVerticalList,
+ 'gl-display-grid gl-align-items-center': showVerticalList,
'gl-mb-3': index !== users.length - 1 && showVerticalList,
}"
- class="gl-display-inline-block"
+ class="assignee-grid"
>
- <attention-requested-toggle
- v-if="showVerticalList"
- :user="user"
- type="assignee"
- @toggle-attention-requested="toggleAttentionRequested"
- />
<assignee-avatar-link
:user="user"
:issuable-type="issuableType"
:tooltip-has-name="!showVerticalList"
+ class="gl-word-break-word"
+ data-css-area="user"
>
<div
v-if="showVerticalList"
@@ -133,6 +131,14 @@ export default {
<span>@{{ user.username }}</span>
</div>
</assignee-avatar-link>
+ <attention-requested-toggle
+ v-if="showVerticalList"
+ :user="user"
+ type="assignee"
+ class="gl-mr-2"
+ data-css-area="attention"
+ @toggle-attention-requested="toggleAttentionRequested"
+ />
</div>
</div>
<div v-if="renderShowMoreSection" class="user-list-more gl-hover-text-blue-800">
diff --git a/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue b/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue
index 6ba88939373..cdc1c65a516 100644
--- a/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue
+++ b/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue
@@ -70,19 +70,21 @@ export default {
</script>
<template>
- <span
- v-gl-tooltip.left.viewport="tooltipTitle"
- class="gl-display-inline-block js-attention-request-toggle"
- >
- <gl-button
- :loading="loading"
- :variant="user.attention_requested ? 'warning' : 'default'"
- :icon="user.attention_requested ? 'attention-solid' : 'attention'"
- :aria-label="tooltipTitle"
- :class="{ 'gl-pointer-events-none': !user.can_update_merge_request }"
- size="small"
- category="tertiary"
- @click="toggleAttentionRequired"
- />
- </span>
+ <div>
+ <span
+ v-gl-tooltip.left.viewport="tooltipTitle"
+ class="gl-display-inline-block js-attention-request-toggle"
+ >
+ <gl-button
+ :loading="loading"
+ :variant="user.attention_requested ? 'warning' : 'default'"
+ :icon="user.attention_requested ? 'attention-solid' : 'attention'"
+ :aria-label="tooltipTitle"
+ :class="{ 'gl-pointer-events-none': !user.can_update_merge_request }"
+ size="small"
+ category="tertiary"
+ @click="toggleAttentionRequired"
+ />
+ </span>
+ </div>
</template>
diff --git a/app/assets/javascripts/sidebar/components/copy_email_to_clipboard.vue b/app/assets/javascripts/sidebar/components/copy_email_to_clipboard.vue
index 0d8cb8cb2b6..8528ad56ddb 100644
--- a/app/assets/javascripts/sidebar/components/copy_email_to_clipboard.vue
+++ b/app/assets/javascripts/sidebar/components/copy_email_to_clipboard.vue
@@ -1,5 +1,5 @@
<script>
-import CopyableField from '../../vue_shared/components/sidebar/copyable_field.vue';
+import CopyableField from '~/vue_shared/components/sidebar/copyable_field.vue';
export default {
components: {
diff --git a/app/assets/javascripts/sidebar/components/incidents/escalation_status.vue b/app/assets/javascripts/sidebar/components/incidents/escalation_status.vue
index 2c32cf89387..aeaac76cff4 100644
--- a/app/assets/javascripts/sidebar/components/incidents/escalation_status.vue
+++ b/app/assets/javascripts/sidebar/components/incidents/escalation_status.vue
@@ -21,6 +21,11 @@ export default {
return [...STATUS_LIST, null].includes(value);
},
},
+ preventDropdownClose: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
currentStatusLabel() {
@@ -35,6 +40,11 @@ export default {
this.$refs.dropdown.hide();
},
getStatusLabel,
+ hideDropdown(event) {
+ if (this.preventDropdownClose) {
+ event.preventDefault();
+ }
+ },
},
};
</script>
@@ -45,6 +55,7 @@ export default {
block
:text="currentStatusLabel"
toggle-class="dropdown-menu-toggle gl-mb-2"
+ @hide="hideDropdown"
>
<slot name="header"> </slot>
<gl-dropdown-item
diff --git a/app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue b/app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue
index 42d2e456a07..2ab46a7a655 100644
--- a/app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue
+++ b/app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue
@@ -3,7 +3,7 @@ import { GlButton } from '@gitlab/ui';
import $ from 'jquery';
import { mapActions } from 'vuex';
import createFlash from '~/flash';
-import { __, sprintf } from '../../../locale';
+import { __, sprintf } from '~/locale';
import eventHub from '../../event_hub';
export default {
diff --git a/app/assets/javascripts/sidebar/components/participants/participants.vue b/app/assets/javascripts/sidebar/components/participants/participants.vue
index 4a255a3b916..3fd35de2132 100644
--- a/app/assets/javascripts/sidebar/components/participants/participants.vue
+++ b/app/assets/javascripts/sidebar/components/participants/participants.vue
@@ -1,5 +1,5 @@
<script>
-import { GlIcon, GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
+import { GlButton, GlIcon, GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
import { __, n__, sprintf } from '~/locale';
import userAvatarImage from '~/vue_shared/components/user_avatar/user_avatar_image.vue';
@@ -8,9 +8,10 @@ export default {
GlTooltip: GlTooltipDirective,
},
components: {
- userAvatarImage,
+ GlButton,
GlIcon,
GlLoadingIcon,
+ userAvatarImage,
},
props: {
loading: {
@@ -124,9 +125,13 @@ export default {
</div>
</div>
<div v-if="hasMoreParticipants" class="participants-more hide-collapsed">
- <button type="button" class="btn-transparent btn-link" @click="toggleMoreParticipants">
- {{ toggleLabel }}
- </button>
+ <gl-button
+ variant="link"
+ button-text-classes="gl-text-secondary"
+ data-testid="more-participants"
+ @click="toggleMoreParticipants"
+ >{{ toggleLabel }}</gl-button
+ >
</div>
</div>
</template>
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 361a082def6..a11468c8761 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
@@ -73,10 +73,10 @@ export default {
v-gl-tooltip="tooltipOption"
:href="reviewerUrl"
:title="tooltipTitle"
- class="d-inline-block"
+ class="gl-display-inline-block"
>
<!-- use d-flex so that slot can be appropriately styled -->
- <span class="gl-display-flex gl-align-items-center">
+ <span class="gl-display-flex">
<reviewer-avatar :user="user" :img-size="32" :issuable-type="issuableType" />
<slot :user="user"></slot>
</span>
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 9485802d3da..3e6be3487b1 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
@@ -94,28 +94,40 @@ export default {
<div
v-for="(user, index) in users"
:key="user.id"
- :class="{ 'gl-mb-3': index !== users.length - 1 }"
+ :class="{
+ 'gl-mb-3': index !== users.length - 1,
+ 'attention-requests': glFeatures.mrAttentionRequests,
+ }"
+ class="gl-display-grid gl-align-items-center reviewer-grid"
data-testid="reviewer"
>
- <attention-requested-toggle
- v-if="glFeatures.mrAttentionRequests"
+ <reviewer-avatar-link
:user="user"
- type="reviewer"
- @toggle-attention-requested="toggleAttentionRequested"
- />
- <reviewer-avatar-link :user="user" :root-path="rootPath" :issuable-type="issuableType">
+ :root-path="rootPath"
+ :issuable-type="issuableType"
+ class="gl-word-break-word gl-mr-2"
+ data-css-area="user"
+ >
<div class="gl-ml-3 gl-line-height-normal gl-display-grid">
<span>{{ user.name }}</span>
<span>@{{ user.username }}</span>
</div>
</reviewer-avatar-link>
+ <attention-requested-toggle
+ v-if="glFeatures.mrAttentionRequests"
+ :user="user"
+ type="reviewer"
+ class="gl-mr-2"
+ data-css-area="attention"
+ @toggle-attention-requested="toggleAttentionRequested"
+ />
<gl-icon
v-if="user.approved"
v-gl-tooltip.left
:size="16"
:title="approvedByTooltipTitle(user)"
name="status-success"
- class="float-right gl-my-2 gl-ml-2 gl-text-green-500"
+ class="float-right gl-my-2 gl-ml-auto gl-text-green-500 gl-flex-shrink-0"
data-testid="re-approved"
/>
<gl-icon
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue b/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue
index bb90ef8e444..91c15061fb9 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/help_state.vue
@@ -1,7 +1,7 @@
<script>
import { GlButton, GlSafeHtmlDirective } from '@gitlab/ui';
import { joinPaths } from '~/lib/utils/url_utility';
-import { sprintf, s__ } from '../../../locale';
+import { sprintf, s__ } from '~/locale';
export default {
name: 'TimeTrackingHelpState',
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
index d222a2af382..fdbcef22bba 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
@@ -207,7 +207,7 @@ export default {
class="hide-collapsed gl-line-height-20 gl-text-gray-900 gl-display-flex gl-align-items-center"
>
{{ __('Time tracking') }}
- <gl-loading-icon v-if="isTimeTrackingInfoLoading" size="sm" inline />
+ <gl-loading-icon v-if="isTimeTrackingInfoLoading" size="sm" class="gl-ml-2" inline />
<gl-button
:data-testid="showHelpState ? 'closeHelpButton' : 'helpButton'"
category="tertiary"
diff --git a/app/assets/javascripts/sidebar/graphql.js b/app/assets/javascripts/sidebar/graphql.js
index fc757922f09..034bdc71122 100644
--- a/app/assets/javascripts/sidebar/graphql.js
+++ b/app/assets/javascripts/sidebar/graphql.js
@@ -1,11 +1,9 @@
import produce from 'immer';
import VueApollo from 'vue-apollo';
import getIssueStateQuery from '~/issues/show/queries/get_issue_state.query.graphql';
-import { resolvers as workItemResolvers } from '~/work_items/graphql/resolvers';
import createDefaultClient from '~/lib/graphql';
const resolvers = {
- ...workItemResolvers,
Mutation: {
updateIssueState: (_, { issueType = undefined, isDirty = false }, { cache }) => {
const sourceData = cache.readQuery({ query: getIssueStateQuery });
@@ -14,7 +12,6 @@ const resolvers = {
});
cache.writeQuery({ query: getIssueStateQuery, data });
},
- ...workItemResolvers.Mutation,
},
};
diff --git a/app/assets/javascripts/sidebar/queries/issuable_labels.subscription.graphql b/app/assets/javascripts/sidebar/queries/issuable_labels.subscription.graphql
new file mode 100644
index 00000000000..edd713baddf
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/issuable_labels.subscription.graphql
@@ -0,0 +1,22 @@
+#import "~/graphql_shared/fragments/label.fragment.graphql"
+
+subscription issuableLabelsUpdated($issuableId: IssuableID!) {
+ issuableLabelsUpdated(issuableId: $issuableId) {
+ ... on Issue {
+ id
+ labels {
+ nodes {
+ ...Label
+ }
+ }
+ }
+ ... on MergeRequest {
+ id
+ labels {
+ nodes {
+ ...Label
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/sidebarDetails.query.graphql b/app/assets/javascripts/sidebar/queries/sidebar_details.query.graphql
index 90d1a7794ea..90d1a7794ea 100644
--- a/app/assets/javascripts/sidebar/queries/sidebarDetails.query.graphql
+++ b/app/assets/javascripts/sidebar/queries/sidebar_details.query.graphql
diff --git a/app/assets/javascripts/sidebar/queries/sidebarDetailsMR.query.graphql b/app/assets/javascripts/sidebar/queries/sidebar_details_mr.query.graphql
index 0505f88773d..0505f88773d 100644
--- a/app/assets/javascripts/sidebar/queries/sidebarDetailsMR.query.graphql
+++ b/app/assets/javascripts/sidebar/queries/sidebar_details_mr.query.graphql
diff --git a/app/assets/javascripts/sidebar/queries/updateStatus.mutation.graphql b/app/assets/javascripts/sidebar/queries/update_status.mutation.graphql
index 2c6f379744e..2c6f379744e 100644
--- a/app/assets/javascripts/sidebar/queries/updateStatus.mutation.graphql
+++ b/app/assets/javascripts/sidebar/queries/update_status.mutation.graphql
diff --git a/app/assets/javascripts/sidebar/services/sidebar_service.js b/app/assets/javascripts/sidebar/services/sidebar_service.js
index d8ab8f1c65b..90d8f2098bb 100644
--- a/app/assets/javascripts/sidebar/services/sidebar_service.js
+++ b/app/assets/javascripts/sidebar/services/sidebar_service.js
@@ -1,10 +1,10 @@
-import sidebarDetailsIssueQuery from 'ee_else_ce/sidebar/queries/sidebarDetails.query.graphql';
+import sidebarDetailsIssueQuery from 'ee_else_ce/sidebar/queries/sidebar_details.query.graphql';
import { TYPE_USER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import createGqClient, { fetchPolicies } from '~/lib/graphql';
import axios from '~/lib/utils/axios_utils';
import reviewerRereviewMutation from '../queries/reviewer_rereview.mutation.graphql';
-import sidebarDetailsMRQuery from '../queries/sidebarDetailsMR.query.graphql';
+import sidebarDetailsMRQuery from '../queries/sidebar_details_mr.query.graphql';
import toggleAttentionRequestedMutation from '../queries/toggle_attention_requested.mutation.graphql';
const queries = {
diff --git a/app/assets/javascripts/snippets/components/edit.vue b/app/assets/javascripts/snippets/components/edit.vue
index e3aa29d5f89..e4a97f08c8d 100644
--- a/app/assets/javascripts/snippets/components/edit.vue
+++ b/app/assets/javascripts/snippets/components/edit.vue
@@ -15,8 +15,8 @@ import TitleField from '~/vue_shared/components/form/title.vue';
import { SNIPPET_CREATE_MUTATION_ERROR, SNIPPET_UPDATE_MUTATION_ERROR } from '../constants';
import { getSnippetMixin } from '../mixins/snippets';
-import CreateSnippetMutation from '../mutations/createSnippet.mutation.graphql';
-import UpdateSnippetMutation from '../mutations/updateSnippet.mutation.graphql';
+import CreateSnippetMutation from '../mutations/create_snippet.mutation.graphql';
+import UpdateSnippetMutation from '../mutations/update_snippet.mutation.graphql';
import { markBlobPerformance } from '../utils/blob';
import { getErrorMessage } from '../utils/error';
@@ -238,9 +238,9 @@ export default {
>
</template>
<template #append>
- <gl-button type="cancel" data-testid="snippet-cancel-btn" :href="cancelButtonHref">{{
- __('Cancel')
- }}</gl-button>
+ <gl-button type="cancel" data-testid="snippet-cancel-btn" :href="cancelButtonHref">
+ {{ __('Cancel') }}
+ </gl-button>
</template>
</form-footer-actions>
</template>
diff --git a/app/assets/javascripts/snippets/components/snippet_header.vue b/app/assets/javascripts/snippets/components/snippet_header.vue
index 9b24c8afe37..dd8f2897018 100644
--- a/app/assets/javascripts/snippets/components/snippet_header.vue
+++ b/app/assets/javascripts/snippets/components/snippet_header.vue
@@ -21,7 +21,7 @@ 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';
+import DeleteSnippetMutation from '../mutations/delete_snippet.mutation.graphql';
export const i18n = {
snippetSpamSuccess: sprintf(
@@ -294,9 +294,9 @@ 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>
diff --git a/app/assets/javascripts/snippets/fragments/snippetBase.fragment.graphql b/app/assets/javascripts/snippets/fragments/snippet_base.fragment.graphql
index d75b4011d1c..d75b4011d1c 100644
--- a/app/assets/javascripts/snippets/fragments/snippetBase.fragment.graphql
+++ b/app/assets/javascripts/snippets/fragments/snippet_base.fragment.graphql
diff --git a/app/assets/javascripts/snippets/mutations/createSnippet.mutation.graphql b/app/assets/javascripts/snippets/mutations/create_snippet.mutation.graphql
index 8640c4725f4..8640c4725f4 100644
--- a/app/assets/javascripts/snippets/mutations/createSnippet.mutation.graphql
+++ b/app/assets/javascripts/snippets/mutations/create_snippet.mutation.graphql
diff --git a/app/assets/javascripts/snippets/mutations/deleteSnippet.mutation.graphql b/app/assets/javascripts/snippets/mutations/delete_snippet.mutation.graphql
index f43d53661f4..f43d53661f4 100644
--- a/app/assets/javascripts/snippets/mutations/deleteSnippet.mutation.graphql
+++ b/app/assets/javascripts/snippets/mutations/delete_snippet.mutation.graphql
diff --git a/app/assets/javascripts/snippets/mutations/updateSnippet.mutation.graphql b/app/assets/javascripts/snippets/mutations/update_snippet.mutation.graphql
index 99242c5d500..99242c5d500 100644
--- a/app/assets/javascripts/snippets/mutations/updateSnippet.mutation.graphql
+++ b/app/assets/javascripts/snippets/mutations/update_snippet.mutation.graphql
diff --git a/app/assets/javascripts/sortable/constants.js b/app/assets/javascripts/sortable/constants.js
new file mode 100644
index 00000000000..7fddac00ab2
--- /dev/null
+++ b/app/assets/javascripts/sortable/constants.js
@@ -0,0 +1,19 @@
+/**
+ * Default config options for sortablejs.
+ * @type {object}
+ *
+ * @example
+ * import Sortable from 'sortablejs';
+ *
+ * const sortable = Sortable.create(el, {
+ * ...defaultSortableOptions,
+ * });
+ */
+export const defaultSortableOptions = {
+ animation: 200,
+ forceFallback: true,
+ fallbackClass: 'is-dragging',
+ fallbackOnBody: true,
+ ghostClass: 'is-ghost',
+ fallbackTolerance: 1,
+};
diff --git a/app/assets/javascripts/sortable/sortable_config.js b/app/assets/javascripts/sortable/sortable_config.js
deleted file mode 100644
index a4c4cb7f101..00000000000
--- a/app/assets/javascripts/sortable/sortable_config.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export default {
- animation: 200,
- forceFallback: true,
- fallbackClass: 'is-dragging',
- fallbackOnBody: true,
- ghostClass: 'is-ghost',
- fallbackTolerance: 1,
-};
diff --git a/app/assets/javascripts/sortable/utils.js b/app/assets/javascripts/sortable/utils.js
new file mode 100644
index 00000000000..c2c8fb03b58
--- /dev/null
+++ b/app/assets/javascripts/sortable/utils.js
@@ -0,0 +1,31 @@
+/* global DocumentTouch */
+
+import { defaultSortableOptions } from './constants';
+
+export function sortableStart() {
+ document.body.classList.add('is-dragging');
+}
+
+export function sortableEnd() {
+ document.body.classList.remove('is-dragging');
+}
+
+export function getSortableDefaultOptions(options) {
+ const touchEnabled =
+ 'ontouchstart' in window || (window.DocumentTouch && document instanceof DocumentTouch);
+
+ const defaultSortOptions = {
+ ...defaultSortableOptions,
+ filter: '.no-drag',
+ delay: touchEnabled ? 100 : 0,
+ scrollSensitivity: touchEnabled ? 60 : 100,
+ scrollSpeed: 20,
+ onStart: sortableStart,
+ onEnd: sortableEnd,
+ };
+
+ return {
+ ...defaultSortOptions,
+ ...options,
+ };
+}
diff --git a/app/assets/javascripts/static_site_editor/components/edit_meta_modal.vue b/app/assets/javascripts/static_site_editor/components/edit_meta_modal.vue
index 8c3ee7b9609..e69a6b8cd69 100644
--- a/app/assets/javascripts/static_site_editor/components/edit_meta_modal.vue
+++ b/app/assets/javascripts/static_site_editor/components/edit_meta_modal.vue
@@ -112,7 +112,6 @@ export default {
v-model="mergeRequestMeta"
:storage-key="$options.storageKey"
:clear="clearStorage"
- as-json
/>
<edit-meta-controls
ref="editMetaControls"
diff --git a/app/assets/javascripts/terraform/components/empty_state.vue b/app/assets/javascripts/terraform/components/empty_state.vue
index fd9177bef3f..6dae55bac50 100644
--- a/app/assets/javascripts/terraform/components/empty_state.vue
+++ b/app/assets/javascripts/terraform/components/empty_state.vue
@@ -1,11 +1,16 @@
<script>
-import { GlEmptyState, GlIcon, GlLink } from '@gitlab/ui';
+import { GlEmptyState, GlLink } from '@gitlab/ui';
+import { s__ } from '~/locale';
import { helpPagePath } from '~/helpers/help_page_helper';
export default {
+ i18n: {
+ title: s__("Terraform|Your project doesn't have any Terraform state files"),
+ description: s__('Terraform|How to use GitLab-managed Terraform state?'),
+ },
+ docsUrl: helpPagePath('user/infrastructure/iac/terraform_state'),
components: {
GlEmptyState,
- GlIcon,
GlLink,
},
props: {
@@ -14,23 +19,13 @@ export default {
required: true,
},
},
- computed: {
- docsUrl() {
- return helpPagePath('user/infrastructure/iac/terraform_state');
- },
- },
};
</script>
<template>
- <gl-empty-state :svg-path="image" :title="s__('Terraform|Get started with Terraform')">
+ <gl-empty-state :svg-path="image" :title="$options.i18n.title">
<template #description>
- <p>
- <gl-link :href="docsUrl" target="_blank"
- >{{ s__('Terraform|How to use GitLab-managed Terraform State?') }}
- <gl-icon name="external-link"
- /></gl-link>
- </p>
+ <gl-link :href="$options.docsUrl">{{ $options.i18n.description }}</gl-link>
</template>
</gl-empty-state>
</template>
diff --git a/app/assets/javascripts/terraform/components/states_table_actions.vue b/app/assets/javascripts/terraform/components/states_table_actions.vue
index 817c421823c..1970d6d7949 100644
--- a/app/assets/javascripts/terraform/components/states_table_actions.vue
+++ b/app/assets/javascripts/terraform/components/states_table_actions.vue
@@ -11,6 +11,7 @@ import {
GlModalDirective,
} from '@gitlab/ui';
import { s__, sprintf } from '~/locale';
+import getStatesQuery from '../graphql/queries/get_states.query.graphql';
import addDataToState from '../graphql/mutations/add_data_to_state.mutation.graphql';
import lockState from '../graphql/mutations/lock_state.mutation.graphql';
import removeState from '../graphql/mutations/remove_state.mutation.graphql';
@@ -148,7 +149,7 @@ export default {
variables: {
stateID: this.state.id,
},
- refetchQueries: () => ['getStates'],
+ refetchQueries: () => [{ query: getStatesQuery }],
awaitRefetchQueries: true,
notifyOnNetworkStatusChange: true,
})
diff --git a/app/assets/javascripts/terraform/graphql/queries/get_states.query.graphql b/app/assets/javascripts/terraform/graphql/queries/get_states.query.graphql
index 4d26ea88ddf..2ae7b7d905e 100644
--- a/app/assets/javascripts/terraform/graphql/queries/get_states.query.graphql
+++ b/app/assets/javascripts/terraform/graphql/queries/get_states.query.graphql
@@ -1,5 +1,5 @@
#import "../fragments/state.fragment.graphql"
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getStates($projectPath: ID!, $first: Int, $last: Int, $before: String, $after: String) {
project(fullPath: $projectPath) {
diff --git a/app/assets/javascripts/tracking/tracking.js b/app/assets/javascripts/tracking/tracking.js
index 173eef0646b..f299c57b33f 100644
--- a/app/assets/javascripts/tracking/tracking.js
+++ b/app/assets/javascripts/tracking/tracking.js
@@ -13,8 +13,12 @@ import {
const ALLOWED_URL_HASHES = ['#diff', '#note'];
export default class Tracking {
- static queuedEvents = [];
+ static nonInitializedQueue = [];
static initialized = false;
+ static definitionsLoaded = false;
+ static definitionsManifest = {};
+ static definitionsEventsQueue = [];
+ static definitions = [];
/**
* (Legacy) Determines if tracking is enabled at the user level.
@@ -54,7 +58,7 @@ export default class Tracking {
}
if (!this.initialized) {
- this.queuedEvents.push(eventData);
+ this.nonInitializedQueue.push(eventData);
return false;
}
@@ -62,6 +66,64 @@ export default class Tracking {
}
/**
+ * Preloads event definitions.
+ *
+ * @returns {undefined}
+ */
+ static loadDefinitions() {
+ // TODO: fetch definitions from the server and flush the queue
+ // See https://gitlab.com/gitlab-org/gitlab/-/issues/358256
+ this.definitionsLoaded = true;
+
+ while (this.definitionsEventsQueue.length) {
+ this.dispatchFromDefinition(...this.definitionsEventsQueue.shift());
+ }
+ }
+
+ /**
+ * Dispatches a structured event with data from its event definition.
+ *
+ * @param {String} basename
+ * @param {Object} eventData
+ * @returns {undefined|Boolean}
+ */
+ static definition(basename, eventData = {}) {
+ if (!this.enabled()) {
+ return false;
+ }
+
+ if (!(basename in this.definitionsManifest)) {
+ throw new Error(`Missing Snowplow event definition "${basename}"`);
+ }
+
+ return this.dispatchFromDefinition(basename, eventData);
+ }
+
+ /**
+ * Builds an event with data from a valid definition and sends it to
+ * Snowplow. If the definitions are not loaded, it pushes the data to a queue.
+ *
+ * @param {String} basename
+ * @param {Object} eventData
+ * @returns {undefined|Boolean}
+ */
+ static dispatchFromDefinition(basename, eventData) {
+ if (!this.definitionsLoaded) {
+ this.definitionsEventsQueue.push([basename, eventData]);
+
+ return false;
+ }
+
+ const eventDefinition = this.definitions.find((definition) => definition.key === basename);
+
+ return this.event(
+ eventData.category ?? eventDefinition.category,
+ eventData.action ?? eventDefinition.action,
+ eventData,
+ );
+ }
+
+ /**
* Dispatches any event emitted before initialization.
*
* @returns {undefined}
@@ -69,8 +131,8 @@ export default class Tracking {
static flushPendingEvents() {
this.initialized = true;
- while (this.queuedEvents.length) {
- dispatchSnowplowEvent(...this.queuedEvents.shift());
+ while (this.nonInitializedQueue.length) {
+ dispatchSnowplowEvent(...this.nonInitializedQueue.shift());
}
}
diff --git a/app/assets/javascripts/user_lists/components/user_list_form.vue b/app/assets/javascripts/user_lists/components/user_list_form.vue
index b53aaf46ace..44aa2d9a5b4 100644
--- a/app/assets/javascripts/user_lists/components/user_list_form.vue
+++ b/app/assets/javascripts/user_lists/components/user_list_form.vue
@@ -84,7 +84,7 @@ export default {
<gl-form-input id="user-list-name" v-model="name" data-testid="user-list-name" required />
</gl-form-group>
<div :class="$options.classes.actionContainer">
- <gl-button variant="success" data-testid="save-user-list" @click="submit">
+ <gl-button variant="confirm" data-testid="save-user-list" @click="submit">
{{ saveButtonLabel }}
</gl-button>
<gl-button :href="cancelPath" data-testid="user-list-cancel">
diff --git a/app/assets/javascripts/users_select/index.js b/app/assets/javascripts/users_select/index.js
index 656c851aa3d..f7a5589af90 100644
--- a/app/assets/javascripts/users_select/index.js
+++ b/app/assets/javascripts/users_select/index.js
@@ -1,4 +1,4 @@
-/* eslint-disable func-names, prefer-rest-params, consistent-return, no-shadow, no-self-compare, no-unused-expressions, yoda, prefer-spread, babel/camelcase, no-param-reassign */
+/* eslint-disable func-names, prefer-rest-params, consistent-return, no-shadow, no-self-compare, no-unused-expressions, yoda, prefer-spread, camelcase, no-param-reassign */
/* global Issuable */
/* global emitSidebarEvent */
@@ -11,10 +11,10 @@ import {
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import { isUserBusy } from '~/set_status_modal/utils';
import { fixTitle, dispose } from '~/tooltips';
-import axios from '../lib/utils/axios_utils';
-import { parseBoolean, spriteIcon } from '../lib/utils/common_utils';
-import { loadCSSFile } from '../lib/utils/css_utils';
-import { s__, __, sprintf } from '../locale';
+import axios from '~/lib/utils/axios_utils';
+import { parseBoolean, spriteIcon } from '~/lib/utils/common_utils';
+import { loadCSSFile } from '~/lib/utils/css_utils';
+import { s__, __, sprintf } from '~/locale';
import { getAjaxUsersSelectOptions, getAjaxUsersSelectParams } from './utils';
// TODO: remove eventHub hack after code splitting refactor
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 25dbb614c1d..0e31f97b9db 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
@@ -102,7 +102,11 @@ export default {
<template v-if="hasApprovers">
<span v-if="approvalLeftMessage">{{ message }}</span>
<strong v-else>{{ message }}</strong>
- <user-avatar-list class="d-inline-block align-middle" :items="approvers" />
+ <user-avatar-list
+ class="gl-display-inline-block gl-vertical-align-middle"
+ :img-size="24"
+ :items="approvers"
+ />
</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 684386883c8..f1b89c42fb5 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
@@ -66,7 +66,15 @@ export default {
return this.loadingState === LOADING_STATES.expandedLoading;
},
isCollapsible() {
- return !this.isLoadingSummary && this.loadingState !== LOADING_STATES.collapsedError;
+ if (!this.isLoadingSummary && this.loadingState !== LOADING_STATES.collapsedError) {
+ if (this.shouldCollapse) {
+ return this.shouldCollapse();
+ }
+
+ return true;
+ }
+
+ return false;
},
hasFullData() {
return this.fullData.length > 0;
@@ -86,7 +94,7 @@ export default {
);
},
statusIconName() {
- if (this.hasFetchError) return EXTENSION_ICONS.error;
+ if (this.hasFetchError) return EXTENSION_ICONS.failed;
if (this.isLoadingSummary) return null;
return this.statusIcon(this.collapsedData);
@@ -128,7 +136,7 @@ export default {
}
}),
toggleCollapsed(e) {
- if (!e?.target?.closest('.btn:not(.btn-icon),a')) {
+ if (this.isCollapsible && !e?.target?.closest('.btn:not(.btn-icon),a')) {
this.isCollapsed = !this.isCollapsed;
this.triggerRedisTracking();
@@ -214,7 +222,7 @@ export default {
// To allow for text to be selected we check if the the user is clicking
// or selecting, if they are selecting the time difference should be
// more than 200ms
- if (up - this.down < 200) {
+ if (up - this.down < 200 && !e?.target?.closest('.btn-icon')) {
this.toggleCollapsed(e);
}
},
@@ -226,7 +234,12 @@ export default {
<template>
<section class="media-section" data-testid="widget-extension">
- <div class="media gl-p-5 gl-cursor-pointer" @mousedown="onRowMouseDown" @mouseup="onRowMouseUp">
+ <div
+ :class="{ 'gl-cursor-pointer': isCollapsible }"
+ class="media gl-p-5"
+ @mousedown="onRowMouseDown"
+ @mouseup="onRowMouseUp"
+ >
<status-icon
:name="$options.label || $options.name"
:is-loading="isLoadingSummary"
@@ -264,7 +277,7 @@ export default {
category="tertiary"
data-testid="toggle-button"
size="small"
- @click.self="toggleCollapsed"
+ @click="toggleCollapsed"
/>
</div>
</div>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue b/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue
index 5f42c6c7acb..5cfee21dd5e 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue
@@ -55,19 +55,21 @@ export default {
<div class="gl-display-flex">
<status-icon v-if="data.icon" :icon-name="data.icon.name" :size="12" class="gl-pl-0" />
<div class="gl-w-full">
- <div class="gl-flex-wrap gl-display-flex gl-w-full">
- <div class="gl-mr-4 gl-display-flex gl-align-items-center">
- <p v-safe-html="generateText(data.text)" class="gl-m-0"></p>
+ <div class="gl-display-flex gl-flex-nowrap">
+ <div class="gl-flex-wrap gl-display-flex gl-w-full">
+ <div class="gl-mr-4 gl-display-flex gl-align-items-center">
+ <p v-safe-html="generateText(data.text)" class="gl-m-0"></p>
+ </div>
+ <div v-if="data.link">
+ <gl-link :href="data.link.href">{{ data.link.text }}</gl-link>
+ </div>
+ <div v-if="data.supportingText">
+ <p v-safe-html="generateText(data.supportingText)" class="gl-m-0"></p>
+ </div>
+ <gl-badge v-if="data.badge" :variant="data.badge.variant || 'info'">
+ {{ data.badge.text }}
+ </gl-badge>
</div>
- <div v-if="data.link">
- <gl-link :href="data.link.href">{{ data.link.text }}</gl-link>
- </div>
- <div v-if="data.supportingText">
- <p v-safe-html="generateText(data.supportingText)" class="gl-m-0"></p>
- </div>
- <gl-badge v-if="data.badge" :variant="data.badge.variant || 'info'">
- {{ data.badge.text }}
- </gl-badge>
<actions :widget="widgetLabel" :tertiary-buttons="data.actions" class="gl-ml-auto" />
</div>
<p
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js b/app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js
index 8ba13cf8252..5fba070f79c 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js
@@ -32,7 +32,7 @@ const textStyleTags = {
[getStartTag('critical')]: '<span class="gl-font-weight-bold gl-text-red-800">',
[getStartTag('same')]: '<span class="gl-font-weight-bold gl-text-gray-700">',
[getStartTag('strong')]: '<span class="gl-font-weight-bold">',
- [getStartTag('small')]: '<span class="gl-font-sm">',
+ [getStartTag('small')]: '<span class="gl-font-sm gl-text-gray-700">',
};
export const generateText = (text) => {
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 b062833cdf8..e906b8c3b59 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
@@ -79,7 +79,7 @@ export default {
},
data() {
return {
- resolveConflictsFromCli: helpPagePath('ee/user/project/merge_requests/conflicts.html', {
+ resolveConflictsFromCli: helpPagePath('user/project/merge_requests/conflicts', {
anchor: 'resolve-conflicts-from-the-command-line',
}),
};
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue
index 2e3a02b1712..9499603163b 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue
@@ -1,7 +1,7 @@
<script>
import { GlButton, GlLoadingIcon } from '@gitlab/ui';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import ciIcon from '../../vue_shared/components/ci_icon.vue';
+import ciIcon from '~/vue_shared/components/ci_icon.vue';
export default {
components: {
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/source_branch_removal_status.vue b/app/assets/javascripts/vue_merge_request_widget/components/source_branch_removal_status.vue
index caafd6b995e..e86724d133a 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/source_branch_removal_status.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/source_branch_removal_status.vue
@@ -1,6 +1,6 @@
<script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
-import { __ } from '../../locale';
+import { __ } from '~/locale';
export default {
i18n: {
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue
index e0c4679b983..887d1aab524 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue
@@ -1,7 +1,7 @@
<script>
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
import simplePoll from '~/lib/utils/simple_poll';
-import MergeRequest from '../../../merge_request';
+import MergeRequest from '~/merge_request';
import eventHub from '../../event_hub';
import { MERGE_ACTIVE_STATUS_PHRASES, STATE_MACHINE } from '../../constants';
import statusIcon from '../mr_widget_status_icon.vue';
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
index ebdc8309cd5..3511fffcfbb 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
@@ -3,7 +3,7 @@ import { GlButton, GlSkeletonLoader } from '@gitlab/ui';
import createFlash from '~/flash';
import { __ } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import simplePoll from '../../../lib/utils/simple_poll';
+import simplePoll from '~/lib/utils/simple_poll';
import eventHub from '../../event_hub';
import mergeRequestQueryVariablesMixin from '../../mixins/merge_request_query_variables';
import rebaseQuery from '../../queries/states/rebase.query.graphql';
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue
index e43319d42ca..4902c9b45e8 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue
@@ -28,7 +28,7 @@ export default {
api.trackRedisHllUserEvent('i_code_review_widget_nothing_merge_click_new_file');
},
},
- ciHelpPage: helpPagePath('/ci/quick_start/index.html'),
+ ciHelpPage: helpPagePath('ci/quick_start/index.html'),
safeHtmlConfig: { ADD_TAGS: ['use'] },
};
</script>
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 e52f2c2c666..6ca0ea9c4e7 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js
@@ -48,6 +48,9 @@ export default {
{ text: 'Full report', href: this.conflictsDocsPath, target: '_blank' },
];
},
+ shouldCollapse() {
+ return true;
+ },
},
methods: {
// Fetches the collapsed data
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js
new file mode 100644
index 00000000000..cd5cfb6837c
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js
@@ -0,0 +1,39 @@
+import { __, n__, s__, sprintf } from '~/locale';
+
+const digitText = (bold = false) => (bold ? '%{strong_start}%d%{strong_end}' : '%d');
+const noText = (bold = false) => (bold ? '%{strong_start}no%{strong_end}' : 'no');
+
+export const TESTS_FAILED_STATUS = 'failed';
+export const ERROR_STATUS = 'error';
+
+export const i18n = {
+ label: s__('Reports|Test summary'),
+ loading: s__('Reports|Test summary results are loading'),
+ error: s__('Reports|Test summary failed to load results'),
+ fullReport: s__('Reports|Full report'),
+
+ noChanges: (bold) => s__(`Reports|${noText(bold)} changed test results`),
+ resultsString: (combinedString, resolvedString) =>
+ sprintf(s__('Reports|%{combinedString} and %{resolvedString}'), {
+ combinedString,
+ resolvedString,
+ }),
+
+ summaryText: (name, resultsString) =>
+ sprintf(__('%{name}: %{resultsString}'), { name, resultsString }),
+
+ failedClause: (failed, bold) =>
+ n__(`${digitText(bold)} failed`, `${digitText(bold)} failed`, failed),
+ erroredClause: (errored, bold) =>
+ n__(`${digitText(bold)} error`, `${digitText(bold)} errors`, errored),
+ resolvedClause: (resolved, bold) =>
+ n__(`${digitText(bold)} fixed test result`, `${digitText(bold)} fixed test results`, resolved),
+ totalClause: (total, bold) =>
+ n__(`${digitText(bold)} total test`, `${digitText(bold)} total tests`, total),
+
+ reportError: s__('Reports|An error occurred while loading report'),
+ reportErrorWithName: (name) =>
+ sprintf(s__('Reports|An error occurred while loading %{name} results'), { name }),
+ headReportParsingError: s__('Reports|Head report parsing error:'),
+ baseReportParsingError: s__('Reports|Base report parsing error:'),
+};
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js
new file mode 100644
index 00000000000..65d9257903f
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js
@@ -0,0 +1,82 @@
+import { uniqueId } from 'lodash';
+import axios from '~/lib/utils/axios_utils';
+import { EXTENSION_ICONS } from '../../constants';
+import { summaryTextBuilder, reportTextBuilder, reportSubTextBuilder } from './utils';
+import { i18n, TESTS_FAILED_STATUS, ERROR_STATUS } from './constants';
+
+export default {
+ name: 'WidgetTestSummary',
+ enablePolling: true,
+ i18n,
+ expandEvent: 'i_testing_summary_widget_total',
+ props: ['testResultsPath', 'headBlobPath', 'pipeline'],
+ computed: {
+ summary(data) {
+ if (data.parsingInProgress) {
+ return this.$options.i18n.loading;
+ }
+ if (data.hasSuiteError) {
+ return this.$options.i18n.error;
+ }
+ return summaryTextBuilder(this.$options.i18n.label, data.summary);
+ },
+ statusIcon(data) {
+ if (data.parsingInProgress) {
+ return null;
+ }
+ if (data.status === TESTS_FAILED_STATUS) {
+ return EXTENSION_ICONS.warning;
+ }
+ if (data.hasSuiteError) {
+ return EXTENSION_ICONS.failed;
+ }
+ return EXTENSION_ICONS.success;
+ },
+ tertiaryButtons() {
+ return [
+ {
+ text: this.$options.i18n.fullReport,
+ href: `${this.pipeline.path}/test_report`,
+ target: '_blank',
+ },
+ ];
+ },
+ },
+ methods: {
+ fetchCollapsedData() {
+ return axios.get(this.testResultsPath).then(({ data = {}, status }) => {
+ return {
+ data: {
+ hasSuiteError: data.suites?.some((suite) => suite.status === ERROR_STATUS),
+ parsingInProgress: status === 204,
+ ...data,
+ },
+ };
+ });
+ },
+ fetchFullData() {
+ return Promise.resolve(this.prepareReports());
+ },
+ suiteIcon(suite) {
+ if (suite.status === ERROR_STATUS) {
+ return EXTENSION_ICONS.error;
+ }
+ if (suite.status === TESTS_FAILED_STATUS) {
+ return EXTENSION_ICONS.failed;
+ }
+ return EXTENSION_ICONS.success;
+ },
+ prepareReports() {
+ return this.collapsedData.suites.map((suite) => {
+ return {
+ id: uniqueId('suite-'),
+ text: reportTextBuilder(suite),
+ subtext: reportSubTextBuilder(suite),
+ icon: {
+ name: this.suiteIcon(suite),
+ },
+ };
+ });
+ },
+ },
+};
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js
new file mode 100644
index 00000000000..a74ed20362f
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js
@@ -0,0 +1,55 @@
+import { i18n } from './constants';
+
+const textBuilder = (results, boldNumbers = false) => {
+ const { failed, errored, resolved, total } = results;
+
+ const failedOrErrored = (failed || 0) + (errored || 0);
+ const failedString = failed ? i18n.failedClause(failed, boldNumbers) : null;
+ const erroredString = errored ? i18n.erroredClause(errored, boldNumbers) : null;
+ const combinedString =
+ failed && errored ? `${failedString}, ${erroredString}` : failedString || erroredString;
+ const resolvedString = resolved ? i18n.resolvedClause(resolved, boldNumbers) : null;
+ const totalString = total ? i18n.totalClause(total, boldNumbers) : null;
+
+ let resultsString = i18n.noChanges(boldNumbers);
+
+ if (failedOrErrored) {
+ if (resolved) {
+ resultsString = i18n.resultsString(combinedString, resolvedString);
+ } else {
+ resultsString = combinedString;
+ }
+ } else if (resolved) {
+ resultsString = resolvedString;
+ }
+
+ return `${resultsString}, ${totalString}`;
+};
+
+export const summaryTextBuilder = (name = '', results = {}) => {
+ const resultsString = textBuilder(results, true);
+ return i18n.summaryText(name, resultsString);
+};
+
+export const reportTextBuilder = ({ name = '', summary = {}, status }) => {
+ if (!name) {
+ return i18n.reportError;
+ }
+ if (status === 'error') {
+ return i18n.reportErrorWithName(name);
+ }
+
+ const resultsString = textBuilder(summary);
+ return i18n.summaryText(name, resultsString);
+};
+
+export const reportSubTextBuilder = ({ suite_errors }) => {
+ const errors = [];
+ if (suite_errors?.head) {
+ errors.push(`${i18n.headReportParsingError} ${suite_errors.head}`);
+ }
+ if (suite_errors?.base) {
+ errors.push(`${i18n.baseReportParsingError} ${suite_errors.base}`);
+ }
+ return errors.join('<br />');
+};
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 965746e79fb..4b3ad288768 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
@@ -47,6 +47,7 @@ import getStateQuery from './queries/get_state.query.graphql';
import terraformExtension from './extensions/terraform';
import accessibilityExtension from './extensions/accessibility';
import codeQualityExtension from './extensions/code_quality';
+import testReportExtension from './extensions/test_report';
export default {
// False positive i18n lint: https://gitlab.com/gitlab-org/frontend/eslint-plugin-i18n/issues/25
@@ -191,6 +192,9 @@ export default {
shouldRenderTerraformPlans() {
return Boolean(this.mr?.terraformReportsPath);
},
+ shouldRenderTestReport() {
+ return Boolean(this.mr?.testResultsPath);
+ },
mergeError() {
let { mergeError } = this.mr;
@@ -252,6 +256,11 @@ export default {
this.registerAccessibilityExtension();
}
},
+ shouldRenderTestReport(newVal) {
+ if (newVal) {
+ this.registerTestReportExtension();
+ }
+ },
},
mounted() {
MRWidgetService.fetchInitialData()
@@ -502,6 +511,11 @@ export default {
registerExtension(codeQualityExtension);
}
},
+ registerTestReportExtension() {
+ if (this.shouldRenderTestReport && this.shouldShowExtension) {
+ registerExtension(testReportExtension);
+ }
+ },
},
};
</script>
@@ -574,7 +588,7 @@ export default {
/>
<grouped-test-reports-app
- v-if="mr.testResultsPath"
+ v-if="mr.testResultsPath && !shouldShowExtension"
class="js-reports-container"
:endpoint="mr.testResultsPath"
:head-blob-path="mr.headBlobPath"
diff --git a/app/assets/javascripts/vue_merge_request_widget/services/mr_widget_service.js b/app/assets/javascripts/vue_merge_request_widget/services/mr_widget_service.js
index 7b803b0fcbb..6515d76c17e 100644
--- a/app/assets/javascripts/vue_merge_request_widget/services/mr_widget_service.js
+++ b/app/assets/javascripts/vue_merge_request_widget/services/mr_widget_service.js
@@ -1,5 +1,5 @@
import { normalizeHeaders } from '~/lib/utils/common_utils';
-import axios from '../../lib/utils/axios_utils';
+import axios from '~/lib/utils/axios_utils';
export default class MRWidgetService {
constructor(endpoints) {
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue b/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue
index d595c49f9aa..948d2505966 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue
@@ -21,12 +21,12 @@ import Tracking from '~/tracking';
import initUserPopovers from '~/user_popovers';
import AlertDetailsTable from '~/vue_shared/components/alert_details_table.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import MetricImagesTab from '~/vue_shared/components/metric_images/metric_images_tab.vue';
import { PAGE_CONFIG, SEVERITY_LEVELS } from '../constants';
import createIssueMutation from '../graphql/mutations/alert_issue_create.mutation.graphql';
import toggleSidebarStatusMutation from '../graphql/mutations/alert_sidebar_status.mutation.graphql';
import alertQuery from '../graphql/queries/alert_sidebar_details.query.graphql';
import sidebarStatusQuery from '../graphql/queries/alert_sidebar_status.query.graphql';
-import AlertMetrics from './alert_metrics.vue';
import AlertSidebar from './alert_sidebar.vue';
import AlertSummaryRow from './alert_summary_row.vue';
import SystemNote from './system_notes/system_note.vue';
@@ -74,7 +74,7 @@ export default {
TimeAgoTooltip,
AlertSidebar,
SystemNote,
- AlertMetrics,
+ MetricImagesTab,
},
inject: {
projectPath: {
@@ -372,13 +372,12 @@ export default {
</alert-summary-row>
<alert-details-table :alert="alert" :loading="loading" :statuses="statuses" />
</gl-tab>
- <gl-tab
+
+ <metric-images-tab
v-if="!isThreatMonitoringPage"
:data-testid="$options.tabsConfig[1].id"
:title="$options.tabsConfig[1].title"
- >
- <alert-metrics :dashboard-url="alert.metricsDashboardUrl" />
- </gl-tab>
+ />
<gl-tab :data-testid="$options.tabsConfig[2].id" :title="$options.tabsConfig[2].title">
<div v-if="alert.notes.nodes.length > 0" class="issuable-discussion">
<ul class="notes main-notes-list timeline">
diff --git a/app/assets/javascripts/vue_shared/alert_details/index.js b/app/assets/javascripts/vue_shared/alert_details/index.js
index d0155c18b9c..614748fa80d 100644
--- a/app/assets/javascripts/vue_shared/alert_details/index.js
+++ b/app/assets/javascripts/vue_shared/alert_details/index.js
@@ -3,6 +3,9 @@ import produce from 'immer';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import createStore from '~/vue_shared/components/metric_images/store';
+import service from './service';
import AlertDetails from './components/alert_details.vue';
import { PAGE_CONFIG } from './constants';
import sidebarStatusQuery from './graphql/queries/alert_sidebar_status.query.graphql';
@@ -12,7 +15,8 @@ Vue.use(VueApollo);
export default (selector) => {
const domEl = document.querySelector(selector);
- const { alertId, projectPath, projectIssuesPath, projectId, page } = domEl.dataset;
+ const { alertId, projectPath, projectIssuesPath, projectId, page, canUpdate } = domEl.dataset;
+ const iid = alertId;
const router = createRouter();
const resolvers = {
@@ -54,15 +58,20 @@ export default (selector) => {
page,
projectIssuesPath,
projectId,
+ iid,
statuses: PAGE_CONFIG[page].STATUSES,
+ canUpdate: parseBoolean(canUpdate),
};
+ const opsProperties = {};
+
if (page === PAGE_CONFIG.OPERATIONS.TITLE) {
const { TRACK_ALERTS_DETAILS_VIEWS_OPTIONS, TRACK_ALERT_STATUS_UPDATE_OPTIONS } = PAGE_CONFIG[
page
];
provide.trackAlertsDetailsViewsOptions = TRACK_ALERTS_DETAILS_VIEWS_OPTIONS;
provide.trackAlertStatusUpdateOptions = TRACK_ALERT_STATUS_UPDATE_OPTIONS;
+ opsProperties.store = createStore({}, service);
} else if (page === PAGE_CONFIG.THREAT_MONITORING.TITLE) {
provide.isThreatMonitoringPage = true;
}
@@ -74,6 +83,7 @@ export default (selector) => {
components: {
AlertDetails,
},
+ ...opsProperties,
provide,
apolloProvider,
router,
diff --git a/app/assets/javascripts/vue_shared/alert_details/service.js b/app/assets/javascripts/vue_shared/alert_details/service.js
new file mode 100644
index 00000000000..90f4961103b
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/alert_details/service.js
@@ -0,0 +1,43 @@
+import {
+ fetchAlertMetricImages,
+ uploadAlertMetricImage,
+ updateAlertMetricImage,
+ deleteAlertMetricImage,
+} from '~/rest_api';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+
+function replaceModelIId(payload = {}) {
+ delete Object.assign(payload, { alertIid: payload.modelIid }).modelIid;
+ return payload;
+}
+
+export const getMetricImages = async (payload) => {
+ const apiPayload = replaceModelIId(payload);
+ const response = await fetchAlertMetricImages(apiPayload);
+ return convertObjectPropsToCamelCase(response.data, { deep: true });
+};
+
+export const uploadMetricImage = async (payload) => {
+ const apiPayload = replaceModelIId(payload);
+ const response = await uploadAlertMetricImage(apiPayload);
+ return convertObjectPropsToCamelCase(response.data);
+};
+
+export const updateMetricImage = async (payload) => {
+ const apiPayload = replaceModelIId(payload);
+ const response = await updateAlertMetricImage(apiPayload);
+ return convertObjectPropsToCamelCase(response.data);
+};
+
+export const deleteMetricImage = async (payload) => {
+ const apiPayload = replaceModelIId(payload);
+ const response = await deleteAlertMetricImage(apiPayload);
+ return convertObjectPropsToCamelCase(response.data);
+};
+
+export default {
+ getMetricImages,
+ uploadMetricImage,
+ updateMetricImage,
+ deleteMetricImage,
+};
diff --git a/app/assets/javascripts/vue_shared/components/awards_list.vue b/app/assets/javascripts/vue_shared/components/awards_list.vue
index 96970f4ce2f..f5d8811e83c 100644
--- a/app/assets/javascripts/vue_shared/components/awards_list.vue
+++ b/app/assets/javascripts/vue_shared/components/awards_list.vue
@@ -4,7 +4,7 @@ import { groupBy } from 'lodash';
import EmojiPicker from '~/emoji/components/picker.vue';
import { __, sprintf } from '~/locale';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { glEmojiTag } from '../../emoji';
+import { glEmojiTag } from '~/emoji';
// Internal constant, specific to this component, used when no `currentUserId` is given
const NO_USER_ID = -1;
@@ -93,12 +93,14 @@ export default {
return awardList.some((award) => award.user.id === this.currentUserId);
},
createAwardList(name, list) {
+ const url = list.length ? list[0].url : null;
+
return {
name,
list,
title: this.getAwardListTitle(list, name),
classes: this.getAwardClassBindings(list),
- html: glEmojiTag(name),
+ html: glEmojiTag(name, { url }),
};
},
getAwardListTitle(awardsList, name) {
@@ -198,10 +200,10 @@ export default {
</gl-button>
<div v-if="canAwardEmoji" class="award-menu-holder gl-my-2">
<emoji-picker
- v-if="glFeatures.improvedEmojiPicker"
v-gl-tooltip.viewport
:title="__('Add reaction')"
:toggle-class="['add-reaction-button btn-icon gl-relative!', { 'is-active': isMenuOpen }]"
+ data-testid="emoji-picker"
@click="handleAward"
@shown="setIsMenuOpen(true)"
@hidden="setIsMenuOpen(false)"
@@ -219,24 +221,6 @@ export default {
</span>
</template>
</emoji-picker>
- <gl-button
- v-else
- v-gl-tooltip.viewport
- :class="addButtonClass"
- class="add-reaction-button js-add-award"
- title="Add reaction"
- :aria-label="__('Add reaction')"
- >
- <span class="reaction-control-icon reaction-control-icon-neutral">
- <gl-icon name="slight-smile" />
- </span>
- <span class="reaction-control-icon reaction-control-icon-positive">
- <gl-icon name="smiley" />
- </span>
- <span class="reaction-control-icon reaction-control-icon-super-positive">
- <gl-icon name="smile" />
- </span>
- </gl-button>
</div>
</div>
</template>
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 3aaa7d915ea..0117c06c3d5 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
@@ -1,7 +1,5 @@
<script>
import { GlIcon, GlSafeHtmlDirective } from '@gitlab/ui';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import LineHighlighter from '~/blob/line_highlighter';
import { HIGHLIGHT_CLASS_NAME } from './constants';
import ViewerMixin from './mixins';
@@ -13,7 +11,7 @@ export default {
directives: {
SafeHtml: GlSafeHtmlDirective,
},
- mixins: [ViewerMixin, glFeatureFlagsMixin()],
+ mixins: [ViewerMixin],
inject: ['blobHash'],
data() {
return {
@@ -21,21 +19,14 @@ export default {
};
},
computed: {
- refactorBlobViewerEnabled() {
- return this.glFeatures.refactorBlobViewer;
- },
-
lineNumbers() {
return this.content.split('\n').length;
},
},
mounted() {
- if (this.refactorBlobViewerEnabled) {
- // This line will be removed once we start using highlight.js on the frontend (https://gitlab.com/groups/gitlab-org/-/epics/7146)
- new LineHighlighter(); // eslint-disable-line no-new
- } else {
- const { hash } = window.location;
- if (hash) this.scrollToLine(hash, true);
+ const { hash } = window.location;
+ if (hash) {
+ this.scrollToLine(hash, true);
}
},
methods: {
diff --git a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/download_viewer.vue b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/download_viewer.vue
index af85a2fda06..f28a2801bc0 100644
--- a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/download_viewer.vue
+++ b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/download_viewer.vue
@@ -1,6 +1,6 @@
<script>
import { GlIcon } from '@gitlab/ui';
-import { numberToHumanSize } from '../../../../lib/utils/number_utils';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
export default {
components: {
diff --git a/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/default.vue b/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/default.vue
deleted file mode 100644
index 733accdff44..00000000000
--- a/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/default.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-<script>
-import Identicon from '../identicon.vue';
-import ProjectAvatarImage from './image.vue';
-
-export default {
- name: 'DeprecatedProjectAvatar',
- components: {
- Identicon,
- ProjectAvatarImage,
- },
- props: {
- project: {
- type: Object,
- required: true,
- },
- size: {
- type: Number,
- default: 40,
- required: false,
- },
- },
- computed: {
- sizeClass() {
- return `s${this.size}`;
- },
- },
-};
-</script>
-
-<template>
- <span :class="sizeClass" class="avatar-container rect-avatar project-avatar">
- <project-avatar-image
- v-if="project.avatar_url"
- :link-href="project.path"
- :img-src="project.avatar_url"
- :img-alt="project.name"
- :img-size="size"
- />
- <identicon
- v-else
- :entity-id="project.id"
- :entity-name="project.name"
- :size-class="sizeClass"
- class="rect-avatar"
- />
- </span>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/image.vue b/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/image.vue
deleted file mode 100644
index 269736c799c..00000000000
--- a/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/image.vue
+++ /dev/null
@@ -1,81 +0,0 @@
-<script>
-/* This is a re-usable vue component for rendering a project avatar that
- does not need to link to the project's profile. The image and an optional
- tooltip can be configured by props passed to this component.
-
- Sample configuration:
-
- <project-avatar-image
- :lazy="true"
- :img-src="projectAvatarSrc"
- :img-alt="tooltipText"
- :tooltip-text="tooltipText"
- tooltip-placement="top"
- />
-
- */
-import defaultAvatarUrl from 'images/no_avatar.png';
-import { __ } from '~/locale';
-import { placeholderImage } from '../../../lazy_loader';
-
-export default {
- name: 'ProjectAvatarImage',
- props: {
- lazy: {
- type: Boolean,
- required: false,
- default: false,
- },
- imgSrc: {
- type: String,
- required: false,
- default: defaultAvatarUrl,
- },
- cssClasses: {
- type: String,
- required: false,
- default: '',
- },
- imgAlt: {
- type: String,
- required: false,
- default: __('project avatar'),
- },
- size: {
- type: Number,
- required: false,
- default: 20,
- },
- },
- computed: {
- // API response sends null when gravatar is disabled and
- // we provide an empty string when we use it inside project avatar link.
- // In both cases we should render the defaultAvatarUrl
- sanitizedSource() {
- return this.imgSrc === '' || this.imgSrc === null ? defaultAvatarUrl : this.imgSrc;
- },
- resultantSrcAttribute() {
- return this.lazy ? placeholderImage : this.sanitizedSource;
- },
- avatarSizeClass() {
- return `s${this.size}`;
- },
- },
-};
-</script>
-
-<template>
- <img
- :class="{
- lazy: lazy,
- [avatarSizeClass]: true,
- [cssClasses]: true,
- }"
- :src="resultantSrcAttribute"
- :width="size"
- :height="size"
- :alt="imgAlt"
- :data-src="sanitizedSource"
- class="avatar"
- />
-</template>
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 014276c7e36..d14d8c9b92e 100644
--- a/app/assets/javascripts/vue_shared/components/dismissible_feedback_alert.vue
+++ b/app/assets/javascripts/vue_shared/components/dismissible_feedback_alert.vue
@@ -37,7 +37,7 @@ export default {
<template>
<div v-show="showAlert">
- <local-storage-sync v-model="isDismissed" :storage-key="storageKey" as-json />
+ <local-storage-sync v-model="isDismissed" :storage-key="storageKey" />
<gl-alert v-if="showAlert" @dismiss="dismissFeedbackAlert">
<slot></slot>
</gl-alert>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue
index 5cdf7b6a3b2..6638a5de62f 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue
@@ -79,6 +79,16 @@ export default {
required: false,
default: '',
},
+ searchButtonAttributes: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
+ searchInputAttributes: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
},
data() {
let selectedSortOption = this.sortOptions[0]?.sortDirection?.descending;
@@ -163,33 +173,6 @@ export default {
return undefined;
},
},
- watch: {
- /**
- * GlFilteredSearch currently doesn't emit any event when
- * tokens are manually removed from search field so we'd
- * never know when user actually clears all the tokens.
- * This watcher listens for updates to `filterValue` on
- * such instances. :(
- */
- filterValue(newValue, oldValue) {
- const [firstVal] = newValue;
- if (
- !this.initialRender &&
- newValue.length === 1 &&
- firstVal.type === 'filtered-search-term' &&
- !firstVal.value.data
- ) {
- const filtersCleared =
- oldValue[0].type !== 'filtered-search-term' || oldValue[0].value.data !== '';
- this.$emit('onFilter', [], filtersCleared);
- }
-
- // Set initial render flag to false
- // as we don't want to emit event
- // on initial load when value is empty already.
- this.initialRender = false;
- },
- },
created() {
if (this.recentSearchesStorageKey) this.setupRecentSearch();
},
@@ -322,6 +305,10 @@ export default {
return tokenOption.title;
},
+ onClear() {
+ const cleared = true;
+ this.$emit('onFilter', [], cleared);
+ },
},
};
</script>
@@ -343,8 +330,11 @@ export default {
:available-tokens="tokens"
:history-items="filteredRecentSearches"
:suggestions-list-class="suggestionsListClass"
+ :search-button-attributes="searchButtonAttributes"
+ :search-input-attributes="searchInputAttributes"
class="flex-grow-1"
@history-item-selected="handleHistoryItemSelected"
+ @clear="onClear"
@clear-history="handleClearHistory"
@submit="handleFilterSubmit"
>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
index b70317b2ec4..696456be990 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
@@ -95,7 +95,6 @@ export default {
v-if="activeTokenValue"
:size="16"
:src="getAvatarUrl(activeTokenValue)"
- shape="circle"
class="gl-mr-2"
/>
{{ activeTokenValue ? activeTokenValue.name : inputValue }}
diff --git a/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue
index 06949b59823..69548f0e7a8 100644
--- a/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue
+++ b/app/assets/javascripts/vue_shared/components/form/input_copy_toggle_visibility.vue
@@ -110,7 +110,7 @@ export default {
v-gl-tooltip.hover="toggleVisibilityLabel"
:aria-label="toggleVisibilityLabel"
:icon="toggleVisibilityIcon"
- @click="handleToggleVisibilityButtonClick"
+ @click.stop="handleToggleVisibilityButtonClick"
/>
<clipboard-button
v-if="showCopyButton"
diff --git a/app/assets/javascripts/vue_shared/components/header_ci_component.vue b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
index 9bff469b670..f2abade8036 100644
--- a/app/assets/javascripts/vue_shared/components/header_ci_component.vue
+++ b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
@@ -8,8 +8,8 @@ import {
GlTooltip,
} from '@gitlab/ui';
import { isGid, getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { glEmojiTag } from '../../emoji';
-import { __, sprintf } from '../../locale';
+import { glEmojiTag } from '~/emoji';
+import { __, sprintf } from '~/locale';
import CiIconBadge from './ci_badge_link.vue';
import TimeagoTooltip from './time_ago_tooltip.vue';
@@ -117,7 +117,7 @@ export default {
<template>
<header
- class="page-content-header gl-display-flex gl-min-h-7"
+ class="page-content-header gl-md-display-flex gl-min-h-7"
data-qa-selector="pipeline_header"
data-testid="ci-header-content"
>
@@ -163,11 +163,7 @@ export default {
</template>
</section>
- <section
- v-if="$slots.default"
- data-testid="ci-header-action-buttons"
- class="gl-display-flex gl-mr-3"
- >
+ <section v-if="$slots.default" data-testid="ci-header-action-buttons" class="gl-display-flex">
<slot></slot>
</section>
<gl-button
diff --git a/app/assets/javascripts/vue_shared/components/help_popover.vue b/app/assets/javascripts/vue_shared/components/help_popover.vue
index f3b871c91b6..c3f184446a8 100644
--- a/app/assets/javascripts/vue_shared/components/help_popover.vue
+++ b/app/assets/javascripts/vue_shared/components/help_popover.vue
@@ -21,12 +21,17 @@ export default {
default: () => ({}),
},
},
+ methods: {
+ targetFn() {
+ return this.$refs.popoverTrigger?.$el;
+ },
+ },
};
</script>
<template>
<span>
- <gl-button ref="popoverTrigger" variant="link" icon="question" :aria-label="__('Help')" />
- <gl-popover :target="() => $refs.popoverTrigger.$el" v-bind="options">
+ <gl-button ref="popoverTrigger" variant="link" icon="question-o" :aria-label="__('Help')" />
+ <gl-popover :target="targetFn" v-bind="options">
<template v-if="options.title" #title>
<span v-safe-html="options.title"></span>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/identicon.vue b/app/assets/javascripts/vue_shared/components/identicon.vue
deleted file mode 100644
index 87a995464fa..00000000000
--- a/app/assets/javascripts/vue_shared/components/identicon.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-<script>
-import { getIdenticonBackgroundClass, getIdenticonTitle } from '~/helpers/avatar_helper';
-
-export default {
- props: {
- entityId: {
- type: [Number, String],
- required: true,
- },
- entityName: {
- type: String,
- required: true,
- },
- sizeClass: {
- type: String,
- required: false,
- default: 's40',
- },
- },
- computed: {
- identiconBackgroundClass() {
- return getIdenticonBackgroundClass(this.entityId);
- },
- identiconTitle() {
- return getIdenticonTitle(this.entityName);
- },
- },
-};
-</script>
-
-<template>
- <div ref="identicon" :class="[sizeClass, identiconBackgroundClass]" class="avatar identicon">
- {{ identiconTitle }}
- </div>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/line_numbers.vue b/app/assets/javascripts/vue_shared/components/line_numbers.vue
deleted file mode 100644
index 11caf3be00a..00000000000
--- a/app/assets/javascripts/vue_shared/components/line_numbers.vue
+++ /dev/null
@@ -1,31 +0,0 @@
-<script>
-import { GlIcon, GlLink } from '@gitlab/ui';
-
-export default {
- components: {
- GlIcon,
- GlLink,
- },
- props: {
- lines: {
- type: Number,
- required: true,
- },
- },
-};
-</script>
-<template>
- <div class="line-numbers">
- <gl-link
- v-for="line in lines"
- :id="`L${line}`"
- :key="line"
- class="diff-line-num gl-shadow-none!"
- :to="`#LC${line}`"
- :data-line-number="line"
- >
- <gl-icon :size="12" name="link" />
- {{ line }}
- </gl-link>
- </div>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/local_storage_sync.vue b/app/assets/javascripts/vue_shared/components/local_storage_sync.vue
index 33e77b6510c..4ece87310c7 100644
--- a/app/assets/javascripts/vue_shared/components/local_storage_sync.vue
+++ b/app/assets/javascripts/vue_shared/components/local_storage_sync.vue
@@ -1,6 +1,18 @@
<script>
-import { isEqual } from 'lodash';
+import { isEqual, isString } from 'lodash';
+/**
+ * This component will save and restore a value to and from localStorage.
+ * The value will be saved only when the value changes; the initial value won't be saved.
+ *
+ * By default, the value will be saved using JSON.stringify(), and retrieved back using JSON.parse().
+ *
+ * If you would like to save the raw string instead, you may set the 'asString' prop to true, though be aware that this is a
+ * legacy prop to maintain backwards compatibility.
+ *
+ * For new components saving data for the first time, it's recommended to not use 'asString' even if you're saving a string; it will still be
+ * saved and restored properly using JSON.stringify()/JSON.parse().
+ */
export default {
props: {
storageKey: {
@@ -12,7 +24,7 @@ export default {
required: false,
default: '',
},
- asJson: {
+ asString: {
type: Boolean,
required: false,
default: false,
@@ -30,6 +42,8 @@ export default {
},
watch: {
value(newVal) {
+ if (!this.persist) return;
+
this.saveValue(this.serialize(newVal));
},
clear(newVal) {
@@ -67,15 +81,22 @@ export default {
}
},
saveValue(val) {
- if (!this.persist) return;
-
localStorage.setItem(this.storageKey, val);
},
serialize(val) {
- return this.asJson ? JSON.stringify(val) : val;
+ if (!isString(val) && this.asString) {
+ // eslint-disable-next-line no-console
+ console.warn(
+ `[gitlab] LocalStorageSync is saving`,
+ val,
+ `to the key "${this.storageKey}", but it is not a string and the 'asString' prop is true. This will save and restore the stringified value rather than the original value. If this is not intended, please remove or set the 'asString' prop to false.`,
+ );
+ }
+
+ return this.asString ? val : JSON.stringify(val);
},
deserialize(val) {
- return this.asJson ? JSON.parse(val) : val;
+ return this.asString ? val : JSON.parse(val);
},
},
render() {
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 709d3592828..926034efd10 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue
@@ -1,9 +1,9 @@
<script>
-import { GlDropdown, GlDropdownForm, GlFormTextarea, GlButton } from '@gitlab/ui';
+import { GlDropdown, GlDropdownForm, GlFormTextarea, GlButton, GlAlert } from '@gitlab/ui';
import { __, n__ } from '~/locale';
export default {
- components: { GlDropdown, GlDropdownForm, GlFormTextarea, GlButton },
+ components: { GlDropdown, GlDropdownForm, GlFormTextarea, GlButton, GlAlert },
props: {
disabled: {
type: Boolean,
@@ -19,6 +19,11 @@ export default {
required: false,
default: 0,
},
+ errorMessage: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
data() {
return {
@@ -55,6 +60,9 @@ export default {
>
<gl-dropdown-form class="gl-px-4! gl-m-0!">
<label for="commit-message">{{ __('Commit message') }}</label>
+ <gl-alert v-if="errorMessage" variant="danger" :dismissible="false" class="gl-mb-4">
+ {{ errorMessage }}
+ </gl-alert>
<gl-form-textarea
id="commit-message"
ref="commitMessage"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/field.vue b/app/assets/javascripts/vue_shared/components/markdown/field.vue
index e1020ce656b..722df3cc58b 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/field.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/field.vue
@@ -1,5 +1,5 @@
<script>
-import { GlIcon } from '@gitlab/ui';
+import { GlIcon, GlSafeHtmlDirective } from '@gitlab/ui';
import $ from 'jquery';
import '~/behaviors/markdown/render_gfm';
import { debounce, unescape } from 'lodash';
@@ -24,6 +24,9 @@ export default {
GlIcon,
Suggestions,
},
+ directives: {
+ SafeHtml: GlSafeHtmlDirective,
+ },
mixins: [glFeatureFlagsMixin()],
props: {
/**
@@ -308,6 +311,9 @@ export default {
);
},
},
+ safeHtmlConfig: {
+ ADD_TAGS: ['gl-emoji'],
+ },
};
</script>
@@ -369,18 +375,19 @@ export default {
<div
v-show="previewMarkdown"
ref="markdown-preview"
+ v-safe-html:[$options.safeHtmlConfig]="markdownPreview"
class="js-vue-md-preview md md-preview-holder"
- v-html="markdownPreview /* eslint-disable-line vue/no-v-html */"
></div>
</template>
<div
v-if="referencedCommands && previewMarkdown && !markdownPreviewLoading"
+ v-safe-html:[$options.safeHtmlConfig]="referencedCommands"
class="referenced-commands"
- v-html="referencedCommands /* eslint-disable-line vue/no-v-html */"
+ data-testid="referenced-commands"
></div>
<div v-if="shouldShowReferencedUsers" class="referenced-users">
<gl-icon name="warning-solid" />
- <span v-html="addMultipleToDiscussionWarning /* eslint-disable-line vue/no-v-html */"></span>
+ <span v-safe-html:[$options.safeHtmlConfig]="addMultipleToDiscussionWarning"></span>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/header.vue b/app/assets/javascripts/vue_shared/components/markdown/header.vue
index 13189670e17..d0bd5046bf0 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/header.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/header.vue
@@ -10,7 +10,7 @@ import {
} from '~/behaviors/shortcuts/keybindings';
import { getSelectedFragment } from '~/lib/utils/common_utils';
import { s__, __ } from '~/locale';
-import { CopyAsGFM } from '../../../behaviors/markdown/copy_as_gfm';
+import { CopyAsGFM } from '~/behaviors/markdown/copy_as_gfm';
import ToolbarButton from './toolbar_button.vue';
export default {
@@ -187,7 +187,7 @@ export default {
<template #tabs-end>
<div
data-testid="md-header-toolbar"
- :class="{ 'gl-display-none': previewMarkdown }"
+ :class="{ 'gl-display-none!': previewMarkdown }"
class="md-header-toolbar gl-ml-auto gl-pb-3 gl-justify-content-center"
>
<toolbar-button
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 7d8d8c0b90e..4d10c3f0a51 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff.vue
@@ -36,6 +36,11 @@ export default {
required: false,
default: 0,
},
+ failedToLoadMetadata: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
batchSuggestionsCount() {
@@ -80,6 +85,7 @@ export default {
:help-page-path="helpPagePath"
:default-commit-message="defaultCommitMessage"
:inapplicable-reason="suggestion.inapplicable_reason"
+ :failed-to-load-metadata="failedToLoadMetadata"
@apply="applySuggestion"
@applyBatch="applySuggestionBatch"
@addToBatch="addSuggestionToBatch"
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 648e9c9462f..8a1b8363f19 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
@@ -4,6 +4,10 @@ import { isLoggedIn } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import ApplySuggestion from './apply_suggestion.vue';
+const APPLY_SUGGESTION_ERROR_MESSAGE = __(
+ 'Unable to fully load the default commit message. You can still apply this suggestion and the commit message will be correct.',
+);
+
export default {
components: { GlBadge, GlIcon, GlButton, GlLoadingIcon, ApplySuggestion },
directives: { 'gl-tooltip': GlTooltipDirective },
@@ -52,6 +56,11 @@ export default {
required: false,
default: 0,
},
+ failedToLoadMetadata: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -94,6 +103,9 @@ export default {
return true;
},
+ applySuggestionErrorMessage() {
+ return this.failedToLoadMetadata ? APPLY_SUGGESTION_ERROR_MESSAGE : null;
+ },
},
methods: {
apply(message) {
@@ -171,6 +183,7 @@ export default {
:disabled="isDisableButton"
:default-commit-message="defaultCommitMessage"
:batch-suggestions-count="batchSuggestionsCount"
+ :error-message="applySuggestionErrorMessage"
class="gl-ml-3"
@apply="apply"
/>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue b/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
index 2f6776f835e..de3eda6b04f 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
@@ -47,6 +47,11 @@ export default {
required: false,
default: 0,
},
+ failedToLoadMetadata: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -60,6 +65,9 @@ export default {
noteHtml() {
this.reset();
},
+ failedToLoadMetadata() {
+ this.reset();
+ },
},
mounted() {
this.renderSuggestions();
@@ -105,6 +113,7 @@ export default {
helpPagePath,
defaultCommitMessage,
suggestionsCount,
+ failedToLoadMetadata,
} = this;
const suggestion =
suggestions && suggestions[suggestionIndex] ? suggestions[suggestionIndex] : {};
@@ -117,6 +126,7 @@ export default {
helpPagePath,
defaultCommitMessage,
suggestionsCount,
+ failedToLoadMetadata,
},
});
diff --git a/app/assets/javascripts/vue_shared/components/metric_images/metric_images_tab.vue b/app/assets/javascripts/vue_shared/components/metric_images/metric_images_tab.vue
new file mode 100644
index 00000000000..3e796a73f72
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/metric_images/metric_images_tab.vue
@@ -0,0 +1,119 @@
+<script>
+import { GlFormGroup, GlFormInput, GlLoadingIcon, GlModal, GlTab } from '@gitlab/ui';
+import { mapState, mapActions } from 'vuex';
+import { __, s__ } from '~/locale';
+import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
+import MetricImagesTable from '~/vue_shared/components/metric_images/metric_images_table.vue';
+
+export default {
+ components: {
+ GlFormGroup,
+ GlFormInput,
+ GlLoadingIcon,
+ GlModal,
+ GlTab,
+ MetricImagesTable,
+ UploadDropzone,
+ },
+ inject: ['canUpdate', 'projectId', 'iid'],
+ data() {
+ return {
+ currentFiles: [],
+ modalVisible: false,
+ modalUrl: '',
+ modalUrlText: '',
+ };
+ },
+ computed: {
+ ...mapState(['metricImages', 'isLoadingMetricImages', 'isUploadingImage']),
+ actionPrimaryProps() {
+ return {
+ text: this.$options.i18n.modalUpload,
+ attributes: {
+ loading: this.isUploadingImage,
+ disabled: this.isUploadingImage,
+ category: 'primary',
+ variant: 'confirm',
+ },
+ };
+ },
+ },
+ mounted() {
+ this.setInitialData({ modelIid: this.iid, projectId: this.projectId });
+ this.fetchImages();
+ },
+ methods: {
+ ...mapActions(['fetchImages', 'uploadImage', 'setInitialData']),
+ clearInputs() {
+ this.modalVisible = false;
+ this.modalUrl = '';
+ this.modalUrlText = '';
+ this.currentFile = false;
+ },
+ openMetricDialog(files) {
+ this.modalVisible = true;
+ this.currentFiles = files;
+ },
+ async onUpload() {
+ try {
+ await this.uploadImage({
+ files: this.currentFiles,
+ url: this.modalUrl,
+ urlText: this.modalUrlText,
+ });
+ // Error case handled within action
+ } finally {
+ this.clearInputs();
+ }
+ },
+ },
+ i18n: {
+ modalUpload: __('Upload'),
+ modalCancel: __('Cancel'),
+ modalTitle: s__('Incidents|Add image details'),
+ modalDescription: s__(
+ "Incidents|Add text or a link to display with your image. If you don't add either, the file name displays instead.",
+ ),
+ dropDescription: s__(
+ 'Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to attach it to the incident',
+ ),
+ },
+};
+</script>
+
+<template>
+ <gl-tab :title="s__('Incident|Metrics')" data-testid="metrics-tab">
+ <div v-if="isLoadingMetricImages">
+ <gl-loading-icon class="gl-p-5" size="sm" />
+ </div>
+ <gl-modal
+ modal-id="upload-metric-modal"
+ size="sm"
+ :action-primary="actionPrimaryProps"
+ :action-cancel="{ text: $options.i18n.modalCancel }"
+ :title="$options.i18n.modalTitle"
+ :visible="modalVisible"
+ @hidden="clearInputs"
+ @primary.prevent="onUpload"
+ >
+ <p>{{ $options.i18n.modalDescription }}</p>
+ <gl-form-group :label="__('Text (optional)')" label-for="upload-text-input">
+ <gl-form-input id="upload-text-input" v-model="modalUrlText" />
+ </gl-form-group>
+
+ <gl-form-group
+ :label="__('Link (optional)')"
+ label-for="upload-url-input"
+ :description="s__('Incidents|Must start with http or https')"
+ >
+ <gl-form-input id="upload-url-input" v-model="modalUrl" />
+ </gl-form-group>
+ </gl-modal>
+ <metric-images-table v-for="metric in metricImages" :key="metric.id" v-bind="metric" />
+ <upload-dropzone
+ v-if="canUpdate"
+ :drop-description-message="$options.i18n.dropDescription"
+ @change="openMetricDialog"
+ />
+ </gl-tab>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/metric_images/metric_images_table.vue b/app/assets/javascripts/vue_shared/components/metric_images/metric_images_table.vue
new file mode 100644
index 00000000000..8eb8e52728d
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/metric_images/metric_images_table.vue
@@ -0,0 +1,266 @@
+<script>
+import {
+ GlButton,
+ GlFormGroup,
+ GlFormInput,
+ GlCard,
+ GlIcon,
+ GlLink,
+ GlModal,
+ GlSprintf,
+ GlTooltipDirective,
+} from '@gitlab/ui';
+import { mapActions } from 'vuex';
+import { __, s__ } from '~/locale';
+
+export default {
+ i18n: {
+ modalDelete: __('Delete'),
+ modalDescription: s__('Incident|Are you sure you wish to delete this image?'),
+ modalCancel: __('Cancel'),
+ modalTitle: s__('Incident|Deleting %{filename}'),
+ editModalUpdate: __('Update'),
+ editModalTitle: s__('Incident|Editing %{filename}'),
+ editIconTitle: s__('Incident|Edit image text or link'),
+ deleteIconTitle: s__('Incident|Delete image'),
+ },
+ components: {
+ GlButton,
+ GlFormGroup,
+ GlFormInput,
+ GlCard,
+ GlIcon,
+ GlLink,
+ GlModal,
+ GlSprintf,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ inject: ['canUpdate'],
+ props: {
+ id: {
+ type: Number,
+ required: true,
+ },
+ filePath: {
+ type: String,
+ required: true,
+ },
+ filename: {
+ type: String,
+ required: true,
+ },
+ url: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ urlText: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ isCollapsed: false,
+ isDeleting: false,
+ isUpdating: false,
+ modalVisible: false,
+ editModalVisible: false,
+ modalUrl: this.url,
+ modalUrlText: this.urlText,
+ };
+ },
+ computed: {
+ deleteActionPrimaryProps() {
+ return {
+ text: this.$options.i18n.modalDelete,
+ attributes: {
+ loading: this.isDeleting,
+ disabled: this.isDeleting,
+ category: 'primary',
+ variant: 'danger',
+ },
+ };
+ },
+ updateActionPrimaryProps() {
+ return {
+ text: this.$options.i18n.editModalUpdate,
+ attributes: {
+ loading: this.isUpdating,
+ disabled: this.isUpdating,
+ category: 'primary',
+ variant: 'confirm',
+ },
+ };
+ },
+ arrowIconName() {
+ return this.isCollapsed ? 'chevron-right' : 'chevron-down';
+ },
+ bodyClass() {
+ return [
+ 'gl-border-1',
+ 'gl-border-t-solid',
+ 'gl-border-gray-100',
+ { 'gl-display-none': this.isCollapsed },
+ ];
+ },
+ },
+ methods: {
+ ...mapActions(['deleteImage', 'updateImage']),
+ toggleCollapsed() {
+ this.isCollapsed = !this.isCollapsed;
+ },
+ resetEditFields() {
+ this.modalUrl = this.url;
+ this.modalUrlText = this.urlText;
+ this.editModalVisible = false;
+ this.modalVisible = false;
+ },
+ async onDelete() {
+ try {
+ this.isDeleting = true;
+ await this.deleteImage(this.id);
+ } finally {
+ this.isDeleting = false;
+ this.modalVisible = false;
+ }
+ },
+ async onUpdate() {
+ try {
+ this.isUpdating = true;
+ await this.updateImage({
+ imageId: this.id,
+ url: this.modalUrl,
+ urlText: this.modalUrlText,
+ });
+ } finally {
+ this.isUpdating = false;
+ this.modalUrl = '';
+ this.modalUrlText = '';
+ this.editModalVisible = false;
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-card
+ class="collapsible-card border gl-p-0 gl-mb-5"
+ header-class="gl-display-flex gl-align-items-center gl-border-b-0 gl-py-3"
+ :body-class="bodyClass"
+ >
+ <gl-modal
+ body-class="gl-pb-0! gl-min-h-6!"
+ modal-id="delete-metric-modal"
+ size="sm"
+ :visible="modalVisible"
+ :action-primary="deleteActionPrimaryProps"
+ :action-cancel="{ text: $options.i18n.modalCancel }"
+ @primary.prevent="onDelete"
+ @hidden="resetEditFields"
+ >
+ <template #modal-title>
+ <gl-sprintf :message="$options.i18n.modalTitle">
+ <template #filename>
+ {{ filename }}
+ </template>
+ </gl-sprintf>
+ </template>
+ <p>{{ $options.i18n.modalDescription }}</p>
+ </gl-modal>
+
+ <gl-modal
+ modal-id="edit-metric-modal"
+ size="sm"
+ :action-primary="updateActionPrimaryProps"
+ :action-cancel="{ text: $options.i18n.modalCancel }"
+ :visible="editModalVisible"
+ data-testid="metric-image-edit-modal"
+ @hidden="resetEditFields"
+ @primary.prevent="onUpdate"
+ >
+ <template #modal-title>
+ <gl-sprintf :message="$options.i18n.editModalTitle">
+ <template #filename>
+ {{ filename }}
+ </template>
+ </gl-sprintf>
+ </template>
+
+ <gl-form-group :label="__('Text (optional)')" label-for="upload-text-input">
+ <gl-form-input
+ id="upload-text-input"
+ v-model="modalUrlText"
+ data-testid="metric-image-text-field"
+ />
+ </gl-form-group>
+
+ <gl-form-group
+ :label="__('Link (optional)')"
+ label-for="upload-url-input"
+ :description="s__('Incidents|Must start with http or https')"
+ >
+ <gl-form-input
+ id="upload-url-input"
+ v-model="modalUrl"
+ data-testid="metric-image-url-field"
+ />
+ </gl-form-group>
+ </gl-modal>
+
+ <template #header>
+ <div class="gl-w-full gl-display-flex gl-flex-direction-row gl-justify-content-space-between">
+ <div class="gl-display-flex gl-flex-direction-row gl-align-items-center gl-w-full">
+ <gl-button
+ class="collapsible-card-btn gl-display-flex gl-text-decoration-none gl-reset-color! gl-hover-text-blue-800! gl-shadow-none!"
+ :aria-label="filename"
+ variant="link"
+ category="tertiary"
+ data-testid="collapse-button"
+ @click="toggleCollapsed"
+ >
+ <gl-icon class="gl-mr-2" :name="arrowIconName" />
+ </gl-button>
+ <gl-link v-if="url" :href="url" target="_blank" data-testid="metric-image-label-span">
+ {{ urlText == null || urlText == '' ? filename : urlText }}
+ <gl-icon name="external-link" class="gl-vertical-align-middle" />
+ </gl-link>
+ <span v-else data-testid="metric-image-label-span">{{
+ urlText == null || urlText == '' ? filename : urlText
+ }}</span>
+ <div class="gl-ml-auto btn-group">
+ <gl-button
+ v-if="canUpdate"
+ v-gl-tooltip.bottom
+ icon="pencil"
+ :aria-label="__('Edit')"
+ :title="$options.i18n.editIconTitle"
+ data-testid="edit-button"
+ @click="editModalVisible = true"
+ />
+ <gl-button
+ v-if="canUpdate"
+ v-gl-tooltip.bottom
+ icon="remove"
+ :aria-label="__('Delete')"
+ :title="$options.i18n.deleteIconTitle"
+ data-testid="delete-button"
+ @click="modalVisible = true"
+ />
+ </div>
+ </div>
+ </div>
+ </template>
+ <div
+ v-show="!isCollapsed"
+ class="gl-display-flex gl-flex-direction-column"
+ data-testid="metric-image-body"
+ >
+ <img class="gl-max-w-full gl-align-self-center" :src="filePath" />
+ </div>
+ </gl-card>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/metric_images/store/actions.js b/app/assets/javascripts/vue_shared/components/metric_images/store/actions.js
new file mode 100644
index 00000000000..832fb891838
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/metric_images/store/actions.js
@@ -0,0 +1,85 @@
+import createFlash from '~/flash';
+import { s__ } from '~/locale';
+import * as types from './mutation_types';
+
+export const fetchImagesFactory = (service) => async ({ state, commit }) => {
+ commit(types.REQUEST_METRIC_IMAGES);
+ const { modelIid, projectId } = state;
+
+ try {
+ const response = await service.getMetricImages({ id: projectId, modelIid });
+ commit(types.RECEIVE_METRIC_IMAGES_SUCCESS, response);
+ } catch (error) {
+ commit(types.RECEIVE_METRIC_IMAGES_ERROR);
+ createFlash({ message: s__('MetricImages|There was an issue loading metric images.') });
+ }
+};
+
+export const uploadImageFactory = (service) => async (
+ { state, commit },
+ { files, url, urlText },
+) => {
+ commit(types.REQUEST_METRIC_UPLOAD);
+
+ const { modelIid, projectId } = state;
+
+ try {
+ const response = await service.uploadMetricImage({
+ file: files.item(0),
+ id: projectId,
+ modelIid,
+ url,
+ urlText,
+ });
+ commit(types.RECEIVE_METRIC_UPLOAD_SUCCESS, response);
+ } catch (error) {
+ commit(types.RECEIVE_METRIC_UPLOAD_ERROR);
+ createFlash({ message: s__('MetricImages|There was an issue uploading your image.') });
+ }
+};
+
+export const updateImageFactory = (service) => async (
+ { state, commit },
+ { imageId, url, urlText },
+) => {
+ commit(types.REQUEST_METRIC_UPLOAD);
+
+ const { modelIid, projectId } = state;
+
+ try {
+ const response = await service.updateMetricImage({
+ modelIid,
+ id: projectId,
+ imageId,
+ url,
+ urlText,
+ });
+ commit(types.RECEIVE_METRIC_UPDATE_SUCCESS, response);
+ } catch (error) {
+ commit(types.RECEIVE_METRIC_UPLOAD_ERROR);
+ createFlash({ message: s__('MetricImages|There was an issue updating your image.') });
+ }
+};
+
+export const deleteImageFactory = (service) => async ({ state, commit }, imageId) => {
+ const { modelIid, projectId } = state;
+
+ try {
+ await service.deleteMetricImage({ imageId, id: projectId, modelIid });
+ commit(types.RECEIVE_METRIC_DELETE_SUCCESS, imageId);
+ } catch (error) {
+ createFlash({ message: s__('MetricImages|There was an issue deleting the image.') });
+ }
+};
+
+export const setInitialData = ({ commit }, data) => {
+ commit(types.SET_INITIAL_DATA, data);
+};
+
+export default (service) => ({
+ fetchImages: fetchImagesFactory(service),
+ uploadImage: uploadImageFactory(service),
+ updateImage: updateImageFactory(service),
+ deleteImage: deleteImageFactory(service),
+ setInitialData,
+});
diff --git a/app/assets/javascripts/vue_shared/components/metric_images/store/index.js b/app/assets/javascripts/vue_shared/components/metric_images/store/index.js
new file mode 100644
index 00000000000..f13dde9a2bc
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/metric_images/store/index.js
@@ -0,0 +1,14 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import actionsFactory from './actions';
+import mutations from './mutations';
+import createState from './state';
+
+Vue.use(Vuex);
+
+export default (initialState, service) =>
+ new Vuex.Store({
+ actions: actionsFactory(service),
+ mutations,
+ state: createState(initialState),
+ });
diff --git a/app/assets/javascripts/vue_shared/components/metric_images/store/mutation_types.js b/app/assets/javascripts/vue_shared/components/metric_images/store/mutation_types.js
new file mode 100644
index 00000000000..8f1b31217a2
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/metric_images/store/mutation_types.js
@@ -0,0 +1,13 @@
+export const REQUEST_METRIC_IMAGES = 'REQUEST_METRIC_IMAGES';
+export const RECEIVE_METRIC_IMAGES_SUCCESS = 'RECEIVE_METRIC_IMAGES_SUCCESS';
+export const RECEIVE_METRIC_IMAGES_ERROR = 'RECEIVE_METRIC_IMAGES_ERROR';
+
+export const REQUEST_METRIC_UPLOAD = 'REQUEST_METRIC_UPLOAD';
+export const RECEIVE_METRIC_UPLOAD_SUCCESS = 'RECEIVE_METRIC_UPLOAD_SUCCESS';
+export const RECEIVE_METRIC_UPLOAD_ERROR = 'RECEIVE_METRIC_UPLOAD_ERROR';
+
+export const RECEIVE_METRIC_UPDATE_SUCCESS = 'RECEIVE_METRIC_UPDATE_SUCCESS';
+
+export const RECEIVE_METRIC_DELETE_SUCCESS = 'RECEIVE_METRIC_DELETE_SUCCESS';
+
+export const SET_INITIAL_DATA = 'SET_INITIAL_DATA';
diff --git a/app/assets/javascripts/vue_shared/components/metric_images/store/mutations.js b/app/assets/javascripts/vue_shared/components/metric_images/store/mutations.js
new file mode 100644
index 00000000000..b42234b2829
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/metric_images/store/mutations.js
@@ -0,0 +1,39 @@
+import * as types from './mutation_types';
+
+export default {
+ [types.REQUEST_METRIC_IMAGES](state) {
+ state.isLoadingMetricImages = true;
+ },
+ [types.RECEIVE_METRIC_IMAGES_SUCCESS](state, images) {
+ state.metricImages = images || [];
+ state.isLoadingMetricImages = false;
+ },
+ [types.RECEIVE_METRIC_IMAGES_ERROR](state) {
+ state.isLoadingMetricImages = false;
+ },
+ [types.REQUEST_METRIC_UPLOAD](state) {
+ state.isUploadingImage = true;
+ },
+ [types.RECEIVE_METRIC_UPLOAD_SUCCESS](state, image) {
+ state.metricImages.push(image);
+ state.isUploadingImage = false;
+ },
+ [types.RECEIVE_METRIC_UPLOAD_ERROR](state) {
+ state.isUploadingImage = false;
+ },
+ [types.RECEIVE_METRIC_UPDATE_SUCCESS](state, image) {
+ state.isUploadingImage = false;
+ const metricIndex = state.metricImages.findIndex((img) => img.id === image.id);
+ if (metricIndex >= 0) {
+ state.metricImages.splice(metricIndex, 1, image);
+ }
+ },
+ [types.RECEIVE_METRIC_DELETE_SUCCESS](state, imageId) {
+ const metricIndex = state.metricImages.findIndex((image) => image.id === imageId);
+ state.metricImages.splice(metricIndex, 1);
+ },
+ [types.SET_INITIAL_DATA](state, { modelIid, projectId }) {
+ state.modelIid = modelIid;
+ state.projectId = projectId;
+ },
+};
diff --git a/app/assets/javascripts/vue_shared/components/metric_images/store/state.js b/app/assets/javascripts/vue_shared/components/metric_images/store/state.js
new file mode 100644
index 00000000000..b734e5c87a6
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/metric_images/store/state.js
@@ -0,0 +1,10 @@
+export default ({ modelIid, projectId } = {}) => ({
+ // Initial state
+ modelIid,
+ projectId,
+
+ // View state
+ metricImages: [],
+ isLoadingMetricImages: false,
+ isUploadingImage: false,
+});
diff --git a/app/assets/javascripts/vue_shared/components/notes/system_note.vue b/app/assets/javascripts/vue_shared/components/notes/system_note.vue
index 1963d1aa7fe..dd7a851b1be 100644
--- a/app/assets/javascripts/vue_shared/components/notes/system_note.vue
+++ b/app/assets/javascripts/vue_shared/components/notes/system_note.vue
@@ -31,7 +31,7 @@ import { __ } from '~/locale';
import initMRPopovers from '~/mr_popover/';
import noteHeader from '~/notes/components/note_header.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { spriteIcon } from '../../../lib/utils/common_utils';
+import { spriteIcon } from '~/lib/utils/common_utils';
import TimelineEntryItem from './timeline_entry_item.vue';
const MAX_VISIBLE_COMMIT_LIST_COUNT = 3;
diff --git a/app/assets/javascripts/vue_shared/components/project_avatar.vue b/app/assets/javascripts/vue_shared/components/project_avatar.vue
index f16187022a5..402e75962d2 100644
--- a/app/assets/javascripts/vue_shared/components/project_avatar.vue
+++ b/app/assets/javascripts/vue_shared/components/project_avatar.vue
@@ -1,5 +1,6 @@
<script>
import { GlAvatar } from '@gitlab/ui';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
export default {
components: {
@@ -31,12 +32,13 @@ export default {
return this.alt ?? this.projectName;
},
},
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
<template>
<gl-avatar
- shape="rect"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
:entity-name="projectName"
:src="projectAvatarUrl"
:alt="avatarAlt"
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 0bd57c84018..19ffbe37ce7 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
@@ -3,7 +3,7 @@ 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';
-import ProjectAvatar from '~/vue_shared/components/deprecated_project_avatar/default.vue';
+import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
export default {
name: 'ProjectListItem',
@@ -22,6 +22,9 @@ export default {
matcher: { type: String, required: false, default: '' },
},
computed: {
+ projectAvatarUrl() {
+ return this.project.avatar_url || this.project.avatarUrl;
+ },
projectNameWithNamespace() {
return this.project.nameWithNamespace || this.project.name_with_namespace;
},
@@ -49,7 +52,11 @@ export default {
class="gl-display-flex gl-align-items-center gl-flex-wrap project-namespace-name-container"
>
<gl-icon v-if="selected" class="js-selected-icon" name="mobile-issue-close" />
- <project-avatar class="gl-flex-shrink-0 js-project-avatar" :project="project" :size="32" />
+ <project-avatar
+ :project-avatar-url="projectAvatarUrl"
+ :project-name="projectNameWithNamespace"
+ class="gl-mr-3"
+ />
<div
v-if="truncatedNamespace"
:title="projectNameWithNamespace"
diff --git a/app/assets/javascripts/vue_shared/components/registry/persisted_dropdown_selection.vue b/app/assets/javascripts/vue_shared/components/registry/persisted_dropdown_selection.vue
index 36b1a9c49f4..43a8e241d77 100644
--- a/app/assets/javascripts/vue_shared/components/registry/persisted_dropdown_selection.vue
+++ b/app/assets/javascripts/vue_shared/components/registry/persisted_dropdown_selection.vue
@@ -43,7 +43,7 @@ export default {
</script>
<template>
- <local-storage-sync :storage-key="storageKey" :value="selected" @input="setSelected">
+ <local-storage-sync :storage-key="storageKey" :value="selected" as-string @input="setSelected">
<gl-dropdown :text="dropdownText" lazy>
<gl-dropdown-item
v-for="option in parsedOptions"
diff --git a/app/assets/javascripts/vue_shared/components/registry/title_area.vue b/app/assets/javascripts/vue_shared/components/registry/title_area.vue
index d108d8d689d..fc0976b0792 100644
--- a/app/assets/javascripts/vue_shared/components/registry/title_area.vue
+++ b/app/assets/javascripts/vue_shared/components/registry/title_area.vue
@@ -1,6 +1,7 @@
<script>
import { GlAvatar, GlSprintf, GlLink, GlSkeletonLoader } from '@gitlab/ui';
import { isEqual } from 'lodash';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
export default {
name: 'TitleArea',
@@ -53,6 +54,7 @@ export default {
}
},
},
+ AVATAR_SHAPE_OPTION_RECT,
};
</script>
@@ -64,7 +66,7 @@ export default {
<gl-avatar
v-if="avatar"
:src="avatar"
- shape="rect"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
class="gl-align-self-center gl-mr-4"
/>
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 f53b75df4eb..522fbc07f5e 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,8 +1,11 @@
<script>
import { debounce } from 'lodash';
+import issuableLabelsSubscription from 'ee_else_ce/sidebar/queries/issuable_labels.subscription.graphql';
import { MutationOperationMode, getIdFromGraphQLId } from '~/graphql_shared/utils';
import createFlash from '~/flash';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { IssuableType } from '~/issues/constants';
+
import { __ } from '~/locale';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
import { issuableLabelsQueries } from '~/sidebar/constants';
@@ -21,6 +24,7 @@ export default {
DropdownContents,
SidebarEditableItem,
},
+ mixins: [glFeatureFlagsMixin()],
inject: {
allowLabelEdit: {
default: false,
@@ -106,7 +110,7 @@ export default {
data() {
return {
contentIsOnViewport: true,
- issuableLabels: [],
+ issuable: null,
labelsSelectInProgress: false,
oldIid: null,
sidebarExpandedOnClick: false,
@@ -114,14 +118,23 @@ export default {
},
computed: {
isLoading() {
- return this.labelsSelectInProgress || this.$apollo.queries.issuableLabels.loading;
+ return this.labelsSelectInProgress || this.$apollo.queries.issuable.loading;
},
issuableLabelIds() {
return this.issuableLabels.map((label) => label.id);
},
+ issuableLabels() {
+ return this.issuable?.labels.nodes || [];
+ },
+ issuableId() {
+ return this.issuable?.id;
+ },
+ isRealtimeEnabled() {
+ return this.glFeatures.realtimeLabels;
+ },
},
apollo: {
- issuableLabels: {
+ issuable: {
query() {
return issuableLabelsQueries[this.issuableType].issuableQuery;
},
@@ -135,11 +148,40 @@ export default {
};
},
update(data) {
- return data.workspace?.issuable?.labels.nodes || [];
+ return data.workspace?.issuable;
},
error() {
createFlash({ message: __('Error fetching labels.') });
},
+ subscribeToMore: {
+ document() {
+ return issuableLabelsSubscription;
+ },
+ variables() {
+ return {
+ issuableId: this.issuableId,
+ };
+ },
+ skip() {
+ return !this.issuableId || !this.isDropdownVariantSidebar || !this.isRealtimeEnabled;
+ },
+ updateQuery(
+ _,
+ {
+ subscriptionData: {
+ data: { issuableLabelsUpdated },
+ },
+ },
+ ) {
+ if (issuableLabelsUpdated) {
+ const {
+ id,
+ labels: { nodes },
+ } = issuableLabelsUpdated;
+ this.$emit('updateSelectedLabels', { id, labels: nodes });
+ }
+ },
+ },
},
},
watch: {
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk.vue b/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk.vue
new file mode 100644
index 00000000000..6babbca58c3
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk.vue
@@ -0,0 +1,103 @@
+<script>
+import { GlIntersectionObserver, GlSafeHtmlDirective } from '@gitlab/ui';
+import ChunkLine from './chunk_line.vue';
+
+/*
+ * We only highlight the chunk that is currently visible to the user.
+ * By making use of the Intersection Observer API we can determine when a chunk becomes visible and highlight it accordingly.
+ *
+ * Content that is not visible to the user (i.e. not highlighted) do not need to look nice,
+ * so by making text transparent and rendering raw (non-highlighted) text,
+ * the browser spends less resources on painting content that is not immediately relevant.
+ *
+ * Why use transparent text as opposed to hiding content entirely?
+ * 1. If content is hidden entirely, native find text (⌘ + F) won't work.
+ * 2. When URL contains line numbers, the browser needs to be able to jump to the correct line.
+ */
+export default {
+ components: {
+ ChunkLine,
+ GlIntersectionObserver,
+ },
+ directives: {
+ SafeHtml: GlSafeHtmlDirective,
+ },
+ props: {
+ chunkIndex: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
+ isHighlighted: {
+ type: Boolean,
+ required: true,
+ },
+ content: {
+ type: String,
+ required: true,
+ },
+ startingFrom: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
+ totalLines: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
+ language: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ lines() {
+ return this.content.split('\n');
+ },
+ },
+ methods: {
+ handleChunkAppear() {
+ if (!this.isHighlighted) {
+ this.$emit('appear', this.chunkIndex);
+ }
+ },
+ },
+};
+</script>
+<template>
+ <div>
+ <gl-intersection-observer @appear="handleChunkAppear">
+ <div v-if="isHighlighted">
+ <chunk-line
+ v-for="(line, index) in lines"
+ :key="index"
+ :number="startingFrom + index + 1"
+ :content="line"
+ :language="language"
+ />
+ </div>
+ <div v-else class="gl-display-flex">
+ <div class="gl-display-flex gl-flex-direction-column">
+ <a
+ v-for="(n, index) in totalLines"
+ :id="`L${startingFrom + index + 1}`"
+ :key="index"
+ class="gl-ml-5 gl-text-transparent"
+ :href="`#L${startingFrom + index + 1}`"
+ :data-line-number="startingFrom + index + 1"
+ data-testid="line-number"
+ >
+ {{ startingFrom + index + 1 }}
+ </a>
+ </div>
+ <div
+ class="gl-white-space-pre-wrap! gl-text-transparent"
+ data-testid="content"
+ v-text="content"
+ ></div>
+ </div>
+ </gl-intersection-observer>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_line.vue b/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_line.vue
new file mode 100644
index 00000000000..1b8e4bcfec6
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_line.vue
@@ -0,0 +1,74 @@
+<script>
+import { GlLink, GlSafeHtmlDirective } from '@gitlab/ui';
+import { setAttributes } from '~/lib/utils/dom_utils';
+import { BIDI_CHARS, BIDI_CHARS_CLASS_LIST, BIDI_CHAR_TOOLTIP } from '../constants';
+
+export default {
+ components: {
+ GlLink,
+ },
+ directives: {
+ SafeHtml: GlSafeHtmlDirective,
+ },
+ props: {
+ number: {
+ type: Number,
+ required: true,
+ },
+ content: {
+ type: String,
+ required: true,
+ },
+ language: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ formattedContent() {
+ let { content } = this;
+
+ BIDI_CHARS.forEach((bidiChar) => {
+ if (content.includes(bidiChar)) {
+ content = content.replace(bidiChar, this.wrapBidiChar(bidiChar));
+ }
+ });
+
+ return content;
+ },
+ },
+ methods: {
+ wrapBidiChar(bidiChar) {
+ const span = document.createElement('span');
+
+ setAttributes(span, {
+ class: BIDI_CHARS_CLASS_LIST,
+ title: BIDI_CHAR_TOOLTIP,
+ 'data-testid': 'bidi-wrapper',
+ });
+
+ span.innerText = bidiChar;
+
+ return span.outerHTML;
+ },
+ },
+};
+</script>
+<template>
+ <div class="gl-display-flex">
+ <div class="line-numbers gl-pt-0! gl-pb-0! gl-absolute gl-z-index-3">
+ <gl-link
+ :id="`L${number}`"
+ class="file-line-num diff-line-num gl-user-select-none"
+ :to="`#L${number}`"
+ :data-line-number="number"
+ >
+ {{ number }}
+ </gl-link>
+ </div>
+
+ <pre
+ class="code highlight gl-p-0! gl-w-full gl-overflow-visible! gl-ml-11!"
+ ><code><span :id="`LC${number}`" v-safe-html="formattedContent" :lang="language" class="line" data-testid="content"></span></code></pre>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/constants.js b/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
index 9efe0147c37..bed6dd4d5c6 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
@@ -1,3 +1,5 @@
+import { __ } from '~/locale';
+
// Language map from Rouge::Lexer to highlight.js
// Rouge::Lexer - We use it on the BE to determine the language of a source file (https://github.com/rouge-ruby/rouge/blob/master/docs/Languages.md).
// Highlight.js - We use it on the FE to highlight the syntax of a source file (https://github.com/highlightjs/highlight.js/tree/main/src/languages).
@@ -109,3 +111,26 @@ export const ROUGE_TO_HLJS_LANGUAGE_MAP = {
xquery: 'xquery',
yaml: 'yaml',
};
+
+export const LINES_PER_CHUNK = 70;
+
+export const BIDI_CHARS = [
+ '\u202A', // Left-to-Right Embedding (Try treating following text as left-to-right)
+ '\u202B', // Right-to-Left Embedding (Try treating following text as right-to-left)
+ '\u202D', // Left-to-Right Override (Force treating following text as left-to-right)
+ '\u202E', // Right-to-Left Override (Force treating following text as right-to-left)
+ '\u2066', // Left-to-Right Isolate (Force treating following text as left-to-right without affecting adjacent text)
+ '\u2067', // Right-to-Left Isolate (Force treating following text as right-to-left without affecting adjacent text)
+ '\u2068', // First Strong Isolate (Force treating following text in direction indicated by the next character)
+ '\u202C', // Pop Directional Formatting (Terminate nearest LRE, RLE, LRO, or RLO)
+ '\u2069', // Pop Directional Isolate (Terminate nearest LRI or RLI)
+ '\u061C', // Arabic Letter Mark (Right-to-left zero-width Arabic character)
+ '\u200F', // Right-to-Left Mark (Right-to-left zero-width character non-Arabic character)
+ '\u200E', // Left-to-Right Mark (Left-to-right zero-width character)
+];
+
+export const BIDI_CHARS_CLASS_LIST = 'unicode-bidi has-tooltip';
+
+export const BIDI_CHAR_TOOLTIP = __(
+ 'Potentially unwanted character detected: Unicode BiDi Control',
+);
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue b/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue
index 4a78cbacec0..edf2229a9a1 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue
@@ -1,16 +1,22 @@
<script>
import { GlSafeHtmlDirective, GlLoadingIcon } from '@gitlab/ui';
-import LineNumbers from '~/vue_shared/components/line_numbers.vue';
-import { sanitize } from '~/lib/dompurify';
-import { ROUGE_TO_HLJS_LANGUAGE_MAP } from './constants';
-import { wrapLines } from './utils';
-
-const LINE_SELECT_CLASS_NAME = 'hll';
+import LineHighlighter from '~/blob/line_highlighter';
+import eventHub from '~/notes/event_hub';
+import { ROUGE_TO_HLJS_LANGUAGE_MAP, LINES_PER_CHUNK } from './constants';
+import Chunk from './components/chunk.vue';
+/*
+ * This component is optimized to handle source code with many lines of code by splitting source code into chunks of 70 lines of code,
+ * we highlight and display the 1st chunk (L1-70) to the user as quickly as possible.
+ *
+ * The rest of the lines (L71+) is rendered once the browser goes into an idle state (requestIdleCallback).
+ * Each chunk is self-contained, this ensures when for example the width of a container on line 1000 changes,
+ * it does not trigger a repaint on a parent element that wraps all 1000 lines.
+ */
export default {
components: {
- LineNumbers,
GlLoadingIcon,
+ Chunk,
},
directives: {
SafeHtml: GlSafeHtmlDirective,
@@ -27,46 +33,94 @@ export default {
content: this.blob.rawTextBlob,
language: ROUGE_TO_HLJS_LANGUAGE_MAP[this.blob.language],
hljs: null,
+ firstChunk: null,
+ chunks: {},
+ isLoading: true,
+ isLineSelected: false,
+ lineHighlighter: null,
};
},
computed: {
+ splitContent() {
+ return this.content.split('\n');
+ },
lineNumbers() {
- return this.content.split('\n').length;
+ return this.splitContent.length;
},
- highlightedContent() {
- let highlightedContent;
- let { language } = this;
+ },
+ async created() {
+ this.generateFirstChunk();
+ this.hljs = await this.loadHighlightJS();
- if (this.hljs) {
- if (!language) {
- const hljsHighlightAuto = this.hljs.highlightAuto(this.content);
+ if (this.language) {
+ this.languageDefinition = await this.loadLanguage();
+ }
- highlightedContent = hljsHighlightAuto.value;
- language = hljsHighlightAuto.language;
- } else if (this.languageDefinition) {
- highlightedContent = this.hljs.highlight(this.content, { language: this.language }).value;
- }
+ // Highlight the first chunk as soon as highlight.js is available
+ this.highlightChunk(null, true);
+
+ window.requestIdleCallback(async () => {
+ // Generate the remaining chunks once the browser idles to ensure the browser resources are spent on the most important things first
+ this.generateRemainingChunks();
+ this.isLoading = false;
+ await this.$nextTick();
+ this.lineHighlighter = new LineHighlighter({ scrollBehavior: 'auto' });
+ });
+ },
+ methods: {
+ generateFirstChunk() {
+ const lines = this.splitContent.splice(0, LINES_PER_CHUNK);
+ this.firstChunk = this.createChunk(lines);
+ },
+ generateRemainingChunks() {
+ const result = {};
+ for (let i = 0; i < this.splitContent.length; i += LINES_PER_CHUNK) {
+ const chunkIndex = Math.floor(i / LINES_PER_CHUNK);
+ const lines = this.splitContent.slice(i, i + LINES_PER_CHUNK);
+ result[chunkIndex] = this.createChunk(lines, i + LINES_PER_CHUNK);
}
- return wrapLines(highlightedContent, language);
+ this.chunks = result;
},
- },
- watch: {
- highlightedContent() {
- this.$nextTick(() => this.selectLine());
+ createChunk(lines, startingFrom = 0) {
+ return {
+ content: lines.join('\n'),
+ startingFrom,
+ totalLines: lines.length,
+ language: this.language,
+ isHighlighted: false,
+ };
},
- $route() {
+ highlightChunk(index, isFirstChunk) {
+ const chunk = isFirstChunk ? this.firstChunk : this.chunks[index];
+
+ if (chunk.isHighlighted) {
+ return;
+ }
+
+ const { highlightedContent, language } = this.highlight(chunk.content, this.language);
+
+ Object.assign(chunk, { language, content: highlightedContent, isHighlighted: true });
+
this.selectLine();
+
+ this.$nextTick(() => eventHub.$emit('showBlobInteractionZones', this.blob.path));
},
- },
- async mounted() {
- this.hljs = await this.loadHighlightJS();
+ highlight(content, language) {
+ let detectedLanguage = language;
+ let highlightedContent;
+ if (this.hljs) {
+ if (!detectedLanguage) {
+ const hljsHighlightAuto = this.hljs.highlightAuto(content);
+ highlightedContent = hljsHighlightAuto.value;
+ detectedLanguage = hljsHighlightAuto.language;
+ } else if (this.languageDefinition) {
+ highlightedContent = this.hljs.highlight(content, { language: this.language }).value;
+ }
+ }
- if (this.language) {
- this.languageDefinition = await this.loadLanguage();
- }
- },
- methods: {
+ return { highlightedContent, language: detectedLanguage };
+ },
loadHighlightJS() {
// If no language can be mapped to highlight.js we load all common languages else we load only the core (smallest footprint)
return !this.language ? import('highlight.js/lib/common') : import('highlight.js/lib/core');
@@ -83,21 +137,14 @@ export default {
return languageDefinition;
},
- selectLine() {
- const hash = sanitize(this.$route.hash);
- const lineToSelect = hash && this.$el.querySelector(hash);
-
- if (!lineToSelect) {
+ async selectLine() {
+ if (this.isLineSelected || !this.lineHighlighter) {
return;
}
- if (this.$options.currentlySelectedLine) {
- this.$options.currentlySelectedLine.classList.remove(LINE_SELECT_CLASS_NAME);
- }
-
- lineToSelect.classList.add(LINE_SELECT_CLASS_NAME);
- this.$options.currentlySelectedLine = lineToSelect;
- lineToSelect.scrollIntoView({ behavior: 'smooth', block: 'center' });
+ this.isLineSelected = true;
+ await this.$nextTick();
+ this.lineHighlighter.highlightHash(this.$route.hash);
},
},
userColorScheme: window.gon.user_color_scheme,
@@ -105,16 +152,36 @@ export default {
};
</script>
<template>
- <gl-loading-icon v-if="!highlightedContent" size="sm" class="gl-my-5" />
<div
- v-else
- class="file-content code js-syntax-highlight blob-content gl-display-flex"
+ class="file-content code js-syntax-highlight blob-content gl-display-flex gl-flex-direction-column gl-overflow-auto"
:class="$options.userColorScheme"
data-type="simple"
+ :data-path="blob.path"
data-qa-selector="blob_viewer_file_content"
>
- <line-numbers :lines="lineNumbers" />
- <pre class="code highlight gl-pb-0!"><code v-safe-html="highlightedContent"></code>
- </pre>
+ <chunk
+ v-if="firstChunk"
+ :lines="firstChunk.lines"
+ :total-lines="firstChunk.totalLines"
+ :content="firstChunk.content"
+ :starting-from="firstChunk.startingFrom"
+ :is-highlighted="firstChunk.isHighlighted"
+ :language="firstChunk.language"
+ />
+
+ <gl-loading-icon v-if="isLoading" size="sm" class="gl-my-5" />
+ <chunk
+ v-for="(chunk, key, index) in chunks"
+ v-else
+ :key="key"
+ :lines="chunk.lines"
+ :content="chunk.content"
+ :total-lines="chunk.totalLines"
+ :starting-from="chunk.startingFrom"
+ :is-highlighted="chunk.isHighlighted"
+ :chunk-index="index"
+ :language="chunk.language"
+ @appear="highlightChunk"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/utils.js b/app/assets/javascripts/vue_shared/components/source_viewer/utils.js
deleted file mode 100644
index d726a8a55ff..00000000000
--- a/app/assets/javascripts/vue_shared/components/source_viewer/utils.js
+++ /dev/null
@@ -1,28 +0,0 @@
-export const wrapLines = (content, language) => {
- const isValidLanguage = /^[a-z\d\-_]+$/.test(language); // To prevent the possibility of a vulnerability we only allow languages that contain alphanumeric characters ([a-z\d), dashes (-) or underscores (_).
-
- return (
- content &&
- content
- .split('\n')
- .map((line, i) => {
- let formattedLine;
- const attributes = `id="LC${i + 1}" lang="${isValidLanguage ? language : ''}"`;
-
- if (line.includes('<span class="hljs') && !line.includes('</span>')) {
- /**
- * In some cases highlight.js will wrap multiple lines in a span, in these cases we want to append the line number to the existing span
- *
- * example (before): <span class="hljs-code">```bash
- * example (after): <span id="LC67" class="hljs-code">```bash
- */
- formattedLine = line.replace(/(?=class="hljs)/, `${attributes} `);
- } else {
- formattedLine = `<span ${attributes} class="line">${line}</span>`;
- }
-
- return formattedLine;
- })
- .join('\n')
- );
-};
diff --git a/app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue b/app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue
index 66088b33c99..e784bba6698 100644
--- a/app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue
+++ b/app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue
@@ -2,7 +2,7 @@
import { GlTooltipDirective } from '@gitlab/ui';
import timeagoMixin from '../mixins/timeago';
-import '../../lib/utils/datetime_utility';
+import '~/lib/utils/datetime_utility';
/**
* Port of ruby helper time_ago_with_tooltip
diff --git a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue
index f52a3471ea4..c58a5357883 100644
--- a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue
+++ b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_new.vue
@@ -18,7 +18,7 @@
import { GlTooltip, GlAvatar } from '@gitlab/ui';
import defaultAvatarUrl from 'images/no_avatar.png';
import { __ } from '~/locale';
-import { placeholderImage } from '../../../lazy_loader';
+import { placeholderImage } from '~/lazy_loader';
export default {
name: 'UserAvatarImageNew',
@@ -96,11 +96,12 @@ export default {
/>
<gl-tooltip
+ v-if="tooltipText || $slots.default"
:target="() => $refs.userAvatar.$el"
:placement="tooltipPlacement"
boundary="window"
>
- <slot> {{ tooltipText }}</slot>
+ <slot>{{ tooltipText }}</slot>
</gl-tooltip>
</span>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue
index bca10c76038..15ba8e3b39b 100644
--- a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue
+++ b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_image_old.vue
@@ -18,7 +18,7 @@
import { GlTooltip } from '@gitlab/ui';
import defaultAvatarUrl from 'images/no_avatar.png';
import { __ } from '~/locale';
-import { placeholderImage } from '../../../lazy_loader';
+import { placeholderImage } from '~/lazy_loader';
export default {
name: 'UserAvatarImageOld',
@@ -100,11 +100,12 @@ export default {
class="avatar"
/>
<gl-tooltip
+ v-if="tooltipText || $slots.default"
:target="() => $refs.userAvatarImage"
:placement="tooltipPlacement"
boundary="window"
>
- <slot> {{ tooltipText }}</slot>
+ <slot>{{ tooltipText }}</slot>
</gl-tooltip>
</span>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue
index e19d659c179..60b26d688b2 100644
--- a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue
+++ b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue
@@ -1,5 +1,6 @@
<script>
import { GlButton } from '@gitlab/ui';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { sprintf, __ } from '~/locale';
import UserAvatarLink from './user_avatar_link.vue';
@@ -8,6 +9,7 @@ export default {
UserAvatarLink,
GlButton,
},
+ mixins: [glFeatureFlagMixin()],
props: {
items: {
type: Array,
@@ -57,6 +59,9 @@ export default {
return sprintf(__('%{count} more'), { count });
},
+ imgCssClasses() {
+ return this.glFeatures.glAvatarForAllUserAvatars ? 'gl-mr-3' : '';
+ },
},
methods: {
expand() {
@@ -80,6 +85,7 @@ export default {
:img-alt="item.name"
:tooltip-text="item.name"
:img-size="imgSize"
+ :img-css-classes="imgCssClasses"
/>
<template v-if="hasBreakpoint">
<gl-button v-if="hasHiddenItems" variant="link" @click="expand">
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 41507ca94e2..cac8f0a9aa5 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
@@ -8,7 +8,7 @@ import {
GlSprintf,
} from '@gitlab/ui';
import UserNameWithStatus from '~/sidebar/components/assignees/user_name_with_status.vue';
-import { glEmojiTag } from '../../../emoji';
+import { glEmojiTag } from '~/emoji';
import UserAvatarImage from '../user_avatar/user_avatar_image.vue';
const MAX_SKELETON_LINES = 4;
@@ -69,7 +69,7 @@ export default {
<gl-popover :target="target" :delay="200" boundary="viewport" placement="top">
<div class="gl-p-3 gl-line-height-normal gl-display-flex" data-testid="user-popover">
<div class="gl-p-2 flex-shrink-1">
- <user-avatar-image :img-src="user.avatarUrl" :size="60" css-classes="gl-mr-3!" />
+ <user-avatar-image :img-src="user.avatarUrl" :size="64" css-classes="gl-mr-3!" />
</div>
<div class="gl-p-2 gl-w-full gl-min-w-0">
<template v-if="userIsLoading">
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 199516b3eb3..15f84e48179 100644
--- a/app/assets/javascripts/vue_shared/components/web_ide_link.vue
+++ b/app/assets/javascripts/vue_shared/components/web_ide_link.vue
@@ -314,6 +314,7 @@ export default {
<local-storage-sync
storage-key="gl-web-ide-button-selected"
:value="selection"
+ as-string
@input="select"
/>
<gl-modal
diff --git a/app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue b/app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue
index 028d48e7e8a..20f178dfb7d 100644
--- a/app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue
+++ b/app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue
@@ -1,5 +1,10 @@
<script>
-import { GlAlert, GlKeysetPagination, GlSkeletonLoading, GlPagination } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlKeysetPagination,
+ GlDeprecatedSkeletonLoading as GlSkeletonLoading,
+ GlPagination,
+} from '@gitlab/ui';
import { uniqueId } from 'lodash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { updateHistory, setUrlParams } from '~/lib/utils/url_utility';
diff --git a/app/assets/javascripts/vue_shared/mixins/timeago.js b/app/assets/javascripts/vue_shared/mixins/timeago.js
index 45452f2ea35..c5f41d81167 100644
--- a/app/assets/javascripts/vue_shared/mixins/timeago.js
+++ b/app/assets/javascripts/vue_shared/mixins/timeago.js
@@ -1,4 +1,4 @@
-import { formatDate, getTimeago } from '../../lib/utils/datetime_utility';
+import { formatDate, getTimeago } from '~/lib/utils/datetime_utility';
/**
* Mixin with time ago methods used in some vue components
@@ -14,25 +14,5 @@ export default {
tooltipTitle(time) {
return formatDate(time);
},
-
- durationTimeFormatted(duration) {
- const date = new Date(duration * 1000);
-
- let hh = date.getUTCHours();
- let mm = date.getUTCMinutes();
- let ss = date.getSeconds();
-
- if (hh < 10) {
- hh = `0${hh}`;
- }
- if (mm < 10) {
- mm = `0${mm}`;
- }
- if (ss < 10) {
- ss = `0${ss}`;
- }
-
- return `${hh}:${mm}:${ss}`;
- },
},
};
diff --git a/app/assets/javascripts/vue_shared/translate.js b/app/assets/javascripts/vue_shared/translate.js
index 616848639f1..bc1f8865261 100644
--- a/app/assets/javascripts/vue_shared/translate.js
+++ b/app/assets/javascripts/vue_shared/translate.js
@@ -1,4 +1,4 @@
-import { __, n__, s__, sprintf } from '../locale';
+import { __, n__, s__, sprintf } from '~/locale';
export default (Vue) => {
Vue.mixin({
diff --git a/app/assets/javascripts/webpack.js b/app/assets/javascripts/webpack.js
index b901f17790f..1c6e632135d 100644
--- a/app/assets/javascripts/webpack.js
+++ b/app/assets/javascripts/webpack.js
@@ -8,5 +8,5 @@
*/
if (gon && gon.webpack_public_path) {
- __webpack_public_path__ = gon.webpack_public_path; // eslint-disable-line babel/camelcase
+ __webpack_public_path__ = gon.webpack_public_path; // eslint-disable-line camelcase
}
diff --git a/app/assets/javascripts/work_items/components/item_title.vue b/app/assets/javascripts/work_items/components/item_title.vue
index 79840cc4f0f..232510b108d 100644
--- a/app/assets/javascripts/work_items/components/item_title.vue
+++ b/app/assets/javascripts/work_items/components/item_title.vue
@@ -2,12 +2,9 @@
import { escape } from 'lodash';
import { __ } from '~/locale';
-import { WI_TITLE_TRACK_LABEL } from '../constants';
-
export default {
- WI_TITLE_TRACK_LABEL,
props: {
- initialTitle: {
+ title: {
type: String,
required: false,
default: '',
@@ -23,11 +20,6 @@ export default {
default: false,
},
},
- data() {
- return {
- title: this.initialTitle,
- };
- },
methods: {
getSanitizedTitle(inputEl) {
const { innerText } = inputEl;
@@ -50,7 +42,6 @@ export default {
<h2
class="gl-font-weight-normal gl-sm-font-weight-bold gl-my-5 gl-display-inline-block"
:class="{ 'gl-cursor-not-allowed': disabled }"
- data-testid="title"
aria-labelledby="item-title"
>
<span
@@ -59,7 +50,6 @@ export default {
role="textbox"
:aria-label="__('Title')"
:data-placeholder="placeholder"
- :data-track-label="$options.WI_TITLE_TRACK_LABEL"
:contenteditable="!disabled"
class="gl-pseudo-placeholder"
@blur="handleBlur"
diff --git a/app/assets/javascripts/work_items/components/work_item_actions.vue b/app/assets/javascripts/work_items/components/work_item_actions.vue
new file mode 100644
index 00000000000..40b6fcdd204
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_actions.vue
@@ -0,0 +1,93 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlModal, GlModalDirective } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import deleteWorkItemMutation from '../graphql/delete_work_item.mutation.graphql';
+
+export default {
+ i18n: {
+ deleteWorkItem: s__('WorkItem|Delete work item'),
+ },
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlModal,
+ },
+ directives: {
+ GlModal: GlModalDirective,
+ },
+ props: {
+ workItemId: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ canUpdate: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ emits: ['workItemDeleted', 'error'],
+ methods: {
+ deleteWorkItem() {
+ this.$apollo
+ .mutate({
+ mutation: deleteWorkItemMutation,
+ variables: {
+ input: {
+ id: this.workItemId,
+ },
+ },
+ })
+ .then(({ data: { workItemDelete, errors } }) => {
+ if (errors?.length) {
+ throw new Error(errors[0].message);
+ }
+
+ if (workItemDelete?.errors.length) {
+ throw new Error(workItemDelete.errors[0]);
+ }
+
+ this.$emit('workItemDeleted');
+ })
+ .catch((e) => {
+ this.$emit(
+ 'error',
+ e.message ||
+ s__('WorkItem|Something went wrong when deleting the work item. Please try again.'),
+ );
+ });
+ },
+ },
+};
+</script>
+
+<template>
+ <div v-if="canUpdate">
+ <gl-dropdown
+ icon="ellipsis_v"
+ text-sr-only
+ :text="__('More actions')"
+ category="tertiary"
+ no-caret
+ right
+ >
+ <gl-dropdown-item v-gl-modal="'work-item-confirm-delete'">{{
+ $options.i18n.deleteWorkItem
+ }}</gl-dropdown-item>
+ </gl-dropdown>
+ <gl-modal
+ modal-id="work-item-confirm-delete"
+ :title="$options.i18n.deleteWorkItem"
+ :ok-title="$options.i18n.deleteWorkItem"
+ ok-variant="danger"
+ @ok="deleteWorkItem"
+ >
+ {{
+ s__(
+ 'WorkItem|Are you sure you want to delete the work item? This action cannot be reversed.',
+ )
+ }}
+ </gl-modal>
+ </div>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_detail.vue b/app/assets/javascripts/work_items/components/work_item_detail.vue
new file mode 100644
index 00000000000..f2fb1e3ccbc
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_detail.vue
@@ -0,0 +1,73 @@
+<script>
+import { GlAlert } from '@gitlab/ui';
+import { i18n } from '../constants';
+import workItemQuery from '../graphql/work_item.query.graphql';
+import workItemTitleSubscription from '../graphql/work_item_title.subscription.graphql';
+import WorkItemTitle from './work_item_title.vue';
+
+export default {
+ i18n,
+ components: {
+ GlAlert,
+ WorkItemTitle,
+ },
+ props: {
+ workItemId: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ error: undefined,
+ workItem: {},
+ };
+ },
+ apollo: {
+ workItem: {
+ query: workItemQuery,
+ variables() {
+ return {
+ id: this.workItemId,
+ };
+ },
+ skip() {
+ return !this.workItemId;
+ },
+ error() {
+ this.error = this.$options.i18n.fetchError;
+ },
+ subscribeToMore: {
+ document: workItemTitleSubscription,
+ variables() {
+ return {
+ issuableId: this.workItemId,
+ };
+ },
+ },
+ },
+ },
+ computed: {
+ workItemType() {
+ return this.workItem.workItemType?.name;
+ },
+ },
+};
+</script>
+
+<template>
+ <section>
+ <gl-alert v-if="error" variant="danger" @dismiss="error = undefined">
+ {{ error }}
+ </gl-alert>
+
+ <work-item-title
+ :loading="$apollo.queries.workItem.loading"
+ :work-item-id="workItem.id"
+ :work-item-title="workItem.title"
+ :work-item-type="workItemType"
+ @error="error = $event"
+ />
+ </section>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_detail_modal.vue b/app/assets/javascripts/work_items/components/work_item_detail_modal.vue
index 942677bb937..a79091fb8b2 100644
--- a/app/assets/javascripts/work_items/components/work_item_detail_modal.vue
+++ b/app/assets/javascripts/work_items/components/work_item_detail_modal.vue
@@ -1,15 +1,22 @@
<script>
-import { GlModal } from '@gitlab/ui';
-import { s__ } from '~/locale';
-import workItemQuery from '../graphql/work_item.query.graphql';
-import ItemTitle from './item_title.vue';
+import { GlAlert, GlButton, GlModal } from '@gitlab/ui';
+import WorkItemActions from './work_item_actions.vue';
+import WorkItemDetail from './work_item_detail.vue';
export default {
components: {
+ GlAlert,
+ GlButton,
GlModal,
- ItemTitle,
+ WorkItemDetail,
+ WorkItemActions,
},
props: {
+ canUpdate: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
visible: {
type: Boolean,
required: true,
@@ -20,43 +27,55 @@ export default {
default: null,
},
},
+ emits: ['workItemDeleted', 'close'],
data() {
return {
- workItem: {},
+ error: undefined,
};
},
- apollo: {
- workItem: {
- query: workItemQuery,
- variables() {
- return {
- id: this.workItemId,
- };
- },
- update(data) {
- return data.workItem;
- },
- skip() {
- return !this.workItemId;
- },
- error() {
- this.$emit(
- 'error',
- s__('WorkItem|Something went wrong when fetching the work item. Please try again.'),
- );
- },
+ methods: {
+ handleWorkItemDeleted() {
+ this.$emit('workItemDeleted');
+ this.closeModal();
},
- },
- computed: {
- workItemTitle() {
- return this.workItem?.title;
+ closeModal() {
+ this.error = '';
+ this.$emit('close');
+ },
+ setErrorMessage(message) {
+ this.error = message;
},
},
};
</script>
<template>
- <gl-modal hide-footer modal-id="work-item-detail-modal" :visible="visible" @hide="$emit('close')">
- <item-title class="gl-m-0!" :initial-title="workItemTitle" />
+ <gl-modal hide-footer modal-id="work-item-detail-modal" :visible="visible" @hide="closeModal">
+ <template #modal-header>
+ <div class="gl-w-full gl-display-flex gl-align-items-center gl-justify-content-end">
+ <h2 class="modal-title gl-mr-auto">{{ s__('WorkItem|Work Item') }}</h2>
+ <work-item-actions
+ :work-item-id="workItemId"
+ :can-update="canUpdate"
+ @workItemDeleted="handleWorkItemDeleted"
+ @error="setErrorMessage"
+ />
+ <gl-button category="tertiary" icon="close" :aria-label="__('Close')" @click="closeModal" />
+ </div>
+ </template>
+ <gl-alert v-if="error" variant="danger" @dismiss="error = false">
+ {{ error }}
+ </gl-alert>
+
+ <work-item-detail :work-item-id="workItemId" />
</gl-modal>
</template>
+
+<style>
+/* hide the existing close button until we can do it
+ * with https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/2710
+ */
+#work-item-detail-modal .modal-header > .gl-button {
+ display: none;
+}
+</style>
diff --git a/app/assets/javascripts/work_items/components/work_item_title.vue b/app/assets/javascripts/work_items/components/work_item_title.vue
new file mode 100644
index 00000000000..88a825853cc
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_title.vue
@@ -0,0 +1,73 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import Tracking from '~/tracking';
+import { i18n } from '../constants';
+import updateWorkItemMutation from '../graphql/update_work_item.mutation.graphql';
+import ItemTitle from './item_title.vue';
+
+export default {
+ components: {
+ GlLoadingIcon,
+ ItemTitle,
+ },
+ mixins: [Tracking.mixin()],
+ props: {
+ loading: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ workItemId: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ workItemTitle: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ workItemType: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+ computed: {
+ tracking() {
+ return {
+ category: 'workItems:show',
+ label: 'item_title',
+ property: `type_${this.workItemType}`,
+ };
+ },
+ },
+ methods: {
+ async updateTitle(updatedTitle) {
+ if (updatedTitle === this.workItemTitle) {
+ return;
+ }
+
+ try {
+ await this.$apollo.mutate({
+ mutation: updateWorkItemMutation,
+ variables: {
+ input: {
+ id: this.workItemId,
+ title: updatedTitle,
+ },
+ },
+ });
+ this.track('updated_title');
+ } catch {
+ this.$emit('error', i18n.updateError);
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-loading-icon v-if="loading" class="gl-mt-3" size="md" />
+ <item-title v-else :title="workItemTitle" @title-changed="updateTitle" />
+</template>
diff --git a/app/assets/javascripts/work_items/constants.js b/app/assets/javascripts/work_items/constants.js
index 995c02a2c5b..d3bcaf0f95f 100644
--- a/app/assets/javascripts/work_items/constants.js
+++ b/app/assets/javascripts/work_items/constants.js
@@ -1,5 +1,6 @@
-export const widgetTypes = {
- title: 'TITLE',
-};
+import { s__ } from '~/locale';
-export const WI_TITLE_TRACK_LABEL = 'item_title';
+export const i18n = {
+ fetchError: s__('WorkItem|Something went wrong when fetching the work item. Please try again.'),
+ updateError: s__('WorkItem|Something went wrong while updating the work item. Please try again.'),
+};
diff --git a/app/assets/javascripts/work_items/graphql/create_work_item.mutation.graphql b/app/assets/javascripts/work_items/graphql/create_work_item.mutation.graphql
index 9312d1c582b..7f9aaf43068 100644
--- a/app/assets/javascripts/work_items/graphql/create_work_item.mutation.graphql
+++ b/app/assets/javascripts/work_items/graphql/create_work_item.mutation.graphql
@@ -1,18 +1,9 @@
-#import './widget.fragment.graphql'
+#import "./work_item.fragment.graphql"
mutation createWorkItem($input: WorkItemCreateInput!) {
workItemCreate(input: $input) {
workItem {
- id
- title
- workItemType {
- id
- }
- widgets @client {
- nodes {
- ...WidgetBase
- }
- }
+ ...WorkItem
}
}
}
diff --git a/app/assets/javascripts/work_items/graphql/create_work_item_from_task.mutation.graphql b/app/assets/javascripts/work_items/graphql/create_work_item_from_task.mutation.graphql
new file mode 100644
index 00000000000..b25210f5c74
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/create_work_item_from_task.mutation.graphql
@@ -0,0 +1,9 @@
+mutation workItemCreateFromTask($input: WorkItemCreateFromTaskInput!) {
+ workItemCreateFromTask(input: $input) {
+ workItem {
+ id
+ descriptionHtml
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/delete_work_item.mutation.graphql b/app/assets/javascripts/work_items/graphql/delete_work_item.mutation.graphql
new file mode 100644
index 00000000000..c52c49ec5f6
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/delete_work_item.mutation.graphql
@@ -0,0 +1,5 @@
+mutation deleteWorkItem($input: WorkItemDeleteInput!) {
+ workItemDelete(input: $input) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/provider.js b/app/assets/javascripts/work_items/graphql/provider.js
index 28328a840cf..3c2955ce1e2 100644
--- a/app/assets/javascripts/work_items/graphql/provider.js
+++ b/app/assets/javascripts/work_items/graphql/provider.js
@@ -1,41 +1,11 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
-import workItemQuery from './work_item.query.graphql';
-import { resolvers } from './resolvers';
-import typeDefs from './typedefs.graphql';
export function createApolloProvider() {
Vue.use(VueApollo);
- const defaultClient = createDefaultClient(resolvers, {
- typeDefs,
- cacheConfig: {
- possibleTypes: {
- LocalWorkItemWidget: ['LocalTitleWidget'],
- },
- },
- });
-
- defaultClient.cache.writeQuery({
- query: workItemQuery,
- variables: {
- id: 'gid://gitlab/WorkItem/1',
- },
- data: {
- localWorkItem: {
- __typename: 'LocalWorkItem',
- id: 'gid://gitlab/WorkItem/1',
- type: 'FEATURE',
- // eslint-disable-next-line @gitlab/require-i18n-strings
- title: 'Test Work Item',
- widgets: {
- __typename: 'LocalWorkItemWidgetConnection',
- nodes: [],
- },
- },
- },
- });
+ const defaultClient = createDefaultClient();
return new VueApollo({
defaultClient,
diff --git a/app/assets/javascripts/work_items/graphql/resolvers.js b/app/assets/javascripts/work_items/graphql/resolvers.js
deleted file mode 100644
index fb74e27f840..00000000000
--- a/app/assets/javascripts/work_items/graphql/resolvers.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import workItemQuery from './work_item.query.graphql';
-
-export const resolvers = {
- Mutation: {
- localUpdateWorkItem(_, { input }, { cache }) {
- const workItem = {
- __typename: 'LocalWorkItem',
- type: 'FEATURE',
- id: input.id,
- title: input.title,
- widgets: {
- __typename: 'LocalWorkItemWidgetConnection',
- nodes: [],
- },
- };
-
- cache.writeQuery({
- query: workItemQuery,
- variables: { id: input.id },
- data: { localWorkItem: workItem },
- });
-
- return {
- __typename: 'LocalUpdateWorkItemPayload',
- workItem,
- };
- },
- },
-};
diff --git a/app/assets/javascripts/work_items/graphql/typedefs.graphql b/app/assets/javascripts/work_items/graphql/typedefs.graphql
deleted file mode 100644
index 9b4811203f5..00000000000
--- a/app/assets/javascripts/work_items/graphql/typedefs.graphql
+++ /dev/null
@@ -1,56 +0,0 @@
-enum LocalWorkItemType {
- FEATURE
-}
-
-enum LocalWidgetType {
- TITLE
-}
-
-interface LocalWorkItemWidget {
- type: LocalWidgetType!
-}
-
-# Replicating Relay connection type for client schema
-type LocalWorkItemWidgetEdge {
- cursor: String!
- node: LocalWorkItemWidget
-}
-
-type LocalWorkItemWidgetConnection {
- edges: [LocalWorkItemWidgetEdge]
- nodes: [LocalWorkItemWidget]
- pageInfo: PageInfo!
-}
-
-type LocalWorkItem {
- id: ID!
- type: LocalWorkItemType!
- title: String!
- widgets: [LocalWorkItemWidgetConnection]
-}
-
-input LocalCreateWorkItemInput {
- title: String!
-}
-
-input LocalUpdateWorkItemInput {
- id: ID!
- title: String
-}
-
-type LocalCreateWorkItemPayload {
- workItem: LocalWorkItem!
-}
-
-type LocalUpdateWorkItemPayload {
- workItem: LocalWorkItem!
-}
-
-extend type Query {
- localWorkItem(id: ID!): LocalWorkItem!
-}
-
-extend type Mutation {
- localCreateWorkItem(input: LocalCreateWorkItemInput!): LocalCreateWorkItemPayload!
- localUpdateWorkItem(input: LocalUpdateWorkItemInput!): LocalUpdateWorkItemPayload!
-}
diff --git a/app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql b/app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql
index efb1ed8d6df..c0b6e856411 100644
--- a/app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql
+++ b/app/assets/javascripts/work_items/graphql/update_work_item.mutation.graphql
@@ -1,18 +1,9 @@
-#import './widget.fragment.graphql'
+#import "./work_item.fragment.graphql"
mutation workItemUpdate($input: WorkItemUpdateInput!) {
workItemUpdate(input: $input) {
workItem {
- id
- title
- workItemType {
- id
- }
- widgets @client {
- nodes {
- ...WidgetBase
- }
- }
+ ...WorkItem
}
}
}
diff --git a/app/assets/javascripts/work_items/graphql/widget.fragment.graphql b/app/assets/javascripts/work_items/graphql/widget.fragment.graphql
deleted file mode 100644
index 154367dc0d8..00000000000
--- a/app/assets/javascripts/work_items/graphql/widget.fragment.graphql
+++ /dev/null
@@ -1,3 +0,0 @@
-fragment WidgetBase on LocalWorkItemWidget {
- type
-}
diff --git a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
new file mode 100644
index 00000000000..2707d6bb790
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
@@ -0,0 +1,8 @@
+fragment WorkItem on WorkItem {
+ id
+ title
+ workItemType {
+ id
+ name
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/work_item.query.graphql b/app/assets/javascripts/work_items/graphql/work_item.query.graphql
index b32cb4f28fb..1d3dae0649d 100644
--- a/app/assets/javascripts/work_items/graphql/work_item.query.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item.query.graphql
@@ -1,16 +1,7 @@
-#import './widget.fragment.graphql'
+#import "./work_item.fragment.graphql"
-query WorkItem($id: ID!) {
+query workItem($id: ID!) {
workItem(id: $id) {
- id
- title
- workItemType {
- id
- }
- widgets @client {
- nodes {
- ...WidgetBase
- }
- }
+ ...WorkItem
}
}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_title.subscription.graphql b/app/assets/javascripts/work_items/graphql/work_item_title.subscription.graphql
new file mode 100644
index 00000000000..2ac01b79d6f
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/work_item_title.subscription.graphql
@@ -0,0 +1,8 @@
+subscription issuableTitleUpdated($issuableId: IssuableID!) {
+ issuableTitleUpdated(issuableId: $issuableId) {
+ ... on WorkItem {
+ id
+ title
+ }
+ }
+}
diff --git a/app/assets/javascripts/work_items/pages/create_work_item.vue b/app/assets/javascripts/work_items/pages/create_work_item.vue
index cc90cedb110..a95da80ac95 100644
--- a/app/assets/javascripts/work_items/pages/create_work_item.vue
+++ b/app/assets/javascripts/work_items/pages/create_work_item.vue
@@ -1,21 +1,25 @@
<script>
-import { GlButton, GlAlert, GlLoadingIcon, GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlButton, GlAlert, GlLoadingIcon, GlFormSelect } from '@gitlab/ui';
import { s__ } from '~/locale';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import workItemQuery from '../graphql/work_item.query.graphql';
import createWorkItemMutation from '../graphql/create_work_item.mutation.graphql';
+import createWorkItemFromTaskMutation from '../graphql/create_work_item_from_task.mutation.graphql';
import projectWorkItemTypesQuery from '../graphql/project_work_item_types.query.graphql';
import ItemTitle from '../components/item_title.vue';
export default {
+ createErrorText: s__('WorkItem|Something went wrong when creating a work item. Please try again'),
+ fetchTypesErrorText: s__(
+ 'WorkItem|Something went wrong when fetching work item types. Please try again',
+ ),
components: {
GlButton,
GlAlert,
GlLoadingIcon,
- GlDropdown,
- GlDropdownItem,
ItemTitle,
+ GlFormSelect,
},
inject: ['fullPath'],
props: {
@@ -29,6 +33,26 @@ export default {
required: false,
default: '',
},
+ issueGid: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ lockVersion: {
+ type: Number,
+ required: false,
+ default: null,
+ },
+ lineNumberStart: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ lineNumberEnd: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
data() {
return {
@@ -36,6 +60,7 @@ export default {
error: null,
workItemTypes: [],
selectedWorkItemType: null,
+ loading: false,
};
},
apollo: {
@@ -47,12 +72,13 @@ export default {
};
},
update(data) {
- return data.workspace?.workItemTypes?.nodes;
+ return data.workspace?.workItemTypes?.nodes.map((node) => ({
+ value: node.id,
+ text: node.name,
+ }));
},
error() {
- this.error = s__(
- 'WorkItem|Something went wrong when fetching work item types. Please try again',
- );
+ this.error = this.$options.fetchTypesErrorText;
},
},
},
@@ -60,9 +86,24 @@ export default {
dropdownButtonText() {
return this.selectedWorkItemType?.name || s__('WorkItem|Type');
},
+ formOptions() {
+ return [{ value: null, text: s__('WorkItem|Select type') }, ...this.workItemTypes];
+ },
+ isButtonDisabled() {
+ return this.title.trim().length === 0 || !this.selectedWorkItemType;
+ },
},
methods: {
async createWorkItem() {
+ this.loading = true;
+ if (this.isModal) {
+ await this.createWorkItemFromTask();
+ } else {
+ await this.createStandaloneWorkItem();
+ }
+ this.loading = false;
+ },
+ async createStandaloneWorkItem() {
try {
const response = await this.$apollo.mutate({
mutation: createWorkItemMutation,
@@ -70,7 +111,7 @@ export default {
input: {
title: this.title,
projectPath: this.fullPath,
- workItemTypeId: this.selectedWorkItemType?.id,
+ workItemTypeId: this.selectedWorkItemType,
},
},
update(store, { data: { workItemCreate } }) {
@@ -87,32 +128,43 @@ export default {
id,
title,
workItemType,
- widgets: {
- __typename: 'LocalWorkItemWidgetConnection',
- nodes: [],
- },
},
},
});
},
});
-
const {
data: {
workItemCreate: {
- workItem: { id, type },
+ workItem: { id },
},
},
} = response;
- if (!this.isModal) {
- this.$router.push({ name: 'workItem', params: { id: `${getIdFromGraphQLId(id)}` } });
- } else {
- this.$emit('onCreate', { id, title: this.title, type });
- }
+ this.$router.push({ name: 'workItem', params: { id: `${getIdFromGraphQLId(id)}` } });
+ } catch {
+ this.error = this.$options.createErrorText;
+ }
+ },
+ async createWorkItemFromTask() {
+ try {
+ const { data } = await this.$apollo.mutate({
+ mutation: createWorkItemFromTaskMutation,
+ variables: {
+ input: {
+ id: this.issueGid,
+ workItemData: {
+ lockVersion: this.lockVersion,
+ title: this.title,
+ lineNumberStart: Number(this.lineNumberStart),
+ lineNumberEnd: Number(this.lineNumberEnd),
+ workItemTypeId: this.selectedWorkItemType,
+ },
+ },
+ },
+ });
+ this.$emit('onCreate', data.workItemCreateFromTask.workItem.descriptionHtml);
} catch {
- this.error = s__(
- 'WorkItem|Something went wrong when creating a work item. Please try again',
- );
+ this.error = this.$options.createErrorText;
}
},
handleTitleInput(title) {
@@ -125,9 +177,6 @@ export default {
}
this.$emit('closeModal');
},
- selectWorkItemType(type) {
- this.selectedWorkItemType = type;
- },
},
};
</script>
@@ -136,28 +185,19 @@ export default {
<form @submit.prevent="createWorkItem">
<gl-alert v-if="error" variant="danger" @dismiss="error = null">{{ error }}</gl-alert>
<div :class="{ 'gl-px-5': isModal }" data-testid="content">
- <item-title
- :initial-title="title"
- data-testid="title-input"
- @title-input="handleTitleInput"
- />
+ <item-title :title="title" data-testid="title-input" @title-input="handleTitleInput" />
<div>
- <gl-dropdown :text="dropdownButtonText">
- <gl-loading-icon
- v-if="$apollo.queries.workItemTypes.loading"
- size="md"
- data-testid="loading-types"
- />
- <template v-else>
- <gl-dropdown-item
- v-for="type in workItemTypes"
- :key="type.id"
- @click="selectWorkItemType(type)"
- >
- {{ type.name }}
- </gl-dropdown-item>
- </template>
- </gl-dropdown>
+ <gl-loading-icon
+ v-if="$apollo.queries.workItemTypes.loading"
+ size="md"
+ data-testid="loading-types"
+ />
+ <gl-form-select
+ v-else
+ v-model="selectedWorkItemType"
+ :options="formOptions"
+ class="gl-max-w-26"
+ />
</div>
</div>
<div
@@ -166,8 +206,9 @@ export default {
>
<gl-button
variant="confirm"
- :disabled="title.length === 0"
+ :disabled="isButtonDisabled"
:class="{ 'gl-mr-3': !isModal }"
+ :loading="loading"
data-testid="create-button"
type="submit"
>
diff --git a/app/assets/javascripts/work_items/pages/work_item_root.vue b/app/assets/javascripts/work_items/pages/work_item_root.vue
index 32b6fc231a8..b8f2bcff25d 100644
--- a/app/assets/javascripts/work_items/pages/work_item_root.vue
+++ b/app/assets/javascripts/work_items/pages/work_item_root.vue
@@ -1,98 +1,26 @@
<script>
-import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
+import { TYPE_WORK_ITEM } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
-import Tracking from '~/tracking';
-import workItemQuery from '../graphql/work_item.query.graphql';
-import updateWorkItemMutation from '../graphql/update_work_item.mutation.graphql';
-import { WI_TITLE_TRACK_LABEL } from '../constants';
-
-import ItemTitle from '../components/item_title.vue';
-
-const trackingMixin = Tracking.mixin();
+import WorkItemDetail from '../components/work_item_detail.vue';
export default {
- titleUpdatedEvent: 'updated_title',
components: {
- ItemTitle,
- GlAlert,
- GlLoadingIcon,
+ WorkItemDetail,
},
- mixins: [trackingMixin],
props: {
id: {
type: String,
required: true,
},
},
- data() {
- return {
- workItem: {},
- error: false,
- };
- },
- apollo: {
- workItem: {
- query: workItemQuery,
- variables() {
- return {
- id: this.gid,
- };
- },
- },
- },
computed: {
- tracking() {
- return {
- category: 'workItems:show',
- action: 'updated_title',
- label: WI_TITLE_TRACK_LABEL,
- property: '[type_work_item]',
- };
- },
gid() {
- return convertToGraphQLId('WorkItem', this.id);
- },
- },
- methods: {
- async updateWorkItem(updatedTitle) {
- try {
- await this.$apollo.mutate({
- mutation: updateWorkItemMutation,
- variables: {
- input: {
- id: this.gid,
- title: updatedTitle,
- },
- },
- });
- this.track();
- } catch {
- this.error = true;
- }
+ return convertToGraphQLId(TYPE_WORK_ITEM, this.id);
},
},
};
</script>
<template>
- <section>
- <gl-alert v-if="error" variant="danger" @dismiss="error = false">{{
- __('Something went wrong while updating work item. Please try again')
- }}</gl-alert>
- <!-- Title widget placeholder -->
- <div>
- <gl-loading-icon
- v-if="$apollo.queries.workItem.loading"
- size="md"
- data-testid="loading-types"
- />
- <template v-else>
- <item-title
- :initial-title="workItem.title"
- data-testid="title"
- @title-changed="updateWorkItem"
- />
- </template>
- </div>
- </section>
+ <work-item-detail :work-item-id="gid" />
</template>
diff --git a/app/assets/stylesheets/bootstrap_migration.scss b/app/assets/stylesheets/bootstrap_migration.scss
index 27ddff181c5..598ef70297c 100644
--- a/app/assets/stylesheets/bootstrap_migration.scss
+++ b/app/assets/stylesheets/bootstrap_migration.scss
@@ -1,318 +1,6 @@
-$text-color: $gl-text-color;
-
-$brand-primary: $blue-500;
-$brand-success: $green-500;
-$brand-info: $blue-500;
-$brand-warning: $orange-500;
-$brand-danger: $red-500;
-
-$border-radius-base: $gl-border-radius-base;
-
-$modal-body-bg: $white;
-$input-border: $border-color;
-
-$padding-base-vertical: $gl-vert-padding;
-$padding-base-horizontal: $gl-padding;
-
-/*
- * Scss to help with bootstrap 3 to 4 migration
- */
-body,
-.form-control,
-.search form {
- // Override default font size used in non-csslab UI
- // Use rem to keep default font-size at 14px on body so 1rem still
- // fits 8px grid, but also allow users to change browser font size
- font-size: 0.875rem;
-}
-
-legend {
- border-bottom: 1px solid $border-color;
- margin-bottom: 20px;
-}
-
-button,
-html [type='button'],
-[type='reset'],
-[type='submit'],
-[role='button'] {
- // Override bootstrap reboot
- /* stylelint-disable-next-line property-no-vendor-prefix */
- -webkit-appearance: inherit;
- cursor: pointer;
-}
-
-h1,
-.h1,
-h2,
-.h2,
-h3,
-.h3 {
- margin-top: 20px;
- margin-bottom: 10px;
-}
-
-h4,
-.h4,
-h5,
-.h5,
-h6,
-.h6 {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-/* Our adjustments to hx & .hx above add unnecessary margins to modal-title
- and page-title in modals, so we set them to 0 in order to have properly
- formatted modal headers. */
-.modal-header {
- .modal-title,
- .page-title {
- margin-top: 0;
- margin-bottom: 0;
- }
-}
-
-h5,
-.h5 {
- font-size: $gl-font-size;
-}
-
-input[type='file'] {
- // Bootstrap 4 file input height is taller by default
- // which makes them look ugly
- line-height: 1;
-}
-
-b,
-strong {
- font-weight: bold;
-}
-
-a {
- color: $blue-600;
-}
-
-hr {
- overflow: hidden;
-}
-
-.form-group.row .col-form-label {
- // Bootstrap 4 aligns labels to the left
- // for horizontal forms
- @include media-breakpoint-up(md) {
- text-align: right;
- }
-}
-
-code {
- padding: 2px 4px;
- color: $code-color;
- background-color: $gray-50;
- border-radius: $border-radius-default;
-
- .code > &,
- .build-log & {
- background-color: inherit;
- padding: unset;
- }
-}
-
-table {
- // Remove any table border lines
- border-spacing: 0;
-}
-
-@each $breakpoint in map-keys($grid-breakpoints) {
- @include media-breakpoint-up($breakpoint) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
- .d#{$infix}-table-header-group {
- display: table-header-group !important;
- }
- }
-}
-
-.text-secondary {
- // Override Bootstrap's light secondary color
- // We have to use !important because bootstrap has that set as well
- color: $gl-text-color-secondary !important;
-}
-
-.bg-success,
-.bg-primary,
-.bg-info,
-.bg-danger,
-.bg-warning {
- .card-header {
- color: $white;
- }
-}
-
-// Polyfill deprecated selectors
-
-.hidden {
- display: none !important;
- visibility: hidden !important;
-}
-
-.hide {
- display: none;
-}
-
-.dropdown-toggle::after,
-.dropright .dropdown-menu-toggle::after {
- // Remove bootstrap's dropdown caret
- display: none;
-}
-
-// Add to .label so that old system notes that are saved to the db
-// will still receive the correct styling
-.badge:not(.gl-badge),
-.label {
- padding: 4px 5px;
- font-size: 12px;
- font-style: normal;
- font-weight: $gl-font-weight-normal;
- display: inline-block;
-
- &.badge-gray {
- background-color: $label-gray-bg;
- color: $gl-text-color;
- text-shadow: none;
- }
-
- &.badge-inverse {
- background-color: $label-inverse-bg;
- }
-}
-
-.divider {
- // copied rules from node_modules/bootstrap/scss/_dropdown.scss:116
- // this might be safe to just remove instead
- // most places that use divider add overrides to undo these things
- // there is also a probably-unintentional use in deprecated_dropdown_divider.scss
- // so we would end up with .gl-dropdown .dropdown-divider
- height: 0;
- margin: 4px 0;
- overflow: hidden;
- border-top: 1px solid $border-color;
-}
-
-.info-well {
- background: $gray-10;
- color: $gl-text-color;
- border: 1px solid $border-color;
- border-radius: 4px;
- margin-bottom: 16px;
-
- .well-segment {
- padding: 16px;
-
- &:not(:last-of-type) {
- border-bottom: 1px solid $well-inner-border;
- }
-
- p,
- ol,
- ul,
- .form-group {
- &:last-of-type {
- margin-bottom: 0;
- }
- }
- }
-
- .badge.badge-gray {
- background-color: $well-expand-item;
- }
-}
-
-.card {
- &.card-without-border,
- &.bg-light {
- border: 0 !important;
- }
-}
-
-.nav-tabs {
- // Override bootstrap's default border
- border-bottom: 0;
-
- .nav-link {
- border-top: 0;
- border-left: 0;
- border-right: 0;
- }
-
- .nav-item {
- margin-bottom: 0;
- }
-}
-
-pre code {
- white-space: pre-wrap;
-}
-
-.alert {
- border-radius: 0;
-}
-
-.alert-success {
- background-color: $green-500;
- border-color: $green-500;
-}
-
-.alert-info {
- background-color: $blue-500;
- border-color: $blue-500;
-}
-
-.alert-warning {
- background-color: $orange-500;
- border-color: $orange-500;
-}
-
-.alert-danger {
- background-color: $red-500;
- border-color: $red-500;
-}
-
-.alert-success,
-.alert-info,
-.alert-warning,
-.alert-danger {
- color: $white;
-
- h4,
- .alert-link {
- color: $white;
- }
-}
-
-input[type=color].form-control {
- height: $input-height;
-}
-
-.toggle-sidebar-button {
- .collapse-text,
- .icon-chevron-double-lg-left,
- .icon-chevron-double-lg-right {
- color: $gl-text-color-secondary;
- }
-}
-
-.project-templates-buttons {
- .btn {
- vertical-align: unset;
- }
-}
-
-/*
- Bootstrap 4.1.2 introduced a new default vertical alignment which breaks our icons,
- so we need to reset the vertical alignment to the default value. See:
- - https://gitlab.com/gitlab-org/gitlab-foss/issues/51362
- */
-svg {
- vertical-align: baseline;
-}
+// ---
+// Scss to help with bootstrap 3 to 4 migration
+// ---
+@import 'bootstrap_migration_variables';
+@import 'bootstrap_migration_reset';
+@import 'bootstrap_migration_components';
diff --git a/app/assets/stylesheets/bootstrap_migration_components.scss b/app/assets/stylesheets/bootstrap_migration_components.scss
new file mode 100644
index 00000000000..b6cecbe5806
--- /dev/null
+++ b/app/assets/stylesheets/bootstrap_migration_components.scss
@@ -0,0 +1,216 @@
+// ---
+// Scss to help with bootstrap 3 to 4 migration of bootstrap components
+// ---
+.form-control,
+.search form {
+ // Override default font size used in non-csslab UI
+ // Use rem to keep default font-size at 14px on body so 1rem still
+ // fits 8px grid, but also allow users to change browser font size
+ font-size: 0.875rem;
+}
+
+/* Our adjustments to hx & .hx above add unnecessary margins to modal-title
+ and page-title in modals, so we set them to 0 in order to have properly
+ formatted modal headers. */
+.modal-header {
+ .modal-title,
+ .page-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+}
+
+input[type='file'] {
+ // Bootstrap 4 file input height is taller by default
+ // which makes them look ugly
+ line-height: 1;
+}
+
+.form-group.row .col-form-label {
+ // Bootstrap 4 aligns labels to the left
+ // for horizontal forms
+ @include media-breakpoint-up(md) {
+ text-align: right;
+ }
+}
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .d#{$infix}-table-header-group {
+ display: table-header-group !important;
+ }
+ }
+}
+
+.text-secondary {
+ // Override Bootstrap's light secondary color
+ // We have to use !important because bootstrap has that set as well
+ color: $gl-text-color-secondary !important;
+}
+
+.bg-success,
+.bg-primary,
+.bg-info,
+.bg-danger,
+.bg-warning {
+ .card-header {
+ color: $white;
+ }
+}
+
+// Polyfill deprecated selectors
+
+.hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+
+.hide {
+ display: none;
+}
+
+.dropdown-toggle::after,
+.dropright .dropdown-menu-toggle::after {
+ // Remove bootstrap's dropdown caret
+ display: none;
+}
+
+// Add to .label so that old system notes that are saved to the db
+// will still receive the correct styling
+.badge:not(.gl-badge),
+.label {
+ padding: 4px 5px;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: $gl-font-weight-normal;
+ display: inline-block;
+
+ &.badge-gray {
+ background-color: $label-gray-bg;
+ color: $gl-text-color;
+ text-shadow: none;
+ }
+
+ &.badge-inverse {
+ background-color: $label-inverse-bg;
+ }
+}
+
+.divider {
+ // copied rules from node_modules/bootstrap/scss/_dropdown.scss:116
+ // this might be safe to just remove instead
+ // most places that use divider add overrides to undo these things
+ // there is also a probably-unintentional use in deprecated_dropdown_divider.scss
+ // so we would end up with .gl-dropdown .dropdown-divider
+ height: 0;
+ margin: 4px 0;
+ overflow: hidden;
+ border-top: 1px solid $border-color;
+}
+
+.info-well {
+ background: $gray-10;
+ color: $gl-text-color;
+ border: 1px solid $border-color;
+ border-radius: 4px;
+ margin-bottom: 16px;
+
+ .well-segment {
+ padding: 16px;
+
+ &:not(:last-of-type) {
+ border-bottom: 1px solid $well-inner-border;
+ }
+
+ p,
+ ol,
+ ul,
+ .form-group {
+ &:last-of-type {
+ margin-bottom: 0;
+ }
+ }
+ }
+
+ .badge.badge-gray {
+ background-color: $well-expand-item;
+ }
+}
+
+.card {
+ &.card-without-border,
+ &.bg-light {
+ border: 0 !important;
+ }
+}
+
+.nav-tabs {
+ // Override bootstrap's default border
+ border-bottom: 0;
+
+ .nav-link {
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ }
+
+ .nav-item {
+ margin-bottom: 0;
+ }
+}
+
+.alert {
+ border-radius: 0;
+}
+
+.alert-success {
+ background-color: $green-500;
+ border-color: $green-500;
+}
+
+.alert-info {
+ background-color: $blue-500;
+ border-color: $blue-500;
+}
+
+.alert-warning {
+ background-color: $orange-500;
+ border-color: $orange-500;
+}
+
+.alert-danger {
+ background-color: $red-500;
+ border-color: $red-500;
+}
+
+.alert-success,
+.alert-info,
+.alert-warning,
+.alert-danger {
+ color: $white;
+
+ h4,
+ .alert-link {
+ color: $white;
+ }
+}
+
+input[type=color].form-control {
+ height: $input-height;
+}
+
+.toggle-sidebar-button {
+ .collapse-text,
+ .icon-chevron-double-lg-left,
+ .icon-chevron-double-lg-right {
+ color: $gl-text-color-secondary;
+ }
+}
+
+.project-templates-buttons {
+ .btn {
+ vertical-align: unset;
+ }
+}
diff --git a/app/assets/stylesheets/bootstrap_migration_reset.scss b/app/assets/stylesheets/bootstrap_migration_reset.scss
new file mode 100644
index 00000000000..ad315c4ada1
--- /dev/null
+++ b/app/assets/stylesheets/bootstrap_migration_reset.scss
@@ -0,0 +1,94 @@
+// ---
+// Scss to help with bootstrap 3 to 4 migration of core elements
+// ---
+body {
+ // Override default font size used in non-csslab UI
+ // Use rem to keep default font-size at 14px on body so 1rem still
+ // fits 8px grid, but also allow users to change browser font size
+ font-size: 0.875rem;
+}
+
+legend {
+ border-bottom: 1px solid $border-color;
+ margin-bottom: 20px;
+}
+
+button,
+html [type='button'],
+[type='reset'],
+[type='submit'],
+[role='button'] {
+ // Override bootstrap reboot
+ /* stylelint-disable-next-line property-no-vendor-prefix */
+ -webkit-appearance: inherit;
+ cursor: pointer;
+}
+
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+h5,
+.h5 {
+ font-size: $gl-font-size;
+}
+
+b,
+strong {
+ font-weight: bold;
+}
+
+a {
+ color: $blue-600;
+}
+
+hr {
+ overflow: hidden;
+}
+
+code {
+ padding: 2px 4px;
+ color: $code-color;
+ background-color: $gray-50;
+ border-radius: $border-radius-default;
+
+ .code > &,
+ .build-log & {
+ background-color: inherit;
+ padding: unset;
+ }
+}
+
+table {
+ // Remove any table border lines
+ border-spacing: 0;
+}
+
+pre code {
+ white-space: pre-wrap;
+}
+
+/*
+ Bootstrap 4.1.2 introduced a new default vertical alignment which breaks our icons,
+ so we need to reset the vertical alignment to the default value. See:
+ - https://gitlab.com/gitlab-org/gitlab-foss/issues/51362
+ */
+svg {
+ vertical-align: baseline;
+}
diff --git a/app/assets/stylesheets/bootstrap_migration_variables.scss b/app/assets/stylesheets/bootstrap_migration_variables.scss
new file mode 100644
index 00000000000..f3888de4ed8
--- /dev/null
+++ b/app/assets/stylesheets/bootstrap_migration_variables.scss
@@ -0,0 +1,15 @@
+$text-color: $gl-text-color;
+
+$brand-primary: $blue-500;
+$brand-success: $green-500;
+$brand-info: $blue-500;
+$brand-warning: $orange-500;
+$brand-danger: $red-500;
+
+$border-radius-base: $gl-border-radius-base;
+
+$modal-body-bg: $white;
+$input-border: $border-color;
+
+$padding-base-vertical: $gl-vert-padding;
+$padding-base-horizontal: $gl-padding;
diff --git a/app/assets/stylesheets/components/milestone_combobox.scss b/app/assets/stylesheets/components/milestone_combobox.scss
index 5d1709c22ec..94d295c324b 100644
--- a/app/assets/stylesheets/components/milestone_combobox.scss
+++ b/app/assets/stylesheets/components/milestone_combobox.scss
@@ -1,13 +1,4 @@
.milestone-combobox {
- .selected-item {
- /* stylelint-disable-next-line function-url-quotes */
- background: url(asset_path('checkmark.png')) no-repeat 0 2px;
- }
-
- .dropdown-item-space {
- padding: 8px 12px;
- }
-
.dropdown-menu.show {
overflow: hidden;
}
diff --git a/app/assets/stylesheets/framework/awards.scss b/app/assets/stylesheets/framework/awards.scss
index 2c72c4b0f65..1192c51b9aa 100644
--- a/app/assets/stylesheets/framework/awards.scss
+++ b/app/assets/stylesheets/framework/awards.scss
@@ -244,9 +244,13 @@
// above will be deprecated once all instances of "award emoji" are
// migrated to Vue.
-.gl-button .award-emoji-block gl-emoji {
- margin-top: -1px;
- margin-bottom: -1px;
+.gl-button .award-emoji-block {
+ display: contents;
+
+ gl-emoji {
+ margin-top: -1px;
+ margin-bottom: -1px;
+ }
}
.add-reaction-button {
diff --git a/app/assets/stylesheets/framework/broadcast_messages.scss b/app/assets/stylesheets/framework/broadcast_messages.scss
index b8934d2797a..58f986ec0ae 100644
--- a/app/assets/stylesheets/framework/broadcast_messages.scss
+++ b/app/assets/stylesheets/framework/broadcast_messages.scss
@@ -15,6 +15,10 @@
.broadcast-banner-message {
text-align: center;
+
+ p {
+ margin-bottom: 0;
+ }
}
.broadcast-notification-message {
diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index 36a0d3ca3ca..be8a890320f 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -254,10 +254,9 @@ li.note {
}
img.emoji {
- height: 20px;
+ height: 16px;
vertical-align: top;
width: 20px;
- margin-top: 1px;
}
.chart {
diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss
index 7f960e3da51..5c6d9266f7c 100644
--- a/app/assets/stylesheets/framework/dropdowns.scss
+++ b/app/assets/stylesheets/framework/dropdowns.scss
@@ -503,6 +503,7 @@
&.dropdown-menu-user-link::before {
top: 50%;
+ transform: translateY(-50%);
}
}
@@ -520,8 +521,22 @@
}
&.is-active {
- /* stylelint-disable-next-line function-url-quotes */
- background: url(asset_path('checkmark.png')) no-repeat 14px center;
+ position: relative;
+
+ &::before {
+ content: '';
+ display: block;
+ position: absolute;
+ top: 0.5rem;
+ left: 1rem;
+ width: 1rem;
+ height: 1rem;
+ mask-image: asset_url('icons-stacked.svg#check');
+ mask-repeat: no-repeat;
+ mask-size: cover;
+ mask-position: center center;
+ background: $black-normal;
+ }
}
}
}
@@ -692,7 +707,7 @@
.dropdown-label-box {
position: relative;
- top: 3px;
+ top: 0;
margin-right: 5px;
display: inline-block;
width: 15px;
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 1004383cfd3..f44123fc2ed 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -1,5 +1,3 @@
-$top-nav-hover-bg: var(--indigo-900-alpha-008, $indigo-900-alpha-008) !important;
-
.navbar-gitlab {
padding: 0 16px;
z-index: $header-zindex;
@@ -54,7 +52,7 @@ $top-nav-hover-bg: var(--indigo-900-alpha-008, $indigo-900-alpha-008) !important
white-space: nowrap;
img {
- height: 28px;
+ height: 24px;
+ .logo-text {
margin-left: 8px;
@@ -460,7 +458,6 @@ $top-nav-hover-bg: var(--indigo-900-alpha-008, $indigo-900-alpha-008) !important
vertical-align: text-top;
}
- a.upgrade-plan-link gl-emoji,
a.ci-minutes-emoji gl-emoji,
a.trial-link gl-emoji {
font-size: $gl-font-size;
@@ -574,7 +571,7 @@ $top-nav-hover-bg: var(--indigo-900-alpha-008, $indigo-900-alpha-008) !important
}
.frequent-items-list-item-container > a:hover {
- background-color: $top-nav-hover-bg;
+ background-color: $nav-active-bg;
}
}
@@ -589,11 +586,9 @@ $top-nav-hover-bg: var(--indigo-900-alpha-008, $indigo-900-alpha-008) !important
}
.top-nav-menu-item {
- color: var(--indigo-900, $theme-indigo-900) !important;
-
&.active,
&:hover {
- background-color: $top-nav-hover-bg;
+ background-color: $nav-active-bg;
}
.gl-icon {
@@ -603,7 +598,6 @@ $top-nav-hover-bg: var(--indigo-900-alpha-008, $indigo-900-alpha-008) !important
.top-nav-responsive {
@include gl-display-none;
- color: var(--indigo-900, $theme-indigo-900);
}
.top-nav-responsive-open {
diff --git a/app/assets/stylesheets/framework/markdown_area.scss b/app/assets/stylesheets/framework/markdown_area.scss
index 7731ec751c9..7522f791b8e 100644
--- a/app/assets/stylesheets/framework/markdown_area.scss
+++ b/app/assets/stylesheets/framework/markdown_area.scss
@@ -72,7 +72,6 @@
@include media-breakpoint-down(xs) {
.nav-item {
flex: 1;
- border-bottom: 1px solid $border-color;
}
.gl-tab-nav-item {
@@ -84,7 +83,8 @@
width: 100%;
display: flex;
flex-wrap: wrap;
- margin-top: $gl-padding-8;
+ padding-top: $gl-padding-8;
+ border-top: 1px solid $border-color;
}
}
}
diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss
index e77971d5280..d270f802c56 100644
--- a/app/assets/stylesheets/framework/sidebar.scss
+++ b/app/assets/stylesheets/framework/sidebar.scss
@@ -226,3 +226,29 @@
.edit-link {
margin-right: -$gl-spacing-scale-2;
}
+
+.assignee-grid {
+ grid-template-areas: ' attention user';
+ grid-template-columns: min-content 1fr;
+}
+
+.reviewer-grid {
+ grid-template-areas: ' user approval rerequest';
+ grid-template-columns: 1fr min-content min-content;
+
+ &.attention-requests {
+ grid-template-areas: ' attention user approval';
+ grid-template-columns: min-content 1fr min-content;
+ }
+}
+
+.assignee-grid,
+.reviewer-grid {
+ [data-css-area='attention'] {
+ grid-area: attention;
+ }
+
+ [data-css-area='user'] {
+ grid-area: user;
+ }
+}
diff --git a/app/assets/stylesheets/framework/tables.scss b/app/assets/stylesheets/framework/tables.scss
index c6bc8fa0eac..6348703e9e1 100644
--- a/app/assets/stylesheets/framework/tables.scss
+++ b/app/assets/stylesheets/framework/tables.scss
@@ -48,7 +48,7 @@ table {
th {
padding: 10px $gl-padding;
line-height: 20px;
- vertical-align: middle;
+ vertical-align: top;
}
th {
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index 31ef5ae0646..8e3b34e4eaf 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -363,6 +363,7 @@ $well-expand-item: #e8f2f7 !default;
$well-inner-border: #eef0f2 !default;
$well-light-border: #f1f1f1;
$well-light-text-color: #5b6169;
+$nav-active-bg: var(--nav-active-bg, rgba($black, 0.08)) !important;
/*
* Text
diff --git a/app/assets/stylesheets/highlight/diff_custom_colors_addition.scss b/app/assets/stylesheets/highlight/diff_custom_colors_addition.scss
new file mode 100644
index 00000000000..30895a55711
--- /dev/null
+++ b/app/assets/stylesheets/highlight/diff_custom_colors_addition.scss
@@ -0,0 +1,36 @@
+/**
+* CSS variables used below are declared in `app/views/layouts/_diffs_colors_css.haml`
+*/
+.diff-custom-addition-color {
+ .code {
+ .line_holder {
+ .diff-line-num,
+ .line-coverage,
+ .line-codequality,
+ .line_content {
+ &.new {
+ &:not(.hll) {
+ background: var(--diff-addition-color);
+ }
+
+ &.line_content span.idiff {
+ background: var(--diff-addition-color) !important;
+ }
+
+ &::before,
+ a {
+ mix-blend-mode: luminosity;
+ }
+ }
+ }
+ }
+
+ .gd {
+ background-color: var(--diff-addition-color);
+ }
+ }
+
+ .idiff.addition {
+ background: var(--diff-addition-color) !important;
+ }
+}
diff --git a/app/assets/stylesheets/highlight/diff_custom_colors_deletion.scss b/app/assets/stylesheets/highlight/diff_custom_colors_deletion.scss
new file mode 100644
index 00000000000..a8ab43909eb
--- /dev/null
+++ b/app/assets/stylesheets/highlight/diff_custom_colors_deletion.scss
@@ -0,0 +1,36 @@
+/**
+* CSS variables used below are declared in `app/views/layouts/_diffs_colors_css.haml`
+*/
+.diff-custom-deletion-color {
+ .code {
+ .line_holder {
+ .diff-line-num,
+ .line-coverage,
+ .line-codequality,
+ .line_content {
+ &.old {
+ &:not(.hll) {
+ background: var(--diff-deletion-color);
+ }
+
+ &.line_content span.idiff {
+ background: var(--diff-deletion-color) !important;
+ }
+
+ &::before,
+ a {
+ mix-blend-mode: luminosity;
+ }
+ }
+ }
+ }
+
+ .gd {
+ background-color: var(--diff-deletion-color);
+ }
+ }
+
+ .idiff.deletion {
+ background: var(--diff-deletion-color) !important;
+ }
+}
diff --git a/app/assets/stylesheets/highlight/hljs.scss b/app/assets/stylesheets/highlight/hljs.scss
new file mode 100644
index 00000000000..2e31e7c1f6d
--- /dev/null
+++ b/app/assets/stylesheets/highlight/hljs.scss
@@ -0,0 +1,125 @@
+.code.highlight {
+ .hljs-comment {
+ color: var(--color-hljs-comment);
+ }
+
+ .hljs-link {
+ color: var(--color-hljs-link);
+ }
+
+ .hljs-meta {
+ color: var(--color-hljs-meta);
+ }
+
+ .hljs-keyword {
+ color: var(--color-hljs-keyword);
+ }
+
+ .hljs-type {
+ color: var(--color-hljs-type);
+ }
+
+ .hljs-attr,
+ .hljs-property {
+ color: var(--color-hljs-attr);
+ }
+
+ .hljs-built_in {
+ color: var(--color-hljs-builtin);
+ }
+
+ .hljs-literal {
+ color: var(--color-hljs-literal);
+ }
+
+ .hljs-title {
+ color: var(--color-hljs-title);
+
+ &.class_ {
+ color: var(--color-hljs-class);
+ }
+
+ &.function_ {
+ color: var(--color-hljs-function);
+ }
+ }
+
+ .hljs-tag ,
+ .hljs-name {
+ color: var(--color-hljs-tag);
+ }
+
+ .hljs-number {
+ color: var(--color-hljs-number);
+ }
+
+ .hljs-subst {
+ color: var(--color-hljs-subst);
+ }
+
+ .hljs-string,
+ .hljs-section,
+ .hljs-bullet {
+ color: var(--color-hljs-string);
+ }
+
+ .hljs-symbol {
+ color: var(--color-hljs-symbol);
+ }
+
+ .hljs-variable {
+ color: var(--color-hljs-variable);
+
+ &.language_ {
+ color: var(--color-hljs-language);
+ }
+
+ &.constant_ {
+ color: var(--color-hljs-constant);
+ }
+ }
+
+ .hljs-attribute {
+ color: var(--color-hljs-attribute);
+ }
+
+ .hljs-operator {
+ color: var(--color-hljs-operator);
+ }
+
+ .hljs-punctuation {
+ color: var(--color-hljs-punctuation);
+ }
+
+ .hljs-regexp {
+ color: var(--color-hljs-regexp);
+ }
+
+ .hljs-params {
+ color: var(--color-hljs-params);
+ }
+
+ .hljs-doctag {
+ color: var(--color-hljs-doctag);
+ }
+
+ .hljs-selector-tag {
+ color: var(--color-hljs-selector-tag);
+ }
+
+ .hljs-selector-class {
+ color: var(--color-hljs-selector-class);
+ }
+
+ .hljs-selector-id {
+ color: var(--color-hljs-selector-id);
+ }
+
+ .hljs-selector-attr {
+ color: var(--color-hljs-selector-attr);
+ }
+
+ .hljs-selector-pseudo {
+ color: var(--color-hljs-selector-pseudo);
+ }
+}
diff --git a/app/assets/stylesheets/highlight/themes/dark.scss b/app/assets/stylesheets/highlight/themes/dark.scss
index 28878280d24..c51b1f04757 100644
--- a/app/assets/stylesheets/highlight/themes/dark.scss
+++ b/app/assets/stylesheets/highlight/themes/dark.scss
@@ -1,6 +1,7 @@
/* https://github.com/MozMorris/tomorrow-pygments */
@import '../common';
+@import '../hljs';
/*
* Dark syntax colors
@@ -88,6 +89,41 @@ $dark-vg: #c66;
$dark-vi: #c66;
$dark-il: #de935f;
+:root {
+ --color-hljs-comment: #{$dark-c};
+ --color-hljs-variable: #{$dark-k};
+ --color-hljs-link: #{$dark-l};
+ --color-hljs-meta: #{$dark-cp};
+ --color-hljs-keyword: #{$dark-kd};
+ --color-hljs-type: #{$dark-kt};
+ --color-hljs-attr: #{$dark-na};
+ --color-hljs-builtin: #{$dark-nb};
+ --color-hljs-title: #{$dark-n};
+ --color-hljs-class: #{$dark-nc};
+ --color-hljs-function: #{$dark-nf};
+ --color-hljs-tag: #{$dark-nt};
+ --color-hljs-number: #{$dark-mi};
+ --color-hljs-subst: #{$dark-sc};
+ --color-hljs-string: #{$dark-s1};
+ --color-hljs-symbol: #{$dark-ss};
+ --color-hljs-variable: #{$dark-vi};
+ --color-hljs-operator: #{$dark-o};
+ --color-hljs-punctuation: #{$dark-p};
+ --color-hljs-regexp: #{$dark-sr};
+ --color-hljs-constant: #{$dark-nx};
+ --color-hljs-literal: #{$dark-kc};
+ --color-hljs-language: #{$dark-nx};
+ --color-hljs-params: #{$dark-nx};
+ --color-hljs-selector-doctag: #{$dark-cm};
+ --color-hljs-selector-tag: #{$dark-nt};
+ --color-hljs-selector-class: #{$dark-nc};
+ --color-hljs-selector-id: #{$dark-nn};
+ --color-hljs-selector-attr: #{$dark-nt};
+ --color-hljs-selector-pseudo: #{$dark-nd};
+ --default-diff-color-deletion: #ff3333;
+ --default-diff-color-addition: #288f2a;
+}
+
.code.dark {
// Line numbers
.file-line-num {
diff --git a/app/assets/stylesheets/highlight/themes/monokai.scss b/app/assets/stylesheets/highlight/themes/monokai.scss
index 6faf1cffdef..226bb44f0e7 100644
--- a/app/assets/stylesheets/highlight/themes/monokai.scss
+++ b/app/assets/stylesheets/highlight/themes/monokai.scss
@@ -89,6 +89,11 @@ $monokai-gd: #f92672;
$monokai-gi: #a6e22e;
$monokai-gh: #75715e;
+:root {
+ --default-diff-color-deletion: #c87872;
+ --default-diff-color-addition: #678528;
+}
+
.code.monokai {
// Line numbers
.file-line-num {
diff --git a/app/assets/stylesheets/highlight/themes/none.scss b/app/assets/stylesheets/highlight/themes/none.scss
index 9c28d9463dc..7a36aba8be7 100644
--- a/app/assets/stylesheets/highlight/themes/none.scss
+++ b/app/assets/stylesheets/highlight/themes/none.scss
@@ -9,6 +9,11 @@
background-color: $white-normal;
}
+:root {
+ --default-diff-color-deletion: #b4b4b4;
+ --default-diff-color-addition: #b4b4b4;
+}
+
.code.none {
// Line numbers
.file-line-num {
diff --git a/app/assets/stylesheets/highlight/themes/solarized-dark.scss b/app/assets/stylesheets/highlight/themes/solarized-dark.scss
index c9f889c79fc..acd401e1694 100644
--- a/app/assets/stylesheets/highlight/themes/solarized-dark.scss
+++ b/app/assets/stylesheets/highlight/themes/solarized-dark.scss
@@ -92,6 +92,11 @@ $solarized-dark-vg: #268bd2;
$solarized-dark-vi: #268bd2;
$solarized-dark-il: #2aa198;
+:root {
+ --default-diff-color-deletion: #ff362c;
+ --default-diff-color-addition: #647e0e;
+}
+
.code.solarized-dark {
// Line numbers
.file-line-num {
diff --git a/app/assets/stylesheets/highlight/themes/solarized-light.scss b/app/assets/stylesheets/highlight/themes/solarized-light.scss
index 0108d7e496f..ddcecc4cbcf 100644
--- a/app/assets/stylesheets/highlight/themes/solarized-light.scss
+++ b/app/assets/stylesheets/highlight/themes/solarized-light.scss
@@ -94,6 +94,11 @@ $solarized-light-vg: #268bd2;
$solarized-light-vi: #268bd2;
$solarized-light-il: #2aa198;
+:root {
+ --default-diff-color-deletion: #dc322f;
+ --default-diff-color-addition: #859900;
+}
+
@mixin match-line {
color: $black-transparent;
background: $solarized-light-matchline-bg;
diff --git a/app/assets/stylesheets/highlight/themes/white.scss b/app/assets/stylesheets/highlight/themes/white.scss
index ed1d9c924c0..8698e448c94 100644
--- a/app/assets/stylesheets/highlight/themes/white.scss
+++ b/app/assets/stylesheets/highlight/themes/white.scss
@@ -3,3 +3,8 @@
@include conflict-colors('white');
}
+
+:root {
+ --default-diff-color-deletion: #eb919b;
+ --default-diff-color-addition: #a0f5b4;
+} \ No newline at end of file
diff --git a/app/assets/stylesheets/highlight/white_base.scss b/app/assets/stylesheets/highlight/white_base.scss
index 91d8f4a1ba5..20a36d2e8b1 100644
--- a/app/assets/stylesheets/highlight/white_base.scss
+++ b/app/assets/stylesheets/highlight/white_base.scss
@@ -149,7 +149,6 @@ pre.code,
.diff-line-num {
&.old {
background-color: $line-number-old;
- border-color: $line-removed-dark;
a {
color: scale-color($line-number-old, $red: -30%, $green: -30%, $blue: -30%);
@@ -158,7 +157,6 @@ pre.code,
&.new {
background-color: $line-number-new;
- border-color: $line-added-dark;
a {
color: scale-color($line-number-new, $red: -30%, $green: -30%, $blue: -30%);
diff --git a/app/assets/stylesheets/notify_base.scss b/app/assets/stylesheets/notify_base.scss
index 8c6f9a27077..0ca1398c609 100644
--- a/app/assets/stylesheets/notify_base.scss
+++ b/app/assets/stylesheets/notify_base.scss
@@ -1,5 +1,6 @@
-@import 'framework/mixins';
@import 'framework/variables';
+@import 'framework/variables_overrides';
+@import 'framework/mixins';
img {
max-width: 100%;
diff --git a/app/assets/stylesheets/notify_enhanced.scss b/app/assets/stylesheets/notify_enhanced.scss
index 5df5a8592bf..a366498ea03 100644
--- a/app/assets/stylesheets/notify_enhanced.scss
+++ b/app/assets/stylesheets/notify_enhanced.scss
@@ -2,20 +2,30 @@
// keep parts that affect elements that can appear in emails;
// omit Bootstrap Reboot since it adds unnecessary styles to every element.
@import 'notify_base';
+
+// bootstrap variables, mixins, functions
@import 'bootstrap/scss/functions';
@import 'bootstrap/scss/variables';
@import 'bootstrap/scss/mixins';
+
+// bootstrap styles
@import 'bootstrap/scss/code';
+
+// @gitlab/ui variables, mixins, functions
@import '@gitlab/ui/src/scss/variables';
@import '@gitlab/ui/src/scss/utility-mixins/index';
-@import '@gitlab/ui/src/scss/components';
-@import 'bootstrap_migration';
-@import 'framework/common';
+
+// @gitlab/ui styles
+@import '@gitlab/ui/src/components/base/icon/icon';
+@import '@gitlab/ui/src/components/base/label/label';
+
+// gitlab styles
+@import 'bootstrap_migration_variables';
+@import 'bootstrap_migration_reset';
@import 'framework/gfm';
@import 'framework/kbd';
@import 'framework/tables';
@import 'framework/typography';
-@import 'framework/emojis';
body {
font-family: $regular-font;
@@ -26,11 +36,15 @@ a {
text-decoration: none;
}
-.content {
- .md {
- padding: 1rem 0;
- }
+.gl-mb-5 {
+ @include gl-mb-5;
+}
+.gl-mt-5 {
+ @include gl-mt-5;
+}
+
+.content {
hr {
border: 1px solid #e1e1e1;
}
diff --git a/app/assets/stylesheets/page_bundles/boards.scss b/app/assets/stylesheets/page_bundles/boards.scss
index f91ca489bdf..eecd4954e39 100644
--- a/app/assets/stylesheets/page_bundles/boards.scss
+++ b/app/assets/stylesheets/page_bundles/boards.scss
@@ -198,7 +198,7 @@
border-bottom: 1px solid var(--gray-100, $gray-100);
height: 3rem;
- .js-max-issue-size::before {
+ .max-issue-size::before {
content: '/';
}
}
diff --git a/app/assets/stylesheets/page_bundles/import.scss b/app/assets/stylesheets/page_bundles/import.scss
index b7a4d9564fe..cd5e6d32e4e 100644
--- a/app/assets/stylesheets/page_bundles/import.scss
+++ b/app/assets/stylesheets/page_bundles/import.scss
@@ -1,18 +1,22 @@
@import 'mixins_and_variables_and_functions';
+.import-jobs-from-col {
+ width: 37%;
+}
+
+
.import-jobs-to-col {
- width: 39%;
+ width: 37%;
}
.import-jobs-status-col {
- width: 15%;
+ width: 25%;
}
.import-jobs-cta-col {
width: 1%;
}
-
.import-entities-target-select {
&.disabled {
.import-entities-target-select-separator {
diff --git a/app/assets/stylesheets/page_bundles/jira_connect_users.scss b/app/assets/stylesheets/page_bundles/jira_connect_users.scss
index 6725bf8f1a1..602910adad9 100644
--- a/app/assets/stylesheets/page_bundles/jira_connect_users.scss
+++ b/app/assets/stylesheets/page_bundles/jira_connect_users.scss
@@ -1,13 +1 @@
-@import 'mixins_and_variables_and_functions';
-
-.jira-connect-users-container {
- margin-left: auto;
- margin-right: auto;
- width: px-to-rem(350px);
-}
-
-.devise-layout-html body .navless-container {
- @include media-breakpoint-down(xs) {
- padding-top: 65px;
- }
-}
+@import '../themes/theme_indigo';
diff --git a/app/assets/stylesheets/page_bundles/learn_gitlab.scss b/app/assets/stylesheets/page_bundles/learn_gitlab.scss
index 10a4a210d41..189aefb330b 100644
--- a/app/assets/stylesheets/page_bundles/learn_gitlab.scss
+++ b/app/assets/stylesheets/page_bundles/learn_gitlab.scss
@@ -1,11 +1,3 @@
.learn-gitlab-info-card-content {
height: 200px;
}
-
-.learn-gitlab-section-card {
- height: 400px;
-}
-
-.learn-gitlab-section-card-header {
- height: 165px;
-}
diff --git a/app/assets/stylesheets/page_bundles/milestone.scss b/app/assets/stylesheets/page_bundles/milestone.scss
index 989219552a6..aa582db10d2 100644
--- a/app/assets/stylesheets/page_bundles/milestone.scss
+++ b/app/assets/stylesheets/page_bundles/milestone.scss
@@ -7,21 +7,7 @@ $status-box-line-height: 26px;
}
.milestones {
- padding: $gl-padding-8;
- margin-top: $gl-padding-8;
- border-radius: $border-radius-default;
- background-color: var(--gray-100, $gray-100);
-
.milestone {
- border: 0;
- padding: $gl-padding-top $gl-padding;
- border-radius: $border-radius-default;
- background-color: var(--white, $white);
-
- &:not(:last-child) {
- margin-bottom: $gl-padding-4;
- }
-
h4 {
font-weight: $gl-font-weight-bold;
}
diff --git a/app/assets/stylesheets/pages/clusters.scss b/app/assets/stylesheets/pages/clusters.scss
index d9ad82d4e4b..27d81d8e53b 100644
--- a/app/assets/stylesheets/pages/clusters.scss
+++ b/app/assets/stylesheets/pages/clusters.scss
@@ -1,12 +1,4 @@
.clusters-container {
- .empty-state .svg-content {
- @include gl-pb-0;
-
- img {
- width: 100px;
- }
- }
-
@include media-breakpoint-down(xs) {
.nav-controls {
@include gl-w-full;
diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss
index 9bb4c5357e7..f127b0dc66c 100644
--- a/app/assets/stylesheets/pages/issues.scss
+++ b/app/assets/stylesheets/pages/issues.scss
@@ -311,7 +311,7 @@ ul.related-merge-requests > li gl-emoji {
.description.work-items-enabled {
ul.task-list {
> li.task-list-item {
- padding-inline-start: 2.25rem;
+ padding-inline-start: 2.5rem;
.js-add-task {
svg {
@@ -324,7 +324,7 @@ ul.related-merge-requests > li gl-emoji {
}
> input.task-list-item-checkbox {
- left: 0.875rem;
+ left: 1.25rem;
}
&:hover,
diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss
index c84a83c1fab..18a0f119edf 100644
--- a/app/assets/stylesheets/pages/search.scss
+++ b/app/assets/stylesheets/pages/search.scss
@@ -45,6 +45,36 @@ input[type='checkbox']:hover {
transition: border-color ease-in-out $default-transition-duration,
background-color ease-in-out $default-transition-duration;
}
+
+ &.is-not-active {
+ .btn.gl-clear-icon-button {
+ display: none;
+ }
+
+ &::after {
+ content: '/';
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ right: 8px;
+ transform: translateY(calc(50% - 4px));
+ padding: 4px 5px;
+ font-size: $gl-font-size-small;
+ font-family: $monospace-font;
+ line-height: 1;
+ vertical-align: middle;
+ border-width: 0;
+ border-style: solid;
+ border-image: none;
+ border-radius: 3px;
+ box-shadow: none;
+ white-space: pre-wrap;
+ // Safari
+ word-wrap: break-word;
+ overflow-wrap: break-word;
+ word-break: keep-all;
+ }
+ }
}
.header-search-dropdown-menu {
diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss
index 5956368a977..0c7b74684cc 100644
--- a/app/assets/stylesheets/pages/settings.scss
+++ b/app/assets/stylesheets/pages/settings.scss
@@ -110,9 +110,14 @@
.bs-callout,
.form-check:first-child,
- .form-text.text-muted {
+ .form-check .form-text.text-muted,
+ .form-check + .form-text.text-muted {
margin-top: 0;
}
+
+ .form-check .form-text.text-muted {
+ margin-bottom: $grid-size;
+ }
}
.settings-list-icon {
diff --git a/app/assets/stylesheets/snippets.scss b/app/assets/stylesheets/snippets.scss
index d38c1818f53..f79237eee3d 100644
--- a/app/assets/stylesheets/snippets.scss
+++ b/app/assets/stylesheets/snippets.scss
@@ -33,6 +33,10 @@
text-align: left;
}
+ .file-holder {
+ margin: 0;
+ }
+
.file-content.code {
border: $border-style;
border-radius: 0 0 $border-radius-default $border-radius-default;
diff --git a/app/assets/stylesheets/startup/startup-dark.scss b/app/assets/stylesheets/startup/startup-dark.scss
index 00195f553dc..62d45332204 100644
--- a/app/assets/stylesheets/startup/startup-dark.scss
+++ b/app/assets/stylesheets/startup/startup-dark.scss
@@ -9,7 +9,6 @@ body.gl-dark {
--gray-900: #fafafa;
--green-100: #0d532a;
--green-700: #91d4a8;
- --indigo-900-alpha-008: rgba(235, 235, 250, 0.08);
--gl-text-color: #fafafa;
--border-color: #4f4f4f;
--black: #fff;
@@ -453,9 +452,12 @@ a.gl-badge.badge-warning:active {
.gl-form-input.form-control:disabled,
.gl-form-input.form-control:not(.form-control-plaintext):not([type="color"]):read-only {
background-color: #1f1f1f;
- color: #868686;
box-shadow: inset 0 0 0 1px #404040;
+}
+.gl-form-input:disabled,
+.gl-form-input.form-control:disabled {
cursor: not-allowed;
+ color: #868686;
}
.gl-form-input::placeholder,
.gl-form-input.form-control::placeholder {
@@ -544,9 +546,7 @@ a.gl-badge.badge-warning:active {
padding-right: 2rem;
padding-left: 1.75rem;
}
-body,
-.form-control,
-.search form {
+body {
font-size: 0.875rem;
}
button,
@@ -564,6 +564,13 @@ strong {
a {
color: #63a6e9;
}
+svg {
+ vertical-align: baseline;
+}
+.form-control,
+.search form {
+ font-size: 0.875rem;
+}
.hidden {
display: none !important;
visibility: hidden !important;
@@ -588,9 +595,6 @@ a {
.toggle-sidebar-button .icon-chevron-double-lg-left {
color: #999;
}
-svg {
- vertical-align: baseline;
-}
html {
overflow-y: scroll;
}
@@ -804,7 +808,7 @@ input {
white-space: nowrap;
}
.navbar-gitlab .header-content .title img {
- height: 28px;
+ height: 24px;
}
.navbar-gitlab .header-content .title img + .logo-text {
margin-left: 8px;
@@ -1512,6 +1516,29 @@ svg.s16 {
.header-search {
width: 320px;
}
+.header-search.is-not-active::after {
+ content: "/";
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ right: 8px;
+ transform: translateY(calc(50% - 4px));
+ padding: 4px 5px;
+ font-size: 12px;
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas",
+ "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ line-height: 1;
+ vertical-align: middle;
+ border-width: 0;
+ border-style: solid;
+ border-image: none;
+ border-radius: 3px;
+ box-shadow: none;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ overflow-wrap: break-word;
+ word-break: keep-all;
+}
.search {
margin: 0 8px;
}
@@ -1739,7 +1766,6 @@ body.gl-dark {
--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;
@@ -1769,7 +1795,7 @@ body.gl-dark {
box-shadow: none;
}
.nav-sidebar li.active:not(.fly-out-top-item) > a:not(.has-sub-items) {
- background-color: var(--indigo-900-alpha-008);
+ background-color: var(--nav-active-bg);
}
body.gl-dark {
--gl-theme-accent: #868686;
@@ -1851,6 +1877,10 @@ body.gl-dark .header-search input::placeholder {
body.gl-dark .header-search input:active::placeholder {
color: #868686;
}
+body.gl-dark .header-search.is-not-active::after {
+ color: #fafafa;
+ background-color: rgba(250, 250, 250, 0.2);
+}
body.gl-dark .search form {
background-color: rgba(250, 250, 250, 0.2);
}
@@ -1972,7 +2002,6 @@ body.gl-dark {
--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;
diff --git a/app/assets/stylesheets/startup/startup-general.scss b/app/assets/stylesheets/startup/startup-general.scss
index 6d66e207bdc..a8b7299b935 100644
--- a/app/assets/stylesheets/startup/startup-general.scss
+++ b/app/assets/stylesheets/startup/startup-general.scss
@@ -438,9 +438,12 @@ a.gl-badge.badge-warning:active {
.gl-form-input.form-control:disabled,
.gl-form-input.form-control:not(.form-control-plaintext):not([type="color"]):read-only {
background-color: #fafafa;
- color: #868686;
box-shadow: inset 0 0 0 1px #dbdbdb;
+}
+.gl-form-input:disabled,
+.gl-form-input.form-control:disabled {
cursor: not-allowed;
+ color: #868686;
}
.gl-form-input::placeholder,
.gl-form-input.form-control::placeholder {
@@ -529,9 +532,7 @@ a.gl-badge.badge-warning:active {
padding-right: 2rem;
padding-left: 1.75rem;
}
-body,
-.form-control,
-.search form {
+body {
font-size: 0.875rem;
}
button,
@@ -549,6 +550,13 @@ strong {
a {
color: #1068bf;
}
+svg {
+ vertical-align: baseline;
+}
+.form-control,
+.search form {
+ font-size: 0.875rem;
+}
.hidden {
display: none !important;
visibility: hidden !important;
@@ -573,9 +581,6 @@ a {
.toggle-sidebar-button .icon-chevron-double-lg-left {
color: #666;
}
-svg {
- vertical-align: baseline;
-}
html {
overflow-y: scroll;
}
@@ -789,7 +794,7 @@ input {
white-space: nowrap;
}
.navbar-gitlab .header-content .title img {
- height: 28px;
+ height: 24px;
}
.navbar-gitlab .header-content .title img + .logo-text {
margin-left: 8px;
@@ -1497,6 +1502,29 @@ svg.s16 {
.header-search {
width: 320px;
}
+.header-search.is-not-active::after {
+ content: "/";
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ right: 8px;
+ transform: translateY(calc(50% - 4px));
+ padding: 4px 5px;
+ font-size: 12px;
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas",
+ "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ line-height: 1;
+ vertical-align: middle;
+ border-width: 0;
+ border-style: solid;
+ border-image: none;
+ border-radius: 3px;
+ box-shadow: none;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ overflow-wrap: break-word;
+ word-break: keep-all;
+}
.search {
margin: 0 8px;
}
diff --git a/app/assets/stylesheets/startup/startup-signin.scss b/app/assets/stylesheets/startup/startup-signin.scss
index 213d1c013a0..751ad26ca21 100644
--- a/app/assets/stylesheets/startup/startup-signin.scss
+++ b/app/assets/stylesheets/startup/startup-signin.scss
@@ -301,9 +301,12 @@ fieldset:disabled a.btn {
.gl-form-input.form-control:disabled,
.gl-form-input.form-control:not(.form-control-plaintext):not([type="color"]):read-only {
background-color: #fafafa;
- color: #868686;
box-shadow: inset 0 0 0 1px #dbdbdb;
+}
+.gl-form-input:disabled,
+.gl-form-input.form-control:disabled {
cursor: not-allowed;
+ color: #868686;
}
.gl-form-input::placeholder,
.gl-form-input.form-control::placeholder {
@@ -369,8 +372,7 @@ fieldset:disabled a.btn {
outline: none;
background-color: #0b5cad;
}
-body,
-.form-control {
+body {
font-size: 0.875rem;
}
[type="submit"] {
@@ -387,6 +389,12 @@ a {
hr {
overflow: hidden;
}
+svg {
+ vertical-align: baseline;
+}
+.form-control {
+ font-size: 0.875rem;
+}
.hidden {
display: none !important;
visibility: hidden !important;
@@ -394,9 +402,6 @@ hr {
.hide {
display: none;
}
-svg {
- vertical-align: baseline;
-}
html {
overflow-y: scroll;
}
diff --git a/app/assets/stylesheets/themes/_dark.scss b/app/assets/stylesheets/themes/_dark.scss
index 3cb8c58a380..550e3981401 100644
--- a/app/assets/stylesheets/themes/_dark.scss
+++ b/app/assets/stylesheets/themes/_dark.scss
@@ -70,7 +70,6 @@ $indigo-700: #a6a6de;
$indigo-800: #d1d1f0;
$indigo-900: #ebebfa;
$indigo-950: #f7f7ff;
-$indigo-900-alpha-008: rgba($indigo-900, 0.08);
$purple-50: #232150;
$purple-100: #2f2a6b;
@@ -174,7 +173,6 @@ body.gl-dark {
--indigo-800: #{$indigo-800};
--indigo-900: #{$indigo-900};
--indigo-950: #{$indigo-950};
- --indigo-900-alpha-008: #{$indigo-900-alpha-008};
--purple-50: #{$purple-50};
--purple-100: #{$purple-100};
diff --git a/app/assets/stylesheets/themes/dark_mode_overrides.scss b/app/assets/stylesheets/themes/dark_mode_overrides.scss
index bb9a9cf0497..83254fe1a52 100644
--- a/app/assets/stylesheets/themes/dark_mode_overrides.scss
+++ b/app/assets/stylesheets/themes/dark_mode_overrides.scss
@@ -48,7 +48,7 @@
}
> a:hover {
- background-color: var(--indigo-900-alpha-008);
+ background-color: var(--nav-active-bg);
}
&.active {
@@ -56,7 +56,7 @@
&:not(.fly-out-top-item) {
> a:not(.has-sub-items) {
- background-color: var(--indigo-900-alpha-008);
+ background-color: var(--nav-active-bg);
}
}
}
diff --git a/app/assets/stylesheets/themes/theme_helper.scss b/app/assets/stylesheets/themes/theme_helper.scss
index c6e29c7f8b0..07194e2b532 100644
--- a/app/assets/stylesheets/themes/theme_helper.scss
+++ b/app/assets/stylesheets/themes/theme_helper.scss
@@ -176,6 +176,11 @@
}
}
}
+
+ &.is-not-active::after {
+ color: $search-and-nav-links;
+ background-color: rgba($search-and-nav-links, 0.2);
+ }
}
.search {
diff --git a/app/assets/stylesheets/utilities.scss b/app/assets/stylesheets/utilities.scss
index 0511a179980..d7a5e21e303 100644
--- a/app/assets/stylesheets/utilities.scss
+++ b/app/assets/stylesheets/utilities.scss
@@ -366,8 +366,3 @@ to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1709
/* stylelint-disable property-no-vendor-prefix */
-webkit-backdrop-filter: blur(2px); // still required by Safari
}
-
-// Will be moved to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/2708
-.gl-inset-border-l-3-red-600 {
- box-shadow: inset $gl-border-size-3 0 0 0 $red-600;
-}
diff --git a/app/components/diffs/base_component.rb b/app/components/diffs/base_component.rb
new file mode 100644
index 00000000000..9e1347d1e84
--- /dev/null
+++ b/app/components/diffs/base_component.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module Diffs
+ class BaseComponent < ViewComponent::Base
+ # To make converting the partials to components easier,
+ # we delegate all missing methods to the helpers,
+ # where they probably are.
+ delegate_missing_to :helpers
+ end
+end
diff --git a/app/components/diffs/overflow_warning_component.html.haml b/app/components/diffs/overflow_warning_component.html.haml
new file mode 100644
index 00000000000..907d066e73d
--- /dev/null
+++ b/app/components/diffs/overflow_warning_component.html.haml
@@ -0,0 +1,9 @@
+= render Pajamas::AlertComponent.new(title: _('Too many changes to show.'),
+ variant: :warning,
+ alert_class: 'gl-mb-5') do
+ .gl-alert-body
+ = message
+
+ .gl-alert-actions
+ = diff_link
+ = patch_link
diff --git a/app/components/diffs/overflow_warning_component.rb b/app/components/diffs/overflow_warning_component.rb
new file mode 100644
index 00000000000..0d0e225beb4
--- /dev/null
+++ b/app/components/diffs/overflow_warning_component.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+module Diffs
+ class OverflowWarningComponent < BaseComponent
+ # Skipping coverage because of https://gitlab.com/gitlab-org/gitlab/-/issues/357381
+ #
+ # This is fully tested by the output in the view part of this component,
+ # but undercoverage doesn't understand the relationship between the two parts.
+ #
+ # :nocov:
+ def initialize(diffs:, diff_files:, project:, commit: nil, merge_request: nil)
+ @diffs = diffs
+ @diff_files = diff_files
+ @project = project
+ @commit = commit
+ @merge_request = merge_request
+ end
+
+ def message
+ html_escape(message_text) % {
+ display_size: @diff_files.size,
+ real_size: @diffs.real_size,
+ strong_open: '<strong>'.html_safe,
+ strong_close: '</strong>'.html_safe
+ }
+ end
+
+ def diff_link
+ text = _("Plain diff")
+
+ if commit?
+ link_to text, project_commit_path(@project, @commit, format: :diff), class: button_classes
+ elsif merge_request?
+ link_to text, merge_request_path(@merge_request, format: :diff), class: button_classes
+ end
+ end
+
+ def patch_link
+ text = _("Email patch")
+
+ if commit?
+ link_to text, project_commit_path(@project, @commit, format: :patch), class: button_classes
+ elsif merge_request?
+ link_to text, merge_request_path(@merge_request, format: :patch), class: button_classes
+ end
+ end
+
+ private
+
+ def commit?
+ current_controller?(:commit) &&
+ @commit.present?
+ end
+
+ def merge_request?
+ current_controller?("projects/merge_requests/diffs") &&
+ @merge_request.present? &&
+ @merge_request.persisted?
+ end
+
+ def message_text
+ _(
+ "To preserve performance only %{strong_open}%{display_size} " \
+ "of %{real_size}%{strong_close} files are displayed."
+ )
+ end
+
+ def button_classes
+ "btn gl-alert-action btn-default gl-button btn-default-secondary"
+ end
+ # :nocov:
+ end
+end
diff --git a/app/components/diffs/stats_component.html.haml b/app/components/diffs/stats_component.html.haml
new file mode 100644
index 00000000000..c0e816639a7
--- /dev/null
+++ b/app/components/diffs/stats_component.html.haml
@@ -0,0 +1 @@
+.js-diff-stats-dropdown{ data: { changed: @changed, added: @added, deleted: @removed, files: diff_files_data } }
diff --git a/app/components/diffs/stats_component.rb b/app/components/diffs/stats_component.rb
new file mode 100644
index 00000000000..55589c7b015
--- /dev/null
+++ b/app/components/diffs/stats_component.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+module Diffs
+ class StatsComponent < BaseComponent
+ attr_reader :diff_files
+
+ def initialize(diff_files:)
+ @diff_files = diff_files
+ @changed ||= diff_files.size
+ @added ||= diff_files.sum(&:added_lines)
+ @removed ||= diff_files.sum(&:removed_lines)
+ end
+
+ def diff_files_data
+ diffs_map = @diff_files.map do |f|
+ {
+ href: "##{helpers.hexdigest(f.file_path)}",
+ title: f.new_path,
+ name: f.file_path,
+ path: diff_file_path_text(f),
+ icon: diff_file_changed_icon(f),
+ iconColor: "#{diff_file_changed_icon_color(f)}",
+ added: f.added_lines,
+ removed: f.removed_lines
+ }
+ end
+
+ Gitlab::Json.dump(diffs_map)
+ end
+
+ # Disabled undercoverage reports for this method
+ # as it returns a false positive on the last line,
+ # which is covered in the tests
+ #
+ # Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/357381
+ #
+ # :nocov:
+ def diff_file_path_text(diff_file, max: 60)
+ path = diff_file.new_path
+
+ return path unless path.size > max && max > 3
+
+ "...#{path[-(max - 3)..]}"
+ end
+ # :nocov:
+
+ private
+
+ def diff_file_changed_icon(diff_file)
+ if diff_file.deleted_file?
+ "file-deletion"
+ elsif diff_file.new_file?
+ "file-addition"
+ else
+ "file-modified"
+ end
+ end
+
+ def diff_file_changed_icon_color(diff_file)
+ if diff_file.deleted_file?
+ "danger"
+ elsif diff_file.new_file?
+ "success"
+ end
+ end
+ end
+end
diff --git a/app/components/pajamas/alert_component.html.haml b/app/components/pajamas/alert_component.html.haml
new file mode 100644
index 00000000000..a1d3c700e57
--- /dev/null
+++ b/app/components/pajamas/alert_component.html.haml
@@ -0,0 +1,13 @@
+.gl-alert{ role: 'alert', class: ["gl-alert-#{@variant}", @alert_class], data: @alert_data }
+ = sprite_icon(icon, css_class: icon_classes)
+ - if @dismissible
+ %button.btn.gl-dismiss-btn.btn-default.btn-sm.gl-button.btn-default-tertiary.btn-icon.js-close{ type: 'button',
+ aria: { label: _('Dismiss') },
+ class: @close_button_class,
+ data: @close_button_data }
+ = sprite_icon('close')
+ .gl-alert-content{ role: 'alert' }
+ - if @title
+ %h4.gl-alert-title
+ = @title
+ = content
diff --git a/app/components/pajamas/alert_component.rb b/app/components/pajamas/alert_component.rb
new file mode 100644
index 00000000000..4bb6c41661b
--- /dev/null
+++ b/app/components/pajamas/alert_component.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+# Renders a GlAlert root element
+module Pajamas
+ class AlertComponent < Pajamas::Component
+ # @param [String] title
+ # @param [Symbol] variant
+ # @param [Boolean] dismissible
+ # @param [String] alert_class
+ # @param [Hash] alert_data
+ # @param [String] close_button_class
+ # @param [Hash] close_button_data
+ def initialize(
+ title: nil, variant: :info, dismissible: true,
+ alert_class: nil, alert_data: {}, close_button_class: nil, close_button_data: {})
+ @title = title
+ @variant = variant
+ @dismissible = dismissible
+ @alert_class = alert_class
+ @alert_data = alert_data
+ @close_button_class = close_button_class
+ @close_button_data = close_button_data
+ end
+
+ private
+
+ delegate :sprite_icon, to: :helpers
+
+ ICONS = {
+ info: 'information-o',
+ warning: 'warning',
+ success: 'check-circle',
+ danger: 'error',
+ tip: 'bulb'
+ }.freeze
+
+ def icon
+ ICONS[@variant]
+ end
+
+ def icon_classes
+ "gl-alert-icon#{' gl-alert-icon-no-title' if @title.nil?}"
+ end
+ end
+end
diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb
index a680c1f4517..75d1e4bf6a0 100644
--- a/app/controllers/admin/application_settings_controller.rb
+++ b/app/controllers/admin/application_settings_controller.rb
@@ -13,7 +13,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
before_action :disable_query_limiting, only: [:usage_data]
- feature_category :not_owned, [
+ feature_category :not_owned, [ # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
:general, :reporting, :metrics_and_profiling, :network,
:preferences, :update, :reset_health_check_token
]
@@ -53,6 +53,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
end
def service_usage_data
+ @service_ping_data_present = Rails.cache.exist?('usage_data')
end
def update
diff --git a/app/controllers/admin/background_jobs_controller.rb b/app/controllers/admin/background_jobs_controller.rb
index d4b906d5e33..4eda35d66f6 100644
--- a/app/controllers/admin/background_jobs_controller.rb
+++ b/app/controllers/admin/background_jobs_controller.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
class Admin::BackgroundJobsController < Admin::ApplicationController
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
end
diff --git a/app/controllers/admin/background_migrations_controller.rb b/app/controllers/admin/background_migrations_controller.rb
index e21e6fd2dcb..42b89a3317e 100644
--- a/app/controllers/admin/background_migrations_controller.rb
+++ b/app/controllers/admin/background_migrations_controller.rb
@@ -6,8 +6,8 @@ class Admin::BackgroundMigrationsController < Admin::ApplicationController
def index
@relations_by_tab = {
'queued' => batched_migration_class.queued.queue_order,
- 'failed' => batched_migration_class.failed.queue_order,
- 'finished' => batched_migration_class.finished.queue_order.reverse_order
+ 'failed' => batched_migration_class.with_status(:failed).queue_order,
+ 'finished' => batched_migration_class.with_status(:finished).queue_order.reverse_order
}
@current_tab = @relations_by_tab.key?(params[:tab]) ? params[:tab] : 'queued'
@@ -17,14 +17,14 @@ class Admin::BackgroundMigrationsController < Admin::ApplicationController
def pause
migration = batched_migration_class.find(params[:id])
- migration.paused!
+ migration.pause!
redirect_back fallback_location: { action: 'index' }
end
def resume
migration = batched_migration_class.find(params[:id])
- migration.active!
+ migration.execute!
redirect_back fallback_location: { action: 'index' }
end
diff --git a/app/controllers/admin/broadcast_messages_controller.rb b/app/controllers/admin/broadcast_messages_controller.rb
index ef843a84e6c..8b672929f88 100644
--- a/app/controllers/admin/broadcast_messages_controller.rb
+++ b/app/controllers/admin/broadcast_messages_controller.rb
@@ -45,8 +45,8 @@ class Admin::BroadcastMessagesController < Admin::ApplicationController
end
def preview
- broadcast_message = BroadcastMessage.new(broadcast_message_params)
- render json: { message: render_broadcast_message(broadcast_message) }
+ @broadcast_message = BroadcastMessage.new(broadcast_message_params)
+ render partial: 'admin/broadcast_messages/preview'
end
protected
@@ -58,8 +58,8 @@ class Admin::BroadcastMessagesController < Admin::ApplicationController
def broadcast_message_params
params.require(:broadcast_message).permit(%i(
color
+ theme
ends_at
- font
message
starts_at
target_path
diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb
index d12ccfc7423..20e36e5fd84 100644
--- a/app/controllers/admin/dashboard_controller.rb
+++ b/app/controllers/admin/dashboard_controller.rb
@@ -5,7 +5,7 @@ class Admin::DashboardController < Admin::ApplicationController
COUNTED_ITEMS = [Project, User, Group].freeze
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
# rubocop: disable CodeReuse/ActiveRecord
def index
diff --git a/app/controllers/admin/health_check_controller.rb b/app/controllers/admin/health_check_controller.rb
index 5733929c25e..3614f83723d 100644
--- a/app/controllers/admin/health_check_controller.rb
+++ b/app/controllers/admin/health_check_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Admin::HealthCheckController < Admin::ApplicationController
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
def show
@errors = HealthCheck::Utils.process_checks(checks)
diff --git a/app/controllers/admin/integrations_controller.rb b/app/controllers/admin/integrations_controller.rb
index db9835e65ec..ad0ee0b2cef 100644
--- a/app/controllers/admin/integrations_controller.rb
+++ b/app/controllers/admin/integrations_controller.rb
@@ -5,10 +5,6 @@ class Admin::IntegrationsController < Admin::ApplicationController
before_action :not_found, unless: -> { instance_level_integrations? }
- before_action do
- push_frontend_feature_flag(:integration_form_sections, default_enabled: :yaml)
- end
-
feature_category :integrations
def overrides
diff --git a/app/controllers/admin/plan_limits_controller.rb b/app/controllers/admin/plan_limits_controller.rb
index 420fd93fad5..7bfbabe8dfc 100644
--- a/app/controllers/admin/plan_limits_controller.rb
+++ b/app/controllers/admin/plan_limits_controller.rb
@@ -5,7 +5,7 @@ class Admin::PlanLimitsController < Admin::ApplicationController
before_action :set_plan_limits
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
def create
redirect_path = referer_path(request) || general_admin_application_settings_path
@@ -38,6 +38,14 @@ class Admin::PlanLimitsController < Admin::ApplicationController
pypi_max_file_size
terraform_module_max_file_size
generic_packages_max_file_size
+ ci_pipeline_size
+ ci_active_jobs
+ ci_active_pipelines
+ ci_project_subscriptions
+ ci_pipeline_schedules
+ ci_needs_size_limit
+ ci_registered_group_runners
+ ci_registered_project_runners
])
end
end
diff --git a/app/controllers/admin/requests_profiles_controller.rb b/app/controllers/admin/requests_profiles_controller.rb
index fbbe8c24637..b60cb7ff9c2 100644
--- a/app/controllers/admin/requests_profiles_controller.rb
+++ b/app/controllers/admin/requests_profiles_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Admin::RequestsProfilesController < Admin::ApplicationController
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
def index
@profile_token = Gitlab::RequestProfiler.profile_token
diff --git a/app/controllers/admin/runners_controller.rb b/app/controllers/admin/runners_controller.rb
index 2744be0150c..06880ace899 100644
--- a/app/controllers/admin/runners_controller.rb
+++ b/app/controllers/admin/runners_controller.rb
@@ -4,6 +4,9 @@ class Admin::RunnersController < Admin::ApplicationController
include RunnerSetupScripts
before_action :runner, except: [:index, :tag_list, :runner_setup_scripts]
+ before_action only: [:index] do
+ push_frontend_feature_flag(:admin_runners_bulk_delete, default_enabled: :yaml)
+ end
feature_category :runner
diff --git a/app/controllers/admin/spam_logs_controller.rb b/app/controllers/admin/spam_logs_controller.rb
index 67d991c8b03..e4e866a8b60 100644
--- a/app/controllers/admin/spam_logs_controller.rb
+++ b/app/controllers/admin/spam_logs_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Admin::SpamLogsController < Admin::ApplicationController
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
# rubocop: disable CodeReuse/ActiveRecord
def index
diff --git a/app/controllers/admin/system_info_controller.rb b/app/controllers/admin/system_info_controller.rb
index f14305528a3..7ae930abb84 100644
--- a/app/controllers/admin/system_info_controller.rb
+++ b/app/controllers/admin/system_info_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Admin::SystemInfoController < Admin::ApplicationController
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
EXCLUDED_MOUNT_OPTIONS = %w[
nobrowse
diff --git a/app/controllers/admin/version_check_controller.rb b/app/controllers/admin/version_check_controller.rb
index dde1a7abafa..f5c70dc9e1b 100644
--- a/app/controllers/admin/version_check_controller.rb
+++ b/app/controllers/admin/version_check_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Admin::VersionCheckController < Admin::ApplicationController
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
def version_check
response = VersionCheck.new.response
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 1d17e8aa085..572ec40ef16 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -196,6 +196,27 @@ class ApplicationController < ActionController::Base
end
end
+ # Devise defines current_user to be:
+ #
+ # def current_user
+ # @current_user ||= warden.authenticate(scope: mapping)
+ # end
+ #
+ # That means whenever current_user is called and `@current_user` is
+ # nil, Warden will attempt to authenticate a user. To avoid
+ # reauthenticating anonymous users, we may need to invalidate
+ # the user.
+ def reset_auth_user!
+ return if strong_memoized?(:auth_user) && auth_user
+
+ # Controllers usually call auth_user first, but for some controllers
+ # authenticate_sessionless_user! is called after that. If we relied
+ # on the memoized auth_user, the value would always be nil for
+ # sessionless users.
+ clear_memoization(:auth_user)
+ auth_user
+ end
+
def log_exception(exception)
# At this point, the controller already exits set_current_context around
# block. To maintain the context while handling error exception, we need to
diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb
index 4bcd1be9f53..663e3cf8648 100644
--- a/app/controllers/autocomplete_controller.rb
+++ b/app/controllers/autocomplete_controller.rb
@@ -13,6 +13,7 @@ class AutocompleteController < ApplicationController
feature_category :continuous_delivery, [:deploy_keys_with_owners]
urgency :low, [:merge_request_target_branches]
+ urgency :default, [:users]
def users
group = Autocomplete::GroupFinder
diff --git a/app/controllers/clusters/clusters_controller.rb b/app/controllers/clusters/clusters_controller.rb
index d9179129983..939c0ef220c 100644
--- a/app/controllers/clusters/clusters_controller.rb
+++ b/app/controllers/clusters/clusters_controller.rb
@@ -14,7 +14,7 @@ class Clusters::ClustersController < Clusters::BaseController
before_action :authorize_create_cluster!, only: [:new, :connect, :authorize_aws_role]
before_action :authorize_update_cluster!, only: [:update]
before_action :update_applications_status, only: [:cluster_status]
- before_action :ensure_feature_enabled!, except: :index
+ before_action :ensure_feature_enabled!, except: [:index, :new_cluster_docs]
helper_method :token_in_session
@@ -184,7 +184,7 @@ class Clusters::ClustersController < Clusters::BaseController
def cluster_list
return [] unless certificate_based_clusters_enabled?
- finder = ClusterAncestorsFinder.new(clusterable.subject, current_user)
+ finder = ClusterAncestorsFinder.new(clusterable.__subject__, current_user)
clusters = finder.execute
@has_ancestor_clusters = finder.has_ancestor_clusters?
@@ -253,7 +253,7 @@ class Clusters::ClustersController < Clusters::BaseController
]).merge(
provider_type: :gcp,
platform_type: :kubernetes,
- clusterable: clusterable.subject
+ clusterable: clusterable.__subject__
)
end
@@ -274,7 +274,7 @@ class Clusters::ClustersController < Clusters::BaseController
]).merge(
provider_type: :aws,
platform_type: :kubernetes,
- clusterable: clusterable.subject
+ clusterable: clusterable.__subject__
)
end
@@ -291,7 +291,7 @@ class Clusters::ClustersController < Clusters::BaseController
]).merge(
provider_type: :user,
platform_type: :kubernetes,
- clusterable: clusterable.subject
+ clusterable: clusterable.__subject__
)
end
@@ -313,7 +313,7 @@ class Clusters::ClustersController < Clusters::BaseController
end
def gcp_cluster
- cluster = Clusters::BuildService.new(clusterable.subject).execute
+ cluster = Clusters::BuildService.new(clusterable.__subject__).execute
cluster.build_provider_gcp
@gcp_cluster = cluster.present(current_user: current_user)
end
@@ -343,7 +343,7 @@ class Clusters::ClustersController < Clusters::BaseController
end
def user_cluster
- cluster = Clusters::BuildService.new(clusterable.subject).execute
+ cluster = Clusters::BuildService.new(clusterable.__subject__).execute
cluster.build_platform_kubernetes
@user_cluster = cluster.present(current_user: current_user)
end
diff --git a/app/controllers/concerns/enforces_two_factor_authentication.rb b/app/controllers/concerns/enforces_two_factor_authentication.rb
index c67e73d4e78..b1b6e21644e 100644
--- a/app/controllers/concerns/enforces_two_factor_authentication.rb
+++ b/app/controllers/concerns/enforces_two_factor_authentication.rb
@@ -10,6 +10,11 @@
module EnforcesTwoFactorAuthentication
extend ActiveSupport::Concern
+ MFA_HELP_PAGE = Rails.application.routes.url_helpers.help_page_url(
+ 'user/profile/account/two_factor_authentication.html',
+ anchor: 'enable-two-factor-authentication'
+ )
+
included do
before_action :check_two_factor_requirement, except: [:route_not_found]
@@ -24,7 +29,16 @@ module EnforcesTwoFactorAuthentication
return unless respond_to?(:current_user)
if two_factor_authentication_required? && current_user_requires_two_factor?
- redirect_to profile_two_factor_auth_path
+ case self
+ when GraphqlController
+ render_error(
+ _("Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}") %
+ { mfa_help_page: MFA_HELP_PAGE },
+ status: :unauthorized
+ )
+ else
+ redirect_to profile_two_factor_auth_path
+ end
end
end
diff --git a/app/controllers/concerns/integrations/params.rb b/app/controllers/concerns/integrations/params.rb
index 80acb369cb2..d256b331174 100644
--- a/app/controllers/concerns/integrations/params.rb
+++ b/app/controllers/concerns/integrations/params.rb
@@ -89,7 +89,7 @@ module Integrations
param_values = return_value[:integration]
if param_values.is_a?(ActionController::Parameters)
- integration.password_fields.each do |param|
+ integration.secret_fields.each do |param|
param_values.delete(param) if param_values[param].blank?
end
end
diff --git a/app/controllers/concerns/sessionless_authentication.rb b/app/controllers/concerns/sessionless_authentication.rb
index 48daacc09c2..7ec9be6baaf 100644
--- a/app/controllers/concerns/sessionless_authentication.rb
+++ b/app/controllers/concerns/sessionless_authentication.rb
@@ -20,16 +20,21 @@ module SessionlessAuthentication
end
def sessionless_sign_in(user)
- if user.can_log_in_with_non_expired_password?
- # Notice we are passing store false, so the user is not
- # actually stored in the session and a token is needed
- # for every request. If you want the token to work as a
- # sign in token, you can simply remove store: false.
- sign_in(user, store: false, message: :sessionless_sign_in)
- elsif request_authenticator.can_sign_in_bot?(user)
- # we suppress callbacks to avoid redirecting the bot
- sign_in(user, store: false, message: :sessionless_sign_in, run_callbacks: false)
- end
+ signed_in_user =
+ if user.can_log_in_with_non_expired_password?
+ # Notice we are passing store false, so the user is not
+ # actually stored in the session and a token is needed
+ # for every request. If you want the token to work as a
+ # sign in token, you can simply remove store: false.
+ sign_in(user, store: false, message: :sessionless_sign_in)
+ elsif request_authenticator.can_sign_in_bot?(user)
+ # we suppress callbacks to avoid redirecting the bot
+ sign_in(user, store: false, message: :sessionless_sign_in, run_callbacks: false)
+ end
+
+ reset_auth_user! if respond_to?(:reset_auth_user!, true)
+
+ signed_in_user
end
def sessionless_bypass_admin_mode!(&block)
diff --git a/app/controllers/concerns/wiki_actions.rb b/app/controllers/concerns/wiki_actions.rb
index 714a6f280f3..91de1d8aeae 100644
--- a/app/controllers/concerns/wiki_actions.rb
+++ b/app/controllers/concerns/wiki_actions.rb
@@ -21,10 +21,6 @@ module WikiActions
before_action :load_sidebar, except: [:pages]
before_action :set_content_class
- before_action do
- push_frontend_feature_flag(:wiki_switch_between_content_editor_raw_markdown, @group, default_enabled: :yaml)
- end
-
before_action only: [:show, :edit, :update] do
@valid_encoding = valid_encoding?
end
@@ -223,7 +219,7 @@ module WikiActions
def page
strong_memoize(:page) do
- wiki.find_page(*page_params)
+ wiki.find_page(*page_params, load_content: load_content?)
end
end
@@ -310,6 +306,12 @@ module WikiActions
def send_wiki_file_blob(wiki, file_blob)
send_blob(wiki.repository, file_blob)
end
+
+ def load_content?
+ return false if %w[history destroy diff show].include?(params[:action])
+
+ true
+ end
end
WikiActions.prepend_mod
diff --git a/app/controllers/dashboard/application_controller.rb b/app/controllers/dashboard/application_controller.rb
index 0e9fdc60363..95deacdc5b9 100644
--- a/app/controllers/dashboard/application_controller.rb
+++ b/app/controllers/dashboard/application_controller.rb
@@ -11,6 +11,6 @@ class Dashboard::ApplicationController < ApplicationController
private
def projects
- @projects ||= current_user.authorized_projects.sorted_by_activity.non_archived
+ @projects ||= current_user.authorized_projects.sorted_by_updated_desc.non_archived
end
end
diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb
index f8a6d9f808e..23e0143506e 100644
--- a/app/controllers/explore/projects_controller.rb
+++ b/app/controllers/explore/projects_controller.rb
@@ -25,6 +25,9 @@ class Explore::ProjectsController < Explore::ApplicationController
feature_category :projects
+ # TODO: Set higher urgency after addressing https://gitlab.com/gitlab-org/gitlab/-/issues/357913
+ urgency :low, [:index]
+
def index
show_alert_if_search_is_disabled
@projects = load_projects
@@ -110,7 +113,7 @@ class Explore::ProjectsController < Explore::ApplicationController
end
def load_topic
- @topic = Projects::Topic.find_by_name(params[:topic_name])
+ @topic = Projects::Topic.find_by_name_case_insensitive(params[:topic_name])
end
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb
index ef229a2abec..b00d85b6b0f 100644
--- a/app/controllers/graphql_controller.rb
+++ b/app/controllers/graphql_controller.rb
@@ -32,6 +32,7 @@ class GraphqlController < ApplicationController
before_action :set_user_last_activity
before_action :track_vs_code_usage
before_action :track_jetbrains_usage
+ before_action :track_gitlab_cli_usage
before_action :disable_query_limiting
before_action :limit_query_size
@@ -43,7 +44,7 @@ class GraphqlController < ApplicationController
around_action :sessionless_bypass_admin_mode!, if: :sessionless_user?
# The default feature category is overridden to read from request
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
# We don't know what the query is going to be, so we can't set a high urgency
# See https://gitlab.com/groups/gitlab-org/-/epics/5841 for the work that will
@@ -143,6 +144,11 @@ class GraphqlController < ApplicationController
.track_api_request_when_trackable(user_agent: request.user_agent, user: current_user)
end
+ def track_gitlab_cli_usage
+ Gitlab::UsageDataCounters::GitLabCliActivityUniqueCounter
+ .track_api_request_when_trackable(user_agent: request.user_agent, user: current_user)
+ end
+
def execute_multiplex
GitlabSchema.multiplex(multiplex_queries, context: context)
end
diff --git a/app/controllers/groups/boards_controller.rb b/app/controllers/groups/boards_controller.rb
index 641b3adb12b..c65232c0fea 100644
--- a/app/controllers/groups/boards_controller.rb
+++ b/app/controllers/groups/boards_controller.rb
@@ -8,7 +8,7 @@ class Groups::BoardsController < Groups::ApplicationController
before_action :assign_endpoint_vars
before_action do
push_frontend_feature_flag(:board_multi_select, group, default_enabled: :yaml)
- push_frontend_feature_flag(:iteration_cadences, group, default_enabled: :yaml)
+ push_frontend_feature_flag(:realtime_labels, group, default_enabled: :yaml)
experiment(:prominent_create_board_btn, subject: current_user) do |e|
e.control { }
e.candidate { }
@@ -43,11 +43,11 @@ class Groups::BoardsController < Groups::ApplicationController
def assign_endpoint_vars
@boards_endpoint = group_boards_path(group)
- @namespace_path = group.to_param
- @labels_endpoint = group_labels_path(group)
end
def authorize_read_board!
access_denied! unless can?(current_user, :read_issue_board, group)
end
end
+
+Groups::BoardsController.prepend_mod
diff --git a/app/controllers/groups/children_controller.rb b/app/controllers/groups/children_controller.rb
index 10a6ad06ae5..d10c52f0301 100644
--- a/app/controllers/groups/children_controller.rb
+++ b/app/controllers/groups/children_controller.rb
@@ -9,6 +9,9 @@ module Groups
feature_category :subgroups
+ # TODO: Set to higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/331494
+ urgency :low, [:index]
+
def index
params[:sort] ||= @group_projects_sort
parent = if params[:parent_id].present?
diff --git a/app/controllers/groups/crm/organizations_controller.rb b/app/controllers/groups/crm/organizations_controller.rb
index f8536b4f538..846995ecba5 100644
--- a/app/controllers/groups/crm/organizations_controller.rb
+++ b/app/controllers/groups/crm/organizations_controller.rb
@@ -10,6 +10,10 @@ class Groups::Crm::OrganizationsController < Groups::ApplicationController
render action: "index"
end
+ def edit
+ render action: "index"
+ end
+
private
def authorize_read_crm_organization!
diff --git a/app/controllers/groups/email_campaigns_controller.rb b/app/controllers/groups/email_campaigns_controller.rb
index 520ad768939..70c8a23d918 100644
--- a/app/controllers/groups/email_campaigns_controller.rb
+++ b/app/controllers/groups/email_campaigns_controller.rb
@@ -40,7 +40,7 @@ class Groups::EmailCampaignsController < Groups::ApplicationController
project_pipelines_url(group.projects.first)
when :trial, :trial_short
'https://about.gitlab.com/free-trial/'
- when :team, :team_short, :invite_team
+ when :team, :team_short
group_group_members_url(group)
when :admin_verify
project_settings_ci_cd_path(group.projects.first, ci_runner_templates: true, anchor: 'js-runners-settings')
@@ -59,11 +59,6 @@ class Groups::EmailCampaignsController < Groups::ApplicationController
@track = params[:track]&.to_sym
@series = params[:series]&.to_i
- # There is only one email that will be sent for invite team track so series
- # should only have the value 0. Return early if track is invite team and
- # condition for series value is met
- return if @track == Namespaces::InviteTeamEmailService::TRACK && @series == 0
-
track_valid = @track.in?(Namespaces::InProductMarketingEmailsService::TRACKS.keys)
return render_404 unless track_valid
diff --git a/app/controllers/groups/group_links_controller.rb b/app/controllers/groups/group_links_controller.rb
index 0655d779a4e..cc2ca728592 100644
--- a/app/controllers/groups/group_links_controller.rb
+++ b/app/controllers/groups/group_links_controller.rb
@@ -6,30 +6,12 @@ class Groups::GroupLinksController < Groups::ApplicationController
feature_category :subgroups
- def create
- shared_with_group = Group.find(params[:shared_with_group_id]) if params[:shared_with_group_id].present?
-
- if shared_with_group
- result = Groups::GroupLinks::CreateService
- .new(group, shared_with_group, current_user, group_link_create_params)
- .execute
-
- return render_404 if result[:http_status] == 404
-
- flash[:alert] = result[:message] if result[:status] == :error
- else
- flash[:alert] = _('Please select a group.')
- end
-
- redirect_to group_group_members_path(group)
- end
-
def update
Groups::GroupLinks::UpdateService.new(@group_link).execute(group_link_params)
if @group_link.expires?
render json: {
- expires_in: helpers.distance_of_time_in_words_to_now(@group_link.expires_at),
+ expires_in: helpers.time_ago_with_tooltip(@group_link.expires_at),
expires_soon: @group_link.expires_soon?
}
else
@@ -54,10 +36,6 @@ class Groups::GroupLinksController < Groups::ApplicationController
@group_link ||= group.shared_with_group_links.find(params[:id])
end
- def group_link_create_params
- params.permit(:shared_group_access, :expires_at)
- end
-
def group_link_params
params.require(:group_link).permit(:group_access, :expires_at)
end
diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb
index ece1083d4d1..51778f31f65 100644
--- a/app/controllers/groups/group_members_controller.rb
+++ b/app/controllers/groups/group_members_controller.rb
@@ -20,10 +20,13 @@ class Groups::GroupMembersController < Groups::ApplicationController
:approve_access_request, :leave, :resend_invite,
:override
- feature_category :authentication_and_authorization
+ feature_category :subgroups
def index
+ push_frontend_feature_flag(:group_member_inherited_group, @group)
+
@sort = params[:sort].presence || sort_value_name
+ @include_relations ||= requested_relations
if can?(current_user, :admin_group_member, @group)
@invited_members = invited_members
diff --git a/app/controllers/groups/releases_controller.rb b/app/controllers/groups/releases_controller.rb
index db5385ecc71..e87135cc104 100644
--- a/app/controllers/groups/releases_controller.rb
+++ b/app/controllers/groups/releases_controller.rb
@@ -17,8 +17,10 @@ module Groups
def releases
if Feature.enabled?(:group_releases_finder_inoperator)
Releases::GroupReleasesFinder
- .new(@group, current_user, { include_subgroups: true, page: params[:page], per: 30 })
+ .new(@group, current_user)
.execute(preload: false)
+ .page(params[:page])
+ .per(30)
else
ReleasesFinder
.new(@group, current_user, { include_subgroups: true })
diff --git a/app/controllers/groups/runners_controller.rb b/app/controllers/groups/runners_controller.rb
index dabef978ee1..a2be4d9d7e1 100644
--- a/app/controllers/groups/runners_controller.rb
+++ b/app/controllers/groups/runners_controller.rb
@@ -11,6 +11,8 @@ class Groups::RunnersController < Groups::ApplicationController
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::Tracking.event(self.class.name, 'index', user: current_user, namespace: @group)
end
def runner_list_group_view_vue_ui_enabled
diff --git a/app/controllers/groups/settings/integrations_controller.rb b/app/controllers/groups/settings/integrations_controller.rb
index ec64e75a68e..0a63c3d304b 100644
--- a/app/controllers/groups/settings/integrations_controller.rb
+++ b/app/controllers/groups/settings/integrations_controller.rb
@@ -7,10 +7,6 @@ module Groups
before_action :authorize_admin_group!
- before_action do
- push_frontend_feature_flag(:integration_form_sections, group, default_enabled: :yaml)
- end
-
feature_category :integrations
layout 'group_settings'
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index b53d9b1be04..995d5abf045 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -15,7 +15,6 @@ class GroupsController < Groups::ApplicationController
prepend_before_action(only: [:show, :issues]) { authenticate_sessionless_user!(:rss) }
prepend_before_action(only: [:issues_calendar]) { authenticate_sessionless_user!(:ics) }
- prepend_before_action :ensure_export_enabled, only: [:export, :download_export]
prepend_before_action :check_captcha, only: :create, if: -> { captcha_enabled? }
before_action :authenticate_user!, only: [:new, :create]
@@ -33,7 +32,6 @@ class GroupsController < Groups::ApplicationController
before_action do
push_frontend_feature_flag(:vue_issues_list, @group, default_enabled: :yaml)
- push_frontend_feature_flag(:iteration_cadences, @group, default_enabled: :yaml)
end
before_action :check_export_rate_limit!, only: [:export, :download_export]
@@ -61,7 +59,8 @@ class GroupsController < Groups::ApplicationController
feature_category :importers, [:export, :download_export]
urgency :high, [:unfoldered_environment_names]
- urgency :low, [:merge_requests]
+ # TODO: Set #show to higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/334795
+ urgency :low, [:merge_requests, :show]
def index
redirect_to(current_user ? dashboard_groups_path : explore_groups_path)
@@ -218,6 +217,8 @@ class GroupsController < Groups::ApplicationController
@has_projects = group_projects.exists?
+ set_sort_order
+
respond_to do |format|
format.html
end
@@ -293,7 +294,7 @@ class GroupsController < Groups::ApplicationController
:setup_for_company,
:jobs_to_be_done,
:crm_enabled
- ]
+ ] + [group_feature_attributes: group_feature_attributes]
end
# rubocop: disable CodeReuse/ActiveRecord
@@ -338,10 +339,6 @@ class GroupsController < Groups::ApplicationController
check_rate_limit!(prefixed_action, scope: [current_user, scope].compact)
end
- def ensure_export_enabled
- render_404 unless Feature.enabled?(:group_import_export, @group, default_enabled: true)
- end
-
private
def load_recaptcha
@@ -400,6 +397,10 @@ class GroupsController < Groups::ApplicationController
experiment(:require_verification_for_namespace_creation, user: current_user).track(:start_create_group)
end
+
+ def group_feature_attributes
+ []
+ end
end
GroupsController.prepend_mod_with('GroupsController')
diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb
index f267d383804..5be2d7527ff 100644
--- a/app/controllers/help_controller.rb
+++ b/app/controllers/help_controller.rb
@@ -3,7 +3,7 @@
class HelpController < ApplicationController
skip_before_action :authenticate_user!, unless: :public_visibility_restricted?
skip_before_action :check_two_factor_requirement
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
layout 'help'
diff --git a/app/controllers/ide_controller.rb b/app/controllers/ide_controller.rb
index 44beceb4f48..9494a686467 100644
--- a/app/controllers/ide_controller.rb
+++ b/app/controllers/ide_controller.rb
@@ -18,6 +18,8 @@ class IdeController < ApplicationController
feature_category :web_ide
+ urgency :low
+
def index
Gitlab::UsageDataCounters::WebIdeCounter.increment_views_count
end
diff --git a/app/controllers/import/base_controller.rb b/app/controllers/import/base_controller.rb
index 7ad3a2ee358..51ca12370e6 100644
--- a/app/controllers/import/base_controller.rb
+++ b/app/controllers/import/base_controller.rb
@@ -13,7 +13,13 @@ class Import::BaseController < ApplicationController
provider_repos: serialized_provider_repos,
incompatible_repos: serialized_incompatible_repos }
end
- format.html
+ format.html do
+ if params[:namespace_id]&.present?
+ @namespace = Namespace.find_by_id(params[:namespace_id])
+
+ render_404 unless current_user.can?(:create_projects, @namespace)
+ end
+ end
end
end
@@ -70,7 +76,7 @@ class Import::BaseController < ApplicationController
end
def already_added_projects
- @already_added_projects ||= filtered(find_already_added_projects(provider_name))
+ @already_added_projects ||= find_already_added_projects(provider_name)
end
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb
index cfd86429df0..7c9525d1744 100644
--- a/app/controllers/import/bitbucket_controller.rb
+++ b/app/controllers/import/bitbucket_controller.rb
@@ -12,14 +12,21 @@ class Import::BitbucketController < Import::BaseController
rescue_from Bitbucket::Error::Unauthorized, with: :bitbucket_unauthorized
def callback
- response = oauth_client.auth_code.get_token(params[:code], redirect_uri: users_import_bitbucket_callback_url)
+ auth_state = session[:bitbucket_auth_state]
+ session[:bitbucket_auth_state] = nil
- session[:bitbucket_token] = response.token
- session[:bitbucket_expires_at] = response.expires_at
- session[:bitbucket_expires_in] = response.expires_in
- session[:bitbucket_refresh_token] = response.refresh_token
+ if auth_state.blank? || !ActiveSupport::SecurityUtils.secure_compare(auth_state, params[:state])
+ go_to_bitbucket_for_permissions
+ else
+ response = oauth_client.auth_code.get_token(params[:code], redirect_uri: users_import_bitbucket_callback_url)
+
+ session[:bitbucket_token] = response.token
+ session[:bitbucket_expires_at] = response.expires_at
+ session[:bitbucket_expires_in] = response.expires_in
+ session[:bitbucket_refresh_token] = response.refresh_token
- redirect_to status_import_bitbucket_url
+ redirect_to status_import_bitbucket_url
+ end
end
def status
@@ -113,7 +120,9 @@ class Import::BitbucketController < Import::BaseController
end
def go_to_bitbucket_for_permissions
- redirect_to oauth_client.auth_code.authorize_url(redirect_uri: users_import_bitbucket_callback_url)
+ state = SecureRandom.base64(64)
+ session[:bitbucket_auth_state] = state
+ redirect_to oauth_client.auth_code.authorize_url(redirect_uri: users_import_bitbucket_callback_url, state: state)
end
def bitbucket_unauthorized(exception)
diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb
index 55f4563285d..9bd8f893614 100644
--- a/app/controllers/import/github_controller.rb
+++ b/app/controllers/import/github_controller.rb
@@ -23,24 +23,25 @@ class Import::GithubController < Import::BaseController
if !ci_cd_only? && github_import_configured? && logged_in_with_provider?
go_to_provider_for_permissions
elsif session[access_token_key]
- redirect_to status_import_url
+ redirect_to status_import_url(namespace_id: params[:namespace_id])
end
end
def callback
- auth_state = session[auth_state_key]
- session[auth_state_key] = nil
+ auth_state = session.delete(auth_state_key)
+ namespace_id = session.delete(:namespace_id)
+
if auth_state.blank? || !ActiveSupport::SecurityUtils.secure_compare(auth_state, params[:state])
provider_unauthorized
else
session[access_token_key] = get_token(params[:code])
- redirect_to status_import_url
+ redirect_to status_import_url(namespace_id: namespace_id)
end
end
def personal_access_token
session[access_token_key] = params[:personal_access_token]&.strip
- redirect_to status_import_url
+ redirect_to status_import_url(namespace_id: params[:namespace_id].presence)
end
def status
@@ -62,7 +63,15 @@ class Import::GithubController < Import::BaseController
end
def realtime_changes
- super
+ Gitlab::PollingInterval.set_header(response, interval: 3_000)
+
+ render json: already_added_projects.map { |project|
+ {
+ id: project.id,
+ import_status: project.import_status,
+ stats: ::Gitlab::GithubImport::ObjectCounter.summary(project)
+ }
+ }
end
protected
@@ -201,8 +210,8 @@ class Import::GithubController < Import::BaseController
public_send("new_import_#{provider_name}_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend
end
- def status_import_url
- public_send("status_import_#{provider_name}_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend
+ def status_import_url(namespace_id: nil)
+ public_send("status_import_#{provider_name}_url", extra_import_params.merge({ namespace_id: namespace_id })) # rubocop:disable GitlabSecurity/PublicSend
end
def callback_import_url
@@ -248,6 +257,7 @@ class Import::GithubController < Import::BaseController
def provider_auth
if !ci_cd_only? && session[access_token_key].blank?
+ session[:namespace_id] = params[:namespace_id]
go_to_provider_for_permissions
end
end
diff --git a/app/controllers/import/gitlab_groups_controller.rb b/app/controllers/import/gitlab_groups_controller.rb
index aca71f6d57a..c9d5e9986dc 100644
--- a/app/controllers/import/gitlab_groups_controller.rb
+++ b/app/controllers/import/gitlab_groups_controller.rb
@@ -3,7 +3,6 @@
class Import::GitlabGroupsController < ApplicationController
include WorkhorseAuthorization
- before_action :ensure_group_import_enabled
before_action :check_import_rate_limit!, only: %i[create]
feature_category :importers
@@ -51,10 +50,6 @@ class Import::GitlabGroupsController < ApplicationController
end
end
- def ensure_group_import_enabled
- render_404 unless Feature.enabled?(:group_import_export, @group, default_enabled: true)
- end
-
def check_import_rate_limit!
check_rate_limit!(:group_import, scope: current_user) do
redirect_to new_group_path, alert: _('This endpoint has been requested too many times. Try again later.')
diff --git a/app/controllers/import/history_controller.rb b/app/controllers/import/history_controller.rb
new file mode 100644
index 00000000000..69e31392f21
--- /dev/null
+++ b/app/controllers/import/history_controller.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class Import::HistoryController < ApplicationController
+ feature_category :importers
+end
diff --git a/app/controllers/jira_connect/application_controller.rb b/app/controllers/jira_connect/application_controller.rb
index 352e78d6255..9b3bff062dd 100644
--- a/app/controllers/jira_connect/application_controller.rb
+++ b/app/controllers/jira_connect/application_controller.rb
@@ -22,6 +22,8 @@ class JiraConnect::ApplicationController < ApplicationController
def verify_qsh_claim!
payload, _ = decode_auth_token!
+ return if request.format.json? && payload['qsh'] == 'context-qsh'
+
# Make sure `qsh` claim matches the current request
render_403 unless payload['qsh'] == Atlassian::Jwt.create_query_string_hash(request.url, request.method, jira_connect_base_url)
rescue StandardError
diff --git a/app/controllers/jira_connect/events_controller.rb b/app/controllers/jira_connect/events_controller.rb
index 327192857f6..3c78f63e069 100644
--- a/app/controllers/jira_connect/events_controller.rb
+++ b/app/controllers/jira_connect/events_controller.rb
@@ -7,10 +7,6 @@ class JiraConnect::EventsController < JiraConnect::ApplicationController
before_action :verify_asymmetric_atlassian_jwt!
def installed
- unless Feature.enabled?(:jira_connect_installation_update, default_enabled: :yaml)
- return head :ok if current_jira_installation
- end
-
success = current_jira_installation ? update_installation : create_installation
if success
diff --git a/app/controllers/jira_connect/subscriptions_controller.rb b/app/controllers/jira_connect/subscriptions_controller.rb
index ec6ba07a125..d8ce67d6267 100644
--- a/app/controllers/jira_connect/subscriptions_controller.rb
+++ b/app/controllers/jira_connect/subscriptions_controller.rb
@@ -11,7 +11,9 @@ class JiraConnect::SubscriptionsController < JiraConnect::ApplicationController
style_src_values = Array.wrap(p.directives['style-src']) | %w('self' 'unsafe-inline')
# rubocop: enable Lint/PercentStringArray
- p.frame_ancestors :self, 'https://*.atlassian.net'
+ # *.jira.com is needed for some legacy Jira Cloud instances, new ones will use *.atlassian.net
+ # https://support.atlassian.com/organization-administration/docs/ip-addresses-and-domains-for-atlassian-cloud-products/
+ p.frame_ancestors :self, 'https://*.atlassian.net', 'https://*.jira.com'
p.script_src(*script_src_values)
p.style_src(*style_src_values)
end
diff --git a/app/controllers/jwt_controller.rb b/app/controllers/jwt_controller.rb
index 010b85e81bf..8eebf9fbf6b 100644
--- a/app/controllers/jwt_controller.rb
+++ b/app/controllers/jwt_controller.rb
@@ -9,6 +9,8 @@ class JwtController < ApplicationController
prepend_before_action :auth_user, :authenticate_project_or_user
feature_category :authentication_and_authorization
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/357037
+ urgency :low
SERVICES = {
::Auth::ContainerRegistryAuthenticationService::AUDIENCE => ::Auth::ContainerRegistryAuthenticationService,
diff --git a/app/controllers/oauth/jira/authorizations_controller.rb b/app/controllers/oauth/jira/authorizations_controller.rb
deleted file mode 100644
index 8169b5fcbb0..00000000000
--- a/app/controllers/oauth/jira/authorizations_controller.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-# This controller's role is to mimic and rewire the GitLab OAuth
-# flow routes for Jira DVCS integration.
-# See https://gitlab.com/gitlab-org/gitlab/issues/2381
-#
-class Oauth::Jira::AuthorizationsController < ApplicationController
- skip_before_action :authenticate_user!
- skip_before_action :verify_authenticity_token
-
- feature_category :integrations
-
- # 1. Rewire Jira OAuth initial request to our stablished OAuth authorization URL.
- def new
- session[:redirect_uri] = params['redirect_uri']
-
- redirect_to oauth_authorization_path(client_id: params['client_id'],
- response_type: 'code',
- scope: normalize_scope(params['scope']),
- redirect_uri: oauth_jira_callback_url)
- end
-
- # 2. Handle the callback call as we were a Github Enterprise instance client.
- def callback
- # Handling URI query params concatenation.
- redirect_uri = URI.parse(session['redirect_uri'])
- new_query = URI.decode_www_form(String(redirect_uri.query)) << ['code', params[:code]]
- redirect_uri.query = URI.encode_www_form(new_query)
-
- redirect_to redirect_uri.to_s
- end
-
- # 3. Rewire and adjust access_token request accordingly.
- def access_token
- # We have to modify request.parameters because Doorkeeper::Server reads params from there
- request.parameters[:redirect_uri] = oauth_jira_callback_url
-
- strategy = Doorkeeper::Server.new(self).token_request('authorization_code')
- response = strategy.authorize
-
- if response.status == :ok
- access_token, scope, token_type = response.body.values_at('access_token', 'scope', 'token_type')
-
- render body: "access_token=#{access_token}&scope=#{scope}&token_type=#{token_type}"
- else
- render status: response.status, body: response.body
- end
- rescue Doorkeeper::Errors::DoorkeeperError => e
- render status: :unauthorized, body: e.type
- end
-
- private
-
- # When using the GitHub Enterprise connector in Jira we receive the "repo" scope,
- # this doesn't exist in GitLab but we can map it to our "api" scope.
- def normalize_scope(scope)
- scope == 'repo' ? 'api' : scope
- end
-end
diff --git a/app/controllers/oauth/jira_dvcs/authorizations_controller.rb b/app/controllers/oauth/jira_dvcs/authorizations_controller.rb
new file mode 100644
index 00000000000..613999f4ca7
--- /dev/null
+++ b/app/controllers/oauth/jira_dvcs/authorizations_controller.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+# This controller's role is to mimic and rewire the GitLab OAuth
+# flow routes for Jira DVCS integration.
+# See https://gitlab.com/gitlab-org/gitlab/issues/2381
+#
+class Oauth::JiraDvcs::AuthorizationsController < ApplicationController
+ skip_before_action :authenticate_user!
+ skip_before_action :verify_authenticity_token
+
+ feature_category :integrations
+
+ # 1. Rewire Jira OAuth initial request to our stablished OAuth authorization URL.
+ def new
+ session[:redirect_uri] = params['redirect_uri']
+
+ redirect_to oauth_authorization_path(client_id: params['client_id'],
+ response_type: 'code',
+ scope: normalize_scope(params['scope']),
+ redirect_uri: oauth_jira_dvcs_callback_url)
+ end
+
+ # 2. Handle the callback call as we were a Github Enterprise instance client.
+ def callback
+ # Handling URI query params concatenation.
+ redirect_uri = URI.parse(session['redirect_uri'])
+ new_query = URI.decode_www_form(String(redirect_uri.query)) << ['code', params[:code]]
+ redirect_uri.query = URI.encode_www_form(new_query)
+
+ redirect_to redirect_uri.to_s
+ end
+
+ # 3. Rewire and adjust access_token request accordingly.
+ def access_token
+ # We have to modify request.parameters because Doorkeeper::Server reads params from there
+ request.parameters[:redirect_uri] = oauth_jira_dvcs_callback_url
+
+ strategy = Doorkeeper::Server.new(self).token_request('authorization_code')
+ response = strategy.authorize
+
+ if response.status == :ok
+ access_token, scope, token_type = response.body.values_at('access_token', 'scope', 'token_type')
+
+ render body: "access_token=#{access_token}&scope=#{scope}&token_type=#{token_type}"
+ else
+ render status: response.status, body: response.body
+ end
+ rescue Doorkeeper::Errors::DoorkeeperError => e
+ render status: :unauthorized, body: e.type
+ end
+
+ private
+
+ # When using the GitHub Enterprise connector in Jira we receive the "repo" scope,
+ # this doesn't exist in GitLab but we can map it to our "api" scope.
+ def normalize_scope(scope)
+ scope == 'repo' ? 'api' : scope
+ end
+end
diff --git a/app/controllers/profiles/chat_names_controller.rb b/app/controllers/profiles/chat_names_controller.rb
index 8cfec247b7a..ae757c30d1c 100644
--- a/app/controllers/profiles/chat_names_controller.rb
+++ b/app/controllers/profiles/chat_names_controller.rb
@@ -4,7 +4,7 @@ class Profiles::ChatNamesController < Profiles::ApplicationController
before_action :chat_name_token, only: [:new]
before_action :chat_name_params, only: [:new, :create, :deny]
- feature_category :users
+ feature_category :integrations
def index
@chat_names = current_user.chat_names
diff --git a/app/controllers/profiles/notifications_controller.rb b/app/controllers/profiles/notifications_controller.rb
index 6ef0ed6d365..ccfd360a781 100644
--- a/app/controllers/profiles/notifications_controller.rb
+++ b/app/controllers/profiles/notifications_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Profiles::NotificationsController < Profiles::ApplicationController
- feature_category :users
+ feature_category :team_planning
def show
@user = current_user
diff --git a/app/controllers/profiles/preferences_controller.rb b/app/controllers/profiles/preferences_controller.rb
index adecb56ea38..820b6520f6c 100644
--- a/app/controllers/profiles/preferences_controller.rb
+++ b/app/controllers/profiles/preferences_controller.rb
@@ -36,6 +36,8 @@ class Profiles::PreferencesController < Profiles::ApplicationController
def preferences_param_names
[
:color_scheme_id,
+ :diffs_deletion_color,
+ :diffs_addition_color,
:layout,
:dashboard,
:project_view,
diff --git a/app/controllers/profiles/two_factor_auths_controller.rb b/app/controllers/profiles/two_factor_auths_controller.rb
index 77fae34e2d2..48b0d313d3c 100644
--- a/app/controllers/profiles/two_factor_auths_controller.rb
+++ b/app/controllers/profiles/two_factor_auths_controller.rb
@@ -4,6 +4,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
skip_before_action :check_two_factor_requirement
before_action :ensure_verified_primary_email, only: [:show, :create]
before_action :validate_current_password, only: [:create, :codes, :destroy], if: :current_password_required?
+ before_action :update_current_user_otp!, only: [:show]
helper_method :current_password_required?
@@ -14,16 +15,6 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
feature_category :authentication_and_authorization
def show
- unless current_user.two_factor_enabled?
- current_user.otp_secret = User.generate_otp_secret(32)
- end
-
- unless current_user.otp_grace_period_started_at && two_factor_grace_period
- current_user.otp_grace_period_started_at = Time.current
- end
-
- Users::UpdateService.new(current_user, user: current_user).execute!
-
if two_factor_authentication_required? && !current_user.two_factor_enabled?
two_factor_authentication_reason(
global: lambda do
@@ -68,6 +59,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
else
@error = { message: _('Invalid pin code.') }
@qr_code = build_qr_code
+ @account_string = account_string
if Feature.enabled?(:webauthn, default_enabled: :yaml)
setup_webauthn_registration
@@ -138,6 +130,18 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
private
+ def update_current_user_otp!
+ if current_user.needs_new_otp_secret?
+ current_user.update_otp_secret!
+ end
+
+ unless current_user.otp_grace_period_started_at && two_factor_grace_period
+ current_user.otp_grace_period_started_at = Time.current
+ end
+
+ Users::UpdateService.new(current_user, user: current_user).execute!
+ end
+
def validate_current_password
return if current_user.valid_password?(params[:current_password])
diff --git a/app/controllers/projects/artifacts_controller.rb b/app/controllers/projects/artifacts_controller.rb
index 7bb3ed1d109..feed94708f6 100644
--- a/app/controllers/projects/artifacts_controller.rb
+++ b/app/controllers/projects/artifacts_controller.rb
@@ -5,6 +5,8 @@ class Projects::ArtifactsController < Projects::ApplicationController
include RendersBlob
include SendFileUpload
+ urgency :low, [:browse, :file, :latest_succeeded]
+
layout 'project'
before_action :authorize_read_build!
before_action :authorize_update_build!, only: [:keep]
diff --git a/app/controllers/projects/boards_controller.rb b/app/controllers/projects/boards_controller.rb
index c44a0830e2e..7a30e68d9a2 100644
--- a/app/controllers/projects/boards_controller.rb
+++ b/app/controllers/projects/boards_controller.rb
@@ -8,7 +8,7 @@ class Projects::BoardsController < Projects::ApplicationController
before_action :assign_endpoint_vars
before_action do
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(:realtime_labels, project&.group, default_enabled: :yaml)
experiment(:prominent_create_board_btn, subject: current_user) do |e|
e.control { }
e.candidate { }
@@ -44,11 +44,11 @@ class Projects::BoardsController < Projects::ApplicationController
def assign_endpoint_vars
@boards_endpoint = project_boards_path(project)
@bulk_issues_path = bulk_update_project_issues_path(project)
- @namespace_path = project.namespace.full_path
- @labels_endpoint = project_labels_path(project)
end
def authorize_read_board!
access_denied! unless can?(current_user, :read_issue_board, project)
end
end
+
+Projects::BoardsController.prepend_mod
diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb
index dad73c37fea..6264f10ce2d 100644
--- a/app/controllers/projects/branches_controller.rb
+++ b/app/controllers/projects/branches_controller.rb
@@ -34,11 +34,9 @@ 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)
-
+ rescue Gitlab::Git::CommandError
@gitaly_unavailable = true
- render
+ render status: :service_unavailable
end
format.json do
branches = BranchesFinder.new(@repository, params).execute
diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index 0c26b402876..2b2764d2e34 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -31,7 +31,7 @@ class Projects::CommitController < Projects::ApplicationController
respond_to do |format|
format.html do
- render
+ render locals: { pagination_params: params.permit(:page) }
end
format.diff do
send_git_diff(@project.repository, @commit.diff_refs)
@@ -106,6 +106,8 @@ class Projects::CommitController < Projects::ApplicationController
end
def revert
+ return render_404 unless @commit
+
assign_change_commit_vars
return render_404 if @start_branch.blank?
@@ -117,6 +119,8 @@ class Projects::CommitController < Projects::ApplicationController
end
def cherry_pick
+ return render_404 unless @commit
+
assign_change_commit_vars
return render_404 if @start_branch.blank?
diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb
index 243cc7a346c..3ced5f21b24 100644
--- a/app/controllers/projects/compare_controller.rb
+++ b/app/controllers/projects/compare_controller.rb
@@ -34,7 +34,7 @@ class Projects::CompareController < Projects::ApplicationController
def show
apply_diff_view_cookie!
- render
+ render locals: { pagination_params: params.permit(:page) }
end
def diff_for_path
diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb
index eabc048e341..8e81e75ad13 100644
--- a/app/controllers/projects/environments_controller.rb
+++ b/app/controllers/projects/environments_controller.rb
@@ -104,11 +104,11 @@ class Projects::EnvironmentsController < Projects::ApplicationController
def stop
return render_404 unless @environment.available?
- stop_action = @environment.stop_with_action!(current_user)
+ stop_actions = @environment.stop_with_actions!(current_user)
action_or_env_url =
- if stop_action
- polymorphic_url([project, stop_action])
+ if stop_actions&.count == 1
+ polymorphic_url([project, stop_actions.first])
else
project_environment_url(project, @environment)
end
diff --git a/app/controllers/projects/google_cloud/base_controller.rb b/app/controllers/projects/google_cloud/base_controller.rb
index f293ec752ab..0d65431d870 100644
--- a/app/controllers/projects/google_cloud/base_controller.rb
+++ b/app/controllers/projects/google_cloud/base_controller.rb
@@ -25,7 +25,11 @@ class Projects::GoogleCloud::BaseController < Projects::ApplicationController
end
def feature_flag_enabled!
- unless Feature.enabled?(:incubation_5mp_google_cloud)
+ enabled_for_user = Feature.enabled?(:incubation_5mp_google_cloud, current_user)
+ enabled_for_group = Feature.enabled?(:incubation_5mp_google_cloud, project.group)
+ enabled_for_project = Feature.enabled?(:incubation_5mp_google_cloud, project)
+ feature_is_enabled = enabled_for_user || enabled_for_group || enabled_for_project
+ unless feature_is_enabled
track_event('feature_flag_enabled!', 'access_denied', 'feature_flag_not_enabled')
access_denied!
end
diff --git a/app/controllers/projects/graphs_controller.rb b/app/controllers/projects/graphs_controller.rb
index d3a05736a47..606f6ac7941 100644
--- a/app/controllers/projects/graphs_controller.rb
+++ b/app/controllers/projects/graphs_controller.rb
@@ -102,3 +102,5 @@ class Projects::GraphsController < Projects::ApplicationController
render json: @log.to_json
end
end
+
+Projects::GraphsController.prepend_mod
diff --git a/app/controllers/projects/group_links_controller.rb b/app/controllers/projects/group_links_controller.rb
index 6bc81381d92..6007e09f109 100644
--- a/app/controllers/projects/group_links_controller.rb
+++ b/app/controllers/projects/group_links_controller.rb
@@ -7,21 +7,6 @@ class Projects::GroupLinksController < Projects::ApplicationController
feature_category :subgroups
- def create
- group = Group.find(params[:link_group_id]) if params[:link_group_id].present?
-
- if group
- result = Projects::GroupLinks::CreateService.new(project, current_user, group_link_create_params).execute(group)
- return render_404 if result[:http_status] == 404
-
- flash[:alert] = result[:message] if result[:http_status] == 409
- else
- flash[:alert] = _('Please select a group.')
- end
-
- redirect_to project_project_members_path(project)
- end
-
def update
group_link = @project.project_group_links.find(params[:id])
Projects::GroupLinks::UpdateService.new(group_link).execute(group_link_params)
@@ -54,10 +39,4 @@ class Projects::GroupLinksController < Projects::ApplicationController
def group_link_params
params.require(:group_link).permit(:group_access, :expires_at)
end
-
- def group_link_create_params
- params.permit(:link_group_access, :expires_at)
- end
end
-
-Projects::GroupLinksController.prepend_mod_with('Projects::GroupLinksController')
diff --git a/app/controllers/projects/incidents_controller.rb b/app/controllers/projects/incidents_controller.rb
index 293581a6744..dd1e51bb9bd 100644
--- a/app/controllers/projects/incidents_controller.rb
+++ b/app/controllers/projects/incidents_controller.rb
@@ -7,9 +7,8 @@ class Projects::IncidentsController < Projects::ApplicationController
before_action :authorize_read_issue!
before_action :load_incident, only: [:show]
before_action do
- push_frontend_feature_flag(:incident_escalations, @project)
- push_frontend_feature_flag(:incident_timeline_event_tab, @project, default_enabled: :yaml)
- push_licensed_feature(:incident_timeline_events) if @project.licensed_feature_available?(:incident_timeline_events)
+ push_frontend_feature_flag(:incident_escalations, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:incident_timeline, @project, default_enabled: :yaml)
end
feature_category :incident_management
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index d4474b9d5a3..46943e7214a 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -10,7 +10,7 @@ class Projects::IssuesController < Projects::ApplicationController
include RecordUserLastActivity
ISSUES_EXCEPT_ACTIONS = %i[index calendar new create bulk_update import_csv export_csv service_desk].freeze
- SET_ISSUABLES_INDEX_ONLY_ACTIONS = %i[calendar service_desk].freeze
+ SET_ISSUABLES_INDEX_ONLY_ACTIONS = %i[index calendar service_desk].freeze
prepend_before_action(only: [:index]) { authenticate_sessionless_user!(:rss) }
prepend_before_action(only: [:calendar]) { authenticate_sessionless_user!(:ics) }
@@ -22,7 +22,9 @@ class Projects::IssuesController < Projects::ApplicationController
before_action :issue, unless: ->(c) { ISSUES_EXCEPT_ACTIONS.include?(c.action_name.to_sym) }
after_action :log_issue_show, unless: ->(c) { ISSUES_EXCEPT_ACTIONS.include?(c.action_name.to_sym) }
- before_action :set_issuables_index, if: ->(c) { SET_ISSUABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) }
+ before_action :set_issuables_index, if: ->(c) {
+ SET_ISSUABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) && !vue_issues_list?
+ }
# Allow write(create) issue
before_action :authorize_create_issue!, only: [:new, :create]
@@ -37,18 +39,17 @@ class Projects::IssuesController < Projects::ApplicationController
before_action :authorize_download_code!, only: [:related_branches]
before_action do
- push_frontend_feature_flag(:improved_emoji_picker, project, default_enabled: :yaml)
push_frontend_feature_flag(:vue_issues_list, project&.group, default_enabled: :yaml)
- push_frontend_feature_flag(:iteration_cadences, project&.group, default_enabled: :yaml)
push_frontend_feature_flag(:contacts_autocomplete, project&.group, default_enabled: :yaml)
- push_frontend_feature_flag(:markdown_continue_lists, project, default_enabled: :yaml)
+ push_frontend_feature_flag(:incident_timeline, project, default_enabled: :yaml)
end
before_action only: :show do
push_frontend_feature_flag(:confidential_notes, project&.group, default_enabled: :yaml)
push_frontend_feature_flag(:issue_assignees_widget, project, default_enabled: :yaml)
push_frontend_feature_flag(:paginated_issue_discussions, project, default_enabled: :yaml)
- push_frontend_feature_flag(:work_items, project&.group, default_enabled: :yaml)
+ push_frontend_feature_flag(:realtime_labels, project, default_enabled: :yaml)
+ push_force_frontend_feature_flag(:work_items, project&.work_items_feature_flag_enabled?)
end
around_action :allow_gitaly_ref_name_caching, only: [:discussions]
@@ -72,10 +73,9 @@ class Projects::IssuesController < Projects::ApplicationController
attr_accessor :vulnerability_id
def index
- if html_request? && Feature.enabled?(:vue_issues_list, project&.group, default_enabled: :yaml)
+ if vue_issues_list?
set_sort_order
else
- set_issuables_index
@issues = @issuables
end
@@ -249,6 +249,12 @@ class Projects::IssuesController < Projects::ApplicationController
protected
+ def vue_issues_list?
+ action_name.to_sym == :index &&
+ html_request? &&
+ Feature.enabled?(:vue_issues_list, project&.group, default_enabled: :yaml)
+ end
+
def sorting_field
Issue::SORTING_PREFERENCE_FIELD
end
diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb
index b0f032a01e5..4189419c3ba 100644
--- a/app/controllers/projects/jobs_controller.rb
+++ b/app/controllers/projects/jobs_controller.rb
@@ -18,6 +18,7 @@ class Projects::JobsController < Projects::ApplicationController
before_action :authorize_create_proxy_build!, only: :proxy_websocket_authorize
before_action :verify_proxy_request!, only: :proxy_websocket_authorize
before_action :push_jobs_table_vue, only: [:index]
+ before_action :push_jobs_table_vue_search, only: [:index]
before_action do
push_frontend_feature_flag(:infinitely_collapsible_sections, @project, default_enabled: :yaml)
@@ -77,10 +78,13 @@ class Projects::JobsController < Projects::ApplicationController
end
def retry
- return respond_422 unless @build.retryable?
+ response = Ci::RetryJobService.new(project, current_user).execute(@build)
- build = Ci::Build.retry(@build, current_user)
- redirect_to build_path(build)
+ if response.success?
+ redirect_to build_path(response[:job])
+ else
+ respond_422
+ end
end
def play
@@ -269,4 +273,8 @@ class Projects::JobsController < Projects::ApplicationController
def push_jobs_table_vue
push_frontend_feature_flag(:jobs_table_vue, @project, default_enabled: :yaml)
end
+
+ def push_jobs_table_vue_search
+ push_frontend_feature_flag(:jobs_table_vue_search, @project, default_enabled: :yaml)
+ end
end
diff --git a/app/controllers/projects/learn_gitlab_controller.rb b/app/controllers/projects/learn_gitlab_controller.rb
index 177533b89c8..b9f9a1810b7 100644
--- a/app/controllers/projects/learn_gitlab_controller.rb
+++ b/app/controllers/projects/learn_gitlab_controller.rb
@@ -4,6 +4,7 @@ class Projects::LearnGitlabController < Projects::ApplicationController
before_action :authenticate_user!
before_action :check_experiment_enabled?
before_action :enable_invite_for_help_continuous_onboarding_experiment
+ before_action :enable_video_tutorials_continuous_onboarding_experiment
feature_category :users
@@ -24,4 +25,8 @@ class Projects::LearnGitlabController < Projects::ApplicationController
e.publish_to_database
end
end
+
+ def enable_video_tutorials_continuous_onboarding_experiment
+ experiment(:video_tutorials_continuous_onboarding, namespace: project&.namespace).publish
+ end
end
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 60d7920f83e..03bb132fe47 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -37,17 +37,12 @@ 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(:improved_emoji_picker, project, default_enabled: :yaml)
push_frontend_feature_flag(:restructured_mr_widget, project, default_enabled: :yaml)
push_frontend_feature_flag(:refactor_mr_widgets_extensions, project, default_enabled: :yaml)
push_frontend_feature_flag(:rebase_without_ci_ui, project, default_enabled: :yaml)
- push_frontend_feature_flag(:markdown_continue_lists, project, default_enabled: :yaml)
push_frontend_feature_flag(:secure_vulnerability_training, project, default_enabled: :yaml)
push_frontend_feature_flag(:issue_assignees_widget, @project, default_enabled: :yaml)
- # Usage data feature flags
- push_frontend_feature_flag(:users_expanding_widgets_usage_data, project, default_enabled: :yaml)
- push_frontend_feature_flag(:diff_settings_usage_data, default_enabled: :yaml)
- push_frontend_feature_flag(:usage_data_diff_searches, project, default_enabled: :yaml)
+ push_frontend_feature_flag(:realtime_labels, project, default_enabled: :yaml)
end
before_action do
@@ -85,7 +80,12 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
:destroy,
:rebase,
:discussions,
- :pipelines
+ :pipelines,
+ :test_reports
+ ]
+ urgency :low, [
+ :codequality_mr_diff_reports,
+ :codequality_reports
]
def index
@@ -130,9 +130,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
set_pipeline_variables
- ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336891') do
- @number_of_pipelines = @pipelines.size
- end
+ @number_of_pipelines = @pipelines.size
render
end
@@ -196,17 +194,15 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
Gitlab::PollingInterval.set_header(response, interval: 10_000)
- ::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
- }
+ 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/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb
index 5dc9718d7a4..b896e2543ff 100644
--- a/app/controllers/projects/milestones_controller.rb
+++ b/app/controllers/projects/milestones_controller.rb
@@ -26,6 +26,7 @@ class Projects::MilestonesController < Projects::ApplicationController
respond_to do |format|
format.html do
+ @milestone_states = Milestone.states_count(@project)
# We need to show group milestones in the JSON response
# so that people can filter by and assign group milestones,
# but we don't need to show them on the project milestones page itself.
diff --git a/app/controllers/projects/packages/infrastructure_registry_controller.rb b/app/controllers/projects/packages/infrastructure_registry_controller.rb
index 2fe353b7acb..99d75afc63a 100644
--- a/app/controllers/projects/packages/infrastructure_registry_controller.rb
+++ b/app/controllers/projects/packages/infrastructure_registry_controller.rb
@@ -9,7 +9,6 @@ module Projects
def show
@package = project.packages.find(params[:id])
- @package_files = @package.installable_package_files.recent
end
end
end
diff --git a/app/controllers/projects/pipeline_schedules_controller.rb b/app/controllers/projects/pipeline_schedules_controller.rb
index 271c31b6429..ac94cc001dd 100644
--- a/app/controllers/projects/pipeline_schedules_controller.rb
+++ b/app/controllers/projects/pipeline_schedules_controller.rb
@@ -10,10 +10,6 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
before_action :authorize_update_pipeline_schedule!, except: [:index, :new, :create, :play]
before_action :authorize_admin_pipeline_schedule!, only: [:destroy]
- before_action do
- push_frontend_feature_flag(:pipeline_schedules_with_tags, @project, default_enabled: :yaml)
- end
-
feature_category :continuous_integration
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/controllers/projects/pipelines/tests_controller.rb b/app/controllers/projects/pipelines/tests_controller.rb
index 602fc02686a..4daf700a8bd 100644
--- a/app/controllers/projects/pipelines/tests_controller.rb
+++ b/app/controllers/projects/pipelines/tests_controller.rb
@@ -3,6 +3,8 @@
module Projects
module Pipelines
class TestsController < Projects::Pipelines::ApplicationController
+ urgency :low, [:show, :summary]
+
before_action :authorize_read_build!
before_action :builds, only: [:show]
@@ -21,9 +23,13 @@ module Projects
def show
respond_to do |format|
format.json do
- render json: TestSuiteSerializer
- .new(project: project, current_user: @current_user)
- .represent(test_suite, details: true)
+ if Feature.enabled?(:ci_test_report_artifacts_expired, project, default_enabled: :yaml) && pipeline.has_expired_test_reports?
+ render json: { errors: 'Test report artifacts have expired' }, status: :not_found
+ else
+ render json: TestSuiteSerializer
+ .new(project: project, current_user: @current_user)
+ .represent(test_suite, details: true)
+ end
end
end
end
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 8279bb20769..02f041637ba 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -5,7 +5,7 @@ class Projects::PipelinesController < Projects::ApplicationController
include RedisTracking
urgency :default, [:status]
- urgency :low, [:index, :new, :builds, :show, :failures, :create, :stage, :retry, :dag, :cancel]
+ urgency :low, [:index, :new, :builds, :show, :failures, :create, :stage, :retry, :dag, :cancel, :test_report]
before_action :disable_query_limiting, only: [:create, :retry]
before_action :pipeline, except: [:index, :new, :create, :charts, :config_variables]
@@ -17,6 +17,10 @@ class Projects::PipelinesController < Projects::ApplicationController
before_action :authorize_update_pipeline!, only: [:retry, :cancel]
before_action :ensure_pipeline, only: [:show, :downloadable_artifacts]
+ before_action do
+ push_frontend_feature_flag(:pipeline_tabs_vue, @project, default_enabled: :yaml)
+ end
+
# Will be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/225596
before_action :redirect_for_legacy_scope_filter, only: [:index], if: -> { request.format.html? }
@@ -264,7 +268,7 @@ class Projects::PipelinesController < Projects::ApplicationController
project
.all_pipelines
.includes(builds: :tags, user: :status)
- .find_by!(id: params[:id])
+ .find(params[:id])
.present(current_user: current_user)
end
end
diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb
index 0279a65f262..49618c89672 100644
--- a/app/controllers/projects/project_members_controller.rb
+++ b/app/controllers/projects/project_members_controller.rb
@@ -8,7 +8,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController
# Authorize
before_action :authorize_admin_project_member!, except: [:index, :leave, :request_access]
- feature_category :authentication_and_authorization
+ feature_category :projects
def index
@sort = params[:sort].presence || sort_value_name
diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb
index b070f9419fc..72af3280a39 100644
--- a/app/controllers/projects/refs_controller.rb
+++ b/app/controllers/projects/refs_controller.rb
@@ -43,12 +43,7 @@ class Projects::RefsController < Projects::ApplicationController
end
def logs_tree
- tree_summary = ::Gitlab::TreeSummary.new(
- @commit, @project, current_user,
- path: @path, offset: permitted_params[:offset], limit: 25)
-
respond_to do |format|
- format.html { render_404 }
format.json do
logs, next_offset = tree_summary.fetch_logs
@@ -61,6 +56,13 @@ class Projects::RefsController < Projects::ApplicationController
private
+ def tree_summary
+ ::Gitlab::TreeSummary.new(
+ @commit, @project, current_user,
+ path: @path, offset: permitted_params[:offset], limit: 25
+ )
+ end
+
def validate_ref_id
return not_found if permitted_params[:id].present? && permitted_params[:id] !~ Gitlab::PathRegex.git_reference_regex
end
diff --git a/app/controllers/projects/releases_controller.rb b/app/controllers/projects/releases_controller.rb
index 1a2baf96020..19413d97d9d 100644
--- a/app/controllers/projects/releases_controller.rb
+++ b/app/controllers/projects/releases_controller.rb
@@ -8,9 +8,6 @@ class Projects::ReleasesController < Projects::ApplicationController
before_action :authorize_update_release!, only: %i[edit update]
before_action :authorize_create_release!, only: :new
before_action :validate_suffix_path, :fetch_latest_tag, only: :latest_permalink
- before_action only: :index do
- push_frontend_feature_flag(:releases_index_apollo_client, project, default_enabled: :yaml)
- end
feature_category :release_orchestration
diff --git a/app/controllers/projects/security/configuration_controller.rb b/app/controllers/projects/security/configuration_controller.rb
index 7b799cc0aa6..cdb02047215 100644
--- a/app/controllers/projects/security/configuration_controller.rb
+++ b/app/controllers/projects/security/configuration_controller.rb
@@ -6,6 +6,7 @@ module Projects
include SecurityAndCompliancePermissions
feature_category :static_application_security_testing, [:show]
+ urgency :low, [: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 b6f77a6d515..7352edaaab2 100644
--- a/app/controllers/projects/serverless/functions_controller.rb
+++ b/app/controllers/projects/serverless/functions_controller.rb
@@ -6,7 +6,7 @@ module Projects
before_action :ensure_feature_enabled!
before_action :authorize_read_cluster!
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
def index
respond_to do |format|
diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb
index 105f8efde7b..1321111faaf 100644
--- a/app/controllers/projects/services_controller.rb
+++ b/app/controllers/projects/services_controller.rb
@@ -13,10 +13,6 @@ class Projects::ServicesController < Projects::ApplicationController
before_action :set_deprecation_notice_for_prometheus_integration, only: [:edit, :update]
before_action :redirect_deprecated_prometheus_integration, only: [:update]
- before_action do
- push_frontend_feature_flag(:integration_form_sections, project, default_enabled: :yaml)
- end
-
respond_to :html
layout "project_settings"
diff --git a/app/controllers/projects/snippets_controller.rb b/app/controllers/projects/snippets_controller.rb
index 97f9c5814e2..c861b24d9ec 100644
--- a/app/controllers/projects/snippets_controller.rb
+++ b/app/controllers/projects/snippets_controller.rb
@@ -14,9 +14,7 @@ class Projects::SnippetsController < Projects::Snippets::ApplicationController
before_action :authorize_read_snippet!, except: [:new, :index]
before_action :authorize_update_snippet!, only: :edit
- before_action only: [:show] do
- push_frontend_feature_flag(:improved_emoji_picker, @project, default_enabled: :yaml)
- end
+ urgency :low, [:index]
def index
@snippet_counts = ::Snippets::CountService
diff --git a/app/controllers/projects/static_site_editor_controller.rb b/app/controllers/projects/static_site_editor_controller.rb
index 0d9a6f568a1..fed6307514e 100644
--- a/app/controllers/projects/static_site_editor_controller.rb
+++ b/app/controllers/projects/static_site_editor_controller.rb
@@ -3,6 +3,7 @@
class Projects::StaticSiteEditorController < Projects::ApplicationController
include ExtractsPath
include CreatesCommit
+ include BlobHelper
layout 'fullscreen'
@@ -24,28 +25,7 @@ class Projects::StaticSiteEditorController < Projects::ApplicationController
end
def show
- service_response = ::StaticSiteEditor::ConfigService.new(
- container: project,
- current_user: current_user,
- params: {
- ref: @ref,
- path: @path,
- return_url: params[:return_url]
- }
- ).execute
-
- if service_response.success?
- Gitlab::UsageDataCounters::StaticSiteEditorCounter.increment_views_count
-
- @data = serialize_necessary_payload_values_to_json(service_response.payload)
- else
- # TODO: For now, if the service returns any error, the user is redirected
- # to the root project page with the error message displayed as an alert.
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/213285#note_414808004
- # for discussion of plans to handle this via a page owned by the Static Site Editor.
- flash[:alert] = service_response.message
- redirect_to project_path(project)
- end
+ redirect_to ide_edit_path(project, @ref, @path)
end
private
diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb
index e447fc3f3fe..a70795f2065 100644
--- a/app/controllers/projects/tree_controller.rb
+++ b/app/controllers/projects/tree_controller.rb
@@ -18,7 +18,6 @@ class Projects::TreeController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:lazy_load_commits, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:new_dir_modal, @project, default_enabled: :yaml)
push_frontend_feature_flag(:refactor_blob_viewer, @project, default_enabled: :yaml)
push_frontend_feature_flag(:highlight_js, @project, default_enabled: :yaml)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb
index ed5bd73d6d1..e6e91231ba2 100644
--- a/app/controllers/projects/uploads_controller.rb
+++ b/app/controllers/projects/uploads_controller.rb
@@ -11,7 +11,7 @@ class Projects::UploadsController < Projects::ApplicationController
before_action :authorize_upload_file!, only: [:create, :authorize]
before_action :verify_workhorse_api!, only: [:authorize]
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
private
diff --git a/app/controllers/projects/usage_quotas_controller.rb b/app/controllers/projects/usage_quotas_controller.rb
index 680874ffee4..f45ee265432 100644
--- a/app/controllers/projects/usage_quotas_controller.rb
+++ b/app/controllers/projects/usage_quotas_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Projects::UsageQuotasController < Projects::ApplicationController
- before_action :authorize_admin_project!
+ before_action :authorize_read_usage_quotas!
layout "project_settings"
diff --git a/app/controllers/projects/web_ide_schemas_controller.rb b/app/controllers/projects/web_ide_schemas_controller.rb
index 84a191815f4..cdc416de6c9 100644
--- a/app/controllers/projects/web_ide_schemas_controller.rb
+++ b/app/controllers/projects/web_ide_schemas_controller.rb
@@ -5,6 +5,8 @@ class Projects::WebIdeSchemasController < Projects::ApplicationController
feature_category :web_ide
+ urgency :low
+
def show
return respond_422 unless branch_sha
diff --git a/app/controllers/projects/web_ide_terminals_controller.rb b/app/controllers/projects/web_ide_terminals_controller.rb
index 1d179765ad9..350b091edfa 100644
--- a/app/controllers/projects/web_ide_terminals_controller.rb
+++ b/app/controllers/projects/web_ide_terminals_controller.rb
@@ -57,11 +57,13 @@ class Projects::WebIdeTerminalsController < Projects::ApplicationController
end
def retry
- return respond_422 unless build.retryable?
+ response = Ci::RetryJobService.new(build.project, current_user).execute(build)
- new_build = Ci::Build.retry(build, current_user)
-
- render_terminal(new_build)
+ if response.success?
+ render_terminal(response[:job])
+ else
+ respond_422
+ end
end
private
diff --git a/app/controllers/projects/work_items_controller.rb b/app/controllers/projects/work_items_controller.rb
index 1bd2762f277..d39664e1deb 100644
--- a/app/controllers/projects/work_items_controller.rb
+++ b/app/controllers/projects/work_items_controller.rb
@@ -2,12 +2,12 @@
class Projects::WorkItemsController < Projects::ApplicationController
before_action do
- push_frontend_feature_flag(:work_items, project, default_enabled: :yaml)
+ push_force_frontend_feature_flag(:work_items, project&.work_items_feature_flag_enabled?)
end
- feature_category :not_owned
+ feature_category :team_planning
def index
- render_404 unless Feature.enabled?(:work_items, project, default_enabled: :yaml)
+ render_404 unless project&.work_items_feature_flag_enabled?
end
end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 507a8b66942..6cdfdfa9e2f 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -39,9 +39,8 @@ class ProjectsController < Projects::ApplicationController
push_frontend_feature_flag(:refactor_blob_viewer, @project, default_enabled: :yaml)
push_frontend_feature_flag(:highlight_js, @project, default_enabled: :yaml)
push_frontend_feature_flag(:increase_page_size_exponentially, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:new_dir_modal, @project, default_enabled: :yaml)
push_licensed_feature(:file_locks) if @project.present? && @project.licensed_feature_available?(:file_locks)
- push_frontend_feature_flag(:work_items, @project, default_enabled: :yaml)
+ push_force_frontend_feature_flag(:work_items, @project&.work_items_feature_flag_enabled?)
end
layout :determine_layout
@@ -57,7 +56,8 @@ class ProjectsController < Projects::ApplicationController
feature_category :code_review, [:unfoldered_environment_names]
feature_category :portfolio_management, [:planning_hierarchy]
- urgency :low, [:refs]
+ # TODO: Set high urgency for #show https://gitlab.com/gitlab-org/gitlab/-/issues/334444
+ urgency :low, [:refs, :show]
urgency :high, [:unfoldered_environment_names]
def index
@@ -69,6 +69,13 @@ class ProjectsController < Projects::ApplicationController
@namespace = Namespace.find_by(id: params[:namespace_id]) if params[:namespace_id]
return access_denied! if @namespace && !can?(current_user, :create_projects, @namespace)
+ @current_user_group =
+ if current_user.manageable_groups(include_groups_with_developer_maintainer_access: true).count == 1
+ current_user.manageable_groups(include_groups_with_developer_maintainer_access: true).first
+ else
+ nil
+ end
+
@project = Project.new(namespace_id: @namespace&.id)
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -82,13 +89,6 @@ 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 }
@@ -305,12 +305,7 @@ class ProjectsController < Projects::ApplicationController
end
if find_tags && @repository.tag_count.nonzero?
- tags = begin
- TagsFinder.new(@repository, refs_params).execute
- rescue Gitlab::Git::CommandError
- []
- end
-
+ tags = TagsFinder.new(@repository, refs_params).execute
options['Tags'] = tags.take(100).map(&:name)
end
@@ -321,6 +316,8 @@ class ProjectsController < Projects::ApplicationController
end
render json: options.to_json
+ rescue Gitlab::Git::CommandError
+ render json: { error: _('Unable to load refs') }, status: :service_unavailable
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -545,9 +542,9 @@ class ProjectsController < Projects::ApplicationController
def check_export_rate_limit!
prefixed_action = "project_#{params[:action]}".to_sym
- project_scope = params[:action] == 'download_export' ? @project : nil
+ group_scope = params[:action] == 'download_export' ? @project.namespace : nil
- check_rate_limit!(prefixed_action, scope: [current_user, project_scope].compact)
+ check_rate_limit!(prefixed_action, scope: [current_user, group_scope].compact)
end
def render_edit
diff --git a/app/controllers/sandbox_controller.rb b/app/controllers/sandbox_controller.rb
index a87c2b38e60..a48b2b8a314 100644
--- a/app/controllers/sandbox_controller.rb
+++ b/app/controllers/sandbox_controller.rb
@@ -3,7 +3,7 @@
class SandboxController < ApplicationController # rubocop:disable Gitlab/NamespacedClass
skip_before_action :authenticate_user!
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
def mermaid
render layout: false
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index 817da658f14..b4e2da0c7b3 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -169,15 +169,17 @@ class SearchController < ApplicationController
search_allowed = case params[:scope]
when 'blobs'
- Feature.enabled?(:global_search_code_tab, current_user, type: :ops, default_enabled: true)
+ Feature.enabled?(:global_search_code_tab, current_user, type: :ops, default_enabled: :yaml)
when 'commits'
- Feature.enabled?(:global_search_commits_tab, current_user, type: :ops, default_enabled: true)
+ Feature.enabled?(:global_search_commits_tab, current_user, type: :ops, default_enabled: :yaml)
when 'issues'
- Feature.enabled?(:global_search_issues_tab, current_user, type: :ops, default_enabled: true)
+ Feature.enabled?(:global_search_issues_tab, current_user, type: :ops, default_enabled: :yaml)
when 'merge_requests'
- Feature.enabled?(:global_search_merge_requests_tab, current_user, type: :ops, default_enabled: true)
+ Feature.enabled?(:global_search_merge_requests_tab, current_user, type: :ops, default_enabled: :yaml)
when 'wiki_blobs'
- Feature.enabled?(:global_search_wiki_tab, current_user, type: :ops, default_enabled: true)
+ Feature.enabled?(:global_search_wiki_tab, current_user, type: :ops, default_enabled: :yaml)
+ when 'users'
+ Feature.enabled?(:global_search_users_tab, current_user, type: :ops, default_enabled: :yaml)
else
true
end
diff --git a/app/controllers/sent_notifications_controller.rb b/app/controllers/sent_notifications_controller.rb
index 64d66ee86f1..ebadfd1cdfb 100644
--- a/app/controllers/sent_notifications_controller.rb
+++ b/app/controllers/sent_notifications_controller.rb
@@ -3,7 +3,7 @@
class SentNotificationsController < ApplicationController
skip_before_action :authenticate_user!
- feature_category :users
+ feature_category :team_planning
def unsubscribe
@sent_notification = SentNotification.for(params[:id])
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index e907e291eeb..3e11e0940bf 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -126,7 +126,7 @@ class SessionsController < Devise::SessionsController
flash[:alert] = _('There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.')
flash.delete :recaptcha_error
- respond_with_navigational(resource) { render :new }
+ redirect_to new_user_session_path
end
end
diff --git a/app/controllers/snippets/blobs_controller.rb b/app/controllers/snippets/blobs_controller.rb
index d7c4bbcf8f2..c9a78f39c89 100644
--- a/app/controllers/snippets/blobs_controller.rb
+++ b/app/controllers/snippets/blobs_controller.rb
@@ -2,6 +2,7 @@
class Snippets::BlobsController < Snippets::ApplicationController
include Snippets::BlobsActions
+ urgency :low
skip_before_action :authenticate_user!, only: [:raw]
end
diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb
index 4df0ef78907..97bbb96eae6 100644
--- a/app/controllers/uploads_controller.rb
+++ b/app/controllers/uploads_controller.rb
@@ -14,7 +14,8 @@ class UploadsController < ApplicationController
"appearance" => Appearance,
"personal_snippet" => PersonalSnippet,
"projects/topic" => Projects::Topic,
- nil => PersonalSnippet
+ 'alert_management_metric_image' => ::AlertManagement::MetricImage,
+ nil => PersonalSnippet
}.freeze
rescue_from UnknownUploadModelError, with: :render_404
@@ -26,7 +27,7 @@ class UploadsController < ApplicationController
before_action :authorize_create_access!, only: [:create, :authorize]
before_action :verify_workhorse_api!, only: [:authorize]
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
def self.model_classes
MODEL_CLASSES
@@ -56,6 +57,8 @@ class UploadsController < ApplicationController
true
when Projects::Topic
true
+ when ::AlertManagement::MetricImage
+ can?(current_user, :read_alert_management_metric_image, model.alert)
else
can?(current_user, "read_#{model.class.underscore}".to_sym, model)
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index dc02e4a3e87..228ef710749 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -27,7 +27,14 @@ class UsersController < ApplicationController
check_rate_limit!(:username_exists, scope: request.ip)
end
- feature_category :users
+ feature_category :users, [:show, :activity, :groups, :projects, :contributed, :starred,
+ :followers, :following, :calendar, :calendar_activities,
+ :exists, :activity, :follow, :unfollow, :ssh_keys, :gpg_keys]
+
+ feature_category :snippets, [:snippets]
+
+ # TODO: Set higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/357914
+ urgency :low, [:show]
def show
respond_to do |format|
diff --git a/app/events/ci/pipeline_created_event.rb b/app/events/ci/pipeline_created_event.rb
index 8b971b63cea..2f2bee0903a 100644
--- a/app/events/ci/pipeline_created_event.rb
+++ b/app/events/ci/pipeline_created_event.rb
@@ -5,6 +5,7 @@ module Ci
def schema
{
'type' => 'object',
+ 'required' => ['pipeline_id'],
'properties' => {
'pipeline_id' => { 'type' => 'integer' }
}
diff --git a/app/experiments/application_experiment.rb b/app/experiments/application_experiment.rb
index f74e7fe3b1d..e5b67527cb1 100644
--- a/app/experiments/application_experiment.rb
+++ b/app/experiments/application_experiment.rb
@@ -3,6 +3,11 @@
class ApplicationExperiment < Gitlab::Experiment
control { nil } # provide a default control for anonymous experiments
+ # Documented in:
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/357904
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/345932
+ #
+ # @deprecated
def publish_to_database
ActiveSupport::Deprecation.warn('publish_to_database is deprecated and should not be used for reporting anymore')
@@ -21,10 +26,13 @@ class ApplicationExperiment < Gitlab::Experiment
# define a default nil control behavior so we can omit it when not needed
end
- # TODO: remove
# This is deprecated logic as of v0.6.0 and should eventually be removed, but
# needs to stay intact for actively running experiments. The new strategy
# utilizes Digest::SHA2, a secret seed, and generates a 64-byte string.
+ #
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/334590
+ #
+ # @deprecated
def key_for(source, seed = name)
source = source.keys + source.values if source.is_a?(Hash)
diff --git a/app/experiments/ios_specific_templates_experiment.rb b/app/experiments/ios_specific_templates_experiment.rb
new file mode 100644
index 00000000000..1731fa87be8
--- /dev/null
+++ b/app/experiments/ios_specific_templates_experiment.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class IosSpecificTemplatesExperiment < ApplicationExperiment
+ before_run(if: :skip_experiment) { throw(:abort) } # rubocop:disable Cop/BanCatchThrow
+
+ private
+
+ def skip_experiment
+ actor_not_able_to_create_pipelines? ||
+ project_targets_non_ios_platforms? ||
+ project_has_gitlab_ci? ||
+ project_has_pipelines?
+ end
+
+ def actor_not_able_to_create_pipelines?
+ !context.actor.is_a?(User) || !context.actor.can?(:create_pipeline, context.project)
+ end
+
+ def project_targets_non_ios_platforms?
+ context.project.project_setting.target_platforms.exclude?('ios')
+ end
+
+ def project_has_gitlab_ci?
+ context.project.has_ci? && context.project.builds_enabled?
+ end
+
+ def project_has_pipelines?
+ context.project.all_pipelines.count > 0
+ end
+end
diff --git a/app/experiments/logged_out_marketing_header_experiment.rb b/app/experiments/logged_out_marketing_header_experiment.rb
new file mode 100644
index 00000000000..3d88d94aec4
--- /dev/null
+++ b/app/experiments/logged_out_marketing_header_experiment.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class LoggedOutMarketingHeaderExperiment < ApplicationExperiment
+ # These default behaviors are overriden in ApplicationHelper and header
+ # template partial
+ control {}
+ candidate {}
+ variant(:trial_focused) {}
+end
diff --git a/app/experiments/new_project_sast_enabled_experiment.rb b/app/experiments/new_project_sast_enabled_experiment.rb
deleted file mode 100644
index 4aca4c875b2..00000000000
--- a/app/experiments/new_project_sast_enabled_experiment.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class NewProjectSastEnabledExperiment < ApplicationExperiment
- control { }
- variant(:candidate) { }
- variant(:free_indicator) { }
- variant(:unchecked_candidate) { }
- variant(:unchecked_free_indicator) { }
-
- def publish(*args)
- super
-
- publish_to_database
- end
-end
diff --git a/app/experiments/video_tutorials_continuous_onboarding_experiment.rb b/app/experiments/video_tutorials_continuous_onboarding_experiment.rb
new file mode 100644
index 00000000000..3cb676b25f2
--- /dev/null
+++ b/app/experiments/video_tutorials_continuous_onboarding_experiment.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+class VideoTutorialsContinuousOnboardingExperiment < ApplicationExperiment
+ control { }
+ candidate { }
+end
diff --git a/app/finders/bulk_imports/entities_finder.rb b/app/finders/bulk_imports/entities_finder.rb
index 2947d155668..78446f104d0 100644
--- a/app/finders/bulk_imports/entities_finder.rb
+++ b/app/finders/bulk_imports/entities_finder.rb
@@ -2,10 +2,10 @@
module BulkImports
class EntitiesFinder
- def initialize(user:, bulk_import: nil, status: nil)
+ def initialize(user:, bulk_import: nil, params: {})
@user = user
@bulk_import = bulk_import
- @status = status
+ @params = params
end
def execute
@@ -14,6 +14,7 @@ module BulkImports
.by_user_id(user.id)
.then(&method(:filter_by_bulk_import))
.then(&method(:filter_by_status))
+ .then(&method(:sort))
end
private
@@ -23,13 +24,19 @@ module BulkImports
def filter_by_bulk_import(entities)
return entities unless bulk_import
- entities.where(bulk_import_id: bulk_import.id) # rubocop: disable CodeReuse/ActiveRecord
+ entities.by_bulk_import_id(bulk_import.id)
end
def filter_by_status(entities)
- return entities unless ::BulkImports::Entity.all_human_statuses.include?(status)
+ return entities unless ::BulkImports::Entity.all_human_statuses.include?(@params[:status])
- entities.with_status(status)
+ entities.with_status(@params[:status])
+ end
+
+ def sort(entities)
+ return entities unless @params[:sort]
+
+ entities.order_by_created_at(@params[:sort])
end
end
end
diff --git a/app/finders/bulk_imports/imports_finder.rb b/app/finders/bulk_imports/imports_finder.rb
index b554bbfa5e7..d682080576f 100644
--- a/app/finders/bulk_imports/imports_finder.rb
+++ b/app/finders/bulk_imports/imports_finder.rb
@@ -2,13 +2,14 @@
module BulkImports
class ImportsFinder
- def initialize(user:, status: nil)
+ def initialize(user:, params: {})
@user = user
- @status = status
+ @params = params
end
def execute
- filter_by_status(user.bulk_imports)
+ imports = filter_by_status(user.bulk_imports)
+ sort(imports)
end
private
@@ -16,9 +17,15 @@ module BulkImports
attr_reader :user, :status
def filter_by_status(imports)
- return imports unless BulkImport.all_human_statuses.include?(status)
+ return imports unless BulkImport.all_human_statuses.include?(@params[:status])
- imports.with_status(status)
+ imports.with_status(@params[:status])
+ end
+
+ def sort(imports)
+ return imports unless @params[:sort]
+
+ imports.order_by_created_at(@params[:sort])
end
end
end
diff --git a/app/finders/ci/jobs_finder.rb b/app/finders/ci/jobs_finder.rb
index 5fc9c0e1778..152eb271694 100644
--- a/app/finders/ci/jobs_finder.rb
+++ b/app/finders/ci/jobs_finder.rb
@@ -76,7 +76,7 @@ module Ci
unknown_statuses = params[:scope] - ::CommitStatus::AVAILABLE_STATUSES
raise ArgumentError, 'Scope contains invalid value(s)' unless unknown_statuses.empty?
- builds.where(status: params[:scope]) # rubocop: disable CodeReuse/ActiveRecord
+ builds.with_statuses(params[:scope])
end
def jobs_by_type(relation, type)
diff --git a/app/finders/concerns/finder_methods.rb b/app/finders/concerns/finder_methods.rb
index 193b52b1694..ce6001a01d7 100644
--- a/app/finders/concerns/finder_methods.rb
+++ b/app/finders/concerns/finder_methods.rb
@@ -13,16 +13,23 @@ module FinderMethods
end
# rubocop: enable CodeReuse/ActiveRecord
+ # rubocop: disable CodeReuse/ActiveRecord
def find(*args)
- raise_not_found_unless_authorized model.find(*args)
+ raise_not_found_unless_authorized execute.reorder(nil).find(*args)
end
+ # rubocop: enable CodeReuse/ActiveRecord
private
def raise_not_found_unless_authorized(result)
result = if_authorized(result)
- raise(ActiveRecord::RecordNotFound, "Couldn't find #{model}") unless result
+ unless result
+ # This fetches the model from the `ActiveRecord::Relation` but does not
+ # actually execute the query.
+ model = execute.model
+ raise ActiveRecord::RecordNotFound, "Couldn't find #{model}"
+ end
result
end
@@ -32,11 +39,7 @@ module FinderMethods
# this is currently the case in the `MilestoneFinder`
return result unless respond_to?(:current_user, true)
- if can_read_object?(result)
- result
- else
- nil
- end
+ result if can_read_object?(result)
end
def can_read_object?(object)
@@ -53,10 +56,4 @@ module FinderMethods
# Not all objects define `#to_ability_name`, so attempt to derive it:
object.model_name.singular
end
-
- # This fetches the model from the `ActiveRecord::Relation` but does not
- # actually execute the query.
- def model
- execute.model
- end
end
diff --git a/app/finders/keys_finder.rb b/app/finders/keys_finder.rb
index 9c357e12205..4b5cc02f012 100644
--- a/app/finders/keys_finder.rb
+++ b/app/finders/keys_finder.rb
@@ -52,11 +52,11 @@ class KeysFinder
end
def valid_fingerprint_param?
- if fingerprint_type == "sha256"
- Base64.decode64(fingerprint).length == 32
- else
- fingerprint =~ /^(\h{2}:){15}\h{2}/
- end
+ return Base64.decode64(fingerprint).length == 32 if fingerprint_type == "sha256"
+
+ return false if Gitlab::FIPS.enabled?
+
+ fingerprint =~ /^(\h{2}:){15}\h{2}/
end
def fingerprint_query
diff --git a/app/finders/packages/build_infos_for_many_packages_finder.rb b/app/finders/packages/build_infos_for_many_packages_finder.rb
new file mode 100644
index 00000000000..8f9805f51d0
--- /dev/null
+++ b/app/finders/packages/build_infos_for_many_packages_finder.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+
+module Packages
+ # TODO rename to BuildInfosFinder when cleaning up packages_graphql_pipelines_resolver
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/358432
+ class BuildInfosForManyPackagesFinder
+ include ActiveRecord::ConnectionAdapters::Quoting
+
+ MAX_PAGE_SIZE = 100
+
+ def initialize(package_ids, params)
+ @package_ids = package_ids
+ @params = params
+ end
+
+ def execute
+ return Packages::BuildInfo.none if @package_ids.blank?
+
+ # This is a highly custom query that
+ # will not be re-used elsewhere
+ # rubocop: disable CodeReuse/ActiveRecord
+ query = Packages::Package.id_in(@package_ids)
+ .select('build_infos.*')
+ .from([Packages::Package.arel_table, lateral_query.arel.lateral.as('build_infos')])
+ .order('build_infos.id DESC')
+
+ # We manually select build_infos fields from the lateral query.
+ # Thus, we need to instruct ActiveRecord that returned rows are
+ # actually Packages::BuildInfo objects
+ Packages::BuildInfo.find_by_sql(query.to_sql)
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+
+ private
+
+ def lateral_query
+ order_direction = last ? :asc : :desc
+
+ # This is a highly custom query that
+ # will not be re-used elsewhere
+ # rubocop: disable CodeReuse/ActiveRecord
+ where_condition = Packages::BuildInfo.arel_table[:package_id]
+ .eq(Arel.sql("#{Packages::Package.table_name}.id"))
+ build_infos = ::Packages::BuildInfo.without_empty_pipelines
+ .where(where_condition)
+ .order(id: order_direction)
+ .limit(max_rows_per_package_id)
+ # rubocop: enable CodeReuse/ActiveRecord
+ apply_cursor(build_infos)
+ end
+
+ def max_rows_per_package_id
+ limit = [first, last, max_page_size, MAX_PAGE_SIZE].compact.min
+ limit += 1 if support_next_page
+ limit
+ end
+
+ def apply_cursor(build_infos)
+ if before
+ build_infos.with_pipeline_id_greater_than(before)
+ elsif after
+ build_infos.with_pipeline_id_less_than(after)
+ else
+ build_infos
+ end
+ end
+
+ def first
+ @params[:first]
+ end
+
+ def last
+ @params[:last]
+ end
+
+ def max_page_size
+ @params[:max_page_size]
+ end
+
+ def before
+ @params[:before]
+ end
+
+ def after
+ @params[:after]
+ end
+
+ def support_next_page
+ @params[:support_next_page]
+ end
+ end
+end
diff --git a/app/finders/packages/group_packages_finder.rb b/app/finders/packages/group_packages_finder.rb
index 23b0e71d836..1d1ae59674a 100644
--- a/app/finders/packages/group_packages_finder.rb
+++ b/app/finders/packages/group_packages_finder.rb
@@ -22,11 +22,11 @@ module Packages
def packages_for_group_projects(installable_only: false)
packages = ::Packages::Package
- .preload_pipelines
.including_project_route
.including_tags
.for_projects(group_projects_visible_to_current_user.select(:id))
.sort_by_attribute("#{params[:order_by]}_#{params[:sort]}")
+ packages = packages.preload_pipelines if preload_pipelines
packages = filter_with_version(packages)
packages = filter_by_package_type(packages)
@@ -59,5 +59,9 @@ module Packages
def exclude_subgroups?
params[:exclude_subgroups]
end
+
+ def preload_pipelines
+ params.fetch(:preload_pipelines, true)
+ end
end
end
diff --git a/app/finders/packages/packages_finder.rb b/app/finders/packages/packages_finder.rb
index 3bc348c8dc8..b3d14e15953 100644
--- a/app/finders/packages/packages_finder.rb
+++ b/app/finders/packages/packages_finder.rb
@@ -14,9 +14,9 @@ module Packages
def execute
packages = project.packages
- .preload_pipelines
.including_project_route
.including_tags
+ packages = packages.preload_pipelines if preload_pipelines
packages = filter_with_version(packages)
packages = filter_by_package_type(packages)
@@ -32,5 +32,9 @@ module Packages
def order_packages(packages)
packages.sort_by_attribute("#{params[:order_by]}_#{params[:sort]}")
end
+
+ def preload_pipelines
+ params.fetch(:preload_pipelines, true)
+ end
end
end
diff --git a/app/finders/releases/group_releases_finder.rb b/app/finders/releases/group_releases_finder.rb
index d87ba8c0b03..8b1b0c552fd 100644
--- a/app/finders/releases/group_releases_finder.rb
+++ b/app/finders/releases/group_releases_finder.rb
@@ -6,9 +6,8 @@ module Releases
#
# order_by - only ordering by released_at is supported
# filter by tag - currently not supported
+ # include_subgroups - always true for group releases finder
class GroupReleasesFinder
- include Gitlab::Utils::StrongMemoize
-
attr_reader :parent, :current_user, :params
def initialize(parent, current_user = nil, params = {})
@@ -16,59 +15,34 @@ module Releases
@current_user = current_user
@params = params
- params[:order_by] ||= 'released_at'
params[:sort] ||= 'desc'
- params[:page] ||= 0
- params[:per] ||= 30
end
def execute(preload: true)
return Release.none unless Ability.allowed?(current_user, :read_release, parent)
- releases = get_releases(preload: preload)
-
- paginate_releases(releases)
+ releases = get_releases
+ releases.preloaded if preload
+ releases
end
private
- def include_subgroups?
- params.fetch(:include_subgroups, false)
- end
-
- def accessible_projects_scope
- if include_subgroups?
- Project.for_group_and_its_subgroups(parent)
- else
- parent.projects
- end
- end
-
# rubocop: disable CodeReuse/ActiveRecord
- def get_releases(preload: true)
+ def get_releases
Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder.new(
- scope: releases_scope(preload: preload),
- array_scope: accessible_projects_scope.select(:id),
+ scope: releases_scope,
+ array_scope: Project.for_group_and_its_subgroups(parent).select(:id),
array_mapping_scope: -> (project_id_expression) { Release.where(Release.arel_table[:project_id].eq(project_id_expression)) },
finder_query: -> (order_by, id_expression) { Release.where(Release.arel_table[:id].eq(id_expression)) }
)
.execute
end
- def releases_scope(preload: true)
- scope = Release.all
- scope = order_releases(scope)
- scope = scope.preloaded if preload
- scope
- end
-
- def order_releases(scope)
- scope.sort_by_attribute("released_at_#{params[:sort]}").order(id: params[:sort])
+ def releases_scope
+ Release.sort_by_attribute("released_at_#{params[:sort]}").order(id: params[:sort])
end
- def paginate_releases(releases)
- releases.page(params[:page].to_i).per(params[:per])
- end
# rubocop: enable CodeReuse/ActiveRecord
end
end
diff --git a/app/finders/user_recent_events_finder.rb b/app/finders/user_recent_events_finder.rb
index 96120d9412f..64903c67573 100644
--- a/app/finders/user_recent_events_finder.rb
+++ b/app/finders/user_recent_events_finder.rb
@@ -73,10 +73,20 @@ class UserRecentEventsFinder
return Event.none if users.empty?
- if event_filter.filter == EventFilter::ALL
- execute_optimized_multi(users)
+ if Feature.enabled?(:optimized_followed_users_queries, current_user)
+ query_builder_params = event_filter.in_operator_query_builder_params(users)
+
+ Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
+ .new(**query_builder_params)
+ .execute
+ .limit(limit)
+ .offset(params[:offset] || 0)
else
- event_filter.apply_filter(Event.where(author: users).limit_recent(limit, params[:offset] || 0))
+ if event_filter.filter == EventFilter::ALL
+ execute_optimized_multi(users)
+ else
+ event_filter.apply_filter(Event.where(author: users).limit_recent(limit, params[:offset] || 0))
+ end
end
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/finders/users_finder.rb b/app/finders/users_finder.rb
index b983882b272..9c2462b42a6 100644
--- a/app/finders/users_finder.rb
+++ b/app/finders/users_finder.rb
@@ -47,6 +47,7 @@ class UsersFinder
users = by_without_projects(users)
users = by_custom_attributes(users)
users = by_non_internal(users)
+ users = by_without_project_bots(users)
order(users)
end
@@ -54,7 +55,8 @@ class UsersFinder
private
def base_scope
- User.all.order_id_desc
+ scope = current_user&.admin? ? User.all : User.without_forbidden_states
+ scope.order_id_desc
end
def by_username(users)
@@ -138,6 +140,12 @@ class UsersFinder
users.non_internal
end
+ def by_without_project_bots(users)
+ return users unless params[:without_project_bots]
+
+ users.without_project_bot
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def order(users)
return users unless params[:sort]
diff --git a/app/graphql/graphql_triggers.rb b/app/graphql/graphql_triggers.rb
index ac1a4a6b9ef..342cff83e90 100644
--- a/app/graphql/graphql_triggers.rb
+++ b/app/graphql/graphql_triggers.rb
@@ -12,4 +12,8 @@ module GraphqlTriggers
def self.issuable_title_updated(issuable)
GitlabSchema.subscriptions.trigger('issuableTitleUpdated', { issuable_id: issuable.to_gid }, issuable)
end
+
+ def self.issuable_labels_updated(issuable)
+ GitlabSchema.subscriptions.trigger('issuableLabelsUpdated', { issuable_id: issuable.to_gid }, issuable)
+ end
end
diff --git a/app/graphql/mutations/ci/job/retry.rb b/app/graphql/mutations/ci/job/retry.rb
index 9af357ab216..50e9c51c9e7 100644
--- a/app/graphql/mutations/ci/job/retry.rb
+++ b/app/graphql/mutations/ci/job/retry.rb
@@ -17,11 +17,19 @@ module Mutations
job = authorized_find!(id: id)
project = job.project
- ::Ci::RetryBuildService.new(project, current_user).execute(job)
- {
- job: job,
- errors: errors_on_object(job)
- }
+ response = ::Ci::RetryJobService.new(project, current_user).execute(job)
+
+ if response.success?
+ {
+ job: response[:job],
+ errors: []
+ }
+ else
+ {
+ job: nil,
+ errors: [response.message]
+ }
+ end
end
end
end
diff --git a/app/graphql/mutations/ci/pipeline/cancel.rb b/app/graphql/mutations/ci/pipeline/cancel.rb
index 3fb34a37cfc..3ec6eee9f54 100644
--- a/app/graphql/mutations/ci/pipeline/cancel.rb
+++ b/app/graphql/mutations/ci/pipeline/cancel.rb
@@ -13,6 +13,8 @@ module Mutations
if pipeline.cancelable?
pipeline.cancel_running
+ pipeline.cancel
+
{ success: true, errors: [] }
else
{ success: false, errors: ['Pipeline is not cancelable'] }
diff --git a/app/graphql/mutations/environments/canary_ingress/update.rb b/app/graphql/mutations/environments/canary_ingress/update.rb
index e4ba08e6dcc..ce24b8842c6 100644
--- a/app/graphql/mutations/environments/canary_ingress/update.rb
+++ b/app/graphql/mutations/environments/canary_ingress/update.rb
@@ -5,6 +5,7 @@ module Mutations
module CanaryIngress
class Update < ::Mutations::BaseMutation
graphql_name 'EnvironmentsCanaryIngressUpdate'
+ description '**Deprecated** This endpoint is planned to be removed along with certificate-based clusters. [See this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) for more information.'
authorize :update_environment
@@ -18,7 +19,13 @@ module Mutations
required: true,
description: 'Weight of the Canary Ingress.'
+ REMOVAL_ERR_MSG = 'This endpoint was deactivated as part of the certificate-based' \
+ 'kubernetes integration removal. See Epic:' \
+ 'https://gitlab.com/groups/gitlab-org/configure/-/epics/8'
+
def resolve(id:, **kwargs)
+ return { errors: [REMOVAL_ERR_MSG] } if cert_based_clusters_ff_disabled?
+
environment = authorized_find!(id: id)
result = ::Environments::CanaryIngress::UpdateService
@@ -33,6 +40,12 @@ module Mutations
id = ::Types::GlobalIDType[::Environment].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
+
+ private
+
+ def cert_based_clusters_ff_disabled?
+ Feature.disabled?(:certificate_based_clusters, default_enabled: :yaml, type: :ops)
+ end
end
end
end
diff --git a/app/graphql/mutations/notes/update/note.rb b/app/graphql/mutations/notes/update/note.rb
index c7ee0148f94..a483294169f 100644
--- a/app/graphql/mutations/notes/update/note.rb
+++ b/app/graphql/mutations/notes/update/note.rb
@@ -15,7 +15,8 @@ module Mutations
argument :confidential,
GraphQL::Types::Boolean,
required: false,
- description: 'Confidentiality flag of a note. Default is false.'
+ description: 'Confidentiality flag of a note. Default is false.',
+ deprecated: { reason: 'No longer allowed to update confidentiality of notes', milestone: '14.10' }
private
diff --git a/app/graphql/mutations/saved_replies/base.rb b/app/graphql/mutations/saved_replies/base.rb
index 468263b0f9d..59871df687f 100644
--- a/app/graphql/mutations/saved_replies/base.rb
+++ b/app/graphql/mutations/saved_replies/base.rb
@@ -5,7 +5,7 @@ module Mutations
class Base < BaseMutation
field :saved_reply, Types::SavedReplyType,
null: true,
- description: 'Updated saved reply.'
+ description: 'Saved reply after mutation.'
private
diff --git a/app/graphql/mutations/saved_replies/destroy.rb b/app/graphql/mutations/saved_replies/destroy.rb
new file mode 100644
index 00000000000..7cd0f21ad45
--- /dev/null
+++ b/app/graphql/mutations/saved_replies/destroy.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Mutations
+ module SavedReplies
+ class Destroy < Base
+ graphql_name 'SavedReplyDestroy'
+
+ authorize :destroy_saved_replies
+
+ argument :id, Types::GlobalIDType[::Users::SavedReply],
+ required: true,
+ description: copy_field_description(Types::SavedReplyType, :id)
+
+ def resolve(id:)
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature disabled' unless feature_enabled?
+
+ saved_reply = authorized_find!(id)
+ result = ::Users::SavedReplies::DestroyService.new(saved_reply: saved_reply).execute
+ present_result(result)
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/saved_replies/update.rb b/app/graphql/mutations/saved_replies/update.rb
index bacc6ceb39e..d9368de7547 100644
--- a/app/graphql/mutations/saved_replies/update.rb
+++ b/app/graphql/mutations/saved_replies/update.rb
@@ -23,7 +23,7 @@ module Mutations
raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature disabled' unless feature_enabled?
saved_reply = authorized_find!(id)
- result = ::Users::SavedReplies::UpdateService.new(current_user: current_user, saved_reply: saved_reply, name: name, content: content).execute
+ result = ::Users::SavedReplies::UpdateService.new(saved_reply: saved_reply, name: name, content: content).execute
present_result(result)
end
end
diff --git a/app/graphql/mutations/todos/mark_all_done.rb b/app/graphql/mutations/todos/mark_all_done.rb
index 7dd06cc8293..67a822c1067 100644
--- a/app/graphql/mutations/todos/mark_all_done.rb
+++ b/app/graphql/mutations/todos/mark_all_done.rb
@@ -7,14 +7,22 @@ module Mutations
authorize :update_user
+ TodoableID = Types::GlobalIDType[Todoable]
+
+ argument :target_id,
+ TodoableID,
+ required: false,
+ description: "Global ID of the to-do item's parent. Issues, merge requests, designs, and epics are supported. " \
+ "If argument is omitted, all pending to-do items of the current user are marked as done."
+
field :todos, [::Types::TodoType],
null: false,
description: 'Updated to-do items.'
- def resolve
+ def resolve(**args)
authorize!(current_user)
- updated_ids = mark_all_todos_done
+ updated_ids = mark_all_todos_done(**args)
{
todos: Todo.id_in(updated_ids),
@@ -24,10 +32,23 @@ module Mutations
private
- def mark_all_todos_done
+ def mark_all_todos_done(**args)
return [] unless current_user
- todos = TodosFinder.new(current_user).execute
+ finder_params = { state: :pending }
+
+ if args[:target_id].present?
+ target = Gitlab::Graphql::Lazy.force(
+ GitlabSchema.find_by_gid(TodoableID.coerce_isolated_input(args[:target_id]))
+ )
+
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, "Resource not available: #{args[:target_id]}" if target.nil?
+
+ finder_params[:type] = target.class.name
+ finder_params[:target_id] = target.id
+ end
+
+ todos = TodosFinder.new(current_user, finder_params).execute
TodoService.new.resolve_todos(todos, current_user, resolved_by_action: :api_all_done)
end
diff --git a/app/graphql/mutations/user_preferences/update.rb b/app/graphql/mutations/user_preferences/update.rb
index c92c6d725b7..eface536a87 100644
--- a/app/graphql/mutations/user_preferences/update.rb
+++ b/app/graphql/mutations/user_preferences/update.rb
@@ -14,6 +14,15 @@ module Mutations
null: true,
description: 'User preferences after mutation.'
+ def ready?(**args)
+ if disabled_sort_value?(args)
+ raise Gitlab::Graphql::Errors::ArgumentError,
+ 'Feature flag `incident_escalations` must be enabled to use this sort order.'
+ end
+
+ super
+ end
+
def resolve(**attributes)
user_preferences = current_user.user_preference
user_preferences.update(attributes)
@@ -23,6 +32,14 @@ module Mutations
errors: errors_on_object(user_preferences)
}
end
+
+ private
+
+ def disabled_sort_value?(args)
+ return false unless [:escalation_status_asc, :escalation_status_desc].include?(args[:issues_sort])
+
+ Feature.disabled?(:incident_escalations, default_enabled: :yaml)
+ end
end
end
end
diff --git a/app/graphql/mutations/work_items/create.rb b/app/graphql/mutations/work_items/create.rb
index 48f0f470988..c29dbb899b5 100644
--- a/app/graphql/mutations/work_items/create.rb
+++ b/app/graphql/mutations/work_items/create.rb
@@ -33,7 +33,7 @@ module Mutations
def resolve(project_path:, **attributes)
project = authorized_find!(project_path)
- unless Feature.enabled?(:work_items, project, default_enabled: :yaml)
+ unless project.work_items_feature_flag_enabled?
return { errors: ['`work_items` feature flag disabled for this project'] }
end
diff --git a/app/graphql/mutations/work_items/create_from_task.rb b/app/graphql/mutations/work_items/create_from_task.rb
index 16d1e646167..278c1bc65a9 100644
--- a/app/graphql/mutations/work_items/create_from_task.rb
+++ b/app/graphql/mutations/work_items/create_from_task.rb
@@ -31,7 +31,7 @@ module Mutations
def resolve(id:, work_item_data:)
work_item = authorized_find!(id: id)
- unless Feature.enabled?(:work_items, work_item.project, default_enabled: :yaml)
+ unless work_item.project.work_items_feature_flag_enabled?
return { errors: ['`work_items` feature flag disabled for this project'] }
end
diff --git a/app/graphql/mutations/work_items/delete.rb b/app/graphql/mutations/work_items/delete.rb
index f32354878ec..3d72ebbd95d 100644
--- a/app/graphql/mutations/work_items/delete.rb
+++ b/app/graphql/mutations/work_items/delete.rb
@@ -20,7 +20,7 @@ module Mutations
def resolve(id:)
work_item = authorized_find!(id: id)
- unless Feature.enabled?(:work_items, work_item.project, default_enabled: :yaml)
+ unless work_item.project.work_items_feature_flag_enabled?
return { errors: ['`work_items` feature flag disabled for this project'] }
end
diff --git a/app/graphql/mutations/work_items/update.rb b/app/graphql/mutations/work_items/update.rb
index 2700cbdb709..091237d6fa0 100644
--- a/app/graphql/mutations/work_items/update.rb
+++ b/app/graphql/mutations/work_items/update.rb
@@ -28,7 +28,7 @@ module Mutations
def resolve(id:, **attributes)
work_item = authorized_find!(id: id)
- unless Feature.enabled?(:work_items, work_item.project, default_enabled: :yaml)
+ unless work_item.project.work_items_feature_flag_enabled?
return { errors: ['`work_items` feature flag disabled for this project'] }
end
diff --git a/app/graphql/queries/container_registry/get_container_repositories.query.graphql b/app/graphql/queries/container_registry/get_container_repositories.query.graphql
index 40e2934a038..264878ccaa2 100644
--- a/app/graphql/queries/container_registry/get_container_repositories.query.graphql
+++ b/app/graphql/queries/container_registry/get_container_repositories.query.graphql
@@ -23,6 +23,7 @@ query getProjectContainerRepositories(
__typename
nodes {
id
+ migrationState
name
path
status
@@ -57,6 +58,7 @@ query getProjectContainerRepositories(
__typename
nodes {
id
+ migrationState
name
path
status
diff --git a/app/graphql/queries/releases/all_releases.query.graphql b/app/graphql/queries/releases/all_releases.query.graphql
deleted file mode 100644
index 150f59832f3..00000000000
--- a/app/graphql/queries/releases/all_releases.query.graphql
+++ /dev/null
@@ -1,109 +0,0 @@
-# This query is identical to
-# `app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql`.
-# These two queries should be kept in sync.
-query allReleases(
- $fullPath: ID!
- $first: Int
- $last: Int
- $before: String
- $after: String
- $sort: ReleaseSort
-) {
- project(fullPath: $fullPath) {
- __typename
- id
- releases(first: $first, last: $last, before: $before, after: $after, sort: $sort) {
- __typename
- nodes {
- __typename
- name
- tagName
- tagPath
- descriptionHtml
- releasedAt
- createdAt
- upcomingRelease
- assets {
- __typename
- count
- sources {
- __typename
- nodes {
- __typename
- format
- url
- }
- }
- links {
- __typename
- nodes {
- __typename
- id
- name
- url
- directAssetUrl
- linkType
- external
- }
- }
- }
- evidences {
- __typename
- nodes {
- __typename
- id
- filepath
- collectedAt
- sha
- }
- }
- links {
- __typename
- editUrl
- selfUrl
- openedIssuesUrl
- closedIssuesUrl
- openedMergeRequestsUrl
- mergedMergeRequestsUrl
- closedMergeRequestsUrl
- }
- commit {
- __typename
- id
- sha
- webUrl
- title
- }
- author {
- __typename
- id
- webUrl
- avatarUrl
- username
- }
- milestones {
- __typename
- nodes {
- __typename
- id
- title
- description
- webPath
- stats {
- __typename
- totalIssuesCount
- closedIssuesCount
- }
- }
- }
- }
- pageInfo {
- __typename
- startCursor
- hasPreviousPage
- hasNextPage
- endCursor
- }
- }
- }
-}
diff --git a/app/graphql/resolvers/base_issues_resolver.rb b/app/graphql/resolvers/base_issues_resolver.rb
index 3e7509b4068..4cae7866a49 100644
--- a/app/graphql/resolvers/base_issues_resolver.rb
+++ b/app/graphql/resolvers/base_issues_resolver.rb
@@ -12,12 +12,14 @@ module Resolvers
required: false,
description: 'Current state of this issue.'
- type Types::IssueType.connection_type, null: true
+ # see app/graphql/types/issue_connection.rb
+ type 'Types::IssueConnection', null: true
NON_STABLE_CURSOR_SORTS = %i[priority_asc priority_desc
popularity_asc popularity_desc
label_priority_asc label_priority_desc
- milestone_due_asc milestone_due_desc].freeze
+ milestone_due_asc milestone_due_desc
+ escalation_status_asc escalation_status_desc].freeze
def continue_issue_resolve(parent, finder, **args)
issues = Gitlab::Graphql::Loaders::IssuableLoader.new(parent, finder).batching_find_all { |q| apply_lookahead(q) }
@@ -31,6 +33,13 @@ module Resolvers
end
end
+ def prepare_params(args, parent)
+ return unless [:escalation_status_asc, :escalation_status_desc].include?(args[:sort])
+ return if Feature.enabled?(:incident_escalations, parent, default_enabled: :yaml)
+
+ args[:sort] = :created_desc # default for sort argument
+ end
+
private
def unconditional_includes
diff --git a/app/graphql/resolvers/base_resolver.rb b/app/graphql/resolvers/base_resolver.rb
index 20ed089d159..dbded8f60a0 100644
--- a/app/graphql/resolvers/base_resolver.rb
+++ b/app/graphql/resolvers/base_resolver.rb
@@ -142,7 +142,7 @@ module Resolvers
def object
super.tap do |obj|
# If the field this resolver is used in is wrapped in a presenter, unwrap its subject
- break obj.subject if obj.is_a?(Gitlab::View::Presenter::Base)
+ break obj.__subject__ if obj.is_a?(Gitlab::View::Presenter::Base)
end
end
diff --git a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
index 38c79ff52ac..432d6f48607 100644
--- a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
+++ b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
@@ -84,6 +84,7 @@ module IssueResolverArguments
prepare_assignee_username_params(args)
prepare_release_tag_params(args)
+ prepare_params(args, parent) if defined?(prepare_params)
finder = IssuesFinder.new(current_user, args)
diff --git a/app/graphql/resolvers/groups_resolver.rb b/app/graphql/resolvers/groups_resolver.rb
index abd3bf9e6e0..6cfdba240f0 100644
--- a/app/graphql/resolvers/groups_resolver.rb
+++ b/app/graphql/resolvers/groups_resolver.rb
@@ -30,7 +30,7 @@ module Resolvers
GroupsFinder
.new(context[:current_user], args.merge(parent: parent))
.execute
- .reorder('name ASC')
+ .reorder(name: :asc)
end
# rubocop: enable CodeReuse/ActiveRecord
end
diff --git a/app/graphql/resolvers/work_item_resolver.rb b/app/graphql/resolvers/work_item_resolver.rb
index 7cf52339815..ad510849f31 100644
--- a/app/graphql/resolvers/work_item_resolver.rb
+++ b/app/graphql/resolvers/work_item_resolver.rb
@@ -12,7 +12,7 @@ module Resolvers
def resolve(id:)
work_item = authorized_find!(id: id)
- return unless Feature.enabled?(:work_items, work_item.project, default_enabled: :yaml)
+ return unless work_item.project.work_items_feature_flag_enabled?
work_item
end
diff --git a/app/graphql/resolvers/work_items/types_resolver.rb b/app/graphql/resolvers/work_items/types_resolver.rb
index 67a9d57d42f..5f9f8ab5572 100644
--- a/app/graphql/resolvers/work_items/types_resolver.rb
+++ b/app/graphql/resolvers/work_items/types_resolver.rb
@@ -11,7 +11,7 @@ module Resolvers
' Argument is experimental and can be removed in the future without notice.'
def resolve(taskable: nil)
- return unless Feature.enabled?(:work_items, object, default_enabled: :yaml)
+ return unless feature_flag_enabled_for_parent?(object)
# This will require a finder in the future when groups/projects get their work item types
# All groups/projects use the default types for now
@@ -20,6 +20,14 @@ module Resolvers
base_scope.order_by_name_asc
end
+
+ private
+
+ def feature_flag_enabled_for_parent?(parent)
+ return false unless parent.is_a?(::Project) || parent.is_a?(::Group)
+
+ parent.work_items_feature_flag_enabled?
+ end
end
end
end
diff --git a/app/graphql/types/base_object.rb b/app/graphql/types/base_object.rb
index b5797f07aa6..4ad88e43f52 100644
--- a/app/graphql/types/base_object.rb
+++ b/app/graphql/types/base_object.rb
@@ -9,6 +9,13 @@ module Types
field_class Types::BaseField
edge_type_class Types::BaseEdge
+ def self.authorize(*args)
+ raise 'Cannot redefine authorize' if @authorize_args && args.any?
+
+ @authorize_args = args.freeze if args.any?
+ @authorize_args || (superclass.respond_to?(:authorize) ? superclass.authorize : nil)
+ end
+
def self.accepts(*types)
@accepts ||= []
@accepts += types
diff --git a/app/graphql/types/ci/job_kind_enum.rb b/app/graphql/types/ci/job_kind_enum.rb
new file mode 100644
index 00000000000..dd1d80f806c
--- /dev/null
+++ b/app/graphql/types/ci/job_kind_enum.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Types
+ module Ci
+ class JobKindEnum < BaseEnum
+ graphql_name 'CiJobKind'
+
+ value 'BUILD', value: ::Ci::Build, description: 'Standard CI job.'
+ value 'BRIDGE', value: ::Ci::Bridge, description: 'Bridge CI job connecting a parent and child pipeline.'
+ end
+ end
+end
diff --git a/app/graphql/types/ci/job_type.rb b/app/graphql/types/ci/job_type.rb
index 83054553bd8..f25fc56a588 100644
--- a/app/graphql/types/ci/job_type.rb
+++ b/app/graphql/types/ci/job_type.rb
@@ -17,6 +17,8 @@ module Types
description: 'Duration of the job in seconds.'
field :id, ::Types::GlobalIDType[::CommitStatus].as('JobID'), null: true,
description: 'ID of the job.'
+ field :kind, type: ::Types::Ci::JobKindEnum, null: false,
+ description: 'Indicates the type of job.'
field :name, GraphQL::Types::String, null: true,
description: 'Name of the job.'
field :needs, BuildNeedType.connection_type, null: true,
@@ -87,6 +89,12 @@ module Types
field :triggered, GraphQL::Types::Boolean, null: true,
description: 'Whether the job was triggered.'
+ def kind
+ return ::Ci::Build unless [::Ci::Build, ::Ci::Bridge].include?(object.class)
+
+ object.class
+ end
+
def pipeline
Gitlab::Graphql::Loaders::BatchModelLoader.new(::Ci::Pipeline, object.pipeline_id).find
end
diff --git a/app/graphql/types/ci/runner_upgrade_status_type_enum.rb b/app/graphql/types/ci/runner_upgrade_status_type_enum.rb
new file mode 100644
index 00000000000..e3d77e485bc
--- /dev/null
+++ b/app/graphql/types/ci/runner_upgrade_status_type_enum.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Types
+ module Ci
+ class RunnerUpgradeStatusTypeEnum < BaseEnum
+ graphql_name 'CiRunnerUpgradeStatusType'
+
+ value 'NOT_AVAILABLE',
+ description: "An update is not available for the runner.",
+ value: :not_available
+
+ value 'AVAILABLE',
+ description: "An update is available for the runner.",
+ value: :available
+
+ value 'RECOMMENDED',
+ description: "An update is available and recommended for the runner.",
+ value: :recommended
+ end
+ end
+end
diff --git a/app/graphql/types/container_repository_type.rb b/app/graphql/types/container_repository_type.rb
index 3cd3730010b..dddf9a3ee97 100644
--- a/app/graphql/types/container_repository_type.rb
+++ b/app/graphql/types/container_repository_type.rb
@@ -14,6 +14,7 @@ module Types
field :expiration_policy_started_at, Types::TimeType, null: true, description: 'Timestamp when the cleanup done by the expiration policy was started on the container repository.'
field :id, GraphQL::Types::ID, null: false, description: 'ID of the container repository.'
field :location, GraphQL::Types::String, null: false, description: 'URL of the container repository.'
+ field :migration_state, GraphQL::Types::String, null: false, description: 'Migration state of the container repository.'
field :name, GraphQL::Types::String, null: false, description: 'Name of the container repository.'
field :path, GraphQL::Types::String, null: false, description: 'Path of the container repository.'
field :project, Types::ProjectType, null: false, description: 'Project of the container registry.'
diff --git a/app/graphql/types/dependency_proxy/manifest_type.rb b/app/graphql/types/dependency_proxy/manifest_type.rb
index ab22f540f48..f7e751e30d3 100644
--- a/app/graphql/types/dependency_proxy/manifest_type.rb
+++ b/app/graphql/types/dependency_proxy/manifest_type.rb
@@ -15,6 +15,10 @@ module Types
field :image_name, GraphQL::Types::String, null: false, description: 'Name of the image.'
field :size, GraphQL::Types::String, null: false, description: 'Size of the manifest file.'
field :updated_at, Types::TimeType, null: false, description: 'Date of most recent update.'
+ field :status,
+ Types::DependencyProxy::ManifestTypeEnum,
+ null: false,
+ description: "Status of the manifest (#{::DependencyProxy::Manifest.statuses.keys.join(', ')})"
def image_name
object.file_name.chomp(File.extname(object.file_name))
diff --git a/app/graphql/types/dependency_proxy/manifest_type_enum.rb b/app/graphql/types/dependency_proxy/manifest_type_enum.rb
new file mode 100644
index 00000000000..ddd1652eeea
--- /dev/null
+++ b/app/graphql/types/dependency_proxy/manifest_type_enum.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Types
+ class DependencyProxy::ManifestTypeEnum < BaseEnum
+ graphql_name 'DependencyProxyManifestStatus'
+
+ ::DependencyProxy::Manifest.statuses.keys.each do |status|
+ value status.upcase, description: "Dependency proxy manifest has a status of #{status}.", value: status
+ end
+ end
+end
diff --git a/app/graphql/types/issue_connection.rb b/app/graphql/types/issue_connection.rb
new file mode 100644
index 00000000000..8e5c88648ea
--- /dev/null
+++ b/app/graphql/types/issue_connection.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+# Normally this wouldn't be needed and we could use
+# type Types::IssueType.connection_type, null: true
+# in a resolver. However we can end up with cyclic definitions,
+# which can result in errors like
+# NameError: uninitialized constant Resolvers::GroupIssuesResolver
+#
+# Now we would use
+# type "Types::IssueConnection", null: true
+# which gives a delayed resolution, and the proper connection type.
+# See app/graphql/resolvers/base_issues_resolver.rb
+# Reference: https://github.com/rmosolgo/graphql-ruby/issues/3974#issuecomment-1084444214
+
+Types::IssueConnection = Types::IssueType.connection_type
diff --git a/app/graphql/types/issue_sort_enum.rb b/app/graphql/types/issue_sort_enum.rb
index f8825ff6c46..db51e491d4e 100644
--- a/app/graphql/types/issue_sort_enum.rb
+++ b/app/graphql/types/issue_sort_enum.rb
@@ -14,6 +14,8 @@ module Types
value 'TITLE_DESC', 'Title by descending order.', value: :title_desc
value 'POPULARITY_ASC', 'Number of upvotes (awarded "thumbs up" emoji) by ascending order.', value: :popularity_asc
value 'POPULARITY_DESC', 'Number of upvotes (awarded "thumbs up" emoji) by descending order.', value: :popularity_desc
+ value 'ESCALATION_STATUS_ASC', 'Status from triggered to resolved. Defaults to `CREATED_DESC` if `incident_escalations` feature flag is disabled.', value: :escalation_status_asc
+ value 'ESCALATION_STATUS_DESC', 'Status from resolved to triggered. Defaults to `CREATED_DESC` if `incident_escalations` feature flag is disabled.', value: :escalation_status_desc
end
end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index e6072820eea..2297912ac35 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -131,6 +131,7 @@ module Types
mount_mutation Mutations::WorkItems::Update
mount_mutation Mutations::SavedReplies::Create
mount_mutation Mutations::SavedReplies::Update
+ mount_mutation Mutations::SavedReplies::Destroy
end
end
diff --git a/app/graphql/types/repository/blob_type.rb b/app/graphql/types/repository/blob_type.rb
index 652e2882584..dd5c70887de 100644
--- a/app/graphql/types/repository/blob_type.rb
+++ b/app/graphql/types/repository/blob_type.rb
@@ -101,10 +101,6 @@ module Types
description: 'Web path to blob on an environment.',
calls_gitaly: true
- field :code_owners, [Types::UserType], null: true,
- description: 'List of code owners for the blob.',
- calls_gitaly: true
-
field :file_type, GraphQL::Types::String, null: true,
description: 'Expected format of the blob based on the extension.'
diff --git a/app/graphql/types/subscription_type.rb b/app/graphql/types/subscription_type.rb
index db6a247179d..de3f71090f6 100644
--- a/app/graphql/types/subscription_type.rb
+++ b/app/graphql/types/subscription_type.rb
@@ -12,5 +12,8 @@ module Types
field :issuable_title_updated, subscription: Subscriptions::IssuableUpdated, null: true,
description: 'Triggered when the title of an issuable is updated.'
+
+ field :issuable_labels_updated, subscription: Subscriptions::IssuableUpdated, null: true,
+ description: 'Triggered when the labels of an issuable are updated.'
end
end
diff --git a/app/graphql/types/user_interface.rb b/app/graphql/types/user_interface.rb
index 2c9592a7f5a..1c8a1352c72 100644
--- a/app/graphql/types/user_interface.rb
+++ b/app/graphql/types/user_interface.rb
@@ -118,7 +118,8 @@ module Types
field :saved_replies,
Types::SavedReplyType.connection_type,
null: true,
- description: 'Saved replies authored by the user.'
+ description: 'Saved replies authored by the user. ' \
+ 'Will not return saved replies if `saved_replies` feature flag is disabled.'
field :gitpod_enabled, GraphQL::Types::Boolean, null: true,
description: 'Whether Gitpod is enabled at the user level.'
diff --git a/app/helpers/admin/background_migrations_helper.rb b/app/helpers/admin/background_migrations_helper.rb
index 6516ea27b2c..79bb13810bb 100644
--- a/app/helpers/admin/background_migrations_helper.rb
+++ b/app/helpers/admin/background_migrations_helper.rb
@@ -4,13 +4,13 @@ module Admin
module BackgroundMigrationsHelper
def batched_migration_status_badge_variant(migration)
variants = {
- 'active' => :info,
- 'paused' => :warning,
- 'failed' => :danger,
- 'finished' => :success
+ active: :info,
+ paused: :warning,
+ failed: :danger,
+ finished: :success
}
- variants[migration.status]
+ variants[migration.status_name]
end
# The extra logic here is needed because total_tuple_count is just
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index a9c13b2fdeb..57e08eeb4f4 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -37,9 +37,15 @@ module ApplicationSettingsHelper
end
def storage_weights
- Gitlab.config.repositories.storages.keys.each_with_object(OpenStruct.new) do |storage, weights|
- weights[storage.to_sym] = @application_setting.repository_storages_weighted[storage] || 0
+ # Instead of using a `Struct` we could wrap this into an object.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/358419
+ weights = Struct.new(*Gitlab.config.repositories.storages.keys.map(&:to_sym))
+
+ values = Gitlab.config.repositories.storages.keys.map do |storage|
+ @application_setting.repository_storages_weighted[storage] || 0
end
+
+ weights.new(*values)
end
def all_protocols_enabled?
@@ -63,39 +69,31 @@ module ApplicationSettingsHelper
end
end
- # Return a group of checkboxes that use Bootstrap's button plugin for a
- # toggle button effect.
- def restricted_level_checkboxes(help_block_id, checkbox_name, options = {})
+ def restricted_level_checkboxes(form)
Gitlab::VisibilityLevel.values.map do |level|
checked = restricted_visibility_levels(true).include?(level)
- css_class = checked ? 'active' : ''
- tag_name = "application_setting_visibility_level_#{level}"
-
- label_tag(tag_name, class: css_class) do
- check_box_tag(checkbox_name, level, checked,
- autocomplete: 'off',
- 'aria-describedby' => help_block_id,
- 'class' => options[:class],
- id: tag_name) + visibility_level_icon(level) + visibility_level_label(level)
- end
+
+ form.gitlab_ui_checkbox_component(
+ :restricted_visibility_levels,
+ "#{visibility_level_icon(level)} #{visibility_level_label(level)}".html_safe,
+ checkbox_options: { checked: checked, multiple: true, autocomplete: 'off' },
+ checked_value: level,
+ unchecked_value: nil
+ )
end
end
- # Return a group of checkboxes that use Bootstrap's button plugin for a
- # toggle button effect.
- def import_sources_checkboxes(help_block_id, options = {})
+ def import_sources_checkboxes(form)
Gitlab::ImportSources.options.map do |name, source|
checked = @application_setting.import_sources.include?(source)
- css_class = checked ? 'active' : ''
- checkbox_name = 'application_setting[import_sources][]'
-
- label_tag(name, class: css_class) do
- check_box_tag(checkbox_name, source, checked,
- autocomplete: 'off',
- 'aria-describedby' => help_block_id,
- 'class' => options[:class],
- id: name.tr(' ', '_')) + name
- end
+
+ form.gitlab_ui_checkbox_component(
+ :import_sources,
+ name,
+ checkbox_options: { checked: checked, multiple: true, autocomplete: 'off' },
+ checked_value: source,
+ unchecked_value: nil
+ )
end
end
@@ -223,6 +221,7 @@ module ApplicationSettingsHelper
:default_project_visibility,
:default_projects_limit,
:default_snippet_visibility,
+ :delete_inactive_projects,
:disable_feed_token,
:disabled_oauth_sign_in_sources,
:domain_denylist,
@@ -266,7 +265,6 @@ module ApplicationSettingsHelper
:help_page_text,
:hide_third_party_offers,
:home_page_url,
- :housekeeping_bitmaps_enabled,
:housekeeping_enabled,
:housekeeping_full_repack_period,
:housekeeping_gc_period,
@@ -274,6 +272,9 @@ module ApplicationSettingsHelper
:html_emails_enabled,
:import_sources,
:in_product_marketing_emails_enabled,
+ :inactive_projects_delete_after_months,
+ :inactive_projects_min_size_mb,
+ :inactive_projects_send_warning_email_after_months,
:invisible_captcha_enabled,
:max_artifacts_size,
:max_attachment_size,
diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb
index ba6c0380edf..6ac4a12bcd5 100644
--- a/app/helpers/auth_helper.rb
+++ b/app/helpers/auth_helper.rb
@@ -2,6 +2,7 @@
module AuthHelper
PROVIDERS_WITH_ICONS = %w(
+ alicloud
atlassian_oauth2
auth0
authentiq
diff --git a/app/helpers/boards_helper.rb b/app/helpers/boards_helper.rb
index 28cd61e10d9..f849f36bf84 100644
--- a/app/helpers/boards_helper.rb
+++ b/app/helpers/boards_helper.rb
@@ -16,6 +16,7 @@ module BoardsHelper
bulk_update_path: @bulk_issues_path,
can_update: can_update?.to_s,
can_admin_list: can_admin_list?.to_s,
+ can_admin_board: can_admin_board?.to_s,
time_tracking_limit_to_hours: Gitlab::CurrentSettings.time_tracking_limit_to_hours.to_s,
parent: current_board_parent.model_name.param_key,
group_id: group_id,
@@ -23,7 +24,11 @@ module BoardsHelper
labels_fetch_path: labels_fetch_path,
labels_manage_path: labels_manage_path,
releases_fetch_path: releases_fetch_path,
- board_type: board.to_type
+ board_type: board.to_type,
+ has_scope: board.scoped?.to_s,
+ has_missing_boards: has_missing_boards?.to_s,
+ multiple_boards_available: multiple_boards_available?.to_s,
+ board_base_url: board_base_url
}
end
@@ -85,6 +90,11 @@ module BoardsHelper
current_board_parent.multiple_issue_boards_available?
end
+ # Boards are hidden when extra boards were created but the license does not allow multiple boards
+ def has_missing_boards?
+ !multiple_boards_available? && current_board_parent.boards.size > 1
+ end
+
def current_board_path(board)
@current_board_path ||= if board.group_board?
group_board_path(current_board_parent, board)
@@ -109,22 +119,12 @@ module BoardsHelper
can?(current_user, :admin_issue_board_list, current_board_parent)
end
- def can_admin_issue?
- can?(current_user, :admin_issue, current_board_parent)
+ def can_admin_board?
+ can?(current_user, :admin_issue_board, current_board_parent)
end
- def board_list_data
- include_descendant_groups = @group&.present?
-
- {
- toggle: "dropdown",
- list_labels_path: labels_filter_path_with_defaults(only_group_labels: true, include_ancestor_groups: true),
- labels: labels_filter_path_with_defaults(only_group_labels: true, include_descendant_groups: include_descendant_groups),
- labels_endpoint: @labels_endpoint,
- namespace_path: @namespace_path,
- project_path: @project&.path,
- group_path: @group&.path
- }
+ def can_admin_issue?
+ can?(current_user, :admin_issue, current_board_parent)
end
def serializer
diff --git a/app/helpers/broadcast_messages_helper.rb b/app/helpers/broadcast_messages_helper.rb
index dda834ee2c5..b138e9aeb0c 100644
--- a/app/helpers/broadcast_messages_helper.rb
+++ b/app/helpers/broadcast_messages_helper.rb
@@ -25,23 +25,7 @@ module BroadcastMessagesHelper
def broadcast_message(message, opts = {})
return unless message.present?
- render "shared/broadcast_message", { message: message, opts: opts }
- end
-
- def broadcast_message_style(broadcast_message)
- return '' if broadcast_message.notification?
-
- style = []
-
- if broadcast_message.color.present?
- style << "background-color: #{broadcast_message.color}"
- end
-
- if broadcast_message.font.present?
- style << "color: #{broadcast_message.font}"
- end
-
- style.join('; ')
+ render "shared/broadcast_message", { message: message, **opts }
end
def broadcast_message_status(broadcast_message)
@@ -70,6 +54,10 @@ module BroadcastMessagesHelper
BroadcastMessage.broadcast_types.keys.map { |w| [w.humanize, w] }
end
+ def broadcast_theme_options
+ BroadcastMessage.themes.keys
+ end
+
def target_access_level_options
BroadcastMessage::ALLOWED_TARGET_ACCESS_LEVELS.map do |access_level|
[Gitlab::Access.human_access(access_level), access_level]
diff --git a/app/helpers/button_helper.rb b/app/helpers/button_helper.rb
index 4ec95dc8bd7..c47aef24367 100644
--- a/app/helpers/button_helper.rb
+++ b/app/helpers/button_helper.rb
@@ -20,7 +20,7 @@ module ButtonHelper
#
# See http://clipboardjs.com/#usage
def clipboard_button(data = {})
- css_class = data[:class] || 'btn-clipboard btn-transparent'
+ css_class = data[:class] || 'btn-clipboard gl-button btn-default-tertiary btn-icon btn-sm'
title = data[:title] || _('Copy')
button_text = data[:button_text] || nil
hide_tooltip = data[:hide_tooltip] || false
diff --git a/app/helpers/ci/jobs_helper.rb b/app/helpers/ci/jobs_helper.rb
index 14e52b120f3..6d63151769f 100644
--- a/app/helpers/ci/jobs_helper.rb
+++ b/app/helpers/ci/jobs_helper.rb
@@ -6,8 +6,8 @@ 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/deploy_to_cluster.html', anchor: 'troubleshooting'),
+ "artifact_help_url" => help_page_path('user/gitlab_com/index.md', anchor: 'gitlab-cicd'),
+ "deployment_help_url" => help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'troubleshooting'),
"runner_settings_url" => project_runners_path(@build.project, anchor: 'js-runners-settings'),
"page_path" => project_job_path(@project, @build),
"build_status" => @build.status,
diff --git a/app/helpers/ci/pipeline_editor_helper.rb b/app/helpers/ci/pipeline_editor_helper.rb
index 3f0379b1baa..18557afcb99 100644
--- a/app/helpers/ci/pipeline_editor_helper.rb
+++ b/app/helpers/ci/pipeline_editor_helper.rb
@@ -21,8 +21,8 @@ module Ci
"default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => image_path('illustrations/empty-state/empty-dag-md.svg'),
"initial-branch-name" => initial_branch,
- "lint-help-page-path" => help_page_path('ci/lint', anchor: 'validate-basic-logic-and-syntax'),
- "lint-unavailable-help-page-path" => help_page_path('ci/pipeline_editor/index', anchor: 'configuration-validation-currently-not-available'),
+ "lint-help-page-path" => help_page_path('ci/lint', anchor: 'check-cicd-syntax'),
+ "lint-unavailable-help-page-path" => help_page_path('ci/pipeline_editor/index', anchor: 'configuration-validation-currently-not-available-message'),
"needs-help-page-path" => help_page_path('ci/yaml/index', anchor: 'needs'),
"new-merge-request-path" => namespace_project_new_merge_request_path,
"pipeline_etag" => latest_commit ? graphql_etag_pipeline_sha_path(commit_sha) : '',
diff --git a/app/helpers/ci/pipelines_helper.rb b/app/helpers/ci/pipelines_helper.rb
index 8d2f83409be..70d2a4fafd1 100644
--- a/app/helpers/ci/pipelines_helper.rb
+++ b/app/helpers/ci/pipelines_helper.rb
@@ -106,6 +106,12 @@ module Ci
e.candidate { data[:any_runners_available] = project.active_runners.exists?.to_s }
end
+ experiment(:ios_specific_templates, actor: current_user, project: project, sticky_to: project) do |e|
+ e.candidate do
+ data[:registration_token] = project.runners_token if can?(current_user, :register_project_runners, project)
+ end
+ end
+
data
end
diff --git a/app/helpers/ci/runners_helper.rb b/app/helpers/ci/runners_helper.rb
index f84b42209da..0e8b6fa6d25 100644
--- a/app/helpers/ci/runners_helper.rb
+++ b/app/helpers/ci/runners_helper.rb
@@ -6,7 +6,7 @@ module Ci
def runner_status_icon(runner, size: 16, icon_class: '')
status = runner.status
- active = runner.active
+ contacted_at = runner.contacted_at
title = ''
icon = 'warning-solid'
@@ -14,22 +14,20 @@ module Ci
case status
when :online
- if active
- title = s_("Runners|Runner is online, last contact was %{runner_contact} ago") % { runner_contact: time_ago_in_words(runner.contacted_at) }
- icon = 'status-active'
- span_class = 'gl-text-green-500'
- else
- title = s_("Runners|Runner is paused, last contact was %{runner_contact} ago") % { runner_contact: time_ago_in_words(runner.contacted_at) }
- icon = 'status-paused'
- span_class = 'gl-text-gray-600'
- end
+ title = s_("Runners|Runner is online; last contact was %{runner_contact} ago") % { runner_contact: time_ago_in_words(contacted_at) }
+ icon = 'status-active'
+ span_class = 'gl-text-green-500'
when :not_connected, :never_contacted
- title = s_("Runners|New runner, has not contacted yet")
+ title = s_("Runners|Runner has never contacted this instance")
icon = 'warning-solid'
when :offline
- title = s_("Runners|Runner is offline, last contact was %{runner_contact} ago") % { runner_contact: time_ago_in_words(runner.contacted_at) }
+ title = s_("Runners|Runner is offline; last contact was %{runner_contact} ago") % { runner_contact: time_ago_in_words(contacted_at) }
icon = 'status-failed'
span_class = 'gl-text-red-500'
+ when :stale
+ # runner may have contacted (or not) and be stale: consider both cases.
+ title = contacted_at ? s_("Runners|Runner is stale; last contact was %{runner_contact} ago") % { runner_contact: time_ago_in_words(contacted_at) } : s_("Runners|Runner is stale; it has never contacted this instance")
+ icon = 'warning-solid'
end
content_tag(:span, class: span_class, title: title, data: { toggle: 'tooltip', container: 'body', testid: 'runner_status_icon', qa_selector: "runner_status_#{status}_content" }) do
@@ -65,7 +63,9 @@ module Ci
# Runner install help page is external, located at
# https://gitlab.com/gitlab-org/gitlab-runner
runner_install_help_page: 'https://docs.gitlab.com/runner/install/',
- registration_token: Gitlab::CurrentSettings.runners_registration_token
+ registration_token: Gitlab::CurrentSettings.runners_registration_token,
+ online_contact_timeout_secs: ::Ci::Runner::ONLINE_CONTACT_TIMEOUT.to_i,
+ stale_timeout_secs: ::Ci::Runner::STALE_TIMEOUT.to_i
}
end
@@ -85,7 +85,9 @@ module Ci
registration_token: group.runners_token,
group_id: group.id,
group_full_path: group.full_path,
- runner_install_help_page: 'https://docs.gitlab.com/runner/install/'
+ runner_install_help_page: 'https://docs.gitlab.com/runner/install/',
+ online_contact_timeout_secs: ::Ci::Runner::ONLINE_CONTACT_TIMEOUT.to_i,
+ stale_timeout_secs: ::Ci::Runner::STALE_TIMEOUT.to_i
}
end
diff --git a/app/helpers/clusters_helper.rb b/app/helpers/clusters_helper.rb
index 959dac1254e..fe057fb3412 100644
--- a/app/helpers/clusters_helper.rb
+++ b/app/helpers/clusters_helper.rb
@@ -19,6 +19,7 @@ module ClustersHelper
empty_state_help_text: clusterable.empty_state_help_text,
new_cluster_path: clusterable.new_path,
add_cluster_path: clusterable.connect_path,
+ new_cluster_docs_path: clusterable.new_cluster_docs_path,
can_add_cluster: clusterable.can_add_cluster?.to_s,
can_admin_cluster: clusterable.can_admin_cluster?.to_s,
display_cluster_agents: display_cluster_agents?(clusterable).to_s,
diff --git a/app/helpers/colors_helper.rb b/app/helpers/colors_helper.rb
new file mode 100644
index 00000000000..bc72122220a
--- /dev/null
+++ b/app/helpers/colors_helper.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module ColorsHelper
+ HEX_COLOR_PATTERN = /\A\#(?:[0-9A-Fa-f]{3}){1,2}\Z/.freeze
+
+ def hex_color_to_rgb_array(hex_color)
+ raise ArgumentError, "invalid hex color `#{hex_color}`" unless hex_color =~ HEX_COLOR_PATTERN
+
+ hex_color.length == 7 ? hex_color[1, 7].scan(/.{2}/).map(&:hex) : hex_color[1, 4].scan(/./).map { |v| (v * 2).hex }
+ end
+
+ def rgb_array_to_hex_color(rgb_array)
+ raise ArgumentError, "invalid RGB array `#{rgb_array}`" unless rgb_array_valid?(rgb_array)
+
+ "##{rgb_array.map{ "%02x" % _1 }.join}"
+ end
+
+ private
+
+ def rgb_array_valid?(rgb_array)
+ rgb_array.is_a?(Array) && rgb_array.length == 3 && rgb_array.all?{ _1 >= 0 && _1 <= 255 }
+ end
+end
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index c78e906e052..3c3179f6fbe 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -135,9 +135,9 @@ module CommitsHelper
%w(btn gpg-status-box) + Array(additional_classes)
end
- def conditionally_paginate_diff_files(diffs, paginate:, per:)
+ def conditionally_paginate_diff_files(diffs, paginate:, page:, per:)
if paginate
- Kaminari.paginate_array(diffs.diff_files.to_a).page(params[:page]).per(per)
+ Kaminari.paginate_array(diffs.diff_files.to_a).page(page).per(per)
else
diffs.diff_files
end
diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb
index 100d5c0281c..522593dd487 100644
--- a/app/helpers/diff_helper.rb
+++ b/app/helpers/diff_helper.rb
@@ -60,6 +60,18 @@ module DiffHelper
html.join.html_safe
end
+ def diff_nomappinginraw_line(line, first_line_num_class, second_line_num_class, content_line_class)
+ css_class = ''
+ css_class = 'old' if line.type == 'old-nomappinginraw'
+ css_class = 'new' if line.type == 'new-nomappinginraw'
+
+ html = [content_tag(:td, '', class: [*first_line_num_class, css_class])]
+ html << content_tag(:td, '', class: [*second_line_num_class, css_class]) if second_line_num_class
+ html << content_tag(:td, diff_line_content(line.rich_text), class: [*content_line_class, 'nomappinginraw', css_class])
+
+ html.join.html_safe
+ end
+
def diff_line_content(line)
if line.blank?
"&nbsp;".html_safe
@@ -74,7 +86,7 @@ module DiffHelper
end
def diff_link_number(line_type, match, text)
- line_type == match || text == 0 ? " " : text
+ line_type == match ? " " : text
end
def parallel_diff_discussions(left, right, diff_file)
@@ -167,26 +179,20 @@ module DiffHelper
}
end
- def editable_diff?(diff_file)
- !diff_file.deleted_file? && @merge_request && @merge_request.source_project
- end
-
- def diff_file_changed_icon(diff_file)
- if diff_file.deleted_file?
- "file-deletion"
- elsif diff_file.new_file?
- "file-addition"
- else
- "file-modified"
- end
+ def diff_file_stats_data(diff_file)
+ old_blob = diff_file.old_blob
+ new_blob = diff_file.new_blob
+ {
+ old_size: old_blob&.size,
+ new_size: new_blob&.size,
+ added_lines: diff_file.added_lines,
+ removed_lines: diff_file.removed_lines,
+ viewer_name: diff_file.viewer.partial_name
+ }
end
- def diff_file_changed_icon_color(diff_file)
- if diff_file.deleted_file?
- "danger"
- elsif diff_file.new_file?
- "success"
- end
+ def editable_diff?(diff_file)
+ !diff_file.deleted_file? && @merge_request && @merge_request.source_project
end
def render_overflow_warning?(diffs_collection)
@@ -248,23 +254,6 @@ module DiffHelper
toggle_whitespace_link(url, options)
end
- def diff_files_data(diff_files)
- diffs_map = diff_files.map do |f|
- {
- href: "##{hexdigest(f.file_path)}",
- title: f.new_path,
- name: f.file_path,
- path: diff_file_path_text(f),
- icon: diff_file_changed_icon(f),
- iconColor: "#{diff_file_changed_icon_color(f)}",
- added: f.added_lines,
- removed: f.removed_lines
- }
- end
-
- diffs_map.to_json
- end
-
def hide_whitespace?
params[:w] == '1'
end
@@ -278,14 +267,6 @@ module DiffHelper
link_to "#{hide_whitespace? ? 'Show' : 'Hide'} whitespace changes", url, class: options[:class]
end
- def diff_file_path_text(diff_file, max: 60)
- path = diff_file.new_path
-
- return path unless path.size > max && max > 3
-
- "...#{path[-(max - 3)..]}"
- end
-
def code_navigation_path(diffs)
Gitlab::CodeNavigationPath.new(merge_request.project, merge_request.diff_head_sha)
end
diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb
index b804efb9561..79b04ae0e2b 100644
--- a/app/helpers/emails_helper.rb
+++ b/app/helpers/emails_helper.rb
@@ -206,6 +206,23 @@ module EmailsHelper
end
end
+ def new_email_address_added_text(email)
+ _('A new email address has been added to your GitLab account: %{email}') % { email: email }
+ end
+
+ def remove_email_address_text(format: nil)
+ url = profile_emails_url
+
+ case format
+ when :html
+ settings_link_to = generate_link(_('email address settings'), url).html_safe
+ _("If you want to remove this email address, visit the %{settings_link_to} page.").html_safe % { settings_link_to: settings_link_to }
+ else
+ _('If you want to remove this email address, visit %{profile_link}') %
+ { profile_link: url }
+ end
+ end
+
def admin_changed_password_text(format: nil)
url = Gitlab.config.gitlab.url
diff --git a/app/helpers/environment_helper.rb b/app/helpers/environment_helper.rb
index 1f0bf46097d..b6997b6fb70 100644
--- a/app/helpers/environment_helper.rb
+++ b/app/helpers/environment_helper.rb
@@ -77,7 +77,7 @@ module EnvironmentHelper
can_destroy_environment: can_destroy_environment?(environment),
can_stop_environment: can?(current_user, :stop_environment, environment),
can_admin_environment: can?(current_user, :admin_environment, project),
- environment_metrics_path: environment_metrics_path(environment),
+ environment_metrics_path: project_metrics_dashboard_path(project, environment: environment),
environments_fetch_path: project_environments_path(project, format: :json),
environment_edit_path: edit_project_environment_path(project, environment),
environment_stop_path: stop_project_environment_path(project, environment),
diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb
index 1894aba7dc0..3b60bda8605 100644
--- a/app/helpers/environments_helper.rb
+++ b/app/helpers/environments_helper.rb
@@ -92,7 +92,7 @@ module EnvironmentsHelper
return path if request.path.include?(path)
end
- environment_metrics_path(environment)
+ project_metrics_dashboard_path(project, environment: environment)
end
def project_and_environment_metrics_data(project, environment)
diff --git a/app/helpers/external_link_helper.rb b/app/helpers/external_link_helper.rb
index c951d0daf96..53dacfe0566 100644
--- a/app/helpers/external_link_helper.rb
+++ b/app/helpers/external_link_helper.rb
@@ -5,7 +5,7 @@ module ExternalLinkHelper
def external_link(body, url, options = {})
link = link_to url, { target: '_blank', rel: 'noopener noreferrer' }.merge(options) do
- "#{body}#{sprite_icon('external-link', css_class: 'gl-ml-1')}".html_safe
+ "#{body}#{sprite_icon('external-link', css_class: 'gl-ml-2')}".html_safe
end
sanitize(link, tags: %w(a svg use), attributes: %w(target rel data-testid class href).concat(options.stringify_keys.keys))
end
diff --git a/app/helpers/groups/group_members_helper.rb b/app/helpers/groups/group_members_helper.rb
index a719d80a1a1..80ab303357b 100644
--- a/app/helpers/groups/group_members_helper.rb
+++ b/app/helpers/groups/group_members_helper.rb
@@ -9,10 +9,10 @@ module Groups::GroupMembersHelper
{ multiple: true, class: 'input-clamp qa-member-select-field ', scope: :all, email_user: true }
end
- def group_members_app_data(group, members:, invited:, access_requests:)
+ def group_members_app_data(group, members:, invited:, access_requests:, include_relations:, search:)
{
user: group_members_list_data(group, members, { param_name: :page, params: { invited_members_page: nil, search_invited: nil } }),
- group: group_group_links_list_data(group),
+ group: group_group_links_list_data(group, include_relations, search),
invite: group_members_list_data(group, invited.nil? ? [] : invited, { param_name: :invited_members_page, params: { page: nil } }),
access_request: group_members_list_data(group, access_requests.nil? ? [] : access_requests),
source_id: group.id,
@@ -26,8 +26,8 @@ module Groups::GroupMembersHelper
MemberSerializer.new.represent(members, { current_user: current_user, group: group, source: group })
end
- def group_group_links_serialized(group_links)
- GroupLink::GroupGroupLinkSerializer.new.represent(group_links, { current_user: current_user })
+ def group_group_links_serialized(group, group_links)
+ GroupLink::GroupGroupLinkSerializer.new.represent(group_links, { current_user: current_user, source: group })
end
# Overridden in `ee/app/helpers/ee/groups/group_members_helper.rb`
@@ -39,11 +39,29 @@ module Groups::GroupMembersHelper
}
end
- def group_group_links_list_data(group)
- group_links = group.shared_with_group_links
+ def group_group_links(group, include_relations)
+ group_links = case include_relations
+ when [:direct]
+ group.shared_with_group_links
+ when [:inherited]
+ group.shared_with_group_links.of_ancestors
+ else
+ group.shared_with_group_links.of_ancestors_and_self
+ end
+
+ group_links.distinct_on_shared_with_group_id_with_group_access
+ end
+
+ def group_group_links_list_data(group, include_relations, search)
+ if ::Feature.enabled?(:group_member_inherited_group, group, default_enabled: :yaml)
+ group_links = group_group_links(group, include_relations)
+ group_links = group_links.search(search) if search
+ else
+ group_links = group.shared_with_group_links
+ end
{
- members: group_group_links_serialized(group_links),
+ members: group_group_links_serialized(group, group_links),
pagination: members_pagination_data(group_links),
member_path: group_group_link_path(group, ':id')
}
diff --git a/app/helpers/ide_helper.rb b/app/helpers/ide_helper.rb
index bd1571f3956..4b463b9971d 100644
--- a/app/helpers/ide_helper.rb
+++ b/app/helpers/ide_helper.rb
@@ -20,7 +20,11 @@ module IdeHelper
'fork-info' => @fork_info&.to_json,
'project' => convert_to_project_entity_json(@project),
'enable-environments-guidance' => enable_environments_guidance?.to_s,
- 'preview-markdown-path' => @project && preview_markdown_path(@project)
+ 'preview-markdown-path' => @project && preview_markdown_path(@project),
+ 'web-terminal-svg-path' => image_path('illustrations/web-ide_promotion.svg'),
+ 'web-terminal-help-path' => help_page_path('user/project/web_ide/index.md', anchor: 'interactive-web-terminals-for-the-web-ide'),
+ 'web-terminal-config-help-path' => help_page_path('user/project/web_ide/index.md', anchor: 'web-ide-configuration-file'),
+ 'web-terminal-runners-help-path' => help_page_path('user/project/web_ide/index.md', anchor: 'runner-configuration')
}
end
@@ -44,5 +48,3 @@ module IdeHelper
current_user.dismissed_callout?(feature_name: 'web_ide_ci_environments_guidance')
end
end
-
-::IdeHelper.prepend_mod_with('IdeHelper')
diff --git a/app/helpers/invite_members_helper.rb b/app/helpers/invite_members_helper.rb
index a2dde29e25d..a682d2712be 100644
--- a/app/helpers/invite_members_helper.rb
+++ b/app/helpers/invite_members_helper.rb
@@ -36,6 +36,7 @@ module InviteMembersHelper
def common_invite_group_modal_data(source, member_class, is_project)
{
id: source.id,
+ root_id: source.root_ancestor&.id,
name: source.name,
default_access_level: Gitlab::Access::GUEST,
invalid_groups: source.related_group_ids,
@@ -45,9 +46,11 @@ module InviteMembersHelper
}
end
+ # Overridden in EE
def common_invite_modal_dataset(source)
dataset = {
id: source.id,
+ root_id: source.root_ancestor&.id,
name: source.name,
default_access_level: Gitlab::Access::GUEST
}
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index ec1f8ca5f00..98eca3785e7 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -233,7 +233,7 @@ module IssuablesHelper
canUpdate: can?(current_user, :"update_#{issuable.to_ability_name}", issuable),
canDestroy: can?(current_user, :"destroy_#{issuable.to_ability_name}", issuable),
issuableRef: issuable.to_reference,
- markdownPreviewPath: preview_markdown_path(parent),
+ markdownPreviewPath: preview_markdown_path(parent, target_type: issuable.model_name, target_id: issuable.iid),
markdownDocsPath: help_page_path('user/markdown'),
lockVersion: issuable.lock_version,
issuableTemplateNamesPath: template_names_path(parent, issuable),
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index 298162fe970..c8c9ea32184 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -91,7 +91,7 @@ module IssuesHelper
if !can?(current_user, :award_emoji, awardable)
"disabled"
elsif current_user && awards.find { |a| a.user_id == current_user.id }
- "active"
+ "selected"
else
""
end
@@ -239,15 +239,19 @@ module IssuesHelper
)
end
+ def issues_form_data(project)
+ {
+ new_issue_path: new_project_issue_path(project)
+ }
+ end
+
# Overridden in EE
def scoped_labels_available?(parent)
false
end
def award_emoji_issue_api_path(issue)
- if Feature.enabled?(:improved_emoji_picker, issue.project, default_enabled: :yaml)
- api_v4_projects_issues_award_emoji_path(id: issue.project.id, issue_iid: issue.iid)
- end
+ api_v4_projects_issues_award_emoji_path(id: issue.project.id, issue_iid: issue.iid)
end
end
diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb
index 84a3802c72c..2d93813d5ee 100644
--- a/app/helpers/merge_requests_helper.rb
+++ b/app/helpers/merge_requests_helper.rb
@@ -185,7 +185,7 @@ module MergeRequestsHelper
endpoint_metadata: @endpoint_metadata_url,
endpoint_batch: diffs_batch_project_json_merge_request_path(project, merge_request, 'json', params),
endpoint_coverage: @coverage_path,
- help_page_path: help_page_path('user/discussions/index.md', anchor: 'suggest-changes'),
+ help_page_path: help_page_path('user/project/merge_requests/reviews/suggestions.md'),
current_user_data: @current_user_data,
update_current_user_path: @update_current_user_path,
project_path: project_path(merge_request.project),
@@ -203,9 +203,7 @@ module MergeRequestsHelper
end
def award_emoji_merge_request_api_path(merge_request)
- if Feature.enabled?(:improved_emoji_picker, merge_request.project, default_enabled: :yaml)
- api_v4_projects_merge_requests_award_emoji_path(id: merge_request.project.id, merge_request_iid: merge_request.iid)
- end
+ api_v4_projects_merge_requests_award_emoji_path(id: merge_request.project.id, merge_request_iid: merge_request.iid)
end
private
diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb
index 64b58d28fc9..cf386ee398a 100644
--- a/app/helpers/namespaces_helper.rb
+++ b/app/helpers/namespaces_helper.rb
@@ -88,6 +88,15 @@ module NamespacesHelper
}.to_json
end
+ def pipeline_usage_quota_app_data(namespace)
+ {
+ namespace_actual_plan_name: namespace.actual_plan_name,
+ namespace_path: namespace.full_path,
+ namespace_id: namespace.id,
+ page_size: page_size
+ }
+ end
+
private
# Many importers create a temporary Group, so use the real
diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb
index 01075862618..20d40626449 100644
--- a/app/helpers/packages_helper.rb
+++ b/app/helpers/packages_helper.rb
@@ -46,7 +46,7 @@ module PackagesHelper
::Gitlab::Tracking.event(category, event_name.to_s, **args)
end
- def show_cleanup_policy_on_alert(project)
+ def show_cleanup_policy_link(project)
Gitlab.com? &&
Gitlab.config.registry.enabled &&
project.feature_available?(:container_registry, current_user) &&
diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb
index 6a8c39b5b15..39a57e786ed 100644
--- a/app/helpers/preferences_helper.rb
+++ b/app/helpers/preferences_helper.rb
@@ -82,6 +82,22 @@ module PreferencesHelper
Gitlab::TabWidth.css_class_for_user(current_user)
end
+ def user_diffs_colors
+ {
+ deletion: current_user&.diffs_deletion_color.presence,
+ addition: current_user&.diffs_addition_color.presence
+ }.compact
+ end
+
+ def custom_diff_color_classes
+ return if request.path == profile_preferences_path
+
+ classes = []
+ classes << 'diff-custom-addition-color' if current_user&.diffs_addition_color.presence
+ classes << 'diff-custom-deletion-color' if current_user&.diffs_deletion_color.presence
+ classes
+ end
+
def language_choices
options_for_select(
selectable_locales_with_translation_level.sort,
diff --git a/app/helpers/projects/alert_management_helper.rb b/app/helpers/projects/alert_management_helper.rb
index e03f2ae78bf..f21538fd3fb 100644
--- a/app/helpers/projects/alert_management_helper.rb
+++ b/app/helpers/projects/alert_management_helper.rb
@@ -15,13 +15,14 @@ module Projects::AlertManagementHelper
}
end
- def alert_management_detail_data(project, alert_id)
+ def alert_management_detail_data(current_user, project, alert_id)
{
'alert-id' => alert_id,
'project-path' => project.full_path,
'project-id' => project.id,
'project-issues-path' => project_issues_path(project),
- 'page' => 'OPERATIONS'
+ 'page' => 'OPERATIONS',
+ 'can-update' => can?(current_user, :update_alert_management_alert, project).to_s
}
end
diff --git a/app/helpers/projects/pipeline_helper.rb b/app/helpers/projects/pipeline_helper.rb
new file mode 100644
index 00000000000..185632a49b5
--- /dev/null
+++ b/app/helpers/projects/pipeline_helper.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Projects
+ module PipelineHelper
+ def js_pipeline_tabs_data(project, pipeline)
+ {
+ can_generate_codequality_reports: pipeline.can_generate_codequality_reports?.to_json,
+ graphql_resource_etag: graphql_etag_pipeline_path(pipeline),
+ metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: project.namespace, project_id: project, format: :json),
+ pipeline_project_path: project.full_path
+ }
+ end
+ end
+end
+
+Projects::PipelineHelper.prepend_mod
diff --git a/app/helpers/projects/project_members_helper.rb b/app/helpers/projects/project_members_helper.rb
index 514737b1417..980c8ca6b80 100644
--- a/app/helpers/projects/project_members_helper.rb
+++ b/app/helpers/projects/project_members_helper.rb
@@ -18,8 +18,8 @@ module Projects::ProjectMembersHelper
MemberSerializer.new.represent(members, { current_user: current_user, group: project.group, source: project })
end
- def project_group_links_serialized(group_links)
- GroupLink::ProjectGroupLinkSerializer.new.represent(group_links, { current_user: current_user })
+ def project_group_links_serialized(project, group_links)
+ GroupLink::ProjectGroupLinkSerializer.new.represent(group_links, { current_user: current_user, source: project })
end
def project_members_list_data(project, members, pagination = {})
@@ -32,7 +32,7 @@ module Projects::ProjectMembersHelper
def project_group_links_list_data(project, group_links)
{
- members: project_group_links_serialized(group_links),
+ members: project_group_links_serialized(project, group_links),
pagination: members_pagination_data(group_links),
member_path: project_group_link_path(project, ':id')
}
diff --git a/app/helpers/projects/security/configuration_helper.rb b/app/helpers/projects/security/configuration_helper.rb
index 8281b1f8522..efc77550c90 100644
--- a/app/helpers/projects/security/configuration_helper.rb
+++ b/app/helpers/projects/security/configuration_helper.rb
@@ -6,6 +6,10 @@ module Projects
def security_upgrade_path
"https://#{ApplicationHelper.promo_host}/pricing/"
end
+
+ def vulnerability_training_docs_path
+ help_page_path('user/application_security/vulnerabilities/index', anchor: 'enable-security-training-for-vulnerabilities')
+ end
end
end
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 8a75f545a32..21c7a54670c 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -420,6 +420,14 @@ module ProjectsHelper
project.path_with_namespace
end
+ def able_to_see_issues?(project, user)
+ project.issues_enabled? && can?(user, :read_issue, project)
+ end
+
+ def able_to_see_merge_requests?(project, user)
+ project.merge_requests_enabled? && can?(user, :read_merge_request, project)
+ end
+
def fork_button_disabled_tooltip(project)
return unless current_user
@@ -627,7 +635,9 @@ module ProjectsHelper
end
def can_show_last_commit_in_list?(project)
- can?(current_user, :read_cross_project) && project.commit
+ can?(current_user, :read_cross_project) &&
+ can?(current_user, :read_commit_status, project) &&
+ project.commit
end
def pages_https_only_disabled?
@@ -640,14 +650,6 @@ module ProjectsHelper
"You must enable HTTPS for all your domains first"
end
- def pages_https_only_label_class
- if pages_https_only_disabled?
- "list-label disabled"
- else
- "list-label"
- end
- end
-
def filter_starrer_path(options = {})
options = params.slice(:sort).merge(options).permit!
"#{request.path}?#{options.to_param}"
diff --git a/app/helpers/routing/projects_helper.rb b/app/helpers/routing/projects_helper.rb
index fb000b29739..859070d59ec 100644
--- a/app/helpers/routing/projects_helper.rb
+++ b/app/helpers/routing/projects_helper.rb
@@ -18,10 +18,6 @@ module Routing
project_environment_path(environment.project, environment, *args)
end
- def environment_metrics_path(environment, *args)
- metrics_project_environment_path(environment.project, environment, *args)
- end
-
def environment_delete_path(environment, *args)
expose_path(api_v4_projects_environments_path(id: environment.project.id, environment_id: environment.id))
end
diff --git a/app/helpers/routing/pseudonymization_helper.rb b/app/helpers/routing/pseudonymization_helper.rb
index f1fafd563ce..3e5d4ee21c0 100644
--- a/app/helpers/routing/pseudonymization_helper.rb
+++ b/app/helpers/routing/pseudonymization_helper.rb
@@ -5,7 +5,11 @@ module Routing
class MaskHelper
QUERY_PARAMS_TO_NOT_MASK = %w[
scope
+ severity
+ sortBy
+ sortDesc
state
+ tab
].freeze
def initialize(request_object, group, project)
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index 5b596c328d1..f8bfc74b344 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -260,6 +260,7 @@ module SearchHelper
{
category: "Groups",
id: group.id,
+ value: "#{search_result_sanitize(group.name)}",
label: "#{search_result_sanitize(group.full_name)}",
url: group_path(group),
avatar_url: group.avatar_url || ''
@@ -311,7 +312,9 @@ module SearchHelper
id: mr.id,
label: search_result_sanitize(mr.title),
url: merge_request_path(mr),
- avatar_url: mr.project.avatar_url || ''
+ avatar_url: mr.project.avatar_url || '',
+ project_id: mr.target_project_id,
+ project_name: mr.target_project.name
}
end
end
@@ -325,7 +328,9 @@ module SearchHelper
id: i.id,
label: search_result_sanitize(i.title),
url: issue_path(i),
- avatar_url: i.project.avatar_url || ''
+ avatar_url: i.project.avatar_url || '',
+ project_id: i.project_id,
+ project_name: i.project.name
}
end
end
@@ -436,11 +441,11 @@ module SearchHelper
end
def show_user_search_tab?
- if @project
- project_search_tabs?(:members)
- else
- can?(current_user, :read_users_list)
- end
+ return project_search_tabs?(:members) if @project
+ return false unless can?(current_user, :read_users_list)
+ return true if @group
+
+ Feature.enabled?(:global_search_users_tab, current_user, type: :ops, default_enabled: :yaml)
end
def issuable_state_to_badge_class(issuable)
diff --git a/app/helpers/snippets_helper.rb b/app/helpers/snippets_helper.rb
index ca90d1e13c1..78b204fefe9 100644
--- a/app/helpers/snippets_helper.rb
+++ b/app/helpers/snippets_helper.rb
@@ -77,8 +77,6 @@ module SnippetsHelper
end
def project_snippets_award_api_path(snippet)
- if Feature.enabled?(:improved_emoji_picker, snippet.project, default_enabled: :yaml)
- api_v4_projects_snippets_award_emoji_path(id: snippet.project.id, snippet_id: snippet.id)
- end
+ api_v4_projects_snippets_award_emoji_path(id: snippet.project.id, snippet_id: snippet.id)
end
end
diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb
index 4db14d5cc4d..b4ad9db815d 100644
--- a/app/helpers/sorting_helper.rb
+++ b/app/helpers/sorting_helper.rb
@@ -134,14 +134,14 @@ module SortingHelper
)
end
- def milestone_sort_options_hash
+ def milestones_sort_options_hash
{
- sort_value_name => sort_title_name_asc,
- sort_value_name_desc => sort_title_name_desc,
- sort_value_due_date_later => sort_title_due_date_later,
sort_value_due_date_soon => sort_title_due_date_soon,
+ sort_value_due_date_later => sort_title_due_date_later,
+ sort_value_start_date_soon => sort_title_start_date_soon,
sort_value_start_date_later => sort_title_start_date_later,
- sort_value_start_date_soon => sort_title_start_date_soon
+ sort_value_name => sort_title_name_asc,
+ sort_value_name_desc => sort_title_name_desc
}
end
@@ -186,6 +186,13 @@ module SortingHelper
}
end
+ def runners_sort_options_hash
+ {
+ sort_value_created_date => sort_title_created_date,
+ sort_value_contacted_date => sort_title_contacted_date
+ }
+ end
+
def starrers_sort_options_hash
{
sort_value_name => sort_title_name,
diff --git a/app/helpers/submodule_helper.rb b/app/helpers/submodule_helper.rb
index d3af6a00181..2942765a108 100644
--- a/app/helpers/submodule_helper.rb
+++ b/app/helpers/submodule_helper.rb
@@ -30,7 +30,7 @@ module SubmoduleHelper
end
end
- namespace.sub!(%r{\A/}, '')
+ namespace.delete_prefix!('/')
project.rstrip!
project.delete_suffix!('.git')
diff --git a/app/helpers/timeboxes_helper.rb b/app/helpers/timeboxes_helper.rb
index eca40572735..c81fbcbfd11 100644
--- a/app/helpers/timeboxes_helper.rb
+++ b/app/helpers/timeboxes_helper.rb
@@ -63,21 +63,6 @@ module TimeboxesHelper
issues.size
end
- # Returns count of milestones for different states
- # Uses explicit hash keys as the 'opened' state URL params differs from the db value
- # and we need to add the total
- # rubocop: disable CodeReuse/ActiveRecord
- def milestone_counts(milestones)
- counts = milestones.reorder(nil).group(:state).count
-
- {
- opened: counts['active'] || 0,
- closed: counts['closed'] || 0,
- all: counts.values.sum || 0
- }
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
def milestone_progress_tooltip_text(milestone)
has_issues = milestone.total_issues_count > 0
diff --git a/app/helpers/users/callouts_helper.rb b/app/helpers/users/callouts_helper.rb
index 87c8bf5cb28..b8231b02ac1 100644
--- a/app/helpers/users/callouts_helper.rb
+++ b/app/helpers/users/callouts_helper.rb
@@ -9,6 +9,7 @@ module Users
FEATURE_FLAGS_NEW_VERSION = 'feature_flags_new_version'
REGISTRATION_ENABLED_CALLOUT = 'registration_enabled_callout'
UNFINISHED_TAG_CLEANUP_CALLOUT = 'unfinished_tag_cleanup_callout'
+ MINUTE_LIMIT_BANNER = 'minute_limit_banner'
SECURITY_NEWSLETTER_CALLOUT = 'security_newsletter_callout'
REGISTRATION_ENABLED_CALLOUT_ALLOWED_CONTROLLER_PATHS = [/^root/, /^dashboard\S*/, /^admin\S*/].freeze
@@ -60,6 +61,10 @@ module Users
!user_dismissed?(SECURITY_NEWSLETTER_CALLOUT)
end
+ def minute_limit_banner_dismissed?
+ user_dismissed?(MINUTE_LIMIT_BANNER)
+ end
+
private
def user_dismissed?(feature_name, ignore_dismissal_earlier_than = nil)
diff --git a/app/helpers/users/group_callouts_helper.rb b/app/helpers/users/group_callouts_helper.rb
index 0aa4eb89499..9a9fce4d7e3 100644
--- a/app/helpers/users/group_callouts_helper.rb
+++ b/app/helpers/users/group_callouts_helper.rb
@@ -31,3 +31,5 @@ module Users
end
end
end
+
+Users::GroupCalloutsHelper.prepend_mod
diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb
index ba876f6cb65..02ea3c1b010 100644
--- a/app/helpers/wiki_helper.rb
+++ b/app/helpers/wiki_helper.rb
@@ -134,6 +134,20 @@ module WikiHelper
current_user&.can?(:admin_project, container) &&
!container.has_confluence?
end
+
+ def wiki_page_render_api_endpoint(page)
+ expose_path(api_v4_projects_wikis_path(wiki_page_render_api_endpoint_params(page)))
+ end
+
+ def wiki_markup_hash_by_name_id
+ Wiki::VALID_USER_MARKUPS.map { |key, value| { value[:name] => key } }.reduce({}, :merge)
+ end
+
+ private
+
+ def wiki_page_render_api_endpoint_params(page)
+ { id: page.container.id, slug: ERB::Util.url_encode(page.slug), params: { version: page.version.id } }
+ end
end
WikiHelper.prepend_mod_with('WikiHelper')
diff --git a/app/helpers/workhorse_helper.rb b/app/helpers/workhorse_helper.rb
index 2460c956bb6..f1ddc2e902e 100644
--- a/app/helpers/workhorse_helper.rb
+++ b/app/helpers/workhorse_helper.rb
@@ -35,9 +35,11 @@ module WorkhorseHelper
head :ok
end
- # Send an entry from artifacts through Workhorse
+ # Send an entry from artifacts through Workhorse and set safe content type
def send_artifacts_entry(file, entry)
headers.store(*Gitlab::Workhorse.send_artifacts_entry(file, entry))
+ headers.store(*Gitlab::Workhorse.detect_content_type)
+
head :ok
end
diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb
index d2e710cc329..341accaea32 100644
--- a/app/mailers/emails/merge_requests.rb
+++ b/app/mailers/emails/merge_requests.rb
@@ -14,10 +14,17 @@ module Emails
mail_answer_thread(@merge_request, merge_request_thread_options(updated_by_user_id, reason))
end
- def push_to_merge_request_email(recipient_id, merge_request_id, updated_by_user_id, reason = nil, new_commits: [], existing_commits: [])
+ # existing_commits - an array containing the first and last commits
+ def push_to_merge_request_email(recipient_id, merge_request_id, updated_by_user_id, reason = nil, new_commits: [], total_new_commits_count: nil, existing_commits: [], total_existing_commits_count: nil)
setup_merge_request_mail(merge_request_id, recipient_id)
+
@new_commits = new_commits
+ @total_new_commits_count = total_new_commits_count || @new_commits.length
+ @total_stripped_new_commits_count = @total_new_commits_count - @new_commits.length
+
@existing_commits = existing_commits
+ @total_existing_commits_count = total_existing_commits_count || @existing_commits.length
+
@updated_by_user = User.find(updated_by_user_id)
mail_answer_thread(@merge_request, merge_request_thread_options(updated_by_user_id, reason))
diff --git a/app/mailers/emails/profile.rb b/app/mailers/emails/profile.rb
index 28e51ba311b..31fcc7c15cb 100644
--- a/app/mailers/emails/profile.rb
+++ b/app/mailers/emails/profile.rb
@@ -141,6 +141,17 @@ module Emails
end
end
+ def new_email_address_added_email(user, email)
+ return unless user
+
+ @user = user
+ @email = email
+
+ Gitlab::I18n.with_locale(@user.preferred_language) do
+ mail(to: @user.notification_email_or_default, subject: subject(_("New email address added")))
+ end
+ end
+
private
def profile_email_with_layout(to:, subject:, layout: 'mailer')
diff --git a/app/mailers/emails/reviews.rb b/app/mailers/emails/reviews.rb
index ddb9e161a80..b98fa8aa6c9 100644
--- a/app/mailers/emails/reviews.rb
+++ b/app/mailers/emails/reviews.rb
@@ -22,6 +22,10 @@ module Emails
review = Review.find_by_id(review_id)
@notes = review.notes
+ @discussions = Discussion.build_discussions(review.discussion_ids, preload_note_diff_file: true)
+ @include_diff_discussion_stylesheet = @discussions.values.any? do |discussion|
+ discussion.diff_discussion? && discussion.on_text?
+ end
@author = review.author
@author_name = review.author_name
@project = review.project
diff --git a/app/mailers/previews/notify_preview.rb b/app/mailers/previews/notify_preview.rb
index 8e30eeee73f..e7c8964a733 100644
--- a/app/mailers/previews/notify_preview.rb
+++ b/app/mailers/previews/notify_preview.rb
@@ -181,6 +181,10 @@ class NotifyPreview < ActionMailer::Preview
Notify.unknown_sign_in_email(user, '127.0.0.1', Time.current).message
end
+ def new_email_address_added_email
+ Notify.new_email_address_added_email(user, 'someone@gitlab.com').message
+ end
+
def service_desk_new_note_email
cleanup do
note = create_note(noteable_type: 'Issue', noteable_id: issue.id, note: 'Issue note content')
diff --git a/app/models/alert_management/alert.rb b/app/models/alert_management/alert.rb
index a53fa39c58f..1ec3cb62c76 100644
--- a/app/models/alert_management/alert.rb
+++ b/app/models/alert_management/alert.rb
@@ -27,6 +27,7 @@ module AlertManagement
has_many :notes, as: :noteable, inverse_of: :noteable, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
has_many :ordered_notes, -> { fresh }, as: :noteable, class_name: 'Note'
has_many :user_mentions, class_name: 'AlertManagement::AlertUserMention', foreign_key: :alert_management_alert_id
+ has_many :metric_images, class_name: '::AlertManagement::MetricImage'
has_internal_id :iid, scope: :project
@@ -142,6 +143,10 @@ module AlertManagement
reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE
end
+ def metric_images_available?
+ ::AlertManagement::MetricImage.available_for?(project)
+ end
+
def prometheus?
monitoring_tool == Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus]
end
diff --git a/app/models/alert_management/metric_image.rb b/app/models/alert_management/metric_image.rb
new file mode 100644
index 00000000000..8175a31be7a
--- /dev/null
+++ b/app/models/alert_management/metric_image.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module AlertManagement
+ class MetricImage < ApplicationRecord
+ include MetricImageUploading
+ self.table_name = 'alert_management_alert_metric_images'
+
+ belongs_to :alert, class_name: 'AlertManagement::Alert', foreign_key: 'alert_id', inverse_of: :metric_images
+
+ def self.available_for?(project)
+ true
+ end
+
+ private
+
+ def local_path
+ Gitlab::Routing.url_helpers.alert_metric_image_upload_path(
+ filename: file.filename,
+ id: file.upload.model_id,
+ model: model_name.param_key,
+ mounted_as: 'file'
+ )
+ end
+ end
+end
diff --git a/app/models/analytics/cycle_analytics/aggregation.rb b/app/models/analytics/cycle_analytics/aggregation.rb
index 44d2dc369f7..2c04e67a04b 100644
--- a/app/models/analytics/cycle_analytics/aggregation.rb
+++ b/app/models/analytics/cycle_analytics/aggregation.rb
@@ -1,15 +1,53 @@
# frozen_string_literal: true
class Analytics::CycleAnalytics::Aggregation < ApplicationRecord
+ include IgnorableColumns
include FromUnion
belongs_to :group, optional: false
- validates :incremental_runtimes_in_seconds, :incremental_processed_records, :last_full_run_runtimes_in_seconds, :last_full_run_processed_records, presence: true, length: { maximum: 10 }, allow_blank: true
+ validates :incremental_runtimes_in_seconds, :incremental_processed_records, :full_runtimes_in_seconds, :full_processed_records, presence: true, length: { maximum: 10 }, allow_blank: true
scope :priority_order, -> (column_to_sort = :last_incremental_run_at) { order(arel_table[column_to_sort].asc.nulls_first) }
scope :enabled, -> { where('enabled IS TRUE') }
+ # These columns were added with wrong naming convention, the columns were never used.
+ ignore_column :last_full_run_processed_records, remove_with: '15.1', remove_after: '2022-05-22'
+ ignore_column :last_full_run_runtimes_in_seconds, remove_with: '15.1', remove_after: '2022-05-22'
+ ignore_column :last_full_run_issues_updated_at, remove_with: '15.1', remove_after: '2022-05-22'
+ ignore_column :last_full_run_mrs_updated_at, remove_with: '15.1', remove_after: '2022-05-22'
+ ignore_column :last_full_run_issues_id, remove_with: '15.1', remove_after: '2022-05-22'
+ ignore_column :last_full_run_merge_requests_id, remove_with: '15.1', remove_after: '2022-05-22'
+
+ def cursor_for(mode, model)
+ {
+ updated_at: self["last_#{mode}_#{model.table_name}_updated_at"],
+ id: self["last_#{mode}_#{model.table_name}_id"]
+ }.compact
+ end
+
+ def refresh_last_run(mode)
+ self["last_#{mode}_run_at"] = Time.current
+ end
+
+ def reset_full_run_cursors
+ self.last_full_issues_id = nil
+ self.last_full_issues_updated_at = nil
+ self.last_full_merge_requests_id = nil
+ self.last_full_merge_requests_updated_at = nil
+ end
+
+ def set_cursor(mode, model, cursor)
+ self["last_#{mode}_#{model.table_name}_id"] = cursor[:id]
+ self["last_#{mode}_#{model.table_name}_updated_at"] = cursor[:updated_at]
+ end
+
+ def set_stats(mode, runtime, processed_records)
+ # We only store the last 10 data points
+ self["#{mode}_runtimes_in_seconds"] = (self["#{mode}_runtimes_in_seconds"] + [runtime]).last(10)
+ self["#{mode}_processed_records"] = (self["#{mode}_processed_records"] + [processed_records]).last(10)
+ end
+
def estimated_next_run_at
return unless enabled
return if last_incremental_run_at.nil?
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index c7aad7ff861..7cd2fe705e3 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -387,7 +387,7 @@ class ApplicationSetting < ApplicationRecord
validates :invisible_captcha_enabled,
inclusion: { in: [true, false], message: _('must be a boolean value') }
- SUPPORTED_KEY_TYPES.each do |type|
+ Gitlab::SSHPublicKey.supported_types.each do |type|
validates :"#{type}_key_restriction", presence: true, key_restriction: { type: type }
end
@@ -576,6 +576,17 @@ class ApplicationSetting < ApplicationRecord
length: { maximum: 100, message: N_('is too long (maximum is 100 entries)') },
allow_nil: false
+ validates :public_runner_releases_url, addressable_url: true, presence: true
+
+ validates :inactive_projects_min_size_mb,
+ numericality: { only_integer: true, greater_than_or_equal_to: 0 }
+
+ validates :inactive_projects_delete_after_months,
+ numericality: { only_integer: true, greater_than: 0 }
+
+ validates :inactive_projects_send_warning_email_after_months,
+ numericality: { only_integer: true, greater_than: 0, less_than: :inactive_projects_delete_after_months }
+
attr_encrypted :asset_proxy_secret_key,
mode: :per_attribute_iv,
key: Settings.attr_encrypted_db_key_base_truncated,
@@ -609,6 +620,9 @@ class ApplicationSetting < ApplicationRecord
attr_encrypted :cloud_license_auth_token, encryption_options_base_32_aes_256_gcm
attr_encrypted :external_pipeline_validation_service_token, encryption_options_base_32_aes_256_gcm
attr_encrypted :mailgun_signing_key, encryption_options_base_32_aes_256_gcm.merge(encode: false)
+ attr_encrypted :database_grafana_api_key, encryption_options_base_32_aes_256_gcm.merge(encode: false, encode_iv: false)
+ attr_encrypted :arkose_labs_public_api_key, encryption_options_base_32_aes_256_gcm.merge(encode: false, encode_iv: false)
+ attr_encrypted :arkose_labs_private_api_key, encryption_options_base_32_aes_256_gcm.merge(encode: false, encode_iv: false)
validates :disable_feed_token,
inclusion: { in: [true, false], message: _('must be a boolean value') }
diff --git a/app/models/application_setting_implementation.rb b/app/models/application_setting_implementation.rb
index 42049713883..194356acc51 100644
--- a/app/models/application_setting_implementation.rb
+++ b/app/models/application_setting_implementation.rb
@@ -14,7 +14,6 @@ module ApplicationSettingImplementation
# Setting a key restriction to `-1` means that all keys of this type are
# forbidden.
FORBIDDEN_KEY_VALUE = KeyRestrictionValidator::FORBIDDEN
- SUPPORTED_KEY_TYPES = Gitlab::SSHPublicKey.supported_types
VALID_RUNNER_REGISTRAR_TYPES = %w(project group).freeze
DEFAULT_PROTECTED_PATHS = [
@@ -67,11 +66,11 @@ module ApplicationSettingImplementation
disabled_oauth_sign_in_sources: [],
dns_rebinding_protection_enabled: true,
domain_allowlist: Settings.gitlab['domain_allowlist'],
- dsa_key_restriction: 0,
- ecdsa_key_restriction: 0,
- ecdsa_sk_key_restriction: 0,
- ed25519_key_restriction: 0,
- ed25519_sk_key_restriction: 0,
+ dsa_key_restriction: default_min_key_size(:dsa),
+ ecdsa_key_restriction: default_min_key_size(:ecdsa),
+ ecdsa_sk_key_restriction: default_min_key_size(:ecdsa_sk),
+ ed25519_key_restriction: default_min_key_size(:ed25519),
+ ed25519_sk_key_restriction: default_min_key_size(:ed25519_sk),
eks_access_key_id: nil,
eks_account_id: nil,
eks_integration_enabled: false,
@@ -96,7 +95,6 @@ module ApplicationSettingImplementation
help_page_text: nil,
help_page_documentation_base_url: nil,
hide_third_party_offers: false,
- housekeeping_bitmaps_enabled: true,
housekeeping_enabled: true,
housekeeping_full_repack_period: 50,
housekeeping_gc_period: 200,
@@ -143,7 +141,7 @@ module ApplicationSettingImplementation
require_admin_approval_after_user_signup: true,
require_two_factor_authentication: false,
restricted_visibility_levels: Settings.gitlab['restricted_visibility_levels'],
- rsa_key_restriction: 0,
+ rsa_key_restriction: default_min_key_size(:rsa),
send_user_confirmation_email: false,
session_expire_delay: Settings.gitlab['session_expire_delay'],
shared_runners_enabled: Settings.gitlab_ci['shared_runners_enabled'],
@@ -244,6 +242,20 @@ module ApplicationSettingImplementation
"users.noreply.#{Gitlab.config.gitlab.host}"
end
+ # Return the default allowed minimum key size for a type.
+ # By default this is 0 (unrestricted), but in FIPS mode
+ # this will return the smallest allowed key size. If no
+ # size is available, this type is denied.
+ #
+ # @return [Integer]
+ def default_min_key_size(name)
+ if Gitlab::FIPS.enabled?
+ Gitlab::SSHPublicKey.supported_sizes(name).select(&:positive?).min || -1
+ else
+ 0
+ end
+ end
+
def create_from_defaults
build_from_defaults.tap(&:save)
end
@@ -442,7 +454,7 @@ module ApplicationSettingImplementation
alias_method :usage_ping_enabled?, :usage_ping_enabled
def allowed_key_types
- SUPPORTED_KEY_TYPES.select do |type|
+ Gitlab::SSHPublicKey.supported_types.select do |type|
key_restriction_for(type) != FORBIDDEN_KEY_VALUE
end
end
diff --git a/app/models/award_emoji.rb b/app/models/award_emoji.rb
index b665f3d5d8c..22e5436dc5c 100644
--- a/app/models/award_emoji.rb
+++ b/app/models/award_emoji.rb
@@ -19,6 +19,8 @@ class AwardEmoji < ApplicationRecord
participant :user
+ delegate :resource_parent, to: :awardable, allow_nil: true
+
scope :downvotes, -> { named(DOWNVOTE_NAME) }
scope :upvotes, -> { named(UPVOTE_NAME) }
scope :named, -> (names) { where(name: names) }
@@ -60,6 +62,12 @@ class AwardEmoji < ApplicationRecord
self.name == UPVOTE_NAME
end
+ def url
+ return if TanukiEmoji.find_by_alpha_code(name)
+
+ CustomEmoji.for_resource(resource_parent).by_name(name).select(:url).first&.url
+ end
+
def expire_cache
awardable.try(:bump_updated_at)
awardable.try(:expire_etag_cache)
diff --git a/app/models/blob.rb b/app/models/blob.rb
index cc7758d9674..a12d856dc36 100644
--- a/app/models/blob.rb
+++ b/app/models/blob.rb
@@ -8,6 +8,7 @@ class Blob < SimpleDelegator
include BlobActiveModel
MODE_SYMLINK = '120000' # The STRING 120000 is the git-reported octal filemode for a symlink
+ MODE_EXECUTABLE = '100755' # The STRING 100755 is the git-reported octal filemode for an executable file
CACHE_TIME = 60 # Cache raw blobs referred to by a (mutable) ref for 1 minute
CACHE_TIME_IMMUTABLE = 3600 # Cache blobs referred to by an immutable reference for 1 hour
@@ -35,7 +36,6 @@ class Blob < SimpleDelegator
BlobViewer::Image,
BlobViewer::Sketch,
- BlobViewer::Balsamiq,
BlobViewer::Video,
BlobViewer::Audio,
@@ -182,6 +182,10 @@ class Blob < SimpleDelegator
mode == MODE_SYMLINK
end
+ def executable?
+ mode == MODE_EXECUTABLE
+ end
+
def extension
@extension ||= extname.downcase.delete('.')
end
diff --git a/app/models/blob_viewer/balsamiq.rb b/app/models/blob_viewer/balsamiq.rb
deleted file mode 100644
index 6ab73730222..00000000000
--- a/app/models/blob_viewer/balsamiq.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module BlobViewer
- class Balsamiq < Base
- include Rich
- include ClientSide
-
- self.partial_name = 'balsamiq'
- self.extensions = %w(bmpr)
- self.binary = true
- self.switcher_icon = 'doc-image'
- self.switcher_title = 'preview'
- end
-end
diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb
index 949902fbb77..b255c774347 100644
--- a/app/models/broadcast_message.rb
+++ b/app/models/broadcast_message.rb
@@ -32,6 +32,19 @@ class BroadcastMessage < ApplicationRecord
after_commit :flush_redis_cache
+ enum theme: {
+ indigo: 0,
+ 'light-indigo': 1,
+ blue: 2,
+ 'light-blue': 3,
+ green: 4,
+ 'light-green': 5,
+ red: 6,
+ 'light-red': 7,
+ dark: 8,
+ light: 9
+ }, _default: 0, _prefix: true
+
enum broadcast_type: {
banner: 1,
notification: 2
diff --git a/app/models/bulk_import.rb b/app/models/bulk_import.rb
index 818ae04ba29..2200a66b3c2 100644
--- a/app/models/bulk_import.rb
+++ b/app/models/bulk_import.rb
@@ -16,10 +16,14 @@ class BulkImport < ApplicationRecord
enum source_type: { gitlab: 0 }
+ scope :stale, -> { where('created_at < ?', 8.hours.ago).where(status: [0, 1]) }
+ scope :order_by_created_at, -> (direction) { order(created_at: direction) }
+
state_machine :status, initial: :created do
state :created, value: 0
state :started, value: 1
state :finished, value: 2
+ state :timeout, value: 3
state :failed, value: -1
event :start do
@@ -30,6 +34,11 @@ class BulkImport < ApplicationRecord
transition started: :finished
end
+ event :cleanup_stale do
+ transition created: :timeout
+ transition started: :timeout
+ end
+
event :fail_op do
transition any => :failed
end
diff --git a/app/models/bulk_imports/entity.rb b/app/models/bulk_imports/entity.rb
index a7e1384641c..dee533944e9 100644
--- a/app/models/bulk_imports/entity.rb
+++ b/app/models/bulk_imports/entity.rb
@@ -51,11 +51,15 @@ class BulkImports::Entity < ApplicationRecord
enum source_type: { group_entity: 0, project_entity: 1 }
scope :by_user_id, ->(user_id) { joins(:bulk_import).where(bulk_imports: { user_id: user_id }) }
+ scope :stale, -> { where('created_at < ?', 8.hours.ago).where(status: [0, 1]) }
+ scope :by_bulk_import_id, ->(bulk_import_id) { where(bulk_import_id: bulk_import_id)}
+ scope :order_by_created_at, -> (direction) { order(created_at: direction) }
state_machine :status, initial: :created do
state :created, value: 0
state :started, value: 1
state :finished, value: 2
+ state :timeout, value: 3
state :failed, value: -1
event :start do
@@ -70,6 +74,11 @@ class BulkImports::Entity < ApplicationRecord
event :fail_op do
transition any => :failed
end
+
+ event :cleanup_stale do
+ transition created: :timeout
+ transition started: :timeout
+ end
end
def self.all_human_statuses
@@ -83,9 +92,9 @@ class BulkImports::Entity < ApplicationRecord
def pipelines
@pipelines ||= case source_type
when 'group_entity'
- BulkImports::Groups::Stage.new(bulk_import).pipelines
+ BulkImports::Groups::Stage.new(self).pipelines
when 'project_entity'
- BulkImports::Projects::Stage.new(bulk_import).pipelines
+ BulkImports::Projects::Stage.new(self).pipelines
end
end
diff --git a/app/models/bulk_imports/export_status.rb b/app/models/bulk_imports/export_status.rb
index cae6aad27da..a9750a76987 100644
--- a/app/models/bulk_imports/export_status.rb
+++ b/app/models/bulk_imports/export_status.rb
@@ -32,10 +32,12 @@ module BulkImports
strong_memoize(:export_status) do
status = fetch_export_status
+ relation_export_status = status&.find { |item| item['relation'] == relation }
+
# Consider empty response as failed export
- raise StandardError, 'Empty export status response' unless status&.present?
+ raise StandardError, 'Empty relation export status' unless relation_export_status&.present?
- status.find { |item| item['relation'] == relation }
+ relation_export_status
end
rescue StandardError => e
{ 'status' => Export::FAILED, 'error' => e.message }
diff --git a/app/models/bulk_imports/tracker.rb b/app/models/bulk_imports/tracker.rb
index cfe33c013ba..a994cc3f8ce 100644
--- a/app/models/bulk_imports/tracker.rb
+++ b/app/models/bulk_imports/tracker.rb
@@ -46,6 +46,7 @@ class BulkImports::Tracker < ApplicationRecord
state :started, value: 1
state :finished, value: 2
state :enqueued, value: 3
+ state :timeout, value: 4
state :failed, value: -1
state :skipped, value: -2
@@ -76,5 +77,9 @@ class BulkImports::Tracker < ApplicationRecord
event :fail_op do
transition any => :failed
end
+
+ event :cleanup_stale do
+ transition [:created, :started] => :timeout
+ end
end
end
diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb
index 2ff777bfc89..ff444ddefa3 100644
--- a/app/models/ci/bridge.rb
+++ b/app/models/ci/bridge.rb
@@ -57,10 +57,6 @@ module Ci
end
end
- def self.retry(bridge, current_user)
- raise NotImplementedError
- end
-
def self.with_preloads
preload(
:metadata,
@@ -69,6 +65,10 @@ module Ci
)
end
+ def retryable?
+ false
+ end
+
def inherit_status_from_downstream!(pipeline)
case pipeline.status
when 'success'
@@ -274,7 +274,8 @@ module Ci
# The order of this list refers to the priority of the variables
downstream_yaml_variables(expand_variables) +
- downstream_pipeline_variables(expand_variables)
+ downstream_pipeline_variables(expand_variables) +
+ downstream_pipeline_schedule_variables(expand_variables)
end
def downstream_yaml_variables(expand_variables)
@@ -293,6 +294,15 @@ module Ci
end
end
+ def downstream_pipeline_schedule_variables(expand_variables)
+ return [] unless forward_pipeline_variables?
+ return [] unless pipeline.pipeline_schedule
+
+ pipeline.pipeline_schedule.variables.to_a.map do |variable|
+ { key: variable.key, value: ::ExpandVariables.expand(variable.value, expand_variables) }
+ end
+ end
+
def forward_yaml_variables?
strong_memoize(:forward_yaml_variables) do
result = options&.dig(:trigger, :forward, :yaml_variables)
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index 68ec196a9ee..16c9aa212d0 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -218,17 +218,21 @@ module Ci
pending.unstarted.order('created_at ASC').first
end
- def retry(build, current_user)
- # rubocop: disable CodeReuse/ServiceClass
- Ci::RetryBuildService
- .new(build.project, current_user)
- .execute(build)
- # rubocop: enable CodeReuse/ServiceClass
- end
-
def with_preloads
preload(:job_artifacts_archive, :job_artifacts, :tags, project: [:namespace])
end
+
+ def extra_accessors
+ []
+ end
+
+ def clone_accessors
+ %i[pipeline project ref tag options name
+ allow_failure stage stage_id stage_idx trigger_request
+ yaml_variables when environment coverage_regex
+ description tag_list protected needs_attributes
+ job_variables_attributes resource_group scheduling_type].freeze
+ end
end
state_machine :status do
@@ -351,7 +355,9 @@ module Ci
if build.auto_retry_allowed?
begin
- Ci::Build.retry(build, build.user)
+ # rubocop: disable CodeReuse/ServiceClass
+ Ci::RetryJobService.new(build.project, build.user).execute(build)
+ # rubocop: enable CodeReuse/ServiceClass
rescue Gitlab::Access::AccessDeniedError => ex
Gitlab::AppLogger.error "Unable to auto-retry job #{build.id}: #{ex}"
end
@@ -472,12 +478,6 @@ module Ci
active? || created?
end
- def retryable?
- return false if retried? || archived? || deployment_rejected?
-
- success? || failed? || canceled?
- end
-
def retries_count
pipeline.builds.retried.where(name: self.name).count
end
@@ -504,7 +504,11 @@ module Ci
if metadata&.expanded_environment_name.present?
metadata.expanded_environment_name
else
- ExpandVariables.expand(environment, -> { simple_variables })
+ if ::Feature.enabled?(:ci_expand_environment_name_and_url, project, default_enabled: :yaml)
+ ExpandVariables.expand(environment, -> { simple_variables.sort_and_expand_all })
+ else
+ ExpandVariables.expand(environment, -> { simple_variables })
+ end
end
end
end
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index 3426c4d5248..dff8bb89021 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -186,6 +186,7 @@ module Ci
scope :downloadable, -> { where(file_type: DOWNLOADABLE_TYPES) }
scope :unlocked, -> { joins(job: :pipeline).merge(::Ci::Pipeline.unlocked) }
+ scope :order_expired_asc, -> { order(expire_at: :asc) }
scope :order_expired_desc, -> { order(expire_at: :desc) }
scope :with_destroy_preloads, -> { includes(project: [:route, :statistics]) }
@@ -273,6 +274,10 @@ module Ci
self.where(project: project).sum(:size)
end
+ def self.pluck_job_id
+ pluck(:job_id)
+ end
+
##
# FastDestroyAll concerns
# rubocop: disable CodeReuse/ServiceClass
diff --git a/app/models/ci/namespace_mirror.rb b/app/models/ci/namespace_mirror.rb
index d5cbbb96134..e8f08db597f 100644
--- a/app/models/ci/namespace_mirror.rb
+++ b/app/models/ci/namespace_mirror.rb
@@ -4,6 +4,8 @@ module Ci
# This model represents a record in a shadow table of the main database's namespaces table.
# It allows us to navigate the namespace hierarchy on the ci database without resorting to a JOIN.
class NamespaceMirror < ApplicationRecord
+ include FromUnion
+
belongs_to :namespace
scope :by_group_and_descendants, -> (id) do
@@ -14,6 +16,24 @@ module Ci
where('traversal_ids && ARRAY[?]::int[]', ids)
end
+ scope :contains_traversal_ids, -> (traversal_ids) do
+ mirrors = []
+
+ traversal_ids.group_by(&:count).each do |columns_count, traversal_ids_group|
+ columns = Array.new(columns_count) { |i| "(traversal_ids[#{i + 1}])" }
+ pairs = traversal_ids_group.map do |ids|
+ ids = ids.map { |id| Arel::Nodes.build_quoted(id).to_sql }
+ "(#{ids.join(",")})"
+ end
+
+ # Create condition in format:
+ # ((traversal_ids[1]),(traversal_ids[2])) IN ((1,2),(2,3))
+ mirrors << Ci::NamespaceMirror.where("(#{columns.join(",")}) IN (#{pairs.join(",")})") # rubocop:disable GitlabSecurity/SqlInjection
+ end
+
+ self.from_union(mirrors)
+ end
+
scope :by_namespace_id, -> (namespace_id) { where(namespace_id: namespace_id) }
class << self
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index ae3ea7aa03f..2d0479e02a3 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -824,6 +824,8 @@ module Ci
variables.append(key: 'CI_OPEN_MERGE_REQUESTS', value: open_merge_requests_refs.join(','))
end
+ variables.append(key: 'CI_GITLAB_FIPS_MODE', value: 'true') if Gitlab::FIPS.enabled?
+
variables.append(key: 'CI_KUBERNETES_ACTIVE', value: 'true') if has_kubernetes_active?
variables.append(key: 'CI_DEPLOY_FREEZE', value: 'true') if freeze_period?
@@ -836,6 +838,8 @@ module Ci
def predefined_commit_variables
strong_memoize(:predefined_commit_variables) do
Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ next variables unless sha.present?
+
variables.append(key: 'CI_COMMIT_SHA', value: sha)
variables.append(key: 'CI_COMMIT_SHORT_SHA', value: short_sha)
variables.append(key: 'CI_COMMIT_BEFORE_SHA', value: before_sha)
@@ -955,7 +959,7 @@ module Ci
Ci::Build.latest.where(pipeline: self_and_descendants)
end
- def environments_in_self_and_descendants
+ def environments_in_self_and_descendants(deployment_status: nil)
# We limit to 100 unique environments for application safety.
# See: https://gitlab.com/gitlab-org/gitlab/-/issues/340781#note_699114700
expanded_environment_names =
@@ -965,7 +969,7 @@ module Ci
.limit(100)
.pluck(:expanded_environment_name)
- Environment.where(project: project, name: expanded_environment_names).with_deployment(sha)
+ Environment.where(project: project, name: expanded_environment_names).with_deployment(sha, status: deployment_status)
end
# With multi-project and parent-child pipelines
@@ -1285,6 +1289,12 @@ module Ci
end
end
+ def has_expired_test_reports?
+ strong_memoize(:artifacts_expired) do
+ !has_reports?(::Ci::JobArtifact.test_reports.not_expired)
+ end
+ end
+
private
def add_message(severity, content)
diff --git a/app/models/ci/processable.rb b/app/models/ci/processable.rb
index 4d119706a43..d79ff74753a 100644
--- a/app/models/ci/processable.rb
+++ b/app/models/ci/processable.rb
@@ -101,6 +101,12 @@ module Ci
:merge_train_pipeline?,
to: :pipeline
+ def retryable?
+ return false if retried? || archived? || deployment_rejected?
+
+ success? || failed? || canceled?
+ end
+
def aggregated_needs_names
read_attribute(:aggregated_needs_names)
end
diff --git a/app/models/ci/secure_file.rb b/app/models/ci/secure_file.rb
index 18f0093ea41..6a26a5341aa 100644
--- a/app/models/ci/secure_file.rb
+++ b/app/models/ci/secure_file.rb
@@ -15,7 +15,9 @@ module Ci
validates :file, presence: true, file_size: { maximum: FILE_SIZE_LIMIT }
validates :checksum, :file_store, :name, :permissions, :project_id, presence: true
+ validates :name, uniqueness: { scope: :project }
+ after_initialize :generate_key_data
before_validation :assign_checksum
enum permissions: { read_only: 0, read_write: 1, execute: 2 }
@@ -33,5 +35,11 @@ module Ci
def assign_checksum
self.checksum = file.checksum if file.present? && file_changed?
end
+
+ def generate_key_data
+ return if key_data.present?
+
+ self.key_data = SecureRandom.hex(64)
+ end
end
end
diff --git a/app/models/clusters/agent_token.rb b/app/models/clusters/agent_token.rb
index 691d628524f..1607d0b6d19 100644
--- a/app/models/clusters/agent_token.rb
+++ b/app/models/clusters/agent_token.rb
@@ -18,7 +18,7 @@ module Clusters
validates :description, length: { maximum: 1024 }
validates :name, presence: true, length: { maximum: 255 }
- scope :order_last_used_at_desc, -> { order(::Gitlab::Database.nulls_last_order('last_used_at', 'DESC')) }
+ scope :order_last_used_at_desc, -> { order(arel_table[:last_used_at].desc.nulls_last) }
scope :with_status, -> (status) { where(status: status) }
enum status: {
diff --git a/app/models/clusters/applications/runner.rb b/app/models/clusters/applications/runner.rb
index 07eaca87fad..e62b6fa5fc5 100644
--- a/app/models/clusters/applications/runner.rb
+++ b/app/models/clusters/applications/runner.rb
@@ -3,7 +3,7 @@
module Clusters
module Applications
class Runner < ApplicationRecord
- VERSION = '0.37.1'
+ VERSION = '0.39.0'
self.table_name = 'clusters_applications_runners'
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 21e2e21e9b3..08fed353755 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -33,7 +33,7 @@ class CommitStatus < Ci::ApplicationRecord
where(allow_failure: true, status: [:failed, :canceled])
end
- scope :order_id_desc, -> { order('ci_builds.id DESC') }
+ scope :order_id_desc, -> { order(id: :desc) }
scope :exclude_ignored, -> do
# We want to ignore failed but allowed to fail jobs.
diff --git a/app/models/concerns/batch_nullify_dependent_associations.rb b/app/models/concerns/batch_nullify_dependent_associations.rb
new file mode 100644
index 00000000000..c95b5b64a43
--- /dev/null
+++ b/app/models/concerns/batch_nullify_dependent_associations.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+# Provides a way to execute nullify behaviour in batches
+# to avoid query timeouts for really big tables
+# Assumes that associations have `dependent: :nullify` statement
+module BatchNullifyDependentAssociations
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def dependent_associations_to_nullify
+ reflect_on_all_associations(:has_many).select { |assoc| assoc.options[:dependent] == :nullify }
+ end
+ end
+
+ def nullify_dependent_associations_in_batches(exclude: [], batch_size: 100)
+ self.class.dependent_associations_to_nullify.each do |association|
+ next if association.name.in?(exclude)
+
+ loop do
+ # rubocop:disable GitlabSecurity/PublicSend
+ update_count = public_send(association.name).limit(batch_size).update_all(association.foreign_key => nil)
+ # rubocop:enable GitlabSecurity/PublicSend
+ break if update_count < batch_size
+ end
+ end
+ end
+end
diff --git a/app/models/concerns/bulk_users_by_email_load.rb b/app/models/concerns/bulk_users_by_email_load.rb
new file mode 100644
index 00000000000..edbd3e21458
--- /dev/null
+++ b/app/models/concerns/bulk_users_by_email_load.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module BulkUsersByEmailLoad
+ extend ActiveSupport::Concern
+
+ included do
+ def users_by_emails(emails)
+ Gitlab::SafeRequestLoader.execute(resource_key: user_by_email_resource_key, resource_ids: emails) do |emails|
+ # have to consider all emails - even secondary, so use all_emails here
+ grouped_users_by_email = User.by_any_email(emails).preload(:emails).group_by(&:all_emails)
+
+ grouped_users_by_email.each_with_object({}) do |(found_emails, users), h|
+ found_emails.each { |e| h[e] = users.first if emails.include?(e) } # don't include all emails for an account, only the ones we want
+ end
+ end
+ end
+
+ private
+
+ def user_by_email_resource_key
+ "user_by_email_for_#{User.name.underscore.pluralize}:#{self.class}:#{self.id}"
+ end
+ end
+end
diff --git a/app/models/concerns/featurable.rb b/app/models/concerns/featurable.rb
index 70d67fc7559..08189d83534 100644
--- a/app/models/concerns/featurable.rb
+++ b/app/models/concerns/featurable.rb
@@ -50,7 +50,7 @@ module Featurable
end
def available_features
- @available_features
+ @available_features || []
end
def access_level_attribute(feature)
@@ -74,6 +74,12 @@ module Featurable
STRING_OPTIONS.key(level)
end
+ def required_minimum_access_level(feature)
+ ensure_feature!(feature)
+
+ Gitlab::Access::GUEST
+ end
+
def ensure_feature!(feature)
feature = feature.model_name.plural if feature.respond_to?(:model_name)
feature = feature.to_sym
@@ -91,8 +97,8 @@ module Featurable
public_send(self.class.access_level_attribute(feature)) # rubocop:disable GitlabSecurity/PublicSend
end
- def feature_available?(feature, user)
- get_permission(user, feature)
+ def feature_available?(feature, user = nil)
+ has_permission?(user, feature)
end
def string_access_level(feature)
@@ -115,4 +121,30 @@ module Featurable
def feature_validation_exclusion
[]
end
+
+ def has_permission?(user, feature)
+ case access_level(feature)
+ when DISABLED
+ false
+ when PRIVATE
+ member?(user, feature)
+ when ENABLED
+ true
+ when PUBLIC
+ true
+ else
+ true
+ end
+ end
+
+ def member?(user, feature)
+ return false unless user
+ return true if user.can_read_all_resources?
+
+ resource_member?(user, feature)
+ end
+
+ def resource_member?(user, feature)
+ raise NotImplementedError
+ end
end
diff --git a/app/models/concerns/from_set_operator.rb b/app/models/concerns/from_set_operator.rb
index c6d63631c84..ce3a83e9fa1 100644
--- a/app/models/concerns/from_set_operator.rb
+++ b/app/models/concerns/from_set_operator.rb
@@ -11,7 +11,12 @@ module FromSetOperator
raise "Trying to redefine method '#{method(method_name)}'" if methods.include?(method_name)
define_method(method_name) do |members, remove_duplicates: true, remove_order: true, alias_as: table_name|
- operator_sql = operator.new(members, remove_duplicates: remove_duplicates, remove_order: remove_order).to_sql
+ operator_sql =
+ if members.any?
+ operator.new(members, remove_duplicates: remove_duplicates, remove_order: remove_order).to_sql
+ else
+ where("1=0").to_sql
+ end
from(Arel.sql("(#{operator_sql}) #{alias_as}"))
end
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 1eb30e88f16..dbd760a9c45 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -195,7 +195,7 @@ module Issuable
end
def supports_escalation?
- return false unless ::Feature.enabled?(:incident_escalations, project)
+ return false unless ::Feature.enabled?(:incident_escalations, project, default_enabled: :yaml)
incident?
end
@@ -318,12 +318,16 @@ module Issuable
# 2. We can't ORDER BY a column that isn't in the GROUP BY and doesn't
# have an aggregate function applied, so we do a useless MIN() instead.
#
- milestones_due_date = 'MIN(milestones.due_date)'
+ milestones_due_date = Milestone.arel_table[:due_date].minimum
+ milestones_due_date_with_direction = direction == 'ASC' ? milestones_due_date.asc : milestones_due_date.desc
+
+ highest_priority_arel = Arel.sql('highest_priority')
+ highest_priority_arel_with_direction = direction == 'ASC' ? highest_priority_arel.asc : highest_priority_arel.desc
order_milestone_due_asc
.order_labels_priority(excluded_labels: excluded_labels, extra_select_columns: [milestones_due_date])
- .reorder(Gitlab::Database.nulls_last_order(milestones_due_date, direction),
- Gitlab::Database.nulls_last_order('highest_priority', direction))
+ .reorder(milestones_due_date_with_direction.nulls_last,
+ highest_priority_arel_with_direction.nulls_last)
end
def order_labels_priority(direction = 'ASC', excluded_labels: [], extra_select_columns: [], with_cte: false)
@@ -341,12 +345,15 @@ module Issuable
extra_select_columns.unshift("highest_priorities.label_priority as highest_priority")
+ highest_priority_arel = Arel.sql('highest_priority')
+ highest_priority_arel_with_direction = direction == 'ASC' ? highest_priority_arel.asc : highest_priority_arel.desc
+
select(issuable_columns)
.select(extra_select_columns)
.from("#{table_name}")
.joins("JOIN LATERAL(#{highest_priority}) as highest_priorities ON TRUE")
.group(group_columns)
- .reorder(Gitlab::Database.nulls_last_order('highest_priority', direction))
+ .reorder(highest_priority_arel_with_direction.nulls_last)
end
def with_label(title, sort = nil)
@@ -524,6 +531,10 @@ module Issuable
labels.order('title ASC').pluck(:title)
end
+ def labels_hook_attrs
+ labels.map(&:hook_attrs)
+ end
+
# Convert this Issuable class name to a format usable by Ability definitions
#
# Examples:
diff --git a/app/models/concerns/issuable_link.rb b/app/models/concerns/issuable_link.rb
index 3e14507bc70..c319d685362 100644
--- a/app/models/concerns/issuable_link.rb
+++ b/app/models/concerns/issuable_link.rb
@@ -29,6 +29,8 @@ module IssuableLink
validate :check_self_relation
validate :check_opposite_relation
+ scope :for_source_or_target, ->(issuable) { where(source: issuable).or(where(target: issuable)) }
+
enum link_type: { TYPE_RELATES_TO => 0, TYPE_BLOCKS => 1 }
private
diff --git a/app/models/concerns/metric_image_uploading.rb b/app/models/concerns/metric_image_uploading.rb
new file mode 100644
index 00000000000..3f7797f56c5
--- /dev/null
+++ b/app/models/concerns/metric_image_uploading.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+module MetricImageUploading
+ extend ActiveSupport::Concern
+
+ MAX_FILE_SIZE = 1.megabyte.freeze
+
+ included do
+ include Gitlab::FileTypeDetection
+ include FileStoreMounter
+ include WithUploads
+
+ validates :file, presence: true
+ validate :validate_file_is_image
+ validates :url, length: { maximum: 255 }, public_url: { allow_blank: true }
+ validates :url_text, length: { maximum: 128 }
+
+ scope :order_created_at_asc, -> { order(created_at: :asc) }
+
+ attribute :file_store, :integer, default: -> { MetricImageUploader.default_store }
+
+ mount_file_store_uploader MetricImageUploader
+ end
+
+ def filename
+ @filename ||= file&.filename
+ end
+
+ def file_path
+ @file_path ||= begin
+ return file&.url unless file&.upload
+
+ # If we're using a CDN, we need to use the full URL
+ asset_host = ActionController::Base.asset_host || Gitlab.config.gitlab.base_url
+
+ Gitlab::Utils.append_path(asset_host, local_path)
+ end
+ end
+
+ private
+
+ def valid_file_extensions
+ Gitlab::FileTypeDetection::SAFE_IMAGE_EXT
+ end
+
+ def validate_file_is_image
+ unless image?
+ message = _('does not have a supported extension. Only %{extension_list} are supported') % {
+ extension_list: valid_file_extensions.to_sentence
+ }
+ errors.add(:file, message)
+ end
+ end
+end
diff --git a/app/models/concerns/sensitive_serializable_hash.rb b/app/models/concerns/sensitive_serializable_hash.rb
index 725ec60e9b6..94451fcd2c2 100644
--- a/app/models/concerns/sensitive_serializable_hash.rb
+++ b/app/models/concerns/sensitive_serializable_hash.rb
@@ -19,7 +19,6 @@ module SensitiveSerializableHash
# In general, prefer NOT to use serializable_hash / to_json / as_json in favor
# of serializers / entities instead which has an allowlist of attributes
def serializable_hash(options = nil)
- return super unless prevent_sensitive_fields_from_serializable_hash?
return super if options && options[:unsafe_serialization_hash]
options = options.try(:dup) || {}
@@ -37,10 +36,4 @@ module SensitiveSerializableHash
super(options)
end
-
- private
-
- def prevent_sensitive_fields_from_serializable_hash?
- Feature.enabled?(:prevent_sensitive_fields_from_serializable_hash, default_enabled: :yaml)
- end
end
diff --git a/app/models/concerns/spammable.rb b/app/models/concerns/spammable.rb
index b475eb79aa3..d27b451892a 100644
--- a/app/models/concerns/spammable.rb
+++ b/app/models/concerns/spammable.rb
@@ -84,7 +84,8 @@ module Spammable
end
def unrecoverable_spam_error!
- self.errors.add(:base, "Your #{spammable_entity_type} has been recognized as spam and has been discarded.")
+ self.errors.add(:base, _("Your %{spammable_entity_type} has been recognized as spam and has been discarded.") \
+ % { spammable_entity_type: spammable_entity_type })
end
def spammable_entity_type
diff --git a/app/models/concerns/taskable.rb b/app/models/concerns/taskable.rb
index e41a0ca28f9..904c96b11b3 100644
--- a/app/models/concerns/taskable.rb
+++ b/app/models/concerns/taskable.rb
@@ -11,14 +11,16 @@ require 'task_list/filter'
module Taskable
COMPLETED = 'completed'
INCOMPLETE = 'incomplete'
- COMPLETE_PATTERN = /(\[[xX]\])/.freeze
- INCOMPLETE_PATTERN = /(\[\s\])/.freeze
+ COMPLETE_PATTERN = /\[[xX]\]/.freeze
+ INCOMPLETE_PATTERN = /\[[[:space:]]\]/.freeze
ITEM_PATTERN = %r{
^
(?:(?:>\s{0,4})*) # optional blockquote characters
((?:\s*(?:[-+*]|(?:\d+\.)))+) # list prefix (one or more) required - task item has to be always in a list
\s+ # whitespace prefix has to be always presented for a list item
- (\[\s\]|\[[xX]\]) # checkbox
+ ( # checkbox
+ #{COMPLETE_PATTERN}|#{INCOMPLETE_PATTERN}
+ )
(\s.+) # followed by whitespace and some text.
}x.freeze
diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb
index fa03d73646d..78bd520d5d5 100644
--- a/app/models/container_repository.rb
+++ b/app/models/container_repository.rb
@@ -9,15 +9,17 @@ class ContainerRepository < ApplicationRecord
WAITING_CLEANUP_STATUSES = %i[cleanup_scheduled cleanup_unfinished].freeze
REQUIRING_CLEANUP_STATUSES = %i[cleanup_unscheduled cleanup_scheduled].freeze
+
IDLE_MIGRATION_STATES = %w[default pre_import_done import_done import_aborted import_skipped].freeze
ACTIVE_MIGRATION_STATES = %w[pre_importing importing].freeze
- ABORTABLE_MIGRATION_STATES = (ACTIVE_MIGRATION_STATES + %w[pre_import_done default]).freeze
MIGRATION_STATES = (IDLE_MIGRATION_STATES + ACTIVE_MIGRATION_STATES).freeze
+ ABORTABLE_MIGRATION_STATES = (ACTIVE_MIGRATION_STATES + %w[pre_import_done default]).freeze
+ SKIPPABLE_MIGRATION_STATES = (ABORTABLE_MIGRATION_STATES + %w[import_aborted]).freeze
MIGRATION_PHASE_1_STARTED_AT = Date.new(2021, 11, 4).freeze
+ MIGRATION_PHASE_1_ENDED_AT = Date.new(2022, 01, 23).freeze
TooManyImportsError = Class.new(StandardError)
- NativeImportError = Class.new(StandardError)
belongs_to :project
@@ -32,7 +34,17 @@ class ContainerRepository < ApplicationRecord
enum status: { delete_scheduled: 0, delete_failed: 1 }
enum expiration_policy_cleanup_status: { cleanup_unscheduled: 0, cleanup_scheduled: 1, cleanup_unfinished: 2, cleanup_ongoing: 3 }
- enum migration_skipped_reason: { not_in_plan: 0, too_many_retries: 1, too_many_tags: 2, root_namespace_in_deny_list: 3 }
+
+ enum migration_skipped_reason: {
+ not_in_plan: 0,
+ too_many_retries: 1,
+ too_many_tags: 2,
+ root_namespace_in_deny_list: 3,
+ migration_canceled: 4,
+ not_found: 5,
+ native_import: 6,
+ migration_forced_canceled: 7
+ }
delegate :client, :gitlab_api_client, to: :registry
@@ -57,8 +69,8 @@ class ContainerRepository < ApplicationRecord
scope :import_in_process, -> { where(migration_state: %w[pre_importing pre_import_done importing]) }
scope :recently_done_migration_step, -> do
- where(migration_state: %w[import_done pre_import_done import_aborted])
- .order(Arel.sql('GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at) DESC'))
+ where(migration_state: %w[import_done pre_import_done import_aborted import_skipped])
+ .order(Arel.sql('GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at) DESC'))
end
scope :ready_for_import, -> do
@@ -110,19 +122,19 @@ class ContainerRepository < ApplicationRecord
end
event :start_pre_import do
- transition default: :pre_importing
+ transition %i[default pre_importing importing import_aborted] => :pre_importing
end
event :finish_pre_import do
- transition %i[pre_importing import_aborted] => :pre_import_done
+ transition %i[pre_importing importing import_aborted] => :pre_import_done
end
event :start_import do
- transition pre_import_done: :importing
+ transition %i[pre_import_done pre_importing importing import_aborted] => :importing
end
event :finish_import do
- transition %i[importing import_aborted] => :import_done
+ transition %i[default pre_importing importing import_aborted] => :import_done
end
event :already_migrated do
@@ -134,15 +146,15 @@ class ContainerRepository < ApplicationRecord
end
event :skip_import do
- transition ABORTABLE_MIGRATION_STATES.map(&:to_sym) => :import_skipped
+ transition SKIPPABLE_MIGRATION_STATES.map(&:to_sym) => :import_skipped
end
event :retry_pre_import do
- transition import_aborted: :pre_importing
+ transition %i[pre_importing importing import_aborted] => :pre_importing
end
event :retry_import do
- transition import_aborted: :importing
+ transition %i[pre_importing importing import_aborted] => :importing
end
before_transition any => :pre_importing do |container_repository|
@@ -150,13 +162,16 @@ class ContainerRepository < ApplicationRecord
container_repository.migration_pre_import_done_at = nil
end
- after_transition any => :pre_importing do |container_repository|
+ after_transition any => :pre_importing do |container_repository, transition|
+ forced = transition.args.first.try(:[], :forced)
+ next if forced
+
container_repository.try_import do
container_repository.migration_pre_import
end
end
- before_transition %i[pre_importing import_aborted] => :pre_import_done do |container_repository|
+ before_transition any => :pre_import_done do |container_repository|
container_repository.migration_pre_import_done_at = Time.zone.now
end
@@ -165,13 +180,16 @@ class ContainerRepository < ApplicationRecord
container_repository.migration_import_done_at = nil
end
- after_transition any => :importing do |container_repository|
+ after_transition any => :importing do |container_repository, transition|
+ forced = transition.args.first.try(:[], :forced)
+ next if forced
+
container_repository.try_import do
container_repository.migration_import
end
end
- before_transition %i[importing import_aborted] => :import_done do |container_repository|
+ before_transition any => :import_done do |container_repository|
container_repository.migration_import_done_at = Time.zone.now
end
@@ -181,6 +199,12 @@ class ContainerRepository < ApplicationRecord
container_repository.migration_retries_count += 1
end
+ after_transition any => :import_aborted do |container_repository|
+ if container_repository.retried_too_many_times?
+ container_repository.skip_import(reason: :too_many_retries)
+ end
+ end
+
before_transition import_aborted: any do |container_repository|
container_repository.migration_aborted_at = nil
container_repository.migration_aborted_in_state = nil
@@ -204,6 +228,13 @@ class ContainerRepository < ApplicationRecord
).exists?
end
+ def self.all_migrated?
+ # check that the set of non migrated repositories is empty
+ where(created_at: ...MIGRATION_PHASE_1_ENDED_AT)
+ .where.not(migration_state: 'import_done')
+ .empty?
+ end
+
def self.with_enabled_policy
joins('INNER JOIN container_expiration_policies ON container_repositories.project_id = container_expiration_policies.project_id')
.where(container_expiration_policies: { enabled: true })
@@ -250,10 +281,10 @@ class ContainerRepository < ApplicationRecord
super
end
- def start_pre_import
+ def start_pre_import(*args)
return false unless ContainerRegistry::Migration.enabled?
- super
+ super(*args)
end
def retry_pre_import
@@ -276,24 +307,38 @@ class ContainerRepository < ApplicationRecord
def retry_aborted_migration
return unless migration_state == 'import_aborted'
- case external_import_status
+ reconcile_import_status(external_import_status) do
+ # If the import_status request fails, use the timestamp to guess current state
+ migration_pre_import_done_at ? retry_import : retry_pre_import
+ end
+ end
+
+ def reconcile_import_status(status)
+ case status
when 'native'
- raise NativeImportError
+ finish_import_as(:native_import)
+ when 'pre_import_in_progress'
+ return if pre_importing?
+
+ start_pre_import(forced: true)
when 'import_in_progress'
- nil
+ return if importing?
+
+ start_import(forced: true)
+ when 'import_canceled', 'pre_import_canceled'
+ return if import_skipped?
+
+ skip_import(reason: :migration_canceled)
when 'import_complete'
finish_import
when 'import_failed'
retry_import
- when 'pre_import_in_progress'
- nil
when 'pre_import_complete'
finish_pre_import_and_start_import
when 'pre_import_failed'
retry_pre_import
else
- # If the import_status request fails, use the timestamp to guess current state
- migration_pre_import_done_at ? retry_import : retry_pre_import
+ yield
end
end
@@ -303,9 +348,18 @@ class ContainerRepository < ApplicationRecord
try_count = 0
begin
try_count += 1
- return true if yield == :ok
- abort_import
+ case yield
+ when :ok
+ return true
+ when :not_found
+ finish_import_as(:not_found)
+ when :already_imported
+ finish_import_as(:native_import)
+ else
+ abort_import
+ end
+
false
rescue TooManyImportsError
if try_count <= ::ContainerRegistry::Migration.start_max_retries
@@ -318,8 +372,12 @@ class ContainerRepository < ApplicationRecord
end
end
+ def retried_too_many_times?
+ migration_retries_count >= ContainerRegistry::Migration.max_retries
+ end
+
def last_import_step_done_at
- [migration_pre_import_done_at, migration_import_done_at, migration_aborted_at].compact.max
+ [migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at].compact.max
end
def external_import_status
@@ -416,7 +474,7 @@ class ContainerRepository < ApplicationRecord
next if self.created_at.before?(MIGRATION_PHASE_1_STARTED_AT)
next unless gitlab_api_client.supports_gitlab_api?
- gitlab_api_client.repository_details(self.path, with_size: true)['size_bytes']
+ gitlab_api_client.repository_details(self.path, sizing: :self)['size_bytes']
end
end
@@ -450,6 +508,25 @@ class ContainerRepository < ApplicationRecord
response
end
+ def migration_cancel
+ return :error unless gitlab_api_client.supports_gitlab_api?
+
+ gitlab_api_client.cancel_repository_import(self.path)
+ end
+
+ # This method is not meant for consumption by the code
+ # It is meant for manual use in the case that a migration needs to be
+ # cancelled by an admin or SRE
+ def force_migration_cancel
+ return :error unless gitlab_api_client.supports_gitlab_api?
+
+ response = gitlab_api_client.cancel_repository_import(self.path, force: true)
+
+ skip_import(reason: :migration_forced_canceled) if response[:status] == :ok
+
+ response
+ end
+
def self.build_from_path(path)
self.new(project: path.repository_project,
name: path.repository_name)
@@ -478,6 +555,13 @@ class ContainerRepository < ApplicationRecord
self.find_by(project: path.repository_project,
name: path.repository_name)
end
+
+ private
+
+ def finish_import_as(reason)
+ self.migration_skipped_reason = reason
+ finish_import
+ end
end
ContainerRepository.prepend_mod_with('ContainerRepository')
diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb
index 173b38b2c63..09fbb93525b 100644
--- a/app/models/custom_emoji.rb
+++ b/app/models/custom_emoji.rb
@@ -28,6 +28,19 @@ class CustomEmoji < ApplicationRecord
alias_attribute :url, :file # this might need a change in https://gitlab.com/gitlab-org/gitlab/-/issues/230467
+ # Find custom emoji for the given resource.
+ # A resource can be either a Project or a Group, or anything responding to #root_ancestor.
+ # Usually it's the return value of #resource_parent on any model.
+ scope :for_resource, -> (resource) do
+ return none if resource.nil?
+
+ namespace = resource.root_ancestor
+
+ return none if namespace.nil? || Feature.disabled?(:custom_emoji, namespace)
+
+ namespace.custom_emoji
+ end
+
private
def valid_emoji_name
diff --git a/app/models/customer_relations/contact.rb b/app/models/customer_relations/contact.rb
index 4fa2c3fb8cf..cdb449e00bf 100644
--- a/app/models/customer_relations/contact.rb
+++ b/app/models/customer_relations/contact.rb
@@ -23,7 +23,7 @@ class CustomerRelations::Contact < ApplicationRecord
validates :last_name, presence: true, length: { maximum: 255 }
validates :email, length: { maximum: 255 }
validates :description, length: { maximum: 1024 }
- validates :email, uniqueness: { scope: :group_id }
+ validates :email, uniqueness: { case_sensitive: false, scope: :group_id }
validate :validate_email_format
validate :validate_root_group
@@ -42,7 +42,7 @@ class CustomerRelations::Contact < ApplicationRecord
def self.find_ids_by_emails(group, emails)
raise ArgumentError, "Cannot lookup more than #{MAX_PLUCK} emails" if emails.length > MAX_PLUCK
- where(group: group, email: emails).pluck(:id)
+ where(group: group).where('lower(email) in (?)', emails.map(&:downcase)).pluck(:id)
end
def self.exists_for_group?(group)
@@ -51,6 +51,34 @@ class CustomerRelations::Contact < ApplicationRecord
exists?(group: group)
end
+ def self.move_to_root_group(group)
+ update_query = <<~SQL
+ UPDATE #{CustomerRelations::IssueContact.table_name}
+ SET contact_id = new_contacts.id
+ FROM #{table_name} AS existing_contacts
+ JOIN #{table_name} AS new_contacts ON new_contacts.group_id = :old_group_id AND LOWER(new_contacts.email) = LOWER(existing_contacts.email)
+ WHERE existing_contacts.group_id = :new_group_id AND contact_id = existing_contacts.id
+ SQL
+ connection.execute(sanitize_sql([
+ update_query,
+ old_group_id: group.root_ancestor.id,
+ new_group_id: group.id
+ ]))
+
+ dupes_query = <<~SQL
+ DELETE FROM #{table_name} AS existing_contacts
+ USING #{table_name} AS new_contacts
+ WHERE existing_contacts.group_id = :new_group_id AND new_contacts.group_id = :old_group_id AND LOWER(new_contacts.email) = LOWER(existing_contacts.email)
+ SQL
+ connection.execute(sanitize_sql([
+ dupes_query,
+ old_group_id: group.root_ancestor.id,
+ new_group_id: group.id
+ ]))
+
+ where(group: group).update_all(group_id: group.root_ancestor.id)
+ end
+
private
def validate_email_format
diff --git a/app/models/customer_relations/issue_contact.rb b/app/models/customer_relations/issue_contact.rb
index dc7a3fd87bc..70a30e583d5 100644
--- a/app/models/customer_relations/issue_contact.rb
+++ b/app/models/customer_relations/issue_contact.rb
@@ -8,6 +8,8 @@ class CustomerRelations::IssueContact < ApplicationRecord
validate :contact_belongs_to_root_group
+ BATCH_DELETE_SIZE = 1_000
+
def self.find_contact_ids_by_emails(issue_id, emails)
raise ArgumentError, "Cannot lookup more than #{MAX_PLUCK} emails" if emails.length > MAX_PLUCK
@@ -17,9 +19,17 @@ class CustomerRelations::IssueContact < ApplicationRecord
end
def self.delete_for_project(project_id)
- joins(:issue)
- .where(issues: { project_id: project_id })
- .delete_all
+ loop do
+ deleted_records = joins(:issue).where(issues: { project_id: project_id }).limit(BATCH_DELETE_SIZE).delete_all
+ break if deleted_records == 0
+ end
+ end
+
+ def self.delete_for_group(group)
+ loop do
+ deleted_records = joins(issue: :project).where(projects: { namespace: group.self_and_descendants }).limit(BATCH_DELETE_SIZE).delete_all
+ break if deleted_records == 0
+ end
end
private
diff --git a/app/models/customer_relations/organization.rb b/app/models/customer_relations/organization.rb
index a23b9d8fe28..32adcc7492b 100644
--- a/app/models/customer_relations/organization.rb
+++ b/app/models/customer_relations/organization.rb
@@ -26,6 +26,34 @@ class CustomerRelations::Organization < ApplicationRecord
.where('LOWER(name) = LOWER(?)', name)
end
+ def self.move_to_root_group(group)
+ update_query = <<~SQL
+ UPDATE #{CustomerRelations::Contact.table_name}
+ SET organization_id = new_organizations.id
+ FROM #{table_name} AS existing_organizations
+ JOIN #{table_name} AS new_organizations ON new_organizations.group_id = :old_group_id AND LOWER(new_organizations.name) = LOWER(existing_organizations.name)
+ WHERE existing_organizations.group_id = :new_group_id AND organization_id = existing_organizations.id
+ SQL
+ connection.execute(sanitize_sql([
+ update_query,
+ old_group_id: group.root_ancestor.id,
+ new_group_id: group.id
+ ]))
+
+ dupes_query = <<~SQL
+ DELETE FROM #{table_name} AS existing_organizations
+ USING #{table_name} AS new_organizations
+ WHERE existing_organizations.group_id = :new_group_id AND new_organizations.group_id = :old_group_id AND LOWER(new_organizations.name) = LOWER(existing_organizations.name)
+ SQL
+ connection.execute(sanitize_sql([
+ dupes_query,
+ old_group_id: group.root_ancestor.id,
+ new_group_id: group.id
+ ]))
+
+ where(group: group).update_all(group_id: group.root_ancestor.id)
+ end
+
private
def validate_root_group
diff --git a/app/models/deploy_token.rb b/app/models/deploy_token.rb
index 326d3fb8470..360a9ffbc53 100644
--- a/app/models/deploy_token.rb
+++ b/app/models/deploy_token.rb
@@ -14,6 +14,11 @@ class DeployToken < ApplicationRecord
default_value_for(:expires_at) { Forever.date }
+ # Do NOT use this `user` for the authentication/authorization of the deploy tokens.
+ # It's for the auditing purpose on Credential Inventory, only.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/353467#note_859774246 for more information.
+ belongs_to :user, foreign_key: :creator_id, optional: true
+
has_many :project_deploy_tokens, inverse_of: :deploy_token
has_many :projects, through: :project_deploy_tokens
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index c06c809538a..63d531d82c3 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -14,8 +14,8 @@ class Deployment < ApplicationRecord
ARCHIVABLE_OFFSET = 50_000
- belongs_to :project, required: true
- belongs_to :environment, required: true
+ belongs_to :project, optional: false
+ belongs_to :environment, optional: false
belongs_to :cluster, class_name: 'Clusters::Cluster', optional: true
belongs_to :user
belongs_to :deployable, polymorphic: true, optional: true # rubocop:disable Cop/PolymorphicAssociations
@@ -46,7 +46,7 @@ class Deployment < ApplicationRecord
scope :for_project, -> (project_id) { where(project_id: project_id) }
scope :for_projects, -> (projects) { where(project: projects) }
- scope :visible, -> { where(status: %i[running success failed canceled blocked]) }
+ scope :visible, -> { where(status: VISIBLE_STATUSES) }
scope :stoppable, -> { where.not(on_stop: nil).where.not(deployable_id: nil).success }
scope :active, -> { where(status: %i[created running]) }
scope :upcoming, -> { where(status: %i[blocked running]) }
@@ -58,6 +58,7 @@ class Deployment < ApplicationRecord
scope :ordered, -> { order(finished_at: :desc) }
+ VISIBLE_STATUSES = %i[running success failed canceled blocked].freeze
FINISHED_STATUSES = %i[success failed canceled].freeze
state_machine :status, initial: :created do
@@ -380,6 +381,12 @@ class Deployment < ApplicationRecord
status == params[:status]
end
+ def tier_in_yaml
+ return unless deployable
+
+ deployable.environment_deployment_tier
+ end
+
private
def update_status!(status)
diff --git a/app/models/discussion.rb b/app/models/discussion.rb
index 8a167034629..9eb3308b901 100644
--- a/app/models/discussion.rb
+++ b/app/models/discussion.rb
@@ -47,6 +47,14 @@ class Discussion
grouped_notes.values.map { |notes| build(notes, context_noteable) }
end
+ def self.build_discussions(discussion_ids, context_noteable = nil, preload_note_diff_file: false)
+ notes = Note.where(discussion_id: discussion_ids).fresh
+ notes = notes.inc_note_diff_file if preload_note_diff_file
+
+ grouped_notes = notes.group_by { |n| n.discussion_id }
+ grouped_notes.transform_values { |notes| Discussion.build(notes, context_noteable) }
+ end
+
def self.lazy_find(discussion_id)
BatchLoader.for(discussion_id).batch do |discussion_ids, loader|
results = Note.where(discussion_id: discussion_ids).fresh.to_a.group_by(&:discussion_id)
diff --git a/app/models/environment.rb b/app/models/environment.rb
index 450ed6206d5..9e663b2ee74 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -12,7 +12,7 @@ class Environment < ApplicationRecord
self.reactive_cache_hard_limit = 10.megabytes
self.reactive_cache_work_type = :external_dependency
- belongs_to :project, required: true
+ belongs_to :project, optional: false
use_fast_destroy :all_deployments
nullify_if_blank :external_url
@@ -26,7 +26,7 @@ class Environment < ApplicationRecord
has_many :self_managed_prometheus_alert_events, inverse_of: :environment
has_many :alert_management_alerts, class_name: 'AlertManagement::Alert', inverse_of: :environment
- has_one :last_deployment, -> { success.distinct_on_environment }, class_name: 'Deployment', inverse_of: :environment
+ has_one :last_deployment, -> { Feature.enabled?(:env_last_deployment_by_finished_at, default_enabled: :yaml) ? success.ordered : success.distinct_on_environment }, class_name: 'Deployment', inverse_of: :environment
has_one :last_visible_deployment, -> { visible.distinct_on_environment }, inverse_of: :environment, class_name: 'Deployment'
has_one :last_visible_deployable, through: :last_visible_deployment, source: 'deployable', source_type: 'CommitStatus', disable_joins: true
has_one :last_visible_pipeline, through: :last_visible_deployable, source: 'pipeline', disable_joins: true
@@ -59,17 +59,17 @@ class Environment < ApplicationRecord
allow_nil: true,
addressable_url: true
- delegate :stop_action, :manual_actions, to: :last_deployment, allow_nil: true
+ delegate :manual_actions, to: :last_deployment, allow_nil: true
delegate :auto_rollback_enabled?, to: :project
scope :available, -> { with_state(:available) }
scope :stopped, -> { with_state(:stopped) }
scope :order_by_last_deployed_at, -> do
- order(Gitlab::Database.nulls_first_order("(#{max_deployment_id_sql})", 'ASC'))
+ order(Arel::Nodes::Grouping.new(max_deployment_id_query).asc.nulls_first)
end
scope :order_by_last_deployed_at_desc, -> do
- order(Gitlab::Database.nulls_last_order("(#{max_deployment_id_sql})", 'DESC'))
+ order(Arel::Nodes::Grouping.new(max_deployment_id_query).desc.nulls_last)
end
scope :order_by_name, -> { order('environments.name ASC') }
@@ -89,13 +89,19 @@ class Environment < ApplicationRecord
scope :for_project, -> (project) { where(project_id: project) }
scope :for_tier, -> (tier) { where(tier: tier).where.not(tier: nil) }
- scope :with_deployment, -> (sha) { where('EXISTS (?)', Deployment.select(1).where('deployments.environment_id = environments.id').where(sha: sha)) }
scope :unfoldered, -> { where(environment_type: nil) }
scope :with_rank, -> do
select('environments.*, rank() OVER (PARTITION BY project_id ORDER BY id DESC)')
end
scope :for_id, -> (id) { where(id: id) }
+ scope :with_deployment, -> (sha, status: nil) do
+ deployments = Deployment.select(1).where('deployments.environment_id = environments.id').where(sha: sha)
+ deployments = deployments.where(status: status) if status
+
+ where('EXISTS (?)', deployments)
+ end
+
scope :stopped_review_apps, -> (before, limit) do
stopped
.in_review_folder
@@ -145,10 +151,11 @@ class Environment < ApplicationRecord
find_by(id: id, slug: slug)
end
- def self.max_deployment_id_sql
- Deployment.select(Deployment.arel_table[:id].maximum)
- .where(Deployment.arel_table[:environment_id].eq(arel_table[:id]))
- .to_sql
+ def self.max_deployment_id_query
+ Arel.sql(
+ Deployment.select(Deployment.arel_table[:id].maximum)
+ .where(Deployment.arel_table[:environment_id].eq(arel_table[:id])).to_sql
+ )
end
def self.pluck_names
@@ -185,6 +192,23 @@ class Environment < ApplicationRecord
last_deployment&.deployable
end
+ def last_deployment_pipeline
+ last_deployable&.pipeline
+ end
+
+ # This method returns the deployment records of the last deployment pipeline, that successfully executed to this environment.
+ # e.g.
+ # A pipeline contains
+ # - deploy job A => production environment
+ # - deploy job B => production environment
+ # In this case, `last_deployment_group` returns both deployments, whereas `last_deployable` returns only B.
+ def last_deployment_group
+ return Deployment.none unless last_deployment_pipeline
+
+ successful_deployments.where(
+ deployable_id: last_deployment_pipeline.latest_builds.pluck(:id))
+ end
+
# NOTE: Below assocation overrides is a workaround for issue https://gitlab.com/gitlab-org/gitlab/-/issues/339908
# It helps to avoid cross joins with the CI database.
# Caveat: It also overrides and losses the default AR caching mechanism.
@@ -255,8 +279,8 @@ class Environment < ApplicationRecord
external_url.gsub(%r{\A.*?://}, '')
end
- def stop_action_available?
- available? && stop_action.present?
+ def stop_actions_available?
+ available? && stop_actions.present?
end
def cancel_deployment_jobs!
@@ -269,11 +293,35 @@ class Environment < ApplicationRecord
end
end
- def stop_with_action!(current_user)
+ def stop_with_actions!(current_user)
return unless available?
stop!
- stop_action&.play(current_user)
+
+ actions = []
+
+ stop_actions.each do |stop_action|
+ Gitlab::OptimisticLocking.retry_lock(
+ stop_action,
+ name: 'environment_stop_with_actions'
+ ) do |build|
+ actions << build.play(current_user)
+ end
+ end
+
+ actions
+ end
+
+ def stop_actions
+ strong_memoize(:stop_actions) do
+ if ::Feature.enabled?(:environment_multiple_stop_actions, project, default_enabled: :yaml)
+ # Fix N+1 queries it brings to the serializer.
+ # Tracked in https://gitlab.com/gitlab-org/gitlab/-/issues/358780
+ last_deployment_group.map(&:stop_action).compact
+ else
+ [last_deployment&.stop_action].compact
+ end
+ end
end
def reset_auto_stop
diff --git a/app/models/environment_status.rb b/app/models/environment_status.rb
index 07c0983f239..43b2c7899a1 100644
--- a/app/models/environment_status.rb
+++ b/app/models/environment_status.rb
@@ -51,7 +51,7 @@ class EnvironmentStatus
def deployment
strong_memoize(:deployment) do
- Deployment.where(environment: environment).find_by_sha(sha)
+ Deployment.where(environment: environment).ordered.find_by_sha(sha)
end
end
diff --git a/app/models/error_tracking/project_error_tracking_setting.rb b/app/models/error_tracking/project_error_tracking_setting.rb
index 0a429bb7afd..3ecfb895dac 100644
--- a/app/models/error_tracking/project_error_tracking_setting.rb
+++ b/app/models/error_tracking/project_error_tracking_setting.rb
@@ -135,7 +135,7 @@ module ErrorTracking
end
end
- def update_issue(opts = {} )
+ def update_issue(opts = {})
handle_exceptions do
{ updated: sentry_client.update_issue(opts) }
end
diff --git a/app/models/event.rb b/app/models/event.rb
index a8cf2e2dfb0..e9a98c06b59 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -10,6 +10,7 @@ class Event < ApplicationRecord
include UsageStatistics
include ShaAttribute
+ # TODO https://gitlab.com/gitlab-org/gitlab/-/issues/358088
default_scope { reorder(nil) } # rubocop:disable Cop/DefaultScope
ACTIONS = HashWithIndifferentAccess.new(
@@ -30,8 +31,9 @@ class Event < ApplicationRecord
private_constant :ACTIONS
WIKI_ACTIONS = [:created, :updated, :destroyed].freeze
-
DESIGN_ACTIONS = [:created, :updated, :destroyed].freeze
+ TEAM_ACTIONS = [:joined, :left, :expired].freeze
+ ISSUE_ACTIONS = [:created, :updated, :closed, :reopened].freeze
TARGET_TYPES = HashWithIndifferentAccess.new(
issue: Issue,
diff --git a/app/models/group.rb b/app/models/group.rb
index 14d088dd38b..990c06fdc41 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -17,6 +17,7 @@ class Group < Namespace
include GroupAPICompatibility
include EachBatch
include BulkMemberAccessLoad
+ include BulkUsersByEmailLoad
include ChronicDurationAttribute
include RunnerTokenExpirationInterval
@@ -42,7 +43,28 @@ class Group < Namespace
has_many :milestones
has_many :integrations
has_many :shared_group_links, foreign_key: :shared_with_group_id, class_name: 'GroupGroupLink'
- has_many :shared_with_group_links, foreign_key: :shared_group_id, class_name: 'GroupGroupLink'
+ has_many :shared_with_group_links, foreign_key: :shared_group_id, class_name: 'GroupGroupLink' do
+ def of_ancestors
+ group = proxy_association.owner
+
+ return GroupGroupLink.none unless group.has_parent?
+
+ GroupGroupLink.where(shared_group_id: group.ancestors.reorder(nil).select(:id))
+ end
+
+ def of_ancestors_and_self
+ group = proxy_association.owner
+
+ source_ids =
+ if group.has_parent?
+ group.self_and_ancestors.reorder(nil).select(:id)
+ else
+ group.id
+ end
+
+ GroupGroupLink.where(shared_group_id: source_ids)
+ end
+ end
has_many :shared_groups, through: :shared_group_links, source: :shared_group
has_many :shared_with_groups, through: :shared_with_group_links, source: :shared_with_group
has_many :project_group_links, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
@@ -60,8 +82,9 @@ class Group < Namespace
has_many :boards
has_many :badges, class_name: 'GroupBadge'
- has_many :organizations, class_name: 'CustomerRelations::Organization', inverse_of: :group
- has_many :contacts, class_name: 'CustomerRelations::Contact', inverse_of: :group
+ # AR defaults to nullify when trying to delete via has_many associations unless we set dependent: :delete_all
+ has_many :organizations, class_name: 'CustomerRelations::Organization', inverse_of: :group, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
+ has_many :contacts, class_name: 'CustomerRelations::Contact', inverse_of: :group, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
has_many :cluster_groups, class_name: 'Clusters::Group'
has_many :clusters, through: :cluster_groups, class_name: 'Clusters::Cluster'
@@ -94,6 +117,8 @@ class Group < Namespace
has_many :group_callouts, class_name: 'Users::GroupCallout', foreign_key: :group_id
+ has_one :group_feature, inverse_of: :group, class_name: 'Groups::FeatureSetting'
+
delegate :prevent_sharing_groups_outside_hierarchy, :new_user_signups_cap, :setup_for_company, :jobs_to_be_done, to: :namespace_settings
delegate :runner_token_expiration_interval, :runner_token_expiration_interval=, :runner_token_expiration_interval_human_readable, :runner_token_expiration_interval_human_readable=, to: :namespace_settings, allow_nil: true
delegate :subgroup_runner_token_expiration_interval, :subgroup_runner_token_expiration_interval=, :subgroup_runner_token_expiration_interval_human_readable, :subgroup_runner_token_expiration_interval_human_readable=, to: :namespace_settings, allow_nil: true
@@ -102,6 +127,7 @@ class Group < Namespace
has_one :crm_settings, class_name: 'Group::CrmSettings', inverse_of: :group
accepts_nested_attributes_for :variables, allow_destroy: true
+ accepts_nested_attributes_for :group_feature, update_only: true
validate :visibility_level_allowed_by_projects
validate :visibility_level_allowed_by_sub_groups
@@ -117,6 +143,8 @@ class Group < Namespace
message: Gitlab::Regex.group_name_regex_message },
if: :name_changed?
+ validates :group_feature, presence: true
+
add_authentication_token_field :runners_token,
encrypted: -> { Feature.enabled?(:groups_tokens_optional_encryption, default_enabled: true) ? :optional : :required },
prefix: RunnersTokenPrefixable::RUNNERS_TOKEN_PREFIX
@@ -125,6 +153,7 @@ class Group < Namespace
after_destroy :post_destroy_hook
after_save :update_two_factor_requirement
after_update :path_changed_hook, if: :saved_change_to_path?
+ after_create -> { create_or_load_association(:group_feature) }
scope :with_users, -> { includes(:users) }
@@ -344,14 +373,16 @@ class Group < Namespace
)
end
- def add_user(user, access_level, current_user: nil, expires_at: nil, ldap: false)
- Members::Groups::CreatorService.new(self, # rubocop:disable CodeReuse/ServiceClass
- user,
- access_level,
- current_user: current_user,
- expires_at: expires_at,
- ldap: ldap)
- .execute
+ def add_user(user, access_level, current_user: nil, expires_at: nil, ldap: false, blocking_refresh: true)
+ Members::Groups::CreatorService.new( # rubocop:disable CodeReuse/ServiceClass
+ self,
+ user,
+ access_level,
+ current_user: current_user,
+ expires_at: expires_at,
+ ldap: ldap,
+ blocking_refresh: blocking_refresh
+ ).execute
end
def add_guest(user, current_user = nil)
@@ -794,6 +825,10 @@ class Group < Namespace
super || build_dependency_proxy_setting
end
+ def group_feature
+ super || build_group_feature
+ end
+
def crm_enabled?
crm_settings&.enabled?
end
@@ -813,8 +848,32 @@ class Group < Namespace
].compact.min
end
+ def work_items_feature_flag_enabled?
+ feature_flag_enabled_for_self_or_ancestor?(:work_items)
+ end
+
+ # Check for enabled features, similar to `Project#feature_available?`
+ # NOTE: We still want to keep this after removing `Namespace#feature_available?`.
+ override :feature_available?
+ def feature_available?(feature, user = nil)
+ if ::Groups::FeatureSetting.available_features.include?(feature)
+ group_feature.feature_available?(feature, user) # rubocop:disable Gitlab/FeatureAvailableUsage
+ else
+ super
+ end
+ end
+
private
+ def feature_flag_enabled_for_self_or_ancestor?(feature_flag)
+ actors = [root_ancestor]
+ actors << self if root_ancestor != self
+
+ actors.any? do |actor|
+ ::Feature.enabled?(feature_flag, actor, default_enabled: :yaml)
+ end
+ end
+
def max_member_access(user_ids)
Gitlab::SafeRequestLoader.execute(resource_key: max_member_access_for_resource_key(User),
resource_ids: user_ids,
diff --git a/app/models/group_group_link.rb b/app/models/group_group_link.rb
index c4c3fc390e1..b0020f097b5 100644
--- a/app/models/group_group_link.rb
+++ b/app/models/group_group_link.rb
@@ -16,6 +16,19 @@ class GroupGroupLink < ApplicationRecord
scope :non_guests, -> { where('group_access > ?', Gitlab::Access::GUEST) }
scope :preload_shared_with_groups, -> { preload(:shared_with_group) }
+ scope :distinct_on_shared_with_group_id_with_group_access, -> do
+ distinct_group_links = select('DISTINCT ON (shared_with_group_id) *')
+ .order('shared_with_group_id, group_access DESC, expires_at DESC, created_at ASC')
+
+ unscoped.from(distinct_group_links, :group_group_links)
+ end
+
+ alias_method :shared_from, :shared_group
+
+ def self.search(query)
+ joins(:shared_with_group).merge(Group.search(query))
+ end
+
def self.access_options
Gitlab::Access.options_with_owner
end
diff --git a/app/models/groups/feature_setting.rb b/app/models/groups/feature_setting.rb
new file mode 100644
index 00000000000..72d0851ea85
--- /dev/null
+++ b/app/models/groups/feature_setting.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Groups
+ class FeatureSetting < ApplicationRecord
+ include Featurable
+ extend ::Gitlab::Utils::Override
+
+ self.primary_key = :group_id
+ self.table_name = 'group_features'
+
+ belongs_to :group
+
+ validates :group, presence: true
+
+ private
+
+ override :resource_member?
+ def resource_member?(user, feature)
+ group.member?(user, ::Groups::FeatureSetting.required_minimum_access_level(feature))
+ end
+ end
+end
+
+::Groups::FeatureSetting.prepend_mod_with('Groups::FeatureSetting')
diff --git a/app/models/integration.rb b/app/models/integration.rb
index 274c16507b7..c0e244e38b6 100644
--- a/app/models/integration.rb
+++ b/app/models/integration.rb
@@ -10,9 +10,11 @@ class Integration < ApplicationRecord
include FromUnion
include EachBatch
include IgnorableColumns
+ extend ::Gitlab::Utils::Override
ignore_column :template, remove_with: '15.0', remove_after: '2022-04-22'
ignore_column :type, remove_with: '15.0', remove_after: '2022-04-22'
+ ignore_column :properties, remove_with: '15.1', remove_after: '2022-05-22'
UnknownType = Class.new(StandardError)
@@ -47,10 +49,7 @@ class Integration < ApplicationRecord
SECTION_TYPE_CONNECTION = 'connection'
- serialize :properties, JSON # rubocop:disable Cop/ActiveRecordSerialize
-
- attr_encrypted :encrypted_properties_tmp,
- attribute: :encrypted_properties,
+ attr_encrypted :properties,
mode: :per_attribute_iv,
key: Settings.attr_encrypted_db_key_base_32,
algorithm: 'aes-256-gcm',
@@ -59,6 +58,15 @@ class Integration < ApplicationRecord
encode: false,
encode_iv: false
+ # Handle assignment of props with symbol keys.
+ # To do this correctly, we need to call the method generated by attr_encrypted.
+ alias_method :attr_encrypted_props=, :properties=
+ private :attr_encrypted_props=
+
+ def properties=(props)
+ self.attr_encrypted_props = props&.with_indifferent_access&.freeze
+ end
+
alias_attribute :type, :type_new
default_value_for :active, false
@@ -77,8 +85,6 @@ class Integration < ApplicationRecord
default_value_for :wiki_page_events, true
after_initialize :initialize_properties
- after_initialize :copy_properties_to_encrypted_properties
- before_save :copy_properties_to_encrypted_properties
after_commit :reset_updated_properties
@@ -96,6 +102,9 @@ class Integration < ApplicationRecord
validate :validate_belongs_to_project_or_group
scope :external_issue_trackers, -> { where(category: 'issue_tracker').active }
+ # TODO: Will be modified in 15.0
+ # Details: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74501#note_744393645
+ scope :third_party_wikis, -> { where(type: %w[Integrations::Confluence Integrations::Shimo]).active }
scope :by_name, ->(name) { by_type(integration_name_to_type(name)) }
scope :external_wikis, -> { by_name(:external_wiki).active }
scope :active, -> { where(active: true) }
@@ -162,16 +171,14 @@ class Integration < ApplicationRecord
class_eval <<~RUBY, __FILE__, __LINE__ + 1
unless method_defined?(arg)
def #{arg}
- properties['#{arg}']
+ properties['#{arg}'] if properties.present?
end
end
def #{arg}=(value)
self.properties ||= {}
- self.encrypted_properties_tmp = properties
updated_properties['#{arg}'] = #{arg} unless #{arg}_changed?
- self.properties['#{arg}'] = value
- self.encrypted_properties_tmp['#{arg}'] = value
+ self.properties = self.properties.merge('#{arg}' => value)
end
def #{arg}_changed?
@@ -192,11 +199,13 @@ class Integration < ApplicationRecord
# Provide convenient boolean accessor methods for each serialized property.
# Also keep track of updated properties in a similar way as ActiveModel::Dirty
def self.boolean_accessor(*args)
- self.prop_accessor(*args)
+ prop_accessor(*args)
args.each do |arg|
class_eval <<~RUBY, __FILE__, __LINE__ + 1
def #{arg}
+ return if properties.blank?
+
Gitlab::Utils.to_boolean(properties['#{arg}'])
end
@@ -315,18 +324,31 @@ class Integration < ApplicationRecord
def self.build_from_integration(integration, project_id: nil, group_id: nil)
new_integration = integration.dup
- if integration.supports_data_fields?
- data_fields = integration.data_fields.dup
- data_fields.integration = new_integration
- end
-
new_integration.instance = false
new_integration.project_id = project_id
new_integration.group_id = group_id
- new_integration.inherit_from_id = integration.id if integration.instance_level? || integration.group_level?
+ new_integration.inherit_from_id = integration.id if integration.inheritable?
new_integration
end
+ # Duplicating an integration also duplicates the data fields. Duped records have different ciphertexts.
+ override :dup
+ def dup
+ new_integration = super
+ new_integration.assign_attributes(reencrypt_properties)
+
+ if supports_data_fields?
+ fields = data_fields.dup
+ fields.integration = new_integration
+ end
+
+ new_integration
+ end
+
+ def inheritable?
+ instance_level? || group_level?
+ end
+
def self.instance_exists_for?(type)
exists?(instance: true, type: type)
end
@@ -350,16 +372,17 @@ class Integration < ApplicationRecord
end
private_class_method :instance_level_integration
- def self.create_from_active_default_integrations(scope, association)
- group_ids = sorted_ancestors(scope).select(:id)
+ # Returns the number of successfully saved integrations
+ # Duplicate integrations are excluded from this count by their validations.
+ def self.create_from_active_default_integrations(owner, association)
+ group_ids = sorted_ancestors(owner).select(:id)
array = group_ids.to_sql.present? ? "array(#{group_ids.to_sql})" : 'ARRAY[]'
+ order = Arel.sql("type_new ASC, array_position(#{array}::bigint[], #{table_name}.group_id), instance DESC")
- from_union([
- active.where(instance: true),
- active.where(group_id: group_ids, inherit_from_id: nil)
- ]).order(Arel.sql("type_new ASC, array_position(#{array}::bigint[], #{table_name}.group_id), instance DESC")).group_by(&:type).each do |type, records|
- build_from_integration(records.first, association => scope.id).save
- end
+ from_union([active.where(instance: true), active.where(group_id: group_ids, inherit_from_id: nil)])
+ .order(order)
+ .group_by(&:type)
+ .count { |type, parents| build_from_integration(parents.first, association => owner.id).save }
end
def self.inherited_descendants_from_self_or_ancestors_from(integration)
@@ -398,13 +421,7 @@ class Integration < ApplicationRecord
end
def initialize_properties
- self.properties = {} if has_attribute?(:properties) && properties.nil?
- end
-
- def copy_properties_to_encrypted_properties
- self.encrypted_properties_tmp = properties
- rescue ActiveModel::MissingAttributeError
- # ignore - in a record built from using a restricted select list
+ self.properties = {} if has_attribute?(:encrypted_properties) && encrypted_properties.nil?
end
def title
@@ -428,7 +445,9 @@ class Integration < ApplicationRecord
[]
end
- def password_fields
+ # TODO: Once all integrations use `Integrations::Field` we can
+ # use `#secret?` here.
+ def secret_fields
fields.select { |f| f[:type] == 'password' }.pluck(:name)
end
@@ -439,21 +458,26 @@ class Integration < ApplicationRecord
%w[active]
end
+ # properties is always nil - ignore it.
+ override :attributes
+ def attributes
+ super.except('properties')
+ end
+
# return a hash of columns => values suitable for passing to insert_all
def to_integration_hash
column = self.class.attribute_aliases.fetch('type', 'type')
- copy_properties_to_encrypted_properties
- as_json(except: %w[id instance project_id group_id encrypted_properties_tmp])
+ as_json(except: %w[id instance project_id group_id])
.merge(column => type)
.merge(reencrypt_properties)
end
def reencrypt_properties
unless properties.nil? || properties.empty?
- alg = self.class.encrypted_attributes[:encrypted_properties_tmp][:algorithm]
+ alg = self.class.encrypted_attributes[:properties][:algorithm]
iv = generate_iv(alg)
- ep = self.class.encrypt(:encrypted_properties_tmp, properties, { iv: iv })
+ ep = self.class.encrypt(:properties, properties, { iv: iv })
end
{ 'encrypted_properties' => ep, 'encrypted_properties_iv' => iv }
diff --git a/app/models/integrations/base_chat_notification.rb b/app/models/integrations/base_chat_notification.rb
index d5b6357cb66..54bd595892f 100644
--- a/app/models/integrations/base_chat_notification.rb
+++ b/app/models/integrations/base_chat_notification.rb
@@ -35,8 +35,9 @@ module Integrations
validates :labels_to_be_notified_behavior, inclusion: { in: LABEL_NOTIFICATION_BEHAVIOURS }, allow_blank: true
def initialize_properties
- if properties.nil?
- self.properties = {}
+ super
+
+ if properties.empty?
self.notify_only_broken_pipelines = true
self.branches_to_be_notified = "default"
self.labels_to_be_notified_behavior = MATCH_ANY_LABEL
diff --git a/app/models/integrations/base_issue_tracker.rb b/app/models/integrations/base_issue_tracker.rb
index 458d0199e7a..bffe87c21ee 100644
--- a/app/models/integrations/base_issue_tracker.rb
+++ b/app/models/integrations/base_issue_tracker.rb
@@ -25,12 +25,15 @@ module Integrations
def handle_properties
# this has been moved from initialize_properties and should be improved
# as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
- return unless properties
+ return unless properties.present?
+
+ safe_keys = data_fields.attributes.keys.grep_v(/encrypted/) - %w[id service_id created_at]
@legacy_properties_data = properties.dup
- data_values = properties.slice!('title', 'description')
+
+ data_values = properties.slice(*safe_keys)
data_values.reject! { |key| data_fields.changed.include?(key) }
- data_values.slice!(*data_fields.attributes.keys)
+
data_fields.assign_attributes(data_values) if data_values.present?
self.properties = {}
@@ -68,10 +71,6 @@ module Integrations
issue_url(iid)
end
- def initialize_properties
- {}
- end
-
# Initialize with default properties values
def set_default_data
return unless issues_tracker.present?
diff --git a/app/models/integrations/base_third_party_wiki.rb b/app/models/integrations/base_third_party_wiki.rb
new file mode 100644
index 00000000000..24f5bec93cf
--- /dev/null
+++ b/app/models/integrations/base_third_party_wiki.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module Integrations
+ class BaseThirdPartyWiki < Integration
+ default_value_for :category, 'third_party_wiki'
+
+ validate :only_one_third_party_wiki, if: :activated?, on: :manual_change
+
+ after_commit :cache_project_has_integration
+
+ def self.supported_events
+ %w()
+ end
+
+ private
+
+ def only_one_third_party_wiki
+ return unless project_level?
+
+ if project.integrations.third_party_wikis.id_not_in(id).any?
+ errors.add(:base, _('Another third-party wiki is already in use. '\
+ 'Only one third-party wiki integration can be active at a time'))
+ end
+ end
+
+ def cache_project_has_integration
+ return unless project && !project.destroyed?
+
+ project_setting = project.project_setting
+
+ project_setting.public_send("#{project_settings_cache_key}=", active?) # rubocop:disable GitlabSecurity/PublicSend
+ project_setting.save!
+ end
+
+ def project_settings_cache_key
+ "has_#{self.class.to_param}"
+ end
+ end
+end
diff --git a/app/models/integrations/buildkite.rb b/app/models/integrations/buildkite.rb
index 90593d78a5d..b816f90ef52 100644
--- a/app/models/integrations/buildkite.rb
+++ b/app/models/integrations/buildkite.rb
@@ -27,12 +27,12 @@ module Integrations
end
# Since SSL verification will always be enabled for Buildkite,
- # we no longer needs to store the boolean.
+ # we no longer need to store the boolean.
# This is a stub method to work with deprecated API param.
# TODO: remove enable_ssl_verification after 14.0
# https://gitlab.com/gitlab-org/gitlab/-/issues/222808
def enable_ssl_verification=(_value)
- self.properties.delete('enable_ssl_verification') # Remove unused key
+ self.properties = properties.except('enable_ssl_verification') # Remove unused key
end
override :hook_url
diff --git a/app/models/integrations/confluence.rb b/app/models/integrations/confluence.rb
index 65adce7a8d6..4e1d1993d02 100644
--- a/app/models/integrations/confluence.rb
+++ b/app/models/integrations/confluence.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module Integrations
- class Confluence < Integration
+ class Confluence < BaseThirdPartyWiki
VALID_SCHEME_MATCH = %r{\Ahttps?\Z}.freeze
VALID_HOST_MATCH = %r{\A.+\.atlassian\.net\Z}.freeze
VALID_PATH_MATCH = %r{\A/wiki(/|\Z)}.freeze
@@ -11,16 +11,10 @@ module Integrations
validates :confluence_url, presence: true, if: :activated?
validate :validate_confluence_url_is_cloud, if: :activated?
- after_commit :cache_project_has_confluence
-
def self.to_param
'confluence'
end
- def self.supported_events
- %w()
- end
-
def title
s_('ConfluenceService|Confluence Workspace')
end
@@ -80,12 +74,5 @@ module Integrations
rescue URI::InvalidURIError
false
end
-
- def cache_project_has_confluence
- return unless project && !project.destroyed?
-
- project.project_setting.save! unless project.project_setting.persisted?
- project.project_setting.update_column(:has_confluence, active?)
- end
end
end
diff --git a/app/models/integrations/emails_on_push.rb b/app/models/integrations/emails_on_push.rb
index a9cd67550dc..ab458bb2c27 100644
--- a/app/models/integrations/emails_on_push.rb
+++ b/app/models/integrations/emails_on_push.rb
@@ -13,9 +13,7 @@ module Integrations
validate :number_of_recipients_within_limit, if: :validate_recipients?
def self.valid_recipients(recipients)
- recipients.split.select do |recipient|
- recipient.include?('@')
- end.uniq(&:downcase)
+ recipients.split.grep(Devise.email_regexp).uniq(&:downcase)
end
def title
diff --git a/app/models/integrations/field.rb b/app/models/integrations/field.rb
index 49ab97677db..f00c4236a92 100644
--- a/app/models/integrations/field.rb
+++ b/app/models/integrations/field.rb
@@ -2,7 +2,7 @@
module Integrations
class Field
- SENSITIVE_NAME = %r/token|key|password|passphrase|secret/.freeze
+ SECRET_NAME = %r/token|key|password|passphrase|secret/.freeze
ATTRIBUTES = %i[
section type placeholder required choices value checkbox_label
@@ -17,7 +17,7 @@ module Integrations
def initialize(name:, type: 'text', api_only: false, **attributes)
@name = name.to_s.freeze
- attributes[:type] = SENSITIVE_NAME.match?(@name) ? 'password' : type
+ attributes[:type] = SECRET_NAME.match?(@name) ? 'password' : type
attributes[:api_only] = api_only
@attributes = attributes.freeze
end
@@ -31,7 +31,7 @@ module Integrations
value
end
- def sensitive?
+ def secret?
@attributes[:type] == 'password'
end
diff --git a/app/models/integrations/jira.rb b/app/models/integrations/jira.rb
index 74ece57000f..a800b9e5baa 100644
--- a/app/models/integrations/jira.rb
+++ b/app/models/integrations/jira.rb
@@ -94,10 +94,6 @@ module Integrations
!!URI(url).hostname&.end_with?(JIRA_CLOUD_HOST)
end
- def initialize_properties
- {}
- end
-
def data_fields
jira_tracker_data || self.build_jira_tracker_data
end
@@ -106,7 +102,7 @@ module Integrations
return unless reset_password?
data_fields.password = nil
- properties.delete('password') if properties
+ self.properties = properties.except('password')
end
def set_default_data
@@ -143,7 +139,7 @@ module Integrations
end
def help
- jira_doc_link_start = '<a href="%{url}">'.html_safe % { url: help_page_url('integration/jira/index.html') }
+ jira_doc_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('integration/jira/index') }
s_("JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}") % { jira_doc_link_start: jira_doc_link_start, link_end: '</a>'.html_safe }
end
@@ -160,8 +156,6 @@ module Integrations
end
def sections
- jira_issues_link_start = '<a href="%{url}">'.html_safe % { url: help_page_url('integration/jira/issues.html') }
-
sections = [
{
type: SECTION_TYPE_CONNECTION,
@@ -180,7 +174,7 @@ module Integrations
sections.push({
type: SECTION_TYPE_JIRA_ISSUES,
title: _('Issues'),
- description: s_('JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}') % { jira_issues_link_start: jira_issues_link_start, link_end: '</a>'.html_safe }
+ description: jira_issues_section_description
})
end
@@ -610,6 +604,19 @@ module Integrations
data_fields.deployment_server!
end
end
+
+ def jira_issues_section_description
+ jira_issues_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('integration/jira/issues') }
+ description = s_('JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}') % { jira_issues_link_start: jira_issues_link_start, link_end: '</a>'.html_safe }
+
+ if project&.issues_enabled?
+ gitlab_issues_link_start = '<a href="%{url}">'.html_safe % { url: edit_project_path(project, anchor: 'js-shared-permissions') }
+ description += '<br><br>'.html_safe
+ description += s_("JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{gitlab_issues_link_start}disabling GitLab issues%{link_end} if they won't otherwise be used.") % { gitlab_issues_link_start: gitlab_issues_link_start, link_end: '</a>'.html_safe }
+ end
+
+ description
+ end
end
end
diff --git a/app/models/integrations/pipelines_email.rb b/app/models/integrations/pipelines_email.rb
index 6dc41958daa..f15482dc2e1 100644
--- a/app/models/integrations/pipelines_email.rb
+++ b/app/models/integrations/pipelines_email.rb
@@ -12,8 +12,9 @@ module Integrations
validate :number_of_recipients_within_limit, if: :validate_recipients?
def initialize_properties
- if properties.nil?
- self.properties = {}
+ super
+
+ if properties.blank?
self.notify_only_broken_pipelines = true
self.branches_to_be_notified = "default"
elsif !self.notify_only_default_branch.nil?
diff --git a/app/models/integrations/prometheus.rb b/app/models/integrations/prometheus.rb
index 2e275dab91b..d6aafe45ae9 100644
--- a/app/models/integrations/prometheus.rb
+++ b/app/models/integrations/prometheus.rb
@@ -32,12 +32,6 @@ module Integrations
scope :preload_project, -> { preload(:project) }
scope :with_clusters_with_cilium, -> { joins(project: [:clusters]).merge(Clusters::Cluster.with_available_cilium) }
- def initialize_properties
- if properties.nil?
- self.properties = {}
- end
- end
-
def show_active_box?
false
end
diff --git a/app/models/integrations/shimo.rb b/app/models/integrations/shimo.rb
index 0e1023bb7a7..dd25a0bc558 100644
--- a/app/models/integrations/shimo.rb
+++ b/app/models/integrations/shimo.rb
@@ -1,12 +1,10 @@
# frozen_string_literal: true
module Integrations
- class Shimo < Integration
+ class Shimo < BaseThirdPartyWiki
prop_accessor :external_wiki_url
validates :external_wiki_url, presence: true, public_url: true, if: :activated?
- after_commit :cache_project_has_shimo
-
def render?
return false unless Feature.enabled?(:shimo_integration, project)
@@ -33,10 +31,6 @@ module Integrations
nil
end
- def self.supported_events
- %w()
- end
-
def fields
[
{
@@ -47,14 +41,5 @@ module Integrations
}
]
end
-
- private
-
- def cache_project_has_shimo
- return unless project && !project.destroyed?
-
- project.project_setting.save! unless project.project_setting.persisted?
- project.project_setting.update_column(:has_shimo, activated?)
- end
end
end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 75727fff2cd..c2b8b457049 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -118,13 +118,15 @@ class Issue < ApplicationRecord
scope :not_authored_by, ->(user) { where.not(author_id: user) }
- 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_due_date_asc, -> { reorder(arel_table[:due_date].asc.nulls_last) }
+ scope :order_due_date_desc, -> { reorder(arel_table[:due_date].desc.nulls_last) }
scope :order_closest_future_date, -> { reorder(Arel.sql('CASE WHEN issues.due_date >= CURRENT_DATE THEN 0 ELSE 1 END ASC, ABS(CURRENT_DATE - issues.due_date) ASC')) }
scope :order_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') }
scope :order_severity_desc, -> { includes(:issuable_severity).order('issuable_severities.severity DESC NULLS LAST') }
+ scope :order_escalation_status_asc, -> { includes(:incident_management_issuable_escalation_status).order(IncidentManagement::IssuableEscalationStatus.arel_table[:status].asc.nulls_last).references(:incident_management_issuable_escalation_status) }
+ scope :order_escalation_status_desc, -> { includes(:incident_management_issuable_escalation_status).order(IncidentManagement::IssuableEscalationStatus.arel_table[:status].desc.nulls_last).references(:incident_management_issuable_escalation_status) }
scope :preload_associated_models, -> { preload(:assignees, :labels, project: :namespace) }
scope :with_web_entity_associations, -> { preload(:author, project: [:project_feature, :route, namespace: :route]) }
@@ -133,7 +135,7 @@ class Issue < ApplicationRecord
scope :with_prometheus_alert_events, -> { joins(:issues_prometheus_alert_events) }
scope :with_self_managed_prometheus_alert_events, -> { joins(:issues_self_managed_prometheus_alert_events) }
scope :with_api_entity_associations, -> {
- preload(:timelogs, :closed_by, :assignees, :author, :labels,
+ preload(:timelogs, :closed_by, :assignees, :author, :labels, :issuable_severity,
milestone: { project: [:route, { namespace: :route }] },
project: [:route, { namespace: :route }])
}
@@ -327,6 +329,8 @@ class Issue < ApplicationRecord
when 'relative_position', 'relative_position_asc' then order_by_relative_position
when 'severity_asc' then order_severity_asc.with_order_id_desc
when 'severity_desc' then order_severity_desc.with_order_id_desc
+ when 'escalation_status_asc' then order_escalation_status_asc.with_order_id_desc
+ when 'escalation_status_desc' then order_escalation_status_desc.with_order_id_desc
else
super
end
@@ -340,8 +344,8 @@ class Issue < ApplicationRecord
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'relative_position',
column_expression: arel_table[:relative_position],
- order_expression: Gitlab::Database.nulls_last_order('issues.relative_position', 'ASC'),
- reversed_order_expression: Gitlab::Database.nulls_last_order('issues.relative_position', 'DESC'),
+ order_expression: Issue.arel_table[:relative_position].asc.nulls_last,
+ reversed_order_expression: Issue.arel_table[:relative_position].desc.nulls_last,
order_direction: :asc,
nullable: :nulls_last,
distinct: false
@@ -382,10 +386,6 @@ class Issue < ApplicationRecord
resource_parent.root_namespace&.issue_repositioning_disabled?
end
- def hook_attrs
- Gitlab::HookData::IssueBuilder.new(self).build
- end
-
# `from` argument can be a Namespace or Project.
def to_reference(from = nil, full: false)
reference = "#{self.class.reference_prefix}#{iid}"
@@ -526,10 +526,6 @@ class Issue < ApplicationRecord
::MergeRequestsClosingIssues.count_for_issue(self.id, user)
end
- def labels_hook_attrs
- labels.map(&:hook_attrs)
- end
-
def previous_updated_at
previous_changes['updated_at']&.first || updated_at
end
diff --git a/app/models/key.rb b/app/models/key.rb
index 4a4e792c074..42ea0f29171 100644
--- a/app/models/key.rb
+++ b/app/models/key.rb
@@ -26,7 +26,13 @@ class Key < ApplicationRecord
validates :fingerprint,
uniqueness: true,
- presence: { message: 'cannot be generated' }
+ presence: { message: 'cannot be generated' },
+ unless: -> { Gitlab::FIPS.enabled? }
+
+ validates :fingerprint_sha256,
+ uniqueness: true,
+ presence: { message: 'cannot be generated' },
+ if: -> { Gitlab::FIPS.enabled? }
validate :key_meets_restrictions
@@ -43,7 +49,7 @@ class Key < ApplicationRecord
scope :preload_users, -> { preload(:user) }
scope :for_user, -> (user) { where(user: user) }
- scope :order_last_used_at_desc, -> { reorder(::Gitlab::Database.nulls_last_order('last_used_at', 'DESC')) }
+ scope :order_last_used_at_desc, -> { reorder(arel_table[:last_used_at].desc.nulls_last) }
# Date is set specifically in this scope to improve query time.
scope :expired_today_and_not_notified, -> { where(["date(expires_at AT TIME ZONE 'UTC') = CURRENT_DATE AND expiry_notification_delivered_at IS NULL"]) }
@@ -129,7 +135,7 @@ class Key < ApplicationRecord
return unless public_key.valid?
- self.fingerprint_md5 = public_key.fingerprint
+ self.fingerprint_md5 = public_key.fingerprint unless Gitlab::FIPS.enabled?
self.fingerprint_sha256 = public_key.fingerprint_sha256.gsub("SHA256:", "")
end
diff --git a/app/models/member.rb b/app/models/member.rb
index 528c6855d9c..18ad2785d6e 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -22,6 +22,7 @@ class Member < ApplicationRecord
STATE_AWAITING = 1
attr_accessor :raw_invite_token
+ attr_writer :blocking_refresh
belongs_to :created_by, class_name: "User"
belongs_to :user
@@ -65,10 +66,10 @@ class Member < ApplicationRecord
scope :in_hierarchy, ->(source) do
groups = source.root_ancestor.self_and_descendants
- group_members = Member.default_scoped.where(source: groups)
+ group_members = Member.default_scoped.where(source: groups).select(*Member.cached_column_list)
projects = source.root_ancestor.all_projects
- project_members = Member.default_scoped.where(source: projects)
+ project_members = Member.default_scoped.where(source: projects).select(*Member.cached_column_list)
Member.default_scoped.from_union([
group_members,
@@ -177,10 +178,14 @@ class Member < ApplicationRecord
unscoped.from(distinct_members, :members)
end
- scope :order_name_asc, -> { left_join_users.reorder(Gitlab::Database.nulls_last_order('users.name', 'ASC')) }
- scope :order_name_desc, -> { left_join_users.reorder(Gitlab::Database.nulls_last_order('users.name', 'DESC')) }
- scope :order_recent_sign_in, -> { left_join_users.reorder(Gitlab::Database.nulls_last_order('users.last_sign_in_at', 'DESC')) }
- scope :order_oldest_sign_in, -> { left_join_users.reorder(Gitlab::Database.nulls_last_order('users.last_sign_in_at', 'ASC')) }
+ scope :order_name_asc, -> { left_join_users.reorder(User.arel_table[:name].asc.nulls_last) }
+ scope :order_name_desc, -> { left_join_users.reorder(User.arel_table[:name].desc.nulls_last) }
+ scope :order_recent_sign_in, -> { left_join_users.reorder(User.arel_table[:last_sign_in_at].desc.nulls_last) }
+ scope :order_oldest_sign_in, -> { left_join_users.reorder(User.arel_table[:last_sign_in_at].asc.nulls_last) }
+ scope :order_recent_last_activity, -> { left_join_users.reorder(User.arel_table[:last_activity_on].desc.nulls_last) }
+ scope :order_oldest_last_activity, -> { left_join_users.reorder(User.arel_table[:last_activity_on].asc.nulls_first) }
+ scope :order_recent_created_user, -> { left_join_users.reorder(User.arel_table[:created_at].desc.nulls_last) }
+ scope :order_oldest_created_user, -> { left_join_users.reorder(User.arel_table[:created_at].asc.nulls_first) }
scope :on_project_and_ancestors, ->(project) { where(source: [project] + project.ancestors) }
@@ -197,7 +202,7 @@ class Member < ApplicationRecord
after_save :log_invitation_token_cleanup
after_commit on: [:create, :update], unless: :importing? do
- refresh_member_authorized_projects(blocking: true)
+ refresh_member_authorized_projects(blocking: blocking_refresh)
end
after_commit on: [:destroy], unless: :importing? do
@@ -232,6 +237,10 @@ class Member < ApplicationRecord
when 'access_level_desc' then reorder(access_level: :desc)
when 'recent_sign_in' then order_recent_sign_in
when 'oldest_sign_in' then order_oldest_sign_in
+ when 'recent_created_user' then order_recent_created_user
+ when 'oldest_created_user' then order_oldest_created_user
+ when 'recent_last_activity' then order_recent_last_activity
+ when 'oldest_last_activity' then order_oldest_last_activity
when 'last_joined' then order_created_desc
when 'oldest_joined' then order_created_asc
else
@@ -505,6 +514,13 @@ class Member < ApplicationRecord
error = StandardError.new("Invitation token is present but invite was already accepted!")
Gitlab::ErrorTracking.track_exception(error, attributes.slice(%w["invite_accepted_at created_at source_type source_id user_id id"]))
end
+
+ def blocking_refresh
+ return true unless Feature.enabled?(:allow_non_blocking_member_refresh, default_enabled: :yaml)
+ return true if @blocking_refresh.nil?
+
+ @blocking_refresh
+ end
end
Member.prepend_mod_with('Member')
diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb
index 3e19f294253..995c26d7221 100644
--- a/app/models/members/project_member.rb
+++ b/app/models/members/project_member.rb
@@ -82,10 +82,6 @@ class ProjectMember < Member
source
end
- def owner?
- project.owner == user
- end
-
def notifiable_options
{ project: project }
end
@@ -132,7 +128,10 @@ class ProjectMember < Member
end
def post_create_hook
- unless owner?
+ # The creator of a personal project gets added as a `ProjectMember`
+ # with `OWNER` access during creation of a personal project,
+ # but we do not want to trigger notifications to the same person who created the personal project.
+ unless project.personal_namespace_holder?(user)
event_service.join_project(self.project, self.user)
run_after_commit_or_now { notification_service.new_project_member(self) }
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 854325e1fcd..4c6ed399bf9 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -329,15 +329,15 @@ class MergeRequest < ApplicationRecord
end
scope :by_target_branch, ->(branch_name) { where(target_branch: branch_name) }
scope :order_by_metric, ->(metric, direction) do
- reverse_direction = { 'ASC' => 'DESC', 'DESC' => 'ASC' }
- reversed_direction = reverse_direction[direction] || raise("Unknown sort direction was given: #{direction}")
+ column_expression = MergeRequest::Metrics.arel_table[metric]
+ column_expression_with_direction = direction == 'ASC' ? column_expression.asc : column_expression.desc
order = Gitlab::Pagination::Keyset::Order.build([
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: "merge_request_metrics_#{metric}",
- column_expression: MergeRequest::Metrics.arel_table[metric],
- order_expression: Gitlab::Database.nulls_last_order("merge_request_metrics.#{metric}", direction),
- reversed_order_expression: Gitlab::Database.nulls_first_order("merge_request_metrics.#{metric}", reversed_direction),
+ column_expression: column_expression,
+ order_expression: column_expression_with_direction.nulls_last,
+ reversed_order_expression: column_expression_with_direction.reverse.nulls_first,
order_direction: direction,
nullable: :nulls_last,
distinct: false,
@@ -1409,9 +1409,7 @@ class MergeRequest < ApplicationRecord
def has_ci?
return false if has_no_commits?
- ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336891') do
- !!(head_pipeline_id || all_pipelines.any? || source_project&.ci_integration)
- end
+ !!(head_pipeline_id || all_pipelines.any? || source_project&.ci_integration)
end
def branch_missing?
@@ -1444,7 +1442,7 @@ class MergeRequest < ApplicationRecord
# This method is for looking for active environments which created via pipelines for merge requests.
# Since deployments run on a merge request ref (e.g. `refs/merge-requests/:iid/head`),
# we cannot look up environments with source branch name.
- def environments
+ def legacy_environments
return Environment.none unless actual_head_pipeline&.merge_request?
build_for_actual_head_pipeline = Ci::Build.latest.where(pipeline: actual_head_pipeline)
@@ -1458,6 +1456,14 @@ class MergeRequest < ApplicationRecord
Environment.where(project: project, name: environments)
end
+ def environments_in_head_pipeline(deployment_status: nil)
+ if ::Feature.enabled?(:fix_related_environments_for_merge_requests, target_project, default_enabled: :yaml)
+ actual_head_pipeline&.environments_in_self_and_descendants(deployment_status: deployment_status) || Environment.none
+ else
+ legacy_environments
+ end
+ end
+
def fetch_ref!
target_project.repository.fetch_source_branch!(source_project.repository, source_branch, ref_path)
end
@@ -1904,9 +1910,7 @@ class MergeRequest < ApplicationRecord
end
def find_actual_head_pipeline
- ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336891') do
- all_pipelines.for_sha_or_source_sha(diff_head_sha).first
- end
+ all_pipelines.for_sha_or_source_sha(diff_head_sha).first
end
def etag_caching_enabled?
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 86da29dd27a..ff4fadb0f13 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -31,7 +31,7 @@ class Milestone < ApplicationRecord
end
scope :order_by_name_asc, -> { order(Arel::Nodes::Ascending.new(arel_table[:title].lower)) }
- scope :reorder_by_due_date_asc, -> { reorder(Gitlab::Database.nulls_last_order('due_date', 'ASC')) }
+ scope :reorder_by_due_date_asc, -> { reorder(arel_table[:due_date].asc.nulls_last) }
scope :with_api_entity_associations, -> { preload(project: [:project_feature, :route, namespace: :route]) }
scope :order_by_dates_and_title, -> { order(due_date: :asc, start_date: :asc, title: :asc) }
@@ -116,15 +116,15 @@ class Milestone < ApplicationRecord
when 'due_date_asc'
reorder_by_due_date_asc
when 'due_date_desc'
- reorder(Gitlab::Database.nulls_last_order('due_date', 'DESC'))
+ reorder(arel_table[:due_date].desc.nulls_last)
when 'name_asc'
reorder(Arel::Nodes::Ascending.new(arel_table[:title].lower))
when 'name_desc'
reorder(Arel::Nodes::Descending.new(arel_table[:title].lower))
when 'start_date_asc'
- reorder(Gitlab::Database.nulls_last_order('start_date', 'ASC'))
+ reorder(arel_table[:start_date].asc.nulls_last)
when 'start_date_desc'
- reorder(Gitlab::Database.nulls_last_order('start_date', 'DESC'))
+ reorder(arel_table[:start_date].desc.nulls_last)
else
order_by(method)
end
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index ffaeb2071f6..3b75b6d163a 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -15,6 +15,7 @@ class Namespace < ApplicationRecord
include Namespaces::Traversal::Recursive
include Namespaces::Traversal::Linear
include EachBatch
+ include BlocksUnsafeSerialization
# Temporary column used for back-filling project namespaces.
# Remove it once the back-filling of all project namespaces is done.
@@ -131,7 +132,7 @@ class Namespace < ApplicationRecord
scope :user_namespaces, -> { where(type: Namespaces::UserNamespace.sti_name) }
scope :without_project_namespaces, -> { where(Namespace.arel_table[:type].not_eq(Namespaces::ProjectNamespace.sti_name)) }
- scope :sort_by_type, -> { order(Gitlab::Database.nulls_first_order(:type)) }
+ scope :sort_by_type, -> { order(arel_table[:type].asc.nulls_first) }
scope :include_route, -> { includes(:route) }
scope :by_parent, -> (parent) { where(parent_id: parent) }
scope :filter_by_path, -> (query) { where('lower(path) = :query', query: query.downcase) }
@@ -372,7 +373,7 @@ class Namespace < ApplicationRecord
end
# Deprecated, use #licensed_feature_available? instead. Remove once Namespace#feature_available? isn't used anymore.
- def feature_available?(feature)
+ def feature_available?(feature, _user = nil)
licensed_feature_available?(feature)
end
diff --git a/app/models/namespace/root_storage_statistics.rb b/app/models/namespace/root_storage_statistics.rb
index ee04ec39b1e..96715863892 100644
--- a/app/models/namespace/root_storage_statistics.rb
+++ b/app/models/namespace/root_storage_statistics.rb
@@ -23,6 +23,14 @@ class Namespace::RootStorageStatistics < ApplicationRecord
delegate :all_projects, to: :namespace
+ enum notification_level: {
+ storage_remaining: 100,
+ caution: 30,
+ warning: 15,
+ danger: 5,
+ exceeded: 0
+ }, _prefix: true
+
def recalculate!
update!(merged_attributes)
end
diff --git a/app/models/namespaces/traversal/linear.rb b/app/models/namespaces/traversal/linear.rb
index 1963745cf4d..6320e0bc39d 100644
--- a/app/models/namespaces/traversal/linear.rb
+++ b/app/models/namespaces/traversal/linear.rb
@@ -49,6 +49,33 @@ module Namespaces
before_commit :sync_traversal_ids, on: [:create], if: -> { sync_traversal_ids? }
end
+ class_methods do
+ # This method looks into a list of namespaces trying to optimise a returned traversal_ids
+ # into a list of shortest prefixes, due to fact that the shortest prefixes include all childrens.
+ # Example:
+ # INPUT: [[4909902], [4909902,51065789], [4909902,51065793], [7135830], [15599674, 1], [15599674, 1, 3], [15599674, 2]]
+ # RESULT: [[4909902], [7135830], [15599674, 1], [15599674, 2]]
+ def shortest_traversal_ids_prefixes
+ raise ArgumentError, 'Feature not supported since the `:use_traversal_ids` is disabled' unless use_traversal_ids?
+
+ prefixes = []
+
+ # The array needs to be sorted (O(nlogn)) to ensure shortest elements are always first
+ # This allows to do O(n) search of shortest prefixes
+ all_traversal_ids = all.order('namespaces.traversal_ids').pluck('namespaces.traversal_ids')
+ last_prefix = [nil]
+
+ all_traversal_ids.each do |traversal_ids|
+ next if last_prefix == traversal_ids[0..(last_prefix.count - 1)]
+
+ last_prefix = traversal_ids
+ prefixes << traversal_ids
+ end
+
+ prefixes
+ end
+ end
+
def sync_traversal_ids?
Feature.enabled?(:sync_traversal_ids, root_ancestor, default_enabled: :yaml)
end
diff --git a/app/models/note.rb b/app/models/note.rb
index 4f2e7ebe2c5..3d2ac69a2ab 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -35,6 +35,8 @@ class Note < ApplicationRecord
contact: :read_crm_contact
}.freeze
+ NON_DIFF_NOTE_TYPES = ['Note', 'DiscussionNote', nil].freeze
+
# Aliases to make application_helper#edited_time_ago_with_tooltip helper work properly with notes.
# See https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/10392/diffs#note_28719102
alias_attribute :last_edited_by, :updated_by
@@ -97,6 +99,11 @@ class Note < ApplicationRecord
validates :author, presence: true
validates :discussion_id, presence: true, format: { with: /\A\h{40}\z/ }
+ validate :ensure_confidentiality_discussion_compliance
+ validate :ensure_noteable_can_have_confidential_note
+ validate :ensure_note_type_can_be_confidential
+ validate :ensure_confidentiality_not_changed, on: :update
+
validate unless: [:for_commit?, :importing?, :skip_project_check?] do |note|
unless note.noteable.try(:project) == note.project
errors.add(:project, 'does not match noteable project')
@@ -121,6 +128,7 @@ class Note < ApplicationRecord
scope :with_discussion_ids, ->(discussion_ids) { where(discussion_id: discussion_ids) }
scope :with_suggestions, -> { joins(:suggestions) }
scope :inc_author, -> { includes(:author) }
+ scope :inc_note_diff_file, -> { includes(:note_diff_file) }
scope :with_api_entity_associations, -> { preload(:note_diff_file, :author) }
scope :inc_relations_for_view, -> do
includes({ project: :group }, { author: :status }, :updated_by, :resolved_by, :award_emoji,
@@ -140,7 +148,7 @@ class Note < ApplicationRecord
scope :diff_notes, -> { where(type: %w(LegacyDiffNote DiffNote)) }
scope :new_diff_notes, -> { where(type: 'DiffNote') }
- scope :non_diff_notes, -> { where(type: ['Note', 'DiscussionNote', nil]) }
+ scope :non_diff_notes, -> { where(type: NON_DIFF_NOTE_TYPES) }
scope :with_associations, -> do
# FYI noteable cannot be loaded for LegacyDiffNote for commits
@@ -457,7 +465,7 @@ class Note < ApplicationRecord
# and all its notes and if we don't care about the discussion's resolvability status.
def discussion
strong_memoize(:discussion) do
- full_discussion = self.noteable.notes.find_discussion(self.discussion_id) if part_of_discussion?
+ full_discussion = self.noteable.notes.find_discussion(self.discussion_id) if self.noteable && part_of_discussion?
full_discussion || to_discussion
end
end
@@ -501,7 +509,15 @@ class Note < ApplicationRecord
# Instead of calling touch which is throttled via ThrottledTouch concern,
# we bump the updated_at column directly. This also prevents executing
# after_commit callbacks that we don't need.
- update_column(:updated_at, Time.current)
+ attributes_to_update = { updated_at: Time.current }
+
+ # Notes that were edited before the `last_edited_at` column was added, fall back to `updated_at` for the edit time.
+ # We copy this over to the correct column so we don't erroneously change the edit timestamp.
+ if updated_by_id.present? && read_attribute(:last_edited_at).blank?
+ attributes_to_update[:last_edited_at] = updated_at
+ end
+
+ update_columns(attributes_to_update)
end
def expire_etag_cache
@@ -717,6 +733,42 @@ class Note < ApplicationRecord
def noteable_label_url_method
for_merge_request? ? :project_merge_requests_url : :project_issues_url
end
+
+ def ensure_confidentiality_not_changed
+ return unless will_save_change_to_attribute?(:confidential)
+ return unless attribute_change_to_be_saved(:confidential).include?(true)
+
+ errors.add(:confidential, _('can not be changed for existing notes'))
+ end
+
+ def ensure_confidentiality_discussion_compliance
+ return if start_of_discussion?
+
+ if discussion.first_note.confidential? != confidential?
+ errors.add(:confidential, _('reply should have same confidentiality as top-level note'))
+ end
+
+ ensure
+ clear_memoization(:discussion)
+ end
+
+ def ensure_noteable_can_have_confidential_note
+ return unless confidential?
+ return if noteable_can_have_confidential_note?
+
+ errors.add(:confidential, _('can not be set for this resource'))
+ end
+
+ def ensure_note_type_can_be_confidential
+ return unless confidential?
+ return if NON_DIFF_NOTE_TYPES.include?(type)
+
+ errors.add(:confidential, _('can not be set for this type of note'))
+ end
+
+ def noteable_can_have_confidential_note?
+ for_issue?
+ end
end
Note.prepend_mod_with('Note')
diff --git a/app/models/onboarding_progress.rb b/app/models/onboarding_progress.rb
index 58b7848f7e2..e5851c5cfc5 100644
--- a/app/models/onboarding_progress.rb
+++ b/app/models/onboarding_progress.rb
@@ -27,7 +27,8 @@ class OnboardingProgress < ApplicationRecord
:secure_secret_detection_run,
:secure_coverage_fuzzing_run,
:secure_api_fuzzing_run,
- :secure_cluster_image_scanning_run
+ :secure_cluster_image_scanning_run,
+ :license_scanning_run
].freeze
scope :incomplete_actions, -> (actions) do
diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb
index c76473c9438..7744e578df5 100644
--- a/app/models/packages/package.rb
+++ b/app/models/packages/package.rb
@@ -228,8 +228,8 @@ class Packages::Package < ApplicationRecord
def self.keyset_pagination_order(join_class:, column_name:, direction: :asc)
join_table = join_class.table_name
- asc_order_expression = Gitlab::Database.nulls_last_order("#{join_table}.#{column_name}", :asc)
- desc_order_expression = Gitlab::Database.nulls_first_order("#{join_table}.#{column_name}", :desc)
+ asc_order_expression = join_class.arel_table[column_name].asc.nulls_last
+ desc_order_expression = join_class.arel_table[column_name].desc.nulls_first
order_direction = direction == :asc ? asc_order_expression : desc_order_expression
reverse_order_direction = direction == :asc ? desc_order_expression : asc_order_expression
arel_order_classes = ::Gitlab::Pagination::Keyset::ColumnOrderDefinition::AREL_ORDER_CLASSES.invert
diff --git a/app/models/packages/package_file.rb b/app/models/packages/package_file.rb
index ad8140ac684..b49e04f481c 100644
--- a/app/models/packages/package_file.rb
+++ b/app/models/packages/package_file.rb
@@ -34,7 +34,7 @@ class Packages::PackageFile < ApplicationRecord
validates :file, presence: true
validates :file_name, presence: true
- validates :file_name, uniqueness: { scope: :package }, if: -> { package&.pypi? }
+ validates :file_name, uniqueness: { scope: :package }, if: -> { !pending_destruction? && package&.pypi? }
scope :recent, -> { order(id: :desc) }
scope :limit_recent, ->(limit) { recent.limit(limit) }
diff --git a/app/models/preloaders/group_root_ancestor_preloader.rb b/app/models/preloaders/group_root_ancestor_preloader.rb
new file mode 100644
index 00000000000..3ca713d9635
--- /dev/null
+++ b/app/models/preloaders/group_root_ancestor_preloader.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Preloaders
+ class GroupRootAncestorPreloader
+ def initialize(groups, root_ancestor_preloads = [])
+ @groups = groups
+ @root_ancestor_preloads = root_ancestor_preloads
+ end
+
+ def execute
+ return unless ::Feature.enabled?(:use_traversal_ids, default_enabled: :yaml)
+
+ # type == 'Group' condition located on subquery to prevent a filter in the query
+ root_query = Namespace.joins("INNER JOIN (#{join_sql}) as root_query ON root_query.root_id = namespaces.id")
+ .select('namespaces.*, root_query.id as source_id')
+
+ root_query = root_query.preload(*@root_ancestor_preloads) if @root_ancestor_preloads.any?
+
+ root_ancestors_by_id = root_query.group_by(&:source_id)
+
+ @groups.each do |group|
+ group.root_ancestor = root_ancestors_by_id[group.id].first
+ end
+ end
+
+ private
+
+ def join_sql
+ Group.select('id, traversal_ids[1] as root_id').where(id: @groups.map(&:id)).to_sql
+ end
+ end
+end
diff --git a/app/models/programming_language.rb b/app/models/programming_language.rb
index 375fbe9b5a9..06e3034e56a 100644
--- a/app/models/programming_language.rb
+++ b/app/models/programming_language.rb
@@ -4,9 +4,10 @@ class ProgrammingLanguage < ApplicationRecord
validates :name, presence: true
validates :color, allow_blank: false, color: true
- # Returns all programming languages which match the given name (case
+ # Returns all programming languages which match any of the given names (case
# insensitively).
- scope :with_name_case_insensitive, ->(name) do
- where(arel_table[:name].matches(sanitize_sql_like(name)))
+ scope :with_name_case_insensitive, ->(*names) do
+ sanitized_names = names.map(&method(:sanitize_sql_like))
+ where(arel_table[:name].matches_any(sanitized_names))
end
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 155ebe88d33..f7182d1645c 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -37,6 +37,7 @@ class Project < ApplicationRecord
include EachBatch
include GitlabRoutingHelper
include BulkMemberAccessLoad
+ include BulkUsersByEmailLoad
include RunnerTokenExpirationInterval
include BlocksUnsafeSerialization
@@ -382,7 +383,7 @@ class Project < ApplicationRecord
has_many :source_pipelines, class_name: 'Ci::Sources::Pipeline', foreign_key: :project_id
has_many :import_failures, inverse_of: :project
- has_many :jira_imports, -> { order 'jira_imports.created_at' }, class_name: 'JiraImportState', inverse_of: :project
+ has_many :jira_imports, -> { order(JiraImportState.arel_table[:created_at].asc) }, class_name: 'JiraImportState', inverse_of: :project
has_many :daily_build_group_report_results, class_name: 'Ci::DailyBuildGroupReportResult'
has_many :ci_feature_usages, class_name: 'Projects::CiFeatureUsage'
@@ -545,8 +546,8 @@ class Project < ApplicationRecord
.or(arel_table[:storage_version].eq(nil)))
end
- # last_activity_at is throttled every minute, but last_repository_updated_at is updated with every push
- scope :sorted_by_activity, -> { reorder(Arel.sql("GREATEST(COALESCE(last_activity_at, '1970-01-01'), COALESCE(last_repository_updated_at, '1970-01-01')) DESC")) }
+ scope :sorted_by_updated_asc, -> { reorder(self.arel_table['updated_at'].asc) }
+ scope :sorted_by_updated_desc, -> { reorder(self.arel_table['updated_at'].desc) }
scope :sorted_by_stars_desc, -> { reorder(self.arel_table['star_count'].desc) }
scope :sorted_by_stars_asc, -> { reorder(self.arel_table['star_count'].asc) }
# Sometimes queries (e.g. using CTEs) require explicit disambiguation with table name
@@ -655,7 +656,9 @@ class Project < ApplicationRecord
preload(:project_feature, :route, namespace: [:route, :owner])
}
+ scope :created_by, -> (user) { where(creator: user) }
scope :imported_from, -> (type) { where(import_type: type) }
+ scope :imported, -> { where.not(import_type: nil) }
scope :with_tracing_enabled, -> { joins(:tracing_setting) }
scope :with_enabled_error_tracking, -> { joins(:error_tracking_setting).where(project_error_tracking_settings: { enabled: true }) }
@@ -780,9 +783,9 @@ class Project < ApplicationRecord
# pass a string to avoid AR adding the table name
reorder('project_statistics.storage_size DESC, projects.id DESC')
when 'latest_activity_desc'
- reorder(self.arel_table['last_activity_at'].desc)
+ sorted_by_updated_desc
when 'latest_activity_asc'
- reorder(self.arel_table['last_activity_at'].asc)
+ sorted_by_updated_asc
when 'stars_desc'
sorted_by_stars_desc
when 'stars_asc'
@@ -896,6 +899,18 @@ class Project < ApplicationRecord
association(:namespace).loaded?
end
+ def personal_namespace_holder?(user)
+ return false unless personal?
+ return false unless user
+
+ # We do not want to use a check like `project.team.owner?(user)`
+ # here because that would depend upon the state of the `project_authorizations` cache,
+ # and also perform the check across multiple `owners` of the project, but our intention
+ # is to check if the user is the "holder" of the personal namespace, so need to make this
+ # check against only a single user (ie, namespace.owner).
+ namespace.owner == user
+ end
+
def project_setting
super.presence || build_project_setting
end
@@ -1048,6 +1063,17 @@ class Project < ApplicationRecord
end
end
+ def container_repositories_size
+ strong_memoize(:container_repositories_size) do
+ next unless Gitlab.com?
+ next 0 if container_repositories.empty?
+ next unless container_repositories.all_migrated?
+ next unless ContainerRegistry::GitlabApiClient.supports_gitlab_api?
+
+ ContainerRegistry::GitlabApiClient.deduplicated_size(full_path)
+ end
+ end
+
def has_container_registry_tags?
return @images if defined?(@images)
@@ -1401,7 +1427,7 @@ class Project < ApplicationRecord
end
def last_activity_date
- [last_activity_at, last_repository_updated_at, updated_at].compact.max
+ updated_at
end
def project_id
@@ -1469,7 +1495,7 @@ class Project < ApplicationRecord
end
def find_or_initialize_integration(name)
- return if disabled_integrations.include?(name)
+ return if disabled_integrations.include?(name) || Integration.available_integration_names.exclude?(name)
find_integration(integrations, name) || build_from_instance(name) || build_integration(name)
end
@@ -1920,6 +1946,10 @@ class Project < ApplicationRecord
Gitlab.config.pages.enabled
end
+ def pages_show_onboarding?
+ !(pages_metadatum&.onboarding_complete || pages_metadatum&.deployed)
+ end
+
def remove_private_deploy_keys
exclude_keys_linked_to_other_projects = <<-SQL
NOT EXISTS (
@@ -1935,6 +1965,10 @@ class Project < ApplicationRecord
.delete_all
end
+ def mark_pages_onboarding_complete
+ ensure_pages_metadatum.update!(onboarding_complete: true)
+ end
+
def mark_pages_as_deployed
ensure_pages_metadatum.update!(deployed: true)
end
@@ -1974,13 +2008,15 @@ class Project < ApplicationRecord
ProjectCacheWorker.perform_async(self.id, [], [:repository_size])
AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(id)
+ enqueue_record_project_target_platforms
+
# The import assigns iid values on its own, e.g. by re-using GitHub ids.
# Flush existing InternalId records for this project for consistency reasons.
# Those records are going to be recreated with the next normal creation
# of a model instance (e.g. an Issue).
InternalId.flush_records!(project: self)
- import_state.finish
+ import_state&.finish
update_project_counter_caches
after_create_default_branch
join_pool_repository
@@ -2829,6 +2865,22 @@ class Project < ApplicationRecord
pending_delete? || hidden?
end
+ def work_items_feature_flag_enabled?
+ group&.work_items_feature_flag_enabled? || Feature.enabled?(:work_items, self, default_enabled: :yaml)
+ end
+
+ def enqueue_record_project_target_platforms
+ return unless Gitlab.com?
+ return unless Feature.enabled?(:record_projects_target_platforms, self, default_enabled: :yaml)
+
+ Projects::RecordTargetPlatformsWorker.perform_async(id)
+ end
+
+ def inactive?
+ (statistics || build_statistics).storage_size > ::Gitlab::CurrentSettings.inactive_projects_min_size_mb.megabytes &&
+ last_activity_at < ::Gitlab::CurrentSettings.inactive_projects_send_warning_email_after_months.months.ago
+ end
+
private
# overridden in EE
diff --git a/app/models/project_feature.rb b/app/models/project_feature.rb
index 0d3e50837ab..33783d31355 100644
--- a/app/models/project_feature.rb
+++ b/app/models/project_feature.rb
@@ -3,6 +3,7 @@
class ProjectFeature < ApplicationRecord
include Featurable
extend Gitlab::ConfigHelper
+ extend ::Gitlab::Utils::Override
# When updating this array, make sure to update rubocop/cop/gitlab/feature_available_usage.rb as well.
FEATURES = %i[
@@ -155,31 +156,14 @@ class ProjectFeature < ApplicationRecord
%i(merge_requests_access_level builds_access_level).each(&validator)
end
- def get_permission(user, feature)
- case access_level(feature)
- when DISABLED
- false
- when PRIVATE
- team_access?(user, feature)
- when ENABLED
- true
- when PUBLIC
- true
- else
- true
- end
+ def feature_validation_exclusion
+ %i(pages)
end
- def team_access?(user, feature)
- return unless user
- return true if user.can_read_all_resources?
-
+ override :resource_member?
+ def resource_member?(user, feature)
project.team.member?(user, ProjectFeature.required_minimum_access_level(feature))
end
-
- def feature_validation_exclusion
- %i(pages)
- end
end
ProjectFeature.prepend_mod_with('ProjectFeature')
diff --git a/app/models/project_group_link.rb b/app/models/project_group_link.rb
index 8394ebe1df4..2ba3c74df5b 100644
--- a/app/models/project_group_link.rb
+++ b/app/models/project_group_link.rb
@@ -18,6 +18,7 @@ class ProjectGroupLink < ApplicationRecord
scope :in_group, -> (group_ids) { where(group_id: group_ids) }
alias_method :shared_with_group, :group
+ alias_method :shared_from, :project
def self.access_options
Gitlab::Access.options
diff --git a/app/models/project_import_state.rb b/app/models/project_import_state.rb
index 0f04eb7d4af..fabbd5b49cb 100644
--- a/app/models/project_import_state.rb
+++ b/app/models/project_import_state.rb
@@ -6,6 +6,8 @@ class ProjectImportState < ApplicationRecord
self.table_name = "project_mirror_data"
+ after_commit :expire_etag_cache
+
belongs_to :project, inverse_of: :import_state
validates :project, presence: true
@@ -58,9 +60,7 @@ class ProjectImportState < ApplicationRecord
end
after_transition any => :failed do |state, _|
- if Feature.enabled?(:remove_import_data_on_failure, state.project, default_enabled: :yaml)
- state.project.remove_import_data
- end
+ state.project.remove_import_data
end
after_transition started: :finished do |state, _|
@@ -78,6 +78,23 @@ class ProjectImportState < ApplicationRecord
end
end
+ def expire_etag_cache
+ if realtime_changes_path
+ Gitlab::EtagCaching::Store.new.tap do |store|
+ store.touch(realtime_changes_path)
+ rescue Gitlab::EtagCaching::Store::InvalidKeyError
+ # no-op: not every realtime changes endpoint is using etag caching
+ end
+ end
+ end
+
+ def realtime_changes_path
+ Gitlab::Routing.url_helpers.polymorphic_path([:realtime_changes_import, project.import_type.to_sym], format: :json)
+ rescue NoMethodError
+ # polymorphic_path throws NoMethodError when no such path exists
+ nil
+ end
+
def relation_hard_failures(limit:)
project.import_failures.hard_failures_by_correlation_id(correlation_id).limit(limit)
end
diff --git a/app/models/project_setting.rb b/app/models/project_setting.rb
index ae3d7038a88..6cd6eee2616 100644
--- a/app/models/project_setting.rb
+++ b/app/models/project_setting.rb
@@ -1,9 +1,7 @@
# frozen_string_literal: true
class ProjectSetting < ApplicationRecord
- include IgnorableColumns
-
- ignore_column :show_diff_preview_in_email, remove_with: '14.10', remove_after: '2022-03-22'
+ ALLOWED_TARGET_PLATFORMS = %w(ios osx tvos watchos).freeze
belongs_to :project, inverse_of: :project_setting
@@ -18,6 +16,9 @@ class ProjectSetting < ApplicationRecord
validates :merge_commit_template, length: { maximum: Project::MAX_COMMIT_TEMPLATE_LENGTH }
validates :squash_commit_template, length: { maximum: Project::MAX_COMMIT_TEMPLATE_LENGTH }
+ validates :target_platforms, inclusion: { in: ALLOWED_TARGET_PLATFORMS }
+
+ validate :validates_mr_default_target_self
default_value_for(:legacy_open_source_license_available) do
Feature.enabled?(:legacy_open_source_license_available, default_enabled: :yaml, type: :ops)
@@ -31,7 +32,9 @@ class ProjectSetting < ApplicationRecord
%w[always never].include?(squash_option)
end
- validate :validates_mr_default_target_self
+ def target_platforms=(val)
+ super(val&.map(&:to_s)&.sort)
+ end
private
diff --git a/app/models/projects/build_artifacts_size_refresh.rb b/app/models/projects/build_artifacts_size_refresh.rb
index afb67b79f0d..959f486a50a 100644
--- a/app/models/projects/build_artifacts_size_refresh.rb
+++ b/app/models/projects/build_artifacts_size_refresh.rb
@@ -4,7 +4,7 @@ module Projects
class BuildArtifactsSizeRefresh < ApplicationRecord
include BulkInsertSafe
- STALE_WINDOW = 3.days
+ STALE_WINDOW = 2.hours
self.table_name = 'project_build_artifacts_size_refreshes'
diff --git a/app/models/projects/topic.rb b/app/models/projects/topic.rb
index b42b03f0618..9214a23e259 100644
--- a/app/models/projects/topic.rb
+++ b/app/models/projects/topic.rb
@@ -23,6 +23,10 @@ module Projects
end
class << self
+ def find_by_name_case_insensitive(name)
+ find_by('LOWER(name) = ?', name.downcase)
+ end
+
def search(query)
fuzzy_search(query, [:name])
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 346478b6689..dc0b5b54fb0 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -2,6 +2,12 @@
require 'securerandom'
+# Explicitly require licensee/license file in order to use Licensee::InvalidLicense class defined in
+# https://github.com/licensee/licensee/blob/v9.14.1/lib/licensee/license.rb#L6
+# The problem is that nested classes are not automatically preloaded which may lead to
+# uninitialized constant exception being raised: https://gitlab.com/gitlab-org/gitlab/-/issues/356658
+require 'licensee/license'
+
class Repository
REF_MERGE_REQUEST = 'merge-requests'
REF_KEEP_AROUND = 'keep-around'
@@ -789,6 +795,12 @@ class Repository
def create_file(user, path, content, **options)
options[:actions] = [{ action: :create, file_path: path, content: content }]
+ execute_filemode = options.delete(:execute_filemode)
+
+ unless execute_filemode.nil?
+ options[:actions].push({ action: :chmod, file_path: path, execute_filemode: execute_filemode })
+ end
+
multi_action(user, **options)
end
@@ -798,6 +810,12 @@ class Repository
options[:actions] = [{ action: action, file_path: path, previous_path: previous_path, content: content }]
+ execute_filemode = options.delete(:execute_filemode)
+
+ unless execute_filemode.nil?
+ options[:actions].push({ action: :chmod, file_path: path, execute_filemode: execute_filemode })
+ end
+
multi_action(user, **options)
end
@@ -941,6 +959,10 @@ class Repository
end
end
+ def clone_as_mirror(url, http_authorization_header: "")
+ import_repository(url, http_authorization_header: http_authorization_header, mirror: true)
+ end
+
def fetch_as_mirror(url, forced: false, refmap: :all_refs, prune: true, http_authorization_header: "")
fetch_remote(url, refmap: refmap, forced: forced, prune: prune, http_authorization_header: http_authorization_header)
end
diff --git a/app/models/repository_language.rb b/app/models/repository_language.rb
index 2816aa4cc5b..60aaa1f932a 100644
--- a/app/models/repository_language.rb
+++ b/app/models/repository_language.rb
@@ -8,8 +8,8 @@ class RepositoryLanguage < ApplicationRecord
default_scope { includes(:programming_language) } # rubocop:disable Cop/DefaultScope
- scope :with_programming_language, ->(name) do
- joins(:programming_language).merge(ProgrammingLanguage.with_name_case_insensitive(name))
+ scope :with_programming_language, ->(*names) do
+ joins(:programming_language).merge(ProgrammingLanguage.with_name_case_insensitive(*names))
end
validates :project, presence: true
diff --git a/app/models/review.rb b/app/models/review.rb
index 5a30e2963c8..c621da3b03c 100644
--- a/app/models/review.rb
+++ b/app/models/review.rb
@@ -14,6 +14,10 @@ class Review < ApplicationRecord
participant :author
+ def discussion_ids
+ notes.select(:discussion_id)
+ end
+
def all_references(current_user = nil, extractor: nil)
ext = super
diff --git a/app/models/snippet.rb b/app/models/snippet.rb
index 38aaeff5c9a..cf4b83d44c2 100644
--- a/app/models/snippet.rb
+++ b/app/models/snippet.rb
@@ -40,6 +40,7 @@ class Snippet < ApplicationRecord
belongs_to :author, class_name: 'User'
belongs_to :project
+ alias_method :resource_parent, :project
has_many :notes, as: :noteable, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :user_mentions, class_name: "SnippetUserMention", dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
diff --git a/app/models/suggestion.rb b/app/models/suggestion.rb
index f1ca5c23997..ca2ad8bf88c 100644
--- a/app/models/suggestion.rb
+++ b/app/models/suggestion.rb
@@ -16,10 +16,14 @@ class Suggestion < ApplicationRecord
note.latest_diff_file
end
- def project
+ def source_project
noteable.source_project
end
+ def target_project
+ noteable.target_project
+ end
+
def branch
noteable.source_branch
end
diff --git a/app/models/todo.rb b/app/models/todo.rb
index eb5d9965955..45ab770a0f6 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -148,10 +148,10 @@ class Todo < ApplicationRecord
target_type_column: "todos.target_type",
target_column: "todos.target_id",
project_column: "todos.project_id"
- ).to_sql
+ ).arel.as('highest_priority')
- select("#{table_name}.*, (#{highest_priority}) AS highest_priority")
- .order(Gitlab::Database.nulls_last_order('highest_priority', 'ASC'))
+ select(arel_table[Arel.star], highest_priority)
+ .order(Arel.sql('highest_priority').asc.nulls_last)
.order('todos.created_at')
end
diff --git a/app/models/user.rb b/app/models/user.rb
index bc02f0ba55e..26d47de4f00 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -21,6 +21,7 @@ class User < ApplicationRecord
include OptionallySearch
include FromUnion
include BatchDestroyDependentAssociations
+ include BatchNullifyDependentAssociations
include HasUniqueInternalUsers
include IgnorableColumns
include UpdateHighestRole
@@ -37,6 +38,9 @@ class User < ApplicationRecord
COUNT_CACHE_VALIDITY_PERIOD = 24.hours
+ OTP_SECRET_LENGTH = 32
+ OTP_SECRET_TTL = 2.minutes
+
MAX_USERNAME_LENGTH = 255
MIN_USERNAME_LENGTH = 2
@@ -46,6 +50,8 @@ class User < ApplicationRecord
:public_email
].freeze
+ FORBIDDEN_SEARCH_STATES = %w(blocked banned ldap_blocked).freeze
+
add_authentication_token_field :incoming_email_token, token_generator: -> { SecureRandom.hex.to_i(16).to_s(36) }
add_authentication_token_field :feed_token
add_authentication_token_field :static_object_token, encrypted: :optional
@@ -184,6 +190,8 @@ class User < ApplicationRecord
has_many :snippets, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :notes, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :issues, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
+ has_many :updated_issues, class_name: 'Issue', dependent: :nullify, foreign_key: :updated_by_id # rubocop:disable Cop/ActiveRecordDependent
+ has_many :closed_issues, class_name: 'Issue', dependent: :nullify, foreign_key: :closed_by_id # rubocop:disable Cop/ActiveRecordDependent
has_many :merge_requests, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :events, dependent: :delete_all, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :releases, dependent: :nullify, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
@@ -277,7 +285,7 @@ class User < ApplicationRecord
after_update :username_changed_hook, if: :saved_change_to_username?
after_destroy :post_destroy_hook
after_destroy :remove_key_cache
- after_save if: -> { saved_change_to_email? && confirmed? } do
+ after_save if: -> { (saved_change_to_email? || saved_change_to_confirmed_at?) && confirmed? } do
email_to_confirm = self.emails.find_by(email: self.email)
if email_to_confirm.present?
@@ -322,6 +330,8 @@ class User < ApplicationRecord
:setup_for_company, :setup_for_company=,
:render_whitespace_in_code, :render_whitespace_in_code=,
:markdown_surround_selection, :markdown_surround_selection=,
+ :diffs_deletion_color, :diffs_deletion_color=,
+ :diffs_addition_color, :diffs_addition_color=,
to: :user_preference
delegate :path, to: :namespace, allow_nil: true, prefix: true
@@ -460,15 +470,16 @@ class User < ApplicationRecord
.where('keys.user_id = users.id')
.expiring_soon_and_not_notified)
end
- scope :order_recent_sign_in, -> { reorder(Gitlab::Database.nulls_last_order('current_sign_in_at', 'DESC')) }
- scope :order_oldest_sign_in, -> { reorder(Gitlab::Database.nulls_last_order('current_sign_in_at', 'ASC')) }
- scope :order_recent_last_activity, -> { reorder(Gitlab::Database.nulls_last_order('last_activity_on', 'DESC')) }
- scope :order_oldest_last_activity, -> { reorder(Gitlab::Database.nulls_first_order('last_activity_on', 'ASC')) }
+ scope :order_recent_sign_in, -> { reorder(arel_table[:current_sign_in_at].desc.nulls_last) }
+ scope :order_oldest_sign_in, -> { reorder(arel_table[:current_sign_in_at].asc.nulls_last) }
+ scope :order_recent_last_activity, -> { reorder(arel_table[:last_activity_on].desc.nulls_last) }
+ scope :order_oldest_last_activity, -> { reorder(arel_table[:last_activity_on].asc.nulls_first) }
scope :by_id_and_login, ->(id, login) { where(id: id).where('username = LOWER(:login) OR email = LOWER(:login)', login: login) }
scope :dormant, -> { with_state(:active).human_or_service_user.where('last_activity_on <= ?', MINIMUM_INACTIVE_DAYS.day.ago.to_date) }
scope :with_no_activity, -> { with_state(:active).human_or_service_user.where(last_activity_on: nil) }
scope :by_provider_and_extern_uid, ->(provider, extern_uid) { joins(:identities).merge(Identity.with_extern_uid(provider, extern_uid)) }
scope :by_ids_or_usernames, -> (ids, usernames) { where(username: usernames).or(where(id: ids)) }
+ scope :without_forbidden_states, -> { where.not(state: FORBIDDEN_SEARCH_STATES) }
strip_attributes! :name
@@ -660,9 +671,9 @@ class User < ApplicationRecord
order = <<~SQL
CASE
- WHEN users.name = :query THEN 0
- WHEN users.username = :query THEN 1
- WHEN users.public_email = :query THEN 2
+ WHEN LOWER(users.name) = :query THEN 0
+ WHEN LOWER(users.username) = :query THEN 1
+ WHEN LOWER(users.public_email) = :query THEN 2
ELSE 3
END
SQL
@@ -949,6 +960,21 @@ class User < ApplicationRecord
(webauthn_registrations.loaded? && webauthn_registrations.any?) || (!webauthn_registrations.loaded? && webauthn_registrations.exists?)
end
+ def needs_new_otp_secret?
+ !two_factor_enabled? && otp_secret_expired?
+ end
+
+ def otp_secret_expired?
+ return true unless otp_secret_expires_at
+
+ otp_secret_expires_at < Time.current
+ end
+
+ def update_otp_secret!
+ self.otp_secret = User.generate_otp_secret(OTP_SECRET_LENGTH)
+ self.otp_secret_expires_at = Time.current + OTP_SECRET_TTL
+ end
+
def namespace_move_dir_allowed
if namespace&.any_project_has_container_registry_tags?
errors.add(:username, _('cannot be changed if a personal project has container registry tags.'))
@@ -1709,8 +1735,12 @@ class User < ApplicationRecord
end
def attention_requested_open_merge_requests_count(force: false)
- Rails.cache.fetch(attention_request_cache_key, force: force, expires_in: COUNT_CACHE_VALIDITY_PERIOD) do
+ if Feature.enabled?(:uncached_mr_attention_requests_count, self, default_enabled: :yaml)
MergeRequestsFinder.new(self, attention: self.username, state: 'opened', non_archived: true).execute.count
+ else
+ Rails.cache.fetch(attention_request_cache_key, force: force, expires_in: COUNT_CACHE_VALIDITY_PERIOD) do
+ MergeRequestsFinder.new(self, attention: self.username, state: 'opened', non_archived: true).execute.count
+ end
end
end
@@ -2121,8 +2151,8 @@ class User < ApplicationRecord
def authorized_groups_without_shared_membership
Group.from_union([
- groups.select(Namespace.arel_table[Arel.star]),
- authorized_projects.joins(:namespace).select(Namespace.arel_table[Arel.star])
+ groups.select(*Namespace.cached_column_list),
+ authorized_projects.joins(:namespace).select(*Namespace.cached_column_list)
])
end
@@ -2237,33 +2267,66 @@ class User < ApplicationRecord
end
def ci_owned_project_runners_from_project_members
- Ci::RunnerProject
- .select('ci_runners.*')
- .joins(:runner)
- .where(project: project_members.where('access_level >= ?', Gitlab::Access::MAINTAINER).pluck(:source_id))
+ project_ids = project_members.where('access_level >= ?', Gitlab::Access::MAINTAINER).pluck(:source_id)
+
+ Ci::Runner
+ .joins(:runner_projects)
+ .where(runner_projects: { project: project_ids })
end
def ci_owned_project_runners_from_group_members
- Ci::RunnerProject
- .select('ci_runners.*')
- .joins(:runner)
- .joins('JOIN ci_project_mirrors ON ci_project_mirrors.project_id = ci_runner_projects.project_id')
- .joins('JOIN ci_namespace_mirrors ON ci_namespace_mirrors.namespace_id = ci_project_mirrors.namespace_id')
- .merge(ci_namespace_mirrors_for_group_members(Gitlab::Access::MAINTAINER))
+ cte_namespace_ids = Gitlab::SQL::CTE.new(
+ :cte_namespace_ids,
+ ci_namespace_mirrors_for_group_members(Gitlab::Access::MAINTAINER).select(:namespace_id)
+ )
+
+ cte_project_ids = Gitlab::SQL::CTE.new(
+ :cte_project_ids,
+ Ci::ProjectMirror
+ .select(:project_id)
+ .where('ci_project_mirrors.namespace_id IN (SELECT namespace_id FROM cte_namespace_ids)')
+ )
+
+ Ci::Runner
+ .with(cte_namespace_ids.to_arel)
+ .with(cte_project_ids.to_arel)
+ .joins(:runner_projects)
+ .where('ci_runner_projects.project_id IN (SELECT project_id FROM cte_project_ids)')
end
def ci_owned_group_runners
- Ci::RunnerNamespace
- .select('ci_runners.*')
- .joins(:runner)
- .joins('JOIN ci_namespace_mirrors ON ci_namespace_mirrors.namespace_id = ci_runner_namespaces.namespace_id')
- .merge(ci_namespace_mirrors_for_group_members(Gitlab::Access::OWNER))
+ cte_namespace_ids = Gitlab::SQL::CTE.new(
+ :cte_namespace_ids,
+ ci_namespace_mirrors_for_group_members(Gitlab::Access::OWNER).select(:namespace_id)
+ )
+
+ Ci::Runner
+ .with(cte_namespace_ids.to_arel)
+ .joins(:runner_namespaces)
+ .where('ci_runner_namespaces.namespace_id IN (SELECT namespace_id FROM cte_namespace_ids)')
end
def ci_namespace_mirrors_for_group_members(level)
- Ci::NamespaceMirror.contains_any_of_namespaces(
- group_members.where('access_level >= ?', level).pluck(:source_id)
- )
+ search_members = group_members.where('access_level >= ?', level)
+
+ # This reduces searched prefixes to only shortest ones
+ # to avoid querying descendants since they are already covered
+ # by ancestor namespaces. If the FF is not available fallback to
+ # inefficient search: https://gitlab.com/gitlab-org/gitlab/-/issues/336436
+ unless Feature.enabled?(:use_traversal_ids, default_enabled: :yaml)
+ return Ci::NamespaceMirror.contains_any_of_namespaces(search_members.pluck(:source_id))
+ end
+
+ traversal_ids = Group.joins(:all_group_members)
+ .merge(search_members)
+ .shortest_traversal_ids_prefixes
+
+ # Use efficient btree index to perform search
+ if Feature.enabled?(:ci_owned_runners_unnest_index, self, default_enabled: :yaml)
+ Ci::NamespaceMirror.contains_traversal_ids(traversal_ids)
+ else
+ Ci::NamespaceMirror.contains_any_of_namespaces(traversal_ids.map(&:last))
+ end
end
end
diff --git a/app/models/user_custom_attribute.rb b/app/models/user_custom_attribute.rb
index 727975c3f6e..62614a851c1 100644
--- a/app/models/user_custom_attribute.rb
+++ b/app/models/user_custom_attribute.rb
@@ -5,4 +5,14 @@ class UserCustomAttribute < ApplicationRecord
validates :user_id, :key, :value, presence: true
validates :key, uniqueness: { scope: [:user_id] }
+
+ def self.upsert_custom_attributes(custom_attributes)
+ created_at = DateTime.now
+ updated_at = DateTime.now
+
+ custom_attributes.map! do |custom_attribute|
+ custom_attribute.merge({ created_at: created_at, updated_at: updated_at })
+ end
+ upsert_all(custom_attributes, unique_by: [:user_id, :key])
+ end
end
diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb
index 7687430cfd1..9b4c0a2527a 100644
--- a/app/models/user_preference.rb
+++ b/app/models/user_preference.rb
@@ -19,6 +19,9 @@ class UserPreference < ApplicationRecord
greater_than_or_equal_to: Gitlab::TabWidth::MIN,
less_than_or_equal_to: Gitlab::TabWidth::MAX
}
+ validates :diffs_deletion_color, :diffs_addition_color,
+ format: { with: ColorsHelper::HEX_COLOR_PATTERN },
+ allow_blank: true
ignore_columns :experience_level, remove_with: '14.10', remove_after: '2021-03-22'
diff --git a/app/models/users/callout.rb b/app/models/users/callout.rb
index 0922323e12b..a91a3406b22 100644
--- a/app/models/users/callout.rb
+++ b/app/models/users/callout.rb
@@ -48,7 +48,8 @@ module Users
storage_enforcement_banner_third_enforcement_threshold: 45,
storage_enforcement_banner_fourth_enforcement_threshold: 46,
attention_requests_top_nav: 47,
- attention_requests_side_nav: 48
+ attention_requests_side_nav: 48,
+ minute_limit_banner: 49
}
validates :feature_name,
diff --git a/app/models/users/group_callout.rb b/app/models/users/group_callout.rb
index 839be8d2a48..373bc30889f 100644
--- a/app/models/users/group_callout.rb
+++ b/app/models/users/group_callout.rb
@@ -14,7 +14,9 @@ module Users
storage_enforcement_banner_first_enforcement_threshold: 3,
storage_enforcement_banner_second_enforcement_threshold: 4,
storage_enforcement_banner_third_enforcement_threshold: 5,
- storage_enforcement_banner_fourth_enforcement_threshold: 6
+ storage_enforcement_banner_fourth_enforcement_threshold: 6,
+ preview_user_over_limit_free_plan_alert: 7, # EE-only
+ user_reached_limit_free_plan_alert: 8 # EE-only
}
validates :group, presence: true
diff --git a/app/models/users/in_product_marketing_email.rb b/app/models/users/in_product_marketing_email.rb
index 1f1eaacfe5c..f2f1d18339e 100644
--- a/app/models/users/in_product_marketing_email.rb
+++ b/app/models/users/in_product_marketing_email.rb
@@ -26,12 +26,17 @@ module Users
invite_team: 8
}, _suffix: true
+ # Tracks we don't send emails for (e.g. unsuccessful experiment). These
+ # are kept since we already have DB records that use the enum value.
+ INACTIVE_TRACK_NAMES = %w(invite_team).freeze
+ ACTIVE_TRACKS = tracks.except(*INACTIVE_TRACK_NAMES)
+
scope :without_track_and_series, -> (track, series) do
users = User.arel_table
product_emails = arel_table
join_condition = users[:id].eq(product_emails[:user_id])
- .and(product_emails[:track]).eq(tracks[track])
+ .and(product_emails[:track]).eq(ACTIVE_TRACKS[track])
.and(product_emails[:series]).eq(series)
arel_join = users.join(product_emails, Arel::Nodes::OuterJoin).on(join_condition)
diff --git a/app/models/vulnerability.rb b/app/models/vulnerability.rb
index a5881e80e88..8bb598ee316 100644
--- a/app/models/vulnerability.rb
+++ b/app/models/vulnerability.rb
@@ -5,6 +5,8 @@ class Vulnerability < ApplicationRecord
include EachBatch
include IgnorableColumns
+ alias_attribute :vulnerability_id, :id
+
def self.link_reference_pattern
nil
end
diff --git a/app/models/wiki.rb b/app/models/wiki.rb
index 622070abd88..b3f09b20463 100644
--- a/app/models/wiki.rb
+++ b/app/models/wiki.rb
@@ -10,12 +10,46 @@ class Wiki
extend ActiveModel::Naming
MARKUPS = { # rubocop:disable Style/MultilineIfModifier
- 'Markdown' => :markdown,
- 'RDoc' => :rdoc,
- 'AsciiDoc' => :asciidoc,
- 'Org' => :org
+ markdown: {
+ name: 'Markdown',
+ default_extension: :md,
+ created_by_user: true
+ },
+ rdoc: {
+ name: 'RDoc',
+ default_extension: :rdoc,
+ created_by_user: true
+ },
+ asciidoc: {
+ name: 'AsciiDoc',
+ default_extension: :asciidoc,
+ created_by_user: true
+ },
+ org: {
+ name: 'Org',
+ default_extension: :org,
+ created_by_user: true
+ },
+ textile: {
+ name: 'Textile',
+ default_extension: :textile
+ },
+ creole: {
+ name: 'Creole',
+ default_extension: :creole
+ },
+ rest: {
+ name: 'reStructuredText',
+ default_extension: :rst
+ },
+ mediawiki: {
+ name: 'MediaWiki',
+ default_extension: :mediawiki
+ }
}.freeze unless defined?(MARKUPS)
+ VALID_USER_MARKUPS = MARKUPS.select { |_, v| v[:created_by_user] }.freeze unless defined?(VALID_USER_MARKUPS)
+
CouldNotCreateWikiError = Class.new(StandardError)
HOMEPAGE = 'home'
@@ -184,12 +218,37 @@ class Wiki
end
def update_page(page, content:, title: nil, format: :markdown, message: nil)
- commit = commit_details(:updated, message, page.title)
+ if Feature.enabled?(:gitaly_replace_wiki_update_page, container, default_enabled: :yaml)
+ with_valid_format(format) do |default_extension|
+ title = title.presence || Pathname(page.path).sub_ext('').to_s
- wiki.update_page(page.path, title || page.name, format.to_sym, content, commit)
- after_wiki_activity
+ # If the format is the same we keep the former extension. This check is for formats
+ # that can have more than one extension like Markdown (.md, .markdown)
+ # If we don't do this we will override the existing extension.
+ extension = page.format != format.to_sym ? default_extension : File.extname(page.path).downcase[1..]
- true
+ capture_git_error(:updated) do
+ repository.update_file(
+ user,
+ sluggified_full_path(title, extension),
+ content,
+ previous_path: page.path,
+ **multi_commit_options(:updated, message, title))
+
+ after_wiki_activity
+
+ true
+ end
+ end
+ else
+ commit = commit_details(:updated, message, page.title)
+
+ wiki.update_page(page.path, title || page.name, format.to_sym, content, commit)
+
+ after_wiki_activity
+
+ true
+ end
end
def delete_page(page, message = nil)
@@ -296,7 +355,7 @@ class Wiki
git_user = Gitlab::Git::User.from_gitlab(user)
{
- branch_name: repository.root_ref,
+ branch_name: repository.root_ref || default_branch,
message: commit_message,
author_email: git_user.email,
author_name: git_user.name
@@ -321,6 +380,26 @@ class Wiki
def default_message(action, title)
"#{user.username} #{action} page: #{title}"
end
+
+ def with_valid_format(format, &block)
+ default_extension = Wiki::VALID_USER_MARKUPS.dig(format.to_sym, :default_extension).to_s
+
+ if default_extension.blank?
+ @error_message = _('Invalid format selected')
+
+ return false
+ end
+
+ yield default_extension
+ end
+
+ def sluggified_full_path(title, extension)
+ sluggified_title(title) + '.' + extension
+ end
+
+ def sluggified_title(title)
+ Gitlab::EncodingHelper.encode_utf8_no_detect(title).tr(' ', '-')
+ end
end
Wiki.prepend_mod_with('Wiki')
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index 803b9781ac4..647b4e787c6 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -185,7 +185,7 @@ class WikiPage
# :content - The raw markup content.
# :format - Optional symbol representing the
# content format. Can be any type
- # listed in the Wiki::MARKUPS
+ # listed in the Wiki::VALID_USER_MARKUPS
# Hash.
# :message - Optional commit message to set on
# the new page.
@@ -205,7 +205,7 @@ class WikiPage
# attrs - Hash of attributes to be updated on the page.
# :content - The raw markup content to replace the existing.
# :format - Optional symbol representing the content format.
- # See Wiki::MARKUPS Hash for available formats.
+ # See Wiki::VALID_USER_MARKUPS Hash for available formats.
# :message - Optional commit message to set on the new version.
# :last_commit_sha - Optional last commit sha to validate the page unchanged.
# :title - The Title (optionally including dir) to replace existing title
@@ -222,7 +222,7 @@ class WikiPage
update_attributes(attrs)
- if title.present? && title_changed? && wiki.find_page(title).present?
+ if title.present? && title_changed? && wiki.find_page(title, load_content: false).present?
attributes[:title] = page.title
raise PageRenameError, s_('WikiEdit|There is already a page with the same title in that path.')
end
diff --git a/app/models/work_items/type.rb b/app/models/work_items/type.rb
index 080513b28e9..e2d38dc9903 100644
--- a/app/models/work_items/type.rb
+++ b/app/models/work_items/type.rb
@@ -37,7 +37,7 @@ module WorkItems
validates :icon_name, length: { maximum: 255 }
scope :default, -> { where(namespace: nil) }
- scope :order_by_name_asc, -> { order('LOWER(name)') }
+ scope :order_by_name_asc, -> { order(arel_table[:name].lower.asc) }
scope :by_type, ->(base_type) { where(base_type: base_type) }
def self.default_by_type(type)
diff --git a/app/policies/alert_management/alert_policy.rb b/app/policies/alert_management/alert_policy.rb
index e2383921c82..9b6ce72851c 100644
--- a/app/policies/alert_management/alert_policy.rb
+++ b/app/policies/alert_management/alert_policy.rb
@@ -3,7 +3,15 @@
module AlertManagement
class AlertPolicy < ::BasePolicy
delegate { @subject.project }
+
+ rule { can?(:read_alert_management_alert) }.policy do
+ enable :read_alert_management_metric_image
+ end
+
+ rule { can?(:update_alert_management_alert) }.policy do
+ enable :upload_alert_management_metric_image
+ enable :update_alert_management_metric_image
+ enable :destroy_alert_management_metric_image
+ end
end
end
-
-AlertManagement::AlertPolicy.prepend_mod
diff --git a/app/policies/environment_policy.rb b/app/policies/environment_policy.rb
index e9e3517b3da..72db6d31764 100644
--- a/app/policies/environment_policy.rb
+++ b/app/policies/environment_policy.rb
@@ -4,12 +4,12 @@ class EnvironmentPolicy < BasePolicy
delegate { @subject.project }
condition(:stop_with_deployment_allowed) do
- @subject.stop_action_available? &&
- can?(:create_deployment) && can?(:update_build, @subject.stop_action)
+ @subject.stop_actions_available? &&
+ can?(:create_deployment) && can?(:update_build, @subject.stop_actions.last)
end
condition(:stop_with_update_allowed) do
- !@subject.stop_action_available? && can?(:update_environment, @subject)
+ !@subject.stop_actions_available? && can?(:update_environment, @subject)
end
condition(:stopped) do
diff --git a/app/policies/project_member_policy.rb b/app/policies/project_member_policy.rb
index 91f1eb35506..40ba30fce5e 100644
--- a/app/policies/project_member_policy.rb
+++ b/app/policies/project_member_policy.rb
@@ -3,13 +3,16 @@
class ProjectMemberPolicy < BasePolicy
delegate { @subject.project }
- condition(:target_is_owner, scope: :subject) { @subject.user == @subject.project.owner }
+ condition(:target_is_holder_of_the_personal_namespace, scope: :subject) do
+ @subject.project.personal_namespace_holder?(@subject.user)
+ end
+
condition(:target_is_self) { @user && @subject.user == @user }
condition(:project_bot) { @subject.user&.project_bot? }
rule { anonymous }.prevent_all
- rule { target_is_owner }.policy do
+ rule { target_is_holder_of_the_personal_namespace }.policy do
prevent :update_project_member
prevent :destroy_project_member
end
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index 2ffafb79134..a417ea35673 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -728,6 +728,10 @@ class ProjectPolicy < BasePolicy
enable :create_resource_access_tokens
end
+ rule { can?(:admin_project) }.policy do
+ enable :read_usage_quotas
+ end
+
rule { can?(:project_bot_access) }.policy do
prevent :create_resource_access_tokens
end
diff --git a/app/policies/suggestion_policy.rb b/app/policies/suggestion_policy.rb
index 4c84c8ba690..3c273dc6d39 100644
--- a/app/policies/suggestion_policy.rb
+++ b/app/policies/suggestion_policy.rb
@@ -1,10 +1,10 @@
# frozen_string_literal: true
class SuggestionPolicy < BasePolicy
- delegate { @subject.project }
+ delegate { @subject.source_project }
condition(:can_push_to_branch) do
- Gitlab::UserAccess.new(@user, container: @subject.project).can_push_to_branch?(@subject.branch)
+ Gitlab::UserAccess.new(@user, container: @subject.source_project).can_push_to_branch?(@subject.branch)
end
rule { can_push_to_branch }.enable :apply_suggestion
diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb
index de99cbffb6f..f62ccef826c 100644
--- a/app/policies/user_policy.rb
+++ b/app/policies/user_policy.rb
@@ -25,6 +25,7 @@ class UserPolicy < BasePolicy
enable :update_user_status
enable :create_saved_replies
enable :update_saved_replies
+ enable :destroy_saved_replies
enable :read_user_personal_access_tokens
enable :read_group_count
enable :read_user_groups
diff --git a/app/presenters/README.md b/app/presenters/README.md
index 31e5c971a88..e2461580107 100644
--- a/app/presenters/README.md
+++ b/app/presenters/README.md
@@ -68,9 +68,11 @@ we gain the following benefits:
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`.
+
+It provides a `.presents` class method which allows you to define the class the presenter is wrapping,
+and specify an accessor for the presented object using the `as:` keyword.
+
+It also includes common helpers like `Gitlab::Routing` and `Gitlab::Allowable`.
```ruby
class LabelPresenter < Gitlab::View::Presenter::Simple
diff --git a/app/presenters/ci/bridge_presenter.rb b/app/presenters/ci/bridge_presenter.rb
index a62d7cdbbd4..ded3844ac99 100644
--- a/app/presenters/ci/bridge_presenter.rb
+++ b/app/presenters/ci/bridge_presenter.rb
@@ -2,11 +2,11 @@
module Ci
class BridgePresenter < ProcessablePresenter
- presents ::Ci::Bridge
+ presents ::Ci::Bridge, as: :bridge
delegator_override :detailed_status
def detailed_status
- @detailed_status ||= subject.detailed_status(user)
+ @detailed_status ||= bridge.detailed_status(user)
end
end
end
diff --git a/app/presenters/ci/build_presenter.rb b/app/presenters/ci/build_presenter.rb
index 65e1c80085f..0be684901d5 100644
--- a/app/presenters/ci/build_presenter.rb
+++ b/app/presenters/ci/build_presenter.rb
@@ -2,7 +2,7 @@
module Ci
class BuildPresenter < ProcessablePresenter
- presents ::Ci::Build
+ presents ::Ci::Build, as: :build
def erased_by_user?
# Build can be erased through API, therefore it does not have
@@ -34,7 +34,7 @@ module Ci
end
def tooltip_message
- "#{subject.name} - #{detailed_status.status_tooltip}"
+ "#{build.name} - #{detailed_status.status_tooltip}"
end
def execute_in
@@ -48,7 +48,7 @@ module Ci
end
def detailed_status
- @detailed_status ||= subject.detailed_status(user)
+ @detailed_status ||= build.detailed_status(user)
end
end
end
diff --git a/app/presenters/ci/build_runner_presenter.rb b/app/presenters/ci/build_runner_presenter.rb
index 082993130a1..015dfc16df0 100644
--- a/app/presenters/ci/build_runner_presenter.rb
+++ b/app/presenters/ci/build_runner_presenter.rb
@@ -64,35 +64,50 @@ module Ci
def create_archive(artifacts)
return unless artifacts[:untracked] || artifacts[:paths]
- archive = {
- artifact_type: :archive,
- artifact_format: :zip,
- name: artifacts[:name],
- untracked: artifacts[:untracked],
- paths: artifacts[:paths],
- when: artifacts[:when],
- expire_in: artifacts[:expire_in]
- }
-
- if artifacts.dig(:exclude).present?
- archive.merge(exclude: artifacts[:exclude])
- else
- archive
+ BuildArtifact.for_archive(artifacts).to_h.tap do |artifact|
+ artifact.delete(:exclude) unless artifact[:exclude].present?
end
end
def create_reports(reports, expire_in:)
return unless reports&.any?
- reports.map do |report_type, report_paths|
- {
- artifact_type: report_type.to_sym,
- artifact_format: ::Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.fetch(report_type.to_sym),
- name: ::Ci::JobArtifact::DEFAULT_FILE_NAMES.fetch(report_type.to_sym),
- paths: report_paths,
+ reports.map { |report| BuildArtifact.for_report(report, expire_in).to_h.compact }
+ end
+
+ BuildArtifact = Struct.new(:name, :untracked, :paths, :exclude, :when, :expire_in, :artifact_type, :artifact_format, keyword_init: true) do
+ def self.for_archive(artifacts)
+ self.new(
+ artifact_type: :archive,
+ artifact_format: :zip,
+ name: artifacts[:name],
+ untracked: artifacts[:untracked],
+ paths: artifacts[:paths],
+ when: artifacts[:when],
+ expire_in: artifacts[:expire_in],
+ exclude: artifacts[:exclude]
+ )
+ end
+
+ def self.for_report(report, expire_in)
+ type, params = report
+
+ if type == :coverage_report
+ artifact_type = params[:coverage_format].to_sym
+ paths = [params[:path]]
+ else
+ artifact_type = type
+ paths = params
+ end
+
+ self.new(
+ artifact_type: artifact_type,
+ artifact_format: ::Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.fetch(artifact_type),
+ name: ::Ci::JobArtifact::DEFAULT_FILE_NAMES.fetch(artifact_type),
+ paths: paths,
when: 'always',
expire_in: expire_in
- }
+ )
end
end
diff --git a/app/presenters/clusterable_presenter.rb b/app/presenters/clusterable_presenter.rb
index 82152ce42ae..c2ed40d8b0c 100644
--- a/app/presenters/clusterable_presenter.rb
+++ b/app/presenters/clusterable_presenter.rb
@@ -36,6 +36,10 @@ class ClusterablePresenter < Gitlab::View::Presenter::Delegated
polymorphic_path([clusterable, :clusters], action: :connect)
end
+ def new_cluster_docs_path
+ polymorphic_path([clusterable, :clusters], action: :new_cluster_docs)
+ end
+
def authorize_aws_role_path
polymorphic_path([clusterable, :clusters], action: :authorize_aws_role)
end
diff --git a/app/presenters/commit_status_presenter.rb b/app/presenters/commit_status_presenter.rb
index 250715d7c9c..fdfcc896bf8 100644
--- a/app/presenters/commit_status_presenter.rb
+++ b/app/presenters/commit_status_presenter.rb
@@ -39,7 +39,7 @@ class CommitStatusPresenter < Gitlab::View::Presenter::Delegated
private_constant :CALLOUT_FAILURE_MESSAGES
- presents ::CommitStatus, as: :build
+ presents ::CommitStatus
def self.callout_failure_messages
CALLOUT_FAILURE_MESSAGES
diff --git a/app/presenters/dev_ops_report/metric_presenter.rb b/app/presenters/dev_ops_report/metric_presenter.rb
index 55326f8f678..ec85c5d3809 100644
--- a/app/presenters/dev_ops_report/metric_presenter.rb
+++ b/app/presenters/dev_ops_report/metric_presenter.rb
@@ -2,28 +2,28 @@
module DevOpsReport
class MetricPresenter < Gitlab::View::Presenter::Simple
- presents ::DevOpsReport::Metric
+ presents ::DevOpsReport::Metric, as: :metric
- delegate :created_at, to: :subject
+ delegate :created_at, to: :metric
def cards
[
Card.new(
- metric: subject,
+ metric: metric,
title: 'Issues',
description: 'created per active user',
feature: 'issues',
blog: 'https://www2.deloitte.com/content/dam/Deloitte/se/Documents/technology-media-telecommunications/deloitte-digital-collaboration.pdf'
),
Card.new(
- metric: subject,
+ metric: metric,
title: 'Comments',
description: 'created per active user',
feature: 'notes',
blog: 'http://conversationaldevelopment.com/why/'
),
Card.new(
- metric: subject,
+ metric: metric,
title: 'Milestones',
description: 'created per active user',
feature: 'milestones',
@@ -31,7 +31,7 @@ module DevOpsReport
docs: help_page_path('user/project/milestones/index')
),
Card.new(
- metric: subject,
+ metric: metric,
title: 'Boards',
description: 'created per active user',
feature: 'boards',
@@ -39,7 +39,7 @@ module DevOpsReport
docs: help_page_path('user/project/issue_board')
),
Card.new(
- metric: subject,
+ metric: metric,
title: 'Merge requests',
description: 'per active user',
feature: 'merge_requests',
@@ -47,7 +47,7 @@ module DevOpsReport
docs: help_page_path('user/project/merge_requests/index')
),
Card.new(
- metric: subject,
+ metric: metric,
title: 'Pipelines',
description: 'created per active user',
feature: 'ci_pipelines',
@@ -55,7 +55,7 @@ module DevOpsReport
docs: help_page_path('ci/index')
),
Card.new(
- metric: subject,
+ metric: metric,
title: 'Environments',
description: 'created per active user',
feature: 'environments',
@@ -63,14 +63,14 @@ module DevOpsReport
docs: help_page_path('ci/environments')
),
Card.new(
- metric: subject,
+ metric: metric,
title: 'Deployments',
description: 'created per active user',
feature: 'deployments',
blog: 'https://puppet.com/blog/continuous-delivery-vs-continuous-deployment-what-s-diff'
),
Card.new(
- metric: subject,
+ metric: metric,
title: 'Monitoring',
description: 'fraction of all projects',
feature: 'projects_prometheus_active',
@@ -78,7 +78,7 @@ module DevOpsReport
docs: help_page_path('user/project/integrations/prometheus')
),
Card.new(
- metric: subject,
+ metric: metric,
title: 'Service Desk',
description: 'issues created per active user',
feature: 'service_desk_issues',
@@ -91,52 +91,52 @@ module DevOpsReport
def idea_to_production_steps
[
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Idea',
features: %w(issues)
),
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Issue',
features: %w(issues notes)
),
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Plan',
features: %w(milestones boards)
),
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Code',
features: %w(merge_requests)
),
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Commit',
features: %w(merge_requests)
),
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Test',
features: %w(ci_pipelines)
),
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Review',
features: %w(ci_pipelines environments)
),
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Staging',
features: %w(environments deployments)
),
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Production',
features: %w(deployments)
),
IdeaToProductionStep.new(
- metric: subject,
+ metric: metric,
title: 'Feedback',
features: %w(projects_prometheus_active service_desk_issues)
)
diff --git a/app/presenters/event_presenter.rb b/app/presenters/event_presenter.rb
index 4c787b88e20..7fa87d33c0d 100644
--- a/app/presenters/event_presenter.rb
+++ b/app/presenters/event_presenter.rb
@@ -3,7 +3,7 @@
class EventPresenter < Gitlab::View::Presenter::Delegated
presents ::Event, as: :event
- def initialize(subject, **attributes)
+ def initialize(event, **attributes)
super
@visible_to_user_cache = ActiveSupport::Cache::MemoryStore.new
diff --git a/app/presenters/gitlab/blame_presenter.rb b/app/presenters/gitlab/blame_presenter.rb
index 5dd2f3adda5..81a954761ea 100644
--- a/app/presenters/gitlab/blame_presenter.rb
+++ b/app/presenters/gitlab/blame_presenter.rb
@@ -21,19 +21,23 @@ module Gitlab
:project_blame_link,
:time_ago_tooltip)
- def initialize(subject, **attributes)
+ def initialize(blame, **attributes)
super
@commits = {}
precalculate_data_by_commit!
end
+ def first_line
+ blame.first_line
+ end
+
def groups
@groups ||= blame.groups
end
- def commit_data(commit)
- @commits[commit.id] ||= get_commit_data(commit)
+ def commit_data(commit, previous_path = nil)
+ @commits[commit.id] ||= get_commit_data(commit, previous_path)
end
private
@@ -44,25 +48,25 @@ module Gitlab
# to avoid recalculating it multiple times.
# For such files, it could significantly improve the performance of the Blame.
def precalculate_data_by_commit!
- groups.each { |group| commit_data(group[:commit]) }
+ groups.each { |group| commit_data(group[:commit], group[:previous_path]) }
end
- def get_commit_data(commit)
+ def get_commit_data(commit, previous_path = nil)
CommitData.new.tap do |data|
data.author_avatar = author_avatar(commit, size: 36, has_tooltip: false, lazy: true)
data.age_map_class = age_map_class(commit.committed_date, project_duration)
data.commit_link = link_to commit.title, project_commit_path(project, commit.id), class: "cdark", title: commit.title
data.commit_author_link = commit_author_link(commit, avatar: false)
- data.project_blame_link = project_blame_link(commit)
+ data.project_blame_link = project_blame_link(commit, previous_path)
data.time_ago_tooltip = time_ago_with_tooltip(commit.committed_date)
end
end
- def project_blame_link(commit)
+ def project_blame_link(commit, previous_path = nil)
previous_commit_id = commit.parent_id
- return unless previous_commit_id
+ return unless previous_commit_id && !previous_path.nil?
- link_to project_blame_path(project, tree_join(previous_commit_id, path)),
+ link_to project_blame_path(project, tree_join(previous_commit_id, previous_path)),
title: _('View blame prior to this change'),
aria: { label: _('View blame prior to this change') },
class: 'version-link',
diff --git a/app/presenters/instance_clusterable_presenter.rb b/app/presenters/instance_clusterable_presenter.rb
index 9e4a3b403ea..001c9cbb4e9 100644
--- a/app/presenters/instance_clusterable_presenter.rb
+++ b/app/presenters/instance_clusterable_presenter.rb
@@ -43,6 +43,11 @@ class InstanceClusterablePresenter < ClusterablePresenter
connect_admin_clusters_path
end
+ override :new_cluster_docs_path
+ def new_cluster_docs_path
+ nil
+ end
+
override :create_user_clusters_path
def create_user_clusters_path
create_user_admin_clusters_path
diff --git a/app/presenters/issue_presenter.rb b/app/presenters/issue_presenter.rb
index 72fe14d224d..75f6d749acb 100644
--- a/app/presenters/issue_presenter.rb
+++ b/app/presenters/issue_presenter.rb
@@ -4,7 +4,9 @@ class IssuePresenter < Gitlab::View::Presenter::Delegated
presents ::Issue, as: :issue
def issue_path
- url_builder.build(issue, only_path: true)
+ return url_builder.build(issue, only_path: true) unless use_work_items_path?
+
+ project_work_items_path(issue.project, work_items_path: issue.id)
end
delegator_override :subscribed?
@@ -15,6 +17,18 @@ class IssuePresenter < Gitlab::View::Presenter::Delegated
def project_emails_disabled?
issue.project.emails_disabled?
end
+
+ def web_url
+ return super unless use_work_items_path?
+
+ project_work_items_url(issue.project, work_items_path: issue.id)
+ end
+
+ private
+
+ def use_work_items_path?
+ issue.issue_type == 'task' && issue.project.work_items_feature_flag_enabled?
+ end
end
IssuePresenter.prepend_mod_with('IssuePresenter')
diff --git a/app/presenters/label_presenter.rb b/app/presenters/label_presenter.rb
index 6929bf79fdf..e60cdf4088c 100644
--- a/app/presenters/label_presenter.rb
+++ b/app/presenters/label_presenter.rb
@@ -4,8 +4,6 @@ class LabelPresenter < Gitlab::View::Presenter::Delegated
presents ::Label, as: :label
delegate :name, :full_name, to: :label_subject, prefix: :subject, allow_nil: true
- 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/pages_domain_presenter.rb b/app/presenters/pages_domain_presenter.rb
index 0523f702416..d730608cc27 100644
--- a/app/presenters/pages_domain_presenter.rb
+++ b/app/presenters/pages_domain_presenter.rb
@@ -3,8 +3,6 @@
class PagesDomainPresenter < Gitlab::View::Presenter::Delegated
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?
end
diff --git a/app/presenters/projects/security/configuration_presenter.rb b/app/presenters/projects/security/configuration_presenter.rb
index 1798d4b780f..77f4d57ae09 100644
--- a/app/presenters/projects/security/configuration_presenter.rb
+++ b/app/presenters/projects/security/configuration_presenter.rb
@@ -81,7 +81,8 @@ module Projects
configured: scan.configured?,
configuration_path: scan.configuration_path,
available: scan.available?,
- can_enable_by_merge_request: scan.can_enable_by_merge_request?
+ can_enable_by_merge_request: scan.can_enable_by_merge_request?,
+ meta_info_path: scan.meta_info_path
}
end
diff --git a/app/serializers/deployment_entity.rb b/app/serializers/deployment_entity.rb
index 020c66af777..f63a1bf094a 100644
--- a/app/serializers/deployment_entity.rb
+++ b/app/serializers/deployment_entity.rb
@@ -23,6 +23,7 @@ class DeploymentEntity < Grape::Entity
expose :tag
expose :last?
expose :last?, as: :is_last
+ expose :tier_in_yaml
expose :deployed_by, as: :user, using: UserEntity
diff --git a/app/serializers/environment_entity.rb b/app/serializers/environment_entity.rb
index d484f60ed8f..634be365a9d 100644
--- a/app/serializers/environment_entity.rb
+++ b/app/serializers/environment_entity.rb
@@ -18,7 +18,7 @@ class EnvironmentEntity < Grape::Entity
expose :environment_type
expose :name_without_type
expose :last_deployment, using: DeploymentEntity
- expose :stop_action_available?, as: :has_stop_action
+ expose :stop_actions_available?, as: :has_stop_action
expose :rollout_status, if: -> (*) { can_read_deploy_board? }, using: RolloutStatusEntity
expose :tier
diff --git a/app/serializers/environment_status_entity.rb b/app/serializers/environment_status_entity.rb
index 40db23c143e..e8cf7980f5e 100644
--- a/app/serializers/environment_status_entity.rb
+++ b/app/serializers/environment_status_entity.rb
@@ -16,7 +16,7 @@ class EnvironmentStatusEntity < Grape::Entity
end
expose :metrics_monitoring_url, if: ->(*) { can_read_environment? } do |es|
- environment_metrics_path(es.environment)
+ project_metrics_dashboard_path(es.project, environment: es.environment)
end
expose :stop_url, if: ->(*) { can_stop_environment? } do |es|
diff --git a/app/serializers/group_link/group_group_link_entity.rb b/app/serializers/group_link/group_group_link_entity.rb
index cedc8bd8582..563a75ccdaa 100644
--- a/app/serializers/group_link/group_group_link_entity.rb
+++ b/app/serializers/group_link/group_group_link_entity.rb
@@ -4,22 +4,14 @@ module GroupLink
class GroupGroupLinkEntity < GroupLink::GroupLinkEntity
include RequestAwareEntity
- expose :can_update do |group_link|
- can_manage?(group_link)
- end
-
- expose :can_remove do |group_link|
- can_manage?(group_link)
+ expose :source do |group_link|
+ GroupEntity.represent(group_link.shared_from, only: [:id, :full_name, :web_url])
end
private
- def current_user
- options[:current_user]
- end
-
- def can_manage?(group_link)
- can?(current_user, :admin_group_member, group_link.shared_group)
+ def admin_permission_name
+ :admin_group_member
end
end
end
diff --git a/app/serializers/group_link/group_link_entity.rb b/app/serializers/group_link/group_link_entity.rb
index 12349320b6f..73c9931fc70 100644
--- a/app/serializers/group_link/group_link_entity.rb
+++ b/app/serializers/group_link/group_link_entity.rb
@@ -30,5 +30,32 @@ module GroupLink
expose :shared_with_group, merge: true, using: GroupBasicEntity
end
+
+ expose :can_update do |group_link, options|
+ can_admin_shared_from?(group_link, options)
+ end
+
+ expose :can_remove do |group_link, options|
+ can_admin_shared_from?(group_link, options)
+ end
+
+ expose :is_direct_member do |group_link, options|
+ direct_member?(group_link, options)
+ end
+
+ private
+
+ def current_user
+ options[:current_user]
+ end
+
+ def direct_member?(group_link, options)
+ group_link.shared_from == options[:source]
+ end
+
+ def can_admin_shared_from?(group_link, options)
+ direct_member?(group_link, options) &&
+ can?(current_user, admin_permission_name, group_link.shared_from)
+ end
end
end
diff --git a/app/serializers/group_link/project_group_link_entity.rb b/app/serializers/group_link/project_group_link_entity.rb
index bcdafd8d685..c667bcd5bf4 100644
--- a/app/serializers/group_link/project_group_link_entity.rb
+++ b/app/serializers/group_link/project_group_link_entity.rb
@@ -4,18 +4,14 @@ module GroupLink
class ProjectGroupLinkEntity < GroupLink::GroupLinkEntity
include RequestAwareEntity
- expose :can_update do |group_link|
- can?(current_user, :admin_project_member, group_link.project)
- end
-
- expose :can_remove do |group_link|
- can?(current_user, :admin_project_member, group_link.project)
+ expose :source do |group_link|
+ ProjectEntity.represent(group_link.shared_from, only: [:id, :full_name])
end
private
- def current_user
- options[:current_user]
+ def admin_permission_name
+ :admin_project_member
end
end
end
diff --git a/app/serializers/issue_entity.rb b/app/serializers/issue_entity.rb
index 773bbf268eb..fbcfcf84d9b 100644
--- a/app/serializers/issue_entity.rb
+++ b/app/serializers/issue_entity.rb
@@ -61,7 +61,7 @@ class IssueEntity < IssuableEntity
end
expose :locked_discussion_docs_path, if: -> (issue) { issue.discussion_locked? } do |issue|
- help_page_path('user/discussions/index.md', anchor: 'lock-discussions')
+ help_page_path('user/discussions/index.md', anchor: 'prevent-comments-by-locking-an-issue')
end
expose :is_project_archived do |issue|
diff --git a/app/serializers/member_user_entity.rb b/app/serializers/member_user_entity.rb
index fde3282ad25..b3d8efc9143 100644
--- a/app/serializers/member_user_entity.rb
+++ b/app/serializers/member_user_entity.rb
@@ -5,6 +5,9 @@ class MemberUserEntity < UserEntity
unexpose :state
unexpose :status_tooltip_html
+ expose :created_at
+ expose :last_activity_on
+
expose :avatar_url do |user|
user.avatar_url(size: Member::AVATAR_SIZE, only_path: false)
end
diff --git a/app/serializers/merge_request_noteable_entity.rb b/app/serializers/merge_request_noteable_entity.rb
index a356b5b5cd4..f8c8e3538da 100644
--- a/app/serializers/merge_request_noteable_entity.rb
+++ b/app/serializers/merge_request_noteable_entity.rb
@@ -43,7 +43,7 @@ class MergeRequestNoteableEntity < IssuableEntity
end
expose :locked_discussion_docs_path, if: -> (merge_request) { merge_request.discussion_locked? } do |merge_request|
- help_page_path('user/discussions/index.md', anchor: 'lock-discussions')
+ help_page_path('user/discussions/index.md', anchor: 'prevent-comments-by-locking-an-issue')
end
expose :is_project_archived do |merge_request|
diff --git a/app/serializers/merge_request_serializer.rb b/app/serializers/merge_request_serializer.rb
index e8fc18e6cf3..9fd50c8c51d 100644
--- a/app/serializers/merge_request_serializer.rb
+++ b/app/serializers/merge_request_serializer.rb
@@ -27,5 +27,3 @@ class MergeRequestSerializer < BaseSerializer
super(merge_request, opts, entity)
end
end
-
-MergeRequestSerializer.prepend_mod_with('MergeRequestSerializer')
diff --git a/app/services/alert_management/metric_images/upload_service.rb b/app/services/alert_management/metric_images/upload_service.rb
new file mode 100644
index 00000000000..e9db10594df
--- /dev/null
+++ b/app/services/alert_management/metric_images/upload_service.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module AlertManagement
+ module MetricImages
+ class UploadService < BaseService
+ attr_reader :alert, :file, :url, :url_text, :metric
+
+ def initialize(alert, current_user, params = {})
+ super
+
+ @alert = alert
+ @file = params.fetch(:file)
+ @url = params.fetch(:url, nil)
+ @url_text = params.fetch(:url_text, nil)
+ end
+
+ def execute
+ unless can_upload_metrics?
+ return ServiceResponse.error(
+ message: _("You are not authorized to upload metric images"),
+ http_status: :forbidden
+ )
+ end
+
+ metric = AlertManagement::MetricImage.new(
+ alert: alert,
+ file: file,
+ url: url,
+ url_text: url_text
+ )
+
+ if metric.save
+ ServiceResponse.success(payload: { metric: metric, alert: alert })
+ else
+ ServiceResponse.error(message: metric.errors.full_messages.join(', '), http_status: :bad_request)
+ end
+ end
+
+ private
+
+ def can_upload_metrics?
+ alert.metric_images_available? && current_user&.can?(:upload_alert_management_metric_image, alert)
+ end
+ end
+ end
+end
diff --git a/app/services/audit_event_service.rb b/app/services/audit_event_service.rb
index ad733c455a9..97debccfb18 100644
--- a/app/services/audit_event_service.rb
+++ b/app/services/audit_event_service.rb
@@ -14,14 +14,16 @@ class AuditEventService
# @param [Hash] details extra data of audit event
# @param [Symbol] save_type the type to save the event
# Can be selected from the following, :database, :stream, :database_and_stream .
+ # @params [DateTime] created_at the time the action occured
#
# @return [AuditEventService]
- def initialize(author, entity, details = {}, save_type = :database_and_stream)
+ def initialize(author, entity, details = {}, save_type = :database_and_stream, created_at = DateTime.current)
@author = build_author(author)
@entity = entity
@details = details
@ip_address = resolve_ip_address(@author)
@save_type = save_type
+ @created_at = created_at
end
# Builds the @details attribute for authentication
@@ -79,7 +81,8 @@ class AuditEventService
author_id: @author.id,
author_name: @author.name,
entity_id: @entity.id,
- entity_type: @entity.class.name
+ entity_type: @entity.class.name,
+ created_at: @created_at
}
end
diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb
index bb6a52eb2f4..6d6d8641d9d 100644
--- a/app/services/auth/container_registry_authentication_service.rb
+++ b/app/services/auth/container_registry_authentication_service.rb
@@ -50,6 +50,12 @@ module Auth
access_token(['pull'], names)
end
+ def self.pull_nested_repositories_access_token(name)
+ name = name.chomp('/') if name.end_with?('/')
+ paths = [name, "#{name}/*"]
+ access_token(['pull'], paths)
+ end
+
def self.access_token(actions, names, type = 'repository')
names = names.flatten
registry = Gitlab.config.registry
diff --git a/app/services/base_container_service.rb b/app/services/base_container_service.rb
index 190d159e7f1..86df0236a7f 100644
--- a/app/services/base_container_service.rb
+++ b/app/services/base_container_service.rb
@@ -26,4 +26,8 @@ class BaseContainerService
def group_container?
container.is_a?(::Group)
end
+
+ def namespace_container?
+ container.is_a?(::Namespace)
+ end
end
diff --git a/app/services/bulk_imports/relation_export_service.rb b/app/services/bulk_imports/relation_export_service.rb
index 14f073120c5..c43f0d8cb4f 100644
--- a/app/services/bulk_imports/relation_export_service.rb
+++ b/app/services/bulk_imports/relation_export_service.rb
@@ -4,6 +4,8 @@ module BulkImports
class RelationExportService
include Gitlab::ImportExport::CommandLineUtil
+ EXISTING_EXPORT_TTL = 3.minutes
+
def initialize(user, portable, relation, jid)
@user = user
@portable = portable
@@ -31,6 +33,9 @@ module BulkImports
validate_user_permissions!
export = portable.bulk_import_exports.safe_find_or_create_by!(relation: relation)
+
+ return export if export.finished? && export.updated_at > EXISTING_EXPORT_TTL.ago
+
export.update!(status_event: 'start', jid: jid)
yield export
diff --git a/app/services/ci/after_requeue_job_service.rb b/app/services/ci/after_requeue_job_service.rb
index bc70dd3bea4..1ae4639751b 100644
--- a/app/services/ci/after_requeue_job_service.rb
+++ b/app/services/ci/after_requeue_job_service.rb
@@ -22,15 +22,9 @@ module Ci
end
def dependent_jobs
- dependent_jobs = stage_dependent_jobs
- .or(needs_dependent_jobs)
- .ordered_by_stage
-
- if ::Feature.enabled?(:ci_fix_order_of_subsequent_jobs, @processable.pipeline.project, default_enabled: :yaml)
- dependent_jobs = ordered_by_dag(dependent_jobs)
- end
-
- dependent_jobs
+ ordered_by_dag(
+ stage_dependent_jobs.or(needs_dependent_jobs).ordered_by_stage
+ )
end
def process(job)
diff --git a/app/services/ci/create_downstream_pipeline_service.rb b/app/services/ci/create_downstream_pipeline_service.rb
index 034bab93108..0a0c614bb87 100644
--- a/app/services/ci/create_downstream_pipeline_service.rb
+++ b/app/services/ci/create_downstream_pipeline_service.rb
@@ -9,7 +9,7 @@ module Ci
DuplicateDownstreamPipelineError = Class.new(StandardError)
- MAX_DESCENDANTS_DEPTH = 2
+ MAX_NESTED_CHILDREN = 2
def execute(bridge)
@bridge = bridge
@@ -77,7 +77,8 @@ module Ci
# TODO: Remove this condition if favour of model validation
# https://gitlab.com/gitlab-org/gitlab/issues/38338
- if has_max_descendants_depth?
+ # only applies to parent-child pipelines not multi-project
+ if has_max_nested_children?
@bridge.drop!(:reached_max_descendant_pipelines_depth)
return false
end
@@ -129,11 +130,12 @@ module Ci
pipeline_checksums.tally.any? { |_checksum, occurrences| occurrences > 2 }
end
- def has_max_descendants_depth?
+ def has_max_nested_children?
return false unless @bridge.triggers_child_pipeline?
+ # only applies to parent-child pipelines not multi-project
ancestors_of_new_child = @bridge.pipeline.self_and_ancestors
- ancestors_of_new_child.count > MAX_DESCENDANTS_DEPTH
+ ancestors_of_new_child.count > MAX_NESTED_CHILDREN
end
def config_checksum(pipeline)
diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb
index d53e136effb..02f25a82307 100644
--- a/app/services/ci/create_pipeline_service.rb
+++ b/app/services/ci/create_pipeline_service.rb
@@ -14,6 +14,7 @@ module Ci
Gitlab::Ci::Pipeline::Chain::Build::Associations,
Gitlab::Ci::Pipeline::Chain::Validate::Abilities,
Gitlab::Ci::Pipeline::Chain::Validate::Repository,
+ Gitlab::Ci::Pipeline::Chain::Limit::RateLimit,
Gitlab::Ci::Pipeline::Chain::Validate::SecurityOrchestrationPolicy,
Gitlab::Ci::Pipeline::Chain::Skip,
Gitlab::Ci::Pipeline::Chain::Config::Content,
diff --git a/app/services/ci/job_artifacts/destroy_all_expired_service.rb b/app/services/ci/job_artifacts/destroy_all_expired_service.rb
index c089567ec14..4070875ffe1 100644
--- a/app/services/ci/job_artifacts/destroy_all_expired_service.rb
+++ b/app/services/ci/job_artifacts/destroy_all_expired_service.rb
@@ -7,16 +7,14 @@ module Ci
include ::Gitlab::LoopHelpers
BATCH_SIZE = 100
+ LOOP_LIMIT = 500
LOOP_TIMEOUT = 5.minutes
- SMALL_LOOP_LIMIT = 100
- LARGE_LOOP_LIMIT = 500
- EXCLUSIVE_LOCK_KEY = 'expired_job_artifacts:destroy:lock'
LOCK_TIMEOUT = 6.minutes
+ EXCLUSIVE_LOCK_KEY = 'expired_job_artifacts:destroy:lock'
def initialize
@removed_artifacts_count = 0
@start_at = Time.current
- @loop_limit = ::Feature.enabled?(:ci_artifact_fast_removal_large_loop_limit, default_enabled: :yaml) ? LARGE_LOOP_LIMIT : SMALL_LOOP_LIMIT
end
##
@@ -26,8 +24,6 @@ module Ci
# preventing multiple `ExpireBuildArtifactsWorker` CRON jobs run concurrently,
# which is scheduled every 7 minutes.
def execute
- return 0 unless ::Feature.enabled?(:ci_destroy_all_expired_service, default_enabled: :yaml)
-
in_lock(EXCLUSIVE_LOCK_KEY, ttl: LOCK_TIMEOUT, retries: 1) do
if ::Feature.enabled?(:ci_destroy_unlocked_job_artifacts)
destroy_unlocked_job_artifacts
@@ -42,7 +38,7 @@ module Ci
private
def destroy_unlocked_job_artifacts
- loop_until(timeout: LOOP_TIMEOUT, limit: @loop_limit) do
+ loop_until(timeout: LOOP_TIMEOUT, limit: LOOP_LIMIT) do
artifacts = Ci::JobArtifact.expired_before(@start_at).artifact_unlocked.limit(BATCH_SIZE)
service_response = destroy_batch(artifacts)
@removed_artifacts_count += service_response[:destroyed_artifacts_count]
@@ -59,7 +55,7 @@ module Ci
@removed_artifacts_count += service_response[:destroyed_artifacts_count]
break if loop_timeout?
- break if index >= @loop_limit
+ break if index >= LOOP_LIMIT
end
end
diff --git a/app/services/ci/job_artifacts/destroy_batch_service.rb b/app/services/ci/job_artifacts/destroy_batch_service.rb
index d5a0a2dd885..90d157373c3 100644
--- a/app/services/ci/job_artifacts/destroy_batch_service.rb
+++ b/app/services/ci/job_artifacts/destroy_batch_service.rb
@@ -117,7 +117,7 @@ module Ci
wrongly_expired_artifacts, @job_artifacts = @job_artifacts.partition { |artifact| wrongly_expired?(artifact) }
- remove_expire_at(wrongly_expired_artifacts)
+ remove_expire_at(wrongly_expired_artifacts) if wrongly_expired_artifacts.any?
end
def fix_expire_at?
@@ -127,7 +127,9 @@ module Ci
def wrongly_expired?(artifact)
return false unless artifact.expire_at.present?
- match_date?(artifact.expire_at) && match_time?(artifact.expire_at)
+ # Although traces should never have expiration dates that don't match time & date here.
+ # we can explicitly exclude them by type since they should never be destroyed.
+ artifact.trace? || (match_date?(artifact.expire_at) && match_time?(artifact.expire_at))
end
def match_date?(expire_at)
diff --git a/app/services/ci/job_artifacts/update_unknown_locked_status_service.rb b/app/services/ci/job_artifacts/update_unknown_locked_status_service.rb
new file mode 100644
index 00000000000..0d35a90ed04
--- /dev/null
+++ b/app/services/ci/job_artifacts/update_unknown_locked_status_service.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+module Ci
+ module JobArtifacts
+ class UpdateUnknownLockedStatusService
+ include ::Gitlab::ExclusiveLeaseHelpers
+ include ::Gitlab::LoopHelpers
+
+ BATCH_SIZE = 100
+ LOOP_TIMEOUT = 5.minutes
+ LOOP_LIMIT = 100
+ LARGE_LOOP_LIMIT = 500
+ EXCLUSIVE_LOCK_KEY = 'unknown_status_job_artifacts:update:lock'
+ LOCK_TIMEOUT = 6.minutes
+
+ def initialize
+ @removed_count = 0
+ @locked_count = 0
+ @start_at = Time.current
+ @loop_limit = Feature.enabled?(:ci_job_artifacts_backlog_large_loop_limit) ? LARGE_LOOP_LIMIT : LOOP_LIMIT
+ end
+
+ def execute
+ in_lock(EXCLUSIVE_LOCK_KEY, ttl: LOCK_TIMEOUT, retries: 1) do
+ update_locked_status_on_unknown_artifacts
+ end
+
+ { removed: @removed_count, locked: @locked_count }
+ end
+
+ private
+
+ def update_locked_status_on_unknown_artifacts
+ loop_until(timeout: LOOP_TIMEOUT, limit: @loop_limit) do
+ unknown_status_build_ids = safely_ordered_ci_job_artifacts_locked_unknown_relation.pluck_job_id.uniq
+
+ locked_pipe_build_ids = ::Ci::Build
+ .with_pipeline_locked_artifacts
+ .id_in(unknown_status_build_ids)
+ .pluck_primary_key
+
+ @locked_count += update_unknown_artifacts(locked_pipe_build_ids, Ci::JobArtifact.lockeds[:artifacts_locked])
+
+ unlocked_pipe_build_ids = unknown_status_build_ids - locked_pipe_build_ids
+ service_response = batch_destroy_artifacts(unlocked_pipe_build_ids)
+ @removed_count += service_response[:destroyed_artifacts_count]
+ end
+ end
+
+ def update_unknown_artifacts(build_ids, locked_value)
+ return 0 unless build_ids.any?
+
+ expired_locked_unknown_artifacts.for_job_ids(build_ids).update_all(locked: locked_value)
+ end
+
+ def batch_destroy_artifacts(build_ids)
+ deleteable_artifacts_relation =
+ if build_ids.any?
+ expired_locked_unknown_artifacts.for_job_ids(build_ids)
+ else
+ Ci::JobArtifact.none
+ end
+
+ Ci::JobArtifacts::DestroyBatchService.new(deleteable_artifacts_relation).execute
+ end
+
+ def expired_locked_unknown_artifacts
+ # UPDATE queries perform better without the specific order and limit
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76509#note_891260455
+ Ci::JobArtifact.expired_before(@start_at).artifact_unknown
+ end
+
+ def safely_ordered_ci_job_artifacts_locked_unknown_relation
+ # Adding the ORDER and LIMIT improves performance when we don't have build_id
+ expired_locked_unknown_artifacts.limit(BATCH_SIZE).order_expired_asc
+ end
+ end
+ end
+end
diff --git a/app/services/ci/play_build_service.rb b/app/services/ci/play_build_service.rb
index 2d6b6aeee14..fbf2aad1991 100644
--- a/app/services/ci/play_build_service.rb
+++ b/app/services/ci/play_build_service.rb
@@ -14,10 +14,7 @@ module Ci
AfterRequeueJobService.new(project, current_user).execute(build)
end
else
- # Retrying in Ci::PlayBuildService is a legacy process that should be removed.
- # Instead, callers should explicitly execute Ci::RetryBuildService.
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/347493.
- build.retryable? ? Ci::Build.retry(build, current_user) : build
+ Ci::RetryJobService.new(project, current_user).execute(build)[:job]
end
end
diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb
index c8b475f6c48..6c9044b5089 100644
--- a/app/services/ci/register_job_service.rb
+++ b/app/services/ci/register_job_service.rb
@@ -283,7 +283,8 @@ module Ci
runner_unsupported: -> (build, params) { !build.supported_runner?(params.dig(:info, :features)) },
archived_failure: -> (build, _) { build.archived? },
project_deleted: -> (build, _) { build.project.pending_delete? },
- builds_disabled: -> (build, _) { !build.project.builds_enabled? }
+ builds_disabled: -> (build, _) { !build.project.builds_enabled? },
+ user_blocked: -> (build, _) { build.user&.blocked? }
}
end
end
diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb
deleted file mode 100644
index 906e5cec4f3..00000000000
--- a/app/services/ci/retry_build_service.rb
+++ /dev/null
@@ -1,94 +0,0 @@
-# frozen_string_literal: true
-
-module Ci
- class RetryBuildService < ::BaseService
- include Gitlab::Utils::StrongMemoize
-
- def self.clone_accessors
- %i[pipeline project ref tag options name
- allow_failure stage stage_id stage_idx trigger_request
- yaml_variables when environment coverage_regex
- description tag_list protected needs_attributes
- job_variables_attributes resource_group scheduling_type].freeze
- end
-
- def self.extra_accessors
- []
- end
-
- def execute(build)
- build.ensure_scheduling_type!
-
- clone!(build).tap do |new_build|
- check_assignable_runners!(new_build)
- next if new_build.failed?
-
- Gitlab::OptimisticLocking.retry_lock(new_build, name: 'retry_build', &:enqueue)
- AfterRequeueJobService.new(project, current_user).execute(build)
- end
- end
-
- # rubocop: disable CodeReuse/ActiveRecord
- 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)
-
- new_build.run_after_commit do
- ::Ci::CopyCrossDatabaseAssociationsService.new.execute(build, new_build)
-
- ::Deployments::CreateForBuildService.new.execute(new_build)
-
- ::MergeRequests::AddTodoWhenBuildFailsService
- .new(project: project)
- .close(new_build)
- end
-
- ::Ci::Pipelines::AddJobService.new(build.pipeline).execute!(new_build) do |job|
- BulkInsertableAssociations.with_bulk_insert do
- job.save!
- end
- end
-
- build.reset # refresh the data to get new values of `retried` and `processed`.
-
- new_build
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- private
-
- def check_access!(build)
- unless can?(current_user, :update_build, build)
- raise Gitlab::Access::AccessDeniedError, '403 Forbidden'
- end
- end
-
- def check_assignable_runners!(build); end
-
- def clone_build(build)
- project.builds.new(build_attributes(build))
- end
-
- def build_attributes(build)
- attributes = self.class.clone_accessors.to_h do |attribute|
- [attribute, build.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend
- end
-
- if build.persisted_environment.present?
- attributes[:metadata_attributes] ||= {}
- attributes[:metadata_attributes][:expanded_environment_name] = build.expanded_environment_name
- end
-
- attributes[:user] = current_user
- attributes
- end
- end
-end
-
-Ci::RetryBuildService.prepend_mod_with('Ci::RetryBuildService')
diff --git a/app/services/ci/retry_job_service.rb b/app/services/ci/retry_job_service.rb
new file mode 100644
index 00000000000..af7e7fa16e9
--- /dev/null
+++ b/app/services/ci/retry_job_service.rb
@@ -0,0 +1,94 @@
+# frozen_string_literal: true
+
+module Ci
+ class RetryJobService < ::BaseService
+ include Gitlab::Utils::StrongMemoize
+
+ def execute(job)
+ if job.retryable?
+ job.ensure_scheduling_type!
+ new_job = retry_job(job)
+
+ ServiceResponse.success(payload: { job: new_job })
+ else
+ ServiceResponse.error(
+ message: 'Job cannot be retried',
+ payload: { job: job, reason: :not_retryable }
+ )
+ end
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def clone!(job)
+ # Cloning a job requires a strict type check to ensure
+ # the attributes being used for the clone are taken straight
+ # from the model and not overridden by other abstractions.
+ raise TypeError unless job.instance_of?(Ci::Build)
+
+ check_access!(job)
+
+ new_job = clone_job(job)
+
+ new_job.run_after_commit do
+ ::Ci::CopyCrossDatabaseAssociationsService.new.execute(job, new_job)
+
+ ::Deployments::CreateForBuildService.new.execute(new_job)
+
+ ::MergeRequests::AddTodoWhenBuildFailsService
+ .new(project: project)
+ .close(new_job)
+ end
+
+ ::Ci::Pipelines::AddJobService.new(job.pipeline).execute!(new_job) do |processable|
+ BulkInsertableAssociations.with_bulk_insert do
+ processable.save!
+ end
+ end
+
+ job.reset # refresh the data to get new values of `retried` and `processed`.
+
+ new_job
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ private
+
+ def retry_job(job)
+ clone!(job).tap do |new_job|
+ check_assignable_runners!(new_job)
+ next if new_job.failed?
+
+ Gitlab::OptimisticLocking.retry_lock(new_job, name: 'retry_build', &:enqueue)
+ AfterRequeueJobService.new(project, current_user).execute(job)
+ end
+ end
+
+ def check_access!(job)
+ unless can?(current_user, :update_build, job)
+ raise Gitlab::Access::AccessDeniedError, '403 Forbidden'
+ end
+ end
+
+ def check_assignable_runners!(job); end
+
+ def clone_job(job)
+ project.builds.new(job_attributes(job))
+ end
+
+ def job_attributes(job)
+ attributes = job.class.clone_accessors.to_h do |attribute|
+ [attribute, job.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend
+ end
+
+ if job.persisted_environment.present?
+ attributes[:metadata_attributes] ||= {}
+ attributes[:metadata_attributes][:expanded_environment_name] = job.expanded_environment_name
+ end
+
+ attributes[:user] = current_user
+ attributes
+ end
+ end
+end
+
+Ci::RetryJobService.prepend_mod_with('Ci::RetryJobService')
diff --git a/app/services/ci/retry_pipeline_service.rb b/app/services/ci/retry_pipeline_service.rb
index d40643e1513..85f910d05d7 100644
--- a/app/services/ci/retry_pipeline_service.rb
+++ b/app/services/ci/retry_pipeline_service.rb
@@ -13,7 +13,7 @@ module Ci
builds_relation(pipeline).find_each do |build|
next unless can_be_retried?(build)
- Ci::RetryBuildService.new(project, current_user).clone!(build)
+ Ci::RetryJobService.new(project, current_user).clone!(build)
end
pipeline.processables.latest.skipped.find_each do |skipped|
diff --git a/app/services/concerns/deploy_token_methods.rb b/app/services/concerns/deploy_token_methods.rb
index f59a50d6878..578be53f82c 100644
--- a/app/services/concerns/deploy_token_methods.rb
+++ b/app/services/concerns/deploy_token_methods.rb
@@ -1,16 +1,17 @@
# frozen_string_literal: true
module DeployTokenMethods
- def create_deploy_token_for(entity, params)
+ def create_deploy_token_for(entity, current_user, params)
params[:deploy_token_type] = DeployToken.deploy_token_types["#{entity.class.name.downcase}_type".to_sym]
entity.deploy_tokens.create(params) do |deploy_token|
deploy_token.username = params[:username].presence
+ deploy_token.creator_id = current_user.id
end
end
def destroy_deploy_token(entity, params)
- deploy_token = entity.deploy_tokens.find_by_id!(params[:token_id])
+ deploy_token = entity.deploy_tokens.find(params[:token_id])
deploy_token.destroy
end
diff --git a/app/services/concerns/incident_management/usage_data.rb b/app/services/concerns/incident_management/usage_data.rb
index b91aa59099d..27e60029ea3 100644
--- a/app/services/concerns/incident_management/usage_data.rb
+++ b/app/services/concerns/incident_management/usage_data.rb
@@ -9,10 +9,5 @@ module IncidentManagement
track_usage_event(:"incident_management_#{action}", current_user.id)
end
-
- # No-op as optionally overridden in implementing classes.
- # For use to provide checks before calling #track_incident_action.
- def track_event
- end
end
end
diff --git a/app/services/concerns/members/bulk_create_users.rb b/app/services/concerns/members/bulk_create_users.rb
index 3f8971dde74..e60c84af89e 100644
--- a/app/services/concerns/members/bulk_create_users.rb
+++ b/app/services/concerns/members/bulk_create_users.rb
@@ -51,12 +51,20 @@ module Members
users.concat(User.id_in(user_ids)) if user_ids.present?
users.uniq! # de-duplicate just in case as there is no controlling if user records and ids are sent multiple times
+ users_by_emails = source.users_by_emails(emails) # preloads our request store for all emails
+ # in case emails belong to a user that is being invited by user or user_id, remove them from
+ # emails and let users/user_ids handle it.
+ parsed_emails = emails.select do |email|
+ user = users_by_emails[email]
+ !user || (users.exclude?(user) && user_ids.exclude?(user.id))
+ end
+
if users.present?
# helps not have to perform another query per user id to see if the member exists later on when fetching
- existing_members = source.members_and_requesters.where(user_id: users).index_by(&:user_id) # rubocop:disable CodeReuse/ActiveRecord
+ existing_members = source.members_and_requesters.with_user(users).index_by(&:user_id)
end
- [emails, users, existing_members]
+ [parsed_emails, users, existing_members]
end
end
end
diff --git a/app/services/database/consistency_check_service.rb b/app/services/database/consistency_check_service.rb
new file mode 100644
index 00000000000..e39bc8f25b8
--- /dev/null
+++ b/app/services/database/consistency_check_service.rb
@@ -0,0 +1,109 @@
+# frozen_string_literal: true
+
+module Database
+ class ConsistencyCheckService
+ CURSOR_REDIS_KEY_TTL = 7.days
+ EMPTY_RESULT = { matches: 0, mismatches: 0, batches: 0, mismatches_details: [] }.freeze
+
+ def initialize(source_model:, target_model:, source_columns:, target_columns:)
+ @source_model = source_model
+ @target_model = target_model
+ @source_columns = source_columns
+ @target_columns = target_columns
+ @source_sort_column = source_columns.first
+ @target_sort_column = target_columns.first
+ end
+
+ # This class takes two ActiveRecord models, and compares the selected columns
+ # of the two models tables, for the purposes of checking the consistency of
+ # mirroring of tables. For example Namespace and Ci::NamepaceMirror
+ #
+ # It compares up to 25 batches (1000 records / batch), or up to 30 seconds
+ # for all the batches in total.
+ #
+ # It saves the cursor of the next start_id (cusror) in Redis. If the start_id
+ # wasn't saved in Redis, for example, in the first run, it will choose some random start_id
+ #
+ # Example:
+ # service = Database::ConsistencyCheckService.new(
+ # source_model: Namespace,
+ # target_model: Ci::NamespaceMirror,
+ # source_columns: %w[id traversal_ids],
+ # target_columns: %w[namespace_id traversal_ids],
+ # )
+ # result = service.execute
+ #
+ # result is a hash that has the following fields:
+ # - batches: Number of batches checked
+ # - matches: The number of matched records
+ # - mismatches: The number of mismatched records
+ # - mismatches_details: It's an array that contains details about the mismatched records.
+ # each record in this array is a hash of format {id: ID, source_table: [...], target_table: [...]}
+ # Each record represents the attributes of the records in the two tables.
+ # - start_id: The start id cursor of the current batch. <nil> means no records.
+ # - next_start_id: The ID that can be used for the next batch iteration check. <nil> means no records
+ def execute
+ start_id = next_start_id
+
+ return EMPTY_RESULT if start_id.nil?
+
+ result = consistency_checker.execute(start_id: start_id)
+ result[:start_id] = start_id
+
+ save_next_start_id(result[:next_start_id])
+
+ result
+ end
+
+ private
+
+ attr_reader :source_model, :target_model, :source_columns, :target_columns, :source_sort_column, :target_sort_column
+
+ def consistency_checker
+ @consistency_checker ||= Gitlab::Database::ConsistencyChecker.new(
+ source_model: source_model,
+ target_model: target_model,
+ source_columns: source_columns,
+ target_columns: target_columns
+ )
+ end
+
+ def next_start_id
+ return if min_id.nil?
+
+ fetch_next_start_id || random_start_id
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def min_id
+ @min_id ||= source_model.minimum(source_sort_column)
+ end
+
+ def max_id
+ @max_id ||= source_model.minimum(source_sort_column)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def fetch_next_start_id
+ Gitlab::Redis::SharedState.with { |redis| redis.get(cursor_redis_shared_state_key)&.to_i }
+ end
+
+ # This returns some random start_id, so that we don't always start checking
+ # from the start of the table, in case we lose the cursor in Redis.
+ def random_start_id
+ range_start = min_id
+ range_end = [min_id, max_id - Gitlab::Database::ConsistencyChecker::BATCH_SIZE].max
+ rand(range_start..range_end)
+ end
+
+ def save_next_start_id(start_id)
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.set(cursor_redis_shared_state_key, start_id, ex: CURSOR_REDIS_KEY_TTL)
+ end
+ end
+
+ def cursor_redis_shared_state_key
+ "consistency_check_cursor:#{source_model.table_name}:#{target_model.table_name}"
+ end
+ end
+end
diff --git a/app/services/deployments/update_environment_service.rb b/app/services/deployments/update_environment_service.rb
index 19b950044d0..b0ba8ecaa47 100644
--- a/app/services/deployments/update_environment_service.rb
+++ b/app/services/deployments/update_environment_service.rb
@@ -56,7 +56,13 @@ module Deployments
end
def expanded_environment_url
- ExpandVariables.expand(environment_url, -> { variables }) if environment_url
+ return unless environment_url
+
+ if ::Feature.enabled?(:ci_expand_environment_name_and_url, deployment.project, default_enabled: :yaml)
+ ExpandVariables.expand(environment_url, -> { variables.sort_and_expand_all })
+ else
+ ExpandVariables.expand(environment_url, -> { variables })
+ end
end
def environment_url
diff --git a/app/services/emails/base_service.rb b/app/services/emails/base_service.rb
index 58fc9799673..6f2b1018a6a 100644
--- a/app/services/emails/base_service.rb
+++ b/app/services/emails/base_service.rb
@@ -9,6 +9,10 @@ module Emails
@params = params.dup
@user = params.delete(:user)
end
+
+ def notification_service
+ NotificationService.new
+ end
end
end
diff --git a/app/services/emails/create_service.rb b/app/services/emails/create_service.rb
index 011978ba76a..d2d8b69559a 100644
--- a/app/services/emails/create_service.rb
+++ b/app/services/emails/create_service.rb
@@ -7,6 +7,7 @@ module Emails
user.emails.create(params.merge(extra_params)).tap do |email|
email&.confirm if skip_confirmation && current_user.admin?
+ notification_service.new_email_address_added(user, email.email) if email.persisted? && !email.user_primary_email?
end
end
end
diff --git a/app/services/environments/stop_service.rb b/app/services/environments/stop_service.rb
index d9c66bd13fe..24ae658d3d6 100644
--- a/app/services/environments/stop_service.rb
+++ b/app/services/environments/stop_service.rb
@@ -7,7 +7,7 @@ module Environments
def execute(environment)
return unless can?(current_user, :stop_environment, environment)
- environment.stop_with_action!(current_user)
+ environment.stop_with_actions!(current_user)
end
def execute_for_branch(branch_name)
@@ -19,7 +19,9 @@ module Environments
end
def execute_for_merge_request(merge_request)
- merge_request.environments.each { |environment| execute(environment) }
+ merge_request.environments_in_head_pipeline(deployment_status: :success).each do |environment|
+ execute(environment)
+ end
end
private
diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb
index 01a40fc6473..417680e37cf 100644
--- a/app/services/event_create_service.rb
+++ b/app/services/event_create_service.rb
@@ -184,6 +184,11 @@ class EventCreateService
track_event(event_action: :pushed, event_target: Project, author_id: current_user.id)
+ namespace = project.namespace
+ if Feature.enabled?(:route_hll_to_snowplow, namespace, default_enabled: :yaml)
+ Gitlab::Tracking.event(self.class.to_s, 'action_active_users_project_repo', namespace: namespace, user: current_user, project: project)
+ end
+
Users::LastPushEventService.new(current_user)
.cache_last_push_event(event)
diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb
index d42f718a272..1055f5ff088 100644
--- a/app/services/files/base_service.rb
+++ b/app/services/files/base_service.rb
@@ -19,6 +19,8 @@ module Files
@file_content = params[:file_content]
@file_content = Base64.decode64(@file_content) if params[:file_content_encoding] == 'base64'
+
+ @execute_filemode = params[:execute_filemode]
end
def file_has_changed?(path, commit_id)
diff --git a/app/services/files/create_service.rb b/app/services/files/create_service.rb
index f2cd51ef4d0..f9ced112896 100644
--- a/app/services/files/create_service.rb
+++ b/app/services/files/create_service.rb
@@ -22,7 +22,8 @@ module Files
author_email: @author_email,
author_name: @author_name,
start_project: @start_project,
- start_branch_name: @start_branch)
+ start_branch_name: @start_branch,
+ execute_filemode: @execute_filemode)
end
end
end
diff --git a/app/services/files/update_service.rb b/app/services/files/update_service.rb
index 54ab07da680..9fa966bb8a8 100644
--- a/app/services/files/update_service.rb
+++ b/app/services/files/update_service.rb
@@ -10,7 +10,8 @@ module Files
author_email: @author_email,
author_name: @author_name,
start_project: @start_project,
- start_branch_name: @start_branch)
+ start_branch_name: @start_branch,
+ execute_filemode: @execute_filemode)
end
private
diff --git a/app/services/git/branch_push_service.rb b/app/services/git/branch_push_service.rb
index 13223872e4f..3c27ad56ebb 100644
--- a/app/services/git/branch_push_service.rb
+++ b/app/services/git/branch_push_service.rb
@@ -24,6 +24,7 @@ module Git
enqueue_update_mrs
enqueue_detect_repository_languages
+ enqueue_record_project_target_platforms
execute_related_hooks
@@ -53,6 +54,12 @@ module Git
DetectRepositoryLanguagesWorker.perform_async(project.id)
end
+ def enqueue_record_project_target_platforms
+ return unless default_branch?
+
+ project.enqueue_record_project_target_platforms
+ end
+
# Only stop environments if the ref is a branch that is being deleted
def stop_environments
return unless removing_branch?
diff --git a/app/services/groups/create_service.rb b/app/services/groups/create_service.rb
index 67cbbaf84f6..639f7c68c40 100644
--- a/app/services/groups/create_service.rb
+++ b/app/services/groups/create_service.rb
@@ -57,11 +57,6 @@ module Groups
end
def after_create_hook
- if group.persisted? && group.root?
- delay = Namespaces::InviteTeamEmailService::DELIVERY_DELAY_IN_MINUTES
- Namespaces::InviteTeamEmailWorker.perform_in(delay, group.id, current_user.id)
- end
-
track_experiment_event
end
diff --git a/app/services/groups/deploy_tokens/create_service.rb b/app/services/groups/deploy_tokens/create_service.rb
index 4b0541e78a1..e6189df0472 100644
--- a/app/services/groups/deploy_tokens/create_service.rb
+++ b/app/services/groups/deploy_tokens/create_service.rb
@@ -6,7 +6,7 @@ module Groups
include DeployTokenMethods
def execute
- deploy_token = create_deploy_token_for(@group, params)
+ deploy_token = create_deploy_token_for(@group, current_user, params)
create_deploy_token_payload_for(deploy_token)
end
diff --git a/app/services/groups/transfer_service.rb b/app/services/groups/transfer_service.rb
index 10ff4961faf..f2e959396bc 100644
--- a/app/services/groups/transfer_service.rb
+++ b/app/services/groups/transfer_service.rb
@@ -25,10 +25,15 @@ module Groups
private
def proceed_to_transfer
+ old_root_ancestor_id = @group.root_ancestor.id
+ was_root_group = @group.root?
+
Group.transaction do
update_group_attributes
ensure_ownership
update_integrations
+ remove_issue_contacts(old_root_ancestor_id, was_root_group)
+ update_crm_objects(was_root_group)
end
post_update_hooks(@updated_project_ids)
@@ -53,6 +58,17 @@ module Groups
raise_transfer_error(:group_contains_images) if group_projects_contain_registry_images?
raise_transfer_error(:cannot_transfer_to_subgroup) if transfer_to_subgroup?
raise_transfer_error(:group_contains_npm_packages) if group_with_npm_packages?
+ raise_transfer_error(:no_permissions_to_migrate_crm) if no_permissions_to_migrate_crm?
+ end
+
+ def no_permissions_to_migrate_crm?
+ return false unless group && @new_parent_group
+ return false if group.root_ancestor == @new_parent_group.root_ancestor
+
+ return true if group.contacts.exists? && !current_user.can?(:admin_crm_contact, @new_parent_group.root_ancestor)
+ return true if group.organizations.exists? && !current_user.can?(:admin_crm_organization, @new_parent_group.root_ancestor)
+
+ false
end
def group_with_npm_packages?
@@ -202,7 +218,8 @@ module Groups
invalid_policies: s_("TransferGroup|You don't have enough permissions."),
group_contains_images: s_('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.'),
cannot_transfer_to_subgroup: s_('TransferGroup|Cannot transfer group to one of its subgroup.'),
- group_contains_npm_packages: s_('TransferGroup|Group contains projects with NPM packages.')
+ group_contains_npm_packages: s_('TransferGroup|Group contains projects with NPM packages.'),
+ no_permissions_to_migrate_crm: s_("TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group.")
}.freeze
end
@@ -238,6 +255,20 @@ module Groups
namespace_id: group.id
}
end
+
+ def update_crm_objects(was_root_group)
+ return unless was_root_group
+
+ CustomerRelations::Contact.move_to_root_group(group)
+ CustomerRelations::Organization.move_to_root_group(group)
+ end
+
+ def remove_issue_contacts(old_root_ancestor_id, was_root_group)
+ return if was_root_group
+ return if old_root_ancestor_id == @group.root_ancestor.id
+
+ CustomerRelations::IssueContact.delete_for_group(@group)
+ end
end
end
diff --git a/app/services/import/github_service.rb b/app/services/import/github_service.rb
index 061543b5885..a891dcc11e3 100644
--- a/app/services/import/github_service.rb
+++ b/app/services/import/github_service.rb
@@ -117,7 +117,7 @@ module Import
error: exception.response_body
)
- error(_('Import failed due to a GitHub error: %{original}') % { original: exception.response_body }, :unprocessable_entity)
+ error(_('Import failed due to a GitHub error: %{original} (HTTP %{code})') % { original: exception.response_body, code: exception.response_status }, :unprocessable_entity)
end
def log_and_return_error(message, translated_message, http_status)
diff --git a/app/services/incident_management/issuable_escalation_statuses/build_service.rb b/app/services/incident_management/issuable_escalation_statuses/build_service.rb
new file mode 100644
index 00000000000..9ebcf72a0c9
--- /dev/null
+++ b/app/services/incident_management/issuable_escalation_statuses/build_service.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+ module IssuableEscalationStatuses
+ class BuildService < ::BaseProjectService
+ def initialize(issue)
+ @issue = issue
+ @alert = issue.alert_management_alert
+
+ super(project: issue.project)
+ end
+
+ def execute
+ return issue.escalation_status if issue.escalation_status
+
+ issue.build_incident_management_issuable_escalation_status(alert_params)
+ end
+
+ private
+
+ attr_reader :issue, :alert
+
+ def alert_params
+ return {} unless alert
+
+ {
+ status_event: alert.status_event_for(alert.status_name)
+ }
+ end
+ end
+ end
+end
+
+IncidentManagement::IssuableEscalationStatuses::BuildService.prepend_mod
diff --git a/app/services/incident_management/issuable_escalation_statuses/create_service.rb b/app/services/incident_management/issuable_escalation_statuses/create_service.rb
index e28debf0fa3..9b22fb97e0d 100644
--- a/app/services/incident_management/issuable_escalation_statuses/create_service.rb
+++ b/app/services/incident_management/issuable_escalation_statuses/create_service.rb
@@ -2,14 +2,15 @@
module IncidentManagement
module IssuableEscalationStatuses
- class CreateService < BaseService
+ class CreateService < ::BaseProjectService
def initialize(issue)
@issue = issue
- @alert = issue.alert_management_alert
+
+ super(project: issue.project)
end
def execute
- escalation_status = ::IncidentManagement::IssuableEscalationStatus.new(issue: issue, **alert_params)
+ escalation_status = BuildService.new(issue).execute
if escalation_status.save
ServiceResponse.success(payload: { escalation_status: escalation_status })
@@ -20,17 +21,7 @@ module IncidentManagement
private
- attr_reader :issue, :alert
-
- def alert_params
- return {} unless alert
-
- {
- status_event: alert.status_event_for(alert.status_name)
- }
- end
+ attr_reader :issue
end
end
end
-
-IncidentManagement::IssuableEscalationStatuses::CreateService.prepend_mod
diff --git a/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb b/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb
index 8f591b375ee..1d0504a6e80 100644
--- a/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb
+++ b/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb
@@ -31,9 +31,7 @@ module IncidentManagement
attr_reader :issuable, :param_errors
def available?
- issuable.supports_escalation? &&
- user_has_permissions? &&
- escalation_status.present?
+ issuable.supports_escalation? && user_has_permissions?
end
def user_has_permissions?
@@ -42,7 +40,7 @@ module IncidentManagement
def escalation_status
strong_memoize(:escalation_status) do
- issuable.escalation_status
+ issuable.escalation_status || BuildService.new(issuable).execute
end
end
diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb
index a63c54df4a6..03115416607 100644
--- a/app/services/issuable_base_service.rb
+++ b/app/services/issuable_base_service.rb
@@ -525,6 +525,10 @@ class IssuableBaseService < ::BaseProjectService
attrs_changed || labels_changed || assignees_changed || reviewers_changed
end
+ def has_label_changes?(issuable, old_labels)
+ Set.new(issuable.labels) != Set.new(old_labels)
+ end
+
def invalidate_cache_counts(issuable, users: [])
users.each do |user|
user.public_send("invalidate_#{issuable.noteable_target_type_name}_cache_counts") # rubocop:disable GitlabSecurity/PublicSend
@@ -532,6 +536,16 @@ class IssuableBaseService < ::BaseProjectService
end
# override if needed
+ def handle_label_changes(issuable, old_labels)
+ return unless has_label_changes?(issuable, old_labels)
+
+ # reset to preserve the label sort order (title ASC)
+ issuable.labels.reset
+
+ GraphqlTriggers.issuable_labels_updated(issuable)
+ end
+
+ # override if needed
def handle_changes(issuable, options)
end
diff --git a/app/services/issuable_links/create_service.rb b/app/services/issuable_links/create_service.rb
index 802260c8fae..0887f04760c 100644
--- a/app/services/issuable_links/create_service.rb
+++ b/app/services/issuable_links/create_service.rb
@@ -2,8 +2,6 @@
module IssuableLinks
class CreateService < BaseService
- include IncidentManagement::UsageData
-
attr_reader :issuable, :current_user, :params
def initialize(issuable, user, params)
@@ -25,7 +23,7 @@ module IssuableLinks
end
@errors = []
- create_links
+ references = create_links
if @errors.present?
return error(@errors.join('. '), 422)
@@ -33,7 +31,7 @@ module IssuableLinks
track_event
- success
+ success(created_references: references)
end
# rubocop: disable CodeReuse/ActiveRecord
@@ -66,15 +64,19 @@ module IssuableLinks
end
def link_issuables(target_issuables)
- target_issuables.each do |referenced_object|
+ target_issuables.map do |referenced_object|
link = relate_issuables(referenced_object)
- unless link.valid?
+ if link.valid?
+ after_create_for(link)
+ else
@errors << _("%{ref} cannot be added: %{error}") % {
ref: referenced_object.to_reference,
error: link.errors.messages.values.flatten.to_sentence
}
end
+
+ link
end
end
@@ -142,6 +144,18 @@ module IssuableLinks
def set_link_type(_link)
# no-op
end
+
+ # Override on child classes to perform
+ # actions when the service is executed.
+ def track_event
+ # no-op
+ end
+
+ # Override on child classes to
+ # perform actions for each object created.
+ def after_create_for(_link)
+ # no-op
+ end
end
end
diff --git a/app/services/issuable_links/destroy_service.rb b/app/services/issuable_links/destroy_service.rb
index 19edd008b0a..204cf7ce966 100644
--- a/app/services/issuable_links/destroy_service.rb
+++ b/app/services/issuable_links/destroy_service.rb
@@ -2,8 +2,6 @@
module IssuableLinks
class DestroyService < BaseService
- include IncidentManagement::UsageData
-
attr_reader :link, :current_user, :source, :target
def initialize(link, user)
@@ -41,5 +39,9 @@ module IssuableLinks
def not_found_message
'No Issue Link found'
end
+
+ def track_event
+ # no op
+ end
end
end
diff --git a/app/services/issue_links/create_service.rb b/app/services/issue_links/create_service.rb
index 1c6621ce0a1..7f509f3b3e0 100644
--- a/app/services/issue_links/create_service.rb
+++ b/app/services/issue_links/create_service.rb
@@ -2,6 +2,8 @@
module IssueLinks
class CreateService < IssuableLinks::CreateService
+ include IncidentManagement::UsageData
+
def linkable_issuables(issues)
@linkable_issuables ||= begin
issues.select { |issue| can?(current_user, :admin_issue_link, issue) }
diff --git a/app/services/issue_links/destroy_service.rb b/app/services/issue_links/destroy_service.rb
index e2422ecaca9..9116e9fb703 100644
--- a/app/services/issue_links/destroy_service.rb
+++ b/app/services/issue_links/destroy_service.rb
@@ -2,6 +2,8 @@
module IssueLinks
class DestroyService < IssuableLinks::DestroyService
+ include IncidentManagement::UsageData
+
private
def permission_to_remove_relation?
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb
index 88c4ff1a8bb..d9210169005 100644
--- a/app/services/issues/update_service.rb
+++ b/app/services/issues/update_service.rb
@@ -63,6 +63,7 @@ module Issues
handle_assignee_changes(issue, old_assignees)
handle_confidential_change(issue)
+ handle_label_changes(issue, old_labels)
handle_added_labels(issue, old_labels)
handle_milestone_change(issue)
handle_added_mentions(issue, old_mentioned_users)
diff --git a/app/services/jira/requests/base.rb b/app/services/jira/requests/base.rb
index a16f8bbd367..3e15d47e8af 100644
--- a/app/services/jira/requests/base.rb
+++ b/app/services/jira/requests/base.rb
@@ -68,7 +68,7 @@ module Jira
end
def auth_docs_link_start
- auth_docs_link_url = Rails.application.routes.url_helpers.help_page_path('integration/jira', anchor: 'authentication-in-jira')
+ auth_docs_link_url = Rails.application.routes.url_helpers.help_page_path('integration/jira/index', anchor: 'authentication-in-jira')
'<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: auth_docs_link_url }
end
diff --git a/app/services/loose_foreign_keys/process_deleted_records_service.rb b/app/services/loose_foreign_keys/process_deleted_records_service.rb
index 2826bdb4c3c..54f54d99afb 100644
--- a/app/services/loose_foreign_keys/process_deleted_records_service.rb
+++ b/app/services/loose_foreign_keys/process_deleted_records_service.rb
@@ -52,7 +52,7 @@ module LooseForeignKeys
end
def tracked_tables
- @tracked_tables ||= Gitlab::Database::LooseForeignKeys.definitions_by_table.keys
+ @tracked_tables ||= Gitlab::Database::LooseForeignKeys.definitions_by_table.keys.shuffle
end
end
end
diff --git a/app/services/members/create_service.rb b/app/services/members/create_service.rb
index 758fa2e67f1..8f7b63c32c8 100644
--- a/app/services/members/create_service.rb
+++ b/app/services/members/create_service.rb
@@ -14,8 +14,9 @@ module Members
super
@errors = []
- @invites = invites_from_params&.split(',')&.uniq&.flatten
+ @invites = invites_from_params
@source = params[:source]
+ @tasks_to_be_done_members = []
end
def execute
@@ -25,6 +26,7 @@ module Members
validate_invitable!
add_members
+ create_tasks_to_be_done
enqueue_onboarding_progress_action
publish_event!
@@ -40,10 +42,13 @@ module Members
private
- attr_reader :source, :errors, :invites, :member_created_namespace_id, :members
+ attr_reader :source, :errors, :invites, :member_created_namespace_id, :members,
+ :tasks_to_be_done_members, :member_created_member_task_id
def invites_from_params
- params[:user_ids]
+ return params[:user_ids] if params[:user_ids].is_a?(Array)
+
+ params[:user_ids]&.to_s&.split(',')&.uniq&.flatten || []
end
def validate_invite_source!
@@ -74,33 +79,45 @@ module Members
)
members.each { |member| process_result(member) }
-
- create_tasks_to_be_done
end
def process_result(member)
- if member.invalid?
- add_error_for_member(member)
+ existing_errors = member.errors.full_messages
+
+ # calling invalid? clears any errors that were added outside of the
+ # rails validation process
+ if member.invalid? || existing_errors.present?
+ add_error_for_member(member, existing_errors)
else
after_execute(member: member)
@member_created_namespace_id ||= member.namespace_id
end
end
- def add_error_for_member(member)
+ # overridden
+ def add_error_for_member(member, existing_errors)
prefix = "#{member.user.username}: " if member.user.present?
- errors << "#{prefix}#{member.errors.full_messages.to_sentence}"
+ errors << "#{prefix}#{all_member_errors(member, existing_errors).to_sentence}"
+ end
+
+ def all_member_errors(member, existing_errors)
+ existing_errors.concat(member.errors.full_messages).uniq
end
def after_execute(member:)
super
+ build_tasks_to_be_done_members(member)
track_invite_source(member)
end
def track_invite_source(member)
- Gitlab::Tracking.event(self.class.name, 'create_member', label: invite_source, property: tracking_property(member), user: current_user)
+ Gitlab::Tracking.event(self.class.name,
+ 'create_member',
+ label: invite_source,
+ property: tracking_property(member),
+ user: current_user)
end
def invite_source
@@ -114,16 +131,28 @@ module Members
member.invite? ? 'net_new_user' : 'existing_user'
end
- def create_tasks_to_be_done
- return if params[:tasks_to_be_done].blank? || params[:tasks_project_id].blank?
-
- valid_members = members.select { |member| member.valid? && member.member_task.valid? }
- return unless valid_members.present?
+ def build_tasks_to_be_done_members(member)
+ return unless tasks_to_be_done?(member)
+ @tasks_to_be_done_members << member
# We can take the first `member_task` here, since all tasks will have the same attributes needed
# for the `TasksToBeDone::CreateWorker`, ie. `project` and `tasks_to_be_done`.
- member_task = valid_members[0].member_task
- TasksToBeDone::CreateWorker.perform_async(member_task.id, current_user.id, valid_members.map(&:user_id))
+ @member_created_member_task_id ||= member.member_task.id
+ end
+
+ def tasks_to_be_done?(member)
+ return false if params[:tasks_to_be_done].blank? || params[:tasks_project_id].blank?
+
+ # Only create task issues for existing users. Tasks for new users are created when they signup.
+ member.member_task&.valid? && member.user.present?
+ end
+
+ def create_tasks_to_be_done
+ return unless member_created_member_task_id # signal if there is any work to be done here
+
+ TasksToBeDone::CreateWorker.perform_async(member_created_member_task_id,
+ current_user.id,
+ tasks_to_be_done_members.map(&:user_id))
end
def user_limit
diff --git a/app/services/members/creator_service.rb b/app/services/members/creator_service.rb
index fcce32ead94..321658ac9c5 100644
--- a/app/services/members/creator_service.rb
+++ b/app/services/members/creator_service.rb
@@ -4,15 +4,13 @@ module Members
# This class serves as more of an app-wide way we add/create members
# All roads to add members should take this path.
class CreatorService
- include Gitlab::Experiment::Dsl
-
class << self
def parsed_access_level(access_level)
access_levels.fetch(access_level) { access_level.to_i }
end
def access_levels
- raise NotImplementedError
+ Gitlab::Access.sym_options_with_owner
end
end
@@ -25,7 +23,7 @@ module Members
def execute
find_or_build_member
- update_member
+ commit_member
create_member_task
member
@@ -33,23 +31,39 @@ module Members
private
+ delegate :new_record?, to: :member
attr_reader :source, :user, :access_level, :member, :args
- def update_member
- return unless can_update_member?
-
+ def assign_member_attributes
member.attributes = member_attributes
+ end
- if member.request?
- approve_request
+ def commit_member
+ if can_commit_member?
+ assign_member_attributes
+ commit_changes
else
- member.save
+ add_commit_error
end
end
- def can_update_member?
+ def can_commit_member?
# There is no current user for bulk actions, in which case anything is allowed
- !current_user # inheriting classes will add more logic
+ return true if skip_authorization?
+
+ if new_record?
+ can_create_new_member?
+ else
+ can_update_existing_member?
+ end
+ end
+
+ def can_create_new_member?
+ raise NotImplementedError
+ end
+
+ def can_update_existing_member?
+ raise NotImplementedError
end
# Populates the attributes of a member.
@@ -64,6 +78,14 @@ module Members
}
end
+ def commit_changes
+ if member.request?
+ approve_request
+ else
+ member.save
+ end
+ end
+
def create_member_task
return unless member.persisted?
return if member_task_attributes.value?(nil)
@@ -93,6 +115,20 @@ module Members
args[:current_user]
end
+ def skip_authorization?
+ !current_user
+ end
+
+ def add_commit_error
+ msg = if new_record?
+ _('not authorized to create member')
+ else
+ _('not authorized to update member')
+ end
+
+ member.errors.add(:base, msg)
+ end
+
def find_or_build_member
@user = parse_user_param
@@ -101,6 +137,8 @@ module Members
else
source.members.build(invite_email: user)
end
+
+ @member.blocking_refresh = args[:blocking_refresh]
end
# This method is used to find users that have been entered into the "Add members" field.
@@ -114,7 +152,7 @@ module Members
User.find_by(id: user) # rubocop:todo CodeReuse/ActiveRecord
else
# must be an email or at least we'll consider it one
- User.find_by_any_email(user) || user
+ source.users_by_emails([user])[user] || user
end
end
diff --git a/app/services/members/groups/creator_service.rb b/app/services/members/groups/creator_service.rb
index df4d3f59d3b..a6f0daa99aa 100644
--- a/app/services/members/groups/creator_service.rb
+++ b/app/services/members/groups/creator_service.rb
@@ -3,14 +3,14 @@
module Members
module Groups
class CreatorService < Members::CreatorService
- def self.access_levels
- Gitlab::Access.sym_options_with_owner
- end
-
private
- def can_update_member?
- super || current_user.can?(:update_group_member, member)
+ def can_create_new_member?
+ current_user.can?(:admin_group_member, member.group)
+ end
+
+ def can_update_existing_member?
+ current_user.can?(:update_group_member, member)
end
end
end
diff --git a/app/services/members/invite_service.rb b/app/services/members/invite_service.rb
index 85acb720f0f..1bf209ab79d 100644
--- a/app/services/members/invite_service.rb
+++ b/app/services/members/invite_service.rb
@@ -7,6 +7,8 @@ module Members
def initialize(*args)
super
+ @invites += parsed_emails
+
@errors = {}
end
@@ -14,38 +16,63 @@ module Members
alias_method :formatted_errors, :errors
- def invites_from_params
- params[:email]
+ def parsed_emails
+ # can't put this in the initializer since `invites_from_params` is called in super class
+ # and needs it
+ @parsed_emails ||= (formatted_param(params[:email]) || [])
+ end
+
+ def formatted_param(parameter)
+ parameter&.split(',')&.uniq&.flatten
end
def validate_invitable!
super
+ return if params[:email].blank?
+
# we need the below due to add_users hitting Members::CreatorService.parse_users_list and ignoring invalid emails
# ideally we wouldn't need this, but we can't really change the add_users method
- valid, invalid = invites.partition { |email| Member.valid_email?(email) }
- @invites = valid
+ invalid_emails.each { |email| errors[email] = s_('AddMember|Invite email is invalid') }
+ end
+
+ def invalid_emails
+ parsed_emails.each_with_object([]) do |email, invalid|
+ next if Member.valid_email?(email)
- invalid.each { |email| errors[email] = s_('AddMember|Invite email is invalid') }
+ invalid << email
+ @invites.delete(email)
+ end
end
override :blank_invites_message
def blank_invites_message
- s_('AddMember|Emails cannot be blank')
+ s_('AddMember|Invites cannot be blank')
end
override :add_error_for_member
- def add_error_for_member(member)
- errors[invite_email(member)] = member.errors.full_messages.to_sentence
+ def add_error_for_member(member, existing_errors)
+ errors[invited_object(member)] = all_member_errors(member, existing_errors).to_sentence
end
- override :create_tasks_to_be_done
- def create_tasks_to_be_done
- # Only create task issues for existing users. Tasks for new users are created when they signup.
- end
+ def invited_object(member)
+ return member.invite_email if member.invite_email
- def invite_email(member)
- member.invite_email || member.user.email
+ # There is a case where someone was invited by email, but the `user` record exists.
+ # The member record returned will not have an invite_email attribute defined since
+ # the CreatorService finds `user` record sometimes by email.
+ # At that point we lose the info of whether this invite was done by `user` or by email.
+ # Here we will give preference to check invites by user_id first.
+ # There is also a case where a user could be invited by their email and
+ # at the same time via the API in the same request.
+ # This would would mean the same user is invited as user_id and email.
+ # However, that isn't as likely from the UI at least since the token generator checks
+ # for that case and doesn't allow email being used if the user exists as a record already.
+ if member.user_id.to_s.in?(invites)
+ member.user.username
+ else
+ member.user.all_emails.detect { |email| email.in?(invites) }
+ end
end
end
end
diff --git a/app/services/members/projects/creator_service.rb b/app/services/members/projects/creator_service.rb
index 4dba81acf73..d92fe60c54a 100644
--- a/app/services/members/projects/creator_service.rb
+++ b/app/services/members/projects/creator_service.rb
@@ -3,19 +3,28 @@
module Members
module Projects
class CreatorService < Members::CreatorService
- def self.access_levels
- Gitlab::Access.sym_options_with_owner
- end
-
private
- def can_update_member?
- super || current_user.can?(:update_project_member, member) || adding_a_new_owner?
+ def can_create_new_member?
+ # order is important here!
+ # The `admin_project_member` check has side-effects that causes projects not be created if this area is hit
+ # during project creation.
+ # Call that triggers is current_user.can?(:admin_project_member, member.project)
+ # I tracked back to base_policy.rb admin check and specifically in
+ # Gitlab::Auth::CurrentUserMode.new(@user).admin_mode? call.
+ # This calls user.admin? and that specific call causes issues with project creation in
+ # spec/requests/api/projects_spec.rb specs and others, mostly around project creation.
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/358931 for investigation
+ adding_the_creator_as_owner_in_a_personal_project? || current_user.can?(:admin_project_member, member.project)
+ end
+
+ def can_update_existing_member?
+ current_user.can?(:update_project_member, member)
end
- def adding_a_new_owner?
+ def adding_the_creator_as_owner_in_a_personal_project?
# this condition is reached during testing setup a lot due to use of `.add_user`
- member.owner? && member.new_record?
+ member.project.personal_namespace_holder?(member.user)
end
end
end
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index 2ab623bacf8..d197c13378a 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -72,7 +72,7 @@ module MergeRequests
end
def cancel_review_app_jobs!(merge_request)
- environments = merge_request.environments.in_review_folder.available
+ environments = merge_request.environments_in_head_pipeline.in_review_folder.available
environments.each { |environment| environment.cancel_deployment_jobs! }
end
diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index c5395138902..391079223ca 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -34,6 +34,7 @@ module MergeRequests
handle_target_branch_change(merge_request)
handle_milestone_change(merge_request)
handle_draft_status_change(merge_request, changed_fields)
+ handle_label_changes(merge_request, old_labels)
track_title_and_desc_edits(changed_fields)
track_discussion_lock_toggle(merge_request, changed_fields)
diff --git a/app/services/namespaces/in_product_marketing_emails_service.rb b/app/services/namespaces/in_product_marketing_emails_service.rb
index 90900698e1a..e42c3498c21 100644
--- a/app/services/namespaces/in_product_marketing_emails_service.rb
+++ b/app/services/namespaces/in_product_marketing_emails_service.rb
@@ -45,6 +45,11 @@ module Namespaces
}
}.freeze
+ def self.email_count_for_track(track)
+ interval_days = TRACKS.dig(track.to_sym, :interval_days)
+ interval_days&.count || 0
+ end
+
def self.send_for_all_tracks_and_intervals
TRACKS.each_key do |track|
TRACKS[track][:interval_days].each do |interval|
diff --git a/app/services/namespaces/invite_team_email_service.rb b/app/services/namespaces/invite_team_email_service.rb
deleted file mode 100644
index 78edc205990..00000000000
--- a/app/services/namespaces/invite_team_email_service.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-# frozen_string_literal: true
-
-module Namespaces
- class InviteTeamEmailService
- include Gitlab::Experiment::Dsl
-
- TRACK = :invite_team
- DELIVERY_DELAY_IN_MINUTES = 20.minutes
-
- def self.send_email(user, group)
- new(user, group).execute
- end
-
- def initialize(user, group)
- @group = group
- @user = user
- @sent_email_records = InProductMarketingEmailRecords.new
- end
-
- def execute
- return unless user.email_opted_in?
- return unless group.root?
- return unless group.setup_for_company
-
- # Exclude group if users other than the creator have already been
- # added/invited
- return unless group.member_count == 1
-
- return if email_for_track_sent_to_user?
-
- experiment(:invite_team_email, group: group) do |e|
- e.publish_to_database
- e.candidate do
- send_email(user, group)
- sent_email_records.add(user, track, series)
- sent_email_records.save!
- end
- end
- end
-
- private
-
- attr_reader :user, :group, :sent_email_records
-
- def send_email(user, group)
- NotificationService.new.in_product_marketing(user.id, group.id, track, series)
- end
-
- def track
- TRACK
- end
-
- def series
- 0
- end
-
- def email_for_track_sent_to_user?
- Users::InProductMarketingEmail.for_user_with_track_and_series(user, track, series).present?
- end
- end
-end
diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index 9a0db3bb9aa..d32d1c8ca12 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -111,7 +111,7 @@ module Notes
def track_event(note, user)
track_note_creation_usage_for_issues(note) if note.for_issue?
track_note_creation_usage_for_merge_requests(note) if note.for_merge_request?
- track_usage_event(:incident_management_incident_comment, user.id) if note.for_issue? && note.noteable.incident?
+ track_incident_action(user, note.noteable, 'incident_comment') if note.for_issue?
if Feature.enabled?(:notes_create_service_tracking, project)
Gitlab::Tracking.event('Notes::CreateService', 'execute', **tracking_data_for(note))
diff --git a/app/services/notes/update_service.rb b/app/services/notes/update_service.rb
index 1cbb5916107..04fc4c7c944 100644
--- a/app/services/notes/update_service.rb
+++ b/app/services/notes/update_service.rb
@@ -27,10 +27,7 @@ module Notes
note.assign_attributes(last_edited_at: Time.current, updated_by: current_user)
end
- note.with_transaction_returning_status do
- update_confidentiality(note)
- note.save
- end
+ note.save
unless only_commands || note.for_personal_snippet?
note.create_new_cross_references!(current_user)
@@ -88,15 +85,6 @@ module Notes
TodoService.new.update_note(note, current_user, old_mentioned_users)
end
- # This method updates confidentiality of all discussion notes at once
- def update_confidentiality(note)
- return unless params.key?(:confidential)
- return unless note.is_a?(DiscussionNote) # we don't need to do bulk update for single notes
- return unless note.start_of_discussion? # don't update all notes if a response is being updated
-
- Note.id_in(note.discussion.notes.map(&:id)).update_all(confidential: params[:confidential])
- end
-
def track_note_edit_usage_for_issues(note)
Gitlab::UsageDataCounters::IssueActivityUniqueCounter.track_issue_comment_edited_action(author: note.author)
end
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index aa7e636b8a4..a3f250bb235 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -109,6 +109,13 @@ class NotificationService
mailer.unknown_sign_in_email(user, ip, time).deliver_later
end
+ # Notify a user when a new email address is added to the their account
+ def new_email_address_added(user, email)
+ return unless user.can?(:receive_notifications)
+
+ mailer.new_email_address_added_email(user, email).deliver_later
+ end
+
# When create an issue we should send an email to:
#
# * issue assignee if their notification level is not Disabled
@@ -201,13 +208,30 @@ class NotificationService
new_resource_email(merge_request, current_user, :new_merge_request_email)
end
+ NEW_COMMIT_EMAIL_DISPLAY_LIMIT = 20
def push_to_merge_request(merge_request, current_user, new_commits: [], existing_commits: [])
- new_commits = new_commits.map { |c| { short_id: c.short_id, title: c.title } }
- existing_commits = existing_commits.map { |c| { short_id: c.short_id, title: c.title } }
+ total_new_commits_count = new_commits.count
+ truncated_new_commits = new_commits.first(NEW_COMMIT_EMAIL_DISPLAY_LIMIT).map do |commit|
+ { short_id: commit.short_id, title: commit.title }
+ end
+
+ # We don't need the list of all existing commits. We need the first, the
+ # last, and the total number of existing commits only.
+ total_existing_commits_count = existing_commits.count
+ existing_commits = [existing_commits.first, existing_commits.last] if total_existing_commits_count > 2
+ existing_commits = existing_commits.map do |commit|
+ { short_id: commit.short_id, title: commit.title }
+ end
+
recipients = NotificationRecipients::BuildService.build_recipients(merge_request, current_user, action: "push_to")
recipients.each do |recipient|
- mailer.send(:push_to_merge_request_email, recipient.user.id, merge_request.id, current_user.id, recipient.reason, new_commits: new_commits, existing_commits: existing_commits).deliver_later
+ mailer.send(
+ :push_to_merge_request_email,
+ recipient.user.id, merge_request.id, current_user.id, recipient.reason,
+ new_commits: truncated_new_commits, total_new_commits_count: total_new_commits_count,
+ existing_commits: existing_commits, total_existing_commits_count: total_existing_commits_count
+ ).deliver_later
end
end
diff --git a/app/services/packages/rubygems/metadata_extraction_service.rb b/app/services/packages/rubygems/metadata_extraction_service.rb
index b3bac1854d7..872d68e1dbd 100644
--- a/app/services/packages/rubygems/metadata_extraction_service.rb
+++ b/app/services/packages/rubygems/metadata_extraction_service.rb
@@ -49,7 +49,11 @@ module Packages
# rubocop:enable Metrics/CyclomaticComplexity
def metadatum
- Packages::Rubygems::Metadatum.safe_find_or_create_by!(package: package)
+ # safe_find_or_create_by! was originally called here.
+ # We merely switched to `find_or_create_by!`
+ # rubocop: disable CodeReuse/ActiveRecord
+ Packages::Rubygems::Metadatum.find_or_create_by!(package: package)
+ # rubocop: enable CodeReuse/ActiveRecord
end
end
end
diff --git a/app/services/projects/apple_target_platform_detector_service.rb b/app/services/projects/apple_target_platform_detector_service.rb
new file mode 100644
index 00000000000..ec4c16a1416
--- /dev/null
+++ b/app/services/projects/apple_target_platform_detector_service.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+module Projects
+ # Service class to detect target platforms of a project made for the Apple
+ # Ecosystem.
+ #
+ # This service searches project.pbxproj and *.xcconfig files (contains build
+ # settings) for the string "SDKROOT = <SDK_name>" where SDK_name can be
+ # 'iphoneos', 'macosx', 'appletvos' or 'watchos'. Currently, the service is
+ # intentionally limited (for performance reasons) to detect if a project
+ # targets iOS.
+ #
+ # Ref: https://developer.apple.com/documentation/xcode/build-settings-reference/
+ #
+ # Example usage:
+ # > AppleTargetPlatformDetectorService.new(a_project).execute
+ # => []
+ # > AppleTargetPlatformDetectorService.new(an_ios_project).execute
+ # => [:ios]
+ # > AppleTargetPlatformDetectorService.new(multiplatform_project).execute
+ # => [:ios, :osx, :tvos, :watchos]
+ class AppleTargetPlatformDetectorService < BaseService
+ BUILD_CONFIG_FILENAMES = %w(project.pbxproj *.xcconfig).freeze
+
+ # For the current iteration, we only want to detect when the project targets
+ # iOS. In the future, we can use the same logic to detect projects that
+ # target OSX, TvOS, and WatchOS platforms with SDK names 'macosx', 'appletvos',
+ # and 'watchos', respectively.
+ PLATFORM_SDK_NAMES = { ios: 'iphoneos' }.freeze
+
+ def execute
+ detect_platforms
+ end
+
+ private
+
+ def file_finder
+ @file_finder ||= ::Gitlab::FileFinder.new(project, project.default_branch)
+ end
+
+ def detect_platforms
+ # Return array of SDK names for which "SDKROOT = <sdk_name>" setting
+ # definition can be found in either project.pbxproj or *.xcconfig files.
+ PLATFORM_SDK_NAMES.select do |_, sdk|
+ config_files_containing_sdk_setting(sdk).present?
+ end.keys
+ end
+
+ # Return array of project.pbxproj and/or *.xcconfig files
+ # (Gitlab::Search::FoundBlob) that contain the setting definition string
+ # "SDKROOT = <sdk_name>"
+ def config_files_containing_sdk_setting(sdk)
+ BUILD_CONFIG_FILENAMES.map do |filename|
+ file_finder.find("SDKROOT = #{sdk} filename:#{filename}")
+ end.flatten
+ end
+ end
+end
diff --git a/app/services/projects/container_repository/third_party/delete_tags_service.rb b/app/services/projects/container_repository/third_party/delete_tags_service.rb
index 4184c676fc3..942df177bea 100644
--- a/app/services/projects/container_repository/third_party/delete_tags_service.rb
+++ b/app/services/projects/container_repository/third_party/delete_tags_service.rb
@@ -33,7 +33,7 @@ module Projects
if deleted_tags.any? && @container_repository.delete_tag_by_digest(deleted_tags.each_value.first)
success(deleted: deleted_tags.keys)
else
- error('could not delete tags')
+ error("could not delete tags: #{@tag_names.join(', ')}".truncate(1000))
end
end
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 252e1d76bef..3e26c8c35b2 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -105,7 +105,8 @@ module Projects
end
@project.track_project_repository
- @project.create_project_setting unless @project.project_setting
+
+ create_project_settings
yield if block_given?
@@ -122,6 +123,14 @@ module Projects
create_sast_commit if @initialize_with_sast
end
+ def create_project_settings
+ if Feature.enabled?(:create_project_settings, default_enabled: :yaml)
+ @project.project_setting.save if @project.project_setting.changed?
+ else
+ @project.create_project_setting unless @project.project_setting
+ end
+ end
+
# Add an authorization for the current user authorizations inline
# (so they can access the project immediately after this request
# completes), and any other affected users in the background
@@ -243,7 +252,7 @@ module Projects
def import_schedule
if @project.errors.empty?
- @project.import_state.schedule if @project.import? && !@project.bare_repository_import?
+ @project.import_state.schedule if @project.import? && !@project.bare_repository_import? && !@project.gitlab_project_migration?
else
fail(error: @project.errors.full_messages.join(', '))
end
diff --git a/app/services/projects/deploy_tokens/create_service.rb b/app/services/projects/deploy_tokens/create_service.rb
index 2486544b150..c44a7686c04 100644
--- a/app/services/projects/deploy_tokens/create_service.rb
+++ b/app/services/projects/deploy_tokens/create_service.rb
@@ -6,7 +6,7 @@ module Projects
include DeployTokenMethods
def execute
- deploy_token = create_deploy_token_for(@project, params)
+ deploy_token = create_deploy_token_for(@project, current_user, params)
create_deploy_token_payload_for(deploy_token)
end
diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb
index b91b7f34d42..72492b6f5a5 100644
--- a/app/services/projects/import_export/export_service.rb
+++ b/app/services/projects/import_export/export_service.rb
@@ -23,6 +23,13 @@ module Projects
cleanup
end
+ def exporters
+ [
+ version_saver, avatar_saver, project_tree_saver, uploads_saver,
+ repo_saver, wiki_repo_saver, lfs_saver, snippets_repo_saver, design_repo_saver
+ ]
+ end
+
protected
def extra_attributes_for_measurement
@@ -59,30 +66,23 @@ module Projects
end
def save_export_archive
- Gitlab::ImportExport::Saver.save(exportable: project, shared: shared)
- end
-
- def exporters
- [
- version_saver, avatar_saver, project_tree_saver, uploads_saver,
- repo_saver, wiki_repo_saver, lfs_saver, snippets_repo_saver, design_repo_saver
- ]
+ @export_saver ||= Gitlab::ImportExport::Saver.save(exportable: project, shared: shared)
end
def version_saver
- Gitlab::ImportExport::VersionSaver.new(shared: shared)
+ @version_saver ||= Gitlab::ImportExport::VersionSaver.new(shared: shared)
end
def avatar_saver
- Gitlab::ImportExport::AvatarSaver.new(project: project, shared: shared)
+ @avatar_saver ||= Gitlab::ImportExport::AvatarSaver.new(project: project, shared: shared)
end
def project_tree_saver
- tree_saver_class.new(project: project,
- current_user: current_user,
- shared: shared,
- params: params,
- logger: logger)
+ @project_tree_saver ||= tree_saver_class.new(project: project,
+ current_user: current_user,
+ shared: shared,
+ params: params,
+ logger: logger)
end
def tree_saver_class
@@ -90,27 +90,31 @@ module Projects
end
def uploads_saver
- Gitlab::ImportExport::UploadsSaver.new(project: project, shared: shared)
+ @uploads_saver ||= Gitlab::ImportExport::UploadsSaver.new(project: project, shared: shared)
end
def repo_saver
- Gitlab::ImportExport::RepoSaver.new(exportable: project, shared: shared)
+ @repo_saver ||= Gitlab::ImportExport::RepoSaver.new(exportable: project, shared: shared)
end
def wiki_repo_saver
- Gitlab::ImportExport::WikiRepoSaver.new(exportable: project, shared: shared)
+ @wiki_repo_saver ||= Gitlab::ImportExport::WikiRepoSaver.new(exportable: project, shared: shared)
end
def lfs_saver
- Gitlab::ImportExport::LfsSaver.new(project: project, shared: shared)
+ @lfs_saver ||= Gitlab::ImportExport::LfsSaver.new(project: project, shared: shared)
end
def snippets_repo_saver
- Gitlab::ImportExport::SnippetsRepoSaver.new(current_user: current_user, project: project, shared: shared)
+ @snippets_repo_saver ||= Gitlab::ImportExport::SnippetsRepoSaver.new(
+ current_user: current_user,
+ project: project,
+ shared: shared
+ )
end
def design_repo_saver
- Gitlab::ImportExport::DesignRepoSaver.new(exportable: project, shared: shared)
+ @design_repo_saver ||= Gitlab::ImportExport::DesignRepoSaver.new(exportable: project, shared: shared)
end
def cleanup
diff --git a/app/services/projects/operations/update_service.rb b/app/services/projects/operations/update_service.rb
index ef74f3e6e7a..b66435d013b 100644
--- a/app/services/projects/operations/update_service.rb
+++ b/app/services/projects/operations/update_service.rb
@@ -112,8 +112,9 @@ module Projects
integration = project.find_or_initialize_integration(::Integrations::Prometheus.to_param)
integration.assign_attributes(attrs)
+ attrs = integration.to_integration_hash.except('created_at', 'updated_at')
- { prometheus_integration_attributes: integration.attributes.except(*%w[id project_id created_at updated_at]) }
+ { prometheus_integration_attributes: attrs }
end
def incident_management_setting_params
diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb
index 152590fffff..c7a34afffb3 100644
--- a/app/services/projects/participants_service.rb
+++ b/app/services/projects/participants_service.rb
@@ -39,6 +39,7 @@ module Projects
GroupMember
.active_without_invites_and_requests
.with_source_id(visible_groups.self_and_ancestors.pluck_primary_key)
+ .select(*GroupMember.cached_column_list)
end
def visible_groups
@@ -52,11 +53,12 @@ module Projects
end
def project_members_through_ancestral_groups
- project.group.present? ? project.group.members_with_parents : Member.none
+ members = project.group.present? ? project.group.members_with_parents : Member.none
+ members.select(*GroupMember.cached_column_list)
end
def individual_project_members
- project.project_members
+ project.project_members.select(*GroupMember.cached_column_list)
end
def project_owner?
diff --git a/app/services/projects/record_target_platforms_service.rb b/app/services/projects/record_target_platforms_service.rb
new file mode 100644
index 00000000000..224e16f53b3
--- /dev/null
+++ b/app/services/projects/record_target_platforms_service.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Projects
+ class RecordTargetPlatformsService < BaseService
+ include Gitlab::Utils::StrongMemoize
+
+ def execute
+ record_target_platforms
+ end
+
+ private
+
+ def target_platforms
+ strong_memoize(:target_platforms) do
+ AppleTargetPlatformDetectorService.new(project).execute
+ end
+ end
+
+ def record_target_platforms
+ return unless target_platforms.present?
+
+ setting = ::ProjectSetting.find_or_initialize_by(project: project) # rubocop:disable CodeReuse/ActiveRecord
+ setting.target_platforms = target_platforms
+ setting.save
+
+ setting.target_platforms
+ end
+ end
+end
diff --git a/app/services/projects/refresh_build_artifacts_size_statistics_service.rb b/app/services/projects/refresh_build_artifacts_size_statistics_service.rb
index 794c042ea39..1f86e5f4ba9 100644
--- a/app/services/projects/refresh_build_artifacts_size_statistics_service.rb
+++ b/app/services/projects/refresh_build_artifacts_size_statistics_service.rb
@@ -12,7 +12,7 @@ module Projects
if batch.any?
# We are doing the sum in ruby because the query takes too long when done in SQL
- total_artifacts_size = batch.sum(&:size)
+ total_artifacts_size = batch.sum { |artifact| artifact.size.to_i }
Projects::BuildArtifactsSizeRefresh.transaction do
# Mark the refresh ready for another worker to pick up and process the next batch
diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb
index 51c0989ee55..2ad5c303be2 100644
--- a/app/services/projects/transfer_service.rb
+++ b/app/services/projects/transfer_service.rb
@@ -121,6 +121,7 @@ module Projects
# Overridden in EE
def post_update_hooks(project)
move_pages(project)
+ ensure_personal_project_owner_membership(project)
end
# Overridden in EE
@@ -152,6 +153,19 @@ module Projects
project.track_project_repository
end
+ def ensure_personal_project_owner_membership(project)
+ # In case of personal projects, we want to make sure that
+ # a membership record with `OWNER` access level exists for the owner of the namespace.
+ return unless project.personal?
+
+ namespace_owner = project.namespace.owner
+ existing_membership_record = project.member(namespace_owner)
+
+ return if existing_membership_record.present? && existing_membership_record.access_level == Gitlab::Access::OWNER
+
+ project.add_owner(namespace_owner)
+ end
+
def refresh_permissions
# This ensures we only schedule 1 job for every user that has access to
# the namespaces.
diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb
index 1baa4ddf0eb..47f4b9c6898 100644
--- a/app/services/quick_actions/interpret_service.rb
+++ b/app/services/quick_actions/interpret_service.rb
@@ -77,7 +77,10 @@ module QuickActions
# want to also handle bare usernames. The ReferenceExtractor also has
# different behaviour, and will return all group members for groups named
# using a user-style reference, which is not in scope here.
+ #
+ # nb: underscores may be passed in escaped to protect them from markdown rendering
args = params.split(/\s|,/).select(&:present?).uniq - ['and']
+ args.map! { _1.gsub(/\\_/, '_') }
usernames = (args - ['me']).map { _1.delete_prefix('@') }
found = User.by_username(usernames).to_a.select { can?(:read_user, _1) }
found_names = found.map(&:username).to_set
@@ -168,7 +171,7 @@ module QuickActions
next unless definition
definition.execute(self, arg)
- usage_ping_tracking(name, arg)
+ usage_ping_tracking(definition.name, arg)
end
end
@@ -186,7 +189,7 @@ module QuickActions
def usage_ping_tracking(quick_action_name, arg)
Gitlab::UsageDataCounters::QuickActionActivityUniqueCounter.track_unique_action(
- quick_action_name,
+ quick_action_name.to_s,
args: arg&.strip,
user: current_user
)
diff --git a/app/services/resource_access_tokens/create_service.rb b/app/services/resource_access_tokens/create_service.rb
index 28ea1ac8296..f7ffe288d57 100644
--- a/app/services/resource_access_tokens/create_service.rb
+++ b/app/services/resource_access_tokens/create_service.rb
@@ -75,7 +75,6 @@ module ResourceAccessTokens
end
def generate_email
- # Default emaildomain need to be reworked. See gitlab-org/gitlab#260305
email_pattern = "#{resource_type}#{resource.id}_bot%s@noreply.#{Gitlab.config.gitlab.host}"
uniquify.string(-> (n) { Kernel.sprintf(email_pattern, n) }) do |s|
diff --git a/app/services/suggestions/apply_service.rb b/app/services/suggestions/apply_service.rb
index a0d26e08341..a20eb6b79c5 100644
--- a/app/services/suggestions/apply_service.rb
+++ b/app/services/suggestions/apply_service.rb
@@ -54,7 +54,7 @@ module Suggestions
author_email: author&.email
}
- ::Files::MultiService.new(suggestion_set.project, current_user, params)
+ ::Files::MultiService.new(suggestion_set.source_project, current_user, params)
end
def commit_message
diff --git a/app/services/users/destroy_service.rb b/app/services/users/destroy_service.rb
index 46eec082125..1ea65049dc2 100644
--- a/app/services/users/destroy_service.rb
+++ b/app/services/users/destroy_service.rb
@@ -64,6 +64,10 @@ module Users
# This ensures we delete records in batches.
user.destroy_dependent_associations_in_batches(exclude: [:snippets])
+ if Feature.enabled?(:nullify_in_batches_on_user_deletion, default_enabled: :yaml)
+ user.nullify_dependent_associations_in_batches
+ end
+
# Destroy the namespace after destroying the user since certain methods may depend on the namespace existing
user_data = user.destroy
namespace.destroy
diff --git a/app/services/users/migrate_to_ghost_user_service.rb b/app/services/users/migrate_to_ghost_user_service.rb
index 604b83f621f..3eb220c0e40 100644
--- a/app/services/users/migrate_to_ghost_user_service.rb
+++ b/app/services/users/migrate_to_ghost_user_service.rb
@@ -100,9 +100,9 @@ module Users
end
# rubocop:disable CodeReuse/ActiveRecord
- def batched_migrate(base_scope, column)
+ def batched_migrate(base_scope, column, batch_size: 50)
loop do
- update_count = base_scope.where(column => user.id).limit(100).update_all(column => ghost_user.id)
+ update_count = base_scope.where(column => user.id).limit(batch_size).update_all(column => ghost_user.id)
break if update_count == 0
end
end
diff --git a/app/services/users/registrations_build_service.rb b/app/services/users/registrations_build_service.rb
index 2d367e7b185..0065b49cc00 100644
--- a/app/services/users/registrations_build_service.rb
+++ b/app/services/users/registrations_build_service.rb
@@ -16,3 +16,5 @@ module Users
end
end
end
+
+Users::RegistrationsBuildService.prepend_mod
diff --git a/app/services/users/saved_replies/destroy_service.rb b/app/services/users/saved_replies/destroy_service.rb
new file mode 100644
index 00000000000..ac08cddad0c
--- /dev/null
+++ b/app/services/users/saved_replies/destroy_service.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Users
+ module SavedReplies
+ class DestroyService
+ def initialize(saved_reply:)
+ @saved_reply = saved_reply
+ end
+
+ def execute
+ if saved_reply.destroy
+ ServiceResponse.success(payload: { saved_reply: saved_reply })
+ else
+ ServiceResponse.error(message: saved_reply.errors.full_messages)
+ end
+ end
+
+ private
+
+ attr_reader :saved_reply
+ end
+ end
+end
diff --git a/app/services/users/saved_replies/update_service.rb b/app/services/users/saved_replies/update_service.rb
index ab0a3eaf87d..80d3da8a0a3 100644
--- a/app/services/users/saved_replies/update_service.rb
+++ b/app/services/users/saved_replies/update_service.rb
@@ -3,8 +3,7 @@
module Users
module SavedReplies
class UpdateService
- def initialize(current_user:, saved_reply:, name:, content:)
- @current_user = current_user
+ def initialize(saved_reply:, name:, content:)
@saved_reply = saved_reply
@name = name
@content = content
@@ -20,7 +19,7 @@ module Users
private
- attr_reader :current_user, :saved_reply, :name, :content
+ attr_reader :saved_reply, :name, :content
end
end
end
diff --git a/app/services/web_hook_service.rb b/app/services/web_hook_service.rb
index b1d8872aa5e..c0727e52cc3 100644
--- a/app/services/web_hook_service.rb
+++ b/app/services/web_hook_service.rb
@@ -36,7 +36,7 @@ class WebHookService
def initialize(hook, data, hook_name, uniqueness_token = nil, force: false)
@hook = hook
- @data = data
+ @data = data.to_h
@hook_name = hook_name.to_s
@uniqueness_token = uniqueness_token
@force = force
@@ -70,9 +70,6 @@ class WebHookService
end
log_execution(
- trigger: hook_name,
- url: hook.url,
- request_data: data,
response: response,
execution_duration: Gitlab::Metrics::System.monotonic_time - start_time
)
@@ -86,9 +83,6 @@ class WebHookService
Gitlab::Json::LimitedEncoder::LimitExceeded, URI::InvalidURIError => e
execution_duration = Gitlab::Metrics::System.monotonic_time - start_time
log_execution(
- trigger: hook_name,
- url: hook.url,
- request_data: data,
response: InternalErrorResponse.new,
execution_duration: execution_duration,
error_message: e.to_s
@@ -139,14 +133,14 @@ class WebHookService
make_request(post_url, basic_auth)
end
- def log_execution(trigger:, url:, request_data:, response:, execution_duration:, error_message: nil)
+ def log_execution(response:, execution_duration:, error_message: nil)
category = response_category(response)
log_data = {
- trigger: trigger,
- url: url,
+ trigger: hook_name,
+ url: hook.url,
execution_duration: execution_duration,
request_headers: build_headers,
- request_data: request_data,
+ request_data: data,
response_headers: format_response_headers(response),
response_body: safe_response_body(response),
response_status: response.code,
diff --git a/app/uploaders/ci/secure_file_uploader.rb b/app/uploaders/ci/secure_file_uploader.rb
index 514d88dd177..8aa624d6b30 100644
--- a/app/uploaders/ci/secure_file_uploader.rb
+++ b/app/uploaders/ci/secure_file_uploader.rb
@@ -10,7 +10,7 @@ module Ci
encrypt(key: :key)
def key
- OpenSSL::HMAC.digest('SHA256', Gitlab::Application.secrets.db_key_base, model.project_id.to_s)
+ Digest::SHA256.digest model.key_data
end
def checksum
diff --git a/app/uploaders/metric_image_uploader.rb b/app/uploaders/metric_image_uploader.rb
new file mode 100644
index 00000000000..0826bb251e4
--- /dev/null
+++ b/app/uploaders/metric_image_uploader.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class MetricImageUploader < GitlabUploader # rubocop:disable Gitlab/NamespacedClass
+ include RecordsUploads::Concern
+ include ObjectStorage::Concern
+ prepend ObjectStorage::Extension::RecordsUploads
+ include UploaderHelper
+
+ private
+
+ def dynamic_segment
+ File.join(model.class.underscore, mounted_as.to_s, model.id.to_s)
+ end
+
+ class << self
+ def default_store
+ object_store_enabled? ? ObjectStorage::Store::REMOTE : ObjectStorage::Store::LOCAL
+ end
+ end
+end
diff --git a/app/validators/gitlab/emoji_name_validator.rb b/app/validators/gitlab/emoji_name_validator.rb
index a9092d0194f..c034a79214b 100644
--- a/app/validators/gitlab/emoji_name_validator.rb
+++ b/app/validators/gitlab/emoji_name_validator.rb
@@ -11,9 +11,22 @@
module Gitlab
class EmojiNameValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
- unless TanukiEmoji.find_by_alpha_code(value.to_s)
- record.errors.add(attribute, (options[:message] || 'is not a valid emoji name'))
- end
+ return if valid_tanuki_emoji?(value)
+ return if valid_custom_emoji?(record, value)
+
+ record.errors.add(attribute, (options[:message] || 'is not a valid emoji name'))
+ end
+
+ private
+
+ def valid_tanuki_emoji?(value)
+ TanukiEmoji.find_by_alpha_code(value.to_s)
+ end
+
+ def valid_custom_emoji?(record, value)
+ resource = record.try(:resource_parent)
+
+ CustomEmoji.for_resource(resource).by_name(value.to_s).any?
end
end
end
diff --git a/app/validators/key_restriction_validator.rb b/app/validators/key_restriction_validator.rb
index 9809047ae83..0094d6156a3 100644
--- a/app/validators/key_restriction_validator.rb
+++ b/app/validators/key_restriction_validator.rb
@@ -2,25 +2,34 @@
class KeyRestrictionValidator < ActiveModel::EachValidator
FORBIDDEN = -1
+ ALLOWED = 0
def self.supported_sizes(type)
Gitlab::SSHPublicKey.supported_sizes(type)
end
def self.supported_key_restrictions(type)
- [0, *supported_sizes(type), FORBIDDEN]
+ if Gitlab::FIPS.enabled?
+ [*supported_sizes(type), FORBIDDEN]
+ else
+ [ALLOWED, *supported_sizes(type), FORBIDDEN]
+ end
end
def validate_each(record, attribute, value)
unless valid_restriction?(value)
- record.errors.add(attribute, "must be forbidden, allowed, or one of these sizes: #{supported_sizes_message}")
+ record.errors.add(attribute, "must be #{supported_sizes_message}")
end
end
private
def supported_sizes_message
- sizes = self.class.supported_sizes(options[:type])
+ sizes = []
+
+ sizes << "forbidden" if valid_restriction?(FORBIDDEN)
+ sizes << "allowed" if valid_restriction?(ALLOWED)
+ sizes += self.class.supported_sizes(options[:type])
Gitlab::Utils.to_exclusive_sentence(sizes)
end
diff --git a/app/views/admin/application_settings/_account_and_limit.html.haml b/app/views/admin/application_settings/_account_and_limit.html.haml
index 189986b3dec..a0fa69c54c5 100644
--- a/app/views/admin/application_settings/_account_and_limit.html.haml
+++ b/app/views/admin/application_settings/_account_and_limit.html.haml
@@ -1,12 +1,9 @@
-= form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-account-settings'), html: { class: 'fieldset-form', id: 'account-settings' } do |f|
+= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-account-settings'), html: { class: 'fieldset-form', id: 'account-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :gravatar_enabled, class: 'form-check-input'
- = f.label :gravatar_enabled, class: 'form-check-label' do
- = _('Gravatar enabled')
+ = f.gitlab_ui_checkbox_component :gravatar_enabled, _('Gravatar enabled')
.form-group
= f.label :default_projects_limit, _('Default projects limit'), class: 'label-bold'
@@ -38,16 +35,10 @@
.form-group
= f.label :user_oauth_applications, _('User OAuth applications'), class: 'label-bold'
- .form-check
- = f.check_box :user_oauth_applications, class: 'form-check-input'
- = f.label :user_oauth_applications, class: 'form-check-label' do
- = _('Allow users to register any application to use GitLab as an OAuth provider')
+ = f.gitlab_ui_checkbox_component :user_oauth_applications, _('Allow users to register any application to use GitLab as an OAuth provider')
.form-group
= f.label :user_default_external, _('New users set to external'), class: 'label-bold'
- .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 are external by default')
+ = f.gitlab_ui_checkbox_component :user_default_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'
@@ -57,22 +48,15 @@
- unless Gitlab.com?
.form-group
= f.label :deactivate_dormant_users, _('Dormant users'), class: 'label-bold'
- .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')
- .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', rel: 'noopener noreferrer'
+ - dormant_users_help_link = help_page_path('user/admin_area/moderate_users', anchor: 'automatically-deactivate-dormant-users')
+ - dormant_users_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: dormant_users_help_link }
+ = f.gitlab_ui_checkbox_component :deactivate_dormant_users, _('Deactivate dormant users after 90 days of inactivity'), help_text: _('Users can reactivate their account by signing in. %{link_start}Learn more%{link_end}').html_safe % { link_start: dormant_users_help_link_start, link_end: '</a>'.html_safe }
.form-group
= f.label :personal_access_token_prefix, _('Personal Access Token prefix'), class: 'label-light'
= 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
- = f.check_box :user_show_add_ssh_key_message, class: 'form-check-input'
- = f.label :user_show_add_ssh_key_message, class: 'form-check-label' do
- = _("Inform users without uploaded SSH keys that they can't push over SSH until one is added")
+ = f.gitlab_ui_checkbox_component :user_show_add_ssh_key_message, _("Inform users without uploaded SSH keys that they can't push over SSH until one is added")
= render_if_exists 'admin/application_settings/updating_name_disabled_for_users', form: f
= render_if_exists 'admin/application_settings/availability_on_namespace_setting', form: f
diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml
index 41698f9720b..201ca830ba4 100644
--- a/app/views/admin/application_settings/_ci_cd.html.haml
+++ b/app/views/admin/application_settings/_ci_cd.html.haml
@@ -1,80 +1,102 @@
-= form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-ci-cd-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
+.settings-content
+ = gitlab_ui_form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-ci-cd-settings'), html: { class: 'fieldset-form' } do |f|
+ = form_errors(@application_setting)
- %fieldset
- .form-group
- .form-check
- = f.check_box :auto_devops_enabled, class: 'form-check-input'
- = f.label :auto_devops_enabled, class: 'form-check-label' do
- = s_('CICD|Default to Auto DevOps pipeline for all projects')
+ %fieldset
+ .form-group
+ - devops_help_link_url = help_page_path('topics/autodevops/index.md')
+ - devops_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: devops_help_link_url }
+ = f.gitlab_ui_checkbox_component :auto_devops_enabled, s_('CICD|Default to Auto DevOps pipeline for all projects'), help_text: s_('CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file. %{link_start}What is Auto DevOps?%{link_end}').html_safe % { link_start: devops_help_link_start, link_end: '</a>'.html_safe }
+ .form-group
+ = f.label :auto_devops_domain, s_('AdminSettings|Auto DevOps domain'), class: 'label-bold'
+ = f.text_field :auto_devops_domain, class: 'form-control gl-form-input', placeholder: 'example.com'
.form-text.text-muted
- = s_('CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file.')
- = link_to _('What is Auto DevOps?'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer'
- .form-group
- = f.label :auto_devops_domain, s_('AdminSettings|Auto DevOps domain'), class: 'label-bold'
- = f.text_field :auto_devops_domain, class: 'form-control gl-form-input', placeholder: 'example.com'
- .form-text.text-muted
- = s_("AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects.")
- = link_to _('Learn more.'), help_page_path('topics/autodevops/stages.md', anchor: 'auto-review-apps'), target: '_blank', rel: 'noopener noreferrer'
+ = s_("AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects.")
+ = link_to _('Learn more.'), help_page_path('topics/autodevops/stages.md', anchor: 'auto-review-apps'), target: '_blank', rel: 'noopener noreferrer'
- .form-group
- .form-check
- = f.check_box :shared_runners_enabled, class: 'form-check-input'
- = f.label :shared_runners_enabled, class: 'form-check-label' do
- = s_("AdminSettings|Enable shared runners for new projects")
- .form-text.text-muted
- = s_("AdminSettings|All new projects can use the instance's shared runners by default.")
+ .form-group
+ = f.gitlab_ui_checkbox_component :shared_runners_enabled, s_("AdminSettings|Enable shared runners for new projects"), help_text: s_("AdminSettings|All new projects can use the instance's shared runners by default.")
- = render_if_exists 'admin/application_settings/shared_runners_minutes_setting', form: f
+ = render_if_exists 'admin/application_settings/shared_runners_minutes_setting', form: f
- .form-group
- = f.label :shared_runners_text, _('Shared runners details'), class: 'label-bold'
- = f.text_area :shared_runners_text, class: 'form-control gl-form-input', rows: 4
- .form-text.text-muted= _("Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported.")
- .form-group
- = f.label :max_artifacts_size, _('Maximum artifacts size (MB)'), class: 'label-bold'
- = f.number_field :max_artifacts_size, class: 'form-control gl-form-input'
- .form-text.text-muted
- = _("The maximum file size for job artifacts.")
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size')
- .form-group
- = f.label :default_artifacts_expire_in, _('Default artifacts expiration'), class: 'label-bold'
- = f.text_field :default_artifacts_expire_in, class: 'form-control gl-form-input'
- .form-text.text-muted
- = html_escape(_("Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'default-artifacts-expiration')
- .form-group
- .form-check
- = f.check_box :keep_latest_artifact, class: 'form-check-input'
- = f.label :keep_latest_artifact, class: 'form-check-label' do
- = s_('AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines')
+ .form-group
+ = f.label :shared_runners_text, _('Shared runners details'), class: 'label-bold'
+ = f.text_area :shared_runners_text, class: 'form-control gl-form-input', rows: 4
+ .form-text.text-muted= _("Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported.")
+ .form-group
+ = f.label :max_artifacts_size, _('Maximum artifacts size (MB)'), class: 'label-bold'
+ = f.number_field :max_artifacts_size, class: 'form-control gl-form-input'
.form-text.text-muted
- = s_('AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire.')
- .form-group
- = f.label :archive_builds_in_human_readable, _('Archive jobs'), class: 'label-bold'
- = f.text_field :archive_builds_in_human_readable, class: 'form-control gl-form-input'
- .form-text.text-muted
- = html_escape(_("Jobs older than the configured time are considered expired and are archived. Archived jobs can no longer be retried. Leave empty to never archive jobs automatically. The default unit is in days, but you can use other units, for example %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}. Minimum value is 1 day.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'archive-jobs')
- .form-group
- .form-check
- = f.check_box :protected_ci_variables, class: 'form-check-input'
- = f.label :protected_ci_variables, class: 'form-check-label' do
- = s_('AdminSettings|Protect CI/CD variables by default')
+ = _("The maximum file size for job artifacts.")
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size')
+ .form-group
+ = f.label :default_artifacts_expire_in, _('Default artifacts expiration'), class: 'label-bold'
+ = f.text_field :default_artifacts_expire_in, class: 'form-control gl-form-input'
.form-text.text-muted
- = s_('AdminSettings|New CI/CD variables in projects and groups default to protected.')
- .form-group
- = f.label :ci_config_path, _('Default CI/CD configuration file'), class: 'label-bold'
- = f.text_field :default_ci_config_path, class: 'form-control gl-form-input', placeholder: '.gitlab-ci.yml'
- %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', rel: 'noopener noreferrer'
- .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')
+ = html_escape(_("Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'default-artifacts-expiration')
+ .form-group
+ = f.gitlab_ui_checkbox_component :keep_latest_artifact, s_('AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines'), help_text: s_('AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire.')
+ .form-group
+ = f.label :archive_builds_in_human_readable, _('Archive jobs'), class: 'label-bold'
+ = f.text_field :archive_builds_in_human_readable, class: 'form-control gl-form-input'
.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.')
+ = html_escape(_("Jobs older than the configured time are considered expired and are archived. Archived jobs can no longer be retried. Leave empty to never archive jobs automatically. The default unit is in days, but you can use other units, for example %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}. Minimum value is 1 day.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'archive-jobs')
+ .form-group
+ = f.gitlab_ui_checkbox_component :protected_ci_variables, s_('AdminSettings|Protect CI/CD variables by default'), help_text: s_('AdminSettings|New CI/CD variables in projects and groups default to protected.')
+ .form-group
+ = f.label :ci_config_path, _('Default CI/CD configuration file'), class: 'label-bold'
+ = f.text_field :default_ci_config_path, class: 'form-control gl-form-input', placeholder: '.gitlab-ci.yml'
+ %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', rel: 'noopener noreferrer'
+ .form-group
+ = f.gitlab_ui_checkbox_component :suggest_pipeline_enabled, s_('AdminSettings|Enable pipeline suggestion banner'), help_text: 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"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
+
+.settings-content
+ %h4
+ = s_('AdminSettings|CI/CD limits')
+ %p
+ = s_('AdminSettings|Set limit to 0 to disable it.')
+ .scrolling-tabs-container.inner-page-scroll-tabs
+ - if @plans.size > 1
+ %ul.nav-links.scrolling-tabs.mobile-separator.nav.nav-tabs.gl-mb-5
+ - @plans.each_with_index do |plan, index|
+ %li
+ = link_to admin_plan_limits_path(anchor: 'js-ci-cd-settings'), data: { target: "div#plan#{index}", action: "plan#{index}", toggle: 'tab'}, class: index == 0 ? 'active': '' do
+ = plan.name.capitalize
+ .tab-content.gl-tab-content
+ - @plans.each_with_index do |plan, index|
+ .tab-pane{ :id => "plan#{index}", class: index == 0 ? 'active': '' }
+ = form_for plan.actual_limits, url: admin_plan_limits_path(anchor: 'js-ci-cd-settings'), html: { class: 'fieldset-form' }, method: :post do |f|
+ = form_errors(plan)
+ %fieldset
+ = f.hidden_field(:plan_id, value: plan.id)
+ .form-group
+ = f.label :ci_pipeline_size, s_('AdminSettings|Maximum number of jobs in a single pipeline')
+ = f.number_field :ci_pipeline_size, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :ci_active_jobs, s_('AdminSettings|Total number of jobs in currently active pipelines')
+ = f.number_field :ci_active_jobs, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :ci_active_pipelines, s_('AdminSettings|Maximum number of active pipelines per project')
+ = f.number_field :ci_active_pipelines, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :ci_project_subscriptions, s_('AdminSettings|Maximum number of pipeline subscriptions to and from a project')
+ = f.number_field :ci_project_subscriptions, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :ci_pipeline_schedules, s_('AdminSettings|Maximum number of pipeline schedules')
+ = f.number_field :ci_pipeline_schedules, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :ci_needs_size_limit, s_('AdminSettings|Maximum number of DAG dependencies that a job can have')
+ = f.number_field :ci_needs_size_limit, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :ci_registered_group_runners, s_('AdminSettings|Maximum number of runners registered per group')
+ = f.number_field :ci_registered_group_runners, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :ci_registered_project_runners, s_('AdminSettings|Maximum number of runners registered per project')
+ = f.number_field :ci_registered_project_runners, class: 'form-control gl-form-input'
+ = f.submit s_('AdminSettings|Save %{name} limits').html_safe % { name: plan.name.capitalize }, class: 'btn gl-button btn-confirm'
diff --git a/app/views/admin/application_settings/_eks.html.haml b/app/views/admin/application_settings/_eks.html.haml
index d9c0a01beb0..bd6ff9b426f 100644
--- a/app/views/admin/application_settings/_eks.html.haml
+++ b/app/views/admin/application_settings/_eks.html.haml
@@ -9,15 +9,13 @@
= _('Amazon EKS integration allows you to provision EKS clusters from GitLab.')
.settings-content
- = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-eks-settings'), html: { class: 'fieldset-form', id: 'eks-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-eks-settings'), html: { class: 'fieldset-form', id: 'eks-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :eks_integration_enabled, class: 'form-check-input'
- = f.label :eks_integration_enabled, class: 'form-check-label' do
- = _('Enable Amazon EKS integration')
+ = f.gitlab_ui_checkbox_component :eks_integration_enabled,
+ _('Enable Amazon EKS integration')
.form-group
= f.label :eks_account_id, _('Account ID'), class: 'label-bold'
= f.text_field :eks_account_id, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_email.html.haml b/app/views/admin/application_settings/_email.html.haml
index 0ab462a3fa8..fd65d4029f5 100644
--- a/app/views/admin/application_settings/_email.html.haml
+++ b/app/views/admin/application_settings/_email.html.haml
@@ -1,21 +1,11 @@
-= form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-email-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-email-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :email_author_in_body, class: 'form-check-input'
- = f.label :email_author_in_body, class: 'form-check-label' do
- = _('Include author name in notification email body')
- .form-text.text-muted
- = _("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.")
+ = f.gitlab_ui_checkbox_component :email_author_in_body, _('Include author name in notification email body'), help_text: _("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.")
.form-group
- .form-check
- = f.check_box :html_emails_enabled, class: 'form-check-input'
- = f.label :html_emails_enabled, class: 'form-check-label' do
- = _('Enable multipart emails')
- .form-text.text-muted
- = _('Send email in multipart format (HTML and plain text). Uncheck to send email messages in plain text only.')
+ = f.gitlab_ui_checkbox_component :html_emails_enabled, _('Enable multipart emails'), help_text: _('Send email in multipart format (HTML and plain text). Uncheck to send email messages in plain text only.')
.form-group
= f.label :commit_email_hostname, _('Custom hostname (for private commit emails)'), class: 'label-bold'
= f.text_field :commit_email_hostname, class: 'form-control gl-form-input'
@@ -26,19 +16,9 @@
= render_if_exists 'admin/application_settings/email_additional_text_setting', form: f
.form-group
- .form-check
- = f.check_box :in_product_marketing_emails_enabled, class: 'form-check-input'
- = f.label :in_product_marketing_emails_enabled, class: 'form-check-label' do
- = _('Enable in-product marketing emails')
- .form-text.text-muted
- = _('Send emails to help guide new users through the onboarding process.')
+ = f.gitlab_ui_checkbox_component :in_product_marketing_emails_enabled, _('Enable in-product marketing emails'), help_text: _('Send emails to help guide new users through the onboarding process.')
.form-group
- .form-check
- = f.check_box :user_deactivation_emails_enabled, class: 'form-check-input'
- = f.label :user_deactivation_emails_enabled, class: 'form-check-label' do
- = _('Enable user deactivation emails')
- .form-text.text-muted
- = _('Send emails to users upon account deactivation.')
+ = f.gitlab_ui_checkbox_component :user_deactivation_emails_enabled, _('Enable user deactivation emails'), help_text: _('Send emails to users upon account deactivation.')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_external_authorization_service_form.html.haml b/app/views/admin/application_settings/_external_authorization_service_form.html.haml
index 4fb10d48540..1abf8f78060 100644
--- a/app/views/admin/application_settings/_external_authorization_service_form.html.haml
+++ b/app/views/admin/application_settings/_external_authorization_service_form.html.haml
@@ -9,17 +9,14 @@
= link_to _('Learn more.'), help_page_path('user/admin_area/settings/external_authorization'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
- = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-external-auth-settings'), html: { class: 'fieldset-form', id: 'external-auth-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-external-auth-settings'), html: { class: 'fieldset-form', id: 'external-auth-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :external_authorization_service_enabled, class: 'form-check-input'
- = f.label :external_authorization_service_enabled, class: 'form-check-label' do
- = s_('ExternalAuthorization|Enable classification control using an external service')
- %span.form-text.text-muted
- = external_authorization_description
+ = f.gitlab_ui_checkbox_component :external_authorization_service_enabled,
+ s_('ExternalAuthorization|Enable classification control using an external service'),
+ help_text: external_authorization_description
.form-group
= f.label :external_authorization_service_url, s_('ExternalAuthorization|Service URL'), class: 'label-bold'
= f.text_field :external_authorization_service_url, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_floc.html.haml b/app/views/admin/application_settings/_floc.html.haml
index 66259926064..14b1a58c1ad 100644
--- a/app/views/admin/application_settings/_floc.html.haml
+++ b/app/views/admin/application_settings/_floc.html.haml
@@ -11,12 +11,11 @@
= link_to sprite_icon('question-o'), 'https://github.com/WICG/floc', target: '_blank', rel: 'noopener noreferrer', class: 'has-tooltip', title: _('More information')
.settings-content
- = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-floc-settings'), html: { class: 'fieldset-form', id: 'floc-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-floc-settings'), html: { class: 'fieldset-form', id: 'floc-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :floc_enabled, class: 'form-check-input'
- = f.label :floc_enabled, s_('FloC|Enable FloC (Federated Learning of Cohorts)'), class: 'form-check-label'
+ = f.gitlab_ui_checkbox_component :floc_enabled,
+ s_('FloC|Enable FloC (Federated Learning of Cohorts)')
= f.submit _('Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/application_settings/_git_lfs_limits.html.haml b/app/views/admin/application_settings/_git_lfs_limits.html.haml
index de5a2ceaa3d..b8970a5bcf1 100644
--- a/app/views/admin/application_settings/_git_lfs_limits.html.haml
+++ b/app/views/admin/application_settings/_git_lfs_limits.html.haml
@@ -1,16 +1,13 @@
-= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-git-lfs-limits-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-git-lfs-limits-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
%h5
= _('Authenticated Git LFS request rate limit')
.form-group
- .form-check
- = f.check_box :throttle_authenticated_git_lfs_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_authenticated_git_lfs_checkbox' }
- = f.label :throttle_authenticated_git_lfs_enabled, class: 'form-check-label gl-font-weight-bold' do
- = _('Enable authenticated Git LFS request rate limit')
- %span.form-text.gl-text-gray-600
- = _('Helps reduce request volume (for example, from crawlers or abusive bots)')
+ = f.gitlab_ui_checkbox_component :throttle_authenticated_git_lfs_enabled,
+ _('Enable authenticated Git LFS request rate limit'),
+ help_text: _('Helps reduce request volume (for example, from crawlers or abusive bots)')
.form-group
= f.label :throttle_authenticated_git_lfs_requests_per_period, _('Max authenticated Git LFS requests per period per user'), class: 'gl-font-weight-bold'
= f.number_field :throttle_authenticated_git_lfs_requests_per_period, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_gitpod.html.haml b/app/views/admin/application_settings/_gitpod.html.haml
index 8f99a07b87c..515b3691324 100644
--- a/app/views/admin/application_settings/_gitpod.html.haml
+++ b/app/views/admin/application_settings/_gitpod.html.haml
@@ -12,14 +12,13 @@
.settings-content
- = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-gitpod-settings'), html: { class: 'fieldset-form', id: 'gitpod-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-gitpod-settings'), html: { class: 'fieldset-form', id: 'gitpod-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :gitpod_enabled, class: 'form-check-input'
- = f.label :gitpod_enabled, s_('Gitpod|Enable Gitpod integration'), class: 'form-check-label'
+ = f.gitlab_ui_checkbox_component :gitpod_enabled,
+ s_('Gitpod|Enable Gitpod integration')
.form-group
= f.label :gitpod_url, s_('Gitpod|Gitpod URL'), class: 'label-bold'
= f.text_field :gitpod_url, class: 'form-control gl-form-input', placeholder: s_('Gitpod|https://gitpod.example.com')
diff --git a/app/views/admin/application_settings/_grafana.html.haml b/app/views/admin/application_settings/_grafana.html.haml
index 70c1e3ce3c1..7f305b9ad9c 100644
--- a/app/views/admin/application_settings/_grafana.html.haml
+++ b/app/views/admin/application_settings/_grafana.html.haml
@@ -1,14 +1,11 @@
-= form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-grafana-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-grafana-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :grafana_enabled, class: 'form-check-input'
- = f.label :grafana_enabled, class: 'form-check-label' do
- = _("Add a link to Grafana")
- .form-text.text-muted
- = _("A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area.")
+ = f.gitlab_ui_checkbox_component :grafana_enabled,
+ s_('ApplicationSettings|Add a link to Grafana'),
+ help_text: s_('ApplicationSettings|A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area.')
.form-group
= f.label :grafana_url, _('Grafana URL'), class: 'label-bold'
= f.text_field :grafana_url, class: 'form-control gl-form-input', placeholder: '/-/grafana'
diff --git a/app/views/admin/application_settings/_help_page.html.haml b/app/views/admin/application_settings/_help_page.html.haml
index cd7eaa1896a..21eb4caf579 100644
--- a/app/views/admin/application_settings/_help_page.html.haml
+++ b/app/views/admin/application_settings/_help_page.html.haml
@@ -1,4 +1,4 @@
-= form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-help-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-help-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
@@ -9,10 +9,7 @@
= f.text_area :help_page_text, class: 'form-control gl-form-input', rows: 4
.form-text.text-muted= _('Markdown enabled.')
.form-group
- .form-check
- = f.check_box :help_page_hide_commercial_content, class: 'form-check-input'
- = f.label :help_page_hide_commercial_content, class: 'form-check-label' do
- = _('Hide marketing-related entries from the Help page')
+ = f.gitlab_ui_checkbox_component :help_page_hide_commercial_content, _('Hide marketing-related entries from the Help page')
.form-group
= f.label :help_page_support_url, _('Support page URL'), class: 'label-bold'
= 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'
diff --git a/app/views/admin/application_settings/_kroki.html.haml b/app/views/admin/application_settings/_kroki.html.haml
index b22eef83876..61469d87656 100644
--- a/app/views/admin/application_settings/_kroki.html.haml
+++ b/app/views/admin/application_settings/_kroki.html.haml
@@ -9,14 +9,13 @@
= _('Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki.')
= link_to _('Learn more.'), help_page_path('administration/integration/kroki.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
- = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-kroki-settings'), html: { class: 'fieldset-form', id: 'kroki-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-kroki-settings'), html: { class: 'fieldset-form', id: 'kroki-settings' } do |f|
= form_errors(@application_setting) if expanded
%fieldset
.form-group
- .form-check
- = f.check_box :kroki_enabled, class: 'form-check-input'
- = f.label :kroki_enabled, _('Enable Kroki'), class: 'form-check-label'
+ = f.gitlab_ui_checkbox_component :kroki_enabled,
+ _('Enable Kroki')
.form-group
= f.label :kroki_url, 'Kroki URL', class: 'label-bold'
= f.text_field :kroki_url, class: 'form-control gl-form-input', placeholder: 'http://your-kroki-instance:8000'
@@ -30,9 +29,7 @@
- container_link_url = 'https://docs.kroki.io/kroki/setup/install/#images'
- container_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: container_link_url }
= html_escape(_('To use the additional formats, you must start the required %{container_link_start}companion containers%{container_link_end}.')) % { container_link_start: container_link_start, container_link_end: '</a>'.html_safe }
- - kroki_available_formats.each do |format|
- .form-check
- = f.check_box format[:name], class: 'form-check-input'
- = f.label format[:name], format[:label], class: 'form-check-label'
+ - kroki_available_formats.each do |format|
+ = f.gitlab_ui_checkbox_component format[:name], format[:label]
= f.submit _('Save changes'), class: "btn gl-button btn-confirm"
diff --git a/app/views/admin/application_settings/_localization.html.haml b/app/views/admin/application_settings/_localization.html.haml
index d0bb6a78ed6..a6ed48ef4fe 100644
--- a/app/views/admin/application_settings/_localization.html.haml
+++ b/app/views/admin/application_settings/_localization.html.haml
@@ -1,4 +1,4 @@
-= form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-localization-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-localization-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
@@ -11,13 +11,9 @@
.form-group
= f.label :time_tracking, _('Time tracking'), class: 'label-bold'
- .form-check
- = f.check_box :time_tracking_limit_to_hours, class: 'form-check-input'
- = f.label :time_tracking_limit_to_hours, class: 'form-check-label' do
- = _('Limit display of time tracking units to hours.')
- .form-text.text-muted
- = _('Display time tracking in issues in total hours only.')
- = link_to _('What is time tracking?'), help_page_path('user/project/time_tracking.md'), target: '_blank', rel: 'noopener noreferrer'
+ - time_tracking_help_link = help_page_path('user/project/time_tracking.md')
+ - time_tracking_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: time_tracking_help_link }
+ = f.gitlab_ui_checkbox_component :time_tracking_limit_to_hours, _('Limit display of time tracking units to hours.'), help_text: _('Display time tracking in issues in total hours only. %{link_start}What is time tracking?%{link_end}').html_safe % { link_start: time_tracking_help_link_start, 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 ad9e84ffdab..7afb35bc9cb 100644
--- a/app/views/admin/application_settings/_mailgun.html.haml
+++ b/app/views/admin/application_settings/_mailgun.html.haml
@@ -8,14 +8,13 @@
%p
= _('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|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-mailgun-settings'), html: { class: 'fieldset-form', id: 'mailgun-settings' } do |f|
= form_errors(@application_setting) if expanded
%fieldset
.form-group
- .form-check
- = f.check_box :mailgun_events_enabled, class: 'form-check-input'
- = f.label :mailgun_events_enabled, _('Enable Mailgun event receiver'), class: 'form-check-label'
+ = f.gitlab_ui_checkbox_component :mailgun_events_enabled,
+ _('Enable Mailgun event receiver')
.form-group
= f.label :mailgun_signing_key, _('Mailgun HTTP webhook signing key'), class: 'label-light'
= f.text_field :mailgun_signing_key, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_note_limits.html.haml b/app/views/admin/application_settings/_note_limits.html.haml
index 38a5d6a1010..d4ae0d3944c 100644
--- a/app/views/admin/application_settings/_note_limits.html.haml
+++ b/app/views/admin/application_settings/_note_limits.html.haml
@@ -7,8 +7,8 @@
= f.number_field :notes_create_limit, class: 'form-control gl-form-input'
.form-group
= f.label :notes_create_limit_allowlist, _('Users to exclude from the rate limit'), class: 'label-bold'
- = f.text_area :notes_create_limit_allowlist_raw, placeholder: 'username1, username2', class: 'form-control gl-form-input', rows: 5
- .form-text.text-muted
+ = f.text_area :notes_create_limit_allowlist_raw, class: 'form-control gl-form-input', rows: 5, aria: { describedBy: 'note-create-limits-allowlist-field-description' }
+ .form-text.text-muted{ id: 'note-create-limits-allowlist-field-description' }
= _('List of users allowed to exceed the rate limit.')
diff --git a/app/views/admin/application_settings/_outbound.html.haml b/app/views/admin/application_settings/_outbound.html.haml
index 9a31fdd7fdf..503e7d8afa6 100644
--- a/app/views/admin/application_settings/_outbound.html.haml
+++ b/app/views/admin/application_settings/_outbound.html.haml
@@ -1,16 +1,13 @@
-= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-outbound-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-outbound-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :allow_local_requests_from_web_hooks_and_services, class: 'form-check-input', data: { qa_selector: 'allow_requests_from_services_checkbox' }
- = f.label :allow_local_requests_from_web_hooks_and_services, class: 'form-check-label' do
- = s_('OutboundRequests|Allow requests to the local network from web hooks and services')
- .form-check
- = f.check_box :allow_local_requests_from_system_hooks, class: 'form-check-input'
- = f.label :allow_local_requests_from_system_hooks, class: 'form-check-label' do
- = s_('OutboundRequests|Allow requests to the local network from system hooks')
+ = f.gitlab_ui_checkbox_component :allow_local_requests_from_web_hooks_and_services,
+ s_('OutboundRequests|Allow requests to the local network from web hooks and services'),
+ checkbox_options: { data: { qa_selector: 'allow_requests_from_services_checkbox' } }
+ = f.gitlab_ui_checkbox_component :allow_local_requests_from_system_hooks,
+ s_('OutboundRequests|Allow requests to the local network from system hooks')
.form-group
= f.label :outbound_local_requests_allowlist_raw, class: 'label-bold' do
@@ -21,11 +18,8 @@
= link_to _('Learn more.'), help_page_path('security/webhooks.md', anchor: 'allowlist-for-local-requests'), target: '_blank', rel: 'noopener noreferrer'
.form-group
- .form-check
- = f.check_box :dns_rebinding_protection_enabled, class: 'form-check-input'
- = f.label :dns_rebinding_protection_enabled, class: 'form-check-label' do
- = s_('OutboundRequests|Enforce DNS rebinding attack protection')
- %span.form-text.text-muted
- = s_('OutboundRequests|Resolve IP addresses once and uses them to submit requests.')
+ = f.gitlab_ui_checkbox_component :dns_rebinding_protection_enabled,
+ s_('OutboundRequests|Enforce DNS rebinding attack protection'),
+ help_text: _('OutboundRequests|Resolve IP addresses once and uses them to submit requests.')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_pages.html.haml b/app/views/admin/application_settings/_pages.html.haml
index d14c8cffcc7..74903d52f25 100644
--- a/app/views/admin/application_settings/_pages.html.haml
+++ b/app/views/admin/application_settings/_pages.html.haml
@@ -1,26 +1,20 @@
-= form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-pages-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: preferences_admin_application_settings_path(anchor: 'js-pages-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :pages_domain_verification_enabled, class: 'form-check-input'
- = f.label :pages_domain_verification_enabled, class: 'form-check-label' do
- = s_("AdminSettings|Require users to prove ownership of custom domains")
- .form-text.text-muted
- - pages_link_url = help_page_path('administration/pages/index', anchor: 'custom-domain-verification')
- - pages_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: pages_link_url }
- = s_('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}').html_safe % { link_start: pages_link_start, link_end: '</a>'.html_safe }
+ - pages_link_url = help_page_path('administration/pages/index', anchor: 'custom-domain-verification')
+ - pages_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: pages_link_url }
+ = f.gitlab_ui_checkbox_component :pages_domain_verification_enabled,
+ s_("AdminSettings|Require users to prove ownership of custom domains"),
+ help_text: s_('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}').html_safe % { link_start: pages_link_start, link_end: '</a>'.html_safe }
- if Gitlab.config.pages.access_control
.form-group
- .form-check
- = f.check_box :force_pages_access_control, class: 'form-check-input'
- = f.label :force_pages_access_control, class: 'form-check-label' do
- = s_("AdminSettings|Disable public access to Pages sites")
- .form-text.text-muted
- - pages_link_url = help_page_path('administration/pages/index', anchor: 'disable-public-access-to-all-pages-sites')
- - pages_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: pages_link_url }
- = s_("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}").html_safe % { link_start: pages_link_start, link_end: '</a>'.html_safe }
+ - pages_link_url = help_page_path('administration/pages/index', anchor: 'disable-public-access-to-all-pages-sites')
+ - pages_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: pages_link_url }
+ = f.gitlab_ui_checkbox_component :force_pages_access_control,
+ s_("AdminSettings|Disable public access to Pages sites"),
+ help_text: s_("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}").html_safe % { link_start: pages_link_start, link_end: '</a>'.html_safe }
.form-group
= f.label :max_pages_size, _('Maximum size of pages (MB)'), class: 'label-bold'
= f.number_field :max_pages_size, class: 'form-control gl-form-input'
@@ -41,10 +35,8 @@
- pages_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: pages_link_url }
= s_("AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}").html_safe % { link_start: pages_link_start, link_end: '</a>'.html_safe }
.form-group
- .form-check
- = f.check_box :lets_encrypt_terms_of_service_accepted, class: 'form-check-input'
- = f.label :lets_encrypt_terms_of_service_accepted, class: 'form-check-label' do
- - terms_of_service_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: lets_encrypt_terms_of_service_admin_application_settings_path }
- = s_("AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF).").html_safe % { link_start: terms_of_service_link_start, link_end: '</a>'.html_safe }
+ - terms_of_service_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: lets_encrypt_terms_of_service_admin_application_settings_path }
+ = f.gitlab_ui_checkbox_component :lets_encrypt_terms_of_service_accepted,
+ s_("AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF).").html_safe % { link_start: terms_of_service_link_start, link_end: '</a>'.html_safe }
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_performance.html.haml b/app/views/admin/application_settings/_performance.html.haml
index 82e56cf8b81..e0ba8d93fbd 100644
--- a/app/views/admin/application_settings/_performance.html.haml
+++ b/app/views/admin/application_settings/_performance.html.haml
@@ -1,15 +1,12 @@
-= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-performance-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-performance-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :authorized_keys_enabled, class: 'form-check-input'
- = f.label :authorized_keys_enabled, class: 'form-check-label' do
- = _('Use authorized_keys file to authenticate SSH keys')
- .form-text.text-muted
- = _('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'
+ - help_link = help_page_path('administration/operations/fast_ssh_key_lookup')
+ - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_link }
+ = f.gitlab_ui_checkbox_component :authorized_keys_enabled, _('Use authorized_keys file to authenticate SSH keys'),
+ help_text: _('Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead. %{link_start}How do I configure authentication using the GitLab database? %{link_end}').html_safe % { link_start: help_link_start, link_end: '</a>'.html_safe}
.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'
diff --git a/app/views/admin/application_settings/_performance_bar.html.haml b/app/views/admin/application_settings/_performance_bar.html.haml
index 58ea2be8b61..4e37c4c3c98 100644
--- a/app/views/admin/application_settings/_performance_bar.html.haml
+++ b/app/views/admin/application_settings/_performance_bar.html.haml
@@ -1,12 +1,11 @@
-= form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-performance-bar-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-performance-bar-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :performance_bar_enabled, class: 'form-check-input', data: { qa_selector: 'enable_performance_bar_checkbox'}
- = f.label :performance_bar_enabled, class: 'form-check-label' do
- = _("Allow non-administrators access to the performance bar")
+ = f.gitlab_ui_checkbox_component :performance_bar_enabled,
+ s_("Allow non-administrators access to the performance bar"),
+ checkbox_options: { data: { qa_selector: 'enable_performance_bar_checkbox' } }
.form-group
= f.label :performance_bar_allowed_group_path, _('Allow access to members of the following group'), class: 'label-bold'
= f.text_field :performance_bar_allowed_group_path, class: 'form-control gl-form-input', placeholder: 'my-org/my-group', value: @application_setting.performance_bar_allowed_group&.full_path
diff --git a/app/views/admin/application_settings/_plantuml.html.haml b/app/views/admin/application_settings/_plantuml.html.haml
index 39de15dc38d..42914652655 100644
--- a/app/views/admin/application_settings/_plantuml.html.haml
+++ b/app/views/admin/application_settings/_plantuml.html.haml
@@ -9,14 +9,13 @@
= _('Render diagrams in your documents using PlantUML.')
= link_to _('Learn more.'), help_page_path('administration/integration/plantuml.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
- = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-plantuml-settings'), html: { class: 'fieldset-form', id: 'plantuml-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-plantuml-settings'), html: { class: 'fieldset-form', id: 'plantuml-settings' } do |f|
= form_errors(@application_setting) if expanded
%fieldset
.form-group
- .form-check
- = f.check_box :plantuml_enabled, class: 'form-check-input'
- = f.label :plantuml_enabled, _('Enable PlantUML'), class: 'form-check-label'
+ = f.gitlab_ui_checkbox_component :plantuml_enabled,
+ _('Enable PlantUML')
.form-group
= f.label :plantuml_url, _('PlantUML URL'), class: 'label-bold'
= f.text_field :plantuml_url, class: 'form-control gl-form-input', placeholder: 'http://your-plantuml-instance:8080'
diff --git a/app/views/admin/application_settings/_protected_paths.html.haml b/app/views/admin/application_settings/_protected_paths.html.haml
index d273c81f51d..1f3f67c71c7 100644
--- a/app/views/admin/application_settings/_protected_paths.html.haml
+++ b/app/views/admin/application_settings/_protected_paths.html.haml
@@ -1,14 +1,11 @@
-= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-protected-paths-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-protected-paths-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :throttle_protected_paths_enabled, class: 'form-check-input'
- = f.label :throttle_protected_paths_enabled, class: 'form-check-label' do
- = _('Enable rate limiting for POST requests to the specified paths')
- %span.form-text.text-muted
- = _('Helps reduce request volume for protected paths.')
+ = f.gitlab_ui_checkbox_component :throttle_protected_paths_enabled,
+ _('Enable rate limiting for POST requests to the specified paths'),
+ help_text: _('Helps reduce request volume for protected paths.')
.form-group
= f.label :throttle_protected_paths_requests_per_period, 'Maximum requests per period per user', class: 'label-bold'
= f.number_field :throttle_protected_paths_requests_per_period, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_registry.html.haml b/app/views/admin/application_settings/_registry.html.haml
index 364a7cf5a8e..eb1f94a2f04 100644
--- a/app/views/admin/application_settings/_registry.html.haml
+++ b/app/views/admin/application_settings/_registry.html.haml
@@ -1,4 +1,4 @@
-= form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
@@ -6,14 +6,13 @@
= f.label :container_registry_token_expire_delay, _('Authorization token duration (minutes)'), class: 'label-bold'
= f.number_field :container_registry_token_expire_delay, class: 'form-control gl-form-input'
.form-group
- .form-check
- = f.check_box :container_expiration_policies_enable_historic_entries, class: 'form-check-input'
- = f.label :container_expiration_policies_enable_historic_entries, class: 'form-check-label' do
- = _("Enable container expiration and retention policies for projects created earlier than GitLab 12.7.")
- = link_to sprite_icon('question-o'), help_page_path('user/packages/container_registry/reduce_container_registry_storage', anchor: 'cleanup-policy')
- .form-text.text-muted
- = _("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.")
- = link_to sprite_icon('question-o'), help_page_path('user/packages/container_registry/reduce_container_registry_storage', anchor: 'use-with-external-container-registries')
+ - label = _("Enable container expiration and retention policies for projects created earlier than GitLab 12.7.")
+ - label_link = link_to sprite_icon('question-o'), help_page_path('user/packages/container_registry/reduce_container_registry_storage', anchor: 'cleanup-policy')
+ - help_text = _("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.")
+ - help_link = link_to sprite_icon('question-o'), help_page_path('user/packages/container_registry/reduce_container_registry_storage', anchor: 'use-with-external-container-registries')
+ = f.gitlab_ui_checkbox_component :container_expiration_policies_enable_historic_entries,
+ '%{label} %{label_link}'.html_safe % { label: label, label_link: label_link },
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
- if container_registry_expiration_policies_throttling?
.form-group
= f.label :container_registry_delete_tags_service_timeout, _('Cleanup policy maximum processing time (seconds)'), class: 'label-bold'
@@ -31,12 +30,9 @@
.form-text.text-muted
= _("The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0.")
.form-group
- .form-check
- = f.check_box :container_registry_expiration_policies_caching, class: 'form-check-input'
- = f.label :container_registry_expiration_policies_caching, class: 'form-check-label' do
- = _("Enable container expiration caching.")
- .form-text.text-muted
- = _("When enabled, cleanup polices execute faster but put more load on Redis.")
- = link_to sprite_icon('question-o'), help_page_path('user/packages/container_registry/reduce_container_registry_storage', anchor: 'set-cleanup-limits-to-conserve-resources')
+ - help_text = _("When enabled, cleanup polices execute faster but put more load on Redis.")
+ - help_link = link_to sprite_icon('question-o'), help_page_path('user/packages/container_registry/reduce_container_registry_storage', anchor: 'set-cleanup-limits-to-conserve-resources')
+ = f.gitlab_ui_checkbox_component :container_registry_expiration_policies_caching, _("Enable container expiration caching."),
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_repository_check.html.haml b/app/views/admin/application_settings/_repository_check.html.haml
index ce81f81c125..c2087efa650 100644
--- a/app/views/admin/application_settings/_repository_check.html.haml
+++ b/app/views/admin/application_settings/_repository_check.html.haml
@@ -1,16 +1,13 @@
-= form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-repository-check-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-repository-check-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.sub-section
%h4= _("Repository checks")
.form-group
- .form-check
- = f.check_box :repository_checks_enabled, class: 'form-check-input'
- = f.label :repository_checks_enabled, class: 'form-check-label' do
- = _("Enable repository checks")
- .form-text.text-muted
- = html_escape(s_('Run %{code_start}git fsck%{code_end} periodically in all project and wiki repositories to look for silent disk corruption issues.')) % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe }
+ = f.gitlab_ui_checkbox_component :repository_checks_enabled,
+ _("Enable repository checks"),
+ help_text: html_escape(s_('Run %{code_start}git fsck%{code_end} periodically in all project and wiki repositories to look for silent disk corruption issues.')) % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe }
.form-group
.form-text.text-muted
= _("If you get a lot of false alarms from repository checks, you can clear all repository check information from the database.")
@@ -21,20 +18,11 @@
.sub-section
%h4= _("Housekeeping")
.form-group
- .form-check
- = f.check_box :housekeeping_enabled, class: 'form-check-input'
- = f.label :housekeeping_enabled, class: 'form-check-label' do
- = _("Enable automatic repository housekeeping")
- .form-text.text-muted
- = _("Leaving this setting enabled is recommended.")
- = link_to s_('Learn more.'), help_page_path('administration/housekeeping.md', anchor: 'housekeeping-options'), target: '_blank', rel: 'noopener noreferrer'
- .form-check
- = f.check_box :housekeeping_bitmaps_enabled, class: 'form-check-input'
- = f.label :housekeeping_bitmaps_enabled, class: 'form-check-label' do
- = _("Enable Git pack file bitmap creation")
- .form-text.text-muted
- = _("Improves Git cloning performance.")
- = link_to s_('Learn more.'), help_page_path('administration/housekeeping.md', anchor: 'housekeeping-options'), target: '_blank', rel: 'noopener noreferrer'
+ - help_text = _("Leaving this setting enabled is recommended.")
+ - help_link = link_to s_('Learn more.'), help_page_path('administration/housekeeping.md', anchor: 'housekeeping-options'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :housekeeping_enabled,
+ _("Enable automatic repository housekeeping"),
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
.form-group
= f.label :housekeeping_incremental_repack_period, 'Incremental repack period', class: 'label-bold'
= f.number_field :housekeeping_incremental_repack_period, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_repository_mirrors_form.html.haml b/app/views/admin/application_settings/_repository_mirrors_form.html.haml
index 0c9b04c02d1..dad8d5f3fae 100644
--- a/app/views/admin/application_settings/_repository_mirrors_form.html.haml
+++ b/app/views/admin/application_settings/_repository_mirrors_form.html.haml
@@ -1,15 +1,11 @@
-= form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-mirror-settings') do |f|
+= gitlab_ui_form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-mirror-settings') do |f|
= form_errors(@application_setting)
%fieldset
.form-group
= f.label :mirror_available, _('Repository mirroring configuration'), class: 'label-bold'
- .form-check
- = f.check_box :mirror_available, class: 'form-check-input'
- = f.label :mirror_available, class: 'form-check-label' do
- = _('Allow project maintainers to configure repository mirroring')
- %span.form-text.text-muted
- = _('If disabled, only administrators can configure repository mirroring.')
+ = f.gitlab_ui_checkbox_component :mirror_available, _('Allow project maintainers to configure repository mirroring'),
+ help_text: _('If disabled, only administrators can configure repository mirroring.')
= render_if_exists 'admin/application_settings/mirror_settings', form: f
diff --git a/app/views/admin/application_settings/_sentry.html.haml b/app/views/admin/application_settings/_sentry.html.haml
index 5fd373d59e9..cfd34f6ca15 100644
--- a/app/views/admin/application_settings/_sentry.html.haml
+++ b/app/views/admin/application_settings/_sentry.html.haml
@@ -1,4 +1,4 @@
-= form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-sentry-settings'), html: { class: 'fieldset-form', id: 'sentry-settings' } do |f|
+= gitlab_ui_form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-sentry-settings'), html: { class: 'fieldset-form', id: 'sentry-settings' } do |f|
= form_errors(@application_setting)
%span.text-muted
@@ -6,9 +6,7 @@
%fieldset
.form-group
- .form-check
- = f.check_box :sentry_enabled, class: 'form-check-input'
- = f.label :sentry_enabled, _('Enable Sentry error tracking'), class: 'form-check-label'
+ = f.gitlab_ui_checkbox_component :sentry_enabled, _('Enable Sentry error tracking')
.form-group
= f.label :sentry_dsn, _('DSN'), class: 'label-light'
= f.text_field :sentry_dsn, class: 'form-control gl-form-input', placeholder: 'https://public@sentry.example.com/1'
diff --git a/app/views/admin/application_settings/_signup.html.haml b/app/views/admin/application_settings/_signup.html.haml
index a658ba63939..85cf43ba5c2 100644
--- a/app/views/admin/application_settings/_signup.html.haml
+++ b/app/views/admin/application_settings/_signup.html.haml
@@ -16,6 +16,6 @@
domain_denylist_raw: @application_setting.domain_denylist_raw,
email_restrictions_enabled: @application_setting[:email_restrictions_enabled].to_s,
supported_syntax_link_url: 'https://github.com/google/re2/wiki/Syntax',
- email_restrictions: @application_setting.email_restrictions,
- after_sign_up_text: @application_setting[:after_sign_up_text],
+ email_restrictions: @application_setting.email_restrictions.to_s,
+ after_sign_up_text: @application_setting[:after_sign_up_text].to_s,
pending_user_count: pending_user_count } }
diff --git a/app/views/admin/application_settings/_snowplow.html.haml b/app/views/admin/application_settings/_snowplow.html.haml
index f7a6a26c645..378c1712ae0 100644
--- a/app/views/admin/application_settings/_snowplow.html.haml
+++ b/app/views/admin/application_settings/_snowplow.html.haml
@@ -9,14 +9,12 @@
- 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', 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|
+ = gitlab_ui_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
%fieldset
.form-group
- .form-check
- = f.check_box :snowplow_enabled, class: 'form-check-input', data: { qa_selector: 'snowplow_enabled_checkbox' }
- = f.label :snowplow_enabled, _('Enable Snowplow tracking'), class: 'form-check-label'
+ = f.gitlab_ui_checkbox_component :snowplow_enabled, _('Enable Snowplow tracking'), checkbox_options: { data: { qa_selector: 'snowplow_enabled_checkbox' } }
.form-group
= f.label :snowplow_collector_hostname, _('Collector hostname'), class: 'label-light'
= f.text_field :snowplow_collector_hostname, class: 'form-control gl-form-input', placeholder: 'snowplow.example.com'
diff --git a/app/views/admin/application_settings/_sourcegraph.html.haml b/app/views/admin/application_settings/_sourcegraph.html.haml
index 65b2a95bcc1..391f79e431b 100644
--- a/app/views/admin/application_settings/_sourcegraph.html.haml
+++ b/app/views/admin/application_settings/_sourcegraph.html.haml
@@ -16,20 +16,14 @@
.settings-content
- = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-sourcegraph-settings'), html: { class: 'fieldset-form', id: 'sourcegraph-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-sourcegraph-settings'), html: { class: 'fieldset-form', id: 'sourcegraph-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :sourcegraph_enabled, class: 'form-check-input'
- = f.label :sourcegraph_enabled, s_('SourcegraphAdmin|Enable Sourcegraph'), class: 'form-check-label'
+ = f.gitlab_ui_checkbox_component :sourcegraph_enabled, s_('SourcegraphAdmin|Enable Sourcegraph')
.form-group
- .form-check
- = f.check_box :sourcegraph_public_only, class: 'form-check-input'
- = f.label :sourcegraph_public_only, s_('SourcegraphAdmin|Block on private and internal projects'), class: 'form-check-label'
- .form-text.text-muted
- = s_('SourcegraphAdmin|Only public projects have code intelligence enabled and communicate with Sourcegraph.')
+ = f.gitlab_ui_checkbox_component :sourcegraph_public_only, s_('SourcegraphAdmin|Block on private and internal projects'), help_text: s_('SourcegraphAdmin|Only public projects have code intelligence enabled and communicate with Sourcegraph.')
.form-group
= f.label :sourcegraph_url, s_('SourcegraphAdmin|Sourcegraph URL'), class: 'label-bold'
= f.text_field :sourcegraph_url, class: 'form-control gl-form-input', placeholder: s_('SourcegraphAdmin|https://sourcegraph.example.com')
diff --git a/app/views/admin/application_settings/_spam.html.haml b/app/views/admin/application_settings/_spam.html.haml
index 27113fddb27..bb512940be2 100644
--- a/app/views/admin/application_settings/_spam.html.haml
+++ b/app/views/admin/application_settings/_spam.html.haml
@@ -1,4 +1,4 @@
-= form_for @application_setting, url: reporting_admin_application_settings_path(anchor: 'js-spam-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: reporting_admin_application_settings_path(anchor: 'js-spam-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
@@ -8,20 +8,13 @@
= _('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'
- = f.label :recaptcha_enabled, class: 'form-check-label' do
- = _("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'
+ - spam_help_link_url = help_page_path('integration/recaptcha.md')
+ - spam_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: spam_help_link_url }
+ = f.gitlab_ui_checkbox_component :recaptcha_enabled, _("Enable reCAPTCHA"),
+ help_text: _('Helps prevent bots from creating accounts. %{link_start}How do I configure it?%{link_end}').html_safe % { link_start: spam_help_link_start, link_end: '</a>'.html_safe }
.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.')
- %span.form-text.text-muted#recaptcha_help_block
- = _('Helps prevent bots from brute-force attacks.')
+ = f.gitlab_ui_checkbox_component :login_recaptcha_protection_enabled, _('Enable reCAPTCHA for login.'),
+ help_text: _('Helps prevent bots from brute-force attacks.')
.form-group
= f.label :recaptcha_site_key, _('reCAPTCHA site key'), class: 'label-bold'
= f.text_field :recaptcha_site_key, class: 'form-control gl-form-input'
@@ -40,12 +33,8 @@
= 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'
- = f.label :invisible_captcha_enabled, class: 'form-check-label' do
- = _('Enable Invisible Captcha during sign up')
- %span.form-text.text-muted
- = _('Helps prevent bots from creating accounts.')
+ = f.gitlab_ui_checkbox_component :invisible_captcha_enabled, _('Enable Invisible Captcha during sign up'),
+ help_text: _('Helps prevent bots from creating accounts.')
%h5
= _('Akismet')
@@ -54,11 +43,8 @@
= 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.")
+ = f.gitlab_ui_checkbox_component :akismet_enabled, _('Enable Akismet'),
+ help_text: _("Helps prevent bots from creating issues.")
.form-group
= f.label :akismet_api_key, _('Akismet API Key'), class: 'label-bold'
@@ -71,12 +57,8 @@
= _('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 IP addresses")
- %span.form-text.text-muted#unique_ip_help_block
- = _("Helps prevent malicious users hide their activity.")
+ = f.gitlab_ui_checkbox_component :unique_ips_limit_enabled, _("Limit sign in from multiple IP addresses"),
+ help_text: _("Helps prevent malicious users hide their activity.")
.form-group
= f.label :unique_ips_limit_per_user, _('IP addresses per user'), class: 'label-bold'
@@ -94,10 +76,8 @@
= _('Spam Check')
.form-group
- .form-check
- = f.check_box :spam_check_endpoint_enabled, class: 'form-check-input'
- = f.label :spam_check_endpoint_enabled, _('Enable Spam Check via external API endpoint'), class: 'form-check-label'
- .form-text.text-muted= _('Define custom rules for what constitutes spam, independent of Akismet')
+ = f.gitlab_ui_checkbox_component :spam_check_endpoint_enabled, _('Enable Spam Check via external API endpoint'),
+ help_text: _('Define custom rules for what constitutes spam, independent of Akismet')
.form-group
= 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'
diff --git a/app/views/admin/application_settings/_terms.html.haml b/app/views/admin/application_settings/_terms.html.haml
index fdf79004c45..a4b6e061c43 100644
--- a/app/views/admin/application_settings/_terms.html.haml
+++ b/app/views/admin/application_settings/_terms.html.haml
@@ -1,13 +1,9 @@
-= form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-terms-settings'), html: { class: 'fieldset-form', id: 'terms-settings' } do |f|
+= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-terms-settings'), html: { class: 'fieldset-form', id: 'terms-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :enforce_terms, class: 'form-check-input'
- = f.label :enforce_terms, class: 'form-check-label' do
- = _("All users must accept the Terms of Service and Privacy Policy to access GitLab")
- .form-text.text-muted
+ = f.gitlab_ui_checkbox_component :enforce_terms, _("All users must accept the Terms of Service and Privacy Policy to access GitLab")
.form-group
= f.label :terms do
= _("Terms of Service Agreement and Privacy Policy")
diff --git a/app/views/admin/application_settings/_third_party_offers.html.haml b/app/views/admin/application_settings/_third_party_offers.html.haml
index 231c45ec46c..a62e730ee89 100644
--- a/app/views/admin/application_settings/_third_party_offers.html.haml
+++ b/app/views/admin/application_settings/_third_party_offers.html.haml
@@ -8,13 +8,12 @@
%p
= _('Control whether to display customer experience improvement content and third-party offers in GitLab.')
.settings-content
- = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-third-party-offers-settings'), html: { class: 'fieldset-form', id: 'third-party-offers-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-third-party-offers-settings'), html: { class: 'fieldset-form', id: 'third-party-offers-settings' } do |f|
= form_errors(@application_setting) if expanded
%fieldset
.form-group
- .form-check
- = f.check_box :hide_third_party_offers, class: 'form-check-input'
- = f.label :hide_third_party_offers, _('Do not display content for customer experience improvement and offers from third parties'), class: 'form-check-label'
+ = f.gitlab_ui_checkbox_component :hide_third_party_offers,
+ _('Do not display content for customer experience improvement and offers from third parties')
= 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 02031880fab..a1285a3f467 100644
--- a/app/views/admin/application_settings/_usage.html.haml
+++ b/app/views/admin/application_settings/_usage.html.haml
@@ -1,68 +1,53 @@
- payload_class = 'js-service-ping-payload'
+- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe
+- link_end = '</a>'.html_safe
-= form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
- .form-group.mb-2
- .form-check
- = f.check_box :version_check_enabled, class: 'form-check-input'
- = f.label :version_check_enabled, class: 'form-check-label' do
- = _("Enable version check")
- .form-text.text-muted
- = _("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
+ - help_link_start = link_start % { url: help_page_path('user/admin_area/settings/usage_statistics', anchor: 'version-check') }
+ = f.gitlab_ui_checkbox_component :version_check_enabled, _('Enable version check'),
+ help_text: _("GitLab informs you if a new version is available. %{link_start}What information does GitLab Inc. collect?%{link_end}").html_safe % { link_start: help_link_start, link_end: link_end }
.form-group
- can_be_configured = @application_setting.usage_ping_can_be_configured?
- .form-check
- = f.check_box :usage_ping_enabled, disabled: !can_be_configured, class: 'form-check-input', data: { qa_selector: 'enable_usage_data_checkbox' }
- = f.label :usage_ping_enabled, class: 'form-check-label' do
- = _('Enable Service Ping')
- .form-text.text-muted
- - if can_be_configured
- %p.mb-2= _('To help improve GitLab and its user experience, GitLab periodically collects usage information.')
-
- - 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}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_loading_icon(css_class: 'js-spinner gl-display-none gl-mr-2')
- .js-text.gl-display-inline= _('Preview payload')
- %pre.service-data-payload-container.js-syntax-highlight.code.highlight.gl-mt-2.gl-display-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } }
- - else
- = _('Service ping is disabled in your configuration file, and cannot be enabled through this form.')
- - deactivating_service_ping_path = help_page_path('development/service_ping/index.md', anchor: 'disable-service-ping-using-the-configuration-file')
- - deactivating_service_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: deactivating_service_ping_path }
- = s_('For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}.').html_safe % { deactivating_service_ping_link_start: deactivating_service_ping_link_start, deactivating_service_ping_link_end: '</a>'.html_safe }
+ - service_ping_link_start = link_start % { url: help_page_path('development/service_ping/index') }
+ - deactivating_service_ping_link_start = link_start % { url: help_page_path('development/service_ping/index', anchor: 'disable-service-ping-using-the-configuration-file') }
+ - usage_ping_help_text = s_('AdminSettings|To help improve GitLab and its user experience, GitLab periodically collects usage information. %{link_start}What information is shared with GitLab Inc.?%{link_end}').html_safe % { link_start: service_ping_link_start, link_end: link_end }
+ - disabled_help_text = s_('AdminSettings|Service ping is disabled in your configuration file, and cannot be enabled through this form. For more information, see the documentation on %{link_start}deactivating service ping%{link_end}.').html_safe % { link_start: deactivating_service_ping_link_start, link_end: link_end }
+ = f.gitlab_ui_checkbox_component :usage_ping_enabled, s_('AdminSettings|Enable Service Ping'),
+ help_text: can_be_configured ? usage_ping_help_text : disabled_help_text,
+ checkbox_options: { disabled: !can_be_configured, data: { qa_selector: 'enable_usage_data_checkbox' } }
+ .form-text.gl-pl-6
+ - if can_be_configured
+ %button.gl-button.btn.btn-default.js-payload-preview-trigger{ type: 'button', data: { payload_selector: ".#{payload_class}" } }
+ = gl_loading_icon(css_class: 'js-spinner gl-display-none gl-mr-2')
+ .js-text.gl-display-inline= s_('AdminSettings|Preview payload')
+ %pre.service-data-payload-container.js-syntax-highlight.code.highlight.gl-mt-2.gl-display-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } }
.form-group
- usage_ping_enabled = @application_setting.usage_ping_enabled?
- .form-check
- = f.check_box :usage_ping_features_enabled?, disabled: !usage_ping_enabled, class: 'form-check-input'
- = f.label :usage_ping_features_enabled?, class: 'form-check-label gl-cursor-not-allowed', id: 'service_ping_features_label' do
- = _('Enable Registration Features')
- = link_to sprite_icon('question-o'), help_page_path('development/service_ping/index.md', anchor: 'registration-features-program')
- .form-text.text-muted
- - 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, 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 }
+ - label = s_('AdminSettings|Enable Registration Features')
+ - label_link = link_to sprite_icon('question-o'), help_page_path('development/service_ping/index', anchor: 'registration-features-program')
+ - help_text = usage_ping_enabled ? s_('AdminSettings|You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service.') : s_('AdminSettings|To enable Registration Features, first enable Service Ping.')
+ = f.gitlab_ui_checkbox_component :usage_ping_features_enabled?, '%{label} %{label_link}'.html_safe % { label: label, label_link: label_link },
+ help_text: '<span id="service_ping_features_helper_text">%{help_text}</span>'.html_safe % { help_text: help_text },
+ checkbox_options: { id: 'application_setting_usage_ping_features_enabled' },
+ label_options: { id: 'service_ping_features_label' }
+ .form-text.gl-text-gray-500.gl-pl-6
+ %p.gl-mb-3= s_('AdminSettings|Registration Features include:')
+ - email_from_gitlab_path = help_page_path('user/admin_area/email_from_gitlab')
+ - repo_size_limit_path = help_page_path('user/admin_area/settings/account_and_limit_settings', anchor: 'repository-size-limit')
+ - restrict_ip_path = help_page_path('user/group/index', anchor: 'restrict-group-access-by-ip-address')
+ - email_from_gitlab_link = link_start % { url: email_from_gitlab_path }
+ - repo_size_limit_link = link_start % { url: repo_size_limit_path }
+ - restrict_ip_link = link_start % { url: restrict_ip_path }
+ %ul
+ %li
+ = s_('AdminSettings|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
+ = s_('AdminSettings|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
+ = s_('AdminSettings|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/_users_api_limits.html.haml b/app/views/admin/application_settings/_users_api_limits.html.haml
index e9b657f8942..9b3502b3cfd 100644
--- a/app/views/admin/application_settings/_users_api_limits.html.haml
+++ b/app/views/admin/application_settings/_users_api_limits.html.haml
@@ -7,8 +7,8 @@
= f.number_field :users_get_by_id_limit, class: 'form-control gl-form-input'
.form-group
= f.label :users_get_by_id_limit_allowlist_raw, _('Users to exclude from the rate limit'), class: 'label-bold'
- = f.text_area :users_get_by_id_limit_allowlist_raw, placeholder: 'username1, username2', class: 'form-control gl-form-input', rows: 5
- .form-text.text-muted
+ = f.text_area :users_get_by_id_limit_allowlist_raw, class: 'form-control gl-form-input', rows: 5, aria: { describedBy: 'users-api-limit-users-allowlist-field-description' }
+ .form-text.text-muted{ id: 'users-api-limit-users-allowlist-field-description' }
= _('List of users allowed to exceed the rate limit.')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_visibility_and_access.html.haml b/app/views/admin/application_settings/_visibility_and_access.html.haml
index b0810d3d48a..23649bc2d54 100644
--- a/app/views/admin/application_settings/_visibility_and_access.html.haml
+++ b/app/views/admin/application_settings/_visibility_and_access.html.haml
@@ -17,18 +17,16 @@
= render('shared/visibility_radios', model_method: :default_group_visibility, form: f, selected_level: @application_setting.default_group_visibility, form_model: Group.new)
.form-group
= f.label :restricted_visibility_levels, class: 'label-bold'
- - checkbox_name = 'application_setting[restricted_visibility_levels][]'
- = hidden_field_tag(checkbox_name)
- - restricted_level_checkboxes('restricted-visibility-help', checkbox_name, class: 'form-check-input').each do |level|
- .form-check
- = level
+ = hidden_field_tag 'application_setting[restricted_visibility_levels][]'
+ - restricted_level_checkboxes(f).each do |level|
+ = level
%span.form-text.text-muted#restricted-visibility-help
= _('Selected levels cannot be used by non-admin users for groups, projects or snippets. If the public level is restricted, user profiles are only visible to logged in users.')
.form-group
= f.label :import_sources, class: 'label-bold'
= hidden_field_tag 'application_setting[import_sources][]'
- - import_sources_checkboxes('import-sources-help', class: 'form-check-input').each do |source|
- .form-check= source
+ - import_sources_checkboxes(f).each do |source|
+ = source
%span.form-text.text-muted#import-sources-help
= _('Enabled sources for code import during project creation. OmniAuth must be configured for GitHub')
= link_to sprite_icon('question-o'), help_page_path("integration/github")
@@ -40,10 +38,7 @@
= render_if_exists 'admin/application_settings/ldap_access_setting', form: f
.form-group
- .form-check
- = f.check_box :project_export_enabled, class: 'form-check-input'
- = f.label :project_export_enabled, class: 'form-check-label' do
- = _('Project export enabled')
+ = f.gitlab_ui_checkbox_component :project_export_enabled, s_('AdminSettings|Project export enabled')
.form-group
%label.label-bold= _('Enabled Git access protocols')
@@ -57,7 +52,7 @@
%span.form-text.text-muted#custom_http_clone_url_root_help_block
= _('Replaces the clone URL root.')
- - ApplicationSetting::SUPPORTED_KEY_TYPES.each do |type|
+ - Gitlab::SSHPublicKey.supported_types.each do |type|
- field_name = :"#{type}_key_restriction"
.form-group
= f.label field_name, "#{type.upcase} SSH keys", class: 'label-bold'
@@ -65,9 +60,6 @@
.form-group
%label.label-bold= s_('AdminSettings|Feed token')
- .form-check
- = f.check_box :disable_feed_token, class: 'form-check-input'
- = f.label :disable_feed_token, class: 'form-check-label' do
- = s_('AdminSettings|Disable feed token')
+ = f.gitlab_ui_checkbox_component :disable_feed_token, s_('AdminSettings|Disable feed token')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/appearances/_form.html.haml b/app/views/admin/application_settings/appearances/_form.html.haml
index 84c26da8772..5816bd42a83 100644
--- a/app/views/admin/application_settings/appearances/_form.html.haml
+++ b/app/views/admin/application_settings/appearances/_form.html.haml
@@ -1,6 +1,6 @@
- parsed_with_gfm = (_("Content parsed with %{link}.") % { link: link_to('GitLab Flavored Markdown', help_page_path('user/markdown'), target: '_blank') }).html_safe
-= form_for @appearance, url: admin_application_settings_appearances_path, html: { class: 'gl-mt-3' } do |f|
+= gitlab_ui_form_for @appearance, url: admin_application_settings_appearances_path, html: { class: 'gl-mt-3' } do |f|
= form_errors(@appearance)
@@ -21,7 +21,7 @@
= f.hidden_field :header_logo_cache
= f.file_field :header_logo, class: "", accept: 'image/*'
.form-text.text-muted
- = _('Maximum file size is 1MB. Pages are optimized for a 28px tall header logo')
+ = _('Maximum file size is 1MB. Pages are optimized for a 24px tall header logo')
%hr
.row
.col-lg-4.profile-settings-sidebar
diff --git a/app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml b/app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml
index 1ce79e61ac6..415606c055d 100644
--- a/app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml
+++ b/app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml
@@ -14,13 +14,10 @@
= form.label :footer_message, _('Footer message'), class: 'col-form-label label-bold'
= form.text_area :footer_message, placeholder: _('State your message to activate'), class: "form-control gl-form-input js-autosize"
.form-group
- .form-check
- = form.check_box :email_header_and_footer_enabled, class: 'form-check-input'
- = form.label :email_header_and_footer_enabled, class: 'label-bold' do
- = _('Enable header and footer in emails')
-
- .form-text.text-muted
- = _('Add header and footer to emails. Please note that color settings will only be applied within the application interface')
+ = form.gitlab_ui_checkbox_component :email_header_and_footer_enabled,
+ _('Enable header and footer in emails'),
+ help_text: _('Add header and footer to emails. Please note that color settings will only be applied within the application interface'),
+ label_options: { class: 'gl-font-weight-bold!' }
.form-group.js-toggle-colors-container
%button.btn.gl-button.btn-link.js-toggle-colors-link{ type: 'button' }
diff --git a/app/views/admin/application_settings/ci_cd.html.haml b/app/views/admin/application_settings/ci_cd.html.haml
index 762dba69e6a..aab4f44d4d7 100644
--- a/app/views/admin/application_settings/ci_cd.html.haml
+++ b/app/views/admin/application_settings/ci_cd.html.haml
@@ -20,8 +20,7 @@
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
= _('Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts.')
- .settings-content
- = render 'ci_cd'
+ = render 'ci_cd'
= render_if_exists 'admin/application_settings/required_instance_ci_setting', expanded: expanded_by_default?
diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml
index 9eef4bc2a37..bc2fedec69c 100644
--- a/app/views/admin/application_settings/general.html.haml
+++ b/app/views/admin/application_settings/general.html.haml
@@ -93,18 +93,15 @@
%p
= _('Manage Web IDE features.')
.settings-content
- = form_for @application_setting, url: general_admin_application_settings_path(anchor: "#js-web-ide-settings"), html: { class: 'fieldset-form', id: 'web-ide-settings' } do |f|
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: "#js-web-ide-settings"), html: { class: 'fieldset-form', id: 'web-ide-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :web_ide_clientside_preview_enabled, class: 'form-check-input'
- = f.label :web_ide_clientside_preview_enabled, class: 'form-check-label' do
- = s_('IDE|Live Preview')
- %span.form-text.text-muted
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('user/project/web_ide/index', anchor: 'enable-live-preview') }
- = s_('Preview JavaScript projects in the Web IDE with CodeSandbox Live Preview. %{link_start}Learn more.%{link_end} ').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
+ - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('user/project/web_ide/index', anchor: 'enable-live-preview') }
+ = f.gitlab_ui_checkbox_component :web_ide_clientside_preview_enabled,
+ s_('IDE|Live Preview'),
+ help_text: s_('Preview JavaScript projects in the Web IDE with CodeSandbox Live Preview. %{link_start}Learn more.%{link_end} ').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
= render_if_exists 'admin/application_settings/maintenance_mode_settings_form'
diff --git a/app/views/admin/application_settings/repository.html.haml b/app/views/admin/application_settings/repository.html.haml
index c3a39ddf86d..ce7972827d3 100644
--- a/app/views/admin/application_settings/repository.html.haml
+++ b/app/views/admin/application_settings/repository.html.haml
@@ -21,7 +21,7 @@
= expanded_by_default? ? 'Collapse' : 'Expand'
%p
= _('Configure repository mirroring.')
- = link_to s_('Learn more.'), help_page_path('user/project/repository/repository_mirroring.md'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to s_('Learn more.'), help_page_path('user/project/repository/mirror/index.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render partial: 'repository_mirrors_form'
diff --git a/app/views/admin/application_settings/service_usage_data.html.haml b/app/views/admin/application_settings/service_usage_data.html.haml
index d9825183d88..ec084c05cf7 100644
--- a/app/views/admin/application_settings/service_usage_data.html.haml
+++ b/app/views/admin/application_settings/service_usage_data.html.haml
@@ -7,10 +7,23 @@
%h3= name
-%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
- .js-text.gl-display-inline= _('Preview payload')
-%button.gl-button.btn.btn-default.js-payload-download-trigger{ type: 'button', data: { endpoint: usage_data_admin_application_settings_path(format: :json) } }
- .gl-spinner.js-spinner.gl-display-none.gl-mr-2
- .js-text.d-inline= _('Download payload')
-%pre.js-syntax-highlight.code.highlight.gl-mt-2.gl-display-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } }
+- if @service_ping_data_present
+ %button.gl-button.btn.btn-default.js-payload-preview-trigger{ type: 'button', data: { payload_selector: ".#{payload_class}" } }
+ = gl_loading_icon(css_class: 'js-spinner gl-display-none gl-mr-2')
+ .js-text.gl-display-inline= _('Preview payload')
+ %button.gl-button.btn.btn-default.js-payload-download-trigger{ type: 'button', data: { endpoint: usage_data_admin_application_settings_path(format: :json) } }
+ = gl_loading_icon(css_class: 'js-spinner gl-display-none gl-mr-2')
+ .js-text.d-inline= _('Download payload')
+ %pre.js-syntax-highlight.code.highlight.gl-mt-2.gl-display-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } }
+- else
+ = render Pajamas::AlertComponent.new(variant: :warning,
+ dismissible: false,
+ title: _('Service Ping payload not found in the application cache')) do
+
+ .gl-alert-body
+ - enable_service_ping_link_url = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'enable-or-disable-usage-statistics')
+ - enable_service_ping_link = '<a href="%{url}">'.html_safe % { url: enable_service_ping_link_url }
+ - generate_manually_link_url = help_page_path('administration/troubleshooting/gitlab_rails_cheat_sheet', anchor: 'generate-service-ping')
+ - generate_manually_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: generate_manually_link_url }
+
+ = html_escape(s_('%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually_link_start}generate%{link_end} Service Ping to preview and download service usage data payload.')) % { enable_service_ping_link_start: enable_service_ping_link, generate_manually_link_start: generate_manually_link, link_end: '</a>'.html_safe }
diff --git a/app/views/admin/applications/_delete_form.html.haml b/app/views/admin/applications/_delete_form.html.haml
index 16ec8014c5e..f9fd5864176 100644
--- a/app/views/admin/applications/_delete_form.html.haml
+++ b/app/views/admin/applications/_delete_form.html.haml
@@ -1,5 +1,4 @@
+- submit_btn_css ||= 'gl-button btn btn-danger btn-danger-secondary btn-sm js-application-delete-button'
-- submit_btn_css ||= 'gl-button btn btn-danger btn-sm js-application-delete-button'
%button{ class: submit_btn_css, data: { path: admin_application_path(application), name: application.name } }
= _('Destroy')
-
diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml
index a1990ad5750..925b3681298 100644
--- a/app/views/admin/applications/_form.html.haml
+++ b/app/views/admin/applications/_form.html.haml
@@ -1,4 +1,4 @@
-= form_for [:admin, @application], url: @url, html: {role: 'form'} do |f|
+= gitlab_ui_form_for [:admin, @application], url: @url, html: {role: 'form'} do |f|
= form_errors(application)
= content_tag :div, class: 'form-group row' do
@@ -45,7 +45,7 @@
.col-sm-2.col-form-label.pt-0
= f.label :scopes
.col-sm-10
- = render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: application, scopes: @scopes
+ = render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: application, scopes: @scopes, f: f
.form-actions
= f.submit _('Save application'), class: "gl-button btn btn-confirm wide"
diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml
index 86a4ab00ba3..890155ee604 100644
--- a/app/views/admin/applications/index.html.haml
+++ b/app/views/admin/applications/index.html.haml
@@ -1,36 +1,51 @@
-- page_title _("Applications")
+- page_title s_('AdminArea|Instance OAuth applications')
+
%h3.page-title
- = _('System OAuth applications')
+ = s_('AdminArea|Instance OAuth applications')
%p.light
- = _('System OAuth applications don\'t belong to any user and can only be managed by admins')
-%hr
-%p= link_to _('New application'), new_admin_application_path, class: 'gl-button btn btn-confirm'
-.table-responsive
- %table.table
- %thead
- %tr
- %th
- = _('Name')
- %th
- = _('Callback URL')
- %th
- = _('Clients')
- %th
- = _('Trusted')
- %th
- = _('Confidential')
- %th
- %th
- %tbody.oauth-applications
- - @applications.each do |application|
- %tr{ :id => "application_#{application.id}" }
- %td= link_to application.name, admin_application_path(application)
- %td= application.redirect_uri
- %td= @application_counts[application.id].to_i
- %td= application.trusted? ? _('Yes'): _('No')
- %td= application.confidential? ? _('Yes'): _('No')
- %td= link_to 'Edit', edit_admin_application_path(application), class: 'gl-button btn btn-link'
- %td= render 'delete_form', application: application
+ - docs_link_path = help_page_path('integration/oauth_provider')
+ - docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer nofollow">'.html_safe % { url: docs_link_path }
+ = s_('AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
+
+- if @applications.empty?
+ %section.empty-state.gl-text-center.gl-display-flex.gl-flex-direction-column
+ .svg-content.svg-150
+ = image_tag 'illustrations/empty-state/empty-admin-apps.svg', class: 'gl-max-w-full'
+
+ .gl-max-w-full.gl-m-auto
+ %h1.h4.gl-font-size-h-display= s_('AdminArea|No applications found')
+ = link_to _('New application'), new_admin_application_path, class: 'btn gl-button btn-confirm'
+
+- else
+ %hr
+ %p= link_to _('New application'), new_admin_application_path, class: 'gl-button btn btn-confirm'
+
+ .table-responsive
+ %table.b-table.gl-table.gl-w-full{ role: 'table' }
+ %thead
+ %tr
+ %th
+ = _('Name')
+ %th
+ = _('Callback URL')
+ %th
+ = _('Clients')
+ %th
+ = _('Trusted')
+ %th
+ = _('Confidential')
+ %th
+ %th
+ %tbody.oauth-applications
+ - @applications.each do |application|
+ %tr{ id: "application_#{application.id}" }
+ %td= link_to application.name, admin_application_path(application)
+ %td= application.redirect_uri
+ %td= @application_counts[application.id].to_i
+ %td= application.trusted? ? _('Yes'): _('No')
+ %td= application.confidential? ? _('Yes'): _('No')
+ %td= link_to 'Edit', edit_admin_application_path(application), class: 'gl-button btn btn-link'
+ %td= render 'delete_form', application: application
= paginate @applications, theme: 'gitlab'
diff --git a/app/views/admin/background_migrations/_migration.html.haml b/app/views/admin/background_migrations/_migration.html.haml
index b6077bc54d6..9cef8332259 100644
--- a/app/views/admin/background_migrations/_migration.html.haml
+++ b/app/views/admin/background_migrations/_migration.html.haml
@@ -7,7 +7,7 @@
- else
= _('Unknown')
%td{ role: 'cell', data: { label: _('Status') } }
- = gl_badge_tag migration.status.humanize, { size: :sm, variant: batched_migration_status_badge_variant(migration) }
+ = gl_badge_tag migration.status_name.to_s.humanize, { size: :sm, variant: batched_migration_status_badge_variant(migration) }
%td{ role: 'cell', data: { label: _('Action') } }
- if migration.active?
= button_to pause_admin_background_migration_path(migration),
diff --git a/app/views/admin/broadcast_messages/_form.html.haml b/app/views/admin/broadcast_messages/_form.html.haml
index 3e698f0508c..4102918931f 100644
--- a/app/views/admin/broadcast_messages/_form.html.haml
+++ b/app/views/admin/broadcast_messages/_form.html.haml
@@ -1,20 +1,5 @@
-.broadcast-message.broadcast-banner-message.gl-alert-warning.js-broadcast-banner-message-preview.gl-mt-3{ style: broadcast_message_style(@broadcast_message), class: ('gl-display-none' unless @broadcast_message.banner? ) }
- .gl-alert-container
- = sprite_icon('bullhorn', css_class: 'vertical-align-text-top')
- .js-broadcast-message-preview
- .gl-alert-content
- - if @broadcast_message.message.present?
- = render_broadcast_message(@broadcast_message)
- - else
- = _('Your message here')
-.d-flex.justify-content-center
- .broadcast-message.broadcast-notification-message.preview.js-broadcast-notification-message-preview.mt-2{ class: ('hidden' unless @broadcast_message.notification? ) }
- = sprite_icon('bullhorn', css_class: 'vertical-align-text-top')
- .js-broadcast-message-preview
- - if @broadcast_message.message.present?
- = render_broadcast_message(@broadcast_message)
- - else
- = _('Your message here')
+#broadcast-message-preview
+ = render 'preview'
= gitlab_ui_form_for [:admin, @broadcast_message], html: { class: 'broadcast-message-form js-quick-submit js-requires-input'} do |f|
= form_errors(@broadcast_message)
@@ -34,19 +19,10 @@
= f.select :broadcast_type, broadcast_type_options, {}, class: 'form-control js-broadcast-message-type'
.form-group.row.js-broadcast-message-background-color-form-group{ class: ('hidden' unless @broadcast_message.banner? ) }
.col-sm-2.col-form-label
- = f.label :color, _("Background color")
+ = f.label :theme, _("Theme")
.col-sm-10
.input-group
- .input-group-prepend
- .input-group-text.label-color-preview{ :style => 'background-color: ' + @broadcast_message.color + '; color: ' + @broadcast_message.font }
- = '&nbsp;'.html_safe
- = f.text_field :color, class: "form-control gl-form-input js-broadcast-message-color"
- .form-text.text-muted
- = _('Choose any color.')
- %br
- = _("Or you can choose one of the suggested colors below")
-
- = render_suggested_colors
+ = f.select :theme, broadcast_theme_options, {}, class: 'form-control js-broadcast-message-theme'
.form-group.row.js-broadcast-message-dismissable-form-group{ class: ('hidden' unless @broadcast_message.banner? ) }
.col-sm-2.col-form-label.pt-0
diff --git a/app/views/admin/broadcast_messages/_preview.html.haml b/app/views/admin/broadcast_messages/_preview.html.haml
new file mode 100644
index 00000000000..56168926a6e
--- /dev/null
+++ b/app/views/admin/broadcast_messages/_preview.html.haml
@@ -0,0 +1,3 @@
+.js-broadcast-banner-message-preview
+ = render "shared/broadcast_message", { message: @broadcast_message, preview: true } do
+ = _('Your message here')
diff --git a/app/views/admin/dashboard/_security_newsletter_callout.html.haml b/app/views/admin/dashboard/_security_newsletter_callout.html.haml
index aced997bada..9b994b757f9 100644
--- a/app/views/admin/dashboard/_security_newsletter_callout.html.haml
+++ b/app/views/admin/dashboard/_security_newsletter_callout.html.haml
@@ -1,11 +1,12 @@
- 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',
- alert_data: { feature_id: Users::CalloutsHelper::SECURITY_NEWSLETTER_CALLOUT, dismiss_endpoint: callouts_path, defer_links: 'true' },
- close_button_data: { testid: 'close-security-newsletter-callout' } do
+= render Pajamas::AlertComponent.new(variant: :tip,
+ title: s_('AdminArea|Get security updates from GitLab and stay up to date'),
+ alert_class: 'js-security-newsletter-callout',
+ alert_data: { feature_id: Users::CalloutsHelper::SECURITY_NEWSLETTER_CALLOUT,
+ dismiss_endpoint: callouts_path,
+ defer_links: 'true' },
+ close_button_data: { testid: 'close-security-newsletter-callout' }) do
.gl-alert-body
= s_('AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates.')
.gl-alert-actions
diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml
index 0c3ce1f3fa4..8ac6f63cdfb 100644
--- a/app/views/admin/groups/_form.html.haml
+++ b/app/views/admin/groups/_form.html.haml
@@ -18,7 +18,7 @@
.form-group.row
.offset-sm-2.col-sm-10
- = render 'shared/allow_request_access', form: f, bold_label: true
+ = render 'shared/allow_request_access', form: f
= render 'groups/group_admin_settings', f: f
@@ -27,7 +27,7 @@
- if @group.new_record?
.form-group.row
.offset-sm-2.col-sm-10
- = render 'shared/global_alert', dismissible: false do
+ = render Pajamas::AlertComponent.new(dismissible: false) do
.gl-alert-body
= render 'shared/group_tips'
.form-actions
diff --git a/app/views/admin/groups/index.html.haml b/app/views/admin/groups/index.html.haml
index 17dccae44b5..2ea5890be2c 100644
--- a/app/views/admin/groups/index.html.haml
+++ b/app/views/admin/groups/index.html.haml
@@ -5,9 +5,8 @@
= form_tag admin_groups_path, method: :get, class: 'js-search-form' do |f|
= hidden_field_tag :sort, @sort
.search-holder
- - project_name = params[:name].present? ? params[:name] : nil
.search-field-holder
- = search_field_tag :name, project_name, class: "form-control search-text-input js-search-input", autofocus: true, spellcheck: false, placeholder: 'Search by name', data: { qa_selector: 'group_search_field' }
+ = search_field_tag :name, params[:name].presence, class: "form-control search-text-input js-search-input", autofocus: true, spellcheck: false, placeholder: 'Search by name', data: { qa_selector: 'group_search_field' }
= sprite_icon('search', css_class: 'search-icon')
= render "shared/groups/dropdown", options_hash: admin_groups_sort_options_hash
= link_to new_admin_group_path, class: "gl-button btn btn-confirm" do
diff --git a/app/views/admin/hooks/_form.html.haml b/app/views/admin/hooks/_form.html.haml
index bd63172a0ee..a309e874317 100644
--- a/app/views/admin/hooks/_form.html.haml
+++ b/app/views/admin/hooks/_form.html.haml
@@ -11,24 +11,18 @@
.form-group
= form.label :url, _('Trigger'), class: 'label-bold'
.form-text.text-secondary.gl-mb-5= _('System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events.')
- %fieldset.form-group.form-check
- = form.check_box :repository_update_events, class: 'form-check-input'
- = form.label :repository_update_events, _('Repository update events'), class: 'label-bold form-check-label'
- .text-secondary= _('URL is triggered when repository is updated')
- %fieldset.form-group.form-check
- = form.check_box :push_events, class: 'form-check-input'
- = form.label :push_events, _('Push events'), class: 'label-bold form-check-label'
- .text-secondary= _('URL is triggered for each branch updated to the repository')
- %fieldset.form-group.form-check
- = form.check_box :tag_push_events, class: 'form-check-input'
- = form.label :tag_push_events, _('Tag push events'), class: 'label-bold form-check-label'
- .text-secondary= _('URL is triggered when a new tag is pushed to the repository')
- %fieldset.form-group.form-check
- = form.check_box :merge_requests_events, class: 'form-check-input'
- = form.label :merge_requests_events, _('Merge request events'), class: 'label-bold form-check-label'
- .text-secondary= _('URL is triggered when a merge request is created, updated, or merged')
+ %fieldset.form-group
+ = form.gitlab_ui_checkbox_component :repository_update_events, _('Repository update events'),
+ help_text: _('URL is triggered when repository is updated')
+ %fieldset.form-group
+ = form.gitlab_ui_checkbox_component :push_events, _('Push events'),
+ help_text: _('URL is triggered for each branch updated to the repository')
+ %fieldset.form-group
+ = form.gitlab_ui_checkbox_component :tag_push_events, _('Tag push events'),
+ help_text: _('URL is triggered when a new tag is pushed to the repository')
+ %fieldset.form-group
+ = form.gitlab_ui_checkbox_component :merge_requests_events, _('Merge request events'),
+ help_text: _('URL is triggered when a merge request is created, updated, or merged')
.form-group
= form.label :enable_ssl_verification, _('SSL verification'), class: 'label-bold checkbox'
- .form-check
- = form.check_box :enable_ssl_verification, class: 'form-check-input'
- = form.label :enable_ssl_verification, _('Enable SSL verification'), class: 'label-bold form-check-label'
+ = form.gitlab_ui_checkbox_component :enable_ssl_verification, _('Enable SSL verification')
diff --git a/app/views/admin/hooks/edit.html.haml b/app/views/admin/hooks/edit.html.haml
index 566d8a99ac6..e8176e9f8bb 100644
--- a/app/views/admin/hooks/edit.html.haml
+++ b/app/views/admin/hooks/edit.html.haml
@@ -8,7 +8,7 @@
= render 'shared/web_hooks/title_and_docs', hook: @hook
.col-lg-9.gl-mb-3
- = form_for @hook, as: :hook, url: admin_hook_path do |f|
+ = gitlab_ui_form_for @hook, as: :hook, url: admin_hook_path do |f|
= render partial: 'form', locals: { form: f, hook: @hook }
.form-actions
%span>= f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mr-3'
diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml
index 3e2cd126e1a..f23d77c8da5 100644
--- a/app/views/admin/hooks/index.html.haml
+++ b/app/views/admin/hooks/index.html.haml
@@ -5,7 +5,7 @@
= render 'shared/web_hooks/title_and_docs', hook: @hook
.col-lg-8.gl-mb-3
- = form_for @hook, as: :hook, url: admin_hooks_path do |f|
+ = gitlab_ui_form_for @hook, as: :hook, url: admin_hooks_path do |f|
= render partial: 'form', locals: { form: f, hook: @hook }
= f.submit _('Add system hook'), class: 'btn gl-button btn-confirm'
diff --git a/app/views/admin/identities/index.html.haml b/app/views/admin/identities/index.html.haml
index 3b3042b5506..a4f1ce4afc0 100644
--- a/app/views/admin/identities/index.html.haml
+++ b/app/views/admin/identities/index.html.haml
@@ -15,5 +15,3 @@
= render @identities
- else
%h4= _('This user has no identities')
-
-= render partial: 'admin/users/modals'
diff --git a/app/views/admin/impersonation_tokens/index.html.haml b/app/views/admin/impersonation_tokens/index.html.haml
index 26fbba83a32..2c526bb38d8 100644
--- a/app/views/admin/impersonation_tokens/index.html.haml
+++ b/app/views/admin/impersonation_tokens/index.html.haml
@@ -28,5 +28,3 @@
impersonation: true,
active_tokens: @active_impersonation_tokens,
revoke_route_helper: ->(token) { revoke_admin_user_impersonation_token_path(token.user, token) }
-
-= render partial: 'admin/users/modals'
diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml
index e8bcf479d70..be7055e6f7b 100644
--- a/app/views/admin/projects/show.html.haml
+++ b/app/views/admin/projects/show.html.haml
@@ -14,11 +14,9 @@
- if @project.last_repository_check_failed?
.row
.col-md-12
- = render 'shared/global_alert',
- variant: :danger,
+ = render Pajamas::AlertComponent.new(variant: :danger,
alert_class: 'gl-mb-5',
- alert_data: { testid: 'last-repository-check-failed-alert' },
- is_container: true do
+ alert_data: { testid: 'last-repository-check-failed-alert' }) do
.gl-alert-body
- last_check_message = _("Last repository check (%{last_check_timestamp}) failed. See the 'repocheck.log' file for error messages.")
- last_check_message = last_check_message % { last_check_timestamp: time_ago_with_tooltip(@project.last_repository_check_at) }
diff --git a/app/views/admin/runners/edit.html.haml b/app/views/admin/runners/edit.html.haml
index 55fd09ac203..5570c46c17f 100644
--- a/app/views/admin/runners/edit.html.haml
+++ b/app/views/admin/runners/edit.html.haml
@@ -25,10 +25,9 @@
- if project
%tr
%td
- = render 'shared/global_alert',
- variant: :danger,
+ = render Pajamas::AlertComponent.new(variant: :danger,
dismissible: false,
- title: project.full_name do
+ title: project.full_name) do
.gl-alert-actions
= link_to _('Disable'), admin_namespace_project_runner_project_path(project.namespace, project, runner_project), method: :delete, class: 'btn gl-alert-action btn-confirm btn-md gl-button'
diff --git a/app/views/admin/topics/_form.html.haml b/app/views/admin/topics/_form.html.haml
index c40484ea494..50ef375dd35 100644
--- a/app/views/admin/topics/_form.html.haml
+++ b/app/views/admin/topics/_form.html.haml
@@ -27,7 +27,7 @@
= topic_icon(@topic, alt: _('Topic avatar'), class: 'avatar topic-avatar s90')
= render 'shared/choose_avatar_button', f: f
- if @topic.avatar?
- .js-remove-topic-avatar{ data: { path: admin_topic_avatar_path(@topic) } }
+ .js-remove-topic-avatar{ data: { path: admin_topic_avatar_path(@topic), name: @topic.name } }
- if @topic.new_record?
.form-actions
diff --git a/app/views/admin/users/_access_levels.html.haml b/app/views/admin/users/_access_levels.html.haml
index 1e4c3f3bb62..51e6af56377 100644
--- a/app/views/admin/users/_access_levels.html.haml
+++ b/app/views/admin/users/_access_levels.html.haml
@@ -11,7 +11,7 @@
.col-sm-2.col-form-label.gl-pt-0
= f.label :can_create_group
.col-sm-10
- = f.check_box :can_create_group
+ = f.gitlab_ui_checkbox_component :can_create_group, ''
.form-group.row
.col-sm-2.col-form-label.gl-pt-0
@@ -39,10 +39,7 @@
= f.label :external
.hidden{ data: user_internal_regex_data }
.col-sm-10.gl-display-flex.gl-align-items-baseline
- = f.check_box :external do
- = s_('AdminUsers|External')
- %p.light.gl-pl-2
- = s_('AdminUsers|External users cannot see internal or private projects unless access is explicitly granted. Also, external users cannot create projects, groups, or personal snippets.')
+ = f.gitlab_ui_checkbox_component :external, s_('AdminUsers|External users cannot see internal or private projects unless access is explicitly granted. Also, external users cannot create projects, groups, or personal snippets.')
%row.hidden#warning_external_automatically_set
= gl_badge_tag s_('AdminUsers|Automatically marked as default internal user'), variant: :warning
@@ -50,12 +47,9 @@
- @user.credit_card_validation || @user.build_credit_card_validation
= f.fields_for :credit_card_validation do |ff|
.col-sm-2.col-form-label.gl-pt-0
- = ff.label s_("AdminUsers|Validate user account")
+ = ff.label s_('AdminUsers|Validate user account')
.col-sm-10.gl-display-flex.gl-align-items-baseline
- = ff.check_box :credit_card_validated_at, checked: @user.credit_card_validated_at.present?
- .gl-pl-2
- .light
- = s_('AdminUsers|User is validated and can use free CI minutes on shared runners.')
- .gl-text-gray-600
- = s_('AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user.')
-
+ = ff.gitlab_ui_checkbox_component :credit_card_validated_at,
+ s_('AdminUsers|User is validated and can use free CI minutes on shared runners.'),
+ help_text: s_('AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user.'),
+ checkbox_options: { checked: @user.credit_card_validated_at.present? }
diff --git a/app/views/admin/users/_modals.html.haml b/app/views/admin/users/_modals.html.haml
deleted file mode 100644
index 0890990f476..00000000000
--- a/app/views/admin/users/_modals.html.haml
+++ /dev/null
@@ -1,20 +0,0 @@
-#js-delete-user-modal
-#js-modal-texts.hidden{ "hidden": true, "aria-hidden": "true" }
- %div{ data: { modal: "delete",
- title: s_("AdminUsers|Delete User %{username}?"),
- action: s_('AdminUsers|Delete user'),
- 'secondary-action': s_('AdminUsers|Block user') } }
- = s_('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.')
-
- %div{ data: { modal: "delete-with-contributions",
- title: s_("AdminUsers|Delete User %{username} and contributions?"),
- action: s_('AdminUsers|Delete user and contributions') ,
- 'secondary-action': s_('AdminUsers|Block user') } }
- = s_('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.')
-
diff --git a/app/views/admin/users/_users.html.haml b/app/views/admin/users/_users.html.haml
index ad7ce57ebda..86391b980c0 100644
--- a/app/views/admin/users/_users.html.haml
+++ b/app/views/admin/users/_users.html.haml
@@ -1,8 +1,7 @@
- if registration_features_can_be_prompted?
- = render 'shared/global_alert',
- variant: :tip,
+ = render Pajamas::AlertComponent.new(variant: :tip,
alert_class: 'gl-my-5',
- dismissible: false do
+ dismissible: false) do
.gl-alert-body
= render 'shared/registration_features_discovery_message', feature_title: s_('RegistrationFeatures|send emails to users')
@@ -68,5 +67,3 @@
= gl_loading_icon(size: 'lg', css_class: 'gl-my-7')
= paginate_collection @users
-
-= render partial: 'admin/users/modals'
diff --git a/app/views/admin/users/keys.html.haml b/app/views/admin/users/keys.html.haml
index 28024ae084f..5f9d11af7c1 100644
--- a/app/views/admin/users/keys.html.haml
+++ b/app/views/admin/users/keys.html.haml
@@ -3,4 +3,3 @@
- page_title _("SSH Keys"), @user.name, _("Users")
= render 'admin/users/head'
= render 'profiles/keys/key_table', admin: true
-= render partial: 'admin/users/modals'
diff --git a/app/views/admin/users/projects.html.haml b/app/views/admin/users/projects.html.haml
index 580cfe9f956..2f6c08f123e 100644
--- a/app/views/admin/users/projects.html.haml
+++ b/app/views/admin/users/projects.html.haml
@@ -48,5 +48,3 @@
- if member.respond_to? :project
= link_to project_project_member_path(project, member), data: { confirm: remove_member_message(member), confirm_btn_variant: 'danger' }, aria: { label: _('Remove') }, remote: true, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from project') do
= sprite_icon('remove', size: 16, css_class: 'gl-icon')
-
-= render partial: 'admin/users/modals'
diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml
index 94542af3b96..9197d6684e0 100644
--- a/app/views/admin/users/show.html.haml
+++ b/app/views/admin/users/show.html.haml
@@ -40,7 +40,7 @@
%span.light= _('Secondary email:')
%strong
= render partial: 'shared/email_with_badge', locals: { email: email.email, verified: email.confirmed? }
- = link_to remove_email_admin_user_path(@user, email), data: { confirm: _("Are you sure you want to remove %{email}?") % { email: email.email } }, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon float-right", title: _('Remove secondary email'), id: "remove_email_#{email.id}" do
+ = link_to remove_email_admin_user_path(@user, email), data: { confirm: _("Are you sure you want to remove %{email}?") % { email: email.email }, 'confirm-btn-variant': 'danger' }, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon float-right", title: _('Remove secondary email'), id: "remove_email_#{email.id}" do
= sprite_icon('close', size: 16, css_class: 'gl-icon')
%li
%span.light ID:
@@ -56,7 +56,7 @@
%strong{ class: @user.two_factor_enabled? ? 'cgreen' : 'cred' }
- if @user.two_factor_enabled?
= _('Enabled')
- = link_to _('Disable'), disable_two_factor_admin_user_path(@user), data: { confirm: _('Are you sure?') }, method: :patch, class: 'btn gl-button btn-sm btn-danger float-right', title: _('Disable Two-factor Authentication')
+ = link_to _('Disable'), disable_two_factor_admin_user_path(@user), aria: { label: _('Disable') }, data: { confirm: _('Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :patch, class: 'btn gl-button btn-sm btn-danger float-right', title: _('Disable Two-factor Authentication')
- else
= _('Disabled')
@@ -146,4 +146,3 @@
.col-md-6.gl-display-none.gl-md-display-block
= render 'admin/users/profile', user: @user
= render 'admin/users/user_detail_note'
-= render partial: 'admin/users/modals'
diff --git a/app/views/clusters/clusters/_banner.html.haml b/app/views/clusters/clusters/_banner.html.haml
index 6fb3f26ff4f..b7d1aa6f944 100644
--- a/app/views/clusters/clusters/_banner.html.haml
+++ b/app/views/clusters/clusters/_banner.html.haml
@@ -6,17 +6,13 @@
%span.gl-spinner.gl-spinner-dark{ 'aria-label': 'Loading' }
%span.gl-ml-2= s_('ClusterIntegration|Kubernetes cluster is being created...')
-= render 'shared/global_alert',
- variant: :warning,
- alert_class: 'hidden js-cluster-api-unreachable',
- close_button_class: 'js-close' do
+= render Pajamas::AlertComponent.new(variant: :warning,
+ alert_class: 'hidden js-cluster-api-unreachable') do
.gl-alert-body
= s_('ClusterIntegration|Your cluster API is unreachable. Please ensure your API URL is correct.')
-= render 'shared/global_alert',
- variant: :warning,
- alert_class: 'hidden js-cluster-authentication-failure js-cluster-api-unreachable',
- close_button_class: 'js-close' do
+= render Pajamas::AlertComponent.new(variant: :warning,
+ alert_class: 'hidden js-cluster-authentication-failure js-cluster-api-unreachable') do
.gl-alert-body
= s_('ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid.')
diff --git a/app/views/clusters/clusters/_deprecation_alert.html.haml b/app/views/clusters/clusters/_deprecation_alert.html.haml
new file mode 100644
index 00000000000..202e2c14d3f
--- /dev/null
+++ b/app/views/clusters/clusters/_deprecation_alert.html.haml
@@ -0,0 +1,7 @@
+= render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_class: 'gl-mt-6 gl-mb-3') do
+ .gl-alert-body
+ - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe
+ - issue_link_start = link_start % { url: 'https://gitlab.com/gitlab-org/configure/general/-/issues/199' }
+ - docs_link_start = link_start % { url: help_page_path('user/clusters/agent/index.md') }
+ - link_end = '</a>'.html_safe
+ = s_('ClusterIntegration|This process is %{issue_link_start}deprecated%{issue_link_end}. Use the %{docs_link_start}the GitLab agent for Kubernetes%{docs_link_end} instead.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end, issue_link_start: issue_link_start, issue_link_end: link_end }
diff --git a/app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml b/app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml
index 3a4632affdc..ffd910b1b9d 100644
--- a/app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml
+++ b/app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml
@@ -1,8 +1,8 @@
- link = link_to(s_('ClusterIntegration|sign up'), 'https://console.cloud.google.com/freetrial?utm_campaign=2018_cpanel&utm_source=gitlab&utm_medium=referral', target: '_blank', rel: 'noopener noreferrer')
-= render 'shared/global_alert',
- title: s_('ClusterIntegration|Did you know?'),
+
+= render Pajamas::AlertComponent.new(title: s_('ClusterIntegration|Did you know?'),
alert_class: 'gcp-signup-offer',
- alert_data: { feature_id: Users::CalloutsHelper::GCP_SIGNUP_OFFER, dismiss_endpoint: callouts_path } do
+ alert_data: { feature_id: Users::CalloutsHelper::GCP_SIGNUP_OFFER, dismiss_endpoint: callouts_path }) do
.gl-alert-body
= s_('ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab\'s Google Kubernetes Engine Integration.').html_safe % { sign_up_link: link }
.gl-alert-actions
diff --git a/app/views/clusters/clusters/_sidebar.html.haml b/app/views/clusters/clusters/_sidebar.html.haml
index bda774ee780..045c03df4fa 100644
--- a/app/views/clusters/clusters/_sidebar.html.haml
+++ b/app/views/clusters/clusters/_sidebar.html.haml
@@ -1,8 +1,14 @@
+- is_connect_page = local_assigns.fetch(:is_connect_page, false)
+- docs_mode = local_assigns.fetch(:docs_mode, false)
+- title = is_connect_page ? s_('ClusterIntegration|Connect a Kubernetes cluster') : s_('ClusterIntegration|Create a Kubernetes cluster')
+
%h3
- = s_('ClusterIntegration|Connect a Kubernetes cluster')
+ = title
%p
= clusterable.sidebar_text
-%p
- = clusterable.learn_more_link
-= render 'clusters/clusters/multiple_clusters_message'
+- if !docs_mode
+ %p
+ = clusterable.learn_more_link
+
+ = render 'clusters/clusters/multiple_clusters_message'
diff --git a/app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml b/app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml
index 826dc749dad..807f98b7b0a 100644
--- a/app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml
+++ b/app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml
@@ -1,12 +1,15 @@
- provider = local_assigns.fetch(:provider)
- is_current_provider = provider == params[:provider]
- logo_path = local_assigns.fetch(:logo_path)
+- help_path = local_assigns.fetch(:help_path)
- label = local_assigns.fetch(:label)
- last = local_assigns.fetch(:last, false)
-- classes = ["btn btn-confirm gl-button btn-confirm-secondary gl-flex-direction-column gl-w-half js-create-#{provider}-cluster-button"]
-- conditional_classes = [('gl-mr-5' unless last), ('active' if is_current_provider)]
+- docs_mode = local_assigns.fetch(:docs_mode, false)
+- classes = ["btn btn-confirm gl-button btn-confirm-secondary gl-flex-direction-column gl-w-half"]
+- conditional_classes = [("gl-mr-5" unless last), ("active" if is_current_provider && !docs_mode), ("js-create-#{provider}-cluster-button" if !docs_mode)]
+- link = docs_mode ? help_path : clusterable.new_path(provider: provider)
-= link_to clusterable.new_path(provider: provider), class: classes + conditional_classes do
- .svg-content.gl-p-3= image_tag logo_path, alt: label, class: 'gl-w-64 gl-h-64'
+= link_to link, class: classes + conditional_classes do
+ .svg-content.gl-p-3= image_tag logo_path, alt: label, class: "gl-w-64 gl-h-64"
%span
= label
diff --git a/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml b/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml
index 321fb854e0d..69250141816 100644
--- a/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml
+++ b/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml
@@ -1,11 +1,15 @@
- gke_label = s_('ClusterIntegration|Google GKE')
- eks_label = s_('ClusterIntegration|Amazon EKS')
- create_cluster_label = s_('ClusterIntegration|Where do you want to create a cluster?')
+- eks_help_path = help_page_path('user/infrastructure/clusters/connect/new_eks_cluster')
+- gke_help_path = help_page_path('user/infrastructure/clusters/connect/new_gke_cluster')
+- docs_mode = local_assigns.fetch(:docs_mode, false)
+
.gl-p-5
%h4.gl-mb-5
= create_cluster_label
.gl-display-flex
= render partial: 'clusters/clusters/cloud_providers/cloud_provider_button',
- locals: { provider: 'aws', label: eks_label, logo_path: 'illustrations/logos/amazon_eks.svg' }
+ locals: { provider: 'aws', label: eks_label, logo_path: 'illustrations/logos/amazon_eks.svg', help_path: eks_help_path, docs_mode: docs_mode }
= render partial: 'clusters/clusters/cloud_providers/cloud_provider_button',
- locals: { provider: 'gcp', label: gke_label, logo_path: 'illustrations/logos/google_gke.svg', last: true }
+ locals: { provider: 'gcp', label: gke_label, logo_path: 'illustrations/logos/google_gke.svg', help_path: gke_help_path, docs_mode: docs_mode, last: true }
diff --git a/app/views/clusters/clusters/connect.html.haml b/app/views/clusters/clusters/connect.html.haml
index 1043f78bd3c..ec00a9c345a 100644
--- a/app/views/clusters/clusters/connect.html.haml
+++ b/app/views/clusters/clusters/connect.html.haml
@@ -3,9 +3,11 @@
- breadcrumb_title _('Connect a cluster')
- page_title _('Connect a Kubernetes Cluster')
-.row.gl-mt-3
- .col-md-3
- = render 'sidebar'
- .col-md-9
+= render 'deprecation_alert'
+
+.gl-md-display-flex.gl-mt-3
+ .gl-w-quarter.gl-xs-w-full.gl-flex-shrink-0.gl-md-mr-5
+ = render 'sidebar', is_connect_page: true
+ .gl-w-full
#js-cluster-new{ data: js_cluster_new }
= render 'clusters/clusters/user/form'
diff --git a/app/views/clusters/clusters/new.html.haml b/app/views/clusters/clusters/new.html.haml
index a184f412565..53d521fface 100644
--- a/app/views/clusters/clusters/new.html.haml
+++ b/app/views/clusters/clusters/new.html.haml
@@ -4,12 +4,14 @@
- page_title _('Create a Kubernetes cluster')
- provider = params[:provider]
+= render 'deprecation_alert'
+
= render_gcp_signup_offer
-.row.gl-mt-3
- .col-md-3
- = render 'sidebar'
- .col-md-9
+.gl-md-display-flex.gl-mt-3
+ .gl-w-quarter.gl-xs-w-full.gl-flex-shrink-0.gl-md-mr-5
+ = render 'sidebar', is_connect_page: false
+ .gl-w-full
= render 'clusters/clusters/cloud_providers/cloud_provider_selector'
- if ['aws', 'gcp'].include?(provider)
diff --git a/app/views/clusters/clusters/new_cluster_docs.html.haml b/app/views/clusters/clusters/new_cluster_docs.html.haml
new file mode 100644
index 00000000000..9b99aef0e72
--- /dev/null
+++ b/app/views/clusters/clusters/new_cluster_docs.html.haml
@@ -0,0 +1,13 @@
+- @content_class = 'limit-container-width' unless fluid_layout
+- add_to_breadcrumbs _('Kubernetes Clusters'), clusterable.index_path
+- breadcrumb_title _('Create a cluster')
+- page_title _('Create a Kubernetes cluster')
+- docs_mode = true
+
+= render_gcp_signup_offer
+
+.gl-md-display-flex.gl-mt-3
+ .gl-w-quarter.gl-xs-w-full.gl-flex-shrink-0.gl-md-mr-5
+ = render 'sidebar', docs_mode: docs_mode, is_connect_page: false
+ .gl-w-full
+ = render 'clusters/clusters/cloud_providers/cloud_provider_selector', docs_mode: docs_mode
diff --git a/app/views/dashboard/milestones/index.html.haml b/app/views/dashboard/milestones/index.html.haml
index 872099f98fc..2bbca851dcc 100644
--- a/app/views/dashboard/milestones/index.html.haml
+++ b/app/views/dashboard/milestones/index.html.haml
@@ -12,16 +12,29 @@
path: '-/milestones/new', label: 'New milestone',
include_groups: true, type: :milestones
-.top-area
- = render 'shared/milestones_filter', counts: @milestone_states
- .nav-controls
- = render 'shared/milestones/search_form'
+- if @milestone_states.any? { |name, count| count > 0 }
+ .top-area
+ = render 'shared/milestones_filter', counts: @milestone_states
+ .nav-controls
+ = render 'shared/milestones/search_form'
-- if @milestones.blank?
- = render 'shared/empty_states/milestones'
+ - if @milestones.blank?
+ = render 'shared/empty_states/milestones_tab', active_tab: params[:state] do
+ - if current_user
+ .page-title-controls
+ = render 'shared/new_project_item_select',
+ path: '-/milestones/new', label: 'New milestone',
+ include_groups: true, type: :milestones
+ - else
+ .milestones
+ %ul.content-list
+ - @milestones.each do |milestone|
+ = render 'milestone', milestone: milestone
+ = paginate @milestones, theme: 'gitlab'
- else
- .milestones
- %ul.content-list
- - @milestones.each do |milestone|
- = render 'milestone', milestone: milestone
- = paginate @milestones, theme: 'gitlab'
+ = render 'shared/empty_states/milestones' do
+ - if current_user
+ .page-title-controls
+ = render 'shared/new_project_item_select',
+ path: '-/milestones/new', label: 'New milestone',
+ include_groups: true, type: :milestones
diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml
index b40373ecc37..83e3fd85511 100644
--- a/app/views/devise/sessions/_new_base.html.haml
+++ b/app/views/devise/sessions/_new_base.html.haml
@@ -1,23 +1,24 @@
-= form_for(resource, as: resource_name, url: session_path(resource_name), html: { class: 'new_user gl-show-field-errors', 'aria-live' => 'assertive'}) do |f|
+= gitlab_ui_form_for(resource, as: resource_name, url: session_path(resource_name), html: { class: 'new_user gl-show-field-errors js-sign-in-form', aria: { live: 'assertive' }, data: { testid: 'sign-in-form' }}) do |f|
.form-group
= f.label _('Username or email'), for: 'user_login', class: 'label-bold'
- = 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' }
+ = f.text_field :login, value: @invite_email, class: 'form-control gl-form-input top js-username-field', autofocus: 'autofocus', autocapitalize: 'off', autocorrect: 'off', required: true, title: _('This field is required.'), data: { qa_selector: 'login_field', testid: 'username-field' }
.form-group
= f.label :password, class: 'label-bold'
= f.password_field :password, class: 'form-control gl-form-input bottom', autocomplete: 'current-password', required: true, title: _('This field is required.'), data: { qa_selector: 'password_field' }
- if devise_mapping.rememberable?
%div
- %label{ for: 'user_remember_me' }
- = f.check_box :remember_me
- %span= _('Remember me')
- .float-right
+ .gl-display-inline-block
+ = f.gitlab_ui_checkbox_component :remember_me, _('Remember me')
+ .gl-float-right
- if unconfirmed_email?
= link_to _('Resend confirmation email'), new_user_confirmation_path
- else
= link_to _('Forgot your password?'), new_password_path(:user)
%div
- - if captcha_enabled? || captcha_on_login_required?
+ - if Feature.enabled?(:arkose_labs_login_challenge)
+ = render_if_exists 'devise/sessions/arkose_labs'
+ - elsif captcha_enabled? || captcha_on_login_required?
= recaptcha_tags nonce: content_security_policy_nonce
.submit-container.move-submit-down
- = f.submit _('Sign in'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'sign_in_button' }
+ = f.button _('Sign in'), type: :submit, class: "gl-button btn btn-block btn-confirm js-sign-in-button#{' js-no-auto-disable' if Feature.enabled?(:arkose_labs_login_challenge)}", data: { qa_selector: 'sign_in_button', testid: 'sign-in-button' }
diff --git a/app/views/devise/shared/_email_opted_in.html.haml b/app/views/devise/shared/_email_opted_in.html.haml
index 898b8f31f1d..d8ed0028222 100644
--- a/app/views/devise/shared/_email_opted_in.html.haml
+++ b/app/views/devise/shared/_email_opted_in.html.haml
@@ -3,5 +3,4 @@
.gl-mb-3.js-email-opt-in.hidden
.gl-font-weight-bold.gl-mb-3
= _('Email updates (optional)')
- = f.check_box :email_opted_in
- = f.label :email_opted_in, _("I'd like to receive updates about GitLab via email"), class: 'gl-font-weight-normal'
+ = f.gitlab_ui_checkbox_component :email_opted_in, _("I'd like to receive updates about GitLab via email")
diff --git a/app/views/errors/_footer.html.haml b/app/views/errors/_footer.html.haml
index 62bac62c70c..3adde3ef544 100644
--- a/app/views/errors/_footer.html.haml
+++ b/app/views/errors/_footer.html.haml
@@ -4,8 +4,8 @@
= link_to s_('Nav|Home'), root_path
%li
- if current_user
- = link_to s_('Nav|Sign out and sign in with a different account'), '#', id: 'sign_out_link'
- %form{ action: destroy_user_session_path, method: :post, id: 'sign_out_form' }
+ = link_to s_('Nav|Sign out and sign in with a different account'), '#', class: 'js-sign-out-link'
+ %form.js-sign-out-form{ action: destroy_user_session_path, method: :post }
- else
= link_to s_('Nav|Sign In / Register'), new_session_path(:user, redirect_to_referer: 'yes')
%li
diff --git a/app/views/groups/_group_admin_settings.html.haml b/app/views/groups/_group_admin_settings.html.haml
index ab6861b5f24..785ca71b371 100644
--- a/app/views/groups/_group_admin_settings.html.haml
+++ b/app/views/groups/_group_admin_settings.html.haml
@@ -2,14 +2,12 @@
.col-sm-2.col-form-label.pt-0
= f.label :lfs_enabled, _('Large File Storage')
.col-sm-10
- .form-check
- = f.check_box :lfs_enabled, checked: @group.lfs_enabled?, class: 'form-check-input'
- = f.label :lfs_enabled, class: 'form-check-label' do
- %strong
- = _('Allow projects within this group to use Git LFS')
- = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index')
- %br/
- %span= _('This setting can be overridden in each project.')
+ - label = _('Allow projects within this group to use Git LFS')
+ - help_link = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index'), class: 'gl-ml-2'
+ = f.gitlab_ui_checkbox_component :lfs_enabled,
+ '%{label}%{help_link}'.html_safe % { label: label, help_link: help_link },
+ help_text: _('This setting can be overridden in each project.'),
+ checkbox_options: { checked: @group.lfs_enabled? }
.form-group.row
.col-sm-2.col-form-label
= f.label s_('ProjectCreationLevel|Allowed to create projects')
@@ -26,12 +24,9 @@
.col-sm-2.col-form-label.pt-0
= f.label :require_two_factor_authentication, _('Two-factor authentication')
.col-sm-10
- .form-check
- = f.check_box :require_two_factor_authentication, class: 'form-check-input'
- = f.label :require_two_factor_authentication, class: 'form-check-label' do
- %strong
- = _("Require all users in this group to set up two-factor authentication")
- = link_to sprite_icon('question-o'), help_page_path('security/two_factor_authentication', anchor: 'enforce-2fa-for-all-users-in-a-group')
+ - label = _("Require all users in this group to set up two-factor authentication")
+ - help_link = link_to sprite_icon('question-o'), help_page_path('security/two_factor_authentication', anchor: 'enforce-2fa-for-all-users-in-a-group'), class: 'gl-ml-2'
+ = f.gitlab_ui_checkbox_component :require_two_factor_authentication, '%{label}%{help_link}'.html_safe % { label: label, help_link: help_link }
.form-group.row
.offset-sm-2.col-sm-10
.form-check
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 5b9cd80799c..95b3ad26e99 100644
--- a/app/views/groups/_import_group_from_another_instance_panel.html.haml
+++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml
@@ -4,8 +4,8 @@
%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')
+ = render Pajamas::AlertComponent.new(dismissible: false,
+ variant: :warning) do
.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') }
- docs_link_end = '</a>'.html_safe
diff --git a/app/views/groups/_import_group_from_file_panel.html.haml b/app/views/groups/_import_group_from_file_panel.html.haml
index ee0967f708a..ddd7481e0bd 100644
--- a/app/views/groups/_import_group_from_file_panel.html.haml
+++ b/app/views/groups/_import_group_from_file_panel.html.haml
@@ -6,8 +6,8 @@
.gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5
%h4
= _('Import group from file')
- .gl-alert.gl-alert-warning{ role: 'alert' }
- = sprite_icon('warning', css_class: 'gl-icon s16 gl-alert-icon gl-alert-icon-no-title')
+ = render Pajamas::AlertComponent.new(variant: :warning,
+ dismissible: false) do
.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') }
- link_end = '</a>'.html_safe
diff --git a/app/views/groups/_subgroups_and_projects.html.haml b/app/views/groups/_subgroups_and_projects.html.haml
index 651d182b9cc..427a36aaec4 100644
--- a/app/views/groups/_subgroups_and_projects.html.haml
+++ b/app/views/groups/_subgroups_and_projects.html.haml
@@ -4,5 +4,4 @@
%section{ data: { hide_projects: 'false', group_id: group.id, path: group_path(group) } }
.js-groups-list-holder{ data: { show_schema_markup: 'true'} }
- .loading-container.text-center.prepend-top-20
- .gl-spinner.gl-spinner-md
+ = gl_loading_icon(size: 'md', css_class: 'gl-mt-6')
diff --git a/app/views/groups/crm/contacts/index.html.haml b/app/views/groups/crm/contacts/index.html.haml
index 81293937f77..8a971e451a4 100644
--- a/app/views/groups/crm/contacts/index.html.haml
+++ b/app/views/groups/crm/contacts/index.html.haml
@@ -1,4 +1,8 @@
-- breadcrumb_title _('Customer Relations Contacts')
-- page_title _('Customer Relations Contacts')
+- breadcrumb_title _('Customer relations contacts')
+- page_title _('Customer relations contacts')
+- @content_wrapper_class = "gl-relative"
+
+= content_for :after_content do
+ #js-crm-form-portal
#js-crm-contacts-app{ data: { group_full_path: @group.full_path, group_issues_path: issues_group_path(@group), group_id: @group.id, can_admin_crm_contact: can?(current_user, :admin_crm_contact, @group).to_s, base_path: group_crm_contacts_path(@group) } }
diff --git a/app/views/groups/crm/organizations/index.html.haml b/app/views/groups/crm/organizations/index.html.haml
index 1647805b976..ff1ba678de0 100644
--- a/app/views/groups/crm/organizations/index.html.haml
+++ b/app/views/groups/crm/organizations/index.html.haml
@@ -1,4 +1,8 @@
-- breadcrumb_title _('Customer Relations Organizations')
-- page_title _('Customer Relations Organizations')
+- breadcrumb_title _('Customer relations organizations')
+- page_title _('Customer relations organizations')
+- @content_wrapper_class = "gl-relative"
+
+= content_for :after_content do
+ #js-crm-form-portal
#js-crm-organizations-app{ data: { base_path: group_crm_organizations_path(@group), can_admin_crm_organization: can?(current_user, :admin_crm_organization, @group).to_s, group_full_path: @group.full_path, group_id: @group.id, group_issues_path: issues_group_path(@group) } }
diff --git a/app/views/groups/dependency_proxies/show.html.haml b/app/views/groups/dependency_proxies/show.html.haml
index 47caec717af..940a504438d 100644
--- a/app/views/groups/dependency_proxies/show.html.haml
+++ b/app/views/groups/dependency_proxies/show.html.haml
@@ -4,4 +4,4 @@
#js-dependency-proxy{ data: { group_path: @group.full_path,
dependency_proxy_available: dependency_proxy_available.to_s,
- no_manifests_illustration: image_path('illustrations/docker-empty-state.svg') } }
+ no_manifests_illustration: image_path('illustrations/docker-empty-state.svg'), group_id: @group.id } }
diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml
index f3494149087..3dcc75ce8f4 100644
--- a/app/views/groups/edit.html.haml
+++ b/app/views/groups/edit.html.haml
@@ -4,6 +4,7 @@
- expanded = expanded_by_default?
= render 'shared/namespaces/cascading_settings/lock_popovers'
+= render_if_exists 'shared/minute_limit_banner', namespace: @group
%section.settings.gs-general.no-animate.expanded#js-general-settings
.settings-header
diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml
index 5c579cf6488..9aa626724a8 100644
--- a/app/views/groups/group_members/index.html.haml
+++ b/app/views/groups/group_members/index.html.haml
@@ -1,6 +1,8 @@
- add_page_specific_style 'page_bundles/members'
- page_title _('Group members')
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @group
+
.row.gl-mt-3
.col-lg-12
.gl-display-flex.gl-flex-wrap
@@ -25,5 +27,7 @@
.js-group-members-list-app{ data: { members_data: group_members_app_data(@group,
members: @members,
invited: @invited_members,
- access_requests: @requesters).to_json } }
+ access_requests: @requesters,
+ include_relations: @include_relations,
+ search: params[:search_groups]).to_json } }
= gl_loading_icon(css_class: 'gl-my-5', size: 'md')
diff --git a/app/views/groups/harbor/repositories/index.html.haml b/app/views/groups/harbor/repositories/index.html.haml
index 1ee15557e21..6a1e66520b5 100644
--- a/app/views/groups/harbor/repositories/index.html.haml
+++ b/app/views/groups/harbor/repositories/index.html.haml
@@ -4,6 +4,8 @@
#js-harbor-registry-list-group{ data: { endpoint: group_harbor_registries_path(@group),
"no_containers_image" => image_path('illustrations/docker-empty-state.svg'),
"containers_error_image" => image_path('illustrations/docker-error-state.svg'),
- "help_page_path" => help_page_path('user/packages/container_registry/index'),
+ "repository_url" => 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
+ "registry_host_url_with_port" => 'demo.harbor.com',
connection_error: (!!@connection_error).to_s,
- invalid_path_error: (!!@invalid_path_error).to_s, } }
+ invalid_path_error: (!!@invalid_path_error).to_s,
+ is_group_page: true.to_s } }
diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml
index 1c7427fef87..5c0487db0fc 100644
--- a/app/views/groups/milestones/index.html.haml
+++ b/app/views/groups/milestones/index.html.haml
@@ -1,23 +1,32 @@
- page_title _("Milestones")
- add_page_specific_style 'page_bundles/milestone'
-.top-area
- = render 'shared/milestones_filter', counts: @milestone_states
+- if @milestone_states.any? { |name, count| count > 0 }
+ .top-area
+ = render 'shared/milestones_filter', counts: @milestone_states
- .nav-controls
- = render 'shared/milestones/search_form'
- = render 'shared/milestones_sort_dropdown'
- - if can?(current_user, :admin_milestone, @group)
- = link_to _('New milestone'), new_group_milestone_path(@group), class: "btn gl-button btn-confirm", data: { qa_selector: "new_group_milestone_link" }
+ .nav-controls
+ = render 'shared/milestones/search_form'
+ = render 'shared/milestones_sort_dropdown'
+ - if can?(current_user, :admin_milestone, @group)
+ = link_to _('New milestone'), new_group_milestone_path(@group), class: "btn gl-button btn-confirm", data: { qa_selector: "new_group_milestone_link" }
-- if @milestones.blank?
- = render 'shared/empty_states/milestones'
+ - if @milestones.blank?
+ = render 'shared/empty_states/milestones_tab', learn_more_path: help_page_path('user/project/milestones/index') do
+ - if can?(current_user, :admin_milestone, @group)
+ .text-center
+ = link_to _('New milestone'), new_group_milestone_path(@group), class: "btn gl-button btn-confirm", data: { qa_selector: "new_group_milestone_link" }
+ - else
+ .milestones
+ %ul.content-list
+ - @milestones.each do |milestone|
+ - if milestone.project_milestone?
+ = render 'projects/milestones/milestone', milestone: milestone
+ - else
+ = render 'milestone', milestone: milestone
+ = paginate @milestones, theme: "gitlab"
- else
- .milestones
- %ul.content-list
- - @milestones.each do |milestone|
- - if milestone.project_milestone?
- = render 'projects/milestones/milestone', milestone: milestone
- - else
- = render 'milestone', milestone: milestone
- = paginate @milestones, theme: "gitlab"
+ = render 'shared/empty_states/milestones', learn_more_path: help_page_path('user/project/milestones/index') do
+ - if can?(current_user, :admin_milestone, @group)
+ .text-center
+ = link_to _('New milestone'), new_group_milestone_path(@group), class: "btn gl-button btn-confirm", data: { qa_selector: "new_group_milestone_link" }
diff --git a/app/views/groups/runners/_settings.html.haml b/app/views/groups/runners/_settings.html.haml
index bbcadc08a8b..087b06ee37d 100644
--- a/app/views/groups/runners/_settings.html.haml
+++ b/app/views/groups/runners/_settings.html.haml
@@ -1,4 +1,6 @@
- if Feature.enabled?(:runner_list_group_view_vue_ui, @group, default_enabled: :yaml)
+ .gl-mb-6
+ #update-shared-runners-form{ data: group_shared_runners_settings_data(@group) }
.gl-card.gl-px-8.gl-py-6.gl-line-height-20
.gl-card-body.gl-display-flex{ :class => "gl-p-0!" }
.gl-banner-illustration
@@ -11,107 +13,107 @@
%a.btn.btn-confirm.btn-md.gl-button{ :href => group_runners_path(@group) }
%span.gl-button-text
= s_('Runners|Take me there!')
+- else
+ = render 'shared/runners/runner_description'
-= render 'shared/runners/runner_description'
-
-%hr
+ %hr
-.row
- .col-sm-6
- = render 'groups/runners/group_runners'
- .col-sm-6
- = render 'groups/runners/shared_runners'
+ .row
+ .col-sm-6
+ = render 'groups/runners/group_runners'
+ .col-sm-6
+ = render 'groups/runners/shared_runners'
-%h4.underlined-title
- = _('Available runners: %{runners}').html_safe % { runners: limited_counter_with_delimiter(@all_group_runners) }
+ %h4.underlined-title
+ = _('Available runners: %{runners}').html_safe % { runners: limited_counter_with_delimiter(@all_group_runners) }
--# haml-lint:disable NoPlainNodes
-.row
- .col-sm-9
- = form_tag group_settings_ci_cd_path, id: 'runners-search', method: :get, class: 'filter-form js-filter-form' do
- .filtered-search-wrapper.d-flex
- .filtered-search-box
- = dropdown_tag(_('Recent searches'),
- options: { wrapper_class: 'filtered-search-history-dropdown-wrapper',
- toggle_class: 'gl-button btn btn-default filtered-search-history-dropdown-toggle-button',
- dropdown_class: 'filtered-search-history-dropdown',
- content_class: 'filtered-search-history-dropdown-content' }) do
- .js-filtered-search-history-dropdown{ data: { full_path: group_settings_ci_cd_path } }
- .filtered-search-box-input-container.droplab-dropdown
- .scroll-container
- %ul.tokens-container.list-unstyled
- %li.input-token
- %input.form-control.filtered-search{ search_filter_input_options('runners') }
- #js-dropdown-hint.filtered-search-input-dropdown-menu.dropdown-menu.hint-dropdown
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item{ data: {hint: "#{'{{hint}}'}", tag: "#{'{{tag}}'}", action: "#{'{{hint === \'search\' ? \'submit\' : \'\' }}'}" } }
- = button_tag class: 'gl-button btn btn-link' do
- -# Encapsulate static class name `{{icon}}` inside #{} to bypass
- -# haml lint's ClassAttributeWithStaticValue
- %svg
- %use{ 'xlink:href': "#{'{{icon}}'}" }
- %span.js-filter-hint
- {{formattedKey}}
- #js-dropdown-operator.filtered-search-input-dropdown-menu.dropdown-menu
- %ul.filter-dropdown{ data: { dropdown: true, dynamic: true } }
- %li.filter-dropdown-item{ data: { value: "{{ title }}" } }
- = button_tag class: 'gl-button btn btn-link' do
- {{ title }}
- %span.btn-helptext
- {{ help }}
- #js-dropdown-admin-runner-status.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- - Ci::Runner::AVAILABLE_STATUSES.each do |status|
- %li.filter-dropdown-item{ data: { value: status } }
+ -# haml-lint:disable NoPlainNodes
+ .row
+ .col-sm-9
+ = form_tag group_settings_ci_cd_path, id: 'runners-search', method: :get, class: 'filter-form js-filter-form' do
+ .filtered-search-wrapper.d-flex
+ .filtered-search-box
+ = dropdown_tag(_('Recent searches'),
+ options: { wrapper_class: 'filtered-search-history-dropdown-wrapper',
+ toggle_class: 'gl-button btn btn-default filtered-search-history-dropdown-toggle-button',
+ dropdown_class: 'filtered-search-history-dropdown',
+ content_class: 'filtered-search-history-dropdown-content' }) do
+ .js-filtered-search-history-dropdown{ data: { full_path: group_settings_ci_cd_path } }
+ .filtered-search-box-input-container.droplab-dropdown
+ .scroll-container
+ %ul.tokens-container.list-unstyled
+ %li.input-token
+ %input.form-control.filtered-search{ search_filter_input_options('runners') }
+ #js-dropdown-hint.filtered-search-input-dropdown-menu.dropdown-menu.hint-dropdown
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ %li.filter-dropdown-item{ data: {hint: "#{'{{hint}}'}", tag: "#{'{{tag}}'}", action: "#{'{{hint === \'search\' ? \'submit\' : \'\' }}'}" } }
= button_tag class: 'gl-button btn btn-link' do
- = status.titleize
-
- #js-dropdown-admin-runner-type.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- - Ci::Runner::AVAILABLE_TYPES.each do |runner_type|
- - next if runner_type == 'instance_type'
- %li.filter-dropdown-item{ data: { value: runner_type } }
+ -# Encapsulate static class name `{{icon}}` inside #{} to bypass
+ -# haml lint's ClassAttributeWithStaticValue
+ %svg
+ %use{ 'xlink:href': "#{'{{icon}}'}" }
+ %span.js-filter-hint
+ {{formattedKey}}
+ #js-dropdown-operator.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul.filter-dropdown{ data: { dropdown: true, dynamic: true } }
+ %li.filter-dropdown-item{ data: { value: "{{ title }}" } }
= button_tag class: 'gl-button btn btn-link' do
- = runner_type.titleize
+ {{ title }}
+ %span.btn-helptext
+ {{ help }}
+ #js-dropdown-admin-runner-status.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ - Ci::Runner::AVAILABLE_STATUSES.each do |status|
+ %li.filter-dropdown-item{ data: { value: status } }
+ = button_tag class: 'gl-button btn btn-link' do
+ = status.titleize
+
+ #js-dropdown-admin-runner-type.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ - Ci::Runner::AVAILABLE_TYPES.each do |runner_type|
+ - next if runner_type == 'instance_type'
+ %li.filter-dropdown-item{ data: { value: runner_type } }
+ = button_tag class: 'gl-button btn btn-link' do
+ = runner_type.titleize
- #js-dropdown-runner-tag.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'none' } }
- = button_tag class: 'gl-button btn btn-link' do
- = _('No Tag')
- %li.divider.droplab-item-ignore
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item
- = button_tag class: 'gl-button btn btn-link js-data-value' do
- %span.dropdown-light-content
- {{name}}
+ #js-dropdown-runner-tag.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'none' } }
+ = button_tag class: 'gl-button btn btn-link' do
+ = _('No Tag')
+ %li.divider.droplab-item-ignore
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ %li.filter-dropdown-item
+ = button_tag class: 'gl-button btn btn-link js-data-value' do
+ %span.dropdown-light-content
+ {{name}}
- = button_tag class: 'clear-search hidden' do
- = sprite_icon('close', size: 16, css_class: 'clear-search-icon')
- .filter-dropdown-container
- = render 'groups/runners/sort_dropdown'
+ = button_tag class: 'clear-search hidden' do
+ = sprite_icon('close', size: 16, css_class: 'clear-search-icon')
+ .filter-dropdown-container
+ = render 'groups/runners/sort_dropdown'
- .col-sm-3.text-right-lg
- = _('Runners currently online: %{active_runners_count}') % { active_runners_count: limited_counter_with_delimiter(@all_group_runners.online) }
+ .col-sm-3.text-right-lg
+ = _('Runners currently online: %{active_runners_count}') % { active_runners_count: limited_counter_with_delimiter(@all_group_runners.online) }
-- if @group_runners.any?
- .content-list{ data: { testid: 'runners-table' } }
- .table-holder
- .gl-responsive-table-row.table-row-header{ role: 'row' }
- .table-section.section-10{ role: 'rowheader' }= _('Type/State')
- .table-section.section-30{ role: 'rowheader' }= s_('Runners|Runner')
- .table-section.section-10{ role: 'rowheader' }= _('Version')
- .table-section.section-10{ role: 'rowheader' }= _('IP Address')
- .table-section.section-5{ role: 'rowheader' }= _('Projects')
- .table-section.section-5{ role: 'rowheader' }= _('Jobs')
- .table-section.section-10{ role: 'rowheader' }= _('Tags')
- .table-section.section-10{ role: 'rowheader' }= _('Last contact')
- .table-section.section-10{ role: 'rowheader' }
+ - if @group_runners.any?
+ .content-list{ data: { testid: 'runners-table' } }
+ .table-holder
+ .gl-responsive-table-row.table-row-header{ role: 'row' }
+ .table-section.section-10{ role: 'rowheader' }= _('Type/State')
+ .table-section.section-30{ role: 'rowheader' }= s_('Runners|Runner')
+ .table-section.section-10{ role: 'rowheader' }= _('Version')
+ .table-section.section-10{ role: 'rowheader' }= _('IP Address')
+ .table-section.section-5{ role: 'rowheader' }= _('Projects')
+ .table-section.section-5{ role: 'rowheader' }= _('Jobs')
+ .table-section.section-10{ role: 'rowheader' }= _('Tags')
+ .table-section.section-10{ role: 'rowheader' }= _('Last contact')
+ .table-section.section-10{ role: 'rowheader' }
- - @group_runners.each do |runner|
- - runner = runner.present(current_user: current_user)
- = render 'groups/runners/runner', runner: runner
- = paginate @group_runners, theme: 'gitlab', :params => { :anchor => 'runners-settings' }
-- else
- .nothing-here-block= _('No runners found')
+ - @group_runners.each do |runner|
+ - runner = runner.present(current_user: current_user)
+ = render 'groups/runners/runner', runner: runner
+ = paginate @group_runners, theme: 'gitlab', :params => { :anchor => 'runners-settings' }
+ - else
+ .nothing-here-block= _('No runners found')
diff --git a/app/views/groups/runners/_sort_dropdown.html.haml b/app/views/groups/runners/_sort_dropdown.html.haml
index e914bd00dac..b7b10cecee8 100644
--- a/app/views/groups/runners/_sort_dropdown.html.haml
+++ b/app/views/groups/runners/_sort_dropdown.html.haml
@@ -1,10 +1,3 @@
-- sorted_by = sort_options_hash[@sort] || sort_title_created_date
+- runners_sort_options = runners_sort_options_hash.map { |value, text| { value: value, text: text, href: page_filter_path(sort: value) } }
-.dropdown.inline.gl-ml-3
- %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown', display: 'static' } }
- = sorted_by
- = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3')
- %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable.dropdown-menu-sort
- %li
- = sortable_item(sort_title_created_date, page_filter_path(sort: sort_value_created_date), sorted_by)
- = sortable_item(sort_title_contacted_date, page_filter_path(sort: sort_value_contacted_date), sorted_by)
+= gl_redirect_listbox_tag runners_sort_options, @sort, class: 'gl-ml-3', data: { display: 'static' }
diff --git a/app/views/groups/settings/_export.html.haml b/app/views/groups/settings/_export.html.haml
index 81403fd88b2..62bc574231f 100644
--- a/app/views/groups/settings/_export.html.haml
+++ b/app/views/groups/settings/_export.html.haml
@@ -1,12 +1,9 @@
-- return unless Feature.enabled?(:group_import_export, @group, default_enabled: true)
-
- group = local_assigns.fetch(:group)
.sub-section
%h4= s_('GroupSettings|Export group')
%p= _('Export this group with all related data.')
- .gl-alert.gl-alert-warning.gl-mb-4{ role: 'alert' }
- = sprite_icon('warning', css_class: 'gl-icon s16 gl-alert-icon gl-alert-icon-no-title')
+ = render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_class: 'gl-mb-4') do
.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') }
- docs_link_end = '</a>'.html_safe
@@ -15,17 +12,18 @@
- export_information = _('After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance.') % { strong_text_start: '<strong>'.html_safe, strong_text_end: '</strong>'.html_safe}
= export_information.html_safe
= link_to _('Learn more.'), help_page_path('user/group/settings/import_export.md'), target: '_blank', rel: 'noopener noreferrer'
- .bs-callout.bs-callout-info
- %p.gl-mb-0
- %p= _('The following items will be exported:')
- %ul
- - group_export_descriptions.each do |description|
- %li= description
- %p= _('The following items will NOT be exported:')
- %ul
- %li= _('Projects')
- %li= _('Runner tokens')
- %li= _('SAML discovery tokens')
+ = render Pajamas::AlertComponent.new(dismissible: false, alert_class: 'gl-mb-5') do
+ .gl-alert-body
+ %p.gl-mb-0
+ %p= _('The following items will be exported:')
+ %ul
+ - group_export_descriptions.each do |description|
+ %li= description
+ %p= _('The following items will NOT be exported:')
+ %ul
+ %li= _('Projects')
+ %li= _('Runner tokens')
+ %li= _('SAML discovery tokens')
- if group.export_file_exists?
= link_to _('Download export'), download_export_group_path(group),
rel: 'nofollow', method: :get, class: 'btn gl-button btn-default', data: { qa_selector: 'download_export_link' }
diff --git a/app/views/groups/settings/_permissions.html.haml b/app/views/groups/settings/_permissions.html.haml
index dd62c9e118d..1a2f770cd59 100644
--- a/app/views/groups/settings/_permissions.html.haml
+++ b/app/views/groups/settings/_permissions.html.haml
@@ -34,6 +34,8 @@
= render 'groups/settings/ip_restriction_registration_features_cta', f: f
= render_if_exists 'groups/settings/ip_restriction', f: f, group: @group
= render_if_exists 'groups/settings/allowed_email_domain', f: f, group: @group
+ - if Feature.enabled?(:group_wiki_settings_toggle, @group, default_enabled: :yaml)
+ = render_if_exists 'groups/settings/wiki', f: f, group: @group
= render 'groups/settings/lfs', f: f
= render 'groups/settings/project_creation_level', f: f, group: @group
= render 'groups/settings/subgroup_creation_level', f: f, group: @group
diff --git a/app/views/groups/settings/_remove_button.html.haml b/app/views/groups/settings/_remove_button.html.haml
index 1d5b7160049..66d6b516a86 100644
--- a/app/views/groups/settings/_remove_button.html.haml
+++ b/app/views/groups/settings/_remove_button.html.haml
@@ -1,8 +1,7 @@
- remove_form_id = local_assigns.fetch(:remove_form_id, nil)
- if group.paid?
- .gl-alert.gl-alert-info.gl-mb-5{ data: { testid: 'group-has-linked-subscription-alert' } }
- = sprite_icon('information-o', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
+ = render Pajamas::AlertComponent.new(dismissible: false, alert_class: 'gl-mb-5', alert_data: { testid: 'group-has-linked-subscription-alert' }) do
.gl-alert-body
= html_escape(_("This group can't be removed because it is linked to a subscription. To remove this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "<a href=\"#{help_page_path('subscriptions/index', anchor: 'change-the-linked-namespace')}\">".html_safe, linkEnd: '</a>'.html_safe }
diff --git a/app/views/groups/settings/_transfer.html.haml b/app/views/groups/settings/_transfer.html.haml
index dde8213b293..f5d9d0e2587 100644
--- a/app/views/groups/settings/_transfer.html.haml
+++ b/app/views/groups/settings/_transfer.html.haml
@@ -13,8 +13,7 @@
%li= s_('GroupSettings|You will need to update your local repositories to point to the new location.')
%li= s_("GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility.")
- if group.paid?
- .gl-alert.gl-alert-info.gl-mb-5
- = sprite_icon('information-o', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
+ = render Pajamas::AlertComponent.new(dismissible: false, alert_class: 'gl-mb-5') do
.gl-alert-body
= html_escape(_("This group can't be transferred because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "<a href=\"#{help_page_path('subscriptions/index', anchor: 'change-the-linked-namespace')}\">".html_safe, linkEnd: '</a>'.html_safe }
.js-transfer-group-form{ data: initial_data }
diff --git a/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml b/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml
index 12c0f15aff5..86c0a8d0c52 100644
--- a/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml
+++ b/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml
@@ -1,16 +1,16 @@
-= form_for group, url: update_auto_devops_group_settings_ci_cd_path(group), method: :patch do |f|
+= gitlab_ui_form_for group, url: update_auto_devops_group_settings_ci_cd_path(group), method: :patch do |f|
= form_errors(group)
%fieldset
.form-group
.card.auto-devops-card
.card-body
- .form-check
- = f.check_box :auto_devops_enabled, class: 'form-check-input', checked: group.auto_devops_enabled?
- = f.label :auto_devops_enabled, class: 'form-check-label' do
- %strong= s_('GroupSettings|Default to Auto DevOps pipeline for all projects within this group')
- = gl_badge_tag badge_for_auto_devops_scope(group), variant: :info
- .form-text.text-muted
- = s_('GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found.')
- = link_to _('Learn more.'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer'
+ - learn_more_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer'
+ - help_text = s_('GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found.')
+ - badge = gl_badge_tag badge_for_auto_devops_scope(group), variant: :info
+ - label = s_('GroupSettings|Default to Auto DevOps pipeline for all projects within this group')
+ = f.gitlab_ui_checkbox_component :auto_devops_enabled,
+ '%{label} %{badge}'.html_safe % { label: label, badge: badge.html_safe },
+ help_text: '%{help_text} %{learn_more_link}'.html_safe % { help_text: help_text, learn_more_link: learn_more_link },
+ checkbox_options: { checked: group.auto_devops_enabled? }
= f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mt-5'
diff --git a/app/views/groups/settings/ci_cd/show.html.haml b/app/views/groups/settings/ci_cd/show.html.haml
index 331cb31c626..f6dda9358f3 100644
--- a/app/views/groups/settings/ci_cd/show.html.haml
+++ b/app/views/groups/settings/ci_cd/show.html.haml
@@ -3,6 +3,7 @@
- expanded = expanded_by_default?
- general_expanded = @group.errors.empty? ? expanded : true
+= render_if_exists 'shared/minute_limit_banner', namespace: @group
-# Given we only have one field in this form which is also admin-only,
-# we don't want to show an empty section to non-admin users,
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index bb409190dd8..7bbc2f839f7 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -7,6 +7,8 @@
= render_if_exists 'shared/thanks_for_purchase_banner', plan_title: plan_title, quantity: params[:purchased_quantity].to_i
= render_if_exists 'shared/qrtly_reconciliation_alert', group: @group
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @group
+= render_if_exists 'shared/minute_limit_banner', namespace: @group
- if show_invite_banner?(@group)
= content_for :group_invite_members_banner do
@@ -37,16 +39,15 @@
.scrolling-tabs-container.inner-page-scroll-tabs
.fade-left= sprite_icon('chevron-lg-left', size: 12)
.fade-right= sprite_icon('chevron-lg-right', size: 12)
- %ul.nav-links.scrolling-tabs.mobile-separator.nav.nav-tabs
- %li.js-subgroups_and_projects-tab
- = link_to group_path, data: { target: 'div#subgroups_and_projects', action: 'subgroups_and_projects', toggle: 'tab'} do
- = _("Subgroups and projects")
- %li.js-shared-tab
- = link_to group_shared_path, data: { target: 'div#shared', action: 'shared', toggle: 'tab'} do
- = _("Shared projects")
- %li.js-archived-tab
- = link_to group_archived_path, data: { target: 'div#archived', action: 'archived', toggle: 'tab'} do
- = _("Archived projects")
+ -# `item_active` is set to `false` as the active state is set by `app/assets/javascripts/pages/groups/shared/group_details.js`
+ -# TODO: Replace this approach in https://gitlab.com/gitlab-org/gitlab/-/issues/23466
+ = gl_tabs_nav({ class: 'nav-links scrolling-tabs gl-display-flex gl-flex-grow-1 gl-flex-nowrap gl-border-0' }) do
+ = gl_tab_link_to group_path, item_active: false, tab_class: 'js-subgroups_and_projects-tab', data: { target: 'div#subgroups_and_projects', action: 'subgroups_and_projects', toggle: 'tab' } do
+ = _("Subgroups and projects")
+ = gl_tab_link_to group_shared_path, item_active: false, tab_class: 'js-shared-tab', data: { target: 'div#shared', action: 'shared', toggle: 'tab' } do
+ = _("Shared projects")
+ = gl_tab_link_to group_archived_path, item_active: false, tab_class: 'js-archived-tab', data: { target: 'div#archived', action: 'archived', toggle: 'tab' } do
+ = _("Archived projects")
.nav-controls.d-block.d-md-flex
.group-search
diff --git a/app/views/import/_githubish_status.html.haml b/app/views/import/_githubish_status.html.haml
index 8f18d68fd55..08f7cd57732 100644
--- a/app/views/import/_githubish_status.html.haml
+++ b/app/views/import/_githubish_status.html.haml
@@ -3,6 +3,7 @@
- extra_data = local_assigns.fetch(:extra_data, {})
- filterable = local_assigns.fetch(:filterable, true)
- paginatable = local_assigns.fetch(:paginatable, false)
+- default_namespace_path = (local_assigns[:default_namespace] || current_user.namespace).full_path
- provider_title = Gitlab::ImportSources.title(provider)
- header_title _("New project"), new_project_path
@@ -14,6 +15,7 @@
namespaces_path: import_available_namespaces_path,
repos_path: url_for([:status, :import, provider, format: :json]),
jobs_path: url_for([:realtime_changes, :import, provider, format: :json]),
+ default_target_namespace: default_namespace_path,
import_path: url_for([:import, provider, format: :json]),
filterable: filterable.to_s,
paginatable: paginatable.to_s }.merge(extra_data) }
diff --git a/app/views/import/github/new.html.haml b/app/views/import/github/new.html.haml
index ef6479f8be2..fbb27ba620a 100644
--- a/app/views/import/github/new.html.haml
+++ b/app/views/import/github/new.html.haml
@@ -10,7 +10,7 @@
= import_github_authorize_message
- if github_import_configured? && !has_ci_cd_only_params?
- = link_to status_import_github_path, class: 'gl-button btn btn-confirm' do
+ = link_to status_import_github_path(namespace_id: params[:namespace_id]), class: 'gl-button btn btn-confirm' do
= sprite_icon('github', css_class: 'gl-mr-2')
= title
@@ -23,6 +23,7 @@
= form_tag personal_access_token_import_github_path, method: :post do
.form-group
%label.label-bold= _('Personal Access Token')
+ = hidden_field_tag(:namespace_id, params[:namespace_id])
= text_field_tag :personal_access_token, '', class: 'form-control gl-form-input', placeholder: _('e.g. %{token}') % { token: '8d3f016698e...' }, data: { qa_selector: 'personal_access_token_field' }
%span.form-text.text-muted
= import_github_personal_access_token_message
diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml
index 820c2f06c8f..26b048c8195 100644
--- a/app/views/import/github/status.html.haml
+++ b/app/views/import/github/status.html.haml
@@ -7,4 +7,4 @@
- paginatable = Feature.enabled?(:remove_legacy_github_client)
-= render 'import/githubish_status', provider: 'github', paginatable: paginatable
+= render 'import/githubish_status', provider: 'github', paginatable: paginatable, default_namespace: @namespace
diff --git a/app/views/import/history/index.html.haml b/app/views/import/history/index.html.haml
new file mode 100644
index 00000000000..bca2d884848
--- /dev/null
+++ b/app/views/import/history/index.html.haml
@@ -0,0 +1,4 @@
+- add_to_breadcrumbs _('Create a new project'), new_project_path
+- page_title _('Import history')
+
+#import-history-mount-element{ data: { logo: asset_url('gitlab_logo.png') } }
diff --git a/app/views/import/shared/_errors.html.haml b/app/views/import/shared/_errors.html.haml
index 3e8a99c541a..aa6fcc445fd 100644
--- a/app/views/import/shared/_errors.html.haml
+++ b/app/views/import/shared/_errors.html.haml
@@ -1,8 +1,7 @@
- if @errors.present?
- = render 'shared/global_alert',
- variant: :danger,
+ = render Pajamas::AlertComponent.new(variant: :danger,
dismissible: false,
- alert_class: 'gl-mb-5' do
+ alert_class: 'gl-mb-5') do
.gl-alert-body
- @errors.each do |error|
= error
diff --git a/app/views/jira_connect/users/show.html.haml b/app/views/jira_connect/users/show.html.haml
index cf88acd6976..29805a2c42d 100644
--- a/app/views/jira_connect/users/show.html.haml
+++ b/app/views/jira_connect/users/show.html.haml
@@ -1,8 +1,14 @@
-.jira-connect-users-container.gl-text-center
- - user_link = link_to(current_user.to_reference, user_path(current_user), target: '_blank', rel: 'noopener noreferrer')
- %h2= _('You are signed in to GitLab as %{user_link}').html_safe % { user_link: user_link }
+.gl-text-center.gl-mx-auto.gl-pt-6
+ %h3.gl-mb-4
+ = _('You are signed in to GitLab as:')
- %p= s_('Integrations|You can now close this window and return to the GitLab for Jira application.')
+ .gl-display-flex.gl-flex-direction-column.gl-align-items-center.gl-mb-4
+ = link_to user_path(current_user), target: '_blank', rel: 'noopener noreferrer' do
+ = user_avatar_without_link(user: current_user, size: 60, css_class: 'gl-mr-0! gl-mb-2', has_tooltip: false)
+ = link_to current_user.to_reference, user_path(current_user), target: '_blank', rel: 'noopener noreferrer'
+
+ %p.gl-mb-6
+ = s_('JiraService|You can now close this window and%{br}return to the GitLab for Jira application.').html_safe % { br: '<br>'.html_safe }
- if @jira_app_link
%p= external_link s_('Integrations|Return to GitLab for Jira'), @jira_app_link, class: 'gl-button btn btn-confirm'
diff --git a/app/views/layouts/_diffs_colors_css.haml b/app/views/layouts/_diffs_colors_css.haml
new file mode 100644
index 00000000000..d2efa392bd9
--- /dev/null
+++ b/app/views/layouts/_diffs_colors_css.haml
@@ -0,0 +1,20 @@
+- deletion_color = local_assigns.fetch(:deletion, nil)
+- addition_color = local_assigns.fetch(:addition, nil)
+
+- if deletion_color.present? || request.path == profile_preferences_path
+ = stylesheet_link_tag_defer "highlight/diff_custom_colors_deletion"
+- if deletion_color.present?
+ - deletion_color_rgb = hex_color_to_rgb_array(deletion_color).join(',')
+ :css
+ :root {
+ --diff-deletion-color: rgba(#{deletion_color_rgb},0.2);
+ }
+
+- if addition_color.present? || request.path == profile_preferences_path
+ = stylesheet_link_tag_defer "highlight/diff_custom_colors_addition"
+- if addition_color.present?
+ - addition_color_rgb = hex_color_to_rgb_array(addition_color).join(',')
+ :css
+ :root {
+ --diff-addition-color: rgba(#{addition_color_rgb},0.2);
+ }
diff --git a/app/views/layouts/_header_search.html.haml b/app/views/layouts/_header_search.html.haml
index d2fe9a9a6ee..f7b7aac6de4 100644
--- a/app/views/layouts/_header_search.html.haml
+++ b/app/views/layouts/_header_search.html.haml
@@ -1,4 +1,4 @@
-#js-header-search.header-search{ data: { 'search-context' => header_search_context.to_json,
+#js-header-search.header-search.is-not-active.gl-relative{ data: { 'search-context' => header_search_context.to_json,
'search-path' => search_path,
'issues-path' => issues_dashboard_path,
'mr-path' => merge_requests_dashboard_path,
@@ -6,7 +6,10 @@
= form_tag search_path, method: :get do |_f|
.gl-search-box-by-type
= sprite_icon('search', css_class: 'gl-search-box-by-type-search-icon gl-icon')
- %input{ id: 'search', name: 'search', type: "text", placeholder: s_('GlobalSearch|Search GitLab'), class: 'form-control gl-form-input gl-search-box-by-type-input', autocomplete: 'off' }
+ %input{ id: 'search', name: 'search', type: "text", placeholder: s_('GlobalSearch|Search GitLab'),
+ class: 'form-control gl-form-input gl-search-box-by-type-input',
+ autocomplete: 'off',
+ data: { qa_selector: 'search_box' } }
= hidden_field_tag :group_id, header_search_context[:group][:id] if header_search_context[:group]
= hidden_field_tag :project_id, header_search_context[:project][:id] if header_search_context[:project]
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index a656b61dc8f..3c4b612f33f 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -20,6 +20,7 @@
= dispensable_render_if_exists "shared/namespace_user_cap_reached_alert"
= dispensable_render_if_exists "shared/new_user_signups_cap_reached_alert"
= yield :page_level_alert
+ = yield :user_over_limit_free_plan_alert
= yield :group_invite_members_banner
- unless @hide_breadcrumbs
= render "layouts/nav/breadcrumbs"
diff --git a/app/views/layouts/_snowplow.html.haml b/app/views/layouts/_snowplow.html.haml
index 8e9a5ea9406..0dad6d367c3 100644
--- a/app/views/layouts/_snowplow.html.haml
+++ b/app/views/layouts/_snowplow.html.haml
@@ -1,6 +1,6 @@
- return unless Gitlab::Tracking.enabled?
-- namespace = @group || @project&.namespace
+- namespace = @group || @project&.namespace || @namespace
= javascript_tag do
:plain
diff --git a/app/views/layouts/_startup_css.haml b/app/views/layouts/_startup_css.haml
index 67c871b95f5..64a86cf319e 100644
--- a/app/views/layouts/_startup_css.haml
+++ b/app/views/layouts/_startup_css.haml
@@ -1,6 +1,9 @@
- startup_filename_default = user_application_theme == 'gl-dark' ? 'dark' : 'general'
- startup_filename = local_assigns.fetch(:startup_filename, nil) || startup_filename_default
+- diffs_colors = user_diffs_colors
%style
= Rails.application.assets_manifest.find_sources("themes/#{user_application_theme_css_filename}.css").first.to_s.html_safe if user_application_theme_css_filename
= Rails.application.assets_manifest.find_sources("startup/startup-#{startup_filename}.css").first.to_s.html_safe
+
+= render 'layouts/diffs_colors_css', diffs_colors if diffs_colors.present? || request.path == profile_preferences_path
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 26e3d9b3b92..bdab5d7ea07 100644
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -1,6 +1,6 @@
- page_classes = page_class << @html_class
- page_classes = page_classes.flatten.compact
-- body_classes = [user_application_theme, user_tab_width, @body_class, client_class_list]
+- body_classes = [user_application_theme, user_tab_width, @body_class, client_class_list, *custom_diff_color_classes]
!!! 5
%html{ lang: I18n.locale, class: page_classes }
diff --git a/app/views/layouts/errors.html.haml b/app/views/layouts/errors.html.haml
index 57260ccedea..3ddd8c6780f 100644
--- a/app/views/layouts/errors.html.haml
+++ b/app/views/layouts/errors.html.haml
@@ -22,8 +22,8 @@
}
// We do not have rails_ujs here, so we're manually making a link trigger a form submit.
- document.getElementById('sign_out_link').addEventListener('click', function(e) {
+ document.querySelector('.js-sign-out-link')?.addEventListener('click', (e) => {
e.preventDefault();
- document.getElementById('sign_out_form').submit();
+ document.querySelector('.js-sign-out-form')?.submit();
});
}());
diff --git a/app/views/layouts/header/_current_user_dropdown.html.haml b/app/views/layouts/header/_current_user_dropdown.html.haml
index daa48980c5b..11dd8ba6c08 100644
--- a/app/views/layouts/header/_current_user_dropdown.html.haml
+++ b/app/views/layouts/header/_current_user_dropdown.html.haml
@@ -27,7 +27,6 @@
%li
= link_to s_("CurrentUser|Preferences"), profile_preferences_path
= render_if_exists 'layouts/header/buy_pipeline_minutes', project: @project, namespace: @group
- = render_if_exists 'layouts/header/upgrade'
- if current_user_menu?(:help)
%li.divider.d-md-none
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 512a4185bee..c15a5e54a42 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -40,7 +40,7 @@
- search_menu_item = top_nav_search_menu_item_attrs
%li.nav-item.header-search-new.d-none.d-lg-block.m-auto
- unless current_controller?(:search)
- - if Feature.enabled?(:new_header_search)
+ - if Feature.enabled?(:new_header_search, default_enabled: :yaml)
= render 'layouts/header_search'
- else
= render 'layouts/search'
diff --git a/app/views/layouts/header/_registration_enabled_callout.html.haml b/app/views/layouts/header/_registration_enabled_callout.html.haml
index d1d23c86c81..affee15c4d0 100644
--- a/app/views/layouts/header/_registration_enabled_callout.html.haml
+++ b/app/views/layouts/header/_registration_enabled_callout.html.haml
@@ -1,11 +1,11 @@
- return unless show_registration_enabled_user_callout?
-= render 'shared/global_alert',
- title: _('Anyone can register for an account.'),
+= render Pajamas::AlertComponent.new(title: _('Anyone can register for an account.'),
variant: :warning,
alert_class: 'js-registration-enabled-callout',
- alert_data: { feature_id: Users::CalloutsHelper::REGISTRATION_ENABLED_CALLOUT, dismiss_endpoint: callouts_path },
- close_button_data: { testid: 'close-registration-enabled-callout' } do
+ alert_data: { feature_id: Users::CalloutsHelper::REGISTRATION_ENABLED_CALLOUT,
+ dismiss_endpoint: callouts_path },
+ close_button_data: { testid: 'close-registration-enabled-callout' }) do
.gl-alert-body
= _('Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable.')
.gl-alert-actions
diff --git a/app/views/layouts/header/_storage_enforcement_banner.html.haml b/app/views/layouts/header/_storage_enforcement_banner.html.haml
index 851fc57e44d..92c02d6ecfd 100644
--- a/app/views/layouts/header/_storage_enforcement_banner.html.haml
+++ b/app/views/layouts/header/_storage_enforcement_banner.html.haml
@@ -3,7 +3,12 @@
- banner_info = storage_enforcement_banner_info(namespace)
- return unless banner_info.present?
-= render 'shared/global_alert', variant: :warning, alert_class: 'js-storage-enforcement-banner', alert_data: { feature_id: banner_info[:callouts_feature_name], dismiss_endpoint: banner_info[:callouts_path], group_id: namespace.id, defer_links: "true" } do
+= render Pajamas::AlertComponent.new(variant: :warning,
+ alert_class: 'js-storage-enforcement-banner',
+ alert_data: { feature_id: banner_info[:callouts_feature_name],
+ dismiss_endpoint: banner_info[:callouts_path],
+ group_id: namespace.id,
+ defer_links: "true" }) do
.gl-alert-body
= banner_info[:text]
= banner_info[:learn_more_link]
diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml
index 52eea73ecd2..94c708783e4 100644
--- a/app/views/layouts/nav/sidebar/_admin.html.haml
+++ b/app/views/layouts/nav/sidebar/_admin.html.haml
@@ -53,7 +53,7 @@
= _('Gitaly Servers')
= nav_link(controller: admin_analytics_nav_links) do
- = link_to admin_dev_ops_report_path, data: { qa_selector: 'admin_analytics_link' }, class: 'has-sub-items' do
+ = link_to admin_dev_ops_reports_path, data: { qa_selector: 'admin_analytics_link' }, class: 'has-sub-items' do
.nav-icon-container
= sprite_icon('chart')
%span.nav-item-name
@@ -61,12 +61,12 @@
%ul.sidebar-sub-level-items{ data: { qa_selector: 'admin_sidebar_analytics_submenu_content' } }
= nav_link(controller: admin_analytics_nav_links, html_options: { class: "fly-out-top-item" }) do
- = link_to admin_dev_ops_report_path do
+ = link_to admin_dev_ops_reports_path do
%strong.fly-out-top-item-name
= _('Analytics')
%li.divider.fly-out-top-item
= nav_link(controller: :dev_ops_report) do
- = link_to admin_dev_ops_report_path, title: _('DevOps Reports') do
+ = link_to admin_dev_ops_reports_path, title: _('DevOps Reports') do
%span
= _('DevOps Reports')
= nav_link(controller: :usage_trends) do
@@ -269,11 +269,10 @@
= link_to metrics_and_profiling_admin_application_settings_path, title: _('Metrics and profiling'), class: 'qa-admin-settings-metrics-and-profiling-item' do
%span
= _('Metrics and profiling')
- - if Feature.enabled?(:admin_application_settings_service_usage_data_center, default_enabled: :yaml)
- = nav_link(path: ['application_settings#service_usage_data']) do
- = link_to service_usage_data_admin_application_settings_path, title: _('Service usage data') do
- %span
- = _('Service usage data')
+ = nav_link(path: ['application_settings#service_usage_data']) do
+ = link_to service_usage_data_admin_application_settings_path, title: _('Service usage data') do
+ %span
+ = _('Service usage data')
= nav_link(path: 'application_settings#network') do
= link_to network_admin_application_settings_path, title: _('Network'), data: { qa_selector: 'admin_settings_network_item' } do
%span
diff --git a/app/views/notify/_note_email.html.haml b/app/views/notify/_note_email.html.haml
index 55984472047..2f0e62981ec 100644
--- a/app/views/notify/_note_email.html.haml
+++ b/app/views/notify/_note_email.html.haml
@@ -2,16 +2,18 @@
- diff_limit = local_assigns.fetch(:diff_limit, nil)
- target_url = local_assigns.fetch(:target_url, @target_url)
- note_style = local_assigns.fetch(:note_style, "")
+- include_stylesheet_link = local_assigns.fetch(:include_stylesheet_link, true)
-- discussion = note.discussion if note.part_of_discussion?
+- author = local_assigns.fetch(:author) { note.author }
+- discussion = local_assigns.fetch(:discussion) { note.discussion } if note.part_of_discussion?
%p{ style: "color: #777777;" }
= succeed ':' do
- = link_to note.author_name, user_url(note.author)
+ = link_to author.name, user_url(author)
- if discussion.nil?
= link_to 'commented', target_url
- else
- - if note.start_of_discussion?
+ - if discussion.first_note == note
started a new
- else
commented on a
@@ -22,14 +24,15 @@
= link_to 'discussion', target_url
- if discussion&.diff_discussion? && discussion.on_text?
- = content_for :head do
- = stylesheet_link_tag 'mailers/highlighted_diff_email'
+ - if include_stylesheet_link
+ = content_for :head do
+ = stylesheet_link_tag 'mailers/highlighted_diff_email'
- %table.code
+ %table.code.gl-mb-5
= render partial: "projects/diffs/email_line",
collection: discussion.truncated_diff_lines(diff_limit: diff_limit),
as: :line,
locals: { diff_file: discussion.diff_file }
.md{ style: note_style }
- = markdown(note.note, pipeline: :email, author: note.author, current_user: @recipient, issuable_reference_expansion_enabled: true)
+ = markdown(note.note, pipeline: :email, author: author, current_user: @recipient, issuable_reference_expansion_enabled: true)
diff --git a/app/views/notify/_note_email.text.erb b/app/views/notify/_note_email.text.erb
index 8e2f7e6f76e..8853519fb8d 100644
--- a/app/views/notify/_note_email.text.erb
+++ b/app/views/notify/_note_email.text.erb
@@ -1,13 +1,14 @@
<% note = local_assigns.fetch(:note, @note) -%>
<% diff_limit = local_assigns.fetch(:diff_limit, nil) -%>
<% target_url = local_assigns.fetch(:target_url, @target_url) -%>
-<% discussion = note.discussion if note.part_of_discussion? -%>
+<% author = local_assigns.fetch(:author) { note.author } -%>
+<% discussion = local_assigns.fetch(:discussion) { note.discussion } if note.part_of_discussion? -%>
-<%= sanitize_name(note.author_name) -%>
+<%= sanitize_name(author.name) -%>
<% if discussion.nil? -%>
<%= 'commented' -%>:
<% else -%>
-<% if note.start_of_discussion? -%>
+<% if discussion.first_note == note -%>
<%= 'started a new discussion' -%>
<% else -%>
<%= 'commented on a discussion' -%>
diff --git a/app/views/notify/issue_due_email.html.haml b/app/views/notify/issue_due_email.html.haml
index e512d7732e2..3208d061928 100644
--- a/app/views/notify/issue_due_email.html.haml
+++ b/app/views/notify/issue_due_email.html.haml
@@ -1,11 +1,11 @@
%p.details
- #{link_to @issue.author_name, user_url(@issue.author)}'s issue #{issue_reference_link(@issue)} is due soon.
+ = sprintf(s_("Notify|%{author_link}'s issue %{issue_reference_link} is due soon."), { author_link: link_to(@issue.author_name, user_url(@issue.author)), issue_reference_link: issue_reference_link(@issue) })
- if @issue.assignees.any?
%p
= assignees_label(@issue)
%p
- This issue is due on: #{@issue.due_date.to_s(:medium)}
+ = sprintf(s_('Notify|This issue is due on: %{issue_due_date}'), { issue_due_date: @issue.due_date.to_s(:medium) }).html_safe
- if @issue.description
.md
diff --git a/app/views/notify/issue_moved_email.html.haml b/app/views/notify/issue_moved_email.html.haml
index b766cb1a523..c77a863d1a4 100644
--- a/app/views/notify/issue_moved_email.html.haml
+++ b/app/views/notify/issue_moved_email.html.haml
@@ -1,9 +1,7 @@
%p
- Issue was moved to another project.
+ = s_('Notify|Issue was moved to another project.')
- if @can_access_project
%p
- New issue:
- = link_to project_issue_url(@new_project, @new_issue) do
- = @new_issue.title
+ = sprintf(s_('Notify|New issue: %{project_issue_url}'), { project_issue_url: link_to(@new_issue.title, project_issue_url(@new_project, @new_issue)) } ).html_safe
- else
- You don't have access to the project.
+ = s_("Notify|You don't have access to the project.")
diff --git a/app/views/notify/issue_status_changed_email.html.haml b/app/views/notify/issue_status_changed_email.html.haml
index 66e73a9b03f..545f9c006af 100644
--- a/app/views/notify/issue_status_changed_email.html.haml
+++ b/app/views/notify/issue_status_changed_email.html.haml
@@ -1,2 +1,2 @@
%p
- Issue was #{@issue_status} by #{sanitize_name(@updated_by.name)}
+ = sprintf(s_('Notify|Issue was %{issue_status} by %{updated_by}'), { issue_status: @issue_status, updated_by: sanitize_name(@updated_by.name) }).html_safe
diff --git a/app/views/notify/merge_request_status_email.html.haml b/app/views/notify/merge_request_status_email.html.haml
index 49f2366c594..8e8d27b3cec 100644
--- a/app/views/notify/merge_request_status_email.html.haml
+++ b/app/views/notify/merge_request_status_email.html.haml
@@ -1,3 +1,3 @@
%p
- Merge request #{merge_request_reference_link(@merge_request)}
- was #{@mr_status} by #{sanitize_name(@updated_by.name)}
+ = sprintf(s_('Notify|Merge request %{merge_request} was %{mr_status} by %{updated_by}'),
+ { merge_request: merge_request_reference_link(@merge_request), mr_status: @mr_status, updated_by: sanitize_name(@updated_by.name) }).html_safe
diff --git a/app/views/notify/merge_request_status_email.text.haml b/app/views/notify/merge_request_status_email.text.haml
index 1a8f848218c..f3845b2b910 100644
--- a/app/views/notify/merge_request_status_email.text.haml
+++ b/app/views/notify/merge_request_status_email.text.haml
@@ -1,9 +1,9 @@
-Merge request #{@merge_request.to_reference} was #{@mr_status} by #{sanitize_name(@updated_by.name)}
+= sprintf(s_('Notify|Merge request %{merge_request} was %{mr_status}'), { merge_request: @merge_request.to_reference, mr_status: sanitize_name(@updated_by.name) })
-Merge request URL: #{project_merge_request_url(@merge_request.target_project, @merge_request)}
+= sprintf(s_('Notify|Merge request URL: %{merge_request_url}'), { merge_request_url: project_merge_request_url(@merge_request.target_project, @merge_request) })
= merge_path_description(@merge_request, 'to')
-Author: #{sanitize_name(@merge_request.author_name)}
+= sprintf(s_('Notify|Author: %{author_name}'), { author_name: sanitize_name(@merge_request.author_name) })
= assignees_label(@merge_request)
= reviewers_label(@merge_request)
diff --git a/app/views/notify/merge_request_unmergeable_email.html.haml b/app/views/notify/merge_request_unmergeable_email.html.haml
index fddf9eaf95a..6bcff28985c 100644
--- a/app/views/notify/merge_request_unmergeable_email.html.haml
+++ b/app/views/notify/merge_request_unmergeable_email.html.haml
@@ -1,2 +1,2 @@
%p
- Merge request #{merge_request_reference_link(@merge_request)} can no longer be merged due to conflict.
+ = sprintf(s_('Notify|Merge request %{merge_request} can no longer be merged due to conflict.'), { merge_request: merge_request_reference_link(@merge_request) }).html_safe
diff --git a/app/views/notify/merge_request_unmergeable_email.text.haml b/app/views/notify/merge_request_unmergeable_email.text.haml
index 3db5f21e6c2..22d56e73ca8 100644
--- a/app/views/notify/merge_request_unmergeable_email.text.haml
+++ b/app/views/notify/merge_request_unmergeable_email.text.haml
@@ -1,9 +1,9 @@
-Merge request #{@merge_request.to_reference} can no longer be merged due to conflict.
+= sprintf(s_('Notify|Merge request %{merge_request} can no longer be merged due to conflict.'), { merge_request: @merge_request.to_reference })
-Merge request URL: #{project_merge_request_url(@merge_request.target_project, @merge_request)}
+= sprintf(s_('Notify|Merge request URL: %{merge_request_url}'), { merge_request_url: project_merge_request_url(@merge_request.target_project, @merge_request) })
= merge_path_description(@merge_request, 'to')
-Author: #{sanitize_name(@merge_request.author_name)}
+= sprintf(s_('Author: %{author_name}'), { author_name: sanitize_name(@merge_request.author_name) })
= assignees_label(@merge_request)
= reviewers_label(@merge_request)
diff --git a/app/views/notify/merged_merge_request_email.html.haml b/app/views/notify/merged_merge_request_email.html.haml
index f0dadd9ce91..0622e2f6ffb 100644
--- a/app/views/notify/merged_merge_request_email.html.haml
+++ b/app/views/notify/merged_merge_request_email.html.haml
@@ -1,2 +1,2 @@
%p
- Merge request #{merge_request_reference_link(@merge_request)} was merged
+ = sprintf(s_('Notify|Merge request %{merge_request} was merged'), { merge_request: merge_request_reference_link(@merge_request) }).html_safe
diff --git a/app/views/notify/merged_merge_request_email.text.haml b/app/views/notify/merged_merge_request_email.text.haml
index 91f920dec21..d6ec916641d 100644
--- a/app/views/notify/merged_merge_request_email.text.haml
+++ b/app/views/notify/merged_merge_request_email.text.haml
@@ -1,9 +1,9 @@
-Merge request #{@merge_request.to_reference} was merged
+= sprintf(s_('Notify|Merge request %{merge_request} was merged'), { merge_request: @merge_request.to_reference })
-Merge request URL: #{project_merge_request_url(@merge_request.target_project, @merge_request)}
+= sprintf(s_('Notify|Merge request URL: %{merge_request_url}'), { merge_request_url: project_merge_request_url(@merge_request.target_project, @merge_request) })
= merge_path_description(@merge_request, 'to')
-Author: #{sanitize_name(@merge_request.author_name)}
+= sprintf(s_('Notify|Author: %{author_name}'), { author_name: sanitize_name(@merge_request.author_name) })
= assignees_label(@merge_request)
= reviewers_label(@merge_request)
diff --git a/app/views/notify/new_email_address_added_email.erb b/app/views/notify/new_email_address_added_email.erb
new file mode 100644
index 00000000000..3af1953c902
--- /dev/null
+++ b/app/views/notify/new_email_address_added_email.erb
@@ -0,0 +1,5 @@
+<%= say_hi(@user) %>
+
+<%= new_email_address_added_text(@email) %>
+
+<%= remove_email_address_text %>
diff --git a/app/views/notify/new_email_address_added_email.haml b/app/views/notify/new_email_address_added_email.haml
new file mode 100644
index 00000000000..6d00aaedfd5
--- /dev/null
+++ b/app/views/notify/new_email_address_added_email.haml
@@ -0,0 +1,6 @@
+%p
+ = say_hi(@user)
+%p
+ = new_email_address_added_text(@email)
+%p
+ = remove_email_address_text(format: :html)
diff --git a/app/views/notify/new_merge_request_email.html.haml b/app/views/notify/new_merge_request_email.html.haml
index f67ac5f8fb2..1542d5bba85 100644
--- a/app/views/notify/new_merge_request_email.html.haml
+++ b/app/views/notify/new_merge_request_email.html.haml
@@ -2,18 +2,17 @@
= html_escape(_('%{user} created a merge request: %{mr_link}')) % { user: link_to(@merge_request.author_name, user_url(@merge_request.author)),
mr_link: merge_request_reference_link(@merge_request) }
-%p
- .branch
- = merge_path_description(@merge_request, 'to')
- .author
- Author: #{@merge_request.author_name}
- .assignee
- = assignees_label(@merge_request)
- .reviewer
- = reviewers_label(@merge_request)
- .approvers
- = render_if_exists 'notify/merge_request_approvers', presenter: @mr_presenter
+.branch
+ = merge_path_description(@merge_request, 'to')
+.author
+ Author: #{@merge_request.author_name}
+.assignee
+ = assignees_label(@merge_request)
+.reviewer
+ = reviewers_label(@merge_request)
+.approvers
+ = render_if_exists 'notify/merge_request_approvers', presenter: @mr_presenter
- if @merge_request.description
- .md
+ .md.gl-mt-5
= markdown(@merge_request.description, pipeline: :email, author: @merge_request.author, current_user: @recipient, issuable_reference_expansion_enabled: true)
diff --git a/app/views/notify/new_review_email.html.haml b/app/views/notify/new_review_email.html.haml
index 11da7723d8d..afc1bd68215 100644
--- a/app/views/notify/new_review_email.html.haml
+++ b/app/views/notify/new_review_email.html.haml
@@ -1,3 +1,7 @@
+- if @include_diff_discussion_stylesheet
+ = content_for :head do
+ = stylesheet_link_tag 'mailers/highlighted_diff_email'
+
%table{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;margin:0 auto;border-collapse:separate;border-spacing:0;" }
%tbody
%tr
@@ -5,12 +9,16 @@
%table{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;border-collapse:separate;border-spacing:0;" }
%tbody
%tr
- %td{ style: "color:#333333;border-bottom:1px solid #ededed;font-size:15px;font-weight:bold;line-height:1.4;padding: 20px 0;" }
+ %td{ style: "color:#333333;border-bottom:1px solid #ededed;font-weight:bold;line-height:1.4;padding: 20px 0;" }
- mr_link = link_to(@merge_request.to_reference(@project), project_merge_request_url(@project, @merge_request))
- mr_author_link = link_to(@author_name, user_url(@author))
= _('Merge request %{mr_link} was reviewed by %{mr_author}').html_safe % { mr_link: mr_link, mr_author: mr_author_link }
%tr
- %td{ style: "overflow:hidden;font-size:14px;line-height:1.4;display:grid;" }
+ %td{ style: "overflow:hidden;line-height:1.4;display:grid;" }
- @notes.each do |note|
+ -# Get preloaded note discussion
+ - discussion = @discussions[note.discussion_id] if note.part_of_discussion?
+ -# Preload project for discussions first note
+ - discussion.first_note.project = @project if discussion&.first_note
- target_url = project_merge_request_url(@project, @merge_request, anchor: "note_#{note.id}")
- = render 'note_email', note: note, diff_limit: 3, target_url: target_url, note_style: "border-bottom:1px solid #ededed;"
+ = render 'note_email', note: note, diff_limit: 3, target_url: target_url, note_style: "border-bottom:1px solid #ededed; padding-bottom: 1em;", include_stylesheet_link: false, discussion: discussion, author: @author
diff --git a/app/views/notify/new_review_email.text.erb b/app/views/notify/new_review_email.text.erb
index 164735abad0..7bf878aefd0 100644
--- a/app/views/notify/new_review_email.text.erb
+++ b/app/views/notify/new_review_email.text.erb
@@ -4,8 +4,10 @@
--
<% @notes.each_with_index do |note, index| %>
+ <!-- Get preloaded note discussion-->
+ <% discussion = @discussions[note.discussion_id] if note.part_of_discussion?%>
<% target_url = project_merge_request_url(@project, @merge_request, anchor: "note_#{note.id}") %>
- <%= render 'note_email', note: note, diff_limit: 3, target_url: target_url %>
+ <%= render 'note_email', note: note, diff_limit: 3, target_url: target_url, discussion: discussion, author: @author %>
<% if index != @notes.length-1 %>
--
diff --git a/app/views/notify/push_to_merge_request_email.html.haml b/app/views/notify/push_to_merge_request_email.html.haml
index 3e9f9b442e0..5197a1bdd08 100644
--- a/app/views/notify/push_to_merge_request_email.html.haml
+++ b/app/views/notify/push_to_merge_request_email.html.haml
@@ -3,24 +3,25 @@
pushed new commits to merge request
= merge_request_reference_link(@merge_request)
-- if @existing_commits.any?
- - count = @existing_commits.size
+- if @total_existing_commits_count > 0
%ul
%li
- - if count == 1
+ - if @total_existing_commits_count == 1
- commit_id = @existing_commits.first[:short_id]
= link_to(commit_id, project_commit_url(@merge_request.target_project, commit_id))
- else
= link_to(project_compare_url(@merge_request.target_project, from: @existing_commits.first[:short_id], to: @existing_commits.last[:short_id])) do
#{@existing_commits.first[:short_id]}...#{@existing_commits.last[:short_id]}
= precede '&nbsp;- ' do
- - commits_text = "#{count} commit".pluralize(count)
+ - commits_text = "#{@total_existing_commits_count} commit".pluralize(@total_existing_commits_count)
#{commits_text} from branch `#{@merge_request.target_branch}`
-- if @new_commits.any?
+- if @total_new_commits_count > 0
%ul
- @new_commits.each do |commit|
%li
= link_to(commit[:short_id], project_commit_url(@merge_request.target_project, commit[:short_id]))
= precede ' - ' do
#{commit[:title]}
+ - if @total_stripped_new_commits_count > 0
+ %li And #{@total_stripped_new_commits_count} more
diff --git a/app/views/notify/service_desk_new_note_email.html.haml b/app/views/notify/service_desk_new_note_email.html.haml
index 0c16cf3315f..02f6b3914c9 100644
--- a/app/views/notify/service_desk_new_note_email.html.haml
+++ b/app/views/notify/service_desk_new_note_email.html.haml
@@ -1,5 +1,5 @@
- if Gitlab::CurrentSettings.email_author_in_body
- %div
+ .gl-mb-5
= _("%{author_link} wrote:").html_safe % { author_link: link_to(@note.author_name, user_url(@note.author)) }
.md
= markdown(@note.note, pipeline: :email, author: @note.author, issuable_reference_expansion_enabled: true)
diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml
index fdcee3670b7..8568e61aa33 100644
--- a/app/views/profiles/accounts/show.html.haml
+++ b/app/views/profiles/accounts/show.html.haml
@@ -2,18 +2,15 @@
- @content_class = "limit-container-width" unless fluid_layout
- if current_user.ldap_user?
- = render 'shared/global_alert',
- variant: :info,
- alert_class: 'gl-my-5',
- dismissible: false do
+ = render Pajamas::AlertComponent.new(alert_class: 'gl-my-5',
+ dismissible: false) do
.gl-alert-body
= s_('Profiles|Some options are unavailable for LDAP accounts')
- if params[:two_factor_auth_enabled_successfully]
- = render 'shared/global_alert',
- variant: :success,
+ = render Pajamas::AlertComponent.new(variant: :success,
alert_class: 'gl-my-5',
- close_button_class: 'js-close-2fa-enabled-success-alert' do
+ close_button_class: 'js-close-2fa-enabled-success-alert') do
.gl-alert-body
= html_escape(_('You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}.')) % { anchorOpen: '<a href="%{href}">'.html_safe % { href: help_page_path('user/profile/account/two_factor_authentication', anchor: 'generate-new-recovery-codes-using-ssh') }, anchorClose: '</a>'.html_safe }
diff --git a/app/views/profiles/keys/_form.html.haml b/app/views/profiles/keys/_form.html.haml
index bebbe49a485..941b8545745 100644
--- a/app/views/profiles/keys/_form.html.haml
+++ b/app/views/profiles/keys/_form.html.haml
@@ -9,9 +9,9 @@
%p.form-text.text-muted= s_('Profiles|Begins with %{ssh_key_algorithms}.') % { ssh_key_algorithms: ssh_key_allowed_algorithms }
.form-row
.col.form-group
- = f.label :title, _('Title'), class: 'label-bold'
- = f.text_field :title, class: "form-control gl-form-input input-lg qa-key-title-field", required: true, placeholder: s_('Profiles|e.g. My MacBook key')
- %p.form-text.text-muted= s_('Profiles|Give your individual key a title. This will be publicly visible.')
+ = f.label :title, s_('Profiles|Title'), class: 'label-bold'
+ = f.text_field :title, class: "form-control gl-form-input input-lg qa-key-title-field", required: true, placeholder: s_('Profiles|Example: MacBook key')
+ %p.form-text.text-muted= s_('Profiles|Key titles are publicly visible.')
.col.form-group
= f.label :expires_at, s_('Profiles|Expiration date'), class: 'label-bold'
diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml
index 7d4c3b6115f..5c8acc053f4 100644
--- a/app/views/profiles/keys/index.html.haml
+++ b/app/views/profiles/keys/index.html.haml
@@ -11,7 +11,7 @@
%h5.gl-mt-0
= _('Add an SSH key')
%p.profile-settings-content
- - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('ssh/index.md') }
+ - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/ssh.md') }
= _('Add an SSH key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}').html_safe % {help_link_start: help_link_start, help_link_end: '</a>'.html_safe }
= render 'form'
%hr
diff --git a/app/views/profiles/notifications/_email_settings.html.haml b/app/views/profiles/notifications/_email_settings.html.haml
index f2121199412..b4db99a8bd4 100644
--- a/app/views/profiles/notifications/_email_settings.html.haml
+++ b/app/views/profiles/notifications/_email_settings.html.haml
@@ -5,6 +5,4 @@
.help-block
= local_assigns.fetch(:help_text, nil)
.form-group
- %label{ for: 'user_email_opted_in' }
- = form.check_box :email_opted_in
- %span= _('Receive product marketing emails')
+ = form.gitlab_ui_checkbox_component :email_opted_in, _('Receive product marketing emails')
diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml
index 22cb95b346a..5d74bbe9971 100644
--- a/app/views/profiles/notifications/show.html.haml
+++ b/app/views/profiles/notifications/show.html.haml
@@ -3,16 +3,11 @@
%div
- if @user.errors.any?
- .gl-alert.gl-alert-danger.gl-my-5
- .gl-alert-container
- %button.js-close.btn.gl-dismiss-btn.btn-default.btn-sm.gl-button.btn-default-tertiary.btn-icon{ type: 'button', 'aria-label' => _('Dismiss') }
- = sprite_icon('close', css_class: 'gl-icon')
- = sprite_icon('error', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-content
- .gl-alert-body
- %ul
- - @user.errors.full_messages.each do |msg|
- %li= msg
+ = render Pajamas::AlertComponent.new(variant: :danger) do
+ .gl-alert-body
+ %ul
+ - @user.errors.full_messages.each do |msg|
+ %li= msg
= hidden_field_tag :notification_type, 'global'
.row.gl-mt-3
@@ -27,7 +22,7 @@
%h5.gl-mt-0
= _('Global notification settings')
- = form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications gl-mt-3' } do |f|
+ = gitlab_ui_form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications gl-mt-3' } do |f|
= render_if_exists 'profiles/notifications/email_settings', form: f
= label_tag :global_notification_level, "Global notification level", class: "label-bold"
@@ -39,10 +34,9 @@
.clearfix
- = form_for @user, url: profile_notifications_path, method: :put do |f|
- %label{ for: 'user_notified_of_own_activity' }
- = f.check_box :notified_of_own_activity
- %span= _('Receive notifications about your own activity')
+ = gitlab_ui_form_for @user, url: profile_notifications_path, method: :put do |f|
+ .form-group
+ = f.gitlab_ui_checkbox_component :notified_of_own_activity, _('Receive notifications about your own activity')
%hr
%h5
diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml
index 48be2001c9c..3fb48f3d3e3 100644
--- a/app/views/profiles/preferences/show.html.haml
+++ b/app/views/profiles/preferences/show.html.haml
@@ -8,7 +8,7 @@
- Gitlab::Themes.each do |theme|
= stylesheet_link_tag "themes/#{theme.css_filename}" if theme.css_filename
-= form_for @user, url: profile_preferences_path, remote: true, method: :put, html: { id: "profile-preferences-form" } do |f|
+= gitlab_ui_form_for @user, url: profile_preferences_path, remote: true, method: :put, html: { id: "profile-preferences-form" } do |f|
.row.gl-mt-3.js-preferences-form.js-search-settings-section
.col-lg-4.application-theme#navigation-theme
%h4.gl-mt-0
@@ -45,6 +45,19 @@
%hr
.row.js-preferences-form.js-search-settings-section
+ .col-lg-4.profile-settings-sidebar#diffs-colors
+ %h4.gl-mt-0
+ = s_('Preferences|Diff colors')
+ %p
+ = s_('Preferences|Customize the colors of removed and added lines in diffs.')
+ .col-lg-8
+ .form-group
+ #js-profile-preferences-diffs-colors-app{ data: user_diffs_colors }
+
+ .col-sm-12
+ %hr
+
+ .row.js-preferences-form.js-search-settings-section
.col-lg-4.profile-settings-sidebar#behavior
%h4.gl-mt-0
= s_('Preferences|Behavior')
@@ -74,27 +87,19 @@
= f.select :project_view, project_view_choices, {}, class: 'select2'
.form-text.text-muted
= s_('Preferences|Choose what content you want to see on a project’s overview page.')
- .form-group.form-check
- = f.check_box :render_whitespace_in_code, class: 'form-check-input'
- = f.label :render_whitespace_in_code, class: 'form-check-label' do
- = s_('Preferences|Render whitespace characters in the Web IDE')
- .form-group.form-check
- = f.check_box :show_whitespace_in_diffs, class: 'form-check-input'
- = f.label :show_whitespace_in_diffs, class: 'form-check-label' do
- = s_('Preferences|Show whitespace changes in diffs')
- .form-group.form-check
- = f.check_box :view_diffs_file_by_file, class: 'form-check-input'
- = f.label :view_diffs_file_by_file, class: 'form-check-label' do
- = s_("Preferences|Show one file at a time on merge request's Changes tab")
- .form-text.text-muted
- = s_("Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser.")
- .form-group.form-check
- = f.check_box :markdown_surround_selection, class: 'form-check-input'
- = f.label :markdown_surround_selection, class: 'form-check-label' do
- = s_('Preferences|Surround text selection when typing quotes or brackets')
- .form-text.text-muted
- - supported_characters = %w(" ' ` \( [ { < * _).map {|char| "<code>#{char}</code>" }.join(', ')
- = sprintf(s_( "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."), { supported_characters: supported_characters }).html_safe
+ .form-group
+ = f.gitlab_ui_checkbox_component :render_whitespace_in_code, s_('Preferences|Render whitespace characters in the Web IDE')
+ .form-group
+ = f.gitlab_ui_checkbox_component :show_whitespace_in_diffs, s_('Preferences|Show whitespace changes in diffs')
+ .form-group
+ = f.gitlab_ui_checkbox_component :view_diffs_file_by_file,
+ s_("Preferences|Show one file at a time on merge request's Changes tab"),
+ help_text: s_("Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser.")
+ .form-group
+ - supported_characters = %w(" ' ` &#40; [ { < * _).map {|char| "<code>#{char}</code>" }.join(', ')
+ = f.gitlab_ui_checkbox_component :markdown_surround_selection,
+ s_('Preferences|Surround text selection when typing quotes or brackets'),
+ help_text: sprintf(s_( "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."), { supported_characters: supported_characters }).html_safe
.form-group
= f.label :tab_width, s_('Preferences|Tab width'), class: 'label-bold'
@@ -138,16 +143,12 @@
= succeed '.' do
= link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'time-preferences'), target: '_blank', rel: 'noopener noreferrer'
.col-lg-8
- .form-group.form-check
- = f.check_box :time_display_relative, class: 'form-check-input'
- = f.label :time_display_relative, class: 'form-check-label' do
- = s_('Preferences|Use relative times')
- .form-text.text-muted
- = s_('Preferences|For example: 30 minutes ago.')
+ .form-group
+ = f.gitlab_ui_checkbox_component :time_display_relative,
+ s_('Preferences|Use relative times'),
+ help_text: s_('Preferences|For example: 30 minutes ago.')
- if Feature.enabled?(:user_time_settings)
- .form-group.form-check
- = f.check_box :time_format_in_24h, class: 'form-check-input'
- = f.label :time_format_in_24h, class: 'form-check-label' do
- = s_('Preferences|Display time in 24-hour format')
+ .form-group
+ = f.gitlab_ui_checkbox_component :time_format_in_24h, s_('Preferences|Display time in 24-hour format')
#js-profile-preferences-app{ data: data_attributes }
diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml
index 5f8b21b2646..3ae64643420 100644
--- a/app/views/profiles/two_factor_auths/show.html.haml
+++ b/app/views/profiles/two_factor_auths/show.html.haml
@@ -34,13 +34,15 @@
= _('To add the entry manually, provide the following details to the application on your phone.')
%p.gl-mt-0.gl-mb-0
= _('Account: %{account}') % { account: @account_string }
- %p.gl-mt-0.gl-mb-0{ data: { qa_selector: 'otp_secret_content' } }
+ %p.gl-mt-0.gl-mb-0.two-factor-secret{ data: { qa_selector: 'otp_secret_content' } }
= _('Key: %{key}') %{ key: current_user.otp_secret.scan(/.{4}/).join(' ') }
%p.two-factor-new-manual-content
= _('Time based: Yes')
= form_tag profile_two_factor_auth_path, method: :post do |f|
- if @error
- = render 'shared/global_alert', title: @error[:message], variant: :danger, dismissible: false do
+ = render Pajamas::AlertComponent.new(title: @error[:message],
+ variant: :danger,
+ dismissible: false) do
.gl-alert-body
= link_to _('Try the troubleshooting steps here.'), help_page_path('user/profile/account/two_factor_authentication.md', anchor: 'troubleshooting'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/projects/_deletion_failed.html.haml b/app/views/projects/_deletion_failed.html.haml
index b713b805009..f9d8a2d2989 100644
--- a/app/views/projects/_deletion_failed.html.haml
+++ b/app/views/projects/_deletion_failed.html.haml
@@ -1,7 +1,9 @@
- project = local_assigns.fetch(:project)
- return unless project.delete_error.present?
-= render 'shared/global_alert', variant: :warning, dismissible: false, alert_class: 'project-deletion-failed-message' do
+= render Pajamas::AlertComponent.new(variant: :warning,
+ dismissible: false,
+ alert_class: 'project-deletion-failed-message') do
.gl-alert-body
This project was scheduled for deletion, but failed with the following message:
= project.delete_error
diff --git a/app/views/projects/_files.html.haml b/app/views/projects/_files.html.haml
index a7cf50623f0..74ace549bb1 100644
--- a/app/views/projects/_files.html.haml
+++ b/app/views/projects/_files.html.haml
@@ -20,6 +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 !Feature.enabled?(:new_dir_modal, default_enabled: :yaml) && can_edit_tree?
+ - if can_edit_tree?
= render 'projects/blob/new_dir'
diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml
index a8b809d1871..6dfb338a916 100644
--- a/app/views/projects/_import_project_pane.html.haml
+++ b/app/views/projects/_import_project_pane.html.haml
@@ -1,10 +1,12 @@
- active_tab = local_assigns.fetch(:active_tab, 'blank')
- track_label = local_assigns.fetch(:track_label, 'import_project')
+- namespace_id = local_assigns.fetch(:destination_namespace_id, nil)
.project-import
.form-group.import-btn-container.clearfix
- %h5
+ %h5.gl-display-flex
= _("Import project from")
+ = link_to _('History'), import_history_index_path, class: 'gl-link gl-ml-auto gl-font-weight-normal'
.import-buttons
- if gitlab_project_import_enabled?
.import_gitlab_project.has-tooltip{ data: { container: 'body', qa_selector: 'gitlab_import_button' } }
@@ -15,7 +17,7 @@
- if github_import_enabled?
%div
- = link_to new_import_github_path, class: 'gl-button btn-default btn js-import-github js-import-project-btn', data: { platform: 'github', **tracking_attrs_data(track_label, 'click_button', 'github') } do
+ = link_to new_import_github_path(namespace_id: namespace_id), class: 'gl-button btn-default btn js-import-github js-import-project-btn', data: { platform: 'github', **tracking_attrs_data(track_label, 'click_button', 'github') } do
.gl-button-icon
= sprite_icon('github')
GitHub
@@ -79,7 +81,7 @@
.js-toggle-content.toggle-import-form{ class: ('hide' if active_tab != 'import') }
- = form_for @project, html: { class: 'new_project gl-show-field-errors js-project-import' } do |f|
+ = gitlab_ui_form_for @project, html: { class: 'new_project gl-show-field-errors js-project-import' } 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/_last_push.html.haml b/app/views/projects/_last_push.html.haml
index 88cce9e71c0..66857dadb65 100644
--- a/app/views/projects/_last_push.html.haml
+++ b/app/views/projects/_last_push.html.haml
@@ -1,9 +1,8 @@
- event = last_push_event
- if event && show_last_push_widget?(event)
- = render 'shared/global_alert',
- variant: :success,
+ = render Pajamas::AlertComponent.new(variant: :success,
alert_class: 'gl-mt-3',
- close_button_class: 'js-close-banner' do
+ close_button_class: 'js-close-banner') do
.gl-alert-body
%span= s_("LastPushEvent|You pushed to")
%strong.gl-display-inline-flex.gl-max-w-50p{ data: { toggle: 'tooltip' }, title: event.ref_name }
diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml
index 1fb045544aa..e79825bdfc4 100644
--- a/app/views/projects/_new_project_fields.html.haml
+++ b/app/views/projects/_new_project_fields.html.haml
@@ -9,33 +9,37 @@
= f.label :name, class: 'label-bold' do
%span= _("Project name")
= f.text_field :name, placeholder: "My awesome project", class: "form-control gl-form-input input-lg", data: { qa_selector: 'project_name', track_label: "#{track_label}", track_action: "activate_form_input", track_property: "project_name", track_value: "" }, required: true, aria: { required: true }
- .form-group.project-path.col-sm-6
+ .form-group.project-path.col-sm-6.gl-pr-0
= f.label :namespace_id, class: 'label-bold' do
%span= _('Project URL')
.input-group.gl-flex-nowrap
- if current_user.can_select_namespace?
- namespace_id = namespace_id_from(params)
- .js-vue-new-project-url-select{ data: { namespace_full_path: GroupFinder.new(current_user).execute(id: namespace_id)&.full_path,
- namespace_id: namespace_id,
+ .js-vue-new-project-url-select{ data: { namespace_full_path: GroupFinder.new(current_user).execute(id: namespace_id)&.full_path || @current_user_group&.full_path,
+ namespace_id: namespace_id || @current_user_group&.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.static-namespace.flex-shrink-0.has-tooltip{ title: user_url(current_user.username) + '/' }
.input-group-text.border-0
#{user_url(current_user.username)}/
= f.hidden_field :namespace_id, value: current_user.namespace_id
+ .gl-align-self-center.gl-pl-5 /
.form-group.project-path.col-sm-6
= f.label :path, class: 'label-bold' do
%span= _("Project slug")
= f.text_field :path, placeholder: "my-awesome-project", class: "form-control gl-form-input", required: true, aria: { required: true }, data: { qa_selector: 'project_path', username: current_user.username }
+.js-group-namespace-error.form-text.gl-text-red-500.gl-display-none
+ = s_('ProjectsNew|Pick a group or namespace where you want to create this project.')
- if current_user.can_create_group?
.form-text.text-muted
- link_start_group_path = '<a href="%{path}">' % { path: new_group_path }
- project_tip = s_('ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}') % { link_start: link_start_group_path, link_end: '</a>' }
= project_tip.html_safe
-= render 'shared/global_alert', alert_class: "gl-mb-4 gl-display-none js-user-readme-repo", dismissible: false, variant: :success do
+= render Pajamas::AlertComponent.new(alert_class: "gl-mb-4 gl-display-none js-user-readme-repo",
+ dismissible: false,
+ variant: :success) do
.gl-alert-body
- help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/profile/index', anchor: 'add-details-to-your-profile-with-a-readme') }
= html_escape(_('%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more.%{help_link_end}')) % { project_path: "<strong>#{current_user.username} / #{current_user.username}</strong>".html_safe, help_link_start: help_link_start, help_link_end: '</a>'.html_safe }
@@ -45,7 +49,7 @@
= s_('ProjectsNew|Project description %{tag_start}(optional)%{tag_end}').html_safe % { tag_start: '<span>'.html_safe, tag_end: '</span>'.html_safe }
= f.text_area :description, placeholder: s_('ProjectsNew|Description format'), class: "form-control gl-form-input", rows: 3, maxlength: 250, data: { qa_selector: 'project_description', track_label: "#{track_label}", track_action: "activate_form_input", track_property: "project_description", track_value: "" }
-- unless Gitlab::CurrentSettings.current_application_settings.hide_third_party_offers?
+- unless Gitlab::CurrentSettings.current_application_settings.hide_third_party_offers? || !Gitlab.com?
.js-deployment-target-select
= f.label :visibility_level, class: 'label-bold' do
@@ -64,15 +68,14 @@
.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.variant(:candidate) do
- = render 'new_project_initialize_with_sast', experiment_name: e.name, track_label: track_label, checked: true, with_free_badge: false
- - e.variant(:unchecked_candidate) do
- = render 'new_project_initialize_with_sast', experiment_name: e.name, track_label: track_label, checked: false, with_free_badge: false
- - e.variant(:free_indicator) do
- = render 'new_project_initialize_with_sast', experiment_name: e.name, track_label: track_label, checked: true, with_free_badge: true
- - e.variant(:unchecked_free_indicator) do
- = render 'new_project_initialize_with_sast', experiment_name: e.name, track_label: track_label, checked: false, with_free_badge: true
+ .form-group
+ .form-check.gl-mb-3
+ = check_box_tag 'project[initialize_with_sast]', '1', false, class: 'form-check-input', data: { qa_selector: 'initialize_with_sast_checkbox', 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' }
-= f.submit _('Create project'), class: "btn gl-button btn-confirm", data: { qa_selector: 'project_create_button', track_label: "#{track_label}", track_action: "click_button", track_property: "create_project", track_value: "" }
+= f.submit _('Create project'), class: "btn gl-button btn-confirm js-create-project-button", data: { qa_selector: 'project_create_button', track_label: "#{track_label}", track_action: "click_button", track_property: "create_project", track_value: "" }
= link_to _('Cancel'), dashboard_projects_path, class: 'btn gl-button btn-default btn-cancel', data: { track_label: "#{track_label}", track_action: "click_button", track_property: "cancel", track_value: "" }
diff --git a/app/views/projects/_new_project_initialize_with_sast.html.haml b/app/views/projects/_new_project_initialize_with_sast.html.haml
deleted file mode 100644
index ec12abbf789..00000000000
--- a/app/views/projects/_new_project_initialize_with_sast.html.haml
+++ /dev/null
@@ -1,16 +0,0 @@
-- experiment_name = local_assigns.fetch(:experiment_name)
-- track_label = local_assigns.fetch(:track_label)
-
-- with_free_badge = local_assigns.fetch(:with_free_badge, false)
-- checked = local_assigns.fetch(:checked, false)
-
-.form-group
- .form-check.gl-mb-3
- = check_box_tag 'project[initialize_with_sast]', '1', checked, class: 'form-check-input', data: { qa_selector: 'initialize_with_sast_checkbox', track_experiment: experiment_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)')
- - if with_free_badge
- = gl_badge_tag _('Free'), variant: :info, size: :sm
- .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: experiment_name }
diff --git a/app/views/projects/_transfer.html.haml b/app/views/projects/_transfer.html.haml
index 9f9daa7ec6f..9e6648c71fc 100644
--- a/app/views/projects/_transfer.html.haml
+++ b/app/views/projects/_transfer.html.haml
@@ -9,6 +9,11 @@
.form-group
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'transferring-an-existing-project-into-another-namespace') }
%p= _("Transfer your project into another namespace. %{link_start}Learn more.%{link_end}").html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
+ %p= _('When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier.')
+ %p
+ = _("Don't have a group?")
+ = link_to _('Create one'), new_group_path, target: '_blank'
+ = _('Things to be aware of before transferring:')
%ul
%li= _("Be careful. Changing the project's namespace can have unintended side effects.")
%li= _('You can only transfer the project to namespaces you manage.')
diff --git a/app/views/projects/alert_management/details.html.haml b/app/views/projects/alert_management/details.html.haml
index b1d680e4f3d..66bbed8c5ec 100644
--- a/app/views/projects/alert_management/details.html.haml
+++ b/app/views/projects/alert_management/details.html.haml
@@ -2,4 +2,4 @@
- page_title s_('AlertManagement|Alert detail')
- add_page_specific_style 'page_bundles/alert_management_details'
-#js-alert_details{ data: alert_management_detail_data(@project, @alert_id) }
+#js-alert_details{ data: alert_management_detail_data(current_user, @project, @alert_id) }
diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml
index ae8f89bf16a..7f72438c3f9 100644
--- a/app/views/projects/blame/show.html.haml
+++ b/app/views/projects/blame/show.html.haml
@@ -22,7 +22,7 @@
.table-responsive.file-content.blame.code{ class: user_color_scheme }
%table
- - current_line = 1
+ - current_line = @blame.first_line
- @blame.groups.each do |blame_group|
- commit_data = @blame.commit_data(blame_group[:commit])
- line_count = blame_group[:lines].count
diff --git a/app/views/projects/blob/_upload.html.haml b/app/views/projects/blob/_upload.html.haml
index 1d3bec1ad44..629fa9c0e8a 100644
--- a/app/views/projects/blob/_upload.html.haml
+++ b/app/views/projects/blob/_upload.html.haml
@@ -15,7 +15,9 @@
#{ dropzone_text.html_safe }
%br
- .dropzone-alerts.gl-alert.gl-alert-danger.gl-mb-5.data{ style: "display:none" }
+ = render Pajamas::AlertComponent.new(variant: :danger,
+ alert_class: 'dropzone-alerts gl-alert gl-alert-danger gl-mb-5 data gl-display-none',
+ dismissible: false)
= render 'shared/new_commit_form', placeholder: placeholder, ref: local_assigns[:ref]
diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml
index 773137ff3f2..aefa4a41ab5 100644
--- a/app/views/projects/blob/edit.html.haml
+++ b/app/views/projects/blob/edit.html.haml
@@ -4,10 +4,9 @@
- webpack_preload_asset_tag('monaco')
- if @conflict
- = render 'shared/global_alert',
- alert_class: 'gl-mb-5 gl-mt-5',
+ = render Pajamas::AlertComponent.new(alert_class: 'gl-mb-5 gl-mt-5',
variant: :danger,
- dismissible: false do
+ dismissible: false) do
- blob_url = project_blob_path(@project, @id)
- external_link_icon = content_tag 'span', { aria: { label: _('Opens new window') }} do
- sprite_icon('external-link', css_class: 'gl-icon').html_safe
diff --git a/app/views/projects/blob/viewers/_balsamiq.html.haml b/app/views/projects/blob/viewers/_balsamiq.html.haml
deleted file mode 100644
index b20106e8c3a..00000000000
--- a/app/views/projects/blob/viewers/_balsamiq.html.haml
+++ /dev/null
@@ -1 +0,0 @@
-.file-content.balsamiq-viewer#js-balsamiq-viewer{ data: { endpoint: blob_raw_path } }
diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml
index f5e61c010cc..e4ec7a43d61 100644
--- a/app/views/projects/branches/_branch.html.haml
+++ b/app/views/projects/branches/_branch.html.haml
@@ -7,6 +7,7 @@
= sprite_icon('branch', size: 12, css_class: 'gl-flex-shrink-0')
= link_to project_tree_path(@project, branch.name), class: 'item-title str-truncated-100 ref-name gl-ml-3 qa-branch-name' do
= branch.name
+ = clipboard_button(text: branch.name, title: _("Copy branch name"))
- if branch.name == @repository.root_ref
= gl_badge_tag s_('DefaultBranchLabel|default'), { variant: :info, size: :sm }, { class: 'gl-ml-2' }
- elsif merged
diff --git a/app/views/projects/branches/_panel.html.haml b/app/views/projects/branches/_panel.html.haml
index f03b5cf2eff..bd6831ff3b2 100644
--- a/app/views/projects/branches/_panel.html.haml
+++ b/app/views/projects/branches/_panel.html.haml
@@ -7,7 +7,7 @@
- return unless branches.any?
-.card.gl-mt-3
+.card
.card-header
= panel_title
%ul.content-list.all-branches.qa-all-branches
diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml
index 96acd863a4c..85a0346e691 100644
--- a/app/views/projects/branches/index.html.haml
+++ b/app/views/projects/branches/index.html.haml
@@ -27,11 +27,6 @@
= render_if_exists 'projects/commits/mirror_status'
.js-branch-list{ data: { diverging_counts_endpoint: diverging_commit_counts_namespace_project_branches_path(@project.namespace, @project, format: :json), default_branch: @project.default_branch } }
-- if can?(current_user, :admin_project, @project)
- - project_settings_link = link_to s_('Branches|project settings'), project_protected_branches_path(@project)
- .row-content-block
- %h5
- = s_('Branches|Protected branches can be managed in %{project_settings_link}.').html_safe % { project_settings_link: project_settings_link }
- if @gitaly_unavailable
= render 'shared/errors/gitaly_unavailable', reason: s_('Branches|Unable to load branches')
diff --git a/app/views/projects/branches/new.html.haml b/app/views/projects/branches/new.html.haml
index 5cc83111b34..07bae7819a4 100644
--- a/app/views/projects/branches/new.html.haml
+++ b/app/views/projects/branches/new.html.haml
@@ -2,9 +2,7 @@
- default_ref = params[:ref] || @project.default_branch
- if @error
- = render 'shared/global_alert',
- variant: :danger,
- close_button_class: 'js-close' do
+ = render Pajamas::AlertComponent.new(variant: :danger) do
.gl-alert-body
= @error
%h3.page-title
diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml
index a3343aa4228..23572d1d6ac 100644
--- a/app/views/projects/commit/_commit_box.html.haml
+++ b/app/views/projects/commit/_commit_box.html.haml
@@ -47,9 +47,7 @@
- if can?(current_user, :read_pipeline, @last_pipeline)
.well-segment.pipeline-info
- .status-icon-container
- = link_to project_pipeline_path(@project, @last_pipeline.id), class: "ci-status-icon-#{@last_pipeline.status}" do
- = ci_icon_for_status(@last_pipeline.status)
+ .js-commit-pipeline-status{ data: { full_path: @project.full_path, iid: @last_pipeline.iid, graphql_resource_etag: graphql_etag_pipeline_path(@last_pipeline) } }
#{ _('Pipeline') }
= link_to "##{@last_pipeline.id}", project_pipeline_path(@project, @last_pipeline.id)
= ci_label_for_status(@last_pipeline.status)
@@ -57,7 +55,7 @@
#{ n_(s_('Pipeline|with stage'), s_('Pipeline|with stages'), @last_pipeline.stages_count) }
.mr-widget-pipeline-graph
.stage-cell
- .js-commit-pipeline-mini-graph{ data: { stages: @last_pipeline_stages.to_json.html_safe, full_path: @project.full_path, iid: @last_pipeline.iid } }
+ .js-commit-pipeline-mini-graph{ data: { stages: @last_pipeline_stages.to_json.html_safe, full_path: @project.full_path, iid: @last_pipeline.iid, graphql_resource_etag: graphql_etag_pipeline_path(@last_pipeline) } }
- if @last_pipeline.duration
in
= time_interval_in_words @last_pipeline.duration
diff --git a/app/views/projects/commit/show.html.haml b/app/views/projects/commit/show.html.haml
index e22d33e3c72..c26f24dd52c 100644
--- a/app/views/projects/commit/show.html.haml
+++ b/app/views/projects/commit/show.html.haml
@@ -16,6 +16,7 @@
diffs: @diffs,
environment: @environment,
diff_page_context: "is-commit",
+ page: pagination_params[:page],
paginate_diffs: true,
paginate_diffs_per_page: Projects::CommitController::COMMIT_DIFFS_PER_PAGE
diff --git a/app/views/projects/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml
index 02b5fe00ad0..82d3bfbcfe6 100644
--- a/app/views/projects/commits/_commits.html.haml
+++ b/app/views/projects/commits/_commits.html.haml
@@ -35,9 +35,8 @@
- if hidden > 0
%li
- = render 'shared/global_alert',
- variant: :warning,
- dismissible: false do
+ = render Pajamas::AlertComponent.new(variant: :warning,
+ dismissible: false) do
.gl-alert-body
= n_('%s additional commit has been omitted to prevent performance issues.', '%s additional commits have been omitted to prevent performance issues.', hidden) % number_with_delimiter(hidden)
diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml
index 36641a8c508..e5be3a897a5 100644
--- a/app/views/projects/commits/show.html.haml
+++ b/app/views/projects/commits/show.html.haml
@@ -20,7 +20,7 @@
= link_to _("View open merge request"), project_merge_request_path(@project, @merge_request), class: 'btn gl-button'
- elsif create_mr_button?(from: @repository.root_ref, to: @ref, source_project: @project, target_project: @project)
.control.d-none.d-md-block
- = link_to _("Create merge request"), create_mr_path(from: @repository.root_ref, to: @ref, source_project: @project, target_project: @project), class: 'btn gl-button btn-success'
+ = link_to _("Create merge request"), create_mr_path(from: @repository.root_ref, to: @ref, source_project: @project, target_project: @project), class: 'btn gl-button btn-confirm'
.control
= form_tag(project_commits_path(@project, @id), method: :get, class: 'commits-search-form js-signature-container', data: { 'signatures-path' => namespace_project_signatures_path }) do
diff --git a/app/views/projects/compare/show.html.haml b/app/views/projects/compare/show.html.haml
index 1fc067b6be1..cb2c2d488e8 100644
--- a/app/views/projects/compare/show.html.haml
+++ b/app/views/projects/compare/show.html.haml
@@ -13,6 +13,7 @@
diffs: @diffs,
environment: @environment,
diff_page_context: "is-compare",
+ page: pagination_params[:page],
paginate_diffs: true,
paginate_diffs_per_page: Projects::CompareController::COMMIT_DIFFS_PER_PAGE
- else
diff --git a/app/views/projects/deploy_keys/edit.html.haml b/app/views/projects/deploy_keys/edit.html.haml
index f0214ade313..263b0025fe8 100644
--- a/app/views/projects/deploy_keys/edit.html.haml
+++ b/app/views/projects/deploy_keys/edit.html.haml
@@ -3,7 +3,7 @@
%hr
%div
- = form_for [@project, @deploy_key], include_id: false, html: { class: 'js-requires-input' } do |f|
+ = gitlab_ui_form_for [@project, @deploy_key], include_id: false, html: { class: 'js-requires-input' } do |f|
= render partial: 'shared/deploy_keys/form', locals: { form: f, deploy_key: @deploy_key }
.form-actions
= f.submit _('Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml
index bb2682bb7c0..6f4ffecd5e0 100644
--- a/app/views/projects/diffs/_diffs.html.haml
+++ b/app/views/projects/diffs/_diffs.html.haml
@@ -5,7 +5,8 @@
- load_diff_files_async = Feature.enabled?(:async_commit_diff_files, @project) && diff_page_context == "is-commit"
- paginate_diffs = local_assigns.fetch(:paginate_diffs, false) && !load_diff_files_async
- paginate_diffs_per_page = local_assigns.fetch(:paginate_diffs_per_page, nil)
-- diff_files = conditionally_paginate_diff_files(diffs, paginate: paginate_diffs, per: paginate_diffs_per_page)
+- page = local_assigns.fetch(:page, nil)
+- diff_files = conditionally_paginate_diff_files(diffs, paginate: paginate_diffs, page: page, per: paginate_diffs_per_page)
.content-block.oneline-block.files-changed.diff-files-changed.js-diff-files-changed
.files-changed-inner
@@ -24,10 +25,10 @@
.btn-group.gl-ml-3
= inline_diff_btn
= parallel_diff_btn
- = render 'projects/diffs/stats', diff_files: diff_files
+ = render Diffs::StatsComponent.new(diff_files: diff_files)
- if render_overflow_warning?(diffs)
- = render 'projects/diffs/warning', diff_files: diffs
+ = render Diffs::OverflowWarningComponent.new(diffs: diffs, diff_files: diff_files, project: @project, commit: @commit, merge_request: @merge_request)
.files{ data: { can_create_note: can_create_note } }
- if load_diff_files_async
diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml
index 0638481d968..64bd1bf32f0 100644
--- a/app/views/projects/diffs/_file.html.haml
+++ b/app/views/projects/diffs/_file.html.haml
@@ -15,6 +15,7 @@
- unless diff_file.submodule?
.file-actions.gl-display-none.gl-sm-display-flex
+ #js-diff-stats{ data: diff_file_stats_data(diff_file) }
- if diff_file.blob&.readable_text?
%span.has-tooltip{ title: _("Toggle comments for this file") }
= link_to '#', class: 'js-toggle-diff-comments btn gl-button btn-default btn-icon selected', disabled: @diff_notes_disabled do
diff --git a/app/views/projects/diffs/_line.html.haml b/app/views/projects/diffs/_line.html.haml
index a5d3328b439..dd5114e3cec 100644
--- a/app/views/projects/diffs/_line.html.haml
+++ b/app/views/projects/diffs/_line.html.haml
@@ -10,6 +10,8 @@
- case line.type
- when 'match'
= diff_match_line line.old_pos, line.new_pos, text: line.text
+ - when 'old-nomappinginraw', 'new-nomappinginraw', 'unchanged-nomappinginraw'
+ = diff_nomappinginraw_line line, %w[old_line diff-line-num], %w[new_line diff-line-num], %w[line_content]
- when 'old-nonewline', 'new-nonewline'
%td.old_line.diff-line-num
%td.new_line.diff-line-num
diff --git a/app/views/projects/diffs/_parallel_view.html.haml b/app/views/projects/diffs/_parallel_view.html.haml
index ebe3aad064a..03fe3e6edf5 100644
--- a/app/views/projects/diffs/_parallel_view.html.haml
+++ b/app/views/projects/diffs/_parallel_view.html.haml
@@ -11,6 +11,8 @@
- case left.type
- when 'match'
= diff_match_line left.old_pos, nil, text: left.text, view: :parallel
+ - when 'old-nomappinginraw', 'new-nomappinginraw', 'unchanged-nomappinginraw'
+ = diff_nomappinginraw_line left, %w[old_line diff-line-num], nil, %w[line_content parallel left-side]
- when 'old-nonewline', 'new-nonewline'
%td.old_line.diff-line-num
%td.line_content.match.left-side= left.text
@@ -29,6 +31,8 @@
- case right.type
- when 'match'
= diff_match_line nil, right.new_pos, text: left.text, view: :parallel
+ - when 'old-nomappinginraw', 'new-nomappinginraw', 'unchanged-nomappinginraw'
+ = diff_nomappinginraw_line right, %w[new_line diff-line-num], nil, %w[line_content parallel right-side]
- when 'old-nonewline', 'new-nonewline'
%td.new_line.diff-line-num
%td.line_content.match.right-side= right.text
diff --git a/app/views/projects/diffs/_stats.html.haml b/app/views/projects/diffs/_stats.html.haml
deleted file mode 100644
index fe9658a440a..00000000000
--- a/app/views/projects/diffs/_stats.html.haml
+++ /dev/null
@@ -1 +0,0 @@
-.js-diff-stats-dropdown{ data: { changed: diff_files.size, added: diff_files.sum(&:added_lines), deleted: diff_files.sum(&:removed_lines), files: diff_files_data(diff_files) } }
diff --git a/app/views/projects/diffs/_text_file.html.haml b/app/views/projects/diffs/_text_file.html.haml
index 6e7e0244721..2cd215c5518 100644
--- a/app/views/projects/diffs/_text_file.html.haml
+++ b/app/views/projects/diffs/_text_file.html.haml
@@ -12,6 +12,8 @@
- case line.type
- when 'match'
= diff_match_line line.old_pos, line.new_pos, text: line.text
+ - when 'old-nomappinginraw', 'new-nomappinginraw', 'unchanged-nomappinginraw'
+ = diff_nomappinginraw_line line, %w[old_line diff-line-num], %w[new_line diff-line-num], %w[line_content]
- when 'old-nonewline', 'new-nonewline'
%td.old_line.diff-line-num
%td.new_line.diff-line-num
diff --git a/app/views/projects/diffs/_warning.html.haml b/app/views/projects/diffs/_warning.html.haml
deleted file mode 100644
index 3d31773694f..00000000000
--- a/app/views/projects/diffs/_warning.html.haml
+++ /dev/null
@@ -1,13 +0,0 @@
-= render 'shared/global_alert',
- title: _('Too many changes to show.'),
- variant: :warning,
- alert_class: 'gl-mb-5' do
- .gl-alert-body
- = html_escape(_("To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed.")) % { display_size: diff_files.size, real_size: diff_files.real_size, strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
- .gl-alert-actions
- - if current_controller?(:commit)
- = link_to _("Plain diff"), project_commit_path(@project, @commit, format: :diff), class: "btn gl-alert-action btn-default gl-button btn-default-secondary"
- = link_to _("Email patch"), project_commit_path(@project, @commit, format: :patch), class: "btn gl-alert-action btn-default gl-button btn-default-secondary"
- - elsif current_controller?('projects/merge_requests/diffs') && @merge_request&.persisted?
- = link_to _("Plain diff"), merge_request_path(@merge_request, format: :diff), class: "btn gl-alert-action btn-default gl-button btn-default-secondary"
- = link_to _("Email patch"), merge_request_path(@merge_request, format: :patch), class: "btn gl-alert-action btn-default gl-button btn-default-secondary"
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index 1609d81c0fd..92dbde07709 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -5,6 +5,8 @@
- expanded = expanded_by_default?
- reduce_visibility_form_id = 'reduce-visibility-form'
+= render_if_exists 'shared/minute_limit_banner', namespace: @project
+
%section.settings.general-settings.no-animate.expanded#js-general-settings
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Naming, topics, avatar')
@@ -33,7 +35,7 @@
.settings-content
= render_if_exists 'shared/promotions/promote_mr_features'
- = form_for @project, html: { multipart: true, class: "merge-request-settings-form js-mr-settings-form" }, authenticity_token: true do |f|
+ = gitlab_ui_form_for @project, html: { multipart: true, class: "merge-request-settings-form js-mr-settings-form" }, authenticity_token: true do |f|
%input{ name: 'update_section', type: 'hidden', value: 'js-merge-request-settings' }
= render 'projects/merge_request_settings', form: f
= f.submit _('Save changes'), class: "btn gl-button btn-confirm rspec-save-merge-request-changes", data: { qa_selector: 'save_merge_request_changes_button' }
@@ -98,7 +100,7 @@
.input-group-text
#{Gitlab::Utils.append_path(root_url, @project.namespace.full_path)}/
= f.text_field :path, class: 'form-control h-auto', data: { qa_selector: 'project_path_field' }
- = f.submit _('Change path'), class: "gl-button btn btn-warning", data: { qa_selector: 'change_path_button' }
+ = f.submit _('Change path'), class: "gl-button btn btn-danger", data: { qa_selector: 'change_path_button' }
= render 'transfer', project: @project
diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml
index 6a54eedf6c8..b2338fa6c55 100644
--- a/app/views/projects/empty.html.haml
+++ b/app/views/projects/empty.html.haml
@@ -3,6 +3,7 @@
- escaped_default_branch_name = default_branch_name.shellescape
- @skip_current_level_breadcrumb = true
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @project
= render partial: 'flash_messages', locals: { project: @project }
= render "home_panel"
diff --git a/app/views/projects/forks/error.html.haml b/app/views/projects/forks/error.html.haml
index 7933e0e07b3..9b64f158a1b 100644
--- a/app/views/projects/forks/error.html.haml
+++ b/app/views/projects/forks/error.html.haml
@@ -1,10 +1,9 @@
- page_title _("Fork project")
- if @forked_project && !@forked_project.saved?
- = render 'shared/global_alert',
- title: _('Fork Error!'),
+ = render Pajamas::AlertComponent.new(title: _('Fork Error!'),
variant: :danger,
alert_class: 'gl-mt-5',
- dismissible: false do
+ dismissible: false) do
.gl-alert-body
%p
= _("You tried to fork %{link_to_the_project} but it failed for the following reason:").html_safe % { link_to_the_project: link_to_project(@project) }
diff --git a/app/views/projects/forks/index.html.haml b/app/views/projects/forks/index.html.haml
index 5330c3aa6d6..905c5779c7d 100644
--- a/app/views/projects/forks/index.html.haml
+++ b/app/views/projects/forks/index.html.haml
@@ -1,5 +1,7 @@
- sort_value = @sort || sort_value_recently_created
-- sort_title = forks_sort_options_hash[sort_value]
+- excluded_filters = [:state, :scope, :label_name, :milestone_id, :assignee_id, :author_id]
+- created_at = { value: sort_value_created_date, text: sort_title_created_date, href: page_filter_path(sort: sort_value_recently_created, without: excluded_filters) }
+- activity = { value: sort_value_latest_activity, text: sort_title_latest_activity, href: page_filter_path(sort: sort_value_latest_activity, without: excluded_filters) }
.top-area
.nav-text
@@ -14,14 +16,7 @@
.dropdown.gl-display-inline.gl-md-ml-3.issue-sort-dropdown.gl-mt-3.gl-md-mt-0
.btn-group{ role: 'group' }
.btn-group{ role: 'group' }
- %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown', display: 'static' }, class: 'gl-button btn btn-default' }
- = sort_title
- = sprite_icon('chevron-down', css_class: "dropdown-menu-toggle-icon gl-top-3")
- %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable.dropdown-menu-sort
- %li
- - excluded_filters = [:state, :scope, :label_name, :milestone_id, :assignee_id, :author_id]
- = sortable_item(sort_title_created_date, page_filter_path(sort: sort_value_recently_created, without: excluded_filters), sort_title)
- = sortable_item(sort_title_latest_activity, page_filter_path(sort: sort_value_latest_activity, without: excluded_filters), sort_title)
+ = gl_redirect_listbox_tag [created_at, activity], @sort
= forks_sort_direction_button(sort_value)
- if current_user && can?(current_user, :fork_project, @project)
diff --git a/app/views/projects/harbor/repositories/index.html.haml b/app/views/projects/harbor/repositories/index.html.haml
index b3f5b91596d..270cbf3facd 100644
--- a/app/views/projects/harbor/repositories/index.html.haml
+++ b/app/views/projects/harbor/repositories/index.html.haml
@@ -4,6 +4,8 @@
#js-harbor-registry-list-project{ data: { endpoint: project_harbor_registry_index_path(@project),
"no_containers_image" => image_path('illustrations/docker-empty-state.svg'),
"containers_error_image" => image_path('illustrations/docker-error-state.svg'),
- "help_page_path" => help_page_path('user/packages/container_registry/index'),
+ "repository_url" => 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
+ "registry_host_url_with_port" => 'demo.harbor.com',
connection_error: (!!@connection_error).to_s,
- invalid_path_error: (!!@invalid_path_error).to_s, } }
+ invalid_path_error: (!!@invalid_path_error).to_s,
+ is_group_page: false.to_s, } }
diff --git a/app/views/projects/hooks/edit.html.haml b/app/views/projects/hooks/edit.html.haml
index 4df109dbb61..74af65904cd 100644
--- a/app/views/projects/hooks/edit.html.haml
+++ b/app/views/projects/hooks/edit.html.haml
@@ -9,7 +9,7 @@
= render 'shared/web_hooks/title_and_docs', hook: @hook
.col-lg-9.gl-mb-3
- = form_for [@project, @hook], as: :hook, url: project_hook_path(@project, @hook) do |f|
+ = gitlab_ui_form_for [@project, @hook], as: :hook, url: project_hook_path(@project, @hook) do |f|
= render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook }
= f.submit _('Save changes'), class: 'btn gl-button btn-confirm gl-mr-3'
diff --git a/app/views/projects/hooks/index.html.haml b/app/views/projects/hooks/index.html.haml
index 5ca65d55eea..7d62a851aa1 100644
--- a/app/views/projects/hooks/index.html.haml
+++ b/app/views/projects/hooks/index.html.haml
@@ -7,7 +7,7 @@
= render 'shared/web_hooks/title_and_docs', hook: @hook
.col-lg-8.gl-mb-3
- = form_for @hook, as: :hook, url: polymorphic_path([@project, :hooks]) do |f|
+ = gitlab_ui_form_for @hook, as: :hook, url: polymorphic_path([@project, :hooks]) do |f|
= render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook }
= f.submit 'Add webhook', class: 'gl-button btn btn-confirm'
diff --git a/app/views/projects/imports/new.html.haml b/app/views/projects/imports/new.html.haml
index b021087c394..dc2bcfa33bb 100644
--- a/app/views/projects/imports/new.html.haml
+++ b/app/views/projects/imports/new.html.haml
@@ -12,7 +12,7 @@
:preserve
#{h(@project.import_state.last_error)}
-= form_for @project, url: project_import_path(@project), method: :post, html: { class: 'js-project-import' } do |f|
+= gitlab_ui_form_for @project, url: project_import_path(@project), method: :post, html: { class: 'js-project-import' } do |f|
= render "shared/import_form", f: f
.form-actions
diff --git a/app/views/projects/issues/_alert_moved_from_service_desk.html.haml b/app/views/projects/issues/_alert_moved_from_service_desk.html.haml
index 26bd65fbe26..f28b951ad62 100644
--- a/app/views/projects/issues/_alert_moved_from_service_desk.html.haml
+++ b/app/views/projects/issues/_alert_moved_from_service_desk.html.haml
@@ -2,9 +2,7 @@
- service_desk_link_url = help_page_path('user/project/service_desk')
- service_desk_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: service_desk_link_url }
-= render 'shared/global_alert',
- variant: :warning,
- close_button_class: 'js-close',
- alert_class: 'hide js-alert-moved-from-service-desk-warning gl-mt-5' do
+= render Pajamas::AlertComponent.new(variant: :warning,
+ alert_class: 'hide js-alert-moved-from-service-desk-warning gl-mt-5') do
.gl-alert-body.gl-mr-3
= s_('This project does not have %{service_desk_link_start}Service Desk%{service_desk_link_end} enabled, so the user who created the issue will no longer receive email notifications about new activity.').html_safe % { service_desk_link_start: service_desk_link_start, service_desk_link_end: '</a>'.html_safe }
diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml
index 34e46807fb6..11741059ee5 100644
--- a/app/views/projects/issues/_form.html.haml
+++ b/app/views/projects/issues/_form.html.haml
@@ -1,3 +1,3 @@
-= form_for [@project, @issue],
- html: { class: 'issue-form common-note-form gl-mt-3 js-quick-submit gl-show-field-errors' } do |f|
+= gitlab_ui_form_for [@project, @issue],
+ html: { class: 'issue-form common-note-form gl-mt-3 js-quick-submit gl-show-field-errors', data: issues_form_data(@project) } do |f|
= render 'shared/issuable/form', f: f, issuable: @issue
diff --git a/app/views/projects/issues/_new_branch.html.haml b/app/views/projects/issues/_new_branch.html.haml
index f6ed6c26752..801841edc26 100644
--- a/app/views/projects/issues/_new_branch.html.haml
+++ b/app/views/projects/issues/_new_branch.html.haml
@@ -13,13 +13,13 @@
.create-mr-dropdown-wrap.d-inline-block.full-width-mobile.js-create-mr{ data: { project_path: @project.full_path, project_id: @project.id, can_create_path: can_create_path, create_mr_path: create_mr_path, create_branch_path: create_branch_path, refs_path: refs_path, is_confidential: can_create_confidential_merge_request?.to_s } }
.btn-group.unavailable
%button.gl-button.btn{ type: 'button', disabled: 'disabled' }
- .gl-spinner.align-text-bottom.gl-button-icon.hide
+ = gl_loading_icon(inline: true, css_class: 'js-create-mr-spinner gl-button-icon gl-display-none')
%span.text
Checking branch availability…
.btn-group.available.hidden
%button.gl-button.btn.js-create-merge-request.btn-confirm{ type: 'button', data: { action: data_action } }
- .gl-spinner.js-spinner.gl-mr-2.gl-display-none
+ = gl_loading_icon(css_class: 'js-create-mr-spinner js-spinner gl-mr-2 gl-display-none')
= value
%button.gl-button.btn.btn-confirm.btn-icon.dropdown-toggle.create-merge-request-dropdown-toggle.js-dropdown-toggle{ type: 'button', data: { dropdown: { trigger: '#create-merge-request-dropdown' }, display: 'static' } }
@@ -55,12 +55,12 @@
%label{ for: 'source-name' }
= _('Source (branch or tag)')
%input#source-name.js-ref.ref.form-control.gl-form-input{ type: 'text', placeholder: "#{@project.default_branch}", value: "#{@project.default_branch}", data: { value: "#{@project.default_branch}" } }
- %span.js-ref-message.form-text.text-muted
+ %span.js-ref-message.form-text
.form-group
%button.btn.gl-button.btn-confirm.js-create-target{ type: 'button', data: { action: 'create-mr' } }
= create_mr_text
- if can_create_confidential_merge_request?
- %p.text-warning.js-exposed-info-warning.hidden
+ %p.gl-text-orange-500.js-exposed-info-warning.gl-display-none
= _('This may expose confidential information as the selected fork is in another namespace that can have other members.')
diff --git a/app/views/projects/jobs/index.html.haml b/app/views/projects/jobs/index.html.haml
index c58c6ab8287..9a2a1e57165 100644
--- a/app/views/projects/jobs/index.html.haml
+++ b/app/views/projects/jobs/index.html.haml
@@ -1,9 +1,11 @@
+= render_if_exists 'shared/minute_limit_banner', namespace: @project
+
- page_title _("Jobs")
- add_page_specific_style 'page_bundles/ci_status'
- admin = local_assigns.fetch(:admin, false)
- if Feature.enabled?(:jobs_table_vue, @project, default_enabled: :yaml)
- #js-jobs-table{ data: { admin: admin, full_path: @project.full_path, job_counts: job_counts.to_json, job_statuses: job_statuses.to_json, pipeline_editor_path: project_ci_pipeline_editor_path(@project), empty_state_svg_path: image_path('jobs-empty-state.svg') } }
+ #js-jobs-table{ data: { admin: admin, full_path: @project.full_path, job_statuses: job_statuses.to_json, pipeline_editor_path: project_ci_pipeline_editor_path(@project), empty_state_svg_path: image_path('jobs-empty-state.svg') } }
- else
.top-area
- build_path_proc = ->(scope) { project_jobs_path(@project, scope: scope) }
diff --git a/app/views/projects/mattermosts/_no_teams.html.haml b/app/views/projects/mattermosts/_no_teams.html.haml
index 1efec0c017c..3d901c6f59b 100644
--- a/app/views/projects/mattermosts/_no_teams.html.haml
+++ b/app/views/projects/mattermosts/_no_teams.html.haml
@@ -1,8 +1,8 @@
- if @teams_error_message
= content_for :flash_message do
- .gl-alert.gl-alert-danger
- = sprite_icon('error', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-body= @teams_error_message
+ = render Pajamas::AlertComponent.new(variant: :danger) do
+ .gl-alert-body
+ = @teams_error_message
%p
You aren’t a member of any team on the Mattermost instance at
diff --git a/app/views/projects/merge_requests/_form.html.haml b/app/views/projects/merge_requests/_form.html.haml
index a68a4318538..5f1c72156eb 100644
--- a/app/views/projects/merge_requests/_form.html.haml
+++ b/app/views/projects/merge_requests/_form.html.haml
@@ -1,3 +1,3 @@
-= form_for [@project, @merge_request],
+= gitlab_ui_form_for [@project, @merge_request],
html: { class: 'merge-request-form common-note-form js-requires-input js-quick-submit' } do |f|
= render 'shared/issuable/form', f: f, issuable: @merge_request, presenter: @mr_presenter
diff --git a/app/views/projects/merge_requests/_mr_title.html.haml b/app/views/projects/merge_requests/_mr_title.html.haml
index d894aeaad65..49b7320d630 100644
--- a/app/views/projects/merge_requests/_mr_title.html.haml
+++ b/app/views/projects/merge_requests/_mr_title.html.haml
@@ -6,10 +6,9 @@
= cache(cache_key, expires_in: 1.day) do
- if @merge_request.closed_or_merged_without_fork?
- = render 'shared/global_alert',
- alert_class: 'gl-mb-5',
+ = render Pajamas::AlertComponent.new(alert_class: 'gl-mb-5',
variant: :danger,
- dismissible: false do
+ dismissible: false) do
.gl-alert-body
= _('The source project of this merge request has been removed.')
diff --git a/app/views/projects/merge_requests/creations/_new_submit.html.haml b/app/views/projects/merge_requests/creations/_new_submit.html.haml
index 253f50d5090..ef6e930bf23 100644
--- a/app/views/projects/merge_requests/creations/_new_submit.html.haml
+++ b/app/views/projects/merge_requests/creations/_new_submit.html.haml
@@ -1,6 +1,6 @@
%h3.page-title
= _('New merge request')
-= form_for [@project, @merge_request], html: { class: 'merge-request-form common-note-form js-requires-input js-quick-submit' } do |f|
+= gitlab_ui_form_for [@project, @merge_request], html: { class: 'merge-request-form common-note-form js-requires-input js-quick-submit' } do |f|
= render 'shared/issuable/form', f: f, issuable: @merge_request, commits: @commits, presenter: @mr_presenter
= f.hidden_field :source_project_id
= f.hidden_field :source_branch
diff --git a/app/views/projects/merge_requests/invalid.html.haml b/app/views/projects/merge_requests/invalid.html.haml
index aa68fe031bb..ce5a042fbf8 100644
--- a/app/views/projects/merge_requests/invalid.html.haml
+++ b/app/views/projects/merge_requests/invalid.html.haml
@@ -9,9 +9,8 @@
= render "projects/merge_requests/mr_title"
= render "projects/merge_requests/mr_box"
- = render 'shared/global_alert',
- variant: :danger,
- dismissible: false do
+ = render Pajamas::AlertComponent.new(variant: :danger,
+ dismissible: false) do
.gl-alert-body
- if @merge_request.for_fork? && !@merge_request.source_project
= err_fork_project_removed
diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml
index 059ef53c42b..154a92e6ec8 100644
--- a/app/views/projects/milestones/index.html.haml
+++ b/app/views/projects/milestones/index.html.haml
@@ -1,24 +1,36 @@
- page_title _('Milestones')
- add_page_specific_style 'page_bundles/milestone'
-.top-area
- = render 'shared/milestones_filter', counts: milestone_counts(@project.milestones)
+- if @milestone_states.any? { |name, count| count > 0 }
+ .top-area
+ = render 'shared/milestones_filter', counts: @milestone_states
- .nav-controls
- = render 'shared/milestones/search_form'
- = render 'shared/milestones_sort_dropdown'
- - if can?(current_user, :admin_milestone, @project)
- = link_to new_project_milestone_path(@project), class: 'gl-button btn btn-confirm', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone') do
- = _('New milestone')
+ .nav-controls
+ = render 'shared/milestones/search_form'
+ = render 'shared/milestones_sort_dropdown'
+ - if can?(current_user, :admin_milestone, @project)
+ = link_to new_project_milestone_path(@project), class: 'gl-button btn btn-confirm', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone') do
+ = _('New milestone')
-- if @milestones.blank?
- = render 'shared/empty_states/milestones'
-- else
- .milestones
- #js-delete-milestone-modal
- #promote-milestone-modal
+ - if @milestones.blank?
+ = render 'shared/empty_states/milestones_tab' do
+ - if can?(current_user, :admin_milestone, @project)
+ .text-center
+ = link_to new_project_milestone_path(@project), class: 'gl-button btn btn-confirm', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone') do
+ = _('New milestone')
+
+ - else
+ .milestones
+ #js-delete-milestone-modal
+ #promote-milestone-modal
- %ul.content-list
- = render @milestones
+ %ul.content-list
+ = render @milestones
- = paginate @milestones, theme: 'gitlab'
+ = paginate @milestones, theme: 'gitlab'
+- else
+ = render 'shared/empty_states/milestones' do
+ - if can?(current_user, :admin_milestone, @project)
+ .text-center
+ = link_to new_project_milestone_path(@project), class: 'gl-button btn btn-confirm', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone') do
+ = _('New milestone')
diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml
index 225f8c7dd66..13aa8f56d20 100644
--- a/app/views/projects/milestones/show.html.haml
+++ b/app/views/projects/milestones/show.html.haml
@@ -12,11 +12,9 @@
= render_if_exists 'shared/milestones/burndown', milestone: @milestone, project: @project
- if can?(current_user, :read_issue, @project) && @milestone.total_issues_count == 0
- = render 'shared/global_alert',
- variant: :info,
- dismissible: false,
+ = render Pajamas::AlertComponent.new(dismissible: false,
alert_data: { testid: 'no-issues-alert' },
- alert_class: 'gl-mt-3 gl-mb-5' do
+ alert_class: 'gl-mt-3 gl-mb-5') do
.gl-alert-body
= _('Assign some issues to this milestone.')
- else
diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml
index 3af95633214..bc8400a63f9 100644
--- a/app/views/projects/mirrors/_mirror_repos.html.haml
+++ b/app/views/projects/mirrors/_mirror_repos.html.haml
@@ -14,7 +14,7 @@
.settings-content
- if mirror_settings_enabled
- = form_for @project, url: project_mirror_path(@project), html: { class: 'gl-show-field-errors js-mirror-form', autocomplete: 'new-password', data: mirrors_form_data_attributes } do |f|
+ = gitlab_ui_form_for @project, url: project_mirror_path(@project), html: { class: 'gl-show-field-errors js-mirror-form', autocomplete: 'new-password', data: mirrors_form_data_attributes } do |f|
.panel.panel-default
.panel-body
%div= form_errors(@project)
@@ -37,9 +37,7 @@
.panel-footer
= f.submit _('Mirror repository'), class: 'gl-button btn btn-confirm js-mirror-submit qa-mirror-repository-button', name: :update_remote_mirror
- else
- = render 'shared/global_alert',
- dismissible: false,
- variant: :info do
+ = render Pajamas::AlertComponent.new(dismissible: false) do
.gl-alert-body
= _('Mirror settings are only available to GitLab administrators.')
diff --git a/app/views/projects/mirrors/_ssh_host_keys.html.haml b/app/views/projects/mirrors/_ssh_host_keys.html.haml
index 4411bc474b8..3abab0281a0 100644
--- a/app/views/projects/mirrors/_ssh_host_keys.html.haml
+++ b/app/views/projects/mirrors/_ssh_host_keys.html.haml
@@ -4,7 +4,7 @@
.form-group.js-ssh-host-keys-section{ class: ('collapse' unless mirror.ssh_mirror_url?) }
%button.btn.gl-button.btn-inverted.btn-secondary.inline.js-detect-host-keys.gl-mr-3{ type: 'button', data: { qa_selector: 'detect_host_keys' } }
- .js-spinner.d-none.gl-spinner.mr-1
+ = gl_loading_icon(inline: true, css_class: 'js-spinner gl-display-none gl-mr-2')
= _('Detect host keys')
.fingerprint-ssh-info.js-fingerprint-ssh-info.gl-mt-3.gl-mb-3{ class: ('collapse' unless mirror.ssh_mirror_url?) }
%label.label-bold
diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml
index e3f46d601a3..1331ed24307 100644
--- a/app/views/projects/no_repo.html.haml
+++ b/app/views/projects/no_repo.html.haml
@@ -1,6 +1,8 @@
- page_title _('No repository')
- @skip_current_level_breadcrumb = true
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @project
+
%h2.gl-display-flex
.gl-display-flex.gl-align-items-center.gl-justify-content-center
= sprite_icon('warning-solid', size: 24, css_class: 'gl-mr-2')
diff --git a/app/views/projects/pages/_pages_settings.html.haml b/app/views/projects/pages/_pages_settings.html.haml
index 15fb5755b61..0010564081e 100644
--- a/app/views/projects/pages/_pages_settings.html.haml
+++ b/app/views/projects/pages/_pages_settings.html.haml
@@ -2,21 +2,20 @@
- can_enforce_https_only=Gitlab.config.pages.external_http || Gitlab.config.pages.external_https
- return unless can_edit_max_page_size || can_enforce_https_only
-= form_for @project, url: project_pages_path(@project), html: { class: 'inline', title: pages_https_only_title } do |f|
+= gitlab_ui_form_for @project, url: project_pages_path(@project), html: { class: 'inline', title: pages_https_only_title } do |f|
- if can_edit_max_page_size
= render_if_exists 'shared/pages/max_pages_size_input', form: f
- if can_enforce_https_only
.form-group
- .form-check
- = f.check_box :pages_https_only, class: 'form-check-input', disabled: pages_https_only_disabled?
- = f.label :pages_https_only, class: pages_https_only_label_class do
- %strong
- = s_('GitLabPages|Force HTTPS (requires valid certificates)')
- - docs_link_start = "<a href='#{help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: 'force-https-for-gitlab-pages-websites')}' target='_blank' rel='noopener noreferrer'>".html_safe
- - link_end = '</a>'.html_safe
- %p
- = s_("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}").html_safe % { docs_link_start: docs_link_start, link_end: link_end }
+ = f.gitlab_ui_checkbox_component :pages_https_only,
+ s_('GitLabPages|Force HTTPS (requires valid certificates)'),
+ checkbox_options: { disabled: pages_https_only_disabled? },
+ label_options: { class: 'label-bold' }
+ - docs_link_start = "<a href='#{help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: 'force-https-for-gitlab-pages-websites')}' target='_blank' rel='noopener noreferrer'>".html_safe
+ - link_end = '</a>'.html_safe
+ %p.gl-pl-6
+ = s_("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}").html_safe % { docs_link_start: docs_link_start, link_end: link_end }
.gl-mt-3
= f.submit s_('GitLabPages|Save changes'), class: 'btn btn-confirm gl-button'
diff --git a/app/views/projects/pages_domains/_form.html.haml b/app/views/projects/pages_domains/_form.html.haml
index 453134ce5ab..d3e2854ff19 100644
--- a/app/views/projects/pages_domains/_form.html.haml
+++ b/app/views/projects/pages_domains/_form.html.haml
@@ -1,6 +1,5 @@
- if domain_presenter.errors.any?
- .gl-alert.gl-alert-danger
- = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
+ = render Pajamas::AlertComponent.new(variant: :danger, dismissible: false) do
- domain_presenter.errors.full_messages.each do |msg|
= msg
diff --git a/app/views/projects/pipeline_schedules/_form.html.haml b/app/views/projects/pipeline_schedules/_form.html.haml
index 0818c3d5cff..5ff0e2ccac3 100644
--- a/app/views/projects/pipeline_schedules/_form.html.haml
+++ b/app/views/projects/pipeline_schedules/_form.html.haml
@@ -1,4 +1,4 @@
-= form_for [@project, @schedule], as: :schedule, html: { id: "new-pipeline-schedule-form", class: "js-pipeline-schedule-form pipeline-schedule-form" } do |f|
+= gitlab_ui_form_for [@project, @schedule], as: :schedule, html: { id: "new-pipeline-schedule-form", class: "js-pipeline-schedule-form pipeline-schedule-form" } do |f|
= form_errors(@schedule)
.form-group.row
.col-md-9
@@ -15,7 +15,7 @@
= f.text_field :cron_timezone, value: @schedule.cron_timezone, id: 'schedule_cron_timezone', class: 'hidden', name: 'schedule[cron_timezone]', required: true
.form-group.row
.col-md-9
- = f.label :ref, Feature.enabled?(:pipeline_schedules_with_tags, default_enabled: :yaml) ? _('Target branch or tag') : _('Target branch'), class: 'label-bold'
+ = f.label :ref, _('Target branch or tag'), class: 'label-bold'
%div{ data: { testid: 'schedule-target-ref' } }
.js-target-ref-dropdown{ data: { project_id: @project.id, default_branch: @project.default_branch } }
= f.text_field :ref, value: @schedule.ref, id: 'schedule_ref', class: 'hidden', name: 'schedule[ref]', required: true
@@ -37,8 +37,7 @@
.col-md-9
= f.label :active, s_('PipelineSchedules|Activated'), class: 'label-bold'
%div
- = f.check_box :active, required: false, value: @schedule.active?
- = f.label :active, _('Active'), class: 'gl-font-weight-normal'
+ = f.gitlab_ui_checkbox_component :active, _('Active'), checkbox_options: { value: @schedule.active, required: false }
.footer-block.row-content-block
= f.submit _('Save pipeline schedule'), class: 'btn gl-button btn-confirm'
= link_to _('Cancel'), pipeline_schedules_path(@project), class: 'btn gl-button btn-default btn-cancel'
diff --git a/app/views/projects/pipeline_schedules/index.html.haml b/app/views/projects/pipeline_schedules/index.html.haml
index a56e8f7f5c7..10a49fbd779 100644
--- a/app/views/projects/pipeline_schedules/index.html.haml
+++ b/app/views/projects/pipeline_schedules/index.html.haml
@@ -1,3 +1,5 @@
+= render_if_exists 'shared/minute_limit_banner', namespace: @project
+
- breadcrumb_title _("Schedules")
- page_title _("Pipeline Schedules")
- add_page_specific_style 'page_bundles/pipeline_schedules'
diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml
index f4b242ffc40..817cc6d6e6c 100644
--- a/app/views/projects/pipelines/index.html.haml
+++ b/app/views/projects/pipelines/index.html.haml
@@ -1,3 +1,5 @@
+= render_if_exists 'shared/minute_limit_banner', namespace: @project
+
- page_title _('Pipelines')
- add_page_specific_style 'page_bundles/pipelines'
- add_page_specific_style 'page_bundles/ci_status'
diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml
index ba498352278..2b0a0fc1253 100644
--- a/app/views/projects/pipelines/show.html.haml
+++ b/app/views/projects/pipelines/show.html.haml
@@ -27,6 +27,8 @@
= s_('You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}').html_safe % { gitlab_ci_yml: '.gitlab-ci.yml', lint_link_start: lint_link_start, lint_link_end: '</a>'.html_safe }
#js-pipeline-notification{ data: { deprecated_keywords_doc_path: help_page_path('ci/yaml/index.md', anchor: 'deprecated-keywords'), full_path: @project.full_path, pipeline_iid: @pipeline.iid } }
- = render "projects/pipelines/with_tabs", pipeline: @pipeline, stages: @stages, pipeline_has_errors: pipeline_has_errors
-
+ - if Feature.enabled?(:pipeline_tabs_vue, @project, default_enabled: :yaml)
+ #js-pipeline-tabs{ data: js_pipeline_tabs_data(@project, @pipeline) }
+ - else
+ = render "projects/pipelines/with_tabs", pipeline: @pipeline, stages: @stages, pipeline_has_errors: pipeline_has_errors
.js-pipeline-details-vue{ data: { metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: @project.namespace, project_id: @project, format: :json), pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid, graphql_resource_etag: graphql_etag_pipeline_path(@pipeline) } }
diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml
index f97b9a2b02f..298c2074062 100644
--- a/app/views/projects/project_members/index.html.haml
+++ b/app/views/projects/project_members/index.html.haml
@@ -1,6 +1,8 @@
- add_page_specific_style 'page_bundles/members'
- page_title _("Members")
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @project
+
.row.gl-mt-3
.col-lg-12
- if can_invite_members_for_project?(@project)
diff --git a/app/views/projects/protected_branches/shared/_protected_branch.html.haml b/app/views/projects/protected_branches/shared/_protected_branch.html.haml
index c9e964b2984..6dd3b2e8d5e 100644
--- a/app/views/projects/protected_branches/shared/_protected_branch.html.haml
+++ b/app/views/projects/protected_branches/shared/_protected_branch.html.haml
@@ -20,4 +20,4 @@
- if can_admin_project
%td
- = link_to s_('ProtectedBranch|Unprotect'), [@project, protected_branch, { update_section: 'js-protected-branches-settings' }], disabled: local_assigns[:disabled], aria: { label: s_('ProtectedBranch|Unprotect branch') }, data: { confirm: s_('ProtectedBranch|Branch will be writable for developers. Are you sure?'), confirm_btn_variant: 'danger' }, method: :delete, class: "btn gl-button btn-warning"
+ = link_to s_('ProtectedBranch|Unprotect'), [@project, protected_branch, { update_section: 'js-protected-branches-settings' }], disabled: local_assigns[:disabled], aria: { label: s_('ProtectedBranch|Unprotect branch') }, data: { confirm: s_('ProtectedBranch|Branch will be writable for developers. Are you sure?'), confirm_btn_variant: 'danger' }, method: :delete, class: "btn gl-button btn-danger btn-sm"
diff --git a/app/views/projects/registry/repositories/index.html.haml b/app/views/projects/registry/repositories/index.html.haml
index aab5e9fca98..51f0b6319a1 100644
--- a/app/views/projects/registry/repositories/index.html.haml
+++ b/app/views/projects/registry/repositories/index.html.haml
@@ -19,7 +19,7 @@
"project_path": @project.full_path,
"gid_prefix": container_repository_gid_prefix,
"is_admin": current_user&.admin.to_s,
- "show_cleanup_policy_on_alert": show_cleanup_policy_on_alert(@project).to_s,
+ "show_cleanup_policy_link": show_cleanup_policy_link(@project).to_s,
"cleanup_policies_settings_path": project_settings_packages_and_registries_path(@project),
connection_error: (!!@connection_error).to_s,
invalid_path_error: (!!@invalid_path_error).to_s,
diff --git a/app/views/projects/runners/_runner.html.haml b/app/views/projects/runners/_runner.html.haml
index 5eaf6c9d22b..18803bdd8f3 100644
--- a/app/views/projects/runners/_runner.html.haml
+++ b/app/views/projects/runners/_runner.html.haml
@@ -8,7 +8,7 @@
%span
= "##{runner.id} (#{runner.short_sha})"
- if runner.locked?
- %span.has-tooltip{ title: _('Locked to current projects') }
+ %span.has-tooltip{ title: s_('Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects.') }
= sprite_icon('lock')
.gl-ml-2
.btn-group.btn-group-sm
@@ -22,10 +22,10 @@
= link_to resume_project_runner_path(@project, runner), method: :post, class: 'btn gl-button btn-icon', title: s_('Runners|Resume accepting jobs'), aria: { label: _('Resume') }, data: { toggle: 'tooltip', container: 'body' } do
= sprite_icon('play')
- if runner.belongs_to_one_project?
- = link_to _('Remove runner'), project_runner_path(@project, runner), data: { confirm: _("Are you sure?") }, method: :delete, class: 'btn gl-button btn-danger'
+ = link_to _('Remove runner'), project_runner_path(@project, runner), aria: { label: _('Remove') }, data: { confirm: _("Are you sure?"), 'confirm-btn-variant': 'danger' }, method: :delete, class: 'btn gl-button btn-danger'
- else
- runner_project = @project.runner_projects.find_by(runner_id: runner) # rubocop: disable CodeReuse/ActiveRecord
- = link_to _('Disable for this project'), project_runner_project_path(@project, runner_project), data: { confirm: _("Are you sure?") }, method: :delete, class: 'btn gl-button btn-danger'
+ = link_to _('Disable for this project'), project_runner_project_path(@project, runner_project), aria: { label: _('Disable') }, data: { confirm: _("Are you sure?"), 'confirm-btn-variant': 'danger' }, method: :delete, class: 'btn gl-button btn-danger'
- elsif runner.project_type?
= form_for [@project, @project.runner_projects.new] do |f|
= f.hidden_field :runner_id, value: runner.id
diff --git a/app/views/projects/security/configuration/show.html.haml b/app/views/projects/security/configuration/show.html.haml
index df14bd09a4d..4b82f74d035 100644
--- a/app/views/projects/security/configuration/show.html.haml
+++ b/app/views/projects/security/configuration/show.html.haml
@@ -3,5 +3,6 @@
- @content_class = "limit-container-width" unless fluid_layout
#js-security-configuration{ data: { **@configuration.to_html_data_attribute,
+ vulnerability_training_docs_path: vulnerability_training_docs_path,
upgrade_path: security_upgrade_path,
project_full_path: @project.full_path } }
diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml
index 7a47b504b7c..d1d9a220068 100644
--- a/app/views/projects/services/_form.html.haml
+++ b/app/views/projects/services/_form.html.haml
@@ -5,14 +5,13 @@
-# When using integration.activate_disabled_reason[:trackers], it's potentially insecure to use the raw records
-# when passed directly to the frontend. Only use specific fields that are needed for render.
-# For example, we can get the link to each tracker with scoped_edit_integration_path(tracker, tracker.project)
- = render 'shared/global_alert',
- title: s_('ExternalIssueIntegration|Another issue tracker is already in use'),
+ = render Pajamas::AlertComponent.new(title: s_('ExternalIssueIntegration|Another issue tracker is already in use'),
variant: :warning,
- dismissible: false do
+ dismissible: false) do
.gl-alert-body
= s_('ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again.')
-%h3.page-title
+%h2.gl-mb-4
= integration.title
- if integration.operating?
= sprite_icon('check', css_class: 'gl-text-green-500')
diff --git a/app/views/projects/services/prometheus/_configuration_banner.html.haml b/app/views/projects/services/prometheus/_configuration_banner.html.haml
deleted file mode 100644
index a34aa22acbb..00000000000
--- a/app/views/projects/services/prometheus/_configuration_banner.html.haml
+++ /dev/null
@@ -1,26 +0,0 @@
-%h4
- = s_('PrometheusService|Prometheus cluster integration')
-
-- if integration.manual_configuration?
- .info-well
- = s_('PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration.')
-- else
- .container-fluid
- .row
- - if integration.prometheus_available?
- .col-sm-2
- .svg-container
- = image_tag 'illustrations/monitoring/getting_started.svg'
- .col-sm-10
- %p.text-success.gl-mt-3
- = s_('PrometheusService|You have a cluster with the Prometheus integration enabled.')
- = link_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), class: 'btn gl-button'
- - else
- .col-sm-2
- = image_tag 'illustrations/monitoring/loading.svg'
- .col-sm-10
- %p.gl-mt-3
- = s_('PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters.')
- = link_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), class: 'btn gl-button btn-confirm'
-
-%hr
diff --git a/app/views/projects/services/prometheus/_help.html.haml b/app/views/projects/services/prometheus/_help.html.haml
index 9b3cb8893c4..f40d8638845 100644
--- a/app/views/projects/services/prometheus/_help.html.haml
+++ b/app/views/projects/services/prometheus/_help.html.haml
@@ -1,5 +1,6 @@
- if @project
- = render 'projects/services/prometheus/configuration_banner', project: @project, integration: integration
+ = render 'shared/prometheus_configuration_banner', project: @project, integration: integration, header_tag: :h4
+ %hr
%h4.gl-mb-3
= s_('PrometheusService|Manual configuration')
diff --git a/app/views/projects/services/prometheus/_top.html.haml b/app/views/projects/services/prometheus/_top.html.haml
index f7446273a80..52b29ea2e8f 100644
--- a/app/views/projects/services/prometheus/_top.html.haml
+++ b/app/views/projects/services/prometheus/_top.html.haml
@@ -2,8 +2,7 @@
.row
.col-lg-12
- .gl-alert.gl-alert-info{ role: 'alert' }
- = sprite_icon('information-o', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
+ = render Pajamas::AlertComponent.new(dismissible: false) do
.gl-alert-body
= s_('AlertSettings|You can now set up alert endpoints for manually configured Prometheus instances in the Alerts section on the Operations settings page. Alert endpoint fields on this page have been deprecated.')
.gl-alert-actions
diff --git a/app/views/projects/settings/_archive.html.haml b/app/views/projects/settings/_archive.html.haml
index 12cb1c3574a..1b0294bc967 100644
--- a/app/views/projects/settings/_archive.html.haml
+++ b/app/views/projects/settings/_archive.html.haml
@@ -18,5 +18,5 @@
%p= _("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}").html_safe % { strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe, link_start: link_start, link_end: '</a>'.html_safe }
= link_to _('Archive project'), archive_project_path(@project),
aria: { label: _('Archive project') },
- data: { confirm: _("Are you sure that you want to archive this project?"), qa_selector: 'archive_project_link', 'confirm-btn-variant': 'warning' },
- method: :post, class: "gl-button btn btn-warning"
+ data: { confirm: _("Are you sure that you want to archive this project?"), qa_selector: 'archive_project_link', 'confirm-btn-variant': 'confirm' },
+ method: :post, class: "gl-button btn btn-confirm"
diff --git a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml
index 43d34173af6..7783e83b88f 100644
--- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml
@@ -11,22 +11,19 @@
.row
.col-lg-12
- = form_for @project, url: project_settings_ci_cd_path(@project, anchor: 'autodevops-settings') do |f|
+ = gitlab_ui_form_for @project, url: project_settings_ci_cd_path(@project, anchor: 'autodevops-settings') do |f|
= form_errors(@project)
%fieldset.builds-feature.js-auto-devops-settings
.form-group
= f.fields_for :auto_devops_attributes, @auto_devops do |form|
.card.auto-devops-card
.card-body
- .form-check
- = form.check_box :enabled, class: 'form-check-input js-toggle-extra-settings', checked: auto_devops_enabled, data: { qa_selector: 'enable_autodevops_checkbox' }
- = form.label :enabled, class: 'form-check-label' do
- %strong= s_('CICD|Default to Auto DevOps pipeline')
- - if auto_devops_enabled
- = gl_badge_tag badge_for_auto_devops_scope(@project), { variant: :info }, { class: 'js-instance-default-badge'}
- .form-text.text-muted
- = s_('CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found.')
- = link_to _('Learn more.'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer'
+ - autodevops_help_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer'
+ - auto_devops_badge = auto_devops_enabled ? (gl_badge_tag badge_for_auto_devops_scope(@project), { variant: :info }, { class: 'js-instance-default-badge gl-ml-3 gl-mt-n1'}) : ''
+ = form.gitlab_ui_checkbox_component :enabled,
+ (s_('CICD|Default to Auto DevOps pipeline') + auto_devops_badge).html_safe,
+ checkbox_options: { class: 'js-toggle-extra-settings', checked: auto_devops_enabled, data: { qa_selector: 'enable_autodevops_checkbox' } },
+ help_text: (s_('CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found.') + ' ' + autodevops_help_link).html_safe
.card-footer.js-extra-settings{ class: auto_devops_enabled || 'hidden' }
- if @project.all_clusters.empty?
%p.settings-message.text-center
diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml
index 66a1cbb4649..5ef56cda6d2 100644
--- a/app/views/projects/settings/ci_cd/_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_form.html.haml
@@ -1,35 +1,28 @@
+- help_link_public_pipelines = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'change-which-users-can-view-your-pipelines'), target: '_blank', rel: 'noopener noreferrer'
+- help_link_auto_canceling = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'auto-cancel-redundant-pipelines'), target: '_blank', rel: 'noopener noreferrer'
+- help_link_skip_outdated =link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'skip-outdated-deployment-jobs'), target: '_blank', rel: 'noopener noreferrer'
+
.row.gl-mt-3
.col-lg-12
- = form_for @project, url: project_settings_ci_cd_path(@project, anchor: 'js-general-pipeline-settings') do |f|
+ = gitlab_ui_form_for @project, url: project_settings_ci_cd_path(@project, anchor: 'js-general-pipeline-settings') do |f|
= form_errors(@project)
%fieldset.builds-feature
.form-group
- .form-check
- = f.check_box :public_builds, { class: 'form-check-input' }
- = f.label :public_builds, class: 'form-check-label' do
- %strong= _("Public pipelines")
- .form-text.text-muted
- = _("Allow public access to pipelines and job details, including output logs and artifacts.")
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'change-which-users-can-view-your-pipelines'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :public_builds,
+ _("Public pipelines"),
+ help_text: (_('Allow public access to pipelines and job details, including output logs and artifacts.') + ' ' + help_link_public_pipelines).html_safe
.form-group
- .form-check
- = f.check_box :auto_cancel_pending_pipelines, { class: 'form-check-input' }, 'enabled', 'disabled'
- = f.label :auto_cancel_pending_pipelines, class: 'form-check-label' do
- %strong= _("Auto-cancel redundant pipelines")
- .form-text.text-muted
- = _("New pipelines cause older pending or running pipelines on the same branch to be cancelled.")
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'auto-cancel-redundant-pipelines'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :auto_cancel_pending_pipelines,
+ _("Auto-cancel redundant pipelines"),
+ checked_value: 'enabled',
+ unchecked_value: 'disabled',
+ help_text: (_('New pipelines cause older pending or running pipelines on the same branch to be cancelled.') + ' ' + help_link_auto_canceling).html_safe
.form-group
- .form-check
- = f.fields_for :ci_cd_settings_attributes, @project.ci_cd_settings do |form|
- = form.check_box :forward_deployment_enabled, { class: 'form-check-input' }
- = form.label :forward_deployment_enabled, class: 'form-check-label' do
- %strong= _("Skip outdated deployment jobs")
- .form-text.text-muted
- = _("When a deployment job is successful, skip older deployment jobs that are still pending.")
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'skip-outdated-deployment-jobs'), target: '_blank', rel: 'noopener noreferrer'
+ = f.fields_for :ci_cd_settings_attributes, @project.ci_cd_settings do |form|
+ = form.gitlab_ui_checkbox_component :forward_deployment_enabled, _("Skip outdated deployment jobs"),
+ help_text: (_('When a deployment job is successful, skip older deployment jobs that are still pending.') + ' ' + help_link_skip_outdated).html_safe
.form-group
= f.label :ci_config_path, _('CI/CD configuration file'), class: 'label-bold'
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index f342728feee..28cde994d00 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -1,3 +1,5 @@
+= render_if_exists 'shared/minute_limit_banner', namespace: @project
+
- @content_class = "limit-container-width" unless fluid_layout
- page_title _("CI/CD Settings")
- page_title _("CI/CD")
diff --git a/app/views/projects/settings/operations/_configuration_banner.html.haml b/app/views/projects/settings/operations/_configuration_banner.html.haml
deleted file mode 100644
index 9803ffc3c4e..00000000000
--- a/app/views/projects/settings/operations/_configuration_banner.html.haml
+++ /dev/null
@@ -1,24 +0,0 @@
-%b
- = s_('PrometheusService|Prometheus cluster integration')
-
-- if service.manual_configuration?
- .info-well.p-2.mt-2
- = s_('PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration.')
-- else
- .container-fluid
- .row
- - if service.prometheus_available?
- .col-sm-2
- .svg-container
- = image_tag 'illustrations/monitoring/getting_started.svg'
- .col-sm-10
- %p.text-success.gl-mt-3
- = s_('PrometheusService|You have a cluster with the Prometheus integration enabled.')
- = link_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), class: 'gl-button btn btn-default'
- - else
- .col-sm-2
- = image_tag 'illustrations/monitoring/loading.svg'
- .col-sm-10
- %p.gl-mt-3
- = s_('PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters.')
- = link_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), class: 'btn gl-button btn-confirm'
diff --git a/app/views/projects/settings/operations/_prometheus.html.haml b/app/views/projects/settings/operations/_prometheus.html.haml
index 1c7bcbbca0b..93281cc225b 100644
--- a/app/views/projects/settings/operations/_prometheus.html.haml
+++ b/app/views/projects/settings/operations/_prometheus.html.haml
@@ -9,7 +9,7 @@
= link_to _('More information'), help_page_path('user/project/integrations/prometheus'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
- if @project
- = render 'projects/settings/operations/configuration_banner', project: @project, service: service
+ = render 'shared/prometheus_configuration_banner', project: @project, integration: service, header_tag: :b, info_well_classes: 'gl-p-3 gl-mt-3'
%b.gl-mb-3
= s_('PrometheusService|Manual configuration')
diff --git a/app/views/projects/settings/operations/show.html.haml b/app/views/projects/settings/operations/show.html.haml
index 4e94c96fdde..9a31666c316 100644
--- a/app/views/projects/settings/operations/show.html.haml
+++ b/app/views/projects/settings/operations/show.html.haml
@@ -15,7 +15,7 @@
= s_('Deprecations|Feature deprecation and removal')
.gl-alert-body
%p
- = html_escape(s_('Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}.')) % {removal_link_start: removal_epic_link_start, opstrace_link_start: opstrace_link_start, link_end: link_end }
+ = html_escape(s_('Deprecations|The metrics feature was deprecated in GitLab 14.7. The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}.')) % {removal_link_start: removal_epic_link_start, opstrace_link_start: opstrace_link_start, link_end: link_end }
= render 'projects/settings/operations/metrics_dashboard'
= render 'projects/settings/operations/tracing'
diff --git a/app/views/projects/settings/packages_and_registries/show.html.haml b/app/views/projects/settings/packages_and_registries/show.html.haml
index 658b2f2e65c..378bb0f9306 100644
--- a/app/views/projects/settings/packages_and_registries/show.html.haml
+++ b/app/views/projects/settings/packages_and_registries/show.html.haml
@@ -11,5 +11,5 @@
admin_settings_path: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'),
enable_historic_entries: container_expiration_policies_historic_entry_enabled?.to_s,
help_page_path: help_page_path('user/packages/container_registry/reduce_container_registry_storage', anchor: 'cleanup-policy'),
- show_cleanup_policy_on_alert: show_cleanup_policy_on_alert(@project).to_s,
+ show_cleanup_policy_link: show_cleanup_policy_link(@project).to_s,
tags_regex_help_page_path: help_page_path('user/packages/container_registry/reduce_container_registry_storage', anchor: 'regex-pattern-examples') } }
diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml
index d840ea01b89..1934f293b0f 100644
--- a/app/views/projects/show.html.haml
+++ b/app/views/projects/show.html.haml
@@ -6,6 +6,8 @@
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, project_path(@project, rss_url_options), title: "#{@project.name} activity")
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @project
+= render_if_exists 'shared/minute_limit_banner', namespace: @project
= render partial: 'flash_messages', locals: { project: @project }
= render "projects/last_push"
diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml
index 4a44ad2337f..a654d0a8863 100644
--- a/app/views/projects/tags/index.html.haml
+++ b/app/views/projects/tags/index.html.haml
@@ -29,9 +29,12 @@
- else
.nothing-here-block
- = s_('TagsPage|Repository has no tags yet.')
- %br
- %small
- = s_('TagsPage|Use git tag command to add a new one:')
+ - if @search.present?
+ = s_('TagsPage|Sorry, your filter produced no results.')
+ - else
+ = s_('TagsPage|Repository has no tags yet.')
%br
- %span.monospace git tag -a v1.4 -m 'version 1.4'
+ %small
+ = s_('TagsPage|Use git tag command to add a new one:')
+ %br
+ %span.monospace git tag -a v1.4 -m 'version 1.4'
diff --git a/app/views/projects/tracings/show.html.haml b/app/views/projects/tracings/show.html.haml
index a7a02ab917e..c9aac68b19d 100644
--- a/app/views/projects/tracings/show.html.haml
+++ b/app/views/projects/tracings/show.html.haml
@@ -14,7 +14,7 @@
= s_('Deprecations|Feature deprecation and removal')
.gl-alert-body
%p
- = html_escape(s_('Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}.')) % {removal_link_start: removal_epic_link_start, opstrace_link_start: opstrace_link_start, link_end: link_end }
+ = html_escape(s_('Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}.')) % {removal_link_start: removal_epic_link_start, opstrace_link_start: opstrace_link_start, link_end: link_end }
- if @project.tracing_external_url.present?
%h3.page-title= _('Tracing')
diff --git a/app/views/registrations/welcome/show.html.haml b/app/views/registrations/welcome/show.html.haml
index 44dffdbf70a..6235cce5d80 100644
--- a/app/views/registrations/welcome/show.html.haml
+++ b/app/views/registrations/welcome/show.html.haml
@@ -17,7 +17,7 @@
%p.gl-text-center= html_escape(_('%{gitlab_experience_text}. We won\'t share this information with anyone.')) % { gitlab_experience_text: gitlab_experience_text }
- else
%p.gl-text-center= html_escape(_('%{gitlab_experience_text}. Don\'t worry, this information isn\'t shared outside of your self-managed GitLab instance.')) % { gitlab_experience_text: gitlab_experience_text }
- = form_for(current_user, url: users_sign_up_welcome_path, html: { class: 'card gl-w-full! gl-p-5', 'aria-live' => 'assertive' }) do |f|
+ = gitlab_ui_form_for(current_user, url: users_sign_up_welcome_path, html: { class: 'card gl-w-full! gl-p-5', 'aria-live' => 'assertive' }) do |f|
.devise-errors
= render 'devise/shared/error_messages', resource: current_user
.row
diff --git a/app/views/search/results/_blob_highlight.html.haml b/app/views/search/results/_blob_highlight.html.haml
index 729eda331b5..7ba114496af 100644
--- a/app/views/search/results/_blob_highlight.html.haml
+++ b/app/views/search/results/_blob_highlight.html.haml
@@ -6,7 +6,7 @@
.blob-content{ data: { blob_id: blob.id, path: blob.path, highlight_line: highlight, qa_selector: 'file_content' } }
- blob.present.highlight.lines.each_with_index do |line, index|
- i = index + offset
- .line_holder.code-search-line
+ .line_holder.code-search-line.gl-display-flex
.line-numbers
.gl-display-flex
%span.diff-line-num.gl-pl-3
@@ -22,7 +22,7 @@
%a{ href: "#{blob_link}#L#{i}", id: "blob-L#{i}", 'data-line-number' => i, class: 'gl-display-flex! gl-align-items-center gl-justify-content-end' }
= sprite_icon('link', css_class: 'gl-ml-3! gl-mr-1!')
= i
- %pre.code.highlight
+ %pre.code.highlight.flex-grow-1
%code
= line.html_safe
diff --git a/app/views/shared/_allow_request_access.html.haml b/app/views/shared/_allow_request_access.html.haml
index ca09fd39dc1..608a0ca37d9 100644
--- a/app/views/shared/_allow_request_access.html.haml
+++ b/app/views/shared/_allow_request_access.html.haml
@@ -1,6 +1,3 @@
-- label_class = local_assigns.fetch(:bold_label, false) ? 'font-weight-bold' : ''
-
= form.gitlab_ui_checkbox_component :request_access_enabled,
_('Allow users to request access (if visibility is public or internal)'),
- label_options: { class: label_class },
checkbox_options: { data: { qa_selector: 'request_access_checkbox' } }
diff --git a/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml b/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
index 35a3835a522..fdd4dfba616 100644
--- a/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
+++ b/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
@@ -1,9 +1,7 @@
- if show_auto_devops_implicitly_enabled_banner?(project, current_user)
- = render 'shared/global_alert',
- variant: :info,
- alert_class: 'qa-auto-devops-banner auto-devops-implicitly-enabled-banner',
+ = render Pajamas::AlertComponent.new(alert_class: 'qa-auto-devops-banner auto-devops-implicitly-enabled-banner',
close_button_class: 'hide-auto-devops-implicitly-enabled-banner',
- close_button_data: { project_id: project.id } do
+ close_button_data: { project_id: project.id }) do
.gl-alert-body
= s_("AutoDevOps|The Auto DevOps pipeline has been enabled and will be used if no alternative CI configuration file is found.")
- unless Gitlab.config.registry.enabled
diff --git a/app/views/shared/_broadcast_message.html.haml b/app/views/shared/_broadcast_message.html.haml
index 7aaae3a88f3..ab6423e9ade 100644
--- a/app/views/shared/_broadcast_message.html.haml
+++ b/app/views/shared/_broadcast_message.html.haml
@@ -1,12 +1,29 @@
-- is_banner = message.broadcast_type == 'banner'
+- icon_name = 'bullhorn'
+- dismissable = message.dismissable?
+- preview = local_assigns.fetch(:preview, false)
-%div{ class: "broadcast-message #{'alert-warning' if is_banner} broadcast-#{message.broadcast_type}-message #{opts[:preview] && 'preview'} js-broadcast-notification-#{message.id} gl-display-flex",
- style: broadcast_message_style(message), dir: 'auto' }
- .gl-flex-grow-1.gl-text-right.gl-pr-3
- = sprite_icon('bullhorn', css_class: 'vertical-align-text-top')
- %div{ class: !fluid_layout && 'container-limited' }
- = render_broadcast_message(message)
- .gl-flex-grow-1.gl-flex-basis-0.gl-text-right
- - if (message.notification? || message.dismissable?) && opts[:preview].blank?
+- unless message.notification?
+ .gl-broadcast-message.broadcast-banner-message{ role: "alert", class: "js-broadcast-notification-#{message.id} #{message.theme}" }
+ .gl-broadcast-message-content
+ .gl-broadcast-message-icon
+ = sprite_icon(icon_name)
+ .gl-broadcast-message-text.js-broadcast-message-preview
+ - if message.message.present?
+ = render_broadcast_message(message)
+ - else
+ = yield
+ - if dismissable && !preview
+ %button.btn.gl-close-btn-color-inherit.gl-broadcast-message-dismiss.btn-default.btn-sm.gl-button.btn-default-tertiary.btn-icon.js-dismiss-current-broadcast-notification{ 'aria-label' => _('Close'), :type => 'button', data: { id: message.id, expire_date: message.ends_at.iso8601 } }
+ = sprite_icon('close', size: 16, css_class: "gl-icon gl-mx-3! gl-text-white")
+- else
+ - notification_class = "js-broadcast-notification-#{message.id}"
+ - notification_class << ' preview' if preview
+ .broadcast-message.broadcast-notification-message.mt-2{ role: "alert", class: notification_class }
+ = sprite_icon(icon_name, css_class: 'vertical-align-text-top')
+ - if message.message.present?
+ = render_broadcast_message(message)
+ - else
+ = yield
+ - if !preview
%button.js-dismiss-current-broadcast-notification.btn.btn-link.gl-button{ 'aria-label' => _('Close'), :type => 'button', data: { id: message.id, expire_date: message.ends_at.iso8601 } }
- = sprite_icon('close', size: 16, css_class: "gl-icon gl-mx-3! #{is_banner ? 'gl-text-white' : 'gl-text-gray-700'}")
+ = sprite_icon('close', size: 16, css_class: "gl-icon gl-mx-3! gl-text-gray-700")
diff --git a/app/views/shared/_global_alert.html.haml b/app/views/shared/_global_alert.html.haml
deleted file mode 100644
index cb7ad32e474..00000000000
--- a/app/views/shared/_global_alert.html.haml
+++ /dev/null
@@ -1,21 +0,0 @@
-- icons = { info: 'information-o', warning: 'warning', success: 'check-circle', danger: 'error', tip: 'bulb' }
-
-- title = local_assigns.fetch(:title, nil)
-- variant = local_assigns.fetch(:variant, :info)
-- dismissible = local_assigns.fetch(:dismissible, true)
-- alert_class = local_assigns.fetch(:alert_class, nil)
-- alert_data = local_assigns.fetch(:alert_data, nil)
-- close_button_class = local_assigns.fetch(:close_button_class, nil)
-- close_button_data = local_assigns.fetch(:close_button_data, nil)
-- icon = icons[variant]
-
-%div{ role: 'alert', class: ['gl-alert', "gl-alert-#{variant}", alert_class], data: alert_data }
- = sprite_icon(icon, css_class: "gl-alert-icon#{' gl-alert-icon-no-title' if title.nil?}")
- - if dismissible
- %button.btn.gl-dismiss-btn.btn-default.btn-sm.gl-button.btn-default-tertiary.btn-icon.js-close{ type: 'button', aria: { label: _('Dismiss') }, class: close_button_class, data: close_button_data }
- = sprite_icon('close')
- .gl-alert-content{ role: 'alert' }
- - if title
- %h4.gl-alert-title
- = title
- = yield
diff --git a/app/views/shared/_import_form.html.haml b/app/views/shared/_import_form.html.haml
index 3ab2b969b75..850d58920db 100644
--- a/app/views/shared/_import_form.html.haml
+++ b/app/views/shared/_import_form.html.haml
@@ -8,11 +8,10 @@
= _('Git repository URL')
= 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: :danger,
+ = render Pajamas::AlertComponent.new(variant: :danger,
alert_class: 'gl-mt-3 js-import-url-error hide',
dismissible: false,
- close_button_class: 'js-close-2fa-enabled-success-alert' do
+ close_button_class: 'js-close-2fa-enabled-success-alert') do
.gl-alert-body
= s_('Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials.')
.row
diff --git a/app/views/shared/_milestones_sort_dropdown.html.haml b/app/views/shared/_milestones_sort_dropdown.html.haml
index 29c01343358..1c6eb7aa96b 100644
--- a/app/views/shared/_milestones_sort_dropdown.html.haml
+++ b/app/views/shared/_milestones_sort_dropdown.html.haml
@@ -1,22 +1,4 @@
-.dropdown.inline.gl-ml-3
- %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown' } }
- %span.light
- - if @sort.present?
- = milestone_sort_options_hash[@sort]
- - else
- = sort_title_due_date_soon
- = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3')
- %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-sort
- %li
- = link_to page_filter_path(sort: sort_value_due_date_soon) do
- = sort_title_due_date_soon
- = link_to page_filter_path(sort: sort_value_due_date_later) do
- = sort_title_due_date_later
- = link_to page_filter_path(sort: sort_value_start_date_soon) do
- = sort_title_start_date_soon
- = link_to page_filter_path(sort: sort_value_start_date_later) do
- = sort_title_start_date_later
- = link_to page_filter_path(sort: sort_value_name) do
- = sort_title_name_asc
- = link_to page_filter_path(sort: sort_value_name_desc) do
- = sort_title_name_desc
+- milestones_sort_options = milestones_sort_options_hash.map { |value, text| { value: value, text: text, href: page_filter_path(sort: value) } }
+
+%div{ data: {testid: 'milestone_sort_by_dropdown'} }
+ = gl_redirect_listbox_tag milestones_sort_options, @sort, class: 'gl-ml-3'
diff --git a/app/views/shared/_no_password.html.haml b/app/views/shared/_no_password.html.haml
index d1e1a8a819d..195bd15f840 100644
--- a/app/views/shared/_no_password.html.haml
+++ b/app/views/shared/_no_password.html.haml
@@ -1,8 +1,7 @@
- if show_no_password_message?
- = render 'shared/global_alert',
- variant: :warning,
+ = render Pajamas::AlertComponent.new(variant: :warning,
alert_class: 'js-no-password-message',
- close_button_class: 'js-hide-no-password-message' do
+ close_button_class: 'js-hide-no-password-message') do
.gl-alert-body
= no_password_message
.gl-alert-actions
diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml
index 20dc1b41970..d30679b4305 100644
--- a/app/views/shared/_no_ssh.html.haml
+++ b/app/views/shared/_no_ssh.html.haml
@@ -1,8 +1,7 @@
- if show_no_ssh_key_message?
- = render 'shared/global_alert',
- variant: :warning,
+ = render Pajamas::AlertComponent.new(variant: :warning,
alert_class: 'js-no-ssh-message',
- close_button_class: 'js-hide-no-ssh-message' do
+ close_button_class: 'js-hide-no-ssh-message') do
.gl-alert-body
= s_("MissingSSHKeyWarningLink|You can't push or pull repositories using SSH until you add an SSH key to your profile.")
.gl-alert-actions
diff --git a/app/views/shared/_outdated_browser.html.haml b/app/views/shared/_outdated_browser.html.haml
index f5a32050a79..76fb34985c0 100644
--- a/app/views/shared/_outdated_browser.html.haml
+++ b/app/views/shared/_outdated_browser.html.haml
@@ -1,6 +1,5 @@
- if outdated_browser?
- .gl-alert.gl-alert-danger.outdated-browser{ :role => "alert" }
- = sprite_icon('error', css_class: "gl-alert-icon gl-alert-icon-no-title gl-icon")
+ = render Pajamas::AlertComponent.new(variant: :danger, dismissible: false) do
.gl-alert-body
= s_('OutdatedBrowser|GitLab may not work properly, because you are using an outdated web browser.')
%br
diff --git a/app/views/shared/_project_limit.html.haml b/app/views/shared/_project_limit.html.haml
index 90612ba623f..7e1874f3416 100644
--- a/app/views/shared/_project_limit.html.haml
+++ b/app/views/shared/_project_limit.html.haml
@@ -1,8 +1,7 @@
- if cookies[:hide_project_limit_message].blank? && !current_user.hide_project_limit && !current_user.can_create_project? && current_user.projects_limit > 0
- = render 'shared/global_alert',
- variant: :warning,
+ = render Pajamas::AlertComponent.new(variant: :warning,
dismissible: false,
- alert_class: 'project-limit-message' do
+ alert_class: 'project-limit-message') do
.gl-alert-body
= _("You won't be able to create new projects because you have reached your project limit.")
.gl-alert-actions
diff --git a/app/views/shared/_prometheus_configuration_banner.html.haml b/app/views/shared/_prometheus_configuration_banner.html.haml
new file mode 100644
index 00000000000..2d948cf28a6
--- /dev/null
+++ b/app/views/shared/_prometheus_configuration_banner.html.haml
@@ -0,0 +1,27 @@
+- header_tag = local_assigns.fetch(:header_tag)
+- info_well_classes = local_assigns.fetch(:info_well_classes, '')
+- integration = local_assigns.fetch(:integration)
+
+= content_tag(header_tag, s_('PrometheusService|Prometheus cluster integration'))
+
+- if integration.manual_configuration?
+ .info-well{ class: info_well_classes }
+ = s_('PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration.')
+- else
+ .container-fluid
+ .row
+ - if integration.prometheus_available?
+ .col-sm-2
+ .svg-container
+ = image_tag 'illustrations/monitoring/getting_started.svg'
+ .col-sm-10
+ %p.text-success.gl-mt-3
+ = s_('PrometheusService|You have a cluster with the Prometheus integration enabled.')
+ = link_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), class: 'btn gl-button btn-default'
+ - else
+ .col-sm-2
+ = image_tag 'illustrations/monitoring/loading.svg'
+ .col-sm-10
+ %p.gl-mt-3
+ = s_('PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters.')
+ = link_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), class: 'btn gl-button btn-confirm'
diff --git a/app/views/shared/_service_ping_consent.html.haml b/app/views/shared/_service_ping_consent.html.haml
index 9cdff35ead2..96f015c7a4b 100644
--- a/app/views/shared/_service_ping_consent.html.haml
+++ b/app/views/shared/_service_ping_consent.html.haml
@@ -1,7 +1,5 @@
- if session[:ask_for_usage_stats_consent]
- = render 'shared/global_alert',
- variant: :info,
- alert_class: 'service-ping-consent-message' do
+ = render Pajamas::AlertComponent.new(alert_class: 'service-ping-consent-message') do
.gl-alert-body
- docs_link = link_to _('collect usage information'), help_page_path('user/admin_area/settings/usage_statistics.md'), class: 'gl-link'
- settings_link = link_to _('your settings'), metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), class: 'gl-link'
diff --git a/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml b/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml
index f21acd26ada..2294c44d49f 100644
--- a/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml
+++ b/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml
@@ -1,8 +1,9 @@
-= render 'shared/global_alert',
- variant: :warning,
+= render Pajamas::AlertComponent.new(variant: :warning,
alert_class: 'js-recovery-settings-callout gl-mt-5',
- alert_data: { feature_id: Users::CalloutsHelper::TWO_FACTOR_AUTH_RECOVERY_SETTINGS_CHECK, dismiss_endpoint: callouts_path, defer_links: 'true' },
- close_button_data: { testid: 'close-account-recovery-regular-check-callout' } do
+ alert_data: { feature_id: Users::CalloutsHelper::TWO_FACTOR_AUTH_RECOVERY_SETTINGS_CHECK,
+ dismiss_endpoint: callouts_path,
+ defer_links: 'true' },
+ close_button_data: { testid: 'close-account-recovery-regular-check-callout' }) do
.gl-alert-body
= s_('Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place.')
= link_to _('Learn more.'), help_page_path('user/profile/account/two_factor_authentication', anchor: 'recovery-codes'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/shared/access_tokens/_form.html.haml b/app/views/shared/access_tokens/_form.html.haml
index 0b68cfe65e5..d4106ba4e5d 100644
--- a/app/views/shared/access_tokens/_form.html.haml
+++ b/app/views/shared/access_tokens/_form.html.haml
@@ -10,7 +10,7 @@
%p.profile-settings-content
= _("Enter the name of your application, and we'll return a unique %{type}.") % { type: type }
-= form_for token, as: prefix, url: path, method: :post, html: { class: 'js-requires-input' } do |f|
+= gitlab_ui_form_for token, as: prefix, url: path, method: :post, html: { class: 'js-requires-input' } do |f|
= form_errors(token)
@@ -42,7 +42,7 @@
%p.text-secondary#select_scope_help_text
= s_('Tokens|Scopes set the permission levels granted to the token.')
= link_to _("Learn more."), help_path, target: '_blank', rel: 'noopener noreferrer'
- = render 'shared/tokens/scopes_form', prefix: prefix, token: token, scopes: scopes
+ = render 'shared/tokens/scopes_form', prefix: prefix, token: token, scopes: scopes, f: f
- if prefix == :personal_access_token && Feature.enabled?(:personal_access_tokens_scoped_to_projects, current_user)
.js-access-tokens-projects
diff --git a/app/views/shared/boards/_show.html.haml b/app/views/shared/boards/_show.html.haml
index 98752345074..c070baf02b1 100644
--- a/app/views/shared/boards/_show.html.haml
+++ b/app/views/shared/boards/_show.html.haml
@@ -16,6 +16,4 @@
- page_title("#{board.name}", _("Boards"))
- add_page_specific_style 'page_bundles/boards'
-= render 'shared/issuable/search_bar', type: :boards, board: board
-
#js-issuable-board-app{ data: board_data }
diff --git a/app/views/shared/boards/_switcher.html.haml b/app/views/shared/boards/_switcher.html.haml
deleted file mode 100644
index c667b3a4626..00000000000
--- a/app/views/shared/boards/_switcher.html.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-- parent = board.resource_parent
-- milestone_filter_opts = { format: :json }
-- milestone_filter_opts = milestone_filter_opts.merge(only_group_milestones: true) if board.group_board?
-- weights = Gitlab.ee? ? ([Issue::WEIGHT_ANY] + Issue.weight_options) : []
-
-#js-multiple-boards-switcher.inline.boards-switcher{ data: { milestone_path: milestones_filter_path(milestone_filter_opts),
- board_base_url: board_base_url,
- has_missing_boards: (!multiple_boards_available? && current_board_parent.boards.size > 1).to_s,
- can_admin_board: can?(current_user, :admin_issue_board, parent).to_s,
- multiple_issue_boards_available: parent.multiple_issue_boards_available?.to_s,
- scoped_issue_board_feature_enabled: Gitlab.ee? && parent.feature_available?(:scoped_issue_board) ? 'true' : 'false',
- weights: weights.to_json } }
diff --git a/app/views/shared/deploy_keys/_form.html.haml b/app/views/shared/deploy_keys/_form.html.haml
index bf2514f8b0d..b60d433bafa 100644
--- a/app/views/shared/deploy_keys/_form.html.haml
+++ b/app/views/shared/deploy_keys/_form.html.haml
@@ -27,8 +27,5 @@
.form-group
.col-form-label.col-sm-2
.col-sm-10
- = deploy_keys_project_form.label :can_push do
- = deploy_keys_project_form.check_box :can_push
- %strong= _('Grant write permissions to this key')
- %p.light.gl-mb-0
- = _('Allow this key to push to this repository')
+ = deploy_keys_project_form.gitlab_ui_checkbox_component :can_push, _('Grant write permissions to this key'),
+ help_text: _('Allow this key to push to this repository')
diff --git a/app/views/shared/deploy_keys/_project_group_form.html.haml b/app/views/shared/deploy_keys/_project_group_form.html.haml
index 8da48a7936a..c9edf09b350 100644
--- a/app/views/shared/deploy_keys/_project_group_form.html.haml
+++ b/app/views/shared/deploy_keys/_project_group_form.html.haml
@@ -1,4 +1,4 @@
-= form_for [@project.namespace, @project, @deploy_keys.new_key], url: namespace_project_deploy_keys_path, html: { class: "js-requires-input container" } do |f|
+= gitlab_ui_form_for [@project.namespace, @project, @deploy_keys.new_key], url: namespace_project_deploy_keys_path, html: { class: "js-requires-input container" } do |f|
= form_errors(@deploy_keys.new_key)
.form-group.row
= f.label :title, class: "label-bold"
@@ -13,12 +13,8 @@
= f.fields_for :deploy_keys_projects do |deploy_keys_project_form|
.form-group.row
- = deploy_keys_project_form.label :can_push do
- = deploy_keys_project_form.check_box :can_push
- %strong= _('Grant write permissions to this key')
- .form-group.row
- %p.light.gl-mb-0
- = _('Allow this key to push to this repository')
+ = deploy_keys_project_form.gitlab_ui_checkbox_component :can_push, _('Grant write permissions to this key'),
+ help_text: _('Allow this key to push to this repository')
.form-group.row
= f.submit _("Add key"), class: "btn gl-button btn-confirm", data: { qa_selector: "add_deploy_key_button"}
diff --git a/app/views/shared/doorkeeper/applications/_form.html.haml b/app/views/shared/doorkeeper/applications/_form.html.haml
index adfd7ea98b7..c1650405776 100644
--- a/app/views/shared/doorkeeper/applications/_form.html.haml
+++ b/app/views/shared/doorkeeper/applications/_form.html.haml
@@ -1,4 +1,4 @@
-= form_for @application, url: url, html: { role: 'form', class: 'doorkeeper-app-form' } do |f|
+= gitlab_ui_form_for @application, url: url, html: { role: 'form', class: 'doorkeeper-app-form' } do |f|
= form_errors(@application)
.form-group
@@ -12,22 +12,19 @@
%span.form-text.text-muted
= _('Use one line per URI')
- .form-group.form-check
- = f.check_box :confidential, class: 'form-check-input'
- = f.label :confidential, class: 'label-bold form-check-label'
- %span.form-text.text-muted
- = _('Enable only for confidential applications exclusively used by a trusted backend server that can securely store the client secret. Do not enable for native-mobile, single-page, or other JavaScript applications because they cannot keep the client secret confidential.')
+ .form-group
+ = f.gitlab_ui_checkbox_component :confidential, _('Confidential'),
+ help_text: _('Enable only for confidential applications exclusively used by a trusted backend server that can securely store the client secret. Do not enable for native-mobile, single-page, or other JavaScript applications because they cannot keep the client secret confidential.')
- .form-group.form-check
- = f.check_box :expire_access_tokens, class: 'form-check-input'
- = f.label :expire_access_tokens, class: 'label-bold form-check-label'
- %span.form-text.text-muted
- = _('Enable access tokens to expire after 2 hours. If disabled, tokens do not expire.')
- = link_to _('Learn more.'), help_page_path('integration/oauth_provider.md', anchor: 'expiring-access-tokens'), target: '_blank', rel: 'noopener noreferrer'
+ .form-group
+ - help_text = _('Enable access tokens to expire after 2 hours. If disabled, tokens do not expire.')
+ - help_link = link_to _('Learn more.'), help_page_path('integration/oauth_provider.md', anchor: 'expiring-access-tokens'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :expire_access_tokens, _('Expire access tokens'),
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
.form-group
= f.label :scopes, class: 'label-bold'
- = render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: @application, scopes: @scopes
+ = render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: @application, scopes: @scopes, f: f
.gl-mt-3
= f.submit _('Save application'), class: "gl-button btn btn-confirm"
diff --git a/app/views/shared/empty_states/_issues.html.haml b/app/views/shared/empty_states/_issues.html.haml
index 6b571794625..fb410274859 100644
--- a/app/views/shared/empty_states/_issues.html.haml
+++ b/app/views/shared/empty_states/_issues.html.haml
@@ -47,7 +47,7 @@
= link_to _('New issue'), button_path, class: 'gl-button btn btn-confirm', id: 'new_issue_link'
- if show_import_button
- .js-csv-import-export-buttons{ data: { show_import_button: 'true', issuable_type: issuable_type, import_csv_issues_path: import_csv_namespace_project_issues_path, can_edit: can_edit.to_s, project_import_jira_path: project_import_jira_path(@project), max_attachment_size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes), container_class: 'gl-display-inline-flex gl-vertical-align-middle', show_label: 'true' } }
+ .js-csv-import-export-buttons{ data: { show_import_button: 'true', issuable_type: issuable_type, import_csv_issues_path: import_csv_namespace_project_issues_path, can_edit: can_edit.to_s, project_import_jira_path: project_import_jira_path(@project), max_attachment_size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes), container_class: 'gl-w-full gl-sm-w-auto gl-sm-mr-3 gl-display-inline-flex gl-vertical-align-middle', show_label: 'true' } }
%hr
%p.gl-text-center.gl-mb-0
%strong
diff --git a/app/views/shared/empty_states/_milestones.html.haml b/app/views/shared/empty_states/_milestones.html.haml
index c22869fb7e6..fb69e75370e 100644
--- a/app/views/shared/empty_states/_milestones.html.haml
+++ b/app/views/shared/empty_states/_milestones.html.haml
@@ -1,7 +1,13 @@
+- learn_more_path = local_assigns.fetch(:learn_more_path, help_page_path('user/project/milestones/index'))
+- learn_more_link = link_to _('Learn more.'), learn_more_path
+
.row.empty-state
.col-12
.svg-content
= image_tag 'illustrations/milestone_burndown_chart.svg'
.col-12
.text-content
- %h4.text-center= _('No milestones to show')
+ %h4= s_('Milestones|Use milestones to track issues and merge requests over a fixed period of time')
+ %p.state-description
+ = s_('Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}').html_safe % { learn_more_link: learn_more_link }
+ = yield
diff --git a/app/views/shared/empty_states/_milestones_tab.html.haml b/app/views/shared/empty_states/_milestones_tab.html.haml
new file mode 100644
index 00000000000..f6760b0a3f4
--- /dev/null
+++ b/app/views/shared/empty_states/_milestones_tab.html.haml
@@ -0,0 +1,17 @@
+- learn_more_path = local_assigns.fetch(:learn_more_path, help_page_path('user/project/milestones/index'))
+- learn_more_link = link_to _('Learn more.'), learn_more_path
+- closed_tab_selected = params[:state] == 'closed'
+
+.row.empty-state
+ .col-12
+ .svg-content
+ = image_tag 'illustrations/milestone_burndown_chart.svg'
+ .col-12
+ .text-content
+ - if closed_tab_selected
+ %h4.text-center= s_('Milestones|There are no closed milestones')
+ - else
+ %h4.text-center= s_('Milestones|There are no open milestones')
+ %p.state-description
+ = s_('Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}').html_safe % { learn_more_link: learn_more_link }
+ = yield
diff --git a/app/views/shared/errors/_gitaly_unavailable.html.haml b/app/views/shared/errors/_gitaly_unavailable.html.haml
index 366d4585435..e99c41f2496 100644
--- a/app/views/shared/errors/_gitaly_unavailable.html.haml
+++ b/app/views/shared/errors/_gitaly_unavailable.html.haml
@@ -1,7 +1,6 @@
-= render 'shared/global_alert',
- alert_class: 'gl-my-5',
+= render Pajamas::AlertComponent.new(alert_class: 'gl-my-5',
variant: :danger,
dismissible: false,
- title: reason do
+ title: reason) do
.gl-alert-body
= s_('The git server, Gitaly, is not available at this time. Please contact your administrator.')
diff --git a/app/views/shared/groups/_dropdown.html.haml b/app/views/shared/groups/_dropdown.html.haml
index 75c34102935..80edce8e7c4 100644
--- a/app/views/shared/groups/_dropdown.html.haml
+++ b/app/views/shared/groups/_dropdown.html.haml
@@ -1,26 +1,5 @@
- options_hash = local_assigns.fetch(:options_hash, groups_sort_options_hash)
-- show_archive_options = local_assigns.fetch(:show_archive_options, false)
+- groups_sort_options = options_hash.map { |value, title| { value: value, text: title, href: filter_groups_path(sort: value) } }
-.dropdown.inline.js-group-filter-dropdown-wrap.gl-mr-3
- %button.dropdown-menu-toggle{ type: 'button', 'data-toggle' => 'dropdown' }
- %span.dropdown-label
- = options_hash[project_list_sort_by]
- = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3')
- %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable
- %li.dropdown-header
- = _("Sort by")
- - options_hash.each do |value, title|
- %li.js-filter-sort-order
- = link_to filter_groups_path(sort: value), class: ("is-active" if project_list_sort_by == value) do
- = title
- - if show_archive_options
- %li.divider
- %li.js-filter-archived-projects
- = link_to filter_groups_path(archived: nil), class: ("is-active" unless params[:archived].present?) do
- = _("Hide archived projects")
- %li.js-filter-archived-projects
- = link_to filter_groups_path(archived: true), class: ("is-active" if Gitlab::Utils.to_boolean(params[:archived])) do
- = _("Show archived projects")
- %li.js-filter-archived-projects
- = link_to filter_groups_path(archived: 'only'), class: ("is-active" if params[:archived] == 'only') do
- = _("Show archived projects only")
+%div{ data: { testid: 'group_sort_by_dropdown' } }
+ = gl_redirect_listbox_tag groups_sort_options, project_list_sort_by, data: { right: true }
diff --git a/app/views/shared/hook_logs/_content.html.haml b/app/views/shared/hook_logs/_content.html.haml
index 95590d6e515..ce04e24b09f 100644
--- a/app/views/shared/hook_logs/_content.html.haml
+++ b/app/views/shared/hook_logs/_content.html.haml
@@ -10,14 +10,11 @@
%hr
- if hook_log.internal_error_message.present?
- .gl-alert-container
- .gl-alert.gl-alert-danger
- .gl-alert-container
- = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-content
- %h4.gl-alert-title= _('Internal error occurred while delivering this webhook.')
- .gl-alert-body
- = _('Error: %{error}') % { error: hook_log.internal_error_message }
+ = render Pajamas::AlertComponent.new(title: _('Internal error occurred while delivering this webhook.'),
+ variant: :danger,
+ dismissible: false) do
+ .gl-alert-body
+ = _('Error: %{error}') % { error: hook_log.internal_error_message }
%h4= _('Response')
= render partial: 'shared/hook_logs/status_label', locals: { hook_log: hook_log }
diff --git a/app/views/shared/integrations/edit.html.haml b/app/views/shared/integrations/edit.html.haml
index f2a31400698..0ae0eea59d8 100644
--- a/app/views/shared/integrations/edit.html.haml
+++ b/app/views/shared/integrations/edit.html.haml
@@ -3,7 +3,7 @@
- page_title @integration.title, _('Integrations')
- @content_class = 'limit-container-width' unless fluid_layout
-%h3.page-title
+%h2.gl-mb-4
= @integration.title
= render 'shared/integrations/tabs', integration: @integration, active_tab: 'edit' do
diff --git a/app/views/shared/issuable/_assignees.html.haml b/app/views/shared/issuable/_assignees.html.haml
index e6d722cb08d..73f1e35f03f 100644
--- a/app/views/shared/issuable/_assignees.html.haml
+++ b/app/views/shared/issuable/_assignees.html.haml
@@ -7,7 +7,7 @@
= render 'shared/issuable/merge_request_assignees', issuable: issuable, count: render_count
- else
- issuable.assignees.take(render_count).each do |assignee| # rubocop: disable CodeReuse/ActiveRecord
- = link_to_member(@project, assignee, name: false, title: s_("MrList|Assigned to %{name}, go to their profile.") % { name: assignee.name})
+ = link_to_member(@project, assignee, name: false, title: s_("MrList|Assigned to %{name}") % { name: assignee.name})
- if more_assignees_count > 0
%span{ class: 'avatar-counter has-tooltip', data: { container: 'body', placement: 'bottom', 'line-type' => 'old', qa_selector: 'avatar_counter_content' }, title: _("+%{more_assignees_count} more assignees") % { more_assignees_count: more_assignees_count} }
diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml
index 3f6e7a6fb32..e0d5f738273 100644
--- a/app/views/shared/issuable/_form.html.haml
+++ b/app/views/shared/issuable/_form.html.haml
@@ -6,10 +6,9 @@
= form_errors(issuable)
- if @conflict
- = render 'shared/global_alert',
- variant: :danger,
+ = render Pajamas::AlertComponent.new(variant: :danger,
dismissible: false,
- alert_class: 'gl-mb-5' do
+ alert_class: 'gl-mb-5') do
.gl-alert-body
Someone edited the #{issuable.class.model_name.human.downcase} the same time you did.
Please check out
diff --git a/app/views/shared/issuable/_label_page_create.html.haml b/app/views/shared/issuable/_label_page_create.html.haml
index 6a58acf8c05..7ab82362e85 100644
--- a/app/views/shared/issuable/_label_page_create.html.haml
+++ b/app/views/shared/issuable/_label_page_create.html.haml
@@ -6,7 +6,7 @@
.dropdown-page-two.dropdown-new-label
= dropdown_title(create_label_title(subject), options: { back: true, close: show_close })
= dropdown_content do
- = render 'shared/global_alert', variant: :danger, alert_class: 'js-label-error gl-mb-3', dismissible: false
+ = render Pajamas::AlertComponent.new(variant: :danger, alert_class: 'js-label-error gl-mb-3', dismissible: false)
%input#new_label_name.default-dropdown-input{ type: "text", placeholder: _('Name new label') }
.suggest-colors.suggest-colors-dropdown
= render_suggested_colors
diff --git a/app/views/shared/issuable/_merge_request_assignees.html.haml b/app/views/shared/issuable/_merge_request_assignees.html.haml
index 13dc6ae4abb..6c7a2496ec6 100644
--- a/app/views/shared/issuable/_merge_request_assignees.html.haml
+++ b/app/views/shared/issuable/_merge_request_assignees.html.haml
@@ -1,6 +1,6 @@
- issuable.merge_request_assignees.take(count).each do |merge_request_assignee| # rubocop: disable CodeReuse/ActiveRecord
- assignee = merge_request_assignee.assignee
- - assignee_tooltip = ( merge_request_assignee.attention_requested? ? s_("MrList|Attention requested from assignee %{name}, go to their profile.") : s_("MrList|Assigned to %{name}, go to their profile.") ) % { name: assignee.name}
+ - assignee_tooltip = ( merge_request_assignee.attention_requested? ? s_("MrList|Attention requested from assignee %{name}") : s_("MrList|Assigned to %{name}") ) % { name: assignee.name}
= link_to_member(@project, assignee, name: false, title: assignee_tooltip, extra_class: "gl-flex-direction-row-reverse") do
- if merge_request_assignee.attention_requested?
diff --git a/app/views/shared/issuable/_merge_request_reviewers.html.haml b/app/views/shared/issuable/_merge_request_reviewers.html.haml
index df5c69e309f..8dd74e12aff 100644
--- a/app/views/shared/issuable/_merge_request_reviewers.html.haml
+++ b/app/views/shared/issuable/_merge_request_reviewers.html.haml
@@ -1,6 +1,6 @@
- issuable.merge_request_reviewers.take(count).each do |merge_request_reviewer| # rubocop: disable CodeReuse/ActiveRecord
- reviewer = merge_request_reviewer.reviewer
- - reviewer_tooltip = ( merge_request_reviewer.attention_requested? ? s_("MrList|Attention requested from reviewer %{name}, go to their profile.") : s_("MrList|Review requested from %{name}, go to their profile.") ) % { name: reviewer.name}
+ - reviewer_tooltip = ( merge_request_reviewer.attention_requested? ? s_("MrList|Attention requested from reviewer %{name}") : s_("MrList|Review requested from %{name}") ) % { name: reviewer.name}
= link_to_member(@project, reviewer, name: false, title: reviewer_tooltip, extra_class: "gl-flex-direction-row-reverse") do
- if merge_request_reviewer.attention_requested?
diff --git a/app/views/shared/issuable/_reviewers.html.haml b/app/views/shared/issuable/_reviewers.html.haml
index 0bb0faa0bb8..4af2cb00859 100644
--- a/app/views/shared/issuable/_reviewers.html.haml
+++ b/app/views/shared/issuable/_reviewers.html.haml
@@ -7,7 +7,7 @@
= render 'shared/issuable/merge_request_reviewers', issuable: issuable, count: render_count
- else
- issuable.reviewers.take(render_count).each do |reviewer| # rubocop: disable CodeReuse/ActiveRecord
- = link_to_member(@project, reviewer, name: false, title: s_("MrList|Review requested from %{name}, go to their profile.") % { name: reviewer.name})
+ = link_to_member(@project, reviewer, name: false, title: s_("MrList|Review requested from %{name}") % { name: reviewer.name})
- if more_reviewers_count > 0
%span{ class: 'avatar-counter has-tooltip', data: { container: 'body', placement: 'bottom', 'line-type' => 'old' }, title: _("+%{more_reviewers_count} more reviewers") % { more_reviewers_count: more_reviewers_count} }
diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml
index 37a79a50fb1..7fdf8ea7796 100644
--- a/app/views/shared/issuable/_search_bar.html.haml
+++ b/app/views/shared/issuable/_search_bar.html.haml
@@ -1,22 +1,12 @@
- type = local_assigns.fetch(:type)
-- board = local_assigns.fetch(:board, nil)
- show_sorting_dropdown = local_assigns.fetch(:show_sorting_dropdown, true)
- disable_target_branch = local_assigns.fetch(:disable_target_branch, false)
- placeholder = local_assigns[:placeholder] || _('Search or filter results...')
- block_css_class = type != :productivity_analytics ? 'row-content-block second-block' : ''
-- is_epic_board = board&.to_type == "EpicBoard"
-
-- if is_epic_board
- - user_can_admin_list = can?(current_user, :admin_epic_board_list, board.resource_parent)
-- elsif board
- - user_can_admin_list = can?(current_user, :admin_issue_board_list, board.resource_parent)
.issues-filters
.issues-details-filters.filtered-search-block.d-flex.flex-column.flex-lg-row{ class: block_css_class }
.d-flex.flex-column.flex-md-row.flex-grow-1.mb-lg-0.mb-md-2.mb-sm-0.w-100
- - if type == :boards
- = render "shared/boards/switcher", board: board
- .js-new-board{ data: { multiple_issue_boards_available: parent.multiple_issue_boards_available?.to_s, can_admin_board: can?(current_user, :admin_issue_board, parent).to_s, } }
= form_tag page_filter_path, method: :get, class: 'filter-form js-filter-form w-100' do
- if params[:search].present?
= hidden_field_tag :search, params[:search]
@@ -25,201 +15,188 @@
- 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"
- - if is_epic_board
- #js-board-filtered-search{ data: { full_path: @group&.full_path } }
- - elsif board
- #js-issue-board-filtered-search
- - else
- .issues-other-filters.filtered-search-wrapper.d-flex.flex-column.flex-md-row
- .filtered-search-box
- - if type != :boards
- - text = tag.span(sprite_icon('history'), class: "d-md-none") + tag.span(_('Recent searches'), class: "d-none d-md-inline")
- = dropdown_tag(text,
- options: { wrapper_class: "filtered-search-history-dropdown-wrapper",
- toggle_class: "gl-button btn btn-default filtered-search-history-dropdown-toggle-button",
- dropdown_class: "filtered-search-history-dropdown",
- content_class: "filtered-search-history-dropdown-content" }) do
- .js-filtered-search-history-dropdown{ data: { full_path: search_history_storage_prefix } }
- .filtered-search-box-input-container.droplab-dropdown
- .scroll-container
- %ul.tokens-container.list-unstyled
- %li.input-token
- %input.form-control.filtered-search{ search_filter_input_options(type, placeholder) }
- #js-dropdown-hint.filtered-search-input-dropdown-menu.dropdown-menu.hint-dropdown
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item{ data: {hint: "#{'{{hint}}'}", tag: "#{'{{tag}}'}", action: "#{'{{hint === \'search\' ? \'submit\' : \'\' }}'}" } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- -# Encapsulate static class name `{{icon}}` inside #{} to bypass
- -# haml lint's ClassAttributeWithStaticValue
- %svg
- %use{ 'xlink:href': "#{'{{icon}}'}" }
- %span.js-filter-hint
- {{formattedKey}}
- #js-dropdown-operator.filtered-search-input-dropdown-menu.dropdown-menu
- %ul.filter-dropdown{ data: { dropdown: true, dynamic: true } }
- %li.filter-dropdown-item{ data: { value: "{{ title }}" } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- {{ title }}
- %span.btn-helptext
- {{ help }}
- #js-dropdown-author.filtered-search-input-dropdown-menu.dropdown-menu
+ .issues-other-filters.filtered-search-wrapper.d-flex.flex-column.flex-md-row
+ .filtered-search-box
+ - if type != :boards
+ - text = tag.span(sprite_icon('history'), class: "d-md-none") + tag.span(_('Recent searches'), class: "d-none d-md-inline")
+ = dropdown_tag(text,
+ options: { wrapper_class: "filtered-search-history-dropdown-wrapper",
+ toggle_class: "gl-button btn btn-default filtered-search-history-dropdown-toggle-button",
+ dropdown_class: "filtered-search-history-dropdown",
+ content_class: "filtered-search-history-dropdown-content" }) do
+ .js-filtered-search-history-dropdown{ data: { full_path: search_history_storage_prefix } }
+ .filtered-search-box-input-container.droplab-dropdown
+ .scroll-container
+ %ul.tokens-container.list-unstyled
+ %li.input-token
+ %input.form-control.filtered-search{ search_filter_input_options(type, placeholder) }
+ #js-dropdown-hint.filtered-search-input-dropdown-menu.dropdown-menu.hint-dropdown
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ %li.filter-dropdown-item{ data: {hint: "#{'{{hint}}'}", tag: "#{'{{tag}}'}", action: "#{'{{hint === \'search\' ? \'submit\' : \'\' }}'}" } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ -# Encapsulate static class name `{{icon}}` inside #{} to bypass
+ -# haml lint's ClassAttributeWithStaticValue
+ %svg
+ %use{ 'xlink:href': "#{'{{icon}}'}" }
+ %span.js-filter-hint
+ {{formattedKey}}
+ #js-dropdown-operator.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul.filter-dropdown{ data: { dropdown: true, dynamic: true } }
+ %li.filter-dropdown-item{ data: { value: "{{ title }}" } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ {{ title }}
+ %span.btn-helptext
+ {{ help }}
+ #js-dropdown-author.filtered-search-input-dropdown-menu.dropdown-menu
+ - if current_user
+ %ul{ data: { dropdown: true } }
+ = render 'shared/issuable/user_dropdown_item',
+ user: current_user
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ = render 'shared/issuable/user_dropdown_item',
+ user: User.new(username: '{{username}}', name: '{{name}}'),
+ avatar: { lazy: true, url: '{{avatar_url}}' }
+ #js-dropdown-assignee.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'None' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Any')
+ %li.divider.droplab-item-ignore
- if current_user
- %ul{ data: { dropdown: true } }
- = render 'shared/issuable/user_dropdown_item',
- user: current_user
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
= render 'shared/issuable/user_dropdown_item',
- user: User.new(username: '{{username}}', name: '{{name}}'),
- avatar: { lazy: true, url: '{{avatar_url}}' }
- #js-dropdown-assignee.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Any')
- %li.divider.droplab-item-ignore
- - if current_user
- = render 'shared/issuable/user_dropdown_item',
- user: current_user
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ user: current_user
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ = render 'shared/issuable/user_dropdown_item',
+ user: User.new(username: '{{username}}', name: '{{name}}'),
+ avatar: { lazy: true, url: '{{avatar_url}}' }
+ #js-dropdown-reviewer.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'None' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Any')
+ %li.divider.droplab-item-ignore
+ - if current_user
= render 'shared/issuable/user_dropdown_item',
- user: User.new(username: '{{username}}', name: '{{name}}'),
- avatar: { lazy: true, url: '{{avatar_url}}' }
- #js-dropdown-reviewer.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Any')
- %li.divider.droplab-item-ignore
- - if current_user
+ user: current_user
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ = render 'shared/issuable/user_dropdown_item',
+ user: User.new(username: '{{username}}', name: '{{name}}'),
+ avatar: { lazy: true, url: '{{avatar_url}}' }
+ - if Feature.enabled?(:mr_attention_requests, default_enabled: :yaml)
+ #js-dropdown-attention-requested.filtered-search-input-dropdown-menu.dropdown-menu
+ - if current_user
+ %ul{ data: { dropdown: true } }
= render 'shared/issuable/user_dropdown_item',
user: current_user
%ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
= render 'shared/issuable/user_dropdown_item',
user: User.new(username: '{{username}}', name: '{{name}}'),
avatar: { lazy: true, url: '{{avatar_url}}' }
- - if Feature.enabled?(:mr_attention_requests, default_enabled: :yaml)
- #js-dropdown-attention-requested.filtered-search-input-dropdown-menu.dropdown-menu
- - if current_user
- %ul{ data: { dropdown: true } }
- = render 'shared/issuable/user_dropdown_item',
- user: current_user
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- = render 'shared/issuable/user_dropdown_item',
- user: User.new(username: '{{username}}', name: '{{name}}'),
- avatar: { lazy: true, url: '{{avatar_url}}' }
- = render_if_exists 'shared/issuable/approver_dropdown'
- = render_if_exists 'shared/issuable/approved_by_dropdown'
- #js-dropdown-milestone.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Any')
- %li.filter-dropdown-item{ data: { value: 'Upcoming' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Upcoming')
- %li.filter-dropdown-item{ data: { value: 'Started' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Started')
- %li.divider.droplab-item-ignore
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item
- %button.gl-button.btn.btn-link.js-data-value{ type: 'button' }
+ = render_if_exists 'shared/issuable/approver_dropdown'
+ = render_if_exists 'shared/issuable/approved_by_dropdown'
+ #js-dropdown-milestone.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'None' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Any')
+ %li.filter-dropdown-item{ data: { value: 'Upcoming' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Upcoming')
+ %li.filter-dropdown-item{ data: { value: 'Started' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Started')
+ %li.divider.droplab-item-ignore
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ %li.filter-dropdown-item
+ %button.gl-button.btn.btn-link.js-data-value{ type: 'button' }
+ {{title}}
+ = render_if_exists 'shared/issuable/filter_iteration', type: type
+ #js-dropdown-release.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'None' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Any')
+ %li.divider.droplab-item-ignore
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ %li.filter-dropdown-item
+ %button.gl-button.btn.btn-link.js-data-value{ type: 'button' }
+ {{title}}
+ #js-dropdown-label.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'None' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Any')
+ %li.divider.droplab-item-ignore
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ %li.filter-dropdown-item
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ %span.dropdown-label-box{ style: 'background: {{color}}' }
+ %span.label-title.js-data-value
{{title}}
- = render_if_exists 'shared/issuable/filter_iteration', type: type
- #js-dropdown-release.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Any')
- %li.divider.droplab-item-ignore
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item
- %button.gl-button.btn.btn-link.js-data-value{ type: 'button' }
- {{title}}
- #js-dropdown-label.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Any')
- %li.divider.droplab-item-ignore
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item
- %button.gl-button.btn.btn-link{ type: 'button' }
- %span.dropdown-label-box{ style: 'background: {{color}}' }
- %span.label-title.js-data-value
- {{title}}
- #js-dropdown-my-reaction.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('None')
- %li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Any')
- %li.divider.droplab-item-ignore
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item
- %button.gl-button.btn.btn-link{ type: 'button' }
- %gl-emoji
- %span.js-data-value.gl-ml-3
- {{name}}
- #js-dropdown-wip.filtered-search-input-dropdown-menu.dropdown-menu
- %ul.filter-dropdown{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'yes', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Yes')
- %li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('No')
- #js-dropdown-confidential.filtered-search-input-dropdown-menu.dropdown-menu
- %ul.filter-dropdown{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'yes', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('Yes')
- %li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
- = _('No')
- - unless disable_target_branch
- #js-dropdown-target-branch.filtered-search-input-dropdown-menu.dropdown-menu
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item
- %button.gl-button.btn.btn-link.js-data-value.monospace
- {{title}}
- #js-dropdown-environment.filtered-search-input-dropdown-menu.dropdown-menu
+ #js-dropdown-my-reaction.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'None' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('None')
+ %li.filter-dropdown-item{ data: { value: 'Any' } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Any')
+ %li.divider.droplab-item-ignore
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ %li.filter-dropdown-item
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ %gl-emoji
+ %span.js-data-value.gl-ml-3
+ {{name}}
+ #js-dropdown-wip.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul.filter-dropdown{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'yes', capitalize: true } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Yes')
+ %li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('No')
+ #js-dropdown-confidential.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul.filter-dropdown{ data: { dropdown: true } }
+ %li.filter-dropdown-item{ data: { value: 'yes', capitalize: true } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('Yes')
+ %li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
+ %button.gl-button.btn.btn-link{ type: 'button' }
+ = _('No')
+ - unless disable_target_branch
+ #js-dropdown-target-branch.filtered-search-input-dropdown-menu.dropdown-menu
%ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
%li.filter-dropdown-item
- %button.gl-button.btn.btn-link.js-data-value{ type: 'button' }
+ %button.gl-button.btn.btn-link.js-data-value.monospace
{{title}}
+ #js-dropdown-environment.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ %li.filter-dropdown-item
+ %button.gl-button.btn.btn-link.js-data-value{ type: 'button' }
+ {{title}}
- = render_if_exists 'shared/issuable/filter_weight', type: type
+ = render_if_exists 'shared/issuable/filter_weight', type: type
- = render_if_exists 'shared/issuable/filter_epic', type: type
+ = render_if_exists 'shared/issuable/filter_epic', type: type
- %button.clear-search.hidden{ type: 'button' }
- = sprite_icon('close', size: 16, css_class: 'clear-search-icon')
+ %button.clear-search.hidden{ type: 'button' }
+ = sprite_icon('close', size: 16, css_class: 'clear-search-icon')
.filter-dropdown-container.gl-display-flex.gl-flex-direction-column.gl-md-flex-direction-row.gl-align-items-flex-start
- - if type == :boards
- #js-board-labels-toggle
- - if current_user
- #js-board-epics-swimlanes-toggle
- .js-board-config{ data: { can_admin_list: user_can_admin_list.to_s, has_scope: board.scoped?.to_s } }
- - if user_can_admin_list
- .js-create-column-trigger{ data: board_list_data }
- #js-toggle-focus-btn
- - elsif type != :productivity_analytics && show_sorting_dropdown
+ - if type != :productivity_analytics && show_sorting_dropdown
= render 'shared/issuable/sort_dropdown'
diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml
index 37d31515307..b99294f504c 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -97,7 +97,7 @@
- if issuable_sidebar.dig(:current_user, :can_move)
.block.js-sidebar-move-issue-block
.sidebar-collapsed-icon{ data: { toggle: 'tooltip', placement: 'left', container: 'body', boundary: 'viewport' }, title: _('Move issue') }
- = custom_icon('icon_arrow_right')
+ = sprite_icon('long-arrow')
.dropdown.sidebar-move-issue-dropdown.hide-collapsed
%button.gl-button.btn.btn-default.btn-block.js-sidebar-dropdown-toggle.js-move-issue{ type: 'button',
data: { toggle: 'dropdown', display: 'static', track_label: "right_sidebar", track_property: "move_issue", track_action: "click_button", track_value: "" } }
diff --git a/app/views/shared/issuable/form/_contribution.html.haml b/app/views/shared/issuable/form/_contribution.html.haml
index dc6abfd2c9e..c9dda22de46 100644
--- a/app/views/shared/issuable/form/_contribution.html.haml
+++ b/app/views/shared/issuable/form/_contribution.html.haml
@@ -1,5 +1,7 @@
- issuable = local_assigns.fetch(:issuable)
- form = local_assigns.fetch(:form)
+- contribution_help_link = help_page_path('user/project/merge_requests/allow_collaboration')
+- contribution_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: contribution_help_link }
- return unless issuable.is_a?(MergeRequest)
- return unless issuable.for_fork?
@@ -8,13 +10,10 @@
%hr
.form-group.row
- %label.col-form-label.col-sm-2
+ %label.col-form-label.col-sm-2.pt-sm-0
= _('Contribution')
.col-sm-10
- .form-check.gl-mt-2
- = form.check_box :allow_collaboration, disabled: !issuable.can_allow_collaboration?(current_user), class: 'form-check-input'
- = form.label :allow_collaboration, class: 'form-check-label' do
- = _('Allow commits from members who can merge to the target branch.')
- = link_to 'About this feature', help_page_path('user/project/merge_requests/allow_collaboration'), target: '_blank', rel: 'noopener noreferrer nofollow'
- .form-text.text-muted
- = allow_collaboration_unavailable_reason(issuable)
+ = form.gitlab_ui_checkbox_component :allow_collaboration,
+ _('Allow commits from members who can merge to the target branch. %{link_start}About this feature.%{link_end}').html_safe % { link_start: contribution_help_link_start, link_end: '</a>'.html_safe },
+ checkbox_options: { disabled: !issuable.can_allow_collaboration?(current_user) },
+ help_text: allow_collaboration_unavailable_reason(issuable)
diff --git a/app/views/shared/issuable/form/_metadata.html.haml b/app/views/shared/issuable/form/_metadata.html.haml
index 34720576526..e941eaadbc9 100644
--- a/app/views/shared/issuable/form/_metadata.html.haml
+++ b/app/views/shared/issuable/form/_metadata.html.haml
@@ -17,10 +17,8 @@
- if issuable.respond_to?(:confidential) && can?(current_user, :set_confidentiality, issuable)
.form-group.row
.offset-sm-2.col-sm-10
- .form-check
- = form.check_box :confidential, class: 'form-check-input'
- = form.label :confidential, class: 'form-check-label' do
- #{_('This issue is confidential and should only be visible to team members with at least Reporter access.')}
+ = form.gitlab_ui_checkbox_component :confidential,
+ _('This issue is confidential and should only be visible to team members with at least Reporter access.')
- if can?(current_user, :"set_#{issuable.to_ability_name}_metadata", issuable)
%hr
diff --git a/app/views/shared/issue_type/_details_content.html.haml b/app/views/shared/issue_type/_details_content.html.haml
index 1babc6885c2..7276175db59 100644
--- a/app/views/shared/issue_type/_details_content.html.haml
+++ b/app/views/shared/issue_type/_details_content.html.haml
@@ -1,8 +1,8 @@
- related_branches_path = related_branches_project_issue_path(@project, issuable)
- api_awards_path = local_assigns.fetch(:api_awards_path, nil)
-.issue-details.issuable-details
- .detail-page-description.content-block
+.issue-details.issuable-details.js-issue-details
+ .detail-page-description.content-block.js-detail-page-description
#js-issuable-app{ data: { initial: issuable_initial_data(issuable).to_json, full_path: @project.full_path } }
.title-container
%h1.title= markdown_field(issuable, :title)
@@ -12,6 +12,7 @@
= edited_time_ago_with_tooltip(issuable, placement: 'bottom', html_class: 'issue-edited-ago js-issue-edited-ago')
+ .js-issue-widgets
= render 'shared/issue_type/sentry_stack_trace', issuable: issuable
= render 'projects/issues/design_management'
@@ -28,8 +29,9 @@
#related-branches{ data: { url: related_branches_path } }
-# This element is filled in using JavaScript.
- = render 'shared/issue_type/emoji_block', issuable: issuable, api_awards_path: api_awards_path
+ .js-issue-widgets
+ = render 'shared/issue_type/emoji_block', issuable: issuable, api_awards_path: api_awards_path
- = render 'projects/issues/discussion'
+ = render 'projects/issues/discussion'
= render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @issue.assignees
diff --git a/app/views/shared/milestones/_milestone_complete_alert.html.haml b/app/views/shared/milestones/_milestone_complete_alert.html.haml
index 5b05fdb6019..4685a93a343 100644
--- a/app/views/shared/milestones/_milestone_complete_alert.html.haml
+++ b/app/views/shared/milestones/_milestone_complete_alert.html.haml
@@ -1,9 +1,8 @@
- milestone = local_assigns[:milestone]
- if milestone.complete? && milestone.active?
- = render 'shared/global_alert',
- variant: :success,
+ = render Pajamas::AlertComponent.new(variant: :success,
alert_data: { testid: 'all-issues-closed-alert' },
- dismissible: false do
+ dismissible: false) do
.gl-alert-body
= yield
diff --git a/app/views/shared/projects/_list.html.haml b/app/views/shared/projects/_list.html.haml
index 6fae6a15567..c39dc561801 100644
--- a/app/views/shared/projects/_list.html.haml
+++ b/app/views/shared/projects/_list.html.haml
@@ -37,8 +37,8 @@
- css_class = (i >= projects_limit) || project.pending_delete? ? 'hide' : nil
= render "shared/projects/project", project: project, skip_namespace: skip_namespace,
avatar: avatar, stars: stars, css_class: css_class, use_creator_avatar: use_creator_avatar,
- forks: project.forking_enabled?, show_last_commit_as_description: show_last_commit_as_description, user: user,
- merge_requests: project.merge_requests_enabled?, issues: project.issues_enabled?,
+ forks: project.forking_enabled?, show_last_commit_as_description: show_last_commit_as_description,
+ user: user, merge_requests: able_to_see_merge_requests?(project, user), issues: able_to_see_issues?(project, user),
pipeline_status: pipeline_status, compact_mode: compact_mode
= paginate_collection(projects, remote: remote) unless skip_pagination
- else
diff --git a/app/views/shared/runners/_runner_type_alert.html.haml b/app/views/shared/runners/_runner_type_alert.html.haml
index e0cc1e924d8..365cee5fadc 100644
--- a/app/views/shared/runners/_runner_type_alert.html.haml
+++ b/app/views/shared/runners/_runner_type_alert.html.haml
@@ -1,20 +1,16 @@
-.gl-alert.gl-alert-info.gl-my-5
- = sprite_icon('information-o', css_class: 'gl-alert-icon')
- - if runner.instance_type?
- %h4.gl-alert-title
- = s_('Runners|This runner is available to all groups and projects in your GitLab instance.')
- .gl-alert-body
- = s_('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.')
- = link_to _('Learn more.'), help_page_path('ci/runners/runners_scope', anchor: 'shared-runners'), target: '_blank', rel: 'noopener noreferrer'
- - elsif runner.group_type?
- %h4.gl-alert-title
- = s_('Runners|This runner is available to all projects and subgroups in a group.')
+- alert_class = 'gl-mb-5'
+
+- if runner.group_type?
+ = render Pajamas::AlertComponent.new(alert_class: alert_class,
+ title: s_('Runners|This runner is available to all projects and subgroups in a group.'),
+ dismissible: false) do
.gl-alert-body
= s_('Runners|Use Group runners when you want all projects in a group to have access to a set of runners.')
= link_to _('Learn more.'), help_page_path('ci/runners/runners_scope', anchor: 'group-runners'), target: '_blank', rel: 'noopener noreferrer'
- - else
- %h4.gl-alert-title
- = s_('Runners|This runner is associated with specific projects.')
+- else
+ = render Pajamas::AlertComponent.new(alert_class: alert_class,
+ title: s_('Runners|This runner is associated with specific projects.'),
+ dismissible: false) do
.gl-alert-body
= s_('Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner.')
= link_to _('Learn more.'), help_page_path('ci/runners/runners_scope', anchor: 'specific-runners'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/shared/tokens/_scopes_form.html.haml b/app/views/shared/tokens/_scopes_form.html.haml
index 33e95446bd7..010376464f1 100644
--- a/app/views/shared/tokens/_scopes_form.html.haml
+++ b/app/views/shared/tokens/_scopes_form.html.haml
@@ -1,9 +1,14 @@
- scopes = local_assigns.fetch(:scopes)
- prefix = local_assigns.fetch(:prefix)
- token = local_assigns.fetch(:token)
+- f = local_assigns.fetch(:f)
-- scopes.each do |scope|
- %fieldset.form-group.form-check
- = check_box_tag "#{prefix}[scopes][]", scope, token.scopes.include?(scope), id: "#{prefix}_scopes_#{scope}", class: "form-check-input", data: { qa_selector: "#{scope}_checkbox" }
- = label_tag "#{prefix}_scopes_#{scope}", scope, class: 'label-bold form-check-label'
- .text-secondary= t scope, scope: scope_description(prefix)
+%fieldset
+ - scopes.each do |scope|
+ - help_text = t scope, scope: scope_description(prefix)
+ = f.gitlab_ui_checkbox_component :scopes, scope,
+ help_text: help_text,
+ checkbox_options: { checked: token.scopes.include?(scope), id: "#{prefix}_scopes_#{scope}", multiple: true, data: { qa_selector: "#{scope}_checkbox" } },
+ checked_value: scope,
+ unchecked_value: nil,
+ label_options: { data: { qa_selector: "#{scope}_label" } }
diff --git a/app/views/shared/web_hooks/_form.html.haml b/app/views/shared/web_hooks/_form.html.haml
index 5650f08b2a9..afe72767b9a 100644
--- a/app/views/shared/web_hooks/_form.html.haml
+++ b/app/views/shared/web_hooks/_form.html.haml
@@ -14,92 +14,67 @@
= s_('Webhooks|Used to validate received payloads. Sent with the request in the %{code_start}X-Gitlab-Token HTTP%{code_end} header.').html_safe % { code_start: code_start, code_end: code_end }
.form-group
= form.label :url, s_('Webhooks|Trigger'), class: 'label-bold'
- %ul.list-unstyled.gl-ml-6
- %li
- = form.check_box :push_events, class: 'form-check-input'
- = form.label :push_events, class: 'list-label form-check-label gl-ml-1 gl-mb-3' do
- %strong= s_('Webhooks|Push events')
- = form.text_field :push_events_branch_filter, class: 'form-control gl-form-input', placeholder: 'Branch name or wildcard pattern to trigger on (leave blank for all)'
- %p.text-muted.gl-ml-1
+ %ul.list-unstyled
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :push_events, s_('Webhooks|Push events')
+ .gl-pl-6
+ = form.text_field :push_events_branch_filter, class: 'form-control gl-form-input',
+ placeholder: 'Branch name or wildcard pattern to trigger on (leave blank for all)'
+ %p.form-text.text-muted.custom-control
= s_('Webhooks|Push to the repository.')
- %li
- = form.check_box :tag_push_events, class: 'form-check-input'
- = form.label :tag_push_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Tag push events')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|A new tag is pushed to the repository.')
- %li
- = form.check_box :note_events, class: 'form-check-input'
- = form.label :note_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Comments')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|A comment is added to an issue.')
- %li
- = form.check_box :confidential_note_events, class: 'form-check-input'
- = form.label :confidential_note_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Confidential comments')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|A comment is added to a confidential issue.')
- %li
- = form.check_box :issues_events, class: 'form-check-input'
- = form.label :issues_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Issues events')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|An issue is created, updated, closed, or reopened.')
- %li
- = form.check_box :confidential_issues_events, class: 'form-check-input'
- = form.label :confidential_issues_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Confidential issues events')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|A confidential issue is created, updated, closed, or reopened.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :tag_push_events,
+ s_('Webhooks|Tag push events'),
+ help_text: s_('Webhooks|A new tag is pushed to the repository.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :note_events,
+ s_('Webhooks|Comments'),
+ help_text: s_('Webhooks|A comment is added to an issue or merge request.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :confidential_note_events,
+ s_('Webhooks|Confidential comments'),
+ help_text: s_('Webhooks|A comment is added to a confidential issue.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :issues_events,
+ s_('Webhooks|Issues events'),
+ help_text: s_('Webhooks|An issue is created, updated, closed, or reopened.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :confidential_issues_events,
+ s_('Webhooks|Confidential issues events'),
+ help_text: s_('Webhooks|A confidential issue is created, updated, closed, or reopened.')
- if @group
= render_if_exists 'groups/hooks/member_events', form: form
= render_if_exists 'groups/hooks/subgroup_events', form: form
- %li
- = form.check_box :merge_requests_events, class: 'form-check-input'
- = form.label :merge_requests_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Merge request events')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|A merge request is created, updated, or merged.')
- %li
- = form.check_box :job_events, class: 'form-check-input'
- = form.label :job_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Job events')
- %p.text-muted.gl-ml-1
- = s_("Webhooks|A job's status changes.")
- %li
- = form.check_box :pipeline_events, class: 'form-check-input'
- = form.label :pipeline_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Pipeline events')
- %p.text-muted.gl-ml-1
- = s_("Webhooks|A pipeline's status changes.")
- %li
- = form.check_box :wiki_page_events, class: 'form-check-input'
- = form.label :wiki_page_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Wiki page events')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|A wiki page is created or updated.')
- %li
- = form.check_box :deployment_events, class: 'form-check-input'
- = form.label :deployment_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Deployment events')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|A deployment starts, finishes, fails, or is canceled.')
- %li
- = form.check_box :feature_flag_events, class: 'form-check-input'
- = form.label :feature_flag_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Feature flag events')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|A feature flag is turned on or off.')
- %li
- = form.check_box :releases_events, class: 'form-check-input'
- = form.label :releases_events, class: 'list-label form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Releases events')
- %p.text-muted.gl-ml-1
- = s_('Webhooks|A release is created or updated.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :merge_requests_events,
+ s_('Webhooks|Merge request events'),
+ help_text: s_('Webhooks|A merge request is created, updated, or merged.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :job_events,
+ s_('Webhooks|Job events'),
+ help_text: s_("Webhooks|A job's status changes.")
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :pipeline_events,
+ s_('Webhooks|Pipeline events'),
+ help_text: s_("Webhooks|A pipeline's status changes.")
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :wiki_page_events,
+ s_('Webhooks|Wiki page events'),
+ help_text: s_('Webhooks|A wiki page is created or updated.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :deployment_events,
+ s_('Webhooks|Deployment events'),
+ help_text: s_('Webhooks|A deployment starts, finishes, fails, or is canceled.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :feature_flag_events,
+ s_('Webhooks|Feature flag events'),
+ help_text: s_('Webhooks|A feature flag is turned on or off.')
+ %li.gl-pb-5
+ = form.gitlab_ui_checkbox_component :releases_events,
+ s_('Webhooks|Releases events'),
+ help_text: s_('Webhooks|A release is created or updated.')
.form-group
= form.label :enable_ssl_verification, s_('Webhooks|SSL verification'), class: 'label-bold checkbox'
- .form-check
- = form.check_box :enable_ssl_verification, class: 'form-check-input'
- = form.label :enable_ssl_verification, class: 'form-check-label gl-ml-1' do
- %strong= s_('Webhooks|Enable SSL verification')
+ %ul.list-unstyled
+ %li
+ = form.gitlab_ui_checkbox_component :enable_ssl_verification, s_('Webhooks|Enable SSL verification')
diff --git a/app/views/shared/web_hooks/_hook_errors.html.haml b/app/views/shared/web_hooks/_hook_errors.html.haml
index 03f373783f8..a100a620cea 100644
--- a/app/views/shared/web_hooks/_hook_errors.html.haml
+++ b/app/views/shared/web_hooks/_hook_errors.html.haml
@@ -10,17 +10,13 @@
limit: hook.rate_limit,
support_link_start: link_start % { url: support_path },
support_link_end: link_end }
- = render 'shared/global_alert',
- title: s_('Webhooks|Webhook was automatically disabled'),
- variant: :danger,
- close_button_class: 'js-close' do
+ = render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook was automatically disabled'),
+ variant: :danger) do
.gl-alert-body
= s_('Webhooks|The webhook was triggered more than %{limit} times per minute and is now disabled. To re-enable this webhook, fix the problems shown in %{strong_start}Recent events%{strong_end}, then re-test your settings. %{support_link_start}Contact Support%{support_link_end} if you need help re-enabling your webhook.').html_safe % placeholders
- elsif hook.permanently_disabled?
- = render 'shared/global_alert',
- title: s_('Webhooks|Webhook failed to connect'),
- variant: :danger,
- close_button_class: 'js-close' do
+ = render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook failed to connect'),
+ variant: :danger) do
.gl-alert-body
= s_('Webhooks|The webhook failed to connect, and is disabled. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below.').html_safe % { strong_start: strong_start, strong_end: strong_end }
- elsif hook.temporarily_disabled?
@@ -30,9 +26,7 @@
retry_time: time_interval_in_words(hook.disabled_until - Time.now),
help_link_start: link_start % { url: help_path },
help_link_end: link_end }
- = render 'shared/global_alert',
- title: s_('Webhooks|Webhook fails to connect'),
- variant: :warning,
- close_button_class: 'js-close' do
+ = render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook fails to connect'),
+ variant: :warning) do
.gl-alert-body
= s_('Webhooks|The webhook %{help_link_start}failed to connect%{help_link_end}, and will retry in %{retry_time}. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below.').html_safe % placeholders
diff --git a/app/views/shared/wikis/_form.html.haml b/app/views/shared/wikis/_form.html.haml
index e121725b9af..34bedbd928a 100644
--- a/app/views/shared/wikis/_form.html.haml
+++ b/app/views/shared/wikis/_form.html.haml
@@ -3,4 +3,4 @@
.gl-mt-3
= form_errors(@page, truncate: :title)
-#js-wiki-form{ data: { page_info: page_info.to_json, format_options: Wiki::MARKUPS.to_json } }
+#js-wiki-form{ data: { page_info: page_info.to_json, format_options: wiki_markup_hash_by_name_id.to_json } }
diff --git a/app/views/shared/wikis/_main_links.html.haml b/app/views/shared/wikis/_main_links.html.haml
index 02794950895..c1fd8c48c60 100644
--- a/app/views/shared/wikis/_main_links.html.haml
+++ b/app/views/shared/wikis/_main_links.html.haml
@@ -1,5 +1,5 @@
- if @page&.persisted?
- = link_to wiki_page_path(@wiki, @page, action: :history), class: "btn gl-button", role: "button", data: { qa_selector: 'page_history_button' } do
+ = link_to wiki_page_path(@wiki, @page, action: :history), class: "btn gl-button btn-default", role: "button", data: { qa_selector: 'page_history_button' } do
= s_("Wiki|Page history")
- if can?(current_user, :create_wiki, @wiki.container)
= link_to wiki_path(@wiki, action: :new), class: "btn gl-button btn-confirm-secondary", role: "button", data: { qa_selector: 'new_page_button' } do
diff --git a/app/views/shared/wikis/show.html.haml b/app/views/shared/wikis/show.html.haml
index e6980aae3e1..6591e8fae7b 100644
--- a/app/views/shared/wikis/show.html.haml
+++ b/app/views/shared/wikis/show.html.haml
@@ -26,6 +26,7 @@
%div
- if can?(current_user, :create_wiki, @wiki.container) && @page.latest? && @valid_encoding
= link_to sprite_icon('pencil', css_class: 'gl-icon'), wiki_page_path(@wiki, @page, action: :edit), title: 'Edit', role: "button", class: 'btn gl-button btn-icon btn-default js-wiki-edit', data: { qa_selector: 'edit_page_button', testid: 'wiki_edit_button' }
- = render 'shared/wikis/wiki_content'
+
+ .js-async-wiki-page-content.md.gl-pt-2{ data: { qa_selector: 'wiki_page_content', testid: 'wiki_page_content', tracking_context: wiki_page_tracking_context(@page).to_json, get_wiki_content_url: wiki_page_render_api_endpoint(@page) } }
= render 'shared/wikis/sidebar'
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index 88eacaefcb0..361beda4d02 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -188,7 +188,7 @@
= s_('UserProfile|Most Recent Activity')
.content_list{ data: { href: user_activity_path } }
.loading
- .gl-spinner.gl-spinner-md
+ = gl_loading_icon(size: 'md')
- unless @user.bot?
- if profile_tab?(:groups)
#groups.tab-pane
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 48bdee4062b..bfb70e0d496 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -192,6 +192,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: cronjob:bulk_imports_stuck_import
+ :worker_name: BulkImports::StuckImportWorker
+ :feature_category: :importers
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: cronjob:ci_archive_traces_cron
:worker_name: Ci::ArchiveTracesCronWorker
:feature_category: :continuous_integration
@@ -255,6 +264,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: cronjob:ci_update_locked_unknown_artifacts
+ :worker_name: Ci::UpdateLockedUnknownArtifactsWorker
+ :feature_category: :build_artifacts
+ :has_external_dependencies:
+ :urgency: :throttled
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent:
+ :tags: []
- :name: cronjob:clusters_integrations_check_prometheus_health
:worker_name: Clusters::Integrations::CheckPrometheusHealthWorker
:feature_category: :incident_management
@@ -318,6 +336,24 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: cronjob:database_ci_namespace_mirrors_consistency_check
+ :worker_name: Database::CiNamespaceMirrorsConsistencyCheckWorker
+ :feature_category: :sharding
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
+- :name: cronjob:database_ci_project_mirrors_consistency_check
+ :worker_name: Database::CiProjectMirrorsConsistencyCheckWorker
+ :feature_category: :sharding
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: cronjob:database_drop_detached_partitions
:worker_name: Database::DropDetachedPartitionsWorker
:feature_category: :database
@@ -579,15 +615,6 @@
:weight: 1
:idempotent:
:tags: []
-- :name: cronjob:quality_test_data_cleanup
- :worker_name: Quality::TestDataCleanupWorker
- :feature_category: :quality_management
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :tags: []
- :name: cronjob:releases_manage_evidence
:worker_name: Releases::ManageEvidenceWorker
:feature_category: :release_evidence
@@ -2578,15 +2605,6 @@
:weight: 1
:idempotent:
:tags: []
-- :name: namespaces_invite_team_email
- :worker_name: Namespaces::InviteTeamEmailWorker
- :feature_category: :experimentation_activation
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent:
- :tags: []
- :name: namespaces_onboarding_issue_created
:worker_name: Namespaces::OnboardingIssueCreatedWorker
:feature_category: :onboarding
@@ -2771,7 +2789,7 @@
:worker_name: ProjectExportWorker
:feature_category: :importers
:has_external_dependencies:
- :urgency: :throttled
+ :urgency: :low
:resource_boundary: :memory
:weight: 1
:idempotent:
@@ -2812,6 +2830,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: projects_record_target_platforms
+ :worker_name: Projects::RecordTargetPlatformsWorker
+ :feature_category: :experimentation_activation
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: projects_refresh_build_artifacts_size_statistics
:worker_name: Projects::RefreshBuildArtifactsSizeStatisticsWorker
:feature_category: :build_artifacts
diff --git a/app/workers/bulk_import_worker.rb b/app/workers/bulk_import_worker.rb
index d560ebcc6e6..157586ca397 100644
--- a/app/workers/bulk_import_worker.rb
+++ b/app/workers/bulk_import_worker.rb
@@ -3,15 +3,12 @@
class BulkImportWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
- data_consistency :always
+ PERFORM_DELAY = 5.seconds
+ data_consistency :always
feature_category :importers
-
sidekiq_options retry: false, dead: false
- PERFORM_DELAY = 5.seconds
- DEFAULT_BATCH_SIZE = 5
-
def perform(bulk_import_id)
@bulk_import = BulkImport.find_by_id(bulk_import_id)
@@ -19,11 +16,10 @@ class BulkImportWorker # rubocop:disable Scalability/IdempotentWorker
return if @bulk_import.finished? || @bulk_import.failed?
return @bulk_import.fail_op! if all_entities_failed?
return @bulk_import.finish! if all_entities_processed? && @bulk_import.started?
- return re_enqueue if max_batch_size_exceeded? # Do not start more jobs if max allowed are already running
@bulk_import.start! if @bulk_import.created?
- created_entities.first(next_batch_size).each do |entity|
+ created_entities.find_each do |entity|
entity.create_pipeline_trackers!
BulkImports::ExportRequestWorker.perform_async(entity.id)
@@ -45,10 +41,6 @@ class BulkImportWorker # rubocop:disable Scalability/IdempotentWorker
@entities ||= @bulk_import.entities
end
- def started_entities
- entities.with_status(:started)
- end
-
def created_entities
entities.with_status(:created)
end
@@ -61,14 +53,6 @@ class BulkImportWorker # rubocop:disable Scalability/IdempotentWorker
entities.all? { |entity| entity.failed? }
end
- def max_batch_size_exceeded?
- started_entities.count >= DEFAULT_BATCH_SIZE
- end
-
- def next_batch_size
- [DEFAULT_BATCH_SIZE - started_entities.count, 0].max
- end
-
# A new BulkImportWorker job is enqueued to either
# - Process the new BulkImports::Entity created during import (e.g. for the subgroups)
# - Or to mark the `bulk_import` as finished
diff --git a/app/workers/bulk_imports/entity_worker.rb b/app/workers/bulk_imports/entity_worker.rb
index 70d6626df91..f6b1c693fe4 100644
--- a/app/workers/bulk_imports/entity_worker.rb
+++ b/app/workers/bulk_imports/entity_worker.rb
@@ -4,24 +4,32 @@ module BulkImports
class EntityWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
+ idempotent!
+ deduplicate :until_executing
data_consistency :always
-
feature_category :importers
-
sidekiq_options retry: false, dead: false
-
worker_has_external_dependencies!
- idempotent!
- deduplicate :until_executed, including_scheduled: true
-
def perform(entity_id, current_stage = nil)
- return if stage_running?(entity_id, current_stage)
+ if stage_running?(entity_id, current_stage)
+ logger.info(
+ structured_payload(
+ entity_id: entity_id,
+ current_stage: current_stage,
+ message: 'Stage running'
+ )
+ )
+
+ return
+ end
logger.info(
- worker: self.class.name,
- entity_id: entity_id,
- current_stage: current_stage
+ structured_payload(
+ entity_id: entity_id,
+ current_stage: current_stage,
+ message: 'Stage starting'
+ )
)
next_pipeline_trackers_for(entity_id).each do |pipeline_tracker|
@@ -33,10 +41,11 @@ module BulkImports
end
rescue StandardError => e
logger.error(
- worker: self.class.name,
- entity_id: entity_id,
- current_stage: current_stage,
- error_message: e.message
+ structured_payload(
+ entity_id: entity_id,
+ current_stage: current_stage,
+ message: e.message
+ )
)
Gitlab::ErrorTracking.track_exception(e, entity_id: entity_id)
diff --git a/app/workers/bulk_imports/export_request_worker.rb b/app/workers/bulk_imports/export_request_worker.rb
index 21040178cee..0d3e4f013dd 100644
--- a/app/workers/bulk_imports/export_request_worker.rb
+++ b/app/workers/bulk_imports/export_request_worker.rb
@@ -42,10 +42,12 @@ module BulkImports
correlation_id_value: Labkit::Correlation::CorrelationId.current_or_new_id
}
- Gitlab::Import::Logger.warn(
- attributes.merge(
- bulk_import_id: entity.bulk_import.id,
- bulk_import_entity_type: entity.source_type
+ Gitlab::Import::Logger.error(
+ structured_payload(
+ attributes.merge(
+ bulk_import_id: entity.bulk_import.id,
+ bulk_import_entity_type: entity.source_type
+ )
)
)
diff --git a/app/workers/bulk_imports/pipeline_worker.rb b/app/workers/bulk_imports/pipeline_worker.rb
index 03ec2f058ca..1a98705c151 100644
--- a/app/workers/bulk_imports/pipeline_worker.rb
+++ b/app/workers/bulk_imports/pipeline_worker.rb
@@ -4,14 +4,11 @@ module BulkImports
class PipelineWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
- data_consistency :always
-
- NDJSON_PIPELINE_PERFORM_DELAY = 1.minute
+ NDJSON_PIPELINE_PERFORM_DELAY = 10.seconds
+ data_consistency :always
feature_category :importers
-
sidekiq_options retry: false, dead: false
-
worker_has_external_dependencies!
def perform(pipeline_tracker_id, stage, entity_id)
@@ -21,18 +18,20 @@ module BulkImports
if pipeline_tracker.present?
logger.info(
- worker: self.class.name,
- entity_id: pipeline_tracker.entity.id,
- pipeline_name: pipeline_tracker.pipeline_name
+ structured_payload(
+ entity_id: pipeline_tracker.entity.id,
+ pipeline_name: pipeline_tracker.pipeline_name
+ )
)
run(pipeline_tracker)
else
logger.error(
- worker: self.class.name,
- entity_id: entity_id,
- pipeline_tracker_id: pipeline_tracker_id,
- message: 'Unstarted pipeline not found'
+ structured_payload(
+ entity_id: entity_id,
+ pipeline_tracker_id: pipeline_tracker_id,
+ message: 'Unstarted pipeline not found'
+ )
)
end
@@ -66,10 +65,11 @@ module BulkImports
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}"
+ structured_payload(
+ entity_id: pipeline_tracker.entity.id,
+ pipeline_name: pipeline_tracker.pipeline_name,
+ message: "Retrying error: #{e.message}"
+ )
)
pipeline_tracker.update!(status_event: 'retry', jid: jid)
@@ -86,10 +86,11 @@ module BulkImports
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: exception.message
+ structured_payload(
+ entity_id: pipeline_tracker.entity.id,
+ pipeline_name: pipeline_tracker.pipeline_name,
+ message: exception.message
+ )
)
Gitlab::ErrorTracking.track_exception(
diff --git a/app/workers/bulk_imports/relation_export_worker.rb b/app/workers/bulk_imports/relation_export_worker.rb
index 9324b79cc75..dcac841b3b2 100644
--- a/app/workers/bulk_imports/relation_export_worker.rb
+++ b/app/workers/bulk_imports/relation_export_worker.rb
@@ -3,12 +3,12 @@
module BulkImports
class RelationExportWorker
include ApplicationWorker
-
- data_consistency :always
include ExceptionBacktrace
idempotent!
+ deduplicate :until_executed
loggable_arguments 2, 3
+ data_consistency :always
feature_category :importers
sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION
diff --git a/app/workers/bulk_imports/stuck_import_worker.rb b/app/workers/bulk_imports/stuck_import_worker.rb
new file mode 100644
index 00000000000..3fa4221728b
--- /dev/null
+++ b/app/workers/bulk_imports/stuck_import_worker.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class StuckImportWorker
+ include ApplicationWorker
+
+ # This worker does not schedule other workers that require context.
+ include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
+
+ idempotent!
+ data_consistency :always
+
+ feature_category :importers
+
+ def perform
+ BulkImport.stale.find_each do |import|
+ import.cleanup_stale
+ end
+
+ BulkImports::Entity.includes(:trackers).stale.find_each do |import| # rubocop: disable CodeReuse/ActiveRecord
+ ApplicationRecord.transaction do
+ import.cleanup_stale
+
+ import.trackers.find_each do |tracker|
+ tracker.cleanup_stale
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/workers/ci/update_locked_unknown_artifacts_worker.rb b/app/workers/ci/update_locked_unknown_artifacts_worker.rb
new file mode 100644
index 00000000000..2d37ebb3c93
--- /dev/null
+++ b/app/workers/ci/update_locked_unknown_artifacts_worker.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module Ci
+ class UpdateLockedUnknownArtifactsWorker # rubocop:disable Scalability/IdempotentWorker
+ include ApplicationWorker
+
+ data_consistency :sticky
+ urgency :throttled
+
+ # rubocop:disable Scalability/CronWorkerContext
+ # This worker does not perform work scoped to a context
+ include CronjobQueue
+ # rubocop:enable Scalability/CronWorkerContext
+
+ feature_category :build_artifacts
+
+ def perform
+ return unless ::Feature.enabled?(:ci_job_artifacts_backlog_work)
+
+ artifact_counts = Ci::JobArtifacts::UpdateUnknownLockedStatusService.new.execute
+
+ log_extra_metadata_on_done(:removed_count, artifact_counts[:removed])
+ log_extra_metadata_on_done(:locked_count, artifact_counts[:locked])
+ end
+ end
+end
diff --git a/app/workers/concerns/chaos_queue.rb b/app/workers/concerns/chaos_queue.rb
index a9c557f0175..23e58b5182b 100644
--- a/app/workers/concerns/chaos_queue.rb
+++ b/app/workers/concerns/chaos_queue.rb
@@ -5,6 +5,6 @@ module ChaosQueue
included do
queue_namespace :chaos
- feature_category_not_owned!
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
end
end
diff --git a/app/workers/concerns/git_garbage_collect_methods.rb b/app/workers/concerns/git_garbage_collect_methods.rb
index 13b7e7b5b1f..308ffacfc6b 100644
--- a/app/workers/concerns/git_garbage_collect_methods.rb
+++ b/app/workers/concerns/git_garbage_collect_methods.rb
@@ -121,8 +121,12 @@ module GitGarbageCollectMethods
end.new(repository)
end
+ # The option to enable/disable bitmaps has been removed in https://gitlab.com/gitlab-org/gitlab/-/issues/353777
+ # Now the options is always enabled
+ # This method and all the deprecated RPCs are going to be removed in
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/353779
def bitmaps_enabled?
- Gitlab::CurrentSettings.housekeeping_bitmaps_enabled
+ true
end
def flush_ref_caches(resource)
diff --git a/app/workers/concerns/packages/cleanup_artifact_worker.rb b/app/workers/concerns/packages/cleanup_artifact_worker.rb
index d4ad023b4a8..a01d7e8abba 100644
--- a/app/workers/concerns/packages/cleanup_artifact_worker.rb
+++ b/app/workers/concerns/packages/cleanup_artifact_worker.rb
@@ -14,7 +14,9 @@ module Packages
artifact.destroy!
rescue StandardError
- artifact&.error!
+ unless artifact&.destroyed?
+ artifact&.update_column(:status, :error)
+ end
end
after_destroy
@@ -48,7 +50,7 @@ module Packages
to_delete = next_item
if to_delete
- to_delete.processing!
+ to_delete.update_column(:status, :processing)
log_cleanup_item(to_delete)
end
diff --git a/app/workers/concerns/reactive_cacheable_worker.rb b/app/workers/concerns/reactive_cacheable_worker.rb
index 78fcf8087c2..a598b8a9d7d 100644
--- a/app/workers/concerns/reactive_cacheable_worker.rb
+++ b/app/workers/concerns/reactive_cacheable_worker.rb
@@ -8,7 +8,10 @@ module ReactiveCacheableWorker
sidekiq_options retry: 3
- feature_category_not_owned!
+ # Feature category is different depending on the model that is using the
+ # reactive cache. Identified by the `related_class` attribute.
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
+
loggable_arguments 0
def self.context_for_arguments(arguments)
diff --git a/app/workers/concerns/worker_attributes.rb b/app/workers/concerns/worker_attributes.rb
index 6f91418e38c..8f7a3da5429 100644
--- a/app/workers/concerns/worker_attributes.rb
+++ b/app/workers/concerns/worker_attributes.rb
@@ -35,17 +35,9 @@ module WorkerAttributes
class_methods do
def feature_category(value, *extras)
- raise "Invalid category. Use `feature_category_not_owned!` to mark a worker as not owned" if value == :not_owned
-
set_class_attribute(:feature_category, value)
end
- # Special case: mark this work as not associated with a feature category
- # this should be used for cross-cutting concerns, such as mailer workers.
- def feature_category_not_owned!
- 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
diff --git a/app/workers/container_registry/migration/enqueuer_worker.rb b/app/workers/container_registry/migration/enqueuer_worker.rb
index 5feaba870e6..8705deb0cb2 100644
--- a/app/workers/container_registry/migration/enqueuer_worker.rb
+++ b/app/workers/container_registry/migration/enqueuer_worker.rb
@@ -6,6 +6,9 @@ module ContainerRegistry
include ApplicationWorker
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
include Gitlab::Utils::StrongMemoize
+ include ExclusiveLeaseGuard
+
+ DEFAULT_LEASE_TIMEOUT = 30.minutes.to_i.freeze
data_consistency :always
feature_category :container_registry
@@ -14,70 +17,103 @@ module ContainerRegistry
idempotent!
def perform
- return unless migration.enabled?
- return unless below_capacity?
- return unless waiting_time_passed?
+ re_enqueue = false
+ try_obtain_lease do
+ break unless runnable?
- re_enqueue_if_capacity if handle_aborted_migration || handle_next_migration
- rescue StandardError => e
- Gitlab::ErrorTracking.log_exception(
- e,
- next_repository_id: next_repository&.id,
- next_aborted_repository_id: next_aborted_repository&.id
- )
-
- next_repository&.abort_import
+ re_enqueue = handle_aborted_migration || handle_next_migration
+ end
+ re_enqueue_if_capacity if re_enqueue
end
private
def handle_aborted_migration
- return unless next_aborted_repository&.retry_aborted_migration
+ return unless next_aborted_repository
- log_extra_metadata_on_done(:container_repository_id, next_aborted_repository.id)
log_extra_metadata_on_done(:import_type, 'retry')
+ log_repository(next_aborted_repository)
+
+ next_aborted_repository.retry_aborted_migration
+
+ true
+ rescue StandardError => e
+ Gitlab::ErrorTracking.log_exception(e, next_aborted_repository_id: next_aborted_repository&.id)
true
+ ensure
+ log_repository_migration_state(next_aborted_repository)
end
def handle_next_migration
return unless next_repository
+
+ log_extra_metadata_on_done(:import_type, 'next')
+ log_repository(next_repository)
+
# We return true because the repository was successfully processed (migration_state is changed)
return true if tag_count_too_high?
return unless next_repository.start_pre_import
- log_extra_metadata_on_done(:container_repository_id, next_repository.id)
- log_extra_metadata_on_done(:import_type, 'next')
-
true
+ rescue StandardError => e
+ Gitlab::ErrorTracking.log_exception(e, next_repository_id: next_repository&.id)
+ next_repository&.abort_import
+
+ false
+ ensure
+ log_repository_migration_state(next_repository)
end
def tag_count_too_high?
return false unless next_repository.tags_count > migration.max_tags_count
next_repository.skip_import(reason: :too_many_tags)
+ log_extra_metadata_on_done(:tags_count_too_high, true)
+ log_extra_metadata_on_done(:max_tags_count_setting, migration.max_tags_count)
true
end
def below_capacity?
- current_capacity <= maximum_capacity
+ current_capacity < maximum_capacity
end
def waiting_time_passed?
delay = migration.enqueue_waiting_time
return true if delay == 0
- return true unless last_step_completed_repository
+ return true unless last_step_completed_repository&.last_import_step_done_at
last_step_completed_repository.last_import_step_done_at < Time.zone.now - delay
end
- def current_capacity
- strong_memoize(:current_capacity) do
- ContainerRepository.with_migration_states(
- %w[pre_importing pre_import_done importing]
- ).count
+ def runnable?
+ unless migration.enabled?
+ log_extra_metadata_on_done(:migration_enabled, false)
+ return false
+ end
+
+ unless below_capacity?
+ log_extra_metadata_on_done(:max_capacity_setting, maximum_capacity)
+ log_extra_metadata_on_done(:below_capacity, false)
+
+ return false
+ end
+
+ unless waiting_time_passed?
+ log_extra_metadata_on_done(:waiting_time_passed, false)
+ log_extra_metadata_on_done(:current_waiting_time_setting, migration.enqueue_waiting_time)
+
+ return false
end
+
+ true
+ end
+
+ def current_capacity
+ ContainerRepository.with_migration_states(
+ %w[pre_importing pre_import_done importing]
+ ).count
end
def maximum_capacity
@@ -107,10 +143,31 @@ module ContainerRegistry
end
def re_enqueue_if_capacity
- return unless current_capacity < maximum_capacity
+ return unless below_capacity?
self.class.perform_async
end
+
+ def log_repository(repository)
+ log_extra_metadata_on_done(:container_repository_id, repository&.id)
+ log_extra_metadata_on_done(:container_repository_path, repository&.path)
+ end
+
+ def log_repository_migration_state(repository)
+ return unless repository
+
+ log_extra_metadata_on_done(:container_repository_migration_state, repository.migration_state)
+ end
+
+ # used by ExclusiveLeaseGuard
+ def lease_key
+ 'container_registry:migration:enqueuer_worker'
+ end
+
+ # used by ExclusiveLeaseGuard
+ def lease_timeout
+ DEFAULT_LEASE_TIMEOUT
+ end
end
end
end
diff --git a/app/workers/container_registry/migration/guard_worker.rb b/app/workers/container_registry/migration/guard_worker.rb
index 77ae111c1cb..bab6b8c2a72 100644
--- a/app/workers/container_registry/migration/guard_worker.rb
+++ b/app/workers/container_registry/migration/guard_worker.rb
@@ -29,46 +29,45 @@ module ContainerRegistry
log_extra_metadata_on_done(:stale_migrations_count, repositories.to_a.size)
repositories.each do |repository|
- if abortable?(repository)
+ if actively_importing?(repository)
+ # if a repository is actively importing but not yet long_running, do nothing
+ if long_running_migration?(repository)
+ long_running_migration_ids << repository.id
+ cancel_long_running_migration(repository)
+ aborts_count += 1
+ end
+ else
repository.abort_import
aborts_count += 1
- else
- long_running_migration_ids << repository.id if long_running_migration?(repository)
end
end
log_extra_metadata_on_done(:aborted_stale_migrations_count, aborts_count)
if long_running_migration_ids.any?
- log_extra_metadata_on_done(:long_running_stale_migration_container_repository_ids, long_running_migration_ids)
+ log_extra_metadata_on_done(:aborted_long_running_migration_ids, long_running_migration_ids)
end
end
private
- # This can ping the Container Registry API.
- # We loop on a set of repositories to calls this function (see #perform)
- # In the worst case scenario, we have a n+1 API calls situation here.
- #
- # This is reasonable because the maximum amount of repositories looped
- # on is `25`. See ::ContainerRegistry::Migration.capacity.
- #
- # TODO We can remove this n+1 situation by having a Container Registry API
- # endpoint that accepts multiple repository paths at once. This is issue
+ # A repository is actively_importing if it has an importing migration state
+ # and that state matches the state in the registry
+ # TODO We can have an API call n+1 situation here. It can be solved when the
+ # endpoint accepts multiple repository paths at once. This is issue
# https://gitlab.com/gitlab-org/container-registry/-/issues/582
- def abortable?(repository)
- # early return to save one Container Registry API request
- return true unless repository.importing? || repository.pre_importing?
- return true unless external_migration_in_progress?(repository)
+ def actively_importing?(repository)
+ return false unless repository.importing? || repository.pre_importing?
+ return false unless external_state_matches_migration_state?(repository)
- false
+ true
end
def long_running_migration?(repository)
migration_start_timestamp(repository).before?(long_running_migration_threshold)
end
- def external_migration_in_progress?(repository)
+ def external_state_matches_migration_state?(repository)
status = repository.external_import_status
(status == 'pre_import_in_progress' && repository.pre_importing?) ||
@@ -96,6 +95,21 @@ module ContainerRegistry
def long_running_migration_threshold
@threshold ||= 30.minutes.ago
end
+
+ def cancel_long_running_migration(repository)
+ result = repository.migration_cancel
+
+ case result[:status]
+ when :ok
+ repository.skip_import(reason: :migration_canceled)
+ when :bad_request
+ repository.reconcile_import_status(result[:state]) do
+ repository.abort_import
+ end
+ else
+ repository.abort_import
+ end
+ end
end
end
end
diff --git a/app/workers/database/batched_background_migration/ci_database_worker.rb b/app/workers/database/batched_background_migration/ci_database_worker.rb
index 98ec6f98123..13314cf95e2 100644
--- a/app/workers/database/batched_background_migration/ci_database_worker.rb
+++ b/app/workers/database/batched_background_migration/ci_database_worker.rb
@@ -4,6 +4,10 @@ module Database
class CiDatabaseWorker # rubocop:disable Scalability/IdempotentWorker
include SingleDatabaseWorker
+ def self.enabled?
+ Feature.enabled?(:execute_batched_migrations_on_schedule_ci_database, type: :ops, default_enabled: :yaml)
+ end
+
def self.tracking_database
@tracking_database ||= Gitlab::Database::CI_DATABASE_NAME
end
diff --git a/app/workers/database/batched_background_migration/single_database_worker.rb b/app/workers/database/batched_background_migration/single_database_worker.rb
index 78c82a6549f..aeadda4b8e1 100644
--- a/app/workers/database/batched_background_migration/single_database_worker.rb
+++ b/app/workers/database/batched_background_migration/single_database_worker.rb
@@ -23,6 +23,10 @@ module Database
def tracking_database
raise NotImplementedError, "#{self.name} does not implement #{__method__}"
end
+
+ def enabled?
+ raise NotImplementedError, "#{self.name} does not implement #{__method__}"
+ end
# :nocov:
def lease_key
@@ -41,7 +45,7 @@ module Database
end
Gitlab::Database::SharedModel.using_connection(base_model.connection) do
- break unless Feature.enabled?(:execute_batched_migrations_on_schedule, type: :ops, default_enabled: :yaml) && active_migration
+ break unless self.class.enabled? && active_migration
with_exclusive_lease(active_migration.interval) do
# Now that we have the exclusive lease, reload migration in case another process has changed it.
diff --git a/app/workers/database/batched_background_migration_worker.rb b/app/workers/database/batched_background_migration_worker.rb
index 29804be832d..6a41fe70915 100644
--- a/app/workers/database/batched_background_migration_worker.rb
+++ b/app/workers/database/batched_background_migration_worker.rb
@@ -4,6 +4,10 @@ module Database
class BatchedBackgroundMigrationWorker # rubocop:disable Scalability/IdempotentWorker
include BatchedBackgroundMigration::SingleDatabaseWorker
+ def self.enabled?
+ Feature.enabled?(:execute_batched_migrations_on_schedule, type: :ops, default_enabled: :yaml)
+ end
+
def self.tracking_database
@tracking_database ||= Gitlab::Database::MAIN_DATABASE_NAME.to_sym
end
diff --git a/app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb b/app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb
new file mode 100644
index 00000000000..2b4253947ac
--- /dev/null
+++ b/app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Database
+ class CiNamespaceMirrorsConsistencyCheckWorker
+ include ApplicationWorker
+ include CronjobQueue # rubocop: disable Scalability/CronWorkerContext
+
+ sidekiq_options retry: false
+ feature_category :sharding
+ data_consistency :sticky
+ idempotent!
+
+ version 1
+
+ def perform
+ return if Feature.disabled?(:ci_namespace_mirrors_consistency_check, default_enabled: :yaml)
+
+ results = ConsistencyCheckService.new(
+ source_model: Namespace,
+ target_model: Ci::NamespaceMirror,
+ source_columns: %w[id traversal_ids],
+ target_columns: %w[namespace_id traversal_ids]
+ ).execute
+
+ log_extra_metadata_on_done(:results, results)
+ end
+ end
+end
diff --git a/app/workers/database/ci_project_mirrors_consistency_check_worker.rb b/app/workers/database/ci_project_mirrors_consistency_check_worker.rb
new file mode 100644
index 00000000000..e9413256617
--- /dev/null
+++ b/app/workers/database/ci_project_mirrors_consistency_check_worker.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Database
+ class CiProjectMirrorsConsistencyCheckWorker
+ include ApplicationWorker
+ include CronjobQueue # rubocop: disable Scalability/CronWorkerContext
+
+ sidekiq_options retry: false
+ feature_category :sharding
+ data_consistency :sticky
+ idempotent!
+
+ version 1
+
+ def perform
+ return if Feature.disabled?(:ci_project_mirrors_consistency_check, default_enabled: :yaml)
+
+ results = ConsistencyCheckService.new(
+ source_model: Project,
+ target_model: Ci::ProjectMirror,
+ source_columns: %w[id namespace_id],
+ target_columns: %w[project_id namespace_id]
+ ).execute
+
+ log_extra_metadata_on_done(:results, results)
+ end
+ end
+end
diff --git a/app/workers/delete_stored_files_worker.rb b/app/workers/delete_stored_files_worker.rb
index d1080c8df64..86167a7fafe 100644
--- a/app/workers/delete_stored_files_worker.rb
+++ b/app/workers/delete_stored_files_worker.rb
@@ -7,7 +7,7 @@ class DeleteStoredFilesWorker # rubocop:disable Scalability/IdempotentWorker
sidekiq_options retry: 3
- feature_category_not_owned!
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
loggable_arguments 0
def perform(class_name, keys)
diff --git a/app/workers/environments/auto_stop_worker.rb b/app/workers/environments/auto_stop_worker.rb
index 672a4f4121e..aee6e977550 100644
--- a/app/workers/environments/auto_stop_worker.rb
+++ b/app/workers/environments/auto_stop_worker.rb
@@ -10,8 +10,10 @@ module Environments
def perform(environment_id, params = {})
Environment.find_by_id(environment_id).try do |environment|
- user = environment.stop_action&.user
- environment.stop_with_action!(user)
+ stop_actions = environment.stop_actions
+
+ user = stop_actions.last&.user
+ environment.stop_with_actions!(user)
end
end
end
diff --git a/app/workers/flush_counter_increments_worker.rb b/app/workers/flush_counter_increments_worker.rb
index c4a3a5283cc..e21a7ee35e7 100644
--- a/app/workers/flush_counter_increments_worker.rb
+++ b/app/workers/flush_counter_increments_worker.rb
@@ -12,7 +12,10 @@ class FlushCounterIncrementsWorker
sidekiq_options retry: 3
- feature_category_not_owned!
+ # The increments in `ProjectStatistics` are owned by several teams depending
+ # on the counter
+ feature_category :not_owned # rubocop:disable Gitlab/AvoidFeatureCategoryNotOwned
+
urgency :low
deduplicate :until_executing, including_scheduled: true
diff --git a/app/workers/namespaces/invite_team_email_worker.rb b/app/workers/namespaces/invite_team_email_worker.rb
deleted file mode 100644
index eabf33a7fba..00000000000
--- a/app/workers/namespaces/invite_team_email_worker.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-module Namespaces
- class InviteTeamEmailWorker # rubocop:disable Scalability/IdempotentWorker
- include ApplicationWorker
-
- data_consistency :always
-
- feature_category :experimentation_activation
- urgency :low
-
- def perform(group_id, user_id)
- # rubocop: disable CodeReuse/ActiveRecord
- user = User.find_by(id: user_id)
- group = Group.find_by(id: group_id)
- # rubocop: enable CodeReuse/ActiveRecord
- return unless user && group
-
- Namespaces::InviteTeamEmailService.send_email(user, group)
- end
- end
-end
diff --git a/app/workers/namespaces/root_statistics_worker.rb b/app/workers/namespaces/root_statistics_worker.rb
index b97dbca2c1c..e1271dae335 100644
--- a/app/workers/namespaces/root_statistics_worker.rb
+++ b/app/workers/namespaces/root_statistics_worker.rb
@@ -20,8 +20,17 @@ module Namespaces
Namespaces::StatisticsRefresherService.new.execute(namespace)
namespace.aggregation_schedule.destroy
+
+ notify_storage_usage(namespace)
rescue ::Namespaces::StatisticsRefresherService::RefresherError, ActiveRecord::RecordNotFound => ex
Gitlab::ErrorTracking.track_exception(ex, namespace_id: namespace_id, namespace: namespace&.full_path)
end
+
+ private
+
+ def notify_storage_usage(namespace)
+ end
end
end
+
+Namespaces::RootStatisticsWorker.prepend_mod_with('Namespaces::RootStatisticsWorker')
diff --git a/app/workers/object_storage/background_move_worker.rb b/app/workers/object_storage/background_move_worker.rb
index 2204e504702..bb51f0d7e1f 100644
--- a/app/workers/object_storage/background_move_worker.rb
+++ b/app/workers/object_storage/background_move_worker.rb
@@ -8,7 +8,7 @@ module ObjectStorage
include ObjectStorageQueue
sidekiq_options retry: 5
- feature_category_not_owned!
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
loggable_arguments 0, 1, 2, 3
def perform(uploader_class_name, subject_class_name, file_field, subject_id)
diff --git a/app/workers/object_storage/migrate_uploads_worker.rb b/app/workers/object_storage/migrate_uploads_worker.rb
index ea4a90cf9d2..b7d938e6b68 100644
--- a/app/workers/object_storage/migrate_uploads_worker.rb
+++ b/app/workers/object_storage/migrate_uploads_worker.rb
@@ -10,7 +10,7 @@ module ObjectStorage
sidekiq_options retry: 3
include ObjectStorageQueue
- feature_category_not_owned!
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
loggable_arguments 0, 1, 2, 3
SanityCheckError = Class.new(StandardError)
diff --git a/app/workers/project_export_worker.rb b/app/workers/project_export_worker.rb
index e3f8c4bcd9d..ee892d43313 100644
--- a/app/workers/project_export_worker.rb
+++ b/app/workers/project_export_worker.rb
@@ -8,7 +8,7 @@ class ProjectExportWorker # rubocop:disable Scalability/IdempotentWorker
feature_category :importers
worker_resource_boundary :memory
- urgency :throttled
+ urgency :low
loggable_arguments 2, 3
sidekiq_options retry: false, dead: false
sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION
@@ -21,7 +21,10 @@ class ProjectExportWorker # rubocop:disable Scalability/IdempotentWorker
export_job&.start
- ::Projects::ImportExport::ExportService.new(project, current_user, params).execute(after_export)
+ export_service = ::Projects::ImportExport::ExportService.new(project, current_user, params)
+ export_service.execute(after_export)
+
+ log_exporters_duration(export_service)
export_job&.finish
rescue ActiveRecord::RecordNotFound => e
@@ -46,4 +49,13 @@ class ProjectExportWorker # rubocop:disable Scalability/IdempotentWorker
def log_failure(project_id, ex)
logger.error("Failed to export project #{project_id}: #{ex.message}")
end
+
+ def log_exporters_duration(export_service)
+ export_service.exporters.each do |exporter|
+ exporter_key = "#{exporter.class.name.demodulize.underscore}_duration_s".to_sym # e.g. uploads_saver_duration_s
+ exporter_duration = exporter.duration_s&.round(6)
+
+ log_extra_metadata_on_done(exporter_key, exporter_duration)
+ end
+ end
end
diff --git a/app/workers/projects/record_target_platforms_worker.rb b/app/workers/projects/record_target_platforms_worker.rb
new file mode 100644
index 00000000000..5b1f85ecca0
--- /dev/null
+++ b/app/workers/projects/record_target_platforms_worker.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+module Projects
+ class RecordTargetPlatformsWorker
+ include ApplicationWorker
+ include ExclusiveLeaseGuard
+
+ LEASE_TIMEOUT = 1.hour.to_i
+ APPLE_PLATFORM_LANGUAGES = %w(swift objective-c).freeze
+
+ feature_category :experimentation_activation
+ data_consistency :always
+ deduplicate :until_executed
+ urgency :low
+ idempotent!
+
+ def perform(project_id)
+ @project = Project.find_by_id(project_id)
+
+ return unless project
+ return unless uses_apple_platform_languages?
+
+ try_obtain_lease do
+ @target_platforms = Projects::RecordTargetPlatformsService.new(project).execute
+ log_target_platforms_metadata
+ end
+ end
+
+ private
+
+ attr_reader :target_platforms, :project
+
+ def uses_apple_platform_languages?
+ project.repository_languages.with_programming_language(*APPLE_PLATFORM_LANGUAGES).present?
+ end
+
+ def log_target_platforms_metadata
+ return unless target_platforms.present?
+
+ log_extra_metadata_on_done(:target_platforms, target_platforms)
+ end
+
+ def lease_key
+ @lease_key ||= "#{self.class.name.underscore}:#{project.id}"
+ end
+
+ def lease_timeout
+ LEASE_TIMEOUT
+ end
+
+ def lease_release?
+ false
+ end
+ end
+end
diff --git a/app/workers/quality/test_data_cleanup_worker.rb b/app/workers/quality/test_data_cleanup_worker.rb
deleted file mode 100644
index 68b36cacbbf..00000000000
--- a/app/workers/quality/test_data_cleanup_worker.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-module Quality
- class TestDataCleanupWorker
- include ApplicationWorker
-
- data_consistency :always
- feature_category :quality_management
- urgency :low
-
- include CronjobQueue
- idempotent!
-
- KEEP_RECENT_DATA_DAY = 3
- GROUP_PATH_PATTERN = 'test-group-fulfillment'
- GROUP_OWNER_EMAIL_PATTERN = %w(test-user- gitlab-qa-user qa-user-).freeze
-
- # Remove test groups generated in E2E tests on gstg
- # rubocop: disable CodeReuse/ActiveRecord
- def perform
- return unless Gitlab.staging?
-
- Group.where('path like ?', "#{GROUP_PATH_PATTERN}%").where('created_at < ?', KEEP_RECENT_DATA_DAY.days.ago).each do |group|
- next unless GROUP_OWNER_EMAIL_PATTERN.any? { |pattern| group.owners.first.email.include?(pattern) }
-
- with_context(namespace: group, user: group.owners.first) do
- Groups::DestroyService.new(group, group.owners.first).execute
- end
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
- end
-end
diff --git a/config.ru b/config.ru
index f07c25f503a..ed77402aead 100644
--- a/config.ru
+++ b/config.ru
@@ -2,7 +2,7 @@
# This file is used by Rack-based servers to start the application.
-require ::File.expand_path('../config/environment', __FILE__)
+require ::File.expand_path('config/environment', __dir__)
warmup do |app|
client = Rack::MockRequest.new(app)
diff --git a/config/application.rb b/config/application.rb
index 76541daa9e1..aa1a0b26d60 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -69,18 +69,19 @@ module Gitlab
require_dependency Rails.root.join('lib/gitlab/middleware/handle_malformed_strings')
require_dependency Rails.root.join('lib/gitlab/middleware/rack_multipart_tempfile_factory')
require_dependency Rails.root.join('lib/gitlab/runtime')
- require_dependency Rails.root.join('lib/gitlab/patch/legacy_database_config')
+ require_dependency Rails.root.join('lib/gitlab/patch/database_config')
require_dependency Rails.root.join('lib/gitlab/exceptions_app')
config.exceptions_app = Gitlab::ExceptionsApp.new(Rails.public_path)
- # To be removed in 15.0
- # This preload is needed to convert legacy `database.yml`
- # from `production: adapter: postgresql`
- # into a `production: main: adapter: postgresql`
- unless Gitlab::Utils.to_boolean(ENV['SKIP_DATABASE_CONFIG_VALIDATION'], default: false)
- config.class.prepend(::Gitlab::Patch::LegacyDatabaseConfig)
- end
+ # This preload is required to:
+ #
+ # 1. Convert legacy `database.yml`;
+ # 2. Include Geo post-deployment migrations settings;
+ #
+ # TODO: In 15.0, this preload can be wrapped in a Gitlab.ee block
+ # since we don't need to convert legacy `database.yml` anymore.
+ config.class.prepend(::Gitlab::Patch::DatabaseConfig)
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
@@ -313,6 +314,8 @@ module Gitlab
config.assets.precompile << "themes/*.css"
config.assets.precompile << "highlight/themes/*.css"
+ config.assets.precompile << "highlight/diff_custom_colors_addition.css"
+ config.assets.precompile << "highlight/diff_custom_colors_deletion.css"
# Import gitlab-svgs directly from vendored directory
config.assets.paths << "#{config.root}/node_modules/@gitlab/svgs/dist"
@@ -514,6 +517,14 @@ module Gitlab
end
end
+ # We run the contents of active_record.clear_active_connections again
+ # because we connect to database from routes
+ # https://github.com/rails/rails/blob/fdf840f69a2e33d78a9d40b91d9b7fddb76711e9/activerecord/lib/active_record/railtie.rb#L308
+ initializer :clear_active_connections_again, after: :set_routes_reloader_hook do
+ ActiveRecord::Base.clear_active_connections!
+ ActiveRecord::Base.flush_idle_connections!
+ end
+
# DO NOT PLACE ANY INITIALIZERS AFTER THIS.
config.after_initialize do
# on_master_start yields immediately in unclustered environments and runs
diff --git a/config/events/1649272430_projectsnew_visit_docs.yml b/config/events/1649272430_projectsnew_visit_docs.yml
new file mode 100644
index 00000000000..8a058e12c3b
--- /dev/null
+++ b/config/events/1649272430_projectsnew_visit_docs.yml
@@ -0,0 +1,18 @@
+---
+description: Docs link under the deployment target select visited from new project creation form
+category: projects:new
+action: visit_docs
+label_description: new_project_deployment_target
+product_section: ops
+product_stage: configure
+product_group: group::configure
+milestone: "14.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84224
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
+
diff --git a/config/feature_categories.yml b/config/feature_categories.yml
index c422d2da691..c991d3e3720 100644
--- a/config/feature_categories.yml
+++ b/config/feature_categories.yml
@@ -73,7 +73,6 @@
- internationalization
- jenkins_importer
- kubernetes_management
-- license
- license_compliance
- logging
- memory
@@ -94,6 +93,7 @@
- privacy_control_center
- product_analytics
- projects
+- provision
- purchase
- quality_management
- redis
@@ -120,7 +120,6 @@
- subgroups
- team_planning
- tracing
-- usage_ping
- users
- utilization
- value_stream_management
diff --git a/config/feature_flags/development/about_your_company_registration_flow.yml b/config/feature_flags/development/about_your_company_registration_flow.yml
new file mode 100644
index 00000000000..424de7a9ba2
--- /dev/null
+++ b/config/feature_flags/development/about_your_company_registration_flow.yml
@@ -0,0 +1,8 @@
+---
+name: about_your_company_registration_flow
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83345
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355909
+milestone: '14.10'
+type: development
+group: group::adoption
+default_enabled: false
diff --git a/config/feature_flags/development/admin_application_settings_service_usage_data_center.yml b/config/feature_flags/development/admin_application_settings_service_usage_data_center.yml
deleted file mode 100644
index 465f9061eb4..00000000000
--- a/config/feature_flags/development/admin_application_settings_service_usage_data_center.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: admin_application_settings_service_usage_data_center
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78747
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351268
-milestone: '14.8'
-type: development
-group: group::product intelligence
-default_enabled: true
diff --git a/config/feature_flags/development/admin_runners_bulk_delete.yml b/config/feature_flags/development/admin_runners_bulk_delete.yml
new file mode 100644
index 00000000000..ff285855e96
--- /dev/null
+++ b/config/feature_flags/development/admin_runners_bulk_delete.yml
@@ -0,0 +1,8 @@
+---
+name: admin_runners_bulk_delete
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81894
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353981
+milestone: '14.9'
+type: development
+group: group::runner
+default_enabled: false
diff --git a/config/feature_flags/development/allow_non_blocking_member_refresh.yml b/config/feature_flags/development/allow_non_blocking_member_refresh.yml
new file mode 100644
index 00000000000..44ab1c13e7e
--- /dev/null
+++ b/config/feature_flags/development/allow_non_blocking_member_refresh.yml
@@ -0,0 +1,8 @@
+---
+name: allow_non_blocking_member_refresh
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83619
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357281
+milestone: '14.10'
+type: development
+group: group::authentication and authorization
+default_enabled: false
diff --git a/config/feature_flags/development/arkose_labs_login_challenge.yml b/config/feature_flags/development/arkose_labs_login_challenge.yml
new file mode 100644
index 00000000000..74c5d625aa3
--- /dev/null
+++ b/config/feature_flags/development/arkose_labs_login_challenge.yml
@@ -0,0 +1,8 @@
+---
+name: arkose_labs_login_challenge
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82751
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356171
+milestone: '14.10'
+type: development
+group: group::antiabuse
+default_enabled: false
diff --git a/config/feature_flags/development/arkose_labs_prevent_login.yml b/config/feature_flags/development/arkose_labs_prevent_login.yml
new file mode 100644
index 00000000000..8d55fd6de3a
--- /dev/null
+++ b/config/feature_flags/development/arkose_labs_prevent_login.yml
@@ -0,0 +1,8 @@
+---
+name: arkose_labs_prevent_login
+introduced_by_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358838
+milestone: '14.10'
+type: development
+group: group::antiabuse
+default_enabled: false
diff --git a/config/feature_flags/development/bulk_expire_project_artifacts.yml b/config/feature_flags/development/bulk_expire_project_artifacts.yml
deleted file mode 100644
index 9f1949e3dd2..00000000000
--- a/config/feature_flags/development/bulk_expire_project_artifacts.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: bulk_expire_project_artifacts
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75488
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347405
-milestone: '14.6'
-type: development
-group: group::pipeline insights
-default_enabled: true
diff --git a/config/feature_flags/development/ci_artifact_fast_removal_large_loop_limit.yml b/config/feature_flags/development/ci_artifact_fast_removal_large_loop_limit.yml
deleted file mode 100644
index bfb036bcc00..00000000000
--- a/config/feature_flags/development/ci_artifact_fast_removal_large_loop_limit.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_artifact_fast_removal_large_loop_limit
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76504
-rollout_issue_url:
-milestone: '14.6'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/ci_destroy_all_expired_service.yml b/config/feature_flags/development/ci_destroy_all_expired_service.yml
deleted file mode 100644
index 0f36a8d7e30..00000000000
--- a/config/feature_flags/development/ci_destroy_all_expired_service.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_destroy_all_expired_service
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76504
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/348786
-milestone: '14.6'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/ci_expand_environment_name_and_url.yml b/config/feature_flags/development/ci_expand_environment_name_and_url.yml
new file mode 100644
index 00000000000..58626cdfc46
--- /dev/null
+++ b/config/feature_flags/development/ci_expand_environment_name_and_url.yml
@@ -0,0 +1,8 @@
+---
+name: ci_expand_environment_name_and_url
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84969
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358831
+milestone: '14.10'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/ci_fix_order_of_subsequent_jobs.yml b/config/feature_flags/development/ci_fix_order_of_subsequent_jobs.yml
deleted file mode 100644
index 9a98604d0a8..00000000000
--- a/config/feature_flags/development/ci_fix_order_of_subsequent_jobs.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_fix_order_of_subsequent_jobs
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74394
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345587
-milestone: '14.9'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/ci_job_artifacts_backlog_large_loop_limit.yml b/config/feature_flags/development/ci_job_artifacts_backlog_large_loop_limit.yml
new file mode 100644
index 00000000000..1415d9e0db7
--- /dev/null
+++ b/config/feature_flags/development/ci_job_artifacts_backlog_large_loop_limit.yml
@@ -0,0 +1,8 @@
+---
+name: ci_job_artifacts_backlog_large_loop_limit
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76509
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347151
+milestone: '14.10'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_job_artifacts_backlog_work.yml b/config/feature_flags/development/ci_job_artifacts_backlog_work.yml
new file mode 100644
index 00000000000..a97982d2043
--- /dev/null
+++ b/config/feature_flags/development/ci_job_artifacts_backlog_work.yml
@@ -0,0 +1,8 @@
+---
+name: ci_job_artifacts_backlog_work
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76509
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347144
+milestone: '14.10'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_namespace_mirrors_consistency_check.yml b/config/feature_flags/development/ci_namespace_mirrors_consistency_check.yml
new file mode 100644
index 00000000000..965fb904a15
--- /dev/null
+++ b/config/feature_flags/development/ci_namespace_mirrors_consistency_check.yml
@@ -0,0 +1,8 @@
+---
+name: ci_namespace_mirrors_consistency_check
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81836
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356577
+milestone: '14.10'
+type: development
+group: group::sharding
+default_enabled: false
diff --git a/config/feature_flags/development/ci_owned_runners_unnest_index.yml b/config/feature_flags/development/ci_owned_runners_unnest_index.yml
new file mode 100644
index 00000000000..225ec3d5df4
--- /dev/null
+++ b/config/feature_flags/development/ci_owned_runners_unnest_index.yml
@@ -0,0 +1,8 @@
+---
+name: ci_owned_runners_unnest_index
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83843
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357869
+milestone: '14.10'
+type: development
+group: group::sharding
+default_enabled: false
diff --git a/config/feature_flags/development/ci_project_mirrors_consistency_check.yml b/config/feature_flags/development/ci_project_mirrors_consistency_check.yml
new file mode 100644
index 00000000000..9ba2865216d
--- /dev/null
+++ b/config/feature_flags/development/ci_project_mirrors_consistency_check.yml
@@ -0,0 +1,8 @@
+---
+name: ci_project_mirrors_consistency_check
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81836
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356583
+milestone: '14.10'
+type: development
+group: group::sharding
+default_enabled: false
diff --git a/config/feature_flags/development/ci_skip_legacy_extra_minutes_recalculation.yml b/config/feature_flags/development/ci_skip_legacy_extra_minutes_recalculation.yml
deleted file mode 100644
index 2b10b124c54..00000000000
--- a/config/feature_flags/development/ci_skip_legacy_extra_minutes_recalculation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_skip_legacy_extra_minutes_recalculation
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78476
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341730
-milestone: '14.8'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/ci_test_report_artifacts_expired.yml b/config/feature_flags/development/ci_test_report_artifacts_expired.yml
new file mode 100644
index 00000000000..843aa42efdc
--- /dev/null
+++ b/config/feature_flags/development/ci_test_report_artifacts_expired.yml
@@ -0,0 +1,8 @@
+---
+name: ci_test_report_artifacts_expired
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83113
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356773
+milestone: '14.10'
+type: development
+group: group::pipeline insights
+default_enabled: false
diff --git a/config/feature_flags/development/ci_throttle_pipelines_creation.yml b/config/feature_flags/development/ci_throttle_pipelines_creation.yml
new file mode 100644
index 00000000000..162a69ade5d
--- /dev/null
+++ b/config/feature_flags/development/ci_throttle_pipelines_creation.yml
@@ -0,0 +1,8 @@
+---
+name: ci_throttle_pipelines_creation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83969
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357520
+milestone: '14.10'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_throttle_pipelines_creation_dry_run.yml b/config/feature_flags/development/ci_throttle_pipelines_creation_dry_run.yml
new file mode 100644
index 00000000000..5092767e089
--- /dev/null
+++ b/config/feature_flags/development/ci_throttle_pipelines_creation_dry_run.yml
@@ -0,0 +1,8 @@
+---
+name: ci_throttle_pipelines_creation_dry_run
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83969
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357524
+milestone: '14.10'
+type: development
+group: group::pipeline execution
+default_enabled: true
diff --git a/config/feature_flags/development/ci_trigger_forward_variables.yml b/config/feature_flags/development/ci_trigger_forward_variables.yml
index 34e418599b4..4767ca0cb75 100644
--- a/config/feature_flags/development/ci_trigger_forward_variables.yml
+++ b/config/feature_flags/development/ci_trigger_forward_variables.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355572
milestone: '14.9'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/ci_validate_job_length.yml b/config/feature_flags/development/ci_validate_job_length.yml
deleted file mode 100644
index 5e29d3c1435..00000000000
--- a/config/feature_flags/development/ci_validate_job_length.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_validate_job_length
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73599
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/344665
-milestone: '14.5'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_variables_builder_config_variables.yml b/config/feature_flags/development/ci_variables_builder_config_variables.yml
new file mode 100644
index 00000000000..eb74993f90f
--- /dev/null
+++ b/config/feature_flags/development/ci_variables_builder_config_variables.yml
@@ -0,0 +1,8 @@
+---
+name: ci_variables_builder_config_variables
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79935
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358791
+milestone: '14.10'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_variables_builder_memoize_secret_variables.yml b/config/feature_flags/development/ci_variables_builder_memoize_secret_variables.yml
deleted file mode 100644
index a35b06f9907..00000000000
--- a/config/feature_flags/development/ci_variables_builder_memoize_secret_variables.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_variables_builder_memoize_secret_variables
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79850
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351995
-milestone: '14.8'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/container_registry_migration_phase2_all_plans.yml b/config/feature_flags/development/container_registry_migration_phase2_all_plans.yml
new file mode 100644
index 00000000000..6742a006519
--- /dev/null
+++ b/config/feature_flags/development/container_registry_migration_phase2_all_plans.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_migration_phase2_all_plans
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83135
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350543
+milestone: '14.10'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/container_security_policy_selection.yml b/config/feature_flags/development/container_security_policy_selection.yml
new file mode 100644
index 00000000000..e2407195ffc
--- /dev/null
+++ b/config/feature_flags/development/container_security_policy_selection.yml
@@ -0,0 +1,8 @@
+---
+name: container_security_policy_selection
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80272
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353071
+milestone: '14.10'
+type: development
+group: group::container security
+default_enabled: true
diff --git a/config/feature_flags/development/convert_diff_to_utf8_with_replacement_symbol.yml b/config/feature_flags/development/convert_diff_to_utf8_with_replacement_symbol.yml
new file mode 100644
index 00000000000..1d0f64d9ac2
--- /dev/null
+++ b/config/feature_flags/development/convert_diff_to_utf8_with_replacement_symbol.yml
@@ -0,0 +1,8 @@
+---
+name: convert_diff_to_utf8_with_replacement_symbol
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79996
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354526
+milestone: '14.9'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/create_project_settings.yml b/config/feature_flags/development/create_project_settings.yml
new file mode 100644
index 00000000000..8c536d1f3fa
--- /dev/null
+++ b/config/feature_flags/development/create_project_settings.yml
@@ -0,0 +1,8 @@
+---
+name: create_project_settings
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84502
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358136
+milestone: '14.10'
+type: development
+group: group::authentication and authorization
+default_enabled: false
diff --git a/config/feature_flags/development/deployment_approval_rules.yml b/config/feature_flags/development/deployment_approval_rules.yml
new file mode 100644
index 00000000000..1658f9c4fe0
--- /dev/null
+++ b/config/feature_flags/development/deployment_approval_rules.yml
@@ -0,0 +1,8 @@
+---
+name: deployment_approval_rules
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83495
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354726
+milestone: '14.10'
+type: development
+group: group::release
+default_enabled: true
diff --git a/config/feature_flags/development/diff_settings_usage_data.yml b/config/feature_flags/development/diff_settings_usage_data.yml
deleted file mode 100644
index 62f3a39584e..00000000000
--- a/config/feature_flags/development/diff_settings_usage_data.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: diff_settings_usage_data
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59979
-rollout_issue_url:
-milestone: '13.11'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/distribute_github_parallel_import.yml b/config/feature_flags/development/distribute_github_parallel_import.yml
new file mode 100644
index 00000000000..e7f9ac78afb
--- /dev/null
+++ b/config/feature_flags/development/distribute_github_parallel_import.yml
@@ -0,0 +1,8 @@
+---
+name: distribute_github_parallel_import
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83616
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356800
+milestone: '14.10'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/enforce_security_report_validation.yml b/config/feature_flags/development/enforce_security_report_validation.yml
new file mode 100644
index 00000000000..0478033c55b
--- /dev/null
+++ b/config/feature_flags/development/enforce_security_report_validation.yml
@@ -0,0 +1,8 @@
+---
+name: enforce_security_report_validation
+introduced_by_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351000
+milestone: '14.9'
+type: development
+group: group::threat insights
+default_enabled: false
diff --git a/config/feature_flags/development/enhanced_notify_css.yml b/config/feature_flags/development/enhanced_notify_css.yml
index e47db3ba435..010b80caf5d 100644
--- a/config/feature_flags/development/enhanced_notify_css.yml
+++ b/config/feature_flags/development/enhanced_notify_css.yml
@@ -1,7 +1,7 @@
---
name: enhanced_notify_css
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78604
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355907
milestone: '14.8'
type: development
group: group::project management
diff --git a/config/feature_flags/development/env_last_deployment_by_finished_at.yml b/config/feature_flags/development/env_last_deployment_by_finished_at.yml
new file mode 100644
index 00000000000..36163b167d0
--- /dev/null
+++ b/config/feature_flags/development/env_last_deployment_by_finished_at.yml
@@ -0,0 +1,8 @@
+---
+name: env_last_deployment_by_finished_at
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83558
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357299
+milestone: '14.10'
+type: development
+group: group::release
+default_enabled: true
diff --git a/config/feature_flags/development/environment_multiple_stop_actions.yml b/config/feature_flags/development/environment_multiple_stop_actions.yml
new file mode 100644
index 00000000000..514d5e8cf52
--- /dev/null
+++ b/config/feature_flags/development/environment_multiple_stop_actions.yml
@@ -0,0 +1,8 @@
+---
+name: environment_multiple_stop_actions
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84922
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358911
+milestone: '14.10'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/fix_related_environments_for_merge_requests.yml b/config/feature_flags/development/fix_related_environments_for_merge_requests.yml
new file mode 100644
index 00000000000..d958f1d4de0
--- /dev/null
+++ b/config/feature_flags/development/fix_related_environments_for_merge_requests.yml
@@ -0,0 +1,8 @@
+---
+name: fix_related_environments_for_merge_requests
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83382
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356642
+milestone: '14.10'
+type: development
+group: group::release
+default_enabled: true
diff --git a/config/feature_flags/development/geo_token_user_authentication.yml b/config/feature_flags/development/geo_token_user_authentication.yml
deleted file mode 100644
index aab95c93312..00000000000
--- a/config/feature_flags/development/geo_token_user_authentication.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: geo_token_user_authentication
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79431
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351450
-milestone: '14.8'
-type: development
-group: group::geo
-default_enabled: true
diff --git a/config/feature_flags/development/geo_use_clone_on_first_sync.yml b/config/feature_flags/development/geo_use_clone_on_first_sync.yml
new file mode 100644
index 00000000000..6eb41ee2f56
--- /dev/null
+++ b/config/feature_flags/development/geo_use_clone_on_first_sync.yml
@@ -0,0 +1,8 @@
+---
+name: geo_use_clone_on_first_sync
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77143
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357462
+milestone: '14.10'
+type: development
+group: group::geo
+default_enabled: false
diff --git a/config/feature_flags/development/gitaly_backup.yml b/config/feature_flags/development/gitaly_backup.yml
deleted file mode 100644
index 67552d39d92..00000000000
--- a/config/feature_flags/development/gitaly_backup.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitaly_backup
-introduced_by_url: https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3554
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/333034
-milestone: '14.0'
-type: development
-group: group::gitaly
-default_enabled: true
diff --git a/config/feature_flags/development/gitaly_replace_wiki_update_page.yml b/config/feature_flags/development/gitaly_replace_wiki_update_page.yml
new file mode 100644
index 00000000000..9fabf5edde8
--- /dev/null
+++ b/config/feature_flags/development/gitaly_replace_wiki_update_page.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_replace_wiki_update_page
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83833
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357246
+milestone: '14.10'
+type: development
+group: group::editor
+default_enabled: false
diff --git a/config/feature_flags/development/group_ci_cd_analytics_page.yml b/config/feature_flags/development/group_ci_cd_analytics_page.yml
deleted file mode 100644
index 1ee7bda169b..00000000000
--- a/config/feature_flags/development/group_ci_cd_analytics_page.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: group_ci_cd_analytics_page
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49608
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/292601
-milestone: '13.8'
-type: development
-group: group::release
-default_enabled: true
diff --git a/config/feature_flags/development/group_import_export.yml b/config/feature_flags/development/group_import_export.yml
deleted file mode 100644
index 0eb01340bef..00000000000
--- a/config/feature_flags/development/group_import_export.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: group_import_export
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22423
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/282245
-milestone: '12.8'
-type: development
-group: group::import
-default_enabled: true
diff --git a/config/feature_flags/development/group_member_inherited_group.yml b/config/feature_flags/development/group_member_inherited_group.yml
new file mode 100644
index 00000000000..6b10f8fa715
--- /dev/null
+++ b/config/feature_flags/development/group_member_inherited_group.yml
@@ -0,0 +1,8 @@
+---
+name: group_member_inherited_group
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71465
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357244
+milestone: '14.10'
+type: development
+group: group::workspace
+default_enabled: false
diff --git a/config/feature_flags/development/group_projects_api_preload_groups.yml b/config/feature_flags/development/group_projects_api_preload_groups.yml
new file mode 100644
index 00000000000..dea472548ae
--- /dev/null
+++ b/config/feature_flags/development/group_projects_api_preload_groups.yml
@@ -0,0 +1,8 @@
+---
+name: group_projects_api_preload_groups
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81838
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354372
+milestone: '14.9'
+type: development
+group: group::authentication and authorization
+default_enabled: false
diff --git a/config/feature_flags/development/group_wiki_settings_toggle.yml b/config/feature_flags/development/group_wiki_settings_toggle.yml
new file mode 100644
index 00000000000..083453a6944
--- /dev/null
+++ b/config/feature_flags/development/group_wiki_settings_toggle.yml
@@ -0,0 +1,8 @@
+---
+name: group_wiki_settings_toggle
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82298
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358387
+milestone: '14.10'
+type: development
+group: group::editor
+default_enabled: false
diff --git a/config/feature_flags/development/header_read_timeout_buffered_io.yml b/config/feature_flags/development/header_read_timeout_buffered_io.yml
deleted file mode 100644
index ba7ef4cc000..00000000000
--- a/config/feature_flags/development/header_read_timeout_buffered_io.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: header_read_timeout_buffered_io
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78065
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350233
-milestone: '14.8'
-type: development
-group: group::integrations
-default_enabled: true
diff --git a/config/feature_flags/development/import_project_from_remote_file.yml b/config/feature_flags/development/import_project_from_remote_file.yml
deleted file mode 100644
index 09f40a92ad1..00000000000
--- a/config/feature_flags/development/import_project_from_remote_file.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: import_project_from_remote_file
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59033
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/330039
-milestone: '13.12'
-type: development
-group: group::import
-default_enabled: true
diff --git a/config/feature_flags/development/improved_emoji_picker.yml b/config/feature_flags/development/improved_emoji_picker.yml
deleted file mode 100644
index c014328fad1..00000000000
--- a/config/feature_flags/development/improved_emoji_picker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: improved_emoji_picker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54469
-rollout_issue_url:
-milestone: '13.9'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/incident_escalations.yml b/config/feature_flags/development/incident_escalations.yml
index 3853a8be2de..61ae0092dc9 100644
--- a/config/feature_flags/development/incident_escalations.yml
+++ b/config/feature_flags/development/incident_escalations.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345769
milestone: '14.6'
type: development
group: group::respond
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/incident_timeline.yml b/config/feature_flags/development/incident_timeline.yml
new file mode 100644
index 00000000000..09a08b9fcb6
--- /dev/null
+++ b/config/feature_flags/development/incident_timeline.yml
@@ -0,0 +1,8 @@
+---
+name: incident_timeline
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80802
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353426
+milestone: '14.9'
+type: development
+group: group::respond
+default_enabled: false
diff --git a/config/feature_flags/development/incident_timeline_event_tab.yml b/config/feature_flags/development/incident_timeline_event_tab.yml
deleted file mode 100644
index 01dd9276007..00000000000
--- a/config/feature_flags/development/incident_timeline_event_tab.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: incident_timeline_event_tab
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80802
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353426
-milestone: '14.9'
-type: development
-group: group::respond
-default_enabled: false
diff --git a/config/feature_flags/development/incremental_repository_backup.yml b/config/feature_flags/development/incremental_repository_backup.yml
index d9eb97ba327..2b980abd403 100644
--- a/config/feature_flags/development/incremental_repository_backup.yml
+++ b/config/feature_flags/development/incremental_repository_backup.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355945
milestone: '14.9'
type: development
group: group::gitaly
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/integration_form_sections.yml b/config/feature_flags/development/integration_form_sections.yml
deleted file mode 100644
index bb03174d2fd..00000000000
--- a/config/feature_flags/development/integration_form_sections.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: integration_form_sections
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80712
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352827
-milestone: '14.9'
-type: development
-group: group::integrations
-default_enabled: true
diff --git a/config/feature_flags/development/ipynb_semantic_diff.yml b/config/feature_flags/development/ipynb_semantic_diff.yml
new file mode 100644
index 00000000000..ef16cacaa37
--- /dev/null
+++ b/config/feature_flags/development/ipynb_semantic_diff.yml
@@ -0,0 +1,8 @@
+---
+name: ipynb_semantic_diff
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85079
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358917
+milestone: '15.0'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/iteration_cadences.yml b/config/feature_flags/development/iteration_cadences.yml
deleted file mode 100644
index c90743020d6..00000000000
--- a/config/feature_flags/development/iteration_cadences.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: iteration_cadences
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54822
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354878
-milestone: '13.10'
-type: development
-group: group::project management
-default_enabled: false
diff --git a/config/feature_flags/development/jira_connect_installation_update.yml b/config/feature_flags/development/jira_connect_installation_update.yml
deleted file mode 100644
index a92a7dafc14..00000000000
--- a/config/feature_flags/development/jira_connect_installation_update.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: jira_connect_installation_update
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83038
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356083
-milestone: '14.9'
-type: development
-group: group::integrations
-default_enabled: false
diff --git a/config/feature_flags/development/jobs_table_vue_search.yml b/config/feature_flags/development/jobs_table_vue_search.yml
new file mode 100644
index 00000000000..ad0c25eccce
--- /dev/null
+++ b/config/feature_flags/development/jobs_table_vue_search.yml
@@ -0,0 +1,8 @@
+---
+name: jobs_table_vue_search
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82539
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356007
+milestone: '14.10'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/merge_service_ping_instrumented_metrics.yml b/config/feature_flags/development/merge_service_ping_instrumented_metrics.yml
deleted file mode 100644
index 4a19544bb9f..00000000000
--- a/config/feature_flags/development/merge_service_ping_instrumented_metrics.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: merge_service_ping_instrumented_metrics
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77629
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352964
-milestone: '14.8'
-type: development
-group: group::product intelligence
-default_enabled: true
diff --git a/config/feature_flags/development/mrc_api_use_raw_diffs_from_gitaly.yml b/config/feature_flags/development/mrc_api_use_raw_diffs_from_gitaly.yml
deleted file mode 100644
index a75824d3c24..00000000000
--- a/config/feature_flags/development/mrc_api_use_raw_diffs_from_gitaly.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: mrc_api_use_raw_diffs_from_gitaly
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46190
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/225322
-type: development
-group: group::code review
-default_enabled: false
-milestone: '13.6'
diff --git a/config/feature_flags/development/new_dir_modal.yml b/config/feature_flags/development/new_dir_modal.yml
deleted file mode 100644
index 12d007209b7..00000000000
--- a/config/feature_flags/development/new_dir_modal.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-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/new_header_search.yml b/config/feature_flags/development/new_header_search.yml
index 086aee4c4b0..58bd1781dae 100644
--- a/config/feature_flags/development/new_header_search.yml
+++ b/config/feature_flags/development/new_header_search.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339348
milestone: '14.3'
type: development
group: group::global search
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/new_vulnerability_form.yml b/config/feature_flags/development/new_vulnerability_form.yml
index ee812484928..8f73b18876c 100644
--- a/config/feature_flags/development/new_vulnerability_form.yml
+++ b/config/feature_flags/development/new_vulnerability_form.yml
@@ -5,4 +5,4 @@ rollout_issue_url:
milestone: '14.9'
type: development
group: group::threat insights
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/nullify_in_batches_on_user_deletion.yml b/config/feature_flags/development/nullify_in_batches_on_user_deletion.yml
new file mode 100644
index 00000000000..d97b4974f27
--- /dev/null
+++ b/config/feature_flags/development/nullify_in_batches_on_user_deletion.yml
@@ -0,0 +1,8 @@
+---
+name: 'nullify_in_batches_on_user_deletion'
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84709
+rollout_issue_url:
+milestone: '14.10'
+type: development
+group: group::optimize
+default_enabled: true
diff --git a/config/feature_flags/development/omniauth_initializer_fullhost_proc.yml b/config/feature_flags/development/omniauth_initializer_fullhost_proc.yml
new file mode 100644
index 00000000000..75ed8e642c6
--- /dev/null
+++ b/config/feature_flags/development/omniauth_initializer_fullhost_proc.yml
@@ -0,0 +1,8 @@
+---
+name: omniauth_initializer_fullhost_proc
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82401
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355579
+milestone: '14.10'
+type: development
+group: group::geo
+default_enabled: false
diff --git a/config/feature_flags/development/optimized_followed_users_queries.yml b/config/feature_flags/development/optimized_followed_users_queries.yml
new file mode 100644
index 00000000000..514c3c91829
--- /dev/null
+++ b/config/feature_flags/development/optimized_followed_users_queries.yml
@@ -0,0 +1,8 @@
+---
+name: optimized_followed_users_queries
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84856
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358649
+milestone: '14.10'
+type: development
+group: group::optimize
+default_enabled: false
diff --git a/config/feature_flags/development/pipeline_schedules_with_tags.yml b/config/feature_flags/development/pipeline_schedules_with_tags.yml
deleted file mode 100644
index 9eb7b60d300..00000000000
--- a/config/feature_flags/development/pipeline_schedules_with_tags.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pipeline_schedules_with_tags
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81476
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354421
-milestone: '14.9'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/pipeline_tabs_vue.yml b/config/feature_flags/development/pipeline_tabs_vue.yml
new file mode 100644
index 00000000000..848166d2cc1
--- /dev/null
+++ b/config/feature_flags/development/pipeline_tabs_vue.yml
@@ -0,0 +1,8 @@
+---
+name: pipeline_tabs_vue
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80401
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353118
+milestone: '14.10'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/prevent_sensitive_fields_from_serializable_hash.yml b/config/feature_flags/development/prevent_sensitive_fields_from_serializable_hash.yml
deleted file mode 100644
index 7bcbe6b79c2..00000000000
--- a/config/feature_flags/development/prevent_sensitive_fields_from_serializable_hash.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: prevent_sensitive_fields_from_serializable_hash
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81773
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353878
-milestone: '14.9'
-type: development
-group: group::sharding
-default_enabled: false
diff --git a/config/feature_flags/development/realtime_labels.yml b/config/feature_flags/development/realtime_labels.yml
new file mode 100644
index 00000000000..6072a4b044a
--- /dev/null
+++ b/config/feature_flags/development/realtime_labels.yml
@@ -0,0 +1,8 @@
+---
+name: realtime_labels
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83743
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357370
+milestone: '14.10'
+type: development
+group: group::project management
+default_enabled: false
diff --git a/config/feature_flags/development/record_projects_target_platforms.yml b/config/feature_flags/development/record_projects_target_platforms.yml
new file mode 100644
index 00000000000..6faeab3afe4
--- /dev/null
+++ b/config/feature_flags/development/record_projects_target_platforms.yml
@@ -0,0 +1,8 @@
+---
+name: record_projects_target_platforms
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80361
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354286
+milestone: '14.10'
+type: development
+group: group::activation
+default_enabled: false
diff --git a/config/feature_flags/development/refactor_blob_viewer.yml b/config/feature_flags/development/refactor_blob_viewer.yml
index 231e2684023..2c418e87a49 100644
--- a/config/feature_flags/development/refactor_blob_viewer.yml
+++ b/config/feature_flags/development/refactor_blob_viewer.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/324351
milestone: '13.11'
type: development
group: group::source code
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/releases_index_apollo_client.yml b/config/feature_flags/development/releases_index_apollo_client.yml
deleted file mode 100644
index 072d72af573..00000000000
--- a/config/feature_flags/development/releases_index_apollo_client.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: releases_index_apollo_client
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61828
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/331006
-milestone: '14.0'
-type: development
-group: group::release
-default_enabled: true
diff --git a/config/feature_flags/development/remove_import_data_on_failure.yml b/config/feature_flags/development/remove_import_data_on_failure.yml
deleted file mode 100644
index 341e027f28b..00000000000
--- a/config/feature_flags/development/remove_import_data_on_failure.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: remove_import_data_on_failure
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80074
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352156
-milestone: '14.8'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/runner_list_group_view_vue_ui.yml b/config/feature_flags/development/runner_list_group_view_vue_ui.yml
index 3bda540ba5b..542bad1b236 100644
--- a/config/feature_flags/development/runner_list_group_view_vue_ui.yml
+++ b/config/feature_flags/development/runner_list_group_view_vue_ui.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336405
milestone: '14.2'
type: development
group: group::runner
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/sbom_survey.yml b/config/feature_flags/development/sbom_survey.yml
deleted file mode 100644
index aac523ee846..00000000000
--- a/config/feature_flags/development/sbom_survey.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: sbom_survey
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76446
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/348181
-milestone: '14.6'
-type: development
-group: group::secure
-default_enabled: false
diff --git a/config/feature_flags/development/show_minute_limit_banner.yml b/config/feature_flags/development/show_minute_limit_banner.yml
new file mode 100644
index 00000000000..ecf9d98bea2
--- /dev/null
+++ b/config/feature_flags/development/show_minute_limit_banner.yml
@@ -0,0 +1,8 @@
+---
+name: show_minute_limit_banner
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84644
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358191
+milestone: '14.10'
+type: development
+group: group::workspace
+default_enabled: false
diff --git a/config/feature_flags/development/show_report_validation_warnings.yml b/config/feature_flags/development/show_report_validation_warnings.yml
deleted file mode 100644
index 551d432a928..00000000000
--- a/config/feature_flags/development/show_report_validation_warnings.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: show_report_validation_warnings
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80930
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353125
-milestone: '14.9'
-type: development
-group: group::threat insights
-default_enabled: true
diff --git a/config/feature_flags/development/spread_parallel_import.yml b/config/feature_flags/development/spread_parallel_import.yml
deleted file mode 100644
index 1e75502e032..00000000000
--- a/config/feature_flags/development/spread_parallel_import.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: spread_parallel_import
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81026
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353217
-milestone: '14.9'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/track_editor_edit_actions.yml b/config/feature_flags/development/track_editor_edit_actions.yml
deleted file mode 100644
index d73307231a2..00000000000
--- a/config/feature_flags/development/track_editor_edit_actions.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: track_editor_edit_actions
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39694
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/240928
-milestone: '13.4'
-type: development
-group: group::editor
-default_enabled: true
diff --git a/config/feature_flags/development/track_error_tracking_activity.yml b/config/feature_flags/development/track_error_tracking_activity.yml
deleted file mode 100644
index c21a8d1aede..00000000000
--- a/config/feature_flags/development/track_error_tracking_activity.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: track_error_tracking_activity
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82543
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355112
-milestone: '14.9'
-type: development
-group: group::respond
-default_enabled: false
diff --git a/config/feature_flags/development/uncached_mr_attention_requests_count.yml b/config/feature_flags/development/uncached_mr_attention_requests_count.yml
new file mode 100644
index 00000000000..239490ab1c2
--- /dev/null
+++ b/config/feature_flags/development/uncached_mr_attention_requests_count.yml
@@ -0,0 +1,8 @@
+---
+name: uncached_mr_attention_requests_count
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84145
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357480
+milestone: '14.10'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/usage_data_diff_searches.yml b/config/feature_flags/development/usage_data_diff_searches.yml
deleted file mode 100644
index 1fa0d2b934c..00000000000
--- a/config/feature_flags/development/usage_data_diff_searches.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: usage_data_diff_searches
-introduced_by_url:
-rollout_issue_url:
-milestone: '14.2'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_code_review_user_gitlab_cli_api_request.yml b/config/feature_flags/development/usage_data_i_code_review_user_gitlab_cli_api_request.yml
new file mode 100644
index 00000000000..898c19a34a9
--- /dev/null
+++ b/config/feature_flags/development/usage_data_i_code_review_user_gitlab_cli_api_request.yml
@@ -0,0 +1,8 @@
+---
+name: usage_data_i_code_review_user_gitlab_cli_api_request
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83464
+rollout_issue_url:
+milestone: '14.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/use_api_for_payment_validation.yml b/config/feature_flags/development/use_api_for_payment_validation.yml
new file mode 100644
index 00000000000..f57df08a2b0
--- /dev/null
+++ b/config/feature_flags/development/use_api_for_payment_validation.yml
@@ -0,0 +1,8 @@
+---
+name: use_api_for_payment_validation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84292
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357282
+milestone: '14.10'
+type: development
+group: group::purchase
+default_enabled: false
diff --git a/config/feature_flags/development/use_model_load_balancing.yml b/config/feature_flags/development/use_model_load_balancing.yml
deleted file mode 100644
index 630e34acff3..00000000000
--- a/config/feature_flags/development/use_model_load_balancing.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_model_load_balancing
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73631
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/344797
-milestone: '14.5'
-type: development
-group: group::sharding
-default_enabled: false
diff --git a/config/feature_flags/development/user_other_role_details.yml b/config/feature_flags/development/user_other_role_details.yml
index 47666a1d5c5..7c0b417d398 100644
--- a/config/feature_flags/development/user_other_role_details.yml
+++ b/config/feature_flags/development/user_other_role_details.yml
@@ -1,7 +1,7 @@
---
name: user_other_role_details
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45635
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/255170
+rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/282
milestone: '13.7'
type: development
group: group::conversion
diff --git a/config/feature_flags/development/users_expanding_widgets_usage_data.yml b/config/feature_flags/development/users_expanding_widgets_usage_data.yml
deleted file mode 100644
index 3b68aff5d71..00000000000
--- a/config/feature_flags/development/users_expanding_widgets_usage_data.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: users_expanding_widgets_usage_data
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57133
-rollout_issue_url:
-milestone: '13.11'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/verify_protected_tags_for_pull_mirror.yml b/config/feature_flags/development/verify_protected_tags_for_pull_mirror.yml
deleted file mode 100644
index 44da565181f..00000000000
--- a/config/feature_flags/development/verify_protected_tags_for_pull_mirror.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: verify_protected_tags_for_pull_mirror
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80388
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352494
-milestone: '14.9'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/vsa_consistency_worker.yml b/config/feature_flags/development/vsa_consistency_worker.yml
index d880f38af69..c038efeb9cd 100644
--- a/config/feature_flags/development/vsa_consistency_worker.yml
+++ b/config/feature_flags/development/vsa_consistency_worker.yml
@@ -1,8 +1,8 @@
---
name: vsa_consistency_worker
-introduced_by_url:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82591
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355709
milestone: '14.9'
type: development
group: group::optimize
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/vsa_reaggregation_worker.yml b/config/feature_flags/development/vsa_reaggregation_worker.yml
new file mode 100644
index 00000000000..d5218d6e7e3
--- /dev/null
+++ b/config/feature_flags/development/vsa_reaggregation_worker.yml
@@ -0,0 +1,8 @@
+---
+name: vsa_reaggregation_worker
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84171
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357647
+milestone: '14.10'
+type: development
+group: group::optimize
+default_enabled: false
diff --git a/config/feature_flags/development/vue_issues_list.yml b/config/feature_flags/development/vue_issues_list.yml
index bc5537c1f40..b85c75105f7 100644
--- a/config/feature_flags/development/vue_issues_list.yml
+++ b/config/feature_flags/development/vue_issues_list.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323743
milestone: '13.10'
type: development
group: group::project management
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/vulnerability_reads_table.yml b/config/feature_flags/development/vulnerability_reads_table.yml
index 68e6ffead14..0269c5330ae 100644
--- a/config/feature_flags/development/vulnerability_reads_table.yml
+++ b/config/feature_flags/development/vulnerability_reads_table.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/348151
milestone: '14.9'
type: development
group: group::threat insights
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/vulnerability_report_pagination.yml b/config/feature_flags/development/vulnerability_report_pagination.yml
index 71639f6790b..677cc1efe11 100644
--- a/config/feature_flags/development/vulnerability_report_pagination.yml
+++ b/config/feature_flags/development/vulnerability_report_pagination.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351975
milestone: '14.8'
type: development
group: group::threat insights
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/wiki_switch_between_content_editor_raw_markdown.yml b/config/feature_flags/development/wiki_switch_between_content_editor_raw_markdown.yml
deleted file mode 100644
index dbdf2d616d2..00000000000
--- a/config/feature_flags/development/wiki_switch_between_content_editor_raw_markdown.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: wiki_switch_between_content_editor_raw_markdown
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74457
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345398
-milestone: '14.6'
-type: development
-group: group::editor
-default_enabled: true
diff --git a/config/feature_flags/experiment/bypass_registration.yml b/config/feature_flags/experiment/bypass_registration.yml
deleted file mode 100644
index b3a0d634248..00000000000
--- a/config/feature_flags/experiment/bypass_registration.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: bypass_registration
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72827
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340560
-milestone: '14.5'
-type: experiment
-group: group::adoption
-default_enabled: false
diff --git a/config/feature_flags/experiment/invite_team_email.yml b/config/feature_flags/experiment/invite_team_email.yml
deleted file mode 100644
index f430b6ff88b..00000000000
--- a/config/feature_flags/experiment/invite_team_email.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: invite_team_email
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72470
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345553
-milestone: '14.5'
-type: experiment
-group: group::activation
-default_enabled: false
diff --git a/config/feature_flags/experiment/ios_specific_templates.yml b/config/feature_flags/experiment/ios_specific_templates.yml
new file mode 100644
index 00000000000..0af80e7a5bb
--- /dev/null
+++ b/config/feature_flags/experiment/ios_specific_templates.yml
@@ -0,0 +1,8 @@
+---
+name: ios_specific_templates
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84589
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356398
+milestone: "14.10"
+type: experiment
+group: group::activation
+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
deleted file mode 100644
index f47c01d26aa..00000000000
--- a/config/feature_flags/experiment/new_project_sast_enabled.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-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/experiment/pql_three_cta_test.yml b/config/feature_flags/experiment/pql_three_cta_test.yml
index 33ffcadb5c0..f65d3080c05 100644
--- a/config/feature_flags/experiment/pql_three_cta_test.yml
+++ b/config/feature_flags/experiment/pql_three_cta_test.yml
@@ -1,7 +1,7 @@
---
name: pql_three_cta_test
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74054
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/349799
milestone: '14.7'
type: experiment
group: group::conversion
diff --git a/config/feature_flags/experiment/video_tutorials_continuous_onboarding.yml b/config/feature_flags/experiment/video_tutorials_continuous_onboarding.yml
new file mode 100644
index 00000000000..6dc3f798f63
--- /dev/null
+++ b/config/feature_flags/experiment/video_tutorials_continuous_onboarding.yml
@@ -0,0 +1,8 @@
+---
+name: video_tutorials_continuous_onboarding
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82274
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351916
+milestone: '14.9'
+type: experiment
+group: group::adoption
+default_enabled: false
diff --git a/config/feature_flags/ops/api_kaminari_count_with_limit.yml b/config/feature_flags/ops/api_kaminari_count_with_limit.yml
deleted file mode 100644
index c11c6758189..00000000000
--- a/config/feature_flags/ops/api_kaminari_count_with_limit.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: api_kaminari_count_with_limit
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23931
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353077
-milestone: '11.8'
-type: ops
-group: group::integrations
-default_enabled: true
diff --git a/config/feature_flags/ops/ci_secure_files_read_only.yml b/config/feature_flags/ops/ci_secure_files_read_only.yml
new file mode 100644
index 00000000000..b0921be030c
--- /dev/null
+++ b/config/feature_flags/ops/ci_secure_files_read_only.yml
@@ -0,0 +1,8 @@
+---
+name: ci_secure_files_read_only
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84089
+rollout_issue_url:
+milestone: '14.10'
+type: ops
+group: group::incubation
+default_enabled: false \ No newline at end of file
diff --git a/config/feature_flags/ops/execute_batched_migrations_on_schedule_ci_database.yml b/config/feature_flags/ops/execute_batched_migrations_on_schedule_ci_database.yml
new file mode 100644
index 00000000000..9efbbd014a1
--- /dev/null
+++ b/config/feature_flags/ops/execute_batched_migrations_on_schedule_ci_database.yml
@@ -0,0 +1,8 @@
+---
+name: execute_batched_migrations_on_schedule_ci_database
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83109
+rollout_issue_url:
+milestone: '14.9'
+type: ops
+group: group::database
+default_enabled: false
diff --git a/config/feature_flags/ops/global_search_users_tab.yml b/config/feature_flags/ops/global_search_users_tab.yml
new file mode 100644
index 00000000000..57a07aa9e39
--- /dev/null
+++ b/config/feature_flags/ops/global_search_users_tab.yml
@@ -0,0 +1,8 @@
+---
+name: global_search_users_tab
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84186
+rollout_issue_url:
+milestone: '14.10'
+type: ops
+group: group::global search
+default_enabled: true
diff --git a/config/feature_flags/ops/purge_stale_security_findings.yml b/config/feature_flags/ops/purge_stale_security_findings.yml
index 322f31b62ce..0c011a1ddae 100644
--- a/config/feature_flags/ops/purge_stale_security_findings.yml
+++ b/config/feature_flags/ops/purge_stale_security_findings.yml
@@ -1,7 +1,7 @@
---
name: purge_stale_security_findings
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81423
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356464
milestone: '14.9'
type: ops
group: group::threat insights
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index 88af8cc12aa..57106120fb2 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -1035,6 +1035,9 @@ production: &base
# arguments, followed by optional 'args' which can be either a hash or an array.
# Documentation for this is available at http://doc.gitlab.com/ce/integration/omniauth.html
providers:
+ # - { name: 'alicloud',
+ # app_id: 'YOUR_APP_ID',
+ # app_secret: 'YOUR_APP_SECRET' }
# See omniauth-cas3 for more configuration details
# - { name: 'cas3',
# label: 'cas3',
@@ -1179,7 +1182,7 @@ production: &base
## Backup settings
backup:
path: "tmp/backups" # Relative paths are relative to Rails.root (default: tmp/backups/)
- # gitaly_backup_path: # Path of the gitaly-backup binary (default: searches $PATH)
+ # gitaly_backup_path: /home/git/gitaly/_build/bin/gitaly-backup # Path of the gitaly-backup binary (default: searches $PATH)
# archive_permissions: 0640 # Permissions for the resulting backup.tar file (default: 0600)
# keep_time: 604800 # default: 0 (forever) (in seconds)
# pg_schema: public # default: nil, it means that all schemas will be backed up
@@ -1562,6 +1565,9 @@ test:
external_providers: []
providers:
+ - { name: 'alicloud',
+ app_id: 'YOUR_APP_ID',
+ app_secret: 'YOUR_APP_SECRET' }
- { name: 'cas3',
label: 'cas3',
args: { url: 'https://sso.example.com',
diff --git a/config/gitlab_loose_foreign_keys.yml b/config/gitlab_loose_foreign_keys.yml
index 7f9539c3604..8f228120c8e 100644
--- a/config/gitlab_loose_foreign_keys.yml
+++ b/config/gitlab_loose_foreign_keys.yml
@@ -11,6 +11,9 @@ ci_builds:
- table: projects
column: project_id
on_delete: async_delete
+ - table: ci_runners
+ column: runner_id
+ on_delete: async_nullify
ci_builds_metadata:
- table: projects
column: project_id
@@ -204,10 +207,6 @@ pages_deployments:
- table: ci_builds
column: ci_build_id
on_delete: async_nullify
-project_pages_metadata:
- - table: ci_job_artifacts
- column: artifacts_archive_id
- on_delete: async_nullify
requirements_management_test_reports:
- table: ci_builds
column: build_id
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index 25d142566f0..c0dc18c60c9 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -446,6 +446,9 @@ Settings.cron_jobs['pipeline_schedule_worker']['job_class'] = 'PipelineScheduleW
Settings.cron_jobs['expire_build_artifacts_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['expire_build_artifacts_worker']['cron'] ||= '*/7 * * * *'
Settings.cron_jobs['expire_build_artifacts_worker']['job_class'] = 'ExpireBuildArtifactsWorker'
+Settings.cron_jobs['update_locked_unknown_artifacts_worker'] ||= Settingslogic.new({})
+Settings.cron_jobs['update_locked_unknown_artifacts_worker']['cron'] ||= '*/7 * * * *'
+Settings.cron_jobs['update_locked_unknown_artifacts_worker']['job_class'] = 'Ci::UpdateLockedUnknownArtifactsWorker'
Settings.cron_jobs['ci_pipelines_expire_artifacts_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['ci_pipelines_expire_artifacts_worker']['cron'] ||= '*/23 * * * *'
Settings.cron_jobs['ci_pipelines_expire_artifacts_worker']['job_class'] = 'Ci::PipelineArtifacts::ExpireArtifactsWorker'
@@ -500,6 +503,9 @@ Settings.cron_jobs['trending_projects_worker']['job_class'] = 'TrendingProjectsW
Settings.cron_jobs['remove_unreferenced_lfs_objects_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['remove_unreferenced_lfs_objects_worker']['cron'] ||= '20 0 * * *'
Settings.cron_jobs['remove_unreferenced_lfs_objects_worker']['job_class'] = 'RemoveUnreferencedLfsObjectsWorker'
+Settings.cron_jobs['bulk_imports_stuck_import_worker'] ||= Settingslogic.new({})
+Settings.cron_jobs['bulk_imports_stuck_import_worker']['cron'] ||= '0 */4 * * *'
+Settings.cron_jobs['bulk_imports_stuck_import_worker']['job_class'] = 'BulkImports::StuckImportWorker'
Settings.cron_jobs['import_stuck_project_import_jobs'] ||= Settingslogic.new({})
Settings.cron_jobs['import_stuck_project_import_jobs']['cron'] ||= '15 * * * *'
Settings.cron_jobs['import_stuck_project_import_jobs']['job_class'] = 'Gitlab::Import::StuckProjectImportJobsWorker'
@@ -634,6 +640,9 @@ Gitlab.ee do
Settings.cron_jobs['analytics_cycle_analytics_consistency_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['analytics_cycle_analytics_consistency_worker']['cron'] ||= '*/30 * * * *'
Settings.cron_jobs['analytics_cycle_analytics_consistency_worker']['job_class'] = 'Analytics::CycleAnalytics::ConsistencyWorker'
+ Settings.cron_jobs['analytics_cycle_analytics_reaggregation_worker'] ||= Settingslogic.new({})
+ Settings.cron_jobs['analytics_cycle_analytics_reaggregation_worker']['cron'] ||= '44 * * * *'
+ Settings.cron_jobs['analytics_cycle_analytics_reaggregation_worker']['job_class'] = 'Analytics::CycleAnalytics::ReaggregationWorker'
Settings.cron_jobs['active_user_count_threshold_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['active_user_count_threshold_worker']['cron'] ||= '0 12 * * *'
Settings.cron_jobs['active_user_count_threshold_worker']['job_class'] = 'ActiveUserCountThresholdWorker'
@@ -760,6 +769,12 @@ Gitlab.ee do
Settings.cron_jobs['loose_foreign_keys_cleanup_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['loose_foreign_keys_cleanup_worker']['cron'] ||= '*/1 * * * *'
Settings.cron_jobs['loose_foreign_keys_cleanup_worker']['job_class'] = 'LooseForeignKeys::CleanupWorker'
+ Settings.cron_jobs['ci_namespace_mirrors_consistency_check_worker'] ||= Settingslogic.new({})
+ Settings.cron_jobs['ci_namespace_mirrors_consistency_check_worker']['cron'] ||= '*/4 * * * *'
+ Settings.cron_jobs['ci_namespace_mirrors_consistency_check_worker']['job_class'] = 'Database::CiNamespaceMirrorsConsistencyCheckWorker'
+ Settings.cron_jobs['ci_project_mirrors_consistency_check_worker'] ||= Settingslogic.new({})
+ Settings.cron_jobs['ci_project_mirrors_consistency_check_worker']['cron'] ||= '2-58/4 * * * *'
+ Settings.cron_jobs['ci_project_mirrors_consistency_check_worker']['job_class'] = 'Database::CiProjectMirrorsConsistencyCheckWorker'
end
#
diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb
index e4d47d53815..6953de670a7 100644
--- a/config/initializers/7_prometheus_metrics.rb
+++ b/config/initializers/7_prometheus_metrics.rb
@@ -1,10 +1,9 @@
# frozen_string_literal: true
-PUMA_EXTERNAL_METRICS_SERVER = Gitlab::Utils.to_boolean(ENV['PUMA_EXTERNAL_METRICS_SERVER'])
-require Rails.root.join('metrics_server', 'metrics_server') if PUMA_EXTERNAL_METRICS_SERVER
+require Rails.root.join('metrics_server', 'metrics_server')
# Keep separate directories for separate processes
-def prometheus_default_multiproc_dir
+def metrics_temp_dir
return unless Rails.env.development? || Rails.env.test?
if Gitlab::Runtime.sidekiq?
@@ -16,20 +15,28 @@ def prometheus_default_multiproc_dir
end
end
-def puma_metrics_server_process?
+def prometheus_metrics_dir
+ ENV['prometheus_multiproc_dir'] || metrics_temp_dir
+end
+
+def puma_master?
Prometheus::PidProvider.worker_id == 'puma_master'
end
-def sidekiq_metrics_server_process?
- Gitlab::Runtime.sidekiq? && (!ENV['SIDEKIQ_WORKER_ID'] || ENV['SIDEKIQ_WORKER_ID'] == '0')
+# Whether a dedicated process should run that serves Rails application metrics, as opposed
+# to using a Rails controller.
+def puma_dedicated_metrics_server?
+ Settings.monitoring.web_exporter.enabled
end
-if puma_metrics_server_process? || sidekiq_metrics_server_process?
+if puma_master?
# The following is necessary to ensure stale Prometheus metrics don't accumulate over time.
- # It needs to be done as early as here to ensure metrics files aren't deleted.
- # After we hit our app in `warmup`, first metrics and corresponding files already being created,
- # for example in `lib/gitlab/metrics/requests_rack_middleware.rb`.
- Prometheus::CleanupMultiprocDirService.new.execute
+ # It needs to be done as early as possible to ensure new metrics aren't being deleted.
+ #
+ # Note that this should not happen for Sidekiq. Since Sidekiq workers are spawned from the
+ # sidekiq-cluster script, we perform this cleanup in `sidekiq_cluster/cli.rb` instead,
+ # since it must happen prior to any worker processes or the metrics server starting up.
+ Prometheus::CleanupMultiprocDirService.new(prometheus_metrics_dir).execute
::Prometheus::Client.reinitialize_on_pid_change(force: true)
end
@@ -37,7 +44,7 @@ end
::Prometheus::Client.configure do |config|
config.logger = Gitlab::AppLogger
- config.multiprocess_files_dir = ENV['prometheus_multiproc_dir'] || prometheus_default_multiproc_dir
+ config.multiprocess_files_dir = prometheus_metrics_dir
config.pid_provider = ::Prometheus::PidProvider.method(:worker_id)
end
@@ -75,11 +82,7 @@ Gitlab::Cluster::LifecycleEvents.on_master_start do
if Gitlab::Runtime.puma?
Gitlab::Metrics::Samplers::PumaSampler.instance.start
- if PUMA_EXTERNAL_METRICS_SERVER && Settings.monitoring.web_exporter.enabled
- MetricsServer.start_for_puma
- else
- Gitlab::Metrics::Exporter::WebExporter.instance.start
- end
+ MetricsServer.start_for_puma if puma_dedicated_metrics_server?
end
Gitlab::Ci::Parsers.instrument!
@@ -98,11 +101,7 @@ Gitlab::Cluster::LifecycleEvents.on_worker_start do
if Gitlab::Runtime.puma?
# Since we are observing a metrics server from the Puma primary, we would inherit
# this supervision thread after forking into workers, so we need to explicitly stop it here.
- if PUMA_EXTERNAL_METRICS_SERVER
- ::MetricsServer::PumaProcessSupervisor.instance.stop
- else
- Gitlab::Metrics::Exporter::WebExporter.instance.stop
- end
+ ::MetricsServer::PumaProcessSupervisor.instance.stop if puma_dedicated_metrics_server?
Gitlab::Metrics::Samplers::ActionCableSampler.instance(logger: logger).start
end
@@ -117,15 +116,11 @@ rescue IOError => e
Gitlab::Metrics.error_detected!
end
-if Gitlab::Runtime.puma?
+if Gitlab::Runtime.puma? && puma_dedicated_metrics_server?
Gitlab::Cluster::LifecycleEvents.on_before_graceful_shutdown do
# We need to ensure that before we re-exec or shutdown server
# we also stop the metrics server
- if PUMA_EXTERNAL_METRICS_SERVER
- ::MetricsServer::PumaProcessSupervisor.instance.shutdown
- else
- Gitlab::Metrics::Exporter::WebExporter.instance.stop
- end
+ ::MetricsServer::PumaProcessSupervisor.instance.shutdown
end
Gitlab::Cluster::LifecycleEvents.on_before_master_restart do
@@ -134,10 +129,6 @@ if Gitlab::Runtime.puma?
#
# We do it again, for being extra safe,
# but it should not be needed
- if PUMA_EXTERNAL_METRICS_SERVER
- ::MetricsServer::PumaProcessSupervisor.instance.shutdown
- else
- Gitlab::Metrics::Exporter::WebExporter.instance.stop
- end
+ ::MetricsServer::PumaProcessSupervisor.instance.shutdown
end
end
diff --git a/config/initializers/gitlab_experiment.rb b/config/initializers/gitlab_experiment.rb
index 9a6ef325c9e..a201a075f62 100644
--- a/config/initializers/gitlab_experiment.rb
+++ b/config/initializers/gitlab_experiment.rb
@@ -13,7 +13,7 @@ Gitlab::Experiment.configure do |config|
# Customize the logic of our default rollout, which shouldn't include
# assigning the control yet -- we specifically set it to false for now.
#
- config.default_rollout = Gitlab::Experiment::Rollout::Feature.new
+ config.default_rollout = Gitlab::Experiment::Rollout.resolve(:feature)
# Mount the engine and middleware at a gitlab friendly style path.
#
diff --git a/config/initializers/graphql.rb b/config/initializers/graphql.rb
deleted file mode 100644
index 52c26e756a5..00000000000
--- a/config/initializers/graphql.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-GraphQL::ObjectType.accepts_definitions(authorize: GraphQL::Define.assign_metadata_key(:authorize))
-
-GraphQL::Schema::Object.accepts_definition(:authorize)
diff --git a/config/initializers/load_balancing.rb b/config/initializers/load_balancing.rb
index df75178740b..290481f7296 100644
--- a/config/initializers/load_balancing.rb
+++ b/config/initializers/load_balancing.rb
@@ -2,6 +2,15 @@
Gitlab::Application.configure do |config|
config.middleware.use(Gitlab::Database::LoadBalancing::RackMiddleware)
+
+ # We need re-rerun the setup when code reloads in development
+ config.reloader.to_prepare do
+ if Rails.env.development? || Rails.env.test?
+ Gitlab::Database::LoadBalancing.base_models.each do |model|
+ Gitlab::Database::LoadBalancing::Setup.new(model).setup
+ end
+ end
+ end
end
Gitlab::Database::LoadBalancing.base_models.each do |model|
@@ -14,6 +23,12 @@ Gitlab::Database::LoadBalancing.base_models.each do |model|
# information.
Gitlab::Database::LoadBalancing::Setup.new(model).setup
+ Rails.application.reloader.to_prepare do
+ if Rails.env.development?
+ Gitlab::Database::LoadBalancing::Setup.new(model).setup
+ end
+ end
+
# 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.
diff --git a/config/initializers/multi_json.rb b/config/initializers/multi_json.rb
index 93a81d8320d..5f98ce1961f 100644
--- a/config/initializers/multi_json.rb
+++ b/config/initializers/multi_json.rb
@@ -2,4 +2,4 @@
# Explicitly set the JSON adapter used by MultiJson
# Currently we want this to default to the existing json gem
-MultiJson.use(:json_gem)
+MultiJson.use(:oj)
diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb
index 478a5828809..24040d7b076 100644
--- a/config/initializers/omniauth.rb
+++ b/config/initializers/omniauth.rb
@@ -11,7 +11,15 @@ if Gitlab::Auth::Ldap::Config.enabled?
end
end
-OmniAuth.config.full_host = Settings.gitlab['base_url']
+OmniAuth.config.full_host =
+ if Feature.feature_flags_available? && ::Feature.enabled?(:omniauth_initializer_fullhost_proc, default_enabled: :yaml)
+ Gitlab::AppLogger.debug("Using OmniAuth proc initializer")
+ Gitlab::OmniauthInitializer.full_host
+ else
+ Gitlab::AppLogger.debug("Fallback to OmniAuth static full_host")
+ Settings.gitlab['base_url']
+ end
+
OmniAuth.config.allowed_request_methods = [:post]
# In case of auto sign-in, the GET method is used (users don't get to click on a button)
OmniAuth.config.allowed_request_methods << :get if Gitlab.config.omniauth.auto_sign_in_with_provider.present?
diff --git a/config/initializers_before_autoloader/004_zeitwerk.rb b/config/initializers_before_autoloader/004_zeitwerk.rb
index 60cc57c3282..ff96a84166a 100644
--- a/config/initializers_before_autoloader/004_zeitwerk.rb
+++ b/config/initializers_before_autoloader/004_zeitwerk.rb
@@ -25,6 +25,7 @@ Rails.autoloaders.each do |autoloader|
'cidr' => 'CIDR',
'cli' => 'CLI',
'dn' => 'DN',
+ 'gitlab_cli_activity_unique_counter' => 'GitLabCliActivityUniqueCounter',
'global_id_type' => 'GlobalIDType',
'global_id_compatibility' => 'GlobalIDCompatibility',
'hll' => 'HLL',
diff --git a/config/metrics/aggregates/code_review.yml b/config/metrics/aggregates/code_review.yml
index aee0e602e7b..004f155864e 100644
--- a/config/metrics/aggregates/code_review.yml
+++ b/config/metrics/aggregates/code_review.yml
@@ -74,6 +74,7 @@
- 'i_code_review_post_merge_submit_revert_modal'
- 'i_code_review_post_merge_submit_cherry_pick_modal'
- 'i_code_review_user_jetbrains_api_request'
+ - 'i_code_review_user_gitlab_cli_api_request'
- name: code_review_category_monthly_active_users
operator: OR
source: redis
@@ -146,3 +147,4 @@
events:
- 'i_code_review_user_vs_code_api_request'
- 'i_code_review_user_jetbrains_api_request'
+ - 'i_code_review_user_gitlab_cli_api_request'
diff --git a/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml b/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml
index 350363d79ce..016cbb23d49 100644
--- a/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml
+++ b/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly
-description: Unique visitors to /admin/dev_ops_report by month
+description: Unique visitors to /admin/dev_ops_reports by month
product_section: dev
product_stage: manage
product_group: group::optimize
diff --git a/config/metrics/counts_28d/20210216175055_merge_requests.yml b/config/metrics/counts_28d/20210216175055_merge_requests.yml
index 06c46964954..c57b9e281cf 100644
--- a/config/metrics/counts_28d/20210216175055_merge_requests.yml
+++ b/config/metrics/counts_28d/20210216175055_merge_requests.yml
@@ -7,7 +7,8 @@ product_stage: create
product_group: group::code review
product_category: code_review
value_type: number
-status: active
+status: removed
+milestone_removed: '14.10'
time_frame: 28d
data_source: database
distribution:
diff --git a/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml b/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
index fe7fcb65895..9c4356db883 100644
--- a/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
+++ b/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops
-description: Total pipelines from an Auto DevOps template
+description: Distinct users that ran an auto DevOps pipeline without a .gitlab-ci.yml file.
product_section: ops
product_stage: configure
product_group: group::configure
diff --git a/config/metrics/counts_28d/20210216181057_projects_with_packages.yml b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
index 3398dacaa92..17749102974 100644
--- a/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
+++ b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: usage_activity_by_stage_monthly.package.projects_with_packages
description: The total number of projects in a given month with at least one package
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
index 05603ec14e0..b8ca7aaa5ad 100644..100755
--- a/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
@@ -167,6 +167,9 @@ options:
- p_ci_templates_implicit_security_cluster_image_scanning
- p_ci_templates_kaniko
- p_ci_templates_qualys_iac_security
+ - p_ci_templates_liquibase
+ - p_ci_templates_matlab
+ - p_ci_templates_themekit
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20220307150912_p_ci_templates_database_liquibase_monthly.yml b/config/metrics/counts_28d/20220307150912_p_ci_templates_database_liquibase_monthly.yml
new file mode 100644
index 00000000000..214c6504051
--- /dev/null
+++ b/config/metrics/counts_28d/20220307150912_p_ci_templates_database_liquibase_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_liquibase_monthly
+description: ""
+product_section: ""
+product_stage: ""
+product_group: ""
+product_category:
+value_type: number
+status: active
+milestone: "14.9"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81817
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_liquibase
diff --git a/config/metrics/counts_28d/20220310184327_p_ci_templates_matlab_monthly.yml b/config/metrics/counts_28d/20220310184327_p_ci_templates_matlab_monthly.yml
new file mode 100644
index 00000000000..bd61f9ddc57
--- /dev/null
+++ b/config/metrics/counts_28d/20220310184327_p_ci_templates_matlab_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_matlab_monthly
+description: ""
+product_section: ""
+product_stage: ""
+product_group: ""
+product_category: ""
+value_type: number
+status: active
+milestone: "14.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82914
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_matlab
diff --git a/config/metrics/counts_28d/20220322194931_users_gitlab_cli_api_request_monthly.yml b/config/metrics/counts_28d/20220322194931_users_gitlab_cli_api_request_monthly.yml
new file mode 100644
index 00000000000..2d534efba1c
--- /dev/null
+++ b/config/metrics/counts_28d/20220322194931_users_gitlab_cli_api_request_monthly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_gitlab_cli_api_request_monthly
+description: Count of unique users per month who use the GitLab CLI
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: editor_extension
+value_type: number
+status: active
+milestone: "14.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83464
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - i_code_review_user_gitlab_cli_api_request
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20220407125907_p_ci_templates_themekit_monthly.yml b/config/metrics/counts_28d/20220407125907_p_ci_templates_themekit_monthly.yml
new file mode 100644
index 00000000000..1ee10431b4d
--- /dev/null
+++ b/config/metrics/counts_28d/20220407125907_p_ci_templates_themekit_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_themekit_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: active
+milestone: "14.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52279
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - p_ci_templates_themekit
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml
index 290ceb5754a..b0cca62db12 100644..100755
--- a/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml
@@ -167,6 +167,9 @@ options:
- p_ci_templates_implicit_security_cluster_image_scanning
- p_ci_templates_kaniko
- p_ci_templates_qualys_iac_security
+ - p_ci_templates_liquibase
+ - p_ci_templates_matlab
+ - p_ci_templates_themekit
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml b/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
index d465e1b3d03..27e0505c2cd 100644
--- a/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
@@ -7,8 +7,9 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
milestone: "14.3"
+milestone_removed: "14.4"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70496
time_frame: 7d
data_source: database
diff --git a/config/metrics/counts_7d/20220307150854_p_ci_templates_database_liquibase_weekly.yml b/config/metrics/counts_7d/20220307150854_p_ci_templates_database_liquibase_weekly.yml
new file mode 100644
index 00000000000..c47c1fb51d5
--- /dev/null
+++ b/config/metrics/counts_7d/20220307150854_p_ci_templates_database_liquibase_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_liquibase_weekly
+description: ""
+product_section: ""
+product_stage: ""
+product_group: ""
+product_category: ""
+value_type: number
+status: active
+milestone: "14.9"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81817
+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_liquibase
diff --git a/config/metrics/counts_7d/20220310184320_p_ci_templates_matlab_weekly.yml b/config/metrics/counts_7d/20220310184320_p_ci_templates_matlab_weekly.yml
new file mode 100644
index 00000000000..0642003f672
--- /dev/null
+++ b/config/metrics/counts_7d/20220310184320_p_ci_templates_matlab_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_matlab_weekly
+description: ""
+product_section: ""
+product_stage: ""
+product_group: ""
+product_category: ""
+value_type: number
+status: active
+milestone: "14.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82914
+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_matlab
diff --git a/config/metrics/counts_7d/20220322194922_users_gitlab_cli_api_request_weekly.yml b/config/metrics/counts_7d/20220322194922_users_gitlab_cli_api_request_weekly.yml
new file mode 100644
index 00000000000..333e84873b4
--- /dev/null
+++ b/config/metrics/counts_7d/20220322194922_users_gitlab_cli_api_request_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.code_review.i_code_review_user_gitlab_cli_api_request_weekly
+description: Count of unique users per week who use the GitLab CLI
+product_section: dev
+product_stage: create
+product_group: group::code review
+product_category: editor_extension
+value_type: number
+status: active
+milestone: "14.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83464
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - i_code_review_user_gitlab_cli_api_request
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20220407125901_p_ci_templates_themekit_weekly.yml b/config/metrics/counts_7d/20220407125901_p_ci_templates_themekit_weekly.yml
new file mode 100644
index 00000000000..e464f1ee198
--- /dev/null
+++ b/config/metrics/counts_7d/20220407125901_p_ci_templates_themekit_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_themekit_weekly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: active
+milestone: "14.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52279
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - p_ci_templates_themekit
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216175045_merge_requests.yml b/config/metrics/counts_all/20210216175045_merge_requests.yml
index 179a6258a15..2871c70abaa 100644
--- a/config/metrics/counts_all/20210216175045_merge_requests.yml
+++ b/config/metrics/counts_all/20210216175045_merge_requests.yml
@@ -7,7 +7,8 @@ product_stage: create
product_group: group::code review
product_category: code_review
value_type: number
-status: active
+status: removed
+milestone_removed: '14.10'
time_frame: all
data_source: database
distribution:
diff --git a/config/routes.rb b/config/routes.rb
index 9342de492ec..41f06a412a3 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -32,7 +32,7 @@ Rails.application.routes.draw do
# This prefixless path is required because Jira gets confused if we set it up with a path
# More information: https://gitlab.com/gitlab-org/gitlab/issues/6752
- scope path: '/login/oauth', controller: 'oauth/jira/authorizations', as: :oauth_jira do
+ scope path: '/login/oauth', controller: 'oauth/jira_dvcs/authorizations', as: :oauth_jira_dvcs do
get :authorize, action: :new
get :callback
post :access_token
@@ -66,6 +66,7 @@ Rails.application.routes.draw do
end
Gitlab.ee do
+ resource :company, only: [:new, :create], controller: 'company'
resources :groups, only: [:new, :create]
resources :projects, only: [:new, :create]
resources :groups_projects, only: [:new, :create] do
@@ -236,6 +237,7 @@ Rails.application.routes.draw do
resources :clusters, only: [:index, :new, :show, :update, :destroy] do
collection do
get :connect
+ get :new_cluster_docs
post :create_user
post :create_gcp
post :create_aws
@@ -323,7 +325,7 @@ Rails.application.routes.draw do
root to: "root#index"
- get '*unmatched_route', to: 'application#route_not_found'
+ get '*unmatched_route', to: 'application#route_not_found', format: false
end
Gitlab::Routing.add_helpers(TimeboxesRoutingHelper)
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 6b786fc82b3..d066dd2fb35 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -105,7 +105,8 @@ namespace :admin do
resources :projects, only: [:index]
resources :usage_trends, only: :index
- resource :dev_ops_report, controller: 'dev_ops_report', only: :show
+ resource :dev_ops_reports, controller: 'dev_ops_report', only: :show
+ get 'dev_ops_report', to: redirect('admin/dev_ops_reports')
resources :cohorts, only: :index
scope(path: 'projects/*namespace_id',
diff --git a/config/routes/group.rb b/config/routes/group.rb
index fecd3135cba..bf6094ff2f1 100644
--- a/config/routes/group.rb
+++ b/config/routes/group.rb
@@ -99,7 +99,7 @@ constraints(::Constraints::GroupUrlConstrainer.new) do
delete :leave, on: :collection
end
- resources :group_links, only: [:create, :update, :destroy], constraints: { id: /\d+|:id/ }
+ resources :group_links, only: [:update, :destroy], constraints: { id: /\d+|:id/ }
resources :uploads, only: [:create] do
collection do
@@ -135,7 +135,7 @@ constraints(::Constraints::GroupUrlConstrainer.new) do
namespace :crm do
resources :contacts, only: [:index, :new, :edit]
- resources :organizations, only: [:index, :new]
+ resources :organizations, only: [:index, :new, :edit]
end
end
diff --git a/config/routes/import.rb b/config/routes/import.rb
index 9c76c4435ff..228c5776197 100644
--- a/config/routes/import.rb
+++ b/config/routes/import.rb
@@ -10,6 +10,8 @@ Devise.omniauth_providers.map(&:downcase).each do |provider|
end
namespace :import do
+ resources :history, only: [:index], controller: :history
+
resources :available_namespaces, only: [:index], controller: :available_namespaces
namespace :url do
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 1783f3acc68..a3f6139a6ef 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -247,7 +247,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
resources :starrers, only: [:index]
resources :forks, only: [:index, :new, :create]
- resources :group_links, only: [:create, :update, :destroy], constraints: { id: /\d+|:id/ }
+ resources :group_links, only: [:update, :destroy], constraints: { id: /\d+|:id/ }
resource :import, only: [:new, :create, :show]
resource :avatar, only: [:show, :destroy]
diff --git a/config/routes/uploads.rb b/config/routes/uploads.rb
index e2cdf8ba606..a72730c1214 100644
--- a/config/routes/uploads.rb
+++ b/config/routes/uploads.rb
@@ -38,6 +38,12 @@ scope path: :uploads do
post ':model/authorize',
to: 'uploads#authorize',
constraints: { model: /personal_snippet|user/ }
+
+ # Alert Metric Images
+ get "-/system/:model/:mounted_as/:id/:filename",
+ to: "uploads#show",
+ constraints: { model: /alert_management_metric_image/, mounted_as: /file/, filename: %r{[^/]+} },
+ as: 'alert_metric_image_upload'
end
# Redirect old note attachments path to new uploads path.
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index a0f1ea4fa06..7ec142344ee 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -281,8 +281,6 @@
- 1
- - namespaceless_project_destroy
- 1
-- - namespaces_invite_team_email
- - 1
- - namespaces_onboarding_issue_created
- 1
- - namespaces_onboarding_pipeline_created
@@ -363,6 +361,8 @@
- 1
- - projects_process_sync_events
- 1
+- - projects_record_target_platforms
+ - 1
- - projects_refresh_build_artifacts_size_statistics
- 1
- - projects_schedule_bulk_repository_shard_moves
@@ -415,6 +415,8 @@
- 1
- - security_findings_delete_by_job_id
- 1
+- - security_orchestration_policy_rule_schedule_namespace
+ - 1
- - security_scans
- 2
- - self_monitoring_project_create
diff --git a/config/webpack.config.js b/config/webpack.config.js
index 360c5be05d4..aff906353f6 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -326,7 +326,7 @@ module.exports = {
],
},
{
- test: /\.(worker(\.min)?\.js|pdf|bmpr)$/,
+ test: /\.(worker(\.min)?\.js|pdf)$/,
exclude: /node_modules/,
loader: 'file-loader',
options: {
@@ -702,7 +702,10 @@ module.exports = {
const incrementalCompilerMiddleware = incrementalCompiler.createMiddleware(devServer);
if (incrementalCompilerMiddleware) {
- middlewares.unshift(incrementalCompilerMiddleware);
+ middlewares.unshift({
+ name: 'incremental-compiler',
+ middleware: incrementalCompilerMiddleware,
+ });
}
return middlewares;
@@ -735,7 +738,7 @@ module.exports = {
devtool: NO_SOURCEMAPS ? false : devtool,
node: {
- fs: 'empty', // sqljs requires fs
+ fs: 'empty', // editorconfig requires 'fs'
setImmediate: false,
},
};
diff --git a/config/webpack.vendor.config.js b/config/webpack.vendor.config.js
index 30d60c0b5e6..ff38497a05e 100644
--- a/config/webpack.vendor.config.js
+++ b/config/webpack.vendor.config.js
@@ -28,7 +28,6 @@ module.exports = {
'jquery/dist/jquery.slim.js',
'pdfjs-dist/build/pdf',
'pdfjs-dist/build/pdf.worker.min',
- 'sql.js',
'core-js',
'echarts',
'lodash',
diff --git a/danger/Dangerfile-bundle_size b/danger/Dangerfile-bundle_size
new file mode 100644
index 00000000000..23ab726096e
--- /dev/null
+++ b/danger/Dangerfile-bundle_size
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+# This file isn't named "Dangerfile" so that it's not imported by default since it's only meant to be run in the `bundle-size-review` job.
+
+analysis_result = "./bundle-size-review/analysis.json"
+markdown_result = "./bundle-size-review/comparison.md"
+
+# Executing the webpack-entry-point-analyser
+# We would like to do that in the CI file directly,
+# but unfortunately the head_commit SHA is not available
+# as a CI variable due to our merge into master simulation
+analyze_cmd = [
+ "webpack-entry-point-analyser",
+ "--from-file ./webpack-report/stats.json",
+ "--json #{analysis_result}",
+ " --sha #{gitlab&.head_commit}"
+].join(" ")
+
+# execute analysis
+`#{analyze_cmd}`
+
+# We are executing the comparison by comparing the start_sha
+# to the current pipeline result. The start_sha is the commit
+# from master that was merged into for the merged pipeline.
+comparison_cmd = [
+ "webpack-compare-reports",
+ "--job #{ENV["CI_JOB_ID"]}",
+ "--to-file #{analysis_result}",
+ "--html ./bundle-size-review/comparison.html",
+ "--markdown #{markdown_result}"
+].join(" ")
+
+# execute comparison
+`#{comparison_cmd}`
+
+comment = `cat #{markdown_result}`
+
+unless comment.strip.empty?
+ markdown(<<~MARKDOWN)
+ #{comment}
+ MARKDOWN
+end
diff --git a/danger/bundle_size/Dangerfile b/danger/bundle_size/Dangerfile
deleted file mode 100644
index b824edb5dab..00000000000
--- a/danger/bundle_size/Dangerfile
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-analysis_result = "./bundle-size-review/analysis.json"
-markdown_result = "./bundle-size-review/comparison.md"
-
-# Executing the webpack-entry-point-analyser
-# We would like to do that in the CI file directly,
-# but unfortunately the head_commit SHA is not available
-# as a CI variable due to our merge into master simulation
-analyze_cmd = [
- "webpack-entry-point-analyser",
- "--from-file ./webpack-report/stats.json",
- "--json #{analysis_result}",
- " --sha #{gitlab&.head_commit}"
-].join(" ")
-
-# execute analysis
-`#{analyze_cmd}`
-
-# We are executing the comparison by comparing the start_sha
-# to the current pipeline result. The start_sha is the commit
-# from master that was merged into for the merged pipeline.
-comparison_cmd = [
- "webpack-compare-reports",
- "--job #{ENV["CI_JOB_ID"]}",
- "--to-file #{analysis_result}",
- "--html ./bundle-size-review/comparison.html",
- "--markdown #{markdown_result}"
-].join(" ")
-
-# execute comparison
-`#{comparison_cmd}`
-
-comment = `cat #{markdown_result}`
-
-unless comment.strip.empty?
- markdown(<<~MARKDOWN)
- #{comment}
- MARKDOWN
-end
diff --git a/danger/ci_templates/Dangerfile b/danger/ci_templates/Dangerfile
index 3d57436ef94..ace9905e91d 100644
--- a/danger/ci_templates/Dangerfile
+++ b/danger/ci_templates/Dangerfile
@@ -19,7 +19,7 @@ return unless helper.ci?
template_paths_to_review = helper.changes_by_category[:ci_template]
-if gitlab.mr_labels.include?('ci::templates') || template_paths_to_review.any?
+if helper.mr_labels.include?('ci::templates') || template_paths_to_review.any?
message 'This merge request adds or changes files that require a ' \
'review from the CI/CD Templates maintainers.'
diff --git a/danger/database/Dangerfile b/danger/database/Dangerfile
index 0128f0fa195..f94184263ad 100644
--- a/danger/database/Dangerfile
+++ b/danger/database/Dangerfile
@@ -49,11 +49,11 @@ if geo_migration_created && !geo_db_schema_updated
end
return unless helper.ci?
-return if gitlab.mr_labels.include?(DATABASE_APPROVED_LABEL)
+return if helper.mr_labels.include?(DATABASE_APPROVED_LABEL)
db_paths_to_review = helper.changes_by_category[:database]
-if gitlab.mr_labels.include?('database') || db_paths_to_review.any?
+if helper.mr_labels.include?('database') || db_paths_to_review.any?
message 'This merge request adds or changes files that require a ' \
'review from the [Database team](https://gitlab.com/groups/gl-database/-/group_members).'
diff --git a/danger/feature_flag/Dangerfile b/danger/feature_flag/Dangerfile
index 5fe9d42a7a1..d5b907377aa 100644
--- a/danger/feature_flag/Dangerfile
+++ b/danger/feature_flag/Dangerfile
@@ -22,21 +22,21 @@ def check_feature_flag_yaml(feature_flag)
end
rescue Psych::Exception
# YAML could not be parsed, fail the build.
- fail "#{gitlab.html_link(feature_flag.path)} isn't valid YAML! #{SEE_DOC}"
+ fail "#{helper.html_link(feature_flag.path)} isn't valid YAML! #{SEE_DOC}"
rescue StandardError => e
warn "There was a problem trying to check the Feature Flag file. Exception: #{e.class.name} - #{e.message}"
end
def message_for_feature_flag_missing_group!(feature_flag:, mr_group_label:)
if mr_group_label.nil?
- warn "Consider setting `group` in #{gitlab.html_link(feature_flag.path)}. #{SEE_DOC}"
+ warn "Consider setting `group` in #{helper.html_link(feature_flag.path)}. #{SEE_DOC}"
else
mr_line = feature_flag.raw.lines.find_index("group:\n")
if mr_line
markdown(format(SUGGEST_MR_COMMENT, group: mr_group_label), file: feature_flag.path, line: mr_line.succ)
else
- warn %(Consider setting `group: "#{mr_group_label}"` in #{gitlab.html_link(feature_flag.path)}. #{SEE_DOC})
+ warn %(Consider setting `group: "#{mr_group_label}"` in #{helper.html_link(feature_flag.path)}. #{SEE_DOC})
end
end
end
@@ -60,7 +60,7 @@ def message_for_feature_flag_with_group!(feature_flag:, mr_group_label:)
if mr_group_label.nil?
helper.labels_to_add << feature_flag.group
else
- fail %(`group` is set to ~"#{feature_flag.group}" in #{gitlab.html_link(feature_flag.path)}, which does not match ~"#{mr_group_label}" set on the MR!)
+ fail %(`group` is set to ~"#{feature_flag.group}" in #{helper.html_link(feature_flag.path)}, which does not match ~"#{mr_group_label}" set on the MR!)
end
end
diff --git a/danger/product_intelligence/Dangerfile b/danger/product_intelligence/Dangerfile
index 8f782e3de65..c38d87604cc 100644
--- a/danger/product_intelligence/Dangerfile
+++ b/danger/product_intelligence/Dangerfile
@@ -1,22 +1,3 @@
# frozen_string_literal: true
-# rubocop:disable Style/SignalException
-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 or if no product intelligence labels
-product_intelligence_paths_to_review = helper.changes_by_category[:product_intelligence]
-labels_to_add = product_intelligence.missing_labels
-
-return if product_intelligence_paths_to_review.empty? || product_intelligence.skip_review?
-
-warn format(CHANGED_FILES_MESSAGE, changed_files: helper.markdown_list(product_intelligence_paths_to_review)) unless product_intelligence.has_approved_label?
-
-helper.labels_to_add.concat(labels_to_add) unless labels_to_add.empty?
+product_intelligence.check!
diff --git a/danger/specialization_labels/Dangerfile b/danger/specialization_labels/Dangerfile
index f161c470f36..615ceb8625d 100644
--- a/danger/specialization_labels/Dangerfile
+++ b/danger/specialization_labels/Dangerfile
@@ -16,11 +16,11 @@ SPECIALIZATIONS = {
labels_to_add = helper.changes_by_category.each_with_object([]) do |(category, _changes), memo|
label = SPECIALIZATIONS[category]
next unless label
- next if gitlab.mr_labels.include?(label)
+ next if helper.mr_labels.include?(label)
# Don't override already-set scoped labels.
label_scope = label.split('::')[0...-1].join('::')
- next if !label_scope.empty? && gitlab.mr_labels.any? { |mr_label| mr_label.start_with?(label_scope) }
+ next if !label_scope.empty? && helper.has_scoped_label_with_scope?(label_scope)
memo << label
end
diff --git a/danger/specs/Dangerfile b/danger/specs/Dangerfile
index 8ef046f7bc1..dc9809b20b5 100644
--- a/danger/specs/Dangerfile
+++ b/danger/specs/Dangerfile
@@ -37,7 +37,7 @@ has_ee_app_changes = all_changed_files.grep(%r{\Aee/(app|lib|db/(geo/)?(post_)?m
spec_changes = specs.changed_specs_files(ee: :exclude)
has_spec_changes = spec_changes.any?
has_ee_spec_changes = specs.changed_specs_files(ee: :only).any?
-new_specs_needed = (gitlab.mr_labels & NO_SPECS_LABELS).empty?
+new_specs_needed = (helper.mr_labels & NO_SPECS_LABELS).empty?
if (has_app_changes || has_ee_app_changes) && !(has_spec_changes || has_ee_spec_changes) && new_specs_needed
warn format(NO_NEW_SPEC_MESSAGE, labels: helper.labels_list(NO_SPECS_LABELS)), sticky: false
diff --git a/danger/z_metadata/Dangerfile b/danger/z_metadata/Dangerfile
index 546fdc8de5f..9140bb7d988 100644
--- a/danger/z_metadata/Dangerfile
+++ b/danger/z_metadata/Dangerfile
@@ -2,7 +2,7 @@
# rubocop:disable Style/SignalException
-DEFAULT_BRANCH = 'master'
+default_branch = ENV['CI_DEFAULT_BRANCH'] || 'main'
if gitlab.mr_body.size < 5
fail "Please provide a proper merge request description."
@@ -14,12 +14,12 @@ end
has_milestone = !gitlab.mr_json["milestone"].nil?
-unless has_milestone || (helper.security_mr? && gitlab.branch_for_base == DEFAULT_BRANCH)
+unless has_milestone || (helper.security_mr? && helper.mr_target_branch == default_branch)
warn "This merge request does not refer to an existing milestone.", sticky: false
end
-has_pick_into_stable_label = gitlab.mr_labels.find { |label| label.start_with?('Pick into') }
+has_pick_into_stable_label = helper.mr_labels.find { |label| label.start_with?('Pick into') }
-if gitlab.branch_for_base != DEFAULT_BRANCH && !has_pick_into_stable_label && !helper.security_mr?
- warn "Most of the time, merge requests should target `#{DEFAULT_BRANCH}`. Otherwise, please set the relevant `Pick into X.Y` label."
+if helper.mr_target_branch != default_branch && !has_pick_into_stable_label && !helper.security_mr?
+ warn "Most of the time, merge requests should target `#{default_branch}`. Otherwise, please set the relevant `Pick into X.Y` label."
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
index 9e02524b022..28e58a0c60d 100644
--- a/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
+++ b/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
@@ -1,11 +1,11 @@
- name: "NFS for Git repository storage" # The name of the feature to be deprecated
announcement_milestone: "14.0" # The milestone when this feature was first announced as deprecated.
announcement_date: "2021-06-22" # The date of the milestone release when this feature was first announced as deprecated
- removal_milestone: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # (optional - may be required in the future) YYYY-MM-DD format - the date of the milestone release when this feature is planned to be removed
- breaking_change: true
+ removal_milestone: "15.6" # The milestone when this feature is planned to be removed
+ removal_date: "2022-11-22" # (optional - may be required in the future) YYYY-MM-DD format - the date of the milestone release when this feature is planned to be removed
+ breaking_change: false
body: | # Do not modify this line, instead modify the lines below.
- With the general availability of Gitaly Cluster ([introduced in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/)), we have deprecated development (bugfixes, performance improvements, etc) for NFS for Git repository storage in GitLab 14.0. We will continue to provide technical support for NFS for Git repositories throughout 14.x, but we will remove all support for NFS 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.
+ With the general availability of Gitaly Cluster ([introduced in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/)), we have deprecated development (bugfixes, performance improvements, etc) for NFS for Git repository storage in GitLab 14.0. We will continue to provide technical support for NFS for Git repositories throughout 14.x, but we will remove all support for NFS on November 22, 2022. This was originally planned for May 22, 2022, but in an effort to allow continued maturity of Gitaly Cluster, we have chosen to extend our deprecation of support date. Please see our official [Statement of Support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for further information.
Gitaly Cluster offers tremendous benefits for our customers such as:
@@ -15,7 +15,8 @@
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
+ reporter: mjwood
+ stage: create # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
issue_url: # (optional) This is a link to the deprecation issue in GitLab
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-10-deprecate-toggle-notes-confidentiality.yml b/data/deprecations/14-10-deprecate-toggle-notes-confidentiality.yml
new file mode 100644
index 00000000000..e5646f5123d
--- /dev/null
+++ b/data/deprecations/14-10-deprecate-toggle-notes-confidentiality.yml
@@ -0,0 +1,9 @@
+- name: "Toggle notes confidentiality on APIs"
+ announcement_milestone: "14.10" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2022-03-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "16.0" # The milestone when this feature is planned to be removed
+ removal_date: "2023-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ breaking_change: true # If this deprecation is a breaking change, set this value to true
+ body: | # Do not modify this line, instead modify the lines below.
+ Toggling notes confidentiality with REST and GraphQL APIs is being deprecated. Updating notes confidential attribute is no longer supported by any means. We are changing this to simplify the experience and prevent private information from being unintentionally exposed.
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350670
diff --git a/data/deprecations/14-10-manual-iteration-management.yml b/data/deprecations/14-10-manual-iteration-management.yml
new file mode 100644
index 00000000000..f677f4fe668
--- /dev/null
+++ b/data/deprecations/14-10-manual-iteration-management.yml
@@ -0,0 +1,34 @@
+- name: "Manual iteration management" # The name of the feature to be deprecated
+ announcement_milestone: "14.10" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2022-04-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "16.0" # The milestone when this feature is planned to be removed
+ removal_date: "2023-04-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ breaking_change: true # If this deprecation is a breaking change, set this value to true
+ reporter: mcelicalderonG # GitLab username of the person reporting the deprecation
+ body: | # Do not modify this line, instead modify the lines below.
+ Manual iteration management is deprecated and only automatic iteration cadences will be supported in the future.
+
+ Creating and deleting iterations will be fully removed in 16.0. Updating all iteration fields except for
+ `description` will also be removed.
+
+ On the GraphQL API the following mutations will be removed:
+
+ 1. `iterationCreate`
+ 1. `iterationDelete`
+
+ The update `updateIteration` mutation will only allow updating the iteration's `description`. The following
+ arguments will be removed:
+
+ 1. `title`
+ 1. `dueDate`
+ 1. `startDate`
+
+ For more information about iteration cadences, you can refer to
+ [the documentation of the feature](https://docs.gitlab.com/ee/user/group/iterations/#iteration-cadences).
+# The following items are not published on the docs page, but may be used in the future.
+ stage: Plan
+ tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356069
+ documentation_url: # (optional) This is a link to the current documentation page
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/deprecations/14-10-old-search-migration-removal.yml b/data/deprecations/14-10-old-search-migration-removal.yml
new file mode 100644
index 00000000000..d7036150059
--- /dev/null
+++ b/data/deprecations/14-10-old-search-migration-removal.yml
@@ -0,0 +1,12 @@
+- name: "Outdated indices of Advanced Search migrations"
+ announcement_milestone: "14.10"
+ announcement_date: "2021-04-22"
+ removal_milestone: "15.0"
+ removal_date: "2021-05-22"
+ breaking_change: true
+ body: |
+ As Advanced Search migrations usually require support multiple code paths for a long period of time, it’s important to clean those up when we safely can. We use GitLab major version upgrades as a safe time to remove backward compatibility for indices that have not been fully migrated. See the [upgrade documentation](https://docs.gitlab.com/ee/update/index.html#upgrading-to-a-new-major-version) for details.
+ stage: enablement
+ tiers: premium, ultimate
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/359133
+ documentation_url: https://docs.gitlab.com/ee/development/elasticsearch.html#deleting-advanced-search-migrations-in-a-major-version-upgrade
diff --git a/data/deprecations/14-5-runner-api-status-does-contain-paused.yml b/data/deprecations/14-5-runner-api-status-does-contain-paused.yml
index 46f1ef89b53..5acfac45ca2 100644
--- a/data/deprecations/14-5-runner-api-status-does-contain-paused.yml
+++ b/data/deprecations/14-5-runner-api-status-does-contain-paused.yml
@@ -1,11 +1,11 @@
- name: "REST and GraphQL API Runner status will not return `paused`"
announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
announcement_date: "2021-11-22"
- removal_milestone: "15.0" # the milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
+ removal_milestone: "16.0" # the milestone when this feature is planned to be removed
+ removal_date: "2023-04-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
- The GitLab Runner REST and GraphQL API endpoints will not return `paused` or `active` as a status in GitLab 15.0.
+ The GitLab Runner REST and GraphQL API endpoints will not return `paused` or `active` as a status in GitLab 16.0.
A runner's status will only relate to runner contact status, such as:
`online`, `offline`, or `not_connected`. Status `paused` or `active` will no longer appear.
diff --git a/data/deprecations/14-8-ci-build-variables.yml b/data/deprecations/14-8-ci-build-variables.yml
index 52c7ecf6c52..a87c6a2fa17 100644
--- a/data/deprecations/14-8-ci-build-variables.yml
+++ b/data/deprecations/14-8-ci-build-variables.yml
@@ -1,12 +1,27 @@
- name: "`CI_BUILD_*` predefined variables"
announcement_milestone: "14.8"
announcement_date: "2021-02-22"
- removal_milestone: "15.0"
- removal_date: "2022-05-22"
+ removal_milestone: "16.0"
+ removal_date: "2023-04-22"
breaking_change: true
reporter: dhershkovitch
body: |
- The predefined CI/CD variables that start with `CI_BUILD_*` were deprecated in GitLab 9.0, and will be removed in GitLab 15.0. If you still use these variables, be sure to change to the current [`CI_JOB_*` predefined variables](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) which are identical (except for the updated name).
+ The predefined CI/CD variables that start with `CI_BUILD_*` were deprecated in GitLab 9.0, and will be removed in GitLab 16.0. If you still use these variables, be sure to change to the replacement [predefined variables](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) which are functionally identical:
+
+ | Removed variable | Replacement variable |
+ | --------------------- |------------------------ |
+ | `CI_BUILD_BEFORE_SHA` | `CI_COMMIT_BEFORE_SHA` |
+ | `CI_BUILD_ID` | `CI_JOB_ID` |
+ | `CI_BUILD_MANUAL` | `CI_JOB_MANUAL` |
+ | `CI_BUILD_NAME` | `CI_JOB_NAME` |
+ | `CI_BUILD_REF` | `CI_COMMIT_SHA` |
+ | `CI_BUILD_REF_NAME` | `CI_COMMIT_REF_NAME` |
+ | `CI_BUILD_REF_SLUG` | `CI_COMMIT_REF_SLUG` |
+ | `CI_BUILD_REPO` | `CI_REPOSITORY_URL` |
+ | `CI_BUILD_STAGE` | `CI_JOB_STAGE` |
+ | `CI_BUILD_TAG` | `CI_COMMIT_TAG` |
+ | `CI_BUILD_TOKEN` | `CI_JOB_TOKEN` |
+ | `CI_BUILD_TRIGGERED` | `CI_PIPELINE_TRIGGERED` |
# The following items are not published on the docs page, but may be used in the future.
stage: Verify
tiers: [Free, Premium, Ultimate]
diff --git a/data/deprecations/14-8-compliance-status-check-api-field.yml b/data/deprecations/14-8-compliance-status-check-api-field.yml
index 5ad653c8fce..b98dab9e905 100644
--- a/data/deprecations/14-8-compliance-status-check-api-field.yml
+++ b/data/deprecations/14-8-compliance-status-check-api-field.yml
@@ -14,12 +14,12 @@
- Requests that have the `status` field set to `approved`.
Beginning in GitLab 15.0, status checks will only be updated to a passing state if the `status` field is both present
- and set to `pass`. Requests that:
+ and set to `passed`. Requests that:
- Do not contain the `status` field will be rejected with a `422` error. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338827).
- - Contain any value other than `pass` will cause the status check to fail. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/339039).
+ - Contain any value other than `passed` will cause the status check to fail. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/339039).
- To align with this change, API calls to list external status checks will also return the value of `pass` rather than
+ To align with this change, API calls to list external status checks will also return the value of `passed` rather than
`approved` for status checks that have passed.
# The following items are not published on the docs page, but may be used in the future.
stage: "Manage"
diff --git a/data/deprecations/14-8-nfs_support.yml b/data/deprecations/14-8-nfs_support.yml
deleted file mode 100644
index 534975b0642..00000000000
--- a/data/deprecations/14-8-nfs_support.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-- name: "Reminder: support for NFS repository storage" # The name of the feature to be deprecated
- announcement_milestone: "14.8" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-02-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
- removal_milestone: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
- breaking_change: true # If this deprecation is a breaking change, set this value to true
- reporter: mjwood # GitLab username of the person reporting the deprecation
- body: | # Do not modify this line, instead modify the lines below.
- As [announced](https://about.gitlab.com/releases/2021/06/22/gitlab-14-0-released/#nfs-for-git-repository-storage-deprecated) at the
- release of GitLab 14.0, technical support for NFS storage for Git repositories is being removed. Please see our official
- [Statement of Support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for additional information.
-
- 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/#migrating-to-gitaly-cluster).
-
- Gitaly Cluster offers tremendous benefits for our customers such as:
-
- - [Variable replication factors](https://docs.gitlab.com/ee/administration/gitaly/praefect.html#configure-replication-factor)
- - [Strong consistency](https://docs.gitlab.com/ee/administration/gitaly/#strong-consistency)
- - [Distributed read capabilities](https://docs.gitlab.com/ee/administration/gitaly/#distributed-reads)
-
-# The following items are not published on the docs page, but may be used in the future.
- stage: Gitaly # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- issue_url: # (optional) This is a link to the deprecation issue in GitLab
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/deprecations/14-9-deprecate-debian-9.yml b/data/deprecations/14-9-deprecate-debian-9.yml
index 8f512393aa4..3dce4892ab7 100644
--- a/data/deprecations/14-9-deprecate-debian-9.yml
+++ b/data/deprecations/14-9-deprecate-debian-9.yml
@@ -4,4 +4,4 @@
removal_milestone: "15.1"
removal_date: "2022-06-22"
body: |
- Long term service and support (LTSS) for [Debian 9 Stretch ends in July 2022](https://wiki.debian.org/LTS). Therefore, we will longer support the Debian 9 distribution for the GitLab package. Users can upgrade to Debian 10 or Debian 11.
+ Long term service and support (LTSS) for [Debian 9 Stretch ends in July 2022](https://wiki.debian.org/LTS). Therefore, we will no longer support the Debian 9 distribution for the GitLab package. Users can upgrade to Debian 10 or Debian 11.
diff --git a/data/deprecations/14-9-system_monitoring.yml b/data/deprecations/14-9-system_monitoring.yml
index 6c8dc61db4d..c4b3343bee6 100644
--- a/data/deprecations/14-9-system_monitoring.yml
+++ b/data/deprecations/14-9-system_monitoring.yml
@@ -1,12 +1,12 @@
-- name: "GitLab self-monitoring" # The name of the feature to be deprecated
+- name: "GitLab self-monitoring project" # The name of the feature to be deprecated
announcement_milestone: "14.9" # The milestone when this feature was first announced as deprecated.
announcement_date: "2022-03-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
- removal_milestone: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "16.0" # The milestone when this feature is planned to be removed
+ removal_date: "2023-05-22" # The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # If this deprecation is a breaking change, set this value to true
reporter: abellucci # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
- GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 15.0.
+ GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 16.0.
# The following items are not published on the docs page, but may be used in the future.
stage: Monitor # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
tiers: [Core, Premium, Ultimate] # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
diff --git a/data/deprecations/15-0-deprecate-monitor-metrics.yml b/data/deprecations/15-0-deprecate-monitor-metrics.yml
index f5fa63b9c40..9ad78d9c01d 100644
--- a/data/deprecations/15-0-deprecate-monitor-metrics.yml
+++ b/data/deprecations/15-0-deprecate-monitor-metrics.yml
@@ -1,8 +1,8 @@
- name: "Monitor performance metrics through Prometheus" # The name of the feature to be deprecated
announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
announcement_date: "2022-01-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
- removal_milestone: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "16.0" # The milestone when this feature is planned to be removed
+ removal_date: "2023-05-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # If this deprecation is a breaking change, set this value to true
body: | # Do not modify this line, instead modify the lines below.
By displaying data stored in a Prometheus instance, GitLab allows users to view performance metrics. GitLab also displays visualizations of these metrics in dashboards. The user can connect to a previously-configured external Prometheus instance, or set up Prometheus as a GitLab Managed App.
diff --git a/data/deprecations/templates/_deprecation_template.md.erb b/data/deprecations/templates/_deprecation_template.md.erb
index 1ef2af67a98..09a53404798 100644
--- a/data/deprecations/templates/_deprecation_template.md.erb
+++ b/data/deprecations/templates/_deprecation_template.md.erb
@@ -35,6 +35,12 @@ For deprecation reviewers (Technical Writers only):
- For more information about updating the deprecation doc, see the deprecation doc update guidance:
https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-deprecations-doc
-->
+
+View deprecations by the product versions in which they were announced.
+
+Each deprecation has a **planned removal milestone** and indicates whether it is a breaking change.
+
+Most of the deprecations are **planned for removal in 15.0**, and many of them are **breaking changes**.
<% if milestones.any? -%>
<%- milestones.each do |milestone| %>
## <%= milestone %>
diff --git a/db/docs/abuse_reports.yml b/db/docs/abuse_reports.yml
new file mode 100644
index 00000000000..b05b9618a27
--- /dev/null
+++ b/db/docs/abuse_reports.yml
@@ -0,0 +1,9 @@
+---
+table_name: abuse_reports
+classes:
+- AbuseReport
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/cba7f20dc8614d12e3eeda6e14f454aeb22b9b54
+milestone: '7.13'
diff --git a/db/docs/agent_activity_events.yml b/db/docs/agent_activity_events.yml
new file mode 100644
index 00000000000..82e6481be42
--- /dev/null
+++ b/db/docs/agent_activity_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: agent_activity_events
+classes:
+- Clusters::Agents::ActivityEvent
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74577
+milestone: '14.6'
diff --git a/db/docs/agent_group_authorizations.yml b/db/docs/agent_group_authorizations.yml
new file mode 100644
index 00000000000..1c250b90b6d
--- /dev/null
+++ b/db/docs/agent_group_authorizations.yml
@@ -0,0 +1,9 @@
+---
+table_name: agent_group_authorizations
+classes:
+- Clusters::Agents::GroupAuthorization
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68023
+milestone: '14.3'
diff --git a/db/docs/agent_project_authorizations.yml b/db/docs/agent_project_authorizations.yml
new file mode 100644
index 00000000000..3ac48b0d35b
--- /dev/null
+++ b/db/docs/agent_project_authorizations.yml
@@ -0,0 +1,9 @@
+---
+table_name: agent_project_authorizations
+classes:
+- Clusters::Agents::ProjectAuthorization
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67295
+milestone: '14.3'
diff --git a/db/docs/alert_management_alert_assignees.yml b/db/docs/alert_management_alert_assignees.yml
new file mode 100644
index 00000000000..23b81240c11
--- /dev/null
+++ b/db/docs/alert_management_alert_assignees.yml
@@ -0,0 +1,9 @@
+---
+table_name: alert_management_alert_assignees
+classes:
+- AlertManagement::AlertAssignee
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/alert_management_alert_metric_images.yml b/db/docs/alert_management_alert_metric_images.yml
new file mode 100644
index 00000000000..e43be4f854c
--- /dev/null
+++ b/db/docs/alert_management_alert_metric_images.yml
@@ -0,0 +1,9 @@
+---
+table_name: alert_management_alert_metric_images
+classes:
+- AlertManagement::MetricImage
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80339
+milestone: '14.8'
diff --git a/db/docs/alert_management_alert_user_mentions.yml b/db/docs/alert_management_alert_user_mentions.yml
new file mode 100644
index 00000000000..c834c2a8b12
--- /dev/null
+++ b/db/docs/alert_management_alert_user_mentions.yml
@@ -0,0 +1,9 @@
+---
+table_name: alert_management_alert_user_mentions
+classes:
+- AlertManagement::AlertUserMention
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/alert_management_alerts.yml b/db/docs/alert_management_alerts.yml
new file mode 100644
index 00000000000..1d5cbf0df23
--- /dev/null
+++ b/db/docs/alert_management_alerts.yml
@@ -0,0 +1,9 @@
+---
+table_name: alert_management_alerts
+classes:
+- AlertManagement::Alert
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/alert_management_http_integrations.yml b/db/docs/alert_management_http_integrations.yml
new file mode 100644
index 00000000000..7dba70bcb67
--- /dev/null
+++ b/db/docs/alert_management_http_integrations.yml
@@ -0,0 +1,9 @@
+---
+table_name: alert_management_http_integrations
+classes:
+- AlertManagement::HttpIntegration
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44098
+milestone: '13.5'
diff --git a/db/docs/allowed_email_domains.yml b/db/docs/allowed_email_domains.yml
new file mode 100644
index 00000000000..69f7aa3a804
--- /dev/null
+++ b/db/docs/allowed_email_domains.yml
@@ -0,0 +1,9 @@
+---
+table_name: allowed_email_domains
+classes:
+- AllowedEmailDomain
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/14800
+milestone: '12.2'
diff --git a/db/docs/analytics_cycle_analytics_aggregations.yml b/db/docs/analytics_cycle_analytics_aggregations.yml
new file mode 100644
index 00000000000..b79cb949d1f
--- /dev/null
+++ b/db/docs/analytics_cycle_analytics_aggregations.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_cycle_analytics_aggregations
+classes:
+- Analytics::CycleAnalytics::Aggregation
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79942
+milestone: '14.9'
diff --git a/db/docs/analytics_cycle_analytics_group_stages.yml b/db/docs/analytics_cycle_analytics_group_stages.yml
new file mode 100644
index 00000000000..67bca593a61
--- /dev/null
+++ b/db/docs/analytics_cycle_analytics_group_stages.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_cycle_analytics_group_stages
+classes:
+- Analytics::CycleAnalytics::GroupStage
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/15061
+milestone: '12.2'
diff --git a/db/docs/analytics_cycle_analytics_group_value_streams.yml b/db/docs/analytics_cycle_analytics_group_value_streams.yml
new file mode 100644
index 00000000000..fdf620c382f
--- /dev/null
+++ b/db/docs/analytics_cycle_analytics_group_value_streams.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_cycle_analytics_group_value_streams
+classes:
+- Analytics::CycleAnalytics::GroupValueStream
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/analytics_cycle_analytics_issue_stage_events.yml b/db/docs/analytics_cycle_analytics_issue_stage_events.yml
new file mode 100644
index 00000000000..cc993799033
--- /dev/null
+++ b/db/docs/analytics_cycle_analytics_issue_stage_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_cycle_analytics_issue_stage_events
+classes:
+- Analytics::CycleAnalytics::IssueStageEvent
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68950
+milestone: '14.3'
diff --git a/db/docs/analytics_cycle_analytics_merge_request_stage_events.yml b/db/docs/analytics_cycle_analytics_merge_request_stage_events.yml
new file mode 100644
index 00000000000..796db2a54af
--- /dev/null
+++ b/db/docs/analytics_cycle_analytics_merge_request_stage_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_cycle_analytics_merge_request_stage_events
+classes:
+- Analytics::CycleAnalytics::MergeRequestStageEvent
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68950
+milestone: '14.3'
diff --git a/db/docs/analytics_cycle_analytics_project_stages.yml b/db/docs/analytics_cycle_analytics_project_stages.yml
new file mode 100644
index 00000000000..051f1c585ba
--- /dev/null
+++ b/db/docs/analytics_cycle_analytics_project_stages.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_cycle_analytics_project_stages
+classes:
+- Analytics::CycleAnalytics::ProjectStage
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/15061
+milestone: '12.2'
diff --git a/db/docs/analytics_cycle_analytics_project_value_streams.yml b/db/docs/analytics_cycle_analytics_project_value_streams.yml
new file mode 100644
index 00000000000..28c3f7082a2
--- /dev/null
+++ b/db/docs/analytics_cycle_analytics_project_value_streams.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_cycle_analytics_project_value_streams
+classes:
+- Analytics::CycleAnalytics::ProjectValueStream
+feature_categories:
+- planning_analytics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60925
+milestone: '13.12'
diff --git a/db/docs/analytics_cycle_analytics_stage_event_hashes.yml b/db/docs/analytics_cycle_analytics_stage_event_hashes.yml
new file mode 100644
index 00000000000..cec953a261d
--- /dev/null
+++ b/db/docs/analytics_cycle_analytics_stage_event_hashes.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_cycle_analytics_stage_event_hashes
+classes:
+- Analytics::CycleAnalytics::StageEventHash
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67259
+milestone: '14.2'
diff --git a/db/docs/analytics_devops_adoption_segments.yml b/db/docs/analytics_devops_adoption_segments.yml
new file mode 100644
index 00000000000..18abfcaff09
--- /dev/null
+++ b/db/docs/analytics_devops_adoption_segments.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_devops_adoption_segments
+classes:
+- Analytics::DevopsAdoption::EnabledNamespace
+feature_categories:
+- devops_reports
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45748
+milestone: '13.6'
diff --git a/db/docs/analytics_devops_adoption_snapshots.yml b/db/docs/analytics_devops_adoption_snapshots.yml
new file mode 100644
index 00000000000..8bb87fd08fc
--- /dev/null
+++ b/db/docs/analytics_devops_adoption_snapshots.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_devops_adoption_snapshots
+classes:
+- Analytics::DevopsAdoption::Snapshot
+feature_categories:
+- devops_reports
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47388
+milestone: '13.7'
diff --git a/db/docs/analytics_language_trend_repository_languages.yml b/db/docs/analytics_language_trend_repository_languages.yml
new file mode 100644
index 00000000000..b27543dffaf
--- /dev/null
+++ b/db/docs/analytics_language_trend_repository_languages.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_language_trend_repository_languages
+classes:
+- Analytics::LanguageTrend::RepositoryLanguage
+feature_categories:
+- devops_reports
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16491
+milestone: '12.3'
diff --git a/db/docs/analytics_usage_trends_measurements.yml b/db/docs/analytics_usage_trends_measurements.yml
new file mode 100644
index 00000000000..88e66fd7c98
--- /dev/null
+++ b/db/docs/analytics_usage_trends_measurements.yml
@@ -0,0 +1,9 @@
+---
+table_name: analytics_usage_trends_measurements
+classes:
+- Analytics::UsageTrends::Measurement
+feature_categories:
+- devops_reports
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62797
+milestone: '14.0'
diff --git a/db/docs/appearances.yml b/db/docs/appearances.yml
new file mode 100644
index 00000000000..8d30bc52d4d
--- /dev/null
+++ b/db/docs/appearances.yml
@@ -0,0 +1,9 @@
+---
+table_name: appearances
+classes:
+- Appearance
+feature_categories:
+- navigation
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/40104eead753e7e8ea77951a74a3941546c35aab
+milestone: '6.8'
diff --git a/db/docs/application_setting_terms.yml b/db/docs/application_setting_terms.yml
new file mode 100644
index 00000000000..11f8c6536c4
--- /dev/null
+++ b/db/docs/application_setting_terms.yml
@@ -0,0 +1,9 @@
+---
+table_name: application_setting_terms
+classes:
+- ApplicationSetting::Term
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/cf37bef287d7dd5d2dce3e2276489767b8c0671f
+milestone: '10.8'
diff --git a/db/docs/application_settings.yml b/db/docs/application_settings.yml
new file mode 100644
index 00000000000..578e8ad5c3d
--- /dev/null
+++ b/db/docs/application_settings.yml
@@ -0,0 +1,14 @@
+---
+table_name: application_settings
+classes:
+- ApplicationSetting
+feature_categories:
+- continuous_integration
+- integrations
+- metrics
+- pages
+- service_ping
+- source_code_management
+description: GitLab application settings
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8589b4e137f50293952923bb07e2814257d7784d
+milestone: '7.7'
diff --git a/db/docs/approval_merge_request_rule_sources.yml b/db/docs/approval_merge_request_rule_sources.yml
new file mode 100644
index 00000000000..c1b4da16a1e
--- /dev/null
+++ b/db/docs/approval_merge_request_rule_sources.yml
@@ -0,0 +1,9 @@
+---
+table_name: approval_merge_request_rule_sources
+classes:
+- ApprovalMergeRequestRuleSource
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
+milestone: '11.7'
diff --git a/db/docs/approval_merge_request_rules.yml b/db/docs/approval_merge_request_rules.yml
new file mode 100644
index 00000000000..2db3de519db
--- /dev/null
+++ b/db/docs/approval_merge_request_rules.yml
@@ -0,0 +1,9 @@
+---
+table_name: approval_merge_request_rules
+classes:
+- ApprovalMergeRequestRule
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
+milestone: '11.7'
diff --git a/db/docs/approval_merge_request_rules_approved_approvers.yml b/db/docs/approval_merge_request_rules_approved_approvers.yml
new file mode 100644
index 00000000000..a9b46353dd0
--- /dev/null
+++ b/db/docs/approval_merge_request_rules_approved_approvers.yml
@@ -0,0 +1,8 @@
+---
+table_name: approval_merge_request_rules_approved_approvers
+classes: []
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
+milestone: '11.7'
diff --git a/db/docs/approval_merge_request_rules_groups.yml b/db/docs/approval_merge_request_rules_groups.yml
new file mode 100644
index 00000000000..86aa93fa179
--- /dev/null
+++ b/db/docs/approval_merge_request_rules_groups.yml
@@ -0,0 +1,8 @@
+---
+table_name: approval_merge_request_rules_groups
+classes: []
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
+milestone: '11.7'
diff --git a/db/docs/approval_merge_request_rules_users.yml b/db/docs/approval_merge_request_rules_users.yml
new file mode 100644
index 00000000000..710de6cc0c4
--- /dev/null
+++ b/db/docs/approval_merge_request_rules_users.yml
@@ -0,0 +1,8 @@
+---
+table_name: approval_merge_request_rules_users
+classes: []
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
+milestone: '11.7'
diff --git a/db/docs/approval_project_rules.yml b/db/docs/approval_project_rules.yml
new file mode 100644
index 00000000000..a2a9eeb823f
--- /dev/null
+++ b/db/docs/approval_project_rules.yml
@@ -0,0 +1,9 @@
+---
+table_name: approval_project_rules
+classes:
+- ApprovalProjectRule
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
+milestone: '11.7'
diff --git a/db/docs/approval_project_rules_groups.yml b/db/docs/approval_project_rules_groups.yml
new file mode 100644
index 00000000000..11ed75a398b
--- /dev/null
+++ b/db/docs/approval_project_rules_groups.yml
@@ -0,0 +1,8 @@
+---
+table_name: approval_project_rules_groups
+classes: []
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
+milestone: '11.7'
diff --git a/db/docs/approval_project_rules_protected_branches.yml b/db/docs/approval_project_rules_protected_branches.yml
new file mode 100644
index 00000000000..197644b75db
--- /dev/null
+++ b/db/docs/approval_project_rules_protected_branches.yml
@@ -0,0 +1,9 @@
+---
+table_name: approval_project_rules_protected_branches
+classes:
+- ApprovalProjectRulesProtectedBranch
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22673
+milestone: '12.7'
diff --git a/db/docs/approval_project_rules_users.yml b/db/docs/approval_project_rules_users.yml
new file mode 100644
index 00000000000..8fe1c5c7f71
--- /dev/null
+++ b/db/docs/approval_project_rules_users.yml
@@ -0,0 +1,8 @@
+---
+table_name: approval_project_rules_users
+classes: []
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
+milestone: '11.7'
diff --git a/db/docs/approvals.yml b/db/docs/approvals.yml
new file mode 100644
index 00000000000..e26a2ca4aa4
--- /dev/null
+++ b/db/docs/approvals.yml
@@ -0,0 +1,9 @@
+---
+table_name: approvals
+classes:
+- Approval
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/73faf3c7289c4fa4535b752a12247ee74b173976
+milestone: '7.12'
diff --git a/db/docs/approver_groups.yml b/db/docs/approver_groups.yml
new file mode 100644
index 00000000000..6f0be968f07
--- /dev/null
+++ b/db/docs/approver_groups.yml
@@ -0,0 +1,9 @@
+---
+table_name: approver_groups
+classes:
+- ApproverGroup
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/21d27185191e6204a6645d776c77ae3855cce3e8
+milestone: '8.13'
diff --git a/db/docs/approvers.yml b/db/docs/approvers.yml
new file mode 100644
index 00000000000..01f7ac1f4e9
--- /dev/null
+++ b/db/docs/approvers.yml
@@ -0,0 +1,9 @@
+---
+table_name: approvers
+classes:
+- Approver
+feature_categories:
+- security_orchestration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3cc78d89984d9c9df8372c52b7bba38e6226f9f2
+milestone: '7.13'
diff --git a/db/docs/ar_internal_metadata.yml b/db/docs/ar_internal_metadata.yml
new file mode 100644
index 00000000000..c25904a3a1b
--- /dev/null
+++ b/db/docs/ar_internal_metadata.yml
@@ -0,0 +1,8 @@
+---
+table_name: ar_internal_metadata
+classes: []
+feature_categories:
+- database
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/atlassian_identities.yml b/db/docs/atlassian_identities.yml
new file mode 100644
index 00000000000..0df18d40ab4
--- /dev/null
+++ b/db/docs/atlassian_identities.yml
@@ -0,0 +1,9 @@
+---
+table_name: atlassian_identities
+classes:
+- Atlassian::Identity
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/audit_events.yml b/db/docs/audit_events.yml
new file mode 100644
index 00000000000..b19b26be711
--- /dev/null
+++ b/db/docs/audit_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: audit_events
+classes:
+- AuditEvent
+feature_categories:
+- audit_events
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/cf6b622686eacffa46aba5c8ed6419dc877a6b58
+milestone: '7.6'
diff --git a/db/docs/audit_events_external_audit_event_destinations.yml b/db/docs/audit_events_external_audit_event_destinations.yml
new file mode 100644
index 00000000000..6cac68c54cb
--- /dev/null
+++ b/db/docs/audit_events_external_audit_event_destinations.yml
@@ -0,0 +1,9 @@
+---
+table_name: audit_events_external_audit_event_destinations
+classes:
+- AuditEvents::ExternalAuditEventDestination
+feature_categories:
+- audit_events
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70706
+milestone: '14.4'
diff --git a/db/docs/authentication_events.yml b/db/docs/authentication_events.yml
new file mode 100644
index 00000000000..fb76b359854
--- /dev/null
+++ b/db/docs/authentication_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: authentication_events
+classes:
+- AuthenticationEvent
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/award_emoji.yml b/db/docs/award_emoji.yml
new file mode 100644
index 00000000000..feef2ee340e
--- /dev/null
+++ b/db/docs/award_emoji.yml
@@ -0,0 +1,9 @@
+---
+table_name: award_emoji
+classes:
+- AwardEmoji
+feature_categories:
+- snippets
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3bdc57f0a710b3769381ecad7ea4098223ecff56
+milestone: '8.9'
diff --git a/db/docs/aws_roles.yml b/db/docs/aws_roles.yml
new file mode 100644
index 00000000000..c278809e5fd
--- /dev/null
+++ b/db/docs/aws_roles.yml
@@ -0,0 +1,9 @@
+---
+table_name: aws_roles
+classes:
+- Aws::Role
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17057
+milestone: '12.4'
diff --git a/db/docs/background_migration_jobs.yml b/db/docs/background_migration_jobs.yml
new file mode 100644
index 00000000000..a07e605210f
--- /dev/null
+++ b/db/docs/background_migration_jobs.yml
@@ -0,0 +1,9 @@
+---
+table_name: background_migration_jobs
+classes:
+- Gitlab::Database::BackgroundMigrationJob
+feature_categories:
+- database
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/badges.yml b/db/docs/badges.yml
new file mode 100644
index 00000000000..f96a3c37bcc
--- /dev/null
+++ b/db/docs/badges.yml
@@ -0,0 +1,11 @@
+---
+table_name: badges
+classes:
+- Badge
+- GroupBadge
+- ProjectBadge
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8fe880dc064e0e6cd10f7176ade7c312cfb37b90
+milestone: '10.6'
diff --git a/db/docs/banned_users.yml b/db/docs/banned_users.yml
new file mode 100644
index 00000000000..788684494db
--- /dev/null
+++ b/db/docs/banned_users.yml
@@ -0,0 +1,9 @@
+---
+table_name: banned_users
+classes:
+- Users::BannedUser
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64728
+milestone: '14.2'
diff --git a/db/docs/batched_background_migration_job_transition_logs.yml b/db/docs/batched_background_migration_job_transition_logs.yml
new file mode 100644
index 00000000000..32e18facc18
--- /dev/null
+++ b/db/docs/batched_background_migration_job_transition_logs.yml
@@ -0,0 +1,9 @@
+---
+table_name: batched_background_migration_job_transition_logs
+classes:
+- Gitlab::Database::BackgroundMigration::BatchedJobTransitionLog
+feature_categories:
+- database
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75113
+milestone: '14.8'
diff --git a/db/docs/batched_background_migration_jobs.yml b/db/docs/batched_background_migration_jobs.yml
new file mode 100644
index 00000000000..ed63a1527e5
--- /dev/null
+++ b/db/docs/batched_background_migration_jobs.yml
@@ -0,0 +1,9 @@
+---
+table_name: batched_background_migration_jobs
+classes:
+- Gitlab::Database::BackgroundMigration::BatchedJob
+feature_categories:
+- database
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54628
+milestone: '13.10'
diff --git a/db/docs/batched_background_migrations.yml b/db/docs/batched_background_migrations.yml
new file mode 100644
index 00000000000..cdb9df4824f
--- /dev/null
+++ b/db/docs/batched_background_migrations.yml
@@ -0,0 +1,9 @@
+---
+table_name: batched_background_migrations
+classes:
+- Gitlab::Database::BackgroundMigration::BatchedMigration
+feature_categories:
+- database
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54628
+milestone: '13.10'
diff --git a/db/docs/board_assignees.yml b/db/docs/board_assignees.yml
new file mode 100644
index 00000000000..f570eda19ee
--- /dev/null
+++ b/db/docs/board_assignees.yml
@@ -0,0 +1,9 @@
+---
+table_name: board_assignees
+classes:
+- BoardAssignee
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2912
+milestone: '10.2'
diff --git a/db/docs/board_group_recent_visits.yml b/db/docs/board_group_recent_visits.yml
new file mode 100644
index 00000000000..0dfe7f8cb4b
--- /dev/null
+++ b/db/docs/board_group_recent_visits.yml
@@ -0,0 +1,9 @@
+---
+table_name: board_group_recent_visits
+classes:
+- BoardGroupRecentVisit
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7aeab58f4861144fcc1d334907cb1b465c645001
+milestone: '11.5'
diff --git a/db/docs/board_labels.yml b/db/docs/board_labels.yml
new file mode 100644
index 00000000000..a6e7cf8daac
--- /dev/null
+++ b/db/docs/board_labels.yml
@@ -0,0 +1,9 @@
+---
+table_name: board_labels
+classes:
+- BoardLabel
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2912
+milestone: '10.2'
diff --git a/db/docs/board_project_recent_visits.yml b/db/docs/board_project_recent_visits.yml
new file mode 100644
index 00000000000..a1d5a03452f
--- /dev/null
+++ b/db/docs/board_project_recent_visits.yml
@@ -0,0 +1,9 @@
+---
+table_name: board_project_recent_visits
+classes:
+- BoardProjectRecentVisit
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7aeab58f4861144fcc1d334907cb1b465c645001
+milestone: '11.5'
diff --git a/db/docs/board_user_preferences.yml b/db/docs/board_user_preferences.yml
new file mode 100644
index 00000000000..209374e9d66
--- /dev/null
+++ b/db/docs/board_user_preferences.yml
@@ -0,0 +1,9 @@
+---
+table_name: board_user_preferences
+classes:
+- BoardUserPreference
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/boards.yml b/db/docs/boards.yml
new file mode 100644
index 00000000000..c837f24f3ff
--- /dev/null
+++ b/db/docs/boards.yml
@@ -0,0 +1,9 @@
+---
+table_name: boards
+classes:
+- Board
+feature_categories:
+- design_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/611dab2e522e5e59cf09cd459a31686e65616863
+milestone: '8.11'
diff --git a/db/docs/boards_epic_board_labels.yml b/db/docs/boards_epic_board_labels.yml
new file mode 100644
index 00000000000..3f273abe5de
--- /dev/null
+++ b/db/docs/boards_epic_board_labels.yml
@@ -0,0 +1,9 @@
+---
+table_name: boards_epic_board_labels
+classes:
+- Boards::EpicBoardLabel
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48658
+milestone: '13.7'
diff --git a/db/docs/boards_epic_board_positions.yml b/db/docs/boards_epic_board_positions.yml
new file mode 100644
index 00000000000..895be38e94a
--- /dev/null
+++ b/db/docs/boards_epic_board_positions.yml
@@ -0,0 +1,9 @@
+---
+table_name: boards_epic_board_positions
+classes:
+- Boards::EpicBoardPosition
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48120
+milestone: '13.7'
diff --git a/db/docs/boards_epic_board_recent_visits.yml b/db/docs/boards_epic_board_recent_visits.yml
new file mode 100644
index 00000000000..35929e178be
--- /dev/null
+++ b/db/docs/boards_epic_board_recent_visits.yml
@@ -0,0 +1,9 @@
+---
+table_name: boards_epic_board_recent_visits
+classes:
+- Boards::EpicBoardRecentVisit
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60720
+milestone: '13.12'
diff --git a/db/docs/boards_epic_boards.yml b/db/docs/boards_epic_boards.yml
new file mode 100644
index 00000000000..0603ce71c21
--- /dev/null
+++ b/db/docs/boards_epic_boards.yml
@@ -0,0 +1,9 @@
+---
+table_name: boards_epic_boards
+classes:
+- Boards::EpicBoard
+feature_categories:
+- portfolio_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48658
+milestone: '13.7'
diff --git a/db/docs/boards_epic_list_user_preferences.yml b/db/docs/boards_epic_list_user_preferences.yml
new file mode 100644
index 00000000000..38f4a1e020b
--- /dev/null
+++ b/db/docs/boards_epic_list_user_preferences.yml
@@ -0,0 +1,9 @@
+---
+table_name: boards_epic_list_user_preferences
+classes:
+- Boards::EpicListUserPreference
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54541
+milestone: '13.10'
diff --git a/db/docs/boards_epic_lists.yml b/db/docs/boards_epic_lists.yml
new file mode 100644
index 00000000000..2a723b4d24e
--- /dev/null
+++ b/db/docs/boards_epic_lists.yml
@@ -0,0 +1,9 @@
+---
+table_name: boards_epic_lists
+classes:
+- Boards::EpicList
+feature_categories:
+- portfolio_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49728
+milestone: '13.8'
diff --git a/db/docs/boards_epic_user_preferences.yml b/db/docs/boards_epic_user_preferences.yml
new file mode 100644
index 00000000000..3fa841c2703
--- /dev/null
+++ b/db/docs/boards_epic_user_preferences.yml
@@ -0,0 +1,9 @@
+---
+table_name: boards_epic_user_preferences
+classes:
+- Boards::EpicUserPreference
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/broadcast_messages.yml b/db/docs/broadcast_messages.yml
new file mode 100644
index 00000000000..da8693df4fc
--- /dev/null
+++ b/db/docs/broadcast_messages.yml
@@ -0,0 +1,9 @@
+---
+table_name: broadcast_messages
+classes:
+- BroadcastMessage
+feature_categories:
+- navigation
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f1ecf53c1e55fbbc66cb2d7d12fb411cbfc2ace8
+milestone: '6.3'
diff --git a/db/docs/bulk_import_configurations.yml b/db/docs/bulk_import_configurations.yml
new file mode 100644
index 00000000000..2138fbc4d56
--- /dev/null
+++ b/db/docs/bulk_import_configurations.yml
@@ -0,0 +1,9 @@
+---
+table_name: bulk_import_configurations
+classes:
+- BulkImports::Configuration
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42978
+milestone: '13.5'
diff --git a/db/docs/bulk_import_entities.yml b/db/docs/bulk_import_entities.yml
new file mode 100644
index 00000000000..373f5f76369
--- /dev/null
+++ b/db/docs/bulk_import_entities.yml
@@ -0,0 +1,9 @@
+---
+table_name: bulk_import_entities
+classes:
+- BulkImports::Entity
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42978
+milestone: '13.5'
diff --git a/db/docs/bulk_import_export_uploads.yml b/db/docs/bulk_import_export_uploads.yml
new file mode 100644
index 00000000000..7b5dcf28102
--- /dev/null
+++ b/db/docs/bulk_import_export_uploads.yml
@@ -0,0 +1,9 @@
+---
+table_name: bulk_import_export_uploads
+classes:
+- BulkImports::ExportUpload
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59976
+milestone: '13.12'
diff --git a/db/docs/bulk_import_exports.yml b/db/docs/bulk_import_exports.yml
new file mode 100644
index 00000000000..d64391b8b52
--- /dev/null
+++ b/db/docs/bulk_import_exports.yml
@@ -0,0 +1,9 @@
+---
+table_name: bulk_import_exports
+classes:
+- BulkImports::Export
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59976
+milestone: '13.12'
diff --git a/db/docs/bulk_import_failures.yml b/db/docs/bulk_import_failures.yml
new file mode 100644
index 00000000000..52e019deeea
--- /dev/null
+++ b/db/docs/bulk_import_failures.yml
@@ -0,0 +1,9 @@
+---
+table_name: bulk_import_failures
+classes:
+- BulkImports::Failure
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47526
+milestone: '13.7'
diff --git a/db/docs/bulk_import_trackers.yml b/db/docs/bulk_import_trackers.yml
new file mode 100644
index 00000000000..8ad5e6a7029
--- /dev/null
+++ b/db/docs/bulk_import_trackers.yml
@@ -0,0 +1,9 @@
+---
+table_name: bulk_import_trackers
+classes:
+- BulkImports::Tracker
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47009
+milestone: '13.6'
diff --git a/db/docs/bulk_imports.yml b/db/docs/bulk_imports.yml
new file mode 100644
index 00000000000..2f63f742618
--- /dev/null
+++ b/db/docs/bulk_imports.yml
@@ -0,0 +1,9 @@
+---
+table_name: bulk_imports
+classes:
+- BulkImport
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42978
+milestone: '13.5'
diff --git a/db/docs/chat_names.yml b/db/docs/chat_names.yml
new file mode 100644
index 00000000000..aadfdfaa89f
--- /dev/null
+++ b/db/docs/chat_names.yml
@@ -0,0 +1,9 @@
+---
+table_name: chat_names
+classes:
+- ChatName
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/c60437786bfe43344b4a5eb040437f73f37c6396
+milestone: '8.14'
diff --git a/db/docs/chat_teams.yml b/db/docs/chat_teams.yml
new file mode 100644
index 00000000000..c2b15011547
--- /dev/null
+++ b/db/docs/chat_teams.yml
@@ -0,0 +1,9 @@
+---
+table_name: chat_teams
+classes:
+- ChatTeam
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/297dc70158f905fef4557d1ee6510bcf459a08a9
+milestone: '9.0'
diff --git a/db/docs/ci_build_needs.yml b/db/docs/ci_build_needs.yml
new file mode 100644
index 00000000000..976d834c884
--- /dev/null
+++ b/db/docs/ci_build_needs.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_build_needs
+classes:
+- Ci::BuildNeed
+feature_categories:
+- pipeline_authoring
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e7ee84aad4237eaa16f2aba75b4d2c7860625c9d
+milestone: '12.2'
diff --git a/db/docs/ci_build_pending_states.yml b/db/docs/ci_build_pending_states.yml
new file mode 100644
index 00000000000..7f6ce6de4a2
--- /dev/null
+++ b/db/docs/ci_build_pending_states.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_build_pending_states
+classes:
+- Ci::BuildPendingState
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/ci_build_report_results.yml b/db/docs/ci_build_report_results.yml
new file mode 100644
index 00000000000..101f1b0ce83
--- /dev/null
+++ b/db/docs/ci_build_report_results.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_build_report_results
+classes:
+- Ci::BuildReportResult
+feature_categories:
+- code_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/ci_build_trace_chunks.yml b/db/docs/ci_build_trace_chunks.yml
new file mode 100644
index 00000000000..b44f04d3e60
--- /dev/null
+++ b/db/docs/ci_build_trace_chunks.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_build_trace_chunks
+classes:
+- Ci::BuildTraceChunk
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9d6fe7bfdf9ff3f68ee73baa0e3d0aa7df13c351
+milestone: '10.8'
diff --git a/db/docs/ci_build_trace_metadata.yml b/db/docs/ci_build_trace_metadata.yml
new file mode 100644
index 00000000000..54c35cf9c76
--- /dev/null
+++ b/db/docs/ci_build_trace_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_build_trace_metadata
+classes:
+- Ci::BuildTraceMetadata
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68171
+milestone: '14.2'
diff --git a/db/docs/ci_builds.yml b/db/docs/ci_builds.yml
new file mode 100644
index 00000000000..fdaecfe22e8
--- /dev/null
+++ b/db/docs/ci_builds.yml
@@ -0,0 +1,13 @@
+---
+table_name: ci_builds
+classes:
+- Ci::Bridge
+- Ci::Build
+- Ci::Processable
+- CommitStatus
+- GenericCommitStatus
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/046b28312704f3131e72dcd2dbdacc5264d4aa62
+milestone: '8.0'
diff --git a/db/docs/ci_builds_metadata.yml b/db/docs/ci_builds_metadata.yml
new file mode 100644
index 00000000000..ce5c72cf0f1
--- /dev/null
+++ b/db/docs/ci_builds_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_builds_metadata
+classes:
+- Ci::BuildMetadata
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1dde609ca6b130aa0a3d39e929edee7e770e62fc
+milestone: '10.7'
diff --git a/db/docs/ci_builds_runner_session.yml b/db/docs/ci_builds_runner_session.yml
new file mode 100644
index 00000000000..790a976a47a
--- /dev/null
+++ b/db/docs/ci_builds_runner_session.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_builds_runner_session
+classes:
+- Ci::BuildRunnerSession
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6208
+milestone: '11.1'
diff --git a/db/docs/ci_daily_build_group_report_results.yml b/db/docs/ci_daily_build_group_report_results.yml
new file mode 100644
index 00000000000..4b481176b38
--- /dev/null
+++ b/db/docs/ci_daily_build_group_report_results.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_daily_build_group_report_results
+classes:
+- Ci::DailyBuildGroupReportResult
+feature_categories:
+- code_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/ci_deleted_objects.yml b/db/docs/ci_deleted_objects.yml
new file mode 100644
index 00000000000..7189b0a7c6c
--- /dev/null
+++ b/db/docs/ci_deleted_objects.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_deleted_objects
+classes:
+- Ci::DeletedObject
+feature_categories:
+- build_artifacts
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44928
+milestone: '13.5'
diff --git a/db/docs/ci_freeze_periods.yml b/db/docs/ci_freeze_periods.yml
new file mode 100644
index 00000000000..ed28e4189e9
--- /dev/null
+++ b/db/docs/ci_freeze_periods.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_freeze_periods
+classes:
+- Ci::FreezePeriod
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/ci_group_variables.yml b/db/docs/ci_group_variables.yml
new file mode 100644
index 00000000000..de361da918d
--- /dev/null
+++ b/db/docs/ci_group_variables.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_group_variables
+classes:
+- Ci::GroupVariable
+feature_categories:
+- pipeline_authoring
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/5b0954759cc24bdba97be89bb117c5440174f859
+milestone: '9.4'
diff --git a/db/docs/ci_instance_variables.yml b/db/docs/ci_instance_variables.yml
new file mode 100644
index 00000000000..a73a38d2a02
--- /dev/null
+++ b/db/docs/ci_instance_variables.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_instance_variables
+classes:
+- Ci::InstanceVariable
+feature_categories:
+- pipeline_authoring
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/ci_job_artifact_states.yml b/db/docs/ci_job_artifact_states.yml
new file mode 100644
index 00000000000..d555c2d4564
--- /dev/null
+++ b/db/docs/ci_job_artifact_states.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_job_artifact_states
+classes:
+- Geo::JobArtifactState
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75264
+milestone: '14.8'
diff --git a/db/docs/ci_job_artifacts.yml b/db/docs/ci_job_artifacts.yml
new file mode 100644
index 00000000000..781ba3babf1
--- /dev/null
+++ b/db/docs/ci_job_artifacts.yml
@@ -0,0 +1,10 @@
+---
+table_name: ci_job_artifacts
+classes:
+- Ci::JobArtifact
+- Gitlab::Ci::JobArtifact
+feature_categories:
+- build_artifacts
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/61864a5a5bb523953589c9398a431c4369fbfc76
+milestone: '10.3'
diff --git a/db/docs/ci_job_token_project_scope_links.yml b/db/docs/ci_job_token_project_scope_links.yml
new file mode 100644
index 00000000000..e073b63e924
--- /dev/null
+++ b/db/docs/ci_job_token_project_scope_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_job_token_project_scope_links
+classes:
+- Ci::JobToken::ProjectScopeLink
+feature_categories:
+- pipeline_authoring
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62733
+milestone: '14.0'
diff --git a/db/docs/ci_job_variables.yml b/db/docs/ci_job_variables.yml
new file mode 100644
index 00000000000..b9143eab20d
--- /dev/null
+++ b/db/docs/ci_job_variables.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_job_variables
+classes:
+- Ci::JobVariable
+feature_categories:
+- pipeline_authoring
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/14784
+milestone: '12.2'
diff --git a/db/docs/ci_minutes_additional_packs.yml b/db/docs/ci_minutes_additional_packs.yml
new file mode 100644
index 00000000000..37e5e9b1423
--- /dev/null
+++ b/db/docs/ci_minutes_additional_packs.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_minutes_additional_packs
+classes:
+- Ci::Minutes::AdditionalPack
+feature_categories:
+- utilization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62393
+milestone: '14.0'
diff --git a/db/docs/ci_namespace_mirrors.yml b/db/docs/ci_namespace_mirrors.yml
new file mode 100644
index 00000000000..31349cfa94c
--- /dev/null
+++ b/db/docs/ci_namespace_mirrors.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_namespace_mirrors
+classes:
+- Ci::NamespaceMirror
+feature_categories:
+- sharding
+description: Mirrors some data from the `main` database into the `ci` database so that we can join directly in a single query
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75621
+milestone: '14.6'
diff --git a/db/docs/ci_namespace_monthly_usages.yml b/db/docs/ci_namespace_monthly_usages.yml
new file mode 100644
index 00000000000..601d208f1af
--- /dev/null
+++ b/db/docs/ci_namespace_monthly_usages.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_namespace_monthly_usages
+classes:
+- Ci::Minutes::NamespaceMonthlyUsage
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52915
+milestone: '13.9'
diff --git a/db/docs/ci_pending_builds.yml b/db/docs/ci_pending_builds.yml
new file mode 100644
index 00000000000..68a31db0868
--- /dev/null
+++ b/db/docs/ci_pending_builds.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_pending_builds
+classes:
+- Ci::PendingBuild
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61581
+milestone: '14.0'
diff --git a/db/docs/ci_pipeline_artifacts.yml b/db/docs/ci_pipeline_artifacts.yml
new file mode 100644
index 00000000000..31aaa42bf0f
--- /dev/null
+++ b/db/docs/ci_pipeline_artifacts.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_pipeline_artifacts
+classes:
+- Ci::PipelineArtifact
+feature_categories:
+- build_artifacts
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.3'
diff --git a/db/docs/ci_pipeline_chat_data.yml b/db/docs/ci_pipeline_chat_data.yml
new file mode 100644
index 00000000000..4f7152d0b56
--- /dev/null
+++ b/db/docs/ci_pipeline_chat_data.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_pipeline_chat_data
+classes:
+- Ci::PipelineChatData
+feature_categories:
+- chatops
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4466
+milestone: '10.6'
diff --git a/db/docs/ci_pipeline_messages.yml b/db/docs/ci_pipeline_messages.yml
new file mode 100644
index 00000000000..9a66ad366b1
--- /dev/null
+++ b/db/docs/ci_pipeline_messages.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_pipeline_messages
+classes:
+- Ci::PipelineMessage
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/ci_pipeline_schedule_variables.yml b/db/docs/ci_pipeline_schedule_variables.yml
new file mode 100644
index 00000000000..20c439c7d87
--- /dev/null
+++ b/db/docs/ci_pipeline_schedule_variables.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_pipeline_schedule_variables
+classes:
+- Ci::PipelineScheduleVariable
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d278da48f837292491aaf81649afef1da3a1eb09
+milestone: '9.4'
diff --git a/db/docs/ci_pipeline_schedules.yml b/db/docs/ci_pipeline_schedules.yml
new file mode 100644
index 00000000000..e61e3adfb82
--- /dev/null
+++ b/db/docs/ci_pipeline_schedules.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_pipeline_schedules
+classes:
+- Ci::PipelineSchedule
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8df3997a92bffa2d29f3c559933a336b837cdb93
+milestone: '9.2'
diff --git a/db/docs/ci_pipeline_variables.yml b/db/docs/ci_pipeline_variables.yml
new file mode 100644
index 00000000000..a98f17405bc
--- /dev/null
+++ b/db/docs/ci_pipeline_variables.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_pipeline_variables
+classes:
+- Ci::PipelineVariable
+feature_categories:
+- pipeline_authoring
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/56418e85ac6b667d19495665860092ce4d74f55d
+milestone: '9.5'
diff --git a/db/docs/ci_pipelines.yml b/db/docs/ci_pipelines.yml
new file mode 100644
index 00000000000..8931c5233f3
--- /dev/null
+++ b/db/docs/ci_pipelines.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_pipelines
+classes:
+- Ci::Pipeline
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/c6ae290cea4b88ecaa9cfe0bc9d88e8fd32070c1
+milestone: '9.0'
diff --git a/db/docs/ci_pipelines_config.yml b/db/docs/ci_pipelines_config.yml
new file mode 100644
index 00000000000..c3a5f33fda0
--- /dev/null
+++ b/db/docs/ci_pipelines_config.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_pipelines_config
+classes:
+- Ci::PipelineConfig
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21827
+milestone: '12.7'
diff --git a/db/docs/ci_platform_metrics.yml b/db/docs/ci_platform_metrics.yml
new file mode 100644
index 00000000000..4d64ed63894
--- /dev/null
+++ b/db/docs/ci_platform_metrics.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_platform_metrics
+classes:
+- CiPlatformMetric
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/ci_project_mirrors.yml b/db/docs/ci_project_mirrors.yml
new file mode 100644
index 00000000000..f04fbf80596
--- /dev/null
+++ b/db/docs/ci_project_mirrors.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_project_mirrors
+classes:
+- Ci::ProjectMirror
+feature_categories:
+- sharding
+description: Mirrors some data from the `main` database into the `ci` database so that we can join directly in a single query
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75621
+milestone: '14.6'
diff --git a/db/docs/ci_project_monthly_usages.yml b/db/docs/ci_project_monthly_usages.yml
new file mode 100644
index 00000000000..e7f0dc2b17b
--- /dev/null
+++ b/db/docs/ci_project_monthly_usages.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_project_monthly_usages
+classes:
+- Ci::Minutes::ProjectMonthlyUsage
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53460
+milestone: '13.9'
diff --git a/db/docs/ci_refs.yml b/db/docs/ci_refs.yml
new file mode 100644
index 00000000000..ce2d9256a9c
--- /dev/null
+++ b/db/docs/ci_refs.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_refs
+classes:
+- Ci::Ref
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16951
+milestone: '12.9'
diff --git a/db/docs/ci_resource_groups.yml b/db/docs/ci_resource_groups.yml
new file mode 100644
index 00000000000..b64929a074c
--- /dev/null
+++ b/db/docs/ci_resource_groups.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_resource_groups
+classes:
+- Ci::ResourceGroup
+feature_categories:
+- continuous_delivery
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20950
+milestone: '12.7'
diff --git a/db/docs/ci_resources.yml b/db/docs/ci_resources.yml
new file mode 100644
index 00000000000..2fac94eb416
--- /dev/null
+++ b/db/docs/ci_resources.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_resources
+classes:
+- Ci::Resource
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20950
+milestone: '12.7'
diff --git a/db/docs/ci_runner_namespaces.yml b/db/docs/ci_runner_namespaces.yml
new file mode 100644
index 00000000000..30414d064c3
--- /dev/null
+++ b/db/docs/ci_runner_namespaces.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_runner_namespaces
+classes:
+- Ci::RunnerNamespace
+feature_categories:
+- runner
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/0970e7b9608d6ada1c0fe45242ea092ea91068aa
+milestone: '10.8'
diff --git a/db/docs/ci_runner_projects.yml b/db/docs/ci_runner_projects.yml
new file mode 100644
index 00000000000..80e3a333999
--- /dev/null
+++ b/db/docs/ci_runner_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_runner_projects
+classes:
+- Ci::RunnerProject
+feature_categories:
+- runner
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/046b28312704f3131e72dcd2dbdacc5264d4aa62
+milestone: '8.0'
diff --git a/db/docs/ci_runners.yml b/db/docs/ci_runners.yml
new file mode 100644
index 00000000000..9725c668507
--- /dev/null
+++ b/db/docs/ci_runners.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_runners
+classes:
+- Ci::Runner
+feature_categories:
+- runner
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/046b28312704f3131e72dcd2dbdacc5264d4aa62
+milestone: '8.0'
diff --git a/db/docs/ci_running_builds.yml b/db/docs/ci_running_builds.yml
new file mode 100644
index 00000000000..5a004ac9c61
--- /dev/null
+++ b/db/docs/ci_running_builds.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_running_builds
+classes:
+- Ci::RunningBuild
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62912
+milestone: '14.0'
diff --git a/db/docs/ci_secure_files.yml b/db/docs/ci_secure_files.yml
new file mode 100644
index 00000000000..deeb24b02a5
--- /dev/null
+++ b/db/docs/ci_secure_files.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_secure_files
+classes:
+- Ci::SecureFile
+feature_categories:
+- pipeline_authoring
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77886
+milestone: '14.7'
diff --git a/db/docs/ci_sources_pipelines.yml b/db/docs/ci_sources_pipelines.yml
new file mode 100644
index 00000000000..a217d2453d7
--- /dev/null
+++ b/db/docs/ci_sources_pipelines.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_sources_pipelines
+classes:
+- Ci::Sources::Pipeline
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/163983e0d7d1dab622846441bd0dd9086c78a69f
+milestone: '9.3'
diff --git a/db/docs/ci_sources_projects.yml b/db/docs/ci_sources_projects.yml
new file mode 100644
index 00000000000..b39e3a20f03
--- /dev/null
+++ b/db/docs/ci_sources_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_sources_projects
+classes:
+- Ci::Sources::Project
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20063
+milestone: '12.9'
diff --git a/db/docs/ci_stages.yml b/db/docs/ci_stages.yml
new file mode 100644
index 00000000000..9c71193dfd4
--- /dev/null
+++ b/db/docs/ci_stages.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_stages
+classes:
+- Ci::Stage
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/acc22a8422cd1471819510aa375c455b5ea009c5
+milestone: '9.3'
diff --git a/db/docs/ci_subscriptions_projects.yml b/db/docs/ci_subscriptions_projects.yml
new file mode 100644
index 00000000000..0e55c95d6bb
--- /dev/null
+++ b/db/docs/ci_subscriptions_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_subscriptions_projects
+classes:
+- Ci::Subscriptions::Project
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18678
+milestone: '12.5'
diff --git a/db/docs/ci_trigger_requests.yml b/db/docs/ci_trigger_requests.yml
new file mode 100644
index 00000000000..25360f81f50
--- /dev/null
+++ b/db/docs/ci_trigger_requests.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_trigger_requests
+classes:
+- Ci::TriggerRequest
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/046b28312704f3131e72dcd2dbdacc5264d4aa62
+milestone: '8.0'
diff --git a/db/docs/ci_triggers.yml b/db/docs/ci_triggers.yml
new file mode 100644
index 00000000000..c0e556b481c
--- /dev/null
+++ b/db/docs/ci_triggers.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_triggers
+classes:
+- Ci::Trigger
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/046b28312704f3131e72dcd2dbdacc5264d4aa62
+milestone: '8.0'
diff --git a/db/docs/ci_unit_test_failures.yml b/db/docs/ci_unit_test_failures.yml
new file mode 100644
index 00000000000..14f66f5c586
--- /dev/null
+++ b/db/docs/ci_unit_test_failures.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_unit_test_failures
+classes:
+- Ci::UnitTestFailure
+feature_categories:
+- code_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56137
+milestone: '13.11'
diff --git a/db/docs/ci_unit_tests.yml b/db/docs/ci_unit_tests.yml
new file mode 100644
index 00000000000..f80372511c4
--- /dev/null
+++ b/db/docs/ci_unit_tests.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_unit_tests
+classes:
+- Ci::UnitTest
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56137
+milestone: '13.11'
diff --git a/db/docs/ci_variables.yml b/db/docs/ci_variables.yml
new file mode 100644
index 00000000000..2636ff2aa30
--- /dev/null
+++ b/db/docs/ci_variables.yml
@@ -0,0 +1,9 @@
+---
+table_name: ci_variables
+classes:
+- Ci::Variable
+feature_categories:
+- pipeline_authoring
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/046b28312704f3131e72dcd2dbdacc5264d4aa62
+milestone: '8.0'
diff --git a/db/docs/cluster_agent_tokens.yml b/db/docs/cluster_agent_tokens.yml
new file mode 100644
index 00000000000..9f8827ffe66
--- /dev/null
+++ b/db/docs/cluster_agent_tokens.yml
@@ -0,0 +1,9 @@
+---
+table_name: cluster_agent_tokens
+classes:
+- Clusters::AgentToken
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.3'
diff --git a/db/docs/cluster_agents.yml b/db/docs/cluster_agents.yml
new file mode 100644
index 00000000000..adeda8df3e5
--- /dev/null
+++ b/db/docs/cluster_agents.yml
@@ -0,0 +1,9 @@
+---
+table_name: cluster_agents
+classes:
+- Clusters::Agent
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.3'
diff --git a/db/docs/cluster_groups.yml b/db/docs/cluster_groups.yml
new file mode 100644
index 00000000000..0df250586a7
--- /dev/null
+++ b/db/docs/cluster_groups.yml
@@ -0,0 +1,9 @@
+---
+table_name: cluster_groups
+classes:
+- Clusters::Group
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/0e15eec86d83cbdfefe17966bf5c02e4d419a34d
+milestone: '11.5'
diff --git a/db/docs/cluster_platforms_kubernetes.yml b/db/docs/cluster_platforms_kubernetes.yml
new file mode 100644
index 00000000000..7571ef7d546
--- /dev/null
+++ b/db/docs/cluster_platforms_kubernetes.yml
@@ -0,0 +1,9 @@
+---
+table_name: cluster_platforms_kubernetes
+classes:
+- Clusters::Platforms::Kubernetes
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d0cff7f5855f91b5479f9fdaa39d8d95ec691a9e
+milestone: '10.2'
diff --git a/db/docs/cluster_projects.yml b/db/docs/cluster_projects.yml
new file mode 100644
index 00000000000..ecc7680a205
--- /dev/null
+++ b/db/docs/cluster_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: cluster_projects
+classes:
+- Clusters::Project
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d0cff7f5855f91b5479f9fdaa39d8d95ec691a9e
+milestone: '10.2'
diff --git a/db/docs/cluster_providers_aws.yml b/db/docs/cluster_providers_aws.yml
new file mode 100644
index 00000000000..21a698c882a
--- /dev/null
+++ b/db/docs/cluster_providers_aws.yml
@@ -0,0 +1,9 @@
+---
+table_name: cluster_providers_aws
+classes:
+- Clusters::Providers::Aws
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17057
+milestone: '12.4'
diff --git a/db/docs/cluster_providers_gcp.yml b/db/docs/cluster_providers_gcp.yml
new file mode 100644
index 00000000000..7aa02089e6c
--- /dev/null
+++ b/db/docs/cluster_providers_gcp.yml
@@ -0,0 +1,9 @@
+---
+table_name: cluster_providers_gcp
+classes:
+- Clusters::Providers::Gcp
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d0cff7f5855f91b5479f9fdaa39d8d95ec691a9e
+milestone: '10.2'
diff --git a/db/docs/clusters.yml b/db/docs/clusters.yml
new file mode 100644
index 00000000000..142186e4410
--- /dev/null
+++ b/db/docs/clusters.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters
+classes:
+- Clusters::Cluster
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d0cff7f5855f91b5479f9fdaa39d8d95ec691a9e
+milestone: '10.1'
diff --git a/db/docs/clusters_applications_cert_managers.yml b/db/docs/clusters_applications_cert_managers.yml
new file mode 100644
index 00000000000..5b75dceb08e
--- /dev/null
+++ b/db/docs/clusters_applications_cert_managers.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_cert_managers
+classes:
+- Clusters::Applications::CertManager
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8837519445c319a699e0f3ced1c6912c839f3389
+milestone: '11.6'
diff --git a/db/docs/clusters_applications_cilium.yml b/db/docs/clusters_applications_cilium.yml
new file mode 100644
index 00000000000..f91ed18fdbc
--- /dev/null
+++ b/db/docs/clusters_applications_cilium.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_cilium
+classes:
+- Clusters::Applications::Cilium
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/clusters_applications_crossplane.yml b/db/docs/clusters_applications_crossplane.yml
new file mode 100644
index 00000000000..8bc2dde17f3
--- /dev/null
+++ b/db/docs/clusters_applications_crossplane.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_crossplane
+classes:
+- Clusters::Applications::Crossplane
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18797
+milestone: '12.5'
diff --git a/db/docs/clusters_applications_elastic_stacks.yml b/db/docs/clusters_applications_elastic_stacks.yml
new file mode 100644
index 00000000000..1b1aa716afe
--- /dev/null
+++ b/db/docs/clusters_applications_elastic_stacks.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_elastic_stacks
+classes:
+- Clusters::Applications::ElasticStack
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18015
+milestone: '12.5'
diff --git a/db/docs/clusters_applications_helm.yml b/db/docs/clusters_applications_helm.yml
new file mode 100644
index 00000000000..18bc1fa82b4
--- /dev/null
+++ b/db/docs/clusters_applications_helm.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_helm
+classes:
+- Clusters::Applications::Helm
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/64be8d70ae20928df351e495a3442bb6036bc3e7
+milestone: '10.2'
diff --git a/db/docs/clusters_applications_ingress.yml b/db/docs/clusters_applications_ingress.yml
new file mode 100644
index 00000000000..686b01e9bdb
--- /dev/null
+++ b/db/docs/clusters_applications_ingress.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_ingress
+classes:
+- Clusters::Applications::Ingress
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d8223468ae2ae061020cc26336c51dc93cc75571
+milestone: '10.2'
diff --git a/db/docs/clusters_applications_jupyter.yml b/db/docs/clusters_applications_jupyter.yml
new file mode 100644
index 00000000000..bf793d9411e
--- /dev/null
+++ b/db/docs/clusters_applications_jupyter.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_jupyter
+classes:
+- Clusters::Applications::Jupyter
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/db9f765852d9fef464e69c0bf47a382f2ab7219d
+milestone: '11.0'
diff --git a/db/docs/clusters_applications_knative.yml b/db/docs/clusters_applications_knative.yml
new file mode 100644
index 00000000000..a30df20c5cf
--- /dev/null
+++ b/db/docs/clusters_applications_knative.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_knative
+classes:
+- Clusters::Applications::Knative
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/b5155b90ee233e2824c168fbb06b3ce5d3aeb194
+milestone: '11.5'
diff --git a/db/docs/clusters_applications_prometheus.yml b/db/docs/clusters_applications_prometheus.yml
new file mode 100644
index 00000000000..5118d286ffc
--- /dev/null
+++ b/db/docs/clusters_applications_prometheus.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_prometheus
+classes:
+- Clusters::Applications::Prometheus
+feature_categories:
+- container_network_security
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/0d4548026f3060ca0a8f7aa8d8fc89838bc66130
+milestone: '10.4'
diff --git a/db/docs/clusters_applications_runners.yml b/db/docs/clusters_applications_runners.yml
new file mode 100644
index 00000000000..f26302c2d3c
--- /dev/null
+++ b/db/docs/clusters_applications_runners.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_applications_runners
+classes:
+- Clusters::Applications::Runner
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/c607008ee55e35465e04a938a341f2f24cb6761f
+milestone: '10.6'
diff --git a/db/docs/clusters_integration_elasticstack.yml b/db/docs/clusters_integration_elasticstack.yml
new file mode 100644
index 00000000000..3536501c54d
--- /dev/null
+++ b/db/docs/clusters_integration_elasticstack.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_integration_elasticstack
+classes:
+- Clusters::Integrations::ElasticStack
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61077
+milestone: '13.12'
diff --git a/db/docs/clusters_integration_prometheus.yml b/db/docs/clusters_integration_prometheus.yml
new file mode 100644
index 00000000000..78a1933a931
--- /dev/null
+++ b/db/docs/clusters_integration_prometheus.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_integration_prometheus
+classes:
+- Clusters::Integrations::Prometheus
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59091
+milestone: '13.11'
diff --git a/db/docs/clusters_kubernetes_namespaces.yml b/db/docs/clusters_kubernetes_namespaces.yml
new file mode 100644
index 00000000000..5027b6f27b4
--- /dev/null
+++ b/db/docs/clusters_kubernetes_namespaces.yml
@@ -0,0 +1,9 @@
+---
+table_name: clusters_kubernetes_namespaces
+classes:
+- Clusters::KubernetesNamespace
+feature_categories:
+- kubernetes_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e3ca493876ab71ed29817a0af436fc563f564bbe
+milestone: '11.5'
diff --git a/db/docs/commit_user_mentions.yml b/db/docs/commit_user_mentions.yml
new file mode 100644
index 00000000000..96a269dcd6a
--- /dev/null
+++ b/db/docs/commit_user_mentions.yml
@@ -0,0 +1,9 @@
+---
+table_name: commit_user_mentions
+classes:
+- CommitUserMention
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
+milestone: '12.6'
diff --git a/db/docs/compliance_management_frameworks.yml b/db/docs/compliance_management_frameworks.yml
new file mode 100644
index 00000000000..edf89095593
--- /dev/null
+++ b/db/docs/compliance_management_frameworks.yml
@@ -0,0 +1,9 @@
+---
+table_name: compliance_management_frameworks
+classes:
+- ComplianceManagement::Framework
+feature_categories:
+- compliance_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44098
+milestone: '13.5'
diff --git a/db/docs/container_expiration_policies.yml b/db/docs/container_expiration_policies.yml
new file mode 100644
index 00000000000..e3b3e8598cd
--- /dev/null
+++ b/db/docs/container_expiration_policies.yml
@@ -0,0 +1,9 @@
+---
+table_name: container_expiration_policies
+classes:
+- ContainerExpirationPolicy
+feature_categories:
+- container_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20412
+milestone: '12.6'
diff --git a/db/docs/container_repositories.yml b/db/docs/container_repositories.yml
new file mode 100644
index 00000000000..d3fa52f5126
--- /dev/null
+++ b/db/docs/container_repositories.yml
@@ -0,0 +1,9 @@
+---
+table_name: container_repositories
+classes:
+- ContainerRepository
+feature_categories:
+- container_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/01d159b409d8b24d36204979a73de249843d71bf
+milestone: '9.1'
diff --git a/db/docs/content_blocked_states.yml b/db/docs/content_blocked_states.yml
new file mode 100644
index 00000000000..c2c4118b534
--- /dev/null
+++ b/db/docs/content_blocked_states.yml
@@ -0,0 +1,8 @@
+---
+table_name: content_blocked_states
+classes: []
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72124
+milestone: '14.5'
diff --git a/db/docs/conversational_development_index_metrics.yml b/db/docs/conversational_development_index_metrics.yml
new file mode 100644
index 00000000000..fb96c376953
--- /dev/null
+++ b/db/docs/conversational_development_index_metrics.yml
@@ -0,0 +1,9 @@
+---
+table_name: conversational_development_index_metrics
+classes:
+- DevOpsReport::Metric
+feature_categories:
+- devops_reports
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/26dde5f55f1dac2e6bea4f7e1dfa51c72dc756cb
+milestone: '9.3'
diff --git a/db/docs/coverage_fuzzing_corpuses.yml b/db/docs/coverage_fuzzing_corpuses.yml
new file mode 100644
index 00000000000..1ea6737dac8
--- /dev/null
+++ b/db/docs/coverage_fuzzing_corpuses.yml
@@ -0,0 +1,9 @@
+---
+table_name: coverage_fuzzing_corpuses
+classes:
+- AppSec::Fuzzing::Coverage::Corpus
+feature_categories:
+- code_quality
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71704
+milestone: '14.4'
diff --git a/db/docs/csv_issue_imports.yml b/db/docs/csv_issue_imports.yml
new file mode 100644
index 00000000000..8d0968f78e0
--- /dev/null
+++ b/db/docs/csv_issue_imports.yml
@@ -0,0 +1,9 @@
+---
+table_name: csv_issue_imports
+classes:
+- Issues::CsvImport
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44742
+milestone: '13.6'
diff --git a/db/docs/custom_emoji.yml b/db/docs/custom_emoji.yml
new file mode 100644
index 00000000000..1a290153544
--- /dev/null
+++ b/db/docs/custom_emoji.yml
@@ -0,0 +1,9 @@
+---
+table_name: custom_emoji
+classes:
+- CustomEmoji
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/customer_relations_contacts.yml b/db/docs/customer_relations_contacts.yml
new file mode 100644
index 00000000000..409295f037d
--- /dev/null
+++ b/db/docs/customer_relations_contacts.yml
@@ -0,0 +1,9 @@
+---
+table_name: customer_relations_contacts
+classes:
+- CustomerRelations::Contact
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67985
+milestone: '14.3'
diff --git a/db/docs/customer_relations_organizations.yml b/db/docs/customer_relations_organizations.yml
new file mode 100644
index 00000000000..18a6709b4f3
--- /dev/null
+++ b/db/docs/customer_relations_organizations.yml
@@ -0,0 +1,9 @@
+---
+table_name: customer_relations_organizations
+classes:
+- CustomerRelations::Organization
+feature_categories:
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67551
+milestone: '14.2'
diff --git a/db/docs/dast_profile_schedules.yml b/db/docs/dast_profile_schedules.yml
new file mode 100644
index 00000000000..088fba68cf4
--- /dev/null
+++ b/db/docs/dast_profile_schedules.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_profile_schedules
+classes:
+- Dast::ProfileSchedule
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65327
+milestone: '14.2'
diff --git a/db/docs/dast_profiles.yml b/db/docs/dast_profiles.yml
new file mode 100644
index 00000000000..bc0791d2a43
--- /dev/null
+++ b/db/docs/dast_profiles.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_profiles
+classes:
+- Dast::Profile
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51296
+milestone: '13.9'
diff --git a/db/docs/dast_profiles_pipelines.yml b/db/docs/dast_profiles_pipelines.yml
new file mode 100644
index 00000000000..a457d0df726
--- /dev/null
+++ b/db/docs/dast_profiles_pipelines.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_profiles_pipelines
+classes:
+- Dast::ProfilesPipeline
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56821
+milestone: '13.11'
diff --git a/db/docs/dast_scanner_profiles.yml b/db/docs/dast_scanner_profiles.yml
new file mode 100644
index 00000000000..813029bde9a
--- /dev/null
+++ b/db/docs/dast_scanner_profiles.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_scanner_profiles
+classes:
+- DastScannerProfile
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.3'
diff --git a/db/docs/dast_scanner_profiles_builds.yml b/db/docs/dast_scanner_profiles_builds.yml
new file mode 100644
index 00000000000..f1edbb0df26
--- /dev/null
+++ b/db/docs/dast_scanner_profiles_builds.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_scanner_profiles_builds
+classes:
+- Dast::ScannerProfilesBuild
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63362
+milestone: '14.1'
diff --git a/db/docs/dast_site_profile_secret_variables.yml b/db/docs/dast_site_profile_secret_variables.yml
new file mode 100644
index 00000000000..6f99739e9ae
--- /dev/null
+++ b/db/docs/dast_site_profile_secret_variables.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_site_profile_secret_variables
+classes:
+- Dast::SiteProfileSecretVariable
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56067
+milestone: '13.11'
diff --git a/db/docs/dast_site_profiles.yml b/db/docs/dast_site_profiles.yml
new file mode 100644
index 00000000000..e2ce0676d8d
--- /dev/null
+++ b/db/docs/dast_site_profiles.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_site_profiles
+classes:
+- DastSiteProfile
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/dast_site_profiles_builds.yml b/db/docs/dast_site_profiles_builds.yml
new file mode 100644
index 00000000000..31ec6e37c89
--- /dev/null
+++ b/db/docs/dast_site_profiles_builds.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_site_profiles_builds
+classes:
+- Dast::SiteProfilesBuild
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63362
+milestone: '14.1'
diff --git a/db/docs/dast_site_profiles_pipelines.yml b/db/docs/dast_site_profiles_pipelines.yml
new file mode 100644
index 00000000000..ed5c0b78f6c
--- /dev/null
+++ b/db/docs/dast_site_profiles_pipelines.yml
@@ -0,0 +1,8 @@
+---
+table_name: dast_site_profiles_pipelines
+classes: []
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60090
+milestone: '13.12'
diff --git a/db/docs/dast_site_tokens.yml b/db/docs/dast_site_tokens.yml
new file mode 100644
index 00000000000..ce8af8e6fd1
--- /dev/null
+++ b/db/docs/dast_site_tokens.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_site_tokens
+classes:
+- DastSiteToken
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/dast_site_validations.yml b/db/docs/dast_site_validations.yml
new file mode 100644
index 00000000000..9d4a73d1d52
--- /dev/null
+++ b/db/docs/dast_site_validations.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_site_validations
+classes:
+- DastSiteValidation
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/dast_sites.yml b/db/docs/dast_sites.yml
new file mode 100644
index 00000000000..6513a66eb8a
--- /dev/null
+++ b/db/docs/dast_sites.yml
@@ -0,0 +1,9 @@
+---
+table_name: dast_sites
+classes:
+- DastSite
+feature_categories:
+- dynamic_application_security_testing
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/dependency_proxy_blobs.yml b/db/docs/dependency_proxy_blobs.yml
new file mode 100644
index 00000000000..2d09d624fc5
--- /dev/null
+++ b/db/docs/dependency_proxy_blobs.yml
@@ -0,0 +1,9 @@
+---
+table_name: dependency_proxy_blobs
+classes:
+- DependencyProxy::Blob
+feature_categories:
+- dependency_proxy
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/10676
+milestone: '11.11'
diff --git a/db/docs/dependency_proxy_group_settings.yml b/db/docs/dependency_proxy_group_settings.yml
new file mode 100644
index 00000000000..854d79f9be5
--- /dev/null
+++ b/db/docs/dependency_proxy_group_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: dependency_proxy_group_settings
+classes:
+- DependencyProxy::GroupSetting
+feature_categories:
+- dependency_proxy
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/10676
+milestone: '11.11'
diff --git a/db/docs/dependency_proxy_image_ttl_group_policies.yml b/db/docs/dependency_proxy_image_ttl_group_policies.yml
new file mode 100644
index 00000000000..d9c7af2e37d
--- /dev/null
+++ b/db/docs/dependency_proxy_image_ttl_group_policies.yml
@@ -0,0 +1,9 @@
+---
+table_name: dependency_proxy_image_ttl_group_policies
+classes:
+- DependencyProxy::ImageTtlGroupPolicy
+feature_categories:
+- dependency_proxy
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68809
+milestone: '14.3'
diff --git a/db/docs/dependency_proxy_manifests.yml b/db/docs/dependency_proxy_manifests.yml
new file mode 100644
index 00000000000..eaaac522646
--- /dev/null
+++ b/db/docs/dependency_proxy_manifests.yml
@@ -0,0 +1,9 @@
+---
+table_name: dependency_proxy_manifests
+classes:
+- DependencyProxy::Manifest
+feature_categories:
+- dependency_proxy
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48727
+milestone: '13.7'
diff --git a/db/docs/deploy_keys_projects.yml b/db/docs/deploy_keys_projects.yml
new file mode 100644
index 00000000000..42d5c520db2
--- /dev/null
+++ b/db/docs/deploy_keys_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: deploy_keys_projects
+classes:
+- DeployKeysProject
+feature_categories:
+- continuous_delivery
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/a735ce2aa7da72242629a4452c33e7a1900fdd62
+milestone: "<6.0"
diff --git a/db/docs/deploy_tokens.yml b/db/docs/deploy_tokens.yml
new file mode 100644
index 00000000000..b39ccdef9e8
--- /dev/null
+++ b/db/docs/deploy_tokens.yml
@@ -0,0 +1,9 @@
+---
+table_name: deploy_tokens
+classes:
+- DeployToken
+feature_categories:
+- continuous_delivery
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/db18993f652425b72c4b854e18a002e0ec44b196
+milestone: '10.7'
diff --git a/db/docs/deployment_approvals.yml b/db/docs/deployment_approvals.yml
new file mode 100644
index 00000000000..3c04bff052a
--- /dev/null
+++ b/db/docs/deployment_approvals.yml
@@ -0,0 +1,9 @@
+---
+table_name: deployment_approvals
+classes:
+- Deployments::Approval
+feature_categories:
+- advanced_deployments
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74932
+milestone: '14.6'
diff --git a/db/docs/deployment_clusters.yml b/db/docs/deployment_clusters.yml
new file mode 100644
index 00000000000..454c93b34a1
--- /dev/null
+++ b/db/docs/deployment_clusters.yml
@@ -0,0 +1,9 @@
+---
+table_name: deployment_clusters
+classes:
+- DeploymentCluster
+feature_categories:
+- deployment_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24235
+milestone: '12.8'
diff --git a/db/docs/deployment_merge_requests.yml b/db/docs/deployment_merge_requests.yml
new file mode 100644
index 00000000000..33bce15b5c8
--- /dev/null
+++ b/db/docs/deployment_merge_requests.yml
@@ -0,0 +1,9 @@
+---
+table_name: deployment_merge_requests
+classes:
+- DeploymentMergeRequest
+feature_categories:
+- advanced_deployments
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18755
+milestone: '12.5'
diff --git a/db/docs/deployments.yml b/db/docs/deployments.yml
new file mode 100644
index 00000000000..c5e402fb15f
--- /dev/null
+++ b/db/docs/deployments.yml
@@ -0,0 +1,9 @@
+---
+table_name: deployments
+classes:
+- Deployment
+feature_categories:
+- continuous_delivery
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/907c0e6796b69f9577c147dd489cf55748c749ac
+milestone: '8.9'
diff --git a/db/docs/description_versions.yml b/db/docs/description_versions.yml
new file mode 100644
index 00000000000..868193ff26c
--- /dev/null
+++ b/db/docs/description_versions.yml
@@ -0,0 +1,9 @@
+---
+table_name: description_versions
+classes:
+- DescriptionVersion
+feature_categories:
+- design_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17147
+milestone: '12.4'
diff --git a/db/docs/design_management_designs.yml b/db/docs/design_management_designs.yml
new file mode 100644
index 00000000000..50ddf7ce806
--- /dev/null
+++ b/db/docs/design_management_designs.yml
@@ -0,0 +1,9 @@
+---
+table_name: design_management_designs
+classes:
+- DesignManagement::Design
+feature_categories:
+- design_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9801
+milestone: '11.10'
diff --git a/db/docs/design_management_designs_versions.yml b/db/docs/design_management_designs_versions.yml
new file mode 100644
index 00000000000..030efb93696
--- /dev/null
+++ b/db/docs/design_management_designs_versions.yml
@@ -0,0 +1,9 @@
+---
+table_name: design_management_designs_versions
+classes:
+- DesignManagement::Action
+feature_categories:
+- design_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/10552
+milestone: '11.10'
diff --git a/db/docs/design_management_versions.yml b/db/docs/design_management_versions.yml
new file mode 100644
index 00000000000..64fdfcb11d7
--- /dev/null
+++ b/db/docs/design_management_versions.yml
@@ -0,0 +1,9 @@
+---
+table_name: design_management_versions
+classes:
+- DesignManagement::Version
+feature_categories:
+- design_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9801
+milestone: '11.10'
diff --git a/db/docs/design_user_mentions.yml b/db/docs/design_user_mentions.yml
new file mode 100644
index 00000000000..e2a9cd2c03e
--- /dev/null
+++ b/db/docs/design_user_mentions.yml
@@ -0,0 +1,9 @@
+---
+table_name: design_user_mentions
+classes:
+- DesignUserMention
+feature_categories:
+- design_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
+milestone: '12.6'
diff --git a/db/docs/detached_partitions.yml b/db/docs/detached_partitions.yml
new file mode 100644
index 00000000000..7563576c996
--- /dev/null
+++ b/db/docs/detached_partitions.yml
@@ -0,0 +1,17 @@
+---
+table_name: detached_partitions
+classes:
+- Postgresql::DetachedPartition
+feature_categories:
+- database
+description: >
+ The detached_partitions table stores information about partitions in the gitlab_partitions_dynamic schema that
+ have been scheduled for drop, but not yet dropped.
+
+ These partitions were created by the Gitlab::Database::Partitioning::PartitionManager, and then detached from their
+ parent tables and added to this table when no longer part of the active partition set. Partitions are scheduled for
+ deletion one week after detachment.
+
+ Rows in this table are processed by Database::DropDetachedPartitionsWorker, which runs once a day.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67056
+milestone: '14.2'
diff --git a/db/docs/diff_note_positions.yml b/db/docs/diff_note_positions.yml
new file mode 100644
index 00000000000..274c34ed72e
--- /dev/null
+++ b/db/docs/diff_note_positions.yml
@@ -0,0 +1,9 @@
+---
+table_name: diff_note_positions
+classes:
+- DiffNotePosition
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/dora_daily_metrics.yml b/db/docs/dora_daily_metrics.yml
new file mode 100644
index 00000000000..210af9f6472
--- /dev/null
+++ b/db/docs/dora_daily_metrics.yml
@@ -0,0 +1,9 @@
+---
+table_name: dora_daily_metrics
+classes:
+- Dora::DailyMetrics
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55473
+milestone: '13.10'
diff --git a/db/docs/draft_notes.yml b/db/docs/draft_notes.yml
new file mode 100644
index 00000000000..685dd01f3bb
--- /dev/null
+++ b/db/docs/draft_notes.yml
@@ -0,0 +1,11 @@
+---
+table_name: draft_notes
+classes:
+- DraftNote
+feature_categories:
+- projects
+- source_code_management
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4213
+milestone: '11.4'
diff --git a/db/docs/elastic_index_settings.yml b/db/docs/elastic_index_settings.yml
new file mode 100644
index 00000000000..61093803d35
--- /dev/null
+++ b/db/docs/elastic_index_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: elastic_index_settings
+classes:
+- Elastic::IndexSetting
+feature_categories:
+- global_search
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56344
+milestone: '13.11'
diff --git a/db/docs/elastic_reindexing_slices.yml b/db/docs/elastic_reindexing_slices.yml
new file mode 100644
index 00000000000..0829431270d
--- /dev/null
+++ b/db/docs/elastic_reindexing_slices.yml
@@ -0,0 +1,9 @@
+---
+table_name: elastic_reindexing_slices
+classes:
+- Elastic::ReindexingSlice
+feature_categories:
+- memory
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55681
+milestone: '13.12'
diff --git a/db/docs/elastic_reindexing_subtasks.yml b/db/docs/elastic_reindexing_subtasks.yml
new file mode 100644
index 00000000000..85f540cfb41
--- /dev/null
+++ b/db/docs/elastic_reindexing_subtasks.yml
@@ -0,0 +1,9 @@
+---
+table_name: elastic_reindexing_subtasks
+classes:
+- Elastic::ReindexingSubtask
+feature_categories:
+- global_search
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48334
+milestone: '13.8'
diff --git a/db/docs/elastic_reindexing_tasks.yml b/db/docs/elastic_reindexing_tasks.yml
new file mode 100644
index 00000000000..640d57ea4df
--- /dev/null
+++ b/db/docs/elastic_reindexing_tasks.yml
@@ -0,0 +1,9 @@
+---
+table_name: elastic_reindexing_tasks
+classes:
+- Elastic::ReindexingTask
+feature_categories:
+- global_search
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/elasticsearch_indexed_namespaces.yml b/db/docs/elasticsearch_indexed_namespaces.yml
new file mode 100644
index 00000000000..ca854727c12
--- /dev/null
+++ b/db/docs/elasticsearch_indexed_namespaces.yml
@@ -0,0 +1,9 @@
+---
+table_name: elasticsearch_indexed_namespaces
+classes:
+- ElasticsearchIndexedNamespace
+feature_categories:
+- global_search
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9861
+milestone: '11.10'
diff --git a/db/docs/elasticsearch_indexed_projects.yml b/db/docs/elasticsearch_indexed_projects.yml
new file mode 100644
index 00000000000..3703f7a0c6b
--- /dev/null
+++ b/db/docs/elasticsearch_indexed_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: elasticsearch_indexed_projects
+classes:
+- ElasticsearchIndexedProject
+feature_categories:
+- memory
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9861
+milestone: '11.10'
diff --git a/db/docs/emails.yml b/db/docs/emails.yml
new file mode 100644
index 00000000000..db08ba6e458
--- /dev/null
+++ b/db/docs/emails.yml
@@ -0,0 +1,9 @@
+---
+table_name: emails
+classes:
+- Email
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/29cfd33d949d21d67f3892473c24d4f0a127dfe6
+milestone: '6.6'
diff --git a/db/docs/environments.yml b/db/docs/environments.yml
new file mode 100644
index 00000000000..eb27637f1d5
--- /dev/null
+++ b/db/docs/environments.yml
@@ -0,0 +1,9 @@
+---
+table_name: environments
+classes:
+- Environment
+feature_categories:
+- continuous_delivery
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/907c0e6796b69f9577c147dd489cf55748c749ac
+milestone: '8.9'
diff --git a/db/docs/epic_issues.yml b/db/docs/epic_issues.yml
new file mode 100644
index 00000000000..2424213279b
--- /dev/null
+++ b/db/docs/epic_issues.yml
@@ -0,0 +1,9 @@
+---
+table_name: epic_issues
+classes:
+- EpicIssue
+feature_categories:
+- portfolio_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3302
+milestone: '10.2'
diff --git a/db/docs/epic_metrics.yml b/db/docs/epic_metrics.yml
new file mode 100644
index 00000000000..4cb6ea86ba2
--- /dev/null
+++ b/db/docs/epic_metrics.yml
@@ -0,0 +1,9 @@
+---
+table_name: epic_metrics
+classes:
+- Epic::Metrics
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3126
+milestone: '10.2'
diff --git a/db/docs/epic_user_mentions.yml b/db/docs/epic_user_mentions.yml
new file mode 100644
index 00000000000..15caca9e58b
--- /dev/null
+++ b/db/docs/epic_user_mentions.yml
@@ -0,0 +1,9 @@
+---
+table_name: epic_user_mentions
+classes:
+- EpicUserMention
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
+milestone: '12.6'
diff --git a/db/docs/epics.yml b/db/docs/epics.yml
new file mode 100644
index 00000000000..94f33026b1e
--- /dev/null
+++ b/db/docs/epics.yml
@@ -0,0 +1,9 @@
+---
+table_name: epics
+classes:
+- Epic
+feature_categories:
+- portfolio_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3126
+milestone: '10.2'
diff --git a/db/docs/error_tracking_client_keys.yml b/db/docs/error_tracking_client_keys.yml
new file mode 100644
index 00000000000..b9c7b74f0a3
--- /dev/null
+++ b/db/docs/error_tracking_client_keys.yml
@@ -0,0 +1,9 @@
+---
+table_name: error_tracking_client_keys
+classes:
+- ErrorTracking::ClientKey
+feature_categories:
+- error_tracking
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66466
+milestone: '14.2'
diff --git a/db/docs/error_tracking_error_events.yml b/db/docs/error_tracking_error_events.yml
new file mode 100644
index 00000000000..19a7f1cbfe8
--- /dev/null
+++ b/db/docs/error_tracking_error_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: error_tracking_error_events
+classes:
+- ErrorTracking::ErrorEvent
+feature_categories:
+- error_tracking
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/2d1c197ab0bf10071cb52e579edd3808cb0adc21
+milestone: '14.1'
diff --git a/db/docs/error_tracking_errors.yml b/db/docs/error_tracking_errors.yml
new file mode 100644
index 00000000000..b348d47c77f
--- /dev/null
+++ b/db/docs/error_tracking_errors.yml
@@ -0,0 +1,9 @@
+---
+table_name: error_tracking_errors
+classes:
+- ErrorTracking::Error
+feature_categories:
+- error_tracking
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/2d1c197ab0bf10071cb52e579edd3808cb0adc21
+milestone: '14.1'
diff --git a/db/docs/events.yml b/db/docs/events.yml
new file mode 100644
index 00000000000..9ad923a25c7
--- /dev/null
+++ b/db/docs/events.yml
@@ -0,0 +1,10 @@
+---
+table_name: events
+classes:
+- Event
+- PushEvent
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/a847501fd2ffc1c4becc7d0d352d80168d9b3568
+milestone: "<6.0"
diff --git a/db/docs/evidences.yml b/db/docs/evidences.yml
new file mode 100644
index 00000000000..6440681feec
--- /dev/null
+++ b/db/docs/evidences.yml
@@ -0,0 +1,9 @@
+---
+table_name: evidences
+classes:
+- Releases::Evidence
+feature_categories:
+- release_evidence
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17217
+milestone: '12.4'
diff --git a/db/docs/experiment_subjects.yml b/db/docs/experiment_subjects.yml
new file mode 100644
index 00000000000..85546028cd1
--- /dev/null
+++ b/db/docs/experiment_subjects.yml
@@ -0,0 +1,9 @@
+---
+table_name: experiment_subjects
+classes:
+- ExperimentSubject
+feature_categories:
+- experimentation_conversion
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47042
+milestone: '13.7'
diff --git a/db/docs/experiment_users.yml b/db/docs/experiment_users.yml
new file mode 100644
index 00000000000..a136f212a1f
--- /dev/null
+++ b/db/docs/experiment_users.yml
@@ -0,0 +1,9 @@
+---
+table_name: experiment_users
+classes:
+- ExperimentUser
+feature_categories:
+- experimentation_conversion
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.3'
diff --git a/db/docs/experiments.yml b/db/docs/experiments.yml
new file mode 100644
index 00000000000..496c0a7644c
--- /dev/null
+++ b/db/docs/experiments.yml
@@ -0,0 +1,9 @@
+---
+table_name: experiments
+classes:
+- Experiment
+feature_categories:
+- experimentation_expansion
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.3'
diff --git a/db/docs/external_approval_rules.yml b/db/docs/external_approval_rules.yml
new file mode 100644
index 00000000000..ac44d0e6c48
--- /dev/null
+++ b/db/docs/external_approval_rules.yml
@@ -0,0 +1,8 @@
+---
+table_name: external_approval_rules
+classes: []
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54002
+milestone: '13.10'
diff --git a/db/docs/external_approval_rules_protected_branches.yml b/db/docs/external_approval_rules_protected_branches.yml
new file mode 100644
index 00000000000..ca498fe82ca
--- /dev/null
+++ b/db/docs/external_approval_rules_protected_branches.yml
@@ -0,0 +1,8 @@
+---
+table_name: external_approval_rules_protected_branches
+classes: []
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54002
+milestone: '13.10'
diff --git a/db/docs/external_pull_requests.yml b/db/docs/external_pull_requests.yml
new file mode 100644
index 00000000000..c8864dabfdc
--- /dev/null
+++ b/db/docs/external_pull_requests.yml
@@ -0,0 +1,9 @@
+---
+table_name: external_pull_requests
+classes:
+- ExternalPullRequest
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/ca6a1f33f91a8cceadebfb9c4e9ac6afa340f71d
+milestone: '12.3'
diff --git a/db/docs/external_status_checks.yml b/db/docs/external_status_checks.yml
new file mode 100644
index 00000000000..fd9fe357173
--- /dev/null
+++ b/db/docs/external_status_checks.yml
@@ -0,0 +1,9 @@
+---
+table_name: external_status_checks
+classes:
+- MergeRequests::ExternalStatusCheck
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62186
+milestone: '14.0'
diff --git a/db/docs/external_status_checks_protected_branches.yml b/db/docs/external_status_checks_protected_branches.yml
new file mode 100644
index 00000000000..34f4edabb5d
--- /dev/null
+++ b/db/docs/external_status_checks_protected_branches.yml
@@ -0,0 +1,8 @@
+---
+table_name: external_status_checks_protected_branches
+classes: []
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62186
+milestone: '14.0'
diff --git a/db/docs/feature_gates.yml b/db/docs/feature_gates.yml
new file mode 100644
index 00000000000..5f405ed0f1a
--- /dev/null
+++ b/db/docs/feature_gates.yml
@@ -0,0 +1,10 @@
+---
+table_name: feature_gates
+classes:
+- Feature::FlipperGate
+- Flipper::Adapters::ActiveRecord::Gate
+feature_categories:
+- feature_flags
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/671284ba375109becbfa2a288032cdc7301b157b
+milestone: '9.3'
diff --git a/db/docs/features.yml b/db/docs/features.yml
new file mode 100644
index 00000000000..82598999b9e
--- /dev/null
+++ b/db/docs/features.yml
@@ -0,0 +1,10 @@
+---
+table_name: features
+classes:
+- Feature::FlipperFeature
+- Flipper::Adapters::ActiveRecord::Feature
+feature_categories:
+- feature_flags
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/ee2d3de1a634611a1c660516c955be0d3000904b
+milestone: '8.12'
diff --git a/db/docs/fork_network_members.yml b/db/docs/fork_network_members.yml
new file mode 100644
index 00000000000..47f6150a147
--- /dev/null
+++ b/db/docs/fork_network_members.yml
@@ -0,0 +1,9 @@
+---
+table_name: fork_network_members
+classes:
+- ForkNetworkMember
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3098
+milestone: '10.1'
diff --git a/db/docs/fork_networks.yml b/db/docs/fork_networks.yml
new file mode 100644
index 00000000000..f0978b3fcc4
--- /dev/null
+++ b/db/docs/fork_networks.yml
@@ -0,0 +1,9 @@
+---
+table_name: fork_networks
+classes:
+- ForkNetwork
+feature_categories:
+- devops_reports
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3098
+milestone: '10.1'
diff --git a/db/docs/geo_cache_invalidation_events.yml b/db/docs/geo_cache_invalidation_events.yml
new file mode 100644
index 00000000000..6ae56893281
--- /dev/null
+++ b/db/docs/geo_cache_invalidation_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_cache_invalidation_events
+classes:
+- Geo::CacheInvalidationEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7738
+milestone: '11.4'
diff --git a/db/docs/geo_container_repository_updated_events.yml b/db/docs/geo_container_repository_updated_events.yml
new file mode 100644
index 00000000000..c48c60fbf10
--- /dev/null
+++ b/db/docs/geo_container_repository_updated_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_container_repository_updated_events
+classes:
+- Geo::ContainerRepositoryUpdatedEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1902d9cc74a1dc2c87fdbb39a6cdbb67092cbb5a
+milestone: '12.2'
diff --git a/db/docs/geo_event_log.yml b/db/docs/geo_event_log.yml
new file mode 100644
index 00000000000..122ded0537e
--- /dev/null
+++ b/db/docs/geo_event_log.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_event_log
+classes:
+- Geo::EventLog
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/cb6c7cbe2a9ee05cea6926e3d8c18f6aa26f4c64
+milestone: '9.3'
diff --git a/db/docs/geo_events.yml b/db/docs/geo_events.yml
new file mode 100644
index 00000000000..8a56c02d33e
--- /dev/null
+++ b/db/docs/geo_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_events
+classes:
+- Geo::Event
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23447
+milestone: '12.8'
diff --git a/db/docs/geo_hashed_storage_attachments_events.yml b/db/docs/geo_hashed_storage_attachments_events.yml
new file mode 100644
index 00000000000..6d98ea7d21b
--- /dev/null
+++ b/db/docs/geo_hashed_storage_attachments_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_hashed_storage_attachments_events
+classes:
+- Geo::HashedStorageAttachmentsEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3544
+milestone: '10.3'
diff --git a/db/docs/geo_hashed_storage_migrated_events.yml b/db/docs/geo_hashed_storage_migrated_events.yml
new file mode 100644
index 00000000000..38415c32f52
--- /dev/null
+++ b/db/docs/geo_hashed_storage_migrated_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_hashed_storage_migrated_events
+classes:
+- Geo::HashedStorageMigratedEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3066
+milestone: '10.2'
diff --git a/db/docs/geo_job_artifact_deleted_events.yml b/db/docs/geo_job_artifact_deleted_events.yml
new file mode 100644
index 00000000000..d58b0b83924
--- /dev/null
+++ b/db/docs/geo_job_artifact_deleted_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_job_artifact_deleted_events
+classes:
+- Geo::JobArtifactDeletedEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3935
+milestone: '10.4'
diff --git a/db/docs/geo_lfs_object_deleted_events.yml b/db/docs/geo_lfs_object_deleted_events.yml
new file mode 100644
index 00000000000..1bf82510ee4
--- /dev/null
+++ b/db/docs/geo_lfs_object_deleted_events.yml
@@ -0,0 +1,8 @@
+---
+table_name: geo_lfs_object_deleted_events
+classes: []
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3481
+milestone: '10.2'
diff --git a/db/docs/geo_node_namespace_links.yml b/db/docs/geo_node_namespace_links.yml
new file mode 100644
index 00000000000..6847760f494
--- /dev/null
+++ b/db/docs/geo_node_namespace_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_node_namespace_links
+classes:
+- GeoNodeNamespaceLink
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/14c6128530579ca92fa79342d4119d25bcff1f2d
+milestone: '9.5'
diff --git a/db/docs/geo_node_statuses.yml b/db/docs/geo_node_statuses.yml
new file mode 100644
index 00000000000..3a7dfe16df1
--- /dev/null
+++ b/db/docs/geo_node_statuses.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_node_statuses
+classes:
+- GeoNodeStatus
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3230
+milestone: '10.2'
diff --git a/db/docs/geo_nodes.yml b/db/docs/geo_nodes.yml
new file mode 100644
index 00000000000..143213cad96
--- /dev/null
+++ b/db/docs/geo_nodes.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_nodes
+classes:
+- GeoNode
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/5ab12ad02ed753dd933485094ba45512890f0b50
+milestone: '8.5'
diff --git a/db/docs/geo_repositories_changed_events.yml b/db/docs/geo_repositories_changed_events.yml
new file mode 100644
index 00000000000..214a4b3fe09
--- /dev/null
+++ b/db/docs/geo_repositories_changed_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_repositories_changed_events
+classes:
+- Geo::RepositoriesChangedEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/312bc703a4619b87ba2ac4e59623e7747a24502c
+milestone: '9.5'
diff --git a/db/docs/geo_repository_created_events.yml b/db/docs/geo_repository_created_events.yml
new file mode 100644
index 00000000000..22c546ac0a2
--- /dev/null
+++ b/db/docs/geo_repository_created_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_repository_created_events
+classes:
+- Geo::RepositoryCreatedEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f3eacf881659b7af97b7c7ba3289237ec6cdc1cb
+milestone: '10.0'
diff --git a/db/docs/geo_repository_deleted_events.yml b/db/docs/geo_repository_deleted_events.yml
new file mode 100644
index 00000000000..9c2b72a0172
--- /dev/null
+++ b/db/docs/geo_repository_deleted_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_repository_deleted_events
+classes:
+- Geo::RepositoryDeletedEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/04c3da24ac5975b140cf2e6a7e33414543f148f5
+milestone: '9.4'
diff --git a/db/docs/geo_repository_renamed_events.yml b/db/docs/geo_repository_renamed_events.yml
new file mode 100644
index 00000000000..431577572e3
--- /dev/null
+++ b/db/docs/geo_repository_renamed_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_repository_renamed_events
+classes:
+- Geo::RepositoryRenamedEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/6e5fa040d1c689fad4e110dd10be8ddba61ea7ef
+milestone: '9.4'
diff --git a/db/docs/geo_repository_updated_events.yml b/db/docs/geo_repository_updated_events.yml
new file mode 100644
index 00000000000..0aa83949fef
--- /dev/null
+++ b/db/docs/geo_repository_updated_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_repository_updated_events
+classes:
+- Geo::RepositoryUpdatedEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/71cc57b1e4b7721c93107357517235a18f7ba8e2
+milestone: '9.3'
diff --git a/db/docs/geo_reset_checksum_events.yml b/db/docs/geo_reset_checksum_events.yml
new file mode 100644
index 00000000000..ba56f659295
--- /dev/null
+++ b/db/docs/geo_reset_checksum_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: geo_reset_checksum_events
+classes:
+- Geo::ResetChecksumEvent
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7394
+milestone: '11.4'
diff --git a/db/docs/gitlab_subscription_histories.yml b/db/docs/gitlab_subscription_histories.yml
new file mode 100644
index 00000000000..428b17a8e85
--- /dev/null
+++ b/db/docs/gitlab_subscription_histories.yml
@@ -0,0 +1,9 @@
+---
+table_name: gitlab_subscription_histories
+classes:
+- GitlabSubscriptionHistory
+feature_categories:
+- purchase
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19694
+milestone: '12.6'
diff --git a/db/docs/gitlab_subscriptions.yml b/db/docs/gitlab_subscriptions.yml
new file mode 100644
index 00000000000..e32156da0c8
--- /dev/null
+++ b/db/docs/gitlab_subscriptions.yml
@@ -0,0 +1,9 @@
+---
+table_name: gitlab_subscriptions
+classes:
+- GitlabSubscription
+feature_categories:
+- purchase
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7885
+milestone: '11.6'
diff --git a/db/docs/gpg_key_subkeys.yml b/db/docs/gpg_key_subkeys.yml
new file mode 100644
index 00000000000..828ee6dac70
--- /dev/null
+++ b/db/docs/gpg_key_subkeys.yml
@@ -0,0 +1,9 @@
+---
+table_name: gpg_key_subkeys
+classes:
+- GpgKeySubkey
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3098
+milestone: '10.1'
diff --git a/db/docs/gpg_keys.yml b/db/docs/gpg_keys.yml
new file mode 100644
index 00000000000..d4524e777ee
--- /dev/null
+++ b/db/docs/gpg_keys.yml
@@ -0,0 +1,9 @@
+---
+table_name: gpg_keys
+classes:
+- GpgKey
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/fbf1fd1a204a24aef2b80473ec64a520ed2a2dfc
+milestone: '9.5'
diff --git a/db/docs/gpg_signatures.yml b/db/docs/gpg_signatures.yml
new file mode 100644
index 00000000000..a0f79655270
--- /dev/null
+++ b/db/docs/gpg_signatures.yml
@@ -0,0 +1,9 @@
+---
+table_name: gpg_signatures
+classes:
+- CommitSignatures::GpgSignature
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8236b12dff3df6d223888664c820ae54b4e0eaf7
+milestone: '9.5'
diff --git a/db/docs/grafana_integrations.yml b/db/docs/grafana_integrations.yml
new file mode 100644
index 00000000000..c479b07ffb1
--- /dev/null
+++ b/db/docs/grafana_integrations.yml
@@ -0,0 +1,9 @@
+---
+table_name: grafana_integrations
+classes:
+- GrafanaIntegration
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17234
+milestone: '12.4'
diff --git a/db/docs/group_crm_settings.yml b/db/docs/group_crm_settings.yml
new file mode 100644
index 00000000000..977ba21e2f8
--- /dev/null
+++ b/db/docs/group_crm_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_crm_settings
+classes:
+- Group::CrmSettings
+feature_categories:
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76983
+milestone: '14.7'
diff --git a/db/docs/group_custom_attributes.yml b/db/docs/group_custom_attributes.yml
new file mode 100644
index 00000000000..6a06b847414
--- /dev/null
+++ b/db/docs/group_custom_attributes.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_custom_attributes
+classes:
+- GroupCustomAttribute
+feature_categories:
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1f773a8ef5a1f76166d0455c6a5e473278885c17
+milestone: '10.2'
diff --git a/db/docs/group_deletion_schedules.yml b/db/docs/group_deletion_schedules.yml
new file mode 100644
index 00000000000..b3bc6665c4c
--- /dev/null
+++ b/db/docs/group_deletion_schedules.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_deletion_schedules
+classes:
+- GroupDeletionSchedule
+feature_categories:
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20276
+milestone: '12.6'
diff --git a/db/docs/group_deploy_keys.yml b/db/docs/group_deploy_keys.yml
new file mode 100644
index 00000000000..1b456703e37
--- /dev/null
+++ b/db/docs/group_deploy_keys.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_deploy_keys
+classes:
+- GroupDeployKey
+feature_categories:
+- secrets_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/group_deploy_keys_groups.yml b/db/docs/group_deploy_keys_groups.yml
new file mode 100644
index 00000000000..e50849a6967
--- /dev/null
+++ b/db/docs/group_deploy_keys_groups.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_deploy_keys_groups
+classes:
+- GroupDeployKeysGroup
+feature_categories:
+- advanced_deployments
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/group_deploy_tokens.yml b/db/docs/group_deploy_tokens.yml
new file mode 100644
index 00000000000..4b8a4d4598f
--- /dev/null
+++ b/db/docs/group_deploy_tokens.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_deploy_tokens
+classes:
+- GroupDeployToken
+feature_categories:
+- secrets_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23460
+milestone: '12.8'
diff --git a/db/docs/group_group_links.yml b/db/docs/group_group_links.yml
new file mode 100644
index 00000000000..e9671034330
--- /dev/null
+++ b/db/docs/group_group_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_group_links
+classes:
+- GroupGroupLink
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17117
+milestone: '12.5'
diff --git a/db/docs/group_import_states.yml b/db/docs/group_import_states.yml
new file mode 100644
index 00000000000..72acbaa0daa
--- /dev/null
+++ b/db/docs/group_import_states.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_import_states
+classes:
+- GroupImportState
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/group_merge_request_approval_settings.yml b/db/docs/group_merge_request_approval_settings.yml
new file mode 100644
index 00000000000..70a2ef9311b
--- /dev/null
+++ b/db/docs/group_merge_request_approval_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_merge_request_approval_settings
+classes:
+- GroupMergeRequestApprovalSetting
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50256
+milestone: '13.8'
diff --git a/db/docs/group_repository_storage_moves.yml b/db/docs/group_repository_storage_moves.yml
new file mode 100644
index 00000000000..439dfa381cc
--- /dev/null
+++ b/db/docs/group_repository_storage_moves.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_repository_storage_moves
+classes:
+- Groups::RepositoryStorageMove
+feature_categories:
+- gitaly
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51803
+milestone: '13.9'
diff --git a/db/docs/group_wiki_repositories.yml b/db/docs/group_wiki_repositories.yml
new file mode 100644
index 00000000000..6a5a1976ca3
--- /dev/null
+++ b/db/docs/group_wiki_repositories.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_wiki_repositories
+classes:
+- GroupWikiRepository
+feature_categories:
+- wiki
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/historical_data.yml b/db/docs/historical_data.yml
new file mode 100644
index 00000000000..75f3493cb6d
--- /dev/null
+++ b/db/docs/historical_data.yml
@@ -0,0 +1,9 @@
+---
+table_name: historical_data
+classes:
+- HistoricalData
+feature_categories:
+- utilization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/85c04a8aa654d1b7f898e55a113e50521bacaaf2
+milestone: '7.11'
diff --git a/db/docs/identities.yml b/db/docs/identities.yml
new file mode 100644
index 00000000000..078fb1197d7
--- /dev/null
+++ b/db/docs/identities.yml
@@ -0,0 +1,9 @@
+---
+table_name: identities
+classes:
+- Identity
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1a80d13a3990937580c97e2b0ba8fb98f69bc055
+milestone: '7.6'
diff --git a/db/docs/import_export_uploads.yml b/db/docs/import_export_uploads.yml
new file mode 100644
index 00000000000..f9295ef89c9
--- /dev/null
+++ b/db/docs/import_export_uploads.yml
@@ -0,0 +1,9 @@
+---
+table_name: import_export_uploads
+classes:
+- ImportExportUpload
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/a2bf1641546a1d3eeb3e9f44734854f655c0adef
+milestone: '11.1'
diff --git a/db/docs/import_failures.yml b/db/docs/import_failures.yml
new file mode 100644
index 00000000000..ef0e71deca3
--- /dev/null
+++ b/db/docs/import_failures.yml
@@ -0,0 +1,9 @@
+---
+table_name: import_failures
+classes:
+- ImportFailure
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20727
+milestone: '12.6'
diff --git a/db/docs/in_product_marketing_emails.yml b/db/docs/in_product_marketing_emails.yml
new file mode 100644
index 00000000000..443b67aaae5
--- /dev/null
+++ b/db/docs/in_product_marketing_emails.yml
@@ -0,0 +1,9 @@
+---
+table_name: in_product_marketing_emails
+classes:
+- Users::InProductMarketingEmail
+feature_categories:
+- experimentation_activation
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55840
+milestone: '13.10'
diff --git a/db/docs/incident_management_escalation_policies.yml b/db/docs/incident_management_escalation_policies.yml
new file mode 100644
index 00000000000..f8bb51957fd
--- /dev/null
+++ b/db/docs/incident_management_escalation_policies.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_escalation_policies
+classes:
+- IncidentManagement::EscalationPolicy
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60685
+milestone: '13.12'
diff --git a/db/docs/incident_management_escalation_rules.yml b/db/docs/incident_management_escalation_rules.yml
new file mode 100644
index 00000000000..6f97d8b6524
--- /dev/null
+++ b/db/docs/incident_management_escalation_rules.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_escalation_rules
+classes:
+- IncidentManagement::EscalationRule
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60685
+milestone: '13.12'
diff --git a/db/docs/incident_management_issuable_escalation_statuses.yml b/db/docs/incident_management_issuable_escalation_statuses.yml
new file mode 100644
index 00000000000..4c0010f212a
--- /dev/null
+++ b/db/docs/incident_management_issuable_escalation_statuses.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_issuable_escalation_statuses
+classes:
+- IncidentManagement::IssuableEscalationStatus
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65206
+milestone: '14.2'
diff --git a/db/docs/incident_management_oncall_participants.yml b/db/docs/incident_management_oncall_participants.yml
new file mode 100644
index 00000000000..a394afae79b
--- /dev/null
+++ b/db/docs/incident_management_oncall_participants.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_oncall_participants
+classes:
+- IncidentManagement::OncallParticipant
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49058
+milestone: '13.7'
diff --git a/db/docs/incident_management_oncall_rotations.yml b/db/docs/incident_management_oncall_rotations.yml
new file mode 100644
index 00000000000..114973d12be
--- /dev/null
+++ b/db/docs/incident_management_oncall_rotations.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_oncall_rotations
+classes:
+- IncidentManagement::OncallRotation
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49058
+milestone: '13.7'
diff --git a/db/docs/incident_management_oncall_schedules.yml b/db/docs/incident_management_oncall_schedules.yml
new file mode 100644
index 00000000000..deb05826e08
--- /dev/null
+++ b/db/docs/incident_management_oncall_schedules.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_oncall_schedules
+classes:
+- IncidentManagement::OncallSchedule
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47407
+milestone: '13.7'
diff --git a/db/docs/incident_management_oncall_shifts.yml b/db/docs/incident_management_oncall_shifts.yml
new file mode 100644
index 00000000000..2e1a12032d4
--- /dev/null
+++ b/db/docs/incident_management_oncall_shifts.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_oncall_shifts
+classes:
+- IncidentManagement::OncallShift
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49423
+milestone: '13.8'
diff --git a/db/docs/incident_management_pending_alert_escalations.yml b/db/docs/incident_management_pending_alert_escalations.yml
new file mode 100644
index 00000000000..5c8f456f084
--- /dev/null
+++ b/db/docs/incident_management_pending_alert_escalations.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_pending_alert_escalations
+classes:
+- IncidentManagement::PendingEscalations::Alert
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e5cc867503dfbd54f99df90cce6be39bc4fde712
+milestone: '14.1'
diff --git a/db/docs/incident_management_pending_issue_escalations.yml b/db/docs/incident_management_pending_issue_escalations.yml
new file mode 100644
index 00000000000..0956b1f9453
--- /dev/null
+++ b/db/docs/incident_management_pending_issue_escalations.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_pending_issue_escalations
+classes:
+- IncidentManagement::PendingEscalations::Issue
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65209
+milestone: '14.3'
diff --git a/db/docs/incident_management_timeline_events.yml b/db/docs/incident_management_timeline_events.yml
new file mode 100644
index 00000000000..d13a6ec29ec
--- /dev/null
+++ b/db/docs/incident_management_timeline_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: incident_management_timeline_events
+classes:
+- IncidentManagement::TimelineEvent
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74530
+milestone: '14.6'
diff --git a/db/docs/index_statuses.yml b/db/docs/index_statuses.yml
new file mode 100644
index 00000000000..933795a265a
--- /dev/null
+++ b/db/docs/index_statuses.yml
@@ -0,0 +1,9 @@
+---
+table_name: index_statuses
+classes:
+- IndexStatus
+feature_categories:
+- global_search
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/03370b017c7b120af7b53682714ffc325742fc98
+milestone: '8.4'
diff --git a/db/docs/insights.yml b/db/docs/insights.yml
new file mode 100644
index 00000000000..988893208a7
--- /dev/null
+++ b/db/docs/insights.yml
@@ -0,0 +1,9 @@
+---
+table_name: insights
+classes:
+- Insight
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9665
+milestone: '11.9'
diff --git a/db/docs/integrations.yml b/db/docs/integrations.yml
new file mode 100644
index 00000000000..708bd6d8b1a
--- /dev/null
+++ b/db/docs/integrations.yml
@@ -0,0 +1,55 @@
+---
+table_name: integrations
+classes:
+- Integration
+- Integrations::Asana
+- Integrations::Assembla
+- Integrations::Bamboo
+- Integrations::BaseChatNotification
+- Integrations::BaseCi
+- Integrations::BaseIssueTracker
+- Integrations::BaseMonitoring
+- Integrations::BaseSlashCommands
+- Integrations::Bugzilla
+- Integrations::Buildkite
+- Integrations::Campfire
+- Integrations::Confluence
+- Integrations::CustomIssueTracker
+- Integrations::Datadog
+- Integrations::Discord
+- Integrations::DroneCi
+- Integrations::EmailsOnPush
+- Integrations::Ewm
+- Integrations::ExternalWiki
+- Integrations::Flowdock
+- Integrations::Github
+- Integrations::GitlabSlackApplication
+- Integrations::HangoutsChat
+- Integrations::Harbor
+- Integrations::Irker
+- Integrations::Jenkins
+- Integrations::Jira
+- Integrations::Mattermost
+- Integrations::MattermostSlashCommands
+- Integrations::MicrosoftTeams
+- Integrations::MockCi
+- Integrations::MockMonitoring
+- Integrations::Packagist
+- Integrations::PipelinesEmail
+- Integrations::Pivotaltracker
+- Integrations::Prometheus
+- Integrations::Pushover
+- Integrations::Redmine
+- Integrations::Shimo
+- Integrations::Slack
+- Integrations::SlackSlashCommands
+- Integrations::Teamcity
+- Integrations::UnifyCircuit
+- Integrations::WebexTeams
+- Integrations::Youtrack
+- Integrations::Zentao
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64562
+milestone: '9.4'
diff --git a/db/docs/internal_ids.yml b/db/docs/internal_ids.yml
new file mode 100644
index 00000000000..48596a153d6
--- /dev/null
+++ b/db/docs/internal_ids.yml
@@ -0,0 +1,10 @@
+---
+table_name: internal_ids
+classes:
+- InternalId
+feature_categories:
+- projects
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/754272e392c0da088200a1b56156600973f63267
+milestone: '10.7'
diff --git a/db/docs/ip_restrictions.yml b/db/docs/ip_restrictions.yml
new file mode 100644
index 00000000000..6437cda47f2
--- /dev/null
+++ b/db/docs/ip_restrictions.yml
@@ -0,0 +1,9 @@
+---
+table_name: ip_restrictions
+classes:
+- IpRestriction
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/12669
+milestone: '12.0'
diff --git a/db/docs/issuable_metric_images.yml b/db/docs/issuable_metric_images.yml
new file mode 100644
index 00000000000..d4460d5e31c
--- /dev/null
+++ b/db/docs/issuable_metric_images.yml
@@ -0,0 +1,9 @@
+---
+table_name: issuable_metric_images
+classes:
+- IssuableMetricImage
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46845
+milestone: '13.7'
diff --git a/db/docs/issuable_severities.yml b/db/docs/issuable_severities.yml
new file mode 100644
index 00000000000..9a86931e4c3
--- /dev/null
+++ b/db/docs/issuable_severities.yml
@@ -0,0 +1,9 @@
+---
+table_name: issuable_severities
+classes:
+- IssuableSeverity
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/issuable_slas.yml b/db/docs/issuable_slas.yml
new file mode 100644
index 00000000000..631086f68a9
--- /dev/null
+++ b/db/docs/issuable_slas.yml
@@ -0,0 +1,9 @@
+---
+table_name: issuable_slas
+classes:
+- IssuableSla
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44928
+milestone: '13.5'
diff --git a/db/docs/issue_assignees.yml b/db/docs/issue_assignees.yml
new file mode 100644
index 00000000000..5b09ffa4b87
--- /dev/null
+++ b/db/docs/issue_assignees.yml
@@ -0,0 +1,9 @@
+---
+table_name: issue_assignees
+classes:
+- IssueAssignee
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/ac5d8fddd6809113e3d43d94c315f993605135e9
+milestone: '9.2'
diff --git a/db/docs/issue_customer_relations_contacts.yml b/db/docs/issue_customer_relations_contacts.yml
new file mode 100644
index 00000000000..d88ccc1c72b
--- /dev/null
+++ b/db/docs/issue_customer_relations_contacts.yml
@@ -0,0 +1,9 @@
+---
+table_name: issue_customer_relations_contacts
+classes:
+- CustomerRelations::IssueContact
+feature_categories:
+- purchase
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71007
+milestone: '14.4'
diff --git a/db/docs/issue_email_participants.yml b/db/docs/issue_email_participants.yml
new file mode 100644
index 00000000000..11995b17d2c
--- /dev/null
+++ b/db/docs/issue_email_participants.yml
@@ -0,0 +1,9 @@
+---
+table_name: issue_email_participants
+classes:
+- IssueEmailParticipant
+feature_categories:
+- service_desk
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42943
+milestone: '13.5'
diff --git a/db/docs/issue_emails.yml b/db/docs/issue_emails.yml
new file mode 100644
index 00000000000..48129cff428
--- /dev/null
+++ b/db/docs/issue_emails.yml
@@ -0,0 +1,9 @@
+---
+table_name: issue_emails
+classes:
+- Issue::Email
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71749
+milestone: '14.6'
diff --git a/db/docs/issue_links.yml b/db/docs/issue_links.yml
new file mode 100644
index 00000000000..3eb0ba63125
--- /dev/null
+++ b/db/docs/issue_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: issue_links
+classes:
+- IssueLink
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7afdb31770f927cf4fcca98ab675e015f39f8479
+milestone: '9.4'
diff --git a/db/docs/issue_metrics.yml b/db/docs/issue_metrics.yml
new file mode 100644
index 00000000000..a451e649128
--- /dev/null
+++ b/db/docs/issue_metrics.yml
@@ -0,0 +1,9 @@
+---
+table_name: issue_metrics
+classes:
+- Issue::Metrics
+feature_categories:
+- value_stream_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/516c838a1846d049814765afa85c28a3c14a5b9f
+milestone: '8.12'
diff --git a/db/docs/issue_search_data.yml b/db/docs/issue_search_data.yml
new file mode 100644
index 00000000000..cea9a385afb
--- /dev/null
+++ b/db/docs/issue_search_data.yml
@@ -0,0 +1,9 @@
+---
+table_name: issue_search_data
+classes:
+- Issues::SearchData
+feature_categories:
+- global_search
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71913
+milestone: '14.9'
diff --git a/db/docs/issue_tracker_data.yml b/db/docs/issue_tracker_data.yml
new file mode 100644
index 00000000000..03aa6132fc4
--- /dev/null
+++ b/db/docs/issue_tracker_data.yml
@@ -0,0 +1,9 @@
+---
+table_name: issue_tracker_data
+classes:
+- Integrations::IssueTrackerData
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1f332ae8da994509232c7601074b25514ad23c52
+milestone: '12.0'
diff --git a/db/docs/issue_user_mentions.yml b/db/docs/issue_user_mentions.yml
new file mode 100644
index 00000000000..f854ac9bc96
--- /dev/null
+++ b/db/docs/issue_user_mentions.yml
@@ -0,0 +1,9 @@
+---
+table_name: issue_user_mentions
+classes:
+- IssueUserMention
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
+milestone: '12.6'
diff --git a/db/docs/issues.yml b/db/docs/issues.yml
new file mode 100644
index 00000000000..f8e70998cd0
--- /dev/null
+++ b/db/docs/issues.yml
@@ -0,0 +1,10 @@
+---
+table_name: issues
+classes:
+- Issue
+- WorkItem
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
+milestone: "<6.0"
diff --git a/db/docs/issues_prometheus_alert_events.yml b/db/docs/issues_prometheus_alert_events.yml
new file mode 100644
index 00000000000..4a222ab3924
--- /dev/null
+++ b/db/docs/issues_prometheus_alert_events.yml
@@ -0,0 +1,8 @@
+---
+table_name: issues_prometheus_alert_events
+classes: []
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17477
+milestone: '12.4'
diff --git a/db/docs/issues_self_managed_prometheus_alert_events.yml b/db/docs/issues_self_managed_prometheus_alert_events.yml
new file mode 100644
index 00000000000..016e1f17a6e
--- /dev/null
+++ b/db/docs/issues_self_managed_prometheus_alert_events.yml
@@ -0,0 +1,8 @@
+---
+table_name: issues_self_managed_prometheus_alert_events
+classes: []
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18046
+milestone: '12.4'
diff --git a/db/docs/iterations_cadences.yml b/db/docs/iterations_cadences.yml
new file mode 100644
index 00000000000..d47214ba780
--- /dev/null
+++ b/db/docs/iterations_cadences.yml
@@ -0,0 +1,9 @@
+---
+table_name: iterations_cadences
+classes:
+- Iterations::Cadence
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50707
+milestone: '13.10'
diff --git a/db/docs/jira_connect_installations.yml b/db/docs/jira_connect_installations.yml
new file mode 100644
index 00000000000..0ce19242942
--- /dev/null
+++ b/db/docs/jira_connect_installations.yml
@@ -0,0 +1,9 @@
+---
+table_name: jira_connect_installations
+classes:
+- JiraConnectInstallation
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9593
+milestone: '11.9'
diff --git a/db/docs/jira_connect_subscriptions.yml b/db/docs/jira_connect_subscriptions.yml
new file mode 100644
index 00000000000..c7b134fb201
--- /dev/null
+++ b/db/docs/jira_connect_subscriptions.yml
@@ -0,0 +1,9 @@
+---
+table_name: jira_connect_subscriptions
+classes:
+- JiraConnectSubscription
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/10453
+milestone: '11.11'
diff --git a/db/docs/jira_imports.yml b/db/docs/jira_imports.yml
new file mode 100644
index 00000000000..497b0776c4c
--- /dev/null
+++ b/db/docs/jira_imports.yml
@@ -0,0 +1,9 @@
+---
+table_name: jira_imports
+classes:
+- JiraImportState
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/jira_tracker_data.yml b/db/docs/jira_tracker_data.yml
new file mode 100644
index 00000000000..30915569024
--- /dev/null
+++ b/db/docs/jira_tracker_data.yml
@@ -0,0 +1,9 @@
+---
+table_name: jira_tracker_data
+classes:
+- Integrations::JiraTrackerData
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1f332ae8da994509232c7601074b25514ad23c52
+milestone: '12.0'
diff --git a/db/docs/keys.yml b/db/docs/keys.yml
new file mode 100644
index 00000000000..3bb5ed48b19
--- /dev/null
+++ b/db/docs/keys.yml
@@ -0,0 +1,11 @@
+---
+table_name: keys
+classes:
+- DeployKey
+- Key
+- LDAPKey
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
+milestone: "<6.0"
diff --git a/db/docs/label_links.yml b/db/docs/label_links.yml
new file mode 100644
index 00000000000..28e261c6ea1
--- /dev/null
+++ b/db/docs/label_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: label_links
+classes:
+- LabelLink
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/03654a6abf47c88b8b980a6707874ff78080d2fe
+milestone: '7.2'
diff --git a/db/docs/label_priorities.yml b/db/docs/label_priorities.yml
new file mode 100644
index 00000000000..28ff029515c
--- /dev/null
+++ b/db/docs/label_priorities.yml
@@ -0,0 +1,9 @@
+---
+table_name: label_priorities
+classes:
+- LabelPriority
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/297892011330ecdd2fa7cbe47fbc6fd4f3b62171
+milestone: '8.13'
diff --git a/db/docs/labels.yml b/db/docs/labels.yml
new file mode 100644
index 00000000000..aafe399e8c7
--- /dev/null
+++ b/db/docs/labels.yml
@@ -0,0 +1,11 @@
+---
+table_name: labels
+classes:
+- GroupLabel
+- Label
+- ProjectLabel
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/03654a6abf47c88b8b980a6707874ff78080d2fe
+milestone: '7.2'
diff --git a/db/docs/ldap_group_links.yml b/db/docs/ldap_group_links.yml
new file mode 100644
index 00000000000..49c4e560c34
--- /dev/null
+++ b/db/docs/ldap_group_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: ldap_group_links
+classes:
+- LdapGroupLink
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/b017947ac91655f8ae6593fb63c3423cd1b439f4
+milestone: '7.3'
diff --git a/db/docs/lfs_file_locks.yml b/db/docs/lfs_file_locks.yml
new file mode 100644
index 00000000000..c7f8463165e
--- /dev/null
+++ b/db/docs/lfs_file_locks.yml
@@ -0,0 +1,9 @@
+---
+table_name: lfs_file_locks
+classes:
+- LfsFileLock
+feature_categories:
+- git_lfs
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4091
+milestone: '10.5'
diff --git a/db/docs/lfs_object_states.yml b/db/docs/lfs_object_states.yml
new file mode 100644
index 00000000000..f0f16f74b33
--- /dev/null
+++ b/db/docs/lfs_object_states.yml
@@ -0,0 +1,9 @@
+---
+table_name: lfs_object_states
+classes:
+- Geo::LfsObjectState
+feature_categories:
+- git_lfs
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63981
+milestone: '14.6'
diff --git a/db/docs/lfs_objects.yml b/db/docs/lfs_objects.yml
new file mode 100644
index 00000000000..575ca8f181a
--- /dev/null
+++ b/db/docs/lfs_objects.yml
@@ -0,0 +1,9 @@
+---
+table_name: lfs_objects
+classes:
+- LfsObject
+feature_categories:
+- git_lfs
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/14032d8eb1a60ae5920286249c1044be2fa27278
+milestone: '8.2'
diff --git a/db/docs/lfs_objects_projects.yml b/db/docs/lfs_objects_projects.yml
new file mode 100644
index 00000000000..4a835bf7a40
--- /dev/null
+++ b/db/docs/lfs_objects_projects.yml
@@ -0,0 +1,10 @@
+---
+table_name: lfs_objects_projects
+classes:
+- LfsObjectsProject
+feature_categories:
+- git_lfs
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/14032d8eb1a60ae5920286249c1044be2fa27278
+milestone: '8.2'
diff --git a/db/docs/licenses.yml b/db/docs/licenses.yml
new file mode 100644
index 00000000000..433dbc9c5b5
--- /dev/null
+++ b/db/docs/licenses.yml
@@ -0,0 +1,9 @@
+---
+table_name: licenses
+classes:
+- License
+feature_categories:
+- purchase
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d1f2b09fadcfba210c5121bd214b910b9f9809fd
+milestone: '7.11'
diff --git a/db/docs/list_user_preferences.yml b/db/docs/list_user_preferences.yml
new file mode 100644
index 00000000000..a53602899eb
--- /dev/null
+++ b/db/docs/list_user_preferences.yml
@@ -0,0 +1,9 @@
+---
+table_name: list_user_preferences
+classes:
+- ListUserPreference
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/15657
+milestone: '12.3'
diff --git a/db/docs/lists.yml b/db/docs/lists.yml
new file mode 100644
index 00000000000..5ccd20c300f
--- /dev/null
+++ b/db/docs/lists.yml
@@ -0,0 +1,9 @@
+---
+table_name: lists
+classes:
+- List
+feature_categories:
+- design_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/611dab2e522e5e59cf09cd459a31686e65616863
+milestone: '8.11'
diff --git a/db/docs/loose_foreign_keys_deleted_records.yml b/db/docs/loose_foreign_keys_deleted_records.yml
new file mode 100644
index 00000000000..df26ffaefd1
--- /dev/null
+++ b/db/docs/loose_foreign_keys_deleted_records.yml
@@ -0,0 +1,9 @@
+---
+table_name: loose_foreign_keys_deleted_records
+classes:
+- LooseForeignKeys::DeletedRecord
+feature_categories:
+- sharding
+description: Used by the loose foreign keys feature as a queue of parent records whose child records (via foreign keys) need to be deleted/nullified
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70152
+milestone: '14.3'
diff --git a/db/docs/member_tasks.yml b/db/docs/member_tasks.yml
new file mode 100644
index 00000000000..7f55c8d6eec
--- /dev/null
+++ b/db/docs/member_tasks.yml
@@ -0,0 +1,9 @@
+---
+table_name: member_tasks
+classes:
+- MemberTask
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69299
+milestone: '14.5'
diff --git a/db/docs/members.yml b/db/docs/members.yml
new file mode 100644
index 00000000000..ebf8a4f3bc6
--- /dev/null
+++ b/db/docs/members.yml
@@ -0,0 +1,13 @@
+---
+table_name: members
+classes:
+- GroupMember
+- Member
+- ProjectMember
+- ProjectNamespaceMember
+feature_categories:
+- projects
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3503b504eabf95487fc3fb49df953a7d694da4fe
+milestone: '7.4'
diff --git a/db/docs/merge_request_assignees.yml b/db/docs/merge_request_assignees.yml
new file mode 100644
index 00000000000..38c94ff3c30
--- /dev/null
+++ b/db/docs/merge_request_assignees.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_assignees
+classes:
+- MergeRequestAssignee
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/929ee4d18da886826e9fcc15c35b4d4024bc8237
+milestone: '11.10'
diff --git a/db/docs/merge_request_blocks.yml b/db/docs/merge_request_blocks.yml
new file mode 100644
index 00000000000..992fd88c1e5
--- /dev/null
+++ b/db/docs/merge_request_blocks.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_blocks
+classes:
+- MergeRequestBlock
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/df778038981ae49cb7c0fec0a60f89abf801c5f0
+milestone: '12.0'
diff --git a/db/docs/merge_request_cleanup_schedules.yml b/db/docs/merge_request_cleanup_schedules.yml
new file mode 100644
index 00000000000..ec791ef2567
--- /dev/null
+++ b/db/docs/merge_request_cleanup_schedules.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_cleanup_schedules
+classes:
+- MergeRequest::CleanupSchedule
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46758
+milestone: '13.6'
diff --git a/db/docs/merge_request_context_commit_diff_files.yml b/db/docs/merge_request_context_commit_diff_files.yml
new file mode 100644
index 00000000000..08311e244a1
--- /dev/null
+++ b/db/docs/merge_request_context_commit_diff_files.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_context_commit_diff_files
+classes:
+- MergeRequestContextCommitDiffFile
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23701
+milestone: '12.8'
diff --git a/db/docs/merge_request_context_commits.yml b/db/docs/merge_request_context_commits.yml
new file mode 100644
index 00000000000..d9b4729c7b9
--- /dev/null
+++ b/db/docs/merge_request_context_commits.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_context_commits
+classes:
+- MergeRequestContextCommit
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23701
+milestone: '12.8'
diff --git a/db/docs/merge_request_diff_commit_users.yml b/db/docs/merge_request_diff_commit_users.yml
new file mode 100644
index 00000000000..ab634358238
--- /dev/null
+++ b/db/docs/merge_request_diff_commit_users.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_diff_commit_users
+classes:
+- MergeRequest::DiffCommitUser
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63669
+milestone: '14.1'
diff --git a/db/docs/merge_request_diff_commits.yml b/db/docs/merge_request_diff_commits.yml
new file mode 100644
index 00000000000..8f29d38b2a9
--- /dev/null
+++ b/db/docs/merge_request_diff_commits.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_diff_commits
+classes:
+- MergeRequestDiffCommit
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/aff5c9f3e5ecdd9eee2b2b60ab6367da878582fc
+milestone: '9.4'
diff --git a/db/docs/merge_request_diff_details.yml b/db/docs/merge_request_diff_details.yml
new file mode 100644
index 00000000000..4d48beb4de6
--- /dev/null
+++ b/db/docs/merge_request_diff_details.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_diff_details
+classes:
+- MergeRequestDiffDetail
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/merge_request_diff_files.yml b/db/docs/merge_request_diff_files.yml
new file mode 100644
index 00000000000..9d3e9c7715b
--- /dev/null
+++ b/db/docs/merge_request_diff_files.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_diff_files
+classes:
+- MergeRequestDiffFile
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9a73b634ab4220f68a8296ccb582a68293874489
+milestone: '9.4'
diff --git a/db/docs/merge_request_diffs.yml b/db/docs/merge_request_diffs.yml
new file mode 100644
index 00000000000..f8df727e7fa
--- /dev/null
+++ b/db/docs/merge_request_diffs.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_diffs
+classes:
+- MergeRequestDiff
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/c983e8eb3d9cac01090b8657735544f71f891576
+milestone: '6.6'
diff --git a/db/docs/merge_request_metrics.yml b/db/docs/merge_request_metrics.yml
new file mode 100644
index 00000000000..a2fb3d187d6
--- /dev/null
+++ b/db/docs/merge_request_metrics.yml
@@ -0,0 +1,10 @@
+---
+table_name: merge_request_metrics
+classes:
+- MergeRequest::Metrics
+feature_categories:
+- value_stream_management
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/487906b3861068a8f81125814f919a07bfab8469
+milestone: '8.12'
diff --git a/db/docs/merge_request_reviewers.yml b/db/docs/merge_request_reviewers.yml
new file mode 100644
index 00000000000..a039a2bba84
--- /dev/null
+++ b/db/docs/merge_request_reviewers.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_reviewers
+classes:
+- MergeRequestReviewer
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/merge_request_user_mentions.yml b/db/docs/merge_request_user_mentions.yml
new file mode 100644
index 00000000000..edae95c3a65
--- /dev/null
+++ b/db/docs/merge_request_user_mentions.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_request_user_mentions
+classes:
+- MergeRequestUserMention
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
+milestone: '12.6'
diff --git a/db/docs/merge_requests.yml b/db/docs/merge_requests.yml
new file mode 100644
index 00000000000..49f3b2f97e8
--- /dev/null
+++ b/db/docs/merge_requests.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_requests
+classes:
+- MergeRequest
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/6d460aa2d6b3959593c168eed181516036525393
+milestone: "<6.0"
diff --git a/db/docs/merge_requests_closing_issues.yml b/db/docs/merge_requests_closing_issues.yml
new file mode 100644
index 00000000000..fd68b5627f8
--- /dev/null
+++ b/db/docs/merge_requests_closing_issues.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_requests_closing_issues
+classes:
+- MergeRequestsClosingIssues
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/ba25e2f1ac61b47940f939a2d9f1d0ad417e1de2
+milestone: '8.12'
diff --git a/db/docs/merge_requests_compliance_violations.yml b/db/docs/merge_requests_compliance_violations.yml
new file mode 100644
index 00000000000..cfa7f78c13e
--- /dev/null
+++ b/db/docs/merge_requests_compliance_violations.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_requests_compliance_violations
+classes:
+- MergeRequests::ComplianceViolation
+feature_categories:
+- compliance_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74290
+milestone: '14.6'
diff --git a/db/docs/merge_trains.yml b/db/docs/merge_trains.yml
new file mode 100644
index 00000000000..e0481d923c0
--- /dev/null
+++ b/db/docs/merge_trains.yml
@@ -0,0 +1,9 @@
+---
+table_name: merge_trains
+classes:
+- MergeTrain
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/827fc3ccb9335aa29fba0fc532b70015ec4c5186
+milestone: '11.11'
diff --git a/db/docs/metrics_dashboard_annotations.yml b/db/docs/metrics_dashboard_annotations.yml
new file mode 100644
index 00000000000..e5f03bf4525
--- /dev/null
+++ b/db/docs/metrics_dashboard_annotations.yml
@@ -0,0 +1,9 @@
+---
+table_name: metrics_dashboard_annotations
+classes:
+- Metrics::Dashboard::Annotation
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/metrics_users_starred_dashboards.yml b/db/docs/metrics_users_starred_dashboards.yml
new file mode 100644
index 00000000000..2d86519455c
--- /dev/null
+++ b/db/docs/metrics_users_starred_dashboards.yml
@@ -0,0 +1,9 @@
+---
+table_name: metrics_users_starred_dashboards
+classes:
+- Metrics::UsersStarredDashboard
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/milestone_releases.yml b/db/docs/milestone_releases.yml
new file mode 100644
index 00000000000..a5c95b086dd
--- /dev/null
+++ b/db/docs/milestone_releases.yml
@@ -0,0 +1,9 @@
+---
+table_name: milestone_releases
+classes:
+- MilestoneRelease
+feature_categories:
+- release_orchestration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/a43ab8d6a430014e875deb3bff3fd8d8da256747
+milestone: '12.3'
diff --git a/db/docs/milestones.yml b/db/docs/milestones.yml
new file mode 100644
index 00000000000..be4c7540c43
--- /dev/null
+++ b/db/docs/milestones.yml
@@ -0,0 +1,9 @@
+---
+table_name: milestones
+classes:
+- Milestone
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/23d950855d6d2524d00b1f0618c008e2529f06a4
+milestone: "<6.0"
diff --git a/db/docs/namespace_admin_notes.yml b/db/docs/namespace_admin_notes.yml
new file mode 100644
index 00000000000..afc9f814fd6
--- /dev/null
+++ b/db/docs/namespace_admin_notes.yml
@@ -0,0 +1,9 @@
+---
+table_name: namespace_admin_notes
+classes:
+- Namespace::AdminNote
+feature_categories:
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47825
+milestone: '13.11'
diff --git a/db/docs/namespace_aggregation_schedules.yml b/db/docs/namespace_aggregation_schedules.yml
new file mode 100644
index 00000000000..517a65000eb
--- /dev/null
+++ b/db/docs/namespace_aggregation_schedules.yml
@@ -0,0 +1,9 @@
+---
+table_name: namespace_aggregation_schedules
+classes:
+- Namespace::AggregationSchedule
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/bde41ee866d0fe0b1bb5ece1130fb6e24d95ad17
+milestone: '12.1'
diff --git a/db/docs/namespace_limits.yml b/db/docs/namespace_limits.yml
new file mode 100644
index 00000000000..4b528dcd447
--- /dev/null
+++ b/db/docs/namespace_limits.yml
@@ -0,0 +1,9 @@
+---
+table_name: namespace_limits
+classes:
+- NamespaceLimit
+feature_categories:
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/namespace_package_settings.yml b/db/docs/namespace_package_settings.yml
new file mode 100644
index 00000000000..5d5971ca73f
--- /dev/null
+++ b/db/docs/namespace_package_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: namespace_package_settings
+classes:
+- Namespace::PackageSetting
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50104
+milestone: '13.8'
diff --git a/db/docs/namespace_root_storage_statistics.yml b/db/docs/namespace_root_storage_statistics.yml
new file mode 100644
index 00000000000..ce8620db1e5
--- /dev/null
+++ b/db/docs/namespace_root_storage_statistics.yml
@@ -0,0 +1,9 @@
+---
+table_name: namespace_root_storage_statistics
+classes:
+- Namespace::RootStorageStatistics
+feature_categories:
+- utilization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/bde41ee866d0fe0b1bb5ece1130fb6e24d95ad17
+milestone: '12.1'
diff --git a/db/docs/namespace_settings.yml b/db/docs/namespace_settings.yml
new file mode 100644
index 00000000000..a452d2473c5
--- /dev/null
+++ b/db/docs/namespace_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: namespace_settings
+classes:
+- NamespaceSetting
+feature_categories:
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/namespace_statistics.yml b/db/docs/namespace_statistics.yml
new file mode 100644
index 00000000000..eb8d7f6a5ca
--- /dev/null
+++ b/db/docs/namespace_statistics.yml
@@ -0,0 +1,9 @@
+---
+table_name: namespace_statistics
+classes:
+- NamespaceStatistics
+feature_categories:
+- utilization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/48d8bdca0493056a717cd7d9fee2e8b51d6b0502
+milestone: '9.0'
diff --git a/db/docs/namespaces.yml b/db/docs/namespaces.yml
new file mode 100644
index 00000000000..49d84d15a75
--- /dev/null
+++ b/db/docs/namespaces.yml
@@ -0,0 +1,12 @@
+---
+table_name: namespaces
+classes:
+- Group
+- Namespace
+- Namespaces::ProjectNamespace
+- Namespaces::UserNamespace
+feature_categories:
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e29ccece332e57c9fb6c532a3680e3b457e3a301
+milestone: "<6.0"
diff --git a/db/docs/namespaces_sync_events.yml b/db/docs/namespaces_sync_events.yml
new file mode 100644
index 00000000000..f674bfcf622
--- /dev/null
+++ b/db/docs/namespaces_sync_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: namespaces_sync_events
+classes:
+- Namespaces::SyncEvent
+feature_categories:
+- sharding
+description: Used as a queue of data that needs to be synchronized between the `ci` and `main` database
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75517
+milestone: '14.6'
diff --git a/db/docs/note_diff_files.yml b/db/docs/note_diff_files.yml
new file mode 100644
index 00000000000..a3908378d92
--- /dev/null
+++ b/db/docs/note_diff_files.yml
@@ -0,0 +1,9 @@
+---
+table_name: note_diff_files
+classes:
+- NoteDiffFile
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/bb8f2520b4254c9dabe377df48e29c5f17894a1d
+milestone: '11.0'
diff --git a/db/docs/notes.yml b/db/docs/notes.yml
new file mode 100644
index 00000000000..9ceeb0e1fe1
--- /dev/null
+++ b/db/docs/notes.yml
@@ -0,0 +1,18 @@
+---
+table_name: notes
+classes:
+- DiffNote
+- DiscussionNote
+- IterationNote
+- LabelNote
+- LegacyDiffNote
+- MilestoneNote
+- Note
+- StateNote
+- SyntheticNote
+- WeightNote
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
+milestone: "<6.0"
diff --git a/db/docs/notification_settings.yml b/db/docs/notification_settings.yml
new file mode 100644
index 00000000000..8791213322c
--- /dev/null
+++ b/db/docs/notification_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: notification_settings
+classes:
+- NotificationSetting
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/31b0e53015e38e51d9c02cca85c9279600b1bf85
+milestone: '8.7'
diff --git a/db/docs/oauth_access_grants.yml b/db/docs/oauth_access_grants.yml
new file mode 100644
index 00000000000..e36f1bcc36c
--- /dev/null
+++ b/db/docs/oauth_access_grants.yml
@@ -0,0 +1,10 @@
+---
+table_name: oauth_access_grants
+classes:
+- Doorkeeper::AccessGrant
+- OauthAccessGrant
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e41dadcb33fda44ee274daa673bd933e13aa90eb
+milestone: '7.7'
diff --git a/db/docs/oauth_access_tokens.yml b/db/docs/oauth_access_tokens.yml
new file mode 100644
index 00000000000..0f9165f1fca
--- /dev/null
+++ b/db/docs/oauth_access_tokens.yml
@@ -0,0 +1,10 @@
+---
+table_name: oauth_access_tokens
+classes:
+- Doorkeeper::AccessToken
+- OauthAccessToken
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e41dadcb33fda44ee274daa673bd933e13aa90eb
+milestone: '7.7'
diff --git a/db/docs/oauth_applications.yml b/db/docs/oauth_applications.yml
new file mode 100644
index 00000000000..307a436373e
--- /dev/null
+++ b/db/docs/oauth_applications.yml
@@ -0,0 +1,9 @@
+---
+table_name: oauth_applications
+classes:
+- Doorkeeper::Application
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e41dadcb33fda44ee274daa673bd933e13aa90eb
+milestone: '7.7'
diff --git a/db/docs/oauth_openid_requests.yml b/db/docs/oauth_openid_requests.yml
new file mode 100644
index 00000000000..321811e1722
--- /dev/null
+++ b/db/docs/oauth_openid_requests.yml
@@ -0,0 +1,9 @@
+---
+table_name: oauth_openid_requests
+classes:
+- Doorkeeper::OpenidConnect::Request
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/c4982890489d254da2fe998aab30bf257767ed5e
+milestone: '9.0'
diff --git a/db/docs/onboarding_progresses.yml b/db/docs/onboarding_progresses.yml
new file mode 100644
index 00000000000..4166b934570
--- /dev/null
+++ b/db/docs/onboarding_progresses.yml
@@ -0,0 +1,9 @@
+---
+table_name: onboarding_progresses
+classes:
+- OnboardingProgress
+feature_categories:
+- onboarding
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50711
+milestone: '13.8'
diff --git a/db/docs/operations_feature_flag_scopes.yml b/db/docs/operations_feature_flag_scopes.yml
new file mode 100644
index 00000000000..05ff4882394
--- /dev/null
+++ b/db/docs/operations_feature_flag_scopes.yml
@@ -0,0 +1,8 @@
+---
+table_name: operations_feature_flag_scopes
+classes: []
+feature_categories:
+- feature_flags
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9110
+milestone: '11.8'
diff --git a/db/docs/operations_feature_flags.yml b/db/docs/operations_feature_flags.yml
new file mode 100644
index 00000000000..1a294aaa07a
--- /dev/null
+++ b/db/docs/operations_feature_flags.yml
@@ -0,0 +1,9 @@
+---
+table_name: operations_feature_flags
+classes:
+- Operations::FeatureFlag
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7433
+milestone: '11.4'
diff --git a/db/docs/operations_feature_flags_clients.yml b/db/docs/operations_feature_flags_clients.yml
new file mode 100644
index 00000000000..ab5f8e5597b
--- /dev/null
+++ b/db/docs/operations_feature_flags_clients.yml
@@ -0,0 +1,9 @@
+---
+table_name: operations_feature_flags_clients
+classes:
+- Operations::FeatureFlagsClient
+feature_categories:
+- feature_flags
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7433
+milestone: '11.4'
diff --git a/db/docs/operations_feature_flags_issues.yml b/db/docs/operations_feature_flags_issues.yml
new file mode 100644
index 00000000000..9b440b5cb41
--- /dev/null
+++ b/db/docs/operations_feature_flags_issues.yml
@@ -0,0 +1,9 @@
+---
+table_name: operations_feature_flags_issues
+classes:
+- FeatureFlagIssue
+feature_categories:
+- feature_flags
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/operations_scopes.yml b/db/docs/operations_scopes.yml
new file mode 100644
index 00000000000..12b8f5b740b
--- /dev/null
+++ b/db/docs/operations_scopes.yml
@@ -0,0 +1,9 @@
+---
+table_name: operations_scopes
+classes:
+- Operations::FeatureFlags::Scope
+feature_categories:
+- feature_flags
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24819
+milestone: '12.8'
diff --git a/db/docs/operations_strategies.yml b/db/docs/operations_strategies.yml
new file mode 100644
index 00000000000..8eb16d28e46
--- /dev/null
+++ b/db/docs/operations_strategies.yml
@@ -0,0 +1,9 @@
+---
+table_name: operations_strategies
+classes:
+- Operations::FeatureFlags::Strategy
+feature_categories:
+- feature_flags
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24819
+milestone: '12.8'
diff --git a/db/docs/operations_strategies_user_lists.yml b/db/docs/operations_strategies_user_lists.yml
new file mode 100644
index 00000000000..7e283021e43
--- /dev/null
+++ b/db/docs/operations_strategies_user_lists.yml
@@ -0,0 +1,9 @@
+---
+table_name: operations_strategies_user_lists
+classes:
+- Operations::FeatureFlags::StrategyUserList
+feature_categories:
+- feature_flags
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/operations_user_lists.yml b/db/docs/operations_user_lists.yml
new file mode 100644
index 00000000000..4f1473bd09d
--- /dev/null
+++ b/db/docs/operations_user_lists.yml
@@ -0,0 +1,9 @@
+---
+table_name: operations_user_lists
+classes:
+- Operations::FeatureFlags::UserList
+feature_categories:
+- feature_flags
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/packages_build_infos.yml b/db/docs/packages_build_infos.yml
new file mode 100644
index 00000000000..5ddea0efdc0
--- /dev/null
+++ b/db/docs/packages_build_infos.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_build_infos
+classes:
+- Packages::BuildInfo
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19796
+milestone: '12.6'
diff --git a/db/docs/packages_composer_cache_files.yml b/db/docs/packages_composer_cache_files.yml
new file mode 100644
index 00000000000..97993c3f255
--- /dev/null
+++ b/db/docs/packages_composer_cache_files.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_composer_cache_files
+classes:
+- Packages::Composer::CacheFile
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51509
+milestone: '13.9'
diff --git a/db/docs/packages_composer_metadata.yml b/db/docs/packages_composer_metadata.yml
new file mode 100644
index 00000000000..a50143c8b82
--- /dev/null
+++ b/db/docs/packages_composer_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_composer_metadata
+classes:
+- Packages::Composer::Metadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/packages_conan_file_metadata.yml b/db/docs/packages_conan_file_metadata.yml
new file mode 100644
index 00000000000..4e3c3c99933
--- /dev/null
+++ b/db/docs/packages_conan_file_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_conan_file_metadata
+classes:
+- Packages::Conan::FileMetadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16418
+milestone: '12.5'
diff --git a/db/docs/packages_conan_metadata.yml b/db/docs/packages_conan_metadata.yml
new file mode 100644
index 00000000000..aba2904d564
--- /dev/null
+++ b/db/docs/packages_conan_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_conan_metadata
+classes:
+- Packages::Conan::Metadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16418
+milestone: '12.5'
diff --git a/db/docs/packages_debian_file_metadata.yml b/db/docs/packages_debian_file_metadata.yml
new file mode 100644
index 00000000000..3d4e17c04f3
--- /dev/null
+++ b/db/docs/packages_debian_file_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_file_metadata
+classes:
+- Packages::Debian::FileMetadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49692
+milestone: '13.8'
diff --git a/db/docs/packages_debian_group_architectures.yml b/db/docs/packages_debian_group_architectures.yml
new file mode 100644
index 00000000000..b403d632dc7
--- /dev/null
+++ b/db/docs/packages_debian_group_architectures.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_group_architectures
+classes:
+- Packages::Debian::GroupArchitecture
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51265
+milestone: '13.8'
diff --git a/db/docs/packages_debian_group_component_files.yml b/db/docs/packages_debian_group_component_files.yml
new file mode 100644
index 00000000000..3b5deebdd10
--- /dev/null
+++ b/db/docs/packages_debian_group_component_files.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_group_component_files
+classes:
+- Packages::Debian::GroupComponentFile
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52885
+milestone: '13.9'
diff --git a/db/docs/packages_debian_group_components.yml b/db/docs/packages_debian_group_components.yml
new file mode 100644
index 00000000000..6d2389fed5a
--- /dev/null
+++ b/db/docs/packages_debian_group_components.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_group_components
+classes:
+- Packages::Debian::GroupComponent
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51732
+milestone: '13.9'
diff --git a/db/docs/packages_debian_group_distribution_keys.yml b/db/docs/packages_debian_group_distribution_keys.yml
new file mode 100644
index 00000000000..527c71d60c1
--- /dev/null
+++ b/db/docs/packages_debian_group_distribution_keys.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_group_distribution_keys
+classes:
+- Packages::Debian::GroupDistributionKey
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60993
+milestone: '14.0'
diff --git a/db/docs/packages_debian_group_distributions.yml b/db/docs/packages_debian_group_distributions.yml
new file mode 100644
index 00000000000..6512640b9f9
--- /dev/null
+++ b/db/docs/packages_debian_group_distributions.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_group_distributions
+classes:
+- Packages::Debian::GroupDistribution
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49405
+milestone: '13.8'
diff --git a/db/docs/packages_debian_project_architectures.yml b/db/docs/packages_debian_project_architectures.yml
new file mode 100644
index 00000000000..853cc81d15f
--- /dev/null
+++ b/db/docs/packages_debian_project_architectures.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_project_architectures
+classes:
+- Packages::Debian::ProjectArchitecture
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51265
+milestone: '13.8'
diff --git a/db/docs/packages_debian_project_component_files.yml b/db/docs/packages_debian_project_component_files.yml
new file mode 100644
index 00000000000..cdd6355750d
--- /dev/null
+++ b/db/docs/packages_debian_project_component_files.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_project_component_files
+classes:
+- Packages::Debian::ProjectComponentFile
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52885
+milestone: '13.9'
diff --git a/db/docs/packages_debian_project_components.yml b/db/docs/packages_debian_project_components.yml
new file mode 100644
index 00000000000..c638e2c978a
--- /dev/null
+++ b/db/docs/packages_debian_project_components.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_project_components
+classes:
+- Packages::Debian::ProjectComponent
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51732
+milestone: '13.9'
diff --git a/db/docs/packages_debian_project_distribution_keys.yml b/db/docs/packages_debian_project_distribution_keys.yml
new file mode 100644
index 00000000000..81408969dec
--- /dev/null
+++ b/db/docs/packages_debian_project_distribution_keys.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_project_distribution_keys
+classes:
+- Packages::Debian::ProjectDistributionKey
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60993
+milestone: '14.0'
diff --git a/db/docs/packages_debian_project_distributions.yml b/db/docs/packages_debian_project_distributions.yml
new file mode 100644
index 00000000000..814ad61f878
--- /dev/null
+++ b/db/docs/packages_debian_project_distributions.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_project_distributions
+classes:
+- Packages::Debian::ProjectDistribution
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49405
+milestone: '13.8'
diff --git a/db/docs/packages_debian_publications.yml b/db/docs/packages_debian_publications.yml
new file mode 100644
index 00000000000..b5ae53759aa
--- /dev/null
+++ b/db/docs/packages_debian_publications.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_debian_publications
+classes:
+- Packages::Debian::Publication
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52916
+milestone: '13.9'
diff --git a/db/docs/packages_dependencies.yml b/db/docs/packages_dependencies.yml
new file mode 100644
index 00000000000..ead51b0606a
--- /dev/null
+++ b/db/docs/packages_dependencies.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_dependencies
+classes:
+- Packages::Dependency
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20549
+milestone: '12.6'
diff --git a/db/docs/packages_dependency_links.yml b/db/docs/packages_dependency_links.yml
new file mode 100644
index 00000000000..1045cd08e42
--- /dev/null
+++ b/db/docs/packages_dependency_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_dependency_links
+classes:
+- Packages::DependencyLink
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20549
+milestone: '12.6'
diff --git a/db/docs/packages_events.yml b/db/docs/packages_events.yml
new file mode 100644
index 00000000000..2d33fb0048d
--- /dev/null
+++ b/db/docs/packages_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_events
+classes:
+- Packages::Event
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+milestone: '13.5'
diff --git a/db/docs/packages_helm_file_metadata.yml b/db/docs/packages_helm_file_metadata.yml
new file mode 100644
index 00000000000..63d5f8d05e6
--- /dev/null
+++ b/db/docs/packages_helm_file_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_helm_file_metadata
+classes:
+- Packages::Helm::FileMetadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57017
+milestone: '13.12'
diff --git a/db/docs/packages_maven_metadata.yml b/db/docs/packages_maven_metadata.yml
new file mode 100644
index 00000000000..6d00fe77502
--- /dev/null
+++ b/db/docs/packages_maven_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_maven_metadata
+classes:
+- Packages::Maven::Metadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607
+milestone: '11.3'
diff --git a/db/docs/packages_npm_metadata.yml b/db/docs/packages_npm_metadata.yml
new file mode 100644
index 00000000000..588e60ebe42
--- /dev/null
+++ b/db/docs/packages_npm_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_npm_metadata
+classes:
+- Packages::Npm::Metadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73639
+milestone: '14.5'
diff --git a/db/docs/packages_nuget_dependency_link_metadata.yml b/db/docs/packages_nuget_dependency_link_metadata.yml
new file mode 100644
index 00000000000..12234295a67
--- /dev/null
+++ b/db/docs/packages_nuget_dependency_link_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_nuget_dependency_link_metadata
+classes:
+- Packages::Nuget::DependencyLinkMetadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/packages_nuget_metadata.yml b/db/docs/packages_nuget_metadata.yml
new file mode 100644
index 00000000000..5c4e1203a85
--- /dev/null
+++ b/db/docs/packages_nuget_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_nuget_metadata
+classes:
+- Packages::Nuget::Metadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/packages_package_file_build_infos.yml b/db/docs/packages_package_file_build_infos.yml
new file mode 100644
index 00000000000..808fb837e70
--- /dev/null
+++ b/db/docs/packages_package_file_build_infos.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_package_file_build_infos
+classes:
+- Packages::PackageFileBuildInfo
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44348
+milestone: '13.6'
diff --git a/db/docs/packages_package_files.yml b/db/docs/packages_package_files.yml
new file mode 100644
index 00000000000..4d7a0410ba4
--- /dev/null
+++ b/db/docs/packages_package_files.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_package_files
+classes:
+- Packages::PackageFile
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607
+milestone: '11.3'
diff --git a/db/docs/packages_packages.yml b/db/docs/packages_packages.yml
new file mode 100644
index 00000000000..2ad5ae62c88
--- /dev/null
+++ b/db/docs/packages_packages.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_packages
+classes:
+- Packages::Package
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607
+milestone: '11.3'
diff --git a/db/docs/packages_pypi_metadata.yml b/db/docs/packages_pypi_metadata.yml
new file mode 100644
index 00000000000..4f39a392f65
--- /dev/null
+++ b/db/docs/packages_pypi_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_pypi_metadata
+classes:
+- Packages::Pypi::Metadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/packages_rubygems_metadata.yml b/db/docs/packages_rubygems_metadata.yml
new file mode 100644
index 00000000000..0384427f782
--- /dev/null
+++ b/db/docs/packages_rubygems_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_rubygems_metadata
+classes:
+- Packages::Rubygems::Metadatum
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52639
+milestone: '13.9'
diff --git a/db/docs/packages_tags.yml b/db/docs/packages_tags.yml
new file mode 100644
index 00000000000..760c7229e9f
--- /dev/null
+++ b/db/docs/packages_tags.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_tags
+classes:
+- Packages::Tag
+feature_categories:
+- package_registry
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20636
+milestone: '12.7'
diff --git a/db/docs/pages_deployment_states.yml b/db/docs/pages_deployment_states.yml
new file mode 100644
index 00000000000..9e526eea46e
--- /dev/null
+++ b/db/docs/pages_deployment_states.yml
@@ -0,0 +1,9 @@
+---
+table_name: pages_deployment_states
+classes:
+- Geo::PagesDeploymentState
+feature_categories:
+- pages
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74905
+milestone: '14.6'
diff --git a/db/docs/pages_deployments.yml b/db/docs/pages_deployments.yml
new file mode 100644
index 00000000000..3c96d27c179
--- /dev/null
+++ b/db/docs/pages_deployments.yml
@@ -0,0 +1,9 @@
+---
+table_name: pages_deployments
+classes:
+- PagesDeployment
+feature_categories:
+- pages
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/pages_domain_acme_orders.yml b/db/docs/pages_domain_acme_orders.yml
new file mode 100644
index 00000000000..7c1a31eac26
--- /dev/null
+++ b/db/docs/pages_domain_acme_orders.yml
@@ -0,0 +1,9 @@
+---
+table_name: pages_domain_acme_orders
+classes:
+- PagesDomainAcmeOrder
+feature_categories:
+- pages
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/14014
+milestone: '12.0'
diff --git a/db/docs/pages_domains.yml b/db/docs/pages_domains.yml
new file mode 100644
index 00000000000..8fecb70740c
--- /dev/null
+++ b/db/docs/pages_domains.yml
@@ -0,0 +1,9 @@
+---
+table_name: pages_domains
+classes:
+- PagesDomain
+feature_categories:
+- pages
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/807a5494fa543392ea7a996b479e577d41ff6344
+milestone: '8.5'
diff --git a/db/docs/path_locks.yml b/db/docs/path_locks.yml
new file mode 100644
index 00000000000..0a6e3390035
--- /dev/null
+++ b/db/docs/path_locks.yml
@@ -0,0 +1,9 @@
+---
+table_name: path_locks
+classes:
+- PathLock
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/684e9d1b5979e11d2edae11a3028a696bfcdedf8
+milestone: '8.9'
diff --git a/db/docs/personal_access_tokens.yml b/db/docs/personal_access_tokens.yml
new file mode 100644
index 00000000000..70ad9a93247
--- /dev/null
+++ b/db/docs/personal_access_tokens.yml
@@ -0,0 +1,9 @@
+---
+table_name: personal_access_tokens
+classes:
+- PersonalAccessToken
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3a609038748055a27c7e01cf4b55d8249709c9cc
+milestone: '8.9'
diff --git a/db/docs/plan_limits.yml b/db/docs/plan_limits.yml
new file mode 100644
index 00000000000..a923704d568
--- /dev/null
+++ b/db/docs/plan_limits.yml
@@ -0,0 +1,9 @@
+---
+table_name: plan_limits
+classes:
+- PlanLimits
+feature_categories:
+- purchase
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19438
+milestone: '12.5'
diff --git a/db/docs/plans.yml b/db/docs/plans.yml
new file mode 100644
index 00000000000..a259d1d1628
--- /dev/null
+++ b/db/docs/plans.yml
@@ -0,0 +1,9 @@
+---
+table_name: plans
+classes:
+- Plan
+feature_categories:
+- purchase
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/39ca951a0f28d147d4689379bbe48a9c14d55d9f
+milestone: '9.5'
diff --git a/db/docs/pool_repositories.yml b/db/docs/pool_repositories.yml
new file mode 100644
index 00000000000..96ca1dcf7d9
--- /dev/null
+++ b/db/docs/pool_repositories.yml
@@ -0,0 +1,9 @@
+---
+table_name: pool_repositories
+classes:
+- PoolRepository
+feature_categories:
+- gitaly
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/fff7754186202cfcdeaa0962c28e5d43ddd705b7
+milestone: '11.6'
diff --git a/db/docs/postgres_async_indexes.yml b/db/docs/postgres_async_indexes.yml
new file mode 100644
index 00000000000..b23b72de808
--- /dev/null
+++ b/db/docs/postgres_async_indexes.yml
@@ -0,0 +1,11 @@
+---
+table_name: postgres_async_indexes
+classes:
+- Gitlab::Database::AsyncIndexes::PostgresAsyncIndex
+feature_categories:
+- database
+description: >-
+ Contains a queue-like structure for database indexes scheduled to be created asynchronously.
+ See https://docs.gitlab.com/ee/development/adding_database_indexes.html#create-indexes-asynchronously for more details.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66478
+milestone: '14.2'
diff --git a/db/docs/postgres_reindex_actions.yml b/db/docs/postgres_reindex_actions.yml
new file mode 100644
index 00000000000..d7297454d6a
--- /dev/null
+++ b/db/docs/postgres_reindex_actions.yml
@@ -0,0 +1,12 @@
+---
+table_name: postgres_reindex_actions
+classes:
+- Gitlab::Database::Reindexing::ReindexAction
+feature_categories:
+- database
+description: >-
+ Captures details about reindexing operations on a per-index basis.
+ See https://docs.gitlab.com/ee/administration/raketasks/maintenance.html#rebuild-database-indexes
+ for details about reindexing.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43156
+milestone: '13.5'
diff --git a/db/docs/postgres_reindex_queued_actions.yml b/db/docs/postgres_reindex_queued_actions.yml
new file mode 100644
index 00000000000..7955d000f8c
--- /dev/null
+++ b/db/docs/postgres_reindex_queued_actions.yml
@@ -0,0 +1,11 @@
+---
+table_name: postgres_reindex_queued_actions
+classes:
+- Gitlab::Database::Reindexing::QueuedAction
+feature_categories:
+- database
+description: >-
+ Contains a queue-like structure for reindexing actions.
+ Actions in this queue will be prioritized over regular reindexing actions.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73480
+milestone: '14.5'
diff --git a/db/docs/product_analytics_events_experimental.yml b/db/docs/product_analytics_events_experimental.yml
new file mode 100644
index 00000000000..c295074b706
--- /dev/null
+++ b/db/docs/product_analytics_events_experimental.yml
@@ -0,0 +1,9 @@
+---
+table_name: product_analytics_events_experimental
+classes:
+- ProductAnalyticsEvent
+feature_categories:
+- product_analytics
+description: Product analytic events, experimental feature.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/fc6c53e6f7b47dc22c8619a5a6fe491d29778d3f
+milestone: '13.2'
diff --git a/db/docs/programming_languages.yml b/db/docs/programming_languages.yml
new file mode 100644
index 00000000000..f1b44508bbb
--- /dev/null
+++ b/db/docs/programming_languages.yml
@@ -0,0 +1,9 @@
+---
+table_name: programming_languages
+classes:
+- ProgrammingLanguage
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/79a5d76801a45696db629e1f543f2e1d6fa4784f
+milestone: '11.2'
diff --git a/db/docs/project_access_tokens.yml b/db/docs/project_access_tokens.yml
new file mode 100644
index 00000000000..59b1ad32857
--- /dev/null
+++ b/db/docs/project_access_tokens.yml
@@ -0,0 +1,8 @@
+---
+table_name: project_access_tokens
+classes: []
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/project_alerting_settings.yml b/db/docs/project_alerting_settings.yml
new file mode 100644
index 00000000000..60a23e35f71
--- /dev/null
+++ b/db/docs/project_alerting_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_alerting_settings
+classes:
+- Alerting::ProjectAlertingSetting
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/39aa9458c282c1dabd3623698da5af3b9a6122a9
+milestone: '11.8'
diff --git a/db/docs/project_aliases.yml b/db/docs/project_aliases.yml
new file mode 100644
index 00000000000..66dead7706a
--- /dev/null
+++ b/db/docs/project_aliases.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_aliases
+classes:
+- ProjectAlias
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/14108
+milestone: '12.1'
diff --git a/db/docs/project_authorizations.yml b/db/docs/project_authorizations.yml
new file mode 100644
index 00000000000..b2ca65a53d5
--- /dev/null
+++ b/db/docs/project_authorizations.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_authorizations
+classes:
+- ProjectAuthorization
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/fd05e26618dd0c123ca476b6f5a3d85f1cfe397a
+milestone: '8.14'
diff --git a/db/docs/project_auto_devops.yml b/db/docs/project_auto_devops.yml
new file mode 100644
index 00000000000..86841b585c3
--- /dev/null
+++ b/db/docs/project_auto_devops.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_auto_devops
+classes:
+- ProjectAutoDevops
+feature_categories:
+- auto_devops
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/6ed490401f49a8941dc7a9e3757ec4012f14ef0b
+milestone: '10.0'
diff --git a/db/docs/project_ci_cd_settings.yml b/db/docs/project_ci_cd_settings.yml
new file mode 100644
index 00000000000..48c1ab42e73
--- /dev/null
+++ b/db/docs/project_ci_cd_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_ci_cd_settings
+classes:
+- ProjectCiCdSetting
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/392c411bdc16386ef42c86afaf8c4d8e4cddb955
+milestone: '10.8'
diff --git a/db/docs/project_ci_feature_usages.yml b/db/docs/project_ci_feature_usages.yml
new file mode 100644
index 00000000000..bc327583a8e
--- /dev/null
+++ b/db/docs/project_ci_feature_usages.yml
@@ -0,0 +1,10 @@
+---
+table_name: project_ci_feature_usages
+classes:
+- Projects::CiFeatureUsage
+feature_categories:
+- projects
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68186
+milestone: '14.2'
diff --git a/db/docs/project_compliance_framework_settings.yml b/db/docs/project_compliance_framework_settings.yml
new file mode 100644
index 00000000000..3d409ca5dd6
--- /dev/null
+++ b/db/docs/project_compliance_framework_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_compliance_framework_settings
+classes:
+- ComplianceManagement::ComplianceFramework::ProjectSettings
+feature_categories:
+- compliance_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/project_custom_attributes.yml b/db/docs/project_custom_attributes.yml
new file mode 100644
index 00000000000..56f425f4c21
--- /dev/null
+++ b/db/docs/project_custom_attributes.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_custom_attributes
+classes:
+- ProjectCustomAttribute
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/6902848a9c54f9eb1bfd82fe173ad0d5d62fe2d5
+milestone: '10.2'
diff --git a/db/docs/project_daily_statistics.yml b/db/docs/project_daily_statistics.yml
new file mode 100644
index 00000000000..cddde444296
--- /dev/null
+++ b/db/docs/project_daily_statistics.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_daily_statistics
+classes:
+- ProjectDailyStatistic
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/5ae9a44aa17c8929627cc450f936cd960c143e25
+milestone: '11.9'
diff --git a/db/docs/project_deploy_tokens.yml b/db/docs/project_deploy_tokens.yml
new file mode 100644
index 00000000000..6f46af5d2e9
--- /dev/null
+++ b/db/docs/project_deploy_tokens.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_deploy_tokens
+classes:
+- ProjectDeployToken
+feature_categories:
+- advanced_deployments
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8315861c9a50675b4f4f4ca536f0da90f27994f3
+milestone: '10.7'
diff --git a/db/docs/project_error_tracking_settings.yml b/db/docs/project_error_tracking_settings.yml
new file mode 100644
index 00000000000..0a1e2571743
--- /dev/null
+++ b/db/docs/project_error_tracking_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_error_tracking_settings
+classes:
+- ErrorTracking::ProjectErrorTrackingSetting
+feature_categories:
+- error_tracking
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f40b5860d76a8ea5d964260834a6e83516b0f1fd
+milestone: '11.7'
diff --git a/db/docs/project_export_jobs.yml b/db/docs/project_export_jobs.yml
new file mode 100644
index 00000000000..2afc913a8bb
--- /dev/null
+++ b/db/docs/project_export_jobs.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_export_jobs
+classes:
+- ProjectExportJob
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23664
+milestone: '12.9'
diff --git a/db/docs/project_feature_usages.yml b/db/docs/project_feature_usages.yml
new file mode 100644
index 00000000000..51e8191c6e5
--- /dev/null
+++ b/db/docs/project_feature_usages.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_feature_usages
+classes:
+- ProjectFeatureUsage
+feature_categories:
+- product_analytics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/21db9a55e200b23a5a47251e9df46fd548c74559
+milestone: '11.8'
diff --git a/db/docs/project_features.yml b/db/docs/project_features.yml
new file mode 100644
index 00000000000..7890f023485
--- /dev/null
+++ b/db/docs/project_features.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_features
+classes:
+- ProjectFeature
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/892dea67717c0efbd6a28f7639f34535ec0a8747
+milestone: '8.12'
diff --git a/db/docs/project_group_links.yml b/db/docs/project_group_links.yml
new file mode 100644
index 00000000000..ca1aedf25b8
--- /dev/null
+++ b/db/docs/project_group_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_group_links
+classes:
+- ProjectGroupLink
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3ac5a759e93e632539438d4564582c645a9f6799
+milestone: "<6.0"
diff --git a/db/docs/project_import_data.yml b/db/docs/project_import_data.yml
new file mode 100644
index 00000000000..5bff9f27dca
--- /dev/null
+++ b/db/docs/project_import_data.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_import_data
+classes:
+- ProjectImportData
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7d98c8842d6bc9b14fb410f028db7ab651961b42
+milestone: '7.10'
diff --git a/db/docs/project_incident_management_settings.yml b/db/docs/project_incident_management_settings.yml
new file mode 100644
index 00000000000..55413824f40
--- /dev/null
+++ b/db/docs/project_incident_management_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_incident_management_settings
+classes:
+- IncidentManagement::ProjectIncidentManagementSetting
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9744
+milestone: '11.9'
diff --git a/db/docs/project_metrics_settings.yml b/db/docs/project_metrics_settings.yml
new file mode 100644
index 00000000000..9090f15278c
--- /dev/null
+++ b/db/docs/project_metrics_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_metrics_settings
+classes:
+- ProjectMetricsSetting
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/bb13ae974c295718eb80c14a179b721ba192a089
+milestone: '11.11'
diff --git a/db/docs/project_mirror_data.yml b/db/docs/project_mirror_data.yml
new file mode 100644
index 00000000000..e6426b7f638
--- /dev/null
+++ b/db/docs/project_mirror_data.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_mirror_data
+classes:
+- ProjectImportState
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/0ca479d1ce0eadfcdc0e29d0e18136f5790d5b2f
+milestone: '9.3'
diff --git a/db/docs/project_pages_metadata.yml b/db/docs/project_pages_metadata.yml
new file mode 100644
index 00000000000..38da6c77f83
--- /dev/null
+++ b/db/docs/project_pages_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_pages_metadata
+classes:
+- ProjectPagesMetadatum
+feature_categories:
+- pages
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17197
+milestone: '12.4'
diff --git a/db/docs/project_repositories.yml b/db/docs/project_repositories.yml
new file mode 100644
index 00000000000..cd0d7a6c1d7
--- /dev/null
+++ b/db/docs/project_repositories.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_repositories
+classes:
+- ProjectRepository
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8614
+milestone: '11.6'
diff --git a/db/docs/project_repository_states.yml b/db/docs/project_repository_states.yml
new file mode 100644
index 00000000000..343ae980a88
--- /dev/null
+++ b/db/docs/project_repository_states.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_repository_states
+classes:
+- ProjectRepositoryState
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4428
+milestone: '10.6'
diff --git a/db/docs/project_repository_storage_moves.yml b/db/docs/project_repository_storage_moves.yml
new file mode 100644
index 00000000000..fe3886a7690
--- /dev/null
+++ b/db/docs/project_repository_storage_moves.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_repository_storage_moves
+classes:
+- Projects::RepositoryStorageMove
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/project_security_settings.yml b/db/docs/project_security_settings.yml
new file mode 100644
index 00000000000..b1f6264950a
--- /dev/null
+++ b/db/docs/project_security_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_security_settings
+classes:
+- ProjectSecuritySetting
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/project_settings.yml b/db/docs/project_settings.yml
new file mode 100644
index 00000000000..5aa3d6daf48
--- /dev/null
+++ b/db/docs/project_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_settings
+classes:
+- ProjectSetting
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/a2a7ad291f64a5db74c1bc21fb556e6e8862d0f3
+milestone: '12.8'
diff --git a/db/docs/project_statistics.yml b/db/docs/project_statistics.yml
new file mode 100644
index 00000000000..75d4af85ce4
--- /dev/null
+++ b/db/docs/project_statistics.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_statistics
+classes:
+- ProjectStatistics
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3ef4f74b1acc9399db320b53dffc592542de0126
+milestone: '9.0'
diff --git a/db/docs/project_topics.yml b/db/docs/project_topics.yml
new file mode 100644
index 00000000000..addad163923
--- /dev/null
+++ b/db/docs/project_topics.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_topics
+classes:
+- Projects::ProjectTopic
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67574
+milestone: '14.3'
diff --git a/db/docs/project_tracing_settings.yml b/db/docs/project_tracing_settings.yml
new file mode 100644
index 00000000000..cc7e65a6cb8
--- /dev/null
+++ b/db/docs/project_tracing_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_tracing_settings
+classes:
+- ProjectTracingSetting
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7903
+milestone: '11.5'
diff --git a/db/docs/projects.yml b/db/docs/projects.yml
new file mode 100644
index 00000000000..41fef75ae0c
--- /dev/null
+++ b/db/docs/projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: projects
+classes:
+- Project
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
+milestone: "<6.0"
diff --git a/db/docs/projects_sync_events.yml b/db/docs/projects_sync_events.yml
new file mode 100644
index 00000000000..cdc27423778
--- /dev/null
+++ b/db/docs/projects_sync_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: projects_sync_events
+classes:
+- Projects::SyncEvent
+feature_categories:
+- sharding
+description: Used as a queue of data that needs to be synchronized between the `ci` and `main` database
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75517
+milestone: '14.6'
diff --git a/db/docs/prometheus_alert_events.yml b/db/docs/prometheus_alert_events.yml
new file mode 100644
index 00000000000..9fed9d9d73b
--- /dev/null
+++ b/db/docs/prometheus_alert_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: prometheus_alert_events
+classes:
+- PrometheusAlertEvent
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7493
+milestone: '11.4'
diff --git a/db/docs/prometheus_alerts.yml b/db/docs/prometheus_alerts.yml
new file mode 100644
index 00000000000..0e017292f81
--- /dev/null
+++ b/db/docs/prometheus_alerts.yml
@@ -0,0 +1,9 @@
+---
+table_name: prometheus_alerts
+classes:
+- PrometheusAlert
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6590
+milestone: '11.2'
diff --git a/db/docs/prometheus_metrics.yml b/db/docs/prometheus_metrics.yml
new file mode 100644
index 00000000000..315aaf7f9bd
--- /dev/null
+++ b/db/docs/prometheus_metrics.yml
@@ -0,0 +1,9 @@
+---
+table_name: prometheus_metrics
+classes:
+- PrometheusMetric
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3799
+milestone: '9.3'
diff --git a/db/docs/protected_branch_merge_access_levels.yml b/db/docs/protected_branch_merge_access_levels.yml
new file mode 100644
index 00000000000..953d05f8eec
--- /dev/null
+++ b/db/docs/protected_branch_merge_access_levels.yml
@@ -0,0 +1,9 @@
+---
+table_name: protected_branch_merge_access_levels
+classes:
+- ProtectedBranch::MergeAccessLevel
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5081
+milestone: '8.11'
diff --git a/db/docs/protected_branch_push_access_levels.yml b/db/docs/protected_branch_push_access_levels.yml
new file mode 100644
index 00000000000..58010735b0f
--- /dev/null
+++ b/db/docs/protected_branch_push_access_levels.yml
@@ -0,0 +1,9 @@
+---
+table_name: protected_branch_push_access_levels
+classes:
+- ProtectedBranch::PushAccessLevel
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5081
+milestone: '8.11'
diff --git a/db/docs/protected_branch_unprotect_access_levels.yml b/db/docs/protected_branch_unprotect_access_levels.yml
new file mode 100644
index 00000000000..635cf646df2
--- /dev/null
+++ b/db/docs/protected_branch_unprotect_access_levels.yml
@@ -0,0 +1,9 @@
+---
+table_name: protected_branch_unprotect_access_levels
+classes:
+- ProtectedBranch::UnprotectAccessLevel
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/5103
+milestone: '10.7'
diff --git a/db/docs/protected_branches.yml b/db/docs/protected_branches.yml
new file mode 100644
index 00000000000..d1851c7cde6
--- /dev/null
+++ b/db/docs/protected_branches.yml
@@ -0,0 +1,10 @@
+---
+table_name: protected_branches
+classes:
+- ExportedProtectedBranch
+- ProtectedBranch
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/37224dc9c1ee80ba9030b616e2bc87bd96919e09
+milestone: "<6.0"
diff --git a/db/docs/protected_environment_deploy_access_levels.yml b/db/docs/protected_environment_deploy_access_levels.yml
new file mode 100644
index 00000000000..e8b10ba099e
--- /dev/null
+++ b/db/docs/protected_environment_deploy_access_levels.yml
@@ -0,0 +1,9 @@
+---
+table_name: protected_environment_deploy_access_levels
+classes:
+- ProtectedEnvironment::DeployAccessLevel
+feature_categories:
+- continuous_delivery
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6672
+milestone: '11.3'
diff --git a/db/docs/protected_environments.yml b/db/docs/protected_environments.yml
new file mode 100644
index 00000000000..92b6cdcc1f7
--- /dev/null
+++ b/db/docs/protected_environments.yml
@@ -0,0 +1,9 @@
+---
+table_name: protected_environments
+classes:
+- ProtectedEnvironment
+feature_categories:
+- continuous_delivery
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6672
+milestone: '11.3'
diff --git a/db/docs/protected_tag_create_access_levels.yml b/db/docs/protected_tag_create_access_levels.yml
new file mode 100644
index 00000000000..9856b1a0f25
--- /dev/null
+++ b/db/docs/protected_tag_create_access_levels.yml
@@ -0,0 +1,9 @@
+---
+table_name: protected_tag_create_access_levels
+classes:
+- ProtectedTag::CreateAccessLevel
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/07d7d8e65905a39164b63f55eccdcea8f10f5d14
+milestone: '9.1'
diff --git a/db/docs/protected_tags.yml b/db/docs/protected_tags.yml
new file mode 100644
index 00000000000..0a18451d592
--- /dev/null
+++ b/db/docs/protected_tags.yml
@@ -0,0 +1,9 @@
+---
+table_name: protected_tags
+classes:
+- ProtectedTag
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1a416a42f1c1b876ecd96687e41696bc915cc2c2
+milestone: '9.1'
diff --git a/db/docs/push_event_payloads.yml b/db/docs/push_event_payloads.yml
new file mode 100644
index 00000000000..ea40e5270f4
--- /dev/null
+++ b/db/docs/push_event_payloads.yml
@@ -0,0 +1,9 @@
+---
+table_name: push_event_payloads
+classes:
+- PushEventPayload
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/0395c47193b3bbf6b4f060f28c9f632580313a35
+milestone: '9.5'
diff --git a/db/docs/push_rules.yml b/db/docs/push_rules.yml
new file mode 100644
index 00000000000..6b62013892b
--- /dev/null
+++ b/db/docs/push_rules.yml
@@ -0,0 +1,9 @@
+---
+table_name: push_rules
+classes:
+- PushRule
+feature_categories:
+- compliance_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1b98b5ab97ce3e9997df542059cbf3c6ce0bf0e1
+milestone: '8.10'
diff --git a/db/docs/raw_usage_data.yml b/db/docs/raw_usage_data.yml
new file mode 100644
index 00000000000..36dfbd7742a
--- /dev/null
+++ b/db/docs/raw_usage_data.yml
@@ -0,0 +1,9 @@
+---
+table_name: raw_usage_data
+classes:
+- RawUsageData
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.3'
diff --git a/db/docs/redirect_routes.yml b/db/docs/redirect_routes.yml
new file mode 100644
index 00000000000..315a251a921
--- /dev/null
+++ b/db/docs/redirect_routes.yml
@@ -0,0 +1,10 @@
+---
+table_name: redirect_routes
+classes:
+- RedirectRoute
+feature_categories:
+- projects
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7d02bcd2e0165a90a9f2c1edb34b064ff76afd69
+milestone: '9.2'
diff --git a/db/docs/related_epic_links.yml b/db/docs/related_epic_links.yml
new file mode 100644
index 00000000000..a99b8791703
--- /dev/null
+++ b/db/docs/related_epic_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: related_epic_links
+classes:
+- Epic::RelatedEpicLink
+feature_categories:
+- portfolio_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80499
+milestone: '14.9'
diff --git a/db/docs/release_links.yml b/db/docs/release_links.yml
new file mode 100644
index 00000000000..b4fc4f4b043
--- /dev/null
+++ b/db/docs/release_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: release_links
+classes:
+- Releases::Link
+feature_categories:
+- release_orchestration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/66755c9ed506af9f51022a678ed26e5d31ee87ac
+milestone: '11.7'
diff --git a/db/docs/releases.yml b/db/docs/releases.yml
new file mode 100644
index 00000000000..0c496b7355f
--- /dev/null
+++ b/db/docs/releases.yml
@@ -0,0 +1,9 @@
+---
+table_name: releases
+classes:
+- Release
+feature_categories:
+- release_orchestration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1c4d1c3bd69a6f9ec43cce4ab59de4ba47f73229
+milestone: '8.2'
diff --git a/db/docs/remote_mirrors.yml b/db/docs/remote_mirrors.yml
new file mode 100644
index 00000000000..6926e0d2633
--- /dev/null
+++ b/db/docs/remote_mirrors.yml
@@ -0,0 +1,9 @@
+---
+table_name: remote_mirrors
+classes:
+- RemoteMirror
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/ab83917c25c5d1f7dd29c82c91c699008292bc1d
+milestone: '8.7'
diff --git a/db/docs/repository_languages.yml b/db/docs/repository_languages.yml
new file mode 100644
index 00000000000..b38afde69a0
--- /dev/null
+++ b/db/docs/repository_languages.yml
@@ -0,0 +1,9 @@
+---
+table_name: repository_languages
+classes:
+- RepositoryLanguage
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/79a5d76801a45696db629e1f543f2e1d6fa4784f
+milestone: '11.2'
diff --git a/db/docs/required_code_owners_sections.yml b/db/docs/required_code_owners_sections.yml
new file mode 100644
index 00000000000..a8018193d30
--- /dev/null
+++ b/db/docs/required_code_owners_sections.yml
@@ -0,0 +1,9 @@
+---
+table_name: required_code_owners_sections
+classes:
+- ProtectedBranch::RequiredCodeOwnersSection
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43573
+milestone: '13.5'
diff --git a/db/docs/requirements.yml b/db/docs/requirements.yml
new file mode 100644
index 00000000000..fc473246e53
--- /dev/null
+++ b/db/docs/requirements.yml
@@ -0,0 +1,9 @@
+---
+table_name: requirements
+classes:
+- RequirementsManagement::Requirement
+feature_categories:
+- requirements_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26097
+milestone: '12.9'
diff --git a/db/docs/requirements_management_test_reports.yml b/db/docs/requirements_management_test_reports.yml
new file mode 100644
index 00000000000..a39bb19637f
--- /dev/null
+++ b/db/docs/requirements_management_test_reports.yml
@@ -0,0 +1,9 @@
+---
+table_name: requirements_management_test_reports
+classes:
+- RequirementsManagement::TestReport
+feature_categories:
+- requirements_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.1'
diff --git a/db/docs/resource_iteration_events.yml b/db/docs/resource_iteration_events.yml
new file mode 100644
index 00000000000..96be1471854
--- /dev/null
+++ b/db/docs/resource_iteration_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: resource_iteration_events
+classes:
+- ResourceIterationEvent
+feature_categories:
+- planning_analytics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.3'
diff --git a/db/docs/resource_label_events.yml b/db/docs/resource_label_events.yml
new file mode 100644
index 00000000000..08b3fc0b184
--- /dev/null
+++ b/db/docs/resource_label_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: resource_label_events
+classes:
+- ResourceLabelEvent
+feature_categories:
+- planning_analytics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6697
+milestone: '11.2'
diff --git a/db/docs/resource_milestone_events.yml b/db/docs/resource_milestone_events.yml
new file mode 100644
index 00000000000..5a6dfdb3d61
--- /dev/null
+++ b/db/docs/resource_milestone_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: resource_milestone_events
+classes:
+- ResourceMilestoneEvent
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23965
+milestone: '12.8'
diff --git a/db/docs/resource_state_events.yml b/db/docs/resource_state_events.yml
new file mode 100644
index 00000000000..c5bd88c7927
--- /dev/null
+++ b/db/docs/resource_state_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: resource_state_events
+classes:
+- ResourceStateEvent
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/resource_weight_events.yml b/db/docs/resource_weight_events.yml
new file mode 100644
index 00000000000..bc2d34d382c
--- /dev/null
+++ b/db/docs/resource_weight_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: resource_weight_events
+classes:
+- ResourceWeightEvent
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21515
+milestone: '12.7'
diff --git a/db/docs/reviews.yml b/db/docs/reviews.yml
new file mode 100644
index 00000000000..299574bbe23
--- /dev/null
+++ b/db/docs/reviews.yml
@@ -0,0 +1,9 @@
+---
+table_name: reviews
+classes:
+- Review
+feature_categories:
+- review_apps
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8442
+milestone: '11.6'
diff --git a/db/docs/routes.yml b/db/docs/routes.yml
new file mode 100644
index 00000000000..9b325694f03
--- /dev/null
+++ b/db/docs/routes.yml
@@ -0,0 +1,11 @@
+---
+table_name: routes
+classes:
+- Gitlab::Database::RenameReservedPathsMigration::V1::MigrationClasses::Route
+- Route
+feature_categories:
+- projects
+- subgroups
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/83232be0e14cc8b35bf74532203a6e4371c15e70
+milestone: '9.0'
diff --git a/db/docs/saml_group_links.yml b/db/docs/saml_group_links.yml
new file mode 100644
index 00000000000..109fd62a16b
--- /dev/null
+++ b/db/docs/saml_group_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: saml_group_links
+classes:
+- SamlGroupLink
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45061
+milestone: '13.5'
diff --git a/db/docs/saml_providers.yml b/db/docs/saml_providers.yml
new file mode 100644
index 00000000000..42f2fa956b6
--- /dev/null
+++ b/db/docs/saml_providers.yml
@@ -0,0 +1,9 @@
+---
+table_name: saml_providers
+classes:
+- SamlProvider
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4549
+milestone: '10.7'
diff --git a/db/docs/saved_replies.yml b/db/docs/saved_replies.yml
new file mode 100644
index 00000000000..e4f24d2b6c9
--- /dev/null
+++ b/db/docs/saved_replies.yml
@@ -0,0 +1,9 @@
+---
+table_name: saved_replies
+classes:
+- Users::SavedReply
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80807
+milestone: '14.9'
diff --git a/db/docs/schema_migrations.yml b/db/docs/schema_migrations.yml
new file mode 100644
index 00000000000..f09cdb7bb53
--- /dev/null
+++ b/db/docs/schema_migrations.yml
@@ -0,0 +1,10 @@
+---
+table_name: schema_migrations
+classes:
+- ActiveRecord::SchemaMigration
+- Geo::TrackingBase::SchemaMigration
+feature_categories:
+- database
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/scim_identities.yml b/db/docs/scim_identities.yml
new file mode 100644
index 00000000000..1aa56dc2740
--- /dev/null
+++ b/db/docs/scim_identities.yml
@@ -0,0 +1,9 @@
+---
+table_name: scim_identities
+classes:
+- ScimIdentity
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26124
+milestone: '12.9'
diff --git a/db/docs/scim_oauth_access_tokens.yml b/db/docs/scim_oauth_access_tokens.yml
new file mode 100644
index 00000000000..bc258eda41a
--- /dev/null
+++ b/db/docs/scim_oauth_access_tokens.yml
@@ -0,0 +1,9 @@
+---
+table_name: scim_oauth_access_tokens
+classes:
+- ScimOauthAccessToken
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e9b2253fe3538234d1c4d173c4549a955233d836
+milestone: '11.10'
diff --git a/db/docs/security_findings.yml b/db/docs/security_findings.yml
new file mode 100644
index 00000000000..57a5d18c288
--- /dev/null
+++ b/db/docs/security_findings.yml
@@ -0,0 +1,9 @@
+---
+table_name: security_findings
+classes:
+- Security::Finding
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/security_orchestration_policy_configurations.yml b/db/docs/security_orchestration_policy_configurations.yml
new file mode 100644
index 00000000000..0505aad2317
--- /dev/null
+++ b/db/docs/security_orchestration_policy_configurations.yml
@@ -0,0 +1,9 @@
+---
+table_name: security_orchestration_policy_configurations
+classes:
+- Security::OrchestrationPolicyConfiguration
+feature_categories:
+- security_orchestration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53743
+milestone: '13.9'
diff --git a/db/docs/security_orchestration_policy_rule_schedules.yml b/db/docs/security_orchestration_policy_rule_schedules.yml
new file mode 100644
index 00000000000..a4fea57adaf
--- /dev/null
+++ b/db/docs/security_orchestration_policy_rule_schedules.yml
@@ -0,0 +1,9 @@
+---
+table_name: security_orchestration_policy_rule_schedules
+classes:
+- Security::OrchestrationPolicyRuleSchedule
+feature_categories:
+- security_orchestration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59842
+milestone: '13.12'
diff --git a/db/docs/security_scans.yml b/db/docs/security_scans.yml
new file mode 100644
index 00000000000..e50afd83472
--- /dev/null
+++ b/db/docs/security_scans.yml
@@ -0,0 +1,9 @@
+---
+table_name: security_scans
+classes:
+- Security::Scan
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23669
+milestone: '12.8'
diff --git a/db/docs/security_training_providers.yml b/db/docs/security_training_providers.yml
new file mode 100644
index 00000000000..ba805a13e47
--- /dev/null
+++ b/db/docs/security_training_providers.yml
@@ -0,0 +1,9 @@
+---
+table_name: security_training_providers
+classes:
+- Security::TrainingProvider
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78195
+milestone: '14.7'
diff --git a/db/docs/security_trainings.yml b/db/docs/security_trainings.yml
new file mode 100644
index 00000000000..310963541f0
--- /dev/null
+++ b/db/docs/security_trainings.yml
@@ -0,0 +1,9 @@
+---
+table_name: security_trainings
+classes:
+- Security::Training
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78195
+milestone: '14.7'
diff --git a/db/docs/self_managed_prometheus_alert_events.yml b/db/docs/self_managed_prometheus_alert_events.yml
new file mode 100644
index 00000000000..83eb24475c9
--- /dev/null
+++ b/db/docs/self_managed_prometheus_alert_events.yml
@@ -0,0 +1,9 @@
+---
+table_name: self_managed_prometheus_alert_events
+classes:
+- SelfManagedPrometheusAlertEvent
+feature_categories:
+- metrics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18046
+milestone: '12.4'
diff --git a/db/docs/sent_notifications.yml b/db/docs/sent_notifications.yml
new file mode 100644
index 00000000000..db42e03c7cc
--- /dev/null
+++ b/db/docs/sent_notifications.yml
@@ -0,0 +1,9 @@
+---
+table_name: sent_notifications
+classes:
+- SentNotification
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f76eac56b9d7d4ae61010cddcca68682824b2239
+milestone: '8.0'
diff --git a/db/docs/sentry_issues.yml b/db/docs/sentry_issues.yml
new file mode 100644
index 00000000000..898d4ddbae1
--- /dev/null
+++ b/db/docs/sentry_issues.yml
@@ -0,0 +1,9 @@
+---
+table_name: sentry_issues
+classes:
+- SentryIssue
+feature_categories:
+- error_tracking
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20629
+milestone: '12.6'
diff --git a/db/docs/serverless_domain_cluster.yml b/db/docs/serverless_domain_cluster.yml
new file mode 100644
index 00000000000..d41f8b45c27
--- /dev/null
+++ b/db/docs/serverless_domain_cluster.yml
@@ -0,0 +1,9 @@
+---
+table_name: serverless_domain_cluster
+classes:
+- Serverless::DomainCluster
+feature_categories:
+- deployment_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19835
+milestone: '12.6'
diff --git a/db/docs/service_desk_settings.yml b/db/docs/service_desk_settings.yml
new file mode 100644
index 00000000000..a346b98b8ec
--- /dev/null
+++ b/db/docs/service_desk_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: service_desk_settings
+classes:
+- ServiceDeskSetting
+feature_categories:
+- service_desk
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19515
+milestone: '12.6'
diff --git a/db/docs/shards.yml b/db/docs/shards.yml
new file mode 100644
index 00000000000..ffd4be0b12d
--- /dev/null
+++ b/db/docs/shards.yml
@@ -0,0 +1,9 @@
+---
+table_name: shards
+classes:
+- Shard
+feature_categories:
+- gitaly
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f760c1cd17881c8aef3a33a3b43db54673db8111
+milestone: '10.5'
diff --git a/db/docs/slack_integrations.yml b/db/docs/slack_integrations.yml
new file mode 100644
index 00000000000..0c4b0ea97a5
--- /dev/null
+++ b/db/docs/slack_integrations.yml
@@ -0,0 +1,9 @@
+---
+table_name: slack_integrations
+classes:
+- SlackIntegration
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f50ef96b87d8c785662e82843c22a2ef6093132e
+milestone: '9.4'
diff --git a/db/docs/smartcard_identities.yml b/db/docs/smartcard_identities.yml
new file mode 100644
index 00000000000..ad798c0728d
--- /dev/null
+++ b/db/docs/smartcard_identities.yml
@@ -0,0 +1,9 @@
+---
+table_name: smartcard_identities
+classes:
+- SmartcardIdentity
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/b6316689fdc2d142af85b17d511d39e50712b420
+milestone: '11.6'
diff --git a/db/docs/snippet_repositories.yml b/db/docs/snippet_repositories.yml
new file mode 100644
index 00000000000..c8bffcd9f7a
--- /dev/null
+++ b/db/docs/snippet_repositories.yml
@@ -0,0 +1,9 @@
+---
+table_name: snippet_repositories
+classes:
+- SnippetRepository
+feature_categories:
+- snippets
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23796
+milestone: '12.8'
diff --git a/db/docs/snippet_repository_storage_moves.yml b/db/docs/snippet_repository_storage_moves.yml
new file mode 100644
index 00000000000..e8fea9995c7
--- /dev/null
+++ b/db/docs/snippet_repository_storage_moves.yml
@@ -0,0 +1,9 @@
+---
+table_name: snippet_repository_storage_moves
+classes:
+- Snippets::RepositoryStorageMove
+feature_categories:
+- gitaly
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45990
+milestone: '13.6'
diff --git a/db/docs/snippet_statistics.yml b/db/docs/snippet_statistics.yml
new file mode 100644
index 00000000000..4e9de04a918
--- /dev/null
+++ b/db/docs/snippet_statistics.yml
@@ -0,0 +1,9 @@
+---
+table_name: snippet_statistics
+classes:
+- SnippetStatistics
+feature_categories:
+- snippets
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/snippet_user_mentions.yml b/db/docs/snippet_user_mentions.yml
new file mode 100644
index 00000000000..726b10aa62e
--- /dev/null
+++ b/db/docs/snippet_user_mentions.yml
@@ -0,0 +1,9 @@
+---
+table_name: snippet_user_mentions
+classes:
+- SnippetUserMention
+feature_categories:
+- snippets
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
+milestone: '12.6'
diff --git a/db/docs/snippets.yml b/db/docs/snippets.yml
new file mode 100644
index 00000000000..b370e9c3bd6
--- /dev/null
+++ b/db/docs/snippets.yml
@@ -0,0 +1,11 @@
+---
+table_name: snippets
+classes:
+- PersonalSnippet
+- ProjectSnippet
+- Snippet
+feature_categories:
+- snippets
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9265de3d25715aeafd38a4ef41596dca058dc18c
+milestone: "<6.0"
diff --git a/db/docs/software_license_policies.yml b/db/docs/software_license_policies.yml
new file mode 100644
index 00000000000..7da6a69651c
--- /dev/null
+++ b/db/docs/software_license_policies.yml
@@ -0,0 +1,9 @@
+---
+table_name: software_license_policies
+classes:
+- SoftwareLicensePolicy
+feature_categories:
+- license_compliance
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6246
+milestone: '11.2'
diff --git a/db/docs/software_licenses.yml b/db/docs/software_licenses.yml
new file mode 100644
index 00000000000..26780aa5ef9
--- /dev/null
+++ b/db/docs/software_licenses.yml
@@ -0,0 +1,9 @@
+---
+table_name: software_licenses
+classes:
+- SoftwareLicense
+feature_categories:
+- license_compliance
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6246
+milestone: '11.2'
diff --git a/db/docs/spam_logs.yml b/db/docs/spam_logs.yml
new file mode 100644
index 00000000000..35fa08ef46d
--- /dev/null
+++ b/db/docs/spam_logs.yml
@@ -0,0 +1,9 @@
+---
+table_name: spam_logs
+classes:
+- SpamLog
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d20e75a8d80c2828336cd22897ea6868d666f8a5
+milestone: '8.5'
diff --git a/db/docs/sprints.yml b/db/docs/sprints.yml
new file mode 100644
index 00000000000..f330c47484f
--- /dev/null
+++ b/db/docs/sprints.yml
@@ -0,0 +1,9 @@
+---
+table_name: sprints
+classes:
+- Iteration
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/status_check_responses.yml b/db/docs/status_check_responses.yml
new file mode 100644
index 00000000000..0959a44106b
--- /dev/null
+++ b/db/docs/status_check_responses.yml
@@ -0,0 +1,9 @@
+---
+table_name: status_check_responses
+classes:
+- MergeRequests::StatusCheckResponse
+feature_categories:
+- compliance_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61135
+milestone: '13.12'
diff --git a/db/docs/status_page_published_incidents.yml b/db/docs/status_page_published_incidents.yml
new file mode 100644
index 00000000000..79d46ba2ad4
--- /dev/null
+++ b/db/docs/status_page_published_incidents.yml
@@ -0,0 +1,9 @@
+---
+table_name: status_page_published_incidents
+classes:
+- StatusPage::PublishedIncident
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/status_page_settings.yml b/db/docs/status_page_settings.yml
new file mode 100644
index 00000000000..b4022bdb678
--- /dev/null
+++ b/db/docs/status_page_settings.yml
@@ -0,0 +1,9 @@
+---
+table_name: status_page_settings
+classes:
+- StatusPage::ProjectSetting
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25863
+milestone: '12.9'
diff --git a/db/docs/subscriptions.yml b/db/docs/subscriptions.yml
new file mode 100644
index 00000000000..524ca06f34f
--- /dev/null
+++ b/db/docs/subscriptions.yml
@@ -0,0 +1,9 @@
+---
+table_name: subscriptions
+classes:
+- Subscription
+feature_categories:
+- continuous_integration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/410d25c8ca8afabb25e5f89b36e3cfd09ffe6f87
+milestone: '7.9'
diff --git a/db/docs/suggestions.yml b/db/docs/suggestions.yml
new file mode 100644
index 00000000000..2ecaddb2704
--- /dev/null
+++ b/db/docs/suggestions.yml
@@ -0,0 +1,9 @@
+---
+table_name: suggestions
+classes:
+- Suggestion
+feature_categories:
+- code_review
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/23d6fbf1c016aba0374b9675f621d97f52d1abb9
+milestone: '11.6'
diff --git a/db/docs/system_note_metadata.yml b/db/docs/system_note_metadata.yml
new file mode 100644
index 00000000000..305b4501b60
--- /dev/null
+++ b/db/docs/system_note_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: system_note_metadata
+classes:
+- SystemNoteMetadata
+feature_categories:
+- importers
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1c3c7fb25d972fc19d5b4bb371cb21094d81e478
+milestone: '9.1'
diff --git a/db/docs/taggings.yml b/db/docs/taggings.yml
new file mode 100644
index 00000000000..a13108e705a
--- /dev/null
+++ b/db/docs/taggings.yml
@@ -0,0 +1,9 @@
+---
+table_name: taggings
+classes:
+- ActsAsTaggableOn::Tagging
+feature_categories:
+- runner
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/b946da44695c9c8fe8867bb87bcdf801c52177d3
+milestone: "<6.0"
diff --git a/db/docs/tags.yml b/db/docs/tags.yml
new file mode 100644
index 00000000000..2d4820d6095
--- /dev/null
+++ b/db/docs/tags.yml
@@ -0,0 +1,9 @@
+---
+table_name: tags
+classes:
+- ActsAsTaggableOn::Tag
+feature_categories:
+- runner
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/b946da44695c9c8fe8867bb87bcdf801c52177d3
+milestone: "<6.0"
diff --git a/db/docs/term_agreements.yml b/db/docs/term_agreements.yml
new file mode 100644
index 00000000000..dd0bd829b19
--- /dev/null
+++ b/db/docs/term_agreements.yml
@@ -0,0 +1,9 @@
+---
+table_name: term_agreements
+classes:
+- TermAgreement
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/82eeb72c8c03727540b902d40e7e657d0a5ecb4c
+milestone: '10.8'
diff --git a/db/docs/terraform_state_versions.yml b/db/docs/terraform_state_versions.yml
new file mode 100644
index 00000000000..8c1110caa95
--- /dev/null
+++ b/db/docs/terraform_state_versions.yml
@@ -0,0 +1,9 @@
+---
+table_name: terraform_state_versions
+classes:
+- Terraform::StateVersion
+feature_categories:
+- infrastructure_as_code
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.4'
diff --git a/db/docs/terraform_states.yml b/db/docs/terraform_states.yml
new file mode 100644
index 00000000000..90be304d898
--- /dev/null
+++ b/db/docs/terraform_states.yml
@@ -0,0 +1,9 @@
+---
+table_name: terraform_states
+classes:
+- Terraform::State
+feature_categories:
+- infrastructure_as_code
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/timelogs.yml b/db/docs/timelogs.yml
new file mode 100644
index 00000000000..ab01a1f1f6a
--- /dev/null
+++ b/db/docs/timelogs.yml
@@ -0,0 +1,9 @@
+---
+table_name: timelogs
+classes:
+- Timelog
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/bf13fa054a67d5245ee83555e730d7ee6ab7264c
+milestone: '8.14'
diff --git a/db/docs/todos.yml b/db/docs/todos.yml
new file mode 100644
index 00000000000..1f4db172e2b
--- /dev/null
+++ b/db/docs/todos.yml
@@ -0,0 +1,9 @@
+---
+table_name: todos
+classes:
+- Todo
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3d52e139b13ad077286f2f9f46b7e98f43ad9564
+milestone: '8.5'
diff --git a/db/docs/token_with_ivs.yml b/db/docs/token_with_ivs.yml
new file mode 100644
index 00000000000..1df428afdaa
--- /dev/null
+++ b/db/docs/token_with_ivs.yml
@@ -0,0 +1,9 @@
+---
+table_name: token_with_ivs
+classes:
+- TokenWithIv
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/37b80b4048190c2e1a35ec399e4aeb35d511090e
+milestone: '13.9'
diff --git a/db/docs/topics.yml b/db/docs/topics.yml
new file mode 100644
index 00000000000..d093c263386
--- /dev/null
+++ b/db/docs/topics.yml
@@ -0,0 +1,9 @@
+---
+table_name: topics
+classes:
+- Projects::Topic
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67574
+milestone: '14.3'
diff --git a/db/docs/trending_projects.yml b/db/docs/trending_projects.yml
new file mode 100644
index 00000000000..9dd23857da0
--- /dev/null
+++ b/db/docs/trending_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: trending_projects
+classes:
+- TrendingProject
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/237c8f66e6608420629503280aaea555ee980022
+milestone: '8.13'
diff --git a/db/docs/u2f_registrations.yml b/db/docs/u2f_registrations.yml
new file mode 100644
index 00000000000..c6e1b65eea4
--- /dev/null
+++ b/db/docs/u2f_registrations.yml
@@ -0,0 +1,9 @@
+---
+table_name: u2f_registrations
+classes:
+- U2fRegistration
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/791cc9138be6ea1783e3c3853370cf0290f4d41e
+milestone: '8.9'
diff --git a/db/docs/upcoming_reconciliations.yml b/db/docs/upcoming_reconciliations.yml
new file mode 100644
index 00000000000..4d8e505c888
--- /dev/null
+++ b/db/docs/upcoming_reconciliations.yml
@@ -0,0 +1,9 @@
+---
+table_name: upcoming_reconciliations
+classes:
+- GitlabSubscriptions::UpcomingReconciliation
+feature_categories:
+- purchase
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63054
+milestone: '14.0'
diff --git a/db/docs/upload_states.yml b/db/docs/upload_states.yml
new file mode 100644
index 00000000000..b1ee7e17e2e
--- /dev/null
+++ b/db/docs/upload_states.yml
@@ -0,0 +1,9 @@
+---
+table_name: upload_states
+classes:
+- Geo::UploadState
+feature_categories:
+- geo_replication
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65921
+milestone: '14.6'
diff --git a/db/docs/uploads.yml b/db/docs/uploads.yml
new file mode 100644
index 00000000000..8cc557280e8
--- /dev/null
+++ b/db/docs/uploads.yml
@@ -0,0 +1,9 @@
+---
+table_name: uploads
+classes:
+- Upload
+feature_categories:
+- backup_restore
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/4c622b71fd284058deee483bf0009f8179b792bc
+milestone: '9.0'
diff --git a/db/docs/user_agent_details.yml b/db/docs/user_agent_details.yml
new file mode 100644
index 00000000000..ae49ded4348
--- /dev/null
+++ b/db/docs/user_agent_details.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_agent_details
+classes:
+- UserAgentDetail
+feature_categories:
+- snippets
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/95419679f23f0628d1885dd9656cc159e9d55ea9
+milestone: '8.11'
diff --git a/db/docs/user_callouts.yml b/db/docs/user_callouts.yml
new file mode 100644
index 00000000000..fe6243636d9
--- /dev/null
+++ b/db/docs/user_callouts.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_callouts
+classes:
+- Users::Callout
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/648826721f13ee4309a11638e538d96006648b39
+milestone: '10.5'
diff --git a/db/docs/user_canonical_emails.yml b/db/docs/user_canonical_emails.yml
new file mode 100644
index 00000000000..8bf0e485030
--- /dev/null
+++ b/db/docs/user_canonical_emails.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_canonical_emails
+classes:
+- UserCanonicalEmail
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/user_credit_card_validations.yml b/db/docs/user_credit_card_validations.yml
new file mode 100644
index 00000000000..9a452721ca8
--- /dev/null
+++ b/db/docs/user_credit_card_validations.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_credit_card_validations
+classes:
+- Users::CreditCardValidation
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60626
+milestone: '13.12'
diff --git a/db/docs/user_custom_attributes.yml b/db/docs/user_custom_attributes.yml
new file mode 100644
index 00000000000..60359fb2c48
--- /dev/null
+++ b/db/docs/user_custom_attributes.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_custom_attributes
+classes:
+- UserCustomAttribute
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e9eae3eb0dd25e4a34c9a4b6bcc7de312dde4489
+milestone: '10.1'
diff --git a/db/docs/user_details.yml b/db/docs/user_details.yml
new file mode 100644
index 00000000000..5ced831f9ad
--- /dev/null
+++ b/db/docs/user_details.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_details
+classes:
+- UserDetail
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25483
+milestone: '12.9'
diff --git a/db/docs/user_follow_users.yml b/db/docs/user_follow_users.yml
new file mode 100644
index 00000000000..08756637c10
--- /dev/null
+++ b/db/docs/user_follow_users.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_follow_users
+classes:
+- Users::UserFollowUser
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45451
+milestone: '13.9'
diff --git a/db/docs/user_group_callouts.yml b/db/docs/user_group_callouts.yml
new file mode 100644
index 00000000000..0ed79640cb1
--- /dev/null
+++ b/db/docs/user_group_callouts.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_group_callouts
+classes:
+- Users::GroupCallout
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68785
+milestone: '14.3'
diff --git a/db/docs/user_highest_roles.yml b/db/docs/user_highest_roles.yml
new file mode 100644
index 00000000000..23754f7c8d3
--- /dev/null
+++ b/db/docs/user_highest_roles.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_highest_roles
+classes:
+- UserHighestRole
+feature_categories:
+- utilization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26987
+milestone: '12.9'
diff --git a/db/docs/user_interacted_projects.yml b/db/docs/user_interacted_projects.yml
new file mode 100644
index 00000000000..3eb67f6c2f3
--- /dev/null
+++ b/db/docs/user_interacted_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_interacted_projects
+classes:
+- UserInteractedProject
+feature_categories:
+- product_analytics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/43b74afd8656df8228c19d5e5e6aee9f87abc244
+milestone: '10.6'
diff --git a/db/docs/user_permission_export_uploads.yml b/db/docs/user_permission_export_uploads.yml
new file mode 100644
index 00000000000..93f7e360ec2
--- /dev/null
+++ b/db/docs/user_permission_export_uploads.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_permission_export_uploads
+classes:
+- UserPermissionExportUpload
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47846
+milestone: '13.7'
diff --git a/db/docs/user_preferences.yml b/db/docs/user_preferences.yml
new file mode 100644
index 00000000000..0a0b447c0c2
--- /dev/null
+++ b/db/docs/user_preferences.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_preferences
+classes:
+- UserPreference
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/132abd3d68a8d97e8245dfc8f87a297a2ff1f39d
+milestone: '11.5'
diff --git a/db/docs/user_statuses.yml b/db/docs/user_statuses.yml
new file mode 100644
index 00000000000..cf4667c4189
--- /dev/null
+++ b/db/docs/user_statuses.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_statuses
+classes:
+- UserStatus
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/812bfb158b70b09cfd438379a4b9446aa85b52ec
+milestone: '11.2'
diff --git a/db/docs/user_synced_attributes_metadata.yml b/db/docs/user_synced_attributes_metadata.yml
new file mode 100644
index 00000000000..73f3e6166ed
--- /dev/null
+++ b/db/docs/user_synced_attributes_metadata.yml
@@ -0,0 +1,9 @@
+---
+table_name: user_synced_attributes_metadata
+classes:
+- UserSyncedAttributesMetadata
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/4df54f260751a832ebf0b8c18524020d6604994b
+milestone: '10.0'
diff --git a/db/docs/users.yml b/db/docs/users.yml
new file mode 100644
index 00000000000..7c6a7fbdcb8
--- /dev/null
+++ b/db/docs/users.yml
@@ -0,0 +1,11 @@
+---
+table_name: users
+classes:
+- Gitlab::Database::RenameReservedPathsMigration::V1::MigrationClasses::User
+- TmpUser
+- User
+feature_categories:
+- users
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
+milestone: "<6.0"
diff --git a/db/docs/users_ops_dashboard_projects.yml b/db/docs/users_ops_dashboard_projects.yml
new file mode 100644
index 00000000000..ba3f07609e2
--- /dev/null
+++ b/db/docs/users_ops_dashboard_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: users_ops_dashboard_projects
+classes:
+- UsersOpsDashboardProject
+feature_categories:
+- release_orchestration
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7341
+milestone: '11.5'
diff --git a/db/docs/users_security_dashboard_projects.yml b/db/docs/users_security_dashboard_projects.yml
new file mode 100644
index 00000000000..a98399aa9c8
--- /dev/null
+++ b/db/docs/users_security_dashboard_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: users_security_dashboard_projects
+classes:
+- UsersSecurityDashboardProject
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18708
+milestone: '12.5'
diff --git a/db/docs/users_star_projects.yml b/db/docs/users_star_projects.yml
new file mode 100644
index 00000000000..a1da7dca644
--- /dev/null
+++ b/db/docs/users_star_projects.yml
@@ -0,0 +1,9 @@
+---
+table_name: users_star_projects
+classes:
+- UsersStarProject
+feature_categories:
+- projects
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/714f7201d3362793d11f33793e5ef6dc83bdd2f0
+milestone: '7.2'
diff --git a/db/docs/users_statistics.yml b/db/docs/users_statistics.yml
new file mode 100644
index 00000000000..7ff35cd8726
--- /dev/null
+++ b/db/docs/users_statistics.yml
@@ -0,0 +1,9 @@
+---
+table_name: users_statistics
+classes:
+- UsersStatistics
+feature_categories:
+- product_analytics
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26261
+milestone: '12.9'
diff --git a/db/docs/verification_codes.yml b/db/docs/verification_codes.yml
new file mode 100644
index 00000000000..9e784ed00ee
--- /dev/null
+++ b/db/docs/verification_codes.yml
@@ -0,0 +1,8 @@
+---
+table_name: verification_codes
+classes: []
+feature_categories:
+- jihu
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71139
+milestone: '14.4'
diff --git a/db/docs/vulnerabilities.yml b/db/docs/vulnerabilities.yml
new file mode 100644
index 00000000000..f2dad96bebc
--- /dev/null
+++ b/db/docs/vulnerabilities.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerabilities
+classes:
+- Vulnerability
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16181
+milestone: '12.4'
diff --git a/db/docs/vulnerability_exports.yml b/db/docs/vulnerability_exports.yml
new file mode 100644
index 00000000000..f9d392d3485
--- /dev/null
+++ b/db/docs/vulnerability_exports.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_exports
+classes:
+- Vulnerabilities::Export
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27196
+milestone: '13.0'
diff --git a/db/docs/vulnerability_external_issue_links.yml b/db/docs/vulnerability_external_issue_links.yml
new file mode 100644
index 00000000000..ff0b8f98414
--- /dev/null
+++ b/db/docs/vulnerability_external_issue_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_external_issue_links
+classes:
+- Vulnerabilities::ExternalIssueLink
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48465
+milestone: '13.7'
diff --git a/db/docs/vulnerability_feedback.yml b/db/docs/vulnerability_feedback.yml
new file mode 100644
index 00000000000..4d5ae868188
--- /dev/null
+++ b/db/docs/vulnerability_feedback.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_feedback
+classes:
+- Vulnerabilities::Feedback
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/5452
+milestone: '10.8'
diff --git a/db/docs/vulnerability_finding_evidences.yml b/db/docs/vulnerability_finding_evidences.yml
new file mode 100644
index 00000000000..a2b48caece6
--- /dev/null
+++ b/db/docs/vulnerability_finding_evidences.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_finding_evidences
+classes:
+- Vulnerabilities::Finding::Evidence
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56790
+milestone: '13.11'
diff --git a/db/docs/vulnerability_finding_links.yml b/db/docs/vulnerability_finding_links.yml
new file mode 100644
index 00000000000..4f47e82e85f
--- /dev/null
+++ b/db/docs/vulnerability_finding_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_finding_links
+classes:
+- Vulnerabilities::FindingLink
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45502
+milestone: '13.6'
diff --git a/db/docs/vulnerability_finding_signatures.yml b/db/docs/vulnerability_finding_signatures.yml
new file mode 100644
index 00000000000..963dd96dd2c
--- /dev/null
+++ b/db/docs/vulnerability_finding_signatures.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_finding_signatures
+classes:
+- Vulnerabilities::FindingSignature
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57840
+milestone: '13.11'
diff --git a/db/docs/vulnerability_findings_remediations.yml b/db/docs/vulnerability_findings_remediations.yml
new file mode 100644
index 00000000000..4a757073567
--- /dev/null
+++ b/db/docs/vulnerability_findings_remediations.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_findings_remediations
+classes:
+- Vulnerabilities::FindingRemediation
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47166
+milestone: '13.7'
diff --git a/db/docs/vulnerability_flags.yml b/db/docs/vulnerability_flags.yml
new file mode 100644
index 00000000000..fa47f878029
--- /dev/null
+++ b/db/docs/vulnerability_flags.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_flags
+classes:
+- Vulnerabilities::Flag
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65573
+milestone: '14.1'
diff --git a/db/docs/vulnerability_historical_statistics.yml b/db/docs/vulnerability_historical_statistics.yml
new file mode 100644
index 00000000000..47fec93a242
--- /dev/null
+++ b/db/docs/vulnerability_historical_statistics.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_historical_statistics
+classes:
+- Vulnerabilities::HistoricalStatistic
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.3'
diff --git a/db/docs/vulnerability_identifiers.yml b/db/docs/vulnerability_identifiers.yml
new file mode 100644
index 00000000000..eefdddfe7eb
--- /dev/null
+++ b/db/docs/vulnerability_identifiers.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_identifiers
+classes:
+- Vulnerabilities::Identifier
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6896
+milestone: '11.4'
diff --git a/db/docs/vulnerability_issue_links.yml b/db/docs/vulnerability_issue_links.yml
new file mode 100644
index 00000000000..d19e885dd86
--- /dev/null
+++ b/db/docs/vulnerability_issue_links.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_issue_links
+classes:
+- Vulnerabilities::IssueLink
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19852
+milestone: '12.5'
diff --git a/db/docs/vulnerability_occurrence_identifiers.yml b/db/docs/vulnerability_occurrence_identifiers.yml
new file mode 100644
index 00000000000..5791b42846b
--- /dev/null
+++ b/db/docs/vulnerability_occurrence_identifiers.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_occurrence_identifiers
+classes:
+- Vulnerabilities::FindingIdentifier
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6896
+milestone: '11.4'
diff --git a/db/docs/vulnerability_occurrence_pipelines.yml b/db/docs/vulnerability_occurrence_pipelines.yml
new file mode 100644
index 00000000000..5cbc490a2b8
--- /dev/null
+++ b/db/docs/vulnerability_occurrence_pipelines.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_occurrence_pipelines
+classes:
+- Vulnerabilities::FindingPipeline
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3270e15c4de7f40b97ce25bdc3cc9c4282e2f573
+milestone: '11.5'
diff --git a/db/docs/vulnerability_occurrences.yml b/db/docs/vulnerability_occurrences.yml
new file mode 100644
index 00000000000..001764c385e
--- /dev/null
+++ b/db/docs/vulnerability_occurrences.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_occurrences
+classes:
+- Vulnerabilities::Finding
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6896
+milestone: '11.4'
diff --git a/db/docs/vulnerability_reads.yml b/db/docs/vulnerability_reads.yml
new file mode 100644
index 00000000000..0d60920c694
--- /dev/null
+++ b/db/docs/vulnerability_reads.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_reads
+classes:
+- Vulnerabilities::Read
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74733
+milestone: '14.6'
diff --git a/db/docs/vulnerability_remediations.yml b/db/docs/vulnerability_remediations.yml
new file mode 100644
index 00000000000..6dfd80ec6b4
--- /dev/null
+++ b/db/docs/vulnerability_remediations.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_remediations
+classes:
+- Vulnerabilities::Remediation
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47166
+milestone: '13.7'
diff --git a/db/docs/vulnerability_scanners.yml b/db/docs/vulnerability_scanners.yml
new file mode 100644
index 00000000000..18d534619bf
--- /dev/null
+++ b/db/docs/vulnerability_scanners.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_scanners
+classes:
+- Vulnerabilities::Scanner
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6896
+milestone: '11.4'
diff --git a/db/docs/vulnerability_statistics.yml b/db/docs/vulnerability_statistics.yml
new file mode 100644
index 00000000000..e32fdc907ff
--- /dev/null
+++ b/db/docs/vulnerability_statistics.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_statistics
+classes:
+- Vulnerabilities::Statistic
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/vulnerability_user_mentions.yml b/db/docs/vulnerability_user_mentions.yml
new file mode 100644
index 00000000000..594f7fa78f8
--- /dev/null
+++ b/db/docs/vulnerability_user_mentions.yml
@@ -0,0 +1,9 @@
+---
+table_name: vulnerability_user_mentions
+classes:
+- VulnerabilityUserMention
+feature_categories:
+- vulnerability_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.0'
diff --git a/db/docs/web_hook_logs.yml b/db/docs/web_hook_logs.yml
new file mode 100644
index 00000000000..eb47aa1dc9a
--- /dev/null
+++ b/db/docs/web_hook_logs.yml
@@ -0,0 +1,9 @@
+---
+table_name: web_hook_logs
+classes:
+- WebHookLog
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/330789c23c777d8ca646eba7c25f39cb7342cdee
+milestone: '9.3'
diff --git a/db/docs/web_hooks.yml b/db/docs/web_hooks.yml
new file mode 100644
index 00000000000..8b0a2c8c002
--- /dev/null
+++ b/db/docs/web_hooks.yml
@@ -0,0 +1,13 @@
+---
+table_name: web_hooks
+classes:
+- GroupHook
+- ProjectHook
+- ServiceHook
+- SystemHook
+- WebHook
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/edab46e9fa5f568b1423c0021e81d30453d7dc1e
+milestone: "<6.0"
diff --git a/db/docs/webauthn_registrations.yml b/db/docs/webauthn_registrations.yml
new file mode 100644
index 00000000000..21659b88cb6
--- /dev/null
+++ b/db/docs/webauthn_registrations.yml
@@ -0,0 +1,9 @@
+---
+table_name: webauthn_registrations
+classes:
+- WebauthnRegistration
+feature_categories:
+- authentication_and_authorization
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+milestone: '13.2'
diff --git a/db/docs/wiki_page_meta.yml b/db/docs/wiki_page_meta.yml
new file mode 100644
index 00000000000..b5b28d1e8e0
--- /dev/null
+++ b/db/docs/wiki_page_meta.yml
@@ -0,0 +1,9 @@
+---
+table_name: wiki_page_meta
+classes:
+- WikiPage::Meta
+feature_categories:
+- wiki
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26529
+milestone: '13.0'
diff --git a/db/docs/wiki_page_slugs.yml b/db/docs/wiki_page_slugs.yml
new file mode 100644
index 00000000000..e0e29ea41ad
--- /dev/null
+++ b/db/docs/wiki_page_slugs.yml
@@ -0,0 +1,9 @@
+---
+table_name: wiki_page_slugs
+classes:
+- WikiPage::Slug
+feature_categories:
+- wiki
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26529
+milestone: '13.0'
diff --git a/db/docs/work_item_types.yml b/db/docs/work_item_types.yml
new file mode 100644
index 00000000000..48fed8d6aba
--- /dev/null
+++ b/db/docs/work_item_types.yml
@@ -0,0 +1,9 @@
+---
+table_name: work_item_types
+classes:
+- WorkItems::Type
+feature_categories:
+- team_planning
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55705
+milestone: '14.2'
diff --git a/db/docs/x509_certificates.yml b/db/docs/x509_certificates.yml
new file mode 100644
index 00000000000..26fc03c743d
--- /dev/null
+++ b/db/docs/x509_certificates.yml
@@ -0,0 +1,9 @@
+---
+table_name: x509_certificates
+classes:
+- X509Certificate
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17773
+milestone: '12.8'
diff --git a/db/docs/x509_commit_signatures.yml b/db/docs/x509_commit_signatures.yml
new file mode 100644
index 00000000000..5791f6439d6
--- /dev/null
+++ b/db/docs/x509_commit_signatures.yml
@@ -0,0 +1,9 @@
+---
+table_name: x509_commit_signatures
+classes:
+- CommitSignatures::X509CommitSignature
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17773
+milestone: '12.8'
diff --git a/db/docs/x509_issuers.yml b/db/docs/x509_issuers.yml
new file mode 100644
index 00000000000..0165189f044
--- /dev/null
+++ b/db/docs/x509_issuers.yml
@@ -0,0 +1,9 @@
+---
+table_name: x509_issuers
+classes:
+- X509Issuer
+feature_categories:
+- source_code_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17773
+milestone: '12.8'
diff --git a/db/docs/zentao_tracker_data.yml b/db/docs/zentao_tracker_data.yml
new file mode 100644
index 00000000000..8270759b5d6
--- /dev/null
+++ b/db/docs/zentao_tracker_data.yml
@@ -0,0 +1,9 @@
+---
+table_name: zentao_tracker_data
+classes:
+- Integrations::ZentaoTrackerData
+feature_categories:
+- integrations
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67938
+milestone: '14.2'
diff --git a/db/docs/zoom_meetings.yml b/db/docs/zoom_meetings.yml
new file mode 100644
index 00000000000..0c1a47eb6d0
--- /dev/null
+++ b/db/docs/zoom_meetings.yml
@@ -0,0 +1,9 @@
+---
+table_name: zoom_meetings
+classes:
+- ZoomMeeting
+feature_categories:
+- incident_management
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17890
+milestone: '12.5'
diff --git a/db/fixtures/development/02_users.rb b/db/fixtures/development/02_users.rb
index 76a00c18649..ceed0d6d12a 100644
--- a/db/fixtures/development/02_users.rb
+++ b/db/fixtures/development/02_users.rb
@@ -4,8 +4,8 @@ class Gitlab::Seeder::Users
include ActionView::Helpers::NumberHelper
RANDOM_USERS_COUNT = 20
+ MASS_NAMESPACES_COUNT = ENV['CI'] ? 1 : 100
MASS_USERS_COUNT = ENV['CI'] ? 10 : 1_000_000
-
attr_reader :opts
def initialize(opts = {})
@@ -15,6 +15,7 @@ class Gitlab::Seeder::Users
def seed!
Sidekiq::Testing.inline! do
create_mass_users!
+ create_mass_namespaces!
create_random_users!
end
end
@@ -26,20 +27,22 @@ class Gitlab::Seeder::Users
Gitlab::Seeder.with_mass_insert(MASS_USERS_COUNT, User) do
ActiveRecord::Base.connection.execute <<~SQL
- INSERT INTO users (username, name, email, confirmed_at, projects_limit, encrypted_password)
+ INSERT INTO users (username, name, email, state, confirmed_at, projects_limit, encrypted_password)
SELECT
'#{Gitlab::Seeder::MASS_INSERT_USER_START}' || seq,
'Seed user ' || seq,
'seed_user' || seq || '@example.com',
+ 'active',
to_timestamp(seq),
#{MASS_USERS_COUNT},
'#{encrypted_password}'
FROM generate_series(1, #{MASS_USERS_COUNT}) AS seq
+ ON CONFLICT DO NOTHING;
SQL
end
relation = User.where(admin: false)
- Gitlab::Seeder.with_mass_insert(relation.count, Namespace) do
+ Gitlab::Seeder.with_mass_insert(relation.count, 'user namespaces') do
ActiveRecord::Base.connection.execute <<~SQL
INSERT INTO namespaces (name, path, owner_id, type)
SELECT
@@ -48,6 +51,16 @@ class Gitlab::Seeder::Users
id,
'User'
FROM users WHERE NOT admin
+ ON CONFLICT DO NOTHING;
+ SQL
+ end
+
+ Gitlab::Seeder.with_mass_insert(relation.count, "User namespaces routes") do
+ ActiveRecord::Base.connection.execute <<~SQL
+ INSERT INTO routes (namespace_id, source_id, source_type, path, name)
+ SELECT id as namespace_id, id as source_id, 'Namespace', path, name
+ FROM namespaces WHERE type IS NULL OR type = 'User'
+ ON CONFLICT DO NOTHING;
SQL
end
@@ -74,6 +87,97 @@ class Gitlab::Seeder::Users
end
end
+ def create_mass_namespaces!
+ Gitlab::Seeder.with_mass_insert(MASS_NAMESPACES_COUNT, "root namespaces and subgroups 9 levels deep") do
+ ActiveRecord::Base.connection.execute <<~SQL
+ INSERT INTO namespaces (name, path, type)
+ SELECT
+ 'mass insert group level 0 - ' || seq,
+ '#{Gitlab::Seeder::MASS_INSERT_GROUP_START}_0_' || seq,
+ 'Group'
+ FROM generate_series(1, #{MASS_NAMESPACES_COUNT}) AS seq
+ ON CONFLICT DO NOTHING;
+ SQL
+
+ (1..9).each do |idx|
+ count = Namespace.where("path LIKE '#{Gitlab::Seeder::MASS_INSERT_PREFIX}%'").where(type: 'Group').count * 2
+ Gitlab::Seeder.log_message("Creating subgroups at level #{idx}: #{count}")
+ ActiveRecord::Base.connection.execute <<~SQL
+ INSERT INTO namespaces (name, path, type, parent_id)
+ SELECT
+ 'mass insert group level #{idx} - ' || seq,
+ '#{Gitlab::Seeder::MASS_INSERT_GROUP_START}_#{idx}_' || seq,
+ 'Group',
+ namespaces.id
+ FROM namespaces
+ CROSS JOIN generate_series(1, 2) AS seq
+ WHERE namespaces.type='Group' AND namespaces.path like '#{Gitlab::Seeder::MASS_INSERT_GROUP_START}_#{idx-1}_%'
+ ON CONFLICT DO NOTHING;
+ SQL
+ end
+
+ Gitlab::Seeder.log_message("creating routes.")
+ ActiveRecord::Base.connection.execute <<~SQL
+ WITH RECURSIVE cte(source_id, namespace_id, parent_id, path, height) AS (
+ (
+ SELECT ARRAY[batch.id], batch.id, batch.parent_id, batch.path, 1
+ FROM
+ "namespaces" as batch
+ WHERE
+ "batch"."type" = 'Group' AND "batch"."parent_id" is null
+ )
+ UNION
+ (
+ SELECT array_append(cte.source_id, n.id), n.id, n.parent_id, cte.path || '/' || n.path, cte.height+1
+ FROM
+ "namespaces" as n,
+ "cte"
+ WHERE
+ "n"."type" = 'Group'
+ AND "n"."parent_id" = "cte"."namespace_id"
+ )
+ )
+ INSERT INTO routes (namespace_id, source_id, source_type, path, name)
+ SELECT cte.namespace_id as namespace_id, cte.namespace_id as source_id, 'Namespace', cte.path, cte.path FROM cte
+ ON CONFLICT DO NOTHING;
+ SQL
+
+ Gitlab::Seeder.log_message("filling traversal ids.")
+ ActiveRecord::Base.connection.execute <<~SQL
+ WITH RECURSIVE cte(source_id, namespace_id, parent_id) AS (
+ (
+ SELECT ARRAY[batch.id], batch.id, batch.parent_id
+ FROM
+ "namespaces" as batch
+ WHERE
+ "batch"."type" = 'Group' AND "batch"."parent_id" is null
+ )
+ UNION
+ (
+ SELECT array_append(cte.source_id, n.id), n.id, n.parent_id
+ FROM
+ "namespaces" as n,
+ "cte"
+ WHERE
+ "n"."type" = 'Group'
+ AND "n"."parent_id" = "cte"."namespace_id"
+ )
+ )
+ UPDATE namespaces
+ SET traversal_ids = computed.source_id FROM (SELECT namespace_id, source_id FROM cte) AS computed
+ where computed.namespace_id = namespaces.id AND namespaces.path LIKE '#{Gitlab::Seeder::MASS_INSERT_PREFIX}%'
+ SQL
+
+ Gitlab::Seeder.log_message("creating namespace settings.")
+ ActiveRecord::Base.connection.execute <<~SQL
+ INSERT INTO namespace_settings(namespace_id, created_at, updated_at)
+ SELECT id, now(), now() FROM namespaces
+ ON CONFLICT DO NOTHING;
+ SQL
+ end
+ end
+
+
def random_password
@random_password ||= SecureRandom.hex.slice(0,16)
end
diff --git a/db/fixtures/development/03_project.rb b/db/fixtures/development/03_project.rb
index e879db84e68..ae9a17b637c 100644
--- a/db/fixtures/development/03_project.rb
+++ b/db/fixtures/development/03_project.rb
@@ -53,14 +53,56 @@ class Gitlab::Seeder::Projects
public: 1 # 1m projects = 5m total
}
+ BATCH_SIZE = 100_000
+
def seed!
Sidekiq::Testing.inline! do
create_real_projects!
create_large_projects!
- create_mass_projects!
end
end
+ def self.insert_project_namespaces_sql(type:, range:)
+ <<~SQL
+ INSERT INTO namespaces (name, path, parent_id, owner_id, type, visibility_level, created_at, updated_at)
+ SELECT
+ 'Seed project ' || seq || ' ' || ('{#{Gitlab::Seeder::Projects.visibility_per_user}}'::text[])[seq] AS project_name,
+ '#{Gitlab::Seeder::MASS_INSERT_PROJECT_START}' || ('{#{Gitlab::Seeder::Projects.visibility_per_user}}'::text[])[seq] || '_' || seq AS namespace_path,
+ n.id AS parent_id,
+ n.owner_id AS owner_id,
+ 'Project' AS type,
+ ('{#{Gitlab::Seeder::Projects.visibility_level_per_user}}'::int[])[seq] AS visibility_level,
+ NOW() AS created_at,
+ NOW() AS updated_at
+ FROM namespaces n
+ CROSS JOIN generate_series(1, #{Gitlab::Seeder::Projects.projects_per_user_count}) AS seq
+ WHERE type='#{type}' AND path LIKE '#{Gitlab::Seeder::MASS_INSERT_PREFIX}%'
+ AND n.id BETWEEN #{range.first} AND #{range.last}
+ ON CONFLICT DO NOTHING;
+ SQL
+ end
+
+ def self.insert_projects_sql(type:, range:)
+ <<~SQL
+ INSERT INTO projects (name, path, creator_id, namespace_id, project_namespace_id, visibility_level, created_at, updated_at)
+ SELECT
+ n.name AS project_name,
+ n.path AS project_path,
+ n.owner_id AS creator_id,
+ n.parent_id AS namespace_id,
+ n.id AS project_namespace_id,
+ n.visibility_level AS visibility_level,
+ NOW() AS created_at,
+ NOW() AS updated_at
+ FROM namespaces n
+ WHERE type = 'Project' AND n.parent_id IN (
+ SELECT id FROM namespaces n1 WHERE type='#{type}'
+ AND path LIKE '#{Gitlab::Seeder::MASS_INSERT_PREFIX}%' AND n1.id BETWEEN #{range.first} AND #{range.last}
+ )
+ ON CONFLICT DO NOTHING;
+ SQL
+ end
+
private
def create_real_projects!
@@ -156,55 +198,26 @@ class Gitlab::Seeder::Projects
end
end
- def create_mass_projects!
- projects_per_user_count = MASS_PROJECTS_COUNT_PER_USER.values.sum
- visibility_per_user = ['private'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:private) +
- ['internal'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:internal) +
- ['public'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:public)
- visibility_level_per_user = visibility_per_user.map { |visibility| Gitlab::VisibilityLevel.level_value(visibility) }
-
- visibility_per_user = visibility_per_user.join(',')
- visibility_level_per_user = visibility_level_per_user.join(',')
-
- Gitlab::Seeder.with_mass_insert(User.count * projects_per_user_count, "Projects and relations") do
- ActiveRecord::Base.connection.execute <<~SQL
- INSERT INTO projects (name, path, creator_id, namespace_id, visibility_level, created_at, updated_at)
- SELECT
- 'Seed project ' || seq || ' ' || ('{#{visibility_per_user}}'::text[])[seq] AS project_name,
- '#{Gitlab::Seeder::MASS_INSERT_PROJECT_START}' || ('{#{visibility_per_user}}'::text[])[seq] || '_' || seq AS project_path,
- u.id AS user_id,
- n.id AS namespace_id,
- ('{#{visibility_level_per_user}}'::int[])[seq] AS visibility_level,
- NOW() AS created_at,
- NOW() AS updated_at
- FROM users u
- CROSS JOIN generate_series(1, #{projects_per_user_count}) AS seq
- JOIN namespaces n ON n.owner_id=u.id
- SQL
-
- ActiveRecord::Base.connection.execute <<~SQL
- INSERT INTO project_features (project_id, merge_requests_access_level, issues_access_level, wiki_access_level,
- pages_access_level)
- SELECT
- id,
- #{ProjectFeature::ENABLED} AS merge_requests_access_level,
- #{ProjectFeature::ENABLED} AS issues_access_level,
- #{ProjectFeature::ENABLED} AS wiki_access_level,
- #{ProjectFeature::ENABLED} AS pages_access_level
- FROM projects ON CONFLICT (project_id) DO NOTHING;
- SQL
-
- ActiveRecord::Base.connection.execute <<~SQL
- INSERT INTO routes (source_id, source_type, name, path)
- SELECT
- p.id,
- 'Project',
- u.name || ' / ' || p.name,
- u.username || '/' || p.path
- FROM projects p JOIN users u ON u.id=p.creator_id
- ON CONFLICT (source_type, source_id) DO NOTHING;
- SQL
- end
+ def self.projects_per_user_count
+ MASS_PROJECTS_COUNT_PER_USER.values.sum
+ end
+
+ def self.visibility_per_user_array
+ ['private'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:private) +
+ ['internal'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:internal) +
+ ['public'] * MASS_PROJECTS_COUNT_PER_USER.fetch(:public)
+ end
+
+ def self.visibility_level_per_user_map
+ visibility_per_user_array.map { |visibility| Gitlab::VisibilityLevel.level_value(visibility) }
+ end
+
+ def self.visibility_per_user
+ visibility_per_user_array.join(',')
+ end
+
+ def self.visibility_level_per_user
+ visibility_level_per_user_map.join(',')
end
end
diff --git a/db/fixtures/development/03_project_1_user_projects.rb b/db/fixtures/development/03_project_1_user_projects.rb
new file mode 100644
index 00000000000..0b7ac5396b8
--- /dev/null
+++ b/db/fixtures/development/03_project_1_user_projects.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class Gitlab::Seeder::UserProjects
+ def seed!
+ create_user_projects!
+ end
+
+ private
+
+ def create_user_projects!
+ user_namespaces = Namespace.where("path LIKE ?", "#{Gitlab::Seeder::MASS_INSERT_PREFIX}%").where(type: 'User')
+
+ Gitlab::Seeder.with_mass_insert(user_namespaces.count * Gitlab::Seeder::Projects.projects_per_user_count, "User projects and corresponding project namespaces") do
+ user_namespaces.each_batch(of: Gitlab::Seeder::Projects::BATCH_SIZE) do |batch, index|
+ range = batch.pluck(Arel.sql('MIN(id)'), Arel.sql('MAX(id)')).first
+ count = index * batch.size * Gitlab::Seeder::Projects.projects_per_user_count
+
+ Gitlab::Seeder.log_message("Creating project namespaces: #{count}.")
+ ActiveRecord::Base.connection.execute(Gitlab::Seeder::Projects.insert_project_namespaces_sql(type: 'User', range: range))
+
+ Gitlab::Seeder.log_message("Creating projects: #{count}.")
+ ActiveRecord::Base.connection.execute(Gitlab::Seeder::Projects.insert_projects_sql(type: 'User', range: range))
+ end
+ end
+ end
+end
+
+Gitlab::Seeder.quiet do
+ projects = Gitlab::Seeder::UserProjects.new
+ projects.seed!
+end
diff --git a/db/fixtures/development/03_project_2_group_projects.rb b/db/fixtures/development/03_project_2_group_projects.rb
new file mode 100644
index 00000000000..fe44a1974cf
--- /dev/null
+++ b/db/fixtures/development/03_project_2_group_projects.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class Gitlab::Seeder::GroupProjects
+ def seed!
+ create_projects!
+ end
+
+ private
+
+ def create_projects!
+ groups = Namespace.where("path LIKE ?", "#{Gitlab::Seeder::MASS_INSERT_PREFIX}%").where(type: 'Group')
+
+ Gitlab::Seeder.with_mass_insert(groups.count * Gitlab::Seeder::Projects.projects_per_user_count, "Projects and corresponding project namespaces") do
+ groups.each_batch(of: Gitlab::Seeder::Projects::BATCH_SIZE) do |batch, index|
+ range = batch.pluck(Arel.sql('MIN(id)'), Arel.sql('MAX(id)')).first
+ count = index * batch.size * Gitlab::Seeder::Projects.projects_per_user_count
+
+ Gitlab::Seeder.log_message("Creating projects namespaces: #{count}.")
+ ActiveRecord::Base.connection.execute(Gitlab::Seeder::Projects.insert_project_namespaces_sql(type: 'Group', range: range))
+
+ Gitlab::Seeder.log_message("Creating projects: #{count}.")
+ ActiveRecord::Base.connection.execute(Gitlab::Seeder::Projects.insert_projects_sql(type: 'Group', range: range))
+ end
+ end
+ end
+end
+
+Gitlab::Seeder.quiet do
+ projects = Gitlab::Seeder::GroupProjects.new
+ projects.seed!
+end
diff --git a/db/fixtures/development/03_project_3_features.rb b/db/fixtures/development/03_project_3_features.rb
new file mode 100644
index 00000000000..374d46d030e
--- /dev/null
+++ b/db/fixtures/development/03_project_3_features.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+class Gitlab::Seeder::ProjectFeatures
+ include ActionView::Helpers::NumberHelper
+
+ BATCH_SIZE = 100_000
+
+ def seed!
+ create_project_features!
+ end
+
+ def create_project_features!
+ Gitlab::Seeder.with_mass_insert(Project.count, "Project features") do
+ Project.each_batch(of: BATCH_SIZE) do |batch, index|
+ range = batch.pluck(Arel.sql('MIN(id)'), Arel.sql('MAX(id)')).first
+ count = index * batch.size
+
+ Gitlab::Seeder.log_message("Creating project features: #{count}.")
+ ActiveRecord::Base.connection.execute <<~SQL
+ INSERT INTO project_features (project_id, merge_requests_access_level, issues_access_level, wiki_access_level, pages_access_level)
+ SELECT
+ id,
+ #{ProjectFeature::ENABLED} AS merge_requests_access_level,
+ #{ProjectFeature::ENABLED} AS issues_access_level,
+ #{ProjectFeature::ENABLED} AS wiki_access_level,
+ #{ProjectFeature::ENABLED} AS pages_access_level
+ FROM projects
+ WHERE projects.id BETWEEN #{range.first} AND #{range.last}
+ ON CONFLICT DO NOTHING;
+ SQL
+ end
+ end
+ end
+end
+
+Gitlab::Seeder.quiet do
+ projects = Gitlab::Seeder::ProjectFeatures.new
+ projects.seed!
+end
diff --git a/db/fixtures/development/03_project_4_routes.rb b/db/fixtures/development/03_project_4_routes.rb
new file mode 100644
index 00000000000..3340849a733
--- /dev/null
+++ b/db/fixtures/development/03_project_4_routes.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+class Gitlab::Seeder::ProjectRoutes
+ include ActionView::Helpers::NumberHelper
+
+ BATCH_SIZE = 100_000
+
+ def seed!
+ create_project_routes!
+ end
+
+ def create_project_routes!
+ Gitlab::Seeder.with_mass_insert(Project.count, "Project routes") do
+ Project.each_batch(of: BATCH_SIZE / 2) do |batch, index|
+ range = batch.pluck(Arel.sql('MIN(id)'), Arel.sql('MAX(id)')).first
+ count = index * batch.size
+
+ Gitlab::Seeder.log_message("Creating project routes: #{count}.")
+ ActiveRecord::Base.connection.execute <<~SQL
+ INSERT INTO routes (namespace_id, source_id, source_type, name, path)
+ SELECT
+ p.project_namespace_id as namespace_id,
+ p.id as source_id,
+ 'Project',
+ routes.name || ' / ' || p.name,
+ routes.path || '/' || p.path
+ FROM projects p
+ INNER JOIN routes ON routes.source_id = p.namespace_id and source_type = 'Namespace'
+ WHERE p.id BETWEEN #{range.first} AND #{range.last}
+ ON CONFLICT DO NOTHING;
+ SQL
+ end
+ end
+ end
+end
+
+Gitlab::Seeder.quiet do
+ projects = Gitlab::Seeder::ProjectRoutes.new
+ projects.seed!
+end
diff --git a/db/fixtures/development/04_labels.rb b/db/fixtures/development/04_labels.rb
index 21d552c89f5..aff8331a191 100644
--- a/db/fixtures/development/04_labels.rb
+++ b/db/fixtures/development/04_labels.rb
@@ -37,13 +37,15 @@ class Gitlab::Seeder::ProjectLabels
end
Gitlab::Seeder.quiet do
- puts "\nGenerating group labels"
- Group.all.find_each do |group|
- Gitlab::Seeder::GroupLabels.new(group).seed!
+ label_per_group = 10
+ puts "\nGenerating group labels: #{Group.not_mass_generated.count * label_per_group}"
+ Group.not_mass_generated.find_each do |group|
+ Gitlab::Seeder::GroupLabels.new(group, label_per_group: label_per_group).seed!
end
- puts "\nGenerating project labels"
+ label_per_project = 5
+ puts "\nGenerating project labels: #{Project.not_mass_generated.count * label_per_project}"
Project.not_mass_generated.find_each do |project|
- Gitlab::Seeder::ProjectLabels.new(project).seed!
+ Gitlab::Seeder::ProjectLabels.new(project, label_per_project: label_per_project).seed!
end
end
diff --git a/db/fixtures/development/06_teams.rb b/db/fixtures/development/06_teams.rb
index 94d3aa59710..7aaaa48d6d4 100644
--- a/db/fixtures/development/06_teams.rb
+++ b/db/fixtures/development/06_teams.rb
@@ -2,7 +2,7 @@ require './spec/support/sidekiq_middleware'
Sidekiq::Testing.inline! do
Gitlab::Seeder.quiet do
- Group.all.each do |group|
+ Group.not_mass_generated.each do |group|
User.not_mass_generated.sample(4).each do |user|
if group.add_user(user, Gitlab::Access.values.sample).persisted?
print '.'
diff --git a/db/fixtures/development/32_crm.rb b/db/fixtures/development/32_crm.rb
index bad2fc56ed3..1701763aba0 100644
--- a/db/fixtures/development/32_crm.rb
+++ b/db/fixtures/development/32_crm.rb
@@ -29,7 +29,7 @@ class Gitlab::Seeder::Crm
group_id: group.id,
first_name: first_name,
last_name: last_name,
- email: "#{first_name}.#{last_name}@example.org",
+ email: "#{first_name}.#{last_name}-#{index}@example.org",
organization_id: organization_id
)
@@ -41,7 +41,7 @@ end
Gitlab::Seeder.quiet do
puts "\nGenerating group crm organizations and contacts"
- Group.all.find_each do |group|
+ Group.not_mass_generated.where('parent_id IS NULL').first(10).each do |group|
Gitlab::Seeder::Crm.new(group).seed!
end
end
diff --git a/db/fixtures/development/33_triage_ops.rb b/db/fixtures/development/33_triage_ops.rb
index f4d74af15ca..1bb1f6c05d9 100644
--- a/db/fixtures/development/33_triage_ops.rb
+++ b/db/fixtures/development/33_triage_ops.rb
@@ -14,15 +14,19 @@ class Gitlab::Seeder::TriageOps
Sidekiq::Testing.inline! do
puts "Ensuring required groups"
ensure_group('gitlab-com')
+ ensure_group('gitlab-com/gl-security/appsec')
ensure_group('gitlab-jh/jh-team')
ensure_group('gitlab-org')
ensure_group('gitlab-org/gitlab-core-team/community-members')
ensure_group('gitlab-org/security')
+
puts "Ensuring required projects"
ensure_project('gitlab-org/gitlab')
ensure_project('gitlab-org/security/gitlab')
+
puts "Ensuring required bot user"
ensure_bot_user
+
puts "Setting up webhooks"
ensure_webhook_for('gitlab-com')
ensure_webhook_for('gitlab-org')
diff --git a/db/migrate/20220113164801_add_diffs_colors_to_user_preferences.rb b/db/migrate/20220113164801_add_diffs_colors_to_user_preferences.rb
new file mode 100644
index 00000000000..00e8e574722
--- /dev/null
+++ b/db/migrate/20220113164801_add_diffs_colors_to_user_preferences.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddDiffsColorsToUserPreferences < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20220113164901_add_text_limit_to_user_preferences_diffs_colors.rb
+ def change
+ add_column :user_preferences, :diffs_deletion_color, :text
+ add_column :user_preferences, :diffs_addition_color, :text
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20220113164901_add_text_limit_to_user_preferences_diffs_colors.rb b/db/migrate/20220113164901_add_text_limit_to_user_preferences_diffs_colors.rb
new file mode 100644
index 00000000000..9ae1c875194
--- /dev/null
+++ b/db/migrate/20220113164901_add_text_limit_to_user_preferences_diffs_colors.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTextLimitToUserPreferencesDiffsColors < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :user_preferences, :diffs_deletion_color, 7
+ add_text_limit :user_preferences, :diffs_addition_color, 7
+ end
+
+ def down
+ remove_text_limit :user_preferences, :diffs_addition_color
+ remove_text_limit :user_preferences, :diffs_deletion_color
+ end
+end
diff --git a/db/migrate/20220120160625_remove_temp_index_on_id_from_vulnerability_occurrences.rb b/db/migrate/20220120160625_remove_temp_index_on_id_from_vulnerability_occurrences.rb
new file mode 100644
index 00000000000..747cabcd865
--- /dev/null
+++ b/db/migrate/20220120160625_remove_temp_index_on_id_from_vulnerability_occurrences.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveTempIndexOnIdFromVulnerabilityOccurrences < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'tmp_idx_vulnerability_occurrences_on_id_where_report_type_7_99'
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :vulnerability_occurrences, name: INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :vulnerability_occurrences, :id, where: 'report_type IN (7, 99)', name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220302110724_add_group_features_table.rb b/db/migrate/20220302110724_add_group_features_table.rb
new file mode 100644
index 00000000000..9d9204afec2
--- /dev/null
+++ b/db/migrate/20220302110724_add_group_features_table.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddGroupFeaturesTable < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def up
+ create_table :group_features, id: false do |t|
+ t.references :group, index: false, foreign_key: { to_table: :namespaces, on_delete: :cascade }, null: false
+ t.timestamps_with_timezone null: false
+ t.integer :wiki_access_level, default: Featurable::ENABLED, null: false, limit: 2
+ end
+
+ execute('ALTER TABLE group_features ADD PRIMARY KEY (group_id)')
+ end
+
+ def down
+ drop_table :group_features
+ end
+end
diff --git a/db/migrate/20220310011530_add_database_grafana_config_to_application_settings.rb b/db/migrate/20220310011530_add_database_grafana_config_to_application_settings.rb
new file mode 100644
index 00000000000..7752fbba12f
--- /dev/null
+++ b/db/migrate/20220310011530_add_database_grafana_config_to_application_settings.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddDatabaseGrafanaConfigToApplicationSettings < Gitlab::Database::Migration[1.0]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20220307002607_add_text_limit_to_db_reindexing_grafana_application_settings
+ def change
+ add_column :application_settings, :encrypted_database_grafana_api_key, :binary
+ add_column :application_settings, :encrypted_database_grafana_api_key_iv, :binary
+ add_column :application_settings, :database_grafana_api_url, :text
+ add_column :application_settings, :database_grafana_tag, :text
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20220310011613_add_text_limit_to_database_grafana_application_settings.rb b/db/migrate/20220310011613_add_text_limit_to_database_grafana_application_settings.rb
new file mode 100644
index 00000000000..72bcf493d6e
--- /dev/null
+++ b/db/migrate/20220310011613_add_text_limit_to_database_grafana_application_settings.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTextLimitToDatabaseGrafanaApplicationSettings < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :application_settings, :database_grafana_api_url, 255
+ add_text_limit :application_settings, :database_grafana_tag, 255
+ end
+
+ def down
+ remove_text_limit :application_settings, :database_grafana_tag
+ remove_text_limit :application_settings, :database_grafana_api_url
+ end
+end
diff --git a/db/migrate/20220314184009_create_protected_environment_approval_rules.rb b/db/migrate/20220314184009_create_protected_environment_approval_rules.rb
new file mode 100644
index 00000000000..f0db2c004ed
--- /dev/null
+++ b/db/migrate/20220314184009_create_protected_environment_approval_rules.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class CreateProtectedEnvironmentApprovalRules < Gitlab::Database::Migration[1.0]
+ def up
+ create_table :protected_environment_approval_rules do |t|
+ t.references :protected_environment,
+ index: { name: :index_approval_rule_on_protected_environment_id },
+ foreign_key: { to_table: :protected_environments, on_delete: :cascade },
+ null: false
+
+ t.bigint :user_id
+ t.bigint :group_id
+ t.timestamps_with_timezone null: false
+ t.integer :access_level, limit: 2
+ t.integer :required_approvals, null: false, limit: 2
+
+ t.index :user_id
+ t.index :group_id
+
+ t.check_constraint "((access_level IS NOT NULL) AND (group_id IS NULL) AND (user_id IS NULL)) OR " \
+ "((user_id IS NOT NULL) AND (access_level IS NULL) AND (group_id IS NULL)) OR " \
+ "((group_id IS NOT NULL) AND (user_id IS NULL) AND (access_level IS NULL))"
+ t.check_constraint "required_approvals > 0"
+ end
+ end
+
+ def down
+ drop_table :protected_environment_approval_rules
+ end
+end
diff --git a/db/migrate/20220314184109_add_user_fk_to_protected_environment_approval_rules.rb b/db/migrate/20220314184109_add_user_fk_to_protected_environment_approval_rules.rb
new file mode 100644
index 00000000000..c339f465da5
--- /dev/null
+++ b/db/migrate/20220314184109_add_user_fk_to_protected_environment_approval_rules.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUserFkToProtectedEnvironmentApprovalRules < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :protected_environment_approval_rules, :users, column: :user_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :protected_environment_approval_rules, column: :user_id
+ end
+ end
+end
diff --git a/db/migrate/20220314184209_add_group_fk_to_protected_environment_approval_rules.rb b/db/migrate/20220314184209_add_group_fk_to_protected_environment_approval_rules.rb
new file mode 100644
index 00000000000..57c4f7dea33
--- /dev/null
+++ b/db/migrate/20220314184209_add_group_fk_to_protected_environment_approval_rules.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddGroupFkToProtectedEnvironmentApprovalRules < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :protected_environment_approval_rules, :namespaces, column: :group_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :protected_environment_approval_rules, column: :group_id
+ end
+ end
+end
diff --git a/db/migrate/20220314194009_add_approval_rule_id_to_deployment_approvals.rb b/db/migrate/20220314194009_add_approval_rule_id_to_deployment_approvals.rb
new file mode 100644
index 00000000000..6e12f568f6e
--- /dev/null
+++ b/db/migrate/20220314194009_add_approval_rule_id_to_deployment_approvals.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddApprovalRuleIdToDeploymentApprovals < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :deployment_approvals, :approval_rule_id, :bigint
+ end
+end
diff --git a/db/migrate/20220314204009_add_approval_rule_fk_to_deployment_approvals.rb b/db/migrate/20220314204009_add_approval_rule_fk_to_deployment_approvals.rb
new file mode 100644
index 00000000000..ba49103b4d3
--- /dev/null
+++ b/db/migrate/20220314204009_add_approval_rule_fk_to_deployment_approvals.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddApprovalRuleFkToDeploymentApprovals < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_deployment_approvals_on_approval_rule_id'
+
+ def up
+ add_concurrent_index :deployment_approvals, :approval_rule_id, name: INDEX_NAME
+ add_concurrent_foreign_key :deployment_approvals, :protected_environment_approval_rules, column: :approval_rule_id, on_delete: :nullify
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :deployment_approvals, column: :approval_rule_id
+ end
+
+ remove_concurrent_index_by_name :deployment_approvals, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220316095126_add_creator_id_to_deploy_tokens.rb b/db/migrate/20220316095126_add_creator_id_to_deploy_tokens.rb
new file mode 100644
index 00000000000..22a92081b37
--- /dev/null
+++ b/db/migrate/20220316095126_add_creator_id_to_deploy_tokens.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddCreatorIdToDeployTokens < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :deploy_tokens, :creator_id, :bigint
+ end
+end
diff --git a/db/migrate/20220316202200_add_migration_plan_to_container_repositories.rb b/db/migrate/20220316202200_add_migration_plan_to_container_repositories.rb
new file mode 100644
index 00000000000..baeff52542f
--- /dev/null
+++ b/db/migrate/20220316202200_add_migration_plan_to_container_repositories.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddMigrationPlanToContainerRepositories < Gitlab::Database::Migration[1.0]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20220316202402_add_text_limit_to_container_repositories_migration_plan
+ def change
+ add_column(:container_repositories, :migration_plan, :text)
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20220316202402_add_text_limit_to_container_repositories_migration_plan.rb b/db/migrate/20220316202402_add_text_limit_to_container_repositories_migration_plan.rb
new file mode 100644
index 00000000000..a9f653c742f
--- /dev/null
+++ b/db/migrate/20220316202402_add_text_limit_to_container_repositories_migration_plan.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToContainerRepositoriesMigrationPlan < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :container_repositories, :migration_plan, 255
+ end
+
+ def down
+ remove_text_limit :container_repositories, :migration_plan
+ end
+end
diff --git a/db/migrate/20220317170122_add_notification_level_to_namespace_root_storage_statistics.rb b/db/migrate/20220317170122_add_notification_level_to_namespace_root_storage_statistics.rb
new file mode 100644
index 00000000000..3c0b41e0b42
--- /dev/null
+++ b/db/migrate/20220317170122_add_notification_level_to_namespace_root_storage_statistics.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddNotificationLevelToNamespaceRootStorageStatistics < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def up
+ add_column :namespace_root_storage_statistics, :notification_level, :integer, limit: 2, default: 100, null: false
+ end
+
+ def down
+ remove_column :namespace_root_storage_statistics, :notification_level
+ end
+end
diff --git a/db/migrate/20220318120802_add_target_platforms_to_project_setting.rb b/db/migrate/20220318120802_add_target_platforms_to_project_setting.rb
new file mode 100644
index 00000000000..0e8f206e56d
--- /dev/null
+++ b/db/migrate/20220318120802_add_target_platforms_to_project_setting.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddTargetPlatformsToProjectSetting < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :project_settings, :target_platforms, :string, array: true, default: [], null: false, if_not_exists: true
+ end
+end
diff --git a/db/migrate/20220318141037_add_pages_onboarding_state.rb b/db/migrate/20220318141037_add_pages_onboarding_state.rb
new file mode 100644
index 00000000000..e320bee63c4
--- /dev/null
+++ b/db/migrate/20220318141037_add_pages_onboarding_state.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddPagesOnboardingState < Gitlab::Database::Migration[1.0]
+ def up
+ add_column :project_pages_metadata, :onboarding_complete, :boolean, default: false, null: false
+ end
+
+ def down
+ remove_column :project_pages_metadata, :onboarding_complete
+ end
+end
diff --git a/db/migrate/20220321150028_add_started_at_to_batched_background_migrations_table.rb b/db/migrate/20220321150028_add_started_at_to_batched_background_migrations_table.rb
new file mode 100644
index 00000000000..38a2c4de2f9
--- /dev/null
+++ b/db/migrate/20220321150028_add_started_at_to_batched_background_migrations_table.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddStartedAtToBatchedBackgroundMigrationsTable < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :batched_background_migrations, :started_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20220321234317_remove_all_issuable_escalation_statuses.rb b/db/migrate/20220321234317_remove_all_issuable_escalation_statuses.rb
new file mode 100644
index 00000000000..a6ea1820160
--- /dev/null
+++ b/db/migrate/20220321234317_remove_all_issuable_escalation_statuses.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class RemoveAllIssuableEscalationStatuses < Gitlab::Database::Migration[1.0]
+ BATCH_SIZE = 5_000
+
+ disable_ddl_transaction!
+
+ # Removes records from previous backfill. Records for
+ # existing incidents will be created entirely as-needed.
+ #
+ # See db/post_migrate/20211214012507_backfill_incident_issue_escalation_statuses.rb,
+ # & IncidentManagement::IssuableEscalationStatuses::[BuildService,PrepareUpdateService]
+ def up
+ each_batch_range('incident_management_issuable_escalation_statuses', of: BATCH_SIZE) do |min, max|
+ execute <<~SQL
+ DELETE FROM incident_management_issuable_escalation_statuses
+ WHERE id BETWEEN #{min} AND #{max}
+ SQL
+ end
+ end
+
+ def down
+ # no-op
+ #
+ # Potential rollback/re-run should not have impact, as these
+ # records are not required to be present in the application.
+ # The corresponding feature flag is also disabled,
+ # preventing any user-facing access to the records.
+ end
+end
diff --git a/db/migrate/20220322143441_add_dora_incidents_count.rb b/db/migrate/20220322143441_add_dora_incidents_count.rb
new file mode 100644
index 00000000000..155bd979171
--- /dev/null
+++ b/db/migrate/20220322143441_add_dora_incidents_count.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddDoraIncidentsCount < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :dora_daily_metrics, :incidents_count, :integer
+ end
+end
diff --git a/db/migrate/20220322205004_change_search_rate_limit_default_values.rb b/db/migrate/20220322205004_change_search_rate_limit_default_values.rb
new file mode 100644
index 00000000000..34ebdddb8eb
--- /dev/null
+++ b/db/migrate/20220322205004_change_search_rate_limit_default_values.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class ChangeSearchRateLimitDefaultValues < Gitlab::Database::Migration[1.0]
+ def change
+ change_column_default :application_settings, :search_rate_limit, from: 30, to: 300
+ change_column_default :application_settings, :search_rate_limit_unauthenticated, from: 10, to: 100
+ end
+end
diff --git a/db/migrate/20220324171254_add_public_git_lab_runner_releases_url_to_application_settings.rb b/db/migrate/20220324171254_add_public_git_lab_runner_releases_url_to_application_settings.rb
new file mode 100644
index 00000000000..af963fa5454
--- /dev/null
+++ b/db/migrate/20220324171254_add_public_git_lab_runner_releases_url_to_application_settings.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddPublicGitLabRunnerReleasesUrlToApplicationSettings < Gitlab::Database::Migration[1.0]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20220324173554_add_text_limit_to_public_git_lab_runner_releases_url_application_settings
+ def change
+ add_column :application_settings, :public_runner_releases_url, :text, null: false, default: 'https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab-runner/releases'
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20220324173554_add_text_limit_to_public_git_lab_runner_releases_url_application_settings.rb b/db/migrate/20220324173554_add_text_limit_to_public_git_lab_runner_releases_url_application_settings.rb
new file mode 100644
index 00000000000..26f7447021b
--- /dev/null
+++ b/db/migrate/20220324173554_add_text_limit_to_public_git_lab_runner_releases_url_application_settings.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToPublicGitLabRunnerReleasesUrlApplicationSettings < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :application_settings, :public_runner_releases_url, 255
+ end
+
+ def down
+ remove_text_limit :application_settings, :public_runner_releases_url
+ end
+end
diff --git a/db/migrate/20220324175325_add_key_data_to_secure_files.rb b/db/migrate/20220324175325_add_key_data_to_secure_files.rb
new file mode 100644
index 00000000000..70dfd64be27
--- /dev/null
+++ b/db/migrate/20220324175325_add_key_data_to_secure_files.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddKeyDataToSecureFiles < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ unless column_exists? :ci_secure_files, :key_data
+ add_column :ci_secure_files, :key_data, :text
+ end
+
+ add_text_limit :ci_secure_files, :key_data, 128
+ end
+
+ def down
+ remove_column :ci_secure_files, :key_data
+ end
+end
diff --git a/db/migrate/20220329061545_add_repository_size_to_plan_limits.rb b/db/migrate/20220329061545_add_repository_size_to_plan_limits.rb
new file mode 100644
index 00000000000..2c84780dc2b
--- /dev/null
+++ b/db/migrate/20220329061545_add_repository_size_to_plan_limits.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddRepositorySizeToPlanLimits < Gitlab::Database::Migration[1.0]
+ def up
+ add_column(:plan_limits, :repository_size, :bigint, default: 0, null: false)
+ end
+
+ def down
+ remove_column(:plan_limits, :repository_size)
+ end
+end
diff --git a/db/migrate/20220329095632_add_theme_to_broadcast_message.rb b/db/migrate/20220329095632_add_theme_to_broadcast_message.rb
new file mode 100644
index 00000000000..ae5971469f9
--- /dev/null
+++ b/db/migrate/20220329095632_add_theme_to_broadcast_message.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddThemeToBroadcastMessage < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :broadcast_messages, :theme, :smallint, null: false, default: 0
+ end
+end
diff --git a/db/migrate/20220329110630_add_ci_namespace_mirrors_unnest_index_on_traversal_ids.rb b/db/migrate/20220329110630_add_ci_namespace_mirrors_unnest_index_on_traversal_ids.rb
new file mode 100644
index 00000000000..6f5d7b4c71e
--- /dev/null
+++ b/db/migrate/20220329110630_add_ci_namespace_mirrors_unnest_index_on_traversal_ids.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class AddCiNamespaceMirrorsUnnestIndexOnTraversalIds < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_namespace_mirrors_on_traversal_ids_unnest'
+
+ def up
+ return if index_exists_by_name?(:ci_namespace_mirrors, INDEX_NAME)
+
+ # We add only 4-levels since on average it is not expected that namespaces
+ # will be so granular beyond this point
+ disable_statement_timeout do
+ execute <<-SQL
+ CREATE INDEX CONCURRENTLY #{INDEX_NAME} ON ci_namespace_mirrors
+ USING btree ((traversal_ids[1]), (traversal_ids[2]), (traversal_ids[3]), (traversal_ids[4]))
+ INCLUDE (traversal_ids, namespace_id)
+ SQL
+ end
+ end
+
+ def down
+ remove_concurrent_index_by_name(:ci_namespace_mirrors, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20220331174026_add_submit_field_to_dast_site_profiles.rb b/db/migrate/20220331174026_add_submit_field_to_dast_site_profiles.rb
new file mode 100644
index 00000000000..00c46b59b1c
--- /dev/null
+++ b/db/migrate/20220331174026_add_submit_field_to_dast_site_profiles.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddSubmitFieldToDastSiteProfiles < Gitlab::Database::Migration[1.0]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20220331174459_add_text_limit_to_submit_field_dast_site_profiles
+ def change
+ add_column :dast_site_profiles, :auth_submit_field, :text
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20220331174459_add_text_limit_to_submit_field_dast_site_profiles.rb b/db/migrate/20220331174459_add_text_limit_to_submit_field_dast_site_profiles.rb
new file mode 100644
index 00000000000..291d52a0122
--- /dev/null
+++ b/db/migrate/20220331174459_add_text_limit_to_submit_field_dast_site_profiles.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToSubmitFieldDastSiteProfiles < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :dast_site_profiles, :auth_submit_field, 255
+ end
+
+ def down
+ remove_text_limit :dast_site_profiles, :auth_submit_field
+ end
+end
diff --git a/db/migrate/20220401044858_add_user_id_and_state_index_to_merge_request_assignees.rb b/db/migrate/20220401044858_add_user_id_and_state_index_to_merge_request_assignees.rb
new file mode 100644
index 00000000000..b869b3d9b52
--- /dev/null
+++ b/db/migrate/20220401044858_add_user_id_and_state_index_to_merge_request_assignees.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUserIdAndStateIndexToMergeRequestAssignees < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_on_merge_request_assignees_user_id_and_state'
+
+ def up
+ add_concurrent_index :merge_request_assignees, [:user_id, :state], where: 'state = 2', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :merge_request_assignees, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220401045116_add_user_id_and_state_index_to_merge_request_reviewers.rb b/db/migrate/20220401045116_add_user_id_and_state_index_to_merge_request_reviewers.rb
new file mode 100644
index 00000000000..0788dd9583c
--- /dev/null
+++ b/db/migrate/20220401045116_add_user_id_and_state_index_to_merge_request_reviewers.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUserIdAndStateIndexToMergeRequestReviewers < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_on_merge_request_reviewers_user_id_and_state'
+
+ def up
+ add_concurrent_index :merge_request_reviewers, [:user_id, :state], where: 'state = 2', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :merge_request_reviewers, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220401110443_add_on_hold_until_column_for_batched_migration.rb b/db/migrate/20220401110443_add_on_hold_until_column_for_batched_migration.rb
new file mode 100644
index 00000000000..4771b50d566
--- /dev/null
+++ b/db/migrate/20220401110443_add_on_hold_until_column_for_batched_migration.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class AddOnHoldUntilColumnForBatchedMigration < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :batched_background_migrations, :on_hold_until, :timestamptz,
+ comment: 'execution of this migration is on hold until this time'
+ end
+end
diff --git a/db/migrate/20220401110511_add_runtime_data_columns_to_vsa_aggregations.rb b/db/migrate/20220401110511_add_runtime_data_columns_to_vsa_aggregations.rb
new file mode 100644
index 00000000000..09960c7add6
--- /dev/null
+++ b/db/migrate/20220401110511_add_runtime_data_columns_to_vsa_aggregations.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddRuntimeDataColumnsToVsaAggregations < Gitlab::Database::Migration[1.0]
+ def up
+ change_table(:analytics_cycle_analytics_aggregations, bulk: true) do |t|
+ t.integer :full_runtimes_in_seconds, array: true, default: [], null: false
+ t.integer :full_processed_records, array: true, default: [], null: false
+ t.column :last_full_merge_requests_updated_at, :datetime_with_timezone
+ t.column :last_full_issues_updated_at, :datetime_with_timezone
+ t.integer :last_full_issues_id
+ t.integer :last_full_merge_requests_id
+ end
+ end
+
+ def down
+ remove_column :analytics_cycle_analytics_aggregations, :full_runtimes_in_seconds
+ remove_column :analytics_cycle_analytics_aggregations, :full_processed_records
+ remove_column :analytics_cycle_analytics_aggregations, :last_full_merge_requests_updated_at
+ remove_column :analytics_cycle_analytics_aggregations, :last_full_issues_updated_at
+ remove_column :analytics_cycle_analytics_aggregations, :last_full_issues_id
+ remove_column :analytics_cycle_analytics_aggregations, :last_full_merge_requests_id
+ end
+end
diff --git a/db/migrate/20220401113123_add_check_constraint_to_vsa_aggregation_runtime_data_columns.rb b/db/migrate/20220401113123_add_check_constraint_to_vsa_aggregation_runtime_data_columns.rb
new file mode 100644
index 00000000000..4863a1f0030
--- /dev/null
+++ b/db/migrate/20220401113123_add_check_constraint_to_vsa_aggregation_runtime_data_columns.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddCheckConstraintToVsaAggregationRuntimeDataColumns < Gitlab::Database::Migration[1.0]
+ FULL_RUNTIMES_IN_SECONDS_CONSTRAINT = 'full_runtimes_in_seconds_size'
+ FULL_PROCESSED_RECORDS_CONSTRAINT = 'full_processed_records_size'
+
+ disable_ddl_transaction!
+
+ def up
+ add_check_constraint(:analytics_cycle_analytics_aggregations,
+ 'CARDINALITY(full_runtimes_in_seconds) <= 10',
+ FULL_RUNTIMES_IN_SECONDS_CONSTRAINT)
+
+ add_check_constraint(:analytics_cycle_analytics_aggregations,
+ 'CARDINALITY(full_processed_records) <= 10',
+ FULL_PROCESSED_RECORDS_CONSTRAINT)
+ end
+
+ def down
+ remove_check_constraint :analytics_cycle_analytics_aggregations, FULL_RUNTIMES_IN_SECONDS_CONSTRAINT
+ remove_check_constraint :analytics_cycle_analytics_aggregations, FULL_PROCESSED_RECORDS_CONSTRAINT
+ end
+end
diff --git a/db/migrate/20220404114106_add_container_registry_size_to_project_statistics.rb b/db/migrate/20220404114106_add_container_registry_size_to_project_statistics.rb
new file mode 100644
index 00000000000..4f5778bf321
--- /dev/null
+++ b/db/migrate/20220404114106_add_container_registry_size_to_project_statistics.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddContainerRegistrySizeToProjectStatistics < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ add_column :project_statistics, :container_registry_size, :bigint, default: 0, null: false
+ end
+end
diff --git a/db/migrate/20220404170446_add_index_for_non_requested_non_invited_awaiting_members.rb b/db/migrate/20220404170446_add_index_for_non_requested_non_invited_awaiting_members.rb
new file mode 100644
index 00000000000..d1d2dc510cf
--- /dev/null
+++ b/db/migrate/20220404170446_add_index_for_non_requested_non_invited_awaiting_members.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddIndexForNonRequestedNonInvitedAwaitingMembers < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_members_on_non_requested_non_invited_and_state_awaiting'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :members,
+ :source_id,
+ where: '((requested_at IS NULL) AND (invite_token IS NULL) AND (access_level > 5) AND (state = 1))',
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :members, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220405061122_add_license_scanning_action_to_onboarding_progresses.rb b/db/migrate/20220405061122_add_license_scanning_action_to_onboarding_progresses.rb
new file mode 100644
index 00000000000..0c07d1f18ba
--- /dev/null
+++ b/db/migrate/20220405061122_add_license_scanning_action_to_onboarding_progresses.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddLicenseScanningActionToOnboardingProgresses < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :onboarding_progresses, :license_scanning_run_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20220405125459_add_non_migrated_index_to_container_repositories.rb b/db/migrate/20220405125459_add_non_migrated_index_to_container_repositories.rb
new file mode 100644
index 00000000000..7aad10c288b
--- /dev/null
+++ b/db/migrate/20220405125459_add_non_migrated_index_to_container_repositories.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddNonMigratedIndexToContainerRepositories < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ # follow up issue: https://gitlab.com/gitlab-org/gitlab/-/issues/358407
+ INDEX_NAME = 'tmp_idx_container_repos_on_non_migrated'
+ MIGRATION_PHASE_1_ENDED_AT = '2022-01-23'
+
+ def up
+ add_concurrent_index :container_repositories,
+ [:project_id, :id],
+ name: INDEX_NAME,
+ where: "migration_state != 'import_done' AND created_at < '#{MIGRATION_PHASE_1_ENDED_AT}'"
+ end
+
+ def down
+ remove_concurrent_index_by_name :container_repositories, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220405181814_add_arkose_settings_to_application_settings.rb b/db/migrate/20220405181814_add_arkose_settings_to_application_settings.rb
new file mode 100644
index 00000000000..d8c06cd8229
--- /dev/null
+++ b/db/migrate/20220405181814_add_arkose_settings_to_application_settings.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class AddArkoseSettingsToApplicationSettings < Gitlab::Database::Migration[1.0]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20220405203843_add_text_limit_to_arkose_verify_url_application_settings.rb
+ def up
+ add_column :application_settings, :encrypted_arkose_labs_public_api_key, :binary
+ add_column :application_settings, :encrypted_arkose_labs_public_api_key_iv, :binary
+
+ add_column :application_settings, :encrypted_arkose_labs_private_api_key, :binary
+ add_column :application_settings, :encrypted_arkose_labs_private_api_key_iv, :binary
+
+ add_column :application_settings, :arkose_labs_verify_api_url, :text
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+
+ def down
+ remove_column :application_settings, :encrypted_arkose_labs_public_api_key
+ remove_column :application_settings, :encrypted_arkose_labs_public_api_key_iv
+
+ remove_column :application_settings, :encrypted_arkose_labs_private_api_key
+ remove_column :application_settings, :encrypted_arkose_labs_private_api_key_iv
+
+ remove_column :application_settings, :arkose_labs_verify_api_url
+ end
+end
diff --git a/db/migrate/20220405203843_add_text_limit_to_arkose_verify_url_application_settings.rb b/db/migrate/20220405203843_add_text_limit_to_arkose_verify_url_application_settings.rb
new file mode 100644
index 00000000000..f3c7960b29d
--- /dev/null
+++ b/db/migrate/20220405203843_add_text_limit_to_arkose_verify_url_application_settings.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToArkoseVerifyUrlApplicationSettings < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :application_settings, :arkose_labs_verify_api_url, 255
+ end
+
+ def down
+ remove_text_limit :application_settings, :arkose_labs_verify_api_url
+ end
+end
diff --git a/db/migrate/20220406113217_add_inactive_project_deletion_to_application_settings.rb b/db/migrate/20220406113217_add_inactive_project_deletion_to_application_settings.rb
new file mode 100644
index 00000000000..78970d308d9
--- /dev/null
+++ b/db/migrate/20220406113217_add_inactive_project_deletion_to_application_settings.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddInactiveProjectDeletionToApplicationSettings < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :application_settings, :delete_inactive_projects, :boolean, default: false, null: false
+ add_column :application_settings, :inactive_projects_delete_after_months, :integer, default: 2, null: false
+ add_column :application_settings, :inactive_projects_min_size_mb, :integer, default: 0, null: false
+ add_column :application_settings, :inactive_projects_send_warning_email_after_months, :integer, default: 1,
+ null: false
+ end
+end
diff --git a/db/migrate/20220406121831_add_index_on_status_for_batched_background_migrations.rb b/db/migrate/20220406121831_add_index_on_status_for_batched_background_migrations.rb
new file mode 100644
index 00000000000..bc3b9125b4b
--- /dev/null
+++ b/db/migrate/20220406121831_add_index_on_status_for_batched_background_migrations.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddIndexOnStatusForBatchedBackgroundMigrations < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :batched_background_migrations, :status
+ end
+
+ def down
+ remove_concurrent_index_by_name :batched_background_migrations, :index_batched_background_migrations_on_status
+ end
+end
diff --git a/db/migrate/20220407135820_add_epics_relative_position.rb b/db/migrate/20220407135820_add_epics_relative_position.rb
new file mode 100644
index 00000000000..8ab62667e1e
--- /dev/null
+++ b/db/migrate/20220407135820_add_epics_relative_position.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddEpicsRelativePosition < Gitlab::Database::Migration[1.0]
+ DOWNTIME = false
+
+ def up
+ return unless table_exists?(:epics)
+ return if column_exists?(:epics, :relative_position)
+
+ add_column :epics, :relative_position, :integer
+
+ execute('UPDATE epics SET relative_position=id*500')
+ end
+
+ def down
+ # no-op - this column should normally exist if epics table exists too
+ end
+end
diff --git a/db/migrate/20220408001450_add_work_item_type_name_unique_index_null_namespaces.rb b/db/migrate/20220408001450_add_work_item_type_name_unique_index_null_namespaces.rb
new file mode 100644
index 00000000000..bcb0e32a4e7
--- /dev/null
+++ b/db/migrate/20220408001450_add_work_item_type_name_unique_index_null_namespaces.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddWorkItemTypeNameUniqueIndexNullNamespaces < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = :idx_work_item_types_on_namespace_id_and_name_null_namespace
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :work_item_types,
+ 'TRIM(BOTH FROM LOWER(name)), (namespace_id IS NULL)',
+ unique: true,
+ name: INDEX_NAME,
+ where: 'namespace_id IS NULL'
+ end
+
+ def down
+ remove_concurrent_index_by_name :work_item_types, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220408135815_update_index_on_greated_done_at_on_container_repositories.rb b/db/migrate/20220408135815_update_index_on_greated_done_at_on_container_repositories.rb
new file mode 100644
index 00000000000..b906a867895
--- /dev/null
+++ b/db/migrate/20220408135815_update_index_on_greated_done_at_on_container_repositories.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class UpdateIndexOnGreatedDoneAtOnContainerRepositories < Gitlab::Database::Migration[1.0]
+ OLD_INDEX_NAME = 'index_container_repositories_on_greatest_done_at'
+ NEW_INDEX_NAME = 'index_container_repositories_on_greatest_completed_at'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :container_repositories,
+ 'GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at)',
+ where: "migration_state IN ('import_done', 'pre_import_done', 'import_aborted', 'import_skipped')",
+ name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :container_repositories, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :container_repositories,
+ 'GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at)',
+ where: "migration_state IN ('import_done', 'pre_import_done', 'import_aborted')",
+ name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :container_repositories, NEW_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220412171810_add_otp_secret_expires_at.rb b/db/migrate/20220412171810_add_otp_secret_expires_at.rb
new file mode 100644
index 00000000000..883293c87f8
--- /dev/null
+++ b/db/migrate/20220412171810_add_otp_secret_expires_at.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddOtpSecretExpiresAt < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ # rubocop: disable Migration/AddColumnsToWideTables
+ add_column :users, :otp_secret_expires_at, :datetime_with_timezone
+ # rubocop: enable Migration/AddColumnsToWideTables
+ end
+end
diff --git a/db/migrate/20220413075921_update_index_on_packages_build_infos.rb b/db/migrate/20220413075921_update_index_on_packages_build_infos.rb
new file mode 100644
index 00000000000..96f37fab24e
--- /dev/null
+++ b/db/migrate/20220413075921_update_index_on_packages_build_infos.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class UpdateIndexOnPackagesBuildInfos < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ NEW_INDEX_NAME = 'index_packages_build_infos_package_id_pipeline_id_id'
+ OLD_INDEX_NAME = 'index_packages_build_infos_package_id_pipeline_id'
+
+ def up
+ add_concurrent_index :packages_build_infos,
+ [:package_id, :pipeline_id, :id],
+ name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :packages_build_infos, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :packages_build_infos,
+ [:package_id, :pipeline_id],
+ name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :packages_build_infos, NEW_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211214012507_backfill_incident_issue_escalation_statuses.rb b/db/post_migrate/20211214012507_backfill_incident_issue_escalation_statuses.rb
index 7f0168be1a4..f8239b6e0cd 100644
--- a/db/post_migrate/20211214012507_backfill_incident_issue_escalation_statuses.rb
+++ b/db/post_migrate/20211214012507_backfill_incident_issue_escalation_statuses.rb
@@ -1,26 +1,9 @@
# frozen_string_literal: true
class BackfillIncidentIssueEscalationStatuses < Gitlab::Database::Migration[1.0]
- MIGRATION = 'BackfillIncidentIssueEscalationStatuses'
- DELAY_INTERVAL = 2.minutes
- BATCH_SIZE = 20_000
-
- disable_ddl_transaction!
-
- class Issue < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'issues'
- end
-
- def up
- relation = Issue.all
-
- queue_background_migration_jobs_by_range_at_intervals(
- relation, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE, track_jobs: true)
- end
-
- def down
+ # Removed in favor of creating records for existing incidents
+ # as-needed. See db/migrate/20220321234317_remove_all_issuable_escalation_statuses.rb.
+ def change
# no-op
end
end
diff --git a/db/post_migrate/20220204095121_backfill_namespace_statistics_with_dependency_proxy_size.rb b/db/post_migrate/20220204095121_backfill_namespace_statistics_with_dependency_proxy_size.rb
new file mode 100644
index 00000000000..49c9efc497c
--- /dev/null
+++ b/db/post_migrate/20220204095121_backfill_namespace_statistics_with_dependency_proxy_size.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class BackfillNamespaceStatisticsWithDependencyProxySize < Gitlab::Database::Migration[1.0]
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 500
+ MIGRATION = 'PopulateNamespaceStatistics'
+
+ disable_ddl_transaction!
+
+ def up
+ groups = exec_query <<~SQL
+ SELECT dependency_proxy_manifests.group_id FROM dependency_proxy_manifests
+ UNION
+ SELECT dependency_proxy_blobs.group_id from dependency_proxy_blobs
+ SQL
+
+ groups.rows.flatten.in_groups_of(BATCH_SIZE, false).each_with_index do |group_ids, index|
+ migrate_in(index * DELAY_INTERVAL, MIGRATION, [group_ids, [:dependency_proxy_size]])
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220223124428_schedule_merge_topics_with_same_name.rb b/db/post_migrate/20220223124428_schedule_merge_topics_with_same_name.rb
new file mode 100644
index 00000000000..7e79c89203a
--- /dev/null
+++ b/db/post_migrate/20220223124428_schedule_merge_topics_with_same_name.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class ScheduleMergeTopicsWithSameName < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'MergeTopicsWithSameName'
+ BATCH_SIZE = 100
+
+ disable_ddl_transaction!
+
+ class Topic < ActiveRecord::Base
+ self.table_name = 'topics'
+ end
+
+ def up
+ Topic.select('LOWER(name) as name').group('LOWER(name)').having('COUNT(*) > 1').order('LOWER(name)')
+ .in_groups_of(BATCH_SIZE, false).each_with_index do |group, i|
+ migrate_in((i + 1) * 2.minutes, MIGRATION, [group.map(&:name)])
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220302114046_backfill_group_features.rb b/db/post_migrate/20220302114046_backfill_group_features.rb
new file mode 100644
index 00000000000..dd8961b8bee
--- /dev/null
+++ b/db/post_migrate/20220302114046_backfill_group_features.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class BackfillGroupFeatures < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'BackfillGroupFeatures'
+ INTERVAL = 2.minutes
+ BATCH_SIZE = 10_000
+ SUB_BATCH_SIZE = 1_000
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :namespaces,
+ :id,
+ BATCH_SIZE,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE,
+ max_batch_size: BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ Gitlab::Database::BackgroundMigration::BatchedMigration
+ .for_configuration(MIGRATION, :namespaces, :id, [BATCH_SIZE])
+ .delete_all
+ end
+end
diff --git a/db/post_migrate/20220311010352_create_scan_id_and_id_index_on_security_findings.rb b/db/post_migrate/20220311010352_create_scan_id_and_id_index_on_security_findings.rb
new file mode 100644
index 00000000000..1b72c4b0a78
--- /dev/null
+++ b/db/post_migrate/20220311010352_create_scan_id_and_id_index_on_security_findings.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CreateScanIdAndIdIndexOnSecurityFindings < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_security_findings_on_scan_id_and_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :security_findings, [:scan_id, :id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :security_findings, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220315171027_add_tmp_index_to_support_leaky_regex_cleanup.rb b/db/post_migrate/20220315171027_add_tmp_index_to_support_leaky_regex_cleanup.rb
new file mode 100644
index 00000000000..6f4bd29337e
--- /dev/null
+++ b/db/post_migrate/20220315171027_add_tmp_index_to_support_leaky_regex_cleanup.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddTmpIndexToSupportLeakyRegexCleanup < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = "tmp_index_merge_requests_draft_and_status_leaky_regex"
+ LEAKY_REGEXP_STR = "^\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP"
+ CORRECTED_REGEXP_STR = "^(\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP)"
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :merge_requests, :id,
+ where: "draft = true AND state_id = 1 AND ((title)::text ~* '#{LEAKY_REGEXP_STR}'::text) AND ((title)::text !~* '#{CORRECTED_REGEXP_STR}'::text)",
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :merge_requests, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220315171129_cleanup_draft_data_from_faulty_regex.rb b/db/post_migrate/20220315171129_cleanup_draft_data_from_faulty_regex.rb
new file mode 100644
index 00000000000..be81bf85f62
--- /dev/null
+++ b/db/post_migrate/20220315171129_cleanup_draft_data_from_faulty_regex.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+class CleanupDraftDataFromFaultyRegex < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'CleanupDraftDataFromFaultyRegex'
+ DELAY_INTERVAL = 5.minutes
+ BATCH_SIZE = 20
+
+ disable_ddl_transaction!
+
+ class MergeRequest < ActiveRecord::Base
+ LEAKY_REGEXP_STR = "^\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP"
+ CORRECTED_REGEXP_STR = "^(\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP)"
+
+ self.table_name = 'merge_requests'
+
+ include ::EachBatch
+
+ def self.eligible
+ where(state_id: 1)
+ .where(draft: true)
+ .where("title ~* ?", LEAKY_REGEXP_STR)
+ .where("title !~* ?", CORRECTED_REGEXP_STR)
+ end
+ end
+
+ def up
+ return unless Gitlab.com?
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ MergeRequest.eligible,
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # noop
+ #
+ end
+end
diff --git a/db/post_migrate/20220315181125_remove_issues_work_item_type_id_index.rb b/db/post_migrate/20220315181125_remove_issues_work_item_type_id_index.rb
new file mode 100644
index 00000000000..6650201c063
--- /dev/null
+++ b/db/post_migrate/20220315181125_remove_issues_work_item_type_id_index.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveIssuesWorkItemTypeIdIndex < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_issues_on_work_item_type_id'
+
+ def up
+ remove_concurrent_index_by_name :issues, name: INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :issues, :work_item_type_id, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220315181130_add_temporary_issue_type_index_for_work_item_types.rb b/db/post_migrate/20220315181130_add_temporary_issue_type_index_for_work_item_types.rb
new file mode 100644
index 00000000000..52c525d81fb
--- /dev/null
+++ b/db/post_migrate/20220315181130_add_temporary_issue_type_index_for_work_item_types.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTemporaryIssueTypeIndexForWorkItemTypes < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'tmp_index_issues_on_issue_type_and_id'
+
+ def up
+ add_concurrent_index :issues, [:issue_type, :id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :issues, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220315181136_backfill_work_item_type_id_on_issues.rb b/db/post_migrate/20220315181136_backfill_work_item_type_id_on_issues.rb
new file mode 100644
index 00000000000..8838a27f233
--- /dev/null
+++ b/db/post_migrate/20220315181136_backfill_work_item_type_id_on_issues.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+class BackfillWorkItemTypeIdOnIssues < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'BackfillWorkItemTypeIdForIssues'
+ BATCH_CLASS_NAME = 'BackfillIssueWorkItemTypeBatchingStrategy'
+ BATCH_SIZE = 10_000
+ MAX_BATCH_SIZE = 30_000
+ SUB_BATCH_SIZE = 100
+ INTERVAL = 2.minutes
+
+ class MigrationWorkItemType < ApplicationRecord
+ self.table_name = 'work_item_types'
+
+ def self.id_by_type
+ where(namespace_id: nil).order(:base_type).pluck(:base_type, :id).to_h
+ end
+ end
+
+ def up
+ # We expect no more than 5 types. Only 3 of them are expected to have associated issues at the moment
+ MigrationWorkItemType.id_by_type.each do |base_type, type_id|
+ queue_batched_background_migration(
+ MIGRATION,
+ :issues,
+ :id,
+ base_type,
+ type_id,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE,
+ max_batch_size: MAX_BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE,
+ batch_class_name: BATCH_CLASS_NAME
+ )
+ end
+ end
+
+ def down
+ Gitlab::Database::BackgroundMigration::BatchedMigration.where(job_class_name: MIGRATION).delete_all
+ end
+end
diff --git a/db/post_migrate/20220315211043_add_index_to_vulnerability_reads.rb b/db/post_migrate/20220315211043_add_index_to_vulnerability_reads.rb
new file mode 100644
index 00000000000..9fe78fb0a4e
--- /dev/null
+++ b/db/post_migrate/20220315211043_add_index_to_vulnerability_reads.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddIndexToVulnerabilityReads < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_vulnerability_reads_common_finder_query'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(
+ :vulnerability_reads,
+ %i[project_id state report_type severity vulnerability_id],
+ name: INDEX_NAME,
+ order: { vulnerability_id: :desc }
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(
+ :vulnerability_reads,
+ INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20220316102900_add_index_to_deploy_tokens_on_creator_id.rb b/db/post_migrate/20220316102900_add_index_to_deploy_tokens_on_creator_id.rb
new file mode 100644
index 00000000000..7cc942c813b
--- /dev/null
+++ b/db/post_migrate/20220316102900_add_index_to_deploy_tokens_on_creator_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexToDeployTokensOnCreatorId < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_deploy_tokens_on_creator_id'
+
+ def up
+ add_concurrent_index :deploy_tokens, :creator_id, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index :deploy_tokens, :creator_id, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220316102902_add_user_foreign_key_to_deploy_tokens.rb b/db/post_migrate/20220316102902_add_user_foreign_key_to_deploy_tokens.rb
new file mode 100644
index 00000000000..57379e4c752
--- /dev/null
+++ b/db/post_migrate/20220316102902_add_user_foreign_key_to_deploy_tokens.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUserForeignKeyToDeployTokens < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :deploy_tokens, :users, column: :creator_id, on_delete: :nullify, reverse_lock_order: true
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :deploy_tokens, column: :creator_id
+ end
+ end
+end
diff --git a/db/post_migrate/20220316112118_update_organizations_name_index_add_id.rb b/db/post_migrate/20220316112118_update_organizations_name_index_add_id.rb
new file mode 100644
index 00000000000..4d78e78e9db
--- /dev/null
+++ b/db/post_migrate/20220316112118_update_organizations_name_index_add_id.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class UpdateOrganizationsNameIndexAddId < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ OLD_INDEX = 'index_customer_relations_organizations_on_unique_name_per_group'
+ NEW_INDEX = 'index_organizations_on_unique_name_per_group'
+
+ def up
+ add_concurrent_index :customer_relations_organizations, 'group_id, lower(name), id', name: NEW_INDEX, unique: true
+
+ remove_concurrent_index_by_name :customer_relations_organizations, OLD_INDEX
+ end
+
+ def down
+ add_concurrent_index :customer_relations_organizations, 'group_id, lower(name)', name: OLD_INDEX, unique: true
+
+ remove_concurrent_index_by_name :customer_relations_organizations, NEW_INDEX
+ end
+end
diff --git a/db/post_migrate/20220316112206_add_contacts_index_on_group_email_and_id.rb b/db/post_migrate/20220316112206_add_contacts_index_on_group_email_and_id.rb
new file mode 100644
index 00000000000..21434a80314
--- /dev/null
+++ b/db/post_migrate/20220316112206_add_contacts_index_on_group_email_and_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddContactsIndexOnGroupEmailAndId < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_customer_relations_contacts_on_unique_email_per_group'
+
+ def up
+ add_concurrent_index :customer_relations_contacts, 'group_id, lower(email), id', name: INDEX_NAME, unique: true
+ end
+
+ def down
+ remove_concurrent_index_by_name :customer_relations_contacts, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220316165539_add_index_to_vulnerabilities.rb b/db/post_migrate/20220316165539_add_index_to_vulnerabilities.rb
new file mode 100644
index 00000000000..1128ccd7b16
--- /dev/null
+++ b/db/post_migrate/20220316165539_add_index_to_vulnerabilities.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AddIndexToVulnerabilities < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_vulnerabilites_common_finder_query'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(
+ :vulnerabilities,
+ %i[project_id state report_type severity id],
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(
+ :vulnerabilities,
+ INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20220316202640_populate_container_repositories_migration_plan.rb b/db/post_migrate/20220316202640_populate_container_repositories_migration_plan.rb
new file mode 100644
index 00000000000..7eef227ec3c
--- /dev/null
+++ b/db/post_migrate/20220316202640_populate_container_repositories_migration_plan.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class PopulateContainerRepositoriesMigrationPlan < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'PopulateContainerRepositoryMigrationPlan'
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 1500
+
+ disable_ddl_transaction!
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('container_repositories'),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220317161914_remove_ci_runners_ci_builds_runner_id_fk.rb b/db/post_migrate/20220317161914_remove_ci_runners_ci_builds_runner_id_fk.rb
new file mode 100644
index 00000000000..3c7c4e73199
--- /dev/null
+++ b/db/post_migrate/20220317161914_remove_ci_runners_ci_builds_runner_id_fk.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class RemoveCiRunnersCiBuildsRunnerIdFk < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ return unless foreign_key_exists?(:ci_builds, :ci_runners, name: "fk_e4ef9c2f27")
+
+ with_lock_retries do
+ execute('LOCK ci_runners, ci_builds IN ACCESS EXCLUSIVE MODE') if transaction_open?
+
+ remove_foreign_key_if_exists(:ci_builds, :ci_runners, name: "fk_e4ef9c2f27")
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key :ci_builds, :ci_runners, name: "fk_e4ef9c2f27", column: :runner_id, target_column: :id, on_delete: :nullify, validate: false
+ end
+end
diff --git a/db/post_migrate/20220318111040_add_indexes_for_primary_email_second_cleanup_migration.rb b/db/post_migrate/20220318111040_add_indexes_for_primary_email_second_cleanup_migration.rb
new file mode 100644
index 00000000000..5dcb99b36b6
--- /dev/null
+++ b/db/post_migrate/20220318111040_add_indexes_for_primary_email_second_cleanup_migration.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class AddIndexesForPrimaryEmailSecondCleanupMigration < Gitlab::Database::Migration[1.0]
+ USERS_INDEX = :index_users_on_id_for_primary_email_migration
+ EMAIL_INDEX = :index_emails_on_email_user_id
+
+ disable_ddl_transaction!
+
+ def up
+ unless index_exists_by_name?(:users, USERS_INDEX)
+
+ disable_statement_timeout do
+ execute <<~SQL
+ CREATE INDEX CONCURRENTLY #{USERS_INDEX}
+ ON users (id) INCLUDE (email, confirmed_at)
+ WHERE confirmed_at IS NOT NULL
+ SQL
+ end
+ end
+
+ add_concurrent_index :emails, [:email, :user_id], name: EMAIL_INDEX
+ end
+
+ def down
+ remove_concurrent_index_by_name :users, USERS_INDEX
+ remove_concurrent_index_by_name :emails, EMAIL_INDEX
+ end
+end
diff --git a/db/post_migrate/20220318111729_cleanup_after_fixing_issue_when_admin_changed_primary_email.rb b/db/post_migrate/20220318111729_cleanup_after_fixing_issue_when_admin_changed_primary_email.rb
new file mode 100644
index 00000000000..3d29d78573a
--- /dev/null
+++ b/db/post_migrate/20220318111729_cleanup_after_fixing_issue_when_admin_changed_primary_email.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+class CleanupAfterFixingIssueWhenAdminChangedPrimaryEmail < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ BATCH_SIZE = 10_000
+
+ # Stubbed class to access the User table
+ class User < ActiveRecord::Base
+ include ::EachBatch
+
+ self.table_name = 'users'
+ self.inheritance_column = :_type_disabled
+
+ scope :confirmed, -> { where.not(confirmed_at: nil) }
+
+ has_many :emails
+ end
+
+ # Stubbed class to access the Emails table
+ class Email < ActiveRecord::Base
+ self.table_name = 'emails'
+ self.inheritance_column = :_type_disabled
+
+ belongs_to :user
+ end
+
+ def up
+ # Select confirmed users that do not have their primary email in the emails table,
+ # and create the email record.
+ not_exists_condition = 'NOT EXISTS (SELECT 1 FROM emails WHERE emails.email = users.email AND emails.user_id = users.id)'
+
+ User.confirmed.each_batch(of: BATCH_SIZE) do |user_batch|
+ user_batch.select(:id, :email, :confirmed_at).where(not_exists_condition).each do |user|
+ current_time = Time.now.utc
+
+ begin
+ Email.create(
+ user_id: user.id,
+ email: user.email,
+ confirmed_at: user.confirmed_at,
+ created_at: current_time,
+ updated_at: current_time
+ )
+ rescue StandardError => error
+ Gitlab::AppLogger.error("Could not add primary email #{user.email} to emails for user with ID #{user.id} due to #{error}")
+ end
+ end
+ end
+ end
+
+ def down
+ # Intentionally left blank
+ end
+end
diff --git a/db/post_migrate/20220318111949_drop_temporary_indexes_for_primary_email_migration_second_cleanup.rb b/db/post_migrate/20220318111949_drop_temporary_indexes_for_primary_email_migration_second_cleanup.rb
new file mode 100644
index 00000000000..755751aaa1a
--- /dev/null
+++ b/db/post_migrate/20220318111949_drop_temporary_indexes_for_primary_email_migration_second_cleanup.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class DropTemporaryIndexesForPrimaryEmailMigrationSecondCleanup < Gitlab::Database::Migration[1.0]
+ USERS_INDEX = :index_users_on_id_for_primary_email_migration
+ EMAIL_INDEX = :index_emails_on_email_user_id
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :users, USERS_INDEX
+ remove_concurrent_index_by_name :emails, EMAIL_INDEX
+ end
+
+ def down
+ unless index_exists_by_name?(:users, USERS_INDEX)
+
+ disable_statement_timeout do
+ execute <<~SQL
+ CREATE INDEX CONCURRENTLY #{USERS_INDEX}
+ ON users (id) INCLUDE (email, confirmed_at)
+ WHERE confirmed_at IS NOT NULL
+ SQL
+ end
+ end
+
+ add_concurrent_index :emails, [:email, :user_id], name: EMAIL_INDEX
+ end
+end
diff --git a/db/post_migrate/20220321025720_alter_constraint_remote_import_url.rb b/db/post_migrate/20220321025720_alter_constraint_remote_import_url.rb
new file mode 100644
index 00000000000..90cb54cdd44
--- /dev/null
+++ b/db/post_migrate/20220321025720_alter_constraint_remote_import_url.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class AlterConstraintRemoteImportUrl < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ remove_text_limit :import_export_uploads, :remote_import_url
+ add_text_limit :import_export_uploads, :remote_import_url, 2048
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220321201912_remove_user_email_lookup_limit.rb b/db/post_migrate/20220321201912_remove_user_email_lookup_limit.rb
new file mode 100644
index 00000000000..a95534b586e
--- /dev/null
+++ b/db/post_migrate/20220321201912_remove_user_email_lookup_limit.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class RemoveUserEmailLookupLimit < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ remove_column :application_settings, :user_email_lookup_limit
+ end
+
+ def down
+ add_column :application_settings, :user_email_lookup_limit, :integer, null: false, default: 60
+ end
+end
diff --git a/db/post_migrate/20220322023800_add_tmp_index_routes_id_for_project_namespaces.rb b/db/post_migrate/20220322023800_add_tmp_index_routes_id_for_project_namespaces.rb
new file mode 100644
index 00000000000..bc775514b75
--- /dev/null
+++ b/db/post_migrate/20220322023800_add_tmp_index_routes_id_for_project_namespaces.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddTmpIndexRoutesIdForProjectNamespaces < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'tmp_index_for_project_namespace_id_migration_on_routes'
+
+ disable_ddl_transaction!
+
+ def up
+ # Temporary index to be removed in 15.0
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/352353
+ add_concurrent_index :routes, :id, where: "namespace_id IS NULL AND source_type = 'Project'", name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :routes, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220322035654_add_migration_plan_index_to_container_repositories.rb b/db/post_migrate/20220322035654_add_migration_plan_index_to_container_repositories.rb
new file mode 100644
index 00000000000..78e331a8b63
--- /dev/null
+++ b/db/post_migrate/20220322035654_add_migration_plan_index_to_container_repositories.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddMigrationPlanIndexToContainerRepositories < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'idx_container_repos_on_migration_state_migration_plan_created'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :container_repositories,
+ [:migration_state, :migration_plan, :created_at],
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :container_repositories, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220322071127_finalize_project_namespaces_backfill.rb b/db/post_migrate/20220322071127_finalize_project_namespaces_backfill.rb
new file mode 100644
index 00000000000..5a4d14dcfb7
--- /dev/null
+++ b/db/post_migrate/20220322071127_finalize_project_namespaces_backfill.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+# This migration acts as a gate-keeper for other migrations related to project namespace back-filling
+# so that other migrations that depend on project namespace back-filling cannot be run unless project namespace
+# back-filling has finalized successfully.
+class FinalizeProjectNamespacesBackfill < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'ProjectNamespaces::BackfillProjectNamespaces'
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: :projects,
+ column_name: :id,
+ job_arguments: [nil, 'up']
+ )
+ end
+
+ def down
+ # noop
+ end
+end
diff --git a/db/post_migrate/20220322094410_remove_wiki_notes.rb b/db/post_migrate/20220322094410_remove_wiki_notes.rb
new file mode 100644
index 00000000000..c3705e1e20f
--- /dev/null
+++ b/db/post_migrate/20220322094410_remove_wiki_notes.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class RemoveWikiNotes < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ class Note < ApplicationRecord
+ self.table_name = 'notes'
+ self.inheritance_column = :_type_disabled
+ end
+
+ def up
+ return unless Gitlab.dev_or_test_env? || Gitlab.staging? || Gitlab.com?
+
+ Note.where(noteable_type: 'Wiki', id: [97, 98, 110, 242, 272]).delete_all
+ end
+
+ def down
+ # NO-OP
+ end
+end
diff --git a/db/post_migrate/20220322132242_update_pages_onboarding_state.rb b/db/post_migrate/20220322132242_update_pages_onboarding_state.rb
new file mode 100644
index 00000000000..896ab78a266
--- /dev/null
+++ b/db/post_migrate/20220322132242_update_pages_onboarding_state.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+class UpdatePagesOnboardingState < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+ BATCH_SIZE = 75
+
+ def up
+ define_batchable_model(
+ :project_pages_metadata
+ ).where(
+ deployed: true
+ ).each_batch(
+ of: BATCH_SIZE,
+ column: :project_id
+ ) do |batch|
+ batch.update_all(onboarding_complete: true)
+ end
+ end
+
+ def down
+ define_batchable_model(
+ :project_pages_metadata
+ ).where(
+ onboarding_complete: true
+ ).each_batch(
+ of: BATCH_SIZE,
+ column: :project_id
+ ) do |batch|
+ batch.update_all(onboarding_complete: false)
+ end
+ end
+end
diff --git a/db/post_migrate/20220322205008_change_search_rate_limit_values.rb b/db/post_migrate/20220322205008_change_search_rate_limit_values.rb
new file mode 100644
index 00000000000..ed4aad72ddf
--- /dev/null
+++ b/db/post_migrate/20220322205008_change_search_rate_limit_values.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class ChangeSearchRateLimitValues < Gitlab::Database::Migration[1.0]
+ def up
+ # Change search_rate_limits to a more reasonable value
+ # as long as they are still using the default values.
+ #
+ # The reason why `search_rate_limit` could be either 30 or 60
+ # is because its value was ported over from the now deprecated
+ # `user_email_lookup_limit` which had a default value of 60.
+ execute("update application_settings set search_rate_limit=300 where search_rate_limit IN (30,60)")
+ execute("update application_settings set search_rate_limit_unauthenticated=100 where search_rate_limit_unauthenticated = 10")
+ end
+
+ def down
+ # noop. Because this migration is updating values, it is not reversible.
+ end
+end
diff --git a/db/post_migrate/20220323023800_backfill_namespace_id_for_project_routes.rb b/db/post_migrate/20220323023800_backfill_namespace_id_for_project_routes.rb
new file mode 100644
index 00000000000..b938688be2c
--- /dev/null
+++ b/db/post_migrate/20220323023800_backfill_namespace_id_for_project_routes.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class BackfillNamespaceIdForProjectRoutes < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'BackfillNamespaceIdForProjectRoute'
+ INTERVAL = 2.minutes
+ BATCH_SIZE = 1_000
+ MAX_BATCH_SIZE = 10_000
+ SUB_BATCH_SIZE = 200
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :routes,
+ :id,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE,
+ max_batch_size: MAX_BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ Gitlab::Database::BackgroundMigration::BatchedMigration
+ .for_configuration(MIGRATION, :routes, :id, [])
+ .delete_all
+ end
+end
diff --git a/db/post_migrate/20220323130000_add_temp_index_on_null_project_namespace_ids.rb b/db/post_migrate/20220323130000_add_temp_index_on_null_project_namespace_ids.rb
new file mode 100644
index 00000000000..e73993065b0
--- /dev/null
+++ b/db/post_migrate/20220323130000_add_temp_index_on_null_project_namespace_ids.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTempIndexOnNullProjectNamespaceIds < Gitlab::Database::Migration[1.0]
+ TMP_INDEX_FOR_NULL_PROJECT_NAMESPACE_ID = 'tmp_index_for_null_project_namespace_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :projects, :id, name: TMP_INDEX_FOR_NULL_PROJECT_NAMESPACE_ID, where: 'project_namespace_id IS NULL'
+ end
+
+ def down
+ remove_concurrent_index_by_name :projects, name: TMP_INDEX_FOR_NULL_PROJECT_NAMESPACE_ID
+ end
+end
diff --git a/db/post_migrate/20220323152202_add_index_on_visible_deployments.rb b/db/post_migrate/20220323152202_add_index_on_visible_deployments.rb
new file mode 100644
index 00000000000..57ec2f7013d
--- /dev/null
+++ b/db/post_migrate/20220323152202_add_index_on_visible_deployments.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddIndexOnVisibleDeployments < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_deployments_for_visible_scope'
+
+ def up
+ add_concurrent_index :deployments,
+ [:environment_id, :finished_at],
+ order: { finished_at: :desc },
+ where: 'status IN (1, 2, 3, 4, 6)',
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :deployments, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220324032250_migrate_shimo_confluence_service_category.rb b/db/post_migrate/20220324032250_migrate_shimo_confluence_service_category.rb
new file mode 100644
index 00000000000..d341cc50874
--- /dev/null
+++ b/db/post_migrate/20220324032250_migrate_shimo_confluence_service_category.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class MigrateShimoConfluenceServiceCategory < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'MigrateShimoConfluenceIntegrationCategory'
+ DELAY_INTERVAL = 2.minutes
+ BATCH_SIZE = 10_000
+
+ disable_ddl_transaction!
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('integrations').where(type_new: %w[Integrations::Confluence Integrations::Shimo]),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true)
+ end
+
+ def down
+ end
+end
diff --git a/db/post_migrate/20220324081709_fix_and_backfill_project_namespaces_for_projects_with_duplicate_name.rb b/db/post_migrate/20220324081709_fix_and_backfill_project_namespaces_for_projects_with_duplicate_name.rb
new file mode 100644
index 00000000000..f5927a2cc16
--- /dev/null
+++ b/db/post_migrate/20220324081709_fix_and_backfill_project_namespaces_for_projects_with_duplicate_name.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class FixAndBackfillProjectNamespacesForProjectsWithDuplicateName < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'FixDuplicateProjectNameAndPath'
+ DELAY_INTERVAL = 2.minutes
+ BATCH_SIZE = 1000
+
+ class Project < ActiveRecord::Base
+ include ::EachBatch
+
+ self.table_name = 'projects'
+
+ scope :without_project_namespace, -> { where(project_namespace_id: nil) }
+ end
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ Project.without_project_namespace, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE, track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220324110247_untrack_deletions_on_ci_job_artifacts.rb b/db/post_migrate/20220324110247_untrack_deletions_on_ci_job_artifacts.rb
new file mode 100644
index 00000000000..d178c235e21
--- /dev/null
+++ b/db/post_migrate/20220324110247_untrack_deletions_on_ci_job_artifacts.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class UntrackDeletionsOnCiJobArtifacts < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ untrack_record_deletions(:ci_job_artifacts)
+ end
+
+ def down
+ track_record_deletions(:ci_job_artifacts)
+ end
+end
diff --git a/db/post_migrate/20220324180717_remove_project_pages_metadata_artifacts_archive_id_column.rb b/db/post_migrate/20220324180717_remove_project_pages_metadata_artifacts_archive_id_column.rb
new file mode 100644
index 00000000000..287752b6b5c
--- /dev/null
+++ b/db/post_migrate/20220324180717_remove_project_pages_metadata_artifacts_archive_id_column.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class RemoveProjectPagesMetadataArtifactsArchiveIdColumn < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ remove_column :project_pages_metadata, :artifacts_archive_id
+ end
+
+ def down
+ unless column_exists?(:project_pages_metadata, :artifacts_archive_id)
+ add_column :project_pages_metadata, :artifacts_archive_id, :bigint
+ end
+
+ add_concurrent_index(
+ :project_pages_metadata,
+ :artifacts_archive_id,
+ name: "index_project_pages_metadata_on_artifacts_archive_id"
+ )
+ end
+end
diff --git a/db/post_migrate/20220325000000_prepare_index_for_ci_job_artifacts_unlocked_with_expire_at.rb b/db/post_migrate/20220325000000_prepare_index_for_ci_job_artifacts_unlocked_with_expire_at.rb
new file mode 100644
index 00000000000..fa43f3b7f59
--- /dev/null
+++ b/db/post_migrate/20220325000000_prepare_index_for_ci_job_artifacts_unlocked_with_expire_at.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class PrepareIndexForCiJobArtifactsUnlockedWithExpireAt < Gitlab::Database::Migration[1.0]
+ TABLE_NAME = 'ci_job_artifacts'
+ INDEX_NAME = 'index_ci_job_artifacts_on_expire_at_for_removal'
+ CONDITIONS = 'locked = 0 AND expire_at IS NOT NULL'
+
+ def up
+ prepare_async_index TABLE_NAME, [:expire_at], where: CONDITIONS, name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index_by_name TABLE_NAME, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220325000001_finalize_index_for_ci_job_artifacts_unlocked_with_expire_at.rb b/db/post_migrate/20220325000001_finalize_index_for_ci_job_artifacts_unlocked_with_expire_at.rb
new file mode 100644
index 00000000000..d0fe7ceb34f
--- /dev/null
+++ b/db/post_migrate/20220325000001_finalize_index_for_ci_job_artifacts_unlocked_with_expire_at.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class FinalizeIndexForCiJobArtifactsUnlockedWithExpireAt < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ TABLE_NAME = 'ci_job_artifacts'
+ INDEX_NAME = 'index_ci_job_artifacts_on_expire_at_for_removal'
+ CONDITIONS = 'locked = 0 AND expire_at IS NOT NULL'
+
+ def up
+ add_concurrent_index TABLE_NAME, [:expire_at], where: CONDITIONS, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name TABLE_NAME, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220325050642_drop_integrations_template_column.rb b/db/post_migrate/20220325050642_drop_integrations_template_column.rb
new file mode 100644
index 00000000000..e110c307a38
--- /dev/null
+++ b/db/post_migrate/20220325050642_drop_integrations_template_column.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class DropIntegrationsTemplateColumn < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ remove_column :integrations, :template, :boolean, default: false
+ end
+end
diff --git a/db/post_migrate/20220325155953_steal_background_job_for_fixing_conflicting_project_names_and_paths.rb b/db/post_migrate/20220325155953_steal_background_job_for_fixing_conflicting_project_names_and_paths.rb
new file mode 100644
index 00000000000..4c4c29e2b7c
--- /dev/null
+++ b/db/post_migrate/20220325155953_steal_background_job_for_fixing_conflicting_project_names_and_paths.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class StealBackgroundJobForFixingConflictingProjectNamesAndPaths < Gitlab::Database::Migration[1.0]
+ def up
+ Gitlab::BackgroundMigration.steal('FixDuplicateProjectNameAndPath')
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220325160153_create_unique_index_on_projects_name_and_namespace_id.rb b/db/post_migrate/20220325160153_create_unique_index_on_projects_name_and_namespace_id.rb
new file mode 100644
index 00000000000..d1cefa76cec
--- /dev/null
+++ b/db/post_migrate/20220325160153_create_unique_index_on_projects_name_and_namespace_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CreateUniqueIndexOnProjectsNameAndNamespaceId < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'unique_projects_on_name_namespace_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :projects, [:name, :namespace_id], unique: true, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :projects, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220326161803_add_cascade_delete_fk_on_project_namespace_id.rb b/db/post_migrate/20220326161803_add_cascade_delete_fk_on_project_namespace_id.rb
new file mode 100644
index 00000000000..005532c53d9
--- /dev/null
+++ b/db/post_migrate/20220326161803_add_cascade_delete_fk_on_project_namespace_id.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+class AddCascadeDeleteFkOnProjectNamespaceId < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ TARGET_COLUMN = :project_namespace_id
+
+ def up
+ # add the new FK before removing the old one
+ add_concurrent_foreign_key(
+ :projects,
+ :namespaces,
+ column: TARGET_COLUMN,
+ name: fk_name("#{TARGET_COLUMN}_new"),
+ on_delete: :cascade
+ )
+
+ with_lock_retries do
+ remove_foreign_key_if_exists(:projects, column: TARGET_COLUMN, name: fk_name(TARGET_COLUMN))
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key(
+ :projects,
+ :namespaces,
+ column: TARGET_COLUMN,
+ name: fk_name(TARGET_COLUMN),
+ on_delete: :nullify
+ )
+
+ with_lock_retries do
+ remove_foreign_key_if_exists(:projects, column: TARGET_COLUMN, name: fk_name("#{TARGET_COLUMN}_new"))
+ end
+ end
+
+ def fk_name(column_name)
+ # generate a FK name
+ concurrent_foreign_key_name(:projects, column_name)
+ end
+end
diff --git a/db/post_migrate/20220326163653_add_not_null_contraint_to_project_namespace_id.rb b/db/post_migrate/20220326163653_add_not_null_contraint_to_project_namespace_id.rb
new file mode 100644
index 00000000000..2273b84d003
--- /dev/null
+++ b/db/post_migrate/20220326163653_add_not_null_contraint_to_project_namespace_id.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddNotNullContraintToProjectNamespaceId < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_not_null_constraint :projects, :project_namespace_id, validate: false
+ end
+
+ def down
+ remove_not_null_constraint :projects, :project_namespace_id
+ end
+end
diff --git a/db/post_migrate/20220329175119_remove_leftover_ci_job_artifact_deletions.rb b/db/post_migrate/20220329175119_remove_leftover_ci_job_artifact_deletions.rb
new file mode 100644
index 00000000000..f0c09598bfb
--- /dev/null
+++ b/db/post_migrate/20220329175119_remove_leftover_ci_job_artifact_deletions.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class RemoveLeftoverCiJobArtifactDeletions < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ # Delete all pending record deletions in the public.ci_job_artifacts until
+ # there are no more rows left.
+ loop do
+ result = execute <<~SQL
+ DELETE FROM "loose_foreign_keys_deleted_records"
+ WHERE
+ ("loose_foreign_keys_deleted_records"."partition", "loose_foreign_keys_deleted_records"."id") IN (
+ SELECT "loose_foreign_keys_deleted_records"."partition", "loose_foreign_keys_deleted_records"."id"
+ FROM "loose_foreign_keys_deleted_records"
+ WHERE
+ "loose_foreign_keys_deleted_records"."fully_qualified_table_name" = 'public.ci_job_artifacts' AND
+ "loose_foreign_keys_deleted_records"."status" = 1
+ LIMIT 100
+ )
+ SQL
+
+ break if result.cmd_tuples == 0
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220331074722_add_notes_null_discussion_id_temp_index_async.rb b/db/post_migrate/20220331074722_add_notes_null_discussion_id_temp_index_async.rb
new file mode 100644
index 00000000000..9f52308935b
--- /dev/null
+++ b/db/post_migrate/20220331074722_add_notes_null_discussion_id_temp_index_async.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class AddNotesNullDiscussionIdTempIndexAsync < Gitlab::Database::Migration[1.0]
+ # Temporary index to be removed in 15.0 https://gitlab.com/gitlab-org/gitlab/-/issues/357581
+ INDEX_NAME = 'tmp_index_notes_on_id_where_discussion_id_is_null'
+
+ def up
+ prepare_async_index :notes, :id, where: 'discussion_id IS NULL', name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index_by_name :notes, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220401045621_remove_state_index_on_merge_request_assignees.rb b/db/post_migrate/20220401045621_remove_state_index_on_merge_request_assignees.rb
new file mode 100644
index 00000000000..ff62a1c646d
--- /dev/null
+++ b/db/post_migrate/20220401045621_remove_state_index_on_merge_request_assignees.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveStateIndexOnMergeRequestAssignees < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_on_merge_request_assignees_state'
+
+ def up
+ remove_concurrent_index_by_name :merge_request_assignees, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :merge_request_assignees, :state, where: 'state = 2', name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220401045642_remove_state_index_on_merge_request_reviewers.rb b/db/post_migrate/20220401045642_remove_state_index_on_merge_request_reviewers.rb
new file mode 100644
index 00000000000..ef59d9fcc25
--- /dev/null
+++ b/db/post_migrate/20220401045642_remove_state_index_on_merge_request_reviewers.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveStateIndexOnMergeRequestReviewers < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_on_merge_request_reviewers_state'
+
+ def up
+ remove_concurrent_index_by_name :merge_request_reviewers, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :merge_request_reviewers, :state, where: 'state = 2', name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220404183350_add_forbidden_state_index_to_users.rb b/db/post_migrate/20220404183350_add_forbidden_state_index_to_users.rb
new file mode 100644
index 00000000000..7ae61a60b73
--- /dev/null
+++ b/db/post_migrate/20220404183350_add_forbidden_state_index_to_users.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddForbiddenStateIndexToUsers < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'users_forbidden_state_idx'
+
+ def up
+ add_concurrent_index :users, :id,
+ name: INDEX_NAME,
+ where: "confirmed_at IS NOT NULL AND (state <> ALL (ARRAY['blocked', 'banned', 'ldap_blocked']))"
+ end
+
+ def down
+ remove_concurrent_index_by_name :users, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220404184814_drop_broader_expired_artifact_index.rb b/db/post_migrate/20220404184814_drop_broader_expired_artifact_index.rb
new file mode 100644
index 00000000000..b6327b89c11
--- /dev/null
+++ b/db/post_migrate/20220404184814_drop_broader_expired_artifact_index.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class DropBroaderExpiredArtifactIndex < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ TABLE_NAME = 'ci_job_artifacts'
+ INDEX_NAME = 'ci_job_artifacts_expire_at_unlocked_idx'
+
+ def up
+ remove_concurrent_index_by_name TABLE_NAME, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index TABLE_NAME, [:expire_at], where: 'locked = 0', name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220404194649_replace_work_item_type_backfill_next_batch_strategy.rb b/db/post_migrate/20220404194649_replace_work_item_type_backfill_next_batch_strategy.rb
new file mode 100644
index 00000000000..1f2c0715f04
--- /dev/null
+++ b/db/post_migrate/20220404194649_replace_work_item_type_backfill_next_batch_strategy.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class ReplaceWorkItemTypeBackfillNextBatchStrategy < Gitlab::Database::Migration[1.0]
+ JOB_CLASS_NAME = 'BackfillWorkItemTypeIdForIssues'
+ NEW_STRATEGY_CLASS = 'BackfillIssueWorkItemTypeBatchingStrategy'
+ OLD_STRATEGY_CLASS = 'PrimaryKeyBatchingStrategy'
+
+ class InlineBatchedMigration < ApplicationRecord
+ self.table_name = :batched_background_migrations
+ end
+
+ def up
+ InlineBatchedMigration.where(job_class_name: JOB_CLASS_NAME)
+ .update_all(batch_class_name: NEW_STRATEGY_CLASS)
+ end
+
+ def down
+ InlineBatchedMigration.where(job_class_name: JOB_CLASS_NAME)
+ .update_all(batch_class_name: OLD_STRATEGY_CLASS)
+ end
+end
diff --git a/db/post_migrate/20220409160628_add_async_index_for_events_followed_users.rb b/db/post_migrate/20220409160628_add_async_index_for_events_followed_users.rb
new file mode 100644
index 00000000000..fb858248b19
--- /dev/null
+++ b/db/post_migrate/20220409160628_add_async_index_for_events_followed_users.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddAsyncIndexForEventsFollowedUsers < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_events_for_followed_users'
+
+ def up
+ prepare_async_index :events, %I[author_id target_type action id], name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index :events, %I[author_id target_type action id], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb b/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb
new file mode 100644
index 00000000000..f2aa9c0b717
--- /dev/null
+++ b/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class FinalizeTraversalIdsBackgroundMigrations < Gitlab::Database::Migration[1.0]
+ def up
+ finalize_background_migration('BackfillNamespaceTraversalIdsRoots')
+ finalize_background_migration('BackfillNamespaceTraversalIdsChildren')
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220412143551_add_partial_index_on_unencrypted_integrations.rb b/db/post_migrate/20220412143551_add_partial_index_on_unencrypted_integrations.rb
new file mode 100644
index 00000000000..0f5415d6bf5
--- /dev/null
+++ b/db/post_migrate/20220412143551_add_partial_index_on_unencrypted_integrations.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+#
+class AddPartialIndexOnUnencryptedIntegrations < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_integrations_on_id_where_not_encrypted'
+ INDEX_FILTER_CONDITION = 'properties IS NOT NULL AND encrypted_properties IS NULL'
+
+ def up
+ add_concurrent_index :integrations, [:id],
+ where: INDEX_FILTER_CONDITION,
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :integrations, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220412143552_consume_remaining_encrypt_integration_property_jobs.rb b/db/post_migrate/20220412143552_consume_remaining_encrypt_integration_property_jobs.rb
new file mode 100644
index 00000000000..69850b3a32f
--- /dev/null
+++ b/db/post_migrate/20220412143552_consume_remaining_encrypt_integration_property_jobs.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class ConsumeRemainingEncryptIntegrationPropertyJobs < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ BATCH_SIZE = 50
+
+ def up
+ Gitlab::BackgroundMigration.steal('EncryptIntegrationProperties')
+
+ model = define_batchable_model('integrations')
+ relation = model.where.not(properties: nil).where(encrypted_properties: nil)
+
+ relation.each_batch(of: BATCH_SIZE) do |batch|
+ range = batch.pluck('MIN(id)', 'MAX(id)').first
+
+ Gitlab::BackgroundMigration::EncryptIntegrationProperties.new.perform(*range)
+ end
+ end
+
+ def down
+ end
+end
diff --git a/db/post_migrate/20220413011328_remove_partial_index_on_unencrypted_integrations.rb b/db/post_migrate/20220413011328_remove_partial_index_on_unencrypted_integrations.rb
new file mode 100644
index 00000000000..873080144ab
--- /dev/null
+++ b/db/post_migrate/20220413011328_remove_partial_index_on_unencrypted_integrations.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+#
+# The inverse of 20220412143551_add_partial_index_on_unencrypted_integrations.rb
+class RemovePartialIndexOnUnencryptedIntegrations < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_integrations_on_id_where_not_encrypted'
+ INDEX_FILTER_CONDITION = 'properties IS NOT NULL AND encrypted_properties IS NULL'
+
+ def down
+ add_concurrent_index :integrations, [:id],
+ where: INDEX_FILTER_CONDITION,
+ name: INDEX_NAME
+ end
+
+ def up
+ remove_concurrent_index_by_name :integrations, INDEX_NAME
+ end
+end
diff --git a/db/schema_migrations/20220113164801 b/db/schema_migrations/20220113164801
new file mode 100644
index 00000000000..8354489ac31
--- /dev/null
+++ b/db/schema_migrations/20220113164801
@@ -0,0 +1 @@
+71526ea198c64d23a35f06804f30068591e937df22d74c262fdec9ecf04bf7d4 \ No newline at end of file
diff --git a/db/schema_migrations/20220113164901 b/db/schema_migrations/20220113164901
new file mode 100644
index 00000000000..977ec8bb51b
--- /dev/null
+++ b/db/schema_migrations/20220113164901
@@ -0,0 +1 @@
+b157cec5eab77665ae57f02647c39dc0fb167d78e1894b395c46f59d791ab3e0 \ No newline at end of file
diff --git a/db/schema_migrations/20220120160625 b/db/schema_migrations/20220120160625
new file mode 100644
index 00000000000..287e364d331
--- /dev/null
+++ b/db/schema_migrations/20220120160625
@@ -0,0 +1 @@
+92485ceb25d5733efe9a35a5bd64c9f33253bb10f815590518c6fc8d1c9e5f39 \ No newline at end of file
diff --git a/db/schema_migrations/20220204095121 b/db/schema_migrations/20220204095121
new file mode 100644
index 00000000000..bf12ca08f5a
--- /dev/null
+++ b/db/schema_migrations/20220204095121
@@ -0,0 +1 @@
+bce595c1c6587e785bc49d6e5a7181b5cc0164f2201375ad82d4bd19c217cd35 \ No newline at end of file
diff --git a/db/schema_migrations/20220223124428 b/db/schema_migrations/20220223124428
new file mode 100644
index 00000000000..b163accc957
--- /dev/null
+++ b/db/schema_migrations/20220223124428
@@ -0,0 +1 @@
+8fb72b15bfaa1b58f87cb3f1836df1e8bfa1a5ddec4e480a2cb6a3c9fafe3bda \ No newline at end of file
diff --git a/db/schema_migrations/20220302110724 b/db/schema_migrations/20220302110724
new file mode 100644
index 00000000000..700a39b85c5
--- /dev/null
+++ b/db/schema_migrations/20220302110724
@@ -0,0 +1 @@
+4f565a313c37d12f24afe26a9e344d4273c54d0f080b3108d56ed98bf7299ecc \ No newline at end of file
diff --git a/db/schema_migrations/20220302114046 b/db/schema_migrations/20220302114046
new file mode 100644
index 00000000000..40488b47eb2
--- /dev/null
+++ b/db/schema_migrations/20220302114046
@@ -0,0 +1 @@
+4e2de14559b47a9bf3fa8910fdb84ff62cb18442620f4147e40e8026bf4bcf1b \ No newline at end of file
diff --git a/db/schema_migrations/20220310011530 b/db/schema_migrations/20220310011530
new file mode 100644
index 00000000000..73fa8390231
--- /dev/null
+++ b/db/schema_migrations/20220310011530
@@ -0,0 +1 @@
+a4245a3543796b48f16786e9c178f70d236b3ae4636661f021ad4e8f0c678f2c \ No newline at end of file
diff --git a/db/schema_migrations/20220310011613 b/db/schema_migrations/20220310011613
new file mode 100644
index 00000000000..fc62a04f551
--- /dev/null
+++ b/db/schema_migrations/20220310011613
@@ -0,0 +1 @@
+ef816d9391d67a34121d11e6b6cc37de92768bd21bc301fa10c6652b1a0b66b6 \ No newline at end of file
diff --git a/db/schema_migrations/20220311010352 b/db/schema_migrations/20220311010352
new file mode 100644
index 00000000000..f9f4cf28605
--- /dev/null
+++ b/db/schema_migrations/20220311010352
@@ -0,0 +1 @@
+1d1682cb14041f14f691fcf880e6446ae464645a5ccbd36687620c3279f53e25 \ No newline at end of file
diff --git a/db/schema_migrations/20220314184009 b/db/schema_migrations/20220314184009
new file mode 100644
index 00000000000..1e00cd48937
--- /dev/null
+++ b/db/schema_migrations/20220314184009
@@ -0,0 +1 @@
+258c7a3409aea1c713c2ddd6679de586e7548ce4d7c0811db1d4903f2794c660 \ No newline at end of file
diff --git a/db/schema_migrations/20220314184109 b/db/schema_migrations/20220314184109
new file mode 100644
index 00000000000..60fefe61de5
--- /dev/null
+++ b/db/schema_migrations/20220314184109
@@ -0,0 +1 @@
+85be80bb8c929d017fedfe66c1f18e4a0dbd7dd8f3b683ded60213e621ec06f4 \ No newline at end of file
diff --git a/db/schema_migrations/20220314184209 b/db/schema_migrations/20220314184209
new file mode 100644
index 00000000000..dfe5e7b5888
--- /dev/null
+++ b/db/schema_migrations/20220314184209
@@ -0,0 +1 @@
+41e7a36164fe3b1b582149d9cfbefc6ee2ce804ac85207f918c064b0ef738b53 \ No newline at end of file
diff --git a/db/schema_migrations/20220314194009 b/db/schema_migrations/20220314194009
new file mode 100644
index 00000000000..e836855b8eb
--- /dev/null
+++ b/db/schema_migrations/20220314194009
@@ -0,0 +1 @@
+e58b89906cd09577c1a773768e4cf3f97b870744e4ee6a323e0276895dff0de5 \ No newline at end of file
diff --git a/db/schema_migrations/20220314204009 b/db/schema_migrations/20220314204009
new file mode 100644
index 00000000000..ac1effdd471
--- /dev/null
+++ b/db/schema_migrations/20220314204009
@@ -0,0 +1 @@
+e2fa0265f3c14c8e6f08a4ffc4b682d8805fa634bac66c578684faaee97541cf \ No newline at end of file
diff --git a/db/schema_migrations/20220315171027 b/db/schema_migrations/20220315171027
new file mode 100644
index 00000000000..7a4c65f3b7f
--- /dev/null
+++ b/db/schema_migrations/20220315171027
@@ -0,0 +1 @@
+4c329622299c76ca753381f1ccc0686714d07eeee8acfc834e576d5a5addaafc \ No newline at end of file
diff --git a/db/schema_migrations/20220315171129 b/db/schema_migrations/20220315171129
new file mode 100644
index 00000000000..1f558096664
--- /dev/null
+++ b/db/schema_migrations/20220315171129
@@ -0,0 +1 @@
+7ca832e710026c0721ecdcd50b477073aeaf7cb795c50acd604897f85707b163 \ No newline at end of file
diff --git a/db/schema_migrations/20220315181125 b/db/schema_migrations/20220315181125
new file mode 100644
index 00000000000..93557df54c1
--- /dev/null
+++ b/db/schema_migrations/20220315181125
@@ -0,0 +1 @@
+1276e86db3e2922cd1535e98f17768d1ab0dd653317f918fb8e6819760893a47 \ No newline at end of file
diff --git a/db/schema_migrations/20220315181130 b/db/schema_migrations/20220315181130
new file mode 100644
index 00000000000..17c3ceaba52
--- /dev/null
+++ b/db/schema_migrations/20220315181130
@@ -0,0 +1 @@
+8ab13f76037450704a29220ca6af0174b373ce743620952e3bc197c952d00c1d \ No newline at end of file
diff --git a/db/schema_migrations/20220315181136 b/db/schema_migrations/20220315181136
new file mode 100644
index 00000000000..4dfb1b1a63e
--- /dev/null
+++ b/db/schema_migrations/20220315181136
@@ -0,0 +1 @@
+7dc3d314e76f26a539c0aa009bd45ea6ccc9c6108f798728909fd4b18e3c31b9 \ No newline at end of file
diff --git a/db/schema_migrations/20220315211043 b/db/schema_migrations/20220315211043
new file mode 100644
index 00000000000..6fd80db768e
--- /dev/null
+++ b/db/schema_migrations/20220315211043
@@ -0,0 +1 @@
+ae734a1ae3555a237e427dbcc0ace6c461c50cf98bc1076ca59c90b603b88c29 \ No newline at end of file
diff --git a/db/schema_migrations/20220316095126 b/db/schema_migrations/20220316095126
new file mode 100644
index 00000000000..7530bc25a82
--- /dev/null
+++ b/db/schema_migrations/20220316095126
@@ -0,0 +1 @@
+b2da8b0f113470d3836a361b61dc4e71b0031779b8d05af52e488bed076ebb1d \ No newline at end of file
diff --git a/db/schema_migrations/20220316102900 b/db/schema_migrations/20220316102900
new file mode 100644
index 00000000000..877513ccf40
--- /dev/null
+++ b/db/schema_migrations/20220316102900
@@ -0,0 +1 @@
+13acd0a862301cb5be7b9faacc02688f15e6253543fa7400c2d5f807bc254a25 \ No newline at end of file
diff --git a/db/schema_migrations/20220316102902 b/db/schema_migrations/20220316102902
new file mode 100644
index 00000000000..56082f978d9
--- /dev/null
+++ b/db/schema_migrations/20220316102902
@@ -0,0 +1 @@
+43afb0103ee0069087d6476f5c0f617db5fdb2de3cd583762967e43d5a3a1138 \ No newline at end of file
diff --git a/db/schema_migrations/20220316112118 b/db/schema_migrations/20220316112118
new file mode 100644
index 00000000000..da38f5f9fef
--- /dev/null
+++ b/db/schema_migrations/20220316112118
@@ -0,0 +1 @@
+659accb8efe0223028a74346ecf3aa5b649cda825ac7941bc932bc1d7e6f8d9a \ No newline at end of file
diff --git a/db/schema_migrations/20220316112206 b/db/schema_migrations/20220316112206
new file mode 100644
index 00000000000..5605ebf34b9
--- /dev/null
+++ b/db/schema_migrations/20220316112206
@@ -0,0 +1 @@
+d24c5a5414e44385a132e8f342cb67cc5a7c5fe4bfcc4c15c473397076350bc2 \ No newline at end of file
diff --git a/db/schema_migrations/20220316165539 b/db/schema_migrations/20220316165539
new file mode 100644
index 00000000000..a4a94a4c957
--- /dev/null
+++ b/db/schema_migrations/20220316165539
@@ -0,0 +1 @@
+beeab3a2197f11a40049e983a5184ab9b80370c9867461239e12a5ce36b8f5e8 \ No newline at end of file
diff --git a/db/schema_migrations/20220316202200 b/db/schema_migrations/20220316202200
new file mode 100644
index 00000000000..62c236a6b67
--- /dev/null
+++ b/db/schema_migrations/20220316202200
@@ -0,0 +1 @@
+28722182d4ead079c8c0c36a5c075a29c5da93b4315af277311f561fc945d65f \ No newline at end of file
diff --git a/db/schema_migrations/20220316202402 b/db/schema_migrations/20220316202402
new file mode 100644
index 00000000000..b450772ac80
--- /dev/null
+++ b/db/schema_migrations/20220316202402
@@ -0,0 +1 @@
+006ef4f0c63e39e3874d39528ca6cfd233c17d6256d07bd2c0e7b2262d0a4825 \ No newline at end of file
diff --git a/db/schema_migrations/20220316202640 b/db/schema_migrations/20220316202640
new file mode 100644
index 00000000000..dad19b94335
--- /dev/null
+++ b/db/schema_migrations/20220316202640
@@ -0,0 +1 @@
+7ea2288c45d497e2fde56b1d7c1e82360ed40442a2501a24e9795380adf5b911 \ No newline at end of file
diff --git a/db/schema_migrations/20220317161914 b/db/schema_migrations/20220317161914
new file mode 100644
index 00000000000..7cefac33187
--- /dev/null
+++ b/db/schema_migrations/20220317161914
@@ -0,0 +1 @@
+94a8bc74fc935ba863d22b59b0ac6808bf5a9714c3759ca75a6dbee50c3c647d \ No newline at end of file
diff --git a/db/schema_migrations/20220317170122 b/db/schema_migrations/20220317170122
new file mode 100644
index 00000000000..9b75fa2042a
--- /dev/null
+++ b/db/schema_migrations/20220317170122
@@ -0,0 +1 @@
+0bd78ce207cca13b5c4557ace87c135972ed69cd05ee8c6fcc60a9c060ba8b5f \ No newline at end of file
diff --git a/db/schema_migrations/20220318111040 b/db/schema_migrations/20220318111040
new file mode 100644
index 00000000000..ac1207e7f00
--- /dev/null
+++ b/db/schema_migrations/20220318111040
@@ -0,0 +1 @@
+5da6020c9e4cca8659b45393812ee4d76f6e9422803acaadd8c1b046be8c647a \ No newline at end of file
diff --git a/db/schema_migrations/20220318111729 b/db/schema_migrations/20220318111729
new file mode 100644
index 00000000000..587a1bb6f19
--- /dev/null
+++ b/db/schema_migrations/20220318111729
@@ -0,0 +1 @@
+748ab129352d12d40e5d97dfb8a658ff2d62642e9f5cb1deb19ed871328f9d07 \ No newline at end of file
diff --git a/db/schema_migrations/20220318111949 b/db/schema_migrations/20220318111949
new file mode 100644
index 00000000000..8923f51813e
--- /dev/null
+++ b/db/schema_migrations/20220318111949
@@ -0,0 +1 @@
+416ff5e57b2b13ccb55c6f1e88e6b0603dfc086a8a15be810752a9449ed4f3a1 \ No newline at end of file
diff --git a/db/schema_migrations/20220318120802 b/db/schema_migrations/20220318120802
new file mode 100644
index 00000000000..a306b3cdcd7
--- /dev/null
+++ b/db/schema_migrations/20220318120802
@@ -0,0 +1 @@
+19f25b2f373e7c2799812661baca1902c9c74df67f7a5e88116862fb078a5957 \ No newline at end of file
diff --git a/db/schema_migrations/20220318141037 b/db/schema_migrations/20220318141037
new file mode 100644
index 00000000000..e2451a42392
--- /dev/null
+++ b/db/schema_migrations/20220318141037
@@ -0,0 +1 @@
+d9a9d143ff553cbad5eb32a908370133549850f10b27b30eb6a1bde686054c45 \ No newline at end of file
diff --git a/db/schema_migrations/20220321025720 b/db/schema_migrations/20220321025720
new file mode 100644
index 00000000000..4180969ecf4
--- /dev/null
+++ b/db/schema_migrations/20220321025720
@@ -0,0 +1 @@
+b1d67334e1e52a24b3ea45d1520878dac7ea6dd7fba61d966e4311212993ee77 \ No newline at end of file
diff --git a/db/schema_migrations/20220321150028 b/db/schema_migrations/20220321150028
new file mode 100644
index 00000000000..c041b880941
--- /dev/null
+++ b/db/schema_migrations/20220321150028
@@ -0,0 +1 @@
+0e8c43f8878152e355a435dc0c72874b9808aba376e6969bec85a33ec5c01b1c \ No newline at end of file
diff --git a/db/schema_migrations/20220321201912 b/db/schema_migrations/20220321201912
new file mode 100644
index 00000000000..78d3857dba8
--- /dev/null
+++ b/db/schema_migrations/20220321201912
@@ -0,0 +1 @@
+b9460a2962364ae836237382b84257f30673ffbe682a58776d6aaeab8f28f67d \ No newline at end of file
diff --git a/db/schema_migrations/20220321234317 b/db/schema_migrations/20220321234317
new file mode 100644
index 00000000000..7b24f81ca1c
--- /dev/null
+++ b/db/schema_migrations/20220321234317
@@ -0,0 +1 @@
+ba5c1738b7c368ee8e10e390c959538c4d74055b8bc57f652b06ffe3a1c3becf \ No newline at end of file
diff --git a/db/schema_migrations/20220322023800 b/db/schema_migrations/20220322023800
new file mode 100644
index 00000000000..99e5cbfa7c3
--- /dev/null
+++ b/db/schema_migrations/20220322023800
@@ -0,0 +1 @@
+1aefb5950063a060de1ec20b0808a5488b238b36d86120c34ac5a128c212984e \ No newline at end of file
diff --git a/db/schema_migrations/20220322035654 b/db/schema_migrations/20220322035654
new file mode 100644
index 00000000000..3a427590546
--- /dev/null
+++ b/db/schema_migrations/20220322035654
@@ -0,0 +1 @@
+b37315953ac3cdc6d75f5287a4c264ebdee932f19cfe975f5d2c57b353da35d9 \ No newline at end of file
diff --git a/db/schema_migrations/20220322071127 b/db/schema_migrations/20220322071127
new file mode 100644
index 00000000000..0f7ddb48545
--- /dev/null
+++ b/db/schema_migrations/20220322071127
@@ -0,0 +1 @@
+c7d84b6d92566d66f69732071fe7fc6c4e5ce32475e0d2c42413c9f005aed5b0 \ No newline at end of file
diff --git a/db/schema_migrations/20220322094410 b/db/schema_migrations/20220322094410
new file mode 100644
index 00000000000..1ad1682e22c
--- /dev/null
+++ b/db/schema_migrations/20220322094410
@@ -0,0 +1 @@
+09722b398f82651c433f6b05962827351e6e7c0841f2a6414feb206bb831e523 \ No newline at end of file
diff --git a/db/schema_migrations/20220322132242 b/db/schema_migrations/20220322132242
new file mode 100644
index 00000000000..f21f62874a7
--- /dev/null
+++ b/db/schema_migrations/20220322132242
@@ -0,0 +1 @@
+94dbae9bbfb2da49a0d20b674e15f457c613c8ba0612603dd8fe9ac5699160d1 \ No newline at end of file
diff --git a/db/schema_migrations/20220322143441 b/db/schema_migrations/20220322143441
new file mode 100644
index 00000000000..21176059ea3
--- /dev/null
+++ b/db/schema_migrations/20220322143441
@@ -0,0 +1 @@
+caf0959c3cefb1a3614867feb2c93115fc2b41890624afa0944dc9cfbfdecd59 \ No newline at end of file
diff --git a/db/schema_migrations/20220322205004 b/db/schema_migrations/20220322205004
new file mode 100644
index 00000000000..3a5e26a69ce
--- /dev/null
+++ b/db/schema_migrations/20220322205004
@@ -0,0 +1 @@
+af69da66a3deb250494204fecf4bc91b4fd10f529ab766746ae98072f54bf245 \ No newline at end of file
diff --git a/db/schema_migrations/20220322205008 b/db/schema_migrations/20220322205008
new file mode 100644
index 00000000000..bbd0003fbf3
--- /dev/null
+++ b/db/schema_migrations/20220322205008
@@ -0,0 +1 @@
+465de916b1c951287a101da37156fb0f59a4bd1cb4ab7076dc48e07e326fa4e4 \ No newline at end of file
diff --git a/db/schema_migrations/20220323023800 b/db/schema_migrations/20220323023800
new file mode 100644
index 00000000000..ff735118ede
--- /dev/null
+++ b/db/schema_migrations/20220323023800
@@ -0,0 +1 @@
+1681c19d1f41a05c3dfeded70d128989afb4a81a2e04aacc8879c2c1ab766733 \ No newline at end of file
diff --git a/db/schema_migrations/20220323130000 b/db/schema_migrations/20220323130000
new file mode 100644
index 00000000000..a370ab82750
--- /dev/null
+++ b/db/schema_migrations/20220323130000
@@ -0,0 +1 @@
+6152ff1a3647e1ac26e8f462215a0dec7d96c5552373f4ad99424c7c74e80577 \ No newline at end of file
diff --git a/db/schema_migrations/20220323152202 b/db/schema_migrations/20220323152202
new file mode 100644
index 00000000000..0394218868d
--- /dev/null
+++ b/db/schema_migrations/20220323152202
@@ -0,0 +1 @@
+47b87d4ea5d081904d561e461a266fe20dfcc1f771126340cf14c84302d3383d \ No newline at end of file
diff --git a/db/schema_migrations/20220324032250 b/db/schema_migrations/20220324032250
new file mode 100644
index 00000000000..ef37a8ff223
--- /dev/null
+++ b/db/schema_migrations/20220324032250
@@ -0,0 +1 @@
+fcfead40cfa1d75303bd0d392c09b5b0399ce5163e7ad6f8650360fe3adbe85d \ No newline at end of file
diff --git a/db/schema_migrations/20220324081709 b/db/schema_migrations/20220324081709
new file mode 100644
index 00000000000..f34f2b7aaaa
--- /dev/null
+++ b/db/schema_migrations/20220324081709
@@ -0,0 +1 @@
+6ce75a41607ed1e60ea4ecdfb36703d9f4192dc26ecaa774f2c30818027dd1d7 \ No newline at end of file
diff --git a/db/schema_migrations/20220324110247 b/db/schema_migrations/20220324110247
new file mode 100644
index 00000000000..0bfc9ff4e4e
--- /dev/null
+++ b/db/schema_migrations/20220324110247
@@ -0,0 +1 @@
+35aaf03898795800027c814a6f907af6f011bd5095cae7188234b46f4b2ebb90 \ No newline at end of file
diff --git a/db/schema_migrations/20220324171254 b/db/schema_migrations/20220324171254
new file mode 100644
index 00000000000..df966fd5300
--- /dev/null
+++ b/db/schema_migrations/20220324171254
@@ -0,0 +1 @@
+610c5ded785f174d195a660062bb74e718bfd5a38b13773215e20e8f95c59da4 \ No newline at end of file
diff --git a/db/schema_migrations/20220324173554 b/db/schema_migrations/20220324173554
new file mode 100644
index 00000000000..8292460972f
--- /dev/null
+++ b/db/schema_migrations/20220324173554
@@ -0,0 +1 @@
+9f597a462768531b0c6ad23e6e1a52edb765724518e1cebc0684160b030d6225 \ No newline at end of file
diff --git a/db/schema_migrations/20220324175325 b/db/schema_migrations/20220324175325
new file mode 100644
index 00000000000..e68c820a8f8
--- /dev/null
+++ b/db/schema_migrations/20220324175325
@@ -0,0 +1 @@
+8f423af68f25fb58374321eb38ff830fc47237005a23a66f61d5b794d519ef58 \ No newline at end of file
diff --git a/db/schema_migrations/20220324180717 b/db/schema_migrations/20220324180717
new file mode 100644
index 00000000000..b9bac081bcc
--- /dev/null
+++ b/db/schema_migrations/20220324180717
@@ -0,0 +1 @@
+56706c8d4139c63427838d37b7120c57fd39c7be4caee0ebba39a05cd3c453f7 \ No newline at end of file
diff --git a/db/schema_migrations/20220325000000 b/db/schema_migrations/20220325000000
new file mode 100644
index 00000000000..97f93ef57c7
--- /dev/null
+++ b/db/schema_migrations/20220325000000
@@ -0,0 +1 @@
+fd738cf8a5642f96dc67a294dcf913d797b580a19f35d5ef76573c63bf2dd920 \ No newline at end of file
diff --git a/db/schema_migrations/20220325000001 b/db/schema_migrations/20220325000001
new file mode 100644
index 00000000000..aa258196cb3
--- /dev/null
+++ b/db/schema_migrations/20220325000001
@@ -0,0 +1 @@
+d9ad9c043faf278e33707baeccb5b7733aec408446b3dacf685e126309c4808c \ No newline at end of file
diff --git a/db/schema_migrations/20220325050642 b/db/schema_migrations/20220325050642
new file mode 100644
index 00000000000..74a3205e5bf
--- /dev/null
+++ b/db/schema_migrations/20220325050642
@@ -0,0 +1 @@
+9ce5b7640c5d0c0e7cab0d12600b8378efb6a68922a361b0bee5617a69c3ee53 \ No newline at end of file
diff --git a/db/schema_migrations/20220325155953 b/db/schema_migrations/20220325155953
new file mode 100644
index 00000000000..408f1230a38
--- /dev/null
+++ b/db/schema_migrations/20220325155953
@@ -0,0 +1 @@
+bbcd27340d9d684b6134292772dad6f523ce6e1af9853ce12284a0c138d6b7bd \ No newline at end of file
diff --git a/db/schema_migrations/20220325160153 b/db/schema_migrations/20220325160153
new file mode 100644
index 00000000000..f1894bb1cab
--- /dev/null
+++ b/db/schema_migrations/20220325160153
@@ -0,0 +1 @@
+7f33fc1c6b47e3ff732caa62d15f0d725c03d993eacb24bc603992fc2579e63c \ No newline at end of file
diff --git a/db/schema_migrations/20220326161803 b/db/schema_migrations/20220326161803
new file mode 100644
index 00000000000..9d4fc7eb173
--- /dev/null
+++ b/db/schema_migrations/20220326161803
@@ -0,0 +1 @@
+c051ced08a5879ac1dc35d06509df91bdb0d26026cde127dc5ca4f905cb6a9fa \ No newline at end of file
diff --git a/db/schema_migrations/20220326163653 b/db/schema_migrations/20220326163653
new file mode 100644
index 00000000000..8f3cd7eb9b1
--- /dev/null
+++ b/db/schema_migrations/20220326163653
@@ -0,0 +1 @@
+112902ff530b1a4e34362845d9a521d320f4049bbd7992e8b3c2b2418d35100c \ No newline at end of file
diff --git a/db/schema_migrations/20220329061545 b/db/schema_migrations/20220329061545
new file mode 100644
index 00000000000..7d85c06978f
--- /dev/null
+++ b/db/schema_migrations/20220329061545
@@ -0,0 +1 @@
+29dfbf020302789f70365a69db5cbc24b9030f0be81666833c0ca8a4a8b1a681 \ No newline at end of file
diff --git a/db/schema_migrations/20220329095632 b/db/schema_migrations/20220329095632
new file mode 100644
index 00000000000..ba27739ccf7
--- /dev/null
+++ b/db/schema_migrations/20220329095632
@@ -0,0 +1 @@
+19ab6c5663ec07c7f4bdd92bf6d38e36766b27e6d0f0460f929a71b5e20fa396 \ No newline at end of file
diff --git a/db/schema_migrations/20220329110630 b/db/schema_migrations/20220329110630
new file mode 100644
index 00000000000..01087e9bfb2
--- /dev/null
+++ b/db/schema_migrations/20220329110630
@@ -0,0 +1 @@
+47664025bee8b3728411bde53aa597cb962d859402b0504a1962a3e4f117782f \ No newline at end of file
diff --git a/db/schema_migrations/20220329175119 b/db/schema_migrations/20220329175119
new file mode 100644
index 00000000000..5e0c0306594
--- /dev/null
+++ b/db/schema_migrations/20220329175119
@@ -0,0 +1 @@
+ec5dfe48e13cdbce5fc0c67612cddf1a5b555b3c84e1869ee3a7f047f0f3f1a0 \ No newline at end of file
diff --git a/db/schema_migrations/20220331074722 b/db/schema_migrations/20220331074722
new file mode 100644
index 00000000000..e4953322653
--- /dev/null
+++ b/db/schema_migrations/20220331074722
@@ -0,0 +1 @@
+507f2d64f0810938aba75f993bb7d6216499a754652b0b4c0ee2d0d44fdc3af3 \ No newline at end of file
diff --git a/db/schema_migrations/20220331174026 b/db/schema_migrations/20220331174026
new file mode 100644
index 00000000000..e4bf269e4e7
--- /dev/null
+++ b/db/schema_migrations/20220331174026
@@ -0,0 +1 @@
+b4f2c1c90447a41d69f08ca2c5cbb5fb0baf1fe04e43d5dc86323d01be9e28ef \ No newline at end of file
diff --git a/db/schema_migrations/20220331174459 b/db/schema_migrations/20220331174459
new file mode 100644
index 00000000000..f2f3dcfd778
--- /dev/null
+++ b/db/schema_migrations/20220331174459
@@ -0,0 +1 @@
+cc7da5bba5fd42a0c443290791eeee76491a29ab37a06f0a70806dc09ec1ceab \ No newline at end of file
diff --git a/db/schema_migrations/20220401044858 b/db/schema_migrations/20220401044858
new file mode 100644
index 00000000000..dcdbfc57822
--- /dev/null
+++ b/db/schema_migrations/20220401044858
@@ -0,0 +1 @@
+7d9341440faaf8782bc47a24091148c40d635cc1c980a57999b47aff3d42806d \ No newline at end of file
diff --git a/db/schema_migrations/20220401045116 b/db/schema_migrations/20220401045116
new file mode 100644
index 00000000000..3d6aa17ac69
--- /dev/null
+++ b/db/schema_migrations/20220401045116
@@ -0,0 +1 @@
+1f91d4855c6be0d7baf19f3d63d2efb4ccd8da85a7dcc4ad57fd03891f12fe46 \ No newline at end of file
diff --git a/db/schema_migrations/20220401045621 b/db/schema_migrations/20220401045621
new file mode 100644
index 00000000000..0502ad324da
--- /dev/null
+++ b/db/schema_migrations/20220401045621
@@ -0,0 +1 @@
+9a2274c54a0c0393bf0a2ae7985b957364c63952273383c3aa6ff6c5b4655a42 \ No newline at end of file
diff --git a/db/schema_migrations/20220401045642 b/db/schema_migrations/20220401045642
new file mode 100644
index 00000000000..cd1a7fee28e
--- /dev/null
+++ b/db/schema_migrations/20220401045642
@@ -0,0 +1 @@
+5eabeb19a1b79c21333eb519cf7419c5424cf1270c97637d07bb2a09946ceaf0 \ No newline at end of file
diff --git a/db/schema_migrations/20220401110443 b/db/schema_migrations/20220401110443
new file mode 100644
index 00000000000..30cc8592140
--- /dev/null
+++ b/db/schema_migrations/20220401110443
@@ -0,0 +1 @@
+c35e6149ee37321cd446284a2f0405378f3e34e3c9d11b7d128e9afa6c83281d \ No newline at end of file
diff --git a/db/schema_migrations/20220401110511 b/db/schema_migrations/20220401110511
new file mode 100644
index 00000000000..f0098be6e8e
--- /dev/null
+++ b/db/schema_migrations/20220401110511
@@ -0,0 +1 @@
+f5c934c691b50bff8c4029a975e37e86177cdb24b10bb65be2edd5bda50938b0 \ No newline at end of file
diff --git a/db/schema_migrations/20220401113123 b/db/schema_migrations/20220401113123
new file mode 100644
index 00000000000..58aea29c19c
--- /dev/null
+++ b/db/schema_migrations/20220401113123
@@ -0,0 +1 @@
+4ffb630e2949769c0ad64d43c2f8b6ad432358c44b00da99ec8ce538bb245e1a \ No newline at end of file
diff --git a/db/schema_migrations/20220404114106 b/db/schema_migrations/20220404114106
new file mode 100644
index 00000000000..a0680df974f
--- /dev/null
+++ b/db/schema_migrations/20220404114106
@@ -0,0 +1 @@
+6da0e999ab7bed0f9ee7a7938c9fa9ce4619d554640aa2d387f90e42d880db30 \ No newline at end of file
diff --git a/db/schema_migrations/20220404170446 b/db/schema_migrations/20220404170446
new file mode 100644
index 00000000000..e9a11c9e114
--- /dev/null
+++ b/db/schema_migrations/20220404170446
@@ -0,0 +1 @@
+f3954f6f741e40abb1ff9595f86f896e653eb14943faccfe2a14520ec583fa9c \ No newline at end of file
diff --git a/db/schema_migrations/20220404183350 b/db/schema_migrations/20220404183350
new file mode 100644
index 00000000000..0d7dffd3e79
--- /dev/null
+++ b/db/schema_migrations/20220404183350
@@ -0,0 +1 @@
+fcf7a6569afb7fdb95834179df5632ad14165d27476eb020e9db07e504f75f32 \ No newline at end of file
diff --git a/db/schema_migrations/20220404184814 b/db/schema_migrations/20220404184814
new file mode 100644
index 00000000000..81e413793e1
--- /dev/null
+++ b/db/schema_migrations/20220404184814
@@ -0,0 +1 @@
+f8013613d3ef44ea94db805d1900e7796204eefe373d42151cfe8acd4948a608 \ No newline at end of file
diff --git a/db/schema_migrations/20220404194649 b/db/schema_migrations/20220404194649
new file mode 100644
index 00000000000..4b6cc920cd6
--- /dev/null
+++ b/db/schema_migrations/20220404194649
@@ -0,0 +1 @@
+7897da66c2a941a6a09db6f62fa9069caef235603663077e5dd342a72ac5c7c3 \ No newline at end of file
diff --git a/db/schema_migrations/20220405061122 b/db/schema_migrations/20220405061122
new file mode 100644
index 00000000000..c89ea9d692f
--- /dev/null
+++ b/db/schema_migrations/20220405061122
@@ -0,0 +1 @@
+2b20f2c3bb8dd5d3ba27dcb8854108763a40be9393f4799f16e9c10daf9fff75 \ No newline at end of file
diff --git a/db/schema_migrations/20220405125459 b/db/schema_migrations/20220405125459
new file mode 100644
index 00000000000..1ed46eff43e
--- /dev/null
+++ b/db/schema_migrations/20220405125459
@@ -0,0 +1 @@
+c4dcb2b2e1262d63c56e171796f1cb6fb76d4b7dc090cf585f17a451c2fa784f \ No newline at end of file
diff --git a/db/schema_migrations/20220405181814 b/db/schema_migrations/20220405181814
new file mode 100644
index 00000000000..296cf6efc8b
--- /dev/null
+++ b/db/schema_migrations/20220405181814
@@ -0,0 +1 @@
+0835eaaf3e355f98783a11098a37b894b581176d98c39cdfd3be44e2447fe232 \ No newline at end of file
diff --git a/db/schema_migrations/20220405203843 b/db/schema_migrations/20220405203843
new file mode 100644
index 00000000000..10b831aebb8
--- /dev/null
+++ b/db/schema_migrations/20220405203843
@@ -0,0 +1 @@
+ac1892c5f2131e41774cadc8799cb5fb2c7d36fe567850fc1251a23c2d454695 \ No newline at end of file
diff --git a/db/schema_migrations/20220406113217 b/db/schema_migrations/20220406113217
new file mode 100644
index 00000000000..1fb61b081a4
--- /dev/null
+++ b/db/schema_migrations/20220406113217
@@ -0,0 +1 @@
+161ba8db7400c12dc0550246af8db86487e811803eaecedcb2761f4a8349920b \ No newline at end of file
diff --git a/db/schema_migrations/20220406121831 b/db/schema_migrations/20220406121831
new file mode 100644
index 00000000000..20f22d3deab
--- /dev/null
+++ b/db/schema_migrations/20220406121831
@@ -0,0 +1 @@
+687ba844d775918956f16dee16548f0440506e66e91afd5f52410066ffd5e364 \ No newline at end of file
diff --git a/db/schema_migrations/20220407135820 b/db/schema_migrations/20220407135820
new file mode 100644
index 00000000000..c1d1f8a5891
--- /dev/null
+++ b/db/schema_migrations/20220407135820
@@ -0,0 +1 @@
+ab7bb319a7099714d9863ec16b7dcf8c1aeab495b8635a01dff4a51fab876b6b \ No newline at end of file
diff --git a/db/schema_migrations/20220408001450 b/db/schema_migrations/20220408001450
new file mode 100644
index 00000000000..4d588db09e8
--- /dev/null
+++ b/db/schema_migrations/20220408001450
@@ -0,0 +1 @@
+42d7864cdcec589b7de8bc3a872e2743496d81788a60ddcd213f049fda12474e \ No newline at end of file
diff --git a/db/schema_migrations/20220408135815 b/db/schema_migrations/20220408135815
new file mode 100644
index 00000000000..3a41e4a5420
--- /dev/null
+++ b/db/schema_migrations/20220408135815
@@ -0,0 +1 @@
+01d8ab924e8c76b54d316ba94089eabea28999e4ce747e6c51803e1ea97b37df \ No newline at end of file
diff --git a/db/schema_migrations/20220409160628 b/db/schema_migrations/20220409160628
new file mode 100644
index 00000000000..29b46427dd2
--- /dev/null
+++ b/db/schema_migrations/20220409160628
@@ -0,0 +1 @@
+7952024a6a8df98842fa23ca9a4c328b83816ded3071e7597dbab431a5561e1a \ No newline at end of file
diff --git a/db/schema_migrations/20220412044906 b/db/schema_migrations/20220412044906
new file mode 100644
index 00000000000..a86fcfead61
--- /dev/null
+++ b/db/schema_migrations/20220412044906
@@ -0,0 +1 @@
+1d6ed98ad2da7be75e09d853db86905ed1fb1847d387cc6d1980ff5516db06d9 \ No newline at end of file
diff --git a/db/schema_migrations/20220412143551 b/db/schema_migrations/20220412143551
new file mode 100644
index 00000000000..8f9ce590f4c
--- /dev/null
+++ b/db/schema_migrations/20220412143551
@@ -0,0 +1 @@
+beff437160d30bc0cb6577e5b88edb751f1325b316534010844e053a567906ff \ No newline at end of file
diff --git a/db/schema_migrations/20220412143552 b/db/schema_migrations/20220412143552
new file mode 100644
index 00000000000..286c6d86cbd
--- /dev/null
+++ b/db/schema_migrations/20220412143552
@@ -0,0 +1 @@
+6211f4f1e2708606aa68c139639acdb366cd1f8e4be225800a2e49888f420498 \ No newline at end of file
diff --git a/db/schema_migrations/20220412171810 b/db/schema_migrations/20220412171810
new file mode 100644
index 00000000000..377f268f697
--- /dev/null
+++ b/db/schema_migrations/20220412171810
@@ -0,0 +1 @@
+efba00e36821c5ebe92ba39ad40dd165ab46c97b1b18becdec0d192470c2e8ca \ No newline at end of file
diff --git a/db/schema_migrations/20220413011328 b/db/schema_migrations/20220413011328
new file mode 100644
index 00000000000..3cf51735e27
--- /dev/null
+++ b/db/schema_migrations/20220413011328
@@ -0,0 +1 @@
+442300bd5c2f05807bdf752a9c3280a11f1cc84b21c2d61d99fb73268f7a495f \ No newline at end of file
diff --git a/db/schema_migrations/20220413075921 b/db/schema_migrations/20220413075921
new file mode 100644
index 00000000000..ef26fb07cd6
--- /dev/null
+++ b/db/schema_migrations/20220413075921
@@ -0,0 +1 @@
+b3e580387d56847039c4030fbbbda1131016ef6b068ff60f2e4e48563a331051 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 8d1679b3832..c226da842c3 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -10639,10 +10639,18 @@ CREATE TABLE analytics_cycle_analytics_aggregations (
last_full_run_mrs_updated_at timestamp with time zone,
last_consistency_check_updated_at timestamp with time zone,
enabled boolean DEFAULT true NOT NULL,
+ full_runtimes_in_seconds integer[] DEFAULT '{}'::integer[] NOT NULL,
+ full_processed_records integer[] DEFAULT '{}'::integer[] NOT NULL,
+ last_full_merge_requests_updated_at timestamp with time zone,
+ last_full_issues_updated_at timestamp with time zone,
+ last_full_issues_id integer,
+ last_full_merge_requests_id integer,
CONSTRAINT chk_rails_1ef688e577 CHECK ((cardinality(incremental_runtimes_in_seconds) <= 10)),
CONSTRAINT chk_rails_7810292ec9 CHECK ((cardinality(last_full_run_processed_records) <= 10)),
CONSTRAINT chk_rails_8b9e89687c CHECK ((cardinality(last_full_run_runtimes_in_seconds) <= 10)),
- CONSTRAINT chk_rails_e16bf3913a CHECK ((cardinality(incremental_processed_records) <= 10))
+ CONSTRAINT chk_rails_e16bf3913a CHECK ((cardinality(incremental_processed_records) <= 10)),
+ CONSTRAINT full_processed_records_size CHECK ((cardinality(full_processed_records) <= 10)),
+ CONSTRAINT full_runtimes_in_seconds_size CHECK ((cardinality(full_runtimes_in_seconds) <= 10))
);
CREATE TABLE analytics_cycle_analytics_group_stages (
@@ -11235,7 +11243,6 @@ CREATE TABLE application_settings (
max_ssh_key_lifetime integer,
static_objects_external_storage_auth_token_encrypted text,
future_subscriptions jsonb DEFAULT '[]'::jsonb NOT NULL,
- user_email_lookup_limit integer DEFAULT 60 NOT NULL,
packages_cleanup_package_file_worker_capacity smallint DEFAULT 2 NOT NULL,
container_registry_import_max_tags_count integer DEFAULT 100 NOT NULL,
container_registry_import_max_retries integer DEFAULT 3 NOT NULL,
@@ -11251,8 +11258,22 @@ CREATE TABLE application_settings (
users_get_by_id_limit integer DEFAULT 300 NOT NULL,
users_get_by_id_limit_allowlist text[] DEFAULT '{}'::text[] NOT NULL,
container_registry_expiration_policies_caching boolean DEFAULT true NOT NULL,
- search_rate_limit integer DEFAULT 30 NOT NULL,
- search_rate_limit_unauthenticated integer DEFAULT 10 NOT NULL,
+ search_rate_limit integer DEFAULT 300 NOT NULL,
+ search_rate_limit_unauthenticated integer DEFAULT 100 NOT NULL,
+ encrypted_database_grafana_api_key bytea,
+ encrypted_database_grafana_api_key_iv bytea,
+ database_grafana_api_url text,
+ database_grafana_tag text,
+ public_runner_releases_url text DEFAULT 'https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab-runner/releases'::text NOT NULL,
+ encrypted_arkose_labs_public_api_key bytea,
+ encrypted_arkose_labs_public_api_key_iv bytea,
+ encrypted_arkose_labs_private_api_key bytea,
+ encrypted_arkose_labs_private_api_key_iv bytea,
+ arkose_labs_verify_api_url text,
+ delete_inactive_projects boolean DEFAULT false NOT NULL,
+ inactive_projects_delete_after_months integer DEFAULT 2 NOT NULL,
+ inactive_projects_min_size_mb integer DEFAULT 0 NOT NULL,
+ inactive_projects_send_warning_email_after_months integer DEFAULT 1 NOT NULL,
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)),
@@ -11261,8 +11282,10 @@ CREATE TABLE application_settings (
CONSTRAINT app_settings_yaml_max_depth_positive CHECK ((max_yaml_depth > 0)),
CONSTRAINT app_settings_yaml_max_size_positive CHECK ((max_yaml_size_bytes > 0)),
CONSTRAINT check_17d9558205 CHECK ((char_length((kroki_url)::text) <= 1024)),
+ CONSTRAINT check_2b820eaac3 CHECK ((char_length(database_grafana_tag) <= 255)),
CONSTRAINT check_2dba05b802 CHECK ((char_length(gitpod_url) <= 255)),
CONSTRAINT check_32710817e9 CHECK ((char_length(static_objects_external_storage_auth_token_encrypted) <= 255)),
+ CONSTRAINT check_3455368420 CHECK ((char_length(database_grafana_api_url) <= 255)),
CONSTRAINT check_3559645ae5 CHECK ((char_length(container_registry_import_target_plan) <= 255)),
CONSTRAINT check_3def0f1829 CHECK ((char_length(sentry_clientside_dsn) <= 255)),
CONSTRAINT check_4f8b811780 CHECK ((char_length(sentry_dsn) <= 255)),
@@ -11273,6 +11296,7 @@ CREATE TABLE application_settings (
CONSTRAINT check_718b4458ae CHECK ((char_length(personal_access_token_prefix) <= 20)),
CONSTRAINT check_7227fad848 CHECK ((char_length(rate_limiting_response_text) <= 255)),
CONSTRAINT check_85a39b68ff CHECK ((char_length(encrypted_ci_jwt_signing_key_iv) <= 255)),
+ CONSTRAINT check_8dca35398a CHECK ((char_length(public_runner_releases_url) <= 255)),
CONSTRAINT check_9a719834eb CHECK ((char_length(secret_detection_token_revocation_url) <= 255)),
CONSTRAINT check_9c6c447a13 CHECK ((char_length(maintenance_mode_message) <= 255)),
CONSTRAINT check_a5704163cc CHECK ((char_length(secret_detection_revocation_token_types_url) <= 255)),
@@ -11280,7 +11304,8 @@ CREATE TABLE application_settings (
CONSTRAINT check_d820146492 CHECK ((char_length(spam_check_endpoint_url) <= 255)),
CONSTRAINT check_e5024c8801 CHECK ((char_length(elasticsearch_username) <= 255)),
CONSTRAINT check_e5aba18f02 CHECK ((char_length(container_registry_version) <= 255)),
- CONSTRAINT check_ef6176834f CHECK ((char_length(encrypted_cloud_license_auth_token_iv) <= 255))
+ CONSTRAINT check_ef6176834f CHECK ((char_length(encrypted_cloud_license_auth_token_iv) <= 255)),
+ CONSTRAINT check_f6563bc000 CHECK ((char_length(arkose_labs_verify_api_url) <= 255))
);
COMMENT ON COLUMN application_settings.content_validation_endpoint_url IS 'JiHu-specific column';
@@ -11708,6 +11733,8 @@ CREATE TABLE batched_background_migrations (
total_tuple_count bigint,
pause_ms integer DEFAULT 100 NOT NULL,
max_batch_size integer,
+ started_at timestamp with time zone,
+ on_hold_until timestamp with time zone,
CONSTRAINT check_5bb0382d6f CHECK ((char_length(column_name) <= 63)),
CONSTRAINT check_6b6a06254a CHECK ((char_length(table_name) <= 63)),
CONSTRAINT check_batch_size_in_range CHECK ((batch_size >= sub_batch_size)),
@@ -11718,6 +11745,8 @@ CREATE TABLE batched_background_migrations (
CONSTRAINT check_positive_sub_batch_size CHECK ((sub_batch_size > 0))
);
+COMMENT ON COLUMN batched_background_migrations.on_hold_until IS 'execution of this migration is on hold until this time';
+
CREATE SEQUENCE batched_background_migrations_id_seq
START WITH 1
INCREMENT BY 1
@@ -11975,7 +12004,8 @@ CREATE TABLE broadcast_messages (
target_path character varying(255),
broadcast_type smallint DEFAULT 1 NOT NULL,
dismissable boolean,
- target_access_levels integer[] DEFAULT '{}'::integer[] NOT NULL
+ target_access_levels integer[] DEFAULT '{}'::integer[] NOT NULL,
+ theme smallint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE broadcast_messages_id_seq
@@ -13027,8 +13057,10 @@ CREATE TABLE ci_secure_files (
name text NOT NULL,
file text NOT NULL,
checksum bytea NOT NULL,
+ key_data text,
CONSTRAINT check_320790634d CHECK ((char_length(file) <= 255)),
- CONSTRAINT check_402c7b4a56 CHECK ((char_length(name) <= 255))
+ CONSTRAINT check_402c7b4a56 CHECK ((char_length(name) <= 255)),
+ CONSTRAINT check_7279b4e293 CHECK ((char_length(key_data) <= 128))
);
CREATE SEQUENCE ci_secure_files_id_seq
@@ -13724,6 +13756,8 @@ CREATE TABLE container_repositories (
migration_skipped_reason smallint,
migration_state text DEFAULT 'default'::text NOT NULL,
migration_aborted_in_state text,
+ migration_plan text,
+ CONSTRAINT check_05e9012f36 CHECK ((char_length(migration_plan) <= 255)),
CONSTRAINT check_13c58fe73a CHECK ((char_length(migration_state) <= 255)),
CONSTRAINT check_97f0249439 CHECK ((char_length(migration_aborted_in_state) <= 255))
);
@@ -14044,8 +14078,10 @@ CREATE TABLE dast_site_profiles (
auth_username text,
target_type smallint DEFAULT 0 NOT NULL,
scan_method smallint DEFAULT 0 NOT NULL,
+ auth_submit_field text,
CONSTRAINT check_5203110fee CHECK ((char_length(auth_username_field) <= 255)),
CONSTRAINT check_6cfab17b48 CHECK ((char_length(name) <= 255)),
+ CONSTRAINT check_af44f54c96 CHECK ((char_length(auth_submit_field) <= 255)),
CONSTRAINT check_c329dffdba CHECK ((char_length(auth_password_field) <= 255)),
CONSTRAINT check_d446f7047b CHECK ((char_length(auth_url) <= 1024)),
CONSTRAINT check_f22f18002a CHECK ((char_length(auth_username) <= 255))
@@ -14248,7 +14284,8 @@ CREATE TABLE deploy_tokens (
deploy_token_type smallint DEFAULT 2 NOT NULL,
write_registry boolean DEFAULT false NOT NULL,
read_package_registry boolean DEFAULT false NOT NULL,
- write_package_registry boolean DEFAULT false NOT NULL
+ write_package_registry boolean DEFAULT false NOT NULL,
+ creator_id bigint
);
CREATE SEQUENCE deploy_tokens_id_seq
@@ -14268,6 +14305,7 @@ CREATE TABLE deployment_approvals (
updated_at timestamp with time zone NOT NULL,
status smallint NOT NULL,
comment text,
+ approval_rule_id bigint,
CONSTRAINT check_e2eb6a17d8 CHECK ((char_length(comment) <= 255))
);
@@ -14462,6 +14500,7 @@ CREATE TABLE dora_daily_metrics (
deployment_frequency integer,
lead_time_for_changes_in_seconds integer,
time_to_restore_service_in_seconds integer,
+ incidents_count integer,
CONSTRAINT dora_daily_metrics_deployment_frequency_positive CHECK ((deployment_frequency >= 0)),
CONSTRAINT dora_daily_metrics_lead_time_for_changes_in_seconds_positive CHECK ((lead_time_for_changes_in_seconds >= 0))
);
@@ -15666,6 +15705,13 @@ CREATE SEQUENCE group_deploy_tokens_id_seq
ALTER SEQUENCE group_deploy_tokens_id_seq OWNED BY group_deploy_tokens.id;
+CREATE TABLE group_features (
+ group_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ wiki_access_level smallint DEFAULT 20 NOT NULL
+);
+
CREATE TABLE group_group_links (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -15792,7 +15838,7 @@ CREATE TABLE import_export_uploads (
export_file text,
group_id bigint,
remote_import_url text,
- CONSTRAINT check_58f0d37481 CHECK ((char_length(remote_import_url) <= 512))
+ CONSTRAINT check_58f0d37481 CHECK ((char_length(remote_import_url) <= 2048))
);
CREATE SEQUENCE import_export_uploads_id_seq
@@ -16091,7 +16137,6 @@ CREATE TABLE integrations (
confidential_note_events boolean DEFAULT true,
deployment_events boolean DEFAULT false NOT NULL,
comment_on_event_enabled boolean DEFAULT true NOT NULL,
- template boolean DEFAULT false,
instance boolean DEFAULT false NOT NULL,
comment_detail smallint,
inherit_from_id bigint,
@@ -17321,7 +17366,8 @@ CREATE TABLE namespace_root_storage_statistics (
snippets_size bigint DEFAULT 0 NOT NULL,
pipeline_artifacts_size bigint DEFAULT 0 NOT NULL,
uploads_size bigint DEFAULT 0 NOT NULL,
- dependency_proxy_size bigint DEFAULT 0 NOT NULL
+ dependency_proxy_size bigint DEFAULT 0 NOT NULL,
+ notification_level smallint DEFAULT 100 NOT NULL
);
CREATE TABLE namespace_settings (
@@ -17652,7 +17698,8 @@ CREATE TABLE onboarding_progresses (
secure_secret_detection_run_at timestamp with time zone,
secure_coverage_fuzzing_run_at timestamp with time zone,
secure_cluster_image_scanning_run_at timestamp with time zone,
- secure_api_fuzzing_run_at timestamp with time zone
+ secure_api_fuzzing_run_at timestamp with time zone,
+ license_scanning_run_at timestamp with time zone
);
CREATE SEQUENCE onboarding_progresses_id_seq
@@ -18613,7 +18660,8 @@ CREATE TABLE plan_limits (
dotenv_variables integer DEFAULT 20 NOT NULL,
dotenv_size integer DEFAULT 5120 NOT NULL,
pipeline_triggers integer DEFAULT 25000 NOT NULL,
- project_ci_secure_files integer DEFAULT 100 NOT NULL
+ project_ci_secure_files integer DEFAULT 100 NOT NULL,
+ repository_size bigint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE plan_limits_id_seq
@@ -19258,8 +19306,8 @@ 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,
- artifacts_archive_id bigint,
- pages_deployment_id bigint
+ pages_deployment_id bigint,
+ onboarding_complete boolean DEFAULT false NOT NULL
);
CREATE TABLE project_repositories (
@@ -19361,6 +19409,7 @@ CREATE TABLE project_settings (
has_shimo boolean DEFAULT false NOT NULL,
squash_commit_template text,
legacy_open_source_license_available boolean DEFAULT true NOT NULL,
+ target_platforms character varying[] DEFAULT '{}'::character varying[] NOT NULL,
CONSTRAINT check_3a03e7557a CHECK ((char_length(previous_default_branch) <= 4096)),
CONSTRAINT check_b09644994b CHECK ((char_length(squash_commit_template) <= 500)),
CONSTRAINT check_bde223416c CHECK ((show_default_award_emojis IS NOT NULL)),
@@ -19382,7 +19431,8 @@ CREATE TABLE project_statistics (
wiki_size bigint,
snippets_size bigint,
pipeline_artifacts_size bigint DEFAULT 0 NOT NULL,
- uploads_size bigint DEFAULT 0 NOT NULL
+ uploads_size bigint DEFAULT 0 NOT NULL,
+ container_registry_size bigint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE project_statistics_id_seq
@@ -19679,6 +19729,28 @@ CREATE SEQUENCE protected_branches_id_seq
ALTER SEQUENCE protected_branches_id_seq OWNED BY protected_branches.id;
+CREATE TABLE protected_environment_approval_rules (
+ id bigint NOT NULL,
+ protected_environment_id bigint NOT NULL,
+ user_id bigint,
+ group_id bigint,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ access_level smallint,
+ required_approvals smallint NOT NULL,
+ CONSTRAINT chk_rails_bed75249bc CHECK ((((access_level IS NOT NULL) AND (group_id IS NULL) AND (user_id IS NULL)) OR ((user_id IS NOT NULL) AND (access_level IS NULL) AND (group_id IS NULL)) OR ((group_id IS NOT NULL) AND (user_id IS NULL) AND (access_level IS NULL)))),
+ CONSTRAINT chk_rails_cfa90ae3b5 CHECK ((required_approvals > 0))
+);
+
+CREATE SEQUENCE protected_environment_approval_rules_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE protected_environment_approval_rules_id_seq OWNED BY protected_environment_approval_rules.id;
+
CREATE TABLE protected_environment_deploy_access_levels (
id integer NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -21280,7 +21352,11 @@ CREATE TABLE user_preferences (
experience_level smallint,
view_diffs_file_by_file boolean DEFAULT false NOT NULL,
gitpod_enabled boolean DEFAULT false NOT NULL,
- markdown_surround_selection boolean DEFAULT true NOT NULL
+ markdown_surround_selection boolean DEFAULT true NOT NULL,
+ diffs_deletion_color text,
+ diffs_addition_color text,
+ CONSTRAINT check_89bf269f41 CHECK ((char_length(diffs_deletion_color) <= 7)),
+ CONSTRAINT check_d07ccd35f7 CHECK ((char_length(diffs_addition_color) <= 7))
);
CREATE SEQUENCE user_preferences_id_seq
@@ -21413,6 +21489,7 @@ CREATE TABLE users (
role smallint,
user_type smallint,
static_object_token_encrypted text,
+ otp_secret_expires_at timestamp with time zone,
CONSTRAINT check_7bde697e8e CHECK ((char_length(static_object_token_encrypted) <= 255))
);
@@ -22948,6 +23025,8 @@ ALTER TABLE ONLY protected_branch_unprotect_access_levels ALTER COLUMN id SET DE
ALTER TABLE ONLY protected_branches ALTER COLUMN id SET DEFAULT nextval('protected_branches_id_seq'::regclass);
+ALTER TABLE ONLY protected_environment_approval_rules ALTER COLUMN id SET DEFAULT nextval('protected_environment_approval_rules_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);
@@ -23981,6 +24060,9 @@ ALTER TABLE group_import_states
ALTER TABLE sprints
ADD CONSTRAINT check_df3816aed7 CHECK ((due_date IS NOT NULL)) NOT VALID;
+ALTER TABLE projects
+ ADD CONSTRAINT check_fa75869cb1 CHECK ((project_namespace_id IS NOT NULL)) NOT VALID;
+
ALTER TABLE ONLY ci_build_needs
ADD CONSTRAINT ci_build_needs_pkey PRIMARY KEY (id);
@@ -24491,6 +24573,9 @@ ALTER TABLE ONLY group_deploy_keys
ALTER TABLE ONLY group_deploy_tokens
ADD CONSTRAINT group_deploy_tokens_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY group_features
+ ADD CONSTRAINT group_features_pkey PRIMARY KEY (group_id);
+
ALTER TABLE ONLY group_group_links
ADD CONSTRAINT group_group_links_pkey PRIMARY KEY (id);
@@ -25064,6 +25149,9 @@ ALTER TABLE ONLY protected_branch_unprotect_access_levels
ALTER TABLE ONLY protected_branches
ADD CONSTRAINT protected_branches_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY protected_environment_approval_rules
+ ADD CONSTRAINT protected_environment_approval_rules_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY protected_environment_deploy_access_levels
ADD CONSTRAINT protected_environment_deploy_access_levels_pkey PRIMARY KEY (id);
@@ -26383,8 +26471,6 @@ 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);
@@ -26435,6 +26521,8 @@ CREATE INDEX idx_container_repos_on_exp_cleanup_status_project_id_start_date ON
CREATE INDEX idx_container_repos_on_import_started_at_when_importing ON container_repositories USING btree (migration_import_started_at) WHERE (migration_state = 'importing'::text);
+CREATE INDEX idx_container_repos_on_migration_state_migration_plan_created ON container_repositories USING btree (migration_state, migration_plan, created_at);
+
CREATE INDEX idx_container_repos_on_pre_import_done_at_when_pre_import_done ON container_repositories USING btree (migration_pre_import_done_at) WHERE (migration_state = 'pre_import_done'::text);
CREATE INDEX idx_container_repos_on_pre_import_started_at_when_pre_importing ON container_repositories USING btree (migration_pre_import_started_at) WHERE (migration_state = 'pre_importing'::text);
@@ -26579,6 +26667,8 @@ CREATE UNIQUE INDEX idx_vulnerability_issue_links_on_vulnerability_id_and_issue_
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 UNIQUE INDEX idx_work_item_types_on_namespace_id_and_name_null_namespace ON work_item_types USING btree (btrim(lower(name)), ((namespace_id IS NULL))) WHERE (namespace_id IS NULL);
+
CREATE INDEX index_abuse_reports_on_user_id ON abuse_reports USING btree (user_id);
CREATE INDEX index_agent_activity_events_on_agent_id_and_recorded_at_and_id ON agent_activity_events USING btree (agent_id, recorded_at, id);
@@ -26705,6 +26795,8 @@ CREATE UNIQUE INDEX index_approval_rule_name_for_code_owners_rule_type ON approv
CREATE UNIQUE INDEX index_approval_rule_name_for_sectional_code_owners_rule_type ON approval_merge_request_rules USING btree (merge_request_id, name, section) WHERE (rule_type = 2);
+CREATE INDEX index_approval_rule_on_protected_environment_id ON protected_environment_approval_rules USING btree (protected_environment_id);
+
CREATE INDEX index_approval_rules_code_owners_rule_type ON approval_merge_request_rules USING btree (merge_request_id) WHERE (rule_type = 2);
CREATE INDEX index_approvals_on_merge_request_id ON approvals USING btree (merge_request_id);
@@ -26747,6 +26839,8 @@ 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_batched_background_migrations_on_status ON batched_background_migrations USING btree (status);
+
CREATE UNIQUE INDEX index_batched_background_migrations_on_unique_configuration ON batched_background_migrations USING btree (job_class_name, table_name, column_name, job_arguments);
CREATE INDEX index_batched_jobs_by_batched_migration_id_and_id ON batched_background_migration_jobs USING btree (batched_background_migration_id, id);
@@ -26943,6 +27037,8 @@ CREATE INDEX index_ci_job_artifacts_id_for_terraform_reports ON ci_job_artifacts
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_expire_at_for_removal ON ci_job_artifacts USING btree (expire_at) WHERE ((locked = 0) AND (expire_at IS NOT NULL));
+
CREATE INDEX index_ci_job_artifacts_on_file_store ON ci_job_artifacts USING btree (file_store);
CREATE INDEX index_ci_job_artifacts_on_file_type_for_devops_adoption ON ci_job_artifacts USING btree (file_type, project_id, created_at) WHERE (file_type = ANY (ARRAY[5, 6, 8, 23]));
@@ -26969,6 +27065,8 @@ CREATE INDEX index_ci_minutes_additional_packs_on_namespace_id_purchase_xid ON c
CREATE UNIQUE INDEX index_ci_namespace_mirrors_on_namespace_id ON ci_namespace_mirrors USING btree (namespace_id);
+CREATE INDEX index_ci_namespace_mirrors_on_traversal_ids_unnest ON ci_namespace_mirrors USING btree ((traversal_ids[1]), (traversal_ids[2]), (traversal_ids[3]), (traversal_ids[4])) INCLUDE (traversal_ids, namespace_id);
+
CREATE UNIQUE INDEX index_ci_namespace_monthly_usages_on_namespace_id_and_date ON ci_namespace_monthly_usages USING btree (namespace_id, date);
CREATE INDEX index_ci_pending_builds_id_on_protected_partial ON ci_pending_builds USING btree (id) WHERE (protected = true);
@@ -27237,7 +27335,7 @@ CREATE INDEX index_composer_cache_files_where_namespace_id_is_null ON packages_c
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_greatest_done_at ON container_repositories USING btree (GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at)) WHERE (migration_state = ANY (ARRAY['import_done'::text, 'pre_import_done'::text, 'import_aborted'::text]));
+CREATE INDEX index_container_repositories_on_greatest_completed_at ON container_repositories USING btree (GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at)) WHERE (migration_state = ANY (ARRAY['import_done'::text, 'pre_import_done'::text, 'import_aborted'::text, 'import_skipped'::text]));
CREATE INDEX index_container_repositories_on_migration_state_import_done_at ON container_repositories USING btree (migration_state, migration_import_done_at);
@@ -27271,7 +27369,7 @@ CREATE INDEX index_customer_relations_contacts_on_group_id ON customer_relations
CREATE INDEX index_customer_relations_contacts_on_organization_id ON customer_relations_contacts USING btree (organization_id);
-CREATE UNIQUE INDEX index_customer_relations_organizations_on_unique_name_per_group ON customer_relations_organizations USING btree (group_id, lower(name));
+CREATE UNIQUE INDEX index_customer_relations_contacts_on_unique_email_per_group ON customer_relations_contacts USING btree (group_id, lower(email), id);
CREATE UNIQUE INDEX index_cycle_analytics_stage_event_hashes_on_hash_sha_256 ON analytics_cycle_analytics_stage_event_hashes USING btree (hash_sha256);
@@ -27335,12 +27433,16 @@ CREATE INDEX index_deploy_keys_projects_on_deploy_key_id ON deploy_keys_projects
CREATE INDEX index_deploy_keys_projects_on_project_id ON deploy_keys_projects USING btree (project_id);
+CREATE INDEX index_deploy_tokens_on_creator_id ON deploy_tokens USING btree (creator_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_approvals_on_approval_rule_id ON deployment_approvals USING btree (approval_rule_id);
+
CREATE UNIQUE INDEX index_deployment_approvals_on_deployment_id_and_user_id ON deployment_approvals USING btree (deployment_id, user_id);
CREATE INDEX index_deployment_approvals_on_user_id ON deployment_approvals USING btree (user_id);
@@ -27349,6 +27451,8 @@ CREATE UNIQUE INDEX index_deployment_clusters_on_cluster_id_and_deployment_id ON
CREATE INDEX index_deployment_merge_requests_on_merge_request_id ON deployment_merge_requests USING btree (merge_request_id);
+CREATE INDEX index_deployments_for_visible_scope ON deployments USING btree (environment_id, finished_at DESC) WHERE (status = ANY (ARRAY[1, 2, 3, 4, 6]));
+
CREATE INDEX index_deployments_on_archived_project_id_iid ON deployments USING btree (archived, project_id, iid);
CREATE INDEX index_deployments_on_cluster_id_and_status ON deployments USING btree (cluster_id, status);
@@ -27817,22 +27921,16 @@ CREATE UNIQUE INDEX index_integrations_on_project_id_and_type_new_unique ON inte
CREATE UNIQUE INDEX index_integrations_on_project_id_and_type_unique ON integrations USING btree (project_id, type);
-CREATE INDEX index_integrations_on_template ON integrations USING btree (template);
-
CREATE INDEX index_integrations_on_type ON integrations USING btree (type);
CREATE UNIQUE INDEX index_integrations_on_type_and_instance_partial ON integrations USING btree (type, instance) WHERE (instance = true);
-CREATE UNIQUE INDEX index_integrations_on_type_and_template_partial ON integrations USING btree (type, template) WHERE (template = true);
-
CREATE INDEX index_integrations_on_type_id_when_active_and_project_id_not_nu ON integrations USING btree (type, id) WHERE ((active = true) AND (project_id IS NOT NULL));
CREATE INDEX index_integrations_on_type_new ON integrations USING btree (type_new);
CREATE INDEX index_integrations_on_type_new_and_instance_partial ON integrations USING btree (type_new, instance) WHERE (instance = true);
-CREATE INDEX index_integrations_on_type_new_and_template_partial ON integrations USING btree (type_new, template) WHERE (template = true);
-
CREATE INDEX index_integrations_on_type_new_id_when_active_and_has_project ON integrations USING btree (type_new, id) WHERE ((active = true) AND (project_id IS NOT NULL));
CREATE UNIQUE INDEX index_integrations_on_unique_group_id_and_type ON integrations USING btree (group_id, type);
@@ -27927,8 +28025,6 @@ 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 INDEX index_issues_on_work_item_type_id ON issues USING btree (work_item_type_id);
-
CREATE INDEX index_iterations_cadences_on_group_id ON iterations_cadences USING btree (group_id);
CREATE UNIQUE INDEX index_jira_connect_installations_on_client_key ON jira_connect_installations USING btree (client_key);
@@ -28047,6 +28143,8 @@ CREATE UNIQUE INDEX index_members_on_invite_token ON members USING btree (invite
CREATE INDEX index_members_on_member_namespace_id ON members USING btree (member_namespace_id);
+CREATE INDEX index_members_on_non_requested_non_invited_and_state_awaiting ON members USING btree (source_id) WHERE ((requested_at IS NULL) AND (invite_token IS NULL) AND (access_level > 5) AND (state = 1));
+
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);
@@ -28325,14 +28423,14 @@ CREATE INDEX index_on_issues_closed_incidents_by_project_id_and_closed_at ON iss
CREATE INDEX index_on_label_links_all_columns ON label_links USING btree (target_id, label_id, target_type);
-CREATE INDEX index_on_merge_request_assignees_state ON merge_request_assignees USING btree (state) WHERE (state = 2);
-
CREATE INDEX index_on_merge_request_assignees_updated_state_by_user_id ON merge_request_assignees USING btree (updated_state_by_user_id);
-CREATE INDEX index_on_merge_request_reviewers_state ON merge_request_reviewers USING btree (state) WHERE (state = 2);
+CREATE INDEX index_on_merge_request_assignees_user_id_and_state ON merge_request_assignees USING btree (user_id, state) WHERE (state = 2);
CREATE INDEX index_on_merge_request_reviewers_updated_state_by_user_id ON merge_request_reviewers USING btree (updated_state_by_user_id);
+CREATE INDEX index_on_merge_request_reviewers_user_id_and_state ON merge_request_reviewers USING btree (user_id, state) WHERE (state = 2);
+
CREATE INDEX index_on_merge_requests_for_latest_diffs ON merge_requests USING btree (target_project_id) INCLUDE (id, latest_merge_request_diff_id);
COMMENT ON INDEX index_on_merge_requests_for_latest_diffs IS 'Index used to efficiently obtain the oldest merge request for a commit SHA';
@@ -28391,9 +28489,11 @@ CREATE UNIQUE INDEX index_ops_feature_flags_issues_on_feature_flag_id_and_issue_
CREATE UNIQUE INDEX index_ops_strategies_user_lists_on_strategy_id_and_user_list_id ON operations_strategies_user_lists USING btree (strategy_id, user_list_id);
+CREATE UNIQUE INDEX index_organizations_on_unique_name_per_group ON customer_relations_organizations USING btree (group_id, lower(name), id);
+
CREATE INDEX index_packages_build_infos_on_pipeline_id ON packages_build_infos USING btree (pipeline_id);
-CREATE INDEX index_packages_build_infos_package_id_pipeline_id ON packages_build_infos USING btree (package_id, pipeline_id);
+CREATE INDEX index_packages_build_infos_package_id_pipeline_id_id ON packages_build_infos USING btree (package_id, pipeline_id, id);
CREATE UNIQUE INDEX index_packages_composer_cache_namespace_and_sha ON packages_composer_cache_files USING btree (namespace_id, file_sha256);
@@ -28611,8 +28711,6 @@ CREATE UNIQUE INDEX index_project_mirror_data_on_project_id ON project_mirror_da
CREATE INDEX index_project_mirror_data_on_status ON project_mirror_data USING btree (status);
-CREATE INDEX index_project_pages_metadata_on_artifacts_archive_id ON project_pages_metadata USING btree (artifacts_archive_id);
-
CREATE INDEX index_project_pages_metadata_on_pages_deployment_id ON project_pages_metadata USING btree (pages_deployment_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);
@@ -28783,6 +28881,10 @@ CREATE INDEX index_protected_branch_unprotect_access_levels_on_user_id ON protec
CREATE INDEX index_protected_branches_on_project_id ON protected_branches USING btree (project_id);
+CREATE INDEX index_protected_environment_approval_rules_on_group_id ON protected_environment_approval_rules USING btree (group_id);
+
+CREATE INDEX index_protected_environment_approval_rules_on_user_id ON protected_environment_approval_rules USING btree (user_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);
@@ -28955,6 +29057,8 @@ CREATE INDEX index_security_findings_on_project_fingerprint ON security_findings
CREATE INDEX index_security_findings_on_scan_id_and_deduplicated ON security_findings USING btree (scan_id, deduplicated);
+CREATE INDEX index_security_findings_on_scan_id_and_id ON security_findings USING btree (scan_id, id);
+
CREATE INDEX index_security_findings_on_scanner_id ON security_findings USING btree (scanner_id);
CREATE INDEX index_security_findings_on_severity ON security_findings USING btree (severity);
@@ -29335,6 +29439,8 @@ CREATE UNIQUE INDEX index_vuln_historical_statistics_on_project_id_and_date ON v
CREATE INDEX index_vuln_reads_on_project_id_state_severity_and_vuln_id ON vulnerability_reads USING btree (project_id, state, severity, vulnerability_id DESC);
+CREATE INDEX index_vulnerabilites_common_finder_query ON vulnerabilities USING btree (project_id, state, report_type, severity, id);
+
CREATE INDEX index_vulnerabilities_on_author_id ON vulnerabilities USING btree (author_id);
CREATE INDEX index_vulnerabilities_on_confirmed_by_id ON vulnerabilities USING btree (confirmed_by_id);
@@ -29435,6 +29541,8 @@ CREATE UNIQUE INDEX index_vulnerability_occurrences_on_uuid ON vulnerability_occ
CREATE INDEX index_vulnerability_occurrences_on_vulnerability_id ON vulnerability_occurrences USING btree (vulnerability_id);
+CREATE INDEX index_vulnerability_reads_common_finder_query ON vulnerability_reads USING btree (project_id, state, report_type, severity, vulnerability_id DESC);
+
CREATE INDEX index_vulnerability_reads_on_cluster_agent_id ON vulnerability_reads USING btree (cluster_agent_id) WHERE (report_type = 7);
CREATE INDEX index_vulnerability_reads_on_location_image ON vulnerability_reads USING btree (location_image) WHERE (report_type = ANY (ARRAY[2, 7]));
@@ -29565,7 +29673,7 @@ CREATE INDEX tmp_gitlab_subscriptions_max_seats_used_migration ON gitlab_subscri
CREATE INDEX tmp_gitlab_subscriptions_max_seats_used_migration_2 ON gitlab_subscriptions USING btree (id) WHERE ((start_date < '2021-08-02'::date) AND (max_seats_used <> 0) AND (max_seats_used > seats_in_use) AND (max_seats_used > seats));
-CREATE INDEX tmp_idx_vulnerability_occurrences_on_id_where_report_type_7_99 ON vulnerability_occurrences USING btree (id) WHERE (report_type = ANY (ARRAY[7, 99]));
+CREATE INDEX tmp_idx_container_repos_on_non_migrated ON container_repositories USING btree (project_id, id) WHERE ((migration_state <> 'import_done'::text) AND (created_at < '2022-01-23 00:00:00'::timestamp without time zone));
CREATE INDEX tmp_index_ci_job_artifacts_on_id_where_trace_and_expire_at ON ci_job_artifacts USING btree (id) WHERE ((file_type = 3) AND (expire_at = ANY (ARRAY['2021-04-22 00:00:00+00'::timestamp with time zone, '2021-05-22 00:00:00+00'::timestamp with time zone, '2021-06-22 00:00:00+00'::timestamp with time zone, '2022-01-22 00:00:00+00'::timestamp with time zone, '2022-02-22 00:00:00+00'::timestamp with time zone, '2022-03-22 00:00:00+00'::timestamp with time zone, '2022-04-22 00:00:00+00'::timestamp with time zone])));
@@ -29575,8 +29683,16 @@ CREATE INDEX tmp_index_for_namespace_id_migration_on_group_members ON members US
CREATE INDEX tmp_index_for_namespace_id_migration_on_routes ON routes USING btree (id) WHERE ((namespace_id IS NULL) AND ((source_type)::text = 'Namespace'::text));
+CREATE INDEX tmp_index_for_null_project_namespace_id ON projects USING btree (id) WHERE (project_namespace_id IS NULL);
+
+CREATE INDEX tmp_index_for_project_namespace_id_migration_on_routes ON routes USING btree (id) WHERE ((namespace_id IS NULL) AND ((source_type)::text = 'Project'::text));
+
+CREATE INDEX tmp_index_issues_on_issue_type_and_id ON issues USING btree (issue_type, id);
+
CREATE INDEX tmp_index_members_on_state ON members USING btree (state) WHERE (state = 2);
+CREATE INDEX tmp_index_merge_requests_draft_and_status_leaky_regex ON merge_requests USING btree (id) WHERE ((draft = true) AND (state_id = 1) AND ((title)::text ~* '^\[draft\]|\(draft\)|draft:|draft|\[WIP\]|WIP:|WIP'::text) AND ((title)::text !~* '^(\[draft\]|\(draft\)|draft:|draft|\[WIP\]|WIP:|WIP)'::text));
+
CREATE INDEX tmp_index_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[]));
@@ -29607,8 +29723,12 @@ CREATE UNIQUE INDEX uniq_pkgs_debian_project_distributions_project_id_and_suite
CREATE UNIQUE INDEX unique_merge_request_metrics_by_merge_request_id ON merge_request_metrics USING btree (merge_request_id);
+CREATE UNIQUE INDEX unique_projects_on_name_namespace_id ON projects USING btree (name, namespace_id);
+
CREATE INDEX user_follow_users_followee_id_idx ON user_follow_users USING btree (followee_id);
+CREATE INDEX users_forbidden_state_idx ON users USING btree (id) WHERE ((confirmed_at IS NOT NULL) AND ((state)::text <> ALL (ARRAY['blocked'::text, 'banned'::text, 'ldap_blocked'::text])));
+
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);
@@ -30899,8 +31019,6 @@ CREATE TRIGGER chat_names_loose_fk_trigger AFTER DELETE ON chat_names REFERENCIN
CREATE TRIGGER ci_builds_loose_fk_trigger AFTER DELETE ON ci_builds REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
-CREATE TRIGGER ci_job_artifacts_loose_fk_trigger AFTER DELETE ON ci_job_artifacts REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
-
CREATE TRIGGER ci_pipelines_loose_fk_trigger AFTER DELETE ON ci_pipelines REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
CREATE TRIGGER ci_runners_loose_fk_trigger AFTER DELETE ON ci_runners REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
@@ -31168,6 +31286,9 @@ ALTER TABLE ONLY ci_pipelines
ALTER TABLE ONLY merge_request_reviewers
ADD CONSTRAINT fk_3d674b9f23 FOREIGN KEY (updated_state_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
+ALTER TABLE ONLY protected_environment_approval_rules
+ ADD CONSTRAINT fk_405568b491 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY ci_pipeline_schedule_variables
ADD CONSTRAINT fk_41c35fda51 FOREIGN KEY (pipeline_schedule_id) REFERENCES ci_pipeline_schedules(id) ON DELETE CASCADE;
@@ -31231,6 +31352,9 @@ ALTER TABLE ONLY project_access_tokens
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_6149611a04 FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL;
+ALTER TABLE ONLY deployment_approvals
+ ADD CONSTRAINT fk_61cdbdc5b9 FOREIGN KEY (approval_rule_id) REFERENCES protected_environment_approval_rules(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY dast_profile_schedules
ADD CONSTRAINT fk_61d52aa0e7 FOREIGN KEY (dast_profile_id) REFERENCES dast_profiles(id) ON DELETE CASCADE;
@@ -31261,6 +31385,9 @@ ALTER TABLE ONLY namespaces
ALTER TABLE ONLY geo_event_log
ADD CONSTRAINT fk_6ada82d42a FOREIGN KEY (container_repository_updated_event_id) REFERENCES geo_container_repository_updated_events(id) ON DELETE CASCADE;
+ALTER TABLE ONLY projects
+ ADD CONSTRAINT fk_6ca23af0a3 FOREIGN KEY (project_namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY dast_profile_schedules
ADD CONSTRAINT fk_6cca0d8800 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -31270,12 +31397,15 @@ ALTER TABLE ONLY projects
ALTER TABLE ONLY terraform_state_versions
ADD CONSTRAINT fk_6e81384d7f FOREIGN KEY (created_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
+ALTER TABLE ONLY protected_environment_approval_rules
+ ADD CONSTRAINT fk_6ee8249821 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY deploy_tokens
+ ADD CONSTRAINT fk_7082f8a288 FOREIGN KEY (creator_id) REFERENCES users(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 projects
- ADD CONSTRAINT fk_71625606ac FOREIGN KEY (project_namespace_id) REFERENCES namespaces(id) ON DELETE SET NULL;
-
ALTER TABLE ONLY integrations
ADD CONSTRAINT fk_71cce407f9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -31696,9 +31826,6 @@ ALTER TABLE ONLY ci_builds_metadata
ALTER TABLE ONLY gitlab_subscriptions
ADD CONSTRAINT fk_e2595d00a1 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-ALTER TABLE ONLY ci_builds
- ADD CONSTRAINT fk_e4ef9c2f27 FOREIGN KEY (runner_id) REFERENCES ci_runners(id) ON DELETE SET NULL NOT VALID;
-
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_e719a85f8a FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -32137,6 +32264,9 @@ ALTER TABLE ONLY requirements
ALTER TABLE ONLY metrics_dashboard_annotations
ADD CONSTRAINT fk_rails_345ab51043 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+ALTER TABLE ONLY group_features
+ ADD CONSTRAINT fk_rails_356514082b FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY wiki_page_slugs
ADD CONSTRAINT fk_rails_358b46be14 FOREIGN KEY (wiki_page_meta_id) REFERENCES wiki_page_meta(id) ON DELETE CASCADE;
@@ -32284,6 +32414,9 @@ ALTER TABLE ONLY scim_identities
ALTER TABLE ONLY snippet_user_mentions
ADD CONSTRAINT fk_rails_4d3f96b2cb FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+ALTER TABLE ONLY protected_environment_approval_rules
+ ADD CONSTRAINT fk_rails_4e554f96f5 FOREIGN KEY (protected_environment_id) REFERENCES protected_environments(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY deployment_clusters
ADD CONSTRAINT fk_rails_4e6243e120 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
diff --git a/doc/.vale/gitlab/SubstitutionWarning.yml b/doc/.vale/gitlab/SubstitutionWarning.yml
index 84d1bab3cc6..7b20887f53f 100644
--- a/doc/.vale/gitlab/SubstitutionWarning.yml
+++ b/doc/.vale/gitlab/SubstitutionWarning.yml
@@ -11,6 +11,7 @@ link: https://about.gitlab.com/handbook/communication/#top-misused-terms
level: warning
ignorecase: true
swap:
+ air(?:-| )?gapped: offline environment
click: select
code base: codebase
config: configuration
diff --git a/doc/.vale/gitlab/Uppercase.yml b/doc/.vale/gitlab/Uppercase.yml
index f1b06e10fe6..6093565fd7c 100644
--- a/doc/.vale/gitlab/Uppercase.yml
+++ b/doc/.vale/gitlab/Uppercase.yml
@@ -22,6 +22,7 @@ exceptions:
- ARN
- ASCII
- AWS
+ - BMP
- BSD
- CAS
- CDN
@@ -69,6 +70,7 @@ exceptions:
- GID
- GIF
- GKE
+ - GLFM
- GNU
- GPG
- GPL
@@ -85,6 +87,7 @@ exceptions:
- IAM
- IANA
- IBM
+ - ICO
- IDE
- IID
- IMAP
@@ -124,9 +127,9 @@ exceptions:
- PEM
- PEP
- PGP
+ - PHP
- PID
- PKCS
- - PHP
- PNG
- POSIX
- POST
@@ -136,6 +139,7 @@ exceptions:
- RBAC
- RDP
- RDS
+ - RDS
- REST
- RFC
- RHEL
@@ -143,7 +147,6 @@ exceptions:
- RPM
- RPS
- RSA
- - RDS
- RSS
- RTC
- RVM
@@ -161,6 +164,7 @@ exceptions:
- SFTP
- SHA
- SLA
+ - SLI
- SMS
- SMTP
- SOC
@@ -168,6 +172,7 @@ exceptions:
- SPDX
- SPF
- SQL
+ - SRE
- SSD
- SSG
- SSH
@@ -185,9 +190,9 @@ exceptions:
- TOML
- TOTP
- TTL
- - UID
- UDP
- UID
+ - UID
- UNIX
- URI
- URL
@@ -198,6 +203,7 @@ exceptions:
- VCS
- VPC
- VPN
+ - WEBP
- WIP
- WSL
- XML
diff --git a/doc/.vale/gitlab/Wordy.yml b/doc/.vale/gitlab/Wordy.yml
index 716fdc6c38d..7888d16dadb 100644
--- a/doc/.vale/gitlab/Wordy.yml
+++ b/doc/.vale/gitlab/Wordy.yml
@@ -14,3 +14,4 @@ swap:
needs? to: "Rewrite the sentence, or use 'must', instead of"
note that: "Be concise: rewrite the sentence to not use"
please: "Remove this word from the sentence: "
+ respectively: "Rewrite the sentence to be more precise, instead of using "
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index 6dc0704963b..76e8f99b5db 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -90,6 +90,7 @@ Caddy
callstack
callstacks
Camo
+canonicalization
canonicalized
captcha
CentOS
@@ -517,6 +518,7 @@ reinitialize
reinitializing
relicensing
remediations
+renderers
replicables
repmgr
repmgrd
@@ -524,6 +526,7 @@ repurposing
requeue
requeued
requeues
+requeuing
Restlet
resync
resynced
@@ -576,7 +579,6 @@ severities
sharded
sharding
shfmt
-Shibboleth
Shimo
Shopify
Sidekiq
@@ -594,6 +596,7 @@ Sobelow
Solargraph
Solarized
Sourcegraph
+spammable
sparkline
sparklines
spidering
@@ -645,6 +648,8 @@ subtrees
sudo
supercookie
supercookies
+superset
+supersets
supertype
supertypes
swappiness
diff --git a/doc/administration/audit_event_streaming.md b/doc/administration/audit_event_streaming.md
index ca59dff7ef4..6cf630ad079 100644
--- a/doc/administration/audit_event_streaming.md
+++ b/doc/administration/audit_event_streaming.md
@@ -23,11 +23,11 @@ GitLab can stream a single event more than once to the same destination. Use the
## Add a new event streaming destination
WARNING:
-Event streaming destinations will receive **all** audit event data, which could include sensitive information. Make sure you trust the destination endpoint.
+Event streaming destinations receive **all** audit event data, which could include sensitive information. Make sure you trust the destination endpoint.
-### Add event streaming destination using GitLab UI
+### Use the GitLab UI
-Users with at least the Owner role of a group can add event streaming destinations for it:
+Users with at least the Owner role for a group can add event streaming destinations for it:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Security & Compliance > Audit events**
@@ -41,10 +41,10 @@ Event streaming is enabled if:
- No warning is shown.
- The added endpoint is displayed in the UI.
-### Add event streaming destination using the API
+### Use the API
-To enable event streaming, a group owner must add a new event streaming destination using the `externalAuditEventDestinationCreate` mutation
-in the GraphQL API.
+To enable event streaming and add a destination, users with at least the Owner role for a group must use the
+`externalAuditEventDestinationCreate` mutation in the GraphQL API.
```graphql
mutation {
@@ -66,19 +66,24 @@ Event streaming is enabled if:
- The returned `errors` object is empty.
- The API responds with `200 OK`.
-## List currently enabled streaming destinations
+## List streaming destinations
-### List currently enabled streaming destination using GitLab UI
+Users with at least the Owner role for a group can list event streaming destinations.
-Users with at least the Owner role of a group can list event streaming destinations:
+### Use the GitLab UI
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/336411) in GitLab 14.9.
+
+Users with at least the Owner role for a group can list event streaming destinations:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Security & Compliance > Audit events**
1. On the main area, select **Streams** tab.
-### List currently enabled streaming destinations using the API
+### Use the API
-Group owners can view a list of event streaming destinations at any time using the `externalAuditEventDestinations` query type.
+Users with at least the Owner role for a group can view a list of event streaming destinations at any time using the
+`externalAuditEventDestinations` query type.
```graphql
query {
@@ -97,27 +102,34 @@ query {
If the resulting list is empty, then audit event streaming is not enabled for that group.
-## Delete currently enabled streaming destination
+## Delete streaming destinations
-Group Owners can delete event streaming destinations at any time using the `deleteAuditEventDestinations` mutation type.
+Users with at least the Owner role for a group can delete event streaming destinations using the
+`deleteAuditEventDestinations` mutation type.
+
+When the last destination is successfully deleted, event streaming is disabled for the group.
-### Delete currently enabled streaming using GitLab UI
+### Use the GitLab UI
-Uses with at least the Owner role of a group can delete event streaming destination.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/336411) in GitLab 14.9.
+
+Users with at least the Owner role for a group can delete event streaming destinations.
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Security & Compliance > Audit events**
1. On the main area, select **Streams** tab.
1. Select **{remove}** at the right side of each item.
-The external streaming destination is delete when:
+The external streaming destination is deleted when:
- No warning is shown.
- The deleted endpoint is not displayed in the UI.
-### Delete currently enabled streaming using the API
+### Use the API
-You can delete an event streaming destination by specifying an ID. Get the required ID by [listing the details](audit_event_streaming.md#list-currently-enabled-streaming-destinations-using-the-api) of event streaming destinations.
+Delete an event streaming destination by specifying an ID. Get the required ID by
+[listing the details](audit_event_streaming.md#use-the-api-1) of event
+streaming destinations.
```graphql
@@ -134,8 +146,6 @@ Destination is deleted if:
- The returned `errors` object is empty.
- The API responds with `200 OK`.
-When the last destination is successfully deleted, event streaming is disabled for the group.
-
## Verify event authenticity
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345424) in GitLab 14.8.
@@ -144,7 +154,7 @@ Each streaming destination has a unique verification token (`verificationToken`)
token is generated when the event destination is created and cannot be changed.
Each streamed event contains a random alphanumeric identifier for the `X-Gitlab-Event-Streaming-Token` HTTP header that can be verified against
-the destination's value when [listing streaming destinations](#list-currently-enabled-streaming-destinations).
+the destination's value when [listing streaming destinations](#list-streaming-destinations).
## Audit event streaming on Git operations
@@ -155,7 +165,7 @@ On self-managed GitLab, by default this feature is not available. To make it ava
Streaming audit events can be sent when signed-in users push or pull a project's remote Git repositories:
-- [Using SSH](../ssh/index.md).
+- [Using SSH](../user/ssh.md).
- Using HTTP or HTTPS.
- Using the **Download** button (**{download}**) in GitLab UI.
@@ -163,9 +173,9 @@ Audit events are not captured for users that are not signed in. For example, whe
To configure streaming audit events for Git operations, see [Add a new event streaming destination](#add-a-new-event-streaming-destination).
-### Request headers
+### Headers
-Request headers are formatted as follows:
+Headers are formatted as follows:
```plaintext
POST /logs HTTP/1.1
@@ -174,7 +184,7 @@ Content-Type: application/x-www-form-urlencoded
X-Gitlab-Event-Streaming-Token: <DESTINATION_TOKEN>
```
-### Example responses for SSH events
+### Example payloads for SSH events
Fetch:
@@ -236,7 +246,7 @@ Push:
}
```
-### Example responses for HTTP and HTTPS events
+### Example payloads for HTTP and HTTPS events
Fetch:
@@ -298,7 +308,7 @@ Push:
}
```
-### Example responses for events from GitLab UI download button
+### Example payloads for events from GitLab UI download button
Fetch:
@@ -333,9 +343,9 @@ Fetch:
Stream audit events that relate to merge approval actions performed within a project.
-### Request headers
+### Headers
-Request headers are formatted as follows:
+Headers are formatted as follows:
```plaintext
POST /logs HTTP/1.1
@@ -344,7 +354,7 @@ Content-Type: application/x-www-form-urlencoded
X-Gitlab-Event-Streaming-Token: <DESTINATION_TOKEN>
```
-### Example request body
+### Example payload
```json
{
diff --git a/doc/administration/auditor_users.md b/doc/administration/auditor_users.md
index 7c89f34ce61..b3304fd1cbd 100644
--- a/doc/administration/auditor_users.md
+++ b/doc/administration/auditor_users.md
@@ -61,8 +61,7 @@ To create an Auditor user:
1. On the left sidebar, select **Overview > Users**.
1. Create a new user or edit an existing one, and in the **Access** section
select Auditor.
-1. Select **Create user** or **Save changes** if you created a new user or
- edited an existing one respectively.
+1. If you created a user, select **Create user**. For an existing user, select **Save changes**.
To revoke Auditor permissions from a user, make them a Regular user by
following the previous steps.
diff --git a/doc/administration/auth/index.md b/doc/administration/auth/index.md
index d09344629e2..fca4f163075 100644
--- a/doc/administration/auth/index.md
+++ b/doc/administration/auth/index.md
@@ -31,7 +31,6 @@ providers:
- [Salesforce](../../integration/salesforce.md)
- [SAML](../../integration/saml.md)
- [SAML for GitLab.com groups](../../user/group/saml_sso/index.md) **(PREMIUM SAAS)**
-- [Shibboleth](../../integration/saml.md)
- [Smartcard](smartcard.md) **(PREMIUM SELF)**
- [Twitter](../../integration/twitter.md)
diff --git a/doc/administration/auth/ldap/index.md b/doc/administration/auth/ldap/index.md
index 2a396c4d53a..a7e070b755a 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -518,7 +518,7 @@ GitLab doesn't support TLS client authentication. Complete these steps on your L
The TLS client authentication setting in your LDAP server cannot be mandatory and clients cannot be
authenticated with the TLS protocol.
-## Deleting users
+## Users deleted from LDAP
Users deleted from the LDAP server:
@@ -531,6 +531,16 @@ However, these users can continue to use Git with SSH until the next time the
To delete the account immediately, you can manually
[block the user](../../../user/admin_area/moderate_users.md#block-a-user).
+## Updating user email addresses
+
+Email addresses on the LDAP server are considered the source of truth for users when LDAP is used to sign in. Updating user email
+addresses must be done on the LDAP server that manages the user. The email address for GitLab is updated either:
+
+- When the user next signs in.
+- When the next [user sync](ldap_synchronization.md#user-sync) is run.
+
+The updated user's previous email address becomes the secondary email address to preserve that user's commit history.
+
## Google Secure LDAP
> Introduced in GitLab 11.9.
diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md
index b8391bec72f..5c5d5aaffe8 100644
--- a/doc/administration/auth/ldap/ldap-troubleshooting.md
+++ b/doc/administration/auth/ldap/ldap-troubleshooting.md
@@ -71,7 +71,28 @@ options = {
filter: Net::LDAP::Filter.eq('cn', '*'),
# :attributes is optional
- # the attributes we want to get returnedk
+ # the attributes we want to get returned
+ attributes: %w(dn cn memberuid member submember uniquemember memberof)
+}
+adapter.ldap_search(options)
+```
+
+When using OIDs in the filter, replace `Net::LDAP::Filter.eq` with `Net::LDAP::Filter.construct`:
+
+```ruby
+adapter = Gitlab::Auth::Ldap::Adapter.new('ldapmain')
+options = {
+ # :base is required
+ # use .base or .group_base
+ base: adapter.config.base,
+
+ # :filter is optional
+ # This filter includes OID 1.2.840.113556.1.4.1941
+ # It will search for all direct and nested members of the group gitlab_grp in the LDAP directory
+ filter: Net::LDAP::Filter.construct("(memberOf:1.2.840.113556.1.4.1941:=CN=gitlab_grp,DC=example,DC=com)"),
+
+ # :attributes is optional
+ # the attributes we want to get returned
attributes: %w(dn cn memberuid member submember uniquemember memberof)
}
adapter.ldap_search(options)
diff --git a/doc/administration/auth/oidc.md b/doc/administration/auth/oidc.md
index a099b9c76f8..561cbd1b3ae 100644
--- a/doc/administration/auth/oidc.md
+++ b/doc/administration/auth/oidc.md
@@ -471,7 +471,7 @@ For your app, complete the following steps on Casdoor:
1. Add your GitLab redirect URL. For example, if your GitLab domain is `gitlab.example.com`, ensure the Casdoor app has the following
`Redirect URI`: `https://gitlab.example.com/users/auth/openid_connect/callback`.
-See the [Casdoor documentation](https://casdoor.org/docs/integration/gitlab) for more details.
+See the [Casdoor documentation](https://casdoor.org/docs/integration/gitlab/) for more details.
Example Omnibus GitLab configuration (file path: `/etc/gitlab/gitlab.rb`):
diff --git a/doc/administration/clusters/kas.md b/doc/administration/clusters/kas.md
index e5c371b9d40..82bb1a35e02 100644
--- a/doc/administration/clusters/kas.md
+++ b/doc/administration/clusters/kas.md
@@ -116,7 +116,7 @@ If you get the following error message:
The project specified by the manifest (`root/kas-manifest001`)
doesn't exist or the project where the manifest is kept is private. To fix this issue,
-ensure the project path is correct and that the project's visibility is [set to public](../../public_access/public_access.md).
+ensure the project path is correct and that the project's visibility is [set to public](../../user/public_access.md).
### Configuration file not found
diff --git a/doc/administration/compliance.md b/doc/administration/compliance.md
index 7c3f36c71c2..99c291379f1 100644
--- a/doc/administration/compliance.md
+++ b/doc/administration/compliance.md
@@ -82,7 +82,7 @@ These features can help provide visibility into GitLab and audit what is happeni
These features can also help with compliance requirements:
-- [**Email all users of a project, group, or entire server**](../tools/email.md)
+- [**Email all users of a project, group, or entire server**](../user/admin_area/email_from_gitlab.md)
(for instances): An administrator can email groups of users based on project
or group membership, or email everyone using the GitLab instance. These emails
are great for scheduled maintenance or upgrades.
diff --git a/doc/administration/file_hooks.md b/doc/administration/file_hooks.md
index e041f1e11c6..4ddca58c774 100644
--- a/doc/administration/file_hooks.md
+++ b/doc/administration/file_hooks.md
@@ -15,12 +15,12 @@ without modifying the GitLab source code.
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.
+see the [system hooks](system_hooks.md) documentation.
NOTE:
File hooks must be configured on the file system of the GitLab server. Only GitLab
server administrators can complete these tasks. Explore
-[system hooks](../system_hooks/system_hooks.md) or [webhooks](../user/project/integrations/webhooks.md)
+[system hooks](system_hooks.md) or [webhooks](../user/project/integrations/webhooks.md)
as an option if you do not have file system access.
Instead of writing and supporting your own file hook, you can also make changes
@@ -52,7 +52,7 @@ Follow the steps below to set up a custom hook:
language type. For example, if the script is in Ruby the shebang will
probably be `#!/usr/bin/env ruby`.
1. The data to the file hook is provided as JSON on STDIN. It is exactly the
- same as for [system hooks](../system_hooks/system_hooks.md).
+ same as for [system hooks](system_hooks.md).
That's it! Assuming the file hook code is properly implemented, the hook fires
as appropriate. The file hooks file list is updated for each event, there is no
diff --git a/doc/administration/geo/disaster_recovery/planned_failover.md b/doc/administration/geo/disaster_recovery/planned_failover.md
index 939b4aec968..2a21bda23d7 100644
--- a/doc/administration/geo/disaster_recovery/planned_failover.md
+++ b/doc/administration/geo/disaster_recovery/planned_failover.md
@@ -42,6 +42,38 @@ Repository-centric strategies for using `rsync` effectively can be found in the
[moving repositories](../../operations/moving_repositories.md) documentation; these strategies can
be adapted for use with any other file-based data, such as [GitLab Pages](../../pages/index.md#change-storage-path).
+### Container registry
+
+By default, the container registry is not automatically replicated to secondary
+sites and this needs to be manually configured, see [Docker Registry for a secondary site](../replication/docker_registry.md).
+
+If you are using local storage on your current primary site for the container
+registry, you can `rsync` the container registry objects to the secondary
+site you are about to failover to:
+
+```shell
+# Run from the secondary site
+rsync --archive --perms --delete root@<geo-primary>:/var/opt/gitlab/gitlab-rails/shared/registry/. /var/opt/gitlab/gitlab-rails/shared/registry
+```
+
+Alternatively, you can [back up](../../../raketasks/backup_restore.md#back-up-gitlab)
+the container registry on the primary site and restore it onto the secondary
+site:
+
+1. On your primary site, back up only the registry and [exclude specific directories
+from the backup](../../../raketasks/backup_restore.md#excluding-specific-directories-from-the-backup):
+
+ ```shell
+ # Create a backup in the /var/opt/gitlab/backups folder
+ sudo gitlab-backup create SKIP=db,uploads,builds,artifacts,lfs,terraform_state,pages,repositories,packages
+ ```
+
+1. Copy the backup tarball generated from your primary site to the `/var/opt/gitlab/backups` folder
+on your secondary site.
+
+1. On your secondary site, restore the registry following the [Restore GitLab](../../../raketasks/backup_restore.md#restore-gitlab)
+documentation.
+
## Preflight checks
NOTE:
diff --git a/doc/administration/geo/replication/geo_validation_tests.md b/doc/administration/geo/replication/geo_validation_tests.md
index 70b3eaf5fea..e4432c41ff1 100644
--- a/doc/administration/geo/replication/geo_validation_tests.md
+++ b/doc/administration/geo/replication/geo_validation_tests.md
@@ -208,4 +208,16 @@ The following are additional validation tests we performed.
- Description: Tested the average time it takes for a single image to replicate from the primary object storage location to the secondary when using Azure based object storage replication and [GitLab based object storage replication](object_storage.md#enabling-gitlab-managed-object-storage-replication). This was tested by uploading a 1mb image to a project on the primary site every second for 60 seconds. The time was then measured until a image was available on the secondary site. This was achieved using a [Ruby Script](https://gitlab.com/gitlab-org/quality/geo-replication-tester).
- Outcome: When using Azure based replication the average time for an image to replicate from the primary object storage to the secondary was recorded as 40 seconds, the longest replication time was 70 seconds and the quickest was 11 seconds. When using GitLab based replication the average time for replication to complete was 5 seconds, the longest replication time was 10 seconds and the quickest was 3 seconds.
- Follow up issue:
- - [Test and validate object storage replication performance on reference architectures](https://gitlab.com/gitlab-org/gitlab/-/issues/347314)
+ - [Validate Cross Region Object storage replication using Azure based object storage](https://gitlab.com/gitlab-org/gitlab/-/issues/358154)
+
+### April 2022
+
+[Validate Object storage replication using AWS based object storage](https://gitlab.com/gitlab-org/gitlab/-/issues/351463):
+
+- Description: Tested the average time it takes for a single image to replicate from the primary object storage location to the secondary when using AWS based object storage replication and [GitLab based object storage replication](object_storage.md#enabling-gitlab-managed-object-storage-replication). This was tested by uploading a 1mb image to a project on the primary site every second for 60 seconds. The time was then measured until a image was available on the secondary site. This was achieved using a [Ruby Script](https://gitlab.com/gitlab-org/quality/geo-replication-tester).
+- Outcome: When using AWS managed replication the average time for an image to replicate between sites is about 49 seconds, this is true for when sites are located within the same region and when they are further apart (Europe to America). When using Geo managed replication within the same region the average time for replication took just 5 seconds, however when replicating cross region the average time rose to 33 seconds.
+
+[Validate Object storage replication using GCP based object storage](https://gitlab.com/gitlab-org/gitlab/-/issues/351464):
+
+- Description: Tested the average time it takes for a single image to replicate from the primary object storage location to the secondary when using GCP based object storage replication and [GitLab based object storage replication](object_storage.md#enabling-gitlab-managed-object-storage-replication). This was tested by uploading a 1mb image to a project on the primary site every second for 60 seconds. The time was then measured until a image was available on the secondary site. This was achieved using a [Ruby Script](https://gitlab.com/gitlab-org/quality/geo-replication-tester).
+- Outcome: GCP handles replication differently than other Cloud Providers. In GCP, the process is to a create single bucket that is either multi, dual or single region based. This means that the bucket will automatically store replicas in a region based on the option chosen. Even when using multi region, this will still only replicate within a single continent, the options being America, Europe, or Asia. At current there doesn't seem to be any way to replicate objects between continents using GCP based replication. For Geo managed replication the average time when replicating within the same region was 6 seconds, and when replicating cross region this rose to just 9 seconds.
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index 8f55ce99787..871d6041066 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -88,29 +88,49 @@ node running Rails (Puma, Sidekiq, or Geo Log Cursor) on the Geo **secondary** s
sudo gitlab-rake geo:status
```
-Example output:
+The output includes:
+
+- a count of "failed" items if any failures occurred
+- the percentage of "succeeded" items, relative to the "total"
+
+Example:
```plaintext
http://secondary.example.com/
-----------------------------------------------------
- GitLab Version: 11.10.4-ee
+ GitLab Version: 14.9.2-ee
Geo Role: Secondary
Health Status: Healthy
- Repositories: 289/289 (100%)
- Verified Repositories: 289/289 (100%)
- Wikis: 289/289 (100%)
- Verified Wikis: 289/289 (100%)
- LFS Objects: 8/8 (100%)
- Attachments: 5/5 (100%)
- CI job artifacts: 0/0 (0%)
- Repositories Checked: 0/289 (0%)
+ Repositories: succeeded 12345 / total 12345 (100%)
+ Verified Repositories: succeeded 12345 / total 12345 (100%)
+ Wikis: succeeded 6789 / total 6789 (100%)
+ Verified Wikis: succeeded 6789 / total 6789 (100%)
+ Attachments: succeeded 4 / total 4 (100%)
+ CI job artifacts: succeeded 0 / total 0 (0%)
+ Design repositories: succeeded 1 / total 1 (100%)
+ LFS Objects: failed 1 / succeeded 2 / total 3 (67%)
+ Merge Request Diffs: succeeded 0 / total 0 (0%)
+ Package Files: failed 1 / succeeded 2 / total 3 (67%)
+ Terraform State Versions: failed 1 / succeeded 2 / total 3 (67%)
+ Snippet Repositories: failed 1 / succeeded 2 / total 3 (67%)
+ Group Wiki Repositories: succeeded 4 / total 4 (100%)
+ Pipeline Artifacts: failed 3 / succeeded 0 / total 3 (0%)
+ Pages Deployments: succeeded 0 / total 0 (0%)
+ Repositories Checked: failed 5 / succeeded 0 / total 5 (0%)
+ Package Files Verified: succeeded 0 / total 10 (0%)
+ Terraform State Versions Verified: succeeded 0 / total 10 (0%)
+ Snippet Repositories Verified: succeeded 99 / total 100 (99%)
+ Pipeline Artifacts Verified: succeeded 0 / total 10 (0%)
Sync Settings: Full
Database replication lag: 0 seconds
- Last event ID seen from primary: 10215 (about 2 minutes ago)
- Last event ID processed by cursor: 10215 (about 2 minutes ago)
- Last status report was: 2 minutes ago
+ Last event ID seen from primary: 12345 (about 2 minutes ago)
+ Last event ID processed by cursor: 12345 (about 2 minutes ago)
+ Last status report was: 1 minute ago
```
+To find more details about failed items, check
+[the `gitlab-rails/geo.log` file](../../troubleshooting/log_parsing.md#find-most-common-geo-sync-errors)
+
### Check if PostgreSQL replication is working
To check if PostgreSQL replication is working, check if:
diff --git a/doc/administration/geo/replication/usage.md b/doc/administration/geo/replication/usage.md
index b1183e56cd0..d96bfae78a1 100644
--- a/doc/administration/geo/replication/usage.md
+++ b/doc/administration/geo/replication/usage.md
@@ -27,7 +27,7 @@ Everything up-to-date
```
NOTE:
-If you're using HTTPS instead of [SSH](../../../ssh/index.md) to push to the secondary,
+If you're using HTTPS instead of [SSH](../../../user/ssh.md) to push to the secondary,
you can't store credentials in the URL like `user:password@URL`. Instead, you can use a
[`.netrc` file](https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html)
for Unix-like operating systems or `_netrc` for Windows. In that case, the credentials
diff --git a/doc/administration/geo/replication/version_specific_updates.md b/doc/administration/geo/replication/version_specific_updates.md
index d3bc54775f4..b0797445890 100644
--- a/doc/administration/geo/replication/version_specific_updates.md
+++ b/doc/administration/geo/replication/version_specific_updates.md
@@ -12,7 +12,7 @@ for updating Geo sites.
## Updating to 14.9
-**DO NOT** update to GitLab 14.9.0.
+**DO NOT** update to GitLab 14.9.0.
We've discovered an issue with Geo's CI verification feature that may [cause job traces to be lost](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/6664). This issue will be fixed in the next patch release.
diff --git a/doc/administration/get_started.md b/doc/administration/get_started.md
index e6a2e833af3..b2bdd876499 100644
--- a/doc/administration/get_started.md
+++ b/doc/administration/get_started.md
@@ -20,7 +20,7 @@ Authentication is the first step in making your installation secure.
This one-time secret code is an additional safeguard that keeps intruders out, even if they have your password.
- Add a backup email. If you lose access to your account, the GitLab Support team can help you more quickly.
- Save or print your recovery codes. If you can't access your authentication device, you can use these recovery codes to sign in to your GitLab account.
- - Add [an SSH key](../ssh/index.md) to your profile. You can generate new recovery codes as needed with SSH.
+ - Add [an SSH key](../user/ssh.md) to your profile. You can generate new recovery codes as needed with SSH.
- Enable [personal access tokens](../user/profile/personal_access_tokens.md). When using 2FA, you can use these tokens to access the GitLab API.
## Projects and groups
@@ -62,9 +62,10 @@ You may need to import projects from external sources like GitHub, Bitbucket, or
### Popular project imports
-- [GitHub Enterprise to self-managed GitLab](../integration/github.md): Enabling OAuth makes it easier for developers to find and import their projects.
-- [Bitbucket Server](../user/project/import/bitbucket_server.md#limitations): There are certain data limitations.
- For assistance with these data types, contact your GitLab account manager or GitLab Support about our professional migration services.
+- [GitHub Enterprise to self-managed GitLab](../integration/github.md)
+- [Bitbucket Server](../user/project/import/bitbucket_server.md)
+
+For assistance with these data types, contact your GitLab account manager or GitLab Support about our professional migration services.
## GitLab instance security
diff --git a/doc/administration/gitaly/configure_gitaly.md b/doc/administration/gitaly/configure_gitaly.md
index 88efd1885db..0fb285c50d6 100644
--- a/doc/administration/gitaly/configure_gitaly.md
+++ b/doc/administration/gitaly/configure_gitaly.md
@@ -300,7 +300,7 @@ disable enforcement. For more information, see the documentation on configuring
```toml
listen_addr = '0.0.0.0:8075'
- internal_socket_dir = '/var/opt/gitlab/gitaly'
+ runtime_dir = '/var/opt/gitlab/gitaly'
[logging]
format = 'json'
@@ -308,6 +308,9 @@ disable enforcement. For more information, see the documentation on configuring
dir = '/var/log/gitaly'
```
+ For GitLab 14.9 and earlier, set `internal_socket_dir = '/var/opt/gitlab/gitaly'` instead
+ of `runtime_dir`.
+
1. Append the following to `/home/git/gitaly/config.toml` for each respective Gitaly server:
On `gitaly1.internal`:
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index f88a1aa2b4d..8e4464bba43 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -43,23 +43,26 @@ repository storage is either:
- Read requests are distributed between multiple Gitaly nodes, which can improve performance.
- Write requests are broadcast to repository replicas.
-## Guidance regarding Gitaly Cluster
+## Before deploying 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.
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management.
+Before deploying Gitaly Cluster, please review:
-- [Known issues](#known-issues)
+- Existing [known issues](#known-issues).
- [Snapshot limitations](#snapshot-backup-and-recovery-limitations).
+- [Configuration guidance](configure_gitaly.md) and [Repository storage options](../repository_storage_paths.md) to make
+ sure that Gitaly Cluster is the best setup for you.
-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:
-- 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.
+- Not yet migrated to Gitaly Cluster and want to continue using NFS, remain on the service you are using. NFS is
+ supported in 14.x releases but is [deprecated](../../update/deprecations.md#nfs-for-git-repository-storage).
+Support for storing Git repository data on NFS will end for all versions of GitLab with the release of 15.0.
+- Not yet migrated to Gitaly Cluster but want to migrate away from NFS, you have two options:
+ - A sharded Gitaly instance.
+ - Gitaly Cluster.
-Reach out to your Technical Account Manager or customer support if you have any questions.
+Contact your Technical Account Manager or customer support if you have any questions.
### Known issues
@@ -69,19 +72,20 @@ the current status of these issues, please refer to the referenced issues and ep
| Issue | Summary | How to avoid |
|:--------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------|
| Gitaly Cluster + Geo - Issues retrying failed syncs | If Gitaly Cluster is used on a Geo secondary site, repositories that have failed to sync could continue to fail when Geo tries to resync them. Recovering from this state requires assistance from support to run manual steps. Work is in-progress to update Gitaly Cluster to [identify repositories with a unique and persistent identifier](https://gitlab.com/gitlab-org/gitaly/-/issues/3485), which is expected to resolve the issue. | No known solution at this time. |
-| 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 must restore from backup, it's best to snapshot all Gitaly Cluster nodes at the same time and take a database dump of the Praefect database. |
### Snapshot backup and recovery limitations
-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.
+Gitaly Cluster does not support snapshot backups. Snapshot backups can cause issues where the Praefect database becomes
+out of sync with the disk storage. Because of how Praefect rebuilds the replication metadata of Gitaly disk information
+during a restore, 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).
+If you are unable to use this method, please contact customer support for restoration help.
+
+We are tracking in [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351383) improvements to the
+[official backup and restore Rake tasks](../../raketasks/backup_restore.md) to add support for incremental backups. For
+more information, see [this epic](https://gitlab.com/groups/gitlab-org/-/epics/2094).
### What to do if you are on Gitaly Cluster experiencing an issue or limitation
@@ -361,7 +365,8 @@ For more information on configuring Gitaly Cluster, see [Configure Gitaly Cluste
## Migrating to Gitaly Cluster
-Please see [current guidance on Gitaly Cluster](#guidance-regarding-gitaly-cluster). The basic process for migrating to Gitaly Cluster involves:
+See the [Before deploying Gitaly Cluster](#before-deploying-gitaly-cluster) section before continuing. 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).
@@ -378,16 +383,14 @@ NOTE:
GitLab requires a `default` repository storage to be configured.
[Read more about this limitation](configure_gitaly.md#gitlab-requires-a-default-repository-storage).
-### Migrate off Gitaly Cluster
+## 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:
+If the limitations and tradeoffs of Gitaly Cluster are found to be not suitable for your environment, you can Migrate
+off Gitaly Cluster to a sharded Gitaly instance:
-1. Create and configure a new
- [Gitaly server](configure_gitaly.md#run-gitaly-on-its-own-server).
-1. [Move the repositories](../operations/moving_repositories.md#move-repositories)
- to the newly created storage. You can move them by shard or by group, which gives you the opportunity to spread them over
- multiple Gitaly servers.
+1. Create and configure a new [Gitaly server](configure_gitaly.md#run-gitaly-on-its-own-server).
+1. [Move the repositories](../operations/moving_repositories.md#move-repositories) to the newly created storage. You can
+ move them by shard or by group, which gives you the opportunity to spread them over multiple Gitaly servers.
## Monitor Gitaly and Gitaly Cluster
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index d7a06994b6c..7dee12a6690 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -231,6 +231,16 @@ instructions only work on Omnibus-provided PostgreSQL:
The database used by Praefect is now configured.
+You can now configure Praefect to use the database:
+
+```ruby
+praefect['database_host'] = POSTGRESQL_HOST
+praefect['database_port'] = 5432
+praefect['database_user'] = 'praefect'
+praefect['database_password'] = PRAEFECT_SQL_PASSWORD
+praefect['database_dbname'] = 'praefect_production'
+```
+
If you see Praefect database errors after configuring PostgreSQL, see
[troubleshooting steps](troubleshooting.md#relation-does-not-exist-errors).
@@ -619,7 +629,7 @@ Note the following:
environment variable so that the Gitaly certificate is trusted. For example:
```shell
- sudo SSL_CERT_DIR=/etc/gitlab/trusted_certs /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dial-nodes
+ sudo SSL_CERT_DIR=/etc/gitlab/trusted-certs /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dial-nodes
```
- You can configure Praefect servers with both an unencrypted listening address
@@ -1197,7 +1207,7 @@ You can configure:
```
If `default_replication_factor` is unset, the repositories are always replicated on every node defined in `virtual_storages`. If a new
-node is introduced to the virtual storage, both new and existing repositories are replicated to the node automatically.
+node is introduced to the virtual storage, both new and existing repositories are replicated to the node automatically.
## Automatic failover and primary election strategies
diff --git a/doc/administration/gitaly/troubleshooting.md b/doc/administration/gitaly/troubleshooting.md
index 516af4ca469..1be0bf23ed5 100644
--- a/doc/administration/gitaly/troubleshooting.md
+++ b/doc/administration/gitaly/troubleshooting.md
@@ -16,7 +16,8 @@ Before troubleshooting, see the Gitaly and Gitaly Cluster
The following sections provide possible solutions to Gitaly errors.
-See also [Gitaly timeout](../../user/admin_area/settings/gitaly_timeouts.md) settings.
+See also [Gitaly timeout](../../user/admin_area/settings/gitaly_timeouts.md) settings,
+and our advice on [parsing the `gitaly/current` file](../troubleshooting/log_parsing.md#parsing-gitalycurrent).
### Check versions when using standalone Gitaly servers
@@ -614,7 +615,7 @@ Possible solutions:
## Profiling Gitaly
Gitaly exposes several of Golang's built-in performance profiling tools on the Prometheus listen port. For example, if Prometheus is listening
-on port `9236` of the GitLab server:
+on port `9236` of the GitLab server:
- Get a list of running `goroutines` and their backtraces:
diff --git a/doc/administration/housekeeping.md b/doc/administration/housekeeping.md
index 4de48aa3f14..71b8439f70a 100644
--- a/doc/administration/housekeeping.md
+++ b/doc/administration/housekeeping.md
@@ -40,8 +40,6 @@ The following housekeeping options are available:
- **Enable automatic repository housekeeping**: Regularly run `git repack` and `git gc`. If you
keep this setting disabled for a long time, Git repository access on your GitLab server becomes
slower and your repositories use more disk space.
-- **Enable Git pack file bitmap creation**: Create pack file bitmaps which accelerates `git clone`
- performance. Makes housekeeping take a little longer.
- **Incremental repack period**: Number of Git pushes after which an incremental `git repack` is
run.
- **Full repack period**: Number of Git pushes after which a full `git repack` is run.
diff --git a/doc/administration/incoming_email.md b/doc/administration/incoming_email.md
index caade32b7c2..63f8ce3c4cb 100644
--- a/doc/administration/incoming_email.md
+++ b/doc/administration/incoming_email.md
@@ -564,7 +564,7 @@ to receive sub-addressed mail.
To enable sub-addressing:
-1. Download and install the `ExchangeOnlineManagement` module from the [PowerShell gallery](https://www.powershellgallery.com/packages/ExchangeOnlineManagement/).
+1. Download and install the `ExchangeOnlineManagement` module from the [PowerShell gallery](https://www.powershellgallery.com/packages/ExchangeOnlineManagement/2.0.5).
1. In PowerShell, run the following commands:
```powershell
@@ -766,6 +766,8 @@ This example for Omnibus GitLab assumes you're using the following mailbox: `inc
##### Configure Microsoft Graph
+> Alternative Azure deployments [introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5978) in GitLab 14.9.
+
```ruby
gitlab_rails['incoming_email_enabled'] = true
@@ -788,4 +790,19 @@ gitlab_rails['incoming_email_inbox_options'] = {
}
```
+For Microsoft Cloud for US Government or [other Azure deployments](https://docs.microsoft.com/en-us/graph/deployments), configure the `azure_ad_endpoint` and `graph_endpoint` settings.
+
+- Example for Microsoft Cloud for US Government:
+
+```ruby
+gitlab_rails['incoming_email_inbox_options'] = {
+ 'azure_ad_endpoint': 'https://login.microsoftonline.us',
+ 'graph_endpoint': 'https://graph.microsoft.us',
+ 'tenant_id': '<YOUR-TENANT-ID>',
+ 'client_id': '<YOUR-CLIENT-ID>',
+ 'client_secret': '<YOUR-CLIENT-SECRET>',
+ 'poll_interval': 60 # Optional
+}
+```
+
The Microsoft Graph API is not yet supported in source installations. See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/326169) for more details.
diff --git a/doc/administration/index.md b/doc/administration/index.md
index 50dc2bc905a..73ea4a8e1d0 100644
--- a/doc/administration/index.md
+++ b/doc/administration/index.md
@@ -32,7 +32,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Install](../install/index.md): Requirements, directory structures, and installation methods.
- [Reference architectures](reference_architectures/index.md): Add additional resources to support more users.
- - [Installing GitLab on Amazon Web Services (AWS)](../install/aws/index.md): Set up GitLab on Amazon AWS.
+- [Installing GitLab on Amazon Web Services (AWS)](../install/aws/index.md): Set up GitLab on Amazon AWS.
- [Geo](geo/index.md): Replicate your GitLab instance to other geographic locations as a read-only fully operational version.
- [Disaster Recovery](geo/disaster_recovery/index.md): Quickly fail-over to a different site with minimal effort in a disaster situation.
- [Add License](../user/admin_area/license.md): Add a license at install time to unlock features that are in paid tiers of GitLab.
@@ -40,7 +40,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
### Configuring 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.
+- [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.
- [Global user settings](user_settings.md): Configure instance-wide user permissions.
@@ -126,7 +126,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Sync LDAP](auth/ldap/index.md)
- [Kerberos authentication](../integration/kerberos.md)
- See also other [authentication](../topics/authentication/index.md#gitlab-administrators) topics (for example, enforcing 2FA).
-- [Email users](../tools/email.md): Email GitLab users from GitLab.
+- [Email users](../user/admin_area/email_from_gitlab.md): Email GitLab users from GitLab.
- [User Cohorts](../user/admin_area/user_cohorts.md): Display the monthly cohorts of new users and their activities over time.
- [Audit events](audit_events.md): View the changes made on the GitLab server for:
- Groups and projects.
@@ -146,7 +146,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Issue closing pattern](issue_closing_pattern.md): Customize how to close an issue from commit messages.
- [Gitaly](gitaly/index.md): Configuring Gitaly, the Git repository storage service for GitLab.
- [Default labels](../user/admin_area/labels.md): Create labels that are automatically added to every new project.
-- [Restrict the use of public or internal projects](../public_access/public_access.md#restrict-use-of-public-or-internal-projects): Restrict the use of visibility levels for users when they create a project or a snippet.
+- [Restrict the use of public or internal projects](../user/public_access.md#restrict-use-of-public-or-internal-projects): Restrict the use of visibility levels for users when they create a project or a snippet.
- [Custom project templates](../user/admin_area/custom_project_templates.md): Configure a set of projects to be used as custom templates when creating a new project.
## Package Registry administration
@@ -218,6 +218,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Troubleshooting Elasticsearch](troubleshooting/elasticsearch.md)
- [Navigating GitLab via Rails console](troubleshooting/navigating_gitlab_via_rails_console.md)
- [GitLab application limits](instance_limits.md)
+- [Responding to security incidents](../security/responding_to_security_incidents.md)
### Support Team Docs
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 11a34f5b5f8..0a0c538caa2 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -240,7 +240,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 GitLab Flavored Markdown (GFM) for performance reasons.
+There is a limit when embedding metrics in GitLab Flavored Markdown (GLFM) for performance reasons.
- **Max limit**: 100 embeds.
@@ -383,6 +383,20 @@ Plan.default.actual_limits.update!(ci_active_jobs: 500)
Set the limit to `0` to disable it.
+### Maximum time jobs can run
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16777) in GitLab 12.3.
+
+The default maximum time that jobs can run for is 60 minutes. Jobs that run for
+more than 60 minutes time out.
+
+You can change the maximum time a job can run before it times out:
+
+- At the project-level in the [project's CI/CD settings](../ci/pipelines/settings.md#set-a-limit-for-how-long-jobs-can-run)
+ for a given project. This limit must be between 10 minutes and 1 month.
+- At the [runner level](../ci/runners/configure_runners.md#set-maximum-job-timeout-for-a-runner).
+ This limit must be 10 minutes or longer.
+
### Maximum number of deployment jobs in a pipeline
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46931) in GitLab 13.7.
@@ -858,7 +872,7 @@ See the [documentation about Snippets settings](snippets/index.md).
## Design Management limits
-See the [Design Management Limitations](../user/project/issues/design_management.md#limitations) section.
+See the limits in the [Add a design to an issue](../user/project/issues/design_management.md#add-a-design-to-an-issue) section.
## Push Event Limits
@@ -962,3 +976,16 @@ retarget merge requests pointing to the now-merged branch. To learn more, read
## CDN-based limits on GitLab.com
In addition to application-based limits, GitLab.com is configured to use Cloudflare's standard DDoS protection and Spectrum to protect Git over SSH. Cloudflare terminates client TLS connections but is not application aware and cannot be used for limits tied to users or groups. Cloudflare page rules and rate limits are configured with Terraform. These configurations are [not public](https://about.gitlab.com/handbook/communication/#not-public) because they include security and abuse implementations that detect malicious activities and making them public would undermine those operations.
+
+## Container Repository tag deletion limit
+
+Container repository tags are in the Container Registry and, as such, each tag deletion will trigger network requests to the Container Registry. Because of this, we limit the number of tags that a single API call can delete to 20.
+
+## Project-level Secure Files API limits
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78227) in GitLab 14.8.
+
+The [secure files API](../api/secure_files.md) enforces the following limits:
+
+- Files must be smaller than 5 MB.
+- Projects cannot have more than 100 secure files.
diff --git a/doc/administration/integration/kroki.md b/doc/administration/integration/kroki.md
index 008d33c6c94..0f02e3783a5 100644
--- a/doc/administration/integration/kroki.md
+++ b/doc/administration/integration/kroki.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - Support for reStructuredText and Textile documents [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/324766) in GitLab 13.12.
When [Kroki](https://kroki.io) integration is enabled and configured in
-GitLab you can use it to create diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents.
+GitLab, you can use it to create diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents.
## Kroki Server
diff --git a/doc/administration/integration/plantuml.md b/doc/administration/integration/plantuml.md
index 5a9699b3a39..cdf6d48ad41 100644
--- a/doc/administration/integration/plantuml.md
+++ b/doc/administration/integration/plantuml.md
@@ -213,7 +213,7 @@ After configuring your local PlantUML server, you're ready to enable the PlantUM
1. On the left sidebar, go to **Settings > General** and expand the **PlantUML** section.
1. Select the **Enable PlantUML** checkbox.
1. Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`,
- and click **Save changes**.
+ and select **Save changes**.
Depending on your PlantUML and GitLab version numbers, you may also need to take
these steps:
diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md
index 544a5973052..03a0162d526 100644
--- a/doc/administration/job_artifacts.md
+++ b/doc/administration/job_artifacts.md
@@ -307,33 +307,6 @@ To migrate back to local storage:
## Expiring artifacts
-> [In GitLab 14.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76504), we improved the performance of removing expired artifacts, introduced [with a flag](feature_flags.md) named `ci_destroy_all_expired_service`. Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to
-[enable the feature flag](feature_flags.md) named `ci_destroy_all_expired_service`. The feature is not ready for
-production use.
-On GitLab.com, this feature is not available.
-
-### Removing expired job artifacts on GitLab self-managed instances
-
-In the process of migrating old artifacts for our SaaS customers, we are working to resolve any potential unrecoverable data loss for self-managed customers for artifacts that they may not want deleted yet. Before we can use the more performant way of cleaning up expired artifacts, we need to do some remediation to make sure customers don't lose their data, which is part of our effort in [the relevant epic](https://gitlab.com/groups/gitlab-org/-/epics/7097).
-
-Two options are available:
-
-- If you don't need any artifacts created before 2020-06-23, an Administrator can enable the worker for removing expired CI/CD artifacts:
-
- ```ruby
- Feature.enable(:ci_destroy_all_expired_service)
- ```
-
-- If you want to keep any artifacts (including job logs) before 2020-06-23, follow the [progress of the migration effort](https://gitlab.com/groups/gitlab-org/-/epics/7097) where we work on a resolution to have this flag fully enabled in a future release.
-
-Alternatively, Administrators can also run commands in the Rails console to
-[delete artifacts from completed jobs prior to a specific date](#delete-job-artifacts-from-jobs-completed-before-a-specific-date).
-
-### Usage details
-
If [`artifacts:expire_in`](../ci/yaml/index.md#artifactsexpire_in) is used to set
an expiry for the artifacts, they are marked for deletion right after that date passes.
Otherwise, they expire per the [default artifacts expiration setting](../user/admin_area/settings/continuous_integration.md).
@@ -641,4 +614,4 @@ WARNING: Uploading artifacts as "archive" to coordinator... POST https://gitlab.
FATAL: invalid argument
```
-If a job artifact fails to upload with the above error when using consolidated object storage, make sure you are [using separate buckets](object_storage.md#use-separate-buckets) for each data type.
+If a job artifact fails to upload with the above error when using consolidated object storage, make sure you are [using separate buckets](object_storage.md#use-separate-buckets) for each data type.
diff --git a/doc/administration/monitoring/gitlab_self_monitoring_project/index.md b/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
index 09cef51d14c..6f2e3cce0fa 100644
--- a/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
+++ b/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
@@ -8,18 +8,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32351) in GitLab 12.7 [with a flag](../../feature_flags.md) named `self_monitoring_project`. Disabled by default.
> - Generally available in GitLab 12.8. [Feature flag `self_monitoring_project`](https://gitlab.com/gitlab-org/gitlab/-/issues/198511) removed.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/348909) in GitLab 14.9. Planned for removal in GitLab 15.0.
+> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/348909) in GitLab 14.9. Planned for removal in GitLab 16.0.
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/348909)
-for use in GitLab 14.9, and is planned for removal in GitLab 15.0.
+in GitLab 14.9, and is planned for removal in GitLab 16.0.
GitLab provides administrators insights into the health of their GitLab instance.
To provide a native experience (similar interacting with an application deployed using GitLab), a
project called **Monitoring** is created:
-- With [internal visibility](../../../public_access/public_access.md#internal-projects-and-groups).
+- With [internal visibility](../../../user/public_access.md#internal-projects-and-groups).
- Under a group called **GitLab Instance**.
The project is created specifically for visualizing and configuring the monitoring of your GitLab
diff --git a/doc/administration/monitoring/performance/request_profiling.md b/doc/administration/monitoring/performance/request_profiling.md
index f8a66f6f48f..6cd20132092 100644
--- a/doc/administration/monitoring/performance/request_profiling.md
+++ b/doc/administration/monitoring/performance/request_profiling.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/352488)
-for use in GitLab 14.8, and is planned for removal in GitLab 15.0.
+in GitLab 14.8, and is planned for removal in GitLab 15.0.
To profile a request:
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index a1bfae678c7..08f7d5095da 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -88,7 +88,6 @@ The following metrics are available:
| `gitlab_transaction_event_stuck_import_jobs_total` | Counter | 9.4 | Count of stuck import jobs | `projects_without_jid_count`, `projects_with_jid_count` |
| `gitlab_transaction_event_update_build_total` | Counter | 9.4 | Counter for update build for API `/jobs/request/:id` | |
| `gitlab_transaction_new_redis_connections_total` | Counter | 9.4 | Counter for new Redis connections | |
-| `gitlab_transaction_queue_duration_total` | Counter | 9.4 | Duration jobs were enqueued before processing | |
| `gitlab_transaction_rails_queue_duration_total` | Counter | 9.4 | Measures latency between GitLab Workhorse forwarding a request to Rails | `controller`, `action` |
| `gitlab_transaction_view_duration_total` | Counter | 9.4 | Duration for views | `controller`, `action`, `view` |
| `gitlab_view_rendering_duration_seconds` | Histogram | 10.2 | Duration for views (histogram) | `controller`, `action`, `view` |
diff --git a/doc/administration/nfs.md b/doc/administration/nfs.md
index 50c8102f366..ef5d26ac845 100644
--- a/doc/administration/nfs.md
+++ b/doc/administration/nfs.md
@@ -246,7 +246,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
-[System Applications and Products in Data Processing (SAP)](http://wiki.scn.sap.com/wiki/x/PARnFQ) and NetApp's
+[System Applications and Products in Data Processing (SAP)](https://wiki.scn.sap.com/wiki/display/Basis/Recommended+mount+options+for+read-write+directories) 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.
diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md
index 8ea4ad9019e..6ea433f95e9 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -17,7 +17,7 @@ GitLab has been tested by vendors and customers on a number of object storage pr
- [Amazon S3](https://aws.amazon.com/s3/)
- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/)
+- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
diff --git a/doc/administration/operations/fast_ssh_key_lookup.md b/doc/administration/operations/fast_ssh_key_lookup.md
index 8877b1266e0..477a11dd899 100644
--- a/doc/administration/operations/fast_ssh_key_lookup.md
+++ b/doc/administration/operations/fast_ssh_key_lookup.md
@@ -31,7 +31,8 @@ able to accept a fingerprint. Check the version of OpenSSH on your server with `
## Fast lookup is required for Geo **(PREMIUM)**
-By default, GitLab manages an `authorized_keys` file that is located in the
+Unlike [Cloud Native GitLab](https://docs.gitlab.com/charts/), Omnibus GitLab by default
+manages an `authorized_keys` file that is located in the
`git` user's home directory. For most installations, this will be located under
`/var/opt/gitlab/.ssh/authorized_keys`, but you can use the following command to locate the `authorized_keys` on your system:
@@ -83,7 +84,7 @@ file (start the line with a `#` to comment it), and from your local machine, att
ssh -T git@gitlab.example.com
```
-A successful pull or [welcome message](../../ssh/index.md#verify-that-you-can-connect) would mean that GitLab was able to find the key in the database,
+A successful pull or [welcome message](../../user/ssh.md#verify-that-you-can-connect) would mean that GitLab was able to find the key in the database,
since it is not present in the file anymore.
NOTE:
diff --git a/doc/administration/operations/puma.md b/doc/administration/operations/puma.md
index 9e828b39f46..c12f75989c3 100644
--- a/doc/administration/operations/puma.md
+++ b/doc/administration/operations/puma.md
@@ -108,6 +108,12 @@ To change the worker timeout to 600 seconds:
## Disable Puma clustered mode in memory-constrained environments
+WARNING:
+This is an experimental [Alpha feature](../../policy/alpha-beta-support.md#alpha-features) and subject to change without notice. The feature
+is not ready for production use. If you want to use this feature, we recommend testing
+with non-production data first. See the [known issues](#puma-single-mode-known-issues)
+for additional details.
+
In a memory-constrained environment with less than 4GB of RAM available, consider disabling Puma
[clustered mode](https://github.com/puma/puma#clustered-mode).
@@ -131,6 +137,8 @@ For details on Puma worker and thread settings, see the [Puma requirements](../.
The downside of running Puma in this configuration is the reduced throughput, which can be
considered a fair tradeoff in a memory-constrained environment.
+### Puma single mode known issues
+
When running Puma in single mode, some features are not supported:
- [Phased restart](https://gitlab.com/gitlab-org/gitlab/-/issues/300665)
diff --git a/doc/administration/package_information/postgresql_versions.md b/doc/administration/package_information/postgresql_versions.md
index e707cb70187..c80437221c4 100644
--- a/doc/administration/package_information/postgresql_versions.md
+++ b/doc/administration/package_information/postgresql_versions.md
@@ -26,8 +26,8 @@ Read more about update policies and warnings in the PostgreSQL
| GitLab version | PostgreSQL versions | Default version for fresh installs | Default version for upgrades | Notes |
| -------------- | --------------------- | ---------------------------------- | ---------------------------- | ----- |
-| 14.1 | 12.6, 13.3 | 12.6 | 12.6 | PostgreSQL 13 available for fresh installations if not using [Geo](../geo/index.md#requirements-for-running-geo) or [Patroni](../postgresql/index.md#postgresql-replication-and-failover-with-omnibus-gitlab).
-| 14.0 | 12.6 | 12.6 | 12.6 | HA installations with repmgr are no longer supported and will be prevented from upgrading to Omnibus GitLab 14.0 |
+| 14.1 | 12.7, 13.3 | 12.7 | 12.7 | PostgreSQL 13 available for fresh installations if not using [Geo](../geo/index.md#requirements-for-running-geo) or [Patroni](../postgresql/index.md#postgresql-replication-and-failover-with-omnibus-gitlab).
+| 14.0 | 12.7 | 12.7 | 12.7 | HA installations with repmgr are no longer supported and will be prevented from upgrading to Omnibus GitLab 14.0 |
| 13.8 | 11.9, 12.4 | 12.4 | 12.4 | Package upgrades automatically performed PostgreSQL upgrade for nodes that are not part of a Geo or HA cluster.). |
| 13.7 | 11.9, 12.4 | 12.4 | 11.9 | For upgrades users can manually upgrade to 12.4 following the [upgrade docs](https://docs.gitlab.com/omnibus/settings/database.html#gitlab-133-and-later). |
| 13.4 | 11.9, 12.4 | 11.9 | 11.9 | Package upgrades aborted if users not running PostgreSQL 11 already |
diff --git a/doc/administration/package_information/supported_os.md b/doc/administration/package_information/supported_os.md
index 547b8bf8658..647620858d9 100644
--- a/doc/administration/package_information/supported_os.md
+++ b/doc/administration/package_information/supported_os.md
@@ -24,14 +24,15 @@ The following lists the currently supported OSs and their possible EOL dates.
| Debian 10 | GitLab CE / GitLab EE 12.2.0 | amd64, arm64 | 2024 | <https://wiki.debian.org/LTS> |
| Debian 11 | GitLab CE / GitLab EE 14.6.0 | amd64, arm64 | 2026 | <https://wiki.debian.org/LTS> |
| OpenSUSE 15.3 | GitLab CE / GitLab EE 14.5.0 | x86_64, aarch64 | Nov 2022 | <https://en.opensuse.org/Lifetime> |
+| RHEL 8 | GitLab CE / GitLab EE 12.8.1 | x86_64, arm64 | May 2024 | <https://access.redhat.com/support/policy/updates/errata/#Life_Cycle_Dates> |
| SLES 12 | GitLab EE 9.0.0 | x86_64 | Oct 2027 | <https://www.suse.com/lifecycle/> |
| Ubuntu 18.04 | GitLab CE / GitLab EE 10.7.0 | amd64 | April 2023 | <https://wiki.ubuntu.com/Releases> |
| Ubuntu 20.04 | GitLab CE / GitLab EE 13.2.0 | amd64, arm64 | April 2025 | <https://wiki.ubuntu.com/Releases> |
-| Amazon Linux 2 | GitLab CE / GitLab EE 14.9.0 | amd64, arm64 | June 2023 | <https://aws.amazon.com/amazon-linux-2/faqs> |
-| Raspbian Buster | GitLab CE 12.2.0 | armhf | 2022 | <https://wiki.debian.org/DebianReleases#Production_Releases> |
+| Amazon Linux 2 | GitLab CE / GitLab EE 14.9.0 | amd64, arm64 | June 2023 | <https://aws.amazon.com/amazon-linux-2/faqs/> |
+| Raspberry Pi OS (Buster) (formerly known as Raspbian Buster) | GitLab CE 12.2.0 | armhf | 2024 | <https://www.raspberrypi.com/news/new-old-functionality-with-raspberry-pi-os-legacy/> |
NOTE:
-CentOS 8 will be EOL on December 31, 2021. In GitLab 14.5 and later,
+CentOS 8 was EOL on December 31, 2021. In GitLab 14.5 and later,
[CentOS builds work in AlmaLinux](https://gitlab.com/gitlab-org/distribution/team-tasks/-/issues/954#note_730198505).
We will officially support all distributions that are binary compatible with Red Hat Enterprise Linux.
This gives users a path forward for their CentOS 8 builds at its end of life.
@@ -78,7 +79,7 @@ release for them can be found below:
| Ubuntu 14.04 | [April 2019](https://ubuntu.com/info/release-end-of-life) | [GitLab CE](https://packages.gitlab.com/app/gitlab/gitlab-ce/search?q=gitlab-ce_11.10&dist=ubuntu%2Ftrusty) / [GitLab EE](https://packages.gitlab.com/app/gitlab/gitlab-ee/search?q=gitlab-ee_11.10&dist=ubuntu%2Ftrusty) 11.10 |
| OpenSUSE 42.3 | [July 2019](https://en.opensuse.org/Lifetime#Discontinued_distributions) | [GitLab CE](https://packages.gitlab.com/app/gitlab/gitlab-ce/search?q=gitlab-ce-12.1&dist=opensuse%2F42.3) / [GitLab EE](https://packages.gitlab.com/app/gitlab/gitlab-ee/search?q=gitlab-ee-12.1&dist=opensuse%2F42.3) 12.1 |
| OpenSUSE 15.0 | [December 2019](https://en.opensuse.org/Lifetime#Discontinued_distributions) | [GitLab CE](https://packages.gitlab.com/app/gitlab/gitlab-ce/search?q=gitlab-ce-12.5&dist=opensuse%2F15.0) / [GitLab EE](https://packages.gitlab.com/app/gitlab/gitlab-ee/search?q=gitlab-ee-12.5&dist=opensuse%2F15.0) 12.5 |
-| Raspbian Stretch | [June 2020](https://downloads.raspberrypi.org/raspbian/images/raspbian-2019-04-09/) | [GitLab CE](https://packages.gitlab.com/app/gitlab/raspberry-pi2/search?q=gitlab-ce_13.2&dist=raspbian%2Fstretch) 13.3 |
+| Raspbian Stretch | [June 2020](https://downloads.raspberrypi.org/raspbian/images/raspbian-2019-04-09/) | [GitLab CE](https://packages.gitlab.com/app/gitlab/raspberry-pi2/search?q=gitlab-ce_13.3&dist=raspbian%2Fstretch) 13.3 |
| Debian Jessie | [June 2020](https://www.debian.org/News/2020/20200709) | [GitLab CE](https://packages.gitlab.com/app/gitlab/gitlab-ce/search?q=gitlab-ce_13.2&dist=debian%2Fjessie) / [GitLab EE](https://packages.gitlab.com/app/gitlab/gitlab-ee/search?q=gitlab-ee_13.2&dist=debian%2Fjessie) 13.3 |
| CentOS 6 | [November 2020](https://wiki.centos.org/About/Product) | [GitLab CE](https://packages.gitlab.com/app/gitlab/gitlab-ce/search?q=13.6&filter=all&filter=all&dist=el%2F6) / [GitLab EE](https://packages.gitlab.com/app/gitlab/gitlab-ee/search?q=13.6&filter=all&filter=all&dist=el%2F6) 13.6 |
| OpenSUSE 15.1 | [November 2020](https://en.opensuse.org/Lifetime#Discontinued_distributions) | [GitLab CE](https://packages.gitlab.com/app/gitlab/gitlab-ce/search?q=gitlab-ce-13.12&dist=opensuse%2F15.1) / [GitLab EE](https://packages.gitlab.com/app/gitlab/gitlab-ee/search?q=gitlab-ee-13.12&dist=opensuse%2F15.1) 13.12 |
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index 7bf7362c68b..d6f5588ebc9 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -903,6 +903,10 @@ You can also [run cleanup on a schedule](../../user/packages/container_registry/
## Container Registry garbage collection
+NOTE:
+Retention policies within your object storage provider, such as Amazon S3 Lifecycle, may prevent
+objects from being properly deleted.
+
Container Registry can use considerable amounts of disk space. To clear up
some unused layers, the registry includes a garbage collect command.
diff --git a/doc/administration/packages/dependency_proxy.md b/doc/administration/packages/dependency_proxy.md
index 93c6585230f..4c50cfeeb0f 100644
--- a/doc/administration/packages/dependency_proxy.md
+++ b/doc/administration/packages/dependency_proxy.md
@@ -264,3 +264,29 @@ Feature.disable(:dependency_proxy_for_private_groups)
# Re-enable the authentication
Feature.enable(:dependency_proxy_for_private_groups)
```
+
+## Changing the JWT expiration
+
+The Dependency Proxy follows the [Docker v2 token authentication flow](https://docs.docker.com/registry/spec/auth/token/),
+issuing the client a JWT to use for the pull requests. The token expiration time is a configurable
+using the application setting `container_registry_token_expire_delay`. It can be changed from the
+rails console:
+
+```ruby
+# update the JWT expiration to 30 minutes
+ApplicationSetting.update(container_registry_token_expire_delay: 30)
+```
+
+The default expiration and the expiration on GitLab.com is 15 minutes.
+
+## Using the dependency proxy behind a proxy
+
+1. Edit `/etc/gitlab/gitlab.rb` and add the following lines:
+
+ ```ruby
+ gitlab_workhorse['env'] = {
+ "http_proxy" => "http://USERNAME:PASSWORD@example.com:8080",
+ "https_proxy" => "http://USERNAME:PASSWORD@example.com:8080"
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
diff --git a/doc/administration/packages/index.md b/doc/administration/packages/index.md
index abf5c46114b..b122cb9db90 100644
--- a/doc/administration/packages/index.md
+++ b/doc/administration/packages/index.md
@@ -10,9 +10,7 @@ GitLab Packages allows organizations to use GitLab as a private repository
for a variety of common package managers. Users are able to build and publish
packages, which can be easily consumed as a dependency in downstream projects.
-The Packages feature allows GitLab to act as a repository for the following:
-
-The Package Registry supports the following formats:
+The Packages feature allows GitLab to act as a repository and supports the following formats:
| Package type | GitLab version |
|-------------------------------------------------------------------|----------------|
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 56ccf70d169..114894c01f0 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
description: 'Learn how to administer GitLab Pages.'
---
@@ -243,6 +243,7 @@ control over how the Pages daemon runs and serves content in your environment.
| `enable` | Enable or disable GitLab Pages on the current system. |
| `external_http` | Configure Pages to bind to one or more secondary IP addresses, serving HTTP requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_http`. |
| `external_https` | Configure Pages to bind to one or more secondary IP addresses, serving HTTPS requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_https`. |
+| `server_shutdown_timeout` | GitLab Pages server shutdown timeout in seconds (default: 30s). |
| `gitlab_client_http_timeout` | GitLab API HTTP client connection timeout in seconds (default: 10s). |
| `gitlab_client_jwt_expiry` | JWT Token expiry time in seconds (default: 30s). |
| `gitlab_cache_expiry` | The maximum time a domain's configuration is stored in the cache (default: 600s). |
@@ -292,6 +293,10 @@ control over how the Pages daemon runs and serves content in your environment.
| `rate_limit_source_ip_burst` | Rate limit per source IP maximum burst allowed per second. |
| `rate_limit_domain` | Rate limit per domain in number of requests per second. Set to `0` to disable this feature. |
| `rate_limit_domain_burst` | Rate limit per domain maximum burst allowed per second. |
+| `server_read_timeout` | Maximum duration to read the request headers and body. For no timeout, set to `0` or a negative value. Default: `5s` |
+| `server_read_header_timeout` | Maximum duration to read the request headers. For no timeout, set to `0` or a negative value. Default: `1s` |
+| `server_write_timeout` | Maximum duration to write all files in the response. Larger files require more time. For no timeout, set to `0` or a negative value. Default: `5m` |
+| `server_keep_alive` | The `Keep-Alive` period for network connections accepted by this listener. If `0`, `Keep-Alive` is enabled if supported by the protocol and operating system. If negative, `Keep-Alive` is disabled. Default: `15s` |
## Advanced configuration
@@ -1392,15 +1397,15 @@ in all of your GitLab Pages instances.
Connections will time out when using a Network Load Balancer with client IP preservation enabled and [the request is looped back to the source server](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-troubleshooting.html#loopback-timeout).
This can happen to GitLab instances with multiple servers
-running both the core GitLab application and GitLab Pages. This can also happen when a single
+running both the core GitLab application and GitLab Pages. This can also happen when a single
container is running both the core GitLab application and GitLab Pages.
AWS [recommends using an IP target type](https://aws.amazon.com/premiumsupport/knowledge-center/target-connection-fails-load-balancer/)
to resolve this issue.
-Turning off [client IP preservation](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#client-ip-preservation)
-may resolve this issue when the core GitLab application and GitLab Pages run on the same host or
-container.
+Turning off [client IP preservation](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#client-ip-preservation)
+may resolve this issue when the core GitLab application and GitLab Pages run on the same host or
+container.
### 500 error with `securecookie: failed to generate random iv` and `Failed to save the session`
diff --git a/doc/administration/pages/source.md b/doc/administration/pages/source.md
index c4b1756d8a1..6c148387d7d 100644
--- a/doc/administration/pages/source.md
+++ b/doc/administration/pages/source.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/administration/raketasks/doctor.md b/doc/administration/raketasks/doctor.md
deleted file mode 100644
index 457077462a6..00000000000
--- a/doc/administration/raketasks/doctor.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'check.md#verify-database-values-can-be-decrypted-using-the-current-secrets'
-remove_date: '2022-03-04'
----
-
-This document was moved to [another location](check.md#verify-database-values-can-be-decrypted-using-the-current-secrets).
-
-<!-- This redirect file can be deleted after 2022-03-04. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/administration/raketasks/maintenance.md b/doc/administration/raketasks/maintenance.md
index d66f3b1ed35..82ebdcaab42 100644
--- a/doc/administration/raketasks/maintenance.md
+++ b/doc/administration/raketasks/maintenance.md
@@ -183,9 +183,12 @@ Redis version >= 2.0.0? ... yes
Checking GitLab ... Finished
```
-## Rebuild authorized_keys file
+## Rebuild `authorized_keys` file
-In some case it is necessary to rebuild the `authorized_keys` file. To do this, run:
+In some cases it is necessary to rebuild the `authorized_keys` file,
+for example, if after an upgrade you receive `Permission denied (publickey)` when pushing [via SSH](../../ssh/index.md)
+and find `404 Key Not Found` errors in [the `gitlab-shell.log` file](../logs.md#gitlab-shelllog).
+To rebuild `authorized_keys`, run:
**Omnibus Installation**
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index fcce44f62b2..2ca79bbeae4 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -14,7 +14,7 @@ full list of reference architectures, see
> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Estimated Costs:** [See cost table](index.md#cost-to-run)
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
-> - **Performance tested daily with the [GitLab Performance Tool](https://gitlab.com/gitlab-org/quality/performance)**:
+> - **Validation and test results:** The Quality Engineering team does [regular smoke and performance tests](index.md#validation-and-test-results) to ensure the reference architectures remain compliant
> - **Test requests per second (RPS) rates:** API: 200 RPS, Web: 20 RPS, Git (Pull): 20 RPS, Git (Push): 4 RPS
> - **[Latest Results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k)**
@@ -42,7 +42,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -1157,8 +1157,8 @@ are supported and can be added if needed.
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.
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster).
+For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
The recommended cluster setup includes the following components:
@@ -1455,10 +1455,12 @@ To configure the Praefect nodes, on each one:
### Configure Gitaly
The [Gitaly](../gitaly/index.md) server nodes that make up the cluster have
-requirements that are dependent on data, specifically the number of projects
-and those projects' sizes. It's recommended that a Gitaly Cluster stores
-no more than 5 TB of data on each node. Depending on your
-repository storage requirements, you may require additional Gitaly Clusters.
+requirements that are dependent on data and load.
+
+NOTE:
+The Reference Architecture specs have been designed with good headroom in mind
+but for Gitaly, increased specs or additional
+Gitaly Cluster arrays may be required for notably large data sets or load.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -1531,6 +1533,26 @@ On each node:
# Recommended to be enabled for improved performance but can notably increase disk I/O
# Refer to https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#pack-objects-cache for more info
gitaly['pack_objects_cache_enabled'] = true
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+ ## 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 for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ gitaly['prometheus_listen_addr'] = '0.0.0.0:9236'
+ #
+ # END user configuration
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
@@ -1768,6 +1790,7 @@ To configure the Sidekiq nodes, on each one:
# Object Storage
## This is an example for configuring Object Storage on GCP
## Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -1914,6 +1937,7 @@ On each node perform the following:
# This is an example for configuring Object Storage on GCP
# Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -2093,6 +2117,30 @@ To configure the Monitoring node:
retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13)
}
+ # Configure Prometheus to scrape services not covered by discovery
+ prometheus['scrape_configs'] = [
+ {
+ 'job_name': 'pgbouncer',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.31:9188",
+ "10.6.0.32:9188",
+ "10.6.0.33:9188",
+ ],
+ ],
+ },
+ {
+ 'job_name': 'praefect',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.131:9652",
+ "10.6.0.132:9652",
+ "10.6.0.133:9652",
+ ],
+ ],
+ },
+ ]
+
# Nginx - For Grafana access
nginx['enable'] = true
```
@@ -2119,7 +2167,7 @@ GitLab has been tested on a number of object storage providers:
- [Amazon S3](https://aws.amazon.com/s3/)
- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/)
+- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
@@ -2136,7 +2184,8 @@ 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.
+
+In GitLab 13.6 and later, it's also 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. This is required when no NFS node has been deployed.
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
@@ -2236,11 +2285,11 @@ use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
-| Service | Nodes | Configuration | GCP | Allocatable CPUs and Memory |
-|-------------------------------------------------------|-------|-------------------------|------------------|-----------------------------|
-| Webservice | 4 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | 127.5 vCPU, 118 GB memory |
-| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | 15.5 vCPU, 50 GB memory |
-| Supporting services such as NGINX, Prometheus | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | 7.75 vCPU, 25 GB memory |
+| Service | Nodes | Configuration | GCP | AWS | Min Allocatable CPUs and Memory |
+|-----------------------------------------------|-------|-------------------------|-----------------|--------------|---------------------------------|
+| Webservice | 4 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` | 127.5 vCPU, 118 GB memory |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 15.5 vCPU, 50 GB memory |
+| Supporting services such as NGINX, Prometheus | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 7.75 vCPU, 25 GB memory |
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
@@ -2250,18 +2299,18 @@ future with further specific cloud provider details.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
services where applicable):
-| Service | Nodes | Configuration | GCP |
-|-----------------------------------------------------|-------|-------------------------|------------------|
-| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
-| 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/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 |
+| Service | Nodes | Configuration | GCP | AWS |
+|------------------------------------------|-------|-----------------------|------------------|--------------|
+| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| PostgreSQL<sup>1</sup> | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` | `m5.2xlarge` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
+| Gitaly<sup>5</sup> | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` | `m5.4xlarge` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Object storage<sup>4</sup> | n/a | n/a | n/a | n/a |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
@@ -2269,7 +2318,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
diff --git a/doc/administration/reference_architectures/1k_users.md b/doc/administration/reference_architectures/1k_users.md
index 0d0e7681ffd..7213a1eb92b 100644
--- a/doc/administration/reference_architectures/1k_users.md
+++ b/doc/administration/reference_architectures/1k_users.md
@@ -21,7 +21,7 @@ many organizations.
> - **Estimated Costs:** [See cost table](index.md#cost-to-run)
> - **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).
-> - **Performance tested daily with the [GitLab Performance Tool (GPT)](https://gitlab.com/gitlab-org/quality/performance)**:
+> - **Validation and test results:** The Quality Engineering team does [regular smoke and performance tests](index.md#validation-and-test-results) to ensure the reference architectures remain compliant
> - **Test requests per second (RPS) rates:** API: 20 RPS, Web: 2 RPS, Git (Pull): 2 RPS, Git (Push): 1 RPS
> - **[Latest Results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/1k)**
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index c08fe985b40..2a1d344508e 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -14,7 +14,7 @@ full list of reference architectures, see
> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Estimated Costs:** [See cost table](index.md#cost-to-run)
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
-> - **Performance tested weekly with the [GitLab Performance Tool (GPT)](https://gitlab.com/gitlab-org/quality/performance)**:
+> - **Validation and test results:** The Quality Engineering team does [regular smoke and performance tests](index.md#validation-and-test-results) to ensure the reference architectures remain compliant
> - **Test requests per second (RPS) rates:** API: 500 RPS, Web: 50 RPS, Git (Pull): 50 RPS, Git (Push): 10 RPS
> - **[Latest Results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/25k)**
@@ -24,7 +24,7 @@ full list of reference architectures, see
| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| 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` |
+| Internal load balancing node<sup>3</sup> | 1 | 4 vCPU, 3.6GB 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 | 32 vCPU, 120 GB memory | `n1-standard-32` | `m5.8xlarge` | `D32s v3` |
@@ -42,7 +42,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -86,7 +86,7 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
-
+
redis_cache -[hidden]-> redis_persistent
}
@@ -1163,8 +1163,8 @@ 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.
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster).
+For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
The recommended cluster setup includes the following components:
@@ -1459,10 +1459,12 @@ the file of the same name on this server. If this is the first Omnibus node you
### Configure Gitaly
The [Gitaly](../gitaly/index.md) server nodes that make up the cluster have
-requirements that are dependent on data, specifically the number of projects
-and those projects' sizes. It's recommended that a Gitaly Cluster stores
-no more than 5 TB of data on each node. Depending on your
-repository storage requirements, you may require additional Gitaly Clusters.
+requirements that are dependent on data and load.
+
+NOTE:
+The Reference Architecture specs have been designed with good headroom in mind
+but for Gitaly, increased specs or additional
+Gitaly Cluster arrays may be required for notably large data sets or load.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -1535,6 +1537,26 @@ On each node:
# Recommended to be enabled for improved performance but can notably increase disk I/O
# Refer to https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#pack-objects-cache for more info
gitaly['pack_objects_cache_enabled'] = true
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+ ## 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 for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ gitaly['prometheus_listen_addr'] = '0.0.0.0:9236'
+ #
+ # END user configuration
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
@@ -1772,6 +1794,7 @@ To configure the Sidekiq nodes, on each one:
# Object Storage
# This is an example for configuring Object Storage on GCP
# Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -1920,6 +1943,7 @@ On each node perform the following:
# This is an example for configuring Object Storage on GCP
# Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -2098,6 +2122,30 @@ To configure the Monitoring node:
retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13)
}
+ # Configure Prometheus to scrape services not covered by discovery
+ prometheus['scrape_configs'] = [
+ {
+ 'job_name': 'pgbouncer',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.31:9188",
+ "10.6.0.32:9188",
+ "10.6.0.33:9188",
+ ],
+ ],
+ },
+ {
+ 'job_name': 'praefect',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.131:9652",
+ "10.6.0.132:9652",
+ "10.6.0.133:9652",
+ ],
+ ],
+ },
+ ]
+
# Nginx - For Grafana access
nginx['enable'] = true
```
@@ -2123,7 +2171,7 @@ GitLab has been tested on a number of object storage providers:
- [Amazon S3](https://aws.amazon.com/s3/)
- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/)
+- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
@@ -2140,7 +2188,8 @@ 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.
+
+In GitLab 13.6 and later, it's also 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. This is required when no NFS node has been deployed.
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
@@ -2234,11 +2283,11 @@ use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
-| Service | Nodes | Configuration | GCP | Allocatable CPUs and Memory |
-|-------------------------------------------------------|-------|-------------------------|------------------|-----------------------------|
-| Webservice | 7 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | 223 vCPU, 206.5 GB memory |
-| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | 15.5 vCPU, 50 GB memory |
-| Supporting services such as NGINX, Prometheus | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | 7.75 vCPU, 25 GB memory |
+| Service | Nodes | Configuration | GCP | AWS | Min Allocatable CPUs and Memory |
+|-----------------------------------------------|-------|-------------------------|-----------------|-----------------|---------------------------------|
+| Webservice | 7 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` | 223 vCPU, 206.5 GB memory |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 15.5 vCPU, 50 GB memory |
+| Supporting services such as NGINX, Prometheus | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 7.75 vCPU, 25 GB memory |
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
@@ -2248,18 +2297,18 @@ future with further specific cloud provider details.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
services where applicable):
-| Service | Nodes | Configuration | GCP |
-|-----------------------------------------------------|-------|-------------------------|------------------|
-| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
-| 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/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 |
+| Service | Nodes | Configuration | GCP | AWS |
+|------------------------------------------|-------|------------------------|------------------|--------------|
+| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| PostgreSQL<sup>1</sup> | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` | `m5.4xlarge` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Internal load balancing node<sup>3</sup> | 1 | 4 vCPU, 3.6GB memory | `n1-highcpu-4` | `c5.xlarge` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
+| Gitaly<sup>5</sup> | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` | `m5.8xlarge` |
+| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Object storage<sup>4</sup> | n/a | n/a | n/a | n/a |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
@@ -2267,7 +2316,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -2312,7 +2361,7 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
-
+
redis_cache -[hidden]-> redis_persistent
}
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index 6f6c02c309a..f417d1e2ab5 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -13,9 +13,9 @@ 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).
-> - **Estimated Costs:** [See cost table](index.md#cost-to-run)
+> - **Estimated Costs:** [See cost table](index.md#cost-to-run)
> - **Cloud Native Hybrid:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
-> - **Performance tested daily with the [GitLab Performance Tool (GPT)](https://gitlab.com/gitlab-org/quality/performance)**:
+> - **Validation and test results:** The Quality Engineering team does [regular smoke and performance tests](index.md#validation-and-test-results) to ensure the reference architectures remain compliant
> - **Test requests per second (RPS) rates:** API: 40 RPS, Web: 4 RPS, Git (Pull): 4 RPS, Git (Push): 1 RPS
> - **[Latest Results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/2k)**
@@ -397,11 +397,13 @@ are supported and can be added if needed.
## Configure Gitaly
-[Gitaly](../gitaly/index.md) server node requirements are dependent on data,
-specifically the number of projects and those projects' sizes. It's recommended
-that a Gitaly server node stores no more than 5TB of data. Although this
-reference architecture includes a single Gitaly server node, you may require
-additional nodes depending on your repository storage requirements.
+[Gitaly](../gitaly/index.md) server node requirements are dependent on data size,
+specifically the number of projects and those projects' sizes.
+
+NOTE:
+The Reference Architecture specs have been designed with good headroom in mind
+but for Gitaly, increased specs or switching to Gitaly Cluster
+may be required for notably large data sets or load.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -665,6 +667,7 @@ On each node perform the following:
# Object Storage
# This is an example for configuring Object Storage on GCP
# Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -886,7 +889,7 @@ GitLab has been tested on a number of object storage providers:
- [Amazon S3](https://aws.amazon.com/s3/)
- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/)
+- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
@@ -903,7 +906,8 @@ 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.
+
+In GitLab 13.6 and later, it's also 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. This is required when no NFS node has been deployed.
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
@@ -1000,11 +1004,11 @@ use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
-| Service | Nodes | Configuration | GCP | Allocatable CPUs and Memory |
-|-------------------------------------------------------|-------|------------------------|-----------------|-----------------------------|
-| Webservice | 3 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | 23.7 vCPU, 16.9 GB memory |
-| Sidekiq | 2 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | 3.9 vCPU, 11.8 GB memory |
-| Supporting services such as NGINX, Prometheus | 2 | 1 vCPU, 3.75 GB memory | `n1-standard-1` | 1.9 vCPU, 5.5 GB memory |
+| Service | Nodes | Configuration | GCP | AWS | Min Allocatable CPUs and Memory |
+|-----------------------------------------------|-------|------------------------|-----------------|--------------|---------------------------------|
+| Webservice | 3 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` | 23.7 vCPU, 16.9 GB memory |
+| Sidekiq | 2 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` | 3.9 vCPU, 11.8 GB memory |
+| Supporting services such as NGINX, Prometheus | 2 | 1 vCPU, 3.75 GB memory | `n1-standard-1` | `m5.large` | 1.9 vCPU, 5.5 GB memory |
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
@@ -1014,12 +1018,12 @@ future with further specific cloud provider details.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
services where applicable):
-| Service | Nodes | Configuration | GCP |
-|--------------------------------------------|-------|-------------------------|------------------|
-| PostgreSQL<sup>1</sup> | 1 | 2 vCPU, 7.5 GB memory | `n1-standard-2` |
-| Redis<sup>2</sup> | 1 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
-| Gitaly | 1 | 4 vCPU, 15 GB memory | `n1-standard-4` |
-| Object storage<sup>3</sup> | n/a | n/a | n/a |
+| Service | Nodes | Configuration | GCP | AWS |
+|----------------------------|-------|------------------------|-----------------|-------------|
+| PostgreSQL<sup>1</sup> | 1 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` |
+| Redis<sup>2</sup> | 1 | 1 vCPU, 3.75 GB memory | `n1-standard-1` | `m5.large` |
+| Gitaly | 1 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
+| Object storage<sup>3</sup> | n/a | n/a | n/a | n/a |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index 76f81e65580..9d8be3e90b6 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -24,7 +24,7 @@ For a full list of reference architectures, see
> - **High Availability:** Yes, although [Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution
> - **Estimated Costs:** [See cost table](index.md#cost-to-run)
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
-> - **Performance tested weekly with the [GitLab Performance Tool (GPT)](https://gitlab.com/gitlab-org/quality/performance)**:
+> - **Validation and test results:** The Quality Engineering team does [regular smoke and performance tests](index.md#validation-and-test-results) to ensure the reference architectures remain compliant
> - **Test requests per second (RPS) rates:** API: 60 RPS, Web: 6 RPS, Git (Pull): 6 RPS, Git (Push): 1 RPS
> - **[Latest Results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/3k)**
@@ -51,7 +51,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -1104,8 +1104,8 @@ The following IPs will be used as an example:
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.
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster).
+For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
The recommended cluster setup includes the following components:
@@ -1399,10 +1399,12 @@ the file of the same name on this server. If this is the first Omnibus node you
### Configure Gitaly
The [Gitaly](../gitaly/index.md) server nodes that make up the cluster have
-requirements that are dependent on data, specifically the number of projects
-and those projects' sizes. It's recommended that a Gitaly Cluster stores
-no more than 5 TB of data on each node. Depending on your
-repository storage requirements, you may require additional Gitaly Clusters.
+requirements that are dependent on data and load.
+
+NOTE:
+The Reference Architecture specs have been designed with good headroom in mind
+but for Gitaly, increased specs or additional
+Gitaly Cluster arrays may be required for notably large data sets or load.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -1475,6 +1477,26 @@ On each node:
# Recommended to be enabled for improved performance but can notably increase disk I/O
# Refer to https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#pack-objects-cache for more info
gitaly['pack_objects_cache_enabled'] = true
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+ ## 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 for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ gitaly['prometheus_listen_addr'] = '0.0.0.0:9236'
+ #
+ # END user configuration
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
@@ -1696,6 +1718,7 @@ To configure the Sidekiq nodes, one each one:
# Object Storage
## This is an example for configuring Object Storage on GCP
## Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -1882,6 +1905,7 @@ On each node perform the following:
# Object storage
# This is an example for configuring Object Storage on GCP
# Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -2018,6 +2042,30 @@ running [Prometheus](../monitoring/prometheus/index.md) and
retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13)
}
+ # Configure Prometheus to scrape services not covered by discovery
+ prometheus['scrape_configs'] = [
+ {
+ 'job_name': 'pgbouncer',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.21:9188",
+ "10.6.0.22:9188",
+ "10.6.0.23:9188",
+ ],
+ ],
+ },
+ {
+ 'job_name': 'praefect',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.131:9652",
+ "10.6.0.132:9652",
+ "10.6.0.133:9652",
+ ],
+ ],
+ },
+ ]
+
# Nginx - For Grafana access
nginx['enable'] = true
```
@@ -2058,7 +2106,7 @@ GitLab has been tested on a number of object storage providers:
- [Amazon S3](https://aws.amazon.com/s3/)
- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/)
+- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
@@ -2075,7 +2123,8 @@ 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.
+
+In GitLab 13.6 and later, it's also 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. This is required when no NFS node has been deployed.
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
@@ -2157,6 +2206,7 @@ but with smaller performance requirements, several modifications can be consider
- Reducing the node counts: Some node types do not need consensus and can run with fewer nodes (but more than one for redundancy). This will also lead to reduced performance.
- GitLab Rails and Sidekiq: Stateless services don't have a minimum node count. Two are enough for redundancy.
- Gitaly and Praefect: A quorum is not strictly necessary. Two Gitaly nodes and two Praefect nodes are enough for redundancy.
+ - PostgreSQL and PgBouncer: A quorum is not strictly necessary. Two PostgreSQL nodes and two PgBouncer nodes are enough for redundancy.
- Running select components in reputable Cloud PaaS solutions: Select components of the GitLab setup can instead be run on Cloud Provider PaaS solutions. By doing this, additional dependent components can also be removed:
- PostgreSQL: Can be run on reputable Cloud PaaS solutions such as Google Cloud SQL or Amazon RDS. In this setup, the PgBouncer and Consul nodes are no longer required:
- Consul may still be desired if [Prometheus](../monitoring/prometheus/index.md) auto discovery is a requirement, otherwise you would need to [manually add scrape configurations](../monitoring/prometheus/index.md#adding-custom-scrape-configurations) for all nodes.
@@ -2193,11 +2243,11 @@ use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
-| Service | Nodes | Configuration | GCP | Allocatable CPUs and Memory |
-|-------------------------------------------------------|-------|-------------------------|------------------|-----------------------------|
-| Webservice | 2 | 16 vCPU, 14.4 GB memory | `n1-highcpu-16` | 31.8 vCPU, 24.8 GB memory |
-| Sidekiq | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | 11.8 vCPU, 38.9 GB memory |
-| Supporting services such as NGINX, Prometheus | 2 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | 3.9 vCPU, 11.8 GB memory |
+| Service | Nodes | Configuration | GCP | AWS | Min Allocatable CPUs and Memory |
+|-----------------------------------------------|-------|-------------------------|-----------------|--------------|---------------------------------|
+| Webservice | 2 | 16 vCPU, 14.4 GB memory | `n1-highcpu-16` | `c5.4xlarge` | 31.8 vCPU, 24.8 GB memory |
+| Sidekiq | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 11.8 vCPU, 38.9 GB memory |
+| Supporting services such as NGINX, Prometheus | 2 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` | 3.9 vCPU, 11.8 GB memory |
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
@@ -2207,17 +2257,17 @@ future with further specific cloud provider details.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
services where applicable):
-| Service | Nodes | Configuration | GCP |
-|--------------------------------------------|-------|-------------------------|------------------|
-| Redis<sup>2</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` |
-| Consul<sup>1</sup> + Sentinel<sup>2</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
-| 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<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 |
+| Service | Nodes | Configuration | GCP | AWS |
+|-------------------------------------------|-------|-----------------------|-----------------|-------------|
+| Redis<sup>2</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` |
+| Consul<sup>1</sup> + Sentinel<sup>2</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| PostgreSQL<sup>1</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Gitaly<sup>5</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Object storage<sup>4</sup> | n/a | n/a | n/a | n/a |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
@@ -2225,7 +2275,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index dfa963d1ad0..6c4e2227b18 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -14,7 +14,7 @@ full list of reference architectures, see
> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Estimated Costs:** [See cost table](index.md#cost-to-run)
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
-> - **Performance tested weekly with the [GitLab Performance Tool (GPT)](https://gitlab.com/gitlab-org/quality/performance)**:
+> - **Validation and test results:** The Quality Engineering team does [regular smoke and performance tests](index.md#validation-and-test-results) to ensure the reference architectures remain compliant
> - **Test requests per second (RPS) rates:** API: 1000 RPS, Web: 100 RPS, Git (Pull): 100 RPS, Git (Push): 20 RPS
> - **[Latest Results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/50k)**
@@ -42,7 +42,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -1170,8 +1170,8 @@ Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.
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.
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster).
+For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
The recommended cluster setup includes the following components:
@@ -1468,10 +1468,12 @@ the file of the same name on this server. If this is the first Omnibus node you
### Configure Gitaly
The [Gitaly](../gitaly/index.md) server nodes that make up the cluster have
-requirements that are dependent on data, specifically the number of projects
-and those projects' sizes. It's recommended that a Gitaly Cluster stores
-no more than 5 TB of data on each node. Depending on your
-repository storage requirements, you may require additional Gitaly Clusters.
+requirements that are dependent on data and load.
+
+NOTE:
+The Reference Architecture specs have been designed with good headroom in mind
+but for Gitaly, increased specs or additional
+Gitaly Cluster arrays may be required for notably large data sets or load.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -1544,6 +1546,26 @@ On each node:
# Recommended to be enabled for improved performance but can notably increase disk I/O
# Refer to https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#pack-objects-cache for more info
gitaly['pack_objects_cache_enabled'] = true
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+ ## 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 for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ gitaly['prometheus_listen_addr'] = '0.0.0.0:9236'
+ #
+ # END user configuration
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
@@ -1781,6 +1803,7 @@ To configure the Sidekiq nodes, on each one:
# Object storage
## This is an example for configuring Object Storage on GCP
## Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -1936,6 +1959,7 @@ On each node perform the following:
# This is an example for configuring Object Storage on GCP
# Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -2114,6 +2138,30 @@ To configure the Monitoring node:
retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13)
}
+ # Configure Prometheus to scrape services not covered by discovery
+ prometheus['scrape_configs'] = [
+ {
+ 'job_name': 'pgbouncer',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.31:9188",
+ "10.6.0.32:9188",
+ "10.6.0.33:9188",
+ ],
+ ],
+ },
+ {
+ 'job_name': 'praefect',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.131:9652",
+ "10.6.0.132:9652",
+ "10.6.0.133:9652",
+ ],
+ ],
+ },
+ ]
+
# Nginx - For Grafana access
nginx['enable'] = true
```
@@ -2139,7 +2187,7 @@ GitLab has been tested on a number of object storage providers:
- [Amazon S3](https://aws.amazon.com/s3/)
- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/)
+- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
@@ -2156,7 +2204,8 @@ 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.
+
+In GitLab 13.6 and later, it's also 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. This is required when no NFS node has been deployed.
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
@@ -2250,12 +2299,12 @@ use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
-| Service | Nodes | Configuration | GCP | Allocatable CPUs and Memory |
-|-------------------------------------------------------|-------|-------------------------|------------------|-----------------------------|
-| Webservice | 16 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | 510 vCPU, 472 GB memory |
-| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | 15.5 vCPU, 50 GB memory |
-| Supporting services such as NGINX, Prometheus | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | 7.75 vCPU, 25 GB memory |
-
+| Service | Nodes | Configuration | GCP | AWS | Min Allocatable CPUs and Memory |
+|-----------------------------------------------|-------|-------------------------|-----------------|--------------|---------------------------------|
+| Webservice | 16 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `m5.8xlarge` | 510 vCPU, 472 GB memory |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 15.5 vCPU, 50 GB memory |
+| Supporting services such as NGINX, Prometheus | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 7.75 vCPU, 25 GB memory |
+
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
- Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
@@ -2264,18 +2313,18 @@ future with further specific cloud provider details.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
services where applicable):
-| Service | Nodes | Configuration | GCP |
-|-----------------------------------------------------|-------|-------------------------|------------------|
-| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
-| 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/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 |
+| Service | Nodes | Configuration | GCP | AWS |
+|------------------------------------------|-------|------------------------|------------------|---------------|
+| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| PostgreSQL<sup>1</sup> | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` | `m5.8xlarge` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Internal load balancing node<sup>3</sup> | 1 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
+| Gitaly<sup>5</sup> | 3 | 64 vCPU, 240 GB memory | `n1-standard-64` | `m5.16xlarge` |
+| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Object storage<sup>4</sup> | n/a | n/a | n/a | n/a |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
@@ -2283,7 +2332,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index f2463afbf3b..dd7209a3a3a 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -21,7 +21,7 @@ costly-to-operate environment by using the
> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
> - **Estimated Costs:** [See cost table](index.md#cost-to-run)
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
-> - **Performance tested weekly with the [GitLab Performance Tool (GPT)](https://gitlab.com/gitlab-org/quality/performance)**:
+> - **Validation and test results:** The Quality Engineering team does [regular smoke and performance tests](index.md#validation-and-test-results) to ensure the reference architectures remain compliant
> - **Test requests per second (RPS) rates:** API: 100 RPS, Web: 10 RPS, Git (Pull): 10 RPS, Git (Push): 2 RPS
> - **[Latest Results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/5k)**
@@ -48,7 +48,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -1101,8 +1101,8 @@ The following IPs will be used as an example:
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.
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster).
+For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
The recommended cluster setup includes the following components:
@@ -1397,10 +1397,12 @@ the file of the same name on this server. If this is the first Omnibus node you
### Configure Gitaly
The [Gitaly](../gitaly/index.md) server nodes that make up the cluster have
-requirements that are dependent on data, specifically the number of projects
-and those projects' sizes. It's recommended that a Gitaly Cluster stores
-no more than 5 TB of data on each node. Depending on your
-repository storage requirements, you may require additional Gitaly Clusters.
+requirements that are dependent on data and load.
+
+NOTE:
+The Reference Architecture specs have been designed with good headroom in mind
+but for Gitaly, increased specs or additional
+Gitaly Cluster arrays may be required for notably large data sets or load.
Due to Gitaly having notable input and output requirements, we strongly
recommend that all Gitaly nodes use solid-state drives (SSDs). These SSDs
@@ -1473,6 +1475,26 @@ On each node:
# Recommended to be enabled for improved performance but can notably increase disk I/O
# Refer to https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#pack-objects-cache for more info
gitaly['pack_objects_cache_enabled'] = true
+
+ # Configure the Consul agent
+ consul['enable'] = true
+ ## Enable service discovery for Prometheus
+ consul['monitoring_service_discovery'] = true
+
+ # START user configuration
+ # Please set the real values as explained in Required Information section
+ #
+ ## 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 for monitoring
+ node_exporter['listen_address'] = '0.0.0.0:9100'
+ gitaly['prometheus_listen_addr'] = '0.0.0.0:9236'
+ #
+ # END user configuration
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective server:
@@ -1693,6 +1715,7 @@ To configure the Sidekiq nodes, one each one:
# Object Storage
## This is an example for configuring Object Storage on GCP
## Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -1867,6 +1890,7 @@ On each node perform the following:
# This is an example for configuring Object Storage on GCP
# Replace this config with your chosen Object Storage provider as desired
+ gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'Google',
'google_project' => '<gcp-project-name>',
@@ -2018,6 +2042,30 @@ running [Prometheus](../monitoring/prometheus/index.md) and
retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13)
}
+ # Configure Prometheus to scrape services not covered by discovery
+ prometheus['scrape_configs'] = [
+ {
+ 'job_name': 'pgbouncer',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.31:9188",
+ "10.6.0.32:9188",
+ "10.6.0.33:9188",
+ ],
+ ],
+ },
+ {
+ 'job_name': 'praefect',
+ 'static_configs' => [
+ 'targets' => [
+ "10.6.0.131:9652",
+ "10.6.0.132:9652",
+ "10.6.0.133:9652",
+ ],
+ ],
+ },
+ ]
+
# Nginx - For Grafana access
nginx['enable'] = true
```
@@ -2058,7 +2106,7 @@ GitLab has been tested on a number of object storage providers:
- [Amazon S3](https://aws.amazon.com/s3/)
- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces/)
+- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
@@ -2075,7 +2123,8 @@ 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.
+
+In GitLab 13.6 and later, it's also 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. This is required when no NFS node has been deployed.
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
@@ -2169,11 +2218,11 @@ use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
-| Service | Nodes | Configuration | GCP | Allocatable CPUs and Memory |
-|-------------------------------------------------------|-------|-------------------------|------------------|-----------------------------|
-| Webservice | 5 | 16 vCPU, 14.4 GB memory | `n1-highcpu-16` | 79.5 vCPU, 62 GB memory |
-| Sidekiq | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | 11.8 vCPU, 38.9 GB memory |
-| Supporting services such as NGINX, Prometheus | 2 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | 3.9 vCPU, 11.8 GB memory |
+| Service | Nodes | Configuration | GCP | AWS | Min Allocatable CPUs and Memory |
+|-----------------------------------------------|-------|-------------------------|-----------------|--------------|---------------------------------|
+| Webservice | 5 | 16 vCPU, 14.4 GB memory | `n1-highcpu-16` | `c5.4xlarge` | 79.5 vCPU, 62 GB memory |
+| Sidekiq | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 11.8 vCPU, 38.9 GB memory |
+| Supporting services such as NGINX, Prometheus | 2 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` | 3.9 vCPU, 11.8 GB memory |
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
@@ -2183,17 +2232,17 @@ future with further specific cloud provider details.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
services where applicable):
-| Service | Nodes | Configuration | GCP |
-|--------------------------------------------|-------|-------------------------|------------------|
-| Redis<sup>2</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` |
-| Consul<sup>1</sup> + Sentinel<sup>2</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
-| 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<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 |
+| Service | Nodes | Configuration | GCP | AWS |
+|-------------------------------------------|-------|-----------------------|-----------------|--------------|
+| Redis<sup>2</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` |
+| Consul<sup>1</sup> + Sentinel<sup>2</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| PostgreSQL<sup>1</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Gitaly<sup>5</sup> | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` | `m5.2xlarge` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
+| Object storage<sup>4</sup> | n/a | n/a | n/a | n/a |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
@@ -2201,7 +2250,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.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
<!-- markdownlint-enable MD029 -->
NOTE:
diff --git a/doc/administration/reference_architectures/index.md b/doc/administration/reference_architectures/index.md
index 3fcd6d7ae4e..bb741c39c08 100644
--- a/doc/administration/reference_architectures/index.md
+++ b/doc/administration/reference_architectures/index.md
@@ -18,20 +18,6 @@ you scale GitLab accordingly.
![Reference Architectures](img/reference-architectures.png)
<!-- Internal link: https://docs.google.com/spreadsheets/d/1obYP4fLKkVVDOljaI3-ozhmCiPtEeMblbBKkf2OADKs/edit#gid=1403207183 -->
-Testing on these reference architectures was performed with the
-[GitLab Performance Tool](https://gitlab.com/gitlab-org/quality/performance)
-at specific coded workloads, and the throughputs used for testing were
-calculated based on sample customer data. Select the
-[reference architecture](#available-reference-architectures) that matches your scale.
-
-Each endpoint type is tested with the following number of requests per second (RPS)
-per 1,000 users:
-
-- API: 20 RPS
-- Web: 2 RPS
-- Git (Pull): 2 RPS
-- Git (Push): 0.4 RPS (rounded to nearest integer)
-
For GitLab instances with less than 2,000 users, it's recommended that you use
the [default setup](#automated-backups) by
[installing GitLab](../../install/index.md) on a single machine to minimize
@@ -48,7 +34,8 @@ When scaling GitLab, there are several factors to consider:
- A load balancer is added in front to distribute traffic across the application nodes.
- The application nodes connects to a shared file server and PostgreSQL and Redis services on the backend.
-NOTE:
+## Available reference architectures
+
Depending on your workflow, the following recommended reference architectures
may need to be adapted accordingly. Your workload is influenced by factors
including how active your users are, how much automation you use, mirroring,
@@ -57,12 +44,10 @@ provided by [GCP machine types](https://cloud.google.com/compute/docs/machine-ty
For different cloud vendors, attempt to select options that best match the
provided architecture.
-## Available reference architectures
-
-The following reference architectures are available.
-
### GitLab package (Omnibus)
+The following reference architectures, where the GitLab package is used, are available:
+
- [Up to 1,000 users](1k_users.md)
- [Up to 2,000 users](2k_users.md)
- [Up to 3,000 users](3k_users.md)
@@ -87,17 +72,53 @@ to get assistance from Support with troubleshooting the [2,000 users](2k_users.m
and higher reference architectures.
[Read more about our definition of scaled architectures](https://about.gitlab.com/support/#definition-of-scaled-architecture).
-### Validation and test results
+## Validation and test results
+
+The [Quality Engineering team](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/)
+does regular smoke and performance tests for the reference architectures to ensure they
+remain compliant.
+
+### Why we perform the tests
+
+The Quality Department has a focus on measuring and improving the performance
+of GitLab, as well as creating and validating reference architectures that
+self-managed customers can rely on as performant configurations.
+
+For more information, see our [handbook page](https://about.gitlab.com/handbook/engineering/quality/performance-and-scalability/).
+
+### How we perform the tests
+
+Testing occurs against all reference architectures and cloud providers in an automated and ad-hoc fashion. This is done by two tools:
+
+- The [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/gitlab-environment-toolkit) for building the environments.
+- The [GitLab Performance Tool](https://gitlab.com/gitlab-org/quality/performance) for performance testing.
+
+Network latency on the test environments between components on all Cloud Providers were measured at <5ms. Note that this is shared as an observation and not as an implicit recommendation.
+
+We aim to have a "test smart" approach where architectures tested have a good range that can also apply to others. Testing focuses on 10k Omnibus on GCP as the testing has shown this is a good bellwether for the other architectures and cloud providers as well as Cloud Native Hybrids.
+
+The Standard Reference Architectures are designed to be platform agnostic, with everything being run on VMs via [Omnibus GitLab](https://docs.gitlab.com/omnibus/). While testing occurs primarily on GCP, ad-hoc testing has shown that they perform similarly on equivalently specced hardware on other Cloud Providers or if run on premises (bare-metal).
+
+Testing on these reference architectures is performed with the
+[GitLab Performance Tool](https://gitlab.com/gitlab-org/quality/performance)
+at specific coded workloads, and the throughputs used for testing are
+calculated based on sample customer data. Select the
+[reference architecture](#available-reference-architectures) that matches your scale.
-The [Quality Engineering - Enablement team](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/) does regular smoke and performance tests for the reference architectures to ensure they remain compliant.
+Each endpoint type is tested with the following number of requests per second (RPS)
+per 1,000 users:
-- Testing occurs against all reference architectures and cloud providers in an automated and ad-hoc fashion. This is done by two tools:
- - The [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/gitlab-environment-toolkit) for building the environments.
- - The [GitLab Performance Tool](https://gitlab.com/gitlab-org/quality/performance) for performance testing.
-- Network latency on the test environments between components on all Cloud Providers were measured at <5ms. Note that this is shared as an observation and not as an implicit recommendation.
-- We aim to have a "test smart" approach where architectures tested have a good range that can also apply to others. Testing focuses on 10k Omnibus on GCP as the testing has shown this is a good bellwether for the other architectures and cloud providers as well as Cloud Native Hybrids.
-- Testing is done publicly and all results are shared.
-- For more information about performance testing at GitLab, read [how our QA team leverages GitLab’s performance testing tool (and you can too)](https://about.gitlab.com/blog/2020/02/18/how-were-building-up-performance-testing-of-gitlab/).
+- API: 20 RPS
+- Web: 2 RPS
+- Git (Pull): 2 RPS
+- Git (Push): 0.4 RPS (rounded to nearest integer)
+
+### How to interpret the results
+
+NOTE:
+Read our blog post on [how our QA team leverages GitLab’s performance testing tool](https://about.gitlab.com/blog/2020/02/18/how-were-building-up-performance-testing-of-gitlab/).
+
+Testing is done publicly and all results are shared.
The following table details the testing done against the reference architectures along with the frequency and results. Additional testing is continuously evaluated, and the table is updated accordingly.
@@ -192,9 +213,7 @@ table.test-coverage th {
</tr>
</table>
-The Standard Reference Architectures are designed to be platform agnostic, with everything being run on VMs via [Omnibus GitLab](https://docs.gitlab.com/omnibus/). While testing occurs primarily on GCP, ad-hoc testing has shown that they perform similarly on equivalently specced hardware on other Cloud Providers or if run on premises (bare-metal).
-
-### Cost to run
+## Cost to run
<table class="test-coverage">
<col>
@@ -217,61 +236,61 @@ The Standard Reference Architectures are designed to be platform agnostic, with
<th scope="row">1k</th>
<td><a href="https://cloud.google.com/products/calculator#id=a6d6a94a-c7dc-4c22-85c4-7c5747f272ed">Calculated cost</a></td>
<td></td>
+ <td><a href="https://calculator.aws/#/estimate?id=b51f178f4403b69a63f6eb33ea425f82de3bf249">Calculated cost</a></td>
<td></td>
- <td></td>
- <td></td>
+ <td><a href="https://azure.com/e/1adf30bef7e34ceba9efa97c4470417b">Calculated cost</a></td>
</tr>
<tr>
<th scope="row">2k</th>
<td><a href="https://cloud.google.com/products/calculator#id=84d11491-d72a-493c-a16e-650931faa658">Calculated cost</a></td>
<td></td>
+ <td><a href="https://calculator.aws/#/estimate?id=dce36b5cb6ab25211f74e47233d77f58fefb54e2">Calculated cost</a></td>
<td></td>
- <td></td>
- <td></td>
+ <td><a href="https://azure.com/e/72764902f3854f798407fb03c3de4b6f">Calculated cost</a></td>
</tr>
<tr>
<th scope="row">3k</th>
<td><a href="https://cloud.google.com/products/calculator/#id=ac4838e6-9c40-4a36-ac43-6d1bc1843e08">Calculated cost</a></td>
<td></td>
+ <td><a href="https://calculator.aws/#/estimate?id=b1c5b4e32e990eaeb035a148255132bd28988760">Calculated cost</a></td>
<td></td>
- <td></td>
- <td></td>
+ <td><a href="https://azure.com/e/0dbfc575051943b9970e5d8ace03680d">Calculated cost</a></td>
</tr>
<tr>
<th scope="row">5k</th>
<td><a href="https://cloud.google.com/products/calculator/#id=8742e8ea-c08f-4e0a-b058-02f3a1c38a2f">Calculated cost</a></td>
<td></td>
+ <td><a href="https://calculator.aws/#/estimate?id=2bf1af883096e6f4c6efddb4f3c35febead7fec2">Calculated cost</a></td>
<td></td>
- <td></td>
- <td></td>
+ <td><a href="https://azure.com/e/8f618711ffec4b039f1581871ca6a7c9">Calculated cost</a></td>
</tr>
<tr>
<th scope="row">10k</th>
<td><a href="https://cloud.google.com/products/calculator#id=e77713f6-dc0b-4bb3-bcef-cea904ac8efd">Calculated cost</a></td>
<td></td>
+ <td><a href="https://calculator.aws/#/estimate?id=1d374df13c0f2088d332ab0134f5b1d0f717259e">Calculated cost</a></td>
<td></td>
- <td></td>
- <td></td>
+ <td><a href="https://azure.com/e/de3da8286dda4d4db1362932bc75410b">Calculated cost</a></td>
</tr>
<tr>
<th scope="row">25k</th>
<td><a href="https://cloud.google.com/products/calculator#id=925386e1-c01c-4c0a-8d7d-ebde1824b7b0">Calculated cost</a></td>
<td></td>
+ <td><a href="https://calculator.aws/#/estimate?id=46fe6a6e9256d9b7779fae59fbbfa7e836942b7d">Calculated cost</a></td>
<td></td>
- <td></td>
- <td></td>
+ <td><a href="https://azure.com/e/69724ebd82914a60857da6a3ace05a64">Calculate cost</a></td>
</tr>
<tr>
<th scope="row">50k</th>
<td><a href="https://cloud.google.com/products/calculator/#id=8006396b-88ee-40cd-a1c8-77cdefa4d3c8">Calculated cost</a></td>
<td></td>
+ <td><a href="https://calculator.aws/#/estimate?id=e15926b1a3c7139e4faf390a3875ff807d2ab91c">Calculated cost</a></td>
<td></td>
- <td></td>
- <td></td>
+ <td><a href="https://azure.com/e/3f973040ebc14023933d35f576c89846">Calculated cost</a></td>
</tr>
</table>
-### Recommended cloud providers and services
+## Recommended cloud providers and services
NOTE:
The following lists are non exhaustive. Generally, other cloud providers not listed
@@ -347,7 +366,7 @@ The following specific cloud provider services have been found to have issues in
- [Azure Blob Storage](https://azure.microsoft.com/en-gb/services/storage/blobs/) has been found to have performance limits that can impact production use at certain times. For larger Reference Architectures the service may not be sufficient for production use and an alternative is recommended for use instead.
- [Azure Database for PostgreSQL Server](https://azure.microsoft.com/en-gb/services/postgresql/#overview) (Single / Flexible) is not recommended for use due to notable performance issues or missing functionality.
-- [AWS Aurora Database](https://aws.amazon.com/rds/aurora) is not recommended due to compatibility issues.
+- [AWS Aurora Database](https://aws.amazon.com/rds/aurora/) is not recommended due to compatibility issues.
NOTE:
As a general rule we unfortunately don't recommend Azure Services at this time.
@@ -411,7 +430,7 @@ to any of the [available reference architectures](#available-reference-architect
> - Required domain knowledge: PostgreSQL, HAProxy, shared storage, distributed systems
GitLab supports [zero-downtime upgrades](../../update/zero_downtime.md).
-Single GitLab nodes can be updated with only a [few minutes of downtime](../../update/zero_downtime.md#single-node-deployment).
+Single GitLab nodes can be updated with only a [few minutes of downtime](../../update/index.md#upgrade-based-on-installation-method).
To avoid this, we recommend to separate GitLab into several application nodes.
As long as at least one of each component is online and capable of handling the instance's usage load, your team's productivity will not be interrupted during the update.
diff --git a/doc/administration/repository_checks.md b/doc/administration/repository_checks.md
index 6dd8faac65b..c2233f70a9a 100644
--- a/doc/administration/repository_checks.md
+++ b/doc/administration/repository_checks.md
@@ -34,7 +34,7 @@ When enabled, GitLab periodically runs a repository check on all project reposit
repositories to detect possible data corruption. A project is checked no more than once per month.
Administrators can configure the frequency of repository checks. To edit the frequency:
-- For Omnibus GitLab installations, edit `gitlab_rails['repository_check_worker_cron']` in
+- For Omnibus GitLab installations, edit `gitlab_rails['repository_check_worker_cron']` in
`/etc/gitlab/gitlab.rb`.
- For source-based installations, edit `[gitlab.cron_jobs.repository_check_worker]` in
`/home/git/gitlab/config/gitlab.yml`.
diff --git a/doc/administration/sidekiq_health_check.md b/doc/administration/sidekiq_health_check.md
index 2ed736bac2c..ae02711f46f 100644
--- a/doc/administration/sidekiq_health_check.md
+++ b/doc/administration/sidekiq_health_check.md
@@ -21,7 +21,7 @@ The readiness probe checks whether the Sidekiq workers are ready to process jobs
GET /readiness
```
-Assuming you set up Sidekiq's address and port to be `localhost` and `8092` respectively,
+If you set Sidekiq's address as `localhost` and port as `8092`,
here's an example request:
```shell
@@ -44,7 +44,7 @@ Checks whether the Sidekiq cluster is running.
GET /liveness
```
-Assuming you set up Sidekiq's address and port to be `localhost` and `8092` respectively,
+If you set Sidekiq's address as `localhost` and port as `8092`,
here's an example request:
```shell
diff --git a/doc/administration/system_hooks.md b/doc/administration/system_hooks.md
new file mode 100644
index 00000000000..71d7e7f1426
--- /dev/null
+++ b/doc/administration/system_hooks.md
@@ -0,0 +1,771 @@
+---
+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
+type: reference
+---
+
+# System hooks **(FREE SELF)**
+
+Your GitLab instance can perform HTTP POST requests on the following events:
+
+- `group_create`
+- `group_destroy`
+- `group_rename`
+- `key_create`
+- `key_destroy`
+- `project_create`
+- `project_destroy`
+- `project_rename`
+- `project_transfer`
+- `project_update`
+- `repository_update`
+- `user_add_to_group`
+- `user_add_to_team`
+- `user_create`
+- `user_destroy`
+- `user_failed_login`
+- `user_remove_from_group`
+- `user_remove_from_team`
+- `user_rename`
+- `user_update_for_group`
+- `user_update_for_team`
+
+The triggers for most of these are self-explanatory, but `project_update` and
+`project_rename` deserve some clarification: `project_update` is fired any time
+an attribute of a project is changed (including name, description, and tags)
+_unless_ the `path` attribute is also changed. In that case, a `project_rename`
+is triggered instead (so that, for instance, if all you care about is the
+repository URL, you can just listen for `project_rename`).
+
+`user_failed_login` is sent whenever a _blocked_ user attempts to sign in and is
+denied access.
+
+System hooks can be used, for example, for logging or changing information in an
+LDAP server.
+
+In addition to these default events, you can enable triggers for other events,
+such as push events, and disable the `repository_update` event
+when you create a system hook.
+
+NOTE:
+We follow the same structure and deprecations as [Webhooks](../user/project/integrations/webhooks.md)
+for Push and Tag events, but we never display commits.
+
+## Create a system hook
+
+To create a system hook:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **System Hooks**.
+1. Provide the **URL** and **Secret Token**.
+1. Select the checkbox next to each optional **Trigger** you want to enable.
+1. Select **Enable SSL verification**, if desired.
+1. Click **Add system hook**.
+
+## Hooks request example
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: System Hook
+```
+
+**Project created:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:54Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "project_create",
+ "name": "StoreCloud",
+ "owner_email": "johnsmith@example.com",
+ "owner_name": "John Smith",
+ "owners": [{
+ "name": "John",
+ "email": "user1@example.com"
+ }],
+ "path": "storecloud",
+ "path_with_namespace": "jsmith/storecloud",
+ "project_id": 74,
+ "project_visibility": "private"
+}
+```
+
+**Project destroyed:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:58Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "project_destroy",
+ "name": "Underscore",
+ "owner_email": "johnsmith@example.com",
+ "owner_name": "John Smith",
+ "owners": [{
+ "name": "John",
+ "email": "user1@example.com"
+ }],
+ "path": "underscore",
+ "path_with_namespace": "jsmith/underscore",
+ "project_id": 73,
+ "project_visibility": "internal"
+}
+```
+
+**Project renamed:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:58Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "project_rename",
+ "name": "Underscore",
+ "path": "underscore",
+ "path_with_namespace": "jsmith/underscore",
+ "project_id": 73,
+ "owner_name": "John Smith",
+ "owner_email": "johnsmith@example.com",
+ "owners": [{
+ "name": "John",
+ "email": "user1@example.com"
+ }],
+ "project_visibility": "internal",
+ "old_path_with_namespace": "jsmith/overscore"
+}
+```
+
+Note that `project_rename` is not triggered if the namespace changes.
+Please refer to `group_rename` and `user_rename` for that case.
+
+**Project transferred:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:58Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "project_transfer",
+ "name": "Underscore",
+ "path": "underscore",
+ "path_with_namespace": "scores/underscore",
+ "project_id": 73,
+ "owner_name": "John Smith",
+ "owner_email": "johnsmith@example.com",
+ "owners": [{
+ "name": "John",
+ "email": "user1@example.com"
+ }],
+ "project_visibility": "internal",
+ "old_path_with_namespace": "jsmith/overscore"
+}
+```
+
+**Project updated:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:54Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "project_update",
+ "name": "StoreCloud",
+ "owner_email": "johnsmith@example.com",
+ "owner_name": "John Smith",
+ "owners": [{
+ "name": "John",
+ "email": "user1@example.com"
+ }],
+ "path": "storecloud",
+ "path_with_namespace": "jsmith/storecloud",
+ "project_id": 74,
+ "project_visibility": "private"
+}
+```
+
+**New Team Member:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:56Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "user_add_to_team",
+ "access_level": "Maintainer",
+ "project_id": 74,
+ "project_name": "StoreCloud",
+ "project_path": "storecloud",
+ "project_path_with_namespace": "jsmith/storecloud",
+ "user_email": "johnsmith@example.com",
+ "user_name": "John Smith",
+ "user_username": "johnsmith",
+ "user_id": 41,
+ "project_visibility": "private"
+}
+```
+
+**Team Member Removed:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:56Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "user_remove_from_team",
+ "access_level": "Maintainer",
+ "project_id": 74,
+ "project_name": "StoreCloud",
+ "project_path": "storecloud",
+ "project_path_with_namespace": "jsmith/storecloud",
+ "user_email": "johnsmith@example.com",
+ "user_name": "John Smith",
+ "user_username": "johnsmith",
+ "user_id": 41,
+ "project_visibility": "private"
+}
+```
+
+**Team Member Updated:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:56Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "user_update_for_team",
+ "access_level": "Maintainer",
+ "project_id": 74,
+ "project_name": "StoreCloud",
+ "project_path": "storecloud",
+ "project_path_with_namespace": "jsmith/storecloud",
+ "user_email": "johnsmith@example.com",
+ "user_name": "John Smith",
+ "user_username": "johnsmith",
+ "user_id": 41,
+ "project_visibility": "private"
+}
+```
+
+**User created:**
+
+```json
+{
+ "created_at": "2012-07-21T07:44:07Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "email": "js@gitlabhq.com",
+ "event_name": "user_create",
+ "name": "John Smith",
+ "username": "js",
+ "user_id": 41
+}
+```
+
+**User removed:**
+
+```json
+{
+ "created_at": "2012-07-21T07:44:07Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "email": "js@gitlabhq.com",
+ "event_name": "user_destroy",
+ "name": "John Smith",
+ "username": "js",
+ "user_id": 41
+}
+```
+
+**User failed login:**
+
+```json
+{
+ "event_name": "user_failed_login",
+ "created_at": "2017-10-03T06:08:48Z",
+ "updated_at": "2018-01-15T04:52:06Z",
+ "name": "John Smith",
+ "email": "user4@example.com",
+ "user_id": 26,
+ "username": "user4",
+ "state": "blocked"
+}
+```
+
+If the user is blocked via LDAP, `state` is `ldap_blocked`.
+
+**User renamed:**
+
+```json
+{
+ "event_name": "user_rename",
+ "created_at": "2017-11-01T11:21:04Z",
+ "updated_at": "2017-11-01T14:04:47Z",
+ "name": "new-name",
+ "email": "best-email@example.tld",
+ "user_id": 58,
+ "username": "new-exciting-name",
+ "old_username": "old-boring-name"
+}
+```
+
+**Key added**
+
+```json
+{
+ "event_name": "key_create",
+ "created_at": "2014-08-18 18:45:16 UTC",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "username": "root",
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC58FwqHUbebw2SdT7SP4FxZ0w+lAO/erhy2ylhlcW/tZ3GY3mBu9VeeiSGoGz8hCx80Zrz+aQv28xfFfKlC8XQFpCWwsnWnQqO2Lv9bS8V1fIHgMxOHIt5Vs+9CAWGCCvUOAurjsUDoE2ALIXLDMKnJxcxD13XjWdK54j6ZXDB4syLF0C2PnAQSVY9X7MfCYwtuFmhQhKaBussAXpaVMRHltie3UYSBUUuZaB3J4cg/7TxlmxcNd+ppPRIpSZAB0NI6aOnqoBCpimscO/VpQRJMVLr3XiSYeT6HBiDXWHnIVPfQc03OGcaFqOit6p8lYKMaP/iUQLm+pgpZqrXZ9vB john@localhost",
+ "id": 4
+}
+```
+
+**Key removed**
+
+```json
+{
+ "event_name": "key_destroy",
+ "created_at": "2014-08-18 18:45:16 UTC",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "username": "root",
+ "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC58FwqHUbebw2SdT7SP4FxZ0w+lAO/erhy2ylhlcW/tZ3GY3mBu9VeeiSGoGz8hCx80Zrz+aQv28xfFfKlC8XQFpCWwsnWnQqO2Lv9bS8V1fIHgMxOHIt5Vs+9CAWGCCvUOAurjsUDoE2ALIXLDMKnJxcxD13XjWdK54j6ZXDB4syLF0C2PnAQSVY9X7MfCYwtuFmhQhKaBussAXpaVMRHltie3UYSBUUuZaB3J4cg/7TxlmxcNd+ppPRIpSZAB0NI6aOnqoBCpimscO/VpQRJMVLr3XiSYeT6HBiDXWHnIVPfQc03OGcaFqOit6p8lYKMaP/iUQLm+pgpZqrXZ9vB john@localhost",
+ "id": 4
+}
+```
+
+**Group created:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:54Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "group_create",
+ "name": "StoreCloud",
+ "path": "storecloud",
+ "group_id": 78
+}
+```
+
+**Group removed:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:54Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "group_destroy",
+ "name": "StoreCloud",
+ "path": "storecloud",
+ "group_id": 78
+}
+```
+
+**Group renamed:**
+
+```json
+{
+ "event_name": "group_rename",
+ "created_at": "2017-10-30T15:09:00Z",
+ "updated_at": "2017-11-01T10:23:52Z",
+ "name": "Better Name",
+ "path": "better-name",
+ "full_path": "parent-group/better-name",
+ "group_id": 64,
+ "old_path": "old-name",
+ "old_full_path": "parent-group/old-name"
+}
+```
+
+**New Group Member:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:56Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "user_add_to_group",
+ "group_access": "Maintainer",
+ "group_id": 78,
+ "group_name": "StoreCloud",
+ "group_path": "storecloud",
+ "user_email": "johnsmith@example.com",
+ "user_name": "John Smith",
+ "user_username": "johnsmith",
+ "user_id": 41
+}
+```
+
+**Group Member Removed:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:56Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "user_remove_from_group",
+ "group_access": "Maintainer",
+ "group_id": 78,
+ "group_name": "StoreCloud",
+ "group_path": "storecloud",
+ "user_email": "johnsmith@example.com",
+ "user_name": "John Smith",
+ "user_username": "johnsmith",
+ "user_id": 41
+}
+```
+
+**Group Member Updated:**
+
+```json
+{
+ "created_at": "2012-07-21T07:30:56Z",
+ "updated_at": "2012-07-21T07:38:22Z",
+ "event_name": "user_update_for_group",
+ "group_access": "Maintainer",
+ "group_id": 78,
+ "group_name": "StoreCloud",
+ "group_path": "storecloud",
+ "user_email": "johnsmith@example.com",
+ "user_name": "John Smith",
+ "user_username": "johnsmith",
+ "user_id": 41
+}
+```
+
+## Push events
+
+Triggered when you push to the repository, except when pushing tags.
+It generates one event per modified branch.
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: System Hook
+```
+
+**Request body:**
+
+```json
+{
+ "event_name": "push",
+ "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
+ "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
+ "ref": "refs/heads/master",
+ "checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
+ "user_id": 4,
+ "user_name": "John Smith",
+ "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":{
+ "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": "c5feabde2d8cd023215af4d2ceeb7a64839fc428",
+ "message": "Add simple search to projects in public area",
+ "timestamp": "2013-05-13T18:18:08+00:00",
+ "url": "https://dev.gitlab.org/gitlab/gitlabhq/commit/c5feabde2d8cd023215af4d2ceeb7a64839fc428",
+ "author": {
+ "name": "Example User",
+ "email": "user@example.com"
+ }
+ }
+ ],
+ "total_commits_count": 1
+}
+```
+
+## Tag events
+
+Triggered when you create (or delete) tags to the repository.
+It generates one event per modified tag.
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: System Hook
+```
+
+**Request body:**
+
+```json
+{
+ "event_name": "tag_push",
+ "before": "0000000000000000000000000000000000000000",
+ "after": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
+ "ref": "refs/tags/v1.0.0",
+ "checkout_sha": "5937ac0a7beb003549fc5fd26fc247adbce4a52e",
+ "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":{
+ "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
+}
+```
+
+## 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: 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=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
+ }]
+ }
+ }
+}
+```
+
+## Repository Update events
+
+Triggered only once when you push to the repository (including tags).
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: System Hook
+```
+
+**Request body:**
+
+```json
+{
+ "event_name": "repository_update",
+ "user_id": 1,
+ "user_name": "John Smith",
+ "user_email": "admin@example.com",
+ "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
+ "project_id": 1,
+ "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",
+ "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"
+ },
+ "changes": [
+ {
+ "before":"8205ea8d81ce0c6b90fbe8280d118cc9fdad6130",
+ "after":"4045ea7a3df38697b3730a20fb73c8bed8a3e69e",
+ "ref":"refs/heads/master"
+ }
+ ],
+ "refs":["refs/heads/master"]
+}
+```
+
+## Local requests in system hooks
+
+[Requests to local network by system hooks](../security/webhooks.md) can be allowed
+or blocked by an administrator.
+
+<!-- ## Troubleshooting
+
+Include any troubleshooting steps that you can foresee. If you know beforehand what issues
+one might have when setting this up, or when something is changed, or on upgrading, it's
+important to describe those, too. Think of things that may go wrong and include them here.
+This is important to minimize requests for support, and to avoid doc comments with
+questions that you know someone might ask.
+
+Each scenario can be a third-level heading, e.g. `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index 1c948771f5b..54d934c8986 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -257,6 +257,13 @@ ProjectDestroyWorker.perform_async(project.id, user.id, {})
# or Projects::DestroyService.new(project, user).execute
```
+If this fails, display why it doesn't work with:
+
+```ruby
+project = Project.find_by_full_path('<project_path>')
+project.delete_error
+```
+
### Remove fork relationship manually
```ruby
diff --git a/doc/administration/troubleshooting/group_saml_scim.md b/doc/administration/troubleshooting/group_saml_scim.md
index a30ade058f6..c6a102e87ee 100644
--- a/doc/administration/troubleshooting/group_saml_scim.md
+++ b/doc/administration/troubleshooting/group_saml_scim.md
@@ -20,6 +20,7 @@ They may then set up a test configuration of the desired identity provider. We i
This section includes relevant screenshots of the following example configurations of [Group SAML](../../user/group/saml_sso/index.md) and [Group SCIM](../../user/group/saml_sso/scim_setup.md):
- [Azure Active Directory](#azure-active-directory)
+- [Google Workspace](#google-workspace)
- [Okta](#okta)
- [OneLogin](#onelogin)
@@ -47,6 +48,20 @@ Group Sync:
![Azure Group Claims](img/azure_configure_group_claim.png)
+## Google Workspace
+
+Basic SAML app configuration:
+
+![Google Workspace basic SAML](img/GoogleWorkspace-basic-SAML_v14_10.png)
+
+User claims and attributes:
+
+![Google Workspace user claims](img/GoogleWorkspace-claims_v14_10.png)
+
+IdP links and certificate:
+
+![Google Workspace Links and Certificate](img/GoogleWorkspace-linkscert_v14_10.png)
+
## Okta
Basic SAML app configuration:
diff --git a/doc/administration/troubleshooting/img/GoogleWorkspace-basic-SAML_v14_10.png b/doc/administration/troubleshooting/img/GoogleWorkspace-basic-SAML_v14_10.png
new file mode 100644
index 00000000000..bc11e18fb6f
--- /dev/null
+++ b/doc/administration/troubleshooting/img/GoogleWorkspace-basic-SAML_v14_10.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/GoogleWorkspace-claims_v14_10.png b/doc/administration/troubleshooting/img/GoogleWorkspace-claims_v14_10.png
new file mode 100644
index 00000000000..78bb1725e9c
--- /dev/null
+++ b/doc/administration/troubleshooting/img/GoogleWorkspace-claims_v14_10.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/GoogleWorkspace-linkscert_v14_10.png b/doc/administration/troubleshooting/img/GoogleWorkspace-linkscert_v14_10.png
new file mode 100644
index 00000000000..e665e23058c
--- /dev/null
+++ b/doc/administration/troubleshooting/img/GoogleWorkspace-linkscert_v14_10.png
Binary files differ
diff --git a/doc/administration/troubleshooting/log_parsing.md b/doc/administration/troubleshooting/log_parsing.md
index c5443c564f4..c5b1d302db2 100644
--- a/doc/administration/troubleshooting/log_parsing.md
+++ b/doc/administration/troubleshooting/log_parsing.md
@@ -11,6 +11,11 @@ but if they are not available you can still quickly parse
[GitLab logs](../logs.md) in JSON format
(the default in GitLab 12.0 and later) using [`jq`](https://stedolan.github.io/jq/).
+NOTE:
+Spefically for summarising error events and basic usage statistics,
+the GitLab Support Team provides the specialised
+[`fast-stats` tool](https://gitlab.com/gitlab-com/support/toolbox/fast-stats/#when-to-use-it).
+
## What is JQ?
As noted in its [manual](https://stedolan.github.io/jq/manual/), `jq` is a command-line JSON processor. The following examples
@@ -18,6 +23,10 @@ include use cases targeted for parsing GitLab log files.
## Parsing Logs
+The examples listed below address their respective log files by
+their relative Omnibus paths and default filenames.
+Find the respective full paths in the [GitLab logs sections](../logs.md#production_jsonlog).
+
### General Commands
#### Pipe colorized `jq` output into `less`
@@ -61,7 +70,7 @@ zcat some_json.log.25.gz | (head -1; tail -1) | jq '.time'
grep -hR <correlationID> | jq -c -R 'fromjson?' | jq -C -s 'sort_by(.time)' | less -R
```
-### Parsing `production_json.log` and `api_json.log`
+### Parsing `gitlab-rails/production_json.log` and `gitlab-rails/api_json.log`
#### Find all requests with a 5XX status code
@@ -111,7 +120,7 @@ jq 'select(.queue_duration > 10000)' <FILE>
jq -s 'map(select(.gitaly_calls != null)) | sort_by(-.gitaly_calls) | limit(10; .[])' <FILE>
```
-### Parsing `production_json.log`
+### Parsing `gitlab-rails/production_json.log`
#### Print the top three controller methods by request volume and their three longest durations
@@ -127,7 +136,7 @@ CT: 2435 METHOD: MetricsController#index DURS: 299.29, 284.01, 158.57
CT: 1328 METHOD: Projects::NotesController#index DURS: 403.99, 386.29, 384.39
```
-### Parsing `api_json.log`
+### Parsing `gitlab-rails/api_json.log`
#### Print top three routes with request count and their three longest durations
@@ -143,8 +152,22 @@ CT: 297 ROUTE: /api/:version/projects/:id/repository/tags DURS: 731.39,
CT: 190 ROUTE: /api/:version/projects/:id/repository/commits DURS: 1079.02, 979.68, 958.21
```
+### Parsing `gitlab-rails/geo.log`
+
+#### Find most common Geo sync errors
+
+If [the `geo:status` Rake task](../geo/replication/troubleshooting.md#sync-status-rake-task)
+repeatedly reports that some items never reach 100%,
+the following command helps to focus on the most common errors.
+
+```shell
+jq --raw-output 'select(.severity == "ERROR") | [.project_path, .message] | @tsv' geo.log | sort | uniq -c | sort | tail
+```
+
### Parsing `gitaly/current`
+The following examples are useful to [troubleshoot Gitaly](../gitaly/troubleshooting.md).
+
#### Find all Gitaly requests sent from web UI
```shell
@@ -185,7 +208,7 @@ jq --raw-output --slurp '
.[2]."grpc.time_ms",
.[0]."grpc.request.glProjectPath"
]
- | @sh' /var/log/gitlab/gitaly/current \
+ | @sh' current \
| awk 'BEGIN { printf "%7s %10s %10s %10s\t%s\n", "CT", "MAX DURS", "", "", "PROJECT" }
{ printf "%7u %7u ms, %7u ms, %7u ms\t%s\n", $1, $2, $3, $4, $5 }'
```
@@ -203,12 +226,12 @@ jq --raw-output --slurp '
#### Find all projects affected by a fatal Git problem
```shell
-grep "fatal: " /var/log/gitlab/gitaly/current | \
+grep "fatal: " current | \
jq '."grpc.request.glProjectPath"' | \
sort | uniq
```
-### Parsing `gitlab-shell.log`
+### Parsing `gitlab-shell/gitlab-shell.log`
For investigating Git calls via SSH, from [GitLab 12.10](https://gitlab.com/gitlab-org/gitlab-shell/-/merge_requests/367).
@@ -226,7 +249,7 @@ jq --raw-output --slurp '
| sort_by(-length)
| limit(20; .[])
| "count: \(length)\tuser: \(.[0].username)\tproject: \(.[0].gl_project_path)" ' \
- /var/log/gitlab/gitlab-shell/gitlab-shell.log
+ gitlab-shell.log
```
Find the top 20 calls by project, user, and command:
@@ -244,5 +267,5 @@ jq --raw-output --slurp '
| sort_by(-length)
| limit(20; .[])
| "count: \(length)\tcommand: \(.[0].command)\tuser: \(.[0].username)\tproject: \(.[0].gl_project_path)" ' \
- /var/log/gitlab/gitlab-shell/gitlab-shell.log
+ gitlab-shell.log
```
diff --git a/doc/api/api_resources.md b/doc/api/api_resources.md
index eabaa4217b5..f6d1e554aae 100644
--- a/doc/api/api_resources.md
+++ b/doc/api/api_resources.md
@@ -21,76 +21,77 @@ See also:
The following API resources are available in the project context:
-| Resource | Available endpoints |
-|:------------------------------------------------------------------------|:--------------------|
-| [Access requests](access_requests.md) | `/projects/:id/access_requests` (also available for groups) |
-| [Access tokens](resource_access_tokens.md) | `/projects/:id/access_tokens` (also available for groups) |
-| [Award emoji](award_emoji.md) | `/projects/:id/issues/.../award_emoji`, `/projects/:id/merge_requests/.../award_emoji`, `/projects/:id/snippets/.../award_emoji` |
-| [Branches](branches.md) | `/projects/:id/repository/branches/`, `/projects/:id/repository/merged_branches` |
-| [Commits](commits.md) | `/projects/:id/repository/commits`, `/projects/:id/statuses` |
-| [Container Registry](container_registry.md) | `/projects/:id/registry/repositories` |
-| [Custom attributes](custom_attributes.md) | `/projects/:id/custom_attributes` (also available for groups and users) |
-| [Debian distributions](packages/debian_project_distributions.md) | `/projects/:id/debian_distributions` (also available for groups) |
-| [Dependencies](dependencies.md) **(ULTIMATE)** | `/projects/:id/dependencies` |
-| [Deploy keys](deploy_keys.md) | `/projects/:id/deploy_keys` (also available standalone) |
-| [Deploy tokens](deploy_tokens.md) | `/projects/:id/deploy_tokens` (also available for groups and standalone) |
-| [Deployments](deployments.md) | `/projects/:id/deployments` |
+| Resource | Available endpoints |
+|:------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| [Access requests](access_requests.md) | `/projects/:id/access_requests` (also available for groups) |
+| [Access tokens](resource_access_tokens.md) | `/projects/:id/access_tokens` (also available for groups) |
+| [Agents](cluster_agents.md) | `/projects/:id/cluster_agents` |
+| [Award emoji](award_emoji.md) | `/projects/:id/issues/.../award_emoji`, `/projects/:id/merge_requests/.../award_emoji`, `/projects/:id/snippets/.../award_emoji` |
+| [Branches](branches.md) | `/projects/:id/repository/branches/`, `/projects/:id/repository/merged_branches` |
+| [Commits](commits.md) | `/projects/:id/repository/commits`, `/projects/:id/statuses` |
+| [Container Registry](container_registry.md) | `/projects/:id/registry/repositories` |
+| [Custom attributes](custom_attributes.md) | `/projects/:id/custom_attributes` (also available for groups and users) |
+| [Debian distributions](packages/debian_project_distributions.md) | `/projects/:id/debian_distributions` (also available for groups) |
+| [Dependencies](dependencies.md) **(ULTIMATE)** | `/projects/:id/dependencies` |
+| [Deploy keys](deploy_keys.md) | `/projects/:id/deploy_keys` (also available standalone) |
+| [Deploy tokens](deploy_tokens.md) | `/projects/:id/deploy_tokens` (also available for groups and standalone) |
+| [Deployments](deployments.md) | `/projects/:id/deployments` |
| [Discussions](discussions.md) (threaded comments) | `/projects/:id/issues/.../discussions`, `/projects/:id/snippets/.../discussions`, `/projects/:id/merge_requests/.../discussions`, `/projects/:id/commits/.../discussions` (also available for groups) |
-| [Environments](environments.md) | `/projects/:id/environments` |
-| [Error Tracking](error_tracking.md) | `/projects/:id/error_tracking/settings` |
-| [Events](events.md) | `/projects/:id/events` (also available for users and standalone) |
-| [Feature Flag User Lists](feature_flag_user_lists.md) | `/projects/:id/feature_flags_user_lists` |
-| [Feature Flags](feature_flags.md) | `/projects/:id/feature_flags` |
-| [Freeze Periods](freeze_periods.md) | `/projects/:id/freeze_periods` |
-| [Integrations](integrations.md) (Formerly "services") | `/projects/:id/integrations` |
-| [Invitations](invitations.md) | `/projects/:id/invitations` (also available for groups) |
-| [Issue boards](boards.md) | `/projects/:id/boards` |
-| [Issue links](issue_links.md) | `/projects/:id/issues/.../links` |
-| [Issues Statistics](issues_statistics.md) | `/projects/:id/issues_statistics` (also available for groups and standalone) |
-| [Issues](issues.md) | `/projects/:id/issues` (also available for groups and standalone) |
-| [Iterations](iterations.md) **(PREMIUM)** | `/projects/:id/iterations` (also available for groups) |
-| [Jobs](jobs.md) | `/projects/:id/jobs`, `/projects/:id/pipelines/.../jobs` |
-| [Labels](labels.md) | `/projects/:id/labels` |
-| [Managed licenses](managed_licenses.md) **(ULTIMATE)** | `/projects/:id/managed_licenses` |
-| [Members](members.md) | `/projects/:id/members` (also available for groups) |
-| [Merge request approvals](merge_request_approvals.md) **(PREMIUM)** | `/projects/:id/approvals`, `/projects/:id/merge_requests/.../approvals` |
-| [Merge requests](merge_requests.md) | `/projects/:id/merge_requests` (also available for groups and standalone) |
-| [Merge trains](merge_trains.md) | `/projects/:id/merge_trains` |
-| [Notes](notes.md) (comments) | `/projects/:id/issues/.../notes`, `/projects/:id/snippets/.../notes`, `/projects/:id/merge_requests/.../notes` (also available for groups) |
-| [Notification settings](notification_settings.md) | `/projects/:id/notification_settings` (also available for groups and standalone) |
-| [Packages](packages.md) | `/projects/:id/packages` |
-| [Pages domains](pages_domains.md) | `/projects/:id/pages` (also available standalone) |
-| [Pipeline schedules](pipeline_schedules.md) | `/projects/:id/pipeline_schedules` |
-| [Pipeline triggers](pipeline_triggers.md) | `/projects/:id/triggers` |
-| [Pipelines](pipelines.md) | `/projects/:id/pipelines` |
-| [Project badges](project_badges.md) | `/projects/:id/badges` |
-| [Project clusters](project_clusters.md) | `/projects/:id/clusters` |
-| [Project import/export](project_import_export.md) | `/projects/:id/export`, `/projects/import`, `/projects/:id/import` |
-| [Project milestones](milestones.md) | `/projects/:id/milestones` |
-| [Project snippets](project_snippets.md) | `/projects/:id/snippets` |
-| [Project templates](project_templates.md) | `/projects/:id/templates` |
-| [Project vulnerabilities](project_vulnerabilities.md) **(ULTIMATE)** | `/projects/:id/templates` |
-| [Project wikis](wikis.md) | `/projects/:id/wikis` |
-| [Project-level variables](project_level_variables.md) | `/projects/:id/variables` |
-| [Projects](projects.md) including setting Webhooks | `/projects`, `/projects/:id/hooks` (also available for users) |
-| [Protected branches](protected_branches.md) | `/projects/:id/protected_branches` |
-| [Protected environments](protected_environments.md) | `/projects/:id/protected_environments` |
-| [Protected tags](protected_tags.md) | `/projects/:id/protected_tags` |
-| [Release links](releases/links.md) | `/projects/:id/releases/.../assets/links` |
-| [Releases](releases/index.md) | `/projects/:id/releases` |
-| [Remote mirrors](remote_mirrors.md) | `/projects/:id/remote_mirrors` |
-| [Repositories](repositories.md) | `/projects/:id/repository` |
-| [Repository files](repository_files.md) | `/projects/:id/repository/files` |
-| [Repository submodules](repository_submodules.md) | `/projects/:id/repository/submodules` |
-| [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) |
-| [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` |
-| [Vulnerabilities](vulnerabilities.md) **(ULTIMATE)** | `/vulnerabilities/:id` |
-| [Vulnerability exports](vulnerability_exports.md) **(ULTIMATE)** | `/projects/:id/vulnerability_exports` |
-| [Vulnerability findings](vulnerability_findings.md) **(ULTIMATE)** | `/projects/:id/vulnerability_findings` |
+| [Environments](environments.md) | `/projects/:id/environments` |
+| [Error Tracking](error_tracking.md) | `/projects/:id/error_tracking/settings` |
+| [Events](events.md) | `/projects/:id/events` (also available for users and standalone) |
+| [Feature Flag User Lists](feature_flag_user_lists.md) | `/projects/:id/feature_flags_user_lists` |
+| [Feature Flags](feature_flags.md) | `/projects/:id/feature_flags` |
+| [Freeze Periods](freeze_periods.md) | `/projects/:id/freeze_periods` |
+| [Integrations](integrations.md) (Formerly "services") | `/projects/:id/integrations` |
+| [Invitations](invitations.md) | `/projects/:id/invitations` (also available for groups) |
+| [Issue boards](boards.md) | `/projects/:id/boards` |
+| [Issue links](issue_links.md) | `/projects/:id/issues/.../links` |
+| [Issues Statistics](issues_statistics.md) | `/projects/:id/issues_statistics` (also available for groups and standalone) |
+| [Issues](issues.md) | `/projects/:id/issues` (also available for groups and standalone) |
+| [Iterations](iterations.md) **(PREMIUM)** | `/projects/:id/iterations` (also available for groups) |
+| [Jobs](jobs.md) | `/projects/:id/jobs`, `/projects/:id/pipelines/.../jobs` |
+| [Labels](labels.md) | `/projects/:id/labels` |
+| [Managed licenses](managed_licenses.md) **(ULTIMATE)** | `/projects/:id/managed_licenses` |
+| [Members](members.md) | `/projects/:id/members` (also available for groups) |
+| [Merge request approvals](merge_request_approvals.md) **(PREMIUM)** | `/projects/:id/approvals`, `/projects/:id/merge_requests/.../approvals` |
+| [Merge requests](merge_requests.md) | `/projects/:id/merge_requests` (also available for groups and standalone) |
+| [Merge trains](merge_trains.md) | `/projects/:id/merge_trains` |
+| [Notes](notes.md) (comments) | `/projects/:id/issues/.../notes`, `/projects/:id/snippets/.../notes`, `/projects/:id/merge_requests/.../notes` (also available for groups) |
+| [Notification settings](notification_settings.md) | `/projects/:id/notification_settings` (also available for groups and standalone) |
+| [Packages](packages.md) | `/projects/:id/packages` |
+| [Pages domains](pages_domains.md) | `/projects/:id/pages` (also available standalone) |
+| [Pipeline schedules](pipeline_schedules.md) | `/projects/:id/pipeline_schedules` |
+| [Pipeline triggers](pipeline_triggers.md) | `/projects/:id/triggers` |
+| [Pipelines](pipelines.md) | `/projects/:id/pipelines` |
+| [Project badges](project_badges.md) | `/projects/:id/badges` |
+| [Project clusters](project_clusters.md) | `/projects/:id/clusters` |
+| [Project import/export](project_import_export.md) | `/projects/:id/export`, `/projects/import`, `/projects/:id/import` |
+| [Project milestones](milestones.md) | `/projects/:id/milestones` |
+| [Project snippets](project_snippets.md) | `/projects/:id/snippets` |
+| [Project templates](project_templates.md) | `/projects/:id/templates` |
+| [Project vulnerabilities](project_vulnerabilities.md) **(ULTIMATE)** | `/projects/:id/templates` |
+| [Project wikis](wikis.md) | `/projects/:id/wikis` |
+| [Project-level variables](project_level_variables.md) | `/projects/:id/variables` |
+| [Projects](projects.md) including setting Webhooks | `/projects`, `/projects/:id/hooks` (also available for users) |
+| [Protected branches](protected_branches.md) | `/projects/:id/protected_branches` |
+| [Protected environments](protected_environments.md) | `/projects/:id/protected_environments` |
+| [Protected tags](protected_tags.md) | `/projects/:id/protected_tags` |
+| [Release links](releases/links.md) | `/projects/:id/releases/.../assets/links` |
+| [Releases](releases/index.md) | `/projects/:id/releases` |
+| [Remote mirrors](remote_mirrors.md) | `/projects/:id/remote_mirrors` |
+| [Repositories](repositories.md) | `/projects/:id/repository` |
+| [Repository files](repository_files.md) | `/projects/:id/repository/files` |
+| [Repository submodules](repository_submodules.md) | `/projects/:id/repository/submodules` |
+| [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) |
+| [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` |
+| [Vulnerabilities](vulnerabilities.md) **(ULTIMATE)** | `/vulnerabilities/:id` |
+| [Vulnerability exports](vulnerability_exports.md) **(ULTIMATE)** | `/projects/:id/vulnerability_exports` |
+| [Vulnerability findings](vulnerability_findings.md) **(ULTIMATE)** | `/projects/:id/vulnerability_findings` |
## Group resources
@@ -103,10 +104,10 @@ The following API resources are available in the group context:
| [Custom attributes](custom_attributes.md) | `/groups/:id/custom_attributes` (also available for projects and users) |
| [Debian distributions](packages/debian_group_distributions.md) | `/groups/:id/-/packages/debian` (also available for projects) |
| [Deploy tokens](deploy_tokens.md) | `/groups/:id/deploy_tokens` (also available for projects and standalone) |
-| [Discussions](discussions.md) (threaded comments) **(ULTIMATE)** | `/groups/:id/epics/.../discussions` (also available for projects) |
-| [Epic issues](epic_issues.md) **(ULTIMATE)** | `/groups/:id/epics/.../issues` |
-| [Epic links](epic_links.md) **(ULTIMATE)** | `/groups/:id/epics/.../epics` |
-| [Epics](epics.md) **(ULTIMATE)** | `/groups/:id/epics` |
+| [Discussions](discussions.md) (comments and threads) | `/groups/:id/epics/.../discussions` (also available for projects) |
+| [Epic issues](epic_issues.md) **(PREMIUM)** | `/groups/:id/epics/.../issues` |
+| [Epic links](epic_links.md) **(PREMIUM)** | `/groups/:id/epics/.../epics` |
+| [Epics](epics.md) **(PREMIUM)** | `/groups/:id/epics` |
| [Groups](groups.md) | `/groups`, `/groups/.../subgroups` |
| [Group badges](group_badges.md) | `/groups/:id/badges` |
| [Group issue boards](group_boards.md) | `/groups/:id/boards` |
@@ -114,6 +115,7 @@ The following API resources are available in the group context:
| [Group labels](group_labels.md) | `/groups/:id/labels` |
| [Group-level variables](group_level_variables.md) | `/groups/:id/variables` |
| [Group milestones](group_milestones.md) | `/groups/:id/milestones` |
+| [Group releases](group_releases.md) | `/groups/:id/releases`|
| [Group wikis](group_wikis.md) **(PREMIUM)** | `/groups/:id/wikis` |
| [Invitations](invitations.md) | `/groups/:id/invitations` (also available for projects) |
| [Issues](issues.md) | `/groups/:id/issues` (also available for projects and standalone) |
diff --git a/doc/api/bulk_imports.md b/doc/api/bulk_imports.md
index 2b71c83b224..cae23b35fbe 100644
--- a/doc/api/bulk_imports.md
+++ b/doc/api/bulk_imports.md
@@ -58,11 +58,12 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
GET /bulk_imports
```
-| Attribute | Type | Required | Description |
-|:-----------|:--------|:---------|:---------------------------------------|
-| `per_page` | integer | no | Number of records to return per page. |
-| `page` | integer | no | Page to retrieve. |
-| `status` | string | no | Import status. |
+| Attribute | Type | Required | Description |
+|:-----------|:--------|:---------|:--------------------------------------------------------------------------------------------|
+| `per_page` | integer | no | Number of records to return per page. |
+| `page` | integer | no | Page to retrieve. |
+| `sort` | string | no | Return GitLab migration sorted in `asc` or `desc` order by creation date. Default is `desc` |
+| `status` | string | no | Import status. |
The status can be one of the following:
@@ -100,11 +101,12 @@ curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
GET /bulk_imports/entities
```
-| Attribute | Type | Required | Description |
-|:-----------|:--------|:---------|:---------------------------------------|
-| `per_page` | integer | no | Number of records to return per page. |
-| `page` | integer | no | Page to retrieve. |
-| `status` | string | no | Import status. |
+| Attribute | Type | Required | Description |
+|:-----------|:--------|:---------|:-----------------------------------------------------------------------------------------------------|
+| `per_page` | integer | no | Number of records to return per page. |
+| `page` | integer | no | Page to retrieve. |
+| `sort` | string | no | Return GitLab migration entities sorted in `asc` or `desc` order by creation date. Default is `desc` |
+| `status` | string | no | Import status. |
The status can be one of the following:
@@ -184,11 +186,12 @@ curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
GET /bulk_imports/:id/entities
```
-| Attribute | Type | Required | Description |
-|:-----------|:--------|:---------|:---------------------------------------|
-| `per_page` | integer | no | Number of records to return per page. |
-| `page` | integer | no | Page to retrieve. |
-| `status` | string | no | Import status. |
+| Attribute | Type | Required | Description |
+|:-----------|:--------|:---------|:--------------------------------------------------------------------------------------------|
+| `per_page` | integer | no | Number of records to return per page. |
+| `page` | integer | no | Page to retrieve. |
+| `sort` | string | no | Return GitLab migration sorted in `asc` or `desc` order by creation date. Default is `desc` |
+| `status` | string | no | Import status. |
The status can be one of the following:
diff --git a/doc/api/cluster_agents.md b/doc/api/cluster_agents.md
new file mode 100644
index 00000000000..37cc4a24342
--- /dev/null
+++ b/doc/api/cluster_agents.md
@@ -0,0 +1,238 @@
+---
+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
+---
+
+# Agents API **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83270) in GitLab 14.10.
+
+Use the Agents API to work with the GitLab agent for Kubernetes.
+
+## List the agents for a project
+
+Returns the list of agents registered for the project.
+
+You must have at least the Developer role to use this endpoint.
+
+```plaintext
+GET /projects/:id/cluster_agents
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+|-----------|-------------------|-----------|-----------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) maintained by the authenticated user |
+
+Response:
+
+The response is a list of agents with the following fields:
+
+| Attribute | Type | Description |
+|--------------------------------------|----------|------------------------------------------------------|
+| `id` | integer | ID of the agent |
+| `name` | string | Name of the agent |
+| `config_project` | object | Object representing the project the agent belongs to |
+| `config_project.id` | integer | ID of the project |
+| `config_project.description` | string | Description of the project |
+| `config_project.name` | string | Name of the project |
+| `config_project.name_with_namespace` | string | Full name with namespace of the project |
+| `config_project.path` | string | Path to the project |
+| `config_project.path_with_namespace` | string | Full path with namespace to the project |
+| `config_project.created_at` | string | ISO8601 datetime when the project was created |
+| `created_at` | string | ISO8601 datetime when the agent was created |
+| `created_by_user_id` | integer | ID of the user who created the agent |
+
+Example request:
+
+```shell
+curl --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/20/cluster_agents"
+```
+
+Example response:
+
+```json
+[
+ {
+ "id": 1,
+ "name": "agent-1",
+ "config_project": {
+ "id": 20,
+ "description": "",
+ "name": "test",
+ "name_with_namespace": "Administrator / test",
+ "path": "test",
+ "path_with_namespace": "root/test",
+ "created_at": "2022-03-20T20:42:40.221Z"
+ },
+ "created_at": "2022-04-20T20:42:40.221Z",
+ "created_by_user_id": 42
+ },
+ {
+ "id": 2,
+ "name": "agent-2",
+ "config_project": {
+ "id": 20,
+ "description": "",
+ "name": "test",
+ "name_with_namespace": "Administrator / test",
+ "path": "test",
+ "path_with_namespace": "root/test",
+ "created_at": "2022-03-20T20:42:40.221Z"
+ },
+ "created_at": "2022-04-20T20:42:40.221Z",
+ "created_by_user_id": 42
+ }
+]
+```
+
+## Get details about an agent
+
+Gets a single agent details.
+
+You must have at least the Developer role to use this endpoint.
+
+```shell
+GET /projects/:id/cluster_agents/:agent_id
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+|------------|-------------------|----------|-----------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) maintained by the authenticated user |
+| `agent_id` | integer | yes | ID of the agent |
+
+Response:
+
+The response is a single agent with the following fields:
+
+| Attribute | Type | Description |
+|--------------------------------------|---------|------------------------------------------------------|
+| `id` | integer | ID of the agent |
+| `name` | string | Name of the agent |
+| `config_project` | object | Object representing the project the agent belongs to |
+| `config_project.id` | integer | ID of the project |
+| `config_project.description` | string | Description of the project |
+| `config_project.name` | string | Name of the project |
+| `config_project.name_with_namespace` | string | Full name with namespace of the project |
+| `config_project.path` | string | Path to the project |
+| `config_project.path_with_namespace` | string | Full path with namespace to the project |
+| `config_project.created_at` | string | ISO8601 datetime when the project was created |
+| `created_at` | string | ISO8601 datetime when the agent was created |
+| `created_by_user_id` | integer | ID of the user who created the agent |
+
+Example request:
+
+```shell
+curl --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/20/cluster_agents/1"
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "name": "agent-1",
+ "config_project": {
+ "id": 20,
+ "description": "",
+ "name": "test",
+ "name_with_namespace": "Administrator / test",
+ "path": "test",
+ "path_with_namespace": "root/test",
+ "created_at": "2022-03-20T20:42:40.221Z"
+ },
+ "created_at": "2022-04-20T20:42:40.221Z",
+ "created_by_user_id": 42
+}
+```
+
+## Register an agent with a project
+
+Registers an agent to the project.
+
+You must have at least the Maintainer role to use this endpoint.
+
+```shell
+POST /projects/:id/cluster_agents
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+|-----------|-------------------|----------|-----------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) maintained by the authenticated user |
+| `name` | string | yes | Name for the agent |
+
+Response:
+
+The response is the new agent with the following fields:
+
+| Attribute | Type | Description |
+|--------------------------------------|---------|------------------------------------------------------|
+| `id` | integer | ID of the agent |
+| `name` | string | Name of the agent |
+| `config_project` | object | Object representing the project the agent belongs to |
+| `config_project.id` | integer | ID of the project |
+| `config_project.description` | string | Description of the project |
+| `config_project.name` | string | Name of the project |
+| `config_project.name_with_namespace` | string | Full name with namespace of the project |
+| `config_project.path` | string | Path to the project |
+| `config_project.path_with_namespace` | string | Full path with namespace to the project |
+| `config_project.created_at` | string | ISO8601 datetime when the project was created |
+| `created_at` | string | ISO8601 datetime when the agent was created |
+| `created_by_user_id` | integer | ID of the user who created the agent |
+
+Example request:
+
+```shell
+curl --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/20/cluster_agents" \
+ -H "Content-Type:application/json" \
+ -X POST --data '{"name":"some-agent"}'
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "name": "agent-1",
+ "config_project": {
+ "id": 20,
+ "description": "",
+ "name": "test",
+ "name_with_namespace": "Administrator / test",
+ "path": "test",
+ "path_with_namespace": "root/test",
+ "created_at": "2022-03-20T20:42:40.221Z"
+ },
+ "created_at": "2022-04-20T20:42:40.221Z",
+ "created_by_user_id": 42
+}
+```
+
+## Delete a registered agent
+
+Deletes an existing agent registration.
+
+You must have at least the Maintainer role to use this endpoint.
+
+```plaintext
+DELETE /projects/:id/cluster_agents/:agent_id
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+|------------|-------------------|----------|-----------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) maintained by the authenticated user |
+| `agent_id` | integer | yes | ID of the agent |
+
+Example request:
+
+```shell
+curl --request DELETE --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/20/cluster_agents/1
+```
diff --git a/doc/api/commits.md b/doc/api/commits.md
index d7be9559527..7be5bc3d985 100644
--- a/doc/api/commits.md
+++ b/doc/api/commits.md
@@ -49,11 +49,11 @@ Example response:
"title": "Replace sanitize with escape once",
"author_name": "Example User",
"author_email": "user@example.com",
- "authored_date": "2012-09-20T11:50:22+03:00",
+ "authored_date": "2021-09-20T11:50:22.001+00:00",
"committer_name": "Administrator",
"committer_email": "admin@example.com",
- "committed_date": "2012-09-20T11:50:22+03:00",
- "created_at": "2012-09-20T11:50:22+03:00",
+ "committed_date": "2021-09-20T11:50:22.001+00:00",
+ "created_at": "2021-09-20T11:50:22.001+00:00",
"message": "Replace sanitize with escape once",
"parent_ids": [
"6104942438c14ec7bd21c6cd5bd995272b3faff6"
@@ -68,7 +68,7 @@ Example response:
"author_email": "user@example.com",
"committer_name": "ExampleName",
"committer_email": "user@example.com",
- "created_at": "2012-09-20T09:06:12+03:00",
+ "created_at": "2021-09-20T09:06:12.201+00:00",
"message": "Sanitize for network graph",
"parent_ids": [
"ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba"
@@ -234,10 +234,10 @@ Example response:
"author_email": "user@example.com",
"committer_name": "Dmitriy",
"committer_email": "user@example.com",
- "created_at": "2012-09-20T09:06:12+03:00",
+ "created_at": "2021-09-20T09:06:12.300+03:00",
"message": "Sanitize for network graph",
- "committed_date": "2012-09-20T09:06:12+03:00",
- "authored_date": "2012-09-20T09:06:12+03:00",
+ "committed_date": "2021-09-20T09:06:12.300+03:00",
+ "authored_date": "2021-09-20T09:06:12.420+03:00",
"parent_ids": [
"ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba"
],
diff --git a/doc/api/deployments.md b/doc/api/deployments.md
index 4a09f9a6605..fb255bfa226 100644
--- a/doc/api/deployments.md
+++ b/doc/api/deployments.md
@@ -265,7 +265,7 @@ Example response:
}
```
-Deployments created by users on GitLab Premium or higher include the `approvals` and `pending_approval_count` properties:
+When the [unified approval setting](../ci/environments/deployment_approvals.md#unified-approval-setting) is configured, deployments created by users on GitLab Premium or higher include the `approvals` and `pending_approval_count` properties:
```json
{
@@ -282,13 +282,56 @@ Deployments created by users on GitLab Premium or higher include the `approvals`
"web_url": "http://localhost:3000/project_6_bot"
},
"status": "approved",
- "created_at": "2022-02-24T20:22:30.097Z"
+ "created_at": "2022-02-24T20:22:30.097Z",
+ "comment": "Looks good to me"
}
],
...
}
```
+When the [multiple approval rules](../ci/environments/deployment_approvals.md#multiple-approval-rules) is configured, deployments created by users on GitLab Premium or higher include the `approval_summary` property:
+
+```json
+{
+ "approval_summary": {
+ "rules": [
+ {
+ "user_id": null,
+ "group_id": 134,
+ "access_level": null,
+ "access_level_description": "qa-group",
+ "required_approvals": 1,
+ "deployment_approvals": []
+ },
+ {
+ "user_id": null,
+ "group_id": 135,
+ "access_level": null,
+ "access_level_description": "security-group",
+ "required_approvals": 2,
+ "deployment_approvals": [
+ {
+ "user": {
+ "id": 100,
+ "username": "security-user-1",
+ "name": "security user-1",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/e130fcd3a1681f41a3de69d10841afa9?s=80&d=identicon",
+ "web_url": "http://localhost:3000/security-user-1"
+ },
+ "status": "approved",
+ "created_at": "2022-04-11T03:37:03.058Z",
+ "comment": null
+ }
+ ]
+ }
+ ]
+ }
+ ...
+}
+```
+
## Create a deployment
```plaintext
@@ -342,20 +385,7 @@ Deployments created by users on GitLab Premium or higher include the `approvals`
{
"status": "created",
"pending_approval_count": 0,
- "approvals": [
- {
- "user": {
- "id": 49,
- "username": "project_6_bot",
- "name": "****",
- "state": "active",
- "avatar_url": "https://www.gravatar.com/avatar/e83ac685f68ea07553ad3054c738c709?s=80&d=identicon",
- "web_url": "http://localhost:3000/project_6_bot"
- },
- "status": "approved",
- "created_at": "2022-02-24T20:22:30.097Z"
- }
- ],
+ "approvals": [],
...
}
```
@@ -420,7 +450,8 @@ Deployments created by users on GitLab Premium or higher include the `approvals`
"web_url": "http://localhost:3000/project_6_bot"
},
"status": "approved",
- "created_at": "2022-02-24T20:22:30.097Z"
+ "created_at": "2022-02-24T20:22:30.097Z",
+ "comment": "Looks good to me"
}
],
...
@@ -466,9 +497,10 @@ POST /projects/:id/deployments/:deployment_id/approval
| `deployment_id` | integer | yes | The ID of the deployment. |
| `status` | string | yes | The status of the approval (either `approved` or `rejected`). |
| `comment` | string | no | A comment to go with the approval |
+| `represented_as`| string | no | The name of the User/Group/Role to use for the approval, when the user belongs to [multiple approval rules](../ci/environments/deployment_approvals.md#multiple-approval-rules). |
```shell
-curl --data "status=approved&comment=Looks good to me" \
+curl --data "status=approved&comment=Looks good to me&represented_as=security" \
--header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/deployments/1/approval"
```
@@ -477,12 +509,12 @@ Example response:
```json
{
"user": {
- "name": "Administrator",
- "username": "root",
- "id": 1,
+ "id": 100,
+ "username": "security-user-1",
+ "name": "security user-1",
"state": "active",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
- "web_url": "http://localhost:3000/root"
+ "avatar_url": "https://www.gravatar.com/avatar/e130fcd3a1681f41a3de69d10841afa9?s=80&d=identicon",
+ "web_url": "http://localhost:3000/security-user-1"
},
"status": "approved",
"created_at": "2022-02-24T20:22:30.097Z",
diff --git a/doc/api/discussions.md b/doc/api/discussions.md
index 5f750df4a48..c30c00cef67 100644
--- a/doc/api/discussions.md
+++ b/doc/api/discussions.md
@@ -11,13 +11,14 @@ Discussions are a set of related notes on:
- Snippets
- Issues
-- Epics **(ULTIMATE)**
+- [Epics](../user/group/epics/index.md)
- Merge requests
- Commits
-This includes system notes, which are notes about changes to the object (for example,
-when a milestone changes, a corresponding system note is added). Label notes are
-not part of this API, but recorded as separate events in [resource label events](resource_label_events.md).
+This includes [comments and threads](../user/discussions/index.md) and system notes.
+System notes are notes about changes to the object (for example, when a milestone changes).
+Label notes are not part of this API, but recorded as separate events in
+[resource label events](resource_label_events.md).
## Discussions pagination
@@ -993,7 +994,11 @@ curl --request POST --header "PRIVATE-TOKEN: [ACCESS_TOKEN]"\
### Resolve a merge request thread
-Resolve/unresolve whole thread of a merge request.
+Resolve or unresolve a thread of discussion in a merge request.
+
+Prerequisite:
+
+- You must have at least the Developer role, or be the author of the change being reviewed.
```plaintext
PUT /projects/:id/merge_requests/:merge_request_iid/discussions/:discussion_id
diff --git a/doc/api/dora/metrics.md b/doc/api/dora/metrics.md
index afc29f03598..f5373d02156 100644
--- a/doc/api/dora/metrics.md
+++ b/doc/api/dora/metrics.md
@@ -24,7 +24,7 @@ GET /projects/:id/dora/metrics
| Attribute | Type | Required | Description |
|-------------- |-------- |----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding) can be accessed by the authenticated user. |
-| `metric` | string | yes | The [metric name](../../user/analytics/ci_cd_analytics.md#supported-metrics-in-gitlab). One of `deployment_frequency`, `lead_time_for_changes` or `time_to_restore_service`.|
+| `metric` | string | yes | The metric name: `deployment_frequency`, `lead_time_for_changes` or `time_to_restore_service`.|
| `start_date` | string | no | Date range to start from. ISO 8601 Date format, for example `2021-03-01`. Default is 3 months ago. |
| `end_date` | string | no | Date range to end at. ISO 8601 Date format, for example `2021-03-01`. Default is the current date. |
| `interval` | string | no | The bucketing interval. One of `all`, `monthly` or `daily`. Default is `daily`. |
@@ -61,14 +61,14 @@ Get group-level DORA metrics.
GET /groups/:id/dora/metrics
```
-| Attribute | Type | Required | Description |
-|-------------- |-------- |----------|----------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding) can be accessed by the authenticated user. |
-| `metric` | string | yes | The [metric name](../../user/analytics/ci_cd_analytics.md#supported-metrics-in-gitlab). One of `deployment_frequency`, `lead_time_for_changes` or `time_to_restore_service`. |
-| `start_date` | string | no | Date range to start from. ISO 8601 Date format, for example `2021-03-01`. Default is 3 months ago. |
-| `end_date` | string | no | Date range to end at. ISO 8601 Date format, for example `2021-03-01`. Default is the current date. |
-| `interval` | string | no | The bucketing interval. One of `all`, `monthly` or `daily`. Default is `daily`. |
-| `environment_tier` | string | no | The [tier of the environment](../../ci/environments/index.md#deployment-tier-of-environments). Default is `production`. |
+| Attribute | Type | Required | Description |
+|-------------- |-------- |----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding) can be accessed by the authenticated user. |
+| `metric` | string | yes | One of `deployment_frequency`, `lead_time_for_changes`, `time_to_restore_service` or `change_failure_rate`. |
+| `start_date` | string | no | Date range to start from. ISO 8601 Date format, for example `2021-03-01`. Default is 3 months ago. |
+| `end_date` | string | no | Date range to end at. ISO 8601 Date format, for example `2021-03-01`. Default is the current date. |
+| `interval` | string | no | The bucketing interval. One of `all`, `monthly` or `daily`. Default is `daily`. |
+| `environment_tier` | string | no | The [tier of the environment](../../ci/environments/index.md#deployment-tier-of-environments). Default is `production`. |
Example request:
@@ -101,4 +101,5 @@ parameter:
| ------------------------ |--------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `deployment_frequency` | The number of successful deployments during the time period. |
| `lead_time_for_changes` | The median number of seconds between the merge of the merge request (MR) and the deployment of the MR's commits for all MRs deployed during the time period. |
-| `time_to_restore_service` | The median number of seconds an incident was open during the time period. Available only for production environment |
+| `time_to_restore_service` | The median number of seconds an incident was open during the time period. Available only for production environment. |
+| `change_failure_rate` | The number of incidents divided by the number of deployments during the time period. Available only for production environment. |
diff --git a/doc/api/events.md b/doc/api/events.md
index 265fc0e5fd2..3f032c72870 100644
--- a/doc/api/events.md
+++ b/doc/api/events.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
### Actions
-See [User contribution events](../user/index.md#user-contribution-events) for available types for the `action` parameter.
+See [User contribution events](../user/profile/index.md#user-contribution-events) for available types for the `action` parameter.
These options are in lowercase.
### Target Types
diff --git a/doc/api/feature_flags_legacy.md b/doc/api/feature_flags_legacy.md
index 262e1c537a4..1cf05144a1b 100644
--- a/doc/api/feature_flags_legacy.md
+++ b/doc/api/feature_flags_legacy.md
@@ -1,13 +1,11 @@
---
-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
+redirect_to: 'feature_flags.md'
+remove_date: '2022-06-22'
---
-# Legacy Feature Flags API **(FREE)**
+This document was moved to [another location](feature_flags).
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9566) in GitLab Premium 12.5.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212318) to GitLab Free in 13.5.
-
-This API was removed in [GitLab 14.0](https://gitlab.com/gitlab-org/gitlab/-/issues/213369).
-Please use [the new API](feature_flags.md) instead.
+<!-- This redirect file can be deleted after <2022-06-22>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html --> \ No newline at end of file
diff --git a/doc/api/features.md b/doc/api/features.md
index 593e4adedd7..0ad76829651 100644
--- a/doc/api/features.md
+++ b/doc/api/features.md
@@ -89,22 +89,24 @@ Example response:
```json
[
{
- "name": "api_kaminari_count_with_limit",
- "introduced_by_url": "https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23931",
- "rollout_issue_url": null,
- "milestone": "11.8",
- "type": "ops",
- "group": "group::ecosystem",
+ "name": "geo_pages_deployment_replication",
+ "introduced_by_url": "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68662",
+ "rollout_issue_url": "https://gitlab.com/gitlab-org/gitlab/-/issues/337676",
+ "milestone": "14.3",
+ "log_state_changes": null,
+ "type": "development",
+ "group": "group::geo",
"default_enabled": true
},
{
- "name": "marginalia",
- "introduced_by_url": null,
- "rollout_issue_url": null,
- "milestone": null,
- "type": "ops",
- "group": null,
- "default_enabled": false
+ "name": "analytics_devops_adoption_codeowners",
+ "introduced_by_url": "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59874",
+ "rollout_issue_url": "https://gitlab.com/gitlab-org/gitlab/-/issues/328542",
+ "milestone": "13.12",
+ "log_state_changes": null,
+ "type": "development",
+ "group": "group::optimize",
+ "default_enabled": true
}
]
```
diff --git a/doc/api/geo_nodes.md b/doc/api/geo_nodes.md
index d2cca1a5856..93478bcf95f 100644
--- a/doc/api/geo_nodes.md
+++ b/doc/api/geo_nodes.md
@@ -75,7 +75,7 @@ Example response:
WARNING:
The `web_geo_projects_url` attribute is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80106)
-for use in GitLab 14.9.
+in GitLab 14.9.
## Retrieve configuration about all Geo nodes
@@ -147,7 +147,7 @@ Example response:
WARNING:
The `web_geo_projects_url` attribute is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80106)
-for use in GitLab 14.9.
+in GitLab 14.9.
## Retrieve configuration about a specific Geo node
@@ -249,7 +249,7 @@ Example response:
WARNING:
The `web_geo_projects_url` attribute is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80106)
-for use in GitLab 14.9.
+in GitLab 14.9.
## Delete a Geo node
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index f86ad985b5e..7ef9897a170 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -628,6 +628,8 @@ Input type: `AdminSidekiqQueuesDeleteJobsInput`
| <a id="mutationadminsidekiqqueuesdeletejobsclientid"></a>`clientId` | [`String`](#string) | Delete jobs matching client_id in the context metadata. |
| <a id="mutationadminsidekiqqueuesdeletejobsclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationadminsidekiqqueuesdeletejobsfeaturecategory"></a>`featureCategory` | [`String`](#string) | Delete jobs matching feature_category in the context metadata. |
+| <a id="mutationadminsidekiqqueuesdeletejobsjobid"></a>`jobId` | [`String`](#string) | Delete jobs matching job_id in the context metadata. |
+| <a id="mutationadminsidekiqqueuesdeletejobspipelineid"></a>`pipelineId` | [`String`](#string) | Delete jobs matching pipeline_id in the context metadata. |
| <a id="mutationadminsidekiqqueuesdeletejobsproject"></a>`project` | [`String`](#string) | Delete jobs matching project in the context metadata. |
| <a id="mutationadminsidekiqqueuesdeletejobsqueuename"></a>`queueName` | [`String!`](#string) | Name of the queue to delete jobs from. |
| <a id="mutationadminsidekiqqueuesdeletejobsrelatedclass"></a>`relatedClass` | [`String`](#string) | Delete jobs matching related_class in the context metadata. |
@@ -1456,7 +1458,7 @@ Input type: `CreateIssueInput`
WARNING:
**Deprecated** in 14.0.
-Use iterationCreate.
+Manual iteration management is deprecated. Only automatic iteration cadences will be supported in the future.
Input type: `CreateIterationInput`
@@ -1468,7 +1470,7 @@ Input type: `CreateIterationInput`
| <a id="mutationcreateiterationdescription"></a>`description` | [`String`](#string) | Description of the iteration. |
| <a id="mutationcreateiterationduedate"></a>`dueDate` | [`String`](#string) | End date of the iteration. |
| <a id="mutationcreateiterationgrouppath"></a>`groupPath` | [`ID`](#id) | Full path of the group with which the resource is associated. |
-| <a id="mutationcreateiterationiterationscadenceid"></a>`iterationsCadenceId` | [`IterationsCadenceID`](#iterationscadenceid) | Global ID of the iterations cadence to be assigned to newly created iteration. |
+| <a id="mutationcreateiterationiterationscadenceid"></a>`iterationsCadenceId` **{warning-solid}** | [`IterationsCadenceID`](#iterationscadenceid) | **Deprecated:** `iterationCadenceId` is deprecated and will be removed in the future. This argument is ignored, because you can't create an iteration in a specific cadence. In the future only automatic iteration cadences will be allowed. Deprecated in 14.10. |
| <a id="mutationcreateiterationprojectpath"></a>`projectPath` | [`ID`](#id) | Full path of the project with which the resource is associated. |
| <a id="mutationcreateiterationstartdate"></a>`startDate` | [`String`](#string) | Start date of the iteration. |
| <a id="mutationcreateiterationtitle"></a>`title` | [`String`](#string) | Title of the iteration. |
@@ -1806,8 +1808,9 @@ Input type: `DastScannerProfileCreateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationdastscannerprofilecreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationdastscannerprofilecreatedastscannerprofile"></a>`dastScannerProfile` | [`DastScannerProfile`](#dastscannerprofile) | Created scanner profile. |
| <a id="mutationdastscannerprofilecreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-| <a id="mutationdastscannerprofilecreateid"></a>`id` | [`DastScannerProfileID`](#dastscannerprofileid) | ID of the scanner profile. |
+| <a id="mutationdastscannerprofilecreateid"></a>`id` **{warning-solid}** | [`DastScannerProfileID`](#dastscannerprofileid) | **Deprecated:** use `dastScannerProfile` field. Deprecated in 14.10. |
### `Mutation.dastScannerProfileDelete`
@@ -1851,8 +1854,9 @@ Input type: `DastScannerProfileUpdateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationdastscannerprofileupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationdastscannerprofileupdatedastscannerprofile"></a>`dastScannerProfile` | [`DastScannerProfile`](#dastscannerprofile) | Updated scanner profile. |
| <a id="mutationdastscannerprofileupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-| <a id="mutationdastscannerprofileupdateid"></a>`id` | [`DastScannerProfileID`](#dastscannerprofileid) | ID of the scanner profile. |
+| <a id="mutationdastscannerprofileupdateid"></a>`id` **{warning-solid}** | [`DastScannerProfileID`](#dastscannerprofileid) | **Deprecated:** use `dastScannerProfile` field. Deprecated in 14.10. |
### `Mutation.dastSiteProfileCreate`
@@ -1877,8 +1881,9 @@ Input type: `DastSiteProfileCreateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationdastsiteprofilecreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationdastsiteprofilecreatedastsiteprofile"></a>`dastSiteProfile` | [`DastSiteProfile`](#dastsiteprofile) | Site Profile object. |
| <a id="mutationdastsiteprofilecreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-| <a id="mutationdastsiteprofilecreateid"></a>`id` | [`DastSiteProfileID`](#dastsiteprofileid) | ID of the site profile. |
+| <a id="mutationdastsiteprofilecreateid"></a>`id` **{warning-solid}** | [`DastSiteProfileID`](#dastsiteprofileid) | **Deprecated:** use `dastSiteProfile.id` field. Deprecated in 14.10. |
### `Mutation.dastSiteProfileDelete`
@@ -1923,8 +1928,9 @@ Input type: `DastSiteProfileUpdateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationdastsiteprofileupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationdastsiteprofileupdatedastsiteprofile"></a>`dastSiteProfile` | [`DastSiteProfile`](#dastsiteprofile) | Site profile object. |
| <a id="mutationdastsiteprofileupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-| <a id="mutationdastsiteprofileupdateid"></a>`id` | [`DastSiteProfileID`](#dastsiteprofileid) | ID of the site profile. |
+| <a id="mutationdastsiteprofileupdateid"></a>`id` **{warning-solid}** | [`DastSiteProfileID`](#dastsiteprofileid) | **Deprecated:** use `dastSiteProfile.id` field. Deprecated in 14.10. |
### `Mutation.dastSiteTokenCreate`
@@ -2372,6 +2378,8 @@ Input type: `EnableDevopsAdoptionNamespaceInput`
### `Mutation.environmentsCanaryIngressUpdate`
+**Deprecated** This endpoint is planned to be removed along with certificate-based clusters. [See this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) for more information.
+
Input type: `EnvironmentsCanaryIngressUpdateInput`
#### Arguments
@@ -3209,6 +3217,10 @@ Input type: `IterationCadenceUpdateInput`
### `Mutation.iterationCreate`
+WARNING:
+**Deprecated** in 14.10.
+Manual iteration management is deprecated. Only automatic iteration cadences will be supported in the future.
+
Input type: `iterationCreateInput`
#### Arguments
@@ -3219,7 +3231,7 @@ Input type: `iterationCreateInput`
| <a id="mutationiterationcreatedescription"></a>`description` | [`String`](#string) | Description of the iteration. |
| <a id="mutationiterationcreateduedate"></a>`dueDate` | [`String`](#string) | End date of the iteration. |
| <a id="mutationiterationcreategrouppath"></a>`groupPath` | [`ID`](#id) | Full path of the group with which the resource is associated. |
-| <a id="mutationiterationcreateiterationscadenceid"></a>`iterationsCadenceId` | [`IterationsCadenceID`](#iterationscadenceid) | Global ID of the iterations cadence to be assigned to newly created iteration. |
+| <a id="mutationiterationcreateiterationscadenceid"></a>`iterationsCadenceId` **{warning-solid}** | [`IterationsCadenceID`](#iterationscadenceid) | **Deprecated:** `iterationCadenceId` is deprecated and will be removed in the future. This argument is ignored, because you can't create an iteration in a specific cadence. In the future only automatic iteration cadences will be allowed. Deprecated in 14.10. |
| <a id="mutationiterationcreateprojectpath"></a>`projectPath` | [`ID`](#id) | Full path of the project with which the resource is associated. |
| <a id="mutationiterationcreatestartdate"></a>`startDate` | [`String`](#string) | Start date of the iteration. |
| <a id="mutationiterationcreatetitle"></a>`title` | [`String`](#string) | Title of the iteration. |
@@ -3234,6 +3246,10 @@ Input type: `iterationCreateInput`
### `Mutation.iterationDelete`
+WARNING:
+**Deprecated** in 14.10.
+Manual iteration management is deprecated. Only automatic iteration cadences will be supported in the future.
+
Input type: `IterationDeleteInput`
#### Arguments
@@ -4261,7 +4277,26 @@ Input type: `SavedReplyCreateInput`
| ---- | ---- | ----------- |
| <a id="mutationsavedreplycreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationsavedreplycreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-| <a id="mutationsavedreplycreatesavedreply"></a>`savedReply` | [`SavedReply`](#savedreply) | Updated saved reply. |
+| <a id="mutationsavedreplycreatesavedreply"></a>`savedReply` | [`SavedReply`](#savedreply) | Saved reply after mutation. |
+
+### `Mutation.savedReplyDestroy`
+
+Input type: `SavedReplyDestroyInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationsavedreplydestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationsavedreplydestroyid"></a>`id` | [`UsersSavedReplyID!`](#userssavedreplyid) | Global ID of the saved reply. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationsavedreplydestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationsavedreplydestroyerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationsavedreplydestroysavedreply"></a>`savedReply` | [`SavedReply`](#savedreply) | Saved reply after mutation. |
### `Mutation.savedReplyUpdate`
@@ -4282,11 +4317,11 @@ Input type: `SavedReplyUpdateInput`
| ---- | ---- | ----------- |
| <a id="mutationsavedreplyupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationsavedreplyupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-| <a id="mutationsavedreplyupdatesavedreply"></a>`savedReply` | [`SavedReply`](#savedreply) | Updated saved reply. |
+| <a id="mutationsavedreplyupdatesavedreply"></a>`savedReply` | [`SavedReply`](#savedreply) | Saved reply after mutation. |
### `Mutation.scanExecutionPolicyCommit`
-Commits the `policy_yaml` content to the assigned security policy project for the given project(`project_path`).
+Commits the `policy_yaml` content to the assigned security policy project for the given project (`full_path`).
Input type: `ScanExecutionPolicyCommitInput`
@@ -4295,10 +4330,11 @@ Input type: `ScanExecutionPolicyCommitInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationscanexecutionpolicycommitclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationscanexecutionpolicycommitfullpath"></a>`fullPath` | [`String`](#string) | Full path of the project. |
| <a id="mutationscanexecutionpolicycommitname"></a>`name` | [`String`](#string) | Name of the policy. If the name is null, the `name` field from `policy_yaml` is used. |
| <a id="mutationscanexecutionpolicycommitoperationmode"></a>`operationMode` | [`MutationOperationMode!`](#mutationoperationmode) | Changes the operation mode. |
| <a id="mutationscanexecutionpolicycommitpolicyyaml"></a>`policyYaml` | [`String!`](#string) | YAML snippet of the policy. |
-| <a id="mutationscanexecutionpolicycommitprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
+| <a id="mutationscanexecutionpolicycommitprojectpath"></a>`projectPath` **{warning-solid}** | [`ID`](#id) | **Deprecated:** Use `fullPath`. Deprecated in 14.10. |
#### Fields
@@ -4310,7 +4346,7 @@ 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`.
+Assigns the specified project(`security_policy_project_id`) as security policy project for the given project(`full_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`
@@ -4319,7 +4355,8 @@ Input type: `SecurityPolicyProjectAssignInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationsecuritypolicyprojectassignclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationsecuritypolicyprojectassignprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectassignfullpath"></a>`fullPath` | [`String`](#string) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectassignprojectpath"></a>`projectPath` **{warning-solid}** | [`ID`](#id) | **Deprecated:** Use `fullPath`. Deprecated in 14.10. |
| <a id="mutationsecuritypolicyprojectassignsecuritypolicyprojectid"></a>`securityPolicyProjectId` | [`ProjectID!`](#projectid) | ID of the security policy project. |
#### Fields
@@ -4331,7 +4368,7 @@ Input type: `SecurityPolicyProjectAssignInput`
### `Mutation.securityPolicyProjectCreate`
-Creates and assigns a security policy project for the given project(`project_path`).
+Creates and assigns a security policy project for the given project (`full_path`).
Input type: `SecurityPolicyProjectCreateInput`
@@ -4340,7 +4377,8 @@ Input type: `SecurityPolicyProjectCreateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationsecuritypolicyprojectcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationsecuritypolicyprojectcreateprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectcreatefullpath"></a>`fullPath` | [`String`](#string) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectcreateprojectpath"></a>`projectPath` **{warning-solid}** | [`ID`](#id) | **Deprecated:** Use `fullPath`. Deprecated in 14.10. |
#### Fields
@@ -4352,7 +4390,7 @@ Input type: `SecurityPolicyProjectCreateInput`
### `Mutation.securityPolicyProjectUnassign`
-Unassigns the security policy project for the given project(`project_path`).
+Unassigns the security policy project for the given project (`full_path`).
Input type: `SecurityPolicyProjectUnassignInput`
@@ -4361,7 +4399,8 @@ Input type: `SecurityPolicyProjectUnassignInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationsecuritypolicyprojectunassignclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationsecuritypolicyprojectunassignprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectunassignfullpath"></a>`fullPath` | [`String`](#string) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectunassignprojectpath"></a>`projectPath` **{warning-solid}** | [`ID`](#id) | **Deprecated:** Use `fullPath`. Deprecated in 14.10. |
#### Fields
@@ -4611,6 +4650,7 @@ Input type: `TodosMarkAllDoneInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationtodosmarkalldoneclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationtodosmarkalldonetargetid"></a>`targetId` | [`TodoableID`](#todoableid) | Global ID of the to-do item's parent. Issues, merge requests, designs, and epics are supported. If argument is omitted, all pending to-do items of the current user are marked as done. |
#### Fields
@@ -4922,11 +4962,11 @@ Input type: `UpdateIterationInput`
| ---- | ---- | ----------- |
| <a id="mutationupdateiterationclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationupdateiterationdescription"></a>`description` | [`String`](#string) | Description of the iteration. |
-| <a id="mutationupdateiterationduedate"></a>`dueDate` | [`String`](#string) | End date of the iteration. |
+| <a id="mutationupdateiterationduedate"></a>`dueDate` **{warning-solid}** | [`String`](#string) | **Deprecated:** Manual iteration updates are deprecated, only `description` updates will be allowed in the future. Deprecated in 14.10. |
| <a id="mutationupdateiterationgrouppath"></a>`groupPath` | [`ID!`](#id) | Group of the iteration. |
| <a id="mutationupdateiterationid"></a>`id` | [`ID!`](#id) | Global ID of the iteration. |
-| <a id="mutationupdateiterationstartdate"></a>`startDate` | [`String`](#string) | Start date of the iteration. |
-| <a id="mutationupdateiterationtitle"></a>`title` | [`String`](#string) | Title of the iteration. |
+| <a id="mutationupdateiterationstartdate"></a>`startDate` **{warning-solid}** | [`String`](#string) | **Deprecated:** Manual iteration updates are deprecated, only `description` updates will be allowed in the future. Deprecated in 14.10. |
+| <a id="mutationupdateiterationtitle"></a>`title` **{warning-solid}** | [`String`](#string) | **Deprecated:** Manual iteration updates are deprecated, only `description` updates will be allowed in the future. Deprecated in 14.10. |
#### Fields
@@ -4974,7 +5014,7 @@ Input type: `UpdateNoteInput`
| ---- | ---- | ----------- |
| <a id="mutationupdatenotebody"></a>`body` | [`String`](#string) | Content of the note. |
| <a id="mutationupdatenoteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationupdatenoteconfidential"></a>`confidential` | [`Boolean`](#boolean) | Confidentiality flag of a note. Default is false. |
+| <a id="mutationupdatenoteconfidential"></a>`confidential` **{warning-solid}** | [`Boolean`](#boolean) | **Deprecated:** No longer allowed to update confidentiality of notes. Deprecated in 14.10. |
| <a id="mutationupdatenoteid"></a>`id` | [`NoteID!`](#noteid) | Global ID of the note to update. |
#### Fields
@@ -9317,6 +9357,7 @@ Represents the total number of issues and their weights for a particular day.
| <a id="cijobduration"></a>`duration` | [`Int`](#int) | Duration of the job in seconds. |
| <a id="cijobfinishedat"></a>`finishedAt` | [`Time`](#time) | When a job has finished running. |
| <a id="cijobid"></a>`id` | [`JobID`](#jobid) | ID of the job. |
+| <a id="cijobkind"></a>`kind` | [`CiJobKind!`](#cijobkind) | Indicates the type of job. |
| <a id="cijobmanualjob"></a>`manualJob` | [`Boolean`](#boolean) | Whether the job has a manual action. |
| <a id="cijobname"></a>`name` | [`String`](#string) | Name of the job. |
| <a id="cijobneeds"></a>`needs` | [`CiBuildNeedConnection`](#cibuildneedconnection) | References to builds that must complete before the jobs run. (see [Connections](#connections)) |
@@ -9409,6 +9450,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="cirunnertaglist"></a>`tagList` | [`[String!]`](#string) | Tags associated with the runner. |
| <a id="cirunnertokenexpiresat"></a>`tokenExpiresAt` | [`Time`](#time) | Runner token expiration time. |
+| <a id="cirunnerupgradestatus"></a>`upgradeStatus` **{warning-solid}** | [`CiRunnerUpgradeStatusType`](#cirunnerupgradestatustype) | **Deprecated** in 14.10. This feature is in Alpha, and can be removed or changed at any point. |
| <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. |
@@ -9731,6 +9773,7 @@ A container repository.
| <a id="containerrepositoryexpirationpolicystartedat"></a>`expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
| <a id="containerrepositoryid"></a>`id` | [`ID!`](#id) | ID of the container repository. |
| <a id="containerrepositorylocation"></a>`location` | [`String!`](#string) | URL of the container repository. |
+| <a id="containerrepositorymigrationstate"></a>`migrationState` | [`String!`](#string) | Migration state of the container repository. |
| <a id="containerrepositoryname"></a>`name` | [`String!`](#string) | Name of the container repository. |
| <a id="containerrepositorypath"></a>`path` | [`String!`](#string) | Path of the container repository. |
| <a id="containerrepositoryproject"></a>`project` | [`Project!`](#project) | Project of the container registry. |
@@ -9752,6 +9795,7 @@ Details of a container repository.
| <a id="containerrepositorydetailsexpirationpolicystartedat"></a>`expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
| <a id="containerrepositorydetailsid"></a>`id` | [`ID!`](#id) | ID of the container repository. |
| <a id="containerrepositorydetailslocation"></a>`location` | [`String!`](#string) | URL of the container repository. |
+| <a id="containerrepositorydetailsmigrationstate"></a>`migrationState` | [`String!`](#string) | Migration state of the container repository. |
| <a id="containerrepositorydetailsname"></a>`name` | [`String!`](#string) | Name of the container repository. |
| <a id="containerrepositorydetailspath"></a>`path` | [`String!`](#string) | Path of the container repository. |
| <a id="containerrepositorydetailsproject"></a>`project` | [`Project!`](#project) | Project of the container registry. |
@@ -9981,6 +10025,7 @@ Input type for DastSiteProfile authentication.
| <a id="dastsiteprofileauthenabled"></a>`enabled` | [`Boolean`](#boolean) | Indicates whether authentication is enabled. |
| <a id="dastsiteprofileauthpassword"></a>`password` | [`String`](#string) | Redacted password to authenticate with on the target website. |
| <a id="dastsiteprofileauthpasswordfield"></a>`passwordField` | [`String`](#string) | Name of password field at the sign-in HTML form. |
+| <a id="dastsiteprofileauthsubmitfield"></a>`submitField` | [`String`](#string) | Name or ID of sign-in submit button at the sign-in HTML form. |
| <a id="dastsiteprofileauthurl"></a>`url` | [`String`](#string) | The URL of the page containing the sign-in HTML form on the target website. |
| <a id="dastsiteprofileauthusername"></a>`username` | [`String`](#string) | Username to authenticate with on the target website. |
| <a id="dastsiteprofileauthusernamefield"></a>`usernameField` | [`String`](#string) | Name of username field at the sign-in HTML form. |
@@ -10059,6 +10104,7 @@ Dependency proxy manifest.
| <a id="dependencyproxymanifestid"></a>`id` | [`DependencyProxyManifestID!`](#dependencyproxymanifestid) | ID of the manifest. |
| <a id="dependencyproxymanifestimagename"></a>`imageName` | [`String!`](#string) | Name of the image. |
| <a id="dependencyproxymanifestsize"></a>`size` | [`String!`](#string) | Size of the manifest file. |
+| <a id="dependencyproxymanifeststatus"></a>`status` | [`DependencyProxyManifestStatus!`](#dependencyproxymanifeststatus) | Status of the manifest (default, pending_destruction, processing, error). |
| <a id="dependencyproxymanifestupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
### `DependencyProxySetting`
@@ -10381,7 +10427,6 @@ Snapshot.
| <a id="devopsadoptionsnapshotrecordedat"></a>`recordedAt` | [`Time!`](#time) | Time the snapshot was recorded. |
| <a id="devopsadoptionsnapshotrunnerconfigured"></a>`runnerConfigured` | [`Boolean!`](#boolean) | At least one runner was used. |
| <a id="devopsadoptionsnapshotsastenabledcount"></a>`sastEnabledCount` | [`Int`](#int) | Total number of projects with enabled SAST. |
-| <a id="devopsadoptionsnapshotsecurityscansucceeded"></a>`securityScanSucceeded` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in 14.1. Substituted with specific security metrics. Always false. |
| <a id="devopsadoptionsnapshotstarttime"></a>`startTime` | [`Time!`](#time) | Start time for the snapshot where the data points were collected. |
| <a id="devopsadoptionsnapshottotalprojectscount"></a>`totalProjectsCount` | [`Int`](#int) | Total number of projects. |
| <a id="devopsadoptionsnapshotvulnerabilitymanagementusedcount"></a>`vulnerabilityManagementUsedCount` | [`Int`](#int) | Total number of projects with vulnerability management used at least once. |
@@ -11024,7 +11069,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
##### `GeoNode.jobArtifactRegistries`
-Find Job Artifact registries on this Geo node Available only when feature flag `geo_job_artifact_replication` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice.
+Find Job Artifact registries on this Geo node.
Returns [`JobArtifactRegistryConnection`](#jobartifactregistryconnection).
@@ -12590,7 +12635,7 @@ A user assigned to a merge request.
| <a id="mergerequestassigneeprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="mergerequestassigneeprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
| <a id="mergerequestassigneepublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
-| <a id="mergerequestassigneesavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
+| <a id="mergerequestassigneesavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="mergerequestassigneestate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="mergerequestassigneestatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="mergerequestassigneeuserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
@@ -12820,7 +12865,7 @@ The author of the merge request.
| <a id="mergerequestauthorprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="mergerequestauthorprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
| <a id="mergerequestauthorpublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
-| <a id="mergerequestauthorsavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
+| <a id="mergerequestauthorsavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="mergerequestauthorstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="mergerequestauthorstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="mergerequestauthoruserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
@@ -13067,7 +13112,7 @@ A user participating in a merge request.
| <a id="mergerequestparticipantprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="mergerequestparticipantprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
| <a id="mergerequestparticipantpublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
-| <a id="mergerequestparticipantsavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
+| <a id="mergerequestparticipantsavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="mergerequestparticipantstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="mergerequestparticipantstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="mergerequestparticipantuserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
@@ -13315,7 +13360,7 @@ A user assigned to a merge request as a reviewer.
| <a id="mergerequestreviewerprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="mergerequestreviewerprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
| <a id="mergerequestreviewerpublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
-| <a id="mergerequestreviewersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
+| <a id="mergerequestreviewersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="mergerequestreviewerstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="mergerequestreviewerstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="mergerequestrevieweruserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
@@ -16020,6 +16065,7 @@ Represents a URL related to a security training.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="securitytrainingurlidentifier"></a>`identifier` | [`String`](#string) | Name of the vulnerability identifier. |
| <a id="securitytrainingurlname"></a>`name` | [`String`](#string) | Name of the training provider. |
| <a id="securitytrainingurlstatus"></a>`status` | [`TrainingUrlRequestStatus`](#trainingurlrequeststatus) | Status of the request to training provider. |
| <a id="securitytrainingurlurl"></a>`url` | [`String`](#string) | URL of the link for security training content. |
@@ -16694,7 +16740,7 @@ Core represention of a GitLab user.
| <a id="usercoreprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="usercoreprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
| <a id="usercorepublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
-| <a id="usercoresavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
+| <a id="usercoresavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="usercorestate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="usercorestatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="usercoreuserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
@@ -17736,6 +17782,13 @@ Values for YAML processor result.
| <a id="ciconfigstatusinvalid"></a>`INVALID` | Configuration file is not valid. |
| <a id="ciconfigstatusvalid"></a>`VALID` | Configuration file is valid. |
+### `CiJobKind`
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="cijobkindbridge"></a>`BRIDGE` | Bridge CI job connecting a parent and child pipeline. |
+| <a id="cijobkindbuild"></a>`BUILD` | Standard CI job. |
+
### `CiJobStatus`
| Value | Description |
@@ -17792,6 +17845,14 @@ Values for sorting runners.
| <a id="cirunnertypeinstance_type"></a>`INSTANCE_TYPE` | A runner that is instance type. |
| <a id="cirunnertypeproject_type"></a>`PROJECT_TYPE` | A runner that is project type. |
+### `CiRunnerUpgradeStatusType`
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="cirunnerupgradestatustypeavailable"></a>`AVAILABLE` | An update is available for the runner. |
+| <a id="cirunnerupgradestatustypenot_available"></a>`NOT_AVAILABLE` | An update is not available for the runner. |
+| <a id="cirunnerupgradestatustyperecommended"></a>`RECOMMENDED` | An update is available and recommended for the runner. |
+
### `CodeQualityDegradationSeverity`
| Value | Description |
@@ -18038,6 +18099,15 @@ Weight of the data visualization palette.
| <a id="datavisualizationweightenumweight_900"></a>`WEIGHT_900` | 900 weight. |
| <a id="datavisualizationweightenumweight_950"></a>`WEIGHT_950` | 950 weight. |
+### `DependencyProxyManifestStatus`
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="dependencyproxymanifeststatusdefault"></a>`DEFAULT` | Dependency proxy manifest has a status of default. |
+| <a id="dependencyproxymanifeststatuserror"></a>`ERROR` | Dependency proxy manifest has a status of error. |
+| <a id="dependencyproxymanifeststatuspending_destruction"></a>`PENDING_DESTRUCTION` | Dependency proxy manifest has a status of pending_destruction. |
+| <a id="dependencyproxymanifeststatusprocessing"></a>`PROCESSING` | Dependency proxy manifest has a status of processing. |
+
### `DeploymentTier`
All environment deployment tiers.
@@ -18096,6 +18166,7 @@ All supported DORA metric types.
| Value | Description |
| ----- | ----------- |
+| <a id="dorametrictypechange_failure_rate"></a>`CHANGE_FAILURE_RATE` | Change failure rate. |
| <a id="dorametrictypedeployment_frequency"></a>`DEPLOYMENT_FREQUENCY` | Deployment frequency. |
| <a id="dorametrictypelead_time_for_changes"></a>`LEAD_TIME_FOR_CHANGES` | Lead time for changes. |
| <a id="dorametrictypetime_to_restore_service"></a>`TIME_TO_RESTORE_SERVICE` | Time to restore service. |
@@ -18279,6 +18350,8 @@ Values for sorting issues.
| <a id="issuesortcreated_desc"></a>`CREATED_DESC` | Created at descending order. |
| <a id="issuesortdue_date_asc"></a>`DUE_DATE_ASC` | Due date by ascending order. |
| <a id="issuesortdue_date_desc"></a>`DUE_DATE_DESC` | Due date by descending order. |
+| <a id="issuesortescalation_status_asc"></a>`ESCALATION_STATUS_ASC` | Status from triggered to resolved. Defaults to `CREATED_DESC` if `incident_escalations` feature flag is disabled. |
+| <a id="issuesortescalation_status_desc"></a>`ESCALATION_STATUS_DESC` | Status from resolved to triggered. Defaults to `CREATED_DESC` if `incident_escalations` feature flag is disabled. |
| <a id="issuesortlabel_priority_asc"></a>`LABEL_PRIORITY_ASC` | Label priority by ascending order. |
| <a id="issuesortlabel_priority_desc"></a>`LABEL_PRIORITY_DESC` | Label priority by descending order. |
| <a id="issuesortmilestone_due_asc"></a>`MILESTONE_DUE_ASC` | Milestone due date by ascending order. |
@@ -19044,6 +19117,7 @@ Name of the feature that the callout is for.
| <a id="usercalloutfeaturenameenumgeo_migrate_hashed_storage"></a>`GEO_MIGRATE_HASHED_STORAGE` | Callout feature name for geo_migrate_hashed_storage. |
| <a id="usercalloutfeaturenameenumgke_cluster_integration"></a>`GKE_CLUSTER_INTEGRATION` | Callout feature name for gke_cluster_integration. |
| <a id="usercalloutfeaturenameenumgold_trial_billings"></a>`GOLD_TRIAL_BILLINGS` | Callout feature name for gold_trial_billings. |
+| <a id="usercalloutfeaturenameenumminute_limit_banner"></a>`MINUTE_LIMIT_BANNER` | Callout feature name for minute_limit_banner. |
| <a id="usercalloutfeaturenameenumnew_user_signups_cap_reached"></a>`NEW_USER_SIGNUPS_CAP_REACHED` | Callout feature name for new_user_signups_cap_reached. |
| <a id="usercalloutfeaturenameenumpersonal_access_token_expiry"></a>`PERSONAL_ACCESS_TOKEN_EXPIRY` | Callout feature name for personal_access_token_expiry. |
| <a id="usercalloutfeaturenameenumpipeline_needs_banner"></a>`PIPELINE_NEEDS_BANNER` | Callout feature name for pipeline_needs_banner. |
@@ -20213,7 +20287,7 @@ Implementations:
| <a id="userprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="userprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
| <a id="userpublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
-| <a id="usersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
+| <a id="usersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="userstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="userstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="useruserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
@@ -20499,8 +20573,8 @@ Field that are available while modifying the custom mapping attributes for an HT
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="complianceviolationinputmergedafter"></a>`mergedAfter` | [`Date`](#date) | Merged date of merge requests merged after a compliance violation was created. |
-| <a id="complianceviolationinputmergedbefore"></a>`mergedBefore` | [`Date`](#date) | Merged date of merge requests merged before a compliance violation was created. |
+| <a id="complianceviolationinputmergedafter"></a>`mergedAfter` | [`Date`](#date) | Merge requests merged after this date (inclusive). |
+| <a id="complianceviolationinputmergedbefore"></a>`mergedBefore` | [`Date`](#date) | Merge requests merged before this date (inclusive). |
| <a id="complianceviolationinputprojectids"></a>`projectIds` | [`[ProjectID!]`](#projectid) | Filter compliance violations by project. |
### `DastProfileCadenceInput`
@@ -20538,6 +20612,7 @@ Input type for DastSiteProfile authentication.
| <a id="dastsiteprofileauthinputenabled"></a>`enabled` | [`Boolean`](#boolean) | Indicates whether authentication is enabled. |
| <a id="dastsiteprofileauthinputpassword"></a>`password` | [`String`](#string) | Password to authenticate with on the target website. |
| <a id="dastsiteprofileauthinputpasswordfield"></a>`passwordField` | [`String`](#string) | Name of password field at the sign-in HTML form. |
+| <a id="dastsiteprofileauthinputsubmitfield"></a>`submitField` | [`String`](#string) | Name or ID of sign-in submit button at the sign-in HTML form. |
| <a id="dastsiteprofileauthinputurl"></a>`url` | [`String`](#string) | The URL of the page containing the sign-in HTML form on the target website. |
| <a id="dastsiteprofileauthinputusername"></a>`username` | [`String`](#string) | Username to authenticate with on the target website. |
| <a id="dastsiteprofileauthinputusernamefield"></a>`usernameField` | [`String`](#string) | Name of username field at the sign-in HTML form. |
diff --git a/doc/api/group_access_tokens.md b/doc/api/group_access_tokens.md
index 45366885c5c..0d1878ebf39 100644
--- a/doc/api/group_access_tokens.md
+++ b/doc/api/group_access_tokens.md
@@ -20,7 +20,7 @@ GET groups/:id/access_tokens
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/<group_id>/access_tokens"
@@ -44,6 +44,41 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
]
```
+## Get a group access token
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82714) in GitLab 14.10.
+
+Get a [group access token](../user/group/settings/group_access_tokens.md) by ID.
+
+```plaintext
+GET groups/:id/access_tokens/:token_id
+```
+
+| Attribute | Type | required | Description |
+|-----------|---------|----------|---------------------|
+| `id` | integer or string | yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
+| `token_id` | integer or string | yes | ID of the group access token |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/<group_id>/access_tokens/<token_id>"
+```
+
+```json
+{
+ "user_id" : 141,
+ "scopes" : [
+ "api"
+ ],
+ "name" : "token",
+ "expires_at" : "2021-01-31",
+ "id" : 42,
+ "active" : true,
+ "created_at" : "2021-01-20T22:11:48.151Z",
+ "revoked" : false,
+ "access_level": 40
+}
+```
+
## Create a group access token
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77236) in GitLab 14.7.
@@ -56,11 +91,11 @@ POST groups/:id/access_tokens
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
-| `name` | String | yes | The name of the group access token |
+| `id` | integer or string | yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
+| `name` | String | yes | Name of the group access token |
| `scopes` | `Array[String]` | yes | [List of scopes](../user/group/settings/group_access_tokens.md#scopes-for-a-group-access-token) |
| `access_level` | Integer | no | A valid access level. Default value is 40 (Maintainer). Other allowed values are 10 (Guest), 20 (Reporter), and 30 (Developer). |
-| `expires_at` | Date | no | The token expires at midnight UTC on that date |
+| `expires_at` | Date | no | Token expires at midnight UTC on that date |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -99,8 +134,8 @@ DELETE groups/:id/access_tokens/:token_id
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
-| `token_id` | integer or string | yes | The ID of the group access token |
+| `id` | integer or string | yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
+| `token_id` | integer or string | yes | ID of the group access token |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/<group_id>/access_tokens/<token_id>"
diff --git a/doc/api/group_badges.md b/doc/api/group_badges.md
index 360790daf8c..b1166ba5b54 100644
--- a/doc/api/group_badges.md
+++ b/doc/api/group_badges.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Authentication and Authorization
+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/api/group_protected_environments.md b/doc/api/group_protected_environments.md
index 6ce4e1791b0..f8f9b853354 100644
--- a/doc/api/group_protected_environments.md
+++ b/doc/api/group_protected_environments.md
@@ -107,6 +107,7 @@ POST /groups/:id/protected_environments
| `name` | string | yes | The deployment tier of the protected environment. One of `production`, `staging`, `testing`, `development`, or `other`. Read more about [deployment tiers](../ci/environments/index.md#deployment-tier-of-environments).|
| `deploy_access_levels` | array | yes | Array of access levels allowed to deploy, with each described by a hash. One of `user_id`, `group_id` or `access_level`. They take the form of `{user_id: integer}`, `{group_id: integer}` or `{access_level: integer}` respectively. |
| `required_approval_count` | integer | no | The number of approvals required to deploy to this environment. This is part of Deployment Approvals, which isn't yet available for use. For details, see [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/343864). |
+| `approval_rules` | array | no | Array of access levels allowed to approve, with each described by a hash. One of `user_id`, `group_id` or `access_level`. They take the form of `{user_id: integer}`, `{group_id: integer}` or `{access_level: integer}` respectively. You can also specify the number of required approvals from the specified entity with `required_approvals` field. See [Multiple approval rules](../ci/environments/deployment_approvals.md#multiple-approval-rules) for more information. |
The assignable `user_id` are the users who belong to the given group with the Maintainer role (or above).
The assignable `group_id` are the sub-groups under the given group.
diff --git a/doc/api/group_releases.md b/doc/api/group_releases.md
new file mode 100644
index 00000000000..06ce55b7d48
--- /dev/null
+++ b/doc/api/group_releases.md
@@ -0,0 +1,77 @@
+---
+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
+---
+
+# Group releases API **(FREE)**
+
+Review your groups' [releases](../user/project/releases/index.md) with the REST API.
+
+NOTE:
+For information about the project releases API, visit the [Releases API](releases/index.md) page.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `group_releases_finder_inoperator`.
+
+## List group releases
+
+Returns a list of group releases.
+
+```plaintext
+GET /groups/:id/releases
+GET /groups/:id/releases?simple=true
+```
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+|---------------------|----------------|----------|---------------------------------------------------------------------------------------------------------------|
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `sort` | string | no | The direction of the order. Either `desc` (default) for descending order or `asc` for ascending order. |
+| `simple` | boolean | no | Return only limited fields for each release. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/releases"
+```
+
+Example response:
+
+```json
+[
+ {
+ "name": "standard release",
+ "tag_name": "releasetag",
+ "description": "",
+ "created_at": "2022-01-10T15:23:15.529Z",
+ "released_at": "2022-01-10T15:23:15.529Z",
+ "author": {
+ "id": 1,
+ "username": "root",
+ "name": "Administrator",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+ "web_url": "https://gitlab.com/root"
+ },
+ "commit": {
+ "id": "e8cbb845ae5a53a2fef2938cf63cf82efc10d993",
+ "short_id": "e8cbb845",
+ "created_at": "2022-01-10T15:20:29.000+00:00",
+ "parent_ids": [],
+ "title": "Update test",
+ "message": "Update test",
+ "author_name": "Administrator",
+ "author_email": "admin@example.com",
+ "authored_date": "2022-01-10T15:20:29.000+00:00",
+ "committer_name": "Administrator",
+ "committer_email": "admin@example.com",
+ "committed_date": "2022-01-10T15:20:29.000+00:00",
+ "trailers": {},
+ "web_url": "https://gitlab.com/groups/gitlab-org/-/commit/e8cbb845ae5a53a2fef2938cf63cf82efc10d993"
+ },
+ "upcoming_release": false,
+ "commit_path": "/testgroup/test/-/commit/e8cbb845ae5a53a2fef2938cf63cf82efc10d993",
+ "tag_path": "/testgroup/test/-/tags/testtag"
+ }
+]
+```
diff --git a/doc/api/groups.md b/doc/api/groups.md
index 120090c18a2..e04e5207c95 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Authentication and Authorization
+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
---
@@ -483,6 +483,8 @@ Example response:
## Details of a group
+> The `membership_lock` field was [added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82271) in GitLab 14.10.
+
Get all details of a group. This endpoint can be accessed without authentication
if the group is publicly accessible. In case the user that requests is an administrator
if the group is publicly accessible. With authentication, it returns the `runners_token`
@@ -715,6 +717,18 @@ the `marked_for_deletion_on` attribute:
}
```
+Users of [GitLab Premium or higher](https://about.gitlab.com/pricing/) also see
+the `membership_lock` attribute:
+
+```json
+{
+ "id": 4,
+ "description": "Aliquid qui quis dignissimos distinctio ut commodi voluptas est.",
+ "membership_lock": false,
+ ...
+}
+```
+
When adding the parameter `with_projects=false`, projects aren't returned.
```shell
@@ -795,24 +809,24 @@ Parameters:
| ------------------------------------------------------- | ------- | -------- | ----------- |
| `name` | string | yes | The name of the group. |
| `path` | string | yes | The path of the group. |
-| `description` | string | no | The group's description. |
-| `membership_lock` **(PREMIUM)** | boolean | no | Prevent adding new members to projects within this group. |
-| `visibility` | string | no | The group's visibility. Can be `private`, `internal`, or `public`. |
-| `share_with_group_lock` | boolean | no | Prevent sharing a project with another group within this group. |
-| `require_two_factor_authentication` | boolean | no | Require all users in this group to setup Two-factor authentication. |
-| `two_factor_grace_period` | integer | no | Time before Two-factor authentication is enforced (in hours). |
-| `project_creation_level` | string | no | Determine if developers can create projects in the group. Can be `noone` (No one), `maintainer` (users with the Maintainer role), or `developer` (users with the Developer or Maintainer role). |
| `auto_devops_enabled` | boolean | no | Default to Auto DevOps pipeline for all projects within this group. |
-| `subgroup_creation_level` | string | no | Allowed to [create subgroups](../user/group/subgroups/index.md#create-a-subgroup). Can be `owner` (Owners), or `maintainer` (users with the Maintainer role). |
-| `emails_disabled` | boolean | no | Disable email notifications |
| `avatar` | mixed | no | Image file for avatar of the group. [Introduced in GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36681) |
-| `mentions_disabled` | boolean | no | Disable the capability of a group from getting mentioned |
+| `default_branch_protection` | integer | no | See [Options for `default_branch_protection`](#options-for-default_branch_protection). Default to the global level default branch protection setting. |
+| `description` | string | no | The group's description. |
+| `emails_disabled` | boolean | no | Disable email notifications. |
| `lfs_enabled` | boolean | no | Enable/disable Large File Storage (LFS) for the projects in this group. |
-| `request_access_enabled` | boolean | no | Allow users to request member access. |
+| `mentions_disabled` | boolean | no | Disable the capability of a group from getting mentioned. |
| `parent_id` | integer | no | The parent group ID for creating nested group. |
-| `default_branch_protection` | integer | no | See [Options for `default_branch_protection`](#options-for-default_branch_protection). Default to the global level default branch protection setting. |
-| `shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
+| `project_creation_level` | string | no | Determine if developers can create projects in the group. Can be `noone` (No one), `maintainer` (users with the Maintainer role), or `developer` (users with the Developer or Maintainer role). |
+| `request_access_enabled` | boolean | no | Allow users to request member access. |
+| `require_two_factor_authentication` | boolean | no | Require all users in this group to setup Two-factor authentication. |
+| `share_with_group_lock` | boolean | no | Prevent sharing a project with another group within this group. |
+| `subgroup_creation_level` | string | no | Allowed to [create subgroups](../user/group/subgroups/index.md#create-a-subgroup). Can be `owner` (Owners), or `maintainer` (users with the Maintainer role). |
+| `two_factor_grace_period` | integer | no | Time before Two-factor authentication is enforced (in hours). |
+| `visibility` | string | no | The group's visibility. Can be `private`, `internal`, or `public`. |
+| `membership_lock` **(PREMIUM)** | boolean | no | Prevent adding new members to projects within this group. |
| `extra_shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Additional CI/CD minutes for this group. |
+| `shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
### Options for `default_branch_protection`
@@ -898,27 +912,27 @@ PUT /groups/:id
| `id` | integer | yes | The ID of the group. |
| `name` | string | no | The name of the group. |
| `path` | string | no | The path of the group. |
-| `description` | string | no | The description of the group. |
-| `membership_lock` **(PREMIUM)** | boolean | no | Prevent adding new members to projects within this group. |
-| `share_with_group_lock` | boolean | no | Prevent sharing a project with another group within this group. |
-| `visibility` | string | no | The visibility level of the group. Can be `private`, `internal`, or `public`. |
-| `require_two_factor_authentication` | boolean | no | Require all users in this group to setup Two-factor authentication. |
-| `two_factor_grace_period` | integer | no | Time before Two-factor authentication is enforced (in hours). |
-| `project_creation_level` | string | no | Determine if developers can create projects in the group. Can be `noone` (No one), `maintainer` (users with the Maintainer role), or `developer` (users with the Developer or Maintainer role). |
| `auto_devops_enabled` | boolean | no | Default to Auto DevOps pipeline for all projects within this group. |
-| `subgroup_creation_level` | string | no | Allowed to [create subgroups](../user/group/subgroups/index.md#create-a-subgroup). Can be `owner` (Owners), or `maintainer` (users with the Maintainer role). |
-| `emails_disabled` | boolean | no | Disable email notifications |
| `avatar` | mixed | no | Image file for avatar of the group. [Introduced in GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36681) |
-| `mentions_disabled` | boolean | no | Disable the capability of a group from getting mentioned |
-| `lfs_enabled` (optional) | boolean | no | Enable/disable Large File Storage (LFS) for the projects in this group. |
-| `request_access_enabled` | boolean | no | Allow users to request member access. |
| `default_branch_protection` | integer | no | See [Options for `default_branch_protection`](#options-for-default_branch_protection). |
+| `description` | string | no | The description of the group. |
+| `emails_disabled` | boolean | no | Disable email notifications. |
+| `lfs_enabled` | boolean | no | Enable/disable Large File Storage (LFS) for the projects in this group. |
+| `mentions_disabled` | boolean | no | Disable the capability of a group from getting mentioned. |
+| `prevent_sharing_groups_outside_hierarchy` | boolean | no | See [Prevent group sharing outside the group hierarchy](../user/group/index.md#prevent-group-sharing-outside-the-group-hierarchy). This attribute is only available on top-level groups. [Introduced in GitLab 14.1](https://gitlab.com/gitlab-org/gitlab/-/issues/333721) |
+| `project_creation_level` | string | no | Determine if developers can create projects in the group. Can be `noone` (No one), `maintainer` (users with the Maintainer role), or `developer` (users with the Developer or Maintainer role). |
+| `request_access_enabled` | boolean | no | Allow users to request member access. |
+| `require_two_factor_authentication` | boolean | no | Require all users in this group to setup Two-factor authentication. |
+| `shared_runners_setting` | string | no | See [Options for `shared_runners_setting`](#options-for-shared_runners_setting). Enable or disable shared runners for a group's subgroups and projects. |
+| `share_with_group_lock` | boolean | no | Prevent sharing a project with another group within this group. |
+| `subgroup_creation_level` | string | no | Allowed to [create subgroups](../user/group/subgroups/index.md#create-a-subgroup). Can be `owner` (Owners), or `maintainer` (users with the Maintainer role). |
+| `two_factor_grace_period` | integer | no | Time before Two-factor authentication is enforced (in hours). |
+| `visibility` | string | no | The visibility level of the group. Can be `private`, `internal`, or `public`. |
+| `extra_shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Additional CI/CD minutes for this group. |
| `file_template_project_id` **(PREMIUM)** | integer | no | The ID of a project to load custom file templates from. |
+| `membership_lock` **(PREMIUM)** | boolean | no | Prevent adding new members to projects within this group. |
+| `prevent_forking_outside_group` **(PREMIUM)** | boolean | no | When enabled, users can **not** fork projects from this group to external namespaces. |
| `shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Maximum number of monthly CI/CD minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
-| `extra_shared_runners_minutes_limit` **(PREMIUM)** | integer | no | Can be set by administrators only. Additional CI/CD minutes for this group. |
-| `prevent_forking_outside_group` **(PREMIUM)** | boolean | no | When enabled, users can **not** fork projects from this group to external namespaces
-| `shared_runners_setting` | string | no | See [Options for `shared_runners_setting`](#options-for-shared_runners_setting). Enable or disable shared runners for a group's subgroups and projects. |
-| `prevent_sharing_groups_outside_hierarchy` | boolean | no | See [Prevent group sharing outside the group hierarchy](../user/group/index.md#prevent-group-sharing-outside-the-group-hierarchy). This attribute is only available on top-level groups. [Introduced in GitLab 14.1](https://gitlab.com/gitlab-org/gitlab/-/issues/333721) |
NOTE:
The `projects` and `shared_projects` attributes in the response are deprecated and [scheduled for removal in API v5](https://gitlab.com/gitlab-org/gitlab/-/issues/213797).
diff --git a/doc/api/index.md b/doc/api/index.md
index 178c2f05a6d..f78a501fb11 100644
--- a/doc/api/index.md
+++ b/doc/api/index.md
@@ -150,6 +150,10 @@ message with a status code of `401`:
}
```
+NOTE:
+Deploy tokens can't be used with the GitLab public API. For details, see
+[Deploy Tokens](../user/project/deploy_tokens/index.md).
+
### OAuth2 tokens
You can use an [OAuth2 token](oauth2.md) to authenticate with the API by passing
diff --git a/doc/api/integrations.md b/doc/api/integrations.md
index 90bb26ffd3d..c1564826944 100644
--- a/doc/api/integrations.md
+++ b/doc/api/integrations.md
@@ -315,14 +315,15 @@ 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) The full URL for your Datadog site |
-| `datadog_env` | string | false | For self-managed deployments, set the env% tag for all the data sent to Datadog. |
-| `datadog_service` | string | false | Tag all data from this GitLab instance in Datadog. Useful when managing several self-managed deployments |
-| `datadog_site` | string | false | The Datadog site to send data to. To send data to the EU site, use `datadoghq.eu` |
-| `datadog_tags` | string | false | Custom tags in Datadog. Specify one tag per line in the format: `key:value\nkey2:value2` ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79665) in GitLab 14.8.) |
+| Parameter | Type | Required | Description |
+|:-----------------:|:------:|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `api_key` | string | true | API key used for authentication with Datadog. |
+| `api_url` | string | false | (Advanced) The full URL for your Datadog site |
+| `datadog_env` | string | false | For self-managed deployments, set the env% tag for all the data sent to Datadog. |
+| `datadog_service` | string | false | Tag all data from this GitLab instance in Datadog. Useful when managing several self-managed deployments |
+| `datadog_site` | string | false | The Datadog site to send data to. To send data to the EU site, use `datadoghq.eu` |
+| `datadog_tags` | string | false | Custom tags in Datadog. Specify one tag per line in the format: `key:value\nkey2:value2` ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79665) in GitLab 14.8.) |
+
<!-- | `archive_trace_events` | boolean | false | When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/346339) in GitLab 14.7) | -->
<!-- TODO: uncomment the archive_trace_events field once :datadog_integration_logs_collection is rolled out. Rollout issue: https://gitlab.com/gitlab-org/gitlab/-/issues/346339 -->
diff --git a/doc/api/invitations.md b/doc/api/invitations.md
index 0bf9d106404..eb7351c2e09 100644
--- a/doc/api/invitations.md
+++ b/doc/api/invitations.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Invitations API **(FREE)**
-Use the Invitations API to send email to users you want to join a group or project, and to list pending
+Use the Invitations API to invite or add users to a group or project, and to list pending
invitations.
## Valid access levels
@@ -26,9 +26,9 @@ WARNING:
Due to [an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/219299),
projects in personal namespaces don't show owner (`50`) permission.
-## Invite by email to group or project
+## Add a member to a group or project
-Invites a new user by email to join a group or project.
+Adds a new member. You can specify a user ID or invite a user by email.
```plaintext
POST /groups/:id/invitations
@@ -38,7 +38,8 @@ POST /projects/:id/invitations
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
-| `email` | string | yes | The email of the new member or multiple emails separated by commas |
+| `email` | string | yes (if `user_id` isn't provided) | The email of the new member or multiple emails separated by commas. |
+| `user_id` | integer/string | yes (if `email` isn't provided) | The ID of the new member or multiple IDs separated by commas. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/350999) in GitLab 14.10. |
| `access_level` | integer | yes | A valid access level |
| `expires_at` | string | no | A date string in the format YEAR-MONTH-DAY |
| `invite_source` | string | no | The source of the invitation that starts the member creation process. See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/327120). |
@@ -47,9 +48,9 @@ POST /projects/:id/invitations
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
- --data "email=test@example.com&access_level=30" "https://gitlab.example.com/api/v4/groups/:id/invitations"
+ --data "email=test@example.com&user_id=1&access_level=30" "https://gitlab.example.com/api/v4/groups/:id/invitations"
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
- --data "email=test@example.com&access_level=30" "https://gitlab.example.com/api/v4/projects/:id/invitations"
+ --data "email=test@example.com&user_id=1&access_level=30" "https://gitlab.example.com/api/v4/projects/:id/invitations"
```
Example responses:
@@ -67,7 +68,8 @@ When there was any error sending the email:
"status": "error",
"message": {
"test@example.com": "Invite email has already been taken",
- "test2@example.com": "User already exists in source"
+ "test2@example.com": "User already exists in source",
+ "test_username": "Access level is not included in the list"
}
}
```
@@ -77,7 +79,7 @@ When there was any error sending the email:
Gets a list of invited group or project members viewable by the authenticated user.
Returns invitations to direct members only, and not through inherited ancestors' groups.
-This function takes pagination parameters `page` and `per_page` to restrict the list of users.
+This function takes pagination parameters `page` and `per_page` to restrict the list of members.
```plaintext
GET /groups/:id/invitations
diff --git a/doc/api/issues.md b/doc/api/issues.md
index ef0727e1c13..e82aa8da8ed 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -165,6 +165,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"_links":{
"self":"http://gitlab.example.com/api/v4/projects/1/issues/76",
"notes":"http://gitlab.example.com/api/v4/projects/1/issues/76/notes",
@@ -390,6 +391,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"_links":{
"self":"http://gitlab.example.com/api/v4/projects/4/issues/41",
"notes":"http://gitlab.example.com/api/v4/projects/4/issues/41/notes",
@@ -598,6 +600,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"_links":{
"self":"http://gitlab.example.com/api/v4/projects/4/issues/41",
"notes":"http://gitlab.example.com/api/v4/projects/4/issues/41/notes",
@@ -755,6 +758,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"task_completion_status": {
"count": 0,
"completed_count": 0
@@ -917,6 +921,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"_links": {
"self": "http://gitlab.example.com/api/v4/projects/1/issues/2",
"notes": "http://gitlab.example.com/api/v4/projects/1/issues/2/notes",
@@ -1064,6 +1069,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"_links": {
"self": "http://gitlab.example.com/api/v4/projects/1/issues/2",
"notes": "http://gitlab.example.com/api/v4/projects/1/issues/2/notes",
@@ -1238,6 +1244,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"_links": {
"self": "http://gitlab.example.com/api/v4/projects/1/issues/2",
"notes": "http://gitlab.example.com/api/v4/projects/1/issues/2/notes",
@@ -1421,6 +1428,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"_links": {
"self": "http://gitlab.example.com/api/v4/projects/1/issues/2",
"notes": "http://gitlab.example.com/api/v4/projects/1/issues/2/notes",
@@ -1560,6 +1568,7 @@ Example response:
"confidential":false,
"discussion_locked":null,
"issue_type":"issue",
+ "severity": "UNKNOWN",
"web_url":"https://gitlab.example.com/namespace1/project2/-/issues/1",
"time_stats":{
"time_estimate":0,
@@ -1669,6 +1678,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"_links": {
"self": "http://gitlab.example.com/api/v4/projects/1/issues/2",
"notes": "http://gitlab.example.com/api/v4/projects/1/issues/2/notes",
@@ -1797,6 +1807,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"task_completion_status":{
"count":0,
"completed_count":0
@@ -1906,6 +1917,7 @@ Example response:
"confidential": false,
"discussion_locked": false,
"issue_type": "issue",
+ "severity": "UNKNOWN",
"task_completion_status":{
"count":0,
"completed_count":0
diff --git a/doc/api/job_artifacts.md b/doc/api/job_artifacts.md
index d272f259ddf..517ffde0046 100644
--- a/doc/api/job_artifacts.md
+++ b/doc/api/job_artifacts.md
@@ -287,11 +287,8 @@ If the artifacts were deleted successfully, a response with status `204 No Conte
## Delete project artifacts
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223793) in GitLab 14.7 [with a flag](../administration/feature_flags.md) named `bulk_expire_project_artifacts`. Enabled by default on GitLab self-managed. Enabled on GitLab.com.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to
-[disable the `bulk_expire_project_artifacts` flag](../administration/feature_flags.md). On GitLab.com, this feature is available.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223793) in GitLab 14.7 [with a flag](../administration/feature_flags.md) named `bulk_expire_project_artifacts`. Enabled by default on GitLab self-managed. Enabled on GitLab.com.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/350609) in GitLab 14.10.
Delete artifacts of a project that can be deleted.
diff --git a/doc/api/linked_epics.md b/doc/api/linked_epics.md
index 89168c344f3..df302be0555 100644
--- a/doc/api/linked_epics.md
+++ b/doc/api/linked_epics.md
@@ -88,3 +88,239 @@ Example response:
}
]
```
+
+## Create a related epic link
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352840) in GitLab 14.10.
+
+Create a two-way relation between two epics. The user must be allowed to
+update both epics to succeed.
+
+```plaintext
+POST /groups/:id/epics/:epic_iid/related_epics
+```
+
+Supported attributes:
+
+| Attribute | Type | Required | Description |
+|---------------------|----------------|-----------------------------|---------------------------------------|
+| `epic_iid` | integer | **{check-circle}** Yes | Internal ID of a group's epic. |
+| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `target_epic_iid` | integer/string | **{check-circle}** Yes | Internal ID of a target group's epic. |
+| `target_group_id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the target group](index.md#namespaced-path-encoding). |
+| `link_type` | string | **{dotted-circle}** No | Type of the relation (`relates_to`, `blocks`, `is_blocked_by`), defaults to `relates_to`. |
+
+Example request:
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/26/epics/1/related_epics?target_group_id=26&target_epic_iid=5"
+```
+
+Example response:
+
+```json
+{
+ "source_epic": {
+ "id": 21,
+ "iid": 1,
+ "color": "#1068bf",
+ "text_color": "#FFFFFF",
+ "group_id": 26,
+ "parent_id": null,
+ "parent_iid": null,
+ "title": "Aspernatur recusandae distinctio omnis et qui est iste.",
+ "description": "some description",
+ "confidential": false,
+ "author": {
+ "id": 15,
+ "username": "trina",
+ "name": "Theresia Robel",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/085e28df717e16484cbf6ceca75e9a93?s=80&d=identicon",
+ "web_url": "http://gitlab.example.com/trina"
+ },
+ "start_date": null,
+ "end_date": null,
+ "due_date": null,
+ "state": "opened",
+ "web_url": "http://gitlab.example.com/groups/flightjs/-/epics/1",
+ "references": {
+ "short": "&1",
+ "relative": "&1",
+ "full": "flightjs&1"
+ },
+ "created_at": "2022-01-31T15:10:44.988Z",
+ "updated_at": "2022-03-16T09:32:35.712Z",
+ "closed_at": null,
+ "labels": [],
+ "upvotes": 0,
+ "downvotes": 0,
+ "_links": {
+ "self": "http://gitlab.example.com/api/v4/groups/26/epics/1",
+ "epic_issues": "http://gitlab.example.com/api/v4/groups/26/epics/1/issues",
+ "group": "http://gitlab.example.com/api/v4/groups/26",
+ "parent": null
+ }
+ },
+ "target_epic": {
+ "id": 25,
+ "iid": 5,
+ "color": "#1068bf",
+ "text_color": "#FFFFFF",
+ "group_id": 26,
+ "parent_id": null,
+ "parent_iid": null,
+ "title": "Aut assumenda id nihil distinctio fugiat vel numquam est.",
+ "description": "some description",
+ "confidential": false,
+ "author": {
+ "id": 3,
+ "username": "valerie",
+ "name": "Erika Wolf",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/9ef7666abb101418a4716a8ed4dded80?s=80&d=identicon",
+ "web_url": "http://gitlab.example.com/valerie"
+ },
+ "start_date": null,
+ "end_date": null,
+ "due_date": null,
+ "state": "opened",
+ "web_url": "http://gitlab.example.com/groups/flightjs/-/epics/5",
+ "references": {
+ "short": "&5",
+ "relative": "&5",
+ "full": "flightjs&5"
+ },
+ "created_at": "2022-01-31T15:10:45.080Z",
+ "updated_at": "2022-03-16T09:32:35.842Z",
+ "closed_at": null,
+ "labels": [],
+ "upvotes": 0,
+ "downvotes": 0,
+ "_links": {
+ "self": "http://gitlab.example.com/api/v4/groups/26/epics/5",
+ "epic_issues": "http://gitlab.example.com/api/v4/groups/26/epics/5/issues",
+ "group": "http://gitlab.example.com/api/v4/groups/26",
+ "parent": null
+ }
+ },
+ "link_type": "relates_to"
+}
+```
+
+## Delete a related epic link
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352840) in GitLab 14.10.
+
+Delete a two-way relation between two epics. The user must be allowed to
+update both epics to succeed.
+
+```plaintext
+DELETE /groups/:id/epics/:epic_iid/related_epics/:related_epic_link_id
+```
+
+Supported attributes:
+
+| Attribute | Type | Required | Description |
+|--------------------------|----------------|-----------------------------|---------------------------------------|
+| `epic_iid` | integer | **{check-circle}** Yes | Internal ID of a group's epic. |
+| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `related_epic_link_id` | integer/string | **{check-circle}** Yes | Internal ID of a related epic link. |
+
+Example request:
+
+```shell
+curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/26/epics/1/related_epics/1"
+```
+
+Example response:
+
+```json
+{
+ "source_epic": {
+ "id": 21,
+ "iid": 1,
+ "color": "#1068bf",
+ "text_color": "#FFFFFF",
+ "group_id": 26,
+ "parent_id": null,
+ "parent_iid": null,
+ "title": "Aspernatur recusandae distinctio omnis et qui est iste.",
+ "description": "some description",
+ "confidential": false,
+ "author": {
+ "id": 15,
+ "username": "trina",
+ "name": "Theresia Robel",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/085e28df717e16484cbf6ceca75e9a93?s=80&d=identicon",
+ "web_url": "http://gitlab.example.com/trina"
+ },
+ "start_date": null,
+ "end_date": null,
+ "due_date": null,
+ "state": "opened",
+ "web_url": "http://gitlab.example.com/groups/flightjs/-/epics/1",
+ "references": {
+ "short": "&1",
+ "relative": "&1",
+ "full": "flightjs&1"
+ },
+ "created_at": "2022-01-31T15:10:44.988Z",
+ "updated_at": "2022-03-16T09:32:35.712Z",
+ "closed_at": null,
+ "labels": [],
+ "upvotes": 0,
+ "downvotes": 0,
+ "_links": {
+ "self": "http://gitlab.example.com/api/v4/groups/26/epics/1",
+ "epic_issues": "http://gitlab.example.com/api/v4/groups/26/epics/1/issues",
+ "group": "http://gitlab.example.com/api/v4/groups/26",
+ "parent": null
+ }
+ },
+ "target_epic": {
+ "id": 25,
+ "iid": 5,
+ "color": "#1068bf",
+ "text_color": "#FFFFFF",
+ "group_id": 26,
+ "parent_id": null,
+ "parent_iid": null,
+ "title": "Aut assumenda id nihil distinctio fugiat vel numquam est.",
+ "description": "some description",
+ "confidential": false,
+ "author": {
+ "id": 3,
+ "username": "valerie",
+ "name": "Erika Wolf",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/9ef7666abb101418a4716a8ed4dded80?s=80&d=identicon",
+ "web_url": "http://gitlab.example.com/valerie"
+ },
+ "start_date": null,
+ "end_date": null,
+ "due_date": null,
+ "state": "opened",
+ "web_url": "http://gitlab.example.com/groups/flightjs/-/epics/5",
+ "references": {
+ "short": "&5",
+ "relative": "&5",
+ "full": "flightjs&5"
+ },
+ "created_at": "2022-01-31T15:10:45.080Z",
+ "updated_at": "2022-03-16T09:32:35.842Z",
+ "closed_at": null,
+ "labels": [],
+ "upvotes": 0,
+ "downvotes": 0,
+ "_links": {
+ "self": "http://gitlab.example.com/api/v4/groups/26/epics/5",
+ "epic_issues": "http://gitlab.example.com/api/v4/groups/26/epics/5/issues",
+ "group": "http://gitlab.example.com/api/v4/groups/26",
+ "parent": null
+ }
+ },
+ "link_type": "relates_to"
+}
+```
diff --git a/doc/api/members.md b/doc/api/members.md
index 10072baf2ff..77a91436e6c 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -18,10 +18,9 @@ The access levels are defined in the `Gitlab::Access` module. Currently, these l
- Maintainer (`40`)
- Owner (`50`) - Only valid to set for groups
-WARNING:
-Due to [an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/219299),
-projects in personal namespaces don't show owner (`50`) permission
-for owner.
+NOTE:
+In [GitLab 14.9](https://gitlab.com/gitlab-org/gitlab/-/issues/351211) and later, projects in personal namespaces have an `access_level` of `50`(Owner).
+In GitLab 14.8 and earlier, projects in personal namespaces have an `access_level` of `40` (Maintainer) due to [an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/219299)
## Limitations
@@ -63,6 +62,15 @@ Example response:
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
+ "created_at": "2012-09-22T14:13:35Z",
+ "created_by": {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": "2012-10-22T14:13:35Z",
"access_level": 30,
"group_saml_identity": null,
@@ -75,6 +83,15 @@ Example response:
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
+ "created_at": "2012-09-22T14:13:35Z",
+ "created_by": {
+ "id": 1,
+ "username": "raymond_smith",
+ "name": "Raymond Smith",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": "2012-10-22T14:13:35Z",
"access_level": 30,
"email": "john@example.com",
@@ -132,6 +149,15 @@ Example response:
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
+ "created_at": "2012-09-22T14:13:35Z",
+ "created_by": {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": "2012-10-22T14:13:35Z",
"access_level": 30,
"group_saml_identity": null,
@@ -144,6 +170,15 @@ Example response:
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
+ "created_at": "2012-09-22T14:13:35Z",
+ "created_by": {
+ "id": 1,
+ "username": "raymond_smith",
+ "name": "Raymond Smith",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": "2012-10-22T14:13:35Z",
"access_level": 30,
"email": "john@example.com",
@@ -161,6 +196,15 @@ Example response:
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
+ "created_at": "2012-10-22T14:13:35Z",
+ "created_by": {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": "2012-11-22T14:13:35Z",
"access_level": 30,
"group_saml_identity": null,
@@ -201,6 +245,14 @@ Example response:
"access_level": 30,
"email": "john@example.com",
"created_at": "2012-10-22T14:13:35Z",
+ "created_by": {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": null,
"group_saml_identity": null,
"membership_state": "active"
@@ -239,6 +291,15 @@ Example response:
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
"access_level": 30,
+ "created_at": "2012-10-22T14:13:35Z",
+ "created_by": {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"email": "john@example.com",
"expires_at": null,
"group_saml_identity": null,
@@ -250,7 +311,7 @@ Example response:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217384) in GitLab 13.5.
-Gets a list of group members that count as billable. The list includes members in the subgroup or subproject.
+Gets a list of group members that count as billable. The list includes members in subgroups and projects.
This API endpoint works on top-level groups only. It does not work on subgroups.
@@ -267,11 +328,12 @@ respectively.
GET /groups/:id/billable_members
```
-| Attribute | Type | Required | Description |
-| --------- | ---- | -------- |--------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
-| `search` | string | no | A query string to search for group members by name, username, or public email. |
-| `sort` | string | no | A query string containing parameters that specify the sort attribute and order. See supported values below. |
+| Attribute | Type | Required | Description |
+| ----------------------------- | --------------- | --------- |-------------------------------------------------------------------------------------------------------------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
+| `search` | string | no | A query string to search for group members by name, username, or public email. |
+| `sort` | string | no | A query string containing parameters that specify the sort attribute and order. See supported values below. |
+| `include_awaiting_members` | boolean | no | Determines if awaiting members are included. |
The supported values for the `sort` attribute are:
@@ -454,6 +516,15 @@ Example response:
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
+ "created_at": "2012-10-22T14:13:35Z",
+ "created_by": {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": "2012-10-22T14:13:35Z",
"access_level": 30,
"email": "john@example.com",
@@ -492,6 +563,15 @@ Example response:
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
+ "created_at": "2012-10-22T14:13:35Z",
+ "created_by": {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": "2012-10-22T14:13:35Z",
"access_level": 40,
"email": "john@example.com",
@@ -529,6 +609,15 @@ Example response:
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
+ "created_at": "2012-10-22T14:13:35Z",
+ "created_by": {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": "2012-10-22T14:13:35Z",
"access_level": 40,
"email": "john@example.com",
@@ -566,6 +655,15 @@ Example response:
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
"web_url": "http://192.168.1.8:3000/root",
+ "created_at": "2012-10-22T14:13:35Z",
+ "created_by": {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root"
+ },
"expires_at": "2012-10-22",
"access_level": 40,
"email": "john@example.com",
diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md
index e569abd323e..721e4db3314 100644
--- a/doc/api/merge_request_approvals.md
+++ b/doc/api/merge_request_approvals.md
@@ -281,7 +281,7 @@ GET /projects/:id/approval_rules/:approval_rule_id
WARNING:
The Vulnerability-Check feature, including the Vulnerability-Check attributes listed here, is in its
end-of-life process. It is [deprecated](../update/deprecations.md#vulnerability-check)
-for use in GitLab 14.8, and is planned for removal in GitLab 15.0. Users should migrate to the new
+in GitLab 14.8, and is planned for removal in GitLab 15.0. Users should migrate to the new
[Security Approval Policies](../user/application_security/policies/#scan-result-policy-editor).
You can create project approval rules using the following endpoint:
@@ -413,7 +413,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
WARNING:
The Vulnerability-Check feature, including the Vulnerability-Check attributes listed here, is in its
end-of-life process. It is [deprecated](../update/deprecations.md#vulnerability-check)
-for use in GitLab 14.8, and is planned for removal in GitLab 15.0. Users should migrate to the new
+in GitLab 14.8, and is planned for removal in GitLab 15.0. Users should migrate to the new
[Security Approval Policies](../user/application_security/policies/#scan-result-policy-editor).
You can update project approval rules using the following endpoint:
@@ -776,6 +776,82 @@ GET /projects/:id/merge_requests/:merge_request_iid/approval_rules
]
```
+### Get a single merge request level rule
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82767) in GitLab 14.10.
+
+You can request information about a single merge request approval rule using the following endpoint:
+
+```plaintext
+GET /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rule_id
+```
+
+**Parameters:**
+
+| Attribute | Type | Required | Description |
+|---------------------|---------|----------|------------------------------------------------------------------------------|
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `merge_request_iid` | integer | yes | The IID of a merge request. |
+| `approval_rule_id` | integer | yes | The ID of an approval rule. |
+
+```json
+{
+ "id": 1,
+ "name": "security",
+ "rule_type": "regular",
+ "eligible_approvers": [
+ {
+ "id": 5,
+ "name": "John Doe",
+ "username": "jdoe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
+ "web_url": "http://localhost/jdoe"
+ },
+ {
+ "id": 50,
+ "name": "Group Member 1",
+ "username": "group_member_1",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
+ "web_url": "http://localhost/group_member_1"
+ }
+ ],
+ "approvals_required": 3,
+ "source_rule": null,
+ "users": [
+ {
+ "id": 5,
+ "name": "John Doe",
+ "username": "jdoe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
+ "web_url": "http://localhost/jdoe"
+ }
+ ],
+ "groups": [
+ {
+ "id": 5,
+ "name": "group1",
+ "path": "group1",
+ "description": "",
+ "visibility": "public",
+ "lfs_enabled": false,
+ "avatar_url": null,
+ "web_url": "http://localhost/groups/group1",
+ "request_access_enabled": false,
+ "full_name": "group1",
+ "full_path": "group1",
+ "parent_id": null,
+ "ldap_cn": null,
+ "ldap_access": null
+ }
+ ],
+ "contains_hidden_groups": false,
+ "overridden": false
+}
+```
+
### Create merge request level rule
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11877) in GitLab 12.3.
@@ -881,13 +957,13 @@ These are system generated rules.
| Attribute | Type | Required | Description |
|----------------------|---------|----------|------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
-| `merge_request_iid` | integer | yes | The ID of MR |
-| `approval_rule_id` | integer | yes | The ID of a approval rule |
-| `name` | string | yes | The name of the approval rule |
-| `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 |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
+| `merge_request_iid` | integer | yes | The IID of a merge request. |
+| `approval_rule_id` | integer | yes | The ID of an approval rule. |
+| `name` | string | yes | The name of the approval rule. |
+| `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. |
```json
{
diff --git a/doc/api/notes.md b/doc/api/notes.md
index 83631c70f8a..fbcf5e28f79 100644
--- a/doc/api/notes.md
+++ b/doc/api/notes.md
@@ -142,8 +142,8 @@ Parameters:
| Attribute | Type | Required | Description |
|----------------|----------------|----------|------------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
-| `issue_iid` | integer | yes | The IID of an issue. |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
+| `issue_iid` | integer | yes | The IID of an issue. |
| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
| `confidential` | boolean | no | The confidential flag of a note. Default is false. |
| `created_at` | string | no | Date time string, ISO 8601 formatted. Example: `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights) |
@@ -162,13 +162,13 @@ PUT /projects/:id/issues/:issue_iid/notes/:note_id
Parameters:
-| Attribute | Type | Required | Description |
-|----------------|----------------|----------|----------------------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
-| `issue_iid` | integer | yes | The IID of an issue. |
-| `note_id` | integer | yes | The ID of a note. |
-| `body` | string | no | The content of a note. Limited to 1,000,000 characters. |
-| `confidential` | boolean | no | The confidential flag of a note. |
+| Attribute | Type | Required | Description |
+|----------------|----------------|-------------|----------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
+| `issue_iid` | integer | yes | The IID of an issue. |
+| `note_id` | integer | yes | The ID of a note. |
+| `body` | string | no | The content of a note. Limited to 1,000,000 characters. |
+| `confidential` | boolean | no | **Deprecated:** will be removed in GitLab 16.0. The confidential flag of a note. Default is false. |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/issues/11/notes?body=note"
@@ -403,7 +403,7 @@ Parameters:
| `merge_request_iid` | integer | yes | The IID of a project merge request |
| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
| `created_at` | string | no | Date time string, ISO 8601 formatted. Example: `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights) |
-| `merge_request_diff_sha`| string | no | The SHA of the head commit which is used to ensure that the merge request hasn't been updated since the API request was sent. This is required for the /merge quick action |
+| `merge_request_diff_sha`| string | no | Required for the `/merge` [quick action](../user/project/quick_actions.md). The SHA of the head commit, which ensures the merge request wasn't updated after the API request was sent. |
### Modify existing merge request note
@@ -415,12 +415,13 @@ PUT /projects/:id/merge_requests/:merge_request_iid/notes/:note_id
Parameters:
-| Attribute | Type | Required | Description |
-|---------------------|----------------|----------|---------------------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
-| `merge_request_iid` | integer | yes | The IID of a project merge request |
-| `note_id` | integer | no | The ID of a note |
-| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
+| Attribute | Type | Required | Description |
+|---------------------|-------------------|----------|----------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
+| `merge_request_iid` | integer | yes | The IID of a project merge request |
+| `note_id` | integer | no | The ID of a note |
+| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
+| `confidential` | boolean | no | **Deprecated:** will be removed in GitLab 16.0. The confidential flag of a note. Default is false. |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/11/notes?body=note"
@@ -452,6 +453,11 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
Gets a list of all notes for a single epic. Epic notes are comments users can post to an epic.
+NOTE:
+The epics notes API uses the epic ID instead of epic IID. If you use the epic's IID, GitLab returns either a 404
+error or notes for the wrong epic. It's different from the [issue notes API](#issues) and
+[merge requests notes API](#merge-requests).
+
```plaintext
GET /groups/:id/epics/:epic_id/notes
GET /groups/:id/epics/:epic_id/notes?sort=asc&order_by=updated_at
@@ -519,11 +525,12 @@ POST /groups/:id/epics/:epic_id/notes
Parameters:
-| Attribute | Type | Required | Description |
-| --------- | -------------- | -------- | ----------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
-| `epic_id` | integer | yes | The ID of an epic |
-| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
+| Attribute | Type | Required | Description |
+| --------- | -------------- | -------- | ----------- |
+| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
+| `epic_id` | integer | yes | The ID of an epic |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
+| `confidential` | boolean | no | The confidential flag of a note. Default is `false`. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/epics/11/notes?body=note"
@@ -539,12 +546,13 @@ PUT /groups/:id/epics/:epic_id/notes/:note_id
Parameters:
-| Attribute | Type | Required | Description |
-| --------- | -------------- | -------- | ----------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
-| `epic_id` | integer | yes | The ID of an epic |
-| `note_id` | integer | yes | The ID of a note |
-| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
+| Attribute | Type | Required | Description |
+| ---------------| ----------------- | -------- | ---------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
+| `epic_id` | integer | yes | The ID of an epic |
+| `note_id` | integer | yes | The ID of a note |
+| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
+| `confidential` | boolean | no | **Deprecated:** will be removed in GitLab 16.0. The confidential flag of a note. Default is false. |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/epics/11/notes?body=note"
diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md
index 7b38ac39b96..ad93d8033d0 100644
--- a/doc/api/oauth2.md
+++ b/doc/api/oauth2.md
@@ -24,10 +24,6 @@ GitLab supports the following authorization flows:
and is recommended for both client and server apps.
- **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.
- 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
hosted, first-party services. GitLab recommends against use of this flow.
@@ -64,7 +60,7 @@ As OAuth 2.0 bases its security entirely on the transport layer, you should not
URIs. For more information, see the [OAuth 2.0 RFC](https://tools.ietf.org/html/rfc6749#section-3.1.2.1)
and the [OAuth 2.0 Threat Model RFC](https://tools.ietf.org/html/rfc6819#section-4.4.2.1).
These factors are particularly important when using the
-[Implicit grant flow](#implicit-grant-flow), where actual credentials are included in the `redirect_uri`.
+[Implicit grant flow](#implicit-grant-flow-deprecated), where actual credentials are included in the `redirect_uri`.
In the following sections you can find detailed instructions on how to obtain
authorization with each flow.
@@ -242,40 +238,6 @@ authorization request.
You can now make requests to the API with the access token returned.
-### Implicit grant flow
-
-WARNING:
-Implicit grant flow is inherently insecure and the IETF has removed it in [OAuth 2.1](https://oauth.net/2.1/).
-It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/288516) for use in GitLab 14.0, and is planned for
-[removal](https://gitlab.com/gitlab-org/gitlab/-/issues/344609) in GitLab 15.0.
-
-We recommend that you use [Authorization code with PKCE](#authorization-code-with-proof-key-for-code-exchange-pkce)
-instead.
-
-Unlike the authorization code flow, the client receives an `access token`
-immediately as a result of the authorization request. The flow does not use the
-client secret or the authorization code, as the application
-code and storage is accessible on client browsers and mobile devices.
-
-To request the access token, you should redirect the user to the
-`/oauth/authorize` endpoint using `token` response type:
-
-```plaintext
-https://gitlab.example.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token&state=YOUR_UNIQUE_STATE_HASH&scope=REQUESTED_SCOPES
-```
-
-This prompts the user to approve the applications access to their account
-based on the scopes specified in `REQUESTED_SCOPES` and then redirect back to
-the `REDIRECT_URI` you provided. The [scope parameter](../integration/oauth_provider.md#authorized-applications)
- is a space-separated list of scopes you want to have access to (for example, `scope=read_user+profile`
-would request `read_user` and `profile` scopes). The redirect
-includes a fragment with `access_token` as well as token details in GET
-parameters, for example:
-
-```plaintext
-https://example.com/oauth/redirect#access_token=ABCDExyz123&state=YOUR_UNIQUE_STATE_HASH&token_type=bearer&expires_in=3600
-```
-
### Resource owner password credentials flow
NOTE:
@@ -357,6 +319,40 @@ access_token = client.password.get_token('user@example.com', 'secret')
puts access_token.token
```
+### Implicit grant flow (DEPRECATED)
+
+WARNING:
+Implicit grant flow is inherently insecure and the IETF has removed it in [OAuth 2.1](https://oauth.net/2.1/).
+It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/288516) in GitLab 14.0, and is planned for
+[removal](https://gitlab.com/gitlab-org/gitlab/-/issues/344609) in GitLab 15.0.
+
+We recommend that you use [Authorization code with PKCE](#authorization-code-with-proof-key-for-code-exchange-pkce)
+instead.
+
+Unlike the authorization code flow, the client receives an `access token`
+immediately as a result of the authorization request. The flow does not use the
+client secret or the authorization code, as the application
+code and storage is accessible on client browsers and mobile devices.
+
+To request the access token, you should redirect the user to the
+`/oauth/authorize` endpoint using `token` response type:
+
+```plaintext
+https://gitlab.example.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token&state=YOUR_UNIQUE_STATE_HASH&scope=REQUESTED_SCOPES
+```
+
+This prompts the user to approve the applications access to their account
+based on the scopes specified in `REQUESTED_SCOPES` and then redirect back to
+the `REDIRECT_URI` you provided. The [scope parameter](../integration/oauth_provider.md#authorized-applications)
+ is a space-separated list of scopes you want to have access to (for example, `scope=read_user+profile`
+would request `read_user` and `profile` scopes). The redirect
+includes a fragment with `access_token` as well as token details in GET
+parameters, for example:
+
+```plaintext
+https://example.com/oauth/redirect#access_token=ABCDExyz123&state=YOUR_UNIQUE_STATE_HASH&token_type=bearer&expires_in=3600
+```
+
## Access GitLab API with `access token`
The `access token` allows you to make requests to the API on behalf of a user.
diff --git a/doc/api/packages/composer.md b/doc/api/packages/composer.md
index b3a27519729..ea2e917bbba 100644
--- a/doc/api/packages/composer.md
+++ b/doc/api/packages/composer.md
@@ -262,6 +262,8 @@ Example response:
## Download a package archive
+> Authorization for this endpoint was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/331601) in GitLab 14.10.
+
Download a Composer package. This URL is provided in the [v1](#v1-package-metadata)
or [v2 package metadata](#v2-package-metadata)
response. A `.zip` file extension must be in the request.
@@ -287,3 +289,6 @@ curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v
```
This writes the downloaded file to `package.tar.gz` in the current directory.
+
+NOTE:
+This endpoint requires authorization in GitLab 14.10 and later. In GitLab 14.9 and earlier, it was publicly accessible.
diff --git a/doc/api/pages.md b/doc/api/pages.md
index 7316d225dbc..57982188858 100644
--- a/doc/api/pages.md
+++ b/doc/api/pages.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/api/pages_domains.md b/doc/api/pages_domains.md
index c1f81ffa361..610fd97c810 100644
--- a/doc/api/pages_domains.md
+++ b/doc/api/pages_domains.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/api/project_access_tokens.md b/doc/api/project_access_tokens.md
index f6eced4f08a..b13005ec436 100644
--- a/doc/api/project_access_tokens.md
+++ b/doc/api/project_access_tokens.md
@@ -20,7 +20,7 @@ GET projects/:id/access_tokens
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/<project_id>/access_tokens"
@@ -44,9 +44,46 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
]
```
+## Get a project access token
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82714) in GitLab 14.10.
+
+Get a [project access token](../user/project/settings/project_access_tokens.md) by ID.
+
+```plaintext
+GET projects/:id/access_tokens/:token_id
+```
+
+| Attribute | Type | required | Description |
+|-----------|---------|----------|---------------------|
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
+| `token_id` | integer or string | yes | ID of the project access token |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/<project_id>/access_tokens/<token_id>"
+```
+
+```json
+{
+ "user_id" : 141,
+ "scopes" : [
+ "api"
+ ],
+ "name" : "token",
+ "expires_at" : "2021-01-31",
+ "id" : 42,
+ "active" : true,
+ "created_at" : "2021-01-20T22:11:48.151Z",
+ "revoked" : false,
+ "access_level": 40,
+ "last_used_at": "2022-03-15T11:05:42.437Z"
+}
+```
+
## Create a project access token
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55408) in GitLab 13.10.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55408) in GitLab 13.10.
+> - The `token` attribute was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55408) in GitLab 13.10.
Create a [project access token](../user/project/settings/project_access_tokens.md).
@@ -56,11 +93,11 @@ POST projects/:id/access_tokens
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
-| `name` | String | yes | The name of the project access token |
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
+| `name` | String | yes | Name of the project access token |
| `scopes` | `Array[String]` | yes | [List of scopes](../user/project/settings/project_access_tokens.md#scopes-for-a-project-access-token) |
| `access_level` | Integer | no | A valid access level. Default value is 40 (Maintainer). Other allowed values are 10 (Guest), 20 (Reporter), and 30 (Developer). |
-| `expires_at` | Date | no | The token expires at midnight UTC on that date |
+| `expires_at` | Date | no | Token expires at midnight UTC on that date |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -99,8 +136,8 @@ DELETE projects/:id/access_tokens/:token_id
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
-| `token_id` | integer or string | yes | The ID of the project access token |
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
+| `token_id` | integer or string | yes | ID of the project access token |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/<project_id>/access_tokens/<token_id>"
diff --git a/doc/api/project_import_export.md b/doc/api/project_import_export.md
index 46fa05d6cbc..b9ebfa0fc5c 100644
--- a/doc/api/project_import_export.md
+++ b/doc/api/project_import_export.md
@@ -248,10 +248,11 @@ The `Content-Type` header must be `application/gzip`.
## Import a file from AWS S3
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/348874) in GitLab 14.9 in [Beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta), [with a flag](../administration/feature_flags.md) named `import_project_from_remote_file_s3`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/348874) in GitLab 14.9 in [Beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta), [with a flag](../administration/feature_flags.md) named `import_project_from_remote_file_s3`. Disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/348874) in GitLab 14.10.
FLAG:
-On self-managed GitLab and GitLab.com, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `import_project_from_remote_file_s3`. This feature is not ready for production use.
+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 `import_project_from_remote_file_s3`. On GitLab.com, this feature is available.
```plaintext
POST /projects/remote-import-s3
@@ -261,6 +262,7 @@ POST /projects/remote-import-s3
| ------------------- | -------------- | -------- | ---------------------------------------- |
| `namespace` | integer/string | no | The ID or path of the namespace to import the project to. Defaults to the current user's namespace. |
| `name` | string | no | The name of the project to import. If not provided, defaults to the path of the project. |
+| `path` | string | yes | The full path of the new project. |
| `region` | string | yes | [AWS S3 region name where the file is stored.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#Regions) |
| `bucket_name` | string | yes | [AWS S3 bucket name where the file is stored.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) |
| `file_key` | string | yes | [AWS S3 file key to identify the file.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingObjects.html) |
@@ -271,7 +273,7 @@ The passed override parameters take precedence over all values defined in the ex
```shell
curl --request POST \
- --url "http://localhost:3000/api/v4/projects/remote-import-s3" \
+ --url "https://gitlab.example.com/api/v4/projects/remote-import-s3" \
--header "PRIVATE-TOKEN: <your gitlab access key>" \
--header 'Content-Type: application/json' \
--data '{
diff --git a/doc/api/project_level_variables.md b/doc/api/project_level_variables.md
index 2251b0fc7fd..4205e6699fe 100644
--- a/doc/api/project_level_variables.md
+++ b/doc/api/project_level_variables.md
@@ -170,5 +170,5 @@ This parameter is used for filtering by attributes, such as `environment_scope`.
Example usage:
```shell
-curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables/VARIABLE_1?filter[environment_scope]=production"
+curl --request DELETE --globoff --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables/VARIABLE_1?filter[environment_scope]=production"
```
diff --git a/doc/api/projects.md b/doc/api/projects.md
index ee649377745..c40d39ee981 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -19,7 +19,7 @@ Values for the project visibility level are:
- `internal`: the project can be cloned by any signed-in user except [external users](../user/permissions.md#external-users).
- `public`: the project can be accessed without any authentication.
-For more, read [Project visibility](../public_access/public_access.md).
+For more, read [Project visibility](../user/public_access.md).
## Project merge method
@@ -49,6 +49,7 @@ GET /projects
| `archived` | boolean | **{dotted-circle}** No | Limit by archived status. |
| `id_after` | integer | **{dotted-circle}** No | Limit results to projects with IDs greater than the specified ID. |
| `id_before` | integer | **{dotted-circle}** No | Limit results to projects with IDs less than the specified ID. |
+| `imported` | boolean | **{dotted-circle}** No | Limit results to projects which were imported from external systems by current user. |
| `last_activity_after` | datetime | **{dotted-circle}** No | Limit results to projects with last_activity after specified time. Format: ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`) |
| `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. |
@@ -374,7 +375,7 @@ Get a list of visible projects owned by the given user. When accessed without
authentication, only public projects are returned.
NOTE:
-Only the projects in the user's (specified in `user_id`) namespace are returned. Projects owned by the user in any group or subgroups are not returned.
+Only the projects in the user's (specified in `user_id`) namespace are returned. Projects owned by the user in any group or subgroups are not returned. An empty list is returned if a profile is set to private.
This endpoint supports [keyset pagination](index.md#keyset-based-pagination)
for selected `order_by` options.
@@ -1228,7 +1229,7 @@ POST /projects
| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time, in seconds, that a job can run. |
| `builds_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `ci_config_path` | string | **{dotted-circle}** No | The path to CI configuration file. |
-| `container_expiration_policy_attributes` | hash | **{dotted-circle}** No | Update the image cleanup policy for this project. Accepts: `cadence` (string), `keep_n` (integer), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean). Valid values for `cadence` are: `1d` (every day), `7d` (every week), `14d` (every two weeks), `1month` (every month), or `3month` (every quarter). |
+| `container_expiration_policy_attributes` | hash | **{dotted-circle}** No | Update the image cleanup policy for this project. Accepts: `cadence` (string), `keep_n` (integer), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean). See the [Container Registry](../user/packages/container_registry/reduce_container_registry_storage.md#use-the-cleanup-policy-api) documentation for more information on `cadence`, `keep_n` and `older_than` values. |
| `container_registry_access_level` | string | **{dotted-circle}** No | Set visibility of container registry, for this project, to one of `disabled`, `private` or `enabled`. |
| `container_registry_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable container registry for this project. Use `container_registry_access_level` instead. |
| `default_branch` | string | **{dotted-circle}** No | The [default branch](../user/project/repository/branches/default.md) name. Requires `initialize_with_readme` to be `true`. |
@@ -2563,7 +2564,7 @@ POST /projects/:id/push_rule
| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `author_email_regex` | string | **{dotted-circle}** No | All commit author emails must match this, for example `@my-company.com$`. |
| `branch_name_regex` | string | **{dotted-circle}** No | All branch names must match this, for example `(feature|hotfix)\/*`. |
-| `commit_committer_check` | boolean | **{dotted-circle}** No | Users can only push commits to this repository that were committed with one of their own verified emails. |
+| `commit_committer_check` | boolean | **{dotted-circle}** No | Users can only push commits to this repository if the committer email is one of their own verified emails. |
| `commit_message_negative_regex` | string | **{dotted-circle}** No | No commit message is allowed to match this, for example `ssh\:\/\/`. |
| `commit_message_regex` | string | **{dotted-circle}** No | All commit messages must match this, for example `Fixed \d+\..*`. |
| `deny_delete_tag` | boolean | **{dotted-circle}** No | Deny deleting a tag. |
@@ -2586,7 +2587,7 @@ PUT /projects/:id/push_rule
| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `author_email_regex` | string | **{dotted-circle}** No | All commit author emails must match this, for example `@my-company.com$`. |
| `branch_name_regex` | string | **{dotted-circle}** No | All branch names must match this, for example `(feature|hotfix)\/*`. |
-| `commit_committer_check` | boolean | **{dotted-circle}** No | Users can only push commits to this repository that were committed with one of their own verified emails. |
+| `commit_committer_check` | boolean | **{dotted-circle}** No | Users can only push commits to this repository if the committer email is one of their own verified emails. |
| `commit_message_negative_regex` | string | **{dotted-circle}** No | No commit message is allowed to match this, for example `ssh\:\/\/`. |
| `commit_message_regex` | string | **{dotted-circle}** No | All commit messages must match this, for example `Fixed \d+\..*`. |
| `deny_delete_tag` | boolean | **{dotted-circle}** No | Deny deleting a tag. |
diff --git a/doc/api/protected_environments.md b/doc/api/protected_environments.md
index 61587136a14..fc7eb5caf6d 100644
--- a/doc/api/protected_environments.md
+++ b/doc/api/protected_environments.md
@@ -99,7 +99,7 @@ POST /projects/:id/protected_environments
```shell
curl --header 'Content-Type: application/json' --request POST \
- --data '{"name": "production", "deploy_access_levels": [{"group_id": 9899826}]}' \
+ --data '{"name": "production", "deploy_access_levels": [{"group_id": 9899826}], "approval_rules": [{"group_id": 134}, {"group_id": 135, "required_approvals": 2}]}' \
--header "PRIVATE-TOKEN: <your_access_token>" \
"https://gitlab.example.com/api/v4/projects/22034114/protected_environments"
```
@@ -110,8 +110,9 @@ curl --header 'Content-Type: application/json' --request POST \
| `name` | string | yes | The name of the environment. |
| `deploy_access_levels` | array | yes | Array of access levels allowed to deploy, with each described by a hash. |
| `required_approval_count` | integer | no | The number of approvals required to deploy to this environment. This is part of Deployment Approvals, which isn't yet available for use. For details, see [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/343864). |
+| `approval_rules` | array | no | Array of access levels allowed to approve, with each described by a hash. See [Multiple approval rules](../ci/environments/deployment_approvals.md#multiple-approval-rules) for more information. |
-Elements in the `deploy_access_levels` array should be one of `user_id`, `group_id` or
+Elements in the `deploy_access_levels` and `approval_rules` array should be one of `user_id`, `group_id` or
`access_level`, and take the form `{user_id: integer}`, `{group_id: integer}` or
`{access_level: integer}`.
Each user must have access to the project and each group must [have this project shared](../user/project/members/share_project_with_groups.md).
@@ -129,7 +130,23 @@ Example response:
"group_id": 9899826
}
],
- "required_approval_count": 0
+ "required_approval_count": 0,
+ "approval_rules": [
+ {
+ "user_id": null,
+ "group_id": 134,
+ "access_level": null,
+ "access_level_description": "qa-group",
+ "required_approvals": 1
+ },
+ {
+ "user_id": null,
+ "group_id": 135,
+ "access_level": null,
+ "access_level_description": "security-group",
+ "required_approvals": 2
+ }
+ ]
}
```
diff --git a/doc/api/releases/index.md b/doc/api/releases/index.md
index c603be9489c..6023adb79d0 100644
--- a/doc/api/releases/index.md
+++ b/doc/api/releases/index.md
@@ -53,7 +53,7 @@ Example response:
[
{
"tag_name":"v0.2",
- "description":"## CHANGELOG\r\n\r\n- Escape label and milestone titles to prevent XSS in GFM autocomplete. !2740\r\n- Prevent private snippets from being embeddable.\r\n- Add subresources removal to member destroy service.",
+ "description":"## CHANGELOG\r\n\r\n- Escape label and milestone titles to prevent XSS in GLFM autocomplete. !2740\r\n- Prevent private snippets from being embeddable.\r\n- Add subresources removal to member destroy service.",
"name":"Awesome app v0.2 beta",
"created_at":"2019-01-03T01:56:19.539Z",
"released_at":"2019-01-03T01:56:19.539Z",
@@ -241,10 +241,10 @@ Get a Release for the given tag.
GET /projects/:id/releases/:tag_name
```
-| Attribute | Type | Required | Description |
-| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
-| `tag_name` | string | yes | The Git tag the release is associated with. |
+| Attribute | Type | Required | Description |
+|----------------------------| -------------- | -------- | ----------------------------------------------------------------------------------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
+| `tag_name` | string | yes | The Git tag the release is associated with. |
| `include_html_description` | boolean | no | If `true`, a response includes HTML rendered Markdown of the release description. |
Example request:
diff --git a/doc/api/releases/links.md b/doc/api/releases/links.md
index 282ef0adc78..66808900ab6 100644
--- a/doc/api/releases/links.md
+++ b/doc/api/releases/links.md
@@ -11,6 +11,16 @@ links. For manipulating other Release assets, see [Release API](index.md).
GitLab supports links to `http`, `https`, and `ftp` assets.
+## Authentication
+
+For authentication, the Release Links API accepts:
+
+- A [Personal Access Token](../../user/profile/personal_access_tokens.md) using the
+ `PRIVATE-TOKEN` header.
+- A [Project Access Token](../../user/project/settings/project_access_tokens.md) using the `PRIVATE-TOKEN` header.
+
+The [GitLab CI/CD job token](../../ci/jobs/ci_job_token.md) `$CI_JOB_TOKEN` is not supported. See [GitLab issue #50819](https://gitlab.com/gitlab-org/gitlab/-/issues/250819) for more details.
+
## Get links
Get assets as links from a Release.
diff --git a/doc/api/remote_mirrors.md b/doc/api/remote_mirrors.md
index 8b584285033..351706e8514 100644
--- a/doc/api/remote_mirrors.md
+++ b/doc/api/remote_mirrors.md
@@ -51,6 +51,43 @@ NOTE:
For security reasons, the `url` attribute is always scrubbed of username
and password information.
+## Get a single project's remote mirror
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82770) in GitLab 14.10.
+
+Returns a remote mirror and its statuses:
+
+```plaintext
+GET /projects/:id/remote_mirrors/:mirror_id
+```
+
+Example request:
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/42/remote_mirrors/101486"
+```
+
+Example response:
+
+```json
+{
+ "enabled": true,
+ "id": 101486,
+ "last_error": null,
+ "last_successful_update_at": "2020-01-06T17:32:02.823Z",
+ "last_update_at": "2020-01-06T17:32:02.823Z",
+ "last_update_started_at": "2020-01-06T17:31:55.864Z",
+ "only_protected_branches": true,
+ "keep_divergent_refs": true,
+ "update_status": "finished",
+ "url": "https://*****:*****@gitlab.com/gitlab-org/security/gitlab.git"
+}
+```
+
+NOTE:
+For security reasons, the `url` attribute is always scrubbed of username
+and password information.
+
## Create a pull mirror
Learn how to [configure a pull mirror](projects.md#configure-pull-mirroring-for-a-project) using the Projects API.
@@ -136,3 +173,23 @@ Example response:
"url": "https://*****:*****@gitlab.com/gitlab-org/security/gitlab.git"
}
```
+
+## Delete a remote mirror
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82778) in GitLab 14.10.
+
+Delete a remote mirror.
+
+```plaintext
+DELETE /projects/:id/remote_mirrors/:mirror_id
+```
+
+| Attribute | Type | Required | Description |
+| :---------- | :----- | :--------- |:------------------|
+| `mirror_id` | Integer | yes | Remote mirror ID. |
+
+Example request:
+
+```shell
+curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/42/remote_mirrors/101486"
+```
diff --git a/doc/api/repository_files.md b/doc/api/repository_files.md
index 23acebf5aab..1fdc48a6d92 100644
--- a/doc/api/repository_files.md
+++ b/doc/api/repository_files.md
@@ -23,6 +23,8 @@ in the following table.
## Get file from repository
+> The `execute_filemode` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83499) in GitLab 14.10.
+
Allows you to receive information about file in repository like name, size,
content. File content is Base64 encoded. This endpoint can be accessed
without authentication if the repository is publicly accessible.
@@ -54,7 +56,8 @@ Example response:
"ref": "master",
"blob_id": "79f7bbd25901e8334750839545a9bd021f0e4c83",
"commit_id": "d5a3ff139356ce33e37e73add446f16869741b50",
- "last_commit_id": "570e7b2abdd848b95f2f578043fc23bd6f6fd24d"
+ "last_commit_id": "570e7b2abdd848b95f2f578043fc23bd6f6fd24d",
+ "execute_filemode": false
}
```
@@ -85,6 +88,7 @@ X-Gitlab-File-Path: app/models/key.rb
X-Gitlab-Last-Commit-Id: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
X-Gitlab-Ref: master
X-Gitlab-Size: 1476
+X-Gitlab-Execute-Filemode: false
...
```
@@ -155,6 +159,7 @@ X-Gitlab-File-Path: path/to/file.rb
X-Gitlab-Last-Commit-Id: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
X-Gitlab-Ref: master
X-Gitlab-Size: 1476
+X-Gitlab-Execute-Filemode: false
...
```
@@ -179,6 +184,8 @@ Like [Get file from repository](repository_files.md#get-file-from-repository) yo
## Create new file in repository
+> The `execute_filemode` parameter was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83499) in GitLab 14.10.
+
This allows you to create a single file. For creating multiple files with a single request see the [commits API](commits.md#create-a-commit-with-multiple-files-and-actions).
```plaintext
@@ -196,6 +203,7 @@ POST /projects/:id/repository/files/:file_path
| `author_name` | string | no | The commit author's name. |
| `content` | string | yes | The file's content. |
| `commit_message` | string | yes | The commit message. |
+| `execute_filemode` | boolean | no | Enables or disables the `execute` flag on the file. Can be `true` or `false`. |
```shell
curl --request POST --header 'PRIVATE-TOKEN: <your_access_token>' \
@@ -216,6 +224,8 @@ Example response:
## Update existing file in repository
+> The `execute_filemode` parameter was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83499) in GitLab 14.10.
+
This allows you to update a single file. For updating multiple files with a single request see the [commits API](commits.md#create-a-commit-with-multiple-files-and-actions).
```plaintext
@@ -234,6 +244,7 @@ PUT /projects/:id/repository/files/:file_path
| `content` | string | yes | The file's content. |
| `commit_message` | string | yes | The commit message. |
| `last_commit_id` | string | no | Last known file commit ID. |
+| `execute_filemode` | boolean | no | Enables or disables the `execute` flag on the file. Can be `true` or `false`. |
```shell
curl --request PUT --header 'PRIVATE-TOKEN: <your_access_token>' \
diff --git a/doc/api/runners.md b/doc/api/runners.md
index 7437860239e..304f2494f70 100644
--- a/doc/api/runners.md
+++ b/doc/api/runners.md
@@ -48,7 +48,7 @@ GET /runners?tag_list=tag1,tag2
|------------|--------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of specific runners to show, one of: `active`, `paused`, `online` and `offline`; showing all runners if none provided |
| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
-| `status` | string | no | The status of runners to show, one of: `online` and `offline`. `active` and `paused` are also possible values which were deprecated in GitLab 14.8 and will be removed in GitLab 16.0 |
+| `status` | string | no | The status of runners to show, one of: `online`, `offline` and `not_connected`. `active` and `paused` are also possible values which were deprecated in GitLab 14.8 and will be removed in GitLab 16.0 |
| `paused` | boolean | no | Whether to include only runners that are accepting or ignoring new jobs |
| `tag_list` | string array | no | List of the runner's tags |
@@ -332,7 +332,7 @@ PUT --form "paused=true" /runners/:runner_id
# --or--
-# Deprecated: removal planned in 15.0
+# Deprecated: removal planned in 16.0
PUT --form "active=false" /runners/:runner_id
```
@@ -346,7 +346,7 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
# --or--
-# Deprecated: removal planned in 15.0
+# Deprecated: removal planned in 16.0
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
--form "active=false" "https://gitlab.example.com/api/v4/runners/6"
```
@@ -448,7 +448,7 @@ Example response:
## List project's runners
-List all runners available in the project, including from ancestor groups and [any allowed shared runners](../ci/runners/runners_scope.md#enable-shared-runners).
+List all runners available in the project, including from ancestor groups and [any allowed shared runners](../ci/runners/runners_scope.md#enable-shared-runners-for-a-project).
```plaintext
GET /projects/:id/runners
@@ -566,7 +566,7 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
## List group's runners
-List all runners available in the group as well as its ancestor groups, including [any allowed shared runners](../ci/runners/runners_scope.md#enable-shared-runners).
+List all runners available in the group as well as its ancestor groups, including [any allowed shared runners](../ci/runners/runners_scope.md#enable-shared-runners-for-a-group).
```plaintext
GET /groups/:id/runners
diff --git a/doc/api/secure_files.md b/doc/api/secure_files.md
index 96190920a33..7d30cc0c4c7 100644
--- a/doc/api/secure_files.md
+++ b/doc/api/secure_files.md
@@ -11,8 +11,7 @@ type: reference, api
FLAG:
On self-managed GitLab, by default this feature is not available. To make it available,
-ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `ci_secure_files`.
-The feature is not ready for production use.
+ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `ci_secure_files`. Limited to 100 secure files per project. Files must be smaller than 5 MB. The feature is not ready for production use.
## List project secure files
@@ -101,12 +100,12 @@ POST /projects/:project_id/secure_files
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------|----------------|------------------------|-------------|
-| `project_id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `name` | string | **{check-circle}** Yes | The `name` of the file being uploaded. |
-| `file` | file | **{check-circle}** Yes | The `file` being uploaded. |
-| `permissions` | string | **{dotted-circle}** No | The file is created with the specified permissions when created in the CI/CD job. Available types are: `read_only` (default), `read_write`, and `execute`. |
+| Attribute | Type | Required | Description |
+|-----------------|----------------|------------------------|-------------|
+| `project_id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `name` | string | **{check-circle}** Yes | The `name` of the file being uploaded. The file name must be unique within the project. |
+| `file` | file | **{check-circle}** Yes | The `file` being uploaded (5 MB limit). |
+| `permissions` | string | **{dotted-circle}** No | The file is created with the specified permissions when created in the CI/CD job. Available types are: `read_only` (default), `read_write`, and `execute`. |
Example request:
diff --git a/doc/api/settings.md b/doc/api/settings.md
index 16e281af916..cc9df7917e2 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -274,6 +274,7 @@ listed in the descriptions of the relevant settings.
| `default_projects_limit` | integer | no | Project limit per user. Default is `100000`. |
| `default_snippet_visibility` | string | no | What visibility level new snippets receive. Can take `private`, `internal` and `public` as a parameter. Default is `private`. |
| `delayed_project_deletion` **(PREMIUM SELF)** | boolean | no | Enable delayed project deletion by default in new groups. Default is `false`. |
+| `delete_inactive_projects` | boolean | no | Enable inactive project deletion feature. Default is `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. |
| `deletion_adjourned_period` **(PREMIUM SELF)** | integer | no | The number of days to wait before deleting a project or group that is marked for deletion. Value must be between 0 and 90.
| `diff_max_patch_bytes` | integer | no | Maximum [diff patch size](../user/admin_area/diff_limits.md), in bytes. |
| `diff_max_files` | integer | no | Maximum [files in a diff](../user/admin_area/diff_limits.md). |
@@ -342,7 +343,7 @@ listed in the descriptions of the relevant settings.
| `help_text` **(PREMIUM)** | string | no | GitLab server administrator information. |
| `hide_third_party_offers` | boolean | no | Do not display offers from third parties in GitLab. |
| `home_page_url` | string | no | Redirect to this URL when not logged in. |
-| `housekeeping_bitmaps_enabled` | boolean | required by: `housekeeping_enabled` | Enable Git pack file bitmap creation. |
+| `housekeeping_bitmaps_enabled` | boolean | no | Git pack file bitmap creation is always enabled and cannot be changed via API and UI. This API field is deprecated and always returns `true`. |
| `housekeeping_enabled` | boolean | no | (**If enabled, requires:** `housekeeping_bitmaps_enabled`, `housekeeping_full_repack_period`, `housekeeping_gc_period`, and `housekeeping_incremental_repack_period`) Enable or disable Git housekeeping. |
| `housekeeping_full_repack_period` | integer | required by: `housekeeping_enabled` | Number of Git pushes after which an incremental `git repack` is run. |
| `housekeeping_gc_period` | integer | required by: `housekeeping_enabled` | Number of Git pushes after which `git gc` is run. |
@@ -350,6 +351,9 @@ listed in the descriptions of the relevant settings.
| `html_emails_enabled` | boolean | no | Enable HTML emails. |
| `import_sources` | array of strings | no | Sources to allow project import from, possible values: `github`, `bitbucket`, `bitbucket_server`, `gitlab`, `fogbugz`, `git`, `gitlab_project`, `gitea`, `manifest`, and `phabricator`. |
| `in_product_marketing_emails_enabled` | boolean | no | Enable [in-product marketing emails](../user/profile/notifications.md#global-notification-settings). Enabled by default. |
+| `inactive_projects_delete_after_months` | integer | no | If `delete_inactive_projects` is `true`, the time (in months) to wait before deleting inactive projects. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. |
+| `inactive_projects_min_size_mb` | integer | no | If `delete_inactive_projects` is `true`, the minimum repository size for projects to be checked for inactivity. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. |
+| `inactive_projects_send_warning_email_after_months` | integer | no | If `delete_inactive_projects` is `true`, sets the time (in months) to wait before emailing maintainers that the project will be deleted because it is inactive. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. |
| `invisible_captcha_enabled` | boolean | no | Enable Invisible CAPTCHA spam detection during sign-up. Disabled by default. |
| `issues_create_limit` | integer | no | Max number of issue creation requests per minute per user. Disabled by default.|
| `keep_latest_artifact` | boolean | no | Prevent the deletion of the artifacts from the most recent successful jobs, regardless of the expiry time. Enabled by default. |
@@ -437,6 +441,9 @@ listed in the descriptions of the relevant settings.
| `throttle_authenticated_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_authenticated_api_period_in_seconds` and `throttle_authenticated_api_requests_per_period`) Enable authenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). |
| `throttle_authenticated_api_period_in_seconds` | integer | required by:<br>`throttle_authenticated_api_enabled` | Rate limit period (in seconds). |
| `throttle_authenticated_api_requests_per_period` | integer | required by:<br>`throttle_authenticated_api_enabled` | Maximum requests per period per user. |
+| `throttle_authenticated_packages_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_authenticated_packages_api_period_in_seconds` and `throttle_authenticated_packages_api_requests_per_period`) Enable authenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_authenticated_packages_api_period_in_seconds` | integer | required by:<br>`throttle_authenticated_packages_api_enabled` | Rate limit period (in seconds). View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_authenticated_packages_api_requests_per_period` | integer | required by:<br>`throttle_authenticated_packages_api_enabled` | Maximum requests per period per user. View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
| `throttle_authenticated_web_enabled` | boolean | no | (**If enabled, requires:** `throttle_authenticated_web_period_in_seconds` and `throttle_authenticated_web_requests_per_period`) Enable authenticated web request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). |
| `throttle_authenticated_web_period_in_seconds` | integer | required by:<br>`throttle_authenticated_web_enabled` | Rate limit period (in seconds). |
| `throttle_authenticated_web_requests_per_period` | integer | required by:<br>`throttle_authenticated_web_enabled` | Maximum requests per period per user. |
@@ -446,6 +453,9 @@ listed in the descriptions of the relevant settings.
| `throttle_unauthenticated_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_unauthenticated_api_period_in_seconds` and `throttle_unauthenticated_api_requests_per_period`) Enable unauthenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). |
| `throttle_unauthenticated_api_period_in_seconds` | integer | required by:<br>`throttle_unauthenticated_api_enabled` | Rate limit period in seconds. |
| `throttle_unauthenticated_api_requests_per_period` | integer | required by:<br>`throttle_unauthenticated_api_enabled` | Max requests per period per IP. |
+| `throttle_unauthenticated_packages_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_unauthenticated_packages_api_period_in_seconds` and `throttle_unauthenticated_packages_api_requests_per_period`) Enable authenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_unauthenticated_packages_api_period_in_seconds` | integer | required by:<br>`throttle_unauthenticated_packages_api_enabled` | Rate limit period (in seconds). View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_unauthenticated_packages_api_requests_per_period` | integer | required by:<br>`throttle_unauthenticated_packages_api_enabled` | Maximum requests per period per user. View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
| `throttle_unauthenticated_web_enabled` | boolean | no | (**If enabled, requires:** `throttle_unauthenticated_web_period_in_seconds` and `throttle_unauthenticated_web_requests_per_period`) Enable unauthenticated web request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). |
| `throttle_unauthenticated_web_period_in_seconds` | integer | required by:<br>`throttle_unauthenticated_web_enabled` | Rate limit period in seconds. |
| `throttle_unauthenticated_web_requests_per_period` | integer | required by:<br>`throttle_unauthenticated_web_enabled` | Max requests per period per IP. |
diff --git a/doc/api/system_hooks.md b/doc/api/system_hooks.md
index f14f1322184..a883c3c1613 100644
--- a/doc/api/system_hooks.md
+++ b/doc/api/system_hooks.md
@@ -13,7 +13,7 @@ You can configure the URL endpoint of the system hooks from the GitLab user inte
1. On the top bar, select **Menu > Admin**.
1. Select **System Hooks** (`/admin/hooks`).
-Read more about [system hooks](../system_hooks/system_hooks.md).
+Read more about [system hooks](../administration/system_hooks.md).
## List system hooks
diff --git a/doc/api/templates/gitlab_ci_ymls.md b/doc/api/templates/gitlab_ci_ymls.md
index abed008218c..8a55ee84402 100644
--- a/doc/api/templates/gitlab_ci_ymls.md
+++ b/doc/api/templates/gitlab_ci_ymls.md
@@ -135,7 +135,7 @@ Example response:
```json
{
"name": "Ruby",
- "content": "# This file is a template, and might need editing before it works on your project.\n# Official language image. Look for the different tagged releases at:\n# https://hub.docker.com/r/library/ruby/tags/\nimage: \"ruby:2.5\"\n\n# Pick zero or more services to be used on all builds.\n# Only needed when using a docker container to run your tests in.\n# Check out: http://docs.gitlab.com/ee/ci/services/index.html\n - mysql:latest\n - redis:latest\n - postgres:latest\n\nvariables:\n POSTGRES_DB: database_name\n\n# Cache gems in between builds\ncache:\n paths:\n - vendor/ruby\n\n# This is a basic example for a gem or script which doesn't use\n# services such as redis or postgres\nbefore_script:\n - ruby -v # Print out ruby version for debugging\n # Uncomment next line if your rails app needs a JS runtime:\n # - apt-get update -q && apt-get install nodejs -yqq\n - bundle install -j $(nproc) --path vendor # Install dependencies into ./vendor/ruby\n\n# Optional - Delete if not using `rubocop`\nrubocop:\n script:\n - rubocop\n\nrspec:\n script:\n - rspec spec\n\nrails:\n variables:\n DATABASE_URL: \"postgresql://postgres:postgres@postgres:5432/$POSTGRES_DB\"\n script:\n - rails db:migrate\n - rails db:seed\n - rails test\n\n# This deploy job uses a simple deploy flow to Heroku, other providers, e.g. AWS Elastic Beanstalk\n# are supported too: https://github.com/travis-ci/dpl\ndeploy:\n type: deploy\n environment: production\n script:\n - gem install dpl\n - dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_PRODUCTION_KEY\n"
+ "content": "# This file is a template, and might need editing before it works on your project.\n# To contribute improvements to CI/CD templates, please follow the Development guide at:\n# https://docs.gitlab.com/ee/development/cicd/templates.html\n# This specific template is located at:\n# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml\n\n# Official language image. Look for the different tagged releases at:\n# https://hub.docker.com/r/library/ruby/tags/\nimage: ruby:latest\n\n# Pick zero or more services to be used on all builds.\n# Only needed when using a docker container to run your tests in.\n# Check out: http://docs.gitlab.com/ee/ci/docker/using_docker_images.html#what-is-a-service\nservices:\n - mysql:latest\n - redis:latest\n - postgres:latest\n\nvariables:\n POSTGRES_DB: database_name\n\n# Cache gems in between builds\ncache:\n paths:\n - vendor/ruby\n\n# This is a basic example for a gem or script which doesn't use\n# services such as redis or postgres\nbefore_script:\n - ruby -v # Print out ruby version for debugging\n # Uncomment next line if your rails app needs a JS runtime:\n # - apt-get update -q && apt-get install nodejs -yqq\n - bundle config set path 'vendor' # Install dependencies into ./vendor/ruby\n - bundle install -j $(nproc)\n\n# Optional - Delete if not using `rubocop`\nrubocop:\n script:\n - rubocop\n\nrspec:\n script:\n - rspec spec\n\nrails:\n variables:\n DATABASE_URL: \"postgresql://postgres:postgres@postgres:5432/$POSTGRES_DB\"\n script:\n - rails db:migrate\n - rails db:seed\n - rails test\n\n# This deploy job uses a simple deploy flow to Heroku, other providers, e.g. AWS Elastic Beanstalk\n# are supported too: https://github.com/travis-ci/dpl\ndeploy:\n stage: deploy\n environment: production\n script:\n - gem install dpl\n - dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_PRODUCTION_KEY\n"
}
```
diff --git a/doc/api/users.md b/doc/api/users.md
index de9af59de93..7b4962735e6 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -97,8 +97,18 @@ In addition, to exclude external users from the users' list, you can use the par
GET /users?exclude_external=true
```
+To exclude [bot users for projects](../user/project/settings/project_access_tokens.md#bot-users-for-projects)
+and [bot users for groups](../user/group/settings/group_access_tokens.md#bot-users-for-groups), you can use the
+parameter `without_project_bots=true`.
+
+```plaintext
+GET /users?without_project_bots=true
+```
+
### For admins
+> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
+
```plaintext
GET /users
```
@@ -151,7 +161,8 @@ GET /users
"external": false,
"private_profile": false,
"current_sign_in_ip": "196.165.1.102",
- "last_sign_in_ip": "172.127.2.22"
+ "last_sign_in_ip": "172.127.2.22",
+ "namespace_id": 1
},
{
"id": 2,
@@ -185,7 +196,8 @@ GET /users
"external": false,
"private_profile": false,
"current_sign_in_ip": "10.165.1.102",
- "last_sign_in_ip": "172.127.2.22"
+ "last_sign_in_ip": "172.127.2.22",
+ "namespace_id": 2
}
]
```
@@ -293,13 +305,18 @@ Parameters:
"website_url": "",
"organization": "",
"job_title": "Operations Specialist",
+ "pronouns": "he/him",
+ "work_information": null,
"followers": 1,
- "following": 1
+ "following": 1,
+ "local_time": "3:38 PM"
}
```
### For admin
+> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
+
```plaintext
GET /users/:id
```
@@ -332,6 +349,11 @@ Example Responses:
"website_url": "",
"organization": "",
"job_title": "Operations Specialist",
+ "pronouns": "he/him",
+ "work_information": null,
+ "followers": 1,
+ "following": 1,
+ "local_time": "3:38 PM",
"last_sign_in_at": "2012-06-01T11:41:01Z",
"confirmed_at": "2012-05-23T09:05:22Z",
"theme_id": 1,
@@ -355,7 +377,8 @@ Example Responses:
"last_sign_in_ip": "172.127.2.22",
"plan": "gold",
"trial": true,
- "sign_in_count": 1337
+ "sign_in_count": 1337,
+ "namespace_id": 1
}
```
@@ -404,6 +427,8 @@ GET /users/:id?with_custom_attributes=true
## User creation
+> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
+
Creates a new user. Note only administrators can create new
users. Either `password`, `reset_password`, or `force_random_password`
must be specified. If `reset_password` and `force_random_password` are
@@ -459,6 +484,8 @@ Parameters:
## User modification
+> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
+
Modifies an existing user. Only administrators can change attributes of a user.
```plaintext
@@ -561,6 +588,13 @@ GET /user
"twitter": "",
"website_url": "",
"organization": "",
+ "job_title": "",
+ "pronouns": "he/him",
+ "bot": false,
+ "work_information": null,
+ "followers": 0,
+ "following": 0,
+ "local_time": "3:38 PM",
"last_sign_in_at": "2012-06-01T11:41:01Z",
"confirmed_at": "2012-05-23T09:05:22Z",
"theme_id": 1,
@@ -577,12 +611,17 @@ GET /user
"can_create_project": true,
"two_factor_enabled": true,
"external": false,
- "private_profile": false
+ "private_profile": false,
+ "commit_email": "admin@example.com",
}
```
+Users on [GitLab Premium or higher](https://about.gitlab.com/pricing/) also see the `shared_runners_minutes_limit`, `extra_shared_runners_minutes_limit` parameters.
+
## List current user (for admins)
+> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
+
```plaintext
GET /user
```
@@ -632,7 +671,9 @@ Parameters:
"private_profile": false,
"commit_email": "john-codes@example.com",
"current_sign_in_ip": "196.165.1.102",
- "last_sign_in_ip": "172.127.2.22"
+ "last_sign_in_ip": "172.127.2.22",
+ "namespace_id": 1,
+ "note": null
}
```
@@ -1566,7 +1607,7 @@ Returns:
- `404 User Not Found` if the user cannot be found.
- `403 Forbidden` when trying to unban a user that is not banned.
-### Get user contribution events
+## Get user contribution events
Please refer to the [Events API documentation](events.md#get-user-contribution-events)
@@ -1828,7 +1869,7 @@ POST /users/:user_id/personal_access_tokens
| `user_id` | integer | yes | The ID of the user |
| `name` | string | yes | The name of the personal access token |
| `expires_at` | date | no | The expiration date of the personal access token in ISO format (`YYYY-MM-DD`) |
-| `scopes` | array | yes | The array of scopes of the personal access token (`api`, `read_user`, `read_api`, `read_repository`, `write_repository`) |
+| `scopes` | array | yes | The array of scopes of the personal access token. See [personal access token scopes](../user/profile/personal_access_tokens.md#personal-access-token-scopes) for possible values. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --data "name=mytoken" --data "expires_at=2017-04-04" \
diff --git a/doc/architecture/blueprints/container_registry_metadata_database/index.md b/doc/architecture/blueprints/container_registry_metadata_database/index.md
index ba0bee04f35..963977be549 100644
--- a/doc/architecture/blueprints/container_registry_metadata_database/index.md
+++ b/doc/architecture/blueprints/container_registry_metadata_database/index.md
@@ -150,7 +150,7 @@ Following the GitLab [Go standards and style guidelines](../../../development/go
The design and development of the registry database adhere to the GitLab [database guidelines](../../../development/database/). Being a Go application, the required tooling to support the database will have to be developed, such as for running database migrations.
-Running *online* and [*post deployment*](../../../development/post_deployment_migrations.md) migrations is already supported by the registry CLI, as described in the [documentation](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/database-migrations.md).
+Running *online* and [*post deployment*](../../../development/database/post_deployment_migrations.md) migrations is already supported by the registry CLI, as described in the [documentation](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/database-migrations.md).
#### Partitioning
diff --git a/doc/ci/docker/using_kaniko.md b/doc/ci/docker/using_kaniko.md
index 098ec9bdd02..c2b18dc6467 100644
--- a/doc/ci/docker/using_kaniko.md
+++ b/doc/ci/docker/using_kaniko.md
@@ -74,6 +74,13 @@ build:
- if: $CI_COMMIT_TAG
```
+If you authenticate against the [Dependency Proxy](../../user/packages/dependency_proxy/index.md#authenticate-within-cicd),
+you must add the corresponding CI/CD variables for authentication to the `config.json` file:
+
+```yaml
+- echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
+```
+
### Building an image with kaniko behind a proxy
If you use a custom GitLab Runner behind an http(s) proxy, kaniko needs to be set
diff --git a/doc/ci/environments/deployment_approvals.md b/doc/ci/environments/deployment_approvals.md
index 45af78aa036..2a5927a96c2 100644
--- a/doc/ci/environments/deployment_approvals.md
+++ b/doc/ci/environments/deployment_approvals.md
@@ -15,7 +15,7 @@ This feature is in a [Beta](../../policy/alpha-beta-support.md#beta-features) st
It may be useful to require additional approvals before deploying to certain protected environments (for example, production). This pre-deployment approval requirement is useful to accommodate testing, security, or compliance processes that must happen before each deployment.
-When a protected environment requires one or more approvals, all deployments to that environment become blocked and wait for the required approvals before running.
+When a protected environment requires one or more approvals, all deployments to that environment become blocked and wait for the required approvals from the `Allowed to Deploy` list before running.
NOTE:
See the [epic](https://gitlab.com/groups/gitlab-org/-/epics/6832) for planned features.
@@ -52,6 +52,19 @@ Example:
### Require approvals for a protected environment
+There are two ways to configure the approval requirements:
+
+- [Unified approval setting](#unified-approval-setting) ... You can define who can execute **and** approve deployments.
+ This is useful when there is no separation of duties between executors and approvers in your organization.
+- [Multiple approval rules](#multiple-approval-rules) ... You can define who can execute **or** approve deployments.
+ This is useful when there is a separation of duties between executors and approvers in your organization.
+
+NOTE:
+Multiple approval rules is a more flexible option than the unified approval setting, thus both configurations shouldn't
+co-exist and multiple approval rules takes the precedence over the unified approval setting if it happens.
+
+#### Unified approval setting
+
NOTE:
At this time, it is not possible to require approvals for an existing protected environment. The workaround is to unprotect the environment and configure approvals when re-protecting the environment.
@@ -77,6 +90,35 @@ NOTE:
To protect, update, or unprotect an environment, you must have at least the
Maintainer role.
+#### Multiple approval rules
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345678) in GitLab 14.10 with a flag named `deployment_approval_rules`. Disabled by default.
+
+1. Using the [REST API](../../api/group_protected_environments.md#protect-an-environment).
+ 1. `deploy_access_levels` represents which entity can execute the deployment job.
+ 1. `approval_rules` represents which entity can approve the deployment job.
+
+After this is configured, all jobs deploying to this environment automatically go into a blocked state and wait for approvals before running. Ensure that the number of required approvals is less than the number of users allowed to deploy.
+
+Example:
+
+```shell
+curl --header 'Content-Type: application/json' --request POST \
+ --data '{"name": "production", "deploy_access_levels": [{"group_id": 138}], "approval_rules": [{"group_id": 134}, {"group_id": 135, "required_approvals": 2}]}' \
+ --header "PRIVATE-TOKEN: <your_access_token>" \
+ "https://gitlab.example.com/api/v4/groups/128/protected_environments"
+```
+
+With this setup:
+
+- The operator group (`group_id: 138`) has permission to execute the deployment jobs to the `production` environment in the organization (`group_id: 128`).
+- The QA tester group (`group_id: 134`) and security group (`group_id: 135`) have permission to approve the deployment jobs to the `production` environment in the organization (`group_id: 128`).
+- Unless two approvals from security group and one approval from QA tester group have been collected, the operator group can't execute the deployment jobs.
+
+NOTE:
+To protect, update, or unprotect an environment, you must have at least the
+Maintainer role.
+
## Approve or reject a deployment
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/342180/) in GitLab 14.9
@@ -99,6 +141,10 @@ To approve or reject a deployment to a protected environment using the UI:
1. In the deployment's row, select **Approval options** (**{thumb-up}**).
1. Select **Approve** or **Reject**.
+NOTE:
+This feature might not work as expected when [Multiple approval rules](#multiple-approval-rules) is configured.
+See the [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/355708) for planned improvement.
+
### Approve or reject a deployment using the API
Prerequisites:
@@ -127,11 +173,14 @@ curl --data "status=approved&comment=Looks good to me" \
### Using the API
-Use the [Deployments API](../../api/deployments.md) to see deployments.
+Use the [Deployments API](../../api/deployments.md#get-a-specific-deployment) to see deployments.
- The `status` field indicates if a deployment is blocked.
-- The `pending_approval_count` field indicates how many approvals are remaining to run a deployment.
-- The `approvals` field contains the deployment's approvals.
+- When the [unified approval setting](#unified-approval-setting) is configured:
+ - The `pending_approval_count` field indicates how many approvals are remaining to run a deployment.
+ - The `approvals` field contains the deployment's approvals.
+- When the [multiple approval rules](#multiple-approval-rules) is configured:
+ - The `approval_summary` field contains the current approval status per rule.
## Related features
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index c2612b6ff16..3822b32181f 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -558,6 +558,55 @@ Because `stop_review_app` is set to `auto_stop_in: 1 week`,
if a merge request is inactive for more than a week,
GitLab automatically triggers the `stop_review_app` job to stop the environment.
+#### Multiple stop actions for an environment
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22456) in GitLab 14.10 [with a flag](../../administration/feature_flags.md) named `environment_multiple_stop_actions`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `environment_multiple_stop_actions`.
+On GitLab.com, this feature is not available. We are enabling in phases and the status can be tracked in [issue 358911](https://gitlab.com/gitlab-org/gitlab/-/issues/358911).
+
+This feature is useful when you need to perform multiple **parallel** stop actions on an environment.
+
+To configure multiple stop actions on an environment, specify the [`on_stop`](../yaml/index.md#environmenton_stop)
+keyword across multiple [deployment jobs](../jobs/index.md#deployment-jobs) for the same `environment`, as defined in the `.gitlab-ci.yml` file.
+
+When an environment is stopped, the matching `on_stop` actions from *successful deployment jobs* alone are run in parallel in no particular order.
+
+In the following example, for the `test` environment there are two deployment jobs `deploy-to-cloud-a`
+and `deploy-to-cloud-b`.
+
+```yaml
+deploy-to-cloud-a:
+ script: echo "Deploy to cloud a"
+ environment:
+ name: test
+ on_stop: teardown-cloud-a
+
+deploy-to-cloud-b:
+ script: echo "Deploy to cloud b"
+ environment:
+ name: test
+ on_stop: teardown-cloud-b
+
+teardown-cloud-a:
+ script: echo "Delete the resources in cloud a"
+ environment:
+ name: test
+ action: stop
+ when: manual
+
+teardown-cloud-b:
+ script: echo "Delete the resources in cloud b"
+ environment:
+ name: test
+ action: stop
+ when: manual
+```
+
+When the environment is stopped, the system runs `on_stop` actions
+`teardown-cloud-a` and `teardown-cloud-b` in parallel.
+
#### View a deployment's scheduled stop time
You can view a deployment's expiration date in the GitLab UI.
diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
index 5fca3513ff7..389429f3f0f 100644
--- a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
+++ b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
@@ -277,3 +277,19 @@ read_secrets:
```
![read_secrets production](img/vault-read-secrets-production.png)
+
+### Limit token access to Vault secrets
+
+You can control `CI_JOB_JWT` access to Vault secrets by using Vault protections
+and GitLab features. For example, restrict the token by:
+
+- Using Vault [bound_claims](https://www.vaultproject.io/docs/auth/jwt#bound-claims)
+ for specific groups using `group_claim`.
+- Hard coding values for Vault bound claims based on the `user_login` and `user_email`
+ of specific users.
+- Setting Vault time limits for TTL of the token as specified in [`token_explicit_max_ttl`](https://www.vaultproject.io/api/auth/jwt#token_explicit_max_ttl),
+ where the token expires after authentication.
+- Scoping the JWT to [GitLab projected branches](../../../user/project/protected_branches.md)
+ that are restricted to a subset of project users.
+- Scoping the JWT to [GitLab projected tags](../../../user/project/protected_tags.md),
+ that are restricted to a subset of project users.
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 6dbec0dfc8b..0735029f0be 100644
--- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
+++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
@@ -104,7 +104,7 @@ sudo apt install acl
### Add SSH key
-Let's suppose we want to deploy our app to the production server from a private repository on GitLab. First, we need to [generate a new SSH key pair **with no passphrase**](../../../ssh/index.md) for the deployer user.
+Let's suppose we want to deploy our app to the production server from a private repository on GitLab. First, we need to [generate a new SSH key pair **with no passphrase**](../../../user/ssh.md) for the deployer user.
After that, we need to copy the private key, which will be used to connect to our server as the deployer user with SSH, to be able to automate our deployment process:
diff --git a/doc/ci/index.md b/doc/ci/index.md
index d0c2e1986b2..05e97613384 100644
--- a/doc/ci/index.md
+++ b/doc/ci/index.md
@@ -38,79 +38,76 @@ read the [Introduction to CI/CD with GitLab](introduction/index.md).
<iframe src="https://www.youtube.com/embed/ljth1Q5oJoo" frameborder="0" allowfullscreen="true"> </iframe>
</figure>
-## GitLab CI/CD concepts
+## Concepts
GitLab CI/CD uses a number of concepts to describe and run your build and deploy.
-| Concept | Description |
-|:--------------------------------------------------------|:-------------------------------------------------------------------------------|
-| [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. |
+| Concept | Description |
+|:--------------------------------------------------------|:--------------------------------------------------------------------------------------|
+| [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 (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. |
-| [Pipeline efficiency](pipelines/pipeline_efficiency.md) | Configure your pipelines to run quickly and efficiently. |
-| [Test cases](test_cases/index.md) | Create testing scenarios. |
+| [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. |
+| [Pipeline efficiency](pipelines/pipeline_efficiency.md) | Configure your pipelines to run quickly and efficiently. |
+| [Test cases](test_cases/index.md) | Create testing scenarios. |
-## GitLab CI/CD configuration
+## Configuration
GitLab CI/CD supports numerous configuration options:
-| Configuration | Description |
-|:----------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------|
-| [Schedule pipelines](pipelines/schedules.md) | Schedule pipelines to run as often as you need. |
-| [Custom path for `.gitlab-ci.yml`](pipelines/settings.md#specify-a-custom-cicd-configuration-file) | Define a custom path for the CI/CD configuration file. |
-| [Git submodules for CI/CD](git_submodules.md) | Configure jobs for using Git submodules. |
-| [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. |
-| [Merge request pipelines](pipelines/merge_request_pipelines.md) | Design a pipeline structure for running a pipeline in merge requests. |
-| [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. |
+| Configuration | Description |
+|:---------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------|
+| [Schedule pipelines](pipelines/schedules.md) | Schedule pipelines to run as often as you need. |
+| [Custom path for `.gitlab-ci.yml`](pipelines/settings.md#specify-a-custom-cicd-configuration-file) | Define a custom path for the CI/CD configuration file. |
+| [Git submodules for CI/CD](git_submodules.md) | Configure jobs for using Git submodules. |
+| [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. |
+| [Merge request pipelines](pipelines/merge_request_pipelines.md) | Design a pipeline structure for running a pipeline in merge requests. |
+| [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. |
Certain operations can only be performed according to the
[user](../user/permissions.md#gitlab-cicd-permissions) and [job](../user/permissions.md#job-permissions) permissions.
-## GitLab CI/CD features
+## Features
GitLab CI/CD features, grouped by DevOps stage, include:
-| Feature | Description |
-|:------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------|
-| **Configure** | |
-| [Auto DevOps](../topics/autodevops/index.md) | Set up your app's entire lifecycle. |
-| [ChatOps](chatops/index.md) | Trigger CI jobs from chat, with results sent back to the channel. |
-| [Connect to cloud services](cloud_services/index.md) | Connect to cloud providers using OpenID Connect (OIDC) to retrieve temporary credentials to access services or secrets. |
-|-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------|
-| **Verify** | |
-| [Browser Performance Testing](../user/project/merge_requests/browser_performance_testing.md) | Quickly determine the browser performance impact of pending code changes. |
-| [Load Performance Testing](../user/project/merge_requests/load_performance_testing.md) | Quickly determine the server performance impact of pending code changes. |
-| [CI services](services/index.md) | Link Docker containers with your base image. |
-| [GitLab CI/CD for external repositories](ci_cd_for_external_repos/index.md) **(PREMIUM)** | Get the benefits of GitLab CI/CD combined with repositories in GitHub and Bitbucket Cloud. |
-| [Interactive Web Terminals](interactive_web_terminal/index.md) **(FREE SELF)** | Open an interactive web terminal to debug the running jobs. |
-| [Review Apps](review_apps/index.md) | Configure GitLab CI/CD to preview code changes. |
-| [Unit test reports](unit_test_reports.md) | Identify test failures directly on merge requests. |
-| [Using Docker images](docker/using_docker_images.md) | Use GitLab and GitLab Runner with Docker to build and test applications. |
-|-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------|
-| **Release** | |
-| [Auto Deploy](../topics/autodevops/stages.md#auto-deploy) | Deploy your application to a production environment in a Kubernetes cluster. |
-| [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) | 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. |
-| [Cloud deployment](cloud_deployment/index.md) | Deploy your application to a main cloud provider. |
-|-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------|
-| **Secure** | |
-| [Code Quality](../user/project/merge_requests/code_quality.md) | Analyze your source code quality. |
-| [Container Scanning](../user/application_security/container_scanning/index.md) **(ULTIMATE)** | Check your Docker containers for known vulnerabilities. |
-| [Dependency Scanning](../user/application_security/dependency_scanning/index.md) **(ULTIMATE)** | Analyze your dependencies for known vulnerabilities. |
-| [License Compliance](../user/compliance/license_compliance/index.md) **(ULTIMATE)** | Search your project dependencies for their licenses. |
-| [Security Test reports](../user/application_security/index.md) **(ULTIMATE)** | Check for app vulnerabilities. |
-
-## GitLab CI/CD examples
+| Feature | Description |
+|:---------------------------------------------------------------------------------------------|:------------|
+| **Configure** | |
+| [Auto DevOps](../topics/autodevops/index.md) | Set up your app's entire lifecycle. |
+| [ChatOps](chatops/index.md) | Trigger CI jobs from chat, with results sent back to the channel. |
+| [Connect to cloud services](cloud_services/index.md) | Connect to cloud providers using OpenID Connect (OIDC) to retrieve temporary credentials to access services or secrets. |
+| **Verify** | |
+| [Browser Performance Testing](../user/project/merge_requests/browser_performance_testing.md) | Quickly determine the browser performance impact of pending code changes. |
+| [Load Performance Testing](../user/project/merge_requests/load_performance_testing.md) | Quickly determine the server performance impact of pending code changes. |
+| [CI services](services/index.md) | Link Docker containers with your base image. |
+| [GitLab CI/CD for external repositories](ci_cd_for_external_repos/index.md) | Get the benefits of GitLab CI/CD combined with repositories in GitHub and Bitbucket Cloud. |
+| [Interactive Web Terminals](interactive_web_terminal/index.md) | Open an interactive web terminal to debug the running jobs. |
+| [Review Apps](review_apps/index.md) | Configure GitLab CI/CD to preview code changes. |
+| [Unit test reports](unit_test_reports.md) | Identify test failures directly on merge requests. |
+| [Using Docker images](docker/using_docker_images.md) | Use GitLab and GitLab Runner with Docker to build and test applications. |
+| **Release** | |
+| [Auto Deploy](../topics/autodevops/stages.md#auto-deploy) | Deploy your application to a production environment in a Kubernetes cluster. |
+| [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) | 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. |
+| [Cloud deployment](cloud_deployment/index.md) | Deploy your application to a main cloud provider. |
+| **Secure** | |
+| [Code Quality](../user/project/merge_requests/code_quality.md) | Analyze your source code quality. |
+| [Container Scanning](../user/application_security/container_scanning/index.md) | Check your Docker containers for known vulnerabilities. |
+| [Dependency Scanning](../user/application_security/dependency_scanning/index.md) | Analyze your dependencies for known vulnerabilities. |
+| [License Compliance](../user/compliance/license_compliance/index.md) | Search your project dependencies for their licenses. |
+| [Security Test reports](../user/application_security/index.md) | Check for app vulnerabilities. |
+
+## Examples
See the [CI/CD examples](examples/index.md) page for example project code and tutorials for
using GitLab CI/CD with various:
@@ -119,7 +116,7 @@ using GitLab CI/CD with various:
- Languages
- Platforms
-## GitLab CI/CD Administration
+## Administration
You can change the default behavior of GitLab CI/CD for:
@@ -136,7 +133,7 @@ Learn more about GitLab CI/CD:
- [Why you might choose GitLab CI/CD](https://about.gitlab.com/blog/2016/10/17/gitlab-ci-oohlala/).
- [Reasons you might migrate from another platform](https://about.gitlab.com/blog/2016/07/22/building-our-web-app-on-gitlab-ci/).
-- [5 Teams that made the switch to GitLab CI/CD](https://about.gitlab.com/blog/2019/04/25/5-teams-that-made-the-switch-to-gitlab-ci-cd/)
+- [Five teams that made the switch to GitLab CI/CD](https://about.gitlab.com/blog/2019/04/25/5-teams-that-made-the-switch-to-gitlab-ci-cd/).
- If you use VS Code to edit your GitLab CI/CD configuration, the
[GitLab Workflow VS Code extension](../user/project/repository/vscode.md) helps you
[validate your configuration](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#validate-gitlab-ci-configuration)
diff --git a/doc/ci/jobs/ci_job_token.md b/doc/ci/jobs/ci_job_token.md
index b0002f559ba..8e5c8c8ab45 100644
--- a/doc/ci/jobs/ci_job_token.md
+++ b/doc/ci/jobs/ci_job_token.md
@@ -83,8 +83,7 @@ to be accessed by authenticating with the current project's job token. By defaul
the token scope only allows access to the same project where the token comes from.
Other projects can be added and removed by maintainers with access to both projects.
-This setting is enabled by default for all new projects, and disabled by default in projects
-created before GitLab 14.1. It is strongly recommended that project maintainers enable this
+This setting is disabled by default for all new projects. It is recommended that project maintainers enable this
setting at all times, and configure the allowlist for cross-project access if needed.
For example, when the setting is enabled, jobs in a pipeline in project `A` have
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index 4fa251eb3cf..b8129e1cf18 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -43,6 +43,18 @@ Clicking an individual job shows you its job log, and allows you to:
- Retry the job.
- Erase the job log.
+### View all jobs in a project
+
+> - An improved view was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/293862) in GitLab 14.10, [with a flag](../../administration/feature_flags.md) named `jobs_table_vue`. Disabled by default.
+> - The job status filter was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82539) in GitLab 14.10, [with a flag](../../administration/feature_flags.md) named `jobs_table_vue_search`. Disabled by default.
+
+To view the full list of jobs that ran in a project:
+
+1. On the top bar, select **Menu > Projects** and find the project.
+1. On the left sidebar, select **CI/CD > Jobs**.
+
+You can filter the list by [job status](#the-order-of-jobs-in-a-pipeline).
+
## See why a job failed
When a pipeline fails or is allowed to fail, there are several places where you
@@ -63,9 +75,9 @@ You can also see the reason it failed on the Job detail page.
The order of jobs in a pipeline depends on the type of pipeline graph.
- For [full pipeline graphs](../pipelines/index.md#view-full-pipeline-graph), jobs are sorted by name.
-- For [pipeline mini graphs](../pipelines/index.md#pipeline-mini-graphs), jobs are sorted by severity and then by name.
+- For [pipeline mini graphs](../pipelines/index.md#pipeline-mini-graphs), jobs are sorted by status, and then by name.
-The order of severity is:
+The job status order is:
- failed
- warning
@@ -84,6 +96,9 @@ For example:
## Job name limitations
+> - [Enabled 255-character job length on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/342800) in GitLab 14.5.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/344665) in GitLab 14.10. [Feature flag `ci_validate_job_length`](https://gitlab.com/gitlab-org/gitlab/-/issues/344665) removed.
+
You can't use these keywords as job names:
- `image`
@@ -99,9 +114,7 @@ You can't use these keywords as job names:
- `false`
- `nil`
-Job names must be 255 characters or less. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/342800)
-in GitLab 14.5, [with a feature flag](../../administration/feature_flags.md) named `ci_validate_job_length`.
-Enabled by default. To disable it, ask an administrator to [disable the feature flag](../../administration/feature_flags.md).
+Job names must be 255 characters or fewer.
Use unique names for your jobs. If multiple jobs have the same name,
only one is added to the pipeline, and it's difficult to predict which one is chosen.
diff --git a/doc/ci/lint.md b/doc/ci/lint.md
index 256e669a66e..0811cc87e91 100644
--- a/doc/ci/lint.md
+++ b/doc/ci/lint.md
@@ -25,8 +25,7 @@ configuration added with the [`includes` keyword](yaml/index.md#include).
To check CI/CD configuration with the CI lint tool:
1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select:
- - **CI/CD > Pipelines**
+1. On the left sidebar, select **CI/CD > Pipelines**.
1. In the top right, select **CI lint**.
1. Paste a copy of the CI/CD configuration you want to check into the text box.
1. Select **Validate**.
@@ -47,8 +46,7 @@ Prerequisites:
To simulate a pipeline:
1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select:
- - **CI/CD > Pipelines**
+1. On the left sidebar, select **CI/CD > Pipelines**.
1. In the top right, select **CI lint**.
1. Paste a copy of the CI/CD configuration you want to check into the text box.
1. Select **Simulate pipeline creation for the default branch**.
diff --git a/doc/ci/migration/jenkins.md b/doc/ci/migration/jenkins.md
index bfa2eb54806..19b1a6cad1f 100644
--- a/doc/ci/migration/jenkins.md
+++ b/doc/ci/migration/jenkins.md
@@ -199,7 +199,7 @@ GitLab takes advantage of our connected ecosystem to automatically pull these ki
your merge requests, pipeline details pages, and other locations. You may find that you actually don't
need to configure anything to have these appear.
-If they aren't working as expected, or if you'd like to see what's available, our [CI feature index](../index.md#gitlab-cicd-features) has the full list
+If they aren't working as expected, or if you'd like to see what's available, our [CI/CD feature index](../index.md#features) has the full list
of bundled features and links to the documentation for each.
### Templates
diff --git a/doc/ci/pipelines/merge_request_pipelines.md b/doc/ci/pipelines/merge_request_pipelines.md
index d80b745e6bc..75408de2721 100644
--- a/doc/ci/pipelines/merge_request_pipelines.md
+++ b/doc/ci/pipelines/merge_request_pipelines.md
@@ -20,19 +20,20 @@ Branch pipelines:
- Run when you push a new commit to a branch.
- Are the default type of pipeline.
- Have access to [some predefined variables](../variables/predefined_variables.md).
-- Have access to [protected variables](../variables/index.md#protect-a-cicd-variable).
+- Have access to [protected variables](../variables/index.md#protect-a-cicd-variable) and [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
Merge request pipelines:
- Run when you:
- - Create a new merge request.
+ - Create a new merge request from a source branch with one or more commits.
- Push a new commit to the source branch for a merge request.
- Select **Run pipeline** from the **Pipelines** tab in a merge request. This option
- is only available when merge request pipelines are configured for the pipeline.
+ is only available when merge request pipelines are configured for the pipeline
+ and the source branch has at least one commit.
- Do not run by default. The jobs in the CI/CD configuration file [must be configured](#prerequisites)
to run in merge request pipelines.
- Have access to [more predefined variables](#available-predefined-variables).
-- Do not have access to [protected variables](../variables/index.md#protect-a-cicd-variable).
+- Do not have access to [protected variables](../variables/index.md#protect-a-cicd-variable) or [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
Both of these types of pipelines can appear on the **Pipelines** tab of a merge request.
@@ -147,7 +148,7 @@ a warning that you must accept before you can trigger the pipeline.
Prerequisites:
- You must be a member of the parent project and have at least the [Developer role](../../user/permissions.md).
-- The fork project must be [visible](../../public_access/public_access.md) to the
+- The fork project must be [visible](../../user/public_access.md) to the
user running the pipeline. Otherwise, the **Pipelines** tab does not display
in the merge request.
diff --git a/doc/ci/pipelines/multi_project_pipelines.md b/doc/ci/pipelines/multi_project_pipelines.md
index 2163527e3ca..e6af9292fe1 100644
--- a/doc/ci/pipelines/multi_project_pipelines.md
+++ b/doc/ci/pipelines/multi_project_pipelines.md
@@ -282,7 +282,7 @@ tag in a different project.
Prerequisites:
-- The upstream project must be [public](../../public_access/public_access.md).
+- The upstream project must be [public](../../user/public_access.md).
- The user must have the Developer role
in the upstream project.
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 7960d0afa85..b6ea16ae224 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -76,7 +76,14 @@ To avoid this scenario:
1. Select the **Skip outdated deployment jobs** checkbox.
1. Select **Save changes**.
-Older deployment jobs are skipped when a new deployment starts.
+When a new deployment starts, older deployment jobs are skipped. Skipped jobs are labeled:
+
+- `forward deployment failure` in the pipeline view.
+- `The deployment job is older than the previously succeeded deployment job, and therefore cannot be run`
+ when viewing the completed job.
+
+Job age is determined by the job start time, not the commit time, so a newer commit
+can be skipped in some circumstances.
For more information, see [Deployment safety](../environments/deployment_safety.md).
@@ -223,7 +230,7 @@ Setting the regular expression this way takes precedence over project settings.
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/17633)
-for use in GitLab 14.9, and is planned for [removal](https://gitlab.com/gitlab-org/gitlab/-/issues/17633) in GitLab 15.0.
+in GitLab 14.9, and is planned for [removal](https://gitlab.com/gitlab-org/gitlab/-/issues/17633) in GitLab 15.0.
You can add test coverage results to merge requests using the Project's CI/CD settings:
diff --git a/doc/ci/review_apps/index.md b/doc/ci/review_apps/index.md
index ed29b33bc3a..56e8b96d11f 100644
--- a/doc/ci/review_apps/index.md
+++ b/doc/ci/review_apps/index.md
@@ -192,9 +192,12 @@ After you have the route mapping set up, it takes effect in the following locati
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10761) in GitLab 12.0.
> - [Moved](https://about.gitlab.com/blog/2021/01/26/new-gitlab-product-subscription-model/) to GitLab Premium in 13.9.
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), enabled by default.
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), `anonymous_visual_review_feedback`, disabled by default.
> - It's enabled on GitLab.com.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-visual-reviews). **(PREMIUM SELF)**
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available,
+ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `anonymous_visual_review_feedback`.
With Visual Reviews, members of any team (Product, Design, Quality, and so on) can provide feedback comments through a form in your review apps. The comments are added to the merge request that triggered the review app.
@@ -284,30 +287,12 @@ can supply the ID by either:
- Dynamically adding the `data-merge-request-id` value during the build of the app.
- Supplying it manually through the visual review form in the app.
-### Enable or disable Visual Reviews **(PREMIUM SELF)**
-
-Visual Reviews is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can opt to disable it.
-
-To disable it:
-
-```ruby
-Feature.disable(:anonymous_visual_review_feedback)
-```
-
-To enable it:
-
-```ruby
-Feature.enable(:anonymous_visual_review_feedback)
-```
-
### Authentication for Visual Reviews
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/42750#note_317271120) in GitLab 12.10.
To enable visual reviews for private and internal projects, set the
-[`data-require-auth` variable](#enable-or-disable-visual-reviews) to `true`. When enabled,
+[`data-require-auth` variable](#configure-review-apps-for-visual-reviews) to `true`. When enabled,
the user must enter a [personal access token](../../user/profile/personal_access_tokens.md)
with `api` scope before submitting feedback.
diff --git a/doc/ci/runners/runners_scope.md b/doc/ci/runners/runners_scope.md
index aa7e268e800..6082a17d001 100644
--- a/doc/ci/runners/runners_scope.md
+++ b/doc/ci/runners/runners_scope.md
@@ -37,22 +37,31 @@ If you are using GitLab.com:
- The shared runners consume the [CI/CD minutes](../pipelines/cicd_minutes.md)
included with your account.
-### Enable shared runners
+### Enable shared runners for a project
On GitLab.com, [shared runners](index.md) are enabled in all projects by
default.
-On self-managed instances of GitLab, an administrator must [install](https://docs.gitlab.com/runner/install/index.html)
-and [register](https://docs.gitlab.com/runner/register/index.html) them.
+On self-managed instances of GitLab, an administrator can
+[enable them for all new projects](../../user/admin_area/settings/continuous_integration.md#enable-shared-runners-for-new-projects).
-You can also enable shared runners for individual projects.
+For existing projects, an administrator must
+[install](https://docs.gitlab.com/runner/install/index.html) and
+[register](https://docs.gitlab.com/runner/register/index.html) them.
-To enable shared runners:
+To enable shared runners for a project:
1. Go to the project's **Settings > CI/CD** and expand the **Runners** section.
1. Select **Enable shared runners for this project**.
-### Disable shared runners
+### Enable shared runners for a group
+
+To enable shared runners for a group:
+
+1. Go to the group's **Settings > CI/CD** and expand the **Runners** section.
+1. Select **Enable shared runners for this group**.
+
+### Disable shared runners for a project
You can disable shared runners for individual projects or for groups.
You must have the Owner role for the project
@@ -68,6 +77,8 @@ Shared runners are automatically disabled for a project:
- If the shared runners setting for the parent group is disabled, and
- If overriding this setting is not permitted at the project level.
+### Disable shared runners for a group
+
To disable shared runners for a group:
1. Go to the group's **Settings > CI/CD** and expand the **Runners** section.
@@ -78,7 +89,7 @@ To disable shared runners for a group:
NOTE:
To re-enable the shared runners for a group, turn on the
**Enable shared runners for this group** toggle.
-Then, an owner or maintainer must explicitly change this setting
+Then, a user with the Owner or Maintainer role must explicitly change this setting
for each project subgroup or project.
### How shared runners pick jobs
@@ -143,6 +154,8 @@ Group runners process jobs by using a first in, first out ([FIFO](https://en.wik
### Create a group runner
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/19819) in GitLab 14.10, path changed from **Settings > CI/CD > Runners**.
+
You can create a group runner for your self-managed GitLab instance or for GitLab.com.
You must have the Owner role for the group.
@@ -150,7 +163,7 @@ To create a group runner:
1. [Install GitLab Runner](https://docs.gitlab.com/runner/install/).
1. Go to the group you want to make the runner work for.
-1. Go to **Settings > CI/CD** and expand the **Runners** section.
+1. On the left sidebar, select **CI/CD > Runners**.
1. Note the URL and token.
1. [Register the runner](https://docs.gitlab.com/runner/register/).
@@ -163,7 +176,7 @@ You can do this for your self-managed GitLab instance or for GitLab.com.
You must have the Owner role for the group.
1. Go to the group where you want to view the runners.
-1. Go to **Settings > CI/CD** and expand the **Runners** section.
+1. On the left sidebar, select **CI/CD > Runners**.
1. The following fields are displayed.
| Attribute | Description |
@@ -186,7 +199,7 @@ You can pause or remove a group runner for your self-managed GitLab instance or
You must have the Owner role for the group.
1. Go to the group you want to remove or pause the runner for.
-1. Go to **Settings > CI/CD** and expand the **Runners** section.
+1. On the left sidebar, select **CI/CD > Runners**.
1. Click **Pause** or **Remove runner**.
- If you pause a group runner that is used by multiple projects, the runner pauses for all projects.
- From the group view, you cannot remove a runner that is assigned to more than one project.
diff --git a/doc/ci/runners/saas/macos/environment.md b/doc/ci/runners/saas/macos/environment.md
index d1943a487a7..4d209fe4cd6 100644
--- a/doc/ci/runners/saas/macos/environment.md
+++ b/doc/ci/runners/saas/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 SaaS runners on macOS **(FREE SAAS)**
+# VM instances and images for SaaS runners on macOS **(PREMIUM SAAS)**
When you use SaaS runners on macOS:
@@ -35,6 +35,7 @@ Each image is running a specific version of macOS and Xcode.
| macos-10.14-xcode-10 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/mojave.yml> |
| macos-10.15-xcode-11 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/catalina.yml> |
| macos-11-xcode-12 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/big-sur.yml> |
+| macos-11-xcode-13 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/monterey.yml>
### Image update policy
diff --git a/doc/ci/runners/saas/macos_saas_runner.md b/doc/ci/runners/saas/macos_saas_runner.md
index 885a76a7b46..bad9da960b2 100644
--- a/doc/ci/runners/saas/macos_saas_runner.md
+++ b/doc/ci/runners/saas/macos_saas_runner.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
---
-# SaaS runners on macOS (beta) **(FREE SAAS)**
+# SaaS runners on macOS (beta) **(PREMIUM SAAS)**
SaaS runners on macOS are in [Beta](../../../policy/alpha-beta-support.md#beta-features)
and shouldn't be relied upon for mission-critical production jobs.
diff --git a/doc/ci/secrets/index.md b/doc/ci/secrets/index.md
index 5595559b5f0..ba395108966 100644
--- a/doc/ci/secrets/index.md
+++ b/doc/ci/secrets/index.md
@@ -92,8 +92,8 @@ To configure your Vault server:
specified when the authentication method was configured.
- `VAULT_AUTH_PATH` - Optional. The path where the authentication method is mounted, default is `jwt`.
- `VAULT_NAMESPACE` - Optional. The [Vault Enterprise namespace](https://www.vaultproject.io/docs/enterprise/namespaces) to use for reading secrets and authentication.
- If no namespace is specified, Vault uses the `root` ("`/`") namespace.
- The setting is ignored by Vault Open Source.
+ If no namespace is specified, Vault uses the `root` ("`/`") namespace.
+ The setting is ignored by Vault Open Source.
NOTE:
Support for providing these values in the user interface [is tracked in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/218677).
diff --git a/doc/ci/secure_files/index.md b/doc/ci/secure_files/index.md
new file mode 100644
index 00000000000..3cc38a8b74c
--- /dev/null
+++ b/doc/ci/secure_files/index.md
@@ -0,0 +1,98 @@
+---
+stage: Verify
+group: Pipeline Authoring
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# Project-level Secure Files **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78227) in GitLab 14.8. [Deployed behind the `ci_secure_files` flag](../../administration/feature_flags.md), disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available,
+ask an administrator to [enable the feature flag](../../administration/feature_flags.md)
+named `ci_secure_files`. Limited to 100 secure files per project. Files must be smaller
+than 5 MB. The feature is not ready for production use.
+
+You can securely store files for use in CI/CD pipelines as "secure files". These files
+are stored securely outside of your project's repository, and are not version controlled.
+It is safe to store sensitive information in these files. Secure files support both
+plain text and binary file types.
+
+Secure files can be [downloaded and used by CI/CD jobs](#use-secure-files-in-cicd-jobs)
+by using the [load-secure-files](https://gitlab.com/gitlab-org/incubation-engineering/devops-for-mobile-apps/load-secure-files)
+tool.
+
+NOTE:
+This feature is in active development and is likely to change, potentially in a breaking way.
+Additional features and capabilities are planned.
+
+## Add a secure file to a project
+
+To add a secure file to a project, use the [Secure Files API](../../api/secure_files.md#create-secure-file).
+
+Send a POST request to the secure files endpoint for your project:
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
+ "https://gitlab.example.com/api/v4/projects/:project_id/secure_files" --form "name=myfile.jks" --form "file=@/path/to/file/myfile.jks"
+```
+
+The response returns all of the metadata for the file you just uploaded. For example:
+
+```json
+{
+ "id": 1,
+ "name": "myfile.jks",
+ "checksum": "16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aac",
+ "checksum_algorithm": "sha256",
+ "permissions": "read_only",
+ "created_at": "2022-02-22T22:22:22.222Z"
+}
+```
+
+## List all secure files in a project
+
+To list all secure files in a project, use the [Secure Files API](../../api/secure_files.md#list-project-secure-files).
+
+Send a GET request to the secure files endpoint for your project:
+
+```shell
+curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" \
+ "https://gitlab.example.com/api/v4/projects/:project_id/secure_files"
+```
+
+The response returns an array of all of the secure files in the project. For example:
+
+```json
+[{
+ "id": 1,
+ "name": "myfile.jks",
+ "checksum": "16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aac",
+ "checksum_algorithm": "sha256",
+ "permissions": "read_only",
+ "created_at": "2022-02-22T22:22:22.222Z"
+}]
+```
+
+## Use secure files in CI/CD jobs
+
+To use your secure files in a CI/CD job, you must use the [`load-secure-files`](https://gitlab.com/gitlab-org/incubation-engineering/devops-for-mobile-apps/load-secure-files)
+tool to download the files in the job. After they are downloaded, you can use them
+with your other script commands.
+
+Add a command in the `script` section of your job to download the `load-secure-files` tool
+and execute it. The files download into a `.secure_files` directory in the root of the project.
+To change the download location for the secure files, set the path in the `SECURE_FILES_DOWNLOAD_PATH`
+[CI/CD variable](../variables/index.md).
+
+For example:
+
+```yaml
+test:
+ variables:
+ SECURE_FILES_DOWNLOAD_PATH: './where/files/should/go/'
+ script:
+ - curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/devops-for-mobile-apps/load-secure-files/-/raw/main/installer" | bash
+```
diff --git a/doc/ci/ssh_keys/index.md b/doc/ci/ssh_keys/index.md
index 817263374f1..30b688c0b96 100644
--- a/doc/ci/ssh_keys/index.md
+++ b/doc/ci/ssh_keys/index.md
@@ -48,7 +48,7 @@ contained) and you want to deploy your code in a private server, you need a way
to access it. In this case, you can use an SSH key pair.
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).
+ the instructions to [generate an SSH key](../../user/ssh.md#generate-an-ssh-key-pair).
**Do not** add a passphrase to the SSH key, or the `before_script` will
prompt for it.
@@ -124,7 +124,7 @@ on, and use that key for all projects that are run on this machine.
```
1. Generate the SSH key pair as described in the instructions to
- [generate an SSH key](../../ssh/index.md#generate-an-ssh-key-pair).
+ [generate an SSH key](../../user/ssh.md#generate-an-ssh-key-pair).
**Do not** add a passphrase to the SSH key, or the `before_script` will
prompt for it.
diff --git a/doc/ci/unit_test_reports.md b/doc/ci/unit_test_reports.md
index 14350ac884f..029bd20c553 100644
--- a/doc/ci/unit_test_reports.md
+++ b/doc/ci/unit_test_reports.md
@@ -77,7 +77,7 @@ If a test failed in the project's default branch in the last 14 days, a message
To enable the Unit test reports in merge requests, you must add
[`artifacts:reports:junit`](yaml/artifacts_reports.md#artifactsreportsjunit)
-in `.gitlab-ci.yml`, and specify the path(s) of the generated test reports.
+in `.gitlab-ci.yml`, and specify the paths of the generated test reports.
The reports must be `.xml` files, otherwise [GitLab returns an Error 500](https://gitlab.com/gitlab-org/gitlab/-/issues/216575).
In the following examples, the job in the `test` stage runs and GitLab
diff --git a/doc/ci/variables/index.md b/doc/ci/variables/index.md
index e4e562bb005..30d53a340a9 100644
--- a/doc/ci/variables/index.md
+++ b/doc/ci/variables/index.md
@@ -346,6 +346,7 @@ To mask a variable:
1. Select the **Mask variable** checkbox.
1. Select **Update variable**.
+The method used to mask variables [limits what can be included in a masked variable](](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13784#note_106756757)).
The value of the variable must:
- Be a single line.
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index 0f3461b3674..3b504b02fae 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -58,6 +58,7 @@ There are also a number of [variables you can use to configure runner behavior](
| `CI_ENVIRONMENT_URL` | 9.3 | all | The URL of the environment for this job. Available if [`environment:url`](../yaml/index.md#environmenturl) is set. |
| `CI_ENVIRONMENT_ACTION` | 13.11 | all | The action annotation specified for this job's environment. Available if [`environment:action`](../yaml/index.md#environmentaction) is set. Can be `start`, `prepare`, or `stop`. |
| `CI_ENVIRONMENT_TIER` | 14.0 | all | The [deployment tier of the environment](../environments/index.md#deployment-tier-of-environments) for this job. |
+| `CI_GITLAB_FIPS_MODE` | 14.10 | all | The configuration setting for whether FIPS mode is enabled in the GitLab instance. |
| `CI_HAS_OPEN_REQUIREMENTS` | 13.1 | all | Only available if the pipeline's project has an open [requirement](../../user/project/requirements/index.md). `true` when available. |
| `CI_JOB_ID` | 9.0 | all | The internal ID of the job, unique across all jobs in the GitLab instance. |
| `CI_JOB_IMAGE` | 12.9 | 12.9 | The name of the Docker image running the job. |
@@ -105,7 +106,7 @@ There are also a number of [variables you can use to configure runner behavior](
| `CI_RUNNER_EXECUTABLE_ARCH` | all | 10.6 | The OS/architecture of the GitLab Runner executable. Might not be the same as the environment of the executor. |
| `CI_RUNNER_ID` | 8.10 | 0.5 | The unique ID of the runner being used. |
| `CI_RUNNER_REVISION` | all | 10.6 | The revision of the runner running the job. |
-| `CI_RUNNER_SHORT_TOKEN` | all | 12.3 | First eight characters of the runner's token used to authenticate new job requests. Used as the runner's unique ID. |
+| `CI_RUNNER_SHORT_TOKEN` | all | 12.3 | The runner's unique ID, used to authenticate new job requests. In [GitLab 14.9](https://gitlab.com/gitlab-org/security/gitlab/-/merge_requests/2251) and later, the token contains a prefix, and the first 17 characters are used. Prior to 14.9, the first eight characters are used. |
| `CI_RUNNER_TAGS` | 8.10 | 0.5 | A comma-separated list of the runner tags. |
| `CI_RUNNER_VERSION` | all | 10.6 | The version of the GitLab Runner running the job. |
| `CI_SERVER_HOST` | 12.1 | all | The host of the GitLab instance URL, without protocol or port. For example `gitlab.example.com`. |
@@ -113,6 +114,7 @@ There are also a number of [variables you can use to configure runner behavior](
| `CI_SERVER_PORT` | 12.8 | all | The port of the GitLab instance URL, without host or protocol. For example `8080`. |
| `CI_SERVER_PROTOCOL` | 12.8 | all | The protocol of the GitLab instance URL, without host or port. For example `https`. |
| `CI_SERVER_REVISION` | all | all | GitLab revision that schedules jobs. |
+| `CI_SERVER_TLS_CA_FILE` | all | all | File containing the CA certificate to verify the GitLab server. |
| `CI_SERVER_URL` | 12.7 | all | The base URL of the GitLab instance, including protocol and port. For example `https://gitlab.example.com:8080`. |
| `CI_SERVER_VERSION_MAJOR` | 11.4 | all | The major version of the GitLab instance. For example, if the GitLab version is `13.6.1`, the `CI_SERVER_VERSION_MAJOR` is `13`. |
| `CI_SERVER_VERSION_MINOR` | 11.4 | all | The minor version of the GitLab instance. For example, if the GitLab version is `13.6.1`, the `CI_SERVER_VERSION_MINOR` is `6`. |
diff --git a/doc/ci/variables/where_variables_can_be_used.md b/doc/ci/variables/where_variables_can_be_used.md
index 4f304a10256..64d61ec9f11 100644
--- a/doc/ci/variables/where_variables_can_be_used.md
+++ b/doc/ci/variables/where_variables_can_be_used.md
@@ -137,8 +137,6 @@ The following variables are known as "persisted":
- `CI_JOB_ID`
- `CI_JOB_TOKEN`
- `CI_JOB_STARTED_AT`
-- `CI_BUILD_ID`
-- `CI_BUILD_TOKEN`
- `CI_REGISTRY_USER`
- `CI_REGISTRY_PASSWORD`
- `CI_REPOSITORY_URL`
diff --git a/doc/ci/yaml/artifacts_reports.md b/doc/ci/yaml/artifacts_reports.md
index e010dd21b9e..b30b13e1ec0 100644
--- a/doc/ci/yaml/artifacts_reports.md
+++ b/doc/ci/yaml/artifacts_reports.md
@@ -80,9 +80,14 @@ GitLab can display the results of one or more reports in:
- The [security dashboard](../../user/application_security/security_dashboard/index.md).
- The [Project Vulnerability report](../../user/application_security/vulnerability_report/index.md).
-## `artifacts:reports:cobertura`
+## `artifacts:reports:cobertura` (DEPRECATED)
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3708) in GitLab 12.9.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3708) in GitLab 12.9.
+> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78132) in GitLab 14.9.
+
+WARNING:
+This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78132) in GitLab
+14.9 and replaced with `artifacts:reports:coverage_report` in 14.10.
The `cobertura` report collects [Cobertura coverage XML files](../../user/project/merge_requests/test_coverage_visualization.md).
The collected Cobertura coverage reports upload to GitLab as an artifact.
@@ -93,6 +98,28 @@ GitLab can display the results of one or more reports in the merge request
Cobertura was originally developed for Java, but there are many third-party ports for other languages such as
JavaScript, Python, and Ruby.
+## `artifacts:reports:coverage_report`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/344533) in GitLab 14.9.
+
+Use `coverage_report` to collect coverage report in Cobertura format, similar to `artifacts:reports:cobertura`.
+
+NOTE:
+`artifacts:reports:coverage_report` cannot be used at the same time with `artifacts:reports:cobertura`.
+
+```yaml
+artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage/cobertura-coverage.xml
+```
+
+The collected coverage report is uploaded to GitLab as an artifact.
+
+GitLab can display the results of coverage report in the merge request
+[diff annotations](../../user/project/merge_requests/test_coverage_visualization.md).
+
## `artifacts:reports:codequality`
> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
index a3b91da8f08..b335e8e8545 100644
--- a/doc/ci/yaml/index.md
+++ b/doc/ci/yaml/index.md
@@ -395,13 +395,13 @@ When no rules evaluate to true, the pipeline does not run.
```yaml
workflow:
rules:
- - if: $CI_COMMIT_MESSAGE =~ /-draft$/
+ - if: $CI_COMMIT_TITLE =~ /-draft$/
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
```
-In this example, pipelines run if the commit message does not have `-drafts` in it
+In this example, pipelines run if the commit title (first line of the commit message) does not end with `-draft`
and the pipeline is for either:
- A merge request
@@ -2484,8 +2484,10 @@ Use `changes` in pipelines with the following refs:
- Paths to files.
- Wildcard paths for single directories, for example `path/to/directory/*`, or a directory
and all its subdirectories, for example `path/to/directory/**/*`.
-- Wildcard ([glob](https://en.wikipedia.org/wiki/Glob_(programming))) paths for all
+- Wildcard [glob](https://en.wikipedia.org/wiki/Glob_(programming)) paths for all
files with the same extension or multiple extensions, for example `*.md` or `path/to/directory/*.{rb,py,sh}`.
+ See the [Ruby `fnmatch` documentation](https://docs.ruby-lang.org/en/master/File.html#method-c-fnmatch)
+ for the supported syntax list.
- Wildcard paths to files in the root directory, or all directories, wrapped in double quotes.
For example `"*.json"` or `"**/*.json"`.
@@ -2620,9 +2622,11 @@ Multiple runners must exist, or a single runner must be configured to run multip
**Keyword type**: Job keyword. You can use it only as part of a job.
-**Possible inputs**:
+**Possible inputs**: An array of hashes of variables:
-- A numeric value from `2` to `50`.
+- The variable names can use only numbers, letters, and underscores (`_`).
+- The values must be either a string, or an array of strings.
+- The number of permutations cannot exceed 50.
**Example of `parallel:matrix`**:
@@ -2692,18 +2696,19 @@ you can use this image from the GitLab Container Registry: `registry.gitlab.com/
**Example of `release` keyword**:
- ```yaml
- release_job:
- stage: release
- image: registry.gitlab.com/gitlab-org/release-cli:latest
- rules:
- - if: $CI_COMMIT_TAG # Run this job when a tag is created manually
- script:
- - echo "Running the release job."
- release:
- name: 'Release $CI_COMMIT_TAG'
- description: 'Release created using the release-cli.'
- ```
+```yaml
+release_job:
+ stage: release
+ image: registry.gitlab.com/gitlab-org/release-cli:latest
+ rules:
+ - if: $CI_COMMIT_TAG # Run this job when a tag is created manually
+ script:
+ - echo "Running the release job."
+ release:
+ tag_name: $CI_COMMIT_TAG
+ name: 'Release $CI_COMMIT_TAG'
+ description: 'Release created using the release-cli.'
+```
This example creates a release:
@@ -3100,7 +3105,7 @@ to specific files.
WARNING:
You should use `rules: changes` only with **branch pipelines** or **merge request pipelines**.
You can use `rules: changes` with other pipeline types, but `rules: changes` always
-evaluates to true when there is no Git `push` event. Tag pipelines, scheduled pipelines,
+evaluates to true when there is no Git `push` event. Tag pipelines, scheduled pipelines, manual pipelines,
and so on do **not** have a Git `push` event associated with them. A `rules: changes` job
is **always** added to those pipelines if there is no `if` that limits the job to
branch or merge request pipelines.
@@ -3709,7 +3714,7 @@ and [multi-project pipelines](../pipelines/multi_project_pipelines.md).
- `yaml_variables`: `true` (default), or `false`. When `true`, variables defined
in the trigger job are passed to downstream pipelines.
-- `pipeline_variables`: `true` or `false` (default). When `true`, [manual pipeline variables](../variables/index.md#override-a-defined-cicd-variable)
+- `pipeline_variables`: `true` or `false` (default). When `true`, [manual pipeline variables](../variables/index.md#override-a-defined-cicd-variable) and [scheduled pipeline variables](../pipelines/schedules.md#add-a-pipeline-schedule)
are passed to downstream pipelines.
**Example of `trigger:forward`**:
diff --git a/doc/cloud_seed/index.md b/doc/cloud_seed/index.md
new file mode 100644
index 00000000000..d4b8d040758
--- /dev/null
+++ b/doc/cloud_seed/index.md
@@ -0,0 +1,120 @@
+---
+stage: Release
+group: Incubation
+info: Cloud Seed (formerly 5mp) is a GitLab Incubation Engineering program. No technical writer assigned to this group.
+---
+
+# Cloud Seed
+
+Cloud Seed is an open-source program led
+by [GitLab Incubation Engineering](https://about.gitlab.com/handbook/engineering/incubation/) in collaboration with
+[Google Cloud](https://cloud.google.com/).
+
+Cloud Seed is in `private-testing` mode and is available to a select group of users. If you are interested in joining
+this group, please fill in
+the [Cloud Seed Trusted Testers invitation form](https://docs.google.com/forms/d/e/1FAIpQLSeJPtFE8Vpqs_YTAKkFK42p5mO9zIYA2jr_PiP2h32cs8R39Q/viewform)
+and we will reach out to you.
+
+## Purpose
+
+We believe that it should be **trivial** to deploy web applications (and other workloads) from GitLab to major cloud
+providers.
+
+To support this effort, Cloud Seed makes it simple and intuitive to consume appropriate Google Cloud services
+within GitLab.
+
+## Why Google Cloud
+
+*or Why not AWS or Azure?*
+
+Cloud Seed is an open-source program that can be extended by anyone, and we'd love to work with every major cloud
+provider. We chose to work with Google Cloud because their team is accessible, supportive, and collaborative in
+this effort.
+
+As an open-source project, [everyone can contribute](#contribute-to-cloud-seed) and shape our direction.
+
+## Deploy to Google Cloud Run
+
+After you have your web application in a GitLab project, follow these steps
+to deploy your application from GitLab to Google Cloud with Cloud Seed:
+
+1. [Set up deployment credentials](#set-up-deployment-credentials)
+1. (Optional) [Configure your preferred GCP region](#configure-your-preferred-gcp-region)
+1. [Configure the Cloud Run deployment pipeline](#configure-the-cloud-run-deployment-pipeline)
+
+### Set up deployment credentials
+
+Cloud Seed provides an interface to create Google Cloud Platform (GCP) service accounts from your GitLab project. The associated GCP project
+must be selected during the service account creation workflow. This process generates a service account, keys, and deployment permissions.
+
+To create a service account:
+
+1. Go to the `Project :: Infrastructure :: Google Cloud` page.
+1. Select **Create Service Account**.
+1. Follow the Google OAuth 2 workflow and authorize GitLab.
+1. Select your GCP project.
+1. Associate a Git reference (such as a branch or tag) for the selected GCP project.
+1. Submit the form to create the service account.
+
+The generated service account, service account key, and associated GCP project ID are stored in GitLab as project CI
+variables. You can review and manage these in the `Project :: Settings :: CI` page.
+
+The generated service account has the following roles:
+
+- `roles/iam.serviceAccountUser`
+- `roles/artifactregistry.admin`
+- `roles/cloudbuild.builds.builder`
+- `roles/run.admin`
+- `roles/storage.admin`
+- `roles/cloudsql.admin`
+- `roles/browser`
+
+You can enhance security by storing CI variables in secret managers. Learn more about [secret management with GitLab](../ci/secrets/index.md).
+
+### Configure your preferred GCP region
+
+When you configure GCP regions for your deployments, the list of regions offered is a subset of
+all GCP regions available.
+
+To configure a region:
+
+1. Go to the `Project :: Infrastructure :: Google Cloud` page.
+1. Select **Configure GCP Region**.
+1. Select your preferred GCP region.
+1. Associate a Git reference (such as a branch or tag) for the selected GCP region.
+1. Submit the form to configure the GCP region.
+
+The configured GCP region is stored in GitLab as a project CI variable. You can review and manage these in
+the `Project :: Settings :: CI` page.
+
+### Configure the Cloud Run deployment pipeline
+
+You can configure the Google Cloud Run deployment job in your pipeline. A typical use case for such
+a pipeline is continuous deployment of your web application.
+
+The project pipeline itself could have a broader purpose spanning across several stages, such as build, test, and secure.
+Therefore, the Cloud Run deployment offering comes packaged as one job that fits into a much larger pipeline.
+
+To configure the Cloud Run deployment pipeline:
+
+1. Go to the `Project :: Infrastructure :: Google Cloud` page.
+1. Go to the `Deployments` tab.
+1. For `Cloud Run`, select **Configure via Merge Request**.
+1. Review the changes and submit to create a merge request.
+
+This creates a new branch with the Cloud Run deployment pipeline (or injected into an existing pipeline)
+and creates an associated merge request where the changes and deployment pipeline execution can be reviewed and merged
+into the main branch.
+
+## Contribute to Cloud Seed
+
+There are several ways you can contribute to Cloud Seed:
+
+- [Become a Cloud Seed user](https://docs.google.com/forms/d/e/1FAIpQLSeJPtFE8Vpqs_YTAKkFK42p5mO9zIYA2jr_PiP2h32cs8R39Q/viewform)
+ in GitLab
+ and [share feedback](https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/feedback/-/issues/new?template=general_feedback).
+- If you are familiar with Ruby on Rails or Vue.js,
+ consider [contributing to GitLab](../development/contributing/index.md) as a developer.
+ - Much of Cloud Seed is an internal module within the GitLab code base.
+- If you are familiar with GitLab pipelines, consider contributing to
+ the [Cloud Seed Library](https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/library) project.
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index 417ccba26a0..4f27e811b11 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -827,35 +827,54 @@ A description of a field or argument is given using the `description:`
keyword. For example:
```ruby
-field :id, GraphQL::Types::ID, description: 'ID of the resource.'
+field :id, GraphQL::Types::ID, description: 'ID of the issue.'
+field :confidential, GraphQL::Types::Boolean, description: 'Indicates the issue is confidential.'
+field :closed_at, Types::TimeType, description: 'Timestamp of when the issue was closed.'
```
-Descriptions of fields and arguments are viewable to users through:
+You can view descriptions of fields and arguments in:
- The [GraphiQL explorer](#graphiql).
- The [static GraphQL API reference](../api/graphql/reference/index.md).
### Description style guide
-To ensure consistency, the following should be followed whenever adding or updating
-descriptions:
+#### Language and punctuation
-- Mention the name of the resource in the description. Example:
- `'Labels of the issue'` (issue being the resource).
-- Use `"{x} of the {y}"` where possible. Example: `'Title of the issue'`.
- Do not start descriptions with `The` or `A`, for consistency and conciseness.
-- Descriptions of `GraphQL::Types::Boolean` fields should answer the question: "What does
- this field do?". Example: `'Indicates project has a Git repository'`.
-- Always include the word `"timestamp"` when describing an argument or
- field of type `Types::TimeType`. This lets the reader know that the
- format of the property is `Time`, rather than just `Date`.
-- Must end with a period (`.`).
+Use `{x} of the {y}` where possible, where `{x}` is the item you're describing,
+and `{y}` is the resource it applies to. For example:
-Example:
+```plaintext
+ID of the issue.
+```
+
+Do not start descriptions with `The` or `A`, for consistency and conciseness.
+
+End all descriptions with a period (`.`).
+
+#### Booleans
+
+For a boolean field (`GraphQL::Types::Boolean`), start with a verb that describes
+what it does. For example:
+
+```plaintext
+Indicates the issue is confidential.
+```
+
+If necessary, provide the default. For example:
+
+```plaintext
+Sets the issue to confidential. Default is false.
+```
+
+#### `Types::TimeType` field description
+
+For `Types::TimeType` GraphQL fields, include the word `timestamp`. This lets
+the reader know that the format of the property is `Time`, rather than just `Date`.
+
+For example:
```ruby
-field :id, GraphQL::Types::ID, description: 'ID of the issue.'
-field :confidential, GraphQL::Types::Boolean, description: 'Indicates the issue is confidential.'
field :closed_at, Types::TimeType, description: 'Timestamp of when the issue was closed.'
```
@@ -1782,8 +1801,8 @@ def ready?(**args)
end
```
-In the future this may be able to be done using `InputUnions` if
-[this RFC](https://github.com/graphql/graphql-spec/blob/master/rfcs/InputUnion.md)
+In the future this may be able to be done using `OneOf Input Objects` if
+[this RFC](https://github.com/graphql/graphql-spec/pull/825)
is merged.
## GitLab custom scalars
diff --git a/doc/development/application_limits.md b/doc/development/application_limits.md
index 15d21883bb8..c4146b5af3e 100644
--- a/doc/development/application_limits.md
+++ b/doc/development/application_limits.md
@@ -19,7 +19,7 @@ and communicate those limits.
There is a guide about [introducing application
limits](https://about.gitlab.com/handbook/product/product-processes/#introducing-application-limits).
-## Development
+## Implement plan limits
### Insert database plan limits
@@ -161,3 +161,31 @@ GitLab.com:
- `opensource`: Namespaces and projects that are member of GitLab Open Source program.
The `test` environment doesn't have any plans.
+
+## Implement rate limits using `Rack::Attack`
+
+We use the [`Rack::Attack`](https://github.com/rack/rack-attack) middleware to throttle Rack requests.
+This applies to Rails controllers, Grape endpoints, and any other Rack requests.
+
+The process for adding a new throttle is loosely:
+
+1. Add new columns to the `ApplicationSetting` model (`*_enabled`, `*_requests_per_period`, `*_period_in_seconds`).
+1. Extend `Gitlab::RackAttack` and `Gitlab::RackAttack::Request` to configure the new rate limit,
+ and apply it to the desired requests.
+1. Add the new settings to the Admin Area form in `app/views/admin/application_settings/_ip_limits.html.haml`.
+1. Document the new settings in [User and IP rate limits](../user/admin_area/settings/user_and_ip_rate_limits.md) and [Application settings API](../api/settings.md).
+1. Configure the rate limit for GitLab.com and document it in [GitLab.com-specific rate limits](../user/gitlab_com/index.md#gitlabcom-specific-rate-limits).
+
+Refer to these past issues for implementation details:
+
+- [Create a separate rate limit for the Files API](https://gitlab.com/gitlab-org/gitlab/-/issues/335075).
+- [Create a separate rate limit for unauthenticated API traffic](https://gitlab.com/gitlab-org/gitlab/-/issues/335300).
+
+## Implement rate limits using `Gitlab::ApplicationRateLimiter`
+
+This module implements a custom rate limiter that can be used to throttle
+certain actions. Unlike `Rack::Attack` and `Rack::Throttle`, which operate at
+the middleware level, this can be used at the controller or API level.
+
+See the `CheckRateLimit` concern for use in controllers. In other parts of the code
+the `Gitlab::ApplicationRateLimiter` module can be called directly.
diff --git a/doc/development/application_slis/index.md b/doc/development/application_slis/index.md
index adb656761c5..a202bc419e1 100644
--- a/doc/development/application_slis/index.md
+++ b/doc/development/application_slis/index.md
@@ -111,7 +111,7 @@ After that, add the following information:
metrics. For example: `["email_type"]`. If the significant labels
for the SLI include `feature_category`, the metrics will also
feed into the
- [error budgets for stage groups](../stage_group_dashboards.md#error-budget).
+ [error budgets for stage groups](../stage_group_observability/index.md#error-budget).
- `featureCategory`: if the SLI applies to a single feature category,
you can specify it statically through this field to feed the SLI
into the error budgets for stage groups.
diff --git a/doc/development/application_slis/rails_request_apdex.md b/doc/development/application_slis/rails_request_apdex.md
index b31c7d8756b..373589aaefc 100644
--- a/doc/development/application_slis/rails_request_apdex.md
+++ b/doc/development/application_slis/rails_request_apdex.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/525) in GitLab 14.4
NOTE:
-This SLI is used for service monitoring. But not for [error budgets for stage groups](../stage_group_dashboards.md#error-budget)
+This SLI is used for service monitoring. But not for [error budgets for stage groups](../stage_group_observability/index.md#error-budget)
by default. You can [opt in](#error-budget-attribution-and-ownership).
The request Apdex SLI (Service Level Indicator) is [an SLI defined in the application](index.md).
@@ -221,7 +221,7 @@ end
This SLI is used for service level monitoring. It feeds into the
[error budget for stage
-groups](../stage_group_dashboards.md#error-budget). For this
+groups](../stage_group_observability/index.md#error-budget). For this
particular SLI, we have opted everyone out by default to give time to
set the correct urgencies on endpoints before it affects a group's
error budget.
diff --git a/doc/development/audit_event_guide/index.md b/doc/development/audit_event_guide/index.md
index ae2f9748178..34f78174e5b 100644
--- a/doc/development/audit_event_guide/index.md
+++ b/doc/development/audit_event_guide/index.md
@@ -18,13 +18,14 @@ actions performed across the application.
To instrument an audit event, the following attributes should be provided:
-| Attribute | Type | Required? | Description |
-|:-------------|:---------------------|:----------|:----------------------------------------------------|
-| `name` | String | false | Action name to be audited. Used for error tracking |
-| `author` | User | true | User who authors the change |
-| `scope` | User, Project, Group | true | Scope which the audit event belongs to |
-| `target` | Object | true | Target object being audited |
-| `message` | String | true | Message describing the action |
+| Attribute | Type | Required? | Description |
+|:-------------|:---------------------|:----------|:-----------------------------------------------------------------|
+| `name` | String | false | Action name to be audited. Used for error tracking |
+| `author` | User | true | User who authors the change |
+| `scope` | User, Project, Group | true | Scope which the audit event belongs to |
+| `target` | Object | true | Target object being audited |
+| `message` | String | true | Message describing the action |
+| `created_at` | DateTime | false | The time when the action occured. Defaults to `DateTime.current` |
## How to instrument new Audit Events
@@ -97,13 +98,21 @@ if merge_approval_rule.save
author: current_user,
scope: project_alpha,
target: merge_approval_rule,
- message: 'Created a new approval rule'
+ message: 'Created a new approval rule',
+ created_at: DateTime.current # Useful for pre-dating an audit event when created asynchronously.
}
::Gitlab::Audit::Auditor.audit(audit_context)
end
```
+### Data volume considerations
+
+Because every audit event is persisted to the database, consider the amount of data we expect to generate, and the rate of generation, for new
+audit events. For new audit events that will produce a lot of data in the database, consider adding a
+[streaming-only audit event](#event-streaming) instead. If you have questions about this, feel free to ping
+`@gitlab-org/manage/compliance/backend` in an issue or merge request.
+
## Audit Event instrumentation flows
The two ways we can instrument audit events have different flows.
@@ -185,5 +194,8 @@ All events where the entity is a `Group` or `Project` are recorded in the audit
- `Group`, events are streamed to the group's root ancestor's event streaming destinations.
- `Project`, events are streamed to the project's root ancestor's event streaming destinations.
+You can add streaming-only events that are not stored in the GitLab database. This is primarily intended to be used for actions that generate
+a large amount of data. See [this merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76719/diffs#d56e47632f0384722d411ed3ab5b15e947bd2265_26_36)
+for an example.
This feature is under heavy development. Follow the [parent epic](https://gitlab.com/groups/gitlab-org/-/epics/5925) for updates on feature
development.
diff --git a/doc/development/avoiding_downtime_in_migrations.md b/doc/development/avoiding_downtime_in_migrations.md
index 1de96df327c..d4c225b62c5 100644
--- a/doc/development/avoiding_downtime_in_migrations.md
+++ b/doc/development/avoiding_downtime_in_migrations.md
@@ -1,491 +1,11 @@
---
-stage: Enablement
-group: Database
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'database/avoiding_downtime_in_migrations.md'
+remove_date: '2022-07-08'
---
-# Avoiding downtime in migrations
+This document was moved to [another location](database/avoiding_downtime_in_migrations.md).
-When working with a database certain operations may require downtime. Since we
-cannot have downtime in migrations we need to use a set of steps to get the
-same end result without downtime. This guide describes various operations that
-may appear to need downtime, their impact, and how to perform them without
-requiring downtime.
-
-## Dropping Columns
-
-Removing columns is tricky because running GitLab processes may still be using
-the columns. To work around this safely, you will need three steps in three releases:
-
-1. Ignoring the column (release M)
-1. Dropping the column (release M+1)
-1. Removing the ignore rule (release M+2)
-
-The reason we spread this out across three releases is that dropping a column is
-a destructive operation that can't be rolled back easily.
-
-Following this procedure helps us to make sure there are no deployments to GitLab.com
-and upgrade processes for self-managed installations that lump together any of these steps.
-
-### Step 1: Ignoring the column (release M)
-
-The first step is to ignore the column in the application code. This is
-necessary because Rails caches the columns and re-uses this cache in various
-places. This can be done by defining the columns to ignore. For example, to ignore
-`updated_at` in the User model you'd use the following:
-
-```ruby
-class User < ApplicationRecord
- include IgnorableColumns
- ignore_column :updated_at, remove_with: '12.7', remove_after: '2020-01-22'
-end
-```
-
-Multiple columns can be ignored, too:
-
-```ruby
-ignore_columns %i[updated_at created_at], remove_with: '12.7', remove_after: '2020-01-22'
-```
-
-If the model exists in CE and EE, the column has to be ignored in the CE model. If the
-model only exists in EE, then it has to be added there.
-
-We require indication of when it is safe to remove the column ignore with:
-
-- `remove_with`: set to a GitLab release typically two releases (M+2) after adding the
- column ignore.
-- `remove_after`: set to a date after which we consider it safe to remove the column
- ignore, typically after the M+1 release date, during the M+2 development cycle.
-
-This information allows us to reason better about column ignores and makes sure we
-don't remove column ignores too early for both regular releases and deployments to GitLab.com. For
-example, this avoids a situation where we deploy a bulk of changes that include both changes
-to ignore the column and subsequently remove the column ignore (which would result in a downtime).
-
-In this example, the change to ignore the column went into release 12.5.
-
-### Step 2: Dropping the column (release M+1)
-
-Continuing our example, dropping the column goes into a _post-deployment_ migration in release 12.6:
-
-```ruby
- remove_column :user, :updated_at
-```
-
-### Step 3: Removing the ignore rule (release M+2)
-
-With the next release, in this example 12.7, we set up another merge request to remove the ignore rule.
-This removes the `ignore_column` line and - if not needed anymore - also the inclusion of `IgnoreableColumns`.
-
-This should only get merged with the release indicated with `remove_with` and once
-the `remove_after` date has passed.
-
-## Renaming Columns
-
-Renaming columns the normal way requires downtime as an application may continue
-using the old column name during/after a database migration. To rename a column
-without requiring downtime we need two migrations: a regular migration, and a
-post-deployment migration. Both these migration can go in the same release.
-
-### Step 1: Add The Regular Migration
-
-First we need to create the regular migration. This migration should use
-`Gitlab::Database::MigrationHelpers#rename_column_concurrently` to perform the
-renaming. For example
-
-```ruby
-# A regular migration in db/migrate
-class RenameUsersUpdatedAtToUpdatedAtTimestamp < Gitlab::Database::Migration[1.0]
- disable_ddl_transaction!
-
- def up
- rename_column_concurrently :users, :updated_at, :updated_at_timestamp
- end
-
- def down
- undo_rename_column_concurrently :users, :updated_at, :updated_at_timestamp
- end
-end
-```
-
-This will take care of renaming the column, ensuring data stays in sync, and
-copying over indexes and foreign keys.
-
-If a column contains one or more indexes that don't contain the name of the
-original column, the previously described procedure will fail. In that case,
-you'll first need to rename these indexes.
-
-### Step 2: Add A Post-Deployment Migration
-
-The renaming procedure requires some cleaning up in a post-deployment migration.
-We can perform this cleanup using
-`Gitlab::Database::MigrationHelpers#cleanup_concurrent_column_rename`:
-
-```ruby
-# A post-deployment migration in db/post_migrate
-class CleanupUsersUpdatedAtRename < Gitlab::Database::Migration[1.0]
- disable_ddl_transaction!
-
- def up
- cleanup_concurrent_column_rename :users, :updated_at, :updated_at_timestamp
- end
-
- def down
- undo_cleanup_concurrent_column_rename :users, :updated_at, :updated_at_timestamp
- end
-end
-```
-
-If you're renaming a [large table](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml#L3), please carefully consider the state when the first migration has run but the second cleanup migration hasn't been run yet.
-With [Canary](https://gitlab.com/gitlab-com/gl-infra/readiness/-/tree/master/library/canary/) it is possible that the system runs in this state for a significant amount of time.
-
-## Changing Column Constraints
-
-Adding or removing a `NOT NULL` clause (or another constraint) can typically be
-done without requiring downtime. However, this does require that any application
-changes are deployed _first_. Thus, changing the constraints of a column should
-happen in a post-deployment migration.
-
-Avoid using `change_column` as it produces an inefficient query because it re-defines
-the whole column type.
-
-You can check the following guides for each specific use case:
-
-- [Adding foreign-key constraints](migration_style_guide.md#adding-foreign-key-constraints)
-- [Adding `NOT NULL` constraints](database/not_null_constraints.md)
-- [Adding limits to text columns](database/strings_and_the_text_data_type.md)
-
-## Changing Column Types
-
-Changing the type of a column can be done using
-`Gitlab::Database::MigrationHelpers#change_column_type_concurrently`. This
-method works similarly to `rename_column_concurrently`. For example, let's say
-we want to change the type of `users.username` from `string` to `text`.
-
-### Step 1: Create A Regular Migration
-
-A regular migration is used to create a new column with a temporary name along
-with setting up some triggers to keep data in sync. Such a migration would look
-as follows:
-
-```ruby
-# A regular migration in db/migrate
-class ChangeUsersUsernameStringToText < Gitlab::Database::Migration[1.0]
- disable_ddl_transaction!
-
- def up
- change_column_type_concurrently :users, :username, :text
- end
-
- def down
- undo_change_column_type_concurrently :users, :username
- end
-end
-```
-
-### Step 2: Create A Post Deployment Migration
-
-Next we need to clean up our changes using a post-deployment migration:
-
-```ruby
-# A post-deployment migration in db/post_migrate
-class ChangeUsersUsernameStringToTextCleanup < Gitlab::Database::Migration[1.0]
- disable_ddl_transaction!
-
- def up
- cleanup_concurrent_column_type_change :users, :username
- end
-
- def down
- undo_cleanup_concurrent_column_type_change :users, :username, :string
- end
-end
-```
-
-And that's it, we're done!
-
-### Casting data to a new type
-
-Some type changes require casting data to a new type. For example when changing from `text` to `jsonb`.
-In this case, use the `type_cast_function` option.
-Make sure there is no bad data and the cast will always succeed. You can also provide a custom function that handles
-casting errors.
-
-Example migration:
-
-```ruby
- def up
- change_column_type_concurrently :users, :settings, :jsonb, type_cast_function: 'jsonb'
- end
-```
-
-## Changing The Schema For Large Tables
-
-While `change_column_type_concurrently` and `rename_column_concurrently` can be
-used for changing the schema of a table without downtime, it doesn't work very
-well for large tables. Because all of the work happens in sequence the migration
-can take a very long time to complete, preventing a deployment from proceeding.
-They can also produce a lot of pressure on the database due to it rapidly
-updating many rows in sequence.
-
-To reduce database pressure you should instead use a background migration
-when migrating a column in a large table (for example, `issues`). This will
-spread the work / load over a longer time period, without slowing down deployments.
-
-For more information, see [the documentation on cleaning up background
-migrations](background_migrations.md#cleaning-up).
-
-## Adding Indexes
-
-Adding indexes does not require downtime when `add_concurrent_index`
-is used.
-
-See also [Migration Style Guide](migration_style_guide.md#adding-indexes)
-for more information.
-
-## Dropping Indexes
-
-Dropping an index does not require downtime.
-
-## Adding Tables
-
-This operation is safe as there's no code using the table just yet.
-
-## Dropping Tables
-
-Dropping tables can be done safely using a post-deployment migration, but only
-if the application no longer uses the table.
-
-## Renaming Tables
-
-Renaming tables requires downtime as an application may continue
-using the old table name during/after a database migration.
-
-If the table and the ActiveRecord model is not in use yet, removing the old
-table and creating a new one is the preferred way to "rename" the table.
-
-Renaming a table is possible without downtime by following our multi-release
-[rename table process](database/rename_database_tables.md#rename-table-without-downtime).
-
-## Adding Foreign Keys
-
-Adding foreign keys usually works in 3 steps:
-
-1. Start a transaction
-1. Run `ALTER TABLE` to add the constraint(s)
-1. Check all existing data
-
-Because `ALTER TABLE` typically acquires an exclusive lock until the end of a
-transaction this means this approach would require downtime.
-
-GitLab allows you to work around this by using
-`Gitlab::Database::MigrationHelpers#add_concurrent_foreign_key`. This method
-ensures that no downtime is needed.
-
-## Removing Foreign Keys
-
-This operation does not require downtime.
-
-## Migrating `integer` primary keys to `bigint`
-
-To [prevent the overflow risk](https://gitlab.com/groups/gitlab-org/-/epics/4785) for some tables
-with `integer` primary key (PK), we have to migrate their PK to `bigint`. The process to do this
-without downtime and causing too much load on the database is described below.
-
-### Initialize the conversion and start migrating existing data (release N)
-
-To start the process, add a regular migration to create the new `bigint` columns. Use the provided
-`initialize_conversion_of_integer_to_bigint` helper. The helper also creates a database trigger
-to keep in sync both columns for any new records ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/migrate/20210608072312_initialize_conversion_of_ci_stages_to_bigint.rb)):
-
-```ruby
-class InitializeConversionOfCiStagesToBigint < ActiveRecord::Migration[6.1]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :ci_stages
- COLUMNS = %i(id)
-
- def up
- initialize_conversion_of_integer_to_bigint(TABLE, COLUMNS)
- end
-
- def down
- revert_initialize_conversion_of_integer_to_bigint(TABLE, COLUMNS)
- end
-end
-```
-
-Ignore the new `bigint` columns:
-
-```ruby
-module Ci
- class Stage < Ci::ApplicationRecord
- include IgnorableColumns
- ignore_column :id_convert_to_bigint, remove_with: '14.2', remove_after: '2021-08-22'
- end
-```
-
-To migrate existing data, we introduced new type of _batched background migrations_.
-Unlike the classic background migrations, built on top of Sidekiq, batched background migrations
-don't have to enqueue and schedule all the background jobs at the beginning.
-They also have other advantages, like automatic tuning of the batch size, better progress visibility,
-and collecting metrics. To start the process, use the provided `backfill_conversion_of_integer_to_bigint`
-helper ([example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/migrate/20210608072346_backfill_ci_stages_for_bigint_conversion.rb)):
-
-```ruby
-class BackfillCiStagesForBigintConversion < ActiveRecord::Migration[6.1]
- include Gitlab::Database::MigrationHelpers
-
- TABLE = :ci_stages
- COLUMNS = %i(id)
-
- def up
- backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS)
- end
-
- def down
- revert_backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS)
- end
-end
-```
-
-### Monitor the background migration
-
-Check how the migration is performing while it's running. Multiple ways to do this are described below.
-
-#### High-level status of batched background migrations
-
-See how to [check the status of batched background migrations](../update/index.md#checking-for-background-migrations-before-upgrading).
-
-#### Query the database
-
-We can query the related database tables directly. Requires access to read-only replica.
-Example queries:
-
-```sql
--- Get details for batched background migration for given table
-SELECT * FROM batched_background_migrations WHERE table_name = 'namespaces'\gx
-
--- Get count of batched background migration jobs by status for given table
-SELECT
- batched_background_migrations.id, batched_background_migration_jobs.status, COUNT(*)
-FROM
- batched_background_migrations
- JOIN batched_background_migration_jobs ON batched_background_migrations.id = batched_background_migration_jobs.batched_background_migration_id
-WHERE
- table_name = 'namespaces'
-GROUP BY
- batched_background_migrations.id, batched_background_migration_jobs.status;
-
--- Batched background migration progress for given table (based on estimated total number of tuples)
-SELECT
- m.table_name,
- LEAST(100 * sum(j.batch_size) / pg_class.reltuples, 100) AS percentage_complete
-FROM
- batched_background_migrations m
- JOIN batched_background_migration_jobs j ON j.batched_background_migration_id = m.id
- JOIN pg_class ON pg_class.relname = m.table_name
-WHERE
- j.status = 3 AND m.table_name = 'namespaces'
-GROUP BY m.id, pg_class.reltuples;
-```
-
-#### Sidekiq logs
-
-We can also use the Sidekiq logs to monitor the worker that executes the batched background
-migrations:
-
-1. Sign in to [Kibana](https://log.gprd.gitlab.net) with a `@gitlab.com` email address.
-1. Change the index pattern to `pubsub-sidekiq-inf-gprd*`.
-1. Add filter for `json.queue: cronjob:database_batched_background_migration`.
-
-#### PostgreSQL slow queries log
-
-Slow queries log keeps track of low queries that took above 1 second to execute. To see them
-for batched background migration:
-
-1. Sign in to [Kibana](https://log.gprd.gitlab.net) with a `@gitlab.com` email address.
-1. Change the index pattern to `pubsub-postgres-inf-gprd*`.
-1. Add filter for `json.endpoint_id.keyword: Database::BatchedBackgroundMigrationWorker`.
-1. Optional. To see only updates, add a filter for `json.command_tag.keyword: UPDATE`.
-1. Optional. To see only failed statements, add a filter for `json.error_severity.keyword: ERROR`.
-1. Optional. Add a filter by table name.
-
-#### Grafana dashboards
-
-To monitor the health of the database, use these additional metrics:
-
-- [PostgreSQL Tuple Statistics](https://dashboards.gitlab.net/d/000000167/postgresql-tuple-statistics?orgId=1&refresh=1m): if you see high rate of updates for the tables being actively converted, or increasing percentage of dead tuples for this table, it might mean that autovacuum cannot keep up.
-- [PostgreSQL Overview](https://dashboards.gitlab.net/d/000000144/postgresql-overview?orgId=1): if you see high system usage or transactions per second (TPS) on the primary database server, it might mean that the migration is causing problems.
-
-### Prometheus metrics
-
-Number of [metrics](https://gitlab.com/gitlab-org/gitlab/-/blob/294a92484ce4611f660439aa48eee4dfec2230b5/lib/gitlab/database/background_migration/batched_migration_wrapper.rb#L90-128)
-for each batched background migration are published to Prometheus. These metrics can be searched for and
-visualized in Thanos ([see an example](https://thanos-query.ops.gitlab.net/graph?g0.expr=sum%20(rate(batched_migration_job_updated_tuples_total%7Benv%3D%22gprd%22%7D%5B5m%5D))%20by%20(migration_id)%20&g0.tab=0&g0.stacked=0&g0.range_input=3d&g0.max_source_resolution=0s&g0.deduplicate=1&g0.partial_response=0&g0.store_matches=%5B%5D&g0.end_input=2021-06-13%2012%3A18%3A24&g0.moment_input=2021-06-13%2012%3A18%3A24)).
-
-### Swap the columns (release N + 1)
-
-After the background is completed and the new `bigint` columns are populated for all records, we can
-swap the columns. Swapping is done with post-deployment migration. The exact process depends on the
-table being converted, but in general it's done in the following steps:
-
-1. Using the provided `ensure_batched_background_migration_is_finished` helper, make sure the batched
-migration has finished ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L13-18)).
-If the migration has not completed, the subsequent steps fail anyway. By checking in advance we
-aim to have more helpful error message.
-1. Create indexes using the `bigint` columns that match the existing indexes using the `integer`
-column ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L28-34)).
-1. Create foreign keys (FK) using the `bigint` columns that match the existing FKs using the
-`integer` column. Do this both for FK referencing other tables, and FKs that reference the table
-that is being migrated ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L36-43)).
-1. Inside a transaction, swap the columns:
- 1. Lock the tables involved. To reduce the chance of hitting a deadlock, we recommended to do this in parent to child order ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L47)).
- 1. Rename the columns to swap names ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L49-54))
- 1. Reset the trigger function ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L56-57)).
- 1. Swap the defaults ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L59-62)).
- 1. Swap the PK constraint (if any) ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L64-68)).
- 1. Remove old indexes and rename new ones ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L70-72)).
- 1. Remove old FKs (if still present) and rename new ones ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L74)).
-
-See example [merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66088), and [migration](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb).
-
-### Remove the trigger and old `integer` columns (release N + 2)
-
-Using post-deployment migration and the provided `cleanup_conversion_of_integer_to_bigint` helper,
-drop the database trigger and the old `integer` columns ([see an example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69714)).
-
-### Remove ignore rules (release N + 3)
-
-In the next release after the columns were dropped, remove the ignore rules as we do not need them
-anymore ([see an example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71161)).
-
-## Data migrations
-
-Data migrations can be tricky. The usual approach to migrate data is to take a 3
-step approach:
-
-1. Migrate the initial batch of data
-1. Deploy the application code
-1. Migrate any remaining data
-
-Usually this works, but not always. For example, if a field's format is to be
-changed from JSON to something else we have a bit of a problem. If we were to
-change existing data before deploying application code we'll most likely run
-into errors. On the other hand, if we were to migrate after deploying the
-application code we could run into the same problems.
-
-If you merely need to correct some invalid data, then a post-deployment
-migration is usually enough. If you need to change the format of data (for example, from
-JSON to something else) it's typically best to add a new column for the new data
-format, and have the application use that. In such a case the procedure would
-be:
-
-1. Add a new column in the new format
-1. Copy over existing data to this new column
-1. Deploy the application code
-1. In a post-deployment migration, copy over any remaining data
-
-In general there is no one-size-fits-all solution, therefore it's best to
-discuss these kind of migrations in a merge request to make sure they are
-implemented in the best way possible.
+<!-- This redirect file can be deleted after <2022-07-08>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/backend/create_source_code_be/index.md b/doc/development/backend/create_source_code_be/index.md
index 6421ca3754a..8661d8b4d74 100644
--- a/doc/development/backend/create_source_code_be/index.md
+++ b/doc/development/backend/create_source_code_be/index.md
@@ -21,14 +21,12 @@ The team works across three codebases: Workhorse, GitLab Shell and GitLab Rails.
## Workhorse
-GitLab Workhorse is a smart reverse proxy for GitLab. It handles "large" HTTP
+[GitLab Workhorse](../../workhorse/index.md) is a smart reverse proxy for GitLab. It handles "large" HTTP
requests such as file downloads, file uploads, `git push`, `git pull` and `git` archive downloads.
Workhorse itself is not a feature, but there are several features in GitLab
that would not work efficiently without Workhorse.
-Workhorse documentation is available in the [Workhorse repository](https://gitlab.com/gitlab-org/gitlab/tree/master/workhorse).
-
## GitLab Shell
GitLab Shell handles Git SSH sessions for GitLab and modifies the list of authorized keys.
diff --git a/doc/development/background_migrations.md b/doc/development/background_migrations.md
index 9fffbd25518..3c9c34bccf8 100644
--- a/doc/development/background_migrations.md
+++ b/doc/development/background_migrations.md
@@ -1,497 +1,11 @@
---
-type: reference, dev
-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"
+redirect_to: 'database/background_migrations.md'
+remove_date: '2022-07-08'
---
-# Background migrations
+This document was moved to [another location](database/background_migrations.md).
-Background migrations should be used to perform data migrations whenever a
-migration exceeds [the time limits in our guidelines](migration_style_guide.md#how-long-a-migration-should-take). For example, you can use background
-migrations to migrate data that's stored in a single JSON column
-to a separate table instead.
-
-If the database cluster is considered to be in an unhealthy state, background
-migrations automatically reschedule themselves for a later point in time.
-
-## When To Use Background Migrations
-
-You should use a background migration when you migrate _data_ in tables that have
-so many rows that the process would exceed [the time limits in our guidelines](migration_style_guide.md#how-long-a-migration-should-take) if performed using a regular Rails migration.
-
-- Background migrations should be used when migrating data in [high-traffic tables](migration_style_guide.md#high-traffic-tables).
-- Background migrations may also be used when executing numerous single-row queries
-for every item on a large dataset. Typically, for single-record patterns, runtime is
-largely dependent on the size of the dataset, hence it should be split accordingly
-and put into background migrations.
-- Background migrations should not be used to perform schema migrations.
-
-Some examples where background migrations can be useful:
-
-- Migrating events from one table to multiple separate tables.
-- Populating one column based on JSON stored in another column.
-- Migrating data that depends on the output of external services (for example, an API).
-
-NOTE:
-If the background migration is part of an important upgrade, make sure it's announced
-in the release post. Discuss with your Project Manager if you're not sure the migration falls
-into this category.
-
-## Isolation
-
-Background migrations must be isolated and can not use application code (for example,
-models defined in `app/models`). Since these migrations can take a long time to
-run it's possible for new versions to be deployed while they are still running.
-
-It's also possible for different migrations to be executed at the same time.
-This means that different background migrations should not migrate data in a
-way that would cause conflicts.
-
-## Idempotence
-
-Background migrations are executed in a context of a Sidekiq process.
-Usual Sidekiq rules apply, especially the rule that jobs should be small
-and idempotent.
-
-See [Sidekiq best practices guidelines](https://github.com/mperham/sidekiq/wiki/Best-Practices)
-for more details.
-
-Make sure that in case that your migration job is going to be retried data
-integrity is guaranteed.
-
-## Background migrations for EE-only features
-
-All the background migration classes for EE-only features should be present in GitLab CE.
-For this purpose, an empty class can be created for GitLab CE, and it can be extended for GitLab EE
-as explained in the [guidelines for implementing Enterprise Edition features](ee_features.md#code-in-libgitlabbackground_migration).
-
-## How It Works
-
-Background migrations are simple classes that define a `perform` method. A
-Sidekiq worker will then execute such a class, passing any arguments to it. All
-migration classes must be defined in the namespace
-`Gitlab::BackgroundMigration`, the files should be placed in the directory
-`lib/gitlab/background_migration/`.
-
-## Scheduling
-
-Scheduling a background migration should be done in a post-deployment
-migration that includes `Gitlab::Database::MigrationHelpers`
-To do so, simply use the following code while
-replacing the class name and arguments with whatever values are necessary for
-your migration:
-
-```ruby
-migrate_in('BackgroundMigrationClassName', [arg1, arg2, ...])
-```
-
-You can use the function `queue_background_migration_jobs_by_range_at_intervals`
-to automatically split the job into batches:
-
-```ruby
-queue_background_migration_jobs_by_range_at_intervals(
- ClassName,
- BackgroundMigrationClassName,
- 2.minutes,
- batch_size: 10_000
- )
-```
-
-You'll also need to make sure that newly created data is either migrated, or
-saved in both the old and new version upon creation. For complex and time
-consuming migrations it's best to schedule a background job using an
-`after_create` hook so this doesn't affect response timings. The same applies to
-updates. Removals in turn can be handled by simply defining foreign keys with
-cascading deletes.
-
-### Rescheduling background migrations
-
-If one of the background migrations contains a bug that is fixed in a patch
-release, the background migration needs to be rescheduled so the migration would
-be repeated on systems that already performed the initial migration.
-
-When you reschedule the background migration, make sure to turn the original
-scheduling into a no-op by clearing up the `#up` and `#down` methods of the
-migration performing the scheduling. Otherwise the background migration would be
-scheduled multiple times on systems that are upgrading multiple patch releases at
-once.
-
-When you start the second post-deployment migration, you should delete any
-previously queued jobs from the initial migration with the provided
-helper:
-
-```ruby
-delete_queued_jobs('BackgroundMigrationClassName')
-```
-
-## Cleaning Up
-
-NOTE:
-Cleaning up any remaining background migrations _must_ be done in either a major
-or minor release, you _must not_ do this in a patch release.
-
-Because background migrations can take a long time you can't immediately clean
-things up after scheduling them. For example, you can't drop a column that's
-used in the migration process as this would cause jobs to fail. This means that
-you'll need to add a separate _post deployment_ migration in a future release
-that finishes any remaining jobs before cleaning things up (for example, removing a
-column).
-
-As an example, say you want to migrate the data from column `foo` (containing a
-big JSON blob) to column `bar` (containing a string). The process for this would
-roughly be as follows:
-
-1. Release A:
- 1. Create a migration class that performs the migration for a row with a given ID.
- You can use [background jobs tracking](#background-jobs-tracking) to simplify cleaning up.
- 1. Deploy the code for this release, this should include some code that will
- schedule jobs for newly created data (for example, using an `after_create` hook).
- 1. Schedule jobs for all existing rows in a post-deployment migration. It's
- possible some newly created rows may be scheduled twice so your migration
- should take care of this.
-1. Release B:
- 1. Deploy code so that the application starts using the new column and stops
- scheduling jobs for newly created data.
- 1. In a post-deployment migration, finalize all jobs that have not succeeded by now.
- If you used [background jobs tracking](#background-jobs-tracking) in release A,
- you can use `finalize_background_migration` from `BackgroundMigrationHelpers` to ensure no jobs remain.
- This helper will:
- 1. Use `Gitlab::BackgroundMigration.steal` to process any remaining
- jobs in Sidekiq.
- 1. Reschedule the migration to be run directly (that is, not through Sidekiq)
- on any rows that weren't migrated by Sidekiq. This can happen if, for
- instance, Sidekiq received a SIGKILL, or if a particular batch failed
- enough times to be marked as dead.
- 1. Remove `Gitlab::Database::BackgroundMigrationJob` rows where
- `status = succeeded`. To retain diagnostic information that may
- help with future bug tracking you can skip this step by specifying
- the `delete_tracking_jobs: false` parameter.
- 1. Remove the old column.
-
-This may also require a bump to the [import/export version](../user/project/settings/import_export.md), if
-importing a project from a prior version of GitLab requires the data to be in
-the new format.
-
-## Example
-
-To explain all this, let's use the following example: the table `integrations` has a
-field called `properties` which is stored in JSON. For all rows you want to
-extract the `url` key from this JSON object and store it in the `integrations.url`
-column. There are millions of integrations and parsing JSON is slow, thus you can't
-do this in a regular migration.
-
-To do this using a background migration we'll start with defining our migration
-class:
-
-```ruby
-class Gitlab::BackgroundMigration::ExtractIntegrationsUrl
- class Integration < ActiveRecord::Base
- self.table_name = 'integrations'
- end
-
- def perform(start_id, end_id)
- Integration.where(id: start_id..end_id).each do |integration|
- json = JSON.load(integration.properties)
-
- integration.update(url: json['url']) if json['url']
- rescue JSON::ParserError
- # If the JSON is invalid we don't want to keep the job around forever,
- # instead we'll just leave the "url" field to whatever the default value
- # is.
- next
- end
- end
-end
-```
-
-Next we'll need to adjust our code so we schedule the above migration for newly
-created and updated integrations. We can do this using something along the lines of
-the following:
-
-```ruby
-class Integration < ActiveRecord::Base
- after_commit :schedule_integration_migration, on: :update
- after_commit :schedule_integration_migration, on: :create
-
- def schedule_integration_migration
- BackgroundMigrationWorker.perform_async('ExtractIntegrationsUrl', [id, id])
- end
-end
-```
-
-We're using `after_commit` here to ensure the Sidekiq job is not scheduled
-before the transaction completes as doing so can lead to race conditions where
-the changes are not yet visible to the worker.
-
-Next we'll need a post-deployment migration that schedules the migration for
-existing data.
-
-```ruby
-class ScheduleExtractIntegrationsUrl < Gitlab::Database::Migration[1.0]
- disable_ddl_transaction!
-
- MIGRATION = 'ExtractIntegrationsUrl'
- DELAY_INTERVAL = 2.minutes
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- define_batchable_model('integrations'),
- MIGRATION,
- DELAY_INTERVAL)
- end
-
- def down
- end
-end
-```
-
-Once deployed our application will continue using the data as before but at the
-same time will ensure that both existing and new data is migrated.
-
-In the next release we can remove the `after_commit` hooks and related code. We
-will also need to add a post-deployment migration that consumes any remaining
-jobs and manually run on any un-migrated rows. Such a migration would look like
-this:
-
-```ruby
-class ConsumeRemainingExtractIntegrationsUrlJobs < Gitlab::Database::Migration[1.0]
- disable_ddl_transaction!
-
- def up
- # This must be included
- Gitlab::BackgroundMigration.steal('ExtractIntegrationsUrl')
-
- # This should be included, but can be skipped - see below
- define_batchable_model('integrations').where(url: nil).each_batch(of: 50) do |batch|
- range = batch.pluck('MIN(id)', 'MAX(id)').first
-
- Gitlab::BackgroundMigration::ExtractIntegrationsUrl.new.perform(*range)
- end
- end
-
- def down
- end
-end
-```
-
-The final step runs for any un-migrated rows after all of the jobs have been
-processed. This is in case a Sidekiq process running the background migrations
-received SIGKILL, leading to the jobs being lost. (See
-[more reliable Sidekiq queue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36791) for more information.)
-
-If the application does not depend on the data being 100% migrated (for
-instance, the data is advisory, and not mission-critical), then this final step
-can be skipped.
-
-This migration will then process any jobs for the ExtractIntegrationsUrl migration
-and continue once all jobs have been processed. Once done you can safely remove
-the `integrations.properties` column.
-
-## Testing
-
-It is required to write tests for:
-
-- The background migrations' scheduling migration.
-- The background migration itself.
-- A cleanup migration.
-
-The `:migration` and `schema: :latest` RSpec tags are automatically set for
-background migration specs.
-See the
-[Testing Rails migrations](testing_guide/testing_migrations_guide.md#testing-a-non-activerecordmigration-class)
-style guide.
-
-Keep in mind that `before` and `after` RSpec hooks are going
-to migrate you database down and up, which can result in other background
-migrations being called. That means that using `spy` test doubles with
-`have_received` is encouraged, instead of using regular test doubles, because
-your expectations defined in a `it` block can conflict with what is being
-called in RSpec hooks. See [issue #35351](https://gitlab.com/gitlab-org/gitlab/-/issues/18839)
-for more details.
-
-## Best practices
-
-1. Make sure to know how much data you're dealing with.
-1. Make sure that background migration jobs are idempotent.
-1. Make sure that tests you write are not false positives.
-1. Make sure that if the data being migrated is critical and cannot be lost, the
- clean-up migration also checks the final state of the data before completing.
-1. When migrating many columns, make sure it won't generate too many
- dead tuples in the process (you may need to directly query the number of dead tuples
- and adjust the scheduling according to this piece of data).
-1. Make sure to discuss the numbers with a database specialist, the migration may add
- more pressure on DB than you expect (measure on staging,
- or ask someone to measure on production).
-1. Make sure to know how much time it'll take to run all scheduled migrations.
-1. Provide an estimation section in the description, estimating both the total migration
- run time and the query times for each background migration job. Explain plans for each query
- should also be provided.
-
- For example, assuming a migration that deletes data, include information similar to
- the following section:
-
- ```plaintext
- Background Migration Details:
-
- 47600 items to delete
- batch size = 1000
- 47600 / 1000 = 48 batches
-
- Estimated times per batch:
- - 820ms for select statement with 1000 items (see linked explain plan)
- - 900ms for delete statement with 1000 items (see linked explain plan)
- Total: ~2 sec per batch
-
- 2 mins delay per batch (safe for the given total time per batch)
-
- 48 batches * 2 min per batch = 96 mins to run all the scheduled jobs
- ```
-
- The execution time per batch (2 sec in this example) is not included in the calculation
- for total migration time. The jobs are scheduled 2 minutes apart without knowledge of
- the execution time.
-
-## Additional tips and strategies
-
-### Nested batching
-
-A strategy to make the migration run faster is to schedule larger batches, and then use `EachBatch`
-within the background migration to perform multiple statements.
-
-The background migration helpers that queue multiple jobs such as
-`queue_background_migration_jobs_by_range_at_intervals` use [`EachBatch`](iterating_tables_in_batches.md).
-The example above has batches of 1000, where each queued job takes two seconds. If the query has been optimized
-to make the time for the delete statement within the [query performance guidelines](query_performance.md),
-1000 may be the largest number of records that can be deleted in a reasonable amount of time.
-
-The minimum and most common interval for delaying jobs is two minutes. This results in two seconds
-of work for each two minute job. There's nothing that prevents you from executing multiple delete
-statements in each background migration job.
-
-Looking at the example above, you could alternatively do:
-
-```plaintext
-Background Migration Details:
-
-47600 items to delete
-batch size = 10_000
-47600 / 10_000 = 5 batches
-
-Estimated times per batch:
-- Records are updated in sub-batches of 1000 => 10_000 / 1000 = 10 total updates
-- 820ms for select statement with 1000 items (see linked explain plan)
-- 900ms for delete statement with 1000 items (see linked explain plan)
-Sub-batch total: ~2 sec per sub-batch,
-Total batch time: 2 * 10 = 20 sec per batch
-
-2 mins delay per batch
-
-5 batches * 2 min per batch = 10 mins to run all the scheduled jobs
-```
-
-The batch time of 20 seconds still fits comfortably within the two minute delay, yet the total run
-time is cut by a tenth from around 100 minutes to 10 minutes! When dealing with large background
-migrations, this can cut the total migration time by days.
-
-When batching in this way, it is important to look at query times on the higher end
-of the table or relation being updated. `EachBatch` may generate some queries that become much
-slower when dealing with higher ID ranges.
-
-### Delay time
-
-When looking at the batch execution time versus the delay time, the execution time
-should fit comfortably within the delay time for a few reasons:
-
-- To allow for a variance in query times.
-- To allow autovacuum to catch up after periods of high churn.
-
-Never try to optimize by fully filling the delay window even if you are confident
-the queries themselves have no timing variance.
-
-### Background jobs tracking
-
-`queue_background_migration_jobs_by_range_at_intervals` can create records for each job that is scheduled to run.
-You can enable this behavior by passing `track_jobs: true`. Each record starts with a `pending` status. Make sure that your worker updates the job status to `succeeded` by calling `Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded` in the `perform` method of your background migration.
-
-```ruby
-# Background migration code
-
-def perform(start_id, end_id)
- # do work here
-
- mark_job_as_succeeded(start_id, end_id)
-end
-
-private
-
-# Make sure that the arguments passed here match those passed to the background
-# migration
-def mark_job_as_succeeded(*arguments)
- Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
- self.class.name.demodulize,
- arguments
- )
-end
-```
-
-```ruby
-# Post deployment migration
-MIGRATION = 'YourBackgroundMigrationName'
-DELAY_INTERVAL = 2.minutes.to_i # can be different
-BATCH_SIZE = 10_000 # can be different
-
-disable_ddl_transaction!
-
-def up
- queue_background_migration_jobs_by_range_at_intervals(
- define_batchable_model('name_of_the_table_backing_the_model'),
- MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE,
- track_jobs: true
- )
-end
-
-def down
- # no-op
-end
-```
-
-See [`lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb) for a full example.
-
-#### Rescheduling pending jobs
-
-You can reschedule pending migrations from the `background_migration_jobs` table by creating a post-deployment migration and calling `requeue_background_migration_jobs_by_range_at_intervals` with the migration name and delay interval.
-
-```ruby
-# Post deployment migration
-MIGRATION = 'YourBackgroundMigrationName'
-DELAY_INTERVAL = 2.minutes
-
-disable_ddl_transaction!
-
-def up
- requeue_background_migration_jobs_by_range_at_intervals(MIGRATION, DELAY_INTERVAL)
-end
-
-def down
- # no-op
-end
-```
-
-See [`db/post_migrate/20210604070207_retry_backfill_traversal_ids.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/db/post_migrate/20210604070207_retry_backfill_traversal_ids.rb) for a full example.
-
-### Viewing failure error logs
-
-After running a background migration, if any jobs have failed, you can view the logs in [Kibana](https://log.gprd.gitlab.net/goto/5f06a57f768c6025e1c65aefb4075694).
-View the production Sidekiq log and filter for:
-
-- `json.class: BackgroundMigrationWorker`
-- `json.job_status: fail`
-- `json.meta.caller_id: <MyBackgroundMigrationSchedulingMigrationClassName>`
-- `json.args: <MyBackgroundMigrationClassName>`
-
-Looking at the `json.error_class`, `json.error_message` and `json.error_backtrace` values may be helpful in understanding why the jobs failed.
-
-Depending on when and how the failure occurred, you may find other helpful information by filtering with `json.class: <MyBackgroundMigrationClassName>`.
+<!-- This redirect file can be deleted after <2022-07-08>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/batched_background_migrations.md b/doc/development/batched_background_migrations.md
new file mode 100644
index 00000000000..e7703b5dd2b
--- /dev/null
+++ b/doc/development/batched_background_migrations.md
@@ -0,0 +1,319 @@
+---
+type: reference, dev
+stage: Enablement
+group: Database
+info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
+---
+
+# Batched background migrations
+
+Batched Background Migrations should be used to perform data migrations whenever a
+migration exceeds [the time limits](migration_style_guide.md#how-long-a-migration-should-take)
+in our guidelines. For example, you can use batched background
+migrations to migrate data that's stored in a single JSON column
+to a separate table instead.
+
+## When to use batched background migrations
+
+Use a batched background migration when you migrate _data_ in tables containing
+so many rows that the process would exceed
+[the time limits in our guidelines](migration_style_guide.md#how-long-a-migration-should-take)
+if performed using a regular Rails migration.
+
+- Batched background migrations should be used when migrating data in
+ [high-traffic tables](migration_style_guide.md#high-traffic-tables).
+- Batched background migrations may also be used when executing numerous single-row queries
+ for every item on a large dataset. Typically, for single-record patterns, runtime is
+ largely dependent on the size of the dataset. Split the dataset accordingly,
+ and put it into background migrations.
+- Don't use batched background migrations to perform schema migrations.
+
+Background migrations can help when:
+
+- Migrating events from one table to multiple separate tables.
+- Populating one column based on JSON stored in another column.
+- Migrating data that depends on the output of external services. (For example, an API.)
+
+NOTE:
+If the batched background migration is part of an important upgrade, it must be announced
+in the release post. Discuss with your Project Manager if you're unsure if the migration falls
+into this category.
+
+## Isolation
+
+Batched background migrations must be isolated and can not use application code. (For example,
+models defined in `app/models`.). Because these migrations can take a long time to
+run, it's possible for new versions to deploy while the migrations are still running.
+
+## Idempotence
+
+Batched background migrations are executed in a context of a Sidekiq process.
+The usual Sidekiq rules apply, especially the rule that jobs should be small
+and idempotent. Make sure that in case that your migration job is retried, data
+integrity is guaranteed.
+
+See [Sidekiq best practices guidelines](https://github.com/mperham/sidekiq/wiki/Best-Practices)
+for more details.
+
+## Batched background migrations for EE-only features
+
+All the background migration classes for EE-only features should be present in GitLab CE.
+For this purpose, create an empty class for GitLab CE, and extend it for GitLab EE
+as explained in the guidelines for
+[implementing Enterprise Edition features](ee_features.md#code-in-libgitlabbackground_migration).
+
+Batched Background migrations are simple classes that define a `perform` method. A
+Sidekiq worker then executes such a class, passing any arguments to it. All
+migration classes must be defined in the namespace
+`Gitlab::BackgroundMigration`. Place the files in the directory
+`lib/gitlab/background_migration/`.
+
+## Queueing
+
+Queueing a batched background migration should be done in a post-deployment
+migration. Use this `queue_batched_background_migration` example, queueing the
+migration to be executed in batches. Replace the class name and arguments with the values
+from your migration:
+
+```ruby
+queue_batched_background_migration(
+ JOB_CLASS_NAME,
+ TABLE_NAME,
+ JOB_ARGUMENTS,
+ JOB_INTERVAL
+ )
+```
+
+Make sure the newly-created data is either migrated, or
+saved in both the old and new version upon creation. Removals in
+turn can be handled by defining foreign keys with cascading deletes.
+
+### Requeuing batched background migrations
+
+If one of the batched background migrations contains a bug that is fixed in a patch
+release, you must requeue the batched background migration so the migration
+repeats on systems that already performed the initial migration.
+
+When you requeue the batched background migration, turn the original
+queuing into a no-op by clearing up the `#up` and `#down` methods of the
+migration performing the requeuing. Otherwise, the batched background migration is
+queued multiple times on systems that are upgrading multiple patch releases at
+once.
+
+When you start the second post-deployment migration, delete the
+previously batched migration with the provided code:
+
+```ruby
+Gitlab::Database::BackgroundMigration::BatchedMigration
+ .for_configuration(MIGRATION_NAME, TABLE_NAME, COLUMN, JOB_ARGUMENTS)
+ .delete_all
+```
+
+## Cleaning up
+
+NOTE:
+Cleaning up any remaining background migrations must be done in either a major
+or minor release. You must not do this in a patch release.
+
+Because background migrations can take a long time, you can't immediately clean
+things up after queueing them. For example, you can't drop a column used in the
+migration process, as jobs would fail. You must add a separate _post-deployment_
+migration in a future release that finishes any remaining
+jobs before cleaning things up. (For example, removing a column.)
+
+To migrate the data from column `foo` (containing a big JSON blob) to column `bar`
+(containing a string), you would:
+
+1. Release A:
+ 1. Create a migration class that performs the migration for a row with a given ID.
+ 1. Update new rows using one of these techniques:
+ - Create a new trigger for simple copy operations that don't need application logic.
+ - Handle this operation in the model/service as the records are created or updated.
+ - Create a new custom background job that updates the records.
+ 1. Queue the batched background migration for all existing rows in a post-deployment migration.
+1. Release B:
+ 1. Add a post-deployment migration that checks if the batched background migration is completed.
+ 1. Deploy code so that the application starts using the new column and stops to update new records.
+ 1. Remove the old column.
+
+Bump to the [import/export version](../user/project/settings/import_export.md) may
+be required, if importing a project from a prior version of GitLab requires the
+data to be in the new format.
+
+## Example
+
+The table `integrations` has a field called `properties`, stored in JSON. For all rows,
+extract the `url` key from this JSON object and store it in the `integrations.url`
+column. Millions of integrations exist, and parsing JSON is slow, so you can't
+do this work in a regular migration.
+
+1. Start by defining our migration class:
+
+ ```ruby
+ class Gitlab::BackgroundMigration::ExtractIntegrationsUrl
+ class Integration < ActiveRecord::Base
+ self.table_name = 'integrations'
+ end
+
+ def perform(start_id, end_id)
+ Integration.where(id: start_id..end_id).each do |integration|
+ json = JSON.load(integration.properties)
+
+ integration.update(url: json['url']) if json['url']
+ rescue JSON::ParserError
+ # If the JSON is invalid we don't want to keep the job around forever,
+ # instead we'll just leave the "url" field to whatever the default value
+ # is.
+ next
+ end
+ end
+ end
+ ```
+
+ NOTE:
+ To get a `connection` in the batched background migration,use an inheritance
+ relation using the following base class `Gitlab::BackgroundMigration::BaseJob`.
+ For example: `class Gitlab::BackgroundMigration::ExtractIntegrationsUrl < Gitlab::BackgroundMigration::BaseJob`
+
+1. Add a new trigger to the database to update newly created and updated integrations,
+ similar to this example:
+
+ ```ruby
+ execute(<<~SQL)
+ CREATE OR REPLACE FUNCTION example() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+ BEGIN
+ NEW."url" := NEW.properties -> "url"
+ RETURN NEW;
+ END;
+ $$;
+ SQL
+ ```
+
+1. Create a post-deployment migration that queues the migration for existing data:
+
+ ```ruby
+ class QueueExtractIntegrationsUrl < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'ExtractIntegrationsUrl'
+ DELAY_INTERVAL = 2.minutes
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :migrations,
+ :id,
+ job_interval: DELAY_INTERVAL
+ )
+ end
+
+ def down
+ Gitlab::Database::BackgroundMigration::BatchedMigration
+ .for_configuration(MIGRATION, :migrations, :id, []).delete_all
+ end
+ end
+ ```
+
+ After deployment, our application:
+ - Continues using the data as before.
+ - Ensures that both existing and new data are migrated.
+
+1. In the next release, remove the trigger. We must also add a new post-deployment migration
+ that checks that the batched background migration is completed. For example:
+
+ ```ruby
+ class FinalizeExtractIntegrationsUrlJobs < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'ExtractIntegrationsUrl'
+ disable_ddl_transaction!
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: :integrations,
+ column_name: :id,
+ job_arguments: []
+ )
+ end
+
+ def down
+ # no-op
+ end
+ end
+ ```
+
+ If the application does not depend on the data being 100% migrated (for
+ instance, the data is advisory, and not mission-critical), then you can skip this
+ final step. This step confirms that the migration is completed, and all of the rows were migrated.
+
+After the batched migration is completed, you can safely remove the `integrations.properties` column.
+
+## Testing
+
+Writing tests is required for:
+
+- The batched background migrations' queueing migration.
+- The batched background migration itself.
+- A cleanup migration.
+
+The `:migration` and `schema: :latest` RSpec tags are automatically set for
+background migration specs. Refer to the
+[Testing Rails migrations](testing_guide/testing_migrations_guide.md#testing-a-non-activerecordmigration-class)
+style guide.
+
+Remember that `before` and `after` RSpec hooks
+migrate your database down and up. These hooks can result in other batched background
+migrations being called. Using `spy` test doubles with
+`have_received` is encouraged, instead of using regular test doubles, because
+your expectations defined in a `it` block can conflict with what is
+called in RSpec hooks. Refer to [issue #35351](https://gitlab.com/gitlab-org/gitlab/-/issues/18839)
+for more details.
+
+## Best practices
+
+1. Know how much data you're dealing with.
+1. Make sure the batched background migration jobs are idempotent.
+1. Confirm the tests you write are not false positives.
+1. If the data being migrated is critical and cannot be lost, the
+ clean-up migration must also check the final state of the data before completing.
+1. Discuss the numbers with a database specialist. The migration may add
+ more pressure on DB than you expect. Measure on staging,
+ or ask someone to measure on production.
+1. Know how much time is required to run the batched background migration.
+
+## Additional tips and strategies
+
+### Viewing failure error logs
+
+You can view failures in two ways:
+
+- Via GitLab logs:
+ 1. After running a batched background migration, if any jobs fail,
+ view the logs in [Kibana](https://log.gprd.gitlab.net/goto/5f06a57f768c6025e1c65aefb4075694).
+ View the production Sidekiq log and filter for:
+
+ - `json.new_state: failed`
+ - `json.job_class_name: <Batched Background Migration job class name>`
+ - `json.job_arguments: <Batched Background Migration job class arguments>`
+
+ 1. Review the `json.exception_class` and `json.exception_message` values to help
+ understand why the jobs failed.
+
+ 1. Remember the retry mechanism. Having a failure does not mean the job failed.
+ Always check the last status of the job.
+
+- Via database:
+
+ 1. Get the batched background migration `CLASS_NAME`.
+ 1. Execute the following query in the PostgreSQL console:
+
+ ```sql
+ SELECT migration.id, migration.job_class_name, transition_logs.exception_class, transition_logs.exception_message
+ FROM batched_background_migrations as migration
+ INNER JOIN batched_background_migration_jobs as jobs
+ ON jobs.batched_background_migration_id = migration.id
+ INNER JOIN batched_background_migration_job_transition_logs as transition_logs
+ ON transition_logs.batched_background_migration_job_id = jobs.id
+ WHERE transition_logs.next_status = '2' AND migration.job_class_name = "CLASS_NAME";
+ ```
diff --git a/doc/development/cached_queries.md b/doc/development/cached_queries.md
index 492c8d13600..8c69981b27a 100644
--- a/doc/development/cached_queries.md
+++ b/doc/development/cached_queries.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Enablement
+group: Memory
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/development/chatops_on_gitlabcom.md b/doc/development/chatops_on_gitlabcom.md
index 26fcf520393..e18fcb0061b 100644
--- a/doc/development/chatops_on_gitlabcom.md
+++ b/doc/development/chatops_on_gitlabcom.md
@@ -25,6 +25,7 @@ To request access to ChatOps on GitLab.com:
- The same username you use on GitLab.com. You may have to choose a different
username later.
- Clicking the **Sign in with Google** button to sign in with your GitLab.com email address.
+ - Clicking the **Sign in with Okta** button to sign in with Okta.
1. Confirm that your username in [Internal GitLab for Operations](https://ops.gitlab.net/)
is the same as your username in [GitLab.com](https://gitlab.com/). If the usernames
diff --git a/doc/development/cicd/schema.md b/doc/development/cicd/schema.md
index b63d951b881..0e456a25a7a 100644
--- a/doc/development/cicd/schema.md
+++ b/doc/development/cicd/schema.md
@@ -5,26 +5,26 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index, howto
---
-# Contribute to the CI Schema **(FREE)**
+# Contribute to the CI/CD Schema **(FREE)**
-The [pipeline editor](../../ci/pipeline_editor/index.md) uses a CI schema to enhance
-the authoring experience of our CI configuration files. With the CI schema, the editor can:
+The [pipeline editor](../../ci/pipeline_editor/index.md) uses a CI/CD schema to enhance
+the authoring experience of our CI/CD configuration files. With the CI/CD schema, the editor can:
-- Validate the content of the CI configuration file as it is being written in the editor.
+- Validate the content of the CI/CD configuration file as it is being written in the editor.
- Provide autocomplete functionality and suggest available keywords.
- Provide definitions of keywords through annotations.
-As the rules and keywords for configuring our CI configuration files change, so too
-should our CI schema.
+As the rules and keywords for configuring our CI/CD configuration files change, so too
+should our CI/CD schema.
This feature is behind the [`schema_linting`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/feature_flags/development/schema_linting.yml)
feature flag for self-managed instances, and is enabled for GitLab.com.
## JSON Schemas
-The CI schema follows the [JSON Schema Draft-07](https://json-schema.org/draft-07/json-schema-release-notes.html)
-specification. Although the CI configuration file is written in YAML, it is converted
-into JSON by using `monaco-yaml` before it is validated by the CI schema.
+The CI/CD schema follows the [JSON Schema Draft-07](https://json-schema.org/draft-07/json-schema-release-notes.html)
+specification. Although the CI/CD configuration file is written in YAML, it is converted
+into JSON by using `monaco-yaml` before it is validated by the CI/CD schema.
If you're new to JSON schemas, consider checking out
[this guide](https://json-schema.org/learn/getting-started-step-by-step) for
@@ -32,8 +32,8 @@ a step-by-step introduction on how to work with JSON schemas.
## Update Keywords
-The CI schema is at [`app/assets/javascripts/editor/schema/ci.json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/editor/schema/ci.json).
-It contains all the keywords available for authoring CI configuration files.
+The CI/CD schema is at [`app/assets/javascripts/editor/schema/ci.json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/editor/schema/ci.json).
+It contains all the keywords available for authoring CI/CD configuration files.
Check the [keyword reference](../../ci/yaml/index.md) for a comprehensive list of
all available keywords.
@@ -138,9 +138,72 @@ under the topmost **properties** key.
## Test the schema
-For now, the CI schema can only be tested manually. To verify the behavior is correct:
+### Verify changes
1. Enable the `schema_linting` feature flag.
1. Go to **CI/CD** > **Editor**.
1. Write your CI/CD configuration in the editor and verify that the schema validates
it correctly.
+
+### Write specs
+
+All of the CI/CD schema specs are in [`spec/frontend/editor/schema/ci`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/spec/frontend/editor/schema/ci).
+Legacy tests are in JSON, but we recommend writing all new tests in YAML.
+You can write them as if you're adding a new `.gitlab-ci.yml` configuration file.
+
+Tests are separated into **positive** tests and **negative** tests. Positive tests
+are snippets of CI/CD configuration code that use the schema keywords as intended.
+Conversely, negative tests give examples of the schema keywords being used incorrectly.
+These tests ensure that the schema validates different examples of input as expected.
+
+`ci_schema_spec.js` is responsible for running all of the tests against the schema.
+
+A detailed explanation of how the tests are set up can be found in this
+[merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83047).
+
+#### Update schema specs
+
+If a YAML test does not exist for the specified keyword, create new files in
+`yaml_tests/positive_tests` and `yaml_tests/negative_tests`. Otherwise, you can update
+the existing tests:
+
+1. Write both positive and negative tests to validate different kinds of input.
+1. If you created new files, import them in `ci_schema_spec.js` and add each file to their
+ corresponding object entries. For example:
+
+ ```javascript
+ import CacheYaml from './yaml_tests/positive_tests/cache.yml';
+ import CacheNegativeYaml from './yaml_tests/negative_tests/cache.yml';
+
+ // import your new test files
+ import NewKeywordTestYaml from './yaml_tests/positive_tests/cache.yml';
+ import NewKeywordTestNegativeYaml from './yaml_tests/negative_tests/cache.yml';
+
+ describe('positive tests', () => {
+ it.each(
+ Object.entries({
+ CacheYaml,
+ NewKeywordTestYaml, // add positive test here
+ }),
+ )('schema validates %s', (_, input) => {
+ expect(input).toValidateJsonSchema(schema);
+ });
+ });
+
+ describe('negative tests', () => {
+ it.each(
+ Object.entries({
+ CacheNegativeYaml,
+ NewKeywordTestYaml, // add negative test here
+ }),
+ )('schema validates %s', (_, input) => {
+ expect(input).not.toValidateJsonSchema(schema);
+ });
+ });
+ ```
+
+1. Run the command `yarn jest spec/frontend/editor/schema/ci/ci_schema_spec.js`
+ and verify that all the tests successfully pass.
+
+If the spec covers a change to an existing keyword and it affects the legacy JSON
+tests, update them as well.
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index ec913df8e4a..48bbe4c60ba 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -74,17 +74,13 @@ It picks reviewers and maintainers from the list at the
page, with these behaviors:
1. It doesn't pick people whose Slack or [GitLab status](../user/profile/index.md#set-your-current-status):
- - Contains the string 'OOO', 'PTO', 'Parental Leave', or 'Friends and Family'.
+ - Contains the string `OOO`, `PTO`, `Parental Leave`, or `Friends and Family`.
- GitLab user **Busy** indicator is set to `True`.
- - Emoji is any of:
- - 🌴 `:palm_tree:`
- - ðŸ–ï¸ `:beach:`, `:beach_umbrella:`, or `:beach_with_umbrella:`
- - 🎡 `:ferris_wheel:`
- - ðŸŒ¡ï¸ `:thermometer:`
- - 🤒 `:face_with_thermometer:`
- - 🔴 `:red_circle:`
- - 💡 `:bulb:`
- - 🌞 `:sun_with_face:`
+ - Emoji is from one of these categories:
+ - **On leave** - 🌴 `:palm_tree:`, ðŸ–ï¸ `:beach:`, â›± `:beach_umbrella:`, 🖠`:beach_with_umbrella:`, 🌞 `:sun_with_face:`, 🎡 `:ferris_wheel:`
+ - **Out sick** - ðŸŒ¡ï¸ `:thermometer:`, 🤒 `:face_with_thermometer:`
+ - **At capacity** - 🔴 `:red_circle:`
+ - **Focus mode** - 💡 `:bulb:` (focusing on their team's work)
1. [Trainee maintainers](https://about.gitlab.com/handbook/engineering/workflow/code-review/#trainee-maintainer)
are three times as likely to be picked as other reviewers.
1. Team members whose Slack or [GitLab status](../user/profile/index.md#set-your-current-status) emoji
@@ -92,12 +88,22 @@ page, with these behaviors:
- Reviewers with 🔵 `:large_blue_circle:` are two times as likely to be picked as other reviewers.
- Trainee maintainers with 🔵 `:large_blue_circle:` are four times as likely to be picked as other reviewers.
1. People whose [GitLab status](../user/profile/index.md#set-your-current-status) emoji
- is 🔶 `:large_orange_diamond:` or 🔸 `:small_orange_diamond:` are half as likely to be picked. This applies to both reviewers and trainee maintainers.
+ is 🔶 `:large_orange_diamond:` or 🔸 `:small_orange_diamond:` are half as likely to be picked.
1. It always picks the same reviewers and maintainers for the same
branch name (unless their out-of-office (OOO) status changes, as in point 1). It
removes leading `ce-` and `ee-`, and trailing `-ce` and `-ee`, so
that it can be stable for backport branches.
+The [Roulette dashboard](https://gitlab-org.gitlab.io/gitlab-roulette) contains:
+
+- Assignment events in the last 7 and 30 days.
+- Currently assigned merge requests per person.
+- Sorting by different criteria.
+- A manual reviewer roulette.
+- Local time information.
+
+For more information, review [the roulette README](https://gitlab.com/gitlab-org/gitlab-roulette).
+
### Approval guidelines
As described in the section on the responsibility of the maintainer below, you
@@ -136,6 +142,7 @@ with [domain expertise](#domain-experts).
1. If your merge request includes Product Intelligence (telemetry or analytics) changes, it should be reviewed and approved by a [Product Intelligence engineer](https://gitlab.com/gitlab-org/growth/product-intelligence/engineers).
1. If your merge request includes an addition of, or changes to a [Feature spec](testing_guide/testing_levels.md#frontend-feature-tests), it must be **approved by a [Quality maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_qa) or [Quality reviewer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_reviewers_qa)**.
1. If your merge request introduces a new service to GitLab (Puma, Sidekiq, Gitaly are examples), it must be **approved by a [product manager](https://about.gitlab.com/company/team/)**. See the [process for adding a service component to GitLab](adding_service_component.md) for details.
+1. If your merge request includes changes related to authentication or authorization, it must be **approved by a [Manage:Authentication and Authorization team member](https://about.gitlab.com/company/team/)**. Check the [code review section on the group page](https://about.gitlab.com/handbook/engineering/development/dev/manage/authentication-and-authorization/#additional-considerations) for more details. Patterns for files known to require review from the team are listed in the in the `Authentication and Authorization` section of the [`CODEOWNERS`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/CODEOWNERS) file, and the team will be listed in the approvers section of all merge requests that modify these files.
- (*1*): Specs other than JavaScript specs are considered backend code.
- (*2*): We encourage you to seek guidance from a database maintainer if your merge
@@ -154,7 +161,7 @@ Using checklists improves quality in software engineering. This checklist is a s
##### Quality
-See the [test engineering process](https://about.gitlab.com/handbook/engineering/quality/test-engineering/) for further quality guidelines.
+See the [test engineering process](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/test-engineering/) for further quality guidelines.
1. I have self-reviewed this MR per [code review guidelines](code_review.md).
1. For the code that this change impacts, I believe that the automated tests ([Testing Guide](testing_guide/index.md)) validate functionality that is highly important to users (including consideration of [all test levels](testing_guide/testing_levels.md)).
@@ -240,6 +247,8 @@ warrant a comment could be:
- Any benchmarking performed to complement the change.
- Potentially insecure code.
+If there are any projects, snippets, or other assets that are required for a reviewer to validate the solution, ensure they have access to those assets before requesting review.
+
Avoid:
- Adding TODO comments (referenced above) directly to the source code unless the reviewer requires
@@ -249,7 +258,7 @@ Avoid:
[_explain why, not what_](https://blog.codinghorror.com/code-tells-you-how-comments-tell-you-why/).
- Requesting maintainer reviews of merge requests with failed tests. If the tests are failing and you have to request a review, ensure you leave a comment with an explanation.
- Excessively mentioning maintainers through email or Slack (if the maintainer is reachable
-through Slack). If you can't add a reviewer for a merge request, `@` mentioning a maintainer in a comment is acceptable and in all other cases adding a reviewer is sufficient.
+through Slack). If you can't add a reviewer for a merge request, it's acceptable to `@` mention a maintainer in a comment. In all other cases, it's sufficient to add a reviewer or [request their attention](../user/project/merge_requests/index.md#request-attention-to-a-merge-request) if they're already a reviewer.
This saves reviewers time and helps authors catch mistakes earlier.
@@ -259,10 +268,8 @@ This saves reviewers time and helps authors catch mistakes earlier.
that it meets all requirements, you should:
- Click the Approve button.
-- `@` mention the author to generate a to-do notification, and advise them that their merge request has been reviewed and approved.
-- Request a review from a maintainer. Default to requests for a maintainer with [domain expertise](#domain-experts),
+- Request a review from a maintainer or [request their attention](../user/project/merge_requests/index.md#request-attention-to-a-merge-request) if they're already a reviewer. Default to requests for a maintainer with [domain expertise](#domain-experts),
however, if one isn't available or you think the merge request doesn't need a review by a [domain expert](#domain-experts), feel free to follow the [Reviewer roulette](#reviewer-roulette) suggestion.
-- Remove yourself as a reviewer.
### The responsibility of the maintainer
@@ -290,7 +297,7 @@ If a developer who happens to also be a maintainer was involved in a merge reque
as a reviewer, it is recommended that they are not also picked as the maintainer to ultimately approve and merge it.
Maintainers should check before merging if the merge request is approved by the
-required approvers. If still awaiting further approvals from others, remove yourself as a reviewer then `@` mention the author and explain why in a comment. Stay as reviewer if you're merging the code.
+required approvers. If still awaiting further approvals from others, explain that in a comment and [request attention](../user/project/merge_requests/index.md#request-attention-to-a-merge-request) from other reviewers as appropriate. Do not remove yourself as a reviewer.
Maintainers must check before merging if the merge request is introducing new
vulnerabilities, by inspecting the list in the merge request
@@ -312,14 +319,20 @@ After merging, a maintainer should stay as the reviewer listed on the merge requ
### Dogfooding the Reviewers feature
-On March 18th 2021, an updated process was put in place aimed at efficiently and consistently dogfooding the Reviewers feature.
+Replaced with [dogfooding the attention request feature](#dogfooding-the-attention-request-feature).
+
+### Dogfooding the attention request feature
+
+In March of 2022, an updated process was put in place aimed at efficiently and consistently dogfooding the
+[attention requests feature](../user/project/merge_requests/index.md#request-attention-to-a-merge-request) under `Merge requests` -> `Need your attention`. This replaces previous guidance on [dogfooding the reviewers feature](#dogfooding-the-reviewers-feature).
Here is a summary of the changes, also reflected in this section above.
-- Merge request authors and DRIs stay as Assignees
-- Authors request a review from Reviewers when they are expected to review
-- Reviewers remove themselves after they're done reviewing/approving
-- The last approver stays as Reviewer upon merging
+- Merge request authors and DRIs stay as assignees
+- Assignees request a review from reviewer(s) when they are expected to review
+- Reviewers stay assigned for the entire duration of the merge request
+- Reviewers request attention from the assignee or other reviewer(s) after they've done reviewing, depending on who needs to take action
+- Assignees request attention from the reviewer(s) when changes are made
## Best practices
@@ -392,6 +405,11 @@ When you are ready to have your merge request reviewed,
you should [request an initial review](../user/project/merge_requests/getting_started.md#reviewer) by selecting a reviewer from your group or team.
However, you can also assign it to any reviewer. The list of reviewers can be found on [Engineering projects](https://about.gitlab.com/handbook/engineering/projects/) page.
+When a merge request has multiple areas for review, it is recommended you specify which area a reviewer should be reviewing, and at which stage (first or second).
+This will help team members who qualify as a reviewer for multiple areas to know which area they're being requested to review.
+For example, when a merge request has both `backend` and `frontend` concerns, you can mention the reviewer in this manner:
+`@john_doe can you please review ~backend?` or `@jane_doe - could you please give this MR a ~frontend maintainer review?`
+
You can also use `workflow::ready for review` label. That means that your merge request is ready to be reviewed and any reviewer can pick it. It is recommended to use that label only if there isn't time pressure and make sure the merge request is assigned to a reviewer.
When your merge request receives an approval from the first reviewer it can be passed to a maintainer. You should default to choosing a maintainer with [domain expertise](#domain-experts), and otherwise follow the Reviewer Roulette recommendation or use the label `ready for merge`.
@@ -605,9 +623,9 @@ Enterprise Edition instance. This has some implications:
migration on the staging environment if you aren't sure.
1. Categorized correctly:
- Regular migrations run before the new code is running on the instance.
- - [Post-deployment migrations](post_deployment_migrations.md) run _after_
+ - [Post-deployment migrations](database/post_deployment_migrations.md) run _after_
the new code is deployed, when the instance is configured to do that.
- - [Background migrations](background_migrations.md) run in Sidekiq, and
+ - [Background migrations](database/background_migrations.md) run in Sidekiq, and
should only be done for migrations that would take an extreme amount of
time at GitLab.com scale.
1. **Sidekiq workers** [cannot change in a backwards-incompatible way](sidekiq/compatibility_across_updates.md):
diff --git a/doc/development/contributing/design.md b/doc/development/contributing/design.md
index 463a7ee0e0b..def39a960d8 100644
--- a/doc/development/contributing/design.md
+++ b/doc/development/contributing/design.md
@@ -49,7 +49,7 @@ Check these aspects both when _designing_ and _reviewing_ UI changes.
### 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)).
+[Firefox](https://firefox-source-docs.mozilla.org/devtools-user/page_inspector/how_to/open_the_inspector/index.html)).
- Use recommended [colors](https://design.gitlab.com/product-foundations/colors/)
and [typography](https://design.gitlab.com/product-foundations/type-fundamentals/).
@@ -66,7 +66,7 @@ Check visual design properties using your browser's _elements inspector_ ([Chrom
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)).
+[Firefox](https://firefox-source-docs.mozilla.org/devtools-user/page_inspector/how_to/examine_and_edit_css/index.html#viewing-common-pseudo-classes)).
- Account for all applicable states ([error](https://design.gitlab.com/content/error-messages),
rest, loading, focus, hover, selected, disabled).
@@ -78,7 +78,7 @@ like `:hover` and others ([Chrome](https://developer.chrome.com/docs/devtools/cs
### 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)).
+[Firefox](https://firefox-source-docs.mozilla.org/devtools-user/responsive_design_mode/index.html)).
- Account for resizing, collapsing, moving, or wrapping of elements across
all breakpoints (even if larger viewports are prioritized).
@@ -99,7 +99,7 @@ Check accessibility using your browser's _accessibility inspector_ ([Chrome](htt
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).
+ link or [GitLab Designs feature](../../user/project/issues/design_management.md).
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.
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index 4db686b9b1e..fe1549e7f34 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -31,11 +31,7 @@ on those issues. Please select someone with relevant experience from the
If there is nobody mentioned with that expertise, look in the commit history for
the affected files to find someone.
-We also use [GitLab Triage](https://gitlab.com/gitlab-org/gitlab-triage) to automate
-some triaging policies. This is currently set up as a scheduled pipeline
-(`https://gitlab.com/gitlab-org/quality/triage-ops/-/pipeline_schedules/10512/edit`,
-must have at least the Developer role in the project) running on [quality/triage-ops](https://gitlab.com/gitlab-org/quality/triage-ops)
-project.
+We also have triage automation in place, described [in our handbook](https://about.gitlab.com/handbook/engineering/quality/triage-operations/).
## Labels
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index a9b4d13ab06..5ed0885eed9 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -144,7 +144,7 @@ document from the Kubernetes team also has some great points regarding this.
### Commit messages guidelines
-Commit messages should follow the guidelines below, for reasons explained by Chris Beams in [How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/):
+Commit messages should follow the guidelines below, for reasons explained by Chris Beams in [How to Write a Git Commit Message](https://cbea.ms/git-commit/):
- The commit subject and body must be separated by a blank line.
- The commit subject must start with a capital letter.
@@ -203,7 +203,7 @@ Example commit message template that can be used on your machine that embodies t
# Do not use Emojis
# Use the body to explain what and why vs. how
# Can use multiple lines with "-" for bullet points in body
-# For more information: https://chris.beams.io/posts/git-commit/
+# For more information: https://cbea.ms/git-commit/
# --------------------
```
@@ -286,8 +286,8 @@ requirements.
### 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](https://about.gitlab.com/handbook/engineering/development/processes/rollout-plans) has been completed.
+1. Confirmed to be working in the production with no new [Sentry](https://about.gitlab.com/handbook/engineering/monitoring/#sentry) errors after the contribution is deployed.
+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/contributing/verify/index.md b/doc/development/contributing/verify/index.md
index a2bb0eca733..828eb0a9598 100644
--- a/doc/development/contributing/verify/index.md
+++ b/doc/development/contributing/verify/index.md
@@ -55,7 +55,7 @@ and they serve us and our users well. Some examples of these principles are that
- Feedback needs to be available when a user needs it and data can not disappear unexpectedly when engineers need it.
- It all doesn’t matter if the platform is not secure and we
are leaking credentials or secrets.
-- When a user provides a set of preconditions in a form of CI/CD configuration, the result should be deterministic each time a pipeline runs, because otherwise the platform might not be trustworthy.
+- When a user provides a set of preconditions in a form of CI/CD configuration, the result should be deterministic each time a pipeline runs, because otherwise the platform might not be trustworthy.
- If it is fast, simple to use and has a great UX it will serve our users well.
## Building things in Verify
@@ -189,8 +189,7 @@ Slack channel (GitLab team members only).
After your merge request is merged by a maintainer, it is time to release it to
users and the wider community. We usually do this with feature flags.
While not every merge request needs a feature flag, most merge
-requests in Verify should have feature flags. [**TODO** link to docs about what
-needs a feature flag and what doesn’t].
+requests in Verify should have [feature flags](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#when-to-use-feature-flags).
If you already follow the advice on this page, you probably already have a
few metrics and perhaps a few loggers added that make your new code observable
diff --git a/doc/development/dangerbot.md b/doc/development/dangerbot.md
index 9bf0fbe1d78..f941e0720c6 100644
--- a/doc/development/dangerbot.md
+++ b/doc/development/dangerbot.md
@@ -142,7 +142,7 @@ To enable the Dangerfile on another existing GitLab project, complete the follow
1. Create a `Dangerfile` with the following content:
```ruby
- require_relative "lib/gitlab-dangerfiles"
+ require "gitlab-dangerfiles"
Gitlab::Dangerfiles.for_project(self, &:import_defaults)
```
@@ -154,6 +154,8 @@ To enable the Dangerfile on another existing GitLab project, complete the follow
- project: 'gitlab-org/quality/pipeline-common'
file:
- '/ci/danger-review.yml'
+ rules:
+ - if: '$CI_SERVER_HOST == "gitlab.com"'
```
1. If your project is in the `gitlab-org` group, you don't need to set up any token as the `DANGER_GITLAB_API_TOKEN`
diff --git a/doc/development/database/add_foreign_key_to_existing_column.md b/doc/development/database/add_foreign_key_to_existing_column.md
index d74f826cc14..bfd455ef9da 100644
--- a/doc/development/database/add_foreign_key_to_existing_column.md
+++ b/doc/development/database/add_foreign_key_to_existing_column.md
@@ -123,7 +123,7 @@ end
Validating the foreign key scans the whole table and makes sure that each relation is correct.
NOTE:
-When using [background migrations](../background_migrations.md), foreign key validation should happen in the next GitLab release.
+When using [background migrations](background_migrations.md), foreign key validation should happen in the next GitLab release.
Migration file for validating the foreign key:
diff --git a/doc/development/database/avoiding_downtime_in_migrations.md b/doc/development/database/avoiding_downtime_in_migrations.md
new file mode 100644
index 00000000000..ad2768397e6
--- /dev/null
+++ b/doc/development/database/avoiding_downtime_in_migrations.md
@@ -0,0 +1,491 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Avoiding downtime in migrations
+
+When working with a database certain operations may require downtime. Since we
+cannot have downtime in migrations we need to use a set of steps to get the
+same end result without downtime. This guide describes various operations that
+may appear to need downtime, their impact, and how to perform them without
+requiring downtime.
+
+## Dropping Columns
+
+Removing columns is tricky because running GitLab processes may still be using
+the columns. To work around this safely, you will need three steps in three releases:
+
+1. Ignoring the column (release M)
+1. Dropping the column (release M+1)
+1. Removing the ignore rule (release M+2)
+
+The reason we spread this out across three releases is that dropping a column is
+a destructive operation that can't be rolled back easily.
+
+Following this procedure helps us to make sure there are no deployments to GitLab.com
+and upgrade processes for self-managed installations that lump together any of these steps.
+
+### Step 1: Ignoring the column (release M)
+
+The first step is to ignore the column in the application code. This is
+necessary because Rails caches the columns and re-uses this cache in various
+places. This can be done by defining the columns to ignore. For example, to ignore
+`updated_at` in the User model you'd use the following:
+
+```ruby
+class User < ApplicationRecord
+ include IgnorableColumns
+ ignore_column :updated_at, remove_with: '12.7', remove_after: '2020-01-22'
+end
+```
+
+Multiple columns can be ignored, too:
+
+```ruby
+ignore_columns %i[updated_at created_at], remove_with: '12.7', remove_after: '2020-01-22'
+```
+
+If the model exists in CE and EE, the column has to be ignored in the CE model. If the
+model only exists in EE, then it has to be added there.
+
+We require indication of when it is safe to remove the column ignore with:
+
+- `remove_with`: set to a GitLab release typically two releases (M+2) after adding the
+ column ignore.
+- `remove_after`: set to a date after which we consider it safe to remove the column
+ ignore, typically after the M+1 release date, during the M+2 development cycle.
+
+This information allows us to reason better about column ignores and makes sure we
+don't remove column ignores too early for both regular releases and deployments to GitLab.com. For
+example, this avoids a situation where we deploy a bulk of changes that include both changes
+to ignore the column and subsequently remove the column ignore (which would result in a downtime).
+
+In this example, the change to ignore the column went into release 12.5.
+
+### Step 2: Dropping the column (release M+1)
+
+Continuing our example, dropping the column goes into a _post-deployment_ migration in release 12.6:
+
+```ruby
+ remove_column :user, :updated_at
+```
+
+### Step 3: Removing the ignore rule (release M+2)
+
+With the next release, in this example 12.7, we set up another merge request to remove the ignore rule.
+This removes the `ignore_column` line and - if not needed anymore - also the inclusion of `IgnoreableColumns`.
+
+This should only get merged with the release indicated with `remove_with` and once
+the `remove_after` date has passed.
+
+## Renaming Columns
+
+Renaming columns the normal way requires downtime as an application may continue
+using the old column name during/after a database migration. To rename a column
+without requiring downtime we need two migrations: a regular migration, and a
+post-deployment migration. Both these migration can go in the same release.
+
+### Step 1: Add The Regular Migration
+
+First we need to create the regular migration. This migration should use
+`Gitlab::Database::MigrationHelpers#rename_column_concurrently` to perform the
+renaming. For example
+
+```ruby
+# A regular migration in db/migrate
+class RenameUsersUpdatedAtToUpdatedAtTimestamp < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ rename_column_concurrently :users, :updated_at, :updated_at_timestamp
+ end
+
+ def down
+ undo_rename_column_concurrently :users, :updated_at, :updated_at_timestamp
+ end
+end
+```
+
+This will take care of renaming the column, ensuring data stays in sync, and
+copying over indexes and foreign keys.
+
+If a column contains one or more indexes that don't contain the name of the
+original column, the previously described procedure will fail. In that case,
+you'll first need to rename these indexes.
+
+### Step 2: Add A Post-Deployment Migration
+
+The renaming procedure requires some cleaning up in a post-deployment migration.
+We can perform this cleanup using
+`Gitlab::Database::MigrationHelpers#cleanup_concurrent_column_rename`:
+
+```ruby
+# A post-deployment migration in db/post_migrate
+class CleanupUsersUpdatedAtRename < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ cleanup_concurrent_column_rename :users, :updated_at, :updated_at_timestamp
+ end
+
+ def down
+ undo_cleanup_concurrent_column_rename :users, :updated_at, :updated_at_timestamp
+ end
+end
+```
+
+If you're renaming a [large table](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml#L3), please carefully consider the state when the first migration has run but the second cleanup migration hasn't been run yet.
+With [Canary](https://gitlab.com/gitlab-com/gl-infra/readiness/-/tree/master/library/canary/) it is possible that the system runs in this state for a significant amount of time.
+
+## Changing Column Constraints
+
+Adding or removing a `NOT NULL` clause (or another constraint) can typically be
+done without requiring downtime. However, this does require that any application
+changes are deployed _first_. Thus, changing the constraints of a column should
+happen in a post-deployment migration.
+
+Avoid using `change_column` as it produces an inefficient query because it re-defines
+the whole column type.
+
+You can check the following guides for each specific use case:
+
+- [Adding foreign-key constraints](../migration_style_guide.md#adding-foreign-key-constraints)
+- [Adding `NOT NULL` constraints](not_null_constraints.md)
+- [Adding limits to text columns](strings_and_the_text_data_type.md)
+
+## Changing Column Types
+
+Changing the type of a column can be done using
+`Gitlab::Database::MigrationHelpers#change_column_type_concurrently`. This
+method works similarly to `rename_column_concurrently`. For example, let's say
+we want to change the type of `users.username` from `string` to `text`.
+
+### Step 1: Create A Regular Migration
+
+A regular migration is used to create a new column with a temporary name along
+with setting up some triggers to keep data in sync. Such a migration would look
+as follows:
+
+```ruby
+# A regular migration in db/migrate
+class ChangeUsersUsernameStringToText < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ change_column_type_concurrently :users, :username, :text
+ end
+
+ def down
+ undo_change_column_type_concurrently :users, :username
+ end
+end
+```
+
+### Step 2: Create A Post Deployment Migration
+
+Next we need to clean up our changes using a post-deployment migration:
+
+```ruby
+# A post-deployment migration in db/post_migrate
+class ChangeUsersUsernameStringToTextCleanup < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ cleanup_concurrent_column_type_change :users, :username
+ end
+
+ def down
+ undo_cleanup_concurrent_column_type_change :users, :username, :string
+ end
+end
+```
+
+And that's it, we're done!
+
+### Casting data to a new type
+
+Some type changes require casting data to a new type. For example when changing from `text` to `jsonb`.
+In this case, use the `type_cast_function` option.
+Make sure there is no bad data and the cast will always succeed. You can also provide a custom function that handles
+casting errors.
+
+Example migration:
+
+```ruby
+ def up
+ change_column_type_concurrently :users, :settings, :jsonb, type_cast_function: 'jsonb'
+ end
+```
+
+## Changing The Schema For Large Tables
+
+While `change_column_type_concurrently` and `rename_column_concurrently` can be
+used for changing the schema of a table without downtime, it doesn't work very
+well for large tables. Because all of the work happens in sequence the migration
+can take a very long time to complete, preventing a deployment from proceeding.
+They can also produce a lot of pressure on the database due to it rapidly
+updating many rows in sequence.
+
+To reduce database pressure you should instead use a background migration
+when migrating a column in a large table (for example, `issues`). This will
+spread the work / load over a longer time period, without slowing down deployments.
+
+For more information, see [the documentation on cleaning up background
+migrations](background_migrations.md#cleaning-up).
+
+## Adding Indexes
+
+Adding indexes does not require downtime when `add_concurrent_index`
+is used.
+
+See also [Migration Style Guide](../migration_style_guide.md#adding-indexes)
+for more information.
+
+## Dropping Indexes
+
+Dropping an index does not require downtime.
+
+## Adding Tables
+
+This operation is safe as there's no code using the table just yet.
+
+## Dropping Tables
+
+Dropping tables can be done safely using a post-deployment migration, but only
+if the application no longer uses the table.
+
+## Renaming Tables
+
+Renaming tables requires downtime as an application may continue
+using the old table name during/after a database migration.
+
+If the table and the ActiveRecord model is not in use yet, removing the old
+table and creating a new one is the preferred way to "rename" the table.
+
+Renaming a table is possible without downtime by following our multi-release
+[rename table process](rename_database_tables.md#rename-table-without-downtime).
+
+## Adding Foreign Keys
+
+Adding foreign keys usually works in 3 steps:
+
+1. Start a transaction
+1. Run `ALTER TABLE` to add the constraint(s)
+1. Check all existing data
+
+Because `ALTER TABLE` typically acquires an exclusive lock until the end of a
+transaction this means this approach would require downtime.
+
+GitLab allows you to work around this by using
+`Gitlab::Database::MigrationHelpers#add_concurrent_foreign_key`. This method
+ensures that no downtime is needed.
+
+## Removing Foreign Keys
+
+This operation does not require downtime.
+
+## Migrating `integer` primary keys to `bigint`
+
+To [prevent the overflow risk](https://gitlab.com/groups/gitlab-org/-/epics/4785) for some tables
+with `integer` primary key (PK), we have to migrate their PK to `bigint`. The process to do this
+without downtime and causing too much load on the database is described below.
+
+### Initialize the conversion and start migrating existing data (release N)
+
+To start the process, add a regular migration to create the new `bigint` columns. Use the provided
+`initialize_conversion_of_integer_to_bigint` helper. The helper also creates a database trigger
+to keep in sync both columns for any new records ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/migrate/20210608072312_initialize_conversion_of_ci_stages_to_bigint.rb)):
+
+```ruby
+class InitializeConversionOfCiStagesToBigint < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ TABLE = :ci_stages
+ COLUMNS = %i(id)
+
+ def up
+ initialize_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+
+ def down
+ revert_initialize_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+end
+```
+
+Ignore the new `bigint` columns:
+
+```ruby
+module Ci
+ class Stage < Ci::ApplicationRecord
+ include IgnorableColumns
+ ignore_column :id_convert_to_bigint, remove_with: '14.2', remove_after: '2021-08-22'
+ end
+```
+
+To migrate existing data, we introduced new type of _batched background migrations_.
+Unlike the classic background migrations, built on top of Sidekiq, batched background migrations
+don't have to enqueue and schedule all the background jobs at the beginning.
+They also have other advantages, like automatic tuning of the batch size, better progress visibility,
+and collecting metrics. To start the process, use the provided `backfill_conversion_of_integer_to_bigint`
+helper ([example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/migrate/20210608072346_backfill_ci_stages_for_bigint_conversion.rb)):
+
+```ruby
+class BackfillCiStagesForBigintConversion < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ TABLE = :ci_stages
+ COLUMNS = %i(id)
+
+ def up
+ backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+
+ def down
+ revert_backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+end
+```
+
+### Monitor the background migration
+
+Check how the migration is performing while it's running. Multiple ways to do this are described below.
+
+#### High-level status of batched background migrations
+
+See how to [check the status of batched background migrations](../../update/index.md#checking-for-background-migrations-before-upgrading).
+
+#### Query the database
+
+We can query the related database tables directly. Requires access to read-only replica.
+Example queries:
+
+```sql
+-- Get details for batched background migration for given table
+SELECT * FROM batched_background_migrations WHERE table_name = 'namespaces'\gx
+
+-- Get count of batched background migration jobs by status for given table
+SELECT
+ batched_background_migrations.id, batched_background_migration_jobs.status, COUNT(*)
+FROM
+ batched_background_migrations
+ JOIN batched_background_migration_jobs ON batched_background_migrations.id = batched_background_migration_jobs.batched_background_migration_id
+WHERE
+ table_name = 'namespaces'
+GROUP BY
+ batched_background_migrations.id, batched_background_migration_jobs.status;
+
+-- Batched background migration progress for given table (based on estimated total number of tuples)
+SELECT
+ m.table_name,
+ LEAST(100 * sum(j.batch_size) / pg_class.reltuples, 100) AS percentage_complete
+FROM
+ batched_background_migrations m
+ JOIN batched_background_migration_jobs j ON j.batched_background_migration_id = m.id
+ JOIN pg_class ON pg_class.relname = m.table_name
+WHERE
+ j.status = 3 AND m.table_name = 'namespaces'
+GROUP BY m.id, pg_class.reltuples;
+```
+
+#### Sidekiq logs
+
+We can also use the Sidekiq logs to monitor the worker that executes the batched background
+migrations:
+
+1. Sign in to [Kibana](https://log.gprd.gitlab.net) with a `@gitlab.com` email address.
+1. Change the index pattern to `pubsub-sidekiq-inf-gprd*`.
+1. Add filter for `json.queue: cronjob:database_batched_background_migration`.
+
+#### PostgreSQL slow queries log
+
+Slow queries log keeps track of low queries that took above 1 second to execute. To see them
+for batched background migration:
+
+1. Sign in to [Kibana](https://log.gprd.gitlab.net) with a `@gitlab.com` email address.
+1. Change the index pattern to `pubsub-postgres-inf-gprd*`.
+1. Add filter for `json.endpoint_id.keyword: Database::BatchedBackgroundMigrationWorker`.
+1. Optional. To see only updates, add a filter for `json.command_tag.keyword: UPDATE`.
+1. Optional. To see only failed statements, add a filter for `json.error_severity.keyword: ERROR`.
+1. Optional. Add a filter by table name.
+
+#### Grafana dashboards
+
+To monitor the health of the database, use these additional metrics:
+
+- [PostgreSQL Tuple Statistics](https://dashboards.gitlab.net/d/000000167/postgresql-tuple-statistics?orgId=1&refresh=1m): if you see high rate of updates for the tables being actively converted, or increasing percentage of dead tuples for this table, it might mean that autovacuum cannot keep up.
+- [PostgreSQL Overview](https://dashboards.gitlab.net/d/000000144/postgresql-overview?orgId=1): if you see high system usage or transactions per second (TPS) on the primary database server, it might mean that the migration is causing problems.
+
+### Prometheus metrics
+
+Number of [metrics](https://gitlab.com/gitlab-org/gitlab/-/blob/294a92484ce4611f660439aa48eee4dfec2230b5/lib/gitlab/database/background_migration/batched_migration_wrapper.rb#L90-128)
+for each batched background migration are published to Prometheus. These metrics can be searched for and
+visualized in Thanos ([see an example](https://thanos-query.ops.gitlab.net/graph?g0.expr=sum%20(rate(batched_migration_job_updated_tuples_total%7Benv%3D%22gprd%22%7D%5B5m%5D))%20by%20(migration_id)%20&g0.tab=0&g0.stacked=0&g0.range_input=3d&g0.max_source_resolution=0s&g0.deduplicate=1&g0.partial_response=0&g0.store_matches=%5B%5D&g0.end_input=2021-06-13%2012%3A18%3A24&g0.moment_input=2021-06-13%2012%3A18%3A24)).
+
+### Swap the columns (release N + 1)
+
+After the background is completed and the new `bigint` columns are populated for all records, we can
+swap the columns. Swapping is done with post-deployment migration. The exact process depends on the
+table being converted, but in general it's done in the following steps:
+
+1. Using the provided `ensure_batched_background_migration_is_finished` helper, make sure the batched
+migration has finished ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L13-18)).
+If the migration has not completed, the subsequent steps fail anyway. By checking in advance we
+aim to have more helpful error message.
+1. Create indexes using the `bigint` columns that match the existing indexes using the `integer`
+column ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L28-34)).
+1. Create foreign keys (FK) using the `bigint` columns that match the existing FKs using the
+`integer` column. Do this both for FK referencing other tables, and FKs that reference the table
+that is being migrated ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L36-43)).
+1. Inside a transaction, swap the columns:
+ 1. Lock the tables involved. To reduce the chance of hitting a deadlock, we recommended to do this in parent to child order ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L47)).
+ 1. Rename the columns to swap names ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L49-54))
+ 1. Reset the trigger function ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L56-57)).
+ 1. Swap the defaults ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L59-62)).
+ 1. Swap the PK constraint (if any) ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L64-68)).
+ 1. Remove old indexes and rename new ones ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L70-72)).
+ 1. Remove old FKs (if still present) and rename new ones ([see an example](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb#L74)).
+
+See example [merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66088), and [migration](https://gitlab.com/gitlab-org/gitlab/-/blob/41fbe34a4725a4e357a83fda66afb382828767b2/db/post_migrate/20210707210916_finalize_ci_stages_bigint_conversion.rb).
+
+### Remove the trigger and old `integer` columns (release N + 2)
+
+Using post-deployment migration and the provided `cleanup_conversion_of_integer_to_bigint` helper,
+drop the database trigger and the old `integer` columns ([see an example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69714)).
+
+### Remove ignore rules (release N + 3)
+
+In the next release after the columns were dropped, remove the ignore rules as we do not need them
+anymore ([see an example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71161)).
+
+## Data migrations
+
+Data migrations can be tricky. The usual approach to migrate data is to take a 3
+step approach:
+
+1. Migrate the initial batch of data
+1. Deploy the application code
+1. Migrate any remaining data
+
+Usually this works, but not always. For example, if a field's format is to be
+changed from JSON to something else we have a bit of a problem. If we were to
+change existing data before deploying application code we'll most likely run
+into errors. On the other hand, if we were to migrate after deploying the
+application code we could run into the same problems.
+
+If you merely need to correct some invalid data, then a post-deployment
+migration is usually enough. If you need to change the format of data (for example, from
+JSON to something else) it's typically best to add a new column for the new data
+format, and have the application use that. In such a case the procedure would
+be:
+
+1. Add a new column in the new format
+1. Copy over existing data to this new column
+1. Deploy the application code
+1. In a post-deployment migration, copy over any remaining data
+
+In general there is no one-size-fits-all solution, therefore it's best to
+discuss these kind of migrations in a merge request to make sure they are
+implemented in the best way possible.
diff --git a/doc/development/database/background_migrations.md b/doc/development/database/background_migrations.md
new file mode 100644
index 00000000000..1f7e0d76c89
--- /dev/null
+++ b/doc/development/database/background_migrations.md
@@ -0,0 +1,504 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Background migrations
+
+WARNING:
+Background migrations are strongly discouraged in favor of the new [batched background migrations framework](../batched_background_migrations.md).
+Please check that documentation and determine if that framework suits your needs and fall back
+to these only if required.
+
+Background migrations should be used to perform data migrations whenever a
+migration exceeds [the time limits in our guidelines](../migration_style_guide.md#how-long-a-migration-should-take). For example, you can use background
+migrations to migrate data that's stored in a single JSON column
+to a separate table instead.
+
+If the database cluster is considered to be in an unhealthy state, background
+migrations automatically reschedule themselves for a later point in time.
+
+## When To Use Background Migrations
+
+You should use a background migration when you migrate _data_ in tables that have
+so many rows that the process would exceed [the time limits in our guidelines](../migration_style_guide.md#how-long-a-migration-should-take) if performed using a regular Rails migration.
+
+- Background migrations should be used when migrating data in [high-traffic tables](../migration_style_guide.md#high-traffic-tables).
+- Background migrations may also be used when executing numerous single-row queries
+for every item on a large dataset. Typically, for single-record patterns, runtime is
+largely dependent on the size of the dataset, hence it should be split accordingly
+and put into background migrations.
+- Background migrations should not be used to perform schema migrations.
+
+Some examples where background migrations can be useful:
+
+- Migrating events from one table to multiple separate tables.
+- Populating one column based on JSON stored in another column.
+- Migrating data that depends on the output of external services (for example, an API).
+
+NOTE:
+If the background migration is part of an important upgrade, make sure it's announced
+in the release post. Discuss with your Project Manager if you're not sure the migration falls
+into this category.
+
+## Isolation
+
+Background migrations must be isolated and can not use application code (for example,
+models defined in `app/models`). Since these migrations can take a long time to
+run it's possible for new versions to be deployed while they are still running.
+
+It's also possible for different migrations to be executed at the same time.
+This means that different background migrations should not migrate data in a
+way that would cause conflicts.
+
+## Idempotence
+
+Background migrations are executed in a context of a Sidekiq process.
+Usual Sidekiq rules apply, especially the rule that jobs should be small
+and idempotent.
+
+See [Sidekiq best practices guidelines](https://github.com/mperham/sidekiq/wiki/Best-Practices)
+for more details.
+
+Make sure that in case that your migration job is going to be retried data
+integrity is guaranteed.
+
+## Background migrations for EE-only features
+
+All the background migration classes for EE-only features should be present in GitLab CE.
+For this purpose, an empty class can be created for GitLab CE, and it can be extended for GitLab EE
+as explained in the [guidelines for implementing Enterprise Edition features](../ee_features.md#code-in-libgitlabbackground_migration).
+
+## How It Works
+
+Background migrations are simple classes that define a `perform` method. A
+Sidekiq worker will then execute such a class, passing any arguments to it. All
+migration classes must be defined in the namespace
+`Gitlab::BackgroundMigration`, the files should be placed in the directory
+`lib/gitlab/background_migration/`.
+
+## Scheduling
+
+Scheduling a background migration should be done in a post-deployment
+migration that includes `Gitlab::Database::MigrationHelpers`
+To do so, simply use the following code while
+replacing the class name and arguments with whatever values are necessary for
+your migration:
+
+```ruby
+migrate_in('BackgroundMigrationClassName', [arg1, arg2, ...])
+```
+
+You can use the function `queue_background_migration_jobs_by_range_at_intervals`
+to automatically split the job into batches:
+
+```ruby
+queue_background_migration_jobs_by_range_at_intervals(
+ ClassName,
+ BackgroundMigrationClassName,
+ 2.minutes,
+ batch_size: 10_000
+ )
+```
+
+You'll also need to make sure that newly created data is either migrated, or
+saved in both the old and new version upon creation. For complex and time
+consuming migrations it's best to schedule a background job using an
+`after_create` hook so this doesn't affect response timings. The same applies to
+updates. Removals in turn can be handled by simply defining foreign keys with
+cascading deletes.
+
+### Rescheduling background migrations
+
+If one of the background migrations contains a bug that is fixed in a patch
+release, the background migration needs to be rescheduled so the migration would
+be repeated on systems that already performed the initial migration.
+
+When you reschedule the background migration, make sure to turn the original
+scheduling into a no-op by clearing up the `#up` and `#down` methods of the
+migration performing the scheduling. Otherwise the background migration would be
+scheduled multiple times on systems that are upgrading multiple patch releases at
+once.
+
+When you start the second post-deployment migration, you should delete any
+previously queued jobs from the initial migration with the provided
+helper:
+
+```ruby
+delete_queued_jobs('BackgroundMigrationClassName')
+```
+
+## Cleaning Up
+
+NOTE:
+Cleaning up any remaining background migrations _must_ be done in either a major
+or minor release, you _must not_ do this in a patch release.
+
+Because background migrations can take a long time you can't immediately clean
+things up after scheduling them. For example, you can't drop a column that's
+used in the migration process as this would cause jobs to fail. This means that
+you'll need to add a separate _post deployment_ migration in a future release
+that finishes any remaining jobs before cleaning things up (for example, removing a
+column).
+
+As an example, say you want to migrate the data from column `foo` (containing a
+big JSON blob) to column `bar` (containing a string). The process for this would
+roughly be as follows:
+
+1. Release A:
+ 1. Create a migration class that performs the migration for a row with a given ID.
+ You can use [background jobs tracking](#background-jobs-tracking) to simplify cleaning up.
+ 1. Deploy the code for this release, this should include some code that will
+ schedule jobs for newly created data (for example, using an `after_create` hook).
+ 1. Schedule jobs for all existing rows in a post-deployment migration. It's
+ possible some newly created rows may be scheduled twice so your migration
+ should take care of this.
+1. Release B:
+ 1. Deploy code so that the application starts using the new column and stops
+ scheduling jobs for newly created data.
+ 1. In a post-deployment migration, finalize all jobs that have not succeeded by now.
+ If you used [background jobs tracking](#background-jobs-tracking) in release A,
+ you can use `finalize_background_migration` from `BackgroundMigrationHelpers` to ensure no jobs remain.
+ This helper will:
+ 1. Use `Gitlab::BackgroundMigration.steal` to process any remaining
+ jobs in Sidekiq.
+ 1. Reschedule the migration to be run directly (that is, not through Sidekiq)
+ on any rows that weren't migrated by Sidekiq. This can happen if, for
+ instance, Sidekiq received a SIGKILL, or if a particular batch failed
+ enough times to be marked as dead.
+ 1. Remove `Gitlab::Database::BackgroundMigrationJob` rows where
+ `status = succeeded`. To retain diagnostic information that may
+ help with future bug tracking you can skip this step by specifying
+ the `delete_tracking_jobs: false` parameter.
+ 1. Remove the old column.
+
+This may also require a bump to the [import/export version](../../user/project/settings/import_export.md), if
+importing a project from a prior version of GitLab requires the data to be in
+the new format.
+
+## Example
+
+To explain all this, let's use the following example: the table `integrations` has a
+field called `properties` which is stored in JSON. For all rows you want to
+extract the `url` key from this JSON object and store it in the `integrations.url`
+column. There are millions of integrations and parsing JSON is slow, thus you can't
+do this in a regular migration.
+
+To do this using a background migration we'll start with defining our migration
+class:
+
+```ruby
+class Gitlab::BackgroundMigration::ExtractIntegrationsUrl
+ class Integration < ActiveRecord::Base
+ self.table_name = 'integrations'
+ end
+
+ def perform(start_id, end_id)
+ Integration.where(id: start_id..end_id).each do |integration|
+ json = JSON.load(integration.properties)
+
+ integration.update(url: json['url']) if json['url']
+ rescue JSON::ParserError
+ # If the JSON is invalid we don't want to keep the job around forever,
+ # instead we'll just leave the "url" field to whatever the default value
+ # is.
+ next
+ end
+ end
+end
+```
+
+Next we'll need to adjust our code so we schedule the above migration for newly
+created and updated integrations. We can do this using something along the lines of
+the following:
+
+```ruby
+class Integration < ActiveRecord::Base
+ after_commit :schedule_integration_migration, on: :update
+ after_commit :schedule_integration_migration, on: :create
+
+ def schedule_integration_migration
+ BackgroundMigrationWorker.perform_async('ExtractIntegrationsUrl', [id, id])
+ end
+end
+```
+
+We're using `after_commit` here to ensure the Sidekiq job is not scheduled
+before the transaction completes as doing so can lead to race conditions where
+the changes are not yet visible to the worker.
+
+Next we'll need a post-deployment migration that schedules the migration for
+existing data.
+
+```ruby
+class ScheduleExtractIntegrationsUrl < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'ExtractIntegrationsUrl'
+ DELAY_INTERVAL = 2.minutes
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('integrations'),
+ MIGRATION,
+ DELAY_INTERVAL)
+ end
+
+ def down
+ end
+end
+```
+
+Once deployed our application will continue using the data as before but at the
+same time will ensure that both existing and new data is migrated.
+
+In the next release we can remove the `after_commit` hooks and related code. We
+will also need to add a post-deployment migration that consumes any remaining
+jobs and manually run on any un-migrated rows. Such a migration would look like
+this:
+
+```ruby
+class ConsumeRemainingExtractIntegrationsUrlJobs < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ # This must be included
+ Gitlab::BackgroundMigration.steal('ExtractIntegrationsUrl')
+
+ # This should be included, but can be skipped - see below
+ define_batchable_model('integrations').where(url: nil).each_batch(of: 50) do |batch|
+ range = batch.pluck('MIN(id)', 'MAX(id)').first
+
+ Gitlab::BackgroundMigration::ExtractIntegrationsUrl.new.perform(*range)
+ end
+ end
+
+ def down
+ end
+end
+```
+
+The final step runs for any un-migrated rows after all of the jobs have been
+processed. This is in case a Sidekiq process running the background migrations
+received SIGKILL, leading to the jobs being lost. (See
+[more reliable Sidekiq queue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36791) for more information.)
+
+If the application does not depend on the data being 100% migrated (for
+instance, the data is advisory, and not mission-critical), then this final step
+can be skipped.
+
+This migration will then process any jobs for the ExtractIntegrationsUrl migration
+and continue once all jobs have been processed. Once done you can safely remove
+the `integrations.properties` column.
+
+## Testing
+
+It is required to write tests for:
+
+- The background migrations' scheduling migration.
+- The background migration itself.
+- A cleanup migration.
+
+The `:migration` and `schema: :latest` RSpec tags are automatically set for
+background migration specs.
+See the
+[Testing Rails migrations](../testing_guide/testing_migrations_guide.md#testing-a-non-activerecordmigration-class)
+style guide.
+
+Keep in mind that `before` and `after` RSpec hooks are going
+to migrate you database down and up, which can result in other background
+migrations being called. That means that using `spy` test doubles with
+`have_received` is encouraged, instead of using regular test doubles, because
+your expectations defined in a `it` block can conflict with what is being
+called in RSpec hooks. See [issue #35351](https://gitlab.com/gitlab-org/gitlab/-/issues/18839)
+for more details.
+
+## Best practices
+
+1. Make sure to know how much data you're dealing with.
+1. Make sure that background migration jobs are idempotent.
+1. Make sure that tests you write are not false positives.
+1. Make sure that if the data being migrated is critical and cannot be lost, the
+ clean-up migration also checks the final state of the data before completing.
+1. When migrating many columns, make sure it won't generate too many
+ dead tuples in the process (you may need to directly query the number of dead tuples
+ and adjust the scheduling according to this piece of data).
+1. Make sure to discuss the numbers with a database specialist, the migration may add
+ more pressure on DB than you expect (measure on staging,
+ or ask someone to measure on production).
+1. Make sure to know how much time it'll take to run all scheduled migrations.
+1. Provide an estimation section in the description, estimating both the total migration
+ run time and the query times for each background migration job. Explain plans for each query
+ should also be provided.
+
+ For example, assuming a migration that deletes data, include information similar to
+ the following section:
+
+ ```plaintext
+ Background Migration Details:
+
+ 47600 items to delete
+ batch size = 1000
+ 47600 / 1000 = 48 batches
+
+ Estimated times per batch:
+ - 820ms for select statement with 1000 items (see linked explain plan)
+ - 900ms for delete statement with 1000 items (see linked explain plan)
+ Total: ~2 sec per batch
+
+ 2 mins delay per batch (safe for the given total time per batch)
+
+ 48 batches * 2 min per batch = 96 mins to run all the scheduled jobs
+ ```
+
+ The execution time per batch (2 sec in this example) is not included in the calculation
+ for total migration time. The jobs are scheduled 2 minutes apart without knowledge of
+ the execution time.
+
+## Additional tips and strategies
+
+### Nested batching
+
+A strategy to make the migration run faster is to schedule larger batches, and then use `EachBatch`
+within the background migration to perform multiple statements.
+
+The background migration helpers that queue multiple jobs such as
+`queue_background_migration_jobs_by_range_at_intervals` use [`EachBatch`](../iterating_tables_in_batches.md).
+The example above has batches of 1000, where each queued job takes two seconds. If the query has been optimized
+to make the time for the delete statement within the [query performance guidelines](../query_performance.md),
+1000 may be the largest number of records that can be deleted in a reasonable amount of time.
+
+The minimum and most common interval for delaying jobs is two minutes. This results in two seconds
+of work for each two minute job. There's nothing that prevents you from executing multiple delete
+statements in each background migration job.
+
+Looking at the example above, you could alternatively do:
+
+```plaintext
+Background Migration Details:
+
+47600 items to delete
+batch size = 10_000
+47600 / 10_000 = 5 batches
+
+Estimated times per batch:
+- Records are updated in sub-batches of 1000 => 10_000 / 1000 = 10 total updates
+- 820ms for select statement with 1000 items (see linked explain plan)
+- 900ms for delete statement with 1000 items (see linked explain plan)
+Sub-batch total: ~2 sec per sub-batch,
+Total batch time: 2 * 10 = 20 sec per batch
+
+2 mins delay per batch
+
+5 batches * 2 min per batch = 10 mins to run all the scheduled jobs
+```
+
+The batch time of 20 seconds still fits comfortably within the two minute delay, yet the total run
+time is cut by a tenth from around 100 minutes to 10 minutes! When dealing with large background
+migrations, this can cut the total migration time by days.
+
+When batching in this way, it is important to look at query times on the higher end
+of the table or relation being updated. `EachBatch` may generate some queries that become much
+slower when dealing with higher ID ranges.
+
+### Delay time
+
+When looking at the batch execution time versus the delay time, the execution time
+should fit comfortably within the delay time for a few reasons:
+
+- To allow for a variance in query times.
+- To allow autovacuum to catch up after periods of high churn.
+
+Never try to optimize by fully filling the delay window even if you are confident
+the queries themselves have no timing variance.
+
+### Background jobs tracking
+
+NOTE:
+Background migrations with job tracking enabled must call `mark_all_as_succeeded` for its batch, even if no work is needed to be done.
+
+`queue_background_migration_jobs_by_range_at_intervals` can create records for each job that is scheduled to run.
+You can enable this behavior by passing `track_jobs: true`. Each record starts with a `pending` status. Make sure that your worker updates the job status to `succeeded` by calling `Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded` in the `perform` method of your background migration.
+
+```ruby
+# Background migration code
+
+def perform(start_id, end_id)
+ # do work here
+
+ mark_job_as_succeeded(start_id, end_id)
+end
+
+private
+
+# Make sure that the arguments passed here match those passed to the background
+# migration
+def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
+end
+```
+
+```ruby
+# Post deployment migration
+MIGRATION = 'YourBackgroundMigrationName'
+DELAY_INTERVAL = 2.minutes.to_i # can be different
+BATCH_SIZE = 10_000 # can be different
+
+disable_ddl_transaction!
+
+def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('name_of_the_table_backing_the_model'),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+end
+
+def down
+ # no-op
+end
+```
+
+See [`lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb) for a full example.
+
+#### Rescheduling pending jobs
+
+You can reschedule pending migrations from the `background_migration_jobs` table by creating a post-deployment migration and calling `requeue_background_migration_jobs_by_range_at_intervals` with the migration name and delay interval.
+
+```ruby
+# Post deployment migration
+MIGRATION = 'YourBackgroundMigrationName'
+DELAY_INTERVAL = 2.minutes
+
+disable_ddl_transaction!
+
+def up
+ requeue_background_migration_jobs_by_range_at_intervals(MIGRATION, DELAY_INTERVAL)
+end
+
+def down
+ # no-op
+end
+```
+
+See [`db/post_migrate/20210604070207_retry_backfill_traversal_ids.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/db/post_migrate/20210604070207_retry_backfill_traversal_ids.rb) for a full example.
+
+### Viewing failure error logs
+
+After running a background migration, if any jobs have failed, you can view the logs in [Kibana](https://log.gprd.gitlab.net/goto/5f06a57f768c6025e1c65aefb4075694).
+View the production Sidekiq log and filter for:
+
+- `json.class: BackgroundMigrationWorker`
+- `json.job_status: fail`
+- `json.meta.caller_id: <MyBackgroundMigrationSchedulingMigrationClassName>`
+- `json.args: <MyBackgroundMigrationClassName>`
+
+Looking at the `json.error_class`, `json.error_message` and `json.error_backtrace` values may be helpful in understanding why the jobs failed.
+
+Depending on when and how the failure occurred, you may find other helpful information by filtering with `json.class: <MyBackgroundMigrationClassName>`.
diff --git a/doc/development/database/client_side_connection_pool.md b/doc/development/database/client_side_connection_pool.md
index 8316a75ac8d..60c8665df87 100644
--- a/doc/development/database/client_side_connection_pool.md
+++ b/doc/development/database/client_side_connection_pool.md
@@ -1,8 +1,7 @@
---
-type: dev, reference
-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"
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
# Client-side connection-pool
diff --git a/doc/development/database/database_lab.md b/doc/development/database/database_lab.md
new file mode 100644
index 00000000000..1c8694b113d
--- /dev/null
+++ b/doc/development/database/database_lab.md
@@ -0,0 +1,101 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Database Lab and Postgres.ai
+
+Internal users at GitLab have access to the Database Lab Engine (DLE) and
+[postgres.ai](https://console.postgres.ai/) for testing performance of database queries
+on replicated production data. Unlike a typical read-only production replica, in the DLE you can
+also create, update, and delete rows. You can also test the performance of
+schema changes, like additional indexes or columns, in an isolated copy of production data.
+
+## Access Database Lab Engine
+
+Access to the DLE is helpful for:
+
+- Database reviewers and maintainers.
+- Engineers who work on merge requests that have large effects on databases.
+
+To access the DLE's services, you can:
+
+- Perform query testing in the `#database_lab` Slack channel, or in the Postgres.ai web console.
+ Employees access both services with their GitLab Google account. Query testing
+ provides `EXPLAIN` (analyze, buffers) plans for queries executed there.
+- Migration testing by triggering a job as a part of a merge request.
+- Direct `psql` access to DLE instead of a production replica. Available to authorized users only.
+ To request `psql` access, file an [access request](https://about.gitlab.com/handbook/business-technology/team-member-enablement/onboarding-access-requests/access-requests/#individual-or-bulk-access-request).
+
+For more assistance, use the `#database` Slack channel.
+
+NOTE:
+If you need only temporary access to a production replica, instead of a Database Lab
+clone, follow the runbook procedure for connecting to the
+[database console with Teleport](https://gitlab.com/gitlab-com/runbooks/-/blob/master/docs/Teleport/Connect_to_Database_Console_via_Teleport.md).
+This procedure is similar to [Rails console access with Teleport](https://gitlab.com/gitlab-com/runbooks/-/blob/master/docs/Teleport/Connect_to_Rails_Console_via_Teleport.md#how-to-use-teleport-to-connect-to-rails-console).
+
+### Query testing
+
+You can access Database Lab's query analysis features either:
+
+- In the `#database_lab` Slack channel. Shows everyone's commands and results, but
+ your own commands are still isolated in their own clone.
+- In [the Postgres.ai web console](https://console.postgres.ai/GitLab/joe-instances).
+ Shows only the commands you run.
+
+#### Generate query plans
+
+Query plans are an essential part of the database review process. These plans
+enable us to decide quickly if a given query can be performant on GitLab.com.
+Running the `explain` command generates an `explain` plan and a link to the Postgres.ai
+console with more query analysis. For example, running `EXPLAIN SELECT * FROM application_settings`
+does the following:
+
+1. Runs `explain (analyze, buffers) select * from application_settings;` against a database clone.
+1. Responds with timing and buffer details from the run.
+1. Provides a [detailed, shareable report on the results](https://console.postgres.ai/shared/24d543c9-893b-4ff6-8deb-a8f902f85a53).
+
+#### Making schema changes
+
+Sometimes when testing queries, a contributor may realize that the query needs an index
+or other schema change to make added queries more performant. To test the query, run the `exec` command.
+For example, running this command:
+
+```sql
+exec CREATE INDEX on application_settings USING btree (instance_administration_project_id)
+```
+
+creates the specified index on the table. You can [test queries](#generate-query-plans) leveraging
+the new index. `exec` does not return any results, only the time required to execute the query.
+
+#### Reset the clone
+
+After many changes, such as after a destructive query or an ineffective index,
+you must start over. To reset your designated clone, run `reset`.
+
+### Migration testing
+
+For information on testing migrations, review our
+[database migration testing documentation](database_migration_pipeline.md).
+
+### Access the console with `psql`
+
+Team members with [`psql` access](#access-database-lab-engine), can gain direct access
+to a clone via `psql`. Access to `psql` enables you to see data, not just metadata.
+
+To connect to a clone using `psql`:
+
+1. Create a clone from the [desired instance](https://console.postgres.ai/gitlab/instances/).
+ 1. Provide a **Clone ID**: Something that uniquely identifies your clone, such as `yourname-testing-gitlabissue`.
+ 1. Provide a **Database username** and **Database password**: Connects `psql` to your clone.
+ 1. Select **Enable deletion protection** if you want to preserve your clone. Avoid selecting this option.
+ Clones are removed after 12 hours.
+1. In the **Clone details** page of the Postgres.ai web interface, copy and run
+ the command to start SSH port forwarding for the clone.
+1. In the **Clone details** page of the Postgres.ai web interface, copy and run the `psql` connection string.
+ Use the password provided at setup.
+
+After you connect, use clone like you would any `psql` console in production, but with
+the added benefit and safety of an isolated writeable environment.
diff --git a/doc/development/database/database_reviewer_guidelines.md b/doc/development/database/database_reviewer_guidelines.md
index 9d5e4821c9f..ca9ca36b156 100644
--- a/doc/development/database/database_reviewer_guidelines.md
+++ b/doc/development/database/database_reviewer_guidelines.md
@@ -70,7 +70,7 @@ Finally, you can find various guides in the [Database guides](index.md) page tha
topics and use cases. The most frequently required during database reviewing are the following:
- [Migrations style guide](../migration_style_guide.md) for creating safe SQL migrations.
-- [Avoiding downtime in migrations](../avoiding_downtime_in_migrations.md).
+- [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)
diff --git a/doc/development/database/deleting_migrations.md b/doc/development/database/deleting_migrations.md
new file mode 100644
index 00000000000..be9009f365d
--- /dev/null
+++ b/doc/development/database/deleting_migrations.md
@@ -0,0 +1,39 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Delete existing migrations
+
+When removing existing migrations from the GitLab project, you have to take into account
+the possibility of the migration already been included in past releases or in the current release, and thus already executed on GitLab.com and/or in self-managed instances.
+
+Because of it, it's not possible to delete existing migrations, as that could lead to:
+
+- Schema inconsistency, as changes introduced into the database were not rolled back properly.
+- Leaving a record on the `schema_versions` table, that points out to migration that no longer exists on the codebase.
+
+Instead of deleting we can opt for disabling the migration.
+
+## Pre-requisites to disable a migration
+
+Migrations can be disabled if:
+
+- They caused a timeout or general issue on GitLab.com.
+- They are obsoleted, for example, changes are not necessary due to a feature change.
+- Migration is a data migration only, that is, the migration does not change the database schema.
+
+## How to disable a data migration?
+
+In order to disable a migration, the following steps apply to all types of migrations:
+
+1. Turn the migration into a no-op by removing the code inside `#up`, `#down`
+ or `#perform` methods, and adding `# no-op` comment instead.
+1. Add a comment explaining why the code is gone.
+
+Disabling migrations requires explicit approval of Database Maintainer.
+
+## Examples
+
+- [Disable scheduling of productivity analytics](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17253)
diff --git a/doc/development/database/index.md b/doc/development/database/index.md
index efc48f72d00..0363d13ed4c 100644
--- a/doc/development/database/index.md
+++ b/doc/development/database/index.md
@@ -23,14 +23,15 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Migrations
-- [Avoiding downtime in migrations](../avoiding_downtime_in_migrations.md)
+- [Migrations for multiple databases](migrations_for_multiple_databases.md)
+- [Avoiding downtime in migrations](avoiding_downtime_in_migrations.md)
- [SQL guidelines](../sql.md) for working with SQL queries
- [Migrations style guide](../migration_style_guide.md) for creating safe SQL migrations
- [Testing Rails migrations](../testing_guide/testing_migrations_guide.md) guide
-- [Post deployment migrations](../post_deployment_migrations.md)
-- [Background migrations](../background_migrations.md)
+- [Post deployment migrations](post_deployment_migrations.md)
+- [Background migrations](background_migrations.md)
- [Swapping tables](../swapping_tables.md)
-- [Deleting migrations](../deleting_migrations.md)
+- [Deleting migrations](deleting_migrations.md)
- [Partitioning tables](table_partitioning.md)
## Debugging
@@ -64,6 +65,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
- [Pagination guidelines](pagination_guidelines.md)
- [Pagination performance guidelines](pagination_performance_guidelines.md)
- [Efficient `IN` operator queries](efficient_in_operator_queries.md)
+- [Data layout and access patterns](layout_and_access_patterns.md)
## Case studies
diff --git a/doc/development/database/keyset_pagination.md b/doc/development/database/keyset_pagination.md
index 4f0b353a37f..88928feb927 100644
--- a/doc/development/database/keyset_pagination.md
+++ b/doc/development/database/keyset_pagination.md
@@ -166,7 +166,7 @@ These order objects can be defined in the model classes as normal ActiveRecord s
Consider the following scope:
```ruby
-scope = Issue.where(project_id: 10).order(Gitlab::Database.nulls_last_order('relative_position', 'DESC'))
+scope = Issue.where(project_id: 10).order(Issue.arel_table[:relative_position].desc.nulls_last)
# SELECT "issues".* FROM "issues" WHERE "issues"."project_id" = 10 ORDER BY relative_position DESC NULLS LAST
scope.keyset_paginate # raises: Gitlab::Pagination::Keyset::UnsupportedScopeOrder: The order on the scope does not support keyset pagination
@@ -190,8 +190,8 @@ order = Gitlab::Pagination::Keyset::Order.build([
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'relative_position',
column_expression: Issue.arel_table[:relative_position],
- order_expression: Gitlab::Database.nulls_last_order('relative_position', 'DESC'),
- reversed_order_expression: Gitlab::Database.nulls_first_order('relative_position', 'ASC'),
+ order_expression: Issue.arel_table[:relative_position].desc.nulls_last,
+ reversed_order_expression: Issue.arel_table[:relative_position].asc.nulls_first,
nullable: :nulls_last,
order_direction: :desc,
distinct: false
diff --git a/doc/development/database/layout_and_access_patterns.md b/doc/development/database/layout_and_access_patterns.md
new file mode 100644
index 00000000000..a3e2fefb2a3
--- /dev/null
+++ b/doc/development/database/layout_and_access_patterns.md
@@ -0,0 +1,61 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Best practices for data layout and access patterns
+
+Certain patterns of data access, and especially data updates, can exacerbate strain
+on the database. Avoid them if possible.
+
+This document lists some patterns to avoid, with recommendations for alternatives.
+
+## High-frequency updates, especially to the same row
+
+Avoid single database rows that are updated by many transactions at the same time.
+
+- If many processes attempt to update the same row simultaneously, they queue up
+ as each transaction locks the row for writing. As this can significantly increase
+ transaction timings, the Rails connection pools can saturate, leading to
+ application-wide downtime.
+- For each row update, PostgreSQL inserts a new row version and deletes the old one.
+ In high-traffic scenarios, this approach can cause vacuum and WAL (write-ahead log)
+ pressure, reducing database performance.
+
+This pattern often happens when an aggregate is too expensive to compute for each
+request, so a running tally is kept in the database. If you need such an aggregate,
+consider keeping a running total in a single row, plus a small working set of
+recently added data, such as individual increments:
+
+- When introducing new data, add it to the working set. These inserts do not
+ cause lock contention.
+- When calculating the aggregate, combine the running total with a live aggregate
+ from the working set, providing an up-to-date result.
+- Add a periodic job that incorporates the working set into the running total and
+ clears it in a transaction, bounding the amount of work needed by a reader.
+
+## Wide tables
+
+PostgreSQL organizes rows into 8 KB pages, and operates on one page at a time.
+By minimizing the width of rows in a table, we improve the following:
+
+- Sequential and bitmap index scan performance, because fewer pages must be
+ scanned if each contains more rows.
+- Vacuum performance, because vacuum can process more rows in each page.
+- Update performance, because during a (non-HOT) update, each index must be
+ updated for every row update.
+
+Mitigating wide tables is one part of the database team's
+[100 GB table initiative](../../architecture/blueprints/database_scaling/size-limits.md),
+as wider tables can fit fewer rows in 100 GB.
+
+When adding columns to a table, consider if you intend to access the data in the
+new columns by itself, in a one-to-one relationship with the other columns of the
+table. If so, the new columns could be a good candidate for splitting to a new table.
+
+Several tables have already been split in this way. For example:
+
+- `search_data` is split from `issues`.
+- `project_pages_metadata` is split from `projects`.
+- `merge_request_diff_details` is split from `merge_request_diffs`
diff --git a/doc/development/database/loose_foreign_keys.md b/doc/development/database/loose_foreign_keys.md
index 17a825b4812..2bcdc91202a 100644
--- a/doc/development/database/loose_foreign_keys.md
+++ b/doc/development/database/loose_foreign_keys.md
@@ -95,27 +95,27 @@ Created database 'gitlabhq_test_ee'
Created database 'gitlabhq_geo_test_ee'
Showing cross-schema foreign keys (20):
- ID | HAS_LFK | FROM | TO | COLUMN | ON_DELETE
- 0 | N | ci_builds | projects | project_id | cascade
- 1 | N | ci_job_artifacts | projects | project_id | cascade
- 2 | N | ci_pipelines | projects | project_id | cascade
- 3 | Y | ci_pipelines | merge_requests | merge_request_id | cascade
- 4 | N | external_pull_requests | projects | project_id | cascade
- 5 | N | ci_sources_pipelines | projects | project_id | cascade
- 6 | N | ci_stages | projects | project_id | cascade
- 7 | N | ci_pipeline_schedules | projects | project_id | cascade
- 8 | N | ci_runner_projects | projects | project_id | cascade
- 9 | Y | dast_site_profiles_pipelines | ci_pipelines | ci_pipeline_id | cascade
- 10 | Y | vulnerability_feedback | ci_pipelines | pipeline_id | nullify
- 11 | N | ci_variables | projects | project_id | cascade
- 12 | N | ci_refs | projects | project_id | cascade
- 13 | N | ci_builds_metadata | projects | project_id | cascade
- 14 | N | ci_subscriptions_projects | projects | downstream_project_id | cascade
- 15 | N | ci_subscriptions_projects | projects | upstream_project_id | cascade
- 16 | N | ci_sources_projects | projects | source_project_id | cascade
- 17 | N | ci_job_token_project_scope_links | projects | source_project_id | cascade
- 18 | N | ci_job_token_project_scope_links | projects | target_project_id | cascade
- 19 | N | ci_project_monthly_usages | projects | project_id | cascade
+ ID | HAS_LFK | FROM | TO | COLUMN | ON_DELETE
+ 0 | N | ci_builds | projects | project_id | cascade
+ 1 | N | ci_job_artifacts | projects | project_id | cascade
+ 2 | N | ci_pipelines | projects | project_id | cascade
+ 3 | Y | ci_pipelines | merge_requests | merge_request_id | cascade
+ 4 | N | external_pull_requests | projects | project_id | cascade
+ 5 | N | ci_sources_pipelines | projects | project_id | cascade
+ 6 | N | ci_stages | projects | project_id | cascade
+ 7 | N | ci_pipeline_schedules | projects | project_id | cascade
+ 8 | N | ci_runner_projects | projects | project_id | cascade
+ 9 | Y | dast_site_profiles_pipelines | ci_pipelines | ci_pipeline_id | cascade
+ 10 | Y | vulnerability_feedback | ci_pipelines | pipeline_id | nullify
+ 11 | N | ci_variables | projects | project_id | cascade
+ 12 | N | ci_refs | projects | project_id | cascade
+ 13 | N | ci_builds_metadata | projects | project_id | cascade
+ 14 | N | ci_subscriptions_projects | projects | downstream_project_id | cascade
+ 15 | N | ci_subscriptions_projects | projects | upstream_project_id | cascade
+ 16 | N | ci_sources_projects | projects | source_project_id | cascade
+ 17 | N | ci_job_token_project_scope_links | projects | source_project_id | cascade
+ 18 | N | ci_job_token_project_scope_links | projects | target_project_id | cascade
+ 19 | N | ci_project_monthly_usages | projects | project_id | cascade
To match FK write one or many filters to match against FROM/TO/COLUMN:
- scripts/decomposition/generate-loose-foreign-key <filter(s)...>
@@ -191,7 +191,7 @@ ci_pipelines:
### Track record changes
To know about deletions in the `projects` table, configure a `DELETE` trigger
-using a [post-deployment migration](../post_deployment_migrations.md). The
+using a [post-deployment migration](post_deployment_migrations.md). The
trigger needs to be configured only once. If the model already has at least one
`loose_foreign_key` definition, then this step can be skipped:
@@ -226,7 +226,7 @@ ON DELETE CASCADE;
The migration must run after the `DELETE` trigger is installed and the loose
foreign key definition is deployed. As such, it must be a [post-deployment
-migration](../post_deployment_migrations.md) dated after the migration for the
+migration](post_deployment_migrations.md) dated after the migration for the
trigger. If the foreign key is deleted earlier, there is a good chance of
introducing data inconsistency which needs manual cleanup:
@@ -480,3 +480,380 @@ it executes `occurrence.pipeline.created_at`.
When looping through the vulnerability occurrences in the Sidekiq worker, we
could try to load the corresponding pipeline and choose to skip processing that
occurrence if pipeline is not found.
+
+## Architecture
+
+The loose foreign keys feature is implemented within the `LooseForeignKeys` Ruby namespace. The
+code is isolated from the core application code and theoretically, it could be a standalone library.
+
+The feature is invoked solely in the [`LooseForeignKeys::CleanupWorker`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/loose_foreign_keys/cleanup_worker.rb) worker class. The worker is scheduled via a
+cron job where the schedule depends on the configuration of the GitLab instance.
+
+- Non-decomposed GitLab (1 database): invoked every minute.
+- Decomposed GitLab (2 databases, CI and Main): invoked every minute, cleaning up one database
+at a time. For example, the cleanup worker for the main database runs every two minutes.
+
+To avoid lock contention and the processing of the same database rows, the worker does not run
+parallel. This behavior is ensured with a Redis lock.
+
+**Record cleanup procedure:**
+
+1. Acquire the Redis lock.
+1. Determine which database to clean up.
+1. Collect all database tables where the deletions are tracked (parent tables).
+ - This is achieved by reading the `config/gitlab_loose_foreign_keys.yml` file.
+ - A table is considered "tracked" when a loose foreign key definition exists for the table and
+ the `DELETE` trigger is installed.
+1. Cycle through the tables with an infinite loop.
+1. For each table, load a batch of deleted parent records to clean up.
+1. Depending on the YAML configuration, build `DELETE` or `UPDATE` (nullify) queries for the
+referenced child tables.
+1. Invoke the queries.
+1. Repeat until all child records are cleaned up or the maximum limit is reached.
+1. Remove the deleted parent records when all child records are cleaned up.
+
+### Database structure
+
+The feature relies on triggers installed on the parent tables. When a parent record is deleted,
+the trigger will automatically insert a new record into the `loose_foreign_keys_deleted_records`
+database table.
+
+The inserted record will store the following information about the deleted record:
+
+- `fully_qualified_table_name`: name of the database table where the record was located.
+- `primary_key_value`: the ID of the record, the value will be present in the child tables as
+the foreign key value. At the moment, composite primary keys are not supported, the parent table
+must have an `id` column.
+- `status`: defaults to pending, represents the status of the cleanup process.
+- `consume_after`: defaults to the current time.
+- `cleanup_attempts`: defaults to 0. The number of times the worker tried to clean up this record.
+A non-zero number would mean that this record has many child records and cleaning it up requires
+several runs.
+
+#### Database decomposition
+
+The `loose_foreign_keys_deleted_records` table will exist on both database servers (Ci and Main)
+after the [database decomposition](https://gitlab.com/groups/gitlab-org/-/epics/6168). The worker
+ill determine which parent tables belong to which database by reading the
+`lib/gitlab/database/gitlab_schemas.yml` YAML file.
+
+Example:
+
+- Main database tables
+ - `projects`
+ - `namespaces`
+ - `merge_requests`
+- Ci database tables
+ - `ci_builds`
+ - `ci_pipelines`
+
+When the worker is invoked for the Ci database, the worker will load deleted records only from the
+`ci_builds` and `ci_pipelines` tables. During the cleanup process, `DELETE` and `UPDATE` queries
+will mostly run on tables located in the Main database. In this example, one `UPDATE` query will
+nullify the `merge_requests.head_pipeline_id` column.
+
+#### Database partitioning
+
+Due to the large volume of inserts the database table receives daily, a special partitioning
+strategy was implemented to address data bloat concerns. Originally, the
+[time-decay](https://about.gitlab.com/company/team/structure/working-groups/database-scalability/time-decay.html)
+strategy was considered for the feature but due to the large data volume we decided to implement a
+new strategy.
+
+A deleted record is considered fully processed when all its direct children records have been
+cleaned up. When this happens, the loose foreign key worker will update the `status` column of
+the deleted record. After this step, the record is no longer needed.
+
+The sliding partitioning strategy provides an efficient way of cleaning up old, unused data by
+adding a new database partition and removing the old one when certain conditions are met.
+The `loose_foreign_keys_deleted_records` database table is list partitioned where most of the
+time there is only one partition attached to the table.
+
+```sql
+ Partitioned table "public.loose_foreign_keys_deleted_records"
+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
+----------------------------+--------------------------+-----------+----------+----------------------------------------------------------------+----------+--------------+-------------
+ id | bigint | | not null | nextval('loose_foreign_keys_deleted_records_id_seq'::regclass) | plain | |
+ partition | bigint | | not null | 84 | plain | |
+ primary_key_value | bigint | | not null | | plain | |
+ status | smallint | | not null | 1 | plain | |
+ created_at | timestamp with time zone | | not null | now() | plain | |
+ fully_qualified_table_name | text | | not null | | extended | |
+ consume_after | timestamp with time zone | | | now() | plain | |
+ cleanup_attempts | smallint | | | 0 | plain | |
+Partition key: LIST (partition)
+Indexes:
+ "loose_foreign_keys_deleted_records_pkey" PRIMARY KEY, btree (partition, id)
+ "index_loose_foreign_keys_deleted_records_for_partitioned_query" btree (partition, fully_qualified_table_name, consume_after, id) WHERE status = 1
+Check constraints:
+ "check_1a541f3235" CHECK (char_length(fully_qualified_table_name) <= 150)
+Partitions: gitlab_partitions_dynamic.loose_foreign_keys_deleted_records_84 FOR VALUES IN ('84')
+```
+
+The `partition` column controls the insert direction, the `partition` value determines which
+partition will get the deleted rows inserted via the trigger. Notice that the default value of
+the `partition` table matches with the value of the list partition (84). In `INSERT` query
+within the trigger thevalue of the `partition` is omitted, the trigger always relies on the
+default value of the column.
+
+Example `INSERT` query for the trigger:
+
+```sql
+INSERT INTO loose_foreign_keys_deleted_records
+(fully_qualified_table_name, primary_key_value)
+SELECT TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, old_table.id FROM old_table;
+```
+
+The partition "sliding" process is controlled by two, regularly executed callbacks. These
+callbackes are defined within the `LooseForeignKeys::DeletedRecord` model.
+
+The `next_partition_if` callback controls when to create a new partition. A new partition will
+be created when the current partition has at least one record older than 24 hours. A new partition
+is added by the [`PartitionManager`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/database/partitioning/partition_manager.rb)
+using the following steps:
+
+1. Create a new partition, where the `VALUE` for the partition is `CURRENT_PARTITION + 1`.
+1. Update the default value of the `partition` column to `CURRENT_PARTITION + 1`.
+
+With these steps, new `INSERT`-s via the triggers will end up in the new partition. At this point,
+the database table has two partitions.
+
+The `detach_partition_if` callback determines if the old partitions can be detached from the table.
+A partition is detachable if there are no pending (unprocessed) records in the partition
+(`status = 1`). The detached partitions will be available for some time, you can see the list
+detached partitions in the `detached_partitions` table:
+
+```sql
+select * from detached_partitions;
+```
+
+#### Cleanup queries
+
+The `LooseForeignKeys::CleanupWorker` has its database query builder which depends on `Arel`.
+The feature doesn't reference any application-specific `ActiveRecord` models to avoid unexpected
+side effects. The database queries are batched, which means that several parent records are being
+cleaned up at the same time.
+
+Example `DELETE` query:
+
+```sql
+DELETE
+FROM "merge_request_metrics"
+WHERE ("merge_request_metrics"."id") IN
+ (SELECT "merge_request_metrics"."id"
+ FROM "merge_request_metrics"
+ WHERE "merge_request_metrics"."pipeline_id" IN (1, 2, 10, 20)
+ LIMIT 1000 FOR UPDATE SKIP LOCKED)
+```
+
+The primary key values of the parent records are 1, 2, 10, and 20.
+
+Example `UPDATE` (nullify) query:
+
+```sql
+UPDATE "merge_requests"
+SET "head_pipeline_id" = NULL
+WHERE ("merge_requests"."id") IN
+ (SELECT "merge_requests"."id"
+ FROM "merge_requests"
+ WHERE "merge_requests"."head_pipeline_id" IN (3, 4, 30, 40)
+ LIMIT 500 FOR UPDATE SKIP LOCKED)
+```
+
+These queries are batched, which means that in many cases, several invocations are needed to clean
+up all associated child records.
+
+The batching is implemented with loops, the processing will stop when all associated child records
+are cleaned up or the limit is reached.
+
+```ruby
+loop do
+ modification_count = process_batch_with_skip_locked
+
+ break if modification_count == 0 || over_limit?
+end
+
+loop do
+ modification_count = process_batch
+
+ break if modification_count == 0 || over_limit?
+end
+```
+
+The loop-based batch processing is preferred over `EachBatch` for the following reasons:
+
+- The records in the batch are modified, so the next batch will contain different records.
+- There is always an index on the foreign key column however, the column is usually not unique.
+`EachBatch` requires a unique column for the iteration.
+- The record order doesn't matter for the cleanup.
+
+Notice that we have two loops. The initial loop will process records with the `SKIP LOCKED` clause.
+The query will skip rows that are locked by other application processes. This will ensure that the
+cleanup worker will less likely to become blocked. The second loop will execute the database
+queries without `SKIP LOCKED` to ensure that all records have been processed.
+
+#### Processing limits
+
+A constant, large volume of record updates or deletions can cause incidents and affect the
+availability of GitLab:
+
+- Increased table bloat.
+- Increased number of pending WAL files.
+- Busy tables, difficulty when acquiring locks.
+
+To mitigate these issues, several limits are applied when the worker runs.
+
+- Each query has `LIMIT`, a query cannot process an unbounded number of rows.
+- The maximum number of record deletions and record updates is limited.
+- The maximum runtime (30 seconds) for the database queries is limited.
+
+The limit rules are implemented in the `LooseForeignKeys::ModificationTracker` class. When one of
+the limits (record modification count, time limit) is reached the processing is stopped
+immediately. After some time, the next scheduled worker will continue the cleanup process.
+
+#### Performance characteristics
+
+The database trigger on the parent tables will **decrease** the record deletion speed. Each
+statement that removes rows from the parent table will invoke the trigger to insert records
+into the `loose_foreign_keys_deleted_records` table.
+
+The queries within the cleanup worker are fairly efficient index scans, with limits in place
+they're unlikely to affect other parts of the application.
+
+The database queries are not running in transaction, when an error happens for example a statement
+timeout or a worker crash, the next job will continue the processing.
+
+## Troubleshooting
+
+### Accumulation of deleted records
+
+There can be cases where the workers need to process an unusually large amount of data. This can
+happen under normal usage, for example when a large project or group is deleted. In this scenario,
+there can be several million rows to be deleted or nullified. Due to the limits enforced by the
+worker, processing this data will take some time.
+
+When cleaning up "heavy-hitters", the feature ensures fair processing by rescheduling larger
+batches for later. This gives time for other deleted records to be processed.
+
+For example, a project with millions of `ci_builds` records is deleted. The `ci_builds` records
+will be deleted by the loose foreign keys feature.
+
+1. The cleanup worker is scheduled and picks up a batch of deleted `projects` records. The large
+project is part of the batch.
+1. Deletion of the orphaned `ci_builds` rows has started.
+1. The time limit is reached, but the cleanup is not complete.
+1. The `cleanup_attempts` column is incremented for the deleted records.
+1. Go to step 1. The next cleanup worker continues the cleanup.
+1. When the `cleanup_attempts` reaches 3, the batch is re-scheduled 10 minutes later by updating
+the `consume_after` column.
+1. The next cleanup worker will process a different batch.
+
+We have Prometheus metrics in place to monitor the deleted record cleanup:
+
+- `loose_foreign_key_processed_deleted_records`: Number of processed deleted records. When large
+cleanup happens, this number would decrease.
+- `loose_foreign_key_incremented_deleted_records`: Number of deleted records which were not
+finished processing. The `cleanup_attempts` column was incremented.
+- `loose_foreign_key_rescheduled_deleted_records`: Number of deleted records that had to be
+rescheduled at a later time after 3 cleanup attempts.
+
+Example Thanos query:
+
+```plaintext
+loose_foreign_key_rescheduled_deleted_records{env="gprd", table="ci_runners"}
+```
+
+Another way to look at the situation is by running a database query. This query gives the exact
+counts of the unprocessed records:
+
+```sql
+SELECT partition, fully_qualified_table_name, count(*)
+FROM loose_foreign_keys_deleted_records
+WHERE
+status = 1
+GROUP BY 1, 2;
+```
+
+Example output:
+
+```sql
+ partition | fully_qualified_table_name | count
+-----------+----------------------------+-------
+ 87 | public.ci_builds | 874
+ 87 | public.ci_job_artifacts | 6658
+ 87 | public.ci_pipelines | 102
+ 87 | public.ci_runners | 111
+ 87 | public.merge_requests | 255
+ 87 | public.namespaces | 25
+ 87 | public.projects | 6
+```
+
+The query includes the partition number which can be useful to detect if the cleanup process is
+significantly lagging behind. When multiple different partition values are present in the list
+that means the cleanup of some deleted records didn't finish in several days (1 new partition
+is added every day).
+
+Steps to diagnose the problem:
+
+- Check which records are accumulating.
+- Try to get an estimate of the number of remaining records.
+- Looking into the worker performance stats (Kibana or Thanos).
+
+Possible solutions:
+
+- Short-term: increase the batch sizes.
+- Long-term: invoke the worker more frequently. Parallelize the worker
+
+For a one-time fix, we can run the cleanup worker several times from the rails console. The worker
+can run parallelly however, this can introduce lock contention and it could increase the worker
+runtime.
+
+```ruby
+LooseForeignKeys::CleanupWorker.new.perform
+```
+
+When the cleanup is done, the older partitions will be automatically detached by the
+`PartitionManager`.
+
+### PartitionManager bug
+
+NOTE:
+This issue happened in the past on Staging and it has been mitigated.
+
+When adding a new partition, the default value of the `partition` column is also updated. This is
+a schema change that is executed in the same transaction as the new partition creation. It's highly
+unlikely that the `partition` column goes outdated.
+
+However, if this happens then this can cause application-wide incidents because the `partition`
+value points to a partition that doesn't exist. Symptom: deletion of records from tables where the
+`DELETE` trigger is installed fails.
+
+```sql
+\d+ loose_foreign_keys_deleted_records;
+
+ Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
+----------------------------+--------------------------+-----------+----------+----------------------------------------------------------------+----------+--------------+-------------
+ id | bigint | | not null | nextval('loose_foreign_keys_deleted_records_id_seq'::regclass) | plain | |
+ partition | bigint | | not null | 4 | plain | |
+ primary_key_value | bigint | | not null | | plain | |
+ status | smallint | | not null | 1 | plain | |
+ created_at | timestamp with time zone | | not null | now() | plain | |
+ fully_qualified_table_name | text | | not null | | extended | |
+ consume_after | timestamp with time zone | | | now() | plain | |
+ cleanup_attempts | smallint | | | 0 | plain | |
+Partition key: LIST (partition)
+Indexes:
+ "loose_foreign_keys_deleted_records_pkey" PRIMARY KEY, btree (partition, id)
+ "index_loose_foreign_keys_deleted_records_for_partitioned_query" btree (partition, fully_qualified_table_name, consume_after, id) WHERE status = 1
+Check constraints:
+ "check_1a541f3235" CHECK (char_length(fully_qualified_table_name) <= 150)
+Partitions: gitlab_partitions_dynamic.loose_foreign_keys_deleted_records_3 FOR VALUES IN ('3')
+```
+
+Check the default value of the `partition` column and compare it with the available partitions
+(4 vs 3). The partition with the value of 4 does not exist. To mitigate the problem an emergency
+schema change is required:
+
+```sql
+ALTER TABLE loose_foreign_keys_deleted_records ALTER COLUMN partition SET DEFAULT 3;
+```
diff --git a/doc/development/database/migrations_for_multiple_databases.md b/doc/development/database/migrations_for_multiple_databases.md
new file mode 100644
index 00000000000..0ec4612e985
--- /dev/null
+++ b/doc/development/database/migrations_for_multiple_databases.md
@@ -0,0 +1,390 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Migrations for Multiple databases
+
+> Support for describing migration purposes was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73756) in GitLab 14.8.
+
+This document describes how to properly write database migrations
+for [the decomposed GitLab application using multiple databases](https://gitlab.com/groups/gitlab-org/-/epics/6168).
+
+Learn more about general multiple databases support in a [separate document](multiple_databases.md).
+
+WARNING:
+If you experience any issues using `Gitlab::Database::Migration[2.0]`,
+you can temporarily revert back to the previous behavior by changing the version to `Gitlab::Database::Migration[1.0]`.
+Please report any issues with `Gitlab::Database::Migration[2.0]` in [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/358430).
+
+The design for multiple databases (except for the Geo database) assumes
+that all decomposed databases have **the same structure** (for example, schema), but **the data is different** in each database. This means that some tables do not contain data on each database.
+
+## Operations
+
+Depending on the used constructs, we can classify migrations to be either:
+
+1. Modifying structure ([DDL - Data Definition Language](https://www.postgresql.org/docs/current/ddl.html)) (for example, `ALTER TABLE`).
+1. Modifying data ([DML - Data Manipulation Language](https://www.postgresql.org/docs/current/dml.html)) (for example, `UPDATE`).
+1. Performing [other queries](https://www.postgresql.org/docs/current/queries.html) (for example, `SELECT`) that are treated as **DML** for the purposes of our migrations.
+
+**The usage of `Gitlab::Database::Migration[2.0]` requires migrations to always be of a single purpose**.
+Migrations cannot mix **DDL** and **DML** changes as the application requires the structure
+(as described by `db/structure.sql`) to be exactly the same across all decomposed databases.
+
+### Data Definition Language (DDL)
+
+The DDL migrations are all migrations that:
+
+1. Create or drop a table (for example, `create_table`).
+1. Add or remove an index (for example, `add_index`, `add_index_concurrently`).
+1. Add or remove a foreign key (for example `add_foreign_key`, `add_foreign_key_concurrently`).
+1. Add or remove a column with or without a default value (for example, `add_column`).
+1. Create or drop trigger functions (for example, `create_trigger_function`).
+1. Attach or detach triggers from tables (for example, `track_record_deletions`, `untrack_record_deletions`).
+1. Prepare or not async indexes (for example, `prepare_async_index`, `unprepare_async_index_by_name`).
+
+As such DDL migrations **CANNOT**:
+
+1. Read or modify data in any form, via SQL statements or ActiveRecord models.
+1. Update column values (for example, `update_column_in_batches`).
+1. Schedule background migrations (for example, `queue_background_migration_jobs_by_range_at_intervals`).
+1. Read the state of feature flags since they are stored in `main:` (a `features` and `feature_gates`).
+1. Read application settings (as settings are stored in `main:`).
+
+As the majority of migrations in the GitLab codebase are of the DDL-type,
+this is also the default mode of operation and requires no further changes
+to the migrations files.
+
+#### Example: perform DDL on all databases
+
+Example migration adding a concurrent index that is treated as change of the structure (DDL)
+that is executed on all configured databases.
+
+```ruby
+class AddUserIdAndStateIndexToMergeRequestReviewers < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_on_merge_request_reviewers_user_id_and_state'
+
+ def up
+ add_concurrent_index :merge_request_reviewers, [:user_id, :state], where: 'state = 2', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :merge_request_reviewers, INDEX_NAME
+ end
+end
+```
+
+### Data Manipulation Language (DML)
+
+The DML migrations are all migrations that:
+
+1. Read data via SQL statements (for example, `SELECT * FROM projects WHERE id=1`).
+1. Read data via ActiveRecord models (for example, `User < MigrationRecord`).
+1. Create, update or delete data via ActiveRecord models (for example, `User.create!(...)`).
+1. Create, update or delete data via SQL statements (for example, `DELETE FROM projects WHERE id=1`).
+1. Update columns in batches (for example, `update_column_in_batches(:projects, :archived, true)`).
+1. Schedule background migrations (for example, `queue_background_migration_jobs_by_range_at_intervals`).
+1. Access application settings (for example, `ApplicationSetting.last` if run for `main:` database).
+1. Read and modify feature flags if run for the `main:` database.
+
+The DML migrations **CANNOT**:
+
+1. Make any changes to DDL since this breaks the rule of keeping `structure.sql` coherent across
+ all decomposed databases.
+1. **Read data from another database**.
+
+To indicate the `DML` migration type, a migration must use the `restrict_gitlab_migration gitlab_schema:`
+syntax in a migration class. This marks the given migration as DML and restricts access to it.
+
+#### Example: perform DML only in context of the database containing the given `gitlab_schema`
+
+Example migration updating `archived` column of `projects` that is executed
+only for the database containing `gitlab_main` schema.
+
+```ruby
+class UpdateProjectsArchivedState < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ update_column_in_batches(:projects, :archived, true) do |table, query|
+ query.where(table[:archived].eq(false)) # rubocop:disable CodeReuse/ActiveRecord
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
+```
+
+#### Example: usage of `ActiveRecord` classes
+
+A migration using `ActiveRecord` class to perform data manipulation
+must use the `MigrationRecord` class. This class is guaranteed to provide
+a correct connection in a context of a given migration.
+
+Underneath the `MigrationRecord == ActiveRecord::Base`, as once the `db:migrate`
+runs, it switches the active connection of `ActiveRecord::Base.establish_connection :ci`.
+To avoid confusion to using the `ActiveRecord::Base`, `MigrationRecord` is required.
+
+This implies that DML migrations are forbidden to read data from other
+databases. For example, running migration in context of `ci:` and reading feature flags
+from `main:`, as no established connection to another database is present.
+
+```ruby
+class UpdateProjectsArchivedState < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ class Project < MigrationRecord
+ end
+
+ def up
+ Project.where(archived: false).each_batch of |batch|
+ batch.update_all(archived: true)
+ end
+ end
+
+ def down
+ end
+end
+```
+
+### The special purpose of `gitlab_shared`
+
+As described in [gitlab_schema](multiple_databases.md#the-special-purpose-of-gitlab_shared),
+the `gitlab_shared` tables are allowed to contain data across all databases. This implies
+that such migrations should run across all databases to modify structure (DDL) or modify data (DML).
+
+As such migrations accessing `gitlab_shared` do not need to use `restrict_gitlab_migration gitlab_schema:`,
+migrations without restriction run across all databases and are allowed to modify data on each of them.
+If the `restrict_gitlab_migration gitlab_schema:` is specified, the `DML` migration
+runs only in a context of a database containing the given `gitlab_schema`.
+
+#### Example: run DML `gitlab_shared` migration on all databases
+
+Example migration updating `loose_foreign_keys_deleted_records` table
+that is marked in `lib/gitlab/database/gitlab_schemas.yml` as `gitlab_shared`.
+
+This migration is executed across all configured databases.
+
+```ruby
+class DeleteAllLooseForeignKeyRecords < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ execute("DELETE FROM loose_foreign_keys_deleted_records")
+ end
+
+ def down
+ # no-op
+ end
+end
+```
+
+#### Example: run DML `gitlab_shared` only on the database containing the given `gitlab_schema`
+
+Example migration updating `loose_foreign_keys_deleted_records` table
+that is marked in `lib/gitlab/database/gitlab_schemas.yml` as `gitlab_shared`.
+
+This migration since it configures restriction on `gitlab_ci` is executed only
+in context of database containing `gitlab_ci` schema.
+
+```ruby
+class DeleteCiBuildsLooseForeignKeyRecords < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ def up
+ execute("DELETE FROM loose_foreign_keys_deleted_records WHERE fully_qualified_table_name='ci_builds'")
+ end
+
+ def down
+ # no-op
+ end
+end
+```
+
+### The behavior of skipping migrations
+
+The only migrations that are skipped are the ones performing **DML** changes.
+The **DDL** migrations are **always and unconditionally** executed.
+
+The implemented [solution](https://gitlab.com/gitlab-org/gitlab/-/issues/355014#solution-2-use-database_tasks)
+uses the `database_tasks:` as a way to indicate which additional database configurations
+(in `config/database.yml`) share the same primary database. The database configurations
+marked with `database_tasks: false` are exempt from executing `db:migrate` for those
+database configurations.
+
+If database configurations do not share databases (all do have `database_tasks: true`),
+each migration runs for every database configuration:
+
+1. The DDL migration applies all structure changes on all databases.
+1. The DML migration runs only in the context of a database containing the given `gitlab_schema:`.
+1. If the DML migration is not eligible to run, it is skipped. It's still
+ marked as executed in `schema_migrations`. While running `db:migrate`, the skipped
+ migration outputs `Current migration is skipped since it modifies 'gitlab_ci' which is outside of 'gitlab_main, gitlab_shared`.
+
+To prevent loss of migrations if the `database_tasks: false` is configured, a dedicated
+Rake task is used [`gitlab:db:validate_config`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83118).
+The `gitlab:db:validate_config` validates the correctness of `database_tasks:` by checking database identifiers
+of each underlying database configuration. The ones that share the database are required to have
+the `database_tasks: false` set. `gitlab:db:validate_config` always runs before `db:migrate`.
+
+## Validation
+
+Validation in a nutshell uses [pg_query](https://github.com/pganalyze/pg_query) to analyze
+each query and classify tables with information from [`gitlab_schema.yml`](multiple_databases.md#gitlab-schema).
+The migration is skipped if the specified `gitlab_schema` is outside of a list of schemas
+managed by a given database connection (`Gitlab::Database::gitlab_schemas_for_connection`).
+
+The `Gitlab::Database::Migration[2.0]` includes `Gitlab::Database::MigrationHelpers::RestrictGitlabSchema`
+which extends the `#migrate` method. For the duration of a migration a dedicated query analyzer
+is installed `Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas` that accepts
+a list of allowed schemas as defined by `restrict_gitlab_migration:`. If the executed query
+is outside of allowed schemas, it raises an exception.
+
+## Exceptions
+
+Depending on misuse or lack of `restrict_gitlab_migration` various exceptions can be raised
+as part of the migration run and prevent the migration from being completed.
+
+### Exception 1: migration running in DDL mode does DML select
+
+```ruby
+class UpdateProjectsArchivedState < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ # Missing:
+ # restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ update_column_in_batches(:projects, :archived, true) do |table, query|
+ query.where(table[:archived].eq(false)) # rubocop:disable CodeReuse/ActiveRecord
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
+```
+
+```plaintext
+Select/DML queries (SELECT/UPDATE/DELETE) are disallowed in the DDL (structure) mode
+Modifying of 'projects' (gitlab_main) with 'SELECT * FROM projects...
+```
+
+The current migration do not use `restrict_gitlab_migration`. The lack indicates a migration
+running in **DDL** mode, but the executed payload appears to be reading data from `projects`.
+
+**The solution** is to add `restrict_gitlab_migration gitlab_schema: :gitlab_main`.
+
+### Exception 2: migration running in DML mode changes the structure
+
+```ruby
+class AddUserIdAndStateIndexToMergeRequestReviewers < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ # restrict_gitlab_migration if defined indicates DML, it should be removed
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ INDEX_NAME = 'index_on_merge_request_reviewers_user_id_and_state'
+
+ def up
+ add_concurrent_index :merge_request_reviewers, [:user_id, :state], where: 'state = 2', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :merge_request_reviewers, INDEX_NAME
+ end
+end
+```
+
+```plaintext
+DDL queries (structure) are disallowed in the Select/DML (SELECT/UPDATE/DELETE) mode.
+Modifying of 'merge_request_reviewers' with 'CREATE INDEX...
+```
+
+The current migration do use `restrict_gitlab_migration`. The presence indicates **DML** mode,
+but the executed payload appears to be doing structure changes (DDL).
+
+**The solution** is to remove `restrict_gitlab_migration gitlab_schema: :gitlab_main`.
+
+### Exception 3: migration running in DML mode accesses data from a table in another schema
+
+```ruby
+class UpdateProjectsArchivedState < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ # Since it modifies `projects` it should use `gitlab_main`
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ def up
+ update_column_in_batches(:projects, :archived, true) do |table, query|
+ query.where(table[:archived].eq(false)) # rubocop:disable CodeReuse/ActiveRecord
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
+```
+
+```plaintext
+Select/DML queries (SELECT/UPDATE/DELETE) do access 'projects' (gitlab_main) " \
+which is outside of list of allowed schemas: 'gitlab_ci'
+```
+
+The current migration do restrict the migration to `gitlab_ci`, but appears to modify
+data in `gitlab_main`.
+
+**The solution** is to change `restrict_gitlab_migration gitlab_schema: :gitlab_ci`.
+
+### Exception 4: mixing DDL and DML mode
+
+```ruby
+class UpdateProjectsArchivedState < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ # This migration is invalid regardless of specification
+ # as it cannot modify structure and data at the same time
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ def up
+ add_concurrent_index :merge_request_reviewers, [:user_id, :state], where: 'state = 2', name: 'index_on_merge_request_reviewers'
+ update_column_in_batches(:projects, :archived, true) do |table, query|
+ query.where(table[:archived].eq(false)) # rubocop:disable CodeReuse/ActiveRecord
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
+```
+
+The migrations mixing **DDL** and **DML** depending on ordering of operations raises
+one of the prior exceptions.
+
+## Upcoming changes on multiple database migrations
+
+The `restrict_gitlab_migration` using `gitlab_schema:` is considered as a first iteration
+of this feature for running migrations selectively depending on a context. It is possible
+to add additional restrictions to DML-only migrations (as the structure coherency is likely
+to stay as-is until further notice) to restrict when they run.
+
+A Potential extension is to limit running DML migration only to specific environments:
+
+```ruby
+restrict_gitlab_migration gitlab_schema: :gitlab_main, gitlab_env: :gitlab_com
+```
diff --git a/doc/development/database/multiple_databases.md b/doc/development/database/multiple_databases.md
index c9bbf73be55..3b1b06b557c 100644
--- a/doc/development/database/multiple_databases.md
+++ b/doc/development/database/multiple_databases.md
@@ -9,141 +9,86 @@ info: To determine the technical writer assigned to the Stage/Group associated w
To scale GitLab, the we are
[decomposing the GitLab application database into multiple databases](https://gitlab.com/groups/gitlab-org/-/epics/6168).
-## CI/CD Database
+## GitLab Schema
-> 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.
+For properly discovering allowed patterns between different databases
+the GitLab application implements the `lib/gitlab/database/gitlab_schemas.yml` YAML file.
-### Development setup
+This file provides a virtual classification of tables into a `gitlab_schema`
+which conceptually is similar to [PostgreSQL Schema](https://www.postgresql.org/docs/current/ddl-schemas.html).
+We decided as part of [using database schemas to better isolated CI decomposed features](https://gitlab.com/gitlab-org/gitlab/-/issues/333415)
+that we cannot use PostgreSQL schema due to complex migration procedures. Instead we implemented
+the concept of application-level classification.
+Each table of GitLab needs to have a `gitlab_schema` assigned:
-By default, GitLab is configured to use only one main database. To
-opt-in to use a main database, and CI database, modify the
-`config/database.yml` file to have a `main` and a `ci` database
-configurations.
+- `gitlab_main`: describes all tables that are being stored in the `main:` database (for example, like `projects`, `users`).
+- `gitlab_ci`: describes all CI tables that are being stored in the `ci:` database (for example, `ci_pipelines`, `ci_builds`).
+- `gitlab_shared`: describe all application tables that contain data across all decomposed databases (for example, `loose_foreign_keys_deleted_records`).
+- `...`: more schemas to be introduced with additional decomposed databases
-You can set this up using [GDK](#gdk-configuration) or by
-[manually configuring `config/database.yml`](#manually-set-up-the-cicd-database).
+The usage of schema enforces the base class to be used:
-#### GDK configuration
+- `ApplicationRecord` for `gitlab_main`
+- `Ci::ApplicationRecord` for `gitlab_ci`
+- `Gitlab::Database::SharedModel` for `gitlab_shared`
-If you are using GDK, you can follow the following steps:
+### The impact of `gitlab_schema`
-1. On the GDK root directory, run:
+The usage of `gitlab_schema` has a significant impact on the application.
+The `gitlab_schema` primary purpose is to introduce a barrier between different data access patterns.
- ```shell
- gdk config set gitlab.rails.databases.ci.enabled true
- ```
+This is used as a primary source of classification for:
-1. Open your `gdk.yml`, and confirm that it has the following lines:
+- [Discovering cross-joins across tables from different schemas](#removing-joins-between-ci_-and-non-ci_-tables)
+- [Discovering cross-database transactions across tables from different schemas](#removing-cross-database-transactions)
- ```yaml
- gitlab:
- rails:
- databases:
- ci:
- enabled: true
- ```
+### The special purpose of `gitlab_shared`
-1. Reconfigure GDK:
+`gitlab_shared` is a special case describing tables or views that by design contain data across
+all decomposed databases. This does describe application-defined tables (like `loose_foreign_keys_deleted_records`),
+Rails-defined tables (like `schema_migrations` or `ar_internal_metadata` as well as internal PostgreSQL tables
+(for example, `pg_attribute`).
- ```shell
- gdk reconfigure
- ```
+**Be careful** to use `gitlab_shared` as it requires special handling while accessing data.
+Since `gitlab_shared` shares not only structure but also data, the application needs to be written in a way
+that traverses all data from all databases in sequential manner.
-1. [Create the new CI/CD database](#create-the-new-database).
+```ruby
+Gitlab::Database::EachDatabase.each_model_connection([MySharedModel]) do |connection, connection_name|
+ MySharedModel.select_all_data...
+end
+```
-#### Manually set up the CI/CD database
+As such, migrations modifying data of `gitlab_shared` tables are expected to run across
+all decomposed databases.
-You can manually edit `config/database.yml` to split the databases.
-To do so, consider a `config/database.yml` file like the example below:
+## Migrations
-```yaml
-development:
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_development
- host: /path/to/gdk/postgresql
- pool: 10
- prepared_statements: false
- variables:
- statement_timeout: 120s
-
-test: &test
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_test
- host: /path/to/gdk/postgresql
- pool: 10
- prepared_statements: false
- variables:
- statement_timeout: 120s
-```
+Read [Migrations for Multiple Databases](migrations_for_multiple_databases.md).
-Edit it to split the databases into `main` and `ci`:
+## CI/CD Database
-```yaml
-development:
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_development
- host: /path/to/gdk/postgresql
- pool: 10
- prepared_statements: false
- variables:
- statement_timeout: 120s
- ci:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_development_ci
- host: /path/to/gdk/postgresql
- pool: 10
- prepared_statements: false
- variables:
- statement_timeout: 120s
-
-test: &test
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_test
- host: /path/to/gdk/postgresql
- pool: 10
- prepared_statements: false
- variables:
- statement_timeout: 120s
- ci:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_test_ci
- host: /path/to/gdk/postgresql
- pool: 10
- prepared_statements: false
- variables:
- statement_timeout: 120s
-```
+> 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.
-Next, [create the new CI/CD database](#create-the-new-database).
+### Configure single database
-#### Create the new database
+By default, GDK is configured to run with multiple databases. To configure GDK to use a single database:
-After configuring GitLab for the two databases, create the new CI/CD database:
+1. On the GDK root directory, run:
-1. Create the new `ci:` database, load the DB schema into the `ci:` database,
- and run any pending migrations:
+ ```shell
+ gdk config set gitlab.rails.databases.ci.enabled false
+ ```
- ```shell
- bundle exec rails db:create db:schema:load:ci db:migrate
- ```
+1. Reconfigure GDK:
-1. Restart GDK:
+ ```shell
+ gdk reconfigure
+ ```
- ```shell
- gdk restart
- ```
+To switch back to using multiple databases, set `gitlab.rails.databases.ci.enabled` to `true` and run `gdk reconfigure`.
<!--
NOTE: The `validate_cross_joins!` method in `spec/support/database/prevent_cross_joins.rb` references
@@ -167,9 +112,9 @@ already many such examples that need to be fixed in
The following steps are the process to remove cross-database joins between
`ci_*` and non `ci_*` tables:
-1. **{check-circle}** Add all failing specs to the [`cross-join-allowlist.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/f5de89daeb468fc45e1e95a76d1b5297aa53da11/spec/support/database/cross-join-allowlist.yml)
+1. **{check-circle}** Add all failing specs to the [`cross-join-allowlist.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/support/database/cross-join-allowlist.yml)
file.
-1. **{dotted-circle}** Find the code that caused the spec failure and wrap the isolated code
+1. **{check-circle}** Find the code that caused the spec failure and wrap the isolated code
in [`allow_cross_joins_across_databases`](#allowlist-for-existing-cross-joins).
Link to a new issue assigned to the correct team to remove the specs from the
`cross-join-allowlist.yml` file.
diff --git a/doc/development/database/not_null_constraints.md b/doc/development/database/not_null_constraints.md
index de070f7e434..af7d569e282 100644
--- a/doc/development/database/not_null_constraints.md
+++ b/doc/development/database/not_null_constraints.md
@@ -197,7 +197,7 @@ end
If you have to clean up a nullable column for a [high-traffic table](../migration_style_guide.md#high-traffic-tables)
(for example, the `artifacts` in `ci_builds`), your background migration will go on for a while and
-it will need an additional [background migration cleaning up](../background_migrations.md#cleaning-up)
+it will need an additional [background migration cleaning up](background_migrations.md#cleaning-up)
in the release after adding the data migration.
In that rare case you will need 3 releases end-to-end:
diff --git a/doc/development/database/post_deployment_migrations.md b/doc/development/database/post_deployment_migrations.md
new file mode 100644
index 00000000000..799eefdb875
--- /dev/null
+++ b/doc/development/database/post_deployment_migrations.md
@@ -0,0 +1,81 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Post Deployment Migrations
+
+Post deployment migrations are regular Rails migrations that can optionally be
+executed after a deployment. By default these migrations are executed alongside
+the other migrations. To skip these migrations you must set the
+environment variable `SKIP_POST_DEPLOYMENT_MIGRATIONS` to a non-empty value
+when running `rake db:migrate`.
+
+For example, this would run all migrations including any post deployment
+migrations:
+
+```shell
+bundle exec rake db:migrate
+```
+
+This however skips post deployment migrations:
+
+```shell
+SKIP_POST_DEPLOYMENT_MIGRATIONS=true bundle exec rake db:migrate
+```
+
+## Deployment Integration
+
+Say you're using Chef for deploying new versions of GitLab and you'd like to run
+post deployment migrations after deploying a new version. Let's assume you
+normally use the command `chef-client` to do so. To make use of this feature
+you'd have to run this command as follows:
+
+```shell
+SKIP_POST_DEPLOYMENT_MIGRATIONS=true sudo chef-client
+```
+
+Once all servers have been updated you can run `chef-client` again on a single
+server _without_ the environment variable.
+
+The process is similar for other deployment techniques: first you would deploy
+with the environment variable set, then you re-deploy a single
+server but with the variable _unset_.
+
+## Creating Migrations
+
+To create a post deployment migration you can use the following Rails generator:
+
+```shell
+bundle exec rails g post_deployment_migration migration_name_here
+```
+
+This generates the migration file in `db/post_migrate`. These migrations
+behave exactly like regular Rails migrations.
+
+## Use Cases
+
+Post deployment migrations can be used to perform migrations that mutate state
+that an existing version of GitLab depends on. For example, say you want to
+remove a column from a table. This requires downtime as a GitLab instance
+depends on this column being present while it's running. Normally you'd follow
+these steps in such a case:
+
+1. Stop the GitLab instance
+1. Run the migration removing the column
+1. Start the GitLab instance again
+
+Using post deployment migrations we can instead follow these steps:
+
+1. Deploy a new version of GitLab while ignoring post deployment migrations
+1. Re-run `rake db:migrate` but without the environment variable set
+
+Here we don't need any downtime as the migration takes place _after_ a new
+version (which doesn't depend on the column anymore) has been deployed.
+
+Some other examples where these migrations are useful:
+
+- Cleaning up data generated due to a bug in GitLab
+- Removing tables
+- Migrating jobs from one Sidekiq queue to another
diff --git a/doc/development/database/rename_database_tables.md b/doc/development/database/rename_database_tables.md
index 881adf00ad0..7a76c028042 100644
--- a/doc/development/database/rename_database_tables.md
+++ b/doc/development/database/rename_database_tables.md
@@ -82,7 +82,7 @@ when naming indexes, so there is a possibility that not all indexes are properly
the migration locally, check if there are inconsistently named indexes (`db/structure.sql`). Those can be
renamed manually in a separate migration, which can be also part of the release M.N+1.
- Foreign key columns might still contain the old table name. For smaller tables, follow our [standard column
-rename process](../avoiding_downtime_in_migrations.md#renaming-columns)
+rename process](avoiding_downtime_in_migrations.md#renaming-columns)
- Avoid renaming database tables which are using with triggers.
- Table modifications (add or remove columns) are not allowed during the rename process, please make sure that all changes to the table happen before the rename migration is started (or in the next release).
- As the index names might change, verify that the model does not use bulk insert
diff --git a/doc/development/database/strings_and_the_text_data_type.md b/doc/development/database/strings_and_the_text_data_type.md
index 9674deb4603..4ed7cf1b4de 100644
--- a/doc/development/database/strings_and_the_text_data_type.md
+++ b/doc/development/database/strings_and_the_text_data_type.md
@@ -229,7 +229,7 @@ end
To keep this guide short, we skipped the definition of the background migration and only
provided a high level example of the post-deployment migration that is used to schedule the batches.
-You can find more information on the guide about [background migrations](../background_migrations.md)
+You can find more information on the guide about [background migrations](background_migrations.md)
#### Validate the text limit (next release)
@@ -277,7 +277,7 @@ end
If you have to clean up a text column for a really [large table](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml#L3)
(for example, the `artifacts` in `ci_builds`), your background migration will go on for a while and
-it will need an additional [background migration cleaning up](../background_migrations.md#cleaning-up)
+it will need an additional [background migration cleaning up](background_migrations.md#cleaning-up)
in the release after adding the data migration.
In that rare case you will need 3 releases end-to-end:
diff --git a/doc/development/database/table_partitioning.md b/doc/development/database/table_partitioning.md
index 5319c73aad0..ec768136404 100644
--- a/doc/development/database/table_partitioning.md
+++ b/doc/development/database/table_partitioning.md
@@ -214,7 +214,7 @@ end
```
This step uses the same mechanism as any background migration, so you
-may want to read the [Background Migration](../background_migrations.md)
+may want to read the [Background Migration](background_migrations.md)
guide for details on that process. Background jobs are scheduled every
2 minutes and copy `50_000` records at a time, which can be used to
estimate the timing of the background migration portion of the
diff --git a/doc/development/database_review.md b/doc/development/database_review.md
index 4b5845992b9..fd0e2e17623 100644
--- a/doc/development/database_review.md
+++ b/doc/development/database_review.md
@@ -125,7 +125,7 @@ the following preparations into account.
test its execution using `CREATE INDEX CONCURRENTLY` in the `#database-lab` Slack channel and add the execution time to the MR description:
- Execution time largely varies between `#database-lab` and GitLab.com, but an elevated execution time from `#database-lab`
can give a hint that the execution on GitLab.com will also be considerably high.
- - If the execution from `#database-lab` is longer than `1h`, the index should be moved to a [post-migration](post_deployment_migrations.md).
+ - If the execution from `#database-lab` is longer than `1h`, the index should be moved to a [post-migration](database/post_deployment_migrations.md).
Keep in mind that in this case you may need to split the migration and the application changes in separate releases to ensure the index
will be in place when the code that needs it will be deployed.
- Manually trigger the [database testing](database/database_migration_pipeline.md) job (`db:gitlabcom-database-testing`) in the `test` stage.
@@ -212,7 +212,7 @@ Include in the MR description:
#### Preparation when removing columns, tables, indexes, or other structures
-- Follow the [guidelines on dropping columns](avoiding_downtime_in_migrations.md#dropping-columns).
+- Follow the [guidelines on dropping columns](database/avoiding_downtime_in_migrations.md#dropping-columns).
- Generally it's best practice (but not a hard rule) to remove indexes and foreign keys in a post-deployment migration.
- Exceptions include removing indexes and foreign keys for small tables.
- If you're adding a composite index, another index might become redundant, so remove that in the same migration.
@@ -222,6 +222,7 @@ Include in the MR description:
- Check migrations
- Review relational modeling and design choices
+ - Consider [access patterns and data layout](database/layout_and_access_patterns.md) if new tables or columns are added.
- Review migrations follow [database migration style guide](migration_style_guide.md),
for example
- [Check ordering of columns](ordering_table_columns.md)
@@ -235,8 +236,8 @@ Include in the MR description:
- Check that the relevant version files under `db/schema_migrations` were added or removed.
- Check queries timing (If any): In a single transaction, cumulative query time executed in a migration
needs to fit comfortably within `15s` - preferably much less than that - on GitLab.com.
- - For column removals, make sure the column has been [ignored in a previous release](avoiding_downtime_in_migrations.md#dropping-columns)
-- Check [background migrations](background_migrations.md):
+ - For column removals, make sure the column has been [ignored in a previous release](database/avoiding_downtime_in_migrations.md#dropping-columns)
+- Check [background migrations](database/background_migrations.md):
- Establish a time estimate for execution on GitLab.com. For historical purposes,
it's highly recommended to include this estimation on the merge request description.
- If a single `update` is below than `1s` the query can be placed
@@ -249,6 +250,8 @@ Include in the MR description:
it's suggested to treat background migrations as post migrations:
place them in `db/post_migrate` instead of `db/migrate`. Keep in mind
that post migrations are executed post-deployment in production.
+ - If a migration [has tracking enabled](database/background_migrations.md#background-jobs-tracking),
+ ensure `mark_all_as_succeeded` is called even if no work is done.
- Check [timing guidelines for migrations](migration_style_guide.md#how-long-a-migration-should-take)
- Check migrations are reversible and implement a `#down` method
- Check new table migrations:
diff --git a/doc/development/deleting_migrations.md b/doc/development/deleting_migrations.md
index 25ec1c08335..5d5ca431598 100644
--- a/doc/development/deleting_migrations.md
+++ b/doc/development/deleting_migrations.md
@@ -1,39 +1,11 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'database/deleting_migrations.md'
+remove_date: '2022-07-08'
---
-# Delete existing migrations
+This document was moved to [another location](database/deleting_migrations.md).
-When removing existing migrations from the GitLab project, you have to take into account
-the possibility of the migration already been included in past releases or in the current release, and thus already executed on GitLab.com and/or in self-managed instances.
-
-Because of it, it's not possible to delete existing migrations, as that could lead to:
-
-- Schema inconsistency, as changes introduced into the database were not rolled back properly.
-- Leaving a record on the `schema_versions` table, that points out to migration that no longer exists on the codebase.
-
-Instead of deleting we can opt for disabling the migration.
-
-## Pre-requisites to disable a migration
-
-Migrations can be disabled if:
-
-- They caused a timeout or general issue on GitLab.com.
-- They are obsoleted, for example, changes are not necessary due to a feature change.
-- Migration is a data migration only, that is, the migration does not change the database schema.
-
-## How to disable a data migration?
-
-In order to disable a migration, the following steps apply to all types of migrations:
-
-1. Turn the migration into a no-op by removing the code inside `#up`, `#down`
- or `#perform` methods, and adding `# no-op` comment instead.
-1. Add a comment explaining why the code is gone.
-
-Disabling migrations requires explicit approval of Database Maintainer.
-
-## Examples
-
-- [Disable scheduling of productivity analytics](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17253)
+<!-- This redirect file can be deleted after <2022-07-08>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/diffs.md b/doc/development/diffs.md
index d61de740f15..5f03ba93a4d 100644
--- a/doc/development/diffs.md
+++ b/doc/development/diffs.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Create
+group: Code Review
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/development/documentation/feature_flags.md b/doc/development/documentation/feature_flags.md
index 1e4698ff867..fb58851e93f 100644
--- a/doc/development/documentation/feature_flags.md
+++ b/doc/development/documentation/feature_flags.md
@@ -19,8 +19,29 @@ must be documented. For context, see the
When you document feature flags, you must:
-- [Add a note at the start of the topic](#use-a-note-to-describe-the-state-of-the-feature-flag).
- [Add version history text](#add-version-history-text).
+- [Add a note at the start of the topic](#use-a-note-to-describe-the-state-of-the-feature-flag).
+
+## Add version history text
+
+When the state of a flag changes (for example, disabled by default to enabled by default), add the change to the version history.
+
+Possible version history entries are:
+
+```markdown
+> - [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.
+> - [Generally available](issue-link) in GitLab X.Y. [Feature flag <flag name>](issue-link) removed.
+```
+
+You can combine entries if they happened in the same release:
+
+```markdown
+> - Introduced in GitLab 14.2 [with a flag](../../administration/feature_flags.md) named `ci_include_rules`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.3.
+```
## Use a note to describe the state of the feature flag
@@ -30,7 +51,8 @@ The note has three parts, and follows this structure:
```markdown
FLAG:
-<Self-managed GitLab availability information.> <GitLab.com availability information.>
+<Self-managed GitLab availability information.>
+<GitLab.com availability information.>
<This feature is not ready for production use.>
```
@@ -61,27 +83,6 @@ If needed, you can add this sentence:
`The feature is not ready for production use.`
-## Add version history text
-
-When the state of a flag changes (for example, disabled by default to enabled by default), add the change to the version history.
-
-Possible version history entries are:
-
-```markdown
-> - [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.
-> - [Generally available](issue-link) in GitLab X.Y. [Feature flag <flag name>](issue-link) removed.
-```
-
-You can combine entries if they happened in the same release:
-
-```markdown
-> - Introduced in GitLab 14.2 [with a flag](../../administration/feature_flags.md) named `ci_include_rules`. Disabled by default.
-> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.3.
-```
-
## Feature flag documentation examples
The following examples show the progression of a feature flag.
diff --git a/doc/development/documentation/index.md b/doc/development/documentation/index.md
index 66d6beb821f..c6afcdbddd0 100644
--- a/doc/development/documentation/index.md
+++ b/doc/development/documentation/index.md
@@ -20,7 +20,7 @@ In addition to this page, the following resources can help you craft and contrib
## Source files and rendered web locations
-Documentation for GitLab, GitLab Runner, Omnibus GitLab, and Charts is published to <https://docs.gitlab.com>. Documentation for GitLab is also published within the application at `/help` on the domain of the GitLab instance.
+Documentation for GitLab, GitLab Runner, GitLab Operator, Omnibus GitLab, and Charts is published to <https://docs.gitlab.com>. Documentation for GitLab is also published within the application at `/help` on the domain of the GitLab instance.
At `/help`, only help for your current edition and version is included. Help for other versions is available at <https://docs.gitlab.com/archives/>.
The source of the documentation exists within the codebase of each GitLab application in the following repository locations:
@@ -31,6 +31,7 @@ The source of the documentation exists within the codebase of each GitLab applic
| [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner/) | [`/docs`](https://gitlab.com/gitlab-org/gitlab-runner/-/tree/main/docs) |
| [Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/) | [`/doc`](https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master/doc) |
| [Charts](https://gitlab.com/gitlab-org/charts/gitlab) | [`/doc`](https://gitlab.com/gitlab-org/charts/gitlab/tree/master/doc) |
+| [GitLab Operator](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator) | [`/doc`](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/-/tree/master/doc) |
Documentation issues and merge requests are part of their respective repositories and all have the label `Documentation`.
diff --git a/doc/development/documentation/restful_api_styleguide.md b/doc/development/documentation/restful_api_styleguide.md
index 4d654b6b901..8a505ed84a8 100644
--- a/doc/development/documentation/restful_api_styleguide.md
+++ b/doc/development/documentation/restful_api_styleguide.md
@@ -83,23 +83,25 @@ to describe the GitLab release that introduced the API call.
Use the following table headers to describe the methods. Attributes should
always be in code blocks using backticks (`` ` ``).
-Sort the attributes in the table: first, required, then alphabetically.
+Sort the table by required attributes first, then alphabetically.
```markdown
| Attribute | Type | Required | Description |
|:-----------------------------|:--------------|:-----------------------|:-----------------------------------------------------|
-| `user` | string | **{check-circle}** Yes | The GitLab username. |
-| `assignee_ids` **(PREMIUM)** | integer array | **{dotted-circle}** No | The IDs of the users to assign the issue to. |
-| `confidential` | boolean | **{dotted-circle}** No | Set an issue to be confidential. Default is `false`. |
+| `title` | string | **{check-circle}** Yes | Title of the issue. |
+| `assignee_ids` **(PREMIUM)** | integer array | **{dotted-circle}** No | IDs of the users to assign the issue to. |
+| `confidential` | boolean | **{dotted-circle}** No | Sets the issue to confidential. Default is `false`. |
```
Rendered example:
| Attribute | Type | Required | Description |
|:-----------------------------|:--------------|:-----------------------|:-----------------------------------------------------|
-| `user` | string | **{check-circle}** Yes | The GitLab username. |
-| `assignee_ids` **(PREMIUM)** | integer array | **{dotted-circle}** No | The IDs of the users to assign the issue to. |
-| `confidential` | boolean | **{dotted-circle}** No | Set an issue to be confidential. Default is `false`. |
+| `title` | string | **{check-circle}** Yes | Title of the issue. |
+| `assignee_ids` **(PREMIUM)** | integer array | **{dotted-circle}** No | IDs of the users to assign the issue to. |
+| `confidential` | boolean | **{dotted-circle}** No | Sets the issue to confidential. Default is `false`. |
+
+For information about writing attribute descriptions, see the [GraphQL API description style guide](../api_graphql_styleguide.md#description-style-guide).
## cURL commands
diff --git a/doc/development/documentation/site_architecture/index.md b/doc/development/documentation/site_architecture/index.md
index e7a915eab09..bdda15e2064 100644
--- a/doc/development/documentation/site_architecture/index.md
+++ b/doc/development/documentation/site_architecture/index.md
@@ -71,7 +71,7 @@ GitLab Docs is built with a combination of external:
- [Schema.org](https://schema.org/)
- [Google Analytics](https://marketingplatform.google.com/about/analytics/)
-- [Google Tag Manager](https://developers.google.com/tag-manager/)
+- [Google Tag Manager](https://developers.google.com/tag-platform/tag-manager)
## Global navigation
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 91e9d0c703d..7bfc0320d02 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -349,17 +349,15 @@ Follow these guidelines for punctuation:
<!-- vale gitlab.Repetition = NO -->
-| Rule | Example |
-|------------------------------------------------------------------|--------------------------------------------------------|
-| Avoid semicolons. Use two sentences instead. | That's the way that the world goes 'round. You're up one day and the next you're down.
-| Always end full sentences with a period. | For a complete overview, read through this document. |
-| Always add a space after a period when beginning a new sentence. | For a complete overview, check this doc. For other references, check out this guide. |
-| Do not use double spaces. (Tested in [`SentenceSpacing.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/SentenceSpacing.yml).) | --- |
-| Do not use tabs for indentation. Use spaces instead. You can configure your code editor to output spaces instead of tabs when pressing the tab key. | --- |
-| Use serial commas (Oxford commas) before the final **and** or **or** in a list of three or more items. (Tested in [`OxfordComma.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/OxfordComma.yml).) | You can create new issues, merge requests, and milestones. |
-| Always add a space before and after dashes when using it in a sentence (for replacing a comma, for example). | You should try this - or not. |
-| When a colon is part of a sentence, always use lowercase after the colon. | Linked issues: a way to create a relationship between issues. |
-| Do not use typographer's quotes. Use straight quotes instead. (Tested in [`NonStandardQuotes.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/NonStandardQuotes.yml).) | "It's the questions we can't answer that teach us the most"---Patrick Rothfuss |
+- End full sentences with a period.
+- Use one space between sentences.
+- Do not use semicolons. Use two sentences instead.
+- Do not use double spaces. (Tested in [`SentenceSpacing.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/SentenceSpacing.yml).)
+- Do not use non-breaking spaces. Use standard spaces instead. (Tested in [`lint-doc.sh`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/scripts/lint-doc.sh).)
+- Do not use tabs for indentation. Use spaces instead. You can configure your code editor to output spaces instead of tabs when pressing the tab key.
+- Use serial (Oxford) commas before the final **and** or **or** in a list of three or more items. (Tested in [`OxfordComma.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/OxfordComma.yml).)
+- Avoid dashes. Use separate sentences, or commas, instead.
+- Do not use typographer's ("curly") quotes. Use straight quotes instead. (Tested in [`NonStandardQuotes.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/NonStandardQuotes.yml).)
<!-- vale gitlab.Repetition = YES -->
@@ -403,17 +401,6 @@ Backticks are more precise than quotes. For example, in this string:
It's not clear whether the user should include the period in the string.
-### Spaces between words
-
-Use only standard spaces between words. The search engine for the documentation
-website doesn't split words separated with
-[non-breaking spaces](https://en.wikipedia.org/wiki/Non-breaking_space) when
-indexing, and fails to create expected individual search terms. Tests that search
-for certain words separated by regular spaces can't find words separated by
-non-breaking spaces.
-
-Tested in [`lint-doc.sh`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/scripts/lint-doc.sh).
-
## Lists
- Always start list items with a capital letter, unless they're parameters or
@@ -421,30 +408,30 @@ Tested in [`lint-doc.sh`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/scr
- Always leave a blank line before and after a list.
- Begin a line with spaces (not tabs) to denote a [nested sub-item](#nesting-inside-a-list-item).
-### Ordered vs. unordered lists
+### Choose between an ordered or unordered list
-Only use ordered lists when their items describe a sequence of steps to follow.
-
-Do:
+Use ordered lists for a sequence of steps. For example:
```markdown
-These are the steps to do something:
+Follow these steps to do something.
1. First, do the first step.
1. Then, do the next step.
1. Finally, do the last step.
```
-Don't:
+Use an unordered lists when the steps do not need to be completed in order. For example:
```markdown
-This is a list of available features:
+These things are imported:
-1. Feature 1
-1. Feature 2
-1. Feature 3
+- Thing 1
+- Thing 2
+- Thing 3
```
+You can choose to introduce either list with a colon, but you do not have to.
+
### Markup
- Use dashes (`-`) for unordered lists instead of asterisks (`*`).
@@ -454,12 +441,8 @@ This is a list of available features:
### Punctuation
- Don't add commas (`,`) or semicolons (`;`) to the ends of list items.
-- Only add periods to the end of a list item if the item consists of a complete
- sentence (with a subject and a verb).
-- Be consistent throughout the list: if the majority of the items do not end in
- a period, do not end any of the items in a period, even if they consist of a
- complete sentence. The opposite is also valid: if the majority of the items
- end with a period, end all with a period.
+- If a list item is a complete sentence (with a subject and a verb), add a period at the end.
+- Majority rules. If the majority of items do not end in a period, do not end any of the items in a period.
- Separate list items from explanatory text with a colon (`:`). For example:
```markdown
@@ -469,32 +452,6 @@ This is a list of available features:
- Second item: this explains the second item.
```
-**Examples:**
-
-Do:
-
-- First list item
-- Second list item
-- Third list item
-
-Don't:
-
-- First list item
-- Second list item
-- Third list item.
-
-Do:
-
-- Let's say this is a complete sentence.
-- Let's say this is also a complete sentence.
-- Not a complete sentence.
-
-Don't (vary use of periods; majority rules):
-
-- Let's say this is a complete sentence.
-- Let's say this is also a complete sentence.
-- Not a complete sentence
-
### Nesting inside a list item
It's possible to nest items under a list item, so that they render with the same
@@ -686,7 +643,7 @@ For the heading text, **do not**:
- Use words that might change in the future. Changing
a heading changes its anchor URL, which affects other linked pages.
- Repeat text from earlier headings. For example, instead of `Troubleshooting merge requests`,
- use `Troubleshooting`.
+ use `Troubleshooting`.
- Use links.
### Anchor links
@@ -746,7 +703,7 @@ We include guidance for links in these categories:
- Use inline link Markdown markup `[Text](https://example.com)`.
It's easier to read, review, and maintain. Do not use `[Text][identifier]` reference-style links.
-- Use [meaningful anchor text](https://www.futurehosting.com/blog/links-should-have-meaningful-anchor-text-heres-why/).
+- Use meaningful anchor text.
For example, instead of writing something like `Read more about merge requests [here](LINK)`,
write `Read more about [merge requests](LINK)`.
@@ -1561,6 +1518,47 @@ The voting strategy in GitLab 13.4 and later requires the primary and secondary
voters to agree.
```
+#### Deprecated features
+
+When a feature is deprecated, add `(DEPRECATED)` to the page title or to
+the heading of the section documenting the feature, immediately before
+the tier badge:
+
+```markdown
+<!-- Page title example: -->
+# Feature A (DEPRECATED) **(ALL TIERS)**
+
+<!-- Doc section example: -->
+## Feature B (DEPRECATED) **(PREMIUM SELF)**
+```
+
+Add the deprecation to the version history note (you can include a link
+to a replacement when available):
+
+```markdown
+> - [Deprecated](<link-to-issue>) in GitLab 11.3. Replaced by [meaningful text](<link-to-appropriate-documentation>).
+```
+
+You can also describe the replacement in surrounding text, if available. If the
+deprecation isn't obvious in existing text, you may want to include a warning:
+
+```markdown
+WARNING:
+This feature was [deprecated](link-to-issue) in GitLab 12.3 and replaced by
+[Feature name](link-to-feature-documentation).
+```
+
+If you add `(DEPRECATED)` to the page's title and the document is linked from the docs
+navigation, either remove the page from the nav or update the nav item to include the
+same text before the feature name:
+
+```yaml
+ - doc_title: (DEPRECATED) Feature A
+```
+
+In the first major GitLab version after the feature was deprecated, be sure to
+remove information about that deprecated feature.
+
#### End-of-life for features or products
When a feature or product enters its end-of-life, indicate its status by
@@ -1572,7 +1570,7 @@ For example:
```markdown
WARNING:
This feature is in its end-of-life process. It is [deprecated](link-to-issue)
-for use in GitLab X.X, and is planned for [removal](link-to-issue) in GitLab X.X.
+in GitLab X.X, and is planned for [removal](link-to-issue) in GitLab X.X.
```
After the feature or product is officially deprecated and removed, remove
@@ -1647,47 +1645,6 @@ To view historical information about a feature, review GitLab
[release posts](https://about.gitlab.com/releases/), or search for the issue or
merge request where the work was done.
-### Deprecated features
-
-When a feature is deprecated, add `(DEPRECATED)` to the page title or to
-the heading of the section documenting the feature, immediately before
-the tier badge:
-
-```markdown
-<!-- Page title example: -->
-# Feature A (DEPRECATED) **(ALL TIERS)**
-
-<!-- Doc section example: -->
-## Feature B (DEPRECATED) **(PREMIUM SELF)**
-```
-
-Add the deprecation to the version history note (you can include a link
-to a replacement when available):
-
-```markdown
-> - [Deprecated](<link-to-issue>) in GitLab 11.3. Replaced by [meaningful text](<link-to-appropriate-documentation>).
-```
-
-You can also describe the replacement in surrounding text, if available. If the
-deprecation isn't obvious in existing text, you may want to include a warning:
-
-```markdown
-WARNING:
-This feature was [deprecated](link-to-issue) in GitLab 12.3 and replaced by
-[Feature name](link-to-feature-documentation).
-```
-
-If you add `(DEPRECATED)` to the page's title and the document is linked from the docs
-navigation, either remove the page from the nav or update the nav item to include the
-same text before the feature name:
-
-```yaml
- - doc_title: (DEPRECATED) Feature A
-```
-
-In the first major GitLab version after the feature was deprecated, be sure to
-remove information about that deprecated feature.
-
## Products and features
Refer to the information in this section when describing products and features
diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md
index c38c6586c3a..65f6a0a328b 100644
--- a/doc/development/documentation/styleguide/word_list.md
+++ b/doc/development/documentation/styleguide/word_list.md
@@ -97,6 +97,12 @@ The token generated when you create an agent for Kubernetes. Use **agent access
- secret token
- authentication token
+## air gap, air-gapped
+
+Use **offline environment** to describe installations that have physical barriers or security policies that prevent or limit internet access. Do not use **air gap**, **air gapped**, or **air-gapped**. For example:
+
+- The firewall policies in an offline environment prevent the computer from accessing the internet.
+
## allow, enable
Try to avoid **allow** and **enable**, unless you are talking about security-related features.
@@ -261,11 +267,17 @@ Do not use **Developer permissions**. A user who is assigned the Developer role
See [the Microsoft style guide](https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/d/disable-disabled) for guidance on **disable**.
Use **inactive** or **off** instead. ([Vale](../testing.md#vale) rule: [`InclusionAbleism.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionAbleism.yml))
-
## disallow
Use **prevent** instead of **disallow**. ([Vale](../testing.md#vale) rule: [`Substitutions.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/Substitutions.yml))
+## downgrade
+
+To be more upbeat and precise, do not use **downgrade**. Focus instead on the action the user is taking.
+
+- For changing to earlier GitLab versions, use [**roll back**](#roll-back).
+- For changing to lower GitLab tiers, use **change the subscription tier**.
+
## dropdown list
Use **dropdown list** to refer to the UI element. Do not use **dropdown** without **list** after it.
@@ -729,12 +741,31 @@ Do not use **Reporter permissions**. A user who is assigned the Reporter role ha
Use title case for **Repository Mirroring**.
+## respectively
+
+Avoid **respectively** and be more precise instead.
+
+Use:
+
+- To create a user, select **Create user**. For an existing user, select **Save changes**.
+
+Instead of:
+
+- Select **Create user** or **Save changes** if you created a new user or
+ edited an existing one respectively.
+
## roles
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).
+## roll back
+
+Use **roll back** for changing a GitLab version to an earlier one.
+
+Do not use **roll back** for licensing or subscriptions. Use **change the subscription tier** instead.
+
## 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).
@@ -921,6 +952,33 @@ Use [**2FA** and **two-factor authentication**](#2fa-two-factor-authentication)
Do not use **type** if you can avoid it. Use **enter** instead.
+## update
+
+Use **update** for installing a newer **patch** version of the software only. For example:
+
+- Update GitLab from 14.9 to 14.9.1.
+
+Do not use **update** for any other case. Instead, use **upgrade**.
+
+## upgrade
+
+Use **upgrade** for:
+
+- Choosing a higher subscription tier (Premium or Ultimate).
+- Installing a newer **major** (13.0, 14.0) or **minor** (13.8, 14.5) version of GitLab.
+
+For example:
+
+- Upgrade to GitLab Ultimate.
+- Upgrade GitLab from 14.0 to 14.1.
+- Upgrade GitLab from 14.0 to 15.0.
+
+Use caution with the phrase **Upgrade GitLab** without any other text.
+Ensure the surrounding text clarifies whether
+you're talking about the product version or the subscription tier.
+
+See also [downgrade](#downgrade) and [roll back](#roll-back).
+
## useful
Do not use **useful**. If the user doesn't find the process to be useful, we lose their trust. ([Vale](../testing.md#vale) rule: [`Simplicity.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/Simplicity.yml))
@@ -971,7 +1029,7 @@ Do not use **yet** when talking about the product or its features. The documenta
Sometimes you might need to use **yet** when writing a task. If you use
**yet**, ensure the surrounding phrases are written
-in present tense, active voice.
+in present tense, active voice.
[View guidance about how to write about future features](index.md#promising-features-in-future-versions).
([Vale](../testing.md#vale) rule: [`CurrentStatus.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/CurrentStatus.yml))
diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md
index 49fe0aff3c6..9facb22669b 100644
--- a/doc/development/documentation/testing.md
+++ b/doc/development/documentation/testing.md
@@ -189,7 +189,7 @@ English language. Vale's configuration is stored in the
[`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.vale.ini) file located in the root
directory of projects.
-Vale supports creating [custom tests](https://errata-ai.github.io/vale/styles/) that extend any of
+Vale supports creating [custom tests](https://docs.errata.ai/vale/styles) that extend any of
several types of checks, which we store in the `.linting/vale/styles/gitlab` directory in the
documentation directory of projects.
@@ -365,6 +365,35 @@ file for the [`gitlab`](https://gitlab.com/gitlab-org/gitlab) project.
To set up `lefthook` for documentation linting, see
[Pre-push static analysis](../contributing/style_guides.md#pre-push-static-analysis-with-lefthook).
+#### Show Vale warnings on push
+
+By default, `lefthook` shows only Vale errors when pushing changes to a branch. The default branches
+have no Vale errors, so any errors listed here are introduced by commits to the branch.
+
+To also see the Vale warnings when pushing to a branch, set a local environment variable: `VALE_WARNINGS=true`.
+
+Enable Vale warnings on push to improve the documentation suite by:
+
+- Detecting warnings you might be introducing with your commits.
+- Identifying warnings that already exist in the page, which you can resolve to reduce technical debt.
+
+These warnings:
+
+- Don't stop the push from working.
+- Don't result in a broken pipeline.
+- Include all warnings for a file, not just warnings that are introduced by the commits.
+
+To enable Vale warnings on push:
+
+- Automatically, add `VALE_WARNINGS=true` to your shell configuration.
+- Manually, prepend `VALE_WARNINGS=true` to invocations of `lefthook`. For example:
+
+ ```shell
+ VALE_WARNINGS=true bundle exec lefthook run pre-push
+ ```
+
+You can also [configure your editor](#configure-editors) to show Vale warnings.
+
### Show subset of Vale alerts
You can set Visual Studio Code to display only a subset of Vale alerts when viewing files:
diff --git a/doc/development/ee_features.md b/doc/development/ee_features.md
index 5bd830715f5..019dbb13599 100644
--- a/doc/development/ee_features.md
+++ b/doc/development/ee_features.md
@@ -21,7 +21,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
When developing locally, there are times when you need your instance to act like the SaaS version of the product.
In those instances, you can simulate SaaS by exporting an environment variable as seen below:
-`export GITLAB_SIMULATE_SAAS=1`
+```shell
+export GITLAB_SIMULATE_SAAS=1
+```
+
+There are many ways to pass an environment variable to your local GitLab instance.
+For example, you can create a `env.runit` file in the root of your GDK with the above snippet.
## Act as CE when unlicensed
diff --git a/doc/development/event_store.md b/doc/development/event_store.md
index b00a824e2eb..967272dcf2e 100644
--- a/doc/development/event_store.md
+++ b/doc/development/event_store.md
@@ -290,3 +290,42 @@ executed synchronously every time the given event is published.
For complex conditions it's best to subscribe to all the events and then handle the logic
in the `handle_event` method of the subscriber worker.
+
+## Testing
+
+The publisher's responsibility is to ensure that the event is published correctly.
+
+To test that an event has been published correctly, we can use the RSpec matcher `:publish_event`:
+
+```ruby
+it 'publishes a ProjectDeleted event with project id and namespace id' do
+ expected_data = { project_id: project.id, namespace_id: project.namespace_id }
+
+ # The matcher verifies that when the block is called, the block publishes the expected event and data.
+ expect { destroy_project(project, user, {}) }
+ .to publish_event(Projects::ProjectDeletedEvent)
+ .with(expected_data)
+end
+```
+
+The subscriber must ensure that a published event can be consumed correctly. For this purpose
+we have added helpers and shared examples to standardize the way we test subscribers:
+
+```ruby
+RSpec.describe MergeRequests::UpdateHeadPipelineWorker do
+ let(:event) { Ci::PipelineCreatedEvent.new(data: ({ pipeline_id: pipeline.id })) }
+
+ # This shared example ensures that an event is published and correctly processed by
+ # the current subscriber (`described_class`).
+ it_behaves_like 'consumes the published event' do
+ let(:event) { event }
+ end
+
+ it 'does something' do
+ # This helper directly executes `perform` ensuring that `handle_event` is called correctly.
+ consume_event(subscriber: described_class, event: event)
+
+ # run expectations
+ end
+end
+```
diff --git a/doc/development/experiment_guide/index.md b/doc/development/experiment_guide/index.md
index c34e5eb36dc..f7af1113b6e 100644
--- a/doc/development/experiment_guide/index.md
+++ b/doc/development/experiment_guide/index.md
@@ -64,8 +64,8 @@ We recommend the following workflow:
1. **If the experiment is a success**, designers add the new icon or illustration to the Pajamas UI kit as part of the cleanup process.
Engineers can then add it to the [SVG library](https://gitlab-org.gitlab.io/gitlab-svgs/) and modify the implementation based on the
[Frontend Development Guidelines](../fe_guide/icons.md#usage-in-hamlrails-2).
-
-## Turn off all experiments
+
+## Turn off all experiments
When there is a case on GitLab.com (SaaS) that necessitates turning off all experiments, we have this control.
diff --git a/doc/development/fe_guide/accessibility.md b/doc/development/fe_guide/accessibility.md
index e71e414002a..2a1083d031f 100644
--- a/doc/development/fe_guide/accessibility.md
+++ b/doc/development/fe_guide/accessibility.md
@@ -32,7 +32,7 @@ By default, macOS limits the <kbd>tab</kbd> key to **Text boxes and lists only**
1. Open the **Shortcuts** tab.
1. Enable the setting **Use keyboard navigation to move focus between controls**.
-You can read more about enabling browser-specific keyboard navigation on [a11yproject](https://www.a11yproject.com/posts/2017-12-29-macos-browser-keyboard-navigation/).
+You can read more about enabling browser-specific keyboard navigation on [a11yproject](https://www.a11yproject.com/posts/macos-browser-keyboard-navigation/).
## Quick checklist
diff --git a/doc/development/fe_guide/emojis.md b/doc/development/fe_guide/emojis.md
index 2dedbc8f19d..7ef88c5ca19 100644
--- a/doc/development/fe_guide/emojis.md
+++ b/doc/development/fe_guide/emojis.md
@@ -25,7 +25,7 @@ when your platform does not support it.
- `app/assets/images/emoji.png`
- `app/assets/images/emoji@2x.png`
1. Ensure you see new individual images copied into `app/assets/images/emoji/`
- 1. Ensure you can see the new emojis and their aliases in the GitLab Flavored Markdown (GFM) Autocomplete
+ 1. Ensure you can see the new emojis and their aliases in the GitLab Flavored Markdown (GLFM) Autocomplete
1. Ensure you can see the new emojis and their aliases in the award emoji menu
1. You might need to add new emoji Unicode support checks and rules for platforms
that do not support a certain emoji and we need to fallback to an image.
diff --git a/doc/development/fe_guide/graphql.md b/doc/development/fe_guide/graphql.md
index e79a473df9e..ddd99f3614d 100644
--- a/doc/development/fe_guide/graphql.md
+++ b/doc/development/fe_guide/graphql.md
@@ -264,9 +264,15 @@ Read more about [Vue Apollo](https://github.com/vuejs/vue-apollo) in the [Vue Ap
### Local state with Apollo
-It is possible to manage an application state with Apollo by passing
-in a resolvers object when creating the default client. The default state can be set by writing
-to the cache after setting up the default client. In the example below, we are using query with `@client` Apollo directive to write the initial data to Apollo cache and then get this state in the Vue component:
+It is possible to manage an application state with Apollo by using [client-site resolvers](#using-client-side-resolvers)
+or [type policies with reactive variables](#using-type-policies-with-reactive-variables) when creating your default
+client.
+
+#### Using client-side resolvers
+
+The default state can be set by writing to the cache after setting up the default client. In the
+example below, we are using query with `@client` Apollo directive to write the initial data to
+Apollo cache and then get this state in the Vue component:
```javascript
// user.query.graphql
@@ -322,7 +328,7 @@ export default {
Along with creating local data, we can also extend existing GraphQL types with `@client` fields. This is extremely helpful when we need to mock an API response for fields not yet added to our GraphQL API.
-#### Mocking API response with local Apollo cache
+##### Mocking API response with local Apollo cache
Using local Apollo Cache is helpful when we have a need to mock some GraphQL API responses, queries, or mutations locally (such as when they're still not added to our actual API).
@@ -384,6 +390,108 @@ For each attempt to fetch a version, our client fetches `id` and `sha` from the
Read more about local state management with Apollo in the [Vue Apollo documentation](https://vue-apollo.netlify.app/guide/local-state.html#local-state).
+#### Using type policies with reactive variables
+
+Apollo Client 3 offers an alternative to [client-side resolvers](#using-client-side-resolvers) by using
+[reactive variables to store client state](https://www.apollographql.com/docs/react/local-state/reactive-variables/).
+
+**NOTE:**
+We are still learning the best practices for both **type policies** and **reactive vars**.
+Take a moment to improve this guide or [leave a comment](https://gitlab.com/gitlab-org/frontend/rfcs/-/issues/100)
+if you use it!
+
+In the example below we define a `@client` query and its `typedefs`:
+
+```javascript
+// ./graphql/typedefs.graphql
+extend type Query {
+ localData: String!
+}
+```
+
+```javascript
+// ./graphql/get_local_data.query.graphql
+query getLocalData {
+ localData @client
+}
+```
+
+Similar to resolvers, your `typePolicies` will execute when the `@client` query is used. However,
+using `makeVar` will trigger every relevant active Apollo query to reactively update when the state
+mutates.
+
+```javascript
+// ./graphql/local_state.js
+
+import { makeVar } from '@apollo/client/core';
+import typeDefs from './typedefs.graphql';
+
+export const createLocalState = () => {
+ // set an initial value
+ const localDataVar = makeVar('');
+
+ const cacheConfig = {
+ typePolicies: {
+ Query: {
+ fields: {
+ localData() {
+ // obtain current value
+ // triggers when `localDataVar` is updated
+ return localDataVar();
+ },
+ },
+ },
+ },
+ };
+
+ // methods that update local state
+ const localMutations = {
+ setLocalData(newData) {
+ localDataVar(newData);
+ },
+ clearData() {
+ localDataVar('');
+ },
+ };
+
+ return {
+ cacheConfig,
+ typeDefs,
+ localMutations,
+ };
+};
+```
+
+Pass the cache config to your Apollo Client:
+
+```javascript
+// index.js
+
+// ...
+import createDefaultClient from '~/lib/graphql';
+import { createLocalState } from './graphql/local_state';
+
+const { cacheConfig, typeDefs, localMutations } = createLocalState();
+
+const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient({}, { cacheConfig, typeDefs }),
+});
+
+return new Vue({
+ el,
+ apolloProvider,
+ provide: {
+ // inject local state mutations to your app
+ localMutations,
+ },
+ render(h) {
+ return h(MyApp);
+ },
+});
+```
+
+Wherever used, the local query will update as the state updates thanks to the **reactive variable**.
+
### Using with Vuex
When the Apollo Client is used in Vuex and fetched data is stored in the Vuex store, the Apollo Client cache does not need to be enabled. Otherwise we would have data from the API stored in two places - Vuex store and Apollo Client cache. With Apollo's default settings, a subsequent fetch from the GraphQL API could result in fetching data from Apollo cache (in the case where we have the same query and variables). To prevent this behavior, we need to disable Apollo Client cache by passing a valid `fetchPolicy` option to its constructor:
@@ -583,7 +691,7 @@ we want to fetch after or before a given endpoint.
For example, here we're fetching 10 designs after a cursor (let us call this `projectQuery`):
```javascript
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query {
project(fullPath: "root/my-project") {
@@ -606,7 +714,7 @@ query {
}
```
-Note that we are using the [`pageInfo.fragment.graphql`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/graphql_shared/fragments/pageInfo.fragment.graphql) to populate the `pageInfo` information.
+Note that we are using the [`page_info.fragment.graphql`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/graphql_shared/fragments/page_info.fragment.graphql) to populate the `pageInfo` information.
#### Using `fetchMore` method in components
@@ -869,7 +977,7 @@ You'd then be able to retrieve the data without providing any pagination-specifi
Here's an example of a query using the `@connection` directive:
```graphql
-#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query DastSiteProfiles($fullPath: ID!, $after: String, $before: String, $first: Int, $last: Int) {
project(fullPath: $fullPath) {
diff --git a/doc/development/fe_guide/performance.md b/doc/development/fe_guide/performance.md
index 94beecf6168..bcdc49a1070 100644
--- a/doc/development/fe_guide/performance.md
+++ b/doc/development/fe_guide/performance.md
@@ -457,6 +457,6 @@ General tips:
## Additional Resources
- [WebPage Test](https://www.webpagetest.org) for testing site loading time and size.
-- [Google PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) grades web pages and provides feedback to improve the page.
+- [Google PageSpeed Insights](https://pagespeed.web.dev/) grades web pages and provides feedback to improve the page.
- [Profiling with Chrome DevTools](https://developer.chrome.com/docs/devtools/)
- [Browser Diet](https://browserdiet.com/) is a community-built guide that catalogues practical tips for improving web page performance.
diff --git a/doc/development/fe_guide/registry_architecture.md b/doc/development/fe_guide/registry_architecture.md
new file mode 100644
index 00000000000..47a6dc40e19
--- /dev/null
+++ b/doc/development/fe_guide/registry_architecture.md
@@ -0,0 +1,90 @@
+---
+stage: Package
+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
+---
+
+# Registry architecture
+
+GitLab has several registry applications. Given that they all leverage similar UI, UX, and business
+logic, they are all built with the same architecture. In addition, a set of shared components
+already exists to unify the user and developer experiences.
+
+Existing registries:
+
+- Package Registry
+- Container Registry
+- Infrastructure Registry
+- Dependency Proxy
+
+## Frontend architecture
+
+### Component classification
+
+All the registries follow an architecture pattern that includes four component types:
+
+- Pages: represent an entire app, or for the registries using [vue-router](https://v3.router.vuejs.org/) they represent one router
+ route.
+- Containers: represent a single piece of functionality. They contain complex logic and may
+ connect to the API.
+- Presentationals: represent a portion of the UI. They receive all their data with `props` or through
+ `inject`, and do not connect to the API.
+- Shared components: presentational components that accept a various array of configurations and are
+ shared across all of the registries.
+
+### Communicating with the API
+
+The complexity and communication with the API should be concentrated in the pages components, and
+in the container components when needed. This makes it easier to:
+
+- Handle concurrent requests, loading states, and user messages.
+- Maintain the code, especially to estimate work. If it touches a page or functional component,
+ expect it to be more complex.
+- Write fast and consistent unit tests.
+
+### Best practices
+
+- Use [`provide` or `inject`](https://v2.vuejs.org/v2/api/?redirect=true#provide-inject)
+ to pass static, non-reactive values coming from the app initialization.
+- When passing data, prefer `props` over nested queries or Vuex bindings. Only pages and
+ container components should be aware of the state and API communication.
+- Don't repeat yourself. If one registry receives functionality, the likelihood of the rest needing
+ it in the future is high. If something seems reusable and isn't bound to the state, create a
+ shared component.
+- Try to express functionality and logic with dedicated components. It's much easier to deal with
+ events and properties than callbacks and asynchronous code (see
+ [`delete_package.vue`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/packages_and_registries/package_registry/components/functional/delete_package.vue)).
+- Leverage [startup for GraphQL calls](graphql.md#making-initial-queries-early-with-graphql-startup-calls).
+
+## Shared compoenents library
+
+Inside `vue_shared/components/registry` and `packages_and_registries/shared`, there's a set of
+shared components that you can use to implement registry functionality. These components build the
+main pieces of the desired UI and UX of a registry page. The most important components are:
+
+- `code-instruction`: represents a copyable box containing code. Supports multiline and single line
+ code boxes. Snowplow tracks the code copy event.
+- `details-row`: represents a row of details. Used to add additional info in the details area of
+ the `list-item` component.
+- `history-item`: represents a history list item used to build a timeline.
+- `list-item`: represents a list element in the registry. It supports: left action, left primary and
+ secondary content, right primary and secondary content, right action, and details slots.
+- `metadata-item`: represents one piece of metadata, with an icon or a link. Used primarily in the
+ title area.
+- `persisted-dropdown-selection`: represents a dropdown menu that stores the user selection in the
+ `localStorage`.
+- `registry-search`: implements `gl-filtered-search` with a sorting section on the right.
+- `title-area`: implements the top title area of the registry. Includes: a main title, an avatar, a
+ subtitle, a metadata row, and a right actions slot.
+
+## Adding a new registry page
+
+When adding a new registry:
+
+- Leverage the shared components that already exist. It's good to look at how the components are
+ structured and used in the more mature registries (for example, the Package Registry).
+- If it's in line with the backend requirements, we suggest using GraphQL for the API. This helps in
+ dealing with the innate performance issue of registries.
+- If possible, we recommend using [Vue Router](https://v3.router.vuejs.org/)
+ and frontend routing. Coupled with Apollo, the caching layer helps with the perceived page
+ performance.
diff --git a/doc/development/fe_guide/source_editor.md b/doc/development/fe_guide/source_editor.md
index 2ff0bacfc3a..b06e341630f 100644
--- a/doc/development/fe_guide/source_editor.md
+++ b/doc/development/fe_guide/source_editor.md
@@ -35,7 +35,7 @@ Vue component, but the integration of Source Editor is generally straightforward
const editor = new SourceEditor({
// Editor Options.
// The list of all accepted options can be found at
- // https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html
+ // https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.EditorOption.html
});
```
@@ -56,19 +56,19 @@ An instance of Source Editor accepts the following configuration options:
| `blobContent` | `false` | `String`: The initial content to render in the editor. |
| `extensions` | `false` | `Array`: Extensions to use in this instance. |
| `blobGlobalId` | `false` | `String`: An auto-generated property.<br>**Note:** This property may go away in the future. Do not pass `blobGlobalId` unless you know what you're doing.|
-| Editor Options | `false` | `Object(s)`: Any property outside of the list above is treated as an Editor Option for this particular instance. Use this field to override global Editor Options on the instance level. A full [index of Editor Options](https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html) is available. |
+| Editor Options | `false` | `Object(s)`: Any property outside of the list above is treated as an Editor Option for this particular instance. Use this field to override global Editor Options on the instance level. A full [index of Editor Options](https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.EditorOption.html) is available. |
## API
The editor uses the same public API as
-[provided by Monaco editor](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html)
+[provided by Monaco editor](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneCodeEditor.html)
with additional functions on the instance level:
| Function | Arguments | Description
| --------------------- | ----- | ----- |
| `updateModelLanguage` | `path`: String | Updates the instance's syntax highlighting to follow the extension of the passed `path`. Available only on the instance level.|
| `use` | Array of objects | Array of extensions to apply to the instance. Accepts only the array of _objects_. You must fetch the extensions' ES6 modules must be fetched and resolved in your views or components before they are passed to `use`. This property is available on _instance_ (applies extension to this particular instance) and _global editor_ (applies the same extension to all instances) levels. |
-| Monaco Editor options | See [documentation](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html) | Default Monaco editor options |
+| Monaco Editor options | See [documentation](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneCodeEditor.html) | Default Monaco editor options |
## Tips
@@ -202,7 +202,7 @@ export default {
In the code example, `this` refers to the instance. By referring to the instance,
we can access the complete underlying
-[Monaco editor API](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html),
+[Monaco editor API](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneCodeEditor.html),
which includes functions like `getValue()`.
Now let's use our extension:
diff --git a/doc/development/fe_guide/vue.md b/doc/development/fe_guide/vue.md
index b947d90cc11..fecb0af936d 100644
--- a/doc/development/fe_guide/vue.md
+++ b/doc/development/fe_guide/vue.md
@@ -123,6 +123,10 @@ Using dependency injection to provide values from HAML is ideal when:
prop-drilling becomes an inconvenience. Prop-drilling when the same prop is passed
through all components in the hierarchy until the component that is genuinely using it.
+Dependency injection can potentially break a child component (either an immediate child or multiple levels deep) if the value declared in the `inject` configuration doesn't have defaults defined and the parent component has not provided the value using the `provide` configuration.
+
+- A [default value](https://vuejs.org/guide/components/provide-inject.html#injection-default-values) might be useful in contexts where it makes sense.
+
##### props
If the value from HAML doesn't fit the criteria of dependency injection, use `props`.
@@ -499,7 +503,7 @@ component under test, with the `computed` property, for example). Remember to us
We should test for events emitted in response to an action in our component. This is used to
verify the correct events are being fired with the correct arguments.
-For any DOM events we should use [`trigger`](https://vue-test-utils.vuejs.org/api/wrapper/#trigger)
+For any DOM events we should use [`trigger`](https://v1.test-utils.vuejs.org/api/wrapper/#trigger)
to fire out event.
```javascript
@@ -530,7 +534,7 @@ it('should fire the itemClicked event', () => {
```
We should verify an event has been fired by asserting against the result of the
-[`emitted()`](https://vue-test-utils.vuejs.org/api/wrapper/#emitted) method.
+[`emitted()`](https://v1.test-utils.vuejs.org/api/wrapper/#emitted) method.
## Vue.js Expert Role
diff --git a/doc/development/fe_guide/vue3_migration.md b/doc/development/fe_guide/vue3_migration.md
index f174408c946..8c8bb36d962 100644
--- a/doc/development/fe_guide/vue3_migration.md
+++ b/doc/development/fe_guide/vue3_migration.md
@@ -156,6 +156,6 @@ export default {
</template>
```
-[In Vue 3](https://v3.vuejs.org/guide/migration/props-default-this.html#props-default-function-this-access),
+[In Vue 3](https://v3-migration.vuejs.org/breaking-changes/props-default-this.html),
the props default value factory is passed the raw props as an argument, and can
also access injections.
diff --git a/doc/development/feature_categorization/index.md b/doc/development/feature_categorization/index.md
index d6b64001e13..b2d141798fa 100644
--- a/doc/development/feature_categorization/index.md
+++ b/doc/development/feature_categorization/index.md
@@ -58,7 +58,8 @@ not, the specs will fail.
### Excluding Sidekiq workers from feature categorization
A few Sidekiq workers, that are used across all features, cannot be mapped to a
-single category. These should be declared as such using the `feature_category_not_owned!`
+single category. These should be declared as such using the
+`feature_category :not_owned`
declaration, as shown below:
```ruby
@@ -66,7 +67,7 @@ class SomeCrossCuttingConcernWorker
include ApplicationWorker
# Declares that this worker does not map to a feature category
- feature_category_not_owned!
+ feature_category :not_owned # rubocop:disable Gitlab/AvoidFeatureCategoryNotOwned
# ...
end
diff --git a/doc/development/feature_flags/process.md b/doc/development/feature_flags/process.md
deleted file mode 100644
index f98366beb6b..00000000000
--- a/doc/development/feature_flags/process.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/'
-remove_date: '2022-03-01'
----
-
-This document was moved to [another location](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/).
-
-<!-- This redirect file can be deleted after 2022-03-01. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/gemfile.md b/doc/development/gemfile.md
index 5ff1bc7b127..e0f5a905831 100644
--- a/doc/development/gemfile.md
+++ b/doc/development/gemfile.md
@@ -58,9 +58,9 @@ to a gem, go through these steps:
the [`gitlab-org/ruby/gems` namespace](https://gitlab.com/gitlab-org/ruby/gems/).
- To create this project:
- 1. Follow the [instructions for new projects](https://about.gitlab.com/handbook/engineering/#creating-a-new-project).
- 1. Follow the instructions for setting up a [CI/CD configuration](https://about.gitlab.com/handbook/engineering/#cicd-configuration).
- 1. Follow the instructions for [publishing a project](https://about.gitlab.com/handbook/engineering/#publishing-a-project).
+ 1. Follow the [instructions for new projects](https://about.gitlab.com/handbook/engineering/gitlab-repositories/#creating-a-new-project).
+ 1. Follow the instructions for setting up a [CI/CD configuration](https://about.gitlab.com/handbook/engineering/gitlab-repositories/#cicd-configuration).
+ 1. Follow the instructions for [publishing a project](https://about.gitlab.com/handbook/engineering/gitlab-repositories/#publishing-a-project).
- See [issue
#325463](https://gitlab.com/gitlab-org/gitlab/-/issues/325463)
for an example.
diff --git a/doc/development/gitlab_flavored_markdown/index.md b/doc/development/gitlab_flavored_markdown/index.md
new file mode 100644
index 00000000000..682d8011cd8
--- /dev/null
+++ b/doc/development/gitlab_flavored_markdown/index.md
@@ -0,0 +1,20 @@
+---
+stage: Create
+group: Editor
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Markdown developer documentation **(FREE)**
+
+This page contains the MVC for the developer documentation for GitLab Flavored Markdown.
+For the user documentation about Markdown in GitLab, refer to
+[GitLab Flavored Markdown](../../user/markdown.md).
+
+## GitLab Flavored Markdown specification guide
+
+The [specification guide](specification_guide/index.md) includes:
+
+- [Terms and definitions](specification_guide/index.md#terms-and-definitions).
+- [Parsing and rendering](specification_guide/index.md#parsing-and-rendering).
+- [Goals](specification_guide/index.md#goals).
+- [Implementation](specification_guide/index.md#implementation) of the spec.
diff --git a/doc/development/gitlab_flavored_markdown/specification_guide/index.md b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
new file mode 100644
index 00000000000..021f7bafce9
--- /dev/null
+++ b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
@@ -0,0 +1,717 @@
+---
+stage: Create
+group: Editor
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# GitLab Flavored Markdown (GLFM) Specification Guide **(FREE)**
+
+GitLab supports Markdown in various places. The Markdown dialect we use is called
+GitLab Flavored Markdown, or GLFM.
+
+The specification for the GLFM dialect is based on the
+[GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/),
+which is in turn based on the [CommonMark specification](https://spec.commonmark.org/current/).
+The GLFM specification includes
+[several extensions](../../../user/markdown.md#differences-between-gitlab-flavored-markdown-and-standard-markdown)
+to the GFM specification.
+
+See the [section on acronyms](#acronyms-glfm-ghfm-gfm-commonmark) for a
+detailed explanation of the various acronyms used in this document.
+This guide is a developer-facing document that describes the various terms and
+definitions, goals, tools, and implementations related to the GLFM specification.
+It is intended to support and augment the [user-facing documentation](../../../user/markdown.md)
+for GitLab Flavored Markdown.
+
+NOTE:
+In this document, _GFM_ refers to _GitHub_ Flavored Markdown, not _GitLab_ Flavored Markdown.
+Refer to the [section on acronyms](#acronyms-glfm-ghfm-gfm-commonmark)
+for a detailed explanation of the various acronyms used in this document.
+
+NOTE:
+This guide and the implementation and files described in it are still a work in
+progress. As the work progresses, rewrites and consolidation
+between this guide and the [user-facing documentation](../../../user/markdown.md)
+for GitLab Flavored Markdown are likely.
+
+## Terms and definitions
+
+### Acronyms: GLFM, GHFM, GFM, CommonMark
+
+[_GitHub_ Flavored Markdown](https://github.github.com/gfm/) is widely referred
+to by the acronym GFM, and this document follows that convention as well.
+_GitLab_ Flavored Markdown is referred to as GLFM in this document,
+to distinguish it from GitHub Flavored Markdown.
+
+Unfortunately, this convention is not followed consistently in the rest
+of the documentation or GitLab codebase. In many places, the GFM
+acronym is used to refer to _GitLab_ Flavored Markdown. An
+[open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/24592) exists to resolve
+this inconsistency.
+
+Some places in the code refer to both the GitLab and GitHub specifications
+simultaneous in the same areas of logic. In these situations,
+_GitHub_ Flavored Markdown may be referred to with variable or constant names like
+`ghfm_` to avoid confusion.
+
+The original CommonMark specification is referred to as _CommonMark_ (no acronym).
+
+### Various Markdown specifications
+
+The specification format we use is based on the approach used in CommonMark, where
+a `spec.txt` file serves as documentation, as well as being in a format that can
+serve as input to automated conformance tests. It is
+[explained in the CommonMark specification](https://spec.commonmark.org/0.30/#about-this-document):
+
+> This document attempts to specify Markdown syntax unambiguously. It contains many
+> examples with side-by-side Markdown and HTML. These are intended to double as conformance tests.
+
+The HTML-rendered versions of the specifications:
+
+- [GitLab Flavored Markdown (GLFM) specification](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/output/spec.html), which extends the:
+- [GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/), which extends the:
+- [CommonMark specification](https://spec.commonmark.org/0.30/)
+
+NOTE:
+The creation of the
+[GitLab Flavored Markdown (GLFM) specification](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/output/spec.html)
+file is still pending.
+
+However, GLFM has more complex parsing, rendering, and testing requirements than
+GFM or CommonMark. Therefore,
+it does not have a static, hardcoded, manually updated `spec.txt`. Instead, the
+GLFM `spec.txt` is automatically generated based on other input files. This process
+is explained in detail in the [Implementation](#implementation) sections below.
+
+### Markdown examples
+
+Everywhere in the context of the specification and this guide, the term
+_examples_ is specifically used to refer to the Markdown + HTML pairs used
+to illustrate the canonical parsing (or rendering) behavior of various Markdown source
+strings in the standard
+[CommonMark specification format](https://spec.commonmark.org/0.30/#example-1).
+
+In this context, it should not be confused with other similar or related meanings of
+_example_, such as
+[RSpec examples](https://relishapp.com/rspec/rspec-core/docs/example-groups/basic-structure-describe-it).
+
+### Parsers and renderers
+
+To understand the various ways in which a specification is used, and how it related
+to a given Markdown dialect, it's important to understand the distinction between
+a _parser_ and a _renderer_:
+
+- A Markdown _parser_ accepts Markdown as input and produces a Markdown
+ Abstract Syntax Tree (AST) as output.
+- A Markdown _renderer_ accepts the AST produced by a parser, and produces HTML
+ (or a PDF, or any other relevant rendering format) as output.
+
+### Types of Markdown tests driven by the GLFM specification
+
+The two main types of automated testing are driven by the Markdown
+examples and data contained in the GLFM specification. We refer to them as:
+
+- Markdown conformance testing.
+- Markdown snapshot testing.
+
+Many other types of tests also occur in the GitLab
+codebase, and some of these tests are also related to the GLFM Markdown dialect.
+Therefore, to avoid confusion, we use these standard terms for the two types
+of specification-driven testing referred to in this documentation and elsewhere.
+
+#### Markdown conformance testing
+
+_Markdown conformance testing_ refers to the standard testing method used by
+all CommonMark Markdown dialects to verify that a specific implementation conforms
+to the CommonMark Markdown specification. It is enforced by running the standard
+CommonMark tool [`spec_tests.py`](https://github.com/github/cmark-gfm/blob/master/test/spec_tests.py)
+against a given `spec.txt` specification and the implementation.
+
+NOTE:
+`spec_tests.py` may eventually be re-implemented in Ruby, to not have a dependency on Python.
+
+#### Markdown snapshot testing
+
+_Markdown snapshot testing_ refers to the automated testing performed in
+the GitLab codebase, which is driven by snapshot fixture data derived from the
+GLFM specification. It consists of both backend RSpec tests and frontend Jest tests
+which use the fixture data. This fixture data is contained in YAML files. These files
+can be generated and updated based on the Markdown examples in the specification,
+and the existing GLFM parser and render implementations. They may also be
+manually updated as necessary to test-drive incomplete implementations.
+Regarding the terminology used here:
+
+1. The Markdown snapshot tests can be considered a form of the
+ [Golden Master Testing approach](https://www.google.com/search?q=golden+master+testing),
+ which is also referred to as Approval Testing or Characterization Testing.
+ 1. The term Golden Master originally comes from the recording industry, and
+ refers to the process of mastering, or making a final mix from which all
+ other copies are produced.
+ 1. For more information and background, you can read about
+ [Characterization Tests](https://en.wikipedia.org/wiki/Characterization_test) and
+ [Golden Masters](https://en.wikipedia.org/wiki/Gold_master_(disambiguation)).
+1. The usage of the term _snapshot_ does not refer to the approach of
+ [Jest snapshot testing](https://jestjs.io/docs/snapshot-testing), as used elsewhere
+ in the GitLab frontend testing suite. However, the Markdown snapshot testing does
+ follow the same philosophy and patterns as Jest snapshot testing:
+ 1. Snapshot fixture data is represented as files which are checked into source control.
+ 1. The files can be automatically generated and updated based on the implementation
+ of the code under tests.
+ 1. The files can also be manually updated when necessary, for example, to test-drive
+ changes to an incomplete or buggy implementation.
+1. The usage of the term _fixture_ does not refer to standard
+ [Rails database fixture files](https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html).
+ It instead refers to _test fixtures_ in the
+ [more generic definition](https://en.wikipedia.org/wiki/Test_fixture#Software),
+ as input data to support automated testing. However, fixture files still exist, so
+ they are colocated under the `spec/fixtures` directory with the rest of
+ the fixture data for the GitLab Rails application.
+
+## Parsing and Rendering
+
+The Markdown dialect used in the GitLab application has a dual requirement for rendering:
+
+1. Rendering to static read-only HTML format, to be displayed in various
+ places throughout the application.
+1. Rendering editable content in the
+ [Content Editor](https://about.gitlab.com/direction/create/editor/content_editor/),
+ a ["What You See Is What You Get" (WYSIWYG)](https://en.wikipedia.org/wiki/WYSIWYG)
+ editor. The Content Editor supports real-time instant switching between an editable
+ Markdown source and an editable WYSIWYG document.
+
+These requirements means that GitLab has two independent parser and renderer
+implementations:
+
+1. The backend parser / renderer supports parsing and rendering to _static_
+ read-only HTML. It is [implemented in Ruby](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/banzai).
+ It leverages the [`commonmarker`](https://github.com/gjtorikian/commonmarker) gem,
+ which is a Ruby wrapper for [`libcmark-gfm`](https://github.com/github/cmark),
+ GitHub's fork of the reference parser for CommonMark. `libcmark-gfm` is an extended
+ version of the C reference implementation of [CommonMark](http://commonmark.org/)
+1. The frontend parser / renderer supports parsing and _WYSIWYG_ rendering for
+ the Content Editor. It is implemented in JavaScript. Parsing is based on the
+ [Remark](https://github.com/remarkjs/remark) Markdown parser, which produces a
+ MDAST Abstract Syntax Tree (MDAST). Rendering is the process of turning
+ an MDAST into a [ProseMirror document](../../fe_guide/content_editor.md). Then,
+ ProseMirror is used to render a ProseMirror document to WYSIWYG HTML. In this
+ document, we refer to the process of turning Markdown into an MDAST as the
+ _frontend / JavaScript parser_, and the entire process of rendering Markdown
+ to WYSIWYG HTML in ProseMirror as the _Content Editor_. Several
+ requirements drive the need for an independent frontend parser / renderer
+ implementation, including:
+ 1. Lack of necessary support for accurate source mapping in the HTML renderer
+ implementation used on the backend.
+ 1. Latency and bandwidth concerns: eliminating the need for a round-trip to the backend
+ every time the user switches between the Markdown source and the WYSIWYG document.
+ 1. Different HTML and browser rendering requirements for WYSIWYG documents. For example,
+ displaying read-only elements such as diagrams and references in an editable form.
+
+### Multiple versions of rendered HTML
+
+Both of these GLFM renderer implementations (static and WYSIWYG) produce
+HTML which differs from the canonical HTML examples from the specification.
+For every Markdown example in the GLFM specification, three
+versions of HTML can potentially be rendered from the example:
+
+1. **Static HTML**: HTML produced by the backend (Ruby) renderer, which
+ contains extra styling and behavioral HTML. For example, **Create task** buttons
+ added for dynamically creating an issue from a task list item.
+ The GitLab [Markdown API](../../../api/markdown.md) generates HTML
+ for a given Markdown string using this method.
+1. **WYSIWYG HTML**: HTML produced by the frontend (JavaScript) Content Editor,
+ which includes parsing and rendering logic. Used to present an editable document
+ in the ProseMirror WYSIWYG editor.
+1. **Canonical HTML**: The clean, basic version of HTML rendered from Markdown.
+ 1. For the examples which come from the CommonMark specification and
+ GFM extensions specification,
+ the canonical HTML is the exact identical HTML found in the
+ GFM
+ `spec.txt` example blocks.
+ 1. For GLFM extensions to the <abbr title="GitHub Flavored Markdown">GFM</abbr> / CommonMark
+ specification, a `glfm_canonical_examples.txt`
+ [input specification file](#input-specification-files) contains the
+ Markdown examples and corresponding canonical HTML examples.
+
+As the rendered static and WYSIWYG HTML from the backend (Ruby) and frontend (JavaScript)
+renderers contain extra HTML, their rendered HTML can be converted to canonical HTML
+by a [canonicalization](#canonicalization-of-html) process.
+
+#### Canonicalization of HTML
+
+Neither the backend (Ruby) nor the frontend (JavaScript) rendered can directly render canonical HTML.
+Nor should they be able to, because:
+
+- It's not a direct requirement to support any GitLab application feature.
+- Adding this feature adds unnecessary requirements and complexity to the implementations.
+
+Instead, the rendered static or WYSIWYG HTML is converted to canonical HTML by a
+_canonicalization_ process. This process can strip all the extra styling and behavioral
+HTML from the static or WYSIWYG HTML, resulting in canonical HTML which exactly
+matches the Markdown + HTML examples in a standard `spec.txt` specification.
+
+Use the [`canonicalize-html.rb` script](#canonicalize-htmlrb-script) for this process.
+More explanation about this canonicalization process in the sections below.
+
+NOTE:
+Some of the static or WYSIWYG HTML examples may not be representable as canonical
+HTML. (For example, when they are represented as an image.) In these cases, the Markdown
+conformance test for the example can be skipped by setting `skip_update_example_snapshots: true`
+for the example in `glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml`.
+
+## Goals
+
+Given the constraints above, we have a few goals related to the GLFM
+specification and testing infrastructure:
+
+1. A canonical `spec.txt` exists, and represents the official specification for
+ GLFM, which meets these requirements:
+ 1. The spec is a strict superset of the GitHub Flavored Markdown
+ (GFM) specification, just as
+ <abbr title="GitHub Flavored Markdown">GFM</abbr> is a strict superset
+ [of the CommonMark specification](https://github.github.com/gfm/#what-is-github-flavored-markdown-).
+ Therefore, it contains the superset of all canonical Markdown + HTML examples
+ for CommonMark, GFM, and GLFM.
+ 1. It contains a prose introduction section which is specific to GitLab and GLFM.
+ 1. It contains all other non-introduction sections verbatim from the
+ GFM
+ `spec.txt`.
+ 1. It contains a new extra section for the GLFM GitLab-specific extensions,
+ with both prose and examples describing the extensions.
+ 1. It should be in the standard format which can processed by the standard
+ CommonMark tools [`spec_tests.py`](https://github.com/github/cmark-gfm/blob/master/test/spec_tests.py),
+ which is a [script used to run the Markdown conformance tests](https://github.github.com/gfm/#about-this-document)
+ against all examples contained in a `spec.txt`.
+1. The GLFM parsers and HTML renderers for
+ both the static backend (Ruby) and WYSIWYG frontend (JavaScript) implementations
+ support _consistent_ rendering of all canonical Markdown + HTML examples in the
+ GLFM `spec.txt` specification, as verified by `spec_tests.py`.
+
+ NOTE:
+ Consistent does not mean that both of these implementations render
+ to the identical HTML. They each have different implementation-specific additions
+ to the HTML they render, so therefore their rendered HTML is
+ ["canonicalized"](#canonicalization-of-html) to canonical HTML prior running
+ the Markdown conformance tests.
+1. For _both_ the static backend (Ruby) and WYSIWYG frontend (JavaScript) implementations,
+ a set of example snapshots exists in the form of YAML files, which
+ correspond to every Markdown example in the GLFM `spec.txt`. These example snapshots
+ support the following usages for every GLFM Markdown example:
+ 1. The backend (Ruby) parser and renderer can convert Markdown to the
+ expected custom static HTML.
+ 1. The frontend (JavaScript) parser and renderer (which includes GitLab custom
+ code and Remark) can convert Markdown to the expected ProseMirror JSON
+ representing a ProseMirror document.
+ 1. The **Content Editor** (which includes the frontend (JavaScript) parser and renderer,
+ and ProseMirror) can convert Markdown to the expected custom WYSIWYG HTML as rendered by ProseMirror.
+ 1. The **Content Editor** can complete a round-trip test, which involves converting
+ from Markdown, to MDAST, to ProseMirror Document, then back to Markdown. It ensures
+ the resulting Markdown is exactly identical, with no differences.
+
+## Implementation
+
+The following set of scripts and files is complex. However, it allows us to meet
+all of the goals listed above, and is carefully designed to meet the following
+implementation goals:
+
+1. Minimize the amount of manual editing, curation, and maintenance of the GLFM specification
+ and related files.
+1. Automate and simplify the process of updating the GLFM specification and related
+ files when there are changes to the upstream CommonMark spec,
+ GFM extensions, or the GLFM extensions.
+1. Support partial or incomplete implementations of the GLFM specification, whether
+ due to in-progress work, bugs, or new future Markdown support, while still
+ performing all functionality for the existing implementations.
+1. Automate, simplify, and support running various tests, including the standard
+ CommonMark conformance tests and GLFM-implementation-specific unit/acceptance
+ Markdown snapshot tests.
+1. Provide a rich set of extensible metadata around all GLFM specification examples
+ to support current and future requirements, such as automated acceptance
+ testing and automated documentation updates.
+
+The documentation on the implementation is split into three sections:
+
+1. [Scripts](#scripts).
+1. [Specification files](#specification-files).
+1. Example snapshot files: These YAML files are used as input data
+ or fixtures to drive the various tests, and are located under
+ `spec/fixtures/glfm/example_snapshots`. All example snapshot files are automatically
+ generated based on the specification files and the implementation of the parsers and renderers.
+ However, they can also be directly edited if necessary, such as to
+ test-drive an incomplete implementation.
+
+### Scripts
+
+These executable scripts perform various tasks related to maintaining
+the specification and running tests. Each script has a shell-executable entry point
+file located under `scripts/glfm`, but the actual implementation is in unit-tested
+classes under `scripts/lib/glfm`.
+
+NOTE:
+Some of these scripts are implemented in Ruby, and others are shell scripts.
+Ruby scripts are used for more complex custom scripts, to enable easier unit testing
+and debugging. Shell scripts are used for simpler scripts which primarily invoke
+other shell commands, to avoid the challenges related to
+[running other shell sub-processes](https://github.com/thewoolleyman/process_helper#why-yet-another-ruby-process-wrapper-library)
+from Ruby scripts.
+
+NOTE:
+The Ruby executable scripts under `scripts/glfm` have dashes instead of underscores
+in the filenames. This naming is non-standard for a Ruby file, but is used to distinguish
+them from the corresponding implementation class entry point files under
+`scripts/lib/glfm` when searching by filename.
+
+#### `update-specification.rb` script
+
+The `scripts/glfm/update-specification.rb` script uses specification input files to
+generate and update `spec.txt` (Markdown) and `spec.html` (HTML). The `spec.html` is
+generated by passing the generated (or updated) `spec.txt` Markdown to the backend API
+for rendering to static HTML:
+
+```mermaid
+graph LR
+subgraph script:
+ A{update-specification.rb}
+ A --> B{Backend Markdown API}
+end
+subgraph input:<br/>input specification files
+ C[gfm_spec_v_0.29.txt] --> A
+ D[glfm_intro.txt] --> A
+ E[glfm_canonical_examples.txt] --> A
+end
+subgraph output:<br/>GLFM specification files
+ A --> F[spec.txt]
+ F --> B
+ B --> G[spec.html]
+end
+```
+
+#### `update-example-snapshots.rb` script
+
+The `scripts/glfm/update-example-snapshots.rb` script uses input specification
+files to update example snapshots:
+
+```mermaid
+graph LR
+subgraph script:
+ A{update-example-snapshots.rb}
+end
+subgraph input:<br/>input specification files
+ B[downloaded gfm_spec_v_0.29.txt] --> A
+ C[glfm_canonical_examples.txt] --> A
+ D[glfm_example_status.yml] --> A
+end
+subgraph output:<br/>example snapshot files
+ A --> E[examples_index.yml]
+ A --> F[markdown.yml]
+ A --> G[html.yml]
+ A --> H[prosemirror_json.yml]
+end
+```
+
+#### `run-snapshot-tests.sh` script
+
+The `scripts/glfm/run-snapshot-tests.sh` convenience shell script runs all relevant
+Markdown snapshot testing RSpec and Jest `*_spec` files (from main app `spec` folder)
+which are driven by `example_snapshot` YAML files.
+
+The actual RSpec and Jest test `*_spec` files (frontend and backend) live
+under the normal relevant locations under `spec`, matching the location of their
+corresponding implementations. They can be run either:
+
+- As part of the normal pipelines.
+- From the command line or an IDE, just like any other file under `spec`.
+
+However, they are spread across four different locations:
+
+- Backend tests under `spec/requests`.
+- Backend EE tests under `ee/spec/requests`.
+- Frontend tests under `spec/frontend`.
+- Frontend EE tests under `ee/spec/frontend`.
+
+Therefore, this convenience script is intended to only be used in local
+development. It simplifies running all tests at once and returning a single return
+code. It contains only shell scripting commands for the relevant
+`bundle exec rspec ...` and `yarn jest ...` commands.
+
+```mermaid
+graph LR
+subgraph script:
+ A{run-snapshopt-tests.sh} --> B
+ B[relevant rspec/jest test files]
+end
+subgraph input:<br/>YAML
+ C[examples_index.yml] --> B
+ D[markdown.yml] --> B
+ E[html.yml] --> B
+ F[prosemirror_json.yml] --> B
+end
+subgraph output:<br/>test results/output
+ B --> G[rspec/jest output]
+end
+```
+
+#### `canonicalize-html.rb` script
+
+The `scripts/glfm/canonicalize-html.rb` handles the
+["canonicalization" of HTML](#canonicalization-of-html). It is a pipe-through
+helper script which takes as input a static or WYSIWYG HTML string containing
+extra HTML, and outputs a canonical HTML string.
+
+It is implemented as a standalone, modular, single-purpose script, based on the
+[Unix philosophy](https://en.wikipedia.org/wiki/Unix_philosophy#:~:text=The%20Unix%20philosophy%20emphasizes%20building,developers%20other%20than%20its%20creators.).
+It's easy to use when running the standard CommonMark `spec_tests.py`
+script, which expects canonical HTML, against the GitLab renderer implementations.
+
+#### `run-spec-tests.sh` script
+
+`scripts/glfm/run-spec-tests.sh` is a convenience shell script which runs
+conformance specs via the CommonMark standard `spec_tests.py` script,
+which uses the `glfm_specification/output/spec.txt` file and `scripts/glfm/canonicalize-html.rb`
+helper script to test the GLFM renderer implementations' support for rendering Markdown
+specification examples to canonical HTML.
+
+```mermaid
+graph LR
+subgraph scripts:
+ A{run-spec-tests.sh} --> C
+ subgraph specification testing process
+ B[canonicalize-html.sh] --> C
+ C[spec_tests.py]
+ end
+end
+subgraph input
+ D[spec.txt GLFM specification] --> C
+ E((GLFM static<br/>renderer implementation)) --> B
+ F((GLFM WYSIWYG<br/>renderer implementation)) --> B
+end
+subgraph output:<br/>test results/output
+ C --> G[spec_tests.py output]
+end
+```
+
+### Specification files
+
+These files represent the GLFM specification itself. They are all
+located under the root `glfm_specification`, and are further divided into two
+subfolders:
+
+- `input`: Contains files which are imported or manually edited.
+- `output`: Contains files which are automatically generated.
+
+#### Input specification files
+
+The `glfm_specification/input` directory contains files which are the original
+input to drive all other automated GLFM specification scripts/processes/tests.
+They are either downloaded, as in the case of the
+GFM `spec.txt` file, or manually
+updated, as in the case of all GFM files.
+
+- `glfm_specification/input/github_flavored_markdown/gfm_spec_v_0.29.txt` -
+ official latest [GFM spec.txt](https://github.com/github/cmark-gfm/blob/master/test/spec.txt),
+ automatically downloaded and updated by `update-specification.rb` script.
+- `glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt` -
+ Manually updated text of intro section for generated GLFM `spec.txt`.
+ - Replaces GFM version of introductory
+ section in `spec.txt`.
+- `glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt` -
+ Manually updated canonical Markdown+HTML examples for GLFM extensions.
+ - Standard backtick-delimited `spec.txt` examples format with Markdown + canonical HTML.
+ - Inserted as a new section before the appendix of generated `spec.txt`.
+- `glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml` -
+ Manually updated status of automatic generation of files based on Markdown
+ examples.
+ - Allows example snapshot generation, Markdown conformance tests, or
+ Markdown snapshot tests to be skipped for individual examples. For example, if
+ they are unimplemented, broken, or cannot be tested for some reason.
+
+`glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml` sample entry:
+
+```yaml
+07_99_an_example_with_incomplete_wysiwyg_implementation_1:
+ skip_update_example_snapshots: true
+ skip_running_snapshot_static_html_tests: false
+ skip_running_snapshot_wysiwyg_html_tests: true
+ skip_running_snapshot_prosemirror_json_tests: true
+ skip_running_conformance_static_tests: false
+ skip_running_conformance_wysiwyg_tests: true
+```
+
+#### Output specification files
+
+The `glfm_specification/output` directory contains the CommonMark standard format
+`spec.txt` file which represents the canonical GLFM specification which is generated
+by the `update-specification.rb` script. It also contains the rendered `spec.html`
+and `spec.pdf` which are generated from with the `spec.txt` as input.
+
+- `glfm_specification/output/spec.txt` - A Markdown file, in the standard format
+ with prose and Markdown + canonical HTML examples, generated (or updated) by the
+ `update-specification.rb` script.
+- `glfm_specification/output/spec.html` - An HTML file, rendered based on `spec.txt`,
+ also generated (or updated) by the `update-specification.rb` script at the same time as
+ `spec.txt`. It corresponds to the HTML-rendered versions of the
+ "GitHub Flavored Markdown" (<abbr title="GitHub Flavored Markdown">GFM</abbr>)
+ [specification](https://github.github.com/gfm/)
+ and the [CommonMark specification](https://spec.commonmark.org/0.30/).
+
+These output `spec.**` files, which represent the official, canonical GLFM specification
+are colocated under the same parent folder `glfm_specification` with the other
+`input` specification files. They're located here both for convenience, and because they are all
+a mix of manually edited and generated files. In GFM,
+`spec.txt` is [located in the test dir](https://github.com/github/cmark-gfm/blob/master/test/spec.txt),
+and in CommonMark it's located
+[in the project root](https://github.com/github/cmark-gfm/blob/master/test/spec.txt).
+No precedent exists for a standard location. In the future, we may decide to
+move or copy a hosted version of the rendered HTML `spec.html` version to another location or site.
+
+### Example snapshot files
+
+The `example_snapshots` directory contains files which are generated by the
+`update-example-snapshots.rb` script based off of the files in the
+`glfm_specification/input` directory. They are used as fixtures to drive the
+various Markdown snapshot tests.
+
+After the entire GLFM implementation is complete for both backend (Ruby) and
+frontend (JavaScript), all of these YAML files can be automatically generated.
+However, while the implementations are still in progress, the `skip_update_example_snapshots`
+key in `glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml`
+can be used to disable automatic generation of some examples, and they can instead
+be manually edited as necessary to help drive the implementations.
+
+#### `spec/fixtures/glfm/example_snapshots/examples_index.yml`
+
+`spec/fixtures/glfm/example_snapshots/examples_index.yml` is the main list of all
+CommonMark, GFM, and GLFM example names, each with a unique canonical name.
+
+- It is generated from the hierarchical sections and examples in the
+ GFM `spec.txt` specification.
+- For CommonMark and GFM examples,
+ these sections originally came from the GFM `spec.txt`.
+- For GLFM examples, it is generated from `glfm_canonical_examples.txt`, which is
+ the additional Section 7 in the GLFM `spec.txt`.
+- It also contains extra metadata about each example, such as:
+ 1. `spec_txt_example_position` - The position of the example in the generated GLFM `spec.txt` file.
+ 1. `source_specification` - Which specification the example originally came from:
+ `commonmark`, `github`, or `gitlab`.
+- The naming convention for example entry names is based on nested header section
+ names and example index within the header.
+ - This naming convention should result in fairly stable names and example positions.
+ The CommonMark / GLFM specification rarely changes, and most GLFM
+ examples where multiple examples exist for the same Section 7 subsection are
+ added to the end of the sub-section.
+
+`spec/fixtures/glfm/example_snapshots/examples_index.yml` sample entries:
+
+```yaml
+02_01_preliminaries_characters_and_lines_1:
+ spec_txt_example_position: 1
+ source_specification: commonmark
+03_01_blocks_and_inlines_precedence_1:
+ spec_txt_example_position: 12
+ source_specification: commonmark
+05_03_container_blocks_task_list_items_1:
+ spec_txt_example_position: 279
+ source_specification: github
+06_04_inlines_emphasis_and_strong_emphasis_1:
+ spec_txt_example_position: 360
+ source_specification: github
+07_01_audio_link_1:
+ spec_txt_example_position: 301
+ source_specification: gitlab
+```
+
+#### `spec/fixtures/glfm/example_snapshots/markdown.yml`
+
+`spec/fixtures/glfm/example_snapshots/markdown.yml` contains the original Markdown
+for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
+
+- For CommonMark and GFM Markdown,
+ it is generated (or updated) from the standard GFM
+ `spec.txt` using the `update-example-snapshots.rb` script.
+- For GLFM, it is generated (or updated) from the
+ `glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt`
+ input specification file.
+
+`spec/fixtures/glfm/example_snapshots/markdown.yml` sample entry:
+
+```yaml
+06_04_inlines_emphasis_and_strong_emphasis_1: |-
+ *foo bar*
+```
+
+#### `spec/fixtures/glfm/example_snapshots/html.yml`
+
+`spec/fixtures/glfm/example_snapshots/html.yml` contains the HTML for each entry in
+`spec/fixtures/glfm/example_snapshots/examples_index.yml`
+
+Three types of entries exist, with different HTML for each:
+
+- **Canonical**
+ - The ["Canonical"](#canonicalization-of-html) HTML.
+ - For CommonMark and GFM examples, the HTML comes from the examples in `spec.txt`.
+ - For GLFM examples, it is generated/updated from
+ `glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt`.
+- **Static**
+ - This is the static (backend (Ruby)-generated) HTML for each entry in
+ `spec/fixtures/glfm/example_snapshots/examples_index.yml`.
+ - It is generated/updated from backend [Markdown API](../../../api/markdown.md)
+ (or the underlying internal classes) via the `update-example-snapshots.rb` script,
+ but can be manually updated for static examples with incomplete implementations.
+- **WYSIWYG**
+ - The WYSIWYG (frontend, JavaScript-generated) HTML for each entry in
+ `spec/fixtures/glfm/example_snapshots/examples_index.yml`.
+ - It is generated (or updated) from the frontend Content Editor implementation via the
+ `update-example-snapshots.rb` script. It can be manually updated for WYSIWYG
+ examples with incomplete implementations.
+
+Any exceptions or failures which occur when generating HTML are replaced with an
+`Error - check implementation` value.
+
+`spec/fixtures/glfm/example_snapshots/html.yml` sample entry:
+
+```yaml
+06_04_inlines_emphasis_and_strong_emphasis_1:
+ canonical: |-
+ <p><em>foo bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto"><strong>foo bar</strong></p>
+ wysiwyg: |-
+ <p><strong>foo bar</strong></p>
+```
+
+NOTE:
+The actual `static` or `WYSIWYG` entries may differ from the example `html.yml`,
+depending on how the implementations evolve.
+
+#### `spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`
+
+`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml` contains the ProseMirror
+JSON for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
+
+- It is generated (or updated) from the frontend code via the `update-example-snapshots.rb`
+ script, but can be manually updated for examples with incomplete implementations.
+- Any exceptions or failures when generating are replaced with a `Error - check implementation` value.
+
+`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml` sample entry:
+
+```yaml
+06_04_inlines_emphasis_and_strong_emphasis_1: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo bar"
+ },
+ ]
+ },
+ ]
+ }
+```
diff --git a/doc/development/go_guide/go_upgrade.md b/doc/development/go_guide/go_upgrade.md
index a99253b9723..3267d1262f0 100644
--- a/doc/development/go_guide/go_upgrade.md
+++ b/doc/development/go_guide/go_upgrade.md
@@ -76,9 +76,27 @@ 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).
+ - Most engineering managers can be identified on
+ [the product page](https://about.gitlab.com/handbook/product/categories/) or the
+ [feature page](https://about.gitlab.com/handbook/product/categories/features/).
+ - If you still can't find the engineering manager, use
+ [Git blame](/ee/user/project/repository/git_blame.md) to identify a maintainer
+ involved in the project.
+
+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 labels to each issue
+ for easier triage. These should include the stage, group and section.
+ - The issue should be assigned by a member of the maintaining group.
+ - The milestone should be assigned by a member of the maintaining group.
-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:
+ Some overlap exists between project dependencies. When creating an issue for a
+ dependency that is part of a larger product, note the relationship in the issue
+ body. For example: Projects built in the context of Omnibus GitLab have their
+ runtime Go version managed by Omnibus, but "support" and compatibility should
+ be a concern of the individual project. Issues in the parent project's dependencies
+ issue should be about adding support for the updated Go version.
NOTE:
The upgrade issues must include [upgrade validation items](#upgrade-validation)
@@ -94,9 +112,10 @@ if you need help finding the correct person or labels:
- [Composition Analysis tracker](https://gitlab.com/gitlab-org/gitlab/-/issues).
- [Container Security tracker](https://gitlab.com/gitlab-org/gitlab/-/issues).
- NOTE:
- Updates to these Security analyzers should not block upgrades to Charts or Omnibus since
- the analyzers are built independently as separate container images.
+ NOTE:
+ Updates to these Security analyzers should not block upgrades to Charts or Omnibus since
+ the analyzers are built independently as separate container images.
+
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:
diff --git a/doc/development/i18n/externalization.md b/doc/development/i18n/externalization.md
index 65cf8911e12..2aea15de443 100644
--- a/doc/development/i18n/externalization.md
+++ b/doc/development/i18n/externalization.md
@@ -786,7 +786,7 @@ The reasoning behind this is that in some languages words change depending on co
in Japanese 㯠is added to the subject of a sentence and を to the object. This is impossible to
translate correctly if you extract individual words from the sentence.
-When in doubt, try to follow the best practices described in this [Mozilla Developer documentation](https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_content_best_practices#Splitting).
+When in doubt, try to follow the best practices described in this [Mozilla Developer documentation](https://mozilla-l10n.github.io/documentation/localization/dev_best_practices.html#splitting-and-composing-sentences).
### Always pass string literals to the translation helpers
diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md
index 7c9777527ef..afc04045763 100644
--- a/doc/development/i18n/proofreader.md
+++ b/doc/development/i18n/proofreader.md
@@ -20,7 +20,7 @@ are very appreciative of the work done by translators and proofreaders!
- Arabic
- Proofreaders needed.
- Bosnian
- - Proofreaders needed.
+ - Haris Delalić - [GitLab](https://gitlab.com/haris.delalic), [Crowdin](https://crowdin.com/profile/haris.delalic)
- Bulgarian
- Lyubomir Vasilev - [Crowdin](https://crowdin.com/profile/lyubomirv)
- Catalan
@@ -38,7 +38,7 @@ are very appreciative of the work done by translators and proofreaders!
- Victor Wu - [GitLab](https://gitlab.com/_victorwu_), [Crowdin](https://crowdin.com/profile/victorwu)
- Ivan Ip - [GitLab](https://gitlab.com/lifehome), [Crowdin](https://crowdin.com/profile/lifehome)
- Croatian
- - Proofreaders needed.
+ - Haris Delalić - [GitLab](https://gitlab.com/haris.delalic), [Crowdin](https://crowdin.com/profile/haris.delalic)
- Czech
- Jan Urbanec - [GitLab](https://gitlab.com/TatranskyMedved), [Crowdin](https://crowdin.com/profile/Tatranskymedved)
- Danish
@@ -111,7 +111,7 @@ are very appreciative of the work done by translators and proofreaders!
- Andrey Komarov - [GitLab](https://gitlab.com/elkamarado), [Crowdin](https://crowdin.com/profile/kamarado)
- Iaroslav Postovalov - [GitLab](https://gitlab.com/CMDR_Tvis), [Crowdin](https://crowdin.com/profile/CMDR_Tvis)
- Serbian (Latin and Cyrillic)
- - Proofreaders needed.
+ - Haris Delalić - [GitLab](https://gitlab.com/haris.delalic), [Crowdin](https://crowdin.com/profile/haris.delalic)
- Sinhalese/Sinhala සිංහල
- හෙළබස (HelaBasa) - [GitLab](https://gitlab.com/helabasa), [Crowdin](https://crowdin.com/profile/helabasa)
- Slovak
diff --git a/doc/development/img/merge_request_reports_v14_7.png b/doc/development/img/merge_request_reports_v14_7.png
index 282d6f96aa6..1c06e7f4fd0 100644
--- a/doc/development/img/merge_request_reports_v14_7.png
+++ b/doc/development/img/merge_request_reports_v14_7.png
Binary files differ
diff --git a/doc/development/img/merge_widget_v14_7.png b/doc/development/img/merge_widget_v14_7.png
index d5e8ed8df52..86bc11802d1 100644
--- a/doc/development/img/merge_widget_v14_7.png
+++ b/doc/development/img/merge_widget_v14_7.png
Binary files differ
diff --git a/doc/development/index.md b/doc/development/index.md
index 048112215fc..5c0cc7f9718 100644
--- a/doc/development/index.md
+++ b/doc/development/index.md
@@ -97,9 +97,8 @@ a given group, request an engineering review from one of the group's members.
After the engineering review is complete, assign the MR to the
[Technical Writer associated with the stage and group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments)
in the modified documentation page's metadata.
-
-If you have questions or need further input, request a review from the
-Technical Writer assigned to the [Development Guidelines](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines).
+If the page is not assigned to a specific group, follow the
+[Technical Writing review process for development guidelines](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines).
#### Broader changes
@@ -139,12 +138,13 @@ In these cases, use the following workflow:
and approval from the VP of Development, the DRI for Development Guidelines,
@clefelhocz1.
-1. After all approvals are complete, review the page's metadata to
- [find a Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments)
- who can help you merge the changes.
- for final content review and merge. The Technical Writer may ask for
- additional approvals as previously suggested before merging the MR.
-
+1. After all approvals are complete, assign the MR to the
+ [Technical Writer associated with the stage and group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments)
+ in the modified documentation page's metadata.
+ If the page is not assigned to a specific group, follow the
+ [Technical Writing review process for development guidelines](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines).
+ The Technical Writer may ask for additional approvals as previously suggested before merging the MR.
+
### Reviewer values
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57293) in GitLab 14.1.
diff --git a/doc/development/integrations/jira_connect.md b/doc/development/integrations/jira_connect.md
index 5391b2c119e..26ef67c937c 100644
--- a/doc/development/integrations/jira_connect.md
+++ b/doc/development/integrations/jira_connect.md
@@ -79,7 +79,7 @@ If you use Gitpod and you get an error about Jira not being able to access the d
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81126) in GitLab 14.9 [with a flag](../../administration/feature_flags.md) named `jira_connect_oauth`. Disabled by default.
-GitLab for Jira users can authenticate with GitLab using GitLab OAuth.
+GitLab for Jira users can authenticate with GitLab using GitLab OAuth.
WARNING:
This feature is not ready for production use. The feature flag should only be enabled in development.
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index 11fb06bd128..5f7cccdab64 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -327,6 +327,21 @@ You can find the schemas for these scanners here:
- [Coverage Fuzzing](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/coverage-fuzzing-report-format.json)
- [Secret Detection](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/secret-detection-report-format.json)
+### Retention period for vulnerabilities
+
+GitLab has the following retention policies for vulnerabilities on non-default branches. Vulnerabilities are no longer available:
+
+- When the related CI job artifact expires.
+- 90 days after the pipeline is created, even if the related CI job artifacts are locked.
+
+To view vulnerabilities, either:
+
+- Re-run the pipeline.
+- Download the related CI job artifacts if they are available.
+
+NOTE:
+This does not apply for the vulnerabilities existing on the default branch.
+
### Enable report validation
> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/354928) in GitLab 14.9, and planned for removal in GitLab 15.0.
diff --git a/doc/development/internal_api/index.md b/doc/development/internal_api/index.md
index ef58d6c2c44..cdbc674e0a5 100644
--- a/doc/development/internal_api/index.md
+++ b/doc/development/internal_api/index.md
@@ -621,7 +621,7 @@ Example response:
"name":"premium",
"trial":false,
"auto_renew":null,
- "upgradable":false
+ "upgradable":false,
},
"usage": {
"seats_in_subscription":10,
@@ -672,7 +672,7 @@ Example response:
"name":"premium",
"trial":false,
"auto_renew":null,
- "upgradable":false
+ "upgradable":false,
},
"usage": {
"seats_in_subscription":80,
@@ -711,7 +711,8 @@ Example response:
"name":"premium",
"trial":false,
"auto_renew":null,
- "upgradable":false
+ "upgradable":false,
+ "exclude_guests":false,
},
"usage": {
"seats_in_subscription":80,
diff --git a/doc/development/iterating_tables_in_batches.md b/doc/development/iterating_tables_in_batches.md
index 38cdbdf5b79..8813fe560db 100644
--- a/doc/development/iterating_tables_in_batches.md
+++ b/doc/development/iterating_tables_in_batches.md
@@ -93,7 +93,7 @@ falling into an endless loop as described in following
When dealing with data migrations the preferred way to iterate over a large volume of data is using
`EachBatch`.
-A special case of data migration is a [background migration](background_migrations.md#scheduling)
+A special case of data migration is a [background migration](database/background_migrations.md#scheduling)
where the actual data modification is executed in a background job. The migration code that
determines the data ranges (slices) and schedules the background jobs uses `each_batch`.
diff --git a/doc/development/licensed_feature_availability.md b/doc/development/licensed_feature_availability.md
index 0de3f94cf70..6df5c2164e8 100644
--- a/doc/development/licensed_feature_availability.md
+++ b/doc/development/licensed_feature_availability.md
@@ -1,6 +1,6 @@
---
stage: Fulfillment
-group: License
+group: Provision
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/development/merge_request_concepts/index.md b/doc/development/merge_request_concepts/index.md
index f1dab69543a..90e8ff41368 100644
--- a/doc/development/merge_request_concepts/index.md
+++ b/doc/development/merge_request_concepts/index.md
@@ -49,7 +49,7 @@ When all of the required merge checks are satisfied a merge request becomes merg
### Approvals
-Approval rules specify users that are required to or can optionally approve a merge request based on some kind of organizational policy. When approvals are required, they effectively become a required merge check. The key differentiator between merge checks and approval rules is that users **do** interact with approval rules, by deciding to approve the merge request.
+Approval rules specify users that are required to or can optionally approve a merge request based on some kind of organizational policy. When approvals are required, they effectively become a required merge check. The key differentiator between merge checks and approval rules is that users **do** interact with approval rules, by deciding to approve the merge request.
Additionally, approval settings provide configuration options to define how those approval rules are applied in a merge request. They can set limitations, add requirements, or modify approvals.
@@ -58,5 +58,5 @@ Examples of approval rules and settings include:
1. [merge request approval rules](../../user/project/merge_requests/approvals/rules.md)
1. [code owner approvals](../../user/project/code_owners.md)
1. [security approvals](../../user/application_security/index.md#security-approvals-in-merge-requests)
-1. [prevent editing approval rules](../../user/project/merge_requests/approvals/settings.md#prevent-editing-approval-rules-in-merge-requests)]
+1. [prevent editing approval rules](../../user/project/merge_requests/approvals/settings.md#prevent-editing-approval-rules-in-merge-requests)
1. [remove all approvals when commits are added](../../user/project/merge_requests/approvals/settings.md#remove-all-approvals-when-commits-are-added-to-the-source-branch)
diff --git a/doc/development/merge_request_performance_guidelines.md b/doc/development/merge_request_performance_guidelines.md
index 40f02f4fb6f..fe8e730d64e 100644
--- a/doc/development/merge_request_performance_guidelines.md
+++ b/doc/development/merge_request_performance_guidelines.md
@@ -16,7 +16,7 @@ with and agreed upon by backend maintainers and performance specialists.
It's also highly recommended that you read the following guides:
- [Performance Guidelines](performance.md)
-- [Avoiding downtime in migrations](avoiding_downtime_in_migrations.md)
+- [Avoiding downtime in migrations](database/avoiding_downtime_in_migrations.md)
## Definition
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index d85b7372814..086e061452b 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -45,14 +45,14 @@ work it needs to perform and how long it takes to complete:
One exception is a migration that takes longer but is absolutely critical for the application to operate correctly.
For example, you might have indices that enforce unique tuples, or that are needed for query performance in critical parts of the application. In cases where the migration would be unacceptably slow, however, a better option might be to guard the feature with a [feature flag](feature_flags/index.md)
and perform a post-deployment migration instead. The feature can then be turned on after the migration finishes.
-1. [**Post-deployment migrations.**](post_deployment_migrations.md) These are Rails migrations in `db/post_migrate` and
+1. [**Post-deployment migrations.**](database/post_deployment_migrations.md) These are Rails migrations in `db/post_migrate` and
run _after_ new application code has been deployed (for GitLab.com after the production deployment has finished).
They can be used for schema changes that aren't critical for the application to operate, or data migrations that take at most a few minutes.
Common examples for schema changes that should run post-deploy include:
- Clean-ups, like removing unused columns.
- Adding non-critical indices on high-traffic tables.
- Adding non-critical indices that take a long time to create.
-1. [**Background migrations.**](background_migrations.md) These aren't regular Rails migrations, but application code that is
+1. [**Background migrations.**](database/background_migrations.md) These aren't regular Rails migrations, but application code that is
executed via Sidekiq jobs, although a post-deployment migration is used to schedule them. Use them only for data migrations that
exceed the timing guidelines for post-deploy migrations. Background migrations should _not_ change the schema.
@@ -129,13 +129,13 @@ TARGET=12-9-stable-ee scripts/regenerate-schema
## Avoiding downtime
-The document ["Avoiding downtime in migrations"](avoiding_downtime_in_migrations.md) specifies
+The document ["Avoiding downtime in migrations"](database/avoiding_downtime_in_migrations.md) specifies
various database operations, such as:
-- [dropping and renaming columns](avoiding_downtime_in_migrations.md#dropping-columns)
-- [changing column constraints and types](avoiding_downtime_in_migrations.md#changing-column-constraints)
-- [adding and dropping indexes, tables, and foreign keys](avoiding_downtime_in_migrations.md#adding-indexes)
-- [migrating `integer` primary keys to `bigint`](avoiding_downtime_in_migrations.md#migrating-integer-primary-keys-to-bigint)
+- [dropping and renaming columns](database/avoiding_downtime_in_migrations.md#dropping-columns)
+- [changing column constraints and types](database/avoiding_downtime_in_migrations.md#changing-column-constraints)
+- [adding and dropping indexes, tables, and foreign keys](database/avoiding_downtime_in_migrations.md#adding-indexes)
+- [migrating `integer` primary keys to `bigint`](database/avoiding_downtime_in_migrations.md#migrating-integer-primary-keys-to-bigint)
and explains how to perform them without requiring downtime.
@@ -219,7 +219,7 @@ in that limit. Singular query timings should fit within the [standard limit](que
In case you need to insert, update, or delete a significant amount of data, you:
- Must disable the single transaction with `disable_ddl_transaction!`.
-- Should consider doing it in a [Background Migration](background_migrations.md).
+- Should consider doing it in a [Background Migration](database/background_migrations.md).
## Migration helpers and versioning
@@ -240,7 +240,7 @@ of migration helpers.
In this example, we use version 1.0 of the migration class:
```ruby
-class TestMigration < Gitlab::Database::Migration[1.0]
+class TestMigration < Gitlab::Database::Migration[2.0]
def change
end
end
@@ -253,7 +253,7 @@ version of migration helpers automatically.
Migration helpers and versioning were [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68986)
in GitLab 14.3.
For merge requests targeting previous stable branches, use the old format and still inherit from
-`ActiveRecord::Migration[6.1]` instead of `Gitlab::Database::Migration[1.0]`.
+`ActiveRecord::Migration[6.1]` instead of `Gitlab::Database::Migration[2.0]`.
## Retry mechanism when acquiring database locks
@@ -535,7 +535,7 @@ by calling the method `disable_ddl_transaction!` in the body of your migration
class like so:
```ruby
-class MyMigration < Gitlab::Database::Migration[1.0]
+class MyMigration < Gitlab::Database::Migration[2.0]
disable_ddl_transaction!
INDEX_NAME = 'index_name'
@@ -586,7 +586,7 @@ by calling the method `disable_ddl_transaction!` in the body of your migration
class like so:
```ruby
-class MyMigration < Gitlab::Database::Migration[1.0]
+class MyMigration < Gitlab::Database::Migration[2.0]
disable_ddl_transaction!
INDEX_NAME = 'index_name'
@@ -629,7 +629,7 @@ The easiest way to test for existence of an index by name is to use the
be used with a name option. For example:
```ruby
-class MyMigration < Gitlab::Database::Migration[1.0]
+class MyMigration < Gitlab::Database::Migration[2.0]
INDEX_NAME = 'index_name'
def up
@@ -664,7 +664,7 @@ Here's an example where we add a new column with a foreign key
constraint. Note it includes `index: true` to create an index for it.
```ruby
-class Migration < Gitlab::Database::Migration[1.0]
+class Migration < Gitlab::Database::Migration[2.0]
def change
add_reference :model, :other_model, index: true, foreign_key: { on_delete: :cascade }
@@ -710,7 +710,7 @@ expensive and disruptive operation for larger tables, but in reality it's not.
Take the following migration as an example:
```ruby
-class DefaultRequestAccessGroups < Gitlab::Database::Migration[1.0]
+class DefaultRequestAccessGroups < Gitlab::Database::Migration[2.0]
def change
change_column_default(:namespaces, :request_access_enabled, from: false, to: true)
end
@@ -943,7 +943,7 @@ The Rails 5 natively supports `JSONB` (binary JSON) column type.
Example migration adding this column:
```ruby
-class AddOptionsToBuildMetadata < Gitlab::Database::Migration[1.0]
+class AddOptionsToBuildMetadata < Gitlab::Database::Migration[2.0]
def change
add_column :ci_builds_metadata, :config_options, :jsonb
end
@@ -975,7 +975,7 @@ Do not store `attr_encrypted` attributes as `:text` in the database; use
efficient:
```ruby
-class AddSecretToSomething < Gitlab::Database::Migration[1.0]
+class AddSecretToSomething < Gitlab::Database::Migration[2.0]
def change
add_column :something, :encrypted_secret, :binary
add_column :something, :encrypted_secret_iv, :binary
@@ -1033,8 +1033,8 @@ If you need more complex logic, you can define and use models local to a
migration. For example:
```ruby
-class MyMigration < Gitlab::Database::Migration[1.0]
- class Project < ActiveRecord::Base
+class MyMigration < Gitlab::Database::Migration[2.0]
+ class Project < MigrationRecord
self.table_name = 'projects'
end
@@ -1114,7 +1114,7 @@ by an integer. For example: `users` would turn into `users0`
## Using models in migrations (discouraged)
The use of models in migrations is generally discouraged. As such models are
-[contraindicated for background migrations](background_migrations.md#isolation),
+[contraindicated for background migrations](database/background_migrations.md#isolation),
the model needs to be declared in the migration.
If using a model in the migrations, you should first
@@ -1132,8 +1132,8 @@ in a previous migration.
It is important not to leave out the `User.reset_column_information` command, in order to ensure that the old schema is dropped from the cache and ActiveRecord loads the updated schema information.
```ruby
-class AddAndSeedMyColumn < Gitlab::Database::Migration[1.0]
- class User < ActiveRecord::Base
+class AddAndSeedMyColumn < Gitlab::Database::Migration[2.0]
+ class User < MigrationRecord
self.table_name = 'users'
end
diff --git a/doc/development/new_fe_guide/modules/widget_extensions.md b/doc/development/new_fe_guide/modules/widget_extensions.md
index d3cd839464d..638a0a2a85b 100644
--- a/doc/development/new_fe_guide/modules/widget_extensions.md
+++ b/doc/development/new_fe_guide/modules/widget_extensions.md
@@ -40,6 +40,7 @@ export default {
summary(data) {}, // Required: Level 1 summary text
statusIcon(data) {}, // Required: Level 1 status icon
tertiaryButtons() {}, // Optional: Level 1 action buttons
+ shouldCollapse() {}, // Optional: Add logic to determine if the widget can expand or not
},
methods: {
fetchCollapsedData(props) {}, // Required: Fetches data required for collapsed state
diff --git a/doc/development/pipelines.md b/doc/development/pipelines.md
index 2aef0e10314..e0b236bc5fc 100644
--- a/doc/development/pipelines.md
+++ b/doc/development/pipelines.md
@@ -187,7 +187,7 @@ See the [experiment issue](https://gitlab.com/gitlab-org/quality/team-tasks/-/is
#### Automatic retry of failing tests in a separate process
-When the `$RETRY_FAILED_TESTS_IN_NEW_PROCESS` variable is set to `true`, RSpec tests that failed are automatically retried once in a separate
+Unless `$RETRY_FAILED_TESTS_IN_NEW_PROCESS` variable is set to `false` (`true` by default), RSpec tests that failed are automatically retried once in a separate
RSpec process. The goal is to get rid of most side-effects from previous tests that may lead to a subsequent test failure.
We keep track of retried tests in the `$RETRIED_TESTS_REPORT_FILE` file saved as artifact by the `rspec:flaky-tests-report` job.
diff --git a/doc/development/post_deployment_migrations.md b/doc/development/post_deployment_migrations.md
index 6ab3620c197..c3922718e77 100644
--- a/doc/development/post_deployment_migrations.md
+++ b/doc/development/post_deployment_migrations.md
@@ -1,81 +1,11 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'database/post_deployment_migrations.md'
+remove_date: '2022-07-08'
---
-# Post Deployment Migrations
+This document was moved to [another location](database/post_deployment_migrations.md).
-Post deployment migrations are regular Rails migrations that can optionally be
-executed after a deployment. By default these migrations are executed alongside
-the other migrations. To skip these migrations you must set the
-environment variable `SKIP_POST_DEPLOYMENT_MIGRATIONS` to a non-empty value
-when running `rake db:migrate`.
-
-For example, this would run all migrations including any post deployment
-migrations:
-
-```shell
-bundle exec rake db:migrate
-```
-
-This however skips post deployment migrations:
-
-```shell
-SKIP_POST_DEPLOYMENT_MIGRATIONS=true bundle exec rake db:migrate
-```
-
-## Deployment Integration
-
-Say you're using Chef for deploying new versions of GitLab and you'd like to run
-post deployment migrations after deploying a new version. Let's assume you
-normally use the command `chef-client` to do so. To make use of this feature
-you'd have to run this command as follows:
-
-```shell
-SKIP_POST_DEPLOYMENT_MIGRATIONS=true sudo chef-client
-```
-
-Once all servers have been updated you can run `chef-client` again on a single
-server _without_ the environment variable.
-
-The process is similar for other deployment techniques: first you would deploy
-with the environment variable set, then you re-deploy a single
-server but with the variable _unset_.
-
-## Creating Migrations
-
-To create a post deployment migration you can use the following Rails generator:
-
-```shell
-bundle exec rails g post_deployment_migration migration_name_here
-```
-
-This generates the migration file in `db/post_migrate`. These migrations
-behave exactly like regular Rails migrations.
-
-## Use Cases
-
-Post deployment migrations can be used to perform migrations that mutate state
-that an existing version of GitLab depends on. For example, say you want to
-remove a column from a table. This requires downtime as a GitLab instance
-depends on this column being present while it's running. Normally you'd follow
-these steps in such a case:
-
-1. Stop the GitLab instance
-1. Run the migration removing the column
-1. Start the GitLab instance again
-
-Using post deployment migrations we can instead follow these steps:
-
-1. Deploy a new version of GitLab while ignoring post deployment migrations
-1. Re-run `rake db:migrate` but without the environment variable set
-
-Here we don't need any downtime as the migration takes place _after_ a new
-version (which doesn't depend on the column anymore) has been deployed.
-
-Some other examples where these migrations are useful:
-
-- Cleaning up data generated due to a bug in GitLab
-- Removing tables
-- Migrating jobs from one Sidekiq queue to another
+<!-- This redirect file can be deleted after <2022-07-08>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/product_qualified_lead_guide/index.md b/doc/development/product_qualified_lead_guide/index.md
index 6943f931d79..2395689ada2 100644
--- a/doc/development/product_qualified_lead_guide/index.md
+++ b/doc/development/product_qualified_lead_guide/index.md
@@ -10,6 +10,41 @@ The Product Qualified Lead (PQL) funnel connects our users with our team members
A hand-raise PQL is a user who requests to speak to sales from within the product.
+## Set up your development environment
+
+1. Set up GDK with a connection to your local CustomersDot instance.
+1. Set up CustomersDot to talk to a staging instance of Platypus.
+
+1. Set up CustomersDot using the [normal install instructions](https://gitlab.com/gitlab-org/customers-gitlab-com/-/blob/staging/doc/setup/installation_steps.md).
+1. Set the `CUSTOMER_PORTAL_URL` env var to your local (or ngrok) URL of your CustomersDot instance.
+1. Place `export CUSTOMER_PORTAL_URL='https://XXX.ngrok.io/'` in your shell rc script (~/.zshrc or ~/.bash_profile or ~/.bashrc) and restart GDK.
+1. Enter the credentials on CustomersDot development to Platypus in your `/config/secrets.yml` and restart. Credentials for the Platypus Staging are in the 1Password Growth vault. The URL for staging is `https://staging.ci.nexus.gitlabenvironment.cloud`.
+
+```yaml
+ platypus_url: "<%= ENV['PLATYPUS_URL'] %>"
+ platypus_client_id: "<%= ENV['PLATYPUS_CLIENT_ID'] %>"
+ platypus_client_secret: "<%= ENV['PLATYPUS_CLIENT_SECRET'] %>"
+```
+
+### Set up lead monitoring
+
+1. Set up access for Platypus Staging `https://staging.ci.nexus.gitlabenvironment.cloud` using the Platypus Staging credentials in the 1Password Growth vault.
+1. Set up access for the Marketo sandbox, similar [to this example request](https://gitlab.com/gitlab-com/team-member-epics/access-requests/-/issues/13162).
+
+### Manually test leads
+
+1. Register a new user with a unique email on your local GitLab instance.
+1. Send the PQL lead by submitting your new form or creating a new trial or a new hand raise lead.
+1. Use easily identifiable values that can be easily seen in Platypus staging.
+1. Observe the entry in the staging instance of Platypus and paste in the merge request comment and mention.
+
+## Troubleshooting
+
+- Check the application and Sidekiq logs on `gitlab.com` and CustomersDot to monitor leads.
+- Check the `leads` table in CustomersDot.
+- Set up staging credentials for Platypus, and track the leads on the [Platypus Dashboard](https://staging.ci.nexus.gitlabenvironment.cloud/admin/queues/queue/new-lead-queue).
+- Ask for access to the Marketo Sandbox and validate the leads there, [to this example request](https://gitlab.com/gitlab-com/team-member-epics/access-requests/-/issues/13162).
+
## Embed a hand-raise lead form
[HandRaiseLeadButton](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/assets/javascripts/hand_raise_leads/hand_raise_lead/components/hand_raise_lead_button.vue) is a reusable component that adds a button and a hand-raise modal to any screen.
@@ -92,7 +127,7 @@ The flow of a PQL lead is as follows:
1. Marketo does scoring and sends the form to Salesforce.
1. Our Sales team uses Salesforce to connect to the leads.
-### Trial lead flow
+### Trial lead flow
#### Trial lead flow on GitLab.com
@@ -131,7 +166,7 @@ sequenceDiagram
HostedPlans|CreateTrialService->create_trial_history#: Creates a record in trial_histories table
```
-### Hand raise lead flow
+### Hand raise lead flow
#### Hand raise flow on GitLab.com
@@ -161,11 +196,4 @@ sequenceDiagram
Platypus->>Workato: [lead]
Workato->>Marketo: [lead]
Marketo->>Salesforce(SFDC): [lead]
-```
-
-## Monitor and manually test leads
-
-- Check the application and Sidekiq logs on `gitlab.com` and CustomersDot to monitor leads.
-- Check the `leads` table in CustomersDot.
-- Set up staging credentials for Platypus, and track the leads on the [Platypus Dashboard](https://staging.ci.nexus.gitlabenvironment.cloud/admin/queues/queue/new-lead-queue).
-- Ask for access to the Marketo Sandbox and validate the leads there.
+```
diff --git a/doc/development/project_templates.md b/doc/development/project_templates.md
new file mode 100644
index 00000000000..74ded9c93fc
--- /dev/null
+++ b/doc/development/project_templates.md
@@ -0,0 +1,157 @@
+---
+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"
+---
+
+# Contribute to GitLab project templates
+
+Thanks for considering a contribution to the GitLab
+[built-in project templates](../user/project/working_with_projects.md#create-a-project-from-a-built-in-template).
+
+## Prerequisites
+
+To add a new or update an existing template, you must have the following tools
+installed:
+
+- `wget`
+- `tar`
+- `jq`
+
+## Create a new project
+
+To contribute a new built-in project template to be distributed with GitLab:
+
+1. Create a new public project with the project content you'd like to contribute
+ in a namespace of your choosing. You can [view a working example](https://gitlab.com/gitlab-org/project-templates/dotnetcore).
+ Projects should be as simple as possible and free of any unnecessary assets or dependencies.
+1. When the project is ready for review, [create a new issue](https://gitlab.com/gitlab-org/gitlab/issues) with a link to your project.
+ In your issue, `@` mention the relevant Backend Engineering Manager and Product
+ Manager for the [Templates feature](https://about.gitlab.com/handbook/product/categories/#source-code-group).
+
+## Add the SVG icon to GitLab SVGs
+
+If the template you're adding has an SVG icon, you need to first add it to
+<https://gitlab.com/gitlab-org/gitlab-svgs>:
+
+1. Follow the steps outlined in the
+ [GitLab SVGs project](https://gitlab.com/gitlab-org/gitlab-svgs/-/blob/main/README.md#adding-icons-or-illustrations)
+ and submit a merge request.
+1. When the merge request is merged, `gitlab-bot` will pull the new changes in
+ the `gitlab-org/gitlab` project.
+1. You can now continue on the vendoring process.
+
+## Vendoring process
+
+To make the project template available when creating a new project, the vendoring
+process will have to be completed:
+
+1. [Export the project](../user/project/settings/import_export.md#export-a-project-and-its-data)
+ you created in the previous step and save the file as `<name>.tar.gz`, where
+ `<name>` is the short name of the project.
+1. Edit the following files to include the project template. Two types of built-in
+ templates are available within GitLab:
+ - **Normal templates**: Available in GitLab Free and above (this is the most common type of built-in template).
+ See MR [!25318](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25318) for an example.
+
+ To add a normal template:
+
+ 1. Open `lib/gitlab/project_template.rb` and add details of the template
+ in the `localized_templates_table` method. In the following example,
+ the short name of the project is `hugo`:
+
+ ```ruby
+ ProjectTemplate.new('hugo', 'Pages/Hugo', _('Everything you need to create a GitLab Pages site using Hugo'), 'https://gitlab.com/pages/hugo', 'illustrations/logos/hugo.svg'),
+ ```
+
+ If the vendored project doesn't have an SVG icon, omit `, 'illustrations/logos/hugo.svg'`.
+
+ 1. Open `spec/lib/gitlab/project_template_spec.rb` and add the short name
+ of the template in the `.all` test.
+ 1. Open `app/assets/javascripts/projects/default_project_templates.js` and
+ add details of the template. For example:
+
+ ```javascript
+ hugo: {
+ text: s__('ProjectTemplates|Pages/Hugo'),
+ icon: '.template-option .icon-hugo',
+ },
+ ```
+
+ If the vendored project doesn't have an SVG icon, use `.icon-gitlab_logo`
+ instead.
+
+ - **Enterprise templates**: Introduced in GitLab 12.10, that are available only in GitLab Premium and above.
+ See MR [!28187](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28187) for an example.
+
+ To add an Enterprise template:
+
+ 1. Open `ee/lib/ee/gitlab/project_template.rb` and add details of the template
+ in the `localized_ee_templates_table` method. For example:
+
+ ```ruby
+ ::Gitlab::ProjectTemplate.new('hipaa_audit_protocol', 'HIPAA Audit Protocol', _('A project containing issues for each audit inquiry in the HIPAA Audit Protocol published by the U.S. Department of Health & Human Services'), 'https://gitlab.com/gitlab-org/project-templates/hipaa-audit-protocol', 'illustrations/logos/asklepian.svg')
+ ```
+
+ 1. Open `ee/spec/lib/gitlab/project_template_spec.rb` and add the short name
+ of the template in the `.all` test.
+ 1. Open `ee/app/assets/javascripts/projects/default_project_templates.js` and
+ add details of the template. For example:
+
+ ```javascript
+ hipaa_audit_protocol: {
+ text: s__('ProjectTemplates|HIPAA Audit Protocol'),
+ icon: '.template-option .icon-hipaa_audit_protocol',
+ },
+ ```
+
+1. Run the `vendor_template` script. Make sure to pass the correct arguments:
+
+ ```shell
+ scripts/vendor_template <git_repo_url> <name> <comment>
+ ```
+
+1. Regenerate `gitlab.pot`:
+
+ ```shell
+ bin/rake gettext:regenerate
+ ```
+
+1. By now, there should be one new file under `vendor/project_templates/` and
+ 4 changed files. Commit all of them in a new branch and create a merge
+ request.
+
+## Test with GDK
+
+If you are using the GitLab Development Kit (GDK) you must disable `praefect`
+and regenerate the Procfile, as the Rake task is not currently compatible with it:
+
+```yaml
+# gitlab-development-kit/gdk.yml
+praefect:
+ enabled: false
+```
+
+1. Follow the steps described in the [vendoring process](#vendoring-process).
+1. Run the following Rake task where `<path>/<name>` is the
+ name you gave the template in `lib/gitlab/project_template.rb`:
+
+ ```shell
+ bin/rake gitlab:update_project_templates[<path>/<name>]
+ ```
+
+You can now test to create a new project by importing the new template in GDK.
+
+## Contribute an improvement to an existing template
+
+Existing templates are imported from the following groups:
+
+- [`project-templates`](https://gitlab.com/gitlab-org/project-templates)
+- [`pages`](htps://gitlab.com/pages)
+
+To contribute a change, open a merge request in the relevant project
+and mention `@gitlab-org/manage/import/backend` when you are ready for a review.
+
+Then, if your merge request gets accepted, either [open an issue](https://gitlab.com/gitlab-org/gitlab/-/issues)
+to ask for it to get updated, or open a merge request updating
+the [vendored template](#vendoring-process).
diff --git a/doc/development/pry_debugging.md b/doc/development/pry_debugging.md
index 5481da348e8..6751559b2ef 100644
--- a/doc/development/pry_debugging.md
+++ b/doc/development/pry_debugging.md
@@ -17,7 +17,11 @@ You can then connect to this session by using the [pry-shell](https://github.com
You can watch [this video](https://www.youtube.com/watch?v=Lzs_PL_BySo), for more information about
how to use the `pry-shell`.
-## `byebug` vs `binding.pry`
+WARNING:
+`binding.pry` can occasionally experience autoloading issues and fail during name resolution.
+If needed, `binding.irb` can be used instead with a more limited feature set.
+
+## `byebug` vs `binding.pry` vs `binding.irb`
`byebug` has a very similar interface as `gdb`, but `byebug` does not
use the powerful Pry REPL.
@@ -41,6 +45,12 @@ this document, so for the full documentation head over to the [Pry wiki](https:/
Below are a few features definitely worth checking out, also run
`help` in a pry session to see what else you can do.
+## `binding.irb`
+
+As of Ruby 2.7, IRB ships with a simple interactive debugger.
+
+Check out [the docs](https://ruby-doc.org/stdlib-2.7.0/libdoc/irb/rdoc/Binding.html) for more.
+
### State navigation
With the [state navigation](https://github.com/pry/pry/wiki/State-navigation)
diff --git a/doc/development/query_recorder.md b/doc/development/query_recorder.md
index 424c089f88e..17f2fecc1bc 100644
--- a/doc/development/query_recorder.md
+++ b/doc/development/query_recorder.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Enablement
+group: Database
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/development/scalability.md b/doc/development/scalability.md
index fe7063be0e8..4450df0399d 100644
--- a/doc/development/scalability.md
+++ b/doc/development/scalability.md
@@ -36,7 +36,7 @@ application starts, Rails queries the database schema, caching the tables and
column types for the data requested. Because of this schema cache, dropping a
column or table while the application is running can produce 500 errors to the
user. This is why we have a [process for dropping columns and other
-no-downtime changes](avoiding_downtime_in_migrations.md).
+no-downtime changes](database/avoiding_downtime_in_migrations.md).
#### Multi-tenancy
diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md
index 10f6c22e54a..8a86a46d1d3 100644
--- a/doc/development/secure_coding_guidelines.md
+++ b/doc/development/secure_coding_guidelines.md
@@ -203,7 +203,7 @@ Go's [`regexp`](https://pkg.go.dev/regexp) package uses `re2` and isn't vulnerab
### Description
-A [Server-side Request Forgery (SSRF)](https://www.hackerone.com/blog-How-To-Server-Side-Request-Forgery-SSRF) is an attack in which an attacker
+A [Server-side Request Forgery (SSRF)](https://www.hackerone.com/application-security/how-server-side-request-forgery-ssrf) is an attack in which an attacker
is able coerce a application into making an outbound request to an unintended
resource. This resource is usually internal. In GitLab, the connection most
commonly uses HTTP, but an SSRF can be performed with any protocol, such as
@@ -1165,7 +1165,7 @@ func printZipContents(src string) error {
## Time of check to time of use bugs
Time of check to time of use, or TOCTOU, is a class of error which occur when the state of something changes unexpectedly partway during a process.
-More specifically, it's when the property you checked and validated has changed when you finally get around to using that property.
+More specifically, it's when the property you checked and validated has changed when you finally get around to using that property.
These types of bugs are often seen in environments which allow multi-threading and concurrency, like filesystems and distributed web applications; these are a type of race condition. TOCTOU also occurs when state is checked and stored, then after a period of time that state is relied on without re-checking its accuracy and/or validity.
@@ -1179,7 +1179,7 @@ GitLab-specific example can be found in [this issue](https://gitlab.com/gitlab-o
**Example 3:** you need to fetch a remote file, and perform a `HEAD` request to get and validate the content length and content type. When you subsequently make a `GET` request, though, the file delivered is a different size or different file type. (This is stretching the definition of TOCTOU, but things _have_ changed between time of check and time of use).
-**Example 4:** you allow users to upvote a comment if they haven't already. The server is multi-threaded, and you aren't using transactions or an applicable database index. By repeatedly clicking upvote in quick succession a malicious user is able to add multiple upvotes: the requests arrive at the same time, the checks run in parallel and confirm that no upvote exists yet, and so each upvote is written to the database.
+**Example 4:** you allow users to upvote a comment if they haven't already. The server is multi-threaded, and you aren't using transactions or an applicable database index. By repeatedly clicking upvote in quick succession a malicious user is able to add multiple upvotes: the requests arrive at the same time, the checks run in parallel and confirm that no upvote exists yet, and so each upvote is written to the database.
Here's some pseudocode showing an example of a potential TOCTOU bug:
diff --git a/doc/development/service_ping/implement.md b/doc/development/service_ping/implement.md
index 25e841e113b..ca4a0158051 100644
--- a/doc/development/service_ping/implement.md
+++ b/doc/development/service_ping/implement.md
@@ -760,7 +760,7 @@ To set up Service Ping locally, you must:
1. Clone and start [Versions Application](https://gitlab.com/gitlab-services/version-gitlab-com).
Make sure you run `docker-compose up` to start a PostgreSQL and Redis instance.
1. Point GitLab to the Versions Application endpoint instead of the default endpoint:
- 1. Open [service_ping/submit_service.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/service_ping/submit_service.rb#L5) in your local and modified `PRODUCTION_URL`.
+ 1. Open [service_ping/submit_service.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/service_ping/submit_service.rb#L5) locally and modify `STAGING_BASE_URL`.
1. Set it to the local Versions Application URL: `http://localhost:3000/usage_data`.
### Test local setup
diff --git a/doc/development/service_ping/index.md b/doc/development/service_ping/index.md
index 6878fd1bf28..14bb90537e7 100644
--- a/doc/development/service_ping/index.md
+++ b/doc/development/service_ping/index.md
@@ -48,7 +48,7 @@ make better product decisions.
There are several other benefits to enabling Service Ping:
- As a benefit of having Service Ping active, GitLab lets you analyze the users' activities over time of your GitLab installation.
-- As a benefit of having Service Ping active, GitLab provides you with [DevOps Score](../../user/admin_area/analytics/dev_ops_report.md#devops-score), which gives you an overview of your entire instance's adoption of Concurrent DevOps from planning to monitoring.
+- As a benefit of having Service Ping active, GitLab provides you with [DevOps Score](../../user/admin_area/analytics/dev_ops_reports.md#devops-score), which gives you an overview of your entire instance's adoption of Concurrent DevOps from planning to monitoring.
- You get better, more proactive support (assuming that our TAMs and support organization used the data to deliver more value).
- You get insight and advice into how to get the most value out of your investment in GitLab. Wouldn't you want to know that a number of features or values are not being adopted in your organization?
- You get a report that illustrates how you compare against other similar organizations (anonymized), with specific advice and recommendations on how to improve your DevOps processes.
@@ -76,7 +76,7 @@ tier. Users can continue to access the features in a paid tier without sharing u
#### Features available in 14.1 and later
-1. [Email from GitLab](../../tools/email.md).
+1. [Email from GitLab](../../user/admin_area/email_from_gitlab.md).
#### Features available in 14.4 and later
@@ -582,7 +582,8 @@ ServicePing::SubmitService.new(skip_db_write: true).execute
## Manually upload Service Ping payload
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/7388) in GitLab 14.8 with a flag named `admin_application_settings_service_usage_data_center`. Disabled by default.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/7388) in GitLab 14.8 with a flag named `admin_application_settings_service_usage_data_center`. Disabled by default.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83265) in GitLab 14.10.
Service Ping payload can be uploaded to GitLab even if your application instance doesn't have access to the internet,
or you don't have Service Ping [cron job](#how-service-ping-works) enabled.
@@ -598,6 +599,9 @@ To upload payload manually:
1. Select **Choose file** and choose the file from p5.
1. Select **Upload**.
+The uploaded file is encrypted and sent using secure [HTTPS protocol](https://en.wikipedia.org/wiki/HTTPS). HTTPS creates a secure
+communication channel between web browser and the server, and protects transmitted data against man-in-the-middle attacks.
+
## Monitoring
Service Ping reporting process state is monitored with [internal SiSense dashboard](https://app.periscopedata.com/app/gitlab/968489/Product-Intelligence---Service-Ping-Health).
diff --git a/doc/development/service_ping/metrics_dictionary.md b/doc/development/service_ping/metrics_dictionary.md
index 6884844da3f..ab3d301908b 100644
--- a/doc/development/service_ping/metrics_dictionary.md
+++ b/doc/development/service_ping/metrics_dictionary.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Metrics Dictionary Guide
[Service Ping](index.md) metrics are defined in individual YAML files definitions from which the
-[Metrics Dictionary](https://metrics.gitlab.com/) is built.
+[Metrics Dictionary](https://metrics.gitlab.com/) is built. Currently, the metrics dictionary is built automatically once a day. When a change to a metric is made in a YAML file, you can see the change in the dictionary within 24 hours.
This guide describes the dictionary and how it's implemented.
## Metrics Definition and validation
@@ -95,7 +95,7 @@ return to the instrumentation and update it.
1. Add the metric instrumentation class to `lib/gitlab/usage/metrics/instrumentations/`.
1. Add the metric logic in the instrumentation class.
-1. Run the [metrics YAML generator](metrics_dictionary.md#metrics-definition-and-validation).
+1. Run the [metrics YAML generator](metrics_dictionary.md#create-a-new-metric-definition).
1. Use the metric name suggestion to select a suitable metric name.
1. Update the metric's YAML definition with the correct `key_path`.
diff --git a/doc/development/service_ping/metrics_instrumentation.md b/doc/development/service_ping/metrics_instrumentation.md
index c684d9d12ef..3d56f3e777f 100644
--- a/doc/development/service_ping/metrics_instrumentation.md
+++ b/doc/development/service_ping/metrics_instrumentation.md
@@ -24,7 +24,9 @@ This guide describes how to develop Service Ping metrics using metrics instrumen
A metric definition has the [`instrumentation_class`](metrics_dictionary.md) field, which can be set to a class.
-The defined instrumentation class should have one of the existing metric classes: `DatabaseMetric`, `RedisMetric`, `RedisHLLMetric`, or `GenericMetric`.
+The defined instrumentation class should inherit one of the existing metric classes: `DatabaseMetric`, `RedisMetric`, `RedisHLLMetric`, or `GenericMetric`.
+
+The current convention is that a single instrumentation class corresponds to a single metric. On a rare occasions, there are exceptions to that convention like [Redis metrics](#redis-metrics). To use a single instrumentation class for more than one metric, please reach out to one of the `@gitlab-org/growth/product-intelligence/engineers` members to consult about your case.
Using the instrumentation classes ensures that metrics can fail safe individually, without breaking the entire
process of Service Ping generation.
@@ -186,3 +188,30 @@ rails generate gitlab:usage_metric CountIssues --type database
create lib/gitlab/usage/metrics/instrumentations/count_issues_metric.rb
create spec/lib/gitlab/usage/metrics/instrumentations/count_issues_metric_spec.rb
```
+
+## Migrate Service Ping metrics to instrumentation classes
+
+This guide describes how to migrate a Service Ping metric from [`lib/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb) or [`ee/lib/ee/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/usage_data.rb) to instrumentation classes.
+
+1. Choose the metric type:
+
+- [Database metric](#database-metrics)
+- [Redis HyperLogLog metrics](#redis-hyperloglog-metrics)
+- [Redis metric](#redis-metrics)
+- [Generic metric](#generic-metrics)
+
+1. Determine the location of instrumentation class: either under `ee` or outside `ee`.
+
+1. [Generate the instrumentation class file](#create-a-new-metric-instrumentation-class).
+
+1. Fill the instrumentation class body:
+
+ - Add code logic for the metric. This might be similar to the metric implementation in `usage_data.rb`.
+ - Add tests for the individual metric [`spec/lib/gitlab/usage/metrics/instrumentations/`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/usage/metrics/instrumentations).
+ - Add tests for Service Ping.
+
+1. [Generate the metric definition file](metrics_dictionary.md#create-a-new-metric-definition).
+
+1. Remove the code from [`lib/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb) or [`ee/lib/ee/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/usage_data.rb).
+
+1. Remove the tests from [`spec/lib/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/lib/gitlab/usage_data_spec.rb) or [`ee/spec/lib/ee/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/spec/lib/ee/gitlab/usage_data_spec.rb).
diff --git a/doc/development/service_ping/metrics_lifecycle.md b/doc/development/service_ping/metrics_lifecycle.md
index a7ecf15a493..844c989c640 100644
--- a/doc/development/service_ping/metrics_lifecycle.md
+++ b/doc/development/service_ping/metrics_lifecycle.md
@@ -60,6 +60,8 @@ The correct approach is to add a new metric for GitLab 12.6 release with updated
and update existing business analysis artefacts to use `example_metric_without_archived` instead of `example_metric`
+Currently, the [Metrics Dictionary](https://metrics.gitlab.com/) is built automatically once a day. When a change to a metric is made in a YAML file, you can see the change in the dictionary within 24 hours.
+
## Remove a metric
WARNING:
@@ -95,6 +97,12 @@ To remove a metric:
used to test the [`UsageDataController#create`](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/3760ef28/spec/controllers/usage_data_controller_spec.rb#L75)
endpoint, and assure that test suite does not fail when metric that you wish to remove is not included into test payload.
+1. Remove data from Redis
+
+ For [Ordinary Redis](implement.md#ordinary-redis-counters) counters remove data stored in Redis.
+
+ - Add a migration to remove the data from Redis for the related Redis keys. For more details, see [this MR example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82604/diffs).
+
1. Create an issue in the
[GitLab Data Team project](https://gitlab.com/gitlab-data/analytics/-/issues).
Ask for confirmation that the metric is not referred to in any SiSense dashboards and
diff --git a/doc/development/service_ping/troubleshooting.md b/doc/development/service_ping/troubleshooting.md
index 770b6650764..15bc01f1270 100644
--- a/doc/development/service_ping/troubleshooting.md
+++ b/doc/development/service_ping/troubleshooting.md
@@ -28,4 +28,4 @@ For results about an investigation conducted into an unexpected drop in Service
### Troubleshooting data warehouse layer
-Reach out to the [Data team](https://about.gitlab.com/handbook/business-technology/data-team) to ask about current state of data warehouse. On their handbook page there is a [section with contact details](https://about.gitlab.com/handbook/business-technology/data-team/#how-to-connect-with-us).
+Reach out to the [Data team](https://about.gitlab.com/handbook/business-technology/data-team/) to ask about current state of data warehouse. On their handbook page there is a [section with contact details](https://about.gitlab.com/handbook/business-technology/data-team/#how-to-connect-with-us).
diff --git a/doc/development/sidekiq/compatibility_across_updates.md b/doc/development/sidekiq/compatibility_across_updates.md
index 919f6935139..35f4b88351e 100644
--- a/doc/development/sidekiq/compatibility_across_updates.md
+++ b/doc/development/sidekiq/compatibility_across_updates.md
@@ -156,4 +156,4 @@ end
You must rename the queue in a post-deployment migration not in a normal
migration. Otherwise, it runs too early, before all the workers that
-schedule these jobs have stopped running. See also [other examples](../post_deployment_migrations.md#use-cases).
+schedule these jobs have stopped running. See also [other examples](../database/post_deployment_migrations.md#use-cases).
diff --git a/doc/development/single_table_inheritance.md b/doc/development/single_table_inheritance.md
index eb406b02a91..0783721e628 100644
--- a/doc/development/single_table_inheritance.md
+++ b/doc/development/single_table_inheritance.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Enablement
+group: Database
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -31,8 +31,8 @@ could result in loading unexpected code or associations which may cause unintend
side effects or failures during upgrades.
```ruby
-class SomeMigration < Gitlab::Database::Migration[1.0]
- class Services < ActiveRecord::Base
+class SomeMigration < Gitlab::Database::Migration[2.0]
+ class Services < MigrationRecord
self.table_name = 'services'
self.inheritance_column = :_type_disabled
end
diff --git a/doc/development/snowplow/implementation.md b/doc/development/snowplow/implementation.md
index 6061a1d4cd2..162b77772f9 100644
--- a/doc/development/snowplow/implementation.md
+++ b/doc/development/snowplow/implementation.md
@@ -21,8 +21,25 @@ For the recommended frontend tracking implementation, see [Usage recommendations
Structured events and page views include the [`gitlab_standard`](schemas.md#gitlab_standard)
context, using the `window.gl.snowplowStandardContext` object which includes
[default data](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/views/layouts/_snowplow.html.haml)
-as base. This object can be modified for any subsequent structured event fired,
-although it's not recommended.
+as base:
+
+| Property | Example |
+| -------- | ------- |
+| `context_generated_at` | `"2022-01-01T01:00:00.000Z"` |
+| `environment` | `"production"` |
+| `extra` | `{}` |
+| `namespace_id` | `123` |
+| `plan` | `"gold"` |
+| `project_id` | `456` |
+| `source` | `"gitlab-rails"` |
+| `user_id` | `789`* |
+
+_\* Undergoes a pseudonymization process at the collector level._
+
+These properties [are overriden](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/tracking/get_standard_context.js)
+with frontend-specific values, like `source` (`gitlab-javascript`), `google_analytics_id`
+and the custom `extra` object. You can modify this object for any subsequent
+structured event that fires, although this is not recommended.
Tracking implementations must have an `action` and a `category`. You can provide additional
properties from the [structured event taxonomy](index.md#structured-event-taxonomy), in
@@ -396,13 +413,13 @@ Use the following arguments:
|------------|---------------------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------|
| `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 (decimal) 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. |
+| `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 (decimal) 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. This value undergoes a pseudonymization process at the collector level. |
+| `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
diff --git a/doc/development/snowplow/index.md b/doc/development/snowplow/index.md
index 29f4514a21e..9b684757fe1 100644
--- a/doc/development/snowplow/index.md
+++ b/doc/development/snowplow/index.md
@@ -150,6 +150,23 @@ ORDER BY page_view_start DESC
LIMIT 100
```
+#### Top 20 users who fired `reply_comment_button` in the last 30 days
+
+```sql
+SELECT
+ count(*) as hits,
+ se_action,
+ se_category,
+ gsc_pseudonymized_user_id
+FROM legacy.snowplow_gitlab_events_30
+WHERE
+ se_label = 'reply_comment_button'
+ AND gsc_pseudonymized_user_id IS NOT NULL
+GROUP BY gsc_pseudonymized_user_id, se_category, se_action
+ORDER BY count(*) DESC
+LIMIT 20
+```
+
#### Query JSON formatted data
```sql
diff --git a/doc/development/snowplow/schemas.md b/doc/development/snowplow/schemas.md
index 63864c9329b..4066151600d 100644
--- a/doc/development/snowplow/schemas.md
+++ b/doc/development/snowplow/schemas.md
@@ -10,17 +10,18 @@ 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.
+We are including the [`gitlab_standard` schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_standard/jsonschema/) for structured events and page views.
The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb)
-class represents this schema in the application. Some properties are automatically populated for [frontend](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/views/layouts/_snowplow.html.haml)
-events.
+class represents this schema in the application. Some properties are
+[automatically populated for frontend events](implementation.md#snowplow-javascript-frontend-tracking),
+and can be [provided manually for backend events](implementation.md#implement-ruby-backend-tracking).
| Field Name | Required | Default value | Type | Description |
|----------------|:-------------------:|-----------------------|--|---------------------------------------------------------------------------------------------|
| `project_id` | **{dotted-circle}** | Current project ID * | integer | |
| `namespace_id` | **{dotted-circle}** | Current group/namespace ID * | integer | |
-| `user_id` | **{dotted-circle}** | Current user ID * | integer | User database record ID attribute. This file undergoes a pseudonymization process at the collector level. |
+| `user_id` | **{dotted-circle}** | Current user ID * | integer | User database record ID attribute. This value undergoes a pseudonymization process at the collector level. |
| `context_generated_at` | **{dotted-circle}** | Current timestamp | string (date time format) | Timestamp indicating when context was generated. |
| `environment` | **{check-circle}** | Current environment | string (max 32 chars) | Name of the source environment, such as `production` or `staging` |
| `source` | **{check-circle}** | Event source | string (max 32 chars) | Name of the source application, such as `gitlab-rails` or `gitlab-javascript` |
diff --git a/doc/development/snowplow/troubleshooting.md b/doc/development/snowplow/troubleshooting.md
index 75c8b306a67..47d775d89aa 100644
--- a/doc/development/snowplow/troubleshooting.md
+++ b/doc/development/snowplow/troubleshooting.md
@@ -28,7 +28,7 @@ While on CloudWatch dashboard set time range to last 4 weeks, to get better pict
Drop occurring at application layer can be symptom of some issue, but it might be also a result of normal application lifecycle, intended changes done to product intelligence or experiments tracking
or even a result of a public holiday in some regions of the world with a larger user-base. To verify if there is an underlying problem to solve, you can check following things:
-1. Check `about.gitlab.com` website traffic on [Google Analytics](https://analytics.google.com/) to verify if some public holiday might impact overall use of GitLab system
+1. Check `about.gitlab.com` website traffic on [Google Analytics](https://analytics.google.com/analytics/web/) to verify if some public holiday might impact overall use of GitLab system
1. You may require to open an access request for Google Analytics access first eg: [access request internal issue](https://gitlab.com/gitlab-com/team-member-epics/access-requests/-/issues/1772)
1. Plot `select date(dvce_created_tstamp) , event , count(*) from legacy.snowplow_unnested_events_90 where dvce_created_tstamp > '2021-06-15' and dvce_created_tstamp < '2021-07-10' group by 1 , 2 order by 1 , 2` in SiSense to see what type of events was responsible for drop
1. Plot `select date(dvce_created_tstamp) ,se_category , count(*) from legacy.snowplow_unnested_events_90 where dvce_created_tstamp > '2021-06-15' and dvce_created_tstamp < '2021-07-31' and event = 'struct' group by 1 , 2 order by 1, 2` what events recorded the biggest drops in suspected category
@@ -47,4 +47,4 @@ Already conducted investigations:
### Troubleshooting data warehouse layer
-Reach out to [Data team](https://about.gitlab.com/handbook/business-technology/data-team) to ask about current state of data warehouse. On their handbook page there is a [section with contact details](https://about.gitlab.com/handbook/business-technology/data-team/#how-to-connect-with-us)
+Reach out to [Data team](https://about.gitlab.com/handbook/business-technology/data-team/) to ask about current state of data warehouse. On their handbook page there is a [section with contact details](https://about.gitlab.com/handbook/business-technology/data-team/#how-to-connect-with-us)
diff --git a/doc/development/spam_protection_and_captcha/graphql_api.md b/doc/development/spam_protection_and_captcha/graphql_api.md
index b47e3f84320..e3f4e9069e5 100644
--- a/doc/development/spam_protection_and_captcha/graphql_api.md
+++ b/doc/development/spam_protection_and_captcha/graphql_api.md
@@ -13,28 +13,27 @@ related to changing a model's confidential/public flag.
## Add support to the GraphQL mutations
-This implementation is very similar to the controller implementation. You create a `spam_params`
-instance based on the request, and pass it to the relevant Service class constructor.
+The main steps are:
-The three main differences from the controller implementation are:
+1. Use `include Mutations::SpamProtection` in your mutation.
+1. Create a `spam_params` instance based on the request. Obtain the request from the context
+ via `context[:request]` when creating the `SpamParams` instance.
+1. Pass `spam_params` to the relevant Service class constructor.
+1. After you create or update the `Spammable` model instance, call `#check_spam_action_response!`
+ and pass it the model instance. This call:
+ 1. Performs the necessary spam checks on the model.
+ 1. If spam is detected:
+ - Raises a `GraphQL::ExecutionError` exception.
+ - Includes the relevant information added as error fields to the response via the `extensions:` parameter.
+ For more details on these fields, refer to the section in the GraphQL API documentation on
+ [Resolve mutations detected as spam](../../api/graphql/index.md#resolve-mutations-detected-as-spam).
-1. Use `include Mutations::SpamProtection` instead of `...JsonFormatActionsSupport`.
-1. Obtain the request from the context via `context[:request]` when creating the `SpamParams`
- instance.
-1. After you create or updated the `Spammable` model instance, call `#check_spam_action_response!`
- and pass it the model instance. This call will:
- 1. Perform the necessary spam checks on the model.
- 1. If spam is detected:
- - Raise a `GraphQL::ExecutionError` exception.
- - Include the relevant information added as error fields to the response via the `extensions:` parameter.
- For more details on these fields, refer to the section on
- [Spam and CAPTCHA support in the GraphQL API](../../api/graphql/index.md#resolve-mutations-detected-as-spam).
-
- NOTE:
- If you use the standard ApolloLink or Axios interceptor CAPTCHA support described
- above, the field details are unimportant. They become important if you
- attempt to use the GraphQL API directly to process a failed check for potential spam, and
- resubmit the request with a solved CAPTCHA response.
+ NOTE:
+ If you use the standard ApolloLink or Axios interceptor CAPTCHA support described
+ above, you can ignore the field details, because they are handled
+ automatically. They become relevant if you attempt to use the GraphQL API directly to
+ process a failed check for potential spam, and resubmit the request with a solved
+ CAPTCHA response.
For example:
@@ -57,10 +56,13 @@ module Mutations
widget = service_response.payload[:widget]
check_spam_action_response!(widget)
- # If possible spam wasdetected, an exception would have been thrown by
+ # If possible spam was detected, an exception would have been thrown by
# `#check_spam_action_response!`, so the normal resolve return logic can follow below.
end
end
end
end
```
+
+Refer to the [Exploratory Testing](exploratory_testing.md) section for instructions on how to test
+CAPTCHA behavior in the GraphQL API.
diff --git a/doc/development/spam_protection_and_captcha/index.md b/doc/development/spam_protection_and_captcha/index.md
index 9b195df536d..dbe8c4aa4e9 100644
--- a/doc/development/spam_protection_and_captcha/index.md
+++ b/doc/development/spam_protection_and_captcha/index.md
@@ -16,7 +16,7 @@ To add this support, you must implement the following areas as applicable:
1. [Model and Services](model_and_services.md): The basic prerequisite
changes to the backend code which are required to add spam or CAPTCHA API and UI support
for a feature which does not yet have support.
-1. REST API (Supported, documentation coming soon): The changes needed to add
+1. [REST API](rest_api.md): The changes needed to add
spam or CAPTCHA support to Grape REST API endpoints. Refer to the related
[REST API documentation](../../api/index.md#resolve-requests-detected-as-spam).
1. [GraphQL API](graphql_api.md): The changes needed to add spam or CAPTCHA support to GraphQL
diff --git a/doc/development/spam_protection_and_captcha/rest_api.md b/doc/development/spam_protection_and_captcha/rest_api.md
new file mode 100644
index 00000000000..ad74977eb67
--- /dev/null
+++ b/doc/development/spam_protection_and_captcha/rest_api.md
@@ -0,0 +1,90 @@
+---
+stage: Manage
+group: Authentication and Authorization
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# REST API spam protection and CAPTCHA support
+
+If the model can be modified via the REST API, you must also add support to all of the
+relevant API endpoints which may modify spammable or spam-related attributes. This
+definitely includes the `POST` and `PUT` mutations, but may also include others, such as those
+related to changing a model's confidential/public flag.
+
+## Add support to the REST endpoints
+
+The main steps are:
+
+1. Add `helpers SpammableActions::CaptchaCheck::RestApiActionsSupport` in your `resource`.
+1. Create a `spam_params` instance based on the request.
+1. Pass `spam_params` to the relevant Service class constructor.
+1. After you create or update the `Spammable` model instance, call `#check_spam_action_response!`,
+ save the created or updated instance in a variable.
+1. Identify the error handling logic for the `failure` case of the request,
+ when create or update was not successful. These indicate possible spam detection,
+ which adds an error to the `Spammable` instance.
+ The error is usually similar to `render_api_error!` or `render_validation_error!`.
+1. Wrap the existing error handling logic in a
+ `with_captcha_check_rest_api(spammable: my_spammable_instance)` call, passing the `Spammable`
+ model instance you saved in a variable as the `spammable:` named argument. This call will:
+ 1. Perform the necessary spam checks on the model.
+ 1. If spam is detected:
+ - Raise a Grape `#error!` exception with a descriptive spam-specific error message.
+ - Include the relevant information added as error fields to the response.
+ For more details on these fields, refer to the section in the REST API documentation on
+ [Resolve requests detected as spam](../../api/index.md#resolve-requests-detected-as-spam).
+
+ NOTE:
+ If you use the standard ApolloLink or Axios interceptor CAPTCHA support described
+ above, you can ignore the field details, because they are handled
+ automatically. They become relevant if you attempt to use the GraphQL API directly to
+ process a failed check for potential spam, and resubmit the request with a solved
+ CAPTCHA response.
+
+Here is an example for the `post` and `put` actions on the `snippets` resource:
+
+```ruby
+module API
+ class Snippets < ::API::Base
+ #...
+ resource :snippets do
+ # This helper provides `#with_captcha_check_rest_api`
+ helpers SpammableActions::CaptchaCheck::RestApiActionsSupport
+
+ post do
+ #...
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
+ service_response = ::Snippets::CreateService.new(project: nil, current_user: current_user, params: attrs, spam_params: spam_params).execute
+ snippet = service_response.payload[:snippet]
+
+ if service_response.success?
+ present snippet, with: Entities::PersonalSnippet, current_user: current_user
+ else
+ # Wrap the normal error response in a `with_captcha_check_rest_api(spammable: snippet)` block
+ with_captcha_check_rest_api(spammable: snippet) do
+ # If possible spam was detected, an exception would have been thrown by
+ # `#with_captcha_check_rest_api` for Grape to handle via `error!`
+ render_api_error!({ error: service_response.message }, service_response.http_status)
+ end
+ end
+ end
+
+ put ':id' do
+ #...
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
+ service_response = ::Snippets::UpdateService.new(project: nil, current_user: current_user, params: attrs, spam_params: spam_params).execute(snippet)
+
+ snippet = service_response.payload[:snippet]
+
+ if service_response.success?
+ present snippet, with: Entities::PersonalSnippet, current_user: current_user
+ else
+ # Wrap the normal error response in a `with_captcha_check_rest_api(spammable: snippet)` block
+ with_captcha_check_rest_api(spammable: snippet) do
+ # If possible spam was detected, an exception would have been thrown by
+ # `#with_captcha_check_rest_api` for Grape to handle via `error!`
+ render_api_error!({ error: service_response.message }, service_response.http_status)
+ end
+ end
+ end
+```
diff --git a/doc/development/spam_protection_and_captcha/web_ui.md b/doc/development/spam_protection_and_captcha/web_ui.md
index 6aa01f401bd..9aeb9e96d44 100644
--- a/doc/development/spam_protection_and_captcha/web_ui.md
+++ b/doc/development/spam_protection_and_captcha/web_ui.md
@@ -37,7 +37,7 @@ additional fields being added to the models. Instead, communication is handled:
The spam and CAPTCHA-related logic is also cleanly abstracted into reusable modules and helper methods
which can wrap existing logic, and only alter the existing flow if potential spam
is detected or a CAPTCHA display is needed. This approach allows the spam and CAPTCHA
-support to be easily added to new areas of the application with minimal changes to
+support to be added to new areas of the application with minimal changes to
existing logic. In the case of the frontend, potentially **zero** changes are needed!
On the frontend, this is handled abstractly and transparently using `ApolloLink` for Apollo, and an
@@ -75,7 +75,7 @@ sequenceDiagram
The backend is also cleanly abstracted via mixin modules and helper methods. The three main
changes required to the relevant backend controller actions (normally just `create`/`update`) are:
-1. Create a `SpamParams` parameter object instance based on the request, using the simple static
+1. Create a `SpamParams` parameter object instance based on the request, using the static
`#new_from_request` factory method. This method takes a request, and returns a `SpamParams` instance.
1. Pass the created `SpamParams` instance as the `spam_params` named argument to the
Service class constructor, which you should have already added. If the spam check indicates
diff --git a/doc/development/sql.md b/doc/development/sql.md
index e2208caf35a..4b6153b7205 100644
--- a/doc/development/sql.md
+++ b/doc/development/sql.md
@@ -254,13 +254,13 @@ of records plucked. `MAX_PLUCK` defaults to `1_000` in `ApplicationRecord`.
## Inherit from ApplicationRecord
-Most models in the GitLab codebase should inherit from `ApplicationRecord`,
-rather than from `ActiveRecord::Base`. This allows helper methods to be easily
-added.
+Most models in the GitLab codebase should inherit from `ApplicationRecord`
+or `Ci::ApplicationRecord` rather than from `ActiveRecord::Base`. This allows
+helper methods to be easily added.
An exception to this rule exists for models created in database migrations. As
these should be isolated from application code, they should continue to subclass
-from `ActiveRecord::Base`.
+from `MigrationRecord` which is available only in migration context.
## Use UNIONs
@@ -376,7 +376,7 @@ Explicit column list definition:
```ruby
# Good, the SELECT columns are consistent
-columns = User.cached_column_names # The helper returns fully qualified (table.column) column names (Arel)
+columns = User.cached_column_list # The helper returns fully qualified (table.column) column names (Arel)
scope1 = User.select(*columns).where(id: [1, 2, 3]) # selects the columns explicitly
scope2 = User.select(*columns).where(id: [10, 11, 12]) # uses SELECT users.*
diff --git a/doc/development/stage_group_dashboards.md b/doc/development/stage_group_dashboards.md
index 744d049f72d..8e3e6982430 100644
--- a/doc/development/stage_group_dashboards.md
+++ b/doc/development/stage_group_dashboards.md
@@ -1,273 +1,11 @@
---
-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
+redirect_to: 'stage_group_observability/index.md'
+remove_date: '2022-06-15'
---
-# Dashboards for stage groups
+This document was moved to [another location](stage_group_observability/index.md).
-## Introduction
-
-Observability is about bringing visibility into a system to see and understand the state of each component, with context, to support performance tuning and debugging. To run a SaaS platform at scale, a rich and detailed observability platform is a necessity. We have a set of monitoring dashboards designed for [each stage group](https://about.gitlab.com/handbook/product/categories/#devops-stages).
-
-These dashboards are designed to give an insight, to everyone working in a feature category, into how their code operates at GitLab.com scale. They are grouped per stage group to show the impact of feature/code changes, deployments, and feature-flag toggles.
-
-Each stage group has a dashboard consisting of metrics at the application level, such as Rails Web Requests, Rails API Requests, Sidekiq Jobs, and so on. The metrics in each dashboard are filtered and accumulated based on the [GitLab product categories](https://about.gitlab.com/handbook/product/categories/) and [feature categories](feature_categorization/index.md).
-
-The list of dashboards for each stage group is accessible at <https://dashboards.gitlab.net/dashboards/f/stage-groups/stage-groups> (GitLab team members only), or at [the public mirror](https://dashboards.gitlab.com/dashboards?tag=feature_category&tag=stage-groups) (accessible to everyone with a GitLab.com account, with some limitations).
-
-The dashboards for stage groups are at a very early stage. All contributions are welcome. If you have any questions or suggestions, please submit an issue in the [Scalability Team issues tracker](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/new).
-
-## Dashboard content
-
-### Error budget
-
-Read more about how we are using error budgets overall in our
-[handbook](https://about.gitlab.com/handbook/engineering/error-budgets/).
-
-By default, the first row of panels on the dashboard will show the [error
-budget for the stage
-group](https://about.gitlab.com/handbook/engineering/error-budgets/#budget-spend-by-stage-group). This
-row shows how the features owned by
-the group are contributing to our [overall
-availability](https://about.gitlab.com/handbook/engineering/infrastructure/performance-indicators/#gitlabcom-availability).
-
-The budget is always aggregated over the 28 days before the [time
-selected on the dashboard](#time-range-controls).
-
-We're currently displaying the information in 2 formats:
-
-1. Availability: This number can be compared to GitLab.com's overall
- availability target of 99.95% uptime.
-1. Budget Spent: This shows the time over the past 28 days that
- features owned by the group have not been performing adequately.
-
-The budget is calculated based on indicators per component. Each
-component can have 2 indicators:
-
-1. [Apdex](https://en.wikipedia.org/wiki/Apdex): The rate of
- operations that performed adequately.
-
- The threshold for 'performed adequately' is stored in our [metrics
- catalog](https://gitlab.com/gitlab-com/runbooks/-/tree/master/metrics-catalog)
- and depends on the service in question. For the Puma (Rails)
- component of the
- [API](https://gitlab.com/gitlab-com/runbooks/-/blob/f22f40b2c2eab37d85e23ccac45e658b2c914445/metrics-catalog/services/api.jsonnet#L127),
- [Git](https://gitlab.com/gitlab-com/runbooks/-/blob/f22f40b2c2eab37d85e23ccac45e658b2c914445/metrics-catalog/services/git.jsonnet#L216),
- and
- [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/worker_attributes.md#job-urgency). It is
- [currently](https://gitlab.com/gitlab-com/runbooks/-/blob/f22f40b2c2eab37d85e23ccac45e658b2c914445/metrics-catalog/services/lib/sidekiq-helpers.libsonnet#L25-38)
- **10 seconds** for high-urgency jobs and **5 minutes** for other
- jobs.
-
- Some stage groups may have more services than these, and the
- thresholds for those will be in the metrics catalog as well.
-
-1. Error rate: The rate of operations that had errors.
-
-The calculation to a ratio then happens as follows:
-
-```math
-\frac {operations\_meeting\_apdex + (total\_operations - operations\_with\_errors)} {total\_apdex\_measurements + total\_operations}
-```
-
-### Check where budget is being spent
-
-The row below the error budget row is collapsed by default. Expanding
-it shows which component and violation type had the most offending
-operations in the past 28 days.
-
-![Error attribution](img/stage_group_dashboards_error_attribution.png)
-
-The first panel on the left shows a table with the number of errors per
-component. Digging into the first row in that table is going to have
-the biggest impact on the budget spent.
-
-Commonly, the components spending most of the budget are Sidekiq or Puma. The panel in
-the center explains what these violation types mean, and how to dig
-deeper in the logs.
-
-The panel on the right provides links to Kibana that should reveal
-which endpoints or Sidekiq jobs are causing the errors.
-
-To learn how to use these panels and logs for
-determining which Rails endpoints are slow,
-see the [Error Budget Attribution for Purchase group](https://youtu.be/M9u6unON7bU) video.
-
-Other components visible in the table come from
-[service level indicators](https://sre.google/sre-book/service-level-objectives/) (SLIs) defined
-in the [metrics
-catalog](https://gitlab.com/gitlab-com/runbooks/-/blob/master/metrics-catalog/README.md).
-
-For those types of failures, you can follow the link to the service
-dashboard linked from the `type` column. The service dashboard
-contains a row specifically for the SLI that is causing the budget
-spent, with useful links to the logs and a description of what the
-component means. For example, see the `server` component of the
-`web-pages` service:
-
-![web-pages-server-component SLI](img/stage_group_dashboards_service_sli_detail.png)
-
-## Usage of the dashboard
-
-Inside a stage group dashboard, there are some notable components. Let's take the [Source Code group's dashboard](https://dashboards.gitlab.net/d/stage-groups-source_code/stage-groups-group-dashboard-create-source-code?orgId=1) as an example.
-
-### Time range controls
-
-![Default time filter](img/stage_group_dashboards_time_filter.png)
-
-- 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.
-
-### Filters and annotations
-
-In each dashboard, there are two filters and some annotations switches on the top of the page. [Grafana annotations](https://grafana.com/docs/grafana/latest/dashboards/annotations/) mark some special events, which are meaningful to development and operational activities, directly on the graphs.
-
-![Filters and annotations](img/stage_group_dashboards_filters.png)
-
-| Name | Type | Description |
-| ---- | ---- | ----------- |
-| `PROMETHEUS_DS` | filter | Filter the selective [Prometheus data sources](https://about.gitlab.com/handbook/engineering/monitoring/#prometheus). The default value is `Global`, which aggregates the data from all available data sources. Most of the time, you don't need to care about this filter. |
-| `environment` | filter | Filter the environment the metrics are fetched from. The default setting is production (`gprd`). Check [Production Environment mapping](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#environments) for other possibilities. |
-| `deploy` | annotation | Mark a deployment event on the GitLab.com SaaS platform. |
-| `canary-deploy` | annotation | Mark a [canary deployment](https://about.gitlab.com/handbook/engineering/#canary-testing) event on the GitLab.com SaaS platform. |
-| `feature-flags` | annotation | Mark the time point where a feature flag is updated.|
-
-This is an example of a feature flag annotation displayed on a dashboard panel.
-
-![Annotations](img/stage_group_dashboards_annotation.png)
-
-### Metrics panels
-
-![Metrics panels](img/stage_group_dashboards_metrics.png)
-
-Although most of the metrics displayed in the panels are self-explanatory in their title and nearby description, note the following:
-
-- The events are counted, measured, accumulated, then collected, and stored as [time series](https://prometheus.io/docs/concepts/data_model/). The data are calculated using statistical methods to produce metrics. It means that metrics are approximately correct and meaningful over a time period. They help you have an overview of the stage of a system over time. They are not meant to give you precise numbers of a discrete event. If you need a higher level of accuracy, please look at another monitoring tool like [logs](https://about.gitlab.com/handbook/engineering/monitoring/#logs). Please read the following examples for more explanations.
-- All the rate metrics' units are `requests per second`. The default aggregate time frame is 1 minute. For example, a panel shows the requests per second number at `2020-12-25 00:42:00` is `34.13`. It means at the minute 42 (from `2020-12-25 00:42:00` to `2020-12-25 00:42:59` ), there are approximately `34.13 * 60 = ~ 2047` requests processed by the web servers.
-- You may encounter some gotchas related to decimal fraction and rounding up frequently, especially in low-traffic cases. For example, the error rate of `RepositoryUpdateMirrorWorker` at `2020-12-25 02:04:00` is `0.07`, equivalent to `4.2` jobs per minute. The raw result is `0.06666666667`, equivalent to 4 jobs per minute.
-- All the rate metrics are more accurate when the data is big enough. The default floating-point precision is 2. In some extremely low panels, you would see `0.00` although there is still some real traffic.
-
-To inspect the raw data of the panel for further calculation, click on the Inspect button from the dropdown menu of a panel. Queries, raw data, and panel JSON structure are available. Read more at [Grafana panel inspection](https://grafana.com/docs/grafana/latest/panels/inspect-panel/).
-
-All the dashboards are powered by [Grafana](https://grafana.com/), a frontend for displaying metrics. Grafana consumes the data returned from queries to backend Prometheus data source, then presents them under different visualizations. The stage group dashboards are built to serve the most common use cases with a limited set of filters, and pre-built queries. Grafana provides a way to explore and visualize the metrics data with [Grafana Explore](https://grafana.com/docs/grafana/latest/explore/). This would require some knowledge about [Prometheus PromQL query language](https://prometheus.io/docs/prometheus/latest/querying/basics/).
-
-## How to debug with the dashboards
-
-- A team member in the Code Review group has merged an MR which got deployed to production.
-- To verify the deployment, we can check the [Code Review group's dashboard](https://dashboards.gitlab.net/d/stage-groups-code_review/stage-groups-group-dashboard-create-code-review?orgId=1).
-- Sidekiq Error Rate panel shows an elevated error rate, specifically `UpdateMergeRequestsWorker`.
-
- ![Debug 1](img/stage_group_dashboards_debug_1.png)
-
-- If we click on `Kibana: Kibana Sidekiq failed request logs` link in the Extra links session, we can filter for `UpdateMergeRequestsWorker`, and read through the logs.
-
- ![Debug 2](img/stage_group_dashboards_debug_2.png)
-
-- [Sentry](https://sentry.gitlab.net/gitlab/gitlabcom/) gives us a way to find the exception where we can filter by transaction type and correlation_id from a Kibana's result item.
-
- ![Debug 3](img/stage_group_dashboards_debug_3.png)
-
-- A precise exception, including a stack trace, job arguments, and other information, should now appear. Happy debugging!
-
-## How to customize the dashboard
-
-All Grafana dashboards at GitLab are generated from the [Jsonnet files](https://github.com/grafana/grafonnet-lib) stored in [the runbook project](https://gitlab.com/gitlab-com/runbooks/-/tree/master/dashboards). Particularly, the stage group dashboards definitions are stored in [/dashboards/stage-groups](https://gitlab.com/gitlab-com/runbooks/-/tree/master/dashboards/stage-groups) subfolder in the Runbook. By convention, each group has a corresponding Jsonnet file. The dashboards are synced with GitLab [stage group data](https://gitlab.com/gitlab-com/www-gitlab-com/-/raw/master/data/stages.yml) every month. Expansion and customization are one of the key principles used when we designed this system. To customize your group's dashboard, you need to edit the corresponding file and follow the [Runbook workflow](https://gitlab.com/gitlab-com/runbooks/-/tree/master/dashboards#dashboard-source). The dashboard is updated after the MR is merged. Looking at an autogenerated file, for example, [`product_planning.dashboard.jsonnet`](https://gitlab.com/gitlab-com/runbooks/-/blob/master/dashboards/stage-groups/product_planning.dashboard.jsonnet):
-
-```jsonnet
-// This file is autogenerated using scripts/update_stage_groups_dashboards.rb
-// Please feel free to customize this file.
-local stageGroupDashboards = import './stage-group-dashboards.libsonnet';
-
-stageGroupDashboards.dashboard('product_planning')
-.stageGroupDashboardTrailer()
-```
-
-We provide basic customization to filter out the components essential to your group's activities. By default, only the `web`, `api`, and `sidekiq` components are available in the dashboard, while `git` is hidden. See [how to enable available components and optional graphs](#optional-graphs).
-
-You can also append further information or custom metrics to a dashboard. This is an example that adds some links and a total request rate on the top of the page:
-
-```jsonnet
-local stageGroupDashboards = import './stage-group-dashboards.libsonnet';
-local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
-local basic = import 'grafana/basic.libsonnet';
-
-stageGroupDashboards.dashboard('source_code')
-.addPanel(
- grafana.text.new(
- title='Group information',
- mode='markdown',
- content=|||
- Useful link for the Source Code Management group dashboard:
- - [Issue list](https://gitlab.com/groups/gitlab-org/-/issues?scope=all&state=opened&label_name%5B%5D=repository)
- - [Epic list](https://gitlab.com/groups/gitlab-org/-/epics?label_name[]=repository)
- |||,
- ),
- gridPos={ x: 0, y: 0, w: 24, h: 4 }
-)
-.addPanel(
- basic.timeseries(
- title='Total Request Rate',
- yAxisLabel='Requests per Second',
- decimals=2,
- query=|||
- sum (
- rate(gitlab_transaction_duration_seconds_count{
- env='$environment',
- environment='$environment',
- feature_category=~'source_code_management',
- }[$__interval])
- )
- |||
- ),
- gridPos={ x: 0, y: 0, w: 24, h: 7 }
-)
-.stageGroupDashboardTrailer()
-```
-
-![Stage Group Dashboard Customization](img/stage_group_dashboards_time_customization.png)
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-If you want to see the workflow in action, we've recorded a pairing session on customizing a dashboard,
-available on [GitLab Unfiltered](https://youtu.be/shEd_eiUjdI).
-
-For deeper customization and more complicated metrics, visit the [Grafonnet lib](https://github.com/grafana/grafonnet-lib) project and the [GitLab Prometheus Metrics](../administration/monitoring/prometheus/gitlab_metrics.md#gitlab-prometheus-metrics) documentation.
-
-### Optional Graphs
-
-Some Graphs aren't relevant for all groups, so they aren't added to
-the dashboard by default. They can be added by customizing the
-dashboard.
-
-By default, only the `web`, `api`, and `sidekiq` metrics are
-shown. If you wish to see the metrics from the `git` fleet (or any
-other component that might be added in the future), this could be
-configured as follows:
-
-```jsonnet
-stageGroupDashboards
-.dashboard('source_code', components=stageGroupDashboards.supportedComponents)
-.stageGroupDashboardTrailer()
-```
-
-If your group is interested in Sidekiq job durations and their
-thresholds, these graphs can be added by calling the
-`.addSidekiqJobDurationByUrgency` function:
-
-```jsonnet
-stageGroupDashboards
-.dashboard('access')
-.addSidekiqJobDurationByUrgency()
-.stageGroupDashboardTrailer()
-```
+<!-- This redirect file can be deleted after <2022-06-15>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/development/stage_group_observability/dashboards/error_budget_detail.md b/doc/development/stage_group_observability/dashboards/error_budget_detail.md
new file mode 100644
index 00000000000..19f98d404e7
--- /dev/null
+++ b/doc/development/stage_group_observability/dashboards/error_budget_detail.md
@@ -0,0 +1,127 @@
+---
+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
+---
+
+# Error budget detail dashboard
+
+With error budget detailed dashboards you can explore the error budget
+spent at specific moments in time. By default, the dashboard shows
+the past 28 days. You can adjust it with the [time range controls](index.md#time-range-controls)
+or by selecting a range on one of the graphs.
+
+This dashboard is the same kind of dashboard we use for service level
+monitoring. For example, see the
+[overview dashboard for the web service](https://dashboards.gitlab.net/d/web-main) (GitLab internal).
+
+## Error budget panels
+
+On top of each dashboard, there's the same panel with the [error budget](../index.md#error-budget).
+Here, the time based targets adjust depending on the range.
+For example, while the budget was 20 minutes per 28 days, it is only 1/4 of that for 7 days:
+
+![5m budget in 7 days](img/error_budget_detail_7d_budget.png)
+
+Also, keep in mind that Grafana rounds the numbers. In this example the
+total time spent is 5 minutes and 24 seconds, so 24 seconds over
+budget.
+
+The attribution panels also show only failures that occurred
+within the selected range.
+
+These two panels represent a view of the "official" error budget: they
+take into account if an SLI was ignored.
+The [attribution panels](../index.md#check-where-budget-is-being-spent) show which components
+contributed the most over the selected period.
+
+The panels below take into account all SLIs that contribute to GitLab.com availability.
+This includes SLIs that are ignored for the official error budget.
+
+## Time series for aggregations
+
+The time series panels for aggregations all contain three panels:
+
+- Apdex: the [Apdex score](https://en.wikipedia.org/wiki/Apdex) for one or more SLIs. Higher score is better.
+- Error Ratio: the error ratio for one or more SLIs. Lower is better.
+- Requests Per Second: the number of operations per second. Higher means a bigger impact on the error budget.
+
+The Apdex and error-ratio panels also contain two alerting thresholds:
+
+- The one-hour threshold: the fast burn rate.
+
+ When this line is crossed, we've spent 2% of our monthly budget in the last hour.
+
+- The six-hour threshold: the slow burn rate.
+
+ When this line is crossed, we've spent 2% of our budget in the last six hours.
+
+If there is no error-ratio or Apdex for a certain SLI, the panel is hidden.
+
+Read more about these alerting windows in
+[Google SRE workbook](https://sre.google/workbook/alerting-on-slos/#recommended_time_windows_and_burn_rates_f).
+
+We don't have alerting on these metrics for stage groups.
+This work is being discussed in [epic 615](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/615).
+If this is something you would like for your group, let us know there.
+
+### Stage group aggregation
+
+![stage group aggregation graphs](img/error_budget_detail_stage_group_aggregation.png)
+
+The stage group aggregation shows a graph with the Apdex and errors
+portion of the error budget over time. The lower a dip in the Apdex
+graph or the higher a peak on the error ratio graph, the more budget
+was spent at that moment.
+
+The third graph shows the sum of all the request rates for all
+SLIs. Higher means there was more traffic.
+
+To zoom in on a particular moment where a lot of budget was spent, select the appropriate time in
+the graph.
+
+### Service-level indicators
+
+![Rails requests service level indicator](img/error_budget_detail_sli.png)
+
+This time series shows a breakdown of each SLI that could be contributing to the
+error budget for a stage group. Similar to the stage group
+aggregation, it contains an Apdex score, error ratio, and request
+rate.
+
+Here we also display an explanation panel, describing the SLI and
+linking to other monitoring tools. The links to logs (📖) or
+visualizations (📈) in Kibana are scoped to the feature categories
+for your stage group, and limited to the range selected. Keep in mind
+that we only keep logs in Kibana for seven days.
+
+In the graphs, there is a single line per service. In the previous example image,
+`rails_requests` is an SLI for the `web`, `api` and `git` services.
+
+Sidekiq is not included in this dashboard. We're tracking this in
+[epic 700](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/700).
+
+### SLI detail
+
+![Rails requests SLI detail](img/error_budget_detail_sli_detail.png)
+
+The SLI details row shows a breakdown of a specific SLI based on the
+labels present on the source metrics.
+
+For example, in the previous image, the `rails_requests` SLI has an `endpoint_id` label.
+We can show how much a certain endpoint was requested (RPS), and how much it contributed to the error
+budget spend.
+
+For Apdex we show the **Apdex Attribution** panel. The more prominent
+color is the one that contributed most to the spend. To see the
+top spending endpoint over the entire range, sort by the average.
+
+For error ratio we show an error rate. To see which label contributed most to the spend, sort by the
+average.
+
+We don't have endpoint information available for Rails errors. This work is being planned in
+[epic 663](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/663).
+
+The number of series to be loaded in the SLI details graphs is very
+high when compared to the other aggregations. Because of this, it's not possible to
+load more than a few days' worth of data.
diff --git a/doc/development/stage_group_observability/dashboards/img/error_budget_detail_7d_budget.png b/doc/development/stage_group_observability/dashboards/img/error_budget_detail_7d_budget.png
new file mode 100644
index 00000000000..1b2996d7d26
--- /dev/null
+++ b/doc/development/stage_group_observability/dashboards/img/error_budget_detail_7d_budget.png
Binary files differ
diff --git a/doc/development/stage_group_observability/dashboards/img/error_budget_detail_sli.png b/doc/development/stage_group_observability/dashboards/img/error_budget_detail_sli.png
new file mode 100644
index 00000000000..0472e35b0cb
--- /dev/null
+++ b/doc/development/stage_group_observability/dashboards/img/error_budget_detail_sli.png
Binary files differ
diff --git a/doc/development/stage_group_observability/dashboards/img/error_budget_detail_sli_detail.png b/doc/development/stage_group_observability/dashboards/img/error_budget_detail_sli_detail.png
new file mode 100644
index 00000000000..99530886ae9
--- /dev/null
+++ b/doc/development/stage_group_observability/dashboards/img/error_budget_detail_sli_detail.png
Binary files differ
diff --git a/doc/development/stage_group_observability/dashboards/img/error_budget_detail_stage_group_aggregation.png b/doc/development/stage_group_observability/dashboards/img/error_budget_detail_stage_group_aggregation.png
new file mode 100644
index 00000000000..d679637dcc4
--- /dev/null
+++ b/doc/development/stage_group_observability/dashboards/img/error_budget_detail_stage_group_aggregation.png
Binary files differ
diff --git a/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_28d_budget.png b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_28d_budget.png
new file mode 100644
index 00000000000..eb164dd3f68
--- /dev/null
+++ b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_28d_budget.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_annotation.png b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_annotation.png
index 3776d87e5bb..3776d87e5bb 100644
--- a/doc/development/img/stage_group_dashboards_annotation.png
+++ b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_annotation.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_debug_1.png b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_debug_1.png
index 309fad89120..309fad89120 100644
--- a/doc/development/img/stage_group_dashboards_debug_1.png
+++ b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_debug_1.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_debug_2.png b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_debug_2.png
index 2aad9ab5592..2aad9ab5592 100644
--- a/doc/development/img/stage_group_dashboards_debug_2.png
+++ b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_debug_2.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_debug_3.png b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_debug_3.png
index 38647410ffd..38647410ffd 100644
--- a/doc/development/img/stage_group_dashboards_debug_3.png
+++ b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_debug_3.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_filters.png b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_filters.png
index 27a836bc36d..27a836bc36d 100644
--- a/doc/development/img/stage_group_dashboards_filters.png
+++ b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_filters.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_metrics.png b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_metrics.png
index 6b6faff6e3b..6b6faff6e3b 100644
--- a/doc/development/img/stage_group_dashboards_metrics.png
+++ b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_metrics.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_time_customization.png b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_time_customization.png
index 49e61183b7c..49e61183b7c 100644
--- a/doc/development/img/stage_group_dashboards_time_customization.png
+++ b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_time_customization.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_time_filter.png b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_time_filter.png
index 81a3dc789f1..81a3dc789f1 100644
--- a/doc/development/img/stage_group_dashboards_time_filter.png
+++ b/doc/development/stage_group_observability/dashboards/img/stage_group_dashboards_time_filter.png
Binary files differ
diff --git a/doc/development/stage_group_observability/dashboards/index.md b/doc/development/stage_group_observability/dashboards/index.md
new file mode 100644
index 00000000000..f4e646c8634
--- /dev/null
+++ b/doc/development/stage_group_observability/dashboards/index.md
@@ -0,0 +1,70 @@
+---
+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
+---
+
+# Dashboards for stage groups
+
+We generate a lot of dashboards acting as windows to the metrics we
+use to monitor GitLab.com. Most of our dashboards are generated from
+Jsonnet in the
+[runbooks repository](https://gitlab.com/gitlab-com/runbooks/-/tree/master/dashboards#dashboard-source).
+Anyone can contribute to these, adding new dashboards or modifying
+existing ones.
+
+When adding new dashboards for your stage groups, tagging them with
+`stage_group:<group name>` cross-links the dashboard on other
+dashboards with the same tag. You can create dashboards for stage groups
+in the [`dashboards/stage-groups`](https://gitlab.com/gitlab-com/runbooks/-/tree/master/dashboards/stage-groups)
+directory. Directories can't be nested more than one level deep.
+
+To see a list of all the dashboards for your stage group:
+
+1. In Grafana, go to the [Dashboard browser](https://dashboards.gitlab.net/dashboards?tag=stage-groups).
+1. To see all of the dashboards for a specific group, filter for `stage_group:<group name>`.
+
+Some generated dashboards are already available:
+
+1. [Stage group dashboard](stage_group_dashboard.md): a customizable
+ dashboard with tailored metrics per group.
+1. [Error budget detail dashboard](error_budget_detail.md): a
+ dashboard allowing to explore the error budget spend over time and
+ over multiple SLIs.
+
+## Time range controls
+
+![Default time filter](img/stage_group_dashboards_time_filter.png)
+
+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
+[one-year retention](https://gitlab.com/gitlab-cookbooks/gitlab-prometheus/-/blob/31526b03fef823e2f9b3cda7c75dcd28a12418a3/attributes/prometheus.rb#L40).
+
+You can also zoom in and filter the time range directly on a graph. For more information, see the
+[Grafana Time Range Controls](https://grafana.com/docs/grafana/latest/dashboards/time-range-controls/)
+documentation.
+
+## Filters and annotations
+
+On each dashboard, there are two filters and some annotation switches on the top of the page.
+
+Some special events are meaningful to development and operational activities.
+[Grafana annotations](https://grafana.com/docs/grafana/latest/dashboards/annotations/) mark them
+directly on the graphs.
+
+![Filters and annotations](img/stage_group_dashboards_filters.png)
+
+| Name | Type | Description |
+| --------------- | ---------- | ----------- |
+| `PROMETHEUS_DS` | filter | Filter the selective [Prometheus data sources](https://about.gitlab.com/handbook/engineering/monitoring/#prometheus). The default value is `Global`, which aggregates the data from all available data sources. Most of the time, you don't need to care about this filter. |
+| `environment` | filter | Filter the environment the metrics are fetched from. The default setting is production (`gprd`). For other options, see [Production Environment mapping](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#environments). |
+| `stage` | filter | Filter metrics by stage: `main` or `cny` for canary. Default is `main` |
+| `deploy` | annotation | Mark a deployment event on the GitLab.com SaaS platform. |
+| `canary-deploy` | annotation | Mark a [canary deployment](https://about.gitlab.com/handbook/engineering/#canary-testing) event on the GitLab.com SaaS platform. |
+| `feature-flags` | annotation | Mark the time point when a feature flag is updated. |
+
+Example of a feature flag annotation displayed on a dashboard panel:
+
+![Annotations](img/stage_group_dashboards_annotation.png)
diff --git a/doc/development/stage_group_observability/dashboards/stage_group_dashboard.md b/doc/development/stage_group_observability/dashboards/stage_group_dashboard.md
new file mode 100644
index 00000000000..c1831cfce69
--- /dev/null
+++ b/doc/development/stage_group_observability/dashboards/stage_group_dashboard.md
@@ -0,0 +1,200 @@
+---
+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
+---
+
+# Stage group dashboard
+
+The stage group dashboard is generated dashboard that contains metrics
+for common components used by most stage groups. The dashboard is
+fully customizable and owned by the stage groups.
+
+This page explains what is on these dashboards, how to use their
+contents, and how they can be customized.
+
+## Dashboard contents
+
+### Error budget panels
+
+![28 day budget](img/stage_group_dashboards_28d_budget.png)
+
+The top panels display the [error budget](../index.md#error-budget).
+These panels always show the 28 days before the end time selected in the
+[time range controls](index.md#time-range-controls). This data doesn't
+follow the selected range. It does respect the filters for environment
+and stage.
+
+### Metrics panels
+
+![Metrics panels](img/stage_group_dashboards_metrics.png)
+
+Although most of the metrics displayed in the panels are self-explanatory in their title and nearby
+description, note the following:
+
+- The events are counted, measured, accumulated, collected, and stored as
+ [time series](https://prometheus.io/docs/concepts/data_model/). The data is calculated using
+ statistical methods to produce metrics. It means that metrics are approximately correct and
+ meaningful over a time period. They help you get an overview of the stage of a system over time.
+ They are not meant to give you precise numbers of a discrete event.
+
+ If you need a higher level of accuracy, use another monitoring tool, such as
+ [logs](https://about.gitlab.com/handbook/engineering/monitoring/#logs).
+ Read the following examples for more explanations.
+- All the rate metrics' units are `requests per second`. The default aggregate time frame is 1 minute.
+
+ For example, a panel shows the requests per second number at `2020-12-25 00:42:00` to be `34.13`.
+ It means at the minute 42 (from `2020-12-25 00:42:00` to `2020-12-25 00:42:59` ), there are
+ approximately `34.13 * 60 = ~ 2047` requests processed by the web servers.
+- You might encounter some gotchas related to decimal fraction and rounding up frequently, especially
+ in low-traffic cases. For example, the error rate of `RepositoryUpdateMirrorWorker` at
+ `2020-12-25 02:04:00` is `0.07`, equivalent to `4.2` jobs per minute. The raw result is
+ `0.06666666667`, equivalent to 4 jobs per minute.
+- All the rate metrics are more accurate when the data is big enough. The default floating-point
+ precision is 2. In some extremely low panels, you can see `0.00`, even though there is still some
+ real traffic.
+
+To inspect the raw data of the panel for further calculation, select **Inspect** from the dropdown
+list of a panel. Queries, raw data, and panel JSON structure are available.
+Read more at [Grafana panel inspection](https://grafana.com/docs/grafana/latest/panels/inspect-panel/).
+
+All the dashboards are powered by [Grafana](https://grafana.com/), a frontend for displaying metrics.
+Grafana consumes the data returned from queries to backend Prometheus data source, then presents it
+with visualizations. The stage group dashboards are built to serve the most common use cases with a
+limited set of filters and pre-built queries. Grafana provides a way to explore and visualize the
+metrics data with [Grafana Explore](https://grafana.com/docs/grafana/latest/explore/). This requires
+some knowledge of the [Prometheus PromQL query language](https://prometheus.io/docs/prometheus/latest/querying/basics/).
+
+## Example: Debugging with dashboards
+
+Example debugging workflow:
+
+1. A team member in the Code Review group has merged an MR which got deployed to production.
+1. To verify the deployment, you can check the
+ [Code Review group's dashboard](https://dashboards.gitlab.net/d/stage-groups-code_review/stage-groups-group-dashboard-create-code-review?orgId=1).
+1. Sidekiq Error Rate panel shows an elevated error rate, specifically `UpdateMergeRequestsWorker`.
+
+ ![Debug 1](img/stage_group_dashboards_debug_1.png)
+
+1. If you select **Kibana: Kibana Sidekiq failed request logs** in the **Extra links** section, you can filter for `UpdateMergeRequestsWorker` and read through the logs.
+
+ ![Debug 2](img/stage_group_dashboards_debug_2.png)
+
+1. With [Sentry](https://sentry.gitlab.net/gitlab/gitlabcom/) you can find the exception where you
+ can filter by transaction type and `correlation_id` from Kibana's result item.
+
+ ![Debug 3](img/stage_group_dashboards_debug_3.png)
+
+1. A precise exception, including a stack trace, job arguments, and other information should now appear.
+
+Happy debugging!
+
+## Customizing the dashboard
+
+All Grafana dashboards at GitLab are generated from the [Jsonnet files](https://github.com/grafana/grafonnet-lib)
+stored in [the runbooks project](https://gitlab.com/gitlab-com/runbooks/-/tree/master/dashboards).
+Particularly, the stage group dashboards definitions are stored in
+[`/dashboards/stage-groups`](https://gitlab.com/gitlab-com/runbooks/-/tree/master/dashboards/stage-groups).
+
+By convention, each group has a corresponding Jsonnet file. The dashboards are synced with GitLab
+[stage group data](https://gitlab.com/gitlab-com/www-gitlab-com/-/raw/master/data/stages.yml) every
+month.
+
+Expansion and customization are one of the key principles used when we designed this system.
+To customize your group's dashboard, edit the corresponding file and follow the
+[Runbook workflow](https://gitlab.com/gitlab-com/runbooks/-/tree/master/dashboards#dashboard-source).
+The dashboard is updated after the MR is merged.
+
+Looking at an autogenerated file, for example,
+[`product_planning.dashboard.jsonnet`](https://gitlab.com/gitlab-com/runbooks/-/blob/master/dashboards/stage-groups/product_planning.dashboard.jsonnet):
+
+```jsonnet
+// This file is autogenerated using scripts/update_stage_groups_dashboards.rb
+// Please feel free to customize this file.
+local stageGroupDashboards = import './stage-group-dashboards.libsonnet';
+
+stageGroupDashboards.dashboard('product_planning')
+.stageGroupDashboardTrailer()
+```
+
+We provide basic customization to filter out the components essential to your group's activities.
+By default, only the `web`, `api`, and `sidekiq` components are available in the dashboard, while
+`git` is hidden. See [how to enable available components and optional graphs](#optional-graphs).
+
+You can also append further information or custom metrics to a dashboard. The following example
+adds some links and a total request rate to the top of the page:
+
+```jsonnet
+local stageGroupDashboards = import './stage-group-dashboards.libsonnet';
+local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
+local basic = import 'grafana/basic.libsonnet';
+
+stageGroupDashboards.dashboard('source_code')
+.addPanel(
+ grafana.text.new(
+ title='Group information',
+ mode='markdown',
+ content=|||
+ Useful link for the Source Code Management group dashboard:
+ - [Issue list](https://gitlab.com/groups/gitlab-org/-/issues?scope=all&state=opened&label_name%5B%5D=repository)
+ - [Epic list](https://gitlab.com/groups/gitlab-org/-/epics?label_name[]=repository)
+ |||,
+ ),
+ gridPos={ x: 0, y: 0, w: 24, h: 4 }
+)
+.addPanel(
+ basic.timeseries(
+ title='Total Request Rate',
+ yAxisLabel='Requests per Second',
+ decimals=2,
+ query=|||
+ sum (
+ rate(gitlab_transaction_duration_seconds_count{
+ env='$environment',
+ environment='$environment',
+ feature_category=~'source_code_management',
+ }[$__interval])
+ )
+ |||
+ ),
+ gridPos={ x: 0, y: 0, w: 24, h: 7 }
+)
+.stageGroupDashboardTrailer()
+```
+
+![Stage Group Dashboard Customization](img/stage_group_dashboards_time_customization.png)
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+If you want to see the workflow in action, we've recorded a pairing session on customizing a dashboard,
+available on [GitLab Unfiltered](https://youtu.be/shEd_eiUjdI).
+
+For deeper customization and more complicated metrics, visit the
+[Grafonnet lib](https://github.com/grafana/grafonnet-lib) project and the
+[GitLab Prometheus Metrics](../../../administration/monitoring/prometheus/gitlab_metrics.md#gitlab-prometheus-metrics)
+documentation.
+
+### Optional graphs
+
+Some graphs aren't relevant for all groups, so they aren't added to
+the dashboard by default. They can be added by customizing the
+dashboard.
+
+By default, only the `web`, `api`, and `sidekiq` metrics are
+shown. If you wish to see the metrics from the `git` fleet (or any
+other component that might be added in the future), you can configure it as follows:
+
+```jsonnet
+stageGroupDashboards
+.dashboard('source_code', components=stageGroupDashboards.supportedComponents)
+.stageGroupDashboardTrailer()
+```
+
+If your group is interested in Sidekiq job durations and their
+thresholds, you can add these graphs by calling the `.addSidekiqJobDurationByUrgency` function:
+
+```jsonnet
+stageGroupDashboards
+.dashboard('access')
+.addSidekiqJobDurationByUrgency()
+.stageGroupDashboardTrailer()
+```
diff --git a/doc/development/img/stage_group_dashboards_error_attribution.png b/doc/development/stage_group_observability/img/stage_group_dashboards_error_attribution.png
index f6ea7c004ac..f6ea7c004ac 100644
--- a/doc/development/img/stage_group_dashboards_error_attribution.png
+++ b/doc/development/stage_group_observability/img/stage_group_dashboards_error_attribution.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_service_sli_detail.png b/doc/development/stage_group_observability/img/stage_group_dashboards_service_sli_detail.png
index 5dc32063709..5dc32063709 100644
--- a/doc/development/img/stage_group_dashboards_service_sli_detail.png
+++ b/doc/development/stage_group_observability/img/stage_group_dashboards_service_sli_detail.png
Binary files differ
diff --git a/doc/development/stage_group_observability/index.md b/doc/development/stage_group_observability/index.md
new file mode 100644
index 00000000000..868e55735e8
--- /dev/null
+++ b/doc/development/stage_group_observability/index.md
@@ -0,0 +1,138 @@
+---
+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
+---
+
+# Observability for stage groups
+
+Observability is about bringing visibility into a system to see and
+understand the state of each component, with context, to support
+performance tuning and debugging. To run a SaaS platform at scale, a
+rich and detailed observability platform is needed.
+
+To make information available to [stage groups](https://about.gitlab.com/handbook/product/categories/#hierarchy),
+we are aggregating metrics by feature category and then show
+this information on [dashboards](dashboards/index.md) tailored to the groups. Only metrics
+for the features built by the group are visible on their
+dashboards.
+
+With a filtered view, groups can discover bugs and performance regressions that could otherwise
+be missed when viewing aggregated data.
+
+For more specific information on dashboards, see:
+
+- [Dashboards](dashboards/index.md): a general overview of where to find dashboards
+ and how to use them.
+- [Stage group dashboard](dashboards/stage_group_dashboard.md): how to use and customize the stage group dashboard.
+- [Error budget detail](dashboards/error_budget_detail.md): how to explore error budget over time.
+
+## Error budget
+
+The error budget is calculated from the same [Service Level Indicators](https://en.wikipedia.org/wiki/Service_level_indicator) (SLIs)
+that we use to monitor GitLab.com. The 28-day availability number for a
+stage group is comparable to the
+[monthly availability](https://about.gitlab.com/handbook/engineering/infrastructure/performance-indicators/#gitlabcom-availability)
+we calculate for GitLab.com, except it's scoped to the features of a group.
+
+To learn more about how we use error budgets, see the
+[Engineering Error Budgets](https://about.gitlab.com/handbook/engineering/error-budgets/) handbook page.
+
+By default, the first row of panels on both dashboards shows the
+[error budget for the stage group](https://about.gitlab.com/handbook/engineering/error-budgets/#budget-spend-by-stage-group).
+This row shows how features owned by the group contribute to our
+[overall availability](https://about.gitlab.com/handbook/engineering/infrastructure/performance-indicators/#gitlabcom-availability).
+
+The official budget is aggregated over the 28 days. You can see it on the
+[stage group dashboard](dashboards/stage_group_dashboard.md).
+The [error budget detail dashboard](dashboards/error_budget_detail.md)
+allows customizing the range.
+
+We show the information in two formats:
+
+- Availability: this number can be compared to GitLab.com overall
+ availability target of 99.95% uptime.
+- Budget Spent: time over the past 28 days that features owned by the group have not been performing
+ adequately.
+
+The budget is calculated based on indicators per component. Each
+component can have two indicators:
+
+- [Apdex](https://en.wikipedia.org/wiki/Apdex): the rate of operations that performed adequately.
+
+ The threshold for "performing adequately" is stored in our
+ [metrics catalog](https://gitlab.com/gitlab-com/runbooks/-/tree/master/metrics-catalog)
+ and depends on the service in question. For the Puma (Rails) component of the
+ [API](https://gitlab.com/gitlab-com/runbooks/-/blob/f22f40b2c2eab37d85e23ccac45e658b2c914445/metrics-catalog/services/api.jsonnet#L127),
+ [Git](https://gitlab.com/gitlab-com/runbooks/-/blob/f22f40b2c2eab37d85e23ccac45e658b2c914445/metrics-catalog/services/git.jsonnet#L216),
+ and
+ [Web](https://gitlab.com/gitlab-com/runbooks/-/blob/f22f40b2c2eab37d85e23ccac45e658b2c914445/metrics-catalog/services/web.jsonnet#L154)
+ services, that threshold is **5 seconds** when not opted in to the
+ [`rails_requests` SLI](../application_slis/rails_request_apdex.md).
+
+ We've made this target configurable in [this project](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/525).
+ To learn how to customize the request Apdex, see
+ [Rails request Apdex SLI](../application_slis/rails_request_apdex.md).
+ This new Apdex measurement is not part of the error budget until you
+ [opt in](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1451).
+
+ For Sidekiq job execution, the threshold depends on the
+ [job urgency](../sidekiq/worker_attributes.md#job-urgency). It is
+ [currently](https://gitlab.com/gitlab-com/runbooks/-/blob/f22f40b2c2eab37d85e23ccac45e658b2c914445/metrics-catalog/services/lib/sidekiq-helpers.libsonnet#L25-38)
+ **10 seconds** for high-urgency jobs and **5 minutes** for other jobs.
+
+ Some stage groups might have more services. The thresholds for them are also in the metrics catalog.
+
+- Error rate: The rate of operations that had errors.
+
+The calculation of the ratio happens as follows:
+
+```math
+\frac {operations\_meeting\_apdex + (total\_operations - operations\_with\_errors)} {total\_apdex\_measurements + total\_operations}
+```
+
+## Check where budget is being spent
+
+Both the [stage group dashboard](dashboards/stage_group_dashboard.md)
+and the [error budget detail dashboard](dashboards/error_budget_detail.md)
+show panels to see where the error budget was spent. The stage group
+dashboard always shows a fixed 28 days. The error budget detail
+dashboard allows drilling down to the SLIs over time.
+
+The row below the error budget row is collapsed by default. Expanding
+it shows which component and violation type had the most offending
+operations in the past 28 days.
+
+![Error attribution](img/stage_group_dashboards_error_attribution.png)
+
+The first panel on the left shows a table with the number of errors per
+component. Digging into the first row in that table has
+the biggest impact on the budget spent.
+
+Commonly, the components that spend most of the budget are Sidekiq or Puma. The panel in
+the center explains what different violation types mean and how to dig
+deeper in the logs.
+
+The panel on the right provides links to Kibana that should reveal
+which endpoints or Sidekiq jobs are causing the errors.
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+To learn how to use these panels and logs for
+determining which Rails endpoints are slow,
+see the [Error Budget Attribution for Purchase group](https://youtu.be/M9u6unON7bU) video.
+
+Other components visible in the table come from
+[service-level indicators](https://sre.google/sre-book/service-level-objectives/) (SLIs) defined
+in the [metrics catalog](https://gitlab.com/gitlab-com/runbooks/-/blob/master/metrics-catalog/README.md).
+
+For those types of failures, you can follow the link to the service
+dashboard linked from the `type` column. The service dashboard
+contains a row specifically for the SLI that is causing the budget
+spent, with links to logs and a description of what the
+component means.
+
+For example, see the `server` component of the `web-pages` service:
+
+![web-pages-server-component SLI](img/stage_group_dashboards_service_sli_detail.png)
+
+To add more SLIs tailored to specific features, you can use an [Application SLI](../application_slis/index.md).
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index fe0c4c13ba2..7ae49d33e91 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -21,7 +21,7 @@ a level that is difficult to manage.
Test heuristics can help solve this problem. They concisely address many of the common ways bugs
manifest themselves in our code. When designing our tests, take time to review known test heuristics to inform
our test design. We can find some helpful heuristics documented in the Handbook in the
-[Test Engineering](https://about.gitlab.com/handbook/engineering/quality/test-engineering/#test-heuristics) section.
+[Test Engineering](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/test-engineering/#test-heuristics) section.
## RSpec
@@ -404,7 +404,7 @@ click_link _('UI testing docs')
fill_in _('Search projects'), with: 'gitlab' # fill in text input with text
-select _('Last updated'), from: 'Sort by' # select an option from a select input
+select _('Updated date'), from: 'Sort by' # select an option from a select input
check _('Checkbox label')
uncheck _('Checkbox label')
@@ -465,8 +465,8 @@ expect(page).to have_checked_field _('Checkbox label')
expect(page).to have_unchecked_field _('Radio input label')
expect(page).to have_select _('Sort by')
-expect(page).to have_select _('Sort by'), selected: 'Last updated' # assert the option is selected
-expect(page).to have_select _('Sort by'), options: ['Last updated', 'Created date', 'Due date'] # assert an exact list of options
+expect(page).to have_select _('Sort by'), selected: 'Updated date' # assert the option is selected
+expect(page).to have_select _('Sort by'), options: ['Updated date', 'Created date', 'Due date'] # assert an exact list of options
expect(page).to have_select _('Sort by'), with_options: ['Created date', 'Due date'] # assert a partial list of options
expect(page).to have_text _('Some paragraph text.')
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 e0f6cbe632d..bd9896934c7 100644
--- a/doc/development/testing_guide/end_to_end/best_practices.md
+++ b/doc/development/testing_guide/end_to_end/best_practices.md
@@ -279,6 +279,9 @@ When you add a new test that requires administrator access, apply the RSpec meta
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.
+NOTE:
+If the _only_ action in the test that requires administrator access is to toggle a feature flag, please use the `feature_flag` tag instead. More details can be found in [testing with feature flags](feature_flags.md).
+
## Prefer `Commit` resource over `ProjectPush`
In line with [using the API](#prefer-api-over-ui), use a `Commit` resource whenever possible.
diff --git a/doc/development/testing_guide/end_to_end/execution_context_selection.md b/doc/development/testing_guide/end_to_end/execution_context_selection.md
index 0fdcf0c8c3b..0a4c5fcf451 100644
--- a/doc/development/testing_guide/end_to_end/execution_context_selection.md
+++ b/doc/development/testing_guide/end_to_end/execution_context_selection.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Execution context selection
-Some tests are designed to be run against specific environments, or in specific [pipelines](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#scheduled-qa-test-pipelines) or jobs. We can specify the test execution context using the `only` and `except` metadata.
+Some tests are designed to be run against specific environments, or in specific [pipelines](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#scheduled-qa-test-pipelines) or jobs. We can specify the test execution context using the `only` and `except` metadata.
## Available switches
@@ -118,7 +118,7 @@ To run a test tagged with `except` locally, you can either:
Similarly to specifying that a test should only run against a specific environment, it's also possible to quarantine a
test only when it runs against a specific environment. The syntax is exactly the same, except that the `only: { ... }`
-hash is nested in the [`quarantine: { ... }`](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantining-tests) hash.
+hash is nested in the [`quarantine: { ... }`](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#quarantining-tests) hash.
For example, `quarantine: { only: { subdomain: :staging } }` only quarantines the test when run against `staging`.
The quarantine feature can be explicitly disabled with the `DISABLE_QUARANTINE` environment variable. This can be useful when running tests locally.
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 c3e3f117c2b..47ebef37a4d 100644
--- a/doc/development/testing_guide/end_to_end/feature_flags.md
+++ b/doc/development/testing_guide/end_to_end/feature_flags.md
@@ -14,19 +14,45 @@ automatically authenticates as an administrator as long as you provide an approp
token via `GITLAB_QA_ADMIN_ACCESS_TOKEN` (recommended), or provide `GITLAB_ADMIN_USERNAME`
and `GITLAB_ADMIN_PASSWORD`.
-Please be sure to include the tag `:requires_admin` so that the test can be skipped in environments
-where administrator access is not available.
+## `feature_flag` RSpec tag
-WARNING:
-You are strongly advised to [enable feature flags only for a group, project, user](../../feature_flags/index.md#feature-actors),
-or [feature group](../../feature_flags/index.md#feature-groups). This makes it possible to
-test a feature in a shared environment without affecting other users.
+Please be sure to include the `feature_flag` tag so that the test can be skipped on the appropriate environments.
-For example, the code below would enable a feature flag named `:feature_flag_name` for the project
+**Optional metadata:**
+
+`name`
+
+- Format: `feature_flag: { name: 'feature_flag_name' }`
+- Used only for informational purposes at this time. It should be included to help quickly determine what
+feature flag is under test.
+
+`scope`
+
+- Format: `feature_flag: { name: 'feature_flag_name', scope: :project }`
+- When `scope` is set to `:global`, the test will be **skipped on all live .com environments**. This is to avoid issues with feature flag changes affecting other tests or users on that environment.
+- When `scope` is set to any other value (such as `:project`, `:group` or `:user`), or if no `scope` is specified, the test will only be **skipped on canary and production**.
+This is due to the fact that admin access is not available there.
+
+**WARNING:** You are strongly advised to first try and [enable feature flags only for a group, project, user](../../feature_flags/index.md#feature-actors),
+or [feature group](../../feature_flags/index.md#feature-groups).
+
+- If a global feature flag must be used, it is strongly recommended to apply `scope: :global` to the `feature_flag` metadata. This is, however, left up to the SET's discretion to determine the level of risk.
+ - For example, a test uses a global feature flag that only affects a small area of the application and is also needed to check for critical issues on live environments.
+ In such a scenario, it would be riskier to skip running the test. For cases like this, `scope` can be left out of the metadata so that it can still run in live environments
+ with admin access, such as staging.
+
+**Note on `requires_admin`:** This tag should still be applied if there are other actions within the test that require admin access that are unrelated to updating a
+feature flag (ex: creating a user via the API).
+
+The code below would enable a feature flag named `:feature_flag_name` for the project
created by the test:
```ruby
-RSpec.describe "with feature flag enabled", :requires_admin do
+RSpec.describe "with feature flag enabled", feature_flag: {
+ name: 'feature_flag_name',
+ scope: :project
+ } do
+
let(:project) { Resource::Project.fabricate_via_api! }
before do
@@ -162,7 +188,7 @@ for details.
## Confirming that end-to-end tests pass with a feature flag enabled
-End-to-end tests should pass with a feature flag enabled before it is enabled on Staging or on GitLab.com. Tests that need to be updated should be identified as part of [quad-planning](https://about.gitlab.com/handbook/engineering/quality/quad-planning/). The relevant [counterpart Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors) is responsible for updating the tests or assisting another engineer to do so. However, if a change does not go through quad-planning and a required test update is not made, test failures could block deployment.
+End-to-end tests should pass with a feature flag enabled before it is enabled on Staging or on GitLab.com. Tests that need to be updated should be identified as part of [quad-planning](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/quad-planning/). The relevant [counterpart Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors) is responsible for updating the tests or assisting another engineer to do so. However, if a change does not go through quad-planning and a required test update is not made, test failures could block deployment.
### Automatic test execution when a feature flag definition changes
diff --git a/doc/development/testing_guide/end_to_end/index.md b/doc/development/testing_guide/end_to_end/index.md
index dc989acbdcc..1e7cba9d247 100644
--- a/doc/development/testing_guide/end_to_end/index.md
+++ b/doc/development/testing_guide/end_to_end/index.md
@@ -135,7 +135,7 @@ The [existing scenarios](https://gitlab.com/gitlab-org/gitlab-qa/blob/master/doc
that run in the downstream `gitlab-qa-mirror` pipeline include many tests, but there are times when you might want to run a
test or a group of tests that are different than the groups in any of the existing scenarios.
-For example, when we [dequarantine](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#dequarantining-tests)
+For example, when we [dequarantine](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#dequarantining-tests)
a flaky test we first want to make sure that it's no longer flaky.
We can do that using the `ce:custom-parallel` and `ee:custom-parallel` jobs.
Both are manual jobs that you can configure using custom variables.
@@ -281,6 +281,7 @@ Continued reading:
- [Flows](flows.md)
- [RSpec metadata/tags](rspec_metadata_tests.md)
- [Execution context selection](execution_context_selection.md)
+- [Troubleshooting](troubleshooting.md)
## Where can I ask for help?
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 f9b505a8271..45161404c73 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
@@ -11,41 +11,42 @@ This is a partial list of the [RSpec metadata](https://relishapp.com/rspec/rspec
<!-- Please keep the tags in alphabetical order -->
-| Tag | Description |
-|-----|-------------|
-| `:elasticsearch` | The test requires an Elasticsearch service. It is used by the [instance-level scenario](https://gitlab.com/gitlab-org/gitlab-qa#definitions) [`Test::Integration::Elasticsearch`](https://gitlab.com/gitlab-org/gitlab/-/blob/72b62b51bdf513e2936301cb6c7c91ec27c35b4d/qa/qa/ee/scenario/test/integration/elasticsearch.rb) to include only tests that require Elasticsearch. |
-| `:except` | The test is to be run in their typical execution contexts _except_ as specified. See [test execution context selection](execution_context_selection.md) for more information. |
-| `:geo` | The test requires two GitLab Geo instances - a primary and a secondary - to be spun up. |
-| `:gitaly_cluster` | The test runs against a GitLab instance where repositories are stored on redundant Gitaly nodes behind a Praefect node. All nodes are [separate containers](../../../administration/gitaly/praefect.md#requirements). Tests that use this tag have a longer setup time since there are three additional containers that need to be started. |
-| `:github` | The test requires a GitHub personal access token. |
-| `:group_saml` | The test requires a GitLab instance that has SAML SSO enabled at the group level. Interacts with an external SAML identity provider. Paired with the `:orchestrated` tag. |
-| `:instance_saml` | The test requires a GitLab instance that has SAML SSO enabled at the instance level. Interacts with an external SAML identity provider. Paired with the `:orchestrated` tag. |
-| `:integrations` | This aims to test the available [integrations](../../../user/project/integrations/overview.md#integrations-listing). The test requires Docker to be installed in the run context. It will provision the containers and can be run against a local instance or using the `gitlab-qa` scenario `Test::Integration::Integrations` |
-| `:service_ping_disabled` | The test interacts with the GitLab configuration service ping at the instance level to turn admin setting service ping checkbox on or off. This tag will have the test run only in the `service_ping_disabled` job and must be paired with the `:orchestrated` and `:requires_admin` tags. |
-| `:jira` | The test requires a Jira Server. [GitLab-QA](https://gitlab.com/gitlab-org/gitlab-qa) provisions the Jira Server in a Docker container when the `Test::Integration::Jira` test scenario is run.
-| `:kubernetes` | The test includes a GitLab instance that is configured to be run behind an SSH tunnel, allowing a TLS-accessible GitLab. This test also includes provisioning of at least one Kubernetes cluster to test against. _This tag is often be paired with `:orchestrated`._ |
-| `:ldap_no_server` | The test requires a GitLab instance to be configured to use LDAP. To be used with the `:orchestrated` tag. It does not spin up an LDAP server at orchestration time. Instead, it creates the LDAP server at runtime. |
-| `: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). |
-| `:packages` | The test requires a GitLab instance that has the [Package Registry](../../../administration/packages/#gitlab-package-registry-administration) enabled. |
-| `:quarantine` | The test has been [quarantined](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantining-tests), runs in a separate job that only includes quarantined tests, and is allowed to fail. The test is skipped in its regular job so that if it fails it doesn't hold up the pipeline. Note that you can also [quarantine a test only when it runs in a specific context](execution_context_selection.md#quarantine-a-test-for-a-specific-environment). |
-| `:relative_url` | The test requires a GitLab instance to be installed under a [relative URL](../../../install/relative_url.md). |
-| `:reliable` | The test has been [promoted to a reliable test](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/reliable-tests/#promoting-an-existing-test-to-reliable) meaning it passes consistently in all pipelines, including merge requests. |
-| `: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 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. |
-| `:skip_live_env` | The test is excluded when run against live deployed environments such as Staging, Canary, and Production. |
-| `:skip_fips_env` | The test is excluded when run against an environment in FIPS mode. |
-| `:skip_signup_disabled` | The test uses UI to sign up a new user and is skipped in any environment that does not allow new user registration via the UI. |
-| `:smoke` | The test belongs to the test suite which verifies basic functionality of a GitLab instance.|
-| `:smtp` | The test requires a GitLab instance to be configured to use an SMTP server. Tests SMTP notification email delivery from GitLab by using MailHog. |
-| `:testcase` | The link to the test case issue in the [GitLab Project Test Cases](https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases). |
-| `:transient` | The test tests transient bugs. It is excluded by default. |
-| `:issue`, `:issue_${num}` | Optional links to issues which might be related to the spec. Helps keep track of related issues and can also be used by tools that create test reports. Currently added automatically to `Allure` test report. Multiple tags can be used by adding an optional numeric suffix like `issue_1`, `issue_2` etc. |
+| Tag | Description |
+|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `:elasticsearch` | The test requires an Elasticsearch service. It is used by the [instance-level scenario](https://gitlab.com/gitlab-org/gitlab-qa#definitions) [`Test::Integration::Elasticsearch`](https://gitlab.com/gitlab-org/gitlab/-/blob/72b62b51bdf513e2936301cb6c7c91ec27c35b4d/qa/qa/ee/scenario/test/integration/elasticsearch.rb) to include only tests that require Elasticsearch. |
+| `:except` | The test is to be run in their typical execution contexts _except_ as specified. See [test execution context selection](execution_context_selection.md) for more information. |
+| `:feature_flag` | The test uses a feature flag and therefore requires an administrator account to run. When `scope` is set to `:global`, the test will be skipped on all live .com environments. Otherwise, it will be skipped only on Canary and Production. See [testing with feature flags](../../../development/testing_guide/end_to_end/feature_flags.md) for more details. |
+| `:geo` | The test requires two GitLab Geo instances - a primary and a secondary - to be spun up. |
+| `:gitaly_cluster` | The test runs against a GitLab instance where repositories are stored on redundant Gitaly nodes behind a Praefect node. All nodes are [separate containers](../../../administration/gitaly/praefect.md#requirements). Tests that use this tag have a longer setup time since there are three additional containers that need to be started. |
+| `:github` | The test requires a GitHub personal access token. |
+| `:group_saml` | The test requires a GitLab instance that has SAML SSO enabled at the group level. Interacts with an external SAML identity provider. Paired with the `:orchestrated` tag. |
+| `:instance_saml` | The test requires a GitLab instance that has SAML SSO enabled at the instance level. Interacts with an external SAML identity provider. Paired with the `:orchestrated` tag. |
+| `:integrations` | This aims to test the available [integrations](../../../user/project/integrations/overview.md#integrations-listing). The test requires Docker to be installed in the run context. It will provision the containers and can be run against a local instance or using the `gitlab-qa` scenario `Test::Integration::Integrations` |
+| `:service_ping_disabled` | The test interacts with the GitLab configuration service ping at the instance level to turn admin setting service ping checkbox on or off. This tag will have the test run only in the `service_ping_disabled` job and must be paired with the `:orchestrated` and `:requires_admin` tags. |
+| `:jira` | The test requires a Jira Server. [GitLab-QA](https://gitlab.com/gitlab-org/gitlab-qa) provisions the Jira Server in a Docker container when the `Test::Integration::Jira` test scenario is run. |
+| `:kubernetes` | The test includes a GitLab instance that is configured to be run behind an SSH tunnel, allowing a TLS-accessible GitLab. This test also includes provisioning of at least one Kubernetes cluster to test against. _This tag is often be paired with `:orchestrated`._ |
+| `:ldap_no_server` | The test requires a GitLab instance to be configured to use LDAP. To be used with the `:orchestrated` tag. It does not spin up an LDAP server at orchestration time. Instead, it creates the LDAP server at runtime. |
+| `: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). |
+| `:packages` | The test requires a GitLab instance that has the [Package Registry](../../../administration/packages/#gitlab-package-registry-administration) enabled. |
+| `:quarantine` | The test has been [quarantined](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#quarantining-tests), runs in a separate job that only includes quarantined tests, and is allowed to fail. The test is skipped in its regular job so that if it fails it doesn't hold up the pipeline. Note that you can also [quarantine a test only when it runs in a specific context](execution_context_selection.md#quarantine-a-test-for-a-specific-environment). |
+| `:relative_url` | The test requires a GitLab instance to be installed under a [relative URL](../../../install/relative_url.md). |
+| `:reliable` | The test has been [promoted to a reliable test](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/reliable-tests/#promoting-an-existing-test-to-reliable) meaning it passes consistently in all pipelines, including merge requests. |
+| `: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 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. |
+| `:skip_live_env` | The test is excluded when run against live deployed environments such as Staging, Canary, and Production. |
+| `:skip_fips_env` | The test is excluded when run against an environment in FIPS mode. |
+| `:skip_signup_disabled` | The test uses UI to sign up a new user and is skipped in any environment that does not allow new user registration via the UI. |
+| `:smoke` | The test belongs to the test suite which verifies basic functionality of a GitLab instance. |
+| `:smtp` | The test requires a GitLab instance to be configured to use an SMTP server. Tests SMTP notification email delivery from GitLab by using MailHog. |
+| `:testcase` | The link to the test case issue in the [GitLab Project Test Cases](https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases). |
+| `:transient` | The test tests transient bugs. It is excluded by default. |
+| `:issue`, `:issue_${num}` | Optional links to issues which might be related to the spec. Helps keep track of related issues and can also be used by tools that create test reports. Currently added automatically to `Allure` test report. Multiple tags can be used by adding an optional numeric suffix like `issue_1`, `issue_2` etc. |
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 49a9124253d..599e1104b72 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
@@ -299,7 +299,7 @@ Geo requires an EE license. To visit the Geo sites in your browser, you need a r
#### Notes
-- You can find the full image address from a pipeline by [following these instructions](https://about.gitlab.com/handbook/engineering/quality/guidelines/tips-and-tricks/#running-gitlab-qa-pipeline-against-a-specific-gitlab-release). You might be prompted to set the `GITLAB_QA_ACCESS_TOKEN` variable if you specify the full image address.
+- You can find the full image address from a pipeline by [following these instructions](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/tips-and-tricks/#running-gitlab-qa-pipeline-against-a-specific-gitlab-release). You might be prompted to set the `GITLAB_QA_ACCESS_TOKEN` variable if you specify the full image address.
- You can increase the wait time for replication by setting `GEO_MAX_FILE_REPLICATION_TIME` and `GEO_MAX_DB_REPLICATION_TIME`. The default is 120 seconds.
- To save time during tests, create a Personal Access Token with API access on the Geo primary node, and pass that value in as `GITLAB_QA_ACCESS_TOKEN` and `GITLAB_QA_ADMIN_ACCESS_TOKEN`.
@@ -395,7 +395,7 @@ Tests that are tagged with `:mobile` can be run against specified mobile devices
Running directly against an environment like staging is not recommended because Sauce Labs test logs expose credentials. Therefore, it is best practice and the default to use a tunnel.
-For tunnel installation instructions, read [Sauce Connect Proxy Installation](https://docs.saucelabs.com/secure-connections/sauce-connect/installation). To start the tunnel, after following the installation above, copy the run command in Sauce Labs > Tunnels (must be logged in to Sauce Labs with the credentials found in 1Password) and run in terminal.
+For tunnel installation instructions, read [Sauce Connect Proxy Installation](https://docs.saucelabs.com/secure-connections/sauce-connect/installation/index.html). To start the tunnel, after following the installation above, copy the run command in Sauce Labs > Tunnels (must be logged in to Sauce Labs with the credentials found in 1Password) and run in terminal.
NOTE:
It is highly recommended to use `GITLAB_QA_ACCESS_TOKEN` to speed up tests and reduce flakiness.
diff --git a/doc/development/testing_guide/end_to_end/troubleshooting.md b/doc/development/testing_guide/end_to_end/troubleshooting.md
new file mode 100644
index 00000000000..951fb056a4c
--- /dev/null
+++ b/doc/development/testing_guide/end_to_end/troubleshooting.md
@@ -0,0 +1,69 @@
+---
+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
+---
+
+# Troubleshooting end-to-end tests
+
+## See what the browser is doing
+
+If end-to-end tests fail, it can be very helpful to see what is happening in your
+browser when it fails. For example, if tests don't run at all, the test framework
+might be trying to open a URL that isn't valid on your machine. This problem becomes
+clearer if you see the page fail in the browser.
+
+To make the test framework show the browser as it runs the tests,
+set `WEBDRIVER_HEADLESS=false`. For example:
+
+```shell
+cd gitlab/qa
+WEBDRIVER_HEADLESS=false bundle exec bin/qa Test::Instance::All http://localhost:3000
+```
+
+## Enable logging
+
+Sometimes a test might fail and the failure stack trace doesn't provide enough
+information to determine what went wrong. You can get more information by enabling
+debug logs by setting `QA_DEBUG=true`, to see what the test framework is attempting.
+For example:
+
+```shell
+cd gitlab/qa
+QA_DEBUG=true bundle exec bin/qa Test::Instance::All http://localhost:3000
+```
+
+The test framework then outputs many logs showing the actions taken during
+the tests:
+
+```plaintext
+[date=2022-03-31 23:19:47 from=QA Tests] INFO -- Starting test: Create Merge request creation from fork can merge feature branch fork to mainline
+[date=2022-03-31 23:19:49 from=QA Tests] DEBUG -- has_element? :login_page (wait: 0) returned: true
+[date=2022-03-31 23:19:52 from=QA Tests] DEBUG -- filling :login_field with "root"
+[date=2022-03-31 23:19:52 from=QA Tests] DEBUG -- filling :password_field with "*****"
+[date=2022-03-31 23:19:52 from=QA Tests] DEBUG -- clicking :sign_in_button
+```
+
+## Tests don't run at all
+
+This section assumes you're running the tests locally (such as the GDK) and you're doing
+so from the `gitlab/qa/` folder, not from `gitlab-qa`. For example, if you receive a
+`Net::ReadTimeout` error, the browser might be unable to load the specified URL:
+
+```shell
+cd gitlab/qa
+bundle exec bin/qa Test::Instance::All http://localhost:3000
+
+bundler: failed to load command: bin/qa (bin/qa)
+Net::ReadTimeout: Net::ReadTimeout with #<TCPSocket:(closed)>
+```
+
+This error can happen if GitLab runs on an address that does not resolve from
+`localhost`. For example, if you set GDK's `hostname`
+[to a specific local IP address](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/run_qa_against_gdk.md#run-qa-tests-against-your-gdk-setup),
+you must use that IP address instead of `localhost` in the command.
+For example, if your IP is `192.168.0.12`:
+
+```shell
+bundle exec bin/qa Test::Instance::All http://192.168.0.12:3000
+```
diff --git a/doc/development/testing_guide/review_apps.md b/doc/development/testing_guide/review_apps.md
index 27d5ae70ed7..f5483a4b79c 100644
--- a/doc/development/testing_guide/review_apps.md
+++ b/doc/development/testing_guide/review_apps.md
@@ -172,8 +172,6 @@ subgraph "CNG-mirror pipeline"
them in its [registry](https://gitlab.com/gitlab-org/build/CNG-mirror/container_registry).
- We use the [`CNG-mirror`](https://gitlab.com/gitlab-org/build/CNG-mirror) project so that the `CNG`, (Cloud
Native GitLab), project's registry is not overloaded with a lot of transient Docker images.
- - Note that the official CNG images are built by the `cloud-native-image`
- job, which runs only for tags, and triggers itself a [`CNG`](https://gitlab.com/gitlab-org/build/CNG) pipeline.
1. Once `review-build-cng` is done, the [`review-deploy`](https://gitlab.com/gitlab-org/gitlab/-/jobs/467724810) job
deploys the Review App using [the official GitLab Helm chart](https://gitlab.com/gitlab-org/charts/gitlab/) to
the [`review-apps`](https://console.cloud.google.com/kubernetes/clusters/details/us-central1-b/review-apps?project=gitlab-review-apps)
@@ -224,14 +222,10 @@ If you need your Review App to stay up for a longer time, you can
`review-deploy` job to update the "latest deployed at" time.
The `review-cleanup` job that automatically runs in scheduled
-pipelines (and is manual in merge request) stops stale Review Apps after 5 days,
+pipelines stops stale Review Apps after 5 days,
deletes their environment after 6 days, and cleans up any dangling Helm releases
and Kubernetes resources after 7 days.
-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.
-
## Cluster configuration
The cluster is configured via Terraform in the [`engineering-productivity-infrastructure`](https://gitlab.com/gitlab-org/quality/engineering-productivity-infrastructure) project.
@@ -254,189 +248,7 @@ Leading indicators may be health check failures leading to restarts or majority
The [Review Apps Overview dashboard](https://console.cloud.google.com/monitoring/classic/dashboards/6798952013815386466?project=gitlab-review-apps&timeDomain=1d)
aids in identifying load spikes on the cluster, and if nodes are problematic or the entire cluster is trending towards unhealthy.
-### Database related errors in `review-deploy`, `review-qa-smoke`, or `review-qa-reliable`
-
-Occasionally the state of a Review App's database could diverge from the database schema. This could be caused by
-changes to migration files or schema, such as a migration being renamed or deleted. This typically manifests in migration errors such as:
-
-- migration job failing with a column that already exists
-- migration job failing with a column that does not exist
-
-To recover from this, please attempt to [redeploy Review App from a clean slate](#redeploy-review-app-from-a-clean-slate)
-
-### Release failed with `ImagePullBackOff`
-
-**Potential cause:**
-
-If you see an `ImagePullBackoff` status, check for a missing Docker image.
-
-**Where to look for further debugging:**
-
-To check that the Docker images were created, run the following Docker command:
-
-```shell
-`DOCKER_CLI_EXPERIMENTAL=enabled docker manifest repository:tag`
-```
-
-The output of this command indicates if the Docker image exists. For example:
-
-```shell
-DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect registry.gitlab.com/gitlab-org/build/cng-mirror/gitlab-rails-ee:39467-allow-a-release-s-associated-milestones-to-be-edited-thro
-```
-
-If the Docker image does not exist:
-
-- Verify the `image.repository` and `image.tag` options in the `helm upgrade --install` command match the repository names used by CNG-mirror pipeline.
-- Look further in the corresponding downstream CNG-mirror pipeline in `review-build-cng` job.
-
-### Node count is always increasing (never stabilizing or decreasing)
-
-**Potential cause:**
-
-That could be a sign that the `review-cleanup` job is
-failing to cleanup stale Review Apps and Kubernetes resources.
-
-**Where to look for further debugging:**
-
-Look at the latest `review-cleanup` job log, and identify look for any
-unexpected failure.
-
-### p99 CPU utilization is at 100% for most of the nodes and/or many components
-
-**Potential cause:**
-
-This could be a sign that Helm is failing to deploy Review Apps. When Helm has a
-lot of `FAILED` releases, it seems that the CPU utilization is increasing, probably
-due to Helm or Kubernetes trying to recreate the components.
-
-**Where to look for further debugging:**
-
-Look at a recent `review-deploy` job log.
-
-**Useful commands:**
-
-```shell
-# Identify if node spikes are common or load on specific nodes which may get rebalanced by the Kubernetes scheduler
-kubectl top nodes | sort --key 3 --numeric
-
-# Identify pods under heavy CPU load
-kubectl top pods | sort --key 2 --numeric
-```
-
-### The `logging/user/events/FailedMount` chart is going up
-
-**Potential cause:**
-
-This could be a sign that there are too many stale secrets and/or configuration maps.
-
-**Where to look for further debugging:**
-
-Look at [the list of Configurations](https://console.cloud.google.com/kubernetes/config?project=gitlab-review-apps)
-or `kubectl get secret,cm --sort-by='{.metadata.creationTimestamp}' | grep 'review-'`.
-
-Any secrets or configuration maps older than 5 days are suspect and should be deleted.
-
-**Useful commands:**
-
-```shell
-# List secrets and config maps ordered by created date
-kubectl get secret,cm --sort-by='{.metadata.creationTimestamp}' | grep 'review-'
-
-# Delete all secrets that are 5 to 9 days old
-kubectl get secret --sort-by='{.metadata.creationTimestamp}' | grep '^review-' | grep '[5-9]d$' | cut -d' ' -f1 | xargs kubectl delete secret
-
-# Delete all secrets that are 10 to 99 days old
-kubectl get secret --sort-by='{.metadata.creationTimestamp}' | grep '^review-' | grep '[1-9][0-9]d$' | cut -d' ' -f1 | xargs kubectl delete secret
-
-# Delete all config maps that are 5 to 9 days old
-kubectl get cm --sort-by='{.metadata.creationTimestamp}' | grep 'review-' | grep -v 'dns-gitlab-review-app' | grep '[5-9]d$' | cut -d' ' -f1 | xargs kubectl delete cm
-
-# Delete all config maps that are 10 to 99 days old
-kubectl get cm --sort-by='{.metadata.creationTimestamp}' | grep 'review-' | grep -v 'dns-gitlab-review-app' | grep '[1-9][0-9]d$' | cut -d' ' -f1 | xargs kubectl delete cm
-```
-
-### Using K9s
-
-[K9s](https://github.com/derailed/k9s) is a powerful command line dashboard which allows you to filter by labels. This can help identify trends with apps exceeding the [review-app resource requests](https://gitlab.com/gitlab-org/gitlab/-/blob/master/scripts/review_apps/base-config.yaml). Kubernetes schedules pods to nodes based on resource requests and allow for CPU usage up to the limits.
-
-- In K9s you can sort or add filters by typing the `/` character
- - `-lrelease=<review-app-slug>` - filters down to all pods for a release. This aids in determining what is having issues in a single deployment
- - `-lapp=<app>` - filters down to all pods for a specific app. This aids in determining resource usage by app.
-- You can scroll to a Kubernetes resource and hit `d`(describe), `s`(shell), `l`(logs) for a deeper inspection
-
-![K9s](img/k9s.png)
-
-### Troubleshoot a pending `dns-gitlab-review-app-external-dns` Deployment
-
-#### Finding the problem
-
-[In the past](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62834), it happened
-that the `dns-gitlab-review-app-external-dns` Deployment was in a pending state,
-effectively preventing all the Review Apps from getting a DNS record assigned,
-making them unreachable via domain name.
-
-This in turn prevented other components of the Review App to properly start
-(for example, `gitlab-runner`).
-
-After some digging, we found that new mounts fail when performed
-with transient scopes (for example, pods) of `systemd-mount`:
-
-```plaintext
-MountVolume.SetUp failed for volume "dns-gitlab-review-app-external-dns-token-sj5jm" : mount failed: exit status 1
-Mounting command: systemd-run
-Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/06add1c3-87b4-11e9-80a9-42010a800107/volumes/kubernetes.io~secret/dns-gitlab-review-app-external-dns-token-sj5jm --scope -- mount -t tmpfs tmpfs /var/lib/kubelet/pods/06add1c3-87b4-11e9-80a9-42010a800107/volumes/kubernetes.io~secret/dns-gitlab-review-app-external-dns-token-sj5jm
-Output: Failed to start transient scope unit: Connection timed out
-```
-
-This probably happened because the GitLab chart creates 67 resources, leading to
-a lot of mount points being created on the underlying GCP node.
-
-The [underlying issue seems to be a `systemd` bug](https://github.com/kubernetes/kubernetes/issues/57345#issuecomment-359068048)
-that was fixed in `systemd` `v237`. Unfortunately, our GCP nodes are currently
-using `v232`.
-
-For the record, the debugging steps to find out this issue were:
-
-1. Switch kubectl context to `review-apps-ce` (we recommend using [`kubectx`](https://github.com/ahmetb/kubectx/))
-1. `kubectl get pods | grep dns`
-1. `kubectl describe pod <pod name>` & confirm exact error message
-1. Web search for exact error message, following rabbit hole to [a relevant Kubernetes bug report](https://github.com/kubernetes/kubernetes/issues/57345)
-1. Access the node over SSH via the GCP console (**Computer Engine > VM
- instances** then click the "SSH" button for the node where the `dns-gitlab-review-app-external-dns` pod runs)
-1. In the node: `systemctl --version` => `systemd 232`
-1. Gather some more information:
- - `mount | grep kube | wc -l` (returns a count, for example, 290)
- - `systemctl list-units --all | grep -i var-lib-kube | wc -l` (returns a count, for example, 142)
-1. Check how many pods are in a bad state:
- - Get all pods running a given node: `kubectl get pods --field-selector=spec.nodeName=NODE_NAME`
- - Get all the `Running` pods on a given node: `kubectl get pods --field-selector=spec.nodeName=NODE_NAME | grep Running`
- - Get all the pods in a bad state on a given node: `kubectl get pods --field-selector=spec.nodeName=NODE_NAME | grep -v 'Running' | grep -v 'Completed'`
-
-#### Solving the problem
-
-To resolve the problem, we needed to (forcibly) drain some nodes:
-
-1. Try a normal drain on the node where the `dns-gitlab-review-app-external-dns`
- pod runs so that Kubernetes automatically move it to another node: `kubectl drain NODE_NAME`
-1. If that doesn't work, you can also perform a forcible "drain" the node by removing all pods: `kubectl delete pods --field-selector=spec.nodeName=NODE_NAME`
-1. In the node:
- - Perform `systemctl daemon-reload` to remove the dead/inactive units
- - If that doesn't solve the problem, perform a hard reboot: `sudo systemctl reboot`
-1. Uncordon any cordoned nodes: `kubectl uncordon NODE_NAME`
-
-In parallel, since most Review Apps were in a broken state, we deleted them to
-clean up the list of non-`Running` pods.
-Following is a command to delete Review Apps based on their last deployment date
-(current date was June 6th at the time) with
-
-```shell
-helm ls -d | grep "Jun 4" | cut -f1 | xargs helm delete --purge
-```
-
-#### Mitigation steps taken to avoid this problem in the future
-
-We've created a new node pool with smaller machines to reduce the risk
-that a machine reaches the "too many mount points" problem in the future.
+See the [review apps page of the Engineering Productivity Runbook](https://gitlab.com/gitlab-org/quality/engineering-productivity/team/-/blob/main/runbook/review-apps.md) for troubleshooting review app releases.
## Frequently Asked Questions
diff --git a/doc/development/workhorse/channel.md b/doc/development/workhorse/channel.md
new file mode 100644
index 00000000000..33d7cc63f00
--- /dev/null
+++ b/doc/development/workhorse/channel.md
@@ -0,0 +1,201 @@
+---
+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
+---
+
+# Websocket channel support for Workhorse
+
+In some cases, GitLab can provide the following through a WebSocket:
+
+- In-browser terminal access to an environment: a running server or container,
+ onto which a project has been deployed.
+- Access to services running in CI.
+
+Workhorse manages the WebSocket upgrade and long-lived connection to the websocket
+connection, which frees up GitLab to process other requests. This document outlines
+the architecture of these connections.
+
+## Introduction to WebSockets
+
+Websockets are an "upgraded" `HTTP/1.1` request. They permit bidirectional
+communication between a client and a server. **Websockets are not HTTP**.
+Clients can send messages (known as frames) to the server at any time, and
+vice versa. Client messages are not necessarily requests, and server messages are
+not necessarily responses. WebSocket URLs have schemes like `ws://` (unencrypted) or
+`wss://` (TLS-secured).
+
+When requesting an upgrade to WebSocket, the browser sends a `HTTP/1.1`
+request like this:
+
+```plaintext
+GET /path.ws HTTP/1.1
+Connection: upgrade
+Upgrade: websocket
+Sec-WebSocket-Protocol: terminal.gitlab.com
+# More headers, including security measures
+```
+
+At this point, the connection is still HTTP, so this is a request.
+The server can send a normal HTTP response, such as `404 Not Found` or
+`500 Internal Server Error`.
+
+If the server decides to permit the upgrade, it sends a HTTP
+`101 Switching Protocols` response. From this point, the connection is no longer
+HTTP. It is now a WebSocket and frames, not HTTP requests, flow over it. The connection
+persists until the client or server closes the connection.
+
+In addition to the sub-protocol, individual websocket frames may
+also specify a message type, such as:
+
+- `BinaryMessage`
+- `TextMessage`
+- `Ping`
+- `Pong`
+- `Close`
+
+Only binary frames can contain arbitrary data. The frames are expected to be valid
+UTF-8 strings, in addition to any sub-protocol expectations.
+
+## Browser to Workhorse
+
+Using the terminal as an example:
+
+1. GitLab serves a JavaScript terminal emulator to the browser on a URL like
+ `https://gitlab.com/group/project/-/environments/1/terminal`.
+1. This URL opens a websocket connection to
+ `wss://gitlab.com/group/project/-/environments/1/terminal.ws`.
+ This endpoint exists only in Workhorse, and doesn't exist in GitLab.
+1. When receiving the connection, Workhorse first performs a `preauthentication`
+ request to GitLab to confirm the client is authorized to access the requested terminal:
+ - If the client has the appropriate permissions and the terminal exists, GitLab
+ responds with a successful response that includes details of the terminal
+ the client should be connected to.
+ - Otherwise, Workhorse returns an appropriate HTTP error response.
+1. If GitLab returns valid terminal details to Workhorse, it:
+ 1. Connects to the specified terminal.
+ 1. Upgrades the browser to a WebSocket.
+ 1. Proxies between the two connections for as long as the browser's credentials are valid.
+ 1. Send regular `PingMessage` control frames to the browser, to prevent intervening
+ proxies from terminating the connection while the browser is present.
+
+The browser must request an upgrade with a specific sub-protocol:
+
+- [`terminal.gitlab.com`](#terminalgitlabcom)
+- [`base64.terminal.gitlab.com`](#base64terminalgitlabcom)
+
+### `terminal.gitlab.com`
+
+This sub-protocol considers `TextMessage` frames to be invalid. Control frames,
+such as `PingMessage` or `CloseMessage`, have their usual meanings.
+
+- `BinaryMessage` frames sent from the browser to the server are
+ arbitrary text input.
+- `BinaryMessage` frames sent from the server to the browser are
+ arbitrary text output.
+
+These frames are expected to contain ANSI text control codes
+and may be in any encoding.
+
+### `base64.terminal.gitlab.com`
+
+This sub-protocol considers `BinaryMessage` frames to be invalid.
+Control frames, such as `PingMessage` or `CloseMessage`, have
+their usual meanings.
+
+- `TextMessage` frames sent from the browser to the server are
+ base64-encoded arbitrary text input. The server must
+ base64-decode them before inputting them.
+- `TextMessage` frames sent from the server to the browser are
+ base64-encoded arbitrary text output. The browser must
+ base64-decode them before outputting them.
+
+In their base64-encoded form, these frames are expected to
+contain ANSI terminal control codes, and may be in any encoding.
+
+## Workhorse to GitLab
+
+Using the terminal as an example, before upgrading the browser,
+Workhorse sends a normal HTTP request to GitLab on a URL like
+`https://gitlab.com/group/project/environments/1/terminal.ws/authorize`.
+This returns a JSON response containing details of where the
+terminal can be found, and how to connect it. In particular,
+the following details are returned in case of success:
+
+- WebSocket URL to connect** to, such as `wss://example.com/terminals/1.ws?tty=1`.
+- WebSocket sub-protocols to support, such as `["channel.k8s.io"]`.
+- Headers to send, such as `Authorization: Token xxyyz`.
+- Optional. Certificate authority to verify `wss` connections with.
+
+Workhorse periodically rechecks this endpoint. If it receives an error response,
+or the details of the terminal change, it terminates the websocket session.
+
+## Workhorse to the WebSocket server
+
+In GitLab, environments or CI jobs may have a deployment service (like
+`KubernetesService`) associated with them. This service knows
+where the terminals or the service for an environment may be found, and GitLab
+returns these details to Workhorse.
+
+These URLs are also WebSocket URLs. GitLab tells Workhorse which sub-protocols to
+speak over the connection, along with any authentication details required by the
+remote end.
+
+Before upgrading the browser's connection to a websocket, Workhorse:
+
+1. Opens a HTTP client connection, according to the details given to it by Workhorse.
+1. Attempts to upgrade that connection to a websocket.
+ - If it fails, an error response is sent to the browser.
+ - If it succeeds, the browser is also upgraded.
+
+Workhorse now has two websocket connections, albeit with differing sub-protocols,
+and then:
+
+- Decodes incoming frames from the browser, re-encodes them to the channel's
+ sub-protocol, and sends them to the channel.
+- Decodes incoming frames from the channel, re-encodes them to the browser's
+ sub-protocol, and sends them to the browser.
+
+When either connection closes or enters an error state, Workhorse detects the error
+and closes the other connection, terminating the channel session. If the browser
+is the connection that has disconnected, Workhorse sends an ANSI `End of Transmission`
+control code (the `0x04` byte) to the channel, encoded according to the appropriate
+sub-protocol. To avoid being disconnected, Workhorse replies to any websocket ping
+frame sent by the channel.
+
+Workhorse only supports the following sub-protocols:
+
+- [`channel.k8s.io`](#channelk8sio)
+- [`base64.channel.k8s.io`](#base64channelk8sio)
+
+Supporting new deployment services requires new sub-protocols to be supported.
+
+### `channel.k8s.io`
+
+Used by Kubernetes, this sub-protocol defines a simple multiplexed channel.
+
+Control frames have their usual meanings. `TextMessage` frames are
+invalid. `BinaryMessage` frames represent I/O to a specific file
+descriptor.
+
+The first byte of each `BinaryMessage` frame represents the file
+descriptor (`fd`) number, as a `uint8`. For example:
+
+- `0x00` corresponds to `fd 0`, `STDIN`.
+- `0x01` corresponds to `fd 1`, `STDOUT`.
+
+The remaining bytes represent arbitrary data. For frames received
+from the server, they are bytes that have been received from that
+`fd`. For frames sent to the server, they are bytes that should be
+written to that `fd`.
+
+### `base64.channel.k8s.io`
+
+Also used by Kubernetes, this sub-protocol defines a similar multiplexed
+channel to `channel.k8s.io`. The main differences are:
+
+- `TextMessage` frames are valid, rather than `BinaryMessage` frames.
+- The first byte of each `TextMessage` frame represents the file
+ descriptor as a numeric UTF-8 character, so the character `U+0030`,
+ or "0", is `fd 0`, `STDIN`.
+- The remaining bytes represent base64-encoded arbitrary data.
diff --git a/doc/development/workhorse/configuration.md b/doc/development/workhorse/configuration.md
new file mode 100644
index 00000000000..7f9331e6f1e
--- /dev/null
+++ b/doc/development/workhorse/configuration.md
@@ -0,0 +1,218 @@
+---
+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
+---
+
+# Workhorse configuration
+
+For historical reasons, Workhorse uses:
+
+- Command line flags.
+- A configuration file.
+- Environment variables.
+
+Add any new Workhorse configuration options into the configuration file.
+
+## CLI options
+
+```plaintext
+ gitlab-workhorse [OPTIONS]
+
+Options:
+ -apiCiLongPollingDuration duration
+ Long polling duration for job requesting for runners (default 50ns)
+ -apiLimit uint
+ Number of API requests allowed at single time
+ -apiQueueDuration duration
+ Maximum queueing duration of requests (default 30s)
+ -apiQueueLimit uint
+ Number of API requests allowed to be queued
+ -authBackend string
+ Authentication/authorization backend (default "http://localhost:8080")
+ -authSocket string
+ Optional: Unix domain socket to dial authBackend at
+ -cableBackend string
+ Optional: ActionCable backend (default authBackend)
+ -cableSocket string
+ Optional: Unix domain socket to dial cableBackend at (default authSocket)
+ -config string
+ TOML file to load config from
+ -developmentMode
+ Allow the assets to be served from Rails app
+ -documentRoot string
+ Path to static files content (default "public")
+ -listenAddr string
+ Listen address for HTTP server (default "localhost:8181")
+ -listenNetwork string
+ Listen 'network' (tcp, tcp4, tcp6, unix) (default "tcp")
+ -listenUmask int
+ Umask for Unix socket
+ -logFile string
+ Log file location
+ -logFormat string
+ Log format to use defaults to text (text, json, structured, none) (default "text")
+ -pprofListenAddr string
+ pprof listening address, e.g. 'localhost:6060'
+ -prometheusListenAddr string
+ Prometheus listening address, e.g. 'localhost:9229'
+ -proxyHeadersTimeout duration
+ How long to wait for response headers when proxying the request (default 5m0s)
+ -secretPath string
+ File with secret key to authenticate with authBackend (default "./.gitlab_workhorse_secret")
+ -version
+ Print version and exit
+```
+
+The 'auth backend' refers to the GitLab Rails application. The name is
+a holdover from when GitLab Workhorse only handled `git push` and `git pull` over
+HTTP.
+
+GitLab Workhorse can listen on either a TCP or a Unix domain socket. It
+can also open a second listening TCP listening socket with the Go
+[`net/http/pprof` profiler server](http://golang.org/pkg/net/http/pprof/).
+
+GitLab Workhorse can listen on Redis build and runner registration events if you
+pass a valid TOML configuration file through the `-config` flag.
+A regular setup it only requires the following (replacing the string
+with the actual socket)
+
+## Redis
+
+GitLab Workhorse integrates with Redis to do long polling for CI build
+requests. To configure it:
+
+- Configure Redis settings in the TOML configuration file.
+- Control polling behavior for CI build requests with the `-apiCiLongPollingDuration`
+ command-line flag.
+
+You can enable Redis in the configuration file while leaving CI polling
+disabled. This configuration results in an idle Redis Pub/Sub connection. The
+opposite is not possible: CI long polling requires a correct Redis configuration.
+
+For example, the `[redis]` section in the configuration file could contain:
+
+```plaintext
+[redis]
+URL = "unix:///var/run/gitlab/redis.sock"
+Password = "my_awesome_password"
+Sentinel = [ "tcp://sentinel1:23456", "tcp://sentinel2:23456" ]
+SentinelMaster = "mymaster"
+```
+
+- `URL` - A string in the format `unix://path/to/redis.sock` or `tcp://host:port`.
+- `Password` - Required only if your Redis instance is password-protected.
+- `Sentinel` - Required if you use Sentinel.
+
+If both `Sentinel` and `URL` are given, only `Sentinel` is used.
+
+Optional fields:
+
+```plaintext
+[redis]
+DB = 0
+MaxIdle = 1
+MaxActive = 1
+```
+
+- `DB` - The database to connect to. Defaults to `0`.
+- `MaxIdle` - How many idle connections can be in the Redis pool at once. Defaults to `1`.
+- `MaxActive` - How many connections the pool can keep. Defaults to `1`.
+
+## Relative URL support
+
+If you mount GitLab at a relative URL, like `example.com/gitlab`), use this
+relative URL in the `authBackend` setting:
+
+```plaintext
+gitlab-workhorse -authBackend http://localhost:8080/gitlab
+```
+
+## Interaction of authBackend and authSocket
+
+The interaction between `authBackend` and `authSocket` can be confusing.
+If `authSocket` is set, it overrides the host portion of `authBackend`, but not
+the relative path.
+
+In table form:
+
+| authBackend | authSocket | Workhorse connects to | Rails relative URL |
+|--------------------------------|-------------------|-----------------------|--------------------|
+| unset | unset | `localhost:8080` | `/` |
+| `http://localhost:3000` | unset | `localhost:3000` | `/` |
+| `http://localhost:3000/gitlab` | unset | `localhost:3000` | `/gitlab` |
+| unset | `/path/to/socket` | `/path/to/socket` | `/` |
+| `http://localhost:3000` | `/path/to/socket` | `/path/to/socket` | `/` |
+| `http://localhost:3000/gitlab` | `/path/to/socket` | `/path/to/socket` | `/gitlab` |
+
+The same applies to `cableBackend` and `cableSocket`.
+
+## Error tracking
+
+GitLab-Workhorse supports remote error tracking with [Sentry](https://sentry.io).
+To enable this feature, set the `GITLAB_WORKHORSE_SENTRY_DSN` environment variable.
+You can also set the `GITLAB_WORKHORSE_SENTRY_ENVIRONMENT` environment variable to
+use the Sentry environment feature to separate staging, production and
+development.
+
+Omnibus GitLab (`/etc/gitlab/gitlab.rb`):
+
+```ruby
+gitlab_workhorse['env'] = {
+ 'GITLAB_WORKHORSE_SENTRY_DSN' => 'https://foobar'
+ 'GITLAB_WORKHORSE_SENTRY_ENVIRONMENT' => 'production'
+}
+```
+
+Source installations (`/etc/default/gitlab`):
+
+```plaintext
+export GITLAB_WORKHORSE_SENTRY_DSN='https://foobar'
+export GITLAB_WORKHORSE_SENTRY_ENVIRONMENT='production'
+```
+
+## Distributed tracing
+
+Workhorse supports distributed tracing through [LabKit](https://gitlab.com/gitlab-org/labkit/)
+using [OpenTracing APIs](https://opentracing.io).
+
+By default, no tracing implementation is linked into the binary. You can link in
+different OpenTracing providers with [build tags](https://golang.org/pkg/go/build/#hdr-Build_Constraints)
+or build constraints by setting the `BUILD_TAGS` make variable.
+
+For more details of the supported providers, refer to LabKit. For an example of
+Jaeger tracing support, include the tags: `BUILD_TAGS="tracer_static tracer_static_jaeger"` like this:
+
+```shell
+make BUILD_TAGS="tracer_static tracer_static_jaeger"
+```
+
+After you compile Workhorse with an OpenTracing provider, configure the tracing
+configuration with the `GITLAB_TRACING` environment variable, like this:
+
+```shell
+GITLAB_TRACING=opentracing://jaeger ./gitlab-workhorse
+```
+
+## Continuous profiling
+
+Workhorse supports continuous profiling through [LabKit](https://gitlab.com/gitlab-org/labkit/)
+using [Stackdriver Profiler](https://cloud.google.com/profiler). By default, the
+Stackdriver Profiler implementation is linked in the binary using
+[build tags](https://golang.org/pkg/go/build/#hdr-Build_Constraints), though it's not
+required and can be skipped. For example:
+
+```shell
+make BUILD_TAGS=""
+```
+
+After you compile Workhorse with continuous profiling, set the profiler configuration
+with the `GITLAB_CONTINUOUS_PROFILING` environment variable. For example:
+
+```shell
+GITLAB_CONTINUOUS_PROFILING="stackdriver?service=workhorse&service_version=1.0.1&project_id=test-123 ./gitlab-workhorse"
+```
+
+## Related topics
+
+- [LabKit monitoring documentation](https://gitlab.com/gitlab-org/labkit/-/blob/master/monitoring/doc.go).
diff --git a/doc/development/workhorse/gitlab_features.md b/doc/development/workhorse/gitlab_features.md
new file mode 100644
index 00000000000..2aa8d9d2399
--- /dev/null
+++ b/doc/development/workhorse/gitlab_features.md
@@ -0,0 +1,73 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Features that rely on Workhorse
+
+Workhorse itself is not a feature, but there are several features in
+GitLab that would not work efficiently without Workhorse.
+
+To put the efficiency benefit in context, consider that in 2020Q3 on
+GitLab.com [we see](https://thanos-query.ops.gitlab.net/graph?g0.range_input=1h&g0.max_source_resolution=0s&g0.expr=sum(ruby_process_resident_memory_bytes%7Bapp%3D%22webservice%22%2Cenv%3D%22gprd%22%2Crelease%3D%22gitlab%22%7D)%20%2F%20sum(puma_max_threads%7Bapp%3D%22webservice%22%2Cenv%3D%22gprd%22%2Crelease%3D%22gitlab%22%7D)&g0.tab=1&g1.range_input=1h&g1.max_source_resolution=0s&g1.expr=sum(go_memstats_sys_bytes%7Bapp%3D%22webservice%22%2Cenv%3D%22gprd%22%2Crelease%3D%22gitlab%22%7D)%2Fsum(go_goroutines%7Bapp%3D%22webservice%22%2Cenv%3D%22gprd%22%2Crelease%3D%22gitlab%22%7D)&g1.tab=1)
+Rails application threads using on average
+about 200MB of RSS vs about 200KB for Workhorse goroutines.
+
+Examples of features that rely on Workhorse:
+
+## 1. `git clone` and `git push` over HTTP
+
+Git clone, pull and push are slow because they transfer large amounts
+of data and because each is CPU intensive on the GitLab side. Without
+Workhorse, HTTP access to Git repositories would compete with regular
+web access to the application, requiring us to run way more Rails
+application servers.
+
+## 2. CI runner long polling
+
+GitLab CI runners fetch new CI jobs by polling the GitLab server.
+Workhorse acts as a kind of "waiting room" where CI runners can sit
+and wait for new CI jobs. Because of Go's efficiency we can fit a lot
+of runners in the waiting room at little cost. Without this waiting
+room mechanism we would have to add a lot more Rails server capacity.
+
+## 3. File uploads and downloads
+
+File uploads and downloads may be slow either because the file is
+large or because the user's connection is slow. Workhorse can handle
+the slow part for Rails. This improves the efficiency of features such
+as CI artifacts, package repositories, LFS objects, etc.
+
+## 4. Websocket proxying
+
+Features such as the web terminal require a long lived connection
+between the user's web browser and a container inside GitLab that is
+not directly accessible from the internet. Dedicating a Rails
+application thread to proxying such a connection would cost much more
+memory than it costs to have Workhorse look after it.
+
+## Quick facts (how does Workhorse work)
+
+- Workhorse can handle some requests without involving Rails at all:
+ for example, JavaScript files and CSS files are served straight
+ from disk.
+- Workhorse can modify responses sent by Rails: for example if you use
+ `send_file` in Rails then GitLab Workhorse will open the file on
+ disk and send its contents as the response body to the client.
+- Workhorse can take over requests after asking permission from Rails.
+ Example: handling `git clone`.
+- Workhorse can modify requests before passing them to Rails. Example:
+ when handling a Git LFS upload Workhorse first asks permission from
+ Rails, then it stores the request body in a tempfile, then it sends
+ a modified request containing the tempfile path to Rails.
+- Workhorse can manage long-lived WebSocket connections for Rails.
+ Example: handling the terminal websocket for environments.
+- Workhorse does not connect to PostgreSQL, only to Rails and (optionally) Redis.
+- We assume that all requests that reach Workhorse pass through an
+ upstream proxy such as NGINX or Apache first.
+- Workhorse does not accept HTTPS connections.
+- Workhorse does not clean up idle client connections.
+- We assume that all requests to Rails pass through Workhorse.
+
+For more information see ['A brief history of GitLab Workhorse'](https://about.gitlab.com/2016/04/12/a-brief-history-of-gitlab-workhorse/).
diff --git a/doc/development/workhorse/index.md b/doc/development/workhorse/index.md
new file mode 100644
index 00000000000..f7ca16e0f31
--- /dev/null
+++ b/doc/development/workhorse/index.md
@@ -0,0 +1,84 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# GitLab Workhorse
+
+GitLab Workhorse is a smart reverse proxy for GitLab. It handles
+"large" HTTP requests such as file downloads, file uploads, Git
+push/pull and Git archive downloads.
+
+Workhorse itself is not a feature, but there are [several features in
+GitLab](gitlab_features.md) that would not work efficiently without Workhorse.
+
+The canonical source for Workhorse is
+[`gitlab-org/gitlab/workhorse`](https://gitlab.com/gitlab-org/gitlab/tree/master/workhorse).
+Prior to [epic #4826](https://gitlab.com/groups/gitlab-org/-/epics/4826), it was
+[`gitlab-org/gitlab-workhorse`](https://gitlab.com/gitlab-org/gitlab-workhorse/tree/master),
+but that repository is no longer used for development.
+
+## Install Workhorse
+
+To install GitLab Workhorse you need [Go 1.15 or newer](https://golang.org/dl) and
+[GNU Make](https://www.gnu.org/software/make/).
+
+To install into `/usr/local/bin` run `make install`.
+
+```plaintext
+make install
+```
+
+To install into `/foo/bin` set the PREFIX variable.
+
+```plaintext
+make install PREFIX=/foo
+```
+
+On some operating systems, such as FreeBSD, you may have to use
+`gmake` instead of `make`.
+
+*NOTE*: Some features depends on build tags, make sure to check
+[Workhorse configuration](configuration.md) to enable them.
+
+### Run time dependencies
+
+Workhorse uses [Exiftool](https://www.sno.phy.queensu.ca/~phil/exiftool/) for
+removing EXIF data (which may contain sensitive information) from uploaded
+images. If you installed GitLab:
+
+- Using the Omnibus package, you're all set.
+ *NOTE* that if you are using CentOS Minimal, you may need to install `perl`
+ package: `yum install perl`
+- From source, make sure `exiftool` is installed:
+
+ ```shell
+ # Debian/Ubuntu
+ sudo apt-get install libimage-exiftool-perl
+
+ # RHEL/CentOS
+ sudo yum install perl-Image-ExifTool
+ ```
+
+## Testing your code
+
+Run the tests with:
+
+```plaintext
+make clean test
+```
+
+Each feature in GitLab Workhorse should have an integration test that
+verifies that the feature 'kicks in' on the right requests and leaves
+other requests unaffected. It is better to also have package-level tests
+for specific behavior but the high-level integration tests should have
+the first priority during development.
+
+It is OK if a feature is only covered by integration tests.
+
+<!--
+## License
+
+This code is distributed under the MIT license, see the [LICENSE](LICENSE) file.
+-->
diff --git a/doc/development/workhorse/new_features.md b/doc/development/workhorse/new_features.md
new file mode 100644
index 00000000000..3ad15c1de16
--- /dev/null
+++ b/doc/development/workhorse/new_features.md
@@ -0,0 +1,78 @@
+---
+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
+---
+
+# Adding new features to Workhorse
+
+GitLab Workhorse is a smart reverse proxy for GitLab. It handles
+[long HTTP requests](#what-are-long-requests), such as:
+
+- File downloads.
+- File uploads.
+- Git pushes and pulls.
+- Git archive downloads.
+
+Workhorse itself is not a feature, but [several features in GitLab](gitlab_features.md)
+would not work efficiently without Workhorse.
+
+At a first glance, Workhorse appears to be just a pipeline for processing HTTP
+streams to reduce the amount of logic in your Ruby on Rails controller. However,
+don't treat it that way. Engineers trying to offload a feature to Workhorse often
+find it takes more work than originally anticipated:
+
+- It's a new programming language, and only a few engineers at GitLab are Go developers.
+- Workhorse has demanding requirements:
+ - It's stateless.
+ - Memory and disk usage must be kept under tight control.
+ - The request should not be slowed down in the process.
+
+## Avoid adding new features
+
+We suggest adding new features only if absolutely necessary and no other options exist.
+Splitting a feature between the Rails codebase and Workhorse is a deliberate choice
+to introduce technical debt. It adds complexity to the system, and coupling between
+the two components:
+
+- Building features using Workhorse has a considerable complexity cost, so you should
+ prefer designs based on Rails requests and Sidekiq jobs.
+- Even when using Rails-and-Sidekiq is more work than using Rails-and-Workhorse,
+ Rails-and-Sidekiq is easier to maintain in the long term. Workhorse is unique
+ to GitLab, while Rails-and-Sidekiq is an industry standard.
+- For global behaviors around web requests, consider using a Rack middleware
+ instead of Workhorse.
+- Generally speaking, use Rails-and-Workhorse only if the HTTP client expects
+ behavior reasonable to implement in Rails, like long requests.
+
+## What are long requests?
+
+One order of magnitude exists between Workhorse and Puma RAM usage. Having a connection
+open for longer than milliseconds is problematic due to the amount of RAM
+it monopolizes after it reaches the Ruby on Rails controller. We've identified two classes
+of long requests: data transfers and HTTP long polling. Some examples:
+
+- `git push`.
+- `git pull`.
+- Uploading or downloading an artifact.
+- A CI runner waiting for a new job.
+
+With the rise of cloud-native installations, Workhorse's feature set was extended
+to add object storage direct-upload. This change removed the need for the shared
+Network File System (NFS) drives.
+
+If you still think we should add a new feature to Workhorse, open an issue for the
+Workhorse maintainers and explain:
+
+1. What you want to implement.
+1. Why it can't be implemented in our Ruby codebase.
+
+The Workhorse maintainers can help you assess the situation.
+
+## Related topics
+
+- In 2020, `@nolith` presented the talk
+ ["Speed up the monolith. Building a smart reverse proxy in Go"](https://archive.fosdem.org/2020/schedule/event/speedupmonolith/)
+ at FOSDEM. The talk includes more details on the history of Workhorse and the NFS removal.
+- The [uploads development documentation](../uploads.md) contains the most common
+ use cases for adding a new type of upload.
diff --git a/doc/gitlab-basics/create-branch.md b/doc/gitlab-basics/create-branch.md
index 176189298c8..d22ce12f9cd 100644
--- a/doc/gitlab-basics/create-branch.md
+++ b/doc/gitlab-basics/create-branch.md
@@ -1,19 +1,11 @@
---
-stage: Create
-group: Source Code
-info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: howto
+redirect_to: '../tutorials/make_your_first_git_commit.md'
+remove_date: '2022-06-26'
---
-# How to create a branch **(FREE)**
+This document was moved to [another location](../tutorials/make_your_first_git_commit.md).
-A branch is an independent line of development in a [project](../user/project/index.md).
-
-When you create a branch (in your [terminal](start-using-git.md#create-a-branch) or with
-[the web interface](../user/project/repository/web_editor.md#create-a-new-branch)),
-you are creating a snapshot of a certain branch, usually the main branch,
-at its current state. From there, you can start to make your own changes without
-affecting the main codebase. The history of your changes is tracked in your branch.
-
-When your changes are ready, you then merge them into the rest of the codebase with a
-[merge request](../user/project/merge_requests/creating_merge_requests.md).
+<!-- This redirect file can be deleted after <YYYY-MM-DD>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html --> \ No newline at end of file
diff --git a/doc/gitlab-basics/index.md b/doc/gitlab-basics/index.md
index 5ba5366eafa..3cd5dfe7d18 100644
--- a/doc/gitlab-basics/index.md
+++ b/doc/gitlab-basics/index.md
@@ -1,49 +1,11 @@
---
-stage: Create
-group: Source Code
-info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-comments: false
-type: index
+redirect_to: '../user/index.md'
+remove_date: '2022-07-08'
---
-# GitLab basics guides **(FREE)**
+This document was moved to [another location](../user/index.md).
-This section provides resources to help you start working with GitLab and Git by focusing
-on the basic features that you must use.
-
-This documentation is split into the following groups:
-
-- [GitLab-specific functionality](#gitlab-basics), for basic GitLab features.
-- [General Git functionality](#working-with-git-from-the-command-line), for working
- with Git in conjunction with GitLab.
-
-## GitLab basics
-
-The following are guides to basic GitLab functionality:
-
-- [Create and add your SSH public key](../ssh/index.md), for enabling Git over SSH.
-- [Create a project](../user/project/working_with_projects.md#create-a-project), to start using GitLab.
-- [Create a group](../user/group/index.md#create-a-group), to combine and administer
- projects together.
-- [Create a branch](create-branch.md), to make changes to files stored in a project's repository.
-- [Feature branch workflow](feature_branch_workflow.md).
-- [Fork a project](../user/project/repository/forking_workflow.md#creating-a-fork), to duplicate projects so they can be worked on in parallel.
-- [Add a file](add-file.md), to add new files to a project's repository.
-- [Create an issue](../user/project/issues/managing_issues.md#create-an-issue),
- to start collaborating within a project.
-- [Create a merge request](../user/project/merge_requests/creating_merge_requests.md), to request changes made in a branch
- be merged into a project's repository.
-- See how these features come together in the [GitLab Flow introduction video](https://youtu.be/InKNIvky2KE)
- and [GitLab Flow page](../topics/gitlab_flow.md).
-
-## Working with Git from the command line
-
-If you're familiar with Git on the command line, you can interact with your GitLab
-projects just as you would with any other Git repository.
-
-These resources can help you get further acclimated to working on the command line.
-
-- [Start using Git on the command line](start-using-git.md), for some simple Git commands.
-- [Command line basics](command-line-commands.md), to create and edit files using the command line.
-
-More Git resources are available in the GitLab [Git documentation](../topics/git/index.md).
+<!-- This redirect file can be deleted after 2022-07-08. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/gitlab-basics/start-using-git.md b/doc/gitlab-basics/start-using-git.md
index dfd1f09e297..73a993c0fcf 100644
--- a/doc/gitlab-basics/start-using-git.md
+++ b/doc/gitlab-basics/start-using-git.md
@@ -6,7 +6,7 @@ type: howto, tutorial
description: "Introduction to using Git through the command line."
---
-# Start using Git on the command line **(FREE)**
+# Git on the command line **(FREE)**
[Git](https://git-scm.com/) is an open-source distributed version control system. GitLab is built
on top of Git.
@@ -14,6 +14,9 @@ on top of Git.
You can do many Git operations directly in GitLab. However, the command line is required for advanced tasks,
like fixing complex merge conflicts or rolling back commits.
+If you're new to Git and want to learn by working in your own project,
+[learn how to make your first commit](../tutorials/make_your_first_git_commit.md).
+
For a quick reference of Git commands, download a [Git Cheat Sheet](https://about.gitlab.com/images/press/git-cheat-sheet.pdf).
For more information about the advantages of working with Git and GitLab:
@@ -24,75 +27,7 @@ For more information about the advantages of working with Git and GitLab:
To help you visualize what you're doing locally, you can install a
[Git GUI app](https://git-scm.com/download/gui/).
-## Git terminology
-
-If you're familiar with Git terminology, you might want to skip this section and
-go directly to [prerequisites](#prerequisites).
-
-### Repository
-
-In GitLab, files are stored in a **repository**. A repository is similar to how you
-store files in a folder or directory on your computer.
-
-- A **remote repository** refers to the files in GitLab.
-- A **local copy** refers to the files on your computer.
-
-<!-- vale gitlab.Spelling = NO -->
-<!-- vale gitlab.SubstitutionWarning = NO -->
-Often, the word "repository" is shortened to "repo".
-<!-- vale gitlab.Spelling = YES -->
-<!-- vale gitlab.SubstitutionWarning = YES -->
-
-In GitLab, a repository is contained in a **project**.
-
-### Fork
-
-When you want to contribute to someone else's repository, you make a copy of it.
-This copy is called a [**fork**](../user/project/repository/forking_workflow.md#creating-a-fork).
-The process is called "creating a fork."
-
-When you fork a repo, you create a copy of the project in your own
-[namespace](../user/group/#namespaces). You then have write permissions to modify the project files
-and settings.
-
-For example, you can fork this project, <https://gitlab.com/gitlab-tests/sample-project/>, into your namespace.
-You now have your own copy of the repository. You can view the namespace in the URL, for example
-`https://gitlab.com/your-namespace/sample-project/`.
-Then you can clone the repository to your local machine, work on the files, and submit changes back to the
-original repository.
-
-### Difference between download and clone
-
-To create a copy of a remote repository's files on your computer, you can either
-**download** or **clone** the repository. If you download it, you cannot sync the repository with the
-remote repository on GitLab.
-
-[Cloning](#clone-a-repository) a repository is the same as downloading, except it preserves the Git connection
-with the remote repository. You can then modify the files locally and
-upload the changes to the remote repository on GitLab.
-
-### Pull and push
-
-After you save a local copy of a repository and modify the files on your computer, you can upload the
-changes to GitLab. This is referred to as **pushing** to the remote, because you use the command
-[`git push`](#send-changes-to-gitlabcom).
-
-When the remote repository changes, your local copy is behind. You can update your local copy with the new
-changes in the remote repository.
-This is referred to as **pulling** from the remote, because you use the command
-[`git pull`](#download-the-latest-changes-in-the-project).
-
-## Prerequisites
-
-To start using GitLab with Git, complete the following tasks:
-
-- Create and sign in to a GitLab account.
-- [Open a terminal](#open-a-terminal).
-- [Install Git](#install-git) on your computer.
-- [Configure Git](#configure-git).
-- [Choose a repository](#choose-a-repository).
-
-### Open a terminal
+## Choose a terminal
To execute Git commands on your computer, you must open a terminal (also known as command
prompt, command shell, and command line). Here are some options:
@@ -107,9 +42,9 @@ prompt, command shell, and command line). Here are some options:
- For Linux users:
- Built-in [Linux Terminal](https://ubuntu.com/tutorials/command-line-for-beginners#3-opening-a-terminal).
-### Install Git
+## Confirm Git is installed
-Determine if Git is already installed on your computer by opening a terminal
+You can determine if Git is already installed on your computer by opening a terminal
and running this command:
```shell
@@ -123,9 +58,8 @@ git version X.Y.Z
```
If your computer doesn't recognize `git` as a command, you must [install Git](../topics/git/how_to_install_git/index.md).
-After you install Git, run `git --version` to confirm that it installed correctly.
-### Configure Git
+## Configure Git
To start using Git from your computer, you must enter your credentials
to identify yourself as the author of your work. The username and email address
@@ -156,7 +90,7 @@ should match the ones you use in GitLab.
You can read more on how Git manages configurations in the
[Git configuration documentation](https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration).
-### Choose a repository
+## Choose a repository
Before you begin, choose the repository you want to work in. You can use any project you have permission to
access on GitLab.com or any other GitLab instance.
@@ -182,7 +116,7 @@ This connection requires you to add credentials. You can either use SSH or HTTPS
Clone with SSH when you want to authenticate only one time.
-1. Authenticate with GitLab by following the instructions in the [SSH documentation](../ssh/index.md).
+1. Authenticate with GitLab by following the instructions in the [SSH documentation](../user/ssh.md).
1. Go to your project's landing page and select **Clone**. Copy the URL for **Clone with SSH**.
1. Open a terminal and go to the directory where you want to clone the files. Git automatically creates a folder with the repository name and downloads the files there.
1. Run this command:
diff --git a/doc/index.md b/doc/index.md
index 57eb9e195ff..2f3bfefe819 100644
--- a/doc/index.md
+++ b/doc/index.md
@@ -32,7 +32,7 @@ No matter how you use GitLab, we have documentation for you.
| Essential documentation | Essential documentation |
|:------------------------|:------------------------|
| [**User documentation**](user/index.md)<br>Discover features and concepts for GitLab users. | [**Administrator documentation**](administration/index.md)<br/>Everything GitLab self-managed administrators need to know. |
-| [**Contributing to GitLab**](#contributing-to-gitlab)<br/>At GitLab, everyone can contribute! | [**New to Git and GitLab?**](#new-to-git-and-gitlab)<br/>We have the resources to get you started. |
+| [**Contributing to GitLab**](#contributing-to-gitlab)<br/>At GitLab, everyone can contribute! | [**New to Git and GitLab?**](tutorials/index.md)<br/>We have the resources to get you started. |
| [**Build an integration with GitLab**](#build-an-integration-with-gitlab)<br/>Consult our integration documentation. | [**Coming to GitLab from another platform?**](#coming-to-gitlab-from-another-platform)<br/>Consult our guides. |
| [**Install GitLab**](https://about.gitlab.com/install/)<br/>Installation options for different platforms. | [**Customers**](subscriptions/index.md)<br/>Information for new and existing customers. |
| [**Update GitLab**](update/index.md)<br/>Update your GitLab self-managed instance to the latest version. | [**Reference Architectures**](administration/reference_architectures/index.md)<br/>GitLab reference architectures. |
@@ -64,20 +64,6 @@ GitLab makes the software lifecycle faster and radically improves the speed of b
GitLab provides solutions for [each of the stages of the DevOps lifecycle](https://about.gitlab.com/stages-devops-lifecycle/).
-## New to Git and GitLab?
-
-Working with new systems can be daunting.
-
-We have the following documentation to rapidly uplift your GitLab knowledge:
-
-| Topic | Description |
-|:--------------------------------------------------------------------------------------------------|:------------|
-| [GitLab basics guides](gitlab-basics/index.md) | Start working on the command line and with GitLab. |
-| [What is GitLab Flow?](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/) | Enhance your workflow with the best of GitLab Flow. |
-| [Get started with GitLab CI/CD](ci/quick_start/index.md) | Quickly implement GitLab CI/CD. |
-| [Auto DevOps](topics/autodevops/index.md) | Learn more about Auto DevOps in GitLab. |
-| [GitLab Markdown](user/markdown.md) | Advanced formatting system (GitLab Flavored Markdown). |
-
### User account
Learn more about GitLab account management:
@@ -89,16 +75,6 @@ Learn more about GitLab account management:
| [User settings](user/profile/index.md#access-your-user-settings) | Manage your user settings, two factor authentication, and more. |
| [User permissions](user/permissions.md) | Learn what each role in a project can do. |
-### Git and GitLab
-
-Learn more about using Git, and using Git with GitLab:
-
-| Topic | Description |
-|:-----------------------------------------------------------------------------|:------------|
-| [Git](topics/git/index.md) | Getting started with Git, branching strategies, Git LFS, and advanced use. |
-| [Git cheat sheet](https://about.gitlab.com/images/press/git-cheat-sheet.pdf) | Download a PDF describing the most used Git operations. |
-| [GitLab Flow](topics/gitlab_flow.md) | Explore the best of Git with the GitLab Flow strategy. |
-
## Coming to GitLab from another platform
If you are coming to GitLab from another platform, the following information is useful:
diff --git a/doc/install/aws/manual_install_aws.md b/doc/install/aws/manual_install_aws.md
index b0e71cbc77e..8b827d05b57 100644
--- a/doc/install/aws/manual_install_aws.md
+++ b/doc/install/aws/manual_install_aws.md
@@ -299,8 +299,8 @@ The steps for doing this vary depending on which registrar you use and is beyond
## PostgreSQL with RDS
-For our database server we will use Amazon RDS which offers Multi AZ
-for redundancy. First we'll create a security group and subnet group, then we'll
+For our database server we will use Amazon RDS for PostgreSQL which offers Multi AZ
+for redundancy (Aurora is **not** supported). First we'll create a security group and subnet group, then we'll
create the actual RDS instance.
### RDS Security Group
diff --git a/doc/install/azure/index.md b/doc/install/azure/index.md
index 06518ff58de..780dfe17dac 100644
--- a/doc/install/azure/index.md
+++ b/doc/install/azure/index.md
@@ -71,7 +71,7 @@ The first items you need to configure are the basic settings of the underlying v
the user Azure uses to connect to the VM through SSH. By default, the user
has root access.
1. Determine if you want to provide your own SSH key or let Azure create one for you.
- Read the [SSH documentation](../../ssh/index.md) to learn more about how to set up SSH
+ Read the [SSH documentation](../../user/ssh.md) to learn more about how to set up SSH
public keys.
Review your entered settings, and then proceed to the Disks tab.
diff --git a/doc/install/cloud_native/index.md b/doc/install/cloud_native/index.md
new file mode 100644
index 00000000000..45d484b045a
--- /dev/null
+++ b/doc/install/cloud_native/index.md
@@ -0,0 +1,51 @@
+---
+stage: Enablement
+group: Distribution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+comments: false
+description: Install GitLab in a cloud native environment
+type: index
+---
+
+# Cloud Native GitLab **(FREE SELF)**
+
+[Cloud Native GitLab](https://gitlab.com/gitlab-org/build/CNG) provides cloud
+native containers to deploy GitLab. These containers may be deployed and managed
+via Helm using GitLab Charts or GitLab Operator on Kubernetes, OpenShift,
+and Kubernetes compatible container platforms:
+
+- [Helm charts](https://docs.gitlab.com/charts/): The cloud native Helm chart
+ installs GitLab and all of its components on Kubernetes. Use this method if
+ your infrastructure is built on Kubernetes and you're familiar with how it
+ works. The methods for management, observability, and some concepts are
+ different than traditional deployments.
+- [GitLab Operator](https://docs.gitlab.com/operator/): The GitLab Operator
+ provides an installation and management method for GitLab following the
+ [Kubernetes Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/).
+ You can also use the GitLab Operator to run GitLab in an
+ [OpenShift](../openshift_and_gitlab/index.md) environment.
+
+Here's an overview of how the containers are built:
+
+```mermaid
+graph TD
+ subgraph Code
+ CNG --> HC
+ CNG --> GOP
+ HC --> GOP
+ end
+
+ subgraph Deploy
+ GOP --> K8s
+ GOP --> OS
+ CNG --> DC
+ HC --> K8s
+ end
+
+ CNG[Cloud Native GitLab containers]
+ HC[Helm Chart]
+ K8s(Kubernetes)
+ GOP[GitLab Operator]
+ OS(OpenShift)
+ DC(Docker Compose)
+```
diff --git a/doc/install/index.md b/doc/install/index.md
index b27d3683cd5..deb94031e44 100644
--- a/doc/install/index.md
+++ b/doc/install/index.md
@@ -29,10 +29,10 @@ install GitLab:
|----------------------------------------------------------------|-------------|----------------|
| [Linux package](https://docs.gitlab.com/omnibus/installation/) | The official deb/rpm packages (also known as Omnibus GitLab) that contains a bundle of GitLab and the components it depends on, including PostgreSQL, Redis, and Sidekiq. | This method is recommended for getting started. The Linux packages are mature, scalable, and are used today on GitLab.com. If you need additional flexibility and resilience, we recommend deploying GitLab as described in the [reference architecture documentation](../administration/reference_architectures/index.md). |
| [Helm charts](https://docs.gitlab.com/charts/) | The cloud native Helm chart for installing GitLab and all of its components on Kubernetes. | When installing GitLab on Kubernetes, there are some trade-offs that you need to be aware of: <br/>- Administration and troubleshooting requires Kubernetes knowledge.<br/>- It can be more expensive for smaller installations. The default installation requires more resources than a single node Linux package deployment, as most services are deployed in a redundant fashion.<br/><br/> Use this method if your infrastructure is built on Kubernetes and you're familiar with how it works. The methods for management, observability, and some concepts are different than traditional deployments. |
-| [Docker](https://docs.gitlab.com/omnibus/docker/) | The GitLab packages, Dockerized. | Use this method if you're familiar with Docker. |
+| [Docker](docker.md) | The GitLab packages, Dockerized. | Use this method if you're familiar with Docker. |
| [Source](installation.md) | Install GitLab and all of its components from scratch. | Use this method if none of the previous methods are available for your platform. Useful for unsupported systems like \*BSD.|
-| [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/gitlab-environment-toolkit#documentation) | The GitLab Environment toolkit provides a set of automation tools to deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers. | Customers are very welcome to trial and evaluate GET today, however be aware of [key limitations](https://gitlab.com/gitlab-org/gitlab-environment-toolkit#missing-features-to-be-aware-of) of the current iteration. For production environments further manual setup will be required based on your specific requirements. |
-| [GitLab Operator](https://docs.gitlab.com/charts/installation/operator.html) | The GitLab Operator provides an installation and management method for GitLab following the [Kubernetes Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/). | Use the GitLab Operator to run GitLab in an [OpenShift](openshift_and_gitlab/index.md) environment. |
+| [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/gitlab-environment-toolkit#documentation) | The GitLab Environment Toolkit provides a set of automation tools to deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers. | Customers are very welcome to trial and evaluate GET today, however be aware of [key limitations](https://gitlab.com/gitlab-org/gitlab-environment-toolkit#missing-features-to-be-aware-of) of the current iteration. For production environments further manual setup will be required based on your specific requirements. |
+| [GitLab Operator](https://docs.gitlab.com/operator/) | The GitLab Operator provides an installation and management method for GitLab following the [Kubernetes Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/). | Use the GitLab Operator to run GitLab in an [OpenShift](openshift_and_gitlab/index.md) environment. |
## Install GitLab on cloud providers
diff --git a/doc/install/installation.md b/doc/install/installation.md
index 21d1ee84722..c03c600fe0b 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.16` | |
| [Git](#git) | `2.33.x` | From GitLab 14.4, Git 2.33.x and later is required. It's highly recommended that you use the [Git version provided by Gitaly](#git). |
-| [Node.js](#4-node) | `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. |
+| [Node.js](#4-node) | `14.15.0` | GitLab uses [webpack](https://webpack.js.org/) to compile frontend assets. Node.js 16.x is recommended, as it's faster. You can check which version you're running with `node -v`. You need to update it to a newer version if needed. |
## GitLab directory structure
@@ -263,7 +263,7 @@ GitLab requires the use of Node to compile JavaScript
assets, and Yarn to manage JavaScript dependencies. The current minimum
requirements for these are:
-- `node` >= v12.22.1. (We recommend node 14.x as it is faster)
+- `node` >= v14.15.0. (We recommend node 16.x as it is faster)
- `yarn` = v1.22.x (Yarn 2 is not supported yet)
In many distributions,
@@ -271,8 +271,8 @@ the versions provided by the official package repositories are out of date, so
we need to install through the following commands:
```shell
-# install node v14.x
-curl --location "https://deb.nodesource.com/setup_14.x" | sudo bash -
+# install node v16.x
+curl --location "https://deb.nodesource.com/setup_16.x" | sudo bash -
sudo apt-get install -y nodejs
npm install --global yarn
@@ -1121,7 +1121,7 @@ host localhost # Give your setup a name (here: override localhost)
hostname 127.0.0.1; # Your server name or IP
```
-You also need to change the corresponding options (for example, `ssh_user`, `ssh_host`, `admin_uri`) in the `config\gitlab.yml` file.
+You also need to change the corresponding options (for example, `ssh_user`, `ssh_host`, `admin_uri`) in the `config/gitlab.yml` file.
### Additional Markup Styles
diff --git a/doc/install/pivotal/index.md b/doc/install/pivotal/index.md
deleted file mode 100644
index 56dde411884..00000000000
--- a/doc/install/pivotal/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../index.md'
-remove_date: '2022-03-08'
----
-
-This document was removed. For information about installing GitLab, see [this page](../index.md).
-
-<!-- This redirect file can be deleted after <2022-03-08>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index 11f623641c1..8006b886414 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -13,11 +13,11 @@ the minimum requirements needed to install and use GitLab.
### Supported Linux distributions
-- Ubuntu (16.04/18.04/20.04)
-- Debian (9/10)
+- Ubuntu (18.04/20.04)
+- Debian (9/10/11)
- AlmaLinux (8)
- CentOS (7)
-- openSUSE Leap (15.2)
+- openSUSE Leap (15.3)
- SUSE Linux Enterprise Server (12 SP2/12 SP5)
- Red Hat Enterprise Linux (use the AlmaLinux or CentOS instructions)
- Scientific Linux (use the CentOS instructions)
@@ -120,7 +120,7 @@ the following table) as these were used for development and testing:
| GitLab version | Minimum PostgreSQL version |
|----------------|----------------------------|
| 13.0 | 11 |
-| 14.0 | 12 |
+| 14.0 | 12.10 |
You must also ensure the following extensions are loaded into every
GitLab database. [Read more about this requirement, and troubleshooting](postgresql_extensions.md).
diff --git a/doc/integration/alicloud.md b/doc/integration/alicloud.md
new file mode 100644
index 00000000000..85e1e2d4154
--- /dev/null
+++ b/doc/integration/alicloud.md
@@ -0,0 +1,91 @@
+---
+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
+---
+
+# Use AliCloud as an OmniAuth authentication provider **(FREE)**
+
+You can enable the AliCloud OAuth 2.0 OmniAuth provider and sign in to
+GitLab using your AliCloud account.
+
+## Create an AliCloud application
+
+Sign in to the AliCloud platform and create an application on it. AliCloud generates a client ID and secret key for you to use.
+
+1. Sign in to the [AliCloud platform](https://account.aliyun.com/login/login.htm).
+
+1. Go to the [OAuth application management page](https://ram.console.aliyun.com/applications).
+
+1. Select **Create Application**.
+
+1. Fill in the application details:
+
+ - **Application Name**: This can be anything.
+ - **Display Name**: This can be anything.
+ - **Callback URL**: This URL should be formatted as `'GitLab instance URL' + '/users/auth/alicloud/callback'`. For example, `http://test.gitlab.com/users/auth/alicloud/callback`.
+
+ Select **Save**.
+
+1. Add OAuth scopes in the application details page:
+
+ 1. Under the **Application Name** column, select the name of the application you created. The application's details page opens.
+ 1. Under the **Application OAuth Scopes** tab, select **Add OAuth Scopes**.
+ 1. Select the **aliuid** and **profile** checkboxes.
+ 1. Select **OK**.
+
+ ![AliCloud OAuth scope](img/alicloud_scope.png)
+
+1. Create a secret in the application details page:
+
+ 1. Under the **App Secrets** tab, select **Create Secret**.
+ 1. Copy the SecretValue generated.
+
+## Enable AliCloud OAuth in GitLab
+
+1. On your GitLab server, open the configuration file.
+
+ - **For Omnibus installations**
+
+ ```shell
+ sudo editor /etc/gitlab/gitlab.rb
+ ```
+
+ - **For installations from source**
+
+ ```shell
+ cd /home/git/gitlab
+
+ sudo -u git -H editor config/gitlab.yml
+ ```
+
+1. [Configure the initial settings](omniauth.md#configure-initial-settings).
+
+1. Add the provider configuration. Replace `YOUR_APP_ID` with the ID on the application details page
+ and `YOUR_APP_SECRET` with the **SecretValue** you got when you registered the AliCloud application.
+
+ - **For Omnibus installations**
+
+ ```ruby
+ gitlab_rails['omniauth_providers'] = [
+ {
+ name: "alicloud",
+ app_id: "YOUR_APP_ID",
+ app_secret: "YOUR_APP_SECRET"
+ }
+ ]
+ ```
+
+ - **For installations from source**
+
+ ```yaml
+ - { name: 'alicloud',
+ app_id: 'YOUR_APP_ID',
+ app_secret: 'YOUR_APP_SECRET' }
+ ```
+
+1. Save the configuration file.
+
+1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
+ if you installed using Omnibus, or [restart GitLab](../administration/restart_gitlab.md#installations-from-source)
+ if you installed from source.
diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md
index 5265a24d299..5197a191b8e 100644
--- a/doc/integration/elasticsearch.md
+++ b/doc/integration/elasticsearch.md
@@ -982,7 +982,7 @@ There is also an easy way to check it automatically with `sudo gitlab-rake gitla
This exception is seen when your Elasticsearch cluster is configured to reject requests above a certain size (10MiB in this case). This corresponds to the `http.max_content_length` setting in `elasticsearch.yml`. Increase it to a larger size and restart your Elasticsearch cluster.
-AWS has [fixed limits](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/aes-limits.html) for this setting ("Maximum Size of HTTP Request Payloads"), based on the size of the underlying instance.
+AWS has [fixed limits](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/limits.html#network-limits) for this setting ("Maximum size of HTTP request payloads"), based on the size of the underlying instance.
### My single node Elasticsearch cluster status never goes from `yellow` to `green` even though everything seems to be running properly
@@ -1080,6 +1080,12 @@ If `ElasticCommitIndexerWorker` Sidekiq workers are failing with this error duri
- To decrease the indexing throughput you can decrease `Bulk request concurrency` (see [Advanced Search settings](#advanced-search-configuration)). This is set to `10` by default, but you change it to as low as 1 to reduce the number of concurrent indexing operations.
- If changing `Bulk request concurrency` didn't help, you can use the [queue selector](../administration/operations/extra_sidekiq_processes.md#queue-selector) option to [limit indexing jobs only to specific Sidekiq nodes](#index-large-instances-with-dedicated-sidekiq-nodes-or-processes), which should reduce the number of indexing requests.
+### Indexing is very slow or fails with `rejected execution of coordinating operation` messages
+
+Bulk requests are getting rejected by the Elasticsearch node(s) likely due to load and lack of available memory.
+Ensure that your Elasticsearch cluster meets the [system requirements](#system-requirements) and has enough resources
+to perform bulk operations. See also the error ["429 (Too Many Requests)"](#indexing-fails-with-error-elastic-error-429-too-many-requests).
+
### Access requirements for the self-managed AWS OpenSearch Service
To use the self-managed AWS OpenSearch Service with GitLab, configure your instance's domain access policies
diff --git a/doc/integration/gitpod.md b/doc/integration/gitpod.md
index 977e794396e..f54542ff43f 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/) and
[documentation](https://www.gitpod.io/docs/).
## Enable Gitpod in your user settings
diff --git a/doc/integration/img/alicloud_scope.png b/doc/integration/img/alicloud_scope.png
new file mode 100644
index 00000000000..7a52d97ecd5
--- /dev/null
+++ b/doc/integration/img/alicloud_scope.png
Binary files differ
diff --git a/doc/integration/index.md b/doc/integration/index.md
index 61d8547aaf7..b26c841f943 100644
--- a/doc/integration/index.md
+++ b/doc/integration/index.md
@@ -24,8 +24,8 @@ GitLab can be configured to authenticate access requests with the following auth
- Integrate with [Kerberos](kerberos.md).
- Enable sign in via [LDAP](../administration/auth/ldap/index.md).
- Enable [OAuth2 provider](oauth_provider.md) application creation.
-- Use [OmniAuth](omniauth.md) to enable sign in via Twitter, GitHub, GitLab.com, Google,
- Bitbucket, Facebook, Shibboleth, SAML, Crowd, Azure, or Authentiq ID.
+- Use [OmniAuth](omniauth.md) to enable sign in through Twitter, GitHub, GitLab.com, Google,
+ Bitbucket, Facebook, SAML, Crowd, Azure, or Authentiq ID.
- Use GitLab as an [OpenID Connect](openid_connect_provider.md) identity provider.
- Authenticate to [Vault](vault.md) through GitLab OpenID Connect.
- Configure GitLab as a [SAML](saml.md) 2.0 Service Provider.
@@ -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/index.html#using-self-signed-certificate-or-custom-certificate-authorities)
+[Install the self signed certificate or custom certificate authorities](https://docs.gitlab.com/omnibus/troubleshooting.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/jira/configure.md b/doc/integration/jira/configure.md
index 2033ddbad6f..bfeac230f89 100644
--- a/doc/integration/jira/configure.md
+++ b/doc/integration/jira/configure.md
@@ -22,7 +22,8 @@ Prerequisites:
To configure your project:
-1. Go to your project and select [**Settings > Integrations**](../../user/project/integrations/overview.md#accessing-integrations).
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
1. Select **Jira**.
1. Select **Enable integration**.
1. Select **Trigger** actions. Your choice determines whether a mention of Jira issue
diff --git a/doc/integration/jira/connect-app.md b/doc/integration/jira/connect-app.md
index 59cdba93543..5c8f78a94b1 100644
--- a/doc/integration/jira/connect-app.md
+++ b/doc/integration/jira/connect-app.md
@@ -94,7 +94,7 @@ from outside the Marketplace, which allows you to install the application:
1. Place your Jira instance into
[development mode](https://developer.atlassian.com/cloud/jira/platform/getting-started-with-connect/#step-2--enable-development-mode).
1. Sign in to your GitLab application as a user with administrator access.
-1. Install the GitLab application from your self-managed GitLab instance, as
+1. Install the GitLab application from your Jira instance, as
described in the [Atlassian developer guides](https://developer.atlassian.com/cloud/jira/platform/getting-started-with-connect/#step-3--install-and-test-your-app):
1. In your Jira instance, go to **Apps > Manage Apps** and select **Upload app**:
diff --git a/doc/integration/jira/development_panel.md b/doc/integration/jira/development_panel.md
index 66810945d19..2f0ebea165a 100644
--- a/doc/integration/jira/development_panel.md
+++ b/doc/integration/jira/development_panel.md
@@ -4,25 +4,25 @@ 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
---
-# GitLab Jira Development panel integration **(FREE)**
+# GitLab Jira development panel integration **(FREE)**
> - [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.
+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
-[Development panel](https://support.atlassian.com/jira-software-cloud/docs/view-development-information-for-an-issue/).
-From the Development panel, you can open a detailed view and
+[development panel](https://support.atlassian.com/jira-software-cloud/docs/view-development-information-for-an-issue/).
+From the development panel, you can open a detailed view and
[take various actions](#use-the-integration), including creating a new merge request from a branch:
![Branch, Commit and Pull Requests links on Jira issue](img/jira_dev_panel_jira_setup_3.png)
-The information displayed in the Jira Development panel depends on where you mention the Jira issue ID:
+The information displayed in the Jira development panel depends on where you mention the Jira issue ID:
| Your mention of Jira issue ID in GitLab context | Automated effect in Jira issue |
|---------------------------------------------------|--------------------------------------------------------------------------------------------------------|
-| In a merge request title or description | Link to the MR is displayed in Development panel. |
-| In a branch name | Link to the branch is displayed in Development panel. |
-| In a commit message | Link to the commit is displayed in Development panel. |
+| In a merge request title or description | Link to the MR is displayed in the development panel. |
+| In a branch name | Link to the branch is displayed in the development panel. |
+| In a commit message | Link to the commit is displayed in the development panel. |
| In a commit message with Jira [Smart Commits](https://confluence.atlassian.com/fisheye/using-smart-commits-960155400.html) | Displays your custom comment or logged time spent and/or performs specified issue transition on merge. |
This integration connects all GitLab projects to projects in the Jira instance in either:
@@ -61,8 +61,8 @@ an issue transition, or add a custom comment, read the Atlassian page
## Configure the integration
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview of how to configure Jira Development panel integration, see
-[Agile Management - GitLab Jira Development panel integration](https://www.youtube.com/watch?v=VjVTOmMl85M).
+For an overview of how to configure the Jira development panel integration, see
+[Agile Management - GitLab Jira development panel integration](https://www.youtube.com/watch?v=VjVTOmMl85M).
To simplify administration, we recommend that a GitLab group maintainer or group owner
(or, if possible, instance administrator in the case of self-managed GitLab) set up the integration.
@@ -89,7 +89,7 @@ This integration is not supported on GitLab instances under a
[relative URL](https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-a-relative-url-for-gitlab).
For example, `http://example.com/gitlab`.
-## Troubleshoot the Development Panel
+## Troubleshoot the development panel
If you use Jira on your own server, go to the [Atlassian documentation](https://confluence.atlassian.com/jirakb/troubleshoot-the-development-panel-in-jira-server-574685212.html)
for general troubleshooting information.
diff --git a/doc/integration/jira/index.md b/doc/integration/jira/index.md
index 3052d85b2cb..371f3a4ab8e 100644
--- a/doc/integration/jira/index.md
+++ b/doc/integration/jira/index.md
@@ -56,7 +56,7 @@ or the Jira DVCS (distributed version control system) connector,
## Authentication in Jira
The authentication method in Jira depends on whether you host Jira on your own server or on
-[Atlassian cloud](https://www.atlassian.com/cloud):
+[Atlassian cloud](https://www.atlassian.com/migration/assess/why-cloud):
- **Jira Server** supports basic authentication. When connecting, a **username and password** are
required. Connecting to Jira Server using the Central Authentication Service (CAS) is not possible. For more information, read
diff --git a/doc/integration/jira/issues.md b/doc/integration/jira/issues.md
index e24862242e1..28998851697 100644
--- a/doc/integration/jira/issues.md
+++ b/doc/integration/jira/issues.md
@@ -106,7 +106,7 @@ sorts by **Created date** by default, with the newest issues listed at the top:
![Jira issues integration enabled](img/open_jira_issues_list_v14_6.png)
-- To display the most recently updated issues first, select **Last updated**.
+- To display the most recently updated issues first, select **Updated date**.
- You can [search and filter](#search-and-filter-the-issues-list) the issues list.
- In GitLab [versions 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/299832),
you can select an issue from the list to view it in GitLab:
diff --git a/doc/integration/mattermost/index.md b/doc/integration/mattermost/index.md
index 6ac4faa5a35..c8e2df1f88f 100644
--- a/doc/integration/mattermost/index.md
+++ b/doc/integration/mattermost/index.md
@@ -477,7 +477,7 @@ Mattermost System Console or manually.
If a configuration setting is specified via both the `gitlab.rb` (as an environment variable)
and `config.json` files, the environment variable gets precedence.
-If you encounter any issues [visit the GitLab Mattermost troubleshooting forum](https://forum.mattermost.org/t/upgrading-to-gitlab-mattermost-in-gitlab-8-9/1735) and share any relevant portions of `mattermost.log` along with the step at which you encountered issues.
+If you encounter any issues [visit the GitLab Mattermost troubleshooting forum](https://forum.mattermost.com/t/upgrading-to-gitlab-mattermost-in-gitlab-8-9/1735) and share any relevant portions of `mattermost.log` along with the step at which you encountered issues.
### Upgrading GitLab Mattermost outside of GitLab
@@ -523,7 +523,7 @@ You can fix this by setting up a `mattermost-cli` [shell alias](#mattermost-comm
For help and support around your GitLab Mattermost deployment please see:
-- [Troubleshooting Forum](https://forum.mattermost.org/t/how-to-use-the-troubleshooting-forum/150) for configuration questions and issues.
+- [Troubleshooting Forum](https://forum.mattermost.com/t/how-to-use-the-troubleshooting-forum/150) for configuration questions and issues.
- [Troubleshooting FAQ](https://docs.mattermost.com/install/troubleshooting.html).
- [Mattermost GitLab Issues Support Handbook](https://docs.mattermost.com/process/support.html?highlight=omnibus#gitlab-issues).
- [GitLab Mattermost issue tracker](https://gitlab.com/gitlab-org/gitlab-mattermost/-/issues) for verified bugs with repro steps.
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index 7a4bcba25e4..f6e41e808af 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -21,6 +21,7 @@ GitLab supports the following OmniAuth providers.
| Provider documentation | OmniAuth provider name |
|---------------------------------------------------------------------|----------------------------|
+| [AliCloud](alicloud.md) | `alicloud` |
| [Atlassian Crowd](../administration/auth/crowd.md) | `crowd` |
| [Atlassian](../administration/auth/atlassian.md) | `atlassian_oauth2` |
| [Auth0](auth0.md) | `auth0` |
@@ -41,7 +42,6 @@ GitLab supports the following OmniAuth providers.
| [OpenID Connect](../administration/auth/oidc.md) | `openid_connect` |
| [Salesforce](salesforce.md) | `salesforce` |
| [SAML](saml.md) | `saml` |
-| [Shibboleth](saml.md) | `shibboleth` |
| [Twitter](twitter.md) | `twitter` |
## Configure initial settings
@@ -53,7 +53,7 @@ Setting | Description | Default value
---------------------------|-------------|--------------
`allow_single_sign_on` | Enables you to list the providers that automatically create a GitLab account. The provider names are available in the **OmniAuth provider name** column in the [supported providers table](#supported-providers). | The default is `false`. If `false`, users must be created manually, or they can't sign in using OmniAuth.
`auto_link_ldap_user` | If enabled, creates an LDAP identity in GitLab for users that are created through an OmniAuth provider. You can enable this setting if you have the [LDAP (ActiveDirectory)](../administration/auth/ldap/index.md) integration enabled. Requires the `uid` of the user to be the same in both LDAP and the OmniAuth provider. | The default is `false`.
-`block_auto_created_users` | If enabled, blocks users that are automatically created from signing in until they are approved by an administrator. | The default is `true`. If you set the value to `false`, make sure you only define providers for `allow_single_sign_on` that you can control, like SAML, Shibboleth, Crowd, or Google. Otherwise, any user on the internet can sign in to GitLab without an administrator's approval.
+`block_auto_created_users` | If enabled, blocks users that are automatically created from signing in until they are approved by an administrator. | The default is `true`. If you set the value to `false`, make sure you only define providers for `allow_single_sign_on` that you can control, like SAML, Crowd, or Google. Otherwise, any user on the internet can sign in to GitLab without an administrator's approval.
To change these settings:
@@ -197,7 +197,7 @@ To enable automatic linking for SAML, see the [SAML setup instructions](saml.md#
## Create an external providers list
You can define a list of external OmniAuth providers.
-Users who create accounts or sign in to GitLab through the listed providers do not get access to [internal projects](../public_access/public_access.md#internal-projects-and-groups).
+Users who create accounts or sign in to GitLab through the listed providers do not get access to [internal projects](../user/public_access.md#internal-projects-and-groups).
To define the external providers list, use the full name of the provider,
for example, `google_oauth2` for Google. For provider names, see the
diff --git a/doc/integration/salesforce.md b/doc/integration/salesforce.md
index ebd936424d3..8d4d8ff9f52 100644
--- a/doc/integration/salesforce.md
+++ b/doc/integration/salesforce.md
@@ -11,7 +11,7 @@ You can integrate your GitLab instance with [Salesforce](https://www.salesforce.
## Create a Salesforce Connected App
To enable Salesforce OmniAuth provider, you must use Salesforce's credentials for your GitLab instance.
-To get the credentials (a pair of Client ID and Client Secret), you must [create a Connected App](https://help.salesforce.com/s/articleView?id=connected_app_create.htm&type=5) on Salesforce.
+To get the credentials (a pair of Client ID and Client Secret), you must [create a Connected App](https://help.salesforce.com/s/articleView?id=sf.connected_app_create.htm&type=5) on Salesforce.
1. Sign in to [Salesforce](https://login.salesforce.com/).
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index 95bf835147d..c5383f9e34b 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -730,6 +730,11 @@ Refer to the documentation for your SAML Identity Provider for information on ho
The [Generated passwords for users created through integrated authentication](../security/passwords_for_integrated_authentication_methods.md) guide provides an overview of how GitLab generates and sets passwords for users created via SAML.
+## Link SAML identity for an existing user
+
+A user can manually link their SAML identity to an existing GitLab account by following the steps in
+[Enable OmniAuth for an existing user](omniauth.md#enable-omniauth-for-an-existing-user).
+
## Configuring Group SAML on a self-managed GitLab instance **(PREMIUM SELF)**
For information on the GitLab.com implementation, please see the [SAML SSO for GitLab.com groups page](../user/group/saml_sso).
@@ -785,7 +790,7 @@ 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/configure/saml-configuration/configure-auth0-saml-identity-provider)
+- [Auth0](https://auth0.com/docs/authenticate/protocols/saml/saml-sso-integrations/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.
diff --git a/doc/operations/incident_management/alerts.md b/doc/operations/incident_management/alerts.md
index 0ad2b5ecf3b..5eb0624be31 100644
--- a/doc/operations/incident_management/alerts.md
+++ b/doc/operations/incident_management/alerts.md
@@ -86,26 +86,22 @@ The **Alert details** tab has two sections. The top section provides a short lis
### Metrics tab
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217768) in GitLab 13.2.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217768) in GitLab 13.2.
+> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/340852) in GitLab 14.10. In GitLab 14.9 and earlier, this tab shows a metrics chart for alerts coming from Prometheus.
-The **Metrics** tab displays a metrics chart for alerts coming from Prometheus. If the alert originated from any other tool, the **Metrics** tab is empty.
-For externally-managed Prometheus instances, you must configure your alerting rules to display a chart in the alert. For information about how to configure
-your alerting rules, see [Embedding metrics based on alerts in incident issues](../metrics/embed.md#embedding-metrics-based-on-alerts-in-incident-issues). See
-[External Prometheus instances](../metrics/alerts.md#external-prometheus-instances) for information about setting up alerts for your self-managed Prometheus
-instance.
+In many cases, alerts are associated to metrics. You can upload screenshots of metric
+charts in the **Metrics** tab.
-Prerequisite:
+To do so, either:
-- You must have at least the Developer role.
+- Select **upload** and then select an image from your file browser.
+- Drag a file from your file browser and drop it in the drop zone.
-To view the metrics for an alert:
+When you upload an image, you can add text to the image and link it to the original graph.
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Monitor > Alerts**.
-1. Select the alert you want to view.
-1. Below the title of the alert, select the **Metrics** tab.
+![Text link modal](img/incident_metrics_tab_text_link_modal_v14_9.png)
-![Alert Metrics View](img/alert_detail_metrics_v13_2.png)
+If you add a link, it is shown above the uploaded image.
#### View an alert's logs
diff --git a/doc/operations/incident_management/img/alert_detail_metrics_v13_2.png b/doc/operations/incident_management/img/alert_detail_metrics_v13_2.png
deleted file mode 100644
index 84d83365ea8..00000000000
--- a/doc/operations/incident_management/img/alert_detail_metrics_v13_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/incident_management/img/incident_list_v13_5.png b/doc/operations/incident_management/img/incident_list_v13_5.png
deleted file mode 100644
index 88942a70e88..00000000000
--- a/doc/operations/incident_management/img/incident_list_v13_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/incident_management/img/incident_metrics_tab_text_link_modal_v14_9.png b/doc/operations/incident_management/img/incident_metrics_tab_text_link_modal_v14_9.png
index 1b045a13fc5..bae1e5ad1b4 100644
--- a/doc/operations/incident_management/img/incident_metrics_tab_text_link_modal_v14_9.png
+++ b/doc/operations/incident_management/img/incident_metrics_tab_text_link_modal_v14_9.png
Binary files differ
diff --git a/doc/operations/incident_management/img/timeline_view_toggle_v13_5.png b/doc/operations/incident_management/img/timeline_view_toggle_v13_5.png
deleted file mode 100644
index 542ca139f7e..00000000000
--- a/doc/operations/incident_management/img/timeline_view_toggle_v13_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/incident_management/img/timeline_view_toggle_v14_10.png b/doc/operations/incident_management/img/timeline_view_toggle_v14_10.png
new file mode 100644
index 00000000000..90f1d205fed
--- /dev/null
+++ b/doc/operations/incident_management/img/timeline_view_toggle_v14_10.png
Binary files differ
diff --git a/doc/operations/incident_management/incidents.md b/doc/operations/incident_management/incidents.md
index c7ed386f505..66d04fce14c 100644
--- a/doc/operations/incident_management/incidents.md
+++ b/doc/operations/incident_management/incidents.md
@@ -169,7 +169,7 @@ Beneath the highlight bar, GitLab displays a summary that includes the following
- Monitoring tool
Comments are displayed in threads, but can be displayed chronologically
-[in a timeline view](#timeline-view).
+[by toggling on the recent updates view](#recent-updates-view).
### Metrics **(PREMIUM)**
@@ -195,15 +195,15 @@ field populated.
![Incident alert details](img/incident_alert_details_v13_4.png)
-### Timeline view **(PREMIUM)**
+### Recent updates view **(PREMIUM)**
> [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
+**{history}** **Turn recent updates view on** in the comment bar to display comments
un-threaded and ordered chronologically, newest to oldest:
-![Timeline view toggle](img/timeline_view_toggle_v13_5.png)
+![Recent updates view toggle](img/timeline_view_toggle_v14_10.png)
### Service Level Agreement countdown timer **(PREMIUM)**
@@ -255,7 +255,13 @@ Add a to-do for incidents that you want to track in your to-do list. Click the
### Change incident status
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5716) in GitLab 14.9.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5716) in GitLab 14.9 [with a flag](../../administration/feature_flags.md) named `incident_escalations`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/345769) in GitLab 14.10.
+
+FLAG:
+This feature is available by default. To disable it per project or for your entire
+instance, ask an administrator to [disable the feature flag](../../administration/feature_flags.md)
+named `incident_escalations`.
For users with the Developer role or higher, select **Edit** in the **Status** section of the
right-hand side bar of an incident, then select a status. **Triggered** is the default status for
@@ -271,9 +277,15 @@ by changing the status. Setting the status to:
For [incidents created from alerts](alerts.md#create-an-incident-from-an-alert),
updating the incident status also updates the alert status.
-## Change escalation policy **(PREMIUM)**
+### Change escalation policy **(PREMIUM)**
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5716) in GitLab 14.9 [with a flag](../../administration/feature_flags.md) named `incident_escalations`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/345769) in GitLab 14.10.
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5716) in GitLab 14.9.
+FLAG:
+This feature is available by default. To disable it per project or for your entire
+instance, ask an administrator to [disable the feature flag](../../administration/feature_flags.md)
+named `incident_escalations`.
For users with the Developer role or higher, select **Edit** in the **Escalation policy** section of
the right-hand side bar of an incident, then select a policy. By default, new incidents do not have
diff --git a/doc/operations/incident_management/paging.md b/doc/operations/incident_management/paging.md
index 27854a9e201..d0c14ab6e59 100644
--- a/doc/operations/incident_management/paging.md
+++ b/doc/operations/incident_management/paging.md
@@ -50,7 +50,13 @@ or stop alert escalations by [updating the alert's status](alerts.md#update-an-a
### Escalating an incident
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5716) in GitLab 14.9.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5716) in GitLab 14.9 [with a flag](../../administration/feature_flags.md) named `incident_escalations`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/345769) in GitLab 14.10.
+
+FLAG:
+This feature is available by default. To disable it per project or for your entire
+instance, ask an administrator to [disable the feature flag](../../administration/feature_flags.md)
+named `incident_escalations`.
For incidents, paging on-call responders is optional for each individual incident.
To begin escalating the incident, [set the incident's escalation policy](incidents.md#change-escalation-policy).
diff --git a/doc/operations/index.md b/doc/operations/index.md
index 9b988ff561d..61d38c3d6a9 100644
--- a/doc/operations/index.md
+++ b/doc/operations/index.md
@@ -15,7 +15,7 @@ your applications.
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 15.0.
Metrics help you understand the health and performance of your infrastructure,
applications, and systems by providing insights into your application's reliability,
@@ -63,7 +63,7 @@ and the work required to fix them - all without leaving GitLab.
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 15.0.
Application tracing in GitLab is a way to measure an application's performance and
health while it's running. After configuring your application to enable tracing, you
@@ -83,7 +83,7 @@ microservices-based distributed systems - and displays results within GitLab.
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 15.0.
Developers need to troubleshoot application changes in development, and incident
responders need aggregated, real-time logs when troubleshooting problems with
diff --git a/doc/operations/metrics/alerts.md b/doc/operations/metrics/alerts.md
index 702ff944fc5..0e446f04b9b 100644
--- a/doc/operations/metrics/alerts.md
+++ b/doc/operations/metrics/alerts.md
@@ -79,7 +79,7 @@ values extracted from the [`alerts` field in webhook payload](https://prometheus
- `starts_at`: Alert start time from the payload's `startsAt` field
- `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 [GLFM](../../user/markdown.md): GitLab Flavored Markdown from the payload's `annotations/gitlab_incident_markdown` field.
- 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):
diff --git a/doc/operations/metrics/dashboards/default.md b/doc/operations/metrics/dashboards/default.md
index 3e14917209a..5c7d6440a7e 100644
--- a/doc/operations/metrics/dashboards/default.md
+++ b/doc/operations/metrics/dashboards/default.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab provides some dashboards out-of-the-box for any project with
[Prometheus available](../../../user/project/integrations/prometheus.md). You can
diff --git a/doc/operations/metrics/dashboards/develop.md b/doc/operations/metrics/dashboards/develop.md
index fc7686c8f86..513e5532bee 100644
--- a/doc/operations/metrics/dashboards/develop.md
+++ b/doc/operations/metrics/dashboards/develop.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab provides a template to make it easier for you to create templates for
[custom dashboards](index.md). Templates provide helpful guidance and
diff --git a/doc/operations/metrics/dashboards/index.md b/doc/operations/metrics/dashboards/index.md
index a8ca23b7002..052f678f1b7 100644
--- a/doc/operations/metrics/dashboards/index.md
+++ b/doc/operations/metrics/dashboards/index.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
By default, all projects include a [GitLab-defined Prometheus dashboard](default.md), which
includes a few key metrics, but you can also define your own custom dashboards.
diff --git a/doc/operations/metrics/dashboards/panel_types.md b/doc/operations/metrics/dashboards/panel_types.md
index 734b560bf13..a4cdfc5b9a0 100644
--- a/doc/operations/metrics/dashboards/panel_types.md
+++ b/doc/operations/metrics/dashboards/panel_types.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
The below panel types are supported in monitoring dashboards.
diff --git a/doc/operations/metrics/dashboards/settings.md b/doc/operations/metrics/dashboards/settings.md
index 14da5cf4a04..aae5a623420 100644
--- a/doc/operations/metrics/dashboards/settings.md
+++ b/doc/operations/metrics/dashboards/settings.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
You can configure your [Monitoring dashboard](../index.md) to
display the time zone of your choice, and the links of your choice.
diff --git a/doc/operations/metrics/dashboards/templating_variables.md b/doc/operations/metrics/dashboards/templating_variables.md
index d751a96f379..7d1754f79f5 100644
--- a/doc/operations/metrics/dashboards/templating_variables.md
+++ b/doc/operations/metrics/dashboards/templating_variables.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
Templating variables can be used to make your metrics dashboard more versatile.
diff --git a/doc/operations/metrics/dashboards/variables.md b/doc/operations/metrics/dashboards/variables.md
index 369bcd1ddeb..b796cf4cef5 100644
--- a/doc/operations/metrics/dashboards/variables.md
+++ b/doc/operations/metrics/dashboards/variables.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
## Query variables
diff --git a/doc/operations/metrics/dashboards/yaml.md b/doc/operations/metrics/dashboards/yaml.md
index 81f1354d3c0..62389fa01ee 100644
--- a/doc/operations/metrics/dashboards/yaml.md
+++ b/doc/operations/metrics/dashboards/yaml.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
Dashboards have several components:
diff --git a/doc/operations/metrics/embed.md b/doc/operations/metrics/embed.md
index 6a3712d8377..26ea7aa07eb 100644
--- a/doc/operations/metrics/embed.md
+++ b/doc/operations/metrics/embed.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Embedding metric charts within GitLab Flavored Markdown **(FREE)**
You can display metrics charts within
-[GitLab Flavored Markdown](../../user/markdown.md#gitlab-flavored-markdown)
+[GitLab Flavored Markdown (GLFM)](../../user/markdown.md)
fields such as issue or merge request descriptions. The maximum number of embedded
charts allowed in a GitLab Flavored Markdown field is 100.
Embedding charts is useful when sharing an application incident or performance
@@ -26,7 +26,7 @@ are still supported, and can be used to embed metric charts.
To display metric charts, include a link of the form
`https://<root_url>/<project>/-/metrics?environment=<environment_id>` in a field
-that supports GitLab-flavored Markdown:
+that supports GitLab Flavored Markdown:
```markdown
### Summary
@@ -100,11 +100,11 @@ a chart corresponding to the query can be included if these requirements are met
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/208224) from GitLab Ultimate to GitLab Free in 13.2.
[Cluster Health Metrics](../../user/infrastructure/clusters/manage/clusters_health.md)
-can also be embedded in [GitLab-flavored Markdown](../../user/markdown.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,
+GitLab Flavored Markdown is supported. To generate and copy a link to the chart,
follow the instructions in the
[Cluster Health Metric documentation](../../user/infrastructure/clusters/manage/clusters_health.md).
diff --git a/doc/operations/tracing.md b/doc/operations/tracing.md
index 044f6800e73..bbc05bb0f9a 100644
--- a/doc/operations/tracing.md
+++ b/doc/operations/tracing.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346540)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 15.0.
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/public_access/public_access.md b/doc/public_access/public_access.md
index 8eee8fc9a6b..8b665972918 100644
--- a/doc/public_access/public_access.md
+++ b/doc/public_access/public_access.md
@@ -1,98 +1,11 @@
---
-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
+redirect_to: '../user/public_access.md'
+remove_date: '2022-06-18'
---
-# Project and group visibility **(FREE)**
+This document was moved to [another location](../user/public_access.md).
-GitLab allows users with the Owner role to set a project's or group's visibility as:
-
-- **Public**
-- **Internal**
-- **Private**
-
-These visibility levels affect who can see the project in the public access directory (`/public`
-for your GitLab instance). For example, <https://gitlab.com/public>.
-You can control the visibility of individual features with
-[project feature settings](../user/permissions.md#project-features).
-
-## Public projects and groups
-
-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 on the repository.
-
-NOTE:
-By default, `/public` is visible to unauthenticated users. However, if the
-[**Public** visibility level](../user/admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels)
-is restricted, `/public` is visible only to signed-in users.
-
-## Internal projects and groups
-
-Internal projects can be cloned by any signed-in user except
-[external users](../user/permissions.md#external-users).
-
-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 on the repository.
-
-NOTE:
-From July 2019, the `Internal` visibility setting is disabled for new projects, groups,
-and snippets on GitLab.com. Existing projects, groups, and snippets using the `Internal`
-visibility setting keep this setting. You can read more about the change in the
-[relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/12388).
-
-## Private projects and groups
-
-Private projects can only be cloned and viewed by project members (except for guests).
-
-They appear in the public access directory (`/public`) for project members only.
-
-## Change project visibility
-
-Prerequisite:
-
-- You must have the Owner role for a project.
-
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Settings > General**.
-1. Expand **Visibility, project features, permissions**.
-1. Change **Project visibility** to either **Private**, **Internal**, or **Public**.
-1. Select **Save changes**.
-
-## Change group visibility
-
-Prerequisite:
-
-- You must have the Owner role for a group.
-
-1. On the top bar, select **Menu > Groups** and find your project.
-1. On the left sidebar, select **Settings > General**.
-1. Expand **Naming, visibility**.
-1. Under **Visibility level** select either **Private**, **Internal**, or **Public**.
-1. Select **Save changes**.
-
-## 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 administrators.
-
-For details, see [Restricted visibility levels](../user/admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels).
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+<!-- This redirect file can be deleted after <2022-06-18>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md
index cef52cc61d7..5458e9952fa 100644
--- a/doc/raketasks/backup_restore.md
+++ b/doc/raketasks/backup_restore.md
@@ -375,6 +375,30 @@ For example, for installations from source:
sudo -u git -H bundle exec rake gitlab:backup:create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
```
+#### Incremental repository backups
+
+> - Introduced in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `incremental_repository_backup`. Disabled by default.
+> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/355945) in GitLab 14.10.
+
+FLAG:
+On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `incremental_repository_backup`.
+On GitLab.com, this feature is not available.
+
+Incremental backups can be faster than full backups because they only pack changes since the last backup into the backup
+bundle for each repository. There must be an existing backup to create an incremental backup from and this backup will be overwritten. You can use the `BACKUP=timestamp_of_backup` option to choose which backup will be used.
+
+To create an incremental backup, run:
+
+```shell
+sudo gitlab-backup create INCREMENTAL=yes
+```
+
+Incremental backups can also be created from [an untarred backup](#skipping-tar-creation) by using `SKIP=tar`:
+
+```shell
+sudo gitlab-backup create INCREMENTAL=yes SKIP=tar
+```
+
#### Uploading backups to a remote (cloud) storage
You can let the backup script upload (using the [Fog library](http://fog.io/))
@@ -700,6 +724,23 @@ sudo gitlab-backup create DIRECTORY=weekly
Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
+#### Skip uploading backups to remote storage
+
+If you have configured GitLab to [upload backups in a remote storage](#uploading-backups-to-a-remote-cloud-storage),
+you can use the `SKIP=remote` option to skip uploading your backups to the remote storage.
+
+For Omnibus GitLab packages:
+
+```shell
+sudo gitlab-backup create SKIP=remote
+```
+
+For installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create SKIP=remote RAILS_ENV=production
+```
+
#### Uploading to locally mounted shares
You may also send backups to a mounted share (for example, `NFS`,`CIFS`, or
@@ -1393,7 +1434,7 @@ To prepare the new server:
1. Flush the Redis database to disk, and stop GitLab other than the services needed for migration:
```shell
- sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket save && sudo gitlab-ctl stop && sudo gitlab-ctl start postgresql
+ sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket save && sudo gitlab-ctl stop && sudo gitlab-ctl start postgresql && sudo gitlab-ctl start gitaly
```
1. Create a GitLab backup:
@@ -1813,12 +1854,7 @@ If this happens, examine the following:
> - [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.
-> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#disable-or-enable-gitaly-backup).
-
-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.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.10. [Feature flag `gitaly_backup`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83254) removed.
The `gitaly-backup` binary is used by the backup Rake task to create and restore repository backups from Gitaly.
`gitaly-backup` replaces the previous backup method that directly calls RPCs on Gitaly from GitLab.
@@ -1835,41 +1871,3 @@ If you have a specific reason to change the path, it can be configured in Omnibu
1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
for the changes to take effect
-
-#### Disable or enable `gitaly-backup`
-
-`gitaly-backup` is under development but ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../administration/feature_flags.md)
-can opt to disable it.
-
-To disable it:
-
-```ruby
-Feature.disable(:gitaly_backup)
-```
-
-To enable it:
-
-```ruby
-Feature.enable(:gitaly_backup)
-```
-
-### Incremental repository backups
-
-> Introduced in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `incremental_repository_backup`. Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `incremental_repository_backup`.
-On GitLab.com, this feature is not available.
-This feature is not ready for production use.
-
-Incremental backups can be faster than full backups because they only pack changes since the last backup into the backup
-bundle for each repository. Because incremental backups require access to the previous backup, you can't use incremental
-backups with tar files.
-
-To create an incremental backup, run:
-
-```shell
-sudo gitlab-backup create SKIP=tar INCREMENTAL=yes
-```
diff --git a/doc/raketasks/migrate_snippets.md b/doc/raketasks/migrate_snippets.md
index 0d2c4edb01f..c36009e69d0 100644
--- a/doc/raketasks/migrate_snippets.md
+++ b/doc/raketasks/migrate_snippets.md
@@ -18,7 +18,7 @@ For each snippet:
- A file is created in the repository, using the snippet filename.
- The snippet is committed to the repository.
-GitLab performs this migration through a [Background Migration](../development/background_migrations.md)
+GitLab performs this migration through a [Background Migration](../development/database/background_migrations.md)
when the GitLab instance is upgraded to 13.0 or a higher version.
However, if the migration fails for any of the snippets, they must be migrated individually.
The following Rake tasks help with that process.
diff --git a/doc/security/index.md b/doc/security/index.md
index da3fa761f3f..73ac5028db5 100644
--- a/doc/security/index.md
+++ b/doc/security/index.md
@@ -26,6 +26,7 @@ type: index
- [CI/CD variables](../ci/variables/index.md#cicd-variable-security)
- [Token overview](token_overview.md)
- [Project Import decompressed archive size limits](project_import_decompressed_archive_size_limits.md)
+- [Responding to security incidents](responding_to_security_incidents.md)
## Securing your GitLab installation
diff --git a/doc/security/reset_user_password.md b/doc/security/reset_user_password.md
index 1940c5be73a..06934b187c1 100644
--- a/doc/security/reset_user_password.md
+++ b/doc/security/reset_user_password.md
@@ -74,11 +74,13 @@ If you know the username, user ID, or email address, you can use the Rails conso
user = User.find_by(email: 'user@example.com')
```
-1. Reset the password:
+1. Reset the password by setting a value for `user.password` and `user.password_confirmation`. For example, to set a new random
+ password:
```ruby
- user.password = 'secret_pass'
- user.password_confirmation = 'secret_pass'
+ new_password = ::User.random_password
+ user.password = new_password
+ user.password_confirmation = new_password
```
1. Optional. Notify the user that an administrator changed their password:
diff --git a/doc/security/responding_to_security_incidents.md b/doc/security/responding_to_security_incidents.md
new file mode 100644
index 00000000000..b3bce785695
--- /dev/null
+++ b/doc/security/responding_to_security_incidents.md
@@ -0,0 +1,65 @@
+---
+stage: Manage
+group: Authentication and Authorization
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference, howto
+---
+
+# Responding to security incidents **(FREE SELF)**
+
+When a security incident occurs, you should follow the processes defined by your organization. However, you might consider some
+additional steps. These suggestions are intended to supplement existing security incident response processes within your organization.
+
+## Suspected compromised user account
+
+If you suspect that a user account or bot account has been compromised, consider taking the following steps:
+
+- [Block the user](../user/admin_area/moderate_users.md#block-a-user) to mitigate any current risk.
+- [Review the audit events](../administration/audit_events.md) available to you to identify any suspicious account behavior. For
+ example:
+ - Suspicious sign-in events.
+ - Creation or deletion of personal access tokens, project access tokens, and group access tokens.
+ - Creation or deletion of SSH or GPG keys.
+ - Creation, modification, or deletion of two-factor authentication.
+ - Changes to repositories.
+ - Changes to group or project configurations.
+ - Addition or modification of runners.
+ - Addition or modification of webhooks or Git hooks.
+- Reset any credentials the user might have had access to. For example, users with at least the Maintainer role can view protected
+ [CI/CD variables](../ci/variables/index.md) and [runner registration tokens](token_overview.md#runner-registration-tokens).
+- [Reset the user's password](reset_user_password.md).
+- Get the user to [enable two factor authentication](../user/profile/account/two_factor_authentication.md) (2FA), and consider [enforcing 2FA at the instance or group level](two_factor_authentication.md)
+- After completing an investigation and mitigating impacts, unblock the user.
+
+## Suspected compromised instance **(FREE SELF)**
+
+Self-managed GitLab customers and administrators are responsible for:
+
+- The security of their underlying hosts.
+- Keeping GitLab itself up to date.
+
+It is important to [regularly update GitLab](../policy/maintenance.md), update your operating system and its software, and harden your
+hosts in accordance with vendor guidance.
+
+If you suspect that your GitLab instance has been compromised, consider taking the following steps:
+
+- [Review the audit events](../administration/audit_events.md) available to you for suspicious account behavior.
+- [Review all users](../user/admin_area/moderate_users.md) (including the Administrative root user), and follow the steps in [Suspected compromised user account](#suspected-compromised-user-account) if necessary.
+- Review the [Credentials Inventory](../user/admin_area/credentials_inventory.md), if available to you.
+- Change any sensitive credentials, variables, tokens, and secrets. For example, those located in instance configuration, database,
+ CI/CD pipelines, or elsewhere.
+- Upgrade to the latest version of GitLab and adopt a plan to upgrade after every security patch release.
+
+In addition, the suggestions below are common steps taken in incident response plans when servers are compromised by malicious actors.
+
+WARNING:
+Use these suggestions at your own risk.
+
+- Save any server state and logs to a write-once location, for later investigation.
+- Look for unrecognized background processes.
+- Check for open ports on the system.
+- Rebuild the host from a known-good backup or from scratch, and apply all the latest security patches.
+- Review network logs for uncommon traffic.
+- Establish network monitoring and network-level controls.
+- Restrict inbound and outbound network access to authorized users and servers only.
+- Ensure all logs are routed to an independent write-only datastore.
diff --git a/doc/security/ssh_keys_restrictions.md b/doc/security/ssh_keys_restrictions.md
index 2e4a737f9aa..03bc0207cf5 100644
--- a/doc/security/ssh_keys_restrictions.md
+++ b/doc/security/ssh_keys_restrictions.md
@@ -39,7 +39,7 @@ Hovering over this icon tells you why the key is restricted.
## Default settings
By default, the GitLab.com and self-managed settings for the
-[supported key types](../ssh/index.md#supported-ssh-key-types) are:
+[supported key types](../user/ssh.md#supported-ssh-key-types) are:
- RSA SSH keys are allowed.
- DSA SSH keys are forbidden ([since GitLab 11.0](https://about.gitlab.com/releases/2018/06/22/gitlab-11-0-released/#support-for-dsa-ssh-keys)).
diff --git a/doc/security/two_factor_authentication.md b/doc/security/two_factor_authentication.md
index cab9f6a957e..ae13881fe6f 100644
--- a/doc/security/two_factor_authentication.md
+++ b/doc/security/two_factor_authentication.md
@@ -114,7 +114,7 @@ FLAG:
On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `two_factor_for_cli`. On GitLab.com, this feature is not available. The feature is not ready for production use. This feature flag also affects [session duration for Git Operations when 2FA is enabled](../user/admin_area/settings/account_and_limit_settings.md#customize-session-duration-for-git-operations-when-2fa-is-enabled).
Two-factor authentication can be enforced for Git over SSH operations. However, we recommend using
-[ED25519_SK](../ssh/index.md#ed25519_sk-ssh-keys) or [ECDSA_SK](../ssh/index.md#ecdsa_sk-ssh-keys) SSH keys instead.
+[ED25519_SK](../user/ssh.md#ed25519_sk-ssh-keys) or [ECDSA_SK](../user/ssh.md#ecdsa_sk-ssh-keys) SSH keys instead.
The one-time password (OTP) verification can be done using a command:
diff --git a/doc/security/user_file_uploads.md b/doc/security/user_file_uploads.md
index e8b0c08e240..dcdd18a9f0b 100644
--- a/doc/security/user_file_uploads.md
+++ b/doc/security/user_file_uploads.md
@@ -7,8 +7,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# User File Uploads **(FREE)**
-> - In GitLab 14.8 and later, [authorization checks are enforced](https://gitlab.com/gitlab-org/gitlab/-/issues/26781) on media uploads. This change is being [rolled out incrementally](https://gitlab.com/gitlab-org/gitlab/-/issues/352291) on GitLab.com in 14.9.
-
Images that are attached to issues, merge requests, or comments
do not require authentication to be viewed if they are accessed directly by URL.
This direct URL contains a random 32-character ID that prevents unauthorized
diff --git a/doc/ssh/index.md b/doc/ssh/index.md
index 846e5c369bb..10184a63a7a 100644
--- a/doc/ssh/index.md
+++ b/doc/ssh/index.md
@@ -1,497 +1,11 @@
---
-stage: Manage
-group: Authentication and Authorization
-info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: howto, reference
+redirect_to: '../user/ssh.md'
+remove_date: '2022-06-18'
---
-# Use SSH keys to communicate with GitLab **(FREE)**
+This document was moved to [another location](../user/ssh.md).
-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 you push to is GitLab.
-
-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.
-
-## Prerequisites
-
-To use SSH to communicate with GitLab, you need:
-
-- The OpenSSH client, which comes pre-installed on GNU/Linux, macOS, and Windows 10.
-- SSH version 6.5 or later. Earlier versions used an MD5 signature, which is not secure.
-
-To view the version of SSH installed on your system, run `ssh -V`.
-
-## Supported SSH key types
-
-To communicate with GitLab, you can use the following SSH key types:
-
-- [ED25519](#ed25519-ssh-keys)
-- [ED25519_SK](#ed25519_sk-ssh-keys) (Available in GitLab 14.8 and later.)
-- [ECDSA_SK](#ecdsa_sk-ssh-keys) (Available in GitLab 14.8 and later.)
-- [RSA](#rsa-ssh-keys)
-- DSA ([Deprecated](https://about.gitlab.com/releases/2018/06/22/gitlab-11-0-released/#support-for-dsa-ssh-keys) in GitLab 11.0.)
-- ECDSA (As noted in [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-ecdsa), the security issues related to DSA also apply to ECDSA.)
-
-Administrators can [restrict which keys are permitted and their minimum lengths](../security/ssh_keys_restrictions.md).
-
-### ED25519 SSH keys
-
-The book [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-chapter-5-digital-signatures)
-suggests that [ED25519](https://ed25519.cr.yp.to/) keys are more secure and performant than RSA keys.
-
-OpenSSH 6.5 introduced ED25519 SSH keys in 2014 and they should be available on most
-operating systems.
-
-### ED25519_SK SSH keys
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78934) in GitLab 14.8.
-
-To use ED25519_SK SSH keys on GitLab, your local client and GitLab server
-must have [OpenSSH 8.2](https://www.openssh.com/releasenotes.html#8.2) or later installed.
-
-### ECDSA_SK SSH keys
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78934) in GitLab 14.8.
-
-To use ECDSA_SK SSH keys on GitLab, your local client and GitLab server
-must have [OpenSSH 8.2](https://www.openssh.com/releasenotes.html#8.2) or later installed.
-
-### RSA SSH keys
-
-Available documentation suggests that ED25519 is more secure than RSA.
-
-If you use an RSA key, the US National Institute of Science and Technology in
-[Publication 800-57 Part 3 (PDF)](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf)
-recommends a key size of at least 2048 bits. The default key size depends on your version of `ssh-keygen`.
-Review the `man` page for your installed `ssh-keygen` command for details.
-
-## See if you have an existing SSH key pair
-
-Before you create a key pair, see if a key pair already exists.
-
-1. On Windows, Linux, or macOS, go to your home directory.
-1. Go to the `.ssh/` subdirectory. If the `.ssh/` subdirectory doesn't exist,
- you are either not in the home directory, or you haven't used `ssh` before.
- In the latter case, you need to [generate an SSH key pair](#generate-an-ssh-key-pair).
-1. See if a file with one of the following formats exists:
-
- | Algorithm | Public key | Private key |
- | --------- | ---------- | ----------- |
- | ED25519 (preferred) | `id_ed25519.pub` | `id_ed25519` |
- | ED25519_SK | `id_ed25519_sk.pub` | `id_ed25519_sk` |
- | ECDSA_SK | `id_ecdsa_sk.pub` | `id_ecdsa_sk` |
- | RSA (at least 2048-bit key size) | `id_rsa.pub` | `id_rsa` |
- | DSA (deprecated) | `id_dsa.pub` | `id_dsa` |
- | ECDSA | `id_ecdsa.pub` | `id_ecdsa` |
-
-## Generate an SSH key pair
-
-If you do not have an existing SSH key pair, generate a new one.
-
-1. Open a terminal.
-1. Type `ssh-keygen -t` followed by the key type and an optional comment.
- This comment is included in the `.pub` file that's created.
- You may want to use an email address for the comment.
-
- For example, for ED25519:
-
- ```shell
- ssh-keygen -t ed25519 -C "<comment>"
- ```
-
- For 2048-bit RSA:
-
- ```shell
- ssh-keygen -t rsa -b 2048 -C "<comment>"
- ```
-
-1. Press Enter. Output similar to the following is displayed:
-
- ```plaintext
- Generating public/private ed25519 key pair.
- Enter file in which to save the key (/home/user/.ssh/id_ed25519):
- ```
-
-1. Accept the suggested filename and directory, unless you are generating a [deploy key](../user/project/deploy_keys/index.md)
- or want to save in a specific directory where you store other keys.
-
- You can also dedicate the SSH key pair to a [specific host](#configure-ssh-to-point-to-a-different-directory).
-
-1. Specify a [passphrase](https://www.ssh.com/academy/ssh/passphrase):
-
- ```plaintext
- Enter passphrase (empty for no passphrase):
- Enter same passphrase again:
- ```
-
-1. A confirmation is displayed, including information about where your files are stored.
-
-A public and private key are generated.
-[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account) and keep
-the private key secure.
-
-### Configure SSH to point to a different directory
-
-If you did not save your SSH key pair in the default directory,
-configure your SSH client to point to the directory where the private key is stored.
-
-1. Open a terminal and run this command:
-
- ```shell
- eval $(ssh-agent -s)
- ssh-add <directory to private SSH key>
- ```
-
-1. Save these settings in the `~/.ssh/config` file. For example:
-
- ```conf
- # GitLab.com
- Host gitlab.com
- PreferredAuthentications publickey
- IdentityFile ~/.ssh/gitlab_com_rsa
-
- # Private GitLab instance
- Host gitlab.company.com
- PreferredAuthentications publickey
- IdentityFile ~/.ssh/example_com_rsa
- ```
-
- For more information on these settings, see the [`man ssh_config`](https://man.openbsd.org/ssh_config) page in the SSH configuration manual.
-
-Public SSH keys must be unique to GitLab because they bind to your account.
-Your SSH key is the only identifier you have when you push code with SSH.
-It must uniquely map to a single user.
-
-### Update your SSH key passphrase
-
-You can update the passphrase for your SSH key.
-
-1. Open a terminal and run this command:
-
- ```shell
- ssh-keygen -p -f /path/to/ssh_key
- ```
-
-1. At the prompts, type the passphrase and press Enter.
-
-### Upgrade your RSA key pair to a more secure format
-
-If your version of OpenSSH is between 6.5 and 7.8,
-you can save your private RSA SSH keys in a more secure
-OpenSSH format.
-
-1. Open a terminal and run this command:
-
- ```shell
- ssh-keygen -o -f ~/.ssh/id_rsa
- ```
-
- Alternatively, you can generate a new RSA key with the more secure encryption format with
- the following command:
-
- ```shell
- ssh-keygen -o -t rsa -b 4096 -C "<comment>"
- ```
-
-## Generate an SSH key pair for a FIDO/U2F hardware security key
-
-To generate ED25519_SK or ECDSA_SK SSH keys, you must use OpenSSH 8.2 or later.
-
-1. Insert a hardware security key into your computer.
-1. Open a terminal.
-1. Type `ssh-keygen -t` followed by the key type and an optional comment.
- This comment is included in the `.pub` file that's created.
- You may want to use an email address for the comment.
-
- For example, for ED25519_SK:
-
- ```shell
- ssh-keygen -t ed25519-sk -C "<comment>"
- ```
-
- For ECDSA_SK:
-
- ```shell
- ssh-keygen -t ecdsa-sk -C "<comment>"
- ```
-
- If your security key supports FIDO2 resident keys, you can enable this when
- creating your SSH key:
-
- ```shell
- ssh-keygen -t ed25519-sk -O resident -C "<comment>"
- ```
-
- `-O resident` indicates that the key should be stored on the FIDO authenticator itself.
- Resident key is easier to import to a new computer because it can be loaded directly
- from the security key by [`ssh-add -K`](https://man.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/ssh-add.1#K)
- or [`ssh-keygen -K`](https://man.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/ssh-keygen#K).
-
-1. Select Enter. Output similar to the following is displayed:
-
- ```plaintext
- Generating public/private ed25519-sk key pair.
- You may need to touch your authenticator to authorize key generation.
- ```
-
-1. Touch the button on the hardware security key.
-
-1. Accept the suggested filename and directory:
-
- ```plaintext
- Enter file in which to save the key (/home/user/.ssh/id_ed25519_sk):
- ```
-
-1. Specify a [passphrase](https://www.ssh.com/academy/ssh/passphrase):
-
- ```plaintext
- Enter passphrase (empty for no passphrase):
- Enter same passphrase again:
- ```
-
-1. A confirmation is displayed, including information about where your files are stored.
-
-A public and private key are generated.
-[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account).
-
-## Add an SSH key to your GitLab account
-
-To use SSH with GitLab, copy your public key to your GitLab account.
-
-1. Copy the contents of your public key file. You can do this manually or use a script.
- For example, to copy an ED25519 key to the clipboard:
-
- **macOS:**
-
- ```shell
- tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy
- ```
-
- **Linux** (requires the `xclip` package):
-
- ```shell
- xclip -sel clip < ~/.ssh/id_ed25519.pub
- ```
-
- **Git Bash on Windows:**
-
- ```shell
- cat ~/.ssh/id_ed25519.pub | clip
- ```
-
- Replace `id_ed25519.pub` with your filename. For example, use `id_rsa.pub` for RSA.
-
-1. Sign in to GitLab.
-1. On the top bar, in the top right corner, select your avatar.
-1. Select **Preferences**.
-1. On the left sidebar, select **SSH Keys**.
-1. In the **Key** box, paste the contents of your public key.
- If you manually copied the key, make sure you copy the entire key,
- which starts with `ssh-rsa`, `ssh-dss`, `ecdsa-sha2-nistp256`, `ecdsa-sha2-nistp384`, `ecdsa-sha2-nistp521`,
- `ssh-ed25519`, `sk-ecdsa-sha2-nistp256@openssh.com`, or `sk-ssh-ed25519@openssh.com`, 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](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
- guidance when [deleting keys](../user/admin_area/credentials_inventory.md#delete-a-users-ssh-key).
- - GitLab 14.0 and later, the expiration date is enforced. Administrators can
- [allow expired keys to be used](../user/admin_area/settings/account_and_limit_settings.md#allow-expired-ssh-keys-to-be-used-deprecated).
- - GitLab checks all SSH keys at 02:00 AM UTC every day. It emails an expiration notice for all SSH keys that expire on the current date. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
- - GitLab checks all SSH keys at 01:00 AM UTC every day. It emails an expiration notice for all SSH keys that are scheduled to expire seven days from now. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
-1. Select **Add key**.
-
-## Verify that you can connect
-
-Verify that your SSH key was added correctly.
-
-1. For GitLab.com, to ensure you're connecting to the correct server, confirm the
- [SSH host keys fingerprints](../user/gitlab_com/index.md#ssh-host-keys-fingerprints).
-1. Open a terminal and run this command, replacing `gitlab.example.com` with your GitLab instance URL:
-
- ```shell
- ssh -T git@gitlab.example.com
- ```
-
-1. If this is the first time you connect, you should verify the
- authenticity of the GitLab host. If you see a message like:
-
- ```plaintext
- The authenticity of host 'gitlab.example.com (35.231.145.151)' can't be established.
- ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
- Are you sure you want to continue connecting (yes/no)? yes
- Warning: Permanently added 'gitlab.example.com' (ECDSA) to the list of known hosts.
- ```
-
- Type `yes` and press Enter.
-
-1. Run the `ssh -T git@gitlab.example.com` command again. You should receive a _Welcome to GitLab, `@username`!_ message.
-
-If the welcome message doesn't appear, you can troubleshoot by running `ssh`
-in verbose mode:
-
-```shell
-ssh -Tvvv git@gitlab.example.com
-```
-
-## Use different keys for different repositories
-
-You can use a different key for each repository.
-
-Open a terminal and run this command:
-
-```shell
-git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/private-key-filename-for-this-repository -F /dev/null"
-```
-
-This command does not use the SSH Agent and requires Git 2.10 or later. For more information
-on `ssh` command options, see the `man` pages for both `ssh` and `ssh_config`.
-
-## Use different accounts on a single GitLab instance
-
-You can use multiple accounts to connect to a single instance of GitLab.
-You can do this by using the command in the [previous topic](#use-different-keys-for-different-repositories).
-However, even if you set `IdentitiesOnly` to `yes`, you cannot sign in if an `IdentityFile` exists
-outside of a `Host` block.
-
-Instead, you can assign aliases to hosts in the `~.ssh/config` file.
-
-- For the `Host`, use an alias like `user_1.gitlab.com` and
- `user_2.gitlab.com`. Advanced configurations
- are more difficult to maintain, and these strings are easier to
- understand when you use tools like `git remote`.
-- For the `IdentityFile`, use the path the private key.
-
-```conf
-# User1 Account Identity
-Host <user_1.gitlab.com>
- Hostname gitlab.com
- PreferredAuthentications publickey
- IdentityFile ~/.ssh/<example_ssh_key1>
-
-# User2 Account Identity
-Host <user_2.gitlab.com>
- Hostname gitlab.com
- PreferredAuthentications publickey
- IdentityFile ~/.ssh/<example_ssh_key2>
-```
-
-Now, to clone a repository for `user_1`, use `user_1.gitlab.com` in the `git clone` command:
-
-```shell
-git clone git@<user_1.gitlab.com>:gitlab-org/gitlab.git
-```
-
-To update a previously-cloned repository that is aliased as `origin`:
-
-```shell
-git remote set-url origin git@<user_1.gitlab.com>:gitlab-org/gitlab.git
-```
-
-NOTE:
-Private and public keys contain sensitive data. Ensure the permissions
-on the files make them readable to you but not accessible to others.
-
-## Configure two-factor authentication (2FA)
-
-You can set up two-factor authentication (2FA) for
-[Git over SSH](../security/two_factor_authentication.md#2fa-for-git-over-ssh-operations). We recommend using
-[ED25519_SK](#ed25519_sk-ssh-keys) or [ECDSA_SK](#ecdsa_sk-ssh-keys) SSH keys.
-
-## Use EGit on Eclipse
-
-If you are using [EGit](https://www.eclipse.org/egit/), you can [add your SSH key to Eclipse](https://wiki.eclipse.org/EGit/User_Guide#Eclipse_SSH_Configuration).
-
-## 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)
-with [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install#update-to-wsl-2) which
-has both `git` and `ssh` preinstalled, or install [Git for Windows](https://gitforwindows.org) to
-use SSH through Powershell.
-
-The SSH key generated in WSL is not directly available for Git for Windows, and vice versa,
-as both have a different home directory:
-
-- WSL: `/home/<user>`
-- Git for Windows: `C:\Users\<user>`
-
-You can either copy over the `.ssh/` directory to use the same key, or generate a key in each environment.
-
-Alternative tools include:
-
-- [Cygwin](https://www.cygwin.com)
-- [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
-
-## Overriding SSH settings on the GitLab server
-
-GitLab integrates with the system-installed SSH daemon and designates a user
-(typically named `git`) through which all access requests are handled. Users
-who connect to the GitLab server over SSH are identified by their SSH key instead
-of their username.
-
-SSH *client* operations performed on the GitLab server are executed as this
-user. You can modify this SSH configuration. For example, you can specify
-a private SSH key for this user to use for authentication requests. However, this practice
-is **not supported** and is strongly discouraged as it presents significant
-security risks.
-
-GitLab checks for this condition, and directs you
-to this section if your server is configured this way. For example:
-
-```shell
-$ gitlab-rake gitlab:check
-
-Git user has default SSH configuration? ... no
- Try fixing it:
- mkdir ~/gitlab-check-backup-1504540051
- sudo mv /var/lib/git/.ssh/id_rsa ~/gitlab-check-backup-1504540051
- sudo mv /var/lib/git/.ssh/id_rsa.pub ~/gitlab-check-backup-1504540051
- For more information see:
- [Overriding SSH settings on the GitLab server](#overriding-ssh-settings-on-the-gitlab-server)
- Please fix the error above and rerun the checks.
-```
-
-Remove the custom configuration as soon as you can. These customizations
-are **explicitly not supported** and may stop working at any time.
-
-## Troubleshooting
-
-### Password prompt with `git clone`
-
-When you run `git clone`, you may be prompted for a password, like `git@gitlab.example.com's password:`.
-This indicates that something is wrong with your SSH setup.
-
-- Ensure that you generated your SSH key pair correctly and added the public SSH
- key to your GitLab profile.
-- Try to manually register your private SSH key by using `ssh-agent`.
-- Try to debug the connection by running `ssh -Tv git@example.com`.
- Replace `example.com` with your GitLab URL.
-
-### `Could not resolve hostname` error
-
-You may receive the following error when [verifying that you can connect](#verify-that-you-can-connect):
-
-```shell
-ssh: Could not resolve hostname gitlab.example.com: nodename nor servname provided, or not known
-```
-
-If you receive this error, restart your terminal and try the command again.
-
-### `Key enrollment failed: invalid format` error
-
-You may receive the following error when [generating an SSH key pair for a FIDO/U2F hardware security key](#generate-an-ssh-key-pair-for-a-fidou2f-hardware-security-key):
-
-```shell
-Key enrollment failed: invalid format
-```
-
-You can troubleshoot this by trying the following:
-
-- Run the `ssh-keygen` command using `sudo`.
-- Verify your IDO/U2F hardware security key supports
- the key type provided.
-- Verify the version of OpenSSH is 8.2 or greater by
- running `ssh -v`.
+<!-- This redirect file can be deleted after <2022-06-18>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index 7ca3a3ffade..17eafb7633e 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -21,7 +21,7 @@ the tiers are no longer mentioned in GitLab documentation:
- [Code owners](../user/project/code_owners.md)
- Description templates:
- [Setting a default template for merge requests and issues](../user/project/description_templates.md#set-a-default-template-for-merge-requests-and-issues)
-- [Email from GitLab](../tools/email.md)
+- [Email from GitLab](../user/admin_area/email_from_gitlab.md)
- Groups:
- [Creating group memberships via CN](../user/group/index.md#create-group-links-via-cn)
- [Group push rules](../user/group/index.md#group-push-rules)
diff --git a/doc/subscriptions/img/support-diagram.png b/doc/subscriptions/img/support-diagram.png
deleted file mode 100644
index 1628a62f19a..00000000000
--- a/doc/subscriptions/img/support-diagram.png
+++ /dev/null
Binary files differ
diff --git a/doc/subscriptions/img/support_diagram_c.png b/doc/subscriptions/img/support_diagram_c.png
new file mode 100644
index 00000000000..a2fed80e912
--- /dev/null
+++ b/doc/subscriptions/img/support_diagram_c.png
Binary files differ
diff --git a/doc/subscriptions/index.md b/doc/subscriptions/index.md
index 6c5543edb58..824fe0bacde 100644
--- a/doc/subscriptions/index.md
+++ b/doc/subscriptions/index.md
@@ -34,8 +34,8 @@ GitLab SaaS or GitLab self-managed:
your own GitLab instance.
On a GitLab self-managed instance, a GitLab subscription provides the same set of
-features for _all_ users. On GitLab SaaS, you can apply a subscription to either
-a group or a personal namespace.
+features for _all_ users. On GitLab SaaS, you can apply a subscription to a group
+namespace. You cannot apply a subscription to a personal namespace.
NOTE:
Subscriptions cannot be transferred between GitLab SaaS and GitLab self-managed.
@@ -256,12 +256,11 @@ Send all questions and requests related to the GitLab for Startups program to `s
### Support for Community Programs
-Because these Community Programs are free of cost, regular Priority Support is not included. However, it can be purchased at a 95% discount in some cases.
-If interested, email the relevant community program team: `education@gitlab.com`, `opensource@gitlab.com`, or `startups@gitlab.com`.
+Because these Community Programs are free of cost, regular Priority Support is not included.
As a community member, you can follow this diagram to find support:
-![Support diagram](img/support-diagram.png)
+![Support diagram](img/support_diagram_c.png)
## Contact Support
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index d38b56bb1f8..6765ca19518 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -126,31 +126,6 @@ Cloud licensing manages licenses for self-managed GitLab subscription plans. Clo
- Activation: Unlock plan features and activate your self-managed instance by using an activation code.
- License sync: Sync subscription data between your self-managed instance and GitLab.
-### What cloud licensing includes
-
-#### Auto-renewals
-
-For renewals that occur on or after 2021-08-01, your subscriptions will auto-renew.
-You have the option to manually cancel in the Customers Portal any time until thirty (30) days before renewal.
-
-#### Cloud licensing
-
-You can activate and manage your GitLab licenses by using the Customers Portal.
-This feature was formerly known as Seat Link.
-
-#### Operational data
-
-Service data helps GitLab improve the product experience and provide proactive support.
-Most data is categorized as optional and can be disabled. Data that is categorized as
-operational, like number of issues, pipelines, merge requests, and version, is not configurable.
-
-Please see our [service usage privacy page](https://about.gitlab.com/handbook/legal/privacy/services-usage-data/)
-for details on what information is collected.
-
-#### Quarterly subscription reconciliation
-
-See the [quarterly subscription reconciliation section](../quarterly_reconciliation.md) for more information.
-
### How cloud licensing works
#### Add your license
@@ -173,6 +148,9 @@ This sync job runs daily around 3AM UTC. If the job fails, it is retried up to 1
The daily job provides **only** the following information to the Customers Portal:
+- Company name
+- Licensee name
+- Licensee email
- Date
- Timestamp
- License key
@@ -268,22 +246,22 @@ instance, ensure you're purchasing enough seats to
If you are an administrator, you can view the status of your subscription:
1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **License**.
+1. On the left sidebar, select **Subscription**.
-The **License** page includes the following details:
+The **Subscription** page includes the following details:
- Licensee
- Plan
- When it was uploaded, started, and when it expires
-It also displays the following important statistics:
+It also displays the following information:
| Field | Description |
|:-------------------|:------------|
| Users in License | The number of users you've paid for in the current license loaded on the system. The number does not change unless you [add seats](#add-seats-to-a-subscription) during your current subscription period. |
| Billable users | The daily count of billable users on your system. The count may change as you block or add users to your instance. |
| Maximum users | The highest number of billable users on your system during the term of the loaded license. |
-| Users over license | Calculated as `Maximum users` - `Users in License` for the current license term. This number incurs a retroactive charge that needs to be paid for at renewal. |
+| Users over license | Calculated as `Maximum users` - `Users in License` for the current license term. This number incurs a retroactive charge that must be paid before renewal. |
## Export your license usage
@@ -295,7 +273,7 @@ If you are an administrator, you can export your license usage into a CSV:
1. On the left sidebar, select **Subscription**.
1. In the top right, select **Export license usage file**.
-This file contains all the information GitLab needs to manually process quarterly reconciliations or renewals. If your instance is firewalled or air-gapped, you can provide GitLab with this information.
+This file contains the information GitLab uses to manually process quarterly reconciliations or renewals. If your instance is firewalled or air-gapped, you must provide GitLab with this information.
The **License Usage** CSV includes the following details:
diff --git a/doc/system_hooks/system_hooks.md b/doc/system_hooks/system_hooks.md
index 71d7e7f1426..c30e2703a29 100644
--- a/doc/system_hooks/system_hooks.md
+++ b/doc/system_hooks/system_hooks.md
@@ -1,771 +1,11 @@
---
-stage: Ecosystem
-group: Integrations
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../administration/system_hooks.md'
+remove_date: '2022-06-18'
---
-# System hooks **(FREE SELF)**
+This document was moved to [another location](../administration/system_hooks.md).
-Your GitLab instance can perform HTTP POST requests on the following events:
-
-- `group_create`
-- `group_destroy`
-- `group_rename`
-- `key_create`
-- `key_destroy`
-- `project_create`
-- `project_destroy`
-- `project_rename`
-- `project_transfer`
-- `project_update`
-- `repository_update`
-- `user_add_to_group`
-- `user_add_to_team`
-- `user_create`
-- `user_destroy`
-- `user_failed_login`
-- `user_remove_from_group`
-- `user_remove_from_team`
-- `user_rename`
-- `user_update_for_group`
-- `user_update_for_team`
-
-The triggers for most of these are self-explanatory, but `project_update` and
-`project_rename` deserve some clarification: `project_update` is fired any time
-an attribute of a project is changed (including name, description, and tags)
-_unless_ the `path` attribute is also changed. In that case, a `project_rename`
-is triggered instead (so that, for instance, if all you care about is the
-repository URL, you can just listen for `project_rename`).
-
-`user_failed_login` is sent whenever a _blocked_ user attempts to sign in and is
-denied access.
-
-System hooks can be used, for example, for logging or changing information in an
-LDAP server.
-
-In addition to these default events, you can enable triggers for other events,
-such as push events, and disable the `repository_update` event
-when you create a system hook.
-
-NOTE:
-We follow the same structure and deprecations as [Webhooks](../user/project/integrations/webhooks.md)
-for Push and Tag events, but we never display commits.
-
-## Create a system hook
-
-To create a system hook:
-
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **System Hooks**.
-1. Provide the **URL** and **Secret Token**.
-1. Select the checkbox next to each optional **Trigger** you want to enable.
-1. Select **Enable SSL verification**, if desired.
-1. Click **Add system hook**.
-
-## Hooks request example
-
-**Request header**:
-
-```plaintext
-X-Gitlab-Event: System Hook
-```
-
-**Project created:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:54Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "project_create",
- "name": "StoreCloud",
- "owner_email": "johnsmith@example.com",
- "owner_name": "John Smith",
- "owners": [{
- "name": "John",
- "email": "user1@example.com"
- }],
- "path": "storecloud",
- "path_with_namespace": "jsmith/storecloud",
- "project_id": 74,
- "project_visibility": "private"
-}
-```
-
-**Project destroyed:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:58Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "project_destroy",
- "name": "Underscore",
- "owner_email": "johnsmith@example.com",
- "owner_name": "John Smith",
- "owners": [{
- "name": "John",
- "email": "user1@example.com"
- }],
- "path": "underscore",
- "path_with_namespace": "jsmith/underscore",
- "project_id": 73,
- "project_visibility": "internal"
-}
-```
-
-**Project renamed:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:58Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "project_rename",
- "name": "Underscore",
- "path": "underscore",
- "path_with_namespace": "jsmith/underscore",
- "project_id": 73,
- "owner_name": "John Smith",
- "owner_email": "johnsmith@example.com",
- "owners": [{
- "name": "John",
- "email": "user1@example.com"
- }],
- "project_visibility": "internal",
- "old_path_with_namespace": "jsmith/overscore"
-}
-```
-
-Note that `project_rename` is not triggered if the namespace changes.
-Please refer to `group_rename` and `user_rename` for that case.
-
-**Project transferred:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:58Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "project_transfer",
- "name": "Underscore",
- "path": "underscore",
- "path_with_namespace": "scores/underscore",
- "project_id": 73,
- "owner_name": "John Smith",
- "owner_email": "johnsmith@example.com",
- "owners": [{
- "name": "John",
- "email": "user1@example.com"
- }],
- "project_visibility": "internal",
- "old_path_with_namespace": "jsmith/overscore"
-}
-```
-
-**Project updated:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:54Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "project_update",
- "name": "StoreCloud",
- "owner_email": "johnsmith@example.com",
- "owner_name": "John Smith",
- "owners": [{
- "name": "John",
- "email": "user1@example.com"
- }],
- "path": "storecloud",
- "path_with_namespace": "jsmith/storecloud",
- "project_id": 74,
- "project_visibility": "private"
-}
-```
-
-**New Team Member:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:56Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "user_add_to_team",
- "access_level": "Maintainer",
- "project_id": 74,
- "project_name": "StoreCloud",
- "project_path": "storecloud",
- "project_path_with_namespace": "jsmith/storecloud",
- "user_email": "johnsmith@example.com",
- "user_name": "John Smith",
- "user_username": "johnsmith",
- "user_id": 41,
- "project_visibility": "private"
-}
-```
-
-**Team Member Removed:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:56Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "user_remove_from_team",
- "access_level": "Maintainer",
- "project_id": 74,
- "project_name": "StoreCloud",
- "project_path": "storecloud",
- "project_path_with_namespace": "jsmith/storecloud",
- "user_email": "johnsmith@example.com",
- "user_name": "John Smith",
- "user_username": "johnsmith",
- "user_id": 41,
- "project_visibility": "private"
-}
-```
-
-**Team Member Updated:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:56Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "user_update_for_team",
- "access_level": "Maintainer",
- "project_id": 74,
- "project_name": "StoreCloud",
- "project_path": "storecloud",
- "project_path_with_namespace": "jsmith/storecloud",
- "user_email": "johnsmith@example.com",
- "user_name": "John Smith",
- "user_username": "johnsmith",
- "user_id": 41,
- "project_visibility": "private"
-}
-```
-
-**User created:**
-
-```json
-{
- "created_at": "2012-07-21T07:44:07Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "email": "js@gitlabhq.com",
- "event_name": "user_create",
- "name": "John Smith",
- "username": "js",
- "user_id": 41
-}
-```
-
-**User removed:**
-
-```json
-{
- "created_at": "2012-07-21T07:44:07Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "email": "js@gitlabhq.com",
- "event_name": "user_destroy",
- "name": "John Smith",
- "username": "js",
- "user_id": 41
-}
-```
-
-**User failed login:**
-
-```json
-{
- "event_name": "user_failed_login",
- "created_at": "2017-10-03T06:08:48Z",
- "updated_at": "2018-01-15T04:52:06Z",
- "name": "John Smith",
- "email": "user4@example.com",
- "user_id": 26,
- "username": "user4",
- "state": "blocked"
-}
-```
-
-If the user is blocked via LDAP, `state` is `ldap_blocked`.
-
-**User renamed:**
-
-```json
-{
- "event_name": "user_rename",
- "created_at": "2017-11-01T11:21:04Z",
- "updated_at": "2017-11-01T14:04:47Z",
- "name": "new-name",
- "email": "best-email@example.tld",
- "user_id": 58,
- "username": "new-exciting-name",
- "old_username": "old-boring-name"
-}
-```
-
-**Key added**
-
-```json
-{
- "event_name": "key_create",
- "created_at": "2014-08-18 18:45:16 UTC",
- "updated_at": "2012-07-21T07:38:22Z",
- "username": "root",
- "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC58FwqHUbebw2SdT7SP4FxZ0w+lAO/erhy2ylhlcW/tZ3GY3mBu9VeeiSGoGz8hCx80Zrz+aQv28xfFfKlC8XQFpCWwsnWnQqO2Lv9bS8V1fIHgMxOHIt5Vs+9CAWGCCvUOAurjsUDoE2ALIXLDMKnJxcxD13XjWdK54j6ZXDB4syLF0C2PnAQSVY9X7MfCYwtuFmhQhKaBussAXpaVMRHltie3UYSBUUuZaB3J4cg/7TxlmxcNd+ppPRIpSZAB0NI6aOnqoBCpimscO/VpQRJMVLr3XiSYeT6HBiDXWHnIVPfQc03OGcaFqOit6p8lYKMaP/iUQLm+pgpZqrXZ9vB john@localhost",
- "id": 4
-}
-```
-
-**Key removed**
-
-```json
-{
- "event_name": "key_destroy",
- "created_at": "2014-08-18 18:45:16 UTC",
- "updated_at": "2012-07-21T07:38:22Z",
- "username": "root",
- "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC58FwqHUbebw2SdT7SP4FxZ0w+lAO/erhy2ylhlcW/tZ3GY3mBu9VeeiSGoGz8hCx80Zrz+aQv28xfFfKlC8XQFpCWwsnWnQqO2Lv9bS8V1fIHgMxOHIt5Vs+9CAWGCCvUOAurjsUDoE2ALIXLDMKnJxcxD13XjWdK54j6ZXDB4syLF0C2PnAQSVY9X7MfCYwtuFmhQhKaBussAXpaVMRHltie3UYSBUUuZaB3J4cg/7TxlmxcNd+ppPRIpSZAB0NI6aOnqoBCpimscO/VpQRJMVLr3XiSYeT6HBiDXWHnIVPfQc03OGcaFqOit6p8lYKMaP/iUQLm+pgpZqrXZ9vB john@localhost",
- "id": 4
-}
-```
-
-**Group created:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:54Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "group_create",
- "name": "StoreCloud",
- "path": "storecloud",
- "group_id": 78
-}
-```
-
-**Group removed:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:54Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "group_destroy",
- "name": "StoreCloud",
- "path": "storecloud",
- "group_id": 78
-}
-```
-
-**Group renamed:**
-
-```json
-{
- "event_name": "group_rename",
- "created_at": "2017-10-30T15:09:00Z",
- "updated_at": "2017-11-01T10:23:52Z",
- "name": "Better Name",
- "path": "better-name",
- "full_path": "parent-group/better-name",
- "group_id": 64,
- "old_path": "old-name",
- "old_full_path": "parent-group/old-name"
-}
-```
-
-**New Group Member:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:56Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "user_add_to_group",
- "group_access": "Maintainer",
- "group_id": 78,
- "group_name": "StoreCloud",
- "group_path": "storecloud",
- "user_email": "johnsmith@example.com",
- "user_name": "John Smith",
- "user_username": "johnsmith",
- "user_id": 41
-}
-```
-
-**Group Member Removed:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:56Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "user_remove_from_group",
- "group_access": "Maintainer",
- "group_id": 78,
- "group_name": "StoreCloud",
- "group_path": "storecloud",
- "user_email": "johnsmith@example.com",
- "user_name": "John Smith",
- "user_username": "johnsmith",
- "user_id": 41
-}
-```
-
-**Group Member Updated:**
-
-```json
-{
- "created_at": "2012-07-21T07:30:56Z",
- "updated_at": "2012-07-21T07:38:22Z",
- "event_name": "user_update_for_group",
- "group_access": "Maintainer",
- "group_id": 78,
- "group_name": "StoreCloud",
- "group_path": "storecloud",
- "user_email": "johnsmith@example.com",
- "user_name": "John Smith",
- "user_username": "johnsmith",
- "user_id": 41
-}
-```
-
-## Push events
-
-Triggered when you push to the repository, except when pushing tags.
-It generates one event per modified branch.
-
-**Request header**:
-
-```plaintext
-X-Gitlab-Event: System Hook
-```
-
-**Request body:**
-
-```json
-{
- "event_name": "push",
- "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
- "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
- "ref": "refs/heads/master",
- "checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
- "user_id": 4,
- "user_name": "John Smith",
- "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":{
- "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": "c5feabde2d8cd023215af4d2ceeb7a64839fc428",
- "message": "Add simple search to projects in public area",
- "timestamp": "2013-05-13T18:18:08+00:00",
- "url": "https://dev.gitlab.org/gitlab/gitlabhq/commit/c5feabde2d8cd023215af4d2ceeb7a64839fc428",
- "author": {
- "name": "Example User",
- "email": "user@example.com"
- }
- }
- ],
- "total_commits_count": 1
-}
-```
-
-## Tag events
-
-Triggered when you create (or delete) tags to the repository.
-It generates one event per modified tag.
-
-**Request header**:
-
-```plaintext
-X-Gitlab-Event: System Hook
-```
-
-**Request body:**
-
-```json
-{
- "event_name": "tag_push",
- "before": "0000000000000000000000000000000000000000",
- "after": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
- "ref": "refs/tags/v1.0.0",
- "checkout_sha": "5937ac0a7beb003549fc5fd26fc247adbce4a52e",
- "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":{
- "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
-}
-```
-
-## 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: 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=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
- }]
- }
- }
-}
-```
-
-## Repository Update events
-
-Triggered only once when you push to the repository (including tags).
-
-**Request header**:
-
-```plaintext
-X-Gitlab-Event: System Hook
-```
-
-**Request body:**
-
-```json
-{
- "event_name": "repository_update",
- "user_id": 1,
- "user_name": "John Smith",
- "user_email": "admin@example.com",
- "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
- "project_id": 1,
- "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",
- "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"
- },
- "changes": [
- {
- "before":"8205ea8d81ce0c6b90fbe8280d118cc9fdad6130",
- "after":"4045ea7a3df38697b3730a20fb73c8bed8a3e69e",
- "ref":"refs/heads/master"
- }
- ],
- "refs":["refs/heads/master"]
-}
-```
-
-## Local requests in system hooks
-
-[Requests to local network by system hooks](../security/webhooks.md) can be allowed
-or blocked by an administrator.
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+<!-- This redirect file can be deleted after <2022-06-18>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/tools/email.md b/doc/tools/email.md
index 0a3e37719a4..1d46a63bae4 100644
--- a/doc/tools/email.md
+++ b/doc/tools/email.md
@@ -1,60 +1,11 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: howto, reference
+redirect_to: '../user/admin_area/email_from_gitlab.md'
+remove_date: '2022-06-18'
---
-# Email from GitLab **(PREMIUM SELF)**
+This document was moved to [another location](../user/admin_area/email_from_gitlab.md).
-GitLab provides a tool to administrators for emailing all users, or users of
-a chosen group or project, right from the Admin Area. Users receive the email
-at their primary email address.
-
-For information about email notifications originating from GitLab, read
-[GitLab notification emails](../user/profile/notifications.md).
-
-## Use-cases
-
-- Notify your users about a new project, a new feature, or a new product launch.
-- Notify your users about a new deployment, or that downtime is expected
- for a particular reason.
-
-## Sending emails to users from within GitLab
-
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Overview > Users**.
-1. Select **Send email to users**.
-
- ![administrators](email1.png)
-
-1. Compose an email and choose where to send it (all users or users of a
- chosen group or project). The email body only supports plain text messages.
- HTML, Markdown, and other rich text formats are not supported, and is
- sent as plain text to users.
-
- ![compose an email](email2.png)
-
-NOTE:
-[Starting with GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/31509), email notifications can be sent only once every 10 minutes. This helps minimize performance issues.
-
-## Unsubscribing from emails
-
-Users can choose to unsubscribe from receiving emails from GitLab by following
-the unsubscribe link in the email. Unsubscribing is unauthenticated in order
-to keep this feature simple.
-
-On unsubscribe, users receive an email notification that unsubscribe happened.
-The endpoint that provides the unsubscribe option is rate-limited.
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+<!-- This redirect file can be deleted after <2022-06-18>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/topics/authentication/index.md b/doc/topics/authentication/index.md
index 9ab6235164a..ef7598248fe 100644
--- a/doc/topics/authentication/index.md
+++ b/doc/topics/authentication/index.md
@@ -10,7 +10,7 @@ This page gathers all the resources for the topic **Authentication** within GitL
## GitLab users
-- [SSH](../../ssh/index.md)
+- [SSH](../../user/ssh.md)
- [Two-factor authentication](../../user/profile/account/two_factor_authentication.md)
- [Why do I keep getting signed out?](../../user/profile/index.md#why-do-i-keep-getting-signed-out)
- **Articles:**
diff --git a/doc/topics/git/how_to_install_git/index.md b/doc/topics/git/how_to_install_git/index.md
index 422919ea46c..1d1264fecf3 100644
--- a/doc/topics/git/how_to_install_git/index.md
+++ b/doc/topics/git/how_to_install_git/index.md
@@ -79,7 +79,7 @@ Go to the [Git website](https://git-scm.com/), and then download and install Git
## After you install Git
-After you successfully install Git on your computer, read about [adding an SSH key to GitLab](../../../ssh/index.md).
+After you successfully install Git on your computer, read about [adding an SSH key to GitLab](../../../user/ssh.md).
<!-- ## Troubleshooting
diff --git a/doc/topics/git/index.md b/doc/topics/git/index.md
index e95d8121b66..54af1e99797 100644
--- a/doc/topics/git/index.md
+++ b/doc/topics/git/index.md
@@ -26,10 +26,11 @@ The following resources can help you get started with Git:
- [Git-ing started with Git](https://www.youtube.com/watch?v=Ce5nz5n41z4),
a video introduction to Git.
+- [Make your first Git commit](../../tutorials/make_your_first_git_commit.md)
- [Git Basics](https://git-scm.com/book/en/v2/Getting-Started-Git-Basics)
- [Git on the Server - GitLab](https://git-scm.com/book/en/v2/Git-on-the-Server-GitLab)
- [How to install Git](how_to_install_git/index.md)
-- [Git terminology](../../gitlab-basics/start-using-git.md#git-terminology)
+- [Git terminology](terminology.md)
- [Start using Git on the command line](../../gitlab-basics/start-using-git.md)
- [Edit files through the command line](../../gitlab-basics/command-line-commands.md)
- [GitLab Git Cheat Sheet (download)](https://about.gitlab.com/images/press/git-cheat-sheet.pdf)
diff --git a/doc/topics/git/lfs/index.md b/doc/topics/git/lfs/index.md
index 977f51a7211..db63cee3523 100644
--- a/doc/topics/git/lfs/index.md
+++ b/doc/topics/git/lfs/index.md
@@ -10,7 +10,7 @@ disqus_identifier: 'https://docs.gitlab.com/ee/workflow/lfs/lfs/index.html'
Managing large files such as audio, video and graphics files has always been one
of the shortcomings of Git. The general recommendation is to not have Git repositories
-larger than 1GB to preserve performance.
+larger than 1 GB to preserve performance.
![Git LFS tracking status](img/lfs-icon.png)
@@ -19,7 +19,7 @@ blob or an LFS pointer.
## How it works
-Git LFS client talks with the GitLab server over HTTPS. It uses HTTP Basic Authentication
+Git LFS client communicates with the GitLab server over HTTPS. It uses HTTP Basic Authentication
to authorize client requests. After the request is authorized, Git LFS client receives
instructions from where to fetch or where to push the large file.
@@ -29,29 +29,23 @@ Documentation for GitLab instance administrators is under [LFS administration do
## Requirements
-- Git LFS is supported in GitLab starting with version 8.2
-- Git LFS must be enabled under project settings
-- [Git LFS client](https://git-lfs.github.com) version 1.0.1 and up must be installed
+- Git LFS must be [enabled in project settings](../../../user/project/settings/index.md#sharing-and-permissions).
+- [Git LFS client](https://git-lfs.github.com) version 1.0.1 or higher must be installed.
## Known limitations
- Git LFS v1 original API is not supported, because it was deprecated early in LFS
development.
- When SSH is set as a remote, Git LFS objects still go through HTTPS.
-- Any Git LFS request asks for HTTPS credentials to be provided so a good Git
- credentials store is recommended.
+- Any Git LFS request asks for HTTPS credentials, so we recommend a good Git
+ credentials store.
- Git LFS always assumes HTTPS so if you have GitLab server on HTTP you must
[add the URL to Git configuration manually](#troubleshooting).
- [Group wikis](../../../user/project/wiki/group.md) do not support Git LFS.
-NOTE:
-With 8.12 GitLab added LFS support to SSH. The Git LFS communication
-still goes over HTTP, but now the SSH client passes the correct credentials
-to the Git LFS client. No action is required by the user.
-
## Using Git LFS
-Lets take a look at the workflow when you need to check large files into your Git
+Let's take a look at the workflow when you need to check large files into your Git
repository with Git LFS. For example, if you want to upload a very large file and
check it into your Git repository:
@@ -68,7 +62,7 @@ Git as usual without redoing the command to track a file with the same extension
cp ~/tmp/debian.iso ./ # copy a large file into the current directory
git add . # add the large file to the project
git commit -am "Added Debian iso" # commit the file meta data
-git push origin master # sync the git repo and large file to the GitLab server
+git push origin main # sync the git repo and large file to the GitLab server
```
**Make sure** that `.gitattributes` is tracked by Git. Otherwise Git
@@ -91,7 +85,7 @@ If you already cloned the repository and you want to get the latest LFS object
that are on the remote repository, such as for a branch from origin:
```shell
-git lfs fetch origin master
+git lfs fetch origin main
```
Make sure your files aren't listed in `.gitignore`, otherwise, they are ignored by Git
diff --git a/doc/topics/git/terminology.md b/doc/topics/git/terminology.md
new file mode 100644
index 00000000000..35814543934
--- /dev/null
+++ b/doc/topics/git/terminology.md
@@ -0,0 +1,62 @@
+---
+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
+---
+
+# Git terminology
+
+The following are commonly-used Git terms.
+
+## Repository
+
+In GitLab, files are stored in a **repository**. A repository is similar to how you
+store files in a folder or directory on your computer.
+
+- A **remote repository** refers to the files in GitLab.
+- A **local copy** refers to the files on your computer.
+
+<!-- vale gitlab.Spelling = NO -->
+<!-- vale gitlab.SubstitutionWarning = NO -->
+Often, the word "repository" is shortened to "repo".
+<!-- vale gitlab.Spelling = YES -->
+<!-- vale gitlab.SubstitutionWarning = YES -->
+
+In GitLab, a repository is contained in a **project**.
+
+## Fork
+
+When you want to contribute to someone else's repository, you make a copy of it.
+This copy is called a [**fork**](../../user/project/repository/forking_workflow.md#creating-a-fork).
+The process is called "creating a fork."
+
+When you fork a repo, you create a copy of the project in your own
+[namespace](../../user/group/#namespaces). You then have write permissions to modify the project files
+and settings.
+
+For example, you can fork this project, <https://gitlab.com/gitlab-tests/sample-project/>, into your namespace.
+You now have your own copy of the repository. You can view the namespace in the URL, for example
+`https://gitlab.com/your-namespace/sample-project/`.
+Then you can clone the repository to your local machine, work on the files, and submit changes back to the
+original repository.
+
+## Difference between download and clone
+
+To create a copy of a remote repository's files on your computer, you can either
+**download** or **clone** the repository. If you download it, you cannot sync the repository with the
+remote repository on GitLab.
+
+[Cloning](../../gitlab-basics/start-using-git.md#clone-a-repository) a repository is the same as downloading, except it preserves the Git connection
+with the remote repository. You can then modify the files locally and
+upload the changes to the remote repository on GitLab.
+
+## Pull and push
+
+After you save a local copy of a repository and modify the files on your computer, you can upload the
+changes to GitLab. This is referred to as **pushing** to the remote, because you use the command
+[`git push`](../../gitlab-basics/start-using-git.md#send-changes-to-gitlabcom).
+
+When the remote repository changes, your local copy is behind. You can update your local copy with the new
+changes in the remote repository.
+This is referred to as **pulling** from the remote, because you use the command
+[`git pull`](../../gitlab-basics/start-using-git.md#download-the-latest-changes-in-the-project).
diff --git a/doc/topics/git/troubleshooting_git.md b/doc/topics/git/troubleshooting_git.md
index f881826e74a..0aadde7f7c2 100644
--- a/doc/topics/git/troubleshooting_git.md
+++ b/doc/topics/git/troubleshooting_git.md
@@ -45,7 +45,7 @@ set to 50MB. The default is 1MB.
**If pushing over SSH**, first check your SSH configuration as 'Broken pipe'
errors can sometimes be caused by underlying issues with SSH (such as
authentication). Make sure that SSH is correctly configured by following the
-instructions in the [SSH troubleshooting](../../ssh/index.md#password-prompt-with-git-clone) documentation.
+instructions in the [SSH troubleshooting](../../user/ssh.md#password-prompt-with-git-clone) documentation.
If you're a GitLab administrator with server access, you can also prevent
session timeouts by configuring SSH `keep-alive` on the client or the server.
@@ -232,3 +232,38 @@ too small, the error persists.
Modifying the server is not always an option, and introduces more potential risk.
Attempt local changes first.
+
+## Password expired error on Git fetch via SSH for LDAP user
+
+If `git fetch` returns this `HTTP 403 Forbidden` error on a self-managed instance of
+GitLab, the password expiration date (`users.password_expires_at`) for this user in the
+GitLab database is a date in the past:
+
+```plaintext
+Your password expired. Please access GitLab from a web browser to update your password.
+```
+
+Requests made with a SSO account and where `password_expires_at` is not `null`
+return this error:
+
+```plaintext
+"403 Forbidden - Your password expired. Please access GitLab from a web browser to update your password."
+```
+
+To resolve this issue, you can update the password expiration by either:
+
+- Using the `gitlab-rails console`:
+
+ ```ruby
+ gitlab-rails console
+ user.update!(password_expires_at: nil)
+ ```
+
+- Using `gitlab-psql`:
+
+ ```sql
+ # gitlab-psql
+ UPDATE users SET password_expires_at = null WHERE username='<USERNAME>';
+ ```
+
+The bug was reported [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/332455).
diff --git a/doc/topics/offline/quick_start_guide.md b/doc/topics/offline/quick_start_guide.md
index d1be775268f..4426f955cb7 100644
--- a/doc/topics/offline/quick_start_guide.md
+++ b/doc/topics/offline/quick_start_guide.md
@@ -14,18 +14,18 @@ instance entirely offline.
NOTE:
This guide assumes the server is Ubuntu 20.04 using the [Omnibus installation method](https://docs.gitlab.com/omnibus/) and will be running GitLab [Enterprise Edition](https://about.gitlab.com/install/ce-or-ee/). Instructions for other servers may vary.
This guide also assumes the server host resolves as `my-host.internal`, which you should replace with your
-server's FQDN, and that you have access to a different server with Internet access to download the required package files.
+server's FQDN, and that you have access to a different server with Internet access to download the required package files.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
For a video walkthrough of this process, see [Offline GitLab Installation: Downloading & Installing](https://www.youtube.com/watch?v=TJaq4ua2Prw).
### Download the GitLab package
-You should [manually download the GitLab package](../../update/package/index.md#upgrade-using-a-manually-downloaded-package) and relevant dependencies using a server of the same operating system type that has access to the Internet.
+You should [manually download the GitLab package](../../update/package/index.md#upgrade-using-a-manually-downloaded-package) and relevant dependencies using a server of the same operating system type that has access to the Internet.
-If your offline environment has no local network access, you must manually transport across the relevant package files through physical media, such as a USB drive or writable DVD.
+If your offline environment has no local network access, you must manually transport across the relevant package files through physical media, such as a USB drive or writable DVD.
-In Ubuntu, this can be performed on a server with Internet access using the following commands:
+In Ubuntu, this can be performed on a server with Internet access using the following commands:
```shell
# Download the bash script to prepare the repository
@@ -42,7 +42,7 @@ sudo cp /var/cache/apt/archives/*.deb /path/to/mount
Prerequisites:
-- Before installing the GitLab package on your offline environment, ensure that you have installed all required dependencies first.
+- Before installing the GitLab package on your offline environment, ensure that you have installed all required dependencies first.
If you are using Ubuntu, you can install the dependency `.deb` packages you copied across with `dpkg`. Do not install the GitLab package yet.
@@ -202,7 +202,7 @@ done.
### Disable Version Check and Service Ping
The Version Check and Service Ping services improve the GitLab user experience and ensure that
-users are on the most up-to-date instances of GitLab. These two services can be turned off for air-gapped
+users are on the most up-to-date instances of GitLab. These two services can be turned off for air-gapped
environments so that they do not attempt and fail to reach out to GitLab services.
Learn more about [disabling usage statistics](../../user/admin_area/settings/usage_statistics.md#enable-or-disable-usage-statistics).
diff --git a/doc/topics/release_your_application.md b/doc/topics/release_your_application.md
index 7ed227adcac..c791b1f7185 100644
--- a/doc/topics/release_your_application.md
+++ b/doc/topics/release_your_application.md
@@ -64,3 +64,8 @@ Use GitLab [Releases](../user/project/releases/index.md) to plan, build, and del
### Feature flags
Use [feature flags](../operations/feature_flags.md) to control and strategically rollout application deployments.
+
+## Deploy to Google Cloud
+
+GitLab [Cloud Seed](../cloud_seed/index.md) is an open-source Incubation Engineering program that
+enables you to set up deployment credentials and deploy your application to Google Cloud Run with minimal friction.
diff --git a/doc/topics/set_up_organization.md b/doc/topics/set_up_organization.md
index 3f8a00f9981..877dbe95e70 100644
--- a/doc/topics/set_up_organization.md
+++ b/doc/topics/set_up_organization.md
@@ -13,5 +13,5 @@ and give everyone access to the projects they need.
- [Workspace](../user/workspace/index.md) _(Coming soon)_
- [Groups](../user/group/index.md)
- [User account options](../user/profile/index.md)
-- [SSH keys](../ssh/index.md)
+- [SSH keys](../user/ssh.md)
- [GitLab.com settings](../user/gitlab_com/index.md)
diff --git a/doc/topics/use_gitlab.md b/doc/topics/use_gitlab.md
index 59a933b1441..6c6c5f71fc2 100644
--- a/doc/topics/use_gitlab.md
+++ b/doc/topics/use_gitlab.md
@@ -1,21 +1,11 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: '../user/index.md'
+remove_date: '2022-06-17'
---
-# Use GitLab **(FREE)**
+This document was moved to [another location](../user/index.md).
-Get to know the GitLab end-to-end workflow. Configure permissions,
-organize your work, create and secure your application, and analyze its performance. Report on team productivity throughout the process.
-
-- [Set up your organization](set_up_organization.md)
-- [Organize work with projects](../user/project/index.md)
-- [Plan and track work](plan_and_track.md)
-- [Build your application](build_your_application.md)
-- [Secure your application](../user/application_security/index.md)
-- [Deploy and release your application](release_your_application.md)
-- [Monitor application performance](../operations/index.md)
-- [Monitor runner performance](https://docs.gitlab.com/runner/monitoring/index.html)
-- [Manage your infrastructure](../user/infrastructure/index.md)
-- [Analyze GitLab usage](../user/analytics/index.md)
+<!-- This redirect file can be deleted after <2022-06-17>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/tutorials/img/branches_dropdown_v14_10.png b/doc/tutorials/img/branches_dropdown_v14_10.png
new file mode 100644
index 00000000000..73d94f9823a
--- /dev/null
+++ b/doc/tutorials/img/branches_dropdown_v14_10.png
Binary files differ
diff --git a/doc/tutorials/img/clone_project_v14_9.png b/doc/tutorials/img/clone_project_v14_9.png
new file mode 100644
index 00000000000..98666c95ba3
--- /dev/null
+++ b/doc/tutorials/img/clone_project_v14_9.png
Binary files differ
diff --git a/doc/tutorials/img/commit_message_v14_10.png b/doc/tutorials/img/commit_message_v14_10.png
new file mode 100644
index 00000000000..5636a135b4e
--- /dev/null
+++ b/doc/tutorials/img/commit_message_v14_10.png
Binary files differ
diff --git a/doc/tutorials/index.md b/doc/tutorials/index.md
index 91913813256..cf3c23a99a7 100644
--- a/doc/tutorials/index.md
+++ b/doc/tutorials/index.md
@@ -1,7 +1,7 @@
---
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
+info: For assistance with this tutorials page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-other-projects-and-subjects.
---
# Learn GitLab with tutorials
@@ -18,7 +18,7 @@ and running quickly.
| <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Introduction to GitLab](https://youtu.be/_4SmIyQ5eis?t=90) (59m 51s) | Walk through recommended processes and example workflows for using GitLab. | **{star}** |
| [GitLab 101](https://gitlab.edcast.com/pathways/copy-of-gitlab-certification) | Learn the basics of GitLab in this certification course. | **{star}** |
| <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Use GitLab for DevOps](https://www.youtube.com/watch?v=7q9Y1Cv-ib0) (12m 34s) | Use GitLab through the entire DevOps lifecycle, from planning to monitoring. | **{star}** |
-| [Use Markdown at GitLab](../user/markdown.md) | GitLab Flavored Markdown (GFM) is used in many areas of GitLab, for example, in merge requests. | **{star}** |
+| [Use Markdown at GitLab](../user/markdown.md) | GitLab Flavored Markdown (GLFM) is used in many areas of GitLab, for example, in merge requests. | **{star}** |
| [GitLab 201](https://gitlab.edcast.com/pathways/ECL-44010cf6-7a9c-4b9b-b684-fa08508a3252) | Go beyond the basics to learn more about using GitLab for your work. | |
| Learn GitLab project | You might already have the **Learn GitLab** project, which has tutorial-style issues to help you learn GitLab. If not, download [this export file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/vendor/project_templates/learn_gitlab_ultimate.tar.gz) and [import it to a new project](../user/project/settings/import_export.md#import-a-project-and-its-data). | |
| [Productivity tips](https://about.gitlab.com/blog/2021/02/18/improve-your-gitlab-productivity-with-these-10-tips/) | Get tips to help make you a productive GitLab user. | |
@@ -31,6 +31,7 @@ the most out of GitLab.
| Topic | Description | Good for beginners |
|-------|-------------|--------------------|
+| [Make your first Git commit](make_your_first_git_commit.md) | Create a project, edit a file, and commit changes to a Git repository from the command line. | **{star}** |
| [Start using Git on the command line](../gitlab-basics/start-using-git.md) | Learn how to set up Git, clone repositories, and work with branches. | **{star}** |
| [Git cheat sheet](https://about.gitlab.com/images/press/git-cheat-sheet.pdf) | Download a PDF of common Git commands. | |
diff --git a/doc/tutorials/make_your_first_git_commit.md b/doc/tutorials/make_your_first_git_commit.md
new file mode 100644
index 00000000000..4b88b528be6
--- /dev/null
+++ b/doc/tutorials/make_your_first_git_commit.md
@@ -0,0 +1,273 @@
+---
+stage: none
+group: unassigned
+info: For assistance with this tutorial, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-other-projects-and-subjects.
+---
+
+# Make your first Git commit
+
+This tutorial is going to teach you a little bit about how Git works. It walks
+you through the steps of creating your own project, editing a file, and
+committing changes to a Git repository from the command line.
+
+When you're done, you'll have a project where you can practice using Git.
+
+## What you need
+
+Before you begin:
+
+- [Install Git on your local machine](../topics/git/how_to_install_git/index.md).
+- Ensure you can sign in to an instance of GitLab. If your organization doesn't
+ have GitLab, create an account on GitLab.com.
+- [Create SSH keys and add them to GitLab](../ssh/index.md). SSH keys are how you
+ securely communicate between your computer and GitLab.
+
+## What is Git?
+
+Before we jump into steps, let's go over some basic Git concepts.
+
+Git is a version control system. It's used to track changes to files.
+
+You store files, like code or documents, in a Git *repository*. When you want to edit the files, you
+*clone* the repository to your computer, make the changes, and *push* your changes
+back to the repository. In GitLab, a Git repository is located in
+a *project*.
+
+Each time you push a change, Git records it as a unique *commit*. These commits make up
+the history of when and how a file changed, and who changed it.
+
+```mermaid
+graph LR
+ subgraph Repository commit history
+ A(Author: Alex<br>Date: 3 Jan at 1PM<br>Commit message: Added sales figures for January<br> Commit ID: 123abc12) ---> B
+ B(Author: Sam<br>Date: 4 Jan at 10AM<br>Commit message: Removed outdated marketing information<br> Commit ID: aabb1122) ---> C
+ C(Author: Zhang<br>Date: 5 Jan at 3PM<br>Commit message: Added a new 'Invoices' file<br> Commit ID: ddee4455)
+ end
+```
+
+When you work in a Git repository, you work in *branches*. By default, the contents
+of a repository are in a default branch. To make changes, you:
+
+1. Create your own branch, which is a snapshot of the default branch at the time
+ you create it.
+1. Make changes and push them to your branch. Each push creates a commit.
+1. When you're ready, *merge* your branch into the default branch.
+
+```mermaid
+flowchart LR
+ subgraph Default branch
+ A[Commit] --> B[Commit] --> C[Commit] --> D[Commit]
+ end
+ subgraph My branch
+ B --1. Create my branch--> E(Commit)
+ E --2. Add my commit--> F(Commit)
+ F --2. Add my commit--> G(Commit)
+ G --3. Merge my branch to default--> D
+ end
+```
+
+If this all feels a bit overwhelming, hang in there. You're about to see these concepts in action.
+
+## Steps
+
+Here's an overview of what we're going to do:
+
+1. [Create a sample project](#create-a-sample-project).
+1. [Clone the repository](#clone-the-repository).
+1. [Create a branch and make your changes](#create-a-branch-and-make-changes).
+1. [Commit and push your changes](#commit-and-push-your-changes).
+1. [Merge your changes](#merge-your-changes).
+1. [View your changes in GitLab](#view-your-changes-in-gitlab).
+
+### Create a sample project
+
+To start, create a sample project in GitLab.
+
+1. In GitLab, on the top bar, select **Menu > Projects > Create new project**.
+1. Select **Create blank project**.
+1. For **Project name**, enter `My sample project`. The project slug is generated for you.
+ This slug is the URL you can use to access the project after it's created.
+1. Ensure **Initialize repository with a README** is selected.
+ How you complete the other fields is up to you.
+1. Select **Create project**.
+
+### Clone the repository
+
+Now you can clone the repository in your project. *Cloning* a repository means you're creating
+a copy on your computer, or wherever you want to store and work with the files.
+
+1. On your project page, select **Clone**. Copy the URL for **Clone with SSH**.
+
+ ![Clone a project with SSH](img/clone_project_v14_9.png)
+
+1. Open a terminal on your computer and go to the directory
+ where you want to clone the files.
+
+1. Enter `git clone` and paste the URL:
+
+ ```shell
+ git clone git@gitlab.com:gitlab-example/my-sample-project.git
+ ```
+
+1. Go to the directory:
+
+ ```shell
+ cd my-sample-project
+ ```
+
+1. By default, you've cloned the default branch for the repository. Usually this
+ branch is `main`. To be sure, get the name of the default branch:
+
+ ```shell
+ git branch
+ ```
+
+ The branch you're on is marked with an asterisk.
+ Press `Q` on your keyboard to return to the main terminal
+ window.
+
+### Create a branch and make changes
+
+Now that you have a copy of the repository, create your own branch so you can
+work on your changes independently.
+
+1. Create a new branch called `example-tutorial-branch`.
+
+ ```shell
+ git checkout -b example-tutorial-branch
+ ```
+
+1. In a text editor like Visual Studio Code, Sublime, `vi`, or any other editor,
+ open the README.md file and add this text:
+
+ ```plaintext
+ Hello world! I'm using Git!
+ ```
+
+1. Save the file.
+
+1. Git keeps track of changed files. To confirm which files have changed, get
+ the status.
+
+ ```shell
+ git status
+ ```
+
+ You should get output similar to the following:
+
+ ```shell
+ On branch example-tutorial-branch
+ Changes not staged for commit:
+ (use "git add <file>..." to update what will be committed)
+ (use "git restore <file>..." to discard changes in working directory)
+ modified: README.md
+
+ no changes added to commit (use "git add" and/or "git commit -a")
+ ```
+
+### Commit and push your changes
+
+You've made changes to a file in your repository. Now it's time to record
+those changes by making your first commit.
+
+1. Add the `README.md` file to the *staging* area. The staging area is where you
+ put files before you commit them.
+
+ ```shell
+ git add README.md
+ ```
+
+1. Confirm the file is staged:
+
+ ```shell
+ git status
+ ```
+
+ You should get output similar to the following, and the filename should be in
+ green text.
+
+ ```shell
+ On branch example-tutorial-branch
+ Changes to be committed:
+ (use "git restore --staged <file>..." to unstage)
+ modified: README.md
+ ```
+
+1. Now commit the staged file, and include a message
+ that describes the change you made. Make sure you surround the message in double
+ quotes (").
+
+ ```shell
+ git commit -m "I added text to the README file"
+ ```
+
+1. The change has been committed to your branch, but your branch and its commits
+ are still only available on your computer. No one else has access to them yet.
+ Push your branch to GitLab:
+
+ ```shell
+ git push origin example-tutorial-branch
+ ```
+
+Your branch is now available on GitLab and visible to other users in your project.
+
+![Branches dropdown list](img/branches_dropdown_v14_10.png)
+
+### Merge your changes
+
+Now you're ready to merge the changes from your `example-tutorial-branch` branch
+to the default branch (`main`).
+
+1. Check out the default branch for your repository.
+
+ ```shell
+ git checkout main
+ ```
+
+1. Merge your branch into the default branch.
+
+ ```shell
+ git merge example-tutorial-branch
+ ```
+
+1. Push the changes.
+
+ ```shell
+ git push
+ ```
+
+NOTE:
+For this tutorial, you merge your branch directly to the default branch for your
+repository. In GitLab, you typically use a [merge request](../user/project/merge_requests/)
+to merge your branch.
+
+### View your changes in GitLab
+
+You did it! You updated the `README.md` file in your branch, and you merged those changes
+into the `main` branch.
+
+Let's look in the UI and confirm your changes. Go to your project.
+
+- Scroll down and view the contents of the `README.md` file.
+ Your changes should be visible.
+- Above the `README.md` file, view the text in the **Last commit** column.
+ Your commit message is displayed in this column:
+
+ ![Commit message](img/commit_message_v14_10.png)
+
+- Above the file list, select **History** to view your commit details.
+
+Now you can return to the command line and change back to your personal branch
+(`git checkout example-tutorial-branch`). You can continue updating files or
+creating new ones. Type `git status` to view the status
+of your changes and commit with abandon.
+
+Don't worry if you mess things up. Everything in Git can be reverted, and if you
+find you can't recover, you can always create a new branch and start again.
+
+Nice work.
+
+## Find more Git learning resources
+
+- Get a complete introduction to Git in the <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Git for GitLab](https://www.youtube.com/watch?v=4lxvVj7wlZw) beginner's course (1h 33m).
+- Find other tutorials about Git and GitLab on the [tutorials page](index.md).
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index 9453482cc67..7e8eaef2b4c 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -36,6 +36,68 @@ For deprecation reviewers (Technical Writers only):
https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-deprecations-doc
-->
+View deprecations by the product versions in which they were announced.
+
+Each deprecation has a **planned removal milestone** and indicates whether it is a breaking change.
+
+Most of the deprecations are **planned for removal in 15.0**, and many of them are **breaking changes**.
+
+## 14.10
+
+### Manual iteration management
+
+WARNING:
+This feature will be changed or removed in 16.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Manual iteration management is deprecated and only automatic iteration cadences will be supported in the future.
+
+Creating and deleting iterations will be fully removed in 16.0. Updating all iteration fields except for
+`description` will also be removed.
+
+On the GraphQL API the following mutations will be removed:
+
+ 1. `iterationCreate`
+ 1. `iterationDelete`
+
+The update `updateIteration` mutation will only allow updating the iteration's `description`. The following
+arguments will be removed:
+
+ 1. `title`
+ 1. `dueDate`
+ 1. `startDate`
+
+For more information about iteration cadences, you can refer to
+[the documentation of the feature](https://docs.gitlab.com/ee/user/group/iterations/#iteration-cadences).
+
+**Planned removal milestone: 16.0 (2023-04-22)**
+
+### Outdated indices of Advanced Search migrations
+
+WARNING:
+This feature will be changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+As Advanced Search migrations usually require support multiple code paths for a long period of time, it’s important to clean those up when we safely can. We use GitLab major version upgrades as a safe time to remove backward compatibility for indices that have not been fully migrated. See the [upgrade documentation](https://docs.gitlab.com/ee/update/index.html#upgrading-to-a-new-major-version) for details.
+
+**Planned removal milestone: 15.0 (2021-05-22)**
+
+### Toggle notes confidentiality on APIs
+
+WARNING:
+This feature will be changed or removed in 16.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Toggling notes confidentiality with REST and GraphQL APIs is being deprecated. Updating notes confidential attribute is no longer supported by any means. We are changing this to simplify the experience and prevent private information from being unintentionally exposed.
+
+**Planned removal milestone: 16.0 (2023-05-22)**
+
## 14.9
### Background upload for object storage
@@ -59,7 +121,7 @@ GitLab will publish additional guidance to assist affected customers in migratin
### Deprecate support for Debian 9
-Long term service and support (LTSS) for [Debian 9 Stretch ends in July 2022](https://wiki.debian.org/LTS). Therefore, we will longer support the Debian 9 distribution for the GitLab package. Users can upgrade to Debian 10 or Debian 11.
+Long term service and support (LTSS) for [Debian 9 Stretch ends in July 2022](https://wiki.debian.org/LTS). Therefore, we will no longer support the Debian 9 distribution for the GitLab package. Users can upgrade to Debian 10 or Debian 11.
**Planned removal milestone: 15.1 (2022-06-22)**
@@ -69,17 +131,17 @@ In 15.0, support for daemon mode for GitLab Pages will be removed.
**Planned removal milestone: 15.0 (2022-05-22)**
-### GitLab self-monitoring
+### GitLab self-monitoring project
WARNING:
-This feature will be changed or removed in 15.0
+This feature will be changed or removed in 16.0
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
-GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 15.0.
+GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 16.0.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: 16.0 (2023-05-22)**
### GraphQL permissions change for Package settings
@@ -313,12 +375,12 @@ Specifically, the following are deprecated:
- Requests that have the `status` field set to `approved`.
Beginning in GitLab 15.0, status checks will only be updated to a passing state if the `status` field is both present
-and set to `pass`. Requests that:
+and set to `passed`. Requests that:
- Do not contain the `status` field will be rejected with a `422` error. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338827).
-- Contain any value other than `pass` will cause the status check to fail. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/339039).
+- Contain any value other than `passed` will cause the status check to fail. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/339039).
-To align with this change, API calls to list external status checks will also return the value of `pass` rather than
+To align with this change, API calls to list external status checks will also return the value of `passed` rather than
`approved` for status checks that have passed.
**Planned removal milestone: 15.0 (2022-05-22)**
@@ -528,29 +590,6 @@ existing runners.
**Planned removal milestone: 16.0 (2023-04-22)**
-### Reminder: support for NFS repository storage
-
-WARNING:
-This feature will be changed or removed in 15.0
-as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
-Before updating GitLab, review the details carefully to determine if you need to make any
-changes to your code, settings, or workflow.
-
-As [announced](https://about.gitlab.com/releases/2021/06/22/gitlab-14-0-released/#nfs-for-git-repository-storage-deprecated) at the
-release of GitLab 14.0, technical support for NFS storage for Git repositories is being removed. Please see our official
-[Statement of Support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for additional information.
-
-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/#migrating-to-gitaly-cluster).
-
-Gitaly Cluster offers tremendous benefits for our customers such as:
-
-- [Variable replication factors](https://docs.gitlab.com/ee/administration/gitaly/praefect.html#configure-replication-factor)
-- [Strong consistency](https://docs.gitlab.com/ee/administration/gitaly/#strong-consistency)
-- [Distributed read capabilities](https://docs.gitlab.com/ee/administration/gitaly/#distributed-reads)
-
-**Planned removal milestone: 15.0 (2022-05-22)**
-
### Request profiling
WARNING:
@@ -812,14 +851,29 @@ The new security approvals feature is similar to vulnerability check. For exampl
### `CI_BUILD_*` predefined variables
WARNING:
-This feature will be changed or removed in 15.0
+This feature will be changed or removed in 16.0
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
-The predefined CI/CD variables that start with `CI_BUILD_*` were deprecated in GitLab 9.0, and will be removed in GitLab 15.0. If you still use these variables, be sure to change to the current [`CI_JOB_*` predefined variables](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) which are identical (except for the updated name).
+The predefined CI/CD variables that start with `CI_BUILD_*` were deprecated in GitLab 9.0, and will be removed in GitLab 16.0. If you still use these variables, be sure to change to the replacement [predefined variables](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) which are functionally identical:
-**Planned removal milestone: 15.0 (2022-05-22)**
+| Removed variable | Replacement variable |
+| --------------------- |------------------------ |
+| `CI_BUILD_BEFORE_SHA` | `CI_COMMIT_BEFORE_SHA` |
+| `CI_BUILD_ID` | `CI_JOB_ID` |
+| `CI_BUILD_MANUAL` | `CI_JOB_MANUAL` |
+| `CI_BUILD_NAME` | `CI_JOB_NAME` |
+| `CI_BUILD_REF` | `CI_COMMIT_SHA` |
+| `CI_BUILD_REF_NAME` | `CI_COMMIT_REF_NAME` |
+| `CI_BUILD_REF_SLUG` | `CI_COMMIT_REF_SLUG` |
+| `CI_BUILD_REPO` | `CI_REPOSITORY_URL` |
+| `CI_BUILD_STAGE` | `CI_JOB_STAGE` |
+| `CI_BUILD_TAG` | `CI_COMMIT_TAG` |
+| `CI_BUILD_TOKEN` | `CI_JOB_TOKEN` |
+| `CI_BUILD_TRIGGERED` | `CI_PIPELINE_TRIGGERED` |
+
+**Planned removal milestone: 16.0 (2023-04-22)**
### `fixup!` commit messages setting draft status of associated Merge Request
@@ -973,7 +1027,7 @@ The logging features in GitLab allow users to install the ELK stack (Elasticsear
### Monitor performance metrics through Prometheus
WARNING:
-This feature will be changed or removed in 15.0
+This feature will be changed or removed in 16.0
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
@@ -981,7 +1035,7 @@ changes to your code, settings, or workflow.
By displaying data stored in a Prometheus instance, GitLab allows users to view performance metrics. GitLab also displays visualizations of these metrics in dashboards. The user can connect to a previously-configured external Prometheus instance, or set up Prometheus as a GitLab Managed App.
However, since certificate-based integration with Kubernetes clusters is deprecated in GitLab, the metrics functionality in GitLab that relies on Prometheus is also deprecated. This includes the metrics visualizations in dashboards. GitLab is working to develop a single user experience based on [Opstrace](https://about.gitlab.com/press/releases/2021-12-14-gitlab-acquires-opstrace-to-expand-its-devops-platform-with-open-source-observability-solution.html). An [issue exists](https://gitlab.com/groups/gitlab-org/-/epics/6976) for you to follow work on the Opstrace integration.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: 16.0 (2023-05-22)**
### Pseudonymizer
@@ -1294,12 +1348,12 @@ In milestone 15.0, we will remove the `pipelines` attribute from the API respons
### REST and GraphQL API Runner status will not return `paused`
WARNING:
-This feature will be changed or removed in 15.0
+This feature will be changed or removed in 16.0
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
-The GitLab Runner REST and GraphQL API endpoints will not return `paused` or `active` as a status in GitLab 15.0.
+The GitLab Runner REST and GraphQL API endpoints will not return `paused` or `active` as a status in GitLab 16.0.
A runner's status will only relate to runner contact status, such as:
`online`, `offline`, or `not_connected`. Status `paused` or `active` will no longer appear.
@@ -1307,7 +1361,7 @@ A runner's status will only relate to runner contact status, such as:
When checking if a runner is `paused`, API users are advised to check the boolean attribute
`paused` to be `true` instead. When checking if a runner is `active`, check if `paused` is `false`.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: 16.0 (2023-04-22)**
### Support for SLES 12 SP2
@@ -1522,13 +1576,7 @@ This will result in the rename of the sub-chart: `gitlab/task-runner` to `gitlab
### NFS for Git repository storage
-WARNING:
-This feature will be changed or removed in 15.0
-as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
-Before updating GitLab, review the details carefully to determine if you need to make any
-changes to your code, settings, or workflow.
-
-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.
+With the general availability of Gitaly Cluster ([introduced in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/)), we have deprecated development (bugfixes, performance improvements, etc) for NFS for Git repository storage in GitLab 14.0. We will continue to provide technical support for NFS for Git repositories throughout 14.x, but we will remove all support for NFS on November 22, 2022. This was originally planned for May 22, 2022, but in an effort to allow continued maturity of Gitaly Cluster, we have chosen to extend our deprecation of support date. Please see our official [Statement of Support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for further information.
Gitaly Cluster offers tremendous benefits for our customers such as:
@@ -1538,7 +1586,7 @@ Gitaly Cluster offers tremendous benefits for our customers such as:
We encourage customers currently using NFS for Git repositories to plan their migration by reviewing our documentation on [migrating to Gitaly Cluster](https://docs.gitlab.com/ee/administration/gitaly/index.html#migrate-to-gitaly-cluster).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: 15.6 (2022-11-22)**
### OAuth implicit grant
diff --git a/doc/update/index.md b/doc/update/index.md
index 5a00a728535..1e8badf59b4 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -192,6 +192,8 @@ pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_cla
#### Background migrations stuck in 'pending' state
GitLab 13.6 introduced an issue where a background migration named `BackfillJiraTrackerDeploymentType2` can be permanently stuck in a **pending** state across upgrades. To clean up this stuck migration, see the [13.6.0 version-specific instructions](#1360).
+GitLab 14.4 introduced an issue where a background migration named `PopulateTopicsTotalProjectsCountCache` can be permanently stuck in a **pending** state across upgrades when the instance lacks records that match the migration's target. To clean up this stuck migration, see the [14.4.0 version-specific instructions](#1440).
+GitLab 14.8 introduced an issue where a background migration named `PopulateTopicsNonPrivateProjectsCount` can be permanently stuck in a **pending** state across upgrades. To clean up this stuck migration, see the [14.8.0 version-specific instructions](#1480).
For other background migrations stuck in pending, run the following check. If it returns non-zero and the count does not decrease over time, follow the rest of the steps in this section.
@@ -398,6 +400,8 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
### 14.8.0
+- If upgrading from a version earlier than 14.6.5, 14.7.4, or 14.8.2, please review the [Critical Security Release: 14.8.2, 14.7.4, and 14.6.5](https://about.gitlab.com/releases/2022/02/25/critical-security-release-gitlab-14-8-2-released/) blog post.
+ Updating to 14.8.2 or later will reset runner registration tokens for your groups and projects.
- The agent server for Kubernetes [is enabled by default](https://about.gitlab.com/releases/2022/02/22/gitlab-14-8-released/#the-agent-server-for-kubernetes-is-enabled-by-default)
on Omnibus installations. If you run GitLab at scale,
such as [the reference architectures](../administration/reference_architectures/index.md),
@@ -417,15 +421,49 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
1. Add `gitlab_kas['enable'] = false` to `gitlab.rb`.
1. If the server is already upgraded to 14.8, run `gitlab-ctl reconfigure`.
+- GitLab 14.8.0 includes a
+[background migration `PopulateTopicsNonPrivateProjectsCount`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79140)
+that may remain stuck permanently in a **pending** state.
+
+ To clean up this stuck job, run the following in the [GitLab Rails Console](../administration/operations/rails_console.md):
+
+ ```ruby
+ Gitlab::Database::BackgroundMigrationJob.pending.where(class_name: "PopulateTopicsNonPrivateProjectsCount").find_each do |job|
+ puts Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded("PopulateTopicsNonPrivateProjectsCountq", job.arguments)
+ end
+ ```
+
+- If upgrading from a version earlier than 14.3.0, to avoid
+ [an issue with job retries](https://gitlab.com/gitlab-org/gitlab/-/issues/357822), first upgrade
+ to GitLab 14.7.x and make sure all batched migrations have finished.
+- If upgrading from version 14.3.0 or later, you might notice a failed
+ [batched migration](../user/admin_area/monitoring/background_migrations.md) named
+ `BackfillNamespaceIdForNamespaceRoute`. You can [ignore](https://gitlab.com/gitlab-org/gitlab/-/issues/357822)
+ this. Retry it after you upgrade to version 14.9.x.
### 14.7.0
- See [LFS objects import and mirror issue in GitLab 14.6.0 to 14.7.2](#lfs-objects-import-and-mirror-issue-in-gitlab-1460-to-1472).
+- If upgrading from a version earlier than 14.6.5, 14.7.4, or 14.8.2, please review the [Critical Security Release: 14.8.2, 14.7.4, and 14.6.5](https://about.gitlab.com/releases/2022/02/25/critical-security-release-gitlab-14-8-2-released/) blog post.
+ Updating to 14.7.4 or later will reset runner registration tokens for your groups and projects.
+- GitLab 14.7 introduced a change where Gitaly expects persistent files in the `/tmp` directory.
+ When using the `noatime` mount option on `/tmp` in a node running Gitaly, most Linux distributions
+ run into [an issue with Git server hooks getting deleted](https://gitlab.com/gitlab-org/gitaly/-/issues/4113).
+ These conditions are present in the default Amazon Linux configuration.
+
+ If your Linux distribution manages files in `/tmp` with the `tmpfiles.d` service, you
+ can override the behavior of `tmpfiles.d` for the Gitaly files and avoid this issue:
+
+ ```shell
+ sudo echo "x /tmp/gitaly-hooks-*" > /etc/tmpfiles.d/gitaly-workaround.conf
+ ```
### 14.6.0
- See [LFS objects import and mirror issue in GitLab 14.6.0 to 14.7.2](#lfs-objects-import-and-mirror-issue-in-gitlab-1460-to-1472).
-
+- If upgrading from a version earlier than 14.6.5, 14.7.4, or 14.8.2, please review the [Critical Security Release: 14.8.2, 14.7.4, and 14.6.5](https://about.gitlab.com/releases/2022/02/25/critical-security-release-gitlab-14-8-2-released/) blog post.
+ Updating to 14.6.5 or later will reset runner registration tokens for your groups and projects.
+
### 14.5.0
- When `make` is run, Gitaly builds are now created in `_build/bin` and no longer in the root directory of the source directory. If you
@@ -473,6 +511,17 @@ or [init scripts](upgrading_from_source.md#configure-sysv-init-script) by [follo
as Sidekiq would continue using a bad connection. Geo and other features that rely on
cron jobs running regularly do not work until Sidekiq is restarted. We recommend
upgrading to GitLab 14.4.3 and later if this issue affects you.
+- GitLab 14.4.0 includes a
+[background migration `PopulateTopicsTotalProjectsCountCache`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71033)
+that may remain stuck permanently in a **pending** state when the instance lacks records that match the migration's target.
+
+ To clean up this stuck job, run the following in the [GitLab Rails Console](../administration/operations/rails_console.md):
+
+ ```ruby
+ Gitlab::Database::BackgroundMigrationJob.pending.where(class_name: "PopulateTopicsTotalProjectsCountCache").find_each do |job|
+ puts Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded("PopulateTopicsTotalProjectsCountCache", job.arguments)
+ end
+ ```
### 14.3.0
@@ -576,6 +625,8 @@ for how to proceed.
- The support of PostgreSQL 11 [has been dropped](../install/requirements.md#database). Make sure to [update your database](https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server) to version 12 before updating to GitLab 14.0.
- See [Maintenance mode issue in GitLab 13.9 to 14.4](#maintenance-mode-issue-in-gitlab-139-to-144).
+- See [Custom Rack Attack initializers](#custom-rack-attack-initializers) if you persist your own custom Rack Attack
+ initializers during upgrades.
#### Upgrading to later 14.Y releases
@@ -754,6 +805,14 @@ all servers must first be upgraded to 13.1.Z before upgrading to 13.2.0 or later
1. Only then, continue to upgrade to later versions of GitLab.
+#### Custom Rack Attack initializers
+
+From GitLab 13.0.1, custom Rack Attack initializers (`config/initializers/rack_attack.rb`) are replaced with initializers
+supplied with GitLab during upgrades. We recommend you use these GitLab-supplied initializers.
+
+If you persist your own Rack Attack initializers between upgrades, you might
+[get `500` errors](https://gitlab.com/gitlab-org/gitlab/-/issues/334681) when [upgrading to GitLab 14.0 and later](#1400).
+
### 12.2.0
In 12.2.0, we enabled Rails' authenticated cookie encryption. Old sessions are
diff --git a/doc/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md
index 22367435ae4..4537faaaead 100644
--- a/doc/update/upgrading_from_source.md
+++ b/doc/update/upgrading_from_source.md
@@ -199,6 +199,17 @@ cd /home/git/gitlab
git diff origin/PREVIOUS_BRANCH:config/gitlab.yml.example origin/BRANCH:config/gitlab.yml.example
```
+#### New configuration options for `database.yml`
+
+There might be configuration options available for [`database.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/database.yml.postgresql).
+View them with the command below and apply them manually to your current `database.yml`:
+
+```shell
+cd /home/git/gitlab
+
+git diff origin/PREVIOUS_BRANCH:config/database.yml.postgresql origin/BRANCH:config/database.yml.postgresql
+```
+
#### NGINX configuration
Ensure you're still up-to-date with the latest NGINX configuration changes:
diff --git a/doc/update/zero_downtime.md b/doc/update/zero_downtime.md
index d69d60fe73d..5aa80c12f11 100644
--- a/doc/update/zero_downtime.md
+++ b/doc/update/zero_downtime.md
@@ -13,16 +13,14 @@ there are the following requirements:
- You can only upgrade one minor release at a time. So from 13.1 to 13.2, not to
13.3. If you skip releases, database modifications may be run in the wrong
sequence [and leave the database schema in a broken state](https://gitlab.com/gitlab-org/gitlab/-/issues/321542).
-- You have to use [post-deployment migrations](../development/post_deployment_migrations.md).
+- You have to use [post-deployment migrations](../development/database/post_deployment_migrations.md).
- You are using PostgreSQL. Starting from GitLab 12.1, MySQL is not supported.
-- Multi-node GitLab instance. Single-node instances may experience brief interruptions
- [as services restart (Puma in particular)](#single-node-deployment).
+- You have set up a multi-node GitLab instance. Single-node instances do not support zero-downtime upgrades.
If you meet all the requirements above, follow these instructions in order. There are three sets of steps, depending on your deployment type:
| Deployment type | Description |
| --------------------------------------------------------------- | ------------------------------------------------ |
-| [Single-node](#single-node-deployment) | GitLab CE/EE on a single node |
| [Gitaly Cluster](#gitaly-cluster) | GitLab CE/EE using HA architecture for Gitaly Cluster |
| [Multi-node / PostgreSQL HA](#use-postgresql-ha) | GitLab CE/EE using HA architecture for PostgreSQL |
| [Multi-node / Redis HA](#use-redis-ha-using-sentinel) | GitLab CE/EE using HA architecture for Redis |
@@ -87,80 +85,6 @@ migrations this could potentially lead to hours of downtime, depending on the
size of your database. To work around this you must use PostgreSQL and
meet the other online upgrade requirements mentioned above.
-## Single-node deployment
-
-WARNING:
-You can only upgrade one minor release at a time.
-
-Before following these instructions, note the following **important** information:
-
-- You can only upgrade one minor release at a time. So from 13.6 to 13.7, not to 13.8.
- If you attempt more than one minor release, the upgrade may fail.
-- On single-node Omnibus deployments, updates with no downtime are not possible when
- using Puma because Puma always requires a complete restart. This is because the
- [phased restart](https://github.com/puma/puma/blob/master/README.md#clustered-mode)
- feature of Puma does not work with the way it is configured in GitLab all-in-one
- packages (cluster-mode with app preloading).
-- While it is possible to minimize downtime on a single-node instance by following
- these instructions, **it is not possible to always achieve true zero downtime
- updates**. Users may see some connections timeout or be refused for a few minutes,
- depending on which services need to restart.
-- On Omnibus deployments, the `/etc/gitlab/gitlab.rb` configuration file must **not** have
- `gitlab_rails['auto_migrate'] = true`.
-
-1. Create an empty file at `/etc/gitlab/skip-auto-reconfigure`. This prevents upgrades from running `gitlab-ctl reconfigure`, which by default automatically stops GitLab, runs all database migrations, and restarts GitLab.
-
- ```shell
- sudo touch /etc/gitlab/skip-auto-reconfigure
- ```
-
-1. Update the GitLab package:
-
- - For GitLab [Enterprise Edition](https://about.gitlab.com/pricing/):
-
- ```shell
- # Debian/Ubuntu
- sudo apt-get update
- sudo apt-get install gitlab-ee
-
- # Centos/RHEL
- sudo yum install gitlab-ee
- ```
-
- - For GitLab Community Edition:
-
- ```shell
- # Debian/Ubuntu
- sudo apt-get update
- sudo apt-get install gitlab-ce
-
- # Centos/RHEL
- sudo yum install gitlab-ce
- ```
-
-1. To get the regular migrations and latest code in place, run
-
- ```shell
- sudo SKIP_POST_DEPLOYMENT_MIGRATIONS=true gitlab-ctl reconfigure
- ```
-
-1. Once the node is updated and `reconfigure` finished successfully, run post-deployment migrations with
-
- ```shell
- sudo gitlab-rake db:migrate
- ```
-
-1. Hot reload `puma` and `sidekiq` services
-
- ```shell
- sudo gitlab-ctl hup puma
- sudo gitlab-ctl restart sidekiq
- ```
-
-If you do not want to run zero downtime upgrades in the future, make
-sure you remove `/etc/gitlab/skip-auto-reconfigure` after
-you've completed these steps.
-
## Multi-node / HA deployment
WARNING:
diff --git a/doc/user/admin_area/analytics/dev_ops_report.md b/doc/user/admin_area/analytics/dev_ops_report.md
index 2ad18d5f70e..077718863e7 100644
--- a/doc/user/admin_area/analytics/dev_ops_report.md
+++ b/doc/user/admin_area/analytics/dev_ops_report.md
@@ -1,73 +1,9 @@
---
-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
+redirect_to: 'dev_ops_reports.md'
+remove_date: '2022-06-16'
---
-# DevOps Reports **(FREE SELF)**
+This document was moved to [another location](dev_ops_reports.md).
-DevOps Reports give you an overview of your entire instance's adoption of
-[Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/)
-from planning to monitoring.
-
-To see DevOps Reports:
-
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Analytics > DevOps Reports**.
-
-## DevOps Score
-
-> [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/20976) from Conversational Development Index in GitLab 12.6.
-
-NOTE:
-To see the DevOps score, you must activate your GitLab instance's [Service Ping](../settings/usage_statistics.md#service-ping). DevOps Score is a comparative tool, so your score data must be centrally processed by GitLab Inc. first.
-
-You can use the DevOps score to compare your DevOps status to other organizations.
-
-The DevOps Score tab displays usage of major GitLab features on your instance over
-the last 30 days, averaged over the number of billable users in that time period.
-You can also see the Leader usage score, calculated from top-performing instances based on
-[Service Ping data](../settings/usage_statistics.md#service-ping) that GitLab has collected.
-Your score is compared to the lead score of each feature and then expressed
-as a percentage at the bottom of said feature. Your overall **DevOps Score** is an average of your
-feature scores.
-
-Service Ping data is aggregated on GitLab servers for analysis. Your usage
-information is **not sent** to any other GitLab instances.
-If you have just started using GitLab, it might take a few weeks for data to be collected before this
-feature is available.
-
-## DevOps Adoption **(ULTIMATE SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/247112) in GitLab 13.7 as a [Beta feature](../../../policy/alpha-beta-support.md#beta-features).
-> - The Overview tab [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330401) in GitLab 14.1.
-> - DAST and SAST metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328033) in GitLab 14.1.
-> - Fuzz Testing metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/330398) in GitLab 14.2.
-> - Dependency Scanning metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328034) in GitLab 14.2.
-> - Multi-select [added](https://gitlab.com/gitlab-org/gitlab/-/issues/333586) in GitLab 14.2.
-> - Overview table [added](https://gitlab.com/gitlab-org/gitlab/-/issues/335638) in GitLab 14.3.
-
-DevOps Adoption shows feature adoption for development, security, and operations.
-
-| Category | Feature |
-| --- | --- |
-| Development | Approvals<br>Code owners<br>Issues<br>Merge requests |
-| Security | DAST<br>Dependency Scanning<br>Fuzz Testing<br>SAST |
-| Operations | Deployments<br>Pipelines<br>Runners |
-
-You can use Group DevOps Adoption to:
-
-- Identify specific subgroups that are lagging in their adoption of GitLab features, so you can guide them on
-their DevOps journey.
-- Find subgroups that have adopted certain features, and provide guidance to other subgroups on
-how to use those features.
-- Verify if you are getting the return on investment that you expected from GitLab.
-
-## Add or remove a group
-
-To add or remove a subgroup from the DevOps Adoption report:
-
-1. Select **Add or remove groups**.
-1. Select the subgroup you want to add or remove and select **Save changes**.
-
-![DevOps Adoption](img/admin_devops_adoption_v14_2.png)
+<!-- This redirect file can be deleted after <2022-06-16>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/admin_area/analytics/dev_ops_reports.md b/doc/user/admin_area/analytics/dev_ops_reports.md
new file mode 100644
index 00000000000..2ad18d5f70e
--- /dev/null
+++ b/doc/user/admin_area/analytics/dev_ops_reports.md
@@ -0,0 +1,73 @@
+---
+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
+---
+
+# DevOps Reports **(FREE SELF)**
+
+DevOps Reports give you an overview of your entire instance's adoption of
+[Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/)
+from planning to monitoring.
+
+To see DevOps Reports:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Analytics > DevOps Reports**.
+
+## DevOps Score
+
+> [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/20976) from Conversational Development Index in GitLab 12.6.
+
+NOTE:
+To see the DevOps score, you must activate your GitLab instance's [Service Ping](../settings/usage_statistics.md#service-ping). DevOps Score is a comparative tool, so your score data must be centrally processed by GitLab Inc. first.
+
+You can use the DevOps score to compare your DevOps status to other organizations.
+
+The DevOps Score tab displays usage of major GitLab features on your instance over
+the last 30 days, averaged over the number of billable users in that time period.
+You can also see the Leader usage score, calculated from top-performing instances based on
+[Service Ping data](../settings/usage_statistics.md#service-ping) that GitLab has collected.
+Your score is compared to the lead score of each feature and then expressed
+as a percentage at the bottom of said feature. Your overall **DevOps Score** is an average of your
+feature scores.
+
+Service Ping data is aggregated on GitLab servers for analysis. Your usage
+information is **not sent** to any other GitLab instances.
+If you have just started using GitLab, it might take a few weeks for data to be collected before this
+feature is available.
+
+## DevOps Adoption **(ULTIMATE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/247112) in GitLab 13.7 as a [Beta feature](../../../policy/alpha-beta-support.md#beta-features).
+> - The Overview tab [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330401) in GitLab 14.1.
+> - DAST and SAST metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328033) in GitLab 14.1.
+> - Fuzz Testing metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/330398) in GitLab 14.2.
+> - Dependency Scanning metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328034) in GitLab 14.2.
+> - Multi-select [added](https://gitlab.com/gitlab-org/gitlab/-/issues/333586) in GitLab 14.2.
+> - Overview table [added](https://gitlab.com/gitlab-org/gitlab/-/issues/335638) in GitLab 14.3.
+
+DevOps Adoption shows feature adoption for development, security, and operations.
+
+| Category | Feature |
+| --- | --- |
+| Development | Approvals<br>Code owners<br>Issues<br>Merge requests |
+| Security | DAST<br>Dependency Scanning<br>Fuzz Testing<br>SAST |
+| Operations | Deployments<br>Pipelines<br>Runners |
+
+You can use Group DevOps Adoption to:
+
+- Identify specific subgroups that are lagging in their adoption of GitLab features, so you can guide them on
+their DevOps journey.
+- Find subgroups that have adopted certain features, and provide guidance to other subgroups on
+how to use those features.
+- Verify if you are getting the return on investment that you expected from GitLab.
+
+## Add or remove a group
+
+To add or remove a subgroup from the DevOps Adoption report:
+
+1. Select **Add or remove groups**.
+1. Select the subgroup you want to add or remove and select **Save changes**.
+
+![DevOps Adoption](img/admin_devops_adoption_v14_2.png)
diff --git a/doc/user/admin_area/analytics/index.md b/doc/user/admin_area/analytics/index.md
index cd505e154c6..9315b926acc 100644
--- a/doc/user/admin_area/analytics/index.md
+++ b/doc/user/admin_area/analytics/index.md
@@ -15,5 +15,5 @@ Administrators have access to instance-wide analytics:
There are several kinds of statistics:
-- [DevOps Reports](dev_ops_report.md): Provides an overview of your entire instance's feature usage.
+- [DevOps Reports](dev_ops_reports.md): Provides an overview of your entire instance's feature usage.
- [Usage Trends](usage_trends.md): Shows how much data your instance contains, and how that is changing.
diff --git a/doc/user/admin_area/email_from_gitlab.md b/doc/user/admin_area/email_from_gitlab.md
new file mode 100644
index 00000000000..52f27ed48e0
--- /dev/null
+++ b/doc/user/admin_area/email_from_gitlab.md
@@ -0,0 +1,60 @@
+---
+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
+type: howto, reference
+---
+
+# Email from GitLab **(PREMIUM SELF)**
+
+GitLab provides a tool to administrators for emailing all users, or users of
+a chosen group or project, right from the Admin Area. Users receive the email
+at their primary email address.
+
+For information about email notifications originating from GitLab, read
+[GitLab notification emails](../profile/notifications.md).
+
+## Use-cases
+
+- Notify your users about a new project, a new feature, or a new product launch.
+- Notify your users about a new deployment, or that downtime is expected
+ for a particular reason.
+
+## Sending emails to users from GitLab
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Overview > Users**.
+1. Select **Send email to users**.
+
+ ![administrators](img/email1.png)
+
+1. Compose an email and choose where to send it (all users or users of a
+ chosen group or project). The email body only supports plain text messages.
+ HTML, Markdown, and other rich text formats are not supported, and is
+ sent as plain text to users.
+
+ ![compose an email](img/email2.png)
+
+NOTE:
+[Starting with GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/31509), email notifications can be sent only once every 10 minutes. This helps minimize performance issues.
+
+## Unsubscribing from emails
+
+Users can choose to unsubscribe from receiving emails from GitLab by following
+the unsubscribe link in the email. Unsubscribing is unauthenticated in order
+to keep this feature simple.
+
+On unsubscribe, users receive an email notification that unsubscribe happened.
+The endpoint that provides the unsubscribe option is rate-limited.
+
+<!-- ## Troubleshooting
+
+Include any troubleshooting steps that you can foresee. If you know beforehand what issues
+one might have when setting this up, or when something is changed, or on upgrading, it's
+important to describe those, too. Think of things that may go wrong and include them here.
+This is important to minimize requests for support, and to avoid doc comments with
+questions that you know someone might ask.
+
+Each scenario can be a third-level heading, e.g. `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/tools/email1.png b/doc/user/admin_area/img/email1.png
index e79ccc3e9a9..e79ccc3e9a9 100644
--- a/doc/tools/email1.png
+++ b/doc/user/admin_area/img/email1.png
Binary files differ
diff --git a/doc/tools/email2.png b/doc/user/admin_area/img/email2.png
index d073c0e42da..d073c0e42da 100644
--- a/doc/tools/email2.png
+++ b/doc/user/admin_area/img/email2.png
Binary files differ
diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md
index 4a334c28496..f57672d3d36 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -27,7 +27,7 @@ The Admin Area is made up of the following sections:
| **{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. |
+| **{hook}** System Hooks | Configure [system hooks](../../administration/system_hooks.md) for many events. |
| **{applications}** Applications | Create system [OAuth applications](../../integration/oauth_provider.md) for integrations with other services. |
| **{slight-frown}** Abuse Reports | Manage [abuse reports](review_abuse_reports.md) submitted by your users. |
| **{license}** License | Add, display, and remove [licenses](license.md). |
@@ -79,28 +79,29 @@ To access the Projects page:
By default, all projects are listed, in reverse order of when they were last updated. For each
project, the following information is listed:
-- Name.
-- Namespace.
-- Description.
-- Size, updated every 15 minutes at most.
+- Name
+- Namespace
+- Description
+- Size, updated every 15 minutes at most
Projects can be edited or deleted.
The list of projects can be sorted by:
-- Name.
-- Last created.
-- Oldest created.
-- Last updated.
-- Oldest updated.
-- Owner.
+- Updated date
+- Last created
+- Name
+- Most stars
+- Oldest created
+- Oldest updated
+- Largest repository
A user can choose to hide or show archived projects in the list.
In the **Filter by name** field, type the project name you want to find, and GitLab filters
them as you type.
-Select from the **Namespace** dropdown to filter only projects in that namespace.
+To filter only projects in that namespace, select from the **Namespace** dropdown list.
You can combine the filter options. For example, to list only public projects with `score` in their name:
diff --git a/doc/user/admin_area/license.md b/doc/user/admin_area/license.md
index bee784e850b..773f91d3076 100644
--- a/doc/user/admin_area/license.md
+++ b/doc/user/admin_area/license.md
@@ -1,6 +1,6 @@
---
stage: Fulfillment
-group: License
+group: Provision
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -36,7 +36,7 @@ To activate your instance with an activation code:
The subscription is activated.
-If you have an offline or airgapped environment,
+If you have an offline or air gapped environment,
[activate GitLab EE with a license file or key](license_file.md) instead.
If you have questions or need assistance activating your instance,
@@ -51,7 +51,19 @@ To verify the edition, sign in to GitLab and select
**Help** (**{question-o}**) > **Help**. The GitLab edition and version are listed
at the top of the page.
-If you are running GitLab Community Edition (CE), you can upgrade your installation to GitLab
+If you are running GitLab Community Edition, you can upgrade your installation to GitLab
EE. For more details, see [Upgrading between editions](../../update/index.md#upgrading-between-editions).
-If you have questions or need assistance upgrading from GitLab CE to EE,
+If you have questions or need assistance upgrading from GitLab Community Edition (CE) to EE,
[contact GitLab Support](https://about.gitlab.com/support/#contact-support).
+
+## Troubleshooting
+
+### Cannot activate instance due to connectivity error
+
+This error occurs when you use an activation code to activate your instance, but your instance is unable to connect to the GitLab servers.
+
+You may have connectivity issues due to the following reasons:
+
+- **You have an offline or air gapped environment**: Configure your setup to allow connection to GitLab servers. If connection to GitLab servers is not possible, contact [GitLab support](https://about.gitlab.com/support/#contact-support) to request a license key.
+- **Firewall settings**: Enable an encrypted HTTPS connection from your GitLab instance to `customers.gitlab.com` (with IP addresses 104.18.26.123 and 104.18.27.123) on port 443.
+- **Customers Portal is not operational**: To check for performance or service disruptions, check the Customers Portal [status](https://status.gitlab.com/).
diff --git a/doc/user/admin_area/license_file.md b/doc/user/admin_area/license_file.md
index e0332e70681..5999e774d26 100644
--- a/doc/user/admin_area/license_file.md
+++ b/doc/user/admin_area/license_file.md
@@ -1,6 +1,6 @@
---
stage: Fulfillment
-group: License
+group: Provision
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -23,7 +23,7 @@ Otherwise, to add your license:
1. Select the **Terms of Service** checkbox.
1. Select **Add license**.
-## Add your license during installation
+## Add your license file during installation
You can import a license file when you install GitLab.
diff --git a/doc/user/admin_area/merge_requests_approvals.md b/doc/user/admin_area/merge_requests_approvals.md
index 0ecf76902e1..ed7fdfe2111 100644
--- a/doc/user/admin_area/merge_requests_approvals.md
+++ b/doc/user/admin_area/merge_requests_approvals.md
@@ -38,4 +38,4 @@ Merge request approval settings that can be set at an instance level are:
See also the following, which are affected by instance-level rules:
- [Project merge request approval rules](../project/merge_requests/approvals/index.md).
-- [Group merge request approval rules](../group/index.md#group-approval-rules) available in GitLab 13.9 and later.
+- [Group merge request approval settings](../group/index.md#group-approval-settings) available in GitLab 13.9 and later.
diff --git a/doc/user/admin_area/monitoring/background_migrations.md b/doc/user/admin_area/monitoring/background_migrations.md
index 260a8515a1a..726827054da 100644
--- a/doc/user/admin_area/monitoring/background_migrations.md
+++ b/doc/user/admin_area/monitoring/background_migrations.md
@@ -185,3 +185,12 @@ 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"]]']
```
+
+### The `BackfillNamespaceIdForNamespaceRoute` batched migration job fails
+
+In GitLab 14.8, the `BackfillNamespaceIdForNamespaceRoute` batched background migration job
+may fail to complete. When retried, a `500 Server Error` is returned. This issue was
+[resolved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82387) in GitLab 14.9.
+
+To resolve this issue, [upgrade GitLab](../../../update/index.md) from 14.8 to 14.9.
+You can ignore the failed batch migration until after you update to GitLab 14.9.
diff --git a/doc/user/admin_area/settings/account_and_limit_settings.md b/doc/user/admin_area/settings/account_and_limit_settings.md
index 2f30298644a..e6d8107ed9b 100644
--- a/doc/user/admin_area/settings/account_and_limit_settings.md
+++ b/doc/user/admin_area/settings/account_and_limit_settings.md
@@ -199,7 +199,7 @@ To set a limit on how long these sessions are valid:
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/1007) in GitLab 14.7. [Feature flag ff_limit_ssh_key_lifetime](https://gitlab.com/gitlab-org/gitlab/-/issues/347408) removed.
Users can optionally specify a lifetime for
-[SSH keys](../../../ssh/index.md).
+[SSH keys](../../ssh.md).
This lifetime is not a requirement, and can be set to any arbitrary number of days.
SSH keys are user credentials to access GitLab.
diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
index 0330d89aedc..683c07460ee 100644
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ b/doc/user/admin_area/settings/continuous_integration.md
@@ -28,7 +28,18 @@ From now on, every existing project and newly created ones that don't have a
If you want to disable it for a specific project, you can do so in
[its settings](../../../topics/autodevops/index.md#enable-or-disable-auto-devops).
-## Shared runner details
+## Enable shared runners for new projects
+
+You can set all new projects to have the instance's shared runners available by default.
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **Continuous Integration and Deployment**.
+1. Select the **Enable shared runners for new projects** checkbox.
+
+Any time a new project is created, the shared runners are available.
+
+## Add a message for shared runners
To display details about the instance's shared runners in all projects'
runner settings:
@@ -36,16 +47,17 @@ runner settings:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **Continuous Integration and Deployment**.
-1. Enter your shared runner details in the **Shared runner details** field.
+1. Enter text, including Markdown if you want, in the **Shared runner details** field. For example:
+
+ ![Shared runner details input](img/continuous_integration_shared_runner_details_input_v14_10.png)
-You can use [Markdown](../../markdown.md) for improved formatting. To see the rendered
-details:
+To view the rendered details:
1. On the top bar, select **Menu > Project** and select any group or project.
1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **Runners**.
-![Shared runner details example](img/continuous_integration_shared_runner_details_v14_0.png)
+![Shared runner details example](img/continuous_integration_shared_runner_details_v14_10.png)
## Maximum artifacts size
@@ -137,8 +149,8 @@ As an administrator you can set either a global or namespace-specific limit on t
## Archive jobs
-Archiving jobs is useful for reducing the CI/CD footprint on the system by
-removing some of the capabilities of the jobs (metadata needed to run the job),
+Archiving jobs is useful for reducing the CI/CD footprint on the system by removing some
+of the capabilities of the jobs (metadata stored in the database needed to run the job),
but persisting the traces and artifacts for auditing purposes.
To set the duration for which the jobs are considered as old and expired:
@@ -149,7 +161,7 @@ To set the duration for which the jobs are considered as old and expired:
1. Set the value of **Archive jobs**.
1. Hit **Save changes** for the changes to take effect.
-After that time passes, the jobs are archived and no longer able to be
+After that time passes, the jobs are archived in the background and no longer able to be
retried. Make it empty to never expire jobs. It has to be no less than 1 day,
for example: <code>15 days</code>, <code>1 month</code>, <code>2 years</code>.
@@ -178,6 +190,26 @@ 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).
+## Set CI/CD limits
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352175) in GitLab 14.10.
+
+You can configure some [CI/CD limits](../../../administration/instance_limits.md#cicd-limits)
+from the Admin Area:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand the **Continuous Integration and Deployment** section.
+1. In the **CI/CD limits** section, you can set the following limits:
+ - **Maximum number of jobs in a single pipeline**
+ - **Total number of jobs in currently active pipelines**
+ - **Maximum number of active pipelines per project**
+ - **Maximum number of pipeline subscriptions to and from a project**
+ - **Maximum number of pipeline schedules**
+ - **Maximum number of DAG dependencies that a job can have**
+ - **Maximum number of runners registered per group**
+ - **Maximum number of runners registered per project**
+
## Enable or disable the pipeline suggestion banner
By default, a banner displays in merge requests with no pipeline suggesting a
@@ -196,7 +228,7 @@ To enable or disable the banner:
WARNING:
Required pipeline configurations is in its end-of-life process for Premium users. It's
-[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/352316) for use in GitLab 14.8,
+[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/352316) in GitLab 14.8,
and planned to be unavailable for Premium users in GitLab 15.0. This feature is planned to continue
to be available for Ultimate users. Ultimate users are not impacted by this deprecation and removal.
diff --git a/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_input_v14_10.png b/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_input_v14_10.png
new file mode 100644
index 00000000000..08451f36962
--- /dev/null
+++ b/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_input_v14_10.png
Binary files differ
diff --git a/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_0.png b/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_0.png
deleted file mode 100644
index d8bc3deccd4..00000000000
--- a/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_10.png b/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_10.png
new file mode 100644
index 00000000000..64bd9cf6911
--- /dev/null
+++ b/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_10.png
Binary files differ
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 2165dc54899..3eae0d0ff90 100644
--- a/doc/user/admin_area/settings/visibility_and_access_controls.md
+++ b/doc/user/admin_area/settings/visibility_and_access_controls.md
@@ -87,7 +87,7 @@ Alternatively, projects that are marked for removal can be deleted immediately.
## Configure project visibility defaults
-To set the default [visibility levels for new projects](../../../public_access/public_access.md):
+To set the default [visibility levels for new projects](../../public_access.md):
1. Sign in to GitLab as a user with Administrator access level.
1. On the top bar, select **Menu > Admin**.
@@ -112,7 +112,7 @@ To set the default visibility levels for new [snippets](../../snippets.md):
1. Select **Save changes**.
For more details on snippet visibility, read
-[Project visibility](../../../public_access/public_access.md).
+[Project visibility](../../public_access.md).
## Configure group visibility defaults
@@ -146,7 +146,7 @@ To restrict visibility levels for projects, snippets, and selected pages:
1. Select **Save changes**.
For more details on project visibility, see
-[Project visibility](../../../public_access/public_access.md).
+[Project visibility](../../public_access.md).
## Configure allowed import sources
@@ -162,7 +162,7 @@ You can specify from which hosting sites users can [import their projects](../..
## Enable project export
To enable the export of
-[projects and their data](../../../user/project/settings/import_export.md#export-a-project-and-its-data):
+[projects and their data](../../project/settings/import_export.md#export-a-project-and-its-data):
1. Sign in to GitLab as a user with Administrator access level.
1. On the top bar, select **Menu > Admin**.
diff --git a/doc/user/analytics/ci_cd_analytics.md b/doc/user/analytics/ci_cd_analytics.md
index 8e231d18f41..f0de1e58891 100644
--- a/doc/user/analytics/ci_cd_analytics.md
+++ b/doc/user/analytics/ci_cd_analytics.md
@@ -34,34 +34,6 @@ To view CI/CD analytics:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Analytics > CI/CD Analytics**.
-## DevOps Research and Assessment (DORA) key metrics **(ULTIMATE)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/275991) in GitLab 13.7.
-> - [Added support](https://gitlab.com/gitlab-org/gitlab/-/issues/291746) for lead time for changes in GitLab 13.10.
-
-The DevOps Research and Assessment ([DORA](https://cloud.google.com/blog/products/devops-sre/the-2019-accelerate-state-of-devops-elite-performance-productivity-and-scaling))
-team developed several key metrics that you can use as performance indicators for software development
-teams:
-
-- Deployment frequency: How often an organization successfully releases to production.
-- Lead time for changes: The amount of time it takes for code to reach production.
-- Change failure rate: The percentage of deployments that cause a failure in production.
-- Time to restore service: How long it takes for an organization to recover from a failure in
- production.
-
-### Supported metrics in GitLab
-
-The following table shows the supported metrics, at which level they are supported, and which GitLab version (API and UI) they were introduced:
-
-| Metric | Level | API version | Chart (UI) version | Comments |
-|---------------------------|---------------------|--------------------------------------|---------------------------------------|-----------|
-| `deployment_frequency` | Project-level | [13.7+](../../api/dora/metrics.md) | [13.8+](#view-deployment-frequency-chart) | The [old API endpoint](../../api/dora4_project_analytics.md) was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/323713) in 13.10. |
-| `deployment_frequency` | Group-level | [13.10+](../../api/dora/metrics.md) | [13.12+](#view-deployment-frequency-chart) | |
-| `lead_time_for_changes` | Project-level | [13.10+](../../api/dora/metrics.md) | [13.11+](#view-lead-time-for-changes-chart) | Unit in seconds. Aggregation method is median. |
-| `lead_time_for_changes` | Group-level | [13.10+](../../api/dora/metrics.md) | [14.0+](#view-lead-time-for-changes-chart) | Unit in seconds. Aggregation method is median. |
-| `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 | |
-
## View deployment frequency chart **(ULTIMATE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/275991) in GitLab 13.8.
diff --git a/doc/user/analytics/index.md b/doc/user/analytics/index.md
index 01ee9857060..704476cdc90 100644
--- a/doc/user/analytics/index.md
+++ b/doc/user/analytics/index.md
@@ -54,52 +54,81 @@ The following analytics features are available for users to create personalized
Be sure to review the documentation page for this feature for GitLab tier requirements.
+## DevOps Research and Assessment (DORA) key metrics **(ULTIMATE)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/275991) in GitLab 13.7.
+> - [Added support](https://gitlab.com/gitlab-org/gitlab/-/issues/291746) for lead time for changes in GitLab 13.10.
+
+The [DevOps Research and Assessment (DORA)](https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance)
+team developed several key metrics that you can use as performance indicators for software development
+teams.
+
+### Deployment frequency
+
+Deployment frequency is the frequency of successful deployments to production (hourly, daily, weekly, monthly, or yearly).
+This measures how often you deliver value to end users. A higher deployment frequency means you can
+get feedback sooner and iterate faster to deliver improvements and features. GitLab measures this as the number of
+deployments to a production environment in the given time period.
+
+Deployment frequency displays in several charts:
+
+- [Group-level value stream analytics](../group/value_stream_analytics/index.md)
+- [Project-level value stream analytics](value_stream_analytics.md)
+- [CI/CD analytics](ci_cd_analytics.md)
+
+### Lead time for changes
+
+Lead time for changes measures the time to deliver a feature once it has been developed,
+as described in [Measuring DevOps Performance](https://devops.com/measuring-devops-performance/).
+
+Lead time for changes displays in several charts:
+
+- [Group-level value stream analytics](../group/value_stream_analytics/index.md)
+- [Project-level value stream analytics](value_stream_analytics.md)
+- [CI/CD analytics](ci_cd_analytics.md)
+
+### Time to restore service
+
+Time to restore service measures how long it takes an organization to recover from a failure in production.
+GitLab measures this as the average time required to close the incidents
+in the given time period. This assumes:
+
+- All incidents are related to a production environment.
+- Incidents and deployments have a strictly one-to-one relationship. An incident is related to only
+one production deployment, and any production deployment is related to no more than one incident).
+
+To retrieve metrics for time to restore service, use the [GraphQL](../../api/graphql/reference/index.md) or the [REST](../../api/dora/metrics.md) APIs.
+
+### Change failure rate
+
+Change failure rate measures the percentage of deployments that cause a failure in production. GitLab measures this as the number
+of incidents divided by the number of deployments to a
+production environment in the given time period. This assumes:
+
+- All incidents are related to a production environment.
+- Incidents and deployments have a strictly one-to-one relationship. An incident is related to only
+one production deployment, and any production deployment is related to no
+more than one incident.
+
+To retrieve metrics for change failure rate, use the [GraphQL](../../api/graphql/reference/index.md) or the [REST](../../api/dora/metrics.md) APIs.
+
+### Supported DORA metrics in GitLab
+
+| Metric | Level | API | UI chart | Comments |
+|---------------------------|-------------------------|-------------------------------------|---------------------------------------|-------------------------------|
+| `deployment_frequency` | Project | [GitLab 13.7 and later](../../api/dora/metrics.md) | GitLab 14.8 and later | The [previous API endpoint](../../api/dora4_project_analytics.md) was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/323713) in 13.10. |
+| `deployment_frequency` | Group | [GitLab 13.10 and later](../../api/dora/metrics.md) | GitLab 13.12 and later | |
+| `lead_time_for_changes` | Project | [GitLab 13.10 and later](../../api/dora/metrics.md) | GitLab 13.11 and later | Unit in seconds. Aggregation method is median. |
+| `lead_time_for_changes` | Group | [GitLab 13.10 and later](../../api/dora/metrics.md) | GitLab 14.0 and later | Unit in seconds. Aggregation method is median. |
+| `time_to_restore_service` | Project and group | [GitLab 14.9 and later](../../api/dora/metrics.md) | Not supported | |
+| `change_failure_rate` | Project and group | [GitLab 14.10 and later](../../api/dora/metrics.md) | Not supported | |
+
## Definitions
We use the following terms to describe GitLab analytics:
- **Cycle time:** The duration of only the execution work. Cycle time is often displayed in combination with the lead time, which is longer than the cycle time. GitLab measures cycle time from the earliest commit of a [linked issue's merge request](../project/issues/crosslinking_issues.md) to when that issue is closed. The cycle time approach underestimates the lead time because merge request creation is always later than commit time. GitLab displays cycle time in [group-level Value Stream Analytics](../group/value_stream_analytics/index.md) and [project-level Value Stream Analytics](../analytics/value_stream_analytics.md).
- **Deploys:** The total number of successful deployments to production in the given time frame (across all applicable projects). GitLab displays deploys in [group-level Value Stream Analytics](../group/value_stream_analytics/index.md) and [project-level Value Stream Analytics](value_stream_analytics.md).
-- **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**
-
- - **Deployment frequency:** The relative frequency of successful deployments to production
- (hourly, daily, weekly, monthly, or yearly).
- This measures how often you are delivering value to end users. A higher deployment
- frequency means you are able to get feedback and iterate faster to deliver
- improvements and features. GitLab measures this as the number of deployments to a
- [production environment](../../ci/environments/index.md#deployment-tier-of-environments) in
- the given time period.
- GitLab displays deployment frequency in [group-level Value Stream Analytics](../group/value_stream_analytics/index.md) and [project-level Value Stream Analytics](value_stream_analytics.md).
- - **Lead Time for Changes:** The time it takes for a commit to get into production. GitLab
- measures this as the median duration between merge request merge and deployment to a
- [production environment](../../ci/environments/index.md#deployment-tier-of-environments) for
- all MRs deployed in the given time period. This measure under estimates lead time because
- merge time is always later than commit time. The
- [standard definition](https://github.com/GoogleCloudPlatform/fourkeys/blob/main/METRICS.md#lead-time-for-changes) uses median commit time.
- [An issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/328459) to start
- measuring from "issue first commit" as a better proxy, although still imperfect.
-
- - **Stability**
- - **Change Failure Rate:** The percentage of deployments causing a failure in production.
- GitLab measures this as the number of [incidents](../../operations/incident_management/incidents.md)
- divided by the number of deployments to a
- [production environment](../../ci/environments/index.md#deployment-tier-of-environments) in
- the given time period. This assumes:
-
- - All incidents are related to a production environment.
- - Incidents and deployments have a strictly one-to-one relationship (meaning any incident is
- related to only one production deployment, and any production deployment is related to no
- more than one incident).
-
- - **Time to Restore Service:** How long it takes an organization to recover from a failure in
- production. GitLab measures this as the average time required to close the
- [incidents](../../operations/incident_management/incidents.md) in the given time period.
- This assumes:
-
- - All incidents are related to a [production environment](../../ci/environments/index.md#deployment-tier-of-environments).
- - Incidents and deployments have a strictly one-to-one relationship (meaning any incident is related to only one production deployment, and any production deployment is related to no more than one incident).
-
- **Lead time:** The duration of your value stream, from start to finish. Different to
[Lead time for changes](#lead-time-for-changes). Often displayed in combination with "cycle time,"
which is shorter. GitLab measures lead time from issue creation to issue close. GitLab displays lead
@@ -121,8 +150,3 @@ with "plan" and ends with "monitor". GitLab helps you track your value stream us
- **Velocity:** The total issue burden completed in some period of time. The burden is usually measured
in points or weight, often per sprint. For example, your velocity may be "30 points per sprint". GitLab
measures velocity as the total points or weight of issues closed in a given period of time.
-
-## Lead time for changes
-
-"Lead Time for Changes" differs from "Lead Time" because it "focuses on measuring only the time to
-deliver a feature once it has been developed", as described in ([Measuring DevOps Performance](https://devops.com/measuring-devops-performance/)).
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index 5413c28912a..ed94686b7a3 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -91,20 +91,25 @@ The API fuzzing configuration form helps you create or modify your project's API
configuration. The form lets you choose values for the most common API fuzzing options and builds
a YAML snippet that you can paste in your GitLab CI/CD configuration.
-#### Configure Web API fuzzing with the configuration form
+#### Configure Web API fuzzing in the UI
To generate an API Fuzzing configuration snippet:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Security & Compliance > Configuration**.
-1. In the **API Fuzzing** row, select **Configure**.
-1. Complete the form as needed. Read below for more information on available configuration options.
+1. In the **API Fuzzing** row, select **Enable API Fuzzing**.
+1. Complete the fields. For details see [Available CI/CD variables](#available-cicd-variables).
1. Select **Generate code snippet**.
A modal opens with the YAML snippet corresponding to the options you've selected in the form.
-1. Choose one of the following actions:
- 1. To copy the snippet to your clipboard and be redirected to your project's `.gitlab-ci.yml` file,
- where you can paste the YAML configuration, select **Copy code and open `.gitlab-ci.yml` file**.
- 1. To copy the snippet to your clipboard and close the modal, select **Copy code only**.
+1. Do one of the following:
+ 1. To copy the snippet to your clipboard, select **Copy code only**.
+ 1. To add the snippet to your project's `.gitlab-ci.yml` file, select
+ **Copy code and open `.gitlab-ci.yml` file**. The Pipeline Editor opens.
+ 1. Paste the snippet into the `.gitlab-ci.yml` file.
+ 1. Select the **Lint** tab to confirm the edited `.gitlab-ci.yml` file is valid.
+ 1. Select the **Edit** tab, then select **Commit changes**.
+
+When the snippet is committed to the `.gitlab-ci.yml` file, pipelines include an API Fuzzing job.
### OpenAPI Specification
@@ -112,6 +117,7 @@ To generate an API Fuzzing configuration snippet:
> - Support for OpenAPI Specification using YAML format was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330583) in GitLab 14.0.
> - Support for OpenAPI Specification v3.1 was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327268) in GitLab 14.2.
> - Support to generate media type `application/xml` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327268) in GitLab 14.8.
+> - Support to select media types was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333304) in GitLab 14.10.
The [OpenAPI Specification](https://www.openapis.org/) (formerly the Swagger Specification) is an API description format for REST APIs.
This section shows you how to configure API fuzzing using an OpenAPI Specification to provide information about the target API to test.
@@ -125,6 +131,25 @@ the body generation is limited to these body types:
- `application/json`
- `application/xml`
+### OpenAPI and media types
+
+A media type (formerly known as MIME type) is an identifier for file formats and format contents transmitted. A OpenAPI document lets you specify that a given operation can accept different media types, hence a given request can send data using different file content. As for example, a `PUT /user` operation to update user data could accept data in either XML (media type `application/xml`) or JSON (media type `application/json`) format.
+OpenAPI 2.x lets you specify the accepted media types globally or per operation, and OpenAPI 3.x lets you specify the accepted media types per operation. API Fuzzing checks the listed media types and tries to produce sample data for each supported media type.
+
+- In [GitLab 14.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/333304), the default behavior is to select one of the supported media types to use. The first supported media type is chosen from the list. This behavior is configurable.
+- In GitLab 14.9 and earlier, the default behavior is to perform testing using all supported media types. This means if two media types are listed (for example, `application/json` and `application/xml`), tests are performed using JSON, and then the same tests using XML.
+
+Testing the same operation (for example, `POST /user`) using different media types (for example, `application/json` and `application/xml`) is not always desirable.
+For example, if the target application executes the same code regardless of the request content type, it will take longer to finish the test session, and it may report duplicate vulnerabilities related to the request body depending on the target app.
+
+The environment variable `FUZZAPI_OPENAPI_ALL_MEDIA_TYPES` lets you specify whether or not to use all supported media types instead of one when generating requests for a given operation. When the environmental variable `FUZZAPI_OPENAPI_ALL_MEDIA_TYPES` is set to any value, API Fuzzing will try to generate requests for all supported media types instead of one in a given operation. This will cause testing to take longer as testing is repeated for each provided media type.
+
+Alternatively, the variable `FUZZAPI_OPENAPI_MEDIA_TYPES` is used to provide a list of media types that will each be tested. Providing more than one media type causes testing to take longer, as testing is performed for each media type selected. When the environment variable `FUZZAPI_OPENAPI_MEDIA_TYPES` is set to a list of media types, only the listed media types are included when creating requests.
+
+Multiple media types in `FUZZAPI_OPENAPI_MEDIA_TYPES` must separated by a colon (`:`). For example, to limit request generation to the media types `application/x-www-form-urlencoded` and `multipart/form-data`, set the environment variable `FUZZAPI_OPENAPI_MEDIA_TYPES` to `application/x-www-form-urlencoded:multipart/form-data`. Only supported media types in this list are included when creating requests, though unsupported media types are always skipped. A media type text may contain different sections. For example, `application/vnd.api+json; charset=UTF-8` is a compound of `type "/" [tree "."] subtype ["+" suffix]* [";" parameter]`. Parameters are not taken into account when filtering media types on request generation.
+
+The environment variables `FUZZAPI_OPENAPI_ALL_MEDIA_TYPES` and `FUZZAPI_OPENAPI_MEDIA_TYPES` allow you to decide how to handle media types. These settings are mutually exclusive. If both are enabled, API Fuzzing reports an error.
+
#### Configure Web API fuzzing with an OpenAPI Specification
To configure API fuzzing in GitLab with an OpenAPI Specification:
@@ -345,8 +370,8 @@ By default, the API fuzzer uses the Postman file to resolve Postman variable val
is set in a GitLab CI/CD variable `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`, then the JSON
file takes precedence to get Postman variable values.
-Although Postman can export environment variables into a JSON file, the format is not compatible
-with the JSON expected by `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`.
+WARNING:
+Although Postman can export environment variables into a JSON file, the format is not compatible with the JSON expected by `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`.
Here is an example of using `FUZZAPI_POSTMAN_COLLECTION_VARIABLES`:
@@ -561,13 +586,19 @@ profile increases as the number of tests increases.
| CI/CD variable | Description |
|-------------------------------------------------------------|-------------|
| `SECURE_ANALYZERS_PREFIX` | Specify the Docker registry base address from which to download the analyzer. |
-| `FUZZAPI_VERSION` | Specify API Fuzzing container version. Defaults to `latest`. |
+| `FUZZAPI_VERSION` | Specify API Fuzzing container version. Defaults to `1`. |
+| `FUZZAPI_IMAGE_SUFFIX` | Specify a container image suffix. Defaults to none. |
| `FUZZAPI_TARGET_URL` | Base URL of API testing target. |
| `FUZZAPI_CONFIG` | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/276395) in GitLab 13.12, replaced with default `.gitlab/gitlab-api-fuzzing-config.yml`. API Fuzzing configuration file. |
|[`FUZZAPI_PROFILE`](#api-fuzzing-profiles) | Configuration profile to use during testing. Defaults to `Quick-10`. |
|[`FUZZAPI_EXCLUDE_PATHS`](#exclude-paths) | Exclude API URL paths from testing. |
+|[`FUZZAPI_EXCLUDE_URLS`](#exclude-urls) | Exclude API URL from testing. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357195) in GitLab 14.10. |
+|[`FUZZAPI_EXCLUDE_PARAMETER_ENV`](#exclude-parameters) | JSON string containing excluded parameters. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292196) in GitLab 14.10. |
+|[`FUZZAPI_EXCLUDE_PARAMETER_FILE`](#exclude-parameters) | Path to a JSON file containing excluded parameters. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292196) in GitLab 14.10. |
|[`FUZZAPI_OPENAPI`](#openapi-specification) | OpenAPI Specification file or URL. |
|[`FUZZAPI_OPENAPI_RELAXED_VALIDATION`](#openapi-specification) | Relax document validation. Default is disabled. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345950) in GitLab 14.7. |
+|[`FUZZAPI_OPENAPI_ALL_MEDIA_TYPES`](#openapi-specification) | Use all supported media types instead of one when generating requests. Causes test duration to be longer. Default is disabled. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333304) in GitLab 14.10. |
+|[`FUZZAPI_OPENAPI_MEDIA_TYPES`](#openapi-specification) | Colon (`:`) separated media types accepted for testing. Default is disabled. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333304) in GitLab 14.10. |
|[`FUZZAPI_HAR`](#http-archive-har) | HTTP Archive (HAR) file. |
|[`FUZZAPI_POSTMAN_COLLECTION`](#postman-collection) | Postman Collection file. |
|[`FUZZAPI_POSTMAN_COLLECTION_VARIABLES`](#postman-variables) | Path to a JSON file to extract Postman variable values. |
@@ -891,7 +922,7 @@ def get_auth_response():
# In our example, access token is retrieved from a given endpoint
try:
- # Performs a http request, response sample:
+ # Performs a http request, response sample:
# { "Token" : "b5638ae7-6e77-4585-b035-7d9de2e3f6b3" }
response = get_auth_response()
@@ -921,7 +952,7 @@ except Exception as e:
logging.error(f'Error, unknown error while retrieving access token. Error message: {e}')
raise
-# computes object that holds overrides file content.
+# computes object that holds overrides file content.
# It uses data fetched from request
overrides_data = {
"headers": {
@@ -1036,6 +1067,294 @@ variables:
FUZZAPI_EXCLUDE_PATHS=/auth*;/v1/*
```
+### Exclude parameters
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292196) in GitLab 14.10.
+
+While testing an API you may might want to exclude a parameter (query string, header, or body element) from testing. This may be needed because a parameter always causes a failure, slows down testing, or for other reasons. To exclude parameters you can use one of the following variables: `FUZZAPI_EXCLUDE_PARAMETER_ENV` or `FUZZAPI_EXCLUDE_PARAMETER_FILE`.
+
+The `FUZZAPI_EXCLUDE_PARAMETER_ENV` allows providing a JSON string containing excluded parameters. This is a good option if the JSON is short and will not often change. Another option is the variable `FUZZAPI_EXCLUDE_PARAMETER_FILE`. This variable is set to a file path that can be checked into the repository, created by another job as an artifact, or generated at runtime from a pre script using `FUZZAPI_PRE_SCRIPT`.
+
+#### Exclude parameters using a JSON document
+
+The JSON document contains a JSON object which uses specific properties to identify which parameter should be excluded.
+You can provide the following properties to exclude specific parameters during the scanning process:
+
+- `headers`: Use this property to exclude specific headers. The property's value is an array of header names to be excluded. Names are case-insensitive.
+- `cookies`: Use this property's value to exclude specific cookies. The property's value is an array of cookie names to be excluded. Names are case-sensitive.
+- `query`: Use this property to exclude specific fields from the query string. The property's value is an array of field names from the query string to be excluded. Names are case-sensitive.
+- `body-form`: Use this property to exclude specific fields from a request that uses the media type `application/x-www-form-urlencoded`. The property's value is an array of the field names from the body to be excluded. Names are case-sensitive.
+- `body-json`: Use this property to exclude specific JSON nodes from a request that uses the media type `application/json`. The property's value is an array, each entry of the array is a [JSON Path](https://goessner.net/articles/JsonPath/) expression.
+- `body-xml`: Use this property to exclude specific XML nodes from a request that uses media type `application/xml`. The property's value is an array, each entry of the array is a [XPath v2](https://www.w3.org/TR/xpath20/) expression.
+
+The following JSON document is an example of the expected structure to exclude parameters.
+
+```json
+{
+ "headers": [
+ "header1",
+ "header2"
+ ],
+ "cookies": [
+ "cookie1",
+ "cookie2"
+ ],
+ "query": [
+ "query-string1",
+ "query-string2"
+ ],
+ "body-form": [
+ "form-param1",
+ "form-param2"
+ ],
+ "body-json": [
+ "json-path-expression-1",
+ "json-path-expression-2"
+ ],
+ "body-xml" : [
+ "xpath-expression-1",
+ "xpath-expression-2"
+ ]
+}
+```
+
+#### Examples
+
+##### Excluding a single header
+
+To exclude the header `Upgrade-Insecure-Requests`, set the `header` property's value to an array with the header name: `[ "Upgrade-Insecure-Requests" ]`. For instance, the JSON document looks like this:
+
+```json
+{
+ "headers": [ "Upgrade-Insecure-Requests" ]
+}
+```
+
+Header names are case-insensitive, thus the header name `UPGRADE-INSECURE-REQUESTS` is equivalent to `Upgrade-Insecure-Requests`.
+
+##### Excluding both a header and two cookies
+
+To exclude the header `Authorization` and the cookies `PHPSESSID` and `csrftoken`, set the `headers` property's value to an array with header name `[ "Authorization" ]` and the `cookies` property's value to an array with the cookies' names `[ "PHPSESSID", "csrftoken" ]`. For instance, the JSON document looks like this:
+
+```json
+{
+ "headers": [ "Authorization" ],
+ "cookies": [ "PHPSESSID", "csrftoken" ]
+}
+```
+
+##### Excluding a `body-form` parameter
+
+To exclude the `password` field in a request that uses `application/x-www-form-urlencoded`, set the `body-form` property's value to an array with the field name `[ "password" ]`. For instance, the JSON document looks like this:
+
+```json
+{
+ "body-form": [ "password" ]
+}
+```
+
+The exclude parameters uses `body-form` when the request uses a content type `application/x-www-form-urlencoded`.
+
+##### Excluding a specific JSON nodes using JSON Path
+
+To exclude the `schema` property in the root object, set the `body-json` property's value to an array with the JSON Path expression `[ "$.schema" ]`.
+
+The JSON Path expression uses special syntax to identify JSON nodes: `$` refers to the root of the JSON document, `.` refers to the current object (in our case the root object), and the text `schema` refers to a property name. Thus, the JSON path expression `$.schema` refers to a property `schema` in the root object.
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-json": [ "$.schema" ]
+}
+```
+
+The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path, characters like `$`, `*`, `.` among others have special meaning.
+
+##### Excluding multiple JSON nodes using JSON Path
+
+To exclude the property `password` on each entry of an array of `users` at the root level, set the `body-json` property's value to an array with the JSON Path expression `[ "$.users[*].paswword" ]`.
+
+The JSON Path expression starts with `$` to refer to the root node and uses `.` to refer to the current node. Then, it uses `users` to refer to a property and the characters `[` and `]` to enclose the index in the array you want to use, instead of providing a number as an index you use `*` to specify any index. After the index reference, we find `.` which now refers to any given selected index in the array, preceded by a property name `password`.
+
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-json": [ "$.users[*].paswword" ]
+}
+```
+
+The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path characters like `$`, `*`, `.` among others have special meaning.
+
+##### Excluding an XML attribute
+
+To exclude an attribute named `isEnabled` located in the root element `credentials`, set the `body-xml` property's value to an array with the XPath expression `[ "/credentials/@isEnabled" ]`.
+
+The XPath expression `/credentials/@isEnabled`, starts with `/` to indicate the root of the XML document, then it is followed by the word `credentials` which indicates the name of the element to match. It uses a `/` to refer to a node of the previous XML element, and the character `@` to indicate that the name `isEnable` is an attribute.
+
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-xml": [
+ "/credentials/@isEnabled"
+ ]
+}
+```
+
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be an [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions, characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+
+##### Excluding an XML element's text
+
+To exclude the text of the `username` element contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username/text()" ]`.
+
+In the XPath expression `/credentials/username/text()`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `username`. Last part has a `/` that refers to the current element, and uses a XPath function called `text()` which identifies the text of the current element.
+
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-xml": [
+ "/credentials/username/text()"
+ ]
+}
+```
+
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+
+##### Excluding an XML element
+
+To exclude the element `username` contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username" ]`.
+
+In the XPath expression `/credentials/username`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `username`.
+
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-xml": [
+ "/credentials/username"
+ ]
+}
+```
+
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+
+##### Excluding an XML node with namespaces
+
+To exclude a XML element `login` which is defined in namespace `s`, and contained in `credentials` root node, set the `body-xml` property's value to an array with the XPath expression `[ "/credentials/s:login" ]`.
+
+In the XPath expression `/credentials/s:login`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `s:login`. Notice that name contains the character `:`, this character separates the namespace from the node name.
+
+The namespace name should have been defined in the XML document which is part of the body request. You may check the namespace in the specification document HAR, OpenAPI, or Postman Collection file.
+
+```json
+{
+ "body-xml": [
+ "/credentials/s:login"
+ ]
+}
+```
+
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+
+#### Using a JSON string
+
+To provide the exclusion JSON document set the variable `FUZZAPI_EXCLUDE_PARAMETER_ENV` with the JSON string. In the following example, the `.gitlab-ci.yml`, the `FUZZAPI_EXCLUDE_PARAMETER_ENV` variable is set to a JSON string:
+
+```yaml
+stages:
+ - fuzz
+
+include:
+ - template: API-Fuzzing.gitlab-ci.yml
+
+variables:
+ FUZZAPI_PROFILE: Quick
+ FUZZAPI_OPENAPI: test-api-specification.json
+ FUZZAPI_TARGET_URL: http://test-deployment/
+ FUZZAPI_EXCLUDE_PARAMETER_ENV: '{ "headers": [ "Upgrade-Insecure-Requests" ] }'
+```
+
+#### Using a file
+
+To provide the exclusion JSON document, set the variable `FUZZAPI_EXCLUDE_PARAMETER_FILE` with the JSON file path. The file path is relative to the job current working directory. In the following example `.gitlab-ci.yml` file, the `FUZZAPI_EXCLUDE_PARAMETER_FILE` variable is set to a JSON file path:
+
+```yaml
+stages:
+ - fuzz
+
+include:
+ - template: API-Fuzzing.gitlab-ci.yml
+
+variables:
+ FUZZAPI_PROFILE: Quick
+ FUZZAPI_OPENAPI: test-api-specification.json
+ FUZZAPI_TARGET_URL: http://test-deployment/
+ FUZZAPI_EXCLUDE_PARAMETER_FILE: api-fuzzing-exclude-parameters.json
+```
+
+The `api-fuzzing-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
+
+### Exclude URLS
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357195) in GitLab 14.10.
+
+As an alternative to excluding by paths, you can filter by any other component in the URL by using the `FUZZAPI_EXCLUDE_URLS` CI/CD variable. This variable can be set in your `.gitlab-ci.yml` file. The variable can store multiple values, separated by commas (`,`). Each value is a regular expression. Because each entry is a regular expression, an entry such as `.*` excludes all URLs because it is a regular expression that matches everything.
+
+In your job output you can check if any URLs matched any provided regular expression from `FUZZAPI_EXCLUDE_URLS`. Matching operations are listed in the **Excluded Operations** section. Operations listed in the **Excluded Operations** should not be listed in the **Tested Operations** section. For example the following portion of a job output:
+
+```plaintext
+2021-05-27 21:51:08 [INF] API Security: --[ Tested Operations ]-------------------------
+2021-05-27 21:51:08 [INF] API Security: 201 POST http://target:7777/api/users CREATED
+2021-05-27 21:51:08 [INF] API Security: ------------------------------------------------
+2021-05-27 21:51:08 [INF] API Security: --[ Excluded Operations ]-----------------------
+2021-05-27 21:51:08 [INF] API Security: GET http://target:7777/api/messages
+2021-05-27 21:51:08 [INF] API Security: POST http://target:7777/api/messages
+2021-05-27 21:51:08 [INF] API Security: ------------------------------------------------
+```
+
+NOTE:
+Each value in `FUZZAPI_EXCLUDE_URLS` is a regular expression. Characters such as `.` , `*` and `$` among many others have special meanings in [regular expressions](https://en.wikipedia.org/wiki/Regular_expression#Standards).
+
+#### Examples
+
+##### Excluding a URL and child resources
+
+The following example excludes the URL `http://target/api/auth` and its child resources.
+
+```yaml
+variables:
+ FUZZAPI_EXCLUDE_URLS: http://target/api/auth
+```
+
+##### Excluding two URLs and allow their child resources
+
+To exclude the URLs `http://target/api/buy` and `http://target/api/sell` but allowing to scan their child resources, for instance: `http://target/api/buy/toy` or `http://target/api/sell/chair`. You could use the value `http://target/api/buy/$,http://target/api/sell/$`. This value is using two regular expressions, each of them separated by a `,` character. Hence, it contains `http://target/api/buy$` and `http://target/api/sell$`. In each regular expression, the trailing `$` character points out where the matching URL should end.
+
+```yaml
+variables:
+ FUZZAPI_EXCLUDE_URLS: http://target/api/buy/$,http://target/api/sell/$
+```
+
+##### Excluding two URLs and their child resources
+
+In order to exclude the URLs: `http://target/api/buy` and `http://target/api/sell`, and their child resources. To provide multiple URLs we use the `,` character as follows:
+
+```yaml
+variables:
+ FUZZAPI_EXCLUDE_URLS: http://target/api/buy,http://target/api/sell
+```
+
+##### Excluding URL using regular expressions
+
+In order to exclude exactly `https://target/api/v1/user/create` and `https://target/api/v2/user/create` or any other version (`v3`,`v4`, and more). We could use `https://target/api/v.*/user/create$`, in the previous regular expression `.` indicates any character and `*` indicates zero or more times, additionally `$` indicates that the URL should end there.
+
+```yaml
+variables:
+ FUZZAPI_EXCLUDE_URLS: https://target/api/v.*/user/create$
+```
+
### Header Fuzzing
Header fuzzing is disabled by default due to the high number of false positives that occur with many
@@ -1495,6 +1814,19 @@ API Security can still try to consume an OpenAPI document that does not fully co
FUZZAPI_OPENAPI_RELAXED_VALIDATION: On
```
+### No operation in the OpenAPI document is consuming any supported media type
+
+API Security uses the specified media types in the OpenAPI document to generate requests. If no request can be created due to the lack of supported media types, then an error will be thrown.
+
+**Error message**
+
+- In [GitLab 14.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/333304), `Error, no operation in the OpenApi document is consuming any supported media type. Check 'OpenAPI Specification' to check the supported media types.`
+
+**Solution**
+
+1. Review the supported media types in the [OpenAPI Specification](#openapi-specification) section.
+1. Edit your OpenAPI document, allowing at least a given operation to accept any of the supported media types. Alternatively, a supported media type could be set in the OpenAPI document level and get applied to all operations. This step may require changes in your application to ensure the supported media type is accepted by the application.
+
## Get support or request an improvement
To get support for your particular problem please use the [getting help channels](https://about.gitlab.com/get-help/).
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index f2d6cef669d..64566e458ee 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -186,7 +186,7 @@ The `CS_DISABLE_LANGUAGE_VULNERABILITY_SCAN` CI/CD variable controls whether the
findings related to programming languages. The languages supported depend on the
[scanner used](#change-scanners):
-- [Trivy](https://aquasecurity.github.io/trivy/latest/vulnerability/detection/language/).
+- [Trivy](https://aquasecurity.github.io/trivy/latest/docs/vulnerability/detection/language/).
- [Grype](https://github.com/anchore/grype#features).
By default, the report only includes packages managed by the Operating System (OS) package manager
@@ -222,6 +222,7 @@ You can [configure](#customizing-the-container-scanning-settings) analyzers by u
| `CS_DISABLE_DEPENDENCY_LIST` | `"false"` | Disable Dependency Scanning for packages installed in the scanned image. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345434) in GitLab 14.6. | All |
| `CS_DISABLE_LANGUAGE_VULNERABILITY_SCAN` | `"true"` | Disable scanning for language-specific packages installed in the scanned image. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345434) in GitLab 14.6. | All |
| `CS_DOCKER_INSECURE` | `"false"` | Allow access to secure Docker registries using HTTPS without validating the certificates. | All |
+| `CS_IMAGE_SUFFIX` | `""` | Suffix added to `CS_ANALYZER_IMAGE`. If set to `-fips`, `FIPS-enabled` image is used for scan. See [FIPS-enabled images](#fips-enabled-images) for more details. [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/7630) in GitLab 14.10. | All |
| `CS_IGNORE_UNFIXED` | `"false"` | Ignore vulnerabilities that are not fixed. | All |
| `CS_REGISTRY_INSECURE` | `"false"` | Allow access to insecure registries (HTTP only). Should only be set to `true` when testing the image locally. Works with all scanners, but the registry must listen on port `80/tcp` for Trivy to work. | All |
| `CS_SEVERITY_THRESHOLD` | `UNKNOWN` | Severity level threshold. The scanner outputs vulnerabilities with severity level higher than or equal to this threshold. Supported levels are Unknown, Low, Medium, High, and Critical. | Trivy |
@@ -236,22 +237,29 @@ You can [configure](#customizing-the-container-scanning-settings) analyzers by u
Support depends on the scanner:
- [Grype](https://github.com/anchore/grype#grype)
-- [Trivy](https://aquasecurity.github.io/trivy/latest/vulnerability/detection/os/) (Default).
+- [Trivy](https://aquasecurity.github.io/trivy/latest/docs/vulnerability/detection/os/) (Default).
-#### UBI-based images
+#### FIPS-enabled images
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5775) in GitLab 14.1.
-GitLab also offers [Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
-versions of the container-scanning images. You can therefore replace standard images with UBI-based
-images. To configure the images, set the `CS_ANALYZER_IMAGE` variable to the standard tag plus the
-`-ubi` extension.
+GitLab also offers [FIPS-enabled Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
+versions of the container-scanning images. You can therefore replace standard images with FIPS-enabled
+images. To configure the images, set the `CS_IMAGE_SUFFIX` to `-fips` or modify the `CS_ANALYZER_IMAGE` variable to the
+standard tag plus the `-fips` extension.
| Scanner name | `CS_ANALYZER_IMAGE` |
| --------------- | ------------------- |
-| Default (Trivy) | `registry.gitlab.com/security-products/container-scanning:4-ubi` |
-| Grype | `registry.gitlab.com/security-products/container-scanning/grype:4-ubi` |
-| Trivy | `registry.gitlab.com/security-products/container-scanning/trivy:4-ubi` |
+| Default (Trivy) | `registry.gitlab.com/security-products/container-scanning:4-fips` |
+| Grype | `registry.gitlab.com/security-products/container-scanning/grype:4-fips` |
+| Trivy | `registry.gitlab.com/security-products/container-scanning/trivy:4-fips` |
+
+NOTE:
+Prior to GitLab 15.0, the `-ubi` image extension is also available. GitLab 15.0 and later only
+support `-fips`.
+
+Starting with GitLab 14.10, `-fips` is automatically added to `CS_ANALYZER_IMAGE` when FIPS mode is
+enabled in the GitLab instance.
### Enable Container Scanning through an automatic merge request
@@ -753,7 +761,7 @@ The images include the latest advisory database available for their respective s
scanner includes data from multiple sources:
- [Grype](https://github.com/anchore/grype#grypes-database).
-- [Trivy](https://aquasecurity.github.io/trivy/latest/vulnerability/detection/data-source/).
+- [Trivy](https://aquasecurity.github.io/trivy/latest/docs/vulnerability/detection/data-source/).
Database update information for other analyzers is available in the
[maintenance table](../index.md#vulnerability-scanner-maintenance).
diff --git a/doc/user/application_security/dast/checks/598.2.md b/doc/user/application_security/dast/checks/598.2.md
new file mode 100644
index 00000000000..f6c6787128d
--- /dev/null
+++ b/doc/user/application_security/dast/checks/598.2.md
@@ -0,0 +1,30 @@
+---
+stage: Secure
+group: Dynamic Analysis
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Use of GET request method with sensitive query strings (password)
+
+## Description
+
+The user's password was identified in the request URL. Passwords should never be sent in GET
+requests as they maybe captured by proxy systems, stored in browser history, or stored in
+log files. If an attacker were to get access to these logs or logging systems, they would
+be able to gain access to the target account.
+
+## Remediation
+
+Passwords should never be sent in GET requests. When authenticating users or requesting users
+reset their passwords, always use POST requests to transmit sensitive data.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 598.2 | true | 598 | Passive | Medium |
+
+## Links
+
+- [OWASP](https://owasp.org/www-community/vulnerabilities/Information_exposure_through_query_strings_in_url)
+- [CWE](https://cwe.mitre.org/data/definitions/598.html)
diff --git a/doc/user/application_security/dast/checks/598.3.md b/doc/user/application_security/dast/checks/598.3.md
new file mode 100644
index 00000000000..fa6fdf43e1c
--- /dev/null
+++ b/doc/user/application_security/dast/checks/598.3.md
@@ -0,0 +1,31 @@
+---
+stage: Secure
+group: Dynamic Analysis
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Use of GET request method with sensitive query strings (Authorization header details)
+
+## Description
+
+The authorization header value was identified in the request URL. These headers typically contain
+usernames and passwords or JWT tokens. These values should never be sent in GET requests as they
+maybe captured by proxy systems, stored in browser history, or stored in log files. If an attacker
+were to get access to these logs or logging systems, they would be able to gain access to the
+target account.
+
+## Remediation
+
+Authorization header details should never be sent in GET requests. When transmitting sensitive information
+such as JWT tokens, always use POST requests or headers to transmit the sensitive data.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 598.3 | true | 598 | Passive | Medium |
+
+## Links
+
+- [OWASP](https://owasp.org/www-community/vulnerabilities/Information_exposure_through_query_strings_in_url)
+- [CWE](https://cwe.mitre.org/data/definitions/598.html)
diff --git a/doc/user/application_security/dast/checks/829.1.md b/doc/user/application_security/dast/checks/829.1.md
new file mode 100644
index 00000000000..ca3d99c2bc9
--- /dev/null
+++ b/doc/user/application_security/dast/checks/829.1.md
@@ -0,0 +1,48 @@
+---
+stage: Secure
+group: Dynamic Analysis
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Inclusion of Functionality from Untrusted Control Sphere
+
+## Description
+
+JavaScript or CSS source files are included from third party domains without
+[Sub-Resource Integrity (SRI)](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity).
+If an attacker were to compromise the sites hosting these third party resources, they could inject malicious
+script or CSS data in an attempt to compromise users of your application. However, if SRI was applied and an
+attacker attempted to modify the contents of the script, the browser would not load the script and your
+applications users would be protected from the malicious alterations.
+
+## Remediation
+
+All identified resources should be sourced from the same domain as the target application. If this is not
+possible, it is strongly recommended that all `script` tags that implement `src` values, or `link` tags
+that implement the `href` values include Sub-Resource Integrity. To generate SRI integrity values the
+[srihash](https://www.srihash.org/) tool can be used, or by running one of the following commands:
+
+- `cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A`
+- `shasum -b -a 384 FILENAME.js | awk '{ print $1 }' | xxd -r -p | base64`
+
+The output of these tools must be added as additional attributes, in particular: `integrity` and either
+`crossorigin=anonymous` or `crossorigin=use-credentials`.
+An example of a valid SRI protected script tag can be found below:
+
+```html
+<script src="https://example.com/example-framework.js"
+ integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
+ crossorigin="anonymous"></script>
+```
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 829.1 | true | 829 | Passive | Low |
+
+## Links
+
+- [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/Third_Party_Javascript_Management_Cheat_Sheet.html#subresource-integrity)
+- [CWE](https://cwe.mitre.org/data/definitions/829.html)
+- [MDN](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)
diff --git a/doc/user/application_security/dast/checks/829.2.md b/doc/user/application_security/dast/checks/829.2.md
new file mode 100644
index 00000000000..e6fada117f8
--- /dev/null
+++ b/doc/user/application_security/dast/checks/829.2.md
@@ -0,0 +1,47 @@
+---
+stage: Secure
+group: Dynamic Analysis
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Invalid Sub-Resource Integrity values detected
+
+## Description
+
+JavaScript or CSS source files were found to contain invalid
+[Sub-Resource Integrity (SRI)](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)
+`integrity` values or a missing `crossorigin` value. These scripts or links should be investigated to
+ensure they have not been maliciously altered. If in doubt, contact the owner of the scripts or replace
+them with known good versions.
+
+## Remediation
+
+All identified resources should be sourced from the same domain as the target application. If this is not
+possible, it is strongly recommended that all `script` tags that implement `src` values, or `link` tags
+that implement the `href` values include Sub-Resource Integrity. To generate SRI integrity values the
+[srihash](https://www.srihash.org/) tool can be used, or by running one of the following commands:
+
+- `cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A`
+- `shasum -b -a 384 FILENAME.js | awk '{ print $1 }' | xxd -r -p | base64`
+
+The output of these tools must be added as additional attributes, in particular: `integrity` and either
+`crossorigin=anonymous` or `crossorigin=use-credentials`.
+An example of a valid SRI protected script tag can be found below:
+
+```html
+<script src="https://example.com/example-framework.js"
+ integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
+ crossorigin="anonymous"></script>
+```
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 829.2 | true | 829 | Passive | Medium |
+
+## Links
+
+- [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/Third_Party_Javascript_Management_Cheat_Sheet.html#subresource-integrity)
+- [CWE](https://cwe.mitre.org/data/definitions/829.html)
+- [MDN](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)
diff --git a/doc/user/application_security/dast/checks/index.md b/doc/user/application_security/dast/checks/index.md
index 435bc28c4aa..764e3c4a839 100644
--- a/doc/user/application_security/dast/checks/index.md
+++ b/doc/user/application_security/dast/checks/index.md
@@ -20,5 +20,9 @@ The [DAST browser-based crawler](../browser_based.md) provides a number of vulne
| [200.1](200.1.md) | Exposure of sensitive information to an unauthorized actor (private IP address) | Low | Passive |
| [548.1](548.1.md) | Exposure of information through directory listing | Low | Passive |
| [598.1](598.1.md) | Use of GET request method with sensitive query strings (session ID) | Medium | Passive |
+| [598.2](598.2.md) | Use of GET request method with sensitive query strings (password) | Medium | Passive |
+| [598.3](598.3.md) | Use of GET request method with sensitive query strings (Authorization header details) | Medium | Passive |
| [614.1](614.1.md) | Sensitive cookie without Secure attribute | Low | Passive |
| [693.1](693.1.md) | Missing X-Content-Type-Options: nosniff | Low | Passive |
+| [829.1](829.1.md) | Inclusion of Functionality from Untrusted Control Sphere | Low | Passive |
+| [829.2](829.2.md) | Invalid Sub-Resource Integrity values detected | Medium | Passive |
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index fd6c39ffbf1..ee57803dfc7 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -278,7 +278,8 @@ page.
You can enable or configure DAST settings using the UI. The generated settings are formatted so they
can be conveniently pasted into the `.gitlab-ci.yml` file.
-1. From the project's home page, go to **Security & Compliance > Configuration**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Security & Compliance > Configuration**.
1. In the **Dynamic Application Security Testing (DAST)** section, select **Enable DAST** or
**Configure DAST**.
1. Select the desired **Scanner profile**, or select **Create scanner profile** and save a
@@ -288,12 +289,14 @@ can be conveniently pasted into the `.gitlab-ci.yml` file.
1. Select **Generate code snippet**. A modal opens with the YAML snippet corresponding to the
options you selected.
1. Do one of the following:
- 1. Select **Copy code only** to copy the snippet to your clipboard.
- 1. Select **Copy code and open `.gitlab-ci.yml` file** to copy the snippet to your clipboard. The
- CI/CD Editor then opens.
+ 1. To copy the snippet to your clipboard, select **Copy code only**.
+ 1. To add the snippet to your project's `.gitlab-ci.yml` file, select
+ **Copy code and open `.gitlab-ci.yml` file**. The Pipeline Editor opens.
1. Paste the snippet into the `.gitlab-ci.yml` file.
1. Select the **Lint** tab to confirm the edited `.gitlab-ci.yml` file is valid.
- 1. Select **Commit changes**.
+ 1. Select the **Edit** tab, then select **Commit changes**.
+
+When the snippet is committed to the `.gitlab-ci.yml` file, pipelines include a DAST job.
#### Crawling web applications dependent on JavaScript
@@ -1053,7 +1056,7 @@ To run an on-demand scan either at a scheduled date or frequency, read
1. From your project's home page, go to **Security & Compliance > On-demand Scans** in the left
sidebar.
-1. Select **New DAST scan**.
+1. Select **New scan**.
1. Complete the **Scan name** and **Description** fields.
1. In GitLab 13.10 and later, select the desired branch from the **Branch** dropdown.
1. In **Scanner profile**, select a scanner profile from the dropdown.
@@ -1088,7 +1091,7 @@ To schedule a scan:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Security & Compliance > On-demand Scans**.
-1. Select **New DAST scan**.
+1. Select **New scan**.
1. Complete the **Scan name** and **Description** text boxes.
1. In GitLab 13.10 and later, from the **Branch** dropdown list, select the desired branch.
1. In the **Scanner profile** section, from the dropdown list, select a scanner profile.
diff --git a/doc/user/application_security/dast_api/index.md b/doc/user/application_security/dast_api/index.md
index 839833d9d98..a4908204b60 100644
--- a/doc/user/application_security/dast_api/index.md
+++ b/doc/user/application_security/dast_api/index.md
@@ -7,73 +7,65 @@ type: reference, howto
# DAST API **(ULTIMATE)**
-You can add dynamic application security testing of web APIs to your [GitLab CI/CD](../../../ci/index.md) pipelines.
-This helps you discover bugs and potential security issues that other QA processes may miss.
+You can add dynamic application security testing (DAST) of web APIs to your
+[GitLab CI/CD](../../../ci/index.md) pipelines. This helps you discover bugs and potential security
+issues that other QA processes may miss.
We recommend that you use DAST API testing in addition to [GitLab Secure](../index.md)'s
other security scanners and your own test processes. If you're using [GitLab CI/CD](../../../ci/index.md),
you can run DAST API tests as part your CI/CD workflow.
-## Requirements
-
-- One of the following web API types:
- - REST API
- - SOAP
- - GraphQL
- - Form bodies, JSON, or XML
-- One of the following assets to provide APIs to test:
- - OpenAPI v2 or v3 API definition
- - Postman Collection v2.0 or v2.1
- - HTTP Archive (HAR) of API requests to test
+WARNING:
+Do not run DAST API testing against a production server. Not only can it perform *any* function that
+the API can, it may also trigger bugs in the API. This includes actions like modifying and deleting
+data. Only run DAST API against a test server.
-## When DAST API scans run
+You can run DAST API scanning against the following web API types:
-When using the `DAST-API.gitlab-ci.yml` template, the defined jobs use the `dast` stage by default. To enable your `.gitlab-ci.yml` file must include the `dast` stage in your `stages` definition. To ensure DAST API scans the latest code, your CI pipeline should deploy changes to a test environment in a stage before the `dast` stage:
+- REST API
+- SOAP
+- GraphQL
+- Form bodies, JSON, or XML
-```yaml
-stages:
- - build
- - test
- - deploy
- - dast
-```
+## When DAST API scans run
-Note that if your pipeline is configured to deploy to the same web server on each run, running a
-pipeline while another is still running could cause a race condition in which one pipeline
-overwrites the code from another. The API to scan should be excluded from changes for the duration
-of a DAST API scan. The only changes to the API should be from the DAST API scanner. Be aware that
-any changes made to the API (for example, by users, scheduled tasks, database changes, code
-changes, other pipelines, or other scanners) during a scan could cause inaccurate results.
+DAST API scanning runs in the `dast` stage by default. To ensure DAST API scanning examines the latest
+code, ensure your CI/CD pipeline deploys changes to a test environment in a stage before the `dast`
+stage.
-## Enable DAST API scanning
+If your pipeline is configured to deploy to the same web server on each run, running a pipeline
+while another is still running could cause a race condition in which one pipeline overwrites the
+code from another. The API to be scanned should be excluded from changes for the duration of a
+DAST API scan. The only changes to the API should be from the DAST API scanner. Changes made to the
+API (for example, by users, scheduled tasks, database changes, code changes, other pipelines, or
+other scanners) during a scan could cause inaccurate results.
-There are three ways to perform scans. See the configuration section for the one you wish to use:
+## Example DAST API scanning configurations
-- [OpenAPI v2 or v3 specification](#openapi-specification)
-- [HTTP Archive (HAR)](#http-archive-har)
-- [Postman Collection v2.0 or v2.1](#postman-collection)
+The following projects demonstrate DAST API scanning:
-Examples of various configurations can be found here:
-
-- [Example OpenAPI v2 specification project](https://gitlab.com/gitlab-org/security-products/demos/api-dast/openapi-example)
+- [Example OpenAPI v2 Specification project](https://gitlab.com/gitlab-org/security-products/demos/api-dast/openapi-example)
- [Example HTTP Archive (HAR) project](https://gitlab.com/gitlab-org/security-products/demos/api-dast/har-example)
- [Example Postman Collection project](https://gitlab.com/gitlab-org/security-products/demos/api-dast/postman-example)
- [Example GraphQL project](https://gitlab.com/gitlab-org/security-products/demos/api-dast/graphql-example)
- [Example SOAP project](https://gitlab.com/gitlab-org/security-products/demos/api-dast/soap-example)
-WARNING:
-GitLab 14.0 will require that you place DAST API configuration files (for example,
-`gitlab-dast-api-config.yml`) in your repository's `.gitlab` directory instead of your
-repository's root. You can continue using your existing configuration files as they are, but
-starting in GitLab 14.0, GitLab will not check your repository's root for configuration files.
+## Targeting API for DAST scanning
+
+You can specify the API you want to scan by using:
+
+- [OpenAPI v2 or v3 Specification](#openapi-specification)
+- [HTTP Archive (HAR)](#http-archive-har)
+- [Postman Collection v2.0 or v2.1](#postman-collection)
### OpenAPI Specification
> - Support for OpenAPI Specification using YAML format was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330583) in GitLab 14.0.
> - Support to generate media type `application/xml` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327268) in GitLab 14.8.
+> - Support to media types was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333304) in GitLab 14.10.
The [OpenAPI Specification](https://www.openapis.org/) (formerly the Swagger Specification) is an API description format for REST APIs.
-This section shows you how to configure API fuzzing using an OpenAPI Specification to provide information about the target API to test.
+This section shows you how to configure DAST API scanning using an OpenAPI Specification to provide information about the target API to test.
OpenAPI Specifications are provided as a file system resource or URL. Both JSON and YAML OpenAPI formats are supported.
DAST API uses an OpenAPI document to generate the request body. When a request body is required,
@@ -84,52 +76,40 @@ the body generation is limited to these body types:
- `application/json`
- `application/xml`
-Follow these steps to configure DAST API in GitLab with an OpenAPI specification:
+### OpenAPI and media types
-1. To use DAST API, you must [include](../../../ci/yaml/index.md#includetemplate)
- the [`DAST-API.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml)
- that's provided as part of your GitLab installation. Add the following to your
- `.gitlab-ci.yml` file:
+A media type (formerly known as MIME type) is an identifier for file formats and format contents transmitted. A OpenAPI document lets you specify that a given operation can accept different media types, hence a given request can send data using different file content. As for example, a `PUT /user` operation to update user data could accept data in either XML (media type `application/xml`) or JSON (media type `application/json`) format.
+OpenAPI 2.x lets you specify the accepted media types globally or per operation, and OpenAPI 3.x lets you specify the accepted media types per operation. DAST API will check the listed media types, and try to produce sample data for each supported media type.
- ```yaml
- stages:
- - dast
+- In [GitLab 14.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/333304), the default behavior is to select one of the supported media types to use. The first supported media type is chosen from the list. This behavior is configurable.
+- In GitLab 14.9 and earlier, the default behavior is to perform testing using all supported media types. This means if two media types are listed (for example, `application/json` and `application/xml`), testing are performed using JSON, and then the same tests using XML.
- include:
- - template: DAST-API.gitlab-ci.yml
- ```
+Testing the same operation (for example, `POST /user`) using different media types (for example, `application/json` and `application/xml`) is not always desirable.
+For example, if the target application executes the same code regardless of the request content type, it will take longer to finish the test session, and it may report duplicated vulnerabilities related to the request body depending on the target app.
-1. The [configuration file](#configuration-files) has several testing profiles defined with different checks enabled. We recommend that you start with the `Quick` profile.
- Testing with this profile completes faster, allowing for easier configuration validation.
+The environment variable `DAST_API_OPENAPI_ALL_MEDIA_TYPES` lets you specify whether or not to use all supported media types instead of one when generating requests for a given operation. When the environment variable `DAST_API_OPENAPI_ALL_MEDIA_TYPES` is set to any value, DAST API tries to generate requests for all supported media types instead of one in a given operation. This will cause testing to take longer as testing is repeated for each provided media type.
- Provide the profile by adding the `DAST_API_PROFILE` CI/CD variable to your `.gitlab-ci.yml` file,
- substituting `Quick` for the profile you choose:
+Alternatively, the variable `DAST_API_OPENAPI_MEDIA_TYPES` is used to provide a list of media types that will each be tested. Providing more than one media type causes testing to take longer, as testing is performed for each media type selected. When the environment variable `DAST_API_OPENAPI_MEDIA_TYPES` is set to a list of media types, only the listed media types are included when creating requests.
- ```yaml
- stages:
- - dast
+Multiple media types in `DAST_API_OPENAPI_MEDIA_TYPES` are separated by a colon (`:`). For example, to limit request generation to the media types `application/x-www-form-urlencoded` and `multipart/form-data`, set the environment variable `DAST_API_OPENAPI_MEDIA_TYPES` to `application/x-www-form-urlencoded:multipart/form-data`. Only supported media types in this list are included when creating requests, though non-supported media types are always skipped. A media type text may contain different sections. For example, `application/vnd.api+json; charset=UTF-8`, is a compound of `type "/" [tree "."] subtype ["+" suffix]* [";" parameter]`. Parameters are not taken into account when performing the filtering media types on request generation.
- include:
- - template: DAST-API.gitlab-ci.yml
+The environment variables `DAST_API_OPENAPI_ALL_MEDIA_TYPES` and `DAST_API_OPENAPI_MEDIA_TYPES` allow you to decide how to handle media types. These settings are mutually exclusive. If both are enabled, DAST API reports an error.
- variables:
- DAST_API_PROFILE: Quick
- ```
+#### Configure DAST API with an OpenAPI Specification
-1. Provide the location of the OpenAPI specification. You can provide the specification as a file
- or URL. Specify the location by adding the `DAST_API_OPENAPI` variable:
+To configure DAST API scanning with an OpenAPI specification:
- ```yaml
- stages:
- - dast
+To configure DAST API scanning with an OpenAPI Specification:
- include:
- - template: DAST-API.gitlab-ci.yml
+1. [Include](../../../ci/yaml/index.md#includetemplate)
+ the [`DAST-API.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml) in your `.gitlab-ci.yml` file.
- variables:
- DAST_API_PROFILE: Quick
- DAST_API_OPENAPI: test-api-specification.json
- ```
+1. The [configuration file](#configuration-files) has several testing profiles defined with different checks enabled. We recommend that you start with the `Quick` profile.
+ Testing with this profile completes faster, allowing for easier configuration validation.
+ Provide the profile by adding the `DAST_API_PROFILE` CI/CD variable to your `.gitlab-ci.yml` file.
+
+1. Provide the location of the OpenAPI Specification as either a file or URL.
+ Specify the location by adding the `DAST_API_OPENAPI` variable.
1. The target API instance's base URL is also required. Provide it by using the `DAST_API_TARGET_URL`
variable or an `environment_url.txt` file.
@@ -140,20 +120,20 @@ Follow these steps to configure DAST API in GitLab with an OpenAPI specification
automatically parses that file to find its scan target. You can see an
[example of this in our Auto DevOps CI YAML](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml).
- Here's an example of using `DAST_API_TARGET_URL`:
+Complete example configuration of using an OpenAPI Specification:
- ```yaml
- stages:
- - dast
+```yaml
+stages:
+ - dast
- include:
- - template: DAST-API.gitlab-ci.yml
+include:
+ - template: DAST-API.gitlab-ci.yml
- variables:
- DAST_API_PROFILE: Quick
- DAST_API_OPENAPI: test-api-specification.json
- DAST_API_TARGET_URL: http://test-deployment/
- ```
+variables:
+ DAST_API_PROFILE: Quick
+ DAST_API_OPENAPI: test-api-specification.json
+ DAST_API_TARGET_URL: http://test-deployment/
+```
This is a minimal configuration for DAST API. From here you can:
@@ -161,14 +141,12 @@ This is a minimal configuration for DAST API. From here you can:
- [Add authentication](#authentication).
- Learn how to [handle false positives](#handling-false-positives).
-WARNING:
-**NEVER** run DAST API testing against a production server. Not only can it perform *any* function that the API can, it may also trigger bugs in the API. This includes actions like modifying and deleting data. Only run DAST API scanning against a test server.
-
### HTTP Archive (HAR)
-The [HTTP Archive format (HAR)](http://www.softwareishard.com/blog/har-12-spec/)
-is an archive file format for logging HTTP transactions. When used with the GitLab DAST API scanner, HAR must contain records of calling the web API to test. The DAST API scanner extracts all the requests and
-uses them to perform testing.
+The [HTTP Archive format (HAR)](../api_fuzzing/create_har_files.md) is an archive file format for
+logging HTTP transactions. When used with the GitLab DAST API scanner, the HAR file must contain
+records of calling the web API to test. The DAST API scanner extracts all of the requests and uses them
+to perform testing.
You can use various tools to generate HAR files:
@@ -182,53 +160,20 @@ WARNING:
HAR files may contain sensitive information such as authentication tokens, API keys, and session
cookies. We recommend that you review the HAR file contents before adding them to a repository.
-Follow these steps to configure DAST API to use a HAR file that provides information about the
-target API to test:
+#### DAST API scanning with a HAR file
-1. To use DAST API, you must [include](../../../ci/yaml/index.md#includetemplate)
- the [`DAST-API.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml)
- that's provided as part of your GitLab installation. To do so, add the following to your
- `.gitlab-ci.yml` file:
+To configure DAST API to use a HAR file that provides information about the target API to test:
- ```yaml
- stages:
- - dast
-
- include:
- - template: DAST-API.gitlab-ci.yml
- ```
+1. [Include](../../../ci/yaml/index.md#includetemplate)
+ the [`DAST-API.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml) in your `.gitlab-ci.yml` file.
1. The [configuration file](#configuration-files) has several testing profiles defined with different checks enabled. We recommend that you start with the `Quick` profile.
Testing with this profile completes faster, allowing for easier configuration validation.
- Provide the profile by adding the `DAST_API_PROFILE` CI/CD variable to your `.gitlab-ci.yml` file,
- substituting `Quick` for the profile you choose:
-
- ```yaml
- stages:
- - dast
-
- include:
- - template: DAST-API.gitlab-ci.yml
-
- variables:
- DAST_API_PROFILE: Quick
- ```
+ Provide the profile by adding the `DAST_API_PROFILE` CI/CD variable to your `.gitlab-ci.yml` file.
1. Provide the location of the HAR file. You can provide the location as a file path
- or URL. [URL support was introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285020) in GitLab 13.10 and later. Specify the location by adding the `DAST_API_HAR` variable:
-
- ```yaml
- stages:
- - dast
-
- include:
- - template: DAST-API.gitlab-ci.yml
-
- variables:
- DAST_API_PROFILE: Quick
- DAST_API_HAR: test-api-recording.har
- ```
+ or URL. [URL support was introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285020) in GitLab 13.10 and later. Specify the location by adding the `DAST_API_HAR` variable.
1. The target API instance's base URL is also required. Provide it by using the `DAST_API_TARGET_URL`
variable or an `environment_url.txt` file.
@@ -239,20 +184,20 @@ target API to test:
automatically parses that file to find its scan target. You can see an
[example of this in our Auto DevOps CI YAML](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml).
- Here's an example of using `DAST_API_TARGET_URL`:
+Complete example configuration of using an HAR file:
- ```yaml
- stages:
- - dast
+```yaml
+stages:
+ - dast
- include:
- - template: DAST-API.gitlab-ci.yml
+include:
+ - template: DAST-API.gitlab-ci.yml
- variables:
- DAST_API_PROFILE: Quick
- DAST_API_HAR: test-api-recording.har
- DAST_API_TARGET_URL: http://test-deployment/
- ```
+variables:
+ DAST_API_PROFILE: Quick
+ DAST_API_HAR: test-api-recording.har
+ DAST_API_TARGET_URL: http://test-deployment/
+```
This is a minimal configuration for DAST API. From here you can:
@@ -260,11 +205,6 @@ This is a minimal configuration for DAST API. From here you can:
- [Add authentication](#authentication).
- Learn how to [handle false positives](#handling-false-positives).
-WARNING:
-**NEVER** run DAST API testing against a production server. Not only can it perform *any* function that
-the API can, it may also trigger bugs in the API. This includes actions like modifying and deleting
-data. Only run DAST API against a test server.
-
### Postman Collection
The [Postman API Client](https://www.postman.com/product/api-client/) is a popular tool that
@@ -282,52 +222,20 @@ Postman Collection files may contain sensitive information such as authenticatio
and session cookies. We recommend that you review the Postman Collection file contents before adding
them to a repository.
-Follow these steps to configure DAST API to use a Postman Collection file that provides
-information about the target API to test:
-
-1. To use DAST API, you must [include](../../../ci/yaml/index.md#includetemplate)
- the [`DAST-API.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml)
- that's provided as part of your GitLab installation. To do so, add the following to your
- `.gitlab-ci.yml` file:
+#### DAST API scanning with a Postman Collection file
- ```yaml
- stages:
- - dast
+To configure DAST API to use a Postman Collection file that provides information about the target
+API to test:
- include:
- - template: DAST-API.gitlab-ci.yml
- ```
+1. [Include](../../../ci/yaml/index.md#includetemplate)
+ the [`DAST-API.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml).
1. The [configuration file](#configuration-files) has several testing profiles defined with different checks enabled. We recommend that you start with the `Quick` profile.
Testing with this profile completes faster, allowing for easier configuration validation.
- Provide the profile by adding the `DAST_API_PROFILE` CI/CD variable to your `.gitlab-ci.yml` file,
- substituting `Quick` for the profile you choose:
+ Provide the profile by adding the `DAST_API_PROFILE` CI/CD variable to your `.gitlab-ci.yml` file.
- ```yaml
- stages:
- - dast
-
- include:
- - template: DAST-API.gitlab-ci.yml
-
- variables:
- DAST_API_PROFILE: Quick
- ```
-
-1. Provide the location of the Postman Collection file. You can provide the location as a file or URL. Specify the location by adding the `DAST_API_POSTMAN_COLLECTION` variable:
-
- ```yaml
- stages:
- - dast
-
- include:
- - template: DAST-API.gitlab-ci.yml
-
- variables:
- DAST_API_PROFILE: Quick
- DAST_API_POSTMAN_COLLECTION: postman-collection_serviceA.json
- ```
+1. Provide the location of the Postman Collection file as either a file or URL. Specify the location by adding the `DAST_API_POSTMAN_COLLECTION` variable.
1. The target API instance's base URL is also required. Provide it by using the `DAST_API_TARGET_URL`
variable or an `environment_url.txt` file.
@@ -338,20 +246,20 @@ information about the target API to test:
automatically parses that file to find its scan target. You can see an
[example of this in our Auto DevOps CI YAML](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml).
- Here's an example of using `DAST_API_TARGET_URL`:
+Complete example configuration of using a Postman collection:
- ```yaml
- stages:
- - dast
+```yaml
+stages:
+ - dast
- include:
- - template: DAST-API.gitlab-ci.yml
+include:
+ - template: DAST-API.gitlab-ci.yml
- variables:
- DAST_API_PROFILE: Quick
- DAST_API_POSTMAN_COLLECTION: postman-collection_serviceA.json
- DAST_API_TARGET_URL: http://test-deployment/
- ```
+variables:
+ DAST_API_PROFILE: Quick
+ DAST_API_POSTMAN_COLLECTION: postman-collection_serviceA.json
+ DAST_API_TARGET_URL: http://test-deployment/
+```
This is a minimal configuration for DAST API. From here you can:
@@ -359,12 +267,7 @@ This is a minimal configuration for DAST API. From here you can:
- [Add authentication](#authentication).
- Learn how to [handle false positives](#handling-false-positives).
-WARNING:
-**NEVER** run DAST API testing against a production server. Not only can it perform *any* function that
-the API can, it may also trigger bugs in the API. This includes actions like modifying and deleting
-data. Only run DAST API against a test server.
-
-#### Postman variables
+##### Postman variables
Postman allows the developer to define placeholders that can be used in different parts of the
requests. These placeholders are called variables, as explained in [Using variables](https://learning.postman.com/docs/sending-requests/variables/).
@@ -388,11 +291,11 @@ Postman file. For example, Postman does not export environment-scoped variables
file.
By default, the DAST API scanner uses the Postman file to resolve Postman variable values. If a JSON file
-is set in a GitLab CI environment variable `DAST_API_POSTMAN_COLLECTION_VARIABLES`, then the JSON
+is set in a GitLab CI/CD environment variable `DAST_API_POSTMAN_COLLECTION_VARIABLES`, then the JSON
file takes precedence to get Postman variable values.
-Although Postman can export environment variables into a JSON file, the format is not compatible
-with the JSON expected by `DAST_API_POSTMAN_COLLECTION_VARIABLES`.
+WARNING:
+Although Postman can export environment variables into a JSON file, the format is not compatible with the JSON expected by `DAST_API_POSTMAN_COLLECTION_VARIABLES`.
Here is an example of using `DAST_API_POSTMAN_COLLECTION_VARIABLES`:
@@ -421,12 +324,12 @@ values. For example:
}
```
-### Authentication
+## Authentication
Authentication is handled by providing the authentication token as a header or cookie. You can
provide a script that performs an authentication flow or calculates the token.
-#### HTTP Basic Authentication
+### HTTP Basic Authentication
[HTTP basic authentication](https://en.wikipedia.org/wiki/Basic_access_authentication)
is an authentication method built in to the HTTP protocol and used in conjunction with
@@ -456,23 +359,23 @@ variables:
DAST_API_HTTP_PASSWORD: $TEST_API_PASSWORD
```
-#### Bearer Tokens
+### Bearer tokens
Bearer tokens are used by several different authentication mechanisms, including OAuth2 and JSON Web
-Tokens (JWT). Bearer tokens are transmitted using the `Authorization` HTTP header. To use bearer
+Tokens (JWT). Bearer tokens are transmitted using the `Authorization` HTTP header. To use Bearer
tokens with DAST API, you need one of the following:
-- A token that doesn't expire
-- A way to generate a token that lasts the length of testing
-- A Python script that DAST API can call to generate the token
+- A token that doesn't expire.
+- A way to generate a token that lasts the length of testing.
+- A Python script that DAST API can call to generate the token.
-##### Token doesn't expire
+#### Token doesn't expire
-If the bearer token doesn't expire, use the `DAST_API_OVERRIDES_ENV` variable to provide it. This
+If the Bearer token doesn't expire, use the `DAST_API_OVERRIDES_ENV` variable to provide it. This
variable's content is a JSON snippet that provides headers and cookies to add to DAST API's
outgoing HTTP requests.
-Follow these steps to provide the bearer token with `DAST_API_OVERRIDES_ENV`:
+Follow these steps to provide the Bearer token with `DAST_API_OVERRIDES_ENV`:
1. [Create a CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables),
for example `TEST_API_BEARERAUTH`, with the value
@@ -502,9 +405,9 @@ Follow these steps to provide the bearer token with `DAST_API_OVERRIDES_ENV`:
1. To validate that authentication is working, run an DAST API test and review the job logs
and the test API's application logs.
-##### Token generated at test runtime
+#### Token generated at test runtime
-If the bearer token must be generated and doesn't expire during testing, you can provide to DAST API a file containing the token. A prior stage and job, or part of the DAST API job, can
+If the Bearer token must be generated and doesn't expire during testing, you can provide DAST API a file that has the token. A prior stage and job, or part of the DAST API job, can
generate this file.
DAST API expects to receive a JSON file with the following structure:
@@ -539,14 +442,14 @@ variables:
To validate that authentication is working, run an DAST API test and review the job logs and
the test API's application logs.
-##### Token has short expiration
+#### Token has short expiration
-If the bearer token must be generated and expires prior to the scan's completion, you can provide a
+If the Bearer token must be generated and expires prior to the scan's completion, you can provide a
program or script for the DAST API scanner to execute on a provided interval. The provided script runs in
an Alpine Linux container that has Python 3 and Bash installed. If the Python script requires
additional packages, it must detect this and install the packages at runtime.
-The script must create a JSON file containing the bearer token in a specific format:
+The script must create a JSON file containing the Bearer token in a specific format:
```json
{
@@ -582,7 +485,7 @@ variables:
To validate that authentication is working, run an DAST API test and review the job logs and the test API's application logs. See the [overrides section](#overrides) for more information about override commands.
-### Configuration files
+## Configuration files
To get you started quickly, GitLab provides the configuration file
[`gitlab-dast-api-config.yml`](https://gitlab.com/gitlab-org/security-products/analyzers/dast/-/blob/master/config/gitlab-dast-api-config.yml).
@@ -590,12 +493,12 @@ This file has several testing profiles that perform various numbers of tests. Th
profile increases as the test numbers go up. To use a configuration file, add it to your
repository's root as `.gitlab/gitlab-dast-api-config.yml`.
-#### Profiles
+### Profiles
The following profiles are pre-defined in the default configuration file. Profiles
can be added, removed, and modified by creating a custom configuration.
-##### Quick
+#### Quick
- Application Information Check
- Cleartext Authentication Check
@@ -610,7 +513,7 @@ can be added, removed, and modified by creating a custom configuration.
- Token Check
- XML Injection Check
-##### Full
+#### Full
- Application Information Check
- Cleartext AuthenticationCheck
@@ -630,17 +533,24 @@ can be added, removed, and modified by creating a custom configuration.
- Token Check
- XML Injection Check
-### Available CI/CD variables
+## Available CI/CD variables
| CI/CD variable | Description |
|------------------------------------------------------|--------------------|
-| `DAST_API_VERSION` | Specify DAST API container version. Defaults to `latest`. |
+| `SECURE_ANALYZERS_PREFIX` | Specify the Docker registry base address from which to download the analyzer. |
+| `DAST_API_VERSION` | Specify DAST API container version. Defaults to `1`. |
+| `DAST_API_IMAGE_SUFFIX` | Specify a container image suffix. Defaults to none. |
| `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`. |
|[`DAST_API_EXCLUDE_PATHS`](#exclude-paths) | Exclude API URL paths from testing. |
+|[`DAST_API_EXCLUDE_URLS`](#exclude-urls) | Exclude API URL from testing. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357195) in GitLab 14.10. |
+|[`DAST_API_EXCLUDE_PARAMETER_ENV`](#exclude-parameters) | JSON string containing excluded parameters. |
+|[`DAST_API_EXCLUDE_PARAMETER_FILE`](#exclude-parameters) | Path to a JSON file containing excluded parameters. |
|[`DAST_API_OPENAPI`](#openapi-specification) | OpenAPI specification file or URL. |
|[`DAST_API_OPENAPI_RELAXED_VALIDATION`](#openapi-specification) | Relax document validation. Default is disabled. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345950) in GitLab 14.7. |
+|[`DAST_API_OPENAPI_ALL_MEDIA_TYPES`](#openapi-specification) | Use all supported media types instead of one when generating requests. Causes test duration to be longer. Default is disabled. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333304) in GitLab 14.10. |
+|[`DAST_API_OPENAPI_MEDIA_TYPES`](#openapi-specification) | Colon (`:`) separated media types accepted for testing. Default is disabled. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333304) in GitLab 14.10. |
|[`DAST_API_HAR`](#http-archive-har) | HTTP Archive (HAR) file. |
|[`DAST_API_POSTMAN_COLLECTION`](#postman-collection) | Postman Collection file. |
|[`DAST_API_POSTMAN_COLLECTION_VARIABLES`](#postman-variables) | Path to a JSON file to extract postman variable values. |
@@ -656,7 +566,7 @@ can be added, removed, and modified by creating a custom configuration.
|`DAST_API_SERVICE_START_TIMEOUT` | How long to wait for target API to become available in seconds. Default is 300 seconds. |
|`DAST_API_TIMEOUT` | How long to wait for API responses in seconds. Default is 30 seconds. |
-### Overrides
+## Overrides
DAST API provides a method to add or override specific items in your request, for example:
@@ -814,7 +724,7 @@ It is changed to:
You can provide this JSON document as a file or environment variable. You may also provide a command
to generate the JSON document. The command can run at intervals to support values that expire.
-#### Using a file
+### Using a file
To provide the overrides JSON as a file, the `DAST_API_OVERRIDES_FILE` CI/CD variable is set. The path is relative to the job current working directory.
@@ -834,7 +744,7 @@ variables:
DAST_API_OVERRIDES_FILE: dast-api-overrides.json
```
-#### Using a CI/CD variable
+### Using a CI/CD variable
To provide the overrides JSON as a CI/CD variable, use the `DAST_API_OVERRIDES_ENV` variable.
This allows you to place the JSON as variables that can be masked and protected.
@@ -872,7 +782,7 @@ variables:
DAST_API_OVERRIDES_ENV: $SECRET_OVERRIDES
```
-#### Using a command
+### Using a command
If the value must be generated or regenerated on expiration, you can provide a program or script for
the DAST API scanner to execute on a specified interval. The provided command runs in an Alpine Linux
@@ -914,7 +824,7 @@ variables:
DAST_API_OVERRIDES_INTERVAL: 300
```
-#### Debugging overrides
+### Debugging overrides
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/334578) in GitLab 14.8.
@@ -965,10 +875,10 @@ def get_auth_response():
# In our example, access token is retrieved from a given endpoint
try:
- # Performs a http request, response sample:
+ # Performs a http request, response sample:
# { "Token" : "b5638ae7-6e77-4585-b035-7d9de2e3f6b3" }
response = get_auth_response()
-
+
# Check that the request is successful. may raise `requests.exceptions.HTTPError`
response.raise_for_status()
@@ -995,7 +905,7 @@ except Exception as e:
logging.error(f'Error, unknown error while retrieving access token. Error message: {e}')
raise
-# computes object that holds overrides file content.
+# computes object that holds overrides file content.
# It uses data fetched from request
overrides_data = {
"headers": {
@@ -1070,7 +980,7 @@ variables:
In the previous sample, you could use the script `user-pre-scan-set-up.sh` to also install new runtimes or applications that later on you could use in our overrides command.
-### Exclude Paths
+## Exclude Paths
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211892) in GitLab 14.0.
@@ -1088,7 +998,7 @@ To verify the paths are excluded, review the `Tested Operations` and `Excluded O
2021-05-27 21:51:08 [INF] API Security: ------------------------------------------------
```
-#### Examples
+### Examples
This example excludes the `/auth` resource. This does not exclude child resources (`/auth/child`).
@@ -1111,6 +1021,294 @@ variables:
DAST_API_EXCLUDE_PATHS=/auth*;/v1/*
```
+### Exclude parameters
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292196) in GitLab 14.10.
+
+While testing an API you may might want to exclude a parameter (query string, header, or body element) from testing. This may be needed because a parameter always causes a failure, slows down testing, or for other reasons. To exclude parameters, you can set one of the following variables: `DAST_API_EXCLUDE_PARAMETER_ENV` or `DAST_API_EXCLUDE_PARAMETER_FILE`.
+
+The `DAST_API_EXCLUDE_PARAMETER_ENV` allows providing a JSON string containing excluded parameters. This is a good option if the JSON is short and will not often change. Another option is the variable `DAST_API_EXCLUDE_PARAMETER_FILE`. This variable is set to a file path that can be checked into the repository, created by another job as an artifact, or generated at runtime with a pre script using `DAST_API_PRE_SCRIPT`.
+
+#### Exclude parameters using a JSON document
+
+The JSON document contains a JSON object, this object uses specific properties to identify which parameter should be excluded.
+You can provide the following properties to exclude specific parameters during the scanning process:
+
+- `headers`: Use this property to exclude specific headers. The property's value is an array of header names to be excluded. Names are case-insensitive.
+- `cookies`: Use this property's value to exclude specific cookies. The property's value is an array of cookie names to be excluded. Names are case-sensitive.
+- `query`: Use this property to exclude specific fields from the query string. The property's value is an array of field names from the query string to be excluded. Names are case-sensitive.
+- `body-form`: Use this property to exclude specific fields from a request that uses the media type `application/x-www-form-urlencoded`. The property's value is an array of the field names from the body to be excluded. Names are case-sensitive.
+- `body-json`: Use this property to exclude specific JSON nodes from a request that uses the media type `application/json`. The property's value is an array, each entry of the array is a [JSON Path](https://goessner.net/articles/JsonPath/) expression.
+- `body-xml`: Use this property to exclude specific XML nodes from a request that uses media type `application/xml`. The property's value is an array, each entry of the array is a [XPath v2](https://www.w3.org/TR/xpath20/) expression.
+
+Thus, the following JSON document is an example of the expected structure to exclude parameters.
+
+```json
+{
+ "headers": [
+ "header1",
+ "header2"
+ ],
+ "cookies": [
+ "cookie1",
+ "cookie2"
+ ],
+ "query": [
+ "query-string1",
+ "query-string2"
+ ],
+ "body-form": [
+ "form-param1",
+ "form-param2"
+ ],
+ "body-json": [
+ "json-path-expression-1",
+ "json-path-expression-2"
+ ],
+ "body-xml" : [
+ "xpath-expression-1",
+ "xpath-expression-2"
+ ]
+}
+```
+
+#### Examples
+
+##### Excluding a single header
+
+To exclude the header `Upgrade-Insecure-Requests`, set the `header` property's value to an array with the header name: `[ "Upgrade-Insecure-Requests" ]`. For instance, the JSON document looks like this:
+
+```json
+{
+ "headers": [ "Upgrade-Insecure-Requests" ]
+}
+```
+
+Header names are case-insensitive, so the header name `UPGRADE-INSECURE-REQUESTS` is equivalent to `Upgrade-Insecure-Requests`.
+
+##### Excluding both a header and two cookies
+
+To exclude the header `Authorization`, and the cookies `PHPSESSID` and `csrftoken`, set the `headers` property's value to an array with header name `[ "Authorization" ]` and the `cookies` property's value to an array with the cookies' names `[ "PHPSESSID", "csrftoken" ]`. For instance, the JSON document looks like this:
+
+```json
+{
+ "headers": [ "Authorization" ],
+ "cookies": [ "PHPSESSID", "csrftoken" ]
+}
+```
+
+##### Excluding a `body-form` parameter
+
+To exclude the `password` field in a request that uses `application/x-www-form-urlencoded`, set the `body-form` property's value to an array with the field name `[ "password" ]`. For instance, the JSON document looks like this:
+
+```json
+{
+ "body-form": [ "password" ]
+}
+```
+
+The exclude parameters uses `body-form` when the request uses a content type `application/x-www-form-urlencoded`.
+
+##### Excluding a specific JSON nodes using JSON Path
+
+To exclude the `schema` property in the root object, set the `body-json` property's value to an array with the JSON Path expression `[ "$.schema" ]`.
+
+The JSON Path expression uses special syntax to identify JSON nodes: `$` refers to the root of the JSON document, `.` refers to the current object (in our case the root object), and the text `schema` refers to a property name. Thus, the JSON path expression `$.schema` refers to a property `schema` in the root object.
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-json": [ "$.schema" ]
+}
+```
+
+The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path characters like `$`, `*`, `.` among others have special meaning.
+
+##### Excluding multiple JSON nodes using JSON Path
+
+To exclude the property `password` on each entry of an array of `users` at the root level, set the `body-json` property's value to an array with the JSON Path expression `[ "$.users[*].paswword" ]`.
+
+The JSON Path expression starts with `$` to refer to the root node and uses `.` to refer to the current node. Then, it uses `users` to refer to a property and the characters `[` and `]` to enclose the index in the array you want to use, instead of providing a number as an index you use `*` to specify any index. After the index reference, we find `.` which now refers to any given selected index in the array, preceded by a property name `password`.
+
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-json": [ "$.users[*].paswword" ]
+}
+```
+
+The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path characters like `$`, `*`, `.` among others have special meaning.
+
+##### Excluding a XML attribute
+
+To exclude an attribute named `isEnabled` located in the root element `credentials`, set the `body-xml` property's value to an array with the XPath expression `[ "/credentials/@isEnabled" ]`.
+
+The XPath expression `/credentials/@isEnabled`, starts with `/` to indicate the root of the XML document, then it is followed by the word `credentials` which indicates the name of the element to match. It uses a `/` to refer to a node of the previous XML element, and the character `@` to indicate that the name `isEnable` is an attribute.
+
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-xml": [
+ "/credentials/@isEnabled"
+ ]
+}
+```
+
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+
+##### Excluding a XML text's element
+
+To exclude the text of the `username` element contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username/text()" ]`.
+
+In the XPath expression `/credentials/username/text()`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `username`. Last part has a `/` that refers to the current element, and uses a XPath function called `text()` which identifies the text of the current element.
+
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-xml": [
+ "/credentials/username/text()"
+ ]
+}
+```
+
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+
+##### Excluding an XML element
+
+To exclude the element `username` contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username" ]`.
+
+In the XPath expression `/credentials/username`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `username`.
+
+For instance, the JSON document looks like this:
+
+```json
+{
+ "body-xml": [
+ "/credentials/username"
+ ]
+}
+```
+
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+
+##### Excluding an XML node with namespaces
+
+To exclude anXML element `login` which is defined in namespace `s`, and contained in `credentials` root node, set the `body-xml` property's value to an array with the XPath expression `[ "/credentials/s:login" ]`.
+
+In the XPath expression `/credentials/s:login`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `s:login`. Notice that name contains the character `:`, this character separates the namespace from the node name.
+
+The namespace name should have been defined in the XML document which is part of the body request. You may check the namespace in the specification document HAR, OpenAPI, or Postman Collection file.
+
+```json
+{
+ "body-xml": [
+ "/credentials/s:login"
+ ]
+}
+```
+
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be an [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath, expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+
+#### Using a JSON string
+
+To provide the exclusion JSON document set the variable `DAST_API_EXCLUDE_PARAMETER_ENV` with the JSON string. In the following example, the `.gitlab-ci.yml`, the `DAST_API_EXCLUDE_PARAMETER_ENV` variable is set to a JSON string:
+
+```yaml
+stages:
+ - dast
+
+include:
+ - template: DAST-API.gitlab-ci.yml
+
+variables:
+ DAST_API_PROFILE: Quick
+ DAST_API_OPENAPI: test-api-specification.json
+ DAST_API_TARGET_URL: http://test-deployment/
+ DAST_API_EXCLUDE_PARAMETER_ENV: '{ "headers": [ "Upgrade-Insecure-Requests" ] }'
+```
+
+#### Using a file
+
+To provide the exclusion JSON document set the variable `DAST_API_EXCLUDE_PARAMETER_FILE` with the JSON file path. The file path is relative to the job current working directory. In the following example `.gitlab-ci.yml` content, the `DAST_API_EXCLUDE_PARAMETER_FILE` variable is set to a JSON file path:
+
+```yaml
+stages:
+ - dast
+
+include:
+ - template: DAST-API.gitlab-ci.yml
+
+variables:
+ DAST_API_PROFILE: Quick
+ DAST_API_OPENAPI: test-api-specification.json
+ DAST_API_TARGET_URL: http://test-deployment/
+ DAST_API_EXCLUDE_PARAMETER_FILE: dast-api-exclude-parameters.json
+```
+
+The `dast-api-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
+
+### Exclude URLS
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357195) in GitLab 14.10.
+
+As an alternative to excluding by paths, you can filter by any other component in the URL by using the `DAST_API_EXCLUDE_URLS` CI/CD variable. This variable can be set in your `.gitlab-ci.yml` file. The variable can store multiple values, separated by commas (`,`). Each value is a regular expression. Because each entry is a regular expression, an entry like `.*` will exclude all URLs because it is a regular expression that matches everything.
+
+In your job output you can check if any URLs matched any provided regular expression from `DAST_API_EXCLUDE_URLS`. Matching operations are listed in the **Excluded Operations** section. Operations listed in the **Excluded Operations** should not be listed in the **Tested Operations** section. For example the following portion of a job output:
+
+```plaintext
+2021-05-27 21:51:08 [INF] API Security: --[ Tested Operations ]-------------------------
+2021-05-27 21:51:08 [INF] API Security: 201 POST http://target:7777/api/users CREATED
+2021-05-27 21:51:08 [INF] API Security: ------------------------------------------------
+2021-05-27 21:51:08 [INF] API Security: --[ Excluded Operations ]-----------------------
+2021-05-27 21:51:08 [INF] API Security: GET http://target:7777/api/messages
+2021-05-27 21:51:08 [INF] API Security: POST http://target:7777/api/messages
+2021-05-27 21:51:08 [INF] API Security: ------------------------------------------------
+```
+
+NOTE:
+Each value in `DAST_API_EXCLUDE_URLS` is a regular expression. Characters such as `.` , `*` and `$` among many others have special meanings in [regular expressions](https://en.wikipedia.org/wiki/Regular_expression#Standards).
+
+#### Examples
+
+##### Excluding a URL and child resources
+
+The following example excludes the URL `http://target/api/auth` and its child resources.
+
+```yaml
+variables:
+ DAST_API_EXCLUDE_URLS: http://target/api/auth
+```
+
+##### Excluding two URLs and allow their child resources
+
+To exclude the URLs `http://target/api/buy` and `http://target/api/sell` but allowing to scan their child resources, for instance: `http://target/api/buy/toy` or `http://target/api/sell/chair`. You could use the value `http://target/api/buy/$,http://target/api/sell/$`. This value is using two regular expressions, each of them separated by a `,` character. Hence, it contains `http://target/api/buy$` and `http://target/api/sell$`. In each regular expression, the trailing `$` character points out where the matching URL should end.
+
+```yaml
+variables:
+ DAST_API_EXCLUDE_URLS: http://target/api/buy/$,http://target/api/sell/$
+```
+
+##### Excluding two URLs and their child resources
+
+In order to exclude the URLs: `http://target/api/buy` and `http://target/api/sell`, and their child resources. To provide multiple URLs we use the `,` character as follows:
+
+```yaml
+variables:
+ DAST_API_EXCLUDE_URLS: http://target/api/buy,http://target/api/sell
+```
+
+##### Excluding URL using regular expressions
+
+In order to exclude exactly `https://target/api/v1/user/create` and `https://target/api/v2/user/create` or any other version (`v3`,`v4`, and more). We could use `https://target/api/v.*/user/create$`, in the previous regular expression `.` indicates any character and `*` indicates zero or more times, additionally `$` indicates that the URL should end there.
+
+```yaml
+variables:
+ DAST_API_EXCLUDE_URLS: https://target/api/v.*/user/create$
+```
+
## Running your first scan
When configured correctly, a CI/CD pipeline contains a `dast` stage and an `dast_api` job. The job only fails when an invalid configuration is provided. During normal operation, the job always succeeds even if vulnerabilities are identified during testing.
@@ -1165,7 +1363,7 @@ pipelines. For more information, see the [Security Dashboard documentation](../s
Once a vulnerability is found, you can interact with it. Read more on how to
[address the vulnerabilities](../vulnerabilities/index.md).
-## Handling False Positives
+### Handling False Positives
False positives can be handled in several ways:
@@ -1177,7 +1375,7 @@ False positives can be handled in several ways:
- Turn off the Check producing the false positive. This prevents the check from generating any
vulnerabilities. Example checks are the SQL Injection Check, and JSON Hijacking Check.
-### Turn off a Check
+#### Turn off a Check
Checks perform testing of a specific type and can be turned on and off for specific configuration
profiles. The provided [configuration files](#configuration-files) define several profiles that you
@@ -1235,7 +1433,7 @@ This results in the following YAML:
- Name: XmlInjectionCheck
```
-### Turn off an Assertion for a Check
+#### Turn off an Assertion for a Check
Assertions detect vulnerabilities in tests produced by checks. Many checks support multiple Assertions such as Log Analysis, Response Analysis, and Status Code. When a vulnerability is found, the Assertion used is provided. To identify which Assertions are on by default, see the Checks default configuration in the configuration file. The section is called `Checks`.
@@ -1419,6 +1617,19 @@ API Security can still try to consume an OpenAPI document that does not fully co
DAST_API_OPENAPI_RELAXED_VALIDATION: On
```
+### No operation in the OpenAPI document is consuming any supported media type
+
+API Security uses the specified media types in the OpenAPI document to generate requests. If no request can be created due to the lack of supported media types, then an error will be thrown.
+
+**Error message**
+
+- In [GitLab 14.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/333304), `Error, no operation in the OpenApi document is consuming any supported media type. Check 'OpenAPI Specification' to check the supported media types.`
+
+**Solution**
+
+1. Review supported media types in the [OpenAPI Specification](#openapi-specification) section.
+1. Edit your OpenAPI document, allowing at least a given operation to accept any of the supported media types. Alternatively, a supported media type could be set in the OpenAPI document level and get applied to all operations. This step may require changes in your application to ensure the supported media type is accepted by the application.
+
## Get support or request an improvement
To get support for your particular problem please use the [getting help channels](https://about.gitlab.com/get-help/).
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index a4a7e6703ab..924e3838d91 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -321,13 +321,13 @@ The following package managers use lockfiles that GitLab analyzers are capable o
| Package Manager | Supported File Format Versions | Tested Versions |
| ------ | ------ | ------ |
-| Bundler | N/A | [1.17.3](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/master/Gemfile.lock#L118), [2.1.4](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/bundler2-FREEZE/Gemfile.lock#L118) |
-| Composer | N/A | [1.x](https://gitlab.com/gitlab-org/security-products/tests/php-composer/-/blob/master/composer.lock) |
-| Conan | 0.4 | [1.x](https://gitlab.com/gitlab-org/security-products/tests/c-conan/-/blob/master/conan.lock) |
-| Go | N/A | [1.x](https://gitlab.com/gitlab-org/security-products/tests/go-modules/-/blob/master/go.mod) |
-| NuGet | v1 | [4.9](https://gitlab.com/gitlab-org/security-products/tests/csharp-nuget-dotnetcore/-/blob/master/src/web.api/packages.lock.json#L2) |
-| npm | v1, v2 | [6.x](https://gitlab.com/gitlab-org/security-products/tests/js-npm/-/blob/master/package-lock.json#L4), [7.x](https://gitlab.com/gitlab-org/security-products/tests/js-npm/-/blob/lockfile-v2-FREEZE/package-lock.json#L4) |
-| yarn | v1 | [1.x](https://gitlab.com/gitlab-org/security-products/tests/js-yarn/-/blob/master/yarn.lock) |
+| Bundler | N/A | [1.17.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/ruby-bundler/main/Gemfile.lock#L118), [2.1.4](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/bundler2-FREEZE/Gemfile.lock#L118) |
+| Composer | N/A | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/php-composer/main/composer.lock) |
+| Conan | 0.4 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/c-conan/main/conan.lock) |
+| Go | N/A | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/go-modules/main/go.sum) |
+| NuGet | v1 | [4.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/csharp-nuget-dotnetcore/main/src/web.api/packages.lock.json#L2) |
+| npm | v1, v2 | [6.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/main/package-lock.json#L4), [7.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/lockfileVersion2/package-lock.json#L4) |
+| yarn | v1 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/main/yarn.lock#L2) |
#### Obtaining dependency information by running a package manager to generate a parsable file
@@ -339,19 +339,19 @@ To support the following package managers, the GitLab analyzers proceed in two s
| Package Manager | Pre-installed Versions | Tested Versions |
| ------ | ------ | ------ |
| Bundler | [2.1.4](https://gitlab.com/gitlab-org/security-products/analyzers/bundler-audit/-/blob/v2.11.3/Dockerfile#L15)<sup><b><a href="#exported-dependency-information-notes-1">1</a></b></sup> | [1.17.3](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/master/Gemfile.lock#L118), [2.1.4](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/bundler2-FREEZE/Gemfile.lock#L118) |
-| sbt | [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/config/.tool-versions#L4) | [1.0.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/.gitlab-ci.yml#L330), [1.1.4](https://gitlab.com/gitlab-org/security-products/tests/scala-sbt-multiproject/-/blob/main/project/build.properties#L1), [1.1.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/.gitlab-ci.yml#L339), [1.2.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/.gitlab-ci.yml#L348), [1.3.12](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/.gitlab-ci.yml#L357), [1.4.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/.gitlab-ci.yml#L366), [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/.gitlab-ci.yml#L384) |
-| Maven | [3.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.23.0/config/.tool-versions#L3) | [3.6.3](https://gitlab.com/gitlab-org/security-products/tests/java-maven/-/blob/master/pom.xml#L3) |
-| Gradle | [6.7.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.23.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup>, [7.3.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.26.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup> | [5.6.4](https://gitlab.com/gitlab-org/security-products/tests/java-gradle/-/blob/master/gradle/wrapper/gradle-wrapper.properties#L3), [6.5](https://gitlab.com/gitlab-org/security-products/tests/java-gradle/-/blob/java-14/gradle/wrapper/gradle-wrapper.properties#L3), [6.7-rc-1](https://gitlab.com/gitlab-org/security-products/tests/java-gradle/-/blob/java-15/gradle/wrapper/gradle-wrapper.properties#L3), [6.7.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.27.1/.gitlab-ci.yml#L289-297)<sup><b><a href="#exported-dependency-information-notes-3">3</a></b></sup>, [6.9](https://gitlab.com/gitlab-org/security-products/tests/java-gradle/-/blob/java-14-gradle-6-9/gradle/wrapper/gradle-wrapper.properties#L3), [7.0-rc-2](https://gitlab.com/gitlab-org/security-products/tests/java-gradle/-/blob/java-16/gradle/wrapper/gradle-wrapper.properties#L3), [7.3](https://gitlab.com/gitlab-org/security-products/tests/java-gradle/-/blob/java-14-gradle-7-3/gradle/wrapper/gradle-wrapper.properties#L3), [7.3.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.27.1/.gitlab-ci.yml#L299-317)<sup><b><a href="#exported-dependency-information-notes-3">3</a></b></sup> |
-| setuptools | [50.3.2](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v2.29.9/Dockerfile#L27) | [57.5.0](https://gitlab.com/gitlab-org/security-products/tests/python-setuptools/-/blob/main/setup.py) |
-| pip | [20.2.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v2.29.9/Dockerfile#L26) | [20.x](https://gitlab.com/gitlab-org/security-products/tests/python-pip/-/blob/master/requirements.txt) |
-| Pipenv | [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.18.4/requirements.txt#L13) | [2018.11.26](https://gitlab.com/gitlab-org/security-products/tests/python-pipenv/-/blob/pipfile-lock-FREEZE/Pipfile.lock#L6)<sup><b><a href="#exported-dependency-information-notes-4">4</a></b></sup>, [2018.11.26](https://gitlab.com/gitlab-org/security-products/tests/python-pipenv/-/blob/master/Pipfile) |
+| sbt | [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/config/.tool-versions#L4) | [1.0.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L443-447), [1.1.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L449-453), [1.2.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L455-459), [1.3.12](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L461-465), [1.4.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L467-471), [1.5.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L473-477), [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L479-483) |
+| Maven | [3.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L95-97) | [3.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L95-97) |
+| Gradle | [6.7.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.23.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup>, [7.3.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.26.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup> | [5.6.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L319-323), [6.7](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L286-288)<sup><b><a href="#exported-dependency-information-notes-3">3</a></b></sup>, [6.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L331-335), [7.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L300-302)<sup><b><a href="#exported-dependency-information-notes-3">3</a></b></sup> |
+| setuptools | [50.3.2](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v2.29.9/Dockerfile#L27) | [57.5.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L224-247) |
+| pip | [20.2.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v2.29.9/Dockerfile#L26) | [20.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L77-91) |
+| Pipenv | [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.18.4/requirements.txt#L13) | [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L168-191)<sup><b><a href="#exported-dependency-information-notes-4">4</a></b></sup>, [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L143-166) |
<!-- markdownlint-disable MD044 -->
<ol>
<li>
<a id="exported-dependency-information-notes-1"></a>
<p>
- The pre-installed version of <code>Bundler</code> is only used for the <a href="https://gitlab.com/gitlab-org/security-products/analyzers/bundler-audit">bundler-audit</a> analyzer, and is not used for <a href="https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium">gemnasium</a>.
+ The pre-installed and tested version of <code>Bundler</code> is only used for the <a href="https://gitlab.com/gitlab-org/security-products/analyzers/bundler-audit">bundler-audit</a> analyzer, and is not used for <a href="https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium">gemnasium</a>.
</p>
</li>
<li>
@@ -508,19 +508,18 @@ always take the latest dependency scanning artifact available.
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/282533) in GitLab 14.1.
> - [Feature flag sec_dependency_scanning_ui_enable removed](https://gitlab.com/gitlab-org/gitlab/-/issues/326005) in GitLab 14.2.
-To enable Dependency Scanning in a project, you can create a merge request
-from the Security Configuration page.
+To enable Dependency Scanning in a project, you can create a merge request:
-1. In the project where you want to enable Dependency Scanning, navigate to
- **Security & Compliance > Configuration**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Security & Compliance > Configuration**.
1. In the **Dependency Scanning** row, select **Configure with a merge request**.
+1. Review and merge the merge request to enable Dependency Scanning.
-This automatically creates a merge request with the changes necessary to enable Dependency Scanning
-that you can review and merge to complete the configuration.
+Pipelines now include a dependency scanning job.
### Customizing the dependency scanning settings
-The dependency scanning settings can be changed through [CI/CD variables](#available-cicd-variables) by using the
+The Dependency Scanning settings can be changed through [CI/CD variables](#available-cicd-variables) by using the
[`variables`](../../../ci/yaml/index.md#variables) parameter in `.gitlab-ci.yml`.
For example:
@@ -580,6 +579,7 @@ The following variables allow configuration of global dependency scanning settin
| `DS_EXCLUDED_ANALYZERS` | Specify the analyzers (by name) to exclude from Dependency Scanning. For more information, see [Dependency Scanning Analyzers](analyzers.md). |
| `DS_DEFAULT_ANALYZERS` | ([**DEPRECATED - use `DS_EXCLUDED_ANALYZERS` instead**](https://gitlab.com/gitlab-org/gitlab/-/issues/287691)) Override the names of the official default images. For more information, see [Dependency Scanning Analyzers](analyzers.md). |
| `DS_EXCLUDED_PATHS` | Exclude files and directories from the scan based on the paths. A comma-separated list of patterns. Patterns can be globs, or file or folder paths (for example, `doc,spec`). Parent directories also match patterns. Default: `"spec, test, tests, tmp"`. |
+| `DS_IMAGE_SUFFIX` | Suffix added to the image name. If set to `-fips`, `FIPS-enabled` images are used for scan. See [FIPS-enabled images](#fips-enabled-images) for more details. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/354796) in GitLab 14.10. |
| `SECURE_ANALYZERS_PREFIX` | Override the name of the Docker registry providing the official default images (proxy). Read more about [customizing analyzers](analyzers.md). |
| `SECURE_LOG_LEVEL` | Set the minimum logging level. Messages of this logging level or higher are output. From highest to lowest severity, the logging levels are: `fatal`, `error`, `warn`, `info`, `debug`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10880) in GitLab 13.1. Default: `info`. |
@@ -660,6 +660,40 @@ you can use the `MAVEN_CLI_OPTS` CI/CD variable.
Read more on [how to use private Maven repositories](../index.md#using-private-maven-repositories).
+#### FIPS-enabled images
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/354796) in GitLab 14.10.
+
+GitLab also offers [FIPS-enabled Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
+versions of the Gemnasium images. You can therefore replace standard images with FIPS-enabled images.
+
+To use FIPS-enabled images, set the `DS_IMAGE_SUFFIX` to `-fips`,
+and set `DS_EXCLUDED_ANALYZERS` to `bundler-audit, retire.js`
+to exclude the analyzers that don't support FIPS.
+
+```yaml
+variables:
+ DS_IMAGE_SUFFIX: "-fips"
+ DS_EXCLUDED_ANALYZERS: "bundler-audit, retire.js"
+```
+
+If you want to execute `bundler-audit` or `retire.js` in your project pipeline, you can override the
+Gemnasium scanning jobs, and set `DS_IMAGE_SUFFIX` to `-fips` only for those jobs.
+
+```yaml
+gemnasium-dependency_scanning:
+ variables:
+ DS_IMAGE_SUFFIX: "-fips"
+
+gemnasium-maven-dependency_scanning:
+ variables:
+ DS_IMAGE_SUFFIX: "-fips"
+
+gemnasium-python-dependency_scanning:
+ variables:
+ DS_IMAGE_SUFFIX: "-fips"
+```
+
## Interacting with the vulnerabilities
Once a vulnerability is found, you can interact with it. Read more on how to
@@ -890,7 +924,7 @@ Please check the [Release Process documentation](https://gitlab.com/gitlab-org/s
## Contributing to the vulnerability database
You can search the [`gemnasium-db`](https://gitlab.com/gitlab-org/security-products/gemnasium-db) project
-to find a vulnerability in the Gemnasium database.
+to find a vulnerability in the GitLab Advisory Database.
You can also [submit new vulnerabilities](https://gitlab.com/gitlab-org/security-products/gemnasium-db/blob/master/CONTRIBUTING.md).
## Running dependency scanning in an offline environment
@@ -1237,3 +1271,24 @@ analyzers, edit your `gitlab-ci.yml` file and either:
For example, currently the `gemnasium-maven-dependency_scanning` job pulls the latest
`gemnasium-maven` Docker image because `DS_ANALYZER_IMAGE` is set to
`"$SECURE_ANALYZERS_PREFIX/gemnasium-maven:$DS_MAJOR_VERSION"`.
+
+### Dependency Scanning of setuptools project fails with `use_2to3 is invalid` error
+
+Support for [2to3](https://docs.python.org/3/library/2to3.html)
+was [removed](https://setuptools.pypa.io/en/latest/history.html#v58-0-0)
+in `setuptools` version `v58.0.0`. Dependency Scanning (running `python 3.9`) uses `setuptools`
+version `58.1.0+`, which doesn't support `2to3`. Therefore, a `setuptools` dependency relying on
+`lib2to3` will fail with this message:
+
+```plaintext
+error in <dependency name> setup command: use_2to3 is invalid
+```
+
+To work around this error, downgrade the analyzer's version of `setuptools` (e.g. `v57.5.0`):
+
+```yaml
+gemnasium-python-dependency_scanning:
+ before_script:
+ - pip install setuptools==57.5.0
+ image: registry.gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python:2-python-3.9
+```
diff --git a/doc/user/application_security/iac_scanning/index.md b/doc/user/application_security/iac_scanning/index.md
index b72f54b4493..35968a6361f 100644
--- a/doc/user/application_security/iac_scanning/index.md
+++ b/doc/user/application_security/iac_scanning/index.md
@@ -41,9 +41,31 @@ GitLab IaC scanning supports a variety of IaC configuration files. Our IaC secur
| Google Deployment Manager | [KICS](https://kics.io/) | 14.5 |
| Kubernetes | [KICS](https://kics.io/) | 14.5 |
| OpenAPI | [KICS](https://kics.io/) | 14.5 |
-| Terraform | [KICS](https://kics.io/) | 14.5 |
+| Terraform <sup>2</sup> | [KICS](https://kics.io/) | 14.5 |
1. IaC scanning can analyze Azure Resource Manager templates in JSON format. If you write templates in the [Bicep](https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview) language, you must use [the bicep CLI](https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/bicep-cli) to convert your Bicep files into JSON before GitLab IaC scanning can analyze them.
+1. Terraform modules in a custom registry are not scanned for vulnerabilities. You can follow [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/357004) for the proposed feature.
+
+### Supported distributions
+
+GitLab scanners are provided with a base alpine image for size and maintainability.
+
+#### FIPS-enabled images
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6479) in GitLab 14.10.
+
+GitLab also offers [FIPS-enabled Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
+versions of the images. You can therefore replace standard images with FIPS-enabled
+images. To configure the images, set the `SAST_IMAGE_SUFFIX` to `-fips` or modify the
+standard tag plus the `-fips` extension.
+
+```yaml
+variables:
+ SAST_IMAGE_SUFFIX: '-fips'
+
+include:
+ - template: Security/SAST-IaC.latest.gitlab-ci.yml
+```
### Making IaC analyzers available to all GitLab tiers
@@ -54,13 +76,13 @@ All open source (OSS) analyzers are available with the GitLab Free tier. Future
Different features are available in different [GitLab tiers](https://about.gitlab.com/pricing/),
as shown in the following table:
-| Capability | In Free | In Ultimate |
-|:---------------------------------------------------------------------------------------|:--------------------|:-------------------|
-| [Configure IaC Scanners](#configuration) | **{check-circle}** | **{check-circle}** |
-| View [JSON Report](#reports-json-format) | **{check-circle}** | **{check-circle}** |
-| Presentation of JSON Report in merge request | **{dotted-circle}** | **{check-circle}** |
-| [Address vulnerabilities](../../application_security/vulnerabilities/index.md) | **{dotted-circle}** | **{check-circle}** |
-| [Access to Security Dashboard](../../application_security/security_dashboard/index.md) | **{dotted-circle}** | **{check-circle}** |
+| Capability | In Free & Premium | In Ultimate |
+|:----------------------------------------------------------------|:--------------------|:-------------------|
+| [Configure IaC scanner](#configuration) | **{check-circle}** | **{check-circle}** |
+| Download [JSON Report](#reports-json-format) | **{check-circle}** | **{check-circle}** |
+| See new findings in merge request widget | **{dotted-circle}** | **{check-circle}** |
+| [Manage vulnerabilities](../vulnerabilities/index.md) | **{dotted-circle}** | **{check-circle}** |
+| [Access the Security Dashboard](../security_dashboard/index.md) | **{dotted-circle}** | **{check-circle}** |
## Contribute your scanner
@@ -92,15 +114,14 @@ that you can download and analyze.
### Enable IaC Scanning via an automatic merge request
-To enable IaC Scanning in a project, you can create a merge request
-from the Security Configuration page:
+To enable IaC Scanning in a project, you can create a merge request:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Security & Compliance > Configuration**.
1. In the **Infrastructure as Code (IaC) Scanning** row, select **Configure with a merge request**.
+1. Review and merge the merge request to enable IaC Scanning.
-This automatically creates a merge request with the changes necessary to enable IaC Scanning
-that you can review and merge to complete the configuration.
+Pipelines now include an IaC job.
## Reports JSON format
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index ff548f1d29f..3a6aa8e3485 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -52,7 +52,7 @@ The following vulnerability scanners and their databases are regularly updated:
| Secure scanning tool | Vulnerabilities database updates |
|:----------------------------------------------------------------|:---------------------------------|
| [Container Scanning](container_scanning/index.md) | A job runs on a daily basis to build new images with the latest vulnerability database updates from the upstream scanner. For more details, see [Vulnerabilities database update](container_scanning/index.md#vulnerabilities-database-update). |
-| [Dependency Scanning](dependency_scanning/index.md) | Relies on `bundler-audit` (for Ruby gems), `retire.js` (for npm packages), and `gemnasium` (the GitLab tool for all libraries). Both `bundler-audit` and `retire.js` fetch their vulnerabilities data from GitHub repositories, so vulnerabilities added to `ruby-advisory-db` and `retire.js` are immediately available. The tools themselves are updated once per month if there's a new version. The [Gemnasium DB](https://gitlab.com/gitlab-org/security-products/gemnasium-db) is updated on a daily basis using [data from NVD, the `ruby-advisory-db` and the GitHub Security Advisory Database as data sources](https://gitlab.com/gitlab-org/security-products/gemnasium-db/-/blob/master/SOURCES.md). See our [current measurement of time from CVE being issued to our product being updated](https://about.gitlab.com/handbook/engineering/development/performance-indicators/#cve-issue-to-update). |
+| [Dependency Scanning](dependency_scanning/index.md) | Relies on `bundler-audit` (for Ruby gems), `retire.js` (for npm packages), and `gemnasium` (the GitLab tool for all libraries). Both `bundler-audit` and `retire.js` fetch their vulnerabilities data from GitHub repositories, so vulnerabilities added to `ruby-advisory-db` and `retire.js` are immediately available. The tools themselves are updated once per month if there's a new version. The [GitLab Advisory Database](https://gitlab.com/gitlab-org/security-products/gemnasium-db) is updated on a daily basis using [data from NVD, the `ruby-advisory-db` and the GitHub Advisory Database as data sources](https://gitlab.com/gitlab-org/security-products/gemnasium-db/-/blob/master/SOURCES.md). See our [current measurement of time from CVE being issued to our product being updated](https://about.gitlab.com/handbook/engineering/development/performance-indicators/#cve-issue-to-update). |
| [Dynamic Application Security Testing (DAST)](dast/index.md) | The scanning engine is updated on a periodic basis. See the [version of the underlying tool `zaproxy`](https://gitlab.com/gitlab-org/security-products/dast/blob/main/Dockerfile#L1). The scanning rules are downloaded at scan runtime. |
| [Static Application Security Testing (SAST)](sast/index.md) | Relies exclusively on [the tools GitLab wraps](sast/index.md#supported-languages-and-frameworks). The underlying analyzers are updated at least once per month if a relevant update is available. The vulnerabilities database is updated by the upstream tools. |
@@ -218,7 +218,7 @@ security issues:
WARNING:
This feature is in its end-of-life process. It is [deprecated](../../update/deprecations.md#vulnerability-check)
-for use in GitLab 14.8, and is planned for removal in GitLab 15.0. Users should migrate to the new
+in GitLab 14.8, and is planned for removal in GitLab 15.0. Users should migrate to the new
[Security Approval Policies](policies/scan-result-policies.md).
To prevent a merge request introducing a security vulnerability in a project, enable the
@@ -381,6 +381,12 @@ Learn more on overriding security jobs:
All the security scanning tools define their stage, so this error can occur with all of them.
+## Self managed installation options
+
+For self managed installations, you can choose to run most of the GitLab security scanners even when [not connected to the internet](offline_deployments/index.md).
+
+Self managed installations can also run the security scanners on a GitLab Runner [running inside OpenShift](../../install/openshift_and_gitlab/index.md).
+
## Security report validation
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321918) in GitLab 13.11.
@@ -474,6 +480,7 @@ GitLab provides two methods of accomplishing this, each with advantages and disa
- [Compliance framework pipelines](../project/settings/#compliance-pipeline-configuration)
are recommended when:
+ - Scan execution enforcement is required for SAST or Secret Detection scans that use custom rulesets.
- Scan execution enforcement is required for SAST IaC, Dependency Scanning,
License Compliance, API Fuzzing, or Coverage-guided Fuzzing.
- Scan execution enforcement is required for scanners external to GitLab.
@@ -482,9 +489,18 @@ GitLab provides two methods of accomplishing this, each with advantages and disa
- [Scan execution policies](policies/scan-execution-policies.md)
are recommended when:
- - Scan execution enforcement is required for DAST, SAST, Secret Detection, or Container Scanning.
+ - Scan execution enforcement is required for DAST.
+ - Scan execution enforcement is required for Container Scanning with project-specific variable
+ customizations. To accomplish this, users must create a separate security policy per project.
- Scans are required to run on a regular, scheduled cadence.
+- Either solution can be used equally well when:
+
+ - Scan execution enforcement is required for SAST or Secret Detection when custom rulesets are not
+ used.
+ - Scan execution enforcement is required for Container Scanning with no project-specific variable
+ customizations.
+
Additional details about the differences between the two solutions are outlined below:
| | Compliance Framework Pipelines | Scan Execution Policies |
diff --git a/doc/user/application_security/policies/img/association_diagram.png b/doc/user/application_security/policies/img/association_diagram.png
new file mode 100644
index 00000000000..d082e297c68
--- /dev/null
+++ b/doc/user/application_security/policies/img/association_diagram.png
Binary files differ
diff --git a/doc/user/application_security/policies/index.md b/doc/user/application_security/policies/index.md
index 8a39220da35..81d24104340 100644
--- a/doc/user/application_security/policies/index.md
+++ b/doc/user/application_security/policies/index.md
@@ -21,6 +21,56 @@ GitLab supports the following security policies:
- [Scan Result Policy](scan-result-policies.md)
- [Container Network Policy](#container-network-policy) (DEPRECATED)
+## Security policy project
+
+All security policies are stored as YAML in a separate security policy project that gets linked to
+the development project. This association can be a one-to-many relationship, allowing one security
+policy project to apply to multiple development projects. Linked projects are not required to be in
+the same group as the development projects to which they are linked.
+
+![Security Policy Project Linking Diagram](img/association_diagram.png)
+
+Although it is possible to have one project linked to itself and to serve as both the development
+project and the security policy project, this is not recommended. Keeping the security policy
+project separate from the development project allows for complete separation of duties between
+security/compliance teams and development teams.
+
+All security policies are stored in the `.gitlab/security-policies/policy.yml` YAML file inside the
+linked security policy project. The format for this YAML is specific to the type of policy that is
+stored there. Examples and schema information are available for the following policy types:
+
+- [Scan execution policy](scan-execution-policies.md#example-security-policies-project)
+- [Scan result policy](scan-result-policies.md#example-security-scan-result-policies-project)
+
+Policies created in this project are applied through a background job that runs once every 10
+minutes. Allow up to 10 minutes for any policy changes committed to this project to take effect.
+
+### Managing the linked security policy project
+
+NOTE:
+Only project Owners have the [permissions](../../permissions.md#project-members-permissions)
+to select, edit, and unlink a security policy project.
+
+As a project owner, take the following steps to create or edit an association between your current
+project and a project that you would like to designate as the security policy project:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Security & Compliance > Policies**.
+1. Select **Edit Policy Project**, and search for and select the
+ project you would like to link from the dropdown menu.
+1. Select **Save**.
+
+To unlink a security policy project, follow the same steps but instead select the trash can icon in
+the modal.
+
+![Security Policy Project](img/security_policy_project_v14_6.png)
+
+### Viewing the linked security policy project
+
+All users who have access to the project policy page and are not project owners will instead view a
+button linking out to the associated security policy project. If no security policy project has been
+associated then the linking button does not appear.
+
## Policy management
The Policies page displays deployed
@@ -57,6 +107,7 @@ You can use the policy editor to create, edit, and delete policies:
1. On the top bar, select **Menu > Projects** and find your group.
1. On the left sidebar, select **Security & Compliance > Policies**.
- To create a new policy, select **New policy** which is located in the **Policies** page's header.
+ You can then select which type of policy to create.
- To edit an existing policy, select **Edit policy** in the selected policy drawer.
The policy editor has two modes:
@@ -78,44 +129,12 @@ by the Rule mode, Rule mode is automatically
disabled. If the YAML is incorrect, you must use YAML
mode to fix your policy before Rule mode is available again.
-## Security Policies project
-
-NOTE:
-We recommend using the [Security Policies project](#security-policies-project)
-exclusively for managing policies for the project. Do not add your application's source code to such
-projects.
-
-The Security Policies feature is a repository to store policies. All security policies are stored in
-the `.gitlab/security-policies/policy.yml` YAML file. The format for this YAML is specific to the type of policy that is being stored there. Examples and schema information are available for the following policy types:
-
-- [Scan execution policy](scan-execution-policies.md#example-security-policies-project)
-- [Scan result policy](scan-result-policies.md#example-security-scan-result-policies-project)
-
-Policies created in this project are applied through a background job that runs once every 10
-minutes. Allow up to 10 minutes for any policy changes committed to this project to take effect.
-
-## Security Policy project selection
-
-NOTE:
-Only project Owners have the [permissions](../../permissions.md#project-members-permissions)
-to select Security Policy Project.
-
-When the Security Policy project is created and policies are created within that repository, you
-must create an association between that project and the project you want to apply policies to:
-
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Security & Compliance > Policies**.
-1. Select **Edit Policy Project**, and search for and select the
- project you would like to link from the dropdown menu.
-1. Select **Save**.
-
- ![Security Policy Project](img/security_policy_project_v14_6.png)
-
-### Unlink Security Policy projects
-
-Project owners can unlink Security Policy projects from development projects. To do this, follow
-the steps described in [Security Policy project selection](#security-policy-project-selection),
-but select the trash can icon in the modal.
+When you finish creating or editing your policy, save and apply it by selecting the
+**Configure with a merge request** button and then merging the resulting merge request. When you
+press this button, the policy YAML is validated and any resulting errors are displayed.
+Additionally, if you are a project owner and a security policy project has not been previously
+associated with this project, then a new project is created and associated automatically at the same
+time that the first policy merge request is created.
## Scan execution policies
@@ -132,7 +151,7 @@ See [Scan result policies](scan-result-policies.md).
WARNING:
Container Network Policy is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-for use in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
+in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
in GitLab 15.0.
The **Container Network Policy** section provides packet flow metrics for
diff --git a/doc/user/application_security/policies/scan-execution-policies.md b/doc/user/application_security/policies/scan-execution-policies.md
index c3778ac97de..7e8e60768b9 100644
--- a/doc/user/application_security/policies/scan-execution-policies.md
+++ b/doc/user/application_security/policies/scan-execution-policies.md
@@ -132,8 +132,8 @@ Note the following:
## Example security policies project
-You can use this example in a `.gitlab/security-policies/policy.yml`, as described in
-[Security policies project](index.md#security-policies-project).
+You can use this example in a `.gitlab/security-policies/policy.yml` file stored in a
+[security policy project](index.md#security-policy-project):
```yaml
---
diff --git a/doc/user/application_security/policies/scan-result-policies.md b/doc/user/application_security/policies/scan-result-policies.md
index 8215316bcab..d2cce207bfd 100644
--- a/doc/user/application_security/policies/scan-result-policies.md
+++ b/doc/user/application_security/policies/scan-result-policies.md
@@ -65,7 +65,7 @@ This rule enforces the defined actions based on the information provided.
| `scanners` | `array` of `string` | `sast`, `secret_detection`, `dependency_scanning`, `container_scanning`, `dast`, `coverage_fuzzing`, `api_fuzzing` | The security scanners for this rule to consider. |
| `vulnerabilities_allowed` | `integer` | Greater than or equal to zero | Number of vulnerabilities allowed before this rule is considered. |
| `severity_levels` | `array` of `string` | `info`, `unknown`, `low`, `medium`, `high`, `critical`| The severity levels for this rule to consider. |
-| `vulnerability_states` | `array` of `string` | `newly_detected`, `detected`, `confirmed`, `resolved`, `dismissed` | The vulnerability states for this rule to consider when the target branch is set to the default branch. |
+| `vulnerability_states` | `array` of `string` | `newly_detected`, `detected`, `confirmed`, `resolved`, `dismissed` | The vulnerability states for this rule to consider when the target branch is set to the default branch. The `newly_detected` state considers all newly detected vulnerabilities regardless of their status or dismissal. The other states consider findings that match the selected state and already exist in the default branch. |
## `require_approval` action type
@@ -90,8 +90,8 @@ Requirements and limitations:
## Example security scan result policies project
-You can use this example in a `.gitlab/security-policies/policy.yml`, as described in
-[Security policies project](index.md#security-policies-project):
+You can use this example in a `.gitlab/security-policies/policy.yml` file stored in a
+[security policy project](index.md#security-policy-project):
```yaml
---
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index d3a79410eea..8f006f258b6 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -81,6 +81,7 @@ You can also [view our language roadmap](https://about.gitlab.com/direction/secu
| Go | [Semgrep](https://semgrep.dev) | 14.4 |
| Groovy ([Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/)) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 11.3 (Gradle) & 11.9 (Ant, Maven, SBT) |
| Helm Charts | [Kubesec](https://github.com/controlplaneio/kubesec) | 13.1 |
+| Java (any build system) | [Semgrep](https://semgrep.dev) | 14.10 |
| Java ([Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/)) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 10.6 (Maven), 10.8 (Gradle) & 11.9 (Ant, SBT) |
| Java (Android) | [MobSF (beta)](https://github.com/MobSF/Mobile-Security-Framework-MobSF) | 13.5 |
| JavaScript | [ESLint security plugin](https://github.com/nodesecurity/eslint-plugin-security) | 11.8 |
@@ -132,6 +133,30 @@ The following analyzers have multi-project support:
Multi-project support in the Security Code Scan requires a Solution (`.sln`) file in the root of
the repository. For details on the Solution format, see the Microsoft reference [Solution (`.sln`) file](https://docs.microsoft.com/en-us/visualstudio/extensibility/internals/solution-dot-sln-file?view=vs-2019).
+### Supported distributions
+
+The default scanner images are build off a base Alpine image for size and maintainability.
+
+#### FIPS-enabled images
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6479) in GitLab 14.10.
+
+GitLab offers [Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
+versions of the images that are FIPS-enabled. To use the FIPS-enabled images, you can either:
+
+- Set the `SAST_IMAGE_SUFFIX` to `-fips`.
+- Add the `-fips` extension to the default image name.
+
+For example:
+
+```yaml
+variables:
+ SAST_IMAGE_SUFFIX: '-fips'
+
+include:
+ - template: Security/SAST.gitlab-ci.yml
+```
+
### Making SAST analyzers available to all GitLab tiers
All open source (OSS) analyzers have been moved to the GitLab Free tier as of GitLab 13.3.
@@ -141,17 +166,17 @@ All open source (OSS) analyzers have been moved to the GitLab Free tier as of Gi
Different features are available in different [GitLab tiers](https://about.gitlab.com/pricing/),
as shown in the following table:
-| Capability | In Free | In Ultimate |
-|:---------------------------------------------------------------------------------------|:--------------------|:-------------------|
-| [Configure SAST Scanners](#configuration) | **{check-circle}** | **{check-circle}** |
-| [Customize SAST Settings](#available-cicd-variables) | **{check-circle}** | **{check-circle}** |
-| View [JSON Report](#reports-json-format) | **{check-circle}** | **{check-circle}** |
-| Presentation of JSON Report in Merge Request | **{dotted-circle}** | **{check-circle}** |
-| [Address vulnerabilities](../../application_security/vulnerabilities/index.md) | **{dotted-circle}** | **{check-circle}** |
-| [Access to Security Dashboard](../../application_security/security_dashboard/index.md) | **{dotted-circle}** | **{check-circle}** |
-| [Configure SAST in the UI](#configure-sast-in-the-ui) | **{dotted-circle}** | **{check-circle}** |
-| [Customize SAST Rulesets](#customize-rulesets) | **{dotted-circle}** | **{check-circle}** |
-| [False Positive Detection](#false-positive-detection) | **{dotted-circle}** | **{check-circle}** |
+| Capability | In Free & Premium | In Ultimate |
+|:----------------------------------------------------------------|:--------------------|:-------------------|
+| [Configure SAST scanners](#configuration) | **{check-circle}** | **{check-circle}** |
+| [Customize SAST settings](#available-cicd-variables) | **{check-circle}** | **{check-circle}** |
+| Download [JSON Report](#reports-json-format) | **{check-circle}** | **{check-circle}** |
+| See new findings in merge request widget | **{dotted-circle}** | **{check-circle}** |
+| [Manage vulnerabilities](../vulnerabilities/index.md) | **{dotted-circle}** | **{check-circle}** |
+| [Access the Security Dashboard](../security_dashboard/index.md) | **{dotted-circle}** | **{check-circle}** |
+| [Configure SAST in the UI](#configure-sast-in-the-ui) | **{dotted-circle}** | **{check-circle}** |
+| [Customize SAST rulesets](#customize-rulesets) | **{dotted-circle}** | **{check-circle}** |
+| [Detect False Positives](#false-positive-detection) | **{dotted-circle}** | **{check-circle}** |
## Contribute your scanner
@@ -190,28 +215,28 @@ always take the latest SAST artifact available.
### 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.
+The method you can use depends on your GitLab license tier.
-- [Configure SAST in the UI with default settings](#configure-sast-in-the-ui-with-default-settings)
-- [Configure SAST in the UI with customizations](#configure-sast-in-the-ui-with-customizations)
+- [Configure SAST in the UI with default settings](#configure-sast-in-the-ui-with-default-settings).
+- [Configure SAST in the UI with customizations](#configure-sast-in-the-ui-with-customizations). **(ULTIMATE)**
### Configure SAST in the UI with default settings
> [Introduced](https://about.gitlab.com/releases/2021/02/22/gitlab-13-9-released/#security-configuration-page-for-all-users) in GitLab 13.9
+NOTE:
+The configuration tool works best with no existing `.gitlab-ci.yml` file, or with a minimal
+configuration file. If you have a complex GitLab configuration file it may not be parsed
+successfully, and an error may occur.
+
To enable and configure SAST with default settings:
1. On the top bar, select **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.
+1. In the SAST section, select **Configure with a merge request**.
+1. Review and merge the merge request to enable SAST.
-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.
+Pipelines now include a SAST job.
### Configure SAST in the UI with customizations **(ULTIMATE)**
@@ -219,27 +244,28 @@ successfully, and an error may occur.
> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/232862) in GitLab 13.4.
> - [Improved](https://gitlab.com/groups/gitlab-org/-/epics/3635) in GitLab 13.5.
+NOTE:
+The configuration tool works best with no existing `.gitlab-ci.yml` file, or with a minimal
+configuration file. If you have a complex GitLab configuration file it may not be parsed
+successfully, and an error may occur.
+
To enable and configure SAST with customizations:
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. If the project does not have a `.gitlab-ci.yml` file, select **Enable SAST** in the Static
+ Application Security Testing (SAST) row, otherwise select **Configure SAST**.
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.
+ Configuration page, their values are inherited from the GitLab SAST template.
1. Optionally, expand the **SAST analyzers** section, select individual
[SAST analyzers](analyzers.md) and enter custom analyzer values.
1. Select **Create Merge Request**.
1. Review and merge the merge request.
-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.
+Pipelines now include a SAST job.
### Overriding SAST jobs
@@ -399,7 +425,7 @@ and `value` of identifiers and then overridden:
```
If a vulnerability is found with a type `CWE` with a value of `703` then
-the vulnerability severity is overwritten to `Critical`.
+the vulnerability severity is overwritten to `Critical`.
#### Synthesize a custom configuration
@@ -523,7 +549,7 @@ Several passthrouh types generate a configuration for the target analyzer:
the configuration.
- If there is a filename collision between files in both repositories, files
from the `sast` repository overwrite files from the `myrules` repository,
- as `sast-rules` has higher precedence.
+ as `sast-rules` has higher precedence.
- The `raw` entry creates a file named `insecure.yml` under `/sgrules`. The
full path is `/sgrules/insecure.yml`.
- The `url` entry fetches a configuration made available through a URL and
@@ -831,6 +857,7 @@ The following are Docker image-related CI/CD variables.
| `SECURE_ANALYZERS_PREFIX` | Override the name of the Docker registry providing the default images (proxy). Read more about [customizing analyzers](analyzers.md). |
| `SAST_EXCLUDED_ANALYZERS` | Names of default images that should never run. Read more about [customizing analyzers](analyzers.md). |
| `SAST_ANALYZER_IMAGE_TAG` | Override the default version of analyzer image. Read more about [pinning the analyzer image version](#pinning-to-minor-image-version). |
+| `SAST_IMAGE_SUFFIX` | Suffix added to the image name. If set to `-fips`, `FIPS-enabled` images are used for scan. See [FIPS-enabled images](#fips-enabled-images) for more details. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355518) in GitLab 14.10. |
#### Vulnerability filters
@@ -936,7 +963,7 @@ To use SAST in an offline environment, you need:
- A Docker Container Registry with locally available copies of SAST [analyzer](https://gitlab.com/gitlab-org/security-products/analyzers) images.
- Configure certificate checking of packages (optional).
-GitLab Runner has a [default `pull policy` of `always`](https://docs.gitlab.com/runner/executors/docker.html#using-the-always-pull-policy),
+GitLab Runner has a [default `pull_policy` of `always`](https://docs.gitlab.com/runner/executors/docker.html#using-the-always-pull-policy),
meaning the runner tries to pull Docker images from the GitLab container registry even if a local
copy is available. The GitLab Runner [`pull_policy` can be set to `if-not-present`](https://docs.gitlab.com/runner/executors/docker.html#using-the-if-not-present-pull-policy)
in an offline environment if you prefer using only locally available Docker images. However, we
@@ -990,7 +1017,7 @@ Support for custom certificate authorities was introduced in the following versi
| `phpcs-security-audit` | [v2.8.2](https://gitlab.com/gitlab-org/security-products/analyzers/phpcs-security-audit/-/releases/v2.8.2) |
| `pmd-apex` | [v2.1.0](https://gitlab.com/gitlab-org/security-products/analyzers/pmd-apex/-/releases/v2.1.0) |
| `security-code-scan` | [v2.7.3](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan/-/releases/v2.7.3) |
-| `semgrep` | [v0.0.1](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep/-/releases/v0.0.1) |
+| `semgrep` | [v0.0.1](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep/-/releases/v0.0.1) |
| `sobelow` | [v2.2.0](https://gitlab.com/gitlab-org/security-products/analyzers/sobelow/-/releases/v2.2.0) |
| `spotbugs` | [v2.7.1](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs/-/releases/v2.7.1) |
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index 582497eb465..0a18e7d5f45 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -60,13 +60,14 @@ as shown in the following table:
| Capability | In Free & Premium | In Ultimate |
|:----------------------------------------------------------------|:--------------------|:-------------------|
-| [Configure Secret Detection Scanners](#configuration) | **{check-circle}** | **{check-circle}** |
-| [Customize Secret Detection Settings](#customizing-settings) | **{check-circle}** | **{check-circle}** |
-| View [JSON Report](../sast/index.md#reports-json-format) | **{check-circle}** | **{check-circle}** |
-| Presentation of JSON Report in merge request | **{dotted-circle}** | **{check-circle}** |
+| [Configure Secret Detection scanner](#configuration) | **{check-circle}** | **{check-circle}** |
+| [Customize Secret Detection settings](#customizing-settings) | **{check-circle}** | **{check-circle}** |
+| Download [JSON Report](../sast/index.md#reports-json-format) | **{check-circle}** | **{check-circle}** |
+| See new findings in the merge request widget | **{dotted-circle}** | **{check-circle}** |
| View identified secrets in the pipelines' **Security** tab | **{dotted-circle}** | **{check-circle}** |
-| [Interaction with Vulnerabilities](../vulnerabilities/index.md) | **{dotted-circle}** | **{check-circle}** |
-| [Access to Security Dashboard](../security_dashboard/index.md) | **{dotted-circle}** | **{check-circle}** |
+| [Manage vulnerabilities](../vulnerabilities/index.md) | **{dotted-circle}** | **{check-circle}** |
+| [Access the Security Dashboard](../security_dashboard/index.md) | **{dotted-circle}** | **{check-circle}** |
+| [Customize Secret Detection rulesets](#custom-rulesets) | **{dotted-circle}** | **{check-circle}** |
## Configuration
@@ -107,25 +108,48 @@ 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.
+### Supported distributions
+
+The default scanner images are build off a base Alpine image for size and maintainability.
+
+#### FIPS-enabled images
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6479) in GitLab 14.10.
+
+GitLab offers [Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
+versions of the images that are FIPS-enabled. To use the FIPS-enabled images, you can either:
+
+- Set the `SAST_IMAGE_SUFFIX` to `-fips`.
+- Add the `-fips` extension to the default image name.
+
+For example:
+
+```yaml
+variables:
+ SECRET_DETECTION_IMAGE_SUFFIX: '-fips'
+
+include:
+ - template: Security/Secret-Detection.gitlab-ci.yml
+```
+
### Enable Secret Detection via an automatic merge request
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4496) in GitLab 13.11, deployed behind a feature flag, enabled by default.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/329886) in GitLab 14.1.
-To enable Secret Detection in a project, you can create a merge request
-from the Security Configuration page.
+NOTE:
+This method 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.
-1. In the project where you want to enable Secret Detection, go to
- **Security & Compliance > Configuration**.
-1. In the **Secret Detection** row, select **Configure with a merge request**.
+To enable Secret Detection in a project, you can create a 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.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Security & Compliance > Configuration**.
+1. In the **Secret Detection** row, select **Configure with a merge request**.
+1. Review and merge the merge request to enable Secret Detection.
-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.
+Pipelines now include a Secret Detection job.
### Customizing settings
@@ -176,6 +200,7 @@ Secret Detection can be customized by defining available CI/CD variables:
| `SECRET_DETECTION_COMMITS` | - | The list of commits that Gitleaks should scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/243564) in GitLab 13.5. |
| `SECRET_DETECTION_EXCLUDED_PATHS` | "" | Exclude vulnerabilities from output based on the paths. This is a comma-separated list of patterns. Patterns can be globs, or file or folder paths (for example, `doc,spec` ). Parent directories also match patterns. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225273) in GitLab 13.3. |
| `SECRET_DETECTION_HISTORIC_SCAN` | false | Flag to enable a historic Gitleaks scan. |
+| `SECRET_DETECTION_IMAGE_SUFFIX` | Suffix added to the image name. If set to `-fips`, `FIPS-enabled` images are used for scan. See [FIPS-enabled images](#fips-enabled-images) for more details. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355519) in GitLab 14.10. |
### Custom rulesets **(ULTIMATE)**
diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md
index a0cfd6d9d77..488ec336646 100644
--- a/doc/user/application_security/security_dashboard/index.md
+++ b/doc/user/application_security/security_dashboard/index.md
@@ -52,6 +52,9 @@ To view vulnerabilities in a pipeline:
1. From the list, select the pipeline you want to check for vulnerabilities.
1. Select the **Security** tab.
+**Scan details** shows vulnerabilities introduced by the merge request, in addition to existing vulnerabilities
+from the latest successful pipeline in your project's default branch.
+
A pipeline consists of multiple jobs, such as SAST and DAST scans. If a job fails to finish,
the security dashboard doesn't show SAST scanner output. For example, if the SAST
job finishes but the DAST job fails, the security dashboard doesn't show SAST results. On failure,
@@ -66,7 +69,8 @@ To view the total number of vulnerabilities per scan:
1. Select the **Status** of a branch.
1. Select the **Security** tab.
-**Scan details** show the total number of vulnerabilities found per scan in the pipeline.
+**Scan details** shows vulnerabilities introduced by the merge request, in addition to existing vulnerabilities
+from the latest successful pipeline in your project's default branch.
### Download security scan outputs
diff --git a/doc/user/application_security/threat_monitoring/index.md b/doc/user/application_security/threat_monitoring/index.md
index 390882d4326..9b8dd2825ea 100644
--- a/doc/user/application_security/threat_monitoring/index.md
+++ b/doc/user/application_security/threat_monitoring/index.md
@@ -12,7 +12,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
Threat Monitoring is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-for use in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
+in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
in GitLab 15.0.
The **Threat Monitoring** page provides alerts and metrics
diff --git a/doc/user/application_security/vulnerabilities/index.md b/doc/user/application_security/vulnerabilities/index.md
index 0b27760b4bb..18b99e06299 100644
--- a/doc/user/application_security/vulnerabilities/index.md
+++ b/doc/user/application_security/vulnerabilities/index.md
@@ -28,7 +28,7 @@ On the vulnerability's page, you can:
- [Create an issue](#create-an-issue-for-a-vulnerability).
- [Link issues to the vulnerability](#linked-issues).
- [Resolve a vulnerability](#resolve-a-vulnerability) if a solution is
- available.
+ available.
- [View security training specific to the detected vulnerability](#view-security-training-for-a-vulnerability).
## Vulnerability status values
diff --git a/doc/user/application_security/vulnerability_report/index.md b/doc/user/application_security/vulnerability_report/index.md
index eb59c289700..a9cef15e3e8 100644
--- a/doc/user/application_security/vulnerability_report/index.md
+++ b/doc/user/application_security/vulnerability_report/index.md
@@ -222,12 +222,8 @@ To undo this action, select a different status from the same menu.
## Manually add a vulnerability finding
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/301003) in GitLab 14.9. Disabled by default.
-
-FLAG:
-This feature is not enabled by default. To make it available, ask an administrator to
-[enable the feature flag](../../feature_flags.md) named `new_vulnerability_form`.
-On GitLab.com, this feature is not yet available.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/301003) in GitLab 14.9. Disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/353796) in GitLab 14.10.
To add a new vulnerability finding from your project level Vulnerability Report page:
@@ -236,7 +232,7 @@ To add a new vulnerability finding from your project level Vulnerability Report
1. Click on **Submit Vulnerability**.
1. Complete the fields and submit the form.
-You will be brought to the newly created vulnerability's detail page. Manually created records appear in the
+You will be brought to the newly created vulnerability's detail page. Manually created records appear in the
Group, Project, and Security Center Vulnerability Reports. To filter them, use the Generic Tool filter.
## Operational vulnerabilities
diff --git a/doc/user/clusters/agent/ci_cd_tunnel.md b/doc/user/clusters/agent/ci_cd_tunnel.md
index 73a8470e025..c15041f6b0d 100644
--- a/doc/user/clusters/agent/ci_cd_tunnel.md
+++ b/doc/user/clusters/agent/ci_cd_tunnel.md
@@ -8,6 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327409) in GitLab 14.1.
> - The pre-configured `KUBECONFIG` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/324275) in GitLab 14.2.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) the `ci_access` attribute in GitLab 14.3.
> - The ability to authorize groups was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) in GitLab 14.3.
> - [Moved](https://gitlab.com/groups/gitlab-org/-/epics/6290) to GitLab Free in 14.5.
> - Support for Omnibus installations was [introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5686) in GitLab 14.5.
@@ -69,6 +70,7 @@ To authorize the agent to access the GitLab project where you keep Kubernetes ma
```
- The Kubernetes projects must be in the same group hierarchy as the project where the agent's configuration is.
+ - You can install additional agents into the same cluster to accommodate additional hierarchies.
- You can authorize up to 100 projects.
All CI/CD jobs now include a `KUBECONFIG` with contexts for every shared agent connection.
@@ -91,9 +93,11 @@ To authorize the agent to access all of the GitLab projects in a group or subgro
```
- The Kubernetes projects must be in the same group hierarchy as the project where the agent's configuration is.
+ - You can install additional agents into the same cluster to accommodate additional hierarchies.
+ - All of the subgroups of an authorized group also have access to the same agent (without being specified individually).
- You can authorize up to 100 groups.
-All the projects that belong to the group are now authorized to access the agent.
+All the projects that belong to the group and its subgroups are now authorized to access the agent.
All CI/CD jobs now include a `KUBECONFIG` with contexts for every shared agent connection.
Choose the context to run `kubectl` commands from your CI/CD scripts.
@@ -123,7 +127,7 @@ Run `kubectl config get-contexts`.
When you deploy to an environment that has both a [certificate-based
cluster](../../infrastructure/clusters/index.md) (deprecated) and an agent connection:
-- The certificate-based cluster's context is called `gitlab-deploy`. This context
+- The certificate-based cluster's context is called `gitlab-deploy`. This context
is always selected by default.
- In GitLab 14.9 and later, agent contexts are included in the
`KUBECONFIG`. You can select them by using `kubectl config use-context
diff --git a/doc/user/clusters/agent/gitops.md b/doc/user/clusters/agent/gitops.md
index 8f0e2255121..e99e3b00ec7 100644
--- a/doc/user/clusters/agent/gitops.md
+++ b/doc/user/clusters/agent/gitops.md
@@ -6,7 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Using a GitOps workflow for Kubernetes **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259669) in GitLab 13.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259669) in GitLab 13.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332227) in GitLab 14.0, the `resource_inclusions` and `resource_exclusions` attributes were removed and `reconcile_timeout`, `dry_run_strategy`, `prune`, `prune_timeout`, `prune_propagation_policy`, and `inventory_policy` attributes were added.
With GitOps, you can manage containerized clusters and applications from a Git repository that:
@@ -18,6 +19,8 @@ By combining GitLab, Kubernetes, and GitOps, you can have:
- GitLab as the GitOps operator.
- Kubernetes as the automation and convergence system.
- GitLab CI/CD for Continuous Integration and the agent for Continuous Deployment.
+- Built-in automatic drift remediation.
+- Resource management with [server-side applies](https://kubernetes.io/docs/reference/using-api/server-side-apply/) for transparent multi-actor field management.
This diagram shows the repositories and main actors in a GitOps deployment:
@@ -90,6 +93,37 @@ gitops:
| `prune_propagation_policy` | The deletion propagation policy that [should be used for pruning](https://github.com/kubernetes/apimachinery/blob/44113beed5d39f1b261a12ec398a356e02358307/pkg/apis/meta/v1/types.go#L456-L470). Can be: `orphan`, `background`, or `foreground`. Default is `foreground`. |
| `inventory_policy` | Determines whether an inventory object can take over objects that belong to another inventory object or don't belong to any inventory object. This is done by determining if the apply/prune operation can go through for a resource based on comparison of the `inventory-id` value in the package and the `owning-inventory` annotation (`config.k8s.io/owning-inventory`) [in the live object](https://github.com/kubernetes-sigs/cli-utils/blob/d6968048dcd80b1c7b55d9e4f31fc25f71c9b490/pkg/inventory/policy.go#L12-L66). Can be: `must_match`, `adopt_if_no_inventory`, or `adopt_all`. Default is `must_match`. |
+## GitOps annotations
+
+The GitLab agent for Kubernetes has annotations you can use to:
+
+- **Sort resources**: Apply or delete resources in a specific order.
+- **Use apply-time mutation**: Dynamically substitute fields from one resource configuration to another.
+
+The agent has [default sorting](https://github.com/kubernetes-sigs/cli-utils/blob/d7d63f4b62897f584ca9e02b6faf4d2f327a9b09/pkg/ordering/sort.go#L74),
+but with annotations, you can fine-tune the order and apply time-value injection.
+
+To provide the GitOps functionality, the GitLab agent for Kubernetes uses the [`cli-utils` library](https://github.com/kubernetes-sigs/cli-utils/),
+a Kubernetes SIG project. You can read more about the available annotations in the [`cli-utils` documentation](https://github.com/kubernetes-sigs/cli-utils/blob/master/README.md#apply-sort-ordering).
+
+- [Learn more about apply sort ordering](https://github.com/kubernetes-sigs/cli-utils#apply-sort-ordering).
+- [Learn more about apply-time mutation](https://github.com/kubernetes-sigs/cli-utils#apply-time-mutation).
+
+## Automatic drift remediation
+
+Drift happens when the current configuration of an infrastructure resource differs from its expected configuration.
+Typically, this is caused by manually editing resources directly through the service that created the resource. Minimizing the
+risk of drift helps to ensure configuration consistency and successful operations.
+
+In GitLab, the agent for Kubernetes regularly compares the expected state from the `git` repository with
+the known state from the `cluster`. Deviations from the `git` state are fixed at every check. These checks
+happen automatically every 5 minutes. They are not configurable.
+
+The agent uses [server-side applies](https://kubernetes.io/docs/reference/using-api/server-side-apply/).
+As a result, every field in a resource can have different managers. Only fields managed by `git`
+are checked for drift. This facilitates the use of in-cluster controllers to modify resources like
+[Horizontal Pod Autoscalers](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/).
+
## Additional resources
The following documentation and examples can help you get started with a GitOps workflow.
diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md
index a8ad19df2e1..bab3f3137fe 100644
--- a/doc/user/clusters/agent/index.md
+++ b/doc/user/clusters/agent/index.md
@@ -9,12 +9,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223061) in GitLab 13.4.
> - Support for `grpcs` [introduced](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/issues/7) in GitLab 13.6.
> - Agent server [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300960) on GitLab.com under `wss://kas.gitlab.com` through an Early Adopter Program in GitLab 13.10.
-> - The agent became available to every project on GitLab.com in GitLab 13.11.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3834) in GitLab 13.11, the GitLab agent became available on GitLab.com.
> - [Moved](https://gitlab.com/groups/gitlab-org/-/epics/6290) from GitLab Premium to GitLab Free in 14.5.
> - [Renamed](https://gitlab.com/groups/gitlab-org/-/epics/7167) from "GitLab Kubernetes Agent" to "GitLab agent for Kubernetes" in GitLab 14.6.
You can connect your Kubernetes cluster with GitLab to deploy, manage,
-and monitor your cloud-native solutions.
+and monitor your cloud-native solutions.
To connect a Kubernetes cluster to GitLab, you must first [install an agent in your cluster](install/index.md).
@@ -43,8 +43,8 @@ This workflow is considered push-based, because GitLab is pushing requests from
GitLab supports the following Kubernetes versions. You can upgrade your
Kubernetes version to a supported version at any time:
+- 1.21 (support ends on November 22, 2022)
- 1.20 (support ends on July 22, 2022)
-- 1.19 (support ends on February 22, 2022)
GitLab supports at least two production-ready Kubernetes minor
versions at any given time. GitLab regularly reviews the supported versions and
diff --git a/doc/user/clusters/agent/install/index.md b/doc/user/clusters/agent/install/index.md
index fca80a4a291..e76ef9e827d 100644
--- a/doc/user/clusters/agent/install/index.md
+++ b/doc/user/clusters/agent/install/index.md
@@ -39,6 +39,9 @@ To install the agent in your cluster:
You must register an agent with GitLab.
+FLAG:
+In GitLab 14.10, a [flag](../../../../administration/feature_flags.md) named `certificate_based_clusters` changed the **Actions** menu to focus on the agent rather than certificates. The flag is [enabled on GitLab.com and self-managed](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
+
Prerequisites:
- For a [GitLab CI/CD workflow](../ci_cd_tunnel.md), ensure that
@@ -48,8 +51,7 @@ To register an agent with GitLab:
1. On the top bar, select **Menu > Projects** and find your project.
1. From the left sidebar, select **Infrastructure > Kubernetes clusters**.
-1. Select **Actions**.
-1. From the **Select an agent** dropdown list:
+1. Select **Connect a cluster (agent)**.
- If you want to create a configuration with CI/CD defaults, type a name for the agent.
- If you already have an [agent configuration file](#create-an-agent-configuration-file), select it from the list.
1. Select **Register an agent**.
@@ -61,11 +63,12 @@ To register an agent with GitLab:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259669) in GitLab 13.7, the agent configuration file can be added to multiple directories (or subdirectories) of the repository.
> - Group authorization was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) in GitLab 14.3.
-You can use an agent configuration file to specify details about your implementation.
-Creating a file is optional but is needed if:
+The agent is configured through a configuration file. This file is optional. Without a configuration file, you can still use the CI/CD workflow in the project where the agent is registered.
+
+You need a configuration file if:
-- You use [a GitOps workflow](../gitops.md#gitops-configuration-reference) and you want a more advanced configuration.
-- You use a GitLab CI/CD workflow. In that workflow, you must [authorize the agent](../ci_cd_tunnel.md#authorize-the-agent).
+- You want to use [a GitOps workflow](../gitops.md#gitops-configuration-reference).
+- You want to authorize a different project to use the agent for a [GitLab CI/CD workflow](../ci_cd_tunnel.md#authorize-the-agent).
To create an agent configuration file, go to the GitLab project. In the repository, create a file called `config.yaml` at this path:
@@ -79,104 +82,62 @@ To create an agent configuration file, go to the GitLab project. In the reposito
- For a GitOps workflow, view [the configuration reference](../gitops.md#gitops-configuration-reference) for details.
- For a GitLab CI/CD workflow, you can leave the file blank for now.
-The agent bootstraps with the GitLab installation URL and an access token,
-and you provide the rest of the configuration in your repository, following
-Infrastructure as Code (IaaC) best practices.
-
### Install the agent in the cluster
-To connect your cluster to GitLab, install the registered agent
-in your cluster. To install it, you can use either:
+> Introduced in GitLab 14.10, GitLab recommends using Helm to install the agent.
-- [The one-liner installation method](#one-liner-installation).
-- [The advanced installation method](#advanced-installation).
+To connect your cluster to GitLab, install the registered agent
+in your cluster. You can either:
-You can use the one-liner installation for trying to use the agent for the first time, to do internal setups with
-high trust, and to quickly get started. For long-term production usage, you may want to use the advanced installation
-method to benefit from more configuration options.
+- [Install the agent with Helm](#install-the-agent-with-helm).
+- Or, follow the [advanced installation method](#advanced-installation-method).
-#### One-liner installation
+If you do not know which one to choose, we recommend starting with Helm.
-The one-liner installation is the simplest process, but you need
-Docker installed locally. If you don't have it, you can either install
-it or opt to the [advanced installation method](#advanced-installation).
+#### Install the agent with Helm
-To install the agent on your cluster using the one-liner installation:
+To install the agent on your cluster using Helm:
+1. [Install Helm](https://helm.sh/docs/intro/install/)
1. In your computer, open a terminal and [connect to your cluster](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/).
-1. Run the command you copied when registering your cluster in the previous step.
+1. Run the command you copied when registering your agent with GitLab.
-Optionally, you can [customize the one-liner installation command](#customize-the-one-liner-installation).
+Optionally, you can [customize the Helm installation](#customize-the-helm-installation).
-##### Customize the one-liner installation
+##### Customize the Helm installation
-By default, the one-liner command generated by GitLab:
+By default, the Helm installation command generated by GitLab:
-- Creates a namespace for the deployment (`gitlab-agent`).
-- Sets up a service account with `cluster-admin` rights (see [how to restrict this service account](#customize-the-permissions-for-the-agentk-service-account)).
-- Creates a `Secret` resource for the agent's access token.
+- Creates a namespace `gitlab-agent` for the deployment (`--namespace gitlab-agent`). You can skip creating the namespace by omitting the `--create-namespace` flag.
+- Sets up a service account for the agent with `cluster-admin` rights. You can:
+ - Skip creating the service account by adding `--set serviceAccount.create=false` to the `helm install` command. In this case, you must set `serviceAccount.name` to a pre-existing service account.
+ - Skip creating the RBAC permissions by adding `--set rbac.create=false` to the `helm install` command. In this case, you must bring your own RBAC permissions for the agent. Otherwise, it has no permissions at all.
+- Creates a `Secret` resource for the agent's access token. To instead bring your own secret with a token, omit the token (`--set token=...`) and instead use `--set config.secretName=<your secret name>`.
- Creates a `Deployment` resource for the `agentk` pod.
-You can edit these parameters to customize the one-liner installation command.
-To view all available options, open a terminal and run this command:
-
-```shell
-docker run --pull=always --rm registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:stable generate --help
-
-Usage:
- cli generate [flags]
-
-Flags:
- --agent-token string Access token registered for agent
- --agent-version string Version of the agentk image to use (default "v14.8.1")
- -h, --help help for generate
- --kas-address string GitLab agent server for Kubernetes address
- --name-prefix string The prefix to use for names of Kubernetes objects
- --namespace string Kubernetes namespace to create resources in (default "gitlab-agent")
- --no-rbac Do not include corresponding Roles and RoleBindings for the agent service account
-```
-
-WARNING:
-Use `--agent-version stable` to refer to the latest stable
-release at the time when the command runs. For production, however,
-you should explicitly specify a matching version.
-
-#### Advanced installation
-
-For advanced installation options, use [the `kpt` installation method](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/tree/master/build/deployment/gitlab-agent).
-
-##### Customize the permissions for the `agentk` service account
-
-You own your cluster and can grant GitLab the permissions you want.
-By default, however, the generated manifests provide `cluster-admin` rights to the agent.
-
-You can restrict the agent's access rights by using Kustomize overlays. [An example is commented out](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/build/deployment/gitlab-agent/cluster/kustomization.yaml) in the `kpt` package you retrieved as part of the installation.
-
-To restrict permissions:
+To see the full list of customizations available, see the Helm chart's [default values file](https://gitlab.com/gitlab-org/charts/gitlab-agent/-/blob/main/values.yaml).
-1. Copy the `cluster` directory.
-1. Edit the `kustomization.yaml` and `components/*` files based on your requirements.
-1. Run `kustomize build <your copied directory> | kubectl apply -f -` to apply your configuration.
+#### Advanced installation method
-#### Update the advanced installation base layer
-
-Now you can update from the upstream package by using `kpt pkg update gitlab-agent --strategy resource-merge`.
-When the advanced installation setup changes, you will not need to change your custom overlays.
+GitLab also provides a [KPT package for the agent](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/tree/master/build/deployment/gitlab-agent). This method provides greater flexibility, but is only recommended for advanced users.
## Install multiple agents in your cluster
-For total separation between teams, you might need to run multiple `agentk` instances in your cluster.
-You might want multiple agents so you can restrict RBAC for every `agentk` deployment.
+To install a second agent in your cluster, you can follow the [previous steps](#register-the-agent-with-gitlab) a second time. To avoid resource name collisions within the cluster, you must either:
+
+- Use a different release name for the agent, e.g. `second-gitlab-agent`:
-To install multiple agents, follow the
-[advanced installation steps](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/tree/master/build/deployment/gitlab-agent)
-a second time and:
+ ```shell
+ helm upgrade --install second-gitlab-agent gitlab/gitlab-agent ...
+ ```
-1. Change the agent name and create a new configuration file.
-1. Register the new agent. You receive a new access token. Each token should be used only with one agent.
-1. Change the namespace or prefix you use for the installation.
+- Or, install the agent in a different namespace, e.g. `different-namespace`:
-You should also change the RBAC for the installed `agentk`.
+ ```shell
+ helm upgrade --install gitlab-agent gitlab/gitlab-agent \
+ --namespace different-namespace \
+ ...
+ ```
## Example projects
@@ -187,50 +148,37 @@ The following example projects can help you get started with the agent.
- [Auto DevOps setup that uses the CI/CD workflow](https://gitlab.com/gitlab-examples/ops/gitops-demo/hello-world-service)
- [Cluster management project template example that uses the CI/CD workflow](https://gitlab.com/gitlab-examples/ops/gitops-demo/cluster-management)
-## Upgrades and version compatibility
-
-The agent has two major components: `agentk` and `kas`.
-GitLab provides `kas` installers built into the various GitLab installation methods.
-The required `kas` version corresponds to the GitLab `major.minor` (X.Y) versions.
-
-At the same time, `agentk` and `kas` can differ by 1 minor version in either direction. For example,
-`agentk` 14.4 supports `kas` 14.3, 14.4, and 14.5 (regardless of the patch).
+## Updates and version compatibility
-A feature introduced in a given GitLab minor version might work with other `agentk` or `kas` versions.
-To ensure it works, use at least the same `agentk` and `kas` minor version. For example,
-if your GitLab version is 14.2, use at least `agentk` 14.2 and `kas` 14.2.
-
-We recommend upgrading your `kas` installations together with GitLab instances' upgrades, and to
-[upgrade the `agentk` installations](#update-the-agent-version) after upgrading GitLab.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340882) in GitLab 14.8, GitLab warns you on the agent's list page to update the agent version installed on your cluster.
-The available `agentk` and `kas` versions are available in
-[the Container Registry](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/container_registry/).
+For the best experience, the version of the agent installed in your cluster should match the GitLab major and minor version. The previous minor version is also supported. For example, if your GitLab version is v14.9.4 (major version 14, minor version 9), then versions v14.9.0 and v14.9.1 of the agent are ideal, but any v14.8.x version of the agent is also supported. See [this page](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/releases) of releases of the GitLab agent.
### Update the agent version
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340882) in GitLab 14.8, GitLab warns you on the agent's list page to update the agent version installed on your cluster.
-
-To update the agent's version, re-run the [installation command](#install-the-agent-in-the-cluster)
-with a newer `--agent-version`. Make sure to specify the other required parameters: `--kas-address`, `--namespace`, and `--agent-token`.
-The available `agentk` versions are in [the Container Registry](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/container_registry/1223205?sort=desc).
+To update the agent to the latest version, you can run:
-If you don't have access to your agent's access token, you can retrieve it from your cluster:
-
-1. Open a terminal and connect to your cluster.
-1. To retrieve the namespace, run:
+```shell
+helm repo update
+helm upgrade --install gitlab-agent gitlab/gitlab-agent \
+ --namespace gitlab-agent \
+ --reuse-values
+```
- ```shell
- kubectl get namespaces
- ```
+To set a specific version, you can override the `image.tag` value. For example, to install version `v14.9.1`, run:
-1. To retrieve the secret, run:
+```shell
+helm upgrade gitlab-agent gitlab/gitlab-agent \
+ --namespace gitlab-agent \
+ --reuse-values \
+ --set image.tag=v14.9.1
+```
- ```shell
- kubectl -n <namespace> get secrets
- ```
+## Uninstall the agent
-1. To retrieve the access token, run:
+If you [installed the agent with Helm](#install-the-agent-with-helm), then you can also uninstall with Helm. For example, if the release and namespace are both called `gitlab-agent`, then you can uninstall the agent using the following command:
- ```shell
- kubectl -n <namespace> get secret <secret-name> --template={{.data.token}} | base64 --decode
- ```
+```shell
+helm uninstall gitlab-agent \
+ --namespace gitlab-agent
+```
diff --git a/doc/user/clusters/agent/repository.md b/doc/user/clusters/agent/repository.md
index 3f743d34e0a..2087c804e26 100644
--- a/doc/user/clusters/agent/repository.md
+++ b/doc/user/clusters/agent/repository.md
@@ -6,11 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Working with the agent for Kubernetes **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259669) in GitLab 13.7.
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3834) in GitLab 13.11, the GitLab agent became available on GitLab.com.
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) the `ci_access` attribute in GitLab 14.3.
-> - [Moved](https://gitlab.com/groups/gitlab-org/-/epics/6290) from GitLab Premium to GitLab Free in 14.5.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332227) in GitLab 14.0, the `resource_inclusions` and `resource_exclusions` attributes were removed and `reconcile_timeout`, `dry_run_strategy`, `prune`, `prune_timeout`, `prune_propagation_policy`, and `inventory_policy` attributes were added.
+Use the following tasks when working with the agent for Kubernetes.
## View your agents
@@ -171,7 +167,7 @@ To remove an agent from the UI:
WARNING:
Cilium integration is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-for use in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
+in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
in GitLab 15.0.
The agent for Kubernetes also provides an integration with Cilium. This integration provides a simple way to
diff --git a/doc/user/clusters/agent/troubleshooting.md b/doc/user/clusters/agent/troubleshooting.md
index a5e568837ad..c5c7e46c078 100644
--- a/doc/user/clusters/agent/troubleshooting.md
+++ b/doc/user/clusters/agent/troubleshooting.md
@@ -27,9 +27,8 @@ If you are a GitLab administrator, you can also view the [GitLab agent server lo
}
```
-This error is shown if there are some connectivity issues between the address
-specified as `kas-address`, and your agent pod. To fix it, make sure that you
-specified the `kas-address` correctly.
+This error occurs when there are connectivity issues between the `kas-address`
+and your agent pod. To fix this issue, make sure the `kas-address` is accurate.
```json
{
@@ -41,8 +40,8 @@ specified the `kas-address` correctly.
}
```
-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 trailing slash, such as `wss://GitLab.host.tld:443/-/kubernetes-agent/`
+This error occurs when the `kas-address` doesn't include a trailing slash. To fix this issue, make sure that the
+`wss` or `ws` URL ends with a trailing slash, like `wss://GitLab.host.tld:443/-/kubernetes-agent/`
or `ws://GitLab.host.tld:80/-/kubernetes-agent/`.
## ValidationError(Deployment.metadata)
@@ -58,9 +57,10 @@ or `ws://GitLab.host.tld:80/-/kubernetes-agent/`.
}
```
-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.
+This error occurs when a manifest file is malformed and Kubernetes can't
+create the specified objects. Make sure that your manifest files are valid.
+
+For additional troubleshooting, try to use the manifest files to create objects in Kubernetes directly.
## Error while dialing failed to WebSocket dial: failed to send handshake request
@@ -73,16 +73,10 @@ may try using them to create objects in Kubernetes directly for more troubleshoo
}
```
-This error is shown if you configured `wss` as `kas-address` on the agent side,
-but KAS on the server side is not available via `wss`. To fix it, make sure the
+This error occurs when you configured `wss` as `kas-address` on the agent side,
+but the agent server is not available at `wss`. To fix this issue, make sure the
same schemes are configured on both sides.
-It's not possible to set the `grpc` scheme due to the issue
-[It is not possible to configure KAS to work with `grpc` without directly editing GitLab KAS deployment](https://gitlab.com/gitlab-org/gitlab/-/issues/276888). To use `grpc` while the
-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`.
-
## Decompressor is not installed for grpc-encoding
```json
@@ -94,8 +88,8 @@ issue is in progress, directly edit the deployment with the
}
```
-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.
+This error occurs when the version of the agent is newer that the version of the agent server (KAS).
+To fix it, make sure that both `agentk` and the agent server are the same version.
## Certificate signed by unknown authority
@@ -109,9 +103,11 @@ To fix it, make sure that both `agentk` and KAS use the same versions.
}
```
-This error is shown if your GitLab instance is using a certificate signed by an internal CA that
-is unknown to the agent. One approach to fixing it is to present the CA certificate file to the agent
-via a Kubernetes `configmap` and mount the file in the agent `/etc/ssl/certs` directory from where it
+This error occurs when your GitLab instance is using a certificate signed by an internal
+certificate authority that is unknown to the agent.
+
+To fix this issue, you can present the CA certificate file to the agent
+by using a Kubernetes `configmap` and mount the file in the agent `/etc/ssl/certs` directory from where it
will be picked up automatically.
For example, if your internal CA certificate is `myCA.pem`:
@@ -153,7 +149,7 @@ Then in `resources.yml`:
path: myCA.pem
```
-Alternatively, you can mount the certificate file at a different location and include it using the
+Alternatively, you can mount the certificate file at a different location and specify it for the
`--ca-cert-file` agent parameter:
```yaml
@@ -188,5 +184,5 @@ Alternatively, you can mount the certificate file at a different location and in
}
```
-This error is shown if the manifest project is not public. To fix it, make sure your manifest project is public or your manifest files
-are stored in the agent's configuration repository.
+This error occurs when the project where you keep your manifests is not public. To fix it, make sure your project is public or your manifest files
+are stored in the repository where the agent is configured.
diff --git a/doc/user/compliance/compliance_report/img/failed_icon_v13_3.png b/doc/user/compliance/compliance_report/img/failed_icon_v13_3.png
deleted file mode 100644
index c3f386c9dee..00000000000
--- a/doc/user/compliance/compliance_report/img/failed_icon_v13_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/compliance/compliance_report/img/success_icon_v13_3.png b/doc/user/compliance/compliance_report/img/success_icon_v13_3.png
deleted file mode 100644
index ea6ca924f81..00000000000
--- a/doc/user/compliance/compliance_report/img/success_icon_v13_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/compliance/compliance_report/img/warning_icon_v13_3.png b/doc/user/compliance/compliance_report/img/warning_icon_v13_3.png
deleted file mode 100644
index 168a7021948..00000000000
--- a/doc/user/compliance/compliance_report/img/warning_icon_v13_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/compliance/compliance_report/index.md b/doc/user/compliance/compliance_report/index.md
index 27783a063da..77dbefa0755 100644
--- a/doc/user/compliance/compliance_report/index.md
+++ b/doc/user/compliance/compliance_report/index.md
@@ -9,17 +9,19 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36524) in GitLab 12.8 as Compliance Dashboard.
> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/299360) to compliance report in GitLab 14.2.
+> - [Replaced](https://gitlab.com/groups/gitlab-org/-/epics/5237) by merge request violations in GitLab 14.6 [with a flag](../../../administration/feature_flags.md) named `compliance_violations_report`. Disabled by default.
+> - GraphQL API [introduced](https://gitlab.com/groups/gitlab-org/-/epics/7222) in GitLab 14.9.
+> - [Generally available](https://gitlab.com/groups/gitlab-org/-/epics/5237) in GitLab 14.10. [Feature flag `compliance_violations_report`](https://gitlab.com/gitlab-org/gitlab/-/issues/346266) removed.
Compliance report gives you the ability to see a group's merge request activity. It provides a
high-level view for all projects in the group. For example, code approved for merging into
production.
-You can use the report to:
+You can use the report to get:
-- Get an overview of the latest merge request for each project.
-- See if merge requests were approved and by whom.
-- See merge request authors.
-- See the latest [CI/CD pipeline](../../../ci/pipelines/index.md) result for each merge request.
+- A list of compliance violations from all merged merge requests within the group.
+- The reason and severity of each compliance violation.
+- A link to the merge request that caused each compliance violation.
## View the compliance report for a group
@@ -32,8 +34,36 @@ 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 report**.
-NOTE:
-The compliance report shows only the latest merge request on each project.
+### Severity levels scale
+
+The following is a list of available violation severity levels, ranked from most to least severe:
+
+| Icon | Severity level |
+|:----------------------------------------------|:---------------|
+| **{severity-critical, 18, gl-fill-red-800}** | Critical |
+| **{severity-high, 18, gl-fill-red-600}** | High |
+| **{severity-medium, 18, gl-fill-orange-400}** | Medium |
+| **{severity-low, 18, gl-fill-orange-300}** | Low |
+| **{severity-info, 18, gl-fill-blue-400}** | Info |
+
+### Violation types
+
+The following is a list of violations that are either:
+
+- Already available.
+- Aren't available, but which we are tracking in issues.
+
+| Violation | Severity level | Category | Description | Availability |
+|:-------------------------------------|:----------------|:---------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------|
+| Author approved merge request | High | [Separation of duties](#separation-of-duties) | The author of the merge request approved their own merge request. [Learn more](../../project/merge_requests/approvals/settings.md#prevent-approval-by-author). | [Available in GitLab 14.10](https://gitlab.com/groups/gitlab-org/-/epics/6870) |
+| Committers approved merge request | High | [Separation of duties](#separation-of-duties) | The committers of the merge request approved the merge request they contributed to. [Learn more](../../project/merge_requests/approvals/settings.md#prevent-approvals-by-users-who-add-commits). | [Available in GitLab 14.10](https://gitlab.com/groups/gitlab-org/-/epics/6870) |
+| Fewer than two approvals | High | [Separation of duties](#separation-of-duties) | The merge request was merged with fewer than two approvals. [Learn more](../../project/merge_requests/approvals/rules.md). | [Available in GitLab 14.10](https://gitlab.com/groups/gitlab-org/-/epics/6870) |
+| Pipeline failed | Medium | [Pipeline results](../../../ci/pipelines/index.md) | The merge requests pipeline failed and was merged. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
+| Pipeline passed with warnings | Info | [Pipeline results](../../../ci/pipelines/index.md) | The merge request pipeline passed with warnings and was merged. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
+| Code coverage down more than 10% | High | [Code coverage](../../../ci/pipelines/settings.md#merge-request-test-coverage-results) | The code coverage report for the merge request indicates a reduction in coverage of more than 10%. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
+| Code coverage down between 5% to 10% | Medium | [Code coverage](../../../ci/pipelines/settings.md#merge-request-test-coverage-results) | The code coverage report for the merge request indicates a reduction in coverage of between 5% to 10%. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
+| Code coverage down between 1% to 5% | Low | [Code coverage](../../../ci/pipelines/settings.md#merge-request-test-coverage-results) | The code coverage report for the merge request indicates a reduction in coverage of between 1% to 5%. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
+| Code coverage down less than 1% | Info | [Code coverage](../../../ci/pipelines/settings.md#merge-request-test-coverage-results) | The code coverage report for the merge request indicates a reduction in coverage of less than 1%. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
## Merge request drawer
@@ -51,30 +81,15 @@ request:
- A list of users that approved the merge request.
- The user that merged the merge request.
-## Approval status and separation of duties
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217939) in GitLab 13.3.
+## Separation of duties
We support a separation of duties policy between users who create and approve merge requests.
-The approval status column can help you identify violations of this policy.
Our criteria for the separation of duties is as follows:
- [A merge request author is **not** allowed to approve their merge request](../../project/merge_requests/approvals/settings.md#prevent-approval-by-author)
- [A merge request committer is **not** allowed to approve a merge request they have added commits to](../../project/merge_requests/approvals/settings.md#prevent-approvals-by-users-who-add-commits)
- [The minimum number of approvals required to merge a merge request is **at least** two](../../project/merge_requests/approvals/rules.md)
-The **Approval status** column shows you at a glance whether a merge request is complying with the above.
-This column has four states:
-
-| State | Description |
-|:------|:------------|
-| Empty | The merge request approval status is unknown |
-| ![Failed](img/failed_icon_v13_3.png) | The merge request **does not** comply with any of the above criteria |
-| ![Warning](img/warning_icon_v13_3.png) | The merge request complies with **some** of the above criteria |
-| ![Success](img/success_icon_v13_3.png) | The merge request complies with **all** of the above criteria |
-
-If you see a non-success state, review the criteria for the merge request's project to ensure it complies with the separation of duties.
-
## Chain of Custody report
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213364) in GitLab 13.3.
@@ -105,64 +120,3 @@ You can generate a commit-specific Chain of Custody report for a given commit SH
NOTE:
The Chain of Custody report download is a CSV file, with a maximum size of 15 MB.
The remaining records are truncated when this limit is reached.
-
-## Merge request violations
-
-> - Introduced in GitLab 14.6. [Deployed behind the `compliance_violations_report` flag](../../../administration/feature_flags.md). Disabled by default.
-> - GraphQL API [introduced](https://gitlab.com/groups/gitlab-org/-/epics/7222) in GitLab 14.9.
-
-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 `compliance_violations_report`.
-On GitLab.com, this feature is not available. This feature is not ready for production use.
-
-Merge request violations provide a view of all the [separation of duties](#approval-status-and-separation-of-duties) compliance violations
-that exist in projects in a specific group. For each separation of duties compliance violation, you can see:
-
-- A list of compliance violations.
-- The severity of each compliance violation.
-- Reason for the compliance violation.
-- A link to the merge request that caused the compliance violation.
-
-Merge request violations can be accessed:
-
-- In the GitLab UI.
-- Using the [GraphQL API](../../../api/graphql/reference/index.md#complianceviolation) (GitLab 14.9 and later).
-
-### View merge request violations
-
-To view merge request violations:
-
-1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Security & Compliance > Compliance report**.
-
-### Severity levels scale
-
-The following is a list of available violation severity levels, ranked from most to least severe:
-
-| Icon | Severity level |
-|:----------------------------------------------|:---------------|
-| **{severity-critical, 18, gl-fill-red-800}** | Critical |
-| **{severity-high, 18, gl-fill-red-600}** | High |
-| **{severity-medium, 18, gl-fill-orange-400}** | Medium |
-| **{severity-low, 18, gl-fill-orange-300}** | Low |
-| **{severity-info, 18, gl-fill-blue-400}** | Info |
-
-### Violation types
-
-The following is a list of violations that are either:
-
-- Already available.
-- Aren't available, but which we are tracking in issues.
-
-| Violation | Severity level | Category | Description | Availability |
-|:-------------------------------------|:----------------|:----------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------|
-| Author approved merge request | High | [Separation of duties](#approval-status-and-separation-of-duties) | The author of the merge request approved their own merge request. [Learn more](../../project/merge_requests/approvals/settings.md#prevent-approval-by-author). | [Unavailable](https://gitlab.com/groups/gitlab-org/-/epics/6870) |
-| Committers approved merge request | High | [Separation of duties](#approval-status-and-separation-of-duties) | The committers of the merge request approved the merge request they contributed to. [Learn more](../../project/merge_requests/approvals/settings.md#prevent-approvals-by-users-who-add-commits). | [Unavailable](https://gitlab.com/groups/gitlab-org/-/epics/6870) |
-| Fewer than two approvals | High | [Separation of duties](#approval-status-and-separation-of-duties) | The merge request was merged with fewer than two approvals. [Learn more](../../project/merge_requests/approvals/rules.md). | [Unavailable](https://gitlab.com/groups/gitlab-org/-/epics/6870) |
-| Pipeline failed | Medium | [Pipeline results](../../../ci/pipelines/index.md) | The merge requests pipeline failed and was merged. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
-| Pipeline passed with warnings | Info | [Pipeline results](../../../ci/pipelines/index.md) | The merge request pipeline passed with warnings and was merged. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
-| Code coverage down more than 10% | High | [Code coverage](../../../ci/pipelines/settings.md#merge-request-test-coverage-results) | The code coverage report for the merge request indicates a reduction in coverage of more than 10%. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
-| Code coverage down between 5% to 10% | Medium | [Code coverage](../../../ci/pipelines/settings.md#merge-request-test-coverage-results) | The code coverage report for the merge request indicates a reduction in coverage of between 5% to 10%. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
-| Code coverage down between 1% to 5% | Low | [Code coverage](../../../ci/pipelines/settings.md#merge-request-test-coverage-results) | The code coverage report for the merge request indicates a reduction in coverage of between 1% to 5%. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
-| Code coverage down less than 1% | Info | [Code coverage](../../../ci/pipelines/settings.md#merge-request-test-coverage-results) | The code coverage report for the merge request indicates a reduction in coverage of less than 1%. | [Unavailable](https://gitlab.com/gitlab-org/gitlab/-/issues/346011) |
diff --git a/doc/user/crm/crm_contacts_v14_10.png b/doc/user/crm/crm_contacts_v14_10.png
new file mode 100644
index 00000000000..f82878f9d4b
--- /dev/null
+++ b/doc/user/crm/crm_contacts_v14_10.png
Binary files differ
diff --git a/doc/user/crm/crm_contacts_v14_6.png b/doc/user/crm/crm_contacts_v14_6.png
deleted file mode 100644
index 37a615f3926..00000000000
--- a/doc/user/crm/crm_contacts_v14_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/crm/crm_organizations_v14_10.png b/doc/user/crm/crm_organizations_v14_10.png
new file mode 100644
index 00000000000..256c9c3f83b
--- /dev/null
+++ b/doc/user/crm/crm_organizations_v14_10.png
Binary files differ
diff --git a/doc/user/crm/crm_organizations_v14_6.png b/doc/user/crm/crm_organizations_v14_6.png
deleted file mode 100644
index 2bde3823cc7..00000000000
--- a/doc/user/crm/crm_organizations_v14_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/crm/index.md b/doc/user/crm/index.md
index 1fb628cf505..7fc11add2cd 100644
--- a/doc/user/crm/index.md
+++ b/doc/user/crm/index.md
@@ -49,7 +49,7 @@ To view a group's contacts:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Customer relations > Contacts**.
-![Contacts list](crm_contacts_v14_6.png)
+![Contacts list](crm_contacts_v14_10.png)
### Create a contact
@@ -86,7 +86,7 @@ To view a group's organizations:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Customer relations > Organizations**.
-![Organizations list](crm_organizations_v14_6.png)
+![Organizations list](crm_organizations_v14_10.png)
### Create an organization
@@ -103,7 +103,15 @@ organizations using the GraphQL API.
### Edit an organization
-You can only [edit](../../api/graphql/reference/index.md#mutationcustomerrelationsorganizationupdate)
+To edit an existing organization:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Customer relations > Organizations**.
+1. Next to the organization you wish to edit, select **Edit** (**{pencil}**).
+1. Edit the required fields.
+1. Select **Save changes**.
+
+You can also [edit](../../api/graphql/reference/index.md#mutationcustomerrelationsorganizationupdate)
organizations using the GraphQL API.
## Issues
@@ -171,3 +179,23 @@ When you use the `/add_contacts` or `/remove_contacts` quick actions, follow the
/add_contacts [contact:
/remove_contacts [contact:
```
+
+## Moving objects with CRM entries
+
+The root group is the topmost group in the group hierarchy.
+
+When you move an issue, project, or group **within the same group hierarchy**,
+issues retain their contacts.
+
+When you move an issue or project and the **root group changes**,
+issues lose their contacts.
+
+When you move a group and its **root group changes**:
+
+- All unique contacts and organizations are migrated to the new root group.
+- Contacts that already exist (by email address) are deemed duplicates and deleted.
+- Organizations that already exist (by name) are deemed duplicates and deleted.
+- All issues retain their contacts or are updated to point at contacts with the same email address.
+
+If you do not have permission to create contacts and organizations in the new
+root group, the group transfer fails.
diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md
index a6343e0d1cf..8537856ef25 100644
--- a/doc/user/discussions/index.md
+++ b/doc/user/discussions/index.md
@@ -112,12 +112,27 @@ you can reply to comments by sending an email.
You can use [Markdown](../markdown.md) and [quick actions](../project/quick_actions.md) in your email replies.
-## Who can edit comments
+## Edit a comment
You can edit your own comment at any time.
-
Anyone with at least the Maintainer role can also edit a comment made by someone else.
+To edit a comment:
+
+1. On the comment, select **Edit comment** (**{pencil}**).
+1. Make your edits.
+1. Select **Save changes**.
+
+### Editing a comment to add a mention
+
+By default, when you mention a user, GitLab [creates a to-do item](../todos.md#actions-that-create-to-do-items)
+for them, and sends them a [notification email](../profile/notifications.md).
+
+If you edit an existing comment to add a user mention that wasn't there before, GitLab:
+
+- Creates a to-do item for the mentioned user.
+- Does not send a notification email.
+
## Prevent comments by locking an issue
You can prevent public comments in an issue or merge request.
@@ -137,7 +152,8 @@ If an issue or merge request is locked and closed, you cannot reopen it.
## Mark a comment as confidential **(FREE SELF)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207473) in GitLab 13.9 [with a flag](../../administration/feature_flags.md) named `confidential_notes`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207473) in GitLab 13.9 [with a flag](../../administration/feature_flags.md) named `confidential_notes`. Disabled by default.
+> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/351143) in GitLab 14.10: you can only mark comments in issues and epics as confidential. Previously, it was also possible for comments in merge requests and snippets.
FLAG:
On self-managed GitLab, by default this feature is not available. To make it available,
@@ -145,9 +161,25 @@ ask an administrator to [enable the feature flag](../../administration/feature_f
On GitLab.com, this feature is not available.
You should not use this feature for production environments.
-You can make a comment confidential, so that it is visible only to project members
-who have at least the Reporter role.
+You can make a comment **in an issue or an epic** confidential, so that it is visible only to you (the commenting user) and
+the project members who have at least the Reporter role.
+
+Keep in mind:
+
+- You can only mark comments as confidential when you create them.
+- You can't change the confidentiality of existing comments.
+- Replies to comments use same confidentiality as the original comment.
+
+Prerequisites:
+
+- You must either:
+ - Have at least the Reporter role for the project.
+ - Be the issue assignee.
+ - Be the issue author.
+
+To mark a comment as confidential:
+1. Start adding a new comment.
1. Below the comment, select the **Make this comment confidential** checkbox.
1. Select **Comment**.
diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md
index 5cf6a505bee..6bb45575fc3 100644
--- a/doc/user/gitlab_com/index.md
+++ b/doc/user/gitlab_com/index.md
@@ -48,9 +48,16 @@ gitlab.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAA
## Mail configuration
GitLab.com sends emails from the `mg.gitlab.com` domain by using [Mailgun](https://www.mailgun.com/),
-and has its own dedicated IP address (`192.237.158.143`).
+and has its own dedicated IP addresses:
-The IP address for `mg.gitlab.com` is subject to change at any time.
+- `161.38.202.219`
+- `159.135.226.146`
+- `192.237.158.143`
+- `198.61.254.136`
+- `23.253.183.236`
+- `69.72.35.190`
+
+The IP addresses for `mg.gitlab.com` are subject to change at any time.
### Service Desk custom mailbox
@@ -138,7 +145,7 @@ the related documentation.
| Artifacts maximum size (compressed) | 1 GB | See [Maximum artifacts size](../../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size) |
| Artifacts [expiry time](../../ci/yaml/index.md#artifactsexpire_in) | From June 22, 2020, deleted after 30 days unless otherwise specified (artifacts created before that date have no expiry). | See [Default artifacts expiration](../admin_area/settings/continuous_integration.md#default-artifacts-expiration) |
| Scheduled Pipeline Cron | `*/5 * * * *` | See [Pipeline schedules advanced configuration](../../administration/cicd.md#change-maximum-scheduled-pipeline-frequency) |
-| Maximum jobs in active pipelines | `500` for Free tier, unlimited otherwise | See [Number of jobs in active pipelines](../../administration/instance_limits.md#number-of-jobs-in-active-pipelines) |
+| Maximum jobs in active pipelines | `500` for Free tier, `1000` for all trial tiers, and unlimited otherwise. | See [Number of jobs in active pipelines](../../administration/instance_limits.md#number-of-jobs-in-active-pipelines) |
| Maximum CI/CD subscriptions to a project | `2` | See [Number of CI/CD subscriptions to a project](../../administration/instance_limits.md#number-of-cicd-subscriptions-to-a-project) |
| Maximum number of pipeline triggers in a project | `25000` for Free tier, Unlimited for all paid tiers | See [Limit the number of pipeline triggers](../../administration/instance_limits.md#limit-the-number-of-pipeline-triggers) |
| Maximum pipeline schedules in projects | `10` for Free tier, `50` for all paid tiers | See [Number of pipeline schedules](../../administration/instance_limits.md#number-of-pipeline-schedules) |
@@ -315,24 +322,30 @@ limiting responses](#rate-limiting-responses).
The following table describes the rate limits for GitLab.com, both before and
after the limits change in January, 2021:
-| Rate limit | Before 2021-02-12 | From 2021-02-12 | From 2022-02-03 |
-|:--------------------------------------------------------------------------|:------------------------------|:------------------------------|:----------------------------------------|
-| **Protected paths** (for a given **IP address**) | **10** requests per minute | **10** requests per minute | **10** requests per minute |
-| **Raw endpoint** traffic (for a given **project, commit, and file path**) | **300** requests per minute | **300** requests per minute | **300** requests per minute |
-| **Unauthenticated** traffic (from a given **IP address**) | **500** requests per minute | **500** requests per minute | **500** requests per minute |
-| **Authenticated** API traffic (for a given **user**) | **2,000** requests per minute | **2,000** requests per minute | **2,000** requests per minute |
-| **Authenticated** non-API HTTP traffic (for a given **user**) | **1,000** requests per minute | **1,000** requests per minute | **1,000** requests per minute |
-| **All** traffic (from a given **IP address**) | **2,000** requests per minute | **2,000** requests per minute | **2,000** requests per minute |
-| **Issue creation** | **300** requests per minute | **300** requests per minute | **300** requests per minute |
-| **Note creation** (on issues and merge requests) | **300** requests per minute | **60** requests per minute | **60** requests per minute |
-| **Advanced, project, and group search** API (for a given **IP address**) | | **10** requests per minute | **10** requests per minute |
-| **GitLab Pages** requests (for a given **IP address**) | | | **1000** requests per **50 seconds** |
-| **GitLab Pages** requests (for a given **GitLab Pages domain**) | | | **5000** requests per **10 seconds** |
+| Rate limit | From 2021-02-12 | From 2022-02-03 |
+|:--------------------------------------------------------------------------|:------------------------------|:----------------------------------------|
+| **Protected paths** (for a given **IP address**) | **10** requests per minute | **10** requests per minute |
+| **Raw endpoint** traffic (for a given **project, commit, and file path**) | **300** requests per minute | **300** requests per minute |
+| **Unauthenticated** traffic (from a given **IP address**) | **500** requests per minute | **500** requests per minute |
+| **Authenticated** API traffic (for a given **user**) | **2,000** requests per minute | **2,000** requests per minute |
+| **Authenticated** non-API HTTP traffic (for a given **user**) | **1,000** requests per minute | **1,000** requests per minute |
+| **All** traffic (from a given **IP address**) | **2,000** requests per minute | **2,000** requests per minute |
+| **Issue creation** | **300** requests per minute | **300** requests per minute |
+| **Note creation** (on issues and merge requests) | **60** requests per minute | **60** requests per minute |
+| **Advanced, project, and group search** API (for a given **IP address**) | **10** requests per minute | **10** requests per minute |
+| **GitLab Pages** requests (for a given **IP address**) | | **1000** requests per **50 seconds** |
+| **GitLab Pages** requests (for a given **GitLab Pages domain**) | | **5000** requests per **10 seconds** |
More details are available on the rate limits for [protected
paths](#protected-paths-throttle) and [raw
endpoints](../../user/admin_area/settings/rate_limits_on_raw_endpoints.md).
+GitLab can rate-limit requests at several layers. The rate limits listed here
+are configured in the application. These limits are the most
+restrictive per IP address. To learn more about the rate limiting
+for GitLab.com, read our runbook page
+[Overview of rate limits for GitLab.com](https://gitlab.com/gitlab-com/runbooks/-/tree/master/docs/rate-limiting).
+
### Rate limiting responses
For information on rate limiting responses, see:
@@ -395,7 +408,7 @@ doesn't return the following headers:
### Visibility settings
If created before GitLab 12.2 (July 2019), these items have the
-[Internal visibility](../../public_access/public_access.md#internal-projects-and-groups)
+[Internal visibility](../public_access.md#internal-projects-and-groups)
setting [disabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/12388):
- Projects
diff --git a/doc/user/group/contribution_analytics/index.md b/doc/user/group/contribution_analytics/index.md
index 3b866c4a1b0..cd2d5c190a1 100644
--- a/doc/user/group/contribution_analytics/index.md
+++ b/doc/user/group/contribution_analytics/index.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3090) in GitLab 12.2 for subgroups.
-With Contribution Analytics, you can get an overview of the [contribution events](../../index.md#user-contribution-events) in your
+With Contribution Analytics, you can get an overview of the [contribution events](../../profile/index.md#user-contribution-events) in your
group.
- Analyze your team's contributions over a period of time.
diff --git a/doc/user/group/epics/img/related_epic_block_v14_9.png b/doc/user/group/epics/img/related_epic_block_v14_9.png
index 7b5824b84d1..20fdce0151d 100644
--- a/doc/user/group/epics/img/related_epic_block_v14_9.png
+++ b/doc/user/group/epics/img/related_epic_block_v14_9.png
Binary files differ
diff --git a/doc/user/group/epics/img/related_epics_add_v14_9.png b/doc/user/group/epics/img/related_epics_add_v14_9.png
index 3da6eeaff43..112b900f2e3 100644
--- a/doc/user/group/epics/img/related_epics_add_v14_9.png
+++ b/doc/user/group/epics/img/related_epics_add_v14_9.png
Binary files differ
diff --git a/doc/user/group/epics/index.md b/doc/user/group/epics/index.md
index 149c5362ac9..f2cb437ffda 100644
--- a/doc/user/group/epics/index.md
+++ b/doc/user/group/epics/index.md
@@ -45,20 +45,6 @@ have a start or due date, a visual
![Child epics roadmap](img/epic_view_roadmap_v12_9.png)
-## Permissions
-
-If you have access to view an epic and an issue added to that epic, you can view the issue in the
-epic's issue list.
-
-If you have access to edit an epic and an issue added to that epic, you can add the issue to or
-remove it from the epic.
-
-For a given group, the visibility of all projects must be the same as
-the group, or less restrictive. That means if you have access to a group's epic,
-then you already have access to its projects' issues.
-
-You can also consult the [group permissions table](../../permissions.md#group-members-permissions).
-
## Related topics
- [Manage epics](manage_epics.md) and multi-level child epics.
diff --git a/doc/user/group/epics/manage_epics.md b/doc/user/group/epics/manage_epics.md
index 3350b0f1169..e8f720238ed 100644
--- a/doc/user/group/epics/manage_epics.md
+++ b/doc/user/group/epics/manage_epics.md
@@ -16,6 +16,10 @@ to them.
> - In [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/229621) and later, the New Epic button on the Epics list opens the New Epic form.
> - In [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45948) and later, you can create a new epic from an empty roadmap.
+Prerequisites:
+
+- You must have at least the Reporter role for the epic's group.
+
To create an epic in the group you're in:
1. Get to the New Epic form:
@@ -68,6 +72,10 @@ After you create an epic, you can edit the following details:
- Due date
- Labels
+Prerequisites:
+
+- You must have at least the Reporter role for the epic's group.
+
To edit an epic's title or description:
1. Select **Edit title and description** **{pencil}**.
@@ -87,6 +95,10 @@ Users with at least the Reporter role can manage epics.
When bulk editing epics in a group, you can edit their labels.
+Prerequisites:
+
+- You must have at least the Reporter role for the parent epic's group.
+
To update multiple epics at the same time:
1. In a group, go to **Epics > List**.
@@ -97,8 +109,9 @@ To update multiple epics at the same time:
## Delete an epic
-NOTE:
-To delete an epic, you must be an Owner of a group or subgroup.
+Prerequisites:
+
+- You must have the Owner role for the epic's group.
To delete the epic:
@@ -112,6 +125,10 @@ If you delete an epic, all its child epics and their descendants are deleted as
## Close an epic
+Prerequisites:
+
+- You must have at least the Reporter role for the epic's group.
+
Whenever you decide that there is no longer need for that epic,
close the epic by:
@@ -123,13 +140,19 @@ close the epic by:
## Reopen a closed epic
-You can reopen an epic that was closed by:
+You can reopen an epic that was closed.
+
+Prerequisites:
-- Selecting **Reopen epic**.
+- You must have at least the Reporter role for the epic's group.
+
+To do so, either:
+
+- Select **Reopen epic**.
![reopen epic - button](img/button_reopen_epic.png)
-- Using the `/reopen` [quick action](../../project/quick_actions.md).
+- Use the `/reopen` [quick action](../../project/quick_actions.md).
## Go to an epic from an issue
@@ -144,6 +167,13 @@ In a group, the left sidebar displays the total count of open epics.
This number indicates all epics associated with the group and its subgroups, including epics you
might not have permission to view.
+Prerequisites:
+
+- You must be a member of either:
+ - The group
+ - A project in the group
+ - A project in one of the group's subgroups
+
To view epics in a group:
1. On the top bar, select **Menu > Groups** and find your group.
@@ -225,6 +255,10 @@ and confidential child epics. However, merge requests are public, if created in
Read [Merge requests for confidential issues](../../project/merge_requests/confidential.md)
to learn how to create a confidential merge request.
+Prerequisites:
+
+- You must have at least the Reporter role for the epic's group.
+
To make an epic confidential:
- **When creating an epic:** select the checkbox under **Confidentiality**.
@@ -236,6 +270,15 @@ To make an epic confidential:
This section collects instructions for all the things you can do with [issues](../../project/issues/index.md)
in relation to epics.
+### View issues assigned to an epic
+
+On the **Epics and Issues** tab, you can see epics and issues assigned to this epic.
+Only epics and issues that you can access show on the list.
+
+You can always view the issues assigned to the epic if they are in the group's child project.
+It's possible because the visibility setting of a project must be the same as or less restrictive than
+of its parent group.
+
### View count of issues in an epic
On the **Epics and Issues** tab, under each epic name, hover over the total counts.
@@ -258,7 +301,12 @@ An epic contains a list of issues and an issue can be associated with at most on
When you add a new issue that's already linked to an epic, the issue is automatically unlinked from its
current parent.
-To add a new issue to an epic:
+Prerequisites:
+
+- You must have at least the Reporter role for the epic's group.
+- You must be able to [edit the issue](../../project/issues/managing_issues.md#edit-an-issue).
+
+To add an existing issue to an epic:
1. On the epic's page, under **Epics and Issues**, select **Add**.
1. Select **Add an existing issue**.
@@ -277,19 +325,30 @@ To add a new issue to an epic:
Creating an issue from an epic enables you to maintain focus on the broader context of the epic
while dividing work into smaller parts.
+Prerequisites:
+
+- You must have at least the Reporter role for the epic's group.
+
To create an issue from an epic:
1. On the epic's page, under **Epics and Issues**, select **Add**.
1. Select **Add a new issue**.
1. Under **Title**, enter the title for the new issue.
-1. From the **Project** dropdown, select the project in which the issue should be created.
+1. From the **Project** dropdown list, select the project in which the issue should be created.
1. Select **Create issue**.
+The new issue is assigned to the epic.
+
### Remove an issue from an epic
You can remove issues from an epic when you're on the epic's details page.
After you remove an issue from an epic, the issue is no longer associated with this epic.
+Prerequisites:
+
+- You must have at least the Reporter role for the epic's group.
+- You must be able to [edit the issue](../../project/issues/managing_issues.md#edit-an-issue).
+
To remove an issue from an epic:
1. Next to the issue you want to remove, select **Remove** (**{close}**).
@@ -305,6 +364,10 @@ To remove an issue from an epic:
New issues appear at the top of the list in the **Epics and Issues** tab.
You can reorder the list of issues by dragging them.
+Prerequisites:
+
+- You must have at least the Reporter role for the epic's group.
+
To reorder issues assigned to an epic:
1. Go to the **Epics and Issues** tab.
@@ -317,32 +380,47 @@ To reorder issues assigned to an epic:
New issues appear at the top of the list in the **Epics and Issues**
tab. You can move issues from one epic to another.
+Prerequisites:
+
+- You must have at least the Reporter role for the epic's group.
+- You must be able to [edit the issue](../../project/issues/managing_issues.md#edit-an-issue).
+
To move an issue to another epic:
1. Go to the **Epics and Issues** tab.
-1. Drag issues into the desired parent epic.
+1. Drag issues into the desired parent epic in the visible hierarchy.
### Promote an issue to an epic
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3777) in GitLab 11.6.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/37081) from GitLab Ultimate to GitLab Premium in 12.8.
-If you have the necessary [permissions](../../permissions.md) to close an issue and create an
-epic in the immediate parent group, you can promote an issue to an epic with the `/promote`
+Prerequisites:
+
+- The project to which the issue belongs must be in a group.
+- You must have at least the Reporter role the project's immediate parent group.
+- You must either:
+ - Have at least the Reporter role for the project.
+ - Be the author of the issue.
+ - Be assigned to the issue.
+
+You can promote an issue to an epic with the `/promote`
[quick action](../../project/quick_actions.md#issues-merge-requests-and-epics).
-Only issues from projects that are in groups can be promoted. When you attempt to promote a confidential
-issue, a warning is displayed. Promoting a confidential issue to an epic makes all information
+
+NOTE:
+Promoting a confidential issue to an epic makes all information
related to the issue public as epics are public to group members.
When an issue is promoted to an epic:
+- If the issue was confidential, an additional warning is displayed first.
- An epic is created in the same group as the project of the issue.
- Subscribers of the issue are notified that the epic was created.
The following issue metadata is copied to the epic:
- Title, description, activity/comment thread.
-- Upvotes/downvotes.
+- Upvotes and downvotes.
- Participants.
- Group labels that the issue already has.
- Parent epic.
@@ -367,6 +445,10 @@ Epics can contain multiple nested child epics, up to a total of seven levels dee
### Add a child epic to an epic
+Prerequisites:
+
+- You must have at least the Reporter role for the parent epic's group.
+
To add a child epic to an epic:
1. Select **Add**.
@@ -388,6 +470,10 @@ You can move child epics from one epic to another.
When you add a new epic that's already linked to a parent epic, the link to its current parent is removed.
Issues and child epics cannot be intermingled.
+Prerequisites:
+
+- You must have at least the Reporter role for the parent epic's group.
+
To move child epics to another epic:
1. Go to the **Epics and Issues** tab.
@@ -400,6 +486,10 @@ To move child epics to another epic:
New child epics appear at the top of the list in the **Epics and Issues** tab.
You can reorder the list of child epics.
+Prerequisites:
+
+- You must have at least the Reporter role for the parent epic's group.
+
To reorder child epics assigned to an epic:
1. Go to the **Epics and Issues** tab.
@@ -407,6 +497,10 @@ To reorder child epics assigned to an epic:
### Remove a child epic from a parent epic
+Prerequisites:
+
+- You must have at least the Reporter role for the parent epic's group.
+
To remove a child epic from a parent epic:
1. Select **Remove** (**{close}**) in the parent epic's list of epics.
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index 0c16b535ed1..0185cb9cfdf 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -138,9 +138,9 @@ migrated:
In a [rails console session](../../../administration/operations/rails_console.md#starting-a-rails-console-session),
you can find the failure or error messages for the group import attempt using:
-```shell
+```ruby
# Get relevant import records
-import = BulkImports::Entity.where(namespace_id: Group.id).bulk_import
+import = BulkImports::Entity.where(namespace_id: Group.id).map(&:bulk_import)
# Alternative lookup by user
import = BulkImport.where(user_id: User.find(...)).last
@@ -154,3 +154,18 @@ entities.map(&:failures).flatten
# Alternative failure lookup by status
entities.where(status: [-1]).pluck(:destination_name, :destination_namespace, :status)
```
+
+### Stale imports
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352985) in GitLab 14.10.
+
+When troubleshooting group migration, an import may not complete because the import workers took
+longer than 8 hours to execute. In this case, the `status` of either a `BulkImport` or
+`BulkImport::Entity` is `3` (`timeout`):
+
+```ruby
+# Get relevant import records
+import = BulkImports::Entity.where(namespace_id: Group.id).map(&:bulk_import)
+
+import.status #=> 3 means that the import timed out.
+```
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 4b9ff7f64e8..085cd054c14 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -1,7 +1,6 @@
---
-type: reference, howto
stage: Manage
-group: Authentication and Authorization
+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
---
@@ -68,7 +67,7 @@ To create a group:
1. Enter a name for the group in **Group name**. For a list of words that cannot be used as group names, see
[reserved names](../reserved_names.md).
1. Enter a path for the group in **Group URL**, which is used for the [namespace](#namespaces).
-1. Choose the [visibility level](../../public_access/public_access.md).
+1. Choose the [visibility level](../public_access.md).
1. Personalize your GitLab experience by answering the following questions:
- What is your role?
- Who will be using this group?
@@ -279,8 +278,8 @@ To view the activity feed in Atom format, select the
[Feature flag `invite_members_group_modal`](https://gitlab.com/gitlab-org/gitlab/-/issues/352526) removed.
Similar to how you [share a project with a group](../project/members/share_project_with_groups.md),
-you can share a group with another group. Members get direct access
-to the shared group. This includes members who inherited group membership from a parent group.
+you can share a group with another group. To invite a group, you must be a member of it. Members get direct access
+to the shared group. This includes members who inherited group membership from a parent group.
To share a given group, for example, `Frontend` with another group, for example,
`Engineering`:
@@ -289,10 +288,14 @@ To share a given group, for example, `Frontend` with another group, for example,
1. On the left sidebar, select **Group information > Members**.
1. Select **Invite a group**.
1. In the **Select a group to invite** list, select `Engineering`.
-1. Select a [role](../permissions.md).
+1. Select a [role](../permissions.md) as maximum access level.
1. Select **Invite**.
-All the members of the `Engineering` group are added to the `Frontend` group.
+After sharing the `Frontend` group with the `Engineering` group:
+
+- The **Groups** tab lists the `Engineering` group.
+- The **Groups** tab lists a group regardless of whether it is a public or private group.
+- All members of the `Engineering` group have access to the `Frontend` group. The same access levels of the members apply up to the maximum access level selected when sharing the group.
## Manage group memberships via LDAP **(PREMIUM SELF)**
@@ -793,23 +796,25 @@ 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)**
+## Group approval settings **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285458) in GitLab 13.9. [Deployed behind the `group_merge_request_approval_settings_feature_flag` flag](../../administration/feature_flags.md), disabled by default.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/285410) in GitLab 14.5.
> - [Feature flag `group_merge_request_approval_settings_feature_flag`](https://gitlab.com/gitlab-org/gitlab/-/issues/343872) removed in GitLab 14.9.
-Group approval rules manage [project merge request approval rules](../project/merge_requests/approvals/index.md)
-at the top-level group level. These rules [cascade to all projects](../project/merge_requests/approvals/settings.md#settings-cascading)
+Group approval settings manage [project merge request approval settings](../project/merge_requests/approvals/settings.md)
+at the top-level group level. These settings [cascade to all projects](../project/merge_requests/approvals/settings.md#settings-cascading)
that belong to the group.
-To view the merge request approval rules for a group:
+To view the merge request approval settings 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**.
+Support for group-level settings for merge request approval rules is tracked in this [epic](https://gitlab.com/groups/gitlab-org/-/epics/4367).
+
## Related topics
- [Group wikis](../project/wiki/index.md)
diff --git a/doc/user/group/iterations/index.md b/doc/user/group/iterations/index.md
index b5912a0b40e..1c316f2157d 100644
--- a/doc/user/group/iterations/index.md
+++ b/doc/user/group/iterations/index.md
@@ -12,6 +12,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - Moved to GitLab Premium in 13.9.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/221047) in GitLab 14.6. [Feature flag `group_iterations`](https://gitlab.com/gitlab-org/gitlab/-/issues/221047) removed.
+WARNING:
+After [Iteration Cadences](#iteration-cadences) becomes generally available,
+manual iteration scheduling will be [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069) in GitLab 15.6.
+To enhance the role of iterations as time boundaries, we will also deprecate the title field.
+
Iterations are a way to track issues over a period of time. This allows teams
to track velocity and volatility metrics. Iterations can be used with [milestones](../../project/milestones/index.md)
for tracking over different time periods.
@@ -28,54 +33,6 @@ In GitLab, iterations are similar to milestones, with a few differences:
- Iterations require both a start and an end date.
- Iteration date ranges cannot overlap.
-## Iteration cadences
-
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5077) in GitLab 14.1.
-> - 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](#enable-or-disable-iteration-cadences).
-
-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.
-
-Iteration cadences automate some common iteration tasks. They can be used to
-automatically create iterations every 1, 2, 3, 4, or 6 weeks. They can also
-be configured to automatically roll over incomplete issues to the next iteration.
-
-With iteration cadences enabled, you must first
-[create an iteration cadence](#create-an-iteration-cadence) before you can
-[create an iteration](#create-an-iteration).
-
-### Create an iteration cadence
-
-Prerequisites:
-
-- You must have at least the Developer role for a group.
-
-To create an iteration cadence:
-
-1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Issues > Iterations**.
-1. Select **New iteration cadence**.
-1. Fill out required fields, and select **Create iteration cadence**. The cadence list page opens.
-
-### Delete an iteration cadence
-
-Prerequisites:
-
-- You must have at least the Developer role for a group.
-
-Deleting an iteration cadence also deletes all iterations within that cadence.
-
-To delete an iteration cadence:
-
-1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Issues > Iterations**.
-1. Select the three-dot menu (**{ellipsis_v}**) > **Delete cadence** for the cadence you want to delete.
-1. Select **Delete cadence** in the confirmation modal.
-
## View the iterations list
To view the iterations list, go to **{issues}** **Issues > Iterations**.
@@ -84,12 +41,16 @@ From there you can create a new iteration or select an iteration to get a more d
## Create an iteration
+> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069) in GitLab 14.10.
+
+WARNING:
+Manual iteration management is in its end-of-life process. Creating an iteration is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069)
+in GitLab 14.10, and is planned for removal in GitLab 16.0.
+
Prerequisites:
- You must have at least the Developer role for a group.
-For manually scheduled iteration cadences, you create and add iterations yourself.
-
To create an iteration:
1. On the top bar, select **Menu > Groups** and find your group.
@@ -100,7 +61,13 @@ To create an iteration:
## Edit an iteration
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218277) in GitLab 13.2.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218277) in GitLab 13.2.
+> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069) in GitLab 14.10.
+
+WARNING:
+Editing all attributes, with the exception of `description` is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069)
+in GitLab 14.10, and is planned for removal in GitLab 16.0.
+In the future only editing an iteration's `description` will be allowed.
Prerequisites:
@@ -110,7 +77,12 @@ To edit an iteration, select the three-dot menu (**{ellipsis_v}**) > **Edit**.
## Delete an iteration
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292268) in GitLab 14.3.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292268) in GitLab 14.3.
+> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069) in GitLab 14.10.
+
+WARNING:
+Manual iteration management is in its end-of-life process. Deleting an iteration is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069)
+in GitLab 14.10, and is planned for removal in GitLab 16.0.
Prerequisites:
@@ -136,7 +108,7 @@ The report also shows a breakdown of total issues in an iteration.
Open iteration reports show a summary of completed, unstarted, and in-progress issues.
Closed iteration reports show the total number of issues completed by the due date.
-To view an iteration report, go to the iterations list page and select an iteration's title.
+To view an iteration report, go to the iterations list page and select an iteration's period.
### Iteration burndown and burnup charts
@@ -195,33 +167,61 @@ To group issues by label:
You can also search for labels by typing in the search input.
1. Select any area outside the label dropdown list. The page is now grouped by the selected labels.
-### Enable or disable iteration cadences **(PREMIUM SELF)**
+## Iteration cadences
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5077) in GitLab 14.1.
+> - Deployed behind a [feature flag](../../feature_flags.md), named `iteration_cadences`, disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an
+administrator to [enable the feature flag](../../../administration/feature_flags.md) named
+`iteration_cadences` for a root group.
+On GitLab.com, this feature is not available. This feature is not ready for production use.
+
+Iteration cadences automate iteration scheduling. You can use them to
+automate creating iterations every 1, 2, 3, 4, or 6 weeks. You can also
+configure iteration cadences to automatically roll over incomplete issues to the next iteration.
+
+### Create an iteration cadence
+
+Prerequisites:
+
+- You must have at least the Developer role for a group.
+
+To create an iteration cadence:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Issues > Iterations**.
+1. Select **New iteration cadence**.
+1. Fill out required fields, and select **Create iteration cadence**. The cadence list page opens.
+
+### Delete an iteration cadence
+
+Prerequisites:
+
+- You must have at least the Developer role for a group.
-Iteration Cadences feature 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.
+Deleting an iteration cadence also deletes all iterations within that cadence.
-To enable it:
+To delete an iteration cadence:
-```ruby
-Feature.enable(:iteration_cadences)
-```
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Issues > Iterations**.
+1. Select the three-dot menu (**{ellipsis_v}**) > **Delete cadence** for the cadence you want to delete.
+1. Select **Delete cadence** in the confirmation modal.
-To disable it:
+### Convert manual cadence to use automatic scheduling
-```ruby
-Feature.disable(:iteration_cadences)
-```
+WARNING:
+The upgrade is irreversible. After it's done, manual iteration cadences cannot be created.
-<!-- ## Troubleshooting
+When you **enable** the iteration cadences feature, all iterations are added
+to a default iteration cadence.
+In this default iteration cadence, you can continue to add, edit, and remove iterations.
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
+To upgrade the iteration cadence to use the automation features:
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Issues > Iterations**.
+1. Select the three-dot menu (**{ellipsis_v}**) > **Edit cadence** for the cadence you want to upgrade.
+1. Fill out required fields, and select **Save changes**.
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index 8ebcd9f62d0..4d122e337db 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -23,12 +23,14 @@ If required, you can find [a glossary of common terms](../../../integration/saml
## Configure your identity provider
-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).
+1. Find the information in GitLab required for configuration:
+ 1. On the top bar, select **Menu > Groups** and find your group.
+ 1. On the left sidebar, select **Settings > SAML SSO**.
+ 1. Note the **Assertion consumer service URL**, **Identifier**, and **GitLab single sign-on URL**.
+1. Configure your SAML identity provider app using the noted details.
+ Alternatively, GitLab provides a [metadata XML configuration](#metadata-configuration).
See [specific identity provider documentation](#providers) for more details.
-1. Configure the SAML response to include a NameID that uniquely identifies each user.
+1. Configure the SAML response to include a [NameID](#nameid) that uniquely identifies each user.
1. Configure the required [user attributes](#user-attributes), ensuring you include the user's email address.
1. While the default is enabled for most SAML providers, please ensure the app is set to have service provider
initiated calls in order to link existing GitLab accounts.
@@ -245,7 +247,7 @@ To migrate users to a new email domain, users must:
## User access and management
-> [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/268142) in GitLab 13.7.
+> SAML user provisioning [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/268142) in GitLab 13.7.
Once Group SSO is configured and enabled, users can access the GitLab.com group through the identity provider's dashboard. If [SCIM](scim_setup.md) is configured, please see the [user access and linking setup section on the SCIM page](scim_setup.md#user-access-and-linking-setup).
diff --git a/doc/user/group/saml_sso/scim_setup.md b/doc/user/group/saml_sso/scim_setup.md
index 331288e33a1..3960c97142e 100644
--- a/doc/user/group/saml_sso/scim_setup.md
+++ b/doc/user/group/saml_sso/scim_setup.md
@@ -20,7 +20,7 @@ The GitLab [SCIM API](../../../api/scim.md) implements part of [the RFC7644 prot
The following actions are available:
- Create users
-- Deactivate users
+- Remove users (deactivate SCIM identity)
The following identity providers are supported:
@@ -133,7 +133,7 @@ After the above steps are complete:
The Okta GitLab application currently only supports SCIM. Continue
using the separate Okta [SAML SSO](index.md) configuration along with the new SCIM
-application described above.
+application described above. An [issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/216173) to add SAML support to the Okta GitLab application.
### OneLogin
@@ -150,7 +150,7 @@ The following diagram is a general outline on what happens when you add users to
```mermaid
graph TD
- A[Add User to SCIM app] -->|IdP sends user info to GitLab| B(GitLab: Does the email exists?)
+ A[Add User to SCIM app] -->|IdP sends user info to GitLab| B(GitLab: Does the email exist?)
B -->|No| C[GitLab creates user with SCIM identity]
B -->|Yes| D[GitLab sends message back 'Email exists']
```
diff --git a/doc/user/group/settings/group_access_tokens.md b/doc/user/group/settings/group_access_tokens.md
index 6b20f1763d4..0666303bcf8 100644
--- a/doc/user/group/settings/group_access_tokens.md
+++ b/doc/user/group/settings/group_access_tokens.md
@@ -16,14 +16,17 @@ You can use a group access token to authenticate:
- With the [GitLab API](../../../api/index.md#personalprojectgroup-access-tokens).
- In [GitLab 14.2](https://gitlab.com/gitlab-org/gitlab/-/issues/330718) and later, authenticate with Git over HTTPS.
+ Use:
-After you configure a group access token, you don't need a password when you authenticate.
-Instead, you can enter any non-blank value.
+ - Any non-blank value as a username.
+ - The group access token as the password.
Group access tokens are similar to [project access tokens](../../project/settings/project_access_tokens.md)
and [personal access tokens](../../profile/personal_access_tokens.md), except they are
associated with a group rather than a project or user.
+In self-managed instances, group access tokens are subject to the same [maximum lifetime limits](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens) as personal access tokens if the limit is set.
+
You can use group access tokens:
- On GitLab SaaS if you have the Premium license tier or higher. Group access tokens are not available with a [trial license](https://about.gitlab.com/free-trial/).
@@ -33,6 +36,8 @@ You can use group access tokens:
- Consider [disabling group access tokens](#enable-or-disable-group-access-token-creation) to
lower potential abuse.
+You cannot use group access tokens to create other access tokens.
+
Group access tokens inherit the [default prefix setting](../../admin_area/settings/account_and_limit_settings.md#personal-access-token-prefix)
configured for personal access tokens.
@@ -45,7 +50,7 @@ To create a group access token:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Settings > Access Tokens**.
1. Enter a name. The token name is visible to any user with permissions to view the group.
-1. Optional. Enter an expiry date for the token. The token will expire on that date at midnight UTC.
+1. Optional. Enter an expiry date for the token. The token will expire on that date at midnight UTC. An instance-wide [maximum lifetime](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens) setting can limit the maximum allowable lifetime in self-managed instances.
1. Select a role for the token.
1. Select the [desired scopes](#scopes-for-a-group-access-token).
1. Select **Create group access token**.
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index a98f213bb3f..2cddbaa9723 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Authentication and Authorization
+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
---
@@ -49,9 +49,16 @@ graph TD
## Create a subgroup
-Users with the at least the Maintainer role on a group can create subgroups immediately below the group, unless
-[configured otherwise](#change-who-can-create-subgroups). These users can create subgroups even if group creation is
-[disabled by an Administrator](../../admin_area/index.md#prevent-a-user-from-creating-groups) in the user's settings.
+Prerequisites:
+
+- You must either:
+ - Have at least the Maintainer role for a group to create subgroups for it.
+ - Have the [role determined by a setting](#change-who-can-create-subgroups). These users can create
+ subgroups even if group creation is
+ [disabled by an Administrator](../../admin_area/index.md#prevent-a-user-from-creating-groups) in the user's settings.
+
+NOTE:
+You cannot host a GitLab Pages subgroup website with a top-level domain name. For example, `subgroupname.example.io`.
To create a subgroup:
diff --git a/doc/user/group/value_stream_analytics/img/vsa_aggregated_data_toggle_v14_9.png b/doc/user/group/value_stream_analytics/img/vsa_aggregated_data_toggle_v14_9.png
new file mode 100644
index 00000000000..5ad8026b8fd
--- /dev/null
+++ b/doc/user/group/value_stream_analytics/img/vsa_aggregated_data_toggle_v14_9.png
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_12.png b/doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_12.png
deleted file mode 100644
index 834556df051..00000000000
--- a/doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_12.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_overview_stage_v13_11.png b/doc/user/group/value_stream_analytics/img/vsa_overview_stage_v13_11.png
deleted file mode 100644
index 8d77c53db7f..00000000000
--- a/doc/user/group/value_stream_analytics/img/vsa_overview_stage_v13_11.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_path_nav_v13_11.png b/doc/user/group/value_stream_analytics/img/vsa_path_nav_v13_11.png
deleted file mode 100644
index 5dd79d06463..00000000000
--- a/doc/user/group/value_stream_analytics/img/vsa_path_nav_v13_11.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_stage_table_v14_7.png b/doc/user/group/value_stream_analytics/img/vsa_stage_table_v14_7.png
deleted file mode 100644
index 7c3305792bb..00000000000
--- a/doc/user/group/value_stream_analytics/img/vsa_stage_table_v14_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_time_metrics_v13_12.png b/doc/user/group/value_stream_analytics/img/vsa_time_metrics_v13_12.png
deleted file mode 100644
index 68d9741bed8..00000000000
--- a/doc/user/group/value_stream_analytics/img/vsa_time_metrics_v13_12.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index 5ea8512ed5a..3fce9baa9ce 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -16,6 +16,7 @@ Use value stream analytics to identify:
- The amount of time it takes to go from an idea to production.
- The velocity of a given project.
- Bottlenecks in the development process.
+- Detecting long-running issues or merge requests.
- Factors that cause your software development lifecycle to slow down.
Value stream analytics is also available for [projects](../../analytics/value_stream_analytics.md).
@@ -26,7 +27,10 @@ Value stream analytics is also available for [projects](../../analytics/value_st
> - Filtering [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13216) in GitLab 13.3
> - Horizontal stage path [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12196) in 13.0 and [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323982) in 13.12
-You must have at least the Reporter role to view value stream analytics for groups.
+Prerequisite:
+
+- You must have at least the Reporter role to view value stream analytics for groups.
+- You must create a [custom value stream](#custom-value-streams). Value stream analytics only shows custom value streams created for your group.
To view value stream analytics for your group:
@@ -37,6 +41,9 @@ To view value stream analytics for your group:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
+ 1. Select whether to view metrics for items with a start or stop event:
+ - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
+ - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date. The charts and list show workflow items created
@@ -71,6 +78,9 @@ To view the median time spent in each stage by a group:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
+ 1. Select whether to view metrics for items with a start or stop event:
+ - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
+ - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
@@ -91,6 +101,9 @@ To view the lead time and cycle time for issues:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
+ 1. Select whether to view metrics for items with a start or stop event:
+ - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
+ - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
@@ -111,6 +124,9 @@ To view the lead time for changes for merge requests in your group:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
+ 1. Select whether to view metrics for items with a start or stop event:
+ - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
+ - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
@@ -125,7 +141,7 @@ To view deployment metrics, you must have a
[production environment configured](../../../ci/environments/index.md#deployment-tier-of-environments).
Value stream analytics shows the following deployment metrics for your group:
-
+
- Deploys: The number of successful deployments in the date range.
- Deployment Frequency: The average number of successful deployments per day in the date range.
@@ -137,6 +153,9 @@ To view deployment metrics for your group:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
+ 1. Select whether to view metrics for items with a start or stop event:
+ - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
+ - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
@@ -150,25 +169,24 @@ NOTE:
In GitLab 13.9 and later, metrics are calculated based on when the deployment was finished.
In GitLab 13.8 and earlier, metrics are calculated based on when the deployment was created.
-## Upcoming date filter change
+### How value stream analytics aggregates data
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335391) in GitLab 14.5 [with a flag](../../../administration/feature_flags.md) named `use_vsa_aggregated_tables`. Disabled by default.
+> - Filter by stop date toggle [added](https://gitlab.com/gitlab-org/gitlab/-/issues/352428) in GitLab 14.9
+> - Data refresh badge [added](https://gitlab.com/gitlab-org/gitlab/-/issues/341739) in GitLab 14.9
+
+Plans for value stream analytics to filter items by stop event instead of start event are tracked in this [epic](https://gitlab.com/groups/gitlab-org/-/epics/6046). With the completion of this work, value stream analytics will only display items with a stop event in the date range.
-In the [epics](https://gitlab.com/groups/gitlab-org/-/epics/6046), we plan to alter
-the date filter behavior to filter the end event time of the currently selected stage.
+To preview this functionality, you can use the **Filter by stop date** toggle to enable or disable this filter until the [default filtering mode is introduced](../../../update/deprecations.md#value-stream-analytics-filtering-calculation-change) and the toggle is removed.
-The change makes it possible to get a much better picture about the completed items within the
-stage and helps uncover long-running items.
+If you turn on the **Filter by stop date** toggle, the results show items with a stop event within the date range. When this function is enabled, it may take up to 10 minutes for results to show due to data aggregation. There are occasions when it may take longer than 10 minutes for results to display:
-For example, an issue was created a year ago and the current stage was finished in the current month.
-If you were to look at the metrics for the last three months, this issue would not be included in the calculation of
-the stage metrics. With the new date filter, this item would be included.
+- If this is the first time you are viewing value stream analytics and have not yet [created a value stream](#create-a-value-stream).
+- If the group hierarchy has been re-arranged.
+- If there have been bulk updates on issues and merge requests.
-DISCLAIMER:
-This section 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.
+To view when the data was most recently updated, in the right corner next to **Edit**, hover over the **Last updated** badge. This badge is only available if you have turned on the **Filter by start date** toggle.
+![Aggregated data toggle](img/vsa_aggregated_data_toggle_v14_9.png "Aggregated data toggle")
## How value stream analytics measures stages
@@ -177,7 +195,10 @@ Value stream analytics measures each stage from its start event to its end event
For example, a stage might start when a user adds a label to an issue, and ends when they add another label.
Items aren't included in the stage time calculation if they have not reached the end event.
-Each stage of value stream analytics is further described in the table below.
+Value stream analytics allows you to customize your stages based on pre-defined events. To make the
+configuration easier, GitLab provides a pre-defined list of stages that can be used as a template
+
+Each pre-defined stages of value stream analytics is further described in the table below.
| Stage | Measurement method |
| ------- | -------------------- |
@@ -188,21 +209,21 @@ Each stage of value stream analytics is further described in the table below.
| Review | The median time taken to review a merge request that has a closing issue pattern, between its creation and until it's merged. |
| Staging | The median time between merging a merge request that has a closing issue pattern until the very first deployment to a [production environment](#how-value-stream-analytics-identifies-the-production-environment). If there isn't a production environment, this is not tracked. |
-## Example workflow
+### Example workflow
-This example shows a workflow through all seven stages in one day.
+This example shows a workflow through all seven stages in one day.
-If a stage does not include a start and a stop time, its data is not included in the median time.
+If a stage does not include a start and a stop time, its data is not included in the median time.
In this example, milestones have been created and CI/CD for testing and setting environments is configured.
- 09:00: Create issue. **Issue** stage starts.
-- 11:00: Add issue to a milestone, start work on the issue, and create a branch locally.
- **Issue** stage stops and **Plan** stage starts.
+- 11:00: Add issue to a milestone, start work on the issue, and create a branch locally.
+ **Issue** stage stops and **Plan** stage starts.
- 12:00: Make the first commit.
- 12:30: Make the second commit to the branch that mentions the issue number.
**Plan** stage stops and **Code** stage starts.
-- 14:00: Push branch and create a merge request that contains the
- [issue closing pattern](../../project/issues/managing_issues.md#closing-issues-automatically).
+- 14:00: Push branch and create a merge request that contains the
+ [issue closing pattern](../../project/issues/managing_issues.md#closing-issues-automatically).
**Code** stage stops and **Test** and **Review** stages start.
- GitLab CI/CD takes 5 minutes to run scripts defined in [`.gitlab-ci.yml`](../../../ci/yaml/index.md).
- 19:00: Merge the merge request. **Review** stage stops and **Staging** stage starts.
@@ -214,7 +235,7 @@ Value stream analytics records the following times for each stage:
- **Plan**: 11:00 to 12:00: 1 hr
- **Code**: 12:00 to 14:00: 2 hrs
- **Test**: 5 minutes
-- **Review**: 14:00 to 19:00: 5 hrs
+- **Review**: 14:00 to 19:00: 5 hrs
- **Staging**: 19:00 to 19:30: 30 minutes
There are some additional considerations for this example:
@@ -263,13 +284,16 @@ To create a 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. If this is the first time you are creating a value stream, select **Create custom value stream**. Otherwise, in the top right, select the dropdown list and then **Create new Value Stream**.
1. Enter a name for the new Value Stream.
- You can [customize the stages](#create-a-value-stream-with-stages).
1. Select **Create Value Stream**.
![New value stream](img/new_value_stream_v13_12.png "Creating a new value stream")
+NOTE:
+If you have recently upgraded to GitLab Premium, it can take up to 30 minutes for data to collect and display.
+
### Create a value stream with stages
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50229) in GitLab 13.7.
@@ -283,7 +307,7 @@ To create a value stream with stages:
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. If this is the first time you are creating a value stream, select **Create custom value stream**. Otherwise, in the top right, select the dropdown list and then **Create new Value Stream**.
1. Select either **Create from default template** or **Create from no template**.
- You can hide or re-order default stages in the value stream.
diff --git a/doc/user/index.md b/doc/user/index.md
index 4ce46c5b46f..af106b85ce9 100644
--- a/doc/user/index.md
+++ b/doc/user/index.md
@@ -2,253 +2,20 @@
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
-type: reference, index
-description: 'Read through the GitLab User documentation to learn how to use, configure, and customize GitLab and GitLab.com to your own needs.'
---
-# User Docs **(FREE)**
-
-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 administrator privileges to install, configure,
-and upgrade your GitLab instance.
-
-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).
-
-## Overview
-
-GitLab is a fully integrated software development platform that enables your team to be transparent, fast, effective, and cohesive from discussion on a new idea to production, all on the same platform.
-
-For more information, see [All GitLab Features](https://about.gitlab.com/features/).
-
-### Concepts
-
-To get familiar with the concepts needed to develop code on GitLab, read the following articles:
-
-- [Demo: Mastering Code Review With GitLab](https://about.gitlab.com/blog/2017/03/17/demo-mastering-code-review-with-gitlab/).
-- [What is GitLab Flow?](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/).
-- [Tutorial: It's all connected in GitLab](https://about.gitlab.com/blog/2016/03/08/gitlab-tutorial-its-all-connected/): an overview on code collaboration with GitLab.
-- [Trends in Version Control Land: Microservices](https://about.gitlab.com/blog/2016/08/16/trends-in-version-control-land-microservices/).
-- [Trends in Version Control Land: Innersourcing](https://about.gitlab.com/topics/version-control/what-is-innersource/).
-
-## Use cases
-
-GitLab is a Git-based platform that integrates a great number of essential tools for software development and deployment, and project management:
-
-- Hosting code in repositories with version control.
-- Tracking proposals for new implementations, bug reports, and feedback with a
- fully featured [Issue tracker](project/issues/index.md).
-- Organizing and prioritizing with [issue boards](project/issue_board.md).
-- Reviewing code in [merge requests](project/merge_requests/index.md) with live-preview changes per
- branch with [Review Apps](../ci/review_apps/index.md).
-- Building, testing, and deploying with built-in [Continuous Integration](../ci/index.md).
-- View the current health and status of each CI environment running on Kubernetes with [deploy boards](project/deploy_boards.md).
-- Leverage continuous delivery method with [Canary Deployments](project/canary_deployments.md).
-- Deploying personal and professional static websites with [GitLab Pages](project/pages/index.md).
-- Integrating with Docker by using [GitLab Container Registry](packages/container_registry/index.md).
-- Tracking the development lifecycle by using [GitLab Value Stream Analytics](analytics/value_stream_analytics.md).
-- Provide support with [Service Desk](project/service_desk.md).
-- [Export issues as CSV](project/issues/csv_export.md).
-
-With GitLab Enterprise Edition, you can also:
-
-- Improve collaboration with:
- - [Merge request approvals](project/merge_requests/approvals/index.md).
- - [Multiple Assignees for Issues](project/issues/multiple_assignees_for_issues.md).
- - [Multiple issue boards](project/issue_board.md#multiple-issue-boards).
-- Create formal relationships between issues with [linked issues](project/issues/related_issues.md).
-- 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/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.
-- Scan your code for vulnerabilities and [display them in merge requests](application_security/sast/index.md).
-
-You can also [integrate](project/integrations/overview.md) GitLab with numerous third-party applications, such as Mattermost, Microsoft Teams, Trello, Slack, Bamboo CI, Jira, and a lot more.
-
-## User types
-
-There are several types of users in GitLab:
-
-- Regular users.
-- [Internal users](../development/internal_users.md) often referred to as bot or system users.
-- [Auditor](permissions.md#auditor-users) with read access to self-managed instances.
-- [GitLab Administrator](../administration/index.md) with full access to
- self-managed instances including settings and the [Admin Area](admin_area/index.md).
-
-Each user can be a member in a [group](group/index.md).
-
-See the [permissions page](permissions.md) for details on how each user type is used.
-
-## User activity
-
-GitLab tracks user contribution activity.
-You can follow or unfollow other users from their [user profiles](profile/index.md#access-your-user-profile).
-To view a user's activity in a top-level Activity view:
-
-1. From a user's profile, select **Follow**.
-1. In the GitLab menu, select **Activity**.
-1. Select the **Followed users** tab.
-
-### User contribution events
-
-Each of these contribution events is tracked:
-
-- `approved`
- - Merge request
-- `closed`
- - [Epic](group/epics/index.md)
- - Issue
- - Merge request
- - Milestone
-- `commented` on any `Noteable` record.
- - Alert
- - Commit
- - Design
- - Issue
- - Merge request
- - Snippet
-- `created`
- - Design
- - [Epic](group/epics/index.md)
- - Issue
- - Merge request
- - Milestone
- - Project
- - Wiki page
-- `destroyed`
- - Design
- - Milestone
- - Wiki page
-- `expired`
- - Project membership
-- `joined`
- - Project membership
-- `left`
- - Project membership
-- `merged`
- - Merge request
-- `pushed` commits to (or deleted commits from) a repository, individually or in bulk.
- - Project
-- `reopened`
- - [Epic](group/epics/index.md)
- - Issue
- - Merge request
- - Milestone
-- `updated`
- - Design
- - Wiki page
-
-## Projects
-
-In GitLab, you can create [projects](project/index.md) to host
-your code, track issues, collaborate on code, and continuously
-build, test, and deploy your app with built-in GitLab CI/CD. Or, you can do
-it all at once, from one single project.
-
-- [Repositories](project/repository/index.md): Host your codebase in
- repositories with version control and as part of a fully integrated platform.
-- [Issues](project/issues/index.md): Explore the best of GitLab Issues' features.
-- [Merge requests](project/merge_requests/index.md): Collaborate on code,
- reviews, live preview changes per branch, and request approvals with merge requests.
-- [Milestones](project/milestones/index.md): Work on multiple issues and merge
- requests towards the same target date with Milestones.
-
-## Account
-
-There is a lot you can customize and configure to enjoy the best of GitLab.
-
-- [Settings](profile/index.md): Manage your user settings to change your personal information,
- personal access tokens, authorized applications, etc.
-- [Authentication](../topics/authentication/index.md): Read through the authentication
- methods available in GitLab.
-- [Permissions](permissions.md): Learn the different set of permissions levels for each
- user type (guest, reporter, developer, maintainer, owner).
-- [Feature highlight](feature_highlight.md): Learn more about the little blue dots
- around the app that explain certain features.
-- [Abuse reports](report_abuse.md): Report abuse from users to GitLab administrators.
-
-## Groups
-
-With GitLab [Groups](group/index.md) you can assemble related projects together
-and grant members access to several projects at once.
-
-Groups can also be nested in [subgroups](group/subgroups/index.md).
-
-## Discussions
-
-In GitLab, you can comment and mention collaborators in issues,
-merge requests, code snippets, and commits.
-
-When performing inline reviews to implementations
-to your codebase through merge requests you can
-gather feedback through [resolvable threads](discussions/index.md#resolve-a-thread).
-
-### GitLab Flavored Markdown (GFM)
-
-Read through the [GFM documentation](markdown.md) to learn how to apply
-the best of GitLab Flavored Markdown in your threads, comments,
-issues and merge requests descriptions, and everywhere else GFM is
-supported.
-
-## To-Do List
-
-Never forget to reply to your collaborators. [GitLab To-Do List](todos.md)
-is a tool for working faster and more effectively with your team,
-by listing all user or group mentions, as well as issues and merge
-requests you're assigned to.
-
-## Search
-
-[Search and filter](search/index.md) through groups, projects, issues, merge requests, files, code, and more.
-
-## Snippets
-
-[Snippets](snippets.md) are code blocks that you want to store in GitLab, from which
-you have quick access to. You can also gather feedback on them through [Discussions](#discussions).
-
-## GitLab CI/CD
-
-Use built-in [GitLab CI/CD](../ci/index.md) to test, build, and deploy your applications
-directly from GitLab. No third-party integrations needed.
-
-## Features behind feature flags
-
-Understand what [features behind feature flags](feature_flags.md) mean.
-
-## Keyboard shortcuts
-
-There are many [keyboard shortcuts](shortcuts.md) in GitLab to help you navigate between
-pages and accomplish tasks faster.
-
-## Integrations
-
-[Integrate GitLab](../integration/index.md) with your preferred tool, such as Trello, Jira, etc.
-
-## Webhooks
-
-Configure [webhooks](project/integrations/webhooks.md) to listen for
-specific events like pushes, issues or merge requests. GitLab sends a
-POST request with data to the webhook URL.
-
-## API
-
-Automate GitLab via [API](../api/index.md).
-
-## Git and GitLab
-
-Learn what is [Git](../topics/git/index.md) and its best practices.
-
-## Instance-level analytics
-
-See [various statistics](admin_area/analytics/index.md) of your GitLab instance.
-
-## Operations Dashboard
-
-See [Operations Dashboard](operations_dashboard/index.md) for a summary of each project's operational health.
+# Use GitLab **(FREE)**
+
+Get to know the GitLab end-to-end workflow. Configure permissions,
+organize your work, create and secure your application, and analyze its performance. Report on team productivity throughout the process.
+
+- [Set up your organization](../topics/set_up_organization.md)
+- [Organize work with projects](../user/project/index.md)
+- [Plan and track work](../topics/plan_and_track.md)
+- [Build your application](../topics/build_your_application.md)
+- [Secure your application](../user/application_security/index.md)
+- [Deploy and release your application](../topics/release_your_application.md)
+- [Monitor application performance](../operations/index.md)
+- [Monitor runner performance](https://docs.gitlab.com/runner/monitoring/index.html)
+- [Manage your infrastructure](../user/infrastructure/index.md)
+- [Analyze GitLab usage](../user/analytics/index.md)
diff --git a/doc/user/infrastructure/clusters/connect/new_eks_cluster.md b/doc/user/infrastructure/clusters/connect/new_eks_cluster.md
index 87b8f510289..50899053cad 100644
--- a/doc/user/infrastructure/clusters/connect/new_eks_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_eks_cluster.md
@@ -48,10 +48,13 @@ This project provides you with:
## Register the agent
+FLAG:
+In GitLab 14.10, a [flag](../../../../administration/feature_flags.md) named `certificate_based_clusters` changed the **Actions** menu to focus on the agent rather than certificates. The flag is [enabled on GitLab.com and self-managed](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
+
To create a GitLab agent for Kubernetes:
1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
-1. Select **Actions**.
+1. Select **Connect a cluster (agent)**.
1. From the **Select an agent** dropdown list, select `eks-agent` and select **Register an agent**.
1. GitLab generates a registration token for the agent. Securely store this secret token, as you will need it later.
1. GitLab provides an address for the agent server (KAS), which you will also need later.
diff --git a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
index 1ed8b0ef350..ab04187284d 100644
--- a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
@@ -6,6 +6,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Create a Google GKE cluster
+INFO:
+Every new Google Cloud Platform (GCP) account receives [$300 in credit](https://console.cloud.google.com/freetrial),
+and in partnership with Google, GitLab is able to offer an additional $200 for new
+GCP accounts to get started with the GitLab integration with Google Kubernetes Engine.
+[Follow this link](https://cloud.google.com/partners/partnercredit/?pcn_code=0014M00001h35gDQAQ#contact-form)
+and apply for credit.
+
Learn how to create a new cluster on Google Kubernetes Engine (GKE) through
[Infrastructure as Code (IaC)](../../index.md). This process uses the Google
and Kubernetes Terraform providers create GKE clusters. You connect the clusters to GitLab
@@ -48,10 +55,13 @@ with defaults for name, location, node count, and Kubernetes version.
## Register the agent
+FLAG:
+In GitLab 14.10, a [flag](../../../../administration/feature_flags.md) named `certificate_based_clusters` changed the **Actions** menu to focus on the agent rather than certificates. The flag is [enabled on GitLab.com and self-managed](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
+
To create a GitLab agent for Kubernetes:
1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
-1. Select **Actions**.
+1. Select **Connect a cluster (agent)**.
1. From the **Select an agent** dropdown list, select `gke-agent` and select **Register an agent**.
1. GitLab generates a registration token for the agent. Securely store this secret token, as you will need it later.
1. GitLab provides an address for the agent server (KAS), which you will also need later.
diff --git a/doc/user/infrastructure/clusters/deploy/inventory_object.md b/doc/user/infrastructure/clusters/deploy/inventory_object.md
index d76ef0b9359..d184d969ace 100644
--- a/doc/user/infrastructure/clusters/deploy/inventory_object.md
+++ b/doc/user/infrastructure/clusters/deploy/inventory_object.md
@@ -23,7 +23,7 @@ gitops:
default_namespace: my-ns
```
-The agent creates an inventory object for every item in the `manifest_projects` list.
+The agent creates an inventory object for every item in the `manifest_projects` list.
The inventory object is stored in the namespace you specify for `default_namespace`.
The name and location of the inventory object is based on:
@@ -58,7 +58,7 @@ This action changes the location of the object in the cluster.
inventory objects in the same namespace in the future.
1. Ensure the value for `cli-utils.sigs.k8s.io/inventory-id` is unique. This value is used for objects
tracked by this inventory object. Their `config.k8s.io/owning-inventory` annotation is set to this value.
-
+
The value doesn't have to match the `name` but it's convenient to set them to the same value.
1. Save the file with the manifest files as a single logical group.
diff --git a/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md b/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
index 01530422e4a..61ec0a559f0 100644
--- a/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
+++ b/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
@@ -18,7 +18,7 @@ in GitLab 14.5. It is expected to be
[turned off by default in 15.0](../../../update/deprecations.md#certificate-based-integration-with-kubernetes)
and removed in GitLab 15.6.
-If you are using the certificate-based integration, you should move to another workflow as soon as possible.
+If you are using the certificate-based integration, you should move to another workflow as soon as possible.
As a general rule, to migrate clusters that rely on GitLab CI/CD,
you can use the [CI/CD workflow](../../clusters/agent/ci_cd_tunnel.md).
@@ -60,7 +60,7 @@ To configure your Auto DevOps project to use the GitLab agent:
1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
1. From the certificate-based clusters section, open the cluster that serves the same environment scope.
1. Select the **Details** tab and disable the cluster.
-1. To activate the changes, on the left sidebar, select **CI/CD > Variables > Run pipeline**.
+1. To activate the changes, on the left sidebar, select **CI/CD > Pipelines** and then **Run pipeline**.
For an example, [view this project](https://gitlab.com/gitlab-examples/ops/gitops-demo/hello-world-service).
@@ -70,7 +70,11 @@ Follow the process for the [CI/CD workflow](../../clusters/agent/ci_cd_tunnel.md
## Migrate from GitLab Managed applications
-Follow the process to [migrate from GitLab Managed Apps to the cluster management project](../../clusters/migrating_from_gma_to_project_template.md).
+[GitLab Managed Apps (GMA)](../../clusters/applications.md#gitlab-managed-apps-deprecated) were deprecated in GitLab 14.0, and
+the agent for Kubernetes does not support them. To migrate from GMA to the agent, go through the following steps:
+
+1. [Migrate from GitLab Managed Apps to a cluster management project](../../clusters/migrating_from_gma_to_project_template.md).
+1. [Migrate the cluster management project to use the agent](../../clusters/management_project_template.md).
## Migrate a cluster management project
diff --git a/doc/user/infrastructure/iac/index.md b/doc/user/infrastructure/iac/index.md
index 3bc7495d4be..bc7a3c0d069 100644
--- a/doc/user/infrastructure/iac/index.md
+++ b/doc/user/infrastructure/iac/index.md
@@ -6,110 +6,121 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Infrastructure as Code with Terraform and GitLab **(FREE)**
-With Terraform in GitLab, you can use GitLab authentication and authorization with
-your GitOps and Infrastructure-as-Code (IaC) workflows.
-Use these features if you want to collaborate on Terraform code within GitLab or would like to use GitLab as a Terraform state storage that incorporates best practices out of the box.
+To manage your infrastructure with GitLab, you can use the integration with
+Terraform to define resources that you can version, reuse, and share:
+
+- Manage low-level components like compute, storage, and networking resources.
+- Manage high-level components like DNS entries and SaaS features.
+- Incorporate GitOps deployments and Infrastructure-as-Code (IaC) workflows.
+- Use GitLab as a Terraform state storage.
+- Store and use Terraform modules to simplify common and complex infrastructure patterns.
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> Watch [a video overview](https://www.youtube.com/watch?v=iGXjUrkkzDI) of the features GitLab provides with the integration with Terraform.
## Integrate your project with Terraform
> SAST test was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/6655) in GitLab 14.6.
-In GitLab 14.0 and later, to integrate your project with Terraform, add the following
-to your `.gitlab-ci.yml` file:
+The integration with GitLab and Terraform happens through GitLab CI/CD.
+Use an `include` attribute to add the Terraform template to your project and
+customize from there.
-```yaml
-include:
- - template: Terraform.latest.gitlab-ci.yml
+To get started, choose the template that best suits your needs:
-variables:
- # If you do not use the GitLab HTTP backend, remove this line and specify TF_HTTP_* variables
- TF_STATE_NAME: default
- TF_CACHE_KEY: default
- # If your terraform files are in a subdirectory, set TF_ROOT accordingly
- # TF_ROOT: terraform/production
-```
+- [Latest template](#latest-terraform-template)
+- [Stable template and advanced template](#stable-and-advanced-terraform-templates)
-The `Terraform.latest.gitlab-ci.yml` template:
+All templates:
-- Uses the latest [GitLab Terraform image](https://gitlab.com/gitlab-org/terraform-images).
-- Uses the [GitLab-managed Terraform state](#gitlab-managed-terraform-state) as
+- Use the [GitLab-managed Terraform state](#gitlab-managed-terraform-state) as
the Terraform state storage backend.
-- Creates [four pipeline stages](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml):
- `test`, `validate`, `build`, and `deploy`. These stages
- [run the Terraform commands](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml)
- `test`, `validate`, `plan`, `plan-json`, and `apply`. The `apply` command only runs on the default branch.
-- Runs the [Terraform SAST scanner](../../application_security/iac_scanning/index.md#configure-iac-scanning-manually),
- that you can disable by creating a `SAST_DISABLED` environment variable and setting it to `1`.
+- Trigger four pipeline stages: `test`, `validate`, `build`, and `deploy`.
+- Run Terraform commands: `test`, `validate`, `plan`, and `plan-json`. It also runs the `apply` only on the default branch.
+- Run the [Terraform SAST scanner](../../application_security/iac_scanning/index.md#configure-iac-scanning-manually).
-You can override the values in the default template by updating your `.gitlab-ci.yml` file.
+### Latest Terraform template
-The latest template might contain breaking changes between major GitLab releases.
-For a more stable template, we recommend:
+The [latest template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml)
+is compatible with the most recent GitLab version. It provides the most recent
+GitLab features, but can potentially include breaking changes.
-- [A ready-to-use version](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml)
-- [A base template for customized setups](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml)
+You can safely use the latest Terraform template:
-This video from January 2021 walks you through all the GitLab Terraform integration features:
+- If you use GitLab.com.
+- If you use a self-managed instance updated with every new GitLab release.
-<div class="video-fallback">
- See the video: <a href="https://www.youtube.com/watch?v=iGXjUrkkzDI">Terraform with GitLab</a>.
-</div>
-<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/iGXjUrkkzDI" frameborder="0" allowfullscreen="true"> </iframe>
-</figure>
+### Stable and advanced Terraform templates
-## GitLab-managed Terraform state
+If you use earlier versions of GitLab, you might face incompatibility errors
+between the GitLab version and the template version. In this case, you can opt
+to use one of these templates:
+
+- [The stable template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml) with an skeleton that you can built on top of.
+- [The advanced template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml) to fully customize your setup.
+
+### Use a Terraform template
+
+To use a Terraform template:
-[Terraform remote backends](https://www.terraform.io/language/settings/backends)
-enable you to store the state file in a remote, shared store. GitLab uses the
-[Terraform HTTP backend](https://www.terraform.io/language/settings/backends/http)
-to securely store the state files in local storage (the default) or
-[the remote store of your choice](../../../administration/terraform_state.md).
+1. On the top bar, select **Menu > Projects** and find the project you want to integrate with Terraform.
+1. On the left sidebar, select **Repository > Files**.
+1. Edit your `.gitlab-ci.yml` file, use the `include` attribute to fetch the Terraform template:
-The GitLab-managed Terraform state backend can store your Terraform state easily and
-securely. It spares you from setting up additional remote resources like
-Amazon S3 or Google Cloud Storage. Its features include:
+ ```yaml
+ include:
+ # To fetch the latest template, use:
+ - template: Terraform.latest.gitlab-ci.yml
+ # To fetch the stable template, use:
+ - template: Terraform/Base.gitlab-ci.yml
+ # To fetch the advanced template, use:
+ - template: Terraform/Base.latest.gitlab-ci.yml
+ ```
-- Supporting encryption of the state file both in transit and at rest.
-- Locking and unlocking state.
-- Remote Terraform plan and apply execution.
+1. Add the variables as described below:
-Read more about setting up and [using GitLab-managed Terraform states](terraform_state.md).
+ ```yaml
+ variables:
+ TF_STATE_NAME: default
+ TF_CACHE_KEY: default
+ # If your terraform files are in a subdirectory, set TF_ROOT accordingly. For example:
+ # TF_ROOT: terraform/production
+ ```
+
+1. (Optional) Override in your `.gitlab-ci.yaml` file the attributes present
+in the template you fetched to customize your configuration.
+
+## GitLab-managed Terraform state
+
+Use the [GitLab-managed Terraform state](terraform_state.md) to store state
+files in local storage or in a remote store of your choice.
## Terraform module registry
-GitLab can be used as a [Terraform module registry](../../packages/terraform_module_registry/index.md)
-to create and publish Terraform modules to a private registry specific to your
-top-level namespace.
+Use GitLab as a [Terraform module registry](../../packages/terraform_module_registry/index.md)
+to create and publish Terraform modules to a private registry.
## Terraform integration in merge requests
-Collaborating around Infrastructure as Code (IaC) changes requires both code changes
-and expected infrastructure changes to be checked and approved. GitLab provides a
-solution to help collaboration around Terraform code changes and their expected
-effects using the merge request pages. This way users don't have to build custom
-tools or rely on 3rd party solutions to streamline their IaC workflows.
-
-Read more on setting up and [using the merge request integrations](mr_integration.md).
+Use the [Terraform integration in merge requests](mr_integration.md)
+to collaborate on Terraform code changes and Infrastructure-as-Code
+workflows.
## The GitLab Terraform provider
-WARNING:
+NOTE:
The GitLab Terraform provider is released separately from GitLab.
-We are working on migrating the GitLab Terraform provider for GitLab.com.
-
-You can use the [GitLab Terraform provider](https://github.com/gitlabhq/terraform-provider-gitlab)
-to manage various aspects of GitLab using Terraform. The provider is an open source project,
-owned by GitLab, where everyone can contribute.
+We are working on migrating the GitLab Terraform provider to GitLab.com.
-The [documentation of the provider](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs)
-is available as part of the official Terraform provider documentation.
+The [GitLab Terraform provider](https://github.com/gitlabhq/terraform-provider-gitlab) is a plugin for Terraform to facilitate
+managing of GitLab resources such as users, groups, and projects.
+Its documentation is available on [Terraform](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs).
## Create a new cluster through IaC
- Learn how to [create a new cluster on Amazon Elastic Kubernetes Service (EKS)](../clusters/connect/new_eks_cluster.md).
- Learn how to [create a new cluster on Google Kubernetes Engine (GKE)](../clusters/connect/new_gke_cluster.md).
-## Troubleshooting
+## Related topics
-See the [troubleshooting](troubleshooting.md) documentation.
+- [Terraform images](https://gitlab.com/gitlab-org/terraform-images).
+- [Troubleshooting](troubleshooting.md) issues with GitLab and Terraform.
diff --git a/doc/user/infrastructure/iac/mr_integration.md b/doc/user/infrastructure/iac/mr_integration.md
index bcad5c9279a..0fea05a3f03 100644
--- a/doc/user/infrastructure/iac/mr_integration.md
+++ b/doc/user/infrastructure/iac/mr_integration.md
@@ -23,7 +23,7 @@ recommend encrypting plan output or modifying the project visibility settings.
## Configure Terraform report artifacts
-GitLab ships with a [pre-built CI template](index.md#integrate-your-project-with-terraform) that uses GitLab Managed Terraform state and integrates Terraform changes into merge requests. We recommend customizing the pre-built image and relying on the `gitlab-terraform` helper provided within for a quick setup.
+GitLab [integrates with Terraform](index.md#integrate-your-project-with-terraform) through CI/CD templates that use GitLab-managed Terraform state and display Terraform changes on merge requests. We recommend customizing the pre-built image and relying on the `gitlab-terraform` helper provided within for a quick setup.
To manually configure a GitLab Terraform Report artifact:
diff --git a/doc/user/infrastructure/iac/terraform_state.md b/doc/user/infrastructure/iac/terraform_state.md
index 39a57b60787..60f97f522cf 100644
--- a/doc/user/infrastructure/iac/terraform_state.md
+++ b/doc/user/infrastructure/iac/terraform_state.md
@@ -454,29 +454,6 @@ query ProjectTerraformStates {
For those new to the GitLab GraphQL API, read
[Getting started with GitLab GraphQL API](../../../api/graphql/getting_started.md).
-## Troubleshooting
+## Related topics
-### Unable to lock Terraform state files in CI jobs for `terraform apply` using a plan created in a previous job
-
-When passing `-backend-config=` to `terraform init`, Terraform persists these values inside the plan
-cache file. This includes the `password` value.
-
-As a result, to create a plan and later use the same plan in another CI job, you might get the error
-`Error: Error acquiring the state lock` errors when using `-backend-config=password=$CI_JOB_TOKEN`.
-This happens because the value of `$CI_JOB_TOKEN` is only valid for the duration of the current job.
-
-As a workaround, use [http backend configuration variables](https://www.terraform.io/docs/language/settings/backends/http.html#configuration-variables) in your CI job,
-which is what happens behind the scenes when following the
-[Get started using GitLab CI](#get-started-using-gitlab-ci) instructions.
-
-### Error: "address": required field is not set
-
-By default, we set `TF_ADDRESS` to `${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/${TF_STATE_NAME}`.
-If you don't set `TF_STATE_NAME` or `TF_ADDRESS` in your job, the job fails with the error message
-`Error: "address": required field is not set`.
-
-To resolve this, ensure that either `TF_ADDRESS` or `TF_STATE_NAME` is accessible in the
-job that returned the error:
-
-1. Configure the [CI/CD environment scope](../../../ci/variables/#add-a-cicd-variable-to-a-project) for the job.
-1. Set the job's [environment](../../../ci/yaml/#environment), matching the environment scope from the previous step.
+- [Troubleshooting GitLab-managed Terraform state](troubleshooting.md).
diff --git a/doc/user/infrastructure/iac/troubleshooting.md b/doc/user/infrastructure/iac/troubleshooting.md
index ecefa20db99..bc0aa39bc70 100644
--- a/doc/user/infrastructure/iac/troubleshooting.md
+++ b/doc/user/infrastructure/iac/troubleshooting.md
@@ -66,3 +66,30 @@ with better Terraform-specific names. To resolve the syntax error, you can:
my-Terraform-job:
extends: .terraform:init # The updated name.
```
+
+## Troubleshooting Terraform state
+
+### Unable to lock Terraform state files in CI jobs for `terraform apply` using a plan created in a previous job
+
+When passing `-backend-config=` to `terraform init`, Terraform persists these values inside the plan
+cache file. This includes the `password` value.
+
+As a result, to create a plan and later use the same plan in another CI job, you might get the error
+`Error: Error acquiring the state lock` errors when using `-backend-config=password=$CI_JOB_TOKEN`.
+This happens because the value of `$CI_JOB_TOKEN` is only valid for the duration of the current job.
+
+As a workaround, use [http backend configuration variables](https://www.terraform.io/docs/language/settings/backends/http.html#configuration-variables) in your CI job,
+which is what happens behind the scenes when following the
+[Get started using GitLab CI](terraform_state.md#get-started-using-gitlab-ci) instructions.
+
+### Error: "address": required field is not set
+
+By default, we set `TF_ADDRESS` to `${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/${TF_STATE_NAME}`.
+If you don't set `TF_STATE_NAME` or `TF_ADDRESS` in your job, the job fails with the error message
+`Error: "address": required field is not set`.
+
+To resolve this, ensure that either `TF_ADDRESS` or `TF_STATE_NAME` is accessible in the
+job that returned the error:
+
+1. Configure the [CI/CD environment scope](../../../ci/variables/#add-a-cicd-variable-to-a-project) for the job.
+1. Set the job's [environment](../../../ci/yaml/#environment), matching the environment scope from the previous step.
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index c81fdc275d9..fc2f1de5ce2 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -4,7 +4,9 @@ group: Source Code
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab Flavored Markdown **(FREE)**
+# GitLab Flavored Markdown (GLFM) **(FREE)**
+
+> The abbreviation [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/24592) from `GFM` to `GLFM` in GitLab 14.10.
GitLab automatically renders Markdown content. For example, when you add a comment to an issue,
you type the text in the Markdown language. When you save the issue, the text is rendered
@@ -525,6 +527,7 @@ GitLab Flavored Markdown recognizes the following:
| merge request | `!123` | `namespace/project!123` | `project!123` |
| snippet | `$123` | `namespace/project$123` | `project$123` |
| [epic](group/epics/index.md) | `&123` | `group1/subgroup&123` | |
+| [iteration](group/iterations/index.md) | `*iteration:"iteration title"`| | |
| [vulnerability](application_security/vulnerabilities/index.md) <sup>1</sup> | `[vulnerability:123]` | `[vulnerability:namespace/project/123]` | `[vulnerability:project/123]` |
| feature flag | `[feature_flag:123]` | `[feature_flag:namespace/project/123]` | `[feature_flag:project/123]` |
| label by ID | `~123` | `namespace/project~123` | `project~123` |
@@ -819,7 +822,8 @@ Regardless of the tag names, the relative order of the reference tags determines
numbering.
<!--
-Do not edit the following codeblock. It uses HTML to skip the Vale ReferenceLinks test.
+The following codeblock uses HTML to skip the Vale ReferenceLinks test.
+Do not change it back to a markdown codeblock.
-->
<pre class="highlight"><code>A footnote reference tag looks like this: [^1]
@@ -926,7 +930,8 @@ ___
Examples:
<!--
-Do not edit the following codeblock. It uses HTML to skip the Vale ReferenceLinks test.
+The following codeblock uses HTML to skip the Vale ReferenceLinks test.
+Do not change it back to a markdown codeblock.
-->
<pre class="highlight"><code>Inline-style (hover to see title text):
@@ -1192,17 +1197,18 @@ A new line due to the previous backslash.
You can create links two ways: inline-style and reference-style. For example:
<!--
-Do not edit the following codeblock. It uses HTML to skip the Vale ReferenceLinks test.
+The following codeblock uses HTML to skip the Vale ReferenceLinks test.
+Do not change it back to a markdown codeblock.
-->
<pre class="highlight"><code>- This line shows an [inline-style link](https://www.google.com)
-- This line shows a [link to a repository file in the same directory](index.md)
-- This line shows a [relative link to a readme one directory higher](../index.md)
+- This line shows a [link to a repository file in the same directory](permissions.md)
+- This line shows a [relative link to a file one directory higher](../index.md)
- This line shows a [link that also has title text](https://www.google.com "This link takes you to Google!")
Using header ID anchors:
-- This line links to [a section on a different Markdown page, using a "#" and the header ID](index.md#overview)
+- This line links to [a section on a different Markdown page, using a "#" and the header ID](permissions.md#project-features-permissions)
- This line links to [a different section on the same page, using a "#" and the header ID](#header-ids-and-links)
Using references:
@@ -1219,13 +1225,13 @@ Some text to show that the reference links can follow later.
</code></pre>
- This line shows an [inline-style link](https://www.google.com)
-- This line shows a [link to a repository file in the same directory](index.md)
-- This line shows a [relative link to a README one directory higher](../index.md)
+- This line shows a [link to a repository file in the same directory](permissions.md)
+- This line shows a [relative link to a file one directory higher](../index.md)
- This line shows a [link that also has title text](https://www.google.com "This link takes you to Google!")
Using header ID anchors:
-- This line links to [a section on a different Markdown page, using a "#" and the header ID](index.md#overview)
+- This line links to [a section on a different Markdown page, using a "#" and the header ID](permissions.md#project-features-permissions)
- This line links to [a different section on the same page, using a "#" and the header ID](#header-ids-and-links)
Using references:
@@ -1406,6 +1412,16 @@ while the equation for the theory of relativity is E = mc<sup>2</sup>.
<!-- vale gitlab.Spelling = YES -->
+### Keyboard HTML tag
+
+The `<kbd>` element is used to identify text that represents user keyboard input. Text surrounded by `<kbd>` tags is typically displayed in the browser's default monospace font.
+
+```html
+Press <kbd>Enter</kbd> to go to the next page.
+```
+
+Press <kbd>Enter</kbd> to go to the next page.
+
### Tables
Tables are not part of the core Markdown spec, but they are part of GitLab Flavored Markdown.
diff --git a/doc/user/packages/composer_repository/index.md b/doc/user/packages/composer_repository/index.md
index ea12b225717..901fb740717 100644
--- a/doc/user/packages/composer_repository/index.md
+++ b/doc/user/packages/composer_repository/index.md
@@ -171,6 +171,8 @@ When you publish:
## Install a Composer package
+> Authorization to [download a package archive](../../../api/packages/composer.md#download-a-package-archive) was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/331601) in GitLab 14.10.
+
Install a package from the Package Registry so you can use it as a dependency.
Prerequisites:
@@ -354,6 +356,8 @@ used to access them:
## Troubleshooting
+### Caching
+
To improve performance, Composer caches files related to a package. Note that Composer doesn't remove data by
itself. The cache grows as new packages are installed. If you encounter issues, clear the cache with
this command:
@@ -362,6 +366,14 @@ this command:
composer clearcache
```
+### Authorization requirement when using `composer install`
+
+In GitLab 14.9 and earlier, you did not require authorization to use `composer install` if you already had a generated `composer.lock`.
+If you committed your `composer.lock`, you could do a `composer install` in CI without setting up credentials.
+
+In GitLab 14.10 and later, authorization is required for the [downloading a package archive](../../../api/packages/composer.md#download-a-package-archive) endpoint.
+If you encounter a credentials prompt when you are using `composer install`, follow the instructions in the [install a composer package](#install-a-composer-package) section to create an `auth.json` file.
+
## Supported CLI commands
The GitLab Composer repository supports the following Composer CLI commands:
diff --git a/doc/user/packages/conan_repository/index.md b/doc/user/packages/conan_repository/index.md
index 731ba04a9f7..b3eadc13772 100644
--- a/doc/user/packages/conan_repository/index.md
+++ b/doc/user/packages/conan_repository/index.md
@@ -428,3 +428,25 @@ The GitLab Conan repository supports the following Conan CLI commands:
packages you have permission to view.
- `conan info`: View the information on a given package from the Package Registry.
- `conan remove`: Delete the package from the Package Registry.
+
+## Troubleshooting
+
+### Make output verbose
+
+For more verbose output when troubleshooting a Conan issue:
+
+```shell
+export CONAN_TRACE_FILE=/tmp/conan_trace.log # Or SET in windows
+conan <command>
+```
+
+You can find more logging tips in the [Conan documentation](https://docs.conan.io/en/latest/mastering/logging.html).
+
+### SSL Errors
+
+If you are using a self-signed certificate, there are two methods to manage SSL errors with Conan:
+
+- Use the `conan remote` command to disable the SSL verification.
+- Append your server `crt` file to the `cacert.pem` file.
+
+Read more about this in the [Conan Documentation](https://docs.conan.io/en/latest/howtos/use_tls_certificates.html).
diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md
index 5b6c71d4dd2..59bb4a89b0b 100644
--- a/doc/user/packages/container_registry/index.md
+++ b/doc/user/packages/container_registry/index.md
@@ -626,13 +626,18 @@ Use your own URLs to complete the following steps:
docker pull gitlab.example.com/org/build/sample_project/cr:v2.9.1
```
+NOTE:
+For container registry authentication, use either a
+[personal access token](../../profile/personal_access_tokens.md) or a
+[deploy token](../../project/deploy_tokens/index.md).
+
1. Rename the images to match the new project name:
```shell
docker tag gitlab.example.com/org/build/sample_project/cr:v2.9.1 gitlab.example.com/new_org/build/new_sample_project/cr:v2.9.1
```
-1. Delete the images in both projects by using the [UI](#delete-images) or [API](../../../api/packages.md#delete-a-project-package).
+1. Delete the images in the old project by using the [UI](#delete-images) or [API](../../../api/packages.md#delete-a-project-package).
There may be a delay while the images are queued and deleted.
1. Change the path or transfer the project by going to **Settings > General**
and expanding **Advanced**.
@@ -698,7 +703,7 @@ Follow [this issue](https://gitlab.com/gitlab-org/container-registry/-/issues/55
### Tags temporarily cannot be marked for deletion
-GitLab is [migrating to the next generation of the Container Registry](https://gitlab.com/groups/gitlab-org/-/epics/5523).
-During the migration, you may encounter difficulty deleting tags.
-If you encounter an error, it's likely that your image repository is in the process of being migrated.
+GitLab is [migrating to the next generation of the Container Registry](https://gitlab.com/groups/gitlab-org/-/epics/5523).
+During the migration, you may encounter difficulty deleting tags.
+If you encounter an error, it's likely that your image repository is in the process of being migrated.
Please wait a few minutes and try again.
diff --git a/doc/user/packages/container_registry/reduce_container_registry_storage.md b/doc/user/packages/container_registry/reduce_container_registry_storage.md
index 7e8b2865b6e..2cfe99876fa 100644
--- a/doc/user/packages/container_registry/reduce_container_registry_storage.md
+++ b/doc/user/packages/container_registry/reduce_container_registry_storage.md
@@ -79,7 +79,7 @@ the Container Registry after the policy runs. The next time the policy runs, the
so it may take multiple runs for all tags to be deleted.
WARNING:
-GitLab self-managed installs support for third-party container registries that comply with the
+GitLab self-managed installations support third-party container registries that comply with the
[Docker Registry HTTP API V2](https://docs.docker.com/registry/spec/api/)
specification. However, this specification does not include a tag delete operation. Therefore, when
interacting with third-party container registries, GitLab uses a workaround to delete tags. See the
@@ -217,7 +217,23 @@ Valid values for `cadence` when using the API are:
- `1month` (every month)
- `3month` (every quarter)
-See the API documentation for further details: [Edit project](../../../api/projects.md#edit-project).
+Valid values for `keep_n` (number of tags kept per image name) when using the API are:
+
+- `1`
+- `5`
+- `10`
+- `25`
+- `50`
+- `100`
+
+Valid values for `older_than` (days until tags are automatically removed) when using the API are:
+
+- `7d`
+- `14d`
+- `30d`
+- `90d`
+
+See the API documentation for further details: [Edit project API](../../../api/projects.md#edit-project).
### Use with external container registries
diff --git a/doc/user/packages/dependency_proxy/index.md b/doc/user/packages/dependency_proxy/index.md
index e431d4d7de3..5e66c8ed7a5 100644
--- a/doc/user/packages/dependency_proxy/index.md
+++ b/doc/user/packages/dependency_proxy/index.md
@@ -96,6 +96,14 @@ You can authenticate using:
Users accessing the Dependency Proxy with a personal access token or username and password must
have at least the Guest role for the group they pull images from.
+The Dependency Proxy follows the [Docker v2 token authentication flow](https://docs.docker.com/registry/spec/auth/token/),
+issuing the client a JWT to use for the pull requests. The JWT issued as a result of authenticating
+expires after some time. When the token expires, most Docker clients store your credentials and
+automatically request a new token without further action.
+
+The token expiration time is a [configurable setting](../../../administration/packages/dependency_proxy.md#changing-the-jwt-expiration).
+On GitLab.com, the expiration time is 15 minutes.
+
#### SAML SSO
When [SSO enforcement](../../group/saml_sso/index.md#sso-enforcement)
@@ -132,7 +140,8 @@ There are other additional predefined CI/CD variables you can also use:
- `CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX`: the image prefix for pulling images through the
dependency proxy from the direct group or subgroup that the project belongs to.
-`CI_DEPENDENCY_PROXY_SERVER` and `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX`
+`CI_DEPENDENCY_PROXY_SERVER`, `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX`, and
+`CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX`
include the server port. If you explicitly include the Dependency Proxy
path, the port must be included, unless you have logged into the Dependency
Proxy manually without including the port:
diff --git a/doc/user/packages/maven_repository/index.md b/doc/user/packages/maven_repository/index.md
index 6e3af6a92d5..6a515b78fc1 100644
--- a/doc/user/packages/maven_repository/index.md
+++ b/doc/user/packages/maven_repository/index.md
@@ -283,7 +283,8 @@ To authenticate to the Package Registry, you need either a personal access token
### Authenticate with a personal access token in Gradle
-Create a file `~/.gradle/gradle.properties` with the following content:
+In [your `GRADLE_USER_HOME` directory](https://docs.gradle.org/current/userguide/directory_layout.html#dir:gradle_user_home),
+create a file `gradle.properties` with the following content:
```groovy
gitLabPrivateToken=REPLACE_WITH_YOUR_PERSONAL_ACCESS_TOKEN
@@ -586,7 +587,7 @@ To publish a package by using Gradle:
url "https://gitlab.example.com/api/v4/projects/<PROJECT_ID>/packages/maven"
credentials(HttpHeaderCredentials) {
name = "Private-Token"
- value = gitLabPrivateToken // the variable resides in ~/.gradle/gradle.properties
+ value = gitLabPrivateToken // the variable resides in $GRADLE_USER_HOME/gradle.properties
}
authentication {
header(HttpHeaderAuthentication)
@@ -820,7 +821,7 @@ rm -rf ~/.m2/repository
If you're using Gradle, run this command to clear the cache:
```shell
-rm -rf ~/.gradle/caches
+rm -rf ~/.gradle/caches # Or replace ~/.gradle with your custom GRADLE_USER_HOME
```
### Review network trace logs
diff --git a/doc/user/packages/package_registry/index.md b/doc/user/packages/package_registry/index.md
index b980f6a5694..1f278bd1476 100644
--- a/doc/user/packages/package_registry/index.md
+++ b/doc/user/packages/package_registry/index.md
@@ -114,6 +114,26 @@ You can also remove the Package Registry for your project specifically:
The **Packages & Registries > Package Registry** entry is removed from the sidebar.
+## Package Registry visibility permissions
+
+[Project-level permissions](../../permissions.md)
+determine actions such as downloading, pushing, or deleting packages.
+
+The visibility of the Package Registry is independent of the repository and can't be controlled from
+your project's settings. For example, if you have a public project and set the repository visibility
+to **Only Project Members**, the Package Registry is then public. However, disabling the Package
+Registry disables all Package Registry operations.
+
+[GitLab-#329253](https://gitlab.com/gitlab-org/gitlab/-/issues/329253)
+proposes adding the ability to control Package Registry visibility from the UI.
+
+| | | Anonymous<br/>(everyone on internet) | Guest | Reporter, Developer, Maintainer, Owner |
+| -------------------- | --------------------- | --------- | ----- | ------------------------------------------ |
+| Public project with Package Registry enabled | View Package Registry <br/> and pull packages | Yes | Yes | Yes |
+| Internal project with Package Registry enabled | View Package Registry <br/> and pull packages | No | Yes | Yes |
+| Private project with Package Registry enabled | View Package Registry <br/> and pull packages | No | No | Yes |
+| Any project with Package Registry disabled | All operations on Package Registry | No | No | No |
+
## Supported package managers
WARNING:
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index c90f575e83a..2282a7d876e 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -54,155 +54,158 @@ The following table lists project permissions available for each role:
<!-- Keep this table sorted: By topic first, then by minimum role, then alphabetically. -->
-| Action | Guest | Reporter | Developer | Maintainer | Owner |
-|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|----------|-----------|------------|----------|
-| [Analytics](analytics/index.md):<br>View issue analytics | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Analytics](analytics/index.md):<br>View [merge request analytics](analytics/merge_request_analytics.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Analytics](analytics/index.md):<br>View value stream analytics | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Analytics](analytics/index.md):<br>View [DORA metrics](analytics/ci_cd_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
-| [Analytics](analytics/index.md):<br>View [CI/CD analytics](analytics/ci_cd_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
-| [Analytics](analytics/index.md):<br>View [code review analytics](analytics/code_review_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
-| [Analytics](analytics/index.md):<br>View [repository analytics](analytics/repository_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
-| [Application security](application_security/index.md):<br>View licenses in [dependency list](application_security/dependency_list/index.md) | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
-| [Application security](application_security/index.md):<br>Create and run [on-demand DAST scans](application_security/dast/index.md#on-demand-scans) | | | ✓ | ✓ | ✓ |
-| [Application security](application_security/index.md):<br>Manage [security policy](application_security/policies/index.md) | | | ✓ | ✓ | ✓ |
-| [Application security](application_security/index.md):<br>View [dependency list](application_security/dependency_list/index.md) | | | ✓ | ✓ | ✓ |
-| [Application security](application_security/index.md):<br>View [threats list](application_security/threat_monitoring/index.md#threat-monitoring) | | | ✓ | ✓ | ✓ |
-| [Application security](application_security/index.md):<br>Create a [CVE ID Request](application_security/cve_id_request.md) | | | | ✓ | ✓ |
-| [Application security](application_security/index.md):<br>Create or assign [security policy project](application_security/policies/index.md) | | | | | ✓ |
-| [Clusters](infrastructure/clusters/index.md):<br>View [pod logs](project/clusters/kubernetes_pod_logs.md) | | | ✓ | ✓ | ✓ |
-| [Clusters](infrastructure/clusters/index.md):<br>View clusters | | | ✓ | ✓ | ✓ |
-| [Clusters](infrastructure/clusters/index.md):<br>Manage clusters | | | | ✓ | ✓ |
-| [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete cleanup policies | | | ✓ | ✓ | ✓ |
-| [Container Registry](packages/container_registry/index.md):<br>Push an image to the Container Registry | | | ✓ | ✓ | ✓ |
-| [Container Registry](packages/container_registry/index.md):<br>Pull an image from the Container Registry | ✓ (*20*) | ✓ (*20*) | ✓ | ✓ | ✓ |
-| [Container Registry](packages/container_registry/index.md):<br>Remove a Container Registry image | | | ✓ | ✓ | ✓ |
-| [GitLab Pages](project/pages/index.md):<br>View Pages protected by [access control](project/pages/introduction.md#gitlab-pages-access-control) | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [GitLab Pages](project/pages/index.md):<br>Manage | | | | ✓ | ✓ |
-| [GitLab Pages](project/pages/index.md):<br>Manage GitLab Pages domains and certificates | | | | ✓ | ✓ |
-| [GitLab Pages](project/pages/index.md):<br>Remove GitLab Pages | | | | ✓ | ✓ |
-| [Incident Management](../operations/incident_management/index.md):<br>View [alerts](../operations/incident_management/alerts.md) | | ✓ | ✓ | ✓ | ✓ |
-| [Incident Management](../operations/incident_management/index.md):<br>Assign an alert | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Incident Management](../operations/incident_management/index.md):<br>View [incident](../operations/incident_management/incidents.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Incident Management](../operations/incident_management/index.md):<br>Create [incident](../operations/incident_management/incidents.md) | (*16*) | ✓ | ✓ | ✓ | ✓ |
-| [Incident Management](../operations/incident_management/index.md):<br>View [on-call schedules](../operations/incident_management/oncall_schedules.md) | | ✓ | ✓ | ✓ | ✓ |
-| [Incident Management](../operations/incident_management/index.md):<br>Participate in on-call rotation | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Incident Management](../operations/incident_management/index.md):<br>View [escalation policies](../operations/incident_management/escalation_policies.md) | | ✓ | ✓ | ✓ | ✓ |
-| [Incident Management](../operations/incident_management/index.md):<br>Manage [on-call schedules](../operations/incident_management/oncall_schedules.md) | | | | ✓ | ✓ |
-| [Incident Management](../operations/incident_management/index.md):<br>Manage [escalation policies](../operations/incident_management/escalation_policies.md) | | | | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Add Labels | ✓ (*15*) | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Assign | ✓ (*15*) | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Create (*18*) | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Create [confidential issues](project/issues/confidential_issues.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>View [Design Management](project/issues/design_management.md) pages | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>View related issues | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Set weight | ✓ (*15*) | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>View [confidential issues](project/issues/confidential_issues.md) | (*2*) | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Close / reopen (*19*) | | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Lock threads | | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Manage related issues | | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Manage tracker | | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Move issues (*14*) | | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Set issue [time tracking](project/time_tracking.md) estimate and time spent | | ✓ | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Upload [Design Management](project/issues/design_management.md) files | | | ✓ | ✓ | ✓ |
-| [Issues](project/issues/index.md):<br>Delete | | | | | ✓ |
-| [License Compliance](compliance/license_compliance/index.md):<br>View allowed and denied licenses | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
-| [License Compliance](compliance/license_compliance/index.md):<br>View License Compliance reports | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
-| [License Compliance](compliance/license_compliance/index.md):<br>View License list | | ✓ | ✓ | ✓ | ✓ |
-| [License Compliance](compliance/license_compliance/index.md):<br>Manage license policy | | | | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Assign reviewer | | ✓ | ✓ | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>See list | | ✓ | ✓ | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Apply code change suggestions | | | ✓ | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Approve (*8*) | | | ✓ | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Assign | | | ✓ | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Create (*17*) | | | ✓ | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Add labels | | | ✓ | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Lock threads | | | ✓ | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Manage or accept | | | ✓ | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Manage merge approval rules (project settings) | | | | ✓ | ✓ |
-| [Merge requests](project/merge_requests/index.md):<br>Delete | | | | | ✓ |
-| [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Manage user-starred metrics dashboards (*6*) | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>View metrics dashboard annotations | | ✓ | ✓ | ✓ | ✓ |
-| [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Create/edit/delete metrics dashboard annotations | | | ✓ | ✓ | ✓ |
-| [Package registry](packages/index.md):<br>Pull a package | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
-| [Package registry](packages/index.md):<br>Publish a package | | | ✓ | ✓ | ✓ |
-| [Package registry](packages/index.md):<br>Delete a package | | | | ✓ | ✓ |
-| [Package registry](packages/index.md):<br>Delete a file associated with a package | | | | ✓ | ✓ |
-| [Project operations](../operations/index.md):<br>View [Error Tracking](../operations/error_tracking.md) list | | ✓ | ✓ | ✓ | ✓ |
-| [Project operations](../operations/index.md):<br>Manage [Feature Flags](../operations/feature_flags.md) | | | ✓ | ✓ | ✓ |
-| [Project operations](../operations/index.md):<br>Manage [Error Tracking](../operations/error_tracking.md) | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Download project | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>Leave comments | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>Reposition comments on images (posted by any user) | ✓ (*9*) | ✓ (*9*) | ✓ (*9*) | ✓ | ✓ |
-| [Projects](project/index.md):<br>View Insights | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>View [releases](project/releases/index.md) | ✓ (*5*) | ✓ | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>View Requirements | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>View [time tracking](project/time_tracking.md) reports | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
-| [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 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) | | | ✓ (*12*) | ✓ (*12*) | ✓ (*12*) |
-| [Projects](project/index.md):<br>Create, edit [wiki](project/wiki/index.md) pages | | | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>Enable Review Apps | | | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>View project [Audit Events](../administration/audit_events.md) | | | ✓ (*10*) | ✓ | ✓ |
-| [Projects](project/index.md):<br>Add deploy keys | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Add new team members | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Change [project features visibility](../public_access/public_access.md) level | | | | ✓ (*13*) | ✓ |
-| [Projects](project/index.md):<br>Configure [webhooks](project/integrations/webhooks.md) | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Delete [wiki](project/wiki/index.md) pages | | | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>Edit comments (posted by any user) | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Edit project badges | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Edit project settings | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Export project | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Manage [project access tokens](project/settings/project_access_tokens.md) (*11*) | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Manage [Project Operations](../operations/index.md) | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Rename project | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Share (invite) projects with groups | | | | ✓ (*7*) | ✓ (*7*) |
-| [Projects](project/index.md):<br>View 2FA status of members | | | | ✓ | ✓ |
-| [Projects](project/index.md):<br>Administer project compliance frameworks | | | | | ✓ |
-| [Projects](project/index.md):<br>Archive project | | | | | ✓ |
-| [Projects](project/index.md):<br>Change project visibility level | | | | | ✓ |
-| [Projects](project/index.md):<br>Delete project | | | | | ✓ |
-| [Projects](project/index.md):<br>Disable notification emails | | | | | ✓ |
-| [Projects](project/index.md):<br>Transfer project to another namespace | | | | | ✓ |
-| [Repository](project/repository/index.md):<br>Pull project code | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>View project code | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>View a commit status | | ✓ | ✓ | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Add tags | | | ✓ | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Create new branches | | | ✓ | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Create or update commit status | | | ✓ (*4*) | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Force push to non-protected branches | | | ✓ | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Push to non-protected branches | | | ✓ | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Remove non-protected branches | | | ✓ | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Rewrite or remove Git tags | | | ✓ | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Enable or disable branch protection | | | | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Enable or disable tag protection | | | | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Manage [push rules](project/repository/push_rules.md) | | | | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Push to protected branches (*4*) | | | | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Turn on or off protected branch push for developers | | | | ✓ | ✓ |
-| [Repository](project/repository/index.md):<br>Remove fork relationship | | | | | ✓ |
-| [Repository](project/repository/index.md):<br>Force push to protected branches (*3*) | | | | | |
-| [Repository](project/repository/index.md):<br>Remove protected branches (*3*) | | | | | |
-| [Requirements Management](project/requirements/index.md):<br>Archive / reopen | | ✓ | ✓ | ✓ | ✓ |
-| [Requirements Management](project/requirements/index.md):<br>Create / edit | | ✓ | ✓ | ✓ | ✓ |
-| [Requirements Management](project/requirements/index.md):<br>Import / export | | ✓ | ✓ | ✓ | ✓ |
-| [Security dashboard](application_security/security_dashboard/index.md):<br>Create issue from vulnerability finding | | | ✓ | ✓ | ✓ |
-| [Security dashboard](application_security/security_dashboard/index.md):<br>Create vulnerability from vulnerability finding | | | ✓ | ✓ | ✓ |
-| [Security dashboard](application_security/security_dashboard/index.md):<br>Dismiss vulnerability | | | ✓ | ✓ | ✓ |
-| [Security dashboard](application_security/security_dashboard/index.md):<br>Dismiss vulnerability finding | | | ✓ | ✓ | ✓ |
-| [Security dashboard](application_security/security_dashboard/index.md):<br>Resolve vulnerability | | | ✓ | ✓ | ✓ |
-| [Security dashboard](application_security/security_dashboard/index.md):<br>Revert vulnerability to detected state | | | ✓ | ✓ | ✓ |
-| [Security dashboard](application_security/security_dashboard/index.md):<br>Use security dashboard | | | ✓ | ✓ | ✓ |
-| [Security dashboard](application_security/security_dashboard/index.md):<br>View vulnerability | | | ✓ | ✓ | ✓ |
-| [Security dashboard](application_security/security_dashboard/index.md):<br>View vulnerability findings in [dependency list](application_security/dependency_list/index.md) | | | ✓ | ✓ | ✓ |
-| [Terraform](infrastructure/index.md):<br>Read Terraform state | | | ✓ | ✓ | ✓ |
-| [Terraform](infrastructure/index.md):<br>Manage Terraform state | | | | ✓ | ✓ |
-| [Test cases](../ci/test_cases/index.md):<br>Archive | | ✓ | ✓ | ✓ | ✓ |
-| [Test cases](../ci/test_cases/index.md):<br>Create | | ✓ | ✓ | ✓ | ✓ |
-| [Test cases](../ci/test_cases/index.md):<br>Move | | ✓ | ✓ | ✓ | ✓ |
-| [Test cases](../ci/test_cases/index.md):<br>Reopen | | ✓ | ✓ | ✓ | ✓ |
+| Action | Guest | Reporter | Developer | Maintainer | Owner |
+|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|----------|-----------|------------|----------|
+| [Analytics](analytics/index.md):<br>View [issue analytics](analytics/issue_analytics.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Analytics](analytics/index.md):<br>View [merge request analytics](analytics/merge_request_analytics.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Analytics](analytics/index.md):<br>View [value stream analytics](analytics/value_stream_analytics.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Analytics](analytics/index.md):<br>View [DORA metrics](analytics/ci_cd_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
+| [Analytics](analytics/index.md):<br>View [CI/CD analytics](analytics/ci_cd_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
+| [Analytics](analytics/index.md):<br>View [code review analytics](analytics/code_review_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
+| [Analytics](analytics/index.md):<br>View [repository analytics](analytics/repository_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
+| [Application security](application_security/index.md):<br>View licenses in [dependency list](application_security/dependency_list/index.md) | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| [Application security](application_security/index.md):<br>Create and run [on-demand DAST scans](application_security/dast/index.md#on-demand-scans) | | | ✓ | ✓ | ✓ |
+| [Application security](application_security/index.md):<br>Manage [security policy](application_security/policies/index.md) | | | ✓ | ✓ | ✓ |
+| [Application security](application_security/index.md):<br>View [dependency list](application_security/dependency_list/index.md) | | | ✓ | ✓ | ✓ |
+| [Application security](application_security/index.md):<br>View [threats list](application_security/threat_monitoring/index.md#threat-monitoring) | | | ✓ | ✓ | ✓ |
+| [Application security](application_security/index.md):<br>Create a [CVE ID Request](application_security/cve_id_request.md) | | | | ✓ | ✓ |
+| [Application security](application_security/index.md):<br>Create or assign [security policy project](application_security/policies/index.md) | | | | | ✓ |
+| [Clusters](infrastructure/clusters/index.md):<br>View [pod logs](project/clusters/kubernetes_pod_logs.md) | | | ✓ | ✓ | ✓ |
+| [Clusters](infrastructure/clusters/index.md):<br>View clusters | | | ✓ | ✓ | ✓ |
+| [Clusters](infrastructure/clusters/index.md):<br>Manage clusters | | | | ✓ | ✓ |
+| [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete [cleanup policies](packages/container_registry/index.md#delete-images-by-using-a-cleanup-policy) | | | ✓ | ✓ | ✓ |
+| [Container Registry](packages/container_registry/index.md):<br>Push an image to the Container Registry | | | ✓ | ✓ | ✓ |
+| [Container Registry](packages/container_registry/index.md):<br>Pull an image from the Container Registry | ✓ (*20*) | ✓ (*20*) | ✓ | ✓ | ✓ |
+| [Container Registry](packages/container_registry/index.md):<br>Remove a Container Registry image | | | ✓ | ✓ | ✓ |
+| [GitLab Pages](project/pages/index.md):<br>View Pages protected by [access control](project/pages/introduction.md#gitlab-pages-access-control) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [GitLab Pages](project/pages/index.md):<br>Manage | | | | ✓ | ✓ |
+| [GitLab Pages](project/pages/index.md):<br>Manage GitLab Pages domains and certificates | | | | ✓ | ✓ |
+| [GitLab Pages](project/pages/index.md):<br>Remove GitLab Pages | | | | ✓ | ✓ |
+| [Incident Management](../operations/incident_management/index.md):<br>View [alerts](../operations/incident_management/alerts.md) | | ✓ | ✓ | ✓ | ✓ |
+| [Incident Management](../operations/incident_management/index.md):<br>Assign an alert | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Incident Management](../operations/incident_management/index.md):<br>View [incident](../operations/incident_management/incidents.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Incident Management](../operations/incident_management/index.md):<br>Create [incident](../operations/incident_management/incidents.md) | (*16*) | ✓ | ✓ | ✓ | ✓ |
+| [Incident Management](../operations/incident_management/index.md):<br>View [on-call schedules](../operations/incident_management/oncall_schedules.md) | | ✓ | ✓ | ✓ | ✓ |
+| [Incident Management](../operations/incident_management/index.md):<br>Participate in on-call rotation | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Incident Management](../operations/incident_management/index.md):<br>View [escalation policies](../operations/incident_management/escalation_policies.md) | | ✓ | ✓ | ✓ | ✓ |
+| [Incident Management](../operations/incident_management/index.md):<br>Manage [on-call schedules](../operations/incident_management/oncall_schedules.md) | | | | ✓ | ✓ |
+| [Incident Management](../operations/incident_management/index.md):<br>Manage [escalation policies](../operations/incident_management/escalation_policies.md) | | | | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Add Labels | ✓ (*15*) | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Assign | ✓ (*15*) | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Create (*18*) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Create [confidential issues](project/issues/confidential_issues.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>View [Design Management](project/issues/design_management.md) pages | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>View [related issues](project/issues/related_issues.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Set [weight](project/issues/issue_weight.md) | ✓ (*15*) | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>View [confidential issues](project/issues/confidential_issues.md) | (*2*) | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Close / reopen (*19*) | | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Lock threads | | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Manage [related issues](project/issues/related_issues.md) | | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Manage tracker | | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Move issues (*14*) | | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Set issue [time tracking](project/time_tracking.md) estimate and time spent | | ✓ | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Archive [Design Management](project/issues/design_management.md) files | | | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Upload [Design Management](project/issues/design_management.md) files | | | ✓ | ✓ | ✓ |
+| [Issues](project/issues/index.md):<br>Delete | | | | | ✓ |
+| [License Compliance](compliance/license_compliance/index.md):<br>View allowed and denied licenses | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| [License Compliance](compliance/license_compliance/index.md):<br>View License Compliance reports | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| [License Compliance](compliance/license_compliance/index.md):<br>View License list | | ✓ | ✓ | ✓ | ✓ |
+| [License Compliance](compliance/license_compliance/index.md):<br>Manage license policy | | | | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Assign reviewer | | ✓ | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>See list | | ✓ | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Apply code change suggestions | | | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Approve (*8*) | | | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Assign | | | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Create (*17*) | | | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Add labels | | | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Lock threads | | | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Manage or accept | | | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>[Resolve a thread](discussions/#resolve-a-thread) | | | ✓ | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Manage [merge approval rules](project/merge_requests/approvals/settings.md) (project settings) | | | | ✓ | ✓ |
+| [Merge requests](project/merge_requests/index.md):<br>Delete | | | | | ✓ |
+| [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Manage user-starred metrics dashboards (*6*) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>View metrics dashboard annotations | | ✓ | ✓ | ✓ | ✓ |
+| [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Create/edit/delete metrics dashboard annotations | | | ✓ | ✓ | ✓ |
+| [Package registry](packages/index.md):<br>Pull a package | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| [Package registry](packages/index.md):<br>Publish a package | | | ✓ | ✓ | ✓ |
+| [Package registry](packages/index.md):<br>Delete a package | | | | ✓ | ✓ |
+| [Package registry](packages/index.md):<br>Delete a file associated with a package | | | | ✓ | ✓ |
+| [Project operations](../operations/index.md):<br>View [Error Tracking](../operations/error_tracking.md) list | | ✓ | ✓ | ✓ | ✓ |
+| [Project operations](../operations/index.md):<br>Manage [Feature Flags](../operations/feature_flags.md) | | | ✓ | ✓ | ✓ |
+| [Project operations](../operations/index.md):<br>Manage [Error Tracking](../operations/error_tracking.md) | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Download project | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>Leave comments | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>Reposition comments on images (posted by any user) | ✓ (*9*) | ✓ (*9*) | ✓ (*9*) | ✓ | ✓ |
+| [Projects](project/index.md):<br>View [Insights](project/insights/index.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>View [releases](project/releases/index.md) | ✓ (*5*) | ✓ | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>View [Requirements](project/requirements/index.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>View [time tracking](project/time_tracking.md) reports | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| [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 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) | | | ✓ (*12*) | ✓ (*12*) | ✓ (*12*) |
+| [Projects](project/index.md):<br>Create, edit [wiki](project/wiki/index.md) pages | | | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>Enable [Review Apps](../ci/review_apps/index.md) | | | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>View project [Audit Events](../administration/audit_events.md) | | | ✓ (*10*) | ✓ | ✓ |
+| [Projects](project/index.md):<br>Add [deploy keys](project/deploy_keys/index.md) | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Add new [team members](project/members/index.md) | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Change [project features visibility](public_access.md) level | | | | ✓ (*13*) | ✓ |
+| [Projects](project/index.md):<br>Configure [webhooks](project/integrations/webhooks.md) | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Delete [wiki](project/wiki/index.md) pages | | | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>Edit comments (posted by any user) | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Edit project badges | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Edit project settings | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Export project | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Manage [project access tokens](project/settings/project_access_tokens.md) (*11*) | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Manage [Project Operations](../operations/index.md) | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Rename project | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Share (invite) projects with groups | | | | ✓ (*7*) | ✓ (*7*) |
+| [Projects](project/index.md):<br>View 2FA status of members | | | | ✓ | ✓ |
+| [Projects](project/index.md):<br>Assign project to a [compliance framework](project/settings/index.md#compliance-frameworks) | | | | | ✓ |
+| [Projects](project/index.md):<br>Archive project | | | | | ✓ |
+| [Projects](project/index.md):<br>Change project visibility level | | | | | ✓ |
+| [Projects](project/index.md):<br>Delete project | | | | | ✓ |
+| [Projects](project/index.md):<br>Disable notification emails | | | | | ✓ |
+| [Projects](project/index.md):<br>Transfer project to another namespace | | | | | ✓ |
+| [Projects](project/index.md): View [Usage Quotas](usage_quotas.md) page | | | | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Pull project code | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>View project code | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>View a commit status | | ✓ | ✓ | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Add tags | | | ✓ | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Create new branches | | | ✓ | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Create or update commit status | | | ✓ (*4*) | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Force push to non-protected branches | | | ✓ | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Push to non-protected branches | | | ✓ | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Remove non-protected branches | | | ✓ | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Rewrite or remove Git tags | | | ✓ | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Enable or disable branch protection | | | | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Enable or disable tag protection | | | | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Manage [push rules](project/repository/push_rules.md) | | | | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Push to protected branches (*4*) | | | | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Turn on or off protected branch push for developers | | | | ✓ | ✓ |
+| [Repository](project/repository/index.md):<br>Remove fork relationship | | | | | ✓ |
+| [Repository](project/repository/index.md):<br>Force push to protected branches (*3*) | | | | | |
+| [Repository](project/repository/index.md):<br>Remove protected branches (*3*) | | | | | |
+| [Requirements Management](project/requirements/index.md):<br>Archive / reopen | | ✓ | ✓ | ✓ | ✓ |
+| [Requirements Management](project/requirements/index.md):<br>Create / edit | | ✓ | ✓ | ✓ | ✓ |
+| [Requirements Management](project/requirements/index.md):<br>Import / export | | ✓ | ✓ | ✓ | ✓ |
+| [Security dashboard](application_security/security_dashboard/index.md):<br>Create issue from vulnerability finding | | | ✓ | ✓ | ✓ |
+| [Security dashboard](application_security/security_dashboard/index.md):<br>Create vulnerability from vulnerability finding | | | ✓ | ✓ | ✓ |
+| [Security dashboard](application_security/security_dashboard/index.md):<br>Dismiss vulnerability | | | ✓ | ✓ | ✓ |
+| [Security dashboard](application_security/security_dashboard/index.md):<br>Dismiss vulnerability finding | | | ✓ | ✓ | ✓ |
+| [Security dashboard](application_security/security_dashboard/index.md):<br>Resolve vulnerability | | | ✓ | ✓ | ✓ |
+| [Security dashboard](application_security/security_dashboard/index.md):<br>Revert vulnerability to detected state | | | ✓ | ✓ | ✓ |
+| [Security dashboard](application_security/security_dashboard/index.md):<br>Use security dashboard | | | ✓ | ✓ | ✓ |
+| [Security dashboard](application_security/security_dashboard/index.md):<br>View vulnerability | | | ✓ | ✓ | ✓ |
+| [Security dashboard](application_security/security_dashboard/index.md):<br>View vulnerability findings in [dependency list](application_security/dependency_list/index.md) | | | ✓ | ✓ | ✓ |
+| [Terraform](infrastructure/index.md):<br>Read Terraform state | | | ✓ | ✓ | ✓ |
+| [Terraform](infrastructure/index.md):<br>Manage Terraform state | | | | ✓ | ✓ |
+| [Test cases](../ci/test_cases/index.md):<br>Archive | | ✓ | ✓ | ✓ | ✓ |
+| [Test cases](../ci/test_cases/index.md):<br>Create | | ✓ | ✓ | ✓ | ✓ |
+| [Test cases](../ci/test_cases/index.md):<br>Move | | ✓ | ✓ | ✓ | ✓ |
+| [Test cases](../ci/test_cases/index.md):<br>Reopen | | ✓ | ✓ | ✓ | ✓ |
<!-- markdownlint-disable MD029 -->
@@ -224,7 +227,7 @@ The following table lists project permissions available for each role:
supported on GitLab SaaS Premium and above (excluding [trial licenses](https://about.gitlab.com/free-trial/)).
12. If the [tag is protected](#release-permissions-with-protected-tags), this depends on the access Developers and Maintainers are given.
13. A Maintainer can't change project features visibility level if
- [project visibility](../public_access/public_access.md) is set to private.
+ [project visibility](public_access.md) is set to private.
14. Attached design files are moved together with the issue even if the user doesn't have the
Developer role.
15. Guest users can only set metadata (for example, labels, assignees, or milestones)
@@ -262,6 +265,7 @@ More details about the permissions for some project-level features follow.
| View pipelines page | ✓ (*1*) | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
| View pipelines tab in MR | ✓ (*3*) | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
| [View vulnerabilities in a pipeline](application_security/security_dashboard/index.md#view-vulnerabilities-in-a-pipeline) | | ✓ (*2*) | ✓ | ✓ | ✓ | ✓ |
+| View and download project-level [Secure Files](../api/secure_files.md) | | | | ✓ | ✓ | ✓ |
| Cancel and retry jobs | | | | ✓ | ✓ | ✓ |
| Create new [environments](../ci/environments/index.md) | | | | ✓ | ✓ | ✓ |
| Delete job logs or job artifacts | | | | ✓ (*4*) | ✓ | ✓ |
@@ -276,6 +280,7 @@ More details about the permissions for some project-level features follow.
| Manage CI/CD settings | | | | | ✓ | ✓ |
| Manage job triggers | | | | | ✓ | ✓ |
| Manage project-level CI/CD variables | | | | | ✓ | ✓ |
+| Manage project-level [Secure Files](../api/secure_files.md) | | | | | ✓ | ✓ |
| Use [environment terminals](../ci/environments/index.md#web-terminals-deprecated) | | | | | ✓ | ✓ |
| Delete pipelines | | | | | | ✓ |
@@ -391,7 +396,6 @@ The following table lists group permissions available for each role:
| View [Group DevOps Adoption](group/devops_adoption/index.md) | | ✓ | ✓ | ✓ | ✓ |
| View metrics dashboard annotations | | ✓ | ✓ | ✓ | ✓ |
| View [Productivity analytics](analytics/productivity_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
-| View Usage quota data | | ✓ | ✓ | ✓ | ✓ |
| Create and edit [group wiki](project/wiki/group.md) pages | | | ✓ | ✓ | ✓ |
| Create project in group | | | ✓ (3)(5) | ✓ (3) | ✓ (3) |
| Create/edit/delete group milestones | | | ✓ | ✓ | ✓ |
@@ -407,7 +411,7 @@ The following table lists group permissions available for each role:
| List group deploy tokens | | | | ✓ | ✓ |
| Manage [group push rules](group/index.md#group-push-rules) | | | | ✓ | ✓ |
| View/manage group-level Kubernetes cluster | | | | ✓ | ✓ |
-| Administer project compliance frameworks | | | | | ✓ |
+| Create and manage compliance frameworks | | | | | ✓ |
| Create/Delete group deploy tokens | | | | | ✓ |
| Change group visibility level | | | | | ✓ |
| Delete group | | | | | ✓ |
@@ -421,8 +425,8 @@ The following table lists group permissions available for each role:
| Share (invite) groups with groups | | | | | ✓ |
| View 2FA status of members | | | | | ✓ |
| View [Billing](../subscriptions/gitlab_com/index.md#view-your-gitlab-saas-subscription) | | | | | ✓ (4) |
-| View [Usage Quotas](usage_quotas.md) Page | | | | ✓ | ✓ (4) |
-| Manage runners | | | | | ✓ |
+| View group [Usage Quotas](usage_quotas.md) page | | | | | ✓ (4) |
+| Manage group runners | | | | | ✓ |
<!-- markdownlint-disable MD029 -->
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index f201e04183c..a86968654c7 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -88,7 +88,7 @@ The following is hidden from your user profile page (`https://gitlab.example.com
- Tabs for activity, groups, contributed projects, personal projects, starred projects, snippets
NOTE:
-Making your user profile page private does not hide your public resources from the REST or GraphQL APIs.
+Making your user profile page private does not hide all your public resources from the REST or GraphQL APIs.
### User visibility
@@ -123,7 +123,7 @@ To create a new project and add its README to your profile:
1. For **Project Configuration**, ensure **Initialize repository with a README** is selected.
1. Select **Create project**.
1. Create a README file inside this project. The file can be any valid [README or index file](../project/repository/index.md#readme-and-index-files).
-1. Populate the README file with [Markdown](../markdown.md).
+1. Populate the README file with [Markdown](../markdown.md), or another [supported markup language](../project/repository/index.md#supported-markup-languages).
GitLab displays the contents of your README below your contribution graph.
@@ -150,7 +150,7 @@ To add links to other accounts:
## Show private contributions on your user profile page
-In the user contribution calendar graph and recent activity list, you can see your [contribution actions](../index.md#user-contribution-events) to private projects.
+In the user contribution calendar graph and recent activity list, you can see your [contribution actions](#user-contribution-events) to private projects.
To show private contributions:
@@ -322,6 +322,65 @@ and configure it on your local machine by using the following command:
git config --global user.email <your email address>
```
+## User activity
+
+GitLab tracks user contribution activity.
+You can follow or unfollow other users from their [user profiles](#access-your-user-profile).
+To view a user's activity in a top-level Activity view:
+
+1. From a user's profile, select **Follow**.
+1. In the GitLab menu, select **Activity**.
+1. Select the **Followed users** tab.
+
+### User contribution events
+
+Each of these contribution events is tracked:
+
+- `approved`
+ - Merge request
+- `closed`
+ - [Epic](../group/epics/index.md)
+ - Issue
+ - Merge request
+ - Milestone
+- `commented` on any `Noteable` record.
+ - Alert
+ - Commit
+ - Design
+ - Issue
+ - Merge request
+ - Snippet
+- `created`
+ - Design
+ - [Epic](../group/epics/index.md)
+ - Issue
+ - Merge request
+ - Milestone
+ - Project
+ - Wiki page
+- `destroyed`
+ - Design
+ - Milestone
+ - Wiki page
+- `expired`
+ - Project membership
+- `joined`
+ - Project membership
+- `left`
+ - Project membership
+- `merged`
+ - Merge request
+- `pushed` commits to (or deleted commits from) a repository, individually or in bulk.
+ - Project
+- `reopened`
+ - [Epic](../group/epics/index.md)
+ - Issue
+ - Merge request
+ - Milestone
+- `updated`
+ - Design
+ - Wiki page
+
## Troubleshooting
### Why do I keep getting signed out?
@@ -379,6 +438,6 @@ Without the `config.extend_remember_period` flag, you would be forced to sign in
- [Receive emails for sign-ins from unknown IP addresses or devices](unknown_sign_in_notification.md)
- Manage applications that can [use GitLab as an OAuth provider](../../integration/oauth_provider.md#introduction-to-oauth)
- Manage [personal access tokens](personal_access_tokens.md) to access your account via API and authorized applications
-- Manage [SSH keys](../../ssh/index.md) to access your account via SSH
+- Manage [SSH keys](../ssh.md) to access your account via SSH
- Change your [syntax highlighting theme](preferences.md#syntax-highlighting-theme)
- [View your active sessions](active_sessions.md) and revoke any of them if necessary
diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md
index 4c9622810b2..d0e9b427f1c 100644
--- a/doc/user/profile/notifications.md
+++ b/doc/user/profile/notifications.md
@@ -11,7 +11,7 @@ Stay informed about what's happening in GitLab with email notifications.
You can receive updates about activity in issues, merge requests, epics, and designs.
For the tool that GitLab administrators can use to send messages to users, read
-[Email from GitLab](../../tools/email.md).
+[Email from GitLab](../admin_area/email_from_gitlab.md).
## Who receives notifications
@@ -21,11 +21,14 @@ that happen there.
You might receive notifications for one of the following reasons:
- You participate in an issue, merge request, epic, or design. You become a participant when you comment
- or edit, or someone mentions you.
+ or edit, or someone mentions <sup>1</sup> you.
- You've [enabled notifications in an issue, merge request, or epic](#notifications-on-issues-merge-requests-and-epics).
- You've configured notifications for the [project](#change-level-of-project-notifications) or [group](#group-notifications).
- You're subscribed to group or project pipeline notifications via the pipeline emails [integration](../project/integrations/overview.md).
+1. GitLab doesn't send a notification when
+ [a comment is edited to include a user mention](../discussions/index.md#editing-a-comment-to-add-a-mention).
+
NOTE:
Administrators can block notifications, preventing them from being sent.
@@ -171,26 +174,27 @@ Users are notified of the following events:
<!-- The table is sorted first by recipient, then alphabetically. -->
-| Event | Sent to | Settings level |
-|------------------------------|---------------------|------------------------------|
-| 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. |
-| 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 | User | Security email, always sent. |
-| Personal access tokens have been created | User | Security email, always sent. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/337591) in GitLab 14.9. |
-| 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._ |
-| 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. |
+| Event | Sent to | Settings level |
+|------------------------------------------|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------|
+| 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. |
+| New email address added | User | Security email, sent to primary email address. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/337635) in GitLab 14.9._ |
+| New email address added | User | Security email, sent to newly-added email address. |
+| 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 | User | Security email, always sent. |
+| Personal access tokens have been created | User | Security email, always sent. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/337591) in GitLab 14.9._ |
+| 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._ |
+| 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. |
## Notifications on issues, merge requests, and epics
@@ -241,26 +245,26 @@ 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 and participants mentioned. |
+| Change milestone merge request | Subscribers and participants mentioned. |
| 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._ |
+| Issue due | Participants and Custom notification level with this event selected. |
| Merge merge request | |
| Merge when pipeline succeeds | Author, Participants, Watchers, Subscribers, and Custom notification level with this event selected. Custom notification level is ignored for Author, Watchers and Subscribers. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4._ |
| Merge request [marked as ready](../project/merge_requests/drafts.md) | Watchers and participants. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15332) in GitLab 13.10._ |
-| New 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 | |
+| New note | Participants, Watchers, Subscribers, and Custom notification level with this event selected. Also anyone mentioned by username in the comment, with notification level "Mention" or higher. |
| Push to merge request | Participants and Custom notification level with this event selected. |
| Reassign issue | Participants, Watchers, Subscribers, Custom notification level with this event selected, and the old assignee. |
| Reassign merge request | Participants, Watchers, Subscribers, Custom notification level with this event selected, and the old assignee. |
-| Remove milestone issue | Subscribers, 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. |
+| Remove milestone issue | Subscribers and participants mentioned. |
+| Remove milestone merge request | Subscribers and participants mentioned. |
| Reopen epic | |
| Reopen issue | |
| Reopen merge request | |
@@ -304,7 +308,7 @@ If you no longer wish to receive any email notifications:
**Disabled**.
On self-managed installations, even after doing this, your instance administrator
-[can still email you](../../tools/email.md).
+[can still email you](../admin_area/email_from_gitlab.md).
To unsubscribe, select the unsubscribe link in one of these emails.
## Email headers you can use to filter email
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index 1fbbe438370..4c132094d24 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -98,8 +98,8 @@ A personal access token can perform actions based on the assigned scopes.
| `read_api` | Read-only for the complete API, including all groups and projects, the Container Registry, and the Package Registry. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28944) in GitLab 12.10.) |
| `read_repository` | Read-only (pull) for the repository through `git clone`. |
| `write_repository` | Read-write (pull, push) for the repository through `git clone`. |
-| `read_registry` | Read-only (pull) for [Container Registry](../packages/container_registry/index.md) images if a project is private and authorization is required. |
-| `write_registry` | Read-write (push) for [Container Registry](../packages/container_registry/index.md) images if a project is private and authorization is required. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28958) in GitLab 12.10.) |
+| `read_registry` | Read-only (pull) for [Container Registry](../packages/container_registry/index.md) images if a project is private and authorization is required. Available only when the Container Registry is enabled. |
+| `write_registry` | Read-write (push) for [Container Registry](../packages/container_registry/index.md) images if a project is private and authorization is required. Available only when the Container Registry is enabled. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28958) in GitLab 12.10.) |
| `sudo` | API actions as any user in the system (if the authenticated user is an administrator). |
## When personal access tokens expire
diff --git a/doc/user/profile/preferences.md b/doc/user/profile/preferences.md
index 48160bb97ac..ecd6e83efa1 100644
--- a/doc/user/profile/preferences.md
+++ b/doc/user/profile/preferences.md
@@ -89,6 +89,20 @@ The default syntax theme is White, and you can choose among 5 different themes:
Introduced in GitLab 13.6, the themes [Solarized](https://gitlab.com/gitlab-org/gitlab/-/issues/221034) and [Monokai](https://gitlab.com/gitlab-org/gitlab/-/issues/221034) also apply to the [Web IDE](../project/web_ide/index.md) and [Snippets](../snippets.md).
+## Diff colors
+
+A diff compares the old/removed content with the new/added content (e.g. when
+[reviewing a merge request](../project/merge_requests/reviews/index.md#review-a-merge-request) or in a
+[Markdown inline diff](../markdown.md#inline-diff)).
+Typically, the colors red and green are used for removed and added lines in diffs.
+The exact colors depend on the selected [syntax highlighting theme](#syntax-highlighting-theme).
+The colors may lead to difficulties in case of red–green color blindness.
+
+For this reason, you can customize the following colors:
+
+- Color for removed lines
+- Color for added lines
+
## Behavior
The following settings allow you to customize the behavior of the GitLab layout
diff --git a/doc/user/project/clusters/protect/container_host_security/index.md b/doc/user/project/clusters/protect/container_host_security/index.md
index f6f31ee8f36..c897100f14e 100644
--- a/doc/user/project/clusters/protect/container_host_security/index.md
+++ b/doc/user/project/clusters/protect/container_host_security/index.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
Container Host Security is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-for use in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
+in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
in GitLab 15.0.
Container Host Security in GitLab provides Intrusion Detection and Prevention capabilities that can
diff --git a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
index 25e2f6ddb91..af3128e3006 100644
--- a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
+++ b/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
Container Host Security is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-for use in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
+in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
in GitLab 15.0.
The following steps are recommended for installing Container Host Security.
diff --git a/doc/user/project/clusters/protect/container_network_security/index.md b/doc/user/project/clusters/protect/container_network_security/index.md
index eeaf7e82ef4..b294859c660 100644
--- a/doc/user/project/clusters/protect/container_network_security/index.md
+++ b/doc/user/project/clusters/protect/container_network_security/index.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
Container Network Security is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-for use in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
+in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
in GitLab 15.0.
Container Network Security in GitLab provides basic firewall functionality by leveraging Cilium
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 43f4ea6c326..7671ed7eb73 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
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
Container Network Security is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-for use in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
+in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
in GitLab 15.0.
The following steps are recommended for installing Container Network Security.
diff --git a/doc/user/project/clusters/protect/index.md b/doc/user/project/clusters/protect/index.md
index 3a80132fb50..6b89f7f1557 100644
--- a/doc/user/project/clusters/protect/index.md
+++ b/doc/user/project/clusters/protect/index.md
@@ -12,7 +12,7 @@ WARNING:
The Container Network Security and Container Host Security features are in their end-of-life
processes. They're
[deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-for use in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
+in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
in GitLab 15.0.
GitLab makes it straightforward to protect applications deployed in [connected Kubernetes clusters](index.md).
diff --git a/doc/user/project/code_intelligence.md b/doc/user/project/code_intelligence.md
index f1071af7c1f..7f35caf2a68 100644
--- a/doc/user/project/code_intelligence.md
+++ b/doc/user/project/code_intelligence.md
@@ -48,8 +48,8 @@ After the job succeeds, code intelligence data can be viewed while browsing the
## Find references
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217392) in GitLab 13.2.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/235735) in GitLab 13.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217392) in GitLab 13.2 [with a flag](../../administration/feature_flags.md) named `code_navigation_references`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/225621) in GitLab 13.3. Feature flag `code_navigation_references` removed.
To find where a particular object is being used, you can see links to specific lines of code
under the **References** tab:
diff --git a/doc/user/project/code_owners.md b/doc/user/project/code_owners.md
index fefc27063a6..e37ff560080 100644
--- a/doc/user/project/code_owners.md
+++ b/doc/user/project/code_owners.md
@@ -124,8 +124,8 @@ Only one CODEOWNERS pattern can match per file path.
### Organize Code Owners by putting them into sections
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12137) in GitLab 13.2 behind a feature flag, enabled by default.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42389) in GitLab 13.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12137) in GitLab 13.2 [with a flag](../../administration/feature_flags.md) named `sectional_codeowners`. Disabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42389) in GitLab 13.4. Feature flag `sectional_codeowners` removed.
You can organize Code Owners by putting them into named sections.
@@ -254,6 +254,11 @@ README @group @group/with-nested/subgroup
# `docs/index.md` but not `docs/projects/index.md`:
/docs/* @root-docs
+# Include `/**` to specify Code Owners for all subdirectories
+# in a directory. This rule matches `docs/projects/index.md` or
+# `docs/development/index.md`
+/docs/**/*.md @root-docs
+
# This code makes matches a `lib` directory nested anywhere in the repository:
lib/ @lib-owner
diff --git a/doc/user/project/deploy_keys/img/deploy_keys_v13_0.png b/doc/user/project/deploy_keys/img/deploy_keys_v13_0.png
deleted file mode 100644
index 15e6e71803c..00000000000
--- a/doc/user/project/deploy_keys/img/deploy_keys_v13_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/deploy_keys/index.md b/doc/user/project/deploy_keys/index.md
index b7674be2fa0..8f1da4b278a 100644
--- a/doc/user/project/deploy_keys/index.md
+++ b/doc/user/project/deploy_keys/index.md
@@ -69,7 +69,7 @@ The deploy keys available are listed:
Prerequisites:
- You must have at least the Maintainer role for the project.
-- [Generate an SSH key pair](../../../ssh/index.md#generate-an-ssh-key-pair). Put the private SSH
+- [Generate an SSH key pair](../../ssh.md#generate-an-ssh-key-pair). Put the private SSH
key on the host that requires access to the repository.
1. On the top bar, select **Menu > Projects** and find your project.
@@ -87,7 +87,7 @@ name and permissions.
Prerequisites:
- You must have administrator access.
-- [Generate an SSH key pair](../../../ssh/index.md#generate-an-ssh-key-pair). Put the private SSH
+- [Generate an SSH key pair](../../ssh.md#generate-an-ssh-key-pair). Put the private SSH
key on the host that requires access to the repository.
To create a public deploy key:
diff --git a/doc/user/project/deploy_tokens/index.md b/doc/user/project/deploy_tokens/index.md
index 4d69209aafa..64c18ab6f3b 100644
--- a/doc/user/project/deploy_tokens/index.md
+++ b/doc/user/project/deploy_tokens/index.md
@@ -16,7 +16,9 @@ container registry images of a project without having a user and a password.
Deploy tokens can be managed only by users with the Maintainer role.
-Deploy tokens cannot be used with the GitLab API.
+Deploy tokens can't be used with the GitLab public API. However, you can use deploy tokens with some
+endpoints, such as those from the Package Registry. For details, see
+[Authenticate with the registry](../../packages/package_registry/index.md#authenticate-with-the-registry).
Deploy tokens are tied to the project and stay enabled even when the user who created the token is removed from the project.
diff --git a/doc/user/project/img/promote_to_parent_group_workaround_v14_10.png b/doc/user/project/img/promote_to_parent_group_workaround_v14_10.png
new file mode 100644
index 00000000000..ed4ac9ba234
--- /dev/null
+++ b/doc/user/project/img/promote_to_parent_group_workaround_v14_10.png
Binary files differ
diff --git a/doc/user/project/import/bitbucket.md b/doc/user/project/import/bitbucket.md
index 8c0d9fc422b..b2425686024 100644
--- a/doc/user/project/import/bitbucket.md
+++ b/doc/user/project/import/bitbucket.md
@@ -49,7 +49,7 @@ The importer will create any new namespaces (groups) if they don't exist or in
the case the namespace is taken, the repository will be imported under the user's
namespace that started the import process.
-## Requirements for user-mapped contributions
+## Requirements for user-mapped contributions
For user contributions to be mapped, each user must complete the following before the project import:
@@ -83,7 +83,7 @@ For user contributions to be mapped, each user must complete the following befor
### If you have more than one Bitbucket account
-Be sure to sign in to the correct account.
+Be sure to sign in to the correct account.
If you've accidentally started the import process with the wrong account, follow these steps:
diff --git a/doc/user/project/import/bitbucket_server.md b/doc/user/project/import/bitbucket_server.md
index 4e3642eb3bd..b6241dbbdb0 100644
--- a/doc/user/project/import/bitbucket_server.md
+++ b/doc/user/project/import/bitbucket_server.md
@@ -24,11 +24,10 @@ created as private in GitLab as well.
## Import your Bitbucket repositories
-Prerequisites:
+Prerequisite:
- An administrator must have enabled the **Bitbucket Server** in
**Admin > Settings > General > Visibility and access controls > Import sources**.
-- Review the importer's [limitations](#limitations).
To import your Bitbucket repositories:
@@ -41,24 +40,27 @@ To import your Bitbucket repositories:
1. Select the projects to import, or import all projects. You can filter projects by name and select
the namespace for which to import each project.
-## Limitations
+### Items that are not imported
-- GitLab doesn't allow comments on arbitrary lines of code. Any out-of-bounds Bitbucket comments are
- inserted as comments in the merge request.
-- Bitbucket Server allows multiple threading levels. The importer collapses this into one thread and
- quotes part of the original comment.
-- Declined pull requests have unreachable commits. This prevents the importer from generating a
- proper diff. These pull requests show up as empty changes.
-- Project filtering doesn't support fuzzy search. Only starts with or full match strings are
- supported.
-
-The following aren't imported:
+The following items aren't imported:
- Pull request approvals
- Attachments in Markdown
- Task lists
- Emoji reactions
+### Items that are imported but changed
+
+The following items are changed when they are imported:
+
+- GitLab doesn't allow comments on arbitrary lines of code. Any out-of-bounds Bitbucket comments are
+ inserted as comments in the merge request.
+- Multiple threading levels are collapsed into one thread and
+ quotes are added as part of the original comment.
+- Declined pull requests have unreachable commits. These pull requests show up as empty changes.
+- Project filtering doesn't support fuzzy search. Only **starts with** or **full match** strings are
+ supported.
+
## User assignment
When issues and pull requests are importing, the importer tries to find the author's email address
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index 9f1c049045c..329d91916e8 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -30,7 +30,7 @@ The following aspects of a project are imported:
References to pull requests and issues are preserved (GitLab.com & 8.7+), and
each imported repository maintains visibility level unless that [visibility
-level is restricted](../../../public_access/public_access.md#restrict-use-of-public-or-internal-projects),
+level is restricted](../../public_access.md#restrict-use-of-public-or-internal-projects),
in which case it defaults to the default project visibility.
The namespace is a user or group in GitLab, such as `gitlab.com/janedoe` or
diff --git a/doc/user/project/import/img/gitlab_import_history_page_v14_10.png b/doc/user/project/import/img/gitlab_import_history_page_v14_10.png
new file mode 100644
index 00000000000..c93b5ed2b27
--- /dev/null
+++ b/doc/user/project/import/img/gitlab_import_history_page_v14_10.png
Binary files differ
diff --git a/doc/user/project/import/index.md b/doc/user/project/import/index.md
index 41ef15108ec..432f043f945 100644
--- a/doc/user/project/import/index.md
+++ b/doc/user/project/import/index.md
@@ -30,6 +30,30 @@ repository is too large, the import can timeout.
You can also [connect your external repository to get CI/CD benefits](../../../ci/ci_cd_for_external_repos/index.md).
+## Project import history
+
+You can view all project imports created by you. This list includes the following:
+
+- Source (without credentials for security reasons)
+- Destination
+- Status
+- Error details if the import failed
+
+To view project import history:
+
+1. Sign in to GitLab.
+1. On the top bar, select **New** (**{plus}**).
+1. Select **New project/repository**.
+1. Select **Import project**.
+1. Select **History**.
+
+![Project import history page](img/gitlab_import_history_page_v14_10.png)
+
+The history also includes projects created from [built-in](../working_with_projects.md#create-a-project-from-a-built-in-template)
+or [custom](../working_with_projects.md#create-a-project-from-a-built-in-template)
+templates. GitLab uses [import repository by URL](repo_by_url.md)
+to create a new project from a template.
+
## LFS authentication
When importing a project that contains LFS objects, if the project has an [`.lfsconfig`](https://github.com/git-lfs/git-lfs/blob/master/docs/man/git-lfs-config.5.ronn)
diff --git a/doc/user/project/index.md b/doc/user/project/index.md
index 801c2520bda..60a4ca5c0ea 100644
--- a/doc/user/project/index.md
+++ b/doc/user/project/index.md
@@ -11,7 +11,7 @@ your codebase. You can also use projects to track issues, plan work,
collaborate on code, and continuously build, test, and use
built-in CI/CD to deploy your app.
-Projects can be available [publicly, internally, or privately](../../public_access/public_access.md).
+Projects can be available [publicly, internally, or privately](../public_access.md).
GitLab does not limit the number of private projects you can create.
## Project features
@@ -35,7 +35,7 @@ Projects include the following [features](https://about.gitlab.com/features/):
- [Deploy tokens](deploy_tokens/index.md): Manage access to the repository and Container Registry.
- [Web IDE](web_ide/index.md)
- [CVE ID Requests](../application_security/cve_id_request.md): Request a CVE identifier to track a
- vulnerability in your project. **(FREE SAAS)**
+ vulnerability in your project.
**Issues and merge requests:**
@@ -83,7 +83,7 @@ Projects include the following [features](https://about.gitlab.com/features/):
- [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)**
+ by dynamically toggling functionality.
- [GitLab Pages](pages/index.md): Build, test, and deploy your static
website.
@@ -92,8 +92,8 @@ Projects include the following [features](https://about.gitlab.com/features/):
- [Wiki](wiki/index.md): Document your GitLab project in an integrated Wiki.
- [Snippets](../snippets.md): Store, share and collaborate on code snippets.
- [Value Stream Analytics](../analytics/value_stream_analytics.md): Review your development lifecycle.
-- [Insights](insights/index.md): Configure the insights that matter for your projects. **(ULTIMATE)**
-- [Security Dashboard](../application_security/security_dashboard/index.md) **(ULTIMATE)**
+- [Insights](insights/index.md): Configure the insights that matter for your projects.
+- [Security Dashboard](../application_security/security_dashboard/index.md)
- [Syntax highlighting](highlighting.md): Customize
your code blocks, overriding the default language choice.
- [Badges](badges.md): Add an image to the **Project information** page.
@@ -102,9 +102,9 @@ Projects include the following [features](https://about.gitlab.com/features/):
associated with a released version of your code.
- [Package Registry](../packages/package_registry/index.md): Publish and install packages.
- [Code owners](code_owners.md): Specify code owners for specific files.
-- [License Compliance](../compliance/license_compliance/index.md): Approve and deny licenses for projects. **(ULTIMATE)**
-- [Dependency List](../application_security/dependency_list/index.md): View project dependencies. **(ULTIMATE)**
-- [Requirements](requirements/index.md): Create criteria to check your products against. **(ULTIMATE)**
+- [License Compliance](../compliance/license_compliance/index.md): Approve and deny licenses for projects.
+- [Dependency List](../application_security/dependency_list/index.md): View project dependencies.
+- [Requirements](requirements/index.md): Create criteria to check your products against.
- [Code Intelligence](code_intelligence.md): Navigate code.
## Project integrations
diff --git a/doc/user/project/integrations/asana.md b/doc/user/project/integrations/asana.md
index b4d7790df1d..a10e261f10e 100644
--- a/doc/user/project/integrations/asana.md
+++ b/doc/user/project/integrations/asana.md
@@ -32,8 +32,8 @@ In Asana, create a Personal Access Token.
Complete these steps in GitLab:
-1. Go to the project you want to configure.
-1. Go to the [Integrations page](overview.md#accessing-integrations).
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
1. Select **Asana**.
1. Ensure that the **Active** toggle is enabled.
1. Paste the token you generated in Asana.
diff --git a/doc/user/project/integrations/bugzilla.md b/doc/user/project/integrations/bugzilla.md
index a54a3adc408..4a9a8d62098 100644
--- a/doc/user/project/integrations/bugzilla.md
+++ b/doc/user/project/integrations/bugzilla.md
@@ -14,7 +14,8 @@ You can configure Bugzilla as an
To enable the Bugzilla integration in a project:
-1. Go to the [Integrations page](overview.md#accessing-integrations).
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
1. Select **Bugzilla**.
1. Select the checkbox under **Enable integration**.
1. Fill in the required fields:
diff --git a/doc/user/project/integrations/discord_notifications.md b/doc/user/project/integrations/discord_notifications.md
index ad7719f0e5b..b7e25b815fc 100644
--- a/doc/user/project/integrations/discord_notifications.md
+++ b/doc/user/project/integrations/discord_notifications.md
@@ -26,8 +26,9 @@ and configure it in GitLab.
With the webhook URL created in the Discord channel, you can set up the Discord Notifications service in GitLab.
-1. Navigate to the [Integrations page](overview.md#accessing-integrations) in your project's settings. That is, **Project > Settings > Integrations**.
-1. Select the **Discord Notifications** integration to configure it.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
+1. Select **Discord Notifications**.
1. Ensure that the **Active** toggle is enabled.
1. Check the checkboxes corresponding to the GitLab events for which you want to send notifications to Discord.
1. Paste the webhook URL that you copied from the create Discord webhook step.
diff --git a/doc/user/project/integrations/emails_on_push.md b/doc/user/project/integrations/emails_on_push.md
index 33c197b962e..c1c48c7fb12 100644
--- a/doc/user/project/integrations/emails_on_push.md
+++ b/doc/user/project/integrations/emails_on_push.md
@@ -9,17 +9,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
By enabling this service, you receive email notifications for every change
that is pushed to your project.
-From the [Integrations page](overview.md#accessing-integrations)
-select **Emails on push** service to activate and configure it.
+To enable emails on push:
-In the _Recipients_ area, provide a list of emails separated by spaces or newlines.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
+1. Select **Emails on push**.
+1. In the **Recipients** section, provide a list of emails separated by spaces or newlines.
+1. Configure the following options:
-The following options are available:
-
-- **Push events** - Email is triggered when a push event is received.
-- **Tag push events** - Email is triggered when a tag is created and pushed.
-- **Send from committer** - Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance (such as `user@gitlab.com`).
-- **Disable code diffs** - Don't include possibly sensitive code diffs in notification body.
+ - **Push events** - Email is triggered when a push event is received.
+ - **Tag push events** - Email is triggered when a tag is created and pushed.
+ - **Send from committer** - Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance (such as `user@gitlab.com`).
+ - **Disable code diffs** - Don't include possibly sensitive code diffs in notification body.
| Settings | Notification |
| --- | --- |
diff --git a/doc/user/project/integrations/ewm.md b/doc/user/project/integrations/ewm.md
index bc9b2d59db3..b02f1a06e96 100644
--- a/doc/user/project/integrations/ewm.md
+++ b/doc/user/project/integrations/ewm.md
@@ -14,7 +14,8 @@ This IBM product was [formerly named Rational Team Concert](https://jazz.net/blo
To enable the EWM integration, in a project:
-1. Go to the [Integrations page](overview.md#accessing-integrations).
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
1. Select **EWM**.
1. Select the checkbox under **Enable integration**.
1. Fill in the required fields:
diff --git a/doc/user/project/integrations/gitlab_slack_application.md b/doc/user/project/integrations/gitlab_slack_application.md
index 7e8de776619..2dae02dc093 100644
--- a/doc/user/project/integrations/gitlab_slack_application.md
+++ b/doc/user/project/integrations/gitlab_slack_application.md
@@ -25,8 +25,6 @@ the [Slack App Directory](https://slack.com/apps).
Clicking install takes you to the [GitLab Slack application landing page](https://gitlab.com/-/profile/slack/edit)
where you can select a project to enable the GitLab Slack application for.
-![GitLab Slack application landing page](img/gitlab_slack_app_landing_page.png)
-
## Configuration
Alternatively, you can configure the Slack application with a project's
diff --git a/doc/user/project/integrations/harbor.md b/doc/user/project/integrations/harbor.md
index d66e2222538..2a1b12057aa 100644
--- a/doc/user/project/integrations/harbor.md
+++ b/doc/user/project/integrations/harbor.md
@@ -6,6 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Harbor container registry integration **(FREE)**
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80999) in GitLab 14.9.
+
Use Harbor as the container registry for your GitLab project.
[Harbor](https://goharbor.io/) is an open source registry that can help you manage artifacts across cloud native compute platforms, like Kubernetes and Docker.
@@ -43,7 +45,7 @@ After the Harbor integration is activated:
## Secure your requests to the Harbor APIs
For each API request through the Harbor integration, the credentials for your connection to the Harbor API use
-the `username:password` combination. The following are suggestions for safe use:
+the `username:password` combination. The following are suggestions for safe use:
- Use TLS on the Harbor APIs you connect to.
- Follow the principle of least privilege (for access on Harbor) with your credentials.
diff --git a/doc/user/project/integrations/img/failed_badges.png b/doc/user/project/integrations/img/failed_badges.png
index d44415a8687..5a1f481e54c 100644
--- a/doc/user/project/integrations/img/failed_badges.png
+++ b/doc/user/project/integrations/img/failed_badges.png
Binary files differ
diff --git a/doc/user/project/integrations/img/failed_banner.png b/doc/user/project/integrations/img/failed_banner.png
index ba40c1301d6..4384ce07873 100644
--- a/doc/user/project/integrations/img/failed_banner.png
+++ b/doc/user/project/integrations/img/failed_banner.png
Binary files differ
diff --git a/doc/user/project/integrations/img/gitlab_slack_app_landing_page.png b/doc/user/project/integrations/img/gitlab_slack_app_landing_page.png
deleted file mode 100644
index 57cd35c9f5d..00000000000
--- a/doc/user/project/integrations/img/gitlab_slack_app_landing_page.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/irker.md b/doc/user/project/integrations/irker.md
index 279b139bacd..b2c2aea2c2b 100644
--- a/doc/user/project/integrations/irker.md
+++ b/doc/user/project/integrations/irker.md
@@ -39,9 +39,8 @@ network. For more details, read
## Complete these steps in GitLab
-1. On the top bar, select **Menu > Projects** and find the project you want to
- configure for notifications.
-1. Navigate to the [Integrations page](overview.md#accessing-integrations).
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
1. Select **irker (IRC gateway)**.
1. Ensure that the **Active** toggle is enabled.
1. Optional. Under **Server host**, enter the server host address where `irkerd` runs. If empty,
diff --git a/doc/user/project/integrations/mattermost.md b/doc/user/project/integrations/mattermost.md
index f3f8d900e12..7dd4c1d1a8b 100644
--- a/doc/user/project/integrations/mattermost.md
+++ b/doc/user/project/integrations/mattermost.md
@@ -37,27 +37,25 @@ Display name override is not enabled by default, you need to ask your administra
## Configure GitLab to send notifications to Mattermost
After the Mattermost instance has an incoming webhook set up, you can set up GitLab
-to send the notifications.
-
-Navigate to the [Integrations page](overview.md#accessing-integrations)
-and select the **Mattermost notifications** service. Select the GitLab events
-you want to generate notifications for.
-
-For each event you select, input the Mattermost channel you want to receive the
-notification. You do not need to add the hash sign (`#`).
-
-Then fill in the integration configuration:
-
-- **Webhook**: The incoming webhook URL on Mattermost, similar to
- `http://mattermost.example/hooks/5xo…`.
-- **Username**: Optional. The username shown in messages sent to Mattermost.
- To change the bot's username, provide a value.
-- **Notify only broken pipelines**: If you enable the **Pipeline** event, and you want
- notifications about failed pipelines only.
-- **Branches for which notifications are to be sent**: The branches to send notifications for.
-- **Labels to be notified**: Optional. Labels required for the issue or merge request
- to trigger a notification. Leave blank to notify for all issues and merge requests.
-- **Labels to be notified behavior**: When you use the **Labels to be notified** filter,
- messages are sent when an issue or merge request contains _any_ of the labels specified
- in the filter. You can also choose to trigger messages only when the issue or merge request
- contains _all_ the labels defined in the filter.
+to send the notifications:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
+1. Select **Mattermost notifications**.
+1. Select the GitLab events to generate notifications for. For each event you select, input the Mattermost channel
+ to receive the notification. You do not need to add the hash sign (`#`).
+1. Fill in the integration configuration:
+
+ - **Webhook**: The incoming webhook URL on Mattermost, similar to
+ `http://mattermost.example/hooks/5xo…`.
+ - **Username**: Optional. The username shown in messages sent to Mattermost.
+ To change the bot's username, provide a value.
+ - **Notify only broken pipelines**: If you enable the **Pipeline** event, and you want
+ notifications about failed pipelines only.
+ - **Branches for which notifications are to be sent**: The branches to send notifications for.
+ - **Labels to be notified**: Optional. Labels required for the issue or merge request
+ to trigger a notification. Leave blank to notify for all issues and merge requests.
+ - **Labels to be notified behavior**: When you use the **Labels to be notified** filter,
+ messages are sent when an issue or merge request contains _any_ of the labels specified
+ in the filter. You can also choose to trigger messages only when the issue or merge request
+ contains _all_ the labels defined in the filter.
diff --git a/doc/user/project/integrations/overview.md b/doc/user/project/integrations/overview.md
index 2cb62b8924e..081780e6277 100644
--- a/doc/user/project/integrations/overview.md
+++ b/doc/user/project/integrations/overview.md
@@ -22,9 +22,9 @@ want to configure.
## Integrations listing
-Click on the service links to see further configuration instructions and details.
+Click on the integration links to see further configuration instructions and details.
-| Service | Description | Service hooks |
+| Integration | Description | Integration hooks |
| --------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------- |
| [Asana](asana.md) | Add commit messages as comments to Asana tasks. | **{dotted-circle}** No |
| Assembla | Manage projects. | **{dotted-circle}** No |
@@ -69,7 +69,7 @@ Click on the service links to see further configuration instructions and details
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17874) in GitLab 12.4.
-If a single push includes changes to more than three branches or tags, services
+If a single push includes changes to more than three branches or tags, integrations
supported by `push_hooks` and `tag_push_hooks` events aren't executed.
The number of branches or tags supported can be changed via
@@ -89,12 +89,12 @@ By default, the SSL certificate for outgoing HTTP requests is verified based on
an internal list of Certificate Authorities. This means the certificate cannot
be self-signed.
-You can turn off SSL verification in the configuration settings for [webhooks](webhooks.md#configure-a-webhook)
+You can turn off SSL verification in the configuration settings for [webhooks](webhooks.md#configure-a-webhook-in-gitlab)
and some integrations.
## Troubleshooting integrations
-Some integrations use 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).
+Some integrations use hooks for integration with external applications. To confirm which ones use integration hooks, see the [integrations listing](#integrations-listing) above. Learn more about [troubleshooting integration hooks](webhooks.md#troubleshoot-webhooks).
### Uninitialized repositories
diff --git a/doc/user/project/integrations/pivotal_tracker.md b/doc/user/project/integrations/pivotal_tracker.md
index 8b17f4afaa8..7f5414b86de 100644
--- a/doc/user/project/integrations/pivotal_tracker.md
+++ b/doc/user/project/integrations/pivotal_tracker.md
@@ -37,8 +37,8 @@ In Pivotal Tracker, [create an API token](https://www.pivotaltracker.com/help/ar
Complete these steps in GitLab:
-1. Go to the project you want to configure.
-1. Go to the [Integrations page](overview.md#accessing-integrations).
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
1. Select **Pivotal Tracker**.
1. Ensure that the **Active** toggle is enabled.
1. Paste the token you generated in Pivotal Tracker.
diff --git a/doc/user/project/integrations/prometheus.md b/doc/user/project/integrations/prometheus.md
index 760b5030416..068a2810a53 100644
--- a/doc/user/project/integrations/prometheus.md
+++ b/doc/user/project/integrations/prometheus.md
@@ -62,9 +62,9 @@ GitLab can use these to access the resource. More information about authenticati
service account can be found at Google's documentation for
[Authenticating from a service account](https://cloud.google.com/iap/docs/authentication-howto#authenticating_from_a_service_account).
-1. Navigate to the [Integrations page](overview.md#accessing-integrations) at
- **Settings > Integrations**.
-1. Click the **Prometheus** service.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
+1. Select **Prometheus**.
1. For **API URL**, provide the domain name or IP address of your server, such as
`http://prometheus.example.com/` or `http://192.0.2.1/`.
1. (Optional) In **Google IAP Audience Client ID**, provide the Client ID of the
@@ -73,7 +73,7 @@ service account can be found at Google's documentation for
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/application-security/how-server-side-request-forgery-ssrf).
-1. Click **Save changes**.
+1. Select **Save changes**.
![Configure Prometheus Service](img/prometheus_manual_configuration_v13_2.png)
@@ -83,11 +83,12 @@ You can configure [Thanos](https://thanos.io/) as a drop-in replacement for Prom
with GitLab. Use the domain name or IP address of the Thanos server you'd like
to integrate with.
-1. Navigate to the [Integrations page](overview.md#accessing-integrations).
-1. Click the **Prometheus** service.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
+1. Select **Prometheus**.
1. Provide the domain name or IP address of your server, for example
`http://thanos.example.com/` or `http://192.0.2.1/`.
-1. Click **Save changes**.
+1. Select **Save changes**.
### Precedence with multiple Prometheus configurations
diff --git a/doc/user/project/integrations/prometheus_library/cloudwatch.md b/doc/user/project/integrations/prometheus_library/cloudwatch.md
index e8d611af30d..08488c33ac7 100644
--- a/doc/user/project/integrations/prometheus_library/cloudwatch.md
+++ b/doc/user/project/integrations/prometheus_library/cloudwatch.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab supports automatically detecting and monitoring AWS resources, starting
with the [Elastic Load Balancer](https://aws.amazon.com/elasticloadbalancing/) (ELB).
diff --git a/doc/user/project/integrations/prometheus_library/haproxy.md b/doc/user/project/integrations/prometheus_library/haproxy.md
index 76d13d5487c..ad2cb2681b9 100644
--- a/doc/user/project/integrations/prometheus_library/haproxy.md
+++ b/doc/user/project/integrations/prometheus_library/haproxy.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab has support for automatically detecting and monitoring HAProxy. This is provided by leveraging the [HAProxy Exporter](https://github.com/prometheus/haproxy_exporter), which translates HAProxy statistics into a Prometheus readable form.
diff --git a/doc/user/project/integrations/prometheus_library/index.md b/doc/user/project/integrations/prometheus_library/index.md
index 9bdd4945f5d..aba14e1f3e9 100644
--- a/doc/user/project/integrations/prometheus_library/index.md
+++ b/doc/user/project/integrations/prometheus_library/index.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab offers automatic detection of select [Prometheus exporters](https://prometheus.io/docs/instrumenting/exporters/).
diff --git a/doc/user/project/integrations/prometheus_library/kubernetes.md b/doc/user/project/integrations/prometheus_library/kubernetes.md
index 33a06958e0c..9a9880a0cb6 100644
--- a/doc/user/project/integrations/prometheus_library/kubernetes.md
+++ b/doc/user/project/integrations/prometheus_library/kubernetes.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab has support for automatically detecting and monitoring Kubernetes metrics.
diff --git a/doc/user/project/integrations/prometheus_library/nginx.md b/doc/user/project/integrations/prometheus_library/nginx.md
index ecf75d7b17a..2825066b8b0 100644
--- a/doc/user/project/integrations/prometheus_library/nginx.md
+++ b/doc/user/project/integrations/prometheus_library/nginx.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab has support for automatically detecting and monitoring NGINX. This is provided by leveraging the [NGINX VTS exporter](https://github.com/hnlq715/nginx-vts-exporter), which translates [VTS statistics](https://github.com/vozlt/nginx-module-vts) into a Prometheus readable form.
diff --git a/doc/user/project/integrations/prometheus_library/nginx_ingress.md b/doc/user/project/integrations/prometheus_library/nginx_ingress.md
index e123000e0c5..6e751b907eb 100644
--- a/doc/user/project/integrations/prometheus_library/nginx_ingress.md
+++ b/doc/user/project/integrations/prometheus_library/nginx_ingress.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab has support for automatically detecting and monitoring the Kubernetes NGINX Ingress controller. This is provided by leveraging the built-in Prometheus metrics included with Kubernetes NGINX Ingress controller [version 0.16.0](https://github.com/kubernetes/ingress-nginx/blob/master/Changelog.md#0160) onward.
diff --git a/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md b/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md
index fda7744e847..e1eee649f0a 100644
--- a/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md
+++ b/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+in GitLab 14.7, and is planned for removal in GitLab 16.0.
NOTE:
[NGINX Ingress version 0.16](nginx_ingress.md) and above have built-in Prometheus metrics, which are different than the VTS based metrics.
diff --git a/doc/user/project/integrations/redmine.md b/doc/user/project/integrations/redmine.md
index 05d7c31a288..bcab8d05f69 100644
--- a/doc/user/project/integrations/redmine.md
+++ b/doc/user/project/integrations/redmine.md
@@ -10,7 +10,8 @@ Use [Redmine](https://www.redmine.org/) as the issue tracker.
To enable the Redmine integration in a project:
-1. Go to the [Integrations page](overview.md#accessing-integrations).
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
1. Select **Redmine**.
1. Select the checkbox under **Enable integration**.
1. Fill in the required fields:
diff --git a/doc/user/project/integrations/slack_slash_commands.md b/doc/user/project/integrations/slack_slash_commands.md
index cddb72a83b2..5ad344a7d8e 100644
--- a/doc/user/project/integrations/slack_slash_commands.md
+++ b/doc/user/project/integrations/slack_slash_commands.md
@@ -18,7 +18,7 @@ For GitLab.com, use the [GitLab Slack app](gitlab_slack_application.md) instead.
## Configure GitLab and Slack
-Slack slash command [integrations](overview.md#accessing-integrations)
+Slack slash command integrations
are scoped to a project.
1. In GitLab, on the top bar, select **Menu > Projects** and find your project.
diff --git a/doc/user/project/integrations/unify_circuit.md b/doc/user/project/integrations/unify_circuit.md
index daab24a8ab9..1e607d89e80 100644
--- a/doc/user/project/integrations/unify_circuit.md
+++ b/doc/user/project/integrations/unify_circuit.md
@@ -15,7 +15,8 @@ copy its URL.
In GitLab:
-1. Go to the [Integrations page](overview.md#accessing-integrations) in your project's settings.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
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.
diff --git a/doc/user/project/integrations/webhook_events.md b/doc/user/project/integrations/webhook_events.md
index d37196ec114..2bf6b4bbe01 100644
--- a/doc/user/project/integrations/webhook_events.md
+++ b/doc/user/project/integrations/webhook_events.md
@@ -203,7 +203,7 @@ The `assignee` and `assignee_id` keys are deprecated
and contain the first assignee only.
The `escalation_status` and `escalation_policy` fields are
-only available for issue types which support escalations,
+only available for issue types which [support escalations](../../../operations/incident_management/paging.md#paging),
such as incidents.
Request header:
@@ -538,6 +538,32 @@ Payload example:
"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,
+ "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
+ }
+ ],
"source":{
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md
index e823391401d..f4f5b3f545b 100644
--- a/doc/user/project/integrations/webhooks.md
+++ b/doc/user/project/integrations/webhooks.md
@@ -48,7 +48,7 @@ specific to a group, including:
- [Group member events](webhook_events.md#group-member-events)
- [Subgroup events](webhook_events.md#subgroup-events)
-## Configure a webhook
+## Configure a webhook in GitLab
You can configure a webhook for a group or a project.
@@ -60,6 +60,72 @@ You can configure a webhook for a group or a project.
1. Optional. Clear the **Enable SSL verification** checkbox to disable [SSL verification](overview.md#ssl-verification).
1. Select **Add webhook**.
+## Configure your webhook receiver endpoint
+
+Webhook receivers should be *fast* and *stable*.
+Slow and unstable receivers may be disabled temporarily to ensure system reliability.
+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.
+ You should aim for sub-second response times in all circumstances.
+ If the response takes longer than the configured timeout, GitLab assumes the
+ hook failed, which can lead to retries and potentially cause duplicate
+ events.
+ 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 usually ignores the HTTP status code returned by your endpoint,
+ unless the [`web_hooks_disable_failed` feature flag is set](#failing-webhooks).
+
+Best practices for a webhook receiver:
+
+- Prefer to return `200` or `201` status responses.
+ Only return error statuses (in the `4xx` range) to
+ indicate that the webhook has been misconfigured. For example, if your receiver
+ only supports push events, it is acceptable to return `400` if sent an issue
+ payload, since that is an indication that the hook has been set up
+ incorrectly. Alternatively, it is acceptable to ignore unrecognized event
+ payloads. Never return `500` status responses if the event has been handled.
+- Your service should be idempotent. In some circumstances (including
+ timeouts), the same event may be sent twice. Be prepared to handle duplicate
+ events. You can reduce the chances of this by ensuring that your endpoint is
+ reliably fast and stable.
+- Keep response payloads as short as possible. Empty responses are
+ fine. GitLab does not examine the response body, and it is only
+ stored so you can examine it later in the logs.
+- Limit the number and size of response headers. Only send headers that would
+ help you diagnose problems when examining the web hook logs.
+- To support fast response times, perform I/O or computationally intensive
+ operations asynchronously. You may indicate that the webhook is
+ asynchronous by returning `201`.
+
+### Failing webhooks
+
+> - Introduced in GitLab 13.12 [with a flag](../../../administration/feature_flags.md) named `web_hooks_disable_failed`. Disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/329849) in GitLab 14.9.
+
+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 `web_hooks_disable_failed`.
+The feature is not ready for production use.
+
+If a webhook fails repeatedly, it may be disabled automatically.
+
+Webhooks that return response codes in the `5xx` range are understood to be failing
+intermittently, and are temporarily disabled. This lasts initially
+for 10 minutes. If the hook continues to fail, the back-off period is
+extended on each retry, up to a maximum disabled period of 24 hours.
+
+Webhooks that return failure codes in the `4xx` range are understood to be
+misconfigured, and these are disabled until you manually re-enable
+them. These webhooks are not automatically retried.
+
+See [troubleshooting](#troubleshoot-webhooks) for information on
+how to see if a webhook is disabled, and how to re-enable it.
+
## Test a webhook
You can trigger a webhook manually, to ensure it's working properly. You can also send
@@ -131,47 +197,7 @@ that the request is legitimate.
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.
-
-## HTTP responses for your endpoint
-
-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 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 usually ignores the HTTP status code returned by your endpoint,
- unless the [`web_hooks_disable_failed` feature flag is set](#failing-webhooks).
-
-### Failing webhooks
-
-> - Introduced in GitLab 13.12 [with a flag](../../../administration/feature_flags.md) named `web_hooks_disable_failed`. Disabled by default.
-> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/329849) in GitLab 14.9.
-
-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 `web_hooks_disable_failed`.
-The feature is not ready for production use.
-
-If a webhook fails repeatedly, it may be disabled automatically.
-
-Webhooks that return response codes in the `5xx` range are understood to be failing
-intermittently, and are temporarily disabled. This lasts initially
-for 10 minutes. If the hook continues to fail, the back-off period is
-extended on each retry, up to a maximum disabled period of 24 hours.
-
-Webhooks that return failure codes in the `4xx` range are understood to be
-misconfigured, and these are disabled until you manually re-enable
-them. These webhooks are not automatically retried.
-
-See [troubleshooting](#troubleshoot-webhooks) for information on
-how to see if a webhook is disabled, and how to re-enable it.
+in the [webhook settings](#configure-a-webhook-in-gitlab) in your project.
## How image URLs are displayed in the webhook body
@@ -220,7 +246,7 @@ To view the table:
- **Fails to connect** if it is temporarily disabled and will retry later.
![Badges on failing webhooks](img/failed_badges.png)
-
+
1. Select **Edit** for the webhook you want to view.
The table includes the following details about each request:
diff --git a/doc/user/project/integrations/youtrack.md b/doc/user/project/integrations/youtrack.md
index eda0874ac08..6c70a5e679b 100644
--- a/doc/user/project/integrations/youtrack.md
+++ b/doc/user/project/integrations/youtrack.md
@@ -14,7 +14,8 @@ You can configure YouTrack as an
To enable the YouTrack integration in a project:
-1. Go to the [Integrations page](overview.md#accessing-integrations).
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
1. Select **YouTrack**.
1. Select the checkbox under **Enable integration**.
1. Fill in the required fields:
diff --git a/doc/user/project/issues/design_management.md b/doc/user/project/issues/design_management.md
index e7bb5ad4eeb..e5dde0ed451 100644
--- a/doc/user/project/issues/design_management.md
+++ b/doc/user/project/issues/design_management.md
@@ -9,259 +9,265 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/660) in GitLab 12.2.
> - Support for SVGs [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12771) in GitLab 12.4.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) from GitLab Premium to GitLab Free in 13.0.
+> - Design Management section in issues [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223193) in GitLab 13.2, with a feature flag named `design_management_moved`. In earlier versions, designs were displayed in a separate tab.
+> - Design Management section in issues [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/223197) for new displays in GitLab 13.4.
-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 a single source of truth.
+With Design Management you can upload design assets (including wireframes and mockups)
+to GitLab issues and keep them stored in a single place. Product designers, product managers, and
+engineers can collaborate on designs with a single source of truth.
-You can share mock-ups of designs with your team, or visual regressions can be
+You can share mockups of designs with your team, or visual regressions can be
viewed and addressed.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, see the video [Design Management (GitLab 12.2)](https://www.youtube.com/watch?v=CCMtCqdK_aM).
+For a video overview, see [Design Management (GitLab 12.2)](https://www.youtube.com/watch?v=CCMtCqdK_aM).
## Requirements
-Design Management requires
-[Large File Storage (LFS)](../../../topics/git/lfs/index.md)
-to be enabled:
+- [Git Large File Storage (LFS)](../../../topics/git/lfs/index.md) must be enabled:
+ - On GitLab.com, LFS is already enabled.
+ - On self-managed instances, a GitLab administrator must
+ [enable LFS globally](../../../administration/lfs/index.md).
+ - On both GitLab.com and self-managed instances, LFS must be
+ [enabled for the project itself](../settings/index.md#sharing-and-permissions).
+ If enabled globally, LFS is enabled by default for all projects. If you have
+ disabled it for your project, you must enable it again.
-- For GitLab.com, LFS is already enabled.
-- For self-managed instances, a GitLab administrator must have
- [enabled LFS globally](../../../administration/lfs/index.md).
-- For both GitLab.com and self-managed instances: LFS must be enabled for the project itself.
- If enabled globally, LFS is enabled by default to all projects. To enable LFS on the
- project level, navigate to your project's **Settings > General**, expand **Visibility, project features, permissions**
- and enable **Git Large File Storage**.
+ Designs are stored as LFS objects.
+ Image thumbnails are stored as other uploads, and are not associated with a project but rather
+ with a specific design model.
-Design Management also requires that projects are using
-[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`.
+- Projects must use
+ [hashed storage](../../../administration/raketasks/storage.md#migrate-to-hashed-storage).
-If the requirements are not met, the **Designs** tab displays a message to the user.
+ Newly created projects use hashed storage by default.
-## Supported files
+ 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`.
-Files uploaded must have a file extension of either `png`, `jpg`, `jpeg`,
-`gif`, `bmp`, `tiff`, `ico`, `webp`, or `svg`.
+If the requirements are not met, you are notified in the **Designs** section.
-Support for PDF is tracked [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/32811).
+## Supported file types
-## Limitations
+You can upload files of the following types as designs:
-- Design uploads are limited to 10 files at a time.
-- From GitLab 13.1, Design filenames are limited to 255 characters.
-- Design Management data
- [isn't deleted when a project is destroyed](https://gitlab.com/gitlab-org/gitlab/-/issues/13429) yet.
-- Design Management data [isn't deleted](https://gitlab.com/gitlab-org/gitlab/-/issues/13427)
- when an issue is deleted.
-- From GitLab 12.7, Design Management data [can be replicated](../../../administration/geo/replication/datatypes.md#limitations-on-replicationverification)
+- BMP
+- GIF
+- ICO
+- JPEG
+- JPG
+- PNG
+- SVG
+- TIFF
+- WEBP
+
+Support for PDF files is tracked in [issue 32811](https://gitlab.com/gitlab-org/gitlab/-/issues/32811).
+
+## Known issues
+
+- Design Management data isn't deleted when:
+ - [A project is destroyed](https://gitlab.com/gitlab-org/gitlab/-/issues/13429).
+ - [An issue is deleted](https://gitlab.com/gitlab-org/gitlab/-/issues/13427).
+- In GitLab 12.7 and later, Design Management data [can be replicated](../../../administration/geo/replication/datatypes.md#limitations-on-replicationverification)
by Geo but [not verified](https://gitlab.com/gitlab-org/gitlab/-/issues/32467).
-- Only the latest version of the designs can be deleted.
-- Deleted designs cannot be recovered but you can see them on previous designs versions.
-## GitLab-Figma plugin
+## View a design
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-figma-plugin/-/issues/2) in GitLab 13.2.
+The **Designs** section is in the issue description.
+
+Prerequisites:
+
+- You must have at least the Guest role for the project.
+
+To view a design:
+
+1. Go to an issue.
+1. In the **Designs** section, select the design image you want to view.
+
+The design you selected opens. You can then [zoom in](#zoom-in-on-a-design) on it or
+[create a comment](#add-a-comment-to-a-design).
-Connect your design environment with your source code management in a seamless workflow. The GitLab-Figma plugin makes it quick and easy to collaborate in GitLab by bringing the work of product designers directly from Figma to GitLab Issues as uploaded Designs.
+![Designs section](img/design_management_v14_10.png)
-To use the plugin, install it from the [Figma Directory](https://www.figma.com/community/plugin/860845891704482356)
-and connect to GitLab through a personal access token. The details are explained in the [plugin documentation](https://gitlab.com/gitlab-org/gitlab-figma-plugin/-/wikis/home).
+When viewing a design, you can move to other designs. To do so, either:
-## The Design Management section
+- In the top-right corner, select **Go to previous design** (**{angle-left}**) or **Go to next design** (**{angle-right}**).
+- Press <kbd>Left</kbd> or <kbd>Right</kbd> on your keyboard.
-> - [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.
+To return to the issue view, either:
-You can find to the **Design Management** section in the issue description:
+- In the top-left corner, select the close icon (**{close}**).
+- Press <kbd>Esc</kbd> on your keyboard.
-![Designs section](img/design_management_v13_2.png)
+When a design is added, a green icon (**{plus-square}**) is displayed on the image
+thumbnail. When a design has been [changed](#add-a-new-version-of-a-design) in the current version,
+a blue icon (**{file-modified-solid}**) is displayed.
-## Adding designs
+### Zoom in on a design
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13217) in GitLab 12.7.
+> - Ability to drag a zoomed image to move it [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/197324) in GitLab 12.10.
+
+You can explore a design in more detail by zooming in and out of the image:
+
+- To control the amount of zoom, select plus (`+`) and minus (`-`)
+ at the bottom of the image.
+- To reset the zoom level, select the redo icon (**{redo}**).
+
+To move around the image while zoomed in, drag the image.
+
+## Add a design to an issue
> - Drag and drop uploads [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) in GitLab 12.9.
> - New version creation on upload [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) in GitLab 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) from GitLab Premium to GitLab Free in 13.0.
-To upload Design images, drag files from your computer and drop them in the Design Management section,
-or select **click to upload** to select images from your file browser:
+Prerequisites:
-![Designs empty state](img/design_management_upload_v13.3.png)
+- You must have at least the Developer role for the project.
+- In GitLab 13.1 and later, the names of the uploaded files must be no longer than 255 characters.
-You can drag and drop designs onto the dedicated drop zone to upload them.
+To add a design to an issue:
-![Drag and drop design uploads](img/design_drag_and_drop_uploads_v13_2.png)
+1. Go to an issue.
+1. Either:
+ - Select **Upload designs** and then select images from your file browser. You can select up to
+ 10 files at once.
+ <!-- vale gitlab.SubstitutionWarning = NO -->
+ - Select **click to upload** and then select images from your file browser. You can select up to
+ 10 files at once.
+ <!-- vale gitlab.SubstitutionWarning = YES -->
-You can also copy images from your file system and paste them directly on the
-GitLab Design page as a new design.
+ - Drag a file from your file browser and drop it in the drop zone in the **Designs** section.
-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.
+ ![Drag and drop design uploads](img/design_drag_and_drop_uploads_v13_2.png)
-Copy-and-pasting has some limitations:
+ - Take a screenshot or copy a local image file into your clipboard, hover your cursor over the
+ drop zone, and press <kbd>Control</kbd> or <kbd>Cmd</kbd> + <kbd>V</kbd>.
-- You can paste only one image at a time. When copy/pasting multiple files, only the first one is uploaded.
-- All images are converted to `png` format under the hood, so when you want to copy/paste `gif` file, it results in broken animation.
-- If you are pasting a screenshot from the clipboard, it is renamed to `design_<timestamp>.png`
-- Copy/pasting designs is not supported on Internet Explorer.
+ When pasting images like this, keep the following in mind:
-Designs with the same filename as an existing uploaded design create a new version
-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
+ - You can paste only one image at a time. When you paste multiple copied files, only the first
+ one is uploaded.
+ - If you are pasting a screenshot, the image is added as a PNG file with a generated name of:
+ `design_<timestamp>.png`.
+ - It's not supported in Internet Explorer.
-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 by a warning
-message on the Issue.
+## Add a new version of a design
-## Viewing designs
+As discussion on a design continues, you might want to upload a new version of a design.
-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.
+Prerequisites:
-The number of discussions on a design — if any — is listed to the right
-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.
+- You must have at least the Developer role for the project.
-| Indicator | Example |
-| --------- | ------- |
-| Discussions | ![Discussions Icon](img/design_comments_v12_3.png) |
-| Modified (in the selected version) | ![Design Modified](img/design_modified_v12_3.png) |
-| Added (in the selected version) | ![Design Added](img/design_added_v12_3.png) |
+To do so, [add a design](#add-a-design-to-an-issue) with the same filename.
-### Exploring designs by zooming
+To browse all the design versions, use the dropdown list at the top of the **Designs** section.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13217) in GitLab 12.7.
-> - Ability to drag a zoomed image to move it [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/197324) in GitLab 12.10.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) from GitLab Premium 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.
-While zoomed in, you can drag the image to move around it.
+### Skipped designs
-![Design zooming](img/design_zooming_v12_7.png)
+When you upload an image with the same filename as an existing uploaded design _and_ that is the
+same, it's skipped. This means that no new version of the design is created.
+When designs are skipped, a warning message is displayed.
-## Deleting designs
+## Archive a design
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11089) in GitLab 12.4.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) from GitLab Premium to GitLab Free in 13.0.
+> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/220964) the button from "Delete" to "Archive" in GitLab 13.3.
-There are two ways to delete designs: manually delete them
-individually, or select a few of them to delete at once,
-as shown below.
+You can archive individual designs or select a few of them to archive at once.
-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:
+Prerequisites:
-![Confirm design deletion](img/confirm_design_deletion_v12_4.png)
+- You must have at least the Developer role for the project.
-To delete multiple designs at once, on the design's list view,
-first select the designs you want to delete:
+To archive a single design:
-![Select designs](img/select_designs_v12_4.png)
+1. Select the design to view it enlarged.
+1. In the top right corner, select **Archive design** (**{archive}**).
+1. Select **Archive designs**.
-Select **Delete selected** to confirm the deletion:
+To archive multiple designs at once:
-![Delete multiple designs](img/delete_multiple_designs_v12_4.png)
+1. Select the checkboxes on the designs you want to archive.
+1. Select **Archive selected**.
NOTE:
-Only the latest version of the designs can be deleted.
-Deleted designs are not permanently lost; they can be
-viewed by browsing previous versions.
+Only the latest version of the designs can be archived.
+Archived designs are not permanently lost. You can browse
+[previous versions](#add-a-new-version-of-a-design).
-## Reordering designs
+## Reorder designs
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34382) in GitLab 13.3.
You can change the order of designs by dragging them to a new position.
-## Starting discussions on designs
-
-> - Adjusting a pin's position [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) adjusting a pin's position in GitLab 12.8.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) from GitLab Premium to GitLab Free in 13.0.
+## Add a comment to a design
-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.
+> Adjusting a pin's position [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) in GitLab 12.8.
-![Starting a new discussion on design](img/adding_note_to_design_1.png)
+You can start [discussions](../../discussions/index.md) on uploaded designs. To do so:
-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.
+<!-- vale gitlab.SubstitutionWarning = NO -->
+1. Go to an issue.
+1. Select the design.
+1. Click or tap the image. A pin is created in that spot, identifying the discussion's location.
+1. Enter your message.
+1. Select **Comment**.
+<!-- vale gitlab.SubstitutionWarning = YES -->
-Different discussions have different pin numbers:
+You can adjust a pin's position by dragging it around the image. You can use this when your design's
+layout has changed, or when you want to move a pin to add a new one in its place.
-![Discussions on designs](img/adding_note_to_design_2.png)
+New discussion threads get different pin numbers, which you can use to refer to them.
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
+## Resolve a discussion thread on a design
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13049) in GitLab 13.1.
-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 selecting the checkmark icon for **Resolve thread** in the top-right corner of the first comment of the discussion:
+When you're done discussing part of a design, you can resolve the discussion thread.
- ![Resolve thread icon](img/resolve_design-discussion_icon_v13_1.png)
+To mark a thread as resolved or unresolved, either:
-1. Design threads can also be resolved or unresolved in their threads by using a checkbox.
- When replying to a comment, you can select or clear a checkbox to resolve or unresolve
- the thread after publishing:
+- In the top-right corner of the first comment of the discussion, select **Resolve thread** or **Unresolve thread** (**{check-circle}**).
+- Add a new comment to the thread and select or clear the **Resolve thread** checkbox.
- ![Resolve checkbox](img/resolve_design-discussion_checkbox_v13_1.png)
+Resolving a discussion thread also marks any pending [to-do items](../../todos.md) related to notes
+inside the thread as done. Only to-do items for the user triggering the action are affected.
-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.
+Your resolved comment pins disappear from the design to free up space for new discussions.
+To revisit a resolved discussion, expand **Resolved Comments** below the visible threads.
-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.
-
-## Add to-do items for designs
+## Add a to-do item for a design
> - [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 selecting **Add a to do** on the design sidebar:
-
-![To-do button](img/design_todo_button_v13_5.png)
+To add a [to-do item](../../todos.md) for a design, select **Add a to do** on the design sidebar.
-## Referring to designs in Markdown
+## Refer to a design 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.
-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.
+To refer to a design in a [Markdown](../../markdown.md) text box in GitLab, for example, in
+a comment or description, paste its URL. It's then displayed as a short reference.
-Full URL references are supported. For example, if we refer to a design
-somewhere with:
+For example, if you refer to a design somewhere with:
```markdown
-See https://gitlab.com/your-group/your-project/-/issues/123/designs/homescreen.png
+See https://gitlab.com/gitlab-org/gitlab/-/issues/13195/designs/Group_view.png.
```
-This is rendered as:
+It's rendered as:
-> See [#123[homescreen.png]](https://gitlab.com/your-group/your-project/-/issues/123/designs/homescreen.png)
+> See [#13195[Group_view.png]](https://gitlab.com/gitlab-org/gitlab/-/issues/13195/designs/Group_view.png).
## Design activity records
@@ -272,3 +278,15 @@ User activity events on designs (creation, deletion, and updates) are tracked by
displayed on the [user profile](../../profile/index.md#access-your-user-profile),
[group](../../group/index.md#view-group-activity),
and [project](../working_with_projects.md#view-project-activity) activity pages.
+
+## GitLab-Figma plugin
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-figma-plugin/-/issues/2) in GitLab 13.2.
+
+You can use the GitLab-Figma plugin to upload your designs from Figma directly to your issues
+in GitLab.
+
+To use the plugin in Figma, install it from the [Figma Directory](https://www.figma.com/community/plugin/860845891704482356)
+and connect to GitLab through a personal access token.
+
+For more information, see the [plugin documentation](https://gitlab.com/gitlab-org/gitlab-figma-plugin/-/wikis/home).
diff --git a/doc/user/project/issues/img/adding_note_to_design_1.png b/doc/user/project/issues/img/adding_note_to_design_1.png
deleted file mode 100644
index 3c25fcb1241..00000000000
--- a/doc/user/project/issues/img/adding_note_to_design_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/adding_note_to_design_2.png b/doc/user/project/issues/img/adding_note_to_design_2.png
deleted file mode 100644
index c418a0364c0..00000000000
--- a/doc/user/project/issues/img/adding_note_to_design_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/confirm_design_deletion_v12_4.png b/doc/user/project/issues/img/confirm_design_deletion_v12_4.png
deleted file mode 100644
index 5631b6ec98e..00000000000
--- a/doc/user/project/issues/img/confirm_design_deletion_v12_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/delete_multiple_designs_v12_4.png b/doc/user/project/issues/img/delete_multiple_designs_v12_4.png
deleted file mode 100644
index 40d449d5b39..00000000000
--- a/doc/user/project/issues/img/delete_multiple_designs_v12_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/design_added_v12_3.png b/doc/user/project/issues/img/design_added_v12_3.png
deleted file mode 100644
index 92aa953db8e..00000000000
--- a/doc/user/project/issues/img/design_added_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/design_comments_v12_3.png b/doc/user/project/issues/img/design_comments_v12_3.png
deleted file mode 100644
index c01a8bb7ba7..00000000000
--- a/doc/user/project/issues/img/design_comments_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/design_drag_and_drop_uploads_v13_2.png b/doc/user/project/issues/img/design_drag_and_drop_uploads_v13_2.png
index 4ab5e184905..0225505e829 100644
--- a/doc/user/project/issues/img/design_drag_and_drop_uploads_v13_2.png
+++ b/doc/user/project/issues/img/design_drag_and_drop_uploads_v13_2.png
Binary files differ
diff --git a/doc/user/project/issues/img/design_management_upload_v13.3.png b/doc/user/project/issues/img/design_management_upload_v13.3.png
deleted file mode 100644
index f7b3f79fb22..00000000000
--- a/doc/user/project/issues/img/design_management_upload_v13.3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/design_management_v13_2.png b/doc/user/project/issues/img/design_management_v13_2.png
deleted file mode 100644
index 3da11c92514..00000000000
--- a/doc/user/project/issues/img/design_management_v13_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/design_management_v14_10.png b/doc/user/project/issues/img/design_management_v14_10.png
new file mode 100644
index 00000000000..a10be15eafd
--- /dev/null
+++ b/doc/user/project/issues/img/design_management_v14_10.png
Binary files differ
diff --git a/doc/user/project/issues/img/design_modified_v12_3.png b/doc/user/project/issues/img/design_modified_v12_3.png
deleted file mode 100644
index 01b752fa531..00000000000
--- a/doc/user/project/issues/img/design_modified_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/design_todo_button_v13_5.png b/doc/user/project/issues/img/design_todo_button_v13_5.png
deleted file mode 100644
index 970161a6097..00000000000
--- a/doc/user/project/issues/img/design_todo_button_v13_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/design_zooming_v12_7.png b/doc/user/project/issues/img/design_zooming_v12_7.png
deleted file mode 100644
index 4966af06e41..00000000000
--- a/doc/user/project/issues/img/design_zooming_v12_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/resolve_design-discussion_checkbox_v13_1.png b/doc/user/project/issues/img/resolve_design-discussion_checkbox_v13_1.png
deleted file mode 100644
index 8791419b919..00000000000
--- a/doc/user/project/issues/img/resolve_design-discussion_checkbox_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/resolve_design-discussion_icon_v13_1.png b/doc/user/project/issues/img/resolve_design-discussion_icon_v13_1.png
deleted file mode 100644
index fc1fff321ba..00000000000
--- a/doc/user/project/issues/img/resolve_design-discussion_icon_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/select_designs_v12_4.png b/doc/user/project/issues/img/select_designs_v12_4.png
deleted file mode 100644
index fe1c55a4ae2..00000000000
--- a/doc/user/project/issues/img/select_designs_v12_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/issue_data_and_actions.md b/doc/user/project/issues/issue_data_and_actions.md
deleted file mode 100644
index e9f3f4be1c3..00000000000
--- a/doc/user/project/issues/issue_data_and_actions.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2022-02-24'
----
-
-This file was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after <2022-02-24>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index 58591129d97..4508ef30ac5 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -342,7 +342,7 @@ To do it:
issues.each do |issue|
if issue.state != "closed" && issue.moved_to.nil?
- Issues::MoveService.new(project, admin_user).execute(issue, target_project)
+ Issues::MoveService.new(project: project, current_user: admin_user).execute(issue, target_project)
else
puts "issue with id: #{issue.id} and title: #{issue.title} was not moved"
end
diff --git a/doc/user/project/issues/sorting_issue_lists.md b/doc/user/project/issues/sorting_issue_lists.md
index 9311ef590df..95a7e9387e8 100644
--- a/doc/user/project/issues/sorting_issue_lists.md
+++ b/doc/user/project/issues/sorting_issue_lists.md
@@ -6,20 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Sorting and ordering issue lists **(FREE)**
-You can sort a list of issues several ways, including by:
-
-- [Blocking issues](#sorting-by-blocking-issues)
-- [Created date](#sorting-by-created-date)
-- [Due date](#sorting-by-due-date)
-- [Label priority](#sorting-by-label-priority)
-- [Last updated](#sorting-by-last-updated)
-- [Manual sorting](#manual-sorting)
-- [Milestone due date](#sorting-by-milestone-due-date)
-- [Popularity](#sorting-by-popularity)
-- [Priority](#sorting-by-priority)
-- [Title](#sorting-by-title)
-- [Weight](#sorting-by-weight)
-
+You can sort a list of issues several ways.
The available sorting options can change based on the context of the list.
## Sorting by blocking issues **(PREMIUM)**
@@ -51,10 +38,10 @@ For more information, see [issue 14523](https://gitlab.com/gitlab-org/gitlab/-/i
To learn how to change label priority, see [Label priority](../labels.md#set-label-priority).
-## Sorting by last updated
+## Sorting by updated date
-When you sort by **Last updated**, the issue list changes to sort by the time of a last
-update. Issues changed the most recently are first.
+When you sort by **Updated date**, the issue list changes to sort by the time of a last
+update. Issues changed the most recently are shown first.
## Manual sorting
diff --git a/doc/user/project/labels.md b/doc/user/project/labels.md
index 18197cd860f..2cc23b14857 100644
--- a/doc/user/project/labels.md
+++ b/doc/user/project/labels.md
@@ -253,6 +253,35 @@ with the old labels are assigned to the new group label.
The new group label has the same ID as the previous project label.
+## Promote a subgroup label to the parent group
+
+It's not possible to directly promote a group label to the parent group.
+To achieve this, use the following workaround.
+
+Prerequisites:
+
+- There must be a group that contains subgroups ("parent group").
+- There must be a subgroup in the parent group, that has a label you want to promote.
+- You must have at least the Reporter role for both groups.
+
+To "promote" the label to the parent group:
+
+1. In the parent group, [create a label](#create-a-group-label) with the same name as the original
+ one. We recommend making it a different color so you don't mistake the two while you're doing this.
+1. In the subgroup, [view its labels](#view-group-labels). You should see the two labels and where
+ they come from:
+
+ ![parent group and subgroup labels in the subgroup's label list](img/promote_to_parent_group_workaround_v14_10.png)
+
+1. Next to the subgroup label (the old one), select **Issues**, **Merge requests**, or **Epics**.
+1. Add the new label to issues, merge requests, and epics that have the old label.
+ To do it faster, use [bulk editing](issues/managing_issues.md#bulk-edit-issues-from-a-group).
+1. In the subgroup or the parent group, [delete the label](#delete-a-group-label) that belongs to
+ the lower-level group.
+
+You should now have a label in the parent group that is named the same as the old one, and added
+to the same issues, MRs, and epics.
+
## Generate default project labels
If a project or its parent group has no labels, you can generate a default set of project
@@ -420,6 +449,22 @@ The labels higher in the list get higher priority.
To learn what happens when you sort by priority or label priority, see
[Sorting and ordering issue lists](issues/sorting_issue_lists.md).
+## Real-time changes to labels
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241538) in GitLab 14.10 with a [feature flag](../../administration/feature_flags.md) named `realtime_labels`, disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an
+administrator to [enable the feature flag](../../administration/feature_flags.md) named `realtime_labels`.
+On GitLab.com, this feature is unavailable.
+
+Changed labels are immediately visible to other users, without refreshing the page, on the following:
+
+- Epics
+- Incidents
+- Issues
+- Merge requests
+
## Troubleshooting
### Some label titles end with `_duplicate<number>`
diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md
index c3d5dca0675..ff4677eddde 100644
--- a/doc/user/project/members/index.md
+++ b/doc/user/project/members/index.md
@@ -1,6 +1,6 @@
---
stage: Manage
-group: Authentication and Authorization
+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
---
@@ -49,7 +49,7 @@ flowchart RL
[Feature flag `invite_members_group_modal`](https://gitlab.com/gitlab-org/gitlab/-/issues/352526) removed.
Add users to a project so they become members and have permission
-to perform actions.
+to perform actions. The Owner [role](../../permissions.md#project-members-permissions) can only be added at the group level.
Prerequisite:
@@ -145,7 +145,10 @@ In this example:
- **Administrator** is the [Owner](../../permissions.md) and member of all groups.
They have inherited their role from the **demo** group.
-If a user is a direct member of a project, the expiration date can be updated. If membership is inherited from a parent group, the expiration date can be updated only from the parent group itself.
+If a user is a:
+
+- Direct member of a project, the **Expiration** and **Max role** fields can be updated directly on the project.
+- Inherited member from a parent group, the **Expiration** and **Max role** fields must be updated on the parent group.
## Remove a member from a project
diff --git a/doc/user/project/merge_requests/approvals/settings.md b/doc/user/project/merge_requests/approvals/settings.md
index 0a7fbc9ee95..0ede9310393 100644
--- a/doc/user/project/merge_requests/approvals/settings.md
+++ b/doc/user/project/merge_requests/approvals/settings.md
@@ -146,7 +146,7 @@ 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
+- On a [top-level group](../../../group/index.md#group-approval-settings), which apply to all subgroups
and projects.
If the settings are inherited by a group or project, they cannot be changed in the group or project
diff --git a/doc/user/project/merge_requests/fast_forward_merge.md b/doc/user/project/merge_requests/fast_forward_merge.md
index dc13b270f17..77162aa0b83 100644
--- a/doc/user/project/merge_requests/fast_forward_merge.md
+++ b/doc/user/project/merge_requests/fast_forward_merge.md
@@ -13,8 +13,6 @@ merge commits. In such cases, the fast-forward merge is the perfect candidate.
With fast-forward merge requests, you can retain a linear Git history and a way
to accept merge requests without creating merge commits.
-## Overview
-
When the fast-forward merge
([`--ff-only`](https://git-scm.com/docs/git-merge#git-merge---ff-only)) setting
is enabled, no merge commits are created and all merges are fast-forwarded,
@@ -22,6 +20,11 @@ which means that merging is only allowed if the branch can be fast-forwarded.
When a fast-forward merge is not possible, the user is given the option to rebase.
+NOTE:
+Projects using the fast-forward merge strategy can't filter merge requests
+[by deployment date](../../search/index.md#filtering-merge-requests-by-environment-or-deployment-date),
+because no merge commit is created.
+
## Enabling fast-forward merges
1. On the top bar, select **Menu > Projects** and find your project.
diff --git a/doc/user/project/merge_requests/img/attention_request_list_v14_10.png b/doc/user/project/merge_requests/img/attention_request_list_v14_10.png
new file mode 100644
index 00000000000..00427a0aa40
--- /dev/null
+++ b/doc/user/project/merge_requests/img/attention_request_list_v14_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/attention_request_sidebar_v14_10.png b/doc/user/project/merge_requests/img/attention_request_sidebar_v14_10.png
new file mode 100644
index 00000000000..174cf01dbb0
--- /dev/null
+++ b/doc/user/project/merge_requests/img/attention_request_sidebar_v14_10.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/ff_merge_rebase_v14_9.png b/doc/user/project/merge_requests/img/ff_merge_rebase_v14_9.png
index f4330549a57..17ce42e7a69 100644
--- a/doc/user/project/merge_requests/img/ff_merge_rebase_v14_9.png
+++ b/doc/user/project/merge_requests/img/ff_merge_rebase_v14_9.png
Binary files differ
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index 9872bd2e936..a3b9fb52f0d 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -70,6 +70,53 @@ change and whether you need access to a development environment:
- [Push changes from the command line](../../../gitlab-basics/start-using-git.md), if you are
familiar with Git and the command line.
+## Request attention to a merge request
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/343528) in GitLab 14.10 [with a flag](../../../administration/feature_flags.md) named `mr_attention_requests`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `mr_attention_requests`.
+On GitLab.com, this feature is dependent on the enablement status of the feature flag. Refer to the [enablement issue](https://gitlab.com/gitlab-org/gitlab/-/issues/343528) for details.
+
+To tell a merge request's assignee or reviewer that their attention is
+needed on a merge request, you can request their attention. If an assignee or a
+reviewer has their attention requested on a merge request, the **Attention request**
+icon (**{attention}**) is displayed as a solid icon (**{attention-solid}**) on
+the merge request list page:
+
+![Attention request icon](img/attention_request_list_v14_10.png)
+
+To view a list of merge requests that need your attention:
+
+1. On the top bar, select **Merge requests** (**{merge-request}**).
+1. Select **Attention requests**.
+
+To request attention from another user, use the `/attention @user`
+[quick action](../quick_actions.md) or:
+
+1. Go to the merge request.
+1. On the right sidebar, identify the user you want to request attention from.
+1. Next to the user's name, select **Request attention** (**{attention}**), and the appearance
+ of the icon changes:
+
+ ![Attention request toggle](img/attention_request_sidebar_v14_10.png)
+
+### Remove an attention request
+
+If your attention was requested as an assignee or reviewer, it's removed when you:
+
+- Manually remove the attention request by selecting **Remove attention request** (**{attention-solid}**).
+- Approve the merge request.
+- Add a new user as an assignee or reviewer.
+- Request the attention of a different assignee or reviewer.
+- Remove yourself (or are removed by someone else) as an assignee or reviewer.
+- Merge or close the merge request.
+
+If you are both the assignee and a reviewer on a merge request, you receive
+only one attention request, which is synced across both duties. If the
+attention request is removed from you, either as an assignee or a reviewer,
+it is removed from both your duties.
+
## Close a merge request
If you decide to permanently stop work on a merge request,
diff --git a/doc/user/project/merge_requests/reviews/index.md b/doc/user/project/merge_requests/reviews/index.md
index 280ae07b401..512faae82a9 100644
--- a/doc/user/project/merge_requests/reviews/index.md
+++ b/doc/user/project/merge_requests/reviews/index.md
@@ -112,7 +112,13 @@ This example shows reviewers and approval rules in a merge request sidebar:
### Request a new review
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/293933) in GitLab 13.9.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/293933) in GitLab 13.9.
+> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/357271) in GitLab 14.10.
+
+WARNING:
+This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/357271)
+in GitLab 14.10, and is planned for [removal](https://gitlab.com/gitlab-org/gitlab/-/issues/357271) in GitLab 15.0.
+Use [attention requests](../index.md#request-attention-to-a-merge-request) instead.
After a reviewer completes their [merge request reviews](../../../discussions/index.md),
the author of the merge request can request a new review from the reviewer:
diff --git a/doc/user/project/merge_requests/reviews/suggestions.md b/doc/user/project/merge_requests/reviews/suggestions.md
index 9868f2619ba..8e6794bcfa7 100644
--- a/doc/user/project/merge_requests/reviews/suggestions.md
+++ b/doc/user/project/merge_requests/reviews/suggestions.md
@@ -108,6 +108,8 @@ For example, to customize the commit message to output
**Addresses user_1's review**, set the custom text to
`Addresses %{username}'s review`.
+For merge requests created from forks, GitLab uses the template defined in target project.
+
NOTE:
Custom commit messages for each applied suggestion is
introduced by [#25381](https://gitlab.com/gitlab-org/gitlab/-/issues/25381).
diff --git a/doc/user/project/merge_requests/status_checks.md b/doc/user/project/merge_requests/status_checks.md
index a952c0550bc..76a67487881 100644
--- a/doc/user/project/merge_requests/status_checks.md
+++ b/doc/user/project/merge_requests/status_checks.md
@@ -54,6 +54,9 @@ External status checks have the following states:
Support for adding a `failed` state is tracked [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338827).
+If something changes outside of GitLab, you can [set the status of an external status check](../../../api/status_checks.md#set-status-of-an-external-status-check)
+using the API. You don't need to wait for a merge request webhook payload to be sent first.
+
## View the status checks on a project
Within each project's settings, you can see a list of status checks added to the project:
diff --git a/doc/user/project/merge_requests/test_coverage_visualization.md b/doc/user/project/merge_requests/test_coverage_visualization.md
index d7177208a6e..9f1e5ae7046 100644
--- a/doc/user/project/merge_requests/test_coverage_visualization.md
+++ b/doc/user/project/merge_requests/test_coverage_visualization.md
@@ -28,7 +28,7 @@ between pipeline completion and the visualization loading on the page.
For the coverage analysis to work, you have to provide a properly formatted
[Cobertura XML](https://cobertura.github.io/cobertura/) report to
-[`artifacts:reports:cobertura`](../../../ci/yaml/artifacts_reports.md#artifactsreportscobertura).
+[`artifacts:reports:cobertura`](../../../ci/yaml/artifacts_reports.md#artifactsreportscobertura-deprecated).
This format was originally developed for Java, but most coverage analysis frameworks
for other languages have plugins to add support for it, like:
@@ -156,7 +156,9 @@ test:
- npx nyc --reporter cobertura mocha
artifacts:
reports:
- cobertura: coverage/cobertura-coverage.xml
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage/cobertura-coverage.xml
```
### Java and Kotlin examples
@@ -324,18 +326,13 @@ run tests:
The following [`.gitlab-ci.yml`](../../../ci/yaml/index.md) example for Go uses:
- [`go test`](https://go.dev/doc/tutorial/add-a-test) to run tests.
-- [`gocover-cobertura`](https://github.com/t-yuki/gocover-cobertura) to convert Go's coverage profile into the Cobertura XML format.
+- [`gocover-cobertura`](https://github.com/boumenot/gocover-cobertura) to convert Go's coverage profile into the Cobertura XML format.
-This example assumes that [Go modules](https://go.dev/ref/mod) are being used.
-Using Go modules causes paths within the coverage profile to be prefixed with your
-project's module identifier, which can be found in the `go.mod` file. This
-prefix must be removed for GitLab to parse the Cobertura XML file correctly. You can use the following `sed` command to remove the prefix:
-
-```shell
-sed -i 's;filename=\"<YOUR_MODULE_ID>/;filename=\";g' coverage.xml
-```
-
-Replace the `gitlab.com/my-group/my-project` placeholder in the following example with your own module identifier to make it work.
+This example assumes that [Go modules](https://go.dev/ref/mod)
+are being used. Please note that the `-covermode count` option does not work with the `-race` flag.
+If you want to generate code coverage while also using the `-race` flag, you must switch to
+`-covermode atomic` which is slower than `-covermode count`. See [this blog post](https://go.dev/blog/cover)
+for more details.
```yaml
run tests:
@@ -343,9 +340,9 @@ run tests:
image: golang:1.17
script:
- go install
- - go test . -coverprofile=coverage.txt -covermode count
- - go run github.com/t-yuki/gocover-cobertura < coverage.txt > coverage.xml
- - sed -i 's;filename=\"gitlab.com/my-group/my-project/;filename=\";g' coverage.xml
+ - go test ./... -coverprofile=coverage.txt -covermode count
+ - go get github.com/boumenot/gocover-cobertura
+ - go run github.com/boumenot/gocover-cobertura < coverage.txt > coverage.xml
artifacts:
reports:
cobertura: coverage.xml
diff --git a/doc/user/project/pages/custom_domains_ssl_tls_certification/dns_concepts.md b/doc/user/project/pages/custom_domains_ssl_tls_certification/dns_concepts.md
index 3491346f7d9..5433e02b210 100644
--- a/doc/user/project/pages/custom_domains_ssl_tls_certification/dns_concepts.md
+++ b/doc/user/project/pages/custom_domains_ssl_tls_certification/dns_concepts.md
@@ -1,7 +1,7 @@
---
type: concepts
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
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 4d8919090a2..d970c0f9ef4 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
@@ -1,7 +1,7 @@
---
disqus_identifier: 'https://docs.gitlab.com/ee/user/project/pages/getting_started_part_three.html'
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md b/doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md
index f09aea3b02a..cb22a200514 100644
--- a/doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md
+++ b/doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md
@@ -1,14 +1,14 @@
---
type: reference
description: "Automatic Let's Encrypt SSL certificates for GitLab Pages."
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
# GitLab Pages integration with Let's Encrypt **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/28996) in GitLab 12.1. For versions earlier than GitLab 12.1, see the [manual Let's Encrypt instructions](../lets_encrypt_for_gitlab_pages.md).
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/28996) in GitLab 12.1.
The GitLab Pages integration with Let's Encrypt (LE) allows you
to use LE certificates for your Pages website with custom domains
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 21f2dd51f70..0c848a24dec 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
@@ -1,7 +1,7 @@
---
type: concepts
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/getting_started/pages_ci_cd_template.md b/doc/user/project/pages/getting_started/pages_ci_cd_template.md
index 25382778b1d..510f9332e7b 100644
--- a/doc/user/project/pages/getting_started/pages_ci_cd_template.md
+++ b/doc/user/project/pages/getting_started/pages_ci_cd_template.md
@@ -1,7 +1,7 @@
---
type: reference, howto
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/getting_started/pages_forked_sample_project.md b/doc/user/project/pages/getting_started/pages_forked_sample_project.md
index b43af2f0efe..71ed3134c1e 100644
--- a/doc/user/project/pages/getting_started/pages_forked_sample_project.md
+++ b/doc/user/project/pages/getting_started/pages_forked_sample_project.md
@@ -1,7 +1,7 @@
---
type: reference, howto
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/getting_started/pages_from_scratch.md b/doc/user/project/pages/getting_started/pages_from_scratch.md
index e0c10e27ec3..f08afc924f3 100644
--- a/doc/user/project/pages/getting_started/pages_from_scratch.md
+++ b/doc/user/project/pages/getting_started/pages_from_scratch.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/getting_started/pages_new_project_template.md b/doc/user/project/pages/getting_started/pages_new_project_template.md
index cee10675a62..b32d71a4887 100644
--- a/doc/user/project/pages/getting_started/pages_new_project_template.md
+++ b/doc/user/project/pages/getting_started/pages_new_project_template.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/getting_started_part_one.md b/doc/user/project/pages/getting_started_part_one.md
index 5773dd1f2c0..54b843945cd 100644
--- a/doc/user/project/pages/getting_started_part_one.md
+++ b/doc/user/project/pages/getting_started_part_one.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index 82b1a824f7a..af49522efe2 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -1,7 +1,7 @@
---
description: 'Learn how to use GitLab Pages to deploy a static website at no additional cost.'
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/introduction.md b/doc/user/project/pages/introduction.md
index e4bc58854ef..f274338c2fd 100644
--- a/doc/user/project/pages/introduction.md
+++ b/doc/user/project/pages/introduction.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/lets_encrypt_for_gitlab_pages.md b/doc/user/project/pages/lets_encrypt_for_gitlab_pages.md
deleted file mode 100644
index 7779f87b459..00000000000
--- a/doc/user/project/pages/lets_encrypt_for_gitlab_pages.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'custom_domains_ssl_tls_certification/lets_encrypt_integration.md'
-remove_date: '2022-03-14'
----
-
-This file was moved to [another location](custom_domains_ssl_tls_certification/lets_encrypt_integration.md).
-
-<!-- This redirect file can be deleted after <2022-03-14>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/pages/pages_access_control.md b/doc/user/project/pages/pages_access_control.md
index 002b234f561..9b747e04973 100644
--- a/doc/user/project/pages/pages_access_control.md
+++ b/doc/user/project/pages/pages_access_control.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/pages/redirects.md b/doc/user/project/pages/redirects.md
index cdae1d2f837..1db404f4888 100644
--- a/doc/user/project/pages/redirects.md
+++ b/doc/user/project/pages/redirects.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Create
+group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/protected_branches.md b/doc/user/project/protected_branches.md
index 292530e6c9c..06396b5cd62 100644
--- a/doc/user/project/protected_branches.md
+++ b/doc/user/project/protected_branches.md
@@ -147,8 +147,8 @@ Deploy keys are not available in the **Allowed to merge** dropdown list.
## Allow force push on a protected branch
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15611) in GitLab 13.10 behind a disabled feature flag.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323431) in GitLab 14.0.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15611) in GitLab 13.10 [with a flag](../../administration/feature_flags.md) named `allow_force_push_to_protected_branches`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/323431) in GitLab 14.0. Feature flag `allow_force_push_to_protected_branches` removed.
You can allow [force pushes](../../topics/git/git_rebase.md#force-push) to
protected branches.
diff --git a/doc/user/project/push_options.md b/doc/user/project/push_options.md
index 20dd37578fd..d04f79d11c7 100644
--- a/doc/user/project/push_options.md
+++ b/doc/user/project/push_options.md
@@ -35,7 +35,7 @@ You can use push options to skip a CI/CD pipeline, or pass CI/CD variables.
| Push option | Description | Introduced in version |
| ------------------------------ | ------------------------------------------------------------------------------------------- |---------------------- |
-| `ci.skip` | Do not create a CI pipeline for the latest push. | [11.7](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/15643) |
+| `ci.skip` | Do not create a CI pipeline for the latest push. Only skips branch pipelines and not [merge request pipelines](../../ci/pipelines/merge_request_pipelines.md). | [11.7](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/15643) |
| `ci.variable="<name>=<value>"` | Provide [CI/CD variables](../../ci/variables/index.md) to be used in a CI pipeline, if one is created due to the push. | [12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/27983) |
An example of using `ci.skip`:
diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md
index ae42d90af06..b73b381ffcd 100644
--- a/doc/user/project/quick_actions.md
+++ b/doc/user/project/quick_actions.md
@@ -55,6 +55,7 @@ threads. Some quick actions might not be available to all subscription tiers.
| `/assign me` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Assign yourself. |
| `/assign_reviewer @user1 @user2` or `/reviewer @user1 @user2` or `/request_review @user1 @user2` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Assign one or more users as reviewers. |
| `/assign_reviewer me` or `/reviewer me` or `/request_review me` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Assign yourself as a reviewer. |
+| `/attention @user1` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | [Request attention](merge_requests/index.md#request-attention-to-a-merge-request) to a merge request from a user. |
| `/award :emoji:` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Toggle emoji award. |
| `/child_epic <epic>` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Add child epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7330) in GitLab 12.0). |
| `/clear_health_status` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Clear [health status](issues/managing_issues.md#health-status) ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213814) in GitLab 14.7). |
diff --git a/doc/user/project/repository/forking_workflow.md b/doc/user/project/repository/forking_workflow.md
index ddeef65a6b5..0e6c98457c7 100644
--- a/doc/user/project/repository/forking_workflow.md
+++ b/doc/user/project/repository/forking_workflow.md
@@ -32,7 +32,7 @@ To fork an existing project in GitLab:
It must be unique in the namespace.
1. Optional. Add a **Project description**.
1. Select the **Visibility level** for your fork. For more information about
- visibility levels, read [Project and group visibility](../../../public_access/public_access.md).
+ visibility levels, read [Project and group visibility](../../public_access.md).
1. Select **Fork project**.
GitLab creates your fork, and redirects you to the new fork's page.
diff --git a/doc/user/project/repository/jupyter_notebooks/index.md b/doc/user/project/repository/jupyter_notebooks/index.md
index cd0c6679d8d..39b57f89ceb 100644
--- a/doc/user/project/repository/jupyter_notebooks/index.md
+++ b/doc/user/project/repository/jupyter_notebooks/index.md
@@ -25,8 +25,14 @@ GitLab.
## Cleaner diffs
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6589) in GitLab 14.5 [with a flag](../../../../administration/feature_flags.md) named `jupyter_clean_diffs`. Enabled by default.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6589) in GitLab 14.5 as an [Alpha](../../../../policy/alpha-beta-support.md#alpha-features) release [with a flag](../../../../administration/feature_flags.md) named `jupyter_clean_diffs`. Enabled by default.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75500) in GitLab 14.9. Feature flag `jupyter_clean_diffs` removed.
+> - [Reintroduced toggle](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85079) in GitLab 15.0 [with a flag](../../../../administration/feature_flags.md) named `ipynb_semantic_diff`. Enabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../../../../administration/feature_flags.md) named `ipynb_semantic_diff`.
+On GitLab.com, this feature is available.
+This feature is ready for production use.
When commits include changes to Jupyter Notebook files, GitLab:
@@ -37,6 +43,10 @@ Code suggestions are not available on diffs and merge requests for `.ipynb` file
![Jupyter Notebook Clean Diff](img/jupyter_notebook_diff_v14_5.png)
+This feature is an [Alpha](../../../../policy/alpha-beta-support.md#alpha-features) release,
+and might lead to performance degradation. On self-managed GitLab, if unexpected issues
+arise, disable the feature.
+
## Jupyter Git integration
Jupyter can be configured as an OAuth application with repository access, acting
diff --git a/doc/user/project/repository/mirror/index.md b/doc/user/project/repository/mirror/index.md
index c9fa30e39a8..e1017e78437 100644
--- a/doc/user/project/repository/mirror/index.md
+++ b/doc/user/project/repository/mirror/index.md
@@ -7,9 +7,13 @@ disqus_identifier: 'https://docs.gitlab.com/ee/workflow/repository_mirroring.htm
# Repository mirroring **(FREE)**
-You can _mirror_ a repository to and from external sources. You can select which
-repository serves as the source, and modify which parts of the repository are copied.
-Branches, tags, and commits can be mirrored.
+You can _mirror_ a repository to and from external sources. You can select which repository
+serves as the source. Branches, tags, and commits can be mirrored.
+
+NOTE:
+SCP-style URLs are **not** supported. However, the work for implementing SCP-style URLs is tracked
+in [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/18993).
+Subscribe to the issue to follow its progress.
Several mirroring methods exist:
@@ -23,11 +27,7 @@ Mirror a repository when:
copy of your project at its previous home, configure your GitLab repository as a
[push mirror](push.md). Changes you make to your GitLab repository are copied to
the old location.
-- Your GitLab project is private, but some components can be shared publicly.
- Configure your primary repository as a [push mirror](push.md) and push the portions
- you want to make public. With this configuration, you can open-source specific
- projects, contribute back to the open-source community, and protect the sensitive
- parts of your project.
+- Your GitLab instance is private, but you want to open-source some projects.
- You migrated to GitLab, but the canonical version of your project is somewhere else.
Configure your GitLab repository as a [pull mirror](pull.md) of the other project.
Your GitLab repository pulls copies of the commits, tags, and branches of project.
diff --git a/doc/user/project/repository/repository_mirroring.md b/doc/user/project/repository/repository_mirroring.md
deleted file mode 100644
index 8fbe5aec6a3..00000000000
--- a/doc/user/project/repository/repository_mirroring.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'mirror/index.md'
-remove_date: '2022-03-22'
----
-
-This document was moved to [another location](mirror/index.md).
-
-<!-- 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/repository/web_editor.md b/doc/user/project/repository/web_editor.md
index 4165c1828cc..6eed1717507 100644
--- a/doc/user/project/repository/web_editor.md
+++ b/doc/user/project/repository/web_editor.md
@@ -117,12 +117,19 @@ There are multiple ways to create a branch from the GitLab web interface.
### Create a new branch from an issue
+> The **Create merge request** button [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/349566) to open the merge request creation form in GitLab 14.8.
+
If your development workflow requires an issue for every merge
request, you can create a branch directly from the issue to speed the process up.
The new branch, and later its merge request, are marked as related to this issue.
Once merged, the merge request closes the issue.
You can see a **Create merge request** dropdown below the issue description.
+NOTE:
+In GitLab 14.8 and later, selecting **Create merge request**
+[redirects to the merge request creation form](https://gitlab.com/gitlab-org/gitlab/-/issues/349566)
+instead of immediately creating the merge request.
+
The **Create merge request** button doesn't display if:
- A branch with the same name already exists.
diff --git a/doc/user/project/repository/x509_signed_commits/index.md b/doc/user/project/repository/x509_signed_commits/index.md
index c9cddad1a91..0259ff6ce30 100644
--- a/doc/user/project/repository/x509_signed_commits/index.md
+++ b/doc/user/project/repository/x509_signed_commits/index.md
@@ -88,7 +88,7 @@ If you have the correct version, you can proceed to configure Git.
Configure Git to use your key for signing:
```shell
-signingkey = $( gpgsm --list-secret-keys | egrep '(key usage|ID)' | grep -B 1 digitalSignature | awk '/ID/ {print $2}' )
+signingkey=$( gpgsm --list-secret-keys | egrep '(key usage|ID)' | grep -B 1 digitalSignature | awk '/ID/ {print $2}' )
git config --global user.signingkey $signingkey
git config --global gpg.format x509
```
diff --git a/doc/user/project/requirements/index.md b/doc/user/project/requirements/index.md
index 6abe9c08d28..8b80c494e2f 100644
--- a/doc/user/project/requirements/index.md
+++ b/doc/user/project/requirements/index.md
@@ -127,7 +127,7 @@ To search for a requirement:
You can also sort the requirements list by:
- Created date
-- Last updated
+- Updated date
## Allow requirements to be satisfied from a CI job
diff --git a/doc/user/project/service_desk.md b/doc/user/project/service_desk.md
index 90732ba4fe2..19c3218137f 100644
--- a/doc/user/project/service_desk.md
+++ b/doc/user/project/service_desk.md
@@ -241,7 +241,8 @@ The configuration options are the same as for configuring
##### Microsoft Graph
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214900) in GitLab 13.11.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214900) in GitLab 13.11.
+> - Alternative Azure deployments [introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5978) in GitLab 14.9.
Service Desk can be configured to read Microsoft Exchange Online mailboxes with the Microsoft
Graph API instead of IMAP. Follow the [documentation in the incoming email section for setting up an OAuth2 application for Microsoft Graph](../../administration/incoming_email.md#microsoft-graph).
@@ -263,6 +264,22 @@ Graph API instead of IMAP. Follow the [documentation in the incoming email secti
}
```
+For Microsoft Cloud for US Government or [other Azure deployments](https://docs.microsoft.com/en-us/graph/deployments), configure the `azure_ad_endpoint` and `graph_endpoint` settings.
+
+- Example for Microsoft Cloud for US Government:
+
+```ruby
+ gitlab_rails['service_desk_email_inbox_options'] = {
+ 'azure_ad_endpoint': 'https://login.microsoftonline.us',
+ 'graph_endpoint': 'https://graph.microsoft.us',
+ 'tenant_id': '<YOUR-TENANT-ID>',
+ 'client_id': '<YOUR-CLIENT-ID>',
+ 'client_secret': '<YOUR-CLIENT-SECRET>',
+ 'poll_interval': 60 # Optional
+ }
+}
+```
+
The Microsoft Graph API is not yet supported in source installations. See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/326169) for more details.
#### Configuring a custom email address suffix
@@ -330,20 +347,6 @@ Note that:
- The project's visibility (private, internal, public) does not affect Service Desk.
- The path to the project, including its group or namespace, is shown in emails.
-#### Issues created on someone's behalf
-
-To allow third party applications and ticketing systems to interface with Service Desk,
-when the email contains the `Reply-To` email header, this email address is used as the address of the
-issue author.
-
-Because the `Reply-To` header can be set to arbitrary values, do not blindly trust that an issue
-created on behalf of `someone@example.com` was indeed created by the real owner of such email address.
-
-For example, an email with headers `To: support@example.com` and `Reply-To:someone@example.com`
-creates an issue with the following note:
-
-> Created (…) by `support@example.com` (reply to: `someone@example.com`) (…)
-
#### Privacy considerations
Service Desk issues are confidential, but the project owner can
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index ae3decb8079..30261ed5082 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -72,13 +72,14 @@ The following items are exported:
The following items are **not** exported:
+- [Child pipeline history](https://gitlab.com/gitlab-org/gitlab/-/issues/221088)
- Build traces and artifacts
- Container registry images
- CI/CD variables
- Pipeline triggers
- Webhooks
- Any encrypted tokens
-- Merge Request Approvers
+- Merge Request Approvers and [the number of required approvals](https://gitlab.com/gitlab-org/gitlab/-/issues/221088)
- Repository size limits
- Deploy keys allowed to push to protected branches
@@ -127,7 +128,7 @@ The following items are imported but changed slightly:
associated with such merge requests are created in a project during the import/export. Thus, the
number of branches in the exported project might be bigger than in the original project.
- If use of the `Internal` visibility level
- [is restricted](../../../public_access/public_access.md#restrict-use-of-public-or-internal-projects),
+ [is restricted](../../public_access.md#restrict-use-of-public-or-internal-projects),
all imported projects are given `Private` visibility.
Deploy keys aren't imported. To use deploy keys, you must enable them in your imported project and update protected branches.
@@ -154,9 +155,9 @@ The default is `0` (unlimited).
Imported users can be mapped by their public email addresses on self-managed instances, if an administrator (not an owner) does the import.
-- Public email addresses are not set by default. Users must
-[set it in their profiles](../../profile/index.md#set-your-public-email)
-for mapping to work correctly.
+- The project must be exported by a project or group member with the Owner role.
+- Public email addresses are not set by default. Users must [set it in their profiles](../../profile/index.md#set-your-public-email)
+ for mapping to work correctly.
- For contributions to be mapped correctly, users must be an existing member of the namespace,
or they can be added as a member of the project. Otherwise, a supplementary comment is left to mention that the original author and the MRs, notes, or issues that are owned by the importer.
- Imported users are set as [direct members](../members/index.md)
@@ -237,7 +238,7 @@ and the exports between them are compatible.
### Project fails to import due to mismatch
-If the [shared runners enablement](../../../ci/runners/runners_scope.md#enable-shared-runners)
+If the [shared runners enablement](../../../ci/runners/runners_scope.md#enable-shared-runners-for-a-project)
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:
@@ -306,7 +307,7 @@ reduce the repository size for another import attempt:
#### Workaround option 2
NOTE:
-This workaround requires access to the rails console, which isn't available to end-users on GitLab.com.
+This workaround does not account for LFS objects.
Rather than attempting to push all changes at once, this workaround:
@@ -383,3 +384,17 @@ s = Gitlab::ImportExport::Saver.new(exportable: p, shared:p.import_export_shared
s.send(:compress_and_save)
s.send(:save_upload)
```
+
+### Import using the REST API fails when using a group access token
+
+[Group access tokens](../../group/settings/group_access_tokens.md)
+don't work for project or group import operations. When a group access token initiates an import,
+the import fails with this message:
+
+```plaintext
+Error adding importer user to Project members.
+Validation failed: User project bots cannot be added to other groups / projects
+```
+
+To use [Import REST APIs](../../../api/project_import_export.md),
+pass regular user account credentials such as [personal access tokens](../../profile/personal_access_tokens.md).
diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md
index 342b8d80bcf..31cda756a78 100644
--- a/doc/user/project/settings/index.md
+++ b/doc/user/project/settings/index.md
@@ -89,15 +89,11 @@ read-only view to discourage this behavior.
Compliance framework pipelines allow group owners to define
a compliance pipeline in a separate repository that gets
executed in place of the local project's `gitlab-ci.yml` file. As part of this pipeline, an
-`include` statement can reference the local project's `gitlab-ci.yml` file. This way, the two CI
-files are merged together any time the pipeline runs. Jobs and variables defined in the compliance
+`include` statement can reference the local project's `gitlab-ci.yml` file. This way, the compliance
+pipeline jobs can run alongside the project-specific jobs any time the pipeline runs.
+Jobs and variables defined in the compliance
pipeline can't be changed by variables in the local project's `gitlab-ci.yml` file.
-When used to enforce scan execution, this feature has some overlap with [scan execution policies](../../application_security/policies/scan-execution-policies.md),
-as we have not [unified the user experience for these two features](https://gitlab.com/groups/gitlab-org/-/epics/7312).
-For details on the similarities and differences between these features, see
-[Enforce scan execution](../../application_security/#enforce-scan-execution).
-
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:
@@ -185,6 +181,11 @@ include: # Execute individual project's configuration (if project contains .git
ref: '$CI_COMMIT_REF_NAME' # Must be defined or MR pipelines always use the use default branch
```
+When used to enforce scan execution, this feature has some overlap with [scan execution policies](../../application_security/policies/scan-execution-policies.md),
+as we have not [unified the user experience for these two features](https://gitlab.com/groups/gitlab-org/-/epics/7312).
+For details on the similarities and differences between these features, see
+[Enforce scan execution](../../application_security/#enforce-scan-execution).
+
##### Ensure compliance jobs are always run
Compliance pipelines use GitLab CI/CD to give you an incredible amount of flexibility
@@ -242,7 +243,7 @@ documentation, access permissions, and more. To do so from your project,
go to **Settings** > **General**, and expand the **Visibility, project features, permissions**
section.
-You can now change the [Project visibility](../../../public_access/public_access.md).
+You can now change the [Project visibility](../../public_access.md).
If you set **Project Visibility** to public, you can limit access to some features
to **Only Project Members**. In addition, you can select the option to
[Allow users to request access](../members/index.md#request-access-to-a-project).
diff --git a/doc/user/project/settings/project_access_tokens.md b/doc/user/project/settings/project_access_tokens.md
index a78226ac2f8..b66913b7223 100644
--- a/doc/user/project/settings/project_access_tokens.md
+++ b/doc/user/project/settings/project_access_tokens.md
@@ -12,17 +12,18 @@ type: reference, howto
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/235765) in GitLab 13.5.
> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/342327) in GitLab 14.5. Default prefix added.
-You can use a project access token to authenticate:
+Project access tokens are similar to passwords, except you can [limit access to resources](#scopes-for-a-project-access-token),
+select a limited role, and provide an expiry date.
-- With the [GitLab API](../../../api/index.md#personalprojectgroup-access-tokens).
-- With Git, when using HTTP Basic Authentication.
+Use a project access token to authenticate:
-After you configure a project access token, you don't need a password when you authenticate.
-Instead, you can enter any non-blank value.
+- With the [GitLab API](../../../api/index.md#personalprojectgroup-access-tokens).
+- With Git, when using HTTP Basic Authentication, use:
+ - Any non-blank value as a username.
+ - The project access token as the password.
Project access tokens are similar to [group access tokens](../../group/settings/group_access_tokens.md)
-and [personal access tokens](../../profile/personal_access_tokens.md), except they are
-associated with a project rather than a group or user.
+and [personal access tokens](../../profile/personal_access_tokens.md).
In self-managed instances, project access tokens are subject to the same [maximum lifetime limits](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens) as personal access tokens if the limit is set.
@@ -35,6 +36,8 @@ You can use project access tokens:
- Consider [disabling project access tokens](#enable-or-disable-project-access-token-creation) to
lower potential abuse.
+You cannot use project access tokens to create other access tokens.
+
Project access tokens inherit the [default prefix setting](../../admin_area/settings/account_and_limit_settings.md#personal-access-token-prefix)
configured for personal access tokens.
diff --git a/doc/user/project/static_site_editor/index.md b/doc/user/project/static_site_editor/index.md
index 7c74a625b92..220623d0372 100644
--- a/doc/user/project/static_site_editor/index.md
+++ b/doc/user/project/static_site_editor/index.md
@@ -17,7 +17,7 @@ description: "The static site editor enables users to edit content on static web
WARNING:
This feature is in its end-of-life process. It is
[deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77246)
-for use in GitLab 14.7, and is planned for
+in GitLab 14.7, and is planned for
[removal](https://gitlab.com/groups/gitlab-org/-/epics/7351) in GitLab 14.10.
Users should instead use the [Web Editor](../repository/web_editor.md) or [Web IDE](../web_ide/index.md). [Removal instructions](#remove-the-static-site-editor) for existing projects are included on this page.
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index ff8a076465d..8f9486633d5 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -222,7 +222,7 @@ To edit Markdown files in the Web IDE:
1. Go to your repository, and navigate to the Markdown page you want to edit.
1. Select **Open in Web IDE**, and GitLab loads the page in a tab in the editor.
-1. Make your changes to the file. GitLab supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
+1. Make your changes to the file. GitLab supports [GitLab Flavored Markdown (GLFM)](../../markdown.md).
1. When your changes are complete, select **Commit** in the left sidebar.
1. Add a commit message, select the branch you want to commit to, and select **Commit**.
diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md
index 33f6c32d334..7d155ea9b06 100644
--- a/doc/user/project/wiki/index.md
+++ b/doc/user/project/wiki/index.md
@@ -327,13 +327,7 @@ to disable the wiki but toggle it on (in blue).
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5643) in GitLab 14.0.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345398) switching between editing experiences in GitLab 14.7 [with a flag](../../../administration/feature_flags.md) named `wiki_switch_between_content_editor_raw_markdown`. Enabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is available.
-To hide the feature, ask an administrator to
-[disable the feature flag](../../../administration/feature_flags.md) named
-`wiki_switch_between_content_editor_raw_markdown`.
-On GitLab.com, this feature is available.
+> - Switching between editing experiences generally available in GitLab 14.10. [Feature flag `wiki_switch_between_content_editor_raw_markdown`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83760) removed.
GitLab version 14.0 introduces a WYSIWYG editing experience for GitLab Flavored Markdown
in Wikis through the [Content Editor](../../../development/fe_guide/content_editor.md).
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index 19e77d18aca..03530b59e9b 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -76,13 +76,13 @@ To create a project in GitLab:
- [custom template](#create-a-project-from-a-custom-template).
- [HIPAA audit protocol template](#create-a-project-from-the-hipaa-audit-protocol-template).
- [Import a project](../../user/project/import/index.md)
- from a different repository. Contact your GitLab administrator if this option is not available.
+ from a different repository. Contact your GitLab administrator if this option is not available.
- [Connect an external repository to GitLab CI/CD](../../ci/ci_cd_for_external_repos/index.md).
-- For a list of words that you cannot use as project names, see
-[reserved project and group names](../../user/reserved_names.md).
-- For a list of characters that you cannot use in project and group names, see
-[limitations on project and group names](../../user/reserved_names.md#limitations-on-project-and-group-names).
+- For a list of words that you cannot use as project names, see
+ [reserved project and group names](../../user/reserved_names.md).
+- For a list of characters that you cannot use in project and group names, see
+ [limitations on project and group names](../../user/reserved_names.md#limitations-on-project-and-group-names).
## Create a blank project
@@ -99,12 +99,12 @@ To create a blank project:
- In the **Project description (optional)** field, enter the description of your project's dashboard.
- In the **Project target (optional)** field, select your project's deployment target.
This information helps GitLab better understand its users and their deployment requirements.
- - To modify the project's [viewing and access rights](../../public_access/public_access.md) for
- users, change the **Visibility Level**.
+ - To modify the project's [viewing and access rights](../public_access.md) for
+ users, change the **Visibility Level**.
- To create README file so that the Git repository is initialized, has a default branch, and
can be cloned, select **Initialize repository with a README**.
- To analyze the source code in the project for known security vulnerabilities,
- select **Enable Static Application Security Testing (SAST)**.
+ select **Enable Static Application Security Testing (SAST)**.
1. Select **Create project**.
## Create a project from a built-in template
@@ -132,13 +132,13 @@ To create a project from a built-in template:
slug as the URL path to the project. To change the slug, first enter the project name,
then change the slug.
- In the **Project description (optional)** field, enter the description of your project's dashboard.
- - To modify the project's [viewing and access rights](../../public_access/public_access.md) for users,
- change the **Visibility Level**.
+ - To modify the project's [viewing and access rights](../public_access.md) for users,
+ change the **Visibility Level**.
1. Select **Create project**.
## Create a project from a custom template **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.2.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in GitLab 11.2.
Custom project templates are available at:
@@ -158,8 +158,8 @@ Custom project templates are available at:
slug as the URL path to the project. To change the slug, first enter the project name,
then change the slug.
- The description of your project's dashboard in the **Project description (optional)** field.
- - To modify the project's [viewing and access rights](../../public_access/public_access.md) for users,
- change the **Visibility Level**.
+ - To modify the project's [viewing and access rights](../public_access.md) for users,
+ change the **Visibility Level**.
1. Select **Create project**.
## Create a project from the HIPAA Audit Protocol template **(ULTIMATE)**
@@ -184,8 +184,8 @@ To create a project from the HIPAA Audit Protocol template:
slug as the URL path to the project. To change the slug, first enter the project name,
then change the slug.
- In the **Project description (optional)** field, enter the description of your project's dashboard.
- - To modify the project's [viewing and access rights](../../public_access/public_access.md) for users,
- change the **Visibility Level**.
+ - To modify the project's [viewing and access rights](../public_access.md) for users,
+ change the **Visibility Level**.
1. Select **Create project**.
## Create a new project with Git push
@@ -206,8 +206,8 @@ used or renamed project, use the [UI](#create-a-project) or the [Projects API](.
Prerequisites:
-- To push with SSH, you must have [an SSH key](../../ssh/index.md) that is
-[added to your GitLab account](../../ssh/index.md#add-an-ssh-key-to-your-gitlab-account).
+- To push with SSH, you must have [an SSH key](../ssh.md) that is
+ [added to your GitLab account](../ssh.md#add-an-ssh-key-to-your-gitlab-account).
- You must have permission to add new projects to a namespace. To check if you have permission:
1. On the top bar, select **Menu > Projects**.
@@ -250,7 +250,7 @@ remote: The private project namespace/myproject was created.
To view your new project, go to `https://gitlab.example.com/namespace/myproject`.
Your project's visibility is set to **Private** by default. To change project visibility, adjust your
-[project's settings](../../public_access/public_access.md#change-project-visibility).
+[project's settings](../public_access.md#change-project-visibility).
## Star a project
@@ -299,7 +299,7 @@ To delete a project:
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/351556) in GitLab 14.9. [Feature flag `project_owners_list_project_pending_deletion`](https://gitlab.com/gitlab-org/gitlab/-/issues/351556) removed.
When delayed project deletion is [enabled for a group](../group/index.md#enable-delayed-project-deletion),
-projects within that group are not deleted immediately, but only after a delay.
+projects within that group are not deleted immediately, but only after a delay.
To view a list of all projects that are pending deletion:
@@ -409,9 +409,9 @@ To disable fetching:
1. Disable checksum queries in `GONOSUMDB`.
- If the module name or its prefix is in `GOPRIVATE` or `GONOPROXY`, Go does not query module
-proxies.
+ proxies.
- If the module name or its prefix is in `GONOPRIVATE` or `GONOSUMDB`, Go does not query
-Checksum databases.
+ Checksum databases.
### Fetch Go modules from Geo secondary sites
diff --git a/doc/user/public_access.md b/doc/user/public_access.md
new file mode 100644
index 00000000000..cca753a2830
--- /dev/null
+++ b/doc/user/public_access.md
@@ -0,0 +1,98 @@
+---
+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 **(FREE)**
+
+GitLab allows users with the Owner role to set a project's or group's visibility as:
+
+- **Public**
+- **Internal**
+- **Private**
+
+These visibility levels affect who can see the project in the public access directory (`/public`
+for your GitLab instance). For example, <https://gitlab.com/public>.
+You can control the visibility of individual features with
+[project feature settings](permissions.md#project-features).
+
+## Public projects and groups
+
+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 on the repository.
+
+NOTE:
+By default, `/public` is visible to unauthenticated users. However, if the
+[**Public** visibility level](admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels)
+is restricted, `/public` is visible only to signed-in users.
+
+## Internal projects and groups
+
+Internal projects can be cloned by any signed-in user except
+[external users](permissions.md#external-users).
+
+They are also listed in the public access directory (`/public`), but only for signed-in users.
+
+Any signed-in users except [external users](permissions.md#external-users) have the
+Guest role on the repository.
+
+NOTE:
+From July 2019, the `Internal` visibility setting is disabled for new projects, groups,
+and snippets on GitLab.com. Existing projects, groups, and snippets using the `Internal`
+visibility setting keep this setting. You can read more about the change in the
+[relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/12388).
+
+## Private projects and groups
+
+Private projects can only be cloned and viewed by project members (except for guests).
+
+They appear in the public access directory (`/public`) for project members only.
+
+## Change project visibility
+
+Prerequisite:
+
+- You must have the Owner role for a project.
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Visibility, project features, permissions**.
+1. Change **Project visibility** to either **Private**, **Internal**, or **Public**.
+1. Select **Save changes**.
+
+## Change group visibility
+
+Prerequisite:
+
+- You must have the Owner role for a group.
+
+1. On the top bar, select **Menu > Groups** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Naming, visibility**.
+1. Under **Visibility level** select either **Private**, **Internal**, or **Public**.
+1. Select **Save changes**.
+
+## 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 administrators.
+
+For details, see [Restricted visibility levels](admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels).
+
+<!-- ## Troubleshooting
+
+Include any troubleshooting steps that you can foresee. If you know beforehand what issues
+one might have when setting this up, or when something is changed, or on upgrading, it's
+important to describe those, too. Think of things that may go wrong and include them here.
+This is important to minimize requests for support, and to avoid doc comments with
+questions that you know someone might ask.
+
+Each scenario can be a third-level heading, e.g. `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/user/reserved_names.md b/doc/user/reserved_names.md
index 33ecf252e43..45c5f53e33c 100644
--- a/doc/user/reserved_names.md
+++ b/doc/user/reserved_names.md
@@ -19,7 +19,7 @@ under the `TOP_LEVEL_ROUTES`, `PROJECT_WILDCARD_ROUTES` and `GROUP_ROUTES` lists
## Limitations on project and group names
-- Special characters are not permitted at the start or end of project or group names. They are permitted in any other location of the name.
+- Special characters are not permitted at the start or end of project or group names. They are permitted in any other location of the name.
- Project or group names cannot end in `.git` or `.atom`.
- Project or group names can only contain letters, digits, emojis, "_", ".", "+", dashes, or spaces.
- Paths can only contain letters, digits, "_", "-", and "."
diff --git a/doc/user/search/advanced_search.md b/doc/user/search/advanced_search.md
index cb272b3feed..5435a9d027c 100644
--- a/doc/user/search/advanced_search.md
+++ b/doc/user/search/advanced_search.md
@@ -26,8 +26,8 @@ when searching in:
- Comments
- Code
- Commits
-- Wiki (except [group wikis](../project/wiki/group.md))
- Users
+- Wiki (except [group wikis](../project/wiki/group.md))
The Advanced Search can be useful in various scenarios:
@@ -46,72 +46,9 @@ The Advanced Search can be useful in various scenarios:
may be connected to each other, so your developers need to instantly search
throughout the GitLab instance and find the code they search for.
-## Use the Advanced Search syntax
-
-Elasticsearch has data for the default branch only. That means that if you go
-to the repository tree and switch the branch from the default to something else,
-then the **Code** tab in the search result page is served by the basic
-search even if Elasticsearch is enabled.
-
-The Advanced Search syntax supports fuzzy or exact search queries with prefixes,
-boolean operators, and much more. Use the search as before and GitLab shows
-you matching code from each project you have access to.
-
-![Advanced Search](img/advanced_search_v13.10.png)
-
-Full details can be found in the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/query-dsl-simple-query-string-query.html#_simple_query_string_syntax), but
-here's a quick guide:
-
-- Searches look for all the words in a query, in any order - for example: searching
- issues for [`display bug`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=display+bug&group_id=9970&project_id=278964) and [`bug display`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+Display&group_id=9970&project_id=278964) return the same results.
-- To find the exact phrase (stemming still applies), use double quotes: [`"display bug"`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=%22display+bug%22&group_id=9970&project_id=278964)
-- To find bugs not mentioning display, use `-`: [`bug -display`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+-display&group_id=9970&project_id=278964)
-- To find a bug in display or banner, use `|`: [`bug display | banner`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+display+%7C+banner&group_id=9970&project_id=278964)
-- To group terms together, use parentheses: [`bug | (display +banner)`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+%7C+%28display+%2Bbanner%29&group_id=9970&project_id=278964)
-- To match a partial word, use `*`. In this example, I want to find bugs with any 500 errors. : [`bug error 50*`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+error+50*&group_id=9970&project_id=278964)
-- To use one of symbols above literally, escape the symbol with a preceding `\`: [`argument \-last`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=argument+%5C-last&group_id=9970&project_id=278964)
-
-## Syntax search filters
-
-Advanced Search also supports the use of filters. The available filters are:
-
-- `filename`: Filters by filename. You can use the glob (`*`) operator for fuzzy matching.
-- `path`: Filters by path. You can use the glob (`*`) operator for fuzzy matching.
-- `extension`: Filters by extension in the filename. Please write the extension without a leading dot. Exact match only.
-- `blob`: Filters by Git `object ID`. Exact match only.
-
-To use them, add them to your keyword in the format `<filter_name>:<value>` without
-any spaces between the colon (`:`) and the value. When no keyword is provided, an asterisk (`*`) is used as the keyword.
-
-Examples:
-
-- Finding a file with any content named `search_results.rb`: [`* filename:search_results.rb`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=*+filename%3Asearch_results.rb&group_id=9970&project_id=278964)
-- The leading asterisk (`*`) can be ignored in the case above: [`filename:search_results.rb`](https://gitlab.com/search?group_id=9970&project_id=278964&scope=blobs&search=filename%3Asearch_results.rb)
-- Finding a file named `found_blob_spec.rb` with the text `CHANGELOG` inside of it: [`CHANGELOG filename:found_blob_spec.rb`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=CHANGELOG+filename%3Afound_blob_spec.rb&group_id=9970&project_id=278964)
-- Finding the text `EpicLinks` inside files with the `.rb` extension: [`EpicLinks extension:rb`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=EpicLinks+extension%3Arb&group_id=9970&project_id=278964)
-- Finding any file with the `.yaml` extension: [`extension:yaml`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=extension%3Ayaml&group_id=9970&project_id=278964)
-- Finding the text `Sidekiq` in a file, when that file is in a path that includes `elastic`: [`Sidekiq path:elastic`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=Sidekiq+path%3Aelastic&group_id=9970&project_id=278964)
-- Finding any file in a path that includes `elasticsearch`: [`path:elasticsearch`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=path%3Aelasticsearch&group_id=9970&project_id=278964)
-- Finding the files represented by the Git object ID `998707b421c89bd9a3063333f9f728ef3e43d101`: [`* blob:998707b421c89bd9a3063333f9f728ef3e43d101`](https://gitlab.com/search?snippets=false&scope=blobs&repository_ref=&search=*+blob%3A998707b421c89bd9a3063333f9f728ef3e43d101&group_id=9970)
-- Syntax filters can be combined for complex filtering. Finding any file starting with `search` containing `eventHub` and with the `.js` extension: [`eventHub filename:search* extension:js`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=eventHub+filename%3Asearch*+extension%3Ajs&group_id=9970&project_id=278964)
-
-### Excluding filters
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31684) in GitLab 13.3.
-
-Filters can be inverted to **filter out** results from the result set, by prefixing the filter name with a `-` (hyphen) character, such as:
-
-- `-filename`
-- `-path`
-- `-extension`
-- `-blob`
-
-Examples:
+## Advanced Search syntax
-- Finding `rails` in all files but `Gemfile.lock`: [`rails -filename:Gemfile.lock`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=rails+-filename%3AGemfile.lock&group_id=9970&project_id=278964)
-- Finding `success` in all files excluding `.po|pot` files: [`success -filename:*.po*`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=success+-filename%3A*.po*&group_id=9970&project_id=278964)
-- Finding `import` excluding minified JavaScript (`.min.js`) files: [`import -extension:min.js`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=import+-extension%3Amin.js&group_id=9970&project_id=278964)
-- Finding `docs` for all files outside the `docs/` folder: [`docs -path:docs/`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=docs+-path%3Adocs%2F&group_id=9970&project_id=278964)
+See the documentation on [Advanced Search syntax](global_search/advanced_search_syntax.md).
## Search by issue or merge request ID
@@ -139,6 +76,7 @@ its performance:
| Commits | `global_search_commits_tab` | When enabled, the global search includes commits as part of the search. |
| Issues | `global_search_issues_tab` | When enabled, the global search includes issues as part of the search. |
| Merge Requests | `global_search_merge_requests_tab` | When enabled, the global search includes merge requests as part of the search. |
+| Users | `global_search_users_tab` | When enabled, the global search includes users as part of the search. |
| Wiki | `global_search_wiki_tab` | When enabled, the global search includes wiki as part of the search. [Group wikis](../project/wiki/group.md) are not included. |
## Global Search validation
diff --git a/doc/user/search/global_search/advanced_search_syntax.md b/doc/user/search/global_search/advanced_search_syntax.md
new file mode 100644
index 00000000000..962aa00eea8
--- /dev/null
+++ b/doc/user/search/global_search/advanced_search_syntax.md
@@ -0,0 +1,49 @@
+---
+stage: Enablement
+group: Global Search
+info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
+type: reference
+---
+
+# Advanced Search syntax **(PREMIUM)**
+
+With [Advanced Search](../advanced_search.md), you can perform a thorough
+search through your entire GitLab instance.
+
+The Advanced Search syntax supports fuzzy or exact search queries with prefixes,
+boolean operators, and much more. Advanced Search uses
+[Elasticsearch's syntax](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html#simple-query-string-syntax).
+
+WARNING:
+Advanced Search searches projects' default branches only.
+
+See query examples on the tables below and their respective expected output.
+The examples link to a search on GitLab.com to help you visualize the output.
+
+## General search
+
+| Query example | Expected output |
+|---|---|
+[`“display bugâ€`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=%22display+bug%22&group_id=9970&project_id=278964) | Returns the **exact phrase** _display bug_ (stemming still applies). |
+[`bug -display`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+-display&group_id=9970&project_id=278964) | Results include _bug_, and **exclude** _display_. |
+[<code>bug &#124; display</code>](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+%7C+banner&group_id=9970&project_id=278964) | Results include _bug_ **or** _display_. |
+[<code>bug &#124; (display +banner)</code>](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+%7C+%28display+%2Bbanner%29&group_id=9970&project_id=278964) | Results include _bug_ **or** _display_ **and** _banner_. |
+| [`bug error 50*`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+error+50*&group_id=9970&project_id=278964) | `*` finds **partial matches**. Results include _bug_, _error_, and the partial _50_ (looking for any 500 errors, for example). |
+| [`bug \-display`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=argument+%5C-last&group_id=9970&project_id=278964) | `\` **scapes symbols**. Results include _bug_ **and** _-display_. |
+
+## Code Search
+
+| Query example | Expected output | Notes |
+|---|---|---|
+| [`filename:*spec.rb`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=filename%3A*spec.rb&group_id=9970&project_id=278964) | Returns the specified filename. | Use `*` for fuzzy matching. |
+| [`path:spec/controllers/`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=path%3Aspec%2Fcontrollers%2F&snippets=) | Returns the specified path location of the repository. | Use `*` for fuzzy matching. |
+| [`extension:js`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=extension%3Ajs&snippets=) | Returns the specified file extension. | **Do not** include a leading dot. This only works with exact matches for the extension. |
+| [`blob:998707b421c89b*`](https://gitlab.com/search?snippets=false&scope=blobs&repository_ref=&search=blob%3A998707b421c89b*&group_id=9970) | Returns the specified Git object ID. | This only works with exact matches. |
+
+## Excluding filters
+
+Filters can also be inverted to filter out results from the result set by prefixing the filter name with a `-` (hyphen) character.
+
+| Query example | Expected output |
+|---|---|
+| [`rails -filename:gemfile.lock`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=rails+-filename%3Agemfile.lock&snippets=) | Results include _`rails`_ in all files except the _`gemfile.lock`_ file. |
diff --git a/doc/user/search/img/advanced_search_v13.10.png b/doc/user/search/img/advanced_search_v13.10.png
deleted file mode 100644
index 39cd54fea75..00000000000
--- a/doc/user/search/img/advanced_search_v13.10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/img/code_search_git_blame_v14_9.png b/doc/user/search/img/code_search_git_blame_v14_9.png
index 33d4e77e3f5..eb8d14de4a4 100644
--- a/doc/user/search/img/code_search_git_blame_v14_9.png
+++ b/doc/user/search/img/code_search_git_blame_v14_9.png
Binary files differ
diff --git a/doc/user/search/img/sort_projects.png b/doc/user/search/img/sort_projects.png
deleted file mode 100644
index 9bf2770b299..00000000000
--- a/doc/user/search/img/sort_projects.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/index.md b/doc/user/search/index.md
index 44327af380e..de5f469498e 100644
--- a/doc/user/search/index.md
+++ b/doc/user/search/index.md
@@ -14,8 +14,12 @@ The numbers indicate how many issues, merge requests, and to-do items are assign
![issues and MRs dashboard links](img/dashboard_links_v14_6.png)
-- **{issues}** **Issues**: The open issues assigned to you.
-- **{merge-request-open}** **Merge requests**: The [merge requests](../project/merge_requests/index.md) assigned to you.
+- **{issues}** **Issues**: Issues assigned to you.
+- **{merge-request-open}** **Merge requests**: Open [merge requests](../project/merge_requests/index.md).
+ Select the icon to show a dropdown list of merge request filters:
+ - [Attention requests](../project/merge_requests/index.md#request-attention-to-a-merge-request) (**{attention-solid}**) for you.
+ - [Review requests](../project/merge_requests/reviews/index.md) for you.
+ - Merge requests assigned to you.
- **{todo-done}** **To-do items**: The [to-do items](../todos.md) assigned to you.
You can search through **Open**, **Closed**, or **All** issues.
@@ -37,6 +41,8 @@ in the search field in the upper right corner:
> - Filtering by iterations was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118742) in GitLab 13.6.
> - Filtering by iterations was moved from GitLab Ultimate to GitLab Premium in 13.9.
> - Filtering by type was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322755) in GitLab 13.10 [with a flag](../../administration/feature_flags.md) named `vue_issues_list`. Disabled by default.
+> - Filtering by type was [enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/322755) in GitLab 14.10.
+> - Filtering by attention request was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/343528) in GitLab 14.10 [with a flag](../../administration/feature_flags.md) named `mr_attention_requests`. Disabled by default.
Follow these steps to filter the **Issues** and **Merge requests** list pages in projects and
groups:
@@ -44,6 +50,7 @@ groups:
1. Select **Search or filter results...**.
1. In the dropdown list that appears, select the attribute you wish to filter by:
- Assignee
+ - [Attention requests](../project/merge_requests/index.md#request-attention-to-a-merge-request)
- Author
- Confidential
- [Epic and child Epic](../group/epics/index.md) (available only for the group the Epic was created, not for [higher group levels](https://gitlab.com/gitlab-org/gitlab/-/issues/233729)).
@@ -53,12 +60,6 @@ groups:
- My-reaction
- Release
- Type
-
- FLAG:
- On self-managed GitLab, by default filtering by type is not available.
- To make it available per group, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `vue_issues_list`.
- On GitLab.com, this feature is not available.
-
- Weight
- Search for this text
1. Select or type the operator to use for filtering the attribute. The following operators are
@@ -146,6 +147,10 @@ you can type (or select from the dropdown list) the following:
- Deployed-before
- Deployed-after
+NOTE:
+Projects using a [fast-forward merge method](../project/merge_requests/fast_forward_merge.md)
+do not return results, as this method does not create a merge commit.
+
When filtering by an environment, a dropdown list presents all environments that
you can choose from:
@@ -207,10 +212,14 @@ You can also look for the projects you [starred](../project/working_with_project
You can **Explore** all public and internal projects available in GitLab.com, from which you can filter by visibility,
through **Trending**, best rated with **Most stars**, or **All** of them.
-You can also sort them by **Name**, **Last created**, **Oldest created**, **Last updated**,
-**Oldest updated**, **Owner**, and choose to hide or show **archived projects**:
+You can also sort them by:
+
+- Name
+- Created date
+- Updated date
+- Owner
-![sort projects](img/sort_projects.png)
+You can also choose to hide or show archived projects.
## Groups
@@ -221,7 +230,7 @@ On the field **Filter by name**, type the group name you want to find, and GitLa
filters them for you as you type.
You can also **Explore** all public and internal groups available in GitLab.com,
-and sort them by **Last created**, **Oldest created**, **Last updated**, or **Oldest updated**.
+and sort them by **Name**, **Last created**, **Oldest created**, or **Updated date**.
## Issue boards
@@ -246,7 +255,7 @@ In the search bar, you can view autocomplete suggestions for:
- Recently viewed issues (try and type some word from the title of a recently viewed issue)
- Recently viewed merge requests (try and type some word from the title of a recently viewed merge request)
- Recently viewed epics (try and type some word from the title of a recently viewed epic)
-- [GitLab Flavored Markdown](../markdown.md#gitlab-specific-references) (GFM) for issues in a project (try and type a GFM reference for an issue)
+- [GitLab Flavored Markdown](../markdown.md#gitlab-specific-references) (GLFM) for issues in a project (try and type a GLFM reference for an issue)
## Basic search
diff --git a/doc/user/shortcuts.md b/doc/user/shortcuts.md
index e807f251da1..e5285d63cf4 100644
--- a/doc/user/shortcuts.md
+++ b/doc/user/shortcuts.md
@@ -101,6 +101,12 @@ These shortcuts are available when viewing issues and [merge requests](project/m
| <kbd>b</kbd> | Copy source branch name (merge requests only). |
| <kbd>.</kbd> | Open the [Web IDE](project/web_ide/index.md). |
+Merge requests additionally support the following shortcuts:
+
+| macOS shortcut | Windows shortcut | Description |
+|---------------------------------|---------------------|-------------|
+| <kbd>Command</kbd> + <kbd>p</kbd> | <kbd>Control</kbd> + <kbd>p</kbd> | Search for, and then jump to a file for review. |
+
### Project files
These shortcuts are available when browsing the files in a project (go to
diff --git a/doc/user/snippets.md b/doc/user/snippets.md
index 1750e2c8d10..cab18b221c1 100644
--- a/doc/user/snippets.md
+++ b/doc/user/snippets.md
@@ -22,7 +22,7 @@ using the [GitLab Workflow VS Code extension](project/repository/vscode.md).
GitLab provides two types of snippets:
- **Personal snippets**: Created independent of any project.
- You can set a [visibility level](../public_access/public_access.md)
+ You can set a [visibility level](public_access.md)
for your snippet: public, internal, or private.
- **Project snippets**: Always related to a specific project.
Project snippets can be visible publicly or to only group members.
diff --git a/doc/user/ssh.md b/doc/user/ssh.md
new file mode 100644
index 00000000000..54d4722ee2b
--- /dev/null
+++ b/doc/user/ssh.md
@@ -0,0 +1,497 @@
+---
+stage: Manage
+group: Authentication and Authorization
+info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
+type: howto, reference
+---
+
+# Use SSH keys to communicate with GitLab **(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 you push to is GitLab.
+
+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.
+
+## Prerequisites
+
+To use SSH to communicate with GitLab, you need:
+
+- The OpenSSH client, which comes pre-installed on GNU/Linux, macOS, and Windows 10.
+- SSH version 6.5 or later. Earlier versions used an MD5 signature, which is not secure.
+
+To view the version of SSH installed on your system, run `ssh -V`.
+
+## Supported SSH key types
+
+To communicate with GitLab, you can use the following SSH key types:
+
+- [ED25519](#ed25519-ssh-keys)
+- [ED25519_SK](#ed25519_sk-ssh-keys) (Available in GitLab 14.8 and later.)
+- [ECDSA_SK](#ecdsa_sk-ssh-keys) (Available in GitLab 14.8 and later.)
+- [RSA](#rsa-ssh-keys)
+- DSA ([Deprecated](https://about.gitlab.com/releases/2018/06/22/gitlab-11-0-released/#support-for-dsa-ssh-keys) in GitLab 11.0.)
+- ECDSA (As noted in [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-ecdsa), the security issues related to DSA also apply to ECDSA.)
+
+Administrators can [restrict which keys are permitted and their minimum lengths](../security/ssh_keys_restrictions.md).
+
+### ED25519 SSH keys
+
+The book [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-chapter-5-digital-signatures)
+suggests that [ED25519](https://ed25519.cr.yp.to/) keys are more secure and performant than RSA keys.
+
+OpenSSH 6.5 introduced ED25519 SSH keys in 2014 and they should be available on most
+operating systems.
+
+### ED25519_SK SSH keys
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78934) in GitLab 14.8.
+
+To use ED25519_SK SSH keys on GitLab, your local client and GitLab server
+must have [OpenSSH 8.2](https://www.openssh.com/releasenotes.html#8.2) or later installed.
+
+### ECDSA_SK SSH keys
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78934) in GitLab 14.8.
+
+To use ECDSA_SK SSH keys on GitLab, your local client and GitLab server
+must have [OpenSSH 8.2](https://www.openssh.com/releasenotes.html#8.2) or later installed.
+
+### RSA SSH keys
+
+Available documentation suggests that ED25519 is more secure than RSA.
+
+If you use an RSA key, the US National Institute of Science and Technology in
+[Publication 800-57 Part 3 (PDF)](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf)
+recommends a key size of at least 2048 bits. The default key size depends on your version of `ssh-keygen`.
+Review the `man` page for your installed `ssh-keygen` command for details.
+
+## See if you have an existing SSH key pair
+
+Before you create a key pair, see if a key pair already exists.
+
+1. On Windows, Linux, or macOS, go to your home directory.
+1. Go to the `.ssh/` subdirectory. If the `.ssh/` subdirectory doesn't exist,
+ you are either not in the home directory, or you haven't used `ssh` before.
+ In the latter case, you need to [generate an SSH key pair](#generate-an-ssh-key-pair).
+1. See if a file with one of the following formats exists:
+
+ | Algorithm | Public key | Private key |
+ | --------- | ---------- | ----------- |
+ | ED25519 (preferred) | `id_ed25519.pub` | `id_ed25519` |
+ | ED25519_SK | `id_ed25519_sk.pub` | `id_ed25519_sk` |
+ | ECDSA_SK | `id_ecdsa_sk.pub` | `id_ecdsa_sk` |
+ | RSA (at least 2048-bit key size) | `id_rsa.pub` | `id_rsa` |
+ | DSA (deprecated) | `id_dsa.pub` | `id_dsa` |
+ | ECDSA | `id_ecdsa.pub` | `id_ecdsa` |
+
+## Generate an SSH key pair
+
+If you do not have an existing SSH key pair, generate a new one.
+
+1. Open a terminal.
+1. Type `ssh-keygen -t` followed by the key type and an optional comment.
+ This comment is included in the `.pub` file that's created.
+ You may want to use an email address for the comment.
+
+ For example, for ED25519:
+
+ ```shell
+ ssh-keygen -t ed25519 -C "<comment>"
+ ```
+
+ For 2048-bit RSA:
+
+ ```shell
+ ssh-keygen -t rsa -b 2048 -C "<comment>"
+ ```
+
+1. Press Enter. Output similar to the following is displayed:
+
+ ```plaintext
+ Generating public/private ed25519 key pair.
+ Enter file in which to save the key (/home/user/.ssh/id_ed25519):
+ ```
+
+1. Accept the suggested filename and directory, unless you are generating a [deploy key](project/deploy_keys/index.md)
+ or want to save in a specific directory where you store other keys.
+
+ You can also dedicate the SSH key pair to a [specific host](#configure-ssh-to-point-to-a-different-directory).
+
+1. Specify a [passphrase](https://www.ssh.com/academy/ssh/passphrase):
+
+ ```plaintext
+ Enter passphrase (empty for no passphrase):
+ Enter same passphrase again:
+ ```
+
+1. A confirmation is displayed, including information about where your files are stored.
+
+A public and private key are generated.
+[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account) and keep
+the private key secure.
+
+### Configure SSH to point to a different directory
+
+If you did not save your SSH key pair in the default directory,
+configure your SSH client to point to the directory where the private key is stored.
+
+1. Open a terminal and run this command:
+
+ ```shell
+ eval $(ssh-agent -s)
+ ssh-add <directory to private SSH key>
+ ```
+
+1. Save these settings in the `~/.ssh/config` file. For example:
+
+ ```conf
+ # GitLab.com
+ Host gitlab.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/gitlab_com_rsa
+
+ # Private GitLab instance
+ Host gitlab.company.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/example_com_rsa
+ ```
+
+ For more information on these settings, see the [`man ssh_config`](https://man.openbsd.org/ssh_config) page in the SSH configuration manual.
+
+Public SSH keys must be unique to GitLab because they bind to your account.
+Your SSH key is the only identifier you have when you push code with SSH.
+It must uniquely map to a single user.
+
+### Update your SSH key passphrase
+
+You can update the passphrase for your SSH key.
+
+1. Open a terminal and run this command:
+
+ ```shell
+ ssh-keygen -p -f /path/to/ssh_key
+ ```
+
+1. At the prompts, type the passphrase and press Enter.
+
+### Upgrade your RSA key pair to a more secure format
+
+If your version of OpenSSH is between 6.5 and 7.8,
+you can save your private RSA SSH keys in a more secure
+OpenSSH format.
+
+1. Open a terminal and run this command:
+
+ ```shell
+ ssh-keygen -o -f ~/.ssh/id_rsa
+ ```
+
+ Alternatively, you can generate a new RSA key with the more secure encryption format with
+ the following command:
+
+ ```shell
+ ssh-keygen -o -t rsa -b 4096 -C "<comment>"
+ ```
+
+## Generate an SSH key pair for a FIDO/U2F hardware security key
+
+To generate ED25519_SK or ECDSA_SK SSH keys, you must use OpenSSH 8.2 or later.
+
+1. Insert a hardware security key into your computer.
+1. Open a terminal.
+1. Type `ssh-keygen -t` followed by the key type and an optional comment.
+ This comment is included in the `.pub` file that's created.
+ You may want to use an email address for the comment.
+
+ For example, for ED25519_SK:
+
+ ```shell
+ ssh-keygen -t ed25519-sk -C "<comment>"
+ ```
+
+ For ECDSA_SK:
+
+ ```shell
+ ssh-keygen -t ecdsa-sk -C "<comment>"
+ ```
+
+ If your security key supports FIDO2 resident keys, you can enable this when
+ creating your SSH key:
+
+ ```shell
+ ssh-keygen -t ed25519-sk -O resident -C "<comment>"
+ ```
+
+ `-O resident` indicates that the key should be stored on the FIDO authenticator itself.
+ Resident key is easier to import to a new computer because it can be loaded directly
+ from the security key by [`ssh-add -K`](https://man.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/ssh-add.1#K)
+ or [`ssh-keygen -K`](https://man.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/ssh-keygen#K).
+
+1. Select Enter. Output similar to the following is displayed:
+
+ ```plaintext
+ Generating public/private ed25519-sk key pair.
+ You may need to touch your authenticator to authorize key generation.
+ ```
+
+1. Touch the button on the hardware security key.
+
+1. Accept the suggested filename and directory:
+
+ ```plaintext
+ Enter file in which to save the key (/home/user/.ssh/id_ed25519_sk):
+ ```
+
+1. Specify a [passphrase](https://www.ssh.com/academy/ssh/passphrase):
+
+ ```plaintext
+ Enter passphrase (empty for no passphrase):
+ Enter same passphrase again:
+ ```
+
+1. A confirmation is displayed, including information about where your files are stored.
+
+A public and private key are generated.
+[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account).
+
+## Add an SSH key to your GitLab account
+
+To use SSH with GitLab, copy your public key to your GitLab account.
+
+1. Copy the contents of your public key file. You can do this manually or use a script.
+ For example, to copy an ED25519 key to the clipboard:
+
+ **macOS:**
+
+ ```shell
+ tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy
+ ```
+
+ **Linux** (requires the `xclip` package):
+
+ ```shell
+ xclip -sel clip < ~/.ssh/id_ed25519.pub
+ ```
+
+ **Git Bash on Windows:**
+
+ ```shell
+ cat ~/.ssh/id_ed25519.pub | clip
+ ```
+
+ Replace `id_ed25519.pub` with your filename. For example, use `id_rsa.pub` for RSA.
+
+1. Sign in to GitLab.
+1. On the top bar, in the top right corner, select your avatar.
+1. Select **Preferences**.
+1. On the left sidebar, select **SSH Keys**.
+1. In the **Key** box, paste the contents of your public key.
+ If you manually copied the key, make sure you copy the entire key,
+ which starts with `ssh-rsa`, `ssh-dss`, `ecdsa-sha2-nistp256`, `ecdsa-sha2-nistp384`, `ecdsa-sha2-nistp521`,
+ `ssh-ed25519`, `sk-ecdsa-sha2-nistp256@openssh.com`, or `sk-ssh-ed25519@openssh.com`, 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](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
+ guidance when [deleting keys](admin_area/credentials_inventory.md#delete-a-users-ssh-key).
+ - GitLab 14.0 and later, the expiration date is enforced. Administrators can
+ [allow expired keys to be used](admin_area/settings/account_and_limit_settings.md#allow-expired-ssh-keys-to-be-used-deprecated).
+ - GitLab checks all SSH keys at 02:00 AM UTC every day. It emails an expiration notice for all SSH keys that expire on the current date. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
+ - GitLab checks all SSH keys at 01:00 AM UTC every day. It emails an expiration notice for all SSH keys that are scheduled to expire seven days from now. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
+1. Select **Add key**.
+
+## Verify that you can connect
+
+Verify that your SSH key was added correctly.
+
+1. For GitLab.com, to ensure you're connecting to the correct server, confirm the
+ [SSH host keys fingerprints](gitlab_com/index.md#ssh-host-keys-fingerprints).
+1. Open a terminal and run this command, replacing `gitlab.example.com` with your GitLab instance URL:
+
+ ```shell
+ ssh -T git@gitlab.example.com
+ ```
+
+1. If this is the first time you connect, you should verify the
+ authenticity of the GitLab host. If you see a message like:
+
+ ```plaintext
+ The authenticity of host 'gitlab.example.com (35.231.145.151)' can't be established.
+ ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
+ Are you sure you want to continue connecting (yes/no)? yes
+ Warning: Permanently added 'gitlab.example.com' (ECDSA) to the list of known hosts.
+ ```
+
+ Type `yes` and press Enter.
+
+1. Run the `ssh -T git@gitlab.example.com` command again. You should receive a _Welcome to GitLab, `@username`!_ message.
+
+If the welcome message doesn't appear, you can troubleshoot by running `ssh`
+in verbose mode:
+
+```shell
+ssh -Tvvv git@gitlab.example.com
+```
+
+## Use different keys for different repositories
+
+You can use a different key for each repository.
+
+Open a terminal and run this command:
+
+```shell
+git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/private-key-filename-for-this-repository -F /dev/null"
+```
+
+This command does not use the SSH Agent and requires Git 2.10 or later. For more information
+on `ssh` command options, see the `man` pages for both `ssh` and `ssh_config`.
+
+## Use different accounts on a single GitLab instance
+
+You can use multiple accounts to connect to a single instance of GitLab.
+You can do this by using the command in the [previous topic](#use-different-keys-for-different-repositories).
+However, even if you set `IdentitiesOnly` to `yes`, you cannot sign in if an `IdentityFile` exists
+outside of a `Host` block.
+
+Instead, you can assign aliases to hosts in the `~.ssh/config` file.
+
+- For the `Host`, use an alias like `user_1.gitlab.com` and
+ `user_2.gitlab.com`. Advanced configurations
+ are more difficult to maintain, and these strings are easier to
+ understand when you use tools like `git remote`.
+- For the `IdentityFile`, use the path the private key.
+
+```conf
+# User1 Account Identity
+Host <user_1.gitlab.com>
+ Hostname gitlab.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/<example_ssh_key1>
+
+# User2 Account Identity
+Host <user_2.gitlab.com>
+ Hostname gitlab.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/<example_ssh_key2>
+```
+
+Now, to clone a repository for `user_1`, use `user_1.gitlab.com` in the `git clone` command:
+
+```shell
+git clone git@<user_1.gitlab.com>:gitlab-org/gitlab.git
+```
+
+To update a previously-cloned repository that is aliased as `origin`:
+
+```shell
+git remote set-url origin git@<user_1.gitlab.com>:gitlab-org/gitlab.git
+```
+
+NOTE:
+Private and public keys contain sensitive data. Ensure the permissions
+on the files make them readable to you but not accessible to others.
+
+## Configure two-factor authentication (2FA)
+
+You can set up two-factor authentication (2FA) for
+[Git over SSH](../security/two_factor_authentication.md#2fa-for-git-over-ssh-operations). We recommend using
+[ED25519_SK](#ed25519_sk-ssh-keys) or [ECDSA_SK](#ecdsa_sk-ssh-keys) SSH keys.
+
+## Use EGit on Eclipse
+
+If you are using [EGit](https://www.eclipse.org/egit/), you can [add your SSH key to Eclipse](https://wiki.eclipse.org/EGit/User_Guide#Eclipse_SSH_Configuration).
+
+## 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)
+with [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install#update-to-wsl-2) which
+has both `git` and `ssh` preinstalled, or install [Git for Windows](https://gitforwindows.org) to
+use SSH through PowerShell.
+
+The SSH key generated in WSL is not directly available for Git for Windows, and vice versa,
+as both have a different home directory:
+
+- WSL: `/home/<user>`
+- Git for Windows: `C:\Users\<user>`
+
+You can either copy over the `.ssh/` directory to use the same key, or generate a key in each environment.
+
+Alternative tools include:
+
+- [Cygwin](https://www.cygwin.com)
+- [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
+
+## Overriding SSH settings on the GitLab server
+
+GitLab integrates with the system-installed SSH daemon and designates a user
+(typically named `git`) through which all access requests are handled. Users
+who connect to the GitLab server over SSH are identified by their SSH key instead
+of their username.
+
+SSH *client* operations performed on the GitLab server are executed as this
+user. You can modify this SSH configuration. For example, you can specify
+a private SSH key for this user to use for authentication requests. However, this practice
+is **not supported** and is strongly discouraged as it presents significant
+security risks.
+
+GitLab checks for this condition, and directs you
+to this section if your server is configured this way. For example:
+
+```shell
+$ gitlab-rake gitlab:check
+
+Git user has default SSH configuration? ... no
+ Try fixing it:
+ mkdir ~/gitlab-check-backup-1504540051
+ sudo mv /var/lib/git/.ssh/id_rsa ~/gitlab-check-backup-1504540051
+ sudo mv /var/lib/git/.ssh/id_rsa.pub ~/gitlab-check-backup-1504540051
+ For more information see:
+ doc/user/ssh.md#overriding-ssh-settings-on-the-gitlab-server
+ Please fix the error above and rerun the checks.
+```
+
+Remove the custom configuration as soon as you can. These customizations
+are **explicitly not supported** and may stop working at any time.
+
+## Troubleshooting
+
+### Password prompt with `git clone`
+
+When you run `git clone`, you may be prompted for a password, like `git@gitlab.example.com's password:`.
+This indicates that something is wrong with your SSH setup.
+
+- Ensure that you generated your SSH key pair correctly and added the public SSH
+ key to your GitLab profile.
+- Try to manually register your private SSH key by using `ssh-agent`.
+- Try to debug the connection by running `ssh -Tv git@example.com`.
+ Replace `example.com` with your GitLab URL.
+
+### `Could not resolve hostname` error
+
+You may receive the following error when [verifying that you can connect](#verify-that-you-can-connect):
+
+```shell
+ssh: Could not resolve hostname gitlab.example.com: nodename nor servname provided, or not known
+```
+
+If you receive this error, restart your terminal and try the command again.
+
+### `Key enrollment failed: invalid format` error
+
+You may receive the following error when [generating an SSH key pair for a FIDO/U2F hardware security key](#generate-an-ssh-key-pair-for-a-fidou2f-hardware-security-key):
+
+```shell
+Key enrollment failed: invalid format
+```
+
+You can troubleshoot this by trying the following:
+
+- Run the `ssh-keygen` command using `sudo`.
+- Verify your IDO/U2F hardware security key supports
+ the key type provided.
+- Verify the version of OpenSSH is 8.2 or greater by
+ running `ssh -v`.
diff --git a/doc/user/todos.md b/doc/user/todos.md
index ec316d8ebe4..5cea619c830 100644
--- a/doc/user/todos.md
+++ b/doc/user/todos.md
@@ -119,7 +119,7 @@ Actions that dismiss to-do items include:
- Closing the issue or merge request
- Adding or removing a label
- Commenting on the issue
-- Resolving a [design discussion thread](project/issues/design_management.md#resolve-design-threads)
+- Resolving a [design discussion thread](project/issues/design_management.md#resolve-a-discussion-thread-on-a-design)
If someone else closes, merges, or takes action on an issue, merge request, or
epic, your to-do item remains pending.
diff --git a/generator_templates/active_record/migration/migration.rb b/generator_templates/active_record/migration/migration.rb
index 103c2fd7ea2..50d2b018ae7 100644
--- a/generator_templates/active_record/migration/migration.rb
+++ b/generator_templates/active_record/migration/migration.rb
@@ -16,6 +16,10 @@ class <%= migration_class_name %> < Gitlab::Database::Migration[<%= Gitlab::Data
# To disable transactions uncomment the following line and remove these
# comments:
# disable_ddl_transaction!
+ #
+ # Configure the `gitlab_schema` to perform data manipulation (DML).
+ # Visit: https://docs.gitlab.com/ee/development/database/migrations_for_multiple_databases.html
+ # restrict_gitlab_migration gitlab_schema: :gitlab_main
<%- if migration_action == 'add' -%>
def change
diff --git a/generator_templates/post_deployment_migration/post_deployment_migration/migration.rb b/generator_templates/post_deployment_migration/post_deployment_migration/migration.rb
index c456fa29ea8..dcc9d1e4563 100644
--- a/generator_templates/post_deployment_migration/post_deployment_migration/migration.rb
+++ b/generator_templates/post_deployment_migration/post_deployment_migration/migration.rb
@@ -16,6 +16,10 @@ class <%= migration_class_name %> < Gitlab::Database::Migration[<%= Gitlab::Data
# To disable transactions uncomment the following line and remove these
# comments:
# disable_ddl_transaction!
+ #
+ # Configure the `gitlab_schema` to perform data manipulation (DML).
+ # Visit: https://docs.gitlab.com/ee/development/database/migrations_for_multiple_databases.html
+ # restrict_gitlab_migration gitlab_schema: :gitlab_main
def up
end
diff --git a/haml_lint/linter/documentation_links.rb b/haml_lint/linter/documentation_links.rb
index 8c696b26b13..0cabae40c4b 100644
--- a/haml_lint/linter/documentation_links.rb
+++ b/haml_lint/linter/documentation_links.rb
@@ -68,7 +68,15 @@ module HamlLint
# Sometimes links are provided via data attributes in html tag
return node.parsed_attributes.syntax_tree if node.type == :tag
- node.parsed_script.syntax_tree
+ parse_script(node).syntax_tree
+ end
+
+ def parse_script(node)
+ # It's a workaround for cases for scripts ending with "do"
+ # For some reason they don't parse correctly
+ code = node.script.delete_suffix(' do')
+
+ HamlLint::ParsedRuby.new(HamlLint::RubyParser.new.parse(code))
end
def detect_path_to_file(link)
diff --git a/jest.config.base.js b/jest.config.base.js
index 0eab5caffb0..fb2f1084bea 100644
--- a/jest.config.base.js
+++ b/jest.config.base.js
@@ -106,10 +106,49 @@ module.exports = (path, options = {}) => {
return '<rootDir>/coverage-frontend/';
};
+ const gfmParserDependencies = [
+ 'rehype-.*',
+ 'remark-.*',
+ 'hast*',
+ 'unist.*',
+ 'mdast-util-.*',
+ 'micromark.*',
+ 'vfile.*',
+ 'bail',
+ 'trough',
+ 'unified',
+ 'is-plain-obj',
+ 'decode-named-character-reference',
+ 'character-entities*',
+ 'property-information',
+ 'space-separated-tokens',
+ 'comma-separated-tokens',
+ 'web-namespaces',
+ 'zwitch',
+ 'html-void-elements',
+ 'ccount',
+ 'escape-string-regexp',
+ ];
+
+ const transformIgnoreNodeModules = [
+ '@gitlab/ui',
+ '@gitlab/favicon-overlay',
+ 'bootstrap-vue',
+ 'three',
+ 'monaco-editor',
+ 'monaco-yaml',
+ 'fast-mersenne-twister',
+ 'prosemirror-markdown',
+ 'fault',
+ 'dateformat',
+ 'lowlight',
+ ...gfmParserDependencies,
+ ];
+
return {
clearMocks: true,
testMatch,
- moduleFileExtensions: ['js', 'json', 'vue', 'gql', 'graphql'],
+ moduleFileExtensions: ['js', 'json', 'vue', 'gql', 'graphql', 'yaml'],
moduleNameMapper,
collectCoverageFrom,
coverageDirectory: coverageDirectory(),
@@ -127,11 +166,10 @@ module.exports = (path, options = {}) => {
'^.+_worker\\.js$': './spec/frontend/__helpers__/web_worker_transformer.js',
'^.+\\.js$': 'babel-jest',
'^.+\\.vue$': 'vue-jest',
+ '^.+\\.yml$': './spec/frontend/__helpers__/yaml_transformer.js',
'^.+\\.(md|zip|png)$': 'jest-raw-loader',
},
- transformIgnorePatterns: [
- 'node_modules/(?!(@gitlab/ui|@gitlab/favicon-overlay|bootstrap-vue|three|monaco-editor|monaco-yaml|fast-mersenne-twister|prosemirror-markdown|dateformat|lowlight|fault)/)',
- ],
+ transformIgnorePatterns: [`node_modules/(?!(${transformIgnoreNodeModules.join('|')}))`],
timers: 'fake',
testEnvironment: '<rootDir>/spec/frontend/environment.js',
testEnvironmentOptions: {
diff --git a/lefthook.yml b/lefthook.yml
index b21db70a385..e79df94c708 100644
--- a/lefthook.yml
+++ b/lefthook.yml
@@ -2,7 +2,7 @@ pre-push:
parallel: true
commands:
danger:
- run: CI_PROJECT_DIR=. bundle exec danger dry_run
+ run: bundle exec rake danger_local
eslint:
tags: frontend style
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
@@ -42,7 +42,7 @@ pre-push:
tags: documentation style
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: 'doc/*.md'
- run: 'if command -v vale > /dev/null 2>&1; then if ! vale --config .vale.ini --minAlertLevel error {files}; then echo "ERROR: Fix any linting errors and make sure you are using the latest version of Vale."; exit 1; fi; else echo "ERROR: Vale not found. For more information, see https://docs.errata.ai/vale/install."; exit 1; fi'
+ run: 'if [ $VALE_WARNINGS ]; then minWarnings=warning; else minWarnings=error; fi; if command -v vale > /dev/null 2>&1; then if ! vale --config .vale.ini --minAlertLevel $minWarnings {files}; then echo "ERROR: Fix any linting errors and make sure you are using the latest version of Vale."; exit 1; fi; else echo "ERROR: Vale not found. For more information, see https://docs.errata.ai/vale/install."; exit 1; fi'
gettext:
skip: true # This is disabled by default. You can enable this check by adding skip: false in lefhook-local.yml https://github.com/evilmartians/lefthook/blob/master/docs/full_guide.md#skipping-commands
tags: backend frontend view haml
diff --git a/lib/api/admin/instance_clusters.rb b/lib/api/admin/instance_clusters.rb
index 4aebd9c0d40..d6c212a9886 100644
--- a/lib/api/admin/instance_clusters.rb
+++ b/lib/api/admin/instance_clusters.rb
@@ -112,7 +112,7 @@ module API
helpers do
def clusterable_instance
- Clusters::Instance.new
+ ::Clusters::Instance.new
end
def clusters_for_current_user
diff --git a/lib/api/admin/plan_limits.rb b/lib/api/admin/plan_limits.rb
index d595b5b2e09..99be30809d2 100644
--- a/lib/api/admin/plan_limits.rb
+++ b/lib/api/admin/plan_limits.rb
@@ -5,7 +5,7 @@ module API
class PlanLimits < ::API::Base
before { authenticated_as_admin! }
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
helpers do
def current_plan(name)
diff --git a/lib/api/admin/sidekiq.rb b/lib/api/admin/sidekiq.rb
index 05eb7f8222b..9be432046a5 100644
--- a/lib/api/admin/sidekiq.rb
+++ b/lib/api/admin/sidekiq.rb
@@ -5,7 +5,7 @@ module API
class Sidekiq < ::API::Base
before { authenticated_as_admin! }
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
namespace 'admin' do
namespace 'sidekiq' do
diff --git a/lib/api/alert_management_alerts.rb b/lib/api/alert_management_alerts.rb
new file mode 100644
index 00000000000..88230c86247
--- /dev/null
+++ b/lib/api/alert_management_alerts.rb
@@ -0,0 +1,137 @@
+# frozen_string_literal: true
+
+module API
+ class AlertManagementAlerts < ::API::Base
+ feature_category :incident_management
+
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ requires :alert_iid, type: Integer, desc: 'The IID of the Alert'
+ end
+
+ resource :projects, requirements: ::API::API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ namespace ':id/alert_management_alerts/:alert_iid/metric_images' do
+ post 'authorize' do
+ authorize!(:upload_alert_management_metric_image, find_project_alert(request.params[:alert_iid]))
+
+ require_gitlab_workhorse!
+ ::Gitlab::Workhorse.verify_api_request!(request.headers)
+ status 200
+ content_type ::Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE
+
+ params = {
+ has_length: false,
+ maximum_size: ::AlertManagement::MetricImage::MAX_FILE_SIZE.to_i
+ }
+
+ ::MetricImageUploader.workhorse_authorize(**params)
+ end
+
+ desc 'Upload a metric image for an alert' do
+ success Entities::MetricImage
+ end
+ params do
+ requires :file, type: ::API::Validations::Types::WorkhorseFile, desc: 'The image file to be uploaded'
+ optional :url, type: String, desc: 'The url to view more metric info'
+ optional :url_text, type: String, desc: 'A description of the image or URL'
+ end
+ post do
+ require_gitlab_workhorse!
+ bad_request!('File is too large') if max_file_size_exceeded?
+
+ alert = find_project_alert(params[:alert_iid])
+
+ authorize!(:upload_alert_management_metric_image, alert)
+
+ upload = ::AlertManagement::MetricImages::UploadService.new(
+ alert,
+ current_user,
+ params.slice(:file, :url, :url_text)
+ ).execute
+
+ if upload.success?
+ present upload.payload[:metric],
+ with: Entities::MetricImage,
+ current_user: current_user,
+ project: user_project
+ else
+ render_api_error!(upload.message, upload.http_status)
+ end
+ end
+
+ desc 'Metric Images for alert'
+ get do
+ alert = find_project_alert(params[:alert_iid])
+
+ if can?(current_user, :read_alert_management_metric_image, alert)
+ present alert.metric_images.order_created_at_asc, with: Entities::MetricImage
+ else
+ render_api_error!('Alert not found', 404)
+ end
+ end
+
+ desc 'Update a metric image for an alert' do
+ success Entities::MetricImage
+ end
+ params do
+ requires :metric_image_id, type: Integer, desc: 'The ID of metric image'
+ optional :url, type: String, desc: 'The url to view more metric info'
+ optional :url_text, type: String, desc: 'A description of the image or URL'
+ end
+ put ':metric_image_id' do
+ alert = find_project_alert(params[:alert_iid])
+
+ authorize!(:update_alert_management_metric_image, alert)
+
+ render_api_error!('Feature not available', 403) unless alert.metric_images_available?
+
+ metric_image = alert.metric_images.find_by_id(params[:metric_image_id])
+
+ render_api_error!('Metric image not found', 404) unless metric_image
+
+ if metric_image.update(params.slice(:url, :url_text))
+ present metric_image, with: Entities::MetricImage, current_user: current_user, project: user_project
+ else
+ unprocessable_entity!('Metric image could not be updated')
+ end
+ end
+
+ desc 'Remove a metric image for an alert' do
+ success Entities::MetricImage
+ end
+ params do
+ requires :metric_image_id, type: Integer, desc: 'The ID of metric image'
+ end
+ delete ':metric_image_id' do
+ alert = find_project_alert(params[:alert_iid])
+
+ authorize!(:destroy_alert_management_metric_image, alert)
+
+ render_api_error!('Feature not available', 403) unless alert.metric_images_available?
+
+ metric_image = alert.metric_images.find_by_id(params[:metric_image_id])
+
+ render_api_error!('Metric image not found', 404) unless metric_image
+
+ if metric_image.destroy
+ no_content!
+ else
+ unprocessable_entity!('Metric image could not be deleted')
+ end
+ end
+ end
+ end
+
+ helpers do
+ def find_project_alert(iid, project_id = nil)
+ project = project_id ? find_project!(project_id) : user_project
+
+ ::AlertManagement::AlertsFinder.new(current_user, project, { iid: [iid] }).execute.first
+ end
+
+ def max_file_size_exceeded?
+ params[:file].size > ::AlertManagement::MetricImage::MAX_FILE_SIZE
+ end
+ end
+ end
+end
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 5100ec9ec9d..4dca47efdf2 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -80,6 +80,10 @@ module API
Gitlab::UsageDataCounters::JetBrainsPluginActivityUniqueCounter.track_api_request_when_trackable(user_agent: request&.user_agent, user: @current_user)
end
+ after do
+ Gitlab::UsageDataCounters::GitLabCliActivityUniqueCounter.track_api_request_when_trackable(user_agent: request&.user_agent, user: @current_user)
+ end
+
# The locale is set to the current user's locale when `current_user` is loaded
after { Gitlab::I18n.use_default_locale }
@@ -159,6 +163,7 @@ module API
mount ::API::Admin::InstanceClusters
mount ::API::Admin::PlanLimits
mount ::API::Admin::Sidekiq
+ mount ::API::AlertManagementAlerts
mount ::API::Appearance
mount ::API::Applications
mount ::API::Avatar
@@ -178,6 +183,7 @@ module API
mount ::API::Ci::SecureFiles
mount ::API::Ci::Triggers
mount ::API::Ci::Variables
+ mount ::API::Clusters::Agents
mount ::API::Commits
mount ::API::CommitStatuses
mount ::API::ContainerRegistryEvent
@@ -317,7 +323,7 @@ module API
end
end
- route :any, '*path', feature_category: :not_owned do
+ route :any, '*path', feature_category: :not_owned do # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
error!('404 Not Found', 404)
end
end
diff --git a/lib/api/bulk_imports.rb b/lib/api/bulk_imports.rb
index c732da17166..53967e0af5d 100644
--- a/lib/api/bulk_imports.rb
+++ b/lib/api/bulk_imports.rb
@@ -10,7 +10,7 @@ module API
def bulk_imports
@bulk_imports ||= ::BulkImports::ImportsFinder.new(
user: current_user,
- status: params[:status]
+ params: params
).execute
end
@@ -22,7 +22,7 @@ module API
@bulk_import_entities ||= ::BulkImports::EntitiesFinder.new(
user: current_user,
bulk_import: bulk_import,
- status: params[:status]
+ params: params
).execute
end
@@ -70,6 +70,8 @@ module API
end
params do
use :pagination
+ optional :sort, type: String, values: %w[asc desc], default: 'desc',
+ desc: 'Return GitLab Migrations sorted in created by `asc` or `desc` order.'
optional :status, type: String, values: BulkImport.all_human_statuses,
desc: 'Return GitLab Migrations with specified status'
end
@@ -82,13 +84,15 @@ module API
end
params do
use :pagination
+ optional :sort, type: String, values: %w[asc desc], default: 'desc',
+ desc: 'Return GitLab Migrations sorted in created by `asc` or `desc` order.'
optional :status, type: String, values: ::BulkImports::Entity.all_human_statuses,
desc: "Return all GitLab Migrations' entities with specified status"
end
get :entities do
entities = ::BulkImports::EntitiesFinder.new(
user: current_user,
- status: params[:status]
+ params: params
).execute
present paginate(entities), with: Entities::BulkImports::Entity
diff --git a/lib/api/ci/helpers/runner.rb b/lib/api/ci/helpers/runner.rb
index 43ed35b99fd..173cfc9a59a 100644
--- a/lib/api/ci/helpers/runner.rb
+++ b/lib/api/ci/helpers/runner.rb
@@ -104,10 +104,7 @@ module API
def set_application_context
return unless current_job
- Gitlab::ApplicationContext.push(
- user: -> { current_job.user },
- project: -> { current_job.project }
- )
+ Gitlab::ApplicationContext.push(job: current_job)
end
def track_ci_minutes_usage!(_build, _runner)
diff --git a/lib/api/ci/job_artifacts.rb b/lib/api/ci/job_artifacts.rb
index 9f59eea5013..0800993602b 100644
--- a/lib/api/ci/job_artifacts.rb
+++ b/lib/api/ci/job_artifacts.rb
@@ -28,7 +28,7 @@ module API
requires :job, type: String, desc: 'The name for the job'
end
route_setting :authentication, job_token_allowed: true
- get ':id/jobs/artifacts/:ref_name/download',
+ get ':id/jobs/artifacts/:ref_name/download', urgency: :low,
requirements: { ref_name: /.+/ } do
authorize_download_artifacts!
@@ -87,7 +87,7 @@ module API
requires :artifact_path, type: String, desc: 'Artifact path'
end
route_setting :authentication, job_token_allowed: true
- get ':id/jobs/:job_id/artifacts/*artifact_path', format: false do
+ get ':id/jobs/:job_id/artifacts/*artifact_path', urgency: :low, format: false do
authorize_download_artifacts!
build = find_build!(params[:job_id])
@@ -100,7 +100,11 @@ module API
bad_request! unless path.valid?
- send_artifacts_entry(build.artifacts_file, path)
+ # This endpoint is being used for Artifact Browser feature that renders the content via pages.
+ # Since Content-Type is controlled by Rails and Workhorse, if a wrong
+ # content-type is sent, it could cause a regression on pages rendering.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/357078 for more information.
+ legacy_send_artifacts_entry(build.artifacts_file, path)
end
desc 'Keep the artifacts to prevent them from being deleted' do
@@ -140,8 +144,6 @@ module API
desc 'Expire the artifacts files from a project'
delete ':id/artifacts' do
- not_found! unless Feature.enabled?(:bulk_expire_project_artifacts, default_enabled: :yaml)
-
authorize_destroy_artifacts!
::Ci::JobArtifacts::DeleteProjectArtifactsService.new(project: user_project).execute
diff --git a/lib/api/ci/jobs.rb b/lib/api/ci/jobs.rb
index d9d0da2e4d1..86897eb61ae 100644
--- a/lib/api/ci/jobs.rb
+++ b/lib/api/ci/jobs.rb
@@ -114,11 +114,14 @@ module API
build = find_build!(params[:job_id])
authorize!(:update_build, build)
- break forbidden!('Job is not retryable') unless build.retryable?
- build = ::Ci::Build.retry(build, current_user)
+ response = ::Ci::RetryJobService.new(@project, current_user).execute(build)
- present build, with: Entities::Ci::Job
+ if response.success?
+ present response[:job], with: Entities::Ci::Job
+ else
+ forbidden!('Job is not retryable')
+ end
end
desc 'Erase job (remove artifacts and the trace)' do
@@ -194,7 +197,7 @@ module API
pipeline = current_authenticated_job.pipeline
project = current_authenticated_job.project
- agent_authorizations = Clusters::AgentAuthorizationsFinder.new(project).execute
+ agent_authorizations = ::Clusters::AgentAuthorizationsFinder.new(project).execute
project_groups = project.group&.self_and_ancestor_ids&.map { |id| { id: id } } || []
user_access_level = project.team.max_member_access(current_user.id)
roles_in_project = Gitlab::Access.sym_options_with_owner
diff --git a/lib/api/ci/pipelines.rb b/lib/api/ci/pipelines.rb
index 2d7a437ca08..8d2c58dabdf 100644
--- a/lib/api/ci/pipelines.rb
+++ b/lib/api/ci/pipelines.rb
@@ -146,7 +146,7 @@ module API
use :pagination
end
- get ':id/pipelines/:pipeline_id/bridges', feature_category: :pipeline_authoring do
+ get ':id/pipelines/:pipeline_id/bridges', urgency: :low, feature_category: :pipeline_authoring do
authorize!(:read_build, user_project)
pipeline = user_project.all_pipelines.find(params[:pipeline_id])
diff --git a/lib/api/ci/secure_files.rb b/lib/api/ci/secure_files.rb
index d5b21e2ef29..ee39bdfd90c 100644
--- a/lib/api/ci/secure_files.rb
+++ b/lib/api/ci/secure_files.rb
@@ -54,6 +54,7 @@ module API
resource do
before do
+ read_only_feature_flag_enabled?
authorize! :admin_secure_files, user_project
end
@@ -97,6 +98,10 @@ module API
def feature_flag_enabled?
service_unavailable! unless Feature.enabled?(:ci_secure_files, user_project, default_enabled: :yaml)
end
+
+ def read_only_feature_flag_enabled?
+ service_unavailable! if Feature.enabled?(:ci_secure_files_read_only, user_project, type: :ops, default_enabled: :yaml)
+ end
end
end
end
diff --git a/lib/api/ci/variables.rb b/lib/api/ci/variables.rb
index 9c04d5e9923..ec9951aba0d 100644
--- a/lib/api/ci/variables.rb
+++ b/lib/api/ci/variables.rb
@@ -23,7 +23,7 @@ module API
params do
use :pagination
end
- get ':id/variables' do
+ get ':id/variables', urgency: :low do
variables = user_project.variables
present paginate(variables), with: Entities::Ci::Variable
end
diff --git a/lib/api/clusters/agents.rb b/lib/api/clusters/agents.rb
new file mode 100644
index 00000000000..6c1bf21b952
--- /dev/null
+++ b/lib/api/clusters/agents.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+module API
+ module Clusters
+ class Agents < ::API::Base
+ include PaginationParams
+
+ before { authenticate! }
+
+ feature_category :kubernetes_management
+
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+ resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ desc 'List agents' do
+ detail 'This feature was introduced in GitLab 14.10.'
+ success Entities::Clusters::Agent
+ end
+ params do
+ use :pagination
+ end
+ get ':id/cluster_agents' do
+ authorize! :read_cluster, user_project
+
+ agents = ::Clusters::AgentsFinder.new(user_project, current_user).execute
+
+ present paginate(agents), with: Entities::Clusters::Agent
+ end
+
+ desc 'Get single agent' do
+ detail 'This feature was introduced in GitLab 14.10.'
+ success Entities::Clusters::Agent
+ end
+ params do
+ requires :agent_id, type: Integer, desc: 'The ID of an agent'
+ end
+ get ':id/cluster_agents/:agent_id' do
+ authorize! :read_cluster, user_project
+
+ agent = user_project.cluster_agents.find(params[:agent_id])
+
+ present agent, with: Entities::Clusters::Agent
+ end
+
+ desc 'Add an agent to a project' do
+ detail 'This feature was introduced in GitLab 14.10.'
+ success Entities::Clusters::Agent
+ end
+ params do
+ requires :name, type: String, desc: 'The name of the agent'
+ end
+ post ':id/cluster_agents' do
+ authorize! :create_cluster, user_project
+
+ params = declared_params(include_missing: false)
+
+ result = ::Clusters::Agents::CreateService.new(user_project, current_user).execute(name: params[:name])
+
+ bad_request!(result[:message]) if result[:status] == :error
+
+ present result[:cluster_agent], with: Entities::Clusters::Agent
+ end
+
+ desc 'Delete an agent' do
+ detail 'This feature was introduced in GitLab 14.10.'
+ end
+ params do
+ requires :agent_id, type: Integer, desc: 'The ID of an agent'
+ end
+ delete ':id/cluster_agents/:agent_id' do
+ authorize! :admin_cluster, user_project
+
+ agent = user_project.cluster_agents.find(params.delete(:agent_id))
+
+ destroy_conditionally!(agent)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/composer_packages.rb b/lib/api/composer_packages.rb
index 0e6e04d2645..c311b34a697 100644
--- a/lib/api/composer_packages.rb
+++ b/lib/api/composer_packages.rb
@@ -113,10 +113,6 @@ module API
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
- before do
- unauthorized_user_project!
- end
-
desc 'Composer packages endpoint for registering packages'
namespace ':id/packages/composer' do
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true, deploy_token_allowed: true
@@ -150,8 +146,11 @@ module API
requires :sha, type: String, desc: 'Shasum of current json'
requires :package_name, type: String, file_path: true, desc: 'The Composer package name'
end
+ route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true, deploy_token_allowed: true
get 'archives/*package_name' do
- metadata = unauthorized_user_project
+ authorize_read_package!(authorized_user_project)
+
+ metadata = authorized_user_project
.packages
.composer
.with_name(params[:package_name])
@@ -161,9 +160,9 @@ module API
not_found! unless metadata
- track_package_event('pull_package', :composer, project: unauthorized_user_project, namespace: unauthorized_user_project.namespace)
+ track_package_event('pull_package', :composer, project: authorized_user_project, namespace: authorized_user_project.namespace)
- send_git_archive unauthorized_user_project.repository, ref: metadata.target_sha, format: 'zip', append_sha: true
+ send_git_archive authorized_user_project.repository, ref: metadata.target_sha, format: 'zip', append_sha: true
end
end
end
diff --git a/lib/api/entities/application_setting.rb b/lib/api/entities/application_setting.rb
index 465c5f4112b..db51d4380d0 100644
--- a/lib/api/entities/application_setting.rb
+++ b/lib/api/entities/application_setting.rb
@@ -40,6 +40,9 @@ module API
expose :password_authentication_enabled_for_web, as: :signin_enabled
expose :allow_local_requests_from_web_hooks_and_services, as: :allow_local_requests_from_hooks_and_services
expose :asset_proxy_allowlist, as: :asset_proxy_whitelist
+
+ # This field is deprecated and always returns true
+ expose(:housekeeping_bitmaps_enabled) { |_settings, _options| true }
end
end
end
diff --git a/lib/api/entities/award_emoji.rb b/lib/api/entities/award_emoji.rb
index da9a183bf39..40dc38b1900 100644
--- a/lib/api/entities/award_emoji.rb
+++ b/lib/api/entities/award_emoji.rb
@@ -8,6 +8,7 @@ module API
expose :user, using: Entities::UserBasic
expose :created_at, :updated_at
expose :awardable_id, :awardable_type
+ expose :url
end
end
end
diff --git a/lib/api/entities/basic_release_details.rb b/lib/api/entities/basic_release_details.rb
new file mode 100644
index 00000000000..d13080f32f4
--- /dev/null
+++ b/lib/api/entities/basic_release_details.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class BasicReleaseDetails < Grape::Entity
+ include ::API::Helpers::Presentable
+
+ expose :name
+ expose :tag, as: :tag_name
+ expose :description
+ expose :created_at
+ expose :released_at
+ expose :upcoming_release?, as: :upcoming_release
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/artifacts.rb b/lib/api/entities/ci/job_request/artifacts.rb
index 4b09db40504..d1fb7d330b9 100644
--- a/lib/api/entities/ci/job_request/artifacts.rb
+++ b/lib/api/entities/ci/job_request/artifacts.rb
@@ -6,7 +6,7 @@ module API
module JobRequest
class Artifacts < Grape::Entity
expose :name
- expose :untracked
+ expose :untracked, expose_nil: false
expose :paths
expose :exclude, expose_nil: false
expose :when
diff --git a/lib/api/entities/clusters/agent.rb b/lib/api/entities/clusters/agent.rb
index 3b4538b81c2..140b680f5e8 100644
--- a/lib/api/entities/clusters/agent.rb
+++ b/lib/api/entities/clusters/agent.rb
@@ -5,7 +5,10 @@ module API
module Clusters
class Agent < Grape::Entity
expose :id
+ expose :name
expose :project, with: Entities::ProjectIdentity, as: :config_project
+ expose :created_at
+ expose :created_by_user_id
end
end
end
diff --git a/lib/api/entities/commit_with_link.rb b/lib/api/entities/commit_with_link.rb
index a135cc19480..23efaca34d5 100644
--- a/lib/api/entities/commit_with_link.rb
+++ b/lib/api/entities/commit_with_link.rb
@@ -29,7 +29,7 @@ module API
end
expose :signature_html, if: { type: :full } do |commit|
- render('projects/commit/_signature', signature: commit.signature) if commit.has_signature?
+ ::CommitPresenter.new(commit).signature_html
end
expose :prev_commit_id, if: { type: :full } do |commit|
@@ -50,12 +50,6 @@ module API
pipelines_project_commit_path(pipeline_project, commit.id, ref: pipeline_ref)
end
-
- def render(*args)
- return unless request.respond_to?(:render) && request.render.respond_to?(:call)
-
- request.render.call(*args)
- end
end
end
end
diff --git a/lib/api/entities/issue.rb b/lib/api/entities/issue.rb
index e2506cc596e..f87ef093cd8 100644
--- a/lib/api/entities/issue.rb
+++ b/lib/api/entities/issue.rb
@@ -35,6 +35,10 @@ module API
issue
end
+ expose :severity,
+ format_with: :upcase,
+ documentation: { type: "String", desc: "One of #{::IssuableSeverity.severities.keys.map(&:upcase)}" }
+
# Calculating the value of subscribed field triggers Markdown
# processing. We can't do that for multiple issues / merge
# requests in a single API request.
diff --git a/lib/api/entities/member.rb b/lib/api/entities/member.rb
index 87f03adba31..7ce1e73a043 100644
--- a/lib/api/entities/member.rb
+++ b/lib/api/entities/member.rb
@@ -6,6 +6,7 @@ module API
expose :user, merge: true, using: UserBasic
expose :access_level
expose :created_at
+ expose :created_by, with: UserBasic, expose_nil: false
expose :expires_at
end
end
diff --git a/lib/api/entities/merge_request_changes.rb b/lib/api/entities/merge_request_changes.rb
index 488f33dfb93..a1e8b5ae00a 100644
--- a/lib/api/entities/merge_request_changes.rb
+++ b/lib/api/entities/merge_request_changes.rb
@@ -24,7 +24,7 @@ module API
end
def expose_raw_diffs?
- options[:access_raw_diffs] || ::Feature.enabled?(:mrc_api_use_raw_diffs_from_gitaly, options[:project])
+ options[:access_raw_diffs]
end
end
end
diff --git a/lib/api/entities/metric_image.rb b/lib/api/entities/metric_image.rb
new file mode 100644
index 00000000000..fd5e3a62e40
--- /dev/null
+++ b/lib/api/entities/metric_image.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class MetricImage < Grape::Entity
+ expose :id, :created_at, :filename, :file_path, :url, :url_text
+ end
+ end
+end
diff --git a/lib/api/entities/project.rb b/lib/api/entities/project.rb
index 8f9a8add938..60cc5167c41 100644
--- a/lib/api/entities/project.rb
+++ b/lib/api/entities/project.rb
@@ -85,8 +85,11 @@ module API
end
expose :mr_default_target_self, if: -> (project) { project.forked? }
+ expose :import_url, if: -> (project, options) { Ability.allowed?(options[:current_user], :admin_project, project) } do |project|
+ project[:import_url]
+ end
+ expose :import_type, if: -> (project, options) { Ability.allowed?(options[:current_user], :admin_project, project) }
expose :import_status
-
expose :import_error, if: lambda { |_project, options| options[:user_can_admin_project] } do |project|
project.import_state&.last_error
end
diff --git a/lib/api/entities/release.rb b/lib/api/entities/release.rb
index 056b54674f1..2403c907f7f 100644
--- a/lib/api/entities/release.rb
+++ b/lib/api/entities/release.rb
@@ -2,20 +2,14 @@
module API
module Entities
- class Release < Grape::Entity
+ class Release < BasicReleaseDetails
include ::API::Helpers::Presentable
- expose :name
- expose :tag, as: :tag_name, if: ->(_, _) { can_download_code? }
- expose :description
expose :description_html, if: -> (_, options) { options[:include_html_description] } do |entity|
MarkupHelper.markdown_field(entity, :description, current_user: options[:current_user])
end
- expose :created_at
- expose :released_at
expose :author, using: Entities::UserBasic, if: -> (release, _) { release.author.present? }
expose :commit, using: Entities::Commit, if: ->(_, _) { can_download_code? }
- expose :upcoming_release?, as: :upcoming_release
expose :milestones,
using: Entities::MilestoneWithStats,
if: -> (release, _) { release.milestones.present? && can_read_milestone? } do |release, _|
diff --git a/lib/api/entities/user_with_admin.rb b/lib/api/entities/user_with_admin.rb
index e148a5c45b5..f9c1a646a4f 100644
--- a/lib/api/entities/user_with_admin.rb
+++ b/lib/api/entities/user_with_admin.rb
@@ -5,6 +5,7 @@ module API
class UserWithAdmin < UserPublic
expose :admin?, as: :is_admin
expose :note
+ expose :namespace_id
end
end
end
diff --git a/lib/api/entities/wiki_attachment.rb b/lib/api/entities/wiki_attachment.rb
index e622dea04dd..03a6cc8d644 100644
--- a/lib/api/entities/wiki_attachment.rb
+++ b/lib/api/entities/wiki_attachment.rb
@@ -16,11 +16,11 @@ module API
end
def filename
- object.file_name
+ object[:file_name]
end
def secure_url
- object.file_path
+ object[:file_path]
end
end
end
diff --git a/lib/api/environments.rb b/lib/api/environments.rb
index c032b80e39b..19b48c1e3cf 100644
--- a/lib/api/environments.rb
+++ b/lib/api/environments.rb
@@ -131,7 +131,7 @@ module API
environment = user_project.environments.find(params[:environment_id])
authorize! :stop_environment, environment
- environment.stop_with_action!(current_user)
+ environment.stop_with_actions!(current_user)
status 200
present environment, with: Entities::Environment, current_user: current_user
diff --git a/lib/api/files.rb b/lib/api/files.rb
index 39b3904ec90..41a8e899614 100644
--- a/lib/api/files.rb
+++ b/lib/api/files.rb
@@ -24,7 +24,8 @@ module API
file_content_encoding: attrs[:encoding],
author_email: attrs[:author_email],
author_name: attrs[:author_name],
- last_commit_sha: attrs[:last_commit_id]
+ last_commit_sha: attrs[:last_commit_id],
+ execute_filemode: attrs[:execute_filemode]
}
end
@@ -65,7 +66,8 @@ module API
ref: params[:ref],
blob_id: @blob.id,
commit_id: @commit.id,
- last_commit_id: @repo.last_commit_id_for_path(@commit.sha, params[:file_path], literal_pathspec: true)
+ last_commit_id: @repo.last_commit_id_for_path(@commit.sha, params[:file_path], literal_pathspec: true),
+ execute_filemode: @blob.executable?
}
end
@@ -83,6 +85,7 @@ module API
requires :content, type: String, desc: 'File content'
optional :encoding, type: String, values: %w[base64], desc: 'File encoding'
optional :last_commit_id, type: String, desc: 'Last known commit id for this file'
+ optional :execute_filemode, type: Boolean, desc: 'Enable / Disable the executable flag on the file path'
end
end
diff --git a/lib/api/group_export.rb b/lib/api/group_export.rb
index f0c0182a02f..5754eceda97 100644
--- a/lib/api/group_export.rb
+++ b/lib/api/group_export.rb
@@ -3,8 +3,6 @@
module API
class GroupExport < ::API::Base
before do
- not_found! unless Feature.enabled?(:group_import_export, user_group, default_enabled: true)
-
authorize! :admin_group, user_group
end
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
index 5fbf222be5d..0ed14476c61 100644
--- a/lib/api/groups.rb
+++ b/lib/api/groups.rb
@@ -7,10 +7,10 @@ module API
before { authenticate_non_get! }
- feature_category :subgroups
-
helpers Helpers::GroupsHelpers
+ feature_category :subgroups, ['/groups/:id/custom_attributes', '/groups/:id/custom_attributes/:key']
+
helpers do
params :statistics_params do
optional :statistics, type: Boolean, default: false, desc: 'Include project statistics'
@@ -181,7 +181,7 @@ module API
use :group_list_params
use :with_custom_attributes
end
- get do
+ get feature_category: :subgroups do
groups = find_groups(declared_params(include_missing: false), params[:id])
present_groups_with_pagination_strategies params, groups
end
@@ -196,7 +196,7 @@ module API
use :optional_params
end
- post do
+ post feature_category: :subgroups do
parent_group = find_group!(params[:parent_id]) if params[:parent_id].present?
if parent_group
authorize! :create_subgroup, parent_group
@@ -229,7 +229,7 @@ module API
use :optional_update_params
use :optional_update_params_ee
end
- put ':id' do
+ put ':id', feature_category: :subgroups do
group = find_group!(params[:id])
group.preload_shared_group_links
@@ -249,7 +249,8 @@ module API
use :with_custom_attributes
optional :with_projects, type: Boolean, default: true, desc: 'Omit project details'
end
- get ":id" do
+ # TODO: Set higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/357841
+ get ":id", feature_category: :subgroups, urgency: :low do
group = find_group!(params[:id])
group.preload_shared_group_links
@@ -265,7 +266,7 @@ module API
end
desc 'Remove a group.'
- delete ":id" do
+ delete ":id", feature_category: :subgroups do
group = find_group!(params[:id])
authorize! :admin_group, group
check_subscription! group
@@ -300,7 +301,8 @@ module API
use :with_custom_attributes
use :optional_projects_params
end
- get ":id/projects" do
+ # TODO: Set higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/211498
+ get ":id/projects", feature_category: :subgroups, urgency: :low do
finder_options = {
only_owned: !params[:with_shared],
include_subgroups: params[:include_subgroups],
@@ -334,7 +336,7 @@ module API
use :pagination
use :with_custom_attributes
end
- get ":id/projects/shared" do
+ get ":id/projects/shared", feature_category: :subgroups do
projects = find_group_projects(params, { only_shared: true })
present_projects(params, projects)
@@ -347,7 +349,7 @@ module API
use :group_list_params
use :with_custom_attributes
end
- get ":id/subgroups" do
+ get ":id/subgroups", feature_category: :subgroups, urgency: :low do
groups = find_groups(declared_params(include_missing: false), params[:id])
present_groups params, groups
end
@@ -359,7 +361,7 @@ module API
use :group_list_params
use :with_custom_attributes
end
- get ":id/descendant_groups" do
+ get ":id/descendant_groups", feature_category: :subgroups do
finder_params = declared_params(include_missing: false).merge(include_parent_descendants: true)
groups = find_groups(finder_params, params[:id])
present_groups params, groups
@@ -371,7 +373,7 @@ module API
params do
requires :project_id, type: String, desc: 'The ID or path of the project'
end
- post ":id/projects/:project_id", requirements: { project_id: /.+/ } do
+ post ":id/projects/:project_id", requirements: { project_id: /.+/ }, feature_category: :projects do
authenticated_as_admin!
group = find_group!(params[:id])
group.preload_shared_group_links
@@ -391,7 +393,7 @@ module API
desc: 'The ID of the target group to which the group needs to be transferred to.'\
'If not provided, the source group will be promoted to a root group.'
end
- post ':id/transfer' do
+ post ':id/transfer', feature_category: :subgroups do
group = find_group!(params[:id])
authorize! :admin_group, group
@@ -415,7 +417,7 @@ module API
requires :group_access, type: Integer, values: Gitlab::Access.all_values, desc: 'The group access level'
optional :expires_at, type: Date, desc: 'Share expiration date'
end
- post ":id/share" do
+ post ":id/share", feature_category: :subgroups do
shared_group = find_group!(params[:id])
shared_with_group = find_group!(params[:group_id])
@@ -438,7 +440,7 @@ module API
requires :group_id, type: Integer, desc: 'The ID of the shared group'
end
# rubocop: disable CodeReuse/ActiveRecord
- delete ":id/share/:group_id" do
+ delete ":id/share/:group_id", feature_category: :subgroups do
shared_group = find_group!(params[:id])
link = shared_group.shared_with_group_links.find_by(shared_with_group_id: params[:group_id])
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index de9d42bdce7..e4a7f2213ae 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -705,8 +705,16 @@ module API
body ''
end
+ # Deprecated. Use `send_artifacts_entry` instead.
+ def legacy_send_artifacts_entry(file, entry)
+ header(*Gitlab::Workhorse.send_artifacts_entry(file, entry))
+
+ body ''
+ end
+
def send_artifacts_entry(file, entry)
header(*Gitlab::Workhorse.send_artifacts_entry(file, entry))
+ header(*Gitlab::Workhorse.detect_content_type)
body ''
end
diff --git a/lib/api/integrations.rb b/lib/api/integrations.rb
index ff1d88e35f0..71c55704ddf 100644
--- a/lib/api/integrations.rb
+++ b/lib/api/integrations.rb
@@ -6,7 +6,7 @@ module API
integrations = Helpers::IntegrationsHelpers.integrations
integration_classes = Helpers::IntegrationsHelpers.integration_classes
- if Rails.env.development?
+ if Gitlab.dev_or_test_env?
integrations['mock-ci'] = [
{
required: true,
diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb
index 9c527f28d44..2ab5d482295 100644
--- a/lib/api/internal/base.rb
+++ b/lib/api/internal/base.rb
@@ -189,7 +189,7 @@ module API
present actor.user, with: Entities::UserSafe
end
- get '/check', feature_category: :not_owned do
+ get '/check', feature_category: :not_owned do # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
{
api_version: API.version,
gitlab_version: Gitlab::VERSION,
diff --git a/lib/api/internal/kubernetes.rb b/lib/api/internal/kubernetes.rb
index df887a83c4f..59bc917a602 100644
--- a/lib/api/internal/kubernetes.rb
+++ b/lib/api/internal/kubernetes.rb
@@ -54,7 +54,7 @@ module API
def check_agent_token
unauthorized! unless agent_token
- Clusters::AgentTokens::TrackUsageService.new(agent_token).execute
+ ::Clusters::AgentTokens::TrackUsageService.new(agent_token).execute
end
end
@@ -91,9 +91,9 @@ module API
requires :agent_config, type: JSON, desc: 'Configuration for the Agent'
end
post '/' do
- agent = Clusters::Agent.find(params[:agent_id])
+ agent = ::Clusters::Agent.find(params[:agent_id])
- Clusters::Agents::RefreshAuthorizationService.new(agent, config: params[:agent_config]).execute
+ ::Clusters::Agents::RefreshAuthorizationService.new(agent, config: params[:agent_config]).execute
no_content!
end
diff --git a/lib/api/invitations.rb b/lib/api/invitations.rb
index d78576b5d5b..75f63a5d98f 100644
--- a/lib/api/invitations.rb
+++ b/lib/api/invitations.rb
@@ -20,19 +20,25 @@ module API
success Entities::Invitation
end
params do
- requires :email, types: [String, Array[String]], email_or_email_list: true, desc: 'The email address to invite, or multiple emails separated by comma'
requires :access_level, type: Integer, values: Gitlab::Access.all_values, desc: 'A valid access level (defaults: `30`, developer access level)'
+ optional :email, types: [String, Array[String]], email_or_email_list: true, desc: 'The email address to invite, or multiple emails separated by comma'
+ optional :user_id, types: [Integer, String], desc: 'The user ID of the new member or multiple IDs separated by commas.'
optional :expires_at, type: DateTime, desc: 'Date string in the format YEAR-MONTH-DAY'
optional :invite_source, type: String, desc: 'Source that triggered the member creation process', default: 'invitations-api'
optional :tasks_to_be_done, type: Array[String], coerce_with: Validations::Types::CommaSeparatedToArray.coerce, desc: 'Tasks the inviter wants the member to do'
optional :tasks_project_id, type: Integer, desc: 'The project ID in which to create the task issues'
end
post ":id/invitations" do
- params[:source] = find_source(source_type, params[:id])
+ ::Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/354016')
- authorize_admin_source!(source_type, params[:source])
+ bad_request!('Must provide either email or user_id as a parameter') if params[:email].blank? && params[:user_id].blank?
- ::Members::InviteService.new(current_user, params).execute
+ source = find_source(source_type, params[:id])
+ authorize_admin_source!(source_type, source)
+
+ create_service_params = params.except(:user_id).merge({ user_ids: params[:user_id], source: source })
+
+ ::Members::InviteService.new(current_user, create_service_params).execute
end
desc 'Get a list of group or project invitations viewable by the authenticated user' do
diff --git a/lib/api/issue_links.rb b/lib/api/issue_links.rb
index 98451afb12d..0e93a4adb65 100644
--- a/lib/api/issue_links.rb
+++ b/lib/api/issue_links.rb
@@ -67,14 +67,16 @@ module API
requires :issue_link_id, type: Integer, desc: 'The ID of an issue link'
end
delete ':id/issues/:issue_iid/links/:issue_link_id' do
- issue_link = IssueLink.find(declared_params[:issue_link_id])
+ issue = find_project_issue(params[:issue_iid])
+ issue_link = IssueLink
+ .for_source_or_target(issue)
+ .find(declared_params[:issue_link_id])
- find_project_issue(params[:issue_iid])
find_project_issue(issue_link.target.iid.to_s, issue_link.target.project_id.to_s)
result = ::IssueLinks::DestroyService
- .new(issue_link, current_user)
- .execute
+ .new(issue_link, current_user)
+ .execute
if result[:status] == :success
present issue_link, with: Entities::IssueLink
diff --git a/lib/api/lint.rb b/lib/api/lint.rb
index 6de78c81cac..f65ecf3b4a6 100644
--- a/lib/api/lint.rb
+++ b/lib/api/lint.rb
@@ -21,7 +21,7 @@ module API
optional :include_merged_yaml, type: Boolean, desc: 'Whether or not to include merged CI config yaml in the response'
optional :include_jobs, type: Boolean, desc: 'Whether or not to include CI jobs in the response'
end
- post '/lint' do
+ post '/lint', urgency: :low do
unauthorized! unless can_lint_ci?
result = Gitlab::Ci::Lint.new(project: nil, current_user: current_user)
diff --git a/lib/api/markdown.rb b/lib/api/markdown.rb
index de612ff8321..c465087c4a2 100644
--- a/lib/api/markdown.rb
+++ b/lib/api/markdown.rb
@@ -2,7 +2,7 @@
module API
class Markdown < ::API::Base
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
params do
requires :text, type: String, desc: "The markdown text to render"
diff --git a/lib/api/members.rb b/lib/api/members.rb
index 4798edc4ddf..01e859c94c4 100644
--- a/lib/api/members.rb
+++ b/lib/api/members.rb
@@ -7,6 +7,7 @@ module API
before { authenticate! }
feature_category :authentication_and_authorization
+ urgency :low
helpers ::API::Helpers::MembersHelpers
@@ -100,8 +101,6 @@ module API
end
post ":id/members" do
- ::Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/333434')
-
source = find_source(source_type, params[:id])
authorize_admin_source!(source_type, source)
diff --git a/lib/api/metrics/dashboard/annotations.rb b/lib/api/metrics/dashboard/annotations.rb
index 0989340b3ea..c6406bf61df 100644
--- a/lib/api/metrics/dashboard/annotations.rb
+++ b/lib/api/metrics/dashboard/annotations.rb
@@ -12,7 +12,7 @@ module API
ANNOTATIONS_SOURCES = [
{ class: ::Environment, resource: :environments, create_service_param_key: :environment },
- { class: Clusters::Cluster, resource: :clusters, create_service_param_key: :cluster }
+ { class: ::Clusters::Cluster, resource: :clusters, create_service_param_key: :cluster }
].freeze
ANNOTATIONS_SOURCES.each do |annotations_source|
diff --git a/lib/api/namespaces.rb b/lib/api/namespaces.rb
index d2468fb1c2e..1f3516e0667 100644
--- a/lib/api/namespaces.rb
+++ b/lib/api/namespaces.rb
@@ -6,8 +6,6 @@ module API
before { authenticate! }
- feature_category :subgroups
-
helpers do
params :optional_list_params_ee do
# EE::API::Namespaces would override this helper
@@ -32,7 +30,7 @@ module API
use :pagination
use :optional_list_params_ee
end
- get do
+ get feature_category: :subgroups do
owned_only = params[:owned_only] == true
namespaces = current_user.admin ? Namespace.all : current_user.namespaces(owned_only: owned_only)
@@ -54,7 +52,7 @@ module API
params do
requires :id, type: String, desc: "Namespace's ID or path"
end
- get ':id', requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ get ':id', requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS, feature_category: :subgroups do
user_namespace = find_namespace!(params[:id])
present user_namespace, with: Entities::Namespace, current_user: current_user
@@ -67,7 +65,7 @@ module API
requires :namespace, type: String, desc: "Namespace's path"
optional :parent_id, type: Integer, desc: "The ID of the parent namespace. If no ID is specified, only top-level namespaces are considered."
end
- get ':namespace/exists', requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ get ':namespace/exists', requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS, feature_category: :subgroups do
namespace_path = params[:namespace]
exists = Namespace.without_project_namespaces.by_parent(params[:parent_id]).filter_by_path(namespace_path).exists?
diff --git a/lib/api/notes.rb b/lib/api/notes.rb
index b260f5289b3..c12b3bf5562 100644
--- a/lib/api/notes.rb
+++ b/lib/api/notes.rb
@@ -112,7 +112,7 @@ module API
requires :noteable_id, type: Integer, desc: 'The ID of the noteable'
requires :note_id, type: Integer, desc: 'The ID of a note'
optional :body, type: String, allow_blank: false, desc: 'The content of a note'
- optional :confidential, type: Boolean, desc: 'Confidentiality note flag'
+ optional :confidential, type: Boolean, desc: '[Deprecated in 14.10] No longer allowed to update confidentiality of notes'
end
put ":id/#{noteables_str}/:noteable_id/notes/:note_id", feature_category: feature_category do
noteable = find_noteable(noteable_type, params[:noteable_id])
diff --git a/lib/api/notification_settings.rb b/lib/api/notification_settings.rb
index 7d28394e034..420eabb41db 100644
--- a/lib/api/notification_settings.rb
+++ b/lib/api/notification_settings.rb
@@ -5,7 +5,7 @@ module API
class NotificationSettings < ::API::Base
before { authenticate! }
- feature_category :users
+ feature_category :team_planning
helpers ::API::Helpers::MembersHelpers
diff --git a/lib/api/project_events.rb b/lib/api/project_events.rb
index 69b47f9420d..e8829216336 100644
--- a/lib/api/project_events.rb
+++ b/lib/api/project_events.rb
@@ -8,6 +8,9 @@ module API
feature_category :users
+ # TODO: Set higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/357839
+ urgency :low
+
params do
requires :id, type: String, desc: 'The ID of a project'
end
diff --git a/lib/api/project_export.rb b/lib/api/project_export.rb
index 843f72c0e1d..8b27d8d2163 100644
--- a/lib/api/project_export.rb
+++ b/lib/api/project_export.rb
@@ -25,7 +25,7 @@ module API
detail 'This feature was introduced in GitLab 10.6.'
end
get ':id/export/download' do
- check_rate_limit! :project_download_export, scope: [current_user, user_project]
+ check_rate_limit! :project_download_export, scope: [current_user, user_project.namespace]
if user_project.export_file_exists?
if user_project.export_archive_exists?
diff --git a/lib/api/project_import.rb b/lib/api/project_import.rb
index fae170d638b..bd8faefa803 100644
--- a/lib/api/project_import.rb
+++ b/lib/api/project_import.rb
@@ -135,8 +135,6 @@ module API
success Entities::ProjectImportStatus
end
post 'remote-import' do
- not_found! unless ::Feature.enabled?(:import_project_from_remote_file, default_enabled: :yaml)
-
check_rate_limit! :project_import, scope: [current_user, :project_import]
response = ::Import::GitlabProjects::CreateProjectService.new(
diff --git a/lib/api/project_snippets.rb b/lib/api/project_snippets.rb
index a80e45637dc..14792730eae 100644
--- a/lib/api/project_snippets.rb
+++ b/lib/api/project_snippets.rb
@@ -38,7 +38,7 @@ module API
params do
use :pagination
end
- get ":id/snippets" do
+ get ":id/snippets", urgency: :low do
authenticate!
present paginate(snippets_for_current_user), with: Entities::ProjectSnippet, current_user: current_user
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index d772079372c..9f7b3f9b088 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -20,6 +20,7 @@ module API
projects = projects.with_merge_requests_enabled if params[:with_merge_requests_enabled]
projects = projects.with_statistics if params[:statistics]
projects = projects.joins(:statistics) if params[:order_by].include?('project_statistics') # rubocop: disable CodeReuse/ActiveRecord
+ projects = projects.created_by(current_user).imported.with_import_state if params[:imported]
lang = params[:with_programming_language]
projects = projects.with_programming_language(lang) if lang
@@ -125,6 +126,7 @@ module API
optional :search_namespaces, type: Boolean, desc: "Include ancestor namespaces when matching search criteria"
optional :owned, type: Boolean, default: false, desc: 'Limit by owned by authenticated user'
optional :starred, type: Boolean, default: false, desc: 'Limit by starred status'
+ optional :imported, type: Boolean, default: false, desc: 'Limit by imported by authenticated user'
optional :membership, type: Boolean, default: false, desc: 'Limit by projects that the current user is a member of'
optional :with_issues_enabled, type: Boolean, default: false, desc: 'Limit by enabled issues feature'
optional :with_merge_requests_enabled, type: Boolean, default: false, desc: 'Limit by enabled merge requests feature'
@@ -212,7 +214,7 @@ module API
use :statistics_params
use :with_custom_attributes
end
- get ":user_id/projects", feature_category: :projects do
+ get ":user_id/projects", feature_category: :projects, urgency: :default do
user = find_user(params[:user_id])
not_found!('User') unless user
@@ -249,7 +251,8 @@ module API
use :statistics_params
use :with_custom_attributes
end
- get feature_category: :projects do
+ # TODO: Set higher urgency https://gitlab.com/gitlab-org/gitlab/-/issues/211495
+ get feature_category: :projects, urgency: :low do
present_projects load_projects
end
@@ -338,7 +341,8 @@ module API
optional :license, type: Boolean, default: false,
desc: 'Include project license data'
end
- get ":id", feature_category: :projects do
+ # TODO: Set higher urgency https://gitlab.com/gitlab-org/gitlab/-/issues/357622
+ get ":id", feature_category: :projects, urgency: :default do
options = {
with: current_user ? Entities::ProjectWithAccess : Entities::BasicProjectDetails,
current_user: current_user,
@@ -609,7 +613,8 @@ module API
params do
requires :project_id, type: Integer, desc: 'The ID of the source project to import the members from.'
end
- post ":id/import_project_members/:project_id", feature_category: :experimentation_expansion do
+ post ":id/import_project_members/:project_id", feature_category: :projects do
+ ::Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/355916')
authorize! :admin_project, user_project
source_project = Project.find_by_id(params[:project_id])
@@ -628,7 +633,7 @@ module API
desc 'Workhorse authorize the file upload' do
detail 'This feature was introduced in GitLab 13.11'
end
- post ':id/uploads/authorize', feature_category: :not_owned do
+ post ':id/uploads/authorize', feature_category: :not_owned do # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
require_gitlab_workhorse!
status 200
@@ -640,7 +645,7 @@ module API
params do
requires :file, types: [Rack::Multipart::UploadedFile, ::API::Validations::Types::WorkhorseFile], desc: 'The attachment file to be uploaded'
end
- post ":id/uploads", feature_category: :not_owned do
+ post ":id/uploads", feature_category: :not_owned do # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
log_if_upload_exceed_max_size(user_project, params[:file])
service = UploadService.new(user_project, params[:file])
diff --git a/lib/api/projects_relation_builder.rb b/lib/api/projects_relation_builder.rb
index aabecb43653..35f555e16b5 100644
--- a/lib/api/projects_relation_builder.rb
+++ b/lib/api/projects_relation_builder.rb
@@ -14,6 +14,7 @@ module API
Preloaders::UserMaxAccessLevelInProjectsPreloader.new(projects_relation, options[:current_user]).execute if options[:current_user]
Preloaders::SingleHierarchyProjectGroupPlansPreloader.new(projects_relation).execute if options[:single_hierarchy]
+ preload_groups(projects_relation) if options[:with] == Entities::Project
projects_relation
end
@@ -40,6 +41,25 @@ module API
def repositories_for_preload(projects_relation)
projects_relation.map(&:repository)
end
+
+ # For all projects except those in a user namespace, the `namespace`
+ # and `group` are identical. Preload the group when it's not a user namespace.
+ def preload_groups(projects_relation)
+ return unless Feature.enabled?(:group_projects_api_preload_groups)
+
+ group_projects = projects_for_group_preload(projects_relation)
+ groups = group_projects.map(&:namespace)
+
+ Preloaders::GroupRootAncestorPreloader.new(groups).execute
+
+ group_projects.each do |project|
+ project.group = project.namespace
+ end
+ end
+
+ def projects_for_group_preload(projects_relation)
+ projects_relation.select { |project| project.namespace.type == Group.sti_name }
+ end
end
end
end
diff --git a/lib/api/releases.rb b/lib/api/releases.rb
index 7b89a177fd9..9e085a91a7c 100644
--- a/lib/api/releases.rb
+++ b/lib/api/releases.rb
@@ -8,16 +8,48 @@ module API
.merge(tag_name: API::NO_SLASH_URL_PART_REGEX)
RELEASE_CLI_USER_AGENT = 'GitLab-release-cli'
- before { authorize_read_releases! }
+ feature_category :release_orchestration
- after { track_release_event }
+ params do
+ requires :id, type: String, desc: 'The ID of a group'
+ end
+ resource :groups, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ before { authorize_read_group_releases! }
- feature_category :release_orchestration
+ desc 'Get a list of releases for projects in this group.' do
+ success Entities::Release
+ end
+ params do
+ requires :id, type: Integer, desc: 'The ID of the group to get releases for'
+ optional :sort, type: String, values: %w[asc desc], default: 'desc',
+ desc: 'Return projects sorted in ascending and descending order by released_at'
+ optional :simple, type: Boolean, default: false,
+ desc: 'Return only the ID, URL, name, and path of each project'
+
+ use :pagination
+ end
+ get ":id/releases" do
+ not_found! unless Feature.enabled?(:group_releases_finder_inoperator)
+
+ finder_options = {
+ sort: params[:sort]
+ }
+
+ strict_params = declared_params(include_missing: false)
+ releases = find_group_releases(finder_options)
+
+ present_group_releases(strict_params, releases)
+ 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 { authorize_read_releases! }
+
+ after { track_release_event }
+
desc 'Get a project releases' do
detail 'This feature was introduced in GitLab 11.7.'
named 'get_releases'
@@ -162,6 +194,10 @@ module API
end
helpers do
+ def authorize_read_group_releases!
+ authorize! :read_release, user_group
+ end
+
def authorize_create_release!
authorize! :create_release, user_project
end
@@ -220,6 +256,22 @@ module API
Gitlab::Tracking.event(options[:for].name, options[:route_options][:named],
project: user_project, user: current_user, **event_context)
end
+
+ def find_group_releases(finder_options)
+ ::Releases::GroupReleasesFinder
+ .new(user_group, current_user, finder_options)
+ .execute(preload: true)
+ end
+
+ def present_group_releases(params, releases)
+ options = {
+ with: params[:simple] ? Entities::BasicReleaseDetails : Entities::Release,
+ current_user: current_user
+ }
+
+ # GroupReleasesFinder has already ordered the data for us
+ present paginate(releases, skip_default_order: true), options
+ end
end
end
end
diff --git a/lib/api/remote_mirrors.rb b/lib/api/remote_mirrors.rb
index 83096772d32..8de155312fb 100644
--- a/lib/api/remote_mirrors.rb
+++ b/lib/api/remote_mirrors.rb
@@ -25,6 +25,18 @@ module API
with: Entities::RemoteMirror
end
+ desc 'Get a single remote mirror' do
+ success Entities::RemoteMirror
+ end
+ params do
+ requires :mirror_id, type: String, desc: 'The ID of a remote mirror'
+ end
+ get ':id/remote_mirrors/:mirror_id' do
+ mirror = user_project.remote_mirrors.find(params[:mirror_id])
+
+ present mirror, with: Entities::RemoteMirror
+ end
+
desc 'Create remote mirror for a project' do
success Entities::RemoteMirror
end
@@ -73,6 +85,29 @@ module API
render_api_error!(result[:message], result[:http_status])
end
end
+
+ desc 'Delete a single remote mirror' do
+ detail 'This feature was introduced in GitLab 14.10'
+ end
+ params do
+ requires :mirror_id, type: String, desc: 'The ID of a remote mirror'
+ end
+ delete ':id/remote_mirrors/:mirror_id' do
+ mirror = user_project.remote_mirrors.find(params[:mirror_id])
+
+ destroy_conditionally!(mirror) do
+ mirror_params = declared_params(include_missing: false).merge(_destroy: 1)
+ mirror_params[:id] = mirror_params.delete(:mirror_id)
+ update_params = { remote_mirrors_attributes: mirror_params }
+
+ # Note: We are using the update service to be consistent with how the controller handles deletion
+ result = ::Projects::UpdateService.new(user_project, current_user, update_params).execute
+
+ if result[:status] != :success
+ render_api_error!(result[:message], 400)
+ end
+ end
+ end
end
end
end
diff --git a/lib/api/resource_access_tokens.rb b/lib/api/resource_access_tokens.rb
index e52f8fd9111..2ba109b7092 100644
--- a/lib/api/resource_access_tokens.rb
+++ b/lib/api/resource_access_tokens.rb
@@ -27,6 +27,28 @@ module API
present paginate(tokens), with: Entities::ResourceAccessToken, resource: resource
end
+ desc 'Get an access token for the specified resource by ID' do
+ detail 'This feature was introduced in GitLab 14.10.'
+ end
+ params do
+ requires :id, type: String, desc: "The #{source_type} ID"
+ requires :token_id, type: String, desc: "The ID of the token"
+ end
+ get ":id/access_tokens/:token_id" do
+ resource = find_source(source_type, params[:id])
+
+ next unauthorized! unless current_user.can?(:read_resource_access_tokens, resource)
+
+ token = find_token(resource, params[:token_id])
+
+ if token.nil?
+ next not_found!("Could not find #{source_type} access token with token_id: #{params[:token_id]}")
+ end
+
+ resource.members.load
+ present token, with: Entities::ResourceAccessToken, resource: resource
+ end
+
desc 'Revoke a resource access token' do
detail 'This feature was introduced in GitLab 13.9.'
end
diff --git a/lib/api/settings.rb b/lib/api/settings.rb
index b256432fbf1..774ab472f2d 100644
--- a/lib/api/settings.rb
+++ b/lib/api/settings.rb
@@ -4,7 +4,7 @@ module API
class Settings < ::API::Base
before { authenticated_as_admin! }
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
helpers Helpers::SettingsHelpers
@@ -83,7 +83,6 @@ module API
optional :home_page_url, type: String, desc: 'We will redirect non-logged in users to this page'
optional :housekeeping_enabled, type: Boolean, desc: 'Enable automatic repository housekeeping (git repack, git gc)'
given housekeeping_enabled: ->(val) { val } do
- requires :housekeeping_bitmaps_enabled, type: Boolean, desc: "Creating pack file bitmaps makes housekeeping take a little longer but bitmaps should accelerate 'git clone' performance."
requires :housekeeping_full_repack_period, type: Integer, desc: "Number of Git pushes after which a full 'git repack' is run."
requires :housekeeping_gc_period, type: Integer, desc: "Number of Git pushes after which 'git gc' is run."
requires :housekeeping_incremental_repack_period, type: Integer, desc: "Number of Git pushes after which an incremental 'git repack' is run."
@@ -182,7 +181,7 @@ module API
optional :group_runner_token_expiration_interval, type: Integer, desc: 'Token expiration interval for group runners, in seconds'
optional :project_runner_token_expiration_interval, type: Integer, desc: 'Token expiration interval for project runners, in seconds'
- ApplicationSetting::SUPPORTED_KEY_TYPES.each do |type|
+ Gitlab::SSHPublicKey.supported_types.each do |type|
optional :"#{type}_key_restriction",
type: Integer,
values: KeyRestrictionValidator.supported_key_restrictions(type),
diff --git a/lib/api/sidekiq_metrics.rb b/lib/api/sidekiq_metrics.rb
index 680363d036e..c30b9d7583a 100644
--- a/lib/api/sidekiq_metrics.rb
+++ b/lib/api/sidekiq_metrics.rb
@@ -6,7 +6,7 @@ module API
class SidekiqMetrics < ::API::Base
before { authenticated_as_admin! }
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
helpers do
def queue_metrics
diff --git a/lib/api/snippets.rb b/lib/api/snippets.rb
index 9a3c68bc854..496532a15b2 100644
--- a/lib/api/snippets.rb
+++ b/lib/api/snippets.rb
@@ -184,7 +184,7 @@ module API
params do
use :raw_file_params
end
- get ":id/files/:ref/:file_path/raw", requirements: { file_path: API::NO_SLASH_URL_PART_REGEX } do
+ get ":id/files/:ref/:file_path/raw", urgency: :low, requirements: { file_path: API::NO_SLASH_URL_PART_REGEX } do
snippet = snippets.find_by_id(params.delete(:id))
not_found!('Snippet') unless snippet&.repo_exists?
@@ -200,7 +200,7 @@ module API
get ":id/user_agent_detail" do
authenticated_as_admin!
- snippet = Snippet.find_by_id!(params[:id])
+ snippet = Snippet.find(params[:id])
break not_found!('UserAgentDetail') unless snippet.user_agent_detail
diff --git a/lib/api/users.rb b/lib/api/users.rb
index 0f710e0a307..b26611cfe03 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -89,6 +89,7 @@ module API
optional :created_before, type: DateTime, desc: 'Return users created before the specified time'
optional :without_projects, type: Boolean, default: false, desc: 'Filters only users without projects'
optional :exclude_internal, as: :non_internal, type: Boolean, default: false, desc: 'Filters only non internal users'
+ optional :without_project_bots, type: Boolean, default: false, desc: 'Filters users without project bots'
optional :admins, type: Boolean, default: false, desc: 'Filters only admin users'
all_or_none_of :extern_uid, :provider
@@ -98,7 +99,7 @@ module API
use :optional_index_params_ee
end
# rubocop: disable CodeReuse/ActiveRecord
- get feature_category: :users do
+ get feature_category: :users, urgency: :default do
authenticated_as_admin! if params[:extern_uid].present? && params[:provider].present?
unless current_user&.admin?
@@ -120,8 +121,11 @@ module API
users = reorder_users(users)
entity = current_user&.admin? ? Entities::UserWithAdmin : Entities::UserBasic
- users = users.preload(:identities, :u2f_registrations) if entity == Entities::UserWithAdmin
- users = users.preload(:identities, :webauthn_registrations) if entity == Entities::UserWithAdmin
+
+ if entity == Entities::UserWithAdmin
+ users = users.preload(:identities, :u2f_registrations, :webauthn_registrations, :namespace)
+ end
+
users, options = with_custom_attributes(users, { with: entity, current_user: current_user })
users = users.preload(:user_detail)
@@ -139,7 +143,7 @@ module API
use :with_custom_attributes
end
# rubocop: disable CodeReuse/ActiveRecord
- get ":id", feature_category: :users do
+ get ":id", feature_category: :users, urgency: :medium do
forbidden!('Not authorized!') unless current_user
unless current_user.admin?
@@ -164,7 +168,7 @@ module API
params do
requires :user_id, type: String, desc: 'The ID or username of the user'
end
- get ":user_id/status", requirements: API::USER_REQUIREMENTS, feature_category: :users do
+ get ":user_id/status", requirements: API::USER_REQUIREMENTS, feature_category: :users, urgency: :high do
user = find_user(params[:user_id])
not_found!('User') unless user && can?(current_user, :read_user, user)
@@ -915,7 +919,7 @@ module API
desc 'Get the currently authenticated user' do
success Entities::UserPublic
end
- get feature_category: :users do
+ get feature_category: :users, urgency: :medium do
entity =
if current_user.admin?
Entities::UserWithAdmin
@@ -1090,7 +1094,7 @@ module API
requires :credit_card_mask_number, type: String, desc: 'The last 4 digits of credit card number'
requires :credit_card_type, type: String, desc: 'The credit card network name'
end
- put ":user_id/credit_card_validation", feature_category: :users do
+ put ":user_id/credit_card_validation", feature_category: :purchase do
authenticated_as_admin!
user = find_user(params[:user_id])
diff --git a/lib/api/validations/validators/limit.rb b/lib/api/validations/validators/limit.rb
index e8f894849a5..7e11f1d77cc 100644
--- a/lib/api/validations/validators/limit.rb
+++ b/lib/api/validations/validators/limit.rb
@@ -7,7 +7,7 @@ module API
def validate_param!(attr_name, params)
value = params[attr_name]
- return if value.size <= @option
+ return if value.nil? || value.size <= @option
raise Grape::Exceptions::Validation.new(
params: [@scope.full_name(attr_name)],
diff --git a/lib/api/version.rb b/lib/api/version.rb
index 86eb34ca589..bdce88ab827 100644
--- a/lib/api/version.rb
+++ b/lib/api/version.rb
@@ -9,7 +9,7 @@ module API
before { authenticate! }
- feature_category :not_owned
+ feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
METADATA_QUERY = <<~EOF
{
diff --git a/lib/api/wikis.rb b/lib/api/wikis.rb
index e90d88940a5..12dbf4792d6 100644
--- a/lib/api/wikis.rb
+++ b/lib/api/wikis.rb
@@ -12,7 +12,7 @@ module API
params :common_wiki_page_params do
optional :format,
type: String,
- values: Wiki::MARKUPS.values.map(&:to_s),
+ values: Wiki::VALID_USER_MARKUPS.keys.map(&:to_s),
default: 'markdown',
desc: 'Format of a wiki page. Available formats are markdown, rdoc, asciidoc and org'
end
@@ -48,7 +48,7 @@ module API
optional :version, type: String, desc: 'The version hash of a wiki page'
optional :render_html, type: Boolean, default: false, desc: 'Render content to HTML'
end
- get ':id/wikis/:slug' do
+ get ':id/wikis/:slug', urgency: :low do
authorize! :read_wiki, container
present wiki_page(params[:version]), with: Entities::WikiPage, render_html: params[:render_html]
@@ -136,7 +136,7 @@ module API
if result[:status] == :success
status(201)
- present OpenStruct.new(result[:result]), with: Entities::WikiAttachment
+ present result[:result], with: Entities::WikiAttachment
else
render_api_error!(result[:message], 400)
end
diff --git a/lib/backup/artifacts.rb b/lib/backup/artifacts.rb
deleted file mode 100644
index 4ef76b0aaf3..00000000000
--- a/lib/backup/artifacts.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Backup
- class Artifacts < Backup::Files
- def initialize(progress)
- super(progress, 'artifacts', JobArtifactUploader.root, excludes: ['tmp'])
- end
-
- override :human_name
- def human_name
- _('artifacts')
- end
- end
-end
diff --git a/lib/backup/builds.rb b/lib/backup/builds.rb
deleted file mode 100644
index fbf932e3f6b..00000000000
--- a/lib/backup/builds.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Backup
- class Builds < Backup::Files
- def initialize(progress)
- super(progress, 'builds', Settings.gitlab_ci.builds_path)
- end
-
- override :human_name
- def human_name
- _('builds')
- end
- end
-end
diff --git a/lib/backup/database.rb b/lib/backup/database.rb
index afc84a4b913..3cbe3cf7d88 100644
--- a/lib/backup/database.rb
+++ b/lib/backup/database.rb
@@ -25,7 +25,7 @@ module Backup
end
override :dump
- def dump(db_file_name)
+ def dump(db_file_name, backup_id)
FileUtils.mkdir_p(File.dirname(db_file_name))
FileUtils.rm_f(db_file_name)
compress_rd, compress_wr = IO.pipe
@@ -134,11 +134,6 @@ module Backup
MSG
end
- override :human_name
- def human_name
- _('database')
- end
-
protected
def database
diff --git a/lib/backup/files.rb b/lib/backup/files.rb
index 7fa07e40cee..55b10c008fb 100644
--- a/lib/backup/files.rb
+++ b/lib/backup/files.rb
@@ -9,19 +9,18 @@ module Backup
DEFAULT_EXCLUDE = 'lost+found'
- attr_reader :name, :excludes
+ attr_reader :excludes
- def initialize(progress, name, app_files_dir, excludes: [])
+ def initialize(progress, app_files_dir, excludes: [])
super(progress)
- @name = name
@app_files_dir = app_files_dir
@excludes = [DEFAULT_EXCLUDE].concat(excludes)
end
# Copy files from public/files to backup/files
override :dump
- def dump(backup_tarball)
+ def dump(backup_tarball, backup_id)
FileUtils.mkdir_p(Gitlab.config.backup.path)
FileUtils.rm_f(backup_tarball)
@@ -55,7 +54,7 @@ module Backup
override :restore
def restore(backup_tarball)
- backup_existing_files_dir
+ backup_existing_files_dir(backup_tarball)
cmd_list = [%w[gzip -cd], %W[#{tar} --unlink-first --recursive-unlink -C #{app_files_realpath} -xf -]]
status_list, output = run_pipeline!(cmd_list, in: backup_tarball)
@@ -73,11 +72,13 @@ module Backup
end
end
- def backup_existing_files_dir
+ def backup_existing_files_dir(backup_tarball)
+ name = File.basename(backup_tarball, '.tar.gz')
+
timestamped_files_path = File.join(Gitlab.config.backup.path, "tmp", "#{name}.#{Time.now.to_i}")
if File.exist?(app_files_realpath)
# Move all files in the existing repos directory except . and .. to
- # repositories.old.<timestamp> directory
+ # repositories.<timestamp> directory
FileUtils.mkdir_p(timestamped_files_path, mode: 0700)
files = Dir.glob(File.join(app_files_realpath, "*"), File::FNM_DOTMATCH) - [File.join(app_files_realpath, "."), File.join(app_files_realpath, "..")]
begin
diff --git a/lib/backup/gitaly_backup.rb b/lib/backup/gitaly_backup.rb
index b688ff7f13b..93342e789e9 100644
--- a/lib/backup/gitaly_backup.rb
+++ b/lib/backup/gitaly_backup.rb
@@ -9,16 +9,14 @@ module Backup
# @param [StringIO] progress IO interface to output progress
# @param [Integer] max_parallelism max parallelism when running backups
# @param [Integer] storage_parallelism max parallelism per storage (is affected by max_parallelism)
- # @param [String] backup_id unique identifier for the backup
def initialize(progress, max_parallelism: nil, storage_parallelism: nil, incremental: false, backup_id: nil)
@progress = progress
@max_parallelism = max_parallelism
@storage_parallelism = storage_parallelism
@incremental = incremental
- @backup_id = backup_id
end
- def start(type, backup_repos_path)
+ def start(type, backup_repos_path, backup_id: nil)
raise Error, 'already started' if started?
command = case type
@@ -37,7 +35,7 @@ module Backup
args += ['-layout', 'pointer']
if type == :create
args += ['-incremental'] if @incremental
- args += ['-id', @backup_id] if @backup_id
+ args += ['-id', backup_id] if backup_id
end
end
@@ -68,10 +66,6 @@ module Backup
schedule_backup_job(repository, always_create: repo_type.project?)
end
- def parallel_enqueue?
- false
- end
-
private
# Schedule a new backup job through a non-blocking JSON based pipe protocol
@@ -104,6 +98,8 @@ module Backup
end
def bin_path
+ raise Error, 'gitaly-backup binary not found and gitaly_backup_path is not configured' unless Gitlab.config.backup.gitaly_backup_path.present?
+
File.absolute_path(Gitlab.config.backup.gitaly_backup_path)
end
end
diff --git a/lib/backup/gitaly_rpc_backup.rb b/lib/backup/gitaly_rpc_backup.rb
deleted file mode 100644
index 89ed27cfa13..00000000000
--- a/lib/backup/gitaly_rpc_backup.rb
+++ /dev/null
@@ -1,129 +0,0 @@
-# frozen_string_literal: true
-
-module Backup
- # Backup and restores repositories using the gitaly RPC
- class GitalyRpcBackup
- def initialize(progress)
- @progress = progress
- end
-
- def start(type, backup_repos_path)
- raise Error, 'already started' if @type
-
- @type = type
- @backup_repos_path = backup_repos_path
- case type
- when :create
- FileUtils.rm_rf(backup_repos_path)
- FileUtils.mkdir_p(Gitlab.config.backup.path)
- FileUtils.mkdir(backup_repos_path, mode: 0700)
- when :restore
- # no op
- else
- raise Error, "unknown backup type: #{type}"
- end
- end
-
- def finish!
- @type = nil
- end
-
- def enqueue(container, repository_type)
- backup_restore = BackupRestore.new(
- progress,
- repository_type.repository_for(container),
- @backup_repos_path
- )
-
- case @type
- when :create
- backup_restore.backup
- when :restore
- backup_restore.restore(always_create: repository_type.project?)
- else
- raise Error, 'not started'
- end
- end
-
- def parallel_enqueue?
- true
- end
-
- private
-
- attr_reader :progress
-
- class BackupRestore
- attr_accessor :progress, :repository, :backup_repos_path
-
- def initialize(progress, repository, backup_repos_path)
- @progress = progress
- @repository = repository
- @backup_repos_path = backup_repos_path
- end
-
- def backup
- progress.puts " * #{display_repo_path} ... "
-
- if repository.empty?
- progress.puts " * #{display_repo_path} ... " + "[EMPTY] [SKIPPED]".color(:cyan)
- return
- end
-
- FileUtils.mkdir_p(repository_backup_path)
-
- repository.bundle_to_disk(path_to_bundle)
- repository.gitaly_repository_client.backup_custom_hooks(custom_hooks_tar)
-
- progress.puts " * #{display_repo_path} ... " + "[DONE]".color(:green)
-
- rescue StandardError => e
- progress.puts "[Failed] backing up #{display_repo_path}".color(:red)
- progress.puts "Error #{e}".color(:red)
- end
-
- def restore(always_create: false)
- progress.puts " * #{display_repo_path} ... "
-
- repository.remove rescue nil
-
- if File.exist?(path_to_bundle)
- repository.create_from_bundle(path_to_bundle)
- restore_custom_hooks
- elsif always_create
- repository.create_repository
- end
-
- progress.puts " * #{display_repo_path} ... " + "[DONE]".color(:green)
-
- rescue StandardError => e
- progress.puts "[Failed] restoring #{display_repo_path}".color(:red)
- progress.puts "Error #{e}".color(:red)
- end
-
- private
-
- def display_repo_path
- "#{repository.full_path} (#{repository.disk_path})"
- end
-
- def repository_backup_path
- @repository_backup_path ||= File.join(backup_repos_path, repository.disk_path)
- end
-
- def path_to_bundle
- @path_to_bundle ||= File.join(backup_repos_path, repository.disk_path + '.bundle')
- end
-
- def restore_custom_hooks
- return unless File.exist?(custom_hooks_tar)
-
- repository.gitaly_repository_client.restore_custom_hooks(custom_hooks_tar)
- end
-
- def custom_hooks_tar
- File.join(repository_backup_path, "custom_hooks.tar")
- end
- end
- end
-end
diff --git a/lib/backup/lfs.rb b/lib/backup/lfs.rb
deleted file mode 100644
index e92f235a2d7..00000000000
--- a/lib/backup/lfs.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Backup
- class Lfs < Backup::Files
- def initialize(progress)
- super(progress, 'lfs', Settings.lfs.storage_path)
- end
-
- override :human_name
- def human_name
- _('lfs objects')
- end
- end
-end
diff --git a/lib/backup/manager.rb b/lib/backup/manager.rb
index cb5fd959bc9..403b2d9f16c 100644
--- a/lib/backup/manager.rb
+++ b/lib/backup/manager.rb
@@ -5,74 +5,43 @@ module Backup
FILE_NAME_SUFFIX = '_gitlab_backup.tar'
MANIFEST_NAME = 'backup_information.yml'
+ # pages used to deploy tmp files to this path
+ # if some of these files are still there, we don't need them in the backup
+ LEGACY_PAGES_TMP_PATH = '@pages.tmp'
+
TaskDefinition = Struct.new(
+ :enabled, # `true` if the task can be used. Treated as `true` when not specified.
+ :human_name, # Name of the task used for logging.
:destination_path, # Where the task should put its backup file/dir.
:destination_optional, # `true` if the destination might not exist on a successful backup.
:cleanup_path, # Path to remove after a successful backup. Uses `destination_path` when not specified.
:task,
keyword_init: true
- )
+ ) do
+ def enabled?
+ enabled.nil? || enabled
+ end
+ end
attr_reader :progress
def initialize(progress, definitions: nil)
@progress = progress
- max_concurrency = ENV.fetch('GITLAB_BACKUP_MAX_CONCURRENCY', 1).to_i
- max_storage_concurrency = ENV.fetch('GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY', 1).to_i
- force = ENV['force'] == 'yes'
- incremental = Gitlab::Utils.to_boolean(ENV['INCREMENTAL'], default: false)
+ @incremental = Feature.feature_flags_available? &&
+ Feature.enabled?(:incremental_repository_backup, default_enabled: :yaml) &&
+ Gitlab::Utils.to_boolean(ENV['INCREMENTAL'], default: false)
- @definitions = definitions || {
- 'db' => TaskDefinition.new(
- destination_path: 'db/database.sql.gz',
- cleanup_path: 'db',
- task: Database.new(progress, force: force)
- ),
- 'repositories' => TaskDefinition.new(
- destination_path: 'repositories',
- destination_optional: true,
- task: Repositories.new(progress,
- strategy: repository_backup_strategy(incremental),
- max_concurrency: max_concurrency,
- max_storage_concurrency: max_storage_concurrency)
- ),
- 'uploads' => TaskDefinition.new(
- destination_path: 'uploads.tar.gz',
- task: Uploads.new(progress)
- ),
- 'builds' => TaskDefinition.new(
- destination_path: 'builds.tar.gz',
- task: Builds.new(progress)
- ),
- 'artifacts' => TaskDefinition.new(
- destination_path: 'artifacts.tar.gz',
- task: Artifacts.new(progress)
- ),
- 'pages' => TaskDefinition.new(
- destination_path: 'pages.tar.gz',
- task: Pages.new(progress)
- ),
- 'lfs' => TaskDefinition.new(
- destination_path: 'lfs.tar.gz',
- task: Lfs.new(progress)
- ),
- 'terraform_state' => TaskDefinition.new(
- destination_path: 'terraform_state.tar.gz',
- task: TerraformState.new(progress)
- ),
- 'registry' => TaskDefinition.new(
- destination_path: 'registry.tar.gz',
- task: Registry.new(progress)
- ),
- 'packages' => TaskDefinition.new(
- destination_path: 'packages.tar.gz',
- task: Packages.new(progress)
- )
- }.freeze
+ @definitions = definitions || build_definitions
end
def create
+ if incremental?
+ unpack
+ read_backup_information
+ verify_backup_version
+ end
+
@definitions.keys.each do |task_name|
run_create_task(task_name)
end
@@ -88,34 +57,33 @@ module Backup
remove_old
end
- progress.puts "Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data \n" \
+ puts_time "Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data \n" \
"and are not included in this backup. You will need these files to restore a backup.\n" \
"Please back them up manually.".color(:red)
- progress.puts "Backup task is done."
+ puts_time "Backup #{backup_id} is done."
end
def run_create_task(task_name)
definition = @definitions[task_name]
build_backup_information
- puts_time "Dumping #{definition.task.human_name} ... ".color(:blue)
- unless definition.task.enabled
- puts_time "[DISABLED]".color(:cyan)
+ unless definition.enabled?
+ puts_time "Dumping #{definition.human_name} ... ".color(:blue) + "[DISABLED]".color(:cyan)
return
end
if skipped?(task_name)
- puts_time "[SKIPPED]".color(:cyan)
+ puts_time "Dumping #{definition.human_name} ... ".color(:blue) + "[SKIPPED]".color(:cyan)
return
end
- definition.task.dump(File.join(Gitlab.config.backup.path, definition.destination_path))
-
- puts_time "done".color(:green)
+ puts_time "Dumping #{definition.human_name} ... ".color(:blue)
+ definition.task.dump(File.join(Gitlab.config.backup.path, definition.destination_path), backup_id)
+ puts_time "Dumping #{definition.human_name} ... ".color(:blue) + "done".color(:green)
rescue Backup::DatabaseBackupError, Backup::FileBackupError => e
- progress.puts "#{e.message}"
+ puts_time "Dumping #{definition.human_name} failed: #{e.message}".color(:red)
end
def restore
@@ -136,21 +104,21 @@ module Backup
remove_tmp
- puts "Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data \n" \
- "and are not included in this backup. You will need to restore these files manually.".color(:red)
- puts "Restore task is done."
+ puts_time "Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data \n" \
+ "and are not included in this backup. You will need to restore these files manually.".color(:red)
+ puts_time "Restore task is done."
end
def run_restore_task(task_name)
definition = @definitions[task_name]
- puts_time "Restoring #{definition.task.human_name} ... ".color(:blue)
-
- unless definition.task.enabled
- puts_time "[DISABLED]".color(:cyan)
+ unless definition.enabled?
+ puts_time "Restoring #{definition.human_name} ... ".color(:blue) + "[DISABLED]".color(:cyan)
return
end
+ puts_time "Restoring #{definition.human_name} ... ".color(:blue)
+
warning = definition.task.pre_restore_warning
if warning.present?
puts_time warning.color(:red)
@@ -159,7 +127,7 @@ module Backup
definition.task.restore(File.join(Gitlab.config.backup.path, definition.destination_path))
- puts_time "done".color(:green)
+ puts_time "Restoring #{definition.human_name} ... ".color(:blue) + "done".color(:green)
warning = definition.task.post_restore_warning
if warning.present?
@@ -174,6 +142,86 @@ module Backup
private
+ def build_definitions
+ {
+ 'db' => TaskDefinition.new(
+ human_name: _('database'),
+ destination_path: 'db/database.sql.gz',
+ cleanup_path: 'db',
+ task: build_db_task
+ ),
+ 'repositories' => TaskDefinition.new(
+ human_name: _('repositories'),
+ destination_path: 'repositories',
+ destination_optional: true,
+ task: build_repositories_task
+ ),
+ 'uploads' => TaskDefinition.new(
+ human_name: _('uploads'),
+ destination_path: 'uploads.tar.gz',
+ task: build_files_task(File.join(Gitlab.config.uploads.storage_path, 'uploads'), excludes: ['tmp'])
+ ),
+ 'builds' => TaskDefinition.new(
+ human_name: _('builds'),
+ destination_path: 'builds.tar.gz',
+ task: build_files_task(Settings.gitlab_ci.builds_path)
+ ),
+ 'artifacts' => TaskDefinition.new(
+ human_name: _('artifacts'),
+ destination_path: 'artifacts.tar.gz',
+ task: build_files_task(JobArtifactUploader.root, excludes: ['tmp'])
+ ),
+ 'pages' => TaskDefinition.new(
+ human_name: _('pages'),
+ destination_path: 'pages.tar.gz',
+ task: build_files_task(Gitlab.config.pages.path, excludes: [LEGACY_PAGES_TMP_PATH])
+ ),
+ 'lfs' => TaskDefinition.new(
+ human_name: _('lfs objects'),
+ destination_path: 'lfs.tar.gz',
+ task: build_files_task(Settings.lfs.storage_path)
+ ),
+ 'terraform_state' => TaskDefinition.new(
+ human_name: _('terraform states'),
+ destination_path: 'terraform_state.tar.gz',
+ task: build_files_task(Settings.terraform_state.storage_path, excludes: ['tmp'])
+ ),
+ 'registry' => TaskDefinition.new(
+ enabled: Gitlab.config.registry.enabled,
+ human_name: _('container registry images'),
+ destination_path: 'registry.tar.gz',
+ task: build_files_task(Settings.registry.path)
+ ),
+ 'packages' => TaskDefinition.new(
+ human_name: _('packages'),
+ destination_path: 'packages.tar.gz',
+ task: build_files_task(Settings.packages.storage_path, excludes: ['tmp'])
+ )
+ }.freeze
+ end
+
+ def build_db_task
+ force = Gitlab::Utils.to_boolean(ENV['force'], default: false)
+
+ Database.new(progress, force: force)
+ end
+
+ def build_repositories_task
+ max_concurrency = ENV['GITLAB_BACKUP_MAX_CONCURRENCY'].presence
+ max_storage_concurrency = ENV['GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY'].presence
+ strategy = Backup::GitalyBackup.new(progress, incremental: incremental?, max_parallelism: max_concurrency, storage_parallelism: max_storage_concurrency)
+
+ Repositories.new(progress, strategy: strategy)
+ end
+
+ def build_files_task(app_files_dir, excludes: [])
+ Files.new(progress, app_files_dir, excludes: excludes)
+ end
+
+ def incremental?
+ @incremental
+ end
+
def read_backup_information
@backup_information ||= YAML.load_file(File.join(backup_path, MANIFEST_NAME))
end
@@ -209,103 +257,104 @@ module Backup
def pack
Dir.chdir(backup_path) do
# create archive
- progress.print "Creating backup archive: #{tar_file} ... "
+ puts_time "Creating backup archive: #{tar_file} ... ".color(:blue)
# Set file permissions on open to prevent chmod races.
tar_system_options = { out: [tar_file, 'w', Gitlab.config.backup.archive_permissions] }
if Kernel.system('tar', '-cf', '-', *backup_contents, tar_system_options)
- progress.puts "done".color(:green)
+ puts_time "Creating backup archive: #{tar_file} ... ".color(:blue) + 'done'.color(:green)
else
- puts "creating archive #{tar_file} failed".color(:red)
+ puts_time "Creating archive #{tar_file} failed".color(:red)
raise Backup::Error, 'Backup failed'
end
end
end
def upload
- progress.print "Uploading backup archive to remote storage #{remote_directory} ... "
-
connection_settings = Gitlab.config.backup.upload.connection
- if connection_settings.blank?
- progress.puts "skipped".color(:yellow)
+ if connection_settings.blank? || skipped?('remote')
+ puts_time "Uploading backup archive to remote storage #{remote_directory} ... ".color(:blue) + "[SKIPPED]".color(:cyan)
return
end
+ puts_time "Uploading backup archive to remote storage #{remote_directory} ... ".color(:blue)
+
directory = connect_to_remote_directory
upload = directory.files.create(create_attributes)
if upload
if upload.respond_to?(:encryption) && upload.encryption
- progress.puts "done (encrypted with #{upload.encryption})".color(:green)
+ puts_time "Uploading backup archive to remote storage #{remote_directory} ... ".color(:blue) + "done (encrypted with #{upload.encryption})".color(:green)
else
- progress.puts "done".color(:green)
+ puts_time "Uploading backup archive to remote storage #{remote_directory} ... ".color(:blue) + "done".color(:green)
end
else
- puts "uploading backup to #{remote_directory} failed".color(:red)
+ puts_time "Uploading backup to #{remote_directory} failed".color(:red)
raise Backup::Error, 'Backup failed'
end
end
def cleanup
- progress.print "Deleting tmp directories ... "
+ puts_time "Deleting tar staging files ... ".color(:blue)
remove_backup_path(MANIFEST_NAME)
@definitions.each do |_, definition|
remove_backup_path(definition.cleanup_path || definition.destination_path)
end
+
+ puts_time "Deleting tar staging files ... ".color(:blue) + 'done'.color(:green)
end
def remove_backup_path(path)
- return unless File.exist?(File.join(backup_path, path))
+ absolute_path = File.join(backup_path, path)
+ return unless File.exist?(absolute_path)
- FileUtils.rm_rf(File.join(backup_path, path))
- progress.puts "done".color(:green)
+ puts_time "Cleaning up #{absolute_path}"
+ FileUtils.rm_rf(absolute_path)
end
def remove_tmp
# delete tmp inside backups
- progress.print "Deleting backups/tmp ... "
+ puts_time "Deleting backups/tmp ... ".color(:blue)
- if FileUtils.rm_rf(File.join(backup_path, "tmp"))
- progress.puts "done".color(:green)
- else
- puts "deleting backups/tmp failed".color(:red)
- end
+ FileUtils.rm_rf(File.join(backup_path, "tmp"))
+ puts_time "Deleting backups/tmp ... ".color(:blue) + "done".color(:green)
end
def remove_old
# delete backups
- progress.print "Deleting old backups ... "
keep_time = Gitlab.config.backup.keep_time.to_i
- if keep_time > 0
- removed = 0
-
- Dir.chdir(backup_path) do
- backup_file_list.each do |file|
- # For backward compatibility, there are 3 names the backups can have:
- # - 1495527122_gitlab_backup.tar
- # - 1495527068_2017_05_23_gitlab_backup.tar
- # - 1495527097_2017_05_23_9.3.0-pre_gitlab_backup.tar
- matched = backup_file?(file)
- next unless matched
-
- timestamp = matched[1].to_i
-
- if Time.at(timestamp) < (Time.now - keep_time)
- begin
- FileUtils.rm(file)
- removed += 1
- rescue StandardError => e
- progress.puts "Deleting #{file} failed: #{e.message}".color(:red)
- end
+ if keep_time <= 0
+ puts_time "Deleting old backups ... ".color(:blue) + "[SKIPPED]".color(:cyan)
+ return
+ end
+
+ puts_time "Deleting old backups ... ".color(:blue)
+ removed = 0
+
+ Dir.chdir(backup_path) do
+ backup_file_list.each do |file|
+ # For backward compatibility, there are 3 names the backups can have:
+ # - 1495527122_gitlab_backup.tar
+ # - 1495527068_2017_05_23_gitlab_backup.tar
+ # - 1495527097_2017_05_23_9.3.0-pre_gitlab_backup.tar
+ matched = backup_file?(file)
+ next unless matched
+
+ timestamp = matched[1].to_i
+
+ if Time.at(timestamp) < (Time.now - keep_time)
+ begin
+ FileUtils.rm(file)
+ removed += 1
+ rescue StandardError => e
+ puts_time "Deleting #{file} failed: #{e.message}".color(:red)
end
end
end
-
- progress.puts "done. (#{removed} removed)".color(:green)
- else
- progress.puts "skipping".color(:yellow)
end
+
+ puts_time "Deleting old backups ... ".color(:blue) + "done. (#{removed} removed)".color(:green)
end
def verify_backup_version
@@ -327,7 +376,7 @@ module Backup
def unpack
if ENV['BACKUP'].blank? && non_tarred_backup?
- progress.puts "Non tarred backup found in #{backup_path}, using that"
+ puts_time "Non tarred backup found in #{backup_path}, using that"
return false
end
@@ -335,15 +384,22 @@ module Backup
Dir.chdir(backup_path) do
# check for existing backups in the backup dir
if backup_file_list.empty?
- progress.puts "No backups found in #{backup_path}"
- progress.puts "Please make sure that file name ends with #{FILE_NAME_SUFFIX}"
+ puts_time "No backups found in #{backup_path}"
+ puts_time "Please make sure that file name ends with #{FILE_NAME_SUFFIX}"
exit 1
elsif backup_file_list.many? && ENV["BACKUP"].nil?
- progress.puts 'Found more than one backup:'
+ puts_time 'Found more than one backup:'
# print list of available backups
- progress.puts " " + available_timestamps.join("\n ")
- progress.puts 'Please specify which one you want to restore:'
- progress.puts 'rake gitlab:backup:restore BACKUP=timestamp_of_backup'
+ puts_time " " + available_timestamps.join("\n ")
+
+ if incremental?
+ puts_time 'Please specify which one you want to create an incremental backup for:'
+ puts_time 'rake gitlab:backup:create INCREMENTAL=true BACKUP=timestamp_of_backup'
+ else
+ puts_time 'Please specify which one you want to restore:'
+ puts_time 'rake gitlab:backup:restore BACKUP=timestamp_of_backup'
+ end
+
exit 1
end
@@ -354,16 +410,16 @@ module Backup
end
unless File.exist?(tar_file)
- progress.puts "The backup file #{tar_file} does not exist!"
+ puts_time "The backup file #{tar_file} does not exist!"
exit 1
end
- progress.print 'Unpacking backup ... '
+ puts_time 'Unpacking backup ... '.color(:blue)
if Kernel.system(*%W(tar -xf #{tar_file}))
- progress.puts 'done'.color(:green)
+ puts_time 'Unpacking backup ... '.color(:blue) + 'done'.color(:green)
else
- progress.puts 'unpacking backup failed'.color(:red)
+ puts_time 'Unpacking backup failed'.color(:red)
exit 1
end
end
@@ -375,11 +431,12 @@ module Backup
end
def skipped?(item)
- backup_information[:skipped] && backup_information[:skipped].include?(item)
+ ENV.fetch('SKIP', '').include?(item) ||
+ backup_information[:skipped] && backup_information[:skipped].include?(item)
end
def enabled_task?(task_name)
- @definitions[task_name].task.enabled
+ @definitions[task_name].enabled?
end
def backup_file?(file)
@@ -441,11 +498,15 @@ module Backup
end
def tar_file
- @tar_file ||= if ENV['BACKUP'].present?
- File.basename(ENV['BACKUP']) + FILE_NAME_SUFFIX
- else
- "#{backup_information[:backup_created_at].strftime('%s_%Y_%m_%d_')}#{backup_information[:gitlab_version]}#{FILE_NAME_SUFFIX}"
- end
+ @tar_file ||= "#{backup_id}#{FILE_NAME_SUFFIX}"
+ end
+
+ def backup_id
+ @backup_id ||= if ENV['BACKUP'].present?
+ File.basename(ENV['BACKUP'])
+ else
+ "#{backup_information[:backup_created_at].strftime('%s_%Y_%m_%d_')}#{backup_information[:gitlab_version]}"
+ end
end
def create_attributes
@@ -481,16 +542,6 @@ module Backup
Gitlab.config.backup.upload.connection&.provider&.downcase == 'google'
end
- def repository_backup_strategy(incremental)
- if !Feature.feature_flags_available? || Feature.enabled?(:gitaly_backup, default_enabled: :yaml)
- max_concurrency = ENV['GITLAB_BACKUP_MAX_CONCURRENCY'].presence
- max_storage_concurrency = ENV['GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY'].presence
- Backup::GitalyBackup.new(progress, incremental: incremental, max_parallelism: max_concurrency, storage_parallelism: max_storage_concurrency)
- else
- Backup::GitalyRpcBackup.new(progress)
- end
- end
-
def puts_time(msg)
progress.puts "#{Time.now} -- #{msg}"
Gitlab::BackupLogger.info(message: "#{Rainbow.uncolor(msg)}")
diff --git a/lib/backup/packages.rb b/lib/backup/packages.rb
deleted file mode 100644
index 9384e007162..00000000000
--- a/lib/backup/packages.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Backup
- class Packages < Backup::Files
- def initialize(progress)
- super(progress, 'packages', Settings.packages.storage_path, excludes: ['tmp'])
- end
-
- override :human_name
- def human_name
- _('packages')
- end
- end
-end
diff --git a/lib/backup/pages.rb b/lib/backup/pages.rb
deleted file mode 100644
index ebed6820724..00000000000
--- a/lib/backup/pages.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-module Backup
- class Pages < Backup::Files
- # pages used to deploy tmp files to this path
- # if some of these files are still there, we don't need them in the backup
- LEGACY_PAGES_TMP_PATH = '@pages.tmp'
-
- def initialize(progress)
- super(progress, 'pages', Gitlab.config.pages.path, excludes: [LEGACY_PAGES_TMP_PATH])
- end
-
- override :human_name
- def human_name
- _('pages')
- end
- end
-end
diff --git a/lib/backup/registry.rb b/lib/backup/registry.rb
deleted file mode 100644
index 68ea635034d..00000000000
--- a/lib/backup/registry.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-module Backup
- class Registry < Backup::Files
- def initialize(progress)
- super(progress, 'registry', Settings.registry.path)
- end
-
- override :human_name
- def human_name
- _('container registry images')
- end
-
- override :enabled
- def enabled
- Gitlab.config.registry.enabled
- end
- end
-end
diff --git a/lib/backup/repositories.rb b/lib/backup/repositories.rb
index 3633ebd661e..11bed84e356 100644
--- a/lib/backup/repositories.rb
+++ b/lib/backup/repositories.rb
@@ -6,50 +6,17 @@ module Backup
class Repositories < Task
extend ::Gitlab::Utils::Override
- def initialize(progress, strategy:, max_concurrency: 1, max_storage_concurrency: 1)
+ def initialize(progress, strategy:)
super(progress)
@strategy = strategy
- @max_concurrency = max_concurrency
- @max_storage_concurrency = max_storage_concurrency
end
override :dump
- def dump(path)
- strategy.start(:create, path)
-
- # gitaly-backup is designed to handle concurrency on its own. So we want
- # to avoid entering the buggy concurrency code here when gitaly-backup
- # is enabled.
- if (max_concurrency <= 1 && max_storage_concurrency <= 1) || !strategy.parallel_enqueue?
- return enqueue_consecutive
- end
-
- if max_concurrency < 1 || max_storage_concurrency < 1
- puts "GITLAB_BACKUP_MAX_CONCURRENCY and GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY must have a value of at least 1".color(:red)
- exit 1
- end
-
- check_valid_storages!
-
- semaphore = Concurrent::Semaphore.new(max_concurrency)
- errors = Queue.new
-
- threads = Gitlab.config.repositories.storages.keys.map do |storage|
- Thread.new do
- Rails.application.executor.wrap do
- enqueue_storage(storage, semaphore, max_storage_concurrency: max_storage_concurrency)
- rescue StandardError => e
- errors << e
- end
- end
- end
-
- ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
- threads.each(&:join)
- end
+ def dump(path, backup_id)
+ strategy.start(:create, path, backup_id: backup_id)
+ enqueue_consecutive
- raise errors.pop unless errors.empty?
ensure
strategy.finish!
end
@@ -66,26 +33,9 @@ module Backup
restore_object_pools
end
- override :human_name
- def human_name
- _('repositories')
- end
-
private
- attr_reader :strategy, :max_concurrency, :max_storage_concurrency
-
- def check_valid_storages!
- repository_storage_klasses.each do |klass|
- if klass.excluding_repository_storage(Gitlab.config.repositories.storages.keys).exists?
- raise Error, "repositories.storages in gitlab.yml does not include all storages used by #{klass}"
- end
- end
- end
-
- def repository_storage_klasses
- [ProjectRepository, SnippetRepository]
- end
+ attr_reader :strategy
def enqueue_consecutive
enqueue_consecutive_projects
@@ -102,50 +52,6 @@ module Backup
Snippet.find_each(batch_size: 1000) { |snippet| enqueue_snippet(snippet) }
end
- def enqueue_storage(storage, semaphore, max_storage_concurrency:)
- errors = Queue.new
- queue = InterlockSizedQueue.new(1)
-
- threads = Array.new(max_storage_concurrency) do
- Thread.new do
- Rails.application.executor.wrap do
- while container = queue.pop
- ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
- semaphore.acquire
- end
-
- begin
- enqueue_container(container)
- rescue StandardError => e
- errors << e
- break
- ensure
- semaphore.release
- end
- end
- end
- end
- end
-
- enqueue_records_for_storage(storage, queue, errors)
-
- raise errors.pop unless errors.empty?
- ensure
- queue.close
- ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
- threads.each(&:join)
- end
- end
-
- def enqueue_container(container)
- case container
- when Project
- enqueue_project(container)
- when Snippet
- enqueue_snippet(container)
- end
- end
-
def enqueue_project(project)
strategy.enqueue(project, Gitlab::GlRepository::PROJECT)
strategy.enqueue(project, Gitlab::GlRepository::WIKI)
@@ -156,32 +62,10 @@ module Backup
strategy.enqueue(snippet, Gitlab::GlRepository::SNIPPET)
end
- def enqueue_records_for_storage(storage, queue, errors)
- records_to_enqueue(storage).each do |relation|
- relation.find_each(batch_size: 100) do |project|
- break unless errors.empty?
-
- queue.push(project)
- end
- end
- end
-
- def records_to_enqueue(storage)
- [projects_in_storage(storage), snippets_in_storage(storage)]
- end
-
- def projects_in_storage(storage)
- project_relation.id_in(ProjectRepository.for_repository_storage(storage).select(:project_id))
- end
-
def project_relation
Project.includes(:route, :group, namespace: :owner)
end
- def snippets_in_storage(storage)
- Snippet.id_in(SnippetRepository.for_repository_storage(storage).select(:snippet_id))
- end
-
def restore_object_pools
PoolRepository.includes(:source_project).find_each do |pool|
progress.puts " - Object pool #{pool.disk_path}..."
@@ -216,24 +100,6 @@ module Backup
Snippet.id_in(invalid_snippets).delete_all
end
-
- class InterlockSizedQueue < SizedQueue
- extend ::Gitlab::Utils::Override
-
- override :pop
- def pop(*)
- ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
- super
- end
- end
-
- override :push
- def push(*)
- ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
- super
- end
- end
- end
end
end
diff --git a/lib/backup/task.rb b/lib/backup/task.rb
index 15cd2aa64d3..776c19130a7 100644
--- a/lib/backup/task.rb
+++ b/lib/backup/task.rb
@@ -6,13 +6,11 @@ module Backup
@progress = progress
end
- # human readable task name used for logging
- def human_name
- raise NotImplementedError
- end
-
# dump task backup to `path`
- def dump(path)
+ #
+ # @param [String] path fully qualified backup task destination
+ # @param [String] backup_id unique identifier for the backup
+ def dump(path, backup_id)
raise NotImplementedError
end
@@ -29,11 +27,6 @@ module Backup
def post_restore_warning
end
- # returns `true` when the task should be used
- def enabled
- true
- end
-
private
attr_reader :progress
diff --git a/lib/backup/terraform_state.rb b/lib/backup/terraform_state.rb
deleted file mode 100644
index 05f61d248be..00000000000
--- a/lib/backup/terraform_state.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Backup
- class TerraformState < Backup::Files
- def initialize(progress)
- super(progress, 'terraform_state', Settings.terraform_state.storage_path, excludes: ['tmp'])
- end
-
- override :human_name
- def human_name
- _('terraform states')
- end
- end
-end
diff --git a/lib/backup/uploads.rb b/lib/backup/uploads.rb
deleted file mode 100644
index 700f2af4415..00000000000
--- a/lib/backup/uploads.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Backup
- class Uploads < Backup::Files
- def initialize(progress)
- super(progress, 'uploads', File.join(Gitlab.config.uploads.storage_path, "uploads"), excludes: ['tmp'])
- end
-
- override :human_name
- def human_name
- _('uploads')
- end
- end
-end
diff --git a/lib/banzai/filter/base_sanitization_filter.rb b/lib/banzai/filter/base_sanitization_filter.rb
index 4e350a59fa0..3b00d1a9824 100644
--- a/lib/banzai/filter/base_sanitization_filter.rb
+++ b/lib/banzai/filter/base_sanitization_filter.rb
@@ -39,6 +39,9 @@ module Banzai
allowlist[:attributes][:all].delete('name')
allowlist[:attributes]['a'].push('name')
+ allowlist[:attributes]['img'].push('data-diagram')
+ allowlist[:attributes]['img'].push('data-diagram-src')
+
# Allow any protocol in `a` elements
# and then remove links with unsafe protocols
allowlist[:protocols].delete('a')
diff --git a/lib/banzai/filter/custom_emoji_filter.rb b/lib/banzai/filter/custom_emoji_filter.rb
index a5f1a22c483..ae95c7f66b6 100644
--- a/lib/banzai/filter/custom_emoji_filter.rb
+++ b/lib/banzai/filter/custom_emoji_filter.rb
@@ -8,8 +8,7 @@ module Banzai
IGNORED_ANCESTOR_TAGS = %w(pre code tt).to_set
def call
- return doc unless context[:project]
- return doc unless Feature.enabled?(:custom_emoji, context[:project])
+ return doc unless resource_parent
doc.xpath('descendant-or-self::text()').each do |node|
content = node.to_html
@@ -50,12 +49,12 @@ module Banzai
def has_custom_emoji?
strong_memoize(:has_custom_emoji) do
- namespace&.custom_emoji&.any?
+ CustomEmoji.for_resource(resource_parent).any?
end
end
- def namespace
- context[:project].namespace.root_ancestor
+ def resource_parent
+ context[:project] || context[:group]
end
def custom_emoji_candidates
@@ -63,7 +62,8 @@ module Banzai
end
def all_custom_emoji
- @all_custom_emoji ||= namespace.custom_emoji.by_name(custom_emoji_candidates).index_by(&:name)
+ @all_custom_emoji ||=
+ CustomEmoji.for_resource(resource_parent).by_name(custom_emoji_candidates).index_by(&:name)
end
end
end
diff --git a/lib/banzai/filter/image_link_filter.rb b/lib/banzai/filter/image_link_filter.rb
index 44acc7805b4..60881b5f511 100644
--- a/lib/banzai/filter/image_link_filter.rb
+++ b/lib/banzai/filter/image_link_filter.rb
@@ -27,6 +27,13 @@ module Banzai
# make sure the original non-proxied src carries over to the link
link['data-canonical-src'] = img['data-canonical-src'] if img['data-canonical-src']
+ if img['data-diagram'] && img['data-diagram-src']
+ link['data-diagram'] = img['data-diagram']
+ link['data-diagram-src'] = img['data-diagram-src']
+ img.remove_attribute('data-diagram')
+ img.remove_attribute('data-diagram-src')
+ end
+
link.children = if link_replaces_image
img['alt'] || img['data-src'] || img['src']
else
diff --git a/lib/banzai/filter/kroki_filter.rb b/lib/banzai/filter/kroki_filter.rb
index 9aa2afce5a8..845c7f2bc0a 100644
--- a/lib/banzai/filter/kroki_filter.rb
+++ b/lib/banzai/filter/kroki_filter.rb
@@ -25,11 +25,19 @@ module Banzai
diagram_type = node.parent['lang']
diagram_src = node.content
image_src = create_image_src(diagram_type, diagram_format, diagram_src)
- lazy_load = diagram_src.length > MAX_CHARACTER_LIMIT
- other_attrs = lazy_load ? "hidden" : ""
+ img_tag = Nokogiri::HTML::DocumentFragment.parse(%(<img src="#{image_src}" />))
+ img_tag = img_tag.children.first
- img_tag = Nokogiri::HTML::DocumentFragment.parse(%(<img class="js-render-kroki" src="#{image_src}" #{other_attrs} />))
- node.parent.replace(img_tag)
+ unless img_tag.nil?
+ lazy_load = diagram_src.length > MAX_CHARACTER_LIMIT
+ img_tag.set_attribute('hidden', '') if lazy_load
+ img_tag.set_attribute('class', 'js-render-kroki')
+
+ img_tag.set_attribute('data-diagram', node.parent['lang'])
+ img_tag.set_attribute('data-diagram-src', "data:text/plain;base64,#{Base64.strict_encode64(node.content)}")
+
+ node.parent.replace(img_tag)
+ end
end
doc
diff --git a/lib/banzai/filter/plantuml_filter.rb b/lib/banzai/filter/plantuml_filter.rb
index 68a99702d6f..cbcd547120d 100644
--- a/lib/banzai/filter/plantuml_filter.rb
+++ b/lib/banzai/filter/plantuml_filter.rb
@@ -15,8 +15,14 @@ module Banzai
doc.xpath(lang_tag).each do |node|
img_tag = Nokogiri::HTML::DocumentFragment.parse(
- Asciidoctor::PlantUml::Processor.plantuml_content(node.content, {}))
- node.parent.replace(img_tag)
+ Asciidoctor::PlantUml::Processor.plantuml_content(node.content, {})).css('img').first
+
+ unless img_tag.nil?
+ img_tag.set_attribute('data-diagram', 'plantuml')
+ img_tag.set_attribute('data-diagram-src', "data:text/plain;base64,#{Base64.strict_encode64(node.content)}")
+
+ node.parent.replace(img_tag)
+ end
end
doc
diff --git a/lib/banzai/filter/repository_link_filter.rb b/lib/banzai/filter/repository_link_filter.rb
index 408e6dc685d..f5cf1833304 100644
--- a/lib/banzai/filter/repository_link_filter.rb
+++ b/lib/banzai/filter/repository_link_filter.rb
@@ -180,7 +180,7 @@ module Banzai
parts.pop if uri_type(request_path) != :tree
- path.sub!(%r{\A\./}, '')
+ path.delete_prefix!('./')
while path.start_with?('../')
parts.pop
diff --git a/lib/banzai/pipeline/gfm_pipeline.rb b/lib/banzai/pipeline/gfm_pipeline.rb
index df8151b3296..5e7c2f64c92 100644
--- a/lib/banzai/pipeline/gfm_pipeline.rb
+++ b/lib/banzai/pipeline/gfm_pipeline.rb
@@ -15,11 +15,11 @@ module Banzai
# Must always be before the SanitizationFilter to prevent XSS attacks
Filter::SpacedLinkFilter,
Filter::SanitizationFilter,
+ Filter::KrokiFilter,
Filter::AssetProxyFilter,
Filter::SyntaxHighlightFilter,
Filter::MathFilter,
Filter::ColorFilter,
- Filter::KrokiFilter,
Filter::MermaidFilter,
Filter::VideoLinkFilter,
Filter::AudioLinkFilter,
diff --git a/lib/bulk_imports/common/pipelines/entity_finisher.rb b/lib/bulk_imports/common/pipelines/entity_finisher.rb
index aa9221cceee..0f4def3b17a 100644
--- a/lib/bulk_imports/common/pipelines/entity_finisher.rb
+++ b/lib/bulk_imports/common/pipelines/entity_finisher.rb
@@ -30,6 +30,8 @@ module BulkImports
pipeline_class: self.class.name,
message: "Entity #{entity.status_name}"
)
+
+ context.portable.try(:after_import)
end
private
diff --git a/lib/bulk_imports/groups/stage.rb b/lib/bulk_imports/groups/stage.rb
index bc27220391d..97a423b6ea9 100644
--- a/lib/bulk_imports/groups/stage.rb
+++ b/lib/bulk_imports/groups/stage.rb
@@ -47,7 +47,7 @@ module BulkImports
end
def project_entities_pipeline
- if project_pipeline_available? && ::Feature.enabled?(:bulk_import_projects, default_enabled: :yaml)
+ if project_pipeline_available? && feature_flag_enabled?
{
project_entities: {
pipeline: BulkImports::Groups::Pipelines::ProjectEntitiesPipeline,
@@ -62,6 +62,18 @@ module BulkImports
def project_pipeline_available?
@bulk_import.source_version_info >= BulkImport.min_gl_version_for_project_migration
end
+
+ def feature_flag_enabled?
+ destination_namespace = @bulk_import_entity.destination_namespace
+
+ if destination_namespace.present?
+ root_ancestor = Namespace.find_by_full_path(destination_namespace)&.root_ancestor
+
+ ::Feature.enabled?(:bulk_import_projects, root_ancestor, default_enabled: :yaml)
+ else
+ ::Feature.enabled?(:bulk_import_projects, default_enabled: :yaml)
+ end
+ end
end
end
end
diff --git a/lib/bulk_imports/stage.rb b/lib/bulk_imports/stage.rb
index 9c19e9ea60b..6cf394c5df0 100644
--- a/lib/bulk_imports/stage.rb
+++ b/lib/bulk_imports/stage.rb
@@ -2,10 +2,13 @@
module BulkImports
class Stage
- def initialize(bulk_import)
- raise(ArgumentError, 'Expected an argument of type ::BulkImport') unless bulk_import.is_a?(::BulkImport)
+ def initialize(bulk_import_entity)
+ unless bulk_import_entity.is_a?(::BulkImports::Entity)
+ raise(ArgumentError, 'Expected an argument of type ::BulkImports::Entity')
+ end
- @bulk_import = bulk_import
+ @bulk_import_entity = bulk_import_entity
+ @bulk_import = bulk_import_entity.bulk_import
end
def pipelines
diff --git a/lib/container_registry/base_client.rb b/lib/container_registry/base_client.rb
index 22d4510fe71..bb9422ae048 100644
--- a/lib/container_registry/base_client.rb
+++ b/lib/container_registry/base_client.rb
@@ -37,14 +37,24 @@ module ContainerRegistry
class << self
private
- def with_dummy_client(return_value_if_disabled: nil)
+ def with_dummy_client(return_value_if_disabled: nil, token_config: { type: :full_access_token, path: nil })
registry_config = Gitlab.config.registry
unless registry_config.enabled && registry_config.api_url.present?
return return_value_if_disabled
end
- token = Auth::ContainerRegistryAuthenticationService.access_token([], [])
- yield new(registry_config.api_url, token: token)
+ yield new(registry_config.api_url, token: token_from(token_config))
+ end
+
+ def token_from(config)
+ case config[:type]
+ when :full_access_token
+ Auth::ContainerRegistryAuthenticationService.access_token([], [])
+ when :nested_repositories_token
+ return unless config[:path]
+
+ Auth::ContainerRegistryAuthenticationService.pull_nested_repositories_access_token(config[:path])
+ end
end
end
diff --git a/lib/container_registry/gitlab_api_client.rb b/lib/container_registry/gitlab_api_client.rb
index 3cd7003d1f8..0cd8f8509f6 100644
--- a/lib/container_registry/gitlab_api_client.rb
+++ b/lib/container_registry/gitlab_api_client.rb
@@ -5,10 +5,12 @@ module ContainerRegistry
include Gitlab::Utils::StrongMemoize
JSON_TYPE = 'application/json'
+ CANCEL_RESPONSE_STATUS_HEADER = 'status'
IMPORT_RESPONSES = {
200 => :already_imported,
202 => :ok,
+ 400 => :bad_request,
401 => :unauthorized,
404 => :not_found,
409 => :already_being_imported,
@@ -25,6 +27,12 @@ module ContainerRegistry
end
end
+ def self.deduplicated_size(path)
+ with_dummy_client(token_config: { type: :nested_repositories_token, path: path }) do |client|
+ client.repository_details(path, sizing: :self_with_descendants)['size_bytes']
+ end
+ end
+
# https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/api.md#compliance-check
def supports_gitlab_api?
strong_memoize(:supports_gitlab_api) do
@@ -50,18 +58,38 @@ module ContainerRegistry
IMPORT_RESPONSES.fetch(response.status, :error)
end
+ # https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/api.md#cancel-repository-import
+ def cancel_repository_import(path, force: false)
+ response = with_import_token_faraday do |faraday_client|
+ faraday_client.delete(import_url_for(path)) do |req|
+ req.params['force'] = true if force
+ end
+ end
+
+ status = IMPORT_RESPONSES.fetch(response.status, :error)
+ actual_state = response.body[CANCEL_RESPONSE_STATUS_HEADER]
+
+ { status: status, migration_state: actual_state }
+ end
+
# https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/api.md#get-repository-import-status
def import_status(path)
with_import_token_faraday do |faraday_client|
- body_hash = response_body(faraday_client.get(import_url_for(path)))
- body_hash['status'] || 'error'
+ response = faraday_client.get(import_url_for(path))
+
+ # Temporary solution for https://gitlab.com/gitlab-org/gitlab/-/issues/356085#solutions
+ # this will trigger a `retry_pre_import`
+ break 'pre_import_failed' unless response.success?
+
+ body_hash = response_body(response)
+ body_hash&.fetch('status') || 'error'
end
end
- def repository_details(path, with_size: false)
+ def repository_details(path, sizing: nil)
with_token_faraday do |faraday_client|
req = faraday_client.get("/gitlab/v1/repositories/#{path}/") do |req|
- req.params['size'] = 'self' if with_size
+ req.params['size'] = sizing if sizing
end
break {} unless req.success?
diff --git a/lib/container_registry/migration.rb b/lib/container_registry/migration.rb
index b03c94e5ebf..005ef880034 100644
--- a/lib/container_registry/migration.rb
+++ b/lib/container_registry/migration.rb
@@ -2,6 +2,17 @@
module ContainerRegistry
module Migration
+ # Some container repositories do not have a plan associated with them, they will be imported with
+ # the free tiers
+ FREE_TIERS = ['free', 'early_adopter', nil].freeze
+ PREMIUM_TIERS = %w[premium bronze silver premium_trial].freeze
+ ULTIMATE_TIERS = %w[ultimate gold ultimate_trial].freeze
+ PLAN_GROUPS = {
+ 'free' => FREE_TIERS,
+ 'premium' => PREMIUM_TIERS,
+ 'ultimate' => ULTIMATE_TIERS
+ }.freeze
+
class << self
delegate :container_registry_import_max_tags_count, to: ::Gitlab::CurrentSettings
delegate :container_registry_import_max_retries, to: ::Gitlab::CurrentSettings
@@ -28,9 +39,9 @@ module ContainerRegistry
def self.enqueue_waiting_time
return 0 if Feature.enabled?(:container_registry_migration_phase2_enqueue_speed_fast)
- return 6.hours if Feature.enabled?(:container_registry_migration_phase2_enqueue_speed_slow)
+ return 165.minutes if Feature.enabled?(:container_registry_migration_phase2_enqueue_speed_slow)
- 1.hour
+ 45.minutes
end
def self.capacity
@@ -46,8 +57,12 @@ module ContainerRegistry
0
end
- def self.target_plan
- Plan.find_by_name(target_plan_name)
+ def self.target_plans
+ PLAN_GROUPS[target_plan_name]
+ end
+
+ def self.all_plans?
+ Feature.enabled?(:container_registry_migration_phase2_all_plans)
end
end
end
diff --git a/lib/error_tracking/sentry_client.rb b/lib/error_tracking/sentry_client.rb
index 8d1bcec032d..6a341ddbe86 100644
--- a/lib/error_tracking/sentry_client.rb
+++ b/lib/error_tracking/sentry_client.rb
@@ -59,10 +59,8 @@ module ErrorTracking
end
end
- def http_request
- response = handle_request_exceptions do
- yield
- end
+ def http_request(&block)
+ response = handle_request_exceptions(&block)
handle_response(response)
end
@@ -86,9 +84,7 @@ module ErrorTracking
end
def handle_response(response)
- unless response.code.between?(200, 204)
- raise_error "Sentry response status code: #{response.code}"
- end
+ raise_error "Sentry response status code: #{response.code}" unless response.code.between?(200, 204)
{ body: response.parsed_response, headers: response.headers }
end
diff --git a/lib/error_tracking/sentry_client/event.rb b/lib/error_tracking/sentry_client/event.rb
index 93449344d6c..5343eb7df57 100644
--- a/lib/error_tracking/sentry_client/event.rb
+++ b/lib/error_tracking/sentry_client/event.rb
@@ -15,14 +15,14 @@ module ErrorTracking
stack_trace = parse_stack_trace(event)
Gitlab::ErrorTracking::ErrorEvent.new(
- issue_id: event.dig('groupID'),
- date_received: event.dig('dateReceived'),
+ issue_id: event['groupID'],
+ date_received: event['dateReceived'],
stack_trace_entries: stack_trace
)
end
def parse_stack_trace(event)
- exception_entry = event.dig('entries')&.detect { |h| h['type'] == 'exception' }
+ exception_entry = event['entries']&.detect { |h| h['type'] == 'exception' }
return [] unless exception_entry
exception_values = exception_entry.dig('data', 'values')
diff --git a/lib/error_tracking/sentry_client/issue.rb b/lib/error_tracking/sentry_client/issue.rb
index 65da072ef8d..d0e6bd783f3 100644
--- a/lib/error_tracking/sentry_client/issue.rb
+++ b/lib/error_tracking/sentry_client/issue.rb
@@ -54,9 +54,7 @@ module ErrorTracking
end
def list_issue_sentry_query(issue_status:, limit:, sort: nil, search_term: '', cursor: nil)
- unless SENTRY_API_SORT_VALUE_MAP.key?(sort)
- raise BadRequestError, 'Invalid value for sort param'
- end
+ raise BadRequestError, 'Invalid value for sort param' unless SENTRY_API_SORT_VALUE_MAP.key?(sort)
{
query: "is:#{issue_status} #{search_term}".strip,
@@ -69,7 +67,8 @@ module ErrorTracking
def validate_size(issues)
return if Gitlab::Utils::DeepSize.new(issues).valid?
- raise ResponseInvalidSizeError, "Sentry API response is too big. Limit is #{Gitlab::Utils::DeepSize.human_default_max_size}."
+ message = "Sentry API response is too big. Limit is #{Gitlab::Utils::DeepSize.human_default_max_size}."
+ raise ResponseInvalidSizeError, message
end
def get_issue(issue_id:)
@@ -117,7 +116,7 @@ module ErrorTracking
end
def map_to_errors(issues)
- issues.map(&method(:map_to_error))
+ issues.map { map_to_error(_1) }
end
def map_to_error(issue)
@@ -142,7 +141,7 @@ module ErrorTracking
end
def map_to_detailed_error(issue)
- Gitlab::ErrorTracking::DetailedError.new({
+ Gitlab::ErrorTracking::DetailedError.new(
id: issue.fetch('id'),
first_seen: issue.fetch('firstSeen', nil),
last_seen: issue.fetch('lastSeen', nil),
@@ -169,7 +168,7 @@ module ErrorTracking
last_release_short_version: issue.dig('lastRelease', 'shortVersion'),
last_release_version: issue.dig('lastRelease', 'version'),
integrated: false
- })
+ )
end
def extract_tags(issue)
diff --git a/lib/error_tracking/sentry_client/pagination_parser.rb b/lib/error_tracking/sentry_client/pagination_parser.rb
index 362a5d098f7..c6a42a6def2 100644
--- a/lib/error_tracking/sentry_client/pagination_parser.rb
+++ b/lib/error_tracking/sentry_client/pagination_parser.rb
@@ -3,7 +3,7 @@
module ErrorTracking
class SentryClient
module PaginationParser
- PATTERN = /rel=\"(?<direction>\w+)\";\sresults=\"(?<results>\w+)\";\scursor=\"(?<cursor>.+)\"/.freeze
+ PATTERN = /rel="(?<direction>\w+)";\sresults="(?<results>\w+)";\scursor="(?<cursor>.+)"/.freeze
def self.parse(headers)
links = headers['link'].to_s.split(',')
diff --git a/lib/error_tracking/sentry_client/projects.rb b/lib/error_tracking/sentry_client/projects.rb
index 9b8daa226b0..a06b44cf29d 100644
--- a/lib/error_tracking/sentry_client/projects.rb
+++ b/lib/error_tracking/sentry_client/projects.rb
@@ -18,7 +18,7 @@ module ErrorTracking
end
def map_to_projects(projects)
- projects.map(&method(:map_to_project))
+ projects.map { map_to_project(_1) }
end
def map_to_project(project)
@@ -28,7 +28,7 @@ module ErrorTracking
id: project.fetch('id', nil),
name: project.fetch('name'),
slug: project.fetch('slug'),
- status: project.dig('status'),
+ status: project['status'],
organization_name: organization.fetch('name'),
organization_id: organization.fetch('id', nil),
organization_slug: organization.fetch('slug')
diff --git a/lib/error_tracking/sentry_client/repo.rb b/lib/error_tracking/sentry_client/repo.rb
index 3baa7e69be6..4333ca9b3d9 100644
--- a/lib/error_tracking/sentry_client/repo.rb
+++ b/lib/error_tracking/sentry_client/repo.rb
@@ -23,7 +23,7 @@ module ErrorTracking
end
def map_to_repos(repos)
- repos.map(&method(:map_to_repo))
+ repos.map { map_to_repo(_1) }
end
def map_to_repo(repo)
diff --git a/lib/event_filter.rb b/lib/event_filter.rb
index 915ab355508..8833207dd1d 100644
--- a/lib/event_filter.rb
+++ b/lib/event_filter.rb
@@ -1,5 +1,6 @@
# frozen_string_literal: true
+# rubocop: disable CodeReuse/ActiveRecord
class EventFilter
include Gitlab::Utils::StrongMemoize
@@ -24,7 +25,6 @@ class EventFilter
filter == key.to_s
end
- # rubocop: disable CodeReuse/ActiveRecord
def apply_filter(events)
case filter
when PUSH
@@ -34,9 +34,9 @@ class EventFilter
when COMMENTS
events.commented_action
when TEAM
- events.where(action: [:joined, :left, :expired])
+ events.where(action: Event::TEAM_ACTIONS)
when ISSUE
- events.where(action: [:created, :updated, :closed, :reopened], target_type: 'Issue')
+ events.where(action: Event::ISSUE_ACTIONS, target_type: 'Issue')
when WIKI
wiki_events(events)
when DESIGNS
@@ -45,10 +45,157 @@ class EventFilter
events
end
end
- # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable Metrics/CyclomaticComplexity
+ # This method build specialized in-operator optimized queries based on different
+ # filter parameters. All queries will benefit from the index covering the following columns:
+ # author_id target_type action id
+ #
+ # More context: https://docs.gitlab.com/ee/development/database/efficient_in_operator_queries.html#the-inoperatoroptimization-module
+ def in_operator_query_builder_params(user_ids)
+ case filter
+ when ALL
+ in_operator_params(array_scope_ids: user_ids)
+ when PUSH
+ # Here we need to add an order hint column to force the correct index usage.
+ # Without the order hint, the following conditions will use the `index_events_on_author_id_and_id`
+ # index which is not as efficient as the `index_events_for_followed_users` index.
+ # > target_type IS NULL AND action = 5 AND author_id = X ORDER BY id DESC
+ #
+ # The order hint adds an extra order by column which doesn't affect the result but forces the planner
+ # to use the correct index:
+ # > target_type IS NULL AND action = 5 AND author_id = X ORDER BY target_type DESC, id DESC
+ in_operator_params(
+ array_scope_ids: user_ids,
+ scope: Event.where(target_type: nil).pushed_action,
+ order_hint_column: :target_type
+ )
+ when MERGED
+ in_operator_params(
+ array_scope_ids: user_ids,
+ scope: Event.where(target_type: MergeRequest.to_s).merged_action
+ )
+ when COMMENTS
+ in_operator_params(
+ array_scope_ids: user_ids,
+ scope: Event.commented_action,
+ in_column: :target_type,
+ in_values: [Note, *Note.descendants].map(&:name) # To make the query efficient we need to list all Note classes
+ )
+ when TEAM
+ in_operator_params(
+ array_scope_ids: user_ids,
+ scope: Event.where(target_type: nil),
+ order_hint_column: :target_type,
+ in_column: :action,
+ in_values: Event.actions.values_at(*Event::TEAM_ACTIONS)
+ )
+ when ISSUE
+ in_operator_params(
+ array_scope_ids: user_ids,
+ scope: Event.where(target_type: Issue.name),
+ in_column: :action,
+ in_values: Event.actions.values_at(*Event::ISSUE_ACTIONS)
+ )
+ when WIKI
+ in_operator_params(
+ array_scope_ids: user_ids,
+ scope: Event.for_wiki_page,
+ in_column: :action,
+ in_values: Event.actions.values_at(*Event::WIKI_ACTIONS)
+ )
+ when DESIGNS
+ in_operator_params(
+ array_scope_ids: user_ids,
+ scope: Event.for_design,
+ in_column: :action,
+ in_values: Event.actions.values_at(*Event::DESIGN_ACTIONS)
+ )
+ else
+ in_operator_params(array_scope_ids: user_ids)
+ end
+ end
+ # rubocop: enable Metrics/CyclomaticComplexity
private
+ def in_operator_params(array_scope_ids:, scope: nil, in_column: nil, in_values: nil, order_hint_column: nil)
+ base_scope = Event.all
+ base_scope = base_scope.merge(scope) if scope
+
+ order = { id: :desc }
+ finder_query = -> (id_expression) { Event.where(Event.arel_table[:id].eq(id_expression)) }
+
+ if order_hint_column.present?
+ order = Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: order_hint_column,
+ order_expression: Event.arel_table[order_hint_column].desc,
+ nullable: :nulls_last,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: :id,
+ order_expression: Event.arel_table[:id].desc
+ )
+ ])
+
+ finder_query = -> (_order_hint, id_expression) { Event.where(Event.arel_table[:id].eq(id_expression)) }
+ end
+
+ base_scope = base_scope.reorder(order)
+
+ array_params = in_operator_array_params(
+ array_scope_ids: array_scope_ids,
+ scope: base_scope,
+ in_column: in_column,
+ in_values: in_values
+ )
+
+ array_params.merge(
+ scope: base_scope,
+ finder_query: finder_query
+ )
+ end
+
+ # This method builds the array_ parameters
+ # without in_column parameter: uses one IN filter: author_id
+ # with in_column: two IN filters: author_id, (target_type OR action)
+ def in_operator_array_params(scope:, array_scope_ids:, in_column: nil, in_values: nil)
+ if in_column
+ # Builds Carthesian product of the in_values and the array_scope_ids (in this case: user_ids).
+ # The process is described here: https://docs.gitlab.com/ee/development/database/efficient_in_operator_queries.html#multiple-in-queries
+ # VALUES ((array_scope_ids[0], in_values[0]), (array_scope_ids[1], in_values[0]) ...)
+ cartesian = array_scope_ids.product(in_values)
+ user_with_column_list = Arel::Nodes::ValuesList.new(cartesian)
+
+ as = "array_ids(id, #{Event.connection.quote_column_name(in_column)})"
+ from = Arel::Nodes::Grouping.new(user_with_column_list).as(as)
+ {
+ array_scope: User.select(:id, in_column).from(from),
+ array_mapping_scope: -> (author_id_expression, in_column_expression) do
+ Event
+ .merge(scope)
+ .where(Event.arel_table[:author_id].eq(author_id_expression))
+ .where(Event.arel_table[in_column].eq(in_column_expression))
+ end
+ }
+ else
+ # Builds a simple query to represent the array_scope_ids
+ # VALUES ((array_scope_ids[0]), (array_scope_ids[2])...)
+ array_ids_list = Arel::Nodes::ValuesList.new(array_scope_ids.map { |id| [id] })
+ from = Arel::Nodes::Grouping.new(array_ids_list).as('array_ids(id)')
+ {
+ array_scope: User.select(:id).from(from),
+ array_mapping_scope: -> (author_id_expression) do
+ Event
+ .merge(scope)
+ .where(Event.arel_table[:author_id].eq(author_id_expression))
+ end
+ }
+ end
+ end
+
def wiki_events(events)
events.for_wiki_page
end
@@ -61,5 +208,6 @@ class EventFilter
[ALL, PUSH, MERGED, ISSUE, COMMENTS, TEAM, WIKI, DESIGNS]
end
end
+# rubocop: enable CodeReuse/ActiveRecord
EventFilter.prepend_mod_with('EventFilter')
diff --git a/lib/expand_variables.rb b/lib/expand_variables.rb
index d172df4920f..06160b55f5c 100644
--- a/lib/expand_variables.rb
+++ b/lib/expand_variables.rb
@@ -50,9 +50,8 @@ module ExpandVariables
# Convert hash array to variables
if variables.is_a?(Array)
- variables = variables.reduce({}) do |hash, variable|
+ variables = variables.each_with_object({}) do |variable, hash|
hash[variable[:key]] = variable[:value]
- hash
end
end
diff --git a/lib/gitlab/application_context.rb b/lib/gitlab/application_context.rb
index d93067c7e2f..b10330914ca 100644
--- a/lib/gitlab/application_context.rb
+++ b/lib/gitlab/application_context.rb
@@ -16,6 +16,8 @@ module Gitlab
:client_id,
:caller_id,
:remote_ip,
+ :job_id,
+ :pipeline_id,
:related_class,
:feature_category
].freeze
@@ -28,6 +30,7 @@ module Gitlab
Attribute.new(:runner, ::Ci::Runner),
Attribute.new(:caller_id, String),
Attribute.new(:remote_ip, String),
+ Attribute.new(:job, ::Ci::Build),
Attribute.new(:related_class, String),
Attribute.new(:feature_category, String)
].freeze
@@ -73,14 +76,16 @@ module Gitlab
def to_lazy_hash
{}.tap do |hash|
- hash[:user] = -> { username } if set_values.include?(:user)
- hash[:project] = -> { project_path } if set_values.include?(:project) || set_values.include?(:runner)
+ hash[:user] = -> { username } if include_user?
+ hash[:project] = -> { project_path } if include_project?
hash[:root_namespace] = -> { root_namespace_path } if include_namespace?
hash[:client_id] = -> { client } if include_client?
hash[:caller_id] = caller_id if set_values.include?(:caller_id)
hash[:remote_ip] = remote_ip if set_values.include?(:remote_ip)
hash[:related_class] = related_class if set_values.include?(:related_class)
hash[:feature_category] = feature_category if set_values.include?(:feature_category)
+ hash[:pipeline_id] = -> { job&.pipeline_id } if set_values.include?(:job)
+ hash[:job_id] = -> { job&.id } if set_values.include?(:job)
end
end
@@ -103,32 +108,41 @@ module Gitlab
end
def project_path
- associated_routable = project || runner_project
+ associated_routable = project || runner_project || job_project
associated_routable&.full_path
end
def username
- user&.username
+ associated_user = user || job_user
+ associated_user&.username
end
def root_namespace_path
- associated_routable = namespace || project || runner_project || runner_group
+ associated_routable = namespace || project || runner_project || runner_group || job_project
associated_routable&.full_path_components&.first
end
def include_namespace?
- set_values.include?(:namespace) || set_values.include?(:project) || set_values.include?(:runner)
+ set_values.include?(:namespace) || set_values.include?(:project) || set_values.include?(:runner) || set_values.include?(:job)
end
def include_client?
set_values.include?(:user) || set_values.include?(:runner) || set_values.include?(:remote_ip)
end
+ def include_user?
+ set_values.include?(:user) || set_values.include?(:job)
+ end
+
+ def include_project?
+ set_values.include?(:project) || set_values.include?(:runner) || set_values.include?(:job)
+ end
+
def client
- if user
- "user/#{user.id}"
- elsif runner
+ if runner
"runner/#{runner.id}"
+ elsif user
+ "user/#{user.id}"
else
"ip/#{remote_ip}"
end
@@ -150,6 +164,18 @@ module Gitlab
runner.groups.first
end
end
+
+ def job_project
+ strong_memoize(:job_project) do
+ job&.project
+ end
+ end
+
+ def job_user
+ strong_memoize(:job_user) do
+ job&.user
+ end
+ end
end
end
diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb
index 0b0aaacbaff..09775297def 100644
--- a/lib/gitlab/application_rate_limiter.rb
+++ b/lib/gitlab/application_rate_limiter.rb
@@ -41,7 +41,8 @@ module Gitlab
auto_rollback_deployment: { threshold: 1, interval: 3.minutes },
search_rate_limit: { threshold: -> { application_settings.search_rate_limit }, interval: 1.minute },
search_rate_limit_unauthenticated: { threshold: -> { application_settings.search_rate_limit_unauthenticated }, interval: 1.minute },
- gitlab_shell_operation: { threshold: 600, interval: 1.minute }
+ gitlab_shell_operation: { threshold: 600, interval: 1.minute },
+ pipelines_create: { threshold: 25, interval: 1.minute }
}.freeze
end
diff --git a/lib/gitlab/asciidoc/include_processor.rb b/lib/gitlab/asciidoc/include_processor.rb
index 53d1135a2d7..6c4ecc04cdc 100644
--- a/lib/gitlab/asciidoc/include_processor.rb
+++ b/lib/gitlab/asciidoc/include_processor.rb
@@ -33,7 +33,7 @@ module Gitlab
max_include_depth = doc.attributes.fetch('max-include-depth').to_i
return false if max_include_depth < 1
- return false if target_uri?(target)
+ return false if target_http?(target)
return false if included.size >= max_includes
true
diff --git a/lib/gitlab/auth/ldap/dn.rb b/lib/gitlab/auth/ldap/dn.rb
index ea88dedadf5..a188aa168c1 100644
--- a/lib/gitlab/auth/ldap/dn.rb
+++ b/lib/gitlab/auth/ldap/dn.rb
@@ -30,7 +30,7 @@ module Gitlab
def self.normalize_value(given_value)
dummy_dn = "placeholder=#{given_value}"
normalized_dn = new(*dummy_dn).to_normalized_s
- normalized_dn.sub(/\Aplaceholder=/, '')
+ normalized_dn.delete_prefix('placeholder=')
end
##
diff --git a/lib/gitlab/auth/o_auth/provider.rb b/lib/gitlab/auth/o_auth/provider.rb
index 41a8739b0b6..1a25ed10d81 100644
--- a/lib/gitlab/auth/o_auth/provider.rb
+++ b/lib/gitlab/auth/o_auth/provider.rb
@@ -5,6 +5,7 @@ module Gitlab
module OAuth
class Provider
LABELS = {
+ "alicloud" => "AliCloud",
"dingtalk" => "DingTalk",
"github" => "GitHub",
"gitlab" => "GitLab.com",
diff --git a/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb b/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb
index b0a8c3a8cbb..52ff3aaa423 100644
--- a/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb
+++ b/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb
@@ -22,8 +22,6 @@ module Gitlab
def perform(start_id, end_id)
eligible_mrs = MergeRequest.eligible.where(id: start_id..end_id).pluck(:id)
- return if eligible_mrs.empty?
-
eligible_mrs.each_slice(10) do |slice|
MergeRequest.where(id: slice).update_all(draft: true)
end
diff --git a/lib/gitlab/background_migration/backfill_group_features.rb b/lib/gitlab/background_migration/backfill_group_features.rb
new file mode 100644
index 00000000000..084c788c8cb
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_group_features.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Backfill group_features for an array of groups
+ class BackfillGroupFeatures < ::Gitlab::BackgroundMigration::BaseJob
+ include Gitlab::Database::DynamicModelHelpers
+
+ def perform(start_id, end_id, batch_table, batch_column, sub_batch_size, pause_ms, batch_size)
+ pause_ms = 0 if pause_ms < 0
+
+ parent_batch_relation = relation_scoped_to_range(batch_table, batch_column, start_id, end_id)
+ parent_batch_relation.each_batch(column: batch_column, of: sub_batch_size, order_hint: :type) do |sub_batch|
+ batch_metrics.time_operation(:upsert_group_features) do
+ upsert_group_features(sub_batch, batch_size)
+ end
+
+ sleep(pause_ms * 0.001)
+ end
+ end
+
+ def batch_metrics
+ @batch_metrics ||= Gitlab::Database::BackgroundMigration::BatchMetrics.new
+ end
+
+ private
+
+ def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
+ define_batchable_model(source_table, connection: connection)
+ .where(source_key_column => start_id..stop_id)
+ .where(type: 'Group')
+ end
+
+ def upsert_group_features(relation, batch_size)
+ connection.execute(
+ <<~SQL
+ INSERT INTO group_features (group_id, created_at, updated_at)
+ SELECT namespaces.id as group_id, now(), now()
+ FROM namespaces
+ WHERE namespaces.type = 'Group' AND namespaces.id IN(#{relation.select(:id).limit(batch_size).to_sql})
+ ON CONFLICT (group_id) DO NOTHING;
+ SQL
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_incident_issue_escalation_statuses.rb b/lib/gitlab/background_migration/backfill_incident_issue_escalation_statuses.rb
deleted file mode 100644
index 2d46ff6b933..00000000000
--- a/lib/gitlab/background_migration/backfill_incident_issue_escalation_statuses.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module BackgroundMigration
- # BackfillIncidentIssueEscalationStatuses adds
- # IncidentManagement::IssuableEscalationStatus records for existing Incident issues.
- # They will be added with no policy, and escalations_started_at as nil.
- class BackfillIncidentIssueEscalationStatuses
- def perform(start_id, stop_id)
- ActiveRecord::Base.connection.execute <<~SQL
- INSERT INTO incident_management_issuable_escalation_statuses (issue_id, created_at, updated_at)
- SELECT issues.id, current_timestamp, current_timestamp
- FROM issues
- WHERE issues.issue_type = 1
- AND issues.id BETWEEN #{start_id} AND #{stop_id}
- ON CONFLICT (issue_id) DO NOTHING;
- SQL
-
- mark_job_as_succeeded(start_id, stop_id)
- end
-
- private
-
- def mark_job_as_succeeded(*arguments)
- ::Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
- self.class.name.demodulize,
- arguments
- )
- end
- end
- end
-end
diff --git a/lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb b/lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb
new file mode 100644
index 00000000000..1f0d606f001
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Backfills the `routes.namespace_id` column, by setting it to project.project_namespace_id
+ class BackfillNamespaceIdForProjectRoute
+ include Gitlab::Database::DynamicModelHelpers
+
+ def perform(start_id, end_id, batch_table, batch_column, sub_batch_size, pause_ms)
+ parent_batch_relation = relation_scoped_to_range(batch_table, batch_column, start_id, end_id)
+
+ parent_batch_relation.each_batch(column: batch_column, of: sub_batch_size) do |sub_batch|
+ cleanup_gin_index('routes')
+
+ batch_metrics.time_operation(:update_all) do
+ ActiveRecord::Base.connection.execute <<~SQL
+ WITH route_and_ns(route_id, project_namespace_id) AS #{::Gitlab::Database::AsWithMaterialized.materialized_if_supported} (
+ #{sub_batch.to_sql}
+ )
+ UPDATE routes
+ SET namespace_id = route_and_ns.project_namespace_id
+ FROM route_and_ns
+ WHERE id = route_and_ns.route_id
+ SQL
+ end
+
+ pause_ms = [0, pause_ms].max
+ sleep(pause_ms * 0.001)
+ end
+ end
+
+ def batch_metrics
+ @batch_metrics ||= Gitlab::Database::BackgroundMigration::BatchMetrics.new
+ end
+
+ private
+
+ def cleanup_gin_index(table_name)
+ sql = "select indexname::text from pg_indexes where tablename = '#{table_name}' and indexdef ilike '%gin%'"
+ index_names = ActiveRecord::Base.connection.select_values(sql)
+
+ index_names.each do |index_name|
+ ActiveRecord::Base.connection.execute("select gin_clean_pending_list('#{index_name}')")
+ end
+ end
+
+ def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
+ define_batchable_model(source_table, connection: ActiveRecord::Base.connection)
+ .joins('INNER JOIN projects ON routes.source_id = projects.id')
+ .where(source_key_column => start_id..stop_id)
+ .where(namespace_id: nil)
+ .where(source_type: 'Project')
+ .where.not(projects: { project_namespace_id: nil })
+ .select("routes.id, projects.project_namespace_id")
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb b/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb
new file mode 100644
index 00000000000..a16efa4222b
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Backfills the `issues.work_item_type_id` column, replacing any
+ # instances of `NULL` with the appropriate `work_item_types.id` based on `issues.issue_type`
+ class BackfillWorkItemTypeIdForIssues
+ # Basic AR model for issues table
+ class MigrationIssue < ApplicationRecord
+ include ::EachBatch
+
+ self.table_name = 'issues'
+
+ scope :base_query, ->(base_type) { where(work_item_type_id: nil, issue_type: base_type) }
+ end
+
+ MAX_UPDATE_RETRIES = 3
+
+ def perform(start_id, end_id, batch_table, batch_column, sub_batch_size, pause_ms, base_type, base_type_id)
+ parent_batch_relation = relation_scoped_to_range(batch_table, batch_column, start_id, end_id, base_type)
+
+ parent_batch_relation.each_batch(column: batch_column, of: sub_batch_size) do |sub_batch|
+ first, last = sub_batch.pluck(Arel.sql('min(id), max(id)')).first
+
+ # The query need to be reconstructed because .each_batch modifies the default scope
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/330510
+ reconstructed_sub_batch = MigrationIssue.unscoped.base_query(base_type).where(id: first..last)
+
+ batch_metrics.time_operation(:update_all) do
+ update_with_retry(reconstructed_sub_batch, base_type_id)
+ end
+
+ pause_ms = 0 if pause_ms < 0
+ sleep(pause_ms * 0.001)
+ end
+ end
+
+ def batch_metrics
+ @batch_metrics ||= Gitlab::Database::BackgroundMigration::BatchMetrics.new
+ end
+
+ private
+
+ # Retry mechanism required as update statements on the issues table will randomly take longer than
+ # expected due to gin indexes https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71869#note_775796352
+ def update_with_retry(sub_batch, base_type_id)
+ update_attempt = 1
+
+ begin
+ update_batch(sub_batch, base_type_id)
+ rescue ActiveRecord::StatementTimeout, ActiveRecord::QueryCanceled => e
+ update_attempt += 1
+
+ if update_attempt <= MAX_UPDATE_RETRIES
+ # sleeping 30 seconds as it might take a long time to clean the gin index pending list
+ sleep(30)
+ retry
+ end
+
+ raise e
+ end
+ end
+
+ def update_batch(sub_batch, base_type_id)
+ sub_batch.update_all(work_item_type_id: base_type_id)
+ end
+
+ def relation_scoped_to_range(source_table, source_key_column, start_id, end_id, base_type)
+ MigrationIssue.where(source_key_column => start_id..end_id).base_query(base_type)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy.rb b/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy.rb
new file mode 100644
index 00000000000..06036eebcb9
--- /dev/null
+++ b/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ module BatchingStrategies
+ # Batching class to use for back-filling issue's work_item_type_id for a single issue type.
+ # Batches will be scoped to records where the foreign key is NULL and only of a given issue type
+ #
+ # If no more batches exist in the table, returns nil.
+ class BackfillIssueWorkItemTypeBatchingStrategy < PrimaryKeyBatchingStrategy
+ def apply_additional_filters(relation, job_arguments:)
+ issue_type = job_arguments.first
+
+ relation.where(issue_type: issue_type)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb b/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb
index 5569bac0e19..e7a68b183b8 100644
--- a/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb
+++ b/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb
@@ -23,6 +23,7 @@ module Gitlab
quoted_column_name = model_class.connection.quote_column_name(column_name)
relation = model_class.where("#{quoted_column_name} >= ?", batch_min_value)
+ relation = apply_additional_filters(relation, job_arguments: job_arguments)
next_batch_bounds = nil
relation.each_batch(of: batch_size, column: column_name) do |batch| # rubocop:disable Lint/UnreachableLoop
@@ -33,6 +34,22 @@ module Gitlab
next_batch_bounds
end
+
+ # Strategies based on PrimaryKeyBatchingStrategy can use
+ # this method to easily apply additional filters.
+ #
+ # Example:
+ #
+ # class MatchingType < PrimaryKeyBatchingStrategy
+ # def apply_additional_filters(relation, job_arguments:)
+ # type = job_arguments.first
+ #
+ # relation.where(type: type)
+ # end
+ # end
+ def apply_additional_filters(relation, job_arguments: [])
+ relation
+ end
end
end
end
diff --git a/lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex.rb b/lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex.rb
new file mode 100644
index 00000000000..b703faf6a6c
--- /dev/null
+++ b/lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Cleanup draft column data inserted by a faulty regex
+ #
+ class CleanupDraftDataFromFaultyRegex
+ # Migration only version of MergeRequest table
+ ##
+ class MergeRequest < ActiveRecord::Base
+ LEAKY_REGEXP_STR = "^\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP"
+ CORRECTED_REGEXP_STR = "^(\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP)"
+
+ include EachBatch
+
+ self.table_name = 'merge_requests'
+
+ def self.eligible
+ where(state_id: 1)
+ .where(draft: true)
+ .where("title ~* ?", LEAKY_REGEXP_STR)
+ .where("title !~* ?", CORRECTED_REGEXP_STR)
+ end
+ end
+
+ def perform(start_id, end_id)
+ eligible_mrs = MergeRequest.eligible.where(id: start_id..end_id).pluck(:id)
+
+ return if eligible_mrs.empty?
+
+ eligible_mrs.each_slice(10) do |slice|
+ MergeRequest.where(id: slice).update_all(draft: false)
+ end
+
+ mark_job_as_succeeded(start_id, end_id)
+ end
+
+ private
+
+ def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ 'CleanupDraftDataFromFaultyRegex',
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/encrypt_static_object_token.rb b/lib/gitlab/background_migration/encrypt_static_object_token.rb
index 80931353e2f..a087d2529eb 100644
--- a/lib/gitlab/background_migration/encrypt_static_object_token.rb
+++ b/lib/gitlab/background_migration/encrypt_static_object_token.rb
@@ -52,9 +52,9 @@ module Gitlab
WHERE cte_id = id
SQL
end
-
- mark_job_as_succeeded(start_id, end_id)
end
+
+ mark_job_as_succeeded(start_id, end_id)
end
private
diff --git a/lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb b/lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb
new file mode 100644
index 00000000000..defd9ea832b
--- /dev/null
+++ b/lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb
@@ -0,0 +1,82 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Fix project name duplicates and backfill missing project namespace ids
+ class FixDuplicateProjectNameAndPath
+ SUB_BATCH_SIZE = 10
+ # isolated project active record
+ class Project < ActiveRecord::Base
+ include ::EachBatch
+
+ self.table_name = 'projects'
+
+ scope :without_project_namespace, -> { where(project_namespace_id: nil) }
+ scope :id_in, ->(ids) { where(id: ids) }
+ end
+
+ def perform(start_id, end_id)
+ @project_ids = fetch_project_ids(start_id, end_id)
+ backfill_project_namespaces_service = init_backfill_service(project_ids)
+ backfill_project_namespaces_service.cleanup_gin_index('projects')
+
+ project_ids.each_slice(SUB_BATCH_SIZE) do |ids|
+ ActiveRecord::Base.connection.execute(update_projects_name_and_path_sql(ids))
+ end
+
+ backfill_project_namespaces_service.backfill_project_namespaces
+
+ mark_job_as_succeeded(start_id, end_id)
+ end
+
+ private
+
+ attr_accessor :project_ids
+
+ def fetch_project_ids(start_id, end_id)
+ Project.without_project_namespace.where(id: start_id..end_id)
+ end
+
+ def init_backfill_service(project_ids)
+ service = Gitlab::BackgroundMigration::ProjectNamespaces::BackfillProjectNamespaces.new
+ service.project_ids = project_ids
+ service.sub_batch_size = SUB_BATCH_SIZE
+
+ service
+ end
+
+ def update_projects_name_and_path_sql(project_ids)
+ <<~SQL
+ WITH cte (project_id, path_from_route ) AS (
+ #{path_from_route_sql(project_ids).to_sql}
+ )
+ UPDATE
+ projects
+ SET
+ name = concat(projects.name, '-', id),
+ path = CASE
+ WHEN projects.path <> cte.path_from_route THEN path_from_route
+ ELSE projects.path
+ END
+ FROM
+ cte
+ WHERE
+ projects.id = cte.project_id;
+ SQL
+ end
+
+ def path_from_route_sql(project_ids)
+ Project.without_project_namespace.id_in(project_ids)
+ .joins("INNER JOIN routes ON routes.source_id = projects.id AND routes.source_type = 'Project'")
+ .select("projects.id, SUBSTRING(routes.path FROM '[^/]+(?=/$|$)') AS path_from_route")
+ end
+
+ def mark_job_as_succeeded(*arguments)
+ ::Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ 'FixDuplicateProjectNameAndPath',
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/merge_topics_with_same_name.rb b/lib/gitlab/background_migration/merge_topics_with_same_name.rb
new file mode 100644
index 00000000000..07231098a5f
--- /dev/null
+++ b/lib/gitlab/background_migration/merge_topics_with_same_name.rb
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # The class to merge project topics with the same case insensitive name
+ class MergeTopicsWithSameName
+ # Temporary AR model for topics
+ class Topic < ActiveRecord::Base
+ self.table_name = 'topics'
+ end
+
+ # Temporary AR model for project topic assignment
+ class ProjectTopic < ActiveRecord::Base
+ self.table_name = 'project_topics'
+ end
+
+ def perform(topic_names)
+ topic_names.each do |topic_name|
+ topics = Topic.where('LOWER(name) = ?', topic_name)
+ .order(total_projects_count: :desc, non_private_projects_count: :desc, id: :asc)
+ .to_a
+ topic_to_keep = topics.shift
+ merge_topics(topic_to_keep, topics) if topics.any?
+ end
+ end
+
+ private
+
+ def merge_topics(topic_to_keep, topics_to_remove)
+ description = topic_to_keep.description
+
+ topics_to_remove.each do |topic|
+ description ||= topic.description if topic.description.present?
+ process_avatar(topic_to_keep, topic) if topic.avatar.present?
+
+ ProjectTopic.transaction do
+ ProjectTopic.where(topic_id: topic.id)
+ .where.not(project_id: ProjectTopic.where(topic_id: topic_to_keep).select(:project_id))
+ .update_all(topic_id: topic_to_keep.id)
+ ProjectTopic.where(topic_id: topic.id).delete_all
+ end
+ end
+
+ Topic.where(id: topics_to_remove).delete_all
+
+ topic_to_keep.update(
+ description: description,
+ total_projects_count: total_projects_count(topic_to_keep.id),
+ non_private_projects_count: non_private_projects_count(topic_to_keep.id)
+ )
+ end
+
+ # We intentionally use application code here because we need to copy/remove avatar files
+ def process_avatar(topic_to_keep, topic_to_remove)
+ topic_to_remove = ::Projects::Topic.find(topic_to_remove.id)
+ topic_to_keep = ::Projects::Topic.find(topic_to_keep.id)
+ unless topic_to_keep.avatar.present?
+ topic_to_keep.avatar = topic_to_remove.avatar
+ topic_to_keep.save!
+ end
+
+ topic_to_remove.remove_avatar!
+ topic_to_remove.save!
+ end
+
+ def total_projects_count(topic_id)
+ ProjectTopic.where(topic_id: topic_id).count
+ end
+
+ def non_private_projects_count(topic_id)
+ ProjectTopic.joins('INNER JOIN projects ON project_topics.project_id = projects.id')
+ .where(project_topics: { topic_id: topic_id }).where('projects.visibility_level in (10, 20)').count
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb b/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb
new file mode 100644
index 00000000000..ec4631d1e34
--- /dev/null
+++ b/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # The class to migrate category of integrations to third_party_wiki for confluence and shimo
+ class MigrateShimoConfluenceIntegrationCategory
+ include Gitlab::Database::DynamicModelHelpers
+
+ def perform(start_id, end_id)
+ define_batchable_model('integrations', connection: ::ActiveRecord::Base.connection)
+ .where(id: start_id..end_id, type_new: %w[Integrations::Confluence Integrations::Shimo])
+ .update_all(category: 'third_party_wiki')
+
+ mark_job_as_succeeded(start_id, end_id)
+ end
+
+ private
+
+ def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/populate_container_repository_migration_plan.rb b/lib/gitlab/background_migration/populate_container_repository_migration_plan.rb
new file mode 100644
index 00000000000..9e102ea1517
--- /dev/null
+++ b/lib/gitlab/background_migration/populate_container_repository_migration_plan.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # The class to populates the migration_plan column of container_repositories
+ # with the current plan of the namespaces that owns the container_repository
+ #
+ # The plan can be NULL, in which case no UPDATE
+ # will be executed.
+ class PopulateContainerRepositoryMigrationPlan
+ def perform(start_id, end_id)
+ (start_id..end_id).each do |id|
+ execute(<<~SQL)
+ WITH selected_plan AS (
+ SELECT "plans"."name"
+ FROM "container_repositories"
+ INNER JOIN "projects" ON "projects"."id" = "container_repositories"."project_id"
+ INNER JOIN "namespaces" ON "namespaces"."id" = "projects"."namespace_id"
+ INNER JOIN "gitlab_subscriptions" ON "gitlab_subscriptions"."namespace_id" = "namespaces"."traversal_ids"[1]
+ INNER JOIN "plans" ON "plans"."id" = "gitlab_subscriptions"."hosted_plan_id"
+ WHERE "container_repositories"."id" = #{id}
+ )
+ UPDATE container_repositories
+ SET migration_plan = selected_plan.name
+ FROM selected_plan
+ WHERE container_repositories.id = #{id};
+ SQL
+ end
+
+ mark_job_as_succeeded(start_id, end_id)
+ end
+
+ private
+
+ def connection
+ @connection ||= ::ActiveRecord::Base.connection
+ end
+
+ def execute(sql)
+ connection.execute(sql)
+ end
+
+ def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/populate_namespace_statistics.rb b/lib/gitlab/background_migration/populate_namespace_statistics.rb
index e873ad412f2..97927ef48c2 100644
--- a/lib/gitlab/background_migration/populate_namespace_statistics.rb
+++ b/lib/gitlab/background_migration/populate_namespace_statistics.rb
@@ -5,9 +5,40 @@ module Gitlab
# This class creates/updates those namespace statistics
# that haven't been created nor initialized.
# It also updates the related namespace statistics
- # This is only required in EE
class PopulateNamespaceStatistics
def perform(group_ids, statistics)
+ # Updating group statistics might involve calling Gitaly.
+ # For example, when calculating `wiki_size`, we will need
+ # to perform the request to check if the repo exists and
+ # also the repository size.
+ #
+ # The `allow_n_plus_1_calls` method is only intended for
+ # dev and test. It won't be raised in prod.
+ ::Gitlab::GitalyClient.allow_n_plus_1_calls do
+ relation(group_ids).each do |group|
+ upsert_namespace_statistics(group, statistics)
+ end
+ end
+ end
+
+ private
+
+ def upsert_namespace_statistics(group, statistics)
+ response = ::Groups::UpdateStatisticsService.new(group, statistics: statistics).execute
+
+ error_message("#{response.message} group: #{group.id}") if response.error?
+ end
+
+ def logger
+ @logger ||= ::Gitlab::BackgroundMigration::Logger.build
+ end
+
+ def error_message(message)
+ logger.error(message: "Namespace Statistics Migration: #{message}")
+ end
+
+ def relation(group_ids)
+ Group.includes(:namespace_statistics).where(id: group_ids)
end
end
end
diff --git a/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb b/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb
index c34cc57ce60..bd7d7d02162 100644
--- a/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb
+++ b/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb
@@ -7,6 +7,8 @@ module Gitlab
#
# rubocop: disable Metrics/ClassLength
class BackfillProjectNamespaces
+ attr_accessor :project_ids, :sub_batch_size
+
SUB_BATCH_SIZE = 25
PROJECT_NAMESPACE_STI_NAME = 'Project'
@@ -18,7 +20,7 @@ module Gitlab
case migration_type
when 'up'
- backfill_project_namespaces(namespace_id)
+ backfill_project_namespaces
mark_job_as_succeeded(start_id, end_id, namespace_id, 'up')
when 'down'
cleanup_backfilled_project_namespaces(namespace_id)
@@ -28,11 +30,7 @@ module Gitlab
end
end
- private
-
- attr_accessor :project_ids, :sub_batch_size
-
- def backfill_project_namespaces(namespace_id)
+ def backfill_project_namespaces
project_ids.each_slice(sub_batch_size) do |project_ids|
# cleanup gin indexes on namespaces table
cleanup_gin_index('namespaces')
@@ -64,6 +62,8 @@ module Gitlab
end
end
+ private
+
def cleanup_backfilled_project_namespaces(namespace_id)
project_ids.each_slice(sub_batch_size) do |project_ids|
# IMPORTANT: first nullify project_namespace_id in projects table to avoid removing projects when records
diff --git a/lib/gitlab/blame.rb b/lib/gitlab/blame.rb
index 78a8f39e143..e210c18e3d1 100644
--- a/lib/gitlab/blame.rb
+++ b/lib/gitlab/blame.rb
@@ -2,11 +2,16 @@
module Gitlab
class Blame
- attr_accessor :blob, :commit
+ attr_accessor :blob, :commit, :range
- def initialize(blob, commit)
+ def initialize(blob, commit, range: nil)
@blob = blob
@commit = commit
+ @range = range
+ end
+
+ def first_line
+ range&.first || 1
end
def groups(highlight: true)
@@ -14,14 +19,14 @@ module Gitlab
groups = []
current_group = nil
- i = 0
- blame.each do |commit, line|
+ i = first_line - 1
+ blame.each do |commit, line, previous_path|
commit = Commit.new(commit, project)
commit.lazy_author # preload author
if prev_sha != commit.sha
groups << current_group if current_group
- current_group = { commit: commit, lines: [] }
+ current_group = { commit: commit, lines: [], previous_path: previous_path }
end
current_group[:lines] << (highlight ? highlighted_lines[i].html_safe : line)
@@ -37,7 +42,7 @@ module Gitlab
private
def blame
- @blame ||= Gitlab::Git::Blame.new(repository, @commit.id, @blob.path)
+ @blame ||= Gitlab::Git::Blame.new(repository, @commit.id, @blob.path, range: range)
end
def highlighted_lines
diff --git a/lib/gitlab/ci/ansi2html.rb b/lib/gitlab/ci/ansi2html.rb
index ef936581c10..10233cf4228 100644
--- a/lib/gitlab/ci/ansi2html.rb
+++ b/lib/gitlab/ci/ansi2html.rb
@@ -447,9 +447,8 @@ module Gitlab
end
def state
- state = STATE_PARAMS.inject({}) do |h, param|
+ state = STATE_PARAMS.each_with_object({}) do |param, h|
h[param] = send(param) # rubocop:disable GitlabSecurity/PublicSend
- h
end
Base64.urlsafe_encode64(state.to_json)
end
diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb
index 2b190d89fa4..2c9524c89ff 100644
--- a/lib/gitlab/ci/config.rb
+++ b/lib/gitlab/ci/config.rb
@@ -6,6 +6,8 @@ module Gitlab
# Base GitLab CI Configuration facade
#
class Config
+ include Gitlab::Utils::StrongMemoize
+
ConfigError = Class.new(StandardError)
TIMEOUT_SECONDS = 30.seconds
TIMEOUT_MESSAGE = 'Resolving config took longer than expected'
@@ -22,6 +24,11 @@ module Gitlab
def initialize(config, project: nil, pipeline: nil, sha: nil, user: nil, parent_pipeline: nil, source: nil, logger: nil)
@logger = logger || ::Gitlab::Ci::Pipeline::Logger.new(project: project)
@source_ref_path = pipeline&.source_ref_path
+ @project = project
+
+ if use_config_variables?
+ pipeline ||= ::Ci::Pipeline.new(project: project, sha: sha, user: user, source: source)
+ end
@context = self.logger.instrument(:config_build_context) do
build_context(project: project, pipeline: pipeline, sha: sha, user: user, parent_pipeline: parent_pipeline)
@@ -82,7 +89,13 @@ module Gitlab
end
def included_templates
- @context.expandset.filter_map { |i| i[:template] }
+ @context.includes.filter_map { |i| i[:location] if i[:type] == :template }
+ end
+
+ def metadata
+ {
+ includes: @context.includes
+ }
end
private
@@ -149,6 +162,10 @@ module Gitlab
end
def build_variables_without_instrumentation(project:, pipeline:)
+ if use_config_variables?
+ return pipeline.variables_builder.config_variables
+ end
+
Gitlab::Ci::Variables::Collection.new.tap do |variables|
break variables unless project
@@ -178,6 +195,12 @@ module Gitlab
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error, @context.sentry_payload)
end
+ def use_config_variables?
+ strong_memoize(:use_config_variables) do
+ ::Feature.enabled?(:ci_variables_builder_config_variables, @project, default_enabled: :yaml)
+ end
+ end
+
# Overridden in EE
def rescue_errors
RESCUE_ERRORS
diff --git a/lib/gitlab/ci/config/entry/processable.rb b/lib/gitlab/ci/config/entry/processable.rb
index 43475742214..46afedbcc3a 100644
--- a/lib/gitlab/ci/config/entry/processable.rb
+++ b/lib/gitlab/ci/config/entry/processable.rb
@@ -23,7 +23,7 @@ module Gitlab
validates :config, presence: true
validates :name, presence: true
validates :name, type: Symbol
- validates :name, length: { maximum: 255 }, if: -> { ::Feature.enabled?(:ci_validate_job_length, default_enabled: :yaml) }
+ validates :name, length: { maximum: 255 }
validates :config, disallowed_keys: {
in: %i[only except start_in],
diff --git a/lib/gitlab/ci/config/external/context.rb b/lib/gitlab/ci/config/external/context.rb
index 512cfdde474..2def565bc19 100644
--- a/lib/gitlab/ci/config/external/context.rb
+++ b/lib/gitlab/ci/config/external/context.rb
@@ -70,16 +70,20 @@ module Gitlab
}
end
- def mask_variables_from(location)
- variables.reduce(location.dup) do |loc, variable|
+ def mask_variables_from(string)
+ variables.reduce(string.dup) do |str, variable|
if variable[:masked]
- Gitlab::Ci::MaskSecret.mask!(loc, variable[:value])
+ Gitlab::Ci::MaskSecret.mask!(str, variable[:value])
else
- loc
+ str
end
end
end
+ def includes
+ expandset.map(&:metadata)
+ end
+
protected
attr_writer :expandset, :execution_deadline, :logger
diff --git a/lib/gitlab/ci/config/external/file/artifact.rb b/lib/gitlab/ci/config/external/file/artifact.rb
index 4f79e64ca9a..1244c7f7475 100644
--- a/lib/gitlab/ci/config/external/file/artifact.rb
+++ b/lib/gitlab/ci/config/external/file/artifact.rb
@@ -28,6 +28,14 @@ module Gitlab
end
end
+ def metadata
+ super.merge(
+ type: :artifact,
+ location: masked_location,
+ extra: { job_name: masked_job_name }
+ )
+ end
+
private
def project
@@ -52,7 +60,7 @@ module Gitlab
end
unless artifact_job.present?
- errors.push("Job `#{job_name}` not found in parent pipeline or does not have artifacts!")
+ errors.push("Job `#{masked_job_name}` not found in parent pipeline or does not have artifacts!")
return false
end
@@ -80,6 +88,12 @@ module Gitlab
parent_pipeline: context.parent_pipeline
}
end
+
+ def masked_job_name
+ strong_memoize(:masked_job_name) do
+ context.mask_variables_from(job_name)
+ end
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/external/file/base.rb b/lib/gitlab/ci/config/external/file/base.rb
index a660dd339d8..89da0796906 100644
--- a/lib/gitlab/ci/config/external/file/base.rb
+++ b/lib/gitlab/ci/config/external/file/base.rb
@@ -16,8 +16,6 @@ module Gitlab
@params = params
@context = context
@errors = []
-
- validate!
end
def matching?
@@ -48,6 +46,30 @@ module Gitlab
expanded_content_hash
end
+ def validate!
+ context.logger.instrument(:config_file_validation) do
+ validate_execution_time!
+ validate_location!
+ validate_content! if errors.none?
+ validate_hash! if errors.none?
+ end
+ end
+
+ def metadata
+ {
+ context_project: context.project&.full_path,
+ context_sha: context.sha
+ }
+ end
+
+ def eql?(other)
+ other.hash == hash
+ end
+
+ def hash
+ [params, context.project&.full_path, context.sha].hash
+ end
+
protected
def expanded_content_hash
@@ -66,13 +88,6 @@ module Gitlab
nil
end
- def validate!
- validate_execution_time!
- validate_location!
- validate_content! if errors.none?
- validate_hash! if errors.none?
- end
-
def validate_execution_time!
context.check_execution_time!
end
diff --git a/lib/gitlab/ci/config/external/file/local.rb b/lib/gitlab/ci/config/external/file/local.rb
index 3aa665c7d18..ee9cc1552fe 100644
--- a/lib/gitlab/ci/config/external/file/local.rb
+++ b/lib/gitlab/ci/config/external/file/local.rb
@@ -19,6 +19,14 @@ module Gitlab
strong_memoize(:content) { fetch_local_content }
end
+ def metadata
+ super.merge(
+ type: :local,
+ location: masked_location,
+ extra: {}
+ )
+ end
+
private
def validate_content!
diff --git a/lib/gitlab/ci/config/external/file/project.rb b/lib/gitlab/ci/config/external/file/project.rb
index 27e097ba980..3d4436530a8 100644
--- a/lib/gitlab/ci/config/external/file/project.rb
+++ b/lib/gitlab/ci/config/external/file/project.rb
@@ -27,17 +27,25 @@ module Gitlab
strong_memoize(:content) { fetch_local_content }
end
+ def metadata
+ super.merge(
+ type: :file,
+ location: masked_location,
+ extra: { project: masked_project_name, ref: masked_ref_name }
+ )
+ end
+
private
def validate_content!
if !can_access_local_content?
- errors.push("Project `#{project_name}` not found or access denied!")
+ errors.push("Project `#{masked_project_name}` not found or access denied! Make sure any includes in the pipeline configuration are correctly defined.")
elsif sha.nil?
- errors.push("Project `#{project_name}` reference `#{ref_name}` does not exist!")
+ errors.push("Project `#{masked_project_name}` reference `#{masked_ref_name}` does not exist!")
elsif content.nil?
- errors.push("Project `#{project_name}` file `#{masked_location}` does not exist!")
+ errors.push("Project `#{masked_project_name}` file `#{masked_location}` does not exist!")
elsif content.blank?
- errors.push("Project `#{project_name}` file `#{masked_location}` is empty!")
+ errors.push("Project `#{masked_project_name}` file `#{masked_location}` is empty!")
end
end
@@ -76,6 +84,18 @@ module Gitlab
variables: context.variables
}
end
+
+ def masked_project_name
+ strong_memoize(:masked_project_name) do
+ context.mask_variables_from(project_name)
+ end
+ end
+
+ def masked_ref_name
+ strong_memoize(:masked_ref_name) do
+ context.mask_variables_from(ref_name)
+ end
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/external/file/remote.rb b/lib/gitlab/ci/config/external/file/remote.rb
index 8335a9ef625..e7b007b4d8d 100644
--- a/lib/gitlab/ci/config/external/file/remote.rb
+++ b/lib/gitlab/ci/config/external/file/remote.rb
@@ -18,6 +18,14 @@ module Gitlab
strong_memoize(:content) { fetch_remote_content }
end
+ def metadata
+ super.merge(
+ type: :remote,
+ location: masked_location,
+ extra: {}
+ )
+ end
+
private
def validate_location!
diff --git a/lib/gitlab/ci/config/external/file/template.rb b/lib/gitlab/ci/config/external/file/template.rb
index c3d120dfdce..9469f09ce13 100644
--- a/lib/gitlab/ci/config/external/file/template.rb
+++ b/lib/gitlab/ci/config/external/file/template.rb
@@ -20,6 +20,14 @@ module Gitlab
strong_memoize(:content) { fetch_template_content }
end
+ def metadata
+ super.merge(
+ type: :template,
+ location: masked_location,
+ extra: {}
+ )
+ end
+
private
def validate_location!
diff --git a/lib/gitlab/ci/config/external/mapper.rb b/lib/gitlab/ci/config/external/mapper.rb
index 79a04ad409e..c1250c82750 100644
--- a/lib/gitlab/ci/config/external/mapper.rb
+++ b/lib/gitlab/ci/config/external/mapper.rb
@@ -48,8 +48,8 @@ module Gitlab
.flat_map(&method(:expand_project_files))
.flat_map(&method(:expand_wildcard_paths))
.map(&method(:expand_variables))
- .each(&method(:verify_duplicates!))
.map(&method(:select_first_matching))
+ .each(&method(:verify!))
end
def normalize_location(location)
@@ -111,26 +111,6 @@ module Gitlab
end
end
- def verify_duplicates!(location)
- logger.instrument(:config_mapper_verify) do
- verify_max_includes_and_add_location!(location)
- end
- end
-
- def verify_max_includes_and_add_location!(location)
- if expandset.count >= MAX_INCLUDES
- raise TooManyIncludesError, "Maximum of #{MAX_INCLUDES} nested includes are allowed!"
- end
-
- # Scope location to context to allow support of
- # relative includes
- scoped_location = location.merge(
- context_project: context.project,
- context_sha: context.sha)
-
- expandset.add(scoped_location)
- end
-
def select_first_matching(location)
logger.instrument(:config_mapper_select) do
select_first_matching_without_instrumentation(location)
@@ -147,6 +127,18 @@ module Gitlab
matching.first
end
+ def verify!(location_object)
+ verify_max_includes!
+ location_object.validate!
+ expandset.add(location_object)
+ end
+
+ def verify_max_includes!
+ if expandset.count >= MAX_INCLUDES
+ raise TooManyIncludesError, "Maximum of #{MAX_INCLUDES} nested includes are allowed!"
+ end
+ end
+
def expand_variables(data)
logger.instrument(:config_mapper_variables) do
expand_variables_without_instrumentation(data)
diff --git a/lib/gitlab/ci/parsers/security/common.rb b/lib/gitlab/ci/parsers/security/common.rb
index 7baae2f53d7..13a159f3745 100644
--- a/lib/gitlab/ci/parsers/security/common.rb
+++ b/lib/gitlab/ci/parsers/security/common.rb
@@ -14,6 +14,7 @@ module Gitlab
def initialize(json_data, report, vulnerability_finding_signatures_enabled = false, validate: false)
@json_data = json_data
@report = report
+ @project = report.project
@validate = validate
@vulnerability_finding_signatures_enabled = vulnerability_finding_signatures_enabled
end
@@ -43,31 +44,41 @@ module Gitlab
attr_reader :json_data, :report, :validate
def valid?
- if Feature.enabled?(:show_report_validation_warnings, default_enabled: :yaml)
- # We want validation to happen regardless of VALIDATE_SCHEMA CI variable
+ # We want validation to happen regardless of VALIDATE_SCHEMA
+ # CI variable.
+ #
+ # Previously it controlled BOTH validation and enforcement of
+ # schema validation result.
+ #
+ # After 15.0 we will enforce schema validation by default
+ # See: https://gitlab.com/groups/gitlab-org/-/epics/6968
+ schema_validator.deprecation_warnings.each { |deprecation_warning| report.add_warning('Schema', deprecation_warning) }
+
+ if validate
schema_validation_passed = schema_validator.valid?
- if validate
- schema_validator.errors.each { |error| report.add_error('Schema', error) } unless schema_validation_passed
-
- schema_validation_passed
- else
- # We treat all schema validation errors as warnings
- schema_validator.errors.each { |error| report.add_warning('Schema', error) }
+ # Validation warnings are errors
+ schema_validator.errors.each { |error| report.add_error('Schema', error) }
+ schema_validator.warnings.each { |warning| report.add_error('Schema', warning) }
- true
- end
+ schema_validation_passed
else
- return true if !validate || schema_validator.valid?
+ # Validation warnings are warnings
+ schema_validator.errors.each { |error| report.add_warning('Schema', error) }
+ schema_validator.warnings.each { |warning| report.add_warning('Schema', warning) }
- schema_validator.errors.each { |error| report.add_error('Schema', error) }
-
- false
+ true
end
end
def schema_validator
- @schema_validator ||= ::Gitlab::Ci::Parsers::Security::Validators::SchemaValidator.new(report.type, report_data, report.version)
+ @schema_validator ||= ::Gitlab::Ci::Parsers::Security::Validators::SchemaValidator.new(
+ report.type,
+ report_data,
+ report.version,
+ project: @project,
+ scanner: top_level_scanner
+ )
end
def report_data
@@ -137,7 +148,7 @@ module Gitlab
metadata_version: report_version,
details: data['details'] || {},
signatures: signatures,
- project_id: report.project_id,
+ project_id: @project.id,
vulnerability_finding_signatures_enabled: @vulnerability_finding_signatures_enabled))
end
@@ -280,7 +291,7 @@ module Gitlab
report_type: report.type,
primary_identifier_fingerprint: primary_identifier&.fingerprint,
location_fingerprint: location_fingerprint,
- project_id: report.project_id
+ project_id: @project.id
}
if uuid_v5_name_components.values.any?(&:nil?)
diff --git a/lib/gitlab/ci/parsers/security/validators/schema_validator.rb b/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
index 0ab1a128052..cef029bd749 100644
--- a/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
+++ b/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
@@ -8,14 +8,14 @@ module Gitlab
class SchemaValidator
# https://docs.gitlab.com/ee/update/deprecations.html#147
SUPPORTED_VERSIONS = {
- cluster_image_scanning: %w[14.0.4 14.0.5 14.0.6 14.1.0],
- container_scanning: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0],
- coverage_fuzzing: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0],
- dast: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0],
- api_fuzzing: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0],
- dependency_scanning: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0],
- sast: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0],
- secret_detection: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0]
+ cluster_image_scanning: %w[14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
+ container_scanning: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
+ coverage_fuzzing: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
+ dast: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
+ api_fuzzing: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
+ dependency_scanning: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
+ sast: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
+ secret_detection: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1]
}.freeze
# https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/tags
@@ -26,19 +26,19 @@ module Gitlab
8.0.0-rc1 8.0.1-rc1 8.1.0-rc1 9.0.0-rc1].freeze
# These come from https://app.periscopedata.com/app/gitlab/895813/Secure-Scan-metrics?widget=12248944&udv=1385516
- KNOWN_VERSIONS_TO_DEPRECATE = %w[0.1 1.0 1.0.0 1.2 1.3 10.0.0 12.1.0 13.1.0 2.0 2.1 2.1.0 2.3 2.3.0 2.4 3.0 3.0.0 3.0.6 3.13.2 V2.7.0].freeze
+ KNOWN_VERSIONS_TO_REMOVE = %w[0.1 1.0 1.0.0 1.2 1.3 10.0.0 12.1.0 13.1.0 2.0 2.1 2.1.0 2.3 2.3.0 2.4 3.0 3.0.0 3.0.6 3.13.2 V2.7.0].freeze
- VERSIONS_TO_DEPRECATE_IN_15_0 = (PREVIOUS_RELEASES + KNOWN_VERSIONS_TO_DEPRECATE).freeze
+ VERSIONS_TO_REMOVE_IN_15_0 = (PREVIOUS_RELEASES + KNOWN_VERSIONS_TO_REMOVE).freeze
DEPRECATED_VERSIONS = {
- cluster_image_scanning: VERSIONS_TO_DEPRECATE_IN_15_0,
- container_scanning: VERSIONS_TO_DEPRECATE_IN_15_0,
- coverage_fuzzing: VERSIONS_TO_DEPRECATE_IN_15_0,
- dast: VERSIONS_TO_DEPRECATE_IN_15_0,
- api_fuzzing: VERSIONS_TO_DEPRECATE_IN_15_0,
- dependency_scanning: VERSIONS_TO_DEPRECATE_IN_15_0,
- sast: VERSIONS_TO_DEPRECATE_IN_15_0,
- secret_detection: VERSIONS_TO_DEPRECATE_IN_15_0
+ cluster_image_scanning: VERSIONS_TO_REMOVE_IN_15_0,
+ container_scanning: VERSIONS_TO_REMOVE_IN_15_0,
+ coverage_fuzzing: VERSIONS_TO_REMOVE_IN_15_0,
+ dast: VERSIONS_TO_REMOVE_IN_15_0,
+ api_fuzzing: VERSIONS_TO_REMOVE_IN_15_0,
+ dependency_scanning: VERSIONS_TO_REMOVE_IN_15_0,
+ sast: VERSIONS_TO_REMOVE_IN_15_0,
+ secret_detection: VERSIONS_TO_REMOVE_IN_15_0
}.freeze
class Schema
@@ -86,20 +86,110 @@ module Gitlab
end
end
- def initialize(report_type, report_data, report_version = nil)
- @report_type = report_type
+ def initialize(report_type, report_data, report_version = nil, project: nil, scanner: nil)
+ @report_type = report_type&.to_sym
@report_data = report_data
@report_version = report_version
+ @project = project
+ @scanner = scanner
+ @errors = []
+ @warnings = []
+ @deprecation_warnings = []
+
+ populate_errors
+ populate_warnings
+ populate_deprecation_warnings
end
def valid?
errors.empty?
end
- def errors
- @errors ||= schema.validate(report_data).map { |error| JSONSchemer::Errors.pretty(error) }
+ def populate_errors
+ schema_validation_errors = schema.validate(report_data).map { |error| JSONSchemer::Errors.pretty(error) }
+
+ log_warnings(problem_type: 'schema_validation_fails') unless schema_validation_errors.empty?
+
+ if Feature.enabled?(:enforce_security_report_validation, @project)
+ @errors += schema_validation_errors
+ else
+ @warnings += schema_validation_errors
+ end
+ end
+
+ def populate_warnings
+ add_unsupported_report_version_message if !report_uses_supported_schema_version? && !report_uses_deprecated_schema_version?
+ end
+
+ def populate_deprecation_warnings
+ add_deprecated_report_version_message if report_uses_deprecated_schema_version?
+ end
+
+ def add_deprecated_report_version_message
+ log_warnings(problem_type: 'using_deprecated_schema_version')
+
+ message = "Version #{report_version} for report type #{report_type} has been deprecated, supported versions for this report type are: #{supported_schema_versions}"
+ add_message_as(level: :deprecation_warning, message: message)
+ end
+
+ def log_warnings(problem_type:)
+ Gitlab::AppLogger.info(
+ message: 'security report schema validation problem',
+ security_report_type: report_type,
+ security_report_version: report_version,
+ project_id: @project.id,
+ security_report_failure: problem_type,
+ security_report_scanner_id: @scanner&.dig('id'),
+ security_report_scanner_version: @scanner&.dig('version')
+ )
+ end
+
+ def add_unsupported_report_version_message
+ log_warnings(problem_type: 'using_unsupported_schema_version')
+
+ if Feature.enabled?(:enforce_security_report_validation, @project)
+ handle_unsupported_report_version(treat_as: :error)
+ else
+ handle_unsupported_report_version(treat_as: :warning)
+ end
+ end
+
+ def report_uses_deprecated_schema_version?
+ DEPRECATED_VERSIONS[report_type].include?(report_version)
+ end
+
+ def report_uses_supported_schema_version?
+ SUPPORTED_VERSIONS[report_type].include?(report_version)
end
+ def handle_unsupported_report_version(treat_as:)
+ if report_version.nil?
+ message = "Report version not provided, #{report_type} report type supports versions: #{supported_schema_versions}"
+ add_message_as(level: treat_as, message: message)
+ else
+ message = "Version #{report_version} for report type #{report_type} is unsupported, supported versions for this report type are: #{supported_schema_versions}"
+ end
+
+ add_message_as(level: treat_as, message: message)
+ end
+
+ def supported_schema_versions
+ SUPPORTED_VERSIONS[report_type].join(", ")
+ end
+
+ def add_message_as(level:, message:)
+ case level
+ when :deprecation_warning
+ @deprecation_warnings << message
+ when :error
+ @errors << message
+ when :warning
+ @warnings << message
+ end
+ end
+
+ attr_reader :errors, :warnings, :deprecation_warnings
+
private
attr_reader :report_type, :report_data, :report_version
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/cluster-image-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/cluster-image-scanning-report-format.json
new file mode 100644
index 00000000000..7bcb2d5867f
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/cluster-image-scanning-report-format.json
@@ -0,0 +1,977 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Cluster Image Scanning",
+ "description": "This schema provides the the report format for Cluster Image Scanning (https://docs.gitlab.com/ee/user/application_security/cluster_image_scanning/).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.1"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "cluster_image_scanning"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "required": [
+ "dependency",
+ "image",
+ "kubernetes_resource"
+ ],
+ "properties": {
+ "dependency": {
+ "type": "object",
+ "description": "Describes the dependency of a project where the vulnerability is located.",
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the package where the vulnerability is located."
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "Version of the vulnerable package."
+ },
+ "iid": {
+ "description": "ID that identifies the dependency in the scope of a dependency file.",
+ "type": "number"
+ },
+ "direct": {
+ "type": "boolean",
+ "description": "Tells whether this is a direct, top-level dependency of the scanned project."
+ },
+ "dependency_path": {
+ "type": "array",
+ "description": "Ancestors of the dependency, starting from a direct project dependency, and ending with an immediate parent of the dependency. The dependency itself is excluded from the path. Direct dependencies have no path.",
+ "items": {
+ "type": "object",
+ "required": [
+ "iid"
+ ],
+ "properties": {
+ "iid": {
+ "type": "number",
+ "description": "ID that is unique in the scope of a parent object, and specific to the resource type."
+ }
+ }
+ }
+ }
+ }
+ },
+ "operating_system": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The operating system that contains the vulnerable package."
+ },
+ "image": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The analyzed Docker image.",
+ "examples": [
+ "index.docker.io/library/nginx:1.21"
+ ]
+ },
+ "kubernetes_resource": {
+ "type": "object",
+ "description": "The specific Kubernetes resource that was scanned.",
+ "required": [
+ "namespace",
+ "kind",
+ "name",
+ "container_name"
+ ],
+ "properties": {
+ "namespace": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The Kubernetes namespace the resource that had its image scanned.",
+ "examples": [
+ "default",
+ "staging",
+ "production"
+ ]
+ },
+ "kind": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The Kubernetes kind the resource that had its image scanned.",
+ "examples": [
+ "Deployment",
+ "DaemonSet"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The name of the resource that had its image scanned.",
+ "examples": [
+ "nginx-ingress"
+ ]
+ },
+ "container_name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The name of the container that had its image scanned.",
+ "examples": [
+ "nginx"
+ ]
+ },
+ "agent_id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The GitLab ID of the Kubernetes Agent which performed the scan.",
+ "examples": [
+ "1234"
+ ]
+ },
+ "cluster_id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The GitLab ID of the Kubernetes cluster when using cluster integration.",
+ "examples": [
+ "1234"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/container-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/container-scanning-report-format.json
new file mode 100644
index 00000000000..a13e0418499
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/container-scanning-report-format.json
@@ -0,0 +1,911 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Container Scanning",
+ "description": "This schema provides the the report format for Container Scanning (https://docs.gitlab.com/ee/user/application_security/container_scanning).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.1"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "container_scanning"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "required": [
+ "dependency",
+ "operating_system",
+ "image"
+ ],
+ "properties": {
+ "dependency": {
+ "type": "object",
+ "description": "Describes the dependency of a project where the vulnerability is located.",
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the package where the vulnerability is located."
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "Version of the vulnerable package."
+ },
+ "iid": {
+ "description": "ID that identifies the dependency in the scope of a dependency file.",
+ "type": "number"
+ },
+ "direct": {
+ "type": "boolean",
+ "description": "Tells whether this is a direct, top-level dependency of the scanned project."
+ },
+ "dependency_path": {
+ "type": "array",
+ "description": "Ancestors of the dependency, starting from a direct project dependency, and ending with an immediate parent of the dependency. The dependency itself is excluded from the path. Direct dependencies have no path.",
+ "items": {
+ "type": "object",
+ "required": [
+ "iid"
+ ],
+ "properties": {
+ "iid": {
+ "type": "number",
+ "description": "ID that is unique in the scope of a parent object, and specific to the resource type."
+ }
+ }
+ }
+ }
+ }
+ },
+ "operating_system": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The operating system that contains the vulnerable package."
+ },
+ "image": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[^:]+(:\\d+[^:]*)?:[^:]+$",
+ "description": "The analyzed Docker image."
+ },
+ "default_branch_image": {
+ "type": "string",
+ "maxLength": 255,
+ "pattern": "^[a-zA-Z0-9/_.-]+(:\\d+[a-zA-Z0-9/_.-]*)?:[a-zA-Z0-9_.-]+$",
+ "description": "The name of the image on the default branch."
+ }
+ }
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/coverage-fuzzing-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/coverage-fuzzing-report-format.json
new file mode 100644
index 00000000000..050c34669b3
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/coverage-fuzzing-report-format.json
@@ -0,0 +1,874 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Fuzz Testing",
+ "description": "This schema provides the report format for Coverage Guided Fuzz Testing (https://docs.gitlab.com/ee/user/application_security/coverage_fuzzing).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.1"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "coverage_fuzzing"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "description": "The location of the error",
+ "type": "object",
+ "properties": {
+ "crash_address": {
+ "type": "string",
+ "description": "The relative address in memory were the crash occurred.",
+ "examples": [
+ "0xabababab"
+ ]
+ },
+ "stacktrace_snippet": {
+ "type": "string",
+ "description": "The stack trace recorded during fuzzing resulting the crash.",
+ "examples": [
+ "func_a+0xabcd\nfunc_b+0xabcc"
+ ]
+ },
+ "crash_state": {
+ "type": "string",
+ "description": "Minimised and normalized crash stack-trace (called crash_state).",
+ "examples": [
+ "func_a+0xa\nfunc_b+0xb\nfunc_c+0xc"
+ ]
+ },
+ "crash_type": {
+ "type": "string",
+ "description": "Type of the crash.",
+ "examples": [
+ "Heap-Buffer-overflow",
+ "Division-by-zero"
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/dast-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/dast-report-format.json
new file mode 100644
index 00000000000..62ed293ad44
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/dast-report-format.json
@@ -0,0 +1,1291 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab DAST",
+ "description": "This schema provides the the report format for Dynamic Application Security Testing (https://docs.gitlab.com/ee/user/application_security/dast).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.1"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanned_resources",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "dast",
+ "api_fuzzing"
+ ]
+ },
+ "scanned_resources": {
+ "type": "array",
+ "description": "The attack surface scanned by DAST.",
+ "items": {
+ "type": "object",
+ "required": [
+ "method",
+ "url",
+ "type"
+ ],
+ "properties": {
+ "method": {
+ "type": "string",
+ "minLength": 1,
+ "description": "HTTP method of the scanned resource.",
+ "examples": [
+ "GET",
+ "POST",
+ "HEAD"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "URL of the scanned resource.",
+ "examples": [
+ "http://my.site.com/a-page"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Type of the scanned resource, for DAST, this must be 'url'.",
+ "examples": [
+ "url"
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "evidence": {
+ "type": "object",
+ "properties": {
+ "source": {
+ "type": "object",
+ "description": "Source of evidence",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique source identifier",
+ "examples": [
+ "assert:LogAnalysis",
+ "assert:StatusCode"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Source display name",
+ "examples": [
+ "Log Analysis",
+ "Status Code"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "Link to additional information",
+ "examples": [
+ "https://docs.gitlab.com/ee/development/integrations/secure.html"
+ ]
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "description": "Human readable string containing evidence of the vulnerability.",
+ "examples": [
+ "Credit card 4111111111111111 found",
+ "Server leaked information nginx/1.17.6"
+ ]
+ },
+ "request": {
+ "type": "object",
+ "description": "An HTTP request.",
+ "required": [
+ "headers",
+ "method",
+ "url"
+ ],
+ "properties": {
+ "headers": {
+ "type": "array",
+ "description": "HTTP headers present on the request.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Name of the HTTP header.",
+ "examples": [
+ "Accept",
+ "Content-Length",
+ "Content-Type"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Value of the HTTP header.",
+ "examples": [
+ "*/*",
+ "560",
+ "application/json; charset=utf-8"
+ ]
+ }
+ }
+ }
+ },
+ "method": {
+ "type": "string",
+ "minLength": 1,
+ "description": "HTTP method used in the request.",
+ "examples": [
+ "GET",
+ "POST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "URL of the request.",
+ "examples": [
+ "http://my.site.com/vulnerable-endpoint?show-credit-card"
+ ]
+ },
+ "body": {
+ "type": "string",
+ "description": "Body of the request for display purposes. Body must be suitable for display (not binary), and truncated to a reasonable size.",
+ "examples": [
+ "user=jsmith&first=%27&last=smith"
+ ]
+ }
+ }
+ },
+ "response": {
+ "type": "object",
+ "description": "An HTTP response.",
+ "required": [
+ "headers",
+ "reason_phrase",
+ "status_code"
+ ],
+ "properties": {
+ "headers": {
+ "type": "array",
+ "description": "HTTP headers present on the request.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Name of the HTTP header.",
+ "examples": [
+ "Accept",
+ "Content-Length",
+ "Content-Type"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Value of the HTTP header.",
+ "examples": [
+ "*/*",
+ "560",
+ "application/json; charset=utf-8"
+ ]
+ }
+ }
+ }
+ },
+ "reason_phrase": {
+ "type": "string",
+ "description": "HTTP reason phrase of the response.",
+ "examples": [
+ "OK",
+ "Internal Server Error"
+ ]
+ },
+ "status_code": {
+ "type": "integer",
+ "description": "HTTP status code of the response.",
+ "examples": [
+ 200,
+ 500
+ ]
+ },
+ "body": {
+ "type": "string",
+ "description": "Body of the response for display purposes. Body must be suitable for display (not binary), and truncated to a reasonable size.",
+ "examples": [
+ "{\"user_id\": 2}"
+ ]
+ }
+ }
+ },
+ "supporting_messages": {
+ "type": "array",
+ "description": "Array of supporting http messages.",
+ "items": {
+ "type": "object",
+ "description": "A supporting http message.",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Message display name.",
+ "examples": [
+ "Unmodified",
+ "Recorded"
+ ]
+ },
+ "request": {
+ "type": "object",
+ "description": "An HTTP request.",
+ "required": [
+ "headers",
+ "method",
+ "url"
+ ],
+ "properties": {
+ "headers": {
+ "type": "array",
+ "description": "HTTP headers present on the request.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Name of the HTTP header.",
+ "examples": [
+ "Accept",
+ "Content-Length",
+ "Content-Type"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Value of the HTTP header.",
+ "examples": [
+ "*/*",
+ "560",
+ "application/json; charset=utf-8"
+ ]
+ }
+ }
+ }
+ },
+ "method": {
+ "type": "string",
+ "minLength": 1,
+ "description": "HTTP method used in the request.",
+ "examples": [
+ "GET",
+ "POST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "URL of the request.",
+ "examples": [
+ "http://my.site.com/vulnerable-endpoint?show-credit-card"
+ ]
+ },
+ "body": {
+ "type": "string",
+ "description": "Body of the request for display purposes. Body must be suitable for display (not binary), and truncated to a reasonable size.",
+ "examples": [
+ "user=jsmith&first=%27&last=smith"
+ ]
+ }
+ }
+ },
+ "response": {
+ "type": "object",
+ "description": "An HTTP response.",
+ "required": [
+ "headers",
+ "reason_phrase",
+ "status_code"
+ ],
+ "properties": {
+ "headers": {
+ "type": "array",
+ "description": "HTTP headers present on the request.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Name of the HTTP header.",
+ "examples": [
+ "Accept",
+ "Content-Length",
+ "Content-Type"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Value of the HTTP header.",
+ "examples": [
+ "*/*",
+ "560",
+ "application/json; charset=utf-8"
+ ]
+ }
+ }
+ }
+ },
+ "reason_phrase": {
+ "type": "string",
+ "description": "HTTP reason phrase of the response.",
+ "examples": [
+ "OK",
+ "Internal Server Error"
+ ]
+ },
+ "status_code": {
+ "type": "integer",
+ "description": "HTTP status code of the response.",
+ "examples": [
+ 200,
+ 500
+ ]
+ },
+ "body": {
+ "type": "string",
+ "description": "Body of the response for display purposes. Body must be suitable for display (not binary), and truncated to a reasonable size.",
+ "examples": [
+ "{\"user_id\": 2}"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "properties": {
+ "hostname": {
+ "type": "string",
+ "description": "The protocol, domain, and port of the application where the vulnerability was found."
+ },
+ "method": {
+ "type": "string",
+ "description": "The HTTP method that was used to request the URL where the vulnerability was found."
+ },
+ "param": {
+ "type": "string",
+ "description": "A value provided by a vulnerability rule related to the found vulnerability. Examples include a header value, or a parameter used in a HTTP POST."
+ },
+ "path": {
+ "type": "string",
+ "description": "The path of the URL where the vulnerability was found. Typically, this would start with a forward slash."
+ }
+ }
+ },
+ "assets": {
+ "type": "array",
+ "description": "Array of build assets associated with vulnerability.",
+ "items": {
+ "type": "object",
+ "description": "Describes an asset associated with vulnerability.",
+ "required": [
+ "type",
+ "name",
+ "url"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The type of asset",
+ "enum": [
+ "http_session",
+ "postman"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Display name for asset",
+ "examples": [
+ "HTTP Messages",
+ "Postman Collection"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Link to asset in build artifacts",
+ "examples": [
+ "https://gitlab.com/gitlab-org/security-products/dast/-/jobs/626397001/artifacts/file//output/zap_session.data"
+ ]
+ }
+ }
+ }
+ },
+ "discovered_at": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss.sss, representing when the vulnerability was discovered",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}\\.\\d{3}$",
+ "examples": [
+ "2020-01-28T03:26:02.956"
+ ]
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/dependency-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/dependency-scanning-report-format.json
new file mode 100644
index 00000000000..1e3f4188845
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/dependency-scanning-report-format.json
@@ -0,0 +1,968 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Dependency Scanning",
+ "description": "This schema provides the the report format for Dependency Scanning analyzers (https://docs.gitlab.com/ee/user/application_security/dependency_scanning).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.1"
+ },
+ "required": [
+ "dependency_files",
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "dependency_scanning"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "required": [
+ "file",
+ "dependency"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Path to the manifest or lock file where the dependency is declared (such as yarn.lock)."
+ },
+ "dependency": {
+ "type": "object",
+ "description": "Describes the dependency of a project where the vulnerability is located.",
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the package where the vulnerability is located."
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "Version of the vulnerable package."
+ },
+ "iid": {
+ "description": "ID that identifies the dependency in the scope of a dependency file.",
+ "type": "number"
+ },
+ "direct": {
+ "type": "boolean",
+ "description": "Tells whether this is a direct, top-level dependency of the scanned project."
+ },
+ "dependency_path": {
+ "type": "array",
+ "description": "Ancestors of the dependency, starting from a direct project dependency, and ending with an immediate parent of the dependency. The dependency itself is excluded from the path. Direct dependencies have no path.",
+ "items": {
+ "type": "object",
+ "required": [
+ "iid"
+ ],
+ "properties": {
+ "iid": {
+ "type": "number",
+ "description": "ID that is unique in the scope of a parent object, and specific to the resource type."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ },
+ "dependency_files": {
+ "type": "array",
+ "description": "List of dependency files identified in the project.",
+ "items": {
+ "type": "object",
+ "required": [
+ "path",
+ "package_manager",
+ "dependencies"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "minLength": 1
+ },
+ "package_manager": {
+ "type": "string",
+ "minLength": 1
+ },
+ "dependencies": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Describes the dependency of a project where the vulnerability is located.",
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the package where the vulnerability is located."
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "Version of the vulnerable package."
+ },
+ "iid": {
+ "description": "ID that identifies the dependency in the scope of a dependency file.",
+ "type": "number"
+ },
+ "direct": {
+ "type": "boolean",
+ "description": "Tells whether this is a direct, top-level dependency of the scanned project."
+ },
+ "dependency_path": {
+ "type": "array",
+ "description": "Ancestors of the dependency, starting from a direct project dependency, and ending with an immediate parent of the dependency. The dependency itself is excluded from the path. Direct dependencies have no path.",
+ "items": {
+ "type": "object",
+ "required": [
+ "iid"
+ ],
+ "properties": {
+ "iid": {
+ "type": "number",
+ "description": "ID that is unique in the scope of a parent object, and specific to the resource type."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/sast-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/sast-report-format.json
new file mode 100644
index 00000000000..4c57d20dbaa
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/sast-report-format.json
@@ -0,0 +1,869 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab SAST",
+ "description": "This schema provides the report format for Static Application Security Testing analyzers (https://docs.gitlab.com/ee/user/application_security/sast).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.1"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "sast"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the code affected by the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the code affected by the vulnerability."
+ },
+ "class": {
+ "type": "string",
+ "description": "Provides the name of the class where the vulnerability is located."
+ },
+ "method": {
+ "type": "string",
+ "description": "Provides the name of the method where the vulnerability is located."
+ }
+ }
+ },
+ "raw_source_code_extract": {
+ "type": "string",
+ "description": "Provides an unsanitized excerpt of the affected source code."
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/secret-detection-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/secret-detection-report-format.json
new file mode 100644
index 00000000000..b1337954e97
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.1/secret-detection-report-format.json
@@ -0,0 +1,892 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Secret Detection",
+ "description": "This schema provides the the report format for the Secret Detection analyzer (https://docs.gitlab.com/ee/user/application_security/secret_detection)",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.1"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "secret_detection"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "required": [
+ "commit"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located"
+ },
+ "commit": {
+ "type": "object",
+ "description": "Represents the commit in which the vulnerability was detected",
+ "required": [
+ "sha"
+ ],
+ "properties": {
+ "author": {
+ "type": "string"
+ },
+ "date": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "sha": {
+ "type": "string",
+ "minLength": 1
+ }
+ }
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the code affected by the vulnerability"
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the code affected by the vulnerability"
+ },
+ "class": {
+ "type": "string",
+ "description": "Provides the name of the class where the vulnerability is located"
+ },
+ "method": {
+ "type": "string",
+ "description": "Provides the name of the method where the vulnerability is located"
+ }
+ }
+ },
+ "raw_source_code_extract": {
+ "type": "string",
+ "description": "Provides an unsanitized excerpt of the affected source code."
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb b/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb
new file mode 100644
index 00000000000..cb02f09f819
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Limit
+ class RateLimit < Chain::Base
+ include Chain::Helpers
+
+ def perform!
+ return unless throttle_enabled?
+
+ # We exclude child-pipelines from the rate limit because they represent
+ # sub-pipelines that would otherwise hit the rate limit due to having the
+ # same scope (project, user, sha).
+ #
+ return if pipeline.parent_pipeline?
+
+ if rate_limit_throttled?
+ create_log_entry
+ error(throttle_message) unless dry_run?
+ end
+ end
+
+ def break?
+ @pipeline.errors.any?
+ end
+
+ private
+
+ def rate_limit_throttled?
+ ::Gitlab::ApplicationRateLimiter.throttled?(
+ :pipelines_create, scope: [project, current_user, command.sha]
+ )
+ end
+
+ def create_log_entry
+ Gitlab::AppJsonLogger.info(
+ class: self.class.name,
+ namespace_id: project.namespace_id,
+ project_id: project.id,
+ commit_sha: command.sha,
+ current_user_id: current_user.id,
+ subscription_plan: project.actual_plan_name,
+ message: 'Activated pipeline creation rate limit'
+ )
+ end
+
+ def throttle_message
+ 'Too many pipelines created in the last minute. Try again later.'
+ end
+
+ def throttle_enabled?
+ ::Feature.enabled?(
+ :ci_throttle_pipelines_creation,
+ project,
+ default_enabled: :yaml)
+ end
+
+ def dry_run?
+ ::Feature.enabled?(
+ :ci_throttle_pipelines_creation_dry_run,
+ project,
+ default_enabled: :yaml)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/pipeline/chain/template_usage.rb b/lib/gitlab/ci/pipeline/chain/template_usage.rb
index 2fcf1740b5f..f9b3b6cd644 100644
--- a/lib/gitlab/ci/pipeline/chain/template_usage.rb
+++ b/lib/gitlab/ci/pipeline/chain/template_usage.rb
@@ -19,7 +19,7 @@ module Gitlab
def track_event(template)
Gitlab::UsageDataCounters::CiTemplateUniqueCounter
- .track_unique_project_event(project_id: pipeline.project_id, template: template, config_source: pipeline.config_source)
+ .track_unique_project_event(project: pipeline.project, template: template, config_source: pipeline.config_source, user: current_user)
end
def included_templates
diff --git a/lib/gitlab/ci/reports/security/report.rb b/lib/gitlab/ci/reports/security/report.rb
index 8c528056d0c..70f2919d38d 100644
--- a/lib/gitlab/ci/reports/security/report.rb
+++ b/lib/gitlab/ci/reports/security/report.rb
@@ -9,6 +9,7 @@ module Gitlab
attr_accessor :scan, :scanned_resources, :errors, :analyzer, :version, :schema_validation_status, :warnings
delegate :project_id, to: :pipeline
+ delegate :project, to: :pipeline
def initialize(type, pipeline, created_at)
@type = type
@@ -38,6 +39,10 @@ module Gitlab
errors.present?
end
+ def warnings?
+ warnings.present?
+ end
+
def add_scanner(scanner)
scanners[scanner.key] ||= scanner
end
diff --git a/lib/gitlab/ci/reports/security/scanner.rb b/lib/gitlab/ci/reports/security/scanner.rb
index c1de03cea44..1ac66a0c671 100644
--- a/lib/gitlab/ci/reports/security/scanner.rb
+++ b/lib/gitlab/ci/reports/security/scanner.rb
@@ -12,6 +12,7 @@ module Gitlab
"gemnasium-maven" => 3,
"gemnasium-python" => 3,
"bandit" => 1,
+ "spotbugs" => 1,
"semgrep" => 2
}.freeze
diff --git a/lib/gitlab/ci/reports/test_suite.rb b/lib/gitlab/ci/reports/test_suite.rb
index 00920dfbd54..d0388c65f58 100644
--- a/lib/gitlab/ci/reports/test_suite.rb
+++ b/lib/gitlab/ci/reports/test_suite.rb
@@ -12,7 +12,6 @@ module Gitlab
def initialize(name = nil)
@name = name
@test_cases = {}
- @all_test_cases = []
@total_time = 0.0
end
diff --git a/lib/gitlab/ci/runner_releases.rb b/lib/gitlab/ci/runner_releases.rb
new file mode 100644
index 00000000000..944c24ca128
--- /dev/null
+++ b/lib/gitlab/ci/runner_releases.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ class RunnerReleases
+ include Singleton
+
+ RELEASES_VALIDITY_PERIOD = 1.day
+ RELEASES_VALIDITY_AFTER_ERROR_PERIOD = 5.seconds
+
+ INITIAL_BACKOFF = 5.seconds
+ MAX_BACKOFF = 1.hour
+ BACKOFF_GROWTH_FACTOR = 2.0
+
+ def initialize
+ reset!
+ end
+
+ # Returns a sorted list of the publicly available GitLab Runner releases
+ #
+ def releases
+ return @releases unless Time.now.utc >= @expire_time
+
+ @releases = fetch_new_releases
+ end
+
+ def reset!
+ @expire_time = Time.now.utc
+ @releases = nil
+ @backoff_count = 0
+ end
+
+ public_class_method :instance
+
+ private
+
+ def fetch_new_releases
+ response = Gitlab::HTTP.try_get(::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url)
+
+ releases = response.success? ? extract_releases(response) : nil
+ ensure
+ @expire_time = (releases ? RELEASES_VALIDITY_PERIOD : next_backoff).from_now
+ end
+
+ def extract_releases(response)
+ response.parsed_response.map { |release| parse_runner_release(release) }.sort!
+ end
+
+ def parse_runner_release(release)
+ ::Gitlab::VersionInfo.parse(release['name'].delete_prefix('v'))
+ end
+
+ def next_backoff
+ return MAX_BACKOFF if @backoff_count >= 11 # optimization to prevent expensive exponentiation and possible overflows
+
+ backoff = (INITIAL_BACKOFF * (BACKOFF_GROWTH_FACTOR**@backoff_count))
+ .clamp(INITIAL_BACKOFF, MAX_BACKOFF)
+ .seconds
+ @backoff_count += 1
+
+ backoff
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/runner_upgrade_check.rb b/lib/gitlab/ci/runner_upgrade_check.rb
new file mode 100644
index 00000000000..baf041fc358
--- /dev/null
+++ b/lib/gitlab/ci/runner_upgrade_check.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ class RunnerUpgradeCheck
+ include Singleton
+
+ def initialize
+ reset!
+ end
+
+ def check_runner_upgrade_status(runner_version)
+ return :unknown unless runner_version
+
+ releases = RunnerReleases.instance.releases
+ parsed_runner_version = runner_version.is_a?(::Gitlab::VersionInfo) ? runner_version : ::Gitlab::VersionInfo.parse(runner_version)
+
+ raise ArgumentError, "'#{runner_version}' is not a valid version" unless parsed_runner_version.valid?
+
+ available_releases = releases.reject { |release| release > @gitlab_version }
+
+ return :recommended if available_releases.any? { |available_release| patch_update?(available_release, parsed_runner_version) }
+ return :recommended if outside_backport_window?(parsed_runner_version, releases)
+ return :available if available_releases.any? { |available_release| available_release > parsed_runner_version }
+
+ :not_available
+ end
+
+ def reset!
+ @gitlab_version = ::Gitlab::VersionInfo.parse(::Gitlab::VERSION)
+ end
+
+ public_class_method :instance
+
+ private
+
+ def patch_update?(available_release, runner_version)
+ # https://docs.gitlab.com/ee/policy/maintenance.html#patch-releases
+ available_release.major == runner_version.major &&
+ available_release.minor == runner_version.minor &&
+ available_release.patch > runner_version.patch
+ end
+
+ def outside_backport_window?(runner_version, releases)
+ return false if runner_version >= releases.last # return early if runner version is too new
+
+ latest_minor_releases = releases.map { |r| version_without_patch(r) }.uniq { |v| v.to_s }
+ latest_version_position = latest_minor_releases.count - 1
+ runner_version_position = latest_minor_releases.index(version_without_patch(runner_version))
+
+ return true if runner_version_position.nil? # consider outside if version is too old
+
+ # https://docs.gitlab.com/ee/policy/maintenance.html#backporting-to-older-releases
+ latest_version_position - runner_version_position > 2
+ end
+
+ def version_without_patch(version)
+ ::Gitlab::VersionInfo.new(version.major, version.minor, 0)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/status/build/manual.rb b/lib/gitlab/ci/status/build/manual.rb
index df572188194..0074f3675e0 100644
--- a/lib/gitlab/ci/status/build/manual.rb
+++ b/lib/gitlab/ci/status/build/manual.rb
@@ -5,20 +5,36 @@ module Gitlab
module Status
module Build
class Manual < Status::Extended
+ def self.matches?(build, user)
+ build.playable?
+ end
+
def illustration
{
image: 'illustrations/manual_action.svg',
size: 'svg-394',
title: _('This job requires a manual action'),
- content: _('This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes.')
+ content: illustration_content
}
end
- def self.matches?(build, user)
- build.playable?
+ private
+
+ def illustration_content
+ if can?(user, :update_build, subject)
+ _('This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes.')
+ else
+ generic_permission_failure_message
+ end
+ end
+
+ def generic_permission_failure_message
+ _("This job does not run automatically and must be started manually, but you do not have access to it.")
end
end
end
end
end
end
+
+Gitlab::Ci::Status::Build::Manual.prepend_mod_with('Gitlab::Ci::Status::Build::Manual')
diff --git a/lib/gitlab/ci/templates/C++.gitlab-ci.yml b/lib/gitlab/ci/templates/C++.gitlab-ci.yml
index bdcd3240380..c078c99f352 100644
--- a/lib/gitlab/ci/templates/C++.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/C++.gitlab-ci.yml
@@ -4,7 +4,7 @@
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/C++.gitlab-ci.yml
# use the official gcc image, based on debian
-# can use verions as well, like gcc:5.2
+# can use versions as well, like gcc:5.2
# see https://hub.docker.com/_/gcc/
image: gcc
diff --git a/lib/gitlab/ci/templates/Go.gitlab-ci.yml b/lib/gitlab/ci/templates/Go.gitlab-ci.yml
index 19e4ffdbe1e..bd8e1020c4e 100644
--- a/lib/gitlab/ci/templates/Go.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Go.gitlab-ci.yml
@@ -5,21 +5,6 @@
image: golang:latest
-variables:
- # Please edit to your GitLab project
- REPO_NAME: gitlab.com/namespace/project
-
-# The problem is that to be able to use go get, one needs to put
-# the repository in the $GOPATH. So for example if your gitlab domain
-# is gitlab.com, and that your repository is namespace/project, and
-# the default GOPATH being /go, then you'd need to have your
-# repository in /go/src/gitlab.com/namespace/project
-# Thus, making a symbolic link corrects this.
-before_script:
- - mkdir -p "$GOPATH/src/$(dirname $REPO_NAME)"
- - ln -svf "$CI_PROJECT_DIR" "$GOPATH/src/$REPO_NAME"
- - cd "$GOPATH/src/$REPO_NAME"
-
stages:
- test
- build
@@ -35,7 +20,8 @@ format:
compile:
stage: build
script:
- - go build -race -ldflags "-extldflags '-static'" -o $CI_PROJECT_DIR/mybinary
+ - mkdir -p mybinaries
+ - go build -o mybinaries ./...
artifacts:
paths:
- - mybinary
+ - mybinaries
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 cc204207f84..0cc5090f85e 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.22.0'
+ DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.23.0'
.dast-auto-deploy:
image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml
index 1a99db67441..d41182ec9be 100644
--- a/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml
@@ -32,6 +32,16 @@ dependency_scanning:
.ds-analyzer:
extends: dependency_scanning
allow_failure: true
+ variables:
+ # DS_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
+ # override the analyzer image with a custom value. This may be subject to change or
+ # breakage across GitLab releases.
+ DS_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/$DS_ANALYZER_NAME:$DS_MAJOR_VERSION"
+ # DS_ANALYZER_NAME is an undocumented variable used in job definitions
+ # to inject the analyzer name in the image name.
+ DS_ANALYZER_NAME: ""
+ image:
+ name: "$DS_ANALYZER_IMAGE$DS_IMAGE_SUFFIX"
# `rules` must be overridden explicitly by each child job
# see https://gitlab.com/gitlab-org/gitlab/-/issues/218444
script:
@@ -46,13 +56,8 @@ gemnasium-dependency_scanning:
extends:
- .ds-analyzer
- .cyclone-dx-reports
- image:
- name: "$DS_ANALYZER_IMAGE"
variables:
- # DS_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
- DS_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/gemnasium:$DS_MAJOR_VERSION"
+ DS_ANALYZER_NAME: "gemnasium"
GEMNASIUM_LIBRARY_SCAN_ENABLED: "true"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
@@ -77,13 +82,8 @@ gemnasium-maven-dependency_scanning:
extends:
- .ds-analyzer
- .cyclone-dx-reports
- image:
- name: "$DS_ANALYZER_IMAGE"
variables:
- # DS_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
- DS_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/gemnasium-maven:$DS_MAJOR_VERSION"
+ DS_ANALYZER_NAME: "gemnasium-maven"
# Stop reporting Gradle as "maven".
# See https://gitlab.com/gitlab-org/gitlab/-/issues/338252
DS_REPORT_PACKAGE_MANAGER_MAVEN_WHEN_JAVA: "false"
@@ -105,13 +105,8 @@ gemnasium-python-dependency_scanning:
extends:
- .ds-analyzer
- .cyclone-dx-reports
- image:
- name: "$DS_ANALYZER_IMAGE"
variables:
- # DS_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
- DS_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/gemnasium-python:$DS_MAJOR_VERSION"
+ DS_ANALYZER_NAME: "gemnasium-python"
# Stop reporting Pipenv and Setuptools as "pip".
# See https://gitlab.com/gitlab-org/gitlab/-/issues/338252
DS_REPORT_PACKAGE_MANAGER_PIP_WHEN_PYTHON: "false"
@@ -138,13 +133,8 @@ gemnasium-python-dependency_scanning:
bundler-audit-dependency_scanning:
extends: .ds-analyzer
- image:
- name: "$DS_ANALYZER_IMAGE"
variables:
- # DS_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
- DS_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/bundler-audit:$DS_MAJOR_VERSION"
+ DS_ANALYZER_NAME: "bundler-audit"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
when: never
@@ -158,13 +148,8 @@ bundler-audit-dependency_scanning:
retire-js-dependency_scanning:
extends: .ds-analyzer
- image:
- name: "$DS_ANALYZER_IMAGE"
variables:
- # DS_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
- DS_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/retire.js:$DS_MAJOR_VERSION"
+ DS_ANALYZER_NAME: "retire.js"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
when: never
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
index bc4f2099d94..89eb91c981f 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.22.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.23.0'
.auto-deploy:
image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
index ce584091eab..78f28b59aa5 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- AUTO_DEPLOY_IMAGE_VERSION: 'v2.22.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.23.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-IaC.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml
index 5ddfb2a54be..488e7ec72fd 100644
--- a/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml
@@ -1,7 +1,14 @@
+# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/iac_scanning/
+#
+# Configure SAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
+# List of available variables: https://docs.gitlab.com/ee/user/application_security/iac_scanning/index.html
+
variables:
# Setting this variable will affect all Security templates
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
+ SAST_IMAGE_SUFFIX: ""
+
SAST_EXCLUDED_PATHS: "spec, test, tests, tmp"
iac-sast:
@@ -25,7 +32,7 @@ kics-iac-sast:
name: "$SAST_ANALYZER_IMAGE"
variables:
SAST_ANALYZER_IMAGE_TAG: 1
- SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/kics:$SAST_ANALYZER_IMAGE_TAG"
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/kics:$SAST_ANALYZER_IMAGE_TAG$SAST_IMAGE_SUFFIX"
rules:
- if: $SAST_DISABLED
when: never
diff --git a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
index 8cc9ea0200c..7415fa3104c 100644
--- a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
@@ -7,6 +7,7 @@ variables:
# Setting this variable will affect all Security templates
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
+ SAST_IMAGE_SUFFIX: ""
SAST_EXCLUDED_ANALYZERS: ""
SAST_EXCLUDED_PATHS: "spec, test, tests, tmp"
@@ -101,7 +102,11 @@ flawfinder-sast:
- if: $CI_COMMIT_BRANCH
exists:
- '**/*.c'
+ - '**/*.cc'
- '**/*.cpp'
+ - '**/*.c++'
+ - '**/*.cp'
+ - '**/*.cxx'
kubesec-sast:
extends: .sast-analyzer
@@ -246,8 +251,9 @@ semgrep-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
+ SEARCH_MAX_DEPTH: 20
SAST_ANALYZER_IMAGE_TAG: 2
- SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/semgrep:$SAST_ANALYZER_IMAGE_TAG"
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/semgrep:$SAST_ANALYZER_IMAGE_TAG$SAST_IMAGE_SUFFIX"
rules:
- if: $SAST_DISABLED
when: never
@@ -262,6 +268,7 @@ semgrep-sast:
- '**/*.tsx'
- '**/*.c'
- '**/*.go'
+ - '**/*.java'
sobelow-sast:
extends: .sast-analyzer
diff --git a/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml
index 0ef6f63bb94..6aacd082fd7 100644
--- a/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml
@@ -6,12 +6,14 @@
variables:
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
+ SECRET_DETECTION_IMAGE_SUFFIX: ""
+
SECRETS_ANALYZER_VERSION: "3"
SECRET_DETECTION_EXCLUDED_PATHS: ""
.secret-analyzer:
stage: test
- image: "$SECURE_ANALYZERS_PREFIX/secrets:$SECRETS_ANALYZER_VERSION"
+ image: "$SECURE_ANALYZERS_PREFIX/secrets:$SECRETS_ANALYZER_VERSION$SECRET_DETECTION_IMAGE_SUFFIX"
services: []
allow_failure: true
variables:
@@ -31,14 +33,7 @@ secret_detection:
script:
- if [ -n "$CI_COMMIT_TAG" ]; then echo "Skipping Secret Detection for tags. No code changes have occurred."; exit 0; fi
# Historic scan
- - |
- if [ "$SECRET_DETECTION_HISTORIC_SCAN" == "true" ]
- then
- echo "historic scan"
- git fetch --unshallow origin $CI_COMMIT_REF_NAME
- /analyzer run
- exit
- fi
+ - if [ "$SECRET_DETECTION_HISTORIC_SCAN" == "true" ]; then echo "Running Secret Detection Historic Scan"; /analyzer run; exit; fi
# Default branch scan
- if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then echo "Running Secret Detection on default branch."; /analyzer run; exit; fi
# Push event
diff --git a/lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml b/lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml
new file mode 100644
index 00000000000..67c69115948
--- /dev/null
+++ b/lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml
@@ -0,0 +1,96 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml
+
+# Use this template to run MATLAB and Simulink as part of your CI/CD pipeline. The template has three jobs:
+# - `command`: Run MATLAB scripts, functions, and statements.
+# - `test`: Run tests authored using the MATLAB unit testing framework or Simulink Test.
+# - `test_artifacts_job`: Run MATLAB and Simulink tests, and generate test and coverage artifacts.
+#
+# You can copy and paste one or more jobs in this template into your `.gitlab-ci.yml` file.
+# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
+#
+# - To run MATLAB and Simulink, MATLAB must be installed on the runner that will run the jobs.
+# The runner will use the topmost MATLAB version on the system path.
+# The build fails if the operating system cannot find MATLAB on the path.
+# - The jobs in this template use the `matlab -batch` syntax to start MATLAB. The `-batch` option is supported
+# in MATLAB R2019a and later.
+
+# The `command` runs MATLAB scripts, functions, and statements. To use the job in your pipeline,
+# substitute `command` with the code you want to run.
+#
+command:
+ script: matlab -batch command
+
+# If the value of `command` is the name of a MATLAB script or function, do not specify the file extension.
+# For example, to run a script named `myscript.m` in the root of your repository, specify the `command` like this:
+#
+# "myscript"
+#
+# If you specify more than one script, function, or statement, use a comma or semicolon to separate them.
+# For example, to run `myscript.m` in a folder named `myfolder` located in the root of the repository,
+# you can specify the `command` like this:
+#
+# "addpath('myfolder'), myscript"
+#
+# MATLAB exits with exit code 0 if the specified script, function, or statement executes successfully without
+# error. Otherwise, MATLAB terminates with a nonzero exit code, which causes the job to fail. To have the
+# job fail in certain conditions, use the [`assert`][1] or [`error`][2] functions.
+#
+# [1] https://www.mathworks.com/help/matlab/ref/assert.html
+# [2] https://www.mathworks.com/help/matlab/ref/error.html
+
+# The `test` runs the MATLAB and Simulink tests in your project. It calls the [`runtests`][3] function
+# to run the tests and then the [`assertSuccess`][4] method to fail the job if any of the tests fail.
+#
+test:
+ script: matlab -batch "results = runtests('IncludeSubfolders',true), assertSuccess(results);"
+
+# By default, the job includes any files in your [MATLAB Project][5] that have a `Test` label. If your repository
+# does not have a MATLAB project, then the job includes all tests in the root of your repository or in any of
+# its subfolders.
+#
+# [3] https://www.mathworks.com/help/matlab/ref/runtests.html
+# [4] https://www.mathworks.com/help/matlab/ref/matlab.unittest.testresult.assertsuccess.html
+# [5] https://www.mathworks.com/help/matlab/projects.html
+
+# The `test_artifacts_job` runs your tests and additionally generates test and coverage artifacts.
+# It uses the plugin classes in the [`matlab.unittest.plugins`][6] package to generate a JUnit test results
+# report and a Cobertura code coverage report. Like the `run_tests` job, this job runs all the tests in your
+# project and fails the build if any of the tests fail.
+#
+test_artifacts_job:
+ script: |
+ matlab -batch "
+ import matlab.unittest.TestRunner
+ import matlab.unittest.Verbosity
+ import matlab.unittest.plugins.CodeCoveragePlugin
+ import matlab.unittest.plugins.XMLPlugin
+ import matlab.unittest.plugins.codecoverage.CoberturaFormat
+
+ suite = testsuite(pwd,'IncludeSubfolders',true);
+
+ [~,~] = mkdir('artifacts');
+
+ runner = TestRunner.withTextOutput('OutputDetail',Verbosity.Detailed);
+ runner.addPlugin(XMLPlugin.producingJUnitFormat('artifacts/results.xml'))
+ runner.addPlugin(CodeCoveragePlugin.forFolder(pwd,'IncludingSubfolders',true, ...
+ 'Producing',CoberturaFormat('artifacts/cobertura.xml')))
+
+ results = runner.run(suite)
+ assertSuccess(results);"
+
+ artifacts:
+ reports:
+ junit: "./artifacts/results.xml"
+ cobertura: "./artifacts/cobertura.xml"
+ paths:
+ - "./artifacts"
+
+# You can modify the contents of the `test_artifacts_job` depending on your goals. For more
+# information on how to customize the test runner and generate various test and coverage artifacts,
+# see [Generate Artifacts Using MATLAB Unit Test Plugins][7].
+#
+# [6] https://www.mathworks.com/help/matlab/ref/matlab.unittest.plugins-package.html
+# [7] https://www.mathworks.com/help/matlab/matlab_prog/generate-artifacts-using-matlab-unit-test-plugins.html
diff --git a/lib/gitlab/ci/templates/Python.gitlab-ci.yml b/lib/gitlab/ci/templates/Python.gitlab-ci.yml
index 6ed5e05ed4c..191d5b6b11c 100644
--- a/lib/gitlab/ci/templates/Python.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Python.gitlab-ci.yml
@@ -13,7 +13,7 @@ variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
# Pip's cache doesn't store the python packages
-# https://pip.pypa.io/en/stable/reference/pip_install/#caching
+# https://pip.pypa.io/en/stable/topics/caching/
#
# If you want to also cache the installed packages, you have to install
# them in a virtualenv and cache it as well.
diff --git a/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
index bd8ba71effe..b6e811aa84f 100644
--- a/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
@@ -3,19 +3,36 @@
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
+# To use this template, add the following to your .gitlab-ci.yml file:
+#
+# include:
+# template: API-Fuzzing.latest.gitlab-ci.yml
+#
+# You also need to add a `fuzz` stage to your `stages:` configuration. A sample configuration for API Fuzzing:
+#
+# stages:
+# - build
+# - test
+# - deploy
+# - fuzz
+
# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/
#
-# Configure API fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
+# Configure API Fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/#available-cicd-variables
variables:
- FUZZAPI_VERSION: "1"
+ # Setting this variable affects all Security templates
+ # (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
+ #
+ FUZZAPI_VERSION: "1"
+ FUZZAPI_IMAGE_SUFFIX: ""
FUZZAPI_IMAGE: api-fuzzing
apifuzzer_fuzz:
stage: fuzz
- image: $SECURE_ANALYZERS_PREFIX/$FUZZAPI_IMAGE:$FUZZAPI_VERSION
+ image: $SECURE_ANALYZERS_PREFIX/$FUZZAPI_IMAGE:$FUZZAPI_VERSION$FUZZAPI_IMAGE_SUFFIX
allow_failure: true
rules:
- if: $API_FUZZING_DISABLED
@@ -23,6 +40,10 @@ apifuzzer_fuzz:
- if: $API_FUZZING_DISABLED_FOR_DEFAULT_BRANCH &&
$CI_DEFAULT_BRANCH == $CI_COMMIT_REF_NAME
when: never
+ - if: $CI_COMMIT_BRANCH &&
+ $CI_GITLAB_FIPS_MODE == "true"
+ variables:
+ FUZZAPI_IMAGE_SUFFIX: "-fips"
- if: $CI_COMMIT_BRANCH
script:
- /peach/analyzer-fuzz-api
diff --git a/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
index 65a2b20d5c0..66db311f897 100644
--- a/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
@@ -25,7 +25,7 @@ variables:
CS_ANALYZER_IMAGE: registry.gitlab.com/security-products/container-scanning:4
container_scanning:
- image: "$CS_ANALYZER_IMAGE"
+ image: "$CS_ANALYZER_IMAGE$CS_IMAGE_SUFFIX"
stage: test
variables:
# To provide a `vulnerability-allowlist.yml` file, override the GIT_STRATEGY variable in your
@@ -47,4 +47,10 @@ container_scanning:
- if: $CONTAINER_SCANNING_DISABLED
when: never
- if: $CI_COMMIT_BRANCH &&
+ $GITLAB_FEATURES =~ /\bcontainer_scanning\b/ &&
+ $CI_GITLAB_FIPS_MODE == "true" &&
+ $CS_ANALYZER_IMAGE !~ /-(fips|ubi)\z/
+ variables:
+ CS_IMAGE_SUFFIX: -fips
+ - if: $CI_COMMIT_BRANCH &&
$GITLAB_FEATURES =~ /\bcontainer_scanning\b/
diff --git a/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml
index 0e0afa489a3..b491b3e3c0c 100644
--- a/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml
@@ -27,11 +27,12 @@ variables:
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
#
DAST_API_VERSION: "1"
+ DAST_API_IMAGE_SUFFIX: ""
DAST_API_IMAGE: api-fuzzing
dast_api:
stage: dast
- image: $SECURE_ANALYZERS_PREFIX/$DAST_API_IMAGE:$DAST_API_VERSION
+ image: $SECURE_ANALYZERS_PREFIX/$DAST_API_IMAGE:$DAST_API_VERSION$DAST_API_IMAGE_SUFFIX
allow_failure: true
rules:
- if: $DAST_API_DISABLED
@@ -39,6 +40,10 @@ dast_api:
- if: $DAST_API_DISABLED_FOR_DEFAULT_BRANCH &&
$CI_DEFAULT_BRANCH == $CI_COMMIT_REF_NAME
when: never
+ - if: $CI_COMMIT_BRANCH &&
+ $CI_GITLAB_FIPS_MODE == "true"
+ variables:
+ DAST_API_IMAGE_SUFFIX: "-fips"
- if: $CI_COMMIT_BRANCH
script:
- /peach/analyzer-dast-api
@@ -50,3 +55,5 @@ dast_api:
- gl-*.log
reports:
dast: gl-dast-api-report.json
+
+# end
diff --git a/lib/gitlab/ci/templates/ThemeKit.gitlab-ci.yml b/lib/gitlab/ci/templates/ThemeKit.gitlab-ci.yml
new file mode 100644
index 00000000000..8a0913e8f66
--- /dev/null
+++ b/lib/gitlab/ci/templates/ThemeKit.gitlab-ci.yml
@@ -0,0 +1,27 @@
+# Shopify Theme Kit is a CLI tool for Shopify Themes: https://shopify.github.io/themekit/
+# See the full usage of this template described in: https://medium.com/@gogl.alex/how-to-deploy-shopify-themes-automatically-1ac17ee1229c
+
+image: python:2
+
+stages:
+ - deploy:staging
+ - deploy:production
+
+staging:
+ image: python:2
+ stage: deploy:staging
+ script:
+ - curl -s https://shopify.github.io/themekit/scripts/install.py | python
+ - theme deploy --env=staging
+ only:
+ variables:
+ - $CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH
+
+production:
+ image: python:2
+ stage: deploy:production
+ script:
+ - curl -s https://shopify.github.io/themekit/scripts/install.py | python
+ - theme deploy --env=production --allow-live
+ only:
+ - tags
diff --git a/lib/gitlab/ci/templates/liquibase.gitlab-ci.yml b/lib/gitlab/ci/templates/liquibase.gitlab-ci.yml
new file mode 100644
index 00000000000..18d59035b78
--- /dev/null
+++ b/lib/gitlab/ci/templates/liquibase.gitlab-ci.yml
@@ -0,0 +1,149 @@
+# This file is a template, and might need editing before it works on your project.
+# Here is a live project example that is using this template:
+# https://gitlab.com/szandany/h2
+
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/liquibase.gitlab-ci.yml
+
+# This template must be configured with CI/CD variables before it will work.
+# See https://www.liquibase.com/blog/secure-database-developer-flow-using-gitlab-pipelines
+# to learn how to configure the Liquibase template by using variables.
+# Be sure to add the variables before running pipelines with this template.
+# You may not want to run all the jobs in this template. You can comment out or delete the jobs you don't wish to use.
+
+# List of stages for jobs and their order of execution.
+stages:
+ - build
+ - test
+ - deploy
+ - compare
+
+
+# Helper functions to determine if the database is ready for deployments (function isUpToDate) or rollbacks (function isRollback) when tag is applied.
+.functions: &functions |
+ function isUpToDate(){
+ status=$(liquibase status --verbose)
+ if [[ $status == *'is up to date'* ]]; then
+ echo "database is already up to date" & exit 0
+ fi;
+ }
+
+ function isRollback(){
+ if [ -z "$TAG" ]; then
+ echo "No TAG provided, running any pending changes"
+ elif [[ "$(liquibase rollbackSQL $TAG)" ]]; then
+ liquibase --logLevel=info --logFile=${CI_JOB_NAME}_${CI_PIPELINE_ID}.log rollback $TAG && exit 0
+ else exit 0
+ fi;
+ }
+
+
+# This is a series of Liquibase commands that can be run while doing database migrations from Liquibase docs at https://docs.liquibase.com/commands/home.html
+.liquibase_job:
+ image: liquibase/liquibase:latest # Using the Liquibase Docker Image at - https://hub.docker.com/r/liquibase/liquibase
+ before_script:
+ - liquibase --version
+ - *functions
+ - isRollback
+ - isUpToDate
+ - liquibase checks run
+ - liquibase update
+ - liquibase rollbackOneUpdate --force # This is a Pro command. Try Pro free trial here - https://liquibase.org/try-liquibase-pro-free
+ - liquibase tag $CI_PIPELINE_ID
+ - liquibase --logFile=${CI_JOB_NAME}_${CI_PIPELINE_ID}.log --logLevel=info update
+ - liquibase history
+ artifacts:
+ paths:
+ - ${CI_JOB_NAME}_${CI_PIPELINE_ID}.log
+ expire_in: 1 week
+
+
+# This job runs in the build stage, which runs first.
+build-job:
+ extends: .liquibase_job
+ stage: build
+ environment:
+ name: DEV
+ script:
+ - echo "This job tested successfully with liquibase in DEV environment"
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+
+
+# This job runs in the test stage. It only starts when the job in the build stage completes successfully.
+test-job:
+ extends: .liquibase_job
+ stage: test
+ environment:
+ name: TEST
+ script:
+ - echo "This job testsed successfully with liquibase in TEST environment"
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+
+
+# This job runs in the deploy stage. It only starts when the jobs in the test stage completes successfully.
+deploy-prod:
+ extends: .liquibase_job
+ stage: deploy
+ environment:
+ name: PROD
+ script:
+ - echo "This job deployed successfully Liquibase in a production environment from the $CI_COMMIT_BRANCH branch."
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+
+
+# This job compares dev database with test database to detect any drifts in the pipeline. Learn more about comparing database with Liquibase here https://docs.liquibase.com/commands/diff.html
+DEV->TEST:
+ image: liquibase/liquibase:latest # Using the Liquibase Docker Image
+ stage: compare
+ environment:
+ name: TEST
+ script:
+ - echo "Comparing databases DEV --> TEST"
+ - liquibase diff
+ - liquibase --outputFile=diff_between_DEV_TEST.json diff --format=json
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+ artifacts:
+ paths:
+ - diff_between_DEV_TEST.json
+ expire_in: 1 week
+
+
+# This job compares test database with prod database to detect any drifts in the pipeline.
+TEST->PROD:
+ image: liquibase/liquibase:latest # Using the Liquibase Docker Image
+ stage: compare
+ environment:
+ name: PROD
+ script:
+ - echo "Comparing databases TEST --> PROD"
+ - liquibase diff
+ - liquibase --outputFile=diff_between_TEST_PROD.json diff --format=json
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+ artifacts:
+ paths:
+ - diff_between_TEST_PROD.json
+ expire_in: 1 week
+
+
+# This job creates a snapshot of prod database. You can use the snapshot file to run comparisons with the production database to investigate for any potential issues. https://www.liquibase.com/devsecops
+snapshot PROD:
+ image: liquibase/liquibase:latest # Using the Liquibase Docker Image
+ stage: .post
+ environment:
+ name: PROD
+ script:
+ - echo "Snapshotting database PROD"
+ - liquibase --outputFile=snapshot_PROD_${CI_PIPELINE_ID}.json snapshot --snapshotFormat=json --log-level debug
+ rules:
+ - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+ artifacts:
+ paths:
+ - snapshot_PROD_${CI_PIPELINE_ID}.json
+ expire_in: 1 week
diff --git a/lib/gitlab/ci/variables/builder.rb b/lib/gitlab/ci/variables/builder.rb
index bfcf67693e7..bcb1fe83ea2 100644
--- a/lib/gitlab/ci/variables/builder.rb
+++ b/lib/gitlab/ci/variables/builder.rb
@@ -10,7 +10,7 @@ module Gitlab
@pipeline = pipeline
@instance_variables_builder = Builder::Instance.new
@project_variables_builder = Builder::Project.new(project)
- @group_variables_builder = Builder::Group.new(project.group)
+ @group_variables_builder = Builder::Group.new(project&.group)
end
def scoped_variables(job, environment:, dependencies:)
@@ -24,11 +24,25 @@ module Gitlab
variables.concat(user_variables(job.user))
variables.concat(job.dependency_variables) if dependencies
variables.concat(secret_instance_variables)
- variables.concat(secret_group_variables(environment: environment, ref: job.git_ref))
- variables.concat(secret_project_variables(environment: environment, ref: job.git_ref))
+ variables.concat(secret_group_variables(environment: environment))
+ variables.concat(secret_project_variables(environment: environment))
variables.concat(job.trigger_request.user_variables) if job.trigger_request
variables.concat(pipeline.variables)
- variables.concat(pipeline.pipeline_schedule.job_variables) if pipeline.pipeline_schedule
+ variables.concat(pipeline_schedule_variables)
+ end
+ end
+
+ def config_variables
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ break variables unless project
+
+ variables.concat(project.predefined_variables)
+ variables.concat(pipeline.predefined_variables)
+ variables.concat(secret_instance_variables)
+ variables.concat(secret_group_variables(environment: nil))
+ variables.concat(secret_project_variables(environment: nil))
+ variables.concat(pipeline.variables)
+ variables.concat(pipeline_schedule_variables)
end
end
@@ -75,21 +89,21 @@ module Gitlab
end
end
- def secret_group_variables(environment:, ref:)
- if memoize_secret_variables?
- memoized_secret_group_variables(environment: environment)
- else
- return [] unless project.group
-
- project.group.ci_variables_for(ref, project, environment: environment)
+ def secret_group_variables(environment:)
+ strong_memoize_with(:secret_group_variables, environment) do
+ group_variables_builder
+ .secret_variables(
+ environment: environment,
+ protected_ref: protected_ref?)
end
end
- def secret_project_variables(environment:, ref:)
- if memoize_secret_variables?
- memoized_secret_project_variables(environment: environment)
- else
- project.ci_variables_for(ref: ref, environment: environment)
+ def secret_project_variables(environment:)
+ strong_memoize_with(:secret_project_variables, environment) do
+ project_variables_builder
+ .secret_variables(
+ environment: environment,
+ protected_ref: protected_ref?)
end
end
@@ -120,21 +134,15 @@ module Gitlab
end
end
- def memoized_secret_project_variables(environment:)
- strong_memoize_with(:secret_project_variables, environment) do
- project_variables_builder
- .secret_variables(
- environment: environment,
- protected_ref: protected_ref?)
- end
- end
+ def pipeline_schedule_variables
+ strong_memoize(:pipeline_schedule_variables) do
+ variables = if pipeline.pipeline_schedule
+ pipeline.pipeline_schedule.job_variables
+ else
+ []
+ end
- def memoized_secret_group_variables(environment:)
- strong_memoize_with(:secret_group_variables, environment) do
- group_variables_builder
- .secret_variables(
- environment: environment,
- protected_ref: protected_ref?)
+ Gitlab::Ci::Variables::Collection.new(variables)
end
end
@@ -150,14 +158,6 @@ module Gitlab
end
end
- def memoize_secret_variables?
- strong_memoize(:memoize_secret_variables) do
- ::Feature.enabled?(:ci_variables_builder_memoize_secret_variables,
- project,
- default_enabled: :yaml)
- end
- end
-
def strong_memoize_with(name, *args)
container = strong_memoize(name) { {} }
diff --git a/lib/gitlab/content_security_policy/config_loader.rb b/lib/gitlab/content_security_policy/config_loader.rb
index 0d4b913b7a0..22a4ba8ac7a 100644
--- a/lib/gitlab/content_security_policy/config_loader.rb
+++ b/lib/gitlab/content_security_policy/config_loader.rb
@@ -22,7 +22,7 @@ module Gitlab
'frame_src' => ContentSecurityPolicy::Directives.frame_src,
'img_src' => "'self' data: blob: http: https:",
'manifest_src' => "'self'",
- 'media_src' => "'self'",
+ 'media_src' => "'self' data:",
'script_src' => ContentSecurityPolicy::Directives.script_src,
'style_src' => "'self' 'unsafe-inline'",
'worker_src' => "#{Gitlab::Utils.append_path(Gitlab.config.gitlab.url, 'assets/')} blob: data:",
@@ -37,13 +37,13 @@ module Gitlab
allow_webpack_dev_server(directives)
allow_letter_opener(directives)
allow_snowplow_micro(directives) if Gitlab::Tracking.snowplow_micro_enabled?
- allow_customersdot(directives) if ENV['CUSTOMER_PORTAL_URL'].present?
end
allow_websocket_connections(directives)
allow_cdn(directives, Settings.gitlab.cdn_host) if Settings.gitlab.cdn_host.present?
allow_sentry(directives) if Gitlab.config.sentry&.enabled && Gitlab.config.sentry&.clientside_dsn
allow_framed_gitlab_paths(directives)
+ allow_customersdot(directives) if ENV['CUSTOMER_PORTAL_URL'].present?
# The follow section contains workarounds to patch Safari's lack of support for CSP Level 3
# See https://gitlab.com/gitlab-org/gitlab/-/issues/343579
diff --git a/lib/gitlab/data_builder/deployment.rb b/lib/gitlab/data_builder/deployment.rb
index a4508bc93c5..0e6841e10a7 100644
--- a/lib/gitlab/data_builder/deployment.rb
+++ b/lib/gitlab/data_builder/deployment.rb
@@ -12,6 +12,16 @@ module Gitlab
Gitlab::UrlBuilder.build(deployment.deployable)
end
+ commit_url =
+ if (commit = deployment.commit)
+ Gitlab::UrlBuilder.build(commit)
+ end
+
+ user_url =
+ if deployment.deployed_by
+ Gitlab::UrlBuilder.build(deployment.deployed_by)
+ end
+
{
object_kind: 'deployment',
status: deployment.status,
@@ -22,10 +32,10 @@ module Gitlab
environment: deployment.environment.name,
project: deployment.project.hook_attrs,
short_sha: deployment.short_sha,
- user: deployment.deployed_by.hook_attrs,
- user_url: Gitlab::UrlBuilder.build(deployment.deployed_by),
- commit_url: Gitlab::UrlBuilder.build(deployment.commit),
- commit_title: deployment.commit.title,
+ user: deployment.deployed_by&.hook_attrs,
+ user_url: user_url,
+ commit_url: commit_url,
+ commit_title: deployment.commit_title,
ref: deployment.ref
}
end
diff --git a/lib/gitlab/data_builder/note.rb b/lib/gitlab/data_builder/note.rb
index 73518d36d43..dec583f5a42 100644
--- a/lib/gitlab/data_builder/note.rb
+++ b/lib/gitlab/data_builder/note.rb
@@ -43,10 +43,9 @@ module Gitlab
if note.for_commit?
data[:commit] = build_data_for_commit(project, user, note)
elsif note.for_issue?
- data[:issue] = note.noteable.hook_attrs
- data[:issue][:labels] = note.noteable.labels_hook_attrs
+ data[:issue] = Gitlab::HookData::IssueBuilder.new(note.noteable).build
elsif note.for_merge_request?
- data[:merge_request] = note.noteable.hook_attrs
+ data[:merge_request] = Gitlab::HookData::MergeRequestBuilder.new(note.noteable).build
elsif note.for_snippet?
data[:snippet] = note.noteable.hook_attrs
end
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb
index 1b16873f737..1895f0fab32 100644
--- a/lib/gitlab/database.rb
+++ b/lib/gitlab/database.rb
@@ -161,24 +161,6 @@ module Gitlab
end
end
- def self.nulls_order(field, direction = :asc, nulls_order = :nulls_last)
- raise ArgumentError unless [:nulls_last, :nulls_first].include?(nulls_order)
- raise ArgumentError unless [:asc, :desc].include?(direction)
-
- case nulls_order
- when :nulls_last then nulls_last_order(field, direction)
- when :nulls_first then nulls_first_order(field, direction)
- end
- end
-
- def self.nulls_last_order(field, direction = 'ASC')
- Arel.sql("#{field} #{direction} NULLS LAST")
- end
-
- def self.nulls_first_order(field, direction = 'ASC')
- Arel.sql("#{field} #{direction} NULLS FIRST")
- end
-
def self.random
"RANDOM()"
end
@@ -228,7 +210,7 @@ module Gitlab
end
def self.db_config_names
- ::ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).map(&:name)
+ ::ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).map(&:name) - ['geo']
end
# This returns all matching schemas that a given connection can use
@@ -236,13 +218,16 @@ module Gitlab
# This does not look at literal connection names, but rather compares
# models that are holders for a given db_config_name
def self.gitlab_schemas_for_connection(connection)
- connection_name = self.db_config_name(connection)
- primary_model = self.database_base_models.fetch(connection_name)
-
- self.schemas_to_base_models
- .select { |_, models| models.include?(primary_model) }
- .keys
- .map!(&:to_sym)
+ db_name = self.db_config_name(connection)
+ primary_model = self.database_base_models.fetch(db_name.to_sym)
+
+ self.schemas_to_base_models.select do |_, child_models|
+ child_models.any? do |child_model|
+ child_model == primary_model || \
+ # The model might indicate a child connection, ensure that this is enclosed in a `db_config`
+ self.database_base_models[self.db_config_share_with(child_model.connection_db_config)] == primary_model
+ end
+ end.keys.map!(&:to_sym)
end
def self.db_config_for_connection(connection)
@@ -271,6 +256,17 @@ module Gitlab
db_config&.name || 'unknown'
end
+ # Currently the database configuration can only be shared with `main:`
+ # If the `database_tasks: false` is being used
+ # This is to be refined: https://gitlab.com/gitlab-org/gitlab/-/issues/356580
+ def self.db_config_share_with(db_config)
+ if db_config.database_tasks?
+ nil # no sharing
+ else
+ 'main' # share with `main:`
+ end
+ end
+
def self.read_only?
false
end
diff --git a/lib/gitlab/database/background_migration/batch_metrics.rb b/lib/gitlab/database/background_migration/batch_metrics.rb
index 3e6d7ac3c9f..14fe0c14c24 100644
--- a/lib/gitlab/database/background_migration/batch_metrics.rb
+++ b/lib/gitlab/database/background_migration/batch_metrics.rb
@@ -5,17 +5,24 @@ module Gitlab
module BackgroundMigration
class BatchMetrics
attr_reader :timings
+ attr_reader :affected_rows
def initialize
@timings = {}
+ @affected_rows = {}
end
- def time_operation(label)
+ def time_operation(label, &blk)
+ instrument_operation(label, instrument_affected_rows: false, &blk)
+ end
+
+ def instrument_operation(label, instrument_affected_rows: true)
start_time = monotonic_time
- yield
+ count = yield
timings_for_label(label) << monotonic_time - start_time
+ affected_rows_for_label(label) << count if instrument_affected_rows && count.is_a?(Integer)
end
private
@@ -24,6 +31,10 @@ module Gitlab
timings[label] ||= []
end
+ def affected_rows_for_label(label)
+ affected_rows[label] ||= []
+ end
+
def monotonic_time
Gitlab::Metrics::System.monotonic_time
end
diff --git a/lib/gitlab/database/background_migration/batched_job.rb b/lib/gitlab/database/background_migration/batched_job.rb
index f3160679d64..ebc3ee240bd 100644
--- a/lib/gitlab/database/background_migration/batched_job.rb
+++ b/lib/gitlab/database/background_migration/batched_job.rb
@@ -25,6 +25,7 @@ module Gitlab
scope :except_succeeded, -> { without_status(:succeeded) }
scope :successful_in_execution_order, -> { where.not(finished_at: nil).with_status(:succeeded).order(:finished_at) }
scope :with_preloads, -> { preload(:batched_migration) }
+ scope :created_since, ->(date_time) { where('created_at >= ?', date_time) }
state_machine :status, initial: :pending do
state :pending, value: 0
@@ -62,7 +63,13 @@ module Gitlab
job.split_and_retry! if job.can_split?(exception)
rescue SplitAndRetryError => error
- Gitlab::AppLogger.error(message: error.message, batched_job_id: job.id)
+ Gitlab::AppLogger.error(
+ message: error.message,
+ batched_job_id: job.id,
+ batched_migration_id: job.batched_migration.id,
+ job_class_name: job.migration_job_class_name,
+ job_arguments: job.migration_job_arguments
+ )
end
after_transition do |job, transition|
@@ -72,13 +79,23 @@ module Gitlab
job.batched_job_transition_logs.create(previous_status: transition.from, next_status: transition.to, exception_class: exception&.class, exception_message: exception&.message)
- Gitlab::ErrorTracking.track_exception(exception, batched_job_id: job.id) if exception
-
- Gitlab::AppLogger.info(message: 'BatchedJob transition', batched_job_id: job.id, previous_state: transition.from_name, new_state: transition.to_name)
+ Gitlab::ErrorTracking.track_exception(exception, batched_job_id: job.id, job_class_name: job.migration_job_class_name, job_arguments: job.migration_job_arguments) if exception
+
+ Gitlab::AppLogger.info(
+ message: 'BatchedJob transition',
+ batched_job_id: job.id,
+ previous_state: transition.from_name,
+ new_state: transition.to_name,
+ batched_migration_id: job.batched_migration.id,
+ job_class_name: job.migration_job_class_name,
+ job_arguments: job.migration_job_arguments,
+ exception_class: exception&.class,
+ exception_message: exception&.message
+ )
end
end
- delegate :job_class, :table_name, :column_name, :job_arguments,
+ delegate :job_class, :table_name, :column_name, :job_arguments, :job_class_name,
to: :batched_migration, prefix: :migration
attribute :pause_ms, :integer, default: 100
diff --git a/lib/gitlab/database/background_migration/batched_migration.rb b/lib/gitlab/database/background_migration/batched_migration.rb
index 65c15795de6..d94bf060d05 100644
--- a/lib/gitlab/database/background_migration/batched_migration.rb
+++ b/lib/gitlab/database/background_migration/batched_migration.rb
@@ -6,6 +6,8 @@ module Gitlab
class BatchedMigration < SharedModel
JOB_CLASS_MODULE = 'Gitlab::BackgroundMigration'
BATCH_CLASS_MODULE = "#{JOB_CLASS_MODULE}::BatchingStrategies"
+ MAXIMUM_FAILED_RATIO = 0.5
+ MINIMUM_JOBS = 50
self.table_name = :batched_background_migrations
@@ -21,28 +23,60 @@ module Gitlab
validate :validate_batched_jobs_status, if: -> { status_changed? && finished? }
scope :queue_order, -> { order(id: :asc) }
- scope :queued, -> { where(status: [:active, :paused]) }
+ scope :queued, -> { with_statuses(:active, :paused) }
+
+ # on_hold_until is a temporary runtime status which puts execution "on hold"
+ scope :executable, -> { with_status(:active).where('on_hold_until IS NULL OR on_hold_until < NOW()') }
+
scope :for_configuration, ->(job_class_name, table_name, column_name, job_arguments) do
where(job_class_name: job_class_name, table_name: table_name, column_name: column_name)
.where("job_arguments = ?", job_arguments.to_json) # rubocop:disable Rails/WhereEquals
end
- enum status: {
- paused: 0,
- active: 1,
- finished: 3,
- failed: 4,
- finalizing: 5
- }
+ state_machine :status, initial: :paused do
+ state :paused, value: 0
+ state :active, value: 1
+ state :finished, value: 3
+ state :failed, value: 4
+ state :finalizing, value: 5
+
+ event :pause do
+ transition any => :paused
+ end
+
+ event :execute do
+ transition any => :active
+ end
+
+ event :finish do
+ transition any => :finished
+ end
+
+ event :failure do
+ transition any => :failed
+ end
+
+ event :finalize do
+ transition any => :finalizing
+ end
+
+ before_transition any => :active do |migration|
+ migration.started_at = Time.current if migration.respond_to?(:started_at)
+ end
+ end
attribute :pause_ms, :integer, default: 100
+ def self.valid_status
+ state_machine.states.map(&:name)
+ end
+
def self.find_for_configuration(job_class_name, table_name, column_name, job_arguments)
for_configuration(job_class_name, table_name, column_name, job_arguments).first
end
def self.active_migration
- active.queue_order.first
+ executable.queue_order.first
end
def self.successful_rows_counts(migrations)
@@ -74,11 +108,23 @@ module Gitlab
batched_jobs.with_status(:failed).each_batch(of: 100) do |batch|
self.class.transaction do
batch.lock.each(&:split_and_retry!)
- self.active!
+ self.execute!
end
end
- self.active!
+ self.execute!
+ end
+
+ def should_stop?
+ return unless started_at
+
+ total_jobs = batched_jobs.created_since(started_at).count
+
+ return if total_jobs < MINIMUM_JOBS
+
+ failed_jobs = batched_jobs.with_status(:failed).created_since(started_at).count
+
+ failed_jobs.fdiv(total_jobs) > MAXIMUM_FAILED_RATIO
end
def next_min_value
@@ -136,6 +182,10 @@ module Gitlab
BatchOptimizer.new(self).optimize!
end
+ def hold!(until_time: 10.minutes.from_now)
+ update!(on_hold_until: until_time)
+ end
+
private
def validate_batched_jobs_status
diff --git a/lib/gitlab/database/background_migration/batched_migration_runner.rb b/lib/gitlab/database/background_migration/batched_migration_runner.rb
index 06cd40f1e06..59ff9a9744f 100644
--- a/lib/gitlab/database/background_migration/batched_migration_runner.rb
+++ b/lib/gitlab/database/background_migration/batched_migration_runner.rb
@@ -6,13 +6,13 @@ module Gitlab
class BatchedMigrationRunner
FailedToFinalize = Class.new(RuntimeError)
- def self.finalize(job_class_name, table_name, column_name, job_arguments, connection: ApplicationRecord.connection)
+ def self.finalize(job_class_name, table_name, column_name, job_arguments, connection:)
new(connection: connection).finalize(job_class_name, table_name, column_name, job_arguments)
end
- def initialize(migration_wrapper = BatchedMigrationWrapper.new, connection: ApplicationRecord.connection)
- @migration_wrapper = migration_wrapper
+ def initialize(connection:, migration_wrapper: BatchedMigrationWrapper.new(connection: connection))
@connection = connection
+ @migration_wrapper = migration_wrapper
end
# Runs the next batched_job for a batched_background_migration.
@@ -30,6 +30,7 @@ module Gitlab
migration_wrapper.perform(next_batched_job)
active_migration.optimize!
+ active_migration.failure! if next_batched_job.failed? && active_migration.should_stop?
else
finish_active_migration(active_migration)
end
@@ -67,7 +68,7 @@ module Gitlab
elsif migration.finished?
Gitlab::AppLogger.warn "Batched background migration for the given configuration is already finished: #{configuration}"
else
- migration.finalizing!
+ migration.finalize!
migration.batched_jobs.with_status(:pending).each { |job| migration_wrapper.perform(job) }
run_migration_while(migration, :finalizing)
@@ -78,7 +79,7 @@ module Gitlab
private
- attr_reader :migration_wrapper, :connection
+ attr_reader :connection, :migration_wrapper
def find_or_create_next_batched_job(active_migration)
if next_batch_range = find_next_batch_range(active_migration)
@@ -118,14 +119,14 @@ module Gitlab
return if active_migration.batched_jobs.active.exists?
if active_migration.batched_jobs.with_status(:failed).exists?
- active_migration.failed!
+ active_migration.failure!
else
- active_migration.finished!
+ active_migration.finish!
end
end
def run_migration_while(migration, status)
- while migration.status == status.to_s
+ while migration.status_name == status
run_migration_job(migration)
migration.reload_last_job
diff --git a/lib/gitlab/database/background_migration/batched_migration_wrapper.rb b/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
index 057f856d859..ec68f401ca2 100644
--- a/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
+++ b/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
@@ -4,10 +4,9 @@ module Gitlab
module Database
module BackgroundMigration
class BatchedMigrationWrapper
- extend Gitlab::Utils::StrongMemoize
-
- def initialize(connection: ApplicationRecord.connection)
+ def initialize(connection:, metrics: PrometheusMetrics.new)
@connection = connection
+ @metrics = metrics
end
# Wraps the execution of a batched_background_migration.
@@ -28,12 +27,12 @@ module Gitlab
raise
ensure
- track_prometheus_metrics(batch_tracking_record)
+ metrics.track(batch_tracking_record)
end
private
- attr_reader :connection
+ attr_reader :connection, :metrics
def start_tracking_execution(tracking_record)
tracking_record.run!
@@ -63,80 +62,6 @@ module Gitlab
job_class.new
end
end
-
- def track_prometheus_metrics(tracking_record)
- migration = tracking_record.batched_migration
- base_labels = migration.prometheus_labels
-
- metric_for(:gauge_batch_size).set(base_labels, tracking_record.batch_size)
- metric_for(:gauge_sub_batch_size).set(base_labels, tracking_record.sub_batch_size)
- metric_for(:gauge_interval).set(base_labels, tracking_record.batched_migration.interval)
- metric_for(:gauge_job_duration).set(base_labels, (tracking_record.finished_at - tracking_record.started_at).to_i)
- metric_for(:counter_updated_tuples).increment(base_labels, tracking_record.batch_size)
- metric_for(:gauge_migrated_tuples).set(base_labels, tracking_record.batched_migration.migrated_tuple_count)
- metric_for(:gauge_total_tuple_count).set(base_labels, tracking_record.batched_migration.total_tuple_count)
- metric_for(:gauge_last_update_time).set(base_labels, Time.current.to_i)
-
- if metrics = tracking_record.metrics
- metrics['timings']&.each do |key, timings|
- summary = metric_for(:histogram_timings)
- labels = base_labels.merge(operation: key)
-
- timings.each do |timing|
- summary.observe(labels, timing)
- end
- end
- end
- end
-
- def metric_for(name)
- self.class.metrics[name]
- end
-
- def self.metrics
- strong_memoize(:metrics) do
- {
- gauge_batch_size: Gitlab::Metrics.gauge(
- :batched_migration_job_batch_size,
- 'Batch size for a batched migration job'
- ),
- gauge_sub_batch_size: Gitlab::Metrics.gauge(
- :batched_migration_job_sub_batch_size,
- 'Sub-batch size for a batched migration job'
- ),
- gauge_interval: Gitlab::Metrics.gauge(
- :batched_migration_job_interval_seconds,
- 'Interval for a batched migration job'
- ),
- gauge_job_duration: Gitlab::Metrics.gauge(
- :batched_migration_job_duration_seconds,
- 'Duration for a batched migration job'
- ),
- counter_updated_tuples: Gitlab::Metrics.counter(
- :batched_migration_job_updated_tuples_total,
- 'Number of tuples updated by batched migration job'
- ),
- gauge_migrated_tuples: Gitlab::Metrics.gauge(
- :batched_migration_migrated_tuples_total,
- 'Total number of tuples migrated by a batched migration'
- ),
- histogram_timings: Gitlab::Metrics.histogram(
- :batched_migration_job_query_duration_seconds,
- 'Query timings for a batched migration job',
- {},
- [0.1, 0.25, 0.5, 1, 5].freeze
- ),
- gauge_total_tuple_count: Gitlab::Metrics.gauge(
- :batched_migration_total_tuple_count,
- 'Total tuple count the migration needs to touch'
- ),
- gauge_last_update_time: Gitlab::Metrics.gauge(
- :batched_migration_last_update_time_seconds,
- 'Unix epoch time in seconds'
- )
- }
- end
- end
end
end
end
diff --git a/lib/gitlab/database/background_migration/prometheus_metrics.rb b/lib/gitlab/database/background_migration/prometheus_metrics.rb
new file mode 100644
index 00000000000..ce1da4c59eb
--- /dev/null
+++ b/lib/gitlab/database/background_migration/prometheus_metrics.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module BackgroundMigration
+ class PrometheusMetrics
+ extend Gitlab::Utils::StrongMemoize
+
+ QUERY_TIMING_BUCKETS = [0.1, 0.25, 0.5, 1, 5].freeze
+
+ def track(job_record)
+ migration_record = job_record.batched_migration
+ base_labels = migration_record.prometheus_labels
+
+ metric_for(:gauge_batch_size).set(base_labels, job_record.batch_size)
+ metric_for(:gauge_sub_batch_size).set(base_labels, job_record.sub_batch_size)
+ metric_for(:gauge_interval).set(base_labels, job_record.batched_migration.interval)
+ metric_for(:gauge_job_duration).set(base_labels, (job_record.finished_at - job_record.started_at).to_i)
+ metric_for(:counter_updated_tuples).increment(base_labels, job_record.batch_size)
+ metric_for(:gauge_migrated_tuples).set(base_labels, migration_record.migrated_tuple_count)
+ metric_for(:gauge_total_tuple_count).set(base_labels, migration_record.total_tuple_count)
+ metric_for(:gauge_last_update_time).set(base_labels, Time.current.to_i)
+
+ track_timing_metrics(base_labels, job_record.metrics)
+ end
+
+ def self.metrics
+ strong_memoize(:metrics) do
+ {
+ gauge_batch_size: Gitlab::Metrics.gauge(
+ :batched_migration_job_batch_size,
+ 'Batch size for a batched migration job'
+ ),
+ gauge_sub_batch_size: Gitlab::Metrics.gauge(
+ :batched_migration_job_sub_batch_size,
+ 'Sub-batch size for a batched migration job'
+ ),
+ gauge_interval: Gitlab::Metrics.gauge(
+ :batched_migration_job_interval_seconds,
+ 'Interval for a batched migration job'
+ ),
+ gauge_job_duration: Gitlab::Metrics.gauge(
+ :batched_migration_job_duration_seconds,
+ 'Duration for a batched migration job'
+ ),
+ counter_updated_tuples: Gitlab::Metrics.counter(
+ :batched_migration_job_updated_tuples_total,
+ 'Number of tuples updated by batched migration job'
+ ),
+ gauge_migrated_tuples: Gitlab::Metrics.gauge(
+ :batched_migration_migrated_tuples_total,
+ 'Total number of tuples migrated by a batched migration'
+ ),
+ histogram_timings: Gitlab::Metrics.histogram(
+ :batched_migration_job_query_duration_seconds,
+ 'Query timings for a batched migration job',
+ {},
+ QUERY_TIMING_BUCKETS
+ ),
+ gauge_total_tuple_count: Gitlab::Metrics.gauge(
+ :batched_migration_total_tuple_count,
+ 'Total tuple count the migration needs to touch'
+ ),
+ gauge_last_update_time: Gitlab::Metrics.gauge(
+ :batched_migration_last_update_time_seconds,
+ 'Unix epoch time in seconds'
+ )
+ }
+ end
+ end
+
+ private
+
+ def track_timing_metrics(base_labels, metrics)
+ return unless metrics && metrics['timings']
+
+ metrics['timings'].each do |key, timings|
+ summary = metric_for(:histogram_timings)
+ labels = base_labels.merge(operation: key)
+
+ timings.each do |timing|
+ summary.observe(labels, timing)
+ end
+ end
+ end
+
+ def metric_for(name)
+ self.class.metrics[name]
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/consistency_checker.rb b/lib/gitlab/database/consistency_checker.rb
new file mode 100644
index 00000000000..e398fef744c
--- /dev/null
+++ b/lib/gitlab/database/consistency_checker.rb
@@ -0,0 +1,122 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ class ConsistencyChecker
+ BATCH_SIZE = 1000
+ MAX_BATCHES = 25
+ MAX_RUNTIME = 30.seconds # must be less than the scheduling frequency of the ConsistencyCheck jobs
+
+ delegate :monotonic_time, to: :'Gitlab::Metrics::System'
+
+ def initialize(source_model:, target_model:, source_columns:, target_columns:)
+ @source_model = source_model
+ @target_model = target_model
+ @source_columns = source_columns
+ @target_columns = target_columns
+ @source_sort_column = source_columns.first
+ @target_sort_column = target_columns.first
+ @result = { matches: 0, mismatches: 0, batches: 0, mismatches_details: [] }
+ end
+
+ # rubocop:disable Metrics/AbcSize
+ def execute(start_id:)
+ current_start_id = start_id
+
+ return build_result(next_start_id: nil) if max_id.nil?
+ return build_result(next_start_id: min_id) if current_start_id > max_id
+
+ @start_time = monotonic_time
+
+ MAX_BATCHES.times do
+ if (current_start_id <= max_id) && !over_time_limit?
+ ids_range = current_start_id...(current_start_id + BATCH_SIZE)
+ # rubocop: disable CodeReuse/ActiveRecord
+ source_data = source_model.where(source_sort_column => ids_range)
+ .order(source_sort_column => :asc).pluck(*source_columns)
+ target_data = target_model.where(target_sort_column => ids_range)
+ .order(target_sort_column => :asc).pluck(*target_columns)
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ current_start_id += BATCH_SIZE
+ result[:matches] += append_mismatches_details(source_data, target_data)
+ result[:batches] += 1
+ else
+ break
+ end
+ end
+
+ result[:mismatches] = result[:mismatches_details].length
+ metrics_counter.increment({ source_table: source_model.table_name, result: "match" }, result[:matches])
+ metrics_counter.increment({ source_table: source_model.table_name, result: "mismatch" }, result[:mismatches])
+
+ build_result(next_start_id: current_start_id > max_id ? min_id : current_start_id)
+ end
+ # rubocop:enable Metrics/AbcSize
+
+ private
+
+ attr_reader :source_model, :target_model, :source_columns, :target_columns,
+ :source_sort_column, :target_sort_column, :start_time, :result
+
+ def build_result(next_start_id:)
+ { next_start_id: next_start_id }.merge(result)
+ end
+
+ def over_time_limit?
+ (monotonic_time - start_time) >= MAX_RUNTIME
+ end
+
+ # This where comparing the items happen, and building the diff log
+ # It returns the number of matching elements
+ def append_mismatches_details(source_data, target_data)
+ # Mapping difference the sort key to the item values
+ # source - target
+ source_diff_hash = (source_data - target_data).index_by { |item| item.shift }
+ # target - source
+ target_diff_hash = (target_data - source_data).index_by { |item| item.shift }
+
+ matches = source_data.length - source_diff_hash.length
+
+ # Items that exist in the first table + Different items
+ source_diff_hash.each do |id, values|
+ result[:mismatches_details] << {
+ id: id,
+ source_table: values,
+ target_table: target_diff_hash[id]
+ }
+ end
+
+ # Only the items that exist in the target table
+ target_diff_hash.each do |id, values|
+ next if source_diff_hash[id] # It's already added
+
+ result[:mismatches_details] << {
+ id: id,
+ source_table: source_diff_hash[id],
+ target_table: values
+ }
+ end
+
+ matches
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def min_id
+ @min_id ||= source_model.minimum(source_sort_column)
+ end
+
+ def max_id
+ @max_id ||= source_model.maximum(source_sort_column)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def metrics_counter
+ @metrics_counter ||= Gitlab::Metrics.counter(
+ :consistency_checks,
+ "Consistency Check Results"
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/each_database.rb b/lib/gitlab/database/each_database.rb
index cccd4b48723..0d876f5124f 100644
--- a/lib/gitlab/database/each_database.rb
+++ b/lib/gitlab/database/each_database.rb
@@ -4,11 +4,13 @@ module Gitlab
module Database
module EachDatabase
class << self
- def each_database_connection(only: nil)
+ def each_database_connection(only: nil, include_shared: true)
selected_names = Array.wrap(only)
base_models = select_base_models(selected_names)
base_models.each_pair do |connection_name, model|
+ next if !include_shared && Gitlab::Database.db_config_share_with(model.connection_db_config)
+
connection = model.connection
with_shared_connection(connection, connection_name) do
diff --git a/lib/gitlab/database/gitlab_schemas.yml b/lib/gitlab/database/gitlab_schemas.yml
index dcd78bfd84f..ae0ea919b62 100644
--- a/lib/gitlab/database/gitlab_schemas.yml
+++ b/lib/gitlab/database/gitlab_schemas.yml
@@ -42,11 +42,11 @@ audit_events: :gitlab_main
authentication_events: :gitlab_main
award_emoji: :gitlab_main
aws_roles: :gitlab_main
-background_migration_jobs: :gitlab_main
+background_migration_jobs: :gitlab_shared
badges: :gitlab_main
banned_users: :gitlab_main
-batched_background_migration_jobs: :gitlab_main
-batched_background_migrations: :gitlab_main
+batched_background_migration_jobs: :gitlab_shared
+batched_background_migrations: :gitlab_shared
board_assignees: :gitlab_main
board_group_recent_visits: :gitlab_main
board_labels: :gitlab_main
@@ -240,6 +240,7 @@ group_deletion_schedules: :gitlab_main
group_deploy_keys: :gitlab_main
group_deploy_keys_groups: :gitlab_main
group_deploy_tokens: :gitlab_main
+group_features: :gitlab_main
group_group_links: :gitlab_main
group_import_states: :gitlab_main
group_merge_request_approval_settings: :gitlab_main
@@ -393,7 +394,7 @@ postgres_indexes: :gitlab_shared
postgres_partitioned_tables: :gitlab_shared
postgres_partitions: :gitlab_shared
postgres_reindex_actions: :gitlab_shared
-postgres_reindex_queued_actions: :gitlab_main
+postgres_reindex_queued_actions: :gitlab_shared
product_analytics_events_experimental: :gitlab_main
programming_languages: :gitlab_main
project_access_tokens: :gitlab_main
@@ -435,6 +436,7 @@ protected_branches: :gitlab_main
protected_branch_merge_access_levels: :gitlab_main
protected_branch_push_access_levels: :gitlab_main
protected_branch_unprotect_access_levels: :gitlab_main
+protected_environment_approval_rules: :gitlab_main
protected_environment_deploy_access_levels: :gitlab_main
protected_environments: :gitlab_main
protected_tag_create_access_levels: :gitlab_main
@@ -558,4 +560,4 @@ x509_commit_signatures: :gitlab_main
x509_issuers: :gitlab_main
zentao_tracker_data: :gitlab_main
zoom_meetings: :gitlab_main
-batched_background_migration_job_transition_logs: :gitlab_main
+batched_background_migration_job_transition_logs: :gitlab_shared
diff --git a/lib/gitlab/database/load_balancing/configuration.rb b/lib/gitlab/database/load_balancing/configuration.rb
index 86b3afaa47b..3f03d9e2c12 100644
--- a/lib/gitlab/database/load_balancing/configuration.rb
+++ b/lib/gitlab/database/load_balancing/configuration.rb
@@ -78,15 +78,15 @@ module Gitlab
end
def primary_model_or_model_if_enabled
- if force_no_sharing_primary_model?
+ if use_dedicated_connection?
@model
else
@primary_model || @model
end
end
- def force_no_sharing_primary_model?
- return false unless @primary_model # Doesn't matter since we don't have an overriding primary model
+ def use_dedicated_connection?
+ return true unless @primary_model # We can only use dedicated connection, if re-use of connections is disabled
return false unless ::Gitlab::SafeRequestStore.active?
::Gitlab::SafeRequestStore.fetch(:force_no_sharing_primary_model) do
diff --git a/lib/gitlab/database/load_balancing/connection_proxy.rb b/lib/gitlab/database/load_balancing/connection_proxy.rb
index a91df2eccdd..1be63da8896 100644
--- a/lib/gitlab/database/load_balancing/connection_proxy.rb
+++ b/lib/gitlab/database/load_balancing/connection_proxy.rb
@@ -13,13 +13,6 @@ module Gitlab
WriteInsideReadOnlyTransactionError = Class.new(StandardError)
READ_ONLY_TRANSACTION_KEY = :load_balacing_read_only_transaction
- # The load balancer returned by connection might be different
- # between `model.connection.load_balancer` vs `model.load_balancer`
- #
- # The used `model.connection` is dependent on `use_model_load_balancing`.
- # See more in: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73949.
- #
- # Always use `model.load_balancer` or `model.sticking`.
attr_reader :load_balancer
# These methods perform writes after which we need to stick to the
diff --git a/lib/gitlab/database/load_balancing/setup.rb b/lib/gitlab/database/load_balancing/setup.rb
index 6d667e8ecf0..eceea1d8d9c 100644
--- a/lib/gitlab/database/load_balancing/setup.rb
+++ b/lib/gitlab/database/load_balancing/setup.rb
@@ -17,7 +17,12 @@ module Gitlab
configure_connection
setup_connection_proxy
setup_service_discovery
- setup_feature_flag_to_model_load_balancing
+
+ ::Gitlab::Database::LoadBalancing::Logger.debug(
+ event: :setup,
+ model: model.name,
+ start_service_discovery: @start_service_discovery
+ )
end
def configure_connection
@@ -45,21 +50,6 @@ module Gitlab
setup_class_attribute(:sticking, Sticking.new(load_balancer))
end
- # TODO: This is temporary code to gradually redirect traffic to use
- # a dedicated DB replicas, or DB primaries (depending on configuration)
- # This implements a sticky behavior for the current request if enabled.
- #
- # This is needed for Phase 3 and Phase 4 of application rollout
- # https://gitlab.com/groups/gitlab-org/-/epics/6160#progress
- #
- # If `GITLAB_USE_MODEL_LOAD_BALANCING` is set, its value is preferred
- # Otherwise, a `use_model_load_balancing` FF value is used
- def setup_feature_flag_to_model_load_balancing
- return if active_record_base?
-
- @model.singleton_class.prepend(ModelLoadBalancingFeatureFlagMixin)
- end
-
def setup_service_discovery
return unless configuration.service_discovery_enabled?
@@ -84,31 +74,6 @@ module Gitlab
def active_record_base?
@model == ActiveRecord::Base
end
-
- module ModelLoadBalancingFeatureFlagMixin
- extend ActiveSupport::Concern
-
- def use_model_load_balancing?
- # Cache environment variable and return env variable first if defined
- default_use_model_load_balancing_env = Gitlab.dev_or_test_env? || nil
- use_model_load_balancing_env = Gitlab::Utils.to_boolean(ENV.fetch('GITLAB_USE_MODEL_LOAD_BALANCING', default_use_model_load_balancing_env))
-
- unless use_model_load_balancing_env.nil?
- return use_model_load_balancing_env
- end
-
- # Check a feature flag using RequestStore (if active)
- return false unless Gitlab::SafeRequestStore.active?
-
- Gitlab::SafeRequestStore.fetch(:use_model_load_balancing) do
- Feature.enabled?(:use_model_load_balancing, default_enabled: :yaml)
- end
- end
-
- def connection
- use_model_load_balancing? ? super : ApplicationRecord.connection
- end
- end
end
end
end
diff --git a/lib/gitlab/database/migration.rb b/lib/gitlab/database/migration.rb
index b2248b0f4eb..dc695a74a4b 100644
--- a/lib/gitlab/database/migration.rb
+++ b/lib/gitlab/database/migration.rb
@@ -33,20 +33,33 @@ module Gitlab
# We use major version bumps to indicate significant changes and minor version bumps
# to indicate backwards-compatible or otherwise minor changes (e.g. a Rails version bump).
# However, this hasn't been strictly formalized yet.
- MIGRATION_CLASSES = {
- 1.0 => Class.new(ActiveRecord::Migration[6.1]) do
- include LockRetriesConcern
- include Gitlab::Database::MigrationHelpers::V2
+
+ class V1_0 < ActiveRecord::Migration[6.1] # rubocop:disable Naming/ClassAndModuleCamelCase
+ include LockRetriesConcern
+ include Gitlab::Database::MigrationHelpers::V2
+ end
+
+ class V2_0 < V1_0 # rubocop:disable Naming/ClassAndModuleCamelCase
+ include Gitlab::Database::MigrationHelpers::RestrictGitlabSchema
+
+ # When running migrations, the `db:migrate` switches connection of
+ # ActiveRecord::Base depending where the migration runs.
+ # This helper class is provided to avoid confusion using `ActiveRecord::Base`
+ class MigrationRecord < ActiveRecord::Base
end
- }.freeze
+ end
def self.[](version)
- MIGRATION_CLASSES[version] || raise(ArgumentError, "Unknown migration version: #{version}")
+ version = version.to_s
+ name = "V#{version.tr('.', '_')}"
+ raise ArgumentError, "Unknown migration version: #{version}" unless const_defined?(name, false)
+
+ const_get(name, false)
end
# The current version to be used in new migrations
def self.current_version
- 1.0
+ 2.0
end
end
end
diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb
index 7602e09981a..d016dea224b 100644
--- a/lib/gitlab/database/migration_helpers.rb
+++ b/lib/gitlab/database/migration_helpers.rb
@@ -692,6 +692,8 @@ module Gitlab
# batch_column_name - option for tables without a primary key, in this case
# another unique integer column can be used. Example: :user_id
def undo_cleanup_concurrent_column_type_change(table, column, old_type, type_cast_function: nil, batch_column_name: :id, limit: nil)
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.require_ddl_mode!
+
temp_column = "#{column}_for_type_change"
# Using a descriptive name that includes orinal column's name risks
@@ -956,7 +958,7 @@ module Gitlab
Gitlab::AppLogger.warn "Could not find batched background migration for the given configuration: #{configuration}"
elsif !migration.finished?
raise "Expected batched background migration for the given configuration to be marked as 'finished', " \
- "but it is '#{migration.status}':" \
+ "but it is '#{migration.status_name}':" \
"\t#{configuration}" \
"\n\n" \
"Finalize it manualy by running" \
@@ -1639,7 +1641,9 @@ into similar problems in the future (e.g. when new tables are created).
old_value = Arel::Nodes::NamedFunction.new(type_cast_function, [old_value])
end
- update_column_in_batches(table, new, old_value, batch_column_name: batch_column_name)
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.with_suppressed do
+ update_column_in_batches(table, new, old_value, batch_column_name: batch_column_name)
+ end
add_not_null_constraint(table, new) unless old_col.null
diff --git a/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb b/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb
index b4e31565c60..5a25128f3a9 100644
--- a/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb
+++ b/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb
@@ -6,8 +6,6 @@ module Gitlab
module RestrictGitlabSchema
extend ActiveSupport::Concern
- MigrationSkippedError = Class.new(StandardError)
-
included do
class_attribute :allowed_gitlab_schemas
end
@@ -25,11 +23,8 @@ module Gitlab
def migrate(direction)
if unmatched_schemas.any?
- # TODO: Today skipping migration would raise an exception.
- # Ideally, skipped migration should be ignored (not loaded), or softly ignored.
- # Read more in: https://gitlab.com/gitlab-org/gitlab/-/issues/355014
- raise MigrationSkippedError, "Current migration is skipped since it modifies "\
- "'#{self.class.allowed_gitlab_schemas}' which is outside of '#{allowed_schemas_for_connection}'"
+ migration_skipped
+ return
end
Gitlab::Database::QueryAnalyzer.instance.within([validator_class]) do
@@ -41,6 +36,11 @@ module Gitlab
private
+ def migration_skipped
+ say "Current migration is skipped since it modifies "\
+ "'#{self.class.allowed_gitlab_schemas}' which is outside of '#{allowed_schemas_for_connection}'"
+ end
+
def validator_class
Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas
end
diff --git a/lib/gitlab/database/migration_helpers/v2.rb b/lib/gitlab/database/migration_helpers/v2.rb
index 0e7f6075196..dd426962033 100644
--- a/lib/gitlab/database/migration_helpers/v2.rb
+++ b/lib/gitlab/database/migration_helpers/v2.rb
@@ -134,6 +134,8 @@ module Gitlab
# batch_column_name - option is for tables without primary key, in this
# case another unique integer column can be used. Example: :user_id
def rename_column_concurrently(table, old_column, new_column, type: nil, batch_column_name: :id)
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.require_ddl_mode!
+
setup_renamed_column(__callee__, table, old_column, new_column, type, batch_column_name)
with_lock_retries do
@@ -181,6 +183,8 @@ module Gitlab
# case another unique integer column can be used. Example: :user_id
#
def undo_cleanup_concurrent_column_rename(table, old_column, new_column, type: nil, batch_column_name: :id)
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.require_ddl_mode!
+
setup_renamed_column(__callee__, table, new_column, old_column, type, batch_column_name)
with_lock_retries do
diff --git a/lib/gitlab/database/migrations/batched_background_migration_helpers.rb b/lib/gitlab/database/migrations/batched_background_migration_helpers.rb
index a2a4a37ab87..0261ade0fe7 100644
--- a/lib/gitlab/database/migrations/batched_background_migration_helpers.rb
+++ b/lib/gitlab/database/migrations/batched_background_migration_helpers.rb
@@ -84,7 +84,7 @@ module Gitlab
FROM #{connection.quote_table_name(batch_table_name)}
SQL
- migration_status = batch_max_value.nil? ? :finished : :active
+ status_event = batch_max_value.nil? ? :finish : :execute
batch_max_value ||= batch_min_value
migration = Gitlab::Database::BackgroundMigration::BatchedMigration.new(
@@ -98,7 +98,7 @@ module Gitlab
batch_class_name: batch_class_name,
batch_size: batch_size,
sub_batch_size: sub_batch_size,
- status: migration_status
+ status_event: status_event
)
# Below `BatchedMigration` attributes were introduced after the
diff --git a/lib/gitlab/database/migrations/instrumentation.rb b/lib/gitlab/database/migrations/instrumentation.rb
index 9d28db6b886..7c21346007a 100644
--- a/lib/gitlab/database/migrations/instrumentation.rb
+++ b/lib/gitlab/database/migrations/instrumentation.rb
@@ -6,11 +6,8 @@ module Gitlab
class Instrumentation
STATS_FILENAME = 'migration-stats.json'
- attr_reader :observations
-
def initialize(result_dir:, observer_classes: ::Gitlab::Database::Migrations::Observers.all_observers)
@observer_classes = observer_classes
- @observations = []
@result_dir = result_dir
end
@@ -38,15 +35,16 @@ module Gitlab
on_each_observer(observers) { |observer| observer.after }
on_each_observer(observers) { |observer| observer.record }
- record_observation(observation)
+ record_observation(observation, destination_dir: per_migration_result_dir)
end
private
attr_reader :observer_classes
- def record_observation(observation)
- @observations << observation
+ def record_observation(observation, destination_dir:)
+ stats_file_location = File.join(destination_dir, STATS_FILENAME)
+ File.write(stats_file_location, observation.to_json)
end
def on_each_observer(observers, &block)
diff --git a/lib/gitlab/database/migrations/runner.rb b/lib/gitlab/database/migrations/runner.rb
index 02645a0d452..3b6f52b43a8 100644
--- a/lib/gitlab/database/migrations/runner.rb
+++ b/lib/gitlab/database/migrations/runner.rb
@@ -6,7 +6,7 @@ module Gitlab
class Runner
BASE_RESULT_DIR = Rails.root.join('tmp', 'migration-testing').freeze
METADATA_FILENAME = 'metadata.json'
- SCHEMA_VERSION = 2 # Version of the output format produced by the runner
+ SCHEMA_VERSION = 3 # Version of the output format produced by the runner
class << self
def up
@@ -17,6 +17,10 @@ module Gitlab
Runner.new(direction: :down, migrations: migrations_for_down, result_dir: BASE_RESULT_DIR.join('down'))
end
+ def background_migrations
+ TestBackgroundRunner.new(result_dir: BASE_RESULT_DIR.join('background_migrations'))
+ end
+
def migration_context
@migration_context ||= ApplicationRecord.connection.migration_context
end
@@ -76,13 +80,8 @@ module Gitlab
end
end
ensure
- if instrumentation
- stats_filename = File.join(result_dir, Gitlab::Database::Migrations::Instrumentation::STATS_FILENAME)
- File.write(stats_filename, instrumentation.observations.to_json)
-
- metadata_filename = File.join(result_dir, METADATA_FILENAME)
- File.write(metadata_filename, { version: SCHEMA_VERSION }.to_json)
- end
+ metadata_filename = File.join(result_dir, METADATA_FILENAME)
+ File.write(metadata_filename, { version: SCHEMA_VERSION }.to_json)
# 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
diff --git a/lib/gitlab/database/migrations/test_background_runner.rb b/lib/gitlab/database/migrations/test_background_runner.rb
index 821d68c06c9..74e54d62e05 100644
--- a/lib/gitlab/database/migrations/test_background_runner.rb
+++ b/lib/gitlab/database/migrations/test_background_runner.rb
@@ -4,12 +4,10 @@ module Gitlab
module Database
module Migrations
class TestBackgroundRunner
- # TODO - build a rake task to call this method, and support it in the gitlab-com-database-testing project.
- # Until then, we will inject a migration with a very high timestamp during database testing
- # that calls this class to run jobs
- # See https://gitlab.com/gitlab-org/database-team/gitlab-com-database-testing/-/issues/41 for details
+ attr_reader :result_dir
- def initialize
+ def initialize(result_dir:)
+ @result_dir = result_dir
@job_coordinator = Gitlab::BackgroundMigration.coordinator_for_database(Gitlab::Database::MAIN_DATABASE_NAME)
end
@@ -24,18 +22,30 @@ module Gitlab
# without .to_f, we do integer division
# For example, 3.minutes / 2 == 1.minute whereas 3.minutes / 2.to_f == (1.minute + 30.seconds)
duration_per_migration_type = for_duration / jobs_to_run.count.to_f
- jobs_to_run.each do |_migration_name, jobs|
+ jobs_to_run.each do |migration_name, jobs|
run_until = duration_per_migration_type.from_now
- jobs.shuffle.each do |j|
- break if run_until <= Time.current
- run_job(j)
- end
+ run_jobs_for_migration(migration_name: migration_name, jobs: jobs, run_until: run_until)
end
end
private
+ def run_jobs_for_migration(migration_name:, jobs:, run_until:)
+ per_background_migration_result_dir = File.join(@result_dir, migration_name)
+
+ instrumentation = Instrumentation.new(result_dir: per_background_migration_result_dir)
+ batch_names = (1..).each.lazy.map { |i| "batch_#{i}"}
+
+ jobs.shuffle.each do |j|
+ break if run_until <= Time.current
+
+ instrumentation.observe(version: nil, name: batch_names.next, connection: ActiveRecord::Migration.connection) do
+ run_job(j)
+ end
+ end
+ end
+
def run_job(job)
Gitlab::BackgroundMigration.perform(job.args[0], job.args[1])
end
diff --git a/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb b/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb
index e56ffddac4f..034e18ec9f4 100644
--- a/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb
+++ b/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb
@@ -40,16 +40,20 @@ module Gitlab
# 1. The minimum value for the partitioning column in the table
# 2. If no data is present yet, the current month
def partition_table_by_date(table_name, column_name, min_date: nil, max_date: nil)
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.require_ddl_mode!
+
assert_table_is_allowed(table_name)
assert_not_in_transaction_block(scope: ERROR_SCOPE)
max_date ||= Date.today + 1.month
- min_date ||= connection.select_one(<<~SQL)['minimum'] || max_date - 1.month
- SELECT date_trunc('MONTH', MIN(#{column_name})) AS minimum
- FROM #{table_name}
- SQL
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.with_suppressed do
+ min_date ||= connection.select_one(<<~SQL)['minimum'] || max_date - 1.month
+ SELECT date_trunc('MONTH', MIN(#{column_name})) AS minimum
+ FROM #{table_name}
+ SQL
+ end
raise "max_date #{max_date} must be greater than min_date #{min_date}" if min_date >= max_date
@@ -154,6 +158,8 @@ module Gitlab
# finalize_backfilling_partitioned_table :audit_events
#
def finalize_backfilling_partitioned_table(table_name)
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.require_dml_mode!
+
assert_table_is_allowed(table_name)
assert_not_in_transaction_block(scope: ERROR_SCOPE)
@@ -170,8 +176,10 @@ module Gitlab
primary_key = connection.primary_key(table_name)
copy_missed_records(table_name, partitioned_table_name, primary_key)
- disable_statement_timeout do
- execute("VACUUM FREEZE ANALYZE #{partitioned_table_name}")
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.with_suppressed do
+ disable_statement_timeout do
+ execute("VACUUM FREEZE ANALYZE #{partitioned_table_name}")
+ end
end
end
diff --git a/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics.rb b/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics.rb
index 06e2b114c91..391375d472f 100644
--- a/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics.rb
+++ b/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics.rb
@@ -27,9 +27,15 @@ module Gitlab
# to reduce amount of labels sort schemas used
gitlab_schemas = gitlab_schemas.to_a.sort.join(",")
+ # Temporary feature to observe relation of `gitlab_schemas` to `db_config_name`
+ # depending on primary model
+ ci_dedicated_primary_connection = ::Ci::ApplicationRecord.connection_class? &&
+ ::Ci::ApplicationRecord.load_balancer.configuration.use_dedicated_connection?
+
schemas_metrics.increment({
gitlab_schemas: gitlab_schemas,
- db_config_name: db_config_name
+ db_config_name: db_config_name,
+ ci_dedicated_primary_connection: ci_dedicated_primary_connection
})
end
diff --git a/lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb b/lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb
index ab40ba5d59b..3f0176cb654 100644
--- a/lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb
+++ b/lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb
@@ -69,8 +69,10 @@ module Gitlab
schemas = self.dml_schemas(tables)
if (schemas - self.allowed_gitlab_schemas).any?
- raise DMLAccessDeniedError, "Select/DML queries (SELECT/UPDATE/DELETE) do access '#{tables}' (#{schemas.to_a}) " \
- "which is outside of list of allowed schemas: '#{self.allowed_gitlab_schemas}'."
+ raise DMLAccessDeniedError, \
+ "Select/DML queries (SELECT/UPDATE/DELETE) do access '#{tables}' (#{schemas.to_a}) " \
+ "which is outside of list of allowed schemas: '#{self.allowed_gitlab_schemas}'. " \
+ "#{documentation_url}"
end
end
@@ -93,11 +95,19 @@ module Gitlab
end
def raise_dml_not_allowed_error(message)
- raise DMLNotAllowedError, "Select/DML queries (SELECT/UPDATE/DELETE) are disallowed in the DDL (structure) mode. #{message}"
+ raise DMLNotAllowedError, \
+ "Select/DML queries (SELECT/UPDATE/DELETE) are disallowed in the DDL (structure) mode. " \
+ "#{message}. #{documentation_url}" \
end
def raise_ddl_not_allowed_error(message)
- raise DDLNotAllowedError, "DDL queries (structure) are disallowed in the Select/DML (SELECT/UPDATE/DELETE) mode. #{message}"
+ raise DDLNotAllowedError, \
+ "DDL queries (structure) are disallowed in the Select/DML (SELECT/UPDATE/DELETE) mode. " \
+ "#{message}. #{documentation_url}"
+ end
+
+ def documentation_url
+ "For more information visit: https://docs.gitlab.com/ee/development/database/migrations_for_multiple_databases.html"
end
end
end
diff --git a/lib/gitlab/database/reindexing/grafana_notifier.rb b/lib/gitlab/database/reindexing/grafana_notifier.rb
index f4ea59deb50..ece9327b658 100644
--- a/lib/gitlab/database/reindexing/grafana_notifier.rb
+++ b/lib/gitlab/database/reindexing/grafana_notifier.rb
@@ -5,10 +5,10 @@ module Gitlab
module Reindexing
# This can be used to send annotations for reindexing to a Grafana API
class GrafanaNotifier
- def initialize(api_key = ENV['GITLAB_GRAFANA_API_KEY'], api_url = ENV['GITLAB_GRAFANA_API_URL'], additional_tag = ENV['GITLAB_REINDEXING_GRAFANA_TAG'] || Rails.env)
- @api_key = api_key
- @api_url = api_url
- @additional_tag = additional_tag
+ def initialize(api_key: nil, api_url: nil, additional_tag: nil)
+ @api_key = api_key || default_api_key
+ @api_url = api_url || default_api_url
+ @additional_tag = additional_tag || default_additional_tag
end
def notify_start(action)
@@ -35,10 +35,22 @@ module Gitlab
private
+ def default_api_key
+ Gitlab::CurrentSettings.database_grafana_api_key || ENV['GITLAB_GRAFANA_API_KEY']
+ end
+
+ def default_api_url
+ Gitlab::CurrentSettings.database_grafana_api_url || ENV['GITLAB_GRAFANA_API_URL']
+ end
+
+ def default_additional_tag
+ Gitlab::CurrentSettings.database_grafana_tag || ENV['GITLAB_REINDEXING_GRAFANA_TAG'] || Rails.env
+ end
+
def base_payload(action)
{
time: (action.action_start.utc.to_f * 1000).to_i,
- tags: ['reindex', @additional_tag, action.index.tablename, action.index.name].compact
+ tags: ['reindex', @additional_tag.presence, action.index.tablename, action.index.name].compact
}
end
diff --git a/lib/gitlab/diff/custom_diff.rb b/lib/gitlab/diff/custom_diff.rb
index af1fd8fb03e..860f87a28a3 100644
--- a/lib/gitlab/diff/custom_diff.rb
+++ b/lib/gitlab/diff/custom_diff.rb
@@ -2,17 +2,29 @@
module Gitlab
module Diff
module CustomDiff
+ RENDERED_TIMEOUT_BACKGROUND = 20.seconds
+ RENDERED_TIMEOUT_FOREGROUND = 1.5.seconds
+ BACKGROUND_EXECUTION = 'background'
+ FOREGROUND_EXECUTION = 'foreground'
+ LOG_IPYNBDIFF_GENERATED = 'IPYNB_DIFF_GENERATED'
+ LOG_IPYNBDIFF_TIMEOUT = 'IPYNB_DIFF_TIMEOUT'
+ LOG_IPYNBDIFF_INVALID = 'IPYNB_DIFF_INVALID'
+
class << self
def preprocess_before_diff(path, old_blob, new_blob)
return unless path.ends_with? '.ipynb'
- transformed_diff(old_blob&.data, new_blob&.data)&.tap do
- transformed_for_diff(new_blob, old_blob)
- Gitlab::AppLogger.info({ message: 'IPYNB_DIFF_GENERATED' })
+ Timeout.timeout(timeout_time) do
+ transformed_diff(old_blob&.data, new_blob&.data)&.tap do
+ transformed_for_diff(new_blob, old_blob)
+ log_event(LOG_IPYNBDIFF_GENERATED)
+ end
end
+ rescue Timeout::Error => e
+ rendered_timeout.increment(source: execution_source)
+ log_event(LOG_IPYNBDIFF_TIMEOUT, e)
rescue IpynbDiff::InvalidNotebookError, IpynbDiff::InvalidTokenError => e
- Gitlab::ErrorTracking.log_exception(e)
- nil
+ log_event(LOG_IPYNBDIFF_INVALID, e)
end
def transformed_diff(before, after)
@@ -50,6 +62,27 @@ module Gitlab
blobs_with_transformed_diffs[b] = true if b
end
end
+
+ def rendered_timeout
+ @rendered_timeout ||= Gitlab::Metrics.counter(
+ :ipynb_semantic_diff_timeouts_total,
+ 'Counts the times notebook rendering timed out'
+ )
+ end
+
+ def timeout_time
+ Gitlab::Runtime.sidekiq? ? RENDERED_TIMEOUT_BACKGROUND : RENDERED_TIMEOUT_FOREGROUND
+ end
+
+ def execution_source
+ Gitlab::Runtime.sidekiq? ? BACKGROUND_EXECUTION : FOREGROUND_EXECUTION
+ end
+
+ def log_event(message, error = nil)
+ Gitlab::AppLogger.info({ message: message })
+ Gitlab::ErrorTracking.track_exception(error) if error
+ nil
+ end
end
end
end
diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb
index 89822af2455..61bb0c797b4 100644
--- a/lib/gitlab/diff/file.rb
+++ b/lib/gitlab/diff/file.rb
@@ -44,7 +44,13 @@ module Gitlab
new_blob_lazy
old_blob_lazy
- diff.diff = Gitlab::Diff::CustomDiff.preprocess_before_diff(diff.new_path, old_blob_lazy, new_blob_lazy) || diff.diff unless use_renderable_diff?
+ if use_semantic_ipynb_diff? && !use_renderable_diff?
+ diff.diff = Gitlab::Diff::CustomDiff.preprocess_before_diff(diff.new_path, old_blob_lazy, new_blob_lazy) || diff.diff
+ end
+ end
+
+ def use_semantic_ipynb_diff?
+ strong_memoize(:_use_semantic_ipynb_diff) { Feature.enabled?(:ipynb_semantic_diff, repository.project, default_enabled: :yaml) }
end
def use_renderable_diff?
@@ -375,7 +381,7 @@ module Gitlab
end
def rendered
- return unless use_renderable_diff? && ipynb?
+ return unless use_semantic_ipynb_diff? && use_renderable_diff? && ipynb? && modified_file? && !too_large?
strong_memoize(:rendered) { Rendered::Notebook::DiffFile.new(self) }
end
@@ -410,7 +416,7 @@ module Gitlab
end
def ipynb?
- modified_file? && file_path.ends_with?('.ipynb')
+ file_path.ends_with?('.ipynb')
end
# We can't use Object#try because Blob doesn't inherit from Object, but
diff --git a/lib/gitlab/diff/line.rb b/lib/gitlab/diff/line.rb
index c2b834c71b5..316a0d2815a 100644
--- a/lib/gitlab/diff/line.rb
+++ b/lib/gitlab/diff/line.rb
@@ -9,8 +9,8 @@ module Gitlab
SERIALIZE_KEYS = %i(line_code rich_text text type index old_pos new_pos).freeze
attr_reader :marker_ranges
- attr_writer :text, :rich_text, :discussable
- attr_accessor :index, :type, :old_pos, :new_pos, :line_code
+ attr_writer :text, :rich_text
+ attr_accessor :index, :old_pos, :new_pos, :line_code, :type
def initialize(text, type, index, old_pos, new_pos, parent_file: nil, line_code: nil, rich_text: nil)
@text = text
@@ -24,9 +24,7 @@ module Gitlab
# When line code is not provided from cache store we build it
# using the parent_file(Diff::File or Conflict::File).
@line_code = line_code || calculate_line_code
-
@marker_ranges = []
- @discussable = true
end
def self.init_from_hash(hash)
@@ -81,23 +79,28 @@ module Gitlab
end
def added?
- %w[new new-nonewline].include?(type)
+ %w[new new-nonewline new-nomappinginraw].include?(type)
end
def removed?
- %w[old old-nonewline].include?(type)
+ %w[old old-nonewline old-nomappinginraw].include?(type)
end
def meta?
%w[match new-nonewline old-nonewline].include?(type)
end
+ def has_mapping_in_raw?
+ # Used for rendered diff, when the displayed line doesn't have a matching line in the raw diff
+ !type&.ends_with?('nomappinginraw')
+ end
+
def match?
type == :match
end
def discussable?
- @discussable && !meta?
+ has_mapping_in_raw? && !meta?
end
def suggestible?
diff --git a/lib/gitlab/diff/parallel_diff.rb b/lib/gitlab/diff/parallel_diff.rb
index 77b65fea726..cbfc20d3d62 100644
--- a/lib/gitlab/diff/parallel_diff.rb
+++ b/lib/gitlab/diff/parallel_diff.rb
@@ -44,7 +44,7 @@ module Gitlab
free_right_index = nil
i += 1
end
- elsif line.meta? || line.unchanged?
+ elsif line.meta? || line.unchanged? || !line.has_mapping_in_raw?
# line in the right panel is the same as in the left one
lines << {
left: line,
diff --git a/lib/gitlab/diff/rendered/notebook/diff_file.rb b/lib/gitlab/diff/rendered/notebook/diff_file.rb
index e700e730f20..cf97569ca31 100644
--- a/lib/gitlab/diff/rendered/notebook/diff_file.rb
+++ b/lib/gitlab/diff/rendered/notebook/diff_file.rb
@@ -6,6 +6,14 @@ module Gitlab
include Gitlab::Utils::StrongMemoize
class DiffFile < Gitlab::Diff::File
+ RENDERED_TIMEOUT_BACKGROUND = 10.seconds
+ RENDERED_TIMEOUT_FOREGROUND = 1.5.seconds
+ BACKGROUND_EXECUTION = 'background'
+ FOREGROUND_EXECUTION = 'foreground'
+ LOG_IPYNBDIFF_GENERATED = 'IPYNB_DIFF_GENERATED'
+ LOG_IPYNBDIFF_TIMEOUT = 'IPYNB_DIFF_TIMEOUT'
+ LOG_IPYNBDIFF_INVALID = 'IPYNB_DIFF_INVALID'
+
attr_reader :source_diff
delegate :repository, :diff_refs, :fallback_diff_refs, :unfolded, :unique_identifier,
@@ -52,14 +60,17 @@ module Gitlab
def notebook_diff
strong_memoize(:notebook_diff) do
- Gitlab::AppLogger.info({ message: 'IPYNB_DIFF_GENERATED' })
-
- IpynbDiff.diff(source_diff.old_blob&.data, source_diff.new_blob&.data,
- raise_if_invalid_nb: true,
- diffy_opts: { include_diff_info: true })
+ Timeout.timeout(timeout_time) do
+ IpynbDiff.diff(source_diff.old_blob&.data, source_diff.new_blob&.data,
+ raise_if_invalid_nb: true, diffy_opts: { include_diff_info: true })&.tap do
+ log_event(LOG_IPYNBDIFF_GENERATED)
+ end
+ end
+ rescue Timeout::Error => e
+ rendered_timeout.increment(source: Gitlab::Runtime.sidekiq? ? BACKGROUND_EXECUTION : FOREGROUND_EXECUTION)
+ log_event(LOG_IPYNBDIFF_TIMEOUT, e)
rescue IpynbDiff::InvalidNotebookError, IpynbDiff::InvalidTokenError => e
- Gitlab::ErrorTracking.log_exception(e)
- nil
+ log_event(LOG_IPYNBDIFF_INVALID, e)
end
end
@@ -87,10 +98,7 @@ module Gitlab
line.new_pos = removal_line_maps[line.old_pos] if line.new_pos == 0 && line.old_pos != 0
# Lines that do not appear on the original diff should not be commentable
-
- unless addition_line_maps[line.new_pos] || removal_line_maps[line.old_pos]
- line.discussable = false
- end
+ line.type = "#{line.type || 'unchanged'}-nomappinginraw" unless addition_line_maps[line.new_pos] || removal_line_maps[line.old_pos]
line.line_code = line_code(line)
line
@@ -113,12 +121,29 @@ module Gitlab
additions = {}
source_diff.highlighted_diff_lines.each do |line|
- removals[line.old_pos] = line.new_pos
- additions[line.new_pos] = line.old_pos
+ removals[line.old_pos] = line.new_pos unless source_diff.new_file?
+ additions[line.new_pos] = line.old_pos unless source_diff.deleted_file?
end
[removals, additions]
end
+
+ def rendered_timeout
+ @rendered_timeout ||= Gitlab::Metrics.counter(
+ :ipynb_semantic_diff_timeouts_total,
+ 'Counts the times notebook diff rendering timed out'
+ )
+ end
+
+ def timeout_time
+ Gitlab::Runtime.sidekiq? ? RENDERED_TIMEOUT_BACKGROUND : RENDERED_TIMEOUT_FOREGROUND
+ end
+
+ def log_event(message, error = nil)
+ Gitlab::AppLogger.info({ message: message })
+ Gitlab::ErrorTracking.track_exception(error) if error
+ nil
+ end
end
end
end
diff --git a/lib/gitlab/email/handler/service_desk_handler.rb b/lib/gitlab/email/handler/service_desk_handler.rb
index bb57494c729..71b1d4ed8f9 100644
--- a/lib/gitlab/email/handler/service_desk_handler.rb
+++ b/lib/gitlab/email/handler/service_desk_handler.rb
@@ -34,7 +34,7 @@ module Gitlab
create_issue_or_note
- if issue_creator_address
+ if from_address
add_email_participant
send_thank_you_email unless reply_email?
end
@@ -98,7 +98,7 @@ module Gitlab
title: mail.subject,
description: message_including_template,
confidential: true,
- external_author: external_author
+ external_author: from_address
},
spam_params: nil
).execute
@@ -176,22 +176,8 @@ module Gitlab
).execute
end
- def issue_creator_address
- reply_to_address || from_address
- end
-
def from_address
- mail.from.first || mail.sender
- end
-
- def reply_to_address
- (mail.reply_to || []).first
- end
-
- def external_author
- return issue_creator_address unless reply_to_address && from_address
-
- _("%{from_address} (reply to: %{reply_to_address})") % { from_address: from_address, reply_to_address: reply_to_address }
+ (mail.reply_to || []).first || mail.from.first || mail.sender
end
def can_handle_legacy_format?
@@ -205,7 +191,7 @@ module Gitlab
def add_email_participant
return if reply_email? && !Feature.enabled?(:issue_email_participants, @issue.project)
- @issue.issue_email_participants.create(email: issue_creator_address)
+ @issue.issue_email_participants.create(email: from_address)
end
end
end
diff --git a/lib/gitlab/email/message/in_product_marketing.rb b/lib/gitlab/email/message/in_product_marketing.rb
index ac9585bcd1a..bd2c91755c8 100644
--- a/lib/gitlab/email/message/in_product_marketing.rb
+++ b/lib/gitlab/email/message/in_product_marketing.rb
@@ -7,7 +7,7 @@ module Gitlab
UnknownTrackError = Class.new(StandardError)
def self.for(track)
- valid_tracks = [Namespaces::InviteTeamEmailService::TRACK, Namespaces::InProductMarketingEmailsService::TRACKS.keys].flatten
+ valid_tracks = Namespaces::InProductMarketingEmailsService::TRACKS.keys
raise UnknownTrackError unless valid_tracks.include?(track)
"Gitlab::Email::Message::InProductMarketing::#{track.to_s.classify}".constantize
diff --git a/lib/gitlab/email/message/in_product_marketing/invite_team.rb b/lib/gitlab/email/message/in_product_marketing/invite_team.rb
deleted file mode 100644
index e9334b687f4..00000000000
--- a/lib/gitlab/email/message/in_product_marketing/invite_team.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Email
- module Message
- module InProductMarketing
- class InviteTeam < Base
- def subject_line
- s_('InProductMarketing|Invite your teammates to GitLab')
- end
-
- def tagline
- ''
- end
-
- def title
- s_('InProductMarketing|GitLab is better with teammates to help out!')
- end
-
- def subtitle
- ''
- end
-
- def body_line1
- s_('InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running.')
- end
-
- def body_line2
- ''
- end
-
- def cta_text
- s_('InProductMarketing|Invite your teammates to help')
- end
-
- def logo_path
- 'mailers/in_product_marketing/team-0.png'
- end
-
- def series?
- false
- end
-
- private
-
- def validate_series!
- raise ArgumentError, "Only one email is sent for this track. Value of `series` should be 0." unless @series == 0
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/emoji.rb b/lib/gitlab/emoji.rb
index 3c5d223b106..f539d627dcb 100644
--- a/lib/gitlab/emoji.rb
+++ b/lib/gitlab/emoji.rb
@@ -46,12 +46,13 @@ module Gitlab
def custom_emoji_tag(name, image_source)
data = {
- name: name
+ name: name,
+ fallback_src: image_source,
+ unicode_version: 'custom' # Prevents frontend to check for Unicode support
}
+ options = { title: name, data: data }
- ActionController::Base.helpers.content_tag('gl-emoji', title: name, data: data) do
- emoji_image_tag(name, image_source).html_safe
- end
+ ActionController::Base.helpers.content_tag('gl-emoji', "", options)
end
end
end
diff --git a/lib/gitlab/encoding_helper.rb b/lib/gitlab/encoding_helper.rb
index 2e0060c7c18..f26ab6e3ed1 100644
--- a/lib/gitlab/encoding_helper.rb
+++ b/lib/gitlab/encoding_helper.rb
@@ -15,6 +15,8 @@ module Gitlab
# https://gitlab.com/gitlab-org/gitlab_git/merge_requests/77#note_4754193
ENCODING_CONFIDENCE_THRESHOLD = 50
+ UNICODE_REPLACEMENT_CHARACTER = "�"
+
def encode!(message)
message = force_encode_utf8(message)
return message if message.valid_encoding?
@@ -65,6 +67,10 @@ module Gitlab
message.encode(Encoding::UTF_8, invalid: :replace, undef: :replace)
end
+ def encode_utf8_with_replacement_character(data)
+ encode_utf8(data, replace: UNICODE_REPLACEMENT_CHARACTER)
+ end
+
def encode_utf8(message, replace: "")
message = force_encode_utf8(message)
return message if message.valid_encoding?
@@ -99,6 +105,35 @@ module Gitlab
io.tap { |io| io.set_encoding(Encoding::ASCII_8BIT) }
end
+ ESCAPED_CHARS = {
+ "a" => "\a", "b" => "\b", "e" => "\e", "f" => "\f",
+ "n" => "\n", "r" => "\r", "t" => "\t", "v" => "\v",
+ "\"" => "\""
+ }.freeze
+
+ # rubocop:disable Style/AsciiComments
+ # `unquote_path` decode filepaths that are returned by some git commands.
+ # The path may be returned in double-quotes if it contains special characters,
+ # that are encoded in octal. Also, some characters (see `ESCAPED_CHARS`) are escaped.
+ # eg. "\311\240\304\253\305\247\305\200\310\247\306\200" (quotes included) is decoded as ɠīŧŀȧƀ
+ #
+ # Based on `unquote_c_style` from git source
+ # https://github.com/git/git/blob/v2.35.1/quote.c#L399
+ # rubocop:enable Style/AsciiComments
+ def unquote_path(filename)
+ return filename unless filename[0] == '"'
+
+ filename = filename[1..-2].gsub(/\\(?:([#{ESCAPED_CHARS.keys.join}\\])|(\d{3}))/) do
+ if c = Regexp.last_match(1)
+ c == "\\" ? "\\" : ESCAPED_CHARS[c]
+ elsif c = Regexp.last_match(2)
+ c.to_i(8).chr
+ end
+ end
+
+ filename.force_encoding("UTF-8")
+ end
+
private
def force_encode_utf8(message)
diff --git a/lib/gitlab/experiment/rollout/feature.rb b/lib/gitlab/experiment/rollout/feature.rb
index 70c363877b1..4bef92f5c23 100644
--- a/lib/gitlab/experiment/rollout/feature.rb
+++ b/lib/gitlab/experiment/rollout/feature.rb
@@ -28,13 +28,10 @@ module Gitlab
# If the `Feature.enabled?` check is false, we return nil implicitly,
# which will assign the control. Otherwise we call super, which will
# assign a variant evenly, or based on our provided distribution rules.
- def execute_assigment
+ def execute_assignment
super if ::Feature.enabled?(feature_flag_name, self, type: :experiment, default_enabled: :yaml)
end
- # NOTE: There's a typo in the name of this method that we'll fix up.
- alias_method :execute_assignment, :execute_assigment
-
# This is what's provided to the `Feature.enabled?` call that will be
# used to determine experiment inclusion. An experiment may provide an
# override for this method to make the experiment work on user, group,
diff --git a/lib/gitlab/fips.rb b/lib/gitlab/fips.rb
index 1dd363ceb17..97813f13a91 100644
--- a/lib/gitlab/fips.rb
+++ b/lib/gitlab/fips.rb
@@ -5,6 +5,17 @@ module Gitlab
class FIPS
# A simple utility class for FIPS-related helpers
+ Technology = Gitlab::SSHPublicKey::Technology
+
+ SSH_KEY_TECHNOLOGIES = [
+ Technology.new(:rsa, SSHData::PublicKey::RSA, [3072, 4096], %w(ssh-rsa)),
+ Technology.new(:dsa, SSHData::PublicKey::DSA, [], %w(ssh-dss)),
+ Technology.new(:ecdsa, SSHData::PublicKey::ECDSA, [256, 384, 521], %w(ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521)),
+ Technology.new(:ed25519, SSHData::PublicKey::ED25519, [256], %w(ssh-ed25519)),
+ Technology.new(:ecdsa_sk, SSHData::PublicKey::SKECDSA, [256], %w(sk-ecdsa-sha2-nistp256@openssh.com)),
+ Technology.new(:ed25519_sk, SSHData::PublicKey::SKED25519, [256], %w(sk-ssh-ed25519@openssh.com))
+ ].freeze
+
class << self
# Returns whether we should be running in FIPS mode or not
#
diff --git a/lib/gitlab/gfm/uploads_rewriter.rb b/lib/gitlab/gfm/uploads_rewriter.rb
index 08321d5fda6..82ef7eed56a 100644
--- a/lib/gitlab/gfm/uploads_rewriter.rb
+++ b/lib/gitlab/gfm/uploads_rewriter.rb
@@ -37,7 +37,7 @@ module Gitlab
if was_embedded?(markdown)
moved_markdown
else
- moved_markdown.sub(/\A!/, "")
+ moved_markdown.delete_prefix('!')
end
end
end
diff --git a/lib/gitlab/git/blame.rb b/lib/gitlab/git/blame.rb
index 5669a65cbd9..30977adaea1 100644
--- a/lib/gitlab/git/blame.rb
+++ b/lib/gitlab/git/blame.rb
@@ -5,35 +5,45 @@ module Gitlab
class Blame
include Gitlab::EncodingHelper
- attr_reader :lines, :blames
+ attr_reader :lines, :blames, :range
- def initialize(repository, sha, path)
+ def initialize(repository, sha, path, range: nil)
@repo = repository
@sha = sha
@path = path
+ @range = range
@lines = []
@blames = load_blame
end
def each
@blames.each do |blame|
- yield(blame.commit, blame.line)
+ yield(blame.commit, blame.line, blame.previous_path)
end
end
private
+ def range_spec
+ "#{range.first},#{range.last}" if range
+ end
+
def load_blame
- output = encode_utf8(@repo.gitaly_commit_client.raw_blame(@sha, @path))
+ output = encode_utf8(
+ @repo.gitaly_commit_client.raw_blame(@sha, @path, range: range_spec)
+ )
process_raw_blame(output)
end
def process_raw_blame(output)
+ start_line = nil
lines = []
final = []
info = {}
commits = {}
+ commit_id = nil
+ previous_paths = {}
# process the output
output.split("\n").each do |line|
@@ -45,6 +55,15 @@ module Gitlab
commit_id = m[1]
commits[commit_id] = nil unless commits.key?(commit_id)
info[m[3].to_i] = [commit_id, m[2].to_i]
+
+ # Assumption: the first line returned by git blame is lowest-numbered
+ # This is true unless we start passing it `--incremental`.
+ start_line = m[3].to_i if start_line.nil?
+ elsif line.start_with?("previous ")
+ # previous 1485b69e7b839a21436e81be6d3aa70def5ed341 initial-commit
+ # previous 9521e52704ee6100e7d2a76896a4ef0eb53ff1b8 "\303\2511\\\303\251\\303\\251\n"
+ # ^ char index 50
+ previous_paths[commit_id] = unquote_path(line[50..])
end
end
@@ -54,7 +73,13 @@ module Gitlab
# get it together
info.sort.each do |lineno, (commit_id, old_lineno)|
- final << BlameLine.new(lineno, old_lineno, commits[commit_id], lines[lineno - 1])
+ final << BlameLine.new(
+ lineno,
+ old_lineno,
+ commits[commit_id],
+ lines[lineno - start_line],
+ previous_paths[commit_id]
+ )
end
@lines = final
@@ -62,13 +87,14 @@ module Gitlab
end
class BlameLine
- attr_accessor :lineno, :oldlineno, :commit, :line
+ attr_accessor :lineno, :oldlineno, :commit, :line, :previous_path
- def initialize(lineno, oldlineno, commit, line)
+ def initialize(lineno, oldlineno, commit, line, previous_path)
@lineno = lineno
@oldlineno = oldlineno
@commit = commit
@line = line
+ @previous_path = previous_path
end
end
end
diff --git a/lib/gitlab/git/diff.rb b/lib/gitlab/git/diff.rb
index 8325eadce2f..a66517b4ca0 100644
--- a/lib/gitlab/git/diff.rb
+++ b/lib/gitlab/git/diff.rb
@@ -140,7 +140,7 @@ module Gitlab
text.start_with?(BINARY_NOTICE_PATTERN)
end
end
- def initialize(raw_diff, expanded: true)
+ def initialize(raw_diff, expanded: true, replace_invalid_utf8_chars: true)
@expanded = expanded
case raw_diff
@@ -157,6 +157,8 @@ module Gitlab
else
raise "Invalid raw diff type: #{raw_diff.class}"
end
+
+ encode_diff_to_utf8(replace_invalid_utf8_chars)
end
def to_hash
@@ -227,6 +229,13 @@ module Gitlab
private
+ def encode_diff_to_utf8(replace_invalid_utf8_chars)
+ return unless Feature.enabled?(:convert_diff_to_utf8_with_replacement_symbol, default_enabled: :yaml)
+ return unless replace_invalid_utf8_chars && !detect_binary?(@diff)
+
+ @diff = Gitlab::EncodingHelper.encode_utf8_with_replacement_character(@diff)
+ end
+
def init_from_hash(hash)
raw_diff = hash.symbolize_keys
diff --git a/lib/gitlab/git/diff_collection.rb b/lib/gitlab/git/diff_collection.rb
index 24b67424f28..0ffe8bee953 100644
--- a/lib/gitlab/git/diff_collection.rb
+++ b/lib/gitlab/git/diff_collection.rb
@@ -9,8 +9,6 @@ module Gitlab
attr_reader :limits
- delegate :max_files, :max_lines, :max_bytes, :safe_max_files, :safe_max_lines, :safe_max_bytes, to: :limits
-
def self.default_limits
{ max_files: ::Commit.diff_safe_max_files, max_lines: ::Commit.diff_safe_max_lines }
end
@@ -26,8 +24,7 @@ module Gitlab
limits[:safe_max_lines] = [limits[:max_lines], defaults[:max_lines]].min
limits[:safe_max_bytes] = limits[:safe_max_files] * 5.kilobytes # Average 5 KB per file
limits[:max_patch_bytes] = Gitlab::Git::Diff.patch_hard_limit_bytes
-
- OpenStruct.new(limits)
+ limits
end
def initialize(iterator, options = {})
@@ -140,11 +137,11 @@ module Gitlab
end
def over_safe_limits?(files)
- if files >= safe_max_files
+ if files >= limits[:safe_max_files]
@collapsed_safe_files = true
- elsif @line_count > safe_max_lines
+ elsif @line_count > limits[:safe_max_lines]
@collapsed_safe_lines = true
- elsif @byte_count >= safe_max_bytes
+ elsif @byte_count >= limits[:safe_max_bytes]
@collapsed_safe_bytes = true
end
@@ -179,7 +176,7 @@ module Gitlab
@iterator.each_with_index do |raw, iterator_index|
@empty = false
- if @enforce_limits && i >= max_files
+ if @enforce_limits && i >= limits[:max_files]
@overflow = true
@overflow_max_files = true
break
@@ -194,7 +191,7 @@ module Gitlab
@line_count += diff.line_count
@byte_count += diff.diff.bytesize
- if @enforce_limits && @line_count >= max_lines
+ if @enforce_limits && @line_count >= limits[:max_lines]
# This last Diff instance pushes us over the lines limit. We stop and
# discard it.
@overflow = true
@@ -202,7 +199,7 @@ module Gitlab
break
end
- if @enforce_limits && @byte_count >= max_bytes
+ if @enforce_limits && @byte_count >= limits[:max_bytes]
# This last Diff instance pushes us over the lines limit. We stop and
# discard it.
@overflow = true
diff --git a/lib/gitlab/git/ref.rb b/lib/gitlab/git/ref.rb
index 47cfb483509..1d7966a11ed 100644
--- a/lib/gitlab/git/ref.rb
+++ b/lib/gitlab/git/ref.rb
@@ -24,7 +24,7 @@ module Gitlab
# Ex.
# Ref.extract_branch_name('refs/heads/master') #=> 'master'
def self.extract_branch_name(str)
- str.gsub(%r{\Arefs/heads/}, '')
+ str.delete_prefix('refs/heads/')
end
def initialize(repository, name, target, dereferenced_target)
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index 1492ea1ce76..ab365069adf 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -841,11 +841,11 @@ module Gitlab
end
end
- def import_repository(url)
+ def import_repository(url, http_authorization_header: '', mirror: false)
raise ArgumentError, "don't use disk paths with import_repository: #{url.inspect}" if url.start_with?('.', '/')
wrapped_gitaly_errors do
- gitaly_repository_client.import_repository(url)
+ gitaly_repository_client.import_repository(url, http_authorization_header: http_authorization_header, mirror: mirror)
end
end
diff --git a/lib/gitlab/gitaly_client/commit_service.rb b/lib/gitlab/gitaly_client/commit_service.rb
index 0e3f9c2598d..4fe5c8df36f 100644
--- a/lib/gitlab/gitaly_client/commit_service.rb
+++ b/lib/gitlab/gitaly_client/commit_service.rb
@@ -315,11 +315,12 @@ module Gitlab
response.languages.map { |l| { value: l.share.round(2), label: l.name, color: l.color, highlight: l.color } }
end
- def raw_blame(revision, path)
+ def raw_blame(revision, path, range:)
request = Gitaly::RawBlameRequest.new(
repository: @gitaly_repo,
revision: encode_binary(revision),
- path: encode_binary(path)
+ path: encode_binary(path),
+ range: (encode_binary(range) if range)
)
response = GitalyClient.call(@repository.storage, :commit_service, :raw_blame, request, timeout: GitalyClient.medium_timeout)
@@ -466,7 +467,7 @@ module Gitlab
request_params[:ignore_whitespace_change] = options.fetch(:ignore_whitespace_change, false)
request_params[:enforce_limits] = options.fetch(:limits, true)
request_params[:collapse_diffs] = !options.fetch(:expanded, true)
- request_params.merge!(Gitlab::Git::DiffCollection.limits(options).to_h)
+ request_params.merge!(Gitlab::Git::DiffCollection.limits(options))
request = Gitaly::CommitDiffRequest.new(request_params)
response = GitalyClient.call(@repository.storage, :diff_service, :commit_diff, request, timeout: GitalyClient.medium_timeout)
diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb
index 5c447dfd417..1e199a55b5a 100644
--- a/lib/gitlab/gitaly_client/repository_service.rb
+++ b/lib/gitlab/gitaly_client/repository_service.rb
@@ -145,10 +145,12 @@ module Gitlab
)
end
- def import_repository(source)
+ def import_repository(source, http_authorization_header: '', mirror: false)
request = Gitaly::CreateRepositoryFromURLRequest.new(
repository: @gitaly_repo,
- url: source
+ url: source,
+ http_authorization_header: http_authorization_header,
+ mirror: mirror
)
GitalyClient.call(
diff --git a/lib/gitlab/github_import/object_counter.rb b/lib/gitlab/github_import/object_counter.rb
index 7ce88280209..8873db24118 100644
--- a/lib/gitlab/github_import/object_counter.rb
+++ b/lib/gitlab/github_import/object_counter.rb
@@ -24,6 +24,8 @@ module Gitlab
increment_project_counter(project, object_type, operation, integer)
increment_global_counter(object_type, operation, integer)
+
+ project.import_state&.expire_etag_cache
end
def summary(project)
diff --git a/lib/gitlab/github_import/parallel_scheduling.rb b/lib/gitlab/github_import/parallel_scheduling.rb
index 4dec9543a13..97de2a49e72 100644
--- a/lib/gitlab/github_import/parallel_scheduling.rb
+++ b/lib/gitlab/github_import/parallel_scheduling.rb
@@ -72,7 +72,7 @@ module Gitlab
# Imports all objects in parallel by scheduling a Sidekiq job for every
# individual object.
def parallel_import
- if Feature.enabled?(:spread_parallel_import, default_enabled: :yaml) && parallel_import_batch.present?
+ if parallel_import_batch.present?
spread_parallel_import
else
parallel_import_deprecated
@@ -209,7 +209,11 @@ module Gitlab
# Default batch settings for parallel import (can be redefined in Importer classes)
# Example: { size: 100, delay: 1.minute }
def parallel_import_batch
- {}
+ if Feature.enabled?(:distribute_github_parallel_import, default_enabled: :yaml)
+ { size: 1000, delay: 1.minute }
+ else
+ {}
+ end
end
def abort_on_failure
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 9f18513f066..3c85d56874f 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -53,13 +53,13 @@ module Gitlab
# made globally available to the frontend
push_frontend_feature_flag(:usage_data_api, type: :ops, default_enabled: :yaml)
push_frontend_feature_flag(:security_auto_fix, default_enabled: false)
- push_frontend_feature_flag(:improved_emoji_picker, default_enabled: :yaml)
push_frontend_feature_flag(:new_header_search, default_enabled: :yaml)
push_frontend_feature_flag(:bootstrap_confirmation_modals, default_enabled: :yaml)
push_frontend_feature_flag(:sandboxed_mermaid, default_enabled: :yaml)
push_frontend_feature_flag(:source_editor_toolbar, default_enabled: :yaml)
push_frontend_feature_flag(:gl_avatar_for_all_user_avatars, default_enabled: :yaml)
push_frontend_feature_flag(:mr_attention_requests, default_enabled: :yaml)
+ push_frontend_feature_flag(:markdown_continue_lists, default_enabled: :yaml)
end
# Exposes the state of a feature flag to the frontend code.
@@ -73,6 +73,15 @@ module Gitlab
push_to_gon_attributes(:features, name, enabled)
end
+ # Exposes the state of a feature flag to the frontend code.
+ # Can be used for more complex feature flag checks.
+ #
+ # name - The name of the feature flag, e.g. `my_feature`.
+ # enabled - Boolean to be pushed directly to the frontend. Should be fetched by checking a feature flag.
+ def push_force_frontend_feature_flag(name, enabled)
+ push_to_gon_attributes(:features, name, !!enabled)
+ end
+
def push_to_gon_attributes(key, name, enabled)
var_name = name.to_s.camelize(:lower)
# Here the `true` argument signals gon that the value should be merged
diff --git a/lib/gitlab/graphql/deprecation.rb b/lib/gitlab/graphql/deprecation.rb
index 20068758502..3335e511714 100644
--- a/lib/gitlab/graphql/deprecation.rb
+++ b/lib/gitlab/graphql/deprecation.rb
@@ -5,7 +5,7 @@ module Gitlab
class Deprecation
REASONS = {
renamed: 'This was renamed.',
- discouraged: 'Use of this is not recommended.'
+ alpha: 'This feature is in Alpha, and can be removed or changed at any point.'
}.freeze
include ActiveModel::Validations
diff --git a/lib/gitlab/graphql/known_operations.rb b/lib/gitlab/graphql/known_operations.rb
index ead52935945..a551c9bb6da 100644
--- a/lib/gitlab/graphql/known_operations.rb
+++ b/lib/gitlab/graphql/known_operations.rb
@@ -14,7 +14,6 @@ module Gitlab
end
end
- ANONYMOUS = Operation.new("anonymous").freeze
UNKNOWN = Operation.new("unknown").freeze
def self.default
@@ -24,7 +23,7 @@ module Gitlab
def initialize(operation_names)
@operation_hash = operation_names
.map { |name| Operation.new(name).freeze }
- .concat([ANONYMOUS, UNKNOWN])
+ .concat([UNKNOWN])
.index_by(&:name)
end
@@ -32,7 +31,7 @@ module Gitlab
def from_query(query)
operation_name = query.selected_operation_name
- return ANONYMOUS unless operation_name
+ return UNKNOWN unless operation_name
@operation_hash[operation_name] || UNKNOWN
end
diff --git a/lib/gitlab/graphql/pagination/active_record_array_connection.rb b/lib/gitlab/graphql/pagination/active_record_array_connection.rb
new file mode 100644
index 00000000000..9e40f79b2fd
--- /dev/null
+++ b/lib/gitlab/graphql/pagination/active_record_array_connection.rb
@@ -0,0 +1,90 @@
+# frozen_string_literal: true
+
+# Connection for an array of Active Record instances.
+# Resolvers needs to handle cursors (before and after).
+# This connection will handle (first and last).
+# Supports batch loaded items.
+# Expects the array to use a fixed DESC order. This is similar to
+# ExternallyPaginatedArrayConnection.
+module Gitlab
+ module Graphql
+ module Pagination
+ class ActiveRecordArrayConnection < GraphQL::Pagination::ArrayConnection
+ include ::Gitlab::Graphql::ConnectionCollectionMethods
+ prepend ::Gitlab::Graphql::ConnectionRedaction
+
+ delegate :<<, to: :items
+
+ def nodes
+ load_nodes
+
+ @nodes
+ end
+
+ def next_page?
+ load_nodes
+
+ if before
+ true
+ elsif first
+ limit_value < items.size
+ else
+ false
+ end
+ end
+
+ def previous_page?
+ load_nodes
+
+ if after
+ true
+ elsif last
+ limit_value < items.size
+ else
+ false
+ end
+ end
+
+ # see https://graphql-ruby.org/pagination/custom_connections#connection-wrapper
+ alias_method :has_next_page, :next_page?
+ alias_method :has_previous_page, :previous_page?
+
+ def cursor_for(item)
+ # item could be a batch loaded item. Sync it to have the id.
+ cursor = { 'id' => Gitlab::Graphql::Lazy.force(item).id.to_s }
+ encode(cursor.to_json)
+ end
+
+ # Part of the implied interface for default objects for BatchLoader: objects must be clonable
+ def dup
+ self.class.new(
+ items.dup,
+ first: first,
+ after: after,
+ max_page_size: max_page_size,
+ last: last,
+ before: before
+ )
+ end
+
+ private
+
+ def limit_value
+ # note: only first _or_ last can be specified, not both
+ @limit_value ||= [first, last, max_page_size].compact.min
+ end
+
+ def load_nodes
+ @nodes ||= begin
+ limited_nodes = items
+
+ limited_nodes = limited_nodes.first(first) if first
+ limited_nodes = limited_nodes.last(last) if last
+
+ limited_nodes
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphql/pagination/keyset/connection.rb b/lib/gitlab/graphql/pagination/keyset/connection.rb
index 61903c566f0..c284160e539 100644
--- a/lib/gitlab/graphql/pagination/keyset/connection.rb
+++ b/lib/gitlab/graphql/pagination/keyset/connection.rb
@@ -14,10 +14,6 @@
# Issue.order(created_at: :asc).order(:id)
# Issue.order(due_date: :asc)
#
-# You can also use `Gitlab::Database.nulls_last_order`:
-#
-# Issue.reorder(::Gitlab::Database.nulls_last_order('due_date', 'DESC'))
-#
# It will tolerate non-attribute ordering, but only attributes determine the cursor.
# For example, this is legitimate:
#
diff --git a/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb b/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
index e8335a3c79c..bf9b73d918a 100644
--- a/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
+++ b/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
@@ -73,9 +73,24 @@ module Gitlab
strong_memoize(:generic_keyset_pagination_items) do
rebuilt_items_with_keyset_order, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(original_items)
- success ? rebuilt_items_with_keyset_order : original_items
+ if success
+ rebuilt_items_with_keyset_order
+ else
+ if original_items.is_a?(ActiveRecord::Relation)
+ old_keyset_pagination_usage.increment({ model: original_items.model.to_s })
+ end
+
+ original_items
+ end
end
end
+
+ def old_keyset_pagination_usage
+ @old_keyset_pagination_usage ||= Gitlab::Metrics.counter(
+ :old_keyset_pagination_usage,
+ 'The number of times the old keyset pagination code was used'
+ )
+ end
end
end
end
diff --git a/lib/gitlab/graphql/project/dast_profile_connection_extension.rb b/lib/gitlab/graphql/project/dast_profile_connection_extension.rb
index a3c3f2f2b7e..45f90de2f17 100644
--- a/lib/gitlab/graphql/project/dast_profile_connection_extension.rb
+++ b/lib/gitlab/graphql/project/dast_profile_connection_extension.rb
@@ -2,7 +2,7 @@
module Gitlab
module Graphql
module Project
- class DastProfileConnectionExtension < GraphQL::Schema::Field::ConnectionExtension
+ class DastProfileConnectionExtension < GraphQL::Schema::FieldExtension
def after_resolve(value:, object:, context:, **rest)
preload_authorizations(context[:project_dast_profiles])
context[:project_dast_profiles] = nil
diff --git a/lib/gitlab/hook_data/issuable_builder.rb b/lib/gitlab/hook_data/issuable_builder.rb
index 5c8aa5050ed..add9e880475 100644
--- a/lib/gitlab/hook_data/issuable_builder.rb
+++ b/lib/gitlab/hook_data/issuable_builder.rb
@@ -13,7 +13,7 @@ module Gitlab
event_type: event_type,
user: user.hook_attrs,
project: issuable.project.hook_attrs,
- object_attributes: issuable.hook_attrs,
+ object_attributes: issuable_builder.new(issuable).build,
labels: issuable.labels.map(&:hook_attrs),
changes: final_changes(changes.slice(*safe_keys)),
# DEPRECATED
@@ -53,10 +53,7 @@ module Gitlab
end
def final_changes(changes_hash)
- changes_hash.reduce({}) do |hash, (key, changes_array)|
- hash[key] = Hash[CHANGES_KEYS.zip(changes_array)]
- hash
- end
+ changes_hash.transform_values { |changes_array| Hash[CHANGES_KEYS.zip(changes_array)] }
end
end
end
diff --git a/lib/gitlab/hook_data/merge_request_builder.rb b/lib/gitlab/hook_data/merge_request_builder.rb
index aaca16d8d7c..06ddd65d075 100644
--- a/lib/gitlab/hook_data/merge_request_builder.rb
+++ b/lib/gitlab/hook_data/merge_request_builder.rb
@@ -60,6 +60,7 @@ module Gitlab
human_time_estimate: merge_request.human_time_estimate,
assignee_ids: merge_request.assignee_ids,
assignee_id: merge_request.assignee_ids.first, # This key is deprecated
+ labels: merge_request.labels_hook_attrs,
state: merge_request.state, # This key is deprecated
blocking_discussions_resolved: merge_request.mergeable_discussions_state?
}
diff --git a/lib/gitlab/http_connection_adapter.rb b/lib/gitlab/http_connection_adapter.rb
index 002708beb3c..7b1657d3854 100644
--- a/lib/gitlab/http_connection_adapter.rb
+++ b/lib/gitlab/http_connection_adapter.rb
@@ -29,17 +29,13 @@ module Gitlab
http = super
http.hostname_override = hostname if hostname
- if Feature.enabled?(:header_read_timeout_buffered_io, default_enabled: :yaml)
- gitlab_http = Gitlab::NetHttpAdapter.new(http.address, http.port)
+ gitlab_http = Gitlab::NetHttpAdapter.new(http.address, http.port)
- http.instance_variables.each do |variable|
- gitlab_http.instance_variable_set(variable, http.instance_variable_get(variable))
- end
-
- return gitlab_http
+ http.instance_variables.each do |variable|
+ gitlab_http.instance_variable_set(variable, http.instance_variable_get(variable))
end
- http
+ gitlab_http
end
private
diff --git a/lib/gitlab/i18n.rb b/lib/gitlab/i18n.rb
index d01f7d0074f..8b775d567c8 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' => 46,
- 'de' => 15,
+ 'da_DK' => 44,
+ 'de' => 14,
'en' => 100,
'eo' => 0,
- 'es' => 40,
+ 'es' => 39,
'fil_PH' => 0,
- 'fr' => 11,
+ 'fr' => 10,
'gl_ES' => 0,
'id_ID' => 0,
- 'it' => 2,
+ 'it' => 1,
'ja' => 34,
'ko' => 12,
- 'nb_NO' => 30,
+ 'nb_NO' => 29,
'nl_NL' => 0,
'pl_PL' => 4,
- 'pt_BR' => 49,
- 'ro_RO' => 22,
- 'ru' => 32,
- 'tr_TR' => 14,
- 'uk' => 48,
- 'zh_CN' => 95,
+ 'pt_BR' => 50,
+ 'ro_RO' => 36,
+ 'ru' => 31,
+ 'tr_TR' => 13,
+ 'uk' => 46,
+ 'zh_CN' => 97,
'zh_HK' => 2,
'zh_TW' => 2
}.freeze
diff --git a/lib/gitlab/i18n/po_linter.rb b/lib/gitlab/i18n/po_linter.rb
index 3bb34ab2811..74be56df221 100644
--- a/lib/gitlab/i18n/po_linter.rb
+++ b/lib/gitlab/i18n/po_linter.rb
@@ -248,10 +248,9 @@ module Gitlab
variable == '%d' ? Random.rand(1000) : Gitlab::Utils.random_string
end
else
- variables.inject({}) do |hash, variable|
+ variables.each_with_object({}) do |variable, hash|
variable_name = variable[/\w+/]
hash[variable_name] = Gitlab::Utils.random_string
- hash
end
end
end
diff --git a/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy.rb b/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy.rb
index b43d0a0c3eb..e38496ecf67 100644
--- a/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy.rb
+++ b/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy.rb
@@ -17,11 +17,11 @@ module Gitlab
public
def initialize(attributes = {})
- @options = OpenStruct.new(attributes)
+ @options = attributes
+ end
- self.class.instance_eval do
- def_delegators :@options, *attributes.keys
- end
+ def method_missing(method, *args)
+ @options[method]
end
def execute(current_user, project)
diff --git a/lib/gitlab/import_export/avatar_saver.rb b/lib/gitlab/import_export/avatar_saver.rb
index 7534ab5a9ce..db90886ad11 100644
--- a/lib/gitlab/import_export/avatar_saver.rb
+++ b/lib/gitlab/import_export/avatar_saver.rb
@@ -3,19 +3,23 @@
module Gitlab
module ImportExport
class AvatarSaver
+ include DurationMeasuring
+
def initialize(project:, shared:)
@project = project
@shared = shared
end
def save
- return true unless @project.avatar.exists?
+ with_duration_measuring do
+ break true unless @project.avatar.exists?
- Gitlab::ImportExport::UploadsManager.new(
- project: @project,
- shared: @shared,
- relative_export_path: 'avatar'
- ).save
+ Gitlab::ImportExport::UploadsManager.new(
+ project: @project,
+ shared: @shared,
+ relative_export_path: 'avatar'
+ ).save
+ end
rescue StandardError => e
@shared.error(e)
false
diff --git a/lib/gitlab/import_export/command_line_util.rb b/lib/gitlab/import_export/command_line_util.rb
index 2b0467d8779..64ef3dd4830 100644
--- a/lib/gitlab/import_export/command_line_util.rb
+++ b/lib/gitlab/import_export/command_line_util.rb
@@ -66,7 +66,7 @@ module Gitlab
current_size = 0
Gitlab::HTTP.get(url, stream_body: true, allow_object_storage: true) do |fragment|
- if [301, 302, 307].include?(fragment.code)
+ if [301, 302, 303, 307].include?(fragment.code)
Gitlab::Import::Logger.warn(message: "received redirect fragment", fragment_code: fragment.code)
elsif fragment.code == 200
current_size += fragment.bytesize
diff --git a/lib/gitlab/import_export/duration_measuring.rb b/lib/gitlab/import_export/duration_measuring.rb
new file mode 100644
index 00000000000..c192be6ae29
--- /dev/null
+++ b/lib/gitlab/import_export/duration_measuring.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ImportExport
+ module DurationMeasuring
+ extend ActiveSupport::Concern
+
+ included do
+ attr_reader :duration_s
+
+ def with_duration_measuring
+ result = nil
+
+ @duration_s = Benchmark.realtime do
+ result = yield
+ end
+
+ result
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/import_export/fast_hash_serializer.rb b/lib/gitlab/import_export/fast_hash_serializer.rb
index e5d52f945b5..d049609187b 100644
--- a/lib/gitlab/import_export/fast_hash_serializer.rb
+++ b/lib/gitlab/import_export/fast_hash_serializer.rb
@@ -92,7 +92,7 @@ module Gitlab
def simple_serialize
subject.as_json(
- tree.merge(include: nil, preloads: nil))
+ tree.merge(include: nil, preloads: nil, unsafe: true))
end
def serialize_includes
diff --git a/lib/gitlab/import_export/json/streaming_serializer.rb b/lib/gitlab/import_export/json/streaming_serializer.rb
index 55b8c1d4531..ebabf537ce5 100644
--- a/lib/gitlab/import_export/json/streaming_serializer.rb
+++ b/lib/gitlab/import_export/json/streaming_serializer.rb
@@ -37,7 +37,7 @@ module Gitlab
def serialize_root(exportable_path = @exportable_path)
attributes = exportable.as_json(
- relations_schema.merge(include: nil, preloads: nil))
+ relations_schema.merge(include: nil, preloads: nil, unsafe: true))
json_writer.write_attributes(exportable_path, attributes)
end
@@ -145,8 +145,8 @@ module Gitlab
arel_order_classes = ::Gitlab::Pagination::Keyset::ColumnOrderDefinition::AREL_ORDER_CLASSES.invert
reverse_direction = ::Gitlab::Pagination::Keyset::ColumnOrderDefinition::REVERSED_ORDER_DIRECTIONS[direction]
reverse_nulls_position = ::Gitlab::Pagination::Keyset::ColumnOrderDefinition::REVERSED_NULL_POSITIONS[nulls_position]
- order_expression = ::Gitlab::Database.nulls_order(column, direction, nulls_position)
- reverse_order_expression = ::Gitlab::Database.nulls_order(column, reverse_direction, reverse_nulls_position)
+ order_expression = arel_table[column].public_send(direction).public_send(nulls_position) # rubocop:disable GitlabSecurity/PublicSend
+ reverse_order_expression = arel_table[column].public_send(reverse_direction).public_send(reverse_nulls_position) # rubocop:disable GitlabSecurity/PublicSend
::Gitlab::Pagination::Keyset::Order.build([
::Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
diff --git a/lib/gitlab/import_export/lfs_saver.rb b/lib/gitlab/import_export/lfs_saver.rb
index 47acd49d529..22a7a8dd7cd 100644
--- a/lib/gitlab/import_export/lfs_saver.rb
+++ b/lib/gitlab/import_export/lfs_saver.rb
@@ -4,6 +4,7 @@ module Gitlab
module ImportExport
class LfsSaver
include Gitlab::ImportExport::CommandLineUtil
+ include DurationMeasuring
attr_accessor :lfs_json, :project, :shared
@@ -16,17 +17,19 @@ module Gitlab
end
def save
- project.lfs_objects.find_in_batches(batch_size: BATCH_SIZE) do |batch|
- batch.each do |lfs_object|
- save_lfs_object(lfs_object)
- end
+ with_duration_measuring do
+ project.lfs_objects.find_in_batches(batch_size: BATCH_SIZE) do |batch|
+ batch.each do |lfs_object|
+ save_lfs_object(lfs_object)
+ end
- append_lfs_json_for_batch(batch)
- end
+ append_lfs_json_for_batch(batch)
+ end
- write_lfs_json
+ write_lfs_json
- true
+ true
+ end
rescue StandardError => e
shared.error(e)
diff --git a/lib/gitlab/import_export/members_mapper.rb b/lib/gitlab/import_export/members_mapper.rb
index d3b1bb6a57d..b1f2a17d4b7 100644
--- a/lib/gitlab/import_export/members_mapper.rb
+++ b/lib/gitlab/import_export/members_mapper.rb
@@ -16,7 +16,7 @@ module Gitlab
def map
@map ||=
begin
- @exported_members.inject(missing_keys_tracking_hash) do |hash, member|
+ @exported_members.each_with_object(missing_keys_tracking_hash) do |member, hash|
if member['user']
old_user_id = member['user']['id']
existing_user_id = existing_users_email_map[get_email(member)]
@@ -24,8 +24,6 @@ module Gitlab
else
add_team_member(member)
end
-
- hash
end
end
end
diff --git a/lib/gitlab/import_export/project/tree_saver.rb b/lib/gitlab/import_export/project/tree_saver.rb
index aafed850afa..63c5afa9595 100644
--- a/lib/gitlab/import_export/project/tree_saver.rb
+++ b/lib/gitlab/import_export/project/tree_saver.rb
@@ -4,6 +4,8 @@ module Gitlab
module ImportExport
module Project
class TreeSaver
+ include DurationMeasuring
+
attr_reader :full_path
def initialize(project:, current_user:, shared:, params: {}, logger: Gitlab::Import::Logger)
@@ -15,9 +17,11 @@ module Gitlab
end
def save
- stream_export
+ with_duration_measuring do
+ stream_export
- true
+ true
+ end
rescue StandardError => e
@shared.error(e)
false
diff --git a/lib/gitlab/import_export/repo_saver.rb b/lib/gitlab/import_export/repo_saver.rb
index fae07039139..454e84bbc04 100644
--- a/lib/gitlab/import_export/repo_saver.rb
+++ b/lib/gitlab/import_export/repo_saver.rb
@@ -4,6 +4,7 @@ module Gitlab
module ImportExport
class RepoSaver
include Gitlab::ImportExport::CommandLineUtil
+ include DurationMeasuring
attr_reader :exportable, :shared
@@ -13,9 +14,12 @@ module Gitlab
end
def save
- return true unless repository_exists? # it's ok to have no repo
+ with_duration_measuring do
+ # it's ok to have no repo
+ break true unless repository_exists?
- bundle_to_disk
+ bundle_to_disk
+ end
end
def repository
diff --git a/lib/gitlab/import_export/snippets_repo_saver.rb b/lib/gitlab/import_export/snippets_repo_saver.rb
index d3b0fe1c18c..ca0d38272e5 100644
--- a/lib/gitlab/import_export/snippets_repo_saver.rb
+++ b/lib/gitlab/import_export/snippets_repo_saver.rb
@@ -4,6 +4,7 @@ module Gitlab
module ImportExport
class SnippetsRepoSaver
include Gitlab::ImportExport::CommandLineUtil
+ include DurationMeasuring
def initialize(current_user:, project:, shared:)
@project = project
@@ -12,13 +13,15 @@ module Gitlab
end
def save
- create_snippets_repo_directory
+ with_duration_measuring do
+ create_snippets_repo_directory
- @project.snippets.find_each.all? do |snippet|
- Gitlab::ImportExport::SnippetRepoSaver.new(project: @project,
- shared: @shared,
- repository: snippet.repository)
- .save
+ @project.snippets.find_each.all? do |snippet|
+ Gitlab::ImportExport::SnippetRepoSaver.new(project: @project,
+ shared: @shared,
+ repository: snippet.repository)
+ .save
+ end
end
end
diff --git a/lib/gitlab/import_export/uploads_saver.rb b/lib/gitlab/import_export/uploads_saver.rb
index 9f58609fa17..05132fd3edd 100644
--- a/lib/gitlab/import_export/uploads_saver.rb
+++ b/lib/gitlab/import_export/uploads_saver.rb
@@ -3,16 +3,20 @@
module Gitlab
module ImportExport
class UploadsSaver
+ include DurationMeasuring
+
def initialize(project:, shared:)
@project = project
@shared = shared
end
def save
- Gitlab::ImportExport::UploadsManager.new(
- project: @project,
- shared: @shared
- ).save
+ with_duration_measuring do
+ Gitlab::ImportExport::UploadsManager.new(
+ project: @project,
+ shared: @shared
+ ).save
+ end
rescue StandardError => e
@shared.error(e)
false
diff --git a/lib/gitlab/import_export/version_saver.rb b/lib/gitlab/import_export/version_saver.rb
index e8f68f93af0..db5040ec0f6 100644
--- a/lib/gitlab/import_export/version_saver.rb
+++ b/lib/gitlab/import_export/version_saver.rb
@@ -4,17 +4,20 @@ module Gitlab
module ImportExport
class VersionSaver
include Gitlab::ImportExport::CommandLineUtil
+ include DurationMeasuring
def initialize(shared:)
@shared = shared
end
def save
- mkdir_p(@shared.export_path)
+ with_duration_measuring do
+ mkdir_p(@shared.export_path)
- File.write(version_file, Gitlab::ImportExport.version, mode: 'w')
- File.write(gitlab_version_file, Gitlab::VERSION, mode: 'w')
- File.write(gitlab_revision_file, Gitlab.revision, mode: 'w')
+ File.write(version_file, Gitlab::ImportExport.version, mode: 'w')
+ File.write(gitlab_version_file, Gitlab::VERSION, mode: 'w')
+ File.write(gitlab_revision_file, Gitlab.revision, mode: 'w')
+ end
rescue StandardError => e
@shared.error(e)
false
diff --git a/lib/gitlab/insecure_key_fingerprint.rb b/lib/gitlab/insecure_key_fingerprint.rb
index ef342f3819f..43ad64603a6 100644
--- a/lib/gitlab/insecure_key_fingerprint.rb
+++ b/lib/gitlab/insecure_key_fingerprint.rb
@@ -11,19 +11,12 @@ module Gitlab
class InsecureKeyFingerprint
attr_accessor :key
- alias_attribute :fingerprint_md5, :fingerprint
-
- #
# Gets the base64 encoded string representing a rsa or dsa key
#
def initialize(key_base64)
@key = key_base64
end
- def fingerprint
- OpenSSL::Digest::MD5.hexdigest(Base64.decode64(@key)).scan(/../).join(':')
- end
-
def fingerprint_sha256
Digest::SHA256.base64digest(Base64.decode64(@key)).scan(/../).join('').delete("=")
end
diff --git a/lib/gitlab/integrations/sti_type.rb b/lib/gitlab/integrations/sti_type.rb
index 82c2b3297c1..f347db7bc8c 100644
--- a/lib/gitlab/integrations/sti_type.rb
+++ b/lib/gitlab/integrations/sti_type.rb
@@ -3,12 +3,12 @@
module Gitlab
module Integrations
class StiType < ActiveRecord::Type::String
- NAMESPACED_INTEGRATIONS = Set.new(%w(
+ NAMESPACED_INTEGRATIONS = %w[
Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog
Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Harbor Irker Jenkins Jira Mattermost
MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker
Prometheus Pushover Redmine Shimo Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack Zentao
- )).freeze
+ ].to_set.freeze
def self.namespaced_integrations
NAMESPACED_INTEGRATIONS
diff --git a/lib/gitlab/lazy.rb b/lib/gitlab/lazy.rb
index d7a22aa339e..c589d613efc 100644
--- a/lib/gitlab/lazy.rb
+++ b/lib/gitlab/lazy.rb
@@ -15,10 +15,10 @@ module Gitlab
@block = block
end
- def method_missing(name, *args, &block)
+ def method_missing(...)
__evaluate__
- @result.__send__(name, *args, &block) # rubocop:disable GitlabSecurity/PublicSend
+ @result.__send__(...) # rubocop:disable GitlabSecurity/PublicSend
end
def respond_to_missing?(name, include_private = false)
diff --git a/lib/gitlab/lfs_token.rb b/lib/gitlab/lfs_token.rb
index 03655eb7237..89b0f0c802f 100644
--- a/lib/gitlab/lfs_token.rb
+++ b/lib/gitlab/lfs_token.rb
@@ -99,7 +99,7 @@ module Gitlab
case actor
when DeployKey, Key
# Since fingerprint is based on the public key, let's take more bytes from attr_encrypted_db_key_base
- actor.fingerprint.delete(':').first(16) + Settings.attr_encrypted_db_key_base_32
+ actor.fingerprint_sha256.first(16) + Settings.attr_encrypted_db_key_base_32
when User
# Take the last 16 characters as they're more unique than the first 16
actor.id.to_s + actor.encrypted_password.last(16) + Settings.attr_encrypted_db_key_base.first(16)
diff --git a/lib/gitlab/omniauth_initializer.rb b/lib/gitlab/omniauth_initializer.rb
index f4984e11c14..51277497c99 100644
--- a/lib/gitlab/omniauth_initializer.rb
+++ b/lib/gitlab/omniauth_initializer.rb
@@ -38,6 +38,10 @@ module Gitlab
end
end
+ def full_host
+ proc { |_env| Settings.gitlab['base_url'] }
+ end
+
private
def cas3_signout_handler
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 065a3a0cf20..8c0f082f61c 100644
--- a/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb
+++ b/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb
@@ -120,7 +120,7 @@ module Gitlab
.from(array_cte)
.join(Arel.sql("LEFT JOIN LATERAL (#{initial_keyset_query.to_sql}) #{table_name} ON TRUE"))
- order_by_columns.each { |column| q.where(column.column_expression.not_eq(nil)) }
+ order_by_columns.each { |c| q.where(c.column_expression.not_eq(nil)) unless c.column.nullable? }
q.as('array_scope_lateral_query')
end
@@ -200,7 +200,7 @@ module Gitlab
.project([*order_by_columns.original_column_names_as_arel_string, Arel.sql('position')])
.from("UNNEST(#{list(order_by_columns.array_aggregated_column_names)}) WITH ORDINALITY AS u(#{list(order_by_columns.original_column_names)}, position)")
- order_by_columns.each { |column| q.where(Arel.sql(column.original_column_name).not_eq(nil)) } # ignore rows where all columns are NULL
+ order_by_columns.each { |c| q.where(Arel.sql(c.original_column_name).not_eq(nil)) unless c.column.nullable? } # ignore rows where all columns are NULL
q.order(Arel.sql(order_by_without_table_references)).take(1)
end
diff --git a/lib/gitlab/pagination/keyset/order.rb b/lib/gitlab/pagination/keyset/order.rb
index 1a00692bdbe..290e94401b8 100644
--- a/lib/gitlab/pagination/keyset/order.rb
+++ b/lib/gitlab/pagination/keyset/order.rb
@@ -99,6 +99,8 @@ module Gitlab
field_value.strftime('%Y-%m-%d %H:%M:%S.%N %Z')
elsif field_value.nil?
nil
+ elsif lower_named_function?(column_definition)
+ field_value.downcase
else
field_value.to_s
end
@@ -184,6 +186,10 @@ module Gitlab
private
+ def lower_named_function?(column_definition)
+ column_definition.column_expression.is_a?(Arel::Nodes::NamedFunction) && column_definition.column_expression.name&.downcase == 'lower'
+ end
+
def composite_row_comparison_possible?
!column_definitions.one? &&
column_definitions.all?(&:not_nullable?) &&
diff --git a/lib/gitlab/pagination/keyset/simple_order_builder.rb b/lib/gitlab/pagination/keyset/simple_order_builder.rb
index 5e79910a3e9..c36bd497aa3 100644
--- a/lib/gitlab/pagination/keyset/simple_order_builder.rb
+++ b/lib/gitlab/pagination/keyset/simple_order_builder.rb
@@ -11,13 +11,17 @@ module Gitlab
# [transformed_scope, true] # true indicates that the new scope was successfully built
# [orginal_scope, false] # false indicates that the order values are not supported in this class
class SimpleOrderBuilder
+ NULLS_ORDER_REGEX = /(?<column_name>.*) (?<direction>\bASC\b|\bDESC\b) (?<nullable>\bNULLS LAST\b|\bNULLS FIRST\b)/.freeze
+
def self.build(scope)
new(scope: scope).build
end
def initialize(scope:)
@scope = scope
- @order_values = scope.order_values
+ # We need to run 'compact' because 'nil' is not removed from order_values
+ # in some cases due to the use of 'default_scope'.
+ @order_values = scope.order_values.compact
@model_class = scope.model
@arel_table = @model_class.arel_table
@primary_key = @model_class.primary_key
@@ -28,10 +32,13 @@ module Gitlab
primary_key_descending_order
elsif Gitlab::Pagination::Keyset::Order.keyset_aware?(scope)
Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope)
+ # Ordered by a primary key. Ex. 'ORDER BY id'.
elsif ordered_by_primary_key?
primary_key_order
+ # Ordered by one non-primary table column. Ex. 'ORDER BY created_at'.
elsif ordered_by_other_column?
column_with_tie_breaker_order
+ # Ordered by two table columns with the last column as a tie breaker. Ex. 'ORDER BY created, id ASC'.
elsif ordered_by_other_column_with_tie_breaker?
tie_breaker_attribute = order_values.second
@@ -50,6 +57,77 @@ module Gitlab
attr_reader :scope, :order_values, :model_class, :arel_table, :primary_key
+ def table_column?(name)
+ model_class.column_names.include?(name.to_s)
+ end
+
+ def primary_key?(attribute)
+ arel_table[primary_key].to_s == attribute.to_s
+ end
+
+ def lower_named_function?(attribute)
+ attribute.is_a?(Arel::Nodes::NamedFunction) && attribute.name&.downcase == 'lower'
+ end
+
+ def arel_nulls?(order_value)
+ return unless order_value.is_a?(Arel::Nodes::NullsLast) || order_value.is_a?(Arel::Nodes::NullsFirst)
+
+ column_name = order_value.try(:expr).try(:expr).try(:name)
+
+ table_column?(column_name)
+ end
+
+ def supported_column?(order_value)
+ return true if arel_nulls?(order_value)
+
+ attribute = order_value.try(:expr)
+ return unless attribute
+
+ if lower_named_function?(attribute)
+ attribute.expressions.one? && attribute.expressions.first.respond_to?(:name) && table_column?(attribute.expressions.first.name)
+ else
+ attribute.respond_to?(:name) && table_column?(attribute.name)
+ end
+ end
+
+ # This method converts the first order value to a corresponding arel expression
+ # if the order value uses either NULLS LAST or NULLS FIRST ordering in raw SQL.
+ #
+ # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/356644
+ # We should stop matching raw literals once we switch to using the Arel methods.
+ def convert_raw_nulls_order!
+ order_value = order_values.first
+
+ return unless order_value.is_a?(Arel::Nodes::SqlLiteral)
+
+ # Detect NULLS LAST or NULLS FIRST ordering by looking at the raw SQL string.
+ if matches = order_value.match(NULLS_ORDER_REGEX)
+ return unless table_column?(matches[:column_name])
+
+ column_attribute = arel_table[matches[:column_name]]
+ direction = matches[:direction].downcase.to_sym
+ nullable = matches[:nullable].downcase.parameterize(separator: '_').to_sym
+
+ # Build an arel order expression for NULLS ordering.
+ order = direction == :desc ? column_attribute.desc : column_attribute.asc
+ arel_order_expression = nullable == :nulls_first ? order.nulls_first : order.nulls_last
+
+ order_values[0] = arel_order_expression
+ end
+ end
+
+ def nullability(order_value, attribute_name)
+ nullable = model_class.columns.find { |column| column.name == attribute_name }.null
+
+ if nullable && order_value.is_a?(Arel::Nodes::Ascending)
+ :nulls_last
+ elsif nullable && order_value.is_a?(Arel::Nodes::Descending)
+ :nulls_first
+ else
+ :not_nullable
+ end
+ end
+
def primary_key_descending_order
Gitlab::Pagination::Keyset::Order.build([
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
@@ -69,63 +147,76 @@ module Gitlab
end
def column_with_tie_breaker_order(tie_breaker_column_order = default_tie_breaker_column_order)
- order_expression = order_values.first
- attribute_name = order_expression.expr.name
-
- column_nullable = model_class.columns.find { |column| column.name == attribute_name }.null
-
- nullable = if column_nullable && order_expression.is_a?(Arel::Nodes::Ascending)
- :nulls_last
- elsif column_nullable && order_expression.is_a?(Arel::Nodes::Descending)
- :nulls_first
- else
- :not_nullable
- end
-
Gitlab::Pagination::Keyset::Order.build([
- Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
- attribute_name: attribute_name,
- order_expression: order_expression,
- nullable: nullable,
- distinct: false
- ),
+ column(order_values.first),
tie_breaker_column_order
])
end
- def ordered_by_primary_key?
- return unless order_values.one?
+ def column(order_value)
+ return nulls_order_column(order_value) if arel_nulls?(order_value)
+ return lower_named_function_column(order_value) if lower_named_function?(order_value.expr)
- attribute = order_values.first.try(:expr)
+ attribute_name = order_value.expr.name
- return unless attribute
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: attribute_name,
+ order_expression: order_value,
+ nullable: nullability(order_value, attribute_name),
+ distinct: false
+ )
+ end
- arel_table[primary_key].to_s == attribute.to_s
+ def nulls_order_column(order_value)
+ attribute = order_value.expr.expr
+
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: attribute.name,
+ column_expression: attribute,
+ order_expression: order_value,
+ reversed_order_expression: order_value.reverse,
+ order_direction: order_value.expr.direction,
+ nullable: order_value.is_a?(Arel::Nodes::NullsLast) ? :nulls_last : :nulls_first,
+ distinct: false
+ )
end
- def ordered_by_other_column?
+ def lower_named_function_column(order_value)
+ attribute_name = order_value.expr.expressions.first.name
+
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: attribute_name,
+ column_expression: Arel::Nodes::NamedFunction.new("LOWER", [model_class.arel_table[attribute_name]]),
+ order_expression: order_value,
+ nullable: nullability(order_value, attribute_name),
+ distinct: false
+ )
+ end
+
+ def ordered_by_primary_key?
return unless order_values.one?
attribute = order_values.first.try(:expr)
+ attribute && primary_key?(attribute)
+ end
- return unless attribute
- return unless attribute.try(:name)
+ def ordered_by_other_column?
+ return unless order_values.one?
- model_class.column_names.include?(attribute.name.to_s)
+ convert_raw_nulls_order!
+
+ supported_column?(order_values.first)
end
def ordered_by_other_column_with_tie_breaker?
return unless order_values.size == 2
- attribute = order_values.first.try(:expr)
- tie_breaker_attribute = order_values.second.try(:expr)
+ convert_raw_nulls_order!
- return unless attribute
- return unless tie_breaker_attribute
- return unless attribute.respond_to?(:name)
+ return unless supported_column?(order_values.first)
- model_class.column_names.include?(attribute.name.to_s) &&
- arel_table[primary_key].to_s == tie_breaker_attribute.to_s
+ tie_breaker_attribute = order_values.second.try(:expr)
+ tie_breaker_attribute && primary_key?(tie_breaker_attribute)
end
def default_tie_breaker_column_order
diff --git a/lib/gitlab/pagination/offset_pagination.rb b/lib/gitlab/pagination/offset_pagination.rb
index fca75d1fe01..00304f48dc5 100644
--- a/lib/gitlab/pagination/offset_pagination.rb
+++ b/lib/gitlab/pagination/offset_pagination.rb
@@ -11,8 +11,8 @@ module Gitlab
@request_context = request_context
end
- def paginate(relation, exclude_total_headers: false)
- paginate_with_limit_optimization(add_default_order(relation)).tap do |data|
+ def paginate(relation, exclude_total_headers: false, skip_default_order: false)
+ paginate_with_limit_optimization(add_default_order(relation, skip_default_order: skip_default_order)).tap do |data|
add_pagination_headers(data, exclude_total_headers)
end
end
@@ -27,7 +27,6 @@ module Gitlab
end
return pagination_data unless pagination_data.is_a?(ActiveRecord::Relation)
- return pagination_data unless Feature.enabled?(:api_kaminari_count_with_limit, type: :ops, default_enabled: :yaml)
limited_total_count = pagination_data.total_count_with_limit
if limited_total_count > Kaminari::ActiveRecordRelationMethods::MAX_COUNT_LIMIT
@@ -47,7 +46,9 @@ module Gitlab
false
end
- def add_default_order(relation)
+ def add_default_order(relation, skip_default_order: false)
+ return relation if skip_default_order
+
if relation.is_a?(ActiveRecord::Relation) && relation.order_values.empty?
relation = relation.order(:id) # rubocop: disable CodeReuse/ActiveRecord
end
diff --git a/lib/gitlab/patch/database_config.rb b/lib/gitlab/patch/database_config.rb
new file mode 100644
index 00000000000..702e8d404b1
--- /dev/null
+++ b/lib/gitlab/patch/database_config.rb
@@ -0,0 +1,111 @@
+# frozen_string_literal: true
+
+# The purpose of this code is to transform legacy `database.yml`
+# into a `database.yml` containing `main:` as a name of a first database
+#
+# This should be removed once all places using legacy `database.yml`
+# are fixed. The likely moment to remove this check is the %14.0.
+#
+# This converts the following syntax:
+#
+# production:
+# adapter: postgresql
+# database: gitlabhq_production
+# username: git
+# password: "secure password"
+# host: localhost
+#
+# Into:
+#
+# production:
+# main:
+# adapter: postgresql
+# database: gitlabhq_production
+# username: git
+# password: "secure password"
+# host: localhost
+#
+
+module Gitlab
+ module Patch
+ module DatabaseConfig
+ extend ActiveSupport::Concern
+
+ prepended do
+ attr_reader :uses_legacy_database_config
+ end
+
+ def load_database_yaml
+ return super unless Gitlab.ee?
+
+ super.deep_merge(load_geo_database_yaml)
+ end
+
+ # This method is taken from Rails to load a database YAML file without
+ # evaluating ERB. This allows us to create the rake tasks for the Geo
+ # tracking database without filling in the configuration values or
+ # loading the environment. To be removed when we start configure Geo
+ # tracking database in database.yml instead of custom database_geo.yml
+ #
+ # https://github.com/rails/rails/blob/v6.1.4/railties/lib/rails/application/configuration.rb#L255
+ def load_geo_database_yaml
+ path = Rails.root.join("config/database_geo.yml")
+ return {} unless File.exist?(path)
+
+ require "rails/application/dummy_erb_compiler"
+
+ yaml = DummyERB.new(Pathname.new(path).read).result
+ config = YAML.load(yaml) || {} # rubocop:disable Security/YAMLLoad
+
+ config.to_h do |env, configs|
+ # This check is taken from Rails where the transformation
+ # of a flat database.yml is done into `primary:`
+ # https://github.com/rails/rails/blob/v6.1.4/activerecord/lib/active_record/database_configurations.rb#L169
+ if configs.is_a?(Hash) && !configs.all? { |_, v| v.is_a?(Hash) }
+ configs = { "geo" => configs }
+ end
+
+ [env, configs]
+ end
+ end
+
+ def database_configuration
+ @uses_legacy_database_config = false # rubocop:disable Gitlab/ModuleWithInstanceVariables
+
+ super.to_h do |env, configs|
+ # TODO: To be removed in 15.0. See https://gitlab.com/gitlab-org/gitlab/-/issues/338182
+ # This preload is needed to convert legacy `database.yml`
+ # from `production: adapter: postgresql`
+ # into a `production: main: adapter: postgresql`
+ unless Gitlab::Utils.to_boolean(ENV['SKIP_DATABASE_CONFIG_VALIDATION'], default: false)
+ # This check is taken from Rails where the transformation
+ # of a flat database.yml is done into `primary:`
+ # https://github.com/rails/rails/blob/v6.1.4/activerecord/lib/active_record/database_configurations.rb#L169
+ if configs.is_a?(Hash) && !configs.all? { |_, v| v.is_a?(Hash) }
+ configs = { "main" => configs }
+
+ @uses_legacy_database_config = true # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ end
+ end
+
+ if Gitlab.ee?
+ if !configs.key?("geo") && File.exist?(Rails.root.join("config/database_geo.yml"))
+ configs["geo"] = Rails.application.config_for(:database_geo).stringify_keys
+ end
+
+ if configs.key?("geo")
+ migrations_paths = Array(configs["geo"]["migrations_paths"])
+ migrations_paths << "ee/db/geo/migrate" if migrations_paths.empty?
+ migrations_paths << "ee/db/geo/post_migrate" unless ENV['SKIP_POST_DEPLOYMENT_MIGRATIONS']
+
+ configs["geo"]["migrations_paths"] = migrations_paths.uniq
+ configs["geo"]["schema_migrations_path"] = "ee/db/geo/schema_migrations" if configs["geo"]["schema_migrations_path"].blank?
+ end
+ end
+
+ [env, configs]
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/patch/legacy_database_config.rb b/lib/gitlab/patch/legacy_database_config.rb
deleted file mode 100644
index 6040f737c75..00000000000
--- a/lib/gitlab/patch/legacy_database_config.rb
+++ /dev/null
@@ -1,100 +0,0 @@
-# frozen_string_literal: true
-
-# The purpose of this code is to transform legacy `database.yml`
-# into a `database.yml` containing `main:` as a name of a first database
-#
-# This should be removed once all places using legacy `database.yml`
-# are fixed. The likely moment to remove this check is the %14.0.
-#
-# This converts the following syntax:
-#
-# production:
-# adapter: postgresql
-# database: gitlabhq_production
-# username: git
-# password: "secure password"
-# host: localhost
-#
-# Into:
-#
-# production:
-# main:
-# adapter: postgresql
-# database: gitlabhq_production
-# username: git
-# password: "secure password"
-# host: localhost
-#
-
-module Gitlab
- module Patch
- module LegacyDatabaseConfig
- extend ActiveSupport::Concern
-
- prepended do
- attr_reader :uses_legacy_database_config
- end
-
- def load_database_yaml
- return super unless Gitlab.ee?
-
- super.deep_merge(load_geo_database_yaml)
- end
-
- # This method is taken from Rails to load a database YAML file without
- # evaluating ERB. This allows us to create the rake tasks for the Geo
- # tracking database without filling in the configuration values or
- # loading the environment. To be removed when we start configure Geo
- # tracking database in database.yml instead of custom database_geo.yml
- #
- # https://github.com/rails/rails/blob/v6.1.4/railties/lib/rails/application/configuration.rb#L255
- def load_geo_database_yaml
- path = Rails.root.join("config/database_geo.yml")
- return {} unless File.exist?(path)
-
- require "rails/application/dummy_erb_compiler"
-
- yaml = DummyERB.new(Pathname.new(path).read).result
- config = YAML.load(yaml) || {} # rubocop:disable Security/YAMLLoad
-
- config.to_h do |env, configs|
- # This check is taken from Rails where the transformation
- # of a flat database.yml is done into `primary:`
- # https://github.com/rails/rails/blob/v6.1.4/activerecord/lib/active_record/database_configurations.rb#L169
- if configs.is_a?(Hash) && !configs.all? { |_, v| v.is_a?(Hash) }
- configs = { "geo" => configs }
- end
-
- [env, configs]
- end
- end
-
- def database_configuration
- @uses_legacy_database_config = false # rubocop:disable Gitlab/ModuleWithInstanceVariables
-
- super.to_h do |env, configs|
- # This check is taken from Rails where the transformation
- # of a flat database.yml is done into `primary:`
- # https://github.com/rails/rails/blob/v6.1.4/activerecord/lib/active_record/database_configurations.rb#L169
- if configs.is_a?(Hash) && !configs.all? { |_, v| v.is_a?(Hash) }
- configs = { "main" => configs }
-
- @uses_legacy_database_config = true # rubocop:disable Gitlab/ModuleWithInstanceVariables
- end
-
- if Gitlab.ee? && File.exist?(Rails.root.join("config/database_geo.yml"))
- migrations_paths = ["ee/db/geo/migrate"]
- migrations_paths << "ee/db/geo/post_migrate" unless ENV['SKIP_POST_DEPLOYMENT_MIGRATIONS']
-
- configs["geo"] =
- Rails.application.config_for(:database_geo)
- .merge(migrations_paths: migrations_paths, schema_migrations_path: "ee/db/geo/schema_migrations")
- .stringify_keys
- end
-
- [env, configs]
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/project_template.rb b/lib/gitlab/project_template.rb
index 847f70693f3..e7a12edf763 100644
--- a/lib/gitlab/project_template.rb
+++ b/lib/gitlab/project_template.rb
@@ -29,7 +29,7 @@ module Gitlab
end
def project_path
- URI.parse(preview).path.sub(%r{\A/}, '')
+ URI.parse(preview).path.delete_prefix('/')
end
def uri_encoded_project_path
@@ -57,7 +57,7 @@ module Gitlab
ProjectTemplate.new('plainhtml', 'Pages/Plain HTML', _('Everything you need to create a GitLab Pages site using plain HTML'), 'https://gitlab.com/pages/plain-html'),
ProjectTemplate.new('gitbook', 'Pages/GitBook', _('Everything you need to create a GitLab Pages site using GitBook'), 'https://gitlab.com/pages/gitbook', 'illustrations/logos/gitbook.svg'),
ProjectTemplate.new('hexo', 'Pages/Hexo', _('Everything you need to create a GitLab Pages site using Hexo'), 'https://gitlab.com/pages/hexo', 'illustrations/logos/hexo.svg'),
- ProjectTemplate.new('sse_middleman', 'Static Site Editor/Middleman', _('Middleman project with Static Site Editor support'), 'https://gitlab.com/gitlab-org/project-templates/static-site-editor-middleman', 'illustrations/logos/middleman.svg'),
+ ProjectTemplate.new('middleman', 'Pages/Middleman', _('Everything you need to create a GitLab Pages site using Middleman'), 'https://gitlab.com/gitlab-org/project-templates/middleman', 'illustrations/logos/middleman.svg'),
ProjectTemplate.new('gitpod_spring_petclinic', 'Gitpod/Spring Petclinic', _('A Gitpod configured Webapplication in Spring and Java'), 'https://gitlab.com/gitlab-org/project-templates/gitpod-spring-petclinic', 'illustrations/logos/gitpod.svg'),
ProjectTemplate.new('nfhugo', 'Netlify/Hugo', _('A Hugo site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features'), 'https://gitlab.com/pages/nfhugo', 'illustrations/logos/netlify.svg'),
ProjectTemplate.new('nfjekyll', 'Netlify/Jekyll', _('A Jekyll site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features'), 'https://gitlab.com/pages/nfjekyll', 'illustrations/logos/netlify.svg'),
diff --git a/lib/gitlab/quick_actions/merge_request_actions.rb b/lib/gitlab/quick_actions/merge_request_actions.rb
index e6a73c71e85..4efa29337d1 100644
--- a/lib/gitlab/quick_actions/merge_request_actions.rb
+++ b/lib/gitlab/quick_actions/merge_request_actions.rb
@@ -24,7 +24,7 @@ module Gitlab
end
execution_message do
if params[:merge_request_diff_head_sha].blank?
- _("Merge request diff sha parameter is required for the merge quick action.")
+ _("The `/merge` quick action requires the SHA of the head of the branch.")
elsif params[:merge_request_diff_head_sha] != quick_action_target.diff_head_sha
_("Branch has been updated since the merge was requested.")
elsif preferred_strategy = preferred_auto_merge_strategy(quick_action_target)
@@ -291,7 +291,7 @@ module Gitlab
parse_params do |attention_param|
extract_users(attention_param)
end
- command :attention do |users|
+ command :attention, :attn do |users|
next if users.empty?
users.each do |user|
diff --git a/lib/gitlab/relative_positioning/item_context.rb b/lib/gitlab/relative_positioning/item_context.rb
index 98e52e8e767..ac0598d8d34 100644
--- a/lib/gitlab/relative_positioning/item_context.rb
+++ b/lib/gitlab/relative_positioning/item_context.rb
@@ -84,7 +84,7 @@ module Gitlab
# MAX(relative_position) without the GROUP BY, due to index usage:
# https://gitlab.com/gitlab-org/gitlab-foss/issues/54276#note_119340977
relation = scoped_items
- .order(Gitlab::Database.nulls_last_order('position', 'DESC'))
+ .order(Arel.sql('position').desc.nulls_last)
.group(grouping_column)
.limit(1)
@@ -101,7 +101,7 @@ module Gitlab
def max_sibling
sib = relative_siblings
- .order(Gitlab::Database.nulls_last_order('relative_position', 'DESC'))
+ .order(model_class.arel_table[:relative_position].desc.nulls_last)
.first
neighbour(sib)
@@ -109,7 +109,7 @@ module Gitlab
def min_sibling
sib = relative_siblings
- .order(Gitlab::Database.nulls_last_order('relative_position', 'ASC'))
+ .order(model_class.arel_table[:relative_position].asc.nulls_last)
.first
neighbour(sib)
diff --git a/lib/gitlab/security/scan_configuration.rb b/lib/gitlab/security/scan_configuration.rb
index 381adda7991..14883a34950 100644
--- a/lib/gitlab/security/scan_configuration.rb
+++ b/lib/gitlab/security/scan_configuration.rb
@@ -31,6 +31,8 @@ module Gitlab
def configuration_path; end
+ def meta_info_path; end
+
private
attr_reader :project, :configured
diff --git a/lib/gitlab/seeder.rb b/lib/gitlab/seeder.rb
index e2df60c46f1..ec514adafc8 100644
--- a/lib/gitlab/seeder.rb
+++ b/lib/gitlab/seeder.rb
@@ -4,12 +4,24 @@ module Gitlab
class Seeder
extend ActionView::Helpers::NumberHelper
- MASS_INSERT_PROJECT_START = 'mass_insert_project_'
- MASS_INSERT_USER_START = 'mass_insert_user_'
+ MASS_INSERT_PREFIX = 'mass_insert'
+ MASS_INSERT_PROJECT_START = "#{MASS_INSERT_PREFIX}_project_"
+ MASS_INSERT_GROUP_START = "#{MASS_INSERT_PREFIX}_group_"
+ MASS_INSERT_USER_START = "#{MASS_INSERT_PREFIX}_user_"
REPORTED_USER_START = 'reported_user_'
- ESTIMATED_INSERT_PER_MINUTE = 2_000_000
+ ESTIMATED_INSERT_PER_MINUTE = 250_000
MASS_INSERT_ENV = 'MASS_INSERT'
+ module NamespaceSeed
+ extend ActiveSupport::Concern
+
+ included do
+ scope :not_mass_generated, -> do
+ where.not("path LIKE '#{MASS_INSERT_GROUP_START}%'")
+ end
+ end
+ end
+
module ProjectSeed
extend ActiveSupport::Concern
@@ -30,6 +42,10 @@ module Gitlab
end
end
+ def self.log_message(message)
+ puts "#{Time.current}: #{message}"
+ end
+
def self.with_mass_insert(size, model)
humanized_model_name = model.is_a?(String) ? model : model.model_name.human.pluralize(size)
@@ -63,6 +79,7 @@ module Gitlab
def self.quiet
# Additional seed logic for models.
+ Namespace.include(NamespaceSeed)
Project.include(ProjectSeed)
User.include(UserSeed)
diff --git a/lib/gitlab/setup_helper.rb b/lib/gitlab/setup_helper.rb
index bc0071f6333..a498e329c3f 100644
--- a/lib/gitlab/setup_helper.rb
+++ b/lib/gitlab/setup_helper.rb
@@ -98,7 +98,7 @@ module Gitlab
storages << { name: key, path: storage_paths[key] }
end
- config = { socket_path: address.sub(/\Aunix:/, '') }
+ config = { socket_path: address.delete_prefix('unix:') }
if Rails.env.test?
socket_filename = options[:gitaly_socket] || "gitaly.socket"
@@ -124,9 +124,9 @@ module Gitlab
config[:storage] = storages
- internal_socket_dir = options[:internal_socket_dir] || File.join(gitaly_dir, 'internal_sockets')
- FileUtils.mkdir(internal_socket_dir) unless File.exist?(internal_socket_dir)
- config[:internal_socket_dir] = internal_socket_dir
+ runtime_dir = options[:runtime_dir] || File.join(gitaly_dir, 'run')
+ FileUtils.mkdir(runtime_dir) unless File.exist?(runtime_dir)
+ config[:runtime_dir] = runtime_dir
config[:'gitaly-ruby'] = { dir: File.join(gitaly_dir, 'ruby') } if gitaly_ruby
config[:'gitlab-shell'] = { dir: Gitlab.config.gitlab_shell.path }
diff --git a/lib/gitlab/ssh_public_key.rb b/lib/gitlab/ssh_public_key.rb
index 8a2f3bbe0ee..78682a89655 100644
--- a/lib/gitlab/ssh_public_key.rb
+++ b/lib/gitlab/ssh_public_key.rb
@@ -15,16 +15,24 @@ module Gitlab
Technology.new(:ed25519_sk, SSHData::PublicKey::SKED25519, [256], %w(sk-ssh-ed25519@openssh.com))
].freeze
+ def self.technologies
+ if Gitlab::FIPS.enabled?
+ Gitlab::FIPS::SSH_KEY_TECHNOLOGIES
+ else
+ TECHNOLOGIES
+ end
+ end
+
def self.technology(name)
- TECHNOLOGIES.find { |tech| tech.name.to_s == name.to_s }
+ technologies.find { |tech| tech.name.to_s == name.to_s }
end
def self.technology_for_key(key)
- TECHNOLOGIES.find { |tech| key.instance_of?(tech.key_class) }
+ technologies.find { |tech| key.instance_of?(tech.key_class) }
end
def self.supported_types
- TECHNOLOGIES.map(&:name)
+ technologies.map(&:name)
end
def self.supported_sizes(name)
@@ -32,7 +40,7 @@ module Gitlab
end
def self.supported_algorithms
- TECHNOLOGIES.flat_map { |tech| tech.supported_algorithms }
+ technologies.flat_map { |tech| tech.supported_algorithms }
end
def self.supported_algorithms_for_name(name)
diff --git a/lib/gitlab/suggestions/commit_message.rb b/lib/gitlab/suggestions/commit_message.rb
index 5bca3efe6e1..fcf30cd6df9 100644
--- a/lib/gitlab/suggestions/commit_message.rb
+++ b/lib/gitlab/suggestions/commit_message.rb
@@ -13,7 +13,7 @@ module Gitlab
end
def message
- project = suggestion_set.project
+ project = suggestion_set.target_project
user_defined_message = @custom_message.presence || project.suggestion_commit_message.presence
message = user_defined_message || DEFAULT_SUGGESTION_COMMIT_MESSAGE
@@ -37,8 +37,8 @@ module Gitlab
'branch_name' => ->(user, suggestion_set) { suggestion_set.branch },
'files_count' => ->(user, suggestion_set) { suggestion_set.file_paths.length },
'file_paths' => ->(user, suggestion_set) { format_paths(suggestion_set.file_paths) },
- 'project_name' => ->(user, suggestion_set) { suggestion_set.project.name },
- 'project_path' => ->(user, suggestion_set) { suggestion_set.project.path },
+ 'project_name' => ->(user, suggestion_set) { suggestion_set.target_project.name },
+ 'project_path' => ->(user, suggestion_set) { suggestion_set.target_project.path },
'user_full_name' => ->(user, suggestion_set) { user.name },
'username' => ->(user, suggestion_set) { user.username },
'suggestions_count' => ->(user, suggestion_set) { suggestion_set.suggestions.size }
diff --git a/lib/gitlab/suggestions/suggestion_set.rb b/lib/gitlab/suggestions/suggestion_set.rb
index 53885cdbf19..21a5acf8afe 100644
--- a/lib/gitlab/suggestions/suggestion_set.rb
+++ b/lib/gitlab/suggestions/suggestion_set.rb
@@ -9,8 +9,12 @@ module Gitlab
@suggestions = suggestions
end
- def project
- first_suggestion.project
+ def source_project
+ first_suggestion.source_project
+ end
+
+ def target_project
+ first_suggestion.target_project
end
def branch
diff --git a/lib/gitlab/task_helpers.rb b/lib/gitlab/task_helpers.rb
index 6a98fa12903..54db31ffd6c 100644
--- a/lib/gitlab/task_helpers.rb
+++ b/lib/gitlab/task_helpers.rb
@@ -198,3 +198,4 @@ module Gitlab
end
end
end
+# rubocop:enable Rails/Output
diff --git a/lib/gitlab/time_tracking_formatter.rb b/lib/gitlab/time_tracking_formatter.rb
index 67ecf498cf7..87861b61119 100644
--- a/lib/gitlab/time_tracking_formatter.rb
+++ b/lib/gitlab/time_tracking_formatter.rb
@@ -8,7 +8,8 @@ module Gitlab
CUSTOM_DAY_AND_MONTH_LENGTH = { hours_per_day: 8, days_per_month: 20 }.freeze
def parse(string)
- string = string.sub(/\A-/, '')
+ negative_time = string.start_with?('-')
+ string = string.delete_prefix('-')
seconds =
begin
@@ -19,7 +20,7 @@ module Gitlab
nil
end
- seconds *= -1 if seconds && Regexp.last_match
+ seconds *= -1 if seconds && negative_time
seconds
end
diff --git a/lib/gitlab/tracking.rb b/lib/gitlab/tracking.rb
index a58b4beb0df..0e7812d08b8 100644
--- a/lib/gitlab/tracking.rb
+++ b/lib/gitlab/tracking.rb
@@ -15,6 +15,21 @@ module Gitlab
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error, snowplow_category: category, snowplow_action: action)
end
+ def definition(basename, category: nil, action: nil, label: nil, property: nil, value: nil, context: [], project: nil, user: nil, namespace: nil, **extra) # rubocop:disable Metrics/ParameterLists
+ definition = YAML.load_file(Rails.root.join("config/events/#{basename}.yml"))
+
+ dispatch_from_definition(definition, label: label, property: property, value: value, context: context, project: project, user: user, namespace: namespace, **extra)
+ end
+
+ def dispatch_from_definition(definition, **event_data)
+ definition = definition.with_indifferent_access
+
+ category ||= definition[:category]
+ action ||= definition[:action]
+
+ event(category, action, **event_data)
+ end
+
def options(group)
snowplow.options(group)
end
@@ -39,3 +54,5 @@ module Gitlab
end
end
end
+
+Gitlab::Tracking.prepend_mod_with('Gitlab::Tracking')
diff --git a/lib/gitlab/url_sanitizer.rb b/lib/gitlab/url_sanitizer.rb
index fa40a8b678b..e3bf11b00b4 100644
--- a/lib/gitlab/url_sanitizer.rb
+++ b/lib/gitlab/url_sanitizer.rb
@@ -71,7 +71,10 @@ module Gitlab
url.sub!("#{raw_credentials}@", '')
user, _, password = raw_credentials.partition(':')
- @credentials ||= { user: user.presence, password: password.presence }
+
+ @credentials ||= {}
+ @credentials[:user] = user.presence if @credentials[:user].blank?
+ @credentials[:password] = password.presence if @credentials[:password].blank?
end
url = Addressable::URI.parse(url)
diff --git a/lib/gitlab/usage/service_ping/instrumented_payload.rb b/lib/gitlab/usage/service_ping/instrumented_payload.rb
index e04e2e589b2..6cc67321ba1 100644
--- a/lib/gitlab/usage/service_ping/instrumented_payload.rb
+++ b/lib/gitlab/usage/service_ping/instrumented_payload.rb
@@ -22,7 +22,7 @@ module Gitlab
private
- # Not all metrics defintions have instrumentation classes
+ # Not all metrics definitions have instrumentation classes
# The value can be computed only for those that have it
def instrumented_metrics_defintions
Gitlab::Usage::MetricDefinition.with_instrumentation_class
diff --git a/lib/gitlab/usage/service_ping_report.rb b/lib/gitlab/usage/service_ping_report.rb
index 794f3373043..3e653b186a0 100644
--- a/lib/gitlab/usage/service_ping_report.rb
+++ b/lib/gitlab/usage/service_ping_report.rb
@@ -18,16 +18,11 @@ module Gitlab
private
def with_instrumentation_classes(old_payload, output_method)
- if Feature.enabled?(:merge_service_ping_instrumented_metrics, default_enabled: :yaml)
+ instrumented_metrics_key_paths = Gitlab::Usage::ServicePing::PayloadKeysProcessor.new(old_payload).missing_instrumented_metrics_key_paths
- instrumented_metrics_key_paths = Gitlab::Usage::ServicePing::PayloadKeysProcessor.new(old_payload).missing_instrumented_metrics_key_paths
+ instrumented_payload = Gitlab::Usage::ServicePing::InstrumentedPayload.new(instrumented_metrics_key_paths, output_method).build
- instrumented_payload = Gitlab::Usage::ServicePing::InstrumentedPayload.new(instrumented_metrics_key_paths, output_method).build
-
- old_payload.deep_merge(instrumented_payload)
- else
- old_payload
- end
+ old_payload.deep_merge(instrumented_payload)
end
def all_metrics_values(cached)
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index 951ec5ea5c3..b465d4bcc9b 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -70,7 +70,7 @@ module Gitlab
def system_usage_data
issues_created_manually_from_alerts = count(Issue.with_alert_management_alerts.not_authored_by(::User.alert_bot), start: minimum_id(Issue), finish: maximum_id(Issue))
- counts = {
+ {
counts: {
assignee_lists: count(List.assignee),
ci_builds: count(::Ci::Build),
@@ -166,12 +166,6 @@ module Gitlab
data[:snippets] = add(data[:personal_snippets], data[:project_snippets])
end
}
-
- if Feature.disabled?(:merge_service_ping_instrumented_metrics, default_enabled: :yaml)
- counts[:counts][:boards] = add_metric('CountBoardsMetric', time_frame: 'all')
- end
-
- counts
end
# rubocop: enable Metrics/AbcSize
@@ -513,7 +507,6 @@ module Gitlab
{
deploy_keys: distinct_count(::DeployKey.where(time_period), :user_id),
keys: distinct_count(::Key.regular_keys.where(time_period), :user_id),
- merge_requests: distinct_count(::MergeRequest.where(time_period), :author_id),
projects_with_disable_overriding_approvers_per_merge_request: count(::Project.where(time_period.merge(disable_overriding_approvers_per_merge_request: true))),
projects_without_disable_overriding_approvers_per_merge_request: count(::Project.where(time_period.merge(disable_overriding_approvers_per_merge_request: [false, nil]))),
remote_mirrors: distinct_count(::Project.with_remote_mirrors.where(time_period), :creator_id),
@@ -801,14 +794,9 @@ module Gitlab
sent_emails = count(Users::InProductMarketingEmail.group(:track, :series))
clicked_emails = count(Users::InProductMarketingEmail.where.not(cta_clicked_at: nil).group(:track, :series))
- Users::InProductMarketingEmail.tracks.keys.each_with_object({}) do |track, result|
+ Users::InProductMarketingEmail::ACTIVE_TRACKS.keys.each_with_object({}) do |track, result|
+ series_amount = Namespaces::InProductMarketingEmailsService.email_count_for_track(track)
# rubocop: enable UsageData/LargeTable:
- series_amount =
- if track.to_sym == Namespaces::InviteTeamEmailService::TRACK
- 0
- else
- Namespaces::InProductMarketingEmailsService::TRACKS[track.to_sym][:interval_days].count
- end
0.upto(series_amount - 1).map do |series|
# When there is an error with the query and it's not the Hash we expect, we return what we got from `count`.
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 b8de7de848d..cf3caf3f0c7 100644
--- a/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb
@@ -6,13 +6,18 @@ module Gitlab::UsageDataCounters
KNOWN_EVENTS_FILE_PATH = File.expand_path('known_events/ci_templates.yml', __dir__)
class << self
- def track_unique_project_event(project_id:, template:, config_source:)
+ def track_unique_project_event(project:, template:, config_source:, user:)
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
+ ci_template_event_name(expanded_template_name, config_source), values: project.id
)
+
+ namespace = project.namespace
+ if Feature.enabled?(:route_hll_to_snowplow, namespace, default_enabled: :yaml)
+ Gitlab::Tracking.event(name, 'ci_templates_unique', namespace: namespace, user: user, project: project)
+ end
end
def ci_templates(relative_base = 'lib/gitlab/ci/templates')
diff --git a/lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter.rb
new file mode 100644
index 00000000000..8a57a0331b8
--- /dev/null
+++ b/lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module UsageDataCounters
+ module GitLabCliActivityUniqueCounter
+ GITLAB_CLI_API_REQUEST_ACTION = 'i_code_review_user_gitlab_cli_api_request'
+ GITLAB_CLI_USER_AGENT_REGEX = /GitLab\sCLI$/.freeze
+
+ class << self
+ def track_api_request_when_trackable(user_agent:, user:)
+ user_agent&.match?(GITLAB_CLI_USER_AGENT_REGEX) && track_unique_action_by_user(GITLAB_CLI_API_REQUEST_ACTION, user)
+ end
+
+ private
+
+ def track_unique_action_by_user(action, user)
+ return unless user
+
+ track_unique_action(action, user.id)
+ end
+
+ def track_unique_action(action, value)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_usage_event(action, value)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage_data_counters/hll_redis_counter.rb b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
index 474ab9a4dd9..3b34cd77cf5 100644
--- a/lib/gitlab/usage_data_counters/hll_redis_counter.rb
+++ b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
@@ -81,6 +81,12 @@ module Gitlab
track(values, event_name, context: context, time: time)
end
+ # Count unique events for a given time range.
+ #
+ # event_names - The list of the events to count.
+ # start_date - The start date of the time range.
+ # end_date - The end date of the time range.
+ # context - Event context, plan level tracking. Available if set when tracking.
def unique_events(event_names:, start_date:, end_date:, context: '')
count_unique_events(event_names: event_names, start_date: start_date, end_date: end_date, context: context) do |events|
raise SlotMismatch, events unless events_in_same_slot?(events)
@@ -100,6 +106,13 @@ module Gitlab
known_events.select { |event| event[:category] == category.to_s }.map { |event| event[:name] }
end
+ # Recent 7 or 28 days unique events data for events defined in /lib/gitlab/usage_data_counters/known_events/
+ #
+ # - For metrics for which we store a key per day, we have the last 7 days or last 28 days of data.
+ # - For metrics for which we store a key per week, we have the last complete week or last 4 complete weeks
+ # daily or weekly information is in the file we have for events definition /lib/gitlab/usage_data_counters/known_events/
+ # - Most of the metrics have weekly aggregation. We recommend this as it generates fewer keys in Redis to store.
+ # - The aggregation used doesn't affect data granulation.
def unique_events_data
categories.each_with_object({}) do |category, category_results|
events_names = events_for_category(category)
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 a39fa7aca4f..f179f6d679d 100644
--- a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
+++ b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
@@ -219,6 +219,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_themekit
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_terraform
category: ci_templates
redis_slot: ci_templates
@@ -615,3 +619,11 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_liquibase
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
+- name: p_ci_templates_matlab
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
diff --git a/lib/gitlab/usage_data_counters/known_events/code_review_events.yml b/lib/gitlab/usage_data_counters/known_events/code_review_events.yml
index 42c51ec3921..df2864bba89 100644
--- a/lib/gitlab/usage_data_counters/known_events/code_review_events.yml
+++ b/lib/gitlab/usage_data_counters/known_events/code_review_events.yml
@@ -132,6 +132,11 @@
category: code_review
aggregation: weekly
feature_flag: usage_data_i_code_review_user_jetbrains_api_request
+- name: i_code_review_user_gitlab_cli_api_request
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+ feature_flag: usage_data_i_code_review_user_gitlab_cli_api_request
- name: i_code_review_user_create_mr_from_issue
redis_slot: code_review
category: code_review
@@ -173,62 +178,50 @@
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_click_single_file_mode_setting
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_click_file_browser_setting
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_click_whitespace_setting
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_diff_view_inline
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_diff_view_parallel
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_file_browser_tree_view
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_file_browser_list_view
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_diff_show_whitespace
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_diff_hide_whitespace
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_diff_single_file
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_diff_multiple_files
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: diff_settings_usage_data
- name: i_code_review_user_load_conflict_ui
redis_slot: code_review
category: code_review
@@ -241,7 +234,6 @@
redis_slot: code_review
category: code_review
aggregation: weekly
- feature_flag: usage_data_diff_searches
- name: i_code_review_total_suggestions_applied
redis_slot: code_review
category: code_review
diff --git a/lib/gitlab/usage_data_counters/known_events/common.yml b/lib/gitlab/usage_data_counters/known_events/common.yml
index fdf4bc58525..0d89a5181ec 100644
--- a/lib/gitlab/usage_data_counters/known_events/common.yml
+++ b/lib/gitlab/usage_data_counters/known_events/common.yml
@@ -25,25 +25,21 @@
redis_slot: edit
expiry: 29
aggregation: daily
- feature_flag: track_editor_edit_actions
- name: g_edit_by_sfe
category: ide_edit
redis_slot: edit
expiry: 29
aggregation: daily
- feature_flag: track_editor_edit_actions
- name: g_edit_by_sse
category: ide_edit
redis_slot: edit
expiry: 29
aggregation: daily
- feature_flag: track_editor_edit_actions
- name: g_edit_by_snippet_ide
category: ide_edit
redis_slot: edit
expiry: 29
aggregation: daily
- feature_flag: track_editor_edit_actions
- name: i_search_total
category: search
redis_slot: search
@@ -343,22 +339,18 @@
redis_slot: secure
category: secure
aggregation: weekly
- feature_flag: users_expanding_widgets_usage_data
- name: users_expanding_testing_code_quality_report
redis_slot: testing
category: testing
aggregation: weekly
- feature_flag: users_expanding_widgets_usage_data
- name: users_expanding_testing_accessibility_report
redis_slot: testing
category: testing
aggregation: weekly
- feature_flag: users_expanding_widgets_usage_data
- name: users_expanding_testing_license_compliance_report
redis_slot: testing
category: testing
aggregation: weekly
- feature_flag: users_expanding_widgets_usage_data
- name: users_visiting_testing_license_compliance_full_report
redis_slot: testing
category: testing
diff --git a/lib/gitlab/usage_data_counters/known_events/epic_events.yml b/lib/gitlab/usage_data_counters/known_events/epic_events.yml
index 62b0d6dea86..82787b7bf29 100644
--- a/lib/gitlab/usage_data_counters/known_events/epic_events.yml
+++ b/lib/gitlab/usage_data_counters/known_events/epic_events.yml
@@ -188,3 +188,33 @@
redis_slot: project_management
aggregation: daily
feature_flag: track_epics_activity
+
+- name: g_project_management_epic_related_added
+ category: epics_usage
+ redis_slot: project_management
+ aggregation: daily
+ feature_flag: track_epics_activity
+
+- name: g_project_management_epic_related_removed
+ category: epics_usage
+ redis_slot: project_management
+ aggregation: daily
+ feature_flag: track_epics_activity
+
+- name: g_project_management_epic_blocking_added
+ category: epics_usage
+ redis_slot: project_management
+ aggregation: daily
+ feature_flag: track_epics_activity
+
+- name: g_project_management_epic_blocking_removed
+ category: epics_usage
+ redis_slot: project_management
+ aggregation: daily
+ feature_flag: track_epics_activity
+
+- name: g_project_management_epic_blocked_added
+ category: epics_usage
+ redis_slot: project_management
+ aggregation: daily
+ feature_flag: track_epics_activity
diff --git a/lib/gitlab/usage_data_counters/known_events/error_tracking.yml b/lib/gitlab/usage_data_counters/known_events/error_tracking.yml
index a56e0a6d370..d80b711f8eb 100644
--- a/lib/gitlab/usage_data_counters/known_events/error_tracking.yml
+++ b/lib/gitlab/usage_data_counters/known_events/error_tracking.yml
@@ -3,9 +3,7 @@
category: error_tracking
redis_slot: error_tracking
aggregation: weekly
- feature_flag: track_error_tracking_activity
- name: error_tracking_view_list
category: error_tracking
redis_slot: error_tracking
aggregation: weekly
- feature_flag: track_error_tracking_activity
diff --git a/lib/gitlab/usage_data_queries.rb b/lib/gitlab/usage_data_queries.rb
index d40ac71afc6..977cc3549d8 100644
--- a/lib/gitlab/usage_data_queries.rb
+++ b/lib/gitlab/usage_data_queries.rb
@@ -50,7 +50,7 @@ module Gitlab
def alt_usage_data(value = nil, fallback: FALLBACK, &block)
if block_given?
- { alt_usage_data_block: block.to_s }
+ { alt_usage_data_block: "non-SQL usage data block" }
else
{ alt_usage_data_value: value }
end
@@ -58,9 +58,9 @@ module Gitlab
def redis_usage_data(counter = nil, &block)
if block_given?
- { redis_usage_data_block: block.to_s }
+ { redis_usage_data_block: "non-SQL usage data block" }
elsif counter.present?
- { redis_usage_data_counter: counter }
+ { redis_usage_data_counter: counter.to_s }
end
end
@@ -74,6 +74,13 @@ module Gitlab
def epics_deepest_relationship_level
{ epics_deepest_relationship_level: 0 }
end
+
+ def topology_usage_data
+ {
+ duration_s: 0,
+ failures: []
+ }
+ end
end
end
end
diff --git a/lib/gitlab/utils/delegator_override/validator.rb b/lib/gitlab/utils/delegator_override/validator.rb
index 402154b41c2..4449fa75877 100644
--- a/lib/gitlab/utils/delegator_override/validator.rb
+++ b/lib/gitlab/utils/delegator_override/validator.rb
@@ -28,7 +28,13 @@ module Gitlab
end
def add_target(target_class)
- @target_classes << target_class if target_class
+ return unless target_class
+
+ @target_classes << target_class
+
+ # Also include all descendants inheriting from the target,
+ # to make sure we catch methods that are only defined in some of them.
+ @target_classes += target_class.descendants
end
# This will make sure allowlist we put into ancestors are all included
diff --git a/lib/gitlab/view/presenter/base.rb b/lib/gitlab/view/presenter/base.rb
index 3bacad72050..a2d217fb42f 100644
--- a/lib/gitlab/view/presenter/base.rb
+++ b/lib/gitlab/view/presenter/base.rb
@@ -11,15 +11,19 @@ module Gitlab
include Gitlab::Routing
include Gitlab::Allowable
- attr_reader :subject
+ # Presenters should always access the subject through an explicit getter defined with
+ # `presents ..., as:`, the `__subject__` method is only intended for internal use.
+ def __subject__
+ @subject
+ end
def can?(user, action, overridden_subject = nil)
- super(user, action, overridden_subject || subject)
+ super(user, action, overridden_subject || __subject__)
end
# delegate all #can? queries to the subject
def declarative_policy_delegate
- subject
+ __subject__
end
def present(**attributes)
@@ -31,15 +35,15 @@ module Gitlab
end
def is_a?(type)
- super || subject.is_a?(type)
+ super || __subject__.is_a?(type)
end
def web_url
- url_builder.build(subject)
+ url_builder.build(__subject__)
end
def web_path
- url_builder.build(subject, only_path: true)
+ url_builder.build(__subject__, only_path: true)
end
class_methods do
@@ -58,7 +62,7 @@ module Gitlab
# no-op
end
- define_method(as) { subject } if as
+ define_method(as) { __subject__ } if as
end
end
end
diff --git a/lib/gitlab/workhorse.rb b/lib/gitlab/workhorse.rb
index 19d30daa577..d74efd458f6 100644
--- a/lib/gitlab/workhorse.rb
+++ b/lib/gitlab/workhorse.rb
@@ -226,6 +226,13 @@ module Gitlab
end
end
+ def detect_content_type
+ [
+ Gitlab::Workhorse::DETECT_HEADER,
+ 'true'
+ ]
+ end
+
protected
# This is the outermost encoding of a senddata: header. It is safe for
diff --git a/lib/mattermost/session.rb b/lib/mattermost/session.rb
index 9374c5c8f8f..5d5d10b42f0 100644
--- a/lib/mattermost/session.rb
+++ b/lib/mattermost/session.rb
@@ -27,6 +27,11 @@ module Mattermost
LEASE_TIMEOUT = 60
+ Request = Struct.new(:parameters, keyword_init: true) do
+ def method_missing(method_name, *args, &block)
+ end
+ end
+
attr_accessor :current_resource_owner, :token, :base_uri
def initialize(current_user)
@@ -64,7 +69,7 @@ module Mattermost
end
def request
- @request ||= OpenStruct.new(parameters: params)
+ @request ||= Request.new(parameters: params)
end
def params
diff --git a/lib/prometheus/cleanup_multiproc_dir_service.rb b/lib/prometheus/cleanup_multiproc_dir_service.rb
index 6418b4de166..b309247fa73 100644
--- a/lib/prometheus/cleanup_multiproc_dir_service.rb
+++ b/lib/prometheus/cleanup_multiproc_dir_service.rb
@@ -2,22 +2,17 @@
module Prometheus
class CleanupMultiprocDirService
- include Gitlab::Utils::StrongMemoize
-
- def execute
- FileUtils.rm_rf(old_metrics) if old_metrics
+ def initialize(metrics_dir)
+ @metrics_dir = metrics_dir
end
- private
+ def execute
+ return if @metrics_dir.blank?
- def old_metrics
- strong_memoize(:old_metrics) do
- Dir[File.join(multiprocess_files_dir, '*.db')] if multiprocess_files_dir
- end
- end
+ files_to_delete = Dir[File.join(@metrics_dir, '*.db')]
+ return if files_to_delete.blank?
- def multiprocess_files_dir
- ::Prometheus::Client.configuration.multiprocess_files_dir
+ FileUtils.rm_rf(files_to_delete)
end
end
end
diff --git a/lib/sidebars/groups/menus/group_information_menu.rb b/lib/sidebars/groups/menus/group_information_menu.rb
index 9656811455e..3ce99e14a04 100644
--- a/lib/sidebars/groups/menus/group_information_menu.rb
+++ b/lib/sidebars/groups/menus/group_information_menu.rb
@@ -20,7 +20,7 @@ module Sidebars
override :sprite_icon
def sprite_icon
- 'group'
+ context.group.subgroup? ? 'subgroup' : 'group'
end
override :active_routes
diff --git a/lib/sidebars/projects/menus/infrastructure_menu.rb b/lib/sidebars/projects/menus/infrastructure_menu.rb
index c012b3bb627..7bd9ac91efa 100644
--- a/lib/sidebars/projects/menus/infrastructure_menu.rb
+++ b/lib/sidebars/projects/menus/infrastructure_menu.rb
@@ -90,7 +90,10 @@ module Sidebars
end
def google_cloud_menu_item
- feature_is_enabled = Feature.enabled?(:incubation_5mp_google_cloud, context.project)
+ enabled_for_user = Feature.enabled?(:incubation_5mp_google_cloud, context.current_user)
+ enabled_for_group = Feature.enabled?(:incubation_5mp_google_cloud, context.project.group)
+ enabled_for_project = Feature.enabled?(:incubation_5mp_google_cloud, context.project)
+ feature_is_enabled = enabled_for_user || enabled_for_group || enabled_for_project
user_has_permissions = can?(context.current_user, :admin_project_google_cloud, context.project)
unless feature_is_enabled && user_has_permissions
diff --git a/lib/sidebars/projects/menus/learn_gitlab_menu.rb b/lib/sidebars/projects/menus/learn_gitlab_menu.rb
index 16335f5b076..5de70ea7d7f 100644
--- a/lib/sidebars/projects/menus/learn_gitlab_menu.rb
+++ b/lib/sidebars/projects/menus/learn_gitlab_menu.rb
@@ -45,9 +45,9 @@ module Sidebars
}
end
- override :image_path
- def image_path
- 'learn_gitlab/graduation_hat.svg'
+ override :sprite_icon
+ def sprite_icon
+ 'bulb'
end
override :render?
diff --git a/lib/sidebars/projects/menus/packages_registries_menu.rb b/lib/sidebars/projects/menus/packages_registries_menu.rb
index 77f09986b19..d82a02a342f 100644
--- a/lib/sidebars/projects/menus/packages_registries_menu.rb
+++ b/lib/sidebars/projects/menus/packages_registries_menu.rb
@@ -47,7 +47,7 @@ module Sidebars
::Sidebars::MenuItem.new(
title: _('Container Registry'),
link: project_container_registry_index_path(context.project),
- active_routes: { controller: :repositories },
+ active_routes: { controller: 'projects/registry/repositories' },
item_id: :container_registry
)
end
@@ -71,7 +71,7 @@ module Sidebars
::Sidebars::MenuItem.new(
title: _('Harbor Registry'),
link: project_harbor_registry_index_path(context.project),
- active_routes: { controller: :harbor_registry },
+ active_routes: { controller: 'projects/harbor/repositories' },
item_id: :harbor_registry
)
end
diff --git a/lib/sidebars/projects/menus/zentao_menu.rb b/lib/sidebars/projects/menus/zentao_menu.rb
index db9e60326a4..1b5ba900a86 100644
--- a/lib/sidebars/projects/menus/zentao_menu.rb
+++ b/lib/sidebars/projects/menus/zentao_menu.rb
@@ -4,11 +4,6 @@ module Sidebars
module Projects
module Menus
class ZentaoMenu < ::Sidebars::Menu
- override :configure_menu_items
- def configure_menu_items
- render?.tap { |render| add_items if render }
- end
-
override :link
def link
zentao_integration.url
@@ -16,7 +11,7 @@ module Sidebars
override :title
def title
- s_('ZentaoIntegration|ZenTao issues')
+ s_('ZentaoIntegration|ZenTao')
end
override :title_html_options
@@ -26,9 +21,9 @@ module Sidebars
}
end
- override :image_path
- def image_path
- 'logos/zentao.svg'
+ override :sprite_icon
+ def sprite_icon
+ 'external-link'
end
# Hardcode sizes so image doesn't flash before CSS loads https://gitlab.com/gitlab-org/gitlab/-/issues/321022
@@ -46,29 +41,11 @@ module Sidebars
zentao_integration.active?
end
- def add_items
- add_item(open_zentao_menu_item)
- end
-
private
def zentao_integration
@zentao_integration ||= context.project.zentao_integration
end
-
- def open_zentao_menu_item
- ::Sidebars::MenuItem.new(
- title: s_('ZentaoIntegration|Open ZenTao'),
- link: zentao_integration.url,
- active_routes: {},
- item_id: :open_zentao,
- sprite_icon: 'external-link',
- container_html_options: {
- target: '_blank',
- rel: 'noopener noreferrer'
- }
- )
- end
end
end
end
diff --git a/lib/system_check/app/git_user_default_ssh_config_check.rb b/lib/system_check/app/git_user_default_ssh_config_check.rb
index 2876f1eb688..3ae36087f6b 100644
--- a/lib/system_check/app/git_user_default_ssh_config_check.rb
+++ b/lib/system_check/app/git_user_default_ssh_config_check.rb
@@ -31,7 +31,7 @@ module SystemCheck
end
try_fixing_it("mkdir #{backup_dir}", *instructions)
- for_more_information('doc/ssh/index.md in section "Overriding SSH settings on the GitLab server"')
+ for_more_information('doc/user/ssh.md#overriding-ssh-settings-on-the-gitlab-server')
fix_and_rerun
end
diff --git a/lib/system_check/base_check.rb b/lib/system_check/base_check.rb
index c36cacbaf4f..ae3a9412e5c 100644
--- a/lib/system_check/base_check.rb
+++ b/lib/system_check/base_check.rb
@@ -64,20 +64,14 @@ module SystemCheck
call_or_return(@skip_reason) || 'skipped'
end
- # Define a reason why we skipped the SystemCheck (during runtime)
+ # Define or get a reason why we skipped the SystemCheck (during runtime)
#
# This is used when you need dynamic evaluation like when you have
# multiple reasons why a check can fail
#
# @param [String] reason to be displayed
- attr_writer :skip_reason
-
- # Skip reason defined during runtime
- #
- # This value have precedence over the one defined in the subclass
- #
- # @return [String] the reason
- attr_reader :skip_reason
+ # @return [String] reason to be displayed
+ attr_accessor :skip_reason
# Does the check support automatically repair routine?
#
diff --git a/lib/tasks/ci/build_artifacts.rake b/lib/tasks/ci/build_artifacts.rake
deleted file mode 100644
index 4f4faef5a62..00000000000
--- a/lib/tasks/ci/build_artifacts.rake
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-require 'httparty'
-require 'csv'
-
-namespace :ci do
- namespace :build_artifacts do
- desc "GitLab | CI | Fetch projects with incorrect artifact size on GitLab.com"
- task :project_with_incorrect_artifact_size do
- csv_url = ENV['SISENSE_PROJECT_IDS_WITH_INCORRECT_ARTIFACTS_URL']
-
- # rubocop: disable Gitlab/HTTParty
- body = HTTParty.get(csv_url)
- # rubocop: enable Gitlab/HTTParty
-
- table = CSV.parse(body.parsed_response, headers: true)
- puts table['PROJECT_ID'].join(' ')
- end
- end
-end
diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake
index 99ffeb4ec0b..42b12cd0ae3 100644
--- a/lib/tasks/dev.rake
+++ b/lib/tasks/dev.rake
@@ -10,7 +10,12 @@ namespace :dev do
Gitlab::Database::EachDatabase.each_database_connection do |connection|
# Make sure DB statistics are up to date.
+ # gitlab:setup task can insert quite a bit of data, especially with MASS_INSERT=1
+ # so ANALYZE can take more than default 15s statement timeout. This being a dev task,
+ # we disable the statement timeout for ANALYZE to run and enable it back afterwards.
+ connection.execute('SET statement_timeout TO 0')
connection.execute('ANALYZE')
+ connection.execute('RESET statement_timeout')
end
Rake::Task["gitlab:shell:setup"].invoke
@@ -21,4 +26,51 @@ namespace :dev do
Rails.configuration.eager_load = true
Rails.application.eager_load!
end
+
+ # If there are any clients connected to the DB, PostgreSQL won't let
+ # you drop the database. It's possible that Sidekiq, Puma, or
+ # some other client will be hanging onto a connection, preventing
+ # the DROP DATABASE from working. To workaround this problem, this
+ # method terminates all the connections so that a subsequent DROP
+ # will work.
+ desc "Used to drop all connections in development"
+ task :terminate_all_connections do
+ # In production, we might want to prevent ourselves from shooting
+ # ourselves in the foot, so let's only do this in a test or
+ # development environment.
+ unless Rails.env.production?
+ cmd = <<~SQL
+ SELECT pg_terminate_backend(pg_stat_activity.pid)
+ FROM pg_stat_activity
+ WHERE datname = current_database()
+ AND pid <> pg_backend_pid();
+ SQL
+
+ Gitlab::Database::EachDatabase.each_database_connection(include_shared: false) do |connection|
+ connection.execute(cmd)
+ rescue ActiveRecord::NoDatabaseError
+ end
+ end
+ end
+
+ databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
+
+ namespace :copy_db do
+ ALLOWED_DATABASES = %w[ci].freeze
+
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
+ next unless ALLOWED_DATABASES.include?(name)
+
+ desc "Copies the #{name} database from the main database"
+ task name => :environment do
+ Rake::Task["dev:terminate_all_connections"].invoke
+
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
+
+ ApplicationRecord.connection.create_database(db_config.database, template: ApplicationRecord.connection_db_config.database)
+ rescue ActiveRecord::DatabaseAlreadyExists
+ warn "Database '#{db_config.database}' already exists"
+ end
+ end
+ end
end
diff --git a/lib/tasks/gitlab/background_migrations.rake b/lib/tasks/gitlab/background_migrations.rake
index b1084495f3d..e0699d5eb41 100644
--- a/lib/tasks/gitlab/background_migrations.rake
+++ b/lib/tasks/gitlab/background_migrations.rake
@@ -80,8 +80,8 @@ namespace :gitlab do
def display_migration_status(database_name, connection)
Gitlab::Database::SharedModel.using_connection(connection) do
- statuses = Gitlab::Database::BackgroundMigration::BatchedMigration.statuses
- max_status_length = statuses.keys.map(&:length).max
+ valid_status = Gitlab::Database::BackgroundMigration::BatchedMigration.valid_status
+ max_status_length = valid_status.map(&:length).max
format_string = "%-#{max_status_length}s | %s\n"
puts "Database: #{database_name}\n"
@@ -94,7 +94,7 @@ namespace :gitlab do
migration.job_arguments.to_json
].join(',')
- printf(format_string, migration.status, identification_fields)
+ printf(format_string, migration.status_name, identification_fields)
end
end
end
diff --git a/lib/tasks/gitlab/db.rake b/lib/tasks/gitlab/db.rake
index 50ceb11581e..3a7e53a27e4 100644
--- a/lib/tasks/gitlab/db.rake
+++ b/lib/tasks/gitlab/db.rake
@@ -2,6 +2,14 @@
databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
+def each_database(databases, include_geo: false)
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |database|
+ next if !include_geo && database == 'geo'
+
+ yield database
+ end
+end
+
namespace :gitlab do
namespace :db do
desc 'GitLab | DB | Manually insert schema migration version on all configured databases'
@@ -10,10 +18,10 @@ namespace :gitlab do
end
namespace :mark_migration_complete do
- ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |database|
- desc "Gitlab | DB | Manually insert schema migration version on #{database} database"
- task database, [:version] => :environment do |_, args|
- mark_migration_complete(args[:version], only_on: database)
+ each_database(databases) do |database_name|
+ desc "Gitlab | DB | Manually insert schema migration version on #{database_name} database"
+ task database_name, [:version] => :environment do |_, args|
+ mark_migration_complete(args[:version], only_on: database_name)
end
end
end
@@ -39,10 +47,10 @@ namespace :gitlab do
end
namespace :drop_tables do
- ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |database|
- desc "GitLab | DB | Drop all tables on the #{database} database"
- task database => :environment do
- drop_tables(only_on: database)
+ each_database(databases) do |database_name|
+ desc "GitLab | DB | Drop all tables on the #{database_name} database"
+ task database_name => :environment do
+ drop_tables(only_on: database_name)
end
end
end
@@ -76,16 +84,38 @@ namespace :gitlab do
desc 'GitLab | DB | Configures the database by running migrate, or by loading the schema and seeding if needed'
task configure: :environment do
- # Check if we have existing db tables
- # The schema_migrations table will still exist if drop_tables was called
- if ActiveRecord::Base.connection.tables.count > 1
- Rake::Task['db:migrate'].invoke
+ databases_with_tasks = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env)
+
+ databases_loaded = []
+
+ if databases_with_tasks.size == 1
+ next unless databases_with_tasks.first.name == 'main'
+
+ connection = Gitlab::Database.database_base_models['main'].connection
+ databases_loaded << configure_database(connection)
else
- # Add post-migrate paths to ensure we mark all migrations as up
+ Gitlab::Database.database_base_models.each do |name, model|
+ next unless databases_with_tasks.any? { |db_with_tasks| db_with_tasks.name == name }
+
+ databases_loaded << configure_database(model.connection, database_name: name)
+ end
+ end
+
+ Rake::Task['db:seed_fu'].invoke if databases_loaded.present? && databases_loaded.all?
+ end
+
+ def configure_database(connection, database_name: nil)
+ database_name = ":#{database_name}" if database_name
+ load_database = connection.tables.count <= 1
+
+ if load_database
Gitlab::Database.add_post_migrate_path_to_rails(force: true)
- Rake::Task['db:structure:load'].invoke
- Rake::Task['db:seed_fu'].invoke
+ Rake::Task["db:schema:load#{database_name}"].invoke
+ else
+ Rake::Task["db:migrate#{database_name}"].invoke
end
+
+ load_database
end
desc 'GitLab | DB | Run database migrations and print `unattended_migrations_completed` if action taken'
@@ -155,6 +185,15 @@ namespace :gitlab do
Gitlab::Database::Partitioning.sync_partitions
end
+ namespace :create_dynamic_partitions do
+ each_database(databases) do |database_name|
+ desc "Create missing dynamic database partitions on the #{database_name} database"
+ task database_name => :environment do
+ Gitlab::Database::Partitioning.sync_partitions(only_on: database_name)
+ end
+ end
+ end
+
# This is targeted towards deploys and upgrades of GitLab.
# Since we're running migrations already at this time,
# we also check and create partitions as needed here.
@@ -162,14 +201,12 @@ namespace :gitlab do
Rake::Task['gitlab:db:create_dynamic_partitions'].invoke
end
- ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
- # We'll temporarily skip this enhancement for geo, since in some situations we
- # wish to setup the geo database before the other databases have been setup,
- # and partition management attempts to connect to the main database.
- next if name == 'geo'
-
- Rake::Task["db:migrate:#{name}"].enhance do
- Rake::Task['gitlab:db:create_dynamic_partitions'].invoke
+ # We'll temporarily skip this enhancement for geo, since in some situations we
+ # wish to setup the geo database before the other databases have been setup,
+ # and partition management attempts to connect to the main database.
+ each_database(databases) do |database_name|
+ Rake::Task["db:migrate:#{database_name}"].enhance do
+ Rake::Task["gitlab:db:create_dynamic_partitions:#{database_name}"].invoke
end
end
@@ -185,25 +222,17 @@ namespace :gitlab do
Rake::Task['gitlab:db:create_dynamic_partitions'].invoke
end
- ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
- # We'll temporarily skip this enhancement for geo, since in some situations we
- # wish to setup the geo database before the other databases have been setup,
- # and partition management attempts to connect to the main database.
- next if name == 'geo'
-
- Rake::Task["db:schema:load:#{name}"].enhance do
- Rake::Task['gitlab:db:create_dynamic_partitions'].invoke
+ # We'll temporarily skip this enhancement for geo, since in some situations we
+ # wish to setup the geo database before the other databases have been setup,
+ # and partition management attempts to connect to the main database.
+ each_database(databases) do |database_name|
+ # :nocov:
+ Rake::Task["db:schema:load:#{database_name}"].enhance do
+ Rake::Task["gitlab:db:create_dynamic_partitions:#{database_name}"].invoke
end
+ # :nocov:
end
- desc "Clear all connections"
- task :clear_all_connections do
- ActiveRecord::Base.clear_all_connections!
- end
-
- Rake::Task['db:test:purge'].enhance(['gitlab:db:clear_all_connections'])
- Rake::Task['db:drop'].enhance(['gitlab:db:clear_all_connections'])
-
# During testing, db:test:load restores the database schema from scratch
# which does not include dynamic partitions. We cannot rely on application
# initializers here as the application can continue to run while
@@ -229,7 +258,7 @@ namespace :gitlab do
end
namespace :reindex do
- ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |database_name|
+ each_database(databases) do |database_name|
desc "Reindex #{database_name} database without downtime to eliminate bloat"
task database_name => :environment do
unless Gitlab::Database::Reindexing.enabled?
@@ -292,13 +321,22 @@ namespace :gitlab do
task down: :environment do
Gitlab::Database::Migrations::Runner.down.run
end
+
+ desc 'Sample traditional background migrations with instrumentation'
+ task :sample_background_migrations, [:duration_s] => [:environment] do |_t, args|
+ duration = args[:duration_s]&.to_i&.seconds || 30.minutes # Default of 30 minutes
+
+ Gitlab::Database::Migrations::Runner.background_migrations.run_jobs(for_duration: duration)
+ end
end
desc 'Run all pending batched migrations'
task execute_batched_migrations: :environment do
- Gitlab::Database::BackgroundMigration::BatchedMigration.active.queue_order.each do |migration|
- Gitlab::AppLogger.info("Executing batched migration #{migration.id} inline")
- Gitlab::Database::BackgroundMigration::BatchedMigrationRunner.new.run_entire_migration(migration)
+ Gitlab::Database::EachDatabase.each_database_connection do |connection, name|
+ Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:active).queue_order.each do |migration|
+ Gitlab::AppLogger.info("Executing batched migration #{migration.id} on database #{name} inline")
+ Gitlab::Database::BackgroundMigration::BatchedMigrationRunner.new(connection: connection).run_entire_migration(migration)
+ end
end
end
diff --git a/lib/tasks/gitlab/db/validate_config.rake b/lib/tasks/gitlab/db/validate_config.rake
new file mode 100644
index 00000000000..cc5f6bb6e09
--- /dev/null
+++ b/lib/tasks/gitlab/db/validate_config.rake
@@ -0,0 +1,113 @@
+# frozen_string_literal: true
+
+databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
+
+namespace :gitlab do
+ namespace :db do
+ desc 'Validates `config/database.yml` to ensure a correct behavior is configured'
+ task validate_config: :environment do
+ original_db_config = ActiveRecord::Base.connection_db_config
+
+ # The include_replicas: is a legacy name to fetch all hidden entries (replica: true or database_tasks: false)
+ # Once we upgrade to Rails 7.x this should be changed to `include_hidden: true`
+ # Ref.: https://github.com/rails/rails/blob/f2d9316ba965e150ad04596085ee10eea4f58d3e/activerecord/lib/active_record/database_configurations.rb#L48
+ db_configs = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, include_replicas: true)
+ db_configs = db_configs.reject(&:replica?)
+
+ # Map each database connection into unique identifier of system+database
+ all_connections = db_configs.map do |db_config|
+ identifier =
+ begin
+ ActiveRecord::Base.establish_connection(db_config) # rubocop: disable Database/EstablishConnection
+ ActiveRecord::Base.connection.select_one("SELECT system_identifier, current_database() FROM pg_control_system()")
+ rescue ActiveRecord::ConnectionNotEstablished, PG::ConnectionBad => err
+ warn "WARNING: Could not establish database connection for #{db_config.name}: #{err.message}"
+ rescue ActiveRecord::NoDatabaseError
+ end
+
+ {
+ name: db_config.name,
+ config: db_config,
+ database_tasks?: db_config.database_tasks?,
+ identifier: identifier
+ }
+ end.compact
+
+ unique_connections = all_connections.group_by { |connection| connection[:identifier] }
+ primary_connection = all_connections.find { |connection| ActiveRecord::Base.configurations.primary?(connection[:name]) }
+ named_connections = all_connections.index_by { |connection| connection[:name] }
+
+ warnings = []
+
+ # The `main:` should always have `database_tasks: true`
+ unless primary_connection[:database_tasks?]
+ warnings << "- The '#{primary_connection[:name]}' is required to use 'database_tasks: true'"
+ end
+
+ # Each unique database should have exactly one configuration with `database_tasks: true`
+ unique_connections.each do |identifier, connections|
+ next unless identifier
+
+ connections_with_tasks = connections.select { |connection| connection[:database_tasks?] }
+ if connections_with_tasks.many?
+ names = connections_with_tasks.pluck(:name)
+
+ warnings << "- Many configurations (#{names.join(', ')}) " \
+ "share the same database (#{identifier}). " \
+ "This will result in failures provisioning or migrating this database. " \
+ "Ensure that additional databases are configured " \
+ "with 'database_tasks: false' or are pointing to a dedicated database host."
+ end
+ end
+
+ # Each configuration with `database_tasks: false` should share the database with `main:`
+ all_connections.each do |connection|
+ share_with = Gitlab::Database.db_config_share_with(connection[:config])
+ next unless share_with
+
+ shared_connection = named_connections[share_with]
+ unless shared_connection
+ warnings << "- The '#{connection[:name]}' is expecting to share configuration with '#{share_with}', " \
+ "but no such is to be found."
+ next
+ end
+
+ # Skip if databases are yet to be provisioned
+ next unless connection[:identifier] && shared_connection[:identifier]
+
+ unless connection[:identifier] == shared_connection[:identifier]
+ warnings << "- The '#{connection[:name]}' since it is using 'database_tasks: false' " \
+ "should share database with '#{share_with}:'."
+ end
+ end
+
+ if warnings.any?
+ warnings.unshift("Database config validation failure:")
+
+ # Warn (for now) by default in production environment
+ if Gitlab::Utils.to_boolean(ENV['GITLAB_VALIDATE_DATABASE_CONFIG'], default: true)
+ warnings << "Use `export GITLAB_VALIDATE_DATABASE_CONFIG=0` to ignore this validation."
+
+ raise warnings.join("\n")
+ else
+ warnings << "Use `export GITLAB_VALIDATE_DATABASE_CONFIG=1` to enforce this validation."
+
+ warn warnings.join("\n")
+ end
+ end
+
+ ensure
+ ActiveRecord::Base.establish_connection(original_db_config) # rubocop: disable Database/EstablishConnection
+ end
+
+ Rake::Task['db:migrate'].enhance(['gitlab:db:validate_config'])
+ Rake::Task['db:schema:load'].enhance(['gitlab:db:validate_config'])
+ Rake::Task['db:schema:dump'].enhance(['gitlab:db:validate_config'])
+
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
+ Rake::Task["db:migrate:#{name}"].enhance(['gitlab:db:validate_config'])
+ Rake::Task["db:schema:load:#{name}"].enhance(['gitlab:db:validate_config'])
+ Rake::Task["db:schema:dump:#{name}"].enhance(['gitlab:db:validate_config'])
+ end
+ end
+end
diff --git a/lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake b/lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake
index 1cc18d14d78..203d500b616 100644
--- a/lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake
+++ b/lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake
@@ -1,23 +1,43 @@
# frozen_string_literal: true
+require 'httparty'
+require 'csv'
+
namespace :gitlab do
- desc "GitLab | Refresh build artifacts size project statistics for given project IDs"
+ desc "GitLab | Refresh build artifacts size project statistics for given list of Project IDs from remote CSV"
BUILD_ARTIFACTS_SIZE_REFRESH_ENQUEUE_BATCH_SIZE = 500
- task :refresh_project_statistics_build_artifacts_size, [:project_ids] => :environment do |_t, args|
- project_ids = []
- project_ids = $stdin.read.split unless $stdin.tty?
- project_ids = args.project_ids.to_s.split unless project_ids.any?
+ task :refresh_project_statistics_build_artifacts_size, [:csv_url] => :environment do |_t, args|
+ csv_url = args.csv_url
+
+ # rubocop: disable Gitlab/HTTParty
+ body = HTTParty.get(csv_url)
+ # rubocop: enable Gitlab/HTTParty
+
+ table = CSV.parse(body.to_s, headers: true)
+ project_ids = table['PROJECT_ID']
+
+ puts "Loaded #{project_ids.size} project ids to import"
+
+ imported = 0
+ missing = 0
if project_ids.any?
- project_ids.in_groups_of(BUILD_ARTIFACTS_SIZE_REFRESH_ENQUEUE_BATCH_SIZE) do |ids|
+ project_ids.in_groups_of(BUILD_ARTIFACTS_SIZE_REFRESH_ENQUEUE_BATCH_SIZE, false) do |ids|
projects = Project.where(id: ids)
Projects::BuildArtifactsSizeRefresh.enqueue_refresh(projects)
+
+ # Take a short break to allow replication to catch up
+ Kernel.sleep(1)
+
+ imported += projects.size
+ missing += ids.size - projects.size
+ puts "#{imported}/#{project_ids.size} (missing projects: #{missing})"
end
- puts 'Done.'.green
+ puts 'Done.'
else
- puts 'Please provide a string of space-separated project IDs as the argument or through the STDIN'.red
+ puts 'Project IDs must be listed in the CSV under the header PROJECT_ID'.red
end
end
end
diff --git a/lib/tasks/gitlab/setup.rake b/lib/tasks/gitlab/setup.rake
index a5289476378..006dfad3a95 100644
--- a/lib/tasks/gitlab/setup.rake
+++ b/lib/tasks/gitlab/setup.rake
@@ -30,7 +30,7 @@ namespace :gitlab do
# In production, we might want to prevent ourselves from shooting
# ourselves in the foot, so let's only do this in a test or
# development environment.
- terminate_all_connections unless Rails.env.production?
+ Rake::Task["dev:terminate_all_connections"].invoke unless Rails.env.production?
Rake::Task["db:reset"].invoke
Rake::Task["db:seed_fu"].invoke
@@ -38,24 +38,4 @@ namespace :gitlab do
puts "Quitting...".color(:red)
exit 1
end
-
- # If there are any clients connected to the DB, PostgreSQL won't let
- # you drop the database. It's possible that Sidekiq, Puma, or
- # some other client will be hanging onto a connection, preventing
- # the DROP DATABASE from working. To workaround this problem, this
- # method terminates all the connections so that a subsequent DROP
- # will work.
- def self.terminate_all_connections
- cmd = <<~SQL
- SELECT pg_terminate_backend(pg_stat_activity.pid)
- FROM pg_stat_activity
- WHERE datname = current_database()
- AND pid <> pg_backend_pid();
- SQL
-
- Gitlab::Database::EachDatabase.each_database_connection do |connection|
- connection.execute(cmd)
- rescue ActiveRecord::NoDatabaseError
- end
- end
end
diff --git a/lib/tasks/gitlab/tw/codeowners.rake b/lib/tasks/gitlab/tw/codeowners.rake
index 358bc6c31eb..0aed017c84a 100644
--- a/lib/tasks/gitlab/tw/codeowners.rake
+++ b/lib/tasks/gitlab/tw/codeowners.rake
@@ -12,17 +12,16 @@ namespace :tw do
CodeOwnerRule.new("Adoption", '@kpaizee'),
CodeOwnerRule.new('Activation', '@kpaizee'),
CodeOwnerRule.new('Adoption', '@kpaizee'),
- CodeOwnerRule.new('APM', '@ngaskill'),
- CodeOwnerRule.new('Authentication & Authorization', '@eread'),
+ CodeOwnerRule.new('Authentication and Authorization', '@eread'),
CodeOwnerRule.new('Certify', '@msedlakjakubowski'),
CodeOwnerRule.new('Code Review', '@aqualls'),
CodeOwnerRule.new('Compliance', '@eread'),
CodeOwnerRule.new('Composition Analysis', '@rdickenson'),
CodeOwnerRule.new('Configure', '@marcia'),
- CodeOwnerRule.new('Container Security', '@ngaskill'),
+ CodeOwnerRule.new('Container Security', '@claytoncornell'),
CodeOwnerRule.new('Contributor Experience', '@eread'),
CodeOwnerRule.new('Conversion', '@kpaizee'),
- CodeOwnerRule.new('Database', '@aqualls'),
+ CodeOwnerRule.new('Database', '@marcia'),
CodeOwnerRule.new('Development', '@marcia'),
CodeOwnerRule.new('Distribution', '@axil'),
CodeOwnerRule.new('Distribution (Charts)', '@axil'),
@@ -37,26 +36,28 @@ namespace :tw do
CodeOwnerRule.new('Geo', '@axil'),
CodeOwnerRule.new('Gitaly', '@eread'),
CodeOwnerRule.new('Global Search', '@marcia'),
- CodeOwnerRule.new('Health', '@ngaskill'),
- CodeOwnerRule.new('Import', '@ngaskill'),
+ CodeOwnerRule.new('Import', '@eread'),
CodeOwnerRule.new('Infrastructure', '@marcia'),
CodeOwnerRule.new('Integrations', '@kpaizee'),
CodeOwnerRule.new('Knowledge', '@aqualls'),
CodeOwnerRule.new('License', '@sselhorn'),
CodeOwnerRule.new('Memory', '@marcia'),
- CodeOwnerRule.new('Monitor', '@ngaskill'),
+ CodeOwnerRule.new('Monitor', '@msedlakjakubowski'),
+ CodeOwnerRule.new('Observability', 'msedlakjakubowski'),
CodeOwnerRule.new('Optimize', '@fneill'),
- CodeOwnerRule.new('Package', '@ngaskill'),
+ CodeOwnerRule.new('Package', '@claytoncornell'),
CodeOwnerRule.new('Pipeline Authoring', '@marcel.amirault'),
CodeOwnerRule.new('Pipeline Execution', '@marcel.amirault'),
+ CodeOwnerRule.new('Pipeline Insights', '@marcel.amirault'),
CodeOwnerRule.new('Portfolio Management', '@msedlakjakubowski'),
- CodeOwnerRule.new('Product Intelligence', '@fneill'),
+ CodeOwnerRule.new('Product Intelligence', '@claytoncornell'),
CodeOwnerRule.new('Product Planning', '@msedlakjakubowski'),
CodeOwnerRule.new('Project Management', '@msedlakjakubowski'),
CodeOwnerRule.new('Provision', '@sselhorn'),
CodeOwnerRule.new('Purchase', '@sselhorn'),
CodeOwnerRule.new('Redirect', 'Redirect'),
CodeOwnerRule.new('Release', '@rdickenson'),
+ CodeOwnerRule.new('Respond', '@msedlakjakubowski'),
CodeOwnerRule.new('Runner', '@sselhorn'),
CodeOwnerRule.new('Sharding', '@marcia'),
CodeOwnerRule.new('Source Code', '@aqualls'),
@@ -64,9 +65,9 @@ namespace :tw do
CodeOwnerRule.new('Static Site Editor', '@aqualls'),
CodeOwnerRule.new('Style Guide', '@sselhorn'),
CodeOwnerRule.new('Testing', '@eread'),
- CodeOwnerRule.new('Threat Insights', '@fneill'),
+ CodeOwnerRule.new('Threat Insights', '@claytoncornell'),
CodeOwnerRule.new('Utilization', '@sselhorn'),
- CodeOwnerRule.new('Vulnerability Research', '@fneill'),
+ CodeOwnerRule.new('Vulnerability Research', '@claytoncornell'),
CodeOwnerRule.new('Workspace', '@fneill')
].freeze
diff --git a/lib/tasks/gitlab_danger.rake b/lib/tasks/gitlab_danger.rake
deleted file mode 100644
index ff9464a588a..00000000000
--- a/lib/tasks/gitlab_danger.rake
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-desc 'Run local Danger rules'
-task :danger_local do
- require_relative '../../tooling/danger/project_helper'
- require 'gitlab/popen'
-
- puts("#{Tooling::Danger::ProjectHelper.local_warning_message}\n")
-
- # _status will _always_ be 0, regardless of failure or success :(
- output, _status = Gitlab::Popen.popen(%w{danger dry_run})
-
- if output.empty?
- puts(Tooling::Danger::ProjectHelper.success_message)
- else
- puts(output)
- exit(1)
- end
-end
diff --git a/locale/am_ET/gitlab.po b/locale/am_ET/gitlab.po
index 5a3b5b11f8d..6b5a7be6cff 100644
--- a/locale/am_ET/gitlab.po
+++ b/locale/am_ET/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: am\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr " እባክዎ á‹­áŒá‰¡á¢"
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr " ይህን á‹á‹­áˆ እንደገና %{action} ይሞክሩá¢"
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " ይህንን ከ %{grace_period_deadline} በáŠá‰µ ማድረጠያስáˆáˆáŒá‹Žá‰³áˆ á¡á¡"
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "%d ተጨማሪ አስተያየት"
msgstr[1] "%d ተጨማሪ አስተያየቶች"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,10 +375,10 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d ማስጠንቀቂ ያለዠጥያቄ"
-msgstr[1] "%d ማስጠንቀቂ á‹«áˆá‰¸á‹ ጥያቄዎች"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr "የá•áˆ®áŒ€áŠ­á‰± fork áˆáŠ•áŒ­ á‹á‰…ተኛ እይታ ስላለዠ%{
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index bf798585eb2..ea51f7ff683 100644
--- a/locale/ar_SA/gitlab.po
+++ b/locale/ar_SA/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ar\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:09\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -553,6 +547,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -580,6 +583,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -607,8 +619,8 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -772,9 +784,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -1042,6 +1051,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -1120,7 +1132,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -1129,9 +1141,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -1201,6 +1210,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1348,10 +1360,22 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1684,7 +1708,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -2098,9 +2122,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -2293,6 +2326,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -2323,9 +2359,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2479,6 +2512,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2536,6 +2572,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2659,6 +2698,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2887,6 +2929,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2968,6 +3013,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2980,6 +3028,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2992,6 +3043,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -3076,12 +3130,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -3121,6 +3181,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -3136,6 +3217,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -3151,6 +3235,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -3160,9 +3250,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -3172,6 +3259,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -4078,7 +4168,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -4192,6 +4282,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -4246,6 +4339,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4489,6 +4585,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4606,6 +4705,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4696,6 +4798,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -5209,6 +5314,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5455,12 +5563,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5557,6 +5659,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5587,6 +5692,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5608,6 +5716,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5968,9 +6124,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5992,6 +6145,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -6082,6 +6238,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6310,6 +6472,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -6325,6 +6490,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6334,24 +6502,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6418,6 +6601,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6526,6 +6712,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6685,9 +6874,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6727,6 +6913,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6769,12 +6958,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6787,9 +6982,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6802,6 +7003,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7384,6 +7588,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -7414,6 +7621,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7585,6 +7798,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7699,6 +7915,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7942,24 +8161,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -8017,6 +8224,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -8176,6 +8392,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -8200,7 +8419,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -8215,6 +8434,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -8254,22 +8476,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -8278,10 +8503,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8293,6 +8536,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8308,10 +8554,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8323,10 +8572,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8341,9 +8587,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8377,13 +8620,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8404,10 +8641,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8419,13 +8653,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8443,9 +8674,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8467,6 +8695,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8509,9 +8740,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8620,10 +8848,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8671,16 +8896,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8716,6 +8932,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8725,6 +8944,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8788,9 +9010,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8836,7 +9055,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8929,9 +9148,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -9181,12 +9397,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -9199,7 +9421,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9445,9 +9667,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9574,6 +9793,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9607,9 +9829,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9634,6 +9853,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9643,7 +9865,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9655,12 +9877,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9769,6 +10003,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9814,6 +10051,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9823,6 +10063,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9892,6 +10135,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -10021,9 +10270,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -10081,7 +10327,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -10180,6 +10426,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10219,6 +10468,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10528,6 +10780,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10564,6 +10819,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10579,9 +10840,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10699,7 +10957,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10738,9 +10996,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10852,9 +11116,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10879,6 +11140,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10909,9 +11173,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -11164,43 +11425,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -11215,10 +11458,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11329,19 +11572,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11470,15 +11710,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11539,12 +11797,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11560,10 +11824,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11710,6 +11974,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11764,9 +12031,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -12016,6 +12280,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -12145,9 +12412,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -12166,9 +12430,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12835,6 +13096,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12901,6 +13189,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13570,6 +13861,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13627,6 +13921,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13717,6 +14014,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13762,6 +14062,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13864,9 +14203,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -14191,6 +14527,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14470,7 +14809,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14602,6 +14941,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14617,9 +14959,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14701,7 +15040,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -15073,6 +15415,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -15082,6 +15430,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -15325,6 +15676,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15337,6 +15691,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -15457,6 +15814,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15586,9 +15946,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15703,6 +16069,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -16129,7 +16498,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -16270,9 +16639,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16537,9 +16903,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16567,6 +16930,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16630,9 +16996,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -17182,9 +17545,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -17197,6 +17557,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -17248,9 +17611,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17476,15 +17836,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17524,6 +17893,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17650,9 +18022,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17662,6 +18031,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17866,9 +18271,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -18271,13 +18673,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18400,6 +18802,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18418,9 +18823,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18541,6 +18943,117 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18715,6 +19228,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18868,9 +19384,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18946,9 +19459,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -19078,6 +19588,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -19156,7 +19672,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -19186,12 +19702,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -19201,9 +19711,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19546,9 +20053,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19627,15 +20131,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19927,6 +20422,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19936,6 +20434,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19993,6 +20500,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -20008,6 +20521,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -20089,6 +20605,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -20110,6 +20629,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20119,6 +20641,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20227,6 +20752,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20431,6 +20962,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20545,6 +21079,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20557,12 +21094,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20710,9 +21253,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20728,12 +21268,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20827,6 +21361,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20845,6 +21382,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20857,6 +21400,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -21049,9 +21595,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -21094,7 +21637,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -21265,10 +21808,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -21283,12 +21829,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -21298,6 +21838,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21319,7 +21862,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -21337,6 +21886,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21346,10 +21898,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21361,6 +21919,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21373,6 +21934,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21628,9 +22192,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21643,6 +22204,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21706,6 +22270,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21715,6 +22282,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21742,15 +22315,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21766,9 +22348,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21778,6 +22378,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21802,6 +22405,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22165,6 +22771,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -22273,6 +22882,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22414,6 +23029,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22426,6 +23044,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22444,6 +23065,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22471,9 +23095,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22528,6 +23149,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22537,6 +23167,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22552,6 +23188,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22741,9 +23383,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -23017,6 +23656,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -23050,6 +23692,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -23212,6 +23857,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -23332,9 +23980,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23356,6 +24001,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23599,9 +24250,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23638,7 +24286,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23713,7 +24361,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -24271,9 +24919,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -24397,6 +25042,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24415,6 +25063,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24433,12 +25084,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24556,6 +25216,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24652,16 +25315,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24772,6 +25435,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24847,6 +25537,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -25033,9 +25726,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -25132,6 +25822,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -25207,6 +25900,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -25222,9 +25918,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -25273,6 +25966,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -25321,6 +26017,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -25348,12 +26047,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25432,9 +26125,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25456,7 +26146,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25489,9 +26179,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25573,6 +26260,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25732,6 +26422,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -26188,10 +26881,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -26341,6 +27034,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -26359,9 +27055,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26392,10 +27085,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26410,9 +27103,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26440,6 +27130,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26581,6 +27274,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -27352,6 +28048,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27628,6 +28327,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27637,10 +28339,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27688,7 +28393,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27697,13 +28402,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27712,7 +28417,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27730,6 +28435,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27742,9 +28450,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27799,24 +28513,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27874,9 +28582,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27892,9 +28597,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -28228,9 +28930,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -28285,7 +28984,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -28330,7 +29029,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28438,6 +29137,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28747,6 +29449,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28768,9 +29473,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28807,6 +29509,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28912,6 +29617,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28993,9 +29701,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29500,7 +30205,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29599,6 +30304,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29770,6 +30478,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29833,6 +30544,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29851,9 +30565,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29998,6 +30709,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30607,7 +31324,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -31042,9 +31762,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -31054,9 +31780,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -31291,6 +32014,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31501,7 +32227,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31603,12 +32332,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31621,6 +32356,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31636,9 +32377,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -32161,7 +32908,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -32227,9 +32974,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -32281,10 +33025,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -32305,6 +33049,30 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -32314,7 +33082,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -32341,9 +33109,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -32356,12 +33136,24 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -32371,6 +33163,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -32380,18 +33175,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32413,25 +33202,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32440,15 +33235,33 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32482,9 +33295,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32497,21 +33316,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32521,7 +33370,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32542,6 +33391,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32551,16 +33403,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32578,7 +33433,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32596,7 +33451,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32605,9 +33460,6 @@ 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 ""
@@ -32641,9 +33493,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32758,10 +33607,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32953,6 +33802,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -33121,6 +33973,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -33145,6 +34000,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33271,16 +34135,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -33337,6 +34204,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33352,6 +34225,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -33367,12 +34246,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -33382,6 +34270,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -33394,9 +34285,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33445,6 +34348,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33463,12 +34369,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33487,6 +34402,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33496,10 +34414,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33523,6 +34444,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33607,6 +34537,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33748,6 +34681,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33772,7 +34708,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33784,16 +34720,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33853,6 +34792,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33865,15 +34807,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33910,15 +34855,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -34057,6 +34999,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34393,6 +35338,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34438,6 +35386,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -34483,9 +35434,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34744,6 +35692,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34915,6 +35866,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -35086,6 +36040,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -35095,6 +36052,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -35134,9 +36094,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -35269,9 +36226,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35695,6 +36649,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35839,6 +36796,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35911,9 +36871,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35962,6 +36919,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -36127,10 +37087,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36511,8 +37471,14 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36655,12 +37621,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36817,6 +37777,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36850,9 +37816,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -37291,9 +38254,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -37324,6 +38284,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -37336,6 +38299,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -37357,12 +38323,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37660,6 +38632,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37669,6 +38644,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37690,6 +38671,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37702,6 +38686,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37987,9 +38974,6 @@ 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 ""
@@ -38131,6 +39115,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -38143,7 +39130,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -38170,7 +39157,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -38179,7 +39166,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -38266,6 +39253,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -38293,6 +39286,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -38419,9 +39415,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38659,6 +39661,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -39139,6 +40144,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -39220,6 +40228,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -39238,7 +40249,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -39388,9 +40399,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -39436,6 +40444,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39529,6 +40540,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39718,6 +40732,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39922,6 +40939,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39958,6 +40978,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -40084,6 +41107,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -40264,9 +41290,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -40285,9 +41308,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -40297,6 +41317,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -40354,7 +41377,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40591,6 +41614,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40600,6 +41626,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -41419,9 +42448,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -41446,6 +42472,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41551,9 +42580,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41575,6 +42601,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41695,6 +42724,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41791,9 +42823,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41839,6 +42868,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41860,6 +42892,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -42160,6 +43195,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -42205,9 +43243,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -42250,13 +43285,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -42277,6 +43312,9 @@ msgstr[5] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -42424,9 +43462,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -42451,12 +43486,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42469,18 +43498,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42493,18 +43510,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42580,6 +43588,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42589,6 +43600,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42799,6 +43813,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42892,6 +43912,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42922,6 +43945,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -43006,6 +44032,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -43090,10 +44119,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -43273,6 +44302,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -43285,6 +44317,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43576,7 +44611,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43849,6 +44884,15 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43948,6 +44992,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -44026,6 +45079,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -44056,9 +45118,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -44146,45 +45214,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -44203,7 +45232,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -44317,6 +45346,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44665,6 +45697,15 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44764,6 +45805,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44887,9 +45934,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44962,6 +46006,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -45082,9 +46129,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -45145,6 +46189,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -45250,9 +46297,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -45457,9 +46501,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/as_IN/gitlab.po b/locale/as_IN/gitlab.po
index bed62d97885..6060f25f386 100644
--- a/locale/as_IN/gitlab.po
+++ b/locale/as_IN/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: as\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:41\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/az_AZ/gitlab.po b/locale/az_AZ/gitlab.po
index 9ac97ca2078..1c92fa9a5f5 100644
--- a/locale/az_AZ/gitlab.po
+++ b/locale/az_AZ/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: az\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ba_RU/gitlab.po b/locale/ba_RU/gitlab.po
index 5a88c7ef364..29d89739d08 100644
--- a/locale/ba_RU/gitlab.po
+++ b/locale/ba_RU/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ba\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -288,6 +282,10 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -300,6 +298,10 @@ msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -312,8 +314,8 @@ msgid "%d project selected"
msgid_plural "%d projects selected"
msgstr[0] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgid "%d second"
@@ -392,9 +394,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -617,6 +616,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -695,7 +697,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -704,9 +706,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -776,6 +775,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -903,10 +905,17 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1189,7 +1198,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1478,9 +1487,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1673,6 +1691,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1703,9 +1724,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1859,6 +1877,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -1916,6 +1937,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2039,6 +2063,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2267,6 +2294,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2348,6 +2378,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2360,6 +2393,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2372,6 +2408,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2456,12 +2495,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2501,6 +2546,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2516,6 +2582,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2531,6 +2600,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2540,9 +2615,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2552,6 +2624,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3458,7 +3533,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3572,6 +3647,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3626,6 +3704,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3869,6 +3950,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -3981,6 +4065,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4071,6 +4158,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4549,6 +4639,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4790,12 +4883,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -4882,6 +4969,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -4912,6 +5002,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -4933,6 +5026,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5293,9 +5434,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5317,6 +5455,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5407,6 +5548,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5630,6 +5777,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5645,6 +5795,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5654,24 +5807,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5733,6 +5901,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5836,6 +6007,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -5995,9 +6169,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6037,6 +6208,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6079,12 +6253,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6097,9 +6277,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6112,6 +6298,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6689,6 +6878,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6719,6 +6911,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -6880,6 +7078,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -6994,6 +7195,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7237,24 +7441,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7312,6 +7504,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7471,6 +7672,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7495,7 +7699,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7510,6 +7714,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7549,22 +7756,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7573,10 +7783,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7588,6 +7816,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7603,10 +7834,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7618,10 +7852,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7636,9 +7867,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7672,13 +7900,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7699,10 +7921,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7714,13 +7933,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7733,9 +7949,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7757,6 +7970,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7799,9 +8015,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -7910,10 +8123,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -7961,16 +8171,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8006,6 +8207,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8015,6 +8219,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8078,9 +8285,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8126,7 +8330,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8219,9 +8423,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8471,12 +8672,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8489,7 +8696,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8730,9 +8937,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -8859,6 +9063,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -8892,9 +9099,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -8919,6 +9123,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -8928,7 +9135,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -8940,12 +9147,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9054,6 +9273,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9099,6 +9321,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9108,6 +9333,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9177,6 +9405,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9296,9 +9530,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9356,7 +9587,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9450,6 +9681,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9489,6 +9723,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9798,6 +10035,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9834,6 +10074,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9849,9 +10095,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -9969,7 +10212,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10008,9 +10251,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10122,9 +10371,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10149,6 +10395,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10179,9 +10428,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10434,43 +10680,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10485,10 +10713,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10599,19 +10827,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10740,15 +10965,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10799,12 +11042,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10820,10 +11069,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -10970,6 +11219,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11024,9 +11276,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11271,6 +11520,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11400,9 +11652,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11421,9 +11670,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12060,6 +12306,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12121,6 +12394,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12765,6 +13041,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12822,6 +13101,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -12912,6 +13194,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -12957,6 +13242,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13059,9 +13383,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13386,6 +13707,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13660,7 +13984,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13792,6 +14116,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13807,9 +14134,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -13891,7 +14215,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14263,6 +14590,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14272,6 +14605,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14510,6 +14846,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14522,6 +14861,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14642,6 +14984,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14771,9 +15116,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -14883,6 +15234,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15304,7 +15658,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15445,9 +15799,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15712,9 +16063,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15742,6 +16090,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15805,9 +16156,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16357,9 +16705,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16372,6 +16717,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16423,9 +16771,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16651,15 +16996,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16699,6 +17053,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16825,9 +17182,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -16837,6 +17191,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17041,9 +17431,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17446,13 +17833,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17575,6 +17962,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17593,9 +17983,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17716,6 +18103,107 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -17885,6 +18373,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18033,9 +18524,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18111,9 +18599,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18243,6 +18728,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18311,7 +18802,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18341,12 +18832,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18356,9 +18841,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18696,9 +19178,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18777,15 +19256,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19077,6 +19547,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19086,6 +19559,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19143,6 +19625,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19158,6 +19646,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19239,6 +19730,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19260,6 +19754,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19269,6 +19766,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19377,6 +19877,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19576,6 +20082,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19690,6 +20199,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19702,12 +20214,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -19855,9 +20373,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -19873,12 +20388,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -19972,6 +20481,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -19990,6 +20502,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20002,6 +20520,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20194,9 +20715,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20239,7 +20757,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20410,10 +20928,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20428,12 +20949,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20443,6 +20958,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20464,7 +20982,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20482,6 +21006,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20491,10 +21018,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20506,6 +21039,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20518,6 +21054,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20773,9 +21312,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20788,6 +21324,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -20851,6 +21390,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -20860,6 +21402,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -20887,15 +21435,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -20911,9 +21468,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -20923,6 +21498,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -20947,6 +21525,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21305,6 +21886,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21413,6 +21997,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21554,6 +22144,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21566,6 +22159,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21584,6 +22180,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21611,9 +22210,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21638,6 +22234,10 @@ msgid "LicenseCompliance|License Compliance detected %d new license and policy v
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
msgstr[0] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21647,6 +22247,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21662,6 +22268,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -21851,9 +22463,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22127,6 +22736,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22160,6 +22772,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22322,6 +22937,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22442,9 +23060,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22466,6 +23081,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22699,9 +23320,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22738,7 +23356,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22813,7 +23431,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23366,9 +23984,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23487,6 +24102,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23505,6 +24123,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23523,12 +24144,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23646,6 +24276,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23742,16 +24375,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23857,6 +24490,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -23932,6 +24592,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24118,9 +24781,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24212,6 +24872,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24287,6 +24950,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24302,9 +24968,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24353,6 +25016,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24401,6 +25067,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24428,12 +25097,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24512,9 +25175,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24536,7 +25196,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24569,9 +25229,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24653,6 +25310,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24807,6 +25467,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25243,10 +25906,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25391,6 +26054,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25409,9 +26075,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25442,10 +26105,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25460,9 +26123,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25490,6 +26150,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25631,6 +26294,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26397,6 +27063,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26673,6 +27342,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26682,10 +27354,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26733,7 +27408,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26742,13 +27417,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26757,7 +27432,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26775,6 +27450,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26787,9 +27465,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -26844,24 +27528,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -26919,9 +27597,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -26937,9 +27612,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27273,9 +27945,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27330,7 +27999,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27375,7 +28044,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27483,6 +28152,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27792,6 +28464,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -27813,9 +28488,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -27852,6 +28524,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -27957,6 +28632,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28038,9 +28716,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28545,7 +29220,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28644,6 +29319,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -28815,6 +29493,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -28878,6 +29559,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -28896,9 +29580,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29043,6 +29724,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29652,7 +30339,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30082,9 +30772,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30094,9 +30790,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30326,6 +31019,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30536,7 +31232,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30613,12 +31312,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30631,6 +31336,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30646,9 +31357,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31156,7 +31873,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31217,9 +31934,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31271,10 +31985,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31295,6 +32009,20 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31304,7 +32032,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31331,9 +32059,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31346,12 +32086,19 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31361,6 +32108,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31370,18 +32120,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31403,25 +32147,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31430,15 +32180,28 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31472,9 +32235,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31487,21 +32256,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31511,7 +32310,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31532,6 +32331,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31541,16 +32343,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31568,7 +32373,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31586,7 +32391,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31595,9 +32400,6 @@ 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 ""
@@ -31631,9 +32433,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31748,10 +32547,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -31943,6 +32742,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32056,6 +32858,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32080,6 +32885,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32206,16 +33020,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32272,6 +33089,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32287,6 +33110,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32302,12 +33131,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32317,6 +33155,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32329,9 +33170,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32380,6 +33233,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32398,12 +33254,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32422,6 +33287,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32431,10 +33299,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32458,6 +33329,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32542,6 +33422,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32683,6 +33566,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32707,7 +33593,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32719,16 +33605,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -32788,6 +33677,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -32800,15 +33692,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -32845,15 +33740,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -32992,6 +33884,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33328,6 +34223,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33373,6 +34271,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33418,9 +34319,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33674,6 +34572,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -33840,6 +34741,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34011,6 +34915,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34020,6 +34927,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34059,9 +34969,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34194,9 +35101,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34620,6 +35524,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34764,6 +35671,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -34836,9 +35746,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -34887,6 +35794,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35052,10 +35962,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35436,8 +36346,9 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35580,12 +36491,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35742,6 +36647,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35775,9 +36686,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36181,9 +37089,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36214,6 +37119,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36226,6 +37134,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36247,12 +37158,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36545,6 +37462,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36554,6 +37474,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36575,6 +37501,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36587,6 +37516,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -36872,9 +37804,6 @@ 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 ""
@@ -37016,6 +37945,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37028,7 +37960,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37055,7 +37987,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37064,7 +37996,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37151,6 +38083,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37178,6 +38116,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37304,9 +38245,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37544,6 +38491,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38014,6 +38964,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38095,6 +39048,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38113,7 +39069,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38263,9 +39219,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38311,6 +39264,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38404,6 +39360,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38593,6 +39552,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -38797,6 +39759,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -38833,6 +39798,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -38959,6 +39927,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39139,9 +40110,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39160,9 +40128,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39172,6 +40137,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39229,7 +40197,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39466,6 +40434,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39475,6 +40446,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40279,9 +41253,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40306,6 +41277,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40411,9 +41385,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40435,6 +41406,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40555,6 +41529,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40651,9 +41628,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40699,6 +41673,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40720,6 +41697,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41020,6 +42000,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41065,9 +42048,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41110,13 +42090,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41132,6 +42112,9 @@ msgstr[0] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41279,9 +42262,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41306,12 +42286,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41324,18 +42298,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41348,18 +42310,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41435,6 +42388,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41444,6 +42400,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41654,6 +42613,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41747,6 +42712,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -41777,6 +42745,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -41861,6 +42832,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -41940,10 +42914,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42123,6 +43097,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42135,6 +43112,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42426,7 +43406,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42679,6 +43659,10 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -42773,6 +43757,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -42851,6 +43844,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -42876,9 +43878,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -42961,45 +43969,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43018,7 +43987,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43122,6 +44091,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43455,6 +44427,10 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43549,6 +44525,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43662,9 +44644,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43737,6 +44716,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -43857,9 +44839,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -43920,6 +44899,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44005,9 +44987,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44207,9 +45186,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index bd00e57f63f..89ca0e01668 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: bg\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:13\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr "ОтноÑно автоматичното внедрÑване"
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Преглед на папката"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr "Подаване"
msgid "CommitMessage|Add %{file_name}"
msgstr "ДобавÑне на „%{file_name}“"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "От Ñъздаването на проблема до внедрÑването в крайната верÑиÑ"
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr "Ðова папка"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr "Ðов план"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Ðов отрÑзък"
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr "СобÑтвеник"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Схеми"
@@ -26873,10 +27551,13 @@ msgstr "Графики за Ñхемите"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr "Изберете целеви клон"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "Качване на нов файл"
@@ -39385,9 +40364,6 @@ msgstr "Качване на файл"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr "щракнете за качване"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po
index 0f9699254af..760609395e2 100644
--- a/locale/bn_BD/gitlab.po
+++ b/locale/bn_BD/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: bn\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po
index 5aaabaaf15e..0a719de4492 100644
--- a/locale/bn_IN/gitlab.po
+++ b/locale/bn_IN/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: bn-IN\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/br_FR/gitlab.po b/locale/br_FR/gitlab.po
index 1ad70c99a0f..cdc2172d971 100644
--- a/locale/br_FR/gitlab.po
+++ b/locale/br_FR/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: br-FR\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:41\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -500,6 +494,14 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -524,6 +526,14 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -548,8 +558,8 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -696,9 +706,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -957,6 +964,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -1035,7 +1045,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -1044,9 +1054,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -1116,6 +1123,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1259,10 +1269,21 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1585,7 +1606,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1974,9 +1995,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -2169,6 +2199,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -2199,9 +2232,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2355,6 +2385,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2412,6 +2445,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2535,6 +2571,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2763,6 +2802,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2844,6 +2886,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2856,6 +2901,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2868,6 +2916,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2952,12 +3003,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2997,6 +3054,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -3012,6 +3090,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -3027,6 +3108,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -3036,9 +3123,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -3048,6 +3132,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3954,7 +4041,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -4068,6 +4155,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -4122,6 +4212,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4365,6 +4458,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4481,6 +4577,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4571,6 +4670,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -5077,6 +5179,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5322,12 +5427,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5422,6 +5521,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5452,6 +5554,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5473,6 +5578,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5833,9 +5986,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5857,6 +6007,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5947,6 +6100,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6174,6 +6333,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -6189,6 +6351,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6198,24 +6363,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6281,6 +6461,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6388,6 +6571,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6547,9 +6733,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6589,6 +6772,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6631,12 +6817,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6649,9 +6841,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6664,6 +6862,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7245,6 +7446,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -7275,6 +7479,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7444,6 +7654,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7558,6 +7771,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7801,24 +8017,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7876,6 +8080,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -8035,6 +8248,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -8059,7 +8275,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -8074,6 +8290,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -8113,22 +8332,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -8137,10 +8359,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8152,6 +8392,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8167,10 +8410,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8182,10 +8428,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8200,9 +8443,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8236,13 +8476,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8263,10 +8497,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8278,13 +8509,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8301,9 +8529,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8325,6 +8550,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8367,9 +8595,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8478,10 +8703,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8529,16 +8751,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8574,6 +8787,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8583,6 +8799,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8646,9 +8865,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8694,7 +8910,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8787,9 +9003,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -9039,12 +9252,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -9057,7 +9276,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9302,9 +9521,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9431,6 +9647,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9464,9 +9683,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9491,6 +9707,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9500,7 +9719,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9512,12 +9731,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9626,6 +9857,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9671,6 +9905,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9680,6 +9917,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9749,6 +9989,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9876,9 +10122,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9936,7 +10179,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -10034,6 +10277,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10073,6 +10319,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10382,6 +10631,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10418,6 +10670,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10433,9 +10691,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10553,7 +10808,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10592,9 +10847,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10706,9 +10967,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10733,6 +10991,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10763,9 +11024,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -11018,43 +11276,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -11069,10 +11309,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11183,19 +11423,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11324,15 +11561,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11391,12 +11646,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11412,10 +11673,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11562,6 +11823,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11616,9 +11880,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11867,6 +12128,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11996,9 +12260,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -12017,9 +12278,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12680,6 +12938,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12745,6 +13030,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13409,6 +13697,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13466,6 +13757,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13556,6 +13850,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13601,6 +13898,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13703,9 +14039,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -14030,6 +14363,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14308,7 +14644,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14440,6 +14776,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14455,9 +14794,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14539,7 +14875,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14911,6 +15250,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14920,6 +15265,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -15162,6 +15510,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15174,6 +15525,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -15294,6 +15648,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15423,9 +15780,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15539,6 +15902,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15964,7 +16330,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -16105,9 +16471,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16372,9 +16735,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16402,6 +16762,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16465,9 +16828,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -17017,9 +17377,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -17032,6 +17389,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -17083,9 +17443,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17311,15 +17668,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17359,6 +17725,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17485,9 +17854,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17497,6 +17863,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17701,9 +18103,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -18106,13 +18505,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18235,6 +18634,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18253,9 +18655,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18376,6 +18775,115 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18549,6 +19057,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18701,9 +19212,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18779,9 +19287,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18911,6 +19416,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18987,7 +19498,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -19017,12 +19528,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -19032,9 +19537,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19376,9 +19878,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19457,15 +19956,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19757,6 +20247,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19766,6 +20259,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19823,6 +20325,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19838,6 +20346,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19919,6 +20430,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19940,6 +20454,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19949,6 +20466,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20057,6 +20577,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20260,6 +20786,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20374,6 +20903,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20386,12 +20918,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20539,9 +21077,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20557,12 +21092,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20656,6 +21185,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20674,6 +21206,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20686,6 +21224,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20878,9 +21419,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20923,7 +21461,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -21094,10 +21632,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -21112,12 +21653,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -21127,6 +21662,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21148,7 +21686,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -21166,6 +21710,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21175,10 +21722,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21190,6 +21743,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21202,6 +21758,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21457,9 +22016,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21472,6 +22028,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21535,6 +22094,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21544,6 +22106,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21571,15 +22139,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21595,9 +22172,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21607,6 +22202,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21631,6 +22229,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21993,6 +22594,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -22101,6 +22705,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22242,6 +22852,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22254,6 +22867,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22272,6 +22888,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22299,9 +22918,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22350,6 +22966,14 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22359,6 +22983,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22374,6 +23004,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22563,9 +23199,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22839,6 +23472,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22872,6 +23508,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -23034,6 +23673,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -23154,9 +23796,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23178,6 +23817,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23419,9 +24064,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23458,7 +24100,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23533,7 +24175,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -24090,9 +24732,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -24215,6 +24854,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24233,6 +24875,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24251,12 +24896,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24374,6 +25028,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24470,16 +25127,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24589,6 +25246,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24664,6 +25348,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24850,9 +25537,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24948,6 +25632,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -25023,6 +25710,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -25038,9 +25728,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -25089,6 +25776,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -25137,6 +25827,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -25164,12 +25857,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25248,9 +25935,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25272,7 +25956,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25305,9 +25989,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25389,6 +26070,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25547,6 +26231,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25999,10 +26686,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -26151,6 +26838,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -26169,9 +26859,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26202,10 +26889,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26220,9 +26907,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26250,6 +26934,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26391,6 +27078,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -27161,6 +27851,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27437,6 +28130,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27446,10 +28142,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27497,7 +28196,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27506,13 +28205,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27521,7 +28220,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27539,6 +28238,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27551,9 +28253,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27608,24 +28316,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27683,9 +28385,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27701,9 +28400,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -28037,9 +28733,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -28094,7 +28787,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -28139,7 +28832,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28247,6 +28940,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28556,6 +29252,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28577,9 +29276,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28616,6 +29312,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28721,6 +29420,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28802,9 +29504,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29309,7 +30008,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29408,6 +30107,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29579,6 +30281,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29642,6 +30347,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29660,9 +30368,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29807,6 +30512,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30416,7 +31127,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30850,9 +31564,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30862,9 +31582,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -31098,6 +31815,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31308,7 +32028,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31405,12 +32128,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31423,6 +32152,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31438,9 +32173,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31960,7 +32701,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -32025,9 +32766,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -32079,10 +32817,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -32103,6 +32841,28 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -32112,7 +32872,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -32139,9 +32899,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -32154,12 +32926,23 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -32169,6 +32952,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -32178,18 +32964,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32211,25 +32991,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32238,15 +33024,32 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32280,9 +33083,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32295,21 +33104,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32319,7 +33158,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32340,6 +33179,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32349,16 +33191,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32376,7 +33221,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32394,7 +33239,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32403,9 +33248,6 @@ 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 ""
@@ -32439,9 +33281,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32556,10 +33395,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32751,6 +33590,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32908,6 +33750,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32932,6 +33777,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33058,16 +33912,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -33124,6 +33981,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33139,6 +34002,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -33154,12 +34023,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -33169,6 +34047,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -33181,9 +34062,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33232,6 +34125,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33250,12 +34146,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33274,6 +34179,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33283,10 +34191,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33310,6 +34221,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33394,6 +34314,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33535,6 +34458,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33559,7 +34485,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33571,16 +34497,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33640,6 +34569,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33652,15 +34584,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33697,15 +34632,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33844,6 +34776,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34180,6 +35115,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34225,6 +35163,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -34270,9 +35211,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34530,6 +35468,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34700,6 +35641,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34871,6 +35815,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34880,6 +35827,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34919,9 +35869,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -35054,9 +36001,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35480,6 +36424,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35624,6 +36571,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35696,9 +36646,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35747,6 +36694,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35912,10 +36862,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36296,8 +37246,13 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36440,12 +37395,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36602,6 +37551,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36635,9 +37590,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -37069,9 +38021,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -37102,6 +38051,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -37114,6 +38066,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -37135,12 +38090,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37437,6 +38398,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37446,6 +38410,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37467,6 +38437,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37479,6 +38452,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37764,9 +38740,6 @@ 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 ""
@@ -37908,6 +38881,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37920,7 +38896,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37947,7 +38923,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37956,7 +38932,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -38043,6 +39019,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -38070,6 +39052,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -38196,9 +39181,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38436,6 +39427,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38914,6 +39908,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38995,6 +39992,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -39013,7 +40013,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -39163,9 +40163,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -39211,6 +40208,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39304,6 +40304,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39493,6 +40496,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39697,6 +40703,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39733,6 +40742,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39859,6 +40871,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -40039,9 +41054,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -40060,9 +41072,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -40072,6 +41081,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -40129,7 +41141,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40366,6 +41378,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40375,6 +41390,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -41191,9 +42209,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -41218,6 +42233,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41323,9 +42341,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41347,6 +42362,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41467,6 +42485,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41563,9 +42584,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41611,6 +42629,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41632,6 +42653,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41932,6 +42956,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41977,9 +43004,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -42022,13 +43046,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -42048,6 +43072,9 @@ msgstr[4] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -42195,9 +43222,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -42222,12 +43246,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42240,18 +43258,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42264,18 +43270,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42351,6 +43348,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42360,6 +43360,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42570,6 +43573,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42663,6 +43672,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42693,6 +43705,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42777,6 +43792,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42860,10 +43878,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -43043,6 +44061,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -43055,6 +44076,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43346,7 +44370,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43615,6 +44639,14 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43713,6 +44745,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43791,6 +44832,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43820,9 +44870,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43909,45 +44965,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43966,7 +44983,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -44078,6 +45095,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44423,6 +45443,14 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44521,6 +45549,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44642,9 +45676,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44717,6 +45748,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44837,9 +45871,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44900,6 +45931,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -45001,9 +46035,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -45207,9 +46238,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/bs_BA/gitlab.po b/locale/bs_BA/gitlab.po
index f4fdf182538..7052daa90a2 100644
--- a/locale/bs_BA/gitlab.po
+++ b/locale/bs_BA/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: bs\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:41\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr " prikupljeno %{time}"
msgid " Please sign in."
msgstr " Prijavi se."
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -394,6 +388,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -412,6 +412,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -430,8 +436,8 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -544,9 +550,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -787,6 +790,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -865,7 +871,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -874,9 +880,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -946,6 +949,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1081,10 +1087,19 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1387,7 +1402,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1726,9 +1741,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1921,6 +1945,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1951,9 +1978,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2107,6 +2131,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2164,6 +2191,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2287,6 +2317,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2515,6 +2548,9 @@ msgstr "Dodaje zadatak epiku."
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2596,6 +2632,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2608,6 +2647,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2620,6 +2662,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2704,12 +2749,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2749,6 +2800,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2764,6 +2836,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2779,6 +2854,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2788,9 +2869,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2800,6 +2878,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3706,7 +3787,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3820,6 +3901,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3874,6 +3958,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4117,6 +4204,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4231,6 +4321,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4321,6 +4414,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4813,6 +4909,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5056,12 +5155,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr "Zaduži sebi ove zadatke"
-
-msgid "Assign yourself to this issue"
-msgstr "Zaduži sebi ovaj zadatak"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5152,6 +5245,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5182,6 +5278,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5203,6 +5302,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5563,9 +5710,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5587,6 +5731,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5677,6 +5824,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5902,6 +6055,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5917,6 +6073,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5926,24 +6085,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6007,6 +6181,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6112,6 +6289,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6271,9 +6451,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6313,6 +6490,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6355,12 +6535,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6373,9 +6559,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6388,6 +6580,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6967,6 +7162,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6997,6 +7195,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7162,6 +7366,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7276,6 +7483,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7519,24 +7729,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7594,6 +7792,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7753,6 +7960,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7777,7 +7987,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7792,6 +8002,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7831,22 +8044,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7855,10 +8071,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7870,6 +8104,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7885,10 +8122,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7900,10 +8140,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7918,9 +8155,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7954,13 +8188,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7981,10 +8209,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7996,13 +8221,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8017,9 +8239,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8041,6 +8260,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8083,9 +8305,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8194,10 +8413,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8245,16 +8461,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8290,6 +8497,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8299,6 +8509,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8362,9 +8575,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8410,7 +8620,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8503,9 +8713,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8755,12 +8962,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8773,7 +8986,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9016,9 +9229,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9145,6 +9355,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9178,9 +9391,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9205,6 +9415,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9214,7 +9427,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9226,12 +9439,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9340,6 +9565,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9385,6 +9613,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9394,6 +9625,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9463,6 +9697,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9586,9 +9826,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9646,7 +9883,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9742,6 +9979,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9781,6 +10021,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10090,6 +10333,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10126,6 +10372,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10141,9 +10393,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10261,7 +10510,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10300,9 +10549,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10414,9 +10669,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10441,6 +10693,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10471,9 +10726,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10726,43 +10978,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10777,10 +11011,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10891,19 +11125,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11032,15 +11263,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11095,12 +11344,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11116,10 +11371,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11266,6 +11521,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11320,9 +11578,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11569,6 +11824,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11698,9 +11956,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11719,9 +11974,6 @@ msgstr "Standardni prvi dan sedmice"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Standardni prvi dan sedmice u kalendarima i izbornicima datuma."
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12370,6 +12622,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12433,6 +12712,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13087,6 +13369,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13144,6 +13429,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13234,6 +13522,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13279,6 +13570,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13381,9 +13711,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13708,6 +14035,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13984,7 +14314,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14116,6 +14446,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14131,9 +14464,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14215,7 +14545,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14587,6 +14920,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14596,6 +14935,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14836,6 +15178,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14848,6 +15193,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14968,6 +15316,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15097,9 +15448,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15211,6 +15568,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15634,7 +15994,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15775,9 +16135,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16042,9 +16399,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16072,6 +16426,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16135,9 +16492,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16687,9 +17041,6 @@ msgstr "GitLab Zadatak"
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16702,6 +17053,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16753,9 +17107,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16981,15 +17332,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17029,6 +17389,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17155,9 +17518,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17167,6 +17527,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17371,9 +17767,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17776,13 +18169,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17905,6 +18298,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17923,9 +18319,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18046,6 +18439,111 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18217,6 +18715,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18367,9 +18868,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18445,9 +18943,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18577,6 +19072,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18649,7 +19150,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18679,12 +19180,6 @@ msgstr ""
msgid "Import issues"
msgstr "Uvezi zadatke"
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18694,9 +19189,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19036,9 +19528,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19117,15 +19606,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19417,6 +19897,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19426,6 +19909,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19483,6 +19975,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19498,6 +19996,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19579,6 +20080,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19600,6 +20104,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19609,6 +20116,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19717,6 +20227,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19918,6 +20434,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20032,6 +20551,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20044,12 +20566,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20197,9 +20725,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20215,12 +20740,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20314,6 +20833,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20332,6 +20854,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20344,6 +20872,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20536,9 +21067,6 @@ msgstr "Zadatak je zatvorio/la %{name} %{reason}"
msgid "Issue weight"
msgstr "Težina zadatka"
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20581,8 +21109,8 @@ msgstr "Ukloni tablu"
msgid "IssueBoards|No matching boards found"
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|Some of your boards are hidden, add a license to see them again."
+msgstr ""
msgid "IssueBoards|Switch board"
msgstr "Zamijeni tablu"
@@ -20752,10 +21280,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20770,12 +21301,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20785,6 +21310,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20806,7 +21334,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20824,6 +21358,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20833,10 +21370,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20848,6 +21391,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20860,6 +21406,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21115,9 +21664,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21130,6 +21676,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21193,6 +21742,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21202,6 +21754,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21229,15 +21787,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21253,9 +21820,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21265,6 +21850,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21289,6 +21877,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21649,6 +22240,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21757,6 +22351,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21898,6 +22498,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21910,6 +22513,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21928,6 +22534,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21955,9 +22564,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21994,6 +22600,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22003,6 +22615,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22018,6 +22636,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22207,9 +22831,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22483,6 +23104,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22516,6 +23140,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22678,6 +23305,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22798,9 +23428,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22822,6 +23449,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23059,9 +23692,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23098,7 +23728,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23173,7 +23803,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23728,9 +24358,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23851,6 +24478,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23869,6 +24499,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23887,12 +24520,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24010,6 +24652,9 @@ msgstr ""
msgid "Months"
msgstr "Mjeseci"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24106,16 +24751,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24223,6 +24868,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24298,6 +24970,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24484,9 +25159,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24580,6 +25252,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24655,6 +25330,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24670,9 +25348,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24721,6 +25396,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24769,6 +25447,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24796,12 +25477,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24880,9 +25555,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24904,7 +25576,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24937,9 +25609,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25021,6 +25690,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25177,6 +25849,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25621,10 +26296,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25771,6 +26446,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25789,9 +26467,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25822,10 +26497,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25840,9 +26515,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25870,6 +26542,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26011,6 +26686,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26779,6 +27457,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27055,6 +27736,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27064,10 +27748,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27115,7 +27802,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27124,13 +27811,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27139,7 +27826,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27157,6 +27844,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27169,9 +27859,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27226,24 +27922,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27301,9 +27991,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27319,9 +28006,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27655,9 +28339,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27712,7 +28393,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27757,7 +28438,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27865,6 +28546,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28174,6 +28858,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28195,9 +28882,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28234,6 +28918,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28339,6 +29026,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28420,9 +29110,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28927,7 +29614,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29026,6 +29713,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29197,6 +29887,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29260,6 +29953,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29278,9 +29974,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29425,6 +30118,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30034,7 +30733,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30466,9 +31168,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30478,9 +31186,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30712,6 +31417,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30922,7 +31630,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31009,12 +31720,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31027,6 +31744,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31042,9 +31765,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31558,7 +32287,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31621,9 +32350,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31675,10 +32401,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31699,6 +32425,24 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31708,7 +32452,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31735,9 +32479,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31750,12 +32506,21 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31765,6 +32530,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31774,18 +32542,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31807,25 +32569,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31834,15 +32602,30 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31876,9 +32659,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31891,21 +32680,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31915,7 +32734,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31936,6 +32755,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31945,16 +32767,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31972,7 +32797,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31990,7 +32815,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31999,9 +32824,6 @@ 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 ""
@@ -32035,9 +32857,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32152,10 +32971,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32347,6 +33166,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32482,6 +33304,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32506,6 +33331,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32632,16 +33466,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32698,6 +33535,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32713,6 +33556,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32728,12 +33577,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32743,6 +33601,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32755,9 +33616,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32806,6 +33679,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32824,12 +33700,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32848,6 +33733,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32857,10 +33745,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32884,6 +33775,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32968,6 +33868,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33109,6 +34012,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33133,7 +34039,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33145,16 +34051,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33214,6 +34123,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33226,15 +34138,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33271,15 +34186,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33418,6 +34330,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33754,6 +34669,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33799,6 +34717,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33844,9 +34765,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34102,6 +35020,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34270,6 +35191,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34441,6 +35365,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34450,6 +35377,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34489,9 +35419,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34624,9 +35551,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35050,6 +35974,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35194,6 +36121,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35266,9 +36196,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35317,6 +36244,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35482,10 +36412,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35866,8 +36796,11 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36010,12 +36943,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36172,6 +37099,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36205,9 +37138,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "Å ablon"
@@ -36625,9 +37555,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36658,6 +37585,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36670,6 +37600,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36691,12 +37624,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36991,6 +37930,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37000,6 +37942,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37021,6 +37969,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37033,6 +37984,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37318,9 +38272,6 @@ 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 ""
@@ -37462,6 +38413,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37474,7 +38428,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37501,7 +38455,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37510,7 +38464,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37597,6 +38551,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37624,6 +38584,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37750,9 +38713,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37990,6 +38959,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38464,6 +39436,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38545,6 +39520,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38563,7 +39541,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38713,9 +39691,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38761,6 +39736,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38854,6 +39832,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39043,6 +40024,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "Isprobajte sve što GitLab može ponuditi za 30 dana."
@@ -39247,6 +40231,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39283,6 +40270,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39409,6 +40399,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39589,9 +40582,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39610,9 +40600,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39622,6 +40609,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39679,7 +40669,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39916,6 +40906,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39925,6 +40918,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40735,9 +41731,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40762,6 +41755,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40867,9 +41863,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40891,6 +41884,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41011,6 +42007,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41107,9 +42106,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41155,6 +42151,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41176,6 +42175,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41476,6 +42478,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41521,9 +42526,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41566,13 +42568,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41590,6 +42592,9 @@ msgstr[2] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41737,9 +42742,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41764,12 +42766,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41782,18 +42778,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41806,18 +42790,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41893,6 +42868,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41902,6 +42880,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42112,6 +43093,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42205,6 +43192,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42235,6 +43225,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42319,6 +43312,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42400,10 +43396,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42583,6 +43579,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42595,6 +43594,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42886,7 +43888,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43147,6 +44149,12 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43243,6 +44251,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43321,6 +44338,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43348,9 +44374,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43435,45 +44467,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43492,7 +44485,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43600,6 +44593,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43939,6 +44935,12 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44035,6 +45037,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44152,9 +45160,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44227,6 +45232,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44347,9 +45355,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44410,6 +45415,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44503,9 +45511,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44707,9 +45712,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index 2253e6ec755..94817104543 100644
--- a/locale/ca_ES/gitlab.po
+++ b/locale/ca_ES/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ca\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:13\n"
msgid " %{start} to %{end}"
msgstr " Des de %{start} fins %{end}"
@@ -28,15 +28,9 @@ msgstr " Recollit %{time}"
msgid " Please sign in."
msgstr " Inicieu la sessió."
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr " Intenta %{action} aquest fitxer de nou."
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Cal que ho feu abans de %{grace_period_deadline}."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} dia"
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Informes d'abús"
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr "Afegeix el comentari"
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "ag."
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr "Tots els entorns"
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr "Connecta"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr "Crea una etiqueta nova"
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr "Domini"
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr "Vots negatius"
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr "Edita el grup: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr "Explora els grups"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Explora els projectes"
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr "feb."
msgid "February"
msgstr "febrer"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr "Filtra..."
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "Usuari del GitLab"
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "Adreça IP"
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr "Peticions de fusió"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr "Mesos"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr "Mai"
msgid "New"
msgstr "Nou"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index e193aa9e5cb..425f35b9d75 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: cs\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:13\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -447,6 +441,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -468,6 +469,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -489,8 +497,8 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -620,9 +628,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -872,6 +877,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -950,7 +958,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -959,9 +967,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -1031,6 +1036,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1170,10 +1178,20 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1486,7 +1504,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1850,9 +1868,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -2045,6 +2072,9 @@ msgstr ""
msgid "About this feature"
msgstr "Informace o tomto vylepšení"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Hlášení o zneužití"
@@ -2075,9 +2105,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2231,6 +2258,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2288,6 +2318,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2411,6 +2444,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2639,6 +2675,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2720,6 +2759,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2732,6 +2774,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2744,6 +2789,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2828,12 +2876,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2873,6 +2927,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2888,6 +2963,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2903,6 +2981,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2912,9 +2996,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2924,6 +3005,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3830,7 +3914,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3944,6 +4028,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3998,6 +4085,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4241,6 +4331,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4356,6 +4449,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4446,6 +4542,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4945,6 +5044,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5189,12 +5291,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5287,6 +5383,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5317,6 +5416,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5338,6 +5440,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "Srp"
@@ -5698,9 +5848,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5722,6 +5869,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5812,6 +5962,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6038,6 +6194,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -6053,6 +6212,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6062,24 +6224,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6144,6 +6321,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6250,6 +6430,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Tato větev již existuje"
@@ -6409,9 +6592,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6451,6 +6631,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6493,12 +6676,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6511,9 +6700,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6526,6 +6721,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7106,6 +7304,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -7136,6 +7337,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7303,6 +7510,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7417,6 +7627,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7660,24 +7873,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7735,6 +7936,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7894,6 +8104,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7918,7 +8131,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7933,6 +8146,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7972,22 +8188,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7996,10 +8215,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8011,6 +8248,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8026,10 +8266,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8041,10 +8284,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8059,9 +8299,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8095,13 +8332,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8122,10 +8353,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8137,13 +8365,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8159,9 +8384,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8183,6 +8405,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8225,9 +8450,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8336,10 +8558,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8387,16 +8606,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8432,6 +8642,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8441,6 +8654,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8504,9 +8720,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8552,7 +8765,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8645,9 +8858,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8897,12 +9107,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8915,7 +9131,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9159,9 +9375,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9288,6 +9501,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9321,9 +9537,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9348,6 +9561,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9357,7 +9573,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9369,12 +9585,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9483,6 +9711,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9528,6 +9759,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9537,6 +9771,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9606,6 +9843,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9731,9 +9974,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9791,7 +10031,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9888,6 +10128,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9927,6 +10170,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10236,6 +10482,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10272,6 +10521,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10287,9 +10542,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10407,7 +10659,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10446,9 +10698,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10560,9 +10818,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10587,6 +10842,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10617,9 +10875,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10872,43 +11127,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10923,10 +11160,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11037,19 +11274,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11178,15 +11412,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11243,12 +11495,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11264,10 +11522,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11414,6 +11672,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11468,9 +11729,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11718,6 +11976,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11847,9 +12108,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11868,9 +12126,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12525,6 +12780,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12589,6 +12871,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13248,6 +13533,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13305,6 +13593,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13395,6 +13686,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13440,6 +13734,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13542,9 +13875,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13869,6 +14199,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14146,7 +14479,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14278,6 +14611,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14293,9 +14629,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14377,7 +14710,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14749,6 +15085,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14758,6 +15100,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14999,6 +15344,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15011,6 +15359,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -15131,6 +15482,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15260,9 +15614,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15375,6 +15735,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15799,7 +16162,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15940,9 +16303,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16207,9 +16567,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16237,6 +16594,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16300,9 +16660,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16852,9 +17209,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16867,6 +17221,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16918,9 +17275,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17146,15 +17500,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17194,6 +17557,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17320,9 +17686,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17332,6 +17695,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17536,9 +17935,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17941,13 +18337,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18070,6 +18466,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18088,9 +18487,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18211,6 +18607,113 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18383,6 +18886,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18534,9 +19040,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18612,9 +19115,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18744,6 +19244,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18818,7 +19324,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18848,12 +19354,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18863,9 +19363,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19206,9 +19703,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19287,15 +19781,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19587,6 +20072,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19596,6 +20084,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19653,6 +20150,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19668,6 +20171,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19749,6 +20255,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19770,6 +20279,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19779,6 +20291,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19887,6 +20402,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20089,6 +20610,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20203,6 +20727,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20215,12 +20742,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20368,9 +20901,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20386,12 +20916,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20485,6 +21009,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20503,6 +21030,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20515,6 +21048,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20707,9 +21243,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20752,7 +21285,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20923,10 +21456,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20941,12 +21477,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20956,6 +21486,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20977,7 +21510,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20995,6 +21534,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21004,10 +21546,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21019,6 +21567,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21031,6 +21582,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21286,9 +21840,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21301,6 +21852,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21364,6 +21918,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21373,6 +21930,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21400,15 +21963,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21424,9 +21996,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21436,6 +22026,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21460,6 +22053,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21821,6 +22417,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21929,6 +22528,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22070,6 +22675,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22082,6 +22690,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22100,6 +22711,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22127,9 +22741,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22172,6 +22783,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22181,6 +22799,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22196,6 +22820,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22385,9 +23015,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22661,6 +23288,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22694,6 +23324,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22856,6 +23489,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22976,9 +23612,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23000,6 +23633,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23239,9 +23878,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23278,7 +23914,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23353,7 +23989,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23909,9 +24545,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -24033,6 +24666,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24051,6 +24687,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24069,12 +24708,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24192,6 +24840,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24288,16 +24939,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24406,6 +25057,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24481,6 +25159,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24667,9 +25348,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24764,6 +25442,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24839,6 +25520,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24854,9 +25538,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24905,6 +25586,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24953,6 +25637,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24980,12 +25667,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25064,9 +25745,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25088,7 +25766,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25121,9 +25799,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25205,6 +25880,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25362,6 +26040,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25810,10 +26491,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25961,6 +26642,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25979,9 +26663,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26012,10 +26693,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26030,9 +26711,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26060,6 +26738,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26201,6 +26882,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26970,6 +27654,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27246,6 +27933,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27255,10 +27945,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27306,7 +27999,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27315,13 +28008,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27330,7 +28023,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27348,6 +28041,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27360,9 +28056,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27417,24 +28119,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27492,9 +28188,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27510,9 +28203,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27846,9 +28536,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27903,7 +28590,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27948,7 +28635,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28056,6 +28743,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28365,6 +29055,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28386,9 +29079,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28425,6 +29115,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28530,6 +29223,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28611,9 +29307,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29118,7 +29811,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29217,6 +29910,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29388,6 +30084,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29451,6 +30150,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29469,9 +30171,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29616,6 +30315,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30225,7 +30930,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30658,9 +31366,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30670,9 +31384,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30905,6 +31616,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31115,7 +31829,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31207,12 +31924,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31225,6 +31948,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31240,9 +31969,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31759,7 +32494,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31823,9 +32558,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31877,10 +32609,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31901,6 +32633,26 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31910,7 +32662,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31937,9 +32689,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31952,12 +32716,22 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31967,6 +32741,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31976,18 +32753,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32009,25 +32780,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32036,15 +32813,31 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32078,9 +32871,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32093,21 +32892,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32117,7 +32946,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32138,6 +32967,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32147,16 +32979,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32174,7 +33009,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32192,7 +33027,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32201,9 +33036,6 @@ 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 ""
@@ -32237,9 +33069,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32354,10 +33183,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32549,6 +33378,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32695,6 +33527,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32719,6 +33554,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32845,16 +33689,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32911,6 +33758,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32926,6 +33779,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32941,12 +33800,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32956,6 +33824,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32968,9 +33839,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33019,6 +33902,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33037,12 +33923,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33061,6 +33956,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33070,10 +33968,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33097,6 +33998,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33181,6 +34091,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33322,6 +34235,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33346,7 +34262,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33358,16 +34274,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33427,6 +34346,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33439,15 +34361,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33484,15 +34409,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33631,6 +34553,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33967,6 +34892,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34012,6 +34940,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -34057,9 +34988,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34316,6 +35244,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34485,6 +35416,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34656,6 +35590,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34665,6 +35602,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34704,9 +35644,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34839,9 +35776,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35265,6 +36199,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35409,6 +36346,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35481,9 +36421,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35532,6 +36469,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35697,10 +36637,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36081,8 +37021,12 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36225,12 +37169,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36387,6 +37325,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36420,9 +37364,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36847,9 +37788,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36880,6 +37818,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36892,6 +37833,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36913,12 +37857,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37214,6 +38164,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37223,6 +38176,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37244,6 +38203,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37256,6 +38218,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37541,9 +38506,6 @@ 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 ""
@@ -37685,6 +38647,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37697,7 +38662,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37724,7 +38689,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37733,7 +38698,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37820,6 +38785,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37847,6 +38818,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37973,9 +38947,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38213,6 +39193,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38689,6 +39672,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38770,6 +39756,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38788,7 +39777,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38938,9 +39927,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38986,6 +39972,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39079,6 +40068,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39268,6 +40260,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39472,6 +40467,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39508,6 +40506,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39634,6 +40635,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39814,9 +40818,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39835,9 +40836,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39847,6 +40845,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39904,7 +40905,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40141,6 +41142,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40150,6 +41154,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40963,9 +41970,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40990,6 +41994,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41095,9 +42102,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41119,6 +42123,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41239,6 +42246,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41335,9 +42345,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41383,6 +42390,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41404,6 +42414,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41704,6 +42717,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41749,9 +42765,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41794,13 +42807,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41819,6 +42832,9 @@ msgstr[3] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41966,9 +42982,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41993,12 +43006,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42011,18 +43018,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42035,18 +43030,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42122,6 +43108,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42131,6 +43120,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42341,6 +43333,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42434,6 +43432,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42464,6 +43465,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42548,6 +43552,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42630,10 +43637,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42813,6 +43820,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42825,6 +43835,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43116,7 +44129,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43381,6 +44394,13 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43478,6 +44498,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43556,6 +44585,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43584,9 +44622,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43672,45 +44716,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43729,7 +44734,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43839,6 +44844,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44181,6 +45189,13 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44278,6 +45293,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44397,9 +45418,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44472,6 +45490,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44592,9 +45613,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44655,6 +45673,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44752,9 +45773,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44957,9 +45975,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index 4cbb3ed30ae..02da3d5f07e 100644
--- a/locale/cy_GB/gitlab.po
+++ b/locale/cy_GB/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: cy\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:15\n"
msgid " %{start} to %{end}"
msgstr " %{start} i %{end}"
@@ -28,15 +28,9 @@ msgstr " Casglwyd %{time}"
msgid " Please sign in."
msgstr " Mewngofnodwch."
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr " Ceisiwch %{action} y ffeil hon eto."
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Mae angen i chi wneud hyn cyn %{grace_period_deadline}."
@@ -553,6 +547,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -580,6 +583,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -607,8 +619,8 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -772,9 +784,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -1042,6 +1051,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -1120,7 +1132,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -1129,9 +1141,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -1201,6 +1210,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1348,10 +1360,22 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1684,7 +1708,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -2098,9 +2122,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -2293,6 +2326,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -2323,9 +2359,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2479,6 +2512,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2536,6 +2572,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2659,6 +2698,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2887,6 +2929,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2968,6 +3013,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2980,6 +3028,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2992,6 +3043,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -3076,12 +3130,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -3121,6 +3181,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -3136,6 +3217,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -3151,6 +3235,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -3160,9 +3250,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -3172,6 +3259,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -4078,7 +4168,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -4192,6 +4282,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -4246,6 +4339,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4489,6 +4585,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4606,6 +4705,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4696,6 +4798,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -5209,6 +5314,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5455,12 +5563,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5557,6 +5659,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5587,6 +5692,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5608,6 +5716,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5968,9 +6124,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5992,6 +6145,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -6082,6 +6238,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6310,6 +6472,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -6325,6 +6490,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6334,24 +6502,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6418,6 +6601,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6526,6 +6712,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6685,9 +6874,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6727,6 +6913,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6769,12 +6958,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6787,9 +6982,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6802,6 +7003,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7384,6 +7588,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -7414,6 +7621,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7585,6 +7798,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7699,6 +7915,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7942,24 +8161,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -8017,6 +8224,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -8176,6 +8392,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -8200,7 +8419,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -8215,6 +8434,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -8254,22 +8476,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -8278,10 +8503,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8293,6 +8536,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8308,10 +8554,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8323,10 +8572,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8341,9 +8587,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8377,13 +8620,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8404,10 +8641,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8419,13 +8653,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8443,9 +8674,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8467,6 +8695,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8509,9 +8740,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8620,10 +8848,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8671,16 +8896,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8716,6 +8932,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8725,6 +8944,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8788,9 +9010,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8836,7 +9055,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8929,9 +9148,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -9181,12 +9397,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -9199,7 +9421,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9445,9 +9667,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9574,6 +9793,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9607,9 +9829,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9634,6 +9853,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9643,7 +9865,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9655,12 +9877,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9769,6 +10003,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9814,6 +10051,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9823,6 +10063,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9892,6 +10135,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -10021,9 +10270,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -10081,7 +10327,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -10180,6 +10426,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -10219,6 +10468,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10528,6 +10780,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10564,6 +10819,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10579,9 +10840,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10699,7 +10957,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10738,9 +10996,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10852,9 +11116,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10879,6 +11140,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10909,9 +11173,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -11164,43 +11425,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -11215,10 +11458,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11329,19 +11572,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11470,15 +11710,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11539,12 +11797,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11560,10 +11824,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11710,6 +11974,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11764,9 +12031,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -12016,6 +12280,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -12145,9 +12412,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -12166,9 +12430,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12835,6 +13096,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12901,6 +13189,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13570,6 +13861,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13627,6 +13921,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13717,6 +14014,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13762,6 +14062,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13864,9 +14203,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -14191,6 +14527,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14470,7 +14809,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14602,6 +14941,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14617,9 +14959,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14701,7 +15040,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -15073,6 +15415,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -15082,6 +15430,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -15325,6 +15676,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15337,6 +15691,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -15457,6 +15814,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15586,9 +15946,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15703,6 +16069,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -16129,7 +16498,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -16270,9 +16639,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16537,9 +16903,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16567,6 +16930,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16630,9 +16996,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -17182,9 +17545,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -17197,6 +17557,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -17248,9 +17611,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17476,15 +17836,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17524,6 +17893,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17650,9 +18022,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17662,6 +18031,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17866,9 +18271,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -18271,13 +18673,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18400,6 +18802,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18418,9 +18823,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18541,6 +18943,117 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18715,6 +19228,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18868,9 +19384,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18946,9 +19459,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -19078,6 +19588,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -19156,7 +19672,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -19186,12 +19702,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -19201,9 +19711,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19546,9 +20053,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19627,15 +20131,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19927,6 +20422,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19936,6 +20434,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19993,6 +20500,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -20008,6 +20521,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -20089,6 +20605,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -20110,6 +20629,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -20119,6 +20641,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -20227,6 +20752,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20431,6 +20962,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20545,6 +21079,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20557,12 +21094,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20710,9 +21253,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20728,12 +21268,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20827,6 +21361,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20845,6 +21382,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20857,6 +21400,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -21049,9 +21595,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -21094,7 +21637,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -21265,10 +21808,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -21283,12 +21829,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -21298,6 +21838,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21319,7 +21862,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -21337,6 +21886,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21346,10 +21898,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21361,6 +21919,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21373,6 +21934,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21628,9 +22192,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21643,6 +22204,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21706,6 +22270,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21715,6 +22282,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21742,15 +22315,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21766,9 +22348,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21778,6 +22378,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21802,6 +22405,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -22165,6 +22771,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -22273,6 +22882,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22414,6 +23029,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22426,6 +23044,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22444,6 +23065,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22471,9 +23095,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22528,6 +23149,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22537,6 +23167,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22552,6 +23188,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22741,9 +23383,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -23017,6 +23656,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -23050,6 +23692,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -23212,6 +23857,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -23332,9 +23980,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23356,6 +24001,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23599,9 +24250,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23638,7 +24286,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23713,7 +24361,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -24271,9 +24919,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -24397,6 +25042,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24415,6 +25063,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24433,12 +25084,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24556,6 +25216,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24652,16 +25315,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24772,6 +25435,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24847,6 +25537,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -25033,9 +25726,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -25132,6 +25822,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -25207,6 +25900,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -25222,9 +25918,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -25273,6 +25966,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -25321,6 +26017,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -25348,12 +26047,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25432,9 +26125,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25456,7 +26146,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25489,9 +26179,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25573,6 +26260,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25732,6 +26422,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -26188,10 +26881,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -26341,6 +27034,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -26359,9 +27055,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26392,10 +27085,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26410,9 +27103,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26440,6 +27130,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26581,6 +27274,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -27352,6 +28048,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27628,6 +28327,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27637,10 +28339,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27688,7 +28393,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27697,13 +28402,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27712,7 +28417,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27730,6 +28435,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27742,9 +28450,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27799,24 +28513,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27874,9 +28582,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27892,9 +28597,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -28228,9 +28930,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -28285,7 +28984,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -28330,7 +29029,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28438,6 +29137,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28747,6 +29449,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28768,9 +29473,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28807,6 +29509,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28912,6 +29617,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28993,9 +29701,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29500,7 +30205,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29599,6 +30304,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29770,6 +30478,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29833,6 +30544,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29851,9 +30565,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29998,6 +30709,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30607,7 +31324,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -31042,9 +31762,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -31054,9 +31780,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -31291,6 +32014,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31501,7 +32227,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31603,12 +32332,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31621,6 +32356,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31636,9 +32377,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -32161,7 +32908,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -32227,9 +32974,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -32281,10 +33025,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -32305,6 +33049,30 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -32314,7 +33082,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -32341,9 +33109,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -32356,12 +33136,24 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -32371,6 +33163,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -32380,18 +33175,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32413,25 +33202,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32440,15 +33235,33 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32482,9 +33295,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32497,21 +33316,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32521,7 +33370,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32542,6 +33391,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32551,16 +33403,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32578,7 +33433,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32596,7 +33451,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32605,9 +33460,6 @@ 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 ""
@@ -32641,9 +33493,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32758,10 +33607,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32953,6 +33802,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -33121,6 +33973,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -33145,6 +34000,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33271,16 +34135,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -33337,6 +34204,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33352,6 +34225,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -33367,12 +34246,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -33382,6 +34270,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -33394,9 +34285,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33445,6 +34348,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33463,12 +34369,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33487,6 +34402,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33496,10 +34414,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33523,6 +34444,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33607,6 +34537,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33748,6 +34681,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33772,7 +34708,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33784,16 +34720,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33853,6 +34792,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33865,15 +34807,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33910,15 +34855,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -34057,6 +34999,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -34393,6 +35338,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34438,6 +35386,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -34483,9 +35434,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34744,6 +35692,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34915,6 +35866,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -35086,6 +36040,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -35095,6 +36052,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -35134,9 +36094,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -35269,9 +36226,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35695,6 +36649,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35839,6 +36796,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35911,9 +36871,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35962,6 +36919,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -36127,10 +37087,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36511,8 +37471,14 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36655,12 +37621,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36817,6 +37777,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36850,9 +37816,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -37291,9 +38254,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -37324,6 +38284,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -37336,6 +38299,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -37357,12 +38323,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37660,6 +38632,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37669,6 +38644,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37690,6 +38671,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37702,6 +38686,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37987,9 +38974,6 @@ 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 ""
@@ -38131,6 +39115,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -38143,7 +39130,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -38170,7 +39157,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -38179,7 +39166,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -38266,6 +39253,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -38293,6 +39286,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -38419,9 +39415,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38659,6 +39661,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -39139,6 +40144,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -39220,6 +40228,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -39238,7 +40249,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -39388,9 +40399,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -39436,6 +40444,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39529,6 +40540,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39718,6 +40732,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39922,6 +40939,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39958,6 +40978,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -40084,6 +41107,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -40264,9 +41290,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -40285,9 +41308,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -40297,6 +41317,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -40354,7 +41377,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40591,6 +41614,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40600,6 +41626,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -41419,9 +42448,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -41446,6 +42472,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41551,9 +42580,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41575,6 +42601,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41695,6 +42724,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41791,9 +42823,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41839,6 +42868,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41860,6 +42892,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -42160,6 +43195,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -42205,9 +43243,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -42250,13 +43285,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -42277,6 +43312,9 @@ msgstr[5] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -42424,9 +43462,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -42451,12 +43486,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42469,18 +43498,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42493,18 +43510,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42580,6 +43588,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42589,6 +43600,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42799,6 +43813,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42892,6 +43912,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42922,6 +43945,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -43006,6 +44032,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -43090,10 +44119,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -43273,6 +44302,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -43285,6 +44317,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43576,7 +44611,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43849,6 +44884,15 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43948,6 +44992,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -44026,6 +45079,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -44056,9 +45118,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -44146,45 +45214,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -44203,7 +45232,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -44317,6 +45346,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44665,6 +45697,15 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44764,6 +45805,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44887,9 +45934,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44962,6 +46006,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -45082,9 +46129,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -45145,6 +46189,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -45250,9 +46297,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -45457,9 +46501,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index 2d54be5fbf3..542179841ea 100644
--- a/locale/da_DK/gitlab.po
+++ b/locale/da_DK/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: da\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:13\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -28,15 +28,9 @@ msgstr " Indsamlet %{time}"
msgid " Please sign in."
msgstr " Log venligst ind."
-msgid " Target Path"
-msgstr " MÃ¥lsti"
-
msgid " Try to %{action} this file again."
msgstr " Prøv at %{action} filen igen."
-msgid " Type"
-msgstr " Type"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Du skal gøre det inden %{grace_period_deadline}."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "%d kommentar mere"
msgstr[1] "%d kommentarer mere"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d åben problemstilling"
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "%d personligt projekt fjernes og kan ikke gendannes."
msgstr[1] "%d personlige projekter fjernes og kan ikke gendannes."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d tidligere sammenlagt commit"
@@ -371,10 +375,10 @@ msgid_plural "%d projects selected"
msgstr[0] "%d projekt valgt"
msgstr[1] "%d projekter valgt"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d anmodning med advarsler"
-msgstr[1] "%d anmodninger med advarsler"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -468,9 +472,6 @@ msgstr ""
msgid "%{address} is an invalid IP address range"
msgstr "%{address} er et ugyldigt IP-adresseområde"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "%{anchorOpen}Lær mere%{anchorClose} om hvordan du kan tilpasse/deaktivere registrering på din instans."
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link} klonede %{original_issue} til %{new_issue}."
@@ -702,6 +703,9 @@ msgstr "%{integrations_link_start}Integreringer%{link_end} giver dig mulighed fo
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} fjernes! Er du sikker?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "%{issueType}-handlinger"
@@ -780,8 +784,8 @@ msgstr "%{level_name} er ikke tilladt eftersom forgreningskildeprojektet har lav
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "%{link_start}Lær mere%{link_end} om roller."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{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."
@@ -789,9 +793,6 @@ msgstr "%{link_start}Fjern præfikset %{draft_snippet}%{link_end} fra titlen, nÃ
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr "%{link_start}Hvilke informationer indsamler GitLab Inc.?%{link_end}"
@@ -861,6 +862,9 @@ msgstr "Navnerummet %{name}(%{url}) er løbet tør for pipeline-minutter for del
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, bekræft din e-mailadresse nu!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} dag"
@@ -992,11 +996,19 @@ msgstr "%{spanStart}i%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} til %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr "%{strongOpen}Advarsel:%{strongClose} SAML-gruppelinks kan få GitLab til automatisk at fjerne medlemmer fra grupper."
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
-msgstr "%{strongStart}Tip:%{strongEnd} Du kan også checkout sammenlægningsanmodninger lokalt ved at %{linkStart}følge retningslinjerne%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -1288,7 +1300,7 @@ msgstr "+%{more_reviewers_count} kontrollanter mere"
msgid "+%{tags} more"
msgstr "+%{tags} mere"
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr "En ny udgivelse %{tag} for %{name} blev udgivet. Besøg %{release_link_s
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "En ny udgivelse %{tag} for %{name} blev udgivet. Besøg Udgivelser-siden for at læse mere om det:"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "En ny efterligningstoken er blevet oprettet."
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "En ikke-fortrolig epic kan ikke tildeles til en fortrolig forælderepic"
@@ -1797,6 +1818,9 @@ msgstr "Om automatisk udsendelse"
msgid "About this feature"
msgstr "Om funktionen"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Misbrugsrapporter"
@@ -1827,9 +1851,6 @@ msgstr "Adgang nægtet for din LDAP-konto."
msgid "Access denied: %{error}"
msgstr "Adgang nægtet: %{error}"
-msgid "Access expiration date"
-msgstr "Udløbsdato for adgang"
-
msgid "Access expires"
msgstr "Adgang udløber"
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr "Handling"
@@ -2040,6 +2064,9 @@ msgstr "Tilføj Kubernetes-klynge"
msgid "Add LICENSE"
msgstr "Tilføj LICENSE"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr "Tilføj kommentar nu"
msgid "Add comment to design"
msgstr "Tilføj kommentar til design"
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr "Tilføj commit-meddelelser som kommentarer til Asana-opgaver. %{docs_link}"
@@ -2391,6 +2421,9 @@ msgstr "Tilføjer en problemstilling til en epic."
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr "Gæst"
msgid "AdminArea|Included Free in license"
msgstr "Medtaget gratis i licens"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "Seneste grupper"
@@ -2484,6 +2520,9 @@ msgstr "Seneste brugere"
msgid "AdminArea|Maintainer"
msgstr "Vedligeholder"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr "Nyt projekt"
msgid "AdminArea|New user"
msgstr "Ny bruger"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "Ejer"
@@ -2580,12 +2622,18 @@ msgstr "Slet projektet %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr "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|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr "Alle nye projekter kan bruge instansens delte runnere som standard."
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps-domæne"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Konfigurer Let's Encrypt"
@@ -2625,6 +2673,27 @@ 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 2FA er aktiveret."
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|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."
@@ -2640,6 +2709,9 @@ msgstr "Kræv at brugere beviser ejerskab for tilpassede domæner"
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr "Vælg en CI-/CD-skabelon"
@@ -2655,6 +2727,12 @@ msgstr "Sessionsvarighed for Git-handlinger når 2FA er aktiveret (minutter)"
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr "Indstillinger for størrelse og domæne for statiske Pages-websteder."
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 "De seneste artefakter for alle job i de nyeste pipelines som er lykkedes i hvert projekt gemmes og udløber ikke."
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "Aktive brugere"
@@ -3582,8 +3660,8 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Tillad kun at de valgte protokoller bruges til Git-adgang."
-msgid "Allow owners to manage default branch protection per group"
-msgstr "Tillad ejere at håndtere beskyttelse af standardgren pr. gruppe"
+msgid "Allow owners to manage default branch protection per group."
+msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
msgstr "Tillad ejere at tilføje brugere uden for LDAP manuelt"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "Der opstod en fejl ved forhåndsvisning af blob'en"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr "Der opstod en fejl ved opdatering af titlen"
@@ -3993,6 +4077,9 @@ msgstr "Der opstod en fejl under fortolkning af seneste søgninger"
msgid "An error occurred while parsing the file."
msgstr "Der opstod en fejl under fortolkning af filen."
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "Der opstod en fejl under fjernelse af epics."
@@ -4106,6 +4193,9 @@ msgstr "Der findes allerede en problemstilling"
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "Der opstod en uventet fejl under tjek af projektmiljøet."
@@ -4196,6 +4286,9 @@ msgstr "Alle milepæle"
msgid "Any namespace"
msgstr "Alle navnerum"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "Program-id"
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "Er du sikker på, at du vil arkivere projektet?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "Er du sikker på, at du vil afarkivere projektet?"
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr "Tildel dig selv til problemstillingen"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "Tildelte %{assignee_users_sentence}."
@@ -5017,6 +5107,9 @@ msgstr "Kunne ikke vedhæfte filen."
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr "Gruppebegivenheder"
msgid "AuditLogs|IP Address"
msgstr "IP-adresse"
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr "Medlemsbegivenheder"
@@ -5068,6 +5164,54 @@ msgstr "Denne måned"
msgid "AuditLogs|User Events"
msgstr "Brugerbegivenheder"
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "Aug."
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "Dine badges"
-msgid "Balsamiq file could not be loaded."
-msgstr "Balsamiq-filen kunne ikke indlæses."
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr "Brugeren med API-adgang til Bamboo-serveren."
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr "Baseret på"
@@ -5542,6 +5686,12 @@ msgstr "Besøg opkrævningsafsnittet i vores %{parent_billing_page_link} for at
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr "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."
@@ -5766,6 +5916,9 @@ msgstr "Søg efter projekter"
msgid "BoardNewIssue|Select a project"
msgstr "Vælg et projekt"
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "Der opstod en fejl under hentning af milepæle. Prøv venligst igen."
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr "Rediger"
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr "Milepæl"
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr "Ingen milepæl"
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr "Der opstod en fejl under hentning af tavlelisterne. Genindlæs venligst
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr "Der opstod en fejl under hentning af tavlesvømmebanerne. Genindlæs venligst siden."
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr "Der opstod en fejl under generering af lister. Genindlæs venligst siden."
@@ -5974,6 +6148,9 @@ msgstr "Grenen findes allerede"
msgid "Branch changed"
msgstr "Gren ændret"
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Grenen er allerede taget"
@@ -6133,9 +6310,6 @@ msgstr "Broadcastmeddelelse blev opdateret."
msgid "Broadcast Messages"
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 "Broadcastmeddelelser vises for hver bruger og kan bruges til at underrette brugere om planlagt vedligeholdelse, seneste opgraderinger mm."
-
msgid "Browse Directory"
msgstr "Gennemse mappe"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Eksisterende grupper"
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr "Ny gruppe"
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr "Ingen forælder"
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr "Viser %{start}-%{end} af %{total} fra %{link}"
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr "Kildegruppe"
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "Til ny gruppe"
@@ -6250,6 +6439,9 @@ msgstr "Du har ingen grupper at importere"
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr "forventede en tilknyttet gruppe men har et tilknyttet projekt"
@@ -6828,6 +7020,9 @@ msgstr "Det vil oprette en ny commit for at tilbageføre de eksisterende ændrin
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr "Dine ændringer vil blive sammenlagt i %{branchName} da en sammenlægningsanmodning er åben."
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr "Ændrede tildeler(e)."
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr "Diagrammer kan ikke vises fordi anmodningen om data har fået timeout. %{documentationLink}"
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr "CI-minutter"
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr "Afgift"
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr "I alt"
@@ -7378,24 +7585,12 @@ msgstr "Alle miljøer"
msgid "CiVariable|Create wildcard"
msgstr "Opret jokertegn"
-msgid "CiVariable|Masked"
-msgstr "Maskeret"
-
msgid "CiVariable|New environment"
msgstr "Nyt miljø"
-msgid "CiVariable|Protected"
-msgstr "Beskyttet"
-
msgid "CiVariable|Search environments"
msgstr "Søg i miljøer"
-msgid "CiVariable|Toggle masked"
-msgstr "Maskeret til/fra"
-
-msgid "CiVariable|Toggle protected"
-msgstr "Beskyttet til/fra"
-
msgid "Classification Label (optional)"
msgstr "Klassifikationsetiket (valgfrit)"
@@ -7453,6 +7648,15 @@ msgstr "Ryd startdato"
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr "Ryd vægt"
@@ -7612,6 +7816,9 @@ msgstr "Klyngeniveau"
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr "Adgangstokens"
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr "Konfiguration"
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr "Forbindelsesstatus"
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr "Kopiér token"
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr "Oprettet af %{name} %{time}"
msgid "ClusterAgents|Date created"
msgstr "Dato oprettet"
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr "Beskrivelse"
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr "Sidste kontakt"
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr "Lær at oprette en agentadgangstoken"
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,15 +8044,9 @@ msgstr "Anbefalet installationsmetode"
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
+msgid "ClusterAgents|Registering agent"
msgstr ""
-msgid "ClusterAgents|Registering Agent"
-msgstr "Registreringsagent"
-
-msgid "ClusterAgents|Registration token"
-msgstr "Registreringstoken"
-
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr "Agenten har ingen tokens"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr "API-URL skal være en gyldig http-/https-URL."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Tilføj Kubernetes-klynge"
-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 kontrol af programmer, udsend dine programmer og kør nemt dine pipelines til alle projekter med den samme klynge."
@@ -8052,10 +8268,7 @@ 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 ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,17 +8316,8 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Opret Kubernetes-klynge"
-msgid "ClusterIntegration|Create cluster on"
-msgstr "Opret klynge på"
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr "Opret ny klynge"
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr "Opret ny klynge på EKS"
-
-msgid "ClusterIntegration|Create new cluster on GKE"
-msgstr "Opret ny klynge på GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Opretter Kubernetes-klynge"
@@ -8148,6 +8352,9 @@ msgstr "Aktivér eller deaktivér GitLabs forbindelse til din Kubernetes-klynge.
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Aktivér indstillingen, hvis du bruger rollebaseret adgangsstyring (RBAC)."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr "Indtast ny tjenestetoken"
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Indtast detaljerne til din Kubernetes-klynge"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "Miljøomfang"
@@ -8220,9 +8430,6 @@ msgstr "Gruppeklynge"
msgid "ClusterIntegration|HTTP Error"
msgstr "Fejl ved 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 "Hvis du opsætter flere klynger og bruger Auto DevOps, så %{help_link_start}læs først dette%{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -8268,8 +8475,8 @@ msgstr "Lær mere om %{help_link_start_machine_type}maskintyper%{help_link_end}
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "Lær mere om %{help_link_start}zoner%{help_link_end}."
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "Lær mere om Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "Lær mere om gruppe-Kubernetes-klynger"
@@ -8361,9 +8568,6 @@ msgstr "Antal knudepunkter"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-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:"
@@ -8613,12 +8817,18 @@ msgstr "Kan ikke oprette forbindelse"
msgid "ClusterIntegration|Unknown Error"
msgstr "Ukendt fejl"
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr "VPC"
@@ -8631,8 +8841,8 @@ msgstr "Vi kunne ikke verificere at et af dine projekter på GCP har fakturering
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 kontrol af programmer, udsend dine programmer, kør dine pipelines og meget mere på en nem måde."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr ""
@@ -8873,9 +9083,6 @@ msgstr "Commit"
msgid "CommitMessage|Add %{file_name}"
msgstr "Tilføj %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr "Tilføj %{file_name} og opret et kodekvalitetsjob"
-
msgid "CommitWidget|authored"
msgstr "forfattede"
@@ -9002,6 +9209,9 @@ msgstr "Vis åben sammenlægningsanmodning"
msgid "Complete"
msgstr "Fuldført"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr "Fuldført"
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr "Slet overholdelsesframeworket %{framework}"
@@ -9062,6 +9269,9 @@ 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 "Fejl ved hentning af overholdelsesframeworkdata. Opdater venligst siden eller prøv et andet framework"
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr "Navn"
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr "Kan ikke gemme overholdelsesframeworket. Prøv venligst igen"
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr "Konfigurer eksisterende installation"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr "Bekræft"
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr "Bekræft ny adgangskode"
@@ -9320,6 +9551,12 @@ msgstr "Tillykke, din gratis prøveperiode er aktiveret."
msgid "Connect"
msgstr "Opret forbindelse"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr "Oprydning afventer"
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-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 ""
@@ -9501,8 +9735,8 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr "Aktivér udløbsregelsæt"
-msgid "ContainerRegistry|Expiration policy is disabled"
-msgstr "Udløbsregelsæt er deaktiveret"
+msgid "ContainerRegistry|Expiration policy is disabled."
+msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "Udløbsregelsæt vil køre om %{time}"
@@ -9596,6 +9830,9 @@ msgstr "Rodaftryk"
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ 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|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr "Handlinger"
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr "Sidste job:"
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr "Ny upload"
@@ -9995,9 +10244,6 @@ msgstr "Rediger den tilhørende YAML-fil for at bruge korpusset"
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr "Størrelse i alt: %{totalSize}"
-msgid "CorpusMnagement|New corpus"
-msgstr "Nyt korpus"
-
msgid "Could not add admins as members"
msgstr "Kunne ikke tilføje administratorer som medlemmer"
@@ -10115,8 +10361,8 @@ msgstr "Kunne ikke opdatere wikiside"
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr "Kunne ikke uploade dine designs da en eller flere af de uploadede filer ikke understøttes."
-msgid "Couldn't assign policy to project"
-msgstr "Kunne ikke tildele regelsæt til projekt"
+msgid "Couldn't assign policy to project or group"
+msgstr ""
msgid "Country"
msgstr "Land"
@@ -10154,9 +10400,15 @@ msgstr "Opret nyt domæne"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr "Opret et Mattermost-team til gruppen"
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr "Opret ny"
msgid "Create new %{name} by email"
msgstr "Opret ny %{name} via e-mail"
-msgid "Create new CI/CD pipeline"
-msgstr "Opret ny CI-/CD-pipeline"
-
msgid "Create new Value Stream"
msgstr "Opret ny Value Stream"
@@ -10295,6 +10544,9 @@ msgstr "Opret ny etiket"
msgid "Create new project"
msgstr "Opret nyt projekt"
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr "Opret eller importér dit første projekt"
@@ -10325,9 +10577,6 @@ msgstr "Opret emne"
msgid "Create user"
msgstr "Opret bruger"
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr "Opret jokertegn: %{searchTerm}"
@@ -10580,43 +10829,25 @@ msgstr "Kreditkort:"
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,21 +10976,18 @@ msgstr "Tilpasset område"
msgid "Custom range (UTC)"
msgstr "Tilpasset område (UTC)"
-msgid "Customer Relations Contacts"
+msgid "Customer experience improvement and third-party offers"
msgstr ""
-msgid "Customer Relations Organizations"
+msgid "Customer relations"
msgstr ""
-msgid "Customer experience improvement and third-party offers"
+msgid "Customer relations contacts"
msgstr ""
-msgid "Customer relations"
+msgid "Customer relations organizations"
msgstr ""
-msgid "Customizable by owners."
-msgstr "Kan tilpasses af ejere."
-
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
msgstr "Tilpas CI-/CD-indstillinger, herunder Auto DevOps, delte runnere og jobartefakter."
@@ -10886,15 +11114,33 @@ msgstr "skal være under en gruppe"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} valgte (%{maxLabels} maks.)"
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Dato"
msgid "CycleAnalytics|Display chart filters"
msgstr "Vis diagramfiltre"
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,12 +11220,12 @@ msgstr ""
msgid "DAST Configuration"
msgstr "DAST-konfiguration"
-msgid "DAST Scans"
-msgstr "DAST-skanninger"
-
msgid "DAST profile not found: %{name}"
msgstr ""
+msgid "DAST profiles"
+msgstr ""
+
msgid "DNS"
msgstr "DNS"
@@ -11118,6 +11370,9 @@ msgstr "Kunne ikke opdatere skannerprofilen. Prøv venligst igen."
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr "Kunne ikke opdatere webstedsprofilen. Prøv venligst igen."
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr "Fejlfindingsmeddelelser"
@@ -11172,9 +11427,6 @@ msgstr "Skjul fejlfindingsmeddelelser"
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr "Medtag fejlfindingsmeddelelser i DAST-konsoloutputtet."
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr "HÃ¥ndter profiler"
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr "Datatype"
@@ -11549,9 +11804,6 @@ msgstr "Standardgren"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr "Udsendelseshyppighed"
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr "Domæne"
msgid "Domain Name"
msgstr "Domænenavn"
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr "Har du endnu ikke en konto?"
@@ -13073,6 +13358,9 @@ msgstr "Nedstemmer"
msgid "Draft"
msgstr "Udkast"
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr "Træk dine designs hertil eller %{linkStart}klik for at uploade%{linkEnd}."
@@ -13118,6 +13406,45 @@ msgstr "Forfaldsdato"
msgid "Duration"
msgstr "Varighed"
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr "Rediger gruppe: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr "Rediger i web-IDE"
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr "Aktivér automatisk depothusarbejde"
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr "Aktivér forsinket projektsletning som standard for nyligt oprettede grupper."
@@ -13822,8 +14149,8 @@ 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 "Miljøvariablen %{code_start}%{environment_variable}%{code_end} findes ikke eller peger ikke til en gyldig mappe."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
+msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
msgstr ""
@@ -13954,6 +14281,9 @@ msgstr "Miljøer"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr "Lær mere om at stoppe miljøer"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr "Mere information"
-
msgid "Environments|New environment"
msgstr "Nyt miljø"
@@ -14053,8 +14380,11 @@ msgstr "Kommende udsendelse"
msgid "Environments|Updated"
msgstr "Opdateret"
-msgid "Environments|You don't have any environments right now"
-msgstr "Du har ikke nogle miljøer lige nu"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr "af %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr "Ingen projekter tilgængelige"
@@ -14434,6 +14770,9 @@ msgstr "Vælg projekt"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr "Fejl"
@@ -14673,6 +15012,9 @@ 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 "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 Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr "Alt hvad du har brug for til at oprette et GitLab Pages-websted med ren HTML"
@@ -14685,6 +15027,9 @@ msgstr "Præcist én af %{attributes} kræves"
msgid "Example: @sub\\.company\\.com$"
msgstr "Eksempel: @sub\\.company\\.com$"
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr "Udforsk grupper"
msgid "Explore groups"
msgstr "Udforsk grupper"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Udforsk projekter"
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr "Kunne ikke generere eksport. Prøv venligst igen senere."
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr "Feb."
msgid "February"
msgstr "Februar"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr "Filtrér resultater ..."
msgid "Filter users"
msgstr "Filtrér brugere"
-msgid "Filter your repositories by name"
-msgstr "Filtrér dine depoter efter navn"
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr "Framework slettet"
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr "Gratis prøveperiode af GitLab.com Ultimate"
@@ -15907,6 +16258,9 @@ msgstr "Fra %{code_open}%{source_title}%{code_close} ind i"
msgid "From %{providerTitle}"
msgstr "Fra %{providerTitle}"
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr "Generisk"
@@ -16522,9 +16873,6 @@ msgstr "GitLab-problemstilling"
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr "GitLab Pages"
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "GitLab-bruger"
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr "GitLab-medlem eller e-mailadresse"
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr "GÃ¥ til definition"
msgid "Go to environments"
msgstr "Gå til miljøer"
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr "GÃ¥ til epic"
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr "OK"
@@ -17206,9 +17599,6 @@ msgstr "Grupperunnere"
msgid "Group runners can be managed with the %{link}."
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 "Gruppedeling giver adgang til alle gruppemedlemmer (herunder medlemmer som nedarvede gruppemedlemskab fra en forældergruppe)."
-
msgid "Group variables (inherited)"
msgstr "Gruppevariabler (nedarvet)"
@@ -17611,15 +18001,15 @@ msgstr ""
msgid "GroupSettings|Select the project that contains your custom Insights file."
msgstr ""
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
+msgstr ""
+
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 "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 "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 ""
@@ -17740,6 +18130,9 @@ msgstr "Opret gruppe"
msgid "GroupsNew|Create new group"
msgstr "Opret ny gruppe"
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr "Min fantastiske gruppe"
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr "Skjul delte projekter"
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr "Skjul værktøjstips eller popovere"
@@ -18200,9 +18696,6 @@ msgstr "Jeg accepterer %{terms_link}"
msgid "I forgot my password"
msgstr "Jeg har glemt min adgangskode"
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr "Jeg vil udforske GitLab for at se om det er værd at skifte til"
@@ -18278,9 +18771,6 @@ 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 "INFO: Din SSH-nøgle udløber snart. Generer venligst en ny nøgle."
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "IP-adresse"
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr "Besøg siden %{settings_link_to} hvis du vil genaktivere totrinsgodkendelse."
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr "Importér problemstillinger"
-msgid "Import members"
-msgstr "Importér medlemmer"
-
-msgid "Import members from another project"
-msgstr "Importér medlemmer fra et andet projekt"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Importér flere depoter ved at uploade en manifestfil."
@@ -18525,9 +19015,6 @@ msgstr "Importér projekt"
msgid "Import project from"
msgstr "Importér projekt fra"
-msgid "Import project members"
-msgstr "Importér projektmedlemmer"
-
msgid "Import projects from Bitbucket"
msgstr "Importér projekter fra Bitbucket"
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr "Inviter dit team nu"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr "%{minutes} minutter tilbage"
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr "Alle"
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr "Tildelere"
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr "Alvorlighed"
@@ -19328,6 +19821,9 @@ msgstr "Der opstod en fejl under visning af hændelserne."
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr "Utildelt"
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr "Alertbeskeddetaljer"
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr "MÃ¥linger"
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "Opsummering"
@@ -19439,6 +19941,9 @@ msgstr "Der opstod et problem ved indlæsning af alertbeskeddata. Prøv venligst
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr "Der opstod et problem ved indlæsning af hændelsesdata. Prøv venligst igen."
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr "Nedarvet"
msgid "Inherited:"
msgstr "Nedarvet:"
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr "Indlejret"
@@ -19747,6 +20258,9 @@ msgstr "Kunne ikke linke navnerum. Prøv venligst igen."
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr "Kunne ikke indlæse navnerum. Prøv venligst igen."
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr "Kunne ikke aflinke navnerum. Prøv venligst igen."
@@ -19861,6 +20375,9 @@ msgstr "Brug tilpassede indstillinger"
msgid "Integrations|Use default settings"
msgstr "Brug standardindstillinger"
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr "Du kan nu lukke vinduet og vende tilbage til GitLab for Jira-programmet."
@@ -19873,12 +20390,18 @@ msgstr "Du har endnu ikke aktiveret nogle integreringer."
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr "Du skal have ejer- eller vedligeholdertilladelser for at linke navnerum."
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr "Du har aktiveret alle integreringer 🎉"
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr "Invitation"
msgid "Invitation declined"
msgstr "Invitation afvist"
-msgid "Invite"
-msgstr "Inviter"
-
msgid "Invite \"%{email}\" by email"
msgstr "Inviter \"%{email}\" via e-mail"
@@ -20044,12 +20564,6 @@ msgstr "Inviter en gruppe"
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr "Inviter gruppe"
-
-msgid "Invite member"
-msgstr "Inviter medlem"
-
msgid "Invite members"
msgstr "Inviter medlemmer"
@@ -20143,6 +20657,9 @@ msgstr "Inviter medlemmer"
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "Søg efter en grupper som skal inviteres"
@@ -20161,6 +20678,12 @@ msgstr "Noget gik galt"
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr "Du inviterer en gruppe til gruppen %{strongStart}%{name}%{strongEnd}."
@@ -20173,6 +20696,9 @@ msgstr "Du inviterer medlemmer til gruppen %{strongStart}%{name}%{strongEnd}."
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr "Du inviterer medlemmer til projektet %{strongStart}%{name}%{strongEnd}."
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr "Inviter en gruppe"
@@ -20365,9 +20891,6 @@ msgstr "Problemstilling blev lukket af %{name} %{reason}"
msgid "Issue weight"
msgstr "Problemstillingsvægt"
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr "Alder"
@@ -20410,8 +20933,8 @@ msgstr "Slet tavle"
msgid "IssueBoards|No matching boards found"
msgstr "Ingen matchende tavler fundet"
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr "Nogle af dine tavler er skjulte. Aktivér en licens for at se dem igen."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr ""
msgid "IssueBoards|Switch board"
msgstr "Skift tavle"
@@ -20581,11 +21104,14 @@ msgstr "Gennemløb opdateret"
msgid "Iterations"
msgstr "Gennemløb"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr "Tilføj gennemløb"
-msgid "Iterations|Automated scheduling"
-msgstr "Automatiseret planlægning"
+msgid "Iterations|All"
+msgstr ""
msgid "Iterations|Cadence configuration is invalid."
msgstr ""
@@ -20599,12 +21125,6 @@ msgstr "Kunne ikke finde gennemløbskadence"
msgid "Iterations|Create cadence"
msgstr "Opret kadence"
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr "Opret gennemløb"
-
msgid "Iterations|Delete cadence"
msgstr "Slet kadence"
@@ -20614,6 +21134,9 @@ msgstr "Slet gennemløbskadence?"
msgid "Iterations|Delete iteration?"
msgstr "Slet gennemløb?"
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Varighed"
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr "Gennemløbskadencer"
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr "Ingen lukkede gennemløb."
msgid "Iterations|No iteration cadences to show."
msgstr "Ingen gennemløbskadencer at vise."
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr "Ingen gennemløb i kadence."
@@ -20662,11 +21194,17 @@ msgstr "Ingen åbne gennemløb."
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
-msgstr "Gem kadence"
+msgid "Iterations|Save changes"
+msgstr ""
msgid "Iterations|Select duration"
msgstr "Vælg varighed"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr "Vælg startdato"
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr "Startdato"
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+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."
@@ -20944,9 +21488,6 @@ msgstr "Brugernavn eller e-mail"
msgid "JiraService|Using Jira for issue tracking?"
msgstr "Brug Jira til problemstillingssporing?"
-msgid "JiraService|View Jira issues in GitLab"
-msgstr "Vis Jira-problemstillinger i GitLab"
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr "Er du sikker på, at du vil prøve jobbet igen?"
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr "Jobbet sidder fast. Tjek runnere."
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr "Gennemse"
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "Download"
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr "Behold"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "Rul nederst"
@@ -21094,6 +21674,9 @@ msgstr "Rul øverst"
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "må mislykkes"
@@ -21477,6 +22063,9 @@ msgstr "Sidste opdateringsforsøg"
msgid "Last updated"
msgstr "Sidst opdateret"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr "Sidst brugt"
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr "Let's Encrypt accepterer ikke e-mails på example.com"
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr "Licensoverholdelse"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr "%{docLinkStart}Licensgodkendelser%{docLinkEnd} er aktiv"
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr "%{docLinkStart}Licensgodkendelser%{docLinkEnd} er inaktiv"
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr "Lær mere om %{linkStart}licensgodkendelser%{linkEnd}"
-msgid "LicenseCompliance|License Approvals"
-msgstr "Licensgodkendelser"
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] "Licensoverholdelse registrerede %d overtrædelse af licens og regelsæt kun for kildegrenen"
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
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 %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr "Licensoverholdelse registrerede ingen licenser kun for kildegrenen"
@@ -21825,6 +22431,12 @@ msgstr "Licensoverholdelse registrerede ingen nye licenser"
msgid "LicenseCompliance|License name"
msgstr "Licensnavn"
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr "Fjern licens"
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr "Licensen findes allerede i projektet."
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr "Du er ved at fjerne licensen %{name} fra projektet."
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr "Liste over alle sammenlægningscommits"
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr "HÃ¥ndter gruppeetiketter"
msgid "Manage labels"
msgstr "HÃ¥ndter etiketter"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr "Håndter milepæle"
@@ -22338,6 +22956,9 @@ msgstr "Manifest-import"
msgid "Manual"
msgstr "Manuelt"
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr "Maks. filstørrelse er 200 KB."
msgid "Max role"
msgstr "Maks. rolle"
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr "Maksimale linjer i en diff"
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr "Afvis adgang"
-msgid "Member|Remove member"
-msgstr "Fjern medlem"
-
msgid "Member|Revoke invite"
msgstr "Tilbagekald invitation"
@@ -22918,7 +23542,7 @@ msgstr "Sammenlægningsanmodninger sammenlagt"
msgid "Merge automatically (%{strategy})"
msgstr "Sammenlæg automatisk (%{strategy})"
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr "Sammenlægningsanmodninger"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr "Mi"
-msgid "Middleman project with Static Site Editor support"
-msgstr "Middleman-projekt med understøttelse af editor til statisk websted"
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr "Luk milepæl"
msgid "Milestones|Completed Issues (closed)"
msgstr "Fuldførte problemstillinger (lukkede)"
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Slet milepæl"
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr "Vedvarende problemstillinger (Ã¥bne og tildelte)"
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr "Projektmilepæle"
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr "Genåbn milepæl"
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr "Problemstillinger som har fået fjernet deres stjerne (åbne og utildelte)"
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr "MÃ¥ned"
msgid "Months"
msgstr "MÃ¥neder"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr "Mere information"
@@ -23924,16 +24563,16 @@ msgstr "Genudsend"
msgid "MrDeploymentActions|Stop environment"
msgstr "Stop miljø"
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr "Log ud og log ind med en anden konto"
msgid "Need help?"
msgstr "Brug for hjælp?"
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr "Behov"
@@ -24301,9 +24970,6 @@ msgstr "Aldrig"
msgid "New"
msgstr "Ny"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr "Ny mappe"
msgid "New discussion"
msgstr "Ny debat"
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr "Nyt miljø"
@@ -24471,6 +25140,9 @@ msgstr "Nyt projekt/depot"
msgid "New public deploy key"
msgstr "Ny offentlig udsendelsesnøgle"
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr "Ny udgivelse"
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr "Ny planlægning"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Nyt udklip"
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr "Næste uløste debat"
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr "Kaldenavn"
@@ -24585,6 +25257,9 @@ msgstr "Ingen artefakter fundet"
msgid "No assignee"
msgstr "Ingen tildeler"
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr "Her er ingen commits"
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-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? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr "Ingen problemstillinger fundet"
msgid "No iteration"
msgstr "Ingen gennemløb"
-msgid "No iterations found"
-msgstr "Ingen gennemløb fundet"
-
msgid "No iterations to show"
msgstr "Ingen gennemløb at vise"
@@ -24720,7 +25386,7 @@ msgstr "Ingen licens. Alle rettigheder forbeholdt"
msgid "No matches found"
msgstr "Ingen match fundet"
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr "Ingen meddelelser blev logget"
msgid "No milestone"
msgstr "Ingen milepæl"
-msgid "No milestones to show"
-msgstr "Ingen milepæle at vise"
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr "Ingen startdato"
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr "Intet mærkat valgt"
@@ -24992,6 +25658,9 @@ msgstr "Vis kun historik"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr "Kommentaren er fortrolig og kun synlig for projektmedlemmer"
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Kun administratorer kan slette projektet"
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Kun projektmedlemmer kan kommentere."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,12 +26301,12 @@ msgstr "Ã…bne"
msgid "Open Selection"
msgstr "Ã…bn markering"
-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 errors"
msgstr "Ã…bne fejl"
+msgid "Open in Gitpod"
+msgstr ""
+
msgid "Open in Web IDE"
msgstr "Ã…bn i web-IDE"
@@ -25650,9 +26319,6 @@ msgstr "Ã…bn i din IDE"
msgid "Open raw"
msgstr "Åbn rå"
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "Åbn sidebjælke"
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "Ã…bnes i et nyt vindue"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr "Ejet af:"
msgid "Owner"
msgstr "Ejer"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr "URL for Phabricator-server"
msgid "Phabricator Tasks"
msgstr "Phabricator-opgaver"
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr "Vælg et navn"
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipelines"
@@ -26873,12 +27551,15 @@ msgstr "Pipelinediagrammer"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
msgid "Pipelines|API"
msgstr "API"
-msgid "Pipelines|Add a code quality job"
-msgstr "Tilføj et kodekvalitetsjob"
-
msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr "Er du sikker på, at du vil køre pipelinen?"
@@ -26924,7 +27605,7 @@ msgstr "Rediger"
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,14 +27614,14 @@ msgstr "Kom godt i gang med GitLab CI/CD"
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
-msgstr "Forbedr kodekvalitet med GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgstr ""
-msgid "Pipelines|Install GitLab Runners"
-msgstr "Installer GitLab-runnere"
+msgid "Pipelines|Install GitLab Runner"
+msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
@@ -26948,8 +27629,8 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr "Sidst brugt"
-msgid "Pipelines|Learn about Runners"
-msgstr "Lær om runnere"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
+msgstr ""
msgid "Pipelines|Lint"
msgstr "Lint"
@@ -26966,6 +27647,9 @@ msgstr "Sammenlagt YAML er kun visning"
msgid "Pipelines|More Information"
msgstr "Mere information"
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr "Projektmellemlager nulstillet."
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "Noget gik galt under rensning af runnermellemlager."
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
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 "Token"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-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 ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr "Commit"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr "Dato"
msgid "Pipeline|Detached merge request pipeline"
msgstr "Løsrevet sammenlægningsanmodningspipeline"
-msgid "Pipeline|Duration"
-msgstr "Varighed"
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr "Vælg venligst en fil"
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr "Vælg venligst en gruppe."
-
msgid "Please select a valid target branch"
msgstr "Vælg venligst en gyldig målgren"
@@ -27521,7 +28196,7 @@ msgstr "Pod ikke fundet"
msgid "Pods in use"
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."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr "Filsti eller URL for Postman-samling"
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr "Brug relative tidspunkter"
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr "Forrige"
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ 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 "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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr "Nøglen kan stadigvæk bruges efter den udløber."
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr "Nøglen kan bruges efter udløbsdatoen."
@@ -28148,6 +28829,9 @@ msgstr "Informationen vises i din profil"
msgid "Profiles|Time settings"
msgstr "Tidsindstillinger"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "Totrinsgodkendelse"
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr "Din status"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "f.eks. Min MacBook-nøgle"
-
msgid "Profiles|https://website.com"
msgstr "https://website.com"
@@ -28736,7 +29417,7 @@ msgstr "Hver sammenlægning opretter en sammenlægningscommit."
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr "Ingen sammenlægningscommits er oprettet."
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr "Når der er en sammenlægningskonflikt, så får brugeren mulighed for at rebase."
@@ -29069,6 +29756,9 @@ msgstr "Pages/Hugo"
msgid "ProjectTemplates|Pages/Jekyll"
msgstr "Pages/Jekyll"
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Pages/ren HTML"
@@ -29087,9 +29777,6 @@ msgstr "Serverfrit framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr "Editor til statisk websted/Middleman"
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr "Projektkonfiguration"
@@ -29843,7 +30536,10 @@ msgstr "Push-begivenheder"
msgid "Push project from command line"
msgstr "Push projekt fra kommandolinje"
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr "Registeropsætning"
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr "Afvist (lukket)"
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr "Relaterede funktionsflag"
@@ -30286,9 +30988,6 @@ msgstr "Relaterede problemstillinger"
msgid "Related merge requests"
msgstr "Relaterede sammenlægningsanmodninger"
-msgid "Related to #%{issue_id}."
-msgstr "Relateret til #%{issue_id}."
-
msgid "Relates to"
msgstr "Relateret til"
@@ -30519,6 +31218,9 @@ msgstr "Fjern brugt tid"
msgid "Remove time estimate"
msgstr "Fjern tidsestimat"
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr "Fjern bruger"
@@ -30729,7 +31431,10 @@ msgstr "Rapportér misbrug"
msgid "Report abuse to admin"
msgstr "Rapportér misbrug til administrator"
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr "Mislykkedes"
msgid "Reports|Filename"
msgstr "Filnavn"
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr "Målingsrapporter ændrede sig ikke"
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr "Skanner"
@@ -30844,9 +31561,15 @@ msgstr "Testopsummering"
msgid "Reports|Test summary failed loading results"
msgstr "Testopsummering kunne ikke indlæse resultater"
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "Testopsummeringsresultater er ved at blive fortolket"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr "Værktøj"
@@ -31357,7 +32080,7 @@ msgstr "Kontrollér ændringer"
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr "sletter"
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "Vejkort"
@@ -31473,12 +32193,12 @@ msgstr "Kør job uden mærkater"
msgid "Runner API"
msgstr "Runner API"
+msgid "Runner cannot be deleted, please contact your administrator."
+msgstr ""
+
msgid "Runner tokens"
msgstr "Runnertokens"
-msgid "Runner was not deleted because it is assigned to multiple projects."
-msgstr ""
-
msgid "Runner was not updated."
msgstr ""
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr "Aktiv"
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr "Udsend GitLab Runner i AWS"
@@ -31563,6 +32319,9 @@ msgstr "Beskrivelse"
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr "Download og installer programfil"
@@ -31572,18 +32331,12 @@ msgstr "Download seneste programfil"
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
msgstr ""
-msgid "Runners|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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
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 ""
-
msgid "Runners|Install a runner"
msgstr "Installer en runner"
@@ -31605,25 +32358,31 @@ msgstr "Maksimum timeout for job"
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr "Navn"
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
-msgstr "Ny registreringstoken genereret!"
+msgid "Runners|Never contacted:"
+msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr "Ny registreringstoken genereret!"
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr "Offline"
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr "Online"
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr "Sat på pause"
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr "Platform"
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr "Revision"
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr "Runner"
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
-msgstr "Runner er offline. Sidste kontakt var %{runner_contact} siden"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
-msgstr "Runner er online. Sidste kontakt var %{runner_contact} siden"
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
+msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
-msgstr "Runner er sat på pause. Sidste kontakt var %{runner_contact} siden"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
+msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr "Runnere"
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,18 +32555,21 @@ msgstr "Stop runneren i at acceptere nye job."
msgid "Runners|Tags"
msgstr "Mærkater"
+msgid "Runners|Take me there!"
+msgstr ""
+
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
+msgstr ""
+
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|This runner has not run any jobs."
msgstr ""
msgid "Runners|This runner is associated with specific projects."
msgstr "Runneren er tilknyttet med bestemte projekter."
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
-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 "Runneren er tilgængelig i alle projekter og undergrupper i en gruppe."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr "Vis installationsinstruktioner"
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ msgstr ""
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr "Du kan opsat en bestemt runner til at blive brugt af flere projekter men du kan ikke gøre den til en delt runner."
-msgid "Runners|You cannot assign to other projects"
-msgstr ""
-
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
msgstr ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "Kører"
@@ -31950,10 +32759,10 @@ msgstr "Gemmer"
msgid "Saving project."
msgstr "Gemmer projekt."
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr "Søg efter projekter"
msgid "Search projects..."
msgstr "Søg efter projekter ..."
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr "Søgning efter både forfatter og meddelelse understøttes ikke i øjebl
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr "Hemmelig token"
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr "%{branches} %{plural}"
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr "%{branches} og %{lastBranch} %{plural}"
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr "Alle regelsæt"
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr "Beskrivelse"
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr "Rediger regelsæt"
msgid "SecurityOrchestration|Edit policy project"
msgstr "Rediger regelsætprojekt"
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr "Netværk"
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr "Nyt regelsæt"
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr "Regler"
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr "Vælg sikkerhedsprojekt"
@@ -32644,10 +33522,13 @@ msgstr "Beklager, dit filter gav ingen resultater."
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr "Ændr status"
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "Kommentar tilføjet til '%{vulnerabilityName}'"
@@ -32896,6 +33789,9 @@ msgstr "Projekter tilføjet"
msgid "SecurityReports|Remove project from dashboard"
msgstr "Fjern projekt fra betjeningspanel"
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr "Indstil status"
msgid "SecurityReports|Severity"
msgstr "Alvorlighed"
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr "Beklager, dit filter gav ingen resultater"
msgid "SecurityReports|Status"
msgstr "Status"
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr "SÃ¥rbarhedsrapport"
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr "Din feedback er vigtig for os! Vi spørger igen om en uge."
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr "Vælg side"
msgid "Select a branch"
msgstr "Vælg en gren"
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr "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 group to invite"
-msgstr "Vælg en gruppe som skal inviteres"
-
msgid "Select a label"
msgstr "Vælg en etiket"
@@ -33205,6 +34107,9 @@ msgstr "Vælg abonnement"
msgid "Select target branch"
msgstr "Vælg målgren"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr "Vælg tidszone"
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr "Indstil alvorlighed"
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr "Indstil tidsestimat"
@@ -33631,9 +34542,6 @@ msgstr "Indstil vægt til %{weight}."
msgid "Set what should be replicated by this secondary site."
msgstr "Indstil hvad der skal replikeres af det sekundære websted."
-msgid "SetStatusModal|Add status emoji"
-msgstr "Tilføj statusemoji"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr "Der vises en indikator ved siden af dit navn og din avatar"
@@ -33888,6 +34796,9 @@ msgstr "Vis listen lukket"
msgid "Show the Open list"
msgstr "Vis listen åbne"
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr "Brugernavn er for kort (minimum er %{min_length} tegn)."
msgid "Signed in"
msgstr "Loggede ind"
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr "Snowplow"
msgid "Solution"
msgstr "Løsning"
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr "Nogle ændringer vises ikke"
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr "Nogen redigerede problemstillingen på samme tid som dig. Tjek venligst %{linkStart}problemstillingen%{linkEnd} og sørg for at dine ændringer ikke utilsigtet fjerner deres."
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
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 "Noget gik galt under tilføjelse af din belønning. Prøv venligst igen."
@@ -34409,9 +35326,6 @@ msgstr "Noget gik galt under opdatering af et krav."
msgid "Something went wrong while updating assignees"
msgstr "Noget gik galt under opdatering af tildelere"
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr "Noget gik galt under opdatering af dine listeindstillinger"
@@ -34835,6 +35749,9 @@ msgstr "Startdato"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr "Start sammenlægningstog"
@@ -34979,6 +35896,9 @@ msgstr "Status:"
msgid "Status: %{title}"
msgstr "Status: %{title}"
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr "MÃ¥lgren"
msgid "StatusCheck|Update status check"
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 "Du er ved at fjerne statustjekket %{name}."
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr "Trin 1."
@@ -35267,10 +36187,10 @@ msgstr "Abonnement oprettet."
msgid "Subscription successfully deleted."
msgstr "Abonnement slettet."
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr "Upload en licensfil"
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr "Brugere i abonnement"
@@ -35795,12 +36717,6 @@ msgstr "Hjælp for systemhooks"
msgid "System Info"
msgstr "Systeminformation"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr "Systemstandard (%{default})"
@@ -35957,6 +36873,12 @@ msgstr "MÃ¥lsti"
msgid "Target branch"
msgstr "MÃ¥lgren"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr "MÃ¥lgren"
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "Skabelon"
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr "URL'en skal begynde med http:// eller https://"
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr "Projektet blev importeret."
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr "Fjerndepotet er ved at blive opdateret ..."
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr "Udklippet kan ikke tilgås uden godkendelse."
@@ -36810,6 +37750,9 @@ msgstr "Udklippet er kun synligt for projektmedlemmer."
msgid "The snippet is visible to any logged in user except external users."
msgstr "Udklippet er synligt for alle brugere som er logget ind undtagen eksterne brugere."
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr "Det angivne faneblad er ugyldigt. Vælg venligst et andet"
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr "Variablerne er nedarvede fra forældergruppen."
msgid "These will be sent to %{email} in an attachment once finished."
msgstr "De sendes til %{email} i en vedhæftning når det er færdigt."
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,8 +38194,8 @@ msgstr "Denne %{issuableType} er fortrolig"
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "Denne %{issuable} er låst. Kun %{strong_open}projektmedlemmer%{strong_close} kan kommentere."
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
-msgstr "Denne %{noteableTypeText} er %{confidentialLinkStart}fortrolig%{linkEnd} og %{lockedLinkStart}låst%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
+msgstr ""
msgid "This %{noteableTypeText} is locked."
msgstr "Denne %{noteableTypeText} er låst."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr "Miljøet udsendes"
msgid "This environment is being re-deployed"
msgstr "Miljøet genudsendes"
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr "Jobbet har ikke et trace."
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Jobbet er blevet annulleret"
@@ -37767,6 +38725,9 @@ msgstr "Abonnementet er til"
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Brugeren kan ikke oplåses fra GitLab manuelt"
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr "Skriv %{phrase_code} for at bekræfte"
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ 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 ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr "Sidebjælke til/fra"
msgid "Toggle the Performance Bar"
msgstr "Ydelseslinje til/fra"
-msgid "Toggle thread"
-msgstr "Tråd til/fra"
-
msgid "Toggled :%{name}: emoji award."
msgstr "Slog til/fra :%{name}: emojibelønning."
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr "Kan ikke opdatere stien da der er projekter under gruppen som indeholder
msgid "TransferGroup|Database is not supported."
msgstr "Databasen understøttes ikke."
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr "Gruppe indeholder projekter med NPM-pakker."
@@ -38818,6 +39788,9 @@ msgstr "Prøv igen"
msgid "Try again?"
msgstr "Prøv igen?"
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "Prøv alt hvad GitLab har at tilbyde i 30 dage."
@@ -39022,6 +39995,9 @@ msgstr "Kan ikke indlæse commits. Prøv igen senere."
msgid "Unable to load file contents. Try again later."
msgstr "Kan ikke indlæse filindholdet. Prøv igen senere."
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr "Kan ikke indlæse diff'en"
@@ -39058,6 +40034,9 @@ 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 "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr "Upload CSV-fil"
msgid "Upload File"
msgstr "Upload fil"
-msgid "Upload License"
-msgstr "Upload licens"
-
msgid "Upload New File"
msgstr "Upload ny fil"
@@ -39385,9 +40364,6 @@ msgstr "Upload fil"
msgid "Upload image"
msgstr "Upload billede"
-msgid "Upload license"
-msgstr "Upload licens"
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr "klik for at uploade"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr "Uploader ændringer til terminal"
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr "Brug .gitlab-ci.yml"
msgid "Use GitLab Runner in AWS"
msgstr "Brug GitLab Runner i AWS"
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr "Brug en AWS CloudFormation Template (CFT) til at installere og konfigure
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr "Brug cURL"
@@ -40507,9 +41492,6 @@ msgstr "Vis erstattet fil @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr "Vis indstilling"
-
msgid "View supported languages and frameworks"
msgstr "Vis understøttede sprog og frameworks"
@@ -40534,6 +41516,9 @@ msgstr "Vist"
msgid "Viewing commit"
msgstr "Viser commit"
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr "Ændr status"
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr "Klasse"
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr "Venter på sammenlægning (åbne og tildelte)"
@@ -40948,6 +41936,9 @@ msgstr "Advarsel: Visning af diagrammet kan forårsage ydelsesproblemer på side
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr "Hændelser for wikiside"
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr "Websted:"
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr "Hvad søger du?"
-
msgid "What does this command do?"
msgstr "Hvad gør kommandoen?"
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ 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 "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 you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr "NÃ¥r:"
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-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?"
-
msgid "WikiPage|Cancel"
msgstr "Annuller"
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr "Format"
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr "Prøv igen"
msgid "WikiPage|Save changes"
msgstr "Gem ændringer"
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-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 "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 "Tip: du kan flytte siden ved at tilføje stien til begyndelsen af titlen."
@@ -41577,18 +42550,9 @@ msgstr "Titel"
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr "Prøv det senere"
-
msgid "WikiPage|Update %{pageTitle}"
msgstr "Opdater %{pageTitle}"
-msgid "WikiPage|Use the new editor"
-msgstr "Brug den nye editor"
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "Skriv dit indhold eller træk filer hertil …"
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr "Du kan altid ændre din URL senere"
msgid "You can always edit this later"
msgstr "Du kan altid ændre det senere"
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr "Du kan oprette en ny %{link}."
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr "Du kan kun overføre projektet til navnerum du håndterer."
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "Du kan ikke tilgå den rå fil. Vent venligst et øjeblik."
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr "Du har ingen seneste søgninger"
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr "Du har ikke tilstrækkelig tilladelse til at udføre handlingen."
@@ -42170,10 +43155,10 @@ msgstr "Du har ikke tilstrækkelige tilladelser til at opdatere HTTP-integrering
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr "URL eller id til YouTube"
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr "Dit abonnement udløb!"
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr "må ikke selv blokeres"
msgid "cannot merge"
msgstr "kan ikke sammenlægge"
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr "Tjekker"
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "HÃ¥ndter licenser"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr "Ny"
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr "lukket"
msgid "closed issue"
msgstr "lukket problemstilling"
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr "Tillykke! Din første pipeline kører %{emojiStart}zap%{emojiEnd}"
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr "OK"
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Something went wrong. %{emojiStart}thinking%{emojiEnd} Let's fix it."
-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 "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 "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 "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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr "committed"
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "aktiveret"
@@ -43697,6 +44681,11 @@ msgstr "Visning af math-blokken kan forårsage ydelsesproblemer på siden"
msgid "math|There was an error rendering this math block"
msgstr "Der opstod en fejl ved gengivelse af math-blokken"
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "sammenlægningsanmodning"
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr "Annuller automatisk sammenlægning"
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "Sammenlægning mislykkedes."
-msgid "mrWidget|Merge locally"
-msgstr "Sammenlæg lokalt"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr "Anmodning om at sammenlægge"
msgid "mrWidget|Resolve conflicts"
msgstr "Løs konflikter"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "Tilbagefør"
@@ -44102,9 +45097,6 @@ msgstr "min-fantastiske-gruppe"
msgid "my-channel"
msgstr "min-kanal"
-msgid "n/a"
-msgstr "—"
-
msgid "need attention"
msgstr "behøver opmærksomhed"
@@ -44165,6 +45157,9 @@ msgstr "Ã¥ben problemstilling"
msgid "or"
msgstr "eller"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr "projektavatar"
-
msgid "project bots cannot be added to other groups / projects"
msgstr "projektbotter kan ikke tilføjes til andre grupper/projekter"
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr "filen"
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index 7058abba5bc..92659cc7218 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: de\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:13\n"
msgid " %{start} to %{end}"
msgstr " %{start} bis %{end}"
@@ -28,15 +28,9 @@ msgstr " Gesammelt %{time}"
msgid " Please sign in."
msgstr " Bitte melde dich an."
-msgid " Target Path"
-msgstr " Zielpfad"
-
msgid " Try to %{action} this file again."
msgstr " Versuche die Datei erneut zu %{action}."
-msgid " Type"
-msgstr " Typ"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Das musst du vor %{grace_period_deadline} tun."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "%d weiterer Kommentar"
msgstr[1] "%d weiterere Kommentare"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d offenes Ticket"
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "%d persönliches Projekt wird entfernt und kann nicht wiederhergestellt werden."
msgstr[1] "%d persönliche Projekte werden entfernt und können nicht wiederhergestellt werden."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d zuvor gemergeter Commit"
@@ -371,10 +375,10 @@ msgid_plural "%d projects selected"
msgstr[0] "%d Projekt ausgewählt"
msgstr[1] "%d Projekte ausgewählt"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d Anfrage mit Warnungen"
-msgstr[1] "%d Anfragen mit Warnungen"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -398,8 +402,8 @@ msgstr[1] "%d Tags"
msgid "%d tag per image name"
msgid_plural "%d tags per image name"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Tag pro Image-Name"
+msgstr[1] "%d Tags pro Image-Name"
msgid "%d token has expired"
msgid_plural "%d tokens have expired"
@@ -460,17 +464,14 @@ msgid "%{actionText} & %{openOrClose} %{noteable}"
msgstr "%{actionText} & %{openOrClose} %{noteable}"
msgid "%{actionText} & close %{noteable}"
-msgstr ""
+msgstr "%{actionText} & schließen %{noteable}"
msgid "%{actionText} & reopen %{noteable}"
-msgstr ""
+msgstr "%{actionText} & wieder öffnen %{noteable}"
msgid "%{address} is an invalid IP address range"
msgstr "%{address} ist ein ungültiger IP-Adressbereich"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-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 "%{author_link} hat %{original_issue} zu %{new_issue} geklont."
@@ -702,6 +703,9 @@ msgstr "%{integrations_link_start}Integrationen%{link_end} ermöglichen es dir,
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} wird entfernt! Bist du sicher?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "%{issueType}-Aktionen"
@@ -778,10 +782,10 @@ 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 "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "%{linkStart}Weiterlernen.%{linkEnd}"
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "%{link_start}Erfahre mehr%{link_end} über Rollenberechtigungen."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Entferne das %{draft_snippet} Präfix%{link_end} aus dem Titel, damit dieser Merge Request gemerged werden kann, wenn er bereit ist."
@@ -789,9 +793,6 @@ msgstr "%{link_start}Entferne das %{draft_snippet} Präfix%{link_end} aus dem Ti
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr "%{link_start}Lade eine Lizenzdatei%{link_end} hoch oder gib den Lizenzschlüssel ein, den du von GitLab Inc. erhalten hast."
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr "%{link_start}Welche Informationen sammelt GitLab Inc.?%{link_end}"
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, bestätige jetzt deine E-Mail-Adresse!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} Tag"
@@ -888,7 +892,7 @@ msgid "%{percentage}%% issues closed"
msgstr ""
msgid "%{percentage}%% weight completed"
-msgstr ""
+msgstr "%{percentage}%% Gewichtung abgeschlossen"
msgid "%{percent}%% complete"
msgstr "%{percent}%% abgeschlossen"
@@ -992,11 +996,19 @@ msgstr "%{spanStart}in%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} bis %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr "%{strongOpen}Warnung:%{strongClose} SAML Gruppen-Links können GitLab dazu veranlassen, automatisch Mitglieder aus Gruppen zu entfernen."
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
-msgstr "%{strongStart}Tipp:%{strongEnd} Du kannst Merge-Requests auch lokal auschecken, indem du %{linkStart}diese Richtlinien%{linkEnd} befolgst."
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -1049,7 +1061,7 @@ msgid "%{tags} tags per image name"
msgstr "%{tags} Tags pro Image-Name"
msgid "%{tag}-%{evidence}-%{filename}"
-msgstr ""
+msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} ist unbekannt oder ungültig"
@@ -1079,7 +1091,7 @@ msgid "%{totalMemory} (%{freeSpacePercentage}%{percentSymbol} free)"
msgstr "%{totalMemory} (%{freeSpacePercentage}%{percentSymbol} frei)"
msgid "%{totalWeight} total weight"
-msgstr ""
+msgstr "%{totalWeight} Gesamtgewicht"
msgid "%{total_warnings} warning(s) found:"
msgstr "%{total_warnings} Warnung(en) gefunden:"
@@ -1201,13 +1213,13 @@ msgid "(+%{count}&nbsp;rules)"
msgstr ""
msgid "(Group Managed Account)"
-msgstr ""
+msgstr "(Gruppenadministrierte Konten)"
msgid "(No changes)"
msgstr "(Keine Änderungen)"
msgid "(UTC %{offset}) %{timezone}"
-msgstr ""
+msgstr "(UTC %{offset}) %{timezone}"
msgid "(check progress)"
msgstr "(Fortschritt überprüfen)"
@@ -1268,7 +1280,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "+%{approvers} more approvers"
-msgstr ""
+msgstr "+%{approvers} weitere Genehmigungsberechtigte"
msgid "+%{extra} more"
msgstr ""
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1552,7 +1564,7 @@ msgid "A basic template for developing Linux programs using Kotlin Native"
msgstr ""
msgid "A complete DevOps platform"
-msgstr ""
+msgstr "Eine komplette DevOps-Plattform"
msgid "A default branch cannot be chosen for an empty project."
msgstr "Ein Default-Branch kann nicht für ein leeres Projekt ausgewählt werden."
@@ -1602,9 +1614,18 @@ msgstr "Ein neues Release %{tag} für %{name} wurde veröffentlicht. Besuche die
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "Ein neues Release %{tag} für %{name} wurde veröffentlicht. Besuche die Releases-Seite, um mehr darüber zu erfahren:"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "Eine neuer Identitätswechsel-Token wurde erstellt."
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1783,7 +1804,7 @@ msgid "AWS secret access key (Optional)"
msgstr ""
msgid "AWS service error: %{error}"
-msgstr ""
+msgstr "AWS-Servicefehler: %{error}"
msgid "Abort"
msgstr "Abbrechen"
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr "Ãœber dieses Feature"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Missbrauchsmeldungen"
@@ -1825,10 +1849,7 @@ msgid "Access denied for your LDAP account."
msgstr "Zugriff für dein LDAP-Konto verweigert."
msgid "Access denied: %{error}"
-msgstr ""
-
-msgid "Access expiration date"
-msgstr "Zugriff auf das Ablaufdatum"
+msgstr "Zugriff verweigert: %{error}"
msgid "Access expires"
msgstr ""
@@ -1933,7 +1954,7 @@ msgid "AccessibilityReport|Message: %{message}"
msgstr "Nachricht: %{message}"
msgid "AccessibilityReport|New"
-msgstr ""
+msgstr "Neu"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr "Kubernetes-Cluster hinzufügen"
msgid "Add LICENSE"
msgstr "LIZENZ hinzufügen"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2134,7 +2161,7 @@ msgid "Add an SSH key for secure access to GitLab. %{help_link_start}Learn more.
msgstr ""
msgid "Add an existing issue"
-msgstr ""
+msgstr "Vorhandenes Ticket hinzufügen"
msgid "Add an impersonation token"
msgstr ""
@@ -2161,6 +2188,9 @@ msgid "Add comment now"
msgstr "Jetzt kommentieren"
msgid "Add comment to design"
+msgstr "Kommentar zum Design hinzufügen"
+
+msgid "Add comment..."
msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
@@ -2391,6 +2421,9 @@ msgstr "Fügt ein Ticket zu einem Epic hinzu."
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "Inhaber(in)"
@@ -2580,12 +2622,18 @@ msgstr "Projekt %{projectName} löschen?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto-DevOps-Domain"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr "Erforderliche Pipeline-Konfiguration"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "Aktive Benutzer(innen)"
@@ -3163,10 +3241,10 @@ msgid "AlertManagement|Alert assignee(s): %{assignees}"
msgstr "Alarm-Beauftragte(r): %{assignees}"
msgid "AlertManagement|Alert detail"
-msgstr ""
+msgstr "Alarm-Details"
msgid "AlertManagement|Alert details"
-msgstr ""
+msgstr "Alarm-Details"
msgid "AlertManagement|Alert status: %{status}"
msgstr ""
@@ -3241,7 +3319,7 @@ msgid "AlertManagement|Reported %{when} by %{tool}"
msgstr ""
msgid "AlertManagement|Resolved"
-msgstr ""
+msgstr "Gelöst"
msgid "AlertManagement|Runbook"
msgstr ""
@@ -3250,7 +3328,7 @@ msgid "AlertManagement|Service"
msgstr ""
msgid "AlertManagement|Severity"
-msgstr ""
+msgstr "Schweregrad"
msgid "AlertManagement|Start time"
msgstr ""
@@ -3289,7 +3367,7 @@ msgid "AlertManagement|Triggered"
msgstr ""
msgid "AlertManagement|Value"
-msgstr ""
+msgstr "Wert"
msgid "AlertManagement|View incident"
msgstr ""
@@ -3547,7 +3625,7 @@ msgid "All projects"
msgstr "Alle Projekte"
msgid "All projects selected"
-msgstr ""
+msgstr "Alle Projekte ausgewählt"
msgid "All threads resolved"
msgstr ""
@@ -3582,8 +3660,8 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Nur die ausgewählten Protokolle für den Git-Zugriff zulassen."
-msgid "Allow owners to manage default branch protection per group"
-msgstr "Erlaube den Inhaber(inne)n den Standard-Branch-Schutz pro Gruppe zu verwalten"
+msgid "Allow owners to manage default branch protection per group."
+msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
msgstr ""
@@ -3688,7 +3766,7 @@ msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
msgid "Amazon Web Services Logo"
-msgstr ""
+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 ""
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "Bei der Vorschau des Blobs ist ein Fehler aufgetreten"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr "Beim Parsen der letzten Suchen ist ein Fehler aufgetreten"
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "Beim Entfernen des Epics ist ein Fehler aufgetreten."
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "Beim Überprüfen der Projektumgebung ist ein unerwarteter Fehler aufgetreten."
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr "Jeder Namensraum"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "App ID"
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "Möchtest du wirklich dieses Projekt archivieren?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "Möchtest du wirklich dieses Projekt aus dem Archiv zurückholen?"
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "%{assignee_users_sentence} zugewiesen."
@@ -4945,10 +5035,10 @@ msgid "Assigned projects"
msgstr ""
msgid "Assigned to %{assigneeName}"
-msgstr ""
+msgstr "Zugewiesen an %{assigneeName}"
msgid "Assigned to %{assignee_name}"
-msgstr ""
+msgstr "Zugewiesen an %{assignee_name}"
msgid "Assigned to me"
msgstr "Mir zugewiesen"
@@ -5017,6 +5107,9 @@ msgstr "Die Datei konnte nicht angehängt werden."
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr "Audit-Ereignisse"
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "Aug"
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "Deine Badges"
-msgid "Balsamiq file could not be loaded."
-msgstr "Balsamiq-Datei konnte nicht geladen werden."
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr "Im Abschnitt Abrechnung von %{parent_billing_page_link} kannst du den Ta
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Branch existiert bereits"
@@ -6133,9 +6310,6 @@ msgstr "Broadcast-Nachricht wurde erfolgreich aktualisiert."
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Verzeichnis durchsuchen"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr "Dies wird einen neuen Commit erzeugen, um die vorhandenen Änderungen rÃ
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr "Alle Umgebungen"
msgid "CiVariable|Create wildcard"
msgstr "Wildcard erstellen"
-msgid "CiVariable|Masked"
-msgstr "Maskiert"
-
msgid "CiVariable|New environment"
msgstr "Neue Umgebung"
-msgid "CiVariable|Protected"
-msgstr "Geschützt"
-
msgid "CiVariable|Search environments"
msgstr "Umgebungen durchsuchen"
-msgid "CiVariable|Toggle masked"
-msgstr "Maskierung umschalten"
-
-msgid "CiVariable|Toggle protected"
-msgstr "Schutzstatus umschalten"
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
-msgstr ""
-
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Kubernetes-Cluster hinzufügen"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "Wenn du deiner Gruppe ein Kubernetes-Cluster hinzufügst, wird das Cluster automatisch von allen deinen Projekten geteilt. Benutze Review-Anwendungen, stelle deine Anwendungen bereit und führe einfach alle deine Pipelines für alle Projekte auf dem selben Cluster aus."
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr "Konnte Subnetzwerke nicht laden"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Kubernetes-Cluster erstellen"
-msgid "ClusterIntegration|Create cluster on"
-msgstr "Cluster erstellen auf"
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr "Aktiviere oder deaktiviere die Verbindung zwischen GitLab und deinem Kub
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Aktiviere diese Einstellung, wenn rollenbasierte Zugriffskontrolle (RBAC) verwendet werden soll."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Gib die Details für deinen Kubernetes-Cluster ein"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "Umgebungsumfang"
@@ -8220,9 +8430,6 @@ msgstr "Cluster gruppieren"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
-msgstr "Wenn du mehrere Cluster einrichtest und Auto-DevOps verwendest, lies zuerst %{help_link_start}dies%{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -8268,8 +8475,8 @@ msgstr "Erfahre mehr über %{help_link_start_machine_type}Maschinentypen%{help_l
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "Erfahre mehr über %{help_link_start}Zonen%{help_link_end}."
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "Lerne mehr über Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "Lerne mehr über die Kubernetes Gruppen-Cluster"
@@ -8361,9 +8568,6 @@ msgstr "Anzahl der Knoten"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Bitte stelle sicher, dass dein Google-Konto die folgenden Voraussetzungen erfüllt:"
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,8 +8841,8 @@ msgstr "Wir konnten nicht verifizieren, ob für eines deiner Projekte auf GCP di
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 "Mit einem Kubernetes-Cluster innerhalb dieses Projekts kannst du auf einfache Weise Review-Anwendungen verwenden, deine Anwendungen bereitstellen, Pipelines ausführen und vieles mehr."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr ""
@@ -8873,9 +9083,6 @@ msgstr "Commit"
msgid "CommitMessage|Add %{file_name}"
msgstr "%{file_name} hinzufügen"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "erstellt"
@@ -8952,7 +9159,7 @@ msgid "Compare submodule commit revisions"
msgstr ""
msgid "Compare with previous version"
-msgstr ""
+msgstr "Mit vorheriger Version vergleichen"
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} und %{target_branch} sind gleich."
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr "Abgeschlossen"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr "Vorhandene Installation konfigurieren"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr "Bestätigen"
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr "Verbinden"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr "Alle Repositorys verbinden"
@@ -9399,8 +9636,8 @@ msgstr[1] ""
msgid "ContainerRegistry|%{count} Tag"
msgid_plural "ContainerRegistry|%{count} Tags"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{count} Tag"
+msgstr[1] "%{count} Tags"
msgid "ContainerRegistry|%{strongStart}Disabled%{strongEnd} - Tags will not be automatically deleted."
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr "Konnte Admins nicht als Mitglieder hinzufügen"
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr "Neue Domain erstellen"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr "Neues Label erstellen"
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10698,13 +10929,13 @@ msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
msgid "CurrentUser|Edit profile"
-msgstr ""
+msgstr "Profil bearbeiten"
msgid "CurrentUser|One of your groups is running out"
msgstr ""
msgid "CurrentUser|Preferences"
-msgstr ""
+msgstr "Einstellungen"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr "Diagrammfilter anzeigen"
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr "Daten werden noch berechnet..."
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr "Standard-Branch"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr "Standardwert für den ersten Wochentag"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Standardwert für den ersten Wochentag im Kalender und in der Datumsauswahl."
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr "Domäne"
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr "Negativ bewertet"
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr "Fälligkeitsdatum"
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "Während dieses Vorgangs wirst du nach URLs von GitLab gefragt. Verwende die unten angezeigten URLs."
@@ -13220,9 +13547,6 @@ msgstr "Gruppe bearbeiten: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "Identität für %{user_name} bearbeiten"
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ 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|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr "Erfahre mehr über das Stoppen von Umgebungen"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Neue Umgebung"
@@ -14053,8 +14380,11 @@ msgstr ""
msgid "Environments|Updated"
msgstr "Aktualisiert"
-msgid "Environments|You don't have any environments right now"
-msgstr "Du hast momentan keine Umgebungen"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr ""
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr "Erkunde Gruppen"
msgid "Explore groups"
msgstr "Erkunde Gruppen"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Projekte entdecken"
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15024,7 +15378,7 @@ msgid "Failed to create resources"
msgstr ""
msgid "Failed to create wiki"
-msgstr ""
+msgstr "Wiki konnte nicht erstellt werden"
msgid "Failed to deploy to"
msgstr "Bereitstellung fehlgeschlagen für"
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15102,7 +15459,7 @@ msgid "Failed to load projects"
msgstr ""
msgid "Failed to load related branches"
-msgstr ""
+msgstr "Zugehörige Branches konnten nicht geladen werden"
msgid "Failed to load stacktrace."
msgstr ""
@@ -15201,7 +15558,7 @@ msgid "Failed to update framework"
msgstr ""
msgid "Failed to update issue status"
-msgstr ""
+msgstr "Konnte Ticket-Status nicht aktualisieren."
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr "Feb"
msgid "February"
msgstr "Februar"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr "Filter..."
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Von der Ticketbeschreibung bis zur Bereitstellung"
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "GitLab-Nutzer(in)"
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17180,7 +17573,7 @@ msgid "Group navigation"
msgstr ""
msgid "Group overview content"
-msgstr ""
+msgstr "Inhalt der Gruppenübersicht"
msgid "Group owners can register group runners in the %{link}"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr "Nutzdaten ausblenden"
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr "Ich akzeptiere die %{terms_link}"
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "IP-Adresse"
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr "Importiere ein exportiertes GitLab-Projekt"
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Importiere mehrere Repositorys, indem du eine Manifestdatei hochlädst."
@@ -18525,9 +19015,6 @@ msgstr "Projekt importieren"
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Importiere Projekte von Bitbucket"
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr "Inline"
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr "Einladen"
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr "Durchsuchen"
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr "Komplette Rohdaten"
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "Herunterladen"
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr "Behalten"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "Zum Seitenende scrollen"
@@ -21094,6 +21674,9 @@ msgstr "Scrolle nach oben"
msgid "Job|Show complete raw"
msgstr "Zeige komplette Rohdaten"
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr "Letzte Aktualisierung"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr "Verfügbare Repositories auflisten"
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr "Gruppenlabels verwalten"
msgid "Manage labels"
msgstr "Label verwalten"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22315,7 +22933,7 @@ msgid "Manage projects."
msgstr ""
msgid "Manage two-factor authentication"
-msgstr ""
+msgstr "Zwei-Faktor-Authentifizierung verwalten"
msgid "Manage your license"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr "Maximale Job-Zeitüberschreitung"
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr "Merge-Requests"
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 the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Meilenstein löschen"
@@ -23687,6 +24311,9 @@ msgstr "Meilenstein %{milestoneTitle} wurde nicht gefunden"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr "Monate"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr "Abmelden und mit einem anderen Konto anmelden"
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr "Niemals"
msgid "New"
msgstr "Neu"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr "Neues Verzeichnis"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr "Neues Release"
@@ -24486,9 +25158,6 @@ msgstr "Neuer Registrierungstoken für Runner wurde generiert!"
msgid "New schedule"
msgstr "Neuer Zeitplan"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Neuer Codeausschnitt"
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr "Keine Lizenz. Alle Rechte vorbehalten"
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr "Es wurden Nachrichten protokolliert"
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr "Nur Verlauf anzeigen"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr "Fahren Sie nur fort, wenn sie %{idp_url} die Kontrolle über Ihren GitLa
msgid "Only project members can comment."
msgstr "Nur Projektmitglieder können kommentieren."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr "Offen"
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "Seitenleiste öffnen"
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "Wird in einem neuen Fenster geöffnet"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr "Besitzer(in)"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipelines"
@@ -26873,10 +27551,13 @@ msgstr "Pipelinediagramme"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr "Der Projekt-Cache wurde erfolgreich zurückgesetzt."
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "Beim Löschen des Runner-Caches ist etwas schief gelaufen."
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "Dieses Projekt ist derzeit nicht zum Ausführen von Pipelines eingerichtet."
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr "Commit"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr "Dauer"
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr "Pods im Einsatz"
-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."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27621,10 +28296,10 @@ msgid "Preferences|Instead of all the files changed, show only one file at a tim
msgstr ""
msgid "Preferences|Integrations"
-msgstr ""
+msgstr "Integrationen"
msgid "Preferences|Layout width"
-msgstr ""
+msgstr "Layoutbreite"
msgid "Preferences|Must be a number between %{min} and %{max}"
msgstr ""
@@ -27666,7 +28341,7 @@ msgid "Preferences|This setting allows you to customize the behavior of the syst
msgstr ""
msgid "Preferences|Time preferences"
-msgstr ""
+msgstr "Zeiteinstellungen"
msgid "Preferences|Use relative times"
msgstr ""
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28068,7 +28749,7 @@ msgid "Profiles|No file chosen."
msgstr ""
msgid "Profiles|Notification email"
-msgstr ""
+msgstr "Benachrichtigungs-E-Mail"
msgid "Profiles|Organization"
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "Zwei-Faktor-Authentifizierung"
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr "Dein Status"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "z. B. Mein MacBook-Schlüssel"
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr "Push-Ereignisse"
msgid "Push project from command line"
msgstr "Pushe das Projekt von der Kommandozeile aus"
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr "Zugehörige Merge-Requests"
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr "Bezieht sich auf"
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr "Fehlschlag"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr "Testzusammenfassung"
msgid "Reports|Test summary failed loading results"
msgstr "Das Laden der Ergebnisse durch die Testzusammenfassung ist fehlgeschlagen"
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "Ergebnisse der Testzusammenfassung werden analysiert"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "Roadmap"
@@ -31473,12 +32193,12 @@ msgstr "Unmarkierte Jobs ausführen"
msgid "Runner API"
msgstr ""
+msgid "Runner cannot be deleted, please contact your administrator."
+msgstr ""
+
msgid "Runner tokens"
msgstr "Runner-Token"
-msgid "Runner was not deleted because it is assigned to multiple projects."
-msgstr ""
-
msgid "Runner was not updated."
msgstr "Runner wurde nicht aktualisiert."
@@ -31497,6 +32217,22 @@ msgstr "Runner derzeit online: %{active_runners_count}"
msgid "Runners page."
msgstr "Runners-Seite."
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "Laufend"
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr "Projekte suchen"
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr "Wähle eine Gruppe aus, die du einladen möchtest"
-
msgid "Select a label"
msgstr "Ein Label auswählen"
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr "Zielbranch auswählen"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "Statusemoji hinzufügen"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr "Leerzeichenänderungen anzeigen"
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr "Beim Umschalten des Buttons ist etwas schief gelaufen"
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr "Startdatum"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr "Systeminformationen"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr "Systemstandard (%{default})"
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr "Zielbranch"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "Vorlage"
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr "Der Branch oder Tag existiert nicht"
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "Das Character-Highlighter hilft dir, die Betreffzeile auf %{titleLength} Zeichen zu beschränken und den Textkörper auf %{bodyLength} zu kürzen, damit sie in Git lesbar sind."
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "Die Verbindung wird nach %{timeout} beendet. Verwende eine Clone/Push-Kombination für Repositorys, die länger brauchen."
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr "Dieser Job hängt von Upstream-Jobs ab, die erfolgreich ausgeführt werden müssen, damit dieser Job getriggert wird"
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr "Dieser Job hat keine Ablaufverfolgung."
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Dieser Job wurde abgebrochen"
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr "Seitenleiste ein-/ausblenden"
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr "Wiederholen"
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "Teste für 30 Tage alles was GitLab zu bieten hat."
@@ -38870,10 +39843,10 @@ msgid "Two-Factor Authentication"
msgstr "Zwei-Faktor-Authentifizierung"
msgid "Two-Factor Authentication code"
-msgstr ""
+msgstr "Zwei-Faktor-Authentifizierungscode"
msgid "Two-factor Authentication"
-msgstr ""
+msgstr "Zwei-Faktor-Authentifizierung"
msgid "Two-factor Authentication Recovery codes"
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ 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 "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "Neue Datei hochladen"
@@ -39385,9 +40364,6 @@ msgstr "Datei hochladen"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr "Zum Upload klicken"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -39848,7 +40833,7 @@ msgid "User settings"
msgstr ""
msgid "User was successfully created."
-msgstr ""
+msgstr "Benutzer:in erfolgreich erstellt."
msgid "User was successfully removed from group and any subgroups and projects."
msgstr ""
@@ -39860,7 +40845,7 @@ msgid "User was successfully removed from project."
msgstr "Benutzer(in) wurde erfolgreich von dem Projekt entfernt."
msgid "User was successfully updated."
-msgstr ""
+msgstr "Benutzer:in erfolgreich aktualisiert."
msgid "User-based escalation rules must have a user with access to the project"
msgstr ""
@@ -40130,7 +41115,7 @@ msgid "Users to exclude from the rate limit"
msgstr ""
msgid "Users were successfully added."
-msgstr ""
+msgstr "Benutzer:innen erfolgreich hinzugefügt."
msgid "Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr "Zeige ersetzte Datei @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr "Klasse"
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr "Wenn ein Runner gesperrt ist, kann er keinem anderen Projekt zugewiesen
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "Schreibe deinen Inhalt oder ziehe hier Dateien hinein…"
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr "Du kannst Dateien nur bearbeiten, wenn du dich auf einem Branch befindest"
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr "Du kannst das Projekt nur in deine Namensräume übertragen."
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "Lizenzen verwalten"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "Keine Änderungen an der Codequalität"
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "aktiviert"
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "Merge-Request"
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "Merge fehlgeschlagen."
-msgid "mrWidget|Merge locally"
-msgstr "Lokal mergen"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr "Anfrage zum Mergen von"
msgid "mrWidget|Resolve conflicts"
msgstr "Konflikte auflösen"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "Zurücksetzen"
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr "nicht verfügbar"
-
msgid "need attention"
msgstr "erfordern Beachtung"
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr "oder"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr "Projektbild"
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index 1e73df936fd..77b9ffed530 100644
--- a/locale/el_GR/gitlab.po
+++ b/locale/el_GR/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: el\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:13\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index 9abb7eb3f64..c6490d66a85 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: eo\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr "Pri la aÅ­tomata disponigado"
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Foliumi dosierujon"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr "Enmeti"
msgid "CommitMessage|Add %{file_name}"
msgstr "Aldoni „%{file_name}“"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "De la kreado de la problemo Äis la disponigado en la publika versio"
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr "Nova dosierujo"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr "Nova plano"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Nova kodaĵo"
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr "Posedanto"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Ĉenstabloj"
@@ -26873,10 +27551,13 @@ msgstr "Ĉenstablaj diagramoj"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr "Elektu celan branĉon"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "AlÅuti novan dosieron"
@@ -39385,9 +40364,6 @@ msgstr "AlÅuti dosieron"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr "alklaku por alÅuti"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index b218f571799..2a1ec0a0901 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: es-ES\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:10\n"
msgid " %{start} to %{end}"
msgstr " %{start} hasta %{end}"
@@ -28,15 +28,9 @@ msgstr " Capturado %{time}"
msgid " Please sign in."
msgstr " Por favor, inicie sesión."
-msgid " Target Path"
-msgstr " Ruta de destino"
-
msgid " Try to %{action} this file again."
msgstr " Intente %{action} este archivo de nuevo."
-msgid " Type"
-msgstr " Tipo"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr "Necesita hacer esto antes de %{grace_period_deadline}."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "%d comentarios más"
msgstr[1] "%d comentarios más"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d incidencia abierta"
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "Se eliminará el proyecto personal %d y no podrá ser restaurado."
msgstr[1] "Se eliminarán los proyectos personales %d y no podrán ser restaurados."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,10 +375,10 @@ msgid_plural "%d projects selected"
msgstr[0] "%d proyecto seleccionado"
msgstr[1] "%d proyectos seleccionados"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d solicitud con advertencias"
-msgstr[1] "%d solicitudes con advertencias"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -468,9 +472,6 @@ msgstr "%{actionText} y reabrir %{noteable}"
msgid "%{address} is an invalid IP address range"
msgstr "%{address} no es en un rango de direcciones IP válido"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "%{anchorOpen}Obtenga más información%{anchorClose} sobre cómo puede personalizar/deshabilitar el registro en su instancia."
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link} ha clonado %{original_issue} a %{new_issue}."
@@ -702,6 +703,9 @@ msgstr "Las %{integrations_link_start}integraciones%{link_end} le permiten el us
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "¡Va a eliminar %{issuableType}! ¿Está seguro de que desea realizar esta acción?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "%{issueType} acciones"
@@ -780,8 +784,8 @@ msgstr "%{level_name} no está permitido debido a que el fork del proyecto orige
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr "%{linkStart}Más información.%{linkEnd}"
-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}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr "%{link_start}Cargue un archivo de licencia%{link_end} o introduzca la clave de licencia que recibió de GitLab Inc."
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, ¡confirme su dirección de correo electrónico ahora!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} día"
@@ -992,10 +996,18 @@ msgstr "%{spanStart}en%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} hasta %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,8 +1300,8 @@ msgstr "+%{more_reviewers_count} revisores más"
msgid "+%{tags} more"
msgstr "+%{tags} más"
-msgid ", and "
-msgstr ", y "
+msgid ", "
+msgstr ""
msgid ", or "
msgstr ", o "
@@ -1602,9 +1614,18 @@ msgstr "Se publicó una nueva versión %{tag} para %{name}. Visite la página de
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "Se publicó una nueva versión %{tag} para %{name}. Visite la página de versiones para obtener más información al respecto:"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "Se ha creado un nuevo token de impersonación."
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "Una tarea épica no confidencial no se puede asignar a una tarea épica padre confidencial"
@@ -1797,6 +1818,9 @@ msgstr "Acerca del auto despliegue"
msgid "About this feature"
msgstr "Acerca de esta característica"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Reportes de abuso"
@@ -1827,9 +1851,6 @@ msgstr "Acceso denegado para su cuenta LDAP."
msgid "Access denied: %{error}"
msgstr "Acceso denegado: %{error}"
-msgid "Access expiration date"
-msgstr "Fecha de expiración del acceso"
-
msgid "Access expires"
msgstr "El acceso expira"
@@ -1983,6 +2004,9 @@ msgstr "Cancelar suscripción"
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr "Puede %{unsubscribe_link} en cualquier momento."
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr "Acción"
@@ -2040,6 +2064,9 @@ msgstr "Añadir clúster de Kubernetes"
msgid "Add LICENSE"
msgstr "Añadir LICENSE"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr "Añadir un nuevo sitio"
@@ -2163,6 +2190,9 @@ msgstr "Añadir comentario ahora"
msgid "Add comment to design"
msgstr "Añadir comentario al diseño"
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr "Añadir una incidencia a una tarea épica."
msgid "Adds email participant(s)."
msgstr "Añadir las direcciones de correo electrónico de los participantes"
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr "Ajusta la frecuencia con la que la interfaz de usuario de GitLab busca actualizaciones."
@@ -2472,6 +2505,9 @@ msgstr "Invitado"
msgid "AdminArea|Included Free in license"
msgstr "Incluido gratis en la licencia"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "Grupos más recientes"
@@ -2484,6 +2520,9 @@ msgstr "Usuarios más recientes"
msgid "AdminArea|Maintainer"
msgstr "Mantenedor"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr "Acceso mínimo"
@@ -2496,6 +2535,9 @@ msgstr "Nuevo proyecto"
msgid "AdminArea|New user"
msgstr "Nuevo usuario"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "Propietario"
@@ -2580,12 +2622,18 @@ msgstr "¿Eliminar el proyecto %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Dominio Auto DevOps"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Configurar Let's Encrypt"
@@ -2625,6 +2673,27 @@ msgstr "Correo electrónico de Let's Encrypt"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr "Configuración del pipeline requerida"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr "Seleccionar una plantilla de CI/CD"
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "Usuarios activos"
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Permitir que sólo los protocolos seleccionados tengan acceso a Git."
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr "La autenticación de Amazon no está %{link_start}correctamente configur
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "Ha ocurrido un error visualizando el blob"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr "Se ha producido un error al actualizar el título"
@@ -3993,6 +4077,9 @@ msgstr "Se ha producido un error al analizar búsquedas recientes"
msgid "An error occurred while parsing the file."
msgstr "Se ha producido un error al analizar el archivo."
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "Se ha producido un error al eliminar las tareas épicas."
@@ -4106,6 +4193,9 @@ msgstr "Ya existe una incidencia"
msgid "An unauthenticated user"
msgstr "Un usuario no autenticado"
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "Se ha producido un error inesperado al comprobar el entorno del proyecto."
@@ -4196,6 +4286,9 @@ msgstr "Cualquier hito"
msgid "Any namespace"
msgstr "Cualquier espacio de nombres"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "App ID"
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "¿Está seguro de que desea archivar el proyecto?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "¿Está seguro de que desea desarchivar este proyecto?"
@@ -4923,12 +5019,6 @@ msgstr "Asignar al usuario que comenta"
msgid "Assign to me"
msgstr "Asignar a mí"
-msgid "Assign yourself to these issues"
-msgstr "Asignarse estas incidencias"
-
-msgid "Assign yourself to this issue"
-msgstr "Asignarse esta incidencia"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "Asignado a %{assignee_users_sentence}."
@@ -5017,6 +5107,9 @@ msgstr "Se ha producido un error al adjuntar el archivo."
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr "Eventos de auditoría"
@@ -5047,6 +5140,9 @@ msgstr "Grupo de Eventos"
msgid "AuditLogs|IP Address"
msgstr "Dirección IP"
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr "Eventos de miembros"
@@ -5068,6 +5164,54 @@ msgstr "Este mes"
msgid "AuditLogs|User Events"
msgstr "Eventos de usuario"
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "Ago"
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "Sus insignias"
-msgid "Balsamiq file could not be loaded."
-msgstr "El archivo Balsamiq no se pudo cargar."
-
msgid "BambooService|Atlassian Bamboo"
msgstr "Atlassian Bamboo"
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr "Basado en"
@@ -5542,6 +5686,12 @@ msgstr "Para administrar el plan de este grupo, por favor visite la sección de
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr "Buscar proyectos"
msgid "BoardNewIssue|Select a project"
msgstr "Seleccionar un proyecto"
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "Se ha producido un error al obtener los hitos, por favor inténtelo de nuevo."
@@ -5781,6 +5934,9 @@ msgstr "Cualquier hito"
msgid "BoardScope|Any assignee"
msgstr "Cualquier asignado"
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr "Cualquier etiqueta"
@@ -5790,24 +5946,39 @@ msgstr "Asignado"
msgid "BoardScope|Choose labels"
msgstr "Elija las etiquetas"
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr "Editar"
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr "Etiquetas"
msgid "BoardScope|Milestone"
msgstr "Hito"
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr "No hay hito"
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr "Buscar hitos"
msgid "BoardScope|Select assignee"
msgstr "Seleccionar asignado"
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr "Seleccione las etiquetas"
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "La rama ya existe"
@@ -6133,9 +6310,6 @@ msgstr "El mensaje de difusión se actualizó correctamente."
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Examinar directorio"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr "%{feature} (requiere v%{version})"
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Grupos existentes"
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr "No hay ningún padre"
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "Para un nuevo grupo"
@@ -6250,6 +6439,9 @@ msgstr "No tiene grupos para importar"
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr "Esta acción creará un nuevo commit para deshacer los cambios existente
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr "Asignado(s) cambiado(s)."
@@ -6858,6 +7053,12 @@ msgstr "No se han guardado los cambios en el título"
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr "Minutos de CI"
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr "Subtotal"
msgid "Checkout|Tax"
msgstr "Impuestos"
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr "Total"
@@ -7378,24 +7585,12 @@ msgstr "Todos los entornos"
msgid "CiVariable|Create wildcard"
msgstr "Crear comodín"
-msgid "CiVariable|Masked"
-msgstr "Enmascarado"
-
msgid "CiVariable|New environment"
msgstr "Nuevo entorno"
-msgid "CiVariable|Protected"
-msgstr "Protegido"
-
msgid "CiVariable|Search environments"
msgstr "Buscar entornos"
-msgid "CiVariable|Toggle masked"
-msgstr "Alternar enmascaramiento"
-
-msgid "CiVariable|Toggle protected"
-msgstr "Alternar protegido"
-
msgid "Classification Label (optional)"
msgstr "Etiqueta de clasificación (opcional)"
@@ -7453,6 +7648,15 @@ msgstr "Borrar fecha de inicio"
msgid "Clear templates search input"
msgstr "Borrar entrada de búsqueda de plantillas"
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr "Limpiar peso"
@@ -7612,6 +7816,9 @@ msgstr "Nivel de clúster"
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,8 +7843,8 @@ msgstr "%{tokenName} revocado"
msgid "ClusterAgents|Access tokens"
msgstr "Tokens de acceso"
-msgid "ClusterAgents|Actions"
-msgstr "Acciones"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
+msgstr ""
msgid "ClusterAgents|Advanced installation methods"
msgstr "Métodos de instalación avanzados"
@@ -7651,6 +7858,9 @@ msgstr "Agente %{strongStart}conectado%{strongEnd}"
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr "Agente %{strongStart}desconectado%{strongEnd}"
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr "Es posible que el agente no esté conectado a GitLab"
@@ -7690,35 +7900,56 @@ msgstr "Certificado"
msgid "ClusterAgents|Configuration"
msgstr "Configuración"
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr "Conectar a un clúster existente"
+msgid "ClusterAgents|Connect a cluster"
+msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
-msgstr "Conectar con un certificado"
+msgid "ClusterAgents|Connect a cluster (agent)"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
+msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
+msgid "ClusterAgents|Connect existing cluster"
+msgstr "Conectar a un clúster existente"
+
msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr "Conectar con el agente de GitLab"
-msgid "ClusterAgents|Connect your cluster through an agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr "Conectado"
msgid "ClusterAgents|Connection status"
msgstr "Estado de la conexión"
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr "Copiar token"
-msgid "ClusterAgents|Create a new cluster"
-msgstr "Crear un nuevo clúster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
+msgstr ""
msgid "ClusterAgents|Created by"
msgstr "Creado por"
@@ -7729,6 +7960,9 @@ msgstr "Creado por %{name} %{time}"
msgid "ClusterAgents|Date created"
msgstr "Fecha de creación"
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr "Eliminar"
@@ -7744,10 +7978,13 @@ msgstr "Descripción"
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr "Se ha producido un error al registrar un agente"
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,11 +7996,8 @@ msgstr "Agente de GitLab para Kubernetes"
msgid "ClusterAgents|Give feedback"
msgstr "Dar su opinión"
-msgid "ClusterAgents|Go to the repository files"
-msgstr "Ir a los archivos del repositorio"
-
-msgid "ClusterAgents|How to register an agent?"
-msgstr "¿Cómo registrar un agente?"
+msgid "ClusterAgents|How do I register an agent?"
+msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
@@ -7777,9 +8011,6 @@ msgstr "Última conexión %{timeAgo}"
msgid "ClusterAgents|Last contact"
msgstr "Último contacto"
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr "Aprenda cómo crear un token de acceso del agente"
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr "Aprende a solucionar problemas"
@@ -7813,14 +8044,8 @@ msgstr "Método de instalación recomendado"
msgid "ClusterAgents|Register"
msgstr "Registrar"
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr "Registre un agente para generar un token que se utilizará para instalar el agente en su clúster en el siguiente paso."
-
-msgid "ClusterAgents|Registering Agent"
-msgstr "Registrando agente"
-
-msgid "ClusterAgents|Registration token"
-msgstr "Token de registro"
+msgid "ClusterAgents|Registering agent"
+msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
@@ -7840,11 +8065,8 @@ msgstr "Seguridad"
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr "Seleccione un agente"
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
-msgstr "Seleccione un agente para registrar en GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
+msgstr ""
msgid "ClusterAgents|Tell us what you think"
msgstr "Diganos lo que piensa"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
-msgstr ""
-
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr "Este agente no tiene tokens"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr "Para eliminar el agente, escriba %{name} para confirmar:"
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr "Token creado por %{userName}"
@@ -7899,6 +8115,9 @@ msgstr "Nos encantaría saber más sobre su experiencia con GitLab Agent."
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr "La URL de la API debe ser una url http/https válida."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Añadir cluster de Kubernetes"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Añadir integración con clúster de Kubernetes"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "ClusterIntegration|Añadir un cluster Kubernetes a su grupo permitirá compartir automáticamente el cluster en todos sus proyectos. Utilice las aplicaciones de revisión, implemente sus aplicaciones y ejecute fácilmente los pipelines para todos los proyectos que utilizan el mismo clúster."
@@ -8052,12 +8268,9 @@ msgstr "Se requiere el nombre del clúster."
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect existing cluster"
-msgstr "Conectar a un clúster existente"
-
msgid "ClusterIntegration|Connect with a certificate"
msgstr "Conectar con un certificado"
@@ -8103,17 +8316,8 @@ msgstr "Se ha producido un error al cargar las subredes"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Crear cluster de Kubernetes"
-msgid "ClusterIntegration|Create cluster on"
-msgstr "Crear clúster en"
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr "Crear un nuevo cluster"
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr "Crear un nuevo cluster en EKS"
-
-msgid "ClusterIntegration|Create new cluster on GKE"
-msgstr "Crear un nuevo cluster en GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Creando el cluster de Kubernetes"
@@ -8148,6 +8352,9 @@ msgstr "Habilita o inhabilita la conexión de GitLab con su clúster Kubernetes.
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Habilite esta configuración si utiliza el control de acceso basado en roles (RBAC)."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr "Introduzca el nuevo token de servicio"
@@ -8157,6 +8364,9 @@ msgstr "Introduzca los detalles de su clúster EKS Kubernetes de Amazon"
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Introduzca los detalles de su clúster de Kubernetes"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "Alcance del entorno"
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr "Error 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 "Si está configurando varios clústeres y utiliza Auto DevOps, por favor lea primero, %{help_link_start} y %{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr "Si no desea eliminar todos los recursos de GitLab asociados, simplemente puede eliminar la integración con el cluster."
@@ -8268,8 +8475,8 @@ msgstr "Aprenda más sobre los tipos de %{help_link_start_machine_type}instancia
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "Conozca más sobre las %{help_link_start}zonas%{help_link_end}."
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "Más información sobre Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "Más información sobre los grupos de clústeres de Kubernetes"
@@ -8361,9 +8568,6 @@ msgstr "Número de nodos"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr "El número de nodos debe ser un valor numérico."
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Asegúrese de que su cuenta de Google cumpla con los siguientes requisitos:"
@@ -8613,12 +8817,18 @@ msgstr "No se puede conectar"
msgid "ClusterIntegration|Unknown Error"
msgstr "Error desconocido"
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "Utiliza los complementos Cloud Run, Istio y balanceo de carga HTTP para este clúster."
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr "VPC"
@@ -8631,8 +8841,8 @@ msgstr "No hemos podido verificar que uno de sus proyectos en GCP tenga habilita
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 "Con un clúster de Kubernetes asociado a este proyecto, puede utilizar las aplicaciones de revisión, implementar sus aplicaciones, ejecutar sus pipelines y mucho más, de una manera sencilla."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr "Está a punto de eliminar la integración del cluster y todos los recursos creados por GitLab, asociados con este cluster."
@@ -8873,9 +9083,6 @@ msgstr "Cambio"
msgid "CommitMessage|Add %{file_name}"
msgstr "CommitMessage|Añadir %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "autorizado"
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr "Completado"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr "Completado"
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr "Configuración no encontrada"
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr "Formato no válido"
@@ -9071,7 +9281,7 @@ msgstr "Nombre"
msgid "ComplianceFrameworks|Name is required"
msgstr "El nombre es obligatorio"
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr "Aprobado por el autor"
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr "Configurar la instalación existente"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr "Confirmar"
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr "Confirmar nueva contraseña"
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr "Conectar"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr "Conectar todos los repositorios"
@@ -9441,9 +9678,6 @@ msgstr "El proceso de limpieza está en curso"
msgid "ContainerRegistry|Cleanup pending"
msgstr "Limpieza pendiente"
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr "Error de conexión de Docker"
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr "Etiqueta marcada correctamente para su eliminación."
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr "Etiquetas marcadas correctamente para su eliminación."
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr "¿Está seguro de que desea eliminar el corpus?"
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr "Acciones"
@@ -9980,6 +10223,12 @@ msgstr "Último uso"
msgid "CorpusManagement|Latest Job:"
msgstr "Último trabajo:"
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr "Nueva subida"
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr "Tamaño total: %{totalSize}"
-msgid "CorpusMnagement|New corpus"
-msgstr "Nuevo corpus"
-
msgid "Could not add admins as members"
msgstr "No se puede añadir administradores como miembros"
@@ -10115,7 +10361,7 @@ msgstr "Se ha producido un error al actualizar la página wiki"
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr "Crear un nuevo dominio"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr "Cree primero una cuenta de GitLab y luego conéctela a su cuenta %{label}."
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr "Crear un equipo de Mattermost para este grupo"
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr "Crear nuevo"
msgid "Create new %{name} by email"
msgstr "Crear nuevo %{name} por correo electrónico"
-msgid "Create new CI/CD pipeline"
-msgstr "Crear nuevo pipeline de CI/CD"
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr "Crear nueva etiqueta"
msgid "Create new project"
msgstr "Crear nuevo proyecto"
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr "Cree o importe su primer proyecto"
@@ -10325,9 +10577,6 @@ msgstr "Crear tema"
msgid "Create user"
msgstr "Crear usuario"
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr "Crear comodín: %{searchTerm}"
@@ -10580,44 +10829,26 @@ msgstr "Tarjeta de crédito:"
msgid "Critical vulnerabilities present"
msgstr "Vulnerabilidades críticas presentes"
-msgid "Crm|Contact has been added"
-msgstr "Se ha añadido el contacto"
-
-msgid "Crm|Contact has been updated"
-msgstr "El contacto se ha actualizado"
-
-msgid "Crm|Create new contact"
-msgstr "Crear nuevo contacto"
-
-msgid "Crm|Create organization"
-msgstr "Crear organización"
+msgid "Crm|Contact has been added."
+msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
-msgstr "Descripción (opcional)"
+msgid "Crm|Default rate"
+msgstr ""
msgid "Crm|Edit contact"
msgstr "Editar contacto"
-msgid "Crm|Email"
-msgstr "Correo electrónico"
-
-msgid "Crm|First name"
-msgstr "Nombre"
-
-msgid "Crm|Last name"
-msgstr "Apellido"
-
-msgid "Crm|New Organization"
-msgstr "Nueva Organización"
+msgid "Crm|Edit organization"
+msgstr ""
msgid "Crm|New contact"
msgstr "Nuevo contacto"
@@ -10631,11 +10862,11 @@ msgstr "No se han encontrado contactos"
msgid "Crm|No organizations found"
msgstr "No se encontraron organizaciones"
-msgid "Crm|Organization has been added"
-msgstr "Se ha añadido la organización"
+msgid "Crm|Organization has been added."
+msgstr ""
-msgid "Crm|Phone number (optional)"
-msgstr "Número de teléfono (opcional)"
+msgid "Crm|Organization has been updated."
+msgstr ""
msgid "Cron Timezone"
msgstr "Zona horaria del Cron"
@@ -10745,21 +10976,18 @@ msgstr "Rango personalizado"
msgid "Custom range (UTC)"
msgstr "Rango personalizado (UTC)"
-msgid "Customer Relations Contacts"
+msgid "Customer experience improvement and third-party offers"
msgstr ""
-msgid "Customer Relations Organizations"
+msgid "Customer relations"
msgstr ""
-msgid "Customer experience improvement and third-party offers"
+msgid "Customer relations contacts"
msgstr ""
-msgid "Customer relations"
+msgid "Customer relations organizations"
msgstr ""
-msgid "Customizable by owners."
-msgstr "Personalizable por los propietarios."
-
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
msgstr ""
@@ -10886,15 +11114,33 @@ msgstr "debe estar bajo un grupo"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Fecha"
msgid "CycleAnalytics|Display chart filters"
msgstr "Mostrar filtros de gráficos"
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr "Tipo de trabajo"
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,12 +11220,12 @@ msgstr ""
msgid "DAST Configuration"
msgstr "Configuración DAST"
-msgid "DAST Scans"
-msgstr "Análisis DAST"
-
msgid "DAST profile not found: %{name}"
msgstr ""
+msgid "DAST profiles"
+msgstr ""
+
msgid "DNS"
msgstr "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr "Mensajes de depuración"
@@ -11172,9 +11427,6 @@ msgstr "Ocultar mensajes de depuración"
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr "Administrar perfiles"
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr "Los datos aún se están calculando..."
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr "Tipo de datos"
@@ -11549,9 +11804,6 @@ msgstr "Rama por defecto"
msgid "Default branch and protected branches"
msgstr "Ramas por defecto y ramas protegidas"
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr "Primer día de la semana por defecto"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Primer día de la semana por defecto en calendarios y selectores de fechas."
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr "Protección por defecto de eliminación de proyectos"
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr "Falló"
msgid "Deployment|Latest Deployed"
msgstr "Último despliegue"
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr "En ejecución"
@@ -12926,6 +13205,9 @@ msgstr "Descartado en el pipeline %{pipelineLink}"
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr "Descartado en el pipeline %{pipelineLink} en %{projectLink}"
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr "Dominio"
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr "¿Todavía no tiene una cuenta?"
@@ -13073,6 +13358,9 @@ msgstr "Voto negativo"
msgid "Draft"
msgstr "Borrador"
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr "Fecha de vencimiento"
msgid "Duration"
msgstr "Duración"
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "Durante este proceso, le solicitaremos las URLs de parte de Gitlab.Por favor, utilice las URLs que se muestran a continuación."
@@ -13220,9 +13547,6 @@ msgstr "Editar grupo: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "Editar la identidad para %{user_name}"
-msgid "Edit in Web IDE"
-msgstr "Editar en IDE Web"
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr "Activar mantenimiento automático del repositorio"
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ 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|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr "Instala Elastic Stack en su clúster para habilitar capacidades de consulta avanzadas, como búsqueda de texto completo."
@@ -13969,9 +14299,6 @@ msgstr "Obtenga más información sobre cómo detener los entornos"
msgid "Environments|Logs from %{start} to %{end}."
msgstr "Logs desde %{start} hasta %{end}."
-msgid "Environments|More information"
-msgstr "Más información"
-
msgid "Environments|New environment"
msgstr "Nuevo entorno"
@@ -14053,8 +14380,11 @@ msgstr ""
msgid "Environments|Updated"
msgstr "Actualizado"
-msgid "Environments|You don't have any environments right now"
-msgstr "No tiene ningún entorno ahora mismo"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr "por %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr "No hay proyectos disponibles"
@@ -14434,6 +14770,9 @@ msgstr "Seleccionar proyecto"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr "Errores"
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr "Exactamente uno de los %{attributes} es necesario"
msgid "Example: @sub\\.company\\.com$"
msgstr "Ejemplo: @sub\\.empresa\\.com$"
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr "Extracto de la política:"
@@ -14805,6 +15150,9 @@ msgstr "Explorar Grupos"
msgid "Explore groups"
msgstr "Explorar grupos"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Explorar proyectos"
@@ -14934,9 +15282,15 @@ msgstr "URL del servicio"
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr "Se ha producido un error al obtener ref."
@@ -15469,7 +15826,7 @@ msgstr "Feb"
msgid "February"
msgstr "Febrero"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr "Filtrar resultados..."
msgid "Filter users"
msgstr "Filtrar usuarios"
-msgid "Filter your repositories by name"
-msgstr "Filtrar sus repositorios por nombre"
-
msgid "Filter..."
msgstr "Filtrar..."
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr "De %{providerTitle}"
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Desde la creación de la incidencia hasta el despliegue a producción"
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr "Incidencia de GitLab"
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr "GitLab Pages"
@@ -16537,6 +16885,9 @@ msgstr "Bot de soporte de GitLab"
msgid "GitLab Team Member"
msgstr "Miembro del equipo de GitLab"
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "Usuario de GitLab"
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr "Logotipo de GitLab"
-msgid "GitLab member or Email address"
-msgstr "Miembro de GitLab o dirección de correo electrónico"
-
msgid "GitLab metadata URL"
msgstr "URL de metadatos de GitLab"
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr "Buscar en GitLab"
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr "Se están cargando los resultados de la búsqueda"
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr "en todo GitLab"
@@ -16864,6 +17221,9 @@ msgstr "Ir a la definición"
msgid "Go to environments"
msgstr "Ir a los entornos"
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr "Ir a la épica"
@@ -16990,9 +17350,6 @@ msgstr "Projecto de Google Cloud"
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr "Projecto de Google Cloud"
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ 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."
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr "¡Lo tengo!"
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr "Variables de grupo (heredadas)"
@@ -17611,13 +18001,13 @@ msgstr "Seleccionar grupo principal"
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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr "Crear grupo"
msgid "GroupsNew|Create new group"
msgstr "Crear nuevo grupo"
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr "Importar grupos desde otra instancia de GitLab"
msgid "GroupsNew|My Awesome Group"
msgstr "Mi impresionante grupo"
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr "HTTP básico: Acceso denegado\\nDebe utilizar un token de acceso personal con alcance 'api' para Git a través de HTTP.\\nPuedes generar uno a %{profile_personal_access_tokens_url}"
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr "Ocultar payload"
msgid "Hide shared projects"
msgstr "Ocultar proyectos compartidos"
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr "Aceptar los %{terms_link}"
msgid "I forgot my password"
msgstr "He olvidado mi contraseña"
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr "INFO: Su clave SSH ha caducado. Por favor, genere una nueva clave."
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr "INFO: Su clave SSH caducará pronto. Por favor genere una nueva clave."
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "Direccion IP"
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr "Importar un proyecto exportado desde GitLab"
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr "Importar incidencias"
-msgid "Import members"
-msgstr "Importar miembros"
-
-msgid "Import members from another project"
-msgstr "Importar miembros desde otro proyecto"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Importar varios repositorios subiendo un archivo manifiesto."
@@ -18525,9 +19015,6 @@ msgstr "Importar proyecto"
msgid "Import project from"
msgstr "Importar proyecto desde"
-msgid "Import project members"
-msgstr "Importar miembros del proyecto"
-
msgid "Import projects from Bitbucket"
msgstr "Importar proyectos desde Bitbucket"
@@ -18866,9 +19353,6 @@ msgstr "Conceptos básicos de Git"
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr "InProductMarketing|Invite a su equipo ahora"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr "InProductMarketing|Invite a su equipo hoy mismo a crear mejor código y mejores procesos juntos"
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr "InProductMarketing|Invite a sus compañeros de equipo a GitLab"
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr "InProductMarketing|Invite a tus compañeros de equipo a ayudar"
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr "InProductMarketing|Está todo en las estadísticas"
@@ -19247,6 +19722,9 @@ msgstr "%{minutes} minutos restantes"
msgid "IncidentManagement|Achieved SLA"
msgstr "SLA logrado"
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr "Todo"
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr "Asignados"
@@ -19313,6 +19800,12 @@ msgstr "Publicado"
msgid "IncidentManagement|Published to status page"
msgstr "Publicado en la página de estado"
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr "Gravedad"
@@ -19328,6 +19821,9 @@ msgstr "Se ha producido un error mostrando los incidentes."
msgid "IncidentManagement|Time to SLA"
msgstr "Tiempo hasta el SLA"
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr "Sin asignar"
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr "Se ha producido un problema al cargar su imagen."
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr "Detalles de la alerta"
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr "Métricas"
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "Resumen"
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "Incluir el nombre del autor en el cuerpo del correo electrónico de notificación"
@@ -19547,6 +20052,12 @@ msgstr "Heredado"
msgid "Inherited:"
msgstr "Heredado:"
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr "En línea"
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr "Invitación"
msgid "Invitation declined"
msgstr "Invitación rechazada"
-msgid "Invite"
-msgstr "Invitar"
-
msgid "Invite \"%{email}\" by email"
msgstr "Invitar a \"%{email}\" por correo electrónico"
@@ -20044,12 +20564,6 @@ msgstr "Invitar a un grupo"
msgid "Invite email has already been taken"
msgstr "El correo electrónico de invitación ya está en uso"
-msgid "Invite group"
-msgstr "Invitar al grupo"
-
-msgid "Invite member"
-msgstr "Invitar al miembro"
-
msgid "Invite members"
msgstr "Invitar miembros"
@@ -20143,6 +20657,9 @@ msgstr "Invitar miembros"
msgid "InviteMembersModal|Members were successfully added"
msgstr "Los miembros se han añadido correctamente"
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "Buscar un grupo para invitar"
@@ -20161,6 +20678,12 @@ msgstr "Algo salió mal"
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr "La incidencia fue cerrada por %{name} %{reason}"
msgid "Issue weight"
msgstr "Peso de la incidencia"
-msgid "Issue(s) already assigned"
-msgstr "Incidencia(s) ya asignadas"
-
msgid "IssueAnalytics|Age"
msgstr "Edad"
@@ -20410,8 +20933,8 @@ msgstr "Eliminar tablero"
msgid "IssueBoards|No matching boards found"
msgstr "No se encontraron tableros coincidentes"
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr "Algunos de sus tableros están ocultos, active una licencia para verlos de nuevo."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr ""
msgid "IssueBoards|Switch board"
msgstr "Cambiar tablero"
@@ -20581,11 +21104,14 @@ msgstr "Iteración actualizada"
msgid "Iterations"
msgstr "Iteraciones"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr "Añadir iteración"
-msgid "Iterations|Automated scheduling"
-msgstr "Programación automática"
+msgid "Iterations|All"
+msgstr ""
msgid "Iterations|Cadence configuration is invalid."
msgstr "La configuración de la cadencia no es válida."
@@ -20599,12 +21125,6 @@ msgstr "No se pudo encontrar la cadencia de iteración"
msgid "Iterations|Create cadence"
msgstr "Crear cadencia"
-msgid "Iterations|Create cadence and start iteration"
-msgstr "Crear cadencia e iniciar iteración"
-
-msgid "Iterations|Create iteration"
-msgstr "Crear iteración"
-
msgid "Iterations|Delete cadence"
msgstr "Eliminar cadencia"
@@ -20614,6 +21134,9 @@ msgstr "¿Eliminar la cadencia de la iteración?"
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Duración"
@@ -20635,7 +21158,13 @@ msgstr "Iteraciones futuras"
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,11 +21194,17 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
-msgstr "Guardar cadencia"
+msgid "Iterations|Save changes"
+msgstr ""
msgid "Iterations|Select duration"
msgstr "Seleccionar la duración"
@@ -20677,6 +21215,9 @@ msgstr "Seleccionar el número"
msgid "Iterations|Select start date"
msgstr "Seleccionar la fecha de inicio"
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr "Fecha de inicio"
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr "Nombre de usuario o correo electrónico"
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr "Ver las incidencias de Jira en GitLab"
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr "Crear archivo de configuración de CI/CD"
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr "No hay trabajos a mostrar"
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr "Utilice trabajos para automatizar sus tareas"
@@ -21058,15 +21611,24 @@ msgstr "Explorar"
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr "Raw completo"
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "Descargar"
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr "Mantener"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "Desplazar hacia abajo"
@@ -21094,6 +21674,9 @@ msgstr "Desplazar hacia arriba"
msgid "Job|Show complete raw"
msgstr "Mostrar trabajo completo en crudo"
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr "Último intento de actualización"
msgid "Last updated"
msgstr "Última actualización"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr "Utilizado por última vez"
@@ -21585,6 +22174,12 @@ msgstr "Obtenga más información sobre las plantillas de proyectos a nivel de g
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr "Let's Encrypt no acepta correos electrónicos de example.com"
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr "License Compliance"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr "Obtenga mas información sobre la %{linkStart}Aprobación de Licencias%{linkEnd}"
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr "License Compliance no ha detectado licencias para la rama origen"
@@ -21825,6 +22431,12 @@ msgstr "License Compliance no ha detectado nuevas licencias"
msgid "LicenseCompliance|License name"
msgstr "Nombre de la licencia"
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr "Eliminar la licencia"
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr "Ya existe esta licencia en este proyecto."
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr "Está a punto de eliminar esta licencia, %{name}, para este proyecto."
@@ -22029,9 +22647,6 @@ msgstr "Lista de repositorios disponibles"
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr "Administrar etiquetas de grupo"
msgid "Manage labels"
msgstr "Administrar etiquetas"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr "Administrar hitos"
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr "No ha sido posible guardar el orden de las incidencias"
@@ -22500,6 +23121,9 @@ msgstr "El tamaño máximo del archivo es de 200 KB."
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr "Tiempo de espera máximo para el trabajo"
msgid "Maximum job timeout has a value which could not be accepted"
msgstr "El tiempo de espera máximo para los trabajos tiene un valor que no puede ser aceptado"
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ 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 requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr "Merge requests"
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 the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr "por ejemplo, req/seg."
msgid "Mi"
msgstr "Mi"
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr "Migrados %{success_count}/%{total_count} archivos."
@@ -23669,6 +24290,9 @@ msgstr "Cerrar hito"
msgid "Milestones|Completed Issues (closed)"
msgstr "Incidencias completadas (cerrado)"
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Eliminar hito"
@@ -23687,6 +24311,9 @@ msgstr "No se puede encontrar el hito %{milestoneTitle}"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr "Incidencias en curso (abiertas y asignadas)"
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr "Hito del proyecto"
@@ -23705,12 +24332,21 @@ msgstr "Promover a %{milestoneTitle} lo hará disponible para todos los proyecto
msgid "Milestones|Reopen Milestone"
msgstr "Reabrir Hito"
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "Esta acción no se puede deshacer"
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr "Incidencias no iniciadas (abiertas y no asignadas)"
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr "Capacidad mínima que debe estar disponible antes de que programemos más mirrors de forma preventiva."
@@ -23828,6 +24464,9 @@ msgstr "Mes"
msgid "Months"
msgstr "Meses"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr "Más información"
@@ -23924,16 +24563,16 @@ msgstr "Volver a desplegar"
msgid "MrDeploymentActions|Stop environment"
msgstr "Detener entorno"
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr "Cerrar la sesión actual e iniciar sesión con una cuenta diferente"
msgid "Need help?"
msgstr "¿Necesita ayuda?"
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr "Nunca"
msgid "New"
msgstr "Nuevo"
-msgid "New %{issueType}"
-msgstr "Nueva %{issueType}"
-
msgid "New %{type} in %{project}"
msgstr "Nuevo %{type} en %{project}"
@@ -24396,6 +25062,9 @@ msgstr "Nuevo directorio"
msgid "New discussion"
msgstr "Nueva discusión"
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr "Nuevo entorno"
@@ -24471,6 +25140,9 @@ msgstr "Nuevo proyecto/repositorio"
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr "Nueva versión"
@@ -24486,9 +25158,6 @@ msgstr "¡Se ha generado el token de registro para los nuevos ejecutores!"
msgid "New schedule"
msgstr "Nueva programación"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Nuevo fragmento de código"
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr "Siguiente discusión sin resolver"
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr "Seudónimo"
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr "Sin asignar"
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "No hay métodos de autenticación configurados."
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr "Sin iteración"
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr "Sin licencia. Todos los derechos reservados"
msgid "No matches found"
msgstr "No hay coincidencias"
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr "No se registraron mensajes"
msgid "No milestone"
msgstr "Sin hito"
-msgid "No milestones to show"
-msgstr "No hay hitos para mostrar"
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr "No hay ningún favorito que coincida con su búsqueda"
msgid "No start date"
msgstr "Sin fecha de inicio"
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr "Mostrar sólo el historial"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr "Este comentario ha cambiado desde que se comenzó a editar, por favor revise el %{open_link}comentario actualizado%{close_link} para asegurar que no se pierde ningún tipo de información"
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Solo los administradores pueden borrar un proyecto"
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr "Por favor, proceda únicamente si confía en %{idp_url} para controlar s
msgid "Only project members can comment."
msgstr "Sólo los miembros de proyecto pueden comentar."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr "Solo se importarán los miembros del proyecto. Los miembros del grupo se omitirán."
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,12 +26301,12 @@ msgstr "Abierta"
msgid "Open Selection"
msgstr "Abrir la selección"
-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 errors"
msgstr "Errores abiertos"
+msgid "Open in Gitpod"
+msgstr ""
+
msgid "Open in Web IDE"
msgstr ""
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr "Abrir raw"
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "Abrir barra lateral"
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "Abre en una nueva ventana"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr "La operación ha fallado. Por favor, compruebe los registros del pod para %{pod_name} para más obtener más información."
@@ -25821,6 +26490,9 @@ msgstr "Propiedad de:"
msgid "Owner"
msgstr "Propietario"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr "URL del servidor de Phabricator"
msgid "Phabricator Tasks"
msgstr "Tareas de Phabricator"
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr "Escoja un nombre"
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipelines"
@@ -26873,12 +27551,15 @@ msgstr "Gráficos de los pipelines"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr "La configuración de los pipelines para '%{project_name}' se actualizó correctamente."
-msgid "Pipelines|API"
-msgstr "API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
+msgid "Pipelines|API"
+msgstr "API"
+
msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr ""
@@ -26924,7 +27605,7 @@ msgstr "Editar"
msgid "Pipelines|Editor"
msgstr "Editor"
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr "Más información"
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr "Editor de pipeline"
msgid "Pipelines|Project cache successfully reset."
msgstr "Caché del proyecto restablecida correctamente."
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "Se ha producido un error durante el proceso de limpieza de la memoria caché de los runners."
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "Este proyecto no está configurado para ejecutar 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 "Token"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr "Commit"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr "Fecha"
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr "Duración"
-
msgid "Pipeline|Failed"
msgstr "Fallido"
@@ -27464,9 +28142,6 @@ msgstr "Por favor, seleccione un archivo"
msgid "Please select a group"
msgstr "Por favor, seleccione un grupo"
-msgid "Please select a group."
-msgstr "Por favor, seleccione un grupo."
-
msgid "Please select a valid target branch"
msgstr "Por favor, seleccione una rama de destino válida"
@@ -27521,7 +28196,7 @@ msgstr "Pod no encontrado"
msgid "Pods in use"
msgstr "Pods en uso"
-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."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr "Ruta o URL del archivo de colección de Postman"
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr "Utilizar tiempos relativos"
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr "Previo"
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr "Fecha de caducidad"
@@ -28004,9 +28685,6 @@ msgstr "Nombre completo"
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 ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr "Esta información aparecerá en tu perfil"
msgid "Profiles|Time settings"
msgstr "Ajustes de tiempo"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "Autenticación de dos factores"
@@ -28229,9 +28913,6 @@ msgstr "Su nombre se configuró automáticamente en función de su cuenta %{prov
msgid "Profiles|Your status"
msgstr "Su estado"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "por ejemplo, mi clave MacBook"
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr "Cada proyecto puede tener su propio espacio para almacenar sus imágenes Docker"
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr "Pages/Hugo"
msgid "ProjectTemplates|Pages/Jekyll"
msgstr "Pages/Jekyll"
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Pages/HTML plano"
@@ -29087,9 +29777,6 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr "No hay opciones de importación disponibles"
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr "Configuración del proyecto"
@@ -29843,7 +30536,10 @@ msgstr "Eventos Push"
msgid "Push project from command line"
msgstr "Hacer push al proyecto desde línea de comando"
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr "Rechazado (cerrado)"
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr "Solicitudes de fusión relacionadas"
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr "Relacionado con"
@@ -30519,6 +31218,9 @@ msgstr "Eliminar el tiempo gastado"
msgid "Remove time estimate"
msgstr "Eliminar el tiempo estimado"
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr "Informar de un abuso"
msgid "Report abuse to admin"
msgstr "Informar de un abuso al administrador"
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr "Fallo"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr "Los informes de las métricas se están cargando"
@@ -30829,6 +31540,12 @@ msgstr "Los informes de las métricas no han cambiado"
msgid "Reports|Metrics reports failed loading results"
msgstr "Se ha producido un erro al cargar os resultados de los informes de métricas"
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr "Resumen de la prueba"
msgid "Reports|Test summary failed loading results"
msgstr "Se ha producido un error al cargar los resultados de la prueba"
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "Se están analizando los resultados de la prueba"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr "Añadir a"
msgid "RightSidebar|deleting the"
msgstr "Eliminar el"
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "Hoja de ruta"
@@ -31473,12 +32193,12 @@ msgstr "Ejecutar trabajos no etiquetados"
msgid "Runner API"
msgstr ""
+msgid "Runner cannot be deleted, please contact your administrator."
+msgstr ""
+
msgid "Runner tokens"
msgstr "Token del ejecutor"
-msgid "Runner was not deleted because it is assigned to multiple projects."
-msgstr ""
-
msgid "Runner was not updated."
msgstr "No se actualizó el ejecutor."
@@ -31497,6 +32217,22 @@ msgstr "Ejecutores actualmente en línea: %{active_runners_count}"
msgid "Runners page."
msgstr "Página de ejecutores."
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr "Disponible para todos los proyectos y subgrupos del grupo"
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 "Ha utilizado %{quotaUsed} de %{quotaLimit} de sus minutos de ejecución de pipelines con Runners compartidos."
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "En ejecución"
@@ -31950,10 +32759,10 @@ msgstr "Guardando"
msgid "Saving project."
msgstr "Guardar proyecto."
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr "Buscar proyectos"
msgid "Search projects..."
msgstr "Buscar proyectos..."
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr "Detección de secretos"
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr "Editar la política del proyecto"
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr "Forzar la seguridad para este proyecto. %{linkStart}Más información%{linkEnd}"
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "Comentario añadido a '%{vulnerabilityName}'"
@@ -32896,6 +33789,9 @@ msgstr "Proyectos añadidos"
msgid "SecurityReports|Remove project from dashboard"
msgstr "SecurityReports|Eliminar proyecto del tablero"
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr "Gravedad"
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr "Estado"
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr "Seleccionar página"
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr "Seleccione un archivo en la barra lateral izquierda para comenzar la edición. Posteriormente, podrá hacer commit de sus cambios."
-msgid "Select a group to invite"
-msgstr "Seleccione un grupo a invitar"
-
msgid "Select a label"
msgstr "Seleccione una etiqueta"
@@ -33205,6 +34107,9 @@ msgstr "Seleccionar la suscripción"
msgid "Select target branch"
msgstr "Selecciona una rama de destino"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr "Establecer el tiempo estimado"
@@ -33631,9 +34542,6 @@ msgstr "Establecer el peso a %{weight}."
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "Añadir emoji de estado"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr "Mostrar los espacios en blanco de los cambios"
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr "Sesión iniciada"
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr "Snowplow"
msgid "Solution"
msgstr "Solución"
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr "Alguien editó esta incidencia al mismo tiempo que usted. Por favor revise %{linkStart} esta incidencia%{linkEnd} y asegúrese de que los cambios que ha realizado no eliminen sin querer los cambios realizados por la otra persona."
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr "Algo salió mal al cambiar el estado del botón. ¡Por favor, inténtelo de nuevo!"
-
msgid "Something went wrong while adding your award. Please try again."
msgstr "Se ha producido un error al añadir su premio. Por favor, inténtalo de nuevo."
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr "Fecha de inicio"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr "Estado:"
msgid "Status: %{title}"
msgstr "Estado: %{title}"
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr "Manténgase informado sobre el rendimiento y la salud de su entorno mediante la configuración dePrometheus para monitorizar sus despliegues."
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr "Paso 1."
@@ -35267,10 +36187,10 @@ msgstr "Suscripción creada correctamente."
msgid "Subscription successfully deleted."
msgstr "Suscripción eliminada correctamente."
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr "Información del sistema"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr "Sistema predeterminado (%{default})"
@@ -35957,6 +36873,12 @@ msgstr "Ruta de destino"
msgid "Target branch"
msgstr "Rama de destino"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "Plantilla"
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr "La rama para este proyecto no tiene una configuración de un pipeline ac
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "El resaltado de caracteres le ayuda a mantener la línea de asunto en %{titleLength} caracteres y a limitar el mensaje a %{bodyLength} para que sea legible en git."
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "La conexión terminará después de %{timeout}. Para los repositorios que tarden más tiempo, utilice una combinación de git clone y git push."
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr "El contenido de esta página no está codificado en UTF-8. Las ediciones sobre este contenido, solo se pueden realizar a través del repositorio Git."
@@ -36768,6 +37696,9 @@ msgstr "El proyecto se ha importado correctamente."
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr "La replica ha tardado demasiado tiempo en completarse."
msgid "The remote repository is being updated..."
msgstr "Se está actualizando el repositorio remoto..."
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr "Se puede acceder al fragmento de código sin necesidad ningún tipo de autenticación."
@@ -36810,6 +37750,9 @@ msgstr "El fragmento de código es visible sólo por los miembros del proyecto."
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr "La pestaña especificada no es válida, por favor seleccione otra"
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr "Esta acción puede provocar la pérdida de datos. Para prevenir acciones
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr "Este dispositivo ya ha sido registrado con nosotros."
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr "Este trabajo depende de otros trabajos con artefactos caducados o borrad
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr "Este trabajo depende de trabajos anteriores que se deben ejecutar correctamente, antes de que este trabajo se active"
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr "Esta tarea no tiene seguimiento."
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Se ha cancelado esta tarea"
@@ -37767,6 +38725,9 @@ msgstr "Esta suscripción es para"
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Este usuario no puede ser desbloqueado manualmente desde GitLab"
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr "Para añadir la entrada manualmente, proporcione los siguientes detalles a la aplicación en su teléfono."
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr "Para confirmar, escriba %{phrase_code}"
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr "Para recibir alertas de los servicios de Prometheus configurados manualmente, agregue la siguiente URL y la clave de autorización a su archivo de configuración del webhook de Prometheus. Puede obtener más información sobre la %{linkStart}configuración de Prometheus%{linkEnd} para enviar alertas a GitLab."
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr "Ocultar/mostrar barra lateral"
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr "No se puede actualizar la ruta porque hay proyectos bajo este grupo que
msgid "TransferGroup|Database is not supported."
msgstr "La base de datos no es compatible."
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr "El grupo contiene proyectos con paquetes NPM."
@@ -38818,6 +39788,9 @@ msgstr "Inténtelo de nuevo"
msgid "Try again?"
msgstr "¿Desea intentarlo de nuevo?"
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "Pruebe todo lo que GitLab tiene para ofrecer durante 30 días."
@@ -39022,6 +39995,9 @@ msgstr "Se ha producido un error al cargar los commits. Por favor, inténtelo de
msgid "Unable to load file contents. Try again later."
msgstr "No se puede cargar el contenido del archivo. Por favor, inténtalo de nuevo más tarde."
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr "No se puede cargar el diff"
@@ -39058,6 +40034,9 @@ 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 "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr "Desmarca este %{noun} como borrador."
msgid "Unreachable"
msgstr "Inalcanzable"
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr "Tipo de clúster no reconocido"
@@ -39364,9 +40346,6 @@ msgstr "Subir fichero CSV"
msgid "Upload File"
msgstr "Subir archivo"
-msgid "Upload License"
-msgstr "Subir licencia"
-
msgid "Upload New File"
msgstr "Subir nuevo archivo"
@@ -39385,9 +40364,6 @@ msgstr "Subir archivo"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr "Subir nuevo archivo"
@@ -39397,6 +40373,9 @@ msgstr "Subir un mapa de objetos"
msgid "UploadLink|click to upload"
msgstr "Hacer clic para subir"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr "Subir los cambios al terminal"
@@ -39454,7 +40433,7 @@ msgstr "Periodo actual de uso"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr "Utilice .gitlab-ci.yml"
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr "Utilice un autenticador de contraseña de un solo uso en su dispositivo móvil u ordenador para activar la autentificación de doble factor (2FA)."
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr "Utilice cURL"
@@ -40507,9 +41492,6 @@ msgstr "Ver archivo reemplazado @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr "Ver configuración"
-
msgid "View supported languages and frameworks"
msgstr "Ver idiomas y marcos soportados"
@@ -40534,6 +41516,9 @@ msgstr "Visto"
msgid "Viewing commit"
msgstr "Ver commit"
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr "Cambiar estado"
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr "Clase"
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr "Solicitud/Respuesta"
msgid "Vulnerability|Scanner Provider"
msgstr "Proveedor para el análisis"
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr "Espera a que el archivo se cargue para copiar su contenido"
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr "¿Qué está buscando?"
-
msgid "What does this command do?"
msgstr "¿Qué hace este comando?"
@@ -41338,13 +42329,13 @@ msgstr "Cuando un ejecutor está bloqueado, no se puede asignar a otros proyecto
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] "Cuando los merge request sean aceptados"
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr "Cuando:"
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr "Cancelar"
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr "Formato"
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr "Reintentar"
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr "Título"
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "Escriba su contenido o arrastre archivos aquí…"
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr "Siempre puede editar esto más tarde"
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr "Puede crear un nuevo %{link}."
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr "Solo puede añadir archivos cuando está en una rama"
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr "Solo puede transferir el proyecto a los espacios de nombres que administre."
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "No puede acceder al archivo sin formato. Por favor, espere un minuto."
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr "No tiene ningún proyecto disponible."
msgid "You don't have any recent searches"
msgstr "No tiene ninguna búsquedas reciente"
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr "No tiene permisos suficientes para realizar esta acción."
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr "No tiene permisos suficientes para ver los turnos de esta rotación"
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr "URL o ID de YouTube"
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr "¡Su suscripción ha caducado!"
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr "no se puede bloquer"
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr "Investigue esta vulnerabilidad creando una incidencia"
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "Administrar licencias"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr "Nuevo"
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "No hay cambios en la calidad del código"
@@ -43198,45 +44218,6 @@ msgstr "cerrado"
msgid "closed issue"
msgstr "incidencia cerrada"
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr "Ver los registros"
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "habilitado"
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "merge request"
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "Merge fallido."
-msgid "mrWidget|Merge locally"
-msgstr "Merge local"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr "Solicitud de merge"
msgid "mrWidget|Resolve conflicts"
msgstr "Resolver conflictos"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "Revertir"
@@ -44102,9 +45097,6 @@ msgstr "mi-asombroso-grupo"
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr "n/a"
-
msgid "need attention"
msgstr "necesita atención"
@@ -44165,6 +45157,9 @@ msgstr "incidencia abierta"
msgid "or"
msgstr "o"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr "token de acceso al proyecto"
msgid "project access tokens"
msgstr "tokens de acceso al proyecto"
-msgid "project avatar"
-msgstr "avatar del proyecto"
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr "el archivo"
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index 7fbd7c9ef5b..ce21d0c43f2 100644
--- a/locale/et_EE/gitlab.po
+++ b/locale/et_EE/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: et\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/fa_IR/gitlab.po b/locale/fa_IR/gitlab.po
index 677cc00c55e..a03befccd8e 100644
--- a/locale/fa_IR/gitlab.po
+++ b/locale/fa_IR/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: fa\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/fi_FI/gitlab.po b/locale/fi_FI/gitlab.po
index 9f075220822..3fa1ae3a894 100644
--- a/locale/fi_FI/gitlab.po
+++ b/locale/fi_FI/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: fi\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:13\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index 273ee4ee957..510f96cf164 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: fil\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:41\n"
+"PO-Revision-Date: 2022-04-01 09:17\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index a3901da993c..2f83ab88439 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: fr\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:10\n"
msgid " %{start} to %{end}"
msgstr " %{start} à %{end}"
@@ -28,15 +28,9 @@ msgstr " Collecté %{time}"
msgid " Please sign in."
msgstr " Veuillez vous identifier."
-msgid " Target Path"
-msgstr " Chemin cible"
-
msgid " Try to %{action} this file again."
msgstr " Réessayez de %{action} ce fichier."
-msgid " Type"
-msgstr " Type"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Vous devez faire cela avant %{grace_period_deadline}."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "%d autre commentaire"
msgstr[1] "%d autres commentaires"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d ticket ouvert"
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "%d projet personnel sera supprimé et ne pourra pas être restauré."
msgstr[1] "%d projets personnels seront supprimés et ne pourront pas être restaurés."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d validation précédemment fusionnée"
@@ -371,10 +375,10 @@ msgid_plural "%d projects selected"
msgstr[0] "%d projet sélectionné"
msgstr[1] "%d projets sélectionnés"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d demande avec avertissements"
-msgstr[1] "%d demandes avec avertissements"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -468,9 +472,6 @@ msgstr "%{actionText} et réouvrir %{noteable}"
msgid "%{address} is an invalid IP address range"
msgstr "%{address} est une plage d'adresses IP non valide"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "%{anchorOpen}En savoir plus%{anchorClose} sur comment personnaliser / désactiver l'inscription sur votre instance."
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link} a cloné %{original_issue} vers %{new_issue}."
@@ -702,6 +703,9 @@ msgstr "Les %{integrations_link_start}Intégrations%{link_end} vous permettent d
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} sera supprimé ! Êtesâ€vous sûr ?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "%{issueType} actions"
@@ -780,8 +784,8 @@ msgstr "%{level_name} n'est pas autorisé car le projet divergent a une visibili
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "%{link_start}En savoir plus%{link_end} sur les rôles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Supprimez le %{draft_snippet} préfixe%{link_end} du titre pour permettre la fusion lorsque cette demande de fusion sera prête."
@@ -789,9 +793,6 @@ msgstr "%{link_start}Supprimez le %{draft_snippet} préfixe%{link_end} du titre
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "%{link_start}Débutez le titre avec %{draft_snippet}%{link_end} pour empêcher un brouillon de demande de fusion d'être fusionné avant qu'il ne soit prêt."
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr "%{link_start}Quelles informations GitLab Inc. recueille-t-il ?%{link_end}"
@@ -861,6 +862,9 @@ msgstr "L'espace de noms %{name}(%{url}) a épuisé ses minutes de Pipeline d'Ex
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, confirmez votre adresse e-mail maintenant !"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} jour"
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr "À propos de l’autoâ€déploiement"
msgid "About this feature"
msgstr "À propos de cette fonctionnalité"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Rapports d’abus"
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr "Date d’expiration de l’accès"
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr "Ajouter une grappe de serveurs Kubernetes"
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr "Ajouter un commentaire"
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr "Supprimer le projet %{projectName} ?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domaine de DevOps automatique"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "Une erreur s’est produite lors de la prévisualisation du blob"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr "Événements d’audit"
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "août"
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "Vos badges numériques"
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr "Pour gérer le forfait de ce groupe, rendez vous à la section facturati
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Ce nom de branche existe déjà"
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Parcourir le dossier"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr "Cela va créer un nouveau commit afin de défaire les modifications exis
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr "Tous les environnements"
msgid "CiVariable|Create wildcard"
msgstr "Créer un joker"
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr "Nouvel environnement"
-msgid "CiVariable|Protected"
-msgstr "Protégée"
-
msgid "CiVariable|Search environments"
msgstr "Chercher des environnements"
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr "Changer l’état de protection"
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
-msgstr ""
-
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Ajouter une grappe de serveurs Kubernetes"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Ajouter une intégration d’une grappe de serveurs Kubernetes"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "Une grappe de serveurs Kubernetes ajoutée à votre groupe la rendra automatiquement disponible pour tous vos projets. Vous pourrez utiliser les applications de revue de code, déployer vos applications et exécuter facilement vos pipelines avec tous les projets utilisant la même grappe de serveurs."
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Créer une grappe de serveurs Kubernetes"
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr "Activez ou désactivez la connexion de GitLab à votre grappe de serveur
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Activez ce paramètre si vous utilisez le contrôle d’accès basé sur les rôles (RBAC)."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Entrez les détails de votre grappe de serveurs Kubernetes"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "Portée de l’environnement"
@@ -8220,9 +8430,6 @@ msgstr "Groupe de la grappe de serveurs"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
-msgstr "Si vous configurez plusieurs grappes de serveurs et que vous utilisez Auto DevOps, %{help_link_start}veillez d’abord lire ceci%{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -8268,8 +8475,8 @@ msgstr "En savoir plus sur les %{help_link_start_machine_type}types de machine
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "En savoir plus sur %{help_link_start}les zones%{help_link_end}."
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "En savoir plus sur Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "En savoir plus sur les grappes de serveurs Kubernetes de groupe"
@@ -8361,9 +8568,6 @@ msgstr "Nombre de nœuds"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Veuillez vous assurer que votre compte Google répond aux exigences suivantes :"
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,8 +8841,8 @@ msgstr "Nous n’avons pu vérifier que la facturation de l’un de vos projets
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 "Avec une grappe de serveurs Kubernetes associée à ce projet, vous pouvez utiliser des applications de revue, déployer vos applications, exécuter vos pipelines, et bien plus encore."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr ""
@@ -8873,9 +9083,6 @@ msgstr "Commit"
msgid "CommitMessage|Add %{file_name}"
msgstr "Ajout de %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "réalisé"
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr "Connecter"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr "Connecter tous les dépôts"
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr "Créer une nouvelle étiquette"
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr "Domaine"
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr "Votes négatifs"
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr "Date d’échéance"
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "Au cours de ce processus, il vous sera demandé les URL de GitLab. Utilisez les URL indiquées ciâ€dessous."
@@ -13220,9 +13547,6 @@ msgstr "Modifier le groupe : %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "Modifier l’identité de %{user_name}"
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ 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|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr "En savoir plus sur l’arrêt des environnements"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Nouvel environnement"
@@ -14053,8 +14380,11 @@ msgstr ""
msgid "Environments|Updated"
msgstr "Mis à jour"
-msgid "Environments|You don't have any environments right now"
-msgstr "Vous n’avez pour le moment aucun environnement"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr ""
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr "Explorer les groupes"
msgid "Explore groups"
msgstr "Explorer les groupes"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Explorer les projets"
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr "févr."
msgid "February"
msgstr "février"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr "Filtrer…"
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Depuis la création du ticket jusqu’au déploiement en production"
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "Utilisateur GitLab"
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr "Masquer la charge utile"
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr "J’accepte les %{terms_link}"
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "Adresse IP"
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr "Importer un projet GitLab exporté"
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Importez plusieurs dépôts en téléversant un fichier manifeste."
@@ -18525,9 +19015,6 @@ msgstr "Importer un projet"
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Importer des projets depuis Bitbucket"
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr "En ligne"
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr "Inviter"
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr "Parcourir"
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr "Brut complet"
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "Télécharger"
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr "Garder"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "Faire défiler vers le bas"
@@ -21094,6 +21674,9 @@ msgstr "Faire défiler vers le haut"
msgid "Job|Show complete raw"
msgstr "Afficher la version brute"
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr "Dernière mise à jour"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr "Lister les dépôts disponibles"
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr "Gérer les étiquettes de groupe"
msgid "Manage labels"
msgstr "Gérer les étiquettes"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr "Durée maximale d’exécution de la tâche"
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr "Demandes de fusion"
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 the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Supprimer le jalon"
@@ -23687,6 +24311,9 @@ msgstr "Le jalon %{milestoneTitle} est introuvable"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "Cette action ne peut pas être annulée."
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr "Mois"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr "Se déconnecter et se reconnecter avec un autre compte"
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr "Jamais"
msgid "New"
msgstr "Nouveau"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr "Nouveau dossier"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr "Nouvelle planification"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Nouvel extrait de code"
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr "Aucune licence. Tous droits réservés"
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr "Aucun message n’a été enregistré"
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr "Afficher uniquement l’historique"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Seuls les membres du projet peuvent commenter."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr "Ouvert"
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "Ouvrir la barre latérale"
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "Ouvrir dans une nouvelle fenêtre"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr "Propriétaire"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipelines"
@@ -26873,10 +27551,13 @@ msgstr "Graphiques des pipelines"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr "Réinitialisation du cache de projet réussie."
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "Une erreur s’est produite lors du nettoyage du cache des exécuteurs."
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "Ce projet n’est actuellement pas configuré pour exécuter des 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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr "Commit"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr "Durée"
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr "Votre statut"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "p. ex., Ma clef MacBook"
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr "Événements de poussée"
msgid "Push project from command line"
msgstr "Pousser le projet en ligne de commande"
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr "Demandes de fusion liées"
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr "Échec"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr "Synthèse des tests"
msgid "Reports|Test summary failed loading results"
msgstr "Échec du chargement des résultats de la synthèse des tests"
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "Les résultats de la synthèse des tests sont en cours d’analyse"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "Feuille de route"
@@ -31473,10 +32193,10 @@ msgstr "Exécuter les tâches non étiquetées"
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr "Exécuteurs actuellement en ligne : %{active_runners_count}"
msgid "Runners page."
msgstr "Page des exécuteurs."
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "En cours d’exécution"
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr "Rechercher des projets"
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr "Sélectionnez un groupe à inviter"
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr "Sélectionner une branche cible"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "Ajouter un émoji d’état"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr "Afficher les modifications des espaces"
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr "Une erreur s’est produite lors du basculement du bouton"
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr "Date de début"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr "Informations système"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr "Branche cible"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "Modèle"
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "Le surligneur de caractères vous aide à garder la longueur de l’objet à %{titleLength} caractères maximum et à faire des renvois à la ligne pour limiter les lignes du corps du message à %{bodyLength} caractères, afin de les rendre lisibles sous Git."
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "La connexion expirera après %{timeout}. Pour les dépôts qui nécessitent plus de temps, utilisez une combinaison de clone et push."
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr "Cette tâche dépend des tâches en amont qui doivent réussir pour que celleâ€ci soit déclenchée"
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr "Cette tâche n’a pas de trace."
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Cette tâche a été annulée"
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr "Afficher/masquer la barre latérale"
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr "Veuillez réessayer"
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "Essayez tout ce que GitLab peut vous offrir pendant 30 jours."
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr "Impossible de mettre à jour cette épopée pour le moment."
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "Téléverser un nouveau fichier"
@@ -39385,9 +40364,6 @@ msgstr "Téléverser un fichier"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr "Cliquez pour envoyer"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr "Voir le fichier remplacé @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr "Classe"
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr "Lorsqu’un exécuteur est verrouillé, il ne peut pas être affecté à
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "Écrivez du contenu ou faites glisser des fichiers ici…"
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr "Vous ne pouvez modifier des fichiers que dans une branche"
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "Gérer les licences"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "Aucun changement dans la qualité du code"
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "activé"
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "demande de fusion"
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "La fusion a échoué."
-msgid "mrWidget|Merge locally"
-msgstr "Fusionner localement"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr "Demande de fusion de"
msgid "mrWidget|Resolve conflicts"
msgstr "Résoudre les conflits"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "Défaire"
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr "non disponible"
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 87cdb4e3838..b7c3378db63 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -335,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -370,6 +375,11 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
@@ -642,6 +652,9 @@ msgstr ""
msgid "%{emailPrefix}@company.com"
msgstr ""
+msgid "%{enable_service_ping_link_start}Enable%{link_end} or %{generate_manually_link_start}generate%{link_end} Service Ping to preview and download service usage data payload."
+msgstr ""
+
msgid "%{extra} more downstream pipelines"
msgstr ""
@@ -654,9 +667,6 @@ msgstr ""
msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
msgstr ""
-msgid "%{from_address} (reply to: %{reply_to_address})"
-msgstr ""
-
msgid "%{gitlab_experience_text}. Don't worry, this information isn't shared outside of your self-managed GitLab instance."
msgstr ""
@@ -786,9 +796,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -855,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -953,9 +963,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1269,9 +1276,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1457,6 +1461,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1469,6 +1476,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1544,9 +1554,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1592,9 +1599,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1604,6 +1608,9 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
@@ -1805,6 +1812,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -2108,9 +2118,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2318,15 +2325,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-msgstr ""
-
msgid "AddMember|Invite email is invalid"
msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|Invites cannot be blank"
+msgstr ""
+
msgid "AddMember|No invite source provided."
msgstr ""
@@ -2489,6 +2496,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2501,6 +2511,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2513,6 +2526,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2606,6 +2622,9 @@ msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2621,6 +2640,15 @@ 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|Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "AdminSettings|Enable Registration Features"
+msgstr ""
+
+msgid "AdminSettings|Enable Service Ping"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr ""
@@ -2642,24 +2670,63 @@ msgstr ""
msgid "AdminSettings|Let's Encrypt email"
msgstr ""
+msgid "AdminSettings|Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
msgid "AdminSettings|No required pipeline"
msgstr ""
+msgid "AdminSettings|Preview payload"
+msgstr ""
+
+msgid "AdminSettings|Project export enabled"
+msgstr ""
+
msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
+msgid "AdminSettings|Registration Features include:"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2669,12 +2736,18 @@ msgstr ""
msgid "AdminSettings|Select to disable public access for Pages sites, which requires users to sign in for access to the Pages sites in your instance. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Service ping is disabled in your configuration file, and cannot be enabled through this form. For more information, see the documentation on %{link_start}deactivating service ping%{link_end}."
+msgstr ""
+
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
msgstr ""
@@ -2696,6 +2769,18 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|To enable Registration Features, first enable Service Ping."
+msgstr ""
+
+msgid "AdminSettings|To help improve GitLab and its user experience, GitLab periodically collects usage information. %{link_start}What information is shared with GitLab Inc.?%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
+msgid "AdminSettings|You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3584,13 +3669,19 @@ msgstr ""
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
+msgid "Allow access only to members of this group"
+msgstr ""
+
+msgid "Allow access to everyone"
+msgstr ""
+
msgid "Allow access to members of the following group"
msgstr ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+msgid "Allow commits from members who can merge to the target branch. %{link_start}About this feature.%{link_end}"
msgstr ""
msgid "Allow group owners to manage LDAP-related settings"
@@ -3773,6 +3864,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4093,9 +4187,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4162,9 +4253,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4195,6 +4283,9 @@ msgstr ""
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
+msgid "Another third-party wiki is already in use. Only one third-party wiki integration can be active at a time"
+msgstr ""
+
msgid "Anti-spam verification"
msgstr ""
@@ -4273,6 +4364,12 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
+msgid "ApplicationSettings|A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
+msgstr ""
+
+msgid "ApplicationSettings|Add a link to Grafana"
+msgstr ""
+
msgid "ApplicationSettings|After sign up text"
msgstr ""
@@ -4426,9 +4523,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4620,15 +4714,6 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed in the group settings by an administrator or group owner."
msgstr ""
-msgid "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5160,7 +5245,7 @@ msgstr ""
msgid "Authenticate"
msgstr ""
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead. %{link_start}How do I configure authentication using the GitLab database? %{link_end}"
msgstr ""
msgid "Authenticate with GitHub"
@@ -5199,6 +5284,9 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr ""
@@ -5385,6 +5473,9 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
+msgid "Available on-demand"
+msgstr ""
+
msgid "Available runners: %{runners}"
msgstr ""
@@ -5511,9 +5602,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5628,6 +5716,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5679,6 +5773,9 @@ msgstr ""
msgid "Billings|Reactivate trial"
msgstr ""
+msgid "Billings|Seats in use / Seats in subscription"
+msgstr ""
+
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
@@ -5706,22 +5803,28 @@ msgstr ""
msgid "Billing|%{user} was successfully approved"
msgstr ""
+msgid "Billing|Add seats"
+msgstr ""
+
msgid "Billing|An email address is only visible for users with public emails."
msgstr ""
msgid "Billing|An error occurred while approving %{user}"
msgstr ""
-msgid "Billing|An error occurred while getting a billable member details"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+msgid "Billing|An error occurred while loading GitLab subscription details."
+msgstr ""
+
+msgid "Billing|An error occurred while loading billable members list."
msgstr ""
msgid "Billing|An error occurred while loading pending members list"
msgstr ""
-msgid "Billing|An error occurred while removing a billable member"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5739,9 +5842,6 @@ msgstr ""
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
-msgstr ""
-
msgid "Billing|Group invite"
msgstr ""
@@ -5769,9 +5869,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6165,9 +6262,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6225,9 +6319,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6285,6 +6376,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6327,12 +6421,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6345,9 +6445,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6360,6 +6466,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6438,9 +6547,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6542,7 +6648,7 @@ msgstr ""
msgid "CICD|Select projects that can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file. %{link_start}What is Auto DevOps?%{link_end}"
msgstr ""
msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
@@ -6710,6 +6816,9 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -6944,6 +7053,9 @@ msgstr ""
msgid "Changed assignee(s)."
msgstr ""
+msgid "Changed merge method to %{merge_method}"
+msgstr ""
+
msgid "Changed reviewer(s)."
msgstr ""
@@ -6965,6 +7077,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7254,6 +7369,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7320,6 +7438,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7536,6 +7657,11 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7734,6 +7860,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7758,9 +7887,6 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
-msgstr ""
-
msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
@@ -7776,6 +7902,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7794,10 +7923,10 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
@@ -7815,19 +7944,19 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7842,7 +7971,13 @@ msgstr ""
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
msgstr ""
msgid "ClusterAgents|Create agent access token"
@@ -7887,13 +8022,13 @@ msgstr ""
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included in the command."
msgstr ""
-msgid "ClusterAgents|GitLab Agent"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -7905,7 +8040,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -7941,30 +8076,18 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
msgid "ClusterAgents|Registering agent"
msgstr ""
-msgid "ClusterAgents|Registration token"
-msgstr ""
-
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
-msgstr ""
-
msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
-msgstr ""
-
msgid "ClusterAgents|Security"
msgstr ""
@@ -7977,19 +8100,16 @@ msgstr ""
msgid "ClusterAgents|Tell us what you think"
msgstr ""
-msgid "ClusterAgents|The GitLab Agent provides an increased level of security when connecting Kubernetes clusters to GitLab. %{linkStart}Learn more about the GitLab Agent.%{linkEnd}"
+msgid "ClusterAgents|The GitLab agent provides an increased level of security when connecting Kubernetes clusters to GitLab. %{linkStart}Learn more about the GitLab agent.%{linkEnd}"
msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8180,9 +8300,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8225,6 +8342,9 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
+
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
@@ -8693,6 +8813,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr ""
+msgid "ClusterIntegration|This process is %{issue_link_start}deprecated%{issue_link_end}. Use the %{docs_link_start}the GitLab agent for Kubernetes%{docs_link_end} instead."
+msgstr ""
+
msgid "ClusterIntegration|This project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8726,7 +8849,7 @@ msgstr ""
msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
msgstr ""
-msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
+msgid "ClusterIntegration|Use the %{linkStart}GitLab agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9025,9 +9148,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9115,6 +9235,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9127,9 +9250,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9322,6 +9442,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9385,9 +9508,6 @@ msgstr ""
msgid "Confirm new password"
msgstr ""
-msgid "Confirm remove avatar"
-msgstr ""
-
msgid "Confirm user"
msgstr ""
@@ -9581,9 +9701,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9641,7 +9758,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9656,6 +9773,9 @@ msgstr ""
msgid "ContainerRegistry|Image repository not found"
msgstr ""
+msgid "ContainerRegistry|Image repository temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Image repository will be deleted"
msgstr ""
@@ -9736,6 +9856,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9883,6 +10006,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10087,6 +10213,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10123,6 +10252,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10138,9 +10273,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10258,7 +10390,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10351,6 +10483,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10417,9 +10552,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10444,6 +10576,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10726,43 +10861,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10777,10 +10894,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10855,7 +10972,7 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -10891,16 +11008,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
+msgid "Customer experience improvement and third-party offers"
msgstr ""
-msgid "Customer Relations Organizations"
+msgid "Customer relations"
msgstr ""
-msgid "Customer experience improvement and third-party offers"
+msgid "Customer relations contacts"
msgstr ""
-msgid "Customer relations"
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11029,6 +11146,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11047,6 +11167,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11056,6 +11179,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
msgstr ""
+msgid "CycleAnalytics|If you have recently upgraded to GitLab Premium, it can take up to 30 minutes for data to collect and display."
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11135,10 +11261,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11285,6 +11411,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11339,9 +11468,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11845,6 +11971,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12082,9 +12211,15 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|All items in the cache are scheduled for removal."
+msgstr ""
+
msgid "DependencyProxy|Cached %{time}"
msgstr ""
+msgid "DependencyProxy|Clear cache"
+msgstr ""
+
msgid "DependencyProxy|Clear the Dependency Proxy cache automatically"
msgstr ""
@@ -12370,6 +12505,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr ""
+msgid "Deployment Target|%{linkStart}How to provision or deploy to Kubernetes clusters from GitLab?%{linkEnd}"
+msgstr ""
+
msgid "Deployment Target|Project deployment target (optional)"
msgstr ""
@@ -12519,10 +12657,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
+msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
+msgid "Deprecations|The logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. The logs and tracing features were also deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12932,6 +13076,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13007,6 +13154,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13141,7 +13291,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+msgid "Display time tracking in issues in total hours only. %{link_start}What is time tracking?%{link_end}"
msgstr ""
msgid "Do not display content for customer experience improvement and offers from third parties"
@@ -13180,6 +13330,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13318,6 +13471,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13549,9 +13741,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13657,13 +13846,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13687,18 +13876,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14154,6 +14337,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14169,9 +14355,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14253,7 +14436,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14265,6 +14451,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14289,9 +14478,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14882,6 +15068,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14894,6 +15083,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14978,6 +15170,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15014,6 +15209,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15274,6 +15472,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15304,6 +15505,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15460,7 +15664,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15984,9 +16188,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16092,9 +16293,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16122,6 +16320,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16314,6 +16515,9 @@ msgstr ""
msgid "Geo|Edit %{nodeType} site"
msgstr ""
+msgid "Geo|Edit your search and try again."
+msgstr ""
+
msgid "Geo|Failed"
msgstr ""
@@ -16389,6 +16593,9 @@ msgstr ""
msgid "Geo|Next sync scheduled at"
msgstr ""
+msgid "Geo|No Geo site found"
+msgstr ""
+
msgid "Geo|No available replication slots"
msgstr ""
@@ -16746,6 +16953,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16770,7 +16980,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+msgid "GitLab informs you if a new version is available. %{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
@@ -16941,6 +17151,15 @@ msgstr ""
msgid "Gitea Import"
msgstr ""
+msgid "GithubImporter|PR mergers"
+msgstr ""
+
+msgid "GithubImporter|PR reviews"
+msgstr ""
+
+msgid "GithubImporter|Pull requests"
+msgstr ""
+
msgid "GithubIntegration|Create a %{token_link_start}personal access token%{token_link_end} with %{status_html} access granted and paste it here."
msgstr ""
@@ -18162,6 +18381,76 @@ msgstr ""
msgid "HarborIntegration|Use Harbor as this project's container registry."
msgstr ""
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18273,6 +18562,9 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
+msgid "Helps prevent bots from creating accounts. %{link_start}How do I configure it?%{link_end}"
+msgstr ""
+
msgid "Helps prevent bots from creating issues."
msgstr ""
@@ -18285,9 +18577,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18436,12 +18725,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18559,9 +18842,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18616,7 +18896,7 @@ msgstr ""
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
msgstr ""
-msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
+msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored. %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "If disabled, only administrators can configure repository mirroring."
@@ -18691,6 +18971,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18761,7 +19047,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18913,9 +19199,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-msgstr ""
-
msgid "In case of pull mirroring, your user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
msgstr ""
@@ -19138,9 +19421,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19219,15 +19499,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19567,6 +19838,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19690,18 +19964,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20175,9 +20437,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20187,12 +20446,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20277,6 +20542,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20352,9 +20620,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20448,6 +20713,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20466,6 +20734,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20478,6 +20752,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20883,10 +21160,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20895,13 +21175,13 @@ msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
-msgid "Iterations|Couldn't find iteration cadence"
+msgid "Iterations|Cancel"
msgstr ""
-msgid "Iterations|Create cadence"
+msgid "Iterations|Couldn't find iteration cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
+msgid "Iterations|Create cadence"
msgstr ""
msgid "Iterations|Create iteration"
@@ -20916,6 +21196,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
+msgid "Iterations|Done"
+msgstr ""
+
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20937,7 +21226,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20955,6 +21250,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20964,10 +21262,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20979,6 +21283,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20991,6 +21298,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21018,9 +21328,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21126,7 +21433,7 @@ msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
-msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{gitlab_issues_link_start}disabling GitLab issues%{link_end} if they won't otherwise be used."
msgstr ""
msgid "JiraService|Enable Jira issue creation from vulnerabilities"
@@ -21177,9 +21484,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21246,9 +21550,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21264,6 +21565,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
msgstr ""
+msgid "JiraService|You can now close this window and%{br}return to the GitLab for Jira application."
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21318,6 +21622,9 @@ msgstr ""
msgid "Jobs older than the configured time are considered expired and are archived. Archived jobs can no longer be retried. Leave empty to never archive jobs automatically. The default unit is in days, but you can use other units, for example %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}. Minimum value is 1 day."
msgstr ""
+msgid "Jobs|All"
+msgstr ""
+
msgid "Jobs|Are you sure you want to proceed?"
msgstr ""
@@ -21327,6 +21634,12 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21336,6 +21649,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21363,15 +21682,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21387,9 +21715,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21399,6 +21745,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21423,6 +21772,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21827,6 +22179,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22040,6 +22395,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22055,6 +22413,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22073,6 +22434,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22100,9 +22464,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22133,6 +22494,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22142,6 +22508,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22157,6 +22529,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22196,10 +22574,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+msgid "Licenses|Displays licenses detected in the project that are out of compliance with the project's policies, based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
msgid "Licenses|Drag your license file here or %{linkStart}click to upload%{linkEnd}."
@@ -22247,9 +22622,6 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
@@ -22451,9 +22823,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22508,6 +22877,9 @@ msgstr ""
msgid "Logs|To see the logs, deploy your code to an environment."
msgstr ""
+msgid "Looks like you've reached your %{free_limit} member limit for %{strong_start}%{namespace_name}%{strong_end}"
+msgstr ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -22619,6 +22991,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22652,6 +23027,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22901,7 +23279,7 @@ msgstr ""
msgid "Maximum file size is 1 MB. Image size must be 32 x 32 pixels. Allowed image formats are %{favicon_extension_whitelist}."
msgstr ""
-msgid "Maximum file size is 1MB. Pages are optimized for a 28px tall header logo"
+msgid "Maximum file size is 1MB. Pages are optimized for a 24px tall header logo"
msgstr ""
msgid "Maximum file size is 1MB. Pages are optimized for a 640x360 px logo."
@@ -23160,6 +23538,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23292,9 +23673,6 @@ msgstr ""
msgid "Merge request dependencies"
msgstr ""
-msgid "Merge request diff sha parameter is required for the merge quick action."
-msgstr ""
-
msgid "Merge request events"
msgstr ""
@@ -23529,6 +23907,18 @@ msgstr ""
msgid "MetricChart|There is too much data to calculate. Please change your selection."
msgstr ""
+msgid "MetricImages|There was an issue deleting the image."
+msgstr ""
+
+msgid "MetricImages|There was an issue loading metric images."
+msgstr ""
+
+msgid "MetricImages|There was an issue updating your image."
+msgstr ""
+
+msgid "MetricImages|There was an issue uploading your image."
+msgstr ""
+
msgid "Metrics"
msgstr ""
@@ -23867,9 +24257,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23989,6 +24376,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24007,6 +24397,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24025,12 +24418,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24247,16 +24649,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24363,19 +24765,19 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
-msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgid "NamespaceStorage|%{name_with_link} namespace has approximately %{percent} (%{size}) namespace storage space remaining."
msgstr ""
msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
msgstr ""
-msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgid "NamespaceStorage|%{name}(%{url}) namespace has approximately %{percent} (%{size}) namespace storage space remaining."
msgstr ""
msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
msgstr ""
-msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgid "NamespaceStorage|Action required: Approximately %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
msgstr ""
msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
@@ -24746,6 +25148,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -25046,9 +25451,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25103,9 +25505,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25318,6 +25717,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25345,6 +25747,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25479,6 +25884,42 @@ msgstr ""
msgid "Notify users by email when sign-in location is not recognized."
msgstr ""
+msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
+msgstr ""
+
+msgid "Notify|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+msgstr ""
+
+msgid "Notify|Merge request %{merge_request} can no longer be merged due to conflict."
+msgstr ""
+
+msgid "Notify|Merge request %{merge_request} was %{mr_status}"
+msgstr ""
+
+msgid "Notify|Merge request %{merge_request} was %{mr_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Merge request %{merge_request} was merged"
+msgstr ""
+
+msgid "Notify|Merge request URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25578,6 +26019,9 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "On-demand scans run outside of the DevOps cycle and find vulnerabilities in your projects"
+msgstr ""
+
msgid "OnCallScheduless|Any escalation rules that are using this schedule will also be deleted."
msgstr ""
@@ -25785,10 +26229,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25985,9 +26429,6 @@ msgstr ""
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 ""
-
msgid "Open errors"
msgstr ""
@@ -26686,6 +27127,9 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
+msgid "Partial import"
+msgstr ""
+
msgid "Participants"
msgstr ""
@@ -26947,6 +27391,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27826,9 +28273,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27865,6 +28309,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -27949,6 +28396,12 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr ""
+msgid "Preferences|Color for added lines"
+msgstr ""
+
+msgid "Preferences|Color for removed lines"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
@@ -27958,6 +28411,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
msgstr ""
+msgid "Preferences|Customize the colors of removed and added lines in diffs."
+msgstr ""
+
+msgid "Preferences|Diff colors"
+msgstr ""
+
msgid "Preferences|Display time in 24-hour format"
msgstr ""
@@ -27994,6 +28453,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28348,6 +28810,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28369,9 +28834,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28408,6 +28870,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28513,6 +28978,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28594,9 +29062,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28711,9 +29176,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29101,7 +29563,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29341,7 +29803,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@@ -29440,6 +29902,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29458,9 +29923,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29605,6 +30067,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30579,9 +31047,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -30896,6 +31361,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31191,6 +31659,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
@@ -31233,9 +31704,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31669,9 +32146,6 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
-msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -31814,6 +32288,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -31886,6 +32363,16 @@ msgstr ""
msgid "Runners|%{percentage} spot."
msgstr ""
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
msgstr ""
@@ -31931,9 +32418,15 @@ msgstr ""
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
msgid "Runners|Choose your preferred GitLab Runner"
msgstr ""
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31946,12 +32439,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -32000,25 +32501,22 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
-msgid "Runners|Name"
+msgid "Runners|Multi-project runners cannot be deleted"
msgstr ""
-msgid "Runners|Never contacted"
-msgstr ""
-
-msgid "Runners|New group runners view"
+msgid "Runners|Name"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|New registration token generated!"
msgstr ""
msgid "Runners|No spot. Default choice for Windows Shell executor."
@@ -32036,18 +32534,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
msgid "Runners|Pause from accepting jobs"
msgstr ""
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32102,21 +32611,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32129,9 +32668,6 @@ msgstr ""
msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
-msgid "Runners|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 ""
-
msgid "Runners|Show runner installation and registration instructions"
msgstr ""
@@ -32150,6 +32686,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32168,15 +32707,12 @@ msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|This runner has not run any jobs."
msgstr ""
msgid "Runners|This runner is associated with specific projects."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
-msgstr ""
-
msgid "Runners|This runner is available to all projects and subgroups in a group."
msgstr ""
@@ -32192,7 +32728,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32219,9 +32755,6 @@ 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 ""
@@ -32255,9 +32788,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32853,16 +33383,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32910,6 +33443,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -32919,6 +33455,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32934,6 +33476,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32949,12 +33497,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32964,6 +33521,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32976,9 +33536,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33027,6 +33599,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33045,12 +33620,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33069,6 +33653,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33078,10 +33665,16 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
msgid "SecurityOrchestration|Summary"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33105,6 +33698,12 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
msgid "SecurityOrchestration|View policy project"
msgstr ""
@@ -33336,6 +33935,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33360,7 +33962,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33378,13 +33980,13 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|The Vulnerability Report shows results of successful scans on your project's default branch, manually added vulnerability records, and vulnerabilities found from scanning operational environments. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
-msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33459,9 +34061,6 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
@@ -33882,13 +34481,13 @@ msgstr ""
msgid "Service Desk allows people to create issues in your GitLab instance without their own user account. It provides a unique email address for end users to create issues in a project. Replies can be sent either through the GitLab interface or by email. End users only see threads through email."
msgstr ""
-msgid "Service account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34089,9 +34688,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34876,9 +35472,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35959,6 +36552,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -35974,6 +36573,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -35992,6 +36597,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36043,9 +36651,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36079,7 +36684,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36124,6 +36732,11 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36265,12 +36878,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36394,6 +37001,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -36466,9 +37076,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36594,10 +37201,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -36678,6 +37282,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -36909,6 +37516,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36936,9 +37546,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -36951,6 +37558,12 @@ msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37355,6 +37968,9 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
+msgid "Theme"
+msgstr ""
+
msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
msgstr ""
@@ -37535,12 +38151,21 @@ msgstr ""
msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
+msgid "There was a problem fetching the latest pipeline status."
+msgstr ""
+
+msgid "There was a problem fetching the pipeline stages."
+msgstr ""
+
msgid "There was a problem fetching the projects"
msgstr ""
msgid "There was a problem fetching users."
msgstr ""
+msgid "There was a problem handling the pipeline data."
+msgstr ""
+
msgid "There was a problem sending the confirmation email"
msgstr ""
@@ -37727,6 +38352,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37865,6 +38493,9 @@ msgstr ""
msgid "This deployment is not waiting for approvals."
msgstr ""
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -38027,6 +38658,9 @@ msgstr ""
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38657,10 +39291,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -38733,6 +39367,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To activate your trial, we need additional details from you."
+msgstr ""
+
msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -38742,6 +39379,9 @@ msgstr ""
msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
msgstr ""
+msgid "To complete registration, we need additional details from you."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38793,9 +39433,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39039,6 +39676,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39132,6 +39772,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39276,7 +39919,7 @@ msgstr ""
msgid "Trigger pipelines for mirror updates"
msgstr ""
-msgid "Trigger pipelines when branches or tags are updated in the upstream repository. Depending on the activity of the upstream repository, this may greatly increase the load on your CI runners. Only enable this if you know they can handle the load."
+msgid "Trigger pipelines when branches or tags are updated in the upstream repository. Depending on the activity of the upstream repository, this may greatly increase the load on your CI runners. Only enable this if you know they can handle the load. %{strong_start}CI will run using the credentials assigned above.%{strong_end} %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Trigger removed."
@@ -39321,6 +39964,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39516,6 +40162,9 @@ msgstr ""
msgid "Unable to find Jira project to import data from."
msgstr ""
+msgid "Unable to fully load the default commit message. You can still apply this suggestion and the commit message will be correct."
+msgstr ""
+
msgid "Unable to generate new instance ID"
msgstr ""
@@ -39525,6 +40174,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39561,6 +40213,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39789,9 +40444,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -39840,9 +40492,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40617,7 +41266,7 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
-msgid "Users can reactivate their account by signing in."
+msgid "Users can reactivate their account by signing in. %{link_start}Learn more%{link_end}"
msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
@@ -41358,7 +42007,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+msgid "Vulnerability|Information related to how the vulnerability was discovered and its impact on the system."
msgstr ""
msgid "Vulnerability|Learn more about this vulnerability and the best way to resolve it."
@@ -41460,6 +42109,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41616,7 +42268,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -41760,6 +42412,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41808,9 +42463,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -41820,9 +42472,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -41870,6 +42519,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -42017,9 +42669,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -42044,12 +42693,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42062,18 +42705,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42086,18 +42717,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42164,30 +42786,51 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong when deleting the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong when fetching the work item. Please try again."
msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
+msgid "WorkItem|Work Item"
+msgstr ""
+
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42251,6 +42894,11 @@ msgstr ""
msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
msgstr ""
+msgid "You are about to clear %{count} image from the cache. Once you confirm, the next time a pipeline runs it must pull an image or tag from Docker Hub. Are you sure?"
+msgid_plural "You are about to clear %{count} images from the cache. Once you confirm, the next time a pipeline runs it must pull an image or tag from Docker Hub. Are you sure?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -42347,7 +42995,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+msgid "You are signed in to GitLab as:"
msgstr ""
msgid "You are trying to upload something other than an image. Please upload a .png, .jpg, .jpeg, .gif, .bmp, .tiff or .ico."
@@ -42518,6 +43166,9 @@ msgstr ""
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
+msgid "You can't add any more, but you can manage your existing members, for example, by removing inactive members and replacing them with new members. To get more members an owner of this namespace can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "You cannot %{action} %{state} users."
msgstr ""
@@ -42877,6 +43528,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42889,6 +43543,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam and has been discarded."
+msgstr ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43218,15 +43875,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-msgstr ""
-
msgid "ZentaoIntegration|Open ZenTao"
msgstr ""
msgid "ZentaoIntegration|Use ZenTao as this project's issue tracker."
msgstr ""
+msgid "ZentaoIntegration|ZenTao"
+msgstr ""
+
msgid "ZentaoIntegration|ZenTao API URL (optional)"
msgstr ""
@@ -43318,9 +43975,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43374,6 +44028,15 @@ msgstr ""
msgid "can contain only lowercase letters, digits, and '_'."
msgstr ""
+msgid "can not be changed for existing notes"
+msgstr ""
+
+msgid "can not be set for this resource"
+msgstr ""
+
+msgid "can not be set for this type of note"
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
@@ -43511,6 +44174,9 @@ msgstr ""
msgid "ciReport|All tools"
msgstr ""
+msgid "ciReport|Analyze a deployed version of your web application for known vulnerabilities by examining it from the outside in. DAST works by simulating external attacks on your application while it is running."
+msgstr ""
+
msgid "ciReport|Automatically apply the patch in a new branch"
msgstr ""
@@ -43627,6 +44293,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43653,6 +44328,9 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
@@ -43866,6 +44544,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44202,14 +44883,16 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
-msgstr ""
-
msgid "metric_id must be unique across a project"
msgstr ""
@@ -44613,9 +45296,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44631,9 +45311,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -44649,6 +45326,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -44768,9 +45451,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44842,6 +45522,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index 7aea2c10400..7506416cba4 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: gl\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:11\n"
msgid " %{start} to %{end}"
msgstr " %{start} a %{end}"
@@ -28,15 +28,9 @@ msgstr " Recollido %{time}"
msgid " Please sign in."
msgstr " Por favor, inicie a sesión."
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr " Probe a %{action} este ficheiro de novo."
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Debe facelo antes do %{grace_period_deadline}."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index 747981d06e7..5356cd4c3bf 100644
--- a/locale/he_IL/gitlab.po
+++ b/locale/he_IL/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: he\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:13\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr " × ×ספה ב־%{time}"
msgid " Please sign in."
msgstr " × × ×œ×”×™×›× ×¡."
-msgid " Target Path"
-msgstr " נתיב היעד"
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr " סוג"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " עליך לעשות ×–×ת לפני %{grace_period_deadline}."
@@ -447,6 +441,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -468,6 +469,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -489,8 +497,8 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -620,9 +628,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -872,6 +877,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -950,7 +958,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -959,9 +967,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -1031,6 +1036,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1170,10 +1178,20 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1486,7 +1504,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1850,9 +1868,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -2045,6 +2072,9 @@ msgstr "על הטמעה ×וטומטית"
msgid "About this feature"
msgstr "על התכונה הזו"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "×“×™×•×•×—×™× ×¢×œ שימוש לרעה"
@@ -2075,9 +2105,6 @@ msgstr "הגישה לחשבון ה־LDAP שלך נדחתה."
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr "ת×ריך תפוגת גישה"
-
msgid "Access expires"
msgstr ""
@@ -2231,6 +2258,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2288,6 +2318,9 @@ msgstr "הוספת מקבץ Kubernetes"
msgid "Add LICENSE"
msgstr "הוספת LICENSE (רישיון)"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2411,6 +2444,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2639,6 +2675,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2720,6 +2759,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2732,6 +2774,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2744,6 +2789,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr "משתמש חדש"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "בעלי×"
@@ -2828,12 +2876,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2873,6 +2927,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2888,6 +2963,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2903,6 +2981,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2912,9 +2996,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2924,6 +3005,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3830,7 +3914,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3944,6 +4028,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3998,6 +4085,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4241,6 +4331,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4356,6 +4449,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4446,6 +4542,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4945,6 +5044,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5189,12 +5291,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5287,6 +5383,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5317,6 +5416,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5338,6 +5440,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5698,9 +5848,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5722,6 +5869,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5812,6 +5962,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6038,6 +6194,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -6053,6 +6212,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6062,24 +6224,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6144,6 +6321,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6250,6 +6430,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6409,9 +6592,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6451,6 +6631,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6493,12 +6676,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6511,9 +6700,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6526,6 +6721,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7106,6 +7304,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -7136,6 +7337,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7303,6 +7510,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7417,6 +7627,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7660,24 +7873,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7735,6 +7936,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7894,6 +8104,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7918,7 +8131,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7933,6 +8146,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7972,22 +8188,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7996,10 +8215,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8011,6 +8248,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8026,10 +8266,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8041,10 +8284,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8059,9 +8299,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8095,13 +8332,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8122,10 +8353,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8137,13 +8365,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8159,9 +8384,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8183,6 +8405,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8225,9 +8450,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8336,10 +8558,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8387,16 +8606,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8432,6 +8642,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8441,6 +8654,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8504,9 +8720,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8552,7 +8765,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8645,9 +8858,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8897,12 +9107,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8915,7 +9131,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9159,9 +9375,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9288,6 +9501,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9321,9 +9537,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9348,6 +9561,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9357,7 +9573,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9369,12 +9585,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9483,6 +9711,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9528,6 +9759,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9537,6 +9771,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9606,6 +9843,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9731,9 +9974,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9791,7 +10031,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9888,6 +10128,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9927,6 +10170,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10236,6 +10482,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10272,6 +10521,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10287,9 +10542,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10407,7 +10659,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10446,9 +10698,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10560,9 +10818,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10587,6 +10842,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10617,9 +10875,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10872,43 +11127,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10923,10 +11160,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11037,19 +11274,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11178,15 +11412,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11243,12 +11495,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11264,10 +11522,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11414,6 +11672,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11468,9 +11729,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11718,6 +11976,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11847,9 +12108,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11868,9 +12126,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12525,6 +12780,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12589,6 +12871,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13248,6 +13533,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13305,6 +13593,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13395,6 +13686,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13440,6 +13734,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13542,9 +13875,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13869,6 +14199,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14146,7 +14479,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14278,6 +14611,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14293,9 +14629,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14377,7 +14710,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14749,6 +15085,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14758,6 +15100,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14999,6 +15344,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15011,6 +15359,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -15131,6 +15482,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15260,9 +15614,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15375,6 +15735,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15799,7 +16162,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15940,9 +16303,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16207,9 +16567,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16237,6 +16594,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16300,9 +16660,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16852,9 +17209,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16867,6 +17221,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16918,9 +17275,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17146,15 +17500,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17194,6 +17557,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17320,9 +17686,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17332,6 +17695,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17536,9 +17935,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17941,13 +18337,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18070,6 +18466,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18088,9 +18487,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18211,6 +18607,113 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18383,6 +18886,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18534,9 +19040,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18612,9 +19115,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18744,6 +19244,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18818,7 +19324,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18848,12 +19354,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18863,9 +19363,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19206,9 +19703,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19287,15 +19781,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19587,6 +20072,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19596,6 +20084,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19653,6 +20150,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19668,6 +20171,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19749,6 +20255,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19770,6 +20279,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19779,6 +20291,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19887,6 +20402,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20089,6 +20610,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20203,6 +20727,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20215,12 +20742,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20368,9 +20901,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20386,12 +20916,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20485,6 +21009,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20503,6 +21030,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20515,6 +21048,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20707,9 +21243,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20752,7 +21285,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20923,10 +21456,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20941,12 +21477,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20956,6 +21486,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20977,7 +21510,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20995,6 +21534,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21004,10 +21546,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21019,6 +21567,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21031,6 +21582,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21286,9 +21840,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21301,6 +21852,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21364,6 +21918,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21373,6 +21930,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21400,15 +21963,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21424,9 +21996,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21436,6 +22026,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21460,6 +22053,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21821,6 +22417,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21929,6 +22528,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22070,6 +22675,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22082,6 +22690,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22100,6 +22711,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22127,9 +22741,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22172,6 +22783,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22181,6 +22799,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22196,6 +22820,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22385,9 +23015,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22661,6 +23288,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22694,6 +23324,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22856,6 +23489,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22976,9 +23612,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23000,6 +23633,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23239,9 +23878,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23278,7 +23914,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23353,7 +23989,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23909,9 +24545,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -24033,6 +24666,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24051,6 +24687,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24069,12 +24708,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24192,6 +24840,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24288,16 +24939,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24406,6 +25057,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24481,6 +25159,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24667,9 +25348,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24764,6 +25442,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24839,6 +25520,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24854,9 +25538,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24905,6 +25586,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24953,6 +25637,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24980,12 +25667,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25064,9 +25745,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25088,7 +25766,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25121,9 +25799,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25205,6 +25880,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25362,6 +26040,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25810,10 +26491,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25961,6 +26642,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25979,9 +26663,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26012,10 +26693,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26030,9 +26711,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26060,6 +26738,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26201,6 +26882,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26970,6 +27654,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27246,6 +27933,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27255,10 +27945,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27306,7 +27999,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27315,13 +28008,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27330,7 +28023,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27348,6 +28041,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27360,9 +28056,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27417,24 +28119,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27492,9 +28188,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27510,9 +28203,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27846,9 +28536,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27903,7 +28590,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27948,7 +28635,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28056,6 +28743,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28365,6 +29055,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28386,9 +29079,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28425,6 +29115,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28530,6 +29223,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28611,9 +29307,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29118,7 +29811,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29217,6 +29910,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29388,6 +30084,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29451,6 +30150,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29469,9 +30171,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29616,6 +30315,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30225,7 +30930,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30658,9 +31366,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30670,9 +31384,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30905,6 +31616,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31115,7 +31829,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31207,12 +31924,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31225,6 +31948,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31240,9 +31969,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31759,7 +32494,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31823,9 +32558,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31877,10 +32609,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31901,6 +32633,26 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31910,7 +32662,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31937,9 +32689,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31952,12 +32716,22 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31967,6 +32741,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31976,18 +32753,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32009,25 +32780,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32036,15 +32813,31 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32078,9 +32871,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32093,21 +32892,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32117,7 +32946,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32138,6 +32967,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32147,16 +32979,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32174,7 +33009,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32192,7 +33027,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32201,9 +33036,6 @@ 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 ""
@@ -32237,9 +33069,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32354,10 +33183,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32549,6 +33378,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32695,6 +33527,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32719,6 +33554,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32845,16 +33689,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32911,6 +33758,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32926,6 +33779,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32941,12 +33800,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32956,6 +33824,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32968,9 +33839,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33019,6 +33902,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33037,12 +33923,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33061,6 +33956,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33070,10 +33968,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33097,6 +33998,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33181,6 +34091,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33322,6 +34235,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33346,7 +34262,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33358,16 +34274,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33427,6 +34346,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33439,15 +34361,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33484,15 +34409,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33631,6 +34553,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33967,6 +34892,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34012,6 +34940,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -34057,9 +34988,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34316,6 +35244,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34485,6 +35416,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34656,6 +35590,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34665,6 +35602,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34704,9 +35644,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34839,9 +35776,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35265,6 +36199,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35409,6 +36346,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35481,9 +36421,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35532,6 +36469,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35697,10 +36637,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36081,8 +37021,12 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36225,12 +37169,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36387,6 +37325,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36420,9 +37364,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36847,9 +37788,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36880,6 +37818,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36892,6 +37833,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36913,12 +37857,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37214,6 +38164,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37223,6 +38176,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37244,6 +38203,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37256,6 +38218,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37541,9 +38506,6 @@ 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 ""
@@ -37685,6 +38647,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37697,7 +38662,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37724,7 +38689,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37733,7 +38698,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37820,6 +38785,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37847,6 +38818,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37973,9 +38947,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38213,6 +39193,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38689,6 +39672,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38770,6 +39756,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38788,7 +39777,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38938,9 +39927,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38986,6 +39972,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39079,6 +40068,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39268,6 +40260,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39472,6 +40467,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39508,6 +40506,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39634,6 +40635,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39814,9 +40818,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39835,9 +40836,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39847,6 +40845,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39904,7 +40905,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40141,6 +41142,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40150,6 +41154,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40963,9 +41970,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40990,6 +41994,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41095,9 +42102,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41119,6 +42123,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41239,6 +42246,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41335,9 +42345,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41383,6 +42390,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41404,6 +42414,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41704,6 +42717,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41749,9 +42765,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41794,13 +42807,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41819,6 +42832,9 @@ msgstr[3] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41966,9 +42982,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41993,12 +43006,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42011,18 +43018,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42035,18 +43030,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42122,6 +43108,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42131,6 +43120,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42341,6 +43333,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42434,6 +43432,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42464,6 +43465,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42548,6 +43552,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42630,10 +43637,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42813,6 +43820,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42825,6 +43835,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43116,7 +44129,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43381,6 +44394,13 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43478,6 +44498,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43556,6 +44585,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43584,9 +44622,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43672,45 +44716,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43729,7 +44734,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43839,6 +44844,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44181,6 +45189,13 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44278,6 +45293,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44397,9 +45418,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44472,6 +45490,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44592,9 +45613,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44655,6 +45673,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44752,9 +45773,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44957,9 +45975,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 9d897c2447e..9ac4b25c567 100644
--- a/locale/hi_IN/gitlab.po
+++ b/locale/hi_IN/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: hi\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index b0ebaab76a8..bf9579e52f1 100644
--- a/locale/hr_HR/gitlab.po
+++ b/locale/hr_HR/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: hr\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -394,6 +388,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -412,6 +412,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -430,8 +436,8 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -544,9 +550,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -787,6 +790,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -865,7 +871,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -874,9 +880,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -946,6 +949,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1081,10 +1087,19 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1387,7 +1402,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1726,9 +1741,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1921,6 +1945,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1951,9 +1978,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2107,6 +2131,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2164,6 +2191,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2287,6 +2317,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2515,6 +2548,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2596,6 +2632,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2608,6 +2647,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2620,6 +2662,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2704,12 +2749,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2749,6 +2800,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2764,6 +2836,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2779,6 +2854,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2788,9 +2869,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2800,6 +2878,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3706,7 +3787,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3820,6 +3901,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3874,6 +3958,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4117,6 +4204,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4231,6 +4321,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4321,6 +4414,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4813,6 +4909,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5056,12 +5155,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5152,6 +5245,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5182,6 +5278,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5203,6 +5302,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5563,9 +5710,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5587,6 +5731,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5677,6 +5824,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5902,6 +6055,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5917,6 +6073,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5926,24 +6085,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6007,6 +6181,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6112,6 +6289,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6271,9 +6451,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6313,6 +6490,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6355,12 +6535,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6373,9 +6559,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6388,6 +6580,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6967,6 +7162,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6997,6 +7195,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7162,6 +7366,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7276,6 +7483,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7519,24 +7729,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7594,6 +7792,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7753,6 +7960,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7777,7 +7987,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7792,6 +8002,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7831,22 +8044,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7855,10 +8071,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7870,6 +8104,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7885,10 +8122,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7900,10 +8140,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7918,9 +8155,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7954,13 +8188,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7981,10 +8209,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7996,13 +8221,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8017,9 +8239,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8041,6 +8260,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8083,9 +8305,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8194,10 +8413,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8245,16 +8461,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8290,6 +8497,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8299,6 +8509,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8362,9 +8575,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8410,7 +8620,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8503,9 +8713,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8755,12 +8962,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8773,7 +8986,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9016,9 +9229,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9145,6 +9355,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9178,9 +9391,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9205,6 +9415,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9214,7 +9427,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9226,12 +9439,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9340,6 +9565,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9385,6 +9613,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9394,6 +9625,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9463,6 +9697,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9586,9 +9826,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9646,7 +9883,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9742,6 +9979,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9781,6 +10021,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10090,6 +10333,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10126,6 +10372,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10141,9 +10393,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10261,7 +10510,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10300,9 +10549,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10414,9 +10669,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10441,6 +10693,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10471,9 +10726,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10726,43 +10978,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10777,10 +11011,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10891,19 +11125,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11032,15 +11263,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11095,12 +11344,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11116,10 +11371,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11266,6 +11521,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11320,9 +11578,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11569,6 +11824,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11698,9 +11956,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11719,9 +11974,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12370,6 +12622,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12433,6 +12712,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13087,6 +13369,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13144,6 +13429,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13234,6 +13522,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13279,6 +13570,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13381,9 +13711,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13708,6 +14035,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13984,7 +14314,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14116,6 +14446,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14131,9 +14464,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14215,7 +14545,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14587,6 +14920,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14596,6 +14935,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14836,6 +15178,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14848,6 +15193,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14968,6 +15316,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15097,9 +15448,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15211,6 +15568,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15634,7 +15994,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15775,9 +16135,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16042,9 +16399,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16072,6 +16426,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16135,9 +16492,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16687,9 +17041,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16702,6 +17053,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16753,9 +17107,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16981,15 +17332,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17029,6 +17389,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17155,9 +17518,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17167,6 +17527,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17371,9 +17767,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17776,13 +18169,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17905,6 +18298,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17923,9 +18319,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18046,6 +18439,111 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18217,6 +18715,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18367,9 +18868,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18445,9 +18943,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18577,6 +19072,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18649,7 +19150,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18679,12 +19180,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18694,9 +19189,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19036,9 +19528,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19117,15 +19606,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19417,6 +19897,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19426,6 +19909,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19483,6 +19975,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19498,6 +19996,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19579,6 +20080,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19600,6 +20104,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19609,6 +20116,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19717,6 +20227,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19918,6 +20434,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20032,6 +20551,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20044,12 +20566,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20197,9 +20725,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20215,12 +20740,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20314,6 +20833,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20332,6 +20854,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20344,6 +20872,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20536,9 +21067,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20581,7 +21109,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20752,10 +21280,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20770,12 +21301,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20785,6 +21310,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20806,7 +21334,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20824,6 +21358,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20833,10 +21370,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20848,6 +21391,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20860,6 +21406,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21115,9 +21664,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21130,6 +21676,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21193,6 +21742,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21202,6 +21754,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21229,15 +21787,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21253,9 +21820,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21265,6 +21850,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21289,6 +21877,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21649,6 +22240,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21757,6 +22351,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21898,6 +22498,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21910,6 +22513,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21928,6 +22534,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21955,9 +22564,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21994,6 +22600,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22003,6 +22615,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22018,6 +22636,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22207,9 +22831,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22483,6 +23104,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22516,6 +23140,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22678,6 +23305,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22798,9 +23428,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22822,6 +23449,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23059,9 +23692,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23098,7 +23728,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23173,7 +23803,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23728,9 +24358,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23851,6 +24478,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23869,6 +24499,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23887,12 +24520,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24010,6 +24652,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24106,16 +24751,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24223,6 +24868,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24298,6 +24970,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24484,9 +25159,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24580,6 +25252,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24655,6 +25330,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24670,9 +25348,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24721,6 +25396,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24769,6 +25447,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24796,12 +25477,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24880,9 +25555,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24904,7 +25576,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24937,9 +25609,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25021,6 +25690,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25177,6 +25849,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25621,10 +26296,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25771,6 +26446,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25789,9 +26467,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25822,10 +26497,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25840,9 +26515,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25870,6 +26542,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26011,6 +26686,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26779,6 +27457,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27055,6 +27736,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27064,10 +27748,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27115,7 +27802,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27124,13 +27811,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27139,7 +27826,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27157,6 +27844,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27169,9 +27859,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27226,24 +27922,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27301,9 +27991,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27319,9 +28006,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27655,9 +28339,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27712,7 +28393,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27757,7 +28438,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27865,6 +28546,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28174,6 +28858,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28195,9 +28882,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28234,6 +28918,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28339,6 +29026,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28420,9 +29110,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28927,7 +29614,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29026,6 +29713,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29197,6 +29887,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29260,6 +29953,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29278,9 +29974,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29425,6 +30118,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30034,7 +30733,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30466,9 +31168,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30478,9 +31186,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30712,6 +31417,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30922,7 +31630,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31009,12 +31720,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31027,6 +31744,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31042,9 +31765,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31558,7 +32287,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31621,9 +32350,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31675,10 +32401,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31699,6 +32425,24 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31708,7 +32452,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31735,9 +32479,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31750,12 +32506,21 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31765,6 +32530,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31774,18 +32542,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31807,25 +32569,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31834,15 +32602,30 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31876,9 +32659,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31891,21 +32680,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31915,7 +32734,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31936,6 +32755,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31945,16 +32767,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31972,7 +32797,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31990,7 +32815,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31999,9 +32824,6 @@ 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 ""
@@ -32035,9 +32857,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32152,10 +32971,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32347,6 +33166,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32482,6 +33304,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32506,6 +33331,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32632,16 +33466,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32698,6 +33535,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32713,6 +33556,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32728,12 +33577,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32743,6 +33601,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32755,9 +33616,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32806,6 +33679,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32824,12 +33700,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32848,6 +33733,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32857,10 +33745,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32884,6 +33775,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32968,6 +33868,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33109,6 +34012,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33133,7 +34039,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33145,16 +34051,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33214,6 +34123,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33226,15 +34138,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33271,15 +34186,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33418,6 +34330,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33754,6 +34669,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33799,6 +34717,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33844,9 +34765,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34102,6 +35020,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34270,6 +35191,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34441,6 +35365,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34450,6 +35377,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34489,9 +35419,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34624,9 +35551,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35050,6 +35974,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35194,6 +36121,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35266,9 +36196,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35317,6 +36244,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35482,10 +36412,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35866,8 +36796,11 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36010,12 +36943,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36172,6 +37099,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36205,9 +37138,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36625,9 +37555,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36658,6 +37585,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36670,6 +37600,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36691,12 +37624,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36991,6 +37930,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37000,6 +37942,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37021,6 +37969,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37033,6 +37984,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37318,9 +38272,6 @@ 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 ""
@@ -37462,6 +38413,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37474,7 +38428,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37501,7 +38455,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37510,7 +38464,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37597,6 +38551,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37624,6 +38584,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37750,9 +38713,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37990,6 +38959,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38464,6 +39436,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38545,6 +39520,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38563,7 +39541,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38713,9 +39691,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38761,6 +39736,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38854,6 +39832,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39043,6 +40024,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39247,6 +40231,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39283,6 +40270,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39409,6 +40399,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39589,9 +40582,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39610,9 +40600,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39622,6 +40609,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39679,7 +40669,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39916,6 +40906,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39925,6 +40918,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40735,9 +41731,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40762,6 +41755,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40867,9 +41863,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40891,6 +41884,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41011,6 +42007,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41107,9 +42106,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41155,6 +42151,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41176,6 +42175,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41476,6 +42478,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41521,9 +42526,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41566,13 +42568,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41590,6 +42592,9 @@ msgstr[2] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41737,9 +42742,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41764,12 +42766,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41782,18 +42778,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41806,18 +42790,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41893,6 +42868,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41902,6 +42880,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42112,6 +43093,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42205,6 +43192,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42235,6 +43225,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42319,6 +43312,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42400,10 +43396,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42583,6 +43579,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42595,6 +43594,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42886,7 +43888,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43147,6 +44149,12 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43243,6 +44251,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43321,6 +44338,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43348,9 +44374,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43435,45 +44467,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43492,7 +44485,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43600,6 +44593,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43939,6 +44935,12 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44035,6 +45037,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44152,9 +45160,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44227,6 +45232,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44347,9 +45355,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44410,6 +45415,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44503,9 +45511,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44707,9 +45712,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index 3cf13e43578..cd211b32336 100644
--- a/locale/hu_HU/gitlab.po
+++ b/locale/hu_HU/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: hu\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/hy_AM/gitlab.po b/locale/hy_AM/gitlab.po
index 5bf973b26a6..e65669e8e52 100644
--- a/locale/hy_AM/gitlab.po
+++ b/locale/hy_AM/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: hy-AM\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index df6be9194a6..c861962a11b 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: id\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -288,6 +282,10 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -300,6 +298,10 @@ msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -312,8 +314,8 @@ msgid "%d project selected"
msgid_plural "%d projects selected"
msgstr[0] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgid "%d second"
@@ -392,9 +394,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -617,6 +616,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -695,7 +697,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -704,9 +706,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -776,6 +775,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -903,10 +905,17 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1189,7 +1198,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1478,9 +1487,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1673,6 +1691,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1703,9 +1724,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1859,6 +1877,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -1916,6 +1937,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2039,6 +2063,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2267,6 +2294,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2348,6 +2378,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2360,6 +2393,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2372,6 +2408,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2456,12 +2495,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2501,6 +2546,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2516,6 +2582,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2531,6 +2600,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2540,9 +2615,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2552,6 +2624,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3458,7 +3533,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3572,6 +3647,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3626,6 +3704,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3869,6 +3950,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -3981,6 +4065,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4071,6 +4158,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4549,6 +4639,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4790,12 +4883,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -4882,6 +4969,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -4912,6 +5002,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -4933,6 +5026,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5293,9 +5434,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5317,6 +5455,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5407,6 +5548,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5630,6 +5777,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5645,6 +5795,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5654,24 +5807,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5733,6 +5901,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5836,6 +6007,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -5995,9 +6169,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6037,6 +6208,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6079,12 +6253,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6097,9 +6277,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6112,6 +6298,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6689,6 +6878,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6719,6 +6911,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -6880,6 +7078,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -6994,6 +7195,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7237,24 +7441,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7312,6 +7504,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7471,6 +7672,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7495,7 +7699,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7510,6 +7714,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7549,22 +7756,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7573,10 +7783,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7588,6 +7816,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7603,10 +7834,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7618,10 +7852,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7636,9 +7867,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7672,13 +7900,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7699,10 +7921,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7714,13 +7933,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7733,9 +7949,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7757,6 +7970,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7799,9 +8015,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -7910,10 +8123,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -7961,16 +8171,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8006,6 +8207,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8015,6 +8219,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8078,9 +8285,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8126,7 +8330,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8219,9 +8423,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8471,12 +8672,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8489,7 +8696,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8730,9 +8937,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -8859,6 +9063,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -8892,9 +9099,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -8919,6 +9123,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -8928,7 +9135,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -8940,12 +9147,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9054,6 +9273,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9099,6 +9321,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9108,6 +9333,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9177,6 +9405,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9296,9 +9530,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9356,7 +9587,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9450,6 +9681,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9489,6 +9723,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9798,6 +10035,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9834,6 +10074,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9849,9 +10095,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -9969,7 +10212,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10008,9 +10251,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10122,9 +10371,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10149,6 +10395,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10179,9 +10428,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10434,43 +10680,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10485,10 +10713,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10599,19 +10827,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10740,15 +10965,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10799,12 +11042,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10820,10 +11069,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -10970,6 +11219,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11024,9 +11276,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11271,6 +11520,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11400,9 +11652,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11421,9 +11670,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12060,6 +12306,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12121,6 +12394,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12765,6 +13041,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12822,6 +13101,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -12912,6 +13194,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -12957,6 +13242,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13059,9 +13383,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13386,6 +13707,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13660,7 +13984,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13792,6 +14116,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13807,9 +14134,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -13891,7 +14215,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14263,6 +14590,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14272,6 +14605,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14510,6 +14846,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14522,6 +14861,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14642,6 +14984,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14771,9 +15116,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -14883,6 +15234,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15304,7 +15658,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15445,9 +15799,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15712,9 +16063,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15742,6 +16090,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15805,9 +16156,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16357,9 +16705,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16372,6 +16717,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16423,9 +16771,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16651,15 +16996,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16699,6 +17053,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16825,9 +17182,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -16837,6 +17191,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17041,9 +17431,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17446,13 +17833,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17575,6 +17962,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17593,9 +17983,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17716,6 +18103,107 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -17885,6 +18373,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18033,9 +18524,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18111,9 +18599,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18243,6 +18728,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18311,7 +18802,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18341,12 +18832,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18356,9 +18841,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18696,9 +19178,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18777,15 +19256,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19077,6 +19547,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19086,6 +19559,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19143,6 +19625,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19158,6 +19646,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19239,6 +19730,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19260,6 +19754,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19269,6 +19766,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19377,6 +19877,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19576,6 +20082,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19690,6 +20199,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19702,12 +20214,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -19855,9 +20373,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -19873,12 +20388,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -19972,6 +20481,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -19990,6 +20502,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20002,6 +20520,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20194,9 +20715,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20239,7 +20757,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20410,10 +20928,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20428,12 +20949,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20443,6 +20958,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20464,7 +20982,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20482,6 +21006,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20491,10 +21018,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20506,6 +21039,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20518,6 +21054,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20773,9 +21312,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20788,6 +21324,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -20851,6 +21390,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -20860,6 +21402,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -20887,15 +21435,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -20911,9 +21468,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -20923,6 +21498,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -20947,6 +21525,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21305,6 +21886,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21413,6 +21997,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21554,6 +22144,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21566,6 +22159,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21584,6 +22180,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21611,9 +22210,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21638,6 +22234,10 @@ msgid "LicenseCompliance|License Compliance detected %d new license and policy v
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
msgstr[0] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21647,6 +22247,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21662,6 +22268,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -21851,9 +22463,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22127,6 +22736,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22160,6 +22772,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22322,6 +22937,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22442,9 +23060,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22466,6 +23081,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22699,9 +23320,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22738,7 +23356,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22813,7 +23431,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23366,9 +23984,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23487,6 +24102,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23505,6 +24123,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23523,12 +24144,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23646,6 +24276,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23742,16 +24375,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23857,6 +24490,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -23932,6 +24592,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24118,9 +24781,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24212,6 +24872,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24287,6 +24950,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24302,9 +24968,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24353,6 +25016,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24401,6 +25067,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24428,12 +25097,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24512,9 +25175,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24536,7 +25196,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24569,9 +25229,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24653,6 +25310,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24807,6 +25467,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25243,10 +25906,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25391,6 +26054,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25409,9 +26075,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25442,10 +26105,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25460,9 +26123,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25490,6 +26150,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25631,6 +26294,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26397,6 +27063,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26673,6 +27342,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26682,10 +27354,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26733,7 +27408,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26742,13 +27417,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26757,7 +27432,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26775,6 +27450,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26787,9 +27465,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -26844,24 +27528,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -26919,9 +27597,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -26937,9 +27612,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27273,9 +27945,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27330,7 +27999,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27375,7 +28044,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27483,6 +28152,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27792,6 +28464,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -27813,9 +28488,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -27852,6 +28524,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -27957,6 +28632,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28038,9 +28716,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28545,7 +29220,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28644,6 +29319,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -28815,6 +29493,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -28878,6 +29559,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -28896,9 +29580,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29043,6 +29724,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29652,7 +30339,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30082,9 +30772,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30094,9 +30790,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30326,6 +31019,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30536,7 +31232,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30613,12 +31312,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30631,6 +31336,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30646,9 +31357,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31156,7 +31873,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31217,9 +31934,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31271,10 +31985,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31295,6 +32009,20 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31304,7 +32032,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31331,9 +32059,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31346,12 +32086,19 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31361,6 +32108,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31370,18 +32120,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31403,25 +32147,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31430,15 +32180,28 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31472,9 +32235,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31487,21 +32256,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31511,7 +32310,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31532,6 +32331,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31541,16 +32343,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31568,7 +32373,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31586,7 +32391,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31595,9 +32400,6 @@ 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 ""
@@ -31631,9 +32433,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31748,10 +32547,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -31943,6 +32742,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32056,6 +32858,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32080,6 +32885,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32206,16 +33020,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32272,6 +33089,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32287,6 +33110,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32302,12 +33131,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32317,6 +33155,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32329,9 +33170,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32380,6 +33233,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32398,12 +33254,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32422,6 +33287,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32431,10 +33299,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32458,6 +33329,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32542,6 +33422,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32683,6 +33566,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32707,7 +33593,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32719,16 +33605,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -32788,6 +33677,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -32800,15 +33692,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -32845,15 +33740,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -32992,6 +33884,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33328,6 +34223,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33373,6 +34271,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33418,9 +34319,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33674,6 +34572,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -33840,6 +34741,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34011,6 +34915,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34020,6 +34927,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34059,9 +34969,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34194,9 +35101,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34620,6 +35524,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34764,6 +35671,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -34836,9 +35746,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -34887,6 +35794,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35052,10 +35962,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35436,8 +36346,9 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35580,12 +36491,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35742,6 +36647,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35775,9 +36686,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36181,9 +37089,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36214,6 +37119,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36226,6 +37134,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36247,12 +37158,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36545,6 +37462,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36554,6 +37474,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36575,6 +37501,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36587,6 +37516,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -36872,9 +37804,6 @@ 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 ""
@@ -37016,6 +37945,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37028,7 +37960,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37055,7 +37987,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37064,7 +37996,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37151,6 +38083,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37178,6 +38116,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37304,9 +38245,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37544,6 +38491,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38014,6 +38964,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38095,6 +39048,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38113,7 +39069,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38263,9 +39219,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38311,6 +39264,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38404,6 +39360,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38593,6 +39552,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -38797,6 +39759,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -38833,6 +39798,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -38959,6 +39927,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39139,9 +40110,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39160,9 +40128,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39172,6 +40137,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39229,7 +40197,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39466,6 +40434,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39475,6 +40446,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40279,9 +41253,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40306,6 +41277,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40411,9 +41385,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40435,6 +41406,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40555,6 +41529,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40651,9 +41628,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40699,6 +41673,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40720,6 +41697,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41020,6 +42000,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41065,9 +42048,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41110,13 +42090,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41132,6 +42112,9 @@ msgstr[0] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41279,9 +42262,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41306,12 +42286,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41324,18 +42298,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41348,18 +42310,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41435,6 +42388,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41444,6 +42400,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41654,6 +42613,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41747,6 +42712,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -41777,6 +42745,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -41861,6 +42832,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -41940,10 +42914,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42123,6 +43097,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42135,6 +43112,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42426,7 +43406,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42679,6 +43659,10 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -42773,6 +43757,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -42851,6 +43844,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -42876,9 +43878,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -42961,45 +43969,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43018,7 +43987,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43122,6 +44091,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43455,6 +44427,10 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43549,6 +44525,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43662,9 +44644,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43737,6 +44716,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -43857,9 +44839,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -43920,6 +44899,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44005,9 +44987,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44207,9 +45186,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ig_NG/gitlab.po b/locale/ig_NG/gitlab.po
index 7113067d3aa..5a765695121 100644
--- a/locale/ig_NG/gitlab.po
+++ b/locale/ig_NG/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ig\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -288,6 +282,10 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -300,6 +298,10 @@ msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -312,8 +314,8 @@ msgid "%d project selected"
msgid_plural "%d projects selected"
msgstr[0] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgid "%d second"
@@ -392,9 +394,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -617,6 +616,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -695,7 +697,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -704,9 +706,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -776,6 +775,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -903,10 +905,17 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1189,7 +1198,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1478,9 +1487,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1673,6 +1691,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1703,9 +1724,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1859,6 +1877,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -1916,6 +1937,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2039,6 +2063,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2267,6 +2294,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2348,6 +2378,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2360,6 +2393,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2372,6 +2408,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2456,12 +2495,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2501,6 +2546,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2516,6 +2582,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2531,6 +2600,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2540,9 +2615,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2552,6 +2624,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3458,7 +3533,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3572,6 +3647,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3626,6 +3704,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3869,6 +3950,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -3981,6 +4065,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4071,6 +4158,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4549,6 +4639,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4790,12 +4883,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -4882,6 +4969,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -4912,6 +5002,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -4933,6 +5026,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5293,9 +5434,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5317,6 +5455,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5407,6 +5548,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5630,6 +5777,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5645,6 +5795,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5654,24 +5807,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5733,6 +5901,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5836,6 +6007,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -5995,9 +6169,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6037,6 +6208,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6079,12 +6253,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6097,9 +6277,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6112,6 +6298,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6689,6 +6878,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6719,6 +6911,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -6880,6 +7078,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -6994,6 +7195,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7237,24 +7441,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7312,6 +7504,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7471,6 +7672,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7495,7 +7699,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7510,6 +7714,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7549,22 +7756,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7573,10 +7783,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7588,6 +7816,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7603,10 +7834,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7618,10 +7852,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7636,9 +7867,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7672,13 +7900,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7699,10 +7921,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7714,13 +7933,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7733,9 +7949,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7757,6 +7970,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7799,9 +8015,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -7910,10 +8123,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -7961,16 +8171,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8006,6 +8207,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8015,6 +8219,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8078,9 +8285,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8126,7 +8330,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8219,9 +8423,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8471,12 +8672,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8489,7 +8696,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8730,9 +8937,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -8859,6 +9063,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -8892,9 +9099,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -8919,6 +9123,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -8928,7 +9135,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -8940,12 +9147,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9054,6 +9273,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9099,6 +9321,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9108,6 +9333,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9177,6 +9405,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9296,9 +9530,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9356,7 +9587,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9450,6 +9681,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9489,6 +9723,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9798,6 +10035,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9834,6 +10074,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9849,9 +10095,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -9969,7 +10212,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10008,9 +10251,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10122,9 +10371,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10149,6 +10395,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10179,9 +10428,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10434,43 +10680,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10485,10 +10713,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10599,19 +10827,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10740,15 +10965,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10799,12 +11042,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10820,10 +11069,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -10970,6 +11219,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11024,9 +11276,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11271,6 +11520,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11400,9 +11652,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11421,9 +11670,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12060,6 +12306,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12121,6 +12394,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12765,6 +13041,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12822,6 +13101,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -12912,6 +13194,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -12957,6 +13242,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13059,9 +13383,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13386,6 +13707,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13660,7 +13984,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13792,6 +14116,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13807,9 +14134,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -13891,7 +14215,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14263,6 +14590,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14272,6 +14605,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14510,6 +14846,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14522,6 +14861,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14642,6 +14984,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14771,9 +15116,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -14883,6 +15234,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15304,7 +15658,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15445,9 +15799,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15712,9 +16063,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15742,6 +16090,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15805,9 +16156,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16357,9 +16705,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16372,6 +16717,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16423,9 +16771,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16651,15 +16996,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16699,6 +17053,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16825,9 +17182,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -16837,6 +17191,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17041,9 +17431,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17446,13 +17833,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17575,6 +17962,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17593,9 +17983,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17716,6 +18103,107 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -17885,6 +18373,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18033,9 +18524,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18111,9 +18599,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18243,6 +18728,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18311,7 +18802,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18341,12 +18832,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18356,9 +18841,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18696,9 +19178,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18777,15 +19256,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19077,6 +19547,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19086,6 +19559,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19143,6 +19625,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19158,6 +19646,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19239,6 +19730,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19260,6 +19754,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19269,6 +19766,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19377,6 +19877,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19576,6 +20082,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19690,6 +20199,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19702,12 +20214,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -19855,9 +20373,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -19873,12 +20388,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -19972,6 +20481,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -19990,6 +20502,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20002,6 +20520,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20194,9 +20715,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20239,7 +20757,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20410,10 +20928,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20428,12 +20949,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20443,6 +20958,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20464,7 +20982,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20482,6 +21006,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20491,10 +21018,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20506,6 +21039,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20518,6 +21054,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20773,9 +21312,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20788,6 +21324,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -20851,6 +21390,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -20860,6 +21402,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -20887,15 +21435,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -20911,9 +21468,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -20923,6 +21498,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -20947,6 +21525,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21305,6 +21886,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21413,6 +21997,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21554,6 +22144,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21566,6 +22159,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21584,6 +22180,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21611,9 +22210,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21638,6 +22234,10 @@ msgid "LicenseCompliance|License Compliance detected %d new license and policy v
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
msgstr[0] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21647,6 +22247,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21662,6 +22268,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -21851,9 +22463,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22127,6 +22736,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22160,6 +22772,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22322,6 +22937,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22442,9 +23060,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22466,6 +23081,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22699,9 +23320,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22738,7 +23356,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22813,7 +23431,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23366,9 +23984,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23487,6 +24102,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23505,6 +24123,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23523,12 +24144,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23646,6 +24276,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23742,16 +24375,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23857,6 +24490,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -23932,6 +24592,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24118,9 +24781,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24212,6 +24872,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24287,6 +24950,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24302,9 +24968,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24353,6 +25016,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24401,6 +25067,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24428,12 +25097,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24512,9 +25175,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24536,7 +25196,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24569,9 +25229,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24653,6 +25310,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24807,6 +25467,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25243,10 +25906,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25391,6 +26054,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25409,9 +26075,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25442,10 +26105,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25460,9 +26123,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25490,6 +26150,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25631,6 +26294,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26397,6 +27063,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26673,6 +27342,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26682,10 +27354,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26733,7 +27408,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26742,13 +27417,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26757,7 +27432,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26775,6 +27450,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26787,9 +27465,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -26844,24 +27528,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -26919,9 +27597,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -26937,9 +27612,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27273,9 +27945,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27330,7 +27999,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27375,7 +28044,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27483,6 +28152,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27792,6 +28464,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -27813,9 +28488,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -27852,6 +28524,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -27957,6 +28632,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28038,9 +28716,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28545,7 +29220,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28644,6 +29319,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -28815,6 +29493,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -28878,6 +29559,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -28896,9 +29580,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29043,6 +29724,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29652,7 +30339,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30082,9 +30772,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30094,9 +30790,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30326,6 +31019,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30536,7 +31232,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30613,12 +31312,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30631,6 +31336,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30646,9 +31357,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31156,7 +31873,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31217,9 +31934,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31271,10 +31985,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31295,6 +32009,20 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31304,7 +32032,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31331,9 +32059,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31346,12 +32086,19 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31361,6 +32108,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31370,18 +32120,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31403,25 +32147,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31430,15 +32180,28 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31472,9 +32235,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31487,21 +32256,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31511,7 +32310,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31532,6 +32331,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31541,16 +32343,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31568,7 +32373,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31586,7 +32391,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31595,9 +32400,6 @@ 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 ""
@@ -31631,9 +32433,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31748,10 +32547,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -31943,6 +32742,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32056,6 +32858,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32080,6 +32885,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32206,16 +33020,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32272,6 +33089,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32287,6 +33110,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32302,12 +33131,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32317,6 +33155,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32329,9 +33170,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32380,6 +33233,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32398,12 +33254,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32422,6 +33287,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32431,10 +33299,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32458,6 +33329,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32542,6 +33422,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32683,6 +33566,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32707,7 +33593,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32719,16 +33605,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -32788,6 +33677,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -32800,15 +33692,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -32845,15 +33740,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -32992,6 +33884,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33328,6 +34223,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33373,6 +34271,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33418,9 +34319,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33674,6 +34572,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -33840,6 +34741,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34011,6 +34915,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34020,6 +34927,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34059,9 +34969,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34194,9 +35101,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34620,6 +35524,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34764,6 +35671,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -34836,9 +35746,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -34887,6 +35794,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35052,10 +35962,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35436,8 +36346,9 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35580,12 +36491,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35742,6 +36647,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35775,9 +36686,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36181,9 +37089,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36214,6 +37119,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36226,6 +37134,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36247,12 +37158,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36545,6 +37462,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36554,6 +37474,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36575,6 +37501,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36587,6 +37516,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -36872,9 +37804,6 @@ 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 ""
@@ -37016,6 +37945,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37028,7 +37960,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37055,7 +37987,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37064,7 +37996,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37151,6 +38083,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37178,6 +38116,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37304,9 +38245,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37544,6 +38491,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38014,6 +38964,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38095,6 +39048,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38113,7 +39069,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38263,9 +39219,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38311,6 +39264,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38404,6 +39360,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38593,6 +39552,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -38797,6 +39759,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -38833,6 +39798,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -38959,6 +39927,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39139,9 +40110,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39160,9 +40128,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39172,6 +40137,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39229,7 +40197,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39466,6 +40434,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39475,6 +40446,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40279,9 +41253,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40306,6 +41277,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40411,9 +41385,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40435,6 +41406,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40555,6 +41529,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40651,9 +41628,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40699,6 +41673,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40720,6 +41697,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41020,6 +42000,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41065,9 +42048,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41110,13 +42090,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41132,6 +42112,9 @@ msgstr[0] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41279,9 +42262,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41306,12 +42286,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41324,18 +42298,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41348,18 +42310,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41435,6 +42388,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41444,6 +42400,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41654,6 +42613,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41747,6 +42712,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -41777,6 +42745,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -41861,6 +42832,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -41940,10 +42914,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42123,6 +43097,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42135,6 +43112,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42426,7 +43406,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42679,6 +43659,10 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -42773,6 +43757,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -42851,6 +43844,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -42876,9 +43878,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -42961,45 +43969,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43018,7 +43987,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43122,6 +44091,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43455,6 +44427,10 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43549,6 +44525,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43662,9 +44644,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43737,6 +44716,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -43857,9 +44839,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -43920,6 +44899,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44005,9 +44987,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44207,9 +45186,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/is_IS/gitlab.po b/locale/is_IS/gitlab.po
index 5eb703620d9..71b88d517d4 100644
--- a/locale/is_IS/gitlab.po
+++ b/locale/is_IS/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: is\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index 9d7adc17011..f3d4e247c66 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: it\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr " Per favore effettua il login."
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr " Provare a %{action} di nuovo questo file."
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Devi farlo prima di %{grace_period_deadline}."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "%d altro commento"
msgstr[1] "Altri %d commenti"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} sarà rimosso! Sei sicuro?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr "Riguardo il rilascio automatico"
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Segnalazioni di abuso"
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "Ago"
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "La Branch esiste già"
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Naviga direttori"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr "Numero di nodi"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr "Commit"
msgid "CommitMessage|Add %{file_name}"
msgstr "Aggiungi %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr "Ambienti"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Nuovo ambiente"
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr "Aggiornato"
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Esplora progetti"
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr "Feb"
msgid "February"
msgstr "Febbraio"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Dalla creazione di un issue fino al rilascio in produzione"
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr "Ultimo aggiornamento"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr "Nuova directory"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr "Nuova pianficazione"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Nuovo snippet"
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Solo i membri del progetto possono commentare."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "Si apre in una nuova finestra"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr "Proprietario"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipeline"
@@ -26873,10 +27551,13 @@ msgstr "Grafici pipeline"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr "Seleziona una branch di destinazione"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "Carica un nuovo file"
@@ -39385,9 +40364,6 @@ msgstr "Carica file"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr "clicca per caricare"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index 92cb6be15d8..65b79162bbd 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ja\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:14\n"
msgid " %{start} to %{end}"
msgstr " %{start} ã‹ã‚‰ %{end} ã¾ã§"
@@ -28,15 +28,9 @@ msgstr "åŽé›†æ—¥æ™‚: %{time}"
msgid " Please sign in."
msgstr " サインインã—ã¦ãã ã•ã„。"
-msgid " Target Path"
-msgstr " 対象パス"
-
msgid " Try to %{action} this file again."
msgstr " ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã‚‚ã†ä¸€åº¦ %{action} ã—ã¦ã¿ã¦ãã ã•ã„。"
-msgid " Type"
-msgstr " タイプ"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " %{grace_period_deadline} ã®å‰ã«ã“れを行ã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -288,6 +282,10 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] "%d 件以上ã®ã‚³ãƒ¡ãƒ³ãƒˆ"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d 件ã®æœªå®Œäº†ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
@@ -300,6 +298,10 @@ msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "%d 件ã®å€‹äººãƒ—ロジェクトãŒå‰Šé™¤ã•ã‚Œã¾ã™ã€‚復元ã§ãã¾ã›ã‚“。"
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d 件ã®ãƒžãƒ¼ã‚¸æ¸ˆã¿ã®ã‚³ãƒŸãƒƒãƒˆ"
@@ -312,9 +314,9 @@ msgid "%d project selected"
msgid_plural "%d projects selected"
msgstr[0] "%d 件ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžæ¸ˆã¿"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d件ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«è­¦å‘Šã‚ã‚Š"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -392,9 +394,6 @@ msgstr ""
msgid "%{address} is an invalid IP address range"
msgstr "%{address} ã¯ç„¡åŠ¹ãªIPアドレス範囲ã§ã™"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "インスタンスã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ç™»éŒ²ã‚’カスタマイズ/無効化ã™ã‚‹æ–¹æ³•ã®%{anchorOpen}詳細を表示ã™ã‚‹%{anchorClose}。"
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link} ㌠%{original_issue} ã‚’ %{new_issue} ã«è¤‡è£½ã—ã¾ã—ãŸã€‚"
@@ -617,6 +616,9 @@ msgstr "%{integrations_link_start}インテグレーション%{link_end} を利ç
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType}を削除ã—ã¾ã™ï¼ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "%{issueType} アクション"
@@ -693,10 +695,10 @@ msgid "%{level_name} is not allowed since the fork source project has lower visi
msgstr "%{level_name} ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。フォークã—ãŸã‚½ãƒ¼ã‚¹ãƒ—ロジェクトã¯ã‚ˆã‚Šå¯è¦–性ãŒä½Žã„ã‹ã‚‰ã§ã™ã€‚"
msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "%{linkStart}詳細ã¯ã“ã¡ã‚‰ã€‚%{linkEnd}"
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "ロールã«ã¤ã„ã¦%{link_start}ã‚‚ã£ã¨è©³ã—ã%{link_end}。"
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "タイトルã‹ã‚‰ %{link_start} %{draft_snippet} ã®ãƒ—レフィックス %{link_end} を削除ã—ã¦ã€æº–å‚™ãŒã§ã次第マージリクエストをマージã§ãるよã†ã«ã™ã‚‹ã€‚"
@@ -704,9 +706,6 @@ msgstr "タイトルã‹ã‚‰ %{link_start} %{draft_snippet} ã®ãƒ—レフィックã
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "タイトルã®å…ˆé ­ã« %{link_start} %{draft_snippet} %{link_end} を書ã„ã¦ã€ä½œæ¥­ä¸­ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒæº–å‚™ãŒã§ãã‚‹ã¾ã§ãƒžãƒ¼ã‚¸ã•ã‚Œãªã„よã†ã«ã—ã¾ã™ã€‚"
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr "%{link_start}GitLab Inc.ã¯ã©ã®ã‚ˆã†ãªæƒ…報をåŽé›†ã—ã¦ã„ã¾ã™ã‹ï¼Ÿ%{link_end}"
@@ -776,6 +775,9 @@ msgstr "åå‰ç©ºé–“ã® %{name}(%{url}) ã«ã¯ 共有ランナーパイプライ
msgid "%{name}, confirm your email address now!"
msgstr "%{name}ã•ã‚“ã€ä»Šã™ãメールアドレスを確èªã—ã¦ãã ã•ã„ï¼"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} æ—¥"
@@ -903,11 +905,18 @@ msgstr "%{spanStart} 関数内%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} ã‹ã‚‰ %{end} ã¾ã§"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr "%{strongOpen}警告:%{strongClose} SAML グループ リンクã«ã‚ˆã‚Šã€GitLab ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’自動的ã«å‰Šé™¤ã—ã¾ã™ã€‚"
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
-msgstr "%{strongStart}ヒント:%{strongEnd} %{linkStart}ã“れらã®ã‚¬ã‚¤ãƒ‰ãƒ©ã‚¤ãƒ³%{linkEnd}ã«å¾“ã£ã¦ãƒ­ãƒ¼ã‚«ãƒ«ã§ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -1189,8 +1198,8 @@ msgstr "+%{more_reviewers_count} 人以上ã®ãƒ¬ãƒ“ューア"
msgid "+%{tags} more"
msgstr "+%{tags} 以上"
-msgid ", and "
-msgstr ", 㨠"
+msgid ", "
+msgstr ""
msgid ", or "
msgstr "ã€ã¾ãŸã¯"
@@ -1478,9 +1487,18 @@ msgstr "%{name} ã®æ–°ã—ã„リリース %{tag} ãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚ 詳ç
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "%{name} ã®æ–°ã—ã„リリース %{tag} ãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚ リリースページã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦è©³ç´°ã‚’確èªã—ã¦ãã ã•ã„:"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "æ–°ã—ã„å½è£…トークンãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "公開エピックã®è¦ªã‚¨ãƒ”ックã«éžå…¬é–‹ã‚¨ãƒ”ックã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
@@ -1673,6 +1691,9 @@ msgstr "自動デプロイã«ã¤ã„ã¦"
msgid "About this feature"
msgstr "ã“ã®æ©Ÿèƒ½ã«ã¤ã„ã¦"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "ä¸æ­£åˆ©ç”¨ãƒ¬ãƒãƒ¼ãƒˆ"
@@ -1703,9 +1724,6 @@ msgstr "ã‚ãªãŸã® LDAP アカウントã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ
msgid "Access denied: %{error}"
msgstr "アクセス拒å¦: %{error}"
-msgid "Access expiration date"
-msgstr "アクセス有効期é™"
-
msgid "Access expires"
msgstr "アクセスã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¾ã™"
@@ -1842,7 +1860,7 @@ msgid "AccountValidation|In order to use free CI/CD minutes on shared runners, y
msgstr ""
msgid "AccountValidation|Learn more."
-msgstr ""
+msgstr "詳ã—ã見る"
msgid "AccountValidation|Looks like you’ll need to validate your account to use free CI/CD minutes"
msgstr ""
@@ -1859,6 +1877,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr "アクション"
@@ -1916,6 +1937,9 @@ msgstr "Kubernetes クラスターを追加"
msgid "Add LICENSE"
msgstr "ライセンスã®è¿½åŠ "
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2039,6 +2063,9 @@ msgstr "コメントã™ã‚‹"
msgid "Add comment to design"
msgstr "デザインã«ã‚³ãƒ¡ãƒ³ãƒˆã‚’追加"
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr "コミットメッセージをコメントã¨ã—ã¦Asana タスクã«è¿½åŠ ã—ã¾ã™ã€‚ %{docs_link}"
@@ -2267,6 +2294,9 @@ msgstr "イシューをエピックã«è¿½åŠ ã€‚"
msgid "Adds email participant(s)."
msgstr "メールå‚加者を追加。"
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr "GitLab UI ã®æ›´æ–°é »åº¦ã‚’調整ã—ã¾ã™ã€‚"
@@ -2348,6 +2378,9 @@ msgstr "ゲスト"
msgid "AdminArea|Included Free in license"
msgstr "ライセンスã«ç„¡æ–™ã§å«ã¾ã‚Œã¦ã„ã¾ã™"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "最新ã®ã‚°ãƒ«ãƒ¼ãƒ—"
@@ -2360,6 +2393,9 @@ msgstr "最新ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼"
msgid "AdminArea|Maintainer"
msgstr "メンテナー"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr "最å°ã‚¢ã‚¯ã‚»ã‚¹"
@@ -2372,6 +2408,9 @@ msgstr "æ–°è¦ãƒ—ロジェクト"
msgid "AdminArea|New user"
msgstr "æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "オーナー"
@@ -2456,12 +2495,18 @@ msgstr "プロジェクト %{projectName} を削除ã—ã¾ã™ã‹?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps ドメイン"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2501,6 +2546,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2516,6 +2582,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr "必須パイプライン設定"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2531,6 +2600,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2540,9 +2615,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2552,6 +2624,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "アクティブユーザー"
@@ -3009,7 +3084,7 @@ msgid "After it expires, you can't use merge approvals, epics, or many security
msgstr ""
msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
-msgstr ""
+msgstr "エクスãƒãƒ¼ãƒˆãŒå®Œäº†ã—ãŸã‚‰ã€é€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã¾ãŸã¯ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンロードã—ã¾ã™ã€‚ ãã®å¾Œã€åˆ¥ã® GitLab インスタンス㮠%{strong_text_start}æ–°ã—ã„グループã®ä½œæˆ%{strong_text_end} ページã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ ファイルをインãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚"
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
@@ -3458,7 +3533,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr "é¸æŠžã—ãŸãƒ—ロトコルã®ã¿ã‚’ Git アクセスã«ä½¿ç”¨ã§ãるよã†ã«ã—ã¾ã™ã€‚"
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3483,7 +3558,7 @@ msgid "Allow public access to pipelines and job details, including output logs a
msgstr ""
msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
+msgstr "サブグループãŒç‹¬è‡ªã®2è¦ç´ èªè¨¼ãƒ«ãƒ¼ãƒ«ã‚’設定ã§ãるよã†ã«ã™ã‚‹"
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3572,6 +3647,9 @@ msgstr "Amazon èªè¨¼ã¯ %{link_start} æ­£ã—ã設定 %{link_end} ã§ãã¦ã„ã
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr "エンタープライズユーザーGitLabアカウントãŒã‚ãªãŸã®çµ„ç¹”ã«ã‚ˆã£ã¦ä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
@@ -3626,6 +3704,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "Blobã®ãƒ—レビュー中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3869,6 +3950,9 @@ msgstr "検索履歴ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred while parsing the file."
msgstr "ファイルã®ãƒ‘ース中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "エピックã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -3925,7 +4009,7 @@ msgid "An error occurred while updating assignees."
msgstr "担当者ã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while updating configuration."
-msgstr ""
+msgstr "設定ã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while updating labels."
msgstr ""
@@ -3981,6 +4065,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr "未èªè¨¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼"
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "プロジェクト環境ã®ç¢ºèªä¸­ã«äºˆæœŸã—ãªã„エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -4071,6 +4158,9 @@ msgstr "ä»»æ„ã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³"
msgid "Any namespace"
msgstr "ä»»æ„ã®ãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "アプリID"
@@ -4185,7 +4275,7 @@ msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the
msgstr ""
msgid "ApplicationSettings|Save changes"
-msgstr ""
+msgstr "変更をä¿å­˜"
msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
msgstr ""
@@ -4322,7 +4412,7 @@ msgid "ApprovalRule|Apply this approval rule to consider only the selected vulne
msgstr ""
msgid "ApprovalRule|Approval rules"
-msgstr ""
+msgstr "承èªãƒ«ãƒ¼ãƒ«"
msgid "ApprovalRule|Approvals required"
msgstr ""
@@ -4549,6 +4639,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "本当ã«ã“ã®ãƒ—ロジェクトをアーカイブã—ã¾ã™ã‹ï¼Ÿ"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–を解除ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹?"
@@ -4722,7 +4815,7 @@ msgid "AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{co
msgstr "%{user} ㌠%{project_name} ã®ãƒ–ランム%{branch} ã«ãƒ—ッシュã—ã¾ã—ãŸï¼ˆ%{commit_url}):"
msgid "AsanaService|Add commit messages as comments to Asana tasks."
-msgstr ""
+msgstr "Asana タスクã«ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’コメントã¨ã—ã¦è¿½åŠ ã—ã¾ã™ã€‚"
msgid "AsanaService|Comma-separated list of branches to be automatically inspected. Leave blank to include all branches."
msgstr ""
@@ -4790,12 +4883,6 @@ msgstr "コメントã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«å‰²ã‚Šå½“ã¦"
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr "ã“れらã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’自分ã«å‰²ã‚Šå½“ã¦ã¾ã™"
-
-msgid "Assign yourself to this issue"
-msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’自分ã«å‰²ã‚Šå½“ã¦ã¾ã™"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "%{assignee_users_sentence} を割り当ã¦ã¾ã—ãŸã€‚"
@@ -4821,7 +4908,7 @@ msgid "Assigned to me"
msgstr "自分ã«å‰²ã‚Šå½“ã¦ã‚‹"
msgid "Assigned to you"
-msgstr ""
+msgstr "ã‚ãªãŸã®æ‹…当"
msgid "Assignee"
msgid_plural "%d Assignees"
@@ -4882,11 +4969,14 @@ msgstr "ファイルã®æ·»ä»˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr "監査イベント"
msgid "Audit events"
-msgstr ""
+msgstr "監査イベント"
msgid "AuditLogs|(removed)"
msgstr ""
@@ -4912,6 +5002,9 @@ msgstr "グループイベント"
msgid "AuditLogs|IP Address"
msgstr "IPアドレス"
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr "メンãƒãƒ¼ã‚¤ãƒ™ãƒ³ãƒˆ"
@@ -4933,6 +5026,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr "ユーザーイベント"
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "8月"
@@ -5144,7 +5285,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 ""
@@ -5243,7 +5384,7 @@ msgid "Badges|Enter a valid URL"
msgstr ""
msgid "Badges|Example: %{exampleUrl}"
-msgstr ""
+msgstr "例: %{exampleUrl}"
msgid "Badges|Group Badge"
msgstr "グループãƒãƒƒã‚¸"
@@ -5276,7 +5417,7 @@ msgid "Badges|Saving the badge failed, please check the entered URLs and try aga
msgstr "ãƒãƒƒã‚¸ã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚入力ã—ãŸURLを確èªã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
msgid "Badges|Supported %{docsLinkStart}variables%{docsLinkEnd}: %{placeholders}"
-msgstr ""
+msgstr "%{docsLinkStart}変数%{docsLinkEnd} をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™: %{placeholders}"
msgid "Badges|The badge was deleted."
msgstr "ãƒãƒƒã‚¸ãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚"
@@ -5293,9 +5434,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "ãƒãƒƒã‚¸"
-msgid "Balsamiq file could not be loaded."
-msgstr "Balsamiq ファイルを読ã¿è¾¼ã¿ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5309,7 +5447,7 @@ msgid "BambooService|Bamboo service root URL."
msgstr ""
msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo."
-msgstr ""
+msgstr "Atlassian Bambooを使ã£ã¦CI/CDパイプラインを実行ã™ã‚‹ã€‚"
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 ""
@@ -5317,6 +5455,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5407,6 +5548,12 @@ msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ランã®ç®¡ç†ã¯ã€%{parent_billing_page_link}
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5630,6 +5777,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5645,6 +5795,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5654,24 +5807,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5694,7 +5862,7 @@ msgid "Boards"
msgstr "ボード"
msgid "Boards and board lists"
-msgstr ""
+msgstr "ボードã¨ãƒœãƒ¼ãƒ‰ãƒªã‚¹ãƒˆ"
msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
@@ -5733,6 +5901,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5836,6 +6007,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "ブランãƒã¯æ—¢ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™"
@@ -5995,9 +6169,6 @@ msgstr "ブロードキャストメッセージã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸ
msgid "Broadcast Messages"
msgstr "ブロードキャストメッセージ"
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "ディレクトリを表示"
@@ -6037,6 +6208,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6079,12 +6253,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6097,9 +6277,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6112,6 +6298,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6378,7 +6567,7 @@ msgid "Can be manually deployed to"
msgstr ""
msgid "Can be overridden in each project."
-msgstr ""
+msgstr "ã“ã®è¨­å®šã¯ã€å„プロジェクトã§ä¸Šæ›¸ãã§ãã¾ã™ã€‚"
msgid "Can create groups:"
msgstr ""
@@ -6689,6 +6878,9 @@ msgstr "コミット済ã®å¤‰æ›´ã‚’ revert ã™ã‚‹ãŸã‚ã«æ–°ã—ã„コミットã
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr "担当者を変更ã—ã¾ã—ãŸã€‚"
@@ -6719,6 +6911,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr "グラフを表示ã§ãã¾ã›ã‚“。データリクエストãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ãŸãŸã‚ã§ã™ã€‚%{documentationLink}"
@@ -6880,6 +7078,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr "ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆ"
@@ -6994,6 +7195,9 @@ msgstr "å°è¨ˆ"
msgid "Checkout|Tax"
msgstr "税"
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr "åˆè¨ˆ"
@@ -7094,7 +7298,7 @@ msgid "Choose visibility level, enable/disable project features and their permis
msgstr ""
msgid "Choose what content you want to see on a group’s overview page."
-msgstr ""
+msgstr "グループã®æ¦‚è¦ãƒšãƒ¼ã‚¸ã«è¡¨ç¤ºã—ãŸã„コンテンツをé¸æŠžã—ã¦ãã ã•ã„."
msgid "Choose which Git strategy to use when fetching the project."
msgstr ""
@@ -7237,24 +7441,12 @@ msgstr "ã™ã¹ã¦ã®ç’°å¢ƒ"
msgid "CiVariable|Create wildcard"
msgstr "ワイルドカードã®ä½œæˆ"
-msgid "CiVariable|Masked"
-msgstr "マスク"
-
msgid "CiVariable|New environment"
msgstr "æ–°ã—ã„環境"
-msgid "CiVariable|Protected"
-msgstr "ä¿è­·"
-
msgid "CiVariable|Search environments"
msgstr "環境を検索"
-msgid "CiVariable|Toggle masked"
-msgstr "マスクã®åˆ‡ã‚Šæ›¿ãˆ"
-
-msgid "CiVariable|Toggle protected"
-msgstr "ä¿è­·ã®åˆ‡ã‚Šæ›¿ãˆ"
-
msgid "Classification Label (optional)"
msgstr "分類ラベル (オプション)"
@@ -7312,6 +7504,15 @@ msgstr "開始日を消去"
msgid "Clear templates search input"
msgstr "テンプレート検索入力をクリア"
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr "ウェイトをクリア"
@@ -7471,6 +7672,9 @@ msgstr "クラスターã®ãƒ¬ãƒ™ãƒ«"
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7495,7 +7699,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7510,6 +7714,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7549,22 +7756,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7573,10 +7783,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7588,6 +7816,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7603,10 +7834,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7618,10 +7852,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7636,9 +7867,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7672,13 +7900,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7699,10 +7921,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7714,13 +7933,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7733,9 +7949,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7757,6 +7970,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7799,9 +8015,6 @@ msgstr "APIã®URLã¯æœ‰åŠ¹ãªhttp ã¾ãŸã¯ https ã®URLã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Š
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Kubernetes クラスターを追加"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Kubernetes クラスターã®çµ±åˆã‚’追加"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "グループ㫠Kubernetes クラスターを追加ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒ—ロジェクトã§ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ãŒè‡ªå‹•çš„ã«å…±æœ‰ã•ã‚Œã¾ã™ã€‚Review App を使用ã—ã€ã‚¢ãƒ—リケーションを導入ã—ã€åŒã˜ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã‚’使用ã™ã‚‹ã™ã¹ã¦ã®ãƒ—ロジェクトã®ãƒ‘イプラインを簡å˜ã«å®Ÿè¡Œã—ã¾ã™ã€‚"
@@ -7910,10 +8123,7 @@ msgstr "クラスターåãŒå¿…è¦ã§ã™ã€‚"
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -7961,17 +8171,8 @@ msgstr "サブãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’ロードã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Kubernetes クラスターを作æˆ"
-msgid "ClusterIntegration|Create cluster on"
-msgstr "クラスターを作æˆ"
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr "æ–°ã—ã„クラスターを作æˆ"
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr "EKS 上ã«æ–°ã—ã„クラスターを作æˆ"
-
-msgid "ClusterIntegration|Create new cluster on GKE"
-msgstr "GKE 上ã«æ–°ã—ã„クラスターを作æˆ"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Kubernetesクラスターã®ä½œæˆ"
@@ -8006,6 +8207,9 @@ msgstr "Kubernetes クラスターã¸ã® GitLab 接続を有効ã¾ãŸã¯ç„¡åŠ¹ã
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "役割ベースã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ (RBAC) を使ã†å ´åˆã€ã“ã®è¨­å®šã‚’有効ã«ã—ã¾ã™ã€‚"
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8015,6 +8219,9 @@ msgstr "Amazon EKS Kubernetes クラスタã®è©³ç´°ã‚’入力ã—ã¦ãã ã•ã„"
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Kubernetes クラスターã®è©³ç´°ã‚’入力ã—ã¦ãã ã•ã„"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "環境スコープ"
@@ -8078,9 +8285,6 @@ msgstr "グループクラスター"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
-msgstr "ã‚ãªãŸãŒè¤‡æ•°ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’セットアップ㗠Auto DevOps を使用ã—ã¦ã„ã‚‹å ´åˆã€%{help_link_start}最åˆã«ã“ã¡ã‚‰ã‚’ãŠèª­ã¿ãã ã•ã„%{help_link_end} 。"
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr "関連ã™ã‚‹ã™ã¹ã¦ã®GitLabリソースを削除ã—ãŸããªã„å ´åˆã¯ã€å˜ã«çµ±åˆã‚’削除ã§ãã¾ã™ã€‚"
@@ -8126,8 +8330,8 @@ msgstr "%{help_link_start_machine_type}マシンタイプ%{help_link_end}ã¨%{he
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "%{help_link_start}ゾーン%{help_link_end}ã®è©³ç´°ã€‚"
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "Kubernetes ã®è©³ç´°"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "グループ Kubernetes クラスターã®è©³ç´°"
@@ -8219,9 +8423,6 @@ msgstr "ノード数"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr "ノード数ã¯æ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Google アカウントãŒæ¬¡ã®è¦ä»¶ã‚’満ãŸã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
@@ -8471,12 +8672,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã« Cloud Runã€Istioã€ãŠã‚ˆã³ HTTP Load Balancing アドオンを使用ã—ã¾ã™ã€‚"
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr "VPC"
@@ -8489,8 +8696,8 @@ msgstr "GCP 上ã®ãƒ—ロジェクトã®è¦æ±‚ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ã“ã¨ã‚
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 "ã“ã®ãƒ—ロジェクト㫠Kubernetes クラスターを関連付ã‘ã‚‹ã“ã¨ã§ã€Review App ã®ä½¿ç”¨ã€ã‚¢ãƒ—リケーションã®ãƒ‡ãƒ—ロイã€ãƒ‘イプラインã®å®Ÿè¡Œãªã©ã‚’ç°¡å˜ã«è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚"
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr "クラスター統åˆã¨ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«é–¢é€£ä»˜ã‘られã¦ã„ã‚‹ GitLab ãŒä½œæˆã—ãŸã™ã¹ã¦ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
@@ -8730,9 +8937,6 @@ msgstr "コミット"
msgid "CommitMessage|Add %{file_name}"
msgstr "%{file_name} を追加"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "作者"
@@ -8773,7 +8977,7 @@ msgid "Commit…"
msgstr "コミット"
msgid "Community forum"
-msgstr ""
+msgstr "コミュニティフォーラム"
msgid "Company"
msgstr ""
@@ -8859,6 +9063,9 @@ msgstr ""
msgid "Complete"
msgstr "完了"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -8892,9 +9099,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -8919,6 +9123,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -8928,7 +9135,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -8940,12 +9147,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9049,11 +9268,14 @@ msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeSt
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
-msgstr ""
+msgstr "権é™ã€Large File Storageã€2è¦ç´ èªè¨¼ã¨é¡§å®¢é–¢ä¿‚ã®é«˜åº¦ãªè¨­å®š"
msgid "Configure existing installation"
msgstr "既存ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’設定ã™ã‚‹"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9099,6 +9321,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9108,6 +9333,9 @@ msgstr "確èª"
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9177,6 +9405,12 @@ msgstr ""
msgid "Connect"
msgstr "接続"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr "ã™ã¹ã¦ã®ãƒªãƒã‚¸ãƒˆãƒªã¸æŽ¥ç¶š"
@@ -9296,9 +9530,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9356,7 +9587,7 @@ msgstr "Docker接続エラー"
msgid "ContainerRegistry|Enable expiration policy"
msgstr "有効期é™ãƒãƒªã‚·ãƒ¼ã‚’有効ã«ã™ã‚‹"
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9450,6 +9681,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9489,6 +9723,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9798,6 +10035,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9834,6 +10074,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9849,9 +10095,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr "æ–°è¦ã‚³ãƒ¼ãƒ‘ス"
-
msgid "Could not add admins as members"
msgstr "管ç†è€…ã¯ãƒ¡ãƒ³ãƒãƒ¼ã¨ã—ã¦è¿½åŠ ã§ãã¾ã›ã‚“。"
@@ -9969,7 +10212,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr "デザインをアップロードã§ãã¾ã›ã‚“ã§ã—ãŸã€‚アップロードã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ã‚‚ã®ãŒå«ã¾ã‚Œã¦ã„ã¾ã—ãŸã€‚"
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10008,9 +10251,15 @@ msgstr "æ–°ã—ã„ドメインを作æˆ"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr "ã¯ã˜ã‚ã«GitLabアカウントを作æˆã—ã€ãã®å¾Œ %{label} ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«æŽ¥ç¶šã—ã¾ã™ã€‚"
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã® Mattermost ãƒãƒ¼ãƒ ã‚’作æˆã—ã¾ã™"
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10122,9 +10371,6 @@ msgstr "æ–°è¦ä½œæˆ "
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr "æ–°è¦ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’作æˆ"
@@ -10149,6 +10395,9 @@ msgstr "ラベルã®æ–°è¦ä½œæˆ"
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10179,9 +10428,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10434,43 +10680,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr "é‡å¤§ãªè„†å¼±æ€§ã®å­˜åœ¨"
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10485,10 +10713,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10558,7 +10786,7 @@ msgid "CurrentUser|One of your groups is running out"
msgstr ""
msgid "CurrentUser|Preferences"
-msgstr ""
+msgstr "設定"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -10599,19 +10827,16 @@ msgstr "カスタム範囲"
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10633,7 +10858,7 @@ msgid "Customize name"
msgstr "åå‰ã‚’カスタマイズ"
msgid "Customize your pipeline configuration and coverage report."
-msgstr ""
+msgstr "パイプライン設定ã¨ã‚«ãƒãƒ¬ãƒƒã‚¸ãƒ¬ãƒãƒ¼ãƒˆã‚’カスタマイズã—ã¾ã™ã€‚"
msgid "Customize your pipeline configuration."
msgstr "パイプライン設定をカスタマイズ"
@@ -10740,15 +10965,33 @@ msgstr "グループã®ä¸‹ã«ã‚ã‚‹ã¹ãã§ã™"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} 件é¸æŠžæ¸ˆã¿ (最大 %{maxLabels} 件)"
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "日付"
msgid "CycleAnalytics|Display chart filters"
msgstr "ãƒãƒ£ãƒ¼ãƒˆãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã®è¡¨ç¤º"
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10799,12 +11042,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr "仕事ã®ç¨®é¡ž"
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr "グループドロップダウンフィルター"
@@ -10820,10 +11069,10 @@ msgstr "DAGã®å¯è¦–化ã«ã¯ã€å°‘ãªãã¨ã‚‚3ã¤ã®ä¾å­˜æ€§ã®ã‚るジョãƒ
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -10970,6 +11219,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11024,9 +11276,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11271,6 +11520,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr "データã¯ã¾ã è¨ˆç®—中ã§ã™..."
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11400,9 +11652,6 @@ msgstr "デフォルトブランãƒ"
msgid "Default branch and protected branches"
msgstr "デフォルトブランãƒã¨ä¿è­·ãƒ–ランãƒ"
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11421,9 +11670,6 @@ msgstr "週ã®å§‹ã¾ã‚Šã®æ›œæ—¥ (デフォルト)"
msgid "Default first day of the week in calendars and date pickers."
msgstr "カレンダーã¨æ—¥ä»˜ã®è¨­å®šã§ä½¿ç”¨ã™ã‚‹ã€é€±ã®æœ€åˆã®æ—¥(デフォルト)"
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr "プロジェクトã®å‰Šé™¤ä¿è­·è¨­å®šï¼ˆãƒ‡ãƒ•ã‚©ãƒ«ãƒˆï¼‰"
@@ -11623,7 +11869,7 @@ msgid "DeleteProject|Failed to restore project repository. Please contact the ad
msgstr "プロジェクトã®ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ¬ã‚¹ãƒˆã‚¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã™ã‹ã€ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
msgid "DeleteProject|Failed to restore wiki repository. Please contact the administrator."
-msgstr "wikiリãƒã‚¸ãƒˆãƒªã®ãƒ¬ã‚¹ãƒˆã‚¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã™ã‹ã€ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
+msgstr "wikiリãƒã‚¸ãƒˆãƒªã®ãƒªã‚¹ãƒˆã‚¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã™ã‹ã€ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
msgid "DeleteValueStream|'%{name}' Value Stream deleted"
msgstr ""
@@ -12060,6 +12306,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12097,7 +12370,7 @@ msgid "DeploymentTarget|Virtual machine (for example, EC2)"
msgstr ""
msgid "Deployments"
-msgstr ""
+msgstr "デプロイ"
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
@@ -12121,6 +12394,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12765,6 +13041,9 @@ msgstr "パイプライン %{pipelineLink} å´ä¸‹"
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr "%{projectLink} ã®ãƒ‘イプライン %{pipelineLink} ã§å´ä¸‹ã•ã‚ŒãŸ"
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12822,6 +13101,9 @@ msgstr "ドメイン"
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr "ã¾ã ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’ãŠæŒã¡ã§ãªã„ã§ã™ã‹ï¼Ÿ"
@@ -12912,6 +13194,9 @@ msgstr "イマイãƒ"
msgid "Draft"
msgstr "ドラフト"
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -12957,6 +13242,45 @@ msgstr "期é™"
msgid "Duration"
msgstr "期間"
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "ã“ã®ãƒ—ロセスã®é€”中ã§ã€GitLab å´ã‹ã‚‰ã® URL ã‚’èžã‹ã‚Œã‚‹ã®ã§ã€æ¬¡ã® URL を使用ã—ã¦ãã ã•ã„。"
@@ -13059,9 +13383,6 @@ msgstr "グループを編集:%{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "%{user_name} ã® ID を編集ã™ã‚‹"
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13386,6 +13707,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13660,7 +13984,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13792,6 +14116,9 @@ msgstr "環境一覧"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "環境ã¨ã¯ã€staging ã‚„ production ã¨ã„ã£ãŸã‚³ãƒ¼ãƒ‰ã‚’デプロイã™ã‚‹å…ˆã§ã™ã€‚"
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr "クラスターã«Elastic Stackをインストールã—ã¦ã€å…¨æ–‡æ¤œç´¢ç­‰ã®é«˜åº¦ãªæ‹¡å¼µã‚¯ã‚¨ãƒªæ©Ÿèƒ½ã‚’有効ã«ã—ã¾ã™ã€‚"
@@ -13807,9 +14134,6 @@ msgstr "環境ã®åœæ­¢ã«ã¤ã„ã¦"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr "æ–°ã—ã„環境"
@@ -13891,8 +14215,11 @@ msgstr ""
msgid "Environments|Updated"
msgstr "更新済ã¿"
-msgid "Environments|You don't have any environments right now"
-msgstr "ã¾ã ç’°å¢ƒãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr ""
@@ -14263,6 +14590,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr "利用ã§ãるプロジェクトã¯ã‚ã‚Šã¾ã›ã‚“"
@@ -14272,6 +14605,9 @@ msgstr "プロジェクトã®é¸æŠž"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr "エラー"
@@ -14510,6 +14846,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14522,6 +14861,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr "例: @sub\\.company\\.com$"
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr "除外ãƒãƒªã‚·ãƒ¼:"
@@ -14642,6 +14984,9 @@ msgstr "グループを探索"
msgid "Explore groups"
msgstr "グループを探索"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "プロジェクトを探ã™"
@@ -14655,7 +15000,7 @@ msgid "Explore snippets"
msgstr ""
msgid "Explore topics"
-msgstr ""
+msgstr "トピックを探ã™"
msgid "Export"
msgstr ""
@@ -14670,7 +15015,7 @@ msgid "Export commit custody report"
msgstr ""
msgid "Export group"
-msgstr ""
+msgstr "グループã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
msgid "Export issues"
msgstr ""
@@ -14685,7 +15030,7 @@ msgid "Export requirements"
msgstr ""
msgid "Export this group with all related data."
-msgstr ""
+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 ""
@@ -14771,9 +15116,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -14883,6 +15234,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr "ref ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ"
@@ -15304,7 +15658,7 @@ msgstr "2月"
msgid "February"
msgstr "2月"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15445,9 +15799,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr "フィルター..."
@@ -15712,9 +16063,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15742,6 +16090,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr "%{providerTitle} ã‹ã‚‰"
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "イシューãŒç™»éŒ²ã•ã‚Œã¦ã‹ã‚‰ãƒ—ロダクションã«ãƒ‡ãƒ—ロイã•ã‚Œã‚‹ã¾ã§"
@@ -15805,9 +16156,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16357,9 +16705,6 @@ msgstr "GitLabイシュー"
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16372,6 +16717,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "GitLab ユーザー"
@@ -16423,9 +16771,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr "GitLabメンãƒãƒ¼ã¾ãŸã¯ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹"
-
msgid "GitLab metadata URL"
msgstr "GitLab メタデータ URL"
@@ -16517,7 +16862,7 @@ msgid "GitLabPages|Removing pages will prevent them from being exposed to the ou
msgstr "ページを削除ã™ã‚‹ã¨ã€ãƒšãƒ¼ã‚¸ãŒå¤–部ã«å…¬é–‹ã•ã‚Œãªããªã‚Šã¾ã™ã€‚"
msgid "GitLabPages|Save changes"
-msgstr ""
+msgstr "変更をä¿å­˜"
msgid "GitLabPages|Something went wrong while obtaining the Let's Encrypt certificate for %{domain}. To retry visit your %{link_start}domain details%{link_end}."
msgstr "%{domain} ã® Let's Encrypt 証明書をå–å¾—ã™ã‚‹éš›ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚å†è©¦è¡Œã™ã‚‹ã«ã¯ã€ %{link_start} ドメインã®è©³ç´° %{link_end} ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã ã•ã„。"
@@ -16651,15 +16996,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16699,6 +17053,9 @@ msgstr ""
msgid "Go to environments"
msgstr "環境ã«ç§»å‹•ã™ã‚‹"
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16825,9 +17182,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -16837,6 +17191,42 @@ 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 ã®ç®¡ç†è€…ã«å°‹ã­ã¦ãã ã•ã„。"
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr "了解"
@@ -16940,7 +17330,7 @@ msgid "Group applications"
msgstr ""
msgid "Group audit events"
-msgstr ""
+msgstr "グループ監査イベント"
msgid "Group avatar"
msgstr "グループアãƒã‚¿ãƒ¼"
@@ -16985,7 +17375,7 @@ msgid "Group info:"
msgstr "グループ情報:"
msgid "Group information"
-msgstr ""
+msgstr "グループ情報"
msgid "Group is required when cluster_type is :group"
msgstr ""
@@ -17009,7 +17399,7 @@ msgid "Group name"
msgstr "グループå"
msgid "Group name (your organization)"
-msgstr ""
+msgstr "グループå (ã‚ãªãŸã®çµ„ç¹”)"
msgid "Group navigation"
msgstr ""
@@ -17041,9 +17431,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr "グループ変数(継承)"
@@ -17054,7 +17441,7 @@ msgid "Group was successfully updated."
msgstr "グループã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Group wikis"
-msgstr ""
+msgstr "グループ Wiki"
msgid "Group: %{group_name}"
msgstr "グループ:%{group_name}"
@@ -17099,7 +17486,7 @@ msgid "GroupPage|Copy group ID"
msgstr ""
msgid "GroupPage|Group ID: %{group_id}"
-msgstr ""
+msgstr "グループID: %{group_id}"
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -17339,28 +17726,28 @@ msgid "GroupSettings|Allows creating organizations and contacts and associating
msgstr ""
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
-msgstr ""
+msgstr "グループオーナーã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œãªã„é™ã‚Šã€ã™ã¹ã¦ã®ã‚µãƒ–グループã«é©ç”¨ã•ã‚Œã¾ã™ã€‚プロジェクトã«ã™ã§ã«è¿½åŠ ã•ã‚Œã¦ã„るグループã¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’失ã„ã¾ã™ã€‚"
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Auto DevOps パイプラインãŒã‚°ãƒ«ãƒ¼ãƒ—用ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸ"
msgid "GroupSettings|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 ""
+msgstr "トップレベルã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã§ä½¿ç”¨ã§ãã¾ã™ã€‚ã™ã¹ã¦ã®ã‚µãƒ–グループã«é©ç”¨ã•ã‚Œã¾ã™ã€‚%{group}ã®å¤–ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨æ—¢ã«å…±æœ‰ã—ã¦ã„るグループã¯ã€æ‰‹å‹•ã§å‰Šé™¤ã—ãªã„é™ã‚Šã€å…±æœ‰ã•ã‚ŒãŸã¾ã¾ã§ã™ã€‚"
msgid "GroupSettings|Badges"
msgstr "ãƒãƒƒã‚¸"
msgid "GroupSettings|Be careful. Changing a group's parent can have unintended side effects. %{learn_more_link_start}Learn more.%{learn_more_link_end}"
-msgstr ""
+msgstr "注æ„ã—ã¦ãã ã•ã„。グループã®è¦ªã‚’変更ã™ã‚‹ã¨ã€æ„図ã—ã¦ã„ãªã‹ã£ãŸå‰¯ä½œç”¨ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ %{learn_more_link_start} 詳細ã¯ã“ã¡ã‚‰ %{learn_more_link_end}"
msgid "GroupSettings|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
msgstr "コンテナレジストリã«Dockerイメージをå«ã‚€ãƒ—ロジェクトãŒã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸‹ã«ã‚ã‚‹ãŸã‚ã€ãƒ‘スを更新ã§ãã¾ã›ã‚“。 最åˆã«ãƒ—ロジェクトã‹ã‚‰ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’削除ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。"
msgid "GroupSettings|Change group URL"
-msgstr ""
+msgstr "グループã®URLã®å¤‰æ›´"
msgid "GroupSettings|Changing a group's URL can have unintended side effects."
-msgstr ""
+msgstr "グループã®URLを変更ã™ã‚‹ã¨ã€æ„図ã—ãªã„副作用ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "GroupSettings|Choose a group path that does not start with a dash or end with a period. It can also contain alphanumeric characters and underscores."
msgstr ""
@@ -17375,7 +17762,7 @@ msgid "GroupSettings|Custom project templates"
msgstr "カスタムプロジェクトテンプレート"
msgid "GroupSettings|Customize this group's badges."
-msgstr ""
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒãƒƒã‚¸ã‚’カスタマイズã—ã¾ã™ã€‚"
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®ã™ã¹ã¦ã®ãƒ—ロジェクトã«å¯¾ã—ã¦ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã® Auto DevOps パイプライン"
@@ -17399,13 +17786,13 @@ msgid "GroupSettings|If not specified at the group or instance level, the defaul
msgstr ""
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
-msgstr ""
+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 ""
+msgstr "ã“ã®è¨­å®šã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ã‚µãƒ–グループã€ãŠã‚ˆã³ãƒ—ロジェクトã®ã™ã¹ã¦ã®ãƒ¡ãƒ³ãƒãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼é€šçŸ¥è¨­å®šã‚’上書ãã—ã¾ã™ã€‚"
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr "グループã®ãƒ‘イプライン設定ãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸ"
@@ -17414,19 +17801,19 @@ msgid "GroupSettings|Please choose a group URL with no special characters or spa
msgstr ""
msgid "GroupSettings|Prevent forking outside of the group"
-msgstr ""
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—外ã§ã®ãƒ•ã‚©ãƒ¼ã‚¯ã‚’防止"
msgid "GroupSettings|Prevent forking setting was not saved"
-msgstr ""
+msgstr "フォーク防止ã®è¨­å®šã‚’ä¿å­˜ã—ã¾ã›ã‚“ã§ã—ãŸ"
msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
-msgstr ""
+msgstr "%{group} ã¨ãã®ã‚µãƒ–グループ以外ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®æ‹›å¾…をメンãƒãƒ¼ãŒé€ä¿¡ã§ããªã„よã†ã«ã—ã¾ã™ã€‚"
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "%{group} 内ã®ãƒ—ロジェクトを他ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ãªã„よã†ã«ã™ã‚‹"
msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-msgstr ""
+msgstr "グループãŒãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã•ã‚ŒãŸå ´åˆã€ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«é€šçŸ¥ã•ã‚Œãªã„よã†ã«ã—ã¾ã™ã€‚"
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -17441,18 +17828,18 @@ msgid "GroupSettings|Select a subgroup to use as the source for custom project t
msgstr ""
msgid "GroupSettings|Select parent group"
-msgstr ""
+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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17480,7 +17867,7 @@ msgid "GroupSettings|Users can create %{link_start_project}project access tokens
msgstr ""
msgid "GroupSettings|What are badges?"
-msgstr ""
+msgstr "ãƒãƒƒã‚¸ã¨ã¯ä½•ã§ã™ã‹ï¼Ÿ"
msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals."
msgstr ""
@@ -17575,9 +17962,12 @@ msgstr "グループを作æˆ"
msgid "GroupsNew|Create new group"
msgstr ""
-msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
msgstr ""
+msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
+msgstr "ã™ã¹ã¦ã®é–¢é€£ãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚€ã‚°ãƒ«ãƒ¼ãƒ—をエクスãƒãƒ¼ãƒˆã—ã€æ–°ã—ã„ GitLab インスタンスã«ç§»å‹•ã—ã¾ã™ã€‚"
+
msgid "GroupsNew|GitLab source URL"
msgstr ""
@@ -17593,9 +17983,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17615,7 +18002,7 @@ msgid "GroupsNew|Provide credentials for another instance of GitLab to import yo
msgstr ""
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
-msgstr ""
+msgstr "ã“ã®æ©Ÿèƒ½ã¯å»ƒæ­¢ã•ã‚Œã€ %{docs_link_start}グループマイグレーション%{docs_link_end} ã«ç½®ãæ›ãˆã‚‰ã‚Œã¾ã—ãŸã€‚"
msgid "GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here."
msgstr ""
@@ -17669,19 +18056,19 @@ msgid "Groups|Enter a descriptive name for your group."
msgstr ""
msgid "Groups|Group ID"
-msgstr ""
+msgstr "グループID"
msgid "Groups|Group URL"
msgstr ""
msgid "Groups|Group avatar"
-msgstr ""
+msgstr "グループアãƒã‚¿ãƒ¼"
msgid "Groups|Group description (optional)"
-msgstr ""
+msgstr "グループã®èª¬æ˜Ž(ä»»æ„)"
msgid "Groups|Group name"
-msgstr ""
+msgstr "グループå"
msgid "Groups|Group path is available."
msgstr ""
@@ -17693,13 +18080,13 @@ msgid "Groups|Learn more"
msgstr ""
msgid "Groups|Must start with letter, digit, emoji, or underscore. Can also contain periods, dashes, spaces, and parentheses."
-msgstr ""
+msgstr "文字ã€æ•°å­—ã€çµµæ–‡å­—ã€ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ピリオドã€ãƒ€ãƒƒã‚·ãƒ¥ã€ã‚¹ãƒšãƒ¼ã‚¹ã€æ‹¬å¼§ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "Groups|Remove avatar"
-msgstr ""
+msgstr "ã‚¢ãƒã‚¿ãƒ¼ã‚’削除"
msgid "Groups|Save changes"
-msgstr ""
+msgstr "変更をä¿å­˜"
msgid "Guideline"
msgstr "ガイドライン"
@@ -17716,6 +18103,107 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr "HTTP Basic: ã‚¢ã‚¯ã‚»ã‚¹æ‹’å¦ \\n Git over HTTPã«ã¯ 'api' スコープã®ãƒ‘ーソナルアクセストークンを使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\\n %{profile_personal_access_tokens_url} ã§ç”Ÿæˆã§ãã¾ã™"
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -17885,6 +18373,9 @@ msgstr "ペイロードを隠ã™"
msgid "Hide shared projects"
msgstr "共有プロジェクトをéžè¡¨ç¤ºã«"
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18033,9 +18524,6 @@ msgstr "%{terms_link} ã«åŒæ„ã™ã‚‹"
msgid "I forgot my password"
msgstr "パスワードを忘れã¾ã—ãŸ"
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18111,9 +18599,6 @@ msgstr "情報: SSH éµã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™ã€‚æ–°ã—ã„ SSH éµã
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr "情報: SSHéµãŒã¾ã‚‚ãªã期é™åˆ‡ã‚Œã«ãªã‚Šã¾ã™ã€‚æ–°ã—ã„ SSHéµ ã‚’ç”Ÿæˆã—ã¦ãã ã•ã„。"
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "IP アドレス"
@@ -18243,6 +18728,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18283,7 +18774,7 @@ msgid "Impersonate"
msgstr ""
msgid "Impersonation Tokens"
-msgstr ""
+msgstr "代ç†ãƒˆãƒ¼ã‚¯ãƒ³"
msgid "Impersonation has been disabled"
msgstr "代ç†ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
@@ -18311,7 +18802,7 @@ msgstr "エクスãƒãƒ¼ãƒˆã—㟠GItLab プロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18341,12 +18832,6 @@ msgstr ""
msgid "Import issues"
msgstr "イシューã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
-msgid "Import members"
-msgstr "メンãƒãƒ¼ã‚’インãƒãƒ¼ãƒˆ"
-
-msgid "Import members from another project"
-msgstr "ä»–ã®ãƒ—ロジェクトã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’インãƒãƒ¼ãƒˆ"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "manifest ファイルã®ã‚¢ãƒƒãƒ—ロードã«ã‚ˆã‚‹è¤‡æ•°ãƒªãƒã‚¸ãƒˆãƒªã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
@@ -18356,9 +18841,6 @@ msgstr "プロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr "プロジェクトメンãƒãƒ¼ã‚’インãƒãƒ¼ãƒˆ"
-
msgid "Import projects from Bitbucket"
msgstr "Bitbucket ã‹ã‚‰ãƒ—ロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
@@ -18696,9 +19178,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18777,15 +19256,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19077,6 +19547,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19086,6 +19559,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr "担当者"
@@ -19143,6 +19625,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19158,6 +19646,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr "未割り当ã¦"
@@ -19225,7 +19716,7 @@ msgid "Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to att
msgstr ""
msgid "Incidents|Must start with http or https"
-msgstr ""
+msgstr "http ã¾ãŸã¯ https ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
msgid "Incidents|There was an issue deleting the image."
msgstr ""
@@ -19239,6 +19730,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19260,6 +19754,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19269,6 +19766,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "通知メールã®æœ¬æ–‡ã«ä½œæˆè€…ã®åå‰ã‚’å«ã‚ã‚‹"
@@ -19333,7 +19833,7 @@ msgid "Inform users without uploaded SSH keys that they can't push over SSH unti
msgstr "SSHキーをアップロードã—ã¦ã„ãªã„ユーザーã«ã€è¿½åŠ ã•ã‚Œã‚‹ã¾ã§ SSH 経由ã§ãƒ—ッシュã§ããªã„ã“ã¨ã‚’通知"
msgid "Infrastructure"
-msgstr ""
+msgstr "インフラ"
msgid "Infrastructure Registry"
msgstr ""
@@ -19377,6 +19877,12 @@ msgstr ""
msgid "Inherited:"
msgstr "継承ã•ã‚Œã¾ã—ãŸï¼š"
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr "インライン"
@@ -19475,7 +19981,7 @@ msgid "Instance administrators group already exists"
msgstr "インスタンス管ç†è€…グループã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
msgid "Instance audit events"
-msgstr ""
+msgstr "インスタンス監査イベント"
msgid "Instance overview"
msgstr ""
@@ -19487,7 +19993,7 @@ msgid "Insufficient permissions for dast_configuration keyword"
msgstr ""
msgid "Integration"
-msgstr ""
+msgstr "インテグレーション"
msgid "Integration Settings"
msgstr ""
@@ -19508,7 +20014,7 @@ msgid "Integrations|Active integrations"
msgstr ""
msgid "Integrations|Add an integration"
-msgstr ""
+msgstr "インテグレーションを追加"
msgid "Integrations|Add namespace"
msgstr ""
@@ -19576,6 +20082,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19583,10 +20092,10 @@ msgid "Integrations|GitLab administrators can set up integrations that all group
msgstr ""
msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
-msgstr ""
+msgstr "GitLabã®ç®¡ç†è€…ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã®ã™ã¹ã¦ã®ãƒ—ロジェクトãŒç¶™æ‰¿ã—ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ä½¿ç”¨ã™ã‚‹ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³æ©Ÿèƒ½ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れらã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯ã€ã¾ã ã‚«ã‚¹ã‚¿ãƒ è¨­å®šã‚’使用ã—ã¦ã„ãªã„ã™ã¹ã¦ã®ãƒ—ロジェクトã«é©ç”¨ã•ã‚Œã¾ã™ã€‚プロジェクトã®ãƒ¬ãƒ™ãƒ«ã§è¨­å®šãŒå¿…è¦ãªå ´åˆã¯ã€ãƒ—ロジェクトã®ã‚«ã‚¹ã‚¿ãƒ è¨­å®šã‚’上書ãã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚詳細㯠%{integrations_link_start}グループレベルã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ç®¡ç†%{link_end} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
msgid "Integrations|Group-level integration management"
-msgstr ""
+msgstr "グループレベルインテグレーション管ç†"
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
@@ -19690,6 +20199,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19702,12 +20214,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -19855,9 +20373,6 @@ msgstr "招待状"
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr "招待"
-
msgid "Invite \"%{email}\" by email"
msgstr "メール㧠\"%{email}\" を招待"
@@ -19868,19 +20383,13 @@ msgid "Invite Members"
msgstr ""
msgid "Invite a group"
-msgstr ""
+msgstr "グループã«æ‹›å¾…"
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr "グループã«æ‹›å¾…ã™ã‚‹"
-
-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 ""
@@ -19972,6 +20481,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -19990,6 +20502,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20002,6 +20520,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20194,9 +20715,6 @@ msgstr "イシュー㯠%{name} ã«ã‚ˆã£ã¦ã‚¯ãƒ­ãƒ¼ã‚ºã•ã‚Œã¾ã—㟠%{reason
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20239,8 +20757,8 @@ msgstr "ボードã®å‰Šé™¤"
msgid "IssueBoards|No matching boards found"
msgstr "該当ã™ã‚‹ãƒœãƒ¼ãƒ‰ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr "ã„ãã¤ã‹ã®ãƒœãƒ¼ãƒ‰ã¯éžè¡¨ç¤ºã«ãªã£ã¦ã„ã¾ã™ã€‚å†åº¦è¡¨ç¤ºã™ã‚‹ãŸã‚ã«ã¯ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’有効ã«ã—ã¦ãã ã•ã„。"
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr ""
msgid "IssueBoards|Switch board"
msgstr "ボードを切り替ãˆã‚‹"
@@ -20273,10 +20791,10 @@ msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must
msgstr ""
msgid "IssueTracker|Use Bugzilla as this project's issue tracker."
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã¨ã—㦠Bugzilla を使用ã—ã¾ã™ã€‚"
msgid "IssueTracker|Use Bugzilla as this project's issue tracker. %{docs_link}"
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã¨ã—㦠Bugzilla を使用ã—ã¾ã™ã€‚%{docs_link}"
msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker."
msgstr ""
@@ -20410,10 +20928,13 @@ msgstr "イテレーションを更新ã—ã¾ã—ãŸ"
msgid "Iterations"
msgstr "イテレーション"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20428,12 +20949,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20443,6 +20958,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20464,7 +20982,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20482,6 +21006,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20491,10 +21018,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20506,6 +21039,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20518,6 +21054,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20773,9 +21312,6 @@ msgstr "ユーザーåã¾ãŸã¯ãƒ¡ãƒ¼ãƒ«"
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20788,6 +21324,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -20851,6 +21390,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -20860,6 +21402,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -20887,15 +21435,24 @@ msgstr "ブラウズ"
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr "完全㪠Raw"
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "ダウンロード"
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -20911,9 +21468,27 @@ msgstr ""
msgid "Job|Keep"
msgstr "維æŒ"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "最下部ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«"
@@ -20923,6 +21498,9 @@ msgstr "最上部ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«"
msgid "Job|Show complete raw"
msgstr "完全㪠Raw を表示ã™ã‚‹"
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -20947,6 +21525,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21029,7 +21610,7 @@ msgid "Key: %{key}"
msgstr "キー: %{key}"
msgid "Keyboard shortcuts"
-msgstr ""
+msgstr "キーボード ショートカット"
msgid "KeyboardKey|Alt"
msgstr ""
@@ -21137,7 +21718,7 @@ msgid "LFSStatus|Enabled"
msgstr "有効"
msgid "LICENSE"
-msgstr "ライセンス"
+msgstr "LICENSE"
msgid "Label"
msgstr "ラベル"
@@ -21305,6 +21886,9 @@ msgstr "最後ã®æ›´æ–°ã®è©¦è¡Œ"
msgid "Last updated"
msgstr "最終更新"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr "å‰å›žä½¿ç”¨"
@@ -21363,7 +21947,7 @@ msgid "Learn More"
msgstr ""
msgid "Learn More."
-msgstr ""
+msgstr "詳ã—ã見る。"
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr "%{link_start} ビルトインã®ãƒ†ãƒ³ãƒ—レートã«è²¢çŒ® %{link_end}ã™ã‚‹æ–¹æ³•ã‚’å­¦ã¶"
@@ -21411,6 +21995,12 @@ msgid "Learn more about group-level project templates"
msgstr "グループレベルプロジェクトテンプレートã®è©³ç´°"
msgid "Learn more about groups."
+msgstr "グループã«ã¤ã„ã¦è©³ã—ã知る"
+
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
@@ -21423,7 +22013,7 @@ msgid "Learn more in the"
msgstr "詳ã—ã見る:"
msgid "Learn more."
-msgstr ""
+msgstr "ã‚‚ã£ã¨è©³ã—ã."
msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
msgstr ""
@@ -21554,6 +22144,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr "Let's Encryptã¯example.comã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’å—ã‘付ã‘ã¾ã›ã‚“"
@@ -21566,6 +22159,9 @@ msgstr ""
msgid "License Compliance"
msgstr "ライセンスコンプライアンス"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21584,6 +22180,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21611,9 +22210,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21638,6 +22234,10 @@ msgid "LicenseCompliance|License Compliance detected %d new license and policy v
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
msgstr[0] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr "ã“ã®ã‚½ãƒ¼ã‚¹ãƒ–ランãƒã§ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’検出ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
@@ -21647,6 +22247,12 @@ msgstr "æ–°ã—ã„ライセンスを検出ã—ã¾ã›ã‚“ã§ã—ãŸ"
msgid "LicenseCompliance|License name"
msgstr "ライセンスå"
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr "ライセンスを削除"
@@ -21662,6 +22268,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr "ã“ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã¯ã™ã§ã«ã“ã®ãƒ—ロジェクトã«å­˜åœ¨ã—ã¾ã™ã€‚"
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr "ã“ã®ãƒ—ロジェクトã‹ã‚‰ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ %{name} を削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
@@ -21851,9 +22463,6 @@ msgstr "利用å¯èƒ½ãªãƒªãƒã‚¸ãƒˆãƒªã®ä¸€è¦§"
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22127,6 +22736,9 @@ msgstr "グループラベルã®ç®¡ç†"
msgid "Manage labels"
msgstr "ラベルを管ç†"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr "マイルストーンã®ç®¡ç†"
@@ -22134,7 +22746,7 @@ msgid "Manage project labels"
msgstr "プロジェクトラベルã®ç®¡ç†"
msgid "Manage projects."
-msgstr ""
+msgstr "プロジェクトã®ç®¡ç†ã€‚"
msgid "Manage two-factor authentication"
msgstr "2è¦ç´ èªè¨¼ã®ç®¡ç†"
@@ -22160,6 +22772,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®é †åºã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ"
@@ -22322,6 +22937,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22442,9 +23060,6 @@ msgstr "ジョブタイムアウトã®æœ€å¤§å€¤"
msgid "Maximum job timeout has a value which could not be accepted"
msgstr "最大ジョブタイムアウトã«ã¯å—ã‘入れられãªã„値ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã™"
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr "パーソナルアクセストークンã®æœ€é•·æœ‰åŠ¹æœŸé–“設定ãŒæœ‰åŠ¹ã§ã™ã€‚有効期é™ã¯ %{maximum_allowable_date} よりå‰ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22466,6 +23081,12 @@ msgstr "åŒæ™‚ã«åŒæœŸã§ãるミラーã®æœ€å¤§æ•°ã€‚"
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22598,7 +23219,7 @@ msgid_plural "MembersOverage|Your subscription includes %d seats."
msgstr[0] ""
msgid "Membership"
-msgstr ""
+msgstr "メンãƒãƒ¼ã‚·ãƒƒãƒ—"
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -22673,7 +23294,7 @@ msgid "Members|Leave \"%{source}\""
msgstr ""
msgid "Members|Membership"
-msgstr ""
+msgstr "メンãƒãƒ¼ã‚·ãƒƒãƒ—"
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -22699,9 +23320,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22709,7 +23327,7 @@ msgid "Memory Usage"
msgstr "メモリ使用é‡"
msgid "Menu"
-msgstr ""
+msgstr "メニュー"
msgid "Merge"
msgstr "マージ"
@@ -22738,7 +23356,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22813,7 +23431,7 @@ msgstr "マージリクエスト"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "マージリクエストã¨ã¯ã€ãƒ—ロジェクトã«åŠ ãˆãŸå¤‰æ›´ã‚’æ示ã—ã€ãã®å¤‰æ›´ã«ã¤ã„ã¦ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã¨è©±ã—åˆã†ãŸã‚ã®å ´æ‰€ã§ã™"
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -22988,7 +23606,7 @@ msgid "Merged this merge request."
msgstr ""
msgid "Merged: %{merged}"
-msgstr ""
+msgstr "マージ済ã¿: %{merged}"
msgid "Merges this merge request immediately."
msgstr ""
@@ -23366,9 +23984,6 @@ msgstr "例:リクエスト毎秒"
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr "%{success_count}/%{total_count} 個ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒç§»è¡Œã•ã‚Œã¾ã—ãŸã€‚"
@@ -23386,7 +24001,7 @@ msgid_plural "Milestones"
msgstr[0] "マイルストーン"
msgid "Milestone due date"
-msgstr ""
+msgstr "マイルストーンã®æœŸæ—¥"
msgid "Milestone lists not available with your current license"
msgstr "ç¾åœ¨ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã¯ マイルストーンリストを利用ã§ãã¾ã›ã‚“"
@@ -23487,6 +24102,9 @@ msgstr "マイルストーンをクローズ"
msgid "Milestones|Completed Issues (closed)"
msgstr "完了ã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼(クローズ)"
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "マイルストーンã®å‰Šé™¤"
@@ -23505,6 +24123,9 @@ msgstr "マイルストーン %{milestoneTitle} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ã
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr "進行中ã®ã‚¤ã‚·ãƒ¥ãƒ¼(オープンã‹ã¤å‰²ã‚Šå½“ã¦æ¸ˆã¿)"
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr "プロジェクトマイルストーン"
@@ -23523,12 +24144,21 @@ msgstr "%{milestoneTitle} を昇格ã™ã‚‹ã¨ã€ %{groupName} 内ã®ã™ã¹ã¦ã®ã
msgid "Milestones|Reopen Milestone"
msgstr "マイルストーンをå†ã‚ªãƒ¼ãƒ—ン"
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。"
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr "開始ã—ã¦ã„ãªã„イシュー (オープンã‹ã¤æœªå‰²ã‚Šå½“ã¦)"
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr "より多ãã®ãƒŸãƒ©ãƒ¼ã‚’優先的ã«ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã™ã‚‹å‰ã«ä½¿ç”¨å¯èƒ½ã«ãªã‚‹ãŸã‚ã®æœ€å°å®¹é‡ã€‚"
@@ -23626,7 +24256,7 @@ msgid "Monday"
msgstr "月曜日"
msgid "Monitor"
-msgstr ""
+msgstr "監視"
msgid "Monitor Settings"
msgstr ""
@@ -23646,6 +24276,9 @@ msgstr ""
msgid "Months"
msgstr "月"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr "詳細"
@@ -23742,16 +24375,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23857,6 +24490,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -23876,7 +24536,7 @@ msgid "Naming, topics, avatar"
msgstr "命åã€ãƒˆãƒ”ックã€ã‚¢ãƒã‚¿ãƒ¼"
msgid "Naming, visibility"
-msgstr ""
+msgstr "åå‰ã€å¯è¦–性"
msgid "Navigate to the project to close the milestone."
msgstr "プロジェクトã«ç§»å‹•ã—ã¦ã€ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã‚’é–‰ã˜ã‚‹ã€‚"
@@ -23932,6 +24592,9 @@ msgstr "別ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã™ã‚‹"
msgid "Need help?"
msgstr "ãŠå›°ã‚Šã§ã™ã‹?"
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24050,7 +24713,7 @@ msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases,
msgstr ""
msgid "NetworkPolicies|Save changes"
-msgstr ""
+msgstr "変更をä¿å­˜"
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
@@ -24118,9 +24781,6 @@ msgstr "ã—ãªã„"
msgid "New"
msgstr "æ–°è¦ä½œæˆ"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24212,6 +24872,9 @@ msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr "æ–°ã—ã„環境"
@@ -24282,11 +24945,14 @@ msgid "New project pages"
msgstr ""
msgid "New project/repository"
-msgstr ""
+msgstr "æ–°è¦ãƒ—ロジェクト/リãƒã‚¸ãƒˆãƒª"
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr "æ–°ã—ã„リリース"
@@ -24302,9 +24968,6 @@ msgstr "æ–°ã—ã„ランナー登録トークンを生æˆã—ã¾ã—ãŸï¼"
msgid "New schedule"
msgstr "æ–°è¦ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "æ–°è¦ã‚¹ãƒ‹ãƒšãƒƒãƒˆ"
@@ -24353,6 +25016,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr "次ã®æœªè§£æ±ºã®ãƒ‡ã‚£ã‚¹ã‚«ãƒƒã‚·ãƒ§ãƒ³ã¸ã‚¸ãƒ£ãƒ³ãƒ—"
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr "ニックãƒãƒ¼ãƒ "
@@ -24375,7 +25041,7 @@ msgid "No Matching Results"
msgstr ""
msgid "No Milestone"
-msgstr ""
+msgstr "マイルストーンãªã—"
msgid "No Scopes"
msgstr "スコープãªã—"
@@ -24401,6 +25067,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "èªè¨¼æ–¹æ³•ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
@@ -24428,12 +25097,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24512,9 +25175,6 @@ msgstr ""
msgid "No iteration"
msgstr "イテレーションãŒã‚ã‚Šã¾ã›ã‚“"
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr "表示ã™ã‚‹ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -24536,7 +25196,7 @@ msgstr "ライセンス表記ãŒã‚ã‚Šã¾ã›ã‚“。全ã¦ã®æ¨©åˆ©ã‚’ä¿æœ‰ã—ã¦
msgid "No matches found"
msgstr "一致ã™ã‚‹é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“"
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24569,9 +25229,6 @@ msgstr "メッセージã¯è¨˜éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "No milestone"
msgstr "マイルストーンãªã—"
-msgid "No milestones to show"
-msgstr "表示ã™ã‚‹ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
-
msgid "No namespace"
msgstr ""
@@ -24653,6 +25310,9 @@ msgstr "ã‚ãªãŸã®æ¤œç´¢ã«ãƒžãƒƒãƒã—ãŸãŠæ°—ã«å…¥ã‚Šã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "No start date"
msgstr "開始日ãªã—"
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24807,6 +25467,9 @@ msgstr "履歴ã®ã¿è¡¨ç¤º"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr "ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã¯ç·¨é›†ã‚’始ã‚ã¦ã‹ã‚‰å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™ã€‚情報ãŒå¤±ã‚ã‚Œãªã„よã†ã«ã€%{open_link}æ›´æ–°ã•ã‚ŒãŸã‚³ãƒ¡ãƒ³ãƒˆ%{close_link}をレビューã—ã¦ãã ã•ã„。"
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25229,7 +25892,7 @@ msgid "OnDemandScans|Edit profile"
msgstr ""
msgid "OnDemandScans|For example: Tests the login page for SQL injections"
-msgstr ""
+msgstr "例:ログインページã§SQLインジェクションã®ãƒ†ã‚¹ãƒˆã‚’ã—ã¾ã™"
msgid "OnDemandScans|Manage DAST scans"
msgstr ""
@@ -25243,12 +25906,12 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
-msgstr ""
-
msgid "OnDemandScans|New on-demand DAST scan"
msgstr "æ–°è¦ã‚ªãƒ³ãƒ‡ãƒžãƒ³ãƒ‰DASTスキャン"
+msgid "OnDemandScans|New scan"
+msgstr ""
+
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
msgstr ""
@@ -25391,6 +26054,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "管ç†è€…ã ã‘ãŒãƒ—ロジェクトを削除ã§ãã¾ã™"
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25409,9 +26075,6 @@ msgstr "GitLab アカウントã®ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã‚’制御ã™ã‚‹ãŸã‚ã« %{idp_u
msgid "Only project members can comment."
msgstr "プロジェクトメンãƒãƒ¼ã®ã¿ã‚³ãƒ¡ãƒ³ãƒˆã§ãã¾ã™"
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr "プロジェクトメンãƒãƒ¼ã®ã¿ãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚Œã¾ã™ã€‚グループメンãƒãƒ¼ã¯ã‚¹ã‚­ãƒƒãƒ—ã•ã‚Œã¾ã™ã€‚"
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25442,12 +26105,12 @@ msgstr "オープン"
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 ""
-
msgid "Open errors"
msgstr "エラーを開ã"
+msgid "Open in Gitpod"
+msgstr ""
+
msgid "Open in Web IDE"
msgstr ""
@@ -25460,9 +26123,6 @@ msgstr ""
msgid "Open raw"
msgstr "ãã®ã¾ã¾é–‹ã"
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "サイドãƒãƒ¼ã‚’é–‹ã"
@@ -25490,6 +26150,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "æ–°è¦ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§é–‹ã"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr "æ“作ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ pod log ã® %{pod_name} ã§è©³ç´°ã‚’確èªã—ã¦ãã ã•ã„。"
@@ -25557,7 +26220,7 @@ msgid "Other merge requests block this MR"
msgstr "ä»–ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ブロックã—ã¾ã™"
msgid "Other versions"
-msgstr ""
+msgstr "ãã®ä»–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
msgid "Other visibility settings have been disabled by the administrator."
msgstr "管ç†è€…ã«ã‚ˆã£ã¦ãã®ä»–ã®è¡¨ç¤ºè¨­å®šãŒç„¡åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -25631,6 +26294,9 @@ msgstr ""
msgid "Owner"
msgstr "オーナー"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -25686,7 +26352,7 @@ msgid "Package registry rate limits"
msgstr ""
msgid "Package type"
-msgstr ""
+msgstr "パッケージタイプ"
msgid "Package type must be Conan"
msgstr "パッケージタイプ㌠Conan ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
@@ -26107,10 +26773,10 @@ msgid "Pagination|Last »"
msgstr "最後 »"
msgid "Pagination|Next"
-msgstr ""
+msgstr "次ページ"
msgid "Pagination|Prev"
-msgstr ""
+msgstr "å‰ãƒšãƒ¼ã‚¸"
msgid "Pagination|« First"
msgstr "« 最åˆ"
@@ -26245,13 +26911,13 @@ msgid "Pending"
msgstr "ä¿ç•™ä¸­"
msgid "Pending Deletion"
-msgstr ""
+msgstr "削除ã®ä¿ç•™ä¸­"
msgid "Pending comments"
msgstr ""
msgid "Pending deletion"
-msgstr ""
+msgstr "削除ã®ä¿ç•™ä¸­"
msgid "Pending owner approval"
msgstr ""
@@ -26368,7 +27034,7 @@ msgid "Permissions Help"
msgstr ""
msgid "Permissions and group features"
-msgstr ""
+msgstr "権é™ã¨ã‚°ãƒ«ãƒ¼ãƒ—機能"
msgid "Personal Access Token"
msgstr "個人ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³"
@@ -26397,6 +27063,9 @@ msgstr "Phabricator サーãƒãƒ¼URL"
msgid "Phabricator Tasks"
msgstr "Phabricatorタスク"
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr "åå‰ã‚’é¸æŠž"
@@ -26673,6 +27342,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "パイプライン"
@@ -26682,12 +27354,15 @@ msgstr "パイプラインãƒãƒ£ãƒ¼ãƒˆ"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr "%{project_name} ã®ãƒ‘イプライン設定を正常ã«æ›´æ–°ã—ã¾ã—ãŸã€‚"
-msgid "Pipelines|API"
-msgstr "API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
+msgid "Pipelines|API"
+msgstr "API"
+
msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr ""
@@ -26733,7 +27408,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26742,13 +27417,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26757,7 +27432,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26775,6 +27450,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26787,9 +27465,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr "プロジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’正常ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã—ãŸã€‚"
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "Runner キャッシュã®ã‚¯ãƒªãƒ¼ãƒ‹ãƒ³ã‚°ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -26844,24 +27528,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "ã“ã®ãƒ—ロジェクトã¯ç¾åœ¨ãƒ‘イプラインを実行ã™ã‚‹ã‚ˆã†ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -26919,9 +27597,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr "コミット"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -26937,9 +27612,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr "期間"
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27273,9 +27945,6 @@ msgstr "ファイルをé¸æŠžã—ã¦ãã ã•ã„"
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr "グループをé¸æŠžã—ã¦ä¸‹ã•ã„。"
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27330,8 +27999,8 @@ msgstr "ãƒãƒƒãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "Pods in use"
msgstr "使用中ã®ãƒãƒƒãƒ‰"
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
-msgstr "ドキュメントã€ãƒ“ルドã—ãŸãƒã‚¤ãƒŠãƒªã€ãã®ä»–ã®é–¢é€£è³‡æ–™ç­‰ã€å¥½ããªãƒªãƒ³ã‚¯ã‚’指定ã—ã¦ãã ã•ã„。ã“れらã¯ã€GitLab インスタンスã®å†…部リンクã¾ãŸã¯å¤–部ã¸ã®ãƒªãƒ³ã‚¯ã§ã™ã€‚ãŸã ã— URL ã®é‡è¤‡ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
+msgstr ""
msgid "Policies"
msgstr ""
@@ -27375,7 +28044,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27394,13 +28063,13 @@ msgid "Preferences|Choose what content you want to see on a project’s overview
msgstr "プロジェクトã®æ¦‚è¦ãƒšãƒ¼ã‚¸ã«è¡¨ç¤ºã—ãŸã„コンテンツをé¸æŠžã—ã¾ã™ã€‚"
msgid "Preferences|Choose what content you want to see on your homepage."
-msgstr ""
+msgstr "ホームページã§è¡¨ç¤ºã—ãŸã„コンテンツをé¸æŠžã—ã¾ã™ã€‚"
msgid "Preferences|Configure how dates and times display for you."
-msgstr ""
+msgstr "日付ã¨æ™‚刻ã®è¡¨ç¤ºæ–¹æ³•ã‚’設定ã—ã¾ã™ã€‚"
msgid "Preferences|Customize integrations with third party services."
-msgstr ""
+msgstr "サードパーティã®ã‚µãƒ¼ãƒ“スã¨ã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’カスタマイズã—ã¾ã™ã€‚"
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
msgstr "アプリケーションヘッダーã¨ãƒŠãƒ“ゲーションサイドãƒãƒ¼ã®å¤–観をカスタマイズã—ã¾ã™ã€‚"
@@ -27409,34 +28078,34 @@ msgid "Preferences|Display time in 24-hour format"
msgstr "時間を24時間形å¼ã§è¡¨ç¤ºã™ã‚‹"
msgid "Preferences|Enable Gitpod integration"
-msgstr ""
+msgstr "Gitpod インテグレーションを有効ã«ã™ã‚‹"
msgid "Preferences|Enable integrated code intelligence on code views"
-msgstr ""
+msgstr "コードビューã§ã‚³ãƒ¼ãƒ‰ã‚¤ãƒ³ãƒ†ãƒªã‚¸ã‚§ãƒ³ã‚¹ã‚’有効ã«ã™ã‚‹"
msgid "Preferences|Failed to save preferences."
-msgstr ""
+msgstr "設定をä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "Preferences|For example: 30 minutes ago."
-msgstr ""
+msgstr "例: 30分å‰"
msgid "Preferences|Gitpod"
-msgstr ""
+msgstr "Gitpod"
msgid "Preferences|Homepage content"
-msgstr ""
+msgstr "ホームページã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„"
msgid "Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser."
-msgstr ""
+msgstr "ã™ã¹ã¦ã®å¤‰æ›´ã®ã‚るファイルを表示ã™ã‚‹ä»£ã‚ã‚Šã«ã€ä¸€åº¦ã«1ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã¿ã‚’表示ã—ã¾ã™ã€‚ファイルを切り替ãˆã‚‹ã«ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ãƒ–ラウザを使用ã—ã¾ã™ã€‚"
msgid "Preferences|Integrations"
-msgstr ""
+msgstr "インテグレーション"
msgid "Preferences|Layout width"
msgstr "レイアウトã®å¹…"
msgid "Preferences|Must be a number between %{min} and %{max}"
-msgstr ""
+msgstr " %{min} ã‹ã‚‰ %{max} ã¾ã§ã®æ•°å­—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
msgid "Preferences|Navigation theme"
msgstr "ナビゲーションテーマ"
@@ -27448,22 +28117,22 @@ msgid "Preferences|Render whitespace characters in the Web IDE"
msgstr "Web IDEã§ç©ºç™½æ–‡å­—をレンダリング"
msgid "Preferences|Show one file at a time on merge request's Changes tab"
-msgstr ""
+msgstr "マージリクエストã®å¤‰æ›´ã‚¿ãƒ–ã«ä¸€åº¦ã« 1 ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
msgid "Preferences|Show whitespace changes in diffs"
msgstr "空白をå«ã‚ãŸå·®åˆ†ã‚’表示"
msgid "Preferences|Sourcegraph"
-msgstr ""
+msgstr "Sourcegraph"
msgid "Preferences|Surround text selection when typing quotes or brackets"
-msgstr ""
+msgstr "引用符ã¾ãŸã¯æ‹¬å¼§ã‚’入力ã™ã‚‹ã¨ãã«ãƒ†ã‚­ã‚¹ãƒˆé¸æŠžã‚’囲ã¿ã¾ã™"
msgid "Preferences|Syntax highlighting theme"
msgstr "シンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆã®ãƒ†ãƒ¼ãƒž"
msgid "Preferences|Tab width"
-msgstr ""
+msgstr "タブ幅"
msgid "Preferences|This feature is experimental and translations are not complete yet"
msgstr "ã“ã®æ©Ÿèƒ½ã¯å®Ÿé¨“çš„ãªã‚‚ã®ã§ã™ã€‚ã¾ãŸç¿»è¨³ã¯ã¾ã å®Œäº†ã—ã¦ã„ã¾ã›ã‚“"
@@ -27481,13 +28150,16 @@ msgid "Preferences|Use relative times"
msgstr "相対時間を使用"
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
+msgstr "説明欄やコメント欄ã«æ–‡å­—を入力ã™ã‚‹å ´åˆã€æ¬¡ã®æ–‡å­—ã®ã„ãšã‚Œã‹ã‚’入力ã™ã‚‹ã¨ã€é¸æŠžã—ãŸæ–‡å­—ãŒå¯¾å¿œã™ã‚‹æ–‡å­—ã§å›²ã¾ã‚Œã¾ã™: %{supported_characters}。"
+
+msgid "Preparing the report for the scan."
msgstr ""
msgid "Prev"
-msgstr ""
+msgstr "å‰ã¸"
msgid "Prevent adding new members to projects within this group"
-msgstr ""
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®ãƒ—ロジェクトã¸ã®æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ã®è¿½åŠ ã‚’ç¦æ­¢ã™ã‚‹"
msgid "Prevent auto-stopping"
msgstr ""
@@ -27499,7 +28171,7 @@ msgid "Prevent environment from auto-stopping"
msgstr "環境ãŒè‡ªå‹•åœæ­¢ã—ãªã„よã†ã«ã™ã‚‹"
msgid "Prevent project forking outside current group"
-msgstr ""
+msgstr "ç¾åœ¨ã®ã‚°ãƒ«ãƒ¼ãƒ—外ã¸ãƒ—ロジェクトã®ãƒ•ã‚©ãƒ¼ã‚¯ã‚’防止"
msgid "Prevent users from changing their profile name"
msgstr "ユーザーãŒãƒ—ロファイルåを変更ã§ããªã„よã†ã«è¨­å®šã™ã‚‹"
@@ -27792,6 +28464,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -27813,9 +28488,6 @@ msgstr "フルãƒãƒ¼ãƒ "
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -27852,6 +28524,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -27957,6 +28632,9 @@ msgstr "ã“ã®æƒ…報をプロフィールã«è¡¨ç¤ºã—ã¾ã™"
msgid "Profiles|Time settings"
msgstr "時間ã®è¨­å®š"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "2è¦ç´ èªè¨¼"
@@ -28038,9 +28716,6 @@ msgstr "ã‚ãªãŸã®åå‰ã¯ã‚ãªãŸã® %{provider_label} アカウントã«åŸ
msgid "Profiles|Your status"
msgstr "ã‚ãªãŸã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "例:MacBook ã®ã‚­ãƒ¼"
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28129,7 +28804,7 @@ msgid "Project and wiki repositories"
msgstr "プロジェクトã¨wikiã®ãƒªãƒã‚¸ãƒˆãƒª"
msgid "Project audit events"
-msgstr ""
+msgstr "プロジェクト監査イベント"
msgid "Project avatar"
msgstr "プロジェクトアãƒã‚¿ãƒ¼"
@@ -28180,7 +28855,7 @@ msgid "Project info:"
msgstr ""
msgid "Project information"
-msgstr ""
+msgstr "プロジェクト情報"
msgid "Project is required when cluster_type is :project"
msgstr ""
@@ -28516,7 +29191,7 @@ msgid "ProjectSettings|Container registry"
msgstr "コンテナレジストリ"
msgid "ProjectSettings|Customize this project's badges."
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã®ãƒãƒƒã‚¸ã‚’カスタマイズã™ã¾ã™ã€‚"
msgid "ProjectSettings|Determine what happens to the commit history when you merge a merge request."
msgstr ""
@@ -28545,7 +29220,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr "ãã‚Œãžã‚Œã®ãƒ—ロジェクトã¯ã€Dockerイメージをä¿å­˜ã™ã‚‹ãŸã‚ã®å„自ã§ã‚¹ãƒšãƒ¼ã‚¹ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™"
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28644,6 +29319,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr "マージæ案"
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -28807,7 +29485,7 @@ msgid "ProjectSettings|Warn about Potentially Unwanted Characters"
msgstr ""
msgid "ProjectSettings|What are badges?"
-msgstr ""
+msgstr "ãƒãƒƒã‚¸ã¨ã¯ä½•ã§ã™ã‹ï¼Ÿ"
msgid "ProjectSettings|What are merge trains?"
msgstr ""
@@ -28815,6 +29493,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -28878,6 +29559,9 @@ msgstr "Pages/Hugo"
msgid "ProjectTemplates|Pages/Jekyll"
msgstr "Pages/Jekyll"
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Pages/Plain HTML"
@@ -28896,9 +29580,6 @@ msgstr "Serverless Framework / JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29043,6 +29724,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr "利用å¯èƒ½ãªã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚ªãƒ—ションã¯ã‚ã‚Šã¾ã›ã‚“"
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29311,7 +29998,7 @@ msgid "Promotions|Upgrade your plan to activate Advanced Search."
msgstr ""
msgid "Promotions|Upgrade your plan to activate Audit Events."
-msgstr ""
+msgstr "監査イベントを有効ã«ã™ã‚‹ãŸã‚ã«ã€ãƒ—ランをアップグレード"
msgid "Promotions|Upgrade your plan to activate Group Webhooks."
msgstr ""
@@ -29437,7 +30124,7 @@ msgid "ProtectedBranch|Keep stable branches secure and force developers to use m
msgstr ""
msgid "ProtectedBranch|Learn more."
-msgstr ""
+msgstr "詳細ã«ã¤ã„ã¦"
msgid "ProtectedBranch|Protect"
msgstr "ä¿è­·"
@@ -29533,7 +30220,7 @@ msgid "ProtectedTag|By default, protected tags restrict who can modify the tag."
msgstr ""
msgid "ProtectedTag|Learn more."
-msgstr ""
+msgstr "詳細ã«ã¤ã„ã¦"
msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
@@ -29652,7 +30339,10 @@ msgstr "プッシュイベント"
msgid "Push project from command line"
msgstr "コマンドラインã‹ã‚‰ãƒ—ロジェクトをプッシュ"
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30082,9 +30772,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30094,9 +30790,6 @@ msgstr ""
msgid "Related merge requests"
msgstr "関連ã™ã‚‹ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr "以下ã«é–¢ä¿‚ã—ã¦ã„ã‚‹"
@@ -30326,6 +31019,9 @@ msgstr "作業時間ã®å‰Šé™¤"
msgid "Remove time estimate"
msgstr "見ç©æ™‚間を削除"
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30375,7 +31071,7 @@ msgid "Removed attention request from @%{username}"
msgstr ""
msgid "Removed group can not be restored!"
-msgstr "削除ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã¯ãƒ¬ã‚¹ãƒˆã‚¢ã§ãã¾ã›ã‚“ï¼"
+msgstr "削除ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã¯ãƒªã‚¹ãƒˆã‚¢ã§ãã¾ã›ã‚“ï¼"
msgid "Removed parent epic %{epic_ref}."
msgstr "親エピック %{epic_ref} を削除ã—ã¾ã—ãŸã€‚"
@@ -30438,7 +31134,7 @@ msgid "Removes time estimate."
msgstr "見ç©æ™‚間を削除."
msgid "Removing this group also removes all child projects, including archived projects, and their resources."
-msgstr ""
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を削除ã™ã‚‹ã¨ã€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã•ã‚ŒãŸãƒ—ロジェクトをå«ã‚€ã™ã¹ã¦ã®å­ãƒ—ロジェクトã¨ãã®ãƒªã‚½ãƒ¼ã‚¹ã‚‚削除ã•ã‚Œã¾ã™ã€‚"
msgid "Rename file"
msgstr "ファイルåを変更"
@@ -30536,7 +31232,10 @@ msgstr "ä¸æ­£åˆ©ç”¨ã‚’報告"
msgid "Report abuse to admin"
msgstr "管ç†è€…ã«ä¸æ­£åˆ©ç”¨ã‚’報告"
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30613,12 +31312,18 @@ msgstr "失敗"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr "メトリクスレãƒãƒ¼ãƒˆã®èª­ã¿è¾¼ã¿ä¸­"
@@ -30631,6 +31336,12 @@ msgstr "メトリクスレãƒãƒ¼ãƒˆã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "Reports|Metrics reports failed loading results"
msgstr "メトリクスレãƒãƒ¼ãƒˆã§çµæžœã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ"
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30646,9 +31357,15 @@ msgstr "テストã®è¦ç´„"
msgid "Reports|Test summary failed loading results"
msgstr "テストè¦ç´„ã®çµæžœã®ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—"
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "テストè¦ç´„ã®çµæžœã¯ãƒ‘ースã•ã‚Œã¦ã„ã¾ã™"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -30887,7 +31604,7 @@ msgid "Require additional authentication for administrative tasks."
msgstr ""
msgid "Require all users in this group to set up two-factor authentication"
-msgstr ""
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«2è¦ç´ èªè¨¼ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã‚’è¦æ±‚ã™ã‚‹"
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -31066,7 +31783,7 @@ msgid "Restore"
msgstr ""
msgid "Restore group"
-msgstr "グループをレストア"
+msgstr "グループをリストア"
msgid "Restore project"
msgstr "プロジェクトを復元ã™ã‚‹"
@@ -31154,9 +31871,9 @@ msgid "Review changes"
msgstr ""
msgid "Review requests for you"
-msgstr ""
+msgstr "ã‚ãªãŸã«ãƒ¬ãƒ“ューä¾é ¼"
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31217,9 +31934,6 @@ msgstr "追加中"
msgid "RightSidebar|deleting the"
msgstr "削除中"
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "ロードマップ"
@@ -31271,11 +31985,11 @@ msgstr "ã‚¿ã‚°ã®ãªã„ジョブã®å®Ÿè¡Œ"
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
-msgstr ""
+msgid "Runner tokens"
+msgstr "Runner トークン"
msgid "Runner was not updated."
msgstr "Runner ã¯æ›´æ–°ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
@@ -31295,6 +32009,20 @@ msgstr "ç¾åœ¨ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã®Runner: %{active_runners_count}"
msgid "Runners page."
msgstr "Runner ã®ãƒšãƒ¼ã‚¸ã€‚"
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31304,7 +32032,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31331,9 +32059,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31346,12 +32086,19 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31361,6 +32108,9 @@ msgstr "説明"
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31370,18 +32120,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31403,25 +32147,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31430,15 +32180,28 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31472,9 +32235,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31487,21 +32256,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31511,7 +32310,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31532,6 +32331,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31541,16 +32343,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31568,7 +32373,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31586,7 +32391,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31595,9 +32400,6 @@ 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 "共有ランナーパイプラインã®%{quotaLimit} ã®ã†ã¡%{quotaUsed} を使用ã—ã¾ã—ãŸã€‚"
@@ -31631,9 +32433,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "稼åƒä¸­"
@@ -31650,7 +32449,7 @@ msgid "SAML SSO for %{group_name}"
msgstr "%{group_name} 用㮠SAML SSO"
msgid "SAML discovery tokens"
-msgstr ""
+msgstr "SAML ディスカãƒãƒªãƒ¼ãƒˆãƒ¼ã‚¯ãƒ³"
msgid "SAML for %{group_name}"
msgstr "%{group_name} 用ã®SAML"
@@ -31748,10 +32547,10 @@ msgstr "ä¿å­˜ä¸­"
msgid "Saving project."
msgstr "プロジェクトをä¿å­˜"
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -31943,6 +32742,9 @@ msgstr "プロジェクトを検索"
msgid "Search projects..."
msgstr "プロジェクトを検索..."
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32056,6 +32858,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32080,6 +32885,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32206,16 +33020,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32272,6 +33089,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32287,6 +33110,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32302,12 +33131,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32317,6 +33155,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32329,9 +33170,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32380,6 +33233,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32398,12 +33254,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32422,6 +33287,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32431,10 +33299,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32458,6 +33329,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32542,6 +33422,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "'%{vulnerabilityName}' ã«è¿½åŠ ã•ã‚ŒãŸã‚³ãƒ¡ãƒ³ãƒˆ"
@@ -32683,6 +33566,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32707,7 +33593,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32719,16 +33605,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -32788,6 +33677,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr "脆弱性レãƒãƒ¼ãƒˆ"
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -32800,15 +33692,18 @@ msgstr "ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr "ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’表示ã™ã‚‹ã«ã¯ã€æ‰¿èªã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -32845,15 +33740,12 @@ msgstr "ページを変更"
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr "å·¦å´ã®ã‚µã‚¤ãƒ‰ãƒãƒ¼ã‹ã‚‰ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ç·¨é›†ã‚’開始ã—ã¾ã™ã€‚ãã®å¾Œã€å¤‰æ›´ã‚’コミットã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-msgid "Select a group to invite"
-msgstr "招待ã™ã‚‹ãŸã‚ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã™ã‚‹"
-
msgid "Select a label"
msgstr "ラベルをé¸æŠž"
@@ -32992,6 +33884,9 @@ msgstr ""
msgid "Select target branch"
msgstr "ターゲットブランãƒã‚’é¸æŠž"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33328,6 +34223,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33373,6 +34271,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr "見ç©æ™‚é–“ã®è¨­å®š"
@@ -33418,9 +34319,6 @@ msgstr "ウェイトを %{weight} ã«è¨­å®š"
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "ステータス絵文字ã®è¿½åŠ "
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33657,7 +34555,7 @@ msgid "Show list"
msgstr ""
msgid "Show one file at a time"
-msgstr ""
+msgstr "一度ã«1ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
msgid "Show open epics"
msgstr ""
@@ -33674,6 +34572,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr "空白 (éžè¡¨ç¤ºæ–‡å­—) ã®å¤‰æ›´ã‚’表示ã™ã‚‹"
@@ -33840,6 +34741,9 @@ msgstr ""
msgid "Signed in"
msgstr "サインイン済ã¿"
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34011,6 +34915,9 @@ msgstr "Snowplow"
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34020,6 +34927,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr "誰ã‹ãŒåŒæ™‚ã«ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’編集ã—ã¾ã—ãŸã€‚%{linkStart} イシュー %{linkEnd} を確èªã—ã¦ã€å¤‰æ›´ç‚¹ãŒæ„図ã›ãšå‰Šé™¤ã•ã‚Œãªã„よã†ã«æ°—ã‚’ã¤ã‘ã¦ãã ã•ã„。"
@@ -34059,9 +34969,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr "ボタンã®åˆ‡ã‚Šæ›¿ãˆä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
msgid "Something went wrong while adding your award. Please try again."
msgstr "絵文字リアクション中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -34194,9 +35101,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr "担当者ã®æ›´æ–°ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr "リスト設定を更新ã™ã‚‹é–“ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -34620,6 +35524,9 @@ msgstr "開始日"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr "マージトレインを開始"
@@ -34764,6 +35671,9 @@ msgstr "ステータス:"
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -34836,9 +35746,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -34887,6 +35794,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr "Prometheus を設定ã™ã‚‹äº‹ã§ã‚ãªãŸã®ç’°å¢ƒã®ãƒ‘フォーマンスã¨å¥å…¨æ€§ã®æœ€æ–°çŠ¶æ…‹ã‚’å–å¾—ã§ãã¾ã™ã€‚"
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -34933,7 +35843,7 @@ msgid "Strikethrough text"
msgstr ""
msgid "Subgroup information"
-msgstr ""
+msgstr "サブグループ情報"
msgid "Subgroup milestone"
msgstr "サブグループマイルストーン"
@@ -35052,10 +35962,10 @@ msgstr "サブスクリプションã®ä½œæˆã«æˆåŠŸã—ã¾ã—ãŸã€‚"
msgid "Subscription successfully deleted."
msgstr "サブスクリプションã®å‰Šé™¤ã«æˆåŠŸã—ã¾ã—ãŸã€‚"
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35436,8 +36346,9 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35580,12 +36491,6 @@ msgstr ""
msgid "System Info"
msgstr "システム情報"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr "システムã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ (%{default})"
@@ -35742,6 +36647,12 @@ msgstr "対象パス"
msgid "Target branch"
msgstr "ターゲットブランãƒ"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr "ターゲットブランãƒ"
@@ -35775,9 +36686,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "テンプレート"
@@ -36181,9 +37089,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36214,6 +37119,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr "クライアントシークレットをéžå…¬é–‹ã«ã§ãる場所ã§ã‚¢ãƒ—リケーションを使用ã—ã¾ã™ã€‚ãƒã‚¤ãƒ†ã‚£ãƒ–モãƒã‚¤ãƒ«ã‚¢ãƒ—リã¨ã‚·ãƒ³ã‚°ãƒ«ãƒšãƒ¼ã‚¸ã‚¢ãƒ—リã¯éžå…¬é–‹ã¨ã¯ã¿ãªã—ã¾ã›ã‚“。"
@@ -36226,6 +37134,9 @@ msgstr "ã“ã®ãƒ—ロジェクトã®ã“ã®ãƒ–ランãƒã«ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ‘イ
msgid "The branch or tag does not exist"
msgstr "ブランãƒã¾ãŸã¯ã‚¿ã‚°ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "キャラクターãƒã‚¤ãƒ©ã‚¤ã‚¿ãƒ¼ã¯ã€ä»¶åã‚’ %{titleLength} 文字ã«ã€æœ¬æ–‡ã‚’ %{bodyLength} 文字ã«ã¾ã¨ã‚ã€gitã§èª­ã‚るよã†ã«ã—ã¾ã™ã€‚"
@@ -36247,12 +37158,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "コãƒã‚¯ã‚·ãƒ§ãƒ³ã¯ %{timeout} ã§ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã™ã€‚タイムアウトã™ã‚‹ãƒªãƒã‚¸ãƒˆãƒªã§ã¯ã€clone/push を組ã¿åˆã‚ã›ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„。"
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã¯UTF-8ã§ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•ã‚Œã¦ã„ã¾ã›ã‚“。編集ã¯Gitリãƒã‚¸ãƒˆãƒªã‚’介ã—ã¦è¡Œã£ã¦ãã ã•ã„。"
@@ -36545,6 +37462,9 @@ msgstr "プロジェクトを正常ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ãã¾ã—ãŸã€‚"
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36554,6 +37474,12 @@ msgstr "リモートミラーãŒå®Œäº†ã™ã‚‹ã¾ã§ã«æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã€‚
msgid "The remote repository is being updated..."
msgstr "リモートリãƒã‚¸ãƒˆãƒªã¯ç¾åœ¨ã€æ›´æ–°ä¸­ã§ã™ã€‚"
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36575,6 +37501,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr "ã“ã®ã‚¹ãƒ‹ãƒšãƒƒãƒˆã¯èªè¨¼ç„¡ã—ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™"
@@ -36587,6 +37516,9 @@ msgstr "スニペットã¯ãƒ—ロジェクトメンãƒãƒ¼ã ã‘ãŒè¦‹ã‚Œã¾ã™ã€‚
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr "指定ã—ãŸã‚¿ãƒ–ã¯ç„¡åŠ¹ã§ã™ã€‚別ã®ã‚¿ãƒ–ã‚’é¸æŠžã—ã¦ãã ã•ã„"
@@ -36872,9 +37804,6 @@ 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 ""
@@ -37016,6 +37945,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37028,8 +37960,8 @@ msgstr "ã“ã® %{issuableType} ã¯éžå…¬é–‹ã§ã™"
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
-msgstr "ã“ã®%{noteableTypeText} 㯠%{confidentialLinkStart} éžå…¬é–‹ %{linkEnd} ã§ã‚り〠%{lockedLinkStart}ロック%{linkEnd}ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
+msgstr ""
msgid "This %{noteableTypeText} is locked."
msgstr ""
@@ -37055,8 +37987,8 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
-msgstr "ã“ã® URL ã¯åˆ¥ã®ãƒªãƒ³ã‚¯ã§æ—¢ã«ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚é‡è¤‡ã—㟠URL ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgid "This URL already exists."
+msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr "ã“ã®å‹•ä½œã«ã‚ˆã£ã¦ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚çªç™ºçš„ãªäº‹æ…‹ã‚’防ããŸã‚ã«ã€ä¸€åº¦æ“作ã®æ„図を確èªã—ã¦ãã ã•ã„。ãŠé¡˜ã„ã—ã¾ã™ã€‚"
@@ -37064,7 +37996,7 @@ msgstr "ã“ã®å‹•ä½œã«ã‚ˆã£ã¦ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37151,6 +38083,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr "ã“ã®ãƒ‡ãƒã‚¤ã‚¹ã¯æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -37178,6 +38116,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37304,9 +38245,15 @@ msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã€æœŸé™åˆ‡ã‚Œ/消去済ã¿ã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒ
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã€å‰å·¥ç¨‹ã®ã‚¸ãƒ§ãƒ–ãŒæ­£å¸¸çµ‚了ã™ã‚‹ã“ã¨ã§å®Ÿè¡Œã•ã‚Œã¾ã™"
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã«ã¯ãƒˆãƒ¬ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
@@ -37544,6 +38491,9 @@ msgstr "ã“ã®ã‚µãƒ–スクリプションã¯"
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ GitLab ã‹ã‚‰ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«æ“作ã§ãƒ­ãƒƒã‚¯ã‚’解除ã§ãã¾ã›ã‚“"
@@ -37731,7 +38681,7 @@ msgid "Time"
msgstr "時間"
msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
-msgstr ""
+msgstr "ユーザーãŒå¼·åˆ¶çš„ãª2è¦ç´ èªè¨¼ã‚’無視ã§ãる時間(時間å˜ä½)"
msgid "Time Spent"
msgstr ""
@@ -38014,6 +38964,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr "エントリーを手動ã§è¿½åŠ ã™ã‚‹ã«ã¯ã€ã‚¹ãƒžãƒ¼ãƒˆãƒ•ã‚©ãƒ³ã®ã‚¢ãƒ—リケーションã«æ¬¡ã®è©³ç´°ã‚’入力ã—ã¦ãã ã•ã„"
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38095,6 +39048,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38113,7 +39069,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr "手動ã§è¨­å®šã•ã‚ŒãŸPrometheus サービスã‹ã‚‰ã‚¢ãƒ©ãƒ¼ãƒˆã‚’å—ä¿¡ã™ã‚‹ã«ã¯ã€æ¬¡ã®URLã¨èªè¨¼ã‚­ãƒ¼ã‚’ Prometheus webhook ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã«è¿½åŠ ã—ã¦ãã ã•ã„。GitLab ã«ã‚¢ãƒ©ãƒ¼ãƒˆã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã® %{linkEnd} Prometheusã®è¨­å®š %{linkStart} ã®è©³ç´°ã‚’ã”覧ãã ã•ã„。"
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38263,9 +39219,6 @@ msgstr "サイドãƒãƒ¼ã‚’切り替ãˆ"
msgid "Toggle the Performance Bar"
msgstr "パフォーマンスãƒãƒ¼ã®åˆ‡ã‚Šæ›¿ãˆ"
-msgid "Toggle thread"
-msgstr "スレッドã®åˆ‡ã‚Šæ›¿ãˆ"
-
msgid "Toggled :%{name}: emoji award."
msgstr ":%{name}: 絵文字リアクションをトグル。"
@@ -38311,6 +39264,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38384,7 +39340,7 @@ msgid "Transfer"
msgstr ""
msgid "Transfer group to another parent group."
-msgstr ""
+msgstr "グループを別ã®è¦ªã‚°ãƒ«ãƒ¼ãƒ—ã«è»¢é€ã—ã¾ã™ã€‚"
msgid "Transfer ownership"
msgstr ""
@@ -38404,6 +39360,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr "データベースã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38593,6 +39552,9 @@ msgstr "å†è©¦è¡Œ"
msgid "Try again?"
msgstr "å†è©¦è¡Œã—ã¾ã™ã‹ï¼Ÿ"
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "30日間ã§GitLabãŒæä¾›ã™ã‚‹ã™ã¹ã¦ã®æ©Ÿèƒ½ã‚’試ã—ã¦ã¿ã¦ãã ã•ã„。"
@@ -38797,6 +39759,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr " 差分をロードã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
@@ -38833,6 +39798,9 @@ msgstr "ç¾æ™‚点ã§ã¯ã“ã®ã‚¨ãƒ”ックを更新ã§ãã¾ã›ã‚“。"
msgid "Unable to update this issue at this time."
msgstr "ç¾æ™‚点ã§ã¯ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’æ›´æ–°ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。"
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -38959,6 +39927,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39107,7 +40078,7 @@ msgid "Updated %{updated_at} by %{updated_by}"
msgstr "%{updated_by} ã«ã‚ˆã£ã¦%{updated_at} ã«æ›´æ–°"
msgid "Updated date"
-msgstr ""
+msgstr "更新日時"
msgid "Updates"
msgstr ""
@@ -39139,9 +40110,6 @@ msgstr "CSVファイルã®ã‚¢ãƒƒãƒ—ロード"
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’アップロード"
@@ -39160,9 +40128,6 @@ msgstr "ファイルをアップロード"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39172,6 +40137,9 @@ msgstr "オブジェクトマップをアップロード"
msgid "UploadLink|click to upload"
msgstr "クリックã—ã¦ã‚¢ãƒƒãƒ—ロード"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39229,7 +40197,7 @@ msgstr "ç¾åœ¨ã®ä½¿ç”¨çŠ¶æ³"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39466,6 +40434,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39475,6 +40446,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40279,9 +41253,6 @@ msgstr "変更後ファイルを表示 @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40306,6 +41277,9 @@ msgstr ""
msgid "Viewing commit"
msgstr "コミットを表示中"
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40411,9 +41385,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40435,6 +41406,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40555,6 +41529,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr "クラス"
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40651,9 +41628,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr "スキャナープロãƒã‚¤ãƒ€ãƒ¼"
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40699,6 +41673,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr "ファイルをロードã—ã€ãã®å†…容をコピーã—ã¦ã„ã¾ã™ã€‚ãŠå¾…ã¡ãã ã•ã„。"
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40720,6 +41697,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41020,6 +42000,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41057,16 +42040,13 @@ msgid "What are CI/CD minutes?"
msgstr ""
msgid "What are group audit events?"
-msgstr ""
+msgstr "グループ監査イベントã¨ã¯ä½•ã§ã™ã‹?"
msgid "What are instance audit events?"
-msgstr ""
+msgstr "インスタンス監査イベントã¨ã¯ä½•ã§ã™ã‹?"
msgid "What are project audit events?"
-msgstr ""
-
-msgid "What are you searching for?"
-msgstr "何を探ã—ã¾ã™ã‹?"
+msgstr "プロジェクト監査イベントã¨ã¯ä½•ã§ã™ã‹?"
msgid "What does this command do?"
msgstr ""
@@ -41110,13 +42090,13 @@ msgstr "Runner ãŒãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ä»–ã®ãƒ—ロジェクトã«å‰
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41132,6 +42112,9 @@ msgstr[0] "マージリクエストãŒæ‰¿èªã•ã‚ŒãŸã¨ã"
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr "日付"
@@ -41279,9 +42262,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41306,14 +42286,8 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
-msgstr ""
+msgstr "詳細ã¯ã“ã¡ã‚‰"
msgid "WikiPage|Page title"
msgstr ""
@@ -41322,19 +42296,7 @@ msgid "WikiPage|Retry"
msgstr ""
msgid "WikiPage|Save changes"
-msgstr ""
-
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
@@ -41348,18 +42310,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "ã“ã“ã«ãƒ†ã‚­ã‚¹ãƒˆã‚’記入ã™ã‚‹ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ドラッグã—ã¦ãã ã•ã„。"
@@ -41435,6 +42388,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41444,6 +42400,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41654,6 +42613,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41747,6 +42712,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr "ファイルを編集ã™ã‚‹ã«ã¯ã€ã©ã“ã‹ã®ãƒ–ランãƒã«ã„ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr "プロジェクトã¯è‡ªåˆ†ãŒç®¡ç†ã™ã‚‹åå‰ç©ºé–“ã«ã®ã¿è»¢é€ã§ãã¾ã™ã€‚"
@@ -41777,6 +42745,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ç›´æŽ¥ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。"
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -41861,6 +42832,9 @@ msgstr "利用å¯èƒ½ãªãƒ—ロジェクトã¯ã¾ã ã‚ã‚Šã¾ã›ã‚“"
msgid "You don't have any recent searches"
msgstr "最近ã®æ¤œç´¢ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr "ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã™ã‚‹ãŸã‚ã®å分ãªæ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -41940,10 +42914,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42123,6 +43097,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42135,6 +43112,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42426,7 +43406,7 @@ msgstr "サブスクリプションã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸï¼"
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42679,6 +43659,10 @@ msgstr "ãれ自体をブロックã§ãã¾ã›ã‚“"
msgid "cannot merge"
msgstr "マージã§ãã¾ã›ã‚“"
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -42773,6 +43757,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -42851,6 +43844,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr "イシューを作æˆã—ã¦ã€ã“ã®è„†å¼±æ€§ã‚’調査ã—ã¾ã™"
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -42876,9 +43878,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "ライセンスã®ç®¡ç†"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "コードå“質ã«å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“"
@@ -42961,45 +43969,6 @@ msgstr ""
msgid "closed issue"
msgstr "クローズã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43018,7 +43987,7 @@ msgstr "コミット済ã¿"
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43122,6 +44091,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr "メール '%{email}'ã¯æ¤œè¨¼æ¸ˆã¿ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "有効"
@@ -43384,7 +44356,7 @@ msgid "issues at risk"
msgstr "リスクã®ã‚るイシュー"
msgid "issues need attention"
-msgstr ""
+msgstr "è¦æ³¨æ„ãªèª²é¡Œ"
msgid "issues on track"
msgstr "順調ãªã‚¤ã‚·ãƒ¥ãƒ¼"
@@ -43455,6 +44427,10 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr "ã“ã® math ブロックã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "マージリクエスト"
@@ -43549,6 +44525,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43662,9 +44644,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "マージã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
-msgid "mrWidget|Merge locally"
-msgstr "ローカルã§ãƒžãƒ¼ã‚¸"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43737,6 +44716,9 @@ msgstr "マージをリクエスト"
msgid "mrWidget|Resolve conflicts"
msgstr "競åˆã‚’解決ã™ã‚‹"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "リãƒãƒ¼ãƒˆ"
@@ -43857,9 +44839,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr "利用ä¸å¯"
-
msgid "need attention"
msgstr ""
@@ -43920,6 +44899,9 @@ msgstr ""
msgid "or"
msgstr "ã¾ãŸã¯"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -43944,7 +44926,7 @@ msgid "pending comment"
msgstr "ä¿ç•™ä¸­ã®ã‚³ãƒ¡ãƒ³ãƒˆ 件"
msgid "pending deletion"
-msgstr ""
+msgstr "削除ã®ä¿ç•™ä¸­"
msgid "per day"
msgstr "1æ—¥ã‚ãŸã‚Š"
@@ -44005,9 +44987,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr "プロジェクトアãƒã‚¿ãƒ¼"
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44207,9 +45186,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
@@ -44356,7 +45332,7 @@ msgid "{group}"
msgstr ""
msgid "{project}"
-msgstr ""
+msgstr "{プロジェクト}"
msgid "✔"
msgstr ""
diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po
index c056dbeacca..e101b93165e 100644
--- a/locale/ka_GE/gitlab.po
+++ b/locale/ka_GE/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ka\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/kab/gitlab.po b/locale/kab/gitlab.po
index b93d8cfc8da..62e0056043c 100644
--- a/locale/kab/gitlab.po
+++ b/locale/kab/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: kab\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:41\n"
+"PO-Revision-Date: 2022-04-01 09:17\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index 004f4e41218..6e6d1128e66 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ko\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:14\n"
msgid " %{start} to %{end}"
msgstr " %{start}부터 %{end}까지"
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr " ë¡œê·¸ì¸ í•´ì£¼ì„¸ìš”."
-msgid " Target Path"
-msgstr " 타겟 경로"
-
msgid " Try to %{action} this file again."
msgstr " ì´ íŒŒì¼ì— 대해 %{action} ë™ìž‘ì„ ë‹¤ì‹œ ì‹œë„하세요."
-msgid " Type"
-msgstr " 유형"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " %{grace_period_deadline} ì´ì „ì— ì´ ìž‘ì—…ì„ ìˆ˜í–‰ 하셔야 합니다."
@@ -288,6 +282,10 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] "%d 댓글 ë” ë³´ê¸°"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%dê±´ì˜ ì—´ë¦° ì´ìŠˆ"
@@ -300,6 +298,10 @@ msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "%dê°œì˜ ê°œì¸ í”„ë¡œì íŠ¸ê°€ 제거ë˜ê³ , ë³µì›í•  수 없게 ë©ë‹ˆë‹¤."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%dê°œì˜ ì´ì „ì— ë¨¸ì§€ëœ ì»¤ë°‹"
@@ -312,9 +314,9 @@ msgid "%d project selected"
msgid_plural "%d projects selected"
msgstr[0] "%dê°œì˜ í”„ë¡œì íŠ¸ê°€ ì„ íƒë¨"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d ê±´ì˜ ê²½ê³ ê°€ 있는 요청"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -392,9 +394,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -617,6 +616,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType}ì´ ì‚­ì œë©ë‹ˆë‹¤! 확실합니까?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "%{issueType} ì•¡ì…˜"
@@ -695,8 +697,8 @@ msgstr "Forkí•œ ì›ë³¸ 프로ì íŠ¸ê°€ ë” ë‚®ì€ ê³µê°œ 수준으로 설정ë˜ì
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "ì—­í• ì— ëŒ€í•´ %{link_start}ìžì„¸ížˆ 알아보기%{link_end}."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -704,9 +706,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -776,6 +775,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days}ì¼"
@@ -903,10 +905,17 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr "%{start}부터 %{end}까지"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr "%{strongOpen}경고:%{strongClose} SAML 그룹 ë§í¬ë¡œ ì¸í•´ GitLabì´ ê·¸ë£¹ì—ì„œ 구성ì›ì„ ìžë™ìœ¼ë¡œ 제거할 수 있습니다."
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1189,8 +1198,8 @@ msgstr "+%{more_reviewers_count} ëª…ì˜ ë¦¬ë·°ì–´"
msgid "+%{tags} more"
msgstr "+%{tags}개"
-msgid ", and "
-msgstr ", 그리고 "
+msgid ", "
+msgstr ""
msgid ", or "
msgstr ", ë˜ëŠ” "
@@ -1478,9 +1487,18 @@ msgstr "새 릴리즈 %{tag}ê°€ %{name}으로 공개ë˜ì—ˆìŠµë‹ˆë‹¤. %{release_l
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "새 릴리스 %{tag}(ì´)ê°€ %{name}(으)ë¡œ 공개ë˜ì—ˆìŠµë‹ˆë‹¤. 릴리스 페ì´ì§€ë¥¼ 방문해 ìžì„¸ížˆ 알아보세요."
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1673,6 +1691,9 @@ msgstr "ìžë™ ë°°í¬ ì •ë³´"
msgid "About this feature"
msgstr "ì´ ê¸°ëŠ¥ì— ëŒ€í•´ì„œ"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "오남용 리í¬íŠ¸"
@@ -1703,9 +1724,6 @@ msgstr "LDAP 계정 ì ‘ê·¼ì´ ê±°ë¶€ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr "액세스 만료ì¼"
-
msgid "Access expires"
msgstr ""
@@ -1859,6 +1877,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -1916,6 +1937,9 @@ msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 추가"
msgid "Add LICENSE"
msgstr "LICENSE 추가"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2039,6 +2063,9 @@ msgstr "댓글 추가"
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2267,6 +2294,9 @@ msgstr "ì´ìŠˆë¥¼ ì—í”½ì— ì¶”ê°€í•©ë‹ˆë‹¤."
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2348,6 +2378,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "최근 그룹"
@@ -2360,6 +2393,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2372,6 +2408,9 @@ msgstr "새 프로ì íŠ¸"
msgid "AdminArea|New user"
msgstr "새 사용ìž"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "소유ìž"
@@ -2456,12 +2495,18 @@ msgstr "%{projectName} 프로ì íŠ¸ë¥¼ 삭제하시겠습니까?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps ë„ë©”ì¸"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Let's Encrypt 설정"
@@ -2501,6 +2546,27 @@ msgstr "Let's Encrypt ì´ë©”ì¼"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr "프로ì íŠ¸ ë° ê·¸ë£¹ì˜ ìƒˆ CI/CD 변수는 기본ì ìœ¼ë¡œ 보호ë¨ìœ¼ë¡œ 설정ë©ë‹ˆë‹¤."
@@ -2516,6 +2582,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2531,6 +2600,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2540,9 +2615,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2552,6 +2624,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3458,7 +3533,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3572,6 +3647,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3626,6 +3704,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "BLOB 미리보기 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3869,6 +3950,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "ì—í”½ì„ ì‚­ì œí•˜ëŠ” ë„중 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -3981,6 +4065,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "프로ì íŠ¸ í™˜ê²½ì„ í™•ì¸í•˜ë˜ ë„중 예ìƒì¹˜ ì•Šì€ ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -4071,6 +4158,9 @@ msgstr ""
msgid "Any namespace"
msgstr "ìž„ì˜ì˜ 네임스페ì´ìŠ¤"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "앱 ID"
@@ -4549,6 +4639,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4790,12 +4883,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr "ì´ ì´ìŠˆë¥¼ 나ì—게 할당하기"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -4882,6 +4969,9 @@ msgstr "íŒŒì¼ ì²¨ë¶€ê°€ 실패했습니다."
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr "ê°ì‚¬ ì´ë²¤íŠ¸"
@@ -4912,6 +5002,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -4933,6 +5026,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "8ì›”"
@@ -5293,9 +5434,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "내 배지"
-msgid "Balsamiq file could not be loaded."
-msgstr "Balsamiq 파ì¼ì„ 로드하지 못했습니다."
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5317,6 +5455,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5407,6 +5548,12 @@ msgstr "ì´ ê·¸ë£¹ì˜ í”Œëžœì„ ê´€ë¦¬í•˜ë ¤ë©´ %{parent_billing_page_link}ì˜ ê
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5630,6 +5777,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5645,6 +5795,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5654,24 +5807,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5733,6 +5901,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5836,6 +6007,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "해당 브랜치는 ì´ë¯¸ 사용중입니다"
@@ -5995,9 +6169,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "디렉토리 찾아보기"
@@ -6037,6 +6208,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6079,12 +6253,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6097,9 +6277,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6112,6 +6298,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6689,6 +6878,9 @@ msgstr "기존 변경 ì‚¬í•­ì„ ë˜ëŒë¦¬ê¸° 위해 새로운 ì»¤ë°‹ì„ ë§Œë“­ë‹
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6719,6 +6911,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -6880,6 +7078,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -6994,6 +7195,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7237,24 +7441,12 @@ msgstr "모든 환경"
msgid "CiVariable|Create wildcard"
msgstr "와ì¼ë“œ ì¹´ë“œ 만들기"
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr "새로운 환경"
-msgid "CiVariable|Protected"
-msgstr "보호ë¨"
-
msgid "CiVariable|Search environments"
msgstr "환경 검색"
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr "Toggle 보호ë¨"
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7312,6 +7504,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7471,6 +7672,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7495,7 +7699,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7510,6 +7714,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7549,22 +7756,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7573,10 +7783,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7588,6 +7816,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7603,10 +7834,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7618,10 +7852,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7636,9 +7867,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7672,13 +7900,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7699,10 +7921,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7714,13 +7933,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7733,9 +7949,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7757,6 +7970,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7799,9 +8015,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 추가"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ì—°ë™ ì¶”ê°€"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "ê·¸ë£¹ì— Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 추가하면 모든 프로ì íŠ¸ì—ì„œ í´ëŸ¬ìŠ¤í„°ê°€ ìžë™ìœ¼ë¡œ 공유ë©ë‹ˆë‹¤. ì‘ìš© í”„ë¡œê·¸ëž¨ì„ ê²€í† í•˜ê³  ì‘ìš© í”„ë¡œê·¸ëž¨ì„ ë°°í¬í•˜ê³  ë™ì¼í•œ í´ëŸ¬ìŠ¤í„°ë¥¼ 사용하는 모든 프로ì íŠ¸ì— 대한 파ì´í”„ ë¼ì¸ì„ 쉽게 실행할 수 있습니다."
@@ -7910,10 +8123,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -7961,16 +8171,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ìƒì„±"
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8006,6 +8207,9 @@ msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ì— 대한 GitLabì˜ ì—°ê²°ì„ í™œì„±í™” ë˜ëŠ” ë
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "ì—­í•  기반 액세스 제어 (RBAC)를 사용하는 경우, ì´ ì„¤ì •ì„ ì‚¬ìš©í•˜ì„¸ìš”."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8015,6 +8219,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ì˜ 세부 ì •ë³´ ìž…ë ¥"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "환경 범위"
@@ -8078,9 +8285,6 @@ msgstr "그룹 í´ëŸ¬ìŠ¤í„°"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8126,8 +8330,8 @@ msgstr "%{help_link_start_machine_type}머신 유형%{help_link_end} ë° %{help_
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "%{help_link_start}zones%{help_link_end}ì— ëŒ€í•´ ìžì„¸ížˆ 알아보기"
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "Kubernetesì— ëŒ€í•´ ìžì„¸ížˆ 알아보기."
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "그룹 Kubernetes í´ëŸ¬ìŠ¤í„°ì— 대해 ìžì„¸ížˆ 알아보기."
@@ -8219,9 +8423,6 @@ msgstr "노드 수"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "ë‹¹ì‹ ì˜ Google ê³„ì •ì´ ë‹¤ìŒì˜ 요구 ì‚¬í•­ì„ ì¶©ì¡±í•˜ëŠ”ì§€ í™•ì¸ í•˜ì„¸ìš”."
@@ -8471,12 +8672,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8489,8 +8696,8 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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 "ì´ í”„ë¡œì íŠ¸ì— ì—°ê²°ëœ Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 통해 어플리케ì´ì…˜ì„ 리뷰, ë°°í¬í•  수 있고, 파ì´í”„ë¼ì¸ì„ 실행할 수 있습니다. ê·¸ 외ì—ë„ ë§Žì€ ì¼ì„ 훨씬 쉬운 방법으로 수행할 수 있습니다."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr ""
@@ -8730,9 +8937,6 @@ msgstr "커밋"
msgid "CommitMessage|Add %{file_name}"
msgstr "%{file_name} 추가"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "작성 ë¨"
@@ -8859,6 +9063,9 @@ msgstr ""
msgid "Complete"
msgstr "완료"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -8892,9 +9099,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -8919,6 +9123,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -8928,7 +9135,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -8940,12 +9147,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9054,6 +9273,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9099,6 +9321,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9108,6 +9333,9 @@ msgstr "확ì¸"
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9177,6 +9405,12 @@ msgstr ""
msgid "Connect"
msgstr "ì—°ê²°"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr "모든 저장소 연결"
@@ -9296,9 +9530,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9356,7 +9587,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9450,6 +9681,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9489,6 +9723,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9798,6 +10035,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9834,6 +10074,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9849,9 +10095,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -9969,7 +10212,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10008,9 +10251,15 @@ msgstr "새 ë„ë©”ì¸ ë§Œë“¤ê¸°"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10122,9 +10371,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10149,6 +10395,9 @@ msgstr "새 ë¼ë²¨ 만들기"
msgid "Create new project"
msgstr "새 프로ì íŠ¸ 만들기"
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10179,9 +10428,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10434,43 +10680,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10485,10 +10713,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10599,19 +10827,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10740,15 +10965,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10799,12 +11042,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10820,10 +11069,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -10970,6 +11219,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11024,9 +11276,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11271,6 +11520,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr "ë°ì´í„°ê°€ ì•„ì§ ê³„ì‚°ì¤‘ìž…ë‹ˆë‹¤..."
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11400,9 +11652,6 @@ msgstr "기본 브랜치"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11421,9 +11670,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12060,6 +12306,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12121,6 +12394,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12765,6 +13041,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12822,6 +13101,9 @@ msgstr "ë„ë©”ì¸"
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -12912,6 +13194,9 @@ msgstr "비추천"
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -12957,6 +13242,45 @@ msgstr "마ê°ì¼"
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "ì´ ê³¼ì •ì—ì„œ GitLabì˜ URLì„ ë¬»ëŠ” 메시지가 나타납니다. 아래 í‘œì‹œëœ URLì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤."
@@ -13059,9 +13383,6 @@ msgstr "그룹 편집: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "%{user_name}ì˜ ì‹ ì› íŽ¸ì§‘"
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13386,6 +13707,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13660,7 +13984,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13792,6 +14116,9 @@ msgstr "환경"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "í™˜ê²½ì€ ì½”ë“œê°€ ë°°í¬ë˜ëŠ” 장소(예: 스테ì´ì§• ë˜ëŠ” ìš´ì˜) 입니다."
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13807,9 +14134,6 @@ msgstr "환경 ì •ì§€ì— ëŒ€í•´ ìžì„¸ížˆ 알아보기"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr "새 환경"
@@ -13891,7 +14215,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr "갱신ë¨"
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14263,6 +14590,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14272,6 +14605,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr "오류"
@@ -14510,6 +14846,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14522,6 +14861,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14642,6 +14984,9 @@ msgstr "그룹 둘러보기"
msgid "Explore groups"
msgstr "그룹 찾아보기"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "프로ì íŠ¸ 둘러보기"
@@ -14771,9 +15116,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -14883,6 +15234,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15304,7 +15658,7 @@ msgstr "2ì›”"
msgid "February"
msgstr "2ì›”"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15445,9 +15799,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr "í•„í„°..."
@@ -15712,9 +16063,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr "무료"
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15742,6 +16090,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "ì´ìŠˆ ìƒì„±ì—ì„œ 프로ë•ì…˜ ë°°í¬ê¹Œì§€"
@@ -15805,9 +16156,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16357,9 +16705,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16372,6 +16717,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "GitLab 사용ìž"
@@ -16423,9 +16771,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16651,15 +16996,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16699,6 +17053,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr "ì—픽으로 ì´ë™"
@@ -16825,9 +17182,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -16837,6 +17191,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17041,9 +17431,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17446,13 +17833,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17575,6 +17962,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17593,9 +17983,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17716,6 +18103,107 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr "HTTP Basic: ì ‘ê·¼ 거부\\nGit over HTTPì—서는 'api' 스코프를 가진 ê°œì¸ ì—‘ì„¸ìŠ¤ 토í°ì„ 사용해야 합니다.\\n%{profile_personal_access_tokens_url}ì—ì„œ ìƒì„±í•  수 있습니다."
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -17885,6 +18373,9 @@ msgstr "페ì´ë¡œë“œ 숨기기"
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18033,9 +18524,6 @@ msgstr "%{terms_link}ì— ë™ì˜í•©ë‹ˆë‹¤."
msgid "I forgot my password"
msgstr "비밀번호를 잊었습니다."
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18111,9 +18599,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "IP 주소"
@@ -18243,6 +18728,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18311,7 +18802,7 @@ msgstr "내보낸 GitLab 프로ì íŠ¸ 가져오기"
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18341,12 +18832,6 @@ msgstr ""
msgid "Import issues"
msgstr "ì´ìŠˆ 가져오기"
-msgid "Import members"
-msgstr "멤버 가져오기"
-
-msgid "Import members from another project"
-msgstr "다른 프로ì íŠ¸ì—ì„œ 멤버 가져오기"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "manifest 파ì¼ì„ 업로드하여 ì—¬ëŸ¬ê°œì˜ ì €ìž¥ì†Œë¥¼ 가져오세요."
@@ -18356,9 +18841,6 @@ msgstr "프로ì íŠ¸ 가져오기"
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr "프로ì íŠ¸ 멤버 가져오기"
-
msgid "Import projects from Bitbucket"
msgstr "Bitbucketì—ì„œ 프로ì íŠ¸ 가져오기"
@@ -18696,9 +19178,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18777,15 +19256,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19077,6 +19547,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19086,6 +19559,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19143,6 +19625,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19158,6 +19646,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19239,6 +19730,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19260,6 +19754,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19269,6 +19766,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19377,6 +19877,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr "ì¸ë¼ì¸"
@@ -19576,6 +20082,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19690,6 +20199,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19702,12 +20214,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -19855,9 +20373,6 @@ msgstr "초대"
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr "초대"
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -19873,12 +20388,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr "그룹 초대"
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -19972,6 +20481,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -19990,6 +20502,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20002,6 +20520,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20194,9 +20715,6 @@ msgstr ""
msgid "Issue weight"
msgstr "ì´ìŠˆ 가중치"
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20239,7 +20757,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20410,10 +20928,13 @@ msgstr ""
msgid "Iterations"
msgstr "ì´í„°ë ˆì´ì…˜"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20428,12 +20949,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20443,6 +20958,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20464,7 +20982,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20482,6 +21006,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20491,10 +21018,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20506,6 +21039,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20518,6 +21054,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20773,9 +21312,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20788,6 +21324,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -20851,6 +21390,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -20860,6 +21402,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -20887,15 +21435,24 @@ msgstr "íƒìƒ‰"
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "다운로드"
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -20911,9 +21468,27 @@ msgstr ""
msgid "Job|Keep"
msgstr "유지"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "맨 아래로 스í¬ë¡¤"
@@ -20923,6 +21498,9 @@ msgstr "맨 위로 스í¬ë¡¤"
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -20947,6 +21525,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21305,6 +21886,9 @@ msgstr ""
msgid "Last updated"
msgstr "최근 ì—…ë°ì´íŠ¸ë¨"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21413,6 +21997,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21554,6 +22144,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21566,6 +22159,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21584,6 +22180,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21611,9 +22210,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21638,6 +22234,10 @@ msgid "LicenseCompliance|License Compliance detected %d new license and policy v
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
msgstr[0] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21647,6 +22247,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21662,6 +22268,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -21851,9 +22463,6 @@ msgstr "사용 가능한 저장소 목ë¡"
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22127,6 +22736,9 @@ msgstr "그룹 ë ˆì´ë¸” 관리"
msgid "Manage labels"
msgstr "ë ˆì´ë¸” 관리"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22160,6 +22772,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22322,6 +22937,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22442,9 +23060,6 @@ msgstr "최대 작업 시간 초과"
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22466,6 +23081,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22699,9 +23320,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr "초대 취소"
@@ -22738,7 +23356,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22813,7 +23431,7 @@ msgstr "머지 리퀘스트(MR)"
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 the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23366,9 +23984,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23487,6 +24102,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "마ì¼ìŠ¤í†¤ ì‚­ì œ"
@@ -23505,6 +24123,9 @@ msgstr "마ì¼ìŠ¤í†¤ %{milestoneTitle}를 ì°¾ì„ ìˆ˜ 없습니다"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23523,12 +24144,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "ì´ ë™ìž‘ì€ ë˜ëŒë¦´ 수 없습니다."
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23646,6 +24276,9 @@ msgstr ""
msgid "Months"
msgstr "달"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23742,16 +24375,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23857,6 +24490,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -23932,6 +24592,9 @@ msgstr "로그아웃하고 다른 계정으로 로그ì¸"
msgid "Need help?"
msgstr "ë„ì›€ì´ í•„ìš”í•˜ì‹ ê°€ìš”?"
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24118,9 +24781,6 @@ msgstr "절대 아님"
msgid "New"
msgstr "신규"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24212,6 +24872,9 @@ msgstr "새 디렉토리"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24287,6 +24950,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24302,9 +24968,6 @@ msgstr ""
msgid "New schedule"
msgstr "새 ì¼ì •"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "새 스니펫"
@@ -24353,6 +25016,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr "닉네임"
@@ -24401,6 +25067,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24428,12 +25097,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24512,9 +25175,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24536,7 +25196,7 @@ msgstr "ë¼ì´ì„¼ìŠ¤ê°€ 없습니다. All rights reserved"
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24569,9 +25229,6 @@ msgstr "메시지가 기ë¡ë˜ì§€ 않았습니다."
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr "표시할 마ì¼ìŠ¤í†¤ì´ 없습니다."
-
msgid "No namespace"
msgstr ""
@@ -24653,6 +25310,9 @@ msgstr ""
msgid "No start date"
msgstr "ì‹œìž‘ì¼ ì—†ìŒ"
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24807,6 +25467,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25243,10 +25906,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25391,6 +26054,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25409,9 +26075,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr "프로ì íŠ¸ 구성ì›ë§Œ ëŒ“ê¸€ì„ ë‹¬ 수 있습니다."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25442,10 +26105,10 @@ msgstr "열기"
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25460,9 +26123,6 @@ msgstr "IDEì—ì„œ 열기"
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "사ì´ë“œë°” 열기"
@@ -25490,6 +26150,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "새 창으로 열기"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25631,6 +26294,9 @@ msgstr ""
msgid "Owner"
msgstr "소유ìž"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26397,6 +27063,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26673,6 +27342,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "파ì´í”„ë¼ì¸"
@@ -26682,10 +27354,13 @@ msgstr "파ì´í”„ë¼ì¸ 차트"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26733,7 +27408,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26742,13 +27417,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26757,7 +27432,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26775,6 +27450,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26787,9 +27465,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr "프로ì íŠ¸ ìºì‹œê°€ 성공ì ìœ¼ë¡œ 재설정ë˜ì—ˆìŠµë‹ˆë‹¤."
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "Runnerì˜ ìºì‹œë¥¼ ë¹„ìš°ë˜ ì¤‘ 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -26844,24 +27528,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "ì´ í”„ë¡œì íŠ¸ëŠ” 현재 파ì´í”„ë¼ì¸ì„ 실행하ë„ë¡ ì„¤ì •ë˜ì§€ 않았습니다."
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -26919,9 +27597,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -26937,9 +27612,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27273,9 +27945,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27330,7 +27999,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27375,7 +28044,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27483,6 +28152,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27792,6 +28464,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -27813,9 +28488,6 @@ msgstr "ì´ë¦„"
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -27852,6 +28524,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -27957,6 +28632,9 @@ msgstr "ì´ ì •ë³´ëŠ” ë‚´ í”„ë¡œí•„ì— í‘œì‹œë©ë‹ˆë‹¤."
msgid "Profiles|Time settings"
msgstr "시간 설정"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "ì´ì¤‘ ì¸ì¤‘"
@@ -28038,9 +28716,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr "ë‚˜ì˜ ìƒíƒœ"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "예: 내 MacBook 키"
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28545,7 +29220,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28644,6 +29319,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -28815,6 +29493,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -28878,6 +29559,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -28896,9 +29580,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29043,6 +29724,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29652,7 +30339,10 @@ msgstr "푸쉬 ì´ë²¤íŠ¸"
msgid "Push project from command line"
msgstr "명령줄로 프로ì íŠ¸ 푸쉬"
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30082,9 +30772,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30094,9 +30790,6 @@ msgstr ""
msgid "Related merge requests"
msgstr "ê´€ë ¨ëœ ë¨¸ì§€ 리퀘스트(MR)"
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30326,6 +31019,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30536,7 +31232,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30613,12 +31312,18 @@ msgstr "실패"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30631,6 +31336,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30646,9 +31357,15 @@ msgstr "테스트 요약"
msgid "Reports|Test summary failed loading results"
msgstr "테스트 요약 로드 실패"
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "테스트 요약 ê²°ê³¼ 분ì„중"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31156,7 +31873,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31217,9 +31934,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "로드맵"
@@ -31271,10 +31985,10 @@ msgstr "태그없는 작업 실행"
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31295,6 +32009,20 @@ msgstr ""
msgid "Runners page."
msgstr "Runners 페ì´ì§€."
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31304,7 +32032,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31331,9 +32059,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31346,12 +32086,19 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31361,6 +32108,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31370,18 +32120,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31403,25 +32147,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31430,15 +32180,28 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31472,9 +32235,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31487,21 +32256,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31511,7 +32310,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31532,6 +32331,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31541,16 +32343,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31568,7 +32373,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31586,7 +32391,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31595,9 +32400,6 @@ 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 ""
@@ -31631,9 +32433,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "실행중"
@@ -31748,10 +32547,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -31943,6 +32742,9 @@ msgstr "프로ì íŠ¸ 검색"
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32056,6 +32858,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32080,6 +32885,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32206,16 +33020,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32272,6 +33089,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32287,6 +33110,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32302,12 +33131,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32317,6 +33155,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32329,9 +33170,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32380,6 +33233,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32398,12 +33254,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32422,6 +33287,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32431,10 +33299,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32458,6 +33329,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32542,6 +33422,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32683,6 +33566,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32707,7 +33593,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32719,16 +33605,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -32788,6 +33677,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -32800,15 +33692,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -32845,15 +33740,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr "초대 í•  그룹 ì„ íƒ"
-
msgid "Select a label"
msgstr "ë¼ë²¨ ì„ íƒ"
@@ -32992,6 +33884,9 @@ msgstr ""
msgid "Select target branch"
msgstr "ëŒ€ìƒ ë¸Œëžœì¹˜ ì„ íƒ"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33328,6 +34223,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33373,6 +34271,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33418,9 +34319,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "ìƒíƒœ ì´ëª¨ì§€ 추가"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33674,6 +34572,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -33840,6 +34741,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34011,6 +34915,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34020,6 +34927,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34059,9 +34969,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr "ë²„íŠ¼ì„ í† ê¸€í•˜ë˜ ì¤‘ 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34194,9 +35101,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34620,6 +35524,9 @@ msgstr "시작 날짜"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34764,6 +35671,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -34836,9 +35746,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -34887,6 +35794,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35052,10 +35962,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35436,8 +36346,9 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35580,12 +36491,6 @@ msgstr ""
msgid "System Info"
msgstr "시스템 정보"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35742,6 +36647,12 @@ msgstr ""
msgid "Target branch"
msgstr "ëŒ€ìƒ ë¸Œëžœì¹˜"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35775,9 +36686,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "템플릿"
@@ -36181,9 +37089,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36214,6 +37119,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36226,6 +37134,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36247,12 +37158,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36545,6 +37462,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36554,6 +37474,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36575,6 +37501,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36587,6 +37516,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -36872,9 +37804,6 @@ 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 ""
@@ -37016,6 +37945,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37028,7 +37960,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37055,7 +37987,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37064,7 +37996,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37151,6 +38083,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37178,6 +38116,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37304,9 +38245,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr "ì´ ìž‘ì—…ì„ ì‹œìž‘í•˜ë ¤ë©´ ì—… 스트림 ìž‘ì—…ì˜ ì„±ê³µì„ í•„ìš”ë¡œ 합니다."
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr "ì´ ìž‘ì—…ì€ ì´ë ¥ì´ 남아 있지 않습니다."
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "ì´ ìž‘ì—…ì€ ì·¨ì†Œë˜ì—ˆìŠµë‹ˆë‹¤"
@@ -37544,6 +38491,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38014,6 +38964,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38095,6 +39048,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38113,7 +39069,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38263,9 +39219,6 @@ msgstr "사ì´ë“œë°” 토글"
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38311,6 +39264,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38404,6 +39360,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38593,6 +39552,9 @@ msgstr "다시 ì‹œë„하십시오"
msgid "Try again?"
msgstr "다시 ì‹œë„í•´ 보세요."
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "GitLabì´ ì œê³µí•˜ëŠ” 모든 ê¸°ëŠ¥ì„ 30ë™ì•ˆ 사용해 보세요."
@@ -38797,6 +39759,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -38833,6 +39798,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -38959,6 +39927,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39139,9 +40110,6 @@ msgstr "CSV íŒŒì¼ ì—…ë¡œë“œ"
msgid "Upload File"
msgstr "íŒŒì¼ ì—…ë¡œë“œ"
-msgid "Upload License"
-msgstr "ë¼ì´ì„ ìŠ¤ 업로드"
-
msgid "Upload New File"
msgstr "새 íŒŒì¼ ì—…ë¡œë“œ"
@@ -39160,9 +40128,6 @@ msgstr "íŒŒì¼ ì—…ë¡œë“œ"
msgid "Upload image"
msgstr "ì´ë¯¸ì§€ 업로드"
-msgid "Upload license"
-msgstr "ë¼ì´ì„ ìŠ¤ 업로드"
-
msgid "Upload new file"
msgstr "새 íŒŒì¼ ì—…ë¡œë“œ"
@@ -39172,6 +40137,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr "업로드하려면 í´ë¦­í•˜ì‹­ì‹œì˜¤."
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr "터미ë„ì— ë³€ê²½ 사항 업로드 중"
@@ -39229,7 +40197,7 @@ msgstr "ì´ë²ˆ ê²°ì œ 주기 사용량"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39466,6 +40434,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39475,6 +40446,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40279,9 +41253,6 @@ msgstr "êµì²´ëœ íŒŒì¼ ë³´ê¸° @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40306,6 +41277,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40411,9 +41385,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40435,6 +41406,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40555,6 +41529,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40651,9 +41628,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40699,6 +41673,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40720,6 +41697,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41020,6 +42000,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41065,9 +42048,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41110,13 +42090,13 @@ msgstr "Runnerê°€ 잠겨 있으면 다른 프로ì íŠ¸ì— 할당 í•  수 없습ë
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41132,6 +42112,9 @@ msgstr[0] "ì´ ë¨¸ì§€ 리퀘스트(MR)ê°€ 승ì¸ëì„ ë•Œ"
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41279,9 +42262,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr "취소"
@@ -41306,12 +42286,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41324,18 +42298,6 @@ msgstr "재시ë„"
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41348,18 +42310,9 @@ msgstr "제목"
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "ì—¬ê¸°ì— ë‚´ìš©ì„ ìž‘ì„±í•˜ê±°ë‚˜ 파ì¼ì„ 드래그하세요…"
@@ -41435,6 +42388,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41444,6 +42400,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41654,6 +42613,12 @@ msgstr "ë‚˜ì¤‘ì— ì–¸ì œë“ ì§€ URLì„ ë³€ê²½í•  수 있습니다."
msgid "You can always edit this later"
msgstr "ë‚˜ì¤‘ì— ì–¸ì œë“ ì§€ 수정할 수 있습니다."
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41747,6 +42712,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr "ë¸Œëžœì¹˜ì— ìžˆì„ ë•Œë§Œ 파ì¼ì„ 편집할 수 있습니다."
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -41777,6 +42745,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -41861,6 +42832,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -41940,10 +42914,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42123,6 +43097,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42135,6 +43112,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42426,7 +43406,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42679,6 +43659,10 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -42773,6 +43757,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -42851,6 +43844,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -42876,9 +43878,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -42961,45 +43969,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43018,7 +43987,7 @@ msgstr "커밋ë¨"
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43122,6 +44091,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "사용"
@@ -43455,6 +44427,10 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "머지 리퀘스트(MR)"
@@ -43549,6 +44525,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43662,9 +44644,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "머지 실패."
-msgid "mrWidget|Merge locally"
-msgstr "로컬ì—ì„œ 머지"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43737,6 +44716,9 @@ msgstr "머지 리퀘스트(MR)"
msgid "mrWidget|Resolve conflicts"
msgstr "ì¶©ëŒ í•´ê²°"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "ë˜ëŒë¦¬ê¸°"
@@ -43857,9 +44839,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr "해당 ì—†ìŒ"
-
msgid "need attention"
msgstr ""
@@ -43920,6 +44899,9 @@ msgstr "ì´ìŠˆ 열기"
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44005,9 +44987,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr "프로ì íŠ¸ ë´‡ì€ ë‹¤ë¥¸ 그룹 / 프로ì íŠ¸ì— 추가할 수 없습니다."
@@ -44207,9 +45186,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ku_TR/gitlab.po b/locale/ku_TR/gitlab.po
index 42b1fbfaad4..0e78a83de67 100644
--- a/locale/ku_TR/gitlab.po
+++ b/locale/ku_TR/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ku\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ky_KG/gitlab.po b/locale/ky_KG/gitlab.po
index d3913b8077d..86b158fb64f 100644
--- a/locale/ky_KG/gitlab.po
+++ b/locale/ky_KG/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ky\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/lt_LT/gitlab.po b/locale/lt_LT/gitlab.po
index 5524a91bd45..9eff350b43c 100644
--- a/locale/lt_LT/gitlab.po
+++ b/locale/lt_LT/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: lt\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -447,6 +441,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -468,6 +469,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -489,8 +497,8 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -620,9 +628,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -872,6 +877,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -950,7 +958,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -959,9 +967,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -1031,6 +1036,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1170,10 +1178,20 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1486,7 +1504,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1850,9 +1868,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -2045,6 +2072,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -2075,9 +2105,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2231,6 +2258,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2288,6 +2318,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2411,6 +2444,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2639,6 +2675,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2720,6 +2759,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2732,6 +2774,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2744,6 +2789,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2828,12 +2876,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2873,6 +2927,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2888,6 +2963,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2903,6 +2981,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2912,9 +2996,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2924,6 +3005,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3830,7 +3914,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3944,6 +4028,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3998,6 +4085,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4241,6 +4331,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4356,6 +4449,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4446,6 +4542,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4945,6 +5044,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5189,12 +5291,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5287,6 +5383,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5317,6 +5416,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5338,6 +5440,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5698,9 +5848,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5722,6 +5869,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5812,6 +5962,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6038,6 +6194,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -6053,6 +6212,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6062,24 +6224,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6144,6 +6321,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6250,6 +6430,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6409,9 +6592,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6451,6 +6631,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6493,12 +6676,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6511,9 +6700,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6526,6 +6721,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7106,6 +7304,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -7136,6 +7337,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7303,6 +7510,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7417,6 +7627,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7660,24 +7873,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7735,6 +7936,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7894,6 +8104,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7918,7 +8131,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7933,6 +8146,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7972,22 +8188,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7996,10 +8215,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8011,6 +8248,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8026,10 +8266,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8041,10 +8284,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8059,9 +8299,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8095,13 +8332,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8122,10 +8353,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8137,13 +8365,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8159,9 +8384,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8183,6 +8405,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8225,9 +8450,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8336,10 +8558,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8387,16 +8606,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8432,6 +8642,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8441,6 +8654,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8504,9 +8720,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8552,7 +8765,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8645,9 +8858,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8897,12 +9107,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8915,7 +9131,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9159,9 +9375,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9288,6 +9501,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9321,9 +9537,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9348,6 +9561,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9357,7 +9573,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9369,12 +9585,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9483,6 +9711,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9528,6 +9759,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9537,6 +9771,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9606,6 +9843,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9731,9 +9974,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9791,7 +10031,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9888,6 +10128,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9927,6 +10170,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10236,6 +10482,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10272,6 +10521,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10287,9 +10542,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10407,7 +10659,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10446,9 +10698,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10560,9 +10818,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10587,6 +10842,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10617,9 +10875,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10872,43 +11127,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10923,10 +11160,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11037,19 +11274,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11178,15 +11412,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11243,12 +11495,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11264,10 +11522,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11414,6 +11672,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11468,9 +11729,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11718,6 +11976,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11847,9 +12108,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11868,9 +12126,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12525,6 +12780,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12589,6 +12871,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13248,6 +13533,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13305,6 +13593,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13395,6 +13686,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13440,6 +13734,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13542,9 +13875,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13869,6 +14199,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14146,7 +14479,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14278,6 +14611,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14293,9 +14629,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14377,7 +14710,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14749,6 +15085,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14758,6 +15100,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14999,6 +15344,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15011,6 +15359,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -15131,6 +15482,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15260,9 +15614,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15375,6 +15735,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15799,7 +16162,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15940,9 +16303,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16207,9 +16567,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16237,6 +16594,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16300,9 +16660,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16852,9 +17209,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16867,6 +17221,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16918,9 +17275,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17146,15 +17500,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17194,6 +17557,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17320,9 +17686,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17332,6 +17695,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17536,9 +17935,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17941,13 +18337,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18070,6 +18466,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18088,9 +18487,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18211,6 +18607,113 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18383,6 +18886,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18534,9 +19040,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18612,9 +19115,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18744,6 +19244,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18818,7 +19324,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18848,12 +19354,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18863,9 +19363,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19206,9 +19703,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19287,15 +19781,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19587,6 +20072,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19596,6 +20084,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19653,6 +20150,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19668,6 +20171,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19749,6 +20255,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19770,6 +20279,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19779,6 +20291,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19887,6 +20402,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20089,6 +20610,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20203,6 +20727,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20215,12 +20742,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20368,9 +20901,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20386,12 +20916,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20485,6 +21009,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20503,6 +21030,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20515,6 +21048,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20707,9 +21243,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20752,7 +21285,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20923,10 +21456,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20941,12 +21477,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20956,6 +21486,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20977,7 +21510,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20995,6 +21534,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21004,10 +21546,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21019,6 +21567,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21031,6 +21582,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21286,9 +21840,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21301,6 +21852,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21364,6 +21918,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21373,6 +21930,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21400,15 +21963,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21424,9 +21996,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21436,6 +22026,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21460,6 +22053,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21821,6 +22417,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21929,6 +22528,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22070,6 +22675,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22082,6 +22690,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22100,6 +22711,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22127,9 +22741,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22172,6 +22783,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22181,6 +22799,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22196,6 +22820,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22385,9 +23015,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22661,6 +23288,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22694,6 +23324,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22856,6 +23489,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22976,9 +23612,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23000,6 +23633,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23239,9 +23878,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23278,7 +23914,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23353,7 +23989,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23909,9 +24545,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -24033,6 +24666,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24051,6 +24687,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24069,12 +24708,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24192,6 +24840,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24288,16 +24939,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24406,6 +25057,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24481,6 +25159,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24667,9 +25348,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24764,6 +25442,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24839,6 +25520,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24854,9 +25538,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24905,6 +25586,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24953,6 +25637,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24980,12 +25667,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25064,9 +25745,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25088,7 +25766,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25121,9 +25799,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25205,6 +25880,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25362,6 +26040,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25810,10 +26491,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25961,6 +26642,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25979,9 +26663,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26012,10 +26693,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26030,9 +26711,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26060,6 +26738,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26201,6 +26882,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26970,6 +27654,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27246,6 +27933,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27255,10 +27945,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27306,7 +27999,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27315,13 +28008,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27330,7 +28023,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27348,6 +28041,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27360,9 +28056,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27417,24 +28119,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27492,9 +28188,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27510,9 +28203,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27846,9 +28536,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27903,7 +28590,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27948,7 +28635,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28056,6 +28743,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28365,6 +29055,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28386,9 +29079,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28425,6 +29115,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28530,6 +29223,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28611,9 +29307,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29118,7 +29811,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29217,6 +29910,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29388,6 +30084,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29451,6 +30150,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29469,9 +30171,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29616,6 +30315,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30225,7 +30930,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30658,9 +31366,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30670,9 +31384,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30905,6 +31616,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31115,7 +31829,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31207,12 +31924,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31225,6 +31948,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31240,9 +31969,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31759,7 +32494,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31823,9 +32558,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31877,10 +32609,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31901,6 +32633,26 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31910,7 +32662,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31937,9 +32689,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31952,12 +32716,22 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31967,6 +32741,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31976,18 +32753,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32009,25 +32780,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32036,15 +32813,31 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32078,9 +32871,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32093,21 +32892,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32117,7 +32946,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32138,6 +32967,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32147,16 +32979,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32174,7 +33009,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32192,7 +33027,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32201,9 +33036,6 @@ 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 ""
@@ -32237,9 +33069,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32354,10 +33183,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32549,6 +33378,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32695,6 +33527,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32719,6 +33554,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32845,16 +33689,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32911,6 +33758,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32926,6 +33779,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32941,12 +33800,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32956,6 +33824,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32968,9 +33839,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33019,6 +33902,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33037,12 +33923,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33061,6 +33956,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33070,10 +33968,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33097,6 +33998,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33181,6 +34091,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33322,6 +34235,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33346,7 +34262,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33358,16 +34274,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33427,6 +34346,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33439,15 +34361,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33484,15 +34409,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33631,6 +34553,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33967,6 +34892,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34012,6 +34940,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -34057,9 +34988,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34316,6 +35244,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34485,6 +35416,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34656,6 +35590,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34665,6 +35602,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34704,9 +35644,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34839,9 +35776,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35265,6 +36199,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35409,6 +36346,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35481,9 +36421,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35532,6 +36469,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35697,10 +36637,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36081,8 +37021,12 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36225,12 +37169,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36387,6 +37325,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36420,9 +37364,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36847,9 +37788,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36880,6 +37818,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36892,6 +37833,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36913,12 +37857,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37214,6 +38164,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37223,6 +38176,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37244,6 +38203,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37256,6 +38218,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37541,9 +38506,6 @@ 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 ""
@@ -37685,6 +38647,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37697,7 +38662,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37724,7 +38689,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37733,7 +38698,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37820,6 +38785,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37847,6 +38818,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37973,9 +38947,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38213,6 +39193,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38689,6 +39672,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38770,6 +39756,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38788,7 +39777,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38938,9 +39927,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38986,6 +39972,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39079,6 +40068,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39268,6 +40260,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39472,6 +40467,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39508,6 +40506,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39634,6 +40635,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39814,9 +40818,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39835,9 +40836,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39847,6 +40845,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39904,7 +40905,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40141,6 +41142,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40150,6 +41154,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40963,9 +41970,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40990,6 +41994,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41095,9 +42102,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41119,6 +42123,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41239,6 +42246,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41335,9 +42345,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41383,6 +42390,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41404,6 +42414,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41704,6 +42717,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41749,9 +42765,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41794,13 +42807,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41819,6 +42832,9 @@ msgstr[3] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41966,9 +42982,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41993,12 +43006,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42011,18 +43018,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42035,18 +43030,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42122,6 +43108,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42131,6 +43120,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42341,6 +43333,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42434,6 +43432,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42464,6 +43465,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42548,6 +43552,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42630,10 +43637,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42813,6 +43820,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42825,6 +43835,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43116,7 +44129,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43381,6 +44394,13 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43478,6 +44498,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43556,6 +44585,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43584,9 +44622,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43672,45 +44716,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43729,7 +44734,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43839,6 +44844,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44181,6 +45189,13 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44278,6 +45293,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44397,9 +45418,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44472,6 +45490,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44592,9 +45613,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44655,6 +45673,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44752,9 +45773,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44957,9 +45975,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/mk_MK/gitlab.po b/locale/mk_MK/gitlab.po
index f9f56c2f423..5e906d4a097 100644
--- a/locale/mk_MK/gitlab.po
+++ b/locale/mk_MK/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: mk\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:14\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ml_IN/gitlab.po b/locale/ml_IN/gitlab.po
new file mode 100644
index 00000000000..4ce624fdd62
--- /dev/null
+++ b/locale/ml_IN/gitlab.po
@@ -0,0 +1,45603 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: gitlab-ee\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: Malayalam\n"
+"Language: ml_IN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Crowdin-Project: gitlab-ee\n"
+"X-Crowdin-Project-ID: 288872\n"
+"X-Crowdin-Language: ml-IN\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
+"X-Crowdin-File-ID: 6\n"
+"PO-Revision-Date: 2022-04-01 09:17\n"
+
+msgid " %{start} to %{end}"
+msgstr ""
+
+msgid " (from %{timeoutSource})"
+msgstr ""
+
+msgid " Collected %{time}"
+msgstr ""
+
+msgid " Please sign in."
+msgstr ""
+
+msgid " Try to %{action} this file again."
+msgstr ""
+
+msgid " You need to do this before %{grace_period_deadline}."
+msgstr ""
+
+msgid " and "
+msgstr ""
+
+msgid " and %{sliced}"
+msgstr ""
+
+msgid " or "
+msgstr ""
+
+msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
+msgstr ""
+
+msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
+msgstr ""
+
+msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
+msgstr ""
+
+msgid " or references (e.g. path/to/project!merge_request_id)"
+msgstr ""
+
+msgid " reacted with :%{name}:"
+msgstr ""
+
+msgid "\"%{path}\" did not exist on \"%{ref}\""
+msgstr ""
+
+msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
+msgstr ""
+
+msgid "#%{issueIid} (closed)"
+msgstr ""
+
+msgid "#general, #development"
+msgstr ""
+
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Approval"
+msgid_plural "%d Approvals"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Module"
+msgid_plural "%d Modules"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Other"
+msgid_plural "%d Others"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Package"
+msgid_plural "%d Packages"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Scanned URL"
+msgid_plural "%d Scanned URLs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d URL scanned"
+msgid_plural "%d URLs scanned"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d additional approver"
+msgid_plural "%d additional approvers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d additional assignee"
+msgid_plural "%d additional assignees"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d additional commenter"
+msgid_plural "%d additional commenters"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d additional committer"
+msgid_plural "%d additional committers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d approver"
+msgid_plural "%d approvers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d approver (you've approved)"
+msgid_plural "%d approvers (you've approved)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d assigned issue"
+msgid_plural "%d assigned issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d changed file"
+msgid_plural "%d changed files"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d character remaining"
+msgid_plural "%d characters remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d child epic"
+msgid_plural "%d child epics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d code quality issue"
+msgid_plural "%d code quality issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d comment on this commit"
+msgid_plural "%d comments on this commit"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d commenter"
+msgid_plural "%d commenters"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d commit"
+msgid_plural "%d commits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d commit author"
+msgid_plural "%d commit authors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d commit behind"
+msgid_plural "%d commits behind"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d commit,"
+msgid_plural "%d commits,"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d completed issue"
+msgid_plural "%d completed issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d contribution"
+msgid_plural "%d contributions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d epic"
+msgid_plural "%d epics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d error found:"
+msgid_plural "%d errors found:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d exporter"
+msgid_plural "%d exporters"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d failed"
+msgid_plural "%d failed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d failed security job"
+msgid_plural "%d failed security jobs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d file"
+msgid_plural "%d files"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d fixed test result"
+msgid_plural "%d fixed test results"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d fork"
+msgid_plural "%d forks"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d group"
+msgid_plural "%d groups"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d inaccessible merge request"
+msgid_plural "%d inaccessible merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d issue"
+msgid_plural "%d issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d issue in this group"
+msgid_plural "%d issues in this group"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d issue successfully imported with the label"
+msgid_plural "%d issues successfully imported with the label"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d layer"
+msgid_plural "%d layers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d merge request"
+msgid_plural "%d merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d merge request that you don't have access to."
+msgid_plural "%d merge requests that you don't have access to."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d merge requests"
+msgid_plural "%d merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d metric"
+msgid_plural "%d metrics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d milestone"
+msgid_plural "%d milestones"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d more comment"
+msgid_plural "%d more comments"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d open issue"
+msgid_plural "%d open issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d pending comment"
+msgid_plural "%d pending comments"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d personal project will be removed and cannot be restored."
+msgid_plural "%d personal projects will be removed and cannot be restored."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d previously merged commit"
+msgid_plural "%d previously merged commits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d project"
+msgid_plural "%d projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d project selected"
+msgid_plural "%d projects selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d star"
+msgid_plural "%d stars"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d tag"
+msgid_plural "%d tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d tag per image name"
+msgid_plural "%d tags per image name"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d token has expired"
+msgid_plural "%d tokens have expired"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d unassigned issue"
+msgid_plural "%d unassigned issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d unresolved thread"
+msgid_plural "%d unresolved threads"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability dismissed"
+msgid_plural "%d vulnerabilities dismissed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability set to confirmed"
+msgid_plural "%d vulnerabilities set to confirmed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability set to dismissed"
+msgid_plural "%d vulnerabilities set to dismissed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability set to needs triage"
+msgid_plural "%d vulnerabilities set to needs triage"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d vulnerability set to resolved"
+msgid_plural "%d vulnerabilities set to resolved"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d warning found:"
+msgid_plural "%d warnings found:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%s additional commit has been omitted to prevent performance issues."
+msgid_plural "%s additional commits have been omitted to prevent performance issues."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{actionText} & %{openOrClose} %{noteable}"
+msgstr ""
+
+msgid "%{actionText} & close %{noteable}"
+msgstr ""
+
+msgid "%{actionText} & reopen %{noteable}"
+msgstr ""
+
+msgid "%{address} is an invalid IP address range"
+msgstr ""
+
+msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
+msgstr ""
+
+msgid "%{author_link} cloned %{original_issue}. You don't have access to the new project."
+msgstr ""
+
+msgid "%{author_link} wrote:"
+msgstr ""
+
+msgid "%{authorsName}'s thread"
+msgstr ""
+
+msgid "%{board_target} not found"
+msgstr ""
+
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{codeStart}type%{codeEnd} is deprecated and will be removed in 15.0. Use %{codeStart}stage%{codeEnd} instead. %{linkStart}Learn More %{linkEnd}"
+msgstr ""
+
+msgid "%{codeStart}types%{codeEnd} is deprecated and will be removed in 15.0. Use %{codeStart}stages%{codeEnd} instead. %{linkStart}Learn More %{linkEnd}"
+msgstr ""
+
+msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
+msgstr ""
+
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
+
+msgid "%{completedCount} completed weight"
+msgstr ""
+
+msgid "%{completedCount} of %{count} task completed"
+msgid_plural "%{completedCount} of %{count} tasks completed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{completedWeight} of %{totalWeight} weight completed"
+msgstr ""
+
+msgid "%{completed} of %{total} issues closed"
+msgstr ""
+
+msgid "%{completed} of %{total} weight completed"
+msgstr ""
+
+msgid "%{cores} cores"
+msgstr ""
+
+msgid "%{count} %{scope} for term '%{term}'"
+msgstr ""
+
+msgid "%{count} LOC/commit"
+msgstr ""
+
+msgid "%{count} approval required from %{name}"
+msgid_plural "%{count} approvals required from %{name}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} contact"
+msgid_plural "%{count} contacts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} files touched"
+msgstr ""
+
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} items per page"
+msgstr ""
+
+msgid "%{count} more"
+msgstr ""
+
+msgid "%{count} more assignees"
+msgstr ""
+
+msgid "%{count} more release"
+msgid_plural "%{count} more releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} of %{required} approvals from %{name}"
+msgstr ""
+
+msgid "%{count} of %{total}"
+msgstr ""
+
+msgid "%{count} participant"
+msgid_plural "%{count} participants"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{count} related %{pluralized_subject}: %{links}"
+msgstr ""
+
+msgid "%{count} selected"
+msgstr ""
+
+msgid "%{count} total weight"
+msgstr ""
+
+msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} High%{highEnd} and %{otherStart}%{otherMessage}%{otherEnd}"
+msgstr ""
+
+msgid "%{dashboard_path} could not be found."
+msgstr ""
+
+msgid "%{days} days until tags are automatically removed"
+msgstr ""
+
+msgid "%{deployLinkStart}Use a template to deploy to ECS%{deployLinkEnd}, or use a docker image to %{commandsLinkStart}run AWS commands in GitLab CI/CD%{commandsLinkEnd}."
+msgstr ""
+
+msgid "%{description}- Sentry event: %{errorUrl}- First seen: %{firstSeen}- Last seen: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
+msgstr ""
+
+msgid "%{doc_link_start}Advanced search%{doc_link_end} is disabled since %{ref_elem} is not the default branch. %{docs_link}"
+msgstr ""
+
+msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
+msgstr ""
+
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
+msgid "%{due_date} (Past due)"
+msgstr ""
+
+msgid "%{duration}ms"
+msgstr ""
+
+msgid "%{edit_in_new_fork_notice} Try to cherry-pick this commit again."
+msgstr ""
+
+msgid "%{edit_in_new_fork_notice} Try to create a new directory again."
+msgstr ""
+
+msgid "%{edit_in_new_fork_notice} Try to revert this commit again."
+msgstr ""
+
+msgid "%{edit_in_new_fork_notice} Try to upload a file again."
+msgstr ""
+
+msgid "%{emailPrefix}@company.com"
+msgstr ""
+
+msgid "%{extra} more downstream pipelines"
+msgstr ""
+
+msgid "%{filePath} deleted"
+msgstr ""
+
+msgid "%{firstLabel} +%{labelCount} more"
+msgstr ""
+
+msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
+msgstr ""
+
+msgid "%{gitlab_experience_text}. Don't worry, this information isn't shared outside of your self-managed GitLab instance."
+msgstr ""
+
+msgid "%{gitlab_experience_text}. We won't share this information with anyone."
+msgstr ""
+
+msgid "%{global_id} is not a valid ID for %{expected_types}."
+msgstr ""
+
+msgid "%{group_name} activity"
+msgstr ""
+
+msgid "%{group_name} group members"
+msgstr ""
+
+msgid "%{group_name} is approaching the limit of available seats"
+msgstr ""
+
+msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
+msgstr ""
+
+msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
+msgstr ""
+
+msgid "%{hook_type} was deleted"
+msgstr ""
+
+msgid "%{hook_type} was scheduled for deletion"
+msgstr ""
+
+msgid "%{host} sign-in from new location"
+msgstr ""
+
+msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
+msgstr ""
+
+msgid "%{issuableType} will be removed! Are you sure?"
+msgstr ""
+
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
+msgid "%{issueType} actions"
+msgstr ""
+
+msgid "%{issuesSize} with a limit of %{maxIssueCount}"
+msgstr ""
+
+msgid "%{italic_start}What's new%{italic_end} is inactive and cannot be viewed."
+msgstr ""
+
+msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgstr ""
+
+msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
+msgstr ""
+
+msgid "%{labelStart}Assert:%{labelEnd} %{assertion}"
+msgstr ""
+
+msgid "%{labelStart}Class:%{labelEnd} %{class}"
+msgstr ""
+
+msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
+msgstr ""
+
+msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
+msgstr ""
+
+msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
+msgstr ""
+
+msgid "%{labelStart}File:%{labelEnd} %{file}"
+msgstr ""
+
+msgid "%{labelStart}Image:%{labelEnd} %{image}"
+msgstr ""
+
+msgid "%{labelStart}Method:%{labelEnd} %{method}"
+msgstr ""
+
+msgid "%{labelStart}Namespace:%{labelEnd} %{namespace}"
+msgstr ""
+
+msgid "%{labelStart}Scanner:%{labelEnd} %{scanner}"
+msgstr ""
+
+msgid "%{labelStart}Sent request:%{labelEnd} %{headers}"
+msgstr ""
+
+msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
+msgstr ""
+
+msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
+msgstr ""
+
+msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
+msgstr ""
+
+msgid "%{label_for_message} unavailable"
+msgstr ""
+
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
+msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
+msgstr ""
+
+msgid "%{level_name} is not allowed in a %{group_level_name} group."
+msgstr ""
+
+msgid "%{level_name} is not allowed since the fork source project has lower visibility."
+msgstr ""
+
+msgid "%{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr ""
+
+msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
+msgstr ""
+
+msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
+msgstr ""
+
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
+msgid "%{listToShow}, and %{awardsListLength} more"
+msgstr ""
+
+msgid "%{location} is missing required keys: %{keys}"
+msgstr ""
+
+msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
+msgstr ""
+
+msgid "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} and %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd} are supported"
+msgstr ""
+
+msgid "%{mergeLength}/%{usersLength} can merge"
+msgstr ""
+
+msgid "%{message} showing first %{warnings_displayed}"
+msgstr ""
+
+msgid "%{milestone} (expired)"
+msgstr ""
+
+msgid "%{milliseconds}ms"
+msgstr ""
+
+msgid "%{model_name} not found"
+msgstr ""
+
+msgid "%{mrText}, this issue will be closed automatically."
+msgstr ""
+
+msgid "%{name_with_link} namespace has %{percent} or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "%{name_with_link} namespace has run out of Shared Runner Pipeline minutes. No new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "%{name} (Busy)"
+msgstr ""
+
+msgid "%{name} contained %{resultsString}"
+msgstr ""
+
+msgid "%{name} found %{resultsString}"
+msgstr ""
+
+msgid "%{name} is already being used for another emoji"
+msgstr ""
+
+msgid "%{name} is reserved for %{type} report type"
+msgstr ""
+
+msgid "%{name} is scheduled for %{action}"
+msgstr ""
+
+msgid "%{name}'s avatar"
+msgstr ""
+
+msgid "%{name}(%{url}) namespace has %{percent} or less Shared Runner Pipeline minutes remaining. After it runs out, no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "%{name}(%{url}) namespace has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "%{name}, confirm your email address now!"
+msgstr ""
+
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
+msgid "%{no_of_days} day"
+msgid_plural "%{no_of_days} days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
+msgstr ""
+
+msgid "%{oneMonthAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneWeekAgo} - %{today}"
+msgstr ""
+
+msgid "%{oneYearAgo} - %{today}"
+msgstr ""
+
+msgid "%{openedEpics} open, %{closedEpics} closed"
+msgstr ""
+
+msgid "%{openedIssues} open, %{closedIssues} closed"
+msgstr ""
+
+msgid "%{percentage}%% issues closed"
+msgstr ""
+
+msgid "%{percentage}%% weight completed"
+msgstr ""
+
+msgid "%{percent}%% complete"
+msgstr ""
+
+msgid "%{percent}%{percentSymbol} complete"
+msgstr ""
+
+msgid "%{placeholder} is not a valid color scheme"
+msgstr ""
+
+msgid "%{placeholder} is not a valid theme"
+msgstr ""
+
+msgid "%{policy_link} (notifying after %{elapsed_time} minutes unless %{status})"
+msgstr ""
+
+msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more.%{help_link_end}"
+msgstr ""
+
+msgid "%{ref} cannot be added: %{error}"
+msgstr ""
+
+msgid "%{releases} release"
+msgid_plural "%{releases} releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{remaining_approvals} left"
+msgstr ""
+
+msgid "%{reportType} %{status}"
+msgstr ""
+
+msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}"
+msgstr ""
+
+msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
+msgstr ""
+
+msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
+msgstr ""
+
+msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation_link}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
+msgstr ""
+
+msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
+msgstr ""
+
+msgid "%{runner} created %{timeago}"
+msgstr ""
+
+msgid "%{scope} results for term '%{term}'"
+msgstr ""
+
+msgid "%{search} %{description} %{scope}"
+msgstr ""
+
+msgid "%{seconds}s"
+msgstr ""
+
+msgid "%{securityScanner} is not enabled for this project. %{linkStart}More information%{linkEnd}"
+msgid_plural "%{securityScanner} are not enabled for this project. %{linkStart}More information%{linkEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{securityScanner} result is not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
+msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
+msgstr ""
+
+msgid "%{size} %{unit}"
+msgstr ""
+
+msgid "%{size} GiB"
+msgstr ""
+
+msgid "%{size} KiB"
+msgstr ""
+
+msgid "%{size} MiB"
+msgstr ""
+
+msgid "%{size} bytes"
+msgstr ""
+
+msgid "%{sourceBranch} into %{targetBranch}"
+msgstr ""
+
+msgid "%{spammable_titlecase} was submitted to Akismet successfully."
+msgstr ""
+
+msgid "%{spanStart}at line%{spanEnd} %{errorLine}%{errorColumn}"
+msgstr ""
+
+msgid "%{spanStart}in%{spanEnd} %{errorFn}"
+msgstr ""
+
+msgid "%{start} to %{end}"
+msgstr ""
+
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
+msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{commit_count}%{strong_end} Commit"
+msgid_plural "%{strong_start}%{commit_count}%{strong_end} Commits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{count} approval rule%{strong_end} requires eligible members to approve before merging."
+msgid_plural "%{strong_start}%{count} approval rules%{strong_end} require eligible members to approve before merging."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{count} eligible member%{strong_end} must approve to merge."
+msgid_plural "%{strong_start}%{count} eligible members%{strong_end} must approve to merge."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{count} member%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
+msgid_plural "%{strong_start}%{count} members%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{human_size}%{strong_end} Files"
+msgstr ""
+
+msgid "%{strong_start}%{human_size}%{strong_end} Storage"
+msgstr ""
+
+msgid "%{strong_start}%{release_count}%{strong_end} Release"
+msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
+msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{tabname} changed"
+msgstr ""
+
+msgid "%{tags} tag per image name"
+msgstr ""
+
+msgid "%{tags} tags per image name"
+msgstr ""
+
+msgid "%{tag}-%{evidence}-%{filename}"
+msgstr ""
+
+msgid "%{template_project_id} is unknown or invalid"
+msgstr ""
+
+msgid "%{text} is available"
+msgstr ""
+
+msgid "%{timebox_name} should belong either to a project or a group."
+msgstr ""
+
+msgid "%{timebox_type} does not support burnup charts"
+msgstr ""
+
+msgid "%{timebox_type} must have a start and due date"
+msgstr ""
+
+msgid "%{title} %{operator} %{threshold}"
+msgstr ""
+
+msgid "%{title} changes"
+msgstr ""
+
+msgid "%{totalCpu} (%{freeSpacePercentage}%{percentSymbol} free)"
+msgstr ""
+
+msgid "%{totalMemory} (%{freeSpacePercentage}%{percentSymbol} free)"
+msgstr ""
+
+msgid "%{totalWeight} total weight"
+msgstr ""
+
+msgid "%{total_warnings} warning(s) found:"
+msgstr ""
+
+msgid "%{total} open issue weight"
+msgstr ""
+
+msgid "%{total} warnings found: showing first %{warningsDisplayed}"
+msgstr ""
+
+msgid "%{type} only supports %{name} name"
+msgstr ""
+
+msgid "%{userName} (cannot merge)"
+msgstr ""
+
+msgid "%{userName}'s avatar"
+msgstr ""
+
+msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedule} in %{project}. "
+msgstr ""
+
+msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project_link}: "
+msgstr ""
+
+msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project}:"
+msgstr ""
+
+msgid "%{user_name} profile page"
+msgstr ""
+
+msgid "%{username} changed the draft status of merge request %{mr_link}"
+msgstr ""
+
+msgid "%{username} has asked for a GitLab account on your instance %{host}:"
+msgstr ""
+
+msgid "%{username}'s avatar"
+msgstr ""
+
+msgid "%{user} created a merge request: %{mr_link}"
+msgstr ""
+
+msgid "%{user} created an epic: %{epic_link}"
+msgstr ""
+
+msgid "%{user} created an issue: %{issue_link}"
+msgstr ""
+
+msgid "%{value} is not included in the list"
+msgstr ""
+
+msgid "%{value} s"
+msgstr ""
+
+msgid "%{verb} %{time_spent_value} spent time."
+msgstr ""
+
+msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project."
+msgstr ""
+
+msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook."
+msgstr ""
+
+msgid "%{widget} options"
+msgstr ""
+
+msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
+msgstr ""
+
+msgid "'%{data}' at %{location} does not match format: %{format}"
+msgstr ""
+
+msgid "'%{data}' at %{location} does not match pattern: %{pattern}"
+msgstr ""
+
+msgid "'%{data}' at %{location} is invalid: error_type=%{type}"
+msgstr ""
+
+msgid "'%{data}' at %{location} is not of type: %{type}"
+msgstr ""
+
+msgid "'%{data}' at %{location} is not one of: %{enum}"
+msgstr ""
+
+msgid "'%{data}' at %{location} is not: %{const}"
+msgstr ""
+
+msgid "'%{level}' is not a valid visibility level"
+msgstr ""
+
+msgid "'%{name}' Value Stream created"
+msgstr ""
+
+msgid "'%{name}' Value Stream deleted"
+msgstr ""
+
+msgid "'%{name}' Value Stream saved"
+msgstr ""
+
+msgid "'%{source}' is not a import source"
+msgstr ""
+
+msgid "'%{template_name}' is unknown or invalid"
+msgstr ""
+
+msgid "(%d closed)"
+msgid_plural "(%d closed)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "(%{mrCount} merged)"
+msgstr ""
+
+msgid "(%{value}) has already been taken"
+msgstr ""
+
+msgid "(+%{count}&nbsp;rules)"
+msgstr ""
+
+msgid "(Group Managed Account)"
+msgstr ""
+
+msgid "(No changes)"
+msgstr ""
+
+msgid "(UTC %{offset}) %{timezone}"
+msgstr ""
+
+msgid "(check progress)"
+msgstr ""
+
+msgid "(deleted)"
+msgstr ""
+
+msgid "(expired)"
+msgstr ""
+
+msgid "(leave blank if you don't want to change it)"
+msgstr ""
+
+msgid "(max size 15 MB)"
+msgstr ""
+
+msgid "(optional)"
+msgstr ""
+
+msgid "(removed)"
+msgstr ""
+
+msgid "(revoked)"
+msgstr ""
+
+msgid "(squashes %d commit)"
+msgid_plural "(squashes %d commits)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "(this user)"
+msgstr ""
+
+msgid "(we need your current password to confirm your changes)"
+msgstr ""
+
+msgid "* All times are in UTC unless specified"
+msgstr ""
+
+msgid "*Required"
+msgstr ""
+
+msgid "+ %{amount} more"
+msgstr ""
+
+msgid "+ %{count} more"
+msgstr ""
+
+msgid "+ %{moreCount} more"
+msgstr ""
+
+msgid "+ %{numberOfHiddenAssignees} more"
+msgstr ""
+
+msgid "+%d more"
+msgid_plural "+%d more"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "+%{approvers} more approvers"
+msgstr ""
+
+msgid "+%{extra} more"
+msgstr ""
+
+msgid "+%{more_assignees_count}"
+msgstr ""
+
+msgid "+%{more_assignees_count} more assignees"
+msgstr ""
+
+msgid "+%{more_reviewers_count}"
+msgstr ""
+
+msgid "+%{more_reviewers_count} more reviewers"
+msgstr ""
+
+msgid "+%{tags} more"
+msgstr ""
+
+msgid ", "
+msgstr ""
+
+msgid ", or "
+msgstr ""
+
+msgid "- %{policy_name} (notifying after %{elapsed_time} minutes unless %{status})"
+msgstr ""
+
+msgid "- Available to run jobs."
+msgstr ""
+
+msgid "- Event"
+msgid_plural "- Events"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "- Not available to run jobs."
+msgstr ""
+
+msgid "- Select -"
+msgstr ""
+
+msgid "- User"
+msgid_plural "- Users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "- of - issues closed"
+msgstr ""
+
+msgid "- of - weight completed"
+msgstr ""
+
+msgid "- show less"
+msgstr ""
+
+msgid "."
+msgstr ""
+
+msgid "/"
+msgstr ""
+
+msgid "0 bytes"
+msgstr ""
+
+msgid "0t1DgySidms"
+msgstr ""
+
+msgid "1 Day"
+msgid_plural "%d Days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 closed issue"
+msgid_plural "%{issues} closed issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 closed merge request"
+msgid_plural "%{merge_requests} closed merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 day remaining"
+msgid_plural "%d days remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 day selected"
+msgid_plural "%d days selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 deploy key"
+msgid_plural "%d deploy keys"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 follower"
+msgid_plural "%{count} followers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 group"
+msgid_plural "%d groups"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 issue selected"
+msgid_plural "%d issues selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 merge request selected"
+msgid_plural "%d merge requests selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 merged merge request"
+msgid_plural "%{merge_requests} merged merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 month remaining"
+msgid_plural "%d months remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 open issue"
+msgid_plural "%{issues} open issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 open merge request"
+msgid_plural "%{merge_requests} open merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 pipeline"
+msgid_plural "%d pipelines"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 role"
+msgid_plural "%d roles"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 user"
+msgid_plural "%{num} users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 week remaining"
+msgid_plural "%d weeks remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1 year remaining"
+msgid_plural "%d years remaining"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "1-9 contributions"
+msgstr ""
+
+msgid "10-19 contributions"
+msgstr ""
+
+msgid "1000+"
+msgstr ""
+
+msgid "192.168.0.0/24 or 2001:0DB8:1234::/48"
+msgstr ""
+
+msgid "1st contribution!"
+msgstr ""
+
+msgid "20-29 contributions"
+msgstr ""
+
+msgid "2FA"
+msgstr ""
+
+msgid "2FADevice|Registered On"
+msgstr ""
+
+msgid "3 days"
+msgstr ""
+
+msgid "3 hours"
+msgstr ""
+
+msgid "30 days"
+msgstr ""
+
+msgid "30 minutes"
+msgstr ""
+
+msgid "30+ contributions"
+msgstr ""
+
+msgid "403|Please contact your GitLab administrator to get permission."
+msgstr ""
+
+msgid "403|You don't have the permission to access this page."
+msgstr ""
+
+msgid "404|Make sure the address is correct and the page hasn't moved."
+msgstr ""
+
+msgid "404|Page Not Found"
+msgstr ""
+
+msgid "404|Please contact your GitLab administrator if you think this is a mistake."
+msgstr ""
+
+msgid "7 days"
+msgstr ""
+
+msgid "8 hours"
+msgstr ""
+
+msgid ":%{startLine} to %{endLine}"
+msgstr ""
+
+msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents."
+msgstr ""
+
+msgid "A .NET Core console application template, customizable for any .NET Core project"
+msgstr ""
+
+msgid "A CI/CD pipeline must run and be successful before merge."
+msgstr ""
+
+msgid "A GitBook site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
+msgstr ""
+
+msgid "A Gitpod configured Webapplication in Spring and Java"
+msgstr ""
+
+msgid "A Hexo site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
+msgstr ""
+
+msgid "A Hugo site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
+msgstr ""
+
+msgid "A Jekyll site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
+msgstr ""
+
+msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
+msgstr ""
+
+msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
+msgstr ""
+
+msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
+msgstr ""
+
+msgid "A basic template for developing Linux programs using Kotlin Native"
+msgstr ""
+
+msgid "A complete DevOps platform"
+msgstr ""
+
+msgid "A default branch cannot be chosen for an empty project."
+msgstr ""
+
+msgid "A deleted user"
+msgstr ""
+
+msgid "A different reason"
+msgstr ""
+
+msgid "A file has been changed."
+msgstr ""
+
+msgid "A file was not found."
+msgstr ""
+
+msgid "A file with '%{file_name}' already exists in %{branch} branch"
+msgstr ""
+
+msgid "A group is a collection of several projects"
+msgstr ""
+
+msgid "A group represents your organization in GitLab. Groups allow you to manage users and collaborate across multiple projects."
+msgstr ""
+
+msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
+msgstr ""
+
+msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
+msgstr ""
+
+msgid "A management, operational, or technical control (that is, safeguard or countermeasure) employed by an organization that provides equivalent or comparable protection for an information system."
+msgstr ""
+
+msgid "A member of the abuse team will review your report as soon as possible."
+msgstr ""
+
+msgid "A merge request hasn't yet been merged"
+msgstr ""
+
+msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
+msgstr ""
+
+msgid "A new Release %{tag} for %{name} was published. Visit the %{release_link_start}Releases page%{release_link_end} to read more about it."
+msgstr ""
+
+msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
+msgstr ""
+
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
+msgid "A new impersonation token has been created."
+msgstr ""
+
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
+msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
+msgstr ""
+
+msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
+msgstr ""
+
+msgid "A platform value can be web, mob or app."
+msgstr ""
+
+msgid "A project boilerplate for Salesforce App development with Salesforce Developer tools"
+msgstr ""
+
+msgid "A project boilerplate for Tencent Serverless Framework that uses Next.js SSR"
+msgstr ""
+
+msgid "A project containing issues for each audit inquiry in the HIPAA Audit Protocol published by the U.S. Department of Health & Human Services"
+msgstr ""
+
+msgid "A project’s repository name defines its URL (the one you use to access the project via a browser) and its place on the file disk where GitLab is installed. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "A quarterly reconciliation is due on %{date}"
+msgstr ""
+
+msgid "A ready-to-go template for use with Android apps"
+msgstr ""
+
+msgid "A ready-to-go template for use with iOS Swift apps"
+msgstr ""
+
+msgid "A rebase is already in progress."
+msgstr ""
+
+msgid "A sign-in to your account has been made from the following IP address: %{ip}"
+msgstr ""
+
+msgid "A title is required"
+msgstr ""
+
+msgid "A user with write access to the source branch selected this option"
+msgstr ""
+
+msgid "ACTION REQUIRED: Something went wrong while obtaining the Let's Encrypt certificate for GitLab Pages domain '%{domain}'"
+msgstr ""
+
+msgid "API"
+msgstr ""
+
+msgid "API Fuzzing"
+msgstr ""
+
+msgid "API Fuzzing Configuration"
+msgstr ""
+
+msgid "API Help"
+msgstr ""
+
+msgid "API Token"
+msgstr ""
+
+msgid "API key"
+msgstr ""
+
+msgid "API?"
+msgstr ""
+
+msgid "APIFuzzing|$VARIABLE_WITH_PASSWORD"
+msgstr ""
+
+msgid "APIFuzzing|$VARIABLE_WITH_USERNAME"
+msgstr ""
+
+msgid "APIFuzzing|API Fuzzing Configuration"
+msgstr ""
+
+msgid "APIFuzzing|Base URL of API testing target. For example, http://www.example.com."
+msgstr ""
+
+msgid "APIFuzzing|Choose a method"
+msgstr ""
+
+msgid "APIFuzzing|Choose a profile"
+msgstr ""
+
+msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "APIFuzzing|Enable authentication"
+msgstr ""
+
+msgid "APIFuzzing|Enter the name of the CI variable containing the password. For example, $VARIABLE_WITH_PASSWORD."
+msgstr ""
+
+msgid "APIFuzzing|Enter the name of the CI variable containing the username. For example, $VARIABLE_WITH_USERNAME."
+msgstr ""
+
+msgid "APIFuzzing|File path or URL to APIs to be tested. For example, folder/example_fuzz.har. HAR files may contain sensitive information such as authentication tokens, API keys, and session cookies. We recommend that you review the HAR files' contents before adding them to a repository."
+msgstr ""
+
+msgid "APIFuzzing|File path or URL to OpenAPI specification. For example, folder/openapi.json or http://www.example.com/openapi.json."
+msgstr ""
+
+msgid "APIFuzzing|File path or URL to requests to be tested. For example, folder/example.postman_collection.json."
+msgstr ""
+
+msgid "APIFuzzing|Generate code snippet"
+msgstr ""
+
+msgid "APIFuzzing|Make sure your credentials are secured"
+msgstr ""
+
+msgid "APIFuzzing|Password for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|Predefined profiles"
+msgstr ""
+
+msgid "APIFuzzing|Scan mode"
+msgstr ""
+
+msgid "APIFuzzing|Scan profile"
+msgstr ""
+
+msgid "APIFuzzing|Show code snippet for the profile"
+msgstr ""
+
+msgid "APIFuzzing|Target URL"
+msgstr ""
+
+msgid "APIFuzzing|There are three ways to perform scans."
+msgstr ""
+
+msgid "APIFuzzing|Tip: Insert the following variables anywhere below stages and include"
+msgstr ""
+
+msgid "APIFuzzing|Tip: Insert this part below all include"
+msgstr ""
+
+msgid "APIFuzzing|Tip: Insert this part below all stages"
+msgstr ""
+
+msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. A user with maintainer access rights can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area. We detected that you are not a maintainer. Commit your changes and assign them to a maintainer to update the credentials before merging."
+msgstr ""
+
+msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
+msgstr ""
+
+msgid "APIFuzzing|Username for basic authentication"
+msgstr ""
+
+msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
+msgstr ""
+
+msgid "APIFuzzing|folder/example.postman_collection.json"
+msgstr ""
+
+msgid "APIFuzzing|folder/example_fuzz.har"
+msgstr ""
+
+msgid "APIFuzzing|folder/openapi.json"
+msgstr ""
+
+msgid "AWS Access Key"
+msgstr ""
+
+msgid "AWS Secret Access Key"
+msgstr ""
+
+msgid "AWS access key ID (Optional)"
+msgstr ""
+
+msgid "AWS secret access key (Optional)"
+msgstr ""
+
+msgid "AWS service error: %{error}"
+msgstr ""
+
+msgid "Abort"
+msgstr ""
+
+msgid "About GitLab"
+msgstr ""
+
+msgid "About auto deploy"
+msgstr ""
+
+msgid "About this feature"
+msgstr ""
+
+msgid "About your company"
+msgstr ""
+
+msgid "Abuse Reports"
+msgstr ""
+
+msgid "Abuse reports"
+msgstr ""
+
+msgid "Abuse reports notification email"
+msgstr ""
+
+msgid "Accept invitation"
+msgstr ""
+
+msgid "Accept terms"
+msgstr ""
+
+msgid "Acceptable for use in this project"
+msgstr ""
+
+msgid "Access Git repositories or the API."
+msgstr ""
+
+msgid "Access Tokens"
+msgstr ""
+
+msgid "Access denied for your LDAP account."
+msgstr ""
+
+msgid "Access denied: %{error}"
+msgstr ""
+
+msgid "Access expires"
+msgstr ""
+
+msgid "Access forbidden. Check your access level."
+msgstr ""
+
+msgid "Access granted"
+msgstr ""
+
+msgid "Access requests"
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
+msgid "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 ""
+
+msgid "AccessDropdown|Groups"
+msgstr ""
+
+msgid "AccessDropdown|Roles"
+msgstr ""
+
+msgid "AccessDropdown|Users"
+msgstr ""
+
+msgid "AccessTokens|Access Tokens"
+msgstr ""
+
+msgid "AccessTokens|Are you sure?"
+msgstr ""
+
+msgid "AccessTokens|Are you sure? Any RSS or calendar URLs currently in use will stop working."
+msgstr ""
+
+msgid "AccessTokens|Are you sure? Any issue email addresses currently in use will stop working."
+msgstr ""
+
+msgid "AccessTokens|Copy feed token"
+msgstr ""
+
+msgid "AccessTokens|Copy incoming email token"
+msgstr ""
+
+msgid "AccessTokens|Copy static object token"
+msgstr ""
+
+msgid "AccessTokens|Created"
+msgstr ""
+
+msgid "AccessTokens|Feed token"
+msgstr ""
+
+msgid "AccessTokens|Incoming email token"
+msgstr ""
+
+msgid "AccessTokens|It cannot be used to access any other data."
+msgstr ""
+
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{linkStart}reset this token%{linkEnd}."
+msgstr ""
+
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{linkStart}reset this token%{linkEnd}."
+msgstr ""
+
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{linkStart}reset this token%{linkEnd}."
+msgstr ""
+
+msgid "AccessTokens|Personal Access Tokens"
+msgstr ""
+
+msgid "AccessTokens|Static object token"
+msgstr ""
+
+msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
+msgstr ""
+
+msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
+msgstr ""
+
+msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
+msgstr ""
+
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
+
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
+
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
+
+msgid "AccessibilityReport|Learn more"
+msgstr ""
+
+msgid "AccessibilityReport|Message: %{message}"
+msgstr ""
+
+msgid "AccessibilityReport|New"
+msgstr ""
+
+msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
+msgstr ""
+
+msgid "Account"
+msgstr ""
+
+msgid "Account ID"
+msgstr ""
+
+msgid "Account and limit"
+msgstr ""
+
+msgid "Account:"
+msgstr ""
+
+msgid "Account: %{account}"
+msgstr ""
+
+msgid "AccountValidation|Fix your pipelines by validating your account"
+msgstr ""
+
+msgid "AccountValidation|I'll bring my own runners"
+msgstr ""
+
+msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
+msgstr ""
+
+msgid "AccountValidation|In order to use free CI/CD minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
+msgstr ""
+
+msgid "AccountValidation|Learn more."
+msgstr ""
+
+msgid "AccountValidation|Looks like you’ll need to validate your account to use free CI/CD minutes"
+msgstr ""
+
+msgid "AccountValidation|Validate your account"
+msgstr ""
+
+msgid "AccountValidation|Verification is required to discourage and reduce the abuse on GitLab infrastructure. If you verify with a credit or debit card, %{strong_start}GitLab will not charge your card, it will only be used for validation.%{strong_end} %{learn_more_link}"
+msgstr ""
+
+msgid "AccountValidation|unsubscribe"
+msgstr ""
+
+msgid "AccountValidation|you may %{unsubscribe_link} at any time."
+msgstr ""
+
+msgid "Acknowledge"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid "Action to take when receiving an alert. %{docsLink}"
+msgstr ""
+
+msgid "Actions"
+msgstr ""
+
+msgid "Activate Service Desk"
+msgstr ""
+
+msgid "Activated on"
+msgstr ""
+
+msgid "Active"
+msgstr ""
+
+msgid "Active %{type} (%{token_length})"
+msgstr ""
+
+msgid "Active Sessions"
+msgstr ""
+
+msgid "Active chat names (%{count})"
+msgstr ""
+
+msgid "Activity"
+msgstr ""
+
+msgid "Activity|An error occurred while retrieving activity. Reload the page to try again."
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Add \"%{value}\""
+msgstr ""
+
+msgid "Add %{linkStart}assets%{linkEnd} to your Release. GitLab automatically includes read-only assets, like source code and release evidence."
+msgstr ""
+
+msgid "Add CHANGELOG"
+msgstr ""
+
+msgid "Add CONTRIBUTING"
+msgstr ""
+
+msgid "Add Jaeger URL"
+msgstr ""
+
+msgid "Add Kubernetes cluster"
+msgstr ""
+
+msgid "Add LICENSE"
+msgstr ""
+
+msgid "Add License"
+msgstr ""
+
+msgid "Add New Site"
+msgstr ""
+
+msgid "Add README"
+msgstr ""
+
+msgid "Add Zoom meeting"
+msgstr ""
+
+msgid "Add a %{type}"
+msgstr ""
+
+msgid "Add a GCP region"
+msgstr ""
+
+msgid "Add a GPG key"
+msgstr ""
+
+msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
+msgstr ""
+
+msgid "Add a Jaeger URL to replace this page with a link to your Jaeger server. You first need to %{link_start_tag}install Jaeger%{link_end_tag}."
+msgstr ""
+
+msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
+msgstr ""
+
+msgid "Add a bullet list"
+msgstr ""
+
+msgid "Add a collapsible section"
+msgstr ""
+
+msgid "Add a comment to this line"
+msgstr ""
+
+msgid "Add a comment to this line or drag for multiple lines"
+msgstr ""
+
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
+msgid "Add a general comment to this %{noteableDisplayName}."
+msgstr ""
+
+msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
+msgstr ""
+
+msgid "Add a horizontal rule"
+msgstr ""
+
+msgid "Add a line"
+msgstr ""
+
+msgid "Add a link"
+msgstr ""
+
+msgid "Add a link to Grafana"
+msgstr ""
+
+msgid "Add a new issue"
+msgstr ""
+
+msgid "Add a numbered list"
+msgstr ""
+
+msgid "Add a related epic"
+msgstr ""
+
+msgid "Add a related issue"
+msgstr ""
+
+msgid "Add a suffix to Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "Add a table"
+msgstr ""
+
+msgid "Add a task list"
+msgstr ""
+
+msgid "Add a title..."
+msgstr ""
+
+msgid "Add a to do"
+msgstr ""
+
+msgid "Add an SSH key"
+msgstr ""
+
+msgid "Add an SSH key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
+msgstr ""
+
+msgid "Add an existing issue"
+msgstr ""
+
+msgid "Add an impersonation token"
+msgstr ""
+
+msgid "Add another link"
+msgstr ""
+
+msgid "Add approval rule"
+msgstr ""
+
+msgid "Add approvers"
+msgstr ""
+
+msgid "Add bold text"
+msgstr ""
+
+msgid "Add broadcast message"
+msgstr ""
+
+msgid "Add child epic to an epic"
+msgstr ""
+
+msgid "Add comment now"
+msgstr ""
+
+msgid "Add comment to design"
+msgstr ""
+
+msgid "Add comment..."
+msgstr ""
+
+msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
+msgstr ""
+
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
+msgid "Add customer relation contact(s)."
+msgstr ""
+
+msgid "Add customer relation contacts"
+msgstr ""
+
+msgid "Add deploy freeze"
+msgstr ""
+
+msgid "Add deploy keys to grant read/write access to this repository. %{link_start}What are deploy keys?%{link_end}"
+msgstr ""
+
+msgid "Add email address"
+msgstr ""
+
+msgid "Add email participant(s)"
+msgstr ""
+
+msgid "Add environment"
+msgstr ""
+
+msgid "Add existing confidential %{issuableType}"
+msgstr ""
+
+msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
+msgstr ""
+
+msgid "Add image comment"
+msgstr ""
+
+msgid "Add italic text"
+msgstr ""
+
+msgid "Add key"
+msgstr ""
+
+msgid "Add label(s)"
+msgstr ""
+
+msgid "Add list"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
+msgid "Add new directory"
+msgstr ""
+
+msgid "Add or remove previously merged commits"
+msgstr ""
+
+msgid "Add or subtract spent time"
+msgstr ""
+
+msgid "Add people"
+msgstr ""
+
+msgid "Add previously merged commits"
+msgstr ""
+
+msgid "Add project"
+msgstr ""
+
+msgid "Add projects"
+msgstr ""
+
+msgid "Add reaction"
+msgstr ""
+
+msgid "Add request manually"
+msgstr ""
+
+msgid "Add strikethrough text"
+msgstr ""
+
+msgid "Add suggestion to batch"
+msgstr ""
+
+msgid "Add system hook"
+msgstr ""
+
+msgid "Add text to the sign-in page. Markdown enabled."
+msgstr ""
+
+msgid "Add to board"
+msgstr ""
+
+msgid "Add to epic"
+msgstr ""
+
+msgid "Add to merge train"
+msgstr ""
+
+msgid "Add to merge train when pipeline succeeds"
+msgstr ""
+
+msgid "Add to review"
+msgstr ""
+
+msgid "Add to tree"
+msgstr ""
+
+msgid "Add topics to projects to help users find them."
+msgstr ""
+
+msgid "Add trigger"
+msgstr ""
+
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Add variable"
+msgstr ""
+
+msgid "Add vulnerability finding"
+msgstr ""
+
+msgid "Add webhook"
+msgstr ""
+
+msgid "Add your team members and others to GitLab."
+msgstr ""
+
+msgid "Add/remove"
+msgstr ""
+
+msgid "AddContextCommits|Add previously merged commits"
+msgstr ""
+
+msgid "AddContextCommits|Add/remove"
+msgstr ""
+
+msgid "AddMember|Emails cannot be blank"
+msgstr ""
+
+msgid "AddMember|Invite email is invalid"
+msgstr ""
+
+msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
+msgstr ""
+
+msgid "AddMember|No invite source provided."
+msgstr ""
+
+msgid "AddMember|No users specified."
+msgstr ""
+
+msgid "AddMember|Too many users specified (limit is %{user_limit})"
+msgstr ""
+
+msgid "Added"
+msgstr ""
+
+msgid "Added %{epic_ref} as a child epic."
+msgstr ""
+
+msgid "Added %{label_references} %{label_text}."
+msgstr ""
+
+msgid "Added a to do."
+msgstr ""
+
+msgid "Added an issue to an epic."
+msgstr ""
+
+msgid "Added for this merge request"
+msgstr ""
+
+msgid "Added in this version"
+msgstr ""
+
+msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
+msgstr ""
+
+msgid "Additional Metadata"
+msgstr ""
+
+msgid "Additional minutes"
+msgstr ""
+
+msgid "Additional minutes:"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Additional text for the sign-in and Help page."
+msgstr ""
+
+msgid "Additional text to show on the Help page"
+msgstr ""
+
+msgid "Additional text to show on the sign-in page"
+msgstr ""
+
+msgid "Address"
+msgstr ""
+
+msgid "Adds"
+msgstr ""
+
+msgid "Adds %{epic_ref} as child epic."
+msgstr ""
+
+msgid "Adds %{labels} %{label_text}."
+msgstr ""
+
+msgid "Adds a Zoom meeting."
+msgstr ""
+
+msgid "Adds a to do."
+msgstr ""
+
+msgid "Adds an issue to an epic."
+msgstr ""
+
+msgid "Adds email participant(s)."
+msgstr ""
+
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
+msgid "Adjust how frequently the GitLab UI polls for updates."
+msgstr ""
+
+msgid "Adjust your filters/search criteria above. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information."
+msgstr ""
+
+msgid "Admin"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Mode"
+msgstr ""
+
+msgid "Admin Note"
+msgstr ""
+
+msgid "Admin Notifications"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin Section"
+msgstr ""
+
+msgid "Admin mode already enabled"
+msgstr ""
+
+msgid "Admin mode disabled"
+msgstr ""
+
+msgid "Admin mode enabled"
+msgstr ""
+
+msgid "Admin navigation"
+msgstr ""
+
+msgid "Admin notes"
+msgstr ""
+
+msgid "AdminArea|%{billable_users_link_start}Learn more%{billable_users_link_end} about what defines a billable user"
+msgstr ""
+
+msgid "AdminArea|Active users"
+msgstr ""
+
+msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
+msgstr ""
+
+msgid "AdminArea|Billable users"
+msgstr ""
+
+msgid "AdminArea|Blocked users"
+msgstr ""
+
+msgid "AdminArea|Bots"
+msgstr ""
+
+msgid "AdminArea|Components"
+msgstr ""
+
+msgid "AdminArea|Developer"
+msgstr ""
+
+msgid "AdminArea|Features"
+msgstr ""
+
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
+msgid "AdminArea|Groups"
+msgstr ""
+
+msgid "AdminArea|Guest"
+msgstr ""
+
+msgid "AdminArea|Included Free in license"
+msgstr ""
+
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
+msgid "AdminArea|Latest groups"
+msgstr ""
+
+msgid "AdminArea|Latest projects"
+msgstr ""
+
+msgid "AdminArea|Latest users"
+msgstr ""
+
+msgid "AdminArea|Maintainer"
+msgstr ""
+
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
+msgid "AdminArea|Minimal access"
+msgstr ""
+
+msgid "AdminArea|New group"
+msgstr ""
+
+msgid "AdminArea|New project"
+msgstr ""
+
+msgid "AdminArea|New user"
+msgstr ""
+
+msgid "AdminArea|No applications found"
+msgstr ""
+
+msgid "AdminArea|Owner"
+msgstr ""
+
+msgid "AdminArea|Projects"
+msgstr ""
+
+msgid "AdminArea|Reporter"
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
+msgid "AdminArea|Stop all jobs"
+msgstr ""
+
+msgid "AdminArea|Stop all jobs?"
+msgstr ""
+
+msgid "AdminArea|Stop jobs"
+msgstr ""
+
+msgid "AdminArea|Stopping jobs failed"
+msgstr ""
+
+msgid "AdminArea|Total users"
+msgstr ""
+
+msgid "AdminArea|Users"
+msgstr ""
+
+msgid "AdminArea|Users statistics"
+msgstr ""
+
+msgid "AdminArea|Users with highest role"
+msgstr ""
+
+msgid "AdminArea|Users without a Group and Project"
+msgstr ""
+
+msgid "AdminArea|View latest groups"
+msgstr ""
+
+msgid "AdminArea|View latest projects"
+msgstr ""
+
+msgid "AdminArea|View latest users"
+msgstr ""
+
+msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
+msgstr ""
+
+msgid "AdminDashboard|Error loading the statistics. Please try again"
+msgstr ""
+
+msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
+msgstr ""
+
+msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
+msgstr ""
+
+msgid "AdminLabels|Define your default set of project labels"
+msgstr ""
+
+msgid "AdminLabels|Labels created here will be automatically added to new projects."
+msgstr ""
+
+msgid "AdminLabels|They can be used to categorize issues and merge requests."
+msgstr ""
+
+msgid "AdminProjects| You’re about to permanently delete the project %{projectName}, its repository, and all related resources, including issues and merge requests. After you confirm and press %{strong_start}Delete project%{strong_end}, it cannot be undone or recovered."
+msgstr ""
+
+msgid "AdminProjects|Delete"
+msgstr ""
+
+msgid "AdminProjects|Delete Project %{projectName}?"
+msgstr ""
+
+msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
+msgid "AdminSettings|All new projects can use the instance's shared runners by default."
+msgstr ""
+
+msgid "AdminSettings|Auto DevOps domain"
+msgstr ""
+
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
+msgid "AdminSettings|Configure Let's Encrypt"
+msgstr ""
+
+msgid "AdminSettings|Disable feed token"
+msgstr ""
+
+msgid "AdminSettings|Disable public access to Pages sites"
+msgstr ""
+
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
+msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
+msgid "AdminSettings|Enable shared runners for new projects"
+msgstr ""
+
+msgid "AdminSettings|Feed token"
+msgstr ""
+
+msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
+msgstr ""
+
+msgid "AdminSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
+msgstr ""
+
+msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
+msgstr ""
+
+msgid "AdminSettings|Let's Encrypt email"
+msgstr ""
+
+msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
+msgstr ""
+
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
+msgid "AdminSettings|No required pipeline"
+msgstr ""
+
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
+msgid "AdminSettings|Require users to prove ownership of custom domains"
+msgstr ""
+
+msgid "AdminSettings|Required pipeline configuration"
+msgstr ""
+
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
+
+msgid "AdminSettings|Select a group to use as the source for instance-level project templates."
+msgstr ""
+
+msgid "AdminSettings|Select to disable public access for Pages sites, which requires users to sign in for access to the Pages sites in your instance. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
+msgstr ""
+
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
+msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Size and domain settings for Pages static sites."
+msgstr ""
+
+msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
+msgstr ""
+
+msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
+msgstr ""
+
+msgid "AdminSettings|The projects in this group can be selected as templates for new projects created on the instance. %{link_start}Learn more.%{link_end} "
+msgstr ""
+
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
+
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
+msgid "AdminStatistics|Active Users"
+msgstr ""
+
+msgid "AdminStatistics|Forks"
+msgstr ""
+
+msgid "AdminStatistics|Issues"
+msgstr ""
+
+msgid "AdminStatistics|Merge requests"
+msgstr ""
+
+msgid "AdminStatistics|Milestones"
+msgstr ""
+
+msgid "AdminStatistics|Notes"
+msgstr ""
+
+msgid "AdminStatistics|SSH Keys"
+msgstr ""
+
+msgid "AdminStatistics|Snippets"
+msgstr ""
+
+msgid "AdminUsers|(Admin)"
+msgstr ""
+
+msgid "AdminUsers|(Banned)"
+msgstr ""
+
+msgid "AdminUsers|(Blocked)"
+msgstr ""
+
+msgid "AdminUsers|(Deactivated)"
+msgstr ""
+
+msgid "AdminUsers|(Internal)"
+msgstr ""
+
+msgid "AdminUsers|(Locked)"
+msgstr ""
+
+msgid "AdminUsers|(Pending approval)"
+msgstr ""
+
+msgid "AdminUsers|2FA Disabled"
+msgstr ""
+
+msgid "AdminUsers|2FA Enabled"
+msgstr ""
+
+msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
+msgstr ""
+
+msgid "AdminUsers|Access"
+msgstr ""
+
+msgid "AdminUsers|Access Git repositories"
+msgstr ""
+
+msgid "AdminUsers|Access the API"
+msgstr ""
+
+msgid "AdminUsers|Activate"
+msgstr ""
+
+msgid "AdminUsers|Activate user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Active"
+msgstr ""
+
+msgid "AdminUsers|Adjust the user cap setting on your instance"
+msgstr ""
+
+msgid "AdminUsers|Admin"
+msgstr ""
+
+msgid "AdminUsers|Administrator"
+msgstr ""
+
+msgid "AdminUsers|Admins"
+msgstr ""
+
+msgid "AdminUsers|Approve"
+msgstr ""
+
+msgid "AdminUsers|Approve user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Approved users can:"
+msgstr ""
+
+msgid "AdminUsers|Auditor"
+msgstr ""
+
+msgid "AdminUsers|Auditors have read-only access to all groups, projects, and users."
+msgstr ""
+
+msgid "AdminUsers|Automatically marked as default internal user"
+msgstr ""
+
+msgid "AdminUsers|Ban user"
+msgstr ""
+
+msgid "AdminUsers|Ban user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Banned"
+msgstr ""
+
+msgid "AdminUsers|Be added to groups and projects"
+msgstr ""
+
+msgid "AdminUsers|Block"
+msgstr ""
+
+msgid "AdminUsers|Block user"
+msgstr ""
+
+msgid "AdminUsers|Block user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Blocked"
+msgstr ""
+
+msgid "AdminUsers|Blocking user has the following effects:"
+msgstr ""
+
+msgid "AdminUsers|Cannot sign in or access instance information"
+msgstr ""
+
+msgid "AdminUsers|Cannot unblock LDAP blocked users"
+msgstr ""
+
+msgid "AdminUsers|Cohorts"
+msgstr ""
+
+msgid "AdminUsers|Confirm user"
+msgstr ""
+
+msgid "AdminUsers|Confirm user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Could not load user group counts. Please refresh the page to try again."
+msgstr ""
+
+msgid "AdminUsers|Deactivate"
+msgstr ""
+
+msgid "AdminUsers|Deactivate user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Deactivated"
+msgstr ""
+
+msgid "AdminUsers|Deactivating a user has the following effects:"
+msgstr ""
+
+msgid "AdminUsers|Delete User %{username} and contributions?"
+msgstr ""
+
+msgid "AdminUsers|Delete User %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Delete user"
+msgstr ""
+
+msgid "AdminUsers|Delete user and contributions"
+msgstr ""
+
+msgid "AdminUsers|Export permissions as CSV (max 100,000 users)"
+msgstr ""
+
+msgid "AdminUsers|External"
+msgstr ""
+
+msgid "AdminUsers|External users cannot see internal or private projects unless access is explicitly granted. Also, external users cannot create projects, groups, or personal snippets."
+msgstr ""
+
+msgid "AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
+msgstr ""
+
+msgid "AdminUsers|Here are some helpful links to help you manage your instance:"
+msgstr ""
+
+msgid "AdminUsers|If you have any questions about this process please consult our %{doc_link} or %{support_link}."
+msgstr ""
+
+msgid "AdminUsers|Important information about usage on your GitLab instance"
+msgstr ""
+
+msgid "AdminUsers|Is using seat"
+msgstr ""
+
+msgid "AdminUsers|Issues authored by this user are hidden from other users."
+msgstr ""
+
+msgid "AdminUsers|It's you!"
+msgstr ""
+
+msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
+msgstr ""
+
+msgid "AdminUsers|Locked"
+msgstr ""
+
+msgid "AdminUsers|Log in"
+msgstr ""
+
+msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
+msgstr ""
+
+msgid "AdminUsers|New user"
+msgstr ""
+
+msgid "AdminUsers|No users found"
+msgstr ""
+
+msgid "AdminUsers|Owned groups will be left"
+msgstr ""
+
+msgid "AdminUsers|Pending approval"
+msgstr ""
+
+msgid "AdminUsers|Personal projects will be left"
+msgstr ""
+
+msgid "AdminUsers|Personal projects, group and user history will be left intact"
+msgstr ""
+
+msgid "AdminUsers|Reactivating a user will:"
+msgstr ""
+
+msgid "AdminUsers|Regular"
+msgstr ""
+
+msgid "AdminUsers|Regular users have access to their groups and projects."
+msgstr ""
+
+msgid "AdminUsers|Reject"
+msgstr ""
+
+msgid "AdminUsers|Reject user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Rejected users:"
+msgstr ""
+
+msgid "AdminUsers|Restore user access to the account, including web, Git and API."
+msgstr ""
+
+msgid "AdminUsers|Search by name, email or username"
+msgstr ""
+
+msgid "AdminUsers|Search users"
+msgstr ""
+
+msgid "AdminUsers|Send email to users"
+msgstr ""
+
+msgid "AdminUsers|Sort by"
+msgstr ""
+
+msgid "AdminUsers|The user can't access git repositories."
+msgstr ""
+
+msgid "AdminUsers|The user can't log in."
+msgstr ""
+
+msgid "AdminUsers|The user has unlimited access to all groups, projects, users, and features."
+msgstr ""
+
+msgid "AdminUsers|The user will be logged out"
+msgstr ""
+
+msgid "AdminUsers|The user will not be able to access git repositories"
+msgstr ""
+
+msgid "AdminUsers|The user will not be able to access the API"
+msgstr ""
+
+msgid "AdminUsers|The user will not be able to use slash commands"
+msgstr ""
+
+msgid "AdminUsers|The user will not receive any notifications"
+msgstr ""
+
+msgid "AdminUsers|To confirm, type %{projectName}"
+msgstr ""
+
+msgid "AdminUsers|To confirm, type %{username}"
+msgstr ""
+
+msgid "AdminUsers|Unban user"
+msgstr ""
+
+msgid "AdminUsers|Unban user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Unblock"
+msgstr ""
+
+msgid "AdminUsers|Unblock user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|Unlock user %{username}?"
+msgstr ""
+
+msgid "AdminUsers|User administration"
+msgstr ""
+
+msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
+msgstr ""
+
+msgid "AdminUsers|User will not be able to access git repositories"
+msgstr ""
+
+msgid "AdminUsers|User will not be able to login"
+msgstr ""
+
+msgid "AdminUsers|Users"
+msgstr ""
+
+msgid "AdminUsers|Users can still be invited to your instance and/or add themselves if permitted based on your settings. They will not have access to your instance, nor count towards your subscribed seat count until you %{approve_link}."
+msgstr ""
+
+msgid "AdminUsers|Validate user account"
+msgstr ""
+
+msgid "AdminUsers|View pending member requests"
+msgstr ""
+
+msgid "AdminUsers|What can I do?"
+msgstr ""
+
+msgid "AdminUsers|What does this mean?"
+msgstr ""
+
+msgid "AdminUsers|When banned:"
+msgstr ""
+
+msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
+msgstr ""
+
+msgid "AdminUsers|Will be deleted"
+msgstr ""
+
+msgid "AdminUsers|Without projects"
+msgstr ""
+
+msgid "AdminUsers|You are about to permanently delete the user %{username}. Issues, merge requests, and groups linked to them will be transferred to a system-wide \"Ghost-user\". To avoid data loss, consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered."
+msgstr ""
+
+msgid "AdminUsers|You are about to permanently delete the user %{username}. This will delete all of the issues, merge requests, and groups linked to them. To avoid data loss, consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered."
+msgstr ""
+
+msgid "AdminUsers|You can always block their account again if needed."
+msgstr ""
+
+msgid "AdminUsers|You can always deactivate their account again if needed."
+msgstr ""
+
+msgid "AdminUsers|You can always re-activate their account, their data will remain intact."
+msgstr ""
+
+msgid "AdminUsers|You can always unblock their account, their data will remain intact."
+msgstr ""
+
+msgid "AdminUsers|You can ban their account in the future if necessary."
+msgstr ""
+
+msgid "AdminUsers|You can unban their account in the future. Their data remains intact."
+msgstr ""
+
+msgid "AdminUsers|You cannot remove your own administrator access."
+msgstr ""
+
+msgid "AdminUsers|You must transfer ownership or delete the groups owned by this user before you can delete their account"
+msgstr ""
+
+msgid "AdminUsers|Your GitLab instance has reached the maximum allowed %{user_doc_link} set by an instance admin."
+msgstr ""
+
+msgid "AdminUsers|approve them"
+msgstr ""
+
+msgid "AdminUsers|contact our support team"
+msgstr ""
+
+msgid "AdminUsers|docs"
+msgstr ""
+
+msgid "AdminUsers|user cap"
+msgstr ""
+
+msgid "Administration"
+msgstr ""
+
+msgid "Admin|Additional users must be reviewed and approved by a system administrator. Learn more about %{help_link_start}usage caps%{help_link_end}."
+msgstr ""
+
+msgid "Admin|Admin notes"
+msgstr ""
+
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
+msgid "Admin|Note"
+msgstr ""
+
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
+msgstr ""
+
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
+msgstr ""
+
+msgid "Admin|View pending user approvals"
+msgstr ""
+
+msgid "Admin|Your instance has reached its user cap"
+msgstr ""
+
+msgid "Advanced"
+msgstr ""
+
+msgid "Advanced Search"
+msgstr ""
+
+msgid "Advanced Settings"
+msgstr ""
+
+msgid "Advanced export options"
+msgstr ""
+
+msgid "AdvancedSearch|Reindex required"
+msgstr ""
+
+msgid "After a successful password update you will be redirected to login screen."
+msgstr ""
+
+msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
+msgstr ""
+
+msgid "After it expires, you can't use merge approvals, code quality, or many other features."
+msgstr ""
+
+msgid "After it expires, you can't use merge approvals, epics, or many other features."
+msgstr ""
+
+msgid "After it expires, you can't use merge approvals, epics, or many security features."
+msgstr ""
+
+msgid "After the export is complete, download the data file from a notification email or from this page. You can then import the data file from the %{strong_text_start}Create new group%{strong_text_end} page of another GitLab instance."
+msgstr ""
+
+msgid "After you've reviewed these contribution guidelines, you'll be all set to"
+msgstr ""
+
+msgid "Akismet"
+msgstr ""
+
+msgid "Akismet API Key"
+msgstr ""
+
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
+
+msgid "Alert"
+msgstr ""
+
+msgid "AlertManagement|Acknowledged"
+msgstr ""
+
+msgid "AlertManagement|Activity feed"
+msgstr ""
+
+msgid "AlertManagement|Alert"
+msgstr ""
+
+msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgstr ""
+
+msgid "AlertManagement|Alert detail"
+msgstr ""
+
+msgid "AlertManagement|Alert details"
+msgstr ""
+
+msgid "AlertManagement|Alert status: %{status}"
+msgstr ""
+
+msgid "AlertManagement|Alerts"
+msgstr ""
+
+msgid "AlertManagement|All alerts"
+msgstr ""
+
+msgid "AlertManagement|Assign status"
+msgstr ""
+
+msgid "AlertManagement|Assignees"
+msgstr ""
+
+msgid "AlertManagement|Authorize external service"
+msgstr ""
+
+msgid "AlertManagement|Create incident"
+msgstr ""
+
+msgid "AlertManagement|Display alerts from all your monitoring tools directly within GitLab. Streamline the investigation of your alerts and the escalation of alerts to incidents."
+msgstr ""
+
+msgid "AlertManagement|Edit"
+msgstr ""
+
+msgid "AlertManagement|Environment"
+msgstr ""
+
+msgid "AlertManagement|Events"
+msgstr ""
+
+msgid "AlertManagement|Incident"
+msgstr ""
+
+msgid "AlertManagement|Key"
+msgstr ""
+
+msgid "AlertManagement|Metrics"
+msgstr ""
+
+msgid "AlertManagement|Metrics weren't available in the alerts payload."
+msgstr ""
+
+msgid "AlertManagement|More information"
+msgstr ""
+
+msgid "AlertManagement|No alert data to display."
+msgstr ""
+
+msgid "AlertManagement|No alerts available to display. See %{linkStart}enabling alert management%{linkEnd} for more information on adding alerts to the list."
+msgstr ""
+
+msgid "AlertManagement|No alerts to display."
+msgstr ""
+
+msgid "AlertManagement|None"
+msgstr ""
+
+msgid "AlertManagement|Open"
+msgstr ""
+
+msgid "AlertManagement|Please try again."
+msgstr ""
+
+msgid "AlertManagement|Reported %{when}"
+msgstr ""
+
+msgid "AlertManagement|Reported %{when} by %{tool}"
+msgstr ""
+
+msgid "AlertManagement|Resolved"
+msgstr ""
+
+msgid "AlertManagement|Runbook"
+msgstr ""
+
+msgid "AlertManagement|Service"
+msgstr ""
+
+msgid "AlertManagement|Severity"
+msgstr ""
+
+msgid "AlertManagement|Start time"
+msgstr ""
+
+msgid "AlertManagement|Status"
+msgstr ""
+
+msgid "AlertManagement|Surface alerts in GitLab"
+msgstr ""
+
+msgid "AlertManagement|There was an error displaying the alert. Please refresh the page to try again."
+msgstr ""
+
+msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
+msgstr ""
+
+msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgstr ""
+
+msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgstr ""
+
+msgid "AlertManagement|There was an error while updating the status of the alert."
+msgstr ""
+
+msgid "AlertManagement|There was an error while updating the to-do item of the alert."
+msgstr ""
+
+msgid "AlertManagement|This assignee cannot be assigned to this alert."
+msgstr ""
+
+msgid "AlertManagement|Tool"
+msgstr ""
+
+msgid "AlertManagement|Triggered"
+msgstr ""
+
+msgid "AlertManagement|Value"
+msgstr ""
+
+msgid "AlertManagement|View incident"
+msgstr ""
+
+msgid "AlertMappingBuilder|Define fallback"
+msgstr ""
+
+msgid "AlertMappingBuilder|GitLab alert key"
+msgstr ""
+
+msgid "AlertMappingBuilder|Make selection"
+msgstr ""
+
+msgid "AlertMappingBuilder|Payload alert key"
+msgstr ""
+
+msgid "AlertMappingBuilder|Select key"
+msgstr ""
+
+msgid "AlertMappingBuilder|Title is a required field for alerts in GitLab. Should the payload field you specified not be available, specifiy which field we should use instead. "
+msgstr ""
+
+msgid "AlertSettings|A webhook URL and authorization key is generated for the integration. After you save the integration, both are visible under the “View credentials†tab."
+msgstr ""
+
+msgid "AlertSettings|Add new integration"
+msgstr ""
+
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
+msgid "AlertSettings|Authorization key"
+msgstr ""
+
+msgid "AlertSettings|Configure details"
+msgstr ""
+
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
+msgid "AlertSettings|Customize alert payload mapping (optional)"
+msgstr ""
+
+msgid "AlertSettings|Delete integration"
+msgstr ""
+
+msgid "AlertSettings|Edit integration"
+msgstr ""
+
+msgid "AlertSettings|Edit payload"
+msgstr ""
+
+msgid "AlertSettings|Enable integration"
+msgstr ""
+
+msgid "AlertSettings|Enter an example payload from your selected monitoring tool. This supports sending alerts to a GitLab endpoint."
+msgstr ""
+
+msgid "AlertSettings|Enter integration name"
+msgstr ""
+
+msgid "AlertSettings|Free versions of GitLab are limited to one integration per type. To add more, %{linkStart}upgrade your subscription%{linkEnd}."
+msgstr ""
+
+msgid "AlertSettings|GitLab has created a URL and authorization key for your integration. You can use them to set up a webhook and authorize your endpoint to send alerts to GitLab."
+msgstr ""
+
+msgid "AlertSettings|HTTP Endpoint"
+msgstr ""
+
+msgid "AlertSettings|If you edit the payload, you must re-map the fields again."
+msgstr ""
+
+msgid "AlertSettings|If you reset the authorization key for this project, you must update the key in every enabled alert source."
+msgstr ""
+
+msgid "AlertSettings|Integration successfully saved"
+msgstr ""
+
+msgid "AlertSettings|Name integration"
+msgstr ""
+
+msgid "AlertSettings|Parse payload fields"
+msgstr ""
+
+msgid "AlertSettings|Proceed with editing"
+msgstr ""
+
+msgid "AlertSettings|Prometheus"
+msgstr ""
+
+msgid "AlertSettings|Prometheus API base URL"
+msgstr ""
+
+msgid "AlertSettings|Reset Key"
+msgstr ""
+
+msgid "AlertSettings|Reset the mapping"
+msgstr ""
+
+msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
+msgstr ""
+
+msgid "AlertSettings|Save & create test alert"
+msgstr ""
+
+msgid "AlertSettings|Save integration"
+msgstr ""
+
+msgid "AlertSettings|Save integration & send"
+msgstr ""
+
+msgid "AlertSettings|Select integration type"
+msgstr ""
+
+msgid "AlertSettings|Send test alert"
+msgstr ""
+
+msgid "AlertSettings|Send without saving"
+msgstr ""
+
+msgid "AlertSettings|The form has unsaved changes"
+msgstr ""
+
+msgid "AlertSettings|The form has unsaved changes. How would you like to proceed?"
+msgstr ""
+
+msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
+msgstr ""
+
+msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
+msgstr ""
+
+msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
+msgstr ""
+
+msgid "AlertSettings|Use the URL and authorization key below to configure how an external service sends alerts to GitLab. %{linkStart}How do I configure the endpoint?%{linkEnd}"
+msgstr ""
+
+msgid "AlertSettings|View URL and authorization key"
+msgstr ""
+
+msgid "AlertSettings|View credentials"
+msgstr ""
+
+msgid "AlertSettings|Webhook URL"
+msgstr ""
+
+msgid "AlertSettings|You can map default GitLab alert fields to your payload keys in the dropdowns below."
+msgstr ""
+
+msgid "AlertSettings|You can now set up alert endpoints for manually configured Prometheus instances in the Alerts section on the Operations settings page. Alert endpoint fields on this page have been deprecated."
+msgstr ""
+
+msgid "AlertSettings|{ \"events\": [{ \"application\": \"Name of application\" }] }"
+msgstr ""
+
+msgid "Alerts"
+msgstr ""
+
+msgid "AlertsIntegrations|Alerts will be created through this integration"
+msgstr ""
+
+msgid "AlertsIntegrations|Alerts will not be created through this integration"
+msgstr ""
+
+msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
+msgstr ""
+
+msgid "AlertsIntegrations|Integration Name"
+msgstr ""
+
+msgid "AlertsIntegrations|Integration payload is invalid."
+msgstr ""
+
+msgid "AlertsIntegrations|No integrations have been added yet."
+msgstr ""
+
+msgid "AlertsIntegrations|The current integration could not be updated. Please try again."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration could not be added. Please try again."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration could not be deleted. Please try again."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration is currently inactive. Enable the integration to send the test alert."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration is deleted."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration is saved."
+msgstr ""
+
+msgid "AlertsIntegrations|The integration token could not be reset. Please try again."
+msgstr ""
+
+msgid "AlertsIntegrations|The test alert should now be visible in your alerts list."
+msgstr ""
+
+msgid "Algorithm"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "All %{replicableType} are being scheduled for %{action}"
+msgstr ""
+
+msgid "All (default)"
+msgstr ""
+
+msgid "All GitLab"
+msgstr ""
+
+msgid "All Members"
+msgstr ""
+
+msgid "All branches"
+msgstr ""
+
+msgid "All changes are committed"
+msgstr ""
+
+msgid "All email addresses will be used to identify your commits."
+msgstr ""
+
+msgid "All environments"
+msgstr ""
+
+msgid "All groups and projects"
+msgstr ""
+
+msgid "All issues"
+msgstr ""
+
+msgid "All issues for this milestone are closed."
+msgstr ""
+
+msgid "All issues for this milestone are closed. You may close this milestone now."
+msgstr ""
+
+msgid "All merge conflicts were resolved. The merge request can now be merged."
+msgstr ""
+
+msgid "All merge request dependencies have been merged"
+msgstr ""
+
+msgid "All paths are relative to the GitLab URL. Do not include %{relative_url_link_start}relative URLs%{relative_url_link_end}."
+msgstr ""
+
+msgid "All projects"
+msgstr ""
+
+msgid "All projects selected"
+msgstr ""
+
+msgid "All threads resolved"
+msgstr ""
+
+msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
+msgstr ""
+
+msgid "All users must have a name."
+msgstr ""
+
+msgid "All users with matching cards"
+msgstr ""
+
+msgid "Allow \"%{group_name}\" to sign you in"
+msgstr ""
+
+msgid "Allow access to members of the following group"
+msgstr ""
+
+msgid "Allow access to the following IP addresses"
+msgstr ""
+
+msgid "Allow commits from members who can merge to the target branch."
+msgstr ""
+
+msgid "Allow group owners to manage LDAP-related settings"
+msgstr ""
+
+msgid "Allow non-administrators access to the performance bar"
+msgstr ""
+
+msgid "Allow only the selected protocols to be used for Git access."
+msgstr ""
+
+msgid "Allow owners to manage default branch protection per group."
+msgstr ""
+
+msgid "Allow owners to manually add users outside of LDAP"
+msgstr ""
+
+msgid "Allow password authentication for Git over HTTP(S)"
+msgstr ""
+
+msgid "Allow password authentication for the web interface"
+msgstr ""
+
+msgid "Allow project maintainers to configure repository mirroring"
+msgstr ""
+
+msgid "Allow projects and subgroups to override the group setting"
+msgstr ""
+
+msgid "Allow projects within this group to use Git LFS"
+msgstr ""
+
+msgid "Allow public access to pipelines and job details, including output logs and artifacts."
+msgstr ""
+
+msgid "Allow subgroups to set up their own two-factor authentication rules"
+msgstr ""
+
+msgid "Allow this key to push to this repository"
+msgstr ""
+
+msgid "Allow this secondary site to replicate content on Object Storage"
+msgstr ""
+
+msgid "Allow use of licensed EE features"
+msgstr ""
+
+msgid "Allow users to dismiss the broadcast message"
+msgstr ""
+
+msgid "Allow users to register any application to use GitLab as an OAuth provider"
+msgstr ""
+
+msgid "Allow users to request access (if visibility is public or internal)"
+msgstr ""
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Allowed Geo IP"
+msgstr ""
+
+msgid "Allowed characters: +, 0-9, -, and spaces."
+msgstr ""
+
+msgid "Allowed email domain restriction only permitted for top-level groups"
+msgstr ""
+
+msgid "Allowed to create:"
+msgstr ""
+
+msgid "Allowed to fail"
+msgstr ""
+
+msgid "Allows projects or subgroups in this group to override the global setting."
+msgstr ""
+
+msgid "Allows you to add and manage Kubernetes clusters."
+msgstr ""
+
+msgid "Almost there"
+msgstr ""
+
+msgid "Almost there..."
+msgstr ""
+
+msgid "Already blocked"
+msgstr ""
+
+msgid "Already have login and password?"
+msgstr ""
+
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Also remove direct user membership from subgroups and projects"
+msgstr ""
+
+msgid "Also unassign this user from related issues and merge requests"
+msgstr ""
+
+msgid "Alternate support URL for Help page and Help dropdown."
+msgstr ""
+
+msgid "Alternatively, you can convert your account to a managed account by the %{group_name} group."
+msgstr ""
+
+msgid "Amazon EKS"
+msgstr ""
+
+msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
+msgstr ""
+
+msgid "Amazon Web Services Logo"
+msgstr ""
+
+msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
+msgstr ""
+
+msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
+msgstr ""
+
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
+msgid "An Enterprise User GitLab account has been created for you by your organization:"
+msgstr ""
+
+msgid "An administrator changed the password for your GitLab account on %{link_to}."
+msgstr ""
+
+msgid "An alert has been resolved in %{project_path}."
+msgstr ""
+
+msgid "An alert has been triggered in %{project_path}."
+msgstr ""
+
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An email notification was recently sent from the admin panel. Please wait %{wait_time_in_words} before attempting to send another message."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
+msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
+msgstr ""
+
+msgid "An error occurred adding a draft to the thread."
+msgstr ""
+
+msgid "An error occurred adding a new draft."
+msgstr ""
+
+msgid "An error occurred creating the new branch."
+msgstr ""
+
+msgid "An error occurred fetching the approval rules."
+msgstr ""
+
+msgid "An error occurred fetching the approvers for the new rule."
+msgstr ""
+
+msgid "An error occurred fetching the dropdown data."
+msgstr ""
+
+msgid "An error occurred fetching the project authors."
+msgstr ""
+
+msgid "An error occurred fetching the public deploy keys. Please try again."
+msgstr ""
+
+msgid "An error occurred previewing the blob"
+msgstr ""
+
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
+msgid "An error occurred when updating the title"
+msgstr ""
+
+msgid "An error occurred while acknowledging the notification. Refresh the page and try again."
+msgstr ""
+
+msgid "An error occurred while adding approvers"
+msgstr ""
+
+msgid "An error occurred while adding formatted title for epic"
+msgstr ""
+
+msgid "An error occurred while authorizing your role"
+msgstr ""
+
+msgid "An error occurred while checking group path. Please refresh and try again."
+msgstr ""
+
+msgid "An error occurred while decoding the file."
+msgstr ""
+
+msgid "An error occurred while deleting the approvers group"
+msgstr ""
+
+msgid "An error occurred while deleting the comment"
+msgstr ""
+
+msgid "An error occurred while deleting the pipeline."
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
+msgid "An error occurred while disabling Service Desk."
+msgstr ""
+
+msgid "An error occurred while dismissing the alert. Refresh the page and try again."
+msgstr ""
+
+msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
+msgstr ""
+
+msgid "An error occurred while drawing job relationship links."
+msgstr ""
+
+msgid "An error occurred while enabling Service Desk."
+msgstr ""
+
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
+msgid "An error occurred while fetching branches. Retry the search."
+msgstr ""
+
+msgid "An error occurred while fetching codequality mr diff reports."
+msgstr ""
+
+msgid "An error occurred while fetching commit data."
+msgstr ""
+
+msgid "An error occurred while fetching commits. Retry the search."
+msgstr ""
+
+msgid "An error occurred while fetching coverage reports."
+msgstr ""
+
+msgid "An error occurred while fetching environments."
+msgstr ""
+
+msgid "An error occurred while fetching exposed artifacts."
+msgstr ""
+
+msgid "An error occurred while fetching folder content."
+msgstr ""
+
+msgid "An error occurred while fetching issues."
+msgstr ""
+
+msgid "An error occurred while fetching label colors."
+msgstr ""
+
+msgid "An error occurred while fetching participants"
+msgstr ""
+
+msgid "An error occurred while fetching participants."
+msgstr ""
+
+msgid "An error occurred while fetching pending comments"
+msgstr ""
+
+msgid "An error occurred while fetching projects autocomplete."
+msgstr ""
+
+msgid "An error occurred while fetching reference"
+msgstr ""
+
+msgid "An error occurred while fetching tags. Retry the search."
+msgstr ""
+
+msgid "An error occurred while fetching terraform reports."
+msgstr ""
+
+msgid "An error occurred while fetching the job log."
+msgstr ""
+
+msgid "An error occurred while fetching the job logs."
+msgstr ""
+
+msgid "An error occurred while fetching the job."
+msgstr ""
+
+msgid "An error occurred while fetching the jobs."
+msgstr ""
+
+msgid "An error occurred while fetching the latest pipeline."
+msgstr ""
+
+msgid "An error occurred while fetching the pipelines jobs."
+msgstr ""
+
+msgid "An error occurred while fetching the releases. Please try again."
+msgstr ""
+
+msgid "An error occurred while fetching this tab."
+msgstr ""
+
+msgid "An error occurred while getting files for - %{branchId}"
+msgstr ""
+
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
+msgid "An error occurred while getting projects"
+msgstr ""
+
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading a section of this page."
+msgstr ""
+
+msgid "An error occurred while loading all the files."
+msgstr ""
+
+msgid "An error occurred while loading chart data"
+msgstr ""
+
+msgid "An error occurred while loading code owners."
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
+msgstr ""
+
+msgid "An error occurred while loading designs. Please try again."
+msgstr ""
+
+msgid "An error occurred while loading diff"
+msgstr ""
+
+msgid "An error occurred while loading filenames"
+msgstr ""
+
+msgid "An error occurred while loading group members."
+msgstr ""
+
+msgid "An error occurred while loading issues"
+msgstr ""
+
+msgid "An error occurred while loading merge requests."
+msgstr ""
+
+msgid "An error occurred while loading projects."
+msgstr ""
+
+msgid "An error occurred while loading the Jobs tab."
+msgstr ""
+
+msgid "An error occurred while loading the Needs tab."
+msgstr ""
+
+msgid "An error occurred while loading the Test Reports tab."
+msgstr ""
+
+msgid "An error occurred while loading the access tokens form, please try again."
+msgstr ""
+
+msgid "An error occurred while loading the blob controls."
+msgstr ""
+
+msgid "An error occurred while loading the data. Please try again."
+msgstr ""
+
+msgid "An error occurred while loading the file"
+msgstr ""
+
+msgid "An error occurred while loading the file content."
+msgstr ""
+
+msgid "An error occurred while loading the file."
+msgstr ""
+
+msgid "An error occurred while loading the file. Please try again later."
+msgstr ""
+
+msgid "An error occurred while loading the file. Please try again."
+msgstr ""
+
+msgid "An error occurred while loading the merge request changes."
+msgstr ""
+
+msgid "An error occurred while loading the merge request version data."
+msgstr ""
+
+msgid "An error occurred while loading the merge request."
+msgstr ""
+
+msgid "An error occurred while loading the notification settings. Please try again."
+msgstr ""
+
+msgid "An error occurred while loading the pipeline."
+msgstr ""
+
+msgid "An error occurred while loading the pipelines jobs."
+msgstr ""
+
+msgid "An error occurred while loading your content. Please try again."
+msgstr ""
+
+msgid "An error occurred while making the request."
+msgstr ""
+
+msgid "An error occurred while moving the issue."
+msgstr ""
+
+msgid "An error occurred while parsing recent searches"
+msgstr ""
+
+msgid "An error occurred while parsing the file."
+msgstr ""
+
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
+msgid "An error occurred while removing epics."
+msgstr ""
+
+msgid "An error occurred while removing issues."
+msgstr ""
+
+msgid "An error occurred while rendering preview broadcast message"
+msgstr ""
+
+msgid "An error occurred while rendering the editor"
+msgstr ""
+
+msgid "An error occurred while reordering issues."
+msgstr ""
+
+msgid "An error occurred while retrieving calendar activity"
+msgstr ""
+
+msgid "An error occurred while retrieving diff"
+msgstr ""
+
+msgid "An error occurred while retrieving diff files"
+msgstr ""
+
+msgid "An error occurred while retrieving projects."
+msgstr ""
+
+msgid "An error occurred while 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 ""
+
+msgid "An error occurred while triggering the job."
+msgstr ""
+
+msgid "An error occurred while trying to generate the report. Please try again later."
+msgstr ""
+
+msgid "An error occurred while trying to run a new pipeline for this merge request."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while updating approvers"
+msgstr ""
+
+msgid "An error occurred while updating assignees."
+msgstr ""
+
+msgid "An error occurred while updating configuration."
+msgstr ""
+
+msgid "An error occurred while updating labels."
+msgstr ""
+
+msgid "An error occurred while updating the comment"
+msgstr ""
+
+msgid "An error occurred while updating the configuration."
+msgstr ""
+
+msgid "An error occurred while updating the notification settings. Please try again."
+msgstr ""
+
+msgid "An error occurred while uploading the file. Please try again."
+msgstr ""
+
+msgid "An error occurred while uploading the image. Please try again."
+msgstr ""
+
+msgid "An error occurred while validating group path"
+msgstr ""
+
+msgid "An error occurred while validating username"
+msgstr ""
+
+msgid "An error occurred. Please sign in again."
+msgstr ""
+
+msgid "An error occurred. Please try again."
+msgstr ""
+
+msgid "An example project for managing Kubernetes clusters integrated with GitLab"
+msgstr ""
+
+msgid "An example project that shows off the best practices for setting up GitLab for your own organization, including sample issues, merge requests, and milestones"
+msgstr ""
+
+msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
+msgstr ""
+
+msgid "An incident has been resolved in %{project_path}."
+msgstr ""
+
+msgid "An incident has been triggered in %{project_path}."
+msgstr ""
+
+msgid "An integer value is required for seconds"
+msgstr ""
+
+msgid "An issue already exists"
+msgstr ""
+
+msgid "An unauthenticated user"
+msgstr ""
+
+msgid "An unexpected error occurred"
+msgstr ""
+
+msgid "An unexpected error occurred while checking the project environment."
+msgstr ""
+
+msgid "An unexpected error occurred while checking the project runners."
+msgstr ""
+
+msgid "An unexpected error occurred while communicating with the Web Terminal."
+msgstr ""
+
+msgid "An unexpected error occurred while loading the code quality diff."
+msgstr ""
+
+msgid "An unexpected error occurred while starting the Web Terminal."
+msgstr ""
+
+msgid "An unexpected error occurred while stopping the Web Terminal."
+msgstr ""
+
+msgid "An unknown error occurred while loading this graph."
+msgstr ""
+
+msgid "An unknown error occurred."
+msgstr ""
+
+msgid "Analytics"
+msgstr ""
+
+msgid "Analyze a review version of your web application."
+msgstr ""
+
+msgid "Analyze your dependencies for known vulnerabilities."
+msgstr ""
+
+msgid "Analyze your infrastructure as code configuration files for known vulnerabilities."
+msgstr ""
+
+msgid "Analyze your source code and git history for secrets."
+msgstr ""
+
+msgid "Analyze your source code for known vulnerabilities."
+msgstr ""
+
+msgid "Analyzing file…"
+msgstr ""
+
+msgid "Ancestors"
+msgstr ""
+
+msgid "And this registration token:"
+msgstr ""
+
+msgid "Anonymous"
+msgstr ""
+
+msgid "Another action is currently in progress"
+msgstr ""
+
+msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any %{header}"
+msgstr ""
+
+msgid "Any Author"
+msgstr ""
+
+msgid "Any Milestone"
+msgstr ""
+
+msgid "Any encrypted tokens"
+msgstr ""
+
+msgid "Any label"
+msgstr ""
+
+msgid "Any member with at least Developer permissions on the project."
+msgstr ""
+
+msgid "Any milestone"
+msgstr ""
+
+msgid "Any namespace"
+msgstr ""
+
+msgid "Anyone can register for an account."
+msgstr ""
+
+msgid "App ID"
+msgstr ""
+
+msgid "Appearance"
+msgstr ""
+
+msgid "Appearance was successfully created."
+msgstr ""
+
+msgid "Appearance was successfully updated."
+msgstr ""
+
+msgid "Append the comment with %{shrug}"
+msgstr ""
+
+msgid "Append the comment with %{tableflip}"
+msgstr ""
+
+msgid "Application"
+msgstr ""
+
+msgid "Application ID"
+msgstr ""
+
+msgid "Application limits saved successfully"
+msgstr ""
+
+msgid "Application settings saved successfully"
+msgstr ""
+
+msgid "Application settings update failed"
+msgstr ""
+
+msgid "Application uninstalled but failed to destroy: %{error_message}"
+msgstr ""
+
+msgid "Application was successfully destroyed."
+msgstr ""
+
+msgid "Application was successfully updated."
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
+msgid "ApplicationSettings|After sign up text"
+msgstr ""
+
+msgid "ApplicationSettings|Allowed domains for sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Approve %d user"
+msgid_plural "ApplicationSettings|Approve %d users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApplicationSettings|Approve users"
+msgstr ""
+
+msgid "ApplicationSettings|Approve users in the pending approval status?"
+msgstr ""
+
+msgid "ApplicationSettings|Approve users who are pending approval?"
+msgstr ""
+
+msgid "ApplicationSettings|By making this change, you will automatically approve %d user who is pending approval."
+msgid_plural "ApplicationSettings|By making this change, you will automatically approve %d users who are pending approval."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApplicationSettings|By making this change, you will automatically approve all users who are pending approval."
+msgstr ""
+
+msgid "ApplicationSettings|Denied domains for sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Denylist file"
+msgstr ""
+
+msgid "ApplicationSettings|Domain denylist"
+msgstr ""
+
+msgid "ApplicationSettings|Email restrictions"
+msgstr ""
+
+msgid "ApplicationSettings|Email restrictions for sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgstr ""
+
+msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgstr ""
+
+msgid "ApplicationSettings|Enter denylist manually"
+msgstr ""
+
+msgid "ApplicationSettings|Markdown enabled"
+msgstr ""
+
+msgid "ApplicationSettings|Minimum password length (number of characters)"
+msgstr ""
+
+msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgstr ""
+
+msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+msgstr ""
+
+msgid "ApplicationSettings|Require admin approval for new sign-ups"
+msgstr ""
+
+msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. See the %{linkStart}supported syntax%{linkEnd} for more information."
+msgstr ""
+
+msgid "ApplicationSettings|Save changes"
+msgstr ""
+
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
+msgstr ""
+
+msgid "ApplicationSettings|Send confirmation email on sign-up"
+msgstr ""
+
+msgid "ApplicationSettings|Sign-up enabled"
+msgstr ""
+
+msgid "ApplicationSettings|Upload denylist file"
+msgstr ""
+
+msgid "ApplicationSettings|User cap"
+msgstr ""
+
+msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgstr ""
+
+msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgstr ""
+
+msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+msgstr ""
+
+msgid "ApplicationSettings|When enabled, any user visiting %{host} will be able to create an account."
+msgstr ""
+
+msgid "ApplicationSettings|domain.com"
+msgstr ""
+
+msgid "Applications"
+msgstr ""
+
+msgid "Applied"
+msgstr ""
+
+msgid "Apply"
+msgstr ""
+
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Apply a label"
+msgstr ""
+
+msgid "Apply a template"
+msgstr ""
+
+msgid "Apply suggestion"
+msgstr ""
+
+msgid "Apply template"
+msgstr ""
+
+msgid "Apply this approval rule to all branches or a specific protected branch."
+msgstr ""
+
+msgid "Applying"
+msgstr ""
+
+msgid "Applying a template will replace the existing issue description. Any changes you have made will be lost."
+msgstr ""
+
+msgid "Applying command"
+msgstr ""
+
+msgid "Applying command to %{commandDescription}"
+msgstr ""
+
+msgid "Applying multiple commands"
+msgstr ""
+
+msgid "Applying suggestion..."
+msgstr ""
+
+msgid "Applying suggestions..."
+msgstr ""
+
+msgid "Approval Status"
+msgstr ""
+
+msgid "Approval rules"
+msgstr ""
+
+msgid "Approval rules reset to project defaults"
+msgstr ""
+
+msgid "Approval settings"
+msgstr ""
+
+msgid "ApprovalRuleRemove|%d member"
+msgid_plural "ApprovalRuleRemove|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{strongStart}%{count} member%{strongEnd}. Approvals from this member are not revoked."
+msgid_plural "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{strongStart}%{count} members%{strongEnd}. Approvals from these members are not revoked."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleSummary|%d member"
+msgid_plural "ApprovalRuleSummary|%d members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}"
+msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ApprovalRule|%{firstLabel} +%{numberOfAdditionalLabels} more"
+msgstr ""
+
+msgid "ApprovalRule|A merge request author collaborating with a merge request approver"
+msgstr ""
+
+msgid "ApprovalRule|Add approvers"
+msgstr ""
+
+msgid "ApprovalRule|All scanners"
+msgstr ""
+
+msgid "ApprovalRule|All severity levels"
+msgstr ""
+
+msgid "ApprovalRule|All vulnerability states"
+msgstr ""
+
+msgid "ApprovalRule|Apply this approval rule to consider only the selected security scanners."
+msgstr ""
+
+msgid "ApprovalRule|Apply this approval rule to consider only the selected severity levels."
+msgstr ""
+
+msgid "ApprovalRule|Apply this approval rule to consider only the selected vulnerability states."
+msgstr ""
+
+msgid "ApprovalRule|Approval rules"
+msgstr ""
+
+msgid "ApprovalRule|Approvals required"
+msgstr ""
+
+msgid "ApprovalRule|Approver Type"
+msgstr ""
+
+msgid "ApprovalRule|Approvers"
+msgstr ""
+
+msgid "ApprovalRule|Confirmed"
+msgstr ""
+
+msgid "ApprovalRule|Dismissed"
+msgstr ""
+
+msgid "ApprovalRule|Examples: QA, Security."
+msgstr ""
+
+msgid "ApprovalRule|Improve your organization's code review with required approvals."
+msgstr ""
+
+msgid "ApprovalRule|Increase quality and maintain standards."
+msgstr ""
+
+msgid "ApprovalRule|Learn more about merge request approval rules."
+msgstr ""
+
+msgid "ApprovalRule|Name"
+msgstr ""
+
+msgid "ApprovalRule|Newly detected"
+msgstr ""
+
+msgid "ApprovalRule|Number of vulnerabilities allowed before approval rule is triggered."
+msgstr ""
+
+msgid "ApprovalRule|Please enter a number equal or greater than zero"
+msgstr ""
+
+msgid "ApprovalRule|Please select at least one security scanner"
+msgstr ""
+
+msgid "ApprovalRule|Please select at least one severity level"
+msgstr ""
+
+msgid "ApprovalRule|Please select at least one vulnerability state"
+msgstr ""
+
+msgid "ApprovalRule|Previously detected"
+msgstr ""
+
+msgid "ApprovalRule|Reduce your time to merge."
+msgstr ""
+
+msgid "ApprovalRule|Resolved"
+msgstr ""
+
+msgid "ApprovalRule|Rule name"
+msgstr ""
+
+msgid "ApprovalRule|Security scanners"
+msgstr ""
+
+msgid "ApprovalRule|Select All"
+msgstr ""
+
+msgid "ApprovalRule|Select eligible approvers by expertise or files changed."
+msgstr ""
+
+msgid "ApprovalRule|Select scanners"
+msgstr ""
+
+msgid "ApprovalRule|Select severity levels"
+msgstr ""
+
+msgid "ApprovalRule|Select vulnerability states"
+msgstr ""
+
+msgid "ApprovalRule|Severity levels"
+msgstr ""
+
+msgid "ApprovalRule|Target branch"
+msgstr ""
+
+msgid "ApprovalRule|Try for free"
+msgstr ""
+
+msgid "ApprovalRule|Vulnerabilities allowed"
+msgstr ""
+
+msgid "ApprovalRule|Vulnerability states"
+msgstr ""
+
+msgid "ApprovalSettings|Merge request approval settings have been updated."
+msgstr ""
+
+msgid "ApprovalSettings|Prevent approval by author"
+msgstr ""
+
+msgid "ApprovalSettings|Prevent approval by author."
+msgstr ""
+
+msgid "ApprovalSettings|Prevent approvals by users who add commits"
+msgstr ""
+
+msgid "ApprovalSettings|Prevent approvals by users who add commits."
+msgstr ""
+
+msgid "ApprovalSettings|Prevent editing approval rules in merge requests"
+msgstr ""
+
+msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
+msgstr ""
+
+msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch"
+msgstr ""
+
+msgid "ApprovalSettings|Require user password to approve"
+msgstr ""
+
+msgid "ApprovalSettings|There was an error loading merge request approval settings."
+msgstr ""
+
+msgid "ApprovalSettings|There was an error updating merge request approval settings."
+msgstr ""
+
+msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
+msgstr ""
+
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed in the group settings by an administrator or group owner."
+msgstr ""
+
+msgid "ApprovalStatusTooltip|Adheres to separation of duties"
+msgstr ""
+
+msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
+msgstr ""
+
+msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
+msgstr ""
+
+msgid "Approvals are optional."
+msgstr ""
+
+msgid "Approvals|Section: %section"
+msgstr ""
+
+msgid "Approve"
+msgstr ""
+
+msgid "Approve a merge request"
+msgstr ""
+
+msgid "Approve the current merge request."
+msgstr ""
+
+msgid "Approved"
+msgstr ""
+
+msgid "Approved MRs"
+msgstr ""
+
+msgid "Approved the current merge request."
+msgstr ""
+
+msgid "Approved-By"
+msgstr ""
+
+msgid "Approver"
+msgstr ""
+
+msgid "Approvers"
+msgstr ""
+
+msgid "Approvers from private group(s) not shown"
+msgstr ""
+
+msgid "Apr"
+msgstr ""
+
+msgid "April"
+msgstr ""
+
+msgid "Architecture not found for OS"
+msgstr ""
+
+msgid "Archive"
+msgstr ""
+
+msgid "Archive jobs"
+msgstr ""
+
+msgid "Archive project"
+msgstr ""
+
+msgid "Archive test case"
+msgstr ""
+
+msgid "Archived"
+msgstr ""
+
+msgid "Archived (%{movedToStart}moved%{movedToEnd})"
+msgstr ""
+
+msgid "Archived in this version"
+msgstr ""
+
+msgid "Archived project! Repository and other project resources are read-only"
+msgstr ""
+
+msgid "Archived projects"
+msgstr ""
+
+msgid "Archiving the project 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 ""
+
+msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
+msgstr ""
+
+msgid "Are you absolutely sure?"
+msgstr ""
+
+msgid "Are you sure that you want to archive this project?"
+msgstr ""
+
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
+msgid "Are you sure that you want to unarchive this project?"
+msgstr ""
+
+msgid "Are you sure you want to %{action} %{name}?"
+msgstr ""
+
+msgid "Are you sure you want to approve %{user}?"
+msgstr ""
+
+msgid "Are you sure you want to attempt to merge?"
+msgstr ""
+
+msgid "Are you sure you want to cancel editing this comment?"
+msgstr ""
+
+msgid "Are you sure you want to close this blocked issue?"
+msgstr ""
+
+msgid "Are you sure you want to delete %{name}?"
+msgstr ""
+
+msgid "Are you sure you want to delete these artifacts?"
+msgstr ""
+
+msgid "Are you sure you want to delete this %{typeOfComment}?"
+msgstr ""
+
+msgid "Are you sure you want to delete this SSH key?"
+msgstr ""
+
+msgid "Are you sure you want to delete this comment?"
+msgstr ""
+
+msgid "Are you sure you want to delete this deploy key?"
+msgstr ""
+
+msgid "Are you sure you want to delete this device? This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to delete this label?"
+msgstr ""
+
+msgid "Are you sure you want to delete this pipeline schedule?"
+msgstr ""
+
+msgid "Are you sure you want to delete this pipeline? Doing so will expire all pipeline caches and delete all related objects, such as builds, logs, artifacts, and triggers. This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to deploy this environment?"
+msgstr ""
+
+msgid "Are you sure you want to discard this comment?"
+msgstr ""
+
+msgid "Are you sure you want to discard your changes?"
+msgstr ""
+
+msgid "Are you sure you want to import %d repository?"
+msgid_plural "Are you sure you want to import %d repositories?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Are you sure you want to lock %{path}?"
+msgstr ""
+
+msgid "Are you sure you want to lock this directory?"
+msgstr ""
+
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to lose your issue information?"
+msgstr ""
+
+msgid "Are you sure you want to merge immediately?"
+msgstr ""
+
+msgid "Are you sure you want to re-deploy this environment?"
+msgstr ""
+
+msgid "Are you sure you want to reindex?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{email}?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
+msgid "Are you sure you want to remove the attachment?"
+msgstr ""
+
+msgid "Are you sure you want to remove the license?"
+msgstr ""
+
+msgid "Are you sure you want to remove this deploy key? If anything is still using this key, it will stop working."
+msgstr ""
+
+msgid "Are you sure you want to remove this identity?"
+msgstr ""
+
+msgid "Are you sure you want to remove this list?"
+msgstr ""
+
+msgid "Are you sure you want to remove this nickname?"
+msgstr ""
+
+msgid "Are you sure you want to reset the health check token?"
+msgstr ""
+
+msgid "Are you sure you want to reset the registration token?"
+msgstr ""
+
+msgid "Are you sure you want to retry this migration?"
+msgstr ""
+
+msgid "Are you sure you want to revoke this %{type}? This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to revoke this personal access token? This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to revoke this project access token? This action cannot be undone."
+msgstr ""
+
+msgid "Are you sure you want to stop this environment?"
+msgstr ""
+
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
+msgid "Are you sure you want to unlock %{path}?"
+msgstr ""
+
+msgid "Are you sure you want to unlock this directory?"
+msgstr ""
+
+msgid "Are you sure you want to unsubscribe from the %{type}: %{link_to_noteable_text}?"
+msgstr ""
+
+msgid "Are you sure?"
+msgstr ""
+
+msgid "Are you sure? All commits that were signed with this GPG key will be unverified."
+msgstr ""
+
+msgid "Are you sure? Removing this GPG key does not affect already signed commits."
+msgstr ""
+
+msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
+msgstr ""
+
+msgid "Arrange charts"
+msgstr ""
+
+msgid "Artifact"
+msgstr ""
+
+msgid "Artifact could not be deleted."
+msgstr ""
+
+msgid "Artifact was successfully deleted."
+msgstr ""
+
+msgid "Artifacts"
+msgstr ""
+
+msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
+msgstr ""
+
+msgid "AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{commit_url} ):"
+msgstr ""
+
+msgid "AsanaService|Add commit messages as comments to Asana tasks."
+msgstr ""
+
+msgid "AsanaService|Comma-separated list of branches to be automatically inspected. Leave blank to include all branches."
+msgstr ""
+
+msgid "AsanaService|User Personal Access Token. User must have access to the task. All comments are attributed to this user."
+msgstr ""
+
+msgid "Ascending"
+msgstr ""
+
+msgid "Ask again later"
+msgstr ""
+
+msgid "Ask someone with write access to resolve it."
+msgstr ""
+
+msgid "Ask your group owner to set up a group runner."
+msgstr ""
+
+msgid "Assertion consumer service URL"
+msgstr ""
+
+msgid "Assets"
+msgstr ""
+
+msgid "Assets:"
+msgstr ""
+
+msgid "Assign"
+msgstr ""
+
+msgid "Assign Iteration"
+msgstr ""
+
+msgid "Assign To"
+msgstr ""
+
+msgid "Assign custom color like #FF0000"
+msgstr ""
+
+msgid "Assign labels"
+msgstr ""
+
+msgid "Assign milestone"
+msgstr ""
+
+msgid "Assign reviewer"
+msgstr ""
+
+msgid "Assign reviewer(s)"
+msgstr ""
+
+msgid "Assign severity"
+msgstr ""
+
+msgid "Assign some issues to this milestone."
+msgstr ""
+
+msgid "Assign to"
+msgstr ""
+
+msgid "Assign to commenting user"
+msgstr ""
+
+msgid "Assign to me"
+msgstr ""
+
+msgid "Assigned %{assignee_users_sentence}."
+msgstr ""
+
+msgid "Assigned %{reviewer_users_sentence} as %{reviewer_text}."
+msgstr ""
+
+msgid "Assigned Issues"
+msgstr ""
+
+msgid "Assigned merge requests"
+msgstr ""
+
+msgid "Assigned projects"
+msgstr ""
+
+msgid "Assigned to %{assigneeName}"
+msgstr ""
+
+msgid "Assigned to %{assignee_name}"
+msgstr ""
+
+msgid "Assigned to me"
+msgstr ""
+
+msgid "Assigned to you"
+msgstr ""
+
+msgid "Assignee"
+msgid_plural "%d Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Assignee has no permissions"
+msgstr ""
+
+msgid "Assignee lists not available with your current license"
+msgstr ""
+
+msgid "Assignee(s)"
+msgstr ""
+
+msgid "Assignees"
+msgstr ""
+
+msgid "Assigns %{assignee_users_sentence}."
+msgstr ""
+
+msgid "Assigns %{reviewer_users_sentence} as %{reviewer_text}."
+msgstr ""
+
+msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
+msgstr ""
+
+msgid "At least one field of %{one_of_required_fields} must be present"
+msgstr ""
+
+msgid "At least one of group_id or project_id must be specified"
+msgstr ""
+
+msgid "At least one of your Personal Access Tokens is expired, but expiration enforcement is disabled. %{generate_new}"
+msgstr ""
+
+msgid "At least one of your Personal Access Tokens will expire soon, but expiration enforcement is disabled. %{generate_new}"
+msgstr ""
+
+msgid "At risk"
+msgstr ""
+
+msgid "Attach a file"
+msgstr ""
+
+msgid "Attach a file by drag &amp; drop or %{upload_link}"
+msgstr ""
+
+msgid "Attaching File - %{progress}"
+msgstr ""
+
+msgid "Attaching a file"
+msgid_plural "Attaching %d files"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Attaching the file failed."
+msgstr ""
+
+msgid "Attention"
+msgstr ""
+
+msgid "Attention requested"
+msgstr ""
+
+msgid "Audit Events"
+msgstr ""
+
+msgid "Audit events"
+msgstr ""
+
+msgid "AuditLogs|(removed)"
+msgstr ""
+
+msgid "AuditLogs|Action"
+msgstr ""
+
+msgid "AuditLogs|Author"
+msgstr ""
+
+msgid "AuditLogs|Date"
+msgstr ""
+
+msgid "AuditLogs|Failed to find %{type}. Please search for another %{type}."
+msgstr ""
+
+msgid "AuditLogs|Failed to find %{type}. Please try again."
+msgstr ""
+
+msgid "AuditLogs|Group Events"
+msgstr ""
+
+msgid "AuditLogs|IP Address"
+msgstr ""
+
+msgid "AuditLogs|Log"
+msgstr ""
+
+msgid "AuditLogs|Member Events"
+msgstr ""
+
+msgid "AuditLogs|No matching %{type} found."
+msgstr ""
+
+msgid "AuditLogs|Object"
+msgstr ""
+
+msgid "AuditLogs|Project Events"
+msgstr ""
+
+msgid "AuditLogs|Target"
+msgstr ""
+
+msgid "AuditLogs|This month"
+msgstr ""
+
+msgid "AuditLogs|User Events"
+msgstr ""
+
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
+msgid "Aug"
+msgstr ""
+
+msgid "August"
+msgstr ""
+
+msgid "Authenticate"
+msgstr ""
+
+msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+msgstr ""
+
+msgid "Authenticate with GitHub"
+msgstr ""
+
+msgid "Authenticated API rate limit period in seconds"
+msgstr ""
+
+msgid "Authenticated API requests"
+msgstr ""
+
+msgid "Authenticated Git LFS rate limit period in seconds"
+msgstr ""
+
+msgid "Authenticated Git LFS request rate limit"
+msgstr ""
+
+msgid "Authenticated Git LFS requests"
+msgstr ""
+
+msgid "Authenticated web rate limit period in seconds"
+msgstr ""
+
+msgid "Authenticated web requests"
+msgstr ""
+
+msgid "Authenticating"
+msgstr ""
+
+msgid "Authentication"
+msgstr ""
+
+msgid "Authentication Failure"
+msgstr ""
+
+msgid "Authentication Log"
+msgstr ""
+
+msgid "Authentication failed: %{error_message}"
+msgstr ""
+
+msgid "Authentication log"
+msgstr ""
+
+msgid "Authentication method"
+msgstr ""
+
+msgid "Authentication method updated"
+msgstr ""
+
+msgid "Authentication via U2F device failed."
+msgstr ""
+
+msgid "Authentication via WebAuthn device failed."
+msgstr ""
+
+msgid "Author"
+msgstr ""
+
+msgid "Author: %{author_name}"
+msgstr ""
+
+msgid "Authored %{timeago}"
+msgstr ""
+
+msgid "Authored %{timeago} by %{author}"
+msgstr ""
+
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization key"
+msgstr ""
+
+msgid "Authorization required"
+msgstr ""
+
+msgid "Authorization token duration (minutes)"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorize %{user} to use your account?"
+msgstr ""
+
+msgid "Authorized %{new_chat_name}"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
+msgid "AuthorizedApplication|Are you sure you want to revoke this application?"
+msgstr ""
+
+msgid "AuthorizedApplication|Revoke application"
+msgstr ""
+
+msgid "Authors: %{authors}"
+msgstr ""
+
+msgid "Auto DevOps"
+msgstr ""
+
+msgid "Auto DevOps enabled"
+msgstr ""
+
+msgid "Auto stop successfully canceled."
+msgstr ""
+
+msgid "Auto-cancel redundant pipelines"
+msgstr ""
+
+msgid "Auto-close referenced issues on default branch"
+msgstr ""
+
+msgid "AutoDevOps|%{auto_devops_start}Automate building, testing, and deploying%{auto_devops_end} your applications based on your continuous integration and delivery configuration. %{quickstart_start}How do I get started?%{quickstart_end}"
+msgstr ""
+
+msgid "AutoDevOps|Auto DevOps"
+msgstr ""
+
+msgid "AutoDevOps|Auto DevOps documentation"
+msgstr ""
+
+msgid "AutoDevOps|Dismiss Auto DevOps box"
+msgstr ""
+
+msgid "AutoDevOps|Enable in settings"
+msgstr ""
+
+msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
+msgstr ""
+
+msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
+msgstr ""
+
+msgid "AutoDevOps|The Auto DevOps pipeline has been enabled and will be used if no alternative CI configuration file is found."
+msgstr ""
+
+msgid "AutoDevopsAlert|Security testing tools enabled with %{linkStart}Auto DevOps%{linkEnd}"
+msgstr ""
+
+msgid "AutoRemediation| 1 Merge Request"
+msgstr ""
+
+msgid "AutoRemediation|%{mrsCount} ready for review"
+msgstr ""
+
+msgid "AutoRemediation|Auto-fix"
+msgstr ""
+
+msgid "AutoRemediation|Auto-fix solutions"
+msgstr ""
+
+msgid "AutoRemediation|If you're using dependency and/or container scanning, and auto-fix is enabled, auto-fix automatically creates merge requests with fixes to vulnerabilities."
+msgstr ""
+
+msgid "AutoRemediation|Introducing GitLab auto-fix"
+msgstr ""
+
+msgid "AutoRollback|Automatic rollbacks start when a critical alert is triggered. If the last successful deployment fails to roll back automatically, it can still be done manually."
+msgstr ""
+
+msgid "AutoRollback|Automatically roll back to the last successful deployment when a critical problem is detected."
+msgstr ""
+
+msgid "AutoRollback|Enable automatic rollbacks"
+msgstr ""
+
+msgid "Autocomplete"
+msgstr ""
+
+msgid "Autocomplete description"
+msgstr ""
+
+msgid "Autocomplete hint"
+msgstr ""
+
+msgid "Autocomplete usage hint"
+msgstr ""
+
+msgid "Automatic certificate management using %{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end}"
+msgstr ""
+
+msgid "Automatic certificate management using Let's Encrypt"
+msgstr ""
+
+msgid "Automatic deployment rollbacks"
+msgstr ""
+
+msgid "Automatic event tracking provides a traceable history for audits."
+msgstr ""
+
+msgid "Automatically close associated incident when a recovery alert notification resolves an alert"
+msgstr ""
+
+msgid "Automatically resolved"
+msgstr ""
+
+msgid "Automatically update this project's branches and tags from the upstream repository every hour."
+msgstr ""
+
+msgid "Autosave|Note"
+msgstr ""
+
+msgid "Available"
+msgstr ""
+
+msgid "Available ID"
+msgstr ""
+
+msgid "Available group runners: %{runners}"
+msgstr ""
+
+msgid "Available runners: %{runners}"
+msgstr ""
+
+msgid "Available shared runners:"
+msgstr ""
+
+msgid "Available specific runners"
+msgstr ""
+
+msgid "Avatar for %{assigneeName}"
+msgstr ""
+
+msgid "Avatar will be removed. Are you sure?"
+msgstr ""
+
+msgid "Average per day: %{average}"
+msgstr ""
+
+msgid "Awaiting user signup"
+msgstr ""
+
+msgid "Award added"
+msgstr ""
+
+msgid "Award removed"
+msgstr ""
+
+msgid "AwardEmoji|No emojis found."
+msgstr ""
+
+msgid "Back"
+msgstr ""
+
+msgid "Back to page %{number}"
+msgstr ""
+
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
+msgid "Background Migrations"
+msgstr ""
+
+msgid "Background color"
+msgstr ""
+
+msgid "Badges"
+msgstr ""
+
+msgid "Badges|Add badge"
+msgstr ""
+
+msgid "Badges|Adding the badge failed, please check the entered URLs and try again."
+msgstr ""
+
+msgid "Badges|Badge image URL"
+msgstr ""
+
+msgid "Badges|Badge image preview"
+msgstr ""
+
+msgid "Badges|Badge saved."
+msgstr ""
+
+msgid "Badges|Delete badge?"
+msgstr ""
+
+msgid "Badges|Deleting the badge failed, please try again."
+msgstr ""
+
+msgid "Badges|Enter a valid URL"
+msgstr ""
+
+msgid "Badges|Example: %{exampleUrl}"
+msgstr ""
+
+msgid "Badges|Group Badge"
+msgstr ""
+
+msgid "Badges|Link"
+msgstr ""
+
+msgid "Badges|Name"
+msgstr ""
+
+msgid "Badges|New badge added."
+msgstr ""
+
+msgid "Badges|No badge image"
+msgstr ""
+
+msgid "Badges|No image to preview"
+msgstr ""
+
+msgid "Badges|Project Badge"
+msgstr ""
+
+msgid "Badges|Reload badge image"
+msgstr ""
+
+msgid "Badges|Save changes"
+msgstr ""
+
+msgid "Badges|Saving the badge failed, please check the entered URLs and try again."
+msgstr ""
+
+msgid "Badges|Supported %{docsLinkStart}variables%{docsLinkEnd}: %{placeholders}"
+msgstr ""
+
+msgid "Badges|The badge was deleted."
+msgstr ""
+
+msgid "Badges|This group has no badges"
+msgstr ""
+
+msgid "Badges|This project has no badges"
+msgstr ""
+
+msgid "Badges|You are going to delete this badge. Deleted badges %{strongStart}cannot%{strongEnd} be restored."
+msgstr ""
+
+msgid "Badges|Your badges"
+msgstr ""
+
+msgid "BambooService|Atlassian Bamboo"
+msgstr ""
+
+msgid "BambooService|Bamboo URL"
+msgstr ""
+
+msgid "BambooService|Bamboo build plan key."
+msgstr ""
+
+msgid "BambooService|Bamboo service root URL."
+msgstr ""
+
+msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo."
+msgstr ""
+
+msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo. You must set up automatic revision labeling and a repository trigger in Bamboo. %{docs_link}"
+msgstr ""
+
+msgid "BambooService|The user with API access to the Bamboo server."
+msgstr ""
+
+msgid "Banner message"
+msgstr ""
+
+msgid "Based on"
+msgstr ""
+
+msgid "Basic information"
+msgstr ""
+
+msgid "Be careful. Changing the project's namespace can have unintended side effects."
+msgstr ""
+
+msgid "Be careful. Renaming a project's repository can have unintended side effects."
+msgstr ""
+
+msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
+msgstr ""
+
+msgid "Before inserting code, be sure to read the comment that separated each code group."
+msgstr ""
+
+msgid "Before this can be merged, a Jira issue must be linked in the title or description"
+msgstr ""
+
+msgid "Begin with the selected commit"
+msgstr ""
+
+msgid "Below are the fingerprints for the current instance SSH host keys."
+msgstr ""
+
+msgid "Below are the settings for %{link_to_gitlab_pages}."
+msgstr ""
+
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Beta"
+msgstr ""
+
+msgid "Bi-weekly code coverage"
+msgstr ""
+
+msgid "Billable Users"
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently using the %{plan_name}."
+msgstr ""
+
+msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}."
+msgstr ""
+
+msgid "BillingPlans|Congratulations, your free trial is activated."
+msgstr ""
+
+msgid "BillingPlans|End of availability for the Bronze Plan"
+msgstr ""
+
+msgid "BillingPlans|Free upgrade!"
+msgstr ""
+
+msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by visiting our %{pricing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Looking to purchase or manage a subscription for your group? Navigate to your %{groups_link} and go to %{strong_open}Settings &gt; Billing.%{strong_close}"
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Pricing page"
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
+msgstr ""
+
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below."
+msgstr ""
+
+msgid "BillingPlans|billed annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|for the remainder of your subscription"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|group"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "BillingPlan|Upgrade"
+msgstr ""
+
+msgid "BillingPlan|Upgrade for free"
+msgstr ""
+
+msgid "Billings|%{planName} plan"
+msgstr ""
+
+msgid "Billings|An error occurred while extending your trial."
+msgstr ""
+
+msgid "Billings|An error occurred while reactivating your trial."
+msgstr ""
+
+msgid "Billings|By extending your trial, you will receive an additional 30 days of %{planName}. Your trial can be only extended once."
+msgstr ""
+
+msgid "Billings|By reactivating your trial, you will receive an additional 30 days of %{planName}. Your trial can be only reactivated once."
+msgstr ""
+
+msgid "Billings|Extend trial"
+msgstr ""
+
+msgid "Billings|Reactivate trial"
+msgstr ""
+
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
+msgid "Billings|To use free CI/CD minutes on shared runners, you’ll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "Billings|To use free CI/CD minutes on shared runners, you’ll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
+msgstr ""
+
+msgid "Billings|User validation required"
+msgstr ""
+
+msgid "Billings|Validate account"
+msgstr ""
+
+msgid "Billings|Validate user account"
+msgstr ""
+
+msgid "Billings|You'll now be able to take advantage of free CI/CD minutes on shared runners."
+msgstr ""
+
+msgid "Billings|Your account has been validated"
+msgstr ""
+
+msgid "Billing|%{user} was successfully approved"
+msgstr ""
+
+msgid "Billing|An email address is only visible for users with public emails."
+msgstr ""
+
+msgid "Billing|An error occurred while approving %{user}"
+msgstr ""
+
+msgid "Billing|An error occurred while getting a billable member details"
+msgstr ""
+
+msgid "Billing|An error occurred while loading billable members list"
+msgstr ""
+
+msgid "Billing|An error occurred while loading pending members list"
+msgstr ""
+
+msgid "Billing|An error occurred while removing a billable member"
+msgstr ""
+
+msgid "Billing|Awaiting member signup"
+msgstr ""
+
+msgid "Billing|Cannot remove user"
+msgstr ""
+
+msgid "Billing|Direct memberships"
+msgstr ""
+
+msgid "Billing|Enter at least three characters to search."
+msgstr ""
+
+msgid "Billing|Export list"
+msgstr ""
+
+msgid "Billing|Group"
+msgstr ""
+
+msgid "Billing|Group invite"
+msgstr ""
+
+msgid "Billing|Members who were invited via a group invitation cannot be removed. You can either remove the entire group, or ask an Owner of the invited group to remove the member."
+msgstr ""
+
+msgid "Billing|No users to display."
+msgstr ""
+
+msgid "Billing|Private"
+msgstr ""
+
+msgid "Billing|Project invite"
+msgstr ""
+
+msgid "Billing|Remove user %{username} from your subscription"
+msgstr ""
+
+msgid "Billing|Toggle seat details"
+msgstr ""
+
+msgid "Billing|Type %{username} to confirm"
+msgstr ""
+
+msgid "Billing|User was successfully removed"
+msgstr ""
+
+msgid "Billing|Users occupying seats in"
+msgstr ""
+
+msgid "Billing|View pending approvals"
+msgstr ""
+
+msgid "Billing|You are about to remove user %{username} from your subscription. If you continue, the user will be removed from the %{namespace} group and all its subgroups and projects. This action can't be undone."
+msgstr ""
+
+msgid "Bitbucket Server Import"
+msgstr ""
+
+msgid "Bitbucket Server import"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blame"
+msgstr ""
+
+msgid "BlobViewer|View on %{environmentName}"
+msgstr ""
+
+msgid "Block user"
+msgstr ""
+
+msgid "Blocked"
+msgstr ""
+
+msgid "Blocked by %d issue"
+msgid_plural "Blocked by %d issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Blocked issue"
+msgstr ""
+
+msgid "Blocking"
+msgstr ""
+
+msgid "Blocking issues"
+msgstr ""
+
+msgid "Blocks"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
+msgid "Board scope affects which epics are displayed for anyone who visits this board"
+msgstr ""
+
+msgid "Board scope affects which issues are displayed for anyone who visits this board"
+msgstr ""
+
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
+msgid "BoardNewIssue|No matching results"
+msgstr ""
+
+msgid "BoardNewIssue|Projects"
+msgstr ""
+
+msgid "BoardNewIssue|Search projects"
+msgstr ""
+
+msgid "BoardNewIssue|Select a project"
+msgstr ""
+
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
+msgid "BoardScope|An error occurred while getting milestones, please try again."
+msgstr ""
+
+msgid "BoardScope|An error occurred while searching for labels, please try again."
+msgstr ""
+
+msgid "BoardScope|An error occurred while searching for users, please try again."
+msgstr ""
+
+msgid "BoardScope|Any Milestone"
+msgstr ""
+
+msgid "BoardScope|Any assignee"
+msgstr ""
+
+msgid "BoardScope|Any iteration"
+msgstr ""
+
+msgid "BoardScope|Any label"
+msgstr ""
+
+msgid "BoardScope|Assignee"
+msgstr ""
+
+msgid "BoardScope|Choose labels"
+msgstr ""
+
+msgid "BoardScope|Current iteration"
+msgstr ""
+
+msgid "BoardScope|Edit"
+msgstr ""
+
+msgid "BoardScope|Iteration"
+msgstr ""
+
+msgid "BoardScope|Labels"
+msgstr ""
+
+msgid "BoardScope|Milestone"
+msgstr ""
+
+msgid "BoardScope|No iteration"
+msgstr ""
+
+msgid "BoardScope|No milestone"
+msgstr ""
+
+msgid "BoardScope|Search iterations"
+msgstr ""
+
+msgid "BoardScope|Search milestones"
+msgstr ""
+
+msgid "BoardScope|Select assignee"
+msgstr ""
+
+msgid "BoardScope|Select iteration"
+msgstr ""
+
+msgid "BoardScope|Select labels"
+msgstr ""
+
+msgid "BoardScope|Select milestone"
+msgstr ""
+
+msgid "BoardScope|Select weight"
+msgstr ""
+
+msgid "BoardScope|Started"
+msgstr ""
+
+msgid "BoardScope|Upcoming"
+msgstr ""
+
+msgid "BoardScope|Weight"
+msgstr ""
+
+msgid "Boards"
+msgstr ""
+
+msgid "Boards and board lists"
+msgstr ""
+
+msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
+msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while creating the issue. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while creating the list. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching group projects. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching issues. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching labels. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching the board epics. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching the board issues. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching the board lists. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while generating lists. Please reload the page."
+msgstr ""
+
+msgid "Boards|An error occurred while moving the epic. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while moving the issue. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while removing the list. Please try again."
+msgstr ""
+
+msgid "Boards|An error occurred while updating the board list. Please try again."
+msgstr ""
+
+msgid "Boards|Blocked by %{blockedByCount} %{issuableType}"
+msgid_plural "Boards|Blocked by %{blockedByCount} %{issuableType}s"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Boards|Collapse"
+msgstr ""
+
+msgid "Boards|Edit board"
+msgstr ""
+
+msgid "Boards|Expand"
+msgstr ""
+
+msgid "Boards|Failed to fetch blocking %{issuableType}s"
+msgstr ""
+
+msgid "Boards|New board"
+msgstr ""
+
+msgid "Boards|New epic"
+msgstr ""
+
+msgid "Boards|Retrieving blocking %{issuableType}s"
+msgstr ""
+
+msgid "Boards|View all blocking %{issuableType}s"
+msgstr ""
+
+msgid "Boards|View scope"
+msgstr ""
+
+msgid "Board|An error occurred while fetching the board, please try again."
+msgstr ""
+
+msgid "Board|Are you sure you want to delete this board?"
+msgstr ""
+
+msgid "Board|Board scope"
+msgstr ""
+
+msgid "Board|Create board"
+msgstr ""
+
+msgid "Board|Create new board"
+msgstr ""
+
+msgid "Board|Delete board"
+msgstr ""
+
+msgid "Board|Edit board"
+msgstr ""
+
+msgid "Board|Enter board name"
+msgstr ""
+
+msgid "Board|Failed to delete board. Please try again."
+msgstr ""
+
+msgid "Board|Load more epics"
+msgstr ""
+
+msgid "Board|Load more issues"
+msgstr ""
+
+msgid "Board|Loading epics"
+msgstr ""
+
+msgid "Bold text"
+msgstr ""
+
+msgid "Both project and dashboard_path are required"
+msgstr ""
+
+msgid "Branch"
+msgstr ""
+
+msgid "Branch %{branchName} was not found in this project's repository."
+msgstr ""
+
+msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
+msgstr ""
+
+msgid "Branch already exists"
+msgstr ""
+
+msgid "Branch changed"
+msgstr ""
+
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
+msgid "Branch is already taken"
+msgstr ""
+
+msgid "Branch name"
+msgstr ""
+
+msgid "Branch not loaded - %{branchId}"
+msgstr ""
+
+msgid "Branches"
+msgstr ""
+
+msgid "Branches|Active"
+msgstr ""
+
+msgid "Branches|Active branches"
+msgstr ""
+
+msgid "Branches|All"
+msgstr ""
+
+msgid "Branches|Cancel, keep branch"
+msgstr ""
+
+msgid "Branches|Can’t find HEAD commit for this branch"
+msgstr ""
+
+msgid "Branches|Compare"
+msgstr ""
+
+msgid "Branches|Delete all branches that are merged into '%{default_branch}'"
+msgstr ""
+
+msgid "Branches|Delete branch"
+msgstr ""
+
+msgid "Branches|Delete branch. Are you ABSOLUTELY SURE?"
+msgstr ""
+
+msgid "Branches|Delete merged branches"
+msgstr ""
+
+msgid "Branches|Delete protected branch"
+msgstr ""
+
+msgid "Branches|Delete protected branch. Are you ABSOLUTELY SURE?"
+msgstr ""
+
+msgid "Branches|Deleting the %{strongStart}%{branchName}%{strongEnd} branch cannot be undone. Are you sure?"
+msgstr ""
+
+msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?"
+msgstr ""
+
+msgid "Branches|Filter by branch name"
+msgstr ""
+
+msgid "Branches|Merged into %{default_branch}"
+msgstr ""
+
+msgid "Branches|New branch"
+msgstr ""
+
+msgid "Branches|No branches to show"
+msgstr ""
+
+msgid "Branches|Once you confirm and press %{strongStart}%{buttonText},%{strongEnd} it cannot be undone or recovered."
+msgstr ""
+
+msgid "Branches|Only a project maintainer or owner can delete a protected branch"
+msgstr ""
+
+msgid "Branches|Overview"
+msgstr ""
+
+msgid "Branches|Please type the following to confirm:"
+msgstr ""
+
+msgid "Branches|Protected branches can be managed in %{project_settings_link}."
+msgstr ""
+
+msgid "Branches|Show active branches"
+msgstr ""
+
+msgid "Branches|Show all branches"
+msgstr ""
+
+msgid "Branches|Show more active branches"
+msgstr ""
+
+msgid "Branches|Show more stale branches"
+msgstr ""
+
+msgid "Branches|Show overview of the branches"
+msgstr ""
+
+msgid "Branches|Show stale branches"
+msgstr ""
+
+msgid "Branches|Stale"
+msgstr ""
+
+msgid "Branches|Stale branches"
+msgstr ""
+
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
+msgid "Branches|The default branch cannot be deleted"
+msgstr ""
+
+msgid "Branches|This branch hasn’t been merged into %{defaultBranchName}. To avoid data loss, consider merging this branch before deleting it."
+msgstr ""
+
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
+msgid "Branches|Unable to load branches"
+msgstr ""
+
+msgid "Branches|Yes, delete branch"
+msgstr ""
+
+msgid "Branches|Yes, delete protected branch"
+msgstr ""
+
+msgid "Branches|You're about to permanently delete the branch %{strongStart}%{branchName}.%{strongEnd}"
+msgstr ""
+
+msgid "Branches|You're about to permanently delete the protected branch %{strongStart}%{branchName}.%{strongEnd}"
+msgstr ""
+
+msgid "Branches|diverged from upstream"
+msgstr ""
+
+msgid "Branches|merged"
+msgstr ""
+
+msgid "Branches|project settings"
+msgstr ""
+
+msgid "Branches|protected"
+msgstr ""
+
+msgid "Breadcrumbs"
+msgstr ""
+
+msgid "Brief title about the change"
+msgstr ""
+
+msgid "Broadcast Message was successfully created."
+msgstr ""
+
+msgid "Broadcast Message was successfully updated."
+msgstr ""
+
+msgid "Broadcast Messages"
+msgstr ""
+
+msgid "Browse Directory"
+msgstr ""
+
+msgid "Browse File"
+msgstr ""
+
+msgid "Browse Files"
+msgstr ""
+
+msgid "Browse artifacts"
+msgstr ""
+
+msgid "Browse files"
+msgstr ""
+
+msgid "Browse templates"
+msgstr ""
+
+msgid "BuildArtifacts|An error occurred while fetching the artifacts"
+msgstr ""
+
+msgid "BuildArtifacts|Loading artifacts"
+msgstr ""
+
+msgid "Built-in"
+msgstr ""
+
+msgid "Bulk request concurrency"
+msgstr ""
+
+msgid "Bulk update"
+msgstr ""
+
+msgid "BulkImport| %{host} is running outdated GitLab version (v%{version})"
+msgstr ""
+
+msgid "BulkImport|%{feature} (require v%{version})"
+msgstr ""
+
+msgid "BulkImport|Destination"
+msgstr ""
+
+msgid "BulkImport|Existing groups"
+msgstr ""
+
+msgid "BulkImport|Filter by source group"
+msgstr ""
+
+msgid "BulkImport|Following data will not be migrated: %{bullets} Contact system administrator of %{host} to upgrade GitLab if you need this data in your migration"
+msgstr ""
+
+msgid "BulkImport|From source group"
+msgstr ""
+
+msgid "BulkImport|Group import history"
+msgstr ""
+
+msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
+msgstr ""
+
+msgid "BulkImport|Import groups from GitLab"
+msgstr ""
+
+msgid "BulkImport|Import is finished. Pick another name for re-import"
+msgstr ""
+
+msgid "BulkImport|Import selected"
+msgstr ""
+
+msgid "BulkImport|Importing the group failed."
+msgstr ""
+
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
+msgid "BulkImport|Name already exists."
+msgstr ""
+
+msgid "BulkImport|Name already used as a target for another group."
+msgstr ""
+
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
+msgid "BulkImport|No parent"
+msgstr ""
+
+msgid "BulkImport|Project import history"
+msgstr ""
+
+msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total}"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
+msgstr ""
+
+msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
+msgstr ""
+
+msgid "BulkImport|Source"
+msgstr ""
+
+msgid "BulkImport|Source group"
+msgstr ""
+
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
+msgid "BulkImport|To new group"
+msgstr ""
+
+msgid "BulkImport|Update of import statuses with realtime changes failed"
+msgstr ""
+
+msgid "BulkImport|You have no groups to import"
+msgstr ""
+
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
+msgid "BulkImport|expected an associated Group but has an associated Project"
+msgstr ""
+
+msgid "BulkImport|expected an associated Project but has an associated Group"
+msgstr ""
+
+msgid "BulkImport|must be a group"
+msgstr ""
+
+msgid "Burndown chart"
+msgstr ""
+
+msgid "BurndownChartLabel|Open issue weight"
+msgstr ""
+
+msgid "BurndownChartLabel|Open issues"
+msgstr ""
+
+msgid "Burnup chart"
+msgstr ""
+
+msgid "Burnup chart could not be generated due to too many events"
+msgstr ""
+
+msgid "Business"
+msgstr ""
+
+msgid "Business metrics (Custom)"
+msgstr ""
+
+msgid "Busy"
+msgstr ""
+
+msgid "Buy CI Minutes"
+msgstr ""
+
+msgid "Buy Storage"
+msgstr ""
+
+msgid "Buy more Pipeline minutes"
+msgstr ""
+
+msgid "By %{user_name}"
+msgstr ""
+
+msgid "By authenticating with an account tied to an Enterprise e-mail address, it is understood that this account is an Enterprise User. "
+msgstr ""
+
+msgid "By default, all projects and groups will use the global notifications setting."
+msgstr ""
+
+msgid "By month"
+msgstr ""
+
+msgid "By quarter"
+msgstr ""
+
+msgid "By week"
+msgstr ""
+
+msgid "ByAuthor|by"
+msgstr ""
+
+msgid "CHANGELOG"
+msgstr ""
+
+msgid "CI Lint"
+msgstr ""
+
+msgid "CI configuration validated, including all configuration added with the %{codeStart}includes%{codeEnd} keyword. %{link}"
+msgstr ""
+
+msgid "CI settings"
+msgstr ""
+
+msgid "CI variables"
+msgstr ""
+
+msgid "CI will run using the credentials assigned above."
+msgstr ""
+
+msgid "CI/CD"
+msgstr ""
+
+msgid "CI/CD Analytics"
+msgstr ""
+
+msgid "CI/CD Settings"
+msgstr ""
+
+msgid "CI/CD configuration"
+msgstr ""
+
+msgid "CI/CD configuration file"
+msgstr ""
+
+msgid "CI/CD|No projects have been added to the scope"
+msgstr ""
+
+msgid "CICDAnalytics|%{percent}%{percentSymbol}"
+msgstr ""
+
+msgid "CICDAnalytics|All time"
+msgstr ""
+
+msgid "CICDAnalytics|Deployment frequency"
+msgstr ""
+
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
+msgid "CICDAnalytics|Projects with releases"
+msgstr ""
+
+msgid "CICDAnalytics|Release"
+msgid_plural "CICDAnalytics|Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CICDAnalytics|Release statistics"
+msgstr ""
+
+msgid "CICDAnalytics|Releases"
+msgstr ""
+
+msgid "CICDAnalytics|Shared Runners Usage"
+msgstr ""
+
+msgid "CICDAnalytics|Shared runner pipeline minute duration by month"
+msgstr ""
+
+msgid "CICDAnalytics|Shared runner usage"
+msgstr ""
+
+msgid "CICDAnalytics|Shared runner usage is the total runtime of all jobs that ran on shared runners"
+msgstr ""
+
+msgid "CICDAnalytics|Something went wrong while fetching release statistics"
+msgstr ""
+
+msgid "CICDAnalytics|What is shared runner usage?"
+msgstr ""
+
+msgid "CICD|Add a %{base_domain_link_start}base domain%{link_end} to your %{kubernetes_cluster_link_start}Kubernetes cluster%{link_end} for your deployment strategy to work."
+msgstr ""
+
+msgid "CICD|Add a %{kubernetes_cluster_link_start}Kubernetes cluster integration%{link_end} with a domain, or create an AUTO_DEVOPS_PLATFORM_TARGET CI variable."
+msgstr ""
+
+msgid "CICD|Add an existing project to the scope"
+msgstr ""
+
+msgid "CICD|Auto DevOps"
+msgstr ""
+
+msgid "CICD|Automatic deployment to staging, manual deployment to production"
+msgstr ""
+
+msgid "CICD|Continuous deployment to production"
+msgstr ""
+
+msgid "CICD|Continuous deployment to production using timed incremental rollout"
+msgstr ""
+
+msgid "CICD|Default to Auto DevOps pipeline"
+msgstr ""
+
+msgid "CICD|Default to Auto DevOps pipeline for all projects"
+msgstr ""
+
+msgid "CICD|Deployment strategy"
+msgstr ""
+
+msgid "CICD|Jobs"
+msgstr ""
+
+msgid "CICD|Limit CI_JOB_TOKEN access"
+msgstr ""
+
+msgid "CICD|Select projects that can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable."
+msgstr ""
+
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
+msgstr ""
+
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
+
+msgid "CICD|group enabled"
+msgstr ""
+
+msgid "CICD|instance enabled"
+msgstr ""
+
+msgid "CLOSED"
+msgstr ""
+
+msgid "CLOSED (MOVED)"
+msgstr ""
+
+msgid "CODEOWNERS rule violation"
+msgstr ""
+
+msgid "CONTRIBUTING"
+msgstr ""
+
+msgid "CPU"
+msgstr ""
+
+msgid "CSV is being generated and will be emailed to you upon completion."
+msgstr ""
+
+msgid "CVE|As a maintainer, requesting a CVE for a vulnerability in your project will help your users stay secure and informed."
+msgstr ""
+
+msgid "CVE|CVE ID Request"
+msgstr ""
+
+msgid "CVE|Common Vulnerability Enumeration (CVE) identifiers are used to track distinct vulnerabilities in specific versions of code."
+msgstr ""
+
+msgid "CVE|Create CVE ID Request"
+msgstr ""
+
+msgid "CVE|Enable CVE ID requests in the issue sidebar"
+msgstr ""
+
+msgid "CVE|Request CVE ID"
+msgstr ""
+
+msgid "CVE|Why Request a CVE ID?"
+msgstr ""
+
+msgid "Cadence is not automated"
+msgstr ""
+
+msgid "Calculate the number of slices during reindexing. The multiplier is applied to the number of shards per index. Learn more about %{slice_multiplier_link_start}slice multiplier configuration%{slice_multiplier_link_end}."
+msgstr ""
+
+msgid "Callback URL"
+msgstr ""
+
+msgid "Campfire room ID (optional)"
+msgstr ""
+
+msgid "Campfire subdomain (optional)"
+msgstr ""
+
+msgid "Campfire token"
+msgstr ""
+
+msgid "CampfireService|API authentication token from Campfire."
+msgstr ""
+
+msgid "CampfireService|From the end of the room URL."
+msgstr ""
+
+msgid "CampfireService|Send notifications about push events to Campfire chat rooms. %{docs_link}"
+msgstr ""
+
+msgid "CampfireService|The %{code_open}.campfirenow.com%{code_close} subdomain."
+msgstr ""
+
+msgid "Can be manually deployed to"
+msgstr ""
+
+msgid "Can be overridden in each project."
+msgstr ""
+
+msgid "Can create groups:"
+msgstr ""
+
+msgid "Can not delete primary training"
+msgstr ""
+
+msgid "Can't apply as the source branch was deleted."
+msgstr ""
+
+msgid "Can't apply as these lines were changed in a more recent version."
+msgstr ""
+
+msgid "Can't apply as this line was changed in a more recent version."
+msgstr ""
+
+msgid "Can't apply this suggestion."
+msgstr ""
+
+msgid "Can't be empty"
+msgstr ""
+
+msgid "Can't create snippet: %{err}"
+msgstr ""
+
+msgid "Can't fetch content for the blob: %{err}"
+msgstr ""
+
+msgid "Can't find HEAD commit for this branch"
+msgstr ""
+
+msgid "Can't find variable: ZiteReader"
+msgstr ""
+
+msgid "Can't load mermaid module: %{err}"
+msgstr ""
+
+msgid "Can't scan the code?"
+msgstr ""
+
+msgid "Can't update snippet: %{err}"
+msgstr ""
+
+msgid "Canary"
+msgstr ""
+
+msgid "Canary Ingress does not exist in the environment."
+msgstr ""
+
+msgid "Canary weight must be specified and valid range (0..100)."
+msgstr ""
+
+msgid "CanaryIngress|%{boldStart}Canary:%{boldEnd} %{canary}"
+msgstr ""
+
+msgid "CanaryIngress|%{boldStart}Stable:%{boldEnd} %{stable}"
+msgstr ""
+
+msgid "CanaryIngress|Canary"
+msgstr ""
+
+msgid "CanaryIngress|Change ratio"
+msgstr ""
+
+msgid "CanaryIngress|Change the ratio of canary deployments?"
+msgstr ""
+
+msgid "CanaryIngress|Doing so will set a deployment change in progress. This temporarily blocks any further configuration until the deployment is finished."
+msgstr ""
+
+msgid "CanaryIngress|Stable"
+msgstr ""
+
+msgid "CanaryIngress|You are changing the ratio of the canary rollout for %{environment} compared to the stable deployment to:"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Cancel and close"
+msgstr ""
+
+msgid "Cancel index deletion"
+msgstr ""
+
+msgid "Cancel running"
+msgstr ""
+
+msgid "Cancel this job"
+msgstr ""
+
+msgid "Cancel your account"
+msgstr ""
+
+msgid "Cancel, keep project"
+msgstr ""
+
+msgid "Canceled deployment to"
+msgstr ""
+
+msgid "Cancelled"
+msgstr ""
+
+msgid "Cancelling Preview"
+msgstr ""
+
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
+msgid "Cannot be merged automatically"
+msgstr ""
+
+msgid "Cannot create the abuse report. The reported user was invalid. Please try again or contact support."
+msgstr ""
+
+msgid "Cannot create the abuse report. The user has been deleted."
+msgstr ""
+
+msgid "Cannot create the abuse report. This user has been blocked."
+msgstr ""
+
+msgid "Cannot delete %{profile_name} referenced in security policy"
+msgstr ""
+
+msgid "Cannot have multiple Jira imports running at the same time"
+msgstr ""
+
+msgid "Cannot have multiple unresolved alerts"
+msgstr ""
+
+msgid "Cannot import because issues are not available in this project."
+msgstr ""
+
+msgid "Cannot make the epic confidential if it contains non-confidential child epics"
+msgstr ""
+
+msgid "Cannot make the epic confidential if it contains non-confidential issues"
+msgstr ""
+
+msgid "Cannot merge"
+msgstr ""
+
+msgid "Cannot modify %{profile_name} referenced in security policy"
+msgstr ""
+
+msgid "Cannot modify managed Kubernetes cluster"
+msgstr ""
+
+msgid "Cannot modify provider during creation"
+msgstr ""
+
+msgid "Cannot promote issue because it does not belong to a group."
+msgstr ""
+
+msgid "Cannot promote issue due to insufficient permissions."
+msgstr ""
+
+msgid "Cannot refer to a group %{timebox_type} by an internal id!"
+msgstr ""
+
+msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
+msgstr ""
+
+msgid "Cannot skip two factor authentication setup"
+msgstr ""
+
+msgid "Capacity threshold"
+msgstr ""
+
+msgid "Card holder name"
+msgstr ""
+
+msgid "Card number:"
+msgstr ""
+
+msgid "CascadingSettings|Enforce for all subgroups"
+msgstr ""
+
+msgid "CascadingSettings|Setting enforced"
+msgstr ""
+
+msgid "CascadingSettings|Subgroups cannot change this setting."
+msgstr ""
+
+msgid "CascadingSettings|This setting has been enforced by an instance admin."
+msgstr ""
+
+msgid "CascadingSettings|This setting has been enforced by an owner of %{link}."
+msgstr ""
+
+msgid "CascadingSettings|cannot be changed because it is locked by an ancestor"
+msgstr ""
+
+msgid "CascadingSettings|cannot be nil when locking the attribute"
+msgstr ""
+
+msgid "Certain user content will be moved to a system-wide \"Ghost User\" in order to maintain content for posterity. For further information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
+msgstr ""
+
+msgid "Certificate"
+msgstr ""
+
+msgid "Certificate (PEM)"
+msgstr ""
+
+msgid "Certificate Issuer"
+msgstr ""
+
+msgid "Certificate Subject"
+msgstr ""
+
+msgid "Change assignee"
+msgstr ""
+
+msgid "Change assignee(s)"
+msgstr ""
+
+msgid "Change assignee(s)."
+msgstr ""
+
+msgid "Change branches"
+msgstr ""
+
+msgid "Change label"
+msgstr ""
+
+msgid "Change made by"
+msgstr ""
+
+msgid "Change milestone"
+msgstr ""
+
+msgid "Change path"
+msgstr ""
+
+msgid "Change reviewer(s)"
+msgstr ""
+
+msgid "Change reviewer(s)."
+msgstr ""
+
+msgid "Change role"
+msgstr ""
+
+msgid "Change status"
+msgstr ""
+
+msgid "Change subscription"
+msgstr ""
+
+msgid "Change template"
+msgstr ""
+
+msgid "Change title"
+msgstr ""
+
+msgid "Change your password"
+msgstr ""
+
+msgid "Change your password or recover your current one"
+msgstr ""
+
+msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
+msgstr ""
+
+msgid "ChangeReviewer|Reviewer changed to %{new}"
+msgstr ""
+
+msgid "ChangeReviewer|Unassigned"
+msgstr ""
+
+msgid "ChangeTypeAction|Cherry-pick"
+msgstr ""
+
+msgid "ChangeTypeAction|GitLab will create a branch in your fork and start a merge request."
+msgstr ""
+
+msgid "ChangeTypeAction|Pick into branch"
+msgstr ""
+
+msgid "ChangeTypeAction|Pick into project"
+msgstr ""
+
+msgid "ChangeTypeAction|Revert"
+msgstr ""
+
+msgid "ChangeTypeAction|Revert in branch"
+msgstr ""
+
+msgid "ChangeTypeAction|Search branches"
+msgstr ""
+
+msgid "ChangeTypeAction|Search projects"
+msgstr ""
+
+msgid "ChangeTypeAction|Start a %{newMergeRequest} with these changes"
+msgstr ""
+
+msgid "ChangeTypeAction|Switch branch"
+msgstr ""
+
+msgid "ChangeTypeAction|Switch project"
+msgstr ""
+
+msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
+msgstr ""
+
+msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
+msgstr ""
+
+msgid "Changed"
+msgstr ""
+
+msgid "Changed assignee(s)."
+msgstr ""
+
+msgid "Changed reviewer(s)."
+msgstr ""
+
+msgid "Changed the title to \"%{title_param}\"."
+msgstr ""
+
+msgid "Changes"
+msgstr ""
+
+msgid "Changes are shown as if the %{b_open}source%{b_close} revision was being merged into the %{b_open}target%{b_close} revision."
+msgstr ""
+
+msgid "Changes saved."
+msgstr ""
+
+msgid "Changes suppressed. Click to show."
+msgstr ""
+
+msgid "Changes the title to \"%{title_param}\"."
+msgstr ""
+
+msgid "Changes to the title have not been saved"
+msgstr ""
+
+msgid "Changing any setting here requires an application restart"
+msgstr ""
+
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
+msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
+msgstr ""
+
+msgid "Chat"
+msgstr ""
+
+msgid "ChatMessage|%{project_link}: Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status} in %{duration}"
+msgstr ""
+
+msgid "ChatMessage|Branch"
+msgstr ""
+
+msgid "ChatMessage|Commit"
+msgstr ""
+
+msgid "ChatMessage|Failed job"
+msgstr ""
+
+msgid "ChatMessage|Failed stage"
+msgstr ""
+
+msgid "ChatMessage|Invalid CI config YAML file"
+msgstr ""
+
+msgid "ChatMessage|Pipeline #%{pipeline_id} %{humanized_status} in %{duration}"
+msgstr ""
+
+msgid "ChatMessage|Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status}"
+msgstr ""
+
+msgid "ChatMessage|Tag"
+msgstr ""
+
+msgid "ChatMessage|and [%{count} more](%{pipeline_failed_jobs_url})"
+msgstr ""
+
+msgid "ChatMessage|has failed"
+msgstr ""
+
+msgid "ChatMessage|has passed"
+msgstr ""
+
+msgid "ChatMessage|has passed with warnings"
+msgstr ""
+
+msgid "ChatMessage|in %{duration}"
+msgstr ""
+
+msgid "ChatMessage|in %{project_link}"
+msgstr ""
+
+msgid "Check again"
+msgstr ""
+
+msgid "Check feature availability on namespace plan"
+msgstr ""
+
+msgid "Check out, review, and merge locally"
+msgstr ""
+
+msgid "Check the %{code_open}elasticsearch.log%{code_close} file to debug why the migration halted and make any changes before retrying the migration. When you fix the cause of the failure, select %{strong_open}Retry migration%{strong_close}, and the migration is scheduled to retry in the background."
+msgstr ""
+
+msgid "Check the current instance configuration "
+msgstr ""
+
+msgid "Check with your administrator."
+msgstr ""
+
+msgid "Check your Docker images for known vulnerabilities."
+msgstr ""
+
+msgid "Check your Kubernetes cluster images for known vulnerabilities."
+msgstr ""
+
+msgid "Check your source instance permissions."
+msgstr ""
+
+msgid "Checking %{text} availability…"
+msgstr ""
+
+msgid "Checking approval status"
+msgstr ""
+
+msgid "Checking branch availability..."
+msgstr ""
+
+msgid "Checking group path availability..."
+msgstr ""
+
+msgid "Checking username availability..."
+msgstr ""
+
+msgid "Checkout"
+msgstr ""
+
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
+msgstr ""
+
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
+msgstr ""
+
+msgid "Checkout|$%{selectedPlanPrice} per user per year"
+msgstr ""
+
+msgid "Checkout|%d CI minute pack"
+msgid_plural "Checkout|%d CI minute packs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
+msgstr ""
+
+msgid "Checkout|%{name}'s CI minutes"
+msgstr ""
+
+msgid "Checkout|%{name}'s GitLab subscription"
+msgstr ""
+
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
+
+msgid "Checkout|%{quantity} CI minutes"
+msgstr ""
+
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
+
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
+msgid "Checkout|(may be %{linkStart}charged upon purchase%{linkEnd})"
+msgstr ""
+
+msgid "Checkout|(x%{numberOfUsers})"
+msgstr ""
+
+msgid "Checkout|(x%{quantity})"
+msgstr ""
+
+msgid "Checkout|An unknown error has occurred. Please try again by refreshing this page."
+msgstr ""
+
+msgid "Checkout|Billing address"
+msgstr ""
+
+msgid "Checkout|CI minute pack"
+msgstr ""
+
+msgid "Checkout|CI minute packs are only used after you've used your subscription's monthly quota. The additional minutes will roll over month to month and are valid for one year."
+msgstr ""
+
+msgid "Checkout|CI minutes"
+msgstr ""
+
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
+msgid "Checkout|Checkout"
+msgstr ""
+
+msgid "Checkout|City"
+msgstr ""
+
+msgid "Checkout|Confirm purchase"
+msgstr ""
+
+msgid "Checkout|Confirming..."
+msgstr ""
+
+msgid "Checkout|Continue to billing"
+msgstr ""
+
+msgid "Checkout|Continue to payment"
+msgstr ""
+
+msgid "Checkout|Country"
+msgstr ""
+
+msgid "Checkout|Create a new group"
+msgstr ""
+
+msgid "Checkout|Credit card form failed to load. Please try again."
+msgstr ""
+
+msgid "Checkout|Credit card form failed to load: %{message}"
+msgstr ""
+
+msgid "Checkout|Edit"
+msgstr ""
+
+msgid "Checkout|Enter a number greater than 0"
+msgstr ""
+
+msgid "Checkout|Exp %{expirationMonth}/%{expirationYear}"
+msgstr ""
+
+msgid "Checkout|Failed to confirm your order! Please try again."
+msgstr ""
+
+msgid "Checkout|Failed to confirm your order: %{message}. Please try again."
+msgstr ""
+
+msgid "Checkout|Failed to load countries. Please try again."
+msgstr ""
+
+msgid "Checkout|Failed to load states. Please try again."
+msgstr ""
+
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
+msgid "Checkout|Failed to register credit card. Please try again."
+msgstr ""
+
+msgid "Checkout|GB"
+msgstr ""
+
+msgid "Checkout|GitLab group"
+msgstr ""
+
+msgid "Checkout|GitLab plan"
+msgstr ""
+
+msgid "Checkout|Group"
+msgstr ""
+
+msgid "Checkout|Name of company or organization using GitLab"
+msgstr ""
+
+msgid "Checkout|Need more users? Purchase GitLab for your %{company}."
+msgstr ""
+
+msgid "Checkout|Number of users"
+msgstr ""
+
+msgid "Checkout|Payment method"
+msgstr ""
+
+msgid "Checkout|Please select a country"
+msgstr ""
+
+msgid "Checkout|Please select a state"
+msgstr ""
+
+msgid "Checkout|Purchase details"
+msgstr ""
+
+msgid "Checkout|Select"
+msgstr ""
+
+msgid "Checkout|State"
+msgstr ""
+
+msgid "Checkout|Storage packs"
+msgstr ""
+
+msgid "Checkout|Street address"
+msgstr ""
+
+msgid "Checkout|Submitting the credit card form failed with code %{errorCode}: %{errorMessage}"
+msgstr ""
+
+msgid "Checkout|Subscription details"
+msgstr ""
+
+msgid "Checkout|Subtotal"
+msgstr ""
+
+msgid "Checkout|Tax"
+msgstr ""
+
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
+msgid "Checkout|Total"
+msgstr ""
+
+msgid "Checkout|Total minutes: %{quantity}"
+msgstr ""
+
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
+msgid "Checkout|Users"
+msgstr ""
+
+msgid "Checkout|You'll create your new group after checkout"
+msgstr ""
+
+msgid "Checkout|Your organization"
+msgstr ""
+
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
+msgid "Checkout|Your subscription will be applied to this group"
+msgstr ""
+
+msgid "Checkout|Zip code"
+msgstr ""
+
+msgid "Checkout|a storage subscription"
+msgstr ""
+
+msgid "Checkout|company or team"
+msgstr ""
+
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
+msgstr ""
+
+msgid "Cherry-pick this commit"
+msgstr ""
+
+msgid "Cherry-pick this merge request"
+msgstr ""
+
+msgid "Child"
+msgstr ""
+
+msgid "Child epic"
+msgstr ""
+
+msgid "Child epic does not exist."
+msgstr ""
+
+msgid "Child epic doesn't exist."
+msgstr ""
+
+msgid "Chinese language support using"
+msgstr ""
+
+msgid "Choose File..."
+msgstr ""
+
+msgid "Choose a file"
+msgstr ""
+
+msgid "Choose a group"
+msgstr ""
+
+msgid "Choose a template"
+msgstr ""
+
+msgid "Choose a template..."
+msgstr ""
+
+msgid "Choose a type..."
+msgstr ""
+
+msgid "Choose any color."
+msgstr ""
+
+msgid "Choose file…"
+msgstr ""
+
+msgid "Choose specific groups or storage shards"
+msgstr ""
+
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose visibility level, enable/disable project features and their permissions, disable email notifications, and show default award emoji."
+msgstr ""
+
+msgid "Choose what content you want to see on a group’s overview page."
+msgstr ""
+
+msgid "Choose which Git strategy to use when fetching the project."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
+msgid "Choose your framework"
+msgstr ""
+
+msgid "CiCdAnalytics|Date range: %{range}"
+msgstr ""
+
+msgid "CiStatusLabel|canceled"
+msgstr ""
+
+msgid "CiStatusLabel|created"
+msgstr ""
+
+msgid "CiStatusLabel|delayed"
+msgstr ""
+
+msgid "CiStatusLabel|failed"
+msgstr ""
+
+msgid "CiStatusLabel|manual action"
+msgstr ""
+
+msgid "CiStatusLabel|passed"
+msgstr ""
+
+msgid "CiStatusLabel|passed with warnings"
+msgstr ""
+
+msgid "CiStatusLabel|pending"
+msgstr ""
+
+msgid "CiStatusLabel|preparing"
+msgstr ""
+
+msgid "CiStatusLabel|skipped"
+msgstr ""
+
+msgid "CiStatusLabel|waiting for delayed job"
+msgstr ""
+
+msgid "CiStatusLabel|waiting for manual action"
+msgstr ""
+
+msgid "CiStatusLabel|waiting for resource"
+msgstr ""
+
+msgid "CiStatusText|blocked"
+msgstr ""
+
+msgid "CiStatusText|canceled"
+msgstr ""
+
+msgid "CiStatusText|created"
+msgstr ""
+
+msgid "CiStatusText|delayed"
+msgstr ""
+
+msgid "CiStatusText|failed"
+msgstr ""
+
+msgid "CiStatusText|manual"
+msgstr ""
+
+msgid "CiStatusText|passed"
+msgstr ""
+
+msgid "CiStatusText|pending"
+msgstr ""
+
+msgid "CiStatusText|preparing"
+msgstr ""
+
+msgid "CiStatusText|skipped"
+msgstr ""
+
+msgid "CiStatusText|waiting"
+msgstr ""
+
+msgid "CiStatus|running"
+msgstr ""
+
+msgid "CiVariables|Cannot use Masked Variable with current value"
+msgstr ""
+
+msgid "CiVariables|Environments"
+msgstr ""
+
+msgid "CiVariables|Input variable key"
+msgstr ""
+
+msgid "CiVariables|Input variable value"
+msgstr ""
+
+msgid "CiVariables|Key"
+msgstr ""
+
+msgid "CiVariables|Masked"
+msgstr ""
+
+msgid "CiVariables|Protected"
+msgstr ""
+
+msgid "CiVariables|Remove variable"
+msgstr ""
+
+msgid "CiVariables|Remove variable row"
+msgstr ""
+
+msgid "CiVariables|Scope"
+msgstr ""
+
+msgid "CiVariables|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used as default"
+msgstr ""
+
+msgid "CiVariables|State"
+msgstr ""
+
+msgid "CiVariables|Type"
+msgstr ""
+
+msgid "CiVariables|Value"
+msgstr ""
+
+msgid "CiVariables|Variables"
+msgstr ""
+
+msgid "CiVariable|* (All environments)"
+msgstr ""
+
+msgid "CiVariable|All environments"
+msgstr ""
+
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
+msgid "CiVariable|New environment"
+msgstr ""
+
+msgid "CiVariable|Search environments"
+msgstr ""
+
+msgid "Classification Label (optional)"
+msgstr ""
+
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
+msgid "Clean up after running %{link_start}git filter-repo%{link_end} on the repository."
+msgstr ""
+
+msgid "Clean up image tags"
+msgstr ""
+
+msgid "Cleanup policies are executed by background workers. This setting defines the maximum number of workers that can run concurrently. Set it to 0 to remove all workers and not execute the cleanup policies."
+msgstr ""
+
+msgid "Cleanup policy maximum number of tags to be deleted"
+msgstr ""
+
+msgid "Cleanup policy maximum processing time (seconds)"
+msgstr ""
+
+msgid "Cleanup policy maximum workers running concurrently"
+msgstr ""
+
+msgid "Clear"
+msgstr ""
+
+msgid "Clear all repository checks"
+msgstr ""
+
+msgid "Clear chart filters"
+msgstr ""
+
+msgid "Clear due date"
+msgstr ""
+
+msgid "Clear health status"
+msgstr ""
+
+msgid "Clear recent searches"
+msgstr ""
+
+msgid "Clear repository checks"
+msgstr ""
+
+msgid "Clear search"
+msgstr ""
+
+msgid "Clear search input"
+msgstr ""
+
+msgid "Clear start date"
+msgstr ""
+
+msgid "Clear templates search input"
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
+msgid "Clear weight"
+msgstr ""
+
+msgid "Cleared health status."
+msgstr ""
+
+msgid "Cleared weight."
+msgstr ""
+
+msgid "Clears health status."
+msgstr ""
+
+msgid "Clears weight."
+msgstr ""
+
+msgid "Click %{link_start}here%{link_end} to view the request."
+msgstr ""
+
+msgid "Click %{link_to} to view the request."
+msgstr ""
+
+msgid "Click the link below to confirm your email address (%{email})"
+msgstr ""
+
+msgid "Click the link below to confirm your email address."
+msgstr ""
+
+msgid "Click to expand it."
+msgstr ""
+
+msgid "Click to expand text"
+msgstr ""
+
+msgid "Click to hide"
+msgstr ""
+
+msgid "Click to reveal"
+msgstr ""
+
+msgid "Client request timeout"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
+msgid "Clientside DSN"
+msgstr ""
+
+msgid "Clone"
+msgstr ""
+
+msgid "Clone repository"
+msgstr ""
+
+msgid "Clone this issue"
+msgstr ""
+
+msgid "Clone with %{http_label}"
+msgstr ""
+
+msgid "Clone with %{protocol}"
+msgstr ""
+
+msgid "Clone with KRB5"
+msgstr ""
+
+msgid "Clone with SSH"
+msgstr ""
+
+msgid "CloneIssue|Cannot clone issue due to insufficient permissions!"
+msgstr ""
+
+msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
+msgstr ""
+
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
+msgid "Cloned this issue to %{path_to_project}."
+msgstr ""
+
+msgid "Clones this issue, without comments, to %{project}."
+msgstr ""
+
+msgid "Close"
+msgstr ""
+
+msgid "Close %{issueType}"
+msgstr ""
+
+msgid "Close %{noteable}"
+msgstr ""
+
+msgid "Close %{tabname}"
+msgstr ""
+
+msgid "Close design"
+msgstr ""
+
+msgid "Close epic"
+msgstr ""
+
+msgid "Close milestone"
+msgstr ""
+
+msgid "Close sidebar"
+msgstr ""
+
+msgid "Close this %{quick_action_target}"
+msgstr ""
+
+msgid "Closed"
+msgstr ""
+
+msgid "Closed %{epicTimeagoDate}"
+msgstr ""
+
+msgid "Closed MRs"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
+msgid "Closed this %{quick_action_target}."
+msgstr ""
+
+msgid "Closed: %{closed}"
+msgstr ""
+
+msgid "Closes this %{quick_action_target}."
+msgstr ""
+
+msgid "Cloud Run"
+msgstr ""
+
+msgid "Cloud Storage"
+msgstr ""
+
+msgid "Cluster"
+msgstr ""
+
+msgid "Cluster Health"
+msgstr ""
+
+msgid "Cluster cache cleared."
+msgstr ""
+
+msgid "Cluster does not exist"
+msgstr ""
+
+msgid "Cluster is required for Stages::ClusterEndpointInserter"
+msgstr ""
+
+msgid "Cluster level"
+msgstr ""
+
+msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
+msgstr ""
+
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
+msgid "ClusterAgents|%{name} successfully deleted"
+msgstr ""
+
+msgid "ClusterAgents|%{number} of %{total} agents"
+msgstr ""
+
+msgid "ClusterAgents|%{number} of %{total} clusters connected through cluster certificates"
+msgstr ""
+
+msgid "ClusterAgents|%{titleIcon}Connected"
+msgstr ""
+
+msgid "ClusterAgents|%{titleIcon}Not connected"
+msgstr ""
+
+msgid "ClusterAgents|%{tokenName} created"
+msgstr ""
+
+msgid "ClusterAgents|%{tokenName} revoked"
+msgstr ""
+
+msgid "ClusterAgents|Access tokens"
+msgstr ""
+
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
+msgstr ""
+
+msgid "ClusterAgents|Advanced installation methods"
+msgstr ""
+
+msgid "ClusterAgents|Agent"
+msgstr ""
+
+msgid "ClusterAgents|Agent %{strongStart}connected%{strongEnd}"
+msgstr ""
+
+msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
+msgstr ""
+
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent version mismatch"
+msgstr ""
+
+msgid "ClusterAgents|Agent version mismatch and update"
+msgstr ""
+
+msgid "ClusterAgents|Agent version update required"
+msgstr ""
+
+msgid "ClusterAgents|All"
+msgstr ""
+
+msgid "ClusterAgents|An error occurred while loading your Agents"
+msgstr ""
+
+msgid "ClusterAgents|An error occurred while loading your agent"
+msgstr ""
+
+msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+msgstr ""
+
+msgid "ClusterAgents|An unknown error occurred. Please try again."
+msgstr ""
+
+msgid "ClusterAgents|Are you sure you want to delete this agent? You cannot undo this."
+msgstr ""
+
+msgid "ClusterAgents|Certificate"
+msgstr ""
+
+msgid "ClusterAgents|Configuration"
+msgstr ""
+
+msgid "ClusterAgents|Connect a Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster (agent)"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
+msgstr ""
+
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
+msgid "ClusterAgents|Copy token"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
+msgstr ""
+
+msgid "ClusterAgents|Created by"
+msgstr ""
+
+msgid "ClusterAgents|Created by %{name} %{time}"
+msgstr ""
+
+msgid "ClusterAgents|Date created"
+msgstr ""
+
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
+msgid "ClusterAgents|Delete"
+msgstr ""
+
+msgid "ClusterAgents|Delete agent"
+msgstr ""
+
+msgid "ClusterAgents|Deprecated"
+msgstr ""
+
+msgid "ClusterAgents|Description"
+msgstr ""
+
+msgid "ClusterAgents|Event occurred"
+msgstr ""
+
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
+msgid "ClusterAgents|Failed to register an agent"
+msgstr ""
+
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
+msgstr ""
+
+msgid "ClusterAgents|GitLab Agent"
+msgstr ""
+
+msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgstr ""
+
+msgid "ClusterAgents|Give feedback"
+msgstr ""
+
+msgid "ClusterAgents|How do I register an agent?"
+msgstr ""
+
+msgid "ClusterAgents|How to update an agent?"
+msgstr ""
+
+msgid "ClusterAgents|Install a new agent"
+msgstr ""
+
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
+msgstr ""
+
+msgid "ClusterAgents|Learn how to troubleshoot"
+msgstr ""
+
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
+msgid "ClusterAgents|Name"
+msgstr ""
+
+msgid "ClusterAgents|Never"
+msgstr ""
+
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|No agents"
+msgstr ""
+
+msgid "ClusterAgents|No clusters connected through cluster certificates"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
+msgid "ClusterAgents|Recommended"
+msgstr ""
+
+msgid "ClusterAgents|Recommended installation method"
+msgstr ""
+
+msgid "ClusterAgents|Register"
+msgstr ""
+
+msgid "ClusterAgents|Registering agent"
+msgstr ""
+
+msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
+msgstr ""
+
+msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgstr ""
+
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgstr ""
+
+msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgstr ""
+
+msgid "ClusterAgents|Security"
+msgstr ""
+
+msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+msgstr ""
+
+msgid "ClusterAgents|Select an agent or enter a name to create new"
+msgstr ""
+
+msgid "ClusterAgents|Tell us what you think"
+msgstr ""
+
+msgid "ClusterAgents|The GitLab Agent provides an increased level of security when connecting Kubernetes clusters to GitLab. %{linkStart}Learn more about the GitLab Agent.%{linkEnd}"
+msgstr ""
+
+msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
+msgstr ""
+
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgstr ""
+
+msgid "ClusterAgents|There's no activity from the past day"
+msgid_plural "ClusterAgents|There's no activity from the past %d days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ClusterAgents|This agent has no tokens"
+msgstr ""
+
+msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
+msgstr ""
+
+msgid "ClusterAgents|Token created by %{userName}"
+msgstr ""
+
+msgid "ClusterAgents|Token revoked by %{userName}"
+msgstr ""
+
+msgid "ClusterAgents|Unknown user"
+msgstr ""
+
+msgid "ClusterAgents|View all %{number} agents"
+msgstr ""
+
+msgid "ClusterAgents|View all %{number} clusters"
+msgstr ""
+
+msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
+msgstr ""
+
+msgid "ClusterAgents|What is GitLab Agent activity?"
+msgstr ""
+
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
+msgid "ClusterAgents|You cannot see this token again after you close this window."
+msgstr ""
+
+msgid "ClusterAgents|You will need to create a token to connect to your agent"
+msgstr ""
+
+msgid "ClusterAgents|Your agent version is out of sync with your GitLab version (v%{version}), which might cause compatibility problems. Update the agent installed on your cluster to the most recent version."
+msgstr ""
+
+msgid "ClusterAgents|Your instance doesn't have the %{linkStart}GitLab Agent Server (KAS)%{linkEnd} set up. Ask a GitLab Administrator to install it."
+msgstr ""
+
+msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
+msgstr ""
+
+msgid "ClusterAgent|You have insufficient permissions to create a cluster agent for this project"
+msgstr ""
+
+msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
+msgstr ""
+
+msgid "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 ""
+
+msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
+msgstr ""
+
+msgid "ClusterIntegration|A service token scoped to %{code}kube-system%{end_code} with %{code}cluster-admin%{end_code} privileges."
+msgstr ""
+
+msgid "ClusterIntegration|API URL"
+msgstr ""
+
+msgid "ClusterIntegration|API URL should be a valid http/https url."
+msgstr ""
+
+msgid "ClusterIntegration|Add Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Adding a Kubernetes cluster will automatically share the cluster across all projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Adding an integration to your group will share the cluster across all your projects."
+msgstr ""
+
+msgid "ClusterIntegration|Adding an integration will share the cluster across all projects."
+msgstr ""
+
+msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
+msgstr ""
+
+msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
+msgstr ""
+
+msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
+msgstr ""
+
+msgid "ClusterIntegration|Amazon EKS"
+msgstr ""
+
+msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
+msgstr ""
+
+msgid "ClusterIntegration|An error occurred while trying to fetch project zones: %{error}"
+msgstr ""
+
+msgid "ClusterIntegration|An error occurred while trying to fetch your projects: %{error}"
+msgstr ""
+
+msgid "ClusterIntegration|An error occurred while trying to fetch zone machine types: %{error}"
+msgstr ""
+
+msgid "ClusterIntegration|An unknown error occurred while attempting to connect to Kubernetes."
+msgstr ""
+
+msgid "ClusterIntegration|Any project namespaces"
+msgstr ""
+
+msgid "ClusterIntegration|Apply for credit"
+msgstr ""
+
+msgid "ClusterIntegration|Authenticate with AWS"
+msgstr ""
+
+msgid "ClusterIntegration|Authenticate with Amazon Web Services"
+msgstr ""
+
+msgid "ClusterIntegration|Authentication Error"
+msgstr ""
+
+msgid "ClusterIntegration|Base domain"
+msgstr ""
+
+msgid "ClusterIntegration|CA Certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
+msgstr ""
+
+msgid "ClusterIntegration|Check your CA certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Check your cluster status"
+msgstr ""
+
+msgid "ClusterIntegration|Check your token"
+msgstr ""
+
+msgid "ClusterIntegration|Choose the %{linkStart}security group%{linkEnd} to apply to the EKS-managed Elastic Network Interfaces that are created in your worker node subnets."
+msgstr ""
+
+msgid "ClusterIntegration|Choose the %{linkStart}subnets %{linkEnd} in your VPC where your worker nodes will run."
+msgstr ""
+
+msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Choose which of your environments will use this cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Clear cluster cache"
+msgstr ""
+
+msgid "ClusterIntegration|Clear the local cache of namespace and service accounts."
+msgstr ""
+
+msgid "ClusterIntegration|Cluster Region"
+msgstr ""
+
+msgid "ClusterIntegration|Cluster management project"
+msgstr ""
+
+msgid "ClusterIntegration|Cluster name is required."
+msgstr ""
+
+msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Connect with a certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Connection Error"
+msgstr ""
+
+msgid "ClusterIntegration|Copy API URL"
+msgstr ""
+
+msgid "ClusterIntegration|Copy CA Certificate"
+msgstr ""
+
+msgid "ClusterIntegration|Copy Kubernetes cluster name"
+msgstr ""
+
+msgid "ClusterIntegration|Could not load IAM roles"
+msgstr ""
+
+msgid "ClusterIntegration|Could not load Key Pairs"
+msgstr ""
+
+msgid "ClusterIntegration|Could not load VPCs for the selected region"
+msgstr ""
+
+msgid "ClusterIntegration|Could not load instance types"
+msgstr ""
+
+msgid "ClusterIntegration|Could not load networks"
+msgstr ""
+
+msgid "ClusterIntegration|Could not load security groups for the selected VPC"
+msgstr ""
+
+msgid "ClusterIntegration|Could not load subnets for the selected VPC"
+msgstr ""
+
+msgid "ClusterIntegration|Could not load subnetworks"
+msgstr ""
+
+msgid "ClusterIntegration|Create Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Creating Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
+msgstr ""
+
+msgid "ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared."
+msgstr ""
+
+msgid "ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "ClusterIntegration|Did you know?"
+msgstr ""
+
+msgid "ClusterIntegration|Elastic Kubernetes Service"
+msgstr ""
+
+msgid "ClusterIntegration|Enable Cloud Run for Anthos"
+msgstr ""
+
+msgid "ClusterIntegration|Enable Elastic Stack integration"
+msgstr ""
+
+msgid "ClusterIntegration|Enable Prometheus integration"
+msgstr ""
+
+msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
+msgstr ""
+
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
+msgid "ClusterIntegration|Enter new Service Token"
+msgstr ""
+
+msgid "ClusterIntegration|Enter the details for your Amazon EKS Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
+msgid "ClusterIntegration|Environment scope"
+msgstr ""
+
+msgid "ClusterIntegration|Environment scope is required."
+msgstr ""
+
+msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
+msgstr ""
+
+msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
+msgstr ""
+
+msgid "ClusterIntegration|Fetching machine types"
+msgstr ""
+
+msgid "ClusterIntegration|Fetching projects"
+msgstr ""
+
+msgid "ClusterIntegration|Fetching zones"
+msgstr ""
+
+msgid "ClusterIntegration|GitLab Integration"
+msgstr ""
+
+msgid "ClusterIntegration|GitLab failed to authenticate."
+msgstr ""
+
+msgid "ClusterIntegration|GitLab failed to connect to the cluster."
+msgstr ""
+
+msgid "ClusterIntegration|GitLab-managed cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Google Cloud Platform project"
+msgstr ""
+
+msgid "ClusterIntegration|Google GKE"
+msgstr ""
+
+msgid "ClusterIntegration|Google Kubernetes Engine"
+msgstr ""
+
+msgid "ClusterIntegration|Google Kubernetes Engine project"
+msgstr ""
+
+msgid "ClusterIntegration|Group cluster"
+msgstr ""
+
+msgid "ClusterIntegration|HTTP Error"
+msgstr ""
+
+msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
+msgstr ""
+
+msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
+msgstr ""
+
+msgid "ClusterIntegration|Instance cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Instance type"
+msgstr ""
+
+msgid "ClusterIntegration|Integration disabled"
+msgstr ""
+
+msgid "ClusterIntegration|Integration enabled"
+msgstr ""
+
+msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
+msgstr ""
+
+msgid "ClusterIntegration|Key pair name"
+msgstr ""
+
+msgid "ClusterIntegration|Kubernetes cluster is being created..."
+msgstr ""
+
+msgid "ClusterIntegration|Kubernetes cluster name"
+msgstr ""
+
+msgid "ClusterIntegration|Kubernetes cluster was successfully created."
+msgstr ""
+
+msgid "ClusterIntegration|Kubernetes version"
+msgstr ""
+
+msgid "ClusterIntegration|Kubernetes version not found"
+msgstr ""
+
+msgid "ClusterIntegration|Learn more about %{help_link_start_machine_type}machine types%{help_link_end} and %{help_link_start_pricing}pricing%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
+
+msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
+msgstr ""
+
+msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
+msgstr ""
+
+msgid "ClusterIntegration|Loading IAM Roles"
+msgstr ""
+
+msgid "ClusterIntegration|Loading Key Pairs"
+msgstr ""
+
+msgid "ClusterIntegration|Loading VPCs"
+msgstr ""
+
+msgid "ClusterIntegration|Loading instance types"
+msgstr ""
+
+msgid "ClusterIntegration|Loading networks"
+msgstr ""
+
+msgid "ClusterIntegration|Loading security groups"
+msgstr ""
+
+msgid "ClusterIntegration|Loading subnets"
+msgstr ""
+
+msgid "ClusterIntegration|Loading subnetworks"
+msgstr ""
+
+msgid "ClusterIntegration|Machine type"
+msgstr ""
+
+msgid "ClusterIntegration|Make sure your API endpoint is correct"
+msgstr ""
+
+msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters"
+msgstr ""
+
+msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{provider_link}"
+msgstr ""
+
+msgid "ClusterIntegration|Namespace per environment"
+msgstr ""
+
+msgid "ClusterIntegration|No IAM Roles found"
+msgstr ""
+
+msgid "ClusterIntegration|No Key Pairs found"
+msgstr ""
+
+msgid "ClusterIntegration|No VPCs found"
+msgstr ""
+
+msgid "ClusterIntegration|No instance type found"
+msgstr ""
+
+msgid "ClusterIntegration|No machine types matched your search"
+msgstr ""
+
+msgid "ClusterIntegration|No networks found"
+msgstr ""
+
+msgid "ClusterIntegration|No projects found"
+msgstr ""
+
+msgid "ClusterIntegration|No projects matched your search"
+msgstr ""
+
+msgid "ClusterIntegration|No security group found"
+msgstr ""
+
+msgid "ClusterIntegration|No subnet found"
+msgstr ""
+
+msgid "ClusterIntegration|No subnetworks found"
+msgstr ""
+
+msgid "ClusterIntegration|No zones matched your search"
+msgstr ""
+
+msgid "ClusterIntegration|Node calculations use the Kubernetes Metrics API. Make sure your cluster has metrics installed"
+msgstr ""
+
+msgid "ClusterIntegration|Number of nodes"
+msgstr ""
+
+msgid "ClusterIntegration|Number of nodes must be a numerical value."
+msgstr ""
+
+msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
+msgstr ""
+
+msgid "ClusterIntegration|Project cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Project namespace (optional, unique)"
+msgstr ""
+
+msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
+msgstr ""
+
+msgid "ClusterIntegration|Provider details"
+msgstr ""
+
+msgid "ClusterIntegration|Provision Role ARN"
+msgstr ""
+
+msgid "ClusterIntegration|RBAC-enabled cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Read our %{linkStart}help page%{linkEnd} on Kubernetes cluster integration."
+msgstr ""
+
+msgid "ClusterIntegration|Read our %{link_start}help page%{link_end} on Kubernetes cluster integration."
+msgstr ""
+
+msgid "ClusterIntegration|Remove Kubernetes cluster integration"
+msgstr ""
+
+msgid "ClusterIntegration|Remove integration"
+msgstr ""
+
+msgid "ClusterIntegration|Remove integration and resources"
+msgstr ""
+
+msgid "ClusterIntegration|Remove integration and resources?"
+msgstr ""
+
+msgid "ClusterIntegration|Remove integration?"
+msgstr ""
+
+msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
+msgstr ""
+
+msgid "ClusterIntegration|Save changes"
+msgstr ""
+
+msgid "ClusterIntegration|Search IAM Roles"
+msgstr ""
+
+msgid "ClusterIntegration|Search Key Pairs"
+msgstr ""
+
+msgid "ClusterIntegration|Search VPCs"
+msgstr ""
+
+msgid "ClusterIntegration|Search instance types"
+msgstr ""
+
+msgid "ClusterIntegration|Search machine types"
+msgstr ""
+
+msgid "ClusterIntegration|Search networks"
+msgstr ""
+
+msgid "ClusterIntegration|Search projects"
+msgstr ""
+
+msgid "ClusterIntegration|Search security groups"
+msgstr ""
+
+msgid "ClusterIntegration|Search subnets"
+msgstr ""
+
+msgid "ClusterIntegration|Search subnetworks"
+msgstr ""
+
+msgid "ClusterIntegration|Search zones"
+msgstr ""
+
+msgid "ClusterIntegration|Security group"
+msgstr ""
+
+msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Select a VPC"
+msgstr ""
+
+msgid "ClusterIntegration|Select a VPC to choose a security group"
+msgstr ""
+
+msgid "ClusterIntegration|Select a VPC to choose a subnet"
+msgstr ""
+
+msgid "ClusterIntegration|Select a VPC to use for your EKS Cluster resources. To use a new VPC, first create one on %{linkStart}Amazon Web Services %{linkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Select a network"
+msgstr ""
+
+msgid "ClusterIntegration|Select a network to choose a subnetwork"
+msgstr ""
+
+msgid "ClusterIntegration|Select a region to choose a Key Pair"
+msgstr ""
+
+msgid "ClusterIntegration|Select a region to choose a VPC"
+msgstr ""
+
+msgid "ClusterIntegration|Select a security group"
+msgstr ""
+
+msgid "ClusterIntegration|Select a subnet"
+msgstr ""
+
+msgid "ClusterIntegration|Select a subnetwork"
+msgstr ""
+
+msgid "ClusterIntegration|Select a zone to choose a network"
+msgstr ""
+
+msgid "ClusterIntegration|Select an instance type"
+msgstr ""
+
+msgid "ClusterIntegration|Select key pair"
+msgstr ""
+
+msgid "ClusterIntegration|Select machine type"
+msgstr ""
+
+msgid "ClusterIntegration|Select project"
+msgstr ""
+
+msgid "ClusterIntegration|Select project and zone to choose machine type"
+msgstr ""
+
+msgid "ClusterIntegration|Select project to choose zone"
+msgstr ""
+
+msgid "ClusterIntegration|Select service role"
+msgstr ""
+
+msgid "ClusterIntegration|Select the key pair name that will be used to create EC2 nodes. To use a new key pair name, first create one on %{linkStart}Amazon Web Services%{linkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Select the region you want to create the new cluster in. Make sure you have access to this region for your role to be able to authenticate. If no region is selected, we will use %{codeStart}DEFAULT_REGION%{codeEnd}. Learn more about %{linkStart}Regions%{linkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Select zone"
+msgstr ""
+
+msgid "ClusterIntegration|Select zone to choose machine type"
+msgstr ""
+
+msgid "ClusterIntegration|Service Token"
+msgstr ""
+
+msgid "ClusterIntegration|Service role"
+msgstr ""
+
+msgid "ClusterIntegration|Service token is required."
+msgstr ""
+
+msgid "ClusterIntegration|Set a prefix for your namespaces. If not set, defaults to your project path. If modified, existing environments will use their current namespaces until the cluster cache is cleared."
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong on our end."
+msgstr ""
+
+msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
+msgstr ""
+
+msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
+msgstr ""
+
+msgid "ClusterIntegration|Subnets"
+msgstr ""
+
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
+msgstr ""
+
+msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
+msgstr ""
+
+msgid "ClusterIntegration|The URL used to access the Kubernetes API."
+msgstr ""
+
+msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
+msgstr ""
+
+msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
+msgstr ""
+
+msgid "ClusterIntegration|The region the new cluster will be created in. You must reauthenticate to change regions."
+msgstr ""
+
+msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
+msgstr ""
+
+msgid "ClusterIntegration|There was an HTTP error when connecting to your cluster."
+msgstr ""
+
+msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below"
+msgstr ""
+
+msgid "ClusterIntegration|This is necessary if your integration has become out of sync. The cache is repopulated during the next CI job that requires namespace and service accounts."
+msgstr ""
+
+msgid "ClusterIntegration|This is necessary to clear existing environment-namespace associations from clusters previously managed by GitLab."
+msgstr ""
+
+msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
+msgstr ""
+
+msgid "ClusterIntegration|This project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
+msgstr ""
+
+msgid "ClusterIntegration|This will permanently delete the following resources:"
+msgstr ""
+
+msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|To remove your integration and resources, type %{clusterName} to confirm:"
+msgstr ""
+
+msgid "ClusterIntegration|To remove your integration, type %{clusterName} to confirm:"
+msgstr ""
+
+msgid "ClusterIntegration|To use a new project, first create one on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Troubleshooting tips:"
+msgstr ""
+
+msgid "ClusterIntegration|Unable to Authenticate"
+msgstr ""
+
+msgid "ClusterIntegration|Unable to Connect"
+msgstr ""
+
+msgid "ClusterIntegration|Unknown Error"
+msgstr ""
+
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
+msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
+msgstr ""
+
+msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
+msgstr ""
+
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
+msgid "ClusterIntegration|VPC"
+msgstr ""
+
+msgid "ClusterIntegration|Validating project billing status"
+msgstr ""
+
+msgid "ClusterIntegration|We could not verify that one of your projects on GCP has billing enabled. Please try again."
+msgstr ""
+
+msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
+
+msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
+msgstr ""
+
+msgid "ClusterIntegration|You are about to remove your cluster integration."
+msgstr ""
+
+msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
+msgstr ""
+
+msgid "ClusterIntegration|You should select at least two subnets"
+msgstr ""
+
+msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
+msgstr ""
+
+msgid "ClusterIntegration|Your cluster API is unreachable. Please ensure your API URL is correct."
+msgstr ""
+
+msgid "ClusterIntegration|Your service role is distinct from the provision role used when authenticating. It will allow Amazon EKS and the Kubernetes control plane to manage AWS resources on your behalf. To use a new role, first create one on %{linkStart}Amazon Web Services%{linkEnd}."
+msgstr ""
+
+msgid "ClusterIntegration|Zone"
+msgstr ""
+
+msgid "ClusterIntegration|access to Google Kubernetes Engine"
+msgstr ""
+
+msgid "ClusterIntegration|meets the requirements"
+msgstr ""
+
+msgid "ClusterIntegration|sign up"
+msgstr ""
+
+msgid "Clusters|An error occurred while loading clusters"
+msgstr ""
+
+msgid "Code"
+msgstr ""
+
+msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
+msgstr ""
+
+msgid "Code Coverage| Empty code coverage data"
+msgstr ""
+
+msgid "Code Coverage|Couldn't fetch the code coverage data"
+msgstr ""
+
+msgid "Code Owner"
+msgstr ""
+
+msgid "Code Owners"
+msgstr ""
+
+msgid "Code Quality"
+msgstr ""
+
+msgid "Code Review"
+msgstr ""
+
+msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
+msgstr ""
+
+msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
+msgstr ""
+
+msgid "Code owner approval is required"
+msgstr ""
+
+msgid "Code owners"
+msgstr ""
+
+msgid "Code review"
+msgstr ""
+
+msgid "Code snippet"
+msgstr ""
+
+msgid "Code snippet copied. Insert it in the correct location in the YAML file."
+msgstr ""
+
+msgid "CodeIntelligence|This is the definition"
+msgstr ""
+
+msgid "CodeNavigation|No references found"
+msgstr ""
+
+msgid "CodeOwner|Pattern"
+msgstr ""
+
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
+msgid "Cohorts|Inactive users"
+msgstr ""
+
+msgid "Cohorts|Month %{month_index}"
+msgstr ""
+
+msgid "Cohorts|New users"
+msgstr ""
+
+msgid "Cohorts|Registration month"
+msgstr ""
+
+msgid "Cohorts|Returning users"
+msgstr ""
+
+msgid "Cohorts|User cohorts are shown for the last %{months_included} months. Only users with activity are counted in the 'New users' column; inactive users are counted separately."
+msgstr ""
+
+msgid "Collapse"
+msgstr ""
+
+msgid "Collapse all threads"
+msgstr ""
+
+msgid "Collapse approvers"
+msgstr ""
+
+msgid "Collapse issues"
+msgstr ""
+
+msgid "Collapse milestones"
+msgstr ""
+
+msgid "Collapse replies"
+msgstr ""
+
+msgid "Collapse settings section"
+msgstr ""
+
+msgid "Collapse sidebar"
+msgstr ""
+
+msgid "Collapses this file (only for you) until it’s changed again."
+msgstr ""
+
+msgid "Collector hostname"
+msgstr ""
+
+msgid "Colorize messages"
+msgstr ""
+
+msgid "ComboSearch is not defined"
+msgstr ""
+
+msgid "Comma-separated list of email addresses."
+msgstr ""
+
+msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Command line instructions"
+msgstr ""
+
+msgid "Commands applied"
+msgstr ""
+
+msgid "Commands did not apply"
+msgstr ""
+
+msgid "Comment"
+msgstr ""
+
+msgid "Comment & resolve thread"
+msgstr ""
+
+msgid "Comment & unresolve thread"
+msgstr ""
+
+msgid "Comment '%{label}' position"
+msgstr ""
+
+msgid "Comment form position"
+msgstr ""
+
+msgid "Comment is being updated"
+msgstr ""
+
+msgid "Comment on lines %{startLine} to %{endLine}"
+msgstr ""
+
+msgid "Comment/Reply (quoting selected text)"
+msgstr ""
+
+msgid "Commenting on files that replace or are replaced by symbolic links is currently not supported."
+msgstr ""
+
+msgid "Commenting on symbolic links that replace or are replaced by files is currently not supported."
+msgstr ""
+
+msgid "Comments"
+msgstr ""
+
+msgid "Commit"
+msgid_plural "Commits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Commit %{commit_id}"
+msgstr ""
+
+msgid "Commit (when editing commit message)"
+msgstr ""
+
+msgid "Commit Message"
+msgstr ""
+
+msgid "Commit SHA"
+msgstr ""
+
+msgid "Commit changes"
+msgstr ""
+
+msgid "Commit deleted"
+msgstr ""
+
+msgid "Commit message"
+msgstr ""
+
+msgid "Commit message (optional)"
+msgstr ""
+
+msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
+msgstr ""
+
+msgid "Commit to %{branchName} branch"
+msgstr ""
+
+msgid "CommitBoxTitle|Commit"
+msgstr ""
+
+msgid "CommitMessage|Add %{file_name}"
+msgstr ""
+
+msgid "CommitWidget|authored"
+msgstr ""
+
+msgid "Commits"
+msgstr ""
+
+msgid "Commits feed"
+msgstr ""
+
+msgid "Commits per day hour (UTC)"
+msgstr ""
+
+msgid "Commits per day of month"
+msgstr ""
+
+msgid "Commits per weekday"
+msgstr ""
+
+msgid "Commits to"
+msgstr ""
+
+msgid "Commits you select appear here. Go to the first tab and select commits to add to this merge request."
+msgstr ""
+
+msgid "Commits|An error occurred while fetching merge requests data."
+msgstr ""
+
+msgid "Commits|History"
+msgstr ""
+
+msgid "Commits|No related merge requests found"
+msgstr ""
+
+msgid "Committed by"
+msgstr ""
+
+msgid "Commit…"
+msgstr ""
+
+msgid "Community forum"
+msgstr ""
+
+msgid "Company"
+msgstr ""
+
+msgid "Company Name"
+msgstr ""
+
+msgid "Compare"
+msgstr ""
+
+msgid "Compare %{oldCommitId}...%{newCommitId}"
+msgstr ""
+
+msgid "Compare Git revisions"
+msgstr ""
+
+msgid "Compare GitLab editions"
+msgstr ""
+
+msgid "Compare Revisions"
+msgstr ""
+
+msgid "Compare changes"
+msgstr ""
+
+msgid "Compare changes with the last commit"
+msgstr ""
+
+msgid "Compare changes with the merge request target branch"
+msgstr ""
+
+msgid "Compare submodule commit revisions"
+msgstr ""
+
+msgid "Compare with previous version"
+msgstr ""
+
+msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
+msgstr ""
+
+msgid "CompareBranches|There isn't anything to compare."
+msgstr ""
+
+msgid "CompareRevisions|Branches"
+msgstr ""
+
+msgid "CompareRevisions|Compare"
+msgstr ""
+
+msgid "CompareRevisions|Create merge request"
+msgstr ""
+
+msgid "CompareRevisions|Filter by Git revision"
+msgstr ""
+
+msgid "CompareRevisions|Select Git revision"
+msgstr ""
+
+msgid "CompareRevisions|Select branch/tag"
+msgstr ""
+
+msgid "CompareRevisions|Select target project"
+msgstr ""
+
+msgid "CompareRevisions|Swap revisions"
+msgstr ""
+
+msgid "CompareRevisions|Tags"
+msgstr ""
+
+msgid "CompareRevisions|There was an error while loading the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|There was an error while searching the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|There was an error while updating the branch/tag list. Please try again."
+msgstr ""
+
+msgid "CompareRevisions|View open merge request"
+msgstr ""
+
+msgid "Complete"
+msgstr ""
+
+msgid "Complete verification to sign in."
+msgstr ""
+
+msgid "Completed"
+msgstr ""
+
+msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
+msgstr ""
+
+msgid "Compliance framework"
+msgstr ""
+
+msgid "Compliance report"
+msgstr ""
+
+msgid "ComplianceDashboard|created by:"
+msgstr ""
+
+msgid "ComplianceFrameworks|Add framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|Background color"
+msgstr ""
+
+msgid "ComplianceFrameworks|Cancel"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance framework deleted successfully"
+msgstr ""
+
+msgid "ComplianceFrameworks|Compliance pipeline configuration (optional)"
+msgstr ""
+
+msgid "ComplianceFrameworks|Configuration not found"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Delete framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|Description"
+msgstr ""
+
+msgid "ComplianceFrameworks|Description is required"
+msgstr ""
+
+msgid "ComplianceFrameworks|Edit framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|Error deleting the compliance framework. Please try again"
+msgstr ""
+
+msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page"
+msgstr ""
+
+msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
+msgstr ""
+
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
+msgid "ComplianceFrameworks|Invalid format"
+msgstr ""
+
+msgid "ComplianceFrameworks|Name"
+msgstr ""
+
+msgid "ComplianceFrameworks|Name is required"
+msgstr ""
+
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
+msgstr ""
+
+msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "ComplianceFrameworks|Unable to save this compliance framework. Please try again"
+msgstr ""
+
+msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
+msgstr ""
+
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Edit compliance framework"
+msgstr ""
+
+msgid "ComplianceFramework|New compliance framework"
+msgstr ""
+
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
+msgid "ComplianceReport|Approved by author"
+msgstr ""
+
+msgid "ComplianceReport|Approved by committer"
+msgstr ""
+
+msgid "ComplianceReport|Less than 2 approvers"
+msgstr ""
+
+msgid "ComplianceReport|No violations found"
+msgstr ""
+
+msgid "Component"
+msgstr ""
+
+msgid "Confidence"
+msgstr ""
+
+msgid "Confidential"
+msgstr ""
+
+msgid "Confidential issue"
+msgstr ""
+
+msgid "Confidential note"
+msgstr ""
+
+msgid "Confidentiality"
+msgstr ""
+
+msgid "Configuration"
+msgstr ""
+
+msgid "Configuration help"
+msgstr ""
+
+msgid "Configure %{italic_start}What's new%{italic_end} drawer and content."
+msgstr ""
+
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
+msgstr ""
+
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
+msgid "Configure Container Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings) to customize Container Scanning settings."
+msgstr ""
+
+msgid "Configure Container Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
+msgstr ""
+
+msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
+msgstr ""
+
+msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
+msgstr ""
+
+msgid "Configure GitLab"
+msgstr ""
+
+msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgstr ""
+
+msgid "Configure Gitaly timeouts."
+msgstr ""
+
+msgid "Configure Integrations"
+msgstr ""
+
+msgid "Configure Prometheus"
+msgstr ""
+
+msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
+msgstr ""
+
+msgid "Configure SAST IaC in `.gitlab-ci.yml`, creating this file if it does not already exist"
+msgstr ""
+
+msgid "Configure SAST in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST settings."
+msgstr ""
+
+msgid "Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist"
+msgstr ""
+
+msgid "Configure Secret Detection in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings) to customize Secret Detection settings."
+msgstr ""
+
+msgid "Configure Secret Detection in `.gitlab-ci.yml`, creating this file if it does not already exist"
+msgstr ""
+
+msgid "Configure Sentry integration for error tracking"
+msgstr ""
+
+msgid "Configure Tracing"
+msgstr ""
+
+msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
+msgstr ""
+
+msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
+msgstr ""
+
+msgid "Configure existing installation"
+msgstr ""
+
+msgid "Configure pipeline"
+msgstr ""
+
+msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
+msgstr ""
+
+msgid "Configure region"
+msgstr ""
+
+msgid "Configure region for environment"
+msgstr ""
+
+msgid "Configure regions"
+msgstr ""
+
+msgid "Configure repository mirroring."
+msgstr ""
+
+msgid "Configure repository storage."
+msgstr ""
+
+msgid "Configure settings for Advanced Search with Elasticsearch."
+msgstr ""
+
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
+msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
+msgstr ""
+
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
+msgstr ""
+
+msgid "Configure the %{link} integration."
+msgstr ""
+
+msgid "Configure the default first day of the week and time tracking units."
+msgstr ""
+
+msgid "Configure the way a user creates a new account."
+msgstr ""
+
+msgid "Configure via Merge Request"
+msgstr ""
+
+msgid "Configure which lists are shown for anyone who visits this board"
+msgstr ""
+
+msgid "Configure with a merge request"
+msgstr ""
+
+msgid "Configure your environments to be deployed to specific geographical regions"
+msgstr ""
+
+msgid "Confirm"
+msgstr ""
+
+msgid "Confirm approval"
+msgstr ""
+
+msgid "Confirm destroy application"
+msgstr ""
+
+msgid "Confirm new password"
+msgstr ""
+
+msgid "Confirm user"
+msgstr ""
+
+msgid "Confirm your account"
+msgstr ""
+
+msgid "Confirm your email address"
+msgstr ""
+
+msgid "Confirmation email sent to %{email}"
+msgstr ""
+
+msgid "Confirmation required"
+msgstr ""
+
+msgid "Confirmed at:"
+msgstr ""
+
+msgid "Confirmed:"
+msgstr ""
+
+msgid "Conflict: This file was added both in the source and target branches, but with different contents."
+msgstr ""
+
+msgid "Conflict: This file was modified in both the source and target branches."
+msgstr ""
+
+msgid "Conflict: This file was modified in the source branch, but removed in the target branch."
+msgstr ""
+
+msgid "Conflict: This file was removed in the source branch, but modified in the target branch."
+msgstr ""
+
+msgid "Conflict: This file was removed in the source branch, but renamed in the target branch."
+msgstr ""
+
+msgid "Conflict: This file was renamed differently in the source and target branches."
+msgstr ""
+
+msgid "Conflict: This file was renamed in the source branch, but removed in the target branch."
+msgstr ""
+
+msgid "Confluence"
+msgstr ""
+
+msgid "Confluence Cloud Workspace URL"
+msgstr ""
+
+msgid "ConfluenceService|Confluence Workspace"
+msgstr ""
+
+msgid "ConfluenceService|Link to a Confluence Workspace from the sidebar."
+msgstr ""
+
+msgid "ConfluenceService|Link to a Confluence Workspace from the sidebar. Enabling this integration replaces the \"Wiki\" sidebar link with a link to the Confluence Workspace. The GitLab wiki is still available at the original URL."
+msgstr ""
+
+msgid "ConfluenceService|Your GitLab wiki is still available at %{wiki_link}. To re-enable the link to the GitLab wiki, disable this integration."
+msgstr ""
+
+msgid "Congratulations, your free trial is activated."
+msgstr ""
+
+msgid "Connect"
+msgstr ""
+
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
+msgid "Connect all repositories"
+msgstr ""
+
+msgid "Connect repositories from GitHub"
+msgstr ""
+
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connected"
+msgstr ""
+
+msgid "Connecting"
+msgstr ""
+
+msgid "Connecting to terminal sync service"
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
+msgid "Connection failed"
+msgstr ""
+
+msgid "Connection failure"
+msgstr ""
+
+msgid "Connection timed out"
+msgstr ""
+
+msgid "Connection timeout"
+msgstr ""
+
+msgid "Consistency guarantee method"
+msgstr ""
+
+msgid "Contact support"
+msgstr ""
+
+msgid "Contacts"
+msgstr ""
+
+msgid "Container Registry"
+msgstr ""
+
+msgid "Container Scanning"
+msgstr ""
+
+msgid "Container does not exist"
+msgstr ""
+
+msgid "Container must be a project or a group."
+msgstr ""
+
+msgid "Container registry images"
+msgstr ""
+
+msgid "Container registry is not enabled on this GitLab instance. Ask an administrator to enable it in order for Auto DevOps to work."
+msgstr ""
+
+msgid "Container repositories"
+msgstr ""
+
+msgid "Container repositories synchronization concurrency limit"
+msgstr ""
+
+msgid "Container repository"
+msgstr ""
+
+msgid "ContainerRegistry| Please visit the %{linkStart}administration settings%{linkEnd} to enable this feature."
+msgstr ""
+
+msgid "ContainerRegistry|%{count} Image repository"
+msgid_plural "ContainerRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ContainerRegistry|%{count} Tag"
+msgid_plural "ContainerRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ContainerRegistry|%{strongStart}Disabled%{strongEnd} - Tags will not be automatically deleted."
+msgstr ""
+
+msgid "ContainerRegistry|%{strongStart}Enabled%{strongEnd} - Tags that match the rules on this page are automatically scheduled for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|%{title} was successfully scheduled for deletion"
+msgstr ""
+
+msgid "ContainerRegistry|-- tags"
+msgstr ""
+
+msgid "ContainerRegistry|Build an image"
+msgstr ""
+
+msgid "ContainerRegistry|CLI Commands"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup disabled"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup in progress"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup incomplete"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup is currently removing tags"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup is disabled for this project"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup is ongoing"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup pending"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup policy for tags is disabled"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup policy successfully saved."
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup ran but some tags were not removed"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup timed out"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup timed out before it could delete all tags"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup will run %{time}"
+msgstr ""
+
+msgid "ContainerRegistry|Cleanup will run soon"
+msgstr ""
+
+msgid "ContainerRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "ContainerRegistry|Container Registry"
+msgstr ""
+
+msgid "ContainerRegistry|Copy build command"
+msgstr ""
+
+msgid "ContainerRegistry|Copy login command"
+msgstr ""
+
+msgid "ContainerRegistry|Copy push command"
+msgstr ""
+
+msgid "ContainerRegistry|Delete image repository?"
+msgstr ""
+
+msgid "ContainerRegistry|Delete selected tags"
+msgstr ""
+
+msgid "ContainerRegistry|Delete tag"
+msgstr ""
+
+msgid "ContainerRegistry|Deleting the image repository will delete all images and tags inside. This action cannot be undone. Please type the following to confirm: %{code}"
+msgstr ""
+
+msgid "ContainerRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "ContainerRegistry|Docker connection error"
+msgstr ""
+
+msgid "ContainerRegistry|Enable expiration policy"
+msgstr ""
+
+msgid "ContainerRegistry|Expiration policy is disabled."
+msgstr ""
+
+msgid "ContainerRegistry|Expiration policy will run in %{time}"
+msgstr ""
+
+msgid "ContainerRegistry|If you are not already logged in, you need to authenticate to the Container Registry by using your GitLab username and password. If you have %{twofaDocLinkStart}Two-Factor Authentication%{twofaDocLinkEnd} enabled, use a %{personalAccessTokensDocLinkStart}Personal Access Token%{personalAccessTokensDocLinkEnd} instead of a password."
+msgstr ""
+
+msgid "ContainerRegistry|Image repository deletion failed"
+msgstr ""
+
+msgid "ContainerRegistry|Image repository not found"
+msgstr ""
+
+msgid "ContainerRegistry|Image repository will be deleted"
+msgstr ""
+
+msgid "ContainerRegistry|Image repository with no name located at the project URL."
+msgstr ""
+
+msgid "ContainerRegistry|Image tags"
+msgstr ""
+
+msgid "ContainerRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "ContainerRegistry|Keep tags matching:"
+msgstr ""
+
+msgid "ContainerRegistry|Keep the most recent:"
+msgstr ""
+
+msgid "ContainerRegistry|Keep these tags"
+msgstr ""
+
+msgid "ContainerRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "ContainerRegistry|Login"
+msgstr ""
+
+msgid "ContainerRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "ContainerRegistry|Missing or insufficient permission, delete button disabled"
+msgstr ""
+
+msgid "ContainerRegistry|Next cleanup scheduled to run on:"
+msgstr ""
+
+msgid "ContainerRegistry|Not yet scheduled"
+msgstr ""
+
+msgid "ContainerRegistry|Note: Any policy update will result in a change to the scheduled run date and time"
+msgstr ""
+
+msgid "ContainerRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "ContainerRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "ContainerRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "ContainerRegistry|Push an image"
+msgstr ""
+
+msgid "ContainerRegistry|Remember to run %{docLinkStart}garbage collection%{docLinkEnd} to remove the stale data from storage."
+msgstr ""
+
+msgid "ContainerRegistry|Remove repository"
+msgstr ""
+
+msgid "ContainerRegistry|Remove tag"
+msgid_plural "ContainerRegistry|Remove tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ContainerRegistry|Remove tags matching:"
+msgstr ""
+
+msgid "ContainerRegistry|Remove tags older than:"
+msgstr ""
+
+msgid "ContainerRegistry|Remove these tags"
+msgstr ""
+
+msgid "ContainerRegistry|Root image"
+msgstr ""
+
+msgid "ContainerRegistry|Run cleanup:"
+msgstr ""
+
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
+msgid "ContainerRegistry|Some tags were not deleted"
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while fetching the cleanup policy."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while fetching the image details."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while fetching the repository list."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while fetching the tags list."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while marking the tag for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while marking the tags for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while scheduling %{title} for deletion. Please try again."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while scheduling the image for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Something went wrong while updating the cleanup policy."
+msgstr ""
+
+msgid "ContainerRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "ContainerRegistry|Tag successfully marked for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Tags successfully marked for deletion."
+msgstr ""
+
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
+msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
+msgstr ""
+
+msgid "ContainerRegistry|Tags that match these rules are %{strongStart}removed%{strongEnd}, unless a rule above says to keep them."
+msgstr ""
+
+msgid "ContainerRegistry|Tags with names that match this regex pattern are kept. %{linkStart}View regex examples.%{linkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|Tags with names that match this regex pattern are removed. %{linkStart}View regex examples.%{linkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|The cleanup policy timed out before it could delete all tags. An administrator can %{adminLinkStart}manually run cleanup now%{adminLinkEnd} or you can wait for the cleanup policy to automatically run again. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|The filter returned no results"
+msgstr ""
+
+msgid "ContainerRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "ContainerRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "ContainerRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "ContainerRegistry|The value of this input should be less than 256 characters"
+msgstr ""
+
+msgid "ContainerRegistry|There are no container images available in this group"
+msgstr ""
+
+msgid "ContainerRegistry|There are no container images stored for this project"
+msgstr ""
+
+msgid "ContainerRegistry|There was an error during the deletion of this image repository, please try again."
+msgstr ""
+
+msgid "ContainerRegistry|This image has no active tags"
+msgstr ""
+
+msgid "ContainerRegistry|This image repository has failed to be deleted"
+msgstr ""
+
+msgid "ContainerRegistry|This image repository is scheduled for deletion"
+msgstr ""
+
+msgid "ContainerRegistry|This image repository will be deleted. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|This project's cleanup policy for tags is not enabled."
+msgstr ""
+
+msgid "ContainerRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "ContainerRegistry|We are having trouble connecting to the Container Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "ContainerRegistry|With the Container Registry, every project can have its own space to store its Docker images. %{docLinkStart}More Information%{docLinkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|With the Container Registry, every project can have its own space to store its Docker images. Push at least one Docker image in one of this group's projects in order to show up here. %{docLinkStart}More Information%{docLinkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
+msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
+msgstr ""
+
+msgid "ContainerRegistry|You are about to remove %{item}. Are you sure?"
+msgstr ""
+
+msgid "ContainerRegistry|You are about to remove repository %{title}. Once you confirm, this repository will be permanently deleted."
+msgstr ""
+
+msgid "ContainerRegistry|You can add an image to this registry with the following commands:"
+msgstr ""
+
+msgid "Content parsed with %{link}."
+msgstr ""
+
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
+msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
+msgstr ""
+
+msgid "Contents of .gitlab-ci.yml"
+msgstr ""
+
+msgid "ContextCommits|Failed to create context commits. Please try again."
+msgstr ""
+
+msgid "ContextCommits|Failed to create/remove context commits. Please try again."
+msgstr ""
+
+msgid "ContextCommits|Failed to delete context commits. Please try again."
+msgstr ""
+
+msgid "Continue"
+msgstr ""
+
+msgid "Continue to the next step"
+msgstr ""
+
+msgid "Continuous Integration and Deployment"
+msgstr ""
+
+msgid "Contribute to GitLab"
+msgstr ""
+
+msgid "Contribution"
+msgstr ""
+
+msgid "Contribution Analytics"
+msgstr ""
+
+msgid "ContributionAnalytics|%{created_count} created, %{closed_count} closed."
+msgstr ""
+
+msgid "ContributionAnalytics|%{created_count} created, %{merged_count} merged, %{closed_count} closed."
+msgstr ""
+
+msgid "ContributionAnalytics|%{pushes} pushes, more than %{commits} commits by %{people} contributors."
+msgstr ""
+
+msgid "ContributionAnalytics|Contribution analytics for issues, merge requests and push events since %{start_date}"
+msgstr ""
+
+msgid "ContributionAnalytics|Issues"
+msgstr ""
+
+msgid "ContributionAnalytics|Last 3 months"
+msgstr ""
+
+msgid "ContributionAnalytics|Last month"
+msgstr ""
+
+msgid "ContributionAnalytics|Last week"
+msgstr ""
+
+msgid "ContributionAnalytics|Merge requests"
+msgstr ""
+
+msgid "ContributionAnalytics|No issues for the selected time period."
+msgstr ""
+
+msgid "ContributionAnalytics|No merge requests for the selected time period."
+msgstr ""
+
+msgid "ContributionAnalytics|No pushes for the selected time period."
+msgstr ""
+
+msgid "Contributions for %{calendar_date}"
+msgstr ""
+
+msgid "Contributions per group member"
+msgstr ""
+
+msgid "Contributor"
+msgstr ""
+
+msgid "Contributors"
+msgstr ""
+
+msgid "Control emails linked to your account"
+msgstr ""
+
+msgid "Control how the GitLab Package Registry functions."
+msgstr ""
+
+msgid "Control whether to display customer experience improvement content and third-party offers in GitLab."
+msgstr ""
+
+msgid "Control which projects can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable. It is a security risk to disable this feature, because unauthorized projects might attempt to retrieve an active token and access the API."
+msgstr ""
+
+msgid "Cookie domain"
+msgstr ""
+
+msgid "Copied"
+msgstr ""
+
+msgid "Copied labels and milestone from %{source_issuable_reference}."
+msgstr ""
+
+msgid "Copy"
+msgstr ""
+
+msgid "Copy %{http_label} clone URL"
+msgstr ""
+
+msgid "Copy %{name}"
+msgstr ""
+
+msgid "Copy %{protocol} clone URL"
+msgstr ""
+
+msgid "Copy %{type}"
+msgstr ""
+
+msgid "Copy Account ID to clipboard"
+msgstr ""
+
+msgid "Copy External ID to clipboard"
+msgstr ""
+
+msgid "Copy ID"
+msgstr ""
+
+msgid "Copy IP Address"
+msgstr ""
+
+msgid "Copy KRB5 clone URL"
+msgstr ""
+
+msgid "Copy SSH clone URL"
+msgstr ""
+
+msgid "Copy SSH public key"
+msgstr ""
+
+msgid "Copy URL"
+msgstr ""
+
+msgid "Copy branch name"
+msgstr ""
+
+msgid "Copy codes"
+msgstr ""
+
+msgid "Copy command"
+msgstr ""
+
+msgid "Copy commands"
+msgstr ""
+
+msgid "Copy commit SHA"
+msgstr ""
+
+msgid "Copy environment"
+msgstr ""
+
+msgid "Copy evidence SHA"
+msgstr ""
+
+msgid "Copy failed. Please manually copy the value."
+msgstr ""
+
+msgid "Copy file contents"
+msgstr ""
+
+msgid "Copy file path"
+msgstr ""
+
+msgid "Copy issue URL to clipboard"
+msgstr ""
+
+msgid "Copy key"
+msgstr ""
+
+msgid "Copy labels and milestone from %{source_issuable_reference}."
+msgstr ""
+
+msgid "Copy labels and milestone from other issue or merge request in this project"
+msgstr ""
+
+msgid "Copy link"
+msgstr ""
+
+msgid "Copy link to chart"
+msgstr ""
+
+msgid "Copy reference"
+msgstr ""
+
+msgid "Copy secret"
+msgstr ""
+
+msgid "Copy source branch name"
+msgstr ""
+
+msgid "Copy the code below to implement tracking in your application:"
+msgstr ""
+
+msgid "Copy this registration token."
+msgstr ""
+
+msgid "Copy to clipboard"
+msgstr ""
+
+msgid "Copy token"
+msgstr ""
+
+msgid "Copy trigger token"
+msgstr ""
+
+msgid "Copy value"
+msgstr ""
+
+msgid "Corpus Management"
+msgstr ""
+
+msgid "Corpus Management|Are you sure you want to delete the corpus?"
+msgstr ""
+
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "CorpusManagement|Actions"
+msgstr ""
+
+msgid "CorpusManagement|Corpus file"
+msgstr ""
+
+msgid "CorpusManagement|Corpus files are used in coverage-guided fuzz testing as seed inputs to improve testing."
+msgstr ""
+
+msgid "CorpusManagement|Corpus files must be in *.zip format. Maximum 5 GB"
+msgstr ""
+
+msgid "CorpusManagement|Corpus name"
+msgstr ""
+
+msgid "CorpusManagement|Currently, there are no uploaded or generated corpuses."
+msgstr ""
+
+msgid "CorpusManagement|File too large, Maximum 5 GB"
+msgstr ""
+
+msgid "CorpusManagement|Filename can contain only lowercase letters (a-z), uppercase letter (A-Z), numbers (0-9), dots (.), hyphens (-), or underscores (_)."
+msgstr ""
+
+msgid "CorpusManagement|Fuzz testing corpus management"
+msgstr ""
+
+msgid "CorpusManagement|Last updated"
+msgstr ""
+
+msgid "CorpusManagement|Last used"
+msgstr ""
+
+msgid "CorpusManagement|Latest Job:"
+msgstr ""
+
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
+msgid "CorpusManagement|New upload"
+msgstr ""
+
+msgid "CorpusManagement|Not Set"
+msgstr ""
+
+msgid "CorpusManagement|Target"
+msgstr ""
+
+msgid "CorpusManagement|To use this corpus, edit the corresponding YAML file"
+msgstr ""
+
+msgid "CorpusManagement|Total Size: %{totalSize}"
+msgstr ""
+
+msgid "Could not add admins as members"
+msgstr ""
+
+msgid "Could not apply %{name} command."
+msgstr ""
+
+msgid "Could not apply %{name} command. %{message}."
+msgstr ""
+
+msgid "Could not authorize chat nickname. Try again!"
+msgstr ""
+
+msgid "Could not change HEAD: branch '%{branch}' does not exist"
+msgstr ""
+
+msgid "Could not commit. An unexpected error occurred."
+msgstr ""
+
+msgid "Could not connect to FogBugz, check your URL"
+msgstr ""
+
+msgid "Could not connect to Sentry. Refresh the page to try again."
+msgstr ""
+
+msgid "Could not connect to Web IDE file mirror service."
+msgstr ""
+
+msgid "Could not create Wiki Repository at this time. Please try again later."
+msgstr ""
+
+msgid "Could not create environment"
+msgstr ""
+
+msgid "Could not create group"
+msgstr ""
+
+msgid "Could not create issue"
+msgstr ""
+
+msgid "Could not create project"
+msgstr ""
+
+msgid "Could not create wiki page"
+msgstr ""
+
+msgid "Could not delete chat nickname %{chat_name}."
+msgstr ""
+
+msgid "Could not delete wiki page"
+msgstr ""
+
+msgid "Could not draw the lines for job relationships"
+msgstr ""
+
+msgid "Could not fetch policy because existing policy YAML is invalid"
+msgstr ""
+
+msgid "Could not fetch training providers. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "Could not find design."
+msgstr ""
+
+msgid "Could not find iteration"
+msgstr ""
+
+msgid "Could not get the data properly"
+msgstr ""
+
+msgid "Could not load the user chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "Could not load usage counts. Please refresh the page to try again."
+msgstr ""
+
+msgid "Could not remove %{user} from %{group}. Cannot remove last group owner."
+msgstr ""
+
+msgid "Could not remove %{user} from %{group}. User is not a group member."
+msgstr ""
+
+msgid "Could not remove the trigger."
+msgstr ""
+
+msgid "Could not restore the group"
+msgstr ""
+
+msgid "Could not revoke access token %{access_token_name}."
+msgstr ""
+
+msgid "Could not revoke impersonation token %{token_name}."
+msgstr ""
+
+msgid "Could not revoke personal access token %{personal_access_token_name}."
+msgstr ""
+
+msgid "Could not save configuration. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "Could not save group ID"
+msgstr ""
+
+msgid "Could not save project ID"
+msgstr ""
+
+msgid "Could not save prometheus manual configuration"
+msgstr ""
+
+msgid "Could not update the LDAP settings"
+msgstr ""
+
+msgid "Could not update wiki page"
+msgstr ""
+
+msgid "Could not upload your designs as one or more files uploaded are not supported."
+msgstr ""
+
+msgid "Couldn't assign policy to project or group"
+msgstr ""
+
+msgid "Country"
+msgstr ""
+
+msgid "Coverage"
+msgstr ""
+
+msgid "Coverage Fuzzing"
+msgstr ""
+
+msgid "Create"
+msgstr ""
+
+msgid "Create %{environment}"
+msgstr ""
+
+msgid "Create %{humanized_resource_name}"
+msgstr ""
+
+msgid "Create %{type}"
+msgstr ""
+
+msgid "Create %{workspace} label"
+msgstr ""
+
+msgid "Create Google Cloud project"
+msgstr ""
+
+msgid "Create New Directory"
+msgstr ""
+
+msgid "Create New Domain"
+msgstr ""
+
+msgid "Create a GitLab account first, and then connect it to your %{label} account."
+msgstr ""
+
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
+msgid "Create a Mattermost team for this group"
+msgstr ""
+
+msgid "Create a cluster"
+msgstr ""
+
+msgid "Create a group"
+msgstr ""
+
+msgid "Create a merge request"
+msgstr ""
+
+msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
+msgstr ""
+
+msgid "Create a new branch"
+msgstr ""
+
+msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
+msgstr ""
+
+msgid "Create a new issue"
+msgstr ""
+
+msgid "Create a new project"
+msgstr ""
+
+msgid "Create a new repository"
+msgstr ""
+
+msgid "Create a personal access token on your account to pull or push via %{protocol}."
+msgstr ""
+
+msgid "Create a project"
+msgstr ""
+
+msgid "Create an account using:"
+msgstr ""
+
+msgid "Create an incident. Incidents are created for each alert triggered."
+msgstr ""
+
+msgid "Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to import."
+msgstr ""
+
+msgid "Create branch"
+msgstr ""
+
+msgid "Create commit"
+msgstr ""
+
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
+msgid "Create confidential merge request"
+msgstr ""
+
+msgid "Create confidential merge request and branch"
+msgstr ""
+
+msgid "Create directory"
+msgstr ""
+
+msgid "Create empty repository"
+msgstr ""
+
+msgid "Create epic"
+msgstr ""
+
+msgid "Create file"
+msgstr ""
+
+msgid "Create from"
+msgstr ""
+
+msgid "Create group"
+msgstr ""
+
+msgid "Create group label"
+msgstr ""
+
+msgid "Create incident"
+msgstr ""
+
+msgid "Create issue"
+msgstr ""
+
+msgid "Create issue to resolve all threads"
+msgstr ""
+
+msgid "Create iteration"
+msgstr ""
+
+msgid "Create label"
+msgstr ""
+
+msgid "Create list"
+msgstr ""
+
+msgid "Create lists from labels. Issues with that label appear in that list."
+msgstr ""
+
+msgid "Create merge request"
+msgstr ""
+
+msgid "Create merge request and branch"
+msgstr ""
+
+msgid "Create milestone"
+msgstr ""
+
+msgid "Create new"
+msgstr ""
+
+msgid "Create new %{name} by email"
+msgstr ""
+
+msgid "Create new Value Stream"
+msgstr ""
+
+msgid "Create new branch"
+msgstr ""
+
+msgid "Create new confidential %{issuableType}"
+msgstr ""
+
+msgid "Create new directory"
+msgstr ""
+
+msgid "Create new file"
+msgstr ""
+
+msgid "Create new file or directory"
+msgstr ""
+
+msgid "Create new label"
+msgstr ""
+
+msgid "Create new project"
+msgstr ""
+
+msgid "Create one"
+msgstr ""
+
+msgid "Create or import your first project"
+msgstr ""
+
+msgid "Create project"
+msgstr ""
+
+msgid "Create project label"
+msgstr ""
+
+msgid "Create release"
+msgstr ""
+
+msgid "Create requirement"
+msgstr ""
+
+msgid "Create service account"
+msgstr ""
+
+msgid "Create snippet"
+msgstr ""
+
+msgid "Create tag %{tagName}"
+msgstr ""
+
+msgid "Create topic"
+msgstr ""
+
+msgid "Create user"
+msgstr ""
+
+msgid "Create wildcard: %{searchTerm}"
+msgstr ""
+
+msgid "Create your first page"
+msgstr ""
+
+msgid "Create your group"
+msgstr ""
+
+msgid "Create/import your first project"
+msgstr ""
+
+msgid "CreateGroup|You don’t have permission to create a subgroup in this group."
+msgstr ""
+
+msgid "CreateGroup|You don’t have permission to create groups."
+msgstr ""
+
+msgid "CreateTag|Tag"
+msgstr ""
+
+msgid "CreateValueStreamForm|%{name} (default)"
+msgstr ""
+
+msgid "CreateValueStreamForm|'%{name}' Value Stream created"
+msgstr ""
+
+msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
+msgstr ""
+
+msgid "CreateValueStreamForm|Add another stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Add stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|All default stages are currently visible"
+msgstr ""
+
+msgid "CreateValueStreamForm|Code stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create from default template"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create from no template"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create new Value Stream"
+msgstr ""
+
+msgid "CreateValueStreamForm|Create value stream"
+msgstr ""
+
+msgid "CreateValueStreamForm|Default stages"
+msgstr ""
+
+msgid "CreateValueStreamForm|Default stages can only be hidden or re-ordered"
+msgstr ""
+
+msgid "CreateValueStreamForm|Edit value stream"
+msgstr ""
+
+msgid "CreateValueStreamForm|Editing stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|End event"
+msgstr ""
+
+msgid "CreateValueStreamForm|End event label"
+msgstr ""
+
+msgid "CreateValueStreamForm|End event: "
+msgstr ""
+
+msgid "CreateValueStreamForm|Enter stage name"
+msgstr ""
+
+msgid "CreateValueStreamForm|Enter value stream name"
+msgstr ""
+
+msgid "CreateValueStreamForm|Issue stage end"
+msgstr ""
+
+msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
+msgstr ""
+
+msgid "CreateValueStreamForm|Name is required"
+msgstr ""
+
+msgid "CreateValueStreamForm|New stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Plan stage start"
+msgstr ""
+
+msgid "CreateValueStreamForm|Please select a start event first"
+msgstr ""
+
+msgid "CreateValueStreamForm|Please select an end event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Recover hidden stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Restore defaults"
+msgstr ""
+
+msgid "CreateValueStreamForm|Restore stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Save value stream"
+msgstr ""
+
+msgid "CreateValueStreamForm|Select end event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Select start event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Stage %{index}"
+msgstr ""
+
+msgid "CreateValueStreamForm|Stage name already exists"
+msgstr ""
+
+msgid "CreateValueStreamForm|Stage name is required"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event changed, please select a valid end event"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event label"
+msgstr ""
+
+msgid "CreateValueStreamForm|Start event: "
+msgstr ""
+
+msgid "CreateValueStreamForm|Update stage"
+msgstr ""
+
+msgid "CreateValueStreamForm|Value Stream name"
+msgstr ""
+
+msgid "Created"
+msgstr ""
+
+msgid "Created %{epicTimeagoDate}"
+msgstr ""
+
+msgid "Created %{timestamp}"
+msgstr ""
+
+msgid "Created At"
+msgstr ""
+
+msgid "Created On"
+msgstr ""
+
+msgid "Created a branch and a merge request to resolve this issue."
+msgstr ""
+
+msgid "Created branch '%{branch_name}' and a merge request to resolve this issue."
+msgstr ""
+
+msgid "Created by %{job}"
+msgstr ""
+
+msgid "Created by me"
+msgstr ""
+
+msgid "Created by:"
+msgstr ""
+
+msgid "Created compliance violations if any were found"
+msgstr ""
+
+msgid "Created date"
+msgstr ""
+
+msgid "Created issue %{issueLink}"
+msgstr ""
+
+msgid "Created issue %{issueLink} at %{projectLink}"
+msgstr ""
+
+msgid "Created merge request %{mergeRequestLink}"
+msgstr ""
+
+msgid "Created merge request %{mergeRequestLink} at %{projectLink}"
+msgstr ""
+
+msgid "Created on"
+msgstr ""
+
+msgid "Created on %{created_at}"
+msgstr ""
+
+msgid "Created on:"
+msgstr ""
+
+msgid "Creates a branch and a merge request to resolve this issue."
+msgstr ""
+
+msgid "Creates branch '%{branch_name}' and a merge request to resolve this issue."
+msgstr ""
+
+msgid "Creating"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
+msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
+msgstr ""
+
+msgid "Creation date"
+msgstr ""
+
+msgid "Creator"
+msgstr ""
+
+msgid "Credentials"
+msgstr ""
+
+msgid "CredentialsInventory|GPG Keys"
+msgstr ""
+
+msgid "CredentialsInventory|No credentials found"
+msgstr ""
+
+msgid "CredentialsInventory|Personal Access Tokens"
+msgstr ""
+
+msgid "CredentialsInventory|Project Access Tokens"
+msgstr ""
+
+msgid "CredentialsInventory|SSH Keys"
+msgstr ""
+
+msgid "Credit card required to be on file in order to create a pipeline"
+msgstr ""
+
+msgid "Credit card:"
+msgstr ""
+
+msgid "Critical vulnerabilities present"
+msgstr ""
+
+msgid "Crm|Contact has been added."
+msgstr ""
+
+msgid "Crm|Contact has been updated."
+msgstr ""
+
+msgid "Crm|Customer relations contacts"
+msgstr ""
+
+msgid "Crm|Customer relations organizations"
+msgstr ""
+
+msgid "Crm|Default rate"
+msgstr ""
+
+msgid "Crm|Edit contact"
+msgstr ""
+
+msgid "Crm|Edit organization"
+msgstr ""
+
+msgid "Crm|New contact"
+msgstr ""
+
+msgid "Crm|New organization"
+msgstr ""
+
+msgid "Crm|No contacts found"
+msgstr ""
+
+msgid "Crm|No organizations found"
+msgstr ""
+
+msgid "Crm|Organization has been added."
+msgstr ""
+
+msgid "Crm|Organization has been updated."
+msgstr ""
+
+msgid "Cron Timezone"
+msgstr ""
+
+msgid "Cron time zone"
+msgstr ""
+
+msgid "Crowd"
+msgstr ""
+
+msgid "CsvParser|Failed to render the CSV file for the following reasons:"
+msgstr ""
+
+msgid "CsvParser|Quoted field unterminated"
+msgstr ""
+
+msgid "CsvParser|Too few fields"
+msgstr ""
+
+msgid "CsvParser|Too many fields"
+msgstr ""
+
+msgid "CsvParser|Trailing quote on quoted field is malformed"
+msgstr ""
+
+msgid "CsvParser|Unable to auto-detect delimiter; defaulted to \",\""
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Current Branch"
+msgstr ""
+
+msgid "Current Project"
+msgstr ""
+
+msgid "Current forks will keep their visibility level."
+msgstr ""
+
+msgid "Current node must be the primary node or you will be locking yourself out"
+msgstr ""
+
+msgid "Current password"
+msgstr ""
+
+msgid "Current sign-in IP:"
+msgstr ""
+
+msgid "Current sign-in at:"
+msgstr ""
+
+msgid "Current sign-in ip"
+msgstr ""
+
+msgid "Current vulnerabilities count"
+msgstr ""
+
+msgid "CurrentUser|Buy Pipeline minutes"
+msgstr ""
+
+msgid "CurrentUser|Edit profile"
+msgstr ""
+
+msgid "CurrentUser|One of your groups is running out"
+msgstr ""
+
+msgid "CurrentUser|Preferences"
+msgstr ""
+
+msgid "CurrentUser|Start an Ultimate trial"
+msgstr ""
+
+msgid "CurrentUser|Upgrade"
+msgstr ""
+
+msgid "Custom Attributes"
+msgstr ""
+
+msgid "Custom Git clone URL for HTTP(S)"
+msgstr ""
+
+msgid "Custom analyzers: language support"
+msgstr ""
+
+msgid "Custom hostname (for private commit emails)"
+msgstr ""
+
+msgid "Custom metrics"
+msgstr ""
+
+msgid "Custom notification events"
+msgstr ""
+
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
+msgstr ""
+
+msgid "Custom project templates"
+msgstr ""
+
+msgid "Custom project templates have not been set up for groups that you are a member of. They are enabled from a group’s settings page. Contact your group’s Owner or Maintainer to setup custom project templates."
+msgstr ""
+
+msgid "Custom range"
+msgstr ""
+
+msgid "Custom range (UTC)"
+msgstr ""
+
+msgid "Customer experience improvement and third-party offers"
+msgstr ""
+
+msgid "Customer relations"
+msgstr ""
+
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
+msgstr ""
+
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize icon"
+msgstr ""
+
+msgid "Customize language and region related settings."
+msgstr ""
+
+msgid "Customize name"
+msgstr ""
+
+msgid "Customize your pipeline configuration and coverage report."
+msgstr ""
+
+msgid "Customize your pipeline configuration."
+msgstr ""
+
+msgid "Cycle Time"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|%{label_reference} label was added to the issue"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|%{label_reference} label was added to the merge request"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the issue"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the merge request"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue closed"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue created"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue first added to a board"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue first associated with a milestone"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue first associated with a milestone or issue first added to a board"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue first mentioned in a commit"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue label was added"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue label was removed"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Issue last edited"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request closed"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request created"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request first commit time"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request first deployed to production"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request label was added"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request label was removed"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request last build finish time"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request last build start time"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request last edited"
+msgstr ""
+
+msgid "CycleAnalyticsEvent|Merge request merged"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Code"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Issue"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Plan"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Review"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Staging"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Test"
+msgstr ""
+
+msgid "CycleAnalyticsStage|Total"
+msgstr ""
+
+msgid "CycleAnalyticsStage|is not available for the selected group"
+msgstr ""
+
+msgid "CycleAnalyticsStage|should be under a group"
+msgstr ""
+
+msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
+msgid "CycleAnalytics|Average time to completion"
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
+msgid "CycleAnalytics|Date"
+msgstr ""
+
+msgid "CycleAnalytics|Display chart filters"
+msgstr ""
+
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
+msgid "CycleAnalytics|Lead Time for Changes"
+msgstr ""
+
+msgid "CycleAnalytics|Number of tasks"
+msgstr ""
+
+msgid "CycleAnalytics|Only %{maxLabels} labels can be selected at this time"
+msgstr ""
+
+msgid "CycleAnalytics|Project selected"
+msgid_plural "CycleAnalytics|%d projects selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CycleAnalytics|Select labels"
+msgstr ""
+
+msgid "CycleAnalytics|Show"
+msgstr ""
+
+msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} label"
+msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
+msgstr ""
+
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
+msgstr ""
+
+msgid "CycleAnalytics|Stage time: %{title}"
+msgstr ""
+
+msgid "CycleAnalytics|Tasks by type"
+msgstr ""
+
+msgid "CycleAnalytics|The average time items spent in this stage. Data limited to items completed within this date range."
+msgstr ""
+
+msgid "CycleAnalytics|The given date range is larger than 180 days"
+msgstr ""
+
+msgid "CycleAnalytics|The total time items spent across each value stream stage. Data limited to items completed within this date range."
+msgstr ""
+
+msgid "CycleAnalytics|There is no data for 'Stage time' available. Adjust the current filters."
+msgstr ""
+
+msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
+msgstr ""
+
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
+msgid "CycleAnalytics|Total time"
+msgstr ""
+
+msgid "CycleAnalytics|Type of work"
+msgstr ""
+
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
+msgid "CycleAnalytics|group dropdown filter"
+msgstr ""
+
+msgid "CycleAnalytics|not allowed for the given start event"
+msgstr ""
+
+msgid "CycleAnalytics|project dropdown filter"
+msgstr ""
+
+msgid "DAG visualization requires at least 3 dependent jobs."
+msgstr ""
+
+msgid "DAST Configuration"
+msgstr ""
+
+msgid "DAST profile not found: %{name}"
+msgstr ""
+
+msgid "DAST profiles"
+msgstr ""
+
+msgid "DNS"
+msgstr ""
+
+msgid "DORA4Metrics|%{startDate} - %{endDate}"
+msgstr ""
+
+msgid "DORA4Metrics|Average (last %{days}d)"
+msgstr ""
+
+msgid "DORA4Metrics|Date"
+msgstr ""
+
+msgid "DORA4Metrics|Days from merge to deploy"
+msgstr ""
+
+msgid "DORA4Metrics|Deployment frequency"
+msgstr ""
+
+msgid "DORA4Metrics|Lead time for changes"
+msgstr ""
+
+msgid "DORA4Metrics|Median (last %{days}d)"
+msgstr ""
+
+msgid "DORA4Metrics|No merge requests were deployed during this period"
+msgstr ""
+
+msgid "DORA4Metrics|Number of deployments"
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
+msgstr ""
+
+msgid "DORA4Metrics|Something went wrong while getting lead time data."
+msgstr ""
+
+msgid "DORA4Metrics|The chart displays the frequency of deployments to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
+msgstr ""
+
+msgid "DORA4Metrics|The chart displays the median time between a merge request being merged and deployed to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
+msgstr ""
+
+msgid "DSN"
+msgstr ""
+
+msgid "Dashboard"
+msgstr ""
+
+msgid "Dashboard uid not found"
+msgstr ""
+
+msgid "DashboardProjects|All"
+msgstr ""
+
+msgid "DashboardProjects|Personal"
+msgstr ""
+
+msgid "DashboardProjects|Trending"
+msgstr ""
+
+msgid "Dashboard|%{firstProject} and %{secondProject}"
+msgstr ""
+
+msgid "Dashboard|%{firstProject}, %{rest}, and %{secondProject}"
+msgstr ""
+
+msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
+msgstr ""
+
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
+msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
+msgstr ""
+
+msgid "DastProfiles|AJAX spider"
+msgstr ""
+
+msgid "DastProfiles|API"
+msgstr ""
+
+msgid "DastProfiles|API endpoint URL"
+msgstr ""
+
+msgid "DastProfiles|Active"
+msgstr ""
+
+msgid "DastProfiles|Additional request headers (optional)"
+msgstr ""
+
+msgid "DastProfiles|Are you sure you want to delete this profile?"
+msgstr ""
+
+msgid "DastProfiles|Authentication"
+msgstr ""
+
+msgid "DastProfiles|Authentication URL"
+msgstr ""
+
+msgid "DastProfiles|Branch missing"
+msgstr ""
+
+msgid "DastProfiles|Choose a scan method"
+msgstr ""
+
+msgid "DastProfiles|Could not create the scanner profile. Please try again."
+msgstr ""
+
+msgid "DastProfiles|Could not create the site profile. Please try again."
+msgstr ""
+
+msgid "DastProfiles|Could not delete scanner profile. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "DastProfiles|Could not delete scanner profiles:"
+msgstr ""
+
+msgid "DastProfiles|Could not delete site profile. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "DastProfiles|Could not delete site profiles:"
+msgstr ""
+
+msgid "DastProfiles|Could not fetch scanner profiles. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "DastProfiles|Could not fetch site profiles. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "DastProfiles|Could not update the scanner profile. Please try again."
+msgstr ""
+
+msgid "DastProfiles|Could not update the site profile. Please try again."
+msgstr ""
+
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
+msgid "DastProfiles|Debug messages"
+msgstr ""
+
+msgid "DastProfiles|Delete profile"
+msgstr ""
+
+msgid "DastProfiles|Do you want to discard this scanner profile?"
+msgstr ""
+
+msgid "DastProfiles|Do you want to discard this site profile?"
+msgstr ""
+
+msgid "DastProfiles|Do you want to discard your changes?"
+msgstr ""
+
+msgid "DastProfiles|Edit profile"
+msgstr ""
+
+msgid "DastProfiles|Edit scanner profile"
+msgstr ""
+
+msgid "DastProfiles|Edit site profile"
+msgstr ""
+
+msgid "DastProfiles|Enable Authentication"
+msgstr ""
+
+msgid "DastProfiles|Enter URLs in a comma-separated list."
+msgstr ""
+
+msgid "DastProfiles|Enter headers in a comma-separated list."
+msgstr ""
+
+msgid "DastProfiles|Error Details"
+msgstr ""
+
+msgid "DastProfiles|Excluded URLs"
+msgstr ""
+
+msgid "DastProfiles|Excluded URLs (optional)"
+msgstr ""
+
+msgid "DastProfiles|Excluded paths"
+msgstr ""
+
+msgid "DastProfiles|Excluded paths (optional)"
+msgstr ""
+
+msgid "DastProfiles|Hide debug messages"
+msgstr ""
+
+msgid "DastProfiles|Include debug messages in the DAST console output."
+msgstr ""
+
+msgid "DastProfiles|Manage profiles"
+msgstr ""
+
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
+msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
+msgstr ""
+
+msgid "DastProfiles|Minimum = 1 second, Maximum = 3600 seconds"
+msgstr ""
+
+msgid "DastProfiles|New scanner profile"
+msgstr ""
+
+msgid "DastProfiles|New site profile"
+msgstr ""
+
+msgid "DastProfiles|No scanner profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|No site profiles created yet"
+msgstr ""
+
+msgid "DastProfiles|Not Validated"
+msgstr ""
+
+msgid "DastProfiles|Passive"
+msgstr ""
+
+msgid "DastProfiles|Password"
+msgstr ""
+
+msgid "DastProfiles|Password form field"
+msgstr ""
+
+msgid "DastProfiles|Profile name"
+msgstr ""
+
+msgid "DastProfiles|Request header names and values. Headers are added to every request made by DAST."
+msgstr ""
+
+msgid "DastProfiles|Request headers"
+msgstr ""
+
+msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
+msgstr ""
+
+msgid "DastProfiles|Save commonly used configurations for target sites and scan specifications as profiles. Use these with an on-demand scan."
+msgstr ""
+
+msgid "DastProfiles|Save profile"
+msgstr ""
+
+msgid "DastProfiles|Scan method"
+msgstr ""
+
+msgid "DastProfiles|Scan mode"
+msgstr ""
+
+msgid "DastProfiles|Scanner Profile"
+msgstr ""
+
+msgid "DastProfiles|Scanner Profiles"
+msgstr ""
+
+msgid "DastProfiles|Scanner name"
+msgstr ""
+
+msgid "DastProfiles|Select branch"
+msgstr ""
+
+msgid "DastProfiles|Show debug messages"
+msgstr ""
+
+msgid "DastProfiles|Site Profile"
+msgstr ""
+
+msgid "DastProfiles|Site Profiles"
+msgstr ""
+
+msgid "DastProfiles|Site name"
+msgstr ""
+
+msgid "DastProfiles|Site type"
+msgstr ""
+
+msgid "DastProfiles|Spider timeout"
+msgstr ""
+
+msgid "DastProfiles|Target URL"
+msgstr ""
+
+msgid "DastProfiles|Target timeout"
+msgstr ""
+
+msgid "DastProfiles|The maximum number of minutes allowed for the spider to traverse the site."
+msgstr ""
+
+msgid "DastProfiles|The maximum number of seconds allowed for the site under test to respond to a request."
+msgstr ""
+
+msgid "DastProfiles|This profile is currently being used in a policy."
+msgstr ""
+
+msgid "DastProfiles|This scanner profile is currently being used by a policy. To make edits you must remove it from the active policy."
+msgstr ""
+
+msgid "DastProfiles|This site profile is currently being used by a policy. To make edits you must remove it from the active policy."
+msgstr ""
+
+msgid "DastProfiles|Turn on AJAX spider"
+msgstr ""
+
+msgid "DastProfiles|URL"
+msgstr ""
+
+msgid "DastProfiles|URLs to skip during the authenticated scan."
+msgstr ""
+
+msgid "DastProfiles|Username"
+msgstr ""
+
+msgid "DastProfiles|Username form field"
+msgstr ""
+
+msgid "DastProfiles|Validated"
+msgstr ""
+
+msgid "DastProfiles|Validation status"
+msgstr ""
+
+msgid "DastProfiles|Website"
+msgstr ""
+
+msgid "DastProfiles|What does each method do?"
+msgstr ""
+
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgstr ""
+
+msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
+msgstr ""
+
+msgid "DastProfiles|folder/dast_example.har or https://example.com/dast_example.har"
+msgstr ""
+
+msgid "DastProfiles|folder/example.postman_collection.json or https://example.com/"
+msgstr ""
+
+msgid "DastProfiles|folder/openapi.json or https://example.com/openapi.json"
+msgstr ""
+
+msgid "DastSiteValidation|Copy HTTP header to clipboard"
+msgstr ""
+
+msgid "DastSiteValidation|Copy Meta tag to clipboard"
+msgstr ""
+
+msgid "DastSiteValidation|Could not create validation token. Please try again."
+msgstr ""
+
+msgid "DastSiteValidation|Could not revoke validation. Please try again."
+msgstr ""
+
+msgid "DastSiteValidation|Download validation text file"
+msgstr ""
+
+msgid "DastSiteValidation|Header validation"
+msgstr ""
+
+msgid "DastSiteValidation|Meta tag validation"
+msgstr ""
+
+msgid "DastSiteValidation|Retry validation"
+msgstr ""
+
+msgid "DastSiteValidation|Revoke validation"
+msgstr ""
+
+msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgstr ""
+
+msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgstr ""
+
+msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgstr ""
+
+msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgstr ""
+
+msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgstr ""
+
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgstr ""
+
+msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgstr ""
+
+msgid "DastSiteValidation|Text file validation"
+msgstr ""
+
+msgid "DastSiteValidation|The validation has failed. Please try again."
+msgstr ""
+
+msgid "DastSiteValidation|The validation is in progress. Please wait..."
+msgstr ""
+
+msgid "DastSiteValidation|This will affect %d other profile targeting the same URL."
+msgid_plural "DastSiteValidation|This will affect %d other profiles targeting the same URL."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+msgstr ""
+
+msgid "DastSiteValidation|Validate"
+msgstr ""
+
+msgid "DastSiteValidation|Validate target site"
+msgstr ""
+
+msgid "DastSiteValidation|Validated"
+msgstr ""
+
+msgid "DastSiteValidation|Validating..."
+msgstr ""
+
+msgid "DastSiteValidation|Validation failed"
+msgstr ""
+
+msgid "DastSiteValidation|Validation failed for %{url}. %{retryButtonStart}Retry validation%{retryButtonEnd}."
+msgstr ""
+
+msgid "DastSiteValidation|Validation succeeded. Both active and passive scans can be run against the target site."
+msgstr ""
+
+msgid "DastSiteValidation|You will not be able to run active scans against %{url}."
+msgstr ""
+
+msgid "Data is still calculating..."
+msgstr ""
+
+msgid "Data refresh"
+msgstr ""
+
+msgid "Data type"
+msgstr ""
+
+msgid "Database update failed"
+msgstr ""
+
+msgid "DatadogIntegration|%{linkOpen}API key%{linkClose} used for authentication with Datadog."
+msgstr ""
+
+msgid "DatadogIntegration|(Advanced) The full URL for your Datadog site."
+msgstr ""
+
+msgid "DatadogIntegration|API URL"
+msgstr ""
+
+msgid "DatadogIntegration|Custom tags in Datadog. Enter one tag per line in the %{codeOpen}key:value%{codeClose} format. %{linkOpen}How do I use tags?%{linkClose}"
+msgstr ""
+
+msgid "DatadogIntegration|Environment"
+msgstr ""
+
+msgid "DatadogIntegration|For self-managed deployments, set the %{codeOpen}env%{codeClose} tag for all the data sent to Datadog. %{linkOpen}How do I use tags?%{linkClose}"
+msgstr ""
+
+msgid "DatadogIntegration|How do I set up this integration?"
+msgstr ""
+
+msgid "DatadogIntegration|Send CI/CD pipeline information to Datadog to monitor for job failures and troubleshoot performance issues. %{docs_link}"
+msgstr ""
+
+msgid "DatadogIntegration|Service"
+msgstr ""
+
+msgid "DatadogIntegration|Tag all data from this GitLab instance in Datadog. Useful when managing several self-managed deployments."
+msgstr ""
+
+msgid "DatadogIntegration|Tags"
+msgstr ""
+
+msgid "DatadogIntegration|The Datadog site to send data to. To send data to the EU site, use %{codeOpen}datadoghq.eu%{codeClose}."
+msgstr ""
+
+msgid "DatadogIntegration|Trace your GitLab pipelines with Datadog."
+msgstr ""
+
+msgid "DatadogIntegration|have an invalid format"
+msgstr ""
+
+msgid "Datasource name not found"
+msgstr ""
+
+msgid "Date"
+msgstr ""
+
+msgid "Date merged"
+msgstr ""
+
+msgid "Date range"
+msgstr ""
+
+msgid "Date range limited to %{number} days"
+msgstr ""
+
+msgid "Date range must be shorter than %{max_range} days."
+msgstr ""
+
+msgid "Day of month"
+msgstr ""
+
+msgid "DayTitle|F"
+msgstr ""
+
+msgid "DayTitle|M"
+msgstr ""
+
+msgid "DayTitle|S"
+msgstr ""
+
+msgid "DayTitle|W"
+msgstr ""
+
+msgid "Days"
+msgstr ""
+
+msgid "Days to merge"
+msgstr ""
+
+msgid "Deactivate dormant users after 90 days of inactivity"
+msgstr ""
+
+msgid "Dear Administrator,"
+msgstr ""
+
+msgid "Debian package already exists in Distribution"
+msgstr ""
+
+msgid "Debug"
+msgstr ""
+
+msgid "Dec"
+msgstr ""
+
+msgid "December"
+msgstr ""
+
+msgid "Decline"
+msgstr ""
+
+msgid "Decline and sign out"
+msgstr ""
+
+msgid "Decompressed archive size validation failed."
+msgstr ""
+
+msgid "Decrease"
+msgstr ""
+
+msgid "Default CI/CD configuration file"
+msgstr ""
+
+msgid "Default artifacts expiration"
+msgstr ""
+
+msgid "Default branch"
+msgstr ""
+
+msgid "Default branch and protected branches"
+msgstr ""
+
+msgid "Default delayed project deletion"
+msgstr ""
+
+msgid "Default deletion delay"
+msgstr ""
+
+msgid "Default description template for issues"
+msgstr ""
+
+msgid "Default description template for merge requests"
+msgstr ""
+
+msgid "Default first day of the week"
+msgstr ""
+
+msgid "Default first day of the week in calendars and date pickers."
+msgstr ""
+
+msgid "Default project deletion protection"
+msgstr ""
+
+msgid "Default projects limit"
+msgstr ""
+
+msgid "Default timeout"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
+msgid "DefaultBranchLabel|default"
+msgstr ""
+
+msgid "DefaultBranchProtection|Both developers and maintainers can push new commits, but cannot force push."
+msgstr ""
+
+msgid "DefaultBranchProtection|Both developers and maintainers can push new commits, force push, or delete the branch."
+msgstr ""
+
+msgid "DefaultBranchProtection|Developers cannot push new commits, but are allowed to accept merge requests to the branch. Maintainers can push to the branch."
+msgstr ""
+
+msgid "DefaultBranchProtection|Developers cannot push new commits, but maintainers can. No one can force push."
+msgstr ""
+
+msgid "DefaultBranchProtection|Fully protected"
+msgstr ""
+
+msgid "DefaultBranchProtection|Not protected"
+msgstr ""
+
+msgid "DefaultBranchProtection|Partially protected"
+msgstr ""
+
+msgid "DefaultBranchProtection|Protected against pushes"
+msgstr ""
+
+msgid "Define a custom deploy freeze pattern with %{cronSyntaxStart}cron syntax%{cronSyntaxEnd}"
+msgstr ""
+
+msgid "Define a custom pattern with cron syntax"
+msgstr ""
+
+msgid "Define custom rules for what constitutes spam, independent of Akismet"
+msgstr ""
+
+msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
+msgstr ""
+
+msgid "Define how approval rules are applied to merge requests."
+msgstr ""
+
+msgid "Definition"
+msgstr ""
+
+msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
+msgid "DelayedJobs|Start now"
+msgstr ""
+
+msgid "DelayedJobs|Unschedule"
+msgstr ""
+
+msgid "DelayedJobs|delayed"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+msgid "Delete %{issuableType}"
+msgstr ""
+
+msgid "Delete %{name}"
+msgstr ""
+
+msgid "Delete Comment"
+msgstr ""
+
+msgid "Delete Key"
+msgstr ""
+
+msgid "Delete Selected"
+msgstr ""
+
+msgid "Delete Value Stream"
+msgstr ""
+
+msgid "Delete account"
+msgstr ""
+
+msgid "Delete artifacts"
+msgstr ""
+
+msgid "Delete badge"
+msgstr ""
+
+msgid "Delete column"
+msgstr ""
+
+msgid "Delete comment"
+msgstr ""
+
+msgid "Delete corpus"
+msgstr ""
+
+msgid "Delete deploy key"
+msgstr ""
+
+msgid "Delete file"
+msgstr ""
+
+msgid "Delete image repository"
+msgstr ""
+
+msgid "Delete label"
+msgstr ""
+
+msgid "Delete label: %{labelName}"
+msgstr ""
+
+msgid "Delete pipeline"
+msgstr ""
+
+msgid "Delete pipeline schedule"
+msgstr ""
+
+msgid "Delete project"
+msgstr ""
+
+msgid "Delete row"
+msgstr ""
+
+msgid "Delete self monitoring project"
+msgstr ""
+
+msgid "Delete snippet"
+msgstr ""
+
+msgid "Delete snippet?"
+msgstr ""
+
+msgid "Delete source branch"
+msgstr ""
+
+msgid "Delete subscription"
+msgstr ""
+
+msgid "Delete table"
+msgstr ""
+
+msgid "Delete this attachment"
+msgstr ""
+
+msgid "Delete this epic and all descendants?"
+msgstr ""
+
+msgid "Delete this project"
+msgstr ""
+
+msgid "Delete user list"
+msgstr ""
+
+msgid "Delete variable"
+msgstr ""
+
+msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove project repository. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove project snippets. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove some tags in project container registry. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove webhooks. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to remove wiki repository. Please try again or contact administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to restore project repository. Please contact the administrator."
+msgstr ""
+
+msgid "DeleteProject|Failed to restore wiki repository. Please contact the administrator."
+msgstr ""
+
+msgid "DeleteValueStream|'%{name}' Value Stream deleted"
+msgstr ""
+
+msgid "DeleteValueStream|Are you sure you want to delete the \"%{name}\" Value Stream?"
+msgstr ""
+
+msgid "DeleteValueStream|Delete %{name}"
+msgstr ""
+
+msgid "Deleted"
+msgstr ""
+
+msgid "Deleted chat nickname: %{chat_name}!"
+msgstr ""
+
+msgid "Deleted projects cannot be restored!"
+msgstr ""
+
+msgid "Deletes the source branch"
+msgstr ""
+
+msgid "Deletes the source branch."
+msgstr ""
+
+msgid "Deleting"
+msgstr ""
+
+msgid "Deleting a project places it into a read-only state until %{date}, at which point the project will be permanently deleted. Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "Deleting the project will delete its repository and all related resources, including issues and merge requests."
+msgstr ""
+
+msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Denied authorization of chat nickname %{user_name}."
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
+msgid "Deny access request"
+msgstr ""
+
+msgid "Dependencies"
+msgstr ""
+
+msgid "Dependencies help page link"
+msgstr ""
+
+msgid "Dependencies|%d additional vulnerability not shown"
+msgid_plural "Dependencies|%d additional vulnerabilities not shown"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Dependencies|%d more"
+msgid_plural "Dependencies|%d more"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Dependencies|%d vulnerability detected"
+msgid_plural "Dependencies|%d vulnerabilities detected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Dependencies|%{remainingLicensesCount} more"
+msgstr ""
+
+msgid "Dependencies|(top level)"
+msgstr ""
+
+msgid "Dependencies|All"
+msgstr ""
+
+msgid "Dependencies|Based on the %{linkStart}latest successful%{linkEnd} scan"
+msgstr ""
+
+msgid "Dependencies|Component"
+msgstr ""
+
+msgid "Dependencies|Component name"
+msgstr ""
+
+msgid "Dependencies|Dependency path"
+msgstr ""
+
+msgid "Dependencies|Export as JSON"
+msgstr ""
+
+msgid "Dependencies|Job failed to generate the dependency list"
+msgstr ""
+
+msgid "Dependencies|Learn more about dependency paths"
+msgstr ""
+
+msgid "Dependencies|License"
+msgstr ""
+
+msgid "Dependencies|Location"
+msgstr ""
+
+msgid "Dependencies|Location and dependency path"
+msgstr ""
+
+msgid "Dependencies|Packager"
+msgstr ""
+
+msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
+msgstr ""
+
+msgid "Dependencies|The component dependency path is based on the lock file. There may be several paths. In these cases, the longest path is displayed."
+msgstr ""
+
+msgid "Dependencies|There may be multiple paths"
+msgstr ""
+
+msgid "Dependencies|Toggle vulnerability list"
+msgstr ""
+
+msgid "Dependencies|Unsupported file(s) detected"
+msgstr ""
+
+msgid "Dependencies|Vulnerable components"
+msgstr ""
+
+msgid "Dependency List"
+msgstr ""
+
+msgid "Dependency List has no entries"
+msgstr ""
+
+msgid "Dependency Proxy"
+msgstr ""
+
+msgid "Dependency Scanning"
+msgstr ""
+
+msgid "Dependency list"
+msgstr ""
+
+msgid "DependencyProxy|Cached %{time}"
+msgstr ""
+
+msgid "DependencyProxy|Clear the Dependency Proxy cache automatically"
+msgstr ""
+
+msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
+msgstr ""
+
+msgid "DependencyProxy|Copy prefix"
+msgstr ""
+
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy feature is limited to public groups for now."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy image prefix"
+msgstr ""
+
+msgid "DependencyProxy|Enable Dependency Proxy"
+msgstr ""
+
+msgid "DependencyProxy|Image list"
+msgstr ""
+
+msgid "DependencyProxy|Storage settings"
+msgstr ""
+
+msgid "DependencyProxy|There are no images in the cache"
+msgstr ""
+
+msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
+msgstr ""
+
+msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
+msgstr ""
+
+msgid "Depends on %d merge request being merged"
+msgid_plural "Depends on %d merge requests being merged"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge request."
+msgid_plural "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge requests."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Deploy"
+msgid_plural "Deploys"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Deploy Keys"
+msgstr ""
+
+msgid "Deploy container based web apps on Google managed clusters"
+msgstr ""
+
+msgid "Deploy freezes"
+msgstr ""
+
+msgid "Deploy key was successfully updated."
+msgstr ""
+
+msgid "Deploy keys"
+msgstr ""
+
+msgid "Deploy keys grant read/write access to all repositories in your instance"
+msgstr ""
+
+msgid "Deploy progress not found. To see pods, ensure your environment matches %{linkStart}deploy board criteria%{linkEnd}."
+msgstr ""
+
+msgid "Deploy static assets and resources to Google managed CDN"
+msgstr ""
+
+msgid "Deploy to..."
+msgstr ""
+
+msgid "DeployBoards|To see deployment progress for your environments, make sure you are deploying to %{codeStart}$KUBE_NAMESPACE%{codeEnd} and annotating with %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} and %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd}."
+msgstr ""
+
+msgid "DeployBoard|Kubernetes Pods"
+msgstr ""
+
+msgid "DeployFreeze|Add a freeze period to prevent unintended releases during a period of time for a given environment. You must update the deployment jobs in %{filename} according to the deploy freezes added here. %{freeze_period_link_start}Learn more.%{freeze_period_link_end}"
+msgstr ""
+
+msgid "DeployFreeze|Add deploy freeze"
+msgstr ""
+
+msgid "DeployFreeze|Delete"
+msgstr ""
+
+msgid "DeployFreeze|Delete deploy freeze?"
+msgstr ""
+
+msgid "DeployFreeze|Delete freeze period"
+msgstr ""
+
+msgid "DeployFreeze|Deploy freeze from %{start} to %{end} in %{timezone} will be removed. Are you sure?"
+msgstr ""
+
+msgid "DeployFreeze|Edit"
+msgstr ""
+
+msgid "DeployFreeze|Freeze end"
+msgstr ""
+
+msgid "DeployFreeze|Freeze start"
+msgstr ""
+
+msgid "DeployFreeze|No deploy freezes exist for this project. To add one, select %{strongStart}Add deploy freeze%{strongEnd}"
+msgstr ""
+
+msgid "DeployFreeze|Specify deploy freezes using %{cron_syntax_link_start}cron syntax%{cron_syntax_link_end}."
+msgstr ""
+
+msgid "DeployFreeze|Time zone"
+msgstr ""
+
+msgid "DeployKeys|+%{count} others"
+msgstr ""
+
+msgid "DeployKeys|Current project"
+msgstr ""
+
+msgid "DeployKeys|Deploy key"
+msgstr ""
+
+msgid "DeployKeys|Enabled deploy keys"
+msgstr ""
+
+msgid "DeployKeys|Error enabling deploy key"
+msgstr ""
+
+msgid "DeployKeys|Error getting deploy keys"
+msgstr ""
+
+msgid "DeployKeys|Error removing deploy key"
+msgstr ""
+
+msgid "DeployKeys|Expand %{count} other projects"
+msgstr ""
+
+msgid "DeployKeys|Grant write permissions to this key"
+msgstr ""
+
+msgid "DeployKeys|Loading deploy keys"
+msgstr ""
+
+msgid "DeployKeys|No deploy keys found. Create one with the form above."
+msgstr ""
+
+msgid "DeployKeys|Privately accessible deploy keys"
+msgstr ""
+
+msgid "DeployKeys|Project usage"
+msgstr ""
+
+msgid "DeployKeys|Publicly accessible deploy keys"
+msgstr ""
+
+msgid "DeployKeys|Read access only"
+msgstr ""
+
+msgid "DeployTokens|Active Deploy Tokens (%{active_tokens})"
+msgstr ""
+
+msgid "DeployTokens|Allows read and write access to the package registry."
+msgstr ""
+
+msgid "DeployTokens|Allows read-only access to registry images."
+msgstr ""
+
+msgid "DeployTokens|Allows read-only access to the package registry."
+msgstr ""
+
+msgid "DeployTokens|Allows read-only access to the repository."
+msgstr ""
+
+msgid "DeployTokens|Allows write access to registry images."
+msgstr ""
+
+msgid "DeployTokens|Copy deploy token"
+msgstr ""
+
+msgid "DeployTokens|Copy username"
+msgstr ""
+
+msgid "DeployTokens|Create a new deploy token for all projects in this group. %{link_start}What are deploy tokens?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Create deploy token"
+msgstr ""
+
+msgid "DeployTokens|Created"
+msgstr ""
+
+msgid "DeployTokens|Deploy tokens"
+msgstr ""
+
+msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and registry images."
+msgstr ""
+
+msgid "DeployTokens|Enter a unique name for your deploy token."
+msgstr ""
+
+msgid "DeployTokens|Enter a username for your token. Defaults to %{code_start}gitlab+deploy-token-{n}%{code_end}."
+msgstr ""
+
+msgid "DeployTokens|Enter an expiration date for your token. Defaults to never expire."
+msgstr ""
+
+msgid "DeployTokens|Expires"
+msgstr ""
+
+msgid "DeployTokens|Group deploy tokens allow access to the packages, repositories, and registry images within the group."
+msgstr ""
+
+msgid "DeployTokens|Name"
+msgstr ""
+
+msgid "DeployTokens|New deploy token"
+msgstr ""
+
+msgid "DeployTokens|Revoke"
+msgstr ""
+
+msgid "DeployTokens|Revoke %{name}"
+msgstr ""
+
+msgid "DeployTokens|Scopes"
+msgstr ""
+
+msgid "DeployTokens|This %{entity_type} has no active Deploy Tokens."
+msgstr ""
+
+msgid "DeployTokens|This action cannot be undone."
+msgstr ""
+
+msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
+msgstr ""
+
+msgid "DeployTokens|Use this token as a password. Save it. This password can %{i_start}not%{i_end} be recovered."
+msgstr ""
+
+msgid "DeployTokens|Username"
+msgstr ""
+
+msgid "DeployTokens|Your new Deploy Token username"
+msgstr ""
+
+msgid "DeployTokens|Your new group deploy token has been created."
+msgstr ""
+
+msgid "DeployTokens|Your new project deploy token has been created."
+msgstr ""
+
+msgid "Deployed"
+msgstr ""
+
+msgid "Deployed to"
+msgstr ""
+
+msgid "Deployed-after"
+msgstr ""
+
+msgid "Deployed-before"
+msgstr ""
+
+msgid "Deploying to"
+msgstr ""
+
+msgid "Deploying to AWS is easy with GitLab"
+msgstr ""
+
+msgid "Deployment"
+msgstr ""
+
+msgid "Deployment Frequency"
+msgstr ""
+
+msgid "Deployment Target|Project deployment target (optional)"
+msgstr ""
+
+msgid "Deployment Target|Select the deployment target"
+msgstr ""
+
+msgid "Deployment frequency"
+msgstr ""
+
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
+msgid "DeploymentTarget|GitLab Pages"
+msgstr ""
+
+msgid "DeploymentTarget|Heroku"
+msgstr ""
+
+msgid "DeploymentTarget|Infrastructure provider (Terraform, Cloudformation, and so on)"
+msgstr ""
+
+msgid "DeploymentTarget|Kubernetes (GKE, EKS, OpenShift, and so on)"
+msgstr ""
+
+msgid "DeploymentTarget|Managed container runtime (Fargate, Cloud Run, DigitalOcean App)"
+msgstr ""
+
+msgid "DeploymentTarget|Mobile app store"
+msgstr ""
+
+msgid "DeploymentTarget|No deployment planned"
+msgstr ""
+
+msgid "DeploymentTarget|Other hosting service"
+msgstr ""
+
+msgid "DeploymentTarget|Registry (package or container)"
+msgstr ""
+
+msgid "DeploymentTarget|Self-managed container runtime (Podman, Docker Swarm, Docker Compose)"
+msgstr ""
+
+msgid "DeploymentTarget|Serverless backend (Lambda, Cloud functions)"
+msgstr ""
+
+msgid "DeploymentTarget|Virtual machine (for example, EC2)"
+msgstr ""
+
+msgid "Deployments"
+msgstr ""
+
+msgid "Deployments|%{deployments} environment impacted."
+msgid_plural "Deployments|%{deployments} environments impacted."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Deployment|API"
+msgstr ""
+
+msgid "Deployment|Cancelled"
+msgstr ""
+
+msgid "Deployment|Created"
+msgstr ""
+
+msgid "Deployment|Deployment ID"
+msgstr ""
+
+msgid "Deployment|Failed"
+msgstr ""
+
+msgid "Deployment|Latest Deployed"
+msgstr ""
+
+msgid "Deployment|Needs Approval"
+msgstr ""
+
+msgid "Deployment|Running"
+msgstr ""
+
+msgid "Deployment|Skipped"
+msgstr ""
+
+msgid "Deployment|Success"
+msgstr ""
+
+msgid "Deployment|This deployment was created using the API"
+msgstr ""
+
+msgid "Deployment|Triggerer"
+msgstr ""
+
+msgid "Deployment|Waiting"
+msgstr ""
+
+msgid "Deployment|blocked"
+msgstr ""
+
+msgid "Deployment|canceled"
+msgstr ""
+
+msgid "Deployment|created"
+msgstr ""
+
+msgid "Deployment|failed"
+msgstr ""
+
+msgid "Deployment|running"
+msgstr ""
+
+msgid "Deployment|skipped"
+msgstr ""
+
+msgid "Deployment|success"
+msgstr ""
+
+msgid "Deprecated API rate limits"
+msgstr ""
+
+msgid "Deprecations|Feature deprecation and removal"
+msgstr ""
+
+msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
+msgstr ""
+
+msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
+msgstr ""
+
+msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
+msgstr ""
+
+msgid "Deprioritize label"
+msgstr ""
+
+msgid "Descending"
+msgstr ""
+
+msgid "Describe the goal of the changes and what reviewers should be aware of."
+msgstr ""
+
+msgid "Description"
+msgstr ""
+
+msgid "Description (optional)"
+msgstr ""
+
+msgid "Description parsed with %{link_start}GitLab Flavored Markdown%{link_end}"
+msgstr ""
+
+msgid "Description parsed with %{link_start}GitLab Flavored Markdown%{link_end}."
+msgstr ""
+
+msgid "Description template"
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Descriptive label"
+msgstr ""
+
+msgid "Design Management files and data"
+msgstr ""
+
+msgid "Design repositories"
+msgstr ""
+
+msgid "Design repository"
+msgstr ""
+
+msgid "DesignManagement|%{current_design} of %{designs_count}"
+msgstr ""
+
+msgid "DesignManagement|%{filename} did not change."
+msgid_plural "DesignManagement|The designs you tried uploading did not change."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "DesignManagement|Adding a design with the same filename replaces the file in a new version."
+msgstr ""
+
+msgid "DesignManagement|Archive design"
+msgstr ""
+
+msgid "DesignManagement|Archive designs"
+msgstr ""
+
+msgid "DesignManagement|Archive selected"
+msgstr ""
+
+msgid "DesignManagement|Archived designs will still be available in previous versions of the design collection."
+msgstr ""
+
+msgid "DesignManagement|Are you sure you want to archive the selected designs?"
+msgstr ""
+
+msgid "DesignManagement|Are you sure you want to cancel changes to this comment?"
+msgstr ""
+
+msgid "DesignManagement|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
+msgid "DesignManagement|Cancel changes"
+msgstr ""
+
+msgid "DesignManagement|Cancel comment confirmation"
+msgstr ""
+
+msgid "DesignManagement|Cancel comment update confirmation"
+msgstr ""
+
+msgid "DesignManagement|Click the image where you'd like to start a new discussion"
+msgstr ""
+
+msgid "DesignManagement|Comment"
+msgstr ""
+
+msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
+msgstr ""
+
+msgid "DesignManagement|Could not add a new comment. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Could not create new discussion. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Could not update discussion. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Could not update note. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Deselect all"
+msgstr ""
+
+msgid "DesignManagement|Designs"
+msgstr ""
+
+msgid "DesignManagement|Discard comment"
+msgstr ""
+
+msgid "DesignManagement|Download design"
+msgstr ""
+
+msgid "DesignManagement|Error uploading a new design. Please try again."
+msgstr ""
+
+msgid "DesignManagement|Go back to designs"
+msgstr ""
+
+msgid "DesignManagement|Go to next design"
+msgstr ""
+
+msgid "DesignManagement|Go to previous design"
+msgstr ""
+
+msgid "DesignManagement|Keep changes"
+msgstr ""
+
+msgid "DesignManagement|Keep comment"
+msgstr ""
+
+msgid "DesignManagement|Learn more about resolving comments"
+msgstr ""
+
+msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
+msgstr ""
+
+msgid "DesignManagement|Resolve thread"
+msgstr ""
+
+msgid "DesignManagement|Resolved Comments"
+msgstr ""
+
+msgid "DesignManagement|Save comment"
+msgstr ""
+
+msgid "DesignManagement|Select all"
+msgstr ""
+
+msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles} and %{moreCount} more."
+msgstr ""
+
+msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles}."
+msgstr ""
+
+msgid "DesignManagement|The maximum number of designs allowed to be uploaded is %{upload_limit}. Please try again."
+msgstr ""
+
+msgid "DesignManagement|There was an error moving your designs. Please upload your designs below."
+msgstr ""
+
+msgid "DesignManagement|To upload designs, you'll need to enable LFS and have an admin enable hashed storage. %{requirements_link_start}More information%{requirements_link_end}"
+msgstr ""
+
+msgid "DesignManagement|Unresolve thread"
+msgstr ""
+
+msgid "DesignManagement|Upload designs"
+msgstr ""
+
+msgid "DesignManagement|Upload skipped. %{reason}"
+msgstr ""
+
+msgid "DesignManagement|Your designs are being copied and are on their way… Please refresh to update."
+msgstr ""
+
+msgid "Designs"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
+msgid "Detail"
+msgstr ""
+
+msgid "Details"
+msgstr ""
+
+msgid "Details (default)"
+msgstr ""
+
+msgid "Detect host keys"
+msgstr ""
+
+msgid "DevOps Adoption"
+msgstr ""
+
+msgid "DevOps Reports"
+msgstr ""
+
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "Devices (optional)"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
+msgid "DevopsAdoption|Add a group to get started"
+msgstr ""
+
+msgid "DevopsAdoption|Add or remove groups"
+msgstr ""
+
+msgid "DevopsAdoption|Add or remove subgroups"
+msgstr ""
+
+msgid "DevopsAdoption|Adopted"
+msgstr ""
+
+msgid "DevopsAdoption|Adoption by group"
+msgstr ""
+
+msgid "DevopsAdoption|Adoption by subgroup"
+msgstr ""
+
+msgid "DevopsAdoption|Adoption over time"
+msgstr ""
+
+msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
+msgstr ""
+
+msgid "DevopsAdoption|Approvals"
+msgstr ""
+
+msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
+msgstr ""
+
+msgid "DevopsAdoption|At least one approval on a merge request"
+msgstr ""
+
+msgid "DevopsAdoption|At least one deploy"
+msgstr ""
+
+msgid "DevopsAdoption|At least one issue created"
+msgstr ""
+
+msgid "DevopsAdoption|At least one merge request created"
+msgstr ""
+
+msgid "DevopsAdoption|At least one pipeline successfully run"
+msgstr ""
+
+msgid "DevopsAdoption|Code owners"
+msgstr ""
+
+msgid "DevopsAdoption|Code owners enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Confirm remove Group"
+msgstr ""
+
+msgid "DevopsAdoption|DAST"
+msgstr ""
+
+msgid "DevopsAdoption|DAST enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Dependency Scanning"
+msgstr ""
+
+msgid "DevopsAdoption|Dependency Scanning enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Deploys"
+msgstr ""
+
+msgid "DevopsAdoption|Dev"
+msgstr ""
+
+msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
+msgstr ""
+
+msgid "DevopsAdoption|Edit groups"
+msgstr ""
+
+msgid "DevopsAdoption|Edit subgroups"
+msgstr ""
+
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Data is updated at the beginning of each month. Last updated: %{timestamp}."
+msgstr ""
+
+msgid "DevopsAdoption|Fuzz Testing"
+msgstr ""
+
+msgid "DevopsAdoption|Fuzz Testing enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Issues"
+msgstr ""
+
+msgid "DevopsAdoption|MRs"
+msgstr ""
+
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
+msgid "DevopsAdoption|No tracked features"
+msgstr ""
+
+msgid "DevopsAdoption|Not adopted"
+msgstr ""
+
+msgid "DevopsAdoption|Ops"
+msgstr ""
+
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
+msgid "DevopsAdoption|Pipelines"
+msgstr ""
+
+msgid "DevopsAdoption|Remove Group"
+msgstr ""
+
+msgid "DevopsAdoption|Remove Group from the table."
+msgstr ""
+
+msgid "DevopsAdoption|Runner configured for project/group"
+msgstr ""
+
+msgid "DevopsAdoption|Runners"
+msgstr ""
+
+msgid "DevopsAdoption|SAST"
+msgstr ""
+
+msgid "DevopsAdoption|SAST enabled for at least one project"
+msgstr ""
+
+msgid "DevopsAdoption|Sec"
+msgstr ""
+
+msgid "DevopsAdoption|There was an error enabling the current group. Please refresh the page."
+msgstr ""
+
+msgid "DevopsAdoption|There was an error fetching Group adoption data. Please refresh the page."
+msgstr ""
+
+msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
+msgstr ""
+
+msgid "DevopsAdoption|This group has no subgroups"
+msgstr ""
+
+msgid "DevopsAdoption|Total number of features adopted"
+msgstr ""
+
+msgid "DevopsAdoption|You cannot remove the group you are currently in."
+msgstr ""
+
+msgid "DevopsReport|DevOps Score"
+msgstr ""
+
+msgid "DevopsReport|DevOps score metrics are based on usage over the last 30 days. Last updated: %{timestamp}."
+msgstr ""
+
+msgid "DevopsReport|High"
+msgstr ""
+
+msgid "DevopsReport|Leader usage"
+msgstr ""
+
+msgid "DevopsReport|Low"
+msgstr ""
+
+msgid "DevopsReport|Moderate"
+msgstr ""
+
+msgid "DevopsReport|Overview"
+msgstr ""
+
+msgid "DevopsReport|Score"
+msgstr ""
+
+msgid "DevopsReport|Your score"
+msgstr ""
+
+msgid "DevopsReport|Your usage"
+msgstr ""
+
+msgid "Didn't receive a confirmation email?"
+msgstr ""
+
+msgid "Didn't receive confirmation instructions?"
+msgstr ""
+
+msgid "Didn't receive unlock instructions?"
+msgstr ""
+
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
+msgstr ""
+
+msgid "Diff limits"
+msgstr ""
+
+msgid "Difference between start date and now"
+msgstr ""
+
+msgid "DiffsCompareBaseBranch|(HEAD)"
+msgstr ""
+
+msgid "DiffsCompareBaseBranch|(base)"
+msgstr ""
+
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|No file name available"
+msgstr ""
+
+msgid "Diffs|Show %{unfoldCount} lines"
+msgstr ""
+
+msgid "Diffs|Show all unchanged lines"
+msgstr ""
+
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|Something went wrong while fetching diff lines."
+msgstr ""
+
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
+msgid "Direct member"
+msgstr ""
+
+msgid "Direct members"
+msgstr ""
+
+msgid "Direct non-authenticated users to this page."
+msgstr ""
+
+msgid "Direct users to this page after they sign out."
+msgstr ""
+
+msgid "Direction"
+msgstr ""
+
+msgid "Directory name"
+msgstr ""
+
+msgid "Disable"
+msgstr ""
+
+msgid "Disable Elasticsearch until indexing completes."
+msgstr ""
+
+msgid "Disable Two-factor Authentication"
+msgstr ""
+
+msgid "Disable What's new"
+msgstr ""
+
+msgid "Disable for this project"
+msgstr ""
+
+msgid "Disable group runners"
+msgstr ""
+
+msgid "Disable two-factor authentication"
+msgstr ""
+
+msgid "Disabled"
+msgstr ""
+
+msgid "Disabled by %{parent} owner"
+msgstr ""
+
+msgid "Disabled mirrors can only be enabled by instance owners. It is recommended that you delete them."
+msgstr ""
+
+msgid "Discard"
+msgstr ""
+
+msgid "Discard all changes"
+msgstr ""
+
+msgid "Discard all changes?"
+msgstr ""
+
+msgid "Discard changes"
+msgstr ""
+
+msgid "Discard changes to %{path}?"
+msgstr ""
+
+msgid "Discard draft"
+msgstr ""
+
+msgid "DiscordService|Discord Notifications"
+msgstr ""
+
+msgid "DiscordService|Send notifications about project events to a Discord channel."
+msgstr ""
+
+msgid "Discover"
+msgstr ""
+
+msgid "Discover GitLab Geo"
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Discover|Check your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of services."
+msgstr ""
+
+msgid "Discover|For code that's already live in production, our dashboards give you an easy way to prioritize any issues that are found, empowering your team to ship quickly and securely."
+msgstr ""
+
+msgid "Discover|GitLab will perform static and dynamic tests on the code of your application, looking for known flaws and report them in the merge request so you can fix them before merging."
+msgstr ""
+
+msgid "Discover|Security capabilities, integrated into your development lifecycle"
+msgstr ""
+
+msgid "Discover|See the other features of the %{linkStart}ultimate plan%{linkEnd}"
+msgstr ""
+
+msgid "Discover|Start a free trial"
+msgstr ""
+
+msgid "Discover|Upgrade now"
+msgstr ""
+
+msgid "Discuss a specific suggestion or question that needs to be resolved."
+msgstr ""
+
+msgid "Discuss a specific suggestion or question."
+msgstr ""
+
+msgid "Discussion to reply to cannot be found"
+msgstr ""
+
+msgid "Disk Usage"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
+msgid "Dismiss %d selected vulnerability as"
+msgid_plural "Dismiss %d selected vulnerabilities as"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Dismiss Alert"
+msgstr ""
+
+msgid "Dismiss merge request promotion"
+msgstr ""
+
+msgid "Dismiss selected"
+msgstr ""
+
+msgid "Dismiss trial promotion"
+msgstr ""
+
+msgid "Dismissable"
+msgstr ""
+
+msgid "Dismissed"
+msgstr ""
+
+msgid "Dismissed at %{projectLink}"
+msgstr ""
+
+msgid "Dismissed on pipeline %{pipelineLink}"
+msgstr ""
+
+msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
+msgstr ""
+
+msgid "Display"
+msgstr ""
+
+msgid "Display alerts from all configured monitoring tools."
+msgstr ""
+
+msgid "Display milestones"
+msgstr ""
+
+msgid "Display name"
+msgstr ""
+
+msgid "Display progress of child issues"
+msgstr ""
+
+msgid "Display rendered file"
+msgstr ""
+
+msgid "Display source"
+msgstr ""
+
+msgid "Display time tracking in issues in total hours only."
+msgstr ""
+
+msgid "Do not display content for customer experience improvement and offers from third parties"
+msgstr ""
+
+msgid "Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}"
+msgstr ""
+
+msgid "Do you want to remove this deploy key?"
+msgstr ""
+
+msgid "Dockerfile"
+msgstr ""
+
+msgid "Documentation"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
+msgid "Documentation pages URL"
+msgstr ""
+
+msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
+msgstr ""
+
+msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
+msgstr ""
+
+msgid "Does not delete the source branch."
+msgstr ""
+
+msgid "Domain"
+msgstr ""
+
+msgid "Domain Name"
+msgstr ""
+
+msgid "Don't have a group?"
+msgstr ""
+
+msgid "Don't have an account yet?"
+msgstr ""
+
+msgid "Don't include description in commit message"
+msgstr ""
+
+msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
+msgstr ""
+
+msgid "Don't send service data"
+msgstr ""
+
+msgid "Don't show again"
+msgstr ""
+
+msgid "Done"
+msgstr ""
+
+msgid "Dormant users"
+msgstr ""
+
+msgid "Download"
+msgstr ""
+
+msgid "Download %{format}"
+msgstr ""
+
+msgid "Download %{format}:"
+msgstr ""
+
+msgid "Download (%{fileSizeReadable})"
+msgstr ""
+
+msgid "Download (%{size})"
+msgstr ""
+
+msgid "Download CSV"
+msgstr ""
+
+msgid "Download PDF"
+msgstr ""
+
+msgid "Download artifacts"
+msgstr ""
+
+msgid "Download as"
+msgstr ""
+
+msgid "Download codes"
+msgstr ""
+
+msgid "Download evidence JSON"
+msgstr ""
+
+msgid "Download export"
+msgstr ""
+
+msgid "Download image"
+msgstr ""
+
+msgid "Download payload"
+msgstr ""
+
+msgid "Download raw data (.csv)"
+msgstr ""
+
+msgid "Download source code"
+msgstr ""
+
+msgid "Download this directory"
+msgstr ""
+
+msgid "DownloadCommit|Email Patches"
+msgstr ""
+
+msgid "DownloadCommit|Plain Diff"
+msgstr ""
+
+msgid "DownloadSource|Download"
+msgstr ""
+
+msgid "Downstream"
+msgstr ""
+
+msgid "Downvotes"
+msgstr ""
+
+msgid "Draft"
+msgstr ""
+
+msgid "Draft: %{filename}"
+msgstr ""
+
+msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
+msgstr ""
+
+msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
+msgstr ""
+
+msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
+msgstr ""
+
+msgid "Drop your designs to start your upload."
+msgstr ""
+
+msgid "Drop your files to start your upload."
+msgstr ""
+
+msgid "DropdownWidget|An error occurred while fetching the assigned %{issuableAttribute} of the selected %{issuableType}."
+msgstr ""
+
+msgid "DropdownWidget|Assign %{issuableAttribute}"
+msgstr ""
+
+msgid "DropdownWidget|Failed to fetch the %{issuableAttribute} for this %{issuableType}. Please try again."
+msgstr ""
+
+msgid "DropdownWidget|Failed to set %{issuableAttribute} on this %{issuableType}. Please try again."
+msgstr ""
+
+msgid "DropdownWidget|No %{issuableAttribute}"
+msgstr ""
+
+msgid "DropdownWidget|No %{issuableAttribute} found"
+msgstr ""
+
+msgid "DropdownWidget|No open %{issuableAttribute} found"
+msgstr ""
+
+msgid "Due Date"
+msgstr ""
+
+msgid "Due date"
+msgstr ""
+
+msgid "Duration"
+msgstr ""
+
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
+msgid "Dynamic Application Security Testing (DAST)"
+msgstr ""
+
+msgid "E-mail:"
+msgstr ""
+
+msgid "Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "Edit %{issuable}"
+msgstr ""
+
+msgid "Edit %{name}"
+msgstr ""
+
+msgid "Edit Comment"
+msgstr ""
+
+msgid "Edit Deploy Key"
+msgstr ""
+
+msgid "Edit Geo Site"
+msgstr ""
+
+msgid "Edit Group Hook"
+msgstr ""
+
+msgid "Edit Identity"
+msgstr ""
+
+msgid "Edit Label"
+msgstr ""
+
+msgid "Edit Milestone"
+msgstr ""
+
+msgid "Edit Password"
+msgstr ""
+
+msgid "Edit Pipeline Schedule"
+msgstr ""
+
+msgid "Edit Release"
+msgstr ""
+
+msgid "Edit Requirement"
+msgstr ""
+
+msgid "Edit Slack integration"
+msgstr ""
+
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit System Hook"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
+msgid "Edit comment"
+msgstr ""
+
+msgid "Edit commit message"
+msgstr ""
+
+msgid "Edit deploy freeze"
+msgstr ""
+
+msgid "Edit deploy key"
+msgstr ""
+
+msgid "Edit description"
+msgstr ""
+
+msgid "Edit environment"
+msgstr ""
+
+msgid "Edit epics"
+msgstr ""
+
+msgid "Edit files in the editor and commit changes here"
+msgstr ""
+
+msgid "Edit fork in Web IDE"
+msgstr ""
+
+msgid "Edit group application"
+msgstr ""
+
+msgid "Edit group: %{group_name}"
+msgstr ""
+
+msgid "Edit identity for %{user_name}"
+msgstr ""
+
+msgid "Edit in pipeline editor"
+msgstr ""
+
+msgid "Edit in single-file editor"
+msgstr ""
+
+msgid "Edit inline"
+msgstr ""
+
+msgid "Edit issues"
+msgstr ""
+
+msgid "Edit merge requests"
+msgstr ""
+
+msgid "Edit public deploy key"
+msgstr ""
+
+msgid "Edit sidebar"
+msgstr ""
+
+msgid "Edit table"
+msgstr ""
+
+msgid "Edit this file only."
+msgstr ""
+
+msgid "Edit this release"
+msgstr ""
+
+msgid "Edit title and description"
+msgstr ""
+
+msgid "Edit topic: %{topic_name}"
+msgstr ""
+
+msgid "Edit user: %{user_name}"
+msgstr ""
+
+msgid "Edit wiki page"
+msgstr ""
+
+msgid "Edit your most recent comment in a thread (from an empty textarea)"
+msgstr ""
+
+msgid "Edit, lint, and visualize your pipeline."
+msgstr ""
+
+msgid "Edited"
+msgstr ""
+
+msgid "Edited %{timeago}"
+msgstr ""
+
+msgid "Editing"
+msgstr ""
+
+msgid "Elapsed time"
+msgstr ""
+
+msgid "Elasticsearch AWS IAM credentials"
+msgstr ""
+
+msgid "Elasticsearch HTTP client timeout value in seconds."
+msgstr ""
+
+msgid "Elasticsearch indexing"
+msgstr ""
+
+msgid "Elasticsearch indexing restrictions"
+msgstr ""
+
+msgid "Elasticsearch indexing started"
+msgstr ""
+
+msgid "Elasticsearch migration halted"
+msgstr ""
+
+msgid "Elasticsearch reindexing is already in progress"
+msgstr ""
+
+msgid "Elasticsearch reindexing triggered"
+msgstr ""
+
+msgid "Elasticsearch reindexing was not started: %{errors}"
+msgstr ""
+
+msgid "Elasticsearch returned status code: %{status_code}"
+msgstr ""
+
+msgid "Elasticsearch zero-downtime reindexing"
+msgstr ""
+
+msgid "Elasticsearch's region."
+msgstr ""
+
+msgid "Elastic|None. Select namespaces to index."
+msgstr ""
+
+msgid "Elastic|None. Select projects to index."
+msgstr ""
+
+msgid "Eligible users"
+msgstr ""
+
+msgid "Email"
+msgstr ""
+
+msgid "Email %{number}"
+msgstr ""
+
+msgid "Email Notification"
+msgstr ""
+
+msgid "Email a new %{name} to this project"
+msgstr ""
+
+msgid "Email address suffix"
+msgstr ""
+
+msgid "Email address to use for Support Desk"
+msgstr ""
+
+msgid "Email could not be sent"
+msgstr ""
+
+msgid "Email display name"
+msgstr ""
+
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Email not verified. Please verify your email in Salesforce."
+msgstr ""
+
+msgid "Email notification for unknown sign-ins"
+msgstr ""
+
+msgid "Email patch"
+msgstr ""
+
+msgid "Email sent"
+msgstr ""
+
+msgid "Email the pipeline status to a list of recipients."
+msgstr ""
+
+msgid "Email updates (optional)"
+msgstr ""
+
+msgid "Email:"
+msgstr ""
+
+msgid "Email: %{email}"
+msgstr ""
+
+msgid "EmailError|It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies."
+msgstr ""
+
+msgid "EmailError|The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member."
+msgstr ""
+
+msgid "EmailError|We couldn't figure out what the email is for. Please create your issue or comment through the web interface."
+msgstr ""
+
+msgid "EmailError|We couldn't figure out what the email is in reply to. Please create your comment through the web interface."
+msgstr ""
+
+msgid "EmailError|We couldn't figure out what user corresponds to the email. Please create your comment through the web interface."
+msgstr ""
+
+msgid "EmailError|We couldn't find the project. Please check if there's any typo."
+msgstr ""
+
+msgid "EmailError|We couldn't process your email because it is too large. Please create your issue or comment through the web interface."
+msgstr ""
+
+msgid "EmailError|You are not allowed to perform this action. If you believe this is in error, contact a staff member."
+msgstr ""
+
+msgid "EmailError|Your account has been blocked. If you believe this is in error, contact a staff member."
+msgstr ""
+
+msgid "EmailParticipantsWarning|%{emails} will be notified of your comment."
+msgstr ""
+
+msgid "EmailParticipantsWarning|%{emails}, %{andMore} will be notified of your comment."
+msgstr ""
+
+msgid "EmailParticipantsWarning|and %{moreCount} more"
+msgstr ""
+
+msgid "Emails"
+msgstr ""
+
+msgid "Emails sent from Service Desk have this name."
+msgstr ""
+
+msgid "Emails sent to %{email} are also supported."
+msgstr ""
+
+msgid "EmailsOnPushService|Disable code diffs"
+msgstr ""
+
+msgid "EmailsOnPushService|Don't include possibly sensitive code diffs in notification body."
+msgstr ""
+
+msgid "EmailsOnPushService|Email the commits and diff of each push to a list of recipients."
+msgstr ""
+
+msgid "EmailsOnPushService|Emails on push"
+msgstr ""
+
+msgid "EmailsOnPushService|Emails separated by whitespace."
+msgstr ""
+
+msgid "EmailsOnPushService|Send from committer"
+msgstr ""
+
+msgid "EmailsOnPushService|Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance (such as %{domains})."
+msgstr ""
+
+msgid "EmailsOnPushService|tanuki@example.com gitlab@example.com"
+msgstr ""
+
+msgid "Embed"
+msgstr ""
+
+msgid "Embed an image of your existing Jaeger server in GitLab."
+msgstr ""
+
+msgid "Empty file"
+msgstr ""
+
+msgid "Enable"
+msgstr ""
+
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
+msgid "Enable Auto DevOps"
+msgstr ""
+
+msgid "Enable Git pack file bitmap creation"
+msgstr ""
+
+msgid "Enable Gitpod"
+msgstr ""
+
+msgid "Enable Gitpod?"
+msgstr ""
+
+msgid "Enable Invisible Captcha during sign up"
+msgstr ""
+
+msgid "Enable Kroki"
+msgstr ""
+
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
+msgid "Enable PlantUML"
+msgstr ""
+
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable Registration Features"
+msgstr ""
+
+msgid "Enable SSL verification"
+msgstr ""
+
+msgid "Enable Sentry error tracking"
+msgstr ""
+
+msgid "Enable Service Ping"
+msgstr ""
+
+msgid "Enable Snowplow tracking"
+msgstr ""
+
+msgid "Enable Spam Check via external API endpoint"
+msgstr ""
+
+msgid "Enable What's new: All tiers"
+msgstr ""
+
+msgid "Enable What's new: Current tier only"
+msgstr ""
+
+msgid "Enable a Prometheus endpoint that exposes health and performance statistics. The Health Check menu item appears in the Monitoring section of the Admin Area. Restart required."
+msgstr ""
+
+msgid "Enable access to the performance bar for non-administrators in a given group."
+msgstr ""
+
+msgid "Enable access tokens to expire after 2 hours. If disabled, tokens do not expire."
+msgstr ""
+
+msgid "Enable admin mode"
+msgstr ""
+
+msgid "Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Enable authenticated API request rate limit"
+msgstr ""
+
+msgid "Enable authenticated Git LFS request rate limit"
+msgstr ""
+
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
+msgid "Enable authentication"
+msgstr ""
+
+msgid "Enable automatic repository housekeeping"
+msgstr ""
+
+msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
+msgstr ""
+
+msgid "Enable container expiration caching."
+msgstr ""
+
+msgid "Enable delayed project deletion by default for newly-created groups."
+msgstr ""
+
+msgid "Enable email notification"
+msgstr ""
+
+msgid "Enable error tracking"
+msgstr ""
+
+msgid "Enable feature to choose access level"
+msgstr ""
+
+msgid "Enable for this project"
+msgstr ""
+
+msgid "Enable group runners"
+msgstr ""
+
+msgid "Enable header and footer in emails"
+msgstr ""
+
+msgid "Enable health and performance metrics endpoint"
+msgstr ""
+
+msgid "Enable in-product marketing emails"
+msgstr ""
+
+msgid "Enable incident management inbound alert limit"
+msgstr ""
+
+msgid "Enable integration"
+msgstr ""
+
+msgid "Enable kuromoji custom analyzer: Indexing"
+msgstr ""
+
+msgid "Enable kuromoji custom analyzer: Search"
+msgstr ""
+
+msgid "Enable logs collection"
+msgstr ""
+
+msgid "Enable maintenance mode"
+msgstr ""
+
+msgid "Enable multipart emails"
+msgstr ""
+
+msgid "Enable only for confidential applications exclusively used by a trusted backend server that can securely store the client secret. Do not enable for native-mobile, single-page, or other JavaScript applications because they cannot keep the client secret confidential."
+msgstr ""
+
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
+msgid "Enable or disable version check and Service Ping."
+msgstr ""
+
+msgid "Enable rate limiting for POST requests to the specified paths"
+msgstr ""
+
+msgid "Enable reCAPTCHA"
+msgstr ""
+
+msgid "Enable reCAPTCHA for login."
+msgstr ""
+
+msgid "Enable repository checks"
+msgstr ""
+
+msgid "Enable security training"
+msgstr ""
+
+msgid "Enable security training to help your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability."
+msgstr ""
+
+msgid "Enable shared runners for all projects and subgroups in this group."
+msgstr ""
+
+msgid "Enable shared runners for this group"
+msgstr ""
+
+msgid "Enable shared runners for this project"
+msgstr ""
+
+msgid "Enable smartcn custom analyzer: Indexing"
+msgstr ""
+
+msgid "Enable smartcn custom analyzer: Search"
+msgstr ""
+
+msgid "Enable two-factor authentication"
+msgstr ""
+
+msgid "Enable unauthenticated API request rate limit"
+msgstr ""
+
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
+msgstr ""
+
+msgid "Enable version check"
+msgstr ""
+
+msgid "EnableReviewApp|%{stepStart}Step 1%{stepEnd}. Ensure you have Kubernetes set up and have a base domain for your %{linkStart}cluster%{linkEnd}."
+msgstr ""
+
+msgid "EnableReviewApp|%{stepStart}Step 2%{stepEnd}. Copy the following snippet:"
+msgstr ""
+
+msgid "EnableReviewApp|%{stepStart}Step 3%{stepEnd}. Add it to the project %{linkStart}gitlab-ci.yml%{linkEnd} file."
+msgstr ""
+
+msgid "EnableReviewApp|%{stepStart}Step 4 (optional)%{stepEnd}. Enable Visual Reviews by following the %{linkStart}setup instructions%{linkEnd}."
+msgstr ""
+
+msgid "EnableReviewApp|Close"
+msgstr ""
+
+msgid "EnableReviewApp|Copy snippet text"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "Enabled Git access protocols"
+msgstr ""
+
+msgid "Enabled OAuth authentication sources"
+msgstr ""
+
+msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
+msgstr ""
+
+msgid "Encountered an error while rendering: %{err}"
+msgstr ""
+
+msgid "End Time"
+msgstr ""
+
+msgid "Ends"
+msgstr ""
+
+msgid "Ends at (UTC)"
+msgstr ""
+
+msgid "Ends on"
+msgstr ""
+
+msgid "Ends: %{endsAt}"
+msgstr ""
+
+msgid "Enforce SSH key expiration"
+msgstr ""
+
+msgid "Enforce personal access token expiration"
+msgstr ""
+
+msgid "Enforce two-factor authentication"
+msgstr ""
+
+msgid "Enforce two-factor authentication for all user sign-ins."
+msgstr ""
+
+msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
+msgstr ""
+
+msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
+msgstr ""
+
+msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
+msgstr ""
+
+msgid "Enter %{weights_link_start}weights%{weights_link_end} for storages for new repositories. Configured storages appear below."
+msgstr ""
+
+msgid "Enter 2FA for Admin Mode"
+msgstr ""
+
+msgid "Enter Admin Mode"
+msgstr ""
+
+msgid "Enter a number"
+msgstr ""
+
+msgid "Enter an integer number between 0 and 100"
+msgstr ""
+
+msgid "Enter any color or choose one of the suggested colors below."
+msgstr ""
+
+msgid "Enter any color."
+msgstr ""
+
+msgid "Enter at least three characters to search"
+msgstr ""
+
+msgid "Enter in your Bitbucket Server URL and personal access token below"
+msgstr ""
+
+msgid "Enter in your Phabricator Server URL and personal access token below"
+msgstr ""
+
+msgid "Enter license key"
+msgstr ""
+
+msgid "Enter merge request URLs"
+msgstr ""
+
+msgid "Enter new AWS Secret Access Key"
+msgstr ""
+
+msgid "Enter number of issues"
+msgstr ""
+
+msgid "Enter one or more user ID separated by commas"
+msgstr ""
+
+msgid "Enter the %{name} description"
+msgstr ""
+
+msgid "Enter the %{name} title"
+msgstr ""
+
+msgid "Enter the code from the two-factor app on your mobile device. If you've lost your device, you may enter one of your recovery codes."
+msgstr ""
+
+msgid "Enter the following to confirm:"
+msgstr ""
+
+msgid "Enter the name of your application, and we'll return a unique %{type}."
+msgstr ""
+
+msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Enter the password for password-protected Elasticsearch servers."
+msgstr ""
+
+msgid "Enter the username for password-protected Elasticsearch servers."
+msgstr ""
+
+msgid "Enter your Packagist server. Defaults to https://packagist.org."
+msgstr ""
+
+msgid "Enter your Packagist token."
+msgstr ""
+
+msgid "Enter your Packagist username."
+msgstr ""
+
+msgid "Enter your password to approve"
+msgstr ""
+
+msgid "Enterprise"
+msgstr ""
+
+msgid "Environment"
+msgid_plural "Environments"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Environment does not have deployments"
+msgstr ""
+
+msgid "Environment is required for Stages::MetricEndpointInserter"
+msgstr ""
+
+msgid "Environment is required for Stages::VariableEndpointInserter"
+msgstr ""
+
+msgid "Environment scope"
+msgstr ""
+
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
+msgstr ""
+
+msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
+msgstr ""
+
+msgid "Environment variables on this GitLab instance are configured to be %{link_start}protected%{link_end} by default."
+msgstr ""
+
+msgid "Environment:"
+msgstr ""
+
+msgid "EnvironmentDashboard|API"
+msgstr ""
+
+msgid "EnvironmentDashboard|Created through the Deployment API"
+msgstr ""
+
+msgid "EnvironmentDashboard|You are looking at the last updated environment"
+msgstr ""
+
+msgid "Environments"
+msgstr ""
+
+msgid "Environments Dashboard"
+msgstr ""
+
+msgid "Environments allow you to track deployments of your application. %{linkStart}More information%{linkEnd}."
+msgstr ""
+
+msgid "Environments in %{name}"
+msgstr ""
+
+msgid "EnvironmentsAlert|%{severity} • %{title} %{text}. %{linkStart}View Details%{linkEnd} · %{startedAt} "
+msgstr ""
+
+msgid "EnvironmentsDashboard|Add a project to the dashboard"
+msgstr ""
+
+msgid "EnvironmentsDashboard|Add projects"
+msgstr ""
+
+msgid "EnvironmentsDashboard|Environments Dashboard"
+msgstr ""
+
+msgid "EnvironmentsDashboard|Job: %{job}"
+msgstr ""
+
+msgid "EnvironmentsDashboard|More actions"
+msgstr ""
+
+msgid "EnvironmentsDashboard|Remove"
+msgstr ""
+
+msgid "EnvironmentsDashboard|The environments dashboard provides a summary of each project's environments' status, including pipeline and alert statuses."
+msgstr ""
+
+msgid "EnvironmentsDashboard|This dashboard displays 3 environments per project, and is linked to the Operations Dashboard. When you add or remove a project from one dashboard, GitLab adds or removes the project from the other. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "Environments|An error occurred while canceling the auto stop, please try again"
+msgstr ""
+
+msgid "Environments|An error occurred while deleting the environment. Check if the environment stopped; if not, stop it and try again."
+msgstr ""
+
+msgid "Environments|An error occurred while fetching the environments."
+msgstr ""
+
+msgid "Environments|An error occurred while making the request."
+msgstr ""
+
+msgid "Environments|An error occurred while re-deploying the environment, please try again"
+msgstr ""
+
+msgid "Environments|An error occurred while rolling back the environment, please try again"
+msgstr ""
+
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
+msgid "Environments|Auto stop"
+msgstr ""
+
+msgid "Environments|Auto stops %{autoStopAt}"
+msgstr ""
+
+msgid "Environments|Commit"
+msgstr ""
+
+msgid "Environments|Currently showing %{fetched} results."
+msgstr ""
+
+msgid "Environments|Currently showing all results."
+msgstr ""
+
+msgid "Environments|Delete"
+msgstr ""
+
+msgid "Environments|Delete '%{environmentName}'?"
+msgstr ""
+
+msgid "Environments|Delete environment"
+msgstr ""
+
+msgid "Environments|Deleting the '%{environmentName}' environment cannot be undone. Do you want to delete it anyway?"
+msgstr ""
+
+msgid "Environments|Deploy to..."
+msgstr ""
+
+msgid "Environments|Deployment"
+msgstr ""
+
+msgid "Environments|Deployment %{status}"
+msgstr ""
+
+msgid "Environments|Enable review app"
+msgstr ""
+
+msgid "Environments|Environment"
+msgstr ""
+
+msgid "Environments|Environments"
+msgstr ""
+
+msgid "Environments|Environments are places where code gets deployed, such as staging or production."
+msgstr ""
+
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
+msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
+msgstr ""
+
+msgid "Environments|Job"
+msgstr ""
+
+msgid "Environments|Learn about environments"
+msgstr ""
+
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
+msgid "Environments|Logs from %{start} to %{end}."
+msgstr ""
+
+msgid "Environments|New environment"
+msgstr ""
+
+msgid "Environments|No deployed environments"
+msgstr ""
+
+msgid "Environments|No deployments yet"
+msgstr ""
+
+msgid "Environments|No pod selected"
+msgstr ""
+
+msgid "Environments|No pods to display"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
+msgstr ""
+
+msgid "Environments|Open"
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod name"
+msgstr ""
+
+msgid "Environments|Re-deploy"
+msgstr ""
+
+msgid "Environments|Re-deploy environment %{name}?"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
+msgstr ""
+
+msgid "Environments|Rollback"
+msgstr ""
+
+msgid "Environments|Rollback environment"
+msgstr ""
+
+msgid "Environments|Rollback environment %{name}?"
+msgstr ""
+
+msgid "Environments|Select pod"
+msgstr ""
+
+msgid "Environments|Show all"
+msgstr ""
+
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
+msgid "Environments|Stopping %{environmentName}"
+msgstr ""
+
+msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
+msgstr ""
+
+msgid "Environments|There was an error fetching the logs. Please try again."
+msgstr ""
+
+msgid "Environments|This action will relaunch the job for commit %{linkStart}%{commitId}%{linkEnd}, putting the environment in a previous version. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Environments|This action will run the job defined by %{name} for commit %{linkStart}%{commitId}%{linkEnd} putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Environments|Upcoming"
+msgstr ""
+
+msgid "Environments|Upcoming deployment"
+msgstr ""
+
+msgid "Environments|Updated"
+msgstr ""
+
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
+
+msgid "Environments|by %{avatar}"
+msgstr ""
+
+msgid "Environments|protected"
+msgstr ""
+
+msgid "Environment|Auto stop %{time}"
+msgstr ""
+
+msgid "Epic"
+msgstr ""
+
+msgid "Epic Boards"
+msgstr ""
+
+msgid "Epic cannot be found."
+msgstr ""
+
+msgid "Epic details"
+msgstr ""
+
+msgid "Epic events"
+msgstr ""
+
+msgid "Epic not found for given params"
+msgstr ""
+
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics and Issues"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Epics, issues, and merge requests"
+msgstr ""
+
+msgid "Epics|%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "Epics|%{startDate} – No due date"
+msgstr ""
+
+msgid "Epics|Add a new epic"
+msgstr ""
+
+msgid "Epics|Add an existing epic"
+msgstr ""
+
+msgid "Epics|An error occurred while saving the %{epicDateType} date"
+msgstr ""
+
+msgid "Epics|An error occurred while updating labels."
+msgstr ""
+
+msgid "Epics|Are you sure you want to remove %{bStart}%{targetIssueTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}?"
+msgstr ""
+
+msgid "Epics|Assign Epic"
+msgstr ""
+
+msgid "Epics|Enter a title for your epic"
+msgstr ""
+
+msgid "Epics|Leave empty to inherit from milestone dates"
+msgstr ""
+
+msgid "Epics|No start date – %{dueDate}"
+msgstr ""
+
+msgid "Epics|Remove epic"
+msgstr ""
+
+msgid "Epics|Remove issue"
+msgstr ""
+
+msgid "Epics|Search epics"
+msgstr ""
+
+msgid "Epics|Select epic"
+msgstr ""
+
+msgid "Epics|Show more"
+msgstr ""
+
+msgid "Epics|Something went wrong while assigning issue to epic."
+msgstr ""
+
+msgid "Epics|Something went wrong while creating child epics."
+msgstr ""
+
+msgid "Epics|Something went wrong while creating issue."
+msgstr ""
+
+msgid "Epics|Something went wrong while fetching child epics."
+msgstr ""
+
+msgid "Epics|Something went wrong while fetching epics list."
+msgstr ""
+
+msgid "Epics|Something went wrong while fetching group epics."
+msgstr ""
+
+msgid "Epics|Something went wrong while moving item."
+msgstr ""
+
+msgid "Epics|Something went wrong while ordering item."
+msgstr ""
+
+msgid "Epics|Something went wrong while removing issue from epic."
+msgstr ""
+
+msgid "Epics|Something went wrong while updating epics."
+msgstr ""
+
+msgid "Epics|This epic and any containing child epics are confidential and should only be visible to team members with at least Reporter access."
+msgstr ""
+
+msgid "Epics|This will also remove any descendents of %{bStart}%{targetEpicTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}. Are you sure?"
+msgstr ""
+
+msgid "Epics|To schedule your epic's %{epicDateType} date based on milestones, assign a milestone with a %{epicDateType} date to any issue in the epic."
+msgstr ""
+
+msgid "Epics|Unable to save epic. Please try again"
+msgstr ""
+
+msgid "Epics|due"
+msgstr ""
+
+msgid "Epics|start"
+msgstr ""
+
+msgid "Error"
+msgstr ""
+
+msgid "Error Details"
+msgstr ""
+
+msgid "Error Tracking"
+msgstr ""
+
+msgid "Error creating epic"
+msgstr ""
+
+msgid "Error creating label."
+msgstr ""
+
+msgid "Error creating new directory. Please try again."
+msgstr ""
+
+msgid "Error creating new iteration"
+msgstr ""
+
+msgid "Error creating repository for snippet with id %{snippet_id}"
+msgstr ""
+
+msgid "Error creating the snippet"
+msgstr ""
+
+msgid "Error deleting project. Check logs for error details."
+msgstr ""
+
+msgid "Error fetching burnup chart data"
+msgstr ""
+
+msgid "Error fetching diverging counts for branches. Please try again."
+msgstr ""
+
+msgid "Error fetching forked projects. Please try again."
+msgstr ""
+
+msgid "Error fetching labels."
+msgstr ""
+
+msgid "Error fetching network graph."
+msgstr ""
+
+msgid "Error fetching payload data."
+msgstr ""
+
+msgid "Error fetching refs"
+msgstr ""
+
+msgid "Error fetching the dependency list. Please check your network connection and try again."
+msgstr ""
+
+msgid "Error loading branch data. Please try again."
+msgstr ""
+
+msgid "Error loading branches."
+msgstr ""
+
+msgid "Error loading burndown chart data"
+msgstr ""
+
+msgid "Error loading countries data."
+msgstr ""
+
+msgid "Error loading file viewer."
+msgstr ""
+
+msgid "Error loading issues"
+msgstr ""
+
+msgid "Error loading iterations"
+msgstr ""
+
+msgid "Error loading last commit."
+msgstr ""
+
+msgid "Error loading markdown preview"
+msgstr ""
+
+msgid "Error loading merge requests."
+msgstr ""
+
+msgid "Error loading milestone tab"
+msgstr ""
+
+msgid "Error loading project data. Please try again."
+msgstr ""
+
+msgid "Error loading template types."
+msgstr ""
+
+msgid "Error loading template."
+msgstr ""
+
+msgid "Error loading viewer"
+msgstr ""
+
+msgid "Error occurred when fetching sidebar data"
+msgstr ""
+
+msgid "Error occurred when saving assignees"
+msgstr ""
+
+msgid "Error occurred when saving reviewers"
+msgstr ""
+
+msgid "Error occurred while updating the %{issuableType} status"
+msgstr ""
+
+msgid "Error occurred while updating the issue status"
+msgstr ""
+
+msgid "Error occurred. A blocked user cannot be deactivated"
+msgstr ""
+
+msgid "Error occurred. A blocked user must be unblocked to be activated"
+msgstr ""
+
+msgid "Error occurred. User was not banned"
+msgstr ""
+
+msgid "Error occurred. User was not blocked"
+msgstr ""
+
+msgid "Error occurred. User was not confirmed"
+msgstr ""
+
+msgid "Error occurred. User was not unbanned"
+msgstr ""
+
+msgid "Error occurred. User was not unblocked"
+msgstr ""
+
+msgid "Error occurred. User was not unlocked"
+msgstr ""
+
+msgid "Error parsing CSV file. Please make sure it has"
+msgstr ""
+
+msgid "Error rendering Markdown preview"
+msgstr ""
+
+msgid "Error saving label update."
+msgstr ""
+
+msgid "Error setting up editor. Please try again."
+msgstr ""
+
+msgid "Error tracking"
+msgstr ""
+
+msgid "Error updating %{issuableType}"
+msgstr ""
+
+msgid "Error updating status for all to-do items."
+msgstr ""
+
+msgid "Error updating status of to-do item."
+msgstr ""
+
+msgid "Error updating the snippet"
+msgstr ""
+
+msgid "Error uploading file"
+msgstr ""
+
+msgid "Error uploading file. Please try again."
+msgstr ""
+
+msgid "Error uploading file: %{stripped}"
+msgstr ""
+
+msgid "Error while loading the merge request. Please try again."
+msgstr ""
+
+msgid "Error while migrating %{upload_id}: %{error_message}"
+msgstr ""
+
+msgid "Error with Akismet. Please check the logs for more info."
+msgstr ""
+
+msgid "Error: %{error_message}"
+msgstr ""
+
+msgid "Error: %{error}"
+msgstr ""
+
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
+msgid "Error: No AWS credentials were supplied"
+msgstr ""
+
+msgid "Error: No AWS provision role found for user"
+msgstr ""
+
+msgid "Error: Unable to create deploy freeze"
+msgstr ""
+
+msgid "Error: Unable to delete deploy freeze"
+msgstr ""
+
+msgid "Error: Unable to find AWS role for current user"
+msgstr ""
+
+msgid "ErrorTracking|Active"
+msgstr ""
+
+msgid "ErrorTracking|After adding your Auth Token, select the Connect button to load projects."
+msgstr ""
+
+msgid "ErrorTracking|Auth Token"
+msgstr ""
+
+msgid "ErrorTracking|Click Connect to reestablish the connection to Sentry and activate the dropdown."
+msgstr ""
+
+msgid "ErrorTracking|Connection failed. Check Auth Token and try again."
+msgstr ""
+
+msgid "ErrorTracking|Enable error tracking"
+msgstr ""
+
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
+msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|No projects available"
+msgstr ""
+
+msgid "ErrorTracking|Select project"
+msgstr ""
+
+msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
+msgstr ""
+
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
+msgid "Errors"
+msgstr ""
+
+msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
+msgstr ""
+
+msgid "Errors:"
+msgstr ""
+
+msgid "Escalate this incident"
+msgstr ""
+
+msgid "Escalation Policies"
+msgstr ""
+
+msgid "Escalation policies"
+msgstr ""
+
+msgid "Escalation policies may not have more than %{rule_count} rules"
+msgstr ""
+
+msgid "Escalation policies must have at least one rule"
+msgstr ""
+
+msgid "Escalation policy"
+msgstr ""
+
+msgid "Escalation policy:"
+msgstr ""
+
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
+msgid "EscalationPolicies|+ Add an additional rule"
+msgstr ""
+
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
+msgstr ""
+
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
+msgid "EscalationPolicies|A user is required for adding an escalation policy."
+msgstr ""
+
+msgid "EscalationPolicies|Add an escalation policy"
+msgstr ""
+
+msgid "EscalationPolicies|Add escalation policy"
+msgstr ""
+
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
+msgid "EscalationPolicies|Create an escalation policy in GitLab"
+msgstr ""
+
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
+msgid "EscalationPolicies|Edit escalation policy"
+msgstr ""
+
+msgid "EscalationPolicies|Email on-call user in schedule"
+msgstr ""
+
+msgid "EscalationPolicies|Email user"
+msgstr ""
+
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
+msgid "EscalationPolicies|Escalation policy %{obstacle} in project %{project}"
+msgstr ""
+
+msgid "EscalationPolicies|Escalation rules"
+msgstr ""
+
+msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgstr ""
+
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
+msgstr ""
+
+msgid "EscalationPolicies|Maximum of 10 rules has been reached."
+msgstr ""
+
+msgid "EscalationPolicies|Minutes must be between 0 and 1440."
+msgstr ""
+
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
+msgid "EscalationPolicies|Search for user"
+msgstr ""
+
+msgid "EscalationPolicies|Select schedule"
+msgstr ""
+
+msgid "EscalationPolicies|Set up escalation policies to define who is paged, and when, in the event the first users paged don't respond."
+msgstr ""
+
+msgid "EscalationPolicies|THEN %{doAction} %{scheduleOrUser}"
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|This policy has no escalation rules."
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
+msgid "Estimate"
+msgstr ""
+
+msgid "Estimated"
+msgstr ""
+
+msgid "EventFilterBy|Filter by all"
+msgstr ""
+
+msgid "EventFilterBy|Filter by comments"
+msgstr ""
+
+msgid "EventFilterBy|Filter by designs"
+msgstr ""
+
+msgid "EventFilterBy|Filter by epic events"
+msgstr ""
+
+msgid "EventFilterBy|Filter by issue events"
+msgstr ""
+
+msgid "EventFilterBy|Filter by merge events"
+msgstr ""
+
+msgid "EventFilterBy|Filter by push events"
+msgstr ""
+
+msgid "EventFilterBy|Filter by team"
+msgstr ""
+
+msgid "EventFilterBy|Filter by wiki"
+msgstr ""
+
+msgid "Events"
+msgstr ""
+
+msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
+msgstr ""
+
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every day"
+msgstr ""
+
+msgid "Every day (at %{time})"
+msgstr ""
+
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every month"
+msgstr ""
+
+msgid "Every month (Day %{day} at %{time})"
+msgstr ""
+
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every three months"
+msgstr ""
+
+msgid "Every two weeks"
+msgstr ""
+
+msgid "Every week"
+msgid_plural "Every %d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Every week (%{weekday} at %{time})"
+msgstr ""
+
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Everyone With Access"
+msgstr ""
+
+msgid "Everyone can contribute"
+msgstr ""
+
+msgid "Everything on your to-do list is marked as done."
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Gatsby"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using GitBook"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Hexo"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Hugo"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Jekyll"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
+msgid "Everything you need to create a GitLab Pages site using plain HTML"
+msgstr ""
+
+msgid "Evidence collection"
+msgstr ""
+
+msgid "Exactly one of %{attributes} is required"
+msgstr ""
+
+msgid "Example: @sub\\.company\\.com$"
+msgstr ""
+
+msgid "Examples"
+msgstr ""
+
+msgid "Except policy:"
+msgstr ""
+
+msgid "Exceptions"
+msgstr ""
+
+msgid "Excluding merge commits. Limited to %{limit} commits."
+msgstr ""
+
+msgid "Excluding merge commits. Limited to 6,000 commits."
+msgstr ""
+
+msgid "Execution time"
+msgstr ""
+
+msgid "Existing branch name, tag, or commit SHA"
+msgstr ""
+
+msgid "Existing projects may be moved into a group"
+msgstr ""
+
+msgid "Existing projects will be able to use expiration policies. Avoid enabling this if an external Container Registry is being used, as there is a performance risk if many images exist on one project."
+msgstr ""
+
+msgid "Existing sign in methods may be removed"
+msgstr ""
+
+msgid "Exit."
+msgstr ""
+
+msgid "Expand"
+msgstr ""
+
+msgid "Expand all"
+msgstr ""
+
+msgid "Expand all files"
+msgstr ""
+
+msgid "Expand all threads"
+msgstr ""
+
+msgid "Expand approvers"
+msgstr ""
+
+msgid "Expand file"
+msgstr ""
+
+msgid "Expand issues"
+msgstr ""
+
+msgid "Expand milestones"
+msgstr ""
+
+msgid "Expand panel"
+msgstr ""
+
+msgid "Expand pipeline"
+msgstr ""
+
+msgid "Expand settings section"
+msgstr ""
+
+msgid "Expand sidebar"
+msgstr ""
+
+msgid "Expected documents: %{expected_documents}"
+msgstr ""
+
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
+msgstr ""
+
+msgid "Expiration"
+msgstr ""
+
+msgid "Expiration date"
+msgstr ""
+
+msgid "Expiration date (optional)"
+msgstr ""
+
+msgid "Expiration date:"
+msgstr ""
+
+msgid "Expired"
+msgstr ""
+
+msgid "Expired %{expiredOn}"
+msgstr ""
+
+msgid "Expired:"
+msgstr ""
+
+msgid "Expires"
+msgstr ""
+
+msgid "Expires in %{expires_at}"
+msgstr ""
+
+msgid "Expires on"
+msgstr ""
+
+msgid "Expires:"
+msgstr ""
+
+msgid "Explain the problem. If appropriate, provide a link to the relevant issue or comment."
+msgstr ""
+
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
+msgid "Explore paid plans"
+msgstr ""
+
+msgid "Explore projects"
+msgstr ""
+
+msgid "Explore public groups"
+msgstr ""
+
+msgid "Explore public projects"
+msgstr ""
+
+msgid "Explore snippets"
+msgstr ""
+
+msgid "Explore topics"
+msgstr ""
+
+msgid "Export"
+msgstr ""
+
+msgid "Export %{requirementsCount} requirements?"
+msgstr ""
+
+msgid "Export as CSV"
+msgstr ""
+
+msgid "Export commit custody report"
+msgstr ""
+
+msgid "Export group"
+msgstr ""
+
+msgid "Export issues"
+msgstr ""
+
+msgid "Export merge requests"
+msgstr ""
+
+msgid "Export project"
+msgstr ""
+
+msgid "Export requirements"
+msgstr ""
+
+msgid "Export this group with all related data."
+msgstr ""
+
+msgid "Export this project with all its related data in order to move it to a new GitLab instance. When the exported file is ready, you can download it from this page or from the download link in the email notification you will receive. You can then import it when creating a new project. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Export variable to pipelines running on protected branches and tags only."
+msgstr ""
+
+msgid "Exported requirements"
+msgstr ""
+
+msgid "External ID"
+msgstr ""
+
+msgid "External URL"
+msgstr ""
+
+msgid "External User:"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External storage URL"
+msgstr ""
+
+msgid "External storage authentication token"
+msgstr ""
+
+msgid "External storage for repository static objects"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "ExternalAuthorization|Access to projects is validated on an external service using their classification label."
+msgstr ""
+
+msgid "ExternalAuthorization|Certificate used to authenticate with the external authorization service. If blank, the server certificate is validated when accessing over HTTPS."
+msgstr ""
+
+msgid "ExternalAuthorization|Classification label to use when requesting authorization if no specific label is defined on the project."
+msgstr ""
+
+msgid "ExternalAuthorization|Client authorization certificate"
+msgstr ""
+
+msgid "ExternalAuthorization|Client authorization key"
+msgstr ""
+
+msgid "ExternalAuthorization|Client authorization key password (optional)"
+msgstr ""
+
+msgid "ExternalAuthorization|Default classification label"
+msgstr ""
+
+msgid "ExternalAuthorization|Enable classification control using an external service"
+msgstr ""
+
+msgid "ExternalAuthorization|External authorization"
+msgstr ""
+
+msgid "ExternalAuthorization|External authorization request timeout (seconds)"
+msgstr ""
+
+msgid "ExternalAuthorization|External classification policy authorization."
+msgstr ""
+
+msgid "ExternalAuthorization|Passphrase required to decrypt the private key. Encrypted when stored."
+msgstr ""
+
+msgid "ExternalAuthorization|Period GitLab waits for a response from the external service. If there is no response, access is denied. Default: 0.5 seconds."
+msgstr ""
+
+msgid "ExternalAuthorization|Private key of client authentication certificate. Encrypted when stored."
+msgstr ""
+
+msgid "ExternalAuthorization|Service URL"
+msgstr ""
+
+msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
+msgstr ""
+
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
+msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
+msgstr ""
+
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
+msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
+msgstr ""
+
+msgid "ExternalWikiService|External wiki"
+msgstr ""
+
+msgid "ExternalWikiService|External wiki URL"
+msgstr ""
+
+msgid "ExternalWikiService|Link to an external wiki from the sidebar."
+msgstr ""
+
+msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
+msgid "Failed"
+msgstr ""
+
+msgid "Failed Jobs"
+msgstr ""
+
+msgid "Failed on"
+msgstr ""
+
+msgid "Failed to add a Zoom meeting"
+msgstr ""
+
+msgid "Failed to apply commands."
+msgstr ""
+
+msgid "Failed to archive a design. Please try again."
+msgid_plural "Failed to archive designs. Please try again."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Failed to assign a reviewer because no user was specified."
+msgstr ""
+
+msgid "Failed to assign a user because no user was found."
+msgstr ""
+
+msgid "Failed to cancel auto stop because failed to update the environment."
+msgstr ""
+
+msgid "Failed to cancel auto stop because the environment is not set as auto stop."
+msgstr ""
+
+msgid "Failed to cancel auto stop because you do not have permission to update the environment."
+msgstr ""
+
+msgid "Failed to change the owner"
+msgstr ""
+
+msgid "Failed to check related branches."
+msgstr ""
+
+msgid "Failed to clone this issue because target project doesn't exist."
+msgstr ""
+
+msgid "Failed to clone this issue: wrong parameters."
+msgstr ""
+
+msgid "Failed to create a branch for this issue. Please try again."
+msgstr ""
+
+msgid "Failed to create a to-do item for the design."
+msgstr ""
+
+msgid "Failed to create framework"
+msgstr ""
+
+msgid "Failed to create import label for jira import."
+msgstr ""
+
+msgid "Failed to create new access token: %{token_response_message}"
+msgstr ""
+
+msgid "Failed to create repository"
+msgstr ""
+
+msgid "Failed to create resources"
+msgstr ""
+
+msgid "Failed to create wiki"
+msgstr ""
+
+msgid "Failed to deploy to"
+msgstr ""
+
+msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
+msgstr ""
+
+msgid "Failed to fetch the iteration for this issue. Please try again."
+msgstr ""
+
+msgid "Failed to fetch the iterations for the group. Please try again."
+msgstr ""
+
+msgid "Failed to find import label for Jira import."
+msgstr ""
+
+msgid "Failed to find users for %{missing}"
+msgstr ""
+
+msgid "Failed to generate export, please try again later."
+msgstr ""
+
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
+msgid "Failed to get ref."
+msgstr ""
+
+msgid "Failed to install."
+msgstr ""
+
+msgid "Failed to load"
+msgstr ""
+
+msgid "Failed to load assignees."
+msgstr ""
+
+msgid "Failed to load assignees. Please try again."
+msgstr ""
+
+msgid "Failed to load authors. Please try again."
+msgstr ""
+
+msgid "Failed to load branches. Please try again."
+msgstr ""
+
+msgid "Failed to load deploy keys."
+msgstr ""
+
+msgid "Failed to load emoji list."
+msgstr ""
+
+msgid "Failed to load error details from Sentry."
+msgstr ""
+
+msgid "Failed to load errors from Sentry."
+msgstr ""
+
+msgid "Failed to load group activity metrics. Please try again."
+msgstr ""
+
+msgid "Failed to load groups, users and deploy keys."
+msgstr ""
+
+msgid "Failed to load iterations."
+msgstr ""
+
+msgid "Failed to load labels. Please try again."
+msgstr ""
+
+msgid "Failed to load milestones."
+msgstr ""
+
+msgid "Failed to load milestones. Please try again."
+msgstr ""
+
+msgid "Failed to load projects"
+msgstr ""
+
+msgid "Failed to load related branches"
+msgstr ""
+
+msgid "Failed to load stacktrace."
+msgstr ""
+
+msgid "Failed to make repository read-only. %{reason}"
+msgstr ""
+
+msgid "Failed to mark this issue as a duplicate because referenced issue was not found."
+msgstr ""
+
+msgid "Failed to move this issue because label was not found."
+msgstr ""
+
+msgid "Failed to move this issue because only a single label can be provided."
+msgstr ""
+
+msgid "Failed to move this issue because target project doesn't exist."
+msgstr ""
+
+msgid "Failed to promote issue to incident"
+msgstr ""
+
+msgid "Failed to promote label due to internal error. Please contact administrators."
+msgstr ""
+
+msgid "Failed to protect the branch"
+msgstr ""
+
+msgid "Failed to protect the environment"
+msgstr ""
+
+msgid "Failed to publish issue on status page."
+msgstr ""
+
+msgid "Failed to remove a Zoom meeting"
+msgstr ""
+
+msgid "Failed to remove a to-do item for the design."
+msgstr ""
+
+msgid "Failed to remove attention because no user was found."
+msgstr ""
+
+msgid "Failed to remove mirror."
+msgstr ""
+
+msgid "Failed to remove the pipeline schedule"
+msgstr ""
+
+msgid "Failed to remove user identity."
+msgstr ""
+
+msgid "Failed to remove user key."
+msgstr ""
+
+msgid "Failed to request attention because no user was found."
+msgstr ""
+
+msgid "Failed to reset key. Please try again."
+msgstr ""
+
+msgid "Failed to retrieve page"
+msgstr ""
+
+msgid "Failed to save merge conflicts resolutions. Please try again!"
+msgstr ""
+
+msgid "Failed to save new settings"
+msgstr ""
+
+msgid "Failed to save preferences (%{error_message})."
+msgstr ""
+
+msgid "Failed to save preferences."
+msgstr ""
+
+msgid "Failed to set due date because the date format is invalid."
+msgstr ""
+
+msgid "Failed to set iteration on this issue. Please try again."
+msgstr ""
+
+msgid "Failed to signing using smartcard authentication"
+msgstr ""
+
+msgid "Failed to toggle the to-do status for the design."
+msgstr ""
+
+msgid "Failed to update branch!"
+msgstr ""
+
+msgid "Failed to update environment!"
+msgstr ""
+
+msgid "Failed to update framework"
+msgstr ""
+
+msgid "Failed to update issue status"
+msgstr ""
+
+msgid "Failed to update the Canary Ingress."
+msgstr ""
+
+msgid "Failed to update."
+msgstr ""
+
+msgid "Failed to upgrade."
+msgstr ""
+
+msgid "Failed to upload object map file"
+msgstr ""
+
+msgid "Failure"
+msgstr ""
+
+msgid "False positive"
+msgstr ""
+
+msgid "Fast timeout"
+msgstr ""
+
+msgid "Fast-forward merge without a merge commit"
+msgstr ""
+
+msgid "Faster releases. Better code. Less pain."
+msgstr ""
+
+msgid "Favicon"
+msgstr ""
+
+msgid "Favicon was successfully removed."
+msgstr ""
+
+msgid "Favicon will be removed. Are you sure?"
+msgstr ""
+
+msgid "Feature Flags"
+msgstr ""
+
+msgid "Feature deprecation and removal"
+msgstr ""
+
+msgid "Feature flag status"
+msgstr ""
+
+msgid "Feature flag was not removed."
+msgstr ""
+
+msgid "Feature flag was successfully removed."
+msgstr ""
+
+msgid "FeatureFlags|%d user"
+msgid_plural "FeatureFlags|%d users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "FeatureFlags|%{percent} by available ID"
+msgstr ""
+
+msgid "FeatureFlags|%{percent} by session ID"
+msgstr ""
+
+msgid "FeatureFlags|%{percent} by user ID"
+msgstr ""
+
+msgid "FeatureFlags|%{percent} randomly"
+msgstr ""
+
+msgid "FeatureFlags|* (All Environments)"
+msgstr ""
+
+msgid "FeatureFlags|API URL"
+msgstr ""
+
+msgid "FeatureFlags|Active"
+msgstr ""
+
+msgid "FeatureFlags|Add strategy"
+msgstr ""
+
+msgid "FeatureFlags|All Environments"
+msgstr ""
+
+msgid "FeatureFlags|All Users"
+msgstr ""
+
+msgid "FeatureFlags|All users"
+msgstr ""
+
+msgid "FeatureFlags|Configure"
+msgstr ""
+
+msgid "FeatureFlags|Configure feature flags"
+msgstr ""
+
+msgid "FeatureFlags|Consider using the more flexible \"Percent rollout\" strategy instead."
+msgstr ""
+
+msgid "FeatureFlags|Create feature flag"
+msgstr ""
+
+msgid "FeatureFlags|Delete %{name}?"
+msgstr ""
+
+msgid "FeatureFlags|Delete feature flag"
+msgstr ""
+
+msgid "FeatureFlags|Description"
+msgstr ""
+
+msgid "FeatureFlags|Edit Feature Flag"
+msgstr ""
+
+msgid "FeatureFlags|Edit User List"
+msgstr ""
+
+msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
+msgstr ""
+
+msgid "FeatureFlags|Environment Specs"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag User List Details"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag User Lists"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag behavior is built up by creating a set of rules to define the status of target environments. A default wildcard rule %{codeStart}*%{codeEnd} for %{boldStart}All Environments%{boldEnd} is set, and you are able to add as many rules as you need by choosing environment specs below. You can toggle the behavior for each of your rules to set them %{boldStart}Active%{boldEnd} or %{boldStart}Inactive%{boldEnd}."
+msgstr ""
+
+msgid "FeatureFlags|Feature Flag has no strategies"
+msgstr ""
+
+msgid "FeatureFlags|Feature Flags"
+msgstr ""
+
+msgid "FeatureFlags|Feature flag %{name} will be removed. Are you sure?"
+msgstr ""
+
+msgid "FeatureFlags|Feature flags allow you to configure your code into different flavors by dynamically toggling certain functionality."
+msgstr ""
+
+msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
+msgstr ""
+
+msgid "FeatureFlags|Get started with feature flags"
+msgstr ""
+
+msgid "FeatureFlags|ID"
+msgstr ""
+
+msgid "FeatureFlags|Inactive"
+msgstr ""
+
+msgid "FeatureFlags|Inactive flag for %{scope}"
+msgstr ""
+
+msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
+msgstr ""
+
+msgid "FeatureFlags|Instance ID"
+msgstr ""
+
+msgid "FeatureFlags|List details"
+msgstr ""
+
+msgid "FeatureFlags|Loading feature flags"
+msgstr ""
+
+msgid "FeatureFlags|More information"
+msgstr ""
+
+msgid "FeatureFlags|Name"
+msgstr ""
+
+msgid "FeatureFlags|New"
+msgstr ""
+
+msgid "FeatureFlags|New Feature Flag"
+msgstr ""
+
+msgid "FeatureFlags|New User List"
+msgstr ""
+
+msgid "FeatureFlags|New feature flag"
+msgstr ""
+
+msgid "FeatureFlags|No user list selected"
+msgstr ""
+
+msgid "FeatureFlags|Percent of users"
+msgstr ""
+
+msgid "FeatureFlags|Percent rollout"
+msgstr ""
+
+msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
+msgstr ""
+
+msgid "FeatureFlags|Remove"
+msgstr ""
+
+msgid "FeatureFlags|Search code references"
+msgstr ""
+
+msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
+msgstr ""
+
+msgid "FeatureFlags|Status"
+msgstr ""
+
+msgid "FeatureFlags|Strategies"
+msgstr ""
+
+msgid "FeatureFlags|There was an error fetching the feature flags."
+msgstr ""
+
+msgid "FeatureFlags|To prevent accidental actions we ask you to confirm your intention. Please type %{projectName} to proceed or close this modal to cancel."
+msgstr ""
+
+msgid "FeatureFlags|Try again in a few moments or contact your support team."
+msgstr ""
+
+msgid "FeatureFlags|User IDs"
+msgstr ""
+
+msgid "FeatureFlags|User List"
+msgstr ""
+
+msgid "FeatureFlags|User Lists"
+msgstr ""
+
+msgid "FeatureFlags|View user lists"
+msgstr ""
+
+msgid "FeatureFlag|Percentage"
+msgstr ""
+
+msgid "FeatureFlag|Select a user list"
+msgstr ""
+
+msgid "FeatureFlag|Select the environment scope for this feature flag"
+msgstr ""
+
+msgid "FeatureFlag|There are no configured user lists"
+msgstr ""
+
+msgid "FeatureFlag|Type"
+msgstr ""
+
+msgid "FeatureFlag|User IDs"
+msgstr ""
+
+msgid "FeatureFlag|User List"
+msgstr ""
+
+msgid "Feb"
+msgstr ""
+
+msgid "February"
+msgstr ""
+
+msgid "Fetch and check out this merge request's feature branch:"
+msgstr ""
+
+msgid "Fetching incoming email"
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "File %{current} of %{total}"
+msgstr ""
+
+msgid "File Hooks"
+msgstr ""
+
+msgid "File Hooks (%{count})"
+msgstr ""
+
+msgid "File added"
+msgstr ""
+
+msgid "File browser"
+msgstr ""
+
+msgid "File deleted"
+msgstr ""
+
+msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
+msgstr ""
+
+msgid "File mode changed from %{a_mode} to %{b_mode}"
+msgstr ""
+
+msgid "File moved"
+msgstr ""
+
+msgid "File name"
+msgstr ""
+
+msgid "File renamed with no changes."
+msgstr ""
+
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
+msgid "File synchronization concurrency limit"
+msgstr ""
+
+msgid "File templates"
+msgstr ""
+
+msgid "File upload error."
+msgstr ""
+
+msgid "Filename"
+msgstr ""
+
+msgid "Files"
+msgstr ""
+
+msgid "Files API Rate Limits"
+msgstr ""
+
+msgid "Files breadcrumb"
+msgstr ""
+
+msgid "Files with large changes are collapsed by default."
+msgstr ""
+
+msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
+msgstr ""
+
+msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Filter by"
+msgstr ""
+
+msgid "Filter by %{page_context_word} that are currently open."
+msgstr ""
+
+msgid "Filter by Git revision"
+msgstr ""
+
+msgid "Filter by issues that are currently closed."
+msgstr ""
+
+msgid "Filter by issues that are currently opened."
+msgstr ""
+
+msgid "Filter by label"
+msgstr ""
+
+msgid "Filter by merge requests that are currently closed and unmerged."
+msgstr ""
+
+msgid "Filter by merge requests that are currently merged."
+msgstr ""
+
+msgid "Filter by milestone"
+msgstr ""
+
+msgid "Filter by milestone name"
+msgstr ""
+
+msgid "Filter by name"
+msgstr ""
+
+msgid "Filter by test cases that are currently archived."
+msgstr ""
+
+msgid "Filter by test cases that are currently open."
+msgstr ""
+
+msgid "Filter by user"
+msgstr ""
+
+msgid "Filter parameters are not valid. Make sure that the end date is after the start date."
+msgstr ""
+
+msgid "Filter pipelines"
+msgstr ""
+
+msgid "Filter results"
+msgstr ""
+
+msgid "Filter results by group"
+msgstr ""
+
+msgid "Filter results by project"
+msgstr ""
+
+msgid "Filter results..."
+msgstr ""
+
+msgid "Filter users"
+msgstr ""
+
+msgid "Filter..."
+msgstr ""
+
+msgid "Find File"
+msgstr ""
+
+msgid "Find bugs in your code with API fuzzing."
+msgstr ""
+
+msgid "Find bugs in your code with coverage-guided fuzzing."
+msgstr ""
+
+msgid "Find by path"
+msgstr ""
+
+msgid "Find file"
+msgstr ""
+
+msgid "Fingerprint"
+msgstr ""
+
+msgid "Fingerprints"
+msgstr ""
+
+msgid "Finish editing this message first!"
+msgstr ""
+
+msgid "Finish setting up your dedicated account for %{group_name}."
+msgstr ""
+
+msgid "Finished"
+msgstr ""
+
+msgid "Finished at"
+msgstr ""
+
+msgid "First Name"
+msgstr ""
+
+msgid "First Seen"
+msgstr ""
+
+msgid "First day of the week"
+msgstr ""
+
+msgid "First name"
+msgstr ""
+
+msgid "First seen"
+msgstr ""
+
+msgid "Fixed burndown chart"
+msgstr ""
+
+msgid "Fixed:"
+msgstr ""
+
+msgid "Flags"
+msgstr ""
+
+msgid "FloC|Configure whether you want to participate in FloC."
+msgstr ""
+
+msgid "FloC|Enable FloC (Federated Learning of Cohorts)"
+msgstr ""
+
+msgid "FloC|Federated Learning of Cohorts"
+msgstr ""
+
+msgid "FlowdockService|1b609b52537..."
+msgstr ""
+
+msgid "FlowdockService|Send event notifications from GitLab to Flowdock flows."
+msgstr ""
+
+msgid "FlowdockService|Send event notifications from GitLab to Flowdock flows. %{docs_link}"
+msgstr ""
+
+msgid "Focus filter bar"
+msgstr ""
+
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Folder/%{name}"
+msgstr ""
+
+msgid "Follow"
+msgstr ""
+
+msgid "Followed Users' Activity"
+msgstr ""
+
+msgid "Followed users"
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
+msgid "For a faster browsing experience, some files are collapsed by default."
+msgstr ""
+
+msgid "For additional information, review your %{link_to} or contact your group owner."
+msgstr ""
+
+msgid "For additional information, review your group membership: %{link_to} or contact your group owner."
+msgstr ""
+
+msgid "For each job, clone the repository."
+msgstr ""
+
+msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
+msgstr ""
+
+msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
+msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
+msgstr ""
+
+msgid "For general work"
+msgstr ""
+
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
+msgstr ""
+
+msgid "For investigating IT service disruptions or outages"
+msgstr ""
+
+msgid "For more info, read the documentation."
+msgstr ""
+
+msgid "For more information on how the number of active users is calculated, see the %{self_managed_subscriptions_doc_link} documentation."
+msgstr ""
+
+msgid "For more information, go to the "
+msgstr ""
+
+msgid "For more information, see the File Hooks documentation."
+msgstr ""
+
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
+msgstr ""
+
+msgid "Forgot your password?"
+msgstr ""
+
+msgid "Fork"
+msgstr ""
+
+msgid "Fork Error!"
+msgstr ""
+
+msgid "Fork project"
+msgstr ""
+
+msgid "Fork project?"
+msgstr ""
+
+msgid "ForkProject|A fork is a copy of a project."
+msgstr ""
+
+msgid "ForkProject|An error occurred while forking the project. Please try again."
+msgstr ""
+
+msgid "ForkProject|Cancel"
+msgstr ""
+
+msgid "ForkProject|Create a group"
+msgstr ""
+
+msgid "ForkProject|Fork project"
+msgstr ""
+
+msgid "ForkProject|Forking a repository allows you to make changes without affecting the original project."
+msgstr ""
+
+msgid "ForkProject|Internal"
+msgstr ""
+
+msgid "ForkProject|Please select a namespace"
+msgstr ""
+
+msgid "ForkProject|Please select a visibility level"
+msgstr ""
+
+msgid "ForkProject|Private"
+msgstr ""
+
+msgid "ForkProject|Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgstr ""
+
+msgid "ForkProject|Public"
+msgstr ""
+
+msgid "ForkProject|Select a namespace"
+msgstr ""
+
+msgid "ForkProject|The project can be accessed by any logged in user."
+msgstr ""
+
+msgid "ForkProject|The project can be accessed without any authentication."
+msgstr ""
+
+msgid "ForkProject|Visibility level"
+msgstr ""
+
+msgid "ForkProject|Want to house several dependent projects under the same namespace?"
+msgstr ""
+
+msgid "ForkSuggestion|Cancel"
+msgstr ""
+
+msgid "ForkSuggestion|Fork"
+msgstr ""
+
+msgid "ForkSuggestion|You can’t %{edit_start}edit%{edit_end} files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
+msgid "ForkedFromProjectPath|Forked from"
+msgstr ""
+
+msgid "ForkedFromProjectPath|Forked from an inaccessible project"
+msgstr ""
+
+msgid "Forking in progress"
+msgstr ""
+
+msgid "Forks"
+msgstr ""
+
+msgid "Format: %{dateFormat}"
+msgstr ""
+
+msgid "Forward %{package_type} package requests to the %{registry_type} Registry if the packages are not found in the GitLab Package Registry"
+msgstr ""
+
+msgid "Found errors in your %{gitlab_ci_yml}:"
+msgstr ""
+
+msgid "Found errors in your .gitlab-ci.yml:"
+msgstr ""
+
+msgid "Found warning in your .gitlab-ci.yml"
+msgstr ""
+
+msgid "Framework successfully deleted"
+msgstr ""
+
+msgid "Free Trial of GitLab.com Ultimate"
+msgstr ""
+
+msgid "Freeze end"
+msgstr ""
+
+msgid "Freeze start"
+msgstr ""
+
+msgid "Frequency"
+msgstr ""
+
+msgid "Frequently searched"
+msgstr ""
+
+msgid "Friday"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "From %{code_open}%{source_title}%{code_close} into"
+msgstr ""
+
+msgid "From %{providerTitle}"
+msgstr ""
+
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
+msgid "From issue creation until deploy to production"
+msgstr ""
+
+msgid "From merge request merge until deploy to production"
+msgstr ""
+
+msgid "Full"
+msgstr ""
+
+msgid "Full log"
+msgstr ""
+
+msgid "Full name"
+msgstr ""
+
+msgid "GCP region configured"
+msgstr ""
+
+msgid "GPG Key ID:"
+msgstr ""
+
+msgid "GPG Keys"
+msgstr ""
+
+msgid "GPG keys allow you to verify signed commits."
+msgstr ""
+
+msgid "GPG signature (loading...)"
+msgstr ""
+
+msgid "General"
+msgstr ""
+
+msgid "General Settings"
+msgstr ""
+
+msgid "General pipelines"
+msgstr ""
+
+msgid "General settings"
+msgstr ""
+
+msgid "Generate a default set of labels"
+msgstr ""
+
+msgid "Generate group access tokens scoped to this group for your applications that need access to the GitLab API."
+msgstr ""
+
+msgid "Generate key"
+msgstr ""
+
+msgid "Generate new export"
+msgstr ""
+
+msgid "Generate new token"
+msgstr ""
+
+msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
+msgstr ""
+
+msgid "Generate site and private keys at"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Generic package file size in bytes"
+msgstr ""
+
+msgid "GenericReport|After"
+msgstr ""
+
+msgid "GenericReport|Before"
+msgstr ""
+
+msgid "GenericReport|Diff"
+msgstr ""
+
+msgid "Geo"
+msgstr ""
+
+msgid "Geo Replication"
+msgstr ""
+
+msgid "Geo Settings"
+msgstr ""
+
+msgid "Geo Sites"
+msgstr ""
+
+msgid "Geo sites"
+msgstr ""
+
+msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
+msgstr ""
+
+msgid "Geo|%{component} synced"
+msgstr ""
+
+msgid "Geo|%{component} verified"
+msgstr ""
+
+msgid "Geo|%{label} can't be blank"
+msgstr ""
+
+msgid "Geo|%{label} should be between 1-999"
+msgstr ""
+
+msgid "Geo|%{name} is scheduled for forced re-download"
+msgstr ""
+
+msgid "Geo|%{name} is scheduled for re-sync"
+msgstr ""
+
+msgid "Geo|%{name} is scheduled for re-verify"
+msgstr ""
+
+msgid "Geo|%{timeAgoStr} (%{pendingEvents} events)"
+msgstr ""
+
+msgid "Geo|%{title} checksum progress"
+msgstr ""
+
+msgid "Geo|(%{timeAgo})"
+msgstr ""
+
+msgid "Geo|Add site"
+msgstr ""
+
+msgid "Geo|Adjust your filters/search criteria above. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information."
+msgstr ""
+
+msgid "Geo|All"
+msgstr ""
+
+msgid "Geo|All %{replicable_name}"
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|All projects are being scheduled for resync"
+msgstr ""
+
+msgid "Geo|All projects are being scheduled for reverify"
+msgstr ""
+
+msgid "Geo|Allowed Geo IP can't be blank"
+msgstr ""
+
+msgid "Geo|Allowed Geo IP should be between 1 and 255 characters"
+msgstr ""
+
+msgid "Geo|Allowed Geo IP should contain valid IP addresses"
+msgstr ""
+
+msgid "Geo|Checksummed"
+msgstr ""
+
+msgid "Geo|Connection timeout can't be blank"
+msgstr ""
+
+msgid "Geo|Connection timeout must be a number"
+msgstr ""
+
+msgid "Geo|Connection timeout should be between 1-120"
+msgstr ""
+
+msgid "Geo|Consult Geo troubleshooting information"
+msgstr ""
+
+msgid "Geo|Could not remove tracking entry for an existing project."
+msgstr ""
+
+msgid "Geo|Data replication lag"
+msgstr ""
+
+msgid "Geo|Data type"
+msgstr ""
+
+msgid "Geo|Disabled"
+msgstr ""
+
+msgid "Geo|Discover GitLab Geo"
+msgstr ""
+
+msgid "Geo|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "Geo|Edit %{nodeType} site"
+msgstr ""
+
+msgid "Geo|Failed"
+msgstr ""
+
+msgid "Geo|Filter Geo sites"
+msgstr ""
+
+msgid "Geo|Filter by name"
+msgstr ""
+
+msgid "Geo|Filter by status"
+msgstr ""
+
+msgid "Geo|Geo Status"
+msgstr ""
+
+msgid "Geo|Geo sites"
+msgstr ""
+
+msgid "Geo|Geo sites are paused using a command run on the site"
+msgstr ""
+
+msgid "Geo|Geo supports replication of many data types."
+msgstr ""
+
+msgid "Geo|Go to the primary site"
+msgstr ""
+
+msgid "Geo|Healthy"
+msgstr ""
+
+msgid "Geo|If you want to make changes, you must visit the primary site."
+msgstr ""
+
+msgid "Geo|In progress"
+msgstr ""
+
+msgid "Geo|In sync"
+msgstr ""
+
+msgid "Geo|Internal URL"
+msgstr ""
+
+msgid "Geo|Last event ID from primary"
+msgstr ""
+
+msgid "Geo|Last event ID processed by cursor"
+msgstr ""
+
+msgid "Geo|Last repository check run"
+msgstr ""
+
+msgid "Geo|Last successful sync"
+msgstr ""
+
+msgid "Geo|Last sync attempt"
+msgstr ""
+
+msgid "Geo|Last time verified"
+msgstr ""
+
+msgid "Geo|Learn more about Geo"
+msgstr ""
+
+msgid "Geo|Learn more about Geo site statuses"
+msgstr ""
+
+msgid "Geo|Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Geo|Never"
+msgstr ""
+
+msgid "Geo|Next sync scheduled at"
+msgstr ""
+
+msgid "Geo|No available replication slots"
+msgstr ""
+
+msgid "Geo|Not synced yet"
+msgstr ""
+
+msgid "Geo|Nothing to checksum"
+msgstr ""
+
+msgid "Geo|Nothing to synchronize"
+msgstr ""
+
+msgid "Geo|Nothing to verify"
+msgstr ""
+
+msgid "Geo|Offline"
+msgstr ""
+
+msgid "Geo|Open replications"
+msgstr ""
+
+msgid "Geo|Pending synchronization"
+msgstr ""
+
+msgid "Geo|Pending verification"
+msgstr ""
+
+msgid "Geo|Primary node"
+msgstr ""
+
+msgid "Geo|Primary site"
+msgstr ""
+
+msgid "Geo|Project"
+msgstr ""
+
+msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk."
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Queued"
+msgstr ""
+
+msgid "Geo|Redownload"
+msgstr ""
+
+msgid "Geo|Remove"
+msgstr ""
+
+msgid "Geo|Remove %{nodeType} site"
+msgstr ""
+
+msgid "Geo|Remove entry"
+msgstr ""
+
+msgid "Geo|Remove site"
+msgstr ""
+
+msgid "Geo|Remove tracking database entry"
+msgstr ""
+
+msgid "Geo|Removing a Geo site stops the synchronization to and from that site. Are you sure?"
+msgstr ""
+
+msgid "Geo|Replicated data is verified with the secondary site(s) using checksums"
+msgstr ""
+
+msgid "Geo|Replicated data is verified with the secondary site(s) using checksums."
+msgstr ""
+
+msgid "Geo|Replication Details"
+msgstr ""
+
+msgid "Geo|Replication slot WAL"
+msgstr ""
+
+msgid "Geo|Replication slots"
+msgstr ""
+
+msgid "Geo|Replication status"
+msgstr ""
+
+msgid "Geo|Replication summary"
+msgstr ""
+
+msgid "Geo|Resync"
+msgstr ""
+
+msgid "Geo|Resync all"
+msgstr ""
+
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
+msgid "Geo|Retry count"
+msgstr ""
+
+msgid "Geo|Reverify"
+msgstr ""
+
+msgid "Geo|Reverify all"
+msgstr ""
+
+msgid "Geo|Reverify all projects"
+msgstr ""
+
+msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
+msgstr ""
+
+msgid "Geo|Secondary node"
+msgstr ""
+
+msgid "Geo|Secondary site"
+msgstr ""
+
+msgid "Geo|Selective (%{syncLabel})"
+msgstr ""
+
+msgid "Geo|Site name can't be blank"
+msgstr ""
+
+msgid "Geo|Site name should be between 1 and 255 characters"
+msgstr ""
+
+msgid "Geo|Site's status was updated %{timeAgo}."
+msgstr ""
+
+msgid "Geo|Status"
+msgstr ""
+
+msgid "Geo|Storage config"
+msgstr ""
+
+msgid "Geo|Synced"
+msgstr ""
+
+msgid "Geo|Synced at"
+msgstr ""
+
+msgid "Geo|Synchronization"
+msgstr ""
+
+msgid "Geo|Synchronization failed - %{error}"
+msgstr ""
+
+msgid "Geo|Synchronization settings"
+msgstr ""
+
+msgid "Geo|Synchronization status"
+msgstr ""
+
+msgid "Geo|The database is currently %{db_lag} behind the primary site."
+msgstr ""
+
+msgid "Geo|The site is currently %{minutes_behind} behind the primary site."
+msgstr ""
+
+msgid "Geo|There are no %{replicable_type} to show"
+msgstr ""
+
+msgid "Geo|There was an error deleting the Geo Site"
+msgstr ""
+
+msgid "Geo|There was an error fetching the Geo Sites"
+msgstr ""
+
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|Tracking database entry will be removed. Are you sure?"
+msgstr ""
+
+msgid "Geo|Tracking entry for project (%{project_id}) was successfully removed."
+msgstr ""
+
+msgid "Geo|URL can't be blank"
+msgstr ""
+
+msgid "Geo|URL must be a valid url (ex: https://gitlab.com)"
+msgstr ""
+
+msgid "Geo|Undefined"
+msgstr ""
+
+msgid "Geo|Unhealthy"
+msgstr ""
+
+msgid "Geo|Unknown"
+msgstr ""
+
+msgid "Geo|Unknown state"
+msgstr ""
+
+msgid "Geo|Updated %{timeAgo}"
+msgstr ""
+
+msgid "Geo|Verification"
+msgstr ""
+
+msgid "Geo|Verification failed - %{error}"
+msgstr ""
+
+msgid "Geo|Verification information"
+msgstr ""
+
+msgid "Geo|Verification status"
+msgstr ""
+
+msgid "Geo|Verified"
+msgstr ""
+
+msgid "Geo|Waiting for scheduler"
+msgstr ""
+
+msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo site."
+msgstr ""
+
+msgid "Geo|You may be able to make a limited amount of changes or perform a limited amount of actions on this page."
+msgstr ""
+
+msgid "Geo|misconfigured"
+msgstr ""
+
+msgid "Geo|primary"
+msgstr ""
+
+msgid "Geo|secondary"
+msgstr ""
+
+msgid "Get a free instance review"
+msgstr ""
+
+msgid "Get a free trial"
+msgstr ""
+
+msgid "Get a support subscription"
+msgstr ""
+
+msgid "Get started"
+msgstr ""
+
+msgid "Get started with GitLab"
+msgstr ""
+
+msgid "Get started with error tracking"
+msgstr ""
+
+msgid "Get started with performance monitoring"
+msgstr ""
+
+msgid "Get started!"
+msgstr ""
+
+msgid "Getting started with releases"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
+msgid "Git GC period"
+msgstr ""
+
+msgid "Git LFS Rate Limits"
+msgstr ""
+
+msgid "Git LFS is not enabled on this GitLab server, contact your admin."
+msgstr ""
+
+msgid "Git LFS objects will be synced if LFS is %{docs_link_start}enabled for the project%{docs_link_end}. Push mirrors will %{strong_open}not%{strong_close} sync LFS objects over SSH."
+msgstr ""
+
+msgid "Git LFS status:"
+msgstr ""
+
+msgid "Git global setup"
+msgstr ""
+
+msgid "Git repository URL"
+msgstr ""
+
+msgid "Git revision"
+msgstr ""
+
+msgid "Git shallow clone"
+msgstr ""
+
+msgid "Git strategy"
+msgstr ""
+
+msgid "Git transfer in progress"
+msgstr ""
+
+msgid "Git version"
+msgstr ""
+
+msgid "GitHub API rate limit exceeded. Try again after %{reset_time}"
+msgstr ""
+
+msgid "GitHub import"
+msgstr ""
+
+msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
+msgstr ""
+
+msgid "GitLab"
+msgstr ""
+
+msgid "GitLab / Unsubscribe"
+msgstr ""
+
+msgid "GitLab API"
+msgstr ""
+
+msgid "GitLab Account Request"
+msgstr ""
+
+msgid "GitLab Billing Team."
+msgstr ""
+
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab Issue"
+msgstr ""
+
+msgid "GitLab KAS"
+msgstr ""
+
+msgid "GitLab Pages"
+msgstr ""
+
+msgid "GitLab Shell"
+msgstr ""
+
+msgid "GitLab Support Bot"
+msgstr ""
+
+msgid "GitLab Team Member"
+msgstr ""
+
+msgid "GitLab Ultimate trial"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab Workhorse"
+msgstr ""
+
+msgid "GitLab account request rejected"
+msgstr ""
+
+msgid "GitLab and Google Cloud configuration seems to be incomplete. This probably can be fixed by your GitLab administration team. You may share these logs with them:"
+msgstr ""
+
+msgid "GitLab commit"
+msgstr ""
+
+msgid "GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}"
+msgstr ""
+
+msgid "GitLab export"
+msgstr ""
+
+msgid "GitLab 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 ""
+
+msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way%{br_tag}Development, Security, and Ops teams collaborate"
+msgstr ""
+
+msgid "GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security."
+msgstr ""
+
+msgid "GitLab is free to use. Many features for larger teams are part of our %{link_start}paid products%{link_end}. You can try Ultimate for free without any obligation or payment details."
+msgstr ""
+
+msgid "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later."
+msgstr ""
+
+msgid "GitLab is open source software to collaborate on code."
+msgstr ""
+
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
+msgstr ""
+
+msgid "GitLab logo"
+msgstr ""
+
+msgid "GitLab metadata URL"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab runs a background job to export pseudonymized CSVs of the GitLab database. The CSV files are then uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab single sign-on URL"
+msgstr ""
+
+msgid "GitLab username"
+msgstr ""
+
+msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
+msgstr ""
+
+msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
+msgstr ""
+
+msgid "GitLab version"
+msgstr ""
+
+msgid "GitLab will create a branch in your fork and start a merge request."
+msgstr ""
+
+msgid "GitLab.com"
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
+
+msgid "GitLabPagesDomains|Retry"
+msgstr ""
+
+msgid "GitLabPages|%{domain} is not verified. To learn how to verify ownership, visit your %{link_start}domain details%{link_end}."
+msgstr ""
+
+msgid "GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information."
+msgstr ""
+
+msgid "GitLabPages|Access pages"
+msgstr ""
+
+msgid "GitLabPages|Are you sure?"
+msgstr ""
+
+msgid "GitLabPages|Certificate: %{subject}"
+msgstr ""
+
+msgid "GitLabPages|Configure pages"
+msgstr ""
+
+msgid "GitLabPages|Domains"
+msgstr ""
+
+msgid "GitLabPages|Edit"
+msgstr ""
+
+msgid "GitLabPages|Expired"
+msgstr ""
+
+msgid "GitLabPages|Force HTTPS (requires valid certificates)"
+msgstr ""
+
+msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable them on your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} page."
+msgstr ""
+
+msgid "GitLabPages|Maximum size of pages (MB)"
+msgstr ""
+
+msgid "GitLabPages|New Domain"
+msgstr ""
+
+msgid "GitLabPages|Only project maintainers can remove pages"
+msgstr ""
+
+msgid "GitLabPages|Pages"
+msgstr ""
+
+msgid "GitLabPages|Remove"
+msgstr ""
+
+msgid "GitLabPages|Remove pages"
+msgstr ""
+
+msgid "GitLabPages|Removing pages will prevent them from being exposed to the outside world."
+msgstr ""
+
+msgid "GitLabPages|Save changes"
+msgstr ""
+
+msgid "GitLabPages|Something went wrong while obtaining the Let's Encrypt certificate for %{domain}. To retry visit your %{link_start}domain details%{link_end}."
+msgstr ""
+
+msgid "GitLabPages|Support for domains and certificates is disabled. Ask your system's administrator to enable it."
+msgstr ""
+
+msgid "GitLabPages|The total size of deployed static content will be limited to this size. 0 for unlimited. Leave empty to inherit the global value."
+msgstr ""
+
+msgid "GitLabPages|Unverified"
+msgstr ""
+
+msgid "GitLabPages|Verified"
+msgstr ""
+
+msgid "GitLabPages|When enabled, all attempts to visit your website through HTTP are automatically redirected to HTTPS using a response with status code 301. Requires a valid certificate for all domains. %{docs_link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with subdomains of subdomains. If your namespace or groupname contains a dot, it does not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages work if you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "GitLabPages|With GitLab Pages you can host your static website directly from your GitLab repository. %{docs_link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "GitLabPages|Your Pages site is not configured yet. See the %{docs_link_start}GitLab Pages documentation%{link_end} to learn how to upload your static site and have GitLab serve it. You can also take some inspiration from the %{samples_link_start}sample Pages projects%{link_end}."
+msgstr ""
+
+msgid "GitLabPages|Your pages are served under:"
+msgstr ""
+
+msgid "Gitaly Servers"
+msgstr ""
+
+msgid "Gitaly relative path:"
+msgstr ""
+
+msgid "Gitaly storage name:"
+msgstr ""
+
+msgid "Gitaly timeouts"
+msgstr ""
+
+msgid "Gitaly|Address"
+msgstr ""
+
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
+msgid "GithubIntegration|Create a %{token_link_start}personal access token%{token_link_end} with %{status_html} access granted and paste it here."
+msgstr ""
+
+msgid "GithubIntegration|Enable static status check names"
+msgstr ""
+
+msgid "GithubIntegration|Obtain statuses for commits and pull requests."
+msgstr ""
+
+msgid "GithubIntegration|Repository URL"
+msgstr ""
+
+msgid "GithubIntegration|Select this if you want GitHub to mark status checks as \"Required\". %{learn_more_link_start}Learn more%{learn_more_link_end}."
+msgstr ""
+
+msgid "GithubIntegration|Static status check names (optional)"
+msgstr ""
+
+msgid "GithubIntegration|This requires mirroring your GitHub repository to this project. %{docs_link}"
+msgstr ""
+
+msgid "Gitpod"
+msgstr ""
+
+msgid "Gitpod|Enable Gitpod integration"
+msgstr ""
+
+msgid "Gitpod|Gitpod URL"
+msgstr ""
+
+msgid "Gitpod|The URL to your Gitpod instance configured to read your GitLab projects, such as https://gitpod.example.com."
+msgstr ""
+
+msgid "Gitpod|To use Gitpod you must first enable the feature in the integrations section of your %{linkStart}user preferences%{linkEnd}."
+msgstr ""
+
+msgid "Gitpod|To use the integration, each user must also enable Gitpod on their GitLab account. %{link_start}How do I enable it?%{link_end} "
+msgstr ""
+
+msgid "Gitpod|https://gitpod.example.com"
+msgstr ""
+
+msgid "Given access %{time_ago}"
+msgstr ""
+
+msgid "Given epic is already related to this epic."
+msgstr ""
+
+msgid "Global Search is disabled for this scope"
+msgstr ""
+
+msgid "Global Shortcuts"
+msgstr ""
+
+msgid "Global notification settings"
+msgstr ""
+
+msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
+msgstr ""
+
+msgid "GlobalSearch|Issues I've created"
+msgstr ""
+
+msgid "GlobalSearch|Issues assigned to me"
+msgstr ""
+
+msgid "GlobalSearch|Merge requests I've created"
+msgstr ""
+
+msgid "GlobalSearch|Merge requests assigned to me"
+msgstr ""
+
+msgid "GlobalSearch|Merge requests that I'm a reviewer"
+msgstr ""
+
+msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
+msgstr ""
+
+msgid "GlobalSearch|Search GitLab"
+msgstr ""
+
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
+msgid "GlobalSearch|Search results are loading"
+msgstr ""
+
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
+msgid "GlobalSearch|Type and press the enter key to submit search."
+msgstr ""
+
+msgid "GlobalSearch|Type for new suggestions to appear below."
+msgstr ""
+
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
+msgid "GlobalSearch|in all GitLab"
+msgstr ""
+
+msgid "GlobalSearch|in group"
+msgstr ""
+
+msgid "GlobalSearch|in project"
+msgstr ""
+
+msgid "Go Back"
+msgstr ""
+
+msgid "Go Micro is a framework for micro service development"
+msgstr ""
+
+msgid "Go back"
+msgstr ""
+
+msgid "Go back (while searching for files)"
+msgstr ""
+
+msgid "Go back to configuration"
+msgstr ""
+
+msgid "Go full screen"
+msgstr ""
+
+msgid "Go to %{source_name}"
+msgstr ""
+
+msgid "Go to commits"
+msgstr ""
+
+msgid "Go to definition"
+msgstr ""
+
+msgid "Go to environments"
+msgstr ""
+
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
+msgid "Go to epic"
+msgstr ""
+
+msgid "Go to file"
+msgstr ""
+
+msgid "Go to file permalink (while viewing a file)"
+msgstr ""
+
+msgid "Go to files"
+msgstr ""
+
+msgid "Go to find file"
+msgstr ""
+
+msgid "Go to issue boards"
+msgstr ""
+
+msgid "Go to issues"
+msgstr ""
+
+msgid "Go to jobs"
+msgstr ""
+
+msgid "Go to kubernetes"
+msgstr ""
+
+msgid "Go to merge requests"
+msgstr ""
+
+msgid "Go to metrics"
+msgstr ""
+
+msgid "Go to next page"
+msgstr ""
+
+msgid "Go to page %{page}"
+msgstr ""
+
+msgid "Go to parent"
+msgstr ""
+
+msgid "Go to parent directory"
+msgstr ""
+
+msgid "Go to previous page"
+msgstr ""
+
+msgid "Go to primary site"
+msgstr ""
+
+msgid "Go to project"
+msgstr ""
+
+msgid "Go to releases"
+msgstr ""
+
+msgid "Go to repository charts"
+msgstr ""
+
+msgid "Go to repository graph"
+msgstr ""
+
+msgid "Go to snippets"
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
+msgid "Go to the activity feed"
+msgstr ""
+
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
+msgid "Go to the milestone list"
+msgstr ""
+
+msgid "Go to the project's activity feed"
+msgstr ""
+
+msgid "Go to the project's overview page"
+msgstr ""
+
+msgid "Go to wiki"
+msgstr ""
+
+msgid "Go to your To-Do list"
+msgstr ""
+
+msgid "Go to your fork"
+msgstr ""
+
+msgid "Go to your groups"
+msgstr ""
+
+msgid "Go to your issues"
+msgstr ""
+
+msgid "Go to your merge requests"
+msgstr ""
+
+msgid "Go to your projects"
+msgstr ""
+
+msgid "Go to your snippets"
+msgstr ""
+
+msgid "Goal of the changes and what reviewers should be aware of"
+msgstr ""
+
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud Project"
+msgstr ""
+
+msgid "Google Cloud authorizations required"
+msgstr ""
+
+msgid "Google Cloud project misconfigured"
+msgstr ""
+
+msgid "Google Cloud project required"
+msgstr ""
+
+msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
+msgstr ""
+
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
+msgid "Got it"
+msgstr ""
+
+msgid "Got it!"
+msgstr ""
+
+msgid "Grafana URL"
+msgstr ""
+
+msgid "Grafana response contains invalid json"
+msgstr ""
+
+msgid "GrafanaIntegration|API token"
+msgstr ""
+
+msgid "GrafanaIntegration|Active"
+msgstr ""
+
+msgid "GrafanaIntegration|Enter the %{docLinkStart}Grafana API token%{docLinkEnd}."
+msgstr ""
+
+msgid "GrafanaIntegration|Enter the base URL of the Grafana instance."
+msgstr ""
+
+msgid "GrafanaIntegration|Grafana URL"
+msgstr ""
+
+msgid "GrafanaIntegration|Grafana authentication"
+msgstr ""
+
+msgid "GrafanaIntegration|Set up Grafana authentication to embed Grafana panels in GitLab Flavored Markdown."
+msgstr ""
+
+msgid "Grant access"
+msgstr ""
+
+msgid "Grant write permissions to this key"
+msgstr ""
+
+msgid "Graph"
+msgstr ""
+
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
+msgid "Graphs"
+msgstr ""
+
+msgid "Gravatar"
+msgstr ""
+
+msgid "Gravatar enabled"
+msgstr ""
+
+msgid "Group"
+msgstr ""
+
+msgid "Group %{group_name} couldn't be exported."
+msgstr ""
+
+msgid "Group %{group_name} was exported successfully."
+msgstr ""
+
+msgid "Group %{group_name} was scheduled for deletion."
+msgstr ""
+
+msgid "Group %{group_name} was successfully created."
+msgstr ""
+
+msgid "Group Access Tokens"
+msgstr ""
+
+msgid "Group Git LFS status:"
+msgstr ""
+
+msgid "Group Hooks"
+msgstr ""
+
+msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
+msgstr ""
+
+msgid "Group SAML must be enabled to test"
+msgstr ""
+
+msgid "Group URL"
+msgstr ""
+
+msgid "Group access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Group application: %{name}"
+msgstr ""
+
+msgid "Group applications"
+msgstr ""
+
+msgid "Group audit events"
+msgstr ""
+
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group by"
+msgstr ""
+
+msgid "Group description (optional)"
+msgstr ""
+
+msgid "Group export could not be started."
+msgstr ""
+
+msgid "Group export download requests"
+msgstr ""
+
+msgid "Group export error"
+msgstr ""
+
+msgid "Group export link has expired. Please generate a new export from your group settings."
+msgstr ""
+
+msgid "Group export requests"
+msgstr ""
+
+msgid "Group export started. A download link will be sent by email and made available on this page."
+msgstr ""
+
+msgid "Group has been already marked for deletion"
+msgstr ""
+
+msgid "Group has not been marked for deletion"
+msgstr ""
+
+msgid "Group import could not be scheduled"
+msgstr ""
+
+msgid "Group import requests"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
+msgid "Group information"
+msgstr ""
+
+msgid "Group is required when cluster_type is :group"
+msgstr ""
+
+msgid "Group jobs by"
+msgstr ""
+
+msgid "Group members"
+msgstr ""
+
+msgid "Group membership expiration date changed"
+msgstr ""
+
+msgid "Group membership expiration date removed"
+msgstr ""
+
+msgid "Group milestone"
+msgstr ""
+
+msgid "Group name"
+msgstr ""
+
+msgid "Group name (your organization)"
+msgstr ""
+
+msgid "Group navigation"
+msgstr ""
+
+msgid "Group overview content"
+msgstr ""
+
+msgid "Group owners can register group runners in the %{link}"
+msgstr ""
+
+msgid "Group path is already taken. We've suggested one that is available."
+msgstr ""
+
+msgid "Group path is available."
+msgstr ""
+
+msgid "Group pipeline minutes were successfully reset."
+msgstr ""
+
+msgid "Group project URLs are prefixed with the group namespace"
+msgstr ""
+
+msgid "Group requires separate account"
+msgstr ""
+
+msgid "Group runners"
+msgstr ""
+
+msgid "Group runners can be managed with the %{link}."
+msgstr ""
+
+msgid "Group variables (inherited)"
+msgstr ""
+
+msgid "Group was exported"
+msgstr ""
+
+msgid "Group was successfully updated."
+msgstr ""
+
+msgid "Group wikis"
+msgstr ""
+
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "Group: %{name}"
+msgstr ""
+
+msgid "GroupActivityMetrics|Issues created"
+msgstr ""
+
+msgid "GroupActivityMetrics|Last 90 days"
+msgstr ""
+
+msgid "GroupActivityMetrics|Members added"
+msgstr ""
+
+msgid "GroupActivityMetrics|Merge Requests created"
+msgstr ""
+
+msgid "GroupActivityMetrics|Recent activity"
+msgstr ""
+
+msgid "GroupImport|Failed to import group."
+msgstr ""
+
+msgid "GroupImport|Group '%{group_name}' is being imported."
+msgstr ""
+
+msgid "GroupImport|Group could not be imported: %{errors}"
+msgstr ""
+
+msgid "GroupImport|Please wait while we import the group for you. Refresh at will."
+msgstr ""
+
+msgid "GroupImport|The group was successfully imported."
+msgstr ""
+
+msgid "GroupImport|Unable to process group import file"
+msgstr ""
+
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
+msgid "GroupRoadmap|%{dateWord} – No end date"
+msgstr ""
+
+msgid "GroupRoadmap|%{startDateInWords} – %{endDateInWords}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading epics"
+msgstr ""
+
+msgid "GroupRoadmap|No start and end date"
+msgstr ""
+
+msgid "GroupRoadmap|No start date – %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching milestones"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|This quarter"
+msgstr ""
+
+msgid "GroupRoadmap|This year"
+msgstr ""
+
+msgid "GroupRoadmap|To make your epics appear in the roadmap, add start or due dates to them."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a start or due date to one of the %{linkStart}child epics%{linkEnd}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a start or due date to one of your epics in this group or its subgroups; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Within 3 years"
+msgstr ""
+
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
+msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enable %{linkStart}SSO enforcement%{linkEnd} to reduce security risks."
+msgstr ""
+
+msgid "GroupSAML|Active SAML Group Links (%{count})"
+msgstr ""
+
+msgid "GroupSAML|An error occurred generating your SCIM token. Please try again."
+msgstr ""
+
+msgid "GroupSAML|An error occurred resetting your SCIM token. Please try again."
+msgstr ""
+
+msgid "GroupSAML|Are you sure you want to remove the SAML group link?"
+msgstr ""
+
+msgid "GroupSAML|Are you sure you want to reset the SCIM token? SCIM provisioning will stop working until the new token is updated."
+msgstr ""
+
+msgid "GroupSAML|Before enforcing SSO, enable SAML authentication."
+msgstr ""
+
+msgid "GroupSAML|Before enforcing SSO-only authentication for Git activity, enable SSO-only authentication for web activity."
+msgstr ""
+
+msgid "GroupSAML|Certificate fingerprint"
+msgstr ""
+
+msgid "GroupSAML|Configuration"
+msgstr ""
+
+msgid "GroupSAML|Copy SAML Response XML"
+msgstr ""
+
+msgid "GroupSAML|Could not create SAML group link: %{errors}."
+msgstr ""
+
+msgid "GroupSAML|Default membership role"
+msgstr ""
+
+msgid "GroupSAML|Enable SAML authentication for this group"
+msgstr ""
+
+msgid "GroupSAML|Enforce SSO-only authentication for Git and Dependency Proxy activity for this group"
+msgstr ""
+
+msgid "GroupSAML|Enforce SSO-only authentication for web activity for this group"
+msgstr ""
+
+msgid "GroupSAML|Enforce users to have dedicated group-managed accounts for this group"
+msgstr ""
+
+msgid "GroupSAML|Generate a SCIM token"
+msgstr ""
+
+msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Identity Management."
+msgstr ""
+
+msgid "GroupSAML|Identity"
+msgstr ""
+
+msgid "GroupSAML|Identity provider single sign-on URL"
+msgstr ""
+
+msgid "GroupSAML|Make sure you save this token — you won't be able to access it again."
+msgstr ""
+
+msgid "GroupSAML|Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "GroupSAML|Members"
+msgstr ""
+
+msgid "GroupSAML|Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "GroupSAML|NameID"
+msgstr ""
+
+msgid "GroupSAML|NameID Format"
+msgstr ""
+
+msgid "GroupSAML|New SAML group link saved."
+msgstr ""
+
+msgid "GroupSAML|No active SAML group links"
+msgstr ""
+
+msgid "GroupSAML|Prohibit outer forks for this group"
+msgstr ""
+
+msgid "GroupSAML|Reset SCIM token"
+msgstr ""
+
+msgid "GroupSAML|Role to assign members of this SAML group."
+msgstr ""
+
+msgid "GroupSAML|SAML Group Links"
+msgstr ""
+
+msgid "GroupSAML|SAML Group Name"
+msgstr ""
+
+msgid "GroupSAML|SAML Group Name: %{saml_group_name}"
+msgstr ""
+
+msgid "GroupSAML|SAML Response Output"
+msgstr ""
+
+msgid "GroupSAML|SAML Response XML"
+msgstr ""
+
+msgid "GroupSAML|SAML Single Sign On"
+msgstr ""
+
+msgid "GroupSAML|SAML Single Sign On Settings"
+msgstr ""
+
+msgid "GroupSAML|SAML group link was successfully removed."
+msgstr ""
+
+msgid "GroupSAML|SCIM Token"
+msgstr ""
+
+msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
+msgid "GroupSAML|The SCIM token is now hidden. To see the value of the token again, you need to %{linkStart}reset it%{linkEnd}."
+msgstr ""
+
+msgid "GroupSAML|The case-sensitive group name that will be sent by the SAML identity provider."
+msgstr ""
+
+msgid "GroupSAML|This will be set as the access level of users added to the group."
+msgstr ""
+
+msgid "GroupSAML|To be able to enable group-managed accounts, you first need to enable enforced SSO."
+msgstr ""
+
+msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
+msgstr ""
+
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
+msgid "GroupSAML|Valid SAML Response"
+msgstr ""
+
+msgid "GroupSAML|With prohibit outer forks flag enabled group members will be able to fork project only inside your group."
+msgstr ""
+
+msgid "GroupSAML|as %{access_level}"
+msgstr ""
+
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
+msgstr ""
+
+msgid "GroupSAML|recommend persistent ID instead of email"
+msgstr ""
+
+msgid "GroupSaml|Copy SCIM API endpoint URL"
+msgstr ""
+
+msgid "GroupSaml|Copy SCIM token"
+msgstr ""
+
+msgid "GroupSaml|SCIM API endpoint URL"
+msgstr ""
+
+msgid "GroupSaml|Your SCIM token"
+msgstr ""
+
+msgid "GroupSelect|No matching results"
+msgstr ""
+
+msgid "GroupSelect|Search groups"
+msgstr ""
+
+msgid "GroupSelect|Select a group"
+msgstr ""
+
+msgid "GroupSettings|Allow project and group access token creation"
+msgstr ""
+
+msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
+msgstr ""
+
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
+msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
+msgstr ""
+
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
+msgid "GroupSettings|Badges"
+msgstr ""
+
+msgid "GroupSettings|Be careful. Changing a group's parent can have unintended side effects. %{learn_more_link_start}Learn more.%{learn_more_link_end}"
+msgstr ""
+
+msgid "GroupSettings|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
+msgstr ""
+
+msgid "GroupSettings|Change group URL"
+msgstr ""
+
+msgid "GroupSettings|Changing a group's URL can have unintended side effects."
+msgstr ""
+
+msgid "GroupSettings|Choose a group path that does not start with a dash or end with a period. It can also contain alphanumeric characters and underscores."
+msgstr ""
+
+msgid "GroupSettings|Compliance frameworks"
+msgstr ""
+
+msgid "GroupSettings|Configure compliance frameworks to make them available to projects in this group. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "GroupSettings|Custom project templates"
+msgstr ""
+
+msgid "GroupSettings|Customize this group's badges."
+msgstr ""
+
+msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
+msgstr ""
+
+msgid "GroupSettings|Disable email notifications"
+msgstr ""
+
+msgid "GroupSettings|Disable group mentions"
+msgstr ""
+
+msgid "GroupSettings|Enable customer relations"
+msgstr ""
+
+msgid "GroupSettings|Enable delayed project deletion"
+msgstr ""
+
+msgid "GroupSettings|Export group"
+msgstr ""
+
+msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
+msgstr ""
+
+msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
+msgstr ""
+
+msgid "GroupSettings|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 ""
+
+msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
+msgstr ""
+
+msgid "GroupSettings|Prevent forking outside of the group"
+msgstr ""
+
+msgid "GroupSettings|Prevent forking setting was not saved"
+msgstr ""
+
+msgid "GroupSettings|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 parent group"
+msgstr ""
+
+msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgstr ""
+
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
+msgstr ""
+
+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 ""
+
+msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "GroupSettings|There was a problem updating Auto DevOps pipeline: %{error_messages}."
+msgstr ""
+
+msgid "GroupSettings|There was a problem updating the pipeline settings: %{error_messages}."
+msgstr ""
+
+msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
+msgstr ""
+
+msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
+msgstr ""
+
+msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
+msgstr ""
+
+msgid "GroupSettings|Transfer group"
+msgstr ""
+
+msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
+msgstr ""
+
+msgid "GroupSettings|What are badges?"
+msgstr ""
+
+msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals."
+msgstr ""
+
+msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals. Increasing the user cap will not automatically approve pending users."
+msgstr ""
+
+msgid "GroupSettings|You can only transfer the group to a group you manage."
+msgstr ""
+
+msgid "GroupSettings|You will need to update your local repositories to point to the new location."
+msgstr ""
+
+msgid "GroupSettings|cannot be changed by you"
+msgstr ""
+
+msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
+msgstr ""
+
+msgid "GroupSettings|cannot change when group contains projects with NPM packages"
+msgstr ""
+
+msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Groups (%{count})"
+msgstr ""
+
+msgid "Groups and projects"
+msgstr ""
+
+msgid "Groups are a great way to organize projects and people."
+msgstr ""
+
+msgid "Groups are the best way to manage projects and members."
+msgstr ""
+
+msgid "Groups to synchronize"
+msgstr ""
+
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr ""
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr ""
+
+msgid "GroupsEmptyState|No groups found"
+msgstr ""
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr ""
+
+msgid "GroupsNew|%{linkStart}Groups%{linkEnd} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
+msgstr ""
+
+msgid "GroupsNew|Assemble related projects together and grant members access to several projects at once."
+msgstr ""
+
+msgid "GroupsNew|Connect instance"
+msgstr ""
+
+msgid "GroupsNew|Contact an administrator to enable options for importing your group."
+msgstr ""
+
+msgid "GroupsNew|Create group"
+msgstr ""
+
+msgid "GroupsNew|Create new group"
+msgstr ""
+
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
+msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
+msgstr ""
+
+msgid "GroupsNew|GitLab source URL"
+msgstr ""
+
+msgid "GroupsNew|Groups can also be nested by creating %{linkStart}subgroups%{linkEnd}."
+msgstr ""
+
+msgid "GroupsNew|Import group"
+msgstr ""
+
+msgid "GroupsNew|Import groups from another instance of GitLab"
+msgstr ""
+
+msgid "GroupsNew|My Awesome Group"
+msgstr ""
+
+msgid "GroupsNew|No import options available"
+msgstr ""
+
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
+msgstr ""
+
+msgid "GroupsNew|Personal access token"
+msgstr ""
+
+msgid "GroupsNew|Please fill in GitLab source URL."
+msgstr ""
+
+msgid "GroupsNew|Please fill in your personal access token."
+msgstr ""
+
+msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
+msgstr ""
+
+msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
+msgstr ""
+
+msgid "GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here."
+msgstr ""
+
+msgid "GroupsNew|Upload file"
+msgstr ""
+
+msgid "GroupsNew|e.g. h8d3f016698e..."
+msgstr ""
+
+msgid "GroupsTree|Are you sure you want to leave the \"%{fullName}\" group?"
+msgstr ""
+
+msgid "GroupsTree|Delete"
+msgstr ""
+
+msgid "GroupsTree|Edit"
+msgstr ""
+
+msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
+msgstr ""
+
+msgid "GroupsTree|Leave group"
+msgstr ""
+
+msgid "GroupsTree|Loading groups"
+msgstr ""
+
+msgid "GroupsTree|No groups matched your search"
+msgstr ""
+
+msgid "GroupsTree|No groups or projects matched your search"
+msgstr ""
+
+msgid "GroupsTree|Options"
+msgstr ""
+
+msgid "GroupsTree|Search by name"
+msgstr ""
+
+msgid "Groups|Avatar will be removed. Are you sure?"
+msgstr ""
+
+msgid "Groups|Changing group URL can have unintended side effects."
+msgstr ""
+
+msgid "Groups|Checking group URL availability..."
+msgstr ""
+
+msgid "Groups|Enter a descriptive name for your group."
+msgstr ""
+
+msgid "Groups|Group ID"
+msgstr ""
+
+msgid "Groups|Group URL"
+msgstr ""
+
+msgid "Groups|Group avatar"
+msgstr ""
+
+msgid "Groups|Group description (optional)"
+msgstr ""
+
+msgid "Groups|Group name"
+msgstr ""
+
+msgid "Groups|Group path is available."
+msgstr ""
+
+msgid "Groups|Group path is unavailable. Path has been replaced with a suggested available path."
+msgstr ""
+
+msgid "Groups|Learn more"
+msgstr ""
+
+msgid "Groups|Must start with letter, digit, emoji, or underscore. Can also contain periods, dashes, spaces, and parentheses."
+msgstr ""
+
+msgid "Groups|Remove avatar"
+msgstr ""
+
+msgid "Groups|Save changes"
+msgstr ""
+
+msgid "Guideline"
+msgstr ""
+
+msgid "HAR (HTTP Archive)"
+msgstr ""
+
+msgid "HAR file path or URL"
+msgstr ""
+
+msgid "HTTP Archive (HAR)"
+msgstr ""
+
+msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
+msgstr ""
+
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
+msgid "Hashed Storage must be enabled to use Geo"
+msgstr ""
+
+msgid "Hashed repository storage paths"
+msgstr ""
+
+msgid "Hashed storage can't be disabled anymore for new projects"
+msgstr ""
+
+msgid "Have a quick chat with us about your experience."
+msgstr ""
+
+msgid "Have more to say about GitLab?"
+msgstr ""
+
+msgid "Header logo"
+msgstr ""
+
+msgid "Header logo was successfully removed."
+msgstr ""
+
+msgid "Header logo will be removed. Are you sure?"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
+msgid "HeaderAction|incident"
+msgstr ""
+
+msgid "HeaderAction|issue"
+msgstr ""
+
+msgid "Headers"
+msgstr ""
+
+msgid "Heading 1"
+msgstr ""
+
+msgid "Heading 2"
+msgstr ""
+
+msgid "Heading 3"
+msgstr ""
+
+msgid "Heading 4"
+msgstr ""
+
+msgid "Headings"
+msgstr ""
+
+msgid "Health"
+msgstr ""
+
+msgid "Health Check"
+msgstr ""
+
+msgid "Health information can be retrieved from the following endpoints. More information is available"
+msgstr ""
+
+msgid "Health status"
+msgstr ""
+
+msgid "Health status cannot be edited because this issue is closed"
+msgstr ""
+
+msgid "HealthCheck|Access token is"
+msgstr ""
+
+msgid "HealthCheck|Healthy"
+msgstr ""
+
+msgid "HealthCheck|No Health Problems Detected"
+msgstr ""
+
+msgid "HealthCheck|Unhealthy"
+msgstr ""
+
+msgid "Hello %{name},"
+msgstr ""
+
+msgid "Hello, %{name}!"
+msgstr ""
+
+msgid "Hello, %{username}!"
+msgstr ""
+
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
+msgid "Help"
+msgstr ""
+
+msgid "Helps prevent bots from brute-force attacks."
+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 reduce request volume (for example, from crawlers or abusive bots)"
+msgstr ""
+
+msgid "Helps reduce request volume for protected paths."
+msgstr ""
+
+msgid "Here you will find recent merge request activity"
+msgstr ""
+
+msgid "Hi %{username}!"
+msgstr ""
+
+msgid "Hidden"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "Hide archived projects"
+msgstr ""
+
+msgid "Hide chart"
+msgid_plural "Hide charts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Hide comments on this file"
+msgstr ""
+
+msgid "Hide details"
+msgstr ""
+
+msgid "Hide file browser"
+msgstr ""
+
+msgid "Hide group projects"
+msgstr ""
+
+msgid "Hide host keys manual input"
+msgstr ""
+
+msgid "Hide list"
+msgstr ""
+
+msgid "Hide marketing-related entries from the Help page"
+msgstr ""
+
+msgid "Hide payload"
+msgstr ""
+
+msgid "Hide shared projects"
+msgstr ""
+
+msgid "Hide thread"
+msgstr ""
+
+msgid "Hide tooltips or popovers"
+msgstr ""
+
+msgid "Hide value"
+msgid_plural "Hide values"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Hide values"
+msgstr ""
+
+msgid "Hierarchy|Current structure"
+msgstr ""
+
+msgid "Hierarchy|Deliver value more efficiently by breaking down necessary work into a hierarchical structure. This structure helps teams understand scope, priorities, and how work cascades up toward larger goals."
+msgstr ""
+
+msgid "Hierarchy|Help us improve work items in GitLab!"
+msgstr ""
+
+msgid "Hierarchy|Is there a framework or type of work item you wish you had access to in GitLab? Give us your feedback and help us build the experiences valuable to you."
+msgstr ""
+
+msgid "Hierarchy|Planning hierarchy"
+msgstr ""
+
+msgid "Hierarchy|Take the work items survey"
+msgstr ""
+
+msgid "Hierarchy|These items are unavailable in the current structure."
+msgstr ""
+
+msgid "Hierarchy|Unavailable structure"
+msgstr ""
+
+msgid "Hierarchy|You can start using these items now."
+msgstr ""
+
+msgid "High or unknown vulnerabilities present"
+msgstr ""
+
+msgid "Highest role:"
+msgstr ""
+
+msgid "HighlightBar|Alert events:"
+msgstr ""
+
+msgid "HighlightBar|Alert start time:"
+msgstr ""
+
+msgid "HighlightBar|Original alert:"
+msgstr ""
+
+msgid "HighlightBar|Time to SLA:"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "History of authentications"
+msgstr ""
+
+msgid "Holder name:"
+msgstr ""
+
+msgid "Home page URL"
+msgstr ""
+
+msgid "Homepage"
+msgstr ""
+
+msgid "Hook execution failed. Ensure the group has a project with commits."
+msgstr ""
+
+msgid "Hook was successfully created."
+msgstr ""
+
+msgid "Hook was successfully updated."
+msgstr ""
+
+msgid "Hostname"
+msgstr ""
+
+msgid "Hostname used in private commit emails. %{learn_more}"
+msgstr ""
+
+msgid "Hour (UTC)"
+msgstr ""
+
+msgid "House your files, plan your work, collaborate on code, and more."
+msgstr ""
+
+msgid "Housekeeping"
+msgstr ""
+
+msgid "Housekeeping successfully started"
+msgstr ""
+
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure authentication using the GitLab database?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
+msgid "How do I configure runners?"
+msgstr ""
+
+msgid "How do I configure this integration?"
+msgstr ""
+
+msgid "How do I generate it?"
+msgstr ""
+
+msgid "How do I mirror repositories?"
+msgstr ""
+
+msgid "How do I rename an environment?"
+msgstr ""
+
+msgid "How do I set up a Google Chat webhook?"
+msgstr ""
+
+msgid "How do I set up this service?"
+msgstr ""
+
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
+msgid "How many days need to pass between marking entity for deletion and actual removing it."
+msgstr ""
+
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
+msgstr ""
+
+msgid "I accept the %{terms_link}"
+msgstr ""
+
+msgid "I forgot my password"
+msgstr ""
+
+msgid "I want to explore GitLab to see if it’s worth switching to"
+msgstr ""
+
+msgid "I want to learn the basics of Git"
+msgstr ""
+
+msgid "I want to move my repository to GitLab from somewhere else"
+msgstr ""
+
+msgid "I want to store my code"
+msgstr ""
+
+msgid "I want to use GitLab CI with my existing repository"
+msgstr ""
+
+msgid "I'd like to receive updates about GitLab via email"
+msgstr ""
+
+msgid "I'm signing up for GitLab because:"
+msgstr ""
+
+msgid "ID"
+msgstr ""
+
+msgid "ID:"
+msgstr ""
+
+msgid "IDE"
+msgstr ""
+
+msgid "IDE|Back"
+msgstr ""
+
+msgid "IDE|Commit"
+msgstr ""
+
+msgid "IDE|Commit to %{branchName} branch"
+msgstr ""
+
+msgid "IDE|Edit"
+msgstr ""
+
+msgid "IDE|Get started with Live Preview"
+msgstr ""
+
+msgid "IDE|Go to project"
+msgstr ""
+
+msgid "IDE|Live Preview"
+msgstr ""
+
+msgid "IDE|Preview your web application using Web IDE client-side evaluation."
+msgstr ""
+
+msgid "IDE|Refresh preview"
+msgstr ""
+
+msgid "IDE|Review"
+msgstr ""
+
+msgid "IDE|Successful commit"
+msgstr ""
+
+msgid "IDE|This option is disabled because you are not allowed to create merge requests in this project."
+msgstr ""
+
+msgid "IDE|This option is disabled because you don't have write permissions for the current branch."
+msgstr ""
+
+msgid "INFO: Your SSH key has expired. Please generate a new key."
+msgstr ""
+
+msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
+msgstr ""
+
+msgid "IP Address"
+msgstr ""
+
+msgid "IP address expiration time"
+msgstr ""
+
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
+msgstr ""
+
+msgid "Identifier"
+msgstr ""
+
+msgid "Identifiers"
+msgstr ""
+
+msgid "Identities"
+msgstr ""
+
+msgid "IdentityVerification|Before you create your first project, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
+msgstr ""
+
+msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
+msgstr ""
+
+msgid "IdentityVerification|Create a project"
+msgstr ""
+
+msgid "IdentityVerification|Verify your identity"
+msgstr ""
+
+msgid "IdentityVerification|You can always verify your account at a later time to create a group."
+msgstr ""
+
+msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
+msgstr ""
+
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
+msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
+msgstr ""
+
+msgid "If checked, group owners can manage LDAP group links and LDAP member overrides"
+msgstr ""
+
+msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
+msgstr ""
+
+msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
+msgstr ""
+
+msgid "If disabled, only administrators can configure repository mirroring."
+msgstr ""
+
+msgid "If enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "If enabled, only protected branches will be mirrored."
+msgstr ""
+
+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 ""
+
+msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
+msgstr ""
+
+msgid "If there isn't any existing index, GitLab creates one."
+msgstr ""
+
+msgid "If this email was added in error, you can remove it here:"
+msgstr ""
+
+msgid "If this email was added in error, you can remove it here: %{profile_emails_url}"
+msgstr ""
+
+msgid "If this was a mistake you can %{leave_link_start}leave the %{source_type}%{link_end}."
+msgstr ""
+
+msgid "If this was a mistake you can leave the %{source_type}."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
+msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be able to view the %{codeStart}needs%{codeEnd} relationships between jobs in this tab as a %{linkStart}Directed Acyclic Graph (DAG)%{linkEnd}."
+msgstr ""
+
+msgid "If you are added to a project, it will be displayed here."
+msgstr ""
+
+msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
+msgid "If you did not initiate this change, please contact your administrator immediately."
+msgstr ""
+
+msgid "If you did not perform this request, you can safely ignore this email."
+msgstr ""
+
+msgid "If you did not recently sign in, you should immediately %{password_link_start}change your password%{password_link_end}."
+msgstr ""
+
+msgid "If you did not recently sign in, you should immediately change your password: %{password_link}."
+msgstr ""
+
+msgid "If you get a lot of false alarms from repository checks, you can clear all repository check information from the database."
+msgstr ""
+
+msgid "If you lose your recovery codes you can generate new ones, invalidating all previous codes."
+msgstr ""
+
+msgid "If you recently signed in and recognize the IP address, you may disregard this email."
+msgstr ""
+
+msgid "If you want to re-enable two-factor authentication, visit %{two_factor_link}"
+msgstr ""
+
+msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
+msgstr ""
+
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
+msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
+msgstr ""
+
+msgid "If your HTTP repository is not publicly accessible, add your credentials."
+msgstr ""
+
+msgid "Ignore"
+msgstr ""
+
+msgid "Ignored"
+msgstr ""
+
+msgid "Image URL"
+msgstr ""
+
+msgid "Image details"
+msgstr ""
+
+msgid "ImageDiffViewer|2-up"
+msgstr ""
+
+msgid "ImageDiffViewer|Onion skin"
+msgstr ""
+
+msgid "ImageDiffViewer|Swipe"
+msgstr ""
+
+msgid "ImageViewerDimensions|H"
+msgstr ""
+
+msgid "ImageViewerDimensions|W"
+msgstr ""
+
+msgid "Images with incorrect dimensions are not resized automatically, and may result in unexpected behavior."
+msgstr ""
+
+msgid "Impersonate"
+msgstr ""
+
+msgid "Impersonation Tokens"
+msgstr ""
+
+msgid "Impersonation has been disabled"
+msgstr ""
+
+msgid "Import"
+msgstr ""
+
+msgid "Import %d compatible repository"
+msgid_plural "Import %d compatible repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Import %d repository"
+msgid_plural "Import %d repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Import CSV"
+msgstr ""
+
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import an exported GitLab project"
+msgstr ""
+
+msgid "Import and export rate limits"
+msgstr ""
+
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
+msgstr ""
+
+msgid "Import from"
+msgstr ""
+
+msgid "Import from Jira"
+msgstr ""
+
+msgid "Import group"
+msgstr ""
+
+msgid "Import group from file"
+msgstr ""
+
+msgid "Import groups"
+msgstr ""
+
+msgid "Import history"
+msgstr ""
+
+msgid "Import in progress"
+msgstr ""
+
+msgid "Import in progress. Refresh page to see newly added issues."
+msgstr ""
+
+msgid "Import issues"
+msgstr ""
+
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import project from"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from Bitbucket Server"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import repositories from Bitbucket Server"
+msgstr ""
+
+msgid "Import repositories from GitHub"
+msgstr ""
+
+msgid "Import repository"
+msgstr ""
+
+msgid "Import requirements"
+msgstr ""
+
+msgid "Import started by: %{importInitiator}"
+msgstr ""
+
+msgid "Import tasks"
+msgstr ""
+
+msgid "Import tasks from Phabricator into issues"
+msgstr ""
+
+msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
+msgstr ""
+
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
+msgstr ""
+
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "ImportProjects|%{provider} rate limit exceeded. Try again later"
+msgstr ""
+
+msgid "ImportProjects|Blocked import URL: %{message}"
+msgstr ""
+
+msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
+msgstr ""
+
+msgid "ImportProjects|Import repositories"
+msgstr ""
+
+msgid "ImportProjects|Importing the project failed"
+msgstr ""
+
+msgid "ImportProjects|Importing the project failed: %{reason}"
+msgstr ""
+
+msgid "ImportProjects|Requesting namespaces failed"
+msgstr ""
+
+msgid "ImportProjects|Requesting your %{provider} repositories failed"
+msgstr ""
+
+msgid "ImportProjects|Select the repositories you want to import"
+msgstr ""
+
+msgid "ImportProjects|The remote data could not be imported."
+msgstr ""
+
+msgid "ImportProjects|The repository could not be created."
+msgstr ""
+
+msgid "ImportProjects|Update of imported projects with realtime changes failed"
+msgstr ""
+
+msgid "Imported requirements"
+msgstr ""
+
+msgid "Importing %d repository"
+msgid_plural "Importing %d repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Importing..."
+msgstr ""
+
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
+msgstr ""
+
+msgid "Improve customer support with Service Desk"
+msgstr ""
+
+msgid "Improves Git cloning performance."
+msgstr ""
+
+msgid "In case of pull mirroring, your user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
+msgstr ""
+
+msgid "In each example, replace %{code_start}TOKEN%{code_end} with the trigger token you generated and replace %{code_start}REF_NAME%{code_end} with the branch or tag name."
+msgstr ""
+
+msgid "In progress"
+msgstr ""
+
+msgid "In this page you will find information about the settings that are used in your current instance."
+msgstr ""
+
+msgid "InProductMarketing|%{organization_name} logo"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Advanced application security%{strong_end} — including SAST, DAST scanning, FUZZ testing, dependency scanning, license compliance, secrete detection"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Company wide portfolio management%{strong_end} — including multi-level epics, scoped labels"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Executive level insights%{strong_end} — including reporting on productivity, tasks by type, days to completion, value stream"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Multiple approval roles%{strong_end} — including code owners and required merge approvals"
+msgstr ""
+
+msgid "InProductMarketing|%{strong_start}Overall, how difficult or easy was it to get started with GitLab?%{strong_end}"
+msgstr ""
+
+msgid "InProductMarketing|*GitLab*, noun: a synonym for efficient teams"
+msgstr ""
+
+msgid "InProductMarketing|...and you can get a free trial of GitLab Ultimate"
+msgstr ""
+
+msgid "InProductMarketing|3 ways to dive into GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|A single application eliminates complex integrations, data chokepoints, and toolchain maintenance, resulting in greater productivity and lower cost."
+msgstr ""
+
+msgid "InProductMarketing|Access advanced features, build more efficiently, strengthen security and compliance."
+msgstr ""
+
+msgid "InProductMarketing|Access advanced features."
+msgstr ""
+
+msgid "InProductMarketing|Actually, GitLab makes the team work (better)"
+msgstr ""
+
+msgid "InProductMarketing|And finally %{deploy_link} a Python application."
+msgstr ""
+
+msgid "InProductMarketing|And many more..."
+msgstr ""
+
+msgid "InProductMarketing|Are your runners ready?"
+msgstr ""
+
+msgid "InProductMarketing|Automated security scans directly within GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Be a DevOps hero"
+msgstr ""
+
+msgid "InProductMarketing|Beef up your security"
+msgstr ""
+
+msgid "InProductMarketing|Better code in less time"
+msgstr ""
+
+msgid "InProductMarketing|Blog"
+msgstr ""
+
+msgid "InProductMarketing|Break down silos to coordinate seamlessly across development, operations, and security with a consistent experience across the development lifecycle."
+msgstr ""
+
+msgid "InProductMarketing|Burn up/down charts"
+msgstr ""
+
+msgid "InProductMarketing|By enabling code owners and required merge approvals the right person will review the right MR. This is a win-win: cleaner code and a more efficient review process."
+msgstr ""
+
+msgid "InProductMarketing|Click on the number below that corresponds with your answer — 1 being very difficult, 5 being very easy."
+msgstr ""
+
+msgid "InProductMarketing|Code owners"
+msgstr ""
+
+msgid "InProductMarketing|Code owners and required merge approvals are part of the paid tiers of GitLab. You can start a free 30-day trial of GitLab Ultimate and enable these features in less than 5 minutes with no credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Code review analytics"
+msgstr ""
+
+msgid "InProductMarketing|Collaboration across stages in GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Collaboration made easy"
+msgstr ""
+
+msgid "InProductMarketing|Create a custom CI runner with just a few clicks"
+msgstr ""
+
+msgid "InProductMarketing|Create a custom runner"
+msgstr ""
+
+msgid "InProductMarketing|Create a project in GitLab in 5 minutes"
+msgstr ""
+
+msgid "InProductMarketing|Create well-defined workflows by using scoped labels on issues, merge requests, and epics. Labels with the same scope cannot be used together, which prevents conflicts."
+msgstr ""
+
+msgid "InProductMarketing|Create your first project!"
+msgstr ""
+
+msgid "InProductMarketing|Define who owns specific files or directories, so the right reviewers are suggested when a merge request introduces changes to those files."
+msgstr ""
+
+msgid "InProductMarketing|Deliver Better Products Faster"
+msgstr ""
+
+msgid "InProductMarketing|Dependency scanning"
+msgstr ""
+
+msgid "InProductMarketing|Did you know teams that use GitLab are far more efficient?"
+msgstr ""
+
+msgid "InProductMarketing|Difficult"
+msgstr ""
+
+msgid "InProductMarketing|Dig in and create a project and a repo"
+msgstr ""
+
+msgid "InProductMarketing|Discover Premium & Ultimate"
+msgstr ""
+
+msgid "InProductMarketing|Discover Premium & Ultimate."
+msgstr ""
+
+msgid "InProductMarketing|Do you have a minute?"
+msgstr ""
+
+msgid "InProductMarketing|Do you have a teammate who would be perfect for this task?"
+msgstr ""
+
+msgid "InProductMarketing|Dynamic application security testing"
+msgstr ""
+
+msgid "InProductMarketing|Easy"
+msgstr ""
+
+msgid "InProductMarketing|Epics"
+msgstr ""
+
+msgid "InProductMarketing|Expand your DevOps journey with a free GitLab trial"
+msgstr ""
+
+msgid "InProductMarketing|Explore GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Explore the options"
+msgstr ""
+
+msgid "InProductMarketing|Explore the power of GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Facebook"
+msgstr ""
+
+msgid "InProductMarketing|Feedback from users like you really improves our product. Thanks for your help!"
+msgstr ""
+
+msgid "InProductMarketing|Feel the need for speed?"
+msgstr ""
+
+msgid "InProductMarketing|Find and fix bottlenecks in your code review process by understanding how long open merge requests have been in review."
+msgstr ""
+
+msgid "InProductMarketing|Find out how your teams are really doing"
+msgstr ""
+
+msgid "InProductMarketing|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
+msgstr ""
+
+msgid "InProductMarketing|Follow our steps"
+msgstr ""
+
+msgid "InProductMarketing|Free 30-day trial"
+msgstr ""
+
+msgid "InProductMarketing|Get going with CI/CD quickly using our %{quick_start_link}. Start with an available runner and then create a CI .yml file – it's really that easy."
+msgstr ""
+
+msgid "InProductMarketing|Get our import guides"
+msgstr ""
+
+msgid "InProductMarketing|Get started today"
+msgstr ""
+
+msgid "InProductMarketing|Get started today with a 30-day GitLab Ultimate trial, no credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Get started with GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Get to know GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Get your team set up on GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Git basics"
+msgstr ""
+
+msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
+msgstr ""
+
+msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
+msgstr ""
+
+msgid "InProductMarketing|GitLab provides static application security testing (SAST), dynamic application security testing (DAST), container scanning, and dependency scanning to help you deliver secure applications along with license compliance."
+msgstr ""
+
+msgid "InProductMarketing|GitLab's CI/CD makes software development easier. Don't believe us? Here are three ways you can take it for a fast (and satisfying) test drive:"
+msgstr ""
+
+msgid "InProductMarketing|GitLab's premium tiers are designed to make you, your team and your application more efficient and more secure with features including but not limited to:"
+msgstr ""
+
+msgid "InProductMarketing|Give us one minute..."
+msgstr ""
+
+msgid "InProductMarketing|Go farther with GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Goldman Sachs went from 1 build every two weeks to thousands of builds a day"
+msgstr ""
+
+msgid "InProductMarketing|Have a different instance you'd like to import? Here's our %{import_link}."
+msgstr ""
+
+msgid "InProductMarketing|Here's what you need to know"
+msgstr ""
+
+msgid "InProductMarketing|How (and why) mirroring makes sense"
+msgstr ""
+
+msgid "InProductMarketing|How long does it take us to close issues/MRs by types like feature requests, bugs, tech debt, security?"
+msgstr ""
+
+msgid "InProductMarketing|How many days does it take our team to complete various tasks?"
+msgstr ""
+
+msgid "InProductMarketing|How to build and test faster"
+msgstr ""
+
+msgid "InProductMarketing|If you don't want to receive marketing emails directly from GitLab, %{marketing_preference_link}."
+msgstr ""
+
+msgid "InProductMarketing|If you no longer wish to receive marketing emails from us,"
+msgstr ""
+
+msgid "InProductMarketing|Import your project and code from GitHub, Bitbucket and others"
+msgstr ""
+
+msgid "InProductMarketing|Improve app security with a 30-day trial"
+msgstr ""
+
+msgid "InProductMarketing|Improve code quality and streamline reviews"
+msgstr ""
+
+msgid "InProductMarketing|Increase Operational Efficiencies"
+msgstr ""
+
+msgid "InProductMarketing|Invite them to help out."
+msgstr ""
+
+msgid "InProductMarketing|Invite your colleagues and start shipping code faster."
+msgstr ""
+
+msgid "InProductMarketing|Invite your colleagues to join in less than one minute"
+msgstr ""
+
+msgid "InProductMarketing|Invite your colleagues today"
+msgstr ""
+
+msgid "InProductMarketing|Invite your team in less than 60 seconds"
+msgstr ""
+
+msgid "InProductMarketing|Invite your team now"
+msgstr ""
+
+msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
+msgstr ""
+
+msgid "InProductMarketing|It's all in the stats"
+msgstr ""
+
+msgid "InProductMarketing|It's also possible to simply %{external_repo_link} in order to take advantage of GitLab's CI/CD."
+msgstr ""
+
+msgid "InProductMarketing|Keep your code quality high by defining who should approve merge requests and how many approvals are required."
+msgstr ""
+
+msgid "InProductMarketing|Launch GitLab CI/CD in 20 minutes or less"
+msgstr ""
+
+msgid "InProductMarketing|Lower cost of development"
+msgstr ""
+
+msgid "InProductMarketing|Make it easier to collaborate on high-level ideas by grouping related issues in an epic."
+msgstr ""
+
+msgid "InProductMarketing|Making the switch? It's easier than you think to import your projects into GitLab. Move %{github_link}, or import something %{bitbucket_link}."
+msgstr ""
+
+msgid "InProductMarketing|Master the art of importing!"
+msgstr ""
+
+msgid "InProductMarketing|Merge request approval rule"
+msgstr ""
+
+msgid "InProductMarketing|Move on to easily creating a Pages website %{ci_template_link}"
+msgstr ""
+
+msgid "InProductMarketing|Multiple owners, confusing workstreams? We've got you covered"
+msgstr ""
+
+msgid "InProductMarketing|Multiple required approvers"
+msgstr ""
+
+msgid "InProductMarketing|Need an alternative to importing?"
+msgstr ""
+
+msgid "InProductMarketing|Neutral"
+msgstr ""
+
+msgid "InProductMarketing|No credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Our tool brings all the things together"
+msgstr ""
+
+msgid "InProductMarketing|Protect your web application by using DAST to examine for vulnerabilities in deployed environments."
+msgstr ""
+
+msgid "InProductMarketing|Rapid development, simplified"
+msgstr ""
+
+msgid "InProductMarketing|Reduce Security & Compliance Risk"
+msgstr ""
+
+msgid "InProductMarketing|Require multiple approvers on a merge request, so you know it's in good shape before it's merged."
+msgstr ""
+
+msgid "InProductMarketing|Roadmaps"
+msgstr ""
+
+msgid "InProductMarketing|Scoped labels"
+msgstr ""
+
+msgid "InProductMarketing|Security that's integrated into your development lifecycle"
+msgstr ""
+
+msgid "InProductMarketing|Sometimes you're not ready to make a full transition to a new tool. If you're not ready to fully commit, %{mirroring_link} gives you a safe way to try out GitLab in parallel with your current tool."
+msgstr ""
+
+msgid "InProductMarketing|Speed. Efficiency. Trust."
+msgstr ""
+
+msgid "InProductMarketing|Spin up an autoscaling runner in GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
+msgstr ""
+
+msgid "InProductMarketing|Start a Self-Managed trial"
+msgstr ""
+
+msgid "InProductMarketing|Start a free trial"
+msgstr ""
+
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
+msgstr ""
+
+msgid "InProductMarketing|Start a trial"
+msgstr ""
+
+msgid "InProductMarketing|Start by %{performance_link}"
+msgstr ""
+
+msgid "InProductMarketing|Start by importing your projects"
+msgstr ""
+
+msgid "InProductMarketing|Start with a GitLab Ultimate free trial"
+msgstr ""
+
+msgid "InProductMarketing|Start your trial now!"
+msgstr ""
+
+msgid "InProductMarketing|Start your trial today to experience single application success and discover all the features of GitLab Ultimate for free!"
+msgstr ""
+
+msgid "InProductMarketing|Stop wondering and use GitLab to answer questions like:"
+msgstr ""
+
+msgid "InProductMarketing|Streamline code review, know at a glance who's unavailable, communicate in comments or in email and integrate with Slack so everyone's on the same page."
+msgstr ""
+
+msgid "InProductMarketing|Take this 1-question survey!"
+msgstr ""
+
+msgid "InProductMarketing|Take your first steps with GitLab"
+msgstr ""
+
+msgid "InProductMarketing|Take your source code management to the next level"
+msgstr ""
+
+msgid "InProductMarketing|Team up in GitLab for greater efficiency"
+msgstr ""
+
+msgid "InProductMarketing|Team work makes the dream work"
+msgstr ""
+
+msgid "InProductMarketing|Test, create, deploy"
+msgstr ""
+
+msgid "InProductMarketing|That's all it takes to get going with GitLab, but if you're new to working with Git, check out our %{basics_link} for helpful tips and tricks for getting started."
+msgstr ""
+
+msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series."
+msgstr ""
+
+msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series. To disable notification emails sent by your local GitLab instance, either contact your administrator or %{unsubscribe_link}."
+msgstr ""
+
+msgid "InProductMarketing|Ticketmaster decreased their CI build time by 15X"
+msgstr ""
+
+msgid "InProductMarketing|Tired of wrestling with disparate tool chains, information silos and inefficient processes? GitLab's CI/CD is built on a DevOps platform with source code management, planning, monitoring and more ready to go. Find out %{ci_link}."
+msgstr ""
+
+msgid "InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}."
+msgstr ""
+
+msgid "InProductMarketing|To understand and get the most out of GitLab, start at the beginning and %{project_link}. In GitLab, repositories are part of a project, so after you've created your project you can go ahead and %{repo_link}."
+msgstr ""
+
+msgid "InProductMarketing|Track completed issues in a chart, so you can see how a milestone is progressing at a glance."
+msgstr ""
+
+msgid "InProductMarketing|Try GitLab Ultimate for free"
+msgstr ""
+
+msgid "InProductMarketing|Try it out"
+msgstr ""
+
+msgid "InProductMarketing|Try it yourself"
+msgstr ""
+
+msgid "InProductMarketing|Turn coworkers into collaborators"
+msgstr ""
+
+msgid "InProductMarketing|Twitter"
+msgstr ""
+
+msgid "InProductMarketing|Understand repository mirroring"
+msgstr ""
+
+msgid "InProductMarketing|Understand your project options"
+msgstr ""
+
+msgid "InProductMarketing|Use GitLab CI/CD"
+msgstr ""
+
+msgid "InProductMarketing|Use our AWS cloudformation template to spin up your runners in just a few clicks!"
+msgstr ""
+
+msgid "InProductMarketing|Used by more than 100,000 organizations from around the globe:"
+msgstr ""
+
+msgid "InProductMarketing|Very difficult"
+msgstr ""
+
+msgid "InProductMarketing|Very easy"
+msgstr ""
+
+msgid "InProductMarketing|Visualize your epics and milestones in a timeline."
+msgstr ""
+
+msgid "InProductMarketing|Want to host GitLab on your servers?"
+msgstr ""
+
+msgid "InProductMarketing|We know a thing or two about efficiency and we don't want to keep that to ourselves. Sign up for a free trial of GitLab Ultimate and your teams will be on it from day one."
+msgstr ""
+
+msgid "InProductMarketing|We want your GitLab experience to be great"
+msgstr ""
+
+msgid "InProductMarketing|What does our value stream timeline look like from product to development to review and production?"
+msgstr ""
+
+msgid "InProductMarketing|When your team is on GitLab these answers are a click away."
+msgstr ""
+
+msgid "InProductMarketing|Working in GitLab = more efficient"
+msgstr ""
+
+msgid "InProductMarketing|YouTube"
+msgstr ""
+
+msgid "InProductMarketing|Your software, deployed your way"
+msgstr ""
+
+msgid "InProductMarketing|Your teams can be more efficient"
+msgstr ""
+
+msgid "InProductMarketing|comprehensive guide"
+msgstr ""
+
+msgid "InProductMarketing|connect an external repository"
+msgstr ""
+
+msgid "InProductMarketing|create a project"
+msgstr ""
+
+msgid "InProductMarketing|from Bitbucket"
+msgstr ""
+
+msgid "InProductMarketing|go to about.gitlab.com"
+msgstr ""
+
+msgid "InProductMarketing|how easy it is to get started"
+msgstr ""
+
+msgid "InProductMarketing|quick start guide"
+msgstr ""
+
+msgid "InProductMarketing|repository mirroring"
+msgstr ""
+
+msgid "InProductMarketing|set up a repo"
+msgstr ""
+
+msgid "InProductMarketing|test and deploy"
+msgstr ""
+
+msgid "InProductMarketing|testing browser performance"
+msgstr ""
+
+msgid "InProductMarketing|unsubscribe"
+msgstr ""
+
+msgid "InProductMarketing|update your preferences"
+msgstr ""
+
+msgid "InProductMarketing|using a CI/CD template"
+msgstr ""
+
+msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
+msgstr ""
+
+msgid "Inactive"
+msgstr ""
+
+msgid "Incident"
+msgstr ""
+
+msgid "Incident Management Limits"
+msgstr ""
+
+msgid "Incident details"
+msgstr ""
+
+msgid "Incident template (optional)."
+msgstr ""
+
+msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
+msgstr ""
+
+msgid "IncidentManagement|%{minutes} minutes remaining"
+msgstr ""
+
+msgid "IncidentManagement|Achieved SLA"
+msgstr ""
+
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
+msgid "IncidentManagement|All"
+msgstr ""
+
+msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list."
+msgstr ""
+
+msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
+msgid "IncidentManagement|Assignees"
+msgstr ""
+
+msgid "IncidentManagement|Closed"
+msgstr ""
+
+msgid "IncidentManagement|Create incident"
+msgstr ""
+
+msgid "IncidentManagement|Critical - S1"
+msgstr ""
+
+msgid "IncidentManagement|Date created"
+msgstr ""
+
+msgid "IncidentManagement|Display your incidents in a dedicated view"
+msgstr ""
+
+msgid "IncidentManagement|High - S2"
+msgstr ""
+
+msgid "IncidentManagement|Incident"
+msgstr ""
+
+msgid "IncidentManagement|Incidents"
+msgstr ""
+
+msgid "IncidentManagement|Low - S4"
+msgstr ""
+
+msgid "IncidentManagement|Medium - S3"
+msgstr ""
+
+msgid "IncidentManagement|Missed SLA"
+msgstr ""
+
+msgid "IncidentManagement|No incidents to display."
+msgstr ""
+
+msgid "IncidentManagement|None"
+msgstr ""
+
+msgid "IncidentManagement|Open"
+msgstr ""
+
+msgid "IncidentManagement|Page your team with escalation policies"
+msgstr ""
+
+msgid "IncidentManagement|Paged"
+msgstr ""
+
+msgid "IncidentManagement|Published"
+msgstr ""
+
+msgid "IncidentManagement|Published to status page"
+msgstr ""
+
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
+msgid "IncidentManagement|Severity"
+msgstr ""
+
+msgid "IncidentManagement|Status"
+msgstr ""
+
+msgid "IncidentManagement|There are no closed incidents"
+msgstr ""
+
+msgid "IncidentManagement|There was an error displaying the incidents."
+msgstr ""
+
+msgid "IncidentManagement|Time to SLA"
+msgstr ""
+
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
+msgid "IncidentManagement|Unassigned"
+msgstr ""
+
+msgid "IncidentManagement|Unknown"
+msgstr ""
+
+msgid "IncidentManagement|Unpublished"
+msgstr ""
+
+msgid "IncidentManagement|Use escalation policies to automatically page your team when incidents are created."
+msgstr ""
+
+msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
+msgstr ""
+
+msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
+msgstr ""
+
+msgid "IncidentSettings|Grafana integration"
+msgstr ""
+
+msgid "IncidentSettings|Incident settings"
+msgstr ""
+
+msgid "IncidentSettings|Incidents"
+msgstr ""
+
+msgid "IncidentSettings|Introduce a countdown timer in incident issues to better track Service Level Agreements (SLAs). The timer starts automatically when the incident is created, and sets a time limit for resolving the incident. When activated, the time to SLA countdown appears on all new incidents."
+msgstr ""
+
+msgid "IncidentSettings|PagerDuty integration"
+msgstr ""
+
+msgid "IncidentSettings|Time limit"
+msgstr ""
+
+msgid "IncidentSettings|Time limit must be a multiple of 15 minutes."
+msgstr ""
+
+msgid "IncidentSettings|Time limit must be a valid number."
+msgstr ""
+
+msgid "IncidentSettings|Time limit must be greater than 0."
+msgstr ""
+
+msgid "IncidentSettings|When activated, this applies to all new incidents in the project."
+msgstr ""
+
+msgid "IncidentSettings|hours"
+msgstr ""
+
+msgid "IncidentSettings|minutes"
+msgstr ""
+
+msgid "Incidents"
+msgstr ""
+
+msgid "Incidents|Add image details"
+msgstr ""
+
+msgid "Incidents|Add text or a link to display with your image. If you don't add either, the file name displays instead."
+msgstr ""
+
+msgid "Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to attach it to the incident"
+msgstr ""
+
+msgid "Incidents|Must start with http or https"
+msgstr ""
+
+msgid "Incidents|There was an issue deleting the image."
+msgstr ""
+
+msgid "Incidents|There was an issue loading metric images."
+msgstr ""
+
+msgid "Incidents|There was an issue updating your image."
+msgstr ""
+
+msgid "Incidents|There was an issue uploading your image."
+msgstr ""
+
+msgid "Incident|Add new timeline event"
+msgstr ""
+
+msgid "Incident|Alert details"
+msgstr ""
+
+msgid "Incident|Are you sure you wish to delete this image?"
+msgstr ""
+
+msgid "Incident|Delete image"
+msgstr ""
+
+msgid "Incident|Deleting %{filename}"
+msgstr ""
+
+msgid "Incident|Edit image text or link"
+msgstr ""
+
+msgid "Incident|Editing %{filename}"
+msgstr ""
+
+msgid "Incident|Metrics"
+msgstr ""
+
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
+msgid "Incident|Summary"
+msgstr ""
+
+msgid "Incident|There was an issue loading alert data. Please try again."
+msgstr ""
+
+msgid "Incident|There was an issue loading incident data. Please try again."
+msgstr ""
+
+msgid "Incident|Timeline"
+msgstr ""
+
+msgid "Include author name in notification email body"
+msgstr ""
+
+msgid "Include description in commit message"
+msgstr ""
+
+msgid "Include new features from all tiers."
+msgstr ""
+
+msgid "Include the name of the author of the issue, merge request or comment in the email body. By default, GitLab overrides the email sender's name. Some email servers don't support that option."
+msgstr ""
+
+msgid "Include the username in the URL if required: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}."
+msgstr ""
+
+msgid "Includes LFS objects. It can be overridden per group, or per project. 0 for unlimited."
+msgstr ""
+
+msgid "Includes an MVC structure to help you get started"
+msgstr ""
+
+msgid "Includes an MVC structure, Gemfile, Rakefile, along with many others, to help you get started"
+msgstr ""
+
+msgid "Includes an MVC structure, mvnw and pom.xml to help you get started"
+msgstr ""
+
+msgid "Incoming email"
+msgstr ""
+
+msgid "Incoming!"
+msgstr ""
+
+msgid "Incompatible options set!"
+msgstr ""
+
+msgid "Incompatible project"
+msgstr ""
+
+msgid "Incomplete"
+msgstr ""
+
+msgid "Increase"
+msgstr ""
+
+msgid "Indent"
+msgstr ""
+
+msgid "Index"
+msgstr ""
+
+msgid "Index all projects"
+msgstr ""
+
+msgid "Index deletion is canceled"
+msgstr ""
+
+msgid "Indicates whether this runner can pick jobs without tags"
+msgstr ""
+
+msgid "Inform users without uploaded SSH keys that they can't push over SSH until one is added"
+msgstr ""
+
+msgid "Infrastructure"
+msgstr ""
+
+msgid "Infrastructure Registry"
+msgstr ""
+
+msgid "Infrastructure as Code (IaC) Scanning"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
+msgid "InfrastructureRegistry|Infrastructure Registry"
+msgstr ""
+
+msgid "InfrastructureRegistry|Publish and share your modules. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
+msgid "InfrastructureRegistry|Terraform"
+msgstr ""
+
+msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
+msgstr ""
+
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
+msgid "InfrastructureRegistry|You have no Terraform modules in your project"
+msgstr ""
+
+msgid "Inherited"
+msgstr ""
+
+msgid "Inherited:"
+msgstr ""
+
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
+msgid "Inline"
+msgstr ""
+
+msgid "Inline math"
+msgstr ""
+
+msgid "Input host keys manually"
+msgstr ""
+
+msgid "Input the remote repository URL"
+msgstr ""
+
+msgid "Insert"
+msgstr ""
+
+msgid "Insert a %{rows}x%{cols} table."
+msgstr ""
+
+msgid "Insert a code block"
+msgstr ""
+
+msgid "Insert a quote"
+msgstr ""
+
+msgid "Insert a video"
+msgstr ""
+
+msgid "Insert an image"
+msgstr ""
+
+msgid "Insert code"
+msgstr ""
+
+msgid "Insert column after"
+msgstr ""
+
+msgid "Insert column before"
+msgstr ""
+
+msgid "Insert image"
+msgstr ""
+
+msgid "Insert inline code"
+msgstr ""
+
+msgid "Insert link"
+msgstr ""
+
+msgid "Insert row after"
+msgstr ""
+
+msgid "Insert row before"
+msgstr ""
+
+msgid "Insert suggestion"
+msgstr ""
+
+msgid "Insert video"
+msgstr ""
+
+msgid "Insights"
+msgstr ""
+
+msgid "Insights|Some items are not visible beacuse the project was filtered out in the insights.yml file (see the projects.only config for more information)."
+msgstr ""
+
+msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
+msgstr ""
+
+msgid "Install GitLab Runner and ensure it's running."
+msgstr ""
+
+msgid "Install on clusters"
+msgstr ""
+
+msgid "Installation"
+msgstr ""
+
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Instance Configuration"
+msgstr ""
+
+msgid "Instance access request"
+msgstr ""
+
+msgid "Instance access request approved"
+msgstr ""
+
+msgid "Instance access request rejected"
+msgstr ""
+
+msgid "Instance administrators group already exists"
+msgstr ""
+
+msgid "Instance audit events"
+msgstr ""
+
+msgid "Instance overview"
+msgstr ""
+
+msgid "Insufficient permissions"
+msgstr ""
+
+msgid "Insufficient permissions for dast_configuration keyword"
+msgstr ""
+
+msgid "Integration"
+msgstr ""
+
+msgid "Integration Settings"
+msgstr ""
+
+msgid "Integrations"
+msgstr ""
+
+msgid "Integrations|%{integrationTitle}: active"
+msgstr ""
+
+msgid "Integrations|%{integration} settings saved and active."
+msgstr ""
+
+msgid "Integrations|%{integration} settings saved, but not active."
+msgstr ""
+
+msgid "Integrations|Active integrations"
+msgstr ""
+
+msgid "Integrations|Add an integration"
+msgstr ""
+
+msgid "Integrations|Add namespace"
+msgstr ""
+
+msgid "Integrations|All details"
+msgstr ""
+
+msgid "Integrations|All projects inheriting these settings will also be reset."
+msgstr ""
+
+msgid "Integrations|An error occurred while loading projects using custom settings."
+msgstr ""
+
+msgid "Integrations|Branches for which notifications are to be sent"
+msgstr ""
+
+msgid "Integrations|Clear if using a self-signed certificate."
+msgstr ""
+
+msgid "Integrations|Comment detail:"
+msgstr ""
+
+msgid "Integrations|Comment settings:"
+msgstr ""
+
+msgid "Integrations|Connection details"
+msgstr ""
+
+msgid "Integrations|Connection failed. Please check your settings."
+msgstr ""
+
+msgid "Integrations|Connection successful."
+msgstr ""
+
+msgid "Integrations|Create new issue in Jira"
+msgstr ""
+
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
+msgid "Integrations|Default settings are inherited from the group level."
+msgstr ""
+
+msgid "Integrations|Default settings are inherited from the instance level."
+msgstr ""
+
+msgid "Integrations|Edit project alias"
+msgstr ""
+
+msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
+msgstr ""
+
+msgid "Integrations|Enable SSL verification"
+msgstr ""
+
+msgid "Integrations|Enable comments"
+msgstr ""
+
+msgid "Integrations|Enter your alias"
+msgstr ""
+
+msgid "Integrations|Failed to link namespace. Please try again."
+msgstr ""
+
+msgid "Integrations|Failed to load namespaces. Please try again."
+msgstr ""
+
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
+msgid "Integrations|Failed to unlink namespace. Please try again."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
+msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
+msgstr ""
+
+msgid "Integrations|Includes commit title and branch."
+msgstr ""
+
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
+msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
+msgstr ""
+
+msgid "Integrations|Keep your PHP dependencies updated on Packagist."
+msgstr ""
+
+msgid "Integrations|Known limitations"
+msgstr ""
+
+msgid "Integrations|Link namespaces"
+msgstr ""
+
+msgid "Integrations|Linked namespaces"
+msgstr ""
+
+msgid "Integrations|Namespace successfully linked"
+msgstr ""
+
+msgid "Integrations|Namespaces are the GitLab groups and subgroups you link to this Jira instance."
+msgstr ""
+
+msgid "Integrations|No available namespaces."
+msgstr ""
+
+msgid "Integrations|No linked namespaces"
+msgstr ""
+
+msgid "Integrations|Projects using custom settings"
+msgstr ""
+
+msgid "Integrations|Projects using custom settings will not be affected."
+msgstr ""
+
+msgid "Integrations|Projects using custom settings will not be impacted unless the project owner chooses to use parent level defaults."
+msgstr ""
+
+msgid "Integrations|Reset integration?"
+msgstr ""
+
+msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
+msgstr ""
+
+msgid "Integrations|Return to GitLab for Jira"
+msgstr ""
+
+msgid "Integrations|SSL verification"
+msgstr ""
+
+msgid "Integrations|Save settings?"
+msgstr ""
+
+msgid "Integrations|Saving will update the default settings for all projects that are not using custom settings."
+msgstr ""
+
+msgid "Integrations|Search Jira issues"
+msgstr ""
+
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
+msgid "Integrations|Send notifications about project events to Unify Circuit."
+msgstr ""
+
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
+msgid "Integrations|Sign in to GitLab"
+msgstr ""
+
+msgid "Integrations|Sign in to add namespaces"
+msgstr ""
+
+msgid "Integrations|Standard"
+msgstr ""
+
+msgid "Integrations|There are no projects using custom settings"
+msgstr ""
+
+msgid "Integrations|This integration only works with GitLab.com. Adding a namespace only works in browsers that allow cross-site cookies. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "Integrations|This integration, and inheriting projects were reset."
+msgstr ""
+
+msgid "Integrations|To keep this project going, create a new issue."
+msgstr ""
+
+msgid "Integrations|Use custom settings"
+msgstr ""
+
+msgid "Integrations|Use default settings"
+msgstr ""
+
+msgid "Integrations|You can close this window."
+msgstr ""
+
+msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
+msgstr ""
+
+msgid "Integrations|You can use this alias in your Slack commands"
+msgstr ""
+
+msgid "Integrations|You haven't activated any integrations yet."
+msgstr ""
+
+msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
+msgstr ""
+
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
+msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "Integrations|You've activated every integration 🎉"
+msgstr ""
+
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
+msgid "Integrations|can't exceed %{recipients_limit}"
+msgstr ""
+
+msgid "Interactive mode"
+msgstr ""
+
+msgid "Interested parties can even contribute by pushing commits if they want to."
+msgstr ""
+
+msgid "Internal"
+msgstr ""
+
+msgid "Internal - The group and any internal projects can be viewed by any logged in user except external users."
+msgstr ""
+
+msgid "Internal - The project can be accessed by any logged in user except external users."
+msgstr ""
+
+msgid "Internal URL (optional)"
+msgstr ""
+
+msgid "Internal error occurred while delivering this webhook."
+msgstr ""
+
+msgid "Internal users"
+msgstr ""
+
+msgid "Internal users cannot be deactivated"
+msgstr ""
+
+msgid "Interval Pattern"
+msgstr ""
+
+msgid "Introduced in GitLab 13.1, before using %{reindexing_link_start}zero-downtime reindexing%{link_end} and %{migrations_link_start}Advanced Search migrations%{link_end}, you need to %{recreate_link_start}recreate your index%{link_end}."
+msgstr ""
+
+msgid "Introducing Your DevOps Reports"
+msgstr ""
+
+msgid "Invalid Insights config file detected"
+msgstr ""
+
+msgid "Invalid OS"
+msgstr ""
+
+msgid "Invalid URL"
+msgstr ""
+
+msgid "Invalid URL: %{url}"
+msgstr ""
+
+msgid "Invalid container_name"
+msgstr ""
+
+msgid "Invalid cursor parameter"
+msgstr ""
+
+msgid "Invalid cursor value provided"
+msgstr ""
+
+msgid "Invalid date"
+msgstr ""
+
+msgid "Invalid date format. Please use UTC format as YYYY-MM-DD"
+msgstr ""
+
+msgid "Invalid date range"
+msgstr ""
+
+msgid "Invalid feature"
+msgstr ""
+
+msgid "Invalid field"
+msgstr ""
+
+msgid "Invalid file format with specified file type"
+msgstr ""
+
+msgid "Invalid file."
+msgstr ""
+
+msgid "Invalid hash"
+msgstr ""
+
+msgid "Invalid import params"
+msgstr ""
+
+msgid "Invalid input, please avoid emojis"
+msgstr ""
+
+msgid "Invalid login or password"
+msgstr ""
+
+msgid "Invalid period"
+msgstr ""
+
+msgid "Invalid pin code."
+msgstr ""
+
+msgid "Invalid pod_name"
+msgstr ""
+
+msgid "Invalid policy type"
+msgstr ""
+
+msgid "Invalid repository bundle for snippet with id %{snippet_id}"
+msgstr ""
+
+msgid "Invalid repository path"
+msgstr ""
+
+msgid "Invalid search parameter"
+msgstr ""
+
+msgid "Invalid server response"
+msgstr ""
+
+msgid "Invalid start or end time format"
+msgstr ""
+
+msgid "Invalid status"
+msgstr ""
+
+msgid "Invalid two-factor code."
+msgstr ""
+
+msgid "Invalid yaml"
+msgstr ""
+
+msgid "Investigate vulnerability: %{title}"
+msgstr ""
+
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
+msgid "Invitation"
+msgstr ""
+
+msgid "Invitation declined"
+msgstr ""
+
+msgid "Invite \"%{email}\" by email"
+msgstr ""
+
+msgid "Invite \"%{trimmed}\" by email"
+msgstr ""
+
+msgid "Invite Members"
+msgstr ""
+
+msgid "Invite a group"
+msgstr ""
+
+msgid "Invite email has already been taken"
+msgstr ""
+
+msgid "Invite members"
+msgstr ""
+
+msgid "InviteEmail|%{inviter} invited you to join the %{project_or_group_name} %{project_or_group} as a %{role}"
+msgstr ""
+
+msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
+msgstr ""
+
+msgid "InviteEmail|%{project_or_group} details"
+msgstr ""
+
+msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
+msgstr ""
+
+msgid "InviteEmail|Join now"
+msgstr ""
+
+msgid "InviteEmail|Join your team on GitLab! %{inviter} invited you to %{project_or_group_name}"
+msgstr ""
+
+msgid "InviteEmail|Join your team on GitLab! You are invited to %{project_or_group_name}"
+msgstr ""
+
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgstr ""
+
+msgid "InviteEmail|What's it about?"
+msgstr ""
+
+msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
+msgstr ""
+
+msgid "InviteEmail|You have been invited to join the %{project_or_group_name} %{project_or_group} as a %{role}"
+msgstr ""
+
+msgid "InviteEmail|You were assigned the following tasks:"
+msgstr ""
+
+msgid "InviteEmail|and has assigned you the following tasks:"
+msgstr ""
+
+msgid "InviteMembersBanner|Collaborate with your team"
+msgstr ""
+
+msgid "InviteMembersBanner|Invite your colleagues"
+msgstr ""
+
+msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
+msgstr ""
+
+msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgstr ""
+
+msgid "InviteMembersModal|Access expiration date (optional)"
+msgstr ""
+
+msgid "InviteMembersModal|Cancel"
+msgstr ""
+
+msgid "InviteMembersModal|Choose a project for the issues"
+msgstr ""
+
+msgid "InviteMembersModal|Close invite team members"
+msgstr ""
+
+msgid "InviteMembersModal|Congratulations on creating your project, you're almost there!"
+msgstr ""
+
+msgid "InviteMembersModal|Create issues for your new team member to work on (optional)"
+msgstr ""
+
+msgid "InviteMembersModal|GitLab is better with colleagues!"
+msgstr ""
+
+msgid "InviteMembersModal|GitLab member or email address"
+msgstr ""
+
+msgid "InviteMembersModal|How about inviting a colleague or two to join you?"
+msgstr ""
+
+msgid "InviteMembersModal|Invite"
+msgstr ""
+
+msgid "InviteMembersModal|Invite a group"
+msgstr ""
+
+msgid "InviteMembersModal|Invite members"
+msgstr ""
+
+msgid "InviteMembersModal|Members were successfully added"
+msgstr ""
+
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
+msgid "InviteMembersModal|Search for a group to invite"
+msgstr ""
+
+msgid "InviteMembersModal|Select a group to invite"
+msgstr ""
+
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
+msgid "InviteMembersModal|Select members or type email addresses"
+msgstr ""
+
+msgid "InviteMembersModal|Something went wrong"
+msgstr ""
+
+msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
+msgstr ""
+
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} project."
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} group."
+msgstr ""
+
+msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
+msgstr ""
+
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
+msgid "InviteMembers|Invite a group"
+msgstr ""
+
+msgid "InviteMembers|Invite team members"
+msgstr ""
+
+msgid "InviteMember|Add members to this project and start collaborating with your team."
+msgstr ""
+
+msgid "InviteMember|Invite Members (optional)"
+msgstr ""
+
+msgid "InviteMember|Invite another member"
+msgstr ""
+
+msgid "InviteMember|Invite members"
+msgstr ""
+
+msgid "InviteMember|Invite your team"
+msgstr ""
+
+msgid "InviteMember|Invited users will be added with developer level permissions. %{linkStart}View the documentation%{linkEnd} to see how to change this later."
+msgstr ""
+
+msgid "InviteReminderEmail|%{inviter} is still waiting for you to join GitLab"
+msgstr ""
+
+msgid "InviteReminderEmail|%{inviter} is waiting for you to join GitLab"
+msgstr ""
+
+msgid "InviteReminderEmail|%{inviter} is waiting for you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}."
+msgstr ""
+
+msgid "InviteReminderEmail|%{inviter}'s invitation to GitLab is pending"
+msgstr ""
+
+msgid "InviteReminderEmail|Accept invitation"
+msgstr ""
+
+msgid "InviteReminderEmail|Accept invitation: %{invite_url}"
+msgstr ""
+
+msgid "InviteReminderEmail|Decline invitation"
+msgstr ""
+
+msgid "InviteReminderEmail|Decline invitation: %{decline_url}"
+msgstr ""
+
+msgid "InviteReminderEmail|Hey there %{wave_emoji}"
+msgstr ""
+
+msgid "InviteReminderEmail|Hey there!"
+msgstr ""
+
+msgid "InviteReminderEmail|In case you missed it..."
+msgstr ""
+
+msgid "InviteReminderEmail|Invitation pending"
+msgstr ""
+
+msgid "InviteReminderEmail|It's been %{invitation_age} days since %{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}. What would you like to do?"
+msgstr ""
+
+msgid "InviteReminderEmail|This is a friendly reminder that %{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}."
+msgstr ""
+
+msgid "Invited"
+msgstr ""
+
+msgid "Invocations"
+msgstr ""
+
+msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
+msgstr ""
+
+msgid "IrkerService|Default IRC URI (optional)"
+msgstr ""
+
+msgid "IrkerService|How to enter channels or users?"
+msgstr ""
+
+msgid "IrkerService|Recipients"
+msgstr ""
+
+msgid "IrkerService|Send update messages to an irker server."
+msgstr ""
+
+msgid "IrkerService|Send update messages to an irker server. Before you can use this, you need to set up the irker daemon. %{docs_link}"
+msgstr ""
+
+msgid "IrkerService|Server host (optional)"
+msgstr ""
+
+msgid "IrkerService|Server port (optional)"
+msgstr ""
+
+msgid "IrkerService|URI to add before each recipient."
+msgstr ""
+
+msgid "IrkerService|irker (IRC gateway)"
+msgstr ""
+
+msgid "IrkerService|irker daemon hostname (defaults to localhost)."
+msgstr ""
+
+msgid "IrkerService|irker daemon port (defaults to 6659)."
+msgstr ""
+
+msgid "Is blocked by"
+msgstr ""
+
+msgid "Is using license seat:"
+msgstr ""
+
+msgid "Is using seat"
+msgstr ""
+
+msgid "IssuableStatus|Closed"
+msgstr ""
+
+msgid "IssuableStatus|Closed (%{link})"
+msgstr ""
+
+msgid "IssuableStatus|duplicated"
+msgstr ""
+
+msgid "IssuableStatus|moved"
+msgstr ""
+
+msgid "IssuableStatus|promoted"
+msgstr ""
+
+msgid "Issue"
+msgstr ""
+
+msgid "Issue %{issue_reference} has already been added to epic %{epic_reference}."
+msgstr ""
+
+msgid "Issue Analytics"
+msgstr ""
+
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue Type"
+msgstr ""
+
+msgid "Issue already promoted to epic."
+msgstr ""
+
+msgid "Issue cannot be found."
+msgstr ""
+
+msgid "Issue created from vulnerability %{vulnerability_link}"
+msgstr ""
+
+msgid "Issue creation requests"
+msgstr ""
+
+msgid "Issue details"
+msgstr ""
+
+msgid "Issue events"
+msgstr ""
+
+msgid "Issue first deployed to production"
+msgstr ""
+
+msgid "Issue has been promoted to incident"
+msgstr ""
+
+msgid "Issue label"
+msgstr ""
+
+msgid "Issue or merge request ID is required"
+msgstr ""
+
+msgid "Issue published on status page."
+msgstr ""
+
+msgid "Issue types"
+msgstr ""
+
+msgid "Issue update failed"
+msgstr ""
+
+msgid "Issue was closed by %{name} %{reason}"
+msgstr ""
+
+msgid "Issue weight"
+msgstr ""
+
+msgid "IssueAnalytics|Age"
+msgstr ""
+
+msgid "IssueAnalytics|Assignees"
+msgstr ""
+
+msgid "IssueAnalytics|Created by"
+msgstr ""
+
+msgid "IssueAnalytics|Due date"
+msgstr ""
+
+msgid "IssueAnalytics|Failed to load issues. Please try again."
+msgstr ""
+
+msgid "IssueAnalytics|Issue"
+msgstr ""
+
+msgid "IssueAnalytics|Milestone"
+msgstr ""
+
+msgid "IssueAnalytics|Status"
+msgstr ""
+
+msgid "IssueAnalytics|Weight"
+msgstr ""
+
+msgid "IssueBoards|Board"
+msgstr ""
+
+msgid "IssueBoards|Boards"
+msgstr ""
+
+msgid "IssueBoards|Create new board"
+msgstr ""
+
+msgid "IssueBoards|Delete board"
+msgstr ""
+
+msgid "IssueBoards|No matching boards found"
+msgstr ""
+
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr ""
+
+msgid "IssueBoards|Switch board"
+msgstr ""
+
+msgid "IssueList|created %{timeAgoString} by %{user}"
+msgstr ""
+
+msgid "IssueTracker|Custom issue tracker"
+msgstr ""
+
+msgid "IssueTracker|Issue URL"
+msgstr ""
+
+msgid "IssueTracker|New issue URL"
+msgstr ""
+
+msgid "IssueTracker|The URL to create an issue in the external issue tracker."
+msgstr ""
+
+msgid "IssueTracker|The URL to the project in YouTrack."
+msgstr ""
+
+msgid "IssueTracker|The URL to the project in the external issue tracker."
+msgstr ""
+
+msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
+msgstr ""
+
+msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
+msgstr ""
+
+msgid "IssueTracker|Use Bugzilla as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use Bugzilla as this project's issue tracker. %{docs_link}"
+msgstr ""
+
+msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker. %{docs_link}"
+msgstr ""
+
+msgid "IssueTracker|Use Redmine as the issue tracker. %{docs_link}"
+msgstr ""
+
+msgid "IssueTracker|Use Redmine as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use YouTrack as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use YouTrack as this project's issue tracker. %{docs_link}"
+msgstr ""
+
+msgid "IssueTracker|Use a custom issue tracker as this project's issue tracker."
+msgstr ""
+
+msgid "IssueTracker|Use a custom issue tracker that is not in the integration list. %{docs_link}"
+msgstr ""
+
+msgid "Issues"
+msgstr ""
+
+msgid "Issues Rate Limits"
+msgstr ""
+
+msgid "Issues and merge requests"
+msgstr ""
+
+msgid "Issues are being rebalanced at the moment, so manual reordering is disabled."
+msgstr ""
+
+msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
+msgstr ""
+
+msgid "Issues closed"
+msgstr ""
+
+msgid "Issues must match this scope to appear in this list."
+msgstr ""
+
+msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
+msgstr ""
+
+msgid "Issues with label %{label}"
+msgstr ""
+
+msgid "Issues with no epic assigned"
+msgstr ""
+
+msgid "Issues, merge requests, pushes, and comments."
+msgstr ""
+
+msgid "IssuesAnalytics|After you begin creating issues for your projects, we can start tracking and displaying metrics for them"
+msgstr ""
+
+msgid "IssuesAnalytics|Avg/Month:"
+msgstr ""
+
+msgid "IssuesAnalytics|Issues created"
+msgstr ""
+
+msgid "IssuesAnalytics|Issues created per month"
+msgstr ""
+
+msgid "IssuesAnalytics|Last 12 months"
+msgstr ""
+
+msgid "IssuesAnalytics|Sorry, your filter produced no results"
+msgstr ""
+
+msgid "IssuesAnalytics|There are no issues for the projects in your group"
+msgstr ""
+
+msgid "IssuesAnalytics|To widen your search, change or remove filters in the filter bar above"
+msgstr ""
+
+msgid "IssuesAnalytics|Total:"
+msgstr ""
+
+msgid "Issue|Title"
+msgstr ""
+
+msgid "It is not possible to %{action} files that are stored in LFS using the web interface"
+msgstr ""
+
+msgid "It looks like you have some draft commits in this branch."
+msgstr ""
+
+msgid "It looks like you're attempting to activate your subscription. Use %{a_start}the Subscription page%{a_end} instead."
+msgstr ""
+
+msgid "It may be several days before you see feature usage data."
+msgstr ""
+
+msgid "It must have a header row and at least two columns: the first column is the issue title and the second column is the issue description. The separator is automatically detected."
+msgstr ""
+
+msgid "It seems like the Dependency Scanning job ran successfully, but no dependencies have been detected in your project."
+msgstr ""
+
+msgid "It seems that there is currently no available data for code coverage"
+msgstr ""
+
+msgid "It's you"
+msgstr ""
+
+msgid "Italic text"
+msgstr ""
+
+msgid "Iteration"
+msgstr ""
+
+msgid "Iteration changed to"
+msgstr ""
+
+msgid "Iteration lists not available with your current license"
+msgstr ""
+
+msgid "Iteration removed"
+msgstr ""
+
+msgid "Iteration updated"
+msgstr ""
+
+msgid "Iterations"
+msgstr ""
+
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
+msgid "Iterations|Add iteration"
+msgstr ""
+
+msgid "Iterations|All"
+msgstr ""
+
+msgid "Iterations|Cadence configuration is invalid."
+msgstr ""
+
+msgid "Iterations|Cadence name"
+msgstr ""
+
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
+msgid "Iterations|Create cadence"
+msgstr ""
+
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
+msgid "Iterations|Done"
+msgstr ""
+
+msgid "Iterations|Duration"
+msgstr ""
+
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
+msgid "Iterations|Error loading iteration cadences."
+msgstr ""
+
+msgid "Iterations|Future iterations"
+msgstr ""
+
+msgid "Iterations|Iteration cadences"
+msgstr ""
+
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
+msgstr ""
+
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
+msgid "Iterations|New iteration"
+msgstr ""
+
+msgid "Iterations|New iteration cadence"
+msgstr ""
+
+msgid "Iterations|No closed iterations."
+msgstr ""
+
+msgid "Iterations|No iteration cadences to show."
+msgstr ""
+
+msgid "Iterations|No iterations found"
+msgstr ""
+
+msgid "Iterations|No iterations in cadence."
+msgstr ""
+
+msgid "Iterations|No open iterations."
+msgstr ""
+
+msgid "Iterations|Number of future iterations you would like to have scheduled"
+msgstr ""
+
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save changes"
+msgstr ""
+
+msgid "Iterations|Select duration"
+msgstr ""
+
+msgid "Iterations|Select number"
+msgstr ""
+
+msgid "Iterations|Select start date"
+msgstr ""
+
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
+msgid "Iterations|Start date"
+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 ""
+
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
+msgid "Iterations|Title"
+msgstr ""
+
+msgid "Iterations|Unable to find iteration cadence."
+msgstr ""
+
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
+msgid "Iterations|Unable to save cadence. Please try again."
+msgstr ""
+
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
+msgstr ""
+
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this iterations cadence"
+msgstr ""
+
+msgid "Iteration|cannot be more than 500 years in the future"
+msgstr ""
+
+msgid "I’m joining my team who’s already on GitLab"
+msgstr ""
+
+msgid "Jaeger URL"
+msgstr ""
+
+msgid "Jan"
+msgstr ""
+
+msgid "January"
+msgstr ""
+
+msgid "Japanese language support using"
+msgstr ""
+
+msgid "Jira display name"
+msgstr ""
+
+msgid "Jira import is already running."
+msgstr ""
+
+msgid "Jira integration not configured."
+msgstr ""
+
+msgid "Jira project key is not configured."
+msgstr ""
+
+msgid "Jira project: %{importProject}"
+msgstr ""
+
+msgid "Jira service not configured."
+msgstr ""
+
+msgid "Jira user"
+msgstr ""
+
+msgid "Jira users have been imported from the configured Jira instance. They can be mapped by selecting a GitLab user from the dropdown in the \"GitLab username\" column. When the form appears, the dropdown defaults to the user conducting the import."
+msgstr ""
+
+msgid "Jira-GitLab user mapping template"
+msgstr ""
+
+msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
+msgstr ""
+
+msgid "JiraConnect|Failed to create branch."
+msgstr ""
+
+msgid "JiraConnect|Failed to create branch. Please try again."
+msgstr ""
+
+msgid "JiraConnect|New branch was successfully created."
+msgstr ""
+
+msgid "JiraConnect|You can now close this window and return to Jira."
+msgstr ""
+
+msgid "JiraConnect|You don't have permission to create branches for this project. Select a different project or contact the project owner for access. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "JiraRequest|A connection error occurred while connecting to Jira. Try your request again."
+msgstr ""
+
+msgid "JiraRequest|A timeout error occurred while connecting to Jira. Try your request again."
+msgstr ""
+
+msgid "JiraRequest|An SSL error occurred while connecting to Jira: %{message}. Try your request again."
+msgstr ""
+
+msgid "JiraRequest|An error occurred while requesting data from Jira. Check your %{docs_link_start}Jira integration configuration%{docs_link_end} and try again."
+msgstr ""
+
+msgid "JiraRequest|An error occurred while requesting data from Jira: %{messages}. Check your %{docs_link_start}Jira integration configuration%{docs_link_end} and try again."
+msgstr ""
+
+msgid "JiraRequest|The Jira API URL for connecting to Jira is not valid. Check your Jira integration API URL and try again."
+msgstr ""
+
+msgid "JiraRequest|The credentials for accessing Jira are not allowed to access the data. Check your %{docs_link_start}Jira integration credentials%{docs_link_end} and try again."
+msgstr ""
+
+msgid "JiraRequest|The credentials for accessing Jira are not valid. Check your %{docs_link_start}Jira integration credentials%{docs_link_end} and try again."
+msgstr ""
+
+msgid "JiraService| on branch %{branch_link}"
+msgstr ""
+
+msgid "JiraService|%{jiraDocsLinkStart}Enable the Jira integration%{jiraDocsLinkEnd} to view your Jira issues in GitLab."
+msgstr ""
+
+msgid "JiraService|%{jira_docs_link_start}Enable the Jira integration%{jira_docs_link_end} to view your Jira issues in GitLab."
+msgstr ""
+
+msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
+msgstr ""
+
+msgid "JiraService|An error occurred while fetching issue list"
+msgstr ""
+
+msgid "JiraService|Automatically transitions Jira issues to the \"Done\" category. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "JiraService|Base URL of the Jira instance."
+msgstr ""
+
+msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
+msgstr ""
+
+msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+msgstr ""
+
+msgid "JiraService|Enable Jira issue creation from vulnerabilities"
+msgstr ""
+
+msgid "JiraService|Enable Jira issues"
+msgstr ""
+
+msgid "JiraService|Enable Jira transitions"
+msgstr ""
+
+msgid "JiraService|Enter new password or API token"
+msgstr ""
+
+msgid "JiraService|Events for %{noteable_model_name} are disabled."
+msgstr ""
+
+msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
+msgstr ""
+
+msgid "JiraService|Fetch issue types for this Jira project"
+msgstr ""
+
+msgid "JiraService|For example, 12, 24"
+msgstr ""
+
+msgid "JiraService|For example, AB"
+msgstr ""
+
+msgid "JiraService|GitLab for Jira Configuration"
+msgstr ""
+
+msgid "JiraService|IDs must be a list of numbers that can be split with , or ;"
+msgstr ""
+
+msgid "JiraService|If different from Web URL."
+msgstr ""
+
+msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
+msgstr ""
+
+msgid "JiraService|Jira API URL"
+msgstr ""
+
+msgid "JiraService|Jira comments are created when an issue is referenced in a commit."
+msgstr ""
+
+msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
+msgstr ""
+
+msgid "JiraService|Jira issue type"
+msgstr ""
+
+msgid "JiraService|Jira issues"
+msgstr ""
+
+msgid "JiraService|Jira project key"
+msgstr ""
+
+msgid "JiraService|Leave blank to use your current password or API token."
+msgstr ""
+
+msgid "JiraService|Move to Done"
+msgstr ""
+
+msgid "JiraService|Open Jira"
+msgstr ""
+
+msgid "JiraService|Password or API token"
+msgstr ""
+
+msgid "JiraService|Project key changed, refresh list"
+msgstr ""
+
+msgid "JiraService|Project key is required to generate issue types"
+msgstr ""
+
+msgid "JiraService|Select issue type"
+msgstr ""
+
+msgid "JiraService|Set a custom final state by using transition IDs. %{linkStart}Learn about transition IDs%{linkEnd}"
+msgstr ""
+
+msgid "JiraService|Sign in to GitLab.com to get started."
+msgstr ""
+
+msgid "JiraService|This feature requires a Premium plan."
+msgstr ""
+
+msgid "JiraService|This is a Premium feature"
+msgstr ""
+
+msgid "JiraService|This is an Ultimate feature"
+msgstr ""
+
+msgid "JiraService|Transition Jira issues to their final state:"
+msgstr ""
+
+msgid "JiraService|Upgrade your plan to enable this feature of the Jira Integration."
+msgstr ""
+
+msgid "JiraService|Use Jira as this project's issue tracker."
+msgstr ""
+
+msgid "JiraService|Use a password for server version and an API token for cloud version."
+msgstr ""
+
+msgid "JiraService|Use a username for server version and an email for cloud version."
+msgstr ""
+
+msgid "JiraService|Use custom transitions"
+msgstr ""
+
+msgid "JiraService|Username or Email"
+msgstr ""
+
+msgid "JiraService|Using Jira for issue tracking?"
+msgstr ""
+
+msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
+msgstr ""
+
+msgid "JiraService|Web URL"
+msgstr ""
+
+msgid "JiraService|When a Jira issue is mentioned in a commit or merge request, a remote link and comment (if enabled) will be created."
+msgstr ""
+
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
+msgstr ""
+
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Job %{jobName}"
+msgstr ""
+
+msgid "Job Failed #%{build_id}"
+msgstr ""
+
+msgid "Job artifact"
+msgstr ""
+
+msgid "Job artifacts"
+msgstr ""
+
+msgid "Job has been erased"
+msgstr ""
+
+msgid "Job has been successfully erased!"
+msgstr ""
+
+msgid "Job has wrong arguments format."
+msgstr ""
+
+msgid "Job is missing the `model_type` argument."
+msgstr ""
+
+msgid "Job is stuck. Check runners."
+msgstr ""
+
+msgid "Job logs and artifacts"
+msgstr ""
+
+msgid "Job to create self-monitoring project is in progress"
+msgstr ""
+
+msgid "Job to delete self-monitoring project is in progress"
+msgstr ""
+
+msgid "Job was retried"
+msgstr ""
+
+msgid "Jobs"
+msgstr ""
+
+msgid "Jobs fail if they run longer than the timeout time. Input value is in seconds by default. Human readable input is also accepted, for example %{code_open}1 hour%{code_close}."
+msgstr ""
+
+msgid "Jobs older than the configured time are considered expired and are archived. Archived jobs can no longer be retried. Leave empty to never archive jobs automatically. The default unit is in days, but you can use other units, for example %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}. Minimum value is 1 day."
+msgstr ""
+
+msgid "Jobs|Are you sure you want to proceed?"
+msgstr ""
+
+msgid "Jobs|Are you sure you want to retry this job?"
+msgstr ""
+
+msgid "Jobs|Create CI/CD configuration file"
+msgstr ""
+
+msgid "Jobs|Filter jobs"
+msgstr ""
+
+msgid "Jobs|Job is stuck. Check runners."
+msgstr ""
+
+msgid "Jobs|Jobs are the building blocks of a GitLab CI/CD pipeline. Each job has a specific task, like testing code. To set up jobs in a CI/CD pipeline, add a CI/CD configuration file to your project."
+msgstr ""
+
+msgid "Jobs|No jobs to show"
+msgstr ""
+
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
+msgid "Jobs|Use jobs to automate your tasks"
+msgstr ""
+
+msgid "Jobs|You're about to retry a job that failed because it attempted to deploy code that is older than the latest deployment. Retrying this job could result in overwriting the environment with the older source code."
+msgstr ""
+
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id}"
+msgstr ""
+
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source}"
+msgstr ""
+
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source} into %{target}"
+msgstr ""
+
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
+msgstr ""
+
+msgid "Job|Are you sure you want to erase this job log and artifacts?"
+msgstr ""
+
+msgid "Job|Browse"
+msgstr ""
+
+msgid "Job|Cancel"
+msgstr ""
+
+msgid "Job|Canceled"
+msgstr ""
+
+msgid "Job|Complete Raw"
+msgstr ""
+
+msgid "Job|Created"
+msgstr ""
+
+msgid "Job|Download"
+msgstr ""
+
+msgid "Job|Erase job log and artifacts"
+msgstr ""
+
+msgid "Job|Failed"
+msgstr ""
+
+msgid "Job|Finished at"
+msgstr ""
+
+msgid "Job|Job artifacts"
+msgstr ""
+
+msgid "Job|Job has been erased"
+msgstr ""
+
+msgid "Job|Job has been erased by %{userLink}"
+msgstr ""
+
+msgid "Job|Keep"
+msgstr ""
+
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
+msgid "Job|Retry"
+msgstr ""
+
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
+msgid "Job|Scroll to bottom"
+msgstr ""
+
+msgid "Job|Scroll to top"
+msgstr ""
+
+msgid "Job|Show complete raw"
+msgstr ""
+
+msgid "Job|Skipped"
+msgstr ""
+
+msgid "Job|Status"
+msgstr ""
+
+msgid "Job|The artifacts were removed"
+msgstr ""
+
+msgid "Job|The artifacts will be removed"
+msgstr ""
+
+msgid "Job|These artifacts are the latest. They will not be deleted (even if expired) until newer artifacts are available."
+msgstr ""
+
+msgid "Job|This job failed because the necessary resources were not successfully created."
+msgstr ""
+
+msgid "Job|This job is stuck because the project doesn't have any runners online assigned to it."
+msgstr ""
+
+msgid "Job|This job is stuck because you don't have any active runners online or available with any of these tags assigned to them:"
+msgstr ""
+
+msgid "Job|This job is stuck because you don't have any active runners that can run this job."
+msgstr ""
+
+msgid "Job|Waiting for resource"
+msgstr ""
+
+msgid "Job|allowed to fail"
+msgstr ""
+
+msgid "Job|delayed"
+msgstr ""
+
+msgid "Job|manual"
+msgstr ""
+
+msgid "Job|triggered"
+msgstr ""
+
+msgid "Join Zoom meeting"
+msgstr ""
+
+msgid "Join a project"
+msgstr ""
+
+msgid "Join your team on GitLab and contribute to an existing project"
+msgstr ""
+
+msgid "Joined %{time_ago}"
+msgstr ""
+
+msgid "Joined %{user_created_time}"
+msgstr ""
+
+msgid "Joined projects (%{projects_count})"
+msgstr ""
+
+msgid "Jul"
+msgstr ""
+
+msgid "July"
+msgstr ""
+
+msgid "Jump to next unresolved thread"
+msgstr ""
+
+msgid "Jun"
+msgstr ""
+
+msgid "June"
+msgstr ""
+
+msgid "Just me"
+msgstr ""
+
+msgid "K8s pod health"
+msgstr ""
+
+msgid "KEY"
+msgstr ""
+
+msgid "Keep"
+msgstr ""
+
+msgid "Keep artifacts from most recent successful jobs"
+msgstr ""
+
+msgid "Keep divergent refs"
+msgstr ""
+
+msgid "Keep editing"
+msgstr ""
+
+msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
+msgstr ""
+
+msgid "Kerberos access denied"
+msgstr ""
+
+msgid "Key"
+msgstr ""
+
+msgid "Key (PEM)"
+msgstr ""
+
+msgid "Key: %{key}"
+msgstr ""
+
+msgid "Keyboard shortcuts"
+msgstr ""
+
+msgid "KeyboardKey|Alt"
+msgstr ""
+
+msgid "KeyboardKey|Ctrl"
+msgstr ""
+
+msgid "KeyboardKey|Ctrl+"
+msgstr ""
+
+msgid "KeyboardKey|Enter"
+msgstr ""
+
+msgid "KeyboardKey|Esc"
+msgstr ""
+
+msgid "KeyboardKey|Shift"
+msgstr ""
+
+msgid "KeyboardShortcuts|No shortcuts matched your search"
+msgstr ""
+
+msgid "KeyboardShortcuts|Search keyboard shortcuts"
+msgstr ""
+
+msgid "Keys"
+msgstr ""
+
+msgid "Ki"
+msgstr ""
+
+msgid "Kroki"
+msgstr ""
+
+msgid "Kubernetes"
+msgstr ""
+
+msgid "Kubernetes API returned status code: %{error_code}"
+msgstr ""
+
+msgid "Kubernetes Cluster"
+msgstr ""
+
+msgid "Kubernetes Clusters"
+msgstr ""
+
+msgid "Kubernetes cluster"
+msgstr ""
+
+msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
+msgstr ""
+
+msgid "Kubernetes cluster integration and resources are being removed."
+msgstr ""
+
+msgid "Kubernetes cluster integration was successfully removed."
+msgstr ""
+
+msgid "Kubernetes cluster was successfully updated."
+msgstr ""
+
+msgid "Kubernetes clusters"
+msgstr ""
+
+msgid "Kubernetes deployment not found"
+msgstr ""
+
+msgid "Kubernetes error: %{error_code}"
+msgstr ""
+
+msgid "LDAP"
+msgstr ""
+
+msgid "LDAP Synchronization"
+msgstr ""
+
+msgid "LDAP group settings"
+msgstr ""
+
+msgid "LDAP settings"
+msgstr ""
+
+msgid "LDAP settings updated"
+msgstr ""
+
+msgid "LDAP sync in progress. This could take a few minutes. Refresh the page to see the changes."
+msgstr ""
+
+msgid "LDAP synchronizations"
+msgstr ""
+
+msgid "LDAP uid:"
+msgstr ""
+
+msgid "LFS"
+msgstr ""
+
+msgid "LFS objects"
+msgstr ""
+
+msgid "LFSStatus|Disabled"
+msgstr ""
+
+msgid "LFSStatus|Enabled"
+msgstr ""
+
+msgid "LICENSE"
+msgstr ""
+
+msgid "Label"
+msgstr ""
+
+msgid "Label actions dropdown"
+msgstr ""
+
+msgid "Label priority"
+msgstr ""
+
+msgid "Label was created"
+msgstr ""
+
+msgid "Label was removed"
+msgstr ""
+
+msgid "Label was successfully updated."
+msgstr ""
+
+msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
+msgstr ""
+
+msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
+msgstr ""
+
+msgid "LabelSelect|Labels"
+msgstr ""
+
+msgid "Labels"
+msgstr ""
+
+msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
+msgstr ""
+
+msgid "Labels can be applied to issues and merge requests to categorize them."
+msgstr ""
+
+msgid "Labels can be applied to issues and merge requests."
+msgstr ""
+
+msgid "Labels with no issues in this iteration:"
+msgstr ""
+
+msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
+msgstr ""
+
+msgid "Labels|Promote Label"
+msgstr ""
+
+msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. If a group label with the same title exists, it will also be merged. This action cannot be reversed."
+msgstr ""
+
+msgid "Language"
+msgstr ""
+
+msgid "Large File Storage"
+msgstr ""
+
+msgid "Last %d day"
+msgid_plural "Last %d days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Last %{days} days"
+msgstr ""
+
+msgid "Last 2 weeks"
+msgstr ""
+
+msgid "Last 30 days"
+msgstr ""
+
+msgid "Last 60 days"
+msgstr ""
+
+msgid "Last 90 days"
+msgstr ""
+
+msgid "Last Accessed On"
+msgstr ""
+
+msgid "Last Activity"
+msgstr ""
+
+msgid "Last Name"
+msgstr ""
+
+msgid "Last Pipeline"
+msgstr ""
+
+msgid "Last Seen"
+msgstr ""
+
+msgid "Last Sync"
+msgstr ""
+
+msgid "Last Used"
+msgstr ""
+
+msgid "Last accessed on"
+msgstr ""
+
+msgid "Last activity"
+msgstr ""
+
+msgid "Last commit"
+msgstr ""
+
+msgid "Last contact"
+msgstr ""
+
+msgid "Last edited %{date}"
+msgstr ""
+
+msgid "Last edited by %{link_start}%{avatar} %{name}%{link_end}"
+msgstr ""
+
+msgid "Last item before this page loaded in your browser:"
+msgstr ""
+
+msgid "Last modified"
+msgstr ""
+
+msgid "Last month"
+msgstr ""
+
+msgid "Last name"
+msgstr ""
+
+msgid "Last reply by"
+msgstr ""
+
+msgid "Last repository check (%{last_check_timestamp}) failed. See the 'repocheck.log' file for error messages."
+msgstr ""
+
+msgid "Last seen"
+msgstr ""
+
+msgid "Last sign-in"
+msgstr ""
+
+msgid "Last sign-in IP:"
+msgstr ""
+
+msgid "Last sign-in at:"
+msgstr ""
+
+msgid "Last successful sync"
+msgstr ""
+
+msgid "Last successful update"
+msgstr ""
+
+msgid "Last time checked"
+msgstr ""
+
+msgid "Last time verified"
+msgstr ""
+
+msgid "Last update"
+msgstr ""
+
+msgid "Last update attempt"
+msgstr ""
+
+msgid "Last updated"
+msgstr ""
+
+msgid "Last updated %{time} ago"
+msgstr ""
+
+msgid "Last used"
+msgstr ""
+
+msgid "Last used %{last_used_at} ago"
+msgstr ""
+
+msgid "Last used on:"
+msgstr ""
+
+msgid "Last week"
+msgstr ""
+
+msgid "Last year"
+msgstr ""
+
+msgid "LastCommit|authored"
+msgstr ""
+
+msgid "LastPushEvent|You pushed to"
+msgstr ""
+
+msgid "LastPushEvent|at"
+msgstr ""
+
+msgid "Latest changes"
+msgstr ""
+
+msgid "Latest pipeline for the most recent commit on this branch"
+msgstr ""
+
+msgid "Launch a ready-to-code development environment for your project."
+msgstr ""
+
+msgid "Layout|Fixed"
+msgstr ""
+
+msgid "Layout|Fluid"
+msgstr ""
+
+msgid "Lead Time"
+msgstr ""
+
+msgid "Lead time"
+msgstr ""
+
+msgid "Learn GitLab"
+msgstr ""
+
+msgid "Learn GitLab - Ultimate trial"
+msgstr ""
+
+msgid "Learn GitLab|Trial only"
+msgstr ""
+
+msgid "Learn More"
+msgstr ""
+
+msgid "Learn More."
+msgstr ""
+
+msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
+msgstr ""
+
+msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
+msgstr ""
+
+msgid "Learn more"
+msgstr ""
+
+msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
+msgstr ""
+
+msgid "Learn more about %{username}"
+msgstr ""
+
+msgid "Learn more about Auto DevOps"
+msgstr ""
+
+msgid "Learn more about GitLab"
+msgstr ""
+
+msgid "Learn more about Needs relationships"
+msgstr ""
+
+msgid "Learn more about Web Terminal"
+msgstr ""
+
+msgid "Learn more about X.509 signed commits"
+msgstr ""
+
+msgid "Learn more about adding certificates to your project by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
+msgstr ""
+
+msgid "Learn more about custom project templates"
+msgstr ""
+
+msgid "Learn more about deploying to AWS"
+msgstr ""
+
+msgid "Learn more about deploying to a cluster"
+msgstr ""
+
+msgid "Learn more about group-level project templates"
+msgstr ""
+
+msgid "Learn more about groups."
+msgstr ""
+
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
+msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
+msgstr ""
+
+msgid "Learn more about signing commits"
+msgstr ""
+
+msgid "Learn more in the"
+msgstr ""
+
+msgid "Learn more."
+msgstr ""
+
+msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
+msgstr ""
+
+msgid "LearnGitLab|Add code owners"
+msgstr ""
+
+msgid "LearnGitLab|Add merge request approval"
+msgstr ""
+
+msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
+msgstr ""
+
+msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
+msgstr ""
+
+msgid "LearnGitLab|Create an issue"
+msgstr ""
+
+msgid "LearnGitLab|Create or import a repository"
+msgstr ""
+
+msgid "LearnGitLab|Create or import your first repository into your new project."
+msgstr ""
+
+msgid "LearnGitLab|Create/import issues (tickets) to collaborate on ideas and plan work."
+msgstr ""
+
+msgid "LearnGitLab|Deploy"
+msgstr ""
+
+msgid "LearnGitLab|Enable require merge approvals"
+msgstr ""
+
+msgid "LearnGitLab|GitLab works best as a team. Invite your colleague to enjoy all features."
+msgstr ""
+
+msgid "LearnGitLab|Invite your colleagues"
+msgstr ""
+
+msgid "LearnGitLab|Learn GitLab"
+msgstr ""
+
+msgid "LearnGitLab|Plan and execute"
+msgstr ""
+
+msgid "LearnGitLab|Prevent unexpected changes to important assets by assigning ownership of files and paths."
+msgstr ""
+
+msgid "LearnGitLab|Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
+msgstr ""
+
+msgid "LearnGitLab|Review and edit proposed changes to source code."
+msgstr ""
+
+msgid "LearnGitLab|Route code reviews to the right reviewers, every time."
+msgstr ""
+
+msgid "LearnGitLab|Run a Security scan using CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
+msgstr ""
+
+msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
+msgstr ""
+
+msgid "LearnGitLab|Set up CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Set up your workspace"
+msgstr ""
+
+msgid "LearnGitLab|Set-up CI/CD"
+msgstr ""
+
+msgid "LearnGitLab|Start a free Ultimate trial"
+msgstr ""
+
+msgid "LearnGitLab|Submit a merge request"
+msgstr ""
+
+msgid "LearnGitLab|Submit a merge request (MR)"
+msgstr ""
+
+msgid "LearnGitLab|Try GitLab Ultimate for free"
+msgstr ""
+
+msgid "LearnGitLab|Try all GitLab features for 30 days, no credit card required."
+msgstr ""
+
+msgid "LearnGitLab|Use your new GitLab workflow to deploy your application, monitor its health, and keep it secure:"
+msgstr ""
+
+msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
+msgstr ""
+
+msgid "LearnGitlab|Creating your onboarding experience..."
+msgstr ""
+
+msgid "LearnGitlab|Ok, let's go"
+msgstr ""
+
+msgid "LearnGitlab|Trial only"
+msgstr ""
+
+msgid "Leave"
+msgstr ""
+
+msgid "Leave Admin Mode"
+msgstr ""
+
+msgid "Leave edit mode? All unsaved changes will be lost."
+msgstr ""
+
+msgid "Leave group"
+msgstr ""
+
+msgid "Leave project"
+msgstr ""
+
+msgid "Leave zen mode"
+msgstr ""
+
+msgid "Leaving this setting enabled is recommended."
+msgstr ""
+
+msgid "Legacy burndown chart"
+msgstr ""
+
+msgid "Less Details"
+msgstr ""
+
+msgid "Let's Encrypt does not accept emails on example.com"
+msgstr ""
+
+msgid "Let's Encrypt is a free, automated, and open certificate authority (CA) that gives digital certificates in order to enable HTTPS (SSL/TLS) for websites. Learn more about Let's Encrypt configuration by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
+msgstr ""
+
+msgid "Let's talk!"
+msgstr ""
+
+msgid "License Compliance"
+msgstr ""
+
+msgid "License Compliance| Used by"
+msgstr ""
+
+msgid "License compliance"
+msgstr ""
+
+msgid "License file"
+msgstr ""
+
+msgid "License key"
+msgstr ""
+
+msgid "License overview"
+msgstr ""
+
+msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are active"
+msgstr ""
+
+msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
+msgstr ""
+
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
+msgid "LicenseCompliance|Acceptable license to be used in the project"
+msgstr ""
+
+msgid "LicenseCompliance|Add license and related policy"
+msgstr ""
+
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
+msgid "LicenseCompliance|Allow"
+msgstr ""
+
+msgid "LicenseCompliance|Allowed"
+msgstr ""
+
+msgid "LicenseCompliance|Denied"
+msgstr ""
+
+msgid "LicenseCompliance|Deny"
+msgstr ""
+
+msgid "LicenseCompliance|Disallow merge request if detected and will instruct developer to remove"
+msgstr ""
+
+msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
+msgstr ""
+
+msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
+msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only; approval required"
+msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only; approval required"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d license for the source branch only"
+msgid_plural "LicenseCompliance|License Compliance detected %d licenses for the source branch only"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d new license"
+msgid_plural "LicenseCompliance|License Compliance detected %d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d new license and policy violation"
+msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d new license and policy violation; approval required"
+msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
+msgstr ""
+
+msgid "LicenseCompliance|License Compliance detected no new licenses"
+msgstr ""
+
+msgid "LicenseCompliance|License name"
+msgstr ""
+
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
+msgid "LicenseCompliance|Remove license"
+msgstr ""
+
+msgid "LicenseCompliance|Remove license?"
+msgstr ""
+
+msgid "LicenseCompliance|There are currently no policies in this project."
+msgstr ""
+
+msgid "LicenseCompliance|There are currently no policies that match in this project."
+msgstr ""
+
+msgid "LicenseCompliance|This license already exists in this project."
+msgstr ""
+
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
+msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
+msgstr ""
+
+msgid "LicenseManagement|Allowed"
+msgstr ""
+
+msgid "LicenseManagement|Denied"
+msgstr ""
+
+msgid "LicenseManagement|Uncategorized"
+msgstr ""
+
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
+msgid "Licensed Features"
+msgstr ""
+
+msgid "Licensed to:"
+msgstr ""
+
+msgid "Licenses"
+msgstr ""
+
+msgid "Licenses|%{remainingComponentsCount} more"
+msgstr ""
+
+msgid "Licenses|Acceptable license to be used in the project"
+msgstr ""
+
+msgid "Licenses|Component"
+msgstr ""
+
+msgid "Licenses|Components"
+msgstr ""
+
+msgid "Licenses|Detected in Project"
+msgstr ""
+
+msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
+msgstr ""
+
+msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+msgstr ""
+
+msgid "Licenses|Drag your license file here or %{linkStart}click to upload%{linkEnd}."
+msgstr ""
+
+msgid "Licenses|Drop your license file to start the upload."
+msgstr ""
+
+msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
+msgstr ""
+
+msgid "Licenses|Error: You are trying to upload something other than a file"
+msgstr ""
+
+msgid "Licenses|License Compliance"
+msgstr ""
+
+msgid "Licenses|Name"
+msgstr ""
+
+msgid "Licenses|Policies"
+msgstr ""
+
+msgid "Licenses|Policy"
+msgstr ""
+
+msgid "Licenses|Policy violation: denied"
+msgstr ""
+
+msgid "Licenses|Specified policies in this project"
+msgstr ""
+
+msgid "Licenses|The file could not be uploaded."
+msgstr ""
+
+msgid "Licenses|The license list details information about the licenses used within your project."
+msgstr ""
+
+msgid "Licenses|Unacceptable license, if detected it will disallow a merge request until it's removed"
+msgstr ""
+
+msgid "Licenses|View license details for your project"
+msgstr ""
+
+msgid "Limit display of time tracking units to hours."
+msgstr ""
+
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
+msgstr ""
+
+msgid "Limit the number of concurrent operations this secondary site can run in the background."
+msgstr ""
+
+msgid "Limit the number of inbound incident management alerts that can be sent to a project."
+msgstr ""
+
+msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
+msgstr ""
+
+msgid "Limit the number of namespaces and projects that can be indexed."
+msgstr ""
+
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
+msgid "Limiting mode"
+msgstr ""
+
+msgid "Line changes"
+msgstr ""
+
+msgid "Link"
+msgstr ""
+
+msgid "Link (optional)"
+msgstr ""
+
+msgid "Link Prometheus monitoring to GitLab."
+msgstr ""
+
+msgid "Link Sentry to GitLab to discover and view the errors your application generates."
+msgstr ""
+
+msgid "Link URL"
+msgstr ""
+
+msgid "Link an external wiki from the project's sidebar. %{docs_link}"
+msgstr ""
+
+msgid "Link copied"
+msgstr ""
+
+msgid "Link text"
+msgstr ""
+
+msgid "Link title"
+msgstr ""
+
+msgid "Link title is required"
+msgstr ""
+
+msgid "Link to an image"
+msgstr ""
+
+msgid "Link to go to GitLab pipeline documentation"
+msgstr ""
+
+msgid "Link to your Grafana instance."
+msgstr ""
+
+msgid "Linked emails (%{email_count})"
+msgstr ""
+
+msgid "Linked epics"
+msgstr ""
+
+msgid "Linked issues"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
+msgid "LinkedIn:"
+msgstr ""
+
+msgid "LinkedPipelines|%{counterLabel} more downstream pipelines"
+msgstr ""
+
+msgid "Links"
+msgstr ""
+
+msgid "List"
+msgstr ""
+
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
+msgid "List of all merge commits"
+msgstr ""
+
+msgid "List of suitable GCP locations"
+msgstr ""
+
+msgid "List of users allowed to exceed the rate limit."
+msgstr ""
+
+msgid "List options"
+msgstr ""
+
+msgid "List settings"
+msgstr ""
+
+msgid "List the merge requests that must be merged before this one."
+msgstr ""
+
+msgid "List view"
+msgstr ""
+
+msgid "List your Bitbucket Server repositories"
+msgstr ""
+
+msgid "Live preview"
+msgstr ""
+
+msgid "Load more"
+msgstr ""
+
+msgid "Load more users"
+msgstr ""
+
+msgid "Loading"
+msgstr ""
+
+msgid "Loading %{name}"
+msgstr ""
+
+msgid "Loading contribution stats for group members"
+msgstr ""
+
+msgid "Loading files, directories, and submodules in the path %{path} for commit reference %{ref}"
+msgstr ""
+
+msgid "Loading functions timed out. Please reload the page to try again."
+msgstr ""
+
+msgid "Loading more"
+msgstr ""
+
+msgid "Loading snippet"
+msgstr ""
+
+msgid "Loading the GitLab IDE..."
+msgstr ""
+
+msgid "Loading..."
+msgstr ""
+
+msgid "Loading…"
+msgstr ""
+
+msgid "Localization"
+msgstr ""
+
+msgid "Location"
+msgstr ""
+
+msgid "Location:"
+msgstr ""
+
+msgid "Lock"
+msgstr ""
+
+msgid "Lock %{issuableDisplayName}"
+msgstr ""
+
+msgid "Lock File?"
+msgstr ""
+
+msgid "Lock memberships to LDAP synchronization"
+msgstr ""
+
+msgid "Lock not found"
+msgstr ""
+
+msgid "Lock the discussion"
+msgstr ""
+
+msgid "Lock this %{issuableDisplayName}? Only %{strongStart}project members%{strongEnd} will be able to comment."
+msgstr ""
+
+msgid "Lock to current projects"
+msgstr ""
+
+msgid "Locked"
+msgstr ""
+
+msgid "Locked Files"
+msgstr ""
+
+msgid "Locked by %{fileLockUserName}"
+msgstr ""
+
+msgid "Locked the discussion."
+msgstr ""
+
+msgid "Locked to current projects"
+msgstr ""
+
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Locks the discussion."
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|About GitLab"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Explore GitLab"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Get started"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|GitLab Learn"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|GitLab docs"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|GitLab: the DevOps platform"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|How GitLab compares"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Install GitLab"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Pricing"
+msgstr ""
+
+msgid "LoggedOutMarketingHeader|Talk to an expert"
+msgstr ""
+
+msgid "Login"
+msgstr ""
+
+msgid "Login with smartcard"
+msgstr ""
+
+msgid "Logo was successfully removed."
+msgstr ""
+
+msgid "Logo will be removed. Are you sure?"
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Logs|To see the logs, deploy your code to an environment."
+msgstr ""
+
+msgid "Low vulnerabilities present"
+msgstr ""
+
+msgid "MB"
+msgstr ""
+
+msgid "MD5"
+msgstr ""
+
+msgid "MERGED"
+msgstr ""
+
+msgid "MR widget|Back to the merge request"
+msgstr ""
+
+msgid "MR widget|See your pipeline in action"
+msgstr ""
+
+msgid "MR widget|Take a look at our %{beginnerLinkStart}Beginner's Guide to Continuous Integration%{beginnerLinkEnd} and our %{exampleLinkStart}examples of GitLab CI/CD%{exampleLinkEnd} to learn more."
+msgstr ""
+
+msgid "MR widget|The pipeline will test your code on every commit. A %{codeQualityLinkStart}code quality report%{codeQualityLinkEnd} will appear in your merge requests to warn you about potential code degradations."
+msgstr ""
+
+msgid "MRApprovals|Approvals"
+msgstr ""
+
+msgid "MRApprovals|Approved by"
+msgstr ""
+
+msgid "MRApprovals|Approvers"
+msgstr ""
+
+msgid "MRApprovals|Commented by"
+msgstr ""
+
+msgid "MRDiffFile|Changes are too large to be shown."
+msgstr ""
+
+msgid "MRDiffFile|View file @ %{commitSha}"
+msgstr ""
+
+msgid "MRDiff|Show changes only"
+msgstr ""
+
+msgid "MRDiff|Show full file"
+msgstr ""
+
+msgid "Made this issue confidential."
+msgstr ""
+
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
+msgid "Maintenance mode"
+msgstr ""
+
+msgid "Make adjustments to how your GitLab instance is set up."
+msgstr ""
+
+msgid "Make and review changes in the browser with the Web IDE"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make issue confidential"
+msgstr ""
+
+msgid "Make sure you save it - you won't be able to access it again."
+msgstr ""
+
+msgid "Makes this issue confidential."
+msgstr ""
+
+msgid "Manage %{workspace} labels"
+msgstr ""
+
+msgid "Manage Web IDE features."
+msgstr ""
+
+msgid "Manage access"
+msgstr ""
+
+msgid "Manage all notifications"
+msgstr ""
+
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that use GitLab as an OAuth provider."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage git repositories with fine-grained access controls that keep your code secure."
+msgstr ""
+
+msgid "Manage group labels"
+msgstr ""
+
+msgid "Manage labels"
+msgstr ""
+
+msgid "Manage members"
+msgstr ""
+
+msgid "Manage milestones"
+msgstr ""
+
+msgid "Manage project labels"
+msgstr ""
+
+msgid "Manage projects."
+msgstr ""
+
+msgid "Manage two-factor authentication"
+msgstr ""
+
+msgid "Manage your license"
+msgstr ""
+
+msgid "Manage your project's triggers"
+msgstr ""
+
+msgid "Managed Account"
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Manifest import"
+msgstr ""
+
+msgid "Manual"
+msgstr ""
+
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
+msgid "ManualOrdering|Couldn't save the order of the issues"
+msgstr ""
+
+msgid "Manually link this issue by adding it to the linked issue section of the %{linkStart}originating vulnerability%{linkEnd}."
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Mar"
+msgstr ""
+
+msgid "March"
+msgstr ""
+
+msgid "Mark as done"
+msgstr ""
+
+msgid "Mark as draft"
+msgstr ""
+
+msgid "Mark as ready"
+msgstr ""
+
+msgid "Mark this issue as a duplicate of another issue"
+msgstr ""
+
+msgid "Mark this issue as related to another issue"
+msgstr ""
+
+msgid "Mark to do as done"
+msgstr ""
+
+msgid "Markdown"
+msgstr ""
+
+msgid "Markdown Help"
+msgstr ""
+
+msgid "Markdown enabled."
+msgstr ""
+
+msgid "Markdown is supported"
+msgstr ""
+
+msgid "Markdown supported."
+msgstr ""
+
+msgid "MarkdownEditor|Add a link (%{modifierKey}K)"
+msgstr ""
+
+msgid "MarkdownEditor|Add a link (%{modifier_key}K)"
+msgstr ""
+
+msgid "MarkdownEditor|Add bold text (%{modifierKey}B)"
+msgstr ""
+
+msgid "MarkdownEditor|Add bold text (%{modifier_key}B)"
+msgstr ""
+
+msgid "MarkdownEditor|Add italic text (%{modifierKey}I)"
+msgstr ""
+
+msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
+msgstr ""
+
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
+msgstr ""
+
+msgid "MarkdownEditor|Add strikethrough text (%{modifier_key}⇧X)"
+msgstr ""
+
+msgid "Marked For Deletion At - %{deletion_time}"
+msgstr ""
+
+msgid "Marked as draft. Can only be merged when marked as ready."
+msgstr ""
+
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
+msgid "Marked this %{noun} as a draft."
+msgstr ""
+
+msgid "Marked this issue as a duplicate of %{duplicate_param}."
+msgstr ""
+
+msgid "Marked this issue as related to %{issue_ref}."
+msgstr ""
+
+msgid "Marked to do as done."
+msgstr ""
+
+msgid "Marks this %{noun} as a draft."
+msgstr ""
+
+msgid "Marks this issue as a duplicate of %{duplicate_reference}."
+msgstr ""
+
+msgid "Marks this issue as related to %{issue_ref}."
+msgstr ""
+
+msgid "Marks to do as done."
+msgstr ""
+
+msgid "Mask variable"
+msgstr ""
+
+msgid "Match not found; try refining your search query."
+msgstr ""
+
+msgid "Mattermost"
+msgstr ""
+
+msgid "Mattermost URL:"
+msgstr ""
+
+msgid "Mattermost notifications"
+msgstr ""
+
+msgid "MattermostService|Add to Mattermost"
+msgstr ""
+
+msgid "MattermostService|After you configure the integration, view your new Mattermost commands by entering"
+msgstr ""
+
+msgid "MattermostService|Command trigger word"
+msgstr ""
+
+msgid "MattermostService|Fill in the word that works best for your team."
+msgstr ""
+
+msgid "MattermostService|Request URL"
+msgstr ""
+
+msgid "MattermostService|Request method"
+msgstr ""
+
+msgid "MattermostService|Response icon"
+msgstr ""
+
+msgid "MattermostService|Response username"
+msgstr ""
+
+msgid "MattermostService|Suggestions:"
+msgstr ""
+
+msgid "MattermostService|Use this service to perform common tasks in your project by entering slash commands in Mattermost."
+msgstr ""
+
+msgid "Max 100,000 events"
+msgstr ""
+
+msgid "Max authenticated Git LFS requests per period per user"
+msgstr ""
+
+msgid "Max file size is 200 KB."
+msgstr ""
+
+msgid "Max role"
+msgstr ""
+
+msgid "Max seats used"
+msgstr ""
+
+msgid "Max session time"
+msgstr ""
+
+msgid "Maximum 20 characters"
+msgstr ""
+
+msgid "Maximum Conan package file size in bytes"
+msgstr ""
+
+msgid "Maximum Helm chart file size in bytes"
+msgstr ""
+
+msgid "Maximum Maven package file size in bytes"
+msgstr ""
+
+msgid "Maximum NuGet package file size in bytes"
+msgstr ""
+
+msgid "Maximum PyPI package file size in bytes"
+msgstr ""
+
+msgid "Maximum Terraform Module package file size in bytes"
+msgstr ""
+
+msgid "Maximum Users"
+msgstr ""
+
+msgid "Maximum allowable lifetime for personal access token (days)"
+msgstr ""
+
+msgid "Maximum allowed lifetime for SSH keys (in days)"
+msgstr ""
+
+msgid "Maximum artifacts size"
+msgstr ""
+
+msgid "Maximum artifacts size (MB)"
+msgstr ""
+
+msgid "Maximum attachment size"
+msgstr ""
+
+msgid "Maximum attachment size (MB)"
+msgstr ""
+
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum bulk request size (MiB)"
+msgstr ""
+
+msgid "Maximum capacity"
+msgstr ""
+
+msgid "Maximum character limit - %{limit}"
+msgstr ""
+
+msgid "Maximum concurrency of Elasticsearch bulk requests per indexing operation."
+msgstr ""
+
+msgid "Maximum delay (Minutes)"
+msgstr ""
+
+msgid "Maximum diff patch size"
+msgstr ""
+
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
+msgid "Maximum duration of a session."
+msgstr ""
+
+msgid "Maximum field length"
+msgstr ""
+
+msgid "Maximum file size indexed (KiB)"
+msgstr ""
+
+msgid "Maximum file size is 1 MB. Image size must be 32 x 32 pixels. Allowed image formats are %{favicon_extension_whitelist}."
+msgstr ""
+
+msgid "Maximum file size is 1MB. Pages are optimized for a 28px tall header logo"
+msgstr ""
+
+msgid "Maximum file size is 1MB. Pages are optimized for a 640x360 px logo."
+msgstr ""
+
+msgid "Maximum file size is 2MB. Please select a smaller file."
+msgstr ""
+
+msgid "Maximum files in a diff"
+msgstr ""
+
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
+msgid "Maximum import size"
+msgstr ""
+
+msgid "Maximum import size (MB)"
+msgstr ""
+
+msgid "Maximum job artifact size"
+msgstr ""
+
+msgid "Maximum job timeout"
+msgstr ""
+
+msgid "Maximum job timeout has a value which could not be accepted"
+msgstr ""
+
+msgid "Maximum lines in a diff"
+msgstr ""
+
+msgid "Maximum npm package file size in bytes"
+msgstr ""
+
+msgid "Maximum number of %{name} (%{count}) exceeded"
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgstr ""
+
+msgid "Maximum number of comments exceeded"
+msgstr ""
+
+msgid "Maximum number of mirrors that can be synchronizing at the same time."
+msgstr ""
+
+msgid "Maximum number of projects."
+msgstr ""
+
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
+msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgstr ""
+
+msgid "Maximum number of unique IP addresses per user."
+msgstr ""
+
+msgid "Maximum page reached"
+msgstr ""
+
+msgid "Maximum page size"
+msgstr ""
+
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
+msgid "Maximum push size"
+msgstr ""
+
+msgid "Maximum push size (MB)"
+msgstr ""
+
+msgid "Maximum requests per 10 minutes per user"
+msgstr ""
+
+msgid "Maximum requests per minute"
+msgstr ""
+
+msgid "Maximum running slices"
+msgstr ""
+
+msgid "Maximum size limit for a single commit."
+msgstr ""
+
+msgid "Maximum size limit for each repository."
+msgstr ""
+
+msgid "Maximum size of Elasticsearch bulk indexing requests."
+msgstr ""
+
+msgid "Maximum size of import files."
+msgstr ""
+
+msgid "Maximum size of individual attachments in comments."
+msgstr ""
+
+msgid "Maximum size of pages (MB)"
+msgstr ""
+
+msgid "Maximum snippet size"
+msgstr ""
+
+msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
+msgstr ""
+
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgstr ""
+
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
+msgstr ""
+
+msgid "May"
+msgstr ""
+
+msgid "Mean time to merge"
+msgstr ""
+
+msgid "Measured in bytes of code. Excludes generated and vendored code."
+msgstr ""
+
+msgid "Medium timeout"
+msgstr ""
+
+msgid "Medium vulnerabilities present"
+msgstr ""
+
+msgid "Member since"
+msgstr ""
+
+msgid "Member since %{date}"
+msgstr ""
+
+msgid "Member since:"
+msgstr ""
+
+msgid "MemberInviteEmail|%{member_name} invited you to join GitLab"
+msgstr ""
+
+msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or_group_name}"
+msgstr ""
+
+msgid "Members"
+msgstr ""
+
+msgid "Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}"
+msgstr ""
+
+msgid "Members listed as CODEOWNERS of affected files."
+msgstr ""
+
+msgid "Members of %{group} can also merge into this branch: %{branch}"
+msgstr ""
+
+msgid "Members of %{group} can also push to this branch: %{branch}"
+msgstr ""
+
+msgid "Members of a group may only view projects they have permission to access"
+msgstr ""
+
+msgid "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seat in use and will be billed for the overage."
+msgid_plural "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seats in use and will be billed for the overage."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "MembersOverage|You are about to incur additional charges"
+msgstr ""
+
+msgid "MembersOverage|Your subscription includes %d seat."
+msgid_plural "MembersOverage|Your subscription includes %d seats."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Membership"
+msgstr ""
+
+msgid "Members|%{time} by %{user}"
+msgstr ""
+
+msgid "Members|%{userName} is currently an LDAP user. Editing their permissions will override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "Members|2FA"
+msgstr ""
+
+msgid "Members|An error occurred while trying to enable LDAP override, please try again."
+msgstr ""
+
+msgid "Members|An error occurred while trying to revert to LDAP group sync settings, please try again."
+msgstr ""
+
+msgid "Members|An error occurred while updating the member's expiration date, please try again."
+msgstr ""
+
+msgid "Members|An error occurred while updating the member's role, please try again."
+msgstr ""
+
+msgid "Members|Are you sure you want to deny %{usersName}'s request to join \"%{source}\""
+msgstr ""
+
+msgid "Members|Are you sure you want to leave \"%{source}\"?"
+msgstr ""
+
+msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
+msgstr ""
+
+msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
+msgstr ""
+
+msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
+msgstr ""
+
+msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
+msgstr ""
+
+msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
+msgstr ""
+
+msgid "Members|Direct"
+msgstr ""
+
+msgid "Members|Disabled"
+msgstr ""
+
+msgid "Members|Edit permissions"
+msgstr ""
+
+msgid "Members|Enabled"
+msgstr ""
+
+msgid "Members|Expiration date removed successfully."
+msgstr ""
+
+msgid "Members|Expiration date updated successfully."
+msgstr ""
+
+msgid "Members|Filter members"
+msgstr ""
+
+msgid "Members|Inherited"
+msgstr ""
+
+msgid "Members|LDAP override enabled."
+msgstr ""
+
+msgid "Members|Leave \"%{source}\""
+msgstr ""
+
+msgid "Members|Membership"
+msgstr ""
+
+msgid "Members|Remove \"%{groupName}\""
+msgstr ""
+
+msgid "Members|Remove group"
+msgstr ""
+
+msgid "Members|Revert to LDAP group sync settings"
+msgstr ""
+
+msgid "Members|Reverted to LDAP group sync settings."
+msgstr ""
+
+msgid "Members|Role updated successfully."
+msgstr ""
+
+msgid "Members|Search groups"
+msgstr ""
+
+msgid "Members|Search invited"
+msgstr ""
+
+msgid "Member|Deny access"
+msgstr ""
+
+msgid "Member|Revoke invite"
+msgstr ""
+
+msgid "Memory Usage"
+msgstr ""
+
+msgid "Menu"
+msgstr ""
+
+msgid "Merge"
+msgstr ""
+
+msgid "Merge Conflicts"
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
+msgid "Merge Request Analytics"
+msgstr ""
+
+msgid "Merge Requests"
+msgstr ""
+
+msgid "Merge Requests created"
+msgstr ""
+
+msgid "Merge Requests in Review"
+msgstr ""
+
+msgid "Merge Requests merged"
+msgstr ""
+
+msgid "Merge automatically (%{strategy})"
+msgstr ""
+
+msgid "Merge blocked: all merge request dependencies must be merged."
+msgstr ""
+
+msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
+msgstr ""
+
+msgid "Merge blocked: new changes were just added."
+msgstr ""
+
+msgid "Merge blocked: pipeline must succeed. It's waiting for a manual job to continue."
+msgstr ""
+
+msgid "Merge blocked: the source branch must be rebased onto the target branch."
+msgstr ""
+
+msgid "Merge commit SHA"
+msgstr ""
+
+msgid "Merge commit message"
+msgstr ""
+
+msgid "Merge details"
+msgstr ""
+
+msgid "Merge events"
+msgstr ""
+
+msgid "Merge immediately"
+msgstr ""
+
+msgid "Merge in progress"
+msgstr ""
+
+msgid "Merge locally"
+msgstr ""
+
+msgid "Merge options"
+msgstr ""
+
+msgid "Merge request"
+msgstr ""
+
+msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
+msgstr ""
+
+msgid "Merge request analytics"
+msgstr ""
+
+msgid "Merge request approvals"
+msgstr ""
+
+msgid "Merge request commits"
+msgstr ""
+
+msgid "Merge request dependencies"
+msgstr ""
+
+msgid "Merge request events"
+msgstr ""
+
+msgid "Merge request not merged"
+msgstr ""
+
+msgid "Merge request reports"
+msgstr ""
+
+msgid "Merge request was scheduled to merge after pipeline succeeds"
+msgstr ""
+
+msgid "Merge requests"
+msgstr ""
+
+msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
+msgstr ""
+
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
+msgstr ""
+
+msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
+msgstr ""
+
+msgid "Merge unverified changes"
+msgstr ""
+
+msgid "Merge unverified changes?"
+msgstr ""
+
+msgid "Merge when pipeline succeeds"
+msgstr ""
+
+msgid "Merge..."
+msgstr ""
+
+msgid "MergeConflict|Commit to source branch"
+msgstr ""
+
+msgid "MergeConflict|Committing..."
+msgstr ""
+
+msgid "MergeConflict|HEAD//our changes"
+msgstr ""
+
+msgid "MergeConflict|Use ours"
+msgstr ""
+
+msgid "MergeConflict|Use theirs"
+msgstr ""
+
+msgid "MergeConflict|conflict"
+msgstr ""
+
+msgid "MergeConflict|conflicts"
+msgstr ""
+
+msgid "MergeConflict|origin//their changes"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Assignees"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Date Merged"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Line changes"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Merge Request"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Milestone"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Pipelines"
+msgstr ""
+
+msgid "MergeRequestAnalytics|Time to merge"
+msgstr ""
+
+msgid "MergeRequestApprovals|Define approval rules and settings to ensure %{link_start}separation of duties%{link_end} for new merge requests."
+msgstr ""
+
+msgid "MergeRequestApprovals|Enforce %{link_start}separation of duties%{link_end} for all projects."
+msgstr ""
+
+msgid "MergeRequestApprovals|Enforce %{separationLinkStart}separation of duties%{separationLinkEnd} for all projects. %{learnLinkStart}Learn more.%{learnLinkEnd}"
+msgstr ""
+
+msgid "MergeRequestDiffs|Commenting on lines %{selectStart}start%{selectEnd} to %{end}"
+msgstr ""
+
+msgid "MergeRequestDiffs|Select comment starting line"
+msgstr ""
+
+msgid "MergeRequests|An error occurred while saving the draft comment."
+msgstr ""
+
+msgid "MergeRequests|Create issue to resolve thread"
+msgstr ""
+
+msgid "MergeRequests|Saving the comment failed"
+msgstr ""
+
+msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
+msgstr ""
+
+msgid "MergeRequests|Squashing not allowed: This project doesn't allow you to squash commits when merging."
+msgstr ""
+
+msgid "MergeRequests|Thread stays resolved"
+msgstr ""
+
+msgid "MergeRequests|Thread stays unresolved"
+msgstr ""
+
+msgid "MergeRequests|Thread will be resolved"
+msgstr ""
+
+msgid "MergeRequests|Thread will be unresolved"
+msgstr ""
+
+msgid "MergeRequests|View file @ %{commitId}"
+msgstr ""
+
+msgid "MergeRequests|View replaced file @ %{commitId}"
+msgstr ""
+
+msgid "MergeRequests|commented on commit %{commitLink}"
+msgstr ""
+
+msgid "MergeRequests|started a thread"
+msgstr ""
+
+msgid "MergeRequests|started a thread on %{linkStart}an old version of the diff%{linkEnd}"
+msgstr ""
+
+msgid "MergeRequests|started a thread on %{linkStart}the diff%{linkEnd}"
+msgstr ""
+
+msgid "MergeRequests|started a thread on an outdated change in commit %{linkStart}%{commitDisplay}%{linkEnd}"
+msgstr ""
+
+msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
+msgstr ""
+
+msgid "MergeRequest|Approved by @%{username}"
+msgstr ""
+
+msgid "MergeRequest|Can't show this merge request because of an internal error. Contact your administrator."
+msgstr ""
+
+msgid "MergeRequest|Can't show this merge request because the fork project was deleted."
+msgstr ""
+
+msgid "MergeRequest|Can't show this merge request because the source branch %{branch_badge} is missing from project %{path_badge}. Close this merge request or update the source branch."
+msgstr ""
+
+msgid "MergeRequest|Can't show this merge request because the target branch %{branch_badge} is missing from project %{path_badge}. Close this merge request or update the target branch."
+msgstr ""
+
+msgid "MergeRequest|Compare %{target} and %{source}"
+msgstr ""
+
+msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
+msgstr ""
+
+msgid "MergeRequest|Error loading full diff. Please try again."
+msgstr ""
+
+msgid "MergeRequest|No files found"
+msgstr ""
+
+msgid "MergeRequest|Search files (%{modifier_key}P)"
+msgstr ""
+
+msgid "Merged"
+msgstr ""
+
+msgid "Merged MRs"
+msgstr ""
+
+msgid "Merged branches are being deleted. This can take some time depending on the number of branches. Please refresh the page to see changes."
+msgstr ""
+
+msgid "Merged by"
+msgstr ""
+
+msgid "Merged this merge request."
+msgstr ""
+
+msgid "Merged: %{merged}"
+msgstr ""
+
+msgid "Merges this merge request immediately."
+msgstr ""
+
+msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
+msgstr ""
+
+msgid "Message"
+msgstr ""
+
+msgid "Messages"
+msgstr ""
+
+msgid "Method"
+msgstr ""
+
+msgid "Method call threshold (ms)"
+msgstr ""
+
+msgid "Metric was successfully added."
+msgstr ""
+
+msgid "Metric was successfully updated."
+msgstr ""
+
+msgid "Metric:"
+msgstr ""
+
+msgid "MetricChart|Please select a metric"
+msgstr ""
+
+msgid "MetricChart|Selected"
+msgstr ""
+
+msgid "MetricChart|There is no data available. Please change your selection."
+msgstr ""
+
+msgid "MetricChart|There is too much data to calculate. Please change your selection."
+msgstr ""
+
+msgid "Metrics"
+msgstr ""
+
+msgid "Metrics - Grafana"
+msgstr ""
+
+msgid "Metrics - Prometheus"
+msgstr ""
+
+msgid "Metrics Dashboard"
+msgstr ""
+
+msgid "Metrics Dashboard YAML definition"
+msgstr ""
+
+msgid "Metrics Dashboard YAML definition is invalid:"
+msgstr ""
+
+msgid "Metrics Dashboard YAML definition is valid."
+msgstr ""
+
+msgid "Metrics and profiling"
+msgstr ""
+
+msgid "Metrics:"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|Annotation can't belong to both a cluster and an environment at the same time"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|Annotation has not been deleted"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|Annotation must belong to a cluster or an environment"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|Dashboard with requested path can not be found"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|You are not authorized to create annotation for selected cluster"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|You are not authorized to create annotation for selected environment"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|You are not authorized to delete this annotation"
+msgstr ""
+
+msgid "MetricsDashboardAnnotation|can't be before starting_at time"
+msgstr ""
+
+msgid "MetricsSettings|Add a button to the metrics dashboard linking directly to your existing external dashboard."
+msgstr ""
+
+msgid "MetricsSettings|Choose whether to display dashboard metrics in UTC or the user's local timezone."
+msgstr ""
+
+msgid "MetricsSettings|Dashboard timezone"
+msgstr ""
+
+msgid "MetricsSettings|External dashboard URL"
+msgstr ""
+
+msgid "MetricsSettings|Manage metrics dashboard settings."
+msgstr ""
+
+msgid "MetricsSettings|Metrics"
+msgstr ""
+
+msgid "MetricsSettings|UTC (Coordinated Universal Time)"
+msgstr ""
+
+msgid "MetricsSettings|User's local timezone"
+msgstr ""
+
+msgid "MetricsUsersStarredDashboards|Dashboard with requested path can not be found"
+msgstr ""
+
+msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
+msgstr ""
+
+msgid "Metrics|1. Define and preview panel"
+msgstr ""
+
+msgid "Metrics|2. Paste panel YAML into dashboard"
+msgstr ""
+
+msgid "Metrics|Add metric"
+msgstr ""
+
+msgid "Metrics|Add panel"
+msgstr ""
+
+msgid "Metrics|Avg"
+msgstr ""
+
+msgid "Metrics|Back to dashboard"
+msgstr ""
+
+msgid "Metrics|Cancel"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Collapse panel"
+msgstr ""
+
+msgid "Metrics|Collapse panel (Esc)"
+msgstr ""
+
+msgid "Metrics|Copy YAML"
+msgstr ""
+
+msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
+msgstr ""
+
+msgid "Metrics|Create custom dashboard %{fileName}"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Create new dashboard"
+msgstr ""
+
+msgid "Metrics|Create your dashboard configuration file"
+msgstr ""
+
+msgid "Metrics|Current"
+msgstr ""
+
+msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
+msgstr ""
+
+msgid "Metrics|Define panel YAML below to preview panel."
+msgstr ""
+
+msgid "Metrics|Delete metric"
+msgstr ""
+
+msgid "Metrics|Delete metric?"
+msgstr ""
+
+msgid "Metrics|Duplicate"
+msgstr ""
+
+msgid "Metrics|Duplicate current dashboard"
+msgstr ""
+
+msgid "Metrics|Duplicate dashboard"
+msgstr ""
+
+msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
+msgstr ""
+
+msgid "Metrics|Duplicating..."
+msgstr ""
+
+msgid "Metrics|Edit dashboard YAML"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgid_plural "Metrics|Edit metrics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Metrics|Expand panel"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Invalid time range, please verify."
+msgstr ""
+
+msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
+msgstr ""
+
+msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
+msgstr ""
+
+msgid "Metrics|Manage chart links"
+msgstr ""
+
+msgid "Metrics|Max"
+msgstr ""
+
+msgid "Metrics|Metrics Settings"
+msgstr ""
+
+msgid "Metrics|Min"
+msgstr ""
+
+msgid "Metrics|More actions"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|Open repository"
+msgstr ""
+
+msgid "Metrics|Panel YAML"
+msgstr ""
+
+msgid "Metrics|Panel YAML copied"
+msgstr ""
+
+msgid "Metrics|Preview panel"
+msgstr ""
+
+msgid "Metrics|PromQL query is valid"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Refresh Prometheus data"
+msgstr ""
+
+msgid "Metrics|Refresh dashboard"
+msgstr ""
+
+msgid "Metrics|Select a value"
+msgstr ""
+
+msgid "Metrics|Set refresh rate"
+msgstr ""
+
+msgid "Metrics|Star dashboard"
+msgstr ""
+
+msgid "Metrics|There was an error creating the dashboard."
+msgstr ""
+
+msgid "Metrics|There was an error creating the dashboard. %{error}"
+msgstr ""
+
+msgid "Metrics|There was an error fetching annotations. Please try again."
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting annotations information."
+msgstr ""
+
+msgid "Metrics|There was an error getting dashboard validation warnings information."
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error getting options for variable \"%{name}\"."
+msgstr ""
+
+msgid "Metrics|There was an error trying to validate your query"
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics. %{message}"
+msgstr ""
+
+msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Unstar dashboard"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Validating query"
+msgstr ""
+
+msgid "Metrics|Values"
+msgstr ""
+
+msgid "Metrics|View documentation"
+msgstr ""
+
+msgid "Metrics|View logs"
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
+msgstr ""
+
+msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
+msgstr ""
+
+msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
+msgid "Mi"
+msgstr ""
+
+msgid "Migrated %{success_count}/%{total_count} files."
+msgstr ""
+
+msgid "Migration"
+msgstr ""
+
+msgid "Migration has been scheduled to be retried"
+msgstr ""
+
+msgid "Migration successful."
+msgstr ""
+
+msgid "Milestone"
+msgid_plural "Milestones"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Milestone due date"
+msgstr ""
+
+msgid "Milestone lists not available with your current license"
+msgstr ""
+
+msgid "MilestoneCombobox|An error occurred while searching for milestones"
+msgstr ""
+
+msgid "MilestoneCombobox|Group milestones"
+msgstr ""
+
+msgid "MilestoneCombobox|Milestone"
+msgstr ""
+
+msgid "MilestoneCombobox|No matching results"
+msgstr ""
+
+msgid "MilestoneCombobox|No milestone"
+msgstr ""
+
+msgid "MilestoneCombobox|Project milestones"
+msgstr ""
+
+msgid "MilestoneCombobox|Search Milestones"
+msgstr ""
+
+msgid "MilestoneCombobox|Select milestone"
+msgstr ""
+
+msgid "MilestoneSidebar|Closed:"
+msgstr ""
+
+msgid "MilestoneSidebar|Copy reference"
+msgstr ""
+
+msgid "MilestoneSidebar|Due date"
+msgstr ""
+
+msgid "MilestoneSidebar|Edit"
+msgstr ""
+
+msgid "MilestoneSidebar|From"
+msgstr ""
+
+msgid "MilestoneSidebar|Issues"
+msgstr ""
+
+msgid "MilestoneSidebar|Merge requests"
+msgstr ""
+
+msgid "MilestoneSidebar|Merged:"
+msgstr ""
+
+msgid "MilestoneSidebar|New Issue"
+msgstr ""
+
+msgid "MilestoneSidebar|New issue"
+msgstr ""
+
+msgid "MilestoneSidebar|No due date"
+msgstr ""
+
+msgid "MilestoneSidebar|No start date"
+msgstr ""
+
+msgid "MilestoneSidebar|None"
+msgstr ""
+
+msgid "MilestoneSidebar|Open:"
+msgstr ""
+
+msgid "MilestoneSidebar|Reference:"
+msgstr ""
+
+msgid "MilestoneSidebar|Start date"
+msgstr ""
+
+msgid "MilestoneSidebar|Toggle sidebar"
+msgstr ""
+
+msgid "MilestoneSidebar|Until"
+msgstr ""
+
+msgid "MilestoneSidebar|complete"
+msgstr ""
+
+msgid "Milestones"
+msgstr ""
+
+msgid "Milestones| You’re about to permanently delete the milestone %{milestoneTitle} and remove it from %{issuesWithCount} and %{mergeRequestsWithCount}. Once deleted, it cannot be undone or recovered."
+msgstr ""
+
+msgid "Milestones| You’re about to permanently delete the milestone %{milestoneTitle}. This milestone is not currently used in any issues or merge requests."
+msgstr ""
+
+msgid "Milestones|Close Milestone"
+msgstr ""
+
+msgid "Milestones|Completed Issues (closed)"
+msgstr ""
+
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
+msgid "Milestones|Delete milestone"
+msgstr ""
+
+msgid "Milestones|Delete milestone %{milestoneTitle}?"
+msgstr ""
+
+msgid "Milestones|Failed to delete milestone %{milestoneTitle}"
+msgstr ""
+
+msgid "Milestones|Group Milestone"
+msgstr ""
+
+msgid "Milestones|Milestone %{milestoneTitle} was not found"
+msgstr ""
+
+msgid "Milestones|Ongoing Issues (open and assigned)"
+msgstr ""
+
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
+msgid "Milestones|Project Milestone"
+msgstr ""
+
+msgid "Milestones|Promote %{milestoneTitle} to group milestone?"
+msgstr ""
+
+msgid "Milestones|Promote Milestone"
+msgstr ""
+
+msgid "Milestones|Promote to Group Milestone"
+msgstr ""
+
+msgid "Milestones|Promoting %{milestoneTitle} will make it available for all projects inside %{groupName}. Existing project milestones with the same title will be merged."
+msgstr ""
+
+msgid "Milestones|Reopen Milestone"
+msgstr ""
+
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
+msgid "Milestones|Unstarted Issues (open and unassigned)"
+msgstr ""
+
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgstr ""
+
+msgid "Minimum interval in days"
+msgstr ""
+
+msgid "Minutes"
+msgstr ""
+
+msgid "Mirror direction"
+msgstr ""
+
+msgid "Mirror only protected branches"
+msgstr ""
+
+msgid "Mirror repository"
+msgstr ""
+
+msgid "Mirror settings are only available to GitLab administrators."
+msgstr ""
+
+msgid "Mirror user"
+msgstr ""
+
+msgid "Mirrored repositories"
+msgstr ""
+
+msgid "Mirroring repositories"
+msgstr ""
+
+msgid "Mirroring settings were successfully updated."
+msgstr ""
+
+msgid "Mirroring settings were successfully updated. The project is being updated."
+msgstr ""
+
+msgid "Mirroring was successfully disabled."
+msgstr ""
+
+msgid "Mirroring will only be available if the feature is included in the plan of the selected group or user."
+msgstr ""
+
+msgid "Miscellaneous"
+msgstr ""
+
+msgid "Missing"
+msgstr ""
+
+msgid "Missing OAuth configuration for GitHub."
+msgstr ""
+
+msgid "Missing OS"
+msgstr ""
+
+msgid "Missing arch"
+msgstr ""
+
+msgid "Missing commit signatures endpoint!"
+msgstr ""
+
+msgid "MissingSSHKeyWarningLink|Add SSH key"
+msgstr ""
+
+msgid "MissingSSHKeyWarningLink|Don't show again"
+msgstr ""
+
+msgid "MissingSSHKeyWarningLink|You can't push or pull repositories using SSH until you add an SSH key to your profile."
+msgstr ""
+
+msgid "MissingSSHKeyWarningLink|You won't be able to pull or push repositories via SSH until you add an SSH key to your profile"
+msgstr ""
+
+msgid "ModalButton|Add projects"
+msgstr ""
+
+msgid "Modal|Close"
+msgstr ""
+
+msgid "Modified"
+msgstr ""
+
+msgid "Modified in this version"
+msgstr ""
+
+msgid "Modify commit message"
+msgstr ""
+
+msgid "Modify commit messages"
+msgstr ""
+
+msgid "Modify merge commit"
+msgstr ""
+
+msgid "Monday"
+msgstr ""
+
+msgid "Monitor"
+msgstr ""
+
+msgid "Monitor Settings"
+msgstr ""
+
+msgid "Monitor the health and performance of GitLab with Prometheus."
+msgstr ""
+
+msgid "Monitor your errors by integrating with Sentry."
+msgstr ""
+
+msgid "Monitoring"
+msgstr ""
+
+msgid "Month"
+msgstr ""
+
+msgid "Months"
+msgstr ""
+
+msgid "More Details"
+msgstr ""
+
+msgid "More Information"
+msgstr ""
+
+msgid "More actions"
+msgstr ""
+
+msgid "More details"
+msgstr ""
+
+msgid "More info"
+msgstr ""
+
+msgid "More information"
+msgstr ""
+
+msgid "More information and share feedback"
+msgstr ""
+
+msgid "More information is available|here"
+msgstr ""
+
+msgid "More information."
+msgstr ""
+
+msgid "More than %{number_commits_distance} commits different with %{default_branch}"
+msgstr ""
+
+msgid "More topics"
+msgstr ""
+
+msgid "Most relevant"
+msgstr ""
+
+msgid "Most stars"
+msgstr ""
+
+msgid "Mount point %{mounted_as} not found in %{model_class}."
+msgstr ""
+
+msgid "Move"
+msgstr ""
+
+msgid "Move down"
+msgstr ""
+
+msgid "Move issue"
+msgstr ""
+
+msgid "Move issue from one column of the board to another"
+msgstr ""
+
+msgid "Move selection down"
+msgstr ""
+
+msgid "Move selection up"
+msgstr ""
+
+msgid "Move test case"
+msgstr ""
+
+msgid "Move this issue to another project."
+msgstr ""
+
+msgid "Move up"
+msgstr ""
+
+msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
+msgstr ""
+
+msgid "MoveIssue|Cannot move issue to project it originates from!"
+msgstr ""
+
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
+msgid "Moved issue to %{label} column in the board."
+msgstr ""
+
+msgid "Moved this issue to %{path_to_project}."
+msgstr ""
+
+msgid "Moves issue to %{label} column in the board."
+msgstr ""
+
+msgid "Moves this issue to %{path_to_project}."
+msgstr ""
+
+msgid "MrDeploymentActions|Deploy"
+msgstr ""
+
+msgid "MrDeploymentActions|Re-deploy"
+msgstr ""
+
+msgid "MrDeploymentActions|Stop environment"
+msgstr ""
+
+msgid "MrList|Assigned to %{name}"
+msgstr ""
+
+msgid "MrList|Attention requested from assignee %{name}"
+msgstr ""
+
+msgid "MrList|Attention requested from reviewer %{name}"
+msgstr ""
+
+msgid "MrList|Review requested from %{name}"
+msgstr ""
+
+msgid "Multi-project"
+msgstr ""
+
+msgid "Multi-project Runners cannot be removed"
+msgstr ""
+
+msgid "Multiple HTTP integrations are not supported for this project"
+msgstr ""
+
+msgid "Multiple IP address ranges are supported."
+msgstr ""
+
+msgid "Multiple Prometheus integrations are not supported"
+msgstr ""
+
+msgid "Multiple domains are supported."
+msgstr ""
+
+msgid "Multiple model types found: %{model_types}"
+msgstr ""
+
+msgid "Multiple uploaders found: %{uploader_types}"
+msgstr ""
+
+msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
+msgstr ""
+
+msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
+msgstr ""
+
+msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
+msgid "My awesome group"
+msgstr ""
+
+msgid "My company or team"
+msgstr ""
+
+msgid "My topic"
+msgstr ""
+
+msgid "My-Reaction"
+msgstr ""
+
+msgid "N/A"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Name can't be blank"
+msgstr ""
+
+msgid "Name has already been taken"
+msgstr ""
+
+msgid "Name is already taken."
+msgstr ""
+
+msgid "Name new label"
+msgstr ""
+
+msgid "Name:"
+msgstr ""
+
+msgid "Namespace"
+msgstr ""
+
+msgid "Namespace ID:"
+msgstr ""
+
+msgid "Namespace is empty"
+msgstr ""
+
+msgid "Namespace:"
+msgstr ""
+
+msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked project"
+msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
+msgstr ""
+
+msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
+msgstr ""
+
+msgid "NamespaceStorageSize|Please purchase additional storage to unlock your projects over the free %{free_size_limit} project limit. You can't %{base_message}"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
+msgstr ""
+
+msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
+msgstr ""
+
+msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
+msgid "Namespaces"
+msgstr ""
+
+msgid "Namespaces to index"
+msgstr ""
+
+msgid "Naming, topics, avatar"
+msgstr ""
+
+msgid "Naming, visibility"
+msgstr ""
+
+msgid "Navigate to the project to close the milestone."
+msgstr ""
+
+msgid "Navigation bar"
+msgstr ""
+
+msgid "NavigationTheme|Blue"
+msgstr ""
+
+msgid "NavigationTheme|Dark"
+msgstr ""
+
+msgid "NavigationTheme|Dark Mode (alpha)"
+msgstr ""
+
+msgid "NavigationTheme|Green"
+msgstr ""
+
+msgid "NavigationTheme|Indigo"
+msgstr ""
+
+msgid "NavigationTheme|Light"
+msgstr ""
+
+msgid "NavigationTheme|Light Blue"
+msgstr ""
+
+msgid "NavigationTheme|Light Green"
+msgstr ""
+
+msgid "NavigationTheme|Light Indigo"
+msgstr ""
+
+msgid "NavigationTheme|Light Red"
+msgstr ""
+
+msgid "NavigationTheme|Red"
+msgstr ""
+
+msgid "Nav|Help"
+msgstr ""
+
+msgid "Nav|Home"
+msgstr ""
+
+msgid "Nav|Sign In / Register"
+msgstr ""
+
+msgid "Nav|Sign out and sign in with a different account"
+msgstr ""
+
+msgid "Need help?"
+msgstr ""
+
+msgid "Need your attention"
+msgstr ""
+
+msgid "Needs"
+msgstr ""
+
+msgid "Needs attention"
+msgstr ""
+
+msgid "Network"
+msgstr ""
+
+msgid "Network:"
+msgstr ""
+
+msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
+msgstr ""
+
+msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
+msgstr ""
+
+msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
+msgstr ""
+
+msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
+msgstr ""
+
+msgid "NetworkPolicies|%{number} selected"
+msgstr ""
+
+msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
+msgstr ""
+
+msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
+msgstr ""
+
+msgid "NetworkPolicies|.yaml mode"
+msgstr ""
+
+msgid "NetworkPolicies|Add alert"
+msgstr ""
+
+msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
+msgstr ""
+
+msgid "NetworkPolicies|All selected"
+msgstr ""
+
+msgid "NetworkPolicies|Allow"
+msgstr ""
+
+msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
+msgstr ""
+
+msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
+msgstr ""
+
+msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
+msgstr ""
+
+msgid "NetworkPolicies|Create policy"
+msgstr ""
+
+msgid "NetworkPolicies|Define this policy's location, conditions and actions."
+msgstr ""
+
+msgid "NetworkPolicies|Delete policy"
+msgstr ""
+
+msgid "NetworkPolicies|Delete policy: %{policy}"
+msgstr ""
+
+msgid "NetworkPolicies|Deny all traffic"
+msgstr ""
+
+msgid "NetworkPolicies|Edit policy"
+msgstr ""
+
+msgid "NetworkPolicies|Environment does not have deployment platform"
+msgstr ""
+
+msgid "NetworkPolicies|IP/subnet"
+msgstr ""
+
+msgid "NetworkPolicies|Invalid or empty policy"
+msgstr ""
+
+msgid "NetworkPolicies|Invalid or unsupported policy kind"
+msgstr ""
+
+msgid "NetworkPolicies|Kubernetes error: %{error}"
+msgstr ""
+
+msgid "NetworkPolicies|Network"
+msgstr ""
+
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
+msgstr ""
+
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
+msgstr ""
+
+msgid "NetworkPolicies|Network traffic"
+msgstr ""
+
+msgid "NetworkPolicies|None selected"
+msgstr ""
+
+msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
+msgstr ""
+
+msgid "NetworkPolicies|Policy definition"
+msgstr ""
+
+msgid "NetworkPolicies|Rule mode"
+msgstr ""
+
+msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
+msgstr ""
+
+msgid "NetworkPolicies|Save changes"
+msgstr ""
+
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgstr ""
+
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgstr ""
+
+msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
+msgstr ""
+
+msgid "NetworkPolicies|all DNS names"
+msgstr ""
+
+msgid "NetworkPolicies|all IP addresses"
+msgstr ""
+
+msgid "NetworkPolicies|any pod"
+msgstr ""
+
+msgid "NetworkPolicies|any port"
+msgstr ""
+
+msgid "NetworkPolicies|domain name"
+msgstr ""
+
+msgid "NetworkPolicies|entity"
+msgstr ""
+
+msgid "NetworkPolicies|inbound to"
+msgstr ""
+
+msgid "NetworkPolicies|nowhere"
+msgstr ""
+
+msgid "NetworkPolicies|outbound from"
+msgstr ""
+
+msgid "NetworkPolicies|pod with labels"
+msgstr ""
+
+msgid "NetworkPolicies|pods %{pods}"
+msgstr ""
+
+msgid "NetworkPolicies|pods with labels"
+msgstr ""
+
+msgid "NetworkPolicies|ports %{ports}"
+msgstr ""
+
+msgid "NetworkPolicies|ports/protocols"
+msgstr ""
+
+msgid "NetworkPolicy|Policy"
+msgstr ""
+
+msgid "NetworkPolicy|Search by policy name"
+msgstr ""
+
+msgid "NetworkPolicy|Status"
+msgstr ""
+
+msgid "Never"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New %{type} in %{project}"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Branch"
+msgstr ""
+
+msgid "New Deploy Key"
+msgstr ""
+
+msgid "New Environment"
+msgstr ""
+
+msgid "New Epic"
+msgstr ""
+
+msgid "New File"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
+msgid "New Group Name"
+msgstr ""
+
+msgid "New Identity"
+msgstr ""
+
+msgid "New Issue"
+msgid_plural "New Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "New Jira import"
+msgstr ""
+
+msgid "New Label"
+msgstr ""
+
+msgid "New Milestone"
+msgstr ""
+
+msgid "New Pages Domain"
+msgstr ""
+
+msgid "New Password"
+msgstr ""
+
+msgid "New Pipeline Schedule"
+msgstr ""
+
+msgid "New Project"
+msgstr ""
+
+msgid "New Requirement"
+msgstr ""
+
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Test Case"
+msgstr ""
+
+msgid "New User"
+msgstr ""
+
+msgid "New application"
+msgstr ""
+
+msgid "New branch"
+msgstr ""
+
+msgid "New branch unavailable"
+msgstr ""
+
+msgid "New confidential epic title "
+msgstr ""
+
+msgid "New confidential issue title"
+msgstr ""
+
+msgid "New deploy key"
+msgstr ""
+
+msgid "New directory"
+msgstr ""
+
+msgid "New discussion"
+msgstr ""
+
+msgid "New email address added"
+msgstr ""
+
+msgid "New environment"
+msgstr ""
+
+msgid "New epic"
+msgstr ""
+
+msgid "New epic title"
+msgstr ""
+
+msgid "New file"
+msgstr ""
+
+msgid "New group"
+msgstr ""
+
+msgid "New group URL"
+msgstr ""
+
+msgid "New group name"
+msgstr ""
+
+msgid "New health check access token has been generated!"
+msgstr ""
+
+msgid "New identity"
+msgstr ""
+
+msgid "New issue"
+msgstr ""
+
+msgid "New issue in %{project}"
+msgstr ""
+
+msgid "New issue title"
+msgstr ""
+
+msgid "New iteration created"
+msgstr ""
+
+msgid "New label"
+msgstr ""
+
+msgid "New list"
+msgstr ""
+
+msgid "New merge request"
+msgstr ""
+
+msgid "New milestone"
+msgstr ""
+
+msgid "New name"
+msgstr ""
+
+msgid "New password"
+msgstr ""
+
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
+msgstr ""
+
+msgid "New project"
+msgstr ""
+
+msgid "New project page"
+msgstr ""
+
+msgid "New project pages"
+msgstr ""
+
+msgid "New project/repository"
+msgstr ""
+
+msgid "New public deploy key"
+msgstr ""
+
+msgid "New related %{issueType}"
+msgstr ""
+
+msgid "New release"
+msgstr ""
+
+msgid "New requirement"
+msgstr ""
+
+msgid "New response for issue #%{issue_iid}:"
+msgstr ""
+
+msgid "New runners registration token has been generated!"
+msgstr ""
+
+msgid "New schedule"
+msgstr ""
+
+msgid "New snippet"
+msgstr ""
+
+msgid "New subgroup"
+msgstr ""
+
+msgid "New tag"
+msgstr ""
+
+msgid "New test case"
+msgstr ""
+
+msgid "New topic"
+msgstr ""
+
+msgid "New users set to external"
+msgstr ""
+
+msgid "New! Suggest changes directly"
+msgstr ""
+
+msgid "New..."
+msgstr ""
+
+msgid "Newest first"
+msgstr ""
+
+msgid "Newly-registered users are external by default"
+msgstr ""
+
+msgid "Next"
+msgstr ""
+
+msgid "Next commit"
+msgstr ""
+
+msgid "Next design"
+msgstr ""
+
+msgid "Next file in diff"
+msgstr ""
+
+msgid "Next scan"
+msgstr ""
+
+msgid "Next unresolved discussion"
+msgstr ""
+
+msgid "Next update"
+msgstr ""
+
+msgid "Nickname"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "No %{header} for this request."
+msgstr ""
+
+msgid "No %{providerTitle} repositories found"
+msgstr ""
+
+msgid "No CSV data to display."
+msgstr ""
+
+msgid "No Epic"
+msgstr ""
+
+msgid "No Matching Results"
+msgstr ""
+
+msgid "No Milestone"
+msgstr ""
+
+msgid "No Scopes"
+msgstr ""
+
+msgid "No Tag"
+msgstr ""
+
+msgid "No active admin user found"
+msgstr ""
+
+msgid "No activities found"
+msgstr ""
+
+msgid "No application_settings found"
+msgstr ""
+
+msgid "No approvers"
+msgstr ""
+
+msgid "No artifacts found"
+msgstr ""
+
+msgid "No assignee"
+msgstr ""
+
+msgid "No attention request"
+msgstr ""
+
+msgid "No authentication methods configured."
+msgstr ""
+
+msgid "No available branches"
+msgstr ""
+
+msgid "No branches found"
+msgstr ""
+
+msgid "No changes"
+msgstr ""
+
+msgid "No changes between %{source} and %{target}"
+msgstr ""
+
+msgid "No child epics match applied filters"
+msgstr ""
+
+msgid "No commenters"
+msgstr ""
+
+msgid "No commits present here"
+msgstr ""
+
+msgid "No committers"
+msgstr ""
+
+msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
+msgstr ""
+
+msgid "No connection could be made to a Gitaly Server, please check your logs!"
+msgstr ""
+
+msgid "No containers available"
+msgstr ""
+
+msgid "No contributions"
+msgstr ""
+
+msgid "No contributions were found"
+msgstr ""
+
+msgid "No credit card data for matching"
+msgstr ""
+
+msgid "No credit card required."
+msgstr ""
+
+msgid "No data found"
+msgstr ""
+
+msgid "No data to display"
+msgstr ""
+
+msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
+msgstr ""
+
+msgid "No deployments found"
+msgstr ""
+
+msgid "No due date"
+msgstr ""
+
+msgid "No email participants were added. Either none were provided, or they already exist."
+msgstr ""
+
+msgid "No endpoint provided"
+msgstr ""
+
+msgid "No errors to display."
+msgstr ""
+
+msgid "No estimate or time spent"
+msgstr ""
+
+msgid "No file chosen."
+msgstr ""
+
+msgid "No file hooks found."
+msgstr ""
+
+msgid "No file selected"
+msgstr ""
+
+msgid "No files"
+msgstr ""
+
+msgid "No files found."
+msgstr ""
+
+msgid "No forks are available to you."
+msgstr ""
+
+msgid "No group provided"
+msgstr ""
+
+msgid "No grouping"
+msgstr ""
+
+msgid "No issues found"
+msgstr ""
+
+msgid "No iteration"
+msgstr ""
+
+msgid "No iterations to show"
+msgstr ""
+
+msgid "No job log"
+msgstr ""
+
+msgid "No jobs to show"
+msgstr ""
+
+msgid "No label"
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No license. All rights reserved"
+msgstr ""
+
+msgid "No matches found"
+msgstr ""
+
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
+msgstr ""
+
+msgid "No matching labels"
+msgstr ""
+
+msgid "No matching results"
+msgstr ""
+
+msgid "No matching results for \"%{query}\""
+msgstr ""
+
+msgid "No matching results..."
+msgstr ""
+
+msgid "No member provided"
+msgstr ""
+
+msgid "No members found"
+msgstr ""
+
+msgid "No memberships found"
+msgstr ""
+
+msgid "No merge requests found"
+msgstr ""
+
+msgid "No messages were logged"
+msgstr ""
+
+msgid "No milestone"
+msgstr ""
+
+msgid "No namespace"
+msgstr ""
+
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No panels matching properties %{opts}"
+msgstr ""
+
+msgid "No parent group"
+msgstr ""
+
+msgid "No plan"
+msgstr ""
+
+msgid "No pods available"
+msgstr ""
+
+msgid "No policy matches this license"
+msgstr ""
+
+msgid "No preview for this file type"
+msgstr ""
+
+msgid "No prioritized labels with such name or description"
+msgstr ""
+
+msgid "No profiles found"
+msgstr ""
+
+msgid "No project subscribes to the pipelines in this project."
+msgstr ""
+
+msgid "No projects found"
+msgstr ""
+
+msgid "No public deploy keys"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No ref selected"
+msgstr ""
+
+msgid "No regions configured"
+msgstr ""
+
+msgid "No related merge requests found."
+msgstr ""
+
+msgid "No repository"
+msgstr ""
+
+msgid "No runner executable"
+msgstr ""
+
+msgid "No runners found"
+msgstr ""
+
+msgid "No schedules"
+msgstr ""
+
+msgid "No service accounts"
+msgstr ""
+
+msgid "No severity matches the provided parameter"
+msgstr ""
+
+msgid "No source selected"
+msgstr ""
+
+msgid "No stack trace for this error"
+msgstr ""
+
+msgid "No starrers matched your search"
+msgstr ""
+
+msgid "No start date"
+msgstr ""
+
+msgid "No suggestions found"
+msgstr ""
+
+msgid "No tag selected"
+msgstr ""
+
+msgid "No template"
+msgstr ""
+
+msgid "No template selected"
+msgstr ""
+
+msgid "No test coverage"
+msgstr ""
+
+msgid "No triggers exist yet. Use the form above to create one."
+msgstr ""
+
+msgid "No vulnerabilities present"
+msgstr ""
+
+msgid "No webhook events"
+msgstr ""
+
+msgid "No webhooks enabled. Select trigger events above."
+msgstr ""
+
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "No. of commits"
+msgstr ""
+
+msgid "Nobody has starred this repository yet"
+msgstr ""
+
+msgid "Node was successfully created."
+msgstr ""
+
+msgid "Node was successfully updated."
+msgstr ""
+
+msgid "Nodes"
+msgstr ""
+
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid "None of the group milestones have the same project as the release"
+msgstr ""
+
+msgid "Normal text"
+msgstr ""
+
+msgid "Not Implemented"
+msgstr ""
+
+msgid "Not all browsers support U2F devices. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even when you're using an unsupported browser."
+msgstr ""
+
+msgid "Not all browsers support WebAuthn. Therefore, we require that you set up a two-factor authentication app first. That way you'll always be able to sign in - even from an unsupported browser."
+msgstr ""
+
+msgid "Not all data has been processed yet, the accuracy of the chart for the selected timeframe is limited."
+msgstr ""
+
+msgid "Not available"
+msgstr ""
+
+msgid "Not available for private projects"
+msgstr ""
+
+msgid "Not available for protected branches"
+msgstr ""
+
+msgid "Not confidential"
+msgstr ""
+
+msgid "Not found"
+msgstr ""
+
+msgid "Not found."
+msgstr ""
+
+msgid "Not permitted to destroy framework"
+msgstr ""
+
+msgid "Not ready yet. Try again later."
+msgstr ""
+
+msgid "Not started"
+msgstr ""
+
+msgid "Not supported"
+msgstr ""
+
+msgid "Note"
+msgstr ""
+
+msgid "Note creation requests"
+msgstr ""
+
+msgid "Note parameters are invalid: %{errors}"
+msgstr ""
+
+msgid "Note that pushing to GitLab requires write access to this repository."
+msgstr ""
+
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
+msgstr ""
+
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
+msgstr ""
+
+msgid "Note: current forks will keep their visibility level."
+msgstr ""
+
+msgid "NoteForm|Note"
+msgstr ""
+
+msgid "Notes rate limit"
+msgstr ""
+
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
+msgid "Notes|Collapse replies"
+msgstr ""
+
+msgid "Notes|Confidential comments are only visible to members with the role of Reporter or higher"
+msgstr ""
+
+msgid "Notes|Make this comment confidential"
+msgstr ""
+
+msgid "Notes|Show all activity"
+msgstr ""
+
+msgid "Notes|Show comments only"
+msgstr ""
+
+msgid "Notes|Show history only"
+msgstr ""
+
+msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
+msgstr ""
+
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
+msgid "Notes|This comment is confidential and only visible to project members"
+msgstr ""
+
+msgid "Notes|You're only seeing %{boldStart}other activity%{boldEnd} in the feed. To add a comment, switch to one of the following options."
+msgstr ""
+
+msgid "Nothing found…"
+msgstr ""
+
+msgid "Nothing to preview."
+msgstr ""
+
+msgid "Notification events"
+msgstr ""
+
+msgid "Notification setting - %{notification_title}"
+msgstr ""
+
+msgid "Notification settings saved"
+msgstr ""
+
+msgid "NotificationEmail|Assignee"
+msgid_plural "NotificationEmail|Assignees"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NotificationEmail|Assignee: %{users}"
+msgid_plural "NotificationEmail|Assignees: %{users}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NotificationEmail|Reviewer"
+msgid_plural "NotificationEmail|Reviewers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NotificationEmail|Reviewer: %{users}"
+msgid_plural "NotificationEmail|Reviewers: %{users}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "NotificationEvent|Change reviewer merge request"
+msgstr ""
+
+msgid "NotificationEvent|Close issue"
+msgstr ""
+
+msgid "NotificationEvent|Close merge request"
+msgstr ""
+
+msgid "NotificationEvent|Failed pipeline"
+msgstr ""
+
+msgid "NotificationEvent|Fixed pipeline"
+msgstr ""
+
+msgid "NotificationEvent|Issue due"
+msgstr ""
+
+msgid "NotificationEvent|Merge merge request"
+msgstr ""
+
+msgid "NotificationEvent|Merge when pipeline succeeds"
+msgstr ""
+
+msgid "NotificationEvent|Moved project"
+msgstr ""
+
+msgid "NotificationEvent|New epic"
+msgstr ""
+
+msgid "NotificationEvent|New issue"
+msgstr ""
+
+msgid "NotificationEvent|New merge request"
+msgstr ""
+
+msgid "NotificationEvent|New note"
+msgstr ""
+
+msgid "NotificationEvent|New release"
+msgstr ""
+
+msgid "NotificationEvent|Push to merge request"
+msgstr ""
+
+msgid "NotificationEvent|Reassign issue"
+msgstr ""
+
+msgid "NotificationEvent|Reassign merge request"
+msgstr ""
+
+msgid "NotificationEvent|Reopen issue"
+msgstr ""
+
+msgid "NotificationEvent|Reopen merge request"
+msgstr ""
+
+msgid "NotificationEvent|Successful pipeline"
+msgstr ""
+
+msgid "NotificationLevel|Custom"
+msgstr ""
+
+msgid "NotificationLevel|Disabled"
+msgstr ""
+
+msgid "NotificationLevel|Global"
+msgstr ""
+
+msgid "NotificationLevel|On mention"
+msgstr ""
+
+msgid "NotificationLevel|Participate"
+msgstr ""
+
+msgid "NotificationLevel|Watch"
+msgstr ""
+
+msgid "Notifications"
+msgstr ""
+
+msgid "Notifications have been disabled by the project or group owner"
+msgstr ""
+
+msgid "Notifications off"
+msgstr ""
+
+msgid "Notifications on"
+msgstr ""
+
+msgid "Notify users by email when sign-in location is not recognized."
+msgstr ""
+
+msgid "Nov"
+msgstr ""
+
+msgid "November"
+msgstr ""
+
+msgid "Now, personalize your GitLab experience"
+msgstr ""
+
+msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
+msgstr ""
+
+msgid "Number of Elasticsearch shards and replicas per index:"
+msgstr ""
+
+msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
+msgstr ""
+
+msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
+msgstr ""
+
+msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
+msgstr ""
+
+msgid "Number of LOCs per commit"
+msgstr ""
+
+msgid "Number of commits"
+msgstr ""
+
+msgid "Number of commits per MR"
+msgstr ""
+
+msgid "Number of employees"
+msgstr ""
+
+msgid "Number of events"
+msgstr ""
+
+msgid "Number of events for this project: %{total_count}."
+msgstr ""
+
+msgid "Number of files touched"
+msgstr ""
+
+msgid "Number of replicas"
+msgstr ""
+
+msgid "Number of shards"
+msgstr ""
+
+msgid "OK"
+msgstr ""
+
+msgid "Object Storage replication"
+msgstr ""
+
+msgid "Object does not exist on the server or you don't have permissions to access it"
+msgstr ""
+
+msgid "Oct"
+msgstr ""
+
+msgid "October"
+msgstr ""
+
+msgid "OfSearchInADropdown|Filter"
+msgstr ""
+
+msgid "Off"
+msgstr ""
+
+msgid "Oh no!"
+msgstr ""
+
+msgid "Ok, let's go"
+msgstr ""
+
+msgid "Okay"
+msgstr ""
+
+msgid "Oldest first"
+msgstr ""
+
+msgid "OmniAuth"
+msgstr ""
+
+msgid "On"
+msgstr ""
+
+msgid "On track"
+msgstr ""
+
+msgid "On-call Schedules"
+msgstr ""
+
+msgid "On-call schedules"
+msgstr ""
+
+msgid "OnCallScheduless|Any escalation rules that are using this schedule will also be deleted."
+msgstr ""
+
+msgid "OnCallSchedules|1 day"
+msgstr ""
+
+msgid "OnCallSchedules|2 weeks"
+msgstr ""
+
+msgid "OnCallSchedules|Add a rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Add a schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Add an additional schedule to your project"
+msgstr ""
+
+msgid "OnCallSchedules|Add rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Add schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Are you sure you want to delete the \"%{deleteRotation}\" rotation? This action cannot be undone."
+msgstr ""
+
+msgid "OnCallSchedules|Are you sure you want to delete the \"%{deleteSchedule}\" schedule? This action cannot be undone."
+msgstr ""
+
+msgid "OnCallSchedules|Collapse schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Create on-call schedules in GitLab"
+msgstr ""
+
+msgid "OnCallSchedules|Currently no rotation."
+msgstr ""
+
+msgid "OnCallSchedules|Delete rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Delete schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Edit rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Edit schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Enable end date"
+msgstr ""
+
+msgid "OnCallSchedules|Expand schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Failed to add rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Failed to add schedule"
+msgstr ""
+
+msgid "OnCallSchedules|Failed to edit schedule"
+msgstr ""
+
+msgid "OnCallSchedules|For this rotation, on-call will be:"
+msgstr ""
+
+msgid "OnCallSchedules|On-call schedule %{obstacle} in project %{project}"
+msgstr ""
+
+msgid "OnCallSchedules|On-call schedules"
+msgstr ""
+
+msgid "OnCallSchedules|Please note, rotations with shifts that are less than four hours are currently not supported in the weekly view."
+msgstr ""
+
+msgid "OnCallSchedules|Removing this user may put their on-call team at risk of missing a notification."
+msgstr ""
+
+msgid "OnCallSchedules|Removing yourself may put your on-call team at risk of missing a notification."
+msgstr ""
+
+msgid "OnCallSchedules|Restrict to time intervals"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation length"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation name cannot be empty"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation participants cannot be empty"
+msgstr ""
+
+msgid "OnCallSchedules|Rotation start date cannot be empty"
+msgstr ""
+
+msgid "OnCallSchedules|Rotations"
+msgstr ""
+
+msgid "OnCallSchedules|Route alerts directly to specific members of your team"
+msgstr ""
+
+msgid "OnCallSchedules|Select participant"
+msgstr ""
+
+msgid "OnCallSchedules|Select timezone"
+msgstr ""
+
+msgid "OnCallSchedules|Sets the default timezone for the schedule, for all participants"
+msgstr ""
+
+msgid "OnCallSchedules|Successfully created a new rotation"
+msgstr ""
+
+msgid "OnCallSchedules|Successfully edited your rotation"
+msgstr ""
+
+msgid "OnCallSchedules|The rotation could not be deleted. Please try again."
+msgstr ""
+
+msgid "OnCallSchedules|The rotation could not be updated. Please try again."
+msgstr ""
+
+msgid "OnCallSchedules|The schedule could not be deleted. Please try again."
+msgstr ""
+
+msgid "OnCallSchedules|The schedule could not be updated. Please try again."
+msgstr ""
+
+msgid "OnCallSchedules|Try adding a rotation"
+msgstr ""
+
+msgid "OnCallSchedules|User %{name} is currently part of:"
+msgstr ""
+
+msgid "OnCallSchedules|View next timeframe"
+msgstr ""
+
+msgid "OnCallSchedules|View previous timeframe"
+msgstr ""
+
+msgid "OnCallSchedules|You are currently a part of:"
+msgstr ""
+
+msgid "OnCallSchedules|Your schedule has been successfully created. To add individual users to this schedule, use the Add a rotation button. To enable notifications for this schedule, you must also create an %{linkStart}escalation policy%{linkEnd}."
+msgstr ""
+
+msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
+msgstr ""
+
+msgid "OnDemandScans|Are you sure you want to delete this scan?"
+msgstr ""
+
+msgid "OnDemandScans|Could not delete saved scan. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "OnDemandScans|Could not fetch on-demand scans. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "OnDemandScans|Could not fetch scanner profiles. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "OnDemandScans|Could not fetch site profiles. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "OnDemandScans|Could not run the scan. Please try again."
+msgstr ""
+
+msgid "OnDemandScans|Create new scanner profile"
+msgstr ""
+
+msgid "OnDemandScans|Create new site profile"
+msgstr ""
+
+msgid "OnDemandScans|Delete profile"
+msgstr ""
+
+msgid "OnDemandScans|Description (optional)"
+msgstr ""
+
+msgid "OnDemandScans|Edit on-demand DAST scan"
+msgstr ""
+
+msgid "OnDemandScans|Edit profile"
+msgstr ""
+
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgstr ""
+
+msgid "OnDemandScans|Manage DAST scans"
+msgstr ""
+
+msgid "OnDemandScans|Manage scanner profiles"
+msgstr ""
+
+msgid "OnDemandScans|Manage site profiles"
+msgstr ""
+
+msgid "OnDemandScans|My daily scan"
+msgstr ""
+
+msgid "OnDemandScans|New on-demand DAST scan"
+msgstr ""
+
+msgid "OnDemandScans|New scan"
+msgstr ""
+
+msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
+msgstr ""
+
+msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed site profile."
+msgstr ""
+
+msgid "OnDemandScans|On-demand Scans"
+msgstr ""
+
+msgid "OnDemandScans|On-demand scans"
+msgstr ""
+
+msgid "OnDemandScans|On-demand scans run outside of DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}."
+msgstr ""
+
+msgid "OnDemandScans|On-demand scans run outside the DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}"
+msgstr ""
+
+msgid "OnDemandScans|Repeats"
+msgstr ""
+
+msgid "OnDemandScans|Run scan"
+msgstr ""
+
+msgid "OnDemandScans|Save and run scan"
+msgstr ""
+
+msgid "OnDemandScans|Save scan"
+msgstr ""
+
+msgid "OnDemandScans|Scan library"
+msgstr ""
+
+msgid "OnDemandScans|Scan name"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
+msgstr ""
+
+msgid "OnDemandScans|Schedule scan"
+msgstr ""
+
+msgid "OnDemandScans|Select one of the existing profiles"
+msgstr ""
+
+msgid "OnDemandScans|Site profile"
+msgstr ""
+
+msgid "OnDemandScans|Start time"
+msgstr ""
+
+msgid "OnDemandScans|Target"
+msgstr ""
+
+msgid "OnDemandScans|The scan could not be canceled."
+msgstr ""
+
+msgid "OnDemandScans|The scan could not be retried."
+msgstr ""
+
+msgid "OnDemandScans|There are no finished scans."
+msgstr ""
+
+msgid "OnDemandScans|There are no running scans."
+msgstr ""
+
+msgid "OnDemandScans|There are no saved scans."
+msgstr ""
+
+msgid "OnDemandScans|There are no scheduled scans."
+msgstr ""
+
+msgid "OnDemandScans|Use existing scanner profile"
+msgstr ""
+
+msgid "OnDemandScans|Use existing site profile"
+msgstr ""
+
+msgid "OnDemandScans|View results"
+msgstr ""
+
+msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
+msgstr ""
+
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{link_start}here%{link_end}."
+msgstr ""
+
+msgid "Once removed, the fork relationship cannot be restored. This project will no longer be able to receive or send merge requests to the source project or other forks."
+msgstr ""
+
+msgid "Once you confirm and press \"Reduce project visibility\":"
+msgstr ""
+
+msgid "One more item"
+msgid_plural "%d more items"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "One or more contacts were successfully added."
+msgstr ""
+
+msgid "One or more contacts were successfully removed."
+msgstr ""
+
+msgid "One or more groups that you don't have access to."
+msgstr ""
+
+msgid "One or more of you personal access tokens were revoked"
+msgstr ""
+
+msgid "One or more of your %{provider} projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your dependency files are not supported, and the dependency list may be incomplete. Below is a list of supported file types."
+msgstr ""
+
+msgid "One or more of your personal access tokens has expired."
+msgstr ""
+
+msgid "One or more of your personal access tokens will expire in %{days_to_expire} days or less:"
+msgstr ""
+
+msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
+msgstr ""
+
+msgid "Only 1 appearances row can exist"
+msgstr ""
+
+msgid "Only Issue ID or merge request ID is required"
+msgstr ""
+
+msgid "Only Project Members"
+msgstr ""
+
+msgid "Only active projects show up in the search and on the dashboard."
+msgstr ""
+
+msgid "Only admins can delete project"
+msgstr ""
+
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
+msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
+msgstr ""
+
+msgid "Only include features new to your current subscription tier."
+msgstr ""
+
+msgid "Only policy:"
+msgstr ""
+
+msgid "Only proceed if you trust %{idp_url} to control your GitLab account sign in."
+msgstr ""
+
+msgid "Only project members can comment."
+msgstr ""
+
+msgid "Only projects created under a Ultimate license are available in Security Dashboards."
+msgstr ""
+
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only required if not using role instance credentials."
+msgstr ""
+
+msgid "Only use lowercase letters, numbers, and underscores."
+msgstr ""
+
+msgid "Only users from the specified IP address ranges 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 ""
+
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
+msgid "Open Selection"
+msgstr ""
+
+msgid "Open errors"
+msgstr ""
+
+msgid "Open in Gitpod"
+msgstr ""
+
+msgid "Open in Web IDE"
+msgstr ""
+
+msgid "Open in file view"
+msgstr ""
+
+msgid "Open in your IDE"
+msgstr ""
+
+msgid "Open raw"
+msgstr ""
+
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open: %{open}"
+msgstr ""
+
+msgid "OpenAPI"
+msgstr ""
+
+msgid "OpenAPI Specification file path or URL"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MRs"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
+msgid "OpenedNDaysAgo|Created"
+msgstr ""
+
+msgid "Opens in a new window"
+msgstr ""
+
+msgid "Opens new window"
+msgstr ""
+
+msgid "Operation failed. Check pod logs for %{pod_name} for more details."
+msgstr ""
+
+msgid "Operation not allowed"
+msgstr ""
+
+msgid "Operation timed out. Check pod logs for %{pod_name} for more details."
+msgstr ""
+
+msgid "Operations"
+msgstr ""
+
+msgid "Operations Dashboard"
+msgstr ""
+
+msgid "OperationsDashboard|Add a project to the dashboard"
+msgstr ""
+
+msgid "OperationsDashboard|Add projects"
+msgstr ""
+
+msgid "OperationsDashboard|More information"
+msgstr ""
+
+msgid "OperationsDashboard|Operations Dashboard"
+msgstr ""
+
+msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
+msgstr ""
+
+msgid "Optimize your workflow with CI/CD Pipelines"
+msgstr ""
+
+msgid "Optional"
+msgstr ""
+
+msgid "Optional parameter \"variables\" must be a Hash. Ex: variables[key1]=value1"
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Or you can choose one of the suggested colors below"
+msgstr ""
+
+msgid "Organizations"
+msgstr ""
+
+msgid "Orphaned member"
+msgstr ""
+
+msgid "Other Labels"
+msgstr ""
+
+msgid "Other available runners"
+msgstr ""
+
+msgid "Other information"
+msgstr ""
+
+msgid "Other merge requests block this MR"
+msgstr ""
+
+msgid "Other versions"
+msgstr ""
+
+msgid "Other visibility settings have been disabled by the administrator."
+msgstr ""
+
+msgid "Otherwise, click the link below to complete the process."
+msgstr ""
+
+msgid "Otherwise, click the link below to complete the process:"
+msgstr ""
+
+msgid "Our team has been notified. Please try again."
+msgstr ""
+
+msgid "Out-of-compliance with this project's policies and should be removed"
+msgstr ""
+
+msgid "OutboundRequests|Allow requests to the local network from hooks and services."
+msgstr ""
+
+msgid "OutboundRequests|Allow requests to the local network from system hooks"
+msgstr ""
+
+msgid "OutboundRequests|Allow requests to the local network from web hooks and services"
+msgstr ""
+
+msgid "OutboundRequests|Enforce DNS rebinding attack protection"
+msgstr ""
+
+msgid "OutboundRequests|Local IP addresses and domain names that hooks and services may access"
+msgstr ""
+
+msgid "OutboundRequests|Outbound requests"
+msgstr ""
+
+msgid "OutboundRequests|Requests to these domains and IP addresses are accessible to both system hooks and web hooks even when local requests are not allowed. IP ranges such as 1:0:0:0:0:0:0:0/124 and 127.0.0.0/28 are supported. Domain wildcards are not supported. To separate entries use commas, semicolons, or newlines. The allowlist can hold a maximum of 1000 entries. Domains must be IDNA encoded."
+msgstr ""
+
+msgid "OutboundRequests|Resolve IP addresses once and uses them to submit requests."
+msgstr ""
+
+msgid "OutdatedBrowser|GitLab may not work properly, because you are using an outdated web browser."
+msgstr ""
+
+msgid "OutdatedBrowser|Please install a %{browser_link_start}supported web browser%{browser_link_end} for a better experience."
+msgstr ""
+
+msgid "Outdent"
+msgstr ""
+
+msgid "Overridden"
+msgstr ""
+
+msgid "Overview"
+msgstr ""
+
+msgid "Overwrite diverged branches"
+msgstr ""
+
+msgid "Owned by %{image_tag}"
+msgstr ""
+
+msgid "Owned by anyone"
+msgstr ""
+
+msgid "Owned by me"
+msgstr ""
+
+msgid "Owned by:"
+msgstr ""
+
+msgid "Owner"
+msgstr ""
+
+msgid "Owners can modify this selection."
+msgstr ""
+
+msgid "PQL|An error occurred while sending hand raise lead."
+msgstr ""
+
+msgid "PQL|By providing my contact information, I agree GitLab may contact me via email about its product, services and events. You may opt-out at any time by unsubscribing in emails or visiting our communication preference center."
+msgstr ""
+
+msgid "PQL|Cancel"
+msgstr ""
+
+msgid "PQL|Contact our Sales team"
+msgstr ""
+
+msgid "PQL|Contact sales"
+msgstr ""
+
+msgid "PQL|Hello %{userName}. Before putting you in touch with our sales team, we would like you to verify and complete the information below."
+msgstr ""
+
+msgid "PQL|Message for the Sales team (optional)"
+msgstr ""
+
+msgid "PQL|Please select a city or state"
+msgstr ""
+
+msgid "PQL|Submit information"
+msgstr ""
+
+msgid "PQL|Thank you for reaching out! Our sales team will get back to you soon."
+msgstr ""
+
+msgid "Package Registry"
+msgstr ""
+
+msgid "Package Registry: authenticated API requests"
+msgstr ""
+
+msgid "Package Registry: unauthenticated API requests"
+msgstr ""
+
+msgid "Package already exists"
+msgstr ""
+
+msgid "Package deleted successfully"
+msgstr ""
+
+msgid "Package file size limits"
+msgstr ""
+
+msgid "Package recipe already exists"
+msgstr ""
+
+msgid "Package registry rate limits"
+msgstr ""
+
+msgid "Package type"
+msgstr ""
+
+msgid "Package type must be Conan"
+msgstr ""
+
+msgid "Package type must be Debian"
+msgstr ""
+
+msgid "Package type must be Helm"
+msgstr ""
+
+msgid "Package type must be Maven"
+msgstr ""
+
+msgid "Package type must be NPM"
+msgstr ""
+
+msgid "Package type must be NuGet"
+msgstr ""
+
+msgid "Package type must be PyPi"
+msgstr ""
+
+msgid "Package type must be RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
+msgstr ""
+
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
+msgstr ""
+
+msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
+msgstr ""
+
+msgid "PackageRegistry|Add Conan Remote"
+msgstr ""
+
+msgid "PackageRegistry|Add Gradle Groovy DSL repository command"
+msgstr ""
+
+msgid "PackageRegistry|Add Gradle Kotlin DSL repository command"
+msgstr ""
+
+msgid "PackageRegistry|Add NuGet Source"
+msgstr ""
+
+msgid "PackageRegistry|Add composer registry"
+msgstr ""
+
+msgid "PackageRegistry|Allow duplicates"
+msgstr ""
+
+msgid "PackageRegistry|App group: %{group}"
+msgstr ""
+
+msgid "PackageRegistry|App name: %{name}"
+msgstr ""
+
+msgid "PackageRegistry|Built by pipeline %{link} triggered %{datetime} by %{author}"
+msgstr ""
+
+msgid "PackageRegistry|Composer"
+msgstr ""
+
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
+msgid "PackageRegistry|Conan"
+msgstr ""
+
+msgid "PackageRegistry|Conan Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy .pypirc content"
+msgstr ""
+
+msgid "PackageRegistry|Copy Conan Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Conan Setup Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Gradle Groovy DSL install command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Gradle Kotlin DSL install command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Maven XML"
+msgstr ""
+
+msgid "PackageRegistry|Copy Maven command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Maven registry XML"
+msgstr ""
+
+msgid "PackageRegistry|Copy NuGet Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy NuGet Setup Command"
+msgstr ""
+
+msgid "PackageRegistry|Copy Pip command"
+msgstr ""
+
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
+msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
+msgstr ""
+
+msgid "PackageRegistry|Copy add Gradle Kotlin DSL repository command"
+msgstr ""
+
+msgid "PackageRegistry|Copy and paste this inside your %{codeStart}pom.xml%{codeEnd} %{codeStart}dependencies%{codeEnd} block."
+msgstr ""
+
+msgid "PackageRegistry|Copy npm command"
+msgstr ""
+
+msgid "PackageRegistry|Copy npm setup command"
+msgstr ""
+
+msgid "PackageRegistry|Copy registry include"
+msgstr ""
+
+msgid "PackageRegistry|Copy require package include"
+msgstr ""
+
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
+msgid "PackageRegistry|Copy yarn command"
+msgstr ""
+
+msgid "PackageRegistry|Copy yarn setup command"
+msgstr ""
+
+msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
+msgstr ""
+
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package Version"
+msgstr ""
+
+msgid "PackageRegistry|Delete package"
+msgstr ""
+
+msgid "PackageRegistry|Failed to load the package data"
+msgstr ""
+
+msgid "PackageRegistry|For more information on Composer packages in GitLab, %{linkStart}see the documentation.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|For more information on the Conan registry, %{linkStart}see the documentation%{linkEnd}."
+msgstr ""
+
+msgid "PackageRegistry|For more information on the Maven registry, %{linkStart}see the documentation%{linkEnd}."
+msgstr ""
+
+msgid "PackageRegistry|For more information on the NuGet registry, %{linkStart}see the documentation%{linkEnd}."
+msgstr ""
+
+msgid "PackageRegistry|For more information on the PyPi registry, %{linkStart}see the documentation%{linkEnd}."
+msgstr ""
+
+msgid "PackageRegistry|Generic"
+msgstr ""
+
+msgid "PackageRegistry|Gradle Groovy DSL"
+msgstr ""
+
+msgid "PackageRegistry|Gradle Groovy DSL install command"
+msgstr ""
+
+msgid "PackageRegistry|Gradle Kotlin DSL"
+msgstr ""
+
+msgid "PackageRegistry|Gradle Kotlin DSL install command"
+msgstr ""
+
+msgid "PackageRegistry|Helm"
+msgstr ""
+
+msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
+msgstr ""
+
+msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}pom.xml%{codeEnd} file."
+msgstr ""
+
+msgid "PackageRegistry|Install package version"
+msgstr ""
+
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
+msgid "PackageRegistry|Invalid Package: failed metadata extraction"
+msgstr ""
+
+msgid "PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab."
+msgstr ""
+
+msgid "PackageRegistry|License information located at %{link}"
+msgstr ""
+
+msgid "PackageRegistry|Manually Published"
+msgstr ""
+
+msgid "PackageRegistry|Maven"
+msgstr ""
+
+msgid "PackageRegistry|Maven Command"
+msgstr ""
+
+msgid "PackageRegistry|Maven XML"
+msgstr ""
+
+msgid "PackageRegistry|NuGet"
+msgstr ""
+
+msgid "PackageRegistry|NuGet Command"
+msgstr ""
+
+msgid "PackageRegistry|Package Registry"
+msgstr ""
+
+msgid "PackageRegistry|Package deleted successfully"
+msgstr ""
+
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
+msgid "PackageRegistry|Package has %{updatesCount} archived update"
+msgid_plural "PackageRegistry|Package has %{updatesCount} archived updates"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
+msgstr ""
+
+msgid "PackageRegistry|Pip Command"
+msgstr ""
+
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
+msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
+msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
+msgstr ""
+
+msgid "PackageRegistry|PyPI"
+msgstr ""
+
+msgid "PackageRegistry|Recipe: %{recipe}"
+msgstr ""
+
+msgid "PackageRegistry|Registry setup"
+msgstr ""
+
+msgid "PackageRegistry|Remove package"
+msgstr ""
+
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
+msgid "PackageRegistry|RubyGems"
+msgstr ""
+
+msgid "PackageRegistry|Settings for Generic packages"
+msgstr ""
+
+msgid "PackageRegistry|Settings for Maven packages"
+msgstr ""
+
+msgid "PackageRegistry|Show Composer commands"
+msgstr ""
+
+msgid "PackageRegistry|Show Conan commands"
+msgstr ""
+
+msgid "PackageRegistry|Show NPM commands"
+msgstr ""
+
+msgid "PackageRegistry|Show Nuget commands"
+msgstr ""
+
+msgid "PackageRegistry|Show PyPi commands"
+msgstr ""
+
+msgid "PackageRegistry|Show Yarn commands"
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
+msgid "PackageRegistry|Sorry, your filter produced no results"
+msgstr ""
+
+msgid "PackageRegistry|Source project located at %{link}"
+msgstr ""
+
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
+msgid "PackageRegistry|There are no other versions of this package."
+msgstr ""
+
+msgid "PackageRegistry|There are no packages yet"
+msgstr ""
+
+msgid "PackageRegistry|There was a problem fetching the details for this package."
+msgstr ""
+
+msgid "PackageRegistry|This NuGet package has no dependencies."
+msgstr ""
+
+msgid "PackageRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "PackageRegistry|Type"
+msgstr ""
+
+msgid "PackageRegistry|Unable to fetch package version information."
+msgstr ""
+
+msgid "PackageRegistry|Unable to load package"
+msgstr ""
+
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?"
+msgstr ""
+
+msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
+msgstr ""
+
+msgid "PackageRegistry|npm"
+msgstr ""
+
+msgid "PackageRegistry|published by %{author}"
+msgstr ""
+
+msgid "Packages & Registries"
+msgstr ""
+
+msgid "Page not found"
+msgstr ""
+
+msgid "Page settings"
+msgstr ""
+
+msgid "PagerDutySettings|Active"
+msgstr ""
+
+msgid "PagerDutySettings|Create a GitLab incident for each PagerDuty incident by %{linkStart}configuring a webhook in PagerDuty%{linkEnd}"
+msgstr ""
+
+msgid "PagerDutySettings|Failed to update Webhook URL"
+msgstr ""
+
+msgid "PagerDutySettings|Reset webhook URL"
+msgstr ""
+
+msgid "PagerDutySettings|Resetting the webhook URL for this project will require updating this integration's settings in PagerDuty."
+msgstr ""
+
+msgid "PagerDutySettings|Webhook URL"
+msgstr ""
+
+msgid "PagerDutySettings|Webhook URL update was successful"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Pages Domain"
+msgstr ""
+
+msgid "Pagination|First"
+msgstr ""
+
+msgid "Pagination|Go to first page"
+msgstr ""
+
+msgid "Pagination|Go to last page"
+msgstr ""
+
+msgid "Pagination|Go to next page"
+msgstr ""
+
+msgid "Pagination|Go to previous page"
+msgstr ""
+
+msgid "Pagination|Last"
+msgstr ""
+
+msgid "Pagination|Last »"
+msgstr ""
+
+msgid "Pagination|Next"
+msgstr ""
+
+msgid "Pagination|Prev"
+msgstr ""
+
+msgid "Pagination|« First"
+msgstr ""
+
+msgid "Parameter"
+msgstr ""
+
+msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
+msgstr ""
+
+msgid "Parent"
+msgstr ""
+
+msgid "Parent epic doesn't exist."
+msgstr ""
+
+msgid "Parent epic is not present."
+msgstr ""
+
+msgid "Parsing error for param :embed_json. %{message}"
+msgstr ""
+
+msgid "Part of merge request changes"
+msgstr ""
+
+msgid "Participants"
+msgstr ""
+
+msgid "Pass job variables"
+msgstr ""
+
+msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgstr ""
+
+msgid "Passed"
+msgstr ""
+
+msgid "Passed on"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Password (optional)"
+msgstr ""
+
+msgid "Password authentication is unavailable."
+msgstr ""
+
+msgid "Password confirmation"
+msgstr ""
+
+msgid "Password successfully changed"
+msgstr ""
+
+msgid "Password was successfully updated. Please sign in again."
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
+msgid "Passwords should be unique and not used for any other sites or services."
+msgstr ""
+
+msgid "Past due"
+msgstr ""
+
+msgid "Paste a public key here."
+msgstr ""
+
+msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
+msgstr ""
+
+msgid "Paste confidential epic link"
+msgstr ""
+
+msgid "Paste confidential issue link"
+msgstr ""
+
+msgid "Paste epic link"
+msgstr ""
+
+msgid "Paste issue link"
+msgstr ""
+
+msgid "Paste project path (i.e. gitlab-org/gitlab)"
+msgstr ""
+
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
+msgid "Patch to apply"
+msgstr ""
+
+msgid "Path"
+msgstr ""
+
+msgid "Path:"
+msgstr ""
+
+msgid "Paths can contain wildcards, like */welcome"
+msgstr ""
+
+msgid "Paths to protect with rate limiting"
+msgstr ""
+
+msgid "Pause"
+msgstr ""
+
+msgid "Pause Elasticsearch indexing"
+msgstr ""
+
+msgid "Paused"
+msgstr ""
+
+msgid "Paused runners don't accept new jobs"
+msgstr ""
+
+msgid "Peer review by"
+msgstr ""
+
+msgid "Pending"
+msgstr ""
+
+msgid "Pending Deletion"
+msgstr ""
+
+msgid "Pending comments"
+msgstr ""
+
+msgid "Pending deletion"
+msgstr ""
+
+msgid "Pending owner approval"
+msgstr ""
+
+msgid "Pending sync…"
+msgstr ""
+
+msgid "People without permission will never get a notification and won't be able to comment."
+msgstr ""
+
+msgid "People without permission will never get a notification."
+msgstr ""
+
+msgid "Percent rollout must be an integer number between 0 and 100"
+msgstr ""
+
+msgid "Percentage"
+msgstr ""
+
+msgid "Perform advanced options such as changing path, transferring, exporting, or removing the group."
+msgstr ""
+
+msgid "Perform code reviews and enhance collaboration with merge requests."
+msgstr ""
+
+msgid "Perform common operations on GitLab project"
+msgstr ""
+
+msgid "Performance optimization"
+msgstr ""
+
+msgid "PerformanceBar|Backend"
+msgstr ""
+
+msgid "PerformanceBar|Bullet notifications"
+msgstr ""
+
+msgid "PerformanceBar|DOM Content Loaded"
+msgstr ""
+
+msgid "PerformanceBar|Download"
+msgstr ""
+
+msgid "PerformanceBar|Elasticsearch calls"
+msgstr ""
+
+msgid "PerformanceBar|External Http calls"
+msgstr ""
+
+msgid "PerformanceBar|First Contentful Paint"
+msgstr ""
+
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
+msgid "PerformanceBar|Frontend resources"
+msgstr ""
+
+msgid "PerformanceBar|Gitaly calls"
+msgstr ""
+
+msgid "PerformanceBar|Memory"
+msgstr ""
+
+msgid "PerformanceBar|Memory report"
+msgstr ""
+
+msgid "PerformanceBar|Redis calls"
+msgstr ""
+
+msgid "PerformanceBar|Rugged calls"
+msgstr ""
+
+msgid "PerformanceBar|SQL queries"
+msgstr ""
+
+msgid "PerformanceBar|Sort by duration"
+msgstr ""
+
+msgid "PerformanceBar|Sort chronologically"
+msgstr ""
+
+msgid "PerformanceBar|Stats"
+msgstr ""
+
+msgid "PerformanceBar|Total duration"
+msgstr ""
+
+msgid "PerformanceBar|Trace"
+msgstr ""
+
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
+msgid "Period in seconds"
+msgstr ""
+
+msgid "Permalink"
+msgstr ""
+
+msgid "Permanently remove group"
+msgstr ""
+
+msgid "Permissions"
+msgstr ""
+
+msgid "Permissions Help"
+msgstr ""
+
+msgid "Permissions and group features"
+msgstr ""
+
+msgid "Personal Access Token"
+msgstr ""
+
+msgid "Personal Access Token prefix"
+msgstr ""
+
+msgid "Personal access tokens are not revoked upon expiration."
+msgstr ""
+
+msgid "Personal project creation is not allowed. Please contact your administrator with questions"
+msgstr ""
+
+msgid "Personal projects"
+msgstr ""
+
+msgid "Personal projects limit:"
+msgstr ""
+
+msgid "Phabricator Server Import"
+msgstr ""
+
+msgid "Phabricator Server URL"
+msgstr ""
+
+msgid "Phabricator Tasks"
+msgstr ""
+
+msgid "Phone"
+msgstr ""
+
+msgid "Pick a name"
+msgstr ""
+
+msgid "Pin code"
+msgstr ""
+
+msgid "Pipeline"
+msgstr ""
+
+msgid "Pipeline %{label}"
+msgstr ""
+
+msgid "Pipeline %{label} for \"%{dataTitle}\""
+msgstr ""
+
+msgid "Pipeline Editor"
+msgstr ""
+
+msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
+msgstr ""
+
+msgid "Pipeline ID"
+msgstr ""
+
+msgid "Pipeline IID"
+msgstr ""
+
+msgid "Pipeline Schedule"
+msgstr ""
+
+msgid "Pipeline Schedules"
+msgstr ""
+
+msgid "Pipeline URL"
+msgstr ""
+
+msgid "Pipeline durations for the last 30 commits"
+msgstr ""
+
+msgid "Pipeline ran in fork of project"
+msgstr ""
+
+msgid "Pipeline status emails"
+msgstr ""
+
+msgid "Pipeline subscriptions"
+msgstr ""
+
+msgid "Pipeline subscriptions trigger a new pipeline on the default branch of this project when a pipeline successfully completes for a new tag on the %{default_branch_docs} of the subscribed project."
+msgstr ""
+
+msgid "Pipeline triggers"
+msgstr ""
+
+msgid "Pipeline: %{status}"
+msgstr ""
+
+msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
+msgstr ""
+
+msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
+msgstr ""
+
+msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
+msgstr ""
+
+msgid "PipelineCharts|CI/CD Analytics"
+msgstr ""
+
+msgid "PipelineCharts|Failed:"
+msgstr ""
+
+msgid "PipelineCharts|Overall statistics"
+msgstr ""
+
+msgid "PipelineCharts|Success ratio:"
+msgstr ""
+
+msgid "PipelineCharts|Successful:"
+msgstr ""
+
+msgid "PipelineCharts|There was an error parsing the data for the charts."
+msgstr ""
+
+msgid "PipelineCharts|Total:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
+msgstr ""
+
+msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
+msgstr ""
+
+msgid "PipelineEditorTutorial|GitLab CI/CD can automatically build, test, and deploy your application."
+msgstr ""
+
+msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Make your pipeline more efficient with the %{linkStart}Needs keyword%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
+msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
+msgstr ""
+
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
+msgstr ""
+
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgstr ""
+
+msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
+msgstr ""
+
+msgid "PipelineEditorTutorial|💡 Tip: Visualize and validate your pipeline"
+msgstr ""
+
+msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
+msgstr ""
+
+msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
+msgstr ""
+
+msgid "PipelineEditor|The merged YAML view is displayed when the CI/CD configuration file has valid syntax."
+msgstr ""
+
+msgid "PipelineEditor|The pipeline visualization is displayed when the CI/CD configuration file has valid syntax."
+msgstr ""
+
+msgid "PipelineEditor|This tab will be usable when the CI/CD configuration file is populated with valid syntax."
+msgstr ""
+
+msgid "PipelineScheduleIntervalPattern|Custom (%{linkStart}Cron syntax%{linkEnd})"
+msgstr ""
+
+msgid "PipelineSchedules|Activated"
+msgstr ""
+
+msgid "PipelineSchedules|Active"
+msgstr ""
+
+msgid "PipelineSchedules|All"
+msgstr ""
+
+msgid "PipelineSchedules|Inactive"
+msgstr ""
+
+msgid "PipelineSchedules|Next Run"
+msgstr ""
+
+msgid "PipelineSchedules|None"
+msgstr ""
+
+msgid "PipelineSchedules|Provide a short description for this pipeline"
+msgstr ""
+
+msgid "PipelineSchedules|Take ownership"
+msgstr ""
+
+msgid "PipelineSchedules|Target"
+msgstr ""
+
+msgid "PipelineSchedules|Variables"
+msgstr ""
+
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
+msgstr ""
+
+msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
+msgstr ""
+
+msgid "PipelineWizardDefaultCommitMessage|Add %{filename}"
+msgstr ""
+
+msgid "PipelineWizardDefaultCommitMessage|Update %{filename}"
+msgstr ""
+
+msgid "PipelineWizardInputValidation|At least one entry is required"
+msgstr ""
+
+msgid "PipelineWizardInputValidation|This field is required"
+msgstr ""
+
+msgid "PipelineWizardInputValidation|This value is not valid"
+msgstr ""
+
+msgid "PipelineWizardListWidget|add another step"
+msgstr ""
+
+msgid "PipelineWizardListWidget|remove step"
+msgstr ""
+
+msgid "PipelineWizard|Commit"
+msgstr ""
+
+msgid "PipelineWizard|Commit Message"
+msgstr ""
+
+msgid "PipelineWizard|Commit changes to your file"
+msgstr ""
+
+msgid "PipelineWizard|Commit file to Branch"
+msgstr ""
+
+msgid "PipelineWizard|Commit your new file"
+msgstr ""
+
+msgid "PipelineWizard|The file has been committed."
+msgstr ""
+
+msgid "PipelineWizard|There was a problem committing the changes."
+msgstr ""
+
+msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
+msgstr ""
+
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
+msgid "Pipelines"
+msgstr ""
+
+msgid "Pipelines charts"
+msgstr ""
+
+msgid "Pipelines settings for '%{project_name}' were successfully updated."
+msgstr ""
+
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
+msgstr ""
+
+msgid "Pipelines|Are you sure you want to run this pipeline?"
+msgstr ""
+
+msgid "Pipelines|Auto DevOps"
+msgstr ""
+
+msgid "Pipelines|Build with confidence"
+msgstr ""
+
+msgid "Pipelines|By revoking a trigger you will break any processes making use of it. Are you sure?"
+msgstr ""
+
+msgid "Pipelines|CI lint"
+msgstr ""
+
+msgid "Pipelines|CI/CD template to test and deploy your %{name} project."
+msgstr ""
+
+msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
+msgstr ""
+
+msgid "Pipelines|Clear runner caches"
+msgstr ""
+
+msgid "Pipelines|Configuration validation currently not available."
+msgstr ""
+
+msgid "Pipelines|Copy trigger token"
+msgstr ""
+
+msgid "Pipelines|Could not load artifacts."
+msgstr ""
+
+msgid "Pipelines|Could not load merged YAML content"
+msgstr ""
+
+msgid "Pipelines|Description"
+msgstr ""
+
+msgid "Pipelines|Edit"
+msgstr ""
+
+msgid "Pipelines|Editor"
+msgstr ""
+
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
+msgstr ""
+
+msgid "Pipelines|Get started with GitLab CI/CD"
+msgstr ""
+
+msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
+msgstr ""
+
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
+msgstr ""
+
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgstr ""
+
+msgid "Pipelines|Install GitLab Runner"
+msgstr ""
+
+msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
+msgstr ""
+
+msgid "Pipelines|Last Used"
+msgstr ""
+
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
+msgstr ""
+
+msgid "Pipelines|Lint"
+msgstr ""
+
+msgid "Pipelines|Loading Pipelines"
+msgstr ""
+
+msgid "Pipelines|Loading pipelines"
+msgstr ""
+
+msgid "Pipelines|Merged YAML is view only"
+msgstr ""
+
+msgid "Pipelines|More Information"
+msgstr ""
+
+msgid "Pipelines|No runners detected"
+msgstr ""
+
+msgid "Pipelines|No triggers have been created yet. Add one using the form above."
+msgstr ""
+
+msgid "Pipelines|Owner"
+msgstr ""
+
+msgid "Pipelines|Pipeline Editor"
+msgstr ""
+
+msgid "Pipelines|Project cache successfully reset."
+msgstr ""
+
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
+msgid "Pipelines|Revoke trigger"
+msgstr ""
+
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
+msgid "Pipelines|Something went wrong while cleaning runners cache."
+msgstr ""
+
+msgid "Pipelines|The %{namespace_name} namespace has %{percentage}%% or less Shared Runner Pipeline minutes remaining. After it runs out, no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "Pipelines|The %{namespace_name} namespace has exceeded its pipeline minutes quota. Buy additional pipeline minutes, or no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "Pipelines|The CI configuration was not loaded, please try again."
+msgstr ""
+
+msgid "Pipelines|The GitLab CI configuration could not be updated."
+msgstr ""
+
+msgid "Pipelines|There are currently no finished pipelines."
+msgstr ""
+
+msgid "Pipelines|There are currently no pipelines."
+msgstr ""
+
+msgid "Pipelines|There was a problem with loading the pipeline data."
+msgstr ""
+
+msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
+msgstr ""
+
+msgid "Pipelines|This GitLab CI configuration is invalid."
+msgstr ""
+
+msgid "Pipelines|This GitLab CI configuration is invalid:"
+msgstr ""
+
+msgid "Pipelines|This GitLab CI configuration is invalid: %{reason}."
+msgstr ""
+
+msgid "Pipelines|This GitLab CI configuration is valid."
+msgstr ""
+
+msgid "Pipelines|This is a child pipeline within the parent pipeline"
+msgstr ""
+
+msgid "Pipelines|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
+msgstr ""
+
+msgid "Pipelines|This pipeline ran on the contents of this merge request's source branch, not the target branch."
+msgstr ""
+
+msgid "Pipelines|This pipeline will run code originating from a forked project merge request. This means that the code can potentially have security considerations like exposing CI variables."
+msgstr ""
+
+msgid "Pipelines|This project is not currently set up to run pipelines."
+msgstr ""
+
+msgid "Pipelines|Token"
+msgstr ""
+
+msgid "Pipelines|Trigger user has insufficient permissions to project"
+msgstr ""
+
+msgid "Pipelines|Try test template"
+msgstr ""
+
+msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
+msgstr ""
+
+msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
+msgstr ""
+
+msgid "Pipelines|Use template"
+msgstr ""
+
+msgid "Pipelines|Validating GitLab CI configuration…"
+msgstr ""
+
+msgid "Pipelines|View merged YAML"
+msgstr ""
+
+msgid "Pipelines|Visualize"
+msgstr ""
+
+msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
+msgstr ""
+
+msgid "Pipelines|error"
+msgstr ""
+
+msgid "Pipelines|invalid"
+msgstr ""
+
+msgid "Pipelines|latest"
+msgstr ""
+
+msgid "Pipelines|merge request"
+msgstr ""
+
+msgid "Pipelines|merge train"
+msgstr ""
+
+msgid "Pipelines|stuck"
+msgstr ""
+
+msgid "Pipelines|yaml invalid"
+msgstr ""
+
+msgid "Pipeline|Actions"
+msgstr ""
+
+msgid "Pipeline|Branch name"
+msgstr ""
+
+msgid "Pipeline|Branches or tags could not be loaded."
+msgstr ""
+
+msgid "Pipeline|Canceled"
+msgstr ""
+
+msgid "Pipeline|Checking pipeline status"
+msgstr ""
+
+msgid "Pipeline|Checking pipeline status."
+msgstr ""
+
+msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
+msgstr ""
+
+msgid "Pipeline|Created"
+msgstr ""
+
+msgid "Pipeline|Creating pipeline."
+msgstr ""
+
+msgid "Pipeline|Date"
+msgstr ""
+
+msgid "Pipeline|Detached merge request pipeline"
+msgstr ""
+
+msgid "Pipeline|Failed"
+msgstr ""
+
+msgid "Pipeline|In progress"
+msgstr ""
+
+msgid "Pipeline|Manual"
+msgstr ""
+
+msgid "Pipeline|Merge train pipeline"
+msgstr ""
+
+msgid "Pipeline|Merge train pipeline jobs can not be retried"
+msgstr ""
+
+msgid "Pipeline|Merged result pipeline"
+msgstr ""
+
+msgid "Pipeline|Passed"
+msgstr ""
+
+msgid "Pipeline|Pending"
+msgstr ""
+
+msgid "Pipeline|Pipeline"
+msgstr ""
+
+msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
+msgstr ""
+
+msgid "Pipeline|Pipeline cannot be run."
+msgstr ""
+
+msgid "Pipeline|Pipelines"
+msgstr ""
+
+msgid "Pipeline|Raw text search is not currently supported. Please use the available search tokens."
+msgstr ""
+
+msgid "Pipeline|Run for branch name or tag"
+msgstr ""
+
+msgid "Pipeline|Run pipeline"
+msgstr ""
+
+msgid "Pipeline|Running"
+msgstr ""
+
+msgid "Pipeline|Skipped"
+msgstr ""
+
+msgid "Pipeline|Source"
+msgstr ""
+
+msgid "Pipeline|Source|Security Policy"
+msgstr ""
+
+msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
+msgstr ""
+
+msgid "Pipeline|Stages"
+msgstr ""
+
+msgid "Pipeline|Status"
+msgstr ""
+
+msgid "Pipeline|Stop pipeline"
+msgstr ""
+
+msgid "Pipeline|Stop pipeline #%{pipelineId}?"
+msgstr ""
+
+msgid "Pipeline|Tag name"
+msgstr ""
+
+msgid "Pipeline|Test coverage"
+msgstr ""
+
+msgid "Pipeline|This change will decrease the overall test coverage if merged."
+msgstr ""
+
+msgid "Pipeline|This change will increase the overall test coverage if merged."
+msgstr ""
+
+msgid "Pipeline|This change will not change the overall test coverage if merged."
+msgstr ""
+
+msgid "Pipeline|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
+msgstr ""
+
+msgid "Pipeline|This pipeline ran on the contents of this merge request's source branch, not the target branch."
+msgstr ""
+
+msgid "Pipeline|Trigger author"
+msgstr ""
+
+msgid "Pipeline|Triggerer"
+msgstr ""
+
+msgid "Pipeline|Variables"
+msgstr ""
+
+msgid "Pipeline|View commit"
+msgstr ""
+
+msgid "Pipeline|View pipeline"
+msgstr ""
+
+msgid "Pipeline|We are currently unable to fetch pipeline data"
+msgstr ""
+
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
+
+msgid "Pipeline|for"
+msgstr ""
+
+msgid "Pipeline|merge request"
+msgstr ""
+
+msgid "Pipeline|merge train"
+msgstr ""
+
+msgid "Pipeline|on"
+msgstr ""
+
+msgid "Pipeline|with stage"
+msgstr ""
+
+msgid "Pipeline|with stages"
+msgstr ""
+
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
+msgstr ""
+
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
+msgstr ""
+
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
+msgstr ""
+
+msgid "Plain diff"
+msgstr ""
+
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
+msgid "Plan"
+msgstr ""
+
+msgid "Plan:"
+msgstr ""
+
+msgid "Planning hierarchy"
+msgstr ""
+
+msgid "PlantUML"
+msgstr ""
+
+msgid "PlantUML URL"
+msgstr ""
+
+msgid "Play"
+msgstr ""
+
+msgid "Play all manual"
+msgstr ""
+
+msgid "Please %{link_to_register} or %{link_to_sign_in} to comment"
+msgstr ""
+
+msgid "Please %{registerLinkStart}register%{registerLinkEnd} or %{signInLinkStart}sign in%{signInLinkEnd} to reply."
+msgstr ""
+
+msgid "Please %{registerLinkStart}register%{registerLinkEnd} or %{signInLinkStart}sign in%{signInLinkEnd} to start a new discussion."
+msgstr ""
+
+msgid "Please %{startTagRegister}register%{endRegisterTag} or %{startTagSignIn}sign in%{endSignInTag} to reply"
+msgstr ""
+
+msgid "Please accept the Terms of Service before continuing."
+msgstr ""
+
+msgid "Please add a comment in the text area above"
+msgstr ""
+
+msgid "Please check the configuration file for this chart"
+msgstr ""
+
+msgid "Please check the configuration file to ensure that a collection of charts has been declared."
+msgstr ""
+
+msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
+msgstr ""
+
+msgid "Please check your email %{email} to confirm your account"
+msgstr ""
+
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgstr ""
+
+msgid "Please choose a file"
+msgstr ""
+
+msgid "Please complete your profile with email address"
+msgstr ""
+
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
+msgid "Please contact your GitLab administrator if you think this is an error."
+msgstr ""
+
+msgid "Please contact your administrator with any questions."
+msgstr ""
+
+msgid "Please contact your administrator."
+msgstr ""
+
+msgid "Please convert %{linkStart}them to Git%{linkEnd}, and go through the %{linkToImportFlow} again."
+msgstr ""
+
+msgid "Please copy, download, or print your recovery codes before proceeding."
+msgstr ""
+
+msgid "Please create a password for your new account."
+msgstr ""
+
+msgid "Please create a username with only alphanumeric characters."
+msgstr ""
+
+msgid "Please create an index before enabling indexing"
+msgstr ""
+
+msgid "Please delete your current license if you want to downgrade to the free plan."
+msgstr ""
+
+msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
+msgstr ""
+
+msgid "Please enter a non-negative number"
+msgstr ""
+
+msgid "Please enter a number greater than %{number} (from the project settings)"
+msgstr ""
+
+msgid "Please enter a valid URL format, ex: http://www.example.com/home"
+msgstr ""
+
+msgid "Please enter a valid hex (#RRGGBB or #RGB) color value"
+msgstr ""
+
+msgid "Please enter a valid number"
+msgstr ""
+
+msgid "Please enter a valid time interval"
+msgstr ""
+
+msgid "Please enter your current password."
+msgstr ""
+
+msgid "Please fill in a descriptive name for your group."
+msgstr ""
+
+msgid "Please fill in a name for your topic."
+msgstr ""
+
+msgid "Please fill out this field."
+msgstr ""
+
+msgid "Please follow the %{link_start}Let's Encrypt troubleshooting instructions%{link_end} to re-obtain your Let's Encrypt certificate."
+msgstr ""
+
+msgid "Please follow the Let's Encrypt troubleshooting instructions to re-obtain your Let's Encrypt certificate: %{docs_url}."
+msgstr ""
+
+msgid "Please migrate all existing projects to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
+msgid "Please provide a name"
+msgstr ""
+
+msgid "Please provide a name."
+msgstr ""
+
+msgid "Please provide a valid URL"
+msgstr ""
+
+msgid "Please provide a valid URL."
+msgstr ""
+
+msgid "Please provide a valid YouTube URL or ID"
+msgstr ""
+
+msgid "Please provide a valid email address."
+msgstr ""
+
+msgid "Please provide attributes to update"
+msgstr ""
+
+msgid "Please reach out if you have any questions and we'll be happy to assist."
+msgstr ""
+
+msgid "Please refer to %{docs_url}"
+msgstr ""
+
+msgid "Please review the updated escalation policies for %{project_link}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
+msgstr ""
+
+msgid "Please review the updated escalation policies for %{project}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
+msgstr ""
+
+msgid "Please select"
+msgstr ""
+
+msgid "Please select a Jira project"
+msgstr ""
+
+msgid "Please select a country"
+msgstr ""
+
+msgid "Please select a file"
+msgstr ""
+
+msgid "Please select a group"
+msgstr ""
+
+msgid "Please select a valid target branch"
+msgstr ""
+
+msgid "Please select a valid target branch."
+msgstr ""
+
+msgid "Please select and add a member"
+msgstr ""
+
+msgid "Please select at least one filter to see results"
+msgstr ""
+
+msgid "Please select what should be included in each exported requirement."
+msgstr ""
+
+msgid "Please select..."
+msgstr ""
+
+msgid "Please set a new password before proceeding."
+msgstr ""
+
+msgid "Please solve the captcha"
+msgstr ""
+
+msgid "Please try again"
+msgstr ""
+
+msgid "Please try and refresh the page. If the problem persists please contact support."
+msgstr ""
+
+msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgstr ""
+
+msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
+msgstr ""
+
+msgid "Please wait a moment, this page will automatically refresh when ready."
+msgstr ""
+
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
+msgid "Please wait while we import the repository for you. Refresh at will."
+msgstr ""
+
+msgid "Pod does not exist"
+msgstr ""
+
+msgid "Pod not found"
+msgstr ""
+
+msgid "Pods in use"
+msgstr ""
+
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
+msgstr ""
+
+msgid "Policies"
+msgstr ""
+
+msgid "Policy '%{escalation_policy_name}' does not exist."
+msgstr ""
+
+msgid "Policy management project does have any policies in %{policy_path}"
+msgstr ""
+
+msgid "Policy project doesn't exist"
+msgstr ""
+
+msgid "PolicyRuleMultiSelect|%{firstLabel} +%{numberOfAdditionalLabels} more"
+msgstr ""
+
+msgid "PolicyRuleMultiSelect|All %{itemTypeName}"
+msgstr ""
+
+msgid "PolicyRuleMultiSelect|Select %{itemTypeName}"
+msgstr ""
+
+msgid "PolicyRuleMultiSelect|Select all"
+msgstr ""
+
+msgid "Polling interval multiplier"
+msgstr ""
+
+msgid "Popularity"
+msgstr ""
+
+msgid "Port"
+msgstr ""
+
+msgid "Postman collection"
+msgstr ""
+
+msgid "Postman collection file path or URL"
+msgstr ""
+
+msgid "Potentially unwanted character detected: Unicode BiDi Control"
+msgstr ""
+
+msgid "Pre-defined push rules"
+msgstr ""
+
+msgid "Preferences"
+msgstr ""
+
+msgid "Preferences saved."
+msgstr ""
+
+msgid "Preferences|Behavior"
+msgstr ""
+
+msgid "Preferences|Choose between fixed (max. 1280px) and fluid (%{percentage}) application layout."
+msgstr ""
+
+msgid "Preferences|Choose what content you want to see on a project’s overview page."
+msgstr ""
+
+msgid "Preferences|Choose what content you want to see on your homepage."
+msgstr ""
+
+msgid "Preferences|Configure how dates and times display for you."
+msgstr ""
+
+msgid "Preferences|Customize integrations with third party services."
+msgstr ""
+
+msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
+msgstr ""
+
+msgid "Preferences|Display time in 24-hour format"
+msgstr ""
+
+msgid "Preferences|Enable Gitpod integration"
+msgstr ""
+
+msgid "Preferences|Enable integrated code intelligence on code views"
+msgstr ""
+
+msgid "Preferences|Failed to save preferences."
+msgstr ""
+
+msgid "Preferences|For example: 30 minutes ago."
+msgstr ""
+
+msgid "Preferences|Gitpod"
+msgstr ""
+
+msgid "Preferences|Homepage content"
+msgstr ""
+
+msgid "Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser."
+msgstr ""
+
+msgid "Preferences|Integrations"
+msgstr ""
+
+msgid "Preferences|Layout width"
+msgstr ""
+
+msgid "Preferences|Must be a number between %{min} and %{max}"
+msgstr ""
+
+msgid "Preferences|Navigation theme"
+msgstr ""
+
+msgid "Preferences|Project overview content"
+msgstr ""
+
+msgid "Preferences|Render whitespace characters in the Web IDE"
+msgstr ""
+
+msgid "Preferences|Show one file at a time on merge request's Changes tab"
+msgstr ""
+
+msgid "Preferences|Show whitespace changes in diffs"
+msgstr ""
+
+msgid "Preferences|Sourcegraph"
+msgstr ""
+
+msgid "Preferences|Surround text selection when typing quotes or brackets"
+msgstr ""
+
+msgid "Preferences|Syntax highlighting theme"
+msgstr ""
+
+msgid "Preferences|Tab width"
+msgstr ""
+
+msgid "Preferences|This feature is experimental and translations are not complete yet"
+msgstr ""
+
+msgid "Preferences|This setting allows you to customize the appearance of the syntax."
+msgstr ""
+
+msgid "Preferences|This setting allows you to customize the behavior of the system layout and default views."
+msgstr ""
+
+msgid "Preferences|Time preferences"
+msgstr ""
+
+msgid "Preferences|Use relative times"
+msgstr ""
+
+msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
+msgstr ""
+
+msgid "Preparing the report for the scan."
+msgstr ""
+
+msgid "Prev"
+msgstr ""
+
+msgid "Prevent adding new members to projects within this group"
+msgstr ""
+
+msgid "Prevent auto-stopping"
+msgstr ""
+
+msgid "Prevent editing approval rules in projects and merge requests."
+msgstr ""
+
+msgid "Prevent environment from auto-stopping"
+msgstr ""
+
+msgid "Prevent project forking outside current group"
+msgstr ""
+
+msgid "Prevent users from changing their profile name"
+msgstr ""
+
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
+msgstr ""
+
+msgid "Preview"
+msgstr ""
+
+msgid "Preview JavaScript projects in the Web IDE with CodeSandbox Live Preview. %{link_start}Learn more.%{link_end} "
+msgstr ""
+
+msgid "Preview Markdown"
+msgstr ""
+
+msgid "Preview changes"
+msgstr ""
+
+msgid "Preview payload"
+msgstr ""
+
+msgid "Previous Artifacts"
+msgstr ""
+
+msgid "Previous commit"
+msgstr ""
+
+msgid "Previous design"
+msgstr ""
+
+msgid "Previous file in diff"
+msgstr ""
+
+msgid "Previous unresolved discussion"
+msgstr ""
+
+msgid "Primary"
+msgstr ""
+
+msgid "Primary Action"
+msgstr ""
+
+msgid "Print codes"
+msgstr ""
+
+msgid "Prioritize"
+msgstr ""
+
+msgid "Prioritize label"
+msgstr ""
+
+msgid "Prioritized Labels"
+msgstr ""
+
+msgid "Prioritized label"
+msgstr ""
+
+msgid "Priority"
+msgstr ""
+
+msgid "Private"
+msgstr ""
+
+msgid "Private - Guest users are not allowed to view detailed release information like title and source code."
+msgstr ""
+
+msgid "Private - Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgstr ""
+
+msgid "Private - The group and its projects can only be viewed by members."
+msgstr ""
+
+msgid "Private group(s)"
+msgstr ""
+
+msgid "Private profile"
+msgstr ""
+
+msgid "Private projects Minutes cost factor"
+msgstr ""
+
+msgid "Private projects can be created in your personal namespace with:"
+msgstr ""
+
+msgid "Problem with %{name} command: %{message}."
+msgstr ""
+
+msgid "Proceed"
+msgstr ""
+
+msgid "Product Analytics"
+msgstr ""
+
+msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
+msgstr ""
+
+msgid "Productivity"
+msgstr ""
+
+msgid "Productivity Analytics"
+msgstr ""
+
+msgid "Productivity analytics can help identify the problems that are delaying your team"
+msgstr ""
+
+msgid "ProductivityAanalytics|Merge requests"
+msgstr ""
+
+msgid "ProductivityAanalytics|is earlier than the allowed minimum date"
+msgstr ""
+
+msgid "ProductivityAnalytics|Ascending"
+msgstr ""
+
+msgid "ProductivityAnalytics|Days"
+msgstr ""
+
+msgid "ProductivityAnalytics|Days to merge"
+msgstr ""
+
+msgid "ProductivityAnalytics|Descending"
+msgstr ""
+
+msgid "ProductivityAnalytics|Hours"
+msgstr ""
+
+msgid "ProductivityAnalytics|List"
+msgstr ""
+
+msgid "ProductivityAnalytics|Merge Requests"
+msgstr ""
+
+msgid "ProductivityAnalytics|Merge date"
+msgstr ""
+
+msgid "ProductivityAnalytics|Merge requests"
+msgstr ""
+
+msgid "ProductivityAnalytics|Time to merge"
+msgstr ""
+
+msgid "ProductivityAnalytics|Trendline"
+msgstr ""
+
+msgid "ProductivityAnalytics|is earlier than the given merged at after date"
+msgstr ""
+
+msgid "Profile"
+msgstr ""
+
+msgid "Profile Settings"
+msgstr ""
+
+msgid "Profile failed to delete"
+msgstr ""
+
+msgid "Profile image guideline"
+msgstr ""
+
+msgid "Profile page:"
+msgstr ""
+
+msgid "Profile parameter missing"
+msgstr ""
+
+msgid "ProfileSession|on"
+msgstr ""
+
+msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
+msgstr ""
+
+msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
+msgstr ""
+
+msgid "Profiles|%{provider} Active"
+msgstr ""
+
+msgid "Profiles|@username"
+msgstr ""
+
+msgid "Profiles|Account could not be deleted. GitLab was unable to verify your identity."
+msgstr ""
+
+msgid "Profiles|Account scheduled for removal."
+msgstr ""
+
+msgid "Profiles|Activate signin with one of the following services"
+msgstr ""
+
+msgid "Profiles|Active"
+msgstr ""
+
+msgid "Profiles|Add key"
+msgstr ""
+
+msgid "Profiles|Add status emoji"
+msgstr ""
+
+msgid "Profiles|An error occurred while updating your username, please try again."
+msgstr ""
+
+msgid "Profiles|An indicator appears next to your name and avatar"
+msgstr ""
+
+msgid "Profiles|Avatar cropper"
+msgstr ""
+
+msgid "Profiles|Avatar will be removed. Are you sure?"
+msgstr ""
+
+msgid "Profiles|Begins with %{ssh_key_algorithms}."
+msgstr ""
+
+msgid "Profiles|Bio"
+msgstr ""
+
+msgid "Profiles|Busy"
+msgstr ""
+
+msgid "Profiles|Change username"
+msgstr ""
+
+msgid "Profiles|Changing your username can have unintended side effects."
+msgstr ""
+
+msgid "Profiles|Choose file..."
+msgstr ""
+
+msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
+msgstr ""
+
+msgid "Profiles|City, country"
+msgstr ""
+
+msgid "Profiles|Clear status"
+msgstr ""
+
+msgid "Profiles|Commit email"
+msgstr ""
+
+msgid "Profiles|Connect %{provider}"
+msgstr ""
+
+msgid "Profiles|Connected Accounts"
+msgstr ""
+
+msgid "Profiles|Current path: %{path}"
+msgstr ""
+
+msgid "Profiles|Current status"
+msgstr ""
+
+msgid "Profiles|Default notification email"
+msgstr ""
+
+msgid "Profiles|Delete account"
+msgstr ""
+
+msgid "Profiles|Deleting an account has the following effects:"
+msgstr ""
+
+msgid "Profiles|Disconnect"
+msgstr ""
+
+msgid "Profiles|Disconnect %{provider}"
+msgstr ""
+
+msgid "Profiles|Do not show on profile"
+msgstr ""
+
+msgid "Profiles|Don't display activity-related personal information on your profile"
+msgstr ""
+
+msgid "Profiles|Edit Profile"
+msgstr ""
+
+msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
+msgstr ""
+
+msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
+msgstr ""
+
+msgid "Profiles|Enter your name, so people you know can recognize you"
+msgstr ""
+
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
+msgid "Profiles|Expiration date"
+msgstr ""
+
+msgid "Profiles|Expired key is not valid."
+msgstr ""
+
+msgid "Profiles|Expired:"
+msgstr ""
+
+msgid "Profiles|Expires:"
+msgstr ""
+
+msgid "Profiles|Feed token was successfully reset"
+msgstr ""
+
+msgid "Profiles|Full name"
+msgstr ""
+
+msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
+msgstr ""
+
+msgid "Profiles|If after setting a password, the option to delete your account is still not available, please email %{data_request} to begin the account deletion process."
+msgstr ""
+
+msgid "Profiles|Include private contributions on my profile"
+msgstr ""
+
+msgid "Profiles|Incoming email token was successfully reset"
+msgstr ""
+
+msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
+msgstr ""
+
+msgid "Profiles|Invalid key."
+msgstr ""
+
+msgid "Profiles|Invalid password"
+msgstr ""
+
+msgid "Profiles|Invalid username"
+msgstr ""
+
+msgid "Profiles|Job title"
+msgstr ""
+
+msgid "Profiles|Key"
+msgstr ""
+
+msgid "Profiles|Key becomes invalid on this date."
+msgstr ""
+
+msgid "Profiles|Key becomes invalid on this date. Maximum lifetime for SSH keys is %{max_ssh_key_lifetime} days"
+msgstr ""
+
+msgid "Profiles|Key can still be used after expiration."
+msgstr ""
+
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
+msgid "Profiles|Key usable beyond expiration date."
+msgstr ""
+
+msgid "Profiles|Last used:"
+msgstr ""
+
+msgid "Profiles|Learn more"
+msgstr ""
+
+msgid "Profiles|Location"
+msgstr ""
+
+msgid "Profiles|Made a private contribution"
+msgstr ""
+
+msgid "Profiles|Main settings"
+msgstr ""
+
+msgid "Profiles|Manage two-factor authentication"
+msgstr ""
+
+msgid "Profiles|No file chosen."
+msgstr ""
+
+msgid "Profiles|Notification email"
+msgstr ""
+
+msgid "Profiles|Organization"
+msgstr ""
+
+msgid "Profiles|Path"
+msgstr ""
+
+msgid "Profiles|Position and size your new avatar"
+msgstr ""
+
+msgid "Profiles|Primary email"
+msgstr ""
+
+msgid "Profiles|Private contributions"
+msgstr ""
+
+msgid "Profiles|Profile was successfully updated"
+msgstr ""
+
+msgid "Profiles|Pronouns"
+msgstr ""
+
+msgid "Profiles|Pronunciation"
+msgstr ""
+
+msgid "Profiles|Public avatar"
+msgstr ""
+
+msgid "Profiles|Public email"
+msgstr ""
+
+msgid "Profiles|Publicly visible private SSH keys can compromise your system."
+msgstr ""
+
+msgid "Profiles|Remove avatar"
+msgstr ""
+
+msgid "Profiles|Select a service to sign in with."
+msgstr ""
+
+msgid "Profiles|Set new profile picture"
+msgstr ""
+
+msgid "Profiles|Set your local time zone"
+msgstr ""
+
+msgid "Profiles|Social sign-in"
+msgstr ""
+
+msgid "Profiles|Some options are unavailable for LDAP accounts"
+msgstr ""
+
+msgid "Profiles|Static object token was successfully reset"
+msgstr ""
+
+msgid "Profiles|Tell us about yourself in fewer than 250 characters"
+msgstr ""
+
+msgid "Profiles|The ability to update your name has been disabled by your administrator."
+msgstr ""
+
+msgid "Profiles|The maximum file size allowed is 200KB."
+msgstr ""
+
+msgid "Profiles|This email will be displayed on your public profile"
+msgstr ""
+
+msgid "Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}"
+msgstr ""
+
+msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
+msgstr ""
+
+msgid "Profiles|This information will appear on your profile"
+msgstr ""
+
+msgid "Profiles|Time settings"
+msgstr ""
+
+msgid "Profiles|Title"
+msgstr ""
+
+msgid "Profiles|Two-Factor Authentication"
+msgstr ""
+
+msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr ""
+
+msgid "Profiles|Update profile settings"
+msgstr ""
+
+msgid "Profiles|Update username"
+msgstr ""
+
+msgid "Profiles|Upload new avatar"
+msgstr ""
+
+msgid "Profiles|Use a private email - %{email}"
+msgstr ""
+
+msgid "Profiles|User ID"
+msgstr ""
+
+msgid "Profiles|Username change failed - %{message}"
+msgstr ""
+
+msgid "Profiles|Username successfully changed"
+msgstr ""
+
+msgid "Profiles|Using emojis in names seems fun, but please try to set a status message instead"
+msgstr ""
+
+msgid "Profiles|Website url"
+msgstr ""
+
+msgid "Profiles|What's your status?"
+msgstr ""
+
+msgid "Profiles|Who you represent or work for"
+msgstr ""
+
+msgid "Profiles|You can change your avatar here"
+msgstr ""
+
+msgid "Profiles|You can change your avatar here or remove the current avatar to revert to %{gravatar_link}"
+msgstr ""
+
+msgid "Profiles|You can upload your avatar here"
+msgstr ""
+
+msgid "Profiles|You can upload your avatar here or change it at %{gravatar_link}"
+msgstr ""
+
+msgid "Profiles|You don't have access to delete this user."
+msgstr ""
+
+msgid "Profiles|You must accept the Terms of Service in order to perform this action."
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete groups you are an owner of before you can delete your account"
+msgstr ""
+
+msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
+msgstr ""
+
+msgid "Profiles|Your LinkedIn profile name from linkedin.com/in/profilename"
+msgstr ""
+
+msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr ""
+
+msgid "Profiles|Your email address was automatically set based on your %{provider_label} account"
+msgstr ""
+
+msgid "Profiles|Your location was automatically set based on your %{provider_label} account"
+msgstr ""
+
+msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
+msgstr ""
+
+msgid "Profiles|Your status"
+msgstr ""
+
+msgid "Profiles|https://website.com"
+msgstr ""
+
+msgid "Profiles|username"
+msgstr ""
+
+msgid "Profiles|your account"
+msgstr ""
+
+msgid "Profile|%{job_title} at %{organization}"
+msgstr ""
+
+msgid "Profiling - Performance bar"
+msgstr ""
+
+msgid "Programming languages used in this repository"
+msgstr ""
+
+msgid "Progress"
+msgstr ""
+
+msgid "Progress tracking"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
+msgid "Project \"%{name}\" is no longer available. Select another project to continue."
+msgstr ""
+
+msgid "Project %{project_repo} could not be found"
+msgstr ""
+
+msgid "Project & Group can not be assigned at the same time"
+msgstr ""
+
+msgid "Project '%{project_name}' is being imported."
+msgstr ""
+
+msgid "Project '%{project_name}' is in the process of being deleted."
+msgstr ""
+
+msgid "Project '%{project_name}' is restored."
+msgstr ""
+
+msgid "Project '%{project_name}' queued for deletion."
+msgstr ""
+
+msgid "Project '%{project_name}' was successfully created."
+msgstr ""
+
+msgid "Project '%{project_name}' was successfully updated."
+msgstr ""
+
+msgid "Project '%{project_name}' will be deleted on %{date}"
+msgstr ""
+
+msgid "Project Access Tokens"
+msgstr ""
+
+msgid "Project Badges"
+msgstr ""
+
+msgid "Project Files"
+msgstr ""
+
+msgid "Project ID"
+msgstr ""
+
+msgid "Project Templates"
+msgstr ""
+
+msgid "Project URL"
+msgstr ""
+
+msgid "Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
+msgstr ""
+
+msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Project already deleted"
+msgstr ""
+
+msgid "Project and wiki repositories"
+msgstr ""
+
+msgid "Project audit events"
+msgstr ""
+
+msgid "Project avatar"
+msgstr ""
+
+msgid "Project cannot be shared with the group it is in or one of its ancestors."
+msgstr ""
+
+msgid "Project configuration, excluding integrations"
+msgstr ""
+
+msgid "Project description (optional)"
+msgstr ""
+
+msgid "Project does not exist or you don't have permission to perform this action"
+msgstr ""
+
+msgid "Project does not have a policy configuration"
+msgstr ""
+
+msgid "Project export could not be deleted."
+msgstr ""
+
+msgid "Project export download requests"
+msgstr ""
+
+msgid "Project export enabled"
+msgstr ""
+
+msgid "Project export has been deleted."
+msgstr ""
+
+msgid "Project export link has expired. Please generate a new export from your project settings."
+msgstr ""
+
+msgid "Project export requests"
+msgstr ""
+
+msgid "Project export started. A download link will be sent by email and made available on this page."
+msgstr ""
+
+msgid "Project has too many %{label_for_message} to search"
+msgstr ""
+
+msgid "Project import requests"
+msgstr ""
+
+msgid "Project info:"
+msgstr ""
+
+msgid "Project information"
+msgstr ""
+
+msgid "Project is required when cluster_type is :project"
+msgstr ""
+
+msgid "Project members"
+msgstr ""
+
+msgid "Project milestone"
+msgstr ""
+
+msgid "Project name"
+msgstr ""
+
+msgid "Project navigation"
+msgstr ""
+
+msgid "Project order will not be saved as local storage is not available."
+msgstr ""
+
+msgid "Project path"
+msgstr ""
+
+msgid "Project security status"
+msgstr ""
+
+msgid "Project security status help page"
+msgstr ""
+
+msgid "Project slug"
+msgstr ""
+
+msgid "Project uploads"
+msgstr ""
+
+msgid "Project visibility level will be changed to match namespace rules when transferring to a group."
+msgstr ""
+
+msgid "Project was not found or you do not have permission to add this project to Security Dashboards."
+msgstr ""
+
+msgid "Project: %{name}"
+msgstr ""
+
+msgid "ProjectActivityRSS|Subscribe"
+msgstr ""
+
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
+msgid "ProjectFileTree|Name"
+msgstr ""
+
+msgid "ProjectFileTree|Show more"
+msgstr ""
+
+msgid "ProjectLastActivity|Never"
+msgstr ""
+
+msgid "ProjectOverview|Fork"
+msgstr ""
+
+msgid "ProjectOverview|Forks"
+msgstr ""
+
+msgid "ProjectOverview|Go to your fork"
+msgstr ""
+
+msgid "ProjectOverview|Star"
+msgstr ""
+
+msgid "ProjectOverview|Starrer"
+msgstr ""
+
+msgid "ProjectOverview|Starrers"
+msgstr ""
+
+msgid "ProjectOverview|Unstar"
+msgstr ""
+
+msgid "ProjectOverview|You don't have permission to fork this project"
+msgstr ""
+
+msgid "ProjectOverview|You have reached your project limit"
+msgstr ""
+
+msgid "ProjectOverview|You must sign in to star a project"
+msgstr ""
+
+msgid "ProjectPage|Copy project ID"
+msgstr ""
+
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectQualitySummary|An error occurred while trying to fetch project quality statistics"
+msgstr ""
+
+msgid "ProjectQualitySummary|Coverage"
+msgstr ""
+
+msgid "ProjectQualitySummary|Failure"
+msgstr ""
+
+msgid "ProjectQualitySummary|Get insight into the overall percentage of tests in your project that succeed, fail and are skipped."
+msgstr ""
+
+msgid "ProjectQualitySummary|Latest pipeline results"
+msgstr ""
+
+msgid "ProjectQualitySummary|Learn more about test coverage"
+msgstr ""
+
+msgid "ProjectQualitySummary|Learn more about test reports"
+msgstr ""
+
+msgid "ProjectQualitySummary|Measure of how much of your code is covered by tests."
+msgstr ""
+
+msgid "ProjectQualitySummary|See full report"
+msgstr ""
+
+msgid "ProjectQualitySummary|See project Code Coverage Statistics"
+msgstr ""
+
+msgid "ProjectQualitySummary|Set up test runs"
+msgstr ""
+
+msgid "ProjectQualitySummary|Set up test runs (opens in a new tab)"
+msgstr ""
+
+msgid "ProjectQualitySummary|Skipped"
+msgstr ""
+
+msgid "ProjectQualitySummary|Success"
+msgstr ""
+
+msgid "ProjectQualitySummary|Test coverage"
+msgstr ""
+
+msgid "ProjectQualitySummary|Test runs"
+msgstr ""
+
+msgid "ProjectQualitySummary|The percentage of tests that succeed, fail, or are skipped."
+msgstr ""
+
+msgid "ProjectSelect| or group"
+msgstr ""
+
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
+msgid "ProjectSelect|Search for project"
+msgstr ""
+
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
+msgid "ProjectService|Drone server URL"
+msgstr ""
+
+msgid "ProjectService|Enter new API key"
+msgstr ""
+
+msgid "ProjectService|Enter new password"
+msgstr ""
+
+msgid "ProjectService|Enter new password."
+msgstr ""
+
+msgid "ProjectService|Enter new token"
+msgstr ""
+
+msgid "ProjectService|Issue URL"
+msgstr ""
+
+msgid "ProjectService|Jenkins server URL"
+msgstr ""
+
+msgid "ProjectService|Leave blank to use your current API key"
+msgstr ""
+
+msgid "ProjectService|Leave blank to use your current password"
+msgstr ""
+
+msgid "ProjectService|Leave blank to use your current password."
+msgstr ""
+
+msgid "ProjectService|Leave blank to use your current token."
+msgstr ""
+
+msgid "ProjectService|Mock service URL"
+msgstr ""
+
+msgid "ProjectService|Must have permission to trigger a manual build in TeamCity."
+msgstr ""
+
+msgid "ProjectService|Perform common operations on GitLab project: %{project_name}"
+msgstr ""
+
+msgid "ProjectService|Run CI/CD pipelines with Buildkite."
+msgstr ""
+
+msgid "ProjectService|Run CI/CD pipelines with Drone."
+msgstr ""
+
+msgid "ProjectService|Run CI/CD pipelines with JetBrains TeamCity."
+msgstr ""
+
+msgid "ProjectService|TeamCity server URL"
+msgstr ""
+
+msgid "ProjectService|The build configuration ID of the TeamCity project."
+msgstr ""
+
+msgid "ProjectService|The token you get after you create a Buildkite pipeline with a GitLab repository."
+msgstr ""
+
+msgid "ProjectService|To configure this integration, you should:"
+msgstr ""
+
+msgid "ProjectService|Token for the Drone project."
+msgstr ""
+
+msgid "ProjectService|Trigger event for new comments on confidential issues."
+msgstr ""
+
+msgid "ProjectService|Trigger event for new comments."
+msgstr ""
+
+msgid "ProjectService|Trigger event for new tags pushed to the repository."
+msgstr ""
+
+msgid "ProjectService|Trigger event for pushes to the repository."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a commit is created or updated."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a confidential issue is created, updated, or closed."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a deployment starts or finishes."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a merge request is created, updated, or merged."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a new, unique alert is recorded."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
+msgid "ProjectService|Trigger event when a pipeline status changes."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a wiki page is created or updated."
+msgstr ""
+
+msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
+msgstr ""
+
+msgid "ProjectSettings|%{link_start}What are description templates?%{link_end}"
+msgstr ""
+
+msgid "ProjectSettings|%{link_start}What variables can I use?%{link_end}"
+msgstr ""
+
+msgid "ProjectSettings|Additional settings that influence how and when merges are done."
+msgstr ""
+
+msgid "ProjectSettings|All discussions must be resolved"
+msgstr ""
+
+msgid "ProjectSettings|Allow"
+msgstr ""
+
+msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
+msgstr ""
+
+msgid "ProjectSettings|Analytics"
+msgstr ""
+
+msgid "ProjectSettings|Automatically resolve merge request diff discussions when they become outdated"
+msgstr ""
+
+msgid "ProjectSettings|Badges"
+msgstr ""
+
+msgid "ProjectSettings|Build, test, and deploy your changes."
+msgstr ""
+
+msgid "ProjectSettings|Checkbox is visible and selected by default."
+msgstr ""
+
+msgid "ProjectSettings|Checkbox is visible and unselected by default."
+msgstr ""
+
+msgid "ProjectSettings|Choose the method, options, checks, and squash options for merge requests. You can also set up merge request templates for different actions."
+msgstr ""
+
+msgid "ProjectSettings|Choose your merge method, merge options, merge checks, and merge suggestions."
+msgstr ""
+
+msgid "ProjectSettings|Choose your merge method, options, checks, and squash options."
+msgstr ""
+
+msgid "ProjectSettings|Configure your project resources and monitor their health."
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Container registry"
+msgstr ""
+
+msgid "ProjectSettings|Customize this project's badges."
+msgstr ""
+
+msgid "ProjectSettings|Determine what happens to the commit history when you merge a merge request."
+msgstr ""
+
+msgid "ProjectSettings|Disable email notifications"
+msgstr ""
+
+msgid "ProjectSettings|Do not allow"
+msgstr ""
+
+msgid "ProjectSettings|Enable \"Delete source branch\" option by default"
+msgstr ""
+
+msgid "ProjectSettings|Enable merge trains"
+msgstr ""
+
+msgid "ProjectSettings|Enable merged results pipelines"
+msgstr ""
+
+msgid "ProjectSettings|Encourage"
+msgstr ""
+
+msgid "ProjectSettings|Every merge creates a merge commit."
+msgstr ""
+
+msgid "ProjectSettings|Every project can have its own space to store its Docker images"
+msgstr ""
+
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
+msgstr ""
+
+msgid "ProjectSettings|Everyone"
+msgstr ""
+
+msgid "ProjectSettings|Existing merge requests and protected branches are not affected."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Fast-forward merge"
+msgstr ""
+
+msgid "ProjectSettings|Fast-forward merges only."
+msgstr ""
+
+msgid "ProjectSettings|Flexible tool to collaboratively develop ideas and plan work in this project."
+msgstr ""
+
+msgid "ProjectSettings|Forks"
+msgstr ""
+
+msgid "ProjectSettings|Git Large File Storage (LFS)"
+msgstr ""
+
+msgid "ProjectSettings|Global"
+msgstr ""
+
+msgid "ProjectSettings|Highlight the usage of hidden unicode characters. These have innocent uses for right-to-left languages, but can also be used in potential exploits."
+msgstr ""
+
+msgid "ProjectSettings|Housekeeping, export, archive, change path, transfer, and delete."
+msgstr ""
+
+msgid "ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts."
+msgstr ""
+
+msgid "ProjectSettings|Internal"
+msgstr ""
+
+msgid "ProjectSettings|Introduces the risk of merging changes that do not pass the pipeline."
+msgstr ""
+
+msgid "ProjectSettings|Issues"
+msgstr ""
+
+msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
+msgstr ""
+
+msgid "ProjectSettings|Learn about commit history."
+msgstr ""
+
+msgid "ProjectSettings|Leave empty to use default template."
+msgstr ""
+
+msgid "ProjectSettings|Manage who can see the project in the public access directory."
+msgstr ""
+
+msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
+msgstr ""
+
+msgid "ProjectSettings|Maximum %{maxLength} characters."
+msgstr ""
+
+msgid "ProjectSettings|Merge checks"
+msgstr ""
+
+msgid "ProjectSettings|Merge commit"
+msgstr ""
+
+msgid "ProjectSettings|Merge commit message template"
+msgstr ""
+
+msgid "ProjectSettings|Merge commit with semi-linear history"
+msgstr ""
+
+msgid "ProjectSettings|Merge method"
+msgstr ""
+
+msgid "ProjectSettings|Merge options"
+msgstr ""
+
+msgid "ProjectSettings|Merge requests"
+msgstr ""
+
+msgid "ProjectSettings|Merge requests approved for merge are queued, and pipelines validate the combined results of the source and target branches before merge. %{link_start}What are merge trains?%{link_end}"
+msgstr ""
+
+msgid "ProjectSettings|Merge requests can't be merged if the latest pipeline did not succeed or is still running."
+msgstr ""
+
+msgid "ProjectSettings|Merge suggestions"
+msgstr ""
+
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
+msgid "ProjectSettings|No merge commits are created."
+msgstr ""
+
+msgid "ProjectSettings|Note: The container registry is always visible when a project is public and the container registry is set to '%{access_level_description}'"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|Operations"
+msgstr ""
+
+msgid "ProjectSettings|Override user notification preferences for all project members."
+msgstr ""
+
+msgid "ProjectSettings|Packages"
+msgstr ""
+
+msgid "ProjectSettings|Pages"
+msgstr ""
+
+msgid "ProjectSettings|Pages for project documentation."
+msgstr ""
+
+msgid "ProjectSettings|Pipelines must succeed"
+msgstr ""
+
+msgid "ProjectSettings|Private"
+msgstr ""
+
+msgid "ProjectSettings|Project visibility"
+msgstr ""
+
+msgid "ProjectSettings|Public"
+msgstr ""
+
+msgid "ProjectSettings|Repository"
+msgstr ""
+
+msgid "ProjectSettings|Require"
+msgstr ""
+
+msgid "ProjectSettings|Require an associated issue from Jira"
+msgstr ""
+
+msgid "ProjectSettings|Requirements"
+msgstr ""
+
+msgid "ProjectSettings|Requirements management system."
+msgstr ""
+
+msgid "ProjectSettings|Search for topic"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance"
+msgstr ""
+
+msgid "ProjectSettings|Security & Compliance for this project"
+msgstr ""
+
+msgid "ProjectSettings|Set the default behavior of this option in merge requests. Changes to this are also applied to existing merge requests."
+msgstr ""
+
+msgid "ProjectSettings|Share code with others outside the project."
+msgstr ""
+
+msgid "ProjectSettings|Show default award emojis"
+msgstr ""
+
+msgid "ProjectSettings|Show link to create or view a merge request when pushing from the command line"
+msgstr ""
+
+msgid "ProjectSettings|Skipped pipelines are considered successful"
+msgstr ""
+
+msgid "ProjectSettings|Snippets"
+msgstr ""
+
+msgid "ProjectSettings|Squash commit message template"
+msgstr ""
+
+msgid "ProjectSettings|Squash commits when merging"
+msgstr ""
+
+msgid "ProjectSettings|Squashing is always performed. Checkbox is visible and selected, and users cannot change it."
+msgstr ""
+
+msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
+msgstr ""
+
+msgid "ProjectSettings|Submit changes to be merged upstream."
+msgstr ""
+
+msgid "ProjectSettings|Target project"
+msgstr ""
+
+msgid "ProjectSettings|The commit message used when applying merge request suggestions."
+msgstr ""
+
+msgid "ProjectSettings|The commit message used when merging, if the merge method creates a merge commit."
+msgstr ""
+
+msgid "ProjectSettings|The commit message used when squashing commits."
+msgstr ""
+
+msgid "ProjectSettings|The default target project for merge requests created in this fork project."
+msgstr ""
+
+msgid "ProjectSettings|The default template will be applied on save."
+msgstr ""
+
+msgid "ProjectSettings|These checks must pass before merge requests can be merged."
+msgstr ""
+
+msgid "ProjectSettings|This project"
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Transfer project"
+msgstr ""
+
+msgid "ProjectSettings|Upstream project"
+msgstr ""
+
+msgid "ProjectSettings|Used for every new merge request."
+msgstr ""
+
+msgid "ProjectSettings|Users can copy the repository to a new project."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
+msgid "ProjectSettings|Users can request access"
+msgstr ""
+
+msgid "ProjectSettings|View and edit files in this project."
+msgstr ""
+
+msgid "ProjectSettings|View and edit files in this project. Non-project members have only read access."
+msgstr ""
+
+msgid "ProjectSettings|View project analytics."
+msgstr ""
+
+msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
+msgstr ""
+
+msgid "ProjectSettings|Visualize the project's performance metrics."
+msgstr ""
+
+msgid "ProjectSettings|Warn about Potentially Unwanted Characters"
+msgstr ""
+
+msgid "ProjectSettings|What are badges?"
+msgstr ""
+
+msgid "ProjectSettings|What are merge trains?"
+msgstr ""
+
+msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
+msgstr ""
+
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
+msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
+msgstr ""
+
+msgid "ProjectSettings|Wiki"
+msgstr ""
+
+msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
+msgstr ""
+
+msgid "ProjectTemplates|.NET Core"
+msgstr ""
+
+msgid "ProjectTemplates|Android"
+msgstr ""
+
+msgid "ProjectTemplates|GitLab Cluster Management"
+msgstr ""
+
+msgid "ProjectTemplates|Gitpod/Spring Petclinic"
+msgstr ""
+
+msgid "ProjectTemplates|Go Micro"
+msgstr ""
+
+msgid "ProjectTemplates|HIPAA Audit Protocol"
+msgstr ""
+
+msgid "ProjectTemplates|Kotlin Native for Linux"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/GitBook"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/Hexo"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/Hugo"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/Jekyll"
+msgstr ""
+
+msgid "ProjectTemplates|Netlify/Plain HTML"
+msgstr ""
+
+msgid "ProjectTemplates|NodeJS Express"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Gatsby"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/GitBook"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Hexo"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Hugo"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Jekyll"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
+msgid "ProjectTemplates|Pages/Plain HTML"
+msgstr ""
+
+msgid "ProjectTemplates|Ruby on Rails"
+msgstr ""
+
+msgid "ProjectTemplates|SalesforceDX"
+msgstr ""
+
+msgid "ProjectTemplates|Sample GitLab Project"
+msgstr ""
+
+msgid "ProjectTemplates|Serverless Framework/JS"
+msgstr ""
+
+msgid "ProjectTemplates|Spring"
+msgstr ""
+
+msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
+msgstr ""
+
+msgid "ProjectTemplates|iOS (Swift)"
+msgstr ""
+
+msgid "ProjectView|Activity"
+msgstr ""
+
+msgid "ProjectView|Files and Readme (default)"
+msgstr ""
+
+msgid "ProjectView|Readme"
+msgstr ""
+
+msgid "Projects"
+msgstr ""
+
+msgid "Projects (%{count})"
+msgstr ""
+
+msgid "Projects Successfully Retrieved"
+msgstr ""
+
+msgid "Projects are graded based on the highest severity vulnerability present"
+msgstr ""
+
+msgid "Projects are organized into groups"
+msgstr ""
+
+msgid "Projects are where you store your code, access issues, wiki and other features of GitLab."
+msgstr ""
+
+msgid "Projects contributed to"
+msgstr ""
+
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
+msgid "Projects that can be accessed"
+msgstr ""
+
+msgid "Projects to index"
+msgstr ""
+
+msgid "Projects with critical vulnerabilities"
+msgstr ""
+
+msgid "Projects with high or unknown vulnerabilities"
+msgstr ""
+
+msgid "Projects with low vulnerabilities"
+msgstr ""
+
+msgid "Projects with medium vulnerabilities"
+msgstr ""
+
+msgid "Projects with no vulnerabilities and security scanning enabled"
+msgstr ""
+
+msgid "Projects with this topic"
+msgstr ""
+
+msgid "Projects with write access"
+msgstr ""
+
+msgid "ProjectsDropdown|Frequently visited"
+msgstr ""
+
+msgid "ProjectsDropdown|Loading projects"
+msgstr ""
+
+msgid "ProjectsDropdown|Projects you visit often will appear here"
+msgstr ""
+
+msgid "ProjectsDropdown|Search your projects"
+msgstr ""
+
+msgid "ProjectsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "ProjectsDropdown|Sorry, no projects matched your search"
+msgstr ""
+
+msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
+msgid "ProjectsNew|Allows you to immediately clone this project’s repository. Skip this if you plan to push up an existing repository."
+msgstr ""
+
+msgid "ProjectsNew|Analyze your source code for known security vulnerabilities."
+msgstr ""
+
+msgid "ProjectsNew|Connect your external repository to GitLab CI/CD."
+msgstr ""
+
+msgid "ProjectsNew|Contact an administrator to enable options for importing your project."
+msgstr ""
+
+msgid "ProjectsNew|Create"
+msgstr ""
+
+msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
+msgstr ""
+
+msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
+msgstr ""
+
+msgid "ProjectsNew|Create blank project"
+msgstr ""
+
+msgid "ProjectsNew|Create from template"
+msgstr ""
+
+msgid "ProjectsNew|Create new project"
+msgstr ""
+
+msgid "ProjectsNew|Description format"
+msgstr ""
+
+msgid "ProjectsNew|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "ProjectsNew|Import"
+msgstr ""
+
+msgid "ProjectsNew|Import project"
+msgstr ""
+
+msgid "ProjectsNew|Include a Getting Started README"
+msgstr ""
+
+msgid "ProjectsNew|Initialize repository with a README"
+msgstr ""
+
+msgid "ProjectsNew|Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab."
+msgstr ""
+
+msgid "ProjectsNew|No import options available"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
+msgid "ProjectsNew|Project Configuration"
+msgstr ""
+
+msgid "ProjectsNew|Project description %{tag_start}(optional)%{tag_end}"
+msgstr ""
+
+msgid "ProjectsNew|Recommended if you're new to GitLab"
+msgstr ""
+
+msgid "ProjectsNew|Run CI/CD for external repository"
+msgstr ""
+
+msgid "ProjectsNew|Visibility Level"
+msgstr ""
+
+msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
+msgstr ""
+
+msgid "Prometheus"
+msgstr ""
+
+msgid "PrometheusAlerts|exceeded"
+msgstr ""
+
+msgid "PrometheusAlerts|is equal to"
+msgstr ""
+
+msgid "PrometheusAlerts|is less than"
+msgstr ""
+
+msgid "PrometheusService|%{exporters} with %{metrics} were found"
+msgstr ""
+
+msgid "PrometheusService|Active"
+msgstr ""
+
+msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
+msgstr ""
+
+msgid "PrometheusService|Common metrics"
+msgstr ""
+
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
+msgid "PrometheusService|Custom metrics require Prometheus installed on a cluster with environment scope \"*\" OR a manually configured Prometheus to be available."
+msgstr ""
+
+msgid "PrometheusService|Enable Prometheus to define custom metrics, using either option above"
+msgstr ""
+
+msgid "PrometheusService|Finding and configuring metrics..."
+msgstr ""
+
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
+msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
+msgstr ""
+
+msgid "PrometheusService|Manage clusters"
+msgstr ""
+
+msgid "PrometheusService|Manual configuration"
+msgstr ""
+
+msgid "PrometheusService|Metrics"
+msgstr ""
+
+msgid "PrometheusService|Missing environment variable"
+msgstr ""
+
+msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
+msgstr ""
+
+msgid "PrometheusService|More information"
+msgstr ""
+
+msgid "PrometheusService|New metric"
+msgstr ""
+
+msgid "PrometheusService|No %{docsUrlStart}common metrics%{docsUrlEnd} were found"
+msgstr ""
+
+msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
+msgstr ""
+
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgstr ""
+
+msgid "PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
+msgid "PrometheusService|The Prometheus API base URL."
+msgstr ""
+
+msgid "PrometheusService|The contents of the credentials.json file of your service account."
+msgstr ""
+
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
+msgstr ""
+
+msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
+msgstr ""
+
+msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page have been deprecated."
+msgstr ""
+
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
+msgid "PrometheusService|https://prometheus.example.com/"
+msgstr ""
+
+msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
+msgstr ""
+
+msgid "Promote"
+msgstr ""
+
+msgid "Promote issue to an epic"
+msgstr ""
+
+msgid "Promote issue to incident"
+msgstr ""
+
+msgid "Promote to epic"
+msgstr ""
+
+msgid "Promote to group label"
+msgstr ""
+
+msgid "PromoteMilestone|Only project milestones can be promoted."
+msgstr ""
+
+msgid "PromoteMilestone|Project does not belong to a group."
+msgstr ""
+
+msgid "PromoteMilestone|Promotion failed - %{message}"
+msgstr ""
+
+msgid "Promoted issue to an epic."
+msgstr ""
+
+msgid "Promotes issue to incident"
+msgstr ""
+
+msgid "Promotion is not supported."
+msgstr ""
+
+msgid "Promotions|Add %{link_start} description templates %{link_end} to help your contributors to communicate effectively!"
+msgstr ""
+
+msgid "Promotions|Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Better Protected Branches"
+msgstr ""
+
+msgid "Promotions|Burndown Charts are visual representations of the progress of completing a milestone. At a glance, you see the current state for the completion a given milestone. Without them, you would have to organize the data from the milestone and plot it yourself to have the same sense of progress."
+msgstr ""
+
+msgid "Promotions|Buy EE"
+msgstr ""
+
+msgid "Promotions|Buy GitLab Enterprise Edition"
+msgstr ""
+
+msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
+msgstr ""
+
+msgid "Promotions|Contact owner %{link_start}%{owner_name}%{link_end} to upgrade the plan."
+msgstr ""
+
+msgid "Promotions|Contact your Administrator to upgrade your license."
+msgstr ""
+
+msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Promotions|Dismiss burndown charts promotion"
+msgstr ""
+
+msgid "Promotions|Dismiss repository features promotion"
+msgstr ""
+
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Improve merge requests and customer support with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Improve milestones with Burndown Charts."
+msgstr ""
+
+msgid "Promotions|Improve repositories with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Improve search with Advanced Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Promotions|Keep track of events in your project"
+msgstr ""
+
+msgid "Promotions|Learn more"
+msgstr ""
+
+msgid "Promotions|Merge request approvals"
+msgstr ""
+
+msgid "Promotions|Not now, thanks!"
+msgstr ""
+
+msgid "Promotions|Push Rules"
+msgstr ""
+
+msgid "Promotions|Push Rules are defined per project so you can have different rules applied to different projects depends on your needs."
+msgstr ""
+
+msgid "Promotions|Repository Mirroring"
+msgstr ""
+
+msgid "Promotions|Repository Mirroring is a way to mirror repositories from external sources. It can be used to mirror all branches, tags, and commits that you have in your repository."
+msgstr ""
+
+msgid "Promotions|See the other features in the %{subscription_link_start}Premium plan%{subscription_link_end}"
+msgstr ""
+
+msgid "Promotions|Set the number of necessary approvals and define a list of approvers needed for every merge request in a project."
+msgstr ""
+
+msgid "Promotions|Start GitLab Ultimate trial"
+msgstr ""
+
+msgid "Promotions|The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Try it for free"
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to activate Advanced Search."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to activate Audit Events."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to improve merge requests."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to improve milestones with Burndown Charts."
+msgstr ""
+
+msgid "Promotions|Upgrade your plan to improve repositories."
+msgstr ""
+
+msgid "Promotions|Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Promotions|Weight"
+msgstr ""
+
+msgid "Promotions|Weighting your issue"
+msgstr ""
+
+msgid "Promotions|When you have a lot of issues, it can be hard to get an overview. By adding a weight to your issues, you can get a better idea of the effort, cost, required time, or value of each, and so better manage them."
+msgstr ""
+
+msgid "Promotions|You can restrict access to protected branches by choosing a role (Maintainers, Developers) as well as certain users."
+msgstr ""
+
+msgid "Promotions|description templates"
+msgstr ""
+
+msgid "Promotions|to help your contributors communicate effectively!"
+msgstr ""
+
+msgid "Prompt users to upload SSH keys"
+msgstr ""
+
+msgid "Protect"
+msgstr ""
+
+msgid "Protect a tag"
+msgstr ""
+
+msgid "Protect variable"
+msgstr ""
+
+msgid "Protected"
+msgstr ""
+
+msgid "Protected Branch"
+msgstr ""
+
+msgid "Protected Branches"
+msgstr ""
+
+msgid "Protected Environment"
+msgstr ""
+
+msgid "Protected Paths: requests"
+msgstr ""
+
+msgid "Protected Tag"
+msgstr ""
+
+msgid "Protected Tags"
+msgstr ""
+
+msgid "Protected branches"
+msgstr ""
+
+msgid "Protected environments"
+msgstr ""
+
+msgid "Protected paths"
+msgstr ""
+
+msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to merge"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to merge:"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to push:"
+msgstr ""
+
+msgid "ProtectedBranch|Branch"
+msgstr ""
+
+msgid "ProtectedBranch|Branch will be writable for developers. Are you sure?"
+msgstr ""
+
+msgid "ProtectedBranch|Branch:"
+msgstr ""
+
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
+msgid "ProtectedBranch|Code owner approval"
+msgstr ""
+
+msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
+msgstr ""
+
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
+msgid "ProtectedBranch|Protect"
+msgstr ""
+
+msgid "ProtectedBranch|Protect a branch"
+msgstr ""
+
+msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
+msgstr ""
+
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
+msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
+msgstr ""
+
+msgid "ProtectedBranch|Require approval from code owners:"
+msgstr ""
+
+msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
+msgstr ""
+
+msgid "ProtectedBranch|Toggle allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Toggle code owner approval"
+msgstr ""
+
+msgid "ProtectedBranch|Unprotect"
+msgstr ""
+
+msgid "ProtectedBranch|Unprotect branch"
+msgstr ""
+
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
+msgid "ProtectedBranch|default"
+msgstr ""
+
+msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
+msgstr ""
+
+msgid "ProtectedEnvironment|Allowed to deploy"
+msgstr ""
+
+msgid "ProtectedEnvironment|Environment"
+msgstr ""
+
+msgid "ProtectedEnvironment|Only specified users can execute deployments in a protected environment."
+msgstr ""
+
+msgid "ProtectedEnvironment|Protect"
+msgstr ""
+
+msgid "ProtectedEnvironment|Protect an environment"
+msgstr ""
+
+msgid "ProtectedEnvironment|Protected Environment (%{protected_environments_count})"
+msgstr ""
+
+msgid "ProtectedEnvironment|Required approvals"
+msgstr ""
+
+msgid "ProtectedEnvironment|Select an environment"
+msgstr ""
+
+msgid "ProtectedEnvironment|Select users"
+msgstr ""
+
+msgid "ProtectedEnvironment|There are currently no protected environments. Protect an environment with this form."
+msgstr ""
+
+msgid "ProtectedEnvironment|Unprotect"
+msgstr ""
+
+msgid "ProtectedEnvironment|Your environment can't be unprotected"
+msgstr ""
+
+msgid "ProtectedEnvironment|Your environment has been protected."
+msgstr ""
+
+msgid "ProtectedEnvironment|Your environment has been unprotected"
+msgstr ""
+
+msgid "ProtectedTags|Unprotect tag"
+msgstr ""
+
+msgid "ProtectedTags|default"
+msgstr ""
+
+msgid "ProtectedTag|By default, protected tags restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "ProtectedTag|default"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgstr ""
+
+msgid "Provide a number our sales team can use to call you."
+msgstr ""
+
+msgid "Provider"
+msgstr ""
+
+msgid "Provision instructions"
+msgstr ""
+
+msgid "Provisioned by:"
+msgstr ""
+
+msgid "Proxy support for this API is not available currently"
+msgstr ""
+
+msgid "Pseudonymized data collection is disabled. When enabled, GitLab runs a background job to export pseudonymized CSVs of the GitLab database. The CSV files are then uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "Pseudonymizer data collection"
+msgstr ""
+
+msgid "Public"
+msgstr ""
+
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "Public - The project can be accessed without any authentication."
+msgstr ""
+
+msgid "Public Access Help"
+msgstr ""
+
+msgid "Public deploy keys"
+msgstr ""
+
+msgid "Public pipelines"
+msgstr ""
+
+msgid "Public projects Minutes cost factor"
+msgstr ""
+
+msgid "Public projects are an easy way to allow everyone to have read-only access."
+msgstr ""
+
+msgid "Publish to status page"
+msgstr ""
+
+msgid "Published"
+msgstr ""
+
+msgid "Published on status page"
+msgstr ""
+
+msgid "Publishes this issue to the associated status page."
+msgstr ""
+
+msgid "Pull"
+msgstr ""
+
+msgid "Pull requests from fork are not supported"
+msgstr ""
+
+msgid "Puma is running with a thread count above 1 and the Rugged service is enabled. This may decrease performance in some environments. See our %{link_start}documentation%{link_end} for details of this issue."
+msgstr ""
+
+msgid "Purchase more minutes"
+msgstr ""
+
+msgid "Purchase more storage"
+msgstr ""
+
+msgid "PurchaseStep|An error occurred in the purchase step. If the problem persists please contact support at https://support.gitlab.com."
+msgstr ""
+
+msgid "Push"
+msgstr ""
+
+msgid "Push Rule updated successfully."
+msgstr ""
+
+msgid "Push Rules"
+msgstr ""
+
+msgid "Push Rules updated successfully."
+msgstr ""
+
+msgid "Push an existing Git repository"
+msgstr ""
+
+msgid "Push an existing folder"
+msgstr ""
+
+msgid "Push commits to the source branch or add previously merged commits to review them."
+msgstr ""
+
+msgid "Push events"
+msgstr ""
+
+msgid "Push project from command line"
+msgstr ""
+
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
+msgstr ""
+
+msgid "Push to create a project"
+msgstr ""
+
+msgid "PushRules|All branch names must match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any branch name is allowed."
+msgstr ""
+
+msgid "PushRules|All commit author's email must match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any email is allowed."
+msgstr ""
+
+msgid "PushRules|All commit messages must match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, commit messages are not required to match any expression."
+msgstr ""
+
+msgid "PushRules|All committed filenames cannot match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, any filename is allowed."
+msgstr ""
+
+msgid "PushRules|Commit messages cannot match this %{wiki_syntax_link_start}regular expression%{wiki_syntax_link_end}. If empty, commit messages are not rejected based on any expression."
+msgstr ""
+
+msgid "PushRules|Do not allow users to remove Git tags with %{code_block_start}git push%{code_block_end}"
+msgstr ""
+
+msgid "PushRules|Reject any files likely to contain secrets. %{secret_files_link_start}What secret files are rejected?%{secret_files_link_end}"
+msgstr ""
+
+msgid "PushRules|Reject file sizes equal to or greater than this size. If set to 0, files of any size are allowed. This rule does not apply to files tracked by Git LFS."
+msgstr ""
+
+msgid "PushRules|Restrict commits to existing GitLab users."
+msgstr ""
+
+msgid "PushRules|Restrict push operations for this project."
+msgstr ""
+
+msgid "PushRules|Save push rules"
+msgstr ""
+
+msgid "PushRules|Select push rules"
+msgstr ""
+
+msgid "PushRules|Users can still delete tags through the GitLab UI."
+msgstr ""
+
+msgid "PushRule|Push rules"
+msgstr ""
+
+msgid "PushRule|Reject unverified users"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "PushoverService|%{user_name} deleted branch \"%{ref}\"."
+msgstr ""
+
+msgid "PushoverService|%{user_name} push to branch \"%{ref}\"."
+msgstr ""
+
+msgid "PushoverService|%{user_name} pushed new branch \"%{ref}\"."
+msgstr ""
+
+msgid "PushoverService|Enter your application key."
+msgstr ""
+
+msgid "PushoverService|Enter your user key."
+msgstr ""
+
+msgid "PushoverService|Get real-time notifications on your device."
+msgstr ""
+
+msgid "PushoverService|High priority"
+msgstr ""
+
+msgid "PushoverService|Leave blank for all active devices."
+msgstr ""
+
+msgid "PushoverService|Low priority"
+msgstr ""
+
+msgid "PushoverService|Lowest priority"
+msgstr ""
+
+msgid "PushoverService|Normal priority"
+msgstr ""
+
+msgid "PushoverService|See project %{project_full_name}"
+msgstr ""
+
+msgid "PushoverService|Total commits count: %{total_commits_count}"
+msgstr ""
+
+msgid "QualitySummary|Project quality"
+msgstr ""
+
+msgid "Query"
+msgstr ""
+
+msgid "Query cannot be processed"
+msgstr ""
+
+msgid "Queued"
+msgstr ""
+
+msgid "Quick actions can be used in description and comment boxes."
+msgstr ""
+
+msgid "Quick help"
+msgstr ""
+
+msgid "Quick range"
+msgstr ""
+
+msgid "Quickly and easily edit multiple files in your project."
+msgstr ""
+
+msgid "Quota of CI/CD minutes"
+msgstr ""
+
+msgid "Quota of CI/CD minutes:"
+msgstr ""
+
+msgid "README"
+msgstr ""
+
+msgid "Rails"
+msgstr ""
+
+msgid "Rake Tasks Help"
+msgstr ""
+
+msgid "Random"
+msgstr ""
+
+msgid "Rate Limits"
+msgstr ""
+
+msgid "Rate limit"
+msgstr ""
+
+msgid "Rate limit access to specified paths."
+msgstr ""
+
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
+msgid "Raw blob request rate limit per minute"
+msgstr ""
+
+msgid "Raw blob requests"
+msgstr ""
+
+msgid "Re-authentication period expired or never requested. Please try again"
+msgstr ""
+
+msgid "Re-authentication required"
+msgstr ""
+
+msgid "Re-import"
+msgstr ""
+
+msgid "Re-request review"
+msgstr ""
+
+msgid "Re-verification interval"
+msgstr ""
+
+msgid "Read documentation"
+msgstr ""
+
+msgid "Read more"
+msgstr ""
+
+msgid "Read more about GitLab at %{link_to_promo}."
+msgstr ""
+
+msgid "Read more about project permissions %{help_link_open}here%{help_link_close}"
+msgstr ""
+
+msgid "Read more about related epics"
+msgstr ""
+
+msgid "Read more about related issues"
+msgstr ""
+
+msgid "Read their documentation."
+msgstr ""
+
+msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
+msgstr ""
+
+msgid "Ready to merge by members who can write to the target branch."
+msgstr ""
+
+msgid "Ready to merge!"
+msgstr ""
+
+msgid "Reauthenticating with SAML provider."
+msgstr ""
+
+msgid "Rebase"
+msgstr ""
+
+msgid "Rebase in progress"
+msgstr ""
+
+msgid "Rebase source branch"
+msgstr ""
+
+msgid "Rebase source branch on the target branch."
+msgstr ""
+
+msgid "Rebase without pipeline"
+msgstr ""
+
+msgid "Recaptcha verified?"
+msgstr ""
+
+msgid "Receive a $50 gift card as a thank you for your time."
+msgstr ""
+
+msgid "Receive a %{strongOpen}$50 gift card%{strongClose} as a thank you for your time."
+msgstr ""
+
+msgid "Receive alerts from manually configured Prometheus servers."
+msgstr ""
+
+msgid "Receive any notifications from GitLab."
+msgstr ""
+
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
+msgid "Receive notifications about your own activity"
+msgstr ""
+
+msgid "Receive product marketing emails"
+msgstr ""
+
+msgid "Recent"
+msgstr ""
+
+msgid "Recent Project Activity"
+msgstr ""
+
+msgid "Recent Searches Service is unavailable"
+msgstr ""
+
+msgid "Recent events"
+msgstr ""
+
+msgid "Recent jobs served by this runner"
+msgstr ""
+
+msgid "Recent searches"
+msgstr ""
+
+msgid "Recently used"
+msgstr ""
+
+msgid "Reconfigure"
+msgstr ""
+
+msgid "Recovery Codes"
+msgstr ""
+
+msgid "Redirect to SAML provider to test configuration"
+msgstr ""
+
+msgid "Redirecting"
+msgstr ""
+
+msgid "Redis"
+msgstr ""
+
+msgid "Reduce incident management alert volume (for example, if too many issues are being created)."
+msgstr ""
+
+msgid "Reduce project visibility"
+msgstr ""
+
+msgid "Reduce risk and triage fewer vulnerabilities with security training"
+msgstr ""
+
+msgid "Reduce this project’s visibility?"
+msgstr ""
+
+msgid "Reference"
+msgstr ""
+
+msgid "References"
+msgstr ""
+
+msgid "Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)"
+msgstr ""
+
+msgid "Refresh"
+msgstr ""
+
+msgid "Refresh the page and try again."
+msgstr ""
+
+msgid "Refreshing in a second to show the updated status..."
+msgid_plural "Refreshing in %d seconds to show the updated status..."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Regenerate export"
+msgstr ""
+
+msgid "Regenerate instance ID"
+msgstr ""
+
+msgid "Regenerate recovery codes"
+msgstr ""
+
+msgid "Regenerating the instance ID can break integration depending on the client you are using."
+msgstr ""
+
+msgid "Regex pattern"
+msgstr ""
+
+msgid "Region"
+msgstr ""
+
+msgid "Regions"
+msgstr ""
+
+msgid "Register"
+msgstr ""
+
+msgid "Register / Sign In"
+msgstr ""
+
+msgid "Register Two-Factor Authenticator"
+msgstr ""
+
+msgid "Register Universal Two-Factor (U2F) Device"
+msgstr ""
+
+msgid "Register WebAuthn Device"
+msgstr ""
+
+msgid "Register as many runners as you want. You can register runners as separate users, on separate servers, and on your local machine. Runners are either:"
+msgstr ""
+
+msgid "Register device"
+msgstr ""
+
+msgid "Register now"
+msgstr ""
+
+msgid "Register the runner with this URL:"
+msgstr ""
+
+msgid "Register with two-factor app"
+msgstr ""
+
+msgid "Registration Features include:"
+msgstr ""
+
+msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
+msgstr ""
+
+msgid "RegistrationFeatures|Read more about the %{link_start}Registration Features Program%{link_end}."
+msgstr ""
+
+msgid "RegistrationFeatures|Registration Features Program"
+msgstr ""
+
+msgid "RegistrationFeatures|Want to %{feature_title} for free?"
+msgstr ""
+
+msgid "RegistrationFeatures|send emails to users"
+msgstr ""
+
+msgid "RegistrationFeatures|use this feature"
+msgstr ""
+
+msgid "RegistrationVerification|Are you sure you want to skip this step?"
+msgstr ""
+
+msgid "RegistrationVerification|Enable free CI/CD minutes"
+msgstr ""
+
+msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
+msgstr ""
+
+msgid "RegistrationVerification|Pipelines using shared GitLab runners will fail until you validate your account."
+msgstr ""
+
+msgid "RegistrationVerification|Skip this for now"
+msgstr ""
+
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free CI/CD minutes to build your application."
+msgstr ""
+
+msgid "RegistrationVerification|Validate account"
+msgstr ""
+
+msgid "RegistrationVerification|Verify your identity"
+msgstr ""
+
+msgid "RegistrationVerification|Yes, I'd like to skip"
+msgstr ""
+
+msgid "RegistrationVerification|You can alway verify your account at a later time."
+msgstr ""
+
+msgid "Registration|Checkout"
+msgstr ""
+
+msgid "Registration|Your GitLab group"
+msgstr ""
+
+msgid "Registration|Your first project"
+msgstr ""
+
+msgid "Registration|Your profile"
+msgstr ""
+
+msgid "Registry setup"
+msgstr ""
+
+msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
+msgstr ""
+
+msgid "Reject"
+msgstr ""
+
+msgid "Rejected (closed)"
+msgstr ""
+
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
+msgid "Related feature flags"
+msgstr ""
+
+msgid "Related issues"
+msgstr ""
+
+msgid "Related merge requests"
+msgstr ""
+
+msgid "Relates to"
+msgstr ""
+
+msgid "Release"
+msgid_plural "Releases"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Release assets"
+msgstr ""
+
+msgid "Release assets documentation"
+msgstr ""
+
+msgid "Release does not have the same project as the milestone"
+msgstr ""
+
+msgid "Release notes"
+msgstr ""
+
+msgid "Release notes:"
+msgstr ""
+
+msgid "Release title"
+msgstr ""
+
+msgid "Release with tag \"%{tag}\" was not found"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Image"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Images"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Other"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Package"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Packages"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Runbook"
+msgstr ""
+
+msgid "ReleaseAssetLinkType|Runbooks"
+msgstr ""
+
+msgid "Released date"
+msgstr ""
+
+msgid "Releases"
+msgstr ""
+
+msgid "Releases are based on Git tags and mark specific points in a project's development history. They can contain information about the type of changes and can also deliver binaries, like compiled versions of your software."
+msgstr ""
+
+msgid "Releases are based on Git tags. We recommend tags that use semantic versioning, for example %{codeStart}v1.0.0%{codeEnd}, %{codeStart}v2.1.0-pre%{codeEnd}."
+msgstr ""
+
+msgid "Releases documentation"
+msgstr ""
+
+msgid "Releases|New Release"
+msgstr ""
+
+msgid "Release|Something went wrong while creating a new release."
+msgstr ""
+
+msgid "Release|Something went wrong while getting the release details."
+msgstr ""
+
+msgid "Release|Something went wrong while saving the release details."
+msgstr ""
+
+msgid "Reload page"
+msgstr ""
+
+msgid "Remediations"
+msgstr ""
+
+msgid "Remember me"
+msgstr ""
+
+msgid "Remind later"
+msgstr ""
+
+msgid "Remote object has no absolute path."
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+msgid "Remove %{displayReference}"
+msgstr ""
+
+msgid "Remove Zoom meeting"
+msgstr ""
+
+msgid "Remove Zoom meeting."
+msgstr ""
+
+msgid "Remove access"
+msgstr ""
+
+msgid "Remove all or specific assignee(s)"
+msgstr ""
+
+msgid "Remove all or specific label(s)"
+msgstr ""
+
+msgid "Remove all or specific reviewer(s)"
+msgstr ""
+
+msgid "Remove approvers"
+msgstr ""
+
+msgid "Remove approvers?"
+msgstr ""
+
+msgid "Remove asset link"
+msgstr ""
+
+msgid "Remove assignee"
+msgstr ""
+
+msgid "Remove attention request"
+msgstr ""
+
+msgid "Remove attention request(s)"
+msgstr ""
+
+msgid "Remove avatar"
+msgstr ""
+
+msgid "Remove card"
+msgstr ""
+
+msgid "Remove child epic from an epic"
+msgstr ""
+
+msgid "Remove customer relation contact(s)."
+msgstr ""
+
+msgid "Remove customer relation contacts"
+msgstr ""
+
+msgid "Remove deploy key"
+msgstr ""
+
+msgid "Remove description history"
+msgstr ""
+
+msgid "Remove due date"
+msgstr ""
+
+msgid "Remove favicon"
+msgstr ""
+
+msgid "Remove file"
+msgstr ""
+
+msgid "Remove fork relationship"
+msgstr ""
+
+msgid "Remove from batch"
+msgstr ""
+
+msgid "Remove from epic"
+msgstr ""
+
+msgid "Remove group"
+msgstr ""
+
+msgid "Remove header logo"
+msgstr ""
+
+msgid "Remove iteration"
+msgstr ""
+
+msgid "Remove license"
+msgstr ""
+
+msgid "Remove limit"
+msgstr ""
+
+msgid "Remove link"
+msgstr ""
+
+msgid "Remove list"
+msgstr ""
+
+msgid "Remove log"
+msgstr ""
+
+msgid "Remove logo"
+msgstr ""
+
+msgid "Remove member"
+msgstr ""
+
+msgid "Remove milestone"
+msgstr ""
+
+msgid "Remove parent epic from an epic"
+msgstr ""
+
+msgid "Remove priority"
+msgstr ""
+
+msgid "Remove report"
+msgstr ""
+
+msgid "Remove reviewer"
+msgstr ""
+
+msgid "Remove runner"
+msgstr ""
+
+msgid "Remove secondary email"
+msgstr ""
+
+msgid "Remove spent time"
+msgstr ""
+
+msgid "Remove time estimate"
+msgstr ""
+
+msgid "Remove topic avatar"
+msgstr ""
+
+msgid "Remove user"
+msgstr ""
+
+msgid "Remove user & report"
+msgstr ""
+
+msgid "Remove user from group"
+msgstr ""
+
+msgid "Remove user from project"
+msgstr ""
+
+msgid "Remove..."
+msgstr ""
+
+msgid "Removed"
+msgstr ""
+
+msgid "Removed %{assignee_text} %{assignee_references}."
+msgstr ""
+
+msgid "Removed %{epic_ref} from child epics."
+msgstr ""
+
+msgid "Removed %{iteration_reference} iteration."
+msgstr ""
+
+msgid "Removed %{label_references} %{label_text}."
+msgstr ""
+
+msgid "Removed %{milestone_reference} milestone."
+msgstr ""
+
+msgid "Removed %{reviewer_text} %{reviewer_references}."
+msgstr ""
+
+msgid "Removed all labels."
+msgstr ""
+
+msgid "Removed an issue from an epic."
+msgstr ""
+
+msgid "Removed attention from %{users_sentence}."
+msgstr ""
+
+msgid "Removed attention request from @%{username}"
+msgstr ""
+
+msgid "Removed group can not be restored!"
+msgstr ""
+
+msgid "Removed parent epic %{epic_ref}."
+msgstr ""
+
+msgid "Removed spent time."
+msgstr ""
+
+msgid "Removed the due date."
+msgstr ""
+
+msgid "Removed time estimate."
+msgstr ""
+
+msgid "Removed upload with id %{id}"
+msgstr ""
+
+msgid "RemovedProjects|No projects pending deletion found"
+msgstr ""
+
+msgid "RemovedProjects|Projects that are pending deletion that you have access to are listed here."
+msgstr ""
+
+msgid "Removes %{assignee_text} %{assignee_references}."
+msgstr ""
+
+msgid "Removes %{epic_ref} from child epics."
+msgstr ""
+
+msgid "Removes %{iteration_reference} iteration."
+msgstr ""
+
+msgid "Removes %{label_references} %{label_text}."
+msgstr ""
+
+msgid "Removes %{milestone_reference} milestone."
+msgstr ""
+
+msgid "Removes %{reviewer_text} %{reviewer_references}."
+msgstr ""
+
+msgid "Removes all labels."
+msgstr ""
+
+msgid "Removes an issue from an epic."
+msgstr ""
+
+msgid "Removes attention from %{users_sentence}."
+msgstr ""
+
+msgid "Removes parent epic %{epic_ref}."
+msgstr ""
+
+msgid "Removes spent time."
+msgstr ""
+
+msgid "Removes the due date."
+msgstr ""
+
+msgid "Removes time estimate."
+msgstr ""
+
+msgid "Removing this group also removes all child projects, including archived projects, and their resources."
+msgstr ""
+
+msgid "Rename file"
+msgstr ""
+
+msgid "Rename folder"
+msgstr ""
+
+msgid "Rename/Move"
+msgstr ""
+
+msgid "Render diagrams in your documents using PlantUML."
+msgstr ""
+
+msgid "Renew subscription"
+msgstr ""
+
+msgid "Renews"
+msgstr ""
+
+msgid "Reopen"
+msgstr ""
+
+msgid "Reopen %{issueType}"
+msgstr ""
+
+msgid "Reopen %{noteable}"
+msgstr ""
+
+msgid "Reopen epic"
+msgstr ""
+
+msgid "Reopen milestone"
+msgstr ""
+
+msgid "Reopen test case"
+msgstr ""
+
+msgid "Reopen this %{quick_action_target}"
+msgstr ""
+
+msgid "Reopened this %{quick_action_target}."
+msgstr ""
+
+msgid "Reopens this %{quick_action_target}."
+msgstr ""
+
+msgid "Repeats"
+msgstr ""
+
+msgid "Replace"
+msgstr ""
+
+msgid "Replace %{blob_name}"
+msgstr ""
+
+msgid "Replace %{name}"
+msgstr ""
+
+msgid "Replace all label(s)"
+msgstr ""
+
+msgid "Replace file"
+msgstr ""
+
+msgid "Replaced all labels with %{label_references} %{label_text}."
+msgstr ""
+
+msgid "Replaces the clone URL root."
+msgstr ""
+
+msgid "Replication"
+msgstr ""
+
+msgid "Reply by email"
+msgstr ""
+
+msgid "Reply to comment"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Reply…"
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
+msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
+msgstr ""
+
+msgid "Report abuse"
+msgstr ""
+
+msgid "Report abuse to admin"
+msgstr ""
+
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
+msgstr ""
+
+msgid "Reported %{timeAgo} by %{reportedBy}"
+msgstr ""
+
+msgid "Reported by"
+msgstr ""
+
+msgid "Reported by %{reporter}"
+msgstr ""
+
+msgid "Reporting"
+msgstr ""
+
+msgid "Reports|%{combinedString} and %{resolvedString}"
+msgstr ""
+
+msgid "Reports|%{recentlyFailed} out of %{failed} failed test has failed more than once in the last 14 days"
+msgstr ""
+
+msgid "Reports|%{recentlyFailed} out of %{failed} failed tests has failed more than once in the last 14 days"
+msgid_plural "Reports|%{recentlyFailed} out of %{failed} failed tests have failed more than once in the last 14 days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Accessibility scanning detected %d issue for the source branch only"
+msgid_plural "Reports|Accessibility scanning detected %d issues for the source branch only"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Accessibility scanning detected %{strong_start}%{number}%{strong_end} issue for the source branch only"
+msgid_plural "Reports|Accessibility scanning detected %{strong_start}%{number}%{strong_end} issues for the source branch only"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Accessibility scanning detected no issues for the source branch only"
+msgstr ""
+
+msgid "Reports|Accessibility scanning failed loading results"
+msgstr ""
+
+msgid "Reports|Accessibility scanning results are being parsed"
+msgstr ""
+
+msgid "Reports|Actions"
+msgstr ""
+
+msgid "Reports|Activity"
+msgstr ""
+
+msgid "Reports|An error occurred while loading %{name} results"
+msgstr ""
+
+msgid "Reports|An error occurred while loading report"
+msgstr ""
+
+msgid "Reports|Base report parsing error:"
+msgstr ""
+
+msgid "Reports|Classname"
+msgstr ""
+
+msgid "Reports|Execution time"
+msgstr ""
+
+msgid "Reports|Failed %{count} time in %{baseBranch} in the last 14 days"
+msgid_plural "Reports|Failed %{count} times in %{baseBranch} in the last 14 days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Failed %{count} time in %{base_branch} in the last 14 days"
+msgid_plural "Reports|Failed %{count} times in %{base_branch} in the last 14 days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reports|Failure"
+msgstr ""
+
+msgid "Reports|Filename"
+msgstr ""
+
+msgid "Reports|Full report"
+msgstr ""
+
+msgid "Reports|Head report parsing error:"
+msgstr ""
+
+msgid "Reports|Identifier"
+msgstr ""
+
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
+msgid "Reports|Metrics reports are loading"
+msgstr ""
+
+msgid "Reports|Metrics reports changed on %{numberOfChanges} %{pointsString}"
+msgstr ""
+
+msgid "Reports|Metrics reports did not change"
+msgstr ""
+
+msgid "Reports|Metrics reports failed loading results"
+msgstr ""
+
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
+msgid "Reports|Scanner"
+msgstr ""
+
+msgid "Reports|Severity"
+msgstr ""
+
+msgid "Reports|System output"
+msgstr ""
+
+msgid "Reports|Test summary"
+msgstr ""
+
+msgid "Reports|Test summary failed loading results"
+msgstr ""
+
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
+msgid "Reports|Test summary results are being parsed"
+msgstr ""
+
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
+msgid "Reports|Tool"
+msgstr ""
+
+msgid "Reports|Vulnerability"
+msgstr ""
+
+msgid "Reports|Vulnerability Name"
+msgstr ""
+
+msgid "Reports|no changed test results"
+msgstr ""
+
+msgid "Repositories"
+msgstr ""
+
+msgid "Repositories Analytics"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average Coverage by Job"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Average test coverage last 30 days"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Code Coverage: %{averageCoverage}"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Coverage Jobs"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Download historic test coverage data"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Download historic test coverage data (.csv)"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Download test coverage data (.csv)"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Historic Test Coverage Data is available in raw format (.csv) for further analysis."
+msgstr ""
+
+msgid "RepositoriesAnalytics|Jobs with Coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Jobs with Coverage: %{coverageCount}"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Last Update"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Latest test coverage results"
+msgstr ""
+
+msgid "RepositoriesAnalytics|No test coverage to display"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
+msgstr ""
+
+msgid "RepositoriesAnalytics|Please select projects to display."
+msgstr ""
+
+msgid "RepositoriesAnalytics|Projects with Coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Projects with Coverage: %{projectCount}"
+msgstr ""
+
+msgid "RepositoriesAnalytics|Test Code Coverage"
+msgstr ""
+
+msgid "RepositoriesAnalytics|There was an error fetching the projects."
+msgstr ""
+
+msgid "Repository"
+msgstr ""
+
+msgid "Repository Analytics"
+msgstr ""
+
+msgid "Repository Graph"
+msgstr ""
+
+msgid "Repository Settings"
+msgstr ""
+
+msgid "Repository already read-only"
+msgstr ""
+
+msgid "Repository check"
+msgstr ""
+
+msgid "Repository check was triggered."
+msgstr ""
+
+msgid "Repository checks"
+msgstr ""
+
+msgid "Repository cleanup"
+msgstr ""
+
+msgid "Repository cleanup has started. You will receive an email once the cleanup operation is complete."
+msgstr ""
+
+msgid "Repository clone URL"
+msgstr ""
+
+msgid "Repository files count over the limit"
+msgstr ""
+
+msgid "Repository has an invalid default branch name."
+msgstr ""
+
+msgid "Repository has more than one branch."
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
+msgid "Repository has tags."
+msgstr ""
+
+msgid "Repository maintenance"
+msgstr ""
+
+msgid "Repository mirroring"
+msgstr ""
+
+msgid "Repository mirroring configuration"
+msgstr ""
+
+msgid "Repository must contain at least 1 file."
+msgstr ""
+
+msgid "Repository size is above the limit."
+msgstr ""
+
+msgid "Repository size limit (MB)"
+msgstr ""
+
+msgid "Repository storage"
+msgstr ""
+
+msgid "Repository synchronization concurrency limit"
+msgstr ""
+
+msgid "Repository update events"
+msgstr ""
+
+msgid "Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / Pipeline Artifacts: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}"
+msgstr ""
+
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
+msgid "Request"
+msgstr ""
+
+msgid "Request Access"
+msgstr ""
+
+msgid "Request a new one"
+msgstr ""
+
+msgid "Request attention"
+msgstr ""
+
+msgid "Request attention from %{users_sentence}."
+msgstr ""
+
+msgid "Request attention from assignee or reviewer"
+msgstr ""
+
+msgid "Request attention from assignee(s) or reviewer(s)"
+msgstr ""
+
+msgid "Request attention to review"
+msgstr ""
+
+msgid "Request details"
+msgstr ""
+
+msgid "Request parameter %{param} is missing."
+msgstr ""
+
+msgid "Request review from"
+msgstr ""
+
+msgid "Request time"
+msgstr ""
+
+msgid "Request to link SAML account must be authorized"
+msgstr ""
+
+msgid "Requested"
+msgstr ""
+
+msgid "Requested %{time_ago}"
+msgstr ""
+
+msgid "Requested attention from %{users_sentence}."
+msgstr ""
+
+msgid "Requested attention from @%{username}"
+msgstr ""
+
+msgid "Requested design version does not exist."
+msgstr ""
+
+msgid "Requested review"
+msgstr ""
+
+msgid "Requested states are invalid"
+msgstr ""
+
+msgid "Requests"
+msgstr ""
+
+msgid "Requests Profiles"
+msgstr ""
+
+msgid "Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}"
+msgstr ""
+
+msgid "Requests per period"
+msgstr ""
+
+msgid "Require additional authentication for administrative tasks."
+msgstr ""
+
+msgid "Require all users in this group to set up two-factor authentication"
+msgstr ""
+
+msgid "Required approvals (%{approvals_given} given)"
+msgstr ""
+
+msgid "Required approvals (%{approvals_given} given, you've approved)"
+msgstr ""
+
+msgid "Required in this project."
+msgstr ""
+
+msgid "Required only if you are not using role instance credentials."
+msgstr ""
+
+msgid "Requirement"
+msgstr ""
+
+msgid "Requirement %{reference} has been added"
+msgstr ""
+
+msgid "Requirement %{reference} has been archived"
+msgstr ""
+
+msgid "Requirement %{reference} has been reopened"
+msgstr ""
+
+msgid "Requirement %{reference} has been updated"
+msgstr ""
+
+msgid "Requirement title cannot have more than %{limit} characters."
+msgstr ""
+
+msgid "Requirements"
+msgstr ""
+
+msgid "Requirements can be based on users, stakeholders, system, software, or anything else you find important to capture."
+msgstr ""
+
+msgid "Requires %d approval from eligible users."
+msgid_plural "Requires %d approvals from eligible users."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires %{count} approval from %{names}."
+msgid_plural "Requires %{count} approvals from %{names}."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Requires values to meet regular expression requirements."
+msgstr ""
+
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
+msgid "Resend"
+msgstr ""
+
+msgid "Resend Request"
+msgstr ""
+
+msgid "Resend confirmation email"
+msgstr ""
+
+msgid "Resend invite"
+msgstr ""
+
+msgid "Resend it"
+msgstr ""
+
+msgid "Resend unlock instructions"
+msgstr ""
+
+msgid "Reset"
+msgstr ""
+
+msgid "Reset authorization key"
+msgstr ""
+
+msgid "Reset authorization key?"
+msgstr ""
+
+msgid "Reset file"
+msgstr ""
+
+msgid "Reset filters"
+msgstr ""
+
+msgid "Reset health check access token"
+msgstr ""
+
+msgid "Reset key"
+msgstr ""
+
+msgid "Reset link will be generated and sent to the user. %{break} User will be forced to set the password on first sign in."
+msgstr ""
+
+msgid "Reset password"
+msgstr ""
+
+msgid "Reset registration token"
+msgstr ""
+
+msgid "Reset template"
+msgstr ""
+
+msgid "Reset to project defaults"
+msgstr ""
+
+msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
+msgstr ""
+
+msgid "Resolve"
+msgstr ""
+
+msgid "Resolve conflicts"
+msgstr ""
+
+msgid "Resolve conflicts on source branch"
+msgstr ""
+
+msgid "Resolve these conflicts or ask someone with write access to this repository to merge it locally."
+msgstr ""
+
+msgid "Resolve thread"
+msgstr ""
+
+msgid "Resolved"
+msgstr ""
+
+msgid "Resolved 1 discussion."
+msgstr ""
+
+msgid "Resolved all discussions."
+msgstr ""
+
+msgid "Resolved by"
+msgstr ""
+
+msgid "Resolved by %{name}"
+msgstr ""
+
+msgid "Response"
+msgstr ""
+
+msgid "Response didn't include `service_desk_address`"
+msgstr ""
+
+msgid "Response metrics (AWS ELB)"
+msgstr ""
+
+msgid "Response metrics (Custom)"
+msgstr ""
+
+msgid "Response metrics (HA Proxy)"
+msgstr ""
+
+msgid "Response metrics (NGINX Ingress VTS)"
+msgstr ""
+
+msgid "Response metrics (NGINX Ingress)"
+msgstr ""
+
+msgid "Response metrics (NGINX)"
+msgstr ""
+
+msgid "Response text"
+msgstr ""
+
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
+msgid "Restart Terminal"
+msgstr ""
+
+msgid "Restore"
+msgstr ""
+
+msgid "Restore group"
+msgstr ""
+
+msgid "Restore project"
+msgstr ""
+
+msgid "Restoring projects"
+msgstr ""
+
+msgid "Restoring the group will prevent the group, its subgroups and projects from being removed on this date."
+msgstr ""
+
+msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
+msgstr ""
+
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Restrict membership by email domain"
+msgstr ""
+
+msgid "Restrict projects for this runner"
+msgstr ""
+
+msgid "Restricted shift times are not available for hourly shifts"
+msgstr ""
+
+msgid "Resume"
+msgstr ""
+
+msgid "Resync"
+msgstr ""
+
+msgid "Retrieving the compliance report failed. Refresh the page and try again."
+msgstr ""
+
+msgid "Retry"
+msgstr ""
+
+msgid "Retry failed jobs"
+msgstr ""
+
+msgid "Retry job"
+msgstr ""
+
+msgid "Retry migration"
+msgstr ""
+
+msgid "Retry the downstream pipeline"
+msgstr ""
+
+msgid "Retry the trigger job"
+msgstr ""
+
+msgid "Retry this job"
+msgstr ""
+
+msgid "Retry this job in order to create the necessary resources."
+msgstr ""
+
+msgid "Retry verification"
+msgstr ""
+
+msgid "Reveal value"
+msgid_plural "Reveal values"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reveal values"
+msgstr ""
+
+msgid "Revert this commit"
+msgstr ""
+
+msgid "Revert this merge request"
+msgstr ""
+
+msgid "Review"
+msgstr ""
+
+msgid "Review App|View app"
+msgstr ""
+
+msgid "Review App|View latest app"
+msgstr ""
+
+msgid "Review changes"
+msgstr ""
+
+msgid "Review requests for you"
+msgstr ""
+
+msgid "Review the changes locally."
+msgstr ""
+
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
+msgid "Review the target project before submitting to avoid exposing %{source} changes."
+msgstr ""
+
+msgid "Review time"
+msgstr ""
+
+msgid "Review time is defined as the time it takes from first comment until merged."
+msgstr ""
+
+msgid "ReviewApp|Enable Review App"
+msgstr ""
+
+msgid "Reviewer"
+msgid_plural "%d Reviewers"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Reviewer(s)"
+msgstr ""
+
+msgid "Reviewers"
+msgstr ""
+
+msgid "Reviewing"
+msgstr ""
+
+msgid "Reviewing (merge request !%{mergeRequestId})"
+msgstr ""
+
+msgid "Revoke"
+msgstr ""
+
+msgid "Revoked"
+msgstr ""
+
+msgid "Revoked access token %{access_token_name}!"
+msgstr ""
+
+msgid "Revoked impersonation token %{token_name}!"
+msgstr ""
+
+msgid "Revoked personal access token %{personal_access_token_name}!"
+msgstr ""
+
+msgid "RightSidebar|Copy email address"
+msgstr ""
+
+msgid "RightSidebar|Issue email"
+msgstr ""
+
+msgid "RightSidebar|adding a"
+msgstr ""
+
+msgid "RightSidebar|deleting the"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Roadmap settings"
+msgstr ""
+
+msgid "Role"
+msgstr ""
+
+msgid "Rollback"
+msgstr ""
+
+msgid "Ruby"
+msgstr ""
+
+msgid "Rule name is already taken."
+msgstr ""
+
+msgid "Rules that define what git pushes are accepted for a project in this group. All newly created projects in this group will use these settings."
+msgstr ""
+
+msgid "Rules that define what git pushes are accepted for a project. All newly created projects will use these settings."
+msgstr ""
+
+msgid "Run %{code_start}git fsck%{code_end} periodically in all project and wiki repositories to look for silent disk corruption issues."
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
+msgstr ""
+
+msgid "Run CI/CD pipelines with Jenkins when you push to a repository, or when a merge request is created, updated, or merged. %{docs_link}"
+msgstr ""
+
+msgid "Run CI/CD pipelines with Jenkins."
+msgstr ""
+
+msgid "Run housekeeping"
+msgstr ""
+
+msgid "Run manual or delayed jobs"
+msgstr ""
+
+msgid "Run tests against your code live using the Web Terminal"
+msgstr ""
+
+msgid "Run untagged jobs"
+msgstr ""
+
+msgid "Runner API"
+msgstr ""
+
+msgid "Runner cannot be deleted, please contact your administrator."
+msgstr ""
+
+msgid "Runner tokens"
+msgstr ""
+
+msgid "Runner was not updated."
+msgstr ""
+
+msgid "Runner was successfully updated."
+msgstr ""
+
+msgid "Runners"
+msgstr ""
+
+msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
+msgstr ""
+
+msgid "Runners currently online: %{active_runners_count}"
+msgstr ""
+
+msgid "Runners page."
+msgstr ""
+
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
+msgid "Runners|Active"
+msgstr ""
+
+msgid "Runners|All"
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
+msgstr ""
+
+msgid "Runners|An error has occurred fetching instructions"
+msgstr ""
+
+msgid "Runners|Architecture"
+msgstr ""
+
+msgid "Runners|Assigned Group"
+msgstr ""
+
+msgid "Runners|Assigned Projects (%{projectCount})"
+msgstr ""
+
+msgid "Runners|Associated with one or more projects"
+msgstr ""
+
+msgid "Runners|Available to all projects"
+msgstr ""
+
+msgid "Runners|Available to all projects and subgroups in the group"
+msgstr ""
+
+msgid "Runners|Can run untagged jobs"
+msgstr ""
+
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
+msgid "Runners|Change to project runner"
+msgstr ""
+
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
+msgid "Runners|Command to register runner"
+msgstr ""
+
+msgid "Runners|Configuration"
+msgstr ""
+
+msgid "Runners|Copy instructions"
+msgstr ""
+
+msgid "Runners|Copy registration token"
+msgstr ""
+
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|Delete runner"
+msgstr ""
+
+msgid "Runners|Delete runner %{name}?"
+msgstr ""
+
+msgid "Runners|Delete selected"
+msgstr ""
+
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
+msgid "Runners|Description"
+msgstr ""
+
+msgid "Runners|Details"
+msgstr ""
+
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
+msgid "Runners|Download and install binary"
+msgstr ""
+
+msgid "Runners|Download latest binary"
+msgstr ""
+
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|Group"
+msgstr ""
+
+msgid "Runners|IP Address"
+msgstr ""
+
+msgid "Runners|Install a runner"
+msgstr ""
+
+msgid "Runners|Instance"
+msgstr ""
+
+msgid "Runners|Jobs"
+msgstr ""
+
+msgid "Runners|Last contact"
+msgstr ""
+
+msgid "Runners|Locked to this project"
+msgstr ""
+
+msgid "Runners|Maximum job timeout"
+msgstr ""
+
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
+msgid "Runners|Name"
+msgstr ""
+
+msgid "Runners|Never contacted"
+msgstr ""
+
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
+msgstr ""
+
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
+msgstr ""
+
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
+msgstr ""
+
+msgid "Runners|Offline"
+msgstr ""
+
+msgid "Runners|Offline runners"
+msgstr ""
+
+msgid "Runners|Offline:"
+msgstr ""
+
+msgid "Runners|Online"
+msgstr ""
+
+msgid "Runners|Online runners"
+msgstr ""
+
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
+msgid "Runners|Paused"
+msgstr ""
+
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|Platform"
+msgstr ""
+
+msgid "Runners|Project"
+msgstr ""
+
+msgid "Runners|Property Name"
+msgstr ""
+
+msgid "Runners|Protected"
+msgstr ""
+
+msgid "Runners|Register a group runner"
+msgstr ""
+
+msgid "Runners|Register a project runner"
+msgstr ""
+
+msgid "Runners|Register a runner"
+msgstr ""
+
+msgid "Runners|Register an instance runner"
+msgstr ""
+
+msgid "Runners|Registration token"
+msgstr ""
+
+msgid "Runners|Registration token copied!"
+msgstr ""
+
+msgid "Runners|Reset token"
+msgstr ""
+
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
+msgid "Runners|Revision"
+msgstr ""
+
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
+msgid "Runners|Runner"
+msgstr ""
+
+msgid "Runners|Runner #%{runner_id}"
+msgstr ""
+
+msgid "Runners|Runner %{name} was deleted"
+msgstr ""
+
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner registration"
+msgstr ""
+
+msgid "Runners|Runner statuses"
+msgstr ""
+
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
+msgid "Runners|Runners"
+msgstr ""
+
+msgid "Runners|Runs untagged jobs"
+msgstr ""
+
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
+msgstr ""
+
+msgid "Runners|Show runner installation and registration instructions"
+msgstr ""
+
+msgid "Runners|Show runner installation instructions"
+msgstr ""
+
+msgid "Runners|Something went wrong while fetching runner data."
+msgstr ""
+
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
+msgid "Runners|Stale"
+msgstr ""
+
+msgid "Runners|Stale runners"
+msgstr ""
+
+msgid "Runners|Stale:"
+msgstr ""
+
+msgid "Runners|Status"
+msgstr ""
+
+msgid "Runners|Stop the runner from accepting new jobs."
+msgstr ""
+
+msgid "Runners|Tags"
+msgstr ""
+
+msgid "Runners|Take me there!"
+msgstr ""
+
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
+msgstr ""
+
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
+msgstr ""
+
+msgid "Runners|This runner is available to all projects and subgroups in a group."
+msgstr ""
+
+msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
+msgstr ""
+
+msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
+msgstr ""
+
+msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
+msgstr ""
+
+msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
+msgstr ""
+
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Use the runner on pipelines for protected branches only."
+msgstr ""
+
+msgid "Runners|Value"
+msgstr ""
+
+msgid "Runners|Version"
+msgstr ""
+
+msgid "Runners|View installation instructions"
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
+msgstr ""
+
+msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
+msgstr ""
+
+msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
+msgstr ""
+
+msgid "Runners|active"
+msgstr ""
+
+msgid "Runners|group"
+msgstr ""
+
+msgid "Runners|locked"
+msgstr ""
+
+msgid "Runners|never contacted"
+msgstr ""
+
+msgid "Runners|offline"
+msgstr ""
+
+msgid "Runners|online"
+msgstr ""
+
+msgid "Runners|paused"
+msgstr ""
+
+msgid "Runners|shared"
+msgstr ""
+
+msgid "Runners|specific"
+msgstr ""
+
+msgid "Runners|stale"
+msgstr ""
+
+msgid "Running"
+msgstr ""
+
+msgid "Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects."
+msgstr ""
+
+msgid "SAML"
+msgstr ""
+
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML discovery tokens"
+msgstr ""
+
+msgid "SAML for %{group_name}"
+msgstr ""
+
+msgid "SAST Configuration"
+msgstr ""
+
+msgid "SHA256"
+msgstr ""
+
+msgid "SSH Key"
+msgstr ""
+
+msgid "SSH Keys"
+msgstr ""
+
+msgid "SSH Keys Help"
+msgstr ""
+
+msgid "SSH host key fingerprints"
+msgstr ""
+
+msgid "SSH host keys"
+msgstr ""
+
+msgid "SSH host keys are not available on this system. Please use %{ssh_keyscan} command or contact your GitLab administrator for more information."
+msgstr ""
+
+msgid "SSH key"
+msgstr ""
+
+msgid "SSH keys"
+msgstr ""
+
+msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
+msgstr ""
+
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
+msgid "SSH public key"
+msgstr ""
+
+msgid "SSL Verification:"
+msgstr ""
+
+msgid "SSL verification"
+msgstr ""
+
+msgid "Satisfied"
+msgstr ""
+
+msgid "Saturday"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Save %{name} size limits"
+msgstr ""
+
+msgid "Save Changes"
+msgstr ""
+
+msgid "Save application"
+msgstr ""
+
+msgid "Save changes"
+msgstr ""
+
+msgid "Save changes before testing"
+msgstr ""
+
+msgid "Save comment"
+msgstr ""
+
+msgid "Save deploy freeze"
+msgstr ""
+
+msgid "Save password"
+msgstr ""
+
+msgid "Save pipeline schedule"
+msgstr ""
+
+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 ""
+
+msgid "Saving project."
+msgstr ""
+
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
+msgstr ""
+
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
+msgstr ""
+
+msgid "ScanResultPolicy|add an approver"
+msgstr ""
+
+msgid "ScanResultPolicy|scanners"
+msgstr ""
+
+msgid "ScanResultPolicy|severity levels"
+msgstr ""
+
+msgid "ScanResultPolicy|vulnerability states"
+msgstr ""
+
+msgid "Scanner"
+msgstr ""
+
+msgid "Scanner profile failed to delete"
+msgstr ""
+
+msgid "Scanner profile not found for given parameters"
+msgstr ""
+
+msgid "Schedule a new pipeline"
+msgstr ""
+
+msgid "Schedule-based escalation rules must have a schedule in the same project as the policy"
+msgstr ""
+
+msgid "Scheduled"
+msgstr ""
+
+msgid "Scheduled Deletion At - %{permanent_deletion_time}"
+msgstr ""
+
+msgid "Scheduled a rebase of branch %{branch}."
+msgstr ""
+
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
+msgid "Scheduled to merge this merge request (%{strategy})."
+msgstr ""
+
+msgid "Schedules"
+msgstr ""
+
+msgid "Schedules to merge this merge request (%{strategy})."
+msgstr ""
+
+msgid "Scheduling Pipelines"
+msgstr ""
+
+msgid "Scope"
+msgstr ""
+
+msgid "Scope board to current iteration"
+msgstr ""
+
+msgid "Scopes"
+msgstr ""
+
+msgid "Scopes (select at least one)"
+msgstr ""
+
+msgid "Scopes can't be blank"
+msgstr ""
+
+msgid "Scopes: %{scope_list}"
+msgstr ""
+
+msgid "Scroll down"
+msgstr ""
+
+msgid "Scroll left"
+msgstr ""
+
+msgid "Scroll right"
+msgstr ""
+
+msgid "Scroll to bottom"
+msgstr ""
+
+msgid "Scroll to top"
+msgstr ""
+
+msgid "Scroll up"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+msgid "Search GitLab"
+msgstr ""
+
+msgid "Search a group"
+msgstr ""
+
+msgid "Search an environment spec"
+msgstr ""
+
+msgid "Search assignees"
+msgstr ""
+
+msgid "Search authors"
+msgstr ""
+
+msgid "Search branches"
+msgstr ""
+
+msgid "Search branches and tags"
+msgstr ""
+
+msgid "Search branches, tags, and commits"
+msgstr ""
+
+msgid "Search by Git revision"
+msgstr ""
+
+msgid "Search by author"
+msgstr ""
+
+msgid "Search by commit title or SHA"
+msgstr ""
+
+msgid "Search by message"
+msgstr ""
+
+msgid "Search by name"
+msgstr ""
+
+msgid "Search files"
+msgstr ""
+
+msgid "Search for Namespace"
+msgstr ""
+
+msgid "Search for a LDAP group"
+msgstr ""
+
+msgid "Search for a group"
+msgstr ""
+
+msgid "Search for a user"
+msgstr ""
+
+msgid "Search for an emoji"
+msgstr ""
+
+msgid "Search for projects, issues, etc."
+msgstr ""
+
+msgid "Search for this text"
+msgstr ""
+
+msgid "Search forks"
+msgstr ""
+
+msgid "Search groups"
+msgstr ""
+
+msgid "Search iterations"
+msgstr ""
+
+msgid "Search labels"
+msgstr ""
+
+msgid "Search merge requests"
+msgstr ""
+
+msgid "Search milestones"
+msgstr ""
+
+msgid "Search or create tag"
+msgstr ""
+
+msgid "Search or filter results..."
+msgstr ""
+
+msgid "Search or filter results…"
+msgstr ""
+
+msgid "Search project"
+msgstr ""
+
+msgid "Search projects"
+msgstr ""
+
+msgid "Search projects..."
+msgstr ""
+
+msgid "Search rate limits"
+msgstr ""
+
+msgid "Search refs"
+msgstr ""
+
+msgid "Search requirements"
+msgstr ""
+
+msgid "Search settings"
+msgstr ""
+
+msgid "Search users"
+msgstr ""
+
+msgid "Search users or groups"
+msgstr ""
+
+msgid "Search your project dependencies for their licenses and apply policies."
+msgstr ""
+
+msgid "Search your projects"
+msgstr ""
+
+msgid "SearchAutocomplete|All GitLab"
+msgstr ""
+
+msgid "SearchAutocomplete|Issues I've created"
+msgstr ""
+
+msgid "SearchAutocomplete|Issues assigned to me"
+msgstr ""
+
+msgid "SearchAutocomplete|Merge requests I've created"
+msgstr ""
+
+msgid "SearchAutocomplete|Merge requests assigned to me"
+msgstr ""
+
+msgid "SearchAutocomplete|Merge requests that I'm a reviewer"
+msgstr ""
+
+msgid "SearchAutocomplete|in all GitLab"
+msgstr ""
+
+msgid "SearchAutocomplete|in group %{groupName}"
+msgstr ""
+
+msgid "SearchAutocomplete|in project %{projectName}"
+msgstr ""
+
+msgid "SearchCodeResults|of %{link_to_project}"
+msgstr ""
+
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
+msgstr ""
+
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
+
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
+msgstr ""
+
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
+
+msgid "SearchResults|code result"
+msgid_plural "SearchResults|code results"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|comment"
+msgid_plural "SearchResults|comments"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|commit"
+msgid_plural "SearchResults|commits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|epic"
+msgid_plural "SearchResults|epics"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|issue"
+msgid_plural "SearchResults|issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|merge request"
+msgid_plural "SearchResults|merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|milestone"
+msgid_plural "SearchResults|milestones"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|project"
+msgid_plural "SearchResults|projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|snippet"
+msgid_plural "SearchResults|snippets"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|user"
+msgid_plural "SearchResults|users"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SearchResults|wiki result"
+msgid_plural "SearchResults|wiki results"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Searching by both author and message is currently not supported."
+msgstr ""
+
+msgid "Seats"
+msgstr ""
+
+msgid "Seats owed"
+msgstr ""
+
+msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
+msgstr ""
+
+msgid "Seats usage data is updated every day at 12:00pm UTC"
+msgstr ""
+
+msgid "Secondary"
+msgstr ""
+
+msgid "Secondary email:"
+msgstr ""
+
+msgid "Seconds"
+msgstr ""
+
+msgid "Secret"
+msgstr ""
+
+msgid "Secret Detection"
+msgstr ""
+
+msgid "Secret token"
+msgstr ""
+
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
+msgid "Secure token that identifies an external storage request."
+msgstr ""
+
+msgid "Security"
+msgstr ""
+
+msgid "Security & Compliance"
+msgstr ""
+
+msgid "Security Configuration"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security dashboard"
+msgstr ""
+
+msgid "Security navigation"
+msgstr ""
+
+msgid "Security report is out of date. Please update your branch with the latest changes from the target branch (%{targetBranchName})"
+msgstr ""
+
+msgid "Security report is out of date. Run %{newPipelineLinkStart}a new pipeline%{newPipelineLinkEnd} for the target branch (%{targetBranchName})"
+msgstr ""
+
+msgid "SecurityApprovals|A merge request approval is required when a security report contains a new vulnerability."
+msgstr ""
+
+msgid "SecurityApprovals|A merge request approval is required when test coverage declines."
+msgstr ""
+
+msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
+msgstr ""
+
+msgid "SecurityApprovals|Coverage-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Learn more about Coverage-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Learn more about License-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Learn more about Vulnerability-Check"
+msgstr ""
+
+msgid "SecurityApprovals|License-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityApprovals|Vulnerability-Check"
+msgstr ""
+
+msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
+msgstr ""
+
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
+msgid "SecurityConfiguration|An error occurred while creating the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|Available with Ultimate"
+msgstr ""
+
+msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|Compliance"
+msgstr ""
+
+msgid "SecurityConfiguration|Configuration guide"
+msgstr ""
+
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
+msgid "SecurityConfiguration|Configure %{feature}"
+msgstr ""
+
+msgid "SecurityConfiguration|Configure with a merge request"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
+msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
+msgstr ""
+
+msgid "SecurityConfiguration|Create merge request"
+msgstr ""
+
+msgid "SecurityConfiguration|Customize common SAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{linkStart}GitLab SAST documentation%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Enable %{feature}"
+msgstr ""
+
+msgid "SecurityConfiguration|Enable Auto DevOps"
+msgstr ""
+
+msgid "SecurityConfiguration|Enable security training to help your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability."
+msgstr ""
+
+msgid "SecurityConfiguration|Enabled"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups"
+msgstr ""
+
+msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
+msgstr ""
+
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
+msgstr ""
+
+msgid "SecurityConfiguration|Manage profiles"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
+msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
+msgstr ""
+
+msgid "SecurityConfiguration|Not enabled"
+msgstr ""
+
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Quickly enable all continuous testing and compliance tools by enabling %{linkStart}Auto DevOps%{linkEnd}"
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments"
+msgstr ""
+
+msgid "SecurityConfiguration|SAST Analyzers"
+msgstr ""
+
+msgid "SecurityConfiguration|SAST Configuration"
+msgstr ""
+
+msgid "SecurityConfiguration|Secure your project"
+msgstr ""
+
+msgid "SecurityConfiguration|Security testing"
+msgstr ""
+
+msgid "SecurityConfiguration|Security training"
+msgstr ""
+
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
+msgstr ""
+
+msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
+msgstr ""
+
+msgid "SecurityConfiguration|Vulnerability Management"
+msgstr ""
+
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
+msgstr ""
+
+msgid "SecurityOrchestration| or "
+msgstr ""
+
+msgid "SecurityOrchestration|%{branches} %{plural}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
+msgid "SecurityOrchestration|.yaml preview"
+msgstr ""
+
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
+msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
+msgstr ""
+
+msgid "SecurityOrchestration|All policies"
+msgstr ""
+
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
+msgid "SecurityOrchestration|An error occurred assigning your security policy project"
+msgstr ""
+
+msgid "SecurityOrchestration|An error occurred unassigning your security policy project"
+msgstr ""
+
+msgid "SecurityOrchestration|Choose a project"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit policy project"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Empty policy name"
+msgstr ""
+
+msgid "SecurityOrchestration|Enabled"
+msgstr ""
+
+msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
+msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
+msgstr ""
+
+msgid "SecurityOrchestration|Invalid policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Latest scan run against %{agent}"
+msgstr ""
+
+msgid "SecurityOrchestration|Network"
+msgstr ""
+
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
+msgid "SecurityOrchestration|No actions defined - policy will not run."
+msgstr ""
+
+msgid "SecurityOrchestration|No description"
+msgstr ""
+
+msgid "SecurityOrchestration|No rules defined - policy will not run."
+msgstr ""
+
+msgid "SecurityOrchestration|Not enabled"
+msgstr ""
+
+msgid "SecurityOrchestration|Only owners can update Security Policy Project"
+msgstr ""
+
+msgid "SecurityOrchestration|Policies"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy Type"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy cannot be enabled for non-existing branches (%{branches})"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy description"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy editor"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy status"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy summary"
+msgstr ""
+
+msgid "SecurityOrchestration|Policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
+msgstr ""
+
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
+msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
+msgstr ""
+
+msgid "SecurityOrchestration|Runs a %{action} scan"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan Execution"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan Result"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
+msgid "SecurityOrchestration|Scan result"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
+msgstr ""
+
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan to be performed %{cadence}"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan to be performed %{cadence} on the %{branches}"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan to be performed on every pipeline on the %{branches}"
+msgstr ""
+
+msgid "SecurityOrchestration|Security policy project was linked successfully"
+msgstr ""
+
+msgid "SecurityOrchestration|Security policy project was unlinked successfully"
+msgstr ""
+
+msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Select security project"
+msgstr ""
+
+msgid "SecurityOrchestration|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "SecurityOrchestration|Status"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
+msgstr ""
+
+msgid "SecurityOrchestration|There was a problem creating the new security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|This project does not contain any security policies."
+msgstr ""
+
+msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
+msgstr ""
+
+msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
+msgstr ""
+
+msgid "SecurityOrchestration|Unlink project"
+msgstr ""
+
+msgid "SecurityOrchestration|Unlinking a security project removes all policies stored in the linked security project. Save to confirm this action."
+msgstr ""
+
+msgid "SecurityOrchestration|Update scan policies"
+msgstr ""
+
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
+msgid "SecurityOrchestration|a"
+msgstr ""
+
+msgid "SecurityOrchestration|all branches"
+msgstr ""
+
+msgid "SecurityOrchestration|an"
+msgstr ""
+
+msgid "SecurityOrchestration|branch"
+msgstr ""
+
+msgid "SecurityOrchestration|branches"
+msgstr ""
+
+msgid "SecurityOrchestration|members of groups"
+msgstr ""
+
+msgid "SecurityOrchestration|members of groups with ids"
+msgstr ""
+
+msgid "SecurityOrchestration|members of the group"
+msgstr ""
+
+msgid "SecurityOrchestration|members of the group with id"
+msgstr ""
+
+msgid "SecurityOrchestration|scanner finds"
+msgstr ""
+
+msgid "SecurityOrchestration|scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|the %{branches}"
+msgstr ""
+
+msgid "SecurityOrchestration|user with id"
+msgstr ""
+
+msgid "SecurityOrchestration|users with ids"
+msgstr ""
+
+msgid "SecurityOrchestration|vulnerabilities"
+msgstr ""
+
+msgid "SecurityOrchestration|vulnerability"
+msgstr ""
+
+msgid "SecurityPolicies|+%{count} more"
+msgstr ""
+
+msgid "SecurityPolicies|Environment(s)"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityReports|%{count}+ projects"
+msgstr ""
+
+msgid "SecurityReports|%{firstProject} and %{secondProject}"
+msgstr ""
+
+msgid "SecurityReports|%{firstProject}, %{secondProject}, and %{rest}"
+msgstr ""
+
+msgid "SecurityReports|Add or remove projects to monitor in the security area. Projects included in this list will have their results displayed in the security dashboard and vulnerability report."
+msgstr ""
+
+msgid "SecurityReports|Add projects"
+msgstr ""
+
+msgid "SecurityReports|All activity"
+msgstr ""
+
+msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
+msgstr ""
+
+msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
+msgstr ""
+
+msgid "SecurityReports|Change status"
+msgstr ""
+
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Comment deleted on '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Configure security testing"
+msgstr ""
+
+msgid "SecurityReports|Create Jira issue"
+msgstr ""
+
+msgid "SecurityReports|Create issue"
+msgstr ""
+
+msgid "SecurityReports|Create policy"
+msgstr ""
+
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
+msgid "SecurityReports|Dismiss vulnerability"
+msgstr ""
+
+msgid "SecurityReports|Dismissed '%{vulnerabilityName}'"
+msgstr ""
+
+msgid "SecurityReports|Dismissed '%{vulnerabilityName}'. Turn off the hide dismissed toggle to view."
+msgstr ""
+
+msgid "SecurityReports|Download %{artifactName}"
+msgstr ""
+
+msgid "SecurityReports|Download results"
+msgstr ""
+
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
+msgid "SecurityReports|Either you don't have permission to view this dashboard or the dashboard has not been setup. Please check your permission settings with your administrator or check your dashboard configurations to proceed."
+msgstr ""
+
+msgid "SecurityReports|Ensure that %{trackingStart}issue tracking%{trackingEnd} is enabled for this project and you have %{permissionsStart}permission to create new issues%{permissionsEnd}."
+msgstr ""
+
+msgid "SecurityReports|Error fetching the vulnerability counts. Please check your network connection and try again."
+msgstr ""
+
+msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
+msgstr ""
+
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
+msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
+msgstr ""
+
+msgid "SecurityReports|Hide dismissed"
+msgstr ""
+
+msgid "SecurityReports|Issue Created"
+msgstr ""
+
+msgid "SecurityReports|Issues created from a vulnerability cannot be removed."
+msgstr ""
+
+msgid "SecurityReports|Learn more about setting up your dashboard"
+msgstr ""
+
+msgid "SecurityReports|Manage and track vulnerabilities identified in projects within your group. Vulnerabilities in projects are shown here when security testing is configured."
+msgstr ""
+
+msgid "SecurityReports|Manage and track vulnerabilities identified in your Kubernetes clusters. Vulnerabilities appear here after you create a scan execution policy in any project in this group."
+msgstr ""
+
+msgid "SecurityReports|Manage and track vulnerabilities identified in your Kubernetes clusters. Vulnerabilities appear here after you create a scan execution policy in any project in this instance."
+msgstr ""
+
+msgid "SecurityReports|Manage and track vulnerabilities identified in your Kubernetes clusters. Vulnerabilities appear here after you create a scan execution policy in this project."
+msgstr ""
+
+msgid "SecurityReports|Manage and track vulnerabilities identified in your project. Vulnerabilities are shown here when security testing is configured."
+msgstr ""
+
+msgid "SecurityReports|Manage and track vulnerabilities identified in your selected projects. Vulnerabilities for selected projects with security testing configured are shown here."
+msgstr ""
+
+msgid "SecurityReports|Maximum selected projects limit reached"
+msgstr ""
+
+msgid "SecurityReports|Monitor vulnerabilities across clusters"
+msgstr ""
+
+msgid "SecurityReports|Monitor vulnerabilities in all of your projects"
+msgstr ""
+
+msgid "SecurityReports|Monitor vulnerabilities in your group"
+msgstr ""
+
+msgid "SecurityReports|Monitor vulnerabilities in your project"
+msgstr ""
+
+msgid "SecurityReports|Monitored projects"
+msgstr ""
+
+msgid "SecurityReports|More info"
+msgstr ""
+
+msgid "SecurityReports|No activity"
+msgstr ""
+
+msgid "SecurityReports|No longer detected"
+msgstr ""
+
+msgid "SecurityReports|No vulnerabilities found"
+msgstr ""
+
+msgid "SecurityReports|No vulnerabilities found for this pipeline"
+msgstr ""
+
+msgid "SecurityReports|Oops, something doesn't seem right."
+msgstr ""
+
+msgid "SecurityReports|Operational vulnerabilities"
+msgstr ""
+
+msgid "SecurityReports|Project"
+msgstr ""
+
+msgid "SecurityReports|Project was not found or you do not have permission to add this project to Security Dashboards."
+msgstr ""
+
+msgid "SecurityReports|Projects added"
+msgstr ""
+
+msgid "SecurityReports|Remove project from dashboard"
+msgstr ""
+
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
+msgid "SecurityReports|Scan details"
+msgstr ""
+
+msgid "SecurityReports|Security Dashboard"
+msgstr ""
+
+msgid "SecurityReports|Security reports can only be accessed by authorized users."
+msgstr ""
+
+msgid "SecurityReports|Security reports help page link"
+msgstr ""
+
+msgid "SecurityReports|Security scans have run"
+msgstr ""
+
+msgid "SecurityReports|Select a project to add by using the project search field above."
+msgstr ""
+
+msgid "SecurityReports|Set status"
+msgstr ""
+
+msgid "SecurityReports|Severity"
+msgstr ""
+
+msgid "SecurityReports|Show %{pageSize} items"
+msgstr ""
+
+msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
+msgstr ""
+
+msgid "SecurityReports|Sorry, your filter produced no results"
+msgstr ""
+
+msgid "SecurityReports|Status"
+msgstr ""
+
+msgid "SecurityReports|Submit vulnerability"
+msgstr ""
+
+msgid "SecurityReports|Take survey"
+msgstr ""
+
+msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
+msgstr ""
+
+msgid "SecurityReports|There was an error adding the comment."
+msgstr ""
+
+msgid "SecurityReports|There was an error creating the issue."
+msgstr ""
+
+msgid "SecurityReports|There was an error creating the merge request."
+msgstr ""
+
+msgid "SecurityReports|There was an error deleting the comment."
+msgstr ""
+
+msgid "SecurityReports|There was an error dismissing the vulnerabilities."
+msgstr ""
+
+msgid "SecurityReports|There was an error dismissing the vulnerability."
+msgstr ""
+
+msgid "SecurityReports|There was an error reverting the dismissal."
+msgstr ""
+
+msgid "SecurityReports|There was an error reverting this dismissal."
+msgstr ""
+
+msgid "SecurityReports|There was an error while generating the report."
+msgstr ""
+
+msgid "SecurityReports|These vulnerabilities were detected in external sources. They are not necessarily tied to your GitLab project. For example, running containers, URLs, and so on."
+msgstr ""
+
+msgid "SecurityReports|To widen your search, change or remove filters above"
+msgstr ""
+
+msgid "SecurityReports|Tool"
+msgstr ""
+
+msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
+msgstr ""
+
+msgid "SecurityReports|Unable to add %{invalidProjects}"
+msgstr ""
+
+msgid "SecurityReports|Undo dismiss"
+msgstr ""
+
+msgid "SecurityReports|Upgrade to interact, track and shift left with vulnerability management features in the UI."
+msgstr ""
+
+msgid "SecurityReports|Upgrade to manage vulnerabilities"
+msgstr ""
+
+msgid "SecurityReports|Vulnerability Management feature survey"
+msgstr ""
+
+msgid "SecurityReports|Vulnerability Report"
+msgstr ""
+
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
+msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
+msgstr ""
+
+msgid "SecurityReports|With issues"
+msgstr ""
+
+msgid "SecurityReports|You do not have sufficient permissions to access this report"
+msgstr ""
+
+msgid "SecurityReports|You must sign in as an authorized user to see this report"
+msgstr ""
+
+msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
+msgstr ""
+
+msgid "SecurityReports|scanned resources"
+msgstr ""
+
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
+msgid "See example DevOps Score page in our documentation."
+msgstr ""
+
+msgid "See metrics"
+msgstr ""
+
+msgid "See our website for help"
+msgstr ""
+
+msgid "See the affected projects in the GitLab admin panel"
+msgstr ""
+
+msgid "See the list of available commands in Slack after setting up this service by entering"
+msgstr ""
+
+msgid "See vulnerability %{vulnerability_link} for any Remediation details."
+msgstr ""
+
+msgid "See vulnerability %{vulnerability_link} for any Solution details."
+msgstr ""
+
+msgid "Select"
+msgstr ""
+
+msgid "Select Archive Format"
+msgstr ""
+
+msgid "Select Git revision"
+msgstr ""
+
+msgid "Select Page"
+msgstr ""
+
+msgid "Select a branch"
+msgstr ""
+
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
+msgstr ""
+
+msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
+msgstr ""
+
+msgid "Select a label"
+msgstr ""
+
+msgid "Select a milestone"
+msgstr ""
+
+msgid "Select a new namespace"
+msgstr ""
+
+msgid "Select a project"
+msgstr ""
+
+msgid "Select a reason"
+msgstr ""
+
+msgid "Select a repository containing templates for common files."
+msgstr ""
+
+msgid "Select a role"
+msgstr ""
+
+msgid "Select a template repository"
+msgstr ""
+
+msgid "Select a template type"
+msgstr ""
+
+msgid "Select a time zone"
+msgstr ""
+
+msgid "Select a timezone"
+msgstr ""
+
+msgid "Select all"
+msgstr ""
+
+msgid "Select an assignee"
+msgstr ""
+
+msgid "Select an iteration"
+msgstr ""
+
+msgid "Select assignee"
+msgstr ""
+
+msgid "Select assignee(s)"
+msgstr ""
+
+msgid "Select branch"
+msgstr ""
+
+msgid "Select due date"
+msgstr ""
+
+msgid "Select epic"
+msgstr ""
+
+msgid "Select file"
+msgstr ""
+
+msgid "Select group"
+msgstr ""
+
+msgid "Select group or project"
+msgstr ""
+
+msgid "Select groups to replicate"
+msgstr ""
+
+msgid "Select health status"
+msgstr ""
+
+msgid "Select iteration"
+msgstr ""
+
+msgid "Select label"
+msgstr ""
+
+msgid "Select labels"
+msgstr ""
+
+msgid "Select merge moment"
+msgstr ""
+
+msgid "Select milestone"
+msgstr ""
+
+msgid "Select private project"
+msgstr ""
+
+msgid "Select project"
+msgstr ""
+
+msgid "Select project and zone to choose machine type"
+msgstr ""
+
+msgid "Select project to choose zone"
+msgstr ""
+
+msgid "Select project to create %{type}"
+msgstr ""
+
+msgid "Select project to create issue"
+msgstr ""
+
+msgid "Select projects"
+msgstr ""
+
+msgid "Select reviewer(s)"
+msgstr ""
+
+msgid "Select shards to replicate"
+msgstr ""
+
+msgid "Select source"
+msgstr ""
+
+msgid "Select source branch"
+msgstr ""
+
+msgid "Select start date"
+msgstr ""
+
+msgid "Select status"
+msgstr ""
+
+msgid "Select strategy activation method"
+msgstr ""
+
+msgid "Select subgroup"
+msgstr ""
+
+msgid "Select subscription"
+msgstr ""
+
+msgid "Select target branch"
+msgstr ""
+
+msgid "Select target branch or tag"
+msgstr ""
+
+msgid "Select timezone"
+msgstr ""
+
+msgid "Select type"
+msgstr ""
+
+msgid "Selected"
+msgstr ""
+
+msgid "Selected commits"
+msgstr ""
+
+msgid "Selected levels cannot be used by non-admin users for groups, projects or snippets. If the public level is restricted, user profiles are only visible to logged in users."
+msgstr ""
+
+msgid "Selected projects"
+msgstr ""
+
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By %{link_open}@johnsmith%{link_close}\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
+msgid "Self monitoring"
+msgstr ""
+
+msgid "Self monitoring project does not exist"
+msgstr ""
+
+msgid "Self-monitoring project does not exist. Please check logs for any error messages"
+msgstr ""
+
+msgid "Self-monitoring project has been successfully deleted"
+msgstr ""
+
+msgid "Self-monitoring project was not deleted. Please check logs for any error messages"
+msgstr ""
+
+msgid "SelfMonitoring|Activate or deactivate instance self monitoring."
+msgstr ""
+
+msgid "SelfMonitoring|Activate self monitoring to create a project to use to monitor the health of your instance."
+msgstr ""
+
+msgid "SelfMonitoring|Deactivate self monitoring?"
+msgstr ""
+
+msgid "SelfMonitoring|Deactivating self monitoring deletes the self monitoring project. Are you sure you want to deactivate self monitoring and delete the project?"
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring"
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring is active. Use the %{projectLinkStart}self monitoring project%{projectLinkEnd} to monitor the health of your instance."
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring project successfully created."
+msgstr ""
+
+msgid "SelfMonitoring|Self monitoring project successfully deleted."
+msgstr ""
+
+msgid "Send"
+msgstr ""
+
+msgid "Send a single email notification to Owners and Maintainers for new alerts."
+msgstr ""
+
+msgid "Send confirmation email"
+msgstr ""
+
+msgid "Send email"
+msgstr ""
+
+msgid "Send email in multipart format (HTML and plain text). Uncheck to send email messages in plain text only."
+msgstr ""
+
+msgid "Send email notification"
+msgstr ""
+
+msgid "Send emails to help guide new users through the onboarding process."
+msgstr ""
+
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
+msgid "Send message"
+msgstr ""
+
+msgid "Send notifications about project events to Mattermost channels."
+msgstr ""
+
+msgid "Send notifications about project events to Mattermost channels. %{docs_link}"
+msgstr ""
+
+msgid "Send notifications about project events to a Discord channel. %{docs_link}"
+msgstr ""
+
+msgid "Send report"
+msgstr ""
+
+msgid "Send service data"
+msgstr ""
+
+msgid "Sentry"
+msgstr ""
+
+msgid "Sentry API URL"
+msgstr ""
+
+msgid "Sentry event"
+msgstr ""
+
+msgid "Sep"
+msgstr ""
+
+msgid "September"
+msgstr ""
+
+msgid "SeriesFinalConjunction|and"
+msgstr ""
+
+msgid "Serve repository static objects (for example, archives and blobs) from external storage."
+msgstr ""
+
+msgid "Server (optional)"
+msgstr ""
+
+msgid "Server supports batch API only, please update your Git LFS client to version 1.0.1 and up."
+msgstr ""
+
+msgid "Server version"
+msgstr ""
+
+msgid "Serverless"
+msgstr ""
+
+msgid "Serverless platform"
+msgstr ""
+
+msgid "ServerlessDetails|Configure cluster."
+msgstr ""
+
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
+msgstr ""
+
+msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
+msgstr ""
+
+msgid "ServerlessDetails|Invocations"
+msgstr ""
+
+msgid "ServerlessDetails|Kubernetes Pods"
+msgstr ""
+
+msgid "ServerlessDetails|More information"
+msgstr ""
+
+msgid "ServerlessDetails|No pods loaded at this time."
+msgstr ""
+
+msgid "ServerlessDetails|Number of Kubernetes pods in use over time based on necessity."
+msgstr ""
+
+msgid "ServerlessDetails|pod in use"
+msgstr ""
+
+msgid "ServerlessDetails|pods in use"
+msgstr ""
+
+msgid "ServerlessURL|Copy URL"
+msgstr ""
+
+msgid "Serverless|Getting started with serverless"
+msgstr ""
+
+msgid "Serverless|If you believe none of these apply, please check back later as the function data may be in the process of becoming available."
+msgstr ""
+
+msgid "Serverless|Learn more about Serverless"
+msgstr ""
+
+msgid "Serverless|No functions available"
+msgstr ""
+
+msgid "Serverless|Serverless was %{linkStart}deprecated%{linkEnd} in GitLab 14.3."
+msgstr ""
+
+msgid "Serverless|Serverless was %{postLinkStart}deprecated%{postLinkEnd}. But if you opt to use it, you must install Knative in your Kubernetes cluster first. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "Serverless|The deploy job has not finished."
+msgstr ""
+
+msgid "Serverless|The functions listed in the %{startTag}serverless.yml%{endTag} file don't match the namespace of your cluster."
+msgstr ""
+
+msgid "Serverless|There is currently no function data available from Knative. This could be for a variety of reasons including:"
+msgstr ""
+
+msgid "Serverless|Your %{startTag}.gitlab-ci.yml%{endTag} file is not properly configured."
+msgstr ""
+
+msgid "Serverless|Your repository does not have a corresponding %{startTag}serverless.yml%{endTag} file."
+msgstr ""
+
+msgid "Service"
+msgstr ""
+
+msgid "Service Account"
+msgstr ""
+
+msgid "Service Account Key"
+msgstr ""
+
+msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
+msgstr ""
+
+msgid "Service Desk"
+msgstr ""
+
+msgid "Service Desk allows people to create issues in your GitLab instance without their own user account. It provides a unique email address for end users to create issues in a project. Replies can be sent either through the GitLab interface or by email. End users only see threads through email."
+msgstr ""
+
+msgid "Service account generated successfully"
+msgstr ""
+
+msgid "Service accounts"
+msgstr ""
+
+msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgstr ""
+
+msgid "Service usage data"
+msgstr ""
+
+msgid "ServiceDesk|Enable Service Desk"
+msgstr ""
+
+msgid "ServiceDesk|For help setting up the Service Desk for your instance, please contact an administrator."
+msgstr ""
+
+msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
+msgstr ""
+
+msgid "ServiceDesk|Service Desk is not enabled"
+msgstr ""
+
+msgid "ServiceDesk|Service Desk is not supported"
+msgstr ""
+
+msgid "ServiceDesk|To enable Service Desk on this instance, an instance administrator must first set up incoming email."
+msgstr ""
+
+msgid "ServiceDesk|Use Service Desk to connect with your users and offer customer support through email right inside GitLab"
+msgstr ""
+
+msgid "ServiceDesk|Your users can send emails to this address:"
+msgstr ""
+
+msgid "ServicePing|Service ping is off"
+msgstr ""
+
+msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
+msgstr ""
+
+msgid "ServicePing|Turn on service ping"
+msgstr ""
+
+msgid "ServicePing|Turn on service ping to review instance-level analytics."
+msgstr ""
+
+msgid "Services"
+msgstr ""
+
+msgid "Session ID"
+msgstr ""
+
+msgid "Session duration (minutes)"
+msgstr ""
+
+msgid "Set %{epic_ref} as the parent epic."
+msgstr ""
+
+msgid "Set a default description template to be used for new issues. %{link_start}What are description templates?%{link_end}"
+msgstr ""
+
+msgid "Set a password on your account to pull or push via %{protocol}."
+msgstr ""
+
+msgid "Set access permissions for this token."
+msgstr ""
+
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
+msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
+msgstr ""
+
+msgid "Set due date"
+msgstr ""
+
+msgid "Set health status"
+msgstr ""
+
+msgid "Set health status to %{health_status}."
+msgstr ""
+
+msgid "Set iteration"
+msgstr ""
+
+msgid "Set limit to 0 to allow any file size."
+msgstr ""
+
+msgid "Set limits for web and API requests."
+msgstr ""
+
+msgid "Set milestone"
+msgstr ""
+
+msgid "Set new password"
+msgstr ""
+
+msgid "Set parent epic to an epic"
+msgstr ""
+
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
+msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
+msgstr ""
+
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
+msgid "Set severity"
+msgstr ""
+
+msgid "Set sign-in restrictions for all users."
+msgstr ""
+
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
+msgid "Set target branch"
+msgstr ""
+
+msgid "Set target branch to %{branch_name}."
+msgstr ""
+
+msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
+msgstr ""
+
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
+msgid "Set the due date to %{due_date}."
+msgstr ""
+
+msgid "Set the iteration to %{iteration_reference}."
+msgstr ""
+
+msgid "Set the maximum number of slices allowed to run concurrently during Elasticsearch reindexing. Learn more about %{max_slices_running_link_start}maximum running slices configuration%{max_slices_link_end}."
+msgstr ""
+
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
+msgid "Set the milestone to %{milestone_reference}."
+msgstr ""
+
+msgid "Set the per-user rate limit for getting a user by ID via the API."
+msgstr ""
+
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
+msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
+msgstr ""
+
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
+msgid "Set time estimate"
+msgstr ""
+
+msgid "Set time estimate to %{time_estimate}."
+msgstr ""
+
+msgid "Set up CI/CD"
+msgstr ""
+
+msgid "Set up Jira Integration"
+msgstr ""
+
+msgid "Set up a %{type} runner for a project"
+msgstr ""
+
+msgid "Set up a hardware device as a second factor to sign in."
+msgstr ""
+
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
+msgid "Set up new device"
+msgstr ""
+
+msgid "Set up new password"
+msgstr ""
+
+msgid "Set up shared runner availability"
+msgstr ""
+
+msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically."
+msgstr ""
+
+msgid "Set verification limit and frequency."
+msgstr ""
+
+msgid "Set weight"
+msgstr ""
+
+msgid "Set weight to %{weight}."
+msgstr ""
+
+msgid "Set what should be replicated by this secondary site."
+msgstr ""
+
+msgid "SetStatusModal|An indicator appears next to your name and avatar"
+msgstr ""
+
+msgid "SetStatusModal|Busy"
+msgstr ""
+
+msgid "SetStatusModal|Clear status"
+msgstr ""
+
+msgid "SetStatusModal|Clear status after"
+msgstr ""
+
+msgid "SetStatusModal|Edit status"
+msgstr ""
+
+msgid "SetStatusModal|Remove status"
+msgstr ""
+
+msgid "SetStatusModal|Set a status"
+msgstr ""
+
+msgid "SetStatusModal|Set status"
+msgstr ""
+
+msgid "SetStatusModal|Sorry, we weren't able to set your status. Please try again later."
+msgstr ""
+
+msgid "SetStatusModal|Status updated"
+msgstr ""
+
+msgid "SetStatusModal|What's your status?"
+msgstr ""
+
+msgid "SetStatusModal|Your status resets on %{date}."
+msgstr ""
+
+msgid "Sets %{epic_ref} as parent epic."
+msgstr ""
+
+msgid "Sets health status to %{health_status}."
+msgstr ""
+
+msgid "Sets target branch to %{branch_name}."
+msgstr ""
+
+msgid "Sets the due date to %{due_date}."
+msgstr ""
+
+msgid "Sets the iteration to %{iteration_reference}."
+msgstr ""
+
+msgid "Sets the milestone to %{milestone_reference}."
+msgstr ""
+
+msgid "Sets the severity"
+msgstr ""
+
+msgid "Sets time estimate to %{time_estimate}."
+msgstr ""
+
+msgid "Sets weight to %{weight}."
+msgstr ""
+
+msgid "Setting"
+msgstr ""
+
+msgid "Setting enforced"
+msgstr ""
+
+msgid "Setting saved successfully"
+msgid_plural "Settings saved successfully"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Settings"
+msgstr ""
+
+msgid "Settings|Unable to load the merge request options settings. Try reloading the page."
+msgstr ""
+
+msgid "Setup"
+msgstr ""
+
+msgid "Severity"
+msgstr ""
+
+msgid "Severity updated to %{severity}."
+msgstr ""
+
+msgid "SeverityWidget|Severity"
+msgstr ""
+
+msgid "SeverityWidget|Severity: %{severity}"
+msgstr ""
+
+msgid "SeverityWidget|There was an error while updating severity."
+msgstr ""
+
+msgid "Shards to synchronize"
+msgstr ""
+
+msgid "Share"
+msgstr ""
+
+msgid "Share the %{strong_open}GitLab single sign-on URL%{strong_close} with members so they can sign in to your group through your identity provider"
+msgstr ""
+
+msgid "Shared Runners"
+msgstr ""
+
+msgid "Shared projects"
+msgstr ""
+
+msgid "Shared runners"
+msgstr ""
+
+msgid "Shared runners are disabled for the parent group"
+msgstr ""
+
+msgid "Shared runners are disabled on group level"
+msgstr ""
+
+msgid "Shared runners details"
+msgstr ""
+
+msgid "Shared runners enabled cannot be enabled until a valid credit card is on file"
+msgstr ""
+
+msgid "Shared runners help link"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Shimo|Go to Shimo Workspace"
+msgstr ""
+
+msgid "Shimo|Link to a Shimo Workspace from the sidebar."
+msgstr ""
+
+msgid "Shimo|Shimo"
+msgstr ""
+
+msgid "Shimo|Shimo Workspace"
+msgstr ""
+
+msgid "Shimo|Shimo Workspace URL"
+msgstr ""
+
+msgid "Shimo|Shimo Workspace integration is enabled"
+msgstr ""
+
+msgid "Shimo|You've enabled the Shimo Workspace integration. You can view your wiki directly in Shimo."
+msgstr ""
+
+msgid "Should you ever lose your phone or access to your one time password secret, each of these recovery codes can be used one time each to regain access to your account. Please save them in a safe place, or you %{boldStart}will%{boldEnd} lose access to your account."
+msgstr ""
+
+msgid "Show Pipeline ID"
+msgstr ""
+
+msgid "Show Pipeline IID"
+msgstr ""
+
+msgid "Show all %{issuable_type}."
+msgstr ""
+
+msgid "Show all activity"
+msgstr ""
+
+msgid "Show all breadcrumbs"
+msgstr ""
+
+msgid "Show all epics"
+msgstr ""
+
+msgid "Show all issues."
+msgstr ""
+
+msgid "Show all milestones"
+msgstr ""
+
+msgid "Show all test cases."
+msgstr ""
+
+msgid "Show archived projects"
+msgstr ""
+
+msgid "Show archived projects only"
+msgstr ""
+
+msgid "Show closed epics"
+msgstr ""
+
+msgid "Show command"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Show comments on this file"
+msgstr ""
+
+msgid "Show comments only"
+msgstr ""
+
+msgid "Show complete raw log"
+msgstr ""
+
+msgid "Show details"
+msgstr ""
+
+msgid "Show file browser"
+msgstr ""
+
+msgid "Show file contents"
+msgstr ""
+
+msgid "Show group milestones"
+msgstr ""
+
+msgid "Show labels"
+msgstr ""
+
+msgid "Show latest version"
+msgstr ""
+
+msgid "Show list"
+msgstr ""
+
+msgid "Show one file at a time"
+msgstr ""
+
+msgid "Show open epics"
+msgstr ""
+
+msgid "Show project milestones"
+msgstr ""
+
+msgid "Show sub-group milestones"
+msgstr ""
+
+msgid "Show the Closed list"
+msgstr ""
+
+msgid "Show the Open list"
+msgstr ""
+
+msgid "Show thread"
+msgstr ""
+
+msgid "Show whitespace changes"
+msgstr ""
+
+msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
+msgstr ""
+
+msgid "Showing %{count} of %{total} projects"
+msgstr ""
+
+msgid "Showing %{count} project"
+msgid_plural "Showing %{count} projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Showing %{limit} of %{total_count} issues. "
+msgstr ""
+
+msgid "Showing %{pageSize} of %{total} %{issuableType}"
+msgstr ""
+
+msgid "Showing all epics"
+msgstr ""
+
+msgid "Showing all issues"
+msgstr ""
+
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
+msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
+msgstr ""
+
+msgid "Showing graphs based on events of the last %{timerange} days."
+msgstr ""
+
+msgid "Showing last %{size} of log -"
+msgstr ""
+
+msgid "Showing latest version"
+msgstr ""
+
+msgid "Showing version #%{versionNumber}"
+msgstr ""
+
+msgid "Side-by-side"
+msgstr ""
+
+msgid "Sidebar|%{name}: %{value}"
+msgstr ""
+
+msgid "Sidebar|Assign health status"
+msgstr ""
+
+msgid "Sidebar|Health status"
+msgstr ""
+
+msgid "Sidebar|No status"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in as a user with the matching email address, add the email to this account, or sign-up for a new account using the matching email."
+msgstr ""
+
+msgid "Sign in preview"
+msgstr ""
+
+msgid "Sign in to \"%{group_name}\""
+msgstr ""
+
+msgid "Sign in to GitLab"
+msgstr ""
+
+msgid "Sign in using smart card"
+msgstr ""
+
+msgid "Sign in via 2FA code"
+msgstr ""
+
+msgid "Sign in with"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
+msgid "Sign in with smart card"
+msgstr ""
+
+msgid "Sign in/Sign up pages"
+msgstr ""
+
+msgid "Sign out"
+msgstr ""
+
+msgid "Sign out & Register"
+msgstr ""
+
+msgid "Sign up"
+msgstr ""
+
+msgid "Sign up now"
+msgstr ""
+
+msgid "Sign up was successful! Please confirm your email to sign in."
+msgstr ""
+
+msgid "Sign-in and Help page"
+msgstr ""
+
+msgid "Sign-in count:"
+msgstr ""
+
+msgid "Sign-in page"
+msgstr ""
+
+msgid "Sign-in restrictions"
+msgstr ""
+
+msgid "Sign-in text"
+msgstr ""
+
+msgid "Sign-out page URL"
+msgstr ""
+
+msgid "Sign-up restrictions"
+msgstr ""
+
+msgid "SignUp|By clicking %{button_text}, I agree that I have read and accepted the %{link_start}Terms of Use and Privacy Policy%{link_end}"
+msgstr ""
+
+msgid "SignUp|By clicking %{button_text}, I agree that I have read and accepted the GitLab %{link_start}Terms of Use and Privacy Policy%{link_end}"
+msgstr ""
+
+msgid "SignUp|First name is too long (maximum is %{max_length} characters)."
+msgstr ""
+
+msgid "SignUp|Last name is too long (maximum is %{max_length} characters)."
+msgstr ""
+
+msgid "SignUp|Minimum length is %{minimum_password_length} characters."
+msgstr ""
+
+msgid "SignUp|Username is too long (maximum is %{max_length} characters)."
+msgstr ""
+
+msgid "SignUp|Username is too short (minimum is %{min_length} characters)."
+msgstr ""
+
+msgid "Signed in"
+msgstr ""
+
+msgid "Signed in to GitLab"
+msgstr ""
+
+msgid "Signed in to GitLab as %{user_link}"
+msgstr ""
+
+msgid "Signed in with %{authentication} authentication"
+msgstr ""
+
+msgid "Signing in using %{label} has been disabled"
+msgstr ""
+
+msgid "Signing in using your %{label} account without a pre-existing GitLab account is not allowed."
+msgstr ""
+
+msgid "Similar issues"
+msgstr ""
+
+msgid "Simulate a pipeline created for the default branch"
+msgstr ""
+
+msgid "Site profile failed to delete"
+msgstr ""
+
+msgid "Site profile not found for given parameters"
+msgstr ""
+
+msgid "Sites"
+msgstr ""
+
+msgid "Size"
+msgstr ""
+
+msgid "Size Limits"
+msgstr ""
+
+msgid "Size limit per repository (MB)"
+msgstr ""
+
+msgid "Skip outdated deployment jobs"
+msgstr ""
+
+msgid "Skipped"
+msgstr ""
+
+msgid "Skipped deployment to"
+msgstr ""
+
+msgid "Skype:"
+msgstr ""
+
+msgid "Slack application"
+msgstr ""
+
+msgid "Slack integration allows you to interact with GitLab via slash commands in a chat window."
+msgstr ""
+
+msgid "Slack logo"
+msgstr ""
+
+msgid "SlackIntegration|Are you sure you want to remove this project from the Slack application?"
+msgstr ""
+
+msgid "SlackIntegration|GitLab for Slack"
+msgstr ""
+
+msgid "SlackIntegration|GitLab for Slack was successfully installed."
+msgstr ""
+
+msgid "SlackIntegration|Project alias"
+msgstr ""
+
+msgid "SlackIntegration|Remove project"
+msgstr ""
+
+msgid "SlackIntegration|Select a GitLab project to link with your Slack workspace."
+msgstr ""
+
+msgid "SlackIntegration|Sends notifications about project events to Slack channels."
+msgstr ""
+
+msgid "SlackIntegration|Team name"
+msgstr ""
+
+msgid "SlackIntegration|To set up this integration press \"Add to Slack\""
+msgstr ""
+
+msgid "SlackIntegration|You can now close this window and go to your Slack workspace."
+msgstr ""
+
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
+msgstr ""
+
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
+msgstr ""
+
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
+msgstr ""
+
+msgid "SlackService|Fill in the word that works best for your team."
+msgstr ""
+
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
+msgstr ""
+
+msgid "Slice multiplier"
+msgstr ""
+
+msgid "Smartcard"
+msgstr ""
+
+msgid "Smartcard authentication failed: client certificate header is missing."
+msgstr ""
+
+msgid "Snippet"
+msgstr ""
+
+msgid "Snippets"
+msgstr ""
+
+msgid "Snippets with non-text files can only be edited via Git."
+msgstr ""
+
+msgid "SnippetsEmptyState|Code snippets"
+msgstr ""
+
+msgid "SnippetsEmptyState|Documentation"
+msgstr ""
+
+msgid "SnippetsEmptyState|New snippet"
+msgstr ""
+
+msgid "SnippetsEmptyState|No snippets found"
+msgstr ""
+
+msgid "SnippetsEmptyState|Store, share, and embed small pieces of code and text."
+msgstr ""
+
+msgid "SnippetsEmptyState|There are no snippets to show."
+msgstr ""
+
+msgid "Snippets|%{spammable_titlecase} was submitted to Akismet successfully."
+msgstr ""
+
+msgid "Snippets|Add another file %{num}/%{total}"
+msgstr ""
+
+msgid "Snippets|Delete file"
+msgstr ""
+
+msgid "Snippets|Description (optional)"
+msgstr ""
+
+msgid "Snippets|Error with Akismet. Please check the logs for more info."
+msgstr ""
+
+msgid "Snippets|Files"
+msgstr ""
+
+msgid "Snippets|Give your file a name to add code highlighting, e.g. example.rb for Ruby"
+msgstr ""
+
+msgid "Snippets|Optionally add a description about what your snippet does or how to use it…"
+msgstr ""
+
+msgid "Snowplow"
+msgstr ""
+
+msgid "Solution"
+msgstr ""
+
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
+msgid "Some changes are not shown"
+msgstr ""
+
+msgid "Some child epics may be hidden due to applied filters"
+msgstr ""
+
+msgid "Some common domains are not allowed. %{learn_more_link}."
+msgstr ""
+
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
+msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
+msgid "Someone edited this %{issueType} at the same time you did. The description has been updated and you will need to make your changes again."
+msgstr ""
+
+msgid "Someone edited this merge request at the same time you did. Please refresh the page to see changes."
+msgstr ""
+
+msgid "Someone edited this test case at the same time you did. The description has been updated and you will need to make your changes again."
+msgstr ""
+
+msgid "Someone, hopefully you, has requested to reset the password for your GitLab account on %{link_to_gitlab}."
+msgstr ""
+
+msgid "Something went wrong"
+msgstr ""
+
+msgid "Something went wrong on our end"
+msgstr ""
+
+msgid "Something went wrong on our end."
+msgstr ""
+
+msgid "Something went wrong on our end. Please try again!"
+msgstr ""
+
+msgid "Something went wrong on our end. Please try again."
+msgstr ""
+
+msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
+msgstr ""
+
+msgid "Something went wrong trying to load issue contacts."
+msgstr ""
+
+msgid "Something went wrong when reordering designs. Please try again"
+msgstr ""
+
+msgid "Something went wrong while adding your award. Please try again."
+msgstr ""
+
+msgid "Something went wrong while applying the batch of suggestions. Please try again."
+msgstr ""
+
+msgid "Something went wrong while applying the suggestion. Please try again."
+msgstr ""
+
+msgid "Something went wrong while archiving a requirement."
+msgstr ""
+
+msgid "Something went wrong while closing the epic. Please try again later."
+msgstr ""
+
+msgid "Something went wrong while closing the merge request. Please try again later."
+msgstr ""
+
+msgid "Something went wrong while creating a requirement."
+msgstr ""
+
+msgid "Something went wrong while deleting description changes. Please try again."
+msgstr ""
+
+msgid "Something went wrong while deleting the source branch. Please try again."
+msgstr ""
+
+msgid "Something went wrong while deleting your note. Please try again."
+msgstr ""
+
+msgid "Something went wrong while deploying this environment. Please try again."
+msgstr ""
+
+msgid "Something went wrong while editing your comment. Please try again."
+msgstr ""
+
+msgid "Something went wrong while exporting requirements"
+msgstr ""
+
+msgid "Something went wrong while fetching branches"
+msgstr ""
+
+msgid "Something went wrong while fetching comments. Please try again."
+msgstr ""
+
+msgid "Something went wrong while fetching description changes. Please try again."
+msgstr ""
+
+msgid "Something went wrong while fetching details"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
+msgid "Something went wrong while fetching latest comments."
+msgstr ""
+
+msgid "Something went wrong while fetching projects"
+msgstr ""
+
+msgid "Something went wrong while fetching projects."
+msgstr ""
+
+msgid "Something went wrong while fetching related merge requests."
+msgstr ""
+
+msgid "Something went wrong while fetching requirements count."
+msgstr ""
+
+msgid "Something went wrong while fetching requirements list."
+msgstr ""
+
+msgid "Something went wrong while fetching source branches."
+msgstr ""
+
+msgid "Something went wrong while fetching the environments for this merge request. Please try again."
+msgstr ""
+
+msgid "Something went wrong while fetching the packages list."
+msgstr ""
+
+msgid "Something went wrong while initializing the OpenAPI viewer"
+msgstr ""
+
+msgid "Something went wrong while inserting your image. Please try again."
+msgstr ""
+
+msgid "Something went wrong while obtaining the Let's Encrypt certificate."
+msgstr ""
+
+msgid "Something went wrong while promoting the issue to an epic. Please try again."
+msgstr ""
+
+msgid "Something went wrong while reopening a requirement."
+msgstr ""
+
+msgid "Something went wrong while reopening the epic. Please try again later."
+msgstr ""
+
+msgid "Something went wrong while reopening the merge request. Please try again later."
+msgstr ""
+
+msgid "Something went wrong while resolving this discussion. Please try again."
+msgstr ""
+
+msgid "Something went wrong while setting %{issuableType} %{dateType} date."
+msgstr ""
+
+msgid "Something went wrong while setting %{issuableType} confidentiality."
+msgstr ""
+
+msgid "Something went wrong while setting %{issuableType} health status."
+msgstr ""
+
+msgid "Something went wrong while setting %{issuableType} notifications."
+msgstr ""
+
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
+msgid "Something went wrong while setting %{issuableType} weight."
+msgstr ""
+
+msgid "Something went wrong while stopping this environment. Please try again."
+msgstr ""
+
+msgid "Something went wrong while updating a requirement."
+msgstr ""
+
+msgid "Something went wrong while updating assignees"
+msgstr ""
+
+msgid "Something went wrong while updating your list settings"
+msgstr ""
+
+msgid "Something went wrong with your automatic subscription renewal."
+msgstr ""
+
+msgid "Something went wrong, unable to add %{project} to dashboard"
+msgstr ""
+
+msgid "Something went wrong, unable to add projects to dashboard"
+msgstr ""
+
+msgid "Something went wrong, unable to delete project"
+msgstr ""
+
+msgid "Something went wrong, unable to get projects"
+msgstr ""
+
+msgid "Something went wrong, unable to search projects"
+msgstr ""
+
+msgid "Something went wrong. Please try again later"
+msgstr ""
+
+msgid "Something went wrong. Please try again."
+msgstr ""
+
+msgid "Something went wrong. Try again later."
+msgstr ""
+
+msgid "Sorry, no projects matched your search"
+msgstr ""
+
+msgid "Sorry, you have exceeded the maximum browsable page number. Please use the API to explore further."
+msgstr ""
+
+msgid "Sorry, your filter produced no results"
+msgstr ""
+
+msgid "Sort by"
+msgstr ""
+
+msgid "Sort direction"
+msgstr ""
+
+msgid "Sort direction: Ascending"
+msgstr ""
+
+msgid "Sort direction: Descending"
+msgstr ""
+
+msgid "SortOptions|Blocking"
+msgstr ""
+
+msgid "SortOptions|Closed date"
+msgstr ""
+
+msgid "SortOptions|Closed earlier"
+msgstr ""
+
+msgid "SortOptions|Closed recently"
+msgstr ""
+
+msgid "SortOptions|Created date"
+msgstr ""
+
+msgid "SortOptions|Due date"
+msgstr ""
+
+msgid "SortOptions|Due later"
+msgstr ""
+
+msgid "SortOptions|Due soon"
+msgstr ""
+
+msgid "SortOptions|Expired date"
+msgstr ""
+
+msgid "SortOptions|Label priority"
+msgstr ""
+
+msgid "SortOptions|Largest group"
+msgstr ""
+
+msgid "SortOptions|Largest repository"
+msgstr ""
+
+msgid "SortOptions|Last Contact"
+msgstr ""
+
+msgid "SortOptions|Last created"
+msgstr ""
+
+msgid "SortOptions|Least popular"
+msgstr ""
+
+msgid "SortOptions|Less weight"
+msgstr ""
+
+msgid "SortOptions|Manual"
+msgstr ""
+
+msgid "SortOptions|Merged date"
+msgstr ""
+
+msgid "SortOptions|Merged earlier"
+msgstr ""
+
+msgid "SortOptions|Merged recently"
+msgstr ""
+
+msgid "SortOptions|Milestone due date"
+msgstr ""
+
+msgid "SortOptions|Milestone due later"
+msgstr ""
+
+msgid "SortOptions|Milestone due soon"
+msgstr ""
+
+msgid "SortOptions|More weight"
+msgstr ""
+
+msgid "SortOptions|Most popular"
+msgstr ""
+
+msgid "SortOptions|Most stars"
+msgstr ""
+
+msgid "SortOptions|Name"
+msgstr ""
+
+msgid "SortOptions|Name, ascending"
+msgstr ""
+
+msgid "SortOptions|Name, descending"
+msgstr ""
+
+msgid "SortOptions|Oldest created"
+msgstr ""
+
+msgid "SortOptions|Oldest last activity"
+msgstr ""
+
+msgid "SortOptions|Oldest sign in"
+msgstr ""
+
+msgid "SortOptions|Oldest starred"
+msgstr ""
+
+msgid "SortOptions|Oldest updated"
+msgstr ""
+
+msgid "SortOptions|Popularity"
+msgstr ""
+
+msgid "SortOptions|Priority"
+msgstr ""
+
+msgid "SortOptions|Project"
+msgstr ""
+
+msgid "SortOptions|Recent last activity"
+msgstr ""
+
+msgid "SortOptions|Recent sign in"
+msgstr ""
+
+msgid "SortOptions|Recently starred"
+msgstr ""
+
+msgid "SortOptions|Size"
+msgstr ""
+
+msgid "SortOptions|Sort by:"
+msgstr ""
+
+msgid "SortOptions|Sort direction"
+msgstr ""
+
+msgid "SortOptions|Stars"
+msgstr ""
+
+msgid "SortOptions|Start date"
+msgstr ""
+
+msgid "SortOptions|Start later"
+msgstr ""
+
+msgid "SortOptions|Start soon"
+msgstr ""
+
+msgid "SortOptions|Title"
+msgstr ""
+
+msgid "SortOptions|Type"
+msgstr ""
+
+msgid "SortOptions|Version"
+msgstr ""
+
+msgid "SortOptions|Weight"
+msgstr ""
+
+msgid "Source"
+msgstr ""
+
+msgid "Source (branch or tag)"
+msgstr ""
+
+msgid "Source Branch"
+msgstr ""
+
+msgid "Source IP"
+msgstr ""
+
+msgid "Source branch"
+msgstr ""
+
+msgid "Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}"
+msgstr ""
+
+msgid "Source code (%{fileExtension})"
+msgstr ""
+
+msgid "Source is not available"
+msgstr ""
+
+msgid "Source project cannot be found."
+msgstr ""
+
+msgid "SourceEditor|\"el\" parameter is required for createInstance()"
+msgstr ""
+
+msgid "SourceEditor|%{name} is not registered."
+msgstr ""
+
+msgid "SourceEditor|Extension definition should be either a class or a function"
+msgstr ""
+
+msgid "SourceEditor|Extension definition should be either class, function, or an Array of definitions."
+msgstr ""
+
+msgid "SourceEditor|Extensions Store is required to check for an extension."
+msgstr ""
+
+msgid "SourceEditor|Name conflict for \"%{prop}()\" method."
+msgstr ""
+
+msgid "SourceEditor|No extension for unuse has been specified."
+msgstr ""
+
+msgid "SourceEditor|Source Editor instance is required to set up an extension."
+msgstr ""
+
+msgid "SourceEditor|`definition` property is expected on the extension."
+msgstr ""
+
+msgid "Sourcegraph"
+msgstr ""
+
+msgid "SourcegraphAdmin|Block on private and internal projects"
+msgstr ""
+
+msgid "SourcegraphAdmin|Configure the URL to a Sourcegraph instance which can read your GitLab projects."
+msgstr ""
+
+msgid "SourcegraphAdmin|Enable Sourcegraph"
+msgstr ""
+
+msgid "SourcegraphAdmin|Enable code intelligence powered by %{link_start}Sourcegraph%{link_end} on your GitLab instance's code views and merge requests."
+msgstr ""
+
+msgid "SourcegraphAdmin|Learn more."
+msgstr ""
+
+msgid "SourcegraphAdmin|Only public projects have code intelligence enabled and communicate with Sourcegraph."
+msgstr ""
+
+msgid "SourcegraphAdmin|Save changes"
+msgstr ""
+
+msgid "SourcegraphAdmin|Sourcegraph URL"
+msgstr ""
+
+msgid "SourcegraphAdmin|https://sourcegraph.example.com"
+msgstr ""
+
+msgid "SourcegraphPreferences|This feature is experimental and currently limited to certain projects."
+msgstr ""
+
+msgid "SourcegraphPreferences|This feature is experimental and limited to public projects."
+msgstr ""
+
+msgid "SourcegraphPreferences|This feature is experimental."
+msgstr ""
+
+msgid "SourcegraphPreferences|Uses %{linkStart}Sourcegraph.com%{linkEnd}."
+msgstr ""
+
+msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
+msgstr ""
+
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
+msgstr ""
+
+msgid "Spam Logs"
+msgstr ""
+
+msgid "Spam and Anti-bot Protection"
+msgstr ""
+
+msgid "Spam log successfully submitted as ham."
+msgstr ""
+
+msgid "Specific runners"
+msgstr ""
+
+msgid "Specified URL cannot be used: \"%{reason}\""
+msgstr ""
+
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
+
+msgid "Speed up your pipelines with Needs relationships"
+msgstr ""
+
+msgid "Spent At"
+msgstr ""
+
+msgid "Squash commit message"
+msgstr ""
+
+msgid "Squash commits"
+msgstr ""
+
+msgid "Stack trace"
+msgstr ""
+
+msgid "Stacktrace snippet"
+msgstr ""
+
+msgid "Stage"
+msgstr ""
+
+msgid "Standard"
+msgstr ""
+
+msgid "Star a label to make it a priority label. Order the prioritized labels to change their relative priority, by dragging."
+msgstr ""
+
+msgid "Star labels to start sorting by priority"
+msgstr ""
+
+msgid "Star toggle failed. Try again later."
+msgstr ""
+
+msgid "StarProject|Star"
+msgstr ""
+
+msgid "Starred Projects"
+msgstr ""
+
+msgid "Starred Projects' Activity"
+msgstr ""
+
+msgid "Starred projects"
+msgstr ""
+
+msgid "StarredProjectsEmptyState|Visit a project page and press on a star icon. Then, you can find the project on this page."
+msgstr ""
+
+msgid "StarredProjectsEmptyState|You don't have starred projects yet."
+msgstr ""
+
+msgid "Starrers"
+msgstr ""
+
+msgid "Stars"
+msgstr ""
+
+msgid "Start Date"
+msgstr ""
+
+msgid "Start Time"
+msgstr ""
+
+msgid "Start Web Terminal"
+msgstr ""
+
+msgid "Start a %{new_merge_request} with these changes"
+msgstr ""
+
+msgid "Start a Free Ultimate Trial"
+msgstr ""
+
+msgid "Start a new discussion…"
+msgstr ""
+
+msgid "Start a new merge request"
+msgstr ""
+
+msgid "Start a new merge request with these changes"
+msgstr ""
+
+msgid "Start a review"
+msgstr ""
+
+msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones and authors."
+msgstr ""
+
+msgid "Start cleanup"
+msgstr ""
+
+msgid "Start date"
+msgstr ""
+
+msgid "Start free trial"
+msgstr ""
+
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
+msgid "Start merge train"
+msgstr ""
+
+msgid "Start merge train when pipeline succeeds"
+msgstr ""
+
+msgid "Start merge train..."
+msgstr ""
+
+msgid "Start search"
+msgstr ""
+
+msgid "Start thread"
+msgstr ""
+
+msgid "Start your Free Ultimate Trial"
+msgstr ""
+
+msgid "Start your free trial"
+msgstr ""
+
+msgid "Started"
+msgstr ""
+
+msgid "Started %{startsIn}"
+msgstr ""
+
+msgid "Started asynchronous removal of all repository check states."
+msgstr ""
+
+msgid "Started escalation for this incident."
+msgstr ""
+
+msgid "Starting..."
+msgstr ""
+
+msgid "Starts"
+msgstr ""
+
+msgid "Starts %{startsIn}"
+msgstr ""
+
+msgid "Starts at (UTC)"
+msgstr ""
+
+msgid "Starts escalations for this incident"
+msgstr ""
+
+msgid "Starts on"
+msgstr ""
+
+msgid "Starts: %{startsAt}"
+msgstr ""
+
+msgid "State your message to activate"
+msgstr ""
+
+msgid "State/Province"
+msgstr ""
+
+msgid "State/Province/City"
+msgstr ""
+
+msgid "Static Application Security Testing (SAST)"
+msgstr ""
+
+msgid "StaticSiteEditor|1. Add a clear title to describe the change."
+msgstr ""
+
+msgid "StaticSiteEditor|2. Add a description to explain why the change is being made."
+msgstr ""
+
+msgid "StaticSiteEditor|3. Assign a person to review and accept the merge request."
+msgstr ""
+
+msgid "StaticSiteEditor|A link to view the merge request will appear once ready."
+msgstr ""
+
+msgid "StaticSiteEditor|An error occurred while submitting your changes."
+msgstr ""
+
+msgid "StaticSiteEditor|Automatic formatting changes"
+msgstr ""
+
+msgid "StaticSiteEditor|Branch could not be created."
+msgstr ""
+
+msgid "StaticSiteEditor|Copy update"
+msgstr ""
+
+msgid "StaticSiteEditor|Could not commit the content changes."
+msgstr ""
+
+msgid "StaticSiteEditor|Could not create merge request."
+msgstr ""
+
+msgid "StaticSiteEditor|Creating your merge request"
+msgstr ""
+
+msgid "StaticSiteEditor|Incompatible file content"
+msgstr ""
+
+msgid "StaticSiteEditor|Markdown formatting preferences introduced by the Static Site Editor"
+msgstr ""
+
+msgid "StaticSiteEditor|Return to site"
+msgstr ""
+
+msgid "StaticSiteEditor|Static site editor"
+msgstr ""
+
+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 ""
+
+msgid "StaticSiteEditor|To see your changes live you will need to do the following things:"
+msgstr ""
+
+msgid "StaticSiteEditor|Update %{sourcePath} file"
+msgstr ""
+
+msgid "StaticSiteEditor|View documentation"
+msgstr ""
+
+msgid "StaticSiteEditor|You can set an assignee to get your changes reviewed and deployed once your merge request is created."
+msgstr ""
+
+msgid "StaticSiteEditor|Your merge request has been created"
+msgstr ""
+
+msgid "Statistics"
+msgstr ""
+
+msgid "Status"
+msgstr ""
+
+msgid "Status was retried."
+msgstr ""
+
+msgid "Status:"
+msgstr ""
+
+msgid "Status: %{title}"
+msgstr ""
+
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
+msgid "StatusCheck|%{failed} failed"
+msgstr ""
+
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
+msgid "StatusCheck|API to check"
+msgstr ""
+
+msgid "StatusCheck|Add status check"
+msgstr ""
+
+msgid "StatusCheck|All passed"
+msgstr ""
+
+msgid "StatusCheck|An error occurred deleting the %{name} status check."
+msgstr ""
+
+msgid "StatusCheck|An error occurred fetching the status checks."
+msgstr ""
+
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
+msgstr ""
+
+msgid "StatusCheck|Check for a status response in merge requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "StatusCheck|Examples: QA, Security."
+msgstr ""
+
+msgid "StatusCheck|External API is already in use by another status check."
+msgstr ""
+
+msgid "StatusCheck|Failed to load status checks"
+msgstr ""
+
+msgid "StatusCheck|Failed to load status checks."
+msgstr ""
+
+msgid "StatusCheck|Invoke an external API as part of the pipeline process."
+msgstr ""
+
+msgid "StatusCheck|No status checks are defined yet."
+msgstr ""
+
+msgid "StatusCheck|Remove status check"
+msgstr ""
+
+msgid "StatusCheck|Remove status check?"
+msgstr ""
+
+msgid "StatusCheck|Service name"
+msgstr ""
+
+msgid "StatusCheck|Status checks"
+msgstr ""
+
+msgid "StatusCheck|Status checks all passed"
+msgstr ""
+
+msgid "StatusCheck|Status checks are being fetched"
+msgstr ""
+
+msgid "StatusCheck|Status to check"
+msgstr ""
+
+msgid "StatusCheck|Target branch"
+msgstr ""
+
+msgid "StatusCheck|Update status check"
+msgstr ""
+
+msgid "StatusCheck|You are about to remove the %{name} status check."
+msgstr ""
+
+msgid "StatusCheck|status checks"
+msgstr ""
+
+msgid "StatusPage|AWS %{docsLink}"
+msgstr ""
+
+msgid "StatusPage|AWS Secret access key"
+msgstr ""
+
+msgid "StatusPage|AWS access key ID"
+msgstr ""
+
+msgid "StatusPage|AWS region"
+msgstr ""
+
+msgid "StatusPage|Active"
+msgstr ""
+
+msgid "StatusPage|Bucket %{docsLink}"
+msgstr ""
+
+msgid "StatusPage|Configure file storage settings to link issues in this project to an external status page."
+msgstr ""
+
+msgid "StatusPage|S3 Bucket name"
+msgstr ""
+
+msgid "StatusPage|Status page"
+msgstr ""
+
+msgid "StatusPage|Status page URL"
+msgstr ""
+
+msgid "StatusPage|To publish incidents to an external status page, GitLab stores a JSON file in your Amazon S3 account at a location that your external status page service can access. Make sure to also set up %{docsLink}"
+msgstr ""
+
+msgid "StatusPage|configuration documentation"
+msgstr ""
+
+msgid "StatusPage|your status page frontend."
+msgstr ""
+
+msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
+msgstr ""
+
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
+msgid "Step 1."
+msgstr ""
+
+msgid "Step 2."
+msgstr ""
+
+msgid "Step 3."
+msgstr ""
+
+msgid "Step 4."
+msgstr ""
+
+msgid "Stop Terminal"
+msgstr ""
+
+msgid "Stop impersonation"
+msgstr ""
+
+msgid "Stop this environment"
+msgstr ""
+
+msgid "Stopped"
+msgstr ""
+
+msgid "Stopping..."
+msgstr ""
+
+msgid "Storage"
+msgstr ""
+
+msgid "Storage nodes for new repositories"
+msgstr ""
+
+msgid "Storage:"
+msgstr ""
+
+msgid "StorageSize|Unknown"
+msgstr ""
+
+msgid "Strikethrough"
+msgstr ""
+
+msgid "Strikethrough text"
+msgstr ""
+
+msgid "Subgroup information"
+msgstr ""
+
+msgid "Subgroup milestone"
+msgstr ""
+
+msgid "Subgroup navigation"
+msgstr ""
+
+msgid "SubgroupCreationLevel|Allowed to create subgroups"
+msgstr ""
+
+msgid "SubgroupCreationlevel|Allowed to create subgroups"
+msgstr ""
+
+msgid "SubgroupCreationlevel|Maintainers"
+msgstr ""
+
+msgid "SubgroupCreationlevel|Owners"
+msgstr ""
+
+msgid "Subgroups"
+msgstr ""
+
+msgid "Subgroups and projects"
+msgstr ""
+
+msgid "Subject Key Identifier:"
+msgstr ""
+
+msgid "Subkeys"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
+msgid "Submit a review"
+msgstr ""
+
+msgid "Submit as ham"
+msgstr ""
+
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit changes"
+msgstr ""
+
+msgid "Submit changes..."
+msgstr ""
+
+msgid "Submit feedback"
+msgstr ""
+
+msgid "Submit review"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
+msgid "Submit the current review."
+msgstr ""
+
+msgid "Submit your changes"
+msgstr ""
+
+msgid "Submitted as ham"
+msgstr ""
+
+msgid "Submitted the current review."
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
+msgid "Subscribe at group level"
+msgstr ""
+
+msgid "Subscribe at project level"
+msgstr ""
+
+msgid "Subscribe to RSS feed"
+msgstr ""
+
+msgid "Subscribe to calendar"
+msgstr ""
+
+msgid "Subscribed"
+msgstr ""
+
+msgid "Subscribed to this %{quick_action_target}."
+msgstr ""
+
+msgid "Subscribed to this project"
+msgstr ""
+
+msgid "Subscribes to this %{quick_action_target}."
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Subscription History"
+msgstr ""
+
+msgid "Subscription deletion failed."
+msgstr ""
+
+msgid "Subscription service outage"
+msgstr ""
+
+msgid "Subscription successfully applied to \"%{group_name}\""
+msgstr ""
+
+msgid "Subscription successfully created."
+msgstr ""
+
+msgid "Subscription successfully deleted."
+msgstr ""
+
+msgid "SubscriptionBanner|Add new license"
+msgstr ""
+
+msgid "SubscriptionBanner|Export license usage file"
+msgstr ""
+
+msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
+msgstr ""
+
+msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
+msgstr ""
+
+msgid "SubscriptionEmail|Dear %{customer_name},"
+msgstr ""
+
+msgid "SubscriptionEmail|GitLab Billing Team"
+msgstr ""
+
+msgid "SubscriptionEmail|Thank you for your business!"
+msgstr ""
+
+msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
+msgstr ""
+
+msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
+msgstr ""
+
+msgid "SubscriptionTable|Add seats"
+msgstr ""
+
+msgid "SubscriptionTable|An error occurred while loading the subscription details."
+msgstr ""
+
+msgid "SubscriptionTable|Billing"
+msgstr ""
+
+msgid "SubscriptionTable|Free"
+msgstr ""
+
+msgid "SubscriptionTable|GitLab allows you to continue using your subscription even if you exceed the number of seats you purchased. You will be required to pay for these seats upon renewal."
+msgstr ""
+
+msgid "SubscriptionTable|Last invoice"
+msgstr ""
+
+msgid "SubscriptionTable|Loading subscriptions"
+msgstr ""
+
+msgid "SubscriptionTable|Manage"
+msgstr ""
+
+msgid "SubscriptionTable|Max seats used"
+msgstr ""
+
+msgid "SubscriptionTable|Next invoice"
+msgstr ""
+
+msgid "SubscriptionTable|Refresh Seats"
+msgstr ""
+
+msgid "SubscriptionTable|Renew"
+msgstr ""
+
+msgid "SubscriptionTable|Seats currently in use"
+msgstr ""
+
+msgid "SubscriptionTable|Seats in subscription"
+msgstr ""
+
+msgid "SubscriptionTable|Seats owed"
+msgstr ""
+
+msgid "SubscriptionTable|See usage"
+msgstr ""
+
+msgid "SubscriptionTable|Something went wrong trying to refresh seats"
+msgstr ""
+
+msgid "SubscriptionTable|Subscription end date"
+msgstr ""
+
+msgid "SubscriptionTable|Subscription start date"
+msgstr ""
+
+msgid "SubscriptionTable|This is the last time the GitLab.com team was in contact with you to settle any outstanding balances."
+msgstr ""
+
+msgid "SubscriptionTable|This is the maximum number of users that have existed at the same time since this subscription started."
+msgstr ""
+
+msgid "SubscriptionTable|This is the next date when the GitLab.com team is scheduled to get in contact with you to settle any outstanding balances."
+msgstr ""
+
+msgid "SubscriptionTable|This is the number of seats you will be required to purchase if you update to a paid plan."
+msgstr ""
+
+msgid "SubscriptionTable|Trial"
+msgstr ""
+
+msgid "SubscriptionTable|Trial end date"
+msgstr ""
+
+msgid "SubscriptionTable|Trial start date"
+msgstr ""
+
+msgid "SubscriptionTable|Usage"
+msgstr ""
+
+msgid "SubscriptionTable|Usage count is performed once a day at 12:00 PM."
+msgstr ""
+
+msgid "Subscriptions"
+msgstr ""
+
+msgid "Subscriptions|Chat with sales"
+msgstr ""
+
+msgid "Subscriptions|Close"
+msgstr ""
+
+msgid "Subscriptions|Not ready to buy yet?"
+msgstr ""
+
+msgid "Subscriptions|Start a free trial"
+msgstr ""
+
+msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
+msgstr ""
+
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
+msgid "Subtracted"
+msgstr ""
+
+msgid "Subtracts"
+msgstr ""
+
+msgid "Succeeded"
+msgstr ""
+
+msgid "Successful purchase image"
+msgstr ""
+
+msgid "Successfully activated"
+msgstr ""
+
+msgid "Successfully approved"
+msgstr ""
+
+msgid "Successfully banned"
+msgstr ""
+
+msgid "Successfully blocked"
+msgstr ""
+
+msgid "Successfully confirmed"
+msgstr ""
+
+msgid "Successfully deactivated"
+msgstr ""
+
+msgid "Successfully deleted U2F device."
+msgstr ""
+
+msgid "Successfully deleted WebAuthn device."
+msgstr ""
+
+msgid "Successfully removed email."
+msgstr ""
+
+msgid "Successfully scheduled a pipeline to run. Go to the %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details."
+msgstr ""
+
+msgid "Successfully synced %{synced_timeago}."
+msgstr ""
+
+msgid "Successfully unbanned"
+msgstr ""
+
+msgid "Successfully unblocked"
+msgstr ""
+
+msgid "Successfully unlocked"
+msgstr ""
+
+msgid "Successfully updated %{last_updated_timeago}."
+msgstr ""
+
+msgid "Successfully updated the environment."
+msgstr ""
+
+msgid "Suggest code changes which can be immediately applied in one click. Try it out!"
+msgstr ""
+
+msgid "Suggested change"
+msgstr ""
+
+msgid "SuggestedColors|Aztec Gold"
+msgstr ""
+
+msgid "SuggestedColors|Blue"
+msgstr ""
+
+msgid "SuggestedColors|Blue-gray"
+msgstr ""
+
+msgid "SuggestedColors|Carrot orange"
+msgstr ""
+
+msgid "SuggestedColors|Champagne"
+msgstr ""
+
+msgid "SuggestedColors|Charcoal grey"
+msgstr ""
+
+msgid "SuggestedColors|Crimson"
+msgstr ""
+
+msgid "SuggestedColors|Dark coral"
+msgstr ""
+
+msgid "SuggestedColors|Dark green"
+msgstr ""
+
+msgid "SuggestedColors|Dark sea green"
+msgstr ""
+
+msgid "SuggestedColors|Dark violet"
+msgstr ""
+
+msgid "SuggestedColors|Deep violet"
+msgstr ""
+
+msgid "SuggestedColors|Gray"
+msgstr ""
+
+msgid "SuggestedColors|Green screen"
+msgstr ""
+
+msgid "SuggestedColors|Green-cyan"
+msgstr ""
+
+msgid "SuggestedColors|Lavendar"
+msgstr ""
+
+msgid "SuggestedColors|Magenta-pink"
+msgstr ""
+
+msgid "SuggestedColors|Medium sea green"
+msgstr ""
+
+msgid "SuggestedColors|Red"
+msgstr ""
+
+msgid "SuggestedColors|Rose red"
+msgstr ""
+
+msgid "SuggestedColors|Titanium yellow"
+msgstr ""
+
+msgid "Suggestion is not applicable as the suggestion was not found."
+msgstr ""
+
+msgid "Suggestions are not applicable as one or more suggestions were not found."
+msgstr ""
+
+msgid "Suggestions are not applicable as their lines cannot overlap."
+msgstr ""
+
+msgid "Suggestions must all be on the same branch."
+msgstr ""
+
+msgid "Suggestions:"
+msgstr ""
+
+msgid "Suite"
+msgstr ""
+
+msgid "Summary"
+msgstr ""
+
+msgid "Summary / Note"
+msgstr ""
+
+msgid "Sunday"
+msgstr ""
+
+msgid "SuperSonics|Activate subscription"
+msgstr ""
+
+msgid "SuperSonics|Activation code"
+msgstr ""
+
+msgid "SuperSonics|An error occurred while activating your subscription."
+msgstr ""
+
+msgid "SuperSonics|Billable users"
+msgstr ""
+
+msgid "SuperSonics|Buy subscription"
+msgstr ""
+
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
+msgstr ""
+
+msgid "SuperSonics|Enter activation code"
+msgstr ""
+
+msgid "SuperSonics|Export license usage file"
+msgstr ""
+
+msgid "SuperSonics|Free trial"
+msgstr ""
+
+msgid "SuperSonics|Get help for the most common connectivity issues by %{linkStart}troubleshooting the activation code%{linkEnd}."
+msgstr ""
+
+msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the Subscription Agreement located at the %{linkStart}Terms of Service%{linkEnd}, unless otherwise agreed to in writing with GitLab."
+msgstr ""
+
+msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
+msgstr ""
+
+msgid "SuperSonics|Licensed to"
+msgstr ""
+
+msgid "SuperSonics|Manage"
+msgstr ""
+
+msgid "SuperSonics|Maximum users"
+msgstr ""
+
+msgid "SuperSonics|Offline cloud"
+msgstr ""
+
+msgid "SuperSonics|Paste your activation code"
+msgstr ""
+
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
+msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
+msgstr ""
+
+msgid "SuperSonics|Start free trial"
+msgstr ""
+
+msgid "SuperSonics|Subscription details"
+msgstr ""
+
+msgid "SuperSonics|Subscription unavailable"
+msgstr ""
+
+msgid "SuperSonics|Sync subscription details"
+msgstr ""
+
+msgid "SuperSonics|Sync subscription request."
+msgstr ""
+
+msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
+msgstr ""
+
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
+msgid "SuperSonics|There is a connectivity issue."
+msgstr ""
+
+msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
+msgstr ""
+
+msgid "SuperSonics|This is the number of %{billableUsersLinkStart}billable users%{billableUsersLinkEnd} on your installation, and this is the minimum number you need to purchase when you renew your license."
+msgstr ""
+
+msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
+msgstr ""
+
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "SuperSonics|Users in subscription"
+msgstr ""
+
+msgid "SuperSonics|Users over subscription"
+msgstr ""
+
+msgid "SuperSonics|Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
+msgstr ""
+
+msgid "SuperSonics|You can learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. If you need further assistance, please %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
+msgstr ""
+
+msgid "SuperSonics|You can no longer sync your subscription details with GitLab. Get help for the most common connectivity issues by %{connectivityHelpLinkStart}troubleshooting the activation code%{connectivityHelpLinkEnd}."
+msgstr ""
+
+msgid "SuperSonics|You can start a free trial of GitLab Ultimate without any obligation or payment details."
+msgstr ""
+
+msgid "SuperSonics|You do not have an active subscription"
+msgstr ""
+
+msgid "SuperSonics|You have a future dated license"
+msgstr ""
+
+msgid "SuperSonics|You have added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
+msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
+msgstr ""
+
+msgid "SuperSonics|Your %{subscriptionEntryName} cannot be displayed at the moment. Please refresh the page to try again."
+msgstr ""
+
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
+msgid "SuperSonics|Your subscription"
+msgstr ""
+
+msgid "SuperSonics|Your subscription details will sync shortly."
+msgstr ""
+
+msgid "SuperSonics|Your subscription was successfully activated. You can see the details below."
+msgstr ""
+
+msgid "SuperSonics|current subscription"
+msgstr ""
+
+msgid "SuperSonics|future subscriptions"
+msgstr ""
+
+msgid "SuperSonics|past subscriptions"
+msgstr ""
+
+msgid "Support"
+msgstr ""
+
+msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
+msgstr ""
+
+msgid "Support page URL"
+msgstr ""
+
+msgid "Survey Response"
+msgstr ""
+
+msgid "Switch Branches"
+msgstr ""
+
+msgid "Switch branch"
+msgstr ""
+
+msgid "Switch branch/tag"
+msgstr ""
+
+msgid "Switch to GitLab Next"
+msgstr ""
+
+msgid "Switch to the source to copy the file contents"
+msgstr ""
+
+msgid "Symbolic link"
+msgstr ""
+
+msgid "Sync LDAP"
+msgstr ""
+
+msgid "Sync now"
+msgstr ""
+
+msgid "Synced"
+msgstr ""
+
+msgid "Synchronization settings"
+msgstr ""
+
+msgid "Synchronize LDAP"
+msgstr ""
+
+msgid "Syncing…"
+msgstr ""
+
+msgid "Syntax is correct."
+msgstr ""
+
+msgid "Syntax is incorrect."
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Dark"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Light"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Monokai"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|None"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Solarized Dark"
+msgstr ""
+
+msgid "SynthaxHighlightingTheme|Solarized Light"
+msgstr ""
+
+msgid "System"
+msgstr ""
+
+msgid "System Hooks"
+msgstr ""
+
+msgid "System Hooks Help"
+msgstr ""
+
+msgid "System Info"
+msgstr ""
+
+msgid "System default (%{default})"
+msgstr ""
+
+msgid "System header and footer"
+msgstr ""
+
+msgid "System 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 ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
+msgid "System metrics (Kubernetes)"
+msgstr ""
+
+msgid "System output"
+msgstr ""
+
+msgid "Table of Contents"
+msgstr ""
+
+msgid "Table of contents"
+msgstr ""
+
+msgid "Tag"
+msgstr ""
+
+msgid "Tag list:"
+msgstr ""
+
+msgid "Tag name"
+msgstr ""
+
+msgid "Tag name is required"
+msgstr ""
+
+msgid "Tag push"
+msgstr ""
+
+msgid "Tag push events"
+msgstr ""
+
+msgid "Tag this commit."
+msgstr ""
+
+msgid "Tag:"
+msgstr ""
+
+msgid "Tagged this commit to %{tag_name} with \"%{message}\"."
+msgstr ""
+
+msgid "Tagged this commit to %{tag_name}."
+msgstr ""
+
+msgid "Tags"
+msgstr ""
+
+msgid "Tags are deleted until the timeout is reached. Any remaining tags are included the next time the policy runs. To remove the time limit, set it to 0."
+msgstr ""
+
+msgid "Tags feed"
+msgstr ""
+
+msgid "Tags this commit to %{tag_name} with \"%{message}\"."
+msgstr ""
+
+msgid "Tags this commit to %{tag_name}."
+msgstr ""
+
+msgid "Tags:"
+msgstr ""
+
+msgid "TagsPage|Browse commits"
+msgstr ""
+
+msgid "TagsPage|Browse files"
+msgstr ""
+
+msgid "TagsPage|Can't find HEAD commit for this tag"
+msgstr ""
+
+msgid "TagsPage|Cancel"
+msgstr ""
+
+msgid "TagsPage|Create tag"
+msgstr ""
+
+msgid "TagsPage|Delete tag"
+msgstr ""
+
+msgid "TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?"
+msgstr ""
+
+msgid "TagsPage|Edit release notes"
+msgstr ""
+
+msgid "TagsPage|Existing branch name, tag, or commit SHA"
+msgstr ""
+
+msgid "TagsPage|Filter by tag name"
+msgstr ""
+
+msgid "TagsPage|New Tag"
+msgstr ""
+
+msgid "TagsPage|New tag"
+msgstr ""
+
+msgid "TagsPage|Optionally, add a message to the tag. Leaving this blank creates a %{link_start}lightweight tag.%{link_end}"
+msgstr ""
+
+msgid "TagsPage|Optionally, create a public Release of your project, based on this tag. Release notes are displayed on the %{releases_page_link_start}Releases%{link_end} page. %{docs_link_start}More information%{link_end}"
+msgstr ""
+
+msgid "TagsPage|Release notes"
+msgstr ""
+
+msgid "TagsPage|Repository has no tags yet."
+msgstr ""
+
+msgid "TagsPage|Tags"
+msgstr ""
+
+msgid "TagsPage|Tags give the ability to mark specific points in history as being important"
+msgstr ""
+
+msgid "TagsPage|This tag has no release notes."
+msgstr ""
+
+msgid "TagsPage|Unable to load tags"
+msgstr ""
+
+msgid "TagsPage|Use git tag command to add a new one:"
+msgstr ""
+
+msgid "TagsPage|Write your release notes or drag files here…"
+msgstr ""
+
+msgid "TagsPage|protected"
+msgstr ""
+
+msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
+msgstr ""
+
+msgid "Target Branch"
+msgstr ""
+
+msgid "Target Path"
+msgstr ""
+
+msgid "Target branch"
+msgstr ""
+
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
+msgid "Target-Branch"
+msgstr ""
+
+msgid "Task"
+msgstr ""
+
+msgid "Task ID: %{elastic_task}"
+msgstr ""
+
+msgid "TasksToBeDone|Create/import code into a project (repository)"
+msgstr ""
+
+msgid "TasksToBeDone|Create/import issues (tickets) to collaborate on ideas and plan work"
+msgstr ""
+
+msgid "TasksToBeDone|Set up CI/CD pipelines to build, test, deploy, and monitor code"
+msgstr ""
+
+msgid "Team"
+msgstr ""
+
+msgid "Team domain"
+msgstr ""
+
+msgid "TeamcityIntegration|Trigger TeamCity CI after a merge request has been created or updated"
+msgstr ""
+
+msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
+msgstr ""
+
+msgid "Telephone number"
+msgstr ""
+
+msgid "Template"
+msgstr ""
+
+msgid "Template to append to all Service Desk issues"
+msgstr ""
+
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
+msgstr ""
+
+msgid "Templates"
+msgstr ""
+
+msgid "TemporaryStorageIncrease|can only be set once"
+msgstr ""
+
+msgid "TemporaryStorageIncrease|can only be set with more than %{percentage}%% usage"
+msgstr ""
+
+msgid "TemporaryStorage|GitLab allows you a %{strongStart}free, one-time storage increase%{strongEnd}. For 30 days your storage will be unlimited. This gives you time to reduce your storage usage. After 30 days, your original storage limit of %{limit} applies. If you are at maximum storage capacity, your account will be read-only. To continue using GitLab you'll have to purchase additional storage or decrease storage usage."
+msgstr ""
+
+msgid "TemporaryStorage|Increase storage temporarily"
+msgstr ""
+
+msgid "TemporaryStorage|Temporarily increase storage now?"
+msgstr ""
+
+msgid "Terminal"
+msgstr ""
+
+msgid "Terminal for environment"
+msgstr ""
+
+msgid "Terminal sync service is running"
+msgstr ""
+
+msgid "Terms of Service Agreement and Privacy Policy"
+msgstr ""
+
+msgid "Terms of Service and Privacy Policy"
+msgstr ""
+
+msgid "Terms of service"
+msgstr ""
+
+msgid "Terraform"
+msgstr ""
+
+msgid "TerraformBanner|Learn more about GitLab's Backend State"
+msgstr ""
+
+msgid "TerraformBanner|The GitLab managed Terraform state backend can store your Terraform state easily and securely, and spares you from setting up additional remote resources. Its features include: versioning, encryption of the state file both in transit and at rest, locking, and remote Terraform plan/apply execution."
+msgstr ""
+
+msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
+msgstr ""
+
+msgid "Terraform|%{name} successfully removed"
+msgstr ""
+
+msgid "Terraform|%{number} Terraform report failed to generate"
+msgid_plural "Terraform|%{number} Terraform reports failed to generate"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Terraform|%{number} Terraform report was generated in your pipelines"
+msgid_plural "Terraform|%{number} Terraform reports were generated in your pipelines"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Terraform|%{strong_start}%{number}%{strong_end} Terraform report failed to generate"
+msgid_plural "Terraform|%{strong_start}%{number}%{strong_end} Terraform reports failed to generate"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Terraform|%{strong_start}%{number}%{strong_end} Terraform report was generated in your pipelines"
+msgid_plural "Terraform|%{strong_start}%{number}%{strong_end} Terraform reports were generated in your pipelines"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Terraform|%{user} updated %{timeAgo}"
+msgstr ""
+
+msgid "Terraform|A Terraform report failed to generate."
+msgstr ""
+
+msgid "Terraform|A Terraform report was generated in your pipelines."
+msgstr ""
+
+msgid "Terraform|A report failed to generate."
+msgstr ""
+
+msgid "Terraform|A report was generated in your pipelines."
+msgstr ""
+
+msgid "Terraform|Actions"
+msgstr ""
+
+msgid "Terraform|An error occurred while changing the state file"
+msgstr ""
+
+msgid "Terraform|An error occurred while loading your Terraform States"
+msgstr ""
+
+msgid "Terraform|Are you sure you want to remove the Terraform State %{name}?"
+msgstr ""
+
+msgid "Terraform|Cancel"
+msgstr ""
+
+msgid "Terraform|Copy Terraform init command"
+msgstr ""
+
+msgid "Terraform|Details"
+msgstr ""
+
+msgid "Terraform|Download JSON"
+msgstr ""
+
+msgid "Terraform|Failed to load Terraform reports"
+msgstr ""
+
+msgid "Terraform|Generating the report caused an error."
+msgstr ""
+
+msgid "Terraform|Get started with Terraform"
+msgstr ""
+
+msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgstr ""
+
+msgid "Terraform|Job status"
+msgstr ""
+
+msgid "Terraform|Loading Terraform reports..."
+msgstr ""
+
+msgid "Terraform|Lock"
+msgstr ""
+
+msgid "Terraform|Locked"
+msgstr ""
+
+msgid "Terraform|Locked by %{user} %{timeAgo}"
+msgstr ""
+
+msgid "Terraform|Locking state"
+msgstr ""
+
+msgid "Terraform|Name"
+msgstr ""
+
+msgid "Terraform|Pipeline"
+msgstr ""
+
+msgid "Terraform|Remove"
+msgstr ""
+
+msgid "Terraform|Remove state file and versions"
+msgstr ""
+
+msgid "Terraform|Removing"
+msgstr ""
+
+msgid "Terraform|Reported Resource Changes: %{addNum} to add, %{changeNum} to change, %{deleteNum} to delete"
+msgstr ""
+
+msgid "Terraform|States"
+msgstr ""
+
+msgid "Terraform|Terraform init command"
+msgstr ""
+
+msgid "Terraform|Terraform reports"
+msgstr ""
+
+msgid "Terraform|The job %{name} failed to generate a report."
+msgstr ""
+
+msgid "Terraform|The job %{name} generated a report."
+msgstr ""
+
+msgid "Terraform|The job %{strong_start}%{name}%{strong_end} failed to generate a report."
+msgstr ""
+
+msgid "Terraform|The job %{strong_start}%{name}%{strong_end} generated a report."
+msgstr ""
+
+msgid "Terraform|To get access to this terraform state from your local computer, run the following command at the command line. The first line requires a personal access token with API read and write access. %{linkStart}How do I create a personal access token?%{linkEnd}."
+msgstr ""
+
+msgid "Terraform|To remove the State file and its versions, type %{name} to confirm:"
+msgstr ""
+
+msgid "Terraform|Unknown User"
+msgstr ""
+
+msgid "Terraform|Unlock"
+msgstr ""
+
+msgid "Terraform|Unlocking state"
+msgstr ""
+
+msgid "Terraform|You are about to remove the state file %{name}. This will permanently delete all the State versions and history. The infrastructure provisioned previously will remain intact, and only the state file with all its versions will be removed. This action cannot be undone."
+msgstr ""
+
+msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
+msgstr ""
+
+msgid "Test"
+msgstr ""
+
+msgid "Test Cases"
+msgstr ""
+
+msgid "Test case"
+msgstr ""
+
+msgid "Test coverage parsing"
+msgstr ""
+
+msgid "Test coverage value for this pipeline was calculated by the coverage value of %d job."
+msgid_plural "Test coverage value for this pipeline was calculated by averaging the resulting coverage values of %d jobs."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Test coverage: %d hit"
+msgid_plural "Test coverage: %d hits"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Test settings"
+msgstr ""
+
+msgid "TestCases|Move test case"
+msgstr ""
+
+msgid "TestCases|Moving test case"
+msgstr ""
+
+msgid "TestCases|New Test Case"
+msgstr ""
+
+msgid "TestCases|New test case"
+msgstr ""
+
+msgid "TestCases|Search test cases"
+msgstr ""
+
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
+msgstr ""
+
+msgid "TestCases|Something went wrong while creating a test case."
+msgstr ""
+
+msgid "TestCases|Something went wrong while fetching test case."
+msgstr ""
+
+msgid "TestCases|Something went wrong while fetching test cases list."
+msgstr ""
+
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
+msgstr ""
+
+msgid "TestCases|Something went wrong while moving test case."
+msgstr ""
+
+msgid "TestCases|Something went wrong while updating the test case labels."
+msgstr ""
+
+msgid "TestCases|Something went wrong while updating the test case."
+msgstr ""
+
+msgid "TestCases|Submit test case"
+msgstr ""
+
+msgid "TestHooks|Ensure one of your projects has merge requests."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has CI jobs."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has CI pipelines."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has deployments."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has issues."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has merge requests."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has notes."
+msgstr ""
+
+msgid "TestHooks|Ensure the project has releases."
+msgstr ""
+
+msgid "TestHooks|Ensure the wiki is enabled and has pages."
+msgstr ""
+
+msgid "TestReports|%{count} errors"
+msgstr ""
+
+msgid "TestReports|%{count} failures"
+msgstr ""
+
+msgid "TestReports|%{count} tests"
+msgstr ""
+
+msgid "TestReports|%{rate}%{sign} success rate"
+msgstr ""
+
+msgid "TestReports|Attachment"
+msgstr ""
+
+msgid "TestReports|Jobs"
+msgstr ""
+
+msgid "TestReports|Learn how to upload pipeline test reports"
+msgstr ""
+
+msgid "TestReports|Learn more about pipeline test reports"
+msgstr ""
+
+msgid "TestReports|No test cases were found in the test report."
+msgstr ""
+
+msgid "TestReports|Tests"
+msgstr ""
+
+msgid "TestReports|There are no test cases to display."
+msgstr ""
+
+msgid "TestReports|There are no test reports for this pipeline"
+msgstr ""
+
+msgid "TestReports|There are no test suites to show."
+msgstr ""
+
+msgid "TestReports|There are no tests to display"
+msgstr ""
+
+msgid "TestReports|There was an error fetching the summary."
+msgstr ""
+
+msgid "TestReports|There was an error fetching the test suite."
+msgstr ""
+
+msgid "TestReports|You can configure your job to use unit test reports, and GitLab displays a report here and in the related merge request."
+msgstr ""
+
+msgid "Tests"
+msgstr ""
+
+msgid "Text (optional)"
+msgstr ""
+
+msgid "Text added to the body of all email messages. %{character_limit} character limit"
+msgstr ""
+
+msgid "Text style"
+msgstr ""
+
+msgid "Thank you for your business."
+msgstr ""
+
+msgid "Thank you for your feedback!"
+msgstr ""
+
+msgid "Thank you for your report. A GitLab administrator will look into it shortly."
+msgstr ""
+
+msgid "Thank you for your support request! We are tracking your request as ticket #%{issue_iid}, and will respond as soon as we can."
+msgstr ""
+
+msgid "Thanks for signing up to GitLab!"
+msgstr ""
+
+msgid "Thanks for your purchase!"
+msgstr ""
+
+msgid "That's OK, I don't want to renew"
+msgstr ""
+
+msgid "That's it, well done!"
+msgstr ""
+
+msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
+msgstr ""
+
+msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
+msgstr ""
+
+msgid "The %{plan_name} is no longer available to purchase. For more information about how this will impact you, check our %{faq_link_start}frequently asked questions%{faq_link_end}."
+msgstr ""
+
+msgid "The %{type} contains the following error:"
+msgid_plural "The %{type} contains the following errors:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
+msgstr ""
+
+msgid "The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment."
+msgstr ""
+
+msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
+msgstr ""
+
+msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
+msgstr ""
+
+msgid "The ID of the application."
+msgstr ""
+
+msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
+msgstr ""
+
+msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
+msgstr ""
+
+msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
+msgstr ""
+
+msgid "The Snowplow cookie domain."
+msgstr ""
+
+msgid "The URL of the Jenkins server."
+msgstr ""
+
+msgid "The URL should start with http:// or https://"
+msgstr ""
+
+msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
+msgstr ""
+
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
+msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
+msgstr ""
+
+msgid "The associated issue #%{issueId} has been closed as the error is now resolved."
+msgstr ""
+
+msgid "The branch for this project has no active pipeline configuration."
+msgstr ""
+
+msgid "The branch or tag does not exist"
+msgstr ""
+
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
+msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
+msgstr ""
+
+msgid "The comment you are editing has been changed by another user. Would you like to keep your changes and overwrite the new description or discard your changes?"
+msgstr ""
+
+msgid "The commit does not exist"
+msgstr ""
+
+msgid "The comparison view may be inaccurate due to merge conflicts."
+msgstr ""
+
+msgid "The compliance report captures merged changes that violate compliance best practices."
+msgstr ""
+
+msgid "The compliance report shows the merge request violations merged in protected environments."
+msgstr ""
+
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
+msgid "The contact does not belong to the issue group's root ancestor"
+msgstr ""
+
+msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
+msgstr ""
+
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
+msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
+msgstr ""
+
+msgid "The contents of this group, its subgroups and projects will be permanently removed after %{deletion_adjourned_period} days on %{date}. After this point, your data cannot be recovered."
+msgstr ""
+
+msgid "The current epic"
+msgstr ""
+
+msgid "The current issue"
+msgstr ""
+
+msgid "The current user is not authorized to access the job log."
+msgstr ""
+
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgstr ""
+
+msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgstr ""
+
+msgid "The default CI/CD configuration file and path for new projects."
+msgstr ""
+
+msgid "The default branch for this project has been changed. Please update your bookmarks."
+msgstr ""
+
+msgid "The dependency list details information about the components used within your project."
+msgstr ""
+
+msgid "The deployment of this job to %{environmentLink} did not succeed."
+msgstr ""
+
+msgid "The directory has been successfully created."
+msgstr ""
+
+msgid "The domain you entered is misformatted."
+msgstr ""
+
+msgid "The domain you entered is not allowed."
+msgstr ""
+
+msgid "The download link will expire in 24 hours."
+msgstr ""
+
+msgid "The environment tier must be one of %{environment_tiers}."
+msgstr ""
+
+msgid "The errors we encountered were:"
+msgstr ""
+
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
+msgid "The file could not be displayed because it is empty or larger than the maximum file size indexed (%{size})."
+msgstr ""
+
+msgid "The file has been successfully created."
+msgstr ""
+
+msgid "The file has been successfully deleted."
+msgstr ""
+
+msgid "The file name should have a .yml extension"
+msgstr ""
+
+msgid "The finding is not a vulnerability because it is part of a test or is test data."
+msgstr ""
+
+msgid "The following %{user} can also merge into this branch: %{branch}"
+msgstr ""
+
+msgid "The following %{user} can also push to this branch: %{branch}"
+msgstr ""
+
+msgid "The following Personal Access Token was revoked by an administrator, %{username}."
+msgstr ""
+
+msgid "The following SSH key was deleted by an administrator, %{username}."
+msgstr ""
+
+msgid "The following items will NOT be exported:"
+msgstr ""
+
+msgid "The following items will be exported:"
+msgstr ""
+
+msgid "The following personal access token: %{token_names} was revoked, because a new policy to expire personal access tokens were set."
+msgid_plural "The following personal access tokens: %{token_names} were revoked, because a new policy to expire personal access tokens were set."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "The fork relationship has been removed."
+msgstr ""
+
+msgid "The form contains the following errors:"
+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 ""
+
+msgid "The group and any internal projects can be viewed by any logged in user except external users."
+msgstr ""
+
+msgid "The group and any public projects can be viewed without any authentication."
+msgstr ""
+
+msgid "The group and its projects can only be viewed by members."
+msgstr ""
+
+msgid "The group export can be downloaded from:"
+msgstr ""
+
+msgid "The group has already been shared with this group"
+msgstr ""
+
+msgid "The group settings for %{group_links} require you to enable Two-Factor Authentication for your account. You can %{leave_group_links}."
+msgstr ""
+
+msgid "The group_project_ids parameter is only allowed for a group"
+msgstr ""
+
+msgid "The hostname of your PlantUML server."
+msgstr ""
+
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
+msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
+msgid "The interval must be one of %{intervals}."
+msgstr ""
+
+msgid "The invitation can not be found with the provided invite token."
+msgstr ""
+
+msgid "The invitation could not be accepted."
+msgstr ""
+
+msgid "The invitation could not be declined."
+msgstr ""
+
+msgid "The invitation has already been accepted."
+msgstr ""
+
+msgid "The invitation was successfully resent."
+msgstr ""
+
+msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
+msgstr ""
+
+msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
+msgstr ""
+
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
+msgid "The latest pipeline for this merge request did not succeed. The latest changes are unverified."
+msgstr ""
+
+msgid "The latest pipeline for this merge request has failed."
+msgstr ""
+
+msgid "The license key is invalid."
+msgstr ""
+
+msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
+msgstr ""
+
+msgid "The license was removed. GitLab has fallen back on the previous license."
+msgstr ""
+
+msgid "The license was removed. GitLab now no longer has a valid license."
+msgstr ""
+
+msgid "The license was successfully uploaded and is now active. You can see the details below."
+msgstr ""
+
+msgid "The license was successfully uploaded and will be active from %{starts_at}. You can see the details below."
+msgstr ""
+
+msgid "The license you uploaded is invalid. If the issue persists, contact support at %{link}."
+msgstr ""
+
+msgid "The list creation wizard is already open"
+msgstr ""
+
+msgid "The maximum file size allowed is %{size}."
+msgstr ""
+
+msgid "The maximum file size for job artifacts."
+msgstr ""
+
+msgid "The maximum file size in megabytes for individual job artifacts."
+msgstr ""
+
+msgid "The maximum file size is %{size}."
+msgstr ""
+
+msgid "The maximum number of CI/CD minutes on shared runners that a group can use each month. 0 for unlimited."
+msgstr ""
+
+msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
+msgstr ""
+
+msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
+msgstr ""
+
+msgid "The merge conflicts for this merge request have already been resolved."
+msgstr ""
+
+msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
+msgstr ""
+
+msgid "The metric must be one of %{metrics}."
+msgstr ""
+
+msgid "The name \"%{name}\" is already taken in this directory."
+msgstr ""
+
+msgid "The name of the CI/CD configuration file. A path relative to the root directory is optional (for example %{code_open}my/path/.myfile.yml%{code_close})."
+msgstr ""
+
+msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
+msgstr ""
+
+msgid "The number of changes to fetch from GitLab when cloning a repository. Lower values can speed up pipeline execution. Set to %{code_open}0%{code_close} or blank to fetch all branches and tags for each job"
+msgstr ""
+
+msgid "The number of merge requests merged by month."
+msgstr ""
+
+msgid "The number of times an upload record could not find its file"
+msgstr ""
+
+msgid "The page could not be displayed because it timed out."
+msgstr ""
+
+msgid "The parent epic is confidential and can only contain confidential epics and issues"
+msgstr ""
+
+msgid "The password for the Jenkins server."
+msgstr ""
+
+msgid "The password for your GitLab account on %{gitlab_url} has successfully been changed."
+msgstr ""
+
+msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
+msgstr ""
+
+msgid "The pipeline has been deleted"
+msgstr ""
+
+msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
+msgstr ""
+
+msgid "The project can be accessed by any logged in user except external users."
+msgstr ""
+
+msgid "The project can be accessed by any user who is logged in."
+msgstr ""
+
+msgid "The project can be accessed by anyone, regardless of authentication."
+msgstr ""
+
+msgid "The project can be accessed without any authentication."
+msgstr ""
+
+msgid "The project has already been added to your dashboard."
+msgstr ""
+
+msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
+msgstr ""
+
+msgid "The project is still being deleted. Please try again later."
+msgstr ""
+
+msgid "The project was successfully forked."
+msgstr ""
+
+msgid "The project was successfully imported."
+msgstr ""
+
+msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
+msgstr ""
+
+msgid "The related CI build failed."
+msgstr ""
+
+msgid "The remote mirror URL is invalid."
+msgstr ""
+
+msgid "The remote mirror took to long to complete."
+msgstr ""
+
+msgid "The remote repository is being updated..."
+msgstr ""
+
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
+msgid "The repository can be committed to, and issues, comments and other entities can be created."
+msgstr ""
+
+msgid "The repository for this project does not exist."
+msgstr ""
+
+msgid "The repository for this project is empty"
+msgstr ""
+
+msgid "The repository is being updated..."
+msgstr ""
+
+msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}."
+msgstr ""
+
+msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
+msgstr ""
+
+msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
+msgstr ""
+
+msgid "The scan has been created."
+msgstr ""
+
+msgid "The snippet can be accessed without any authentication."
+msgstr ""
+
+msgid "The snippet is visible only to me."
+msgstr ""
+
+msgid "The snippet is visible only to project members."
+msgstr ""
+
+msgid "The snippet is visible to any logged in user except external users."
+msgstr ""
+
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
+msgid "The specified tab is invalid, please select another"
+msgstr ""
+
+msgid "The start date must be ealier than the end date."
+msgstr ""
+
+msgid "The subject will be used as the title of the new issue, and the message will be the description. %{quickActionsLinkStart}Quick actions%{quickActionsLinkEnd} and styling with %{markdownLinkStart}Markdown%{markdownLinkEnd} are supported."
+msgstr ""
+
+msgid "The tag name can't be changed for an existing release."
+msgstr ""
+
+msgid "The time period in seconds that the maximum requests per project limit applies to."
+msgstr ""
+
+msgid "The update action will time out after %{number_of_minutes} minutes. For big repositories, use a clone/push combination."
+msgstr ""
+
+msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
+msgstr ""
+
+msgid "The user is being deleted."
+msgstr ""
+
+msgid "The user map has been saved. Continue by selecting the projects you want to import."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
+msgid "The user you are trying to approve is not pending approval"
+msgstr ""
+
+msgid "The user you are trying to deactivate has been active in the past %{minimum_inactive_days} days and cannot be deactivated"
+msgstr ""
+
+msgid "The username for the Jenkins server."
+msgstr ""
+
+msgid "The value of the provided variable exceeds the %{count} character limit"
+msgstr ""
+
+msgid "The vulnerability is known, and has not been remediated or mitigated, but is considered to be an acceptable business risk."
+msgstr ""
+
+msgid "The vulnerability is known, and has not been remediated or mitigated, but is considered to be in a part of the application that will not be updated."
+msgstr ""
+
+msgid "The vulnerability is no longer detected. Verify the vulnerability has been fixed or removed before changing its status."
+msgstr ""
+
+msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
+msgstr ""
+
+msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgstr ""
+
+msgid "There are currently no events."
+msgstr ""
+
+msgid "There are merge conflicts"
+msgstr ""
+
+msgid "There are no %{replicableTypeName} to show"
+msgstr ""
+
+msgid "There are no GPG keys associated with this account."
+msgstr ""
+
+msgid "There are no GPG keys with access to your account."
+msgstr ""
+
+msgid "There are no SSH keys associated with this account."
+msgstr ""
+
+msgid "There are no SSH keys with access to your account."
+msgstr ""
+
+msgid "There are no Spam Logs"
+msgstr ""
+
+msgid "There are no abuse reports!"
+msgstr ""
+
+msgid "There are no archived projects yet"
+msgstr ""
+
+msgid "There are no archived requirements"
+msgstr ""
+
+msgid "There are no archived test cases"
+msgstr ""
+
+msgid "There are no changes"
+msgstr ""
+
+msgid "There are no charts configured for this page"
+msgstr ""
+
+msgid "There are no closed epics"
+msgstr ""
+
+msgid "There are no closed issues"
+msgstr ""
+
+msgid "There are no closed merge requests"
+msgstr ""
+
+msgid "There are no commits yet."
+msgstr ""
+
+msgid "There are no custom project templates set up for this GitLab instance. They are enabled from GitLab's Admin Area. Contact your GitLab instance administrator to setup custom project templates."
+msgstr ""
+
+msgid "There are no issues to show"
+msgstr ""
+
+msgid "There are no issues with the selected labels"
+msgstr ""
+
+msgid "There are no matching files"
+msgstr ""
+
+msgid "There are no open epics"
+msgstr ""
+
+msgid "There are no open issues"
+msgstr ""
+
+msgid "There are no open merge requests"
+msgstr ""
+
+msgid "There are no open requirements"
+msgstr ""
+
+msgid "There are no open test cases"
+msgstr ""
+
+msgid "There are no packages yet"
+msgstr ""
+
+msgid "There are no projects shared with this group yet"
+msgstr ""
+
+msgid "There are no topics to show."
+msgstr ""
+
+msgid "There are no variables yet."
+msgstr ""
+
+msgid "There are running deployments on the environment. Please retry later."
+msgstr ""
+
+msgid "There are several file size limits in place for the Package Registry."
+msgstr ""
+
+msgid "There are several rate limits in place to protect the system."
+msgstr ""
+
+msgid "There are several size limits in place."
+msgstr ""
+
+msgid "There is already a repository with that name on disk"
+msgstr ""
+
+msgid "There is already a to-do item for this design."
+msgstr ""
+
+msgid "There is no chart data available."
+msgstr ""
+
+msgid "There is no data available."
+msgstr ""
+
+msgid "There is no data available. Please change your selection."
+msgstr ""
+
+msgid "There is no table data available."
+msgstr ""
+
+msgid "There is too much data to calculate. Please change your selection."
+msgstr ""
+
+msgid "There was a problem communicating with your device."
+msgstr ""
+
+msgid "There was a problem fetching branches."
+msgstr ""
+
+msgid "There was a problem fetching emojis."
+msgstr ""
+
+msgid "There was a problem fetching epics."
+msgstr ""
+
+msgid "There was a problem fetching groups."
+msgstr ""
+
+msgid "There was a problem fetching iterations."
+msgstr ""
+
+msgid "There was a problem fetching labels."
+msgstr ""
+
+msgid "There was a problem fetching linked pipelines."
+msgstr ""
+
+msgid "There was a problem fetching milestones."
+msgstr ""
+
+msgid "There was a problem fetching project branches."
+msgstr ""
+
+msgid "There was a problem fetching project tags."
+msgstr ""
+
+msgid "There was a problem fetching project users."
+msgstr ""
+
+msgid "There was a problem fetching recent groups."
+msgstr ""
+
+msgid "There was a problem fetching recent projects."
+msgstr ""
+
+msgid "There was a problem fetching releases."
+msgstr ""
+
+msgid "There was a problem fetching the job token scope value"
+msgstr ""
+
+msgid "There was a problem fetching the keep latest artifacts setting."
+msgstr ""
+
+msgid "There was a problem fetching the projects"
+msgstr ""
+
+msgid "There was a problem fetching users."
+msgstr ""
+
+msgid "There was a problem sending the confirmation email"
+msgstr ""
+
+msgid "There was a problem updating the keep latest artifacts setting."
+msgstr ""
+
+msgid "There was an error %{message} to-do item."
+msgstr ""
+
+msgid "There was an error adding a To Do."
+msgstr ""
+
+msgid "There was an error creating the dashboard, branch name is invalid."
+msgstr ""
+
+msgid "There was an error creating the dashboard, branch named: %{branch} already exists."
+msgstr ""
+
+msgid "There was an error creating the issue"
+msgstr ""
+
+msgid "There was an error deleting the To Do."
+msgstr ""
+
+msgid "There was an error fetching configuration for charts"
+msgstr ""
+
+msgid "There was an error fetching content, please refresh the page"
+msgstr ""
+
+msgid "There was an error fetching data for the selected stage"
+msgstr ""
+
+msgid "There was an error fetching data for the tasks by type chart"
+msgstr ""
+
+msgid "There was an error fetching label data for the selected group"
+msgstr ""
+
+msgid "There was an error fetching median data for stages"
+msgstr ""
+
+msgid "There was an error fetching projects"
+msgstr ""
+
+msgid "There was an error fetching stage total counts"
+msgstr ""
+
+msgid "There was an error fetching the %{replicableType}"
+msgstr ""
+
+msgid "There was an error fetching the Geo Settings"
+msgstr ""
+
+msgid "There was an error fetching the Sites's Groups"
+msgstr ""
+
+msgid "There was an error fetching the deploy freezes."
+msgstr ""
+
+msgid "There was an error fetching the environments information."
+msgstr ""
+
+msgid "There was an error fetching the jobs for your project."
+msgstr ""
+
+msgid "There was an error fetching the top labels for the selected group"
+msgstr ""
+
+msgid "There was an error fetching the variables."
+msgstr ""
+
+msgid "There was an error fetching value stream analytics stages."
+msgstr ""
+
+msgid "There was an error gathering the chart data"
+msgstr ""
+
+msgid "There was an error getting the epic participants."
+msgstr ""
+
+msgid "There was an error importing the Jira project."
+msgstr ""
+
+msgid "There was an error loading related feature flags"
+msgstr ""
+
+msgid "There was an error loading users activity calendar."
+msgstr ""
+
+msgid "There was an error parsing the data for this graph."
+msgstr ""
+
+msgid "There was an error removing the e-mail."
+msgstr ""
+
+msgid "There was an error resetting group pipeline minutes."
+msgstr ""
+
+msgid "There was an error resetting user pipeline minutes."
+msgstr ""
+
+msgid "There was an error retrieving the Jira users."
+msgstr ""
+
+msgid "There was an error saving this Geo Site"
+msgstr ""
+
+msgid "There was an error saving your changes."
+msgstr ""
+
+msgid "There was an error subscribing to this label."
+msgstr ""
+
+msgid "There was an error syncing project %{name}"
+msgstr ""
+
+msgid "There was an error syncing the %{replicableType}"
+msgstr ""
+
+msgid "There was an error trying to validate your query"
+msgstr ""
+
+msgid "There was an error updating the Geo Settings"
+msgstr ""
+
+msgid "There was an error updating the Maintenance Mode Settings"
+msgstr ""
+
+msgid "There was an error updating the dashboard, branch name is invalid."
+msgstr ""
+
+msgid "There was an error updating the dashboard, branch named: %{branch} already exists."
+msgstr ""
+
+msgid "There was an error when reseting email token."
+msgstr ""
+
+msgid "There was an error when subscribing to this label."
+msgstr ""
+
+msgid "There was an error when unsubscribing from this label."
+msgstr ""
+
+msgid "There was an error while fetching the chart data. Please refresh the page to try again."
+msgstr ""
+
+msgid "There was an error while fetching the table data. Please refresh the page to try again."
+msgstr ""
+
+msgid "There was an error while fetching value stream analytics data."
+msgstr ""
+
+msgid "There was an error while fetching value stream analytics duration data."
+msgstr ""
+
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
+msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
+msgstr ""
+
+msgid "These dates affect how your epics appear in the roadmap. Set a fixed date or one inherited from the milestones assigned to issues in this epic."
+msgstr ""
+
+msgid "These examples show how to trigger this project's pipeline for a branch or tag."
+msgstr ""
+
+msgid "These existing issues have a similar title. It might be better to comment there instead of creating another similar issue."
+msgstr ""
+
+msgid "These runners are shared across projects in this group."
+msgstr ""
+
+msgid "These runners are shared across this GitLab instance."
+msgstr ""
+
+msgid "These runners are specific to this project."
+msgstr ""
+
+msgid "These variables are inherited from the parent group."
+msgstr ""
+
+msgid "These will be sent to %{email} in an attachment once finished."
+msgstr ""
+
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
+msgid "Third Party Advisory Link"
+msgstr ""
+
+msgid "This %{issuableDisplayName} is locked. Only project members can comment."
+msgstr ""
+
+msgid "This %{issuableType} is confidential"
+msgstr ""
+
+msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
+msgstr ""
+
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
+msgstr ""
+
+msgid "This %{noteableTypeText} is locked."
+msgstr ""
+
+msgid "This %{viewer} could not be displayed because %{reason}. You can %{options} instead."
+msgstr ""
+
+msgid "This Cron pattern is invalid"
+msgstr ""
+
+msgid "This GitLab instance does not provide any shared runners yet. Instance administrators can register shared runners in the admin area."
+msgstr ""
+
+msgid "This GitLab instance is licensed at the %{insufficient_license} tier. Geo is only available for users who have at least a Premium license."
+msgstr ""
+
+msgid "This GitLab instance is undergoing maintenance and is operating in read-only mode."
+msgstr ""
+
+msgid "This PDF is too large to display. Please download to view."
+msgstr ""
+
+msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
+msgstr ""
+
+msgid "This URL already exists."
+msgstr ""
+
+msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
+msgstr ""
+
+msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
+msgstr ""
+
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
+msgstr ""
+
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
+msgstr ""
+
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
+msgstr ""
+
+msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}immediately%{strongClose}."
+msgstr ""
+
+msgid "This also resolves all related threads"
+msgstr ""
+
+msgid "This also resolves this thread"
+msgstr ""
+
+msgid "This application was created by %{user_link}."
+msgstr ""
+
+msgid "This application was created for group %{group_link}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This archive has been requested too many times. Try again later."
+msgstr ""
+
+msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{count} %{issuables} have been included. Consider re-exporting with a narrower selection of %{issuables}."
+msgstr ""
+
+msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{issues_count} issues have been included. Consider re-exporting with a narrower selection of issues."
+msgstr ""
+
+msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{merge_requests_count} merge requests have been included. Consider re-exporting with a narrower selection of merge requests."
+msgstr ""
+
+msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{requirements_count} requirements have been included. Consider re-exporting with a narrower selection of requirements."
+msgstr ""
+
+msgid "This block is self-referential"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
+msgid "This chart could not be displayed"
+msgstr ""
+
+msgid "This clears repository check states for all projects in the database and cannot be undone. Are you sure?"
+msgstr ""
+
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
+msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
+msgstr ""
+
+msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
+msgstr ""
+
+msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
+msgstr ""
+
+msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with a different user's verified signature."
+msgstr ""
+
+msgid "This commit was signed with a verified signature, but the committer email is %{strong_open}not verified%{strong_close} to belong to the same user."
+msgstr ""
+
+msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
+msgstr ""
+
+msgid "This content could not be displayed because %{reason}. You can %{options} instead."
+msgstr ""
+
+msgid "This content could not be displayed because it is stored in LFS. You can %{linkStart}download it%{linkEnd} instead."
+msgstr ""
+
+msgid "This credential has expired"
+msgstr ""
+
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
+msgid "This device has already been registered with us."
+msgstr ""
+
+msgid "This device has not been registered with us."
+msgstr ""
+
+msgid "This diff is collapsed."
+msgstr ""
+
+msgid "This directory"
+msgstr ""
+
+msgid "This domain is not verified. You will need to verify ownership before access is enabled."
+msgstr ""
+
+msgid "This endpoint has been requested too many times. Try again later."
+msgstr ""
+
+msgid "This environment has no deployments yet."
+msgstr ""
+
+msgid "This environment is being deployed"
+msgstr ""
+
+msgid "This environment is being re-deployed"
+msgstr ""
+
+msgid "This environment is not protected."
+msgstr ""
+
+msgid "This environment's canary ingress has been updated recently. Please retry later."
+msgstr ""
+
+msgid "This epic already has the maximum number of child epics."
+msgstr ""
+
+msgid "This epic does not exist or you don't have sufficient permission."
+msgstr ""
+
+msgid "This feature requires local storage to be enabled"
+msgstr ""
+
+msgid "This field is required"
+msgstr ""
+
+msgid "This field is required."
+msgstr ""
+
+msgid "This file was modified for readability, and can't accept suggestions. Edit it directly."
+msgstr ""
+
+msgid "This form is disabled in preview"
+msgstr ""
+
+msgid "This group"
+msgstr ""
+
+msgid "This group and its subgroups and projects will be placed in a 'pending deletion' state for %{deletion_adjourned_period} days, then permanently deleted on %{date}. The group can be fully restored before that date."
+msgstr ""
+
+msgid "This group can't be removed because it is linked to a subscription. To remove this group, %{linkStart}link the subscription%{linkEnd} with a different group."
+msgstr ""
+
+msgid "This group can't be transferred because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group."
+msgstr ""
+
+msgid "This group cannot be invited to a project inside a group with enforced SSO"
+msgstr ""
+
+msgid "This group does not have any group runners yet."
+msgstr ""
+
+msgid "This group has been scheduled for permanent removal on %{date}"
+msgstr ""
+
+msgid "This group has no active access tokens."
+msgstr ""
+
+msgid "This group is linked to a subscription"
+msgstr ""
+
+msgid "This group is not permitted to create compliance violations"
+msgstr ""
+
+msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
+msgstr ""
+
+msgid "This group, its subgroups and projects will be removed on %{date} since its parent group '%{parent_group_name}' has been scheduled for removal."
+msgstr ""
+
+msgid "This incident is already escalated with '%{escalation_policy_name}'."
+msgstr ""
+
+msgid "This invitation was sent to %{mail_to_invite_email}, but you are signed in as %{link_to_current_user} with email %{mail_to_current_user}."
+msgstr ""
+
+msgid "This is a \"Ghost User\", created to hold all issues authored by users that have since been deleted. This user cannot be removed."
+msgstr ""
+
+msgid "This is a Jira user."
+msgstr ""
+
+msgid "This is a confidential %{noteableTypeText}."
+msgstr ""
+
+msgid "This is a delayed job to run in %{remainingTime}"
+msgstr ""
+
+msgid "This is a list of devices that have logged into your account. Revoke any sessions that you do not recognize."
+msgstr ""
+
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
+msgstr ""
+
+msgid "This is a security log of authentication events involving your account."
+msgstr ""
+
+msgid "This is a self-managed instance of GitLab."
+msgstr ""
+
+msgid "This is an experimental feature developed by GitLab Incubation Engineering."
+msgstr ""
+
+msgid "This is the highest peak of users on your installation since the license started."
+msgstr ""
+
+msgid "This is the number of %{billable_users_link_start}billable users%{link_end} on your installation, and this is the minimum number you need to purchase when you renew your license."
+msgstr ""
+
+msgid "This is your current session"
+msgstr ""
+
+msgid "This issue cannot be assigned to a confidential epic because it is public."
+msgstr ""
+
+msgid "This issue cannot be made public because it belongs to a confidential epic."
+msgstr ""
+
+msgid "This issue is confidential and should only be visible to team members with at least Reporter access."
+msgstr ""
+
+msgid "This issue is currently blocked by the following issues:"
+msgstr ""
+
+msgid "This issue is hidden because its author has been banned"
+msgstr ""
+
+msgid "This issue is in a child epic of the filtered epic"
+msgstr ""
+
+msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+msgstr ""
+
+msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
+msgstr ""
+
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
+msgid "This job does not have a trace."
+msgstr ""
+
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
+msgid "This job has been canceled"
+msgstr ""
+
+msgid "This job has been skipped"
+msgstr ""
+
+msgid "This job has not been triggered yet"
+msgstr ""
+
+msgid "This job has not started yet"
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}. View the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink}. View the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink}."
+msgstr ""
+
+msgid "This job is an out-of-date deployment to %{environmentLink}. View the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is archived. Only the complete pipeline can be retried."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}. This will overwrite the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink}. This will overwrite the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink}."
+msgstr ""
+
+msgid "This job is creating a deployment to %{environmentLink}. This will overwrite the %{deploymentLink}."
+msgstr ""
+
+msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
+msgstr ""
+
+msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink}."
+msgstr ""
+
+msgid "This job is deployed to %{environmentLink}."
+msgstr ""
+
+msgid "This job is in pending state and is waiting to be picked by a runner"
+msgstr ""
+
+msgid "This job is performing tasks that must complete before it can start"
+msgstr ""
+
+msgid "This job is preparing to start"
+msgstr ""
+
+msgid "This job is waiting for resource: "
+msgstr ""
+
+msgid "This job requires a manual action"
+msgstr ""
+
+msgid "This job requires manual intervention to start. Before starting this job, you can add variables below for last-minute configuration changes."
+msgstr ""
+
+msgid "This job triggers a downstream pipeline"
+msgstr ""
+
+msgid "This job will automatically run after its timer finishes. Often they are used for incremental roll-out deploys to production environments. When unscheduled it converts into a manual action."
+msgstr ""
+
+msgid "This license has already expired."
+msgstr ""
+
+msgid "This link points to external content"
+msgstr ""
+
+msgid "This may expose confidential information as the selected fork is in another namespace that can have other members."
+msgstr ""
+
+msgid "This means you can not push code until you create an empty repository or import existing one."
+msgstr ""
+
+msgid "This merge request branch is protected from force push."
+msgstr ""
+
+msgid "This merge request cannot be rebased while there are conflicts."
+msgstr ""
+
+msgid "This merge request does not have accessibility reports"
+msgstr ""
+
+msgid "This merge request does not have codequality reports"
+msgstr ""
+
+msgid "This merge request is closed. To apply this suggestion, edit this file directly."
+msgstr ""
+
+msgid "This merge request is from a private project to a public project."
+msgstr ""
+
+msgid "This merge request is from a private project to an internal project."
+msgstr ""
+
+msgid "This merge request is from an internal project to a public project."
+msgstr ""
+
+msgid "This merge request is locked."
+msgstr ""
+
+msgid "This merge request was merged. To apply this suggestion, edit this file directly."
+msgstr ""
+
+msgid "This namespace has already been taken! Please choose another one."
+msgstr ""
+
+msgid "This only applies to repository indexing operations."
+msgstr ""
+
+msgid "This option is only available on GitLab.com"
+msgstr ""
+
+msgid "This page is unavailable because you are not allowed to read information across multiple projects."
+msgstr ""
+
+msgid "This page sends a payload. Go back to the events page to see a newly created event."
+msgstr ""
+
+msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
+msgstr ""
+
+msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
+msgstr ""
+
+msgid "This pipeline was triggered by a schedule."
+msgstr ""
+
+msgid "This process deletes the project repository and all related resources."
+msgstr ""
+
+msgid "This project"
+msgstr ""
+
+msgid "This project can be restored until %{date}."
+msgstr ""
+
+msgid "This project cannot be %{visibilityLevel} because the visibility of %{openShowLink}%{name}%{closeShowLink} is %{visibility}. To make this project %{visibilityLevel}, you must first %{openEditLink}change the visibility%{closeEditLink} of the parent group."
+msgstr ""
+
+msgid "This project does not belong to a group and cannot make use of group runners."
+msgstr ""
+
+msgid "This project does not have %{service_desk_link_start}Service Desk%{service_desk_link_end} enabled, so the user who created the issue will no longer receive email notifications about new activity."
+msgstr ""
+
+msgid "This project does not have a wiki homepage yet"
+msgstr ""
+
+msgid "This project has no active access tokens."
+msgstr ""
+
+msgid "This project is %{strongStart}NOT%{strongEnd} a fork, and has the following:"
+msgstr ""
+
+msgid "This project is %{strongStart}NOT%{strongEnd} a fork. This process deletes the project repository and all related resources."
+msgstr ""
+
+msgid "This project is archived and cannot be commented on."
+msgstr ""
+
+msgid "This project is licensed under the %{strong_start}%{license_name}%{strong_end}."
+msgstr ""
+
+msgid "This project is not subscribed to any project pipelines."
+msgstr ""
+
+msgid "This project manages its dependencies using %{strong_start}%{manager_name}%{strong_end}"
+msgstr ""
+
+msgid "This project path either does not exist or you do not have access."
+msgstr ""
+
+msgid "This project will be deleted on %{date}"
+msgstr ""
+
+msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
+msgstr ""
+
+msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you house your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
+msgstr ""
+
+msgid "This repository"
+msgstr ""
+
+msgid "This repository has never been checked."
+msgstr ""
+
+msgid "This repository is currently empty. A new Auto DevOps pipeline will be created after a new file has been pushed to a branch."
+msgstr ""
+
+msgid "This repository was last checked %{last_check_timestamp}. The check %{strong_start}failed.%{strong_end} See the 'repocheck.log' file for error messages."
+msgstr ""
+
+msgid "This repository was last checked %{last_check_timestamp}. The check passed."
+msgstr ""
+
+msgid "This runner will only run on pipelines triggered on protected branches"
+msgstr ""
+
+msgid "This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgstr ""
+
+msgid "This setting can be overridden in each project."
+msgstr ""
+
+msgid "This setting is allowed for forked projects only"
+msgstr ""
+
+msgid "This subscription is for"
+msgstr ""
+
+msgid "This suggestion already matches its content."
+msgstr ""
+
+msgid "This title already exists."
+msgstr ""
+
+msgid "This user cannot be unlocked manually from GitLab"
+msgstr ""
+
+msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
+msgstr ""
+
+msgid "This user has an unconfirmed email address. You may force a confirmation."
+msgstr ""
+
+msgid "This user has no active %{type}."
+msgstr ""
+
+msgid "This user has no identities"
+msgstr ""
+
+msgid "This user has no personal projects."
+msgstr ""
+
+msgid "This user has previously committed to the %{name} project."
+msgstr ""
+
+msgid "This user has the %{access} role in the %{name} project."
+msgstr ""
+
+msgid "This user is the author of this %{noteable}."
+msgstr ""
+
+msgid "This variable can not be masked."
+msgstr ""
+
+msgid "This will invalidate your registered applications and U2F / WebAuthn devices."
+msgstr ""
+
+msgid "This will invalidate your registered applications and U2F devices."
+msgstr ""
+
+msgid "This will redirect you to an external sign in page."
+msgstr ""
+
+msgid "This will remove the fork relationship between this project and %{fork_source}."
+msgstr ""
+
+msgid "This will remove the fork relationship between this project and other projects in the fork network."
+msgstr ""
+
+msgid "Thread to reply to cannot be found"
+msgstr ""
+
+msgid "Threat monitoring"
+msgstr ""
+
+msgid "ThreatMonitoring|Alert Details"
+msgstr ""
+
+msgid "ThreatMonitoring|Alerts"
+msgstr ""
+
+msgid "ThreatMonitoring|All Environments"
+msgstr ""
+
+msgid "ThreatMonitoring|Anomalous Requests"
+msgstr ""
+
+msgid "ThreatMonitoring|Container Network Policies are not installed or have been disabled. To view this data, ensure your Network Policies are installed and enabled for your cluster."
+msgstr ""
+
+msgid "ThreatMonitoring|Container Network Policy"
+msgstr ""
+
+msgid "ThreatMonitoring|Container NetworkPolicies not detected"
+msgstr ""
+
+msgid "ThreatMonitoring|Date and time"
+msgstr ""
+
+msgid "ThreatMonitoring|Dismissed"
+msgstr ""
+
+msgid "ThreatMonitoring|Dropped Packets"
+msgstr ""
+
+msgid "ThreatMonitoring|Environment"
+msgstr ""
+
+msgid "ThreatMonitoring|Events"
+msgstr ""
+
+msgid "ThreatMonitoring|Failed to create incident, please try again."
+msgstr ""
+
+msgid "ThreatMonitoring|Hide dismissed alerts"
+msgstr ""
+
+msgid "ThreatMonitoring|In review"
+msgstr ""
+
+msgid "ThreatMonitoring|Incident"
+msgstr ""
+
+msgid "ThreatMonitoring|Name"
+msgstr ""
+
+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 ""
+
+msgid "ThreatMonitoring|No environments detected"
+msgstr ""
+
+msgid "ThreatMonitoring|Operations Per Second"
+msgstr ""
+
+msgid "ThreatMonitoring|Packet Activity"
+msgstr ""
+
+msgid "ThreatMonitoring|Requests"
+msgstr ""
+
+msgid "ThreatMonitoring|Resolved"
+msgstr ""
+
+msgid "ThreatMonitoring|Show last"
+msgstr ""
+
+msgid "ThreatMonitoring|Something went wrong, unable to fetch environments"
+msgstr ""
+
+msgid "ThreatMonitoring|Something went wrong, unable to fetch statistics"
+msgstr ""
+
+msgid "ThreatMonitoring|Statistics"
+msgstr ""
+
+msgid "ThreatMonitoring|Status"
+msgstr ""
+
+msgid "ThreatMonitoring|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
+msgstr ""
+
+msgid "ThreatMonitoring|There was an error while updating the status of the alert. Please try again."
+msgstr ""
+
+msgid "ThreatMonitoring|Threat Monitoring"
+msgstr ""
+
+msgid "ThreatMonitoring|Threat Monitoring help page link"
+msgstr ""
+
+msgid "ThreatMonitoring|Time"
+msgstr ""
+
+msgid "ThreatMonitoring|To view this data, ensure you have configured an environment for this project and that at least one threat monitoring feature is enabled. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
+msgid "ThreatMonitoring|Total Packets"
+msgstr ""
+
+msgid "ThreatMonitoring|Total Requests"
+msgstr ""
+
+msgid "ThreatMonitoring|Unreviewed"
+msgstr ""
+
+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 "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
+msgstr ""
+
+msgid "Throughput"
+msgstr ""
+
+msgid "Thursday"
+msgstr ""
+
+msgid "Time"
+msgstr ""
+
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
+msgid "Time Spent"
+msgstr ""
+
+msgid "Time based: Yes"
+msgstr ""
+
+msgid "Time before an issue gets scheduled"
+msgstr ""
+
+msgid "Time before an issue starts implementation"
+msgstr ""
+
+msgid "Time before enforced"
+msgstr ""
+
+msgid "Time between merge request creation and merge/close"
+msgstr ""
+
+msgid "Time estimate"
+msgstr ""
+
+msgid "Time from first comment to last commit"
+msgstr ""
+
+msgid "Time from first commit until first comment"
+msgstr ""
+
+msgid "Time from last commit to merge"
+msgstr ""
+
+msgid "Time in seconds"
+msgstr ""
+
+msgid "Time of import: %{importTime}"
+msgstr ""
+
+msgid "Time remaining"
+msgstr ""
+
+msgid "Time spent"
+msgstr ""
+
+msgid "Time to merge"
+msgstr ""
+
+msgid "Time to subtract exceeds the total time spent"
+msgstr ""
+
+msgid "Time tracking"
+msgstr ""
+
+msgid "Time tracking report"
+msgstr ""
+
+msgid "Time until first merge request"
+msgstr ""
+
+msgid "Time zone"
+msgstr ""
+
+msgid "TimeTrackingEstimated|Est"
+msgstr ""
+
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
+msgstr ""
+
+msgid "TimeTracking|Estimated:"
+msgstr ""
+
+msgid "TimeTracking|Over by %{timeRemainingHumanReadable}"
+msgstr ""
+
+msgid "TimeTracking|Spent"
+msgstr ""
+
+msgid "TimeTracking|Time remaining: %{timeRemainingHumanReadable}"
+msgstr ""
+
+msgid "Timeago|%s days ago"
+msgstr ""
+
+msgid "Timeago|%s days remaining"
+msgstr ""
+
+msgid "Timeago|%s hours ago"
+msgstr ""
+
+msgid "Timeago|%s hours remaining"
+msgstr ""
+
+msgid "Timeago|%s minutes ago"
+msgstr ""
+
+msgid "Timeago|%s minutes remaining"
+msgstr ""
+
+msgid "Timeago|%s months ago"
+msgstr ""
+
+msgid "Timeago|%s months remaining"
+msgstr ""
+
+msgid "Timeago|%s seconds remaining"
+msgstr ""
+
+msgid "Timeago|%s weeks ago"
+msgstr ""
+
+msgid "Timeago|%s weeks remaining"
+msgstr ""
+
+msgid "Timeago|%s years ago"
+msgstr ""
+
+msgid "Timeago|%s years remaining"
+msgstr ""
+
+msgid "Timeago|1 day ago"
+msgstr ""
+
+msgid "Timeago|1 day remaining"
+msgstr ""
+
+msgid "Timeago|1 hour ago"
+msgstr ""
+
+msgid "Timeago|1 hour remaining"
+msgstr ""
+
+msgid "Timeago|1 minute ago"
+msgstr ""
+
+msgid "Timeago|1 minute remaining"
+msgstr ""
+
+msgid "Timeago|1 month ago"
+msgstr ""
+
+msgid "Timeago|1 month remaining"
+msgstr ""
+
+msgid "Timeago|1 week ago"
+msgstr ""
+
+msgid "Timeago|1 week remaining"
+msgstr ""
+
+msgid "Timeago|1 year ago"
+msgstr ""
+
+msgid "Timeago|1 year remaining"
+msgstr ""
+
+msgid "Timeago|Past due"
+msgstr ""
+
+msgid "Timeago|in %s days"
+msgstr ""
+
+msgid "Timeago|in %s hours"
+msgstr ""
+
+msgid "Timeago|in %s minutes"
+msgstr ""
+
+msgid "Timeago|in %s months"
+msgstr ""
+
+msgid "Timeago|in %s seconds"
+msgstr ""
+
+msgid "Timeago|in %s weeks"
+msgstr ""
+
+msgid "Timeago|in %s years"
+msgstr ""
+
+msgid "Timeago|in 1 day"
+msgstr ""
+
+msgid "Timeago|in 1 hour"
+msgstr ""
+
+msgid "Timeago|in 1 minute"
+msgstr ""
+
+msgid "Timeago|in 1 month"
+msgstr ""
+
+msgid "Timeago|in 1 week"
+msgstr ""
+
+msgid "Timeago|in 1 year"
+msgstr ""
+
+msgid "Timeago|just now"
+msgstr ""
+
+msgid "Timeago|right now"
+msgstr ""
+
+msgid "Timeline|Turn timeline view off"
+msgstr ""
+
+msgid "Timeline|Turn timeline view on"
+msgstr ""
+
+msgid "Timeout"
+msgstr ""
+
+msgid "Timeout connecting to the Google API. Please try again."
+msgstr ""
+
+msgid "Timeout for moderately fast Gitaly operations (in seconds). Provide a value between Default timeout and Fast timeout."
+msgstr ""
+
+msgid "Timeout for most Gitaly operations (in seconds)."
+msgstr ""
+
+msgid "Timeout for the fastest Gitaly operations (in seconds)."
+msgstr ""
+
+msgid "Timezone"
+msgstr ""
+
+msgid "Time|hr"
+msgid_plural "Time|hrs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Time|min"
+msgid_plural "Time|mins"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Time|s"
+msgstr ""
+
+msgid "Tip: Hover over a job to see the jobs it depends on to run."
+msgstr ""
+
+msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgstr ""
+
+msgid "Title"
+msgstr ""
+
+msgid "Title:"
+msgstr ""
+
+msgid "Titles and Descriptions"
+msgstr ""
+
+msgid "To"
+msgstr ""
+
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgstr ""
+
+msgid "To Do"
+msgstr ""
+
+msgid "To GitLab"
+msgstr ""
+
+msgid "To accept this invitation, create an account or sign in."
+msgstr ""
+
+msgid "To accept this invitation, sign in or create an account."
+msgstr ""
+
+msgid "To accept this invitation, sign in."
+msgstr ""
+
+msgid "To access this domain create a new DNS record"
+msgstr ""
+
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "To add the entry manually, provide the following details to the application on your phone."
+msgstr ""
+
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
+msgid "To confirm, type %{phrase_code}"
+msgstr ""
+
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
+msgid "To define internal users, first enable new users set to external"
+msgstr ""
+
+msgid "To enable Registration Features, first enable Service Ping."
+msgstr ""
+
+msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
+msgstr ""
+
+msgid "To find the state of this project's repository at the time of any of these versions, check out %{link_start}the tags%{link_end}"
+msgstr ""
+
+msgid "To further protect your account, consider configuring a %{mfa_link_start}two-factor authentication%{mfa_link_end} method."
+msgstr ""
+
+msgid "To further protect your account, consider configuring a two-factor authentication method: %{mfa_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, click the link below to confirm your account."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
+msgid "To get started, use the link below to confirm your account."
+msgstr ""
+
+msgid "To help improve GitLab 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 ""
+
+msgid "To import an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To keep this project going, create a new issue"
+msgstr ""
+
+msgid "To keep this project going, create a new merge request"
+msgstr ""
+
+msgid "To learn more about this project, read %{link_to_wiki}"
+msgstr ""
+
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose %{strong_open}CI/CD for external repo%{strong_close}."
+msgstr ""
+
+msgid "To pass variables to the triggered pipeline, add %{code_start}variables[VARIABLE]=VALUE%{code_end} to the API request."
+msgstr ""
+
+msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
+msgstr ""
+
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
+msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
+msgstr ""
+
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
+msgstr ""
+
+msgid "To protect this issue's confidentiality, a private fork of this project was selected."
+msgstr ""
+
+msgid "To reactivate your account, %{gitlab_link_start}sign in to GitLab.%{link_end}"
+msgstr ""
+
+msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
+msgstr ""
+
+msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
+msgstr ""
+
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr ""
+
+msgid "To resolve this, try to:"
+msgstr ""
+
+msgid "To run CI/CD pipelines with JetBrains TeamCity, input the GitLab project details in the TeamCity project Version Control Settings."
+msgstr ""
+
+msgid "To see all the user's personal access tokens you must impersonate them first."
+msgstr ""
+
+msgid "To see this project's operational details, %{linkStart}upgrade its group plan to Premium%{linkEnd}. You can also remove the project from the dashboard."
+msgstr ""
+
+msgid "To see this project's operational details, contact an owner of group %{groupName} to upgrade the plan. You can also remove the project from the dashboard."
+msgstr ""
+
+msgid "To see what's changed or create a merge request, choose a branch or tag (like %{branch}), or enter a commit (like %{sha})."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
+msgid "To set up this integration:"
+msgstr ""
+
+msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
+msgstr ""
+
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
+msgid "To unsubscribe from this issue, please paste the following link into your browser:"
+msgstr ""
+
+msgid "To update Snippets with multiple files, you must use the `files` parameter"
+msgstr ""
+
+msgid "To use the additional formats, you must start the required %{container_link_start}companion containers%{container_link_end}."
+msgstr ""
+
+msgid "To use the system's default, set this value to 0."
+msgstr ""
+
+msgid "To view all %{scannedResourcesCount} scanned URLs, %{linkStart}please download the CSV file%{linkEnd}"
+msgstr ""
+
+msgid "To widen your search, change or remove filters above"
+msgstr ""
+
+msgid "To widen your search, change or remove filters above."
+msgstr ""
+
+msgid "To-Do List"
+msgstr ""
+
+msgid "To-do item successfully marked as done."
+msgstr ""
+
+msgid "Today"
+msgstr ""
+
+msgid "Todos count"
+msgstr ""
+
+msgid "Todos|Are you looking for things to do? Take a look at %{strongStart}%{openIssuesLinkStart}open issues%{openIssuesLinkEnd}%{strongEnd}, contribute to %{strongStart}%{mergeRequestLinkStart}a merge request%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd}, or mention someone in a comment to automatically assign them a new to-do item."
+msgstr ""
+
+msgid "Todos|Filter by author"
+msgstr ""
+
+msgid "Todos|Filter by group"
+msgstr ""
+
+msgid "Todos|Filter by project"
+msgstr ""
+
+msgid "Todos|It's how you always know what to work on next."
+msgstr ""
+
+msgid "Todos|Mark all as done"
+msgstr ""
+
+msgid "Todos|Nothing is on your to-do list. Nice work!"
+msgstr ""
+
+msgid "Todos|Undo mark all as done"
+msgstr ""
+
+msgid "Todos|When an issue or merge request is assigned to you, or when you receive a %{strongStart}@mention%{strongEnd} in a comment, this automatically triggers a new item in your To-Do List."
+msgstr ""
+
+msgid "Todos|You're all done!"
+msgstr ""
+
+msgid "Todos|Your To-Do List shows what to work on next"
+msgstr ""
+
+msgid "Toggle GitLab Next"
+msgstr ""
+
+msgid "Toggle Markdown preview"
+msgstr ""
+
+msgid "Toggle Sidebar"
+msgstr ""
+
+msgid "Toggle backtrace"
+msgstr ""
+
+msgid "Toggle collapse"
+msgstr ""
+
+msgid "Toggle comments for this file"
+msgstr ""
+
+msgid "Toggle commit description"
+msgstr ""
+
+msgid "Toggle commit list"
+msgstr ""
+
+msgid "Toggle dropdown"
+msgstr ""
+
+msgid "Toggle emoji award"
+msgstr ""
+
+msgid "Toggle focus mode"
+msgstr ""
+
+msgid "Toggle keyboard shortcuts help dialog"
+msgstr ""
+
+msgid "Toggle navigation"
+msgstr ""
+
+msgid "Toggle project select"
+msgstr ""
+
+msgid "Toggle shortcuts"
+msgstr ""
+
+msgid "Toggle sidebar"
+msgstr ""
+
+msgid "Toggle the Performance Bar"
+msgstr ""
+
+msgid "Toggled :%{name}: emoji award."
+msgstr ""
+
+msgid "Toggles :%{name}: emoji award."
+msgstr ""
+
+msgid "Token"
+msgstr ""
+
+msgid "Token Access"
+msgstr ""
+
+msgid "Token name"
+msgstr ""
+
+msgid "Token valid until revoked"
+msgstr ""
+
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
+msgid "Tomorrow"
+msgstr ""
+
+msgid "Too many changes to show."
+msgstr ""
+
+msgid "Too many namespaces enabled. Manage them through the console or the API."
+msgstr ""
+
+msgid "Too many projects enabled. Manage them through the console or the API."
+msgstr ""
+
+msgid "TopNav|Go back"
+msgstr ""
+
+msgid "Topic %{topic_name} was successfully created."
+msgstr ""
+
+msgid "Topic avatar"
+msgstr ""
+
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
+msgid "Topic name"
+msgstr ""
+
+msgid "Topic was successfully updated."
+msgstr ""
+
+msgid "Topics"
+msgstr ""
+
+msgid "Total"
+msgstr ""
+
+msgid "Total Contributions"
+msgstr ""
+
+msgid "Total Score"
+msgstr ""
+
+msgid "Total artifacts size: %{total_size}"
+msgstr ""
+
+msgid "Total cores (CPUs)"
+msgstr ""
+
+msgid "Total issues"
+msgstr ""
+
+msgid "Total memory (GB)"
+msgstr ""
+
+msgid "Total test time for all commits/merges"
+msgstr ""
+
+msgid "Total users"
+msgstr ""
+
+msgid "Total weight"
+msgstr ""
+
+msgid "Total: %{total}"
+msgstr ""
+
+msgid "TotalMilestonesIndicator|1000+"
+msgstr ""
+
+msgid "TotalRefCountIndicator|1000+"
+msgstr ""
+
+msgid "Tracing"
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
+msgid "Track time with quick actions"
+msgstr ""
+
+msgid "Training mode"
+msgstr ""
+
+msgid "Transfer"
+msgstr ""
+
+msgid "Transfer group to another parent group."
+msgstr ""
+
+msgid "Transfer ownership"
+msgstr ""
+
+msgid "Transfer project"
+msgstr ""
+
+msgid "Transfer your project into another namespace. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "TransferGroup|Cannot transfer group to one of its subgroup."
+msgstr ""
+
+msgid "TransferGroup|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
+msgstr ""
+
+msgid "TransferGroup|Database is not supported."
+msgstr ""
+
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
+msgid "TransferGroup|Group contains projects with NPM packages."
+msgstr ""
+
+msgid "TransferGroup|Group is already a root group."
+msgstr ""
+
+msgid "TransferGroup|Group is already associated to the parent group."
+msgstr ""
+
+msgid "TransferGroup|The parent group already has a subgroup or a project with the same path."
+msgstr ""
+
+msgid "TransferGroup|Transfer failed: %{error_message}"
+msgstr ""
+
+msgid "TransferGroup|You don't have enough permissions."
+msgstr ""
+
+msgid "TransferProject|Cannot move project"
+msgstr ""
+
+msgid "TransferProject|Please select a new namespace for your project."
+msgstr ""
+
+msgid "TransferProject|Project cannot be transferred, because tags are present in its container registry"
+msgstr ""
+
+msgid "TransferProject|Project is already in this namespace."
+msgstr ""
+
+msgid "TransferProject|Project with same name or path in target namespace already exists"
+msgstr ""
+
+msgid "TransferProject|Root namespace can't be updated if project has NPM packages"
+msgstr ""
+
+msgid "TransferProject|You don't have permission to transfer projects into that namespace."
+msgstr ""
+
+msgid "TransferProject|You don't have permission to transfer this project."
+msgstr ""
+
+msgid "Tree view"
+msgstr ""
+
+msgid "Trending"
+msgstr ""
+
+msgid "Trials|%{planName} Trial"
+msgstr ""
+
+msgid "Trials|Compare all plans"
+msgstr ""
+
+msgid "Trials|Create a new group to start your GitLab Ultimate trial."
+msgstr ""
+
+msgid "Trials|Day %{daysUsed}/%{duration}"
+msgstr ""
+
+msgid "Trials|Go back to GitLab"
+msgstr ""
+
+msgid "Trials|Hey there"
+msgstr ""
+
+msgid "Trials|Skip Trial"
+msgstr ""
+
+msgid "Trials|Upgrade %{groupName} to %{planName}"
+msgstr ""
+
+msgid "Trials|You can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
+msgstr ""
+
+msgid "Trials|You can apply your trial to a new group or an existing group."
+msgstr ""
+
+msgid "Trials|You won't get a free trial right now but you can always resume this process by selecting your avatar and choosing 'Start an Ultimate trial'"
+msgstr ""
+
+msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope you’re enjoying the features of GitLab %{planName}. To keep those features after your trial ends, you’ll need to buy a subscription. (You can also choose GitLab Premium if it meets your needs.)"
+msgstr ""
+
+msgid "Trial|Allowed characters: +, 0-9, -, and spaces."
+msgstr ""
+
+msgid "Trial|Company name"
+msgstr ""
+
+msgid "Trial|Continue"
+msgstr ""
+
+msgid "Trial|Continue using the basic features of GitLab for free."
+msgstr ""
+
+msgid "Trial|Country"
+msgstr ""
+
+msgid "Trial|Dismiss"
+msgstr ""
+
+msgid "Trial|GitLab Ultimate trial (optional)"
+msgstr ""
+
+msgid "Trial|Number of employees"
+msgstr ""
+
+msgid "Trial|Please select a country"
+msgstr ""
+
+msgid "Trial|Successful trial activation image"
+msgstr ""
+
+msgid "Trial|Telephone number"
+msgstr ""
+
+msgid "Trial|Upgrade to Ultimate to keep using GitLab with advanced features."
+msgstr ""
+
+msgid "Trial|We will activate your trial on your group after you complete this step. After 30 days, you can:"
+msgstr ""
+
+msgid "Trial|Your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information to activate your trial."
+msgstr ""
+
+msgid "Trigger"
+msgstr ""
+
+msgid "Trigger a pipeline for a branch or tag by generating a trigger token and using it with an API call. The token impersonates a user's project access and permissions."
+msgstr ""
+
+msgid "Trigger cluster reindexing"
+msgstr ""
+
+msgid "Trigger cluster reindexing. Only use this with an index that was created in GitLab 13.0 or later."
+msgstr ""
+
+msgid "Trigger manual job"
+msgstr ""
+
+msgid "Trigger pipelines for mirror updates"
+msgstr ""
+
+msgid "Trigger pipelines when branches or tags are updated in the upstream repository. Depending on the activity of the upstream repository, this may greatly increase the load on your CI runners. Only enable this if you know they can handle the load."
+msgstr ""
+
+msgid "Trigger removed."
+msgstr ""
+
+msgid "Trigger repository check"
+msgstr ""
+
+msgid "Trigger this manual action"
+msgstr ""
+
+msgid "Trigger token:"
+msgstr ""
+
+msgid "Trigger variables:"
+msgstr ""
+
+msgid "Trigger was created successfully."
+msgstr ""
+
+msgid "Trigger was successfully updated."
+msgstr ""
+
+msgid "Triggerer"
+msgstr ""
+
+msgid "Trigger|Trigger user has insufficient permissions to project"
+msgstr ""
+
+msgid "Trigger|invalid"
+msgstr ""
+
+msgid "Troubleshoot and monitor your application with tracing"
+msgstr ""
+
+msgid "Trusted"
+msgstr ""
+
+msgid "Try again"
+msgstr ""
+
+msgid "Try again?"
+msgstr ""
+
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
+msgid "Try all GitLab has to offer for 30 days."
+msgstr ""
+
+msgid "Try changing or removing filters."
+msgstr ""
+
+msgid "Try grouping with different labels"
+msgstr ""
+
+msgid "Try out GitLab Pipelines"
+msgstr ""
+
+msgid "Try the troubleshooting steps here."
+msgstr ""
+
+msgid "Try to fork again"
+msgstr ""
+
+msgid "Try to keep the first line under 52 characters and the others under 72."
+msgstr ""
+
+msgid "Try using a different search term to find the file you are looking for."
+msgstr ""
+
+msgid "Trying to communicate with your device. Plug it in (if needed) and press the button on the device now."
+msgstr ""
+
+msgid "Trying to communicate with your device. Plug it in (if you haven't already) and press the button on the device now."
+msgstr ""
+
+msgid "Tuesday"
+msgstr ""
+
+msgid "Tuning settings"
+msgstr ""
+
+msgid "Turn off"
+msgstr ""
+
+msgid "Turn on"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
+msgid "Twitter:"
+msgstr ""
+
+msgid "Two-Factor Authentication"
+msgstr ""
+
+msgid "Two-Factor Authentication code"
+msgstr ""
+
+msgid "Two-factor Authentication"
+msgstr ""
+
+msgid "Two-factor Authentication Recovery codes"
+msgstr ""
+
+msgid "Two-factor Authentication:"
+msgstr ""
+
+msgid "Two-factor authentication"
+msgstr ""
+
+msgid "Two-factor authentication disabled"
+msgstr ""
+
+msgid "Two-factor authentication has been disabled for this user"
+msgstr ""
+
+msgid "Two-factor authentication has been disabled for your GitLab account."
+msgstr ""
+
+msgid "Two-factor authentication has been disabled successfully!"
+msgstr ""
+
+msgid "Two-factor authentication is not enabled for this user"
+msgstr ""
+
+msgid "Two-factor grace period"
+msgstr ""
+
+msgid "Type"
+msgstr ""
+
+msgid "Type/State"
+msgstr ""
+
+msgid "U2F Devices (%{length})"
+msgstr ""
+
+msgid "U2F only works with HTTPS-enabled websites. Contact your administrator for more details."
+msgstr ""
+
+msgid "URL"
+msgstr ""
+
+msgid "URL cannot be blank"
+msgstr ""
+
+msgid "URL is invalid"
+msgstr ""
+
+msgid "URL is required"
+msgstr ""
+
+msgid "URL is triggered for each branch updated to the repository"
+msgstr ""
+
+msgid "URL is triggered when a merge request is created, updated, or merged"
+msgstr ""
+
+msgid "URL is triggered when a new tag is pushed to the repository"
+msgstr ""
+
+msgid "URL is triggered when repository is updated"
+msgstr ""
+
+msgid "URL must be percent-encoded if necessary."
+msgstr ""
+
+msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
+msgstr ""
+
+msgid "URL of the Grafana instance to link to from the Metrics Dashboard menu item."
+msgstr ""
+
+msgid "URL of the external Spam Check endpoint"
+msgstr ""
+
+msgid "URL of the external storage to serve the repository static objects."
+msgstr ""
+
+msgid "URL or request ID"
+msgstr ""
+
+msgid "USER %{user_name} WILL BE REMOVED! Are you sure?"
+msgstr ""
+
+msgid "USER %{user} WILL BE REMOVED! Are you sure?"
+msgstr ""
+
+msgid "USER WILL BE BLOCKED! Are you sure?"
+msgstr ""
+
+msgid "UTC"
+msgstr ""
+
+msgid "Unable to apply suggestions to a deleted line."
+msgstr ""
+
+msgid "Unable to build Slack link."
+msgstr ""
+
+msgid "Unable to collect CPU info"
+msgstr ""
+
+msgid "Unable to collect memory info"
+msgstr ""
+
+msgid "Unable to connect to Elasticsearch"
+msgstr ""
+
+msgid "Unable to connect to Prometheus server"
+msgstr ""
+
+msgid "Unable to connect to server: %{error}"
+msgstr ""
+
+msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
+msgstr ""
+
+msgid "Unable to convert Kubernetes logs encoding to UTF-8"
+msgstr ""
+
+msgid "Unable to create link to vulnerability"
+msgstr ""
+
+msgid "Unable to fetch branch list for this project."
+msgstr ""
+
+msgid "Unable to fetch branches list, please close the form and try again"
+msgstr ""
+
+msgid "Unable to fetch upstream and downstream pipelines."
+msgstr ""
+
+msgid "Unable to fetch vulnerable projects"
+msgstr ""
+
+msgid "Unable to find Jira project to import data from."
+msgstr ""
+
+msgid "Unable to generate new instance ID"
+msgstr ""
+
+msgid "Unable to load commits. Try again later."
+msgstr ""
+
+msgid "Unable to load file contents. Try again later."
+msgstr ""
+
+msgid "Unable to load refs"
+msgstr ""
+
+msgid "Unable to load the diff"
+msgstr ""
+
+msgid "Unable to load the diff. %{button_try_again}"
+msgstr ""
+
+msgid "Unable to load the merge request widget. Try reloading the page."
+msgstr ""
+
+msgid "Unable to save iteration. Please try again"
+msgstr ""
+
+msgid "Unable to save your changes. Please try again."
+msgstr ""
+
+msgid "Unable to save your preference"
+msgstr ""
+
+msgid "Unable to schedule a pipeline to run immediately"
+msgstr ""
+
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unable to suggest a path. Please refresh and try again."
+msgstr ""
+
+msgid "Unable to update label prioritization at this time"
+msgstr ""
+
+msgid "Unable to update this epic at this time."
+msgstr ""
+
+msgid "Unable to update this issue at this time."
+msgstr ""
+
+msgid "Unable to verify the user"
+msgstr ""
+
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
+msgid "Unarchive project"
+msgstr ""
+
+msgid "Unarchiving the project 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 ""
+
+msgid "Unassign from commenting user"
+msgstr ""
+
+msgid "Unassigned"
+msgstr ""
+
+msgid "Unauthenticated API rate limit period in seconds"
+msgstr ""
+
+msgid "Unauthenticated requests"
+msgstr ""
+
+msgid "Unauthenticated web rate limit period in seconds"
+msgstr ""
+
+msgid "Uncommitted changes will be lost if you change branches. Do you want to continue?"
+msgstr ""
+
+msgid "Undo"
+msgstr ""
+
+msgid "Undo Ignore"
+msgstr ""
+
+msgid "Undo ignore"
+msgstr ""
+
+msgid "Unexpected error"
+msgstr ""
+
+msgid "Unfollow"
+msgstr ""
+
+msgid "Unfortunately, your email message to GitLab could not be processed."
+msgstr ""
+
+msgid "Unhappy?"
+msgstr ""
+
+msgid "Units|ms"
+msgstr ""
+
+msgid "Units|s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Unknown Error"
+msgstr ""
+
+msgid "Unknown cache key"
+msgstr ""
+
+msgid "Unknown encryption strategy: %{encrypted_strategy}!"
+msgstr ""
+
+msgid "Unknown format"
+msgstr ""
+
+msgid "Unknown response text"
+msgstr ""
+
+msgid "Unknown screen"
+msgstr ""
+
+msgid "Unknown user"
+msgstr ""
+
+msgid "Unless otherwise agreed to in writing with GitLab, by clicking \"Upload License\" you agree that your use of GitLab Software is subject to the %{eula_link_start}Terms of Service%{eula_link_end}."
+msgstr ""
+
+msgid "Unlimited"
+msgstr ""
+
+msgid "Unlink"
+msgstr ""
+
+msgid "Unlock"
+msgstr ""
+
+msgid "Unlock account"
+msgstr ""
+
+msgid "Unlock more features with GitLab Ultimate"
+msgstr ""
+
+msgid "Unlock the discussion"
+msgstr ""
+
+msgid "Unlock this %{issuableDisplayName}? %{strongStart}Everyone%{strongEnd} will be able to comment."
+msgstr ""
+
+msgid "Unlocked"
+msgstr ""
+
+msgid "Unlocked the discussion."
+msgstr ""
+
+msgid "Unlocks the discussion."
+msgstr ""
+
+msgid "Unmarked this %{noun} as a draft."
+msgstr ""
+
+msgid "Unmarks this %{noun} as a draft."
+msgstr ""
+
+msgid "Unreachable"
+msgstr ""
+
+msgid "Unrecognized approval status."
+msgstr ""
+
+msgid "Unrecognized cluster type"
+msgstr ""
+
+msgid "Unresolve"
+msgstr ""
+
+msgid "Unresolve thread"
+msgstr ""
+
+msgid "Unresolved"
+msgstr ""
+
+msgid "Unschedule job"
+msgstr ""
+
+msgid "Unstar"
+msgstr ""
+
+msgid "Unstarted"
+msgstr ""
+
+msgid "Unsubscribe"
+msgstr ""
+
+msgid "Unsubscribe at group level"
+msgstr ""
+
+msgid "Unsubscribe at project level"
+msgstr ""
+
+msgid "Unsubscribe from %{type}"
+msgstr ""
+
+msgid "Unsubscribed from this %{quick_action_target}."
+msgstr ""
+
+msgid "Unsubscribes from this %{quick_action_target}."
+msgstr ""
+
+msgid "Unsupported sort value."
+msgstr ""
+
+msgid "Unsupported todo type passed. Supported todo types are: %{todo_types}"
+msgstr ""
+
+msgid "Until revoked, expired personal access tokens pose a security risk."
+msgstr ""
+
+msgid "Unused"
+msgstr ""
+
+msgid "Unused, previous indices: %{index_names} will be deleted after %{time} automatically."
+msgstr ""
+
+msgid "Unverified"
+msgstr ""
+
+msgid "Up to date"
+msgstr ""
+
+msgid "Upcoming"
+msgstr ""
+
+msgid "Upcoming Release"
+msgstr ""
+
+msgid "Update"
+msgstr ""
+
+msgid "Update %{sourcePath} file"
+msgstr ""
+
+msgid "Update Now"
+msgstr ""
+
+msgid "Update Scheduled…"
+msgstr ""
+
+msgid "Update all"
+msgstr ""
+
+msgid "Update appearance settings"
+msgstr ""
+
+msgid "Update approval rule"
+msgstr ""
+
+msgid "Update approvers"
+msgstr ""
+
+msgid "Update broadcast message"
+msgstr ""
+
+msgid "Update failed"
+msgstr ""
+
+msgid "Update it"
+msgstr ""
+
+msgid "Update iteration"
+msgstr ""
+
+msgid "Update milestone"
+msgstr ""
+
+msgid "Update now"
+msgstr ""
+
+msgid "Update username"
+msgstr ""
+
+msgid "Update variable"
+msgstr ""
+
+msgid "Update your bookmarked URLs as filtered/sorted branches URL has been changed."
+msgstr ""
+
+msgid "Update your group name, description, avatar, and visibility."
+msgstr ""
+
+msgid "Update your project name, topics, description, and avatar."
+msgstr ""
+
+msgid "UpdateProject|Cannot rename project because it contains container registry tags!"
+msgstr ""
+
+msgid "UpdateProject|Could not set the default branch"
+msgstr ""
+
+msgid "UpdateProject|New visibility level not allowed!"
+msgstr ""
+
+msgid "UpdateProject|Project could not be updated!"
+msgstr ""
+
+msgid "UpdateRepositoryStorage|Failed to verify %{type} repository checksum from %{old} to %{new}"
+msgstr ""
+
+msgid "UpdateRepositoryStorage|Timeout waiting for %{type} repository pushes"
+msgstr ""
+
+msgid "Updated"
+msgstr ""
+
+msgid "Updated %{updated_at} by %{updated_by}"
+msgstr ""
+
+msgid "Updated date"
+msgstr ""
+
+msgid "Updates"
+msgstr ""
+
+msgid "Updating"
+msgstr ""
+
+msgid "Updating the attention request for %{username} failed."
+msgstr ""
+
+msgid "Updating…"
+msgstr ""
+
+msgid "Upgrade offers available!"
+msgstr ""
+
+msgid "Upgrade your plan"
+msgstr ""
+
+msgid "Upload"
+msgstr ""
+
+msgid "Upload %{file_name} file"
+msgstr ""
+
+msgid "Upload CSV file"
+msgstr ""
+
+msgid "Upload File"
+msgstr ""
+
+msgid "Upload New File"
+msgstr ""
+
+msgid "Upload a certificate for your domain with all intermediates"
+msgstr ""
+
+msgid "Upload a private key for your certificate"
+msgstr ""
+
+msgid "Upload an image"
+msgstr ""
+
+msgid "Upload file"
+msgstr ""
+
+msgid "Upload image"
+msgstr ""
+
+msgid "Upload new file"
+msgstr ""
+
+msgid "Upload object map"
+msgstr ""
+
+msgid "UploadLink|click to upload"
+msgstr ""
+
+msgid "Uploaded"
+msgstr ""
+
+msgid "Uploading changes to terminal"
+msgstr ""
+
+msgid "Upstream"
+msgstr ""
+
+msgid "Uptime"
+msgstr ""
+
+msgid "Upvotes"
+msgstr ""
+
+msgid "Usage Trends"
+msgstr ""
+
+msgid "Usage statistics"
+msgstr ""
+
+msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
+msgstr ""
+
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
+msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
+msgstr ""
+
+msgid "UsageQuota|Artifacts"
+msgstr ""
+
+msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
+msgstr ""
+
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
+msgid "UsageQuota|Because of a known issue, the artifact total for some projects may be incorrect. For more details, read %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
+msgid "UsageQuota|Buy additional minutes"
+msgstr ""
+
+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|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+msgstr ""
+
+msgid "UsageQuota|Git repository."
+msgstr ""
+
+msgid "UsageQuota|Includes artifacts, repositories, wiki, uploads, and other items."
+msgstr ""
+
+msgid "UsageQuota|Increase storage temporarily"
+msgstr ""
+
+msgid "UsageQuota|LFS storage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about excess storage usage"
+msgstr ""
+
+msgid "UsageQuota|Learn more about usage quotas"
+msgstr ""
+
+msgid "UsageQuota|No CI minutes usage data available."
+msgstr ""
+
+msgid "UsageQuota|Packages"
+msgstr ""
+
+msgid "UsageQuota|Pending Members"
+msgstr ""
+
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
+msgid "UsageQuota|Pipelines"
+msgstr ""
+
+msgid "UsageQuota|Purchase more storage"
+msgstr ""
+
+msgid "UsageQuota|Purchased storage available"
+msgstr ""
+
+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 ""
+
+msgid "UsageQuota|Storage"
+msgstr ""
+
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|Storage used"
+msgstr ""
+
+msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
+msgstr ""
+
+msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
+msgstr ""
+
+msgid "UsageQuota|This namespace contains locked projects"
+msgstr ""
+
+msgid "UsageQuota|This namespace has no projects which use shared runners"
+msgstr ""
+
+msgid "UsageQuota|Total excess storage used"
+msgstr ""
+
+msgid "UsageQuota|Total namespace storage used"
+msgstr ""
+
+msgid "UsageQuota|Unlimited"
+msgstr ""
+
+msgid "UsageQuota|Uploads"
+msgstr ""
+
+msgid "UsageQuota|Usage"
+msgstr ""
+
+msgid "UsageQuota|Usage Quotas"
+msgstr ""
+
+msgid "UsageQuota|Usage breakdown"
+msgstr ""
+
+msgid "UsageQuota|Usage of group resources across the projects in the %{strong_start}%{group_name}%{strong_end} group"
+msgstr ""
+
+msgid "UsageQuota|Usage of project resources across the %{strong_start}%{project_name}%{strong_end} project"
+msgstr ""
+
+msgid "UsageQuota|Usage of resources across your projects"
+msgstr ""
+
+msgid "UsageQuota|Usage quotas help link"
+msgstr ""
+
+msgid "UsageQuota|Usage since"
+msgstr ""
+
+msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
+msgstr ""
+
+msgid "UsageQuota|Wiki"
+msgstr ""
+
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
+msgid "UsageQuota|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{actualRepositorySizeLimit} limit."
+msgstr ""
+
+msgid "UsageQuota|You have reached the free storage limit of %{actualRepositorySizeLimit} on %{projectsLockedText}. To unlock them, please purchase additional storage."
+msgstr ""
+
+msgid "UsageQuota|You used: %{usage} %{limit}"
+msgstr ""
+
+msgid "UsageQuota|Your purchased storage is running low. To avoid locked projects, please purchase more storage."
+msgstr ""
+
+msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
+msgstr ""
+
+msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "UsageTrends|Could not load the pipelines chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "UsageTrends|Could not load the projects and groups chart. Please refresh the page to try again."
+msgstr ""
+
+msgid "UsageTrends|Groups"
+msgstr ""
+
+msgid "UsageTrends|Issues"
+msgstr ""
+
+msgid "UsageTrends|Issues & merge requests"
+msgstr ""
+
+msgid "UsageTrends|Items"
+msgstr ""
+
+msgid "UsageTrends|Merge requests"
+msgstr ""
+
+msgid "UsageTrends|Month"
+msgstr ""
+
+msgid "UsageTrends|No data available."
+msgstr ""
+
+msgid "UsageTrends|Pipelines"
+msgstr ""
+
+msgid "UsageTrends|Pipelines canceled"
+msgstr ""
+
+msgid "UsageTrends|Pipelines failed"
+msgstr ""
+
+msgid "UsageTrends|Pipelines skipped"
+msgstr ""
+
+msgid "UsageTrends|Pipelines succeeded"
+msgstr ""
+
+msgid "UsageTrends|Pipelines total"
+msgstr ""
+
+msgid "UsageTrends|Projects"
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the cancelled pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the failed pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the groups. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the issues. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the merge requests. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the projects. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the skipped pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the successful pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|There was an error fetching the total pipelines. Please try again."
+msgstr ""
+
+msgid "UsageTrends|Total groups"
+msgstr ""
+
+msgid "UsageTrends|Total projects"
+msgstr ""
+
+msgid "UsageTrends|Total projects & groups"
+msgstr ""
+
+msgid "UsageTrends|Users"
+msgstr ""
+
+msgid "Use %{code_start}::%{code_end} to create a %{link_start}scoped label set%{link_end} (eg. %{code_start}priority::1%{code_end})"
+msgstr ""
+
+msgid "Use .gitlab-ci.yml"
+msgstr ""
+
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
+msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
+msgstr ""
+
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
+msgid "Use authorized_keys file to authenticate SSH keys"
+msgstr ""
+
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
+msgid "Use cURL"
+msgstr ""
+
+msgid "Use custom color #FF0000"
+msgstr ""
+
+msgid "Use double quotes for multiple keywords, such as %{code_open}\"your search\"%{code_close}"
+msgstr ""
+
+msgid "Use hashed storage"
+msgstr ""
+
+msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+msgstr ""
+
+msgid "Use issue count"
+msgstr ""
+
+msgid "Use issue weight"
+msgstr ""
+
+msgid "Use one line per URI"
+msgstr ""
+
+msgid "Use primary email (%{email})"
+msgstr ""
+
+msgid "Use shortcuts"
+msgstr ""
+
+msgid "Use slash commands."
+msgstr ""
+
+msgid "Use template"
+msgstr ""
+
+msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
+msgstr ""
+
+msgid "Use the link below to confirm your email address (%{email})"
+msgstr ""
+
+msgid "Use the link below to confirm your email address."
+msgstr ""
+
+msgid "Use the public cloud instance URL (%{kroki_public_url}) or %{install_link_start}install Kroki%{install_link_end} on your own infrastructure and use your own instance URL."
+msgstr ""
+
+msgid "Use the search bar on the top of this page"
+msgstr ""
+
+msgid "Use this token to validate received payloads."
+msgstr ""
+
+msgid "Use webhook"
+msgstr ""
+
+msgid "Use your global notification setting"
+msgstr ""
+
+msgid "Use your smart card to authenticate with the LDAP server."
+msgstr ""
+
+msgid "Used"
+msgstr ""
+
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "Used by more than 100,000 organizations, GitLab is the most popular solution to manage git repositories on-premises."
+msgstr ""
+
+msgid "Used programming language"
+msgstr ""
+
+msgid "Used to help configure your identity provider"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "User %{current_user_username} has started impersonating %{username}"
+msgstr ""
+
+msgid "User %{username} was successfully removed."
+msgstr ""
+
+msgid "User %{user} was removed from %{group}."
+msgstr ""
+
+msgid "User ID"
+msgstr ""
+
+msgid "User OAuth applications"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User cap"
+msgstr ""
+
+msgid "User cap cannot be enabled. The group or one of its subgroups or projects is shared externally."
+msgstr ""
+
+msgid "User created at"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
+
+msgid "User identity was successfully created."
+msgstr ""
+
+msgid "User identity was successfully removed."
+msgstr ""
+
+msgid "User identity was successfully updated."
+msgstr ""
+
+msgid "User is not allowed to resolve thread"
+msgstr ""
+
+msgid "User key"
+msgstr ""
+
+msgid "User key was successfully removed."
+msgstr ""
+
+msgid "User list %{name} will be removed. Are you sure?"
+msgstr ""
+
+msgid "User map"
+msgstr ""
+
+msgid "User pipeline minutes were successfully reset."
+msgstr ""
+
+msgid "User restrictions"
+msgstr ""
+
+msgid "User settings"
+msgstr ""
+
+msgid "User was successfully created."
+msgstr ""
+
+msgid "User was successfully removed from group and any subgroups and projects."
+msgstr ""
+
+msgid "User was successfully removed from group."
+msgstr ""
+
+msgid "User was successfully removed from project."
+msgstr ""
+
+msgid "User was successfully updated."
+msgstr ""
+
+msgid "User-based escalation rules must have a user with access to the project"
+msgstr ""
+
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
+msgid "UserAvailability|%{author} (Busy)"
+msgstr ""
+
+msgid "UserAvailability|(Busy)"
+msgstr ""
+
+msgid "UserLists|Add"
+msgstr ""
+
+msgid "UserLists|Add Users"
+msgstr ""
+
+msgid "UserLists|Add users"
+msgstr ""
+
+msgid "UserLists|Cancel"
+msgstr ""
+
+msgid "UserLists|Create"
+msgstr ""
+
+msgid "UserLists|Define a set of users to be used within feature flag strategies"
+msgstr ""
+
+msgid "UserLists|Edit"
+msgstr ""
+
+msgid "UserLists|Edit %{name}"
+msgstr ""
+
+msgid "UserLists|Enter a comma separated list of user IDs. These IDs should be the users of the system in which the feature flag is set, not GitLab IDs"
+msgstr ""
+
+msgid "UserLists|Feature flag user list"
+msgstr ""
+
+msgid "UserLists|Get started with user lists"
+msgstr ""
+
+msgid "UserLists|Lists allow you to define a set of users to be used with feature flags. %{linkStart}Read more about feature flag lists.%{linkEnd}"
+msgstr ""
+
+msgid "UserLists|Loading user lists"
+msgstr ""
+
+msgid "UserLists|Name"
+msgstr ""
+
+msgid "UserLists|New list"
+msgstr ""
+
+msgid "UserLists|New user list"
+msgstr ""
+
+msgid "UserLists|Save"
+msgstr ""
+
+msgid "UserLists|There are no users"
+msgstr ""
+
+msgid "UserLists|There was an error fetching the user lists."
+msgstr ""
+
+msgid "UserLists|User ID"
+msgstr ""
+
+msgid "UserLists|User IDs"
+msgstr ""
+
+msgid "UserLists|User Lists"
+msgstr ""
+
+msgid "UserLists|User lists allow you to define a set of users to use with Feature Flags."
+msgstr ""
+
+msgid "UserList|Delete %{name}?"
+msgstr ""
+
+msgid "UserList|created %{timeago}"
+msgstr ""
+
+msgid "UserProfile|(Busy)"
+msgstr ""
+
+msgid "UserProfile|Activity"
+msgstr ""
+
+msgid "UserProfile|Already reported for abuse"
+msgstr ""
+
+msgid "UserProfile|Blocked user"
+msgstr ""
+
+msgid "UserProfile|Bot activity"
+msgstr ""
+
+msgid "UserProfile|Contributed projects"
+msgstr ""
+
+msgid "UserProfile|Edit profile"
+msgstr ""
+
+msgid "UserProfile|Explore public groups to find projects to contribute to."
+msgstr ""
+
+msgid "UserProfile|Followers"
+msgstr ""
+
+msgid "UserProfile|Following"
+msgstr ""
+
+msgid "UserProfile|Groups"
+msgstr ""
+
+msgid "UserProfile|Groups are the best way to manage projects and members."
+msgstr ""
+
+msgid "UserProfile|Join or create a group to start contributing by commenting on issues or submitting merge requests!"
+msgstr ""
+
+msgid "UserProfile|Most Recent Activity"
+msgstr ""
+
+msgid "UserProfile|No snippets found."
+msgstr ""
+
+msgid "UserProfile|Overview"
+msgstr ""
+
+msgid "UserProfile|Personal projects"
+msgstr ""
+
+msgid "UserProfile|Pronounced as: %{pronunciation}"
+msgstr ""
+
+msgid "UserProfile|Report abuse"
+msgstr ""
+
+msgid "UserProfile|Retry"
+msgstr ""
+
+msgid "UserProfile|Snippets"
+msgstr ""
+
+msgid "UserProfile|Snippets in GitLab can either be private, internal, or public."
+msgstr ""
+
+msgid "UserProfile|Star projects to track their progress and show your appreciation."
+msgstr ""
+
+msgid "UserProfile|Starred projects"
+msgstr ""
+
+msgid "UserProfile|Subscribe"
+msgstr ""
+
+msgid "UserProfile|This user doesn't have any followers."
+msgstr ""
+
+msgid "UserProfile|This user doesn't have any personal projects"
+msgstr ""
+
+msgid "UserProfile|This user has a private profile"
+msgstr ""
+
+msgid "UserProfile|This user hasn't contributed to any projects"
+msgstr ""
+
+msgid "UserProfile|This user hasn't starred any projects"
+msgstr ""
+
+msgid "UserProfile|This user is blocked"
+msgstr ""
+
+msgid "UserProfile|This user isn't following other users."
+msgstr ""
+
+msgid "UserProfile|Unconfirmed user"
+msgstr ""
+
+msgid "UserProfile|View all"
+msgstr ""
+
+msgid "UserProfile|View user in admin area"
+msgstr ""
+
+msgid "UserProfile|You are not following other users."
+msgstr ""
+
+msgid "UserProfile|You can create a group for several dependent projects."
+msgstr ""
+
+msgid "UserProfile|You do not have any followers."
+msgstr ""
+
+msgid "UserProfile|You haven't created any personal projects."
+msgstr ""
+
+msgid "UserProfile|You haven't created any snippets."
+msgstr ""
+
+msgid "UserProfile|Your projects can be available publicly, internally, or privately, at your choice."
+msgstr ""
+
+msgid "UserProfile|at"
+msgstr ""
+
+msgid "UserProfile|made a private contribution"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "Username (optional)"
+msgstr ""
+
+msgid "Username is already taken."
+msgstr ""
+
+msgid "Username is available."
+msgstr ""
+
+msgid "Username or email"
+msgstr ""
+
+msgid "Username:"
+msgstr ""
+
+msgid "Username: %{username}"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Users API rate limit"
+msgstr ""
+
+msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
+msgstr ""
+
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
+msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
+msgstr ""
+
+msgid "Users in License"
+msgstr ""
+
+msgid "Users or groups set as approvers in the project's or merge request's settings."
+msgstr ""
+
+msgid "Users over License"
+msgstr ""
+
+msgid "Users requesting access to"
+msgstr ""
+
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
+msgid "Users were successfully added."
+msgstr ""
+
+msgid "Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
+msgstr ""
+
+msgid "UsersSelect|%{name} + %{length} more"
+msgstr ""
+
+msgid "UsersSelect|Any User"
+msgstr ""
+
+msgid "UsersSelect|Assignee"
+msgstr ""
+
+msgid "UsersSelect|No assignee - %{openingTag} assign yourself %{closingTag}"
+msgstr ""
+
+msgid "UsersSelect|Unassigned"
+msgstr ""
+
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
+msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
+msgstr ""
+
+msgid "Using required encryption strategy when encrypted field is missing!"
+msgstr ""
+
+msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
+msgstr ""
+
+msgid "Valid From"
+msgstr ""
+
+msgid "Validate"
+msgstr ""
+
+msgid "Validate your GitLab CI configuration"
+msgstr ""
+
+msgid "Validate your GitLab CI configuration file"
+msgstr ""
+
+msgid "Validated at"
+msgstr ""
+
+msgid "Validated at:"
+msgstr ""
+
+msgid "Validated:"
+msgstr ""
+
+msgid "Validations failed."
+msgstr ""
+
+msgid "Value"
+msgstr ""
+
+msgid "Value Stream Analytics"
+msgstr ""
+
+msgid "Value Stream Analytics can help you determine your team’s velocity"
+msgstr ""
+
+msgid "Value might contain a variable reference"
+msgstr ""
+
+msgid "Value stream"
+msgstr ""
+
+msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{value}M"
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{value}d"
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{value}h"
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{value}m"
+msgstr ""
+
+msgid "ValueStreamAnalytics|%{value}w"
+msgstr ""
+
+msgid "ValueStreamAnalytics|&lt;1m"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Average number of deployments to production per day."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Dashboard"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Go to docs"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Items in Value Stream Analytics are currently filtered by their creation time. There is an %{epic_link_start}epic%{epic_link_end} that will change the Value Stream Analytics date filter to use the end event time for the selected stage."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Median time between merge request merge and deployment to a production environment for all MRs deployed in the given time period."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Median time from issue created to issue closed."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
+msgstr ""
+
+msgid "ValueStreamAnalytics|Number of new issues created."
+msgstr ""
+
+msgid "ValueStreamAnalytics|There was an error while fetching value stream analytics %{requestTypeName} data."
+msgstr ""
+
+msgid "ValueStreamAnalytics|Total number of deploys to production."
+msgstr ""
+
+msgid "ValueStreamEvent|Items in stage"
+msgstr ""
+
+msgid "ValueStreamEvent|Stage time (median)"
+msgstr ""
+
+msgid "ValueStreamEvent|Start"
+msgstr ""
+
+msgid "ValueStreamEvent|Stop"
+msgstr ""
+
+msgid "ValueStream|The Default Value Stream cannot be deleted"
+msgstr ""
+
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
+msgstr ""
+
+msgid "Variable"
+msgstr ""
+
+msgid "Variable will be masked in job logs."
+msgstr ""
+
+msgid "Variables"
+msgstr ""
+
+msgid "Variables can be:"
+msgstr ""
+
+msgid "Variables store information, like passwords and secret keys, that you can use in job scripts."
+msgstr ""
+
+msgid "Variables store information, like passwords and secret keys, that you can use in job scripts. All projects on the instance can use these variables."
+msgstr ""
+
+msgid "Various container registry settings."
+msgstr ""
+
+msgid "Various email settings."
+msgstr ""
+
+msgid "Various settings that affect GitLab performance."
+msgstr ""
+
+msgid "Verification concurrency limit"
+msgstr ""
+
+msgid "Verification status"
+msgstr ""
+
+msgid "VerificationReminder|Pipeline failing? To keep GitLab spam and abuse free we ask that you verify your identity."
+msgstr ""
+
+msgid "VerificationReminder|Until then, shared runners will be unavailable. %{validateLinkStart}Validate your account%{validateLinkEnd} or %{docsLinkStart}use your own runners%{docsLinkEnd}."
+msgstr ""
+
+msgid "VerificationReminder|Your account has been validated"
+msgstr ""
+
+msgid "VerificationReminder|You’ll now be able to take advantage of free CI/CD minutes on shared runners."
+msgstr ""
+
+msgid "Verified"
+msgstr ""
+
+msgid "Verify SAML Configuration"
+msgstr ""
+
+msgid "Verify code"
+msgstr ""
+
+msgid "Verify configuration"
+msgstr ""
+
+msgid "Version"
+msgstr ""
+
+msgid "Version %{versionNumber}"
+msgstr ""
+
+msgid "Version %{versionNumber} (latest)"
+msgstr ""
+
+msgid "VersionCheck|Up to date"
+msgstr ""
+
+msgid "VersionCheck|Update ASAP"
+msgstr ""
+
+msgid "VersionCheck|Update available"
+msgstr ""
+
+msgid "VersionCheck|Your GitLab Version"
+msgstr ""
+
+msgid "View Documentation"
+msgstr ""
+
+msgid "View Stage: %{title}"
+msgstr ""
+
+msgid "View alert details at"
+msgstr ""
+
+msgid "View alert details."
+msgstr ""
+
+msgid "View all environments."
+msgstr ""
+
+msgid "View all issues"
+msgstr ""
+
+msgid "View blame"
+msgstr ""
+
+msgid "View blame prior to this change"
+msgstr ""
+
+msgid "View chart"
+msgid_plural "View charts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "View dependency details for your project"
+msgstr ""
+
+msgid "View deployment"
+msgstr ""
+
+msgid "View details"
+msgstr ""
+
+msgid "View details: %{details_url}"
+msgstr ""
+
+msgid "View documentation"
+msgstr ""
+
+msgid "View downstream pipeline"
+msgstr ""
+
+msgid "View eligible approvers"
+msgstr ""
+
+msgid "View epics list"
+msgstr ""
+
+msgid "View exposed artifact"
+msgid_plural "View %d exposed artifacts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "View file @ "
+msgstr ""
+
+msgid "View file @ %{commitSha}"
+msgstr ""
+
+msgid "View full dashboard"
+msgstr ""
+
+msgid "View full log"
+msgstr ""
+
+msgid "View group in admin area"
+msgstr ""
+
+msgid "View group labels"
+msgstr ""
+
+msgid "View group pipeline usage quota"
+msgstr ""
+
+msgid "View incident details at"
+msgstr ""
+
+msgid "View incident details."
+msgstr ""
+
+msgid "View incident issues."
+msgstr ""
+
+msgid "View issue"
+msgstr ""
+
+msgid "View issues"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
+msgid "View job"
+msgstr ""
+
+msgid "View job log"
+msgstr ""
+
+msgid "View jobs"
+msgstr ""
+
+msgid "View labels"
+msgstr ""
+
+msgid "View log"
+msgstr ""
+
+msgid "View logs"
+msgstr ""
+
+msgid "View merge request"
+msgstr ""
+
+msgid "View milestones"
+msgstr ""
+
+msgid "View on %{url}"
+msgstr ""
+
+msgid "View open merge request"
+msgstr ""
+
+msgid "View page @ "
+msgstr ""
+
+msgid "View performance dashboard."
+msgstr ""
+
+msgid "View project"
+msgstr ""
+
+msgid "View project in admin area"
+msgstr ""
+
+msgid "View project labels"
+msgstr ""
+
+msgid "View public GPG key"
+msgid_plural "View public GPG keys"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "View replaced file @ "
+msgstr ""
+
+msgid "View seat usage"
+msgstr ""
+
+msgid "View supported languages and frameworks"
+msgstr ""
+
+msgid "View the documentation"
+msgstr ""
+
+msgid "View the latest successful deployment to this environment"
+msgstr ""
+
+msgid "View the performance dashboard at"
+msgstr ""
+
+msgid "View usage details"
+msgstr ""
+
+msgid "View users statistics"
+msgstr ""
+
+msgid "Viewed"
+msgstr ""
+
+msgid "Viewing commit"
+msgstr ""
+
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
+msgid "Violation"
+msgstr ""
+
+msgid "Visibility"
+msgstr ""
+
+msgid "Visibility and access controls"
+msgstr ""
+
+msgid "Visibility level"
+msgstr ""
+
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility settings have been disabled by the administrator."
+msgstr ""
+
+msgid "Visibility, project features, permissions"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
+msgid "VisibilityLevel|Internal"
+msgstr ""
+
+msgid "VisibilityLevel|Private"
+msgstr ""
+
+msgid "VisibilityLevel|Public"
+msgstr ""
+
+msgid "VisibilityLevel|Unknown"
+msgstr ""
+
+msgid "Visit settings page"
+msgstr ""
+
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
+msgstr ""
+
+msgid "Vulnerabilities"
+msgstr ""
+
+msgid "Vulnerabilities over time"
+msgstr ""
+
+msgid "Vulnerability"
+msgstr ""
+
+msgid "Vulnerability Report"
+msgstr ""
+
+msgid "Vulnerability remediated. Review before resolving."
+msgstr ""
+
+msgid "Vulnerability report"
+msgstr ""
+
+msgid "Vulnerability resolved in %{branch}"
+msgstr ""
+
+msgid "Vulnerability resolved in the default branch"
+msgstr ""
+
+msgid "VulnerabilityChart|%{formattedStartDate} to today"
+msgstr ""
+
+msgid "VulnerabilityChart|Severity"
+msgstr ""
+
+msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
+msgstr ""
+
+msgid "VulnerabilityManagement|%{statusStart}Detected%{statusEnd} %{timeago} in pipeline %{pipelineLink}"
+msgstr ""
+
+msgid "VulnerabilityManagement|%{statusStart}Dismissed%{statusEnd} %{timeago} by %{user}"
+msgstr ""
+
+msgid "VulnerabilityManagement|%{statusStart}Resolved%{statusEnd} %{timeago} by %{user}"
+msgstr ""
+
+msgid "VulnerabilityManagement|(optional) Include the solution to the vulnerability if available."
+msgstr ""
+
+msgid "VulnerabilityManagement|A removed or remediated vulnerability"
+msgstr ""
+
+msgid "VulnerabilityManagement|A true-positive and will fix"
+msgstr ""
+
+msgid "VulnerabilityManagement|A verified true-positive vulnerability"
+msgstr ""
+
+msgid "VulnerabilityManagement|Add vulnerability finding"
+msgstr ""
+
+msgid "VulnerabilityManagement|An unverified non-confirmed finding"
+msgstr ""
+
+msgid "VulnerabilityManagement|Change status"
+msgstr ""
+
+msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
+msgstr ""
+
+msgid "VulnerabilityManagement|Create Jira issue"
+msgstr ""
+
+msgid "VulnerabilityManagement|Enter a name"
+msgstr ""
+
+msgid "VulnerabilityManagement|Enter the CVE or CWE code"
+msgstr ""
+
+msgid "VulnerabilityManagement|Enter the CVE or CWE identifier URL"
+msgstr ""
+
+msgid "VulnerabilityManagement|Fetching linked Jira issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
+msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
+msgstr ""
+
+msgid "VulnerabilityManagement|Name is a required field"
+msgstr ""
+
+msgid "VulnerabilityManagement|Needs triage"
+msgstr ""
+
+msgid "VulnerabilityManagement|Read more about related issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Related Jira issues"
+msgstr ""
+
+msgid "VulnerabilityManagement|Requires assessment"
+msgstr ""
+
+msgid "VulnerabilityManagement|Select a method"
+msgstr ""
+
+msgid "VulnerabilityManagement|Select a severity level"
+msgstr ""
+
+msgid "VulnerabilityManagement|Select a status"
+msgstr ""
+
+msgid "VulnerabilityManagement|Severity is a required field"
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while creating vulnerability"
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to delete the comment. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to fetch related Jira issues. Please check the %{linkStart}Jira integration settings%{linkEnd} and try again."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to refresh the vulnerability. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to retrieve the vulnerability history. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to save the comment. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong while trying to unlink the issue. Please try again later."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong, could not get user."
+msgstr ""
+
+msgid "VulnerabilityManagement|Something went wrong, could not update vulnerability state."
+msgstr ""
+
+msgid "VulnerabilityManagement|Status is a required field"
+msgstr ""
+
+msgid "VulnerabilityManagement|Submit vulnerability"
+msgstr ""
+
+msgid "VulnerabilityManagement|Summary, detailed description, steps to reproduce, etc."
+msgstr ""
+
+msgid "VulnerabilityManagement|Verified as fixed or mitigated"
+msgstr ""
+
+msgid "VulnerabilityManagement|Vulnerability name or type. Ex: Cross-site scripting"
+msgstr ""
+
+msgid "VulnerabilityManagement|Will not fix or a false-positive"
+msgstr ""
+
+msgid "VulnerabilityManagement|invalid issue link or ID"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|All statuses"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Confirmed"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Dismissed"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Needs triage"
+msgstr ""
+
+msgid "VulnerabilityStatusTypes|Resolved"
+msgstr ""
+
+msgid "Vulnerability|%{scannerName} (version %{scannerVersion})"
+msgstr ""
+
+msgid "Vulnerability|Activity"
+msgstr ""
+
+msgid "Vulnerability|Actual Response"
+msgstr ""
+
+msgid "Vulnerability|Actual received response is the one received when this fault was detected"
+msgstr ""
+
+msgid "Vulnerability|Add another identifier"
+msgstr ""
+
+msgid "Vulnerability|Additional Info"
+msgstr ""
+
+msgid "Vulnerability|Bug Bounty"
+msgstr ""
+
+msgid "Vulnerability|CVSS v3"
+msgstr ""
+
+msgid "Vulnerability|Class"
+msgstr ""
+
+msgid "Vulnerability|Cluster"
+msgstr ""
+
+msgid "Vulnerability|Code Review"
+msgstr ""
+
+msgid "Vulnerability|Comments"
+msgstr ""
+
+msgid "Vulnerability|Crash address"
+msgstr ""
+
+msgid "Vulnerability|Crash state"
+msgstr ""
+
+msgid "Vulnerability|Crash type"
+msgstr ""
+
+msgid "Vulnerability|Description"
+msgstr ""
+
+msgid "Vulnerability|Details"
+msgstr ""
+
+msgid "Vulnerability|Detected"
+msgstr ""
+
+msgid "Vulnerability|Detection method"
+msgstr ""
+
+msgid "Vulnerability|Download"
+msgstr ""
+
+msgid "Vulnerability|Enter the associated CVE or CWE entries for this vulnerability."
+msgstr ""
+
+msgid "Vulnerability|Evidence"
+msgstr ""
+
+msgid "Vulnerability|External Security Report"
+msgstr ""
+
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
+msgid "Vulnerability|File"
+msgstr ""
+
+msgid "Vulnerability|GitLab Security Report"
+msgstr ""
+
+msgid "Vulnerability|Identifier"
+msgstr ""
+
+msgid "Vulnerability|Identifier URL"
+msgstr ""
+
+msgid "Vulnerability|Identifier code"
+msgstr ""
+
+msgid "Vulnerability|Identifiers"
+msgstr ""
+
+msgid "Vulnerability|Image"
+msgstr ""
+
+msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+msgstr ""
+
+msgid "Vulnerability|Learn more about this vulnerability and the best way to resolve it."
+msgstr ""
+
+msgid "Vulnerability|Links"
+msgstr ""
+
+msgid "Vulnerability|Method"
+msgstr ""
+
+msgid "Vulnerability|Namespace"
+msgstr ""
+
+msgid "Vulnerability|Project"
+msgstr ""
+
+msgid "Vulnerability|Remove identifier row"
+msgstr ""
+
+msgid "Vulnerability|Reproduction Assets"
+msgstr ""
+
+msgid "Vulnerability|Request"
+msgstr ""
+
+msgid "Vulnerability|Request/Response"
+msgstr ""
+
+msgid "Vulnerability|Scanner Provider"
+msgstr ""
+
+msgid "Vulnerability|Security Audit"
+msgstr ""
+
+msgid "Vulnerability|Select a severity"
+msgstr ""
+
+msgid "Vulnerability|Set the status of the vulnerability finding based on the information available to you."
+msgstr ""
+
+msgid "Vulnerability|Severity"
+msgstr ""
+
+msgid "Vulnerability|Status"
+msgstr ""
+
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
+msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
+msgstr ""
+
+msgid "Vulnerability|Tool"
+msgstr ""
+
+msgid "Vulnerability|Training"
+msgstr ""
+
+msgid "Vulnerability|Training not available for this vulnerability."
+msgstr ""
+
+msgid "Vulnerability|Unmodified Response"
+msgstr ""
+
+msgid "Vulnerability|View training"
+msgstr ""
+
+msgid "WARNING:"
+msgstr ""
+
+msgid "WARNING: This snippet contains hidden files which might be used to mask malicious behavior. Exercise caution if cloning and executing code from this snippet."
+msgstr ""
+
+msgid "Wait for the file to load to copy its contents"
+msgstr ""
+
+msgid "Waiting for approval"
+msgstr ""
+
+msgid "Waiting for merge (open and assigned)"
+msgstr ""
+
+msgid "Waiting for performance data"
+msgstr ""
+
+msgid "Want to see the data? Please ask an administrator for access."
+msgstr ""
+
+msgid "Warning"
+msgstr ""
+
+msgid "Warning:"
+msgstr ""
+
+msgid "Warning: Displaying this diagram might cause performance issues on this page."
+msgstr ""
+
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
+msgid "Watch how"
+msgstr ""
+
+msgid "We are currently unable to fetch data for the pipeline header."
+msgstr ""
+
+msgid "We are currently unable to fetch data for this graph."
+msgstr ""
+
+msgid "We are currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "We could not determine the path to remove the epic"
+msgstr ""
+
+msgid "We could not determine the path to remove the issue"
+msgstr ""
+
+msgid "We couldn't find any %{scope} matching %{term}"
+msgstr ""
+
+msgid "We couldn't find any %{scope} matching %{term} in group %{group}"
+msgstr ""
+
+msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
+msgstr ""
+
+msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
+msgstr ""
+
+msgid "We created a sandbox project that will help you learn the basics of GitLab. You’ll be guided by issues in an issue board. You can go through the issues at your own pace."
+msgstr ""
+
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
+msgid "We don't have enough data to show this stage."
+msgstr ""
+
+msgid "We have found the following errors:"
+msgstr ""
+
+msgid "We heard back from your device. You have been authenticated."
+msgstr ""
+
+msgid "We invite you to %{featureLinkStart}request a feature%{featureLinkEnd}, %{bugLinkStart}report a bug%{bugLinkEnd} or %{feedbackLinkStart}share feedback%{feedbackLinkEnd}"
+msgstr ""
+
+msgid "We recommend cloud-based mobile authenticator apps such as Authy, Duo Mobile, and LastPass. They can restore access if you lose your hardware device."
+msgstr ""
+
+msgid "We recommend leaving all SAST analyzers enabled"
+msgstr ""
+
+msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
+msgstr ""
+
+msgid "We recommend that you buy additional Pipeline minutes to resume normal service."
+msgstr ""
+
+msgid "We sent you an email with reset password instructions"
+msgstr ""
+
+msgid "We tried to automatically renew your subscription for %{strong}%{namespace_name}%{strong_close} on %{expires_on} but something went wrong so your subscription was downgraded to the free plan. Don't worry, your data is safe. We suggest you check your payment method and get in touch with our support team (%{support_link}). They'll gladly help with your subscription renewal."
+msgstr ""
+
+msgid "We want to be sure it is you, please confirm you are not a robot."
+msgstr ""
+
+msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
+msgstr ""
+
+msgid "We would like to inform you that your subscription GitLab Enterprise Edition %{plan_name} is nearing its user limit. You have %{active_user_count} active users, which is almost at the user limit of %{maximum_user_count}."
+msgstr ""
+
+msgid "We'll continuously validate your pipeline configuration. The validation results will appear here."
+msgstr ""
+
+msgid "We'll use this to help surface the right features and information to you."
+msgstr ""
+
+msgid "We're experiencing difficulties and this tab content is currently unavailable."
+msgstr ""
+
+msgid "We've found no vulnerabilities"
+msgstr ""
+
+msgid "Web IDE"
+msgstr ""
+
+msgid "Web Terminal"
+msgstr ""
+
+msgid "Web terminal"
+msgstr ""
+
+msgid "WebAuthn Devices (%{length})"
+msgstr ""
+
+msgid "WebAuthn only works with HTTPS-enabled websites. Contact your administrator for more details."
+msgstr ""
+
+msgid "WebIDE|Fork project"
+msgstr ""
+
+msgid "WebIDE|Go to fork"
+msgstr ""
+
+msgid "WebIDE|Merge request"
+msgstr ""
+
+msgid "WebIDE|This project does not accept unsigned commits."
+msgstr ""
+
+msgid "WebIDE|This project does not accept unsigned commits. You can’t commit changes through the Web IDE."
+msgstr ""
+
+msgid "WebIDE|You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
+msgid "WebIDE|You can’t edit files directly in this project. Go to your fork and submit a merge request with your changes."
+msgstr ""
+
+msgid "WebIDE|You need permission to edit files directly in this project."
+msgstr ""
+
+msgid "WebexTeamsService|Send notifications about project events to Webex Teams."
+msgstr ""
+
+msgid "WebexTeamsService|Send notifications about project events to a Webex Teams conversation. %{docs_link}"
+msgstr ""
+
+msgid "WebexTeamsService|Webex Teams"
+msgstr ""
+
+msgid "Webhook"
+msgstr ""
+
+msgid "Webhook Logs"
+msgstr ""
+
+msgid "Webhook Settings"
+msgstr ""
+
+msgid "Webhook events will be displayed here."
+msgstr ""
+
+msgid "Webhook:"
+msgstr ""
+
+msgid "Webhooks"
+msgstr ""
+
+msgid "Webhooks Help"
+msgstr ""
+
+msgid "Webhooks|A comment is added to a confidential issue."
+msgstr ""
+
+msgid "Webhooks|A comment is added to an issue."
+msgstr ""
+
+msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
+msgstr ""
+
+msgid "Webhooks|A deployment starts, finishes, fails, or is canceled."
+msgstr ""
+
+msgid "Webhooks|A feature flag is turned on or off."
+msgstr ""
+
+msgid "Webhooks|A group member is created, updated, or removed."
+msgstr ""
+
+msgid "Webhooks|A job's status changes."
+msgstr ""
+
+msgid "Webhooks|A merge request is created, updated, or merged."
+msgstr ""
+
+msgid "Webhooks|A new tag is pushed to the repository."
+msgstr ""
+
+msgid "Webhooks|A pipeline's status changes."
+msgstr ""
+
+msgid "Webhooks|A release is created or updated."
+msgstr ""
+
+msgid "Webhooks|A subgroup is created or removed."
+msgstr ""
+
+msgid "Webhooks|A wiki page is created or updated."
+msgstr ""
+
+msgid "Webhooks|An issue is created, updated, closed, or reopened."
+msgstr ""
+
+msgid "Webhooks|Are you sure you want to delete this group hook?"
+msgstr ""
+
+msgid "Webhooks|Are you sure you want to delete this project hook?"
+msgstr ""
+
+msgid "Webhooks|Are you sure you want to delete this webhook?"
+msgstr ""
+
+msgid "Webhooks|Comments"
+msgstr ""
+
+msgid "Webhooks|Confidential comments"
+msgstr ""
+
+msgid "Webhooks|Confidential issues events"
+msgstr ""
+
+msgid "Webhooks|Delete webhook"
+msgstr ""
+
+msgid "Webhooks|Deployment events"
+msgstr ""
+
+msgid "Webhooks|Enable SSL verification"
+msgstr ""
+
+msgid "Webhooks|Failed to connect"
+msgstr ""
+
+msgid "Webhooks|Fails to connect"
+msgstr ""
+
+msgid "Webhooks|Feature flag events"
+msgstr ""
+
+msgid "Webhooks|Issues events"
+msgstr ""
+
+msgid "Webhooks|Job events"
+msgstr ""
+
+msgid "Webhooks|Member events"
+msgstr ""
+
+msgid "Webhooks|Merge request events"
+msgstr ""
+
+msgid "Webhooks|Pipeline events"
+msgstr ""
+
+msgid "Webhooks|Push events"
+msgstr ""
+
+msgid "Webhooks|Push to the repository."
+msgstr ""
+
+msgid "Webhooks|Releases events"
+msgstr ""
+
+msgid "Webhooks|SSL verification"
+msgstr ""
+
+msgid "Webhooks|Secret token"
+msgstr ""
+
+msgid "Webhooks|Subgroup events"
+msgstr ""
+
+msgid "Webhooks|Tag push events"
+msgstr ""
+
+msgid "Webhooks|The webhook %{help_link_start}failed to connect%{help_link_end}, and will retry in %{retry_time}. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below."
+msgstr ""
+
+msgid "Webhooks|The webhook failed to connect, and is disabled. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below."
+msgstr ""
+
+msgid "Webhooks|The webhook was triggered more than %{limit} times per minute and is now disabled. To re-enable this webhook, fix the problems shown in %{strong_start}Recent events%{strong_end}, then re-test your settings. %{support_link_start}Contact Support%{support_link_end} if you need help re-enabling your webhook."
+msgstr ""
+
+msgid "Webhooks|Trigger"
+msgstr ""
+
+msgid "Webhooks|URL"
+msgstr ""
+
+msgid "Webhooks|URL must be percent-encoded if it contains one or more special characters."
+msgstr ""
+
+msgid "Webhooks|Used to validate received payloads. Sent with the request in the %{code_start}X-Gitlab-Token HTTP%{code_end} header."
+msgstr ""
+
+msgid "Webhooks|Webhook failed to connect"
+msgstr ""
+
+msgid "Webhooks|Webhook fails to connect"
+msgstr ""
+
+msgid "Webhooks|Webhook was automatically disabled"
+msgstr ""
+
+msgid "Webhooks|Wiki page events"
+msgstr ""
+
+msgid "Website"
+msgstr ""
+
+msgid "Website:"
+msgstr ""
+
+msgid "Wednesday"
+msgstr ""
+
+msgid "Weekday"
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
+msgid "Welcome back! Your account had been deactivated due to inactivity but is now reactivated."
+msgstr ""
+
+msgid "Welcome to GitLab"
+msgstr ""
+
+msgid "Welcome to GitLab, %{first_name}!"
+msgstr ""
+
+msgid "Welcome to GitLab,%{br_tag}%{name}!"
+msgstr ""
+
+msgid "Welcome, %{name}!"
+msgstr ""
+
+msgid "What are CI/CD minutes?"
+msgstr ""
+
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
+msgid "What does this command do?"
+msgstr ""
+
+msgid "What is Auto DevOps?"
+msgstr ""
+
+msgid "What is Markdown?"
+msgstr ""
+
+msgid "What is repository mirroring?"
+msgstr ""
+
+msgid "What is squashing?"
+msgstr ""
+
+msgid "What is time tracking?"
+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 would you like to do?"
+msgstr ""
+
+msgid "What's new"
+msgstr ""
+
+msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
+msgstr ""
+
+msgid "When a runner is locked, it cannot be assigned to other projects"
+msgstr ""
+
+msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
+msgstr ""
+
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
+msgstr ""
+
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+msgstr ""
+
+msgid "When merge requests and commits in the default branch close, any issues they reference also close."
+msgstr ""
+
+msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
+msgstr ""
+
+msgid "When this merge request is accepted"
+msgid_plural "When these merge requests are accepted"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
+msgstr ""
+
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
+msgid "When:"
+msgstr ""
+
+msgid "Which API requests are affected?"
+msgstr ""
+
+msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
+msgstr ""
+
+msgid "Who can approve?"
+msgstr ""
+
+msgid "Who can see this group?"
+msgstr ""
+
+msgid "Who will be able to see this group?"
+msgstr ""
+
+msgid "Who will be using GitLab?"
+msgstr ""
+
+msgid "Who will be using this GitLab subscription?"
+msgstr ""
+
+msgid "Who will be using this GitLab trial?"
+msgstr ""
+
+msgid "Who will be using this group?"
+msgstr ""
+
+msgid "Why are you signing up? (Optional)"
+msgstr ""
+
+msgid "Wiki"
+msgstr ""
+
+msgid "Wiki page"
+msgstr ""
+
+msgid "Wiki page was successfully created."
+msgstr ""
+
+msgid "Wiki page was successfully deleted."
+msgstr ""
+
+msgid "Wiki page was successfully updated."
+msgstr ""
+
+msgid "WikiClone|Clone your wiki"
+msgstr ""
+
+msgid "WikiClone|Git Access"
+msgstr ""
+
+msgid "WikiClone|Install Gollum"
+msgstr ""
+
+msgid "WikiClone|Start Gollum and edit locally"
+msgstr ""
+
+msgid "WikiEdit|There is already a page with the same title in that path."
+msgstr ""
+
+msgid "WikiEmptyIssueMessage|Suggest wiki improvement"
+msgstr ""
+
+msgid "WikiEmptyIssueMessage|You must be a group member in order to add wiki pages. If you have suggestions for how to improve the wiki for this group, consider opening an issue in the %{issues_link}."
+msgstr ""
+
+msgid "WikiEmptyIssueMessage|You must be a project member in order to add wiki pages. If you have suggestions for how to improve the wiki for this project, consider opening an issue in the %{issues_link}."
+msgstr ""
+
+msgid "WikiEmptyIssueMessage|issue tracker"
+msgstr ""
+
+msgid "WikiEmpty| Have a Confluence wiki already? Use that instead."
+msgstr ""
+
+msgid "WikiEmpty|A wiki is where you can store all the details about your group. This can include why you've created it, its principles, how to use it, and so on."
+msgstr ""
+
+msgid "WikiEmpty|A wiki is where you can store all the details about your project. This can include why you've created it, its principles, how to use it, and so on."
+msgstr ""
+
+msgid "WikiEmpty|Confluence is enabled"
+msgstr ""
+
+msgid "WikiEmpty|Create your first page"
+msgstr ""
+
+msgid "WikiEmpty|Enable the Confluence Wiki integration"
+msgstr ""
+
+msgid "WikiEmpty|Go to Confluence"
+msgstr ""
+
+msgid "WikiEmpty|Suggest wiki improvement"
+msgstr ""
+
+msgid "WikiEmpty|The wiki lets you write documentation for your group"
+msgstr ""
+
+msgid "WikiEmpty|The wiki lets you write documentation for your project"
+msgstr ""
+
+msgid "WikiEmpty|This group has no wiki pages"
+msgstr ""
+
+msgid "WikiEmpty|This project has no wiki pages"
+msgstr ""
+
+msgid "WikiEmpty|You must be a group member in order to add wiki pages."
+msgstr ""
+
+msgid "WikiEmpty|You must be a project member in order to add wiki pages."
+msgstr ""
+
+msgid "WikiEmpty|You've enabled the Confluence Workspace integration. Your wiki will be viewable directly within Confluence. We are hard at work integrating Confluence more seamlessly into GitLab. If you'd like to stay up to date, follow our %{wiki_confluence_epic_link_start}Confluence epic%{wiki_confluence_epic_link_end}."
+msgstr ""
+
+msgid "WikiHistoricalPage|This is an old version of this page."
+msgstr ""
+
+msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
+msgstr ""
+
+msgid "WikiHistoricalPage|history"
+msgstr ""
+
+msgid "WikiHistoricalPage|most recent version"
+msgstr ""
+
+msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
+msgstr ""
+
+msgid "WikiPageConfirmDelete|Delete page"
+msgstr ""
+
+msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
+msgstr ""
+
+msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{wikiLinkStart}the page%{wikiLinkEnd} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
+msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
+msgstr ""
+
+msgid "WikiPage|Cancel"
+msgstr ""
+
+msgid "WikiPage|Commit message"
+msgstr ""
+
+msgid "WikiPage|Content"
+msgstr ""
+
+msgid "WikiPage|Create %{pageTitle}"
+msgstr ""
+
+msgid "WikiPage|Create page"
+msgstr ""
+
+msgid "WikiPage|Edit rich text"
+msgstr ""
+
+msgid "WikiPage|Edit source"
+msgstr ""
+
+msgid "WikiPage|Format"
+msgstr ""
+
+msgid "WikiPage|Learn more."
+msgstr ""
+
+msgid "WikiPage|Page title"
+msgstr ""
+
+msgid "WikiPage|Retry"
+msgstr ""
+
+msgid "WikiPage|Save changes"
+msgstr ""
+
+msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
+msgstr ""
+
+msgid "WikiPage|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
+msgstr ""
+
+msgid "WikiPage|Title"
+msgstr ""
+
+msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
+msgstr ""
+
+msgid "WikiPage|Update %{pageTitle}"
+msgstr ""
+
+msgid "WikiPage|Write your content or drag files here…"
+msgstr ""
+
+msgid "Wikis"
+msgstr ""
+
+msgid "Wiki|Create New Page"
+msgstr ""
+
+msgid "Wiki|Created date"
+msgstr ""
+
+msgid "Wiki|Edit Page"
+msgstr ""
+
+msgid "Wiki|New page"
+msgstr ""
+
+msgid "Wiki|Page history"
+msgstr ""
+
+msgid "Wiki|Page version"
+msgstr ""
+
+msgid "Wiki|Pages"
+msgstr ""
+
+msgid "Wiki|The sidebar failed to load. You can reload the page to try again."
+msgstr ""
+
+msgid "Wiki|Title"
+msgstr ""
+
+msgid "Wiki|View All Pages"
+msgstr ""
+
+msgid "Wiki|Wiki Pages"
+msgstr ""
+
+msgid "Will be created"
+msgstr ""
+
+msgid "Will be mapped to"
+msgstr ""
+
+msgid "Will deploy to"
+msgstr ""
+
+msgid "With requirements, you can set criteria to check your products against."
+msgstr ""
+
+msgid "With test cases, you can define conditions for your project to meet in determining quality"
+msgstr ""
+
+msgid "Withdraw Access Request"
+msgstr ""
+
+msgid "Won't fix / Accept risk"
+msgstr ""
+
+msgid "Work in progress (open and unassigned)"
+msgstr ""
+
+msgid "Work in progress Limit"
+msgstr ""
+
+msgid "WorkItem|Convert to work item"
+msgstr ""
+
+msgid "WorkItem|Create work item"
+msgstr ""
+
+msgid "WorkItem|New Task"
+msgstr ""
+
+msgid "WorkItem|Select type"
+msgstr ""
+
+msgid "WorkItem|Something went wrong when creating a work item. Please try again"
+msgstr ""
+
+msgid "WorkItem|Something went wrong when fetching the work item. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
+msgstr ""
+
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
+msgid "WorkItem|Type"
+msgstr ""
+
+msgid "WorkItem|Work Items"
+msgstr ""
+
+msgid "Would you like to create a new branch?"
+msgstr ""
+
+msgid "Would you like to try auto-generating a branch name?"
+msgstr ""
+
+msgid "Write"
+msgstr ""
+
+msgid "Write a comment or drag your files here…"
+msgstr ""
+
+msgid "Write a comment…"
+msgstr ""
+
+msgid "Write a description or drag your files here…"
+msgstr ""
+
+msgid "Write a description…"
+msgstr ""
+
+msgid "Write milestone description..."
+msgstr ""
+
+msgid "Write your release notes or drag your files here…"
+msgstr ""
+
+msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
+msgstr ""
+
+msgid "Xcode"
+msgstr ""
+
+msgid "YYYY-MM-DD"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "Yes or No"
+msgstr ""
+
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, close issue"
+msgstr ""
+
+msgid "Yes, delete project"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "You"
+msgstr ""
+
+msgid "You already have pending todo for this alert"
+msgstr ""
+
+msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
+msgstr ""
+
+msgid "You are about to delete this forked project containing:"
+msgstr ""
+
+msgid "You are about to delete this project containing:"
+msgstr ""
+
+msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
+msgstr ""
+
+msgid "You are already a member of this %{member_source}."
+msgstr ""
+
+msgid "You are already impersonating another user"
+msgstr ""
+
+msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
+msgid "You are attempting to delete a file that has been previously updated."
+msgstr ""
+
+msgid "You are attempting to update a file that has changed since you started editing it."
+msgstr ""
+
+msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
+msgstr ""
+
+msgid "You are connected to the Prometheus server, but there is currently no data to display."
+msgstr ""
+
+msgid "You are going to delete %{project_full_name}. Deleted projects CANNOT be restored! Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to remove %{group_name}. This will also delete all of its subgroups and projects. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to remove the fork relationship from %{project_full_name}. Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to transfer %{group_name} to another namespace. Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to transfer %{project_full_name} to another namespace. Are you ABSOLUTELY sure?"
+msgstr ""
+
+msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
+msgstr ""
+
+msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
+msgstr ""
+
+msgid "You are not allowed to %{action} a user"
+msgstr ""
+
+msgid "You are not allowed to approve a user"
+msgstr ""
+
+msgid "You are not allowed to log in using password"
+msgstr ""
+
+msgid "You are not allowed to push into this branch. Create another branch or open a merge request."
+msgstr ""
+
+msgid "You are not allowed to reject a user"
+msgstr ""
+
+msgid "You are not allowed to unlink your primary login account"
+msgstr ""
+
+msgid "You are not authorized to delete this site profile"
+msgstr ""
+
+msgid "You are not authorized to perform this action"
+msgstr ""
+
+msgid "You are not authorized to run this manual job"
+msgstr ""
+
+msgid "You are not authorized to update this profile"
+msgstr ""
+
+msgid "You are not authorized to update this scanner profile"
+msgstr ""
+
+msgid "You are not authorized to upload metric images"
+msgstr ""
+
+msgid "You are now impersonating %{username}"
+msgstr ""
+
+msgid "You are on a read-only GitLab instance."
+msgstr ""
+
+msgid "You are receiving this message because you are a GitLab administrator for %{url}."
+msgstr ""
+
+msgid "You are signed in to GitLab as %{user_link}"
+msgstr ""
+
+msgid "You are trying to upload something other than an image. Please upload a .png, .jpg, .jpeg, .gif, .bmp, .tiff or .ico."
+msgstr ""
+
+msgid "You are using PostgreSQL %{pg_version_current}, but PostgreSQL %{pg_version_minimum} is required for this version of GitLab. Please upgrade your environment to a supported PostgreSQL version, see %{pg_requirements_url} for details."
+msgstr ""
+
+msgid "You can %{gitlabLinkStart}resolve conflicts on GitLab%{gitlabLinkEnd} or %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}."
+msgstr ""
+
+msgid "You can %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}."
+msgstr ""
+
+msgid "You can also create a project from the command line."
+msgstr ""
+
+msgid "You can also press Ctrl-Enter"
+msgstr ""
+
+msgid "You can also press ⌘-Enter"
+msgstr ""
+
+msgid "You can also star a label to make it a priority label."
+msgstr ""
+
+msgid "You can also test your %{gitlab_ci_yml} in %{lint_link_start}CI Lint%{lint_link_end}"
+msgstr ""
+
+msgid "You can also upload existing files from your computer using the instructions below."
+msgstr ""
+
+msgid "You can also use group access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "You can always change your URL later"
+msgstr ""
+
+msgid "You can always edit this later"
+msgstr ""
+
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
+msgid "You can create a new %{link}."
+msgstr ""
+
+msgid "You can create a new %{name} inside this project by sending an email to the following email address:"
+msgstr ""
+
+msgid "You can create a new Personal Access Token by visiting %{link}"
+msgstr ""
+
+msgid "You can create a new SSH key by visiting %{link}"
+msgstr ""
+
+msgid "You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can create a new one or check them in your %{ssh_key_link_start}SSH keys%{ssh_key_link_end} settings."
+msgstr ""
+
+msgid "You can create a new one or check them in your SSH keys settings %{ssh_key_link}."
+msgstr ""
+
+msgid "You can create a new one or check them in your personal access tokens settings %{pat_link}."
+msgstr ""
+
+msgid "You can create new ones at your %{pat_link_start}Personal Access Tokens%{pat_link_end} settings"
+msgstr ""
+
+msgid "You can create new ones at your Personal Access Tokens settings %{pat_link}"
+msgstr ""
+
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
+msgid "You can enable group access token creation in %{link_start}group settings%{link_end}."
+msgstr ""
+
+msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
+msgstr ""
+
+msgid "You can filter by 'days to merge' by clicking on the columns in the chart."
+msgstr ""
+
+msgid "You can find more information about GitLab subscriptions in %{subscriptions_doc_link}."
+msgstr ""
+
+msgid "You can get started by cloning the repository or start adding files to it with one of the following options."
+msgstr ""
+
+msgid "You can group test cases using labels. To learn about the future direction of this feature, visit %{linkStart}Quality Management direction page%{linkEnd}."
+msgstr ""
+
+msgid "You can invite a new member to %{project_name} or invite another group."
+msgstr ""
+
+msgid "You can invite a new member to %{project_name}."
+msgstr ""
+
+msgid "You can invite a new member to %{strong_start}%{group_name}%{strong_end}."
+msgstr ""
+
+msgid "You can invite another group to %{project_name}."
+msgstr ""
+
+msgid "You can move around the graph by using the arrow keys."
+msgstr ""
+
+msgid "You can notify the app / group or a project by sending them an email notification"
+msgstr ""
+
+msgid "You can now close this window."
+msgstr ""
+
+msgid "You can now export your security dashboard to a CSV report."
+msgstr ""
+
+msgid "You can now submit a merge request to get this change into the original branch."
+msgstr ""
+
+msgid "You can now submit a merge request to get this change into the original project."
+msgstr ""
+
+msgid "You can only %{action} files when you are on a branch"
+msgstr ""
+
+msgid "You can only add up to %{max_contacts} contacts at one time"
+msgstr ""
+
+msgid "You can only edit files when you are on a branch"
+msgstr ""
+
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
+msgid "You can only transfer the project to namespaces you manage."
+msgstr ""
+
+msgid "You can only upload one design when dropping onto an existing design."
+msgstr ""
+
+msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
+msgstr ""
+
+msgid "You can see your chat accounts."
+msgstr ""
+
+msgid "You can set up jobs to only use runners with specific tags. Separate tags with commas."
+msgstr ""
+
+msgid "You can specify notification level per group or per project."
+msgstr ""
+
+msgid "You can test your .gitlab-ci.yml in %{linkStart}CI Lint%{linkEnd}."
+msgstr ""
+
+msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
+msgstr ""
+
+msgid "You cannot %{action} %{state} users."
+msgstr ""
+
+msgid "You cannot access the raw file. Please wait a minute."
+msgstr ""
+
+msgid "You cannot approve your own deployment."
+msgstr ""
+
+msgid "You cannot combine replace_ids with add_ids or remove_ids"
+msgstr ""
+
+msgid "You cannot impersonate a blocked user"
+msgstr ""
+
+msgid "You cannot impersonate a user who cannot log in"
+msgstr ""
+
+msgid "You cannot impersonate an internal user"
+msgstr ""
+
+msgid "You cannot play this scheduled pipeline at the moment. Please wait a minute."
+msgstr ""
+
+msgid "You cannot rename an environment after it's created."
+msgstr ""
+
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
+msgid "You cannot write to this read-only GitLab instance."
+msgstr ""
+
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
+msgid "You could not create a new trigger."
+msgstr ""
+
+msgid "You do not have any Google Cloud projects. Please create a Google Cloud project and then reload this page."
+msgstr ""
+
+msgid "You do not have any subscriptions yet"
+msgstr ""
+
+msgid "You do not have permission to access dora metrics."
+msgstr ""
+
+msgid "You do not have permission to approve a member"
+msgstr ""
+
+msgid "You do not have permission to leave this %{namespaceType}."
+msgstr ""
+
+msgid "You do not have permission to run a pipeline on this branch."
+msgstr ""
+
+msgid "You do not have permission to run the Web Terminal. Please contact a project administrator."
+msgstr ""
+
+msgid "You do not have permission to update the environment."
+msgstr ""
+
+msgid "You do not have permissions to run the import."
+msgstr ""
+
+msgid "You don't have any U2F devices registered yet."
+msgstr ""
+
+msgid "You don't have any WebAuthn devices registered yet."
+msgstr ""
+
+msgid "You don't have any active chat names."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
+msgid "You don't have any deployments right now."
+msgstr ""
+
+msgid "You don't have any open merge requests"
+msgstr ""
+
+msgid "You don't have any projects available."
+msgstr ""
+
+msgid "You don't have any recent searches"
+msgstr ""
+
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
+msgid "You don't have sufficient permission to perform this action."
+msgstr ""
+
+msgid "You don't have write access to the source branch."
+msgstr ""
+
+msgid "You don’t have access to Productivity Analytics in this group"
+msgstr ""
+
+msgid "You don’t have access to Value Stream Analytics for this group"
+msgstr ""
+
+msgid "You have %{pendingMembersCount} pending member that needs approval."
+msgid_plural "You have %{pendingMembersCount} pending members that need approval."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
+msgstr ""
+
+msgid "You have been granted %{access_level} access to the %{source_name} %{source_type}."
+msgstr ""
+
+msgid "You have been granted %{member_human_access} access to group %{name}."
+msgstr ""
+
+msgid "You have been granted %{member_human_access} access to project %{name}."
+msgstr ""
+
+msgid "You have been invited by %{link_to_inviter} to join %{source_name} %{strong_open}%{link_to_source}%{strong_close} as %{role}"
+msgstr ""
+
+msgid "You have been redirected to the only result; see the %{a_start}search results%{a_end} instead."
+msgstr ""
+
+msgid "You have been unsubscribed from this thread."
+msgstr ""
+
+msgid "You have declined the invitation to join %{title} %{name}."
+msgstr ""
+
+msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
+msgstr ""
+
+msgid "You have insufficient permissions to configure escalation policies for this project"
+msgstr ""
+
+msgid "You have insufficient permissions to create a Todo for this alert"
+msgstr ""
+
+msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgstr ""
+
+msgid "You have insufficient permissions to create an on-call schedule for this project"
+msgstr ""
+
+msgid "You have insufficient permissions to manage timeline events for this incident"
+msgstr ""
+
+msgid "You have insufficient permissions to remove an on-call rotation from this project"
+msgstr ""
+
+msgid "You have insufficient permissions to remove an on-call schedule from this project"
+msgstr ""
+
+msgid "You have insufficient permissions to remove this HTTP integration"
+msgstr ""
+
+msgid "You have insufficient permissions to set customer relations contacts for this issue"
+msgstr ""
+
+msgid "You have insufficient permissions to update an on-call schedule for this project"
+msgstr ""
+
+msgid "You have insufficient permissions to update this HTTP integration"
+msgstr ""
+
+msgid "You have insufficient permissions to view shifts for this rotation"
+msgstr ""
+
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr ""
+
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr ""
+
+msgid "You have no permissions"
+msgstr ""
+
+msgid "You have not added any approvers. Start by adding users or groups."
+msgstr ""
+
+msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
+msgstr ""
+
+msgid "You have successfully purchased %{product}. You'll receive a receipt by email. Your purchase may take a minute to sync, so refresh the page if you don't see it yet."
+msgstr ""
+
+msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
+msgstr ""
+
+msgid "You have unsaved changes"
+msgstr ""
+
+msgid "You left the \"%{membershipable_human_name}\" %{source_type}."
+msgstr ""
+
+msgid "You may close the milestone now."
+msgstr ""
+
+msgid "You must be authenticated to access this path."
+msgstr ""
+
+msgid "You must be logged in to search across all of GitLab"
+msgstr ""
+
+msgid "You must have developer or higher permissions in the associated project to view job logs when debug trace is enabled. To disable debug trace, set the 'CI_DEBUG_TRACE' variable to 'false' in your pipeline configuration or CI/CD settings. If you need to view this job log, a project maintainer must add you to the project with developer permissions or higher."
+msgstr ""
+
+msgid "You must have maintainer access to force delete a lock"
+msgstr ""
+
+msgid "You must provide a valid current password"
+msgstr ""
+
+msgid "You must provide your current password in order to change it."
+msgstr ""
+
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
+msgid "You must solve the CAPTCHA in order to submit"
+msgstr ""
+
+msgid "You must upload a file with the same file name when dropping onto an existing design."
+msgstr ""
+
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
+msgid "You need permission."
+msgstr ""
+
+msgid "You need to register a two-factor authentication app before you can set up a device."
+msgstr ""
+
+msgid "You need to set terms to be enforced"
+msgstr ""
+
+msgid "You need to specify both an Access Token and a Host URL."
+msgstr ""
+
+msgid "You need to upload a GitLab project export archive (ending in .gz)."
+msgstr ""
+
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
+msgid "You successfully declined the invitation"
+msgstr ""
+
+msgid "You tried to fork %{link_to_the_project} but it failed for the following reason:"
+msgstr ""
+
+msgid "You will be removed from existing projects/groups"
+msgstr ""
+
+msgid "You will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches."
+msgstr ""
+
+msgid "You will first need to set up Jira Integration to use this feature."
+msgstr ""
+
+msgid "You will lose all changes you've made to this file. This action cannot be undone."
+msgstr ""
+
+msgid "You will lose all uncommitted changes you've made in this project. This action cannot be undone."
+msgstr ""
+
+msgid "You will need to update your local repositories to point to the new location."
+msgstr ""
+
+msgid "You will not get any notifications via email"
+msgstr ""
+
+msgid "You will only receive notifications for the events you choose"
+msgstr ""
+
+msgid "You will only receive notifications for threads you have participated in"
+msgstr ""
+
+msgid "You will receive notifications for any activity"
+msgstr ""
+
+msgid "You will receive notifications only for comments in which you were @mentioned"
+msgstr ""
+
+msgid "You won't be able to create new projects because you have reached your project limit."
+msgstr ""
+
+msgid "You'll be charged for %{true_up_link_start}users over license%{link_end} on a quarterly or annual basis, depending on the terms of your agreement."
+msgstr ""
+
+msgid "You'll be signed out from your current account automatically."
+msgstr ""
+
+msgid "You'll need to use different branch names to get a valid comparison."
+msgstr ""
+
+msgid "You're about to reduce the visibility of the project %{strong_start}%{project_name}%{strong_end} in %{strong_start}%{group_name}%{strong_end}."
+msgstr ""
+
+msgid "You're about to reduce the visibility of the project %{strong_start}%{project_name}%{strong_end}."
+msgstr ""
+
+msgid "You're at the first commit"
+msgstr ""
+
+msgid "You're at the last commit"
+msgstr ""
+
+msgid "You're not allowed to %{tag_start}edit%{tag_end} files in this project directly. Please fork this project, make your changes there, and submit a merge request."
+msgstr ""
+
+msgid "You're not allowed to make changes to this project directly. A fork of this project has been created that you can make changes in, so you can submit a merge request."
+msgstr ""
+
+msgid "You're not allowed to make changes to this project directly. A fork of this project is being created that you can make changes in, so you can submit a merge request."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgstr ""
+
+msgid "You're receiving this email because of your activity on %{host}."
+msgstr ""
+
+msgid "You're receiving this email because you have been assigned an item on %{host}."
+msgstr ""
+
+msgid "You're receiving this email because you have been mentioned on %{host}."
+msgstr ""
+
+msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
+msgstr ""
+
+msgid "You've rejected %{user}"
+msgstr ""
+
+msgid "YouTube"
+msgstr ""
+
+msgid "YouTube URL or ID"
+msgstr ""
+
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
+msgid "Your %{group} membership will now expire in %{days}."
+msgstr ""
+
+msgid "Your %{host} account was signed in to from a new location"
+msgstr ""
+
+msgid "Your %{plan} subscription expired on %{expiry_date}"
+msgstr ""
+
+msgid "Your %{plan} subscription expires on %{expiry_date}"
+msgstr ""
+
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
+msgstr ""
+
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgstr ""
+
+msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
+msgstr ""
+
+msgid "Your CSV export has started. It will be emailed to %{email} when complete."
+msgstr ""
+
+msgid "Your CSV export of %{count} from project %{project_link} has been added to this email as an attachment."
+msgstr ""
+
+msgid "Your CSV export of %{written_count} from project %{project_name} (%{project_url}) has been added to this email as an attachment."
+msgstr ""
+
+msgid "Your CSV import for project"
+msgstr ""
+
+msgid "Your DevOps Reports give an overview of how you are using GitLab from a feature perspective. Use them to view how you compare with other organizations, and how your teams compare against each other."
+msgstr ""
+
+msgid "Your GPG keys (%{count})"
+msgstr ""
+
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
+msgstr ""
+
+msgid "Your GitLab account request has been approved!"
+msgstr ""
+
+msgid "Your GitLab group"
+msgstr ""
+
+msgid "Your Groups"
+msgstr ""
+
+msgid "Your Personal Access Token was revoked"
+msgstr ""
+
+msgid "Your Projects (default)"
+msgstr ""
+
+msgid "Your Projects' Activity"
+msgstr ""
+
+msgid "Your SSH key has expired"
+msgstr ""
+
+msgid "Your SSH key is expiring soon."
+msgstr ""
+
+msgid "Your SSH key was deleted"
+msgstr ""
+
+msgid "Your SSH keys (%{count})"
+msgstr ""
+
+msgid "Your To-Do List"
+msgstr ""
+
+msgid "Your U2F device did not send a valid JSON response."
+msgstr ""
+
+msgid "Your U2F device was registered!"
+msgstr ""
+
+msgid "Your WebAuthn device did not send a valid JSON response."
+msgstr ""
+
+msgid "Your WebAuthn device was registered!"
+msgstr ""
+
+msgid "Your access request to the %{source_type} has been withdrawn."
+msgstr ""
+
+msgid "Your account has been deactivated"
+msgstr ""
+
+msgid "Your account has been deactivated by your administrator. Please log back in to reactivate your account."
+msgstr ""
+
+msgid "Your account has been deactivated. You will not be able to: "
+msgstr ""
+
+msgid "Your account is authenticated with SSO or SAML. To %{push_pull_link_start}push and pull%{link_end} over %{protocol} with Git using this account, you must %{set_password_link_start}set a password%{link_end} or %{set_up_pat_link_start}set up a Personal Access Token%{link_end} to use instead of a password. For more information, see %{clone_with_https_link_start}Clone with HTTPS%{link_end}."
+msgstr ""
+
+msgid "Your account is authenticated with SSO or SAML. To %{push_pull_link_start}push and pull%{link_end} over %{protocol} with Git using this account, you must %{set_up_pat_link_start}set up a Personal Access Token%{link_end} to use instead of a password. For more information, see %{clone_with_https_link_start}Clone with HTTPS%{link_end}."
+msgstr ""
+
+msgid "Your account is locked."
+msgstr ""
+
+msgid "Your account uses dedicated credentials for the \"%{group_name}\" group and can only be updated through SSO."
+msgstr ""
+
+msgid "Your action succeeded."
+msgstr ""
+
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
+msgid "Your browser does not support iFrames"
+msgstr ""
+
+msgid "Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer)."
+msgstr ""
+
+msgid "Your browser doesn't support WebAuthn. Please use a supported browser, e.g. Chrome (67+) or Firefox (60+)."
+msgstr ""
+
+msgid "Your changes can be committed to %{branch_name} because a merge request is open."
+msgstr ""
+
+msgid "Your changes have been committed. Commit %{commitId} %{commitStats}"
+msgstr ""
+
+msgid "Your changes have been saved"
+msgstr ""
+
+msgid "Your changes have been successfully committed."
+msgstr ""
+
+msgid "Your comment could not be submitted because %{error}"
+msgstr ""
+
+msgid "Your comment could not be submitted! Please check your network connection and try again."
+msgstr ""
+
+msgid "Your comment could not be updated! Please check your network connection and try again."
+msgstr ""
+
+msgid "Your comment will be discarded."
+msgstr ""
+
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
+msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
+msgstr ""
+
+msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
+msgstr ""
+
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
+msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
+msgstr ""
+
+msgid "Your device is not compatible with GitLab. Please try another device"
+msgstr ""
+
+msgid "Your device needs to be set up. Plug it in (if needed) and click the button on the left."
+msgstr ""
+
+msgid "Your device was successfully set up! Give it a name and register it with the GitLab server."
+msgstr ""
+
+msgid "Your file must contain a column named %{codeStart}title%{codeEnd}. A %{codeStart}description%{codeEnd} column is optional. The maximum file size allowed is 10 MB."
+msgstr ""
+
+msgid "Your first project"
+msgstr ""
+
+msgid "Your groups"
+msgstr ""
+
+msgid "Your instance has %{remaining_user_count} users remaining of the %{total_user_count} included in your subscription. You can add more users than the number included in your license, and we will include the overage in your next bill."
+msgstr ""
+
+msgid "Your instance has exceeded your subscription's licensed user count."
+msgstr ""
+
+msgid "Your instance is approaching its licensed user count"
+msgstr ""
+
+msgid "Your issues are being imported. Once finished, you'll get a confirmation email."
+msgstr ""
+
+msgid "Your issues will be imported in the background. Once finished, you'll get a confirmation email."
+msgstr ""
+
+msgid "Your license does not support on-call rotations"
+msgstr ""
+
+msgid "Your license does not support on-call schedules"
+msgstr ""
+
+msgid "Your license is valid from"
+msgstr ""
+
+msgid "Your membership in %{group} no longer expires."
+msgstr ""
+
+msgid "Your message here"
+msgstr ""
+
+msgid "Your name"
+msgstr ""
+
+msgid "Your new %{type}"
+msgstr ""
+
+msgid "Your new access token has been created."
+msgstr ""
+
+msgid "Your new comment"
+msgstr ""
+
+msgid "Your new personal access token has been created."
+msgstr ""
+
+msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
+msgstr ""
+
+msgid "Your password reset token has expired."
+msgstr ""
+
+msgid "Your personal access token has expired"
+msgstr ""
+
+msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
+msgstr ""
+
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
+msgid "Your profile"
+msgstr ""
+
+msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
+msgstr ""
+
+msgid "Your project will be created at:"
+msgstr ""
+
+msgid "Your projects"
+msgstr ""
+
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
+msgid "Your request for access could not be processed: %{error_message}"
+msgstr ""
+
+msgid "Your request for access has been queued for review."
+msgstr ""
+
+msgid "Your request to join %{host} has been rejected."
+msgstr ""
+
+msgid "Your requirements are being imported. Once finished, you'll receive a confirmation email."
+msgstr ""
+
+msgid "Your requirements will be imported in the background. After it's finished, you'll get a confirmation email."
+msgstr ""
+
+msgid "Your response has been recorded."
+msgstr ""
+
+msgid "Your search didn't match any commits."
+msgstr ""
+
+msgid "Your search didn't match any commits. Try a different query."
+msgstr ""
+
+msgid "Your search timed out"
+msgstr ""
+
+msgid "Your sign-in page is %{url}."
+msgstr ""
+
+msgid "Your snippets"
+msgstr ""
+
+msgid "Your subscription expired!"
+msgstr ""
+
+msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
+msgstr ""
+
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
+msgstr ""
+
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Your username is %{username}."
+msgstr ""
+
+msgid "ZenTaoIntegration|Failed to load ZenTao issue. View the issue in ZenTao, or reload the page."
+msgstr ""
+
+msgid "ZenTaoIntegration|This is a ZenTao user."
+msgstr ""
+
+msgid "ZenTaoIntegration|ZenTao user"
+msgstr ""
+
+msgid "ZentaoIntegration|An error occurred while requesting data from the ZenTao service."
+msgstr ""
+
+msgid "ZentaoIntegration|Base URL of the ZenTao instance."
+msgstr ""
+
+msgid "ZentaoIntegration|Before you enable this integration, you must configure ZenTao. For more details, read the %{link_start}ZenTao integration documentation%{link_end}."
+msgstr ""
+
+msgid "ZentaoIntegration|Enter new ZenTao API token"
+msgstr ""
+
+msgid "ZentaoIntegration|If different from Web URL."
+msgstr ""
+
+msgid "ZentaoIntegration|Issue list"
+msgstr ""
+
+msgid "ZentaoIntegration|Open ZenTao"
+msgstr ""
+
+msgid "ZentaoIntegration|Use ZenTao as this project's issue tracker."
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao API URL (optional)"
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao API token"
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao Product ID"
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao Web URL"
+msgstr ""
+
+msgid "ZentaoIntegration|ZenTao issues"
+msgstr ""
+
+msgid "Zoom meeting added"
+msgstr ""
+
+msgid "Zoom meeting removed"
+msgstr ""
+
+msgid "[No reason]"
+msgstr ""
+
+msgid "[REDACTED]"
+msgstr ""
+
+msgid "[Redacted]"
+msgstr ""
+
+msgid "`end_time` should not exceed one month after `start_time`"
+msgstr ""
+
+msgid "`start_time` should precede `end_time`"
+msgstr ""
+
+msgid "a deleted user"
+msgstr ""
+
+msgid "about 1 hour"
+msgid_plural "about %d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "access:"
+msgstr ""
+
+msgid "added"
+msgstr ""
+
+msgid "added %{emails}"
+msgstr ""
+
+msgid "added a Zoom call to this issue"
+msgstr ""
+
+msgid "ago"
+msgstr ""
+
+msgid "alert"
+msgstr ""
+
+msgid "allowed to fail"
+msgstr ""
+
+msgid "already being used for another group or project %{timebox_name}."
+msgstr ""
+
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
+msgid "already has a \"created\" issue link"
+msgstr ""
+
+msgid "already shared with this group"
+msgstr ""
+
+msgid "and"
+msgstr ""
+
+msgid "any-approver for the merge request already exists"
+msgstr ""
+
+msgid "any-approver for the project already exists"
+msgstr ""
+
+msgid "approval"
+msgid_plural "approvals"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "approved by: "
+msgstr ""
+
+msgid "archived"
+msgstr ""
+
+msgid "archived:"
+msgstr ""
+
+msgid "artifacts"
+msgstr ""
+
+msgid "assign yourself"
+msgstr ""
+
+msgid "at"
+msgstr ""
+
+msgid "at risk"
+msgstr ""
+
+msgid "attach a new file"
+msgstr ""
+
+msgid "authored"
+msgstr ""
+
+msgid "banned user already exists"
+msgstr ""
+
+msgid "blocks"
+msgstr ""
+
+msgid "branch"
+msgid_plural "branches"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "branch name"
+msgstr ""
+
+msgid "builds"
+msgstr ""
+
+msgid "by"
+msgstr ""
+
+msgid "cURL:"
+msgstr ""
+
+msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
+msgstr ""
+
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
+msgid "can only be changed by a group admin."
+msgstr ""
+
+msgid "can only have one escalation policy"
+msgstr ""
+
+msgid "can't be nil"
+msgstr ""
+
+msgid "can't be solely blank"
+msgstr ""
+
+msgid "can't be the same as the source project"
+msgstr ""
+
+msgid "can't include: %{invalid_storages}"
+msgstr ""
+
+msgid "can't reference a branch that does not exist"
+msgstr ""
+
+msgid "cannot be a date in the past"
+msgstr ""
+
+msgid "cannot be changed"
+msgstr ""
+
+msgid "cannot be changed if a personal project has container registry tags."
+msgstr ""
+
+msgid "cannot be changed if shared runners are enabled"
+msgstr ""
+
+msgid "cannot be enabled"
+msgstr ""
+
+msgid "cannot be enabled because parent group does not allow it"
+msgstr ""
+
+msgid "cannot be enabled because parent group has shared Runners disabled"
+msgstr ""
+
+msgid "cannot be enabled unless all domains have TLS certificates"
+msgstr ""
+
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
+msgid "cannot be used for user namespace"
+msgstr ""
+
+msgid "cannot block others"
+msgstr ""
+
+msgid "cannot contain HTML/XML tags, including any word between angle brackets (&lt;,&gt;)."
+msgstr ""
+
+msgid "cannot include leading slash or directory traversal."
+msgstr ""
+
+msgid "cannot itself be blocked"
+msgstr ""
+
+msgid "cannot merge"
+msgstr ""
+
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
+msgstr ""
+
+msgid "ciReport|%{degradedNum} degraded"
+msgstr ""
+
+msgid "ciReport|%{improvedNum} improved"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about API Fuzzing%{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Coverage Fuzzing %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Secret Detection %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about codequality reports %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{prefix} %{strong_start}%{score}%{strong_end} %{delta} %{deltaPercent} in %{path}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportType} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportType}: Loading resulted in an error"
+msgstr ""
+
+msgid "ciReport|%{sameNum} same"
+msgstr ""
+
+msgid "ciReport|: Loading resulted in an error"
+msgstr ""
+
+msgid "ciReport|API Fuzzing"
+msgstr ""
+
+msgid "ciReport|API fuzzing"
+msgstr ""
+
+msgid "ciReport|All projects"
+msgstr ""
+
+msgid "ciReport|All severities"
+msgstr ""
+
+msgid "ciReport|All tools"
+msgstr ""
+
+msgid "ciReport|Automatically apply the patch in a new branch"
+msgstr ""
+
+msgid "ciReport|Base pipeline codequality artifact not found"
+msgstr ""
+
+msgid "ciReport|Browser Performance"
+msgstr ""
+
+msgid "ciReport|Browser performance test metrics results are being parsed"
+msgstr ""
+
+msgid "ciReport|Browser performance test metrics: "
+msgstr ""
+
+msgid "ciReport|Browser performance test metrics: %{strong_start}%{changesFound}%{strong_end} change"
+msgid_plural "ciReport|Browser performance test metrics: %{strong_start}%{changesFound}%{strong_end} changes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|Browser performance test metrics: No changes"
+msgstr ""
+
+msgid "ciReport|Checks"
+msgstr ""
+
+msgid "ciReport|Cluster Image Scanning"
+msgstr ""
+
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
+msgid "ciReport|Code quality degraded"
+msgstr ""
+
+msgid "ciReport|Code quality improved"
+msgstr ""
+
+msgid "ciReport|Code quality scanning detected %{issueCount} changes in merged results"
+msgstr ""
+
+msgid "ciReport|Container Scanning"
+msgstr ""
+
+msgid "ciReport|Container scanning"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Could not dismiss vulnerability because the associated pipeline no longer exists. Refresh the page and try again."
+msgstr ""
+
+msgid "ciReport|Coverage Fuzzing"
+msgstr ""
+
+msgid "ciReport|Coverage fuzzing"
+msgstr ""
+
+msgid "ciReport|Create Jira issue"
+msgstr ""
+
+msgid "ciReport|Create a merge request to implement this solution, or download and apply the patch manually."
+msgstr ""
+
+msgid "ciReport|Create issue"
+msgstr ""
+
+msgid "ciReport|DAST"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning"
+msgstr ""
+
+msgid "ciReport|Download patch to resolve"
+msgstr ""
+
+msgid "ciReport|Download the patch to apply it manually"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Failed to load Code Quality report"
+msgstr ""
+
+msgid "ciReport|Fixed"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Found %{issuesWithCount}"
+msgstr ""
+
+msgid "ciReport|IaC Scanning"
+msgstr ""
+
+msgid "ciReport|Investigate this vulnerability by creating an issue"
+msgstr ""
+
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
+msgid "ciReport|Load Performance"
+msgstr ""
+
+msgid "ciReport|Load performance test metrics detected %{strong_start}%{changesFound}%{strong_end} change"
+msgid_plural "ciReport|Load performance test metrics detected %{strong_start}%{changesFound}%{strong_end} changes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|Load performance test metrics results are being parsed"
+msgstr ""
+
+msgid "ciReport|Load performance test metrics: "
+msgstr ""
+
+msgid "ciReport|Load performance test metrics: No changes"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Loading Code Quality report"
+msgstr ""
+
+msgid "ciReport|Manage licenses"
+msgstr ""
+
+msgid "ciReport|Manually Added"
+msgstr ""
+
+msgid "ciReport|New"
+msgstr ""
+
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No code quality issues found"
+msgstr ""
+
+msgid "ciReport|RPS"
+msgstr ""
+
+msgid "ciReport|Resolve with merge request"
+msgstr ""
+
+msgid "ciReport|SAST"
+msgstr ""
+
+msgid "ciReport|Secret Detection"
+msgstr ""
+
+msgid "ciReport|Secret Detection detects secrets and credentials vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|Secret detection"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Showing %{fetchedItems} of %{totalItems} items"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|TTFB P90"
+msgstr ""
+
+msgid "ciReport|TTFB P95"
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error creating the merge request. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error fetching the codequality report."
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|This report contains all Code Quality issues in the source branch."
+msgstr ""
+
+msgid "ciReport|Used by %{packagesString}"
+msgid_plural "ciReport|Used by %{packagesString}, and %{lastPackage}"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|is loading"
+msgstr ""
+
+msgid "ciReport|is loading, errors when loading results"
+msgstr ""
+
+msgid "closed"
+msgstr ""
+
+msgid "closed issue"
+msgstr ""
+
+msgid "collect usage information"
+msgstr ""
+
+msgid "comment"
+msgstr ""
+
+msgid "commented on %{link_to_project}"
+msgstr ""
+
+msgid "commit %{commit_id}"
+msgstr ""
+
+msgid "committed"
+msgstr ""
+
+msgid "compliance violation has already been recorded"
+msgstr ""
+
+msgid "contacts can only be added to root groups"
+msgstr ""
+
+msgid "container registry images"
+msgstr ""
+
+msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
+msgstr ""
+
+msgid "container_name cannot be larger than %{max_length} chars"
+msgstr ""
+
+msgid "contains URLs that exceed the 1024 character limit (%{urls})"
+msgstr ""
+
+msgid "contains invalid URLs (%{urls})"
+msgstr ""
+
+msgid "contribute to this project."
+msgstr ""
+
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "created"
+msgstr ""
+
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
+msgid "created %{timeAgoString} by %{email} via %{user}"
+msgstr ""
+
+msgid "created %{timeAgo}"
+msgstr ""
+
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
+msgid "created by"
+msgstr ""
+
+msgid "data"
+msgstr ""
+
+msgid "database"
+msgstr ""
+
+msgid "date must not be after 9999-12-31"
+msgstr ""
+
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "days"
+msgstr ""
+
+msgid "default branch"
+msgstr ""
+
+msgid "deleted"
+msgstr ""
+
+msgid "deploy"
+msgstr ""
+
+msgid "design"
+msgstr ""
+
+msgid "disabled"
+msgstr ""
+
+msgid "does not exist"
+msgstr ""
+
+msgid "does not have a supported extension. Only %{extension_list} are supported"
+msgstr ""
+
+msgid "does not match dast_site.project"
+msgstr ""
+
+msgid "does not match dast_site_validation.project"
+msgstr ""
+
+msgid "download it"
+msgstr ""
+
+msgid "draft"
+msgid_plural "drafts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "e.g. %{token}"
+msgstr ""
+
+msgid "element is not a hierarchy"
+msgstr ""
+
+msgid "eligible users"
+msgstr ""
+
+msgid "email '%{email}' is not a verified email."
+msgstr ""
+
+msgid "email address settings"
+msgstr ""
+
+msgid "enabled"
+msgstr ""
+
+msgid "encrypted: needs to be a :required, :optional or :migrating!"
+msgstr ""
+
+msgid "ending with a reserved file extension is not allowed."
+msgstr ""
+
+msgid "entries cannot be larger than 255 characters"
+msgstr ""
+
+msgid "entries cannot be nil"
+msgstr ""
+
+msgid "entries cannot contain HTML tags"
+msgstr ""
+
+msgid "environment_id parameter is required when type is container_policy"
+msgstr ""
+
+msgid "epic"
+msgstr ""
+
+msgid "error"
+msgstr ""
+
+msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
+msgstr ""
+
+msgid "example.com"
+msgstr ""
+
+msgid "exceeds the %{max_value_length} character limit"
+msgstr ""
+
+msgid "exceeds the limit of %{bytes} bytes"
+msgstr ""
+
+msgid "exceeds the limit of %{bytes} bytes for directory name \"%{dirname}\""
+msgstr ""
+
+msgid "expired on %{timebox_due_date}"
+msgstr ""
+
+msgid "expires on %{timebox_due_date}"
+msgstr ""
+
+msgid "failed"
+msgstr ""
+
+msgid "failed to dismiss associated finding(id=%{finding_id}): %{message}"
+msgstr ""
+
+msgid "failed to dismiss finding: %{message}"
+msgstr ""
+
+msgid "failed to revert associated finding(id=%{finding_id}) to detected"
+msgstr ""
+
+msgid "file"
+msgid_plural "files"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "finding is not found or is already attached to a vulnerability"
+msgstr ""
+
+msgid "following"
+msgstr ""
+
+msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
+msgstr ""
+
+msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
+msgstr ""
+
+msgid "for %{link_to_pipeline_ref}"
+msgstr ""
+
+msgid "for %{ref}"
+msgstr ""
+
+msgid "for this project"
+msgstr ""
+
+msgid "fork"
+msgstr ""
+
+msgid "from"
+msgstr ""
+
+msgid "from %d job"
+msgid_plural "from %d jobs"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "frontmatter"
+msgstr ""
+
+msgid "group"
+msgstr ""
+
+msgid "group access token"
+msgstr ""
+
+msgid "group access tokens"
+msgstr ""
+
+msgid "group members"
+msgstr ""
+
+msgid "group's CI/CD settings."
+msgstr ""
+
+msgid "groups"
+msgstr ""
+
+msgid "has already been linked to another vulnerability"
+msgstr ""
+
+msgid "has already been taken"
+msgstr ""
+
+msgid "has already been taken as Codename"
+msgstr ""
+
+msgid "has already been taken as Suite"
+msgstr ""
+
+msgid "has been completed."
+msgstr ""
+
+msgid "has too deep level of nesting"
+msgstr ""
+
+msgid "help"
+msgstr ""
+
+msgid "http:"
+msgstr ""
+
+msgid "http://www.example.com"
+msgstr ""
+
+msgid "https://bamboo.example.com"
+msgstr ""
+
+msgid "https://your-bitbucket-server"
+msgstr ""
+
+msgid "i18n|%{language} (%{percent_translated}%% translated)"
+msgstr ""
+
+msgid "image diff"
+msgstr ""
+
+msgid "impersonation token"
+msgstr ""
+
+msgid "impersonation tokens"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
+msgid "in"
+msgstr ""
+
+msgid "in group %{link_to_group}"
+msgstr ""
+
+msgid "in project %{link_to_project}"
+msgstr ""
+
+msgid "instance completed"
+msgid_plural "instances completed"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "invalid milestone state `%{state}`"
+msgstr ""
+
+msgid "is"
+msgstr ""
+
+msgid "is already associated to a GitLab Issue. New issue will not be associated."
+msgstr ""
+
+msgid "is an invalid IP address range"
+msgstr ""
+
+msgid "is blocked by"
+msgstr ""
+
+msgid "is forbidden by a top-level group"
+msgstr ""
+
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not"
+msgstr ""
+
+msgid "is not a descendant of the Group owning the template"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
+msgid "is not allowed for sign-up. Please use your regular email address."
+msgstr ""
+
+msgid "is not allowed for this group."
+msgstr ""
+
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. Please use your regular email address."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
+msgstr ""
+
+msgid "is not in the group enforcing Group Managed Account"
+msgstr ""
+
+msgid "is not in the member group"
+msgstr ""
+
+msgid "is not the member project"
+msgstr ""
+
+msgid "is not valid. The iteration group has to match the iteration cadence group."
+msgstr ""
+
+msgid "is read-only"
+msgstr ""
+
+msgid "is too long (%{current_value}). The maximum size is %{max_size}."
+msgstr ""
+
+msgid "is too long (maximum is %{count} characters)"
+msgstr ""
+
+msgid "is too long (maximum is 100 entries)"
+msgstr ""
+
+msgid "is too long (maximum is 1000 entries)"
+msgstr ""
+
+msgid "issue"
+msgstr ""
+
+msgid "issues at risk"
+msgstr ""
+
+msgid "issues need attention"
+msgstr ""
+
+msgid "issues on track"
+msgstr ""
+
+msgid "it is larger than %{limit}"
+msgstr ""
+
+msgid "it is stored as a job artifact"
+msgstr ""
+
+msgid "it is stored externally"
+msgstr ""
+
+msgid "it is stored in LFS"
+msgstr ""
+
+msgid "it is too large"
+msgstr ""
+
+msgid "jigsaw is not defined"
+msgstr ""
+
+msgid "kuromoji custom analyzer"
+msgstr ""
+
+msgid "last commit:"
+msgstr ""
+
+msgid "latest"
+msgstr ""
+
+msgid "latest deployment"
+msgstr ""
+
+msgid "latest version"
+msgstr ""
+
+msgid "leave %{group_name}"
+msgstr ""
+
+msgid "less than a minute"
+msgstr ""
+
+msgid "level: %{level}"
+msgstr ""
+
+msgid "lfs objects"
+msgstr ""
+
+msgid "limit of %{project_limit} reached"
+msgstr ""
+
+msgid "load it anyway"
+msgstr ""
+
+msgid "loading"
+msgstr ""
+
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
+msgid "manual"
+msgstr ""
+
+msgid "math|Displaying this math block may cause performance issues on this page"
+msgstr ""
+
+msgid "math|There was an error rendering this math block"
+msgstr ""
+
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "merge request"
+msgid_plural "merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "merged %{timeAgo}"
+msgstr ""
+
+msgid "metric_id must be unique across a project"
+msgstr ""
+
+msgid "missing"
+msgstr ""
+
+msgid "most recent deployment"
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|1 merge commit"
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|Adds %{commitCount} and %{mergeCommitCount} to %{targetBranch}%{squashedCommits}."
+msgstr ""
+
+msgid "mrWidgetCommitsAdded|Adds %{commitCount} to %{targetBranch}."
+msgstr ""
+
+msgid "mrWidgetNothingToMerge|This merge request contains no changes."
+msgstr ""
+
+msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, push a commit or edit this merge request to use a different branch. With %{linkStart}CI/CD%{linkEnd}, automatically test your changes before merging."
+msgstr ""
+
+msgid "mrWidget|%{boldHeaderStart}Looks like there's no pipeline here.%{boldHeaderEnd}"
+msgstr ""
+
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
+msgid "mrWidget|%{mergeError}."
+msgstr ""
+
+msgid "mrWidget|%{mergeError}. Try again."
+msgstr ""
+
+msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} decreased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
+msgstr ""
+
+msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} increased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
+msgstr ""
+
+msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
+msgstr ""
+
+msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
+msgstr ""
+
+msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
+msgstr ""
+
+msgid "mrWidget|Added to the merge train by %{merge_author}"
+msgstr ""
+
+msgid "mrWidget|Added to the merge train. There are %{mergeTrainPosition} merge requests waiting to be merged"
+msgstr ""
+
+msgid "mrWidget|An error occurred while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while retrieving approval data for this merge request."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approval is optional"
+msgstr ""
+
+msgid "mrWidget|Approval password is invalid."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approve additionally"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
+msgid "mrWidget|Approved by you"
+msgstr ""
+
+msgid "mrWidget|Approved by you and others"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
+msgid "mrWidget|Cancel auto-merge"
+msgstr ""
+
+msgid "mrWidget|Check out branch"
+msgstr ""
+
+msgid "mrWidget|Checking if merge request can be merged…"
+msgstr ""
+
+msgid "mrWidget|Cherry-pick"
+msgstr ""
+
+msgid "mrWidget|Cherry-pick this merge request in a new merge request"
+msgstr ""
+
+msgid "mrWidget|Closed"
+msgstr ""
+
+msgid "mrWidget|Closed by"
+msgstr ""
+
+msgid "mrWidget|Closes issue"
+msgid_plural "mrWidget|Closes issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
+msgid "mrWidget|Delete source branch"
+msgstr ""
+
+msgid "mrWidget|Deletes the source branch"
+msgstr ""
+
+msgid "mrWidget|Deployment statistics are not available currently"
+msgstr ""
+
+msgid "mrWidget|Did not close"
+msgstr ""
+
+msgid "mrWidget|Dismiss"
+msgstr ""
+
+msgid "mrWidget|Does not delete the source branch"
+msgstr ""
+
+msgid "mrWidget|Email patches"
+msgstr ""
+
+msgid "mrWidget|Failed to load deployment statistics"
+msgstr ""
+
+msgid "mrWidget|GitLab %{linkStart}CI/CD can automatically build, test, and deploy your application.%{linkEnd} It only takes a few minutes to get started, and we can help you create a pipeline configuration file."
+msgstr ""
+
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
+msgid "mrWidget|If the %{type} branch exists in your local repository, you can merge this merge request manually using the command line."
+msgstr ""
+
+msgid "mrWidget|If the last pipeline ran in the fork project, it may be inaccurate. Before merge, we advise running a pipeline in this project."
+msgstr ""
+
+msgid "mrWidget|Jump to first unresolved thread"
+msgstr ""
+
+msgid "mrWidget|Learn more"
+msgstr ""
+
+msgid "mrWidget|Loading deployment statistics"
+msgstr ""
+
+msgid "mrWidget|Mark as ready"
+msgstr ""
+
+msgid "mrWidget|Members who can merge are allowed to add commits."
+msgstr ""
+
+msgid "mrWidget|Mentions issue"
+msgid_plural "mrWidget|Mentions issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "mrWidget|Merge"
+msgstr ""
+
+msgid "mrWidget|Merge blocked: all threads must be resolved."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: denied licenses must be removed."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: merge conflicts must be resolved."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
+msgstr ""
+
+msgid "mrWidget|Merge blocked: this merge request must be approved."
+msgstr ""
+
+msgid "mrWidget|Merge blocked: you can only merge after the above items are resolved."
+msgstr ""
+
+msgid "mrWidget|Merge failed."
+msgstr ""
+
+msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
+msgstr ""
+
+msgid "mrWidget|Merged by"
+msgstr ""
+
+msgid "mrWidget|Merges changes into"
+msgstr ""
+
+msgid "mrWidget|Merging! Changes are being shipped…"
+msgstr ""
+
+msgid "mrWidget|Merging! Changes will land soon…"
+msgstr ""
+
+msgid "mrWidget|Merging! Drum roll, please…"
+msgstr ""
+
+msgid "mrWidget|Merging! Everything's good…"
+msgstr ""
+
+msgid "mrWidget|Merging! Lift-off in 5… 4… 3…"
+msgstr ""
+
+msgid "mrWidget|Merging! Take a deep breath and relax…"
+msgstr ""
+
+msgid "mrWidget|Merging! The changes are leaving the station…"
+msgstr ""
+
+msgid "mrWidget|Merging! This is going to be great…"
+msgstr ""
+
+msgid "mrWidget|Merging! We're almost there…"
+msgstr ""
+
+msgid "mrWidget|More information"
+msgstr ""
+
+msgid "mrWidget|Open in Gitpod"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
+msgid "mrWidget|Plain diff"
+msgstr ""
+
+msgid "mrWidget|Please restore it or use a different %{type} branch."
+msgstr ""
+
+msgid "mrWidget|Ready to be merged automatically. Ask someone with write access to this repository to merge this request"
+msgstr ""
+
+msgid "mrWidget|Refresh"
+msgstr ""
+
+msgid "mrWidget|Refresh now"
+msgstr ""
+
+msgid "mrWidget|Refreshing now"
+msgstr ""
+
+msgid "mrWidget|Remove from merge train"
+msgstr ""
+
+msgid "mrWidget|Request to merge"
+msgstr ""
+
+msgid "mrWidget|Resolve conflicts"
+msgstr ""
+
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
+msgid "mrWidget|Revert"
+msgstr ""
+
+msgid "mrWidget|Revert this merge request in a new merge request"
+msgstr ""
+
+msgid "mrWidget|Revoke approval"
+msgstr ""
+
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
+msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
+msgstr ""
+
+msgid "mrWidget|Set by %{merge_author} to be merged automatically when the pipeline succeeds"
+msgstr ""
+
+msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
+msgstr ""
+
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
+msgid "mrWidget|The %{type} branch %{codeStart}%{name}%{codeEnd} does not exist."
+msgstr ""
+
+msgid "mrWidget|The changes were merged into"
+msgstr ""
+
+msgid "mrWidget|The changes were not merged into"
+msgstr ""
+
+msgid "mrWidget|The source branch has been deleted"
+msgstr ""
+
+msgid "mrWidget|The source branch is %{link} the target branch"
+msgstr ""
+
+msgid "mrWidget|The source branch is being deleted"
+msgstr ""
+
+msgid "mrWidget|This merge request failed to be merged automatically"
+msgstr ""
+
+msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
+msgstr ""
+
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "mrWidget|To merge, a Jira issue key must be mentioned in the title or description."
+msgstr ""
+
+msgid "mrWidget|Users who can write to the source or target branches can resolve the conflicts."
+msgstr ""
+
+msgid "mrWidget|What is a merge train?"
+msgstr ""
+
+msgid "mrWidget|Your password"
+msgstr ""
+
+msgid "mrWidget|into"
+msgstr ""
+
+msgid "must be a Debian package"
+msgstr ""
+
+msgid "must be a boolean value"
+msgstr ""
+
+msgid "must be a root namespace"
+msgstr ""
+
+msgid "must be a valid IPv4 or IPv6 address"
+msgstr ""
+
+msgid "must be a valid json schema"
+msgstr ""
+
+msgid "must be after start"
+msgstr ""
+
+msgid "must be an email you have verified"
+msgstr ""
+
+msgid "must be greater than start date"
+msgstr ""
+
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must be less than the limit of %{tag_limit} tags"
+msgstr ""
+
+msgid "must be set for a project namespace"
+msgstr ""
+
+msgid "must be unique by status and elapsed time within a policy"
+msgstr ""
+
+msgid "must have a repository"
+msgstr ""
+
+msgid "must match %{association}.project_id"
+msgstr ""
+
+msgid "my-awesome-group"
+msgstr ""
+
+msgid "my-channel"
+msgstr ""
+
+msgid "need attention"
+msgstr ""
+
+msgid "needs to be between 10 minutes and 1 month"
+msgstr ""
+
+msgid "never"
+msgstr ""
+
+msgid "never expires"
+msgstr ""
+
+msgid "new merge request"
+msgstr ""
+
+msgid "no approvers"
+msgstr ""
+
+msgid "no expiration"
+msgstr ""
+
+msgid "no name set"
+msgstr ""
+
+msgid "no one can merge"
+msgstr ""
+
+msgid "no scopes selected"
+msgstr ""
+
+msgid "none"
+msgstr ""
+
+msgid "not found"
+msgstr ""
+
+msgid "nounSeries|%{firstItem} and %{lastItem}"
+msgstr ""
+
+msgid "nounSeries|%{item}"
+msgstr ""
+
+msgid "nounSeries|%{item}, %{nextItem}"
+msgstr ""
+
+msgid "nounSeries|%{item}, and %{lastItem}"
+msgstr ""
+
+msgid "on track"
+msgstr ""
+
+msgid "only available on top-level groups."
+msgstr ""
+
+msgid "open issue"
+msgstr ""
+
+msgid "or"
+msgstr ""
+
+msgid "organizations can only be added to root groups"
+msgstr ""
+
+msgid "other card matches"
+msgstr ""
+
+msgid "out of %d total test"
+msgid_plural "out of %d total tests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "packages"
+msgstr ""
+
+msgid "pages"
+msgstr ""
+
+msgid "parent"
+msgid_plural "parents"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "password"
+msgstr ""
+
+msgid "pending comment"
+msgstr ""
+
+msgid "pending deletion"
+msgstr ""
+
+msgid "per day"
+msgstr ""
+
+msgid "personal access token"
+msgstr ""
+
+msgid "personal access tokens"
+msgstr ""
+
+msgid "pipeline"
+msgstr ""
+
+msgid "pipeline schedules documentation"
+msgstr ""
+
+msgid "pipelineEditorWalkthrough|Let's do this!"
+msgstr ""
+
+msgid "pipelineEditorWalkthrough|See how GitLab pipelines work"
+msgstr ""
+
+msgid "pipelineEditorWalkthrough|This %{codeStart}.gitlab-ci.yml%{codeEnd} file creates a simple test pipeline."
+msgstr ""
+
+msgid "pipelineEditorWalkthrough|Use the %{boldStart}commit changes%{boldEnd} button at the bottom of the page to run the pipeline."
+msgstr ""
+
+msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
+msgstr ""
+
+msgid "pod_name cannot be larger than %{max_length} chars"
+msgstr ""
+
+msgid "point"
+msgid_plural "points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "previously merged commits"
+msgstr ""
+
+msgid "private"
+msgstr ""
+
+msgid "private key does not match certificate."
+msgstr ""
+
+msgid "processing"
+msgstr ""
+
+msgid "project"
+msgid_plural "projects"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "project access token"
+msgstr ""
+
+msgid "project access tokens"
+msgstr ""
+
+msgid "project bots cannot be added to other groups / projects"
+msgstr ""
+
+msgid "project is read-only"
+msgstr ""
+
+msgid "project members"
+msgstr ""
+
+msgid "project name"
+msgstr ""
+
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
+msgid "projects"
+msgstr ""
+
+msgid "quick actions"
+msgstr ""
+
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
+msgstr ""
+
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
+msgstr ""
+
+msgid "recent activity"
+msgstr ""
+
+msgid "register"
+msgstr ""
+
+msgid "relates to"
+msgstr ""
+
+msgid "remaining"
+msgstr ""
+
+msgid "remove"
+msgstr ""
+
+msgid "remove due date"
+msgstr ""
+
+msgid "remove start date"
+msgstr ""
+
+msgid "remove weight"
+msgstr ""
+
+msgid "removed"
+msgstr ""
+
+msgid "removed a Zoom call from this issue"
+msgstr ""
+
+msgid "rendered diff"
+msgstr ""
+
+msgid "reply"
+msgid_plural "replies"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "repositories"
+msgstr ""
+
+msgid "repository:"
+msgstr ""
+
+msgid "required"
+msgstr ""
+
+msgid "satisfied"
+msgstr ""
+
+msgid "scan-execution-policy: policy not applied, %{policy_path} file is invalid"
+msgstr ""
+
+msgid "scan-execution-policy: policy not applied, %{policy_path} file is missing"
+msgstr ""
+
+msgid "security Reports|There was an error creating the merge request"
+msgstr ""
+
+msgid "severity|Blocker"
+msgstr ""
+
+msgid "severity|Critical"
+msgstr ""
+
+msgid "severity|High"
+msgstr ""
+
+msgid "severity|Info"
+msgstr ""
+
+msgid "severity|Low"
+msgstr ""
+
+msgid "severity|Major"
+msgstr ""
+
+msgid "severity|Medium"
+msgstr ""
+
+msgid "severity|Minor"
+msgstr ""
+
+msgid "severity|None"
+msgstr ""
+
+msgid "severity|Unknown"
+msgstr ""
+
+msgid "should be an array of %{object_name} objects"
+msgstr ""
+
+msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
+msgstr ""
+
+msgid "show %{count} more"
+msgstr ""
+
+msgid "show fewer"
+msgstr ""
+
+msgid "show less"
+msgstr ""
+
+msgid "sign in"
+msgstr ""
+
+msgid "smartcn custom analyzer"
+msgstr ""
+
+msgid "source"
+msgstr ""
+
+msgid "source diff"
+msgstr ""
+
+msgid "specified top is not part of the tree"
+msgstr ""
+
+msgid "spendCommand|%{slash_command} adds or subtracts time already spent."
+msgstr ""
+
+msgid "ssh:"
+msgstr ""
+
+msgid "started a discussion on %{design_link}"
+msgstr ""
+
+msgid "started on %{timebox_start_date}"
+msgstr ""
+
+msgid "starts on %{timebox_start_date}"
+msgstr ""
+
+msgid "structure is too large"
+msgstr ""
+
+msgid "stuck"
+msgstr ""
+
+msgid "success"
+msgstr ""
+
+msgid "suggestPipeline|1/2: Choose a template"
+msgstr ""
+
+msgid "suggestPipeline|2/2: Commit your changes"
+msgstr ""
+
+msgid "suggestPipeline|Choose %{boldStart}Code Quality%{boldEnd} to add a pipeline that tests the quality of your code."
+msgstr ""
+
+msgid "suggestPipeline|The template is ready! You can now commit it to create your first pipeline."
+msgstr ""
+
+msgid "suggestPipeline|We’re adding a GitLab CI configuration file to add a pipeline to the project. You could create it manually, but we recommend that you start with a GitLab template that works out of the box."
+msgstr ""
+
+msgid "tag name"
+msgstr ""
+
+msgid "terraform states"
+msgstr ""
+
+msgid "the correct format."
+msgstr ""
+
+msgid "the following epic(s)"
+msgstr ""
+
+msgid "the following issue(s)"
+msgstr ""
+
+msgid "the wiki"
+msgstr ""
+
+msgid "then"
+msgstr ""
+
+msgid "this document"
+msgstr ""
+
+msgid "time summary"
+msgstr ""
+
+msgid "toggle collapse"
+msgstr ""
+
+msgid "triggered"
+msgstr ""
+
+msgid "two-factor authentication settings"
+msgstr ""
+
+msgid "type must be Debian"
+msgstr ""
+
+msgid "type parameter is missing and is required"
+msgstr ""
+
+msgid "unicode domains should use IDNA encoding"
+msgstr ""
+
+msgid "updated"
+msgstr ""
+
+msgid "updated %{timeAgo}"
+msgstr ""
+
+msgid "updated %{time_ago}"
+msgstr ""
+
+msgid "uploads"
+msgstr ""
+
+msgid "user avatar"
+msgstr ""
+
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
+msgid "username"
+msgstr ""
+
+msgid "v%{version} published %{timeAgo}"
+msgstr ""
+
+msgid "value for '%{storage}' must be an integer"
+msgstr ""
+
+msgid "value for '%{storage}' must be between 0 and 100"
+msgstr ""
+
+msgid "verify ownership"
+msgstr ""
+
+msgid "version %{versionIndex}"
+msgstr ""
+
+msgid "via %{closed_via}"
+msgstr ""
+
+msgid "via merge request %{link}"
+msgstr ""
+
+msgid "view it on GitLab"
+msgstr ""
+
+msgid "view the blob"
+msgstr ""
+
+msgid "view the source"
+msgstr ""
+
+msgid "visibility"
+msgstr ""
+
+msgid "vulnerability"
+msgid_plural "vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "vulnerability|Add a comment"
+msgstr ""
+
+msgid "vulnerability|Add a comment or reason for dismissal"
+msgstr ""
+
+msgid "vulnerability|Add comment"
+msgstr ""
+
+msgid "vulnerability|Add comment & dismiss"
+msgstr ""
+
+msgid "vulnerability|Add comment and dismiss"
+msgstr ""
+
+msgid "vulnerability|Dismiss vulnerability"
+msgstr ""
+
+msgid "vulnerability|Save comment"
+msgstr ""
+
+msgid "vulnerability|Undo dismiss"
+msgstr ""
+
+msgid "vulnerability|dismissed"
+msgstr ""
+
+msgid "was scheduled to merge after pipeline succeeds by"
+msgstr ""
+
+msgid "wiki page"
+msgstr ""
+
+msgid "with %{additions} additions, %{deletions} deletions."
+msgstr ""
+
+msgid "with expiry changing from %{old_expiry} to %{new_expiry}"
+msgstr ""
+
+msgid "with expiry remaining unchanged at %{old_expiry}"
+msgstr ""
+
+msgid "yaml invalid"
+msgstr ""
+
+msgid "your settings"
+msgstr ""
+
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
+msgid "✔"
+msgstr ""
+
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index 83c3063b6fb..2268717764d 100644
--- a/locale/mn_MN/gitlab.po
+++ b/locale/mn_MN/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: mn\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index c78e94aaa5f..076b3c7a21a 100644
--- a/locale/nb_NO/gitlab.po
+++ b/locale/nb_NO/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: nb\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -28,15 +28,9 @@ msgstr " Samlet inn %{time}"
msgid " Please sign in."
msgstr " Vennligst logg inn."
-msgid " Target Path"
-msgstr " MÃ¥lsti"
-
msgid " Try to %{action} this file again."
msgstr " Prøv å %{action} denne filen igjen."
-msgid " Type"
-msgstr " Type"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Du er nødt til å gjøre dette før %{grace_period_deadline}."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "%d flere kommentarer"
msgstr[1] "%d flere kommentarer"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d åpen sak"
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "%d personlig prosjekt vil bli fjernet og kan ikke gjenopprettes."
msgstr[1] "%d personlige prosjekter vil bli fjernet og kan ikke gjenopprettes."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d tidligere sammenslått commit"
@@ -371,10 +375,10 @@ msgid_plural "%d projects selected"
msgstr[0] "%d prosjekt valgt"
msgstr[1] "%d prosjekter valgt"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d forespørsel med advarsler"
-msgstr[1] "%d forespørsler med advarsler"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -468,9 +472,6 @@ msgstr ""
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 "%{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 "%{author_link} klonet %{original_issue} til %{new_issue}."
@@ -702,6 +703,9 @@ msgstr "%{integrations_link_start}Integrasjoner%{link_end} lar deg gjøre tredje
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} vil bli fjernet! Er du sikker?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "%{issueType} handlinger"
@@ -780,7 +784,7 @@ msgstr "%{level_name} er ikke tillatt siden utgreiningskildeprosjektet har laver
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, vennligst bekreft e-postadressen din nå!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} dag"
@@ -992,11 +996,19 @@ msgstr "%{spanStart}i%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} til %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}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 "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -1288,7 +1300,7 @@ msgstr "+%{more_reviewers_count} flere anmeldere"
msgid "+%{tags} more"
msgstr "+%{tags} til"
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr "En ny utgivelse %{tag} for %{name} ble publisert. Besøk %{release_link_
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "En ny utgivelse %{tag} for %{name} ble publisert. Besøk 'Utgivelser'-siden for å lese mer om den:"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr "Om automatisk distribusjon"
msgid "About this feature"
msgstr "Om denne funksjonen"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Rapporter over misbruk"
@@ -1827,9 +1851,6 @@ msgstr "Tilgang nektet for LDAP-kontoen din."
msgid "Access denied: %{error}"
msgstr "Tilgang nektet: %{error}"
-msgid "Access expiration date"
-msgstr "Tilgangsutløpsdato"
-
msgid "Access expires"
msgstr "Tilgangen utløper"
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr "Handling"
@@ -2040,6 +2064,9 @@ msgstr "Legg til Kubernetes-klynge"
msgid "Add LICENSE"
msgstr "Legg til LICENSE"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr "Legg til kommentar nå"
msgid "Add comment to design"
msgstr "Legg til kommentar til design"
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr "Legger til en sak i en epos."
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr "Gjest"
msgid "AdminArea|Included Free in license"
msgstr "Inkludert gratis i lisensen"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "Nyligste grupper"
@@ -2484,6 +2520,9 @@ msgstr "Nyligste brukere"
msgid "AdminArea|Maintainer"
msgstr "Vedlikeholder"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr "Nytt prosjekt"
msgid "AdminArea|New user"
msgstr "Ny bruker"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "Eier"
@@ -2580,12 +2622,18 @@ msgstr "Vil du slette prosjektet %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps-domene"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Konfigurer «Let's Encrypt»"
@@ -2625,6 +2673,27 @@ msgstr "«Let's Encrypt»-E-post"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr "Påkrevd rørledningsoppsett"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr "Velg en CI/CD-mal"
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "Aktive brukere"
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr "Amazon-autentisering er ikke %{link_start}riktig konfigurert%{link_end}.
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."
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "En feil oppstod under forhåndsvisning av blobben"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr "En feil oppstod under behandling av filen."
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "En feil oppstod under fjerning av eposer."
@@ -4106,6 +4193,9 @@ msgstr "En sak finnes allerede"
msgid "An unauthenticated user"
msgstr "En uautentisert bruker"
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "En uventet feil oppstod under sjekking av prosjektmiljøet."
@@ -4196,6 +4286,9 @@ msgstr "Enhver milepæl"
msgid "Any namespace"
msgstr "Ethvert navneområde"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "App-ID"
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "Er du sikker på at du vil arkivere dette prosjektet?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "Er du sikker på at du vil oppheve arkiveringen av dette prosjektet?"
@@ -4923,12 +5019,6 @@ msgstr "Tilordne til den kommenterende brukeren"
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr "Tildel deg selv til disse sakene"
-
-msgid "Assign yourself to this issue"
-msgstr "Tildel deg selv til denne saken"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr "Vedlegging av filen mislyktes."
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr "Gruppehendelser"
msgid "AuditLogs|IP Address"
msgstr "IP-adresse"
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr "Medlemshendelser"
@@ -5068,6 +5164,54 @@ msgstr "Denne måneden"
msgid "AuditLogs|User Events"
msgstr "Brukerhendelser"
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "Aug"
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "Dine merker"
-msgid "Balsamiq file could not be loaded."
-msgstr "Balsamiq-filen kunne ikke lastes inn."
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr "Basert på"
@@ -5542,6 +5686,12 @@ msgstr "For å behandle planen til denne gruppen, besøk faktureringsseksjonen t
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "Mens GitLab avslutter tilgjengeligheten til BronSe-planen, kan du fortsatt fornye Bronse-abonnementet én siste gang før %{eoa_bronze_plan_end_date}. Vi tilbyr også en gratis oppgradering til Premium-abonnementet vårt i en kort tidsperiode (opptil 25 brukere)! Lær mer om endringene og tilbudene i vår %{announcement_link}."
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 "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."
@@ -5766,6 +5916,9 @@ msgstr "Søk blant prosjekter"
msgid "BoardNewIssue|Select a project"
msgstr "Velg et prosjekt"
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr "Enhver milepæl"
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr "Tilordnet"
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr "Rediger"
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr "Milepæl"
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr "Ingen milepæl"
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr "Søk i milepæler"
msgid "BoardScope|Select assignee"
msgstr "Velg en tilordnet"
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr "Grenen finnes allerede"
msgid "Branch changed"
msgstr "Grenen ble endret"
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Grenen er allerede i bruk"
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr "Meldinger"
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Bla gjennom katalog"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Eksisterende grupper"
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "Til ny gruppe"
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr "Dette vil opprette en ny commit for å kunne tilbakestille de eksisteren
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr "Endret tilordnet person(er)."
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr "Kasse"
@@ -7135,6 +7339,9 @@ msgstr "Delsum"
msgid "Checkout|Tax"
msgstr "Avgift"
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr "Totalt"
@@ -7378,24 +7585,12 @@ msgstr "Alle miljøer"
msgid "CiVariable|Create wildcard"
msgstr "Opprett jokertegn"
-msgid "CiVariable|Masked"
-msgstr "Maskert"
-
msgid "CiVariable|New environment"
msgstr "Nytt miljø"
-msgid "CiVariable|Protected"
-msgstr "Beskyttet"
-
msgid "CiVariable|Search environments"
msgstr "Søk i miljøene"
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr "Veksle beskyttelsesstatus"
-
msgid "Classification Label (optional)"
msgstr "Klassifiseringsetikett (valgfritt)"
@@ -7453,6 +7648,15 @@ msgstr "Tøm startdato"
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr "Tøm vektlegging"
@@ -7612,6 +7816,9 @@ msgstr "Klynge-nivå"
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr "Tilgangssjetonger"
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr "Oppsett"
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr "Kopier sjetong"
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr "Opprettet av %{name} den %{time}"
msgid "ClusterAgents|Date created"
msgstr "Dato opprettet"
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr "Beskrivelse"
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr "API-URL-en burde være en gyldig http/https-URL."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Legg til Kubernetes-klynge"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Legg til en Kubernetes-klyngeintegrasjon"
-
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 "Å legge til en Kubernetes-klynge i gruppen din vil automatisk dele klyngen rundt på tvers av alle prosjektene dine. Bruk gjennomgangsapper, distribuer applikasjonene dine, og kjør rørledningene dine med letthet på alle prosjekter som bruker den samme klyngen."
@@ -8052,12 +8268,9 @@ msgstr "Klyngenavn er påkrevd."
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 "Klynger brukes ved å velge nærmeste forfader med et samsvarende miljøomfang. For eksempel vil prosjektklynger overstyre gruppeklynger. %{linkStart}Mere informasjon%{linkEnd}"
-msgid "ClusterIntegration|Connect cluster with certificate"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect existing cluster"
-msgstr "Koble til eksisterende klynge"
-
msgid "ClusterIntegration|Connect with a certificate"
msgstr ""
@@ -8103,17 +8316,8 @@ msgstr "Klarte ikke å laste inn undernettverk"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Opprett Kubernetes-klynge"
-msgid "ClusterIntegration|Create cluster on"
-msgstr "Opprett klynge på"
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr "Opprett ny klynge"
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr "Opprett ny klynge på EKS"
-
-msgid "ClusterIntegration|Create new cluster on GKE"
-msgstr "Opprett ny klynge på GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Oppretter Kubernetes-klynge"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Aktiver denne innstillingen hvis du bruker rollebasert tilgangskontroll (RBAC)."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr "Skriv inn ny tjenestesjetong"
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "Miljøomfang"
@@ -8220,9 +8430,6 @@ msgstr "Gruppeklynge"
msgid "ClusterIntegration|HTTP Error"
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 ""
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -8268,8 +8475,8 @@ msgstr "Lær mer om %{help_link_start_machine_type}maskintyper%{help_link_end} o
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "Lær mer om %{help_link_start}soner%{help_link_end}."
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "Lær mer om Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "Lær mer om gruppe-Kubernetes-klynger"
@@ -8361,9 +8568,6 @@ msgstr "Antall noder"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr "Antall noder må være en numerisk verdi."
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr "Kunne ikke koble til"
msgid "ClusterIntegration|Unknown Error"
msgstr "Ukjent feil"
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr "VPC"
@@ -8631,7 +8841,7 @@ msgstr "Vi kunne ikke bekrefte at et av prosjektene dine på GCP har aktivert fa
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr "Vi kunne ikke innhente noen prosjekter. Forsikre deg om at du har et prosjekt på %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
-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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr "Commit"
msgid "CommitMessage|Add %{file_name}"
msgstr "Legg til %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "skapt"
@@ -9002,6 +9209,9 @@ msgstr "Vis åpne fletteforespørsler"
msgid "Complete"
msgstr "Fullført"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr "Fullført"
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr "Sett opp eksisterende installasjon"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ 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 "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr "Bekreft"
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr "Bekreft nytt passord"
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr "Koble til"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr "Koble til alle kodelagerene"
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr "Etiketten ble vellykket merket for sletting."
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr "Etikettene ble vellykket merket for sletting."
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr "Handlinger"
@@ -9980,6 +10223,12 @@ msgstr "Nyligst brukt"
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr "Ny opplasting"
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr "Total størrelse: %{totalSize}"
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr "Klarte ikke å oppdatere wikisiden"
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr "Opprett nytt domene"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr "Opprett et Mattermost-team for denne gruppen"
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr "Opprett ny"
msgid "Create new %{name} by email"
msgstr "Opprett ny %{name} via E-post"
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr "Opprett ny stempel"
msgid "Create new project"
msgstr "Opprett et nytt prosjekt"
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr "Opprett bruker"
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr "Opprett jokertegn: %{searchTerm}"
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr "Kritiske sårbarheter til stede"
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr "Egendefinert tidsrom"
msgid "Custom range (UTC)"
msgstr "Tilpasset område (UTC)"
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} valgt (%{maxLabels} max)"
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Dato"
msgid "CycleAnalytics|Display chart filters"
msgstr "Vis diagramfiltre"
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr "Arbeidstype"
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,12 +11220,12 @@ msgstr ""
msgid "DAST Configuration"
msgstr "DAST-oppsett"
-msgid "DAST Scans"
-msgstr "DAST-skanninger"
-
msgid "DAST profile not found: %{name}"
msgstr ""
+msgid "DAST profiles"
+msgstr ""
+
msgid "DNS"
msgstr "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr "Klarte ikke å oppdatere nettstedsprofilen. Vennligst prøv igjen."
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr "Avlusingsmeldinger"
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr "Behandle DAST-skanninger"
-
msgid "DastProfiles|Manage profiles"
msgstr "Behandle profiler"
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr "Datatype"
@@ -11549,9 +11804,6 @@ msgstr "Standardgren"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr "Standard første ukedag"
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr "Domene"
msgid "Domain Name"
msgstr "Domenenavn"
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr "Har du ikke en konto ennå?"
@@ -13073,6 +13358,9 @@ msgstr "Minusstemmer"
msgid "Draft"
msgstr "Utkast"
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr "Dra designene dine hit eller %{linkStart}klikk for å laste opp%{linkEnd}."
@@ -13118,6 +13406,45 @@ msgstr "Forfallsdato"
msgid "Duration"
msgstr "Varighet"
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr "Rediger gruppe: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "Rediger identiteten til %{user_name}"
-msgid "Edit in Web IDE"
-msgstr "Rediger i nett-IDE"
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
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."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr "Miljøer"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr "Lær mer om hvordan stoppe miljøer"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr "Mere informasjon"
-
msgid "Environments|New environment"
msgstr "Nytt miljø"
@@ -14053,8 +14380,11 @@ msgstr ""
msgid "Environments|Updated"
msgstr "Oppdatert"
-msgid "Environments|You don't have any environments right now"
-msgstr "Du har ingen miljøer akkurat nå"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr "av %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr "Ingen prosjekter er tilgjengelige"
@@ -14434,6 +14770,9 @@ msgstr "Velg prosjekt"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr "Feil"
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr "Eksempel: @sub\\.firma\\.com$"
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr "Utforsk grupper"
msgid "Explore groups"
msgstr "Utforsk grupper"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Utforsk prosjekter"
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr "Feb"
msgid "February"
msgstr "Februar"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr "Filtrer resultater …"
msgid "Filter users"
msgstr "Filtrer brukere"
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr "Filter..."
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr "Fra %{code_open}%{source_title}%{code_close} til"
msgid "From %{providerTitle}"
msgstr "Fra %{providerTitle}"
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr "Generisk"
@@ -16522,9 +16873,6 @@ msgstr "Gitlab-sak"
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr "GitLab-sider"
@@ -16537,6 +16885,9 @@ msgstr "GitLab-brukerstøttebot"
msgid "GitLab Team Member"
msgstr "GitLab-teammedlem"
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "GitLab-bruker"
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr "GitLab-metadata-URL"
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr "GÃ¥ til definisjonen"
msgid "Go to environments"
msgstr "Gå til miljøer"
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr "GÃ¥ til epos"
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr "Jeg forstår"
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr "Gruppevariabler (arvet)"
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr "Opprett gruppe"
msgid "GroupsNew|Create new group"
msgstr "Opprett ny gruppe"
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr "Min fantastiske gruppe"
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr "Ingen importalternativer er tilgjengelige"
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr "Skjul delte prosjekter"
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr "Jeg aksepterer %{terms_link}"
msgid "I forgot my password"
msgstr "Jeg glemte passordet mitt"
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr "SSH-nøkkelen din har utløpt. Vennligst generer en ny nøkkel."
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr "SSH-nøkkelen din utløper snart. Vennligst generer en ny nøkkel."
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "IP-adresse"
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,8 +18976,8 @@ 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}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
+msgstr ""
msgid "Import from"
msgstr "Importer fra"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr "Importer saker"
-msgid "Import members"
-msgstr "Importer medlemmer"
-
-msgid "Import members from another project"
-msgstr "Importer medlemmer fra et annet prosjekt"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr "Importer prosjekt"
msgid "Import project from"
msgstr "Importer prosjekt fra"
-msgid "Import project members"
-msgstr "Importer prosjektmedlemmer"
-
msgid "Import projects from Bitbucket"
msgstr "Importer prosjekter fra Bitbucket"
@@ -18866,9 +19353,6 @@ msgstr "Grunnleggende om Git"
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr "Inviter teamet ditt nå"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr "Alle"
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr "Tilordnede"
@@ -19313,6 +19800,12 @@ msgstr "Publisert"
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr "Alvorlighetsgrad"
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr "Utilordnet"
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr "Det oppstod et problem med å laste opp bildet ditt."
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr "Alarmdetaljer"
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr "MÃ¥ltall"
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "Oppsummering"
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr "Arvet"
msgid "Inherited:"
msgstr "Arvet:"
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr "Integrert"
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr "Bruk tilpassede innstillinger"
msgid "Integrations|Use default settings"
msgstr "Bruk forvalgte innstillinger"
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr "Invitasjon"
msgid "Invitation declined"
msgstr "Invitasjonen ble avslått"
-msgid "Invite"
-msgstr "Inviter"
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr "Inviter en gruppe"
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr "Inviter gruppe"
-
-msgid "Invite member"
-msgstr "Inviter medlem"
-
msgid "Invite members"
msgstr "Inviter medlemmer"
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr "Noe gikk galt"
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr "Saken ble lukket av %{name} %{reason}"
msgid "Issue weight"
msgstr "Saksvektlegging"
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr "Alder"
@@ -20410,7 +20933,7 @@ msgstr "Slett bord"
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,11 +21104,14 @@ msgstr "Iterasjonen ble oppdatert"
msgid "Iterations"
msgstr "Iterasjoner"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr "Legg til iterasjon"
-msgid "Iterations|Automated scheduling"
-msgstr "Automatisert planlegging"
+msgid "Iterations|All"
+msgstr ""
msgid "Iterations|Cadence configuration is invalid."
msgstr ""
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Varighet"
@@ -20635,7 +21158,13 @@ msgstr "Fremtidige iterasjoner"
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr "Velg nummer"
msgid "Iterations|Select start date"
msgstr "Velg startdato"
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr "Startdato"
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr "Startdatoen til din første iterasjon"
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr "Brukernavn eller E-post"
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr "Vis Jira-saker i GitLab"
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr "Ingen jobber å vise"
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr "Bla"
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "Last ned"
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr "Behold"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "Bla til bunn"
@@ -21094,6 +21674,9 @@ msgstr "Bla til toppen"
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "tillatt å mislykkes"
@@ -21477,6 +22063,9 @@ msgstr "Forrige oppdateringsforsøk"
msgid "Last updated"
msgstr "Sist oppdatert"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr "Sist brukt"
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr "La oss ta en prat!"
msgid "License Compliance"
msgstr "Lisensoverensstemmelse"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr "Lisensgodkjennelser"
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr "Lisensnavn"
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr "Fjern lisens"
@@ -21840,6 +22452,12 @@ msgstr "Det er for øyeblikket ingen retningslinjer som samsvarer i dette prosje
msgid "LicenseCompliance|This license already exists in this project."
msgstr "Denne lisensen finnes allerede i dette prosjektet."
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr "Du er i ferd med å fjerne lisensen, %{name}, fra dette prosjektet."
@@ -22029,9 +22647,6 @@ msgstr "List opp tilgjengelige kodelagre"
msgid "List of all merge commits"
msgstr "Liste over alle innflettings-commits"
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr "Administrer gruppe-etiketter"
msgid "Manage labels"
msgstr "Administrer etiketter"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr "Behandle milepæler"
@@ -22338,6 +22956,9 @@ msgstr "Manifest-importering"
msgid "Manual"
msgstr "Manuell"
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr "Maks filstørrelse er 200 KB."
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr "Maks økttid"
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr "Maks antall prosjekter."
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr "Søk i inviterte"
msgid "Member|Deny access"
msgstr "Nekt tilgang"
-msgid "Member|Remove member"
-msgstr "Fjern medlem"
-
msgid "Member|Revoke invite"
msgstr "Tilbakekall invitasjon"
@@ -22918,7 +23542,7 @@ msgstr "Fletteforespørsler slått sammen"
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr "Fletteforespørsel"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr "f.eks. foresprl./sek"
msgid "Mi"
msgstr "Mi"
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr "Lukk milepæl"
msgid "Milestones|Completed Issues (closed)"
msgstr "Fullførte saker (lukket)"
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Slett milepæl"
@@ -23687,6 +24311,9 @@ msgstr "Milepælen %{milestoneTitle} ble ikke funnet"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr "Pågående saker (åpne og tilordnede)"
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr "Prosjektmilepæl"
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr "Gjenåpne milepælen"
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "Denne handlingen kan ikke reverseres."
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr "MÃ¥ned"
msgid "Months"
msgstr "MÃ¥neder"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr "Mer informasjon"
@@ -23924,16 +24563,16 @@ msgstr "Distribuer på nytt"
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr "Logg ut og logg inn med en annen konto"
msgid "Need help?"
msgstr "Trenger du hjelp?"
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr "Aldri"
msgid "New"
msgstr "Ny"
-msgid "New %{issueType}"
-msgstr "Ny %{issueType}"
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr "Ny katalog"
msgid "New discussion"
msgstr "Ny diskusjon"
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr "Nytt miljø"
@@ -24471,6 +25140,9 @@ msgstr "Nytt prosjekt/kodelager"
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr "Ny utgivelse"
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr "Ny tidsplan"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Nytt utdrag"
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr "Kallenavn"
@@ -24585,6 +25257,9 @@ msgstr "Ingen artefakter ble funnet"
msgid "No assignee"
msgstr "Ingen er tilordnet"
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "Ingen autentiseringsmetoder er satt opp."
@@ -24612,12 +25287,6 @@ msgstr "Ingen commiter er til stede her"
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr "Ingen saker funnet"
msgid "No iteration"
msgstr "Ingen iterasjon"
-msgid "No iterations found"
-msgstr "Ingen iterasjoner ble funnet"
-
msgid "No iterations to show"
msgstr "Ingen iterasjoner å vise"
@@ -24720,7 +25386,7 @@ msgstr "Ingen lisens. Alle rettigheter forbeholdt"
msgid "No matches found"
msgstr "Ingen treff"
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr "Ingen meldinger ble loggført"
msgid "No milestone"
msgstr "Ingen milepæl"
-msgid "No milestones to show"
-msgstr "Ingen milepæler å vise"
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr "Ingen startdato"
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr "Ingen etiketter er valgt"
@@ -24992,6 +25658,9 @@ msgstr "Bare vis historikken"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Bare administratorer kan slette prosjektet"
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Kun prosjektmedlemmer kan kommentere."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,12 +26301,12 @@ msgstr "Ã…pen"
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 ""
-
msgid "Open errors"
msgstr "Ã…pne feil"
+msgid "Open in Gitpod"
+msgstr ""
+
msgid "Open in Web IDE"
msgstr ""
@@ -25650,9 +26319,6 @@ msgstr "Ã…pne i din IDE"
msgid "Open raw"
msgstr "Åpne råversjon"
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "Ã…pne sidelinje"
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "Ã…pnes i et nytt vindu"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr "Eid av:"
msgid "Owner"
msgstr "Eier"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr "Velg et navn"
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Rørledninger"
@@ -26873,12 +27551,15 @@ msgstr "Rørledningsdiagrammer"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
-msgstr "API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
+msgid "Pipelines|API"
+msgstr "API"
+
msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr ""
@@ -26924,7 +27605,7 @@ msgstr "Rediger"
msgid "Pipelines|Editor"
msgstr "Redigerer"
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr "Senest brukt"
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr "Mer informasjon"
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,22 +27725,16 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 "Sjetong"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
-msgstr "Bruk en CI/CD-mal"
-
-msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
+msgid "Pipelines|Try test template"
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
+msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr "Sjekker rørledningsstatusen."
-msgid "Pipeline|Commit"
-msgstr "Commit"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr "Dato"
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr "Varighet"
-
msgid "Pipeline|Failed"
msgstr "Mislyktes"
@@ -27464,9 +28142,6 @@ msgstr "Vennligst velg en fil"
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr "Vennligst velg en gruppe."
-
msgid "Please select a valid target branch"
msgstr "Vennligst velg en gyldig målgren"
@@ -27521,7 +28196,7 @@ msgstr "Podden ble ikke funnet"
msgid "Pods in use"
msgstr "Podder som brukes"
-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."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr "Bruk relative tidspunkter"
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr "Forrige"
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr "Skriv inn pronomenene dine for å la folk vite hvordan de skal referere til deg"
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr "Fullt 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 ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr "Denne informasjonen vil vises på profilen din"
msgid "Profiles|Time settings"
msgstr "Tidsinnstillinger"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "2-trinnsautentisering"
@@ -28229,9 +28913,6 @@ msgstr "Navnet ditt ble automatisk satt, basert på din %{provider_label}-konto,
msgid "Profiles|Your status"
msgstr "Din status"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "f.eks. Min MacBook-nøkkel"
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr "Fletteforslag"
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr "Ingen importalternativer er tilgjengelige"
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr "Push-hendelser"
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr "Avslått (lukket)"
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr "Relaterte saker"
msgid "Related merge requests"
msgstr "Relaterte fletteforespørsler"
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr "Relatert til"
@@ -30519,6 +31218,9 @@ msgstr "Fjern brukt tid"
msgid "Remove time estimate"
msgstr "Fjern tidsanslag"
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr "Fjern bruker"
@@ -30729,7 +31431,10 @@ msgstr "Rapporter misbruk"
msgid "Report abuse to admin"
msgstr "Rapporter misbruk til admin"
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr "Feilede"
msgid "Reports|Filename"
msgstr "Filnavn"
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr "Identifikator"
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr "Skanner"
@@ -30844,9 +31561,15 @@ msgstr "Testoversikt"
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr "Verktøy"
@@ -31357,7 +32080,7 @@ msgstr "GÃ¥ gjennom endringer"
msgid "Review requests for you"
msgstr "Gjennomgangsforespørsler til deg"
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr "legge til en"
msgid "RightSidebar|deleting the"
msgstr "sletter"
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "Veikart"
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr "Aktiv"
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr "Beskrivelse"
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr "Navn"
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr "Frakoblet"
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr "PÃ¥ nett"
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr "Satt på pause"
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr "Plattform"
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr "Revisjon"
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr "Runner"
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr "Løpere"
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr "Etiketter"
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr "spesifikk"
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "Kjører"
@@ -31950,10 +32759,10 @@ msgstr "Lagrer"
msgid "Saving project."
msgstr "Lagrer prosjekt."
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr "Søk i prosjekter"
msgid "Search projects..."
msgstr "Søk blant prosjekter …"
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr "Hemmelig oppdagelse"
msgid "Secret token"
msgstr "Hemmelig sjetong"
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,17 +33243,20 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
-msgstr "Behandle skanninger"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
msgstr ""
@@ -32485,6 +33312,12 @@ msgstr "%{branches} %{plural}"
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr "%{branches} og %{lastBranch} %{plural}"
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr "Alle retningslinjer"
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr "Beskrivelse"
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr "Hvis du bruker Auto DevOps, vil ikke din %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd}-filen bli oppdatert hvis du endrer en retningslinje i denne delen. Auto DevOps-brukere bør gjøre endringer ved å følge dokumentasjonen for %{linkStart}Container-nettverksretningslinjer%{linkEnd}."
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr "Nettverk"
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr "Ny retningslinje"
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr "Endre status"
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr "Prosjekter lagt til"
msgid "SecurityReports|Remove project from dashboard"
msgstr "Fjern prosjekt fra kontrollpanelet"
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr "Skanningsdetaljer"
@@ -32920,7 +33816,7 @@ msgstr "Sett status"
msgid "SecurityReports|Severity"
msgstr "Alvorlighet"
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,17 +33828,20 @@ msgstr "Beklager, filteret ditt ga ingen resultater"
msgid "SecurityReports|Status"
msgstr "Status"
+msgid "SecurityReports|Submit vulnerability"
+msgstr ""
+
msgid "SecurityReports|Take survey"
msgstr "Ta undersøkelse"
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
-msgid "SecurityReports|The security 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 "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|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
+msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr "Det oppstod en feil under tillegging av kommentaren."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr "SÃ¥rbarhetsrapport"
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr "Selv om det er sjeldent at du ikke har sårbarheter i rørledningen din, kan det skje. I alle fall ber vi deg dobbeltsjekke innstillingene dine for å forsikre om at alle sikkerhetsskanningsjobber har blitt vellykket bestått."
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr "Velg side"
msgid "Select a branch"
msgstr "Velg en gren"
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr "Velg en gruppe du ønsker å invitere"
-
msgid "Select a label"
msgstr "Velg et stempel"
@@ -33205,6 +34107,9 @@ msgstr "Velg abonnement"
msgid "Select target branch"
msgstr "Velg målgren"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr "Velg tidssone"
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr "Angi alvorlighetsgrad"
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr "Bestem tidsanslag"
@@ -33631,9 +34542,6 @@ msgstr "Sett vektlegging til %{weight}."
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "Legg til status-emoji"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr "Vis «Lukket»-listen"
msgid "Show the Open list"
msgstr "Vis «Åpne»-listen"
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr "Vis tomromsendringer"
@@ -34055,6 +34966,9 @@ msgstr "Brukernavnet er for kort (minimumet er %{min_length} tegn)."
msgid "Signed in"
msgstr "PÃ¥logget"
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr "Snøplog"
msgid "Solution"
msgstr "Løsning"
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr "Noen endringer vises ikke"
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr "Noe gikk galt under veksling av knappen"
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr "Noe gikk galt under oppdatering av et krav."
msgid "Something went wrong while updating assignees"
msgstr "Noe gikk galt under oppdatering av tilordnede"
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr "Noe gikk galt under oppdatering av listeinnstillingene dine"
@@ -34835,6 +35749,9 @@ msgstr "Startdato"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr "Status:"
msgid "Status: %{title}"
msgstr "Status: %{title}"
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr "MÃ¥lgren"
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr "Trinn 1."
@@ -35267,10 +36187,10 @@ msgstr "Abonnementet ble vellykket opprettet."
msgid "Subscription successfully deleted."
msgstr "Abonnementet ble vellykket slettet."
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr "Last opp en lisensfil"
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr "Brukere i abonnementet"
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr "Systeminformasjon"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr "Systemstandard (%{default})"
@@ -35957,6 +36873,12 @@ msgstr "MÃ¥lsti"
msgid "Target branch"
msgstr "MÃ¥lgren"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr "MÃ¥lgren"
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "Mal"
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr "URL-en burde starte med http:// eller https://"
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr "Programmet vil bli brukt der klienthemmeligheten kan holdes konfidensiell. Apper designet for mobiler, og enkeltsideapper, blir ansett som ikke-konfidensielle."
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr "Grenen eller etiketten finnes ikke"
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr "Prosjektet ble vellykket importert."
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr "Kodelageret må være tilgjengelig over %{code_open}http://%{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 scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr "Utdraget er bare synlig for prosjektmedlemmer."
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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"
msgstr ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr "Disse vil bli sendt til %{email} som et vedlegg når de er ferdige."
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,8 +38194,8 @@ msgstr "Denne %{issuableType} er konfidensiell"
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "Denne %{issuable} er låst. Kun %{strong_open}prosjektmedlemmer%{strong_close} kan kommentere."
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
-msgstr "Denne %{noteableTypeText} er %{confidentialLinkStart}konfidensiell%{linkEnd} og %{lockedLinkStart}låst%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
+msgstr ""
msgid "This %{noteableTypeText} is locked."
msgstr "Denne %{noteableTypeText} er låst."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr "Denne enheten har allerede blitt registrert hos oss."
@@ -37401,6 +38350,9 @@ msgstr "Dette miljøet blir distribuert"
msgid "This environment is being re-deployed"
msgstr "Dette miljøet blir redistribuert"
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Denne jobben er avbrutt"
@@ -37767,6 +38725,9 @@ msgstr "Dette abonnementet er for"
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Denne brukeren kan ikke låses opp manuelt fra GitLab"
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr "For å bekrefte, skriv %{phrase_code}"
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ 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 renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr "Veksle sidelinje"
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr "Veksle tråd"
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr "Kan ikke oppdatere filbanen fordi det er prosjekter innenfor denne grupp
msgid "TransferGroup|Database is not supported."
msgstr "Databasen er ikke støttet."
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr "Prøv igjen"
msgid "Try again?"
msgstr "Prøv igjen?"
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "Prøv ut alt som GitLab har å tilby i 30 dager."
@@ -39022,6 +39995,9 @@ msgstr "Klarte ikke å laste inn commiter. Prøv igjen senere."
msgid "Unable to load file contents. Try again later."
msgstr "Klarte ikke å laste inn filinnhold. Prøv igjen senere."
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr "Klarte ikke å laste inn diffen"
@@ -39058,6 +40034,9 @@ msgstr "Kan ikke oppdatere dette eposet på dette tidspunktet."
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr "Utilgjengelig"
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr "Klyngetypen ble ikke gjenkjent"
@@ -39364,9 +40346,6 @@ msgstr "Last opp CSV-fil"
msgid "Upload File"
msgstr "Last opp fil"
-msgid "Upload License"
-msgstr "Last opp lisens"
-
msgid "Upload New File"
msgstr "Last opp ny fil"
@@ -39385,9 +40364,6 @@ msgstr "Last opp fil"
msgid "Upload image"
msgstr "Last opp bilde"
-msgid "Upload license"
-msgstr "Last opp lisens"
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr "Last opp objektkart"
msgid "UploadLink|click to upload"
msgstr "klikk for å laste opp"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr "Laster opp endringer til terminalen"
@@ -39454,7 +40433,7 @@ msgstr "Bruk i nåværende periode"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr "Bruk .gitlab-ci.yml"
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr "Bruk cURL"
@@ -40507,9 +41492,6 @@ msgstr "Vis erstattet fil @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr "Vis innstilling"
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr "Vist"
msgid "Viewing commit"
msgstr "Viser commit"
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr "Endre status"
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr "Klasse"
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr "Skannerleverandør"
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr "Wiki-sidehendelser"
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr "Nettsted:"
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr "Hva leter du etter?"
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] "Når disse fletteforespørslene godtas"
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 "Når du bruker %{code_open}http: //%{code_close} eller %{code_open}https: //%{code_close} protokollene, vennligst oppgi den nøyaktige URL-en til kodelageret. HTTP-viderekoblinger blir ikke fulgt."
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr "NÃ¥r:"
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr "Avbryt"
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr "Format"
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr "Fortsett å redigere"
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr "Prøv igjen"
msgid "WikiPage|Save changes"
msgstr "Lagre endringer"
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr "Tittel"
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr "Prøv dette senere"
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr "Bruk den nye redigereren"
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr "Du kan alltid redigere dette senere"
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr "Du kan bare redigere filer når du er på en gren"
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "Du kan ikke få tilgang til denne råfilen. Vennligst vent et minutt."
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr "Du har ikke noen prosjekter tilgjengelig."
msgid "You don't have any recent searches"
msgstr "Du har ingen nylige søk"
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr "Du har ikke tilstrekkelig tillatelse til å utføre denne handlingen."
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr "YouTube-URL eller -ID"
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr "Abonnementet ditt har utløpt!"
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr "kan ikke selv bli blokkert"
msgid "cannot merge"
msgstr "kan ikke flette"
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr "Undersøk dette sikkerhetsproblemet ved å opprette en sak"
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "Administrer lisenser"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr "Ny"
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "Ingen endringer i kodekvalitet"
@@ -43198,45 +44218,6 @@ msgstr "lukket"
msgid "closed issue"
msgstr "lukket saksrapport"
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr "Den er grei"
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-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 "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 "Vis loggbøkene"
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr "forpliktet"
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "aktivert"
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "fletteforespørsel"
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr "Avbryt auto-innfletting"
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "Fletting mislyktes."
-msgid "mrWidget|Merge locally"
-msgstr "Flett lokalt"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr "Fletteforespørsel"
msgid "mrWidget|Resolve conflicts"
msgstr "Oppklar konflikter"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "Tilbakestill"
@@ -44102,9 +45097,6 @@ msgstr "min-kule-gruppe"
msgid "my-channel"
msgstr "min-kanal"
-msgid "n/a"
-msgstr "(ingen)"
-
msgid "need attention"
msgstr "trenger oppmerksomhet"
@@ -44165,6 +45157,9 @@ msgstr "Ã¥pen sak"
msgid "or"
msgstr "eller"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr "prosjektavatar"
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr "det riktige formatet."
-msgid "the file"
-msgstr "filen"
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index c19d04d2e2d..52214299ecd 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: nl\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} wordt verwijderd! Weet je het zeker?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr "Over auto deploy"
msgid "About this feature"
msgstr "Over deze functie"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Misbruik rapporten"
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Bladeren in map"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr "Commit"
msgid "CommitMessage|Add %{file_name}"
msgstr "%{file_name} toevoegen"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/or_IN/gitlab.po b/locale/or_IN/gitlab.po
index aa04db3d8d5..54dcfa7fa04 100644
--- a/locale/or_IN/gitlab.po
+++ b/locale/or_IN/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: or\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index 883bb20e85f..1d0c5b83e5f 100644
--- a/locale/pa_IN/gitlab.po
+++ b/locale/pa_IN/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: pa-IN\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index 57dbfdbce7f..ad0d4efa7db 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: pl\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:39\n"
+"PO-Revision-Date: 2022-04-01 09:14\n"
msgid " %{start} to %{end}"
msgstr " %{start} do %{end}"
@@ -28,15 +28,9 @@ msgstr " Zebrano %{time}"
msgid " Please sign in."
msgstr " ProszÄ™, zaloguj siÄ™."
-msgid " Target Path"
-msgstr " Ścieżka docelowa"
-
msgid " Try to %{action} this file again."
msgstr " Spróbuj %{action} ten plik ponownie."
-msgid " Type"
-msgstr " Typ"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Musisz to zrobić przed %{grace_period_deadline}."
@@ -447,6 +441,13 @@ msgstr[1] "%d dodatkowe komentarze"
msgstr[2] "%d dodatkowych komentarzy"
msgstr[3] "%d dodatkowego komentarza"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d otwarte zgłoszenie"
@@ -468,6 +469,13 @@ msgstr[1] "%d projekty osobiste zostaną usunięte i nie będzie można ich przy
msgstr[2] "%d projektów osobistych zostanie usuniętych i nie będzie można ich przywrócić."
msgstr[3] "%d projektu osobistego zostanie usunięte i nie będzie można go przywrócić."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d poprzednio zmergowany commit"
@@ -489,8 +497,8 @@ msgstr[1] "%d wybrane projekty"
msgstr[2] "%d wybranych projektów"
msgstr[3] "%d wybranego projektu"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -620,9 +628,6 @@ msgstr ""
msgid "%{address} is an invalid IP address range"
msgstr "%{address} nie jest prawidłowym zakresem adresów IP"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "%{anchorOpen}Dowiedz się więcej%{anchorClose}, jak możesz dostosować / wyłączyć rejestrację w swojej instancji."
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link} sklonował(a) %{original_issue} do %{new_issue}."
@@ -872,6 +877,9 @@ msgstr "%{integrations_link_start}Integracje:%{link_end} pozwalają Ci użyć ap
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} zostanie usunięty! Jesteś pewny?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "akcje %{issueType}"
@@ -950,7 +958,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -959,9 +967,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -1031,6 +1036,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, potwierdź teraz swój adres e-mail!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} dzień"
@@ -1170,10 +1178,20 @@ msgstr "%{spanStart}w%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} do %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1486,7 +1504,7 @@ msgstr "+%{more_reviewers_count} recenzentów"
msgid "+%{tags} more"
msgstr "+%{tags} więcej"
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1850,9 +1868,18 @@ msgstr "Nowe Wydanie %{tag} dla %{name} zostało opublikowane. Odwiedź %{releas
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "Nowe Wydanie %{tag} dla %{name} zostało opublikowane. Odwiedź Stronę wydań, by dowiedzieć się o nim więcej:"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "Niepoufny epik nie może być przypisany do poufnego epika nadrzędnego"
@@ -2045,6 +2072,9 @@ msgstr "O automatycznym wdrażaniu"
msgid "About this feature"
msgstr "O tej funkcjonalności"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Raporty o nadużyciach"
@@ -2075,9 +2105,6 @@ msgstr "Odmowa dostępu dla Twojego konta LDAP."
msgid "Access denied: %{error}"
msgstr "Odmowa dostępu: %{error}"
-msgid "Access expiration date"
-msgstr "Data wygaśnięcia dostępu"
-
msgid "Access expires"
msgstr "Dostęp wygasa"
@@ -2231,6 +2258,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr "Akcja"
@@ -2288,6 +2318,9 @@ msgstr "Dodaj klaster Kubernetes"
msgid "Add LICENSE"
msgstr "Dodaj LICENCJĘ"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2411,6 +2444,9 @@ msgstr "Dodaj teraz komentarz"
msgid "Add comment to design"
msgstr "Dodaj komentarz do projektu"
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr "Dodaj wiadomości commitu jako komentarze do zadań Asana. %{docs_link}"
@@ -2639,6 +2675,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2720,6 +2759,9 @@ msgstr "Gość"
msgid "AdminArea|Included Free in license"
msgstr "Zawarte bezpłatnie w licencji"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "Najnowsze grupy"
@@ -2732,6 +2774,9 @@ msgstr "Najnowsi użytkownicy"
msgid "AdminArea|Maintainer"
msgstr "Opiekun"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2744,6 +2789,9 @@ msgstr "Nowy projekt"
msgid "AdminArea|New user"
msgstr "Nowy użytkownik"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2828,12 +2876,18 @@ msgstr "Usunąć projekt %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Automatyczna domena DevOps"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2873,6 +2927,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr "Maksymalny czas trwania sesji dla operacji Git, gdy włączone jest uwierzytelnianie dwuskładnikowe"
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2888,6 +2963,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2903,6 +2981,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2912,9 +2996,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2924,6 +3005,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "Aktywni użytkownicy"
@@ -3830,7 +3914,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Pozwól na używanie tylko wybranych protokołów w dostępie do Gita."
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3944,6 +4028,9 @@ msgstr "Uwierzytelnianie Amazon nie jest %{link_start}poprawnie skonfigurowane%{
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr "Konto użytkownika Enterprise GitLab zostało utworzone dla Ciebie przez Twoją organizację:"
@@ -3998,6 +4085,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr "Wystąpił błąd podczas aktualizacji tytułu"
@@ -4241,6 +4331,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr "Wystąpił błąd podczas przetwarzania pliku."
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4356,6 +4449,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4446,6 +4542,9 @@ msgstr ""
msgid "Any namespace"
msgstr "Dowolna przestrzeń nazw"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "ID aplikacji"
@@ -4945,6 +5044,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5189,12 +5291,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5287,6 +5383,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5317,6 +5416,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5338,6 +5440,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5698,9 +5848,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5722,6 +5869,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5812,6 +5962,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6038,6 +6194,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -6053,6 +6212,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6062,24 +6224,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6144,6 +6321,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6250,6 +6430,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6409,9 +6592,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6451,6 +6631,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6493,12 +6676,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6511,9 +6700,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6526,6 +6721,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7106,6 +7304,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -7136,6 +7337,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7303,6 +7510,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7417,6 +7627,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7660,24 +7873,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr "Utwórz symbole wieloznaczne"
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr "Szukaj środowisk"
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7735,6 +7936,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7894,6 +8104,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7918,7 +8131,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7933,6 +8146,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7972,22 +8188,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7996,10 +8215,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8011,6 +8248,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8026,10 +8266,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8041,10 +8284,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8059,9 +8299,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8095,13 +8332,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8122,10 +8353,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8137,13 +8365,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
-msgstr ""
-
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8159,9 +8384,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8183,6 +8405,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8225,9 +8450,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Dodaj integracjÄ™ klastra Kubernetes"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "Dodanie klastra Kubernetes do Twojej grupy spowoduje automatyczne udostępnienie klastra we wszystkich Twoich projektach. Korzystaj z aplikacji oceniających, wdrażaj aplikacje i łatwo uruchamiaj procesy dla wszystkich projektów korzystając z tego samego klastra."
@@ -8336,10 +8558,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8387,16 +8606,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8432,6 +8642,9 @@ msgstr "Włącz lub wyłącz połączenie GitLab z klastrem Kubernetes."
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Włącz to ustawienie, jeśli używasz kontroli dostępu opartej na roli (RBAC)."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8441,6 +8654,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8504,9 +8720,6 @@ msgstr "Klaster grupowy"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
-msgstr "Jeśli konfigurujesz wiele klastrów i używasz Auto DevOps, %{help_link_start}zapoznaj się najpierw z tym%{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -8552,7 +8765,7 @@ msgstr "Dowiedz się więcej o %{help_link_start_machine_type}rodzajach maszyn%{
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8645,9 +8858,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8897,12 +9107,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8915,7 +9131,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9159,9 +9375,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9288,6 +9501,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9321,9 +9537,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9348,6 +9561,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9357,7 +9573,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9369,12 +9585,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9483,6 +9711,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9528,6 +9759,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9537,6 +9771,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9606,6 +9843,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9731,9 +9974,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9791,7 +10031,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9888,6 +10128,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9927,6 +10170,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10236,6 +10482,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10272,6 +10521,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10287,9 +10542,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10407,7 +10659,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10446,9 +10698,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10560,9 +10818,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10587,6 +10842,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10617,9 +10875,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10872,43 +11127,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10923,10 +11160,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11037,19 +11274,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11178,15 +11412,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11243,12 +11495,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11264,10 +11522,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11414,6 +11672,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11468,9 +11729,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11718,6 +11976,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11847,9 +12108,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11868,9 +12126,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12525,6 +12780,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12589,6 +12871,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13248,6 +13533,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13305,6 +13593,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13395,6 +13686,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13440,6 +13734,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13542,9 +13875,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13869,6 +14199,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14146,7 +14479,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14278,6 +14611,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14293,9 +14629,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14377,7 +14710,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14749,6 +15085,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14758,6 +15100,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14999,6 +15344,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15011,6 +15359,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -15131,6 +15482,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15260,9 +15614,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15375,6 +15735,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15799,7 +16162,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15940,9 +16303,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16207,9 +16567,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16237,6 +16594,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16300,9 +16660,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16852,9 +17209,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16867,6 +17221,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16918,9 +17275,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17146,15 +17500,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17194,6 +17557,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17320,9 +17686,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17332,6 +17695,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17536,9 +17935,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17941,13 +18337,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18070,6 +18466,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18088,9 +18487,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18211,6 +18607,113 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18383,6 +18886,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18534,9 +19040,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18612,9 +19115,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18744,6 +19244,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18818,7 +19324,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18848,12 +19354,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18863,9 +19363,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19206,9 +19703,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19287,15 +19781,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19587,6 +20072,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19596,6 +20084,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19653,6 +20150,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19668,6 +20171,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19749,6 +20255,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19770,6 +20279,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19779,6 +20291,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19887,6 +20402,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20089,6 +20610,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20203,6 +20727,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20215,12 +20742,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20368,9 +20901,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20386,12 +20916,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20485,6 +21009,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20503,6 +21030,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20515,6 +21048,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20707,9 +21243,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20752,7 +21285,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20923,10 +21456,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20941,12 +21477,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20956,6 +21486,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20977,7 +21510,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20995,6 +21534,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21004,10 +21546,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21019,6 +21567,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21031,6 +21582,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21286,9 +21840,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21301,6 +21852,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21364,6 +21918,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21373,6 +21930,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21400,15 +21963,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21424,9 +21996,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21436,6 +22026,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21460,6 +22053,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21821,6 +22417,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21929,6 +22528,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22070,6 +22675,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22082,6 +22690,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22100,6 +22711,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22127,9 +22741,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22172,6 +22783,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22181,6 +22799,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22196,6 +22820,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22385,9 +23015,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22661,6 +23288,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22694,6 +23324,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22856,6 +23489,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22976,9 +23612,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23000,6 +23633,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23239,9 +23878,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23278,7 +23914,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23353,7 +23989,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23909,9 +24545,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -24033,6 +24666,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24051,6 +24687,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24069,12 +24708,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24192,6 +24840,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24288,16 +24939,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24406,6 +25057,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24481,6 +25159,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24667,9 +25348,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24764,6 +25442,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24839,6 +25520,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24854,9 +25538,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24905,6 +25586,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24953,6 +25637,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24980,12 +25667,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25064,9 +25745,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25088,7 +25766,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25121,9 +25799,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25205,6 +25880,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25362,6 +26040,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25810,10 +26491,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25961,6 +26642,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25979,9 +26663,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26012,10 +26693,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26030,9 +26711,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26060,6 +26738,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26201,6 +26882,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26970,6 +27654,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27246,6 +27933,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27255,10 +27945,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27306,7 +27999,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27315,13 +28008,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27330,7 +28023,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27348,6 +28041,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27360,9 +28056,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27417,24 +28119,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27492,9 +28188,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27510,9 +28203,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27846,9 +28536,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27903,7 +28590,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27948,7 +28635,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28056,6 +28743,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28365,6 +29055,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28386,9 +29079,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28425,6 +29115,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28530,6 +29223,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28611,9 +29307,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29118,7 +29811,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29217,6 +29910,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29388,6 +30084,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29451,6 +30150,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29469,9 +30171,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29616,6 +30315,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30225,7 +30930,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30658,9 +31366,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30670,9 +31384,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30905,6 +31616,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31115,7 +31829,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31207,12 +31924,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31225,6 +31948,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31240,9 +31969,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "Wyniki podsumowania testu sÄ… analizowane"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31759,7 +32494,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31823,9 +32558,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "Harmonogram"
@@ -31877,10 +32609,10 @@ msgstr "Uruchom nieoznaczone zadania"
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31901,6 +32633,26 @@ msgstr "Liczba Robotników online: %{active_runners_count}"
msgid "Runners page."
msgstr "Strona robotników."
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31910,7 +32662,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31937,9 +32689,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31952,12 +32716,22 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31967,6 +32741,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31976,18 +32753,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32009,25 +32780,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32036,15 +32813,31 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32078,9 +32871,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32093,21 +32892,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32117,7 +32946,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32138,6 +32967,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32147,16 +32979,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32174,7 +33009,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32192,7 +33027,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32201,9 +33036,6 @@ 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 ""
@@ -32237,9 +33069,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32354,10 +33183,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32549,6 +33378,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32695,6 +33527,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32719,6 +33554,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32845,16 +33689,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32911,6 +33758,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32926,6 +33779,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32941,12 +33800,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32956,6 +33824,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32968,9 +33839,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33019,6 +33902,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33037,12 +33923,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33061,6 +33956,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33070,10 +33968,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33097,6 +33998,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33181,6 +34091,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33322,6 +34235,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33346,7 +34262,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33358,16 +34274,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33427,6 +34346,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33439,15 +34361,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33484,15 +34409,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33631,6 +34553,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33967,6 +34892,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34012,6 +34940,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -34057,9 +34988,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34316,6 +35244,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34485,6 +35416,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34656,6 +35590,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34665,6 +35602,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34704,9 +35644,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34839,9 +35776,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35265,6 +36199,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35409,6 +36346,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35481,9 +36421,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35532,6 +36469,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35697,10 +36637,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36081,8 +37021,12 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36225,12 +37169,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36387,6 +37325,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36420,9 +37364,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36847,9 +37788,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36880,6 +37818,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36892,6 +37833,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "Zakreślacz znaków pomaga ci utrzymać linię tematyczną do %{titleLength} znaków i zawinąć body do %{bodyLength}, aby można je było odczytać w git."
@@ -36913,12 +37857,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "Połączenie upłynie po %{timeout}. W przypadku repozytoriów, którym zajmuje to dłużej, użyj kombinacji klonuj/pchnij."
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37214,6 +38164,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37223,6 +38176,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37244,6 +38203,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37256,6 +38218,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37541,9 +38506,6 @@ 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 ""
@@ -37685,6 +38647,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37697,7 +38662,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37724,7 +38689,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37733,7 +38698,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37820,6 +38785,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37847,6 +38818,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37973,9 +38947,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38213,6 +39193,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38689,6 +39672,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38770,6 +39756,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38788,7 +39777,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38938,9 +39927,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38986,6 +39972,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39079,6 +40068,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39268,6 +40260,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39472,6 +40467,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39508,6 +40506,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39634,6 +40635,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39814,9 +40818,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39835,9 +40836,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39847,6 +40845,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39904,7 +40905,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40141,6 +41142,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40150,6 +41154,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40963,9 +41970,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40990,6 +41994,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41095,9 +42102,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41119,6 +42123,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41239,6 +42246,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41335,9 +42345,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41383,6 +42390,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41404,6 +42414,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41704,6 +42717,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41749,9 +42765,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41794,13 +42807,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41819,6 +42832,9 @@ msgstr[3] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41966,9 +42982,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41993,12 +43006,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42011,18 +43018,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42035,18 +43030,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42122,6 +43108,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42131,6 +43120,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42341,6 +43333,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42434,6 +43432,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42464,6 +43465,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42548,6 +43552,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42630,10 +43637,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42813,6 +43820,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42825,6 +43835,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43116,7 +44129,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43381,6 +44394,13 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43478,6 +44498,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43556,6 +44585,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43584,9 +44622,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43672,45 +44716,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43729,7 +44734,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43839,6 +44844,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44181,6 +45189,13 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44278,6 +45293,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44397,9 +45418,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44472,6 +45490,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44592,9 +45613,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44655,6 +45673,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44752,9 +45773,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44957,9 +45975,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index 6afec29258f..549569e15bd 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: pt-BR\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:11\n"
msgid " %{start} to %{end}"
msgstr " %{start} até %{end}"
@@ -28,15 +28,9 @@ msgstr " Coletada %{time}"
msgid " Please sign in."
msgstr " Por favor, entre usando sua conta."
-msgid " Target Path"
-msgstr " Caminho de Destino"
-
msgid " Try to %{action} this file again."
msgstr " Tentar %{action} este arquivo novamente."
-msgid " Type"
-msgstr " Tipo"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Você precisa fazer isso antes de %{grace_period_deadline}."
@@ -123,8 +117,8 @@ msgstr[1] "%d aprovadores adicionais"
msgid "%d additional assignee"
msgid_plural "%d additional assignees"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d aprovador adicional"
+msgstr[1] "%d aprovadores adicionais"
msgid "%d additional commenter"
msgid_plural "%d additional commenters"
@@ -133,8 +127,8 @@ msgstr[1] "%d comentaristas adicionais"
msgid "%d additional committer"
msgid_plural "%d additional committers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d comentarista adicional"
+msgstr[1] "%d comentaristas adicionais"
msgid "%d approver"
msgid_plural "%d approvers"
@@ -148,8 +142,8 @@ msgstr[1] "%d aprovadores (você aprovou)"
msgid "%d assigned issue"
msgid_plural "%d assigned issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d tarefa não atribuído"
+msgstr[1] "%d tarefas não atribuídas"
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -183,8 +177,8 @@ msgstr[1] "%d comentários neste commit"
msgid "%d commenter"
msgid_plural "%d commenters"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d comentarista"
+msgstr[1] "%d comentaristas"
msgid "%d commit"
msgid_plural "%d commits"
@@ -318,8 +312,8 @@ msgstr[1] "%d solicitações de mesclagem que você não tem acesso."
msgid "%d merge requests"
msgid_plural "%d merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d solicitações de mesclagem"
+msgstr[1] "%d solicitações de mesclagem"
msgid "%d metric"
msgid_plural "%d metrics"
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "mais %d comentário"
msgstr[1] "mais %d comentários"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d issue aberta"
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "%d projeto pessoal será removido e não poderá ser restaurado."
msgstr[1] "%d projetos pessoais serão removidos e não poderão ser restaurados."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] "%d ponto"
+msgstr[1] "%d pontos"
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d commit mesclado anteriormente"
@@ -371,10 +375,10 @@ msgid_plural "%d projects selected"
msgstr[0] "%d projeto selecionado"
msgstr[1] "%d projetos selecionados"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d requisição com avisos"
-msgstr[1] "%d requisições com avisos"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -428,13 +432,13 @@ msgstr[1] "%d vulnerabilidades dispensadas"
msgid "%d vulnerability set to confirmed"
msgid_plural "%d vulnerabilities set to confirmed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnerabilidade definida como confirmada"
+msgstr[1] "%d vulnerabilidades definidas como confirmadas"
msgid "%d vulnerability set to dismissed"
msgid_plural "%d vulnerabilities set to dismissed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnerabilidade definida como confirmada"
+msgstr[1] "%d vulnerabilidades definidas como confirmadas"
msgid "%d vulnerability set to needs triage"
msgid_plural "%d vulnerabilities set to needs triage"
@@ -443,8 +447,8 @@ msgstr[1] ""
msgid "%d vulnerability set to resolved"
msgid_plural "%d vulnerabilities set to resolved"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnerabilidade definida como resolvida"
+msgstr[1] "%d vulnerabilidades definidas para resolver"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
@@ -468,9 +472,6 @@ msgstr ""
msgid "%{address} is an invalid IP address range"
msgstr "%{address} é uma faixa de IP inválida"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "%{anchorOpen}Saiba mais%{anchorClose} sobre como você pode personalizar / desabilitar o registro em sua instância."
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link} clonou %{original_issue} para %{new_issue}."
@@ -531,10 +532,10 @@ msgid "%{completedWeight} of %{totalWeight} weight completed"
msgstr "%{completedWeight} de %{totalWeight} peso concluído"
msgid "%{completed} of %{total} issues closed"
-msgstr ""
+msgstr "%{completed} de %{total} issues fechadas"
msgid "%{completed} of %{total} weight completed"
-msgstr ""
+msgstr "%{completed} de %{total} peso concluído"
msgid "%{cores} cores"
msgstr "%{cores} núcleos"
@@ -622,7 +623,7 @@ 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 ""
+msgstr "%{docs_link_start}Aprenda sobre os níveis de visibilidade.%{docs_link_end}"
msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
msgstr "%{docs_link_start}O que é armazenamento de arquivos grandes?%{docs_link_end}"
@@ -702,6 +703,9 @@ msgstr "%{integrations_link_start}Integrações%{link_end} permitem que aplicati
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} será removido! Você tem certeza?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "%{issueType} ações"
@@ -780,8 +784,8 @@ msgstr "%{level_name} não é permitido, pois o projeto de origem do fork possui
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr "%{linkStart}Saiba mais.%{linkEnd}"
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "%{link_start}Saiba mais%{link_end} sobre cargos."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -789,11 +793,8 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "%{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}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
+msgstr "%{link_start}Quais informações o GitLab Inc. coleta?%{link_end}"
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}, e %{awardsListLength} mais"
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, confirme o seu endereço de e-mail agora!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} dia"
@@ -885,7 +889,7 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr "%{openedIssues} aberta, %{closedIssues} fechada"
msgid "%{percentage}%% issues closed"
-msgstr ""
+msgstr "%{percentage} de issues fechadas"
msgid "%{percentage}%% weight completed"
msgstr "%{percentage}%% peso concluído"
@@ -992,10 +996,18 @@ msgstr "%{spanStart}em%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} até %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,8 +1300,8 @@ msgstr "+%{more_reviewers_count} mais revisores"
msgid "+%{tags} more"
msgstr "+%{tags} mais"
-msgid ", and "
-msgstr ", e "
+msgid ", "
+msgstr ""
msgid ", or "
msgstr ", ou "
@@ -1317,7 +1329,7 @@ msgstr[0] "- Usuário"
msgstr[1] "- Usuários"
msgid "- of - issues closed"
-msgstr ""
+msgstr "- de - issues fechadas"
msgid "- of - weight completed"
msgstr "- de - peso concluído"
@@ -1462,7 +1474,7 @@ msgid "1000+"
msgstr "1000+"
msgid "192.168.0.0/24 or 2001:0DB8:1234::/48"
-msgstr ""
+msgstr "192.168.0.0/24 ou 2001:0DB8:1234::/48"
msgid "1st contribution!"
msgstr "1ª contribuição!"
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "Um novo token de representação foi criado."
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1777,10 +1798,10 @@ msgid "AWS Secret Access Key"
msgstr "Chave de acesso secreta da AWS"
msgid "AWS access key ID (Optional)"
-msgstr ""
+msgstr "ID da chave de acesso da AWS (opcional)"
msgid "AWS secret access key (Optional)"
-msgstr ""
+msgstr "Chave de acesso secreta da AWS (opcional)"
msgid "AWS service error: %{error}"
msgstr "Erro de serviço de AWS: %{error}"
@@ -1797,6 +1818,9 @@ msgstr "Sobre a implantação automática"
msgid "About this feature"
msgstr "Sobre essa funcionalidade"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Relatórios de abuso"
@@ -1827,9 +1851,6 @@ msgstr "Acesso negado para sua conta LDAP."
msgid "Access denied: %{error}"
msgstr "Acesso negado: %{error}"
-msgid "Access expiration date"
-msgstr "Data de expiração do acesso"
-
msgid "Access expires"
msgstr "Expiração de acesso"
@@ -1983,6 +2004,9 @@ msgstr "cancelar inscrição"
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr "Ação"
@@ -2014,7 +2038,7 @@ msgid "Activity"
msgstr "Atividade"
msgid "Activity|An error occurred while retrieving activity. Reload the page to try again."
-msgstr ""
+msgstr "Ocorreu um erro ao recuperar a atividade. Recarregue a página para tentar novamente."
msgid "Add"
msgstr "Adicionar"
@@ -2040,6 +2064,9 @@ msgstr "Adicionar cluster Kubernetes"
msgid "Add LICENSE"
msgstr "Adicionar LICENSE"
+msgid "Add License"
+msgstr "Adicionar licença"
+
msgid "Add New Site"
msgstr "Adicionar um novo site"
@@ -2053,7 +2080,7 @@ msgid "Add a %{type}"
msgstr "Adicionar um %{type}"
msgid "Add a GCP region"
-msgstr ""
+msgstr "Adicionar região de GCP"
msgid "Add a GPG key"
msgstr "Adicionar chave GPG"
@@ -2107,7 +2134,7 @@ msgid "Add a numbered list"
msgstr "Adicionar uma lista numerada"
msgid "Add a related epic"
-msgstr ""
+msgstr "Adicionar um épico relacionado"
msgid "Add a related issue"
msgstr "Adicionar um issue relacionada"
@@ -2163,6 +2190,9 @@ msgstr "Adicionar comentário agora"
msgid "Add comment to design"
msgstr "Adicionar comentário ao design"
+msgid "Add comment..."
+msgstr "Adicionar comentário..."
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr "Adicione mensagens de commit como comentários às tarefas Asana. %{docs_link}"
@@ -2191,7 +2221,7 @@ msgid "Add environment"
msgstr "Adicionar ambiente"
msgid "Add existing confidential %{issuableType}"
-msgstr ""
+msgstr "Adicionar %{issuableType} confidencial existente"
msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
msgstr "Adicione cabeçalho e rodapé aos emails. Por favor, note que as configurações de cor só serão aplicadas dentro da interface do aplicativo"
@@ -2391,6 +2421,9 @@ msgstr "Adicionado uma issue a um épico."
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr "Ajuste a frequência com que a interface do usuário do GitLab para atualizações."
@@ -2472,6 +2505,9 @@ msgstr "Convidado"
msgid "AdminArea|Included Free in license"
msgstr "Incluído gratuitamente na licença"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "Grupos recentes"
@@ -2484,6 +2520,9 @@ msgstr "Usuários recentes"
msgid "AdminArea|Maintainer"
msgstr "Mantenedor"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr "Acesso mínimo"
@@ -2496,6 +2535,9 @@ msgstr "Novo projeto"
msgid "AdminArea|New user"
msgstr "Novo usuário"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "Proprietário"
@@ -2554,10 +2596,10 @@ msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Erro ao carregar as estatísticas. Por favor, tente novamente"
msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
+msgstr "A URL do site primário é usada internalmente por sites secundários."
msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
+msgstr "A URL do site secundário é usada internalmente pelo site primário."
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr "Excluir o projeto %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr "Uma conta do Let's Encrypt será configurada parra essa instância do GitLab usando esse endereço de e-mail. Você receberá e-mails para avisar sobre a expiração do certificado. %{link_start}Saiba mais.%{link_end}"
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr "Afeta todos os grupos novos e existentes."
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr "Todos os novos projetos podem usar os executores compartilhados da instância por padrão."
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domínio de Auto DevOps"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Configurar Let's Encrypt"
@@ -2625,6 +2673,27 @@ msgstr "E-mail de Let's Encrypt"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr "Duração máxima de uma sessão para operações Git quando o 2FA está ativado."
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr "Novas variáveis CI/CD em projetos e grupos padrão para protegidos."
@@ -2640,6 +2709,9 @@ msgstr "Exigir que os usuários comprovem a propriedade de domínios personaliza
msgid "AdminSettings|Required pipeline configuration"
msgstr "Configuração de pipeline necessária"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr "Selecione um modelo CI/CD"
@@ -2655,6 +2727,12 @@ msgstr "Duração da sessão para operações do Git quando 2FA está ativado (m
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr "Defina o nome inicial e as proteções para a ramificação padrão dos novos repositórios criados na instância."
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ 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 ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "Usuários ativos"
@@ -3148,7 +3226,7 @@ msgid "Akismet helps prevent the creation of spam issues in public projects."
msgstr ""
msgid "Alert"
-msgstr ""
+msgstr "Alerta"
msgid "AlertManagement|Acknowledged"
msgstr "Reconhecido"
@@ -3301,10 +3379,10 @@ msgid "AlertMappingBuilder|GitLab alert key"
msgstr "Chave de alerta do GitLab"
msgid "AlertMappingBuilder|Make selection"
-msgstr ""
+msgstr "Selecione a chave"
msgid "AlertMappingBuilder|Payload alert key"
-msgstr ""
+msgstr "Chave de alerta da carga"
msgid "AlertMappingBuilder|Select key"
msgstr "Selecione a chave"
@@ -3373,7 +3451,7 @@ msgid "AlertSettings|Name integration"
msgstr "Integração de nome"
msgid "AlertSettings|Parse payload fields"
-msgstr ""
+msgstr "Analisar campos de carga"
msgid "AlertSettings|Proceed with editing"
msgstr "Prosseguir com a edição"
@@ -3391,7 +3469,7 @@ msgid "AlertSettings|Reset the mapping"
msgstr "Redefinir o mapeamento"
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
-msgstr ""
+msgstr "Um exemplo de carga foi análisado. Agora você pode mapear os campos."
msgid "AlertSettings|Save & create test alert"
msgstr "Salvar e criar alerta de teste"
@@ -3439,7 +3517,7 @@ msgid "AlertSettings|Webhook URL"
msgstr "URL de webhook"
msgid "AlertSettings|You can map default GitLab alert fields to your payload keys in the dropdowns below."
-msgstr ""
+msgstr "Você pode mapear os campos de alerta padrão do GitLab para suas chaves de carga útil nos menus suspensos abaixo."
msgid "AlertSettings|You can now set up alert endpoints for manually configured Prometheus instances in the Alerts section on the Operations settings page. Alert endpoint fields on this page have been deprecated."
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr "Permitir que não administradores acessem a barra de desempenho"
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Permitir que apenas os protocolos selecionados sejam usados para acesso ao Git."
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "Erro ao pré-visualizar o blob"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr "Ocorreu um erro ao atualizar o título"
@@ -3993,6 +4077,9 @@ msgstr "Ocorreu um erro ao analisar as pesquisas recentes"
msgid "An error occurred while parsing the file."
msgstr "Ocorreu um erro ao analisar o arquivo."
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "Ocorreu um erro ao remover épicos."
@@ -4106,6 +4193,9 @@ msgstr "Uma issue já existe"
msgid "An unauthenticated user"
msgstr "Um usuário não autenticado"
+msgid "An unexpected error occurred"
+msgstr "Ocorreu um erro inesperado"
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "Um erro inesperado ocorreu enquanto verificava o ambiente de projeto."
@@ -4196,6 +4286,9 @@ msgstr "Qualquer marco"
msgid "Any namespace"
msgstr "Qualquer espaço de nome"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "App ID"
@@ -4245,7 +4338,7 @@ msgid "ApplicationSettings|After sign up text"
msgstr ""
msgid "ApplicationSettings|Allowed domains for sign-ups"
-msgstr ""
+msgstr "Domínios permitidos para inscrições"
msgid "ApplicationSettings|Approve %d user"
msgid_plural "ApplicationSettings|Approve %d users"
@@ -4259,7 +4352,7 @@ msgid "ApplicationSettings|Approve users in the pending approval status?"
msgstr ""
msgid "ApplicationSettings|Approve users who are pending approval?"
-msgstr ""
+msgstr "Aprovar usuários com status de aprovação pendente?"
msgid "ApplicationSettings|By making this change, you will automatically approve %d user who is pending approval."
msgid_plural "ApplicationSettings|By making this change, you will automatically approve %d users who are pending approval."
@@ -4267,16 +4360,16 @@ msgstr[0] ""
msgstr[1] ""
msgid "ApplicationSettings|By making this change, you will automatically approve all users who are pending approval."
-msgstr ""
+msgstr "Ao fazer essa alteração, você aprovará automaticamente todos os usuário com o status de aprovação pendente."
msgid "ApplicationSettings|Denied domains for sign-ups"
-msgstr ""
+msgstr "Domínios negados para inscrições"
msgid "ApplicationSettings|Denylist file"
msgstr ""
msgid "ApplicationSettings|Domain denylist"
-msgstr ""
+msgstr "Lista de restrição de domínio"
msgid "ApplicationSettings|Email restrictions"
msgstr "Restrições de e-mail"
@@ -4285,7 +4378,7 @@ msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr "Restrições de e-mail para cadastro"
msgid "ApplicationSettings|Enable domain denylist for sign ups"
-msgstr ""
+msgstr "Ativar lista de restrição de domínio para cadastro"
msgid "ApplicationSettings|Enable email restrictions for sign ups"
msgstr "Ativar restrições de e-mail para cadastro"
@@ -4333,7 +4426,7 @@ msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s
msgstr ""
msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
-msgstr ""
+msgstr "Os usuários com endereços de e-mail que correspondam a esses domínios NÃO poderão se inscrever. Caracteres curinga permitidos. Use linhas ou vírgulas separadas para várias entradas."
msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
msgstr ""
@@ -4676,11 +4769,14 @@ msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
msgstr ""
msgid "Are you absolutely sure?"
-msgstr ""
+msgstr "Você tem certeza absoluta?"
msgid "Are you sure that you want to archive this project?"
msgstr "Tem certeza que deseja arquivar este projeto?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "Tem certeza que deseja desarquivar este projeto?"
@@ -4712,7 +4808,7 @@ msgid "Are you sure you want to delete this SSH key?"
msgstr ""
msgid "Are you sure you want to delete this comment?"
-msgstr ""
+msgstr "Você realmente deseja excluir este comentário?"
msgid "Are you sure you want to delete this deploy key?"
msgstr ""
@@ -4721,7 +4817,7 @@ msgid "Are you sure you want to delete this device? This action cannot be undone
msgstr "Tem certeza de que deseja excluir este dispositivo? Esta ação não pode ser desfeita."
msgid "Are you sure you want to delete this label?"
-msgstr ""
+msgstr "Você tem certeza que deseja excluir essa etiqueta?"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Tem certeza que deseja excluir este agendamento de pipeline?"
@@ -4786,7 +4882,7 @@ msgid "Are you sure you want to remove this list?"
msgstr "Tem certeza que deseja remover esta lista?"
msgid "Are you sure you want to remove this nickname?"
-msgstr ""
+msgstr "Tem a certeza que deseja remover esse apelido?"
msgid "Are you sure you want to reset the health check token?"
msgstr "Você tem certeza que quer reiniciar o token de status de saúde?"
@@ -4804,7 +4900,7 @@ msgid "Are you sure you want to revoke this personal access token? This action c
msgstr "Tem certeza de que deseja revogar este token de acesso pessoal? Esta ação não pode ser desfeita."
msgid "Are you sure you want to revoke this project access token? This action cannot be undone."
-msgstr ""
+msgstr "Tem certeza de que deseja revogar este token de acesso ao projeto? Esta ação não pode ser desfeita."
msgid "Are you sure you want to stop this environment?"
msgstr "Você tem certeza de que deseja parar este ambiente?"
@@ -4923,12 +5019,6 @@ msgstr "Atribuir ao usuário que comentou"
msgid "Assign to me"
msgstr "Atribuir a mim"
-msgid "Assign yourself to these issues"
-msgstr "Atribuir-se a essas issues"
-
-msgid "Assign yourself to this issue"
-msgstr "Atribuir-se a essa issue"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "Atribuído a %{assignee_users_sentence}."
@@ -5015,7 +5105,10 @@ msgid "Attaching the file failed."
msgstr "Falha ao anexar o arquivo."
msgid "Attention"
-msgstr ""
+msgstr "Atenção"
+
+msgid "Attention requested"
+msgstr "Atenção solicitada"
msgid "Audit Events"
msgstr "Eventos de auditoria"
@@ -5047,6 +5140,9 @@ msgstr "Grupo de eventos"
msgid "AuditLogs|IP Address"
msgstr "Endereço IP"
+msgid "AuditLogs|Log"
+msgstr "Registro"
+
msgid "AuditLogs|Member Events"
msgstr "Eventos de membros"
@@ -5068,6 +5164,54 @@ msgstr "Este mês"
msgid "AuditLogs|User Events"
msgstr "Eventos do Usuário"
+msgid "AuditStreams|Active"
+msgstr "Ativo"
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr "Adicionar destino para stream externo"
+
+msgid "AuditStreams|Add stream"
+msgstr "Adicionar stream"
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr "Cancelar edição"
+
+msgid "AuditStreams|Delete %{link}"
+msgstr "Excluir %{link}"
+
+msgid "AuditStreams|Destination URL"
+msgstr "URL de destino"
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "Ago"
@@ -5180,10 +5324,10 @@ msgid "Authorized applications (%{size})"
msgstr "Aplicativos autorizados (%{size})"
msgid "AuthorizedApplication|Are you sure you want to revoke this application?"
-msgstr ""
+msgstr "Tem certeza de que deseja revogar este aplicativo?"
msgid "AuthorizedApplication|Revoke application"
-msgstr ""
+msgstr "Revogar aplicativo"
msgid "Authors: %{authors}"
msgstr "Autores: %{authors}"
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "Seus selos"
-msgid "Balsamiq file could not be loaded."
-msgstr "O arquivo Balsamiq não pôde ser carregado."
-
msgid "BambooService|Atlassian Bamboo"
msgstr "Atlassian Bamboo"
@@ -5452,6 +5593,9 @@ msgstr "Executa CI/CD pipelines com Atlassian Bamboo. Você deve configurar a ro
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr "Baseado em"
@@ -5542,6 +5686,12 @@ msgstr "Para gerenciar o plano para esse grupo, visite a seção de cobrança de
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr "Sua avaliação do GitLab.com %{plan} vai %{strong_open}expirar após %{expiration_date}%{strong_close}. Você pode manter o acesso aos recursos do %{plan} atualizando abaixo."
@@ -5766,6 +5916,9 @@ msgstr "Pesquisar projetos"
msgid "BoardNewIssue|Select a project"
msgstr "Selecione um projeto"
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "Ocorreu um erro ao obter os marcos, por favor, tente novamente."
@@ -5781,6 +5934,9 @@ msgstr "Qualquer marco"
msgid "BoardScope|Any assignee"
msgstr "Qualquer responsável"
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr "Qualquer etiqueta"
@@ -5790,24 +5946,39 @@ msgstr "Responsável"
msgid "BoardScope|Choose labels"
msgstr "Escolher etiqueta"
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr "Editar"
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr "Etiqueta"
msgid "BoardScope|Milestone"
msgstr "Marco"
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr "Nenhum marco"
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr "Buscar marco"
msgid "BoardScope|Select assignee"
msgstr "Selecionar responsável"
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr "Selecionar etiquetas"
@@ -5830,7 +6001,7 @@ msgid "Boards"
msgstr "Painéis"
msgid "Boards and board lists"
-msgstr ""
+msgstr "Painéis e listas de painéis"
msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5887,8 +6061,8 @@ msgstr ""
msgid "Boards|Blocked by %{blockedByCount} %{issuableType}"
msgid_plural "Boards|Blocked by %{blockedByCount} %{issuableType}s"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Bloqueado por %{blockedByCount} %{issuableType}"
+msgstr[1] "Bloqueado por %{blockedByCount} %{issuableType}s"
msgid "Boards|Collapse"
msgstr "Recolher"
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Branch já utilizada"
@@ -5999,7 +6176,7 @@ msgid "Branches|Cancel, keep branch"
msgstr "Cancelar, manter ramificação"
msgid "Branches|Can’t find HEAD commit for this branch"
-msgstr ""
+msgstr "Não foi possível encontrar o commit HEAD para essa ramificação"
msgid "Branches|Compare"
msgstr "Comparar"
@@ -6133,9 +6310,6 @@ msgstr "Transmissão de messagem foi atualizada com sucesso."
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Navegar no Diretório"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr "Novo grupo"
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr "Nenhum histórico disponível"
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr "Grupo de fonte"
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "Para um novo grupo"
@@ -6250,6 +6439,9 @@ msgstr "Você não tem grupos para importar"
msgid "BulkImport|Your imported groups will appear here."
msgstr "Seus grupos importados aparecerão aqui."
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6379,19 +6571,19 @@ msgid "CICDAnalytics|Shared Runners Usage"
msgstr "Uso de executores compartilhados"
msgid "CICDAnalytics|Shared runner pipeline minute duration by month"
-msgstr ""
+msgstr "Duração de minutos do pipeline do executor compartilhado por mês"
msgid "CICDAnalytics|Shared runner usage"
msgstr "Uso de executor compartilhado"
msgid "CICDAnalytics|Shared runner usage is the total runtime of all jobs that ran on shared runners"
-msgstr ""
+msgstr "Uso do executor compartilhado é o tempo de execução total de todas as tarefas executadas em executores compartilhados"
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
msgid "CICDAnalytics|What is shared runner usage?"
-msgstr ""
+msgstr "Uso de executor compartilhado?"
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 "Adicione um %{base_domain_link_start}domínio base%{link_end} para o seu %{kubernetes_cluster_link_start}cluster Kubernetes%{link_end} para que a sua estratégia de deploy funcione."
@@ -6523,10 +6715,10 @@ msgid "Can create groups:"
msgstr "Pode criar grupos:"
msgid "Can not delete primary training"
-msgstr ""
+msgstr "Não é possível excluir a chave primária"
msgid "Can't apply as the source branch was deleted."
-msgstr ""
+msgstr "Não é possível aplicar porque a ramificação de origem foi excluída."
msgid "Can't apply as these lines were changed in a more recent version."
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr "Isso criará um novo commit para reverter as mudanças existentes."
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr "Suas mudanças serão confirmadas para %{branchName} porque a sua solicitação de mesclagem está aberta."
+msgid "Changed"
+msgstr "Alterado"
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr "Caracteres restantes"
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7007,7 +7208,7 @@ msgid "Checkout|(x%{quantity})"
msgstr "(x%{quantity})"
msgid "Checkout|An unknown error has occurred. Please try again by refreshing this page."
-msgstr ""
+msgstr "Ocorreu um erro desconhecido. Tente novamente atualizando esta página."
msgid "Checkout|Billing address"
msgstr "Endereço de cobrança"
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr "Minutos de CI"
+msgid "Checkout|Calculating your subscription..."
+msgstr "Calculando sua assinatura..."
+
msgid "Checkout|Checkout"
msgstr "Checkout"
@@ -7135,6 +7339,9 @@ msgstr "Subtotal"
msgid "Checkout|Tax"
msgstr "Impostos"
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr "Total"
@@ -7187,7 +7394,7 @@ msgid "Child"
msgstr "Filho"
msgid "Child epic"
-msgstr ""
+msgstr "Épico filho"
msgid "Child epic does not exist."
msgstr "O épico filho não existe."
@@ -7378,24 +7585,12 @@ msgstr "Todos os ambientes"
msgid "CiVariable|Create wildcard"
msgstr "Criar curinga"
-msgid "CiVariable|Masked"
-msgstr "Mascarada"
-
msgid "CiVariable|New environment"
msgstr "Novo ambiente"
-msgid "CiVariable|Protected"
-msgstr "Protegido"
-
msgid "CiVariable|Search environments"
msgstr "Pesquisar ambientes"
-msgid "CiVariable|Toggle masked"
-msgstr "Alterna para mascarada"
-
-msgid "CiVariable|Toggle protected"
-msgstr "Alternar proteção"
-
msgid "Classification Label (optional)"
msgstr "Etiqueta de Classificação (opcional)"
@@ -7439,7 +7634,7 @@ msgid "Clear recent searches"
msgstr "Limpar pesquisas recentes"
msgid "Clear repository checks"
-msgstr ""
+msgstr "Limpar as verificações de repositório"
msgid "Clear search"
msgstr "Limpar pesquisa"
@@ -7453,6 +7648,15 @@ msgstr "Limpar data de início"
msgid "Clear templates search input"
msgstr "Limpar entrada de pesquisa de modelos"
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr "Limpar peso"
@@ -7463,7 +7667,7 @@ msgid "Cleared weight."
msgstr ""
msgid "Clears health status."
-msgstr ""
+msgstr "Limpar status de saúde."
msgid "Clears weight."
msgstr "Limpa o peso."
@@ -7499,7 +7703,7 @@ msgid "Clients"
msgstr "Clientes"
msgid "Clientside DSN"
-msgstr ""
+msgstr "DSN do lado do cliente"
msgid "Clone"
msgstr "Clonar"
@@ -7586,7 +7790,7 @@ msgid "Closes this %{quick_action_target}."
msgstr "Fecha este %{quick_action_target}."
msgid "Cloud Run"
-msgstr ""
+msgstr "Cloud Run"
msgid "Cloud Storage"
msgstr "Armazenamento em nuvem"
@@ -7610,13 +7814,16 @@ msgid "Cluster level"
msgstr "Nível de cluster"
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
+msgstr "É necessário especificar o tipo de cluster para Stages::ClusterEndpointInserter"
+
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
msgid "ClusterAgents|%{number} of %{total} agents"
-msgstr ""
+msgstr "%{number} de %{total} agentes"
msgid "ClusterAgents|%{number} of %{total} clusters connected through cluster certificates"
msgstr "%{number} de %{total} cluster conectado por meio de certificados de cluster"
@@ -7636,8 +7843,8 @@ msgstr "%{tokenName} revogado"
msgid "ClusterAgents|Access tokens"
msgstr "Tokens de acesso"
-msgid "ClusterAgents|Actions"
-msgstr "Ações"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
+msgstr "Adicione um arquivo agente de configuração a %{linkStart}este repositório%{linkEnd} e selecione-o, ou crie um novo para registrar no GitLab:"
msgid "ClusterAgents|Advanced installation methods"
msgstr "Métodos avançados de instalação"
@@ -7646,9 +7853,12 @@ msgid "ClusterAgents|Agent"
msgstr "Agente"
msgid "ClusterAgents|Agent %{strongStart}connected%{strongEnd}"
-msgstr ""
+msgstr "Agente %{strongStart}conectado%{strongEnd}"
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
+msgstr "Agente %{strongStart}conectado%{strongEnd}"
+
+msgid "ClusterAgents|Agent access token:"
msgstr ""
msgid "ClusterAgents|Agent might not be connected to GitLab"
@@ -7658,25 +7868,25 @@ msgid "ClusterAgents|Agent never connected to GitLab"
msgstr "Agente nunca conectado ao GitLab"
msgid "ClusterAgents|Agent version mismatch"
-msgstr ""
+msgstr "Incompatibilidade de versão do agente"
msgid "ClusterAgents|Agent version mismatch and update"
-msgstr ""
+msgstr "Incompatibilidade de versão do agente e atualização"
msgid "ClusterAgents|Agent version update required"
-msgstr ""
+msgstr "Atualização de versão do agente necessária"
msgid "ClusterAgents|All"
msgstr "Todos"
msgid "ClusterAgents|An error occurred while loading your Agents"
-msgstr ""
+msgstr "Ocorreu um erro ao carregar seu agente."
msgid "ClusterAgents|An error occurred while loading your agent"
msgstr "Ocorreu um erro ao carregar seu agente."
msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
-msgstr ""
+msgstr "Ocorreu um erro ao recuperar a atividade do GitLab Agent. Recarregue a página para tentar novamente."
msgid "ClusterAgents|An unknown error occurred. Please try again."
msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente."
@@ -7690,35 +7900,56 @@ msgstr "Certificado"
msgid "ClusterAgents|Configuration"
msgstr "Configuração"
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr "Conectar um cluster existente"
+msgid "ClusterAgents|Connect a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster (agent)"
+msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
-msgstr "Conectar com o certificado"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
+msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
+msgid "ClusterAgents|Connect existing cluster"
+msgstr "Conectar um cluster existente"
+
msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr "Conectar com o GitLab Agent"
-msgid "ClusterAgents|Connect your cluster through an agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr "Conectado"
msgid "ClusterAgents|Connection status"
msgstr "Status da conexão"
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr "Copiar token"
-msgid "ClusterAgents|Create a new cluster"
-msgstr "Criar um novo cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr "Criar um agente: %{searchTerm}"
+
+msgid "ClusterAgents|Create token"
+msgstr "Criar token"
msgid "ClusterAgents|Created by"
msgstr "Criado por"
@@ -7729,6 +7960,9 @@ msgstr "Criado por %{name} %{time}"
msgid "ClusterAgents|Date created"
msgstr "Data de criação"
+msgid "ClusterAgents|Default configuration"
+msgstr "Configurações padrão"
+
msgid "ClusterAgents|Delete"
msgstr "Excluir"
@@ -7744,10 +7978,13 @@ msgstr "Descrição"
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr "Falha ao criar um token"
+
msgid "ClusterAgents|Failed to register an agent"
msgstr "Falha ao registrar um agente"
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7757,19 +7994,16 @@ msgid "ClusterAgents|GitLab Agent for Kubernetes"
msgstr "GitLab Agent para Kubernetes"
msgid "ClusterAgents|Give feedback"
-msgstr ""
-
-msgid "ClusterAgents|Go to the repository files"
-msgstr "Ir para o repositório de arquivos"
+msgstr "Dar feedback"
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr "Como registrar um agente?"
msgid "ClusterAgents|How to update an agent?"
-msgstr ""
+msgstr "Como atualizar um agente?"
msgid "ClusterAgents|Install a new agent"
-msgstr ""
+msgstr "Instalar um novo agente"
msgid "ClusterAgents|Last connected %{timeAgo}."
msgstr "Última conexão %{timeAgo}."
@@ -7777,9 +8011,6 @@ msgstr "Última conexão %{timeAgo}."
msgid "ClusterAgents|Last contact"
msgstr "Última conexão"
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr "Aprenda a criar um token de acesso do agente"
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr "Saiba como solucionar problemas"
@@ -7796,7 +8027,7 @@ msgid "ClusterAgents|Never connected"
msgstr "Nunca conectado"
msgid "ClusterAgents|No agents"
-msgstr ""
+msgstr "Sem agentes"
msgid "ClusterAgents|No clusters connected through cluster certificates"
msgstr "Nenhum cluster conectado por meio de certificados de cluster"
@@ -7813,41 +8044,32 @@ msgstr "Método de instalação recomendado"
msgid "ClusterAgents|Register"
msgstr "Registrar"
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr "Registrando o agente"
-
-msgid "ClusterAgents|Registration token"
-msgstr "Token de registro"
+msgid "ClusterAgents|Registering agent"
+msgstr "Registrando agente"
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
-msgstr ""
+msgstr "Requer um mantenedor ou função superior para excluir agentes"
msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
-msgstr ""
+msgstr "Requer um mantenedor ou função superior para excluir agentes"
msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
-msgstr ""
+msgstr "Requer um mantenedor ou função superior para excluir agentes"
msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
-msgstr ""
+msgstr "Requer um mantenedor ou função superior para excluir agentes"
msgid "ClusterAgents|Security"
msgstr "Segurança"
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
-msgstr ""
-
-msgid "ClusterAgents|Select an agent"
-msgstr "Selecione um agente"
+msgstr "Consulte atualizações de atividade do agente, como tokens criados ou revogados e clusters conectados ou não conectados."
-msgid "ClusterAgents|Select an agent to register with GitLab"
-msgstr ""
+msgid "ClusterAgents|Select an agent or enter a name to create new"
+msgstr "Selecione um agente ou digite um nome para criar um novo"
msgid "ClusterAgents|Tell us what you think"
-msgstr ""
+msgstr "Diga-nos o que você pensa"
msgid "ClusterAgents|The GitLab Agent provides an increased level of security when connecting Kubernetes clusters to GitLab. %{linkStart}Learn more about the GitLab Agent.%{linkEnd}"
msgstr ""
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr "Este agente não tem tokens"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr "Token criado por %{userName}"
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr "A URL da API deve ser uma url http/https válida."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Adicionar cluster Kubernetes"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Adicionar uma integração com cluster Kubernetes"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "Adicionando um cluster kubernetes no seu grupo, irá compartilhar automaticamente o cluster entre todos os seus projetos. Utilize apps de revisão, faça deploy de suas aplicações e rode facilmente suas pipelines para todos os seus projetos usando o mesmo cluster."
@@ -7987,7 +8203,7 @@ msgid "ClusterIntegration|An error occurred while trying to fetch zone machine t
msgstr "Ocorreu um erro ao tentar realizar o fetch dos tipos de máquinas da zona: %{error}"
msgid "ClusterIntegration|An unknown error occurred while attempting to connect to Kubernetes."
-msgstr ""
+msgstr "Ocorreu um erro desconhecido ao tentar se conectar ao Kubernetes."
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
@@ -8052,11 +8268,8 @@ msgstr "O nome do cluster é obrigatório."
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
-msgstr "Conectar um cluster existente"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
+msgstr "Conectar um cluster Kubernetes"
msgid "ClusterIntegration|Connect with a certificate"
msgstr "Conecte-se com um certificado"
@@ -8103,17 +8316,8 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Criar cluster Kubernetes"
-msgid "ClusterIntegration|Create cluster on"
-msgstr "Criar cluster em"
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr "Criar um novo cluster"
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr "Criar um novo cluster no EKS"
-
-msgid "ClusterIntegration|Create new cluster on GKE"
-msgstr "Criar novo cluster no GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Criando cluster de Kubernetes"
@@ -8122,10 +8326,10 @@ msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster
msgstr ""
msgid "ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared."
-msgstr ""
+msgstr "Implante cada ambiente em seu próprio namespace. Caso contrário, os ambientes dentro de um projeto compartilham um namespace para todo o projeto. Note que qualquer pessoa que possa acionar a implantação de um namespace pode ler seus segredos. Se modificados, os ambientes existentes usarão seus namespaces atuais até que o cache do cluster seja limpo."
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 ""
+msgstr "Implante cada ambiente em seu próprio namespace. Caso contrário, os ambientes dentro de um projeto compartilharão um mesmo namespace para todo o projeto. Note que qualquer pessoa que possa acionar a implantação de um namespace poderá ler seus segredos. Se modificados, os ambientes existentes usarão seus namespaces atuais até que o cache do cluster seja limpo. %{linkStart}Mais informações%{linkEnd}"
msgid "ClusterIntegration|Did you know?"
msgstr "Você sabia?"
@@ -8148,6 +8352,9 @@ msgstr "Ative ou desative conexão do GitLab com seu cluster Kubernetes."
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Ative esta configuração se estiver usando o controle de acesso baseado em função (RBAC)."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr "Insira detalhes sobre seu cluster. %{linkStart}Como uso um certificado para conectar ao meu cluster?%{linkEnd}"
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr "Digite detalhes para seu cluster Amazon EKS Kubernetes"
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Digite detalhes para seu cluster Kubernetes"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr "Insira os detalhes do certificado do cluster Kubernetescluster"
+
msgid "ClusterIntegration|Environment scope"
msgstr "Escopo de ambiente"
@@ -8220,9 +8430,6 @@ msgstr "Cluster de grupo"
msgid "ClusterIntegration|HTTP Error"
msgstr "Erro de 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 "Se você está configurando múltiplos clusters e você está usando auto DevOps, %{help_link_start}leia isso primeiro%{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr "Se você não deseja excluir todos os recursos do GitLab associados, pode simplesmente remover a integração."
@@ -8268,8 +8475,8 @@ msgstr "Saiba mais sobre os %{help_link_start_machine_type}tipos de máquinas%{h
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "Saiba mais sobre as %{help_link_start}zonas%{help_link_end}."
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "Saiba mais sobre os Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr "Saiba mais sobre o Kubernetes."
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "Saiba mais sobre grupo de cluster Kubernetes"
@@ -8361,9 +8568,6 @@ msgstr "Número de nós"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr "O número de nós deve ser um valor numérico."
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr "Por favor, insira a informação de acesso para o seu cluster Kubernetes. Se precisar de ajuda, você pode ser a nossa %{linkStart}documentação%{linkEnd} em Kubernetes"
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Por favor, tenha certeza que sua conta no Google cumpre com os requisitos:"
@@ -8515,7 +8719,7 @@ msgid "ClusterIntegration|Select the key pair name that will be used to create E
msgstr ""
msgid "ClusterIntegration|Select the region you want to create the new cluster in. Make sure you have access to this region for your role to be able to authenticate. If no region is selected, we will use %{codeStart}DEFAULT_REGION%{codeEnd}. Learn more about %{linkStart}Regions%{linkEnd}."
-msgstr ""
+msgstr "Selecione a região em que você deseja criar um novo cluster. Certifique-se que você tem acesso a essa região para que a sua função possa ser autenticada. Se nenhuma região for selecionada, nós usaremos %{codeStart}DEFAULT_REGION%{codeEnd}. Saiba mais sobre %{linkStart}Regiões%{linkEnd}."
msgid "ClusterIntegration|Select zone"
msgstr "Selecione a zona"
@@ -8533,7 +8737,7 @@ msgid "ClusterIntegration|Service token is required."
msgstr "Token de serviço é necessário."
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 "Defina um prefixo para os seus namespaces. Se não for definido, o padrão é o caminho do projeto. Se modificados, ambientes existentes usarão seus namespaces atuais até que o cachê do cluster seja limpo."
msgid "ClusterIntegration|Something went wrong on our end."
msgstr "Alguma coisa deu errado do nosso lado."
@@ -8613,12 +8817,18 @@ msgstr "Impossível de conectar"
msgid "ClusterIntegration|Unknown Error"
msgstr "Erro desconhecido"
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr "Use o GitLab para implantar em seu cluster, executar tarefas, usar aplicativos de revisão e muito mais."
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr "Use o %{linkStart}GitLab Agent%{linkEnd} para conectar com segurança seus clusters deKubernetes ao GitLab. Você pode implantar seus aplicativos, executar seus pipelines, usar aplicativos de revisão e muito mais."
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "Usa os complementos Cloud Run, Istio, e Balanceamento de Carga HTTP para este cluster."
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr "Usando AutoDevOps com vários clusters? %{help_link_start}Leia isto primeiro.%{help_link_end}"
+
msgid "ClusterIntegration|VPC"
msgstr "VPC"
@@ -8631,8 +8841,8 @@ msgstr "Não foi possível verificar se um dos seus projetos no GCP possui o fat
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 "Com um cluster Kubernetes associado a esse projeto, você pode utilizar apps de revisão, publicar suas aplicações, executar suas pipelines e muito mais de um jeito simples."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr "Onde você deseja criar um cluster?"
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr "Você está prestes a remover a integração do cluster e todos os recursos criados pelo GitLab associados a este cluster."
@@ -8873,9 +9083,6 @@ msgstr "Commit"
msgid "CommitMessage|Add %{file_name}"
msgstr "Adicionar %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "Escrito"
@@ -9002,6 +9209,9 @@ msgstr "Ver solicitação de mesclagem aberta"
msgid "Complete"
msgstr "Completo"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr "Completo"
@@ -9035,9 +9245,6 @@ msgstr "Configuração do pipeline compliance (opcional)"
msgid "ComplianceFrameworks|Configuration not found"
msgstr "Configuração não encontrada"
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr "As estruturas de conformidade configuradas aparecem aqui."
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr "Excluir framework de conformidade %{framework}"
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr "Formato inválido"
@@ -9071,8 +9281,8 @@ msgstr "Nome"
msgid "ComplianceFrameworks|Name is required"
msgstr "O nome é necessário"
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
-msgstr "Nenhuma estrutura de conformidade configurada"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
+msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -9083,15 +9293,27 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
-msgid "ComplianceReport|Approved by author"
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
msgstr ""
+msgid "ComplianceReport|Approved by author"
+msgstr "Aprovado pelo autor"
+
msgid "ComplianceReport|Approved by committer"
msgstr ""
@@ -9111,10 +9333,10 @@ msgid "Confidential"
msgstr "Confidencial"
msgid "Confidential issue"
-msgstr ""
+msgstr "Issue confidencial"
msgid "Confidential note"
-msgstr ""
+msgstr "nota confidencial"
msgid "Confidentiality"
msgstr "Confidencialidade"
@@ -9150,7 +9372,7 @@ msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if
msgstr ""
msgid "Configure GitLab"
-msgstr ""
+msgstr "Configurar GitLab"
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "Configure os executores do GitLab para começar a usar o terminal da web. %{helpStart}Saiba mais.%{helpEnd}"
@@ -9168,7 +9390,7 @@ msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template.
msgstr ""
msgid "Configure SAST IaC in `.gitlab-ci.yml`, creating this file if it does not already exist"
-msgstr ""
+msgstr "Configure o SAST no `.gitlab-ci.yml`, criando esse arquivo se ele ainda não existir"
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 ""
@@ -9192,22 +9414,25 @@ msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeSt
msgstr "Configure um arquivo %{codeStart}.gitlab-webide.yml%{codeEnd} no %{codeStart}.gitLab%{codeEnd} para começar a usar o Terminal Web. %{helpStart}Saiba mais.%{helpEnd}"
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
-msgstr ""
+msgstr "Configure permissões avançadas, armazenamento de arquivos grandes, autenticação de dois fatores e configurações de relacionamento com o cliente."
msgid "Configure existing installation"
msgstr "Configurar instalação existente"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
msgid "Configure region"
-msgstr ""
+msgstr "Configurar região"
msgid "Configure region for environment"
msgstr ""
msgid "Configure regions"
-msgstr ""
+msgstr "Configurar regiões"
msgid "Configure repository mirroring."
msgstr "Configurar espelhamento de repositório."
@@ -9242,6 +9467,9 @@ msgstr "Configurar via solicitação de mesclagem"
msgid "Configure which lists are shown for anyone who visits this board"
msgstr "Configure quais listas são mostradas para qualquer pessoa que visita este painel"
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr "Confirmar"
msgid "Confirm approval"
msgstr "Confirmar aprovação"
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr "Confirmar a nova senha"
@@ -9320,6 +9551,12 @@ msgstr "Parabéns, sua avaliação gratuita foi ativada."
msgid "Connect"
msgstr "Conectar"
+msgid "Connect a Kubernetes Cluster"
+msgstr "Conectar um cluster Kubernetes"
+
+msgid "Connect a cluster"
+msgstr "Conectar um cluster"
+
msgid "Connect all repositories"
msgstr "Conectar todos repositórios"
@@ -9441,9 +9678,6 @@ msgstr "A limpeza está em andamento"
msgid "ContainerRegistry|Cleanup pending"
msgstr "Limpeza pendente"
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr "A política de limpeza de tag está desativada"
@@ -9501,8 +9735,8 @@ msgstr "Erro de conexão do Docker"
msgid "ContainerRegistry|Enable expiration policy"
msgstr "Ativar política de expiração"
-msgid "ContainerRegistry|Expiration policy is disabled"
-msgstr "Política de expiração está desativada"
+msgid "ContainerRegistry|Expiration policy is disabled."
+msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "Política de expiração será executada em %{time}"
@@ -9596,6 +9830,9 @@ msgstr "Imagem raiz"
msgid "ContainerRegistry|Run cleanup:"
msgstr "Executar limpeza:"
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "Algumas tag não foram excluídas"
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr "Tags que correspondem a estas regras são %{strongStart}mantidas%{strongEnd}, mesmo que elas correspondam a regra de exclusão abaixo. A %{secondStrongStart}última%{secondStrongEnd} é sempre mantida."
@@ -9944,6 +10184,9 @@ msgstr "Gerenciamento de corpus"
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr "Tem certeza de que deseja excluir o corpus?"
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr "Ações"
@@ -9980,6 +10223,12 @@ msgstr "Último uso"
msgid "CorpusManagement|Latest Job:"
msgstr "Última tarefa:"
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr "Novo envio"
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr "Não foi possível adicionar administradores como membros"
@@ -10115,7 +10361,7 @@ msgstr "Não foi possível atualizar a página wiki"
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr "Criar novo domínio"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr "Crie uma conta do GitLab primeiro e em seguida conecte-a à sua conta %{label}."
+msgid "Create a Kubernetes cluster"
+msgstr "Criar um cluster Kubernetes"
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr "Criar um cluster"
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr "Criar novo"
msgid "Create new %{name} by email"
msgstr "Criar novo %{name} por e-mail"
-msgid "Create new CI/CD pipeline"
-msgstr "Criar novo pipeline CI/CD"
-
msgid "Create new Value Stream"
msgstr "Criar novo fluxo de valor"
@@ -10278,7 +10527,7 @@ msgid "Create new branch"
msgstr "Criar novo branch"
msgid "Create new confidential %{issuableType}"
-msgstr ""
+msgstr "Criar novo %{issuableType} confidencial"
msgid "Create new directory"
msgstr "Criar nova pasta"
@@ -10295,6 +10544,9 @@ msgstr "Criar nova etiqueta"
msgid "Create new project"
msgstr "Criar novo projeto"
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr "Criar ou importar seu primeiro projeto"
@@ -10325,9 +10577,6 @@ msgstr "Criar tópico"
msgid "Create user"
msgstr "Criar usuário"
-msgid "Create via merge request"
-msgstr "Criar via solicitação de mesclagem"
-
msgid "Create wildcard: %{searchTerm}"
msgstr "Criar curinga: %{searchTerm}"
@@ -10551,7 +10800,7 @@ msgid "Creation date"
msgstr "Data de criação"
msgid "Creator"
-msgstr ""
+msgstr "Criador"
msgid "Credentials"
msgstr "Credenciais"
@@ -10580,44 +10829,26 @@ msgstr "Cartão de crédito:"
msgid "Critical vulnerabilities present"
msgstr "Vulnerabilidades críticas presentes"
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr "Criar nova conta"
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Default rate"
msgstr ""
-msgid "Crm|Description (optional)"
-msgstr "Descrição (opcional)"
-
msgid "Crm|Edit contact"
msgstr "Editar contato"
-msgid "Crm|Email"
-msgstr "E-mail"
-
-msgid "Crm|First name"
-msgstr "Primeiro nome"
-
-msgid "Crm|Last name"
-msgstr "Sobrenome"
-
-msgid "Crm|New Organization"
-msgstr "Nova organização"
+msgid "Crm|Edit organization"
+msgstr ""
msgid "Crm|New contact"
msgstr "Novo contato"
@@ -10631,11 +10862,11 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr "Nenhuma organização encontrada"
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
-msgstr "Número de telefone (opcional)"
+msgid "Crm|Organization has been updated."
+msgstr ""
msgid "Cron Timezone"
msgstr "Fuso horário do cron"
@@ -10745,21 +10976,18 @@ msgstr "Intervalo personalizado"
msgid "Custom range (UTC)"
msgstr "Intervalo personalizado (UTC)"
-msgid "Customer Relations Contacts"
+msgid "Customer experience improvement and third-party offers"
msgstr ""
-msgid "Customer Relations Organizations"
+msgid "Customer relations"
msgstr ""
-msgid "Customer experience improvement and third-party offers"
+msgid "Customer relations contacts"
msgstr ""
-msgid "Customer relations"
+msgid "Customer relations organizations"
msgstr ""
-msgid "Customizable by owners."
-msgstr "Personalizado por proprietários."
-
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
msgstr ""
@@ -10886,15 +11114,33 @@ msgstr "deve estar em um grupo"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} selecionado (%{maxLabels} max)"
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Data"
msgid "CycleAnalytics|Display chart filters"
msgstr "Mostrar filtros de gráficos"
+msgid "CycleAnalytics|Filter by stop date"
+msgstr "Filtrar por data de finalização"
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10945,14 +11191,20 @@ msgid "CycleAnalytics|There is no data for 'Stage time' available. Adjust the cu
msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
+msgstr "Não há dados disponíveis para 'Tempo total'. Ajuste os filtros atuais."
+
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
msgstr ""
msgid "CycleAnalytics|Total time"
-msgstr ""
+msgstr "Tempo total"
msgid "CycleAnalytics|Type of work"
msgstr "Tipo de trabalho"
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,12 +11220,12 @@ msgstr ""
msgid "DAST Configuration"
msgstr "Cconfiguração de DAST"
-msgid "DAST Scans"
-msgstr "Verificações de DAST"
-
msgid "DAST profile not found: %{name}"
msgstr ""
+msgid "DAST profiles"
+msgstr ""
+
msgid "DNS"
msgstr "DNS"
@@ -11062,16 +11314,16 @@ msgid "DastProfiles|AJAX spider"
msgstr ""
msgid "DastProfiles|API"
-msgstr ""
+msgstr "API"
msgid "DastProfiles|API endpoint URL"
-msgstr ""
+msgstr "URL do ponto de extremidade da API"
msgid "DastProfiles|Active"
msgstr "Ativo"
msgid "DastProfiles|Additional request headers (optional)"
-msgstr ""
+msgstr "Cabeçalhos adicionais de requisição (opcional)"
msgid "DastProfiles|Are you sure you want to delete this profile?"
msgstr ""
@@ -11086,7 +11338,7 @@ msgid "DastProfiles|Branch missing"
msgstr "Branch faltando"
msgid "DastProfiles|Choose a scan method"
-msgstr ""
+msgstr "Escolha um método de verificação"
msgid "DastProfiles|Could not create the scanner profile. Please try again."
msgstr "Não foi possível criar o perfil da verificação. Por favor, tente novamente."
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr "Mensagens de depuração"
@@ -11158,13 +11413,13 @@ msgid "DastProfiles|Excluded URLs"
msgstr "URLs excluídas"
msgid "DastProfiles|Excluded URLs (optional)"
-msgstr ""
+msgstr "URLs excluídas (opcional)"
msgid "DastProfiles|Excluded paths"
-msgstr ""
+msgstr "Caminhos excluídos"
msgid "DastProfiles|Excluded paths (optional)"
-msgstr ""
+msgstr "Caminhos excluídos (opcional)"
msgid "DastProfiles|Hide debug messages"
msgstr "Ocultar mensagens de depuração"
@@ -11172,9 +11427,6 @@ msgstr "Ocultar mensagens de depuração"
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr "Incluir mensagens de depuração (debug) no console de saída do DAST."
-msgid "DastProfiles|Manage DAST scans"
-msgstr "Gerenciar verificações de DAST"
-
msgid "DastProfiles|Manage profiles"
msgstr "Gerenciar perfis"
@@ -11230,7 +11482,7 @@ msgid "DastProfiles|Save profile"
msgstr "Salvar perfil"
msgid "DastProfiles|Scan method"
-msgstr ""
+msgstr "Método de verificação"
msgid "DastProfiles|Scan mode"
msgstr "Modo de verificação"
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr "Os dados ainda estão a ser calculados..."
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr "Tipo de dados"
@@ -11457,7 +11712,7 @@ msgid "DatadogIntegration|Tag all data from this GitLab instance in Datadog. Use
msgstr ""
msgid "DatadogIntegration|Tags"
-msgstr ""
+msgstr "Tags"
msgid "DatadogIntegration|The Datadog site to send data to. To send data to the EU site, use %{codeOpen}datadoghq.eu%{codeClose}."
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr "Ramificação padrão"
msgid "Default branch and protected branches"
msgstr "Branch padrão e branches protegidos"
-msgid "Default branch protection"
-msgstr "Proteção padrão de ramificação"
-
msgid "Default delayed project deletion"
msgstr "Atraso padrão para exclusão de projeto"
@@ -11570,9 +11822,6 @@ msgstr "Primeiro dia da semana padrão"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Primeiro dia da semana padrão em calendários e selecionadores de data."
-msgid "Default initial branch name"
-msgstr "Nome padrão da ramificação inicial"
-
msgid "Default project deletion protection"
msgstr ""
@@ -11742,7 +11991,7 @@ msgid "Delete this epic and all descendants?"
msgstr "Excluir este épico e todos os descendentes?"
msgid "Delete this project"
-msgstr ""
+msgstr "Excluir este projeto"
msgid "Delete user list"
msgstr "Excluir lista de usuário"
@@ -12105,7 +12354,7 @@ msgid "DeployTokens|Allows read-only access to the repository."
msgstr "Permite acesso somente-leitura ao repositório."
msgid "DeployTokens|Allows write access to registry images."
-msgstr ""
+msgstr "Permite acesso de leitura às imagens de registro."
msgid "DeployTokens|Copy deploy token"
msgstr "Copiar token de implantação"
@@ -12201,7 +12450,7 @@ msgid "Deploying to AWS is easy with GitLab"
msgstr "Implantar em AWS é fácil com GitLab"
msgid "Deployment"
-msgstr ""
+msgstr "Implantação"
msgid "Deployment Frequency"
msgstr "Frequência de implantação"
@@ -12210,14 +12459,41 @@ msgid "Deployment Target|Project deployment target (optional)"
msgstr ""
msgid "Deployment Target|Select the deployment target"
-msgstr ""
+msgstr "Selecione o alvo de implantação"
msgid "Deployment frequency"
msgstr "Frequência de implantação"
-msgid "DeploymentTarget|GitLab Pages"
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr "Opções de aprovação"
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr "Ambiente: %{environment}"
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
msgstr ""
+msgid "DeploymentTarget|GitLab Pages"
+msgstr "GitLab Pages"
+
msgid "DeploymentTarget|Heroku"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr "Falhado"
msgid "Deployment|Latest Deployed"
msgstr "Última implantação"
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr "Em execução"
@@ -12296,7 +12575,7 @@ msgid "Deployment|Waiting"
msgstr "Aguardando"
msgid "Deployment|blocked"
-msgstr ""
+msgstr "bloqueado"
msgid "Deployment|canceled"
msgstr "cancelado"
@@ -12320,16 +12599,16 @@ msgid "Deprecated API rate limits"
msgstr ""
msgid "Deprecations|Feature deprecation and removal"
-msgstr ""
+msgstr "Remoção e depreciação de funcionalidades"
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
+msgstr "As métricas, registros e recursos de rastreamento foram descontinuados no GitLab 14.7 e estão %{epicStart} programados para remoção %{epicEnd} no GitLab 15.0."
msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
+msgstr "As métricas, registros e recursos de rastreamento foram descontinuados no GitLab 14.7 e estão %{removal_link_start} agendados para remoção %{link_end} no GitLab 15. . Para informações sobre uma possível substituição, %{opstrace_link_start} leia mais sobre Opstrace %{link_end}."
msgid "Deprioritize label"
msgstr "Despriorizar etiqueta"
@@ -12338,7 +12617,7 @@ msgid "Descending"
msgstr "Decrescente"
msgid "Describe the goal of the changes and what reviewers should be aware of."
-msgstr ""
+msgstr "Descreva o objetivo das mudanças e o que os revisores devem estar cientes."
msgid "Description"
msgstr "Descrição"
@@ -12577,10 +12856,10 @@ msgid "DevopsAdoption|At least one deploy"
msgstr ""
msgid "DevopsAdoption|At least one issue created"
-msgstr ""
+msgstr "Pelo menos uma issue foi criada"
msgid "DevopsAdoption|At least one merge request created"
-msgstr ""
+msgstr "Pelo menos uma solicitação de mesclagem foi criada"
msgid "DevopsAdoption|At least one pipeline successfully run"
msgstr ""
@@ -12900,7 +13179,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Dismiss Alert"
-msgstr ""
+msgstr "Dispensar aviso"
msgid "Dismiss merge request promotion"
msgstr "Dispensar promoção de solicitação de mesclagem"
@@ -12926,6 +13205,9 @@ msgstr "Descartado no pipeline %{pipelineLink}"
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr "Descartado no pipeline %{pipelineLink} em %{projectLink}"
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr "Exibir alertas de todas as ferramentas de monitoramento configuradas."
@@ -12975,7 +13257,7 @@ msgid "Does not apply to projects in personal namespaces, which are deleted imme
msgstr ""
msgid "Does not delete the source branch."
-msgstr ""
+msgstr "Não exclui a ramificação de origem."
msgid "Domain"
msgstr "Domínio"
@@ -12983,6 +13265,9 @@ msgstr "Domínio"
msgid "Domain Name"
msgstr "Nome do domínio"
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr "Ainda não possui uma conta?"
@@ -13073,6 +13358,9 @@ msgstr "Votos negativos"
msgid "Draft"
msgstr "Rascunho"
+msgid "Draft: %{filename}"
+msgstr "Rascunho: %{filename}"
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr "Arraste seus projetos aqui ou %{linkStart}clique para enviar%{linkEnd}."
@@ -13118,6 +13406,45 @@ msgstr "Validade"
msgid "Duration"
msgstr "Duração"
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "Durante esse processo, você será perguntado por URLs do lado do GitLab. Use os URLs mostrados abaixo."
@@ -13220,9 +13547,6 @@ msgstr "Editar grupo: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "Editar identidade para %{user_name}"
-msgid "Edit in Web IDE"
-msgstr "Editar no IDE Web"
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr "Ativar a exclusão atrasada do projeto por padrão para grupos recém-criados."
@@ -13596,7 +13923,7 @@ msgid "Enable multipart emails"
msgstr "Ativar múltiplos e-mails"
msgid "Enable only for confidential applications exclusively used by a trusted backend server that can securely store the client secret. Do not enable for native-mobile, single-page, or other JavaScript applications because they cannot keep the client secret confidential."
-msgstr ""
+msgstr "Ative apenas para aplicativos confidenciais usados exclusivamente por um servidor de back-end confiável que pode armazenar com segurança o segredo do cliente. Não habilite para aplicativos móveis nativos, de página única ou outros aplicativos JavaScript porque eles não podem manter o segredo do cliente confidencial."
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Ative ou desative a coleção de dados Pseudonymizer"
@@ -13776,7 +14103,7 @@ msgid "Enter the code from the two-factor app on your mobile device. If you've l
msgstr ""
msgid "Enter the following to confirm:"
-msgstr ""
+msgstr "Digite o seguinte para confirmar:"
msgid "Enter the name of your application, and we'll return a unique %{type}."
msgstr "Digite o nome da sua aplicação e devolveremos um %{type} único."
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr "Escopo de ambiente"
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ 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|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr "Saiba mais sobre como parar ambientes"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr "Mais informações"
-
msgid "Environments|New environment"
msgstr "Novo ambiente"
@@ -14053,8 +14380,11 @@ msgstr "Implantação em breve"
msgid "Environments|Updated"
msgstr "Atualizado"
-msgid "Environments|You don't have any environments right now"
-msgstr "Você não tem nenhum ambiente no momento"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr "por %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr "Não há projetos disponíveis"
@@ -14434,6 +14770,9 @@ msgstr "Selecionar projeto"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr "Erros"
@@ -14459,7 +14798,7 @@ msgid "Escalation policies must have at least one rule"
msgstr "As políticas de escalonamento devem ter pelo menos uma regra"
msgid "Escalation policy"
-msgstr ""
+msgstr "Política de escalação"
msgid "Escalation policy:"
msgstr "Política de escalação:"
@@ -14673,6 +15012,9 @@ msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando o Hug
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando o Jekyll"
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando HTML simples"
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr "Exemplo: @sub\\.company\\.com$"
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr "Exceto da política:"
@@ -14805,6 +15150,9 @@ msgstr "Explorar Grupos"
msgid "Explore groups"
msgstr "Explorar grupos"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Explorar projetos"
@@ -14812,7 +15160,7 @@ msgid "Explore public groups"
msgstr "Explorar grupos públicos"
msgid "Explore public projects"
-msgstr ""
+msgstr "Explorar projetos públicos"
msgid "Explore snippets"
msgstr ""
@@ -14851,7 +15199,7 @@ msgid "Export this group with all related data."
msgstr ""
msgid "Export this project with all its related data in order to move it to a new GitLab instance. When the exported file is ready, you can download it from this page or from the download link in the email notification you will receive. You can then import it when creating a new project. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Exporte este projeto com todos os seus dados relacionados para movê-lo para uma nova instância do GitLab. Quando o arquivo exportado estiver pronto, você poderá baixá-lo nesta página ou no link de download na notificação por e-mail que você receberá. Você pode então importá-lo ao criar um novo projeto. %{link_start}Saiba mais.%{link_end}"
msgid "Export variable to pipelines running on protected branches and tags only."
msgstr "Exporte a variável para pipelines em execução apenas em branches e tags protegidos."
@@ -14934,9 +15282,15 @@ msgstr "URL do serviço"
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr "Não foi possível exportar, tente novamente mais tarde"
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr "Falha ao obter a ref."
@@ -15243,7 +15600,7 @@ msgid "Feature Flags"
msgstr "Feature flag"
msgid "Feature deprecation and removal"
-msgstr ""
+msgstr "Remoção e depreciação de funcionalidades"
msgid "Feature flag status"
msgstr "Status de feature flag"
@@ -15469,7 +15826,7 @@ msgstr "Fev"
msgid "February"
msgstr "Fevereiro"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15551,7 +15908,7 @@ msgid "Filter by"
msgstr "Filtrar por"
msgid "Filter by %{page_context_word} that are currently open."
-msgstr ""
+msgstr "Filtrar por %{page_context_word} que estão atualmente abertos."
msgid "Filter by Git revision"
msgstr "Filtrar pela revisão do Git"
@@ -15610,9 +15967,6 @@ msgstr "Filtrar por resultados..."
msgid "Filter users"
msgstr "Filtrar usuários"
-msgid "Filter your repositories by name"
-msgstr "Filtrar seus repositórios por nome"
-
msgid "Filter..."
msgstr "Filtro..."
@@ -15743,7 +16097,7 @@ msgid "For each job, re-use the project workspace. If the workspace doesn't exis
msgstr "Para cada tarefa, reutilize o espaço de tarefa do projeto. Se o espaço de tarefa não existir, use %{code_open}git clone%{code_close}."
msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
+msgstr "O nome da aplicação que vai usar o token ou seu propósito, por exemplo. Não coloque informações sensíveis no nome do token. Ele vai estar visível a todos os membros de %{resource_type}."
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "Para arquivos maiores que este limite indexam apenas o nome do arquivo. O conteúdo do arquivo não é indexado nem pesquisável."
@@ -15877,9 +16231,6 @@ msgstr "Avisos encontrados em seu .gitlab-ci.yml"
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr "Grátis"
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr "De %{code_open}%{source_title}%{code_close} em"
msgid "From %{providerTitle}"
msgstr "Do %{providerTitle}"
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Da abertura de tarefas até a implantação para a produção"
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr "Genérico"
@@ -16520,10 +16871,7 @@ msgid "GitLab Issue"
msgstr "Issue do GitLab"
msgid "GitLab KAS"
-msgstr ""
-
-msgid "GitLab Memberships CSV Export"
-msgstr ""
+msgstr "GitLab KAS"
msgid "GitLab Pages"
msgstr "GitLab Pages"
@@ -16537,6 +16885,9 @@ msgstr "Bot de suporte do GitLab"
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "Usuário GitLab"
@@ -16574,7 +16925,7 @@ msgid "GitLab is a single application for the entire software development lifecy
msgstr ""
msgid "GitLab is free to use. Many features for larger teams are part of our %{link_start}paid products%{link_end}. You can try Ultimate for free without any obligation or payment details."
-msgstr ""
+msgstr "O GitLab é gratuito para uso. Muitos recursos para equipes maiores fazem parte de nossos %{link_start}produtos pagos%{link_end}. Você pode experimentar o Ultimate gratuitamente sem nenhuma obrigação ou detalhes de pagamento."
msgid "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later."
msgstr "O GitLab está obtendo um certificado SSL Let's Encrypt para este domínio. Este processo pode levar algum tempo. Por favor, tente novamente mais tarde."
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr "Logotipo do GitLab"
-msgid "GitLab member or Email address"
-msgstr "Membro do GitLab ou endereço de e-mail"
-
msgid "GitLab metadata URL"
msgstr "URL de metadados do GitLab"
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr "Pesquisar no GitLab"
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr "Os resultados da pesquisa estão sendo carregados"
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr "em todo o GitLab"
@@ -16864,6 +17221,9 @@ msgstr "Ir para a definição"
msgid "Go to environments"
msgstr "Ir para ambientes"
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr "Ir para o épico"
@@ -16990,9 +17350,6 @@ msgstr "Projeto de Google Cloud"
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr "Projeto de Google Cloud"
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr "Revogar autorizações"
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr "Entendi"
@@ -17206,9 +17599,6 @@ msgstr "Executores de grupo"
msgid "Group runners can be managed with the %{link}."
msgstr "Os executores de grupo podem ser gerenciados com o %{link}."
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr "O compartilhamento de grupo fornece acesso a todos os membros do grupo (incluindo membros que herdaram a associação ao grupo de um grupo pai)."
-
msgid "Group variables (inherited)"
msgstr "Variáveis de grupo (herdados)"
@@ -17228,7 +17618,7 @@ msgid "Group: %{name}"
msgstr "Grupo: %{name}"
msgid "GroupActivityMetrics|Issues created"
-msgstr ""
+msgstr "Issues criadas"
msgid "GroupActivityMetrics|Last 90 days"
msgstr "Últimos 90 dias"
@@ -17237,7 +17627,7 @@ msgid "GroupActivityMetrics|Members added"
msgstr "Membros adicionados"
msgid "GroupActivityMetrics|Merge Requests created"
-msgstr ""
+msgstr "GroupActivityMetrics|Solicitações de mesclagem criadas"
msgid "GroupActivityMetrics|Recent activity"
msgstr "Atividade recente"
@@ -17528,7 +17918,7 @@ msgid "GroupSettings|Changing a group's URL can have unintended side effects."
msgstr "Alterar a URL do grupo pode ter efeitos colaterais indesejados."
msgid "GroupSettings|Choose a group path that does not start with a dash or end with a period. It can also contain alphanumeric characters and underscores."
-msgstr ""
+msgstr "Escolha um caminho de grupo que não comece com um traço ou termine com um ponto. Também pode conter caracteres alfanuméricos e sublinhados."
msgid "GroupSettings|Compliance frameworks"
msgstr "Frameworks de conformidade"
@@ -17564,7 +17954,7 @@ msgid "GroupSettings|If not specified at the group or instance level, the defaul
msgstr "Se não for especificado no nível de grupo ou instância, o padrão é %{default_initial_branch_name}. Não afeta os repositórios existentes."
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
-msgstr ""
+msgstr "Se a visibilidade do grupo pai for menor que a visibilidade atual do grupo, os níveis de visibilidade para subgrupos e projetos serão mudados para corresponder à visibilidade do novo grupo pai."
msgid "GroupSettings|New runners registration token has been generated!"
msgstr "Um novo token de registro de executores foi gerado!"
@@ -17611,15 +18001,15 @@ msgstr "Selecionar o grupo pai"
msgid "GroupSettings|Select the project that contains your custom Insights file."
msgstr "Selecione o projeto que contém seu arquivo personalizado do Insights."
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
+msgstr "Defina o nome inicial e as proteções para a ramificação padrão dos novos repositórios criados no grupo."
+
msgid "GroupSettings|Set 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 "O pipeline de Auto DevOps é executado se nenhum arquivo de configuração de CI for encontrado."
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
-msgstr "O nome padrão para a ramificação inicial de novos repositórios criados no grupo."
-
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
msgstr "Os projetos neste subgrupo podem ser selecionados como modelos para novos projetos criados no grupo. %{link_start}Saiba mais.%{link_end}"
@@ -17681,10 +18071,10 @@ msgid "Groups and projects"
msgstr "Grupos e projetos"
msgid "Groups are a great way to organize projects and people."
-msgstr ""
+msgstr "Os grupos são uma ótima maneira de organizar projetos e pessoas."
msgid "Groups are the best way to manage projects and members."
-msgstr ""
+msgstr "Os grupos são a melhor maneira de gerenciar projetos e membros."
msgid "Groups to synchronize"
msgstr "Grupos para sincronizar"
@@ -17740,6 +18130,9 @@ msgstr "Criar grupo"
msgid "GroupsNew|Create new group"
msgstr "Criar novo grupo"
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr "Exportar grupos com todos os seus dados relacionados e mova para uma nova instância do GitLab."
@@ -17758,9 +18151,6 @@ msgstr "Importar grupos de outras instância do GitLab"
msgid "GroupsNew|My Awesome Group"
msgstr "Meu grupo incrível"
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr "Navegue até as configurações do usuário para encontrar seu %{link_start}token de acesso pessoal%{link_end}."
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17795,16 +18185,16 @@ msgid "GroupsTree|Are you sure you want to leave the \"%{fullName}\" group?"
msgstr "Tem certeza que deseja sair do grupo \"%{fullName}\"?"
msgid "GroupsTree|Delete"
-msgstr ""
+msgstr "Excluir"
msgid "GroupsTree|Edit"
-msgstr ""
+msgstr "Editar"
msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
msgstr "Falha ao deixar o grupo. Por favor, verifique se você é o único dono."
msgid "GroupsTree|Leave group"
-msgstr ""
+msgstr "Deixar grupo"
msgid "GroupsTree|Loading groups"
msgstr "Carregando grupos"
@@ -17816,55 +18206,55 @@ msgid "GroupsTree|No groups or projects matched your search"
msgstr "Desculpe, nenhum grupo ou projeto correspondem à sua pesquisa"
msgid "GroupsTree|Options"
-msgstr ""
+msgstr "Opções"
msgid "GroupsTree|Search by name"
msgstr "Procura por nome"
msgid "Groups|Avatar will be removed. Are you sure?"
-msgstr ""
+msgstr "O avatar será removido. Você tem certeza?"
msgid "Groups|Changing group URL can have unintended side effects."
-msgstr ""
+msgstr "Alterar a URL do grupo pode ter efeitos colaterais indesejados."
msgid "Groups|Checking group URL availability..."
-msgstr ""
+msgstr "Verificando disponibilidade de URL do grupo..."
msgid "Groups|Enter a descriptive name for your group."
-msgstr ""
+msgstr "Por favor, preencha um nome descritivo para o seu grupo."
msgid "Groups|Group ID"
-msgstr ""
+msgstr "ID do grupo"
msgid "Groups|Group URL"
-msgstr ""
+msgstr "URL do grupo"
msgid "Groups|Group avatar"
-msgstr ""
+msgstr "Avatar do grupo"
msgid "Groups|Group description (optional)"
-msgstr ""
+msgstr "Descrição do Grupo (opcional)"
msgid "Groups|Group name"
-msgstr ""
+msgstr "Nome do grupo"
msgid "Groups|Group path is available."
-msgstr ""
+msgstr "O caminho do grupo está disponível."
msgid "Groups|Group path is unavailable. Path has been replaced with a suggested available path."
-msgstr ""
+msgstr "O caminho do grupo não está disponível. O caminho foi substituído por um caminho disponível sugerido."
msgid "Groups|Learn more"
-msgstr ""
+msgstr "Saiba mais"
msgid "Groups|Must start with letter, digit, emoji, or underscore. Can also contain periods, dashes, spaces, and parentheses."
-msgstr ""
+msgstr "Deve começar com letra, dígito, emoji ou sublinhado. Também pode conter pontos, traços, espaços e parênteses."
msgid "Groups|Remove avatar"
-msgstr ""
+msgstr "Remover avatar"
msgid "Groups|Save changes"
-msgstr ""
+msgstr "Salvar mudanças"
msgid "Guideline"
msgstr "Diretriz"
@@ -17876,11 +18266,114 @@ msgid "HAR file path or URL"
msgstr "Caminho do arquivo HAR ou URL"
msgid "HTTP Archive (HAR)"
-msgstr ""
+msgstr "Arquivo HTTP (HAR)"
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr "Ocultar carga"
msgid "Hide shared projects"
msgstr "Ocultar projetos compartilhados"
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr "Ocultar dicas de ferramentas ou popovers"
@@ -18200,9 +18696,6 @@ msgstr "Eu aceito o %{terms_link}"
msgid "I forgot my password"
msgstr "Esqueci minha senha"
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "Endereço IP"
@@ -18318,7 +18808,7 @@ msgid "IdentityVerification|Verify your identity"
msgstr "Verificar sua identidade"
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
-msgstr ""
+msgstr "Você sempre pode verificar sua conta posteriormente para criar um grupo."
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr ""
@@ -18378,7 +18868,7 @@ msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be
msgstr ""
msgid "If you are added to a project, it will be displayed here."
-msgstr ""
+msgstr "Se você for adicionado a um projeto, ele será exibido aqui."
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr "Importar um projeto GitLab exportado"
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr "Importar issues"
-msgid "Import members"
-msgstr "Importar membros"
-
-msgid "Import members from another project"
-msgstr "Importar membros de outro projeto"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Importar vários repositórios fazendo o upload de um arquivo manifest."
@@ -18525,9 +19015,6 @@ msgstr "Importar projeto"
msgid "Import project from"
msgstr "Importar projeto de"
-msgid "Import project members"
-msgstr "Importar membros do projeto"
-
msgid "Import projects from Bitbucket"
msgstr "Importar projetos do Bitbucket"
@@ -18565,25 +19052,25 @@ msgid "Import timed out. Import took longer than %{import_jobs_expiration} secon
msgstr "Importação expirou. A importação demorou mais de %{import_jobs_expiration} segundos"
msgid "ImportAProjectModal|Import from a project"
-msgstr ""
+msgstr "Importar de um projeto"
msgid "ImportAProjectModal|Import members from another project"
-msgstr ""
+msgstr "Importar membros de outro projeto"
msgid "ImportAProjectModal|Import project members"
-msgstr ""
+msgstr "Importar membros do projeto"
msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
-msgstr ""
+msgstr "Somente os membros do projeto (não os membros do grupo) são importados e obtêm as mesmas permissões que o projeto do qual você importa."
msgid "ImportAProjectModal|Successfully imported"
-msgstr ""
+msgstr "Importado com sucesso"
msgid "ImportAProjectModal|Unable to import project members"
-msgstr ""
+msgstr "Não é possível importar membros do projeto"
msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
-msgstr ""
+msgstr "Você está importando membros para o projeto %{strongStart}%{name}%{strongEnd}."
msgid "ImportButtons|Connect repositories from"
msgstr "Conectar repositórios de"
@@ -18687,13 +19174,13 @@ msgid "InProductMarketing|3 ways to dive into GitLab CI/CD"
msgstr ""
msgid "InProductMarketing|A single application eliminates complex integrations, data chokepoints, and toolchain maintenance, resulting in greater productivity and lower cost."
-msgstr ""
+msgstr "Um único aplicativo elimina integrações complexas, pontos de estrangulamento de dados e manutenção da cadeia de ferramentas, resultando em maior produtividade e menor custo."
msgid "InProductMarketing|Access advanced features, build more efficiently, strengthen security and compliance."
-msgstr ""
+msgstr "Acesse recursos avançados, construa com mais eficiência, fortaleça a segurança e a conformidade."
msgid "InProductMarketing|Access advanced features."
-msgstr ""
+msgstr "Acesse recursos avançados."
msgid "InProductMarketing|Actually, GitLab makes the team work (better)"
msgstr ""
@@ -18702,7 +19189,7 @@ msgid "InProductMarketing|And finally %{deploy_link} a Python application."
msgstr ""
msgid "InProductMarketing|And many more..."
-msgstr ""
+msgstr "E muito mais..."
msgid "InProductMarketing|Are your runners ready?"
msgstr ""
@@ -18726,7 +19213,7 @@ msgid "InProductMarketing|Break down silos to coordinate seamlessly across devel
msgstr ""
msgid "InProductMarketing|Burn up/down charts"
-msgstr ""
+msgstr "Gravar gráficos para cima/para baixo"
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 ""
@@ -18735,19 +19222,19 @@ msgid "InProductMarketing|Click on the number below that corresponds with your a
msgstr ""
msgid "InProductMarketing|Code owners"
-msgstr ""
+msgstr "Proprietários de código"
msgid "InProductMarketing|Code owners and required merge approvals are part of the paid tiers of GitLab. You can start a free 30-day trial of GitLab Ultimate and enable these features in less than 5 minutes with no credit card required."
msgstr ""
msgid "InProductMarketing|Code review analytics"
-msgstr ""
+msgstr "Análise de revisão de código"
msgid "InProductMarketing|Collaboration across stages in GitLab"
-msgstr ""
+msgstr "Colaboração entre estágios no GitLab"
msgid "InProductMarketing|Collaboration made easy"
-msgstr ""
+msgstr "Colaboração facilitada"
msgid "InProductMarketing|Create a custom CI runner with just a few clicks"
msgstr ""
@@ -18759,19 +19246,19 @@ msgid "InProductMarketing|Create a project in GitLab in 5 minutes"
msgstr ""
msgid "InProductMarketing|Create well-defined workflows by using scoped labels on issues, merge requests, and epics. Labels with the same scope cannot be used together, which prevents conflicts."
-msgstr ""
+msgstr "Crie fluxos de trabalho bem definidos usando etiqueta com escopo em issues, solicitações de mesclagem e épicos. Etiqueta com o mesmo escopo não podem ser usados juntos, o que evita conflitos."
msgid "InProductMarketing|Create your first project!"
msgstr ""
msgid "InProductMarketing|Define who owns specific files or directories, so the right reviewers are suggested when a merge request introduces changes to those files."
-msgstr ""
+msgstr "Define quem possui arquivos ou diretórios específicos, para que os revisores corretos sejam sugeridos quando uma solicitação de mesclagem introduz alterações nesses arquivos."
msgid "InProductMarketing|Deliver Better Products Faster"
msgstr ""
msgid "InProductMarketing|Dependency scanning"
-msgstr ""
+msgstr "Verificação de dependência"
msgid "InProductMarketing|Did you know teams that use GitLab are far more efficient?"
msgstr ""
@@ -18783,10 +19270,10 @@ msgid "InProductMarketing|Dig in and create a project and a repo"
msgstr ""
msgid "InProductMarketing|Discover Premium & Ultimate"
-msgstr ""
+msgstr "Descubra Premium e Ultimate"
msgid "InProductMarketing|Discover Premium & Ultimate."
-msgstr ""
+msgstr "Descubra Premium e Ultimate."
msgid "InProductMarketing|Do you have a minute?"
msgstr "Você tem um minuto?"
@@ -18795,13 +19282,13 @@ msgid "InProductMarketing|Do you have a teammate who would be perfect for this t
msgstr ""
msgid "InProductMarketing|Dynamic application security testing"
-msgstr ""
+msgstr "Testes dinâmicos de segurança de aplicativos"
msgid "InProductMarketing|Easy"
msgstr "Fácil"
msgid "InProductMarketing|Epics"
-msgstr ""
+msgstr "Épicos"
msgid "InProductMarketing|Expand your DevOps journey with a free GitLab trial"
msgstr ""
@@ -18825,13 +19312,13 @@ msgid "InProductMarketing|Feel the need for speed?"
msgstr ""
msgid "InProductMarketing|Find and fix bottlenecks in your code review process by understanding how long open merge requests have been in review."
-msgstr ""
+msgstr "Encontre e corrija gargalos em seu processo de revisão de código, entendendo há quanto tempo as solicitações de mesclagem abertas estão em revisão."
msgid "InProductMarketing|Find out how your teams are really doing"
msgstr ""
msgid "InProductMarketing|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
-msgstr ""
+msgstr "Descubra se suas bibliotecas externas são seguras. Execute trabalhos de verificação de dependência que verificam vulnerabilidades conhecidas em suas bibliotecas externas."
msgid "InProductMarketing|Follow our steps"
msgstr "Siga nossos passos"
@@ -18866,9 +19353,6 @@ msgstr "Conceitos básicos de Git"
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18915,7 +19399,7 @@ msgid "InProductMarketing|If you no longer wish to receive marketing emails from
msgstr ""
msgid "InProductMarketing|Import your project and code from GitHub, Bitbucket and others"
-msgstr ""
+msgstr "Importe seu projeto e código do GitHub, Bitbucket e outros"
msgid "InProductMarketing|Improve app security with a 30-day trial"
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -18963,16 +19438,16 @@ msgid "InProductMarketing|It's also possible to simply %{external_repo_link} in
msgstr ""
msgid "InProductMarketing|Keep your code quality high by defining who should approve merge requests and how many approvals are required."
-msgstr ""
+msgstr "Mantenha a qualidade do seu código alta definindo quem deve aprovar as solicitações de mesclagem e quantas aprovações são necessárias."
msgid "InProductMarketing|Launch GitLab CI/CD in 20 minutes or less"
msgstr ""
msgid "InProductMarketing|Lower cost of development"
-msgstr ""
+msgstr "Menor custo de desenvolvimento"
msgid "InProductMarketing|Make it easier to collaborate on high-level ideas by grouping related issues in an epic."
-msgstr ""
+msgstr "Facilite a colaboração em ideias de alto nível agrupando issues relacionados em um épico."
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 ""
@@ -18981,7 +19456,7 @@ msgid "InProductMarketing|Master the art of importing!"
msgstr ""
msgid "InProductMarketing|Merge request approval rule"
-msgstr ""
+msgstr "Regra de aprovação de solicitação de mesclagem"
msgid "InProductMarketing|Move on to easily creating a Pages website %{ci_template_link}"
msgstr ""
@@ -18990,7 +19465,7 @@ msgid "InProductMarketing|Multiple owners, confusing workstreams? We've got you
msgstr ""
msgid "InProductMarketing|Multiple required approvers"
-msgstr ""
+msgstr "Vários aprovadores necessários"
msgid "InProductMarketing|Need an alternative to importing?"
msgstr ""
@@ -19005,7 +19480,7 @@ msgid "InProductMarketing|Our tool brings all the things together"
msgstr ""
msgid "InProductMarketing|Protect your web application by using DAST to examine for vulnerabilities in deployed environments."
-msgstr ""
+msgstr "Proteja seu aplicativo da Web usando o DAST para examinar vulnerabilidades em ambientes implantados."
msgid "InProductMarketing|Rapid development, simplified"
msgstr ""
@@ -19014,13 +19489,13 @@ msgid "InProductMarketing|Reduce Security & Compliance Risk"
msgstr ""
msgid "InProductMarketing|Require multiple approvers on a merge request, so you know it's in good shape before it's merged."
-msgstr ""
+msgstr "Exigir vários aprovadores em uma solicitação de mesclagem, para que você saiba que está em boas condições antes de ser mesclada."
msgid "InProductMarketing|Roadmaps"
-msgstr ""
+msgstr "Roteiros"
msgid "InProductMarketing|Scoped labels"
-msgstr ""
+msgstr "Etiquetas com escopo"
msgid "InProductMarketing|Security that's integrated into your development lifecycle"
msgstr ""
@@ -19029,7 +19504,7 @@ msgid "InProductMarketing|Sometimes you're not ready to make a full transition t
msgstr ""
msgid "InProductMarketing|Speed. Efficiency. Trust."
-msgstr ""
+msgstr "Velocidade. Eficiência. Confiar."
msgid "InProductMarketing|Spin up an autoscaling runner in GitLab"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr "Responsáveis"
@@ -19313,11 +19800,17 @@ msgstr "Publicado"
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr "Resolvido"
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr "Severidade"
msgid "IncidentManagement|Status"
-msgstr ""
+msgstr "Status"
msgid "IncidentManagement|There are no closed incidents"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr "Tempo para SLA"
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19386,27 +19882,30 @@ msgid "Incidents"
msgstr "Incidentes"
msgid "Incidents|Add image details"
-msgstr ""
+msgstr "Adicionar detalhes da imagem"
msgid "Incidents|Add text or a link to display with your image. If you don't add either, the file name displays instead."
-msgstr ""
+msgstr "Adicione um texto ou link para ser exibido com a imagem. Se deixar em branco, o nome do arquivo será exibido no lugar."
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 "Deve começar com http ou https"
msgid "Incidents|There was an issue deleting the image."
-msgstr ""
+msgstr "Ocorreu um problema ao excluir a imagem."
msgid "Incidents|There was an issue loading metric images."
msgstr ""
msgid "Incidents|There was an issue updating your image."
-msgstr ""
+msgstr "Ocorreu um problema ao atualizar sua imagem."
msgid "Incidents|There was an issue uploading your image."
+msgstr "Ocorreu um problema ao enviar sua imagem."
+
+msgid "Incident|Add new timeline event"
msgstr ""
msgid "Incident|Alert details"
@@ -19416,20 +19915,23 @@ msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
msgid "Incident|Delete image"
-msgstr ""
+msgstr "Excluir imagem"
msgid "Incident|Deleting %{filename}"
msgstr ""
msgid "Incident|Edit image text or link"
-msgstr ""
+msgstr "Editar texto ou link da imagem"
msgid "Incident|Editing %{filename}"
-msgstr ""
+msgstr "Editando %{filename}"
msgid "Incident|Metrics"
msgstr "Métricas"
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "Resumo"
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "Incluir o nome do autor no corpo do e-mail de notificação"
@@ -19547,6 +20052,12 @@ msgstr "Herdado"
msgid "Inherited:"
msgstr "Herdado:"
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr "Em linha"
@@ -19706,7 +20217,7 @@ msgid "Integrations|Comment settings:"
msgstr "Configurações de comentário:"
msgid "Integrations|Connection details"
-msgstr ""
+msgstr "Detalhes da conexão"
msgid "Integrations|Connection failed. Please check your settings."
msgstr ""
@@ -19733,7 +20244,7 @@ msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
msgstr "Ative os comandos de barra do GitLab.com em um espaço de trabalho do Slack."
msgid "Integrations|Enable SSL verification"
-msgstr ""
+msgstr "Ativar verificação de SSL"
msgid "Integrations|Enable comments"
msgstr "Ativar comentários"
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19814,7 +20328,7 @@ msgid "Integrations|Return to GitLab for Jira"
msgstr "Voltar ao GitLab para Jira"
msgid "Integrations|SSL verification"
-msgstr ""
+msgstr "Verificação de SSL"
msgid "Integrations|Save settings?"
msgstr "Salvar configurações?"
@@ -19861,6 +20375,9 @@ msgstr "Usar configurações personalizadas"
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr "Você ainda não ativou nenhuma integração."
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr "Convite"
msgid "Invitation declined"
msgstr "Convite recusado"
-msgid "Invite"
-msgstr "Convidar"
-
msgid "Invite \"%{email}\" by email"
msgstr "Convidar \"%{email}\" por e-mail"
@@ -20044,12 +20564,6 @@ msgstr "Convidar um grupo"
msgid "Invite email has already been taken"
msgstr "O e-mail de convite já está em uso"
-msgid "Invite group"
-msgstr "Convidar grupo"
-
-msgid "Invite member"
-msgstr "Convidar membro"
-
msgid "Invite members"
msgstr "Convidar membros"
@@ -20143,6 +20657,9 @@ msgstr "Convidar membros"
msgid "InviteMembersModal|Members were successfully added"
msgstr "Membros foram adicionados com sucesso"
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "Pesquisar um grupo para convidar"
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr "Vocêestá convidando membros para o grupo %{strongStart}%{name}%{strongEnd}."
@@ -20173,6 +20696,9 @@ msgstr "Vocêestá convidando membros para o grupo %{strongStart}%{name}%{strong
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr "Vocêestá convidando membros para o projeto %{strongStart}%{name}%{strongEnd}."
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr "Convidar grupo"
@@ -20365,9 +20891,6 @@ msgstr "Issue fechada por %{name} %{reason}"
msgid "Issue weight"
msgstr "Peso da issue"
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr "Idade"
@@ -20375,7 +20898,7 @@ msgid "IssueAnalytics|Assignees"
msgstr "Responsáveis"
msgid "IssueAnalytics|Created by"
-msgstr ""
+msgstr "Criado por"
msgid "IssueAnalytics|Due date"
msgstr "Validade"
@@ -20410,8 +20933,8 @@ msgstr "Excluir painel"
msgid "IssueBoards|No matching boards found"
msgstr "Nenhuma painel correspondente encontrado"
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr "Alguns de seus painéis estão ocultos, ative uma licença para vê-los novamente."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr ""
msgid "IssueBoards|Switch board"
msgstr "Alternar painel"
@@ -20513,10 +21036,10 @@ msgid "IssuesAnalytics|Avg/Month:"
msgstr ""
msgid "IssuesAnalytics|Issues created"
-msgstr ""
+msgstr "Issues criadas"
msgid "IssuesAnalytics|Issues created per month"
-msgstr ""
+msgstr "Issues criadas por mês"
msgid "IssuesAnalytics|Last 12 months"
msgstr "Últimos 12 meses"
@@ -20581,11 +21104,14 @@ msgstr "Iteração atualizada"
msgid "Iterations"
msgstr "Iterações"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr "Adicionar iteração"
-msgid "Iterations|Automated scheduling"
-msgstr "Agendamento automatizado"
+msgid "Iterations|All"
+msgstr ""
msgid "Iterations|Cadence configuration is invalid."
msgstr ""
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr "Criar iteração"
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr "Excluir iteração?"
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Duração"
@@ -20635,7 +21158,13 @@ msgstr "Iterações futuras"
msgid "Iterations|Iteration cadences"
msgstr "Cadências de iteração"
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr "Sem iterações fechadas."
msgid "Iterations|No iteration cadences to show."
msgstr "Sem cadências de iteração para mostrar."
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr "Nenhuma integrações em cadência"
@@ -20662,10 +21194,16 @@ msgstr "Sem iterações abertas."
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr "Selecionar número"
msgid "Iterations|Select start date"
msgstr "Selecionar data de início"
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr "Data de início"
@@ -20689,6 +21230,9 @@ msgstr "A iteração foi excluída."
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr "Nome de usuário ou e-mail"
msgid "JiraService|Using Jira for issue tracking?"
msgstr "Usando Jira para rastreamento de issue?"
-msgid "JiraService|View Jira issues in GitLab"
-msgstr "Ver issues do Jira no GitLab"
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr "Criar arquivo de configuração de CI/CD"
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,9 +21578,15 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr "Nenhuma tarefa para mostrar"
-msgid "Jobs|Use jobs to automate your tasks"
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
msgstr ""
+msgid "Jobs|Use jobs to automate your tasks"
+msgstr "Use trabalhos para automatizar suas tarefas"
+
msgid "Jobs|You're about to retry a job that failed because it attempted to deploy code that is older than the latest deployment. Retrying this job could result in overwriting the environment with the older source code."
msgstr ""
@@ -21056,20 +21609,29 @@ msgid "Job|Browse"
msgstr "Navegar"
msgid "Job|Cancel"
+msgstr "Cancelar"
+
+msgid "Job|Canceled"
msgstr ""
msgid "Job|Complete Raw"
msgstr "Raw completo"
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "Baixar"
msgid "Job|Erase job log and artifacts"
msgstr ""
-msgid "Job|Finished at"
+msgid "Job|Failed"
msgstr ""
+msgid "Job|Finished at"
+msgstr "Finalizado em"
+
msgid "Job|Job artifacts"
msgstr "Artefatos da tarefa"
@@ -21082,9 +21644,27 @@ msgstr "Ttarefa foi apagada por %{userLink}"
msgid "Job|Keep"
msgstr "Manter"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "Rolar para baixo"
@@ -21094,9 +21674,12 @@ msgstr "Rolar para o topo"
msgid "Job|Show complete raw"
msgstr "Mostrar raw completo"
-msgid "Job|Status"
+msgid "Job|Skipped"
msgstr ""
+msgid "Job|Status"
+msgstr "Status"
+
msgid "Job|The artifacts were removed"
msgstr "Os artefatos foram removidos"
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "permitido falhar"
@@ -21477,6 +22063,9 @@ msgstr "Última tentativa de atualização"
msgid "Last updated"
msgstr "Último atualizado"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr "Último uso"
@@ -21556,7 +22145,7 @@ msgid "Learn more about Auto DevOps"
msgstr "Saiba mais sobre o Auto DevOps"
msgid "Learn more about GitLab"
-msgstr ""
+msgstr "Aprenda mais sobre GitLab"
msgid "Learn more about Needs relationships"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr "Saiba mais sobre os modelos de projeto de nível de grupo"
msgid "Learn more about groups."
msgstr "Saiba mais sobre os grupos."
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr "Gráfico de burndown legado"
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr "O Let's Encrypt não aceita e-mails de example.com"
@@ -21738,6 +22336,9 @@ msgstr "Vamos conversar!"
msgid "License Compliance"
msgstr "License Compliance"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr "Conformidade de licença"
@@ -21756,11 +22357,14 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
msgid "LicenseCompliance|Add license and related policy"
-msgstr ""
+msgstr "Adicionar licença e política relacionada"
msgid "LicenseCompliance|Add license policy"
msgstr "Adicionar política de licença"
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr "Aprovações de licença"
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr "License Compliance não detectou licenças apenas para o branch de origem"
@@ -21825,6 +22431,12 @@ msgstr "License Compliance não detectou novas licenças"
msgid "LicenseCompliance|License name"
msgstr "Nome da licença"
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr "Remover licença"
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -21961,7 +22579,7 @@ msgid "Link"
msgstr ""
msgid "Link (optional)"
-msgstr ""
+msgstr "Link (opcional)"
msgid "Link Prometheus monitoring to GitLab."
msgstr ""
@@ -21973,7 +22591,7 @@ msgid "Link URL"
msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
-msgstr ""
+msgstr "Vincule um wiki externo da barra lateral do projeto. %{docs_link}"
msgid "Link copied"
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr "Listar repositórios disponíveis"
msgid "List of all merge commits"
msgstr "Lista de todos commits de mesclagem"
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr "Gerenciar etiquetas de grupo"
msgid "Manage labels"
msgstr "Gerenciar etiquetas"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr "Gerenciar marcos"
@@ -22338,6 +22956,9 @@ msgstr "Importação de manifest"
msgid "Manual"
msgstr "Manual"
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr "O tamanho máximo do arquivo é 200 KB."
msgid "Max role"
msgstr "Cargo max"
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr "Tempo máximo de sessão"
@@ -22620,9 +23244,6 @@ msgstr "Tempo limite máximo da tarefa"
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr "Número máximo de espelhos que podem estar sincronizando ao mesmo tempo
msgid "Maximum number of projects."
msgstr "Número máximo de projetos."
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22778,7 +23405,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Membership"
-msgstr ""
+msgstr "Membro"
msgid "Members|%{time} by %{user}"
msgstr "%{time} por %{user}"
@@ -22853,7 +23480,7 @@ msgid "Members|Leave \"%{source}\""
msgstr "Deixar \"%{source}\""
msgid "Members|Membership"
-msgstr ""
+msgstr "Membro"
msgid "Members|Remove \"%{groupName}\""
msgstr "Remover \"%{groupName}\""
@@ -22879,9 +23506,6 @@ msgstr "Pesquisar convite"
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr "Revogar convite"
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr "Mesclar automaticamente (%{strategy})"
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr "Solicitações de mesclagem"
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 the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr "Mi"
-msgid "Middleman project with Static Site Editor support"
-msgstr "Projeto intermediário com suporte ao editor de sites estáticos"
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr "Migrado %{success_count}/%{total_count} arquivos."
@@ -23669,6 +24290,9 @@ msgstr "Fechar marco"
msgid "Milestones|Completed Issues (closed)"
msgstr "Issues concluídas (fechadas)"
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Excluir marco"
@@ -23687,6 +24311,9 @@ msgstr "Marco %{milestoneTitle} não foi encontrado"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr "Issues em andamento (abertas e atribuídas)"
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr "Marco do projeto"
@@ -23705,12 +24332,21 @@ msgstr "Promover %{milestoneTitle} irá disponibilizá-lo para todos os projetos
msgid "Milestones|Reopen Milestone"
msgstr "Reabrir marco"
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "Essa ação não pode ser revertida."
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr "Issues não iniciadas (abertas e não atribuídas)"
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr "Capacidade mínima para estar disponível antes de agendar mais espelhos preventivamente."
@@ -23828,6 +24464,9 @@ msgstr "Mês"
msgid "Months"
msgstr "Meses"
+msgid "More Details"
+msgstr "Mais detalhes"
+
msgid "More Information"
msgstr "Mais informações"
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr "Parar ambiente"
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23970,7 +24609,7 @@ msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/e
msgstr ""
msgid "My awesome group"
-msgstr ""
+msgstr "Meu grupo incrível"
msgid "My company or team"
msgstr "Minha empresa ou equipe"
@@ -23979,7 +24618,7 @@ msgid "My topic"
msgstr "Meu tópico"
msgid "My-Reaction"
-msgstr ""
+msgstr "Minha reação"
msgid "N/A"
msgstr ""
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr "Saia e entre com uma conta diferente"
msgid "Need help?"
msgstr "Precisa de ajuda?"
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr "Nunca"
msgid "New"
msgstr "Novo"
-msgid "New %{issueType}"
-msgstr "Nova %{issueType}"
-
msgid "New %{type} in %{project}"
msgstr "Novo %{type} em %{project}"
@@ -24396,6 +25062,9 @@ msgstr "Novo diretório"
msgid "New discussion"
msgstr "Nova discussão"
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr "Novo ambiente"
@@ -24471,6 +25140,9 @@ msgstr "Novo projeto/repositório"
msgid "New public deploy key"
msgstr "Nova chave pública de implantação"
+msgid "New related %{issueType}"
+msgstr "Nova %{issueType} relacionada"
+
msgid "New release"
msgstr "Nova versão"
@@ -24481,14 +25153,11 @@ msgid "New response for issue #%{issue_iid}:"
msgstr "Nova resposta para a issue #%{issue_iid}:"
msgid "New runners registration token has been generated!"
-msgstr ""
+msgstr "Um novo token de registro de executores foi gerado!"
msgid "New schedule"
msgstr "Novo agendamento"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Novo snippet"
@@ -24537,6 +25206,9 @@ msgstr "Próxima verificação"
msgid "Next unresolved discussion"
msgstr "Próxima discussão não resolvida"
+msgid "Next update"
+msgstr "Próxima atualização"
+
msgid "Nickname"
msgstr "Apelido"
@@ -24585,6 +25257,9 @@ msgstr "Nenhum artefato encontrado"
msgid "No assignee"
msgstr "Nenhum responsável"
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "Nenhum método de autenticação configurado."
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr "Nenhum committers"
-msgid "No compliance frameworks are in use."
-msgstr "Nenhum frameworks de conformidade em uso"
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr "Nenhum frameworks de conformidade em uso. Crie um na seção %{link} em Configurações de grupo."
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr "Nenhuma issue encontrada"
msgid "No iteration"
msgstr "Sem iteração"
-msgid "No iterations found"
-msgstr "Nenhuma iteração encontrada"
-
msgid "No iterations to show"
msgstr "Nenhuma iteração para mostrar"
@@ -24720,7 +25386,7 @@ msgstr "Nenhuma licença. Todos os direitos reservados"
msgid "No matches found"
msgstr "Nenhum resultado encontrado"
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr "Nenhuma mensagem foi registrada"
msgid "No milestone"
msgstr "Nenhum marco"
-msgid "No milestones to show"
-msgstr "Sem marcos para mostrar"
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr "Nenhum favorito corresponde à sua pesquisa"
msgid "No start date"
msgstr "Nenhuma data de início"
+msgid "No suggestions found"
+msgstr "Nenhuma sugestão encontrada"
+
msgid "No tag selected"
msgstr "Nenhuma tag selecionada"
@@ -24978,7 +25644,7 @@ msgid "Notes|Confidential comments are only visible to members with the role of
msgstr ""
msgid "Notes|Make this comment confidential"
-msgstr ""
+msgstr "Torne este comentário confidencial"
msgid "Notes|Show all activity"
msgstr "Exibir todas as atividades"
@@ -24992,9 +25658,12 @@ msgstr "Mostrar apenas histórico"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr "Esse comentário foi alterado desde que você começou a editá-lo. Por favor, reveja o %{open_link}comentário atualizado%{close_link} para garantir que nenhuma informação seja perdida"
-msgid "Notes|This comment is confidential and only visible to project members"
+msgid "Notes|This comment is confidential and only visible to group members"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to project members"
+msgstr "Esse comentário é confidencial e só está visível para os membros do projeto"
+
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 ""
@@ -25412,7 +26081,7 @@ msgid "OnDemandScans|Description (optional)"
msgstr "Descrição (opcional)"
msgid "OnDemandScans|Edit on-demand DAST scan"
-msgstr ""
+msgstr "Editar verificação DAST sob demanda"
msgid "OnDemandScans|Edit profile"
msgstr "Editar perfil"
@@ -25424,20 +26093,20 @@ msgid "OnDemandScans|Manage DAST scans"
msgstr "Gerenciar verificações de DAST"
msgid "OnDemandScans|Manage scanner profiles"
-msgstr ""
+msgstr "Gerenciar perfis de verificação"
msgid "OnDemandScans|Manage site profiles"
-msgstr ""
+msgstr "Gerenciar perfis de sites"
msgid "OnDemandScans|My daily scan"
-msgstr ""
-
-msgid "OnDemandScans|New DAST scan"
-msgstr "Nova verificação de DAST"
+msgstr "Minha verificação diária"
msgid "OnDemandScans|New on-demand DAST scan"
msgstr "Nova verificação DAST sob demanda"
+msgid "OnDemandScans|New scan"
+msgstr ""
+
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
msgstr "Não há nenhum perfil ainda. Para criar uma nova verificação, você precisa ter pelo menos um perfil completo de verificação."
@@ -25457,7 +26126,7 @@ msgid "OnDemandScans|On-demand scans run outside the DevOps cycle and find vulne
msgstr "Verificações sob demanda são executadas fora do ciclo DevOps e encontram vulnerabilidades em seus projetos. %{learnMoreLinkStart}Saiba mais%{learnMoreLinkEnd}"
msgid "OnDemandScans|Repeats"
-msgstr ""
+msgstr "Repetições"
msgid "OnDemandScans|Run scan"
msgstr "Executar verificação"
@@ -25520,7 +26189,7 @@ msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|View results"
-msgstr ""
+msgstr "Ver resultados"
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
msgstr ""
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Apenas administradores podem excluir projetos"
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr "Somente prossiga se você confiar em %{idp_url} para controlar o seu log
msgid "Only project members can comment."
msgstr "Somente membros do projeto podem comentar."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr "Apenas membros do projeto serão importados. Membros do grupo serão ignorados."
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,12 +26301,12 @@ msgstr "Aberta"
msgid "Open Selection"
msgstr "Abrir seleção"
-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 errors"
msgstr "Abrir erros"
+msgid "Open in Gitpod"
+msgstr "Abrir no Gitpod"
+
msgid "Open in Web IDE"
msgstr "Abrir no IDE Web"
@@ -25650,9 +26319,6 @@ msgstr "Abrir em seu IDE"
msgid "Open raw"
msgstr "Abrir raw"
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "Abrir barra lateral"
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "Abrir em nova janela"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr "A operação falhou. Verifique os registros do pod para %{pod_name} para mais detalhes."
@@ -25821,6 +26490,9 @@ msgstr "Propriedade de:"
msgid "Owner"
msgstr "Proprietário"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr "Escolha um nome"
@@ -26832,7 +27507,7 @@ msgid "PipelineWizardInputValidation|This field is required"
msgstr ""
msgid "PipelineWizardInputValidation|This value is not valid"
-msgstr ""
+msgstr "Valor inválido"
msgid "PipelineWizardListWidget|add another step"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Pipelines"
@@ -26873,12 +27551,15 @@ msgstr "Gráficos de pipelines"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr "O GitLab Runner é um aplicativo que funciona com GitLab CI/CD para executar tarefas em um pipeline. Instale o GitLab Runner e registre seus próprios executores para começar a usar CI/CD."
+
msgid "Pipelines|API"
msgstr "API"
-msgid "Pipelines|Add a code quality job"
-msgstr "Adicionar uma tarefa de qualidade de código"
-
msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr "Tem certeza de que deseja executar este pipeline?"
@@ -26924,7 +27605,7 @@ msgstr "Editar"
msgid "Pipelines|Editor"
msgstr "Editor"
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,14 +27614,14 @@ msgstr "Primeiros passos com GitLab CI/CD"
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
-msgstr "Melhore a qualidade do código com GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgstr ""
-msgid "Pipelines|Install GitLab Runners"
-msgstr "Instalar GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
+msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
@@ -26948,8 +27629,8 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr "Último uso"
-msgid "Pipelines|Learn about Runners"
-msgstr "Saiba mais sobre Executores"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
+msgstr ""
msgid "Pipelines|Lint"
msgstr ""
@@ -26966,6 +27647,9 @@ msgstr "YAML mesclado é apenas a visualização"
msgid "Pipelines|More Information"
msgstr "Mais informações"
+msgid "Pipelines|No runners detected"
+msgstr "Nenhum executor detectado"
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr "Editor de pipeline"
msgid "Pipelines|Project cache successfully reset."
msgstr "Cache do projeto redefinido com sucesso."
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "Algo deu errado ao limpar o cache dos executores."
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "Este projeto não está atualmente configurado para executar 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 "Token"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
-msgstr "Usar um modelo CI/CD"
+msgid "Pipelines|Try test template"
+msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr "Usar um arquivo de modelo %{codeStart}.gitlab-ci.yml%{codeEnd} para explorar como funciona o CI/CD."
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr "Usar um modelo CI/CD de exemplo"
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27081,7 +27765,7 @@ msgid "Pipelines|latest"
msgstr ""
msgid "Pipelines|merge request"
-msgstr ""
+msgstr "solicitação de mesclagem"
msgid "Pipelines|merge train"
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr "Verificando status do pipeline"
msgid "Pipeline|Checking pipeline status."
msgstr "Verificando status do pipeline."
-msgid "Pipeline|Commit"
-msgstr "Commit"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr "Data"
msgid "Pipeline|Detached merge request pipeline"
msgstr "Pipeline de solicitação de mesclagem desanexada"
-msgid "Pipeline|Duration"
-msgstr "Duração"
-
msgid "Pipeline|Failed"
msgstr "Falhou"
@@ -27249,7 +27927,7 @@ msgid "Pipeline|for"
msgstr "para"
msgid "Pipeline|merge request"
-msgstr ""
+msgstr "solicitação de mesclagem"
msgid "Pipeline|merge train"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr "Por favor, selecione um arquivo"
msgid "Please select a group"
msgstr "Por favor, selecione um grupo"
-msgid "Please select a group."
-msgstr "Por favor, selecione um grupo."
-
msgid "Please select a valid target branch"
msgstr "Por favor, selecione uma ramificação de destino válida"
@@ -27521,7 +28196,7 @@ msgstr "Pod não encontrado"
msgid "Pods in use"
msgstr "Pods em uso"
-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."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr "Usar tempos relativos"
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr "Digite sua senha para confirmar a alteração do e-mail"
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr "Preencha seu pronome para que as pessoas saibam como se referir a você"
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr "Data de expiração"
@@ -28004,9 +28685,6 @@ msgstr "Nome completo"
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 "Dê um título à sua chave individual. Isto será visível publicamente."
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr "Esta informação aparecerá no seu perfil"
msgid "Profiles|Time settings"
msgstr "Configurações de hora"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "Autenticação de dois fatores"
@@ -28229,9 +28913,6 @@ msgstr "O seu nome foi definido automaticamente com base na sua conta do %{provi
msgid "Profiles|Your status"
msgstr "Seu status"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "por exemplo, Chave do meu MacBook"
-
msgid "Profiles|https://website.com"
msgstr "https://website.com"
@@ -28605,7 +29286,7 @@ msgid "ProjectService|The build configuration ID of the TeamCity project."
msgstr ""
msgid "ProjectService|The token you get after you create a Buildkite pipeline with a GitLab repository."
-msgstr ""
+msgstr "O token que você obtém depois de criar um pipeline Buildkite com um repositório GitLab."
msgid "ProjectService|To configure this integration, you should:"
msgstr ""
@@ -28614,7 +29295,7 @@ msgid "ProjectService|Token for the Drone project."
msgstr ""
msgid "ProjectService|Trigger event for new comments on confidential issues."
-msgstr ""
+msgstr "Evento de gatilho para novos comentários sobre issues confidenciais."
msgid "ProjectService|Trigger event for new comments."
msgstr "Evento de gatilho para novos comentários."
@@ -28641,10 +29322,10 @@ msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr "Evento de gatilho quando um alerta novo e exclusivo é registrado."
msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
-msgstr ""
+msgstr "Evento de gatilho quando uma nova vulnerabilidade única é gravada. (Nota: Esse recurso requer um plano Ultimate)"
msgid "ProjectService|Trigger event when a pipeline status changes."
-msgstr ""
+msgstr "Evento de gatilho quando o status de um pipeline é alterado."
msgid "ProjectService|Trigger event when a wiki page is created or updated."
msgstr "Evento de gatilho quando uma página da wiki é criada ou atualizada."
@@ -28710,7 +29391,7 @@ msgid "ProjectSettings|Customize this project's badges."
msgstr "Personalize os selos deste projeto."
msgid "ProjectSettings|Determine what happens to the commit history when you merge a merge request."
-msgstr ""
+msgstr "Determine o que acontece com o histórico de commit quando você mescla uma solicitação de mesclagem."
msgid "ProjectSettings|Disable email notifications"
msgstr "Desativar notificações por e-mail"
@@ -28736,8 +29417,8 @@ msgstr "Cada merge cria um commit de mesclagem."
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr "Cada projeto pode ter seu próprio espaço de armazenar suas imagens Docker"
-msgid "ProjectSettings|Every project can have its own space to store its packages."
-msgstr "Cada projeto pode ter seu próprio espaço de armazenar seus pacotes."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
+msgstr ""
msgid "ProjectSettings|Everyone"
msgstr "Todos"
@@ -28791,10 +29472,10 @@ msgid "ProjectSettings|LFS objects from this repository are available to forks.
msgstr ""
msgid "ProjectSettings|Learn about commit history."
-msgstr ""
+msgstr "Saiba mais sobre histórico de commits"
msgid "ProjectSettings|Leave empty to use default template."
-msgstr ""
+msgstr "Deixe em branco para usar o modelo padrão."
msgid "ProjectSettings|Manage who can see the project in the public access directory."
msgstr "Gerenciar quem pode ver o projeto no diretório de acesso público."
@@ -28803,7 +29484,7 @@ msgid "ProjectSettings|Manages large files such as audio, video, and graphics fi
msgstr "Gerencia arquivos grandes, como arquivos de áudio, vídeo e gráficos."
msgid "ProjectSettings|Maximum %{maxLength} characters."
-msgstr ""
+msgstr "Máximo de %{maxLength} caracteres."
msgid "ProjectSettings|Merge checks"
msgstr "Verificações de mesclagem"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr "Sugestões de mesclagem"
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr "Nenhum commit de mesclagem foi criado."
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr "Quando há um conflito de mesclagem, o usuário tem a opção de rebase."
@@ -29069,6 +29756,9 @@ msgstr "Pages/Hugo"
msgid "ProjectTemplates|Pages/Jekyll"
msgstr "Páginas/Jekyll"
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Páginas/HTML simples"
@@ -29087,9 +29777,6 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr "Editor de site estático/Middleman"
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr "Migre seus dados de uma fonte externa como GitHub, Bitbucket, ou outra i
msgid "ProjectsNew|No import options available"
msgstr "Nenhuma opção de importação disponível"
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr "Configuração do projeto"
@@ -29721,7 +30414,7 @@ msgid "ProtectedTags|default"
msgstr ""
msgid "ProtectedTag|By default, protected tags restrict who can modify the tag."
-msgstr ""
+msgstr "Por padrão, tags protegidas restringem quem pode modificar a tag."
msgid "ProtectedTag|Learn more."
msgstr "Saiba mais."
@@ -29843,7 +30536,10 @@ msgstr "Eventos de push"
msgid "Push project from command line"
msgstr "Fazer push do projeto por linha de comando"
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30027,7 +30723,7 @@ msgid "Read more about project permissions %{help_link_open}here%{help_link_clos
msgstr ""
msgid "Read more about related epics"
-msgstr ""
+msgstr "Leia mais sobre épicos relacionados"
msgid "Read more about related issues"
msgstr "Leia mais sobre issues relacionadas"
@@ -30170,7 +30866,7 @@ msgid "Regex pattern"
msgstr "Padrão Regex"
msgid "Region"
-msgstr ""
+msgstr "Região"
msgid "Regions"
msgstr ""
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr "Rejeitar"
+
msgid "Rejected (closed)"
msgstr "Rejeitado (fechado)"
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr "Feature flags relacionados"
@@ -30286,9 +30988,6 @@ msgstr "Issues relacionadas"
msgid "Related merge requests"
msgstr "Solicitações de mesclagem relacionadas"
-msgid "Related to #%{issue_id}."
-msgstr "Relacionado a #%{issue_id}."
-
msgid "Relates to"
msgstr "Relacionado com"
@@ -30519,6 +31218,9 @@ msgstr "Remover tempo gasto"
msgid "Remove time estimate"
msgstr "Remover estimativa de tempo"
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr "Remover usuário"
@@ -30631,7 +31333,7 @@ msgid "Removes time estimate."
msgstr "Remove o tempo estimado."
msgid "Removing this group also removes all child projects, including archived projects, and their resources."
-msgstr ""
+msgstr "A remoção deste grupo também remove todos os projetos filhos, incluindo projetos arquivados e seus recursos."
msgid "Rename file"
msgstr "Renomear arquivo"
@@ -30729,7 +31431,10 @@ msgstr "Denunciar abuso"
msgid "Report abuse to admin"
msgstr "Denunciar abuso ao administrador"
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr "Falha"
msgid "Reports|Filename"
msgstr "Nome do arquivo"
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr "Os relatórios de métricas estão sendo carregados"
@@ -30829,6 +31540,12 @@ msgstr "Os relatórios de métricas não mudaram"
msgid "Reports|Metrics reports failed loading results"
msgstr "Os relatórios de métricas falharam em carregar resultados"
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr "Resumo do teste"
msgid "Reports|Test summary failed loading results"
msgstr "Resumo do teste falhou ao carregar os resultados"
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "Os resultados do resumo de teste estão sendo analisados"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr "Ferramenta"
@@ -31357,7 +32080,7 @@ msgstr "Revisar alterações"
msgid "Review requests for you"
msgstr "Requisições de revisão atribuídos a você"
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr "adicionar uma"
msgid "RightSidebar|deleting the"
msgstr "excluir a"
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "Planejamento"
@@ -31473,10 +32193,10 @@ msgstr "Rodar tarefas sem tags"
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr "Executores online no momento: %{active_runners_count}"
msgid "Runners page."
msgstr "Página de executores."
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr "Ativo"
@@ -31506,7 +32242,7 @@ msgstr "Todos"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr "Comando para registrar o executor"
@@ -31546,7 +32294,12 @@ msgid "Runners|Copy instructions"
msgstr "Copiar instruções"
msgid "Runners|Copy registration token"
-msgstr ""
+msgstr "Copiar token de registro"
+
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|Delete runner"
msgstr ""
@@ -31554,6 +32307,9 @@ msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr "Descrição"
msgid "Runners|Details"
msgstr "Detalhes"
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr "Baixar e instalar o binário"
@@ -31572,18 +32331,12 @@ msgstr "Baixar o último binário"
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
msgstr ""
-msgid "Runners|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 ""
-
msgid "Runners|Group"
msgstr "Grupo"
msgid "Runners|IP Address"
msgstr "Endereço de 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 ""
-
msgid "Runners|Install a runner"
msgstr "Instalar um executor"
@@ -31591,7 +32344,7 @@ msgid "Runners|Instance"
msgstr "Instância"
msgid "Runners|Jobs"
-msgstr ""
+msgstr "Tarefas"
msgid "Runners|Last contact"
msgstr "Último contato"
@@ -31605,25 +32358,31 @@ msgstr "Tempo limite máximo da tarefa"
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr "Nome"
msgid "Runners|Never contacted"
msgstr ""
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
+msgstr "Visualização dos novos executores no grupo"
+
msgid "Runners|New registration token generated!"
msgstr "Novo token de registro gerado!"
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
-msgstr ""
-
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr "Executores offline"
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr "Executores online"
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr "Pausado"
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr "Plataforma"
@@ -31654,7 +32427,7 @@ msgid "Runners|Protected"
msgstr "Protegido"
msgid "Runners|Register a group runner"
-msgstr ""
+msgstr "Registrar um executor de grupo"
msgid "Runners|Register a project runner"
msgstr ""
@@ -31666,7 +32439,7 @@ msgid "Runners|Register an instance runner"
msgstr ""
msgid "Runners|Registration token"
-msgstr ""
+msgstr "Token de registro"
msgid "Runners|Registration token copied!"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr "Redefinir token"
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr "Revisão"
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr "Executor"
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr "Registro de executor"
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,11 +32522,11 @@ msgstr "Executores"
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
-msgstr ""
+msgstr "Mostrar instruções de instalação e registro do executor"
msgid "Runners|Show runner installation instructions"
msgstr ""
@@ -31729,9 +32538,12 @@ msgid "Runners|Something went wrong while fetching the tags suggestions"
msgstr ""
msgid "Runners|Stale"
-msgstr ""
+msgstr "Obsoleto"
msgid "Runners|Stale runners"
+msgstr "Executores obsoletos"
+
+msgid "Runners|Stale:"
msgstr ""
msgid "Runners|Status"
@@ -31743,18 +32555,21 @@ msgstr ""
msgid "Runners|Tags"
msgstr "Tags"
+msgid "Runners|Take me there!"
+msgstr "Leve-me lá!"
+
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
+msgstr "A nova visualização oferece mais espaço e melhor visibilidade da sua frota de executores."
+
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|This runner has not run any jobs."
msgstr ""
msgid "Runners|This runner is associated with specific projects."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
-msgstr ""
-
msgid "Runners|This runner is available to all projects and subgroups in a group."
msgstr ""
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr "Ver instruções de instalação do executor"
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 "Você usou %{quotaUsed} dos seus %{quotaLimit} minutos dos executores compartilhados."
@@ -31831,10 +32643,7 @@ msgid "Runners|specific"
msgstr "específicos"
msgid "Runners|stale"
-msgstr ""
-
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
+msgstr "obsoleto"
msgid "Running"
msgstr "Executando"
@@ -31950,10 +32759,10 @@ msgstr "Salvando"
msgid "Saving project."
msgstr "Salvando projeto."
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr "Pesquisar projetos"
msgid "Search projects..."
msgstr "Pesquisar projetos..."
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr "Pesquisar referência"
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr "Assentos"
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr "Detecção de secreto"
msgid "Secret token"
msgstr "Token secreto"
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,18 +33243,21 @@ msgstr "Estatísticas de vulnerabilidade de alto nível em projetos e grupos"
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 "Comece imediatamente a análise de risco e remediação com recursos de segurança da aplicação. Comece com SAST e detecção secreta, disponível para todos os planos. Atualize para o Ultimate para obter todos os recursos, incluindo:"
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr "Gerenciar corpus"
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
+msgid "SecurityConfiguration|Manage profiles"
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr "Gerenciar perfis para uso pelas verificações de DAST."
-msgid "SecurityConfiguration|Manage scans"
-msgstr "Gerenciar verificações"
-
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
msgstr "Mais tipos de verificação, incluindo verificação de contêiner, DAST, verificação de dependência, fuzzing e conformidade de licença"
@@ -32462,7 +33289,7 @@ msgid "SecurityConfiguration|Security training"
msgstr ""
msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
-msgstr ""
+msgstr "O status das ferramentas se aplica apenas na ramificação padrão e é baseado no %{linkStart}pipeline mais recente%{linkEnd}."
msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr "Atualize ou inicie uma avaliação grátis"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr "Todas as políticas"
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr "Descrição"
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr "Editar política"
msgid "SecurityOrchestration|Edit policy project"
msgstr "Editar projeto de política"
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr "Ativado"
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr "Aplicar segurança para este projeto. %{linkStart}Mais informações.%{linkEnd}"
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr "Rede"
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr "Nova política"
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr "Regras"
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr "Execução de verificação"
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr "Resultado da verificação"
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,12 +33522,15 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr "Status"
-msgid "SecurityOrchestration|Summary"
-msgstr "Resumo"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
+msgid "SecurityOrchestration|Summary"
+msgstr "Resumo"
+
msgid "SecurityOrchestration|There was a problem creating the new security policy"
msgstr ""
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr "Projetos adicionados"
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr "Definir status"
msgid "SecurityReports|Severity"
msgstr "Severidade"
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr "Status"
+msgid "SecurityReports|Submit vulnerability"
+msgstr ""
+
msgid "SecurityReports|Take survey"
msgstr "Responder pesquisa"
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
-msgid "SecurityReports|The security 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}."
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr "Pesquisa de funcionalidade de gerenciamento de vulnerabilidades"
msgid "SecurityReports|Vulnerability Report"
msgstr "Relatório de vulnerabilidade"
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr "Você não tem permissões suficientes para acessar esse relatório"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr "Selecionar Página"
msgid "Select a branch"
msgstr "Selecionar uma ramificação"
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Selecione uma estrutura de conformidade para aplicar a este projeto. %{linkStart}Saber mais.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
+msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr "Selecione um arquivo da barra lateral na esquerda para começar a editar. Depois, você poderá fazer commit das suas alterações."
-msgid "Select a group to invite"
-msgstr "Selecione um grupo para convidar"
-
msgid "Select a label"
msgstr "Selecione uma etiqueta"
@@ -33205,6 +34107,9 @@ msgstr "Selecionar assinatura"
msgid "Select target branch"
msgstr "Selecionar ramificação de destino"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr "Selecionar fuso horário"
@@ -33392,10 +34297,10 @@ msgid "Serverless|No functions available"
msgstr "Nenhuma função disponível"
msgid "Serverless|Serverless was %{linkStart}deprecated%{linkEnd} in GitLab 14.3."
-msgstr ""
+msgstr "Serverless foi %{linkStart}obsoleto%{linkEnd} no GitLab 14.3."
msgid "Serverless|Serverless was %{postLinkStart}deprecated%{postLinkEnd}. But if you opt to use it, you must install Knative in your Kubernetes cluster first. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Serverless foi %{postLinkStart}obsoleto%{postLinkEnd}. Mas se você optar por usá-lo, primeiro instale o Knative em seu cluster Kubernetes. %{linkStart}Saiba mais.%{linkEnd}"
msgid "Serverless|The deploy job has not finished."
msgstr "A tarefa de implantação ainda não terminou."
@@ -33434,7 +34339,7 @@ msgid "Service account generated successfully"
msgstr ""
msgid "Service accounts"
-msgstr ""
+msgstr "Contas de serviço"
msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr "Definir severidade"
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr "Definir estimativa de tempo"
@@ -33631,9 +34542,6 @@ msgstr "Define o peso para %{weight}."
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "Adicionar emoji de status"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr "Um indicador aparece ao lado do seu nome e avatar"
@@ -33820,7 +34728,7 @@ msgid "Show all issues."
msgstr "Mostrar todas as issues"
msgid "Show all milestones"
-msgstr ""
+msgstr "Mostrar todos os marcos"
msgid "Show all test cases."
msgstr "Mostrar todos os casos de teste"
@@ -33888,6 +34796,9 @@ msgstr "Mostra a lista fechada"
msgid "Show the Open list"
msgstr "Mostrar a lista aberta"
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr "Mostrar as alterações de espaço em branco"
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr "Conectado"
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr "Conectado ao GitLab como %{user_link}"
@@ -34226,6 +35140,9 @@ msgstr "Snowplow"
msgid "Solution"
msgstr "Solução"
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr "Algumas alterações não são exibidas"
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr "Alguns domínios comuns não são permitidos. %{learn_more_link}"
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr "Alguém editou a issue ao mesmo tempo que você. Por favor, verifique %{linkStart}a issue%{linkEnd} e tenha certeza de que suas alterações não irão intencionalmente remover as alterações da outra pessoa."
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr "Algo deu errado ao alternar o botão"
-
msgid "Something went wrong while adding your award. Please try again."
msgstr "Algo deu errado ao adicionar seu prêmio. Por favor, tente novamente."
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr "Algo deu errado ao atualizar os responsáveis"
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34686,7 +35600,7 @@ msgid "SourcegraphAdmin|Enable code intelligence powered by %{link_start}Sourceg
msgstr ""
msgid "SourcegraphAdmin|Learn more."
-msgstr ""
+msgstr "Saiba mais."
msgid "SourcegraphAdmin|Only public projects have code intelligence enabled and communicate with Sourcegraph."
msgstr ""
@@ -34833,6 +35747,9 @@ msgid "Start date"
msgstr "Data de início"
msgid "Start free trial"
+msgstr "Iniciar avaliação grátis"
+
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
msgstr ""
msgid "Start merge train"
@@ -34979,6 +35896,9 @@ msgstr "Status:"
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr "Branch de destino"
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr "Mantenha-se atualizado sobre o desempenho e a integridade do seu ambiente, configurando Prometheus para monitorar suas implantações."
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35385,7 +36305,7 @@ msgid "Subscriptions|Chat with sales"
msgstr ""
msgid "Subscriptions|Close"
-msgstr ""
+msgstr "Fechar"
msgid "Subscriptions|Not ready to buy yet?"
msgstr ""
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr "Enviar um arquivo de licença"
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr "Informações do Sistema"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr "Padrão do sistema (%{default})"
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr "Ramificação de destino"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr "Ramificação de destino"
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr "Conte-nos as suas experiências com o novo editor Markdown %{linkStart}nessa issue%{linkEnd}."
-
msgid "Template"
msgstr "Modelo"
@@ -36351,7 +37270,7 @@ msgid "Tests"
msgstr "Testes"
msgid "Text (optional)"
-msgstr ""
+msgstr "Texto (opcional)"
msgid "Text added to the body of all email messages. %{character_limit} character limit"
msgstr ""
@@ -36403,9 +37322,6 @@ msgstr ""
msgid "The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment."
msgstr "A exportação CSV será criada em segundo plano. Quando concluída, será enviada para %{email} em um anexo."
-msgid "The CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "O realçador de caracteres ajuda a manter a linha de assunto com %{titleLength} caracteres e quebra a linha do corpo em %{bodyLength} para que sejam legíveis no git."
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "A conexão expirará após %{timeout}. Para repositórios que demoram mais tempo, use a combinação clone/push."
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr "O conteúdo desta página não está codificado em UTF-8. Edições só podem ser feitas através do repositório Git."
@@ -36768,6 +37696,9 @@ msgstr "O projeto foi importado com sucesso."
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr "O espelho remoto levou muito tempo para ser concluído."
msgid "The remote repository is being updated..."
msgstr "O repositório remoto está sendo atualizado..."
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr "O repositório deve ser acessível em %{code_open}http://%{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 scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr "O snippet pode ser acessado sem nenhuma autenticação."
@@ -36810,6 +37750,9 @@ msgstr "O snippet está visível apenas para membros do projeto."
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -36910,7 +37853,7 @@ msgid "There are no charts configured for this page"
msgstr "Não há gráficos configurados para esta página"
msgid "There are no closed epics"
-msgstr ""
+msgstr "Não há épicos fechados"
msgid "There are no closed issues"
msgstr "Não há issues fechadas"
@@ -36934,7 +37877,7 @@ msgid "There are no matching files"
msgstr "Não há arquivos correspondentes"
msgid "There are no open epics"
-msgstr ""
+msgstr "Não há épicos aberos"
msgid "There are no open issues"
msgstr "Não há issues abertas"
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr "Essas variáveis são herdadas do grupo pai."
msgid "These will be sent to %{email} in an attachment once finished."
msgstr "Estes serão enviados para %{email} em um anexo quando terminado."
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "Essa %{issuable} está bloqueada. Somente os %{strong_open}membros do projeto%{strong_close} podem comentar."
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,14 +38230,14 @@ msgstr "Essa ação pode levar à perda de dados. Para evitar ações acidentais
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
-msgstr ""
+msgstr "Esta ação exclui %{codeOpen}%{project_path_with_namespace}%{codeClose} rm %{date} e tudo o que este projeto contém. %{strongOpen}Não há volta.%{strongClose}"
msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}immediately%{strongClose}."
msgstr ""
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr "Esta tarefa depende das tarefas do upstream que precisam ser bem-sucedidos para que essa tarefa seja acionada"
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr "Esta tarefa não possui rastreamento."
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Esta tarefa foi cancelada"
@@ -37708,7 +38666,7 @@ msgid "This project is %{strongStart}NOT%{strongEnd} a fork, and has the followi
msgstr "Este projeto %{strongStart}NÃO%{strongEnd} tem um fork e tem o seguinte:"
msgid "This project is %{strongStart}NOT%{strongEnd} a fork. This process deletes the project repository and all related resources."
-msgstr ""
+msgstr "Este projeto não tem %{strongStart}NÃO%{strongEnd} um fork. Esse processo exclui o repositório do projeto e todos os recursos relacionados."
msgid "This project is archived and cannot be commented on."
msgstr "Este projeto está arquivado e não pode ser comentado."
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Este usuário não pode ser desbloqueado manualmente a partir do GitLab"
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr "Para adicionar a entrada manualmente, forneça os seguintes detalhes ao aplicativo em seu telefone."
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr "Para receber alertas de serviços Prometheus configurados manualmente, adicione o URL e chaves de autorização a seguir ao seu arquivo de configuração de webhook do Prometheus. Saiba mais sobre %{linkStart}configuração do Prometheus%{linkEnd} para enviar alertas para o GitLab."
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr "Ativar/Desativar barra lateral"
msgid "Toggle the Performance Bar"
msgstr "Alternar a barra de desempenho"
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38510,7 +39474,7 @@ msgid "Token valid until revoked"
msgstr ""
msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
+msgstr "Escopos definem os níveis de permissão concedidos ao token."
msgid "Tokens|Select scopes"
msgstr "Selecionar escopos"
@@ -38536,6 +39500,9 @@ msgstr "O trópico %{topic_name} foi criado com sucesso."
msgid "Topic avatar"
msgstr "Avatar do tópico"
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr "Nome do tópico"
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr "Tente novamente"
msgid "Try again?"
msgstr "Tentar novamente?"
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "Use tudo que o GitLab tem para oferecer por 30 dias."
@@ -38963,7 +39936,7 @@ msgid "USER %{user} WILL BE REMOVED! Are you sure?"
msgstr ""
msgid "USER WILL BE BLOCKED! Are you sure?"
-msgstr ""
+msgstr "O USUÃRIO SERÃ BLOQUEADO! Tem certeza?"
msgid "UTC"
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ 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 "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr "Desaprovar uma solicitação de mesclagem"
@@ -39184,6 +40163,9 @@ msgstr "Desmarca este %{noun} como um rascunho."
msgid "Unreachable"
msgstr "Inacessível"
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr "Tipo de cluster não reconhecido"
@@ -39364,9 +40346,6 @@ msgstr "Enviar arquivo CSV"
msgid "Upload File"
msgstr "Enviar arquivo"
-msgid "Upload License"
-msgstr "Enviar licença"
-
msgid "Upload New File"
msgstr "Enviar Novo Arquivo"
@@ -39385,9 +40364,6 @@ msgstr "Enviar arquivo"
msgid "Upload image"
msgstr "Enviar imagem"
-msgid "Upload license"
-msgstr "Enviar licença"
-
msgid "Upload new file"
msgstr "Enviar novo arquivo"
@@ -39397,6 +40373,9 @@ msgstr "Enviar mapa de objetos"
msgid "UploadLink|click to upload"
msgstr "clique para fazer upload"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr "Enviando mudanças ao terminal"
@@ -39454,7 +40433,7 @@ msgstr "Uso do período atual"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr "Anexos de arquivo e gráficos de design menores."
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39518,7 +40497,7 @@ msgid "UsageQuota|Storage type"
msgstr "Tipo de armazenamento"
msgid "UsageQuota|Storage used"
-msgstr ""
+msgstr "Armazenamento usado"
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -39691,6 +40670,9 @@ msgstr "Usar .gitlab-ci.yml"
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr "Use um autenticador de senha única no seu dispositivo móvel ou computador para habilitar a autenticação de dois fatores (A2F)."
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr "Usar cURL"
@@ -40507,9 +41492,6 @@ msgstr "Ver arquivo substituído @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr "Ver configuração"
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr "Visto"
msgid "Viewing commit"
msgstr "Vendo commit"
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40586,7 +41571,7 @@ msgid "Vulnerabilities over time"
msgstr "Vulnerabilidades ao longo do tempo"
msgid "Vulnerability"
-msgstr ""
+msgstr "Vulnerabilidade"
msgid "Vulnerability Report"
msgstr "Relatório de vulnerabilidade"
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr "Classe"
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr "Aguardando a mesclagem (aberta e atribuída)"
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr "Eventos da página Wiki"
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr "Site:"
@@ -41293,9 +42287,6 @@ 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?"
-msgid "What are you searching for?"
-msgstr "O que você esta pesquisando?"
-
msgid "What does this command do?"
msgstr "O que este comando faz?"
@@ -41338,13 +42329,13 @@ msgstr "Quando um executor está bloqueado, não pode ser atribuído a outros pr
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr "Quando usar os protocolos %{code_open}http://%{code_close} ou %{code_open}https://%{code_close}, por favor forneça o URL exato do repositório. Redirecionamentos HTTP não serão seguidos."
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr "Quando:"
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr "Tem certeza de que deseja voltar para o editor clássico?"
-
msgid "WikiPage|Cancel"
msgstr "Cancelar"
@@ -41535,12 +42526,6 @@ msgstr "Editar fonte"
msgid "WikiPage|Format"
msgstr "Formato"
-msgid "WikiPage|Get a richer editing experience"
-msgstr "Obtenha uma experiência de edição mais rica"
-
-msgid "WikiPage|Keep editing"
-msgstr "Manter edição"
-
msgid "WikiPage|Learn more."
msgstr "Saiba mais."
@@ -41553,18 +42538,6 @@ msgstr "Tentar novamente"
msgid "WikiPage|Save changes"
msgstr "Salvar alterações"
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr "Voltar para o editor clássico."
-
-msgid "WikiPage|Switch to classic editor"
-msgstr "Voltar para o editor clássico"
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-msgstr "Voltar para o editor clássico descartará todas as alterações feitas no novo 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 "Este editor está em beta e pode não exibir o conteúdo da página corretamente. Mudar de volta para o editor clássico irá descartar as alterações feitas no novo editor."
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr "Título"
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr "Para criar um link para uma (nova) página, simplesmente digitar %{linkExample}. Mais exemplos estão na %{linkStart}documentação%{linkEnd}."
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr "Experimente o novo editor Markdown visual. Leia a %{linkStart}documentação%{linkEnd} para saber o que atualmente é suportado."
-
-msgid "WikiPage|Try this later"
-msgstr "Experimentar mais tarde"
-
msgid "WikiPage|Update %{pageTitle}"
msgstr "Atualização de %{pageTitle}"
-msgid "WikiPage|Use the new editor"
-msgstr "Usar o novo editor"
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "Escreva seu conteúdo ou arraste arquivos aqui…"
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41713,7 +42683,7 @@ msgid "Xcode"
msgstr "Xcode"
msgid "YYYY-MM-DD"
-msgstr ""
+msgstr "AAAA-MM-DD"
msgid "Yes"
msgstr "Sim"
@@ -41743,10 +42713,10 @@ msgid "You are about to add %{usersTag} people to the discussion. They will all
msgstr ""
msgid "You are about to delete this forked project containing:"
-msgstr ""
+msgstr "Você está prestes a excluir este projeto com fork que contém:"
msgid "You are about to delete this project containing:"
-msgstr ""
+msgstr "Você está prestes a excluir este projeto que contém:"
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
msgstr "Você está prestes a transferir o controle da sua conta para o grupo %{group_name} . Esta ação NÃO é reversível, você não poderá acessar nenhum dos seus grupos e projetos fora do %{group_name} assim que a transferência for concluída."
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr "Você pode editar isto depois"
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41935,7 +42911,7 @@ msgid "You can get started by cloning the repository or start adding files to it
msgstr ""
msgid "You can group test cases using labels. To learn about the future direction of this feature, visit %{linkStart}Quality Management direction page%{linkEnd}."
-msgstr ""
+msgstr "Você pode agrupar casos de teste usando etiquetas. Para saber mais sobre a direção futura desse recurso, visite %{linkStart}direção de gerenciamento de qualidade página%{linkEnd}."
msgid "You can invite a new member to %{project_name} or invite another group."
msgstr "Você pode convidar um novo membro para %{project_name} ou convidar outro grupo."
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr "Você só pode editar arquivos quando estiver em uma ramificação"
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr "Você só pode transferir o projeto para espaços de nome que você gerencia."
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "Você não pode acessar o arquivo bruto. Por favor, aguarde um minuto."
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr "Você não tem nenhuma pesquisa recente"
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr "Você não tem permissões suficientes para ver turnos para esta rotação"
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42270,7 +43255,7 @@ msgid "You will first need to set up Jira Integration to use this feature."
msgstr "Primeiro, você precisa configurar a integração com o Jira para usar este recurso."
msgid "You will lose all changes you've made to this file. This action cannot be undone."
-msgstr ""
+msgstr "Você perderá todas as mudanças feitas neste arquivo. Esta ação não pode ser desfeita."
msgid "You will lose all uncommitted changes you've made in this project. This action cannot be undone."
msgstr ""
@@ -42353,6 +43338,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42801,7 +43792,7 @@ msgid "archived:"
msgstr ""
msgid "artifacts"
-msgstr ""
+msgstr "artefatos"
msgid "assign yourself"
msgstr ""
@@ -42833,7 +43824,7 @@ msgid "branch name"
msgstr "nome da branch"
msgid "builds"
-msgstr ""
+msgstr "construções"
msgid "by"
msgstr "por"
@@ -42913,6 +43904,11 @@ msgstr "não é possível bloquear a si próprio"
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "Gerenciar licenças"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "Sem mudanças na qualidade do código"
@@ -43198,45 +44218,6 @@ msgstr "fechado"
msgid "closed issue"
msgstr "issue fechada"
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr "usuários elegíveis"
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "habilitado"
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "solicitação de mesclagem"
@@ -43718,10 +44707,10 @@ msgid "mrWidgetCommitsAdded|1 merge commit"
msgstr "1 merge commit"
msgid "mrWidgetCommitsAdded|Adds %{commitCount} and %{mergeCommitCount} to %{targetBranch}%{squashedCommits}."
-msgstr ""
+msgstr "Adiciona %{commitCount} e %{mergeCommitCount} to %{targetBranch}%{squashedCommits}."
msgid "mrWidgetCommitsAdded|Adds %{commitCount} to %{targetBranch}."
-msgstr ""
+msgstr "Adiciona %{commitCount} para %{targetBranch}."
msgid "mrWidgetNothingToMerge|This merge request contains no changes."
msgstr "Essa solicitação de mesclagem não contém alterações"
@@ -43792,6 +44781,12 @@ msgstr "Aprovado por você"
msgid "mrWidget|Approved by you and others"
msgstr "Aprovado por você e outros"
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr "Cancelar mesclagem automática"
@@ -43825,7 +44820,7 @@ msgid "mrWidget|Delete source branch"
msgstr "Excluir branch de origem"
msgid "mrWidget|Deletes the source branch"
-msgstr ""
+msgstr "Excluir ramificação de origem"
msgid "mrWidget|Deployment statistics are not available currently"
msgstr "Estatísticas de implantação não estão disponíveis atualmente"
@@ -43837,7 +44832,7 @@ msgid "mrWidget|Dismiss"
msgstr "Dispensar"
msgid "mrWidget|Does not delete the source branch"
-msgstr ""
+msgstr "Não exclui a ramificação de origem"
msgid "mrWidget|Email patches"
msgstr "Email patches"
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "Falha ao mesclar."
-msgid "mrWidget|Merge locally"
-msgstr "Mesclar localmente"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43920,10 +44912,10 @@ msgid "mrWidget|Merges changes into"
msgstr "Mescla as alterações em"
msgid "mrWidget|Merging! Changes are being shipped…"
-msgstr ""
+msgstr "Mesclando! As alterações estão sendo enviadas…"
msgid "mrWidget|Merging! Changes will land soon…"
-msgstr ""
+msgstr "Mesclando! As mudanças chegarão em breve…"
msgid "mrWidget|Merging! Drum roll, please…"
msgstr ""
@@ -43932,13 +44924,13 @@ msgid "mrWidget|Merging! Everything's good…"
msgstr ""
msgid "mrWidget|Merging! Lift-off in 5… 4… 3…"
-msgstr ""
+msgstr "Mesclando! Decolagem em 5… 4… 3…"
msgid "mrWidget|Merging! Take a deep breath and relax…"
-msgstr ""
+msgstr "Mesclando! Respire fundo e relaxe…"
msgid "mrWidget|Merging! The changes are leaving the station…"
-msgstr ""
+msgstr "Mesclando! As mudanças estão saindo da estação…"
msgid "mrWidget|Merging! This is going to be great…"
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr "Solicitar mesclagem"
msgid "mrWidget|Resolve conflicts"
msgstr "Resolver conflitos"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "Reverter"
@@ -44034,7 +45029,7 @@ msgid "mrWidget|To change these default messages, edit the templates for both th
msgstr ""
msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Para alterar esta mensagem padrão, edite o modelo para mensagens de commit de mesclagem. %{linkStart}Saiba mais.%{linkEnd}"
msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr "meu-grupo-incrível"
msgid "my-channel"
msgstr "meu-canal"
-msgid "n/a"
-msgstr "n/a"
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr "issue aberta"
msgid "or"
msgstr "ou"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44177,7 +45172,7 @@ msgid "packages"
msgstr ""
msgid "pages"
-msgstr ""
+msgstr "páginas"
msgid "parent"
msgid_plural "parents"
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr "imagem do projeto"
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44329,7 +45321,7 @@ msgstr[0] "resposta"
msgstr[1] "respostas"
msgid "repositories"
-msgstr ""
+msgstr "repositórios"
msgid "repository:"
msgstr "repositório:"
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index 3b5ea1b40f6..b78303533c3 100644
--- a/locale/pt_PT/gitlab.po
+++ b/locale/pt_PT/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: pt-PT\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr " Por favor, inicia a sessão."
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr " Tenta %{action} este ficheiro novamente."
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Tens de fazer isto antes de %{grace_period_deadline}."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "mais %d comentário"
msgstr[1] "mais %d comentários"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} será removido! Tens a certeza?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr "%{level_name} não é permitido uma vez que o projeto de origem do fork
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "Um novo token de representação foi criado."
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr "Sobre a implantação automática"
msgid "About this feature"
msgstr "Sobre este recurso"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Relatórios de Abuso"
@@ -1827,9 +1851,6 @@ msgstr "Acesso negado à tua conta LDAP."
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr "Data de expiração do acesso"
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr "Adicionar cluster Kubernetes"
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr "Adicionar comentário agora"
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr "Apagar o Projeto %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domínio Auto DevOps"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr "Configuração de pipeline necessária"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Permitir apenas, que os protocolos selecionados sejam usados para acessar o Git."
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "Ocorreu um erro ao pré-visualizar o blob"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr "Ocorreu um erro ao analisar pesquisas recentes"
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "Ocorreu um erro ao remover épicos."
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "Ocorreu um erro inesperado ao verificar o ambiente do projeto."
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr "Qualquer espaço de nome"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "Tens a certeza de que desejas arquivar este projeto?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "Tens a certeza de que desejas desarquivar este projeto?"
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr "Atribuir-te a estes problemas"
-
-msgid "Assign yourself to this issue"
-msgstr "Atribuir-te esta tarefa"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr "Falha ao anexar o ficheiro."
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr "Eventos de Auditoria"
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "ago"
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "Os teus emblemas"
-msgid "Balsamiq file could not be loaded."
-msgstr "O ficheiro Balsamiq não pôde ser carregado."
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr "Para gerir o plano para este grupo, visita a secção de faturação de
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Ramo já está a ser usado"
@@ -6133,9 +6310,6 @@ msgstr "Mensagem de transmissão atualizada com sucesso."
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Procurar Diretório"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr "Isto irá criar um envio para reverter as alterações existentes."
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr "Todos os ambientes"
msgid "CiVariable|Create wildcard"
msgstr "Criar caractere especial"
-msgid "CiVariable|Masked"
-msgstr "Mascarado"
-
msgid "CiVariable|New environment"
msgstr "Novo ambiente"
-msgid "CiVariable|Protected"
-msgstr "Protegido"
-
msgid "CiVariable|Search environments"
msgstr "Pesquisar ambientes"
-msgid "CiVariable|Toggle masked"
-msgstr "Alternar mascarado"
-
-msgid "CiVariable|Toggle protected"
-msgstr "Alternar protegido"
-
msgid "Classification Label (optional)"
msgstr "Etiqueta de classificação (opcional)"
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr "Limpar entrada de pesquisa de modelos"
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr "Limpar peso"
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr "A URL da API deve ser válida http/https url."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Adicionar cluster Kubernetes"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Adicionar uma integração de cluster Kubernetes"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "Adicionar um cluster de Kubernetes ao teu grupo, automaticamente, irá compartilhar, o cluster em todos os teus projetos. Utiliza aplicações de análise, implementa as tuas aplicações, e executa facilmente os teus pipelines para todos os projetos que utilizam o mesmo cluster."
@@ -8052,10 +8268,7 @@ msgstr "O nome do cluster é obrigatório."
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Criar cluster de Kubernetes"
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr "Ativar ou desativar a conexão do GitLab com o teu cluster de Kubernetes
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Ativar esta definição, se ao usar o controlo de acesso baseado em funções (RBAC)."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "Alcance de ambiente"
@@ -8220,9 +8430,6 @@ msgstr "Cluster de grupo"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
-msgstr "Se estás a configurar múltiplos clusters e estás a usar o Auto DevOps, %{help_link_start}lê isto primeiro%{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -8268,8 +8475,8 @@ msgstr "Aprende mais sobre %{help_link_start_machine_type}tipos de máquina%{hel
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "Aprende mais sobre %{help_link_start}zonas%{help_link_end}."
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "Aprende mais sobre os Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "Aprende mais sobre os clusters do Kubernetes de grupo"
@@ -8361,9 +8568,6 @@ msgstr "Número de nós"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr "O número de nós, deve ser um valor numérico."
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Por favor, certifica-te de que a tua conta Google cumpre com os seguintes requisitos:"
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr "Não foi possível verificar se um dos teus projetos no GCP possui o fat
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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr "Configurar instalação existente"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ 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|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Importar vários repositórios ao enviar um ficheiro de manifesto."
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr "Não foi possível guardar a ordem dos problemas"
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Apagar objetivo"
@@ -23687,6 +24311,9 @@ msgstr "O objetivo %{milestoneTitle} não foi encontrado"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "Esta ação não pode ser revertida."
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr "Nenhum objetivo para mostrar"
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
+msgstr ""
+
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr "Enviar ficheiro CSV"
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "Enviar Novo Ficheiro"
@@ -39385,9 +40364,6 @@ msgstr "Enviar ficheiro"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr "Enviar mapa de objetos"
msgid "UploadLink|click to upload"
msgstr "clica para enviar"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index 535f1d1bb2a..95fce14648a 100644
--- a/locale/ro_RO/gitlab.po
+++ b/locale/ro_RO/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ro\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:35\n"
+"PO-Revision-Date: 2022-04-01 09:09\n"
msgid " %{start} to %{end}"
msgstr " de la %{start} până la %{end}"
@@ -23,20 +23,14 @@ msgid " (from %{timeoutSource})"
msgstr " (de la %{timeoutSource})"
msgid " Collected %{time}"
-msgstr " %{time} colectat"
+msgstr " Colectat %{time}"
msgid " Please sign in."
msgstr " Vă rugăm să vă autentificați."
-msgid " Target Path"
-msgstr " Calea țintă"
-
msgid " Try to %{action} this file again."
msgstr " Încercați să %{action} acest fișier din nou."
-msgid " Type"
-msgstr " Tip"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Trebuie să faceți asta înainte de %{grace_period_deadline}."
@@ -56,7 +50,7 @@ msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
msgstr " sau %{emphasisStart}#ID problemă%{emphasisEnd}"
msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
-msgstr " sau %{emphasisStart}&epic id%{emphasisEnd}"
+msgstr " sau %{emphasisStart}&ID epică%{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)"
@@ -65,13 +59,13 @@ msgid " reacted with :%{name}:"
msgstr " a reacționat cu :%{name}:"
msgid "\"%{path}\" did not exist on \"%{ref}\""
-msgstr "\"%{path}\" nu a existat pe \"%{ref}\""
+msgstr "\"%{path}\" nu există pe „%{ref}â€"
msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
msgstr "\"%{repository_name}\" dimensiunea (%{repository_size}) este mai mare decât limita de %{limit}."
msgid "#%{issueIid} (closed)"
-msgstr ""
+msgstr "#%{issueIid} (închis)"
msgid "#general, #development"
msgstr "#general, #development"
@@ -80,13 +74,13 @@ msgid "%d Alert"
msgid_plural "%d Alerts"
msgstr[0] "%d Alertă"
msgstr[1] "%d Alerte"
-msgstr[2] "%d Alerte"
+msgstr[2] "%d de Alerte"
msgid "%d Alert:"
msgid_plural "%d Alerts:"
msgstr[0] "%d Alertă:"
msgstr[1] "%d Alerte:"
-msgstr[2] "%d Alerte:"
+msgstr[2] "%d de Alerte:"
msgid "%d Approval"
msgid_plural "%d Approvals"
@@ -180,9 +174,9 @@ msgstr[2] "%d de caractere rămase"
msgid "%d child epic"
msgid_plural "%d child epics"
-msgstr[0] "%d epic copil"
-msgstr[1] "%d epici copil"
-msgstr[2] "%d de epici copil"
+msgstr[0] "%d epică copil"
+msgstr[1] "%d epice copil"
+msgstr[2] "%d de epice copil"
msgid "%d code quality issue"
msgid_plural "%d code quality issues"
@@ -252,9 +246,9 @@ msgstr[2] "%d de zile"
msgid "%d epic"
msgid_plural "%d epics"
-msgstr[0] "%d epic"
-msgstr[1] "%d epici"
-msgstr[2] "%d de epici"
+msgstr[0] "%d epică"
+msgstr[1] "%d epice"
+msgstr[2] "%d de epice"
msgid "%d error"
msgid_plural "%d errors"
@@ -394,6 +388,12 @@ msgstr[0] "Încă %d comentariu"
msgstr[1] "Încă %d comentarii"
msgstr[2] "Încă %d de comentarii"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d problemă deschisă"
@@ -408,9 +408,15 @@ msgstr[2] "%d de comentarii în așteptare"
msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
-msgstr[0] "%d proiectul personal va fi eliminat și nu va putea fi restaurat."
-msgstr[1] "%d proiecte personale vor fi eliminate și nu vor putea fi restaurate."
-msgstr[2] "%d de proiecte personale vor fi eliminate și nu vor putea fi restaurate."
+msgstr[0] "%d proiectul personal va fi înlăturat și nu va putea fi restaurat."
+msgstr[1] "%d proiecte personale vor fi înlăturate și nu vor putea fi restaurate."
+msgstr[2] "%d de proiecte personale vor fi înlăturate și nu vor putea fi restaurate."
+
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] "%d punct"
+msgstr[1] "%d puncte"
+msgstr[2] "%d de puncte"
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
@@ -430,11 +436,11 @@ msgstr[0] "%d proiect selectat"
msgstr[1] "%d proiecte selectate"
msgstr[2] "%d de proiecte selectate"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d cerere cu avertismente"
-msgstr[1] "%d cereri cu avertismente"
-msgstr[2] "%d de cereri cu avertismente"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -544,9 +550,6 @@ msgstr ""
msgid "%{address} is an invalid IP address range"
msgstr "%{address} este un interval de adrese IP invalid"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "%{anchorOpen}Învățați mai multe%{anchorClose} despre modul în care puteți personaliza / dezactiva înregistrarea în instanța dvs."
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link} a clonat %{original_issue} în %{new_issue}."
@@ -557,7 +560,7 @@ msgid "%{author_link} wrote:"
msgstr "%{author_link} a scris:"
msgid "%{authorsName}'s thread"
-msgstr "Subiectul lui %{authorsName}"
+msgstr "Subiect scris de %{authorsName}"
msgid "%{board_target} not found"
msgstr "%{board_target} nu a fost găsit"
@@ -581,7 +584,7 @@ msgstr[1] "%{bold_start}%{count}%{bold_end} cereri de îmbinare deschise"
msgstr[2] "%{bold_start}%{count}%{bold_end} de cereri de îmbinare deschise"
msgid "%{codeStart}type%{codeEnd} is deprecated and will be removed in 15.0. Use %{codeStart}stage%{codeEnd} instead. %{linkStart}Learn More %{linkEnd}"
-msgstr ""
+msgstr "%{codeStart}type%{codeEnd} este depreciat și va fi înlăturat în 15.0. Utilizați în schimb %{codeStart}stagiu%{codeEnd}. %{linkStart}Aflați mai multe %{linkEnd}"
msgid "%{codeStart}types%{codeEnd} is deprecated and will be removed in 15.0. Use %{codeStart}stages%{codeEnd} instead. %{linkStart}Learn More %{linkEnd}"
msgstr ""
@@ -620,7 +623,7 @@ msgid "%{cores} cores"
msgstr "%{cores} nuclee"
msgid "%{count} %{scope} for term '%{term}'"
-msgstr "%{count} %{scope} pentru termenul '%{term}'"
+msgstr "%{count} %{scope} pentru termenul „%{term}â€"
msgid "%{count} LOC/commit"
msgstr "%{count} LOC/commit"
@@ -689,10 +692,10 @@ msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} Hi
msgstr "%{criticalStart}%{critical} Critic%{criticalEnd} %{highStart}%{high} Înalt%{highEnd} și %{otherStart}%{otherMessage}%{otherEnd}"
msgid "%{dashboard_path} could not be found."
-msgstr "%{dashboard_path} nu a putut fi găsit."
+msgstr "%{dashboard_path} nu a putut fi găsită."
msgid "%{days} days until tags are automatically removed"
-msgstr "%{days} zile până când etichetele sunt eliminate automat"
+msgstr "%{days} zile până când etichetele sunt înlăturate automat"
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 "%{deployLinkStart}Folosește un șablon pentru a implementa în ECS%{deployLinkEnd}, sau folosește o imagine docker pentru a%{commandsLinkStart}executa comenzi AWS în GitLab CI/CD%{commandsLinkEnd}."
@@ -707,7 +710,7 @@ 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 "%{docs_link_start}Aflați mai multe despre nivelurile de vizibilitate.%{docs_link_end}"
+msgstr "%{docs_link_start}Aflați mai multe despre nivelele de vizibilitate.%{docs_link_end}"
msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
msgstr "%{docs_link_start}Ce este Large File Storage?%{docs_link_end}"
@@ -728,7 +731,7 @@ msgid "%{edit_in_new_fork_notice} Try to create a new directory again."
msgstr "%{edit_in_new_fork_notice} Încercați să creați iar un director nou."
msgid "%{edit_in_new_fork_notice} Try to revert this commit again."
-msgstr "%{edit_in_new_fork_notice} Încercați să reveniți din nou la acest commit."
+msgstr "%{edit_in_new_fork_notice} Încercați să reveniți încă o dată acest commit."
msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Încercați să încărcați iar un fișier."
@@ -758,10 +761,10 @@ msgid "%{global_id} is not a valid ID for %{expected_types}."
msgstr "%{global_id} nu este un ID valid pentru %{expected_types}."
msgid "%{group_name} activity"
-msgstr "%{group_name} activitate"
+msgstr "Activitatea %{group_name}"
msgid "%{group_name} group members"
-msgstr "%{group_name} membri ai grupului"
+msgstr "Membrii grupului %{group_name}"
msgid "%{group_name} is approaching the limit of available seats"
msgstr ""
@@ -785,7 +788,10 @@ 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! Sunteți sigur?"
+msgstr "%{issuableType} va fi înlăturat! Sunteți sigur?"
+
+msgid "%{issuable}(s) already assigned"
+msgstr "%{issuable}(s) s-a/s-au atribuit deja"
msgid "%{issueType} actions"
msgstr "%{issueType} acțiuni"
@@ -800,7 +806,7 @@ msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} probleme cu o limită de %{maxIssueCount}"
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
-msgstr "%{labelStart}Răspunsul real:%{labelEnd} %{headers}"
+msgstr "%{labelStart}Răspunsul actual:%{labelEnd} %{headers}"
msgid "%{labelStart}Assert:%{labelEnd} %{assertion}"
msgstr "%{labelStart}Assert:%{labelEnd} %{assertion}"
@@ -812,7 +818,7 @@ msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr "%{labelStart}Adresa conflictului:%{labelEnd} %{crash_address}"
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
-msgstr "%{labelStart}Stare de avarie:%{labelEnd} %{stacktrace_snippet}"
+msgstr "%{labelStart}Starea de avarie:%{labelEnd} %{stacktrace_snippet}"
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Evidență:%{labelEnd} %{evidence}"
@@ -839,7 +845,7 @@ msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
msgstr "%{labelStart}Severitate:%{labelEnd} %{severity}"
msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
-msgstr "%{labelStart}Unealtă:%{labelEnd} %{reportType}"
+msgstr "%{labelStart}Instrument:%{labelEnd} %{reportType}"
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Răspuns nemodificat:%{labelEnd} %{headers}"
@@ -848,7 +854,7 @@ msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} indisponibil"
msgid "%{learn_more_link}."
-msgstr "%{learn_more_link}"
+msgstr "%{learn_more_link}."
msgid "%{lessThan} 1 hour"
msgstr "%{lessThan} 1 oră"
@@ -865,17 +871,14 @@ msgstr "%{level_name} nu este permis, deoarece proiectul sursă al bifurcației
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "%{link_start}Învățați mai multe%{link_end} despre roluri."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr "%{link_start}Adăugați o licență%{link_end} pe care ați primit-o de la GitLab Inc."
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr "%{link_start}Eliminați %{draft_snippet} prefixul%{link_end} din titlu pentru a permite ca acest merge request să fie îmbinat când este gata."
+msgstr "%{link_start}Înlăturați %{draft_snippet} prefixul%{link_end} din titlu pentru a permite ca acest merge request să fie îmbinat atunci când este gata."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
-msgstr ""
-
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
+msgstr "%{link_start}Începeți titlul cu %{draft_snippet}%{link_end} pentru a preveni ca un proiect de merge request să se îmbine înainte de a fi gata."
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr "%{link_start}Ce informații colectează GitLab Inc.?%{link_end}"
@@ -890,7 +893,7 @@ msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} este blocat de utilizatorul GitLab %{lock_user_id}"
msgid "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} and %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd} are supported"
-msgstr "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} și %{quickActionsDocsLinkStart}acțiuni rapide%{quickActionsDocsLinkEnd} sunt acceptate"
+msgstr "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} și %{quickActionsDocsLinkStart}acțiunile rapide%{quickActionsDocsLinkEnd} sunt acceptate"
msgid "%{mergeLength}/%{usersLength} can merge"
msgstr "%{mergeLength}/%{usersLength} poate îmbina"
@@ -911,10 +914,10 @@ msgid "%{mrText}, this issue will be closed automatically."
msgstr "%{mrText}, această problemă va fi închisă automat."
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 "Spațiul de nume %{name_with_link} are %{percent} sau mai puține minute Shared Runner Pipeline rămase. Odată ce se termină, nu se vor executa noi joburi sau conducte în proiectele sale."
+msgstr "Spațiul de nume %{name_with_link} are %{percent} sau mai puțin din minutele de Pipeline pentru Executorii Partajați rămase. Odată ce se termină, nu se vor mai executa noi joburi sau pipeline-uri în proiectele sale."
msgid "%{name_with_link} namespace has run out of Shared Runner Pipeline minutes. No new jobs or pipelines in its projects will run."
-msgstr "Spațiul de nume %{name_with_link} a rămas fără minute Shared Runner Pipeline. Nu vor exista noi lucrări sau conducte în proiectele sale."
+msgstr "Spațiul de nume %{name_with_link} a rămas fără minute de Pipeline pentru Executorii Partajați. Niciun job nou sau conducte în proiectele sale nu vor funcționa."
msgid "%{name} (Busy)"
msgstr "%{name} (Ocupat)"
@@ -938,14 +941,17 @@ msgid "%{name}'s avatar"
msgstr "Avatarul lui %{name}"
msgid "%{name}(%{url}) namespace has %{percent} or less Shared Runner Pipeline minutes remaining. After it runs out, no new jobs or pipelines in its projects will run."
-msgstr "Spațiul de nume %{name}(%{url}) are %{percent} sau mai puține minute Shared Runner Pipeline rămase. Odată ce se termină, nu vor mai exista noi joburi sau conducte în proiectele sale."
+msgstr "Spațiul de nume %{name}(%{url}) are %{percent} sau mai puține minute rămase de Pipeline pentru Executorii Partajați. Niciun job nou sau conducte în proiectele sale nu vor funcționa."
msgid "%{name}(%{url}) namespace has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
-msgstr "Spațiul de nume %{name}(%{url}) a rămas fără minute Shared Runner Pipeline, astfel încât nu vor exista noi joburi sau conducte în proiectele sale."
+msgstr "Spațiul de nume %{name}(%{url}) a rămas fără minute de Pipeline pentru Executorii Partajați, astfel încât niciun job nou sau conducte în proiectele sale nu vor funcționa."
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, confirmați-vă adresa de e-mail acum!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} zi"
@@ -1019,16 +1025,16 @@ msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}att
msgstr "%{retryButtonStart}Încercați din nou%{retryButtonEnd} sau %{newFileButtonStart}atașați un nou fișier%{newFileButtonEnd}."
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation_link}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr "%{rotation} a fost recalculat cu participanții rămași. Vă rugăm să examinați noua configurare pentru %{rotation_link}. Este recomandat să luați legătura cu respondentul de apel curent pentru a asigura continuitatea acoperirii de apel."
+msgstr "%{rotation} a fost recalculată cu participanții rămași. Vă rugăm să consultați noua configurație pentru %{rotation_link}. Se recomandă să luați legătura cu actualul respondent la apel pentru a asigura continuitatea acoperirii serviciului la apel."
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr "%{rotation} a fost recalculat cu participanții rămași. Vă rugăm să 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."
+msgstr "%{rotation} a fost recalculată cu participanții rămași. Vă rugăm să consultați noua configurație pentru %{rotation}. Se recomandă să luați legătura cu actualul respondent la apel pentru a asigura continuitatea serviciului la apel."
msgid "%{runner} created %{timeago}"
msgstr ""
msgid "%{scope} results for term '%{term}'"
-msgstr "%{scope} rezultate pentru termenul '%{term}'"
+msgstr "%{scope} rezultate pentru termenul „%{term}â€"
msgid "%{search} %{description} %{scope}"
msgstr ""
@@ -1081,11 +1087,20 @@ msgstr "%{spanStart}în%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "de la %{start} până la %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] "%{strongOpen}%{errors}%{strongClose} punct"
+msgstr[1] "%{strongOpen}%{errors}%{strongClose} puncte"
+msgstr[2] "%{strongOpen}%{errors}%{strongClose} de puncte"
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}Avertisment:%{strongClose} Link-urile grupului SAML pot determina GitLab să elimine automat membrii din grupuri."
+msgstr "%{strongOpen}Avertisment:%{strongClose} Linkurile de grup SAML pot face ca GitLab să înlăture automat membrii din grupuri."
-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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr "%{strongStart}Trebuie să acordați atenție%{strongEnd} merge request-urile care au nevoie de ajutorul dvs. pentru a merge mai departe, în calitate de responsabil sau recenzent."
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgstr "%{strongStart}Sfat:%{strongEnd} De asemenea, puteți verifica merge request-urile la nivel local. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -1139,7 +1154,7 @@ msgid "%{tabname} changed"
msgstr "%{tabname} schimbat"
msgid "%{tags} tag per image name"
-msgstr "%{tags} etichetă pentru fiecare nume de imagine"
+msgstr "%{tags} etichetă pe nume de imagine"
msgid "%{tags} tags per image name"
msgstr "%{tags} etichete pe nume de imagine"
@@ -1196,7 +1211,7 @@ msgid "%{userName}'s avatar"
msgstr "Avatarul lui %{userName}"
msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedule} in %{project}. "
-msgstr "%{user_name} (%{user_username}) a fost îndepărtat de la %{rotation} la %{schedule} la %{project}. "
+msgstr "%{user_name} (%{user_username}) a fost înlăturat din %{rotation} în %{schedule} din %{project}. "
msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project_link}: "
msgstr ""
@@ -1208,7 +1223,7 @@ msgid "%{user_name} profile page"
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}"
+msgstr "%{username} a schimbat statutul de schiță al merge request-ului %{mr_link}"
msgid "%{username} has asked for a GitLab account on your instance %{host}:"
msgstr "%{username} a solicitat un cont GitLab în instanța dvs. %{host}:"
@@ -1256,7 +1271,7 @@ msgid "'%{data}' at %{location} is invalid: error_type=%{type}"
msgstr "'%{data}' la %{location} nu este valid: error_type=%{type}"
msgid "'%{data}' at %{location} is not of type: %{type}"
-msgstr "'%{data}' la %{location} nu este de tipul: %{type}"
+msgstr "„%{data}†de la %{location} nu este de tipul: %{type}"
msgid "'%{data}' at %{location} is not one of: %{enum}"
msgstr "'%{data}' la %{location} nu este unul dintre: %{enum}"
@@ -1286,7 +1301,7 @@ msgid "(%d closed)"
msgid_plural "(%d closed)"
msgstr[0] "(%d închis)"
msgstr[1] "(%d închise)"
-msgstr[2] "(%d de închise)"
+msgstr[2] "(%d închise)"
msgid "(%{mrCount} merged)"
msgstr "(%{mrCount} îmbinate)"
@@ -1325,7 +1340,7 @@ msgid "(optional)"
msgstr "(opțional)"
msgid "(removed)"
-msgstr "(eliminat)"
+msgstr "(înlăturat)"
msgid "(revoked)"
msgstr "(revocat)"
@@ -1387,8 +1402,8 @@ msgstr "+%{more_reviewers_count} mai mulți recenzori"
msgid "+%{tags} more"
msgstr "+%{tags} mai mult"
-msgid ", and "
-msgstr ""
+msgid ", "
+msgstr ", "
msgid ", or "
msgstr ", sau "
@@ -1421,7 +1436,7 @@ msgid "- of - issues closed"
msgstr ""
msgid "- of - weight completed"
-msgstr "- de - greutate realizată"
+msgstr "- de - greutate completată"
msgid "- show less"
msgstr "- arătați mai puțin"
@@ -1446,9 +1461,9 @@ msgstr[2] "%d de Zile"
msgid "1 Issue"
msgid_plural "%d Issues"
-msgstr[0] "O Problemă"
-msgstr[1] "%d Probleme"
-msgstr[2] "%d de Probleme"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "1 closed issue"
msgid_plural "%{issues} closed issues"
@@ -1586,7 +1601,7 @@ msgid "1000+"
msgstr "1000+"
msgid "192.168.0.0/24 or 2001:0DB8:1234::/48"
-msgstr ""
+msgstr "192.168.0.0/24 sau 2001:0DB8:1234::/48"
msgid "1st contribution!"
msgstr "Prima contribuție!"
@@ -1607,7 +1622,7 @@ msgid "3 hours"
msgstr "3 ore"
msgid "30 days"
-msgstr "30 zile"
+msgstr "30 de zile"
msgid "30 minutes"
msgstr "30 de minute"
@@ -1646,7 +1661,7 @@ msgid "A .NET Core console application template, customizable for any .NET Core
msgstr "Un șablon de aplicație consolă .NET Core, personalizabil pentru orice proiect .NET Core"
msgid "A CI/CD pipeline must run and be successful before merge."
-msgstr "O conductă CI / CD trebuie să ruleze și să aibă succes înainte de îmbinare."
+msgstr "O conductă CI/CD trebuie să ruleze și să aibă succes înainte de îmbinare."
msgid "A GitBook site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr "Un site GitBook care folosește Netlify pentru CI/CD în loc de GitLab, dar cu toate celelalte funcții excelente ale GitLab."
@@ -1661,13 +1676,13 @@ msgid "A Hugo site that uses Netlify for CI/CD instead of GitLab, but still with
msgstr "Un site Hugo care folosește Netlify pentru CI/CD în loc de GitLab, dar tot cu toate celelalte funcții excelente ale GitLab"
msgid "A Jekyll site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
-msgstr "Un site Jekyll care folosește Netlify pentru CI / CD în loc de GitLab, dar tot cu toate celelalte funcții grozave ale GitLab"
+msgstr "Un site Jekyll care folosește Netlify pentru CI/CD în loc de GitLab, dar tot cu toate celelalte funcții grozave ale GitLab"
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Un certificat SSL Let's Encrypt nu poate fi obținut până când domeniul dvs. nu este verificat."
msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr "Un obiect de meniu Metrics Dashboard apare în secția de Monitorizare a Area Admin."
+msgstr "Un element de meniu din „Tabloul de bord al metricilor†apare în secțiunea de „Monitorizare†din Zona Admin."
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "O pagină de bază și funcție serverless care utilizează AWS Lambda, AWS API Gateway și GitLab Pages"
@@ -1700,10 +1715,10 @@ msgid "A group is a collection of several projects"
msgstr "Un grup este o colecție de mai multe proiecte"
msgid "A group represents your organization in GitLab. Groups allow you to manage users and collaborate across multiple projects."
-msgstr "Un grup reprezintă organizația ta în GitLab. Grupurile vă permit să gestionați utilizatorii și să colaborați în cadrul mai multor proiecte."
+msgstr "Un grup reprezintă organizația dvs. în GitLab. Grupurile vă permit să gestionați utilizatorii și să colaborați în cadrul mai multor proiecte."
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
-msgstr "Artefactul unei lucrări este o arhivă de fișiere și directoare salvate de un job când se termină."
+msgstr "Un artefact de job este o arhivă de fișiere și directoare salvate de un job atunci când acesta se termină."
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr "Se aplică o limită de %{ci_project_subscriptions_limit} abonamente la sau de la un proiect."
@@ -1726,20 +1741,29 @@ msgstr "A fost publicată o nouă versiune %{tag} pentru %{name}. Vizitați pagi
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "A fost publicată o nouă versiune %{tag} pentru %{name}. Vizitați pagina Lansări pentru a citi mai multe despre aceasta:"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "A fost creat un nou token de impersonare."
+msgid "A new personal access token has been created"
+msgstr "S-a creat un nou token de acces personal"
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr "A fost creat un nou token de acces personal, numit %{token_name}."
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "O epică neconfidențială nu poate fi atribuită unei epice părinte confidențială"
msgid "A 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."
+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 platform value can be web, mob or app."
msgstr "O valoare a platformei poate fi web, mob sau aplicație."
msgid "A project boilerplate for Salesforce App development with Salesforce Developer tools"
-msgstr "Un cazan proiect pentru o dezvoltarea unei aplicații Salesforce cu unelte de dezvoltatori Salesforce"
+msgstr "Un proiect cazan pentru dezvoltarea de aplicații Salesforce cu instrumente de dezvoltatori Salesforce"
msgid "A project boilerplate for Tencent Serverless Framework that uses Next.js SSR"
msgstr ""
@@ -1760,7 +1784,7 @@ msgid "A ready-to-go template for use with iOS Swift apps"
msgstr "Un șablon gata de utilizare pentru utilizare cu aplicații iOS Swift"
msgid "A rebase is already in progress."
-msgstr "O rebazare este deja în curs de desfășurare."
+msgstr "Un rebase este deja în curs de desfășurare."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
msgstr "A fost efectuată o autentificare în contul dvs. de la următoarea adresă IP: %{ip}"
@@ -1778,10 +1802,10 @@ msgid "API"
msgstr "API"
msgid "API Fuzzing"
-msgstr "API Fuzzing"
+msgstr "Fuzzing API"
msgid "API Fuzzing Configuration"
-msgstr "Configurare API Fuzzing"
+msgstr "Configurare Fuzzing API"
msgid "API Help"
msgstr "Ajutor API"
@@ -1802,7 +1826,7 @@ msgid "APIFuzzing|$VARIABLE_WITH_USERNAME"
msgstr "$VARIABLE_WITH_USERNAME"
msgid "APIFuzzing|API Fuzzing Configuration"
-msgstr "API Fuzzing Configuration"
+msgstr "Configurare Fuzzing API"
msgid "APIFuzzing|Base URL of API testing target. For example, http://www.example.com."
msgstr "Adresa URL de bază a țintei de testare API. De exemplu, http://www.example.com."
@@ -1817,25 +1841,25 @@ msgid "APIFuzzing|Configure HTTP basic authentication values. Other authenticati
msgstr "Configurați valorile de autentificare de bază HTTP. Sunt acceptate și alte metode de autentificare. %{linkStart}Aflați mai multe%{linkEnd}."
msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
-msgstr ""
+msgstr "Personalizați opțiunile de configurare pentru fuzzing API ale proiectului dvs. și copiați fragmentul de cod în fișierul .gitlab-ci.yml pentru a aplica orice modificări. Rețineți că acest instrument nu reflectă sau actualizează automat fișierul .gitlab-ci.yml. Pentru detalii despre opțiunile de configurare mai avansate, consultați %{docsLinkStart}documentația GitLab API Fuzzing%{docsLinkEnd}."
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 "Introduceți numele variabilei CI ce conține parola. De exemplu, $VARIABLE_WITH_PASSWORD."
+msgstr "Introduceți numele variabilei CI care 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 "Introduceți numele variabilei CI ce conține numele de utilizator. De exemplu, $VARIABLE_WITH_USERNAME."
+msgstr "Introduceți numele variabilei CI care 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."
+msgstr "Calea fișierului sau adresa URL către API-urile de testat. De exemplu, dosar/example_fuzz.har. Fișierele HAR pot conține informații sensibile, cum ar fi tokenuri 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 repozitoriu."
msgid "APIFuzzing|File path or URL to OpenAPI specification. For example, folder/openapi.json or http://www.example.com/openapi.json."
-msgstr "Calea fișierului sau adresa URL către specificația OpenAPI. De exemplu, folder/openapi.json sau http://www.example.com/openapi.json."
+msgstr "Calea fișierului sau adresa URL către specificația OpenAPI. De exemplu, dosar/openapi.json sau 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 "Calea fișierului sau adresa URL către solicitările de testat. De exemplu, folder/example.postman_collection.json."
+msgstr "Calea fișierului sau adresa URL către solicitările care urmează să fie testate. De exemplu, dosar/examplu.postman_collection.json."
msgid "APIFuzzing|Generate code snippet"
msgstr "Generați un fragment de cod"
@@ -1844,22 +1868,22 @@ msgid "APIFuzzing|Make sure your credentials are secured"
msgstr "Asigurați-vă că acreditările dvs. sunt securizate"
msgid "APIFuzzing|Password for basic authentication"
-msgstr "Parolă pentru autentificare de bază"
+msgstr "Parola pentru autentificare de bază"
msgid "APIFuzzing|Predefined profiles"
-msgstr "Profile predefinite"
+msgstr "Profiluri predefinite"
msgid "APIFuzzing|Scan mode"
-msgstr "Mod scanare"
+msgstr "Modul scanare"
msgid "APIFuzzing|Scan profile"
-msgstr "Profil scanare"
+msgstr "Profil de scanare"
msgid "APIFuzzing|Show code snippet for the profile"
msgstr "Afișați fragmentul de cod pentru profil"
msgid "APIFuzzing|Target URL"
-msgstr "URL țintă"
+msgstr "URL-ul țintă"
msgid "APIFuzzing|There are three ways to perform scans."
msgstr "Există trei moduri de a efectua scanări."
@@ -1868,16 +1892,16 @@ msgid "APIFuzzing|Tip: Insert the following variables anywhere below stages and
msgstr "Sfat: Introduceți următoarele variabile oriunde sub etape și includeți"
msgid "APIFuzzing|Tip: Insert this part below all include"
-msgstr "Sfat: Inserați această parte sub toate includerile"
+msgstr "Sfat: Introduceți această parte sub tot conținutul inclus"
msgid "APIFuzzing|Tip: Insert this part below all stages"
-msgstr "Sfat: Inserați această parte sub toate stagiile"
+msgstr "Sfat: Introduceți această parte dedesubtul tuturor etapelor"
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. A user with maintainer access rights can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area. We detected that you are not a maintainer. Commit your changes and assign them to a maintainer to update the credentials before merging."
-msgstr "Pentru a preveni o breșă de securitate, informațiile de autentificare trebuie adăugate ca o %{ciVariablesLinkStart}variabilă CI%{ciVariablesLinkEnd}. Un utilizator cu drepturi de acces de tip întreținător poate gestiona variabilele CI în zona %{ciSettingsLinkStart}Setări%{ciSettingsLinkEnd}. Am detectat că nu sunteți un întreținător. Confirmați modificările și atribuiți-le unui întreținător pentru a actualiza acreditările înainte de îmbinare."
+msgstr "Pentru a preveni o breșă de securitate, informațiile de autentificare trebuie adăugate ca o variabilă %{ciVariablesLinkStart}CI%{ciVariablesLinkEnd}. Un utilizator cu drepturi de acces de întreținător poate gestiona variabilele CI în zona %{ciSettingsLinkStart}Setări%{ciSettingsLinkEnd}. Am detectat că nu sunteți un întreținător. Faceți un commit al modificărilor dvs. și atribuiți-le unui întreținător pentru a actualiza acreditările înainte de îmbinare."
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}."
+msgstr "Pentru a preveni o breșă de securitate, informațiile de autentificare trebuie adăugate ca o %{ciVariablesLinkStart}variabilă CI%{ciVariablesLinkEnd}. În calitate de utilizator cu drepturi de acces de întreținător, puteți gestiona variabilele CI în zona %{ciSettingsLinkStart}Setări%{ciSettingsLinkEnd}."
msgid "APIFuzzing|Username for basic authentication"
msgstr "Nume utilizator pentru autentificare de bază"
@@ -1886,13 +1910,13 @@ msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
msgstr "Este posibil să aveți nevoie de ajutorul unui întreținător pentru a vă securiza acreditările."
msgid "APIFuzzing|folder/example.postman_collection.json"
-msgstr "folder/example.postman_collection.json"
+msgstr "dosar/example.postman_collection.json"
msgid "APIFuzzing|folder/example_fuzz.har"
-msgstr "folder/example_fuzz.har"
+msgstr "dosar/example_fuzz.har"
msgid "APIFuzzing|folder/openapi.json"
-msgstr "folder/openapi.json"
+msgstr ""
msgid "AWS Access Key"
msgstr "Cheia de acces AWS"
@@ -1921,14 +1945,17 @@ msgstr "Despre implementarea automată"
msgid "About this feature"
msgstr "Despre această funcție"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
-msgstr "Rapoarte Abuz"
+msgstr "Rapoarte abuz"
msgid "Abuse reports"
msgstr "Rapoarte abuz"
msgid "Abuse reports notification email"
-msgstr "Notificare e-mail rapoarte abuz"
+msgstr "E-mail de notificare a rapoartelor de abuz"
msgid "Accept invitation"
msgstr "Acceptați invitația"
@@ -1946,14 +1973,11 @@ msgid "Access Tokens"
msgstr "Token-uri de acces"
msgid "Access denied for your LDAP account."
-msgstr "Accesul a fost refuzat pentru contul dvs. LDAP."
+msgstr "Acces refuzat pentru contul dvs. LDAP."
msgid "Access denied: %{error}"
msgstr "Acces interzis: %{error}"
-msgid "Access expiration date"
-msgstr "Data de expirare a accesului"
-
msgid "Access expires"
msgstr "Accesul expiră"
@@ -2033,22 +2057,22 @@ 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(2FA)."
+msgstr "Acestea sunt singurele parole acceptate atunci când autentificarea cu doi factori (2FA) este activată."
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."
+msgstr "De asemenea, puteți utiliza tokenuri de acces personale pentru a vă autentifica la Git prin HTTP."
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "Puteți genera un token de acces personal pentru fiecare aplicație pe care o folosiți și necesită acces la GitLab API."
msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
-msgstr "Token-urile de flux vă autentifică atunci când cititorul RSS încarcă un flux RSS personalizat sau când aplicația de calendar încarcă un calendar personalizat. Acesta este vizibil în aceste URL-uri de flux."
+msgstr "Tokenul dvs. de flux vă autentifică atunci când cititorul RSS încarcă un flux RSS personalizat sau când aplicația dvs. de calendar încarcă un calendar personalizat. Este vizibil în aceste URL-uri de flux."
msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr "Tokenul dvs. de e-mail primit vă autentifică atunci când creați o nouă problemă prin e-mail și este inclus în adresele dvs. personale de e-mail specifice proiectului."
msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
-msgstr "Tokenul dvs. pentru obiecte statice vă autentifică atunci când obiectele statice din depozit (cum ar fi arhivele sau blob-urile) sunt servite dintr-un depozit extern."
+msgstr "Tokenul dvs. pentru obiecte statice vă autentifică atunci când obiectele statice din repozitoriu (cum ar fi arhivele sau blob-urile) sunt servite dintr-o stocare externă."
msgid "AccessibilityReport|Learn more"
msgstr "Aflați mai multe"
@@ -2107,6 +2131,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr "Confirmare"
+
msgid "Action"
msgstr "Acțiune"
@@ -2147,7 +2174,7 @@ msgid "Add \"%{value}\""
msgstr "Adaugă \"%{value}\""
msgid "Add %{linkStart}assets%{linkEnd} to your Release. GitLab automatically includes read-only assets, like source code and release evidence."
-msgstr "Adăugați %{linkStart}resurse%{linkEnd} la lansarea dumneavoastră. GitLab include în mod automat resurse doar-citire, ca și codul sursă și evidența lansării."
+msgstr "Adăugați %{linkStart}resurse%{linkEnd} la versiunea dumneavoastră. GitLab include în mod automat resurse doar în citire, ca și codul sursă și evidența lansării."
msgid "Add CHANGELOG"
msgstr "Adăugați CHANGELOG"
@@ -2164,6 +2191,9 @@ msgstr "Adăugați cluster Kubernetes"
msgid "Add LICENSE"
msgstr "Adăugați LICENȚĂ"
+msgid "Add License"
+msgstr "Adăugați Licență"
+
msgid "Add New Site"
msgstr ""
@@ -2204,13 +2234,13 @@ msgid "Add a comment to this line or drag for multiple lines"
msgstr "Adăugați un comentariu la această linie sau trageți pentru mai multe linii"
msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
-msgstr "Adăugați un mesaj personalizat cu detalii despre rulourile partajate ale instanței. Mesajul este vizibil în setările CI / CD ale grupului și proiectului, în secțiunea Runners. Se acceptă Markdown."
+msgstr "Adăugați un mesaj personalizat cu detalii despre executorii partajați ai instanței. Mesajul este afișat în setările de grup și CI/CD ale proiectului în secțiunea Executor. Markdown este acceptat."
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "Adăugați un comentariu general la acest %{noteableDisplayName}."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
-msgstr "Adăugați o pagină de pornire în wiki-ul dvs care conține informații despre proiectul dvs, iar GitLab îl va afișa aici în locul acestui mesaj."
+msgstr "Adăugați o pagină de pornire la propriul wiki care conține informații despre proiectul dvs. și GitLab o va afișa aici în loc de acest mesaj."
msgid "Add a horizontal rule"
msgstr "Adăugați o regulă orizontală"
@@ -2249,7 +2279,7 @@ msgid "Add a title..."
msgstr ""
msgid "Add a to do"
-msgstr "Adăugați o acțiune de făcut"
+msgstr ""
msgid "Add an SSH key"
msgstr "Adăugați o cheie SSH"
@@ -2287,8 +2317,11 @@ msgstr "Adăugați un comentariu acum"
msgid "Add comment to design"
msgstr "Adăugați un comentariu la design"
+msgid "Add comment..."
+msgstr "Adăugați un comentariu..."
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
-msgstr "Adăugați mesaje de confirmare ca comentarii la sarcinile Asana. %{docs_link}"
+msgstr "Adăugați mesaje de confirmare sub formă de comentarii la sarcinile Asana. %{docs_link}"
msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
msgstr "Adăugați mesaje de comitere ca și comentarii la povești Pivotal Tracker. %{docs_link}"
@@ -2315,19 +2348,19 @@ msgid "Add environment"
msgstr "Adăugați mediu"
msgid "Add existing confidential %{issuableType}"
-msgstr "Adăugați confidențial existent %{issuableType}"
+msgstr "Adăugați %{issuableType} confidențial existent"
msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
msgstr "Adăugați antetul și subsolul la e-mailuri. Rețineți că setările de culoare vor fi aplicate numai în interfața aplicației"
msgid "Add image comment"
-msgstr "Adauga comentariu la imagine"
+msgstr "Adăugare comentariu la imagine"
msgid "Add italic text"
msgstr "Adăugați text italic"
msgid "Add key"
-msgstr "Adăugați cheie"
+msgstr "Adăugare cheie"
msgid "Add label(s)"
msgstr "Adăugați etichetă(e)"
@@ -2342,7 +2375,7 @@ msgid "Add new directory"
msgstr "Adăugați un director nou"
msgid "Add or remove previously merged commits"
-msgstr "Adăugați sau eliminați comiteri îmbinate anterior"
+msgstr "Adăugați sau înlăturați commit-urile îmbinate anterior"
msgid "Add or subtract spent time"
msgstr "Adăugați sau scădeți timpul consumat"
@@ -2366,7 +2399,7 @@ msgid "Add request manually"
msgstr "Adăugați cererea manual"
msgid "Add strikethrough text"
-msgstr "Adăugați text strikethrough"
+msgstr "Adăugare text tăiat cu o linie"
msgid "Add suggestion to batch"
msgstr "Adăugați o sugestie la lot"
@@ -2378,7 +2411,7 @@ msgid "Add text to the sign-in page. Markdown enabled."
msgstr "Adăugați text paginii de autentificare. Markdown activat."
msgid "Add to board"
-msgstr "Adăugare la bord"
+msgstr "Adăugați la bord"
msgid "Add to epic"
msgstr "Adăugați la epic"
@@ -2420,13 +2453,13 @@ msgid "Add your team members and others to GitLab."
msgstr ""
msgid "Add/remove"
-msgstr "Adăugare/eliminare"
+msgstr "Adăugare/înlăturare"
msgid "AddContextCommits|Add previously merged commits"
-msgstr "Adăugați commit-uri îmbinate anterior"
+msgstr "Adăugați commit-urile îmbinate anterior"
msgid "AddContextCommits|Add/remove"
-msgstr "Adăugare / eliminare"
+msgstr "Adăugare/înlăturare"
msgid "AddMember|Emails cannot be blank"
msgstr "E-mail-urile nu pot fi goale"
@@ -2489,7 +2522,7 @@ msgid "Additional text to show on the Help page"
msgstr "Text suplimentar pentru a fi afișat pe pagina de Ajutor"
msgid "Additional text to show on the sign-in page"
-msgstr "Text suplimentar pentru a arăta pe pagina de autentificare"
+msgstr "Text suplimentar de afișat pe pagina de autentificare"
msgid "Address"
msgstr "Adresă"
@@ -2507,55 +2540,58 @@ msgid "Adds a Zoom meeting."
msgstr ""
msgid "Adds a to do."
-msgstr "Adaugă un to do."
+msgstr ""
msgid "Adds an issue to an epic."
-msgstr "Adaugă o problemă la o epică."
+msgstr "Adăugați o problemă la o epică."
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr "Adăugați acest %{issuable_type} ca fiind legat de %{issuable_type} din care a fost creat"
+
msgid "Adjust how frequently the GitLab UI polls for updates."
-msgstr "Ajustați cât de frecvent GitLab UI votează pentru actualizări."
+msgstr "Reglați frecvența cu care GitLab UI verifică pentru actualizări."
msgid "Adjust your filters/search criteria above. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information."
msgstr "Ajustați filtrele/criteriile de căutare de mai sus. Dacă credeți că este vorba de o eroare, consultați documentația %{linkStart}Geo Troubleshooting%{linkEnd} pentru mai multe informații."
msgid "Admin"
-msgstr "Administrator"
+msgstr "Admin"
msgid "Admin Area"
msgstr "Zona Admin"
msgid "Admin Mode"
-msgstr "Modul administrator"
+msgstr "Mode Admin"
msgid "Admin Note"
-msgstr "Notă administrativă"
+msgstr "Notă Admin"
msgid "Admin Notifications"
-msgstr "Notificări administrator"
+msgstr "Notificări Admin"
msgid "Admin Overview"
-msgstr "Prezentare generală a administratorilor"
+msgstr "Prezentare generală Admin"
msgid "Admin Section"
msgstr "Secțiunea Admin"
msgid "Admin mode already enabled"
-msgstr "Modul administrator este deja activat"
+msgstr "Modul Admin este deja activat"
msgid "Admin mode disabled"
-msgstr "Modul administrator dezactivat"
+msgstr "Modul Admin dezactivat"
msgid "Admin mode enabled"
-msgstr "Modul administrator activat"
+msgstr "Modul Admin activat"
msgid "Admin navigation"
-msgstr ""
+msgstr "Navigare Admin"
msgid "Admin notes"
-msgstr "Note administrative"
+msgstr "Note Admin"
msgid "AdminArea|%{billable_users_link_start}Learn more%{billable_users_link_end} about what defines a billable user"
msgstr "%{billable_users_link_start}Aflați mai multe%{billable_users_link_end} despre ce definește un utilizator facturabil"
@@ -2596,6 +2632,9 @@ msgstr "Invitat"
msgid "AdminArea|Included Free in license"
msgstr "Inclus gratuit în licență"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "Ultimele grupuri"
@@ -2608,6 +2647,9 @@ msgstr "Ultimii utilizatori"
msgid "AdminArea|Maintainer"
msgstr "Întreținător"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2620,6 +2662,9 @@ msgstr "Proiect nou"
msgid "AdminArea|New user"
msgstr "Utilizator nou"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "Proprietar"
@@ -2636,16 +2681,16 @@ msgid "AdminArea|Sign up for the GitLab newsletter"
msgstr ""
msgid "AdminArea|Stop all jobs"
-msgstr "Opriți toate job-urile"
+msgstr "Opriți toate joburile"
msgid "AdminArea|Stop all jobs?"
-msgstr "Opriți toate job-urile?"
+msgstr "Opriți toate joburile?"
msgid "AdminArea|Stop jobs"
msgstr "Opriți joburile"
msgid "AdminArea|Stopping jobs failed"
-msgstr "Oprirea job-urilor a eșuat"
+msgstr "Oprirea joburilor a eșuat"
msgid "AdminArea|Total users"
msgstr "Total utilizatori"
@@ -2663,13 +2708,13 @@ msgid "AdminArea|Users without a Group and Project"
msgstr "Utilizatori fără grup și proiect"
msgid "AdminArea|View latest groups"
-msgstr "Vedeți cele mai recente grupuri"
+msgstr "Vizualizați cele mai recente grupuri"
msgid "AdminArea|View latest projects"
-msgstr "Vedeți cele mai recente proiecte"
+msgstr "Vizualizați cele mai recente proiecte"
msgid "AdminArea|View latest users"
-msgstr "Vedeți cei mai noi utilizatori"
+msgstr "Vizualizați ultimii utilizatori"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr "Sunteți pe cale de a opri toate joburile. Acest lucru va opri toate joburile care rulează acum."
@@ -2702,109 +2747,145 @@ msgid "AdminProjects|Delete Project %{projectName}?"
msgstr "Ștergeți proiectul %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
-msgstr "Un cont Let's Encrypt va fi configurat pentru această instanță de GitLab folosind această adresă de mail. Veți primi e-mailuri pentru a vă avertiza de certificate pe cale de expirare. %{link_start}Aflați mai multe.%{link_end}"
+msgstr "Un cont Let's Encrypt va fi configurat pentru această instanță GitLab folosind această adresă de e-mail. Veți primi e-mailuri pentru a vă avertiza despre certificatele care expiră. %{link_start}Aflați mai multe.%{link_end}"
+
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr "Afectează toate grupurile noi și cele existente."
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
-msgstr "Toate proiectele noi pot folosi executorii împărțiți ai acestei instanțe în mod implicit."
+msgstr "Toate proiectele noi pot folosi executorii partajați ai acestei instanțe în mod implicit."
msgid "AdminSettings|Auto DevOps domain"
msgstr "Domeniu Auto DevOps"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Configurați Let's Encrypt"
msgid "AdminSettings|Disable feed token"
-msgstr "Dezactivare token feed"
+msgstr "Dezactivare token de fluxuri"
msgid "AdminSettings|Disable public access to Pages sites"
-msgstr "Dezactivați accesul public către site-uri Pagini"
+msgstr "Dezactivați accesul public la site-urile Pages"
msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
-msgstr ""
+msgstr "Afișează un banner pe merge request-urile din proiectele fără pipeline-uri pentru a iniția etapele de adăugare a unui fișier .gitlab-ci.yml."
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}"
+msgstr "Verificarea de domeniu este o măsură de securitate esențială pentru site-urile publice GitLab. Utilizatorii trebuie să demonstreze că dețin controlul asupra unui domeniu înainte ca acesta să fie activat. %{link_start}Aflați mai multe.%{link_end}"
msgid "AdminSettings|Enable pipeline suggestion banner"
-msgstr ""
+msgstr "Activare banner de sugestie pentru pipeline"
msgid "AdminSettings|Enable shared runners for new projects"
-msgstr "Activați executori comuni pentru proiecte noi"
+msgstr "Activați executorii partajați pentru proiecte noi"
msgid "AdminSettings|Feed token"
-msgstr "Token feed"
+msgstr "Token de fluxuri"
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
-msgstr "Am citit și sunt de acord cu %{link_start}Termenii și condițiile%{link_end} Let's Encrypt (PDF)."
+msgstr "Am citit și sunt de acord cu %{link_start}Termenii de utilizare%{link_end} Let's Encrypt (PDF)."
msgid "AdminSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
-msgstr "Dacă nespecificată la nivel de grup/instanță, valoarea implicită este %{default_initial_branch_name}. Nu afectează repozitorii existente."
+msgstr "Dacă nu este specificat la nivel de grup sau de instanță, valoarea implicită este %{default_initial_branch_name}. Nu afectează repozitoriile existente."
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
-msgstr "Păstrați cele mai recente artefacte pentru toate joburile în cele mai recente conducte de succes"
+msgstr "Păstrați cele mai recente artefacte pentru toate joburile din cele mai recente pipeline-uri de succes"
msgid "AdminSettings|Let's Encrypt email"
-msgstr "E-mail Let's Encrypt"
+msgstr "E-mailul Let's Encrypt"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
-msgstr "Durata maximă a unei sesiuni pentru operațiunile Git atunci când 2FA este activată."
+msgstr "Durata maximă a unei sesiuni pentru operațiunile Git atunci când este activată funcția 2FA."
+
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
-msgstr "Variabilele CI / CD noi din proiecte și grupuri sunt în mod implicit protejate."
+msgstr "Variabilele CI/CD noi din proiecte și grupuri sunt în mod implicit protejate."
msgid "AdminSettings|No required pipeline"
-msgstr "Nicio conductă necesară"
+msgstr "Nu este necesar niciun pipeline"
msgid "AdminSettings|Protect CI/CD variables by default"
-msgstr "Protejați în mod implicit variabilele CI / CD"
+msgstr "Protejați în mod implicit variabilele CI/CD"
msgid "AdminSettings|Require users to prove ownership of custom domains"
-msgstr "Obligați utilizatorii să demonstreze proprietariatul domeniilor personalizate"
+msgstr "Solicită utilizatorilor să dovedească proprietatea asupra domeniilor personalizate"
msgid "AdminSettings|Required pipeline configuration"
msgstr "Configurație pipeline necesară"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
-msgstr "Selectați un șablon CI / CD"
+msgstr "Selectați un șablon CI/CD"
msgid "AdminSettings|Select a group to use as the source for instance-level project templates."
-msgstr "Selectați un grup pentru a fi folosit ca sursă pentru șabloanele de proiecte la nivel de instanță"
+msgstr "Selectați un grup care să fie utilizat ca sursă pentru șabloanele de proiect la nivel de instanță."
msgid "AdminSettings|Select to disable public access for Pages sites, which requires users to sign in for access to the Pages sites in your instance. %{link_start}Learn more.%{link_end}"
-msgstr "Selectați pentru a dezactiva accesul public către site-uri Pagini, ceea ce înseamnă că utilizatorii trebuie să se conecteze pentru acces la site-urile Pagini din instanța dumneavoastră. %{link_start}Aflați mai multe.%{link_end}"
+msgstr "Selectați pentru a dezactiva accesul public pentru site-urile Pages, care necesită ca utilizatorii să se înregistreze pentru a avea acces la site-urile Pages din instanța dvs. %{link_start}Aflați mai multe.%{link_end}"
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
-msgstr "Durata sesiunii pentru operațiunile Git atunci când 2FA este activată (minute)"
+msgstr "Durata sesiunii pentru operațiunile Git atunci când este activată funcția 2FA (minute)"
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
-msgstr "Setați un șablon CI / CD ca fiind configurația necesară a conductei pentru toate proiectele din instanță. Configurația CI / CD a proiectului se îmbină în configurația necesară a conductei atunci când se execută conducta. %{link_start}Ce este o configurație de conductă necesară?%{link_end}"
+msgstr "Setați un șablon CI/CD ca fiind configurația necesară de pipeline pentru toate proiectele din instanță. Configurația CI/CD a proiectului se îmbină în configurația necesară a pipeline-ului atunci când se execută pipeline-ul. %{link_start}Ce este o configurație de pipeline necesară?%{link_end}"
+
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr "Stabiliți numele și protecțiile inițiale pentru ramura implicită a noilor repozitorii create în instanță."
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
-msgstr "Setați mărimea maximă a Paginilor GitLab per proiect (0 pentru nelimitate). %{link_start}Aflați mai multe.%{link_end}"
+msgstr "Setați dimensiunea maximă a GitLab Pages per proiect (0 pentru nelimitat). %{link_start}Aflați mai multe.%{link_end}"
msgid "AdminSettings|Size and domain settings for Pages static sites."
-msgstr "Setări mărime și domeniu pentru site-uri statice Pagini."
+msgstr "Setările de mărime și domeniu pentru site-urile statice Pages."
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
-msgstr "Domeniul prestabilit folosit pentru aplicații Auto Review și stagii Auto Deploy in toate proiectele."
-
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-msgstr "Numele prestabilit pentru ramura inițială a noilor repozitorii create în instanță."
+msgstr "Domeniul implicit de utilizat pentru etapele Auto Review Apps și Auto Deploy în toate proiectele."
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
-msgstr "Cele mai recente artefacte pentru toate lucrările din cele mai recente conducte de succes din fiecare proiect sunt stocate și nu expiră."
+msgstr "Cele mai recente artefacte pentru toate joburile din cele mai recente pipeline-uri reușite din fiecare proiect sunt stocate și nu expiră."
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 "Proiectele în acest grup pot fi selectate ca șabloane pentru proiectele noi create în această instanță. %{link_start}Aflați mai multe.%{link_end} "
+msgstr "Proiectele din acest grup pot fi selectate ca șabloane pentru proiectele noi create pe instanță. %{link_start}Aflați mai multe.%{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 "Șablonul pentru configurația necesară a conductei poate fi unul dintre șabloanele furnizate de GitLab sau un șablon personalizat adăugat la un depozit de șabloane de instanță. %{link_start}Cum se creează un depozit de șabloane de instanță?%{link_end}"
+msgstr "Șablonul pentru configurația pipeline necesară poate fi unul dintre șabloanele furnizate de GitLab sau un șablon personalizat adăugat la un repozitoriu de șabloane de instanță. %{link_start}Cum se creează un repozitoriu de șabloane de instanță?%{link_end}"
+
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
msgid "AdminStatistics|Active Users"
msgstr "Utilizatori activi"
msgid "AdminStatistics|Forks"
-msgstr "Ramificații"
+msgstr "Forkuri"
msgid "AdminStatistics|Issues"
msgstr "Probleme"
@@ -2828,7 +2909,7 @@ msgid "AdminUsers|(Admin)"
msgstr "(Admin)"
msgid "AdminUsers|(Banned)"
-msgstr "(Banat)"
+msgstr "(Blocat)"
msgid "AdminUsers|(Blocked)"
msgstr "(Blocat)"
@@ -2852,13 +2933,13 @@ msgid "AdminUsers|2FA Enabled"
msgstr "2FA activată"
msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr "Un utilizator se poate valida introducând un card de credit / debit sau un administrator poate valida manual un utilizator."
+msgstr "Un utilizator se poate valida singur prin introducerea unui card de credit/debit sau, alternativ, poate fi validat manual de către un administrator."
msgid "AdminUsers|Access"
msgstr "Acces"
msgid "AdminUsers|Access Git repositories"
-msgstr "Accesați depozitele Git"
+msgstr "Accesați repozitoriile Git"
msgid "AdminUsers|Access the API"
msgstr "Accesați API-ul"
@@ -2903,13 +2984,13 @@ msgid "AdminUsers|Automatically marked as default internal user"
msgstr "Marcat automat ca utilizator intern implicit"
msgid "AdminUsers|Ban user"
-msgstr "Banare utilizator"
+msgstr "Interzicere utilizator"
msgid "AdminUsers|Ban user %{username}?"
-msgstr "Banați utilizatorul %{username}?"
+msgstr "Interziceți utilizatorul %{username}?"
msgid "AdminUsers|Banned"
-msgstr "Banat"
+msgstr "Interzis"
msgid "AdminUsers|Be added to groups and projects"
msgstr "Să fie adăugat la grupuri și proiecte"
@@ -2930,10 +3011,10 @@ msgid "AdminUsers|Blocking user has the following effects:"
msgstr "Blocarea unui utilizator are următoarele efecte:"
msgid "AdminUsers|Cannot sign in or access instance information"
-msgstr "Imposibil de autentificat sau accesat informațiile despre instanță"
+msgstr "Nu puteți să vă conectați sau să accesați informațiile despre instanță"
msgid "AdminUsers|Cannot unblock LDAP blocked users"
-msgstr "Nu se pot debloca utilizatorii blocați LDAP"
+msgstr "Nu se pot debloca utilizatorii blocați prin LDAP"
msgid "AdminUsers|Cohorts"
msgstr "Cohorte"
@@ -2978,7 +3059,7 @@ msgid "AdminUsers|External"
msgstr "Extern"
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 "Utilizatorii externi nu pot vedea proiectele interne sau private decât dacă accesul este acordat în mod explicit. De asemenea, utilizatorii externi nu pot crea proiecte, grupuri sau fragmente personale."
+msgstr "Utilizatorii externi nu pot vedea proiectele interne sau private decât dacă accesul este acordat în mod explicit. De asemenea, utilizatorii externi nu pot crea proiecte, grupuri sau fragmente de cod personale."
msgid "AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
msgstr "Pentru mai multe informații, vă rugăm să consultați %{link_start}documentația de ștergere a contului de utilizator.%{link_end}"
@@ -2996,7 +3077,7 @@ msgid "AdminUsers|Is using seat"
msgstr "Utilizează locul"
msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr "Probleme create de acest utilizator sunt ascunse altor utilizatori."
+msgstr "Problemele create de acest utilizator sunt ascunse altor utilizatori."
msgid "AdminUsers|It's you!"
msgstr "Dvs. sunteți!"
@@ -3095,10 +3176,10 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "Pentru a confirma, tastați %{username}"
msgid "AdminUsers|Unban user"
-msgstr "Debanați utilizatorul"
+msgstr "Deblocați utilizatorul"
msgid "AdminUsers|Unban user %{username}?"
-msgstr "Debanați utilizatorul %{username}?"
+msgstr "Deblocați utilizatorul %{username}?"
msgid "AdminUsers|Unblock"
msgstr "Deblocare"
@@ -3116,7 +3197,7 @@ msgid "AdminUsers|User is validated and can use free CI minutes on shared runner
msgstr "Utilizatorul este validat și poate utiliza minutele gratuite CI pe executori partajați."
msgid "AdminUsers|User will not be able to access git repositories"
-msgstr "User nu va putea accesa repozitoriile git"
+msgstr "Utilizatorul nu va putea accesa repozitoriile git"
msgid "AdminUsers|User will not be able to login"
msgstr "Utilizatorul nu se va putea autentifica"
@@ -3131,7 +3212,7 @@ msgid "AdminUsers|Validate user account"
msgstr "Validați contul de utilizator"
msgid "AdminUsers|View pending member requests"
-msgstr "Vezi cererile membrilor în așteptare"
+msgstr "Vizualizați cererile membrilor în așteptare"
msgid "AdminUsers|What can I do?"
msgstr "Ce pot face?"
@@ -3140,7 +3221,7 @@ msgid "AdminUsers|What does this mean?"
msgstr "Ce înseamnă acest lucru?"
msgid "AdminUsers|When banned:"
-msgstr "Când banat:"
+msgstr "În timpul blocării:"
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"
@@ -3152,28 +3233,28 @@ msgid "AdminUsers|Without projects"
msgstr "Fără proiecte"
msgid "AdminUsers|You are about to permanently delete the user %{username}. Issues, merge requests, and groups linked to them will be transferred to a system-wide \"Ghost-user\". To avoid data loss, consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered."
-msgstr "Sunteți pe cale să ștergeți definitiv utilizatorul %{username}. Problemele, merge request-urile și grupurile legate de acestea vor fi transferate către un \"Utilizator-fantomă\" la nivel de sistem. Pentru a evita pierderea de date, luați în considerare utilizarea în schimb a funcției %{strongStart}blocare utilizator%{strongEnd}. Odată ce ați %{strongStart}ștergeți utilizatorul%{strongEnd}, această acțiune nu poate fi anulată sau contul recuperat."
+msgstr "Sunteți pe cale să ștergeți definitiv utilizatorul %{username}. Problemele, merge request-urile și grupurile legate de acestea vor fi transferate către un „Utilizator-fantomă†la nivel de sistem. Pentru a evita pierderea de date, luați în considerare utilizarea în schimb a funcției %{strongStart}blocare utilizator%{strongEnd}. Odată ce ați folosit funcția %{strongStart}Ștergere utilizator%{strongEnd}, aceasta nu mai poate anulată sau contul recuperat."
msgid "AdminUsers|You are about to permanently delete the user %{username}. This will delete all of the issues, merge requests, and groups linked to them. To avoid data loss, consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered."
-msgstr "Sunteți pe cale să ștergeți definitiv utilizatorul %{username}. Problemele, merge request-urile și grupurile legate de acestea vor fi șterse. Pentru a evita pierderea de date, luați în considerare utilizarea în schimb a funcției %{strongStart}blocare utilizator%{strongEnd}. Odată ce ați %{strongStart}ștergeți utilizatorul%{strongEnd}, această acțiune nu poate fi anulată sau contul recuperat."
+msgstr "Sunteți pe cale să ștergeți definitiv utilizatorul %{username}. Aceasta va șterge toate problemele, merge request-urile și grupurile legate de acesta. Pentru a evita pierderea de date, luați în considerare posibilitatea de a utiliza în schimb funcția %{strongStart}blocare utilizator%{strongEnd}. Odată ce ați folosit funcția %{strongStart}Ștergere utilizator%{strongEnd}, aceasta nu mai poate fi anulată sau contul recuperat."
msgid "AdminUsers|You can always block their account again if needed."
-msgstr "Puteți mereu să le blocați iarăși contul dacă este necesar."
+msgstr "Puteți oricând să le blocați din nou contul, dacă este necesar."
msgid "AdminUsers|You can always deactivate their account again if needed."
-msgstr "Puteți mereu să le dezactivați iarăși contul dacă este necesar."
+msgstr "Puteți oricând să le dezactivați din nou contul, dacă este necesar."
msgid "AdminUsers|You can always re-activate their account, their data will remain intact."
-msgstr "Puteți mereu să le reactivați iarăși contul dacă este necesar, datele lor vor rămâne intacte."
+msgstr "Puteți oricând să le reactivați contul, iar datele lor vor rămâne intacte."
msgid "AdminUsers|You can always unblock their account, their data will remain intact."
-msgstr "Puteți mereu să le deblocați iarăși contul dacă este necesar, datele lor vor rămâne intacte."
+msgstr "Puteți oricând să le deblocați contul, iar datele lor vor rămâne intacte."
msgid "AdminUsers|You can ban their account in the future if necessary."
-msgstr "Le puteți bana contul în viitor dacă este necesar."
+msgstr "Dacă este necesar, puteți să le blocați contul în viitor."
msgid "AdminUsers|You can unban their account in the future. Their data remains intact."
-msgstr "Puteți mereu să le debanați contul dacă este necesar. Datele lor vor rămâne intacte."
+msgstr "Puteți să le deblocați contul în viitor. Datele lor rămân intacte."
msgid "AdminUsers|You cannot remove your own administrator access."
msgstr ""
@@ -3197,10 +3278,10 @@ msgid "AdminUsers|user cap"
msgstr "limită utilizator"
msgid "Administration"
-msgstr "Administrare"
+msgstr "Administrație"
msgid "Admin|Additional users must be reviewed and approved by a system administrator. Learn more about %{help_link_start}usage caps%{help_link_end}."
-msgstr "Utilizatorii suplimentari trebuie să fie examinați și aprobați de un administrator de sistem. Aflați mai multe despre %{help_link_start}plafoane de utilzare%{help_link_end}."
+msgstr "Utilizatorii suplimentari trebuie să fie analizați și aprobați de un administrator de sistem. Aflați mai multe despre %{help_link_start}plafoanele de utilizare%{help_link_end}."
msgid "Admin|Admin notes"
msgstr "Note administrative"
@@ -3215,13 +3296,13 @@ msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr "Reconcilierea trimestrială va avea loc la %{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 ""
+msgstr "Numărul maxim de seat-uri din spațiul de nume al dvs. depășește numărul de seat-uri din abonament. La %{qrtlyDate}, are loc o reconciliere trimestrială și vi se va factura automat o sumă proporțională pentru depășirea numărului de seat-uri. Nu este necesară nicio acțiune din partea dvs. Dacă aveți un card de credit la dosar, acesta va fi debitat. În caz contrar, veți primi o factură. Pentru mai multe informații despre calendarul procesului de facturare, consultați documentația."
msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
-msgstr "Vedeți aprobările în așteptare ale utilizatorilor"
+msgstr "Vizualizați aprobările în așteptare ale utilizatorilor"
msgid "Admin|Your instance has reached its user cap"
msgstr "Instanța dvs. a atins plafonul de utilizatori"
@@ -3245,7 +3326,7 @@ 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."
msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "După o actualizare cu succes a parolei, veți fi redirecționat către pagina de autentificare, unde vă puteți autentifica cu noua parolă."
+msgstr "După o actualizare cu succes a parolei, veți fi redirecționat către pagina de autentificare, unde vă puteți conecta cu noua parolă."
msgid "After it expires, you can't use merge approvals, code quality, or many other features."
msgstr ""
@@ -3275,25 +3356,25 @@ msgid "Alert"
msgstr ""
msgid "AlertManagement|Acknowledged"
-msgstr "Recunoscut"
+msgstr "Recunoscută"
msgid "AlertManagement|Activity feed"
-msgstr "Feed activitate"
+msgstr "Flux de activitate"
msgid "AlertManagement|Alert"
msgstr "Alertă"
msgid "AlertManagement|Alert assignee(s): %{assignees}"
-msgstr "Responsabili alertă: %{assignees}"
+msgstr "Responsabil(i) alertă: %{assignees}"
msgid "AlertManagement|Alert detail"
-msgstr "Detalii alertă"
+msgstr "Detaliu despre alerta"
msgid "AlertManagement|Alert details"
-msgstr "Detalii alertă"
+msgstr "Detalii despre alertă"
msgid "AlertManagement|Alert status: %{status}"
-msgstr "Stare alertă: %{status}"
+msgstr "Starea alertei: %{status}"
msgid "AlertManagement|Alerts"
msgstr "Alerte"
@@ -3308,13 +3389,13 @@ msgid "AlertManagement|Assignees"
msgstr "Responsabili"
msgid "AlertManagement|Authorize external service"
-msgstr "Autorizați serviciu extern"
+msgstr "Autorizarea serviciului extern"
msgid "AlertManagement|Create incident"
-msgstr "Creare incident"
+msgstr "Creați un incident"
msgid "AlertManagement|Display alerts from all your monitoring tools directly within GitLab. Streamline the investigation of your alerts and the escalation of alerts to incidents."
-msgstr "Afișare alerte din toate instrumentele de monitorizare direct în GitLab. Simplificați investigarea alertelor dvs. și transformarea alertelor în incidente."
+msgstr "Afișează alertele de la toate instrumentele de monitorizare direct în GitLab. Fluidizează investigarea alertelor dvs. și transformarea alertelor în incidente."
msgid "AlertManagement|Edit"
msgstr "Editare"
@@ -3332,19 +3413,19 @@ msgid "AlertManagement|Key"
msgstr "Cheie"
msgid "AlertManagement|Metrics"
-msgstr "Măsurători"
+msgstr "Metrici"
msgid "AlertManagement|Metrics weren't available in the alerts payload."
-msgstr "Măsuratorile nu erau disponibile în payload-ul alertelor."
+msgstr "Metricile nu erau disponibile în payload-ul alertelor."
msgid "AlertManagement|More information"
msgstr "Mai multe informații"
msgid "AlertManagement|No alert data to display."
-msgstr "Nu există date alerte de afișat."
+msgstr "Nu există date despre alertă de afișat."
msgid "AlertManagement|No alerts available to display. See %{linkStart}enabling alert management%{linkEnd} for more information on adding alerts to the list."
-msgstr "Nu există alerte disponibile de afișat. Consultați %{linkStart}activarea gestionării alertelor%{linkEnd} pentru mai multe informații despre adăugarea alertelor în listă."
+msgstr "Nu sunt disponibile alerte pentru afișare. Consultați %{linkStart}activarea gestionării alertelor%{linkEnd} pentru mai multe informații despre adăugarea alertelor în listă."
msgid "AlertManagement|No alerts to display."
msgstr "Nu există alerte de afișat."
@@ -3374,52 +3455,52 @@ msgid "AlertManagement|Service"
msgstr "Serviciu"
msgid "AlertManagement|Severity"
-msgstr "Severitate"
+msgstr " Severitate"
msgid "AlertManagement|Start time"
-msgstr "Ora de start"
+msgstr "Data și ora de începere"
msgid "AlertManagement|Status"
msgstr "Status"
msgid "AlertManagement|Surface alerts in GitLab"
-msgstr "Surface alerte în GitLab"
+msgstr "Afișarea alertelor în GitLab"
msgid "AlertManagement|There was an error displaying the alert. Please refresh the page to try again."
-msgstr "A apărut o eroare la afișarea alertei. Vă rugăm reîmprospătați pagina pentru a încerca din nou."
+msgstr "A survenit o eroare la afișarea alertei. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
-msgstr "S-a produs o eroare la afișarea alertelor. Confirmați detaliile de configurare a punctului final pentru a vă asigura că alertele apar."
+msgstr "A survenit o eroare la afișarea alertelor. Confirmați detaliile de configurare ale punctului final pentru a vă asigura că apar alerte."
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "A apărut o eroare la actualizarea listei de responsabili. Vă rugăm încercați din nou."
+msgstr "A survenit o eroare la actualizarea listei responsabililor. Vă rugăm să încercați din nou."
msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
-msgstr "A apărut o eroare la actualizarea celor responsabili la această alertă. Vă rugăm să încercați din nou."
+msgstr "A survenit o eroare la actualizarea celor responsabili la această alertă. Vă rugăm să încercați din nou."
msgid "AlertManagement|There was an error while updating the status of the alert."
-msgstr "S-a produs o eroare în timpul actualizării stării alertei."
+msgstr "A survenit o eroare la actualizarea statutului alertei."
msgid "AlertManagement|There was an error while updating the to-do item of the alert."
-msgstr "S-a produs o eroare în timpul actualizării elementului to-do al alertei."
+msgstr "A survenit o eroare la actualizarea elementului „de făcut†al alertei."
msgid "AlertManagement|This assignee cannot be assigned to this alert."
msgstr "Acest responsabil nu poate fi atribuit acestei alerte"
msgid "AlertManagement|Tool"
-msgstr "Unealtă"
+msgstr "Instrument"
msgid "AlertManagement|Triggered"
-msgstr "Declanșat"
+msgstr "Declanșată"
msgid "AlertManagement|Value"
-msgstr "Valoare"
+msgstr " Valoare"
msgid "AlertManagement|View incident"
msgstr "Vizualizați incidentul"
msgid "AlertMappingBuilder|Define fallback"
-msgstr "Definiți alternativă"
+msgstr "Definiți o alternativă"
msgid "AlertMappingBuilder|GitLab alert key"
msgstr "Cheie de alertă GitLab"
@@ -3428,16 +3509,16 @@ msgid "AlertMappingBuilder|Make selection"
msgstr "Efectuați selecția"
msgid "AlertMappingBuilder|Payload alert key"
-msgstr "Cheie de alertă de plată"
+msgstr "Cheia de alertă payload"
msgid "AlertMappingBuilder|Select key"
msgstr "Selectare cheie"
msgid "AlertMappingBuilder|Title is a required field for alerts in GitLab. Should the payload field you specified not be available, specifiy which field we should use instead. "
-msgstr "Title este un câmp obligatoriu pentru alertele din GitLab. În cazul în care câmpul payload pe care l-ați specificat nu este disponibil, specificați ce câmp ar trebui să folosim în schimb. "
+msgstr "Titlul este un câmp obligatoriu pentru alertele din GitLab. În cazul în care câmpul payload-ului pe care l-ați specificat nu este disponibil, specificați ce câmp ar trebui să folosim în schimb. "
msgid "AlertSettings|A webhook URL and authorization key is generated for the integration. After you save the integration, both are visible under the “View credentials†tab."
-msgstr "Se generează o adresă URL de webhook și o cheie de autorizare pentru integrare. După ce salvați integrarea, ambele sunt vizibile în fila \"Vizualizare acreditări\"."
+msgstr "Pentru integrare se generează un URL webhook È™i o cheie de autorizare. După ce salvaÈ›i integrarea, ambele sunt vizibile în fila „Vizualizare acredităriâ€."
msgid "AlertSettings|Add new integration"
msgstr "Adăugați o nouă integrare"
@@ -3455,49 +3536,49 @@ msgid "AlertSettings|Current integrations"
msgstr "Integrări curente"
msgid "AlertSettings|Customize alert payload mapping (optional)"
-msgstr "Personalizați cartografierea payload-ului alertei (opțional)"
+msgstr "Personalizarea mapării payload-ului alertei (opțional)"
msgid "AlertSettings|Delete integration"
-msgstr "Ștergere integrare"
+msgstr "Ștergeți integrarea"
msgid "AlertSettings|Edit integration"
-msgstr "Editare integrare"
+msgstr "Editați integrarea"
msgid "AlertSettings|Edit payload"
msgstr "Editare payload"
msgid "AlertSettings|Enable integration"
-msgstr "Activare integrare"
+msgstr "Activați integrarea"
msgid "AlertSettings|Enter an example payload from your selected monitoring tool. This supports sending alerts to a GitLab endpoint."
-msgstr "Introduceți un payload exemplu de la instrumentul de monitorizare selectat. Aceasta acceptă trimiterea de alerte către un punct final GitLab."
+msgstr "Introduceți un exemplu de payload din instrumentul de monitorizare selectat. Aceasta acceptă trimiterea alertelor către un punct final GitLab."
msgid "AlertSettings|Enter integration name"
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}."
+msgstr "Versiunile gratuite ale GitLab sunt limitate la o singură integrare pe tip. Pentru a adăuga mai multe, %{linkStart}faceți un upgrade al abonamentului dumneavoastră%{linkEnd}."
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 "GitLab a creat un URL și o cheie de autorizare pentru integrarea dvs. Le puteți utiliza pentru a configura un webhook și pentru a vă autoriza punctul final să trimită alerte către GitLab."
+msgstr "GitLab a creat un URL și o cheie de autorizare pentru integrarea dumneavoastră. Le puteți utiliza pentru a configura un webhook și pentru a vă autoriza punctul final ca să trimită alerte către GitLab."
msgid "AlertSettings|HTTP Endpoint"
msgstr "Punct final HTTP"
msgid "AlertSettings|If you edit the payload, you must re-map the fields again."
-msgstr "Dacă editați payload-ul, trebuie să modificați din nou câmpurile."
+msgstr "Dacă modificați payload-ul, trebuie să mapați din nou câmpurile."
msgid "AlertSettings|If you reset the authorization key for this project, you must update the key in every enabled alert source."
msgstr "Dacă resetați cheia de autorizare pentru acest proiect, trebuie să actualizați cheia în fiecare sursă de alertă activată."
msgid "AlertSettings|Integration successfully saved"
-msgstr "Integrarea salvată cu succes"
+msgstr "Integrare salvată cu succes"
msgid "AlertSettings|Name integration"
-msgstr "Numire integrare"
+msgstr "Numiți integrarea"
msgid "AlertSettings|Parse payload fields"
-msgstr "Analizare câmpuri payload"
+msgstr "Analizați câmpurile payload-ului"
msgid "AlertSettings|Proceed with editing"
msgstr "Continuați cu editarea"
@@ -3512,28 +3593,28 @@ msgid "AlertSettings|Reset Key"
msgstr "Resetare cheie"
msgid "AlertSettings|Reset the mapping"
-msgstr "Resetare cartografiere"
+msgstr "Resetare mapare"
msgid "AlertSettings|Sample payload has been parsed. You can now map the fields."
-msgstr "Payload-ul mostră a fost analizat. Acum puteți cartografia câmpurile."
+msgstr "Mostra de payload a fost analizată. Acum puteți mapa câmpurile."
msgid "AlertSettings|Save & create test alert"
-msgstr "Salvare și creare alertă de test"
+msgstr "Salvați și creați alerta de test"
msgid "AlertSettings|Save integration"
-msgstr "Salvare integrare"
+msgstr "Salvați integrarea"
msgid "AlertSettings|Save integration & send"
-msgstr "Salvare integrare și trimitere"
+msgstr "Salvați integrarea & trimiteți"
msgid "AlertSettings|Select integration type"
-msgstr "Selectare tip integrare"
+msgstr "Selectați tipul de integrare"
msgid "AlertSettings|Send test alert"
-msgstr "Trimitere alertă test"
+msgstr "Trimiteți alerta test"
msgid "AlertSettings|Send without saving"
-msgstr "Trimitere fără salvare"
+msgstr "Trimiteți fără a salva"
msgid "AlertSettings|The form has unsaved changes"
msgstr "Formularul are modificări nesalvate"
@@ -3542,10 +3623,10 @@ msgid "AlertSettings|The form has unsaved changes. How would you like to proceed
msgstr "Formularul are modificări nesalvate. Cum doriți să continuați?"
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
-msgstr "Pentru a crea o cartografiere personalizată, introduceți un exemplu de sarcină utilă de la instrumentul de monitorizare, în format JSON. Selectați butonul \"Analizați câmpurile payload\" pentru a continua."
+msgstr "Pentru a crea o mapare personalizată, introduceți un exemplu de payload de la instrumentul de monitorizare, în format JSON. Selectați butonul „Analizare câmpuri payload†pentru a continua."
msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr "URL nu poate fi gol și trebuie să înceapă cu http: sau https:."
+msgstr "URL-ul nu poate fi gol și trebuie să înceapă cu http: sau https:."
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr "Utilizați URL-ul și cheia de autorizare de mai jos pentru a configura modul în care Prometheus trimite alerte către GitLab. Consultați %{linkStart}documentația GitLab%{linkEnd} pentru a afla cum să vă configurați punctul final."
@@ -3554,19 +3635,19 @@ msgid "AlertSettings|Use the URL and authorization key below to configure how an
msgstr "Utilizați URL-ul și cheia de autorizare de mai jos pentru a configura modul în care un serviciu extern trimite alerte către GitLab. %{linkStart}Cum configurez punctul final?%{linkEnd}"
msgid "AlertSettings|View URL and authorization key"
-msgstr "Vizualizare URL și cheie de autorizare"
+msgstr "Vizualizați URL-ul și cheia de autorizare"
msgid "AlertSettings|View credentials"
-msgstr "Vezi acreditările"
+msgstr "Vizualizați acreditările"
msgid "AlertSettings|Webhook URL"
msgstr "URL webhook"
msgid "AlertSettings|You can map default GitLab alert fields to your payload keys in the dropdowns below."
-msgstr "Puteți să asociați câmpurile implicite de alertă GitLab cu cheile de payload în dropdown-urile de mai jos."
+msgstr "Puteți mapa câmpurile de alertă GitLab implicite pentru cheile payload-ului în listele derulante de mai jos."
msgid "AlertSettings|You can now set up alert endpoints for manually configured Prometheus instances in the Alerts section on the Operations settings page. Alert endpoint fields on this page have been deprecated."
-msgstr "Acum puteți configura puncte finale de alertă pentru instanțele Prometheus configurate manual în secțiunea Alerte din pagina de setări Operațiuni. Câmpurile de puncte finale de alertă din această pagină au fost învechite."
+msgstr "Acum puteÈ›i configura puncte finale de alertă pentru instanÈ›ele Prometheus configurate manual în secÈ›iunea „Alerte†de pe pagina de „Setări operaÈ›iuniâ€. Câmpurile punctului final de alertă de pe această pagină au fost abandonate."
msgid "AlertSettings|{ \"events\": [{ \"application\": \"Name of application\" }] }"
msgstr "{ \"events\": [{ \"application\": \"Name of application\" }] }"
@@ -3584,13 +3665,13 @@ msgid "AlertsIntegrations|If you delete the %{integrationName} integration, aler
msgstr "Dacă ștergeți integrarea %{integrationName}, alertele nu mai sunt trimise de la acest punct final. Această acțiune nu poate fi anulată."
msgid "AlertsIntegrations|Integration Name"
-msgstr "Nume integrare"
+msgstr "Numele integrării"
msgid "AlertsIntegrations|Integration payload is invalid."
-msgstr "Payload-ul integrării nu este valid."
+msgstr "Payload-ul de integrare nu este valid."
msgid "AlertsIntegrations|No integrations have been added yet."
-msgstr "Încă nu au fost adăugate integrări."
+msgstr "Nu a fost adăugată încă nicio integrare."
msgid "AlertsIntegrations|The current integration could not be updated. Please try again."
msgstr "Integrarea curentă nu a putut fi actualizată. Vă rugăm să încercați din nou."
@@ -3611,7 +3692,7 @@ msgid "AlertsIntegrations|The integration is saved."
msgstr "Integrarea este salvată."
msgid "AlertsIntegrations|The integration token could not be reset. Please try again."
-msgstr "Nu a fost posibilă resetarea token-ului de integrare. Vă rugăm să încercați din nou."
+msgstr "Tokenul de integrare nu a putut fi resetat. Vă rugăm să încercați din nou."
msgid "AlertsIntegrations|The test alert should now be visible in your alerts list."
msgstr "Alerta de test ar trebui să fie acum vizibilă în lista de alerte."
@@ -3706,8 +3787,8 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Permiteți utilizarea numai protocoalelor selectate pentru accesul Git."
-msgid "Allow owners to manage default branch protection per group"
-msgstr "Permiteți proprietarilor să gestioneze protecția implicită a ramurii pentru fiecare grup"
+msgid "Allow owners to manage default branch protection per group."
+msgstr "Permiteți proprietarilor să gestioneze protecția implicită a sucursalelor pentru fiecare grup."
msgid "Allow owners to manually add users outside of LDAP"
msgstr "Permiteți proprietarilor să adauge manual utilizatori în afara LDAP"
@@ -3788,13 +3869,13 @@ msgid "Already have login and password?"
msgstr "Aveți deja login și parolă?"
msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
-msgstr "De asemenea, numit \"Emitent\" sau \"Identificator de încredere în partea invocată\""
+msgstr "De asemenea, numit „Emitent†sau „Identificator de încredere în partea invocatăâ€"
msgid "Also called \"Relying party service URL\" or \"Reply URL\""
-msgstr "De asemenea, numit \"Adresa URL a serviciului parte invocată\" sau \"Adresa URL de răspuns\""
+msgstr "De asemenea, numit „Adresa URL a serviciului parte invocată†sau „Adresa URL de răspunsâ€"
msgid "Also remove direct user membership from subgroups and projects"
-msgstr "De asemenea, eliminați apartenența directă a utilizatorilor la subgrupuri și proiecte"
+msgstr "De asemenea, înlăturați apartenența directă a utilizatorilor la subgrupuri și proiecte"
msgid "Also unassign this user from related issues and merge requests"
msgstr "De asemenea anulați afectarea acestui utilizator de la problemele asociate și merge request-uri"
@@ -3820,11 +3901,14 @@ msgstr "Autentificarea Amazon nu este %{link_start}configurată corect%{link_end
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ă."
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr "Un administrator a setat data maximă de expirare la %{maxDate}. %{helpLinkStart}Aflați mai multe%{helpLinkEnd}."
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr "Un cont GitLab Enterprise a fost creat pentru dvs. de către organizația dvs:"
msgid "An administrator changed the password for your GitLab account on %{link_to}."
-msgstr "Un administrator a schimbat parola pentru contul tău GitLab pe %{link_to}."
+msgstr "Un administrator a schimbat parola pentru contul dvs. GitLab pe %{link_to}."
msgid "An alert has been resolved in %{project_path}."
msgstr "O alertă a fost rezolvată în %{project_path}."
@@ -3848,10 +3932,10 @@ msgid "An error in reporting in which a test result incorrectly indicates the pr
msgstr "O eroare de raportare în care rezultatul unui test indică incorect prezența unei vulnerabilități într-un sistem, când vulnerabilitatea nu este prezentă."
msgid "An error occurred adding a draft to the thread."
-msgstr "A apărut o eroare adăugând o schiță la subiect."
+msgstr "S-a produs o eroare la adăugarea unei schițe la subiect."
msgid "An error occurred adding a new draft."
-msgstr "A apărut o eroare adăugând o nouă schiță."
+msgstr "A apărut o eroare la adăugarea unei noi schițe."
msgid "An error occurred creating the new branch."
msgstr "A apărut o eroare creând ramura nouă."
@@ -3874,6 +3958,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "A apărut o eroare de previzualizare a blobului"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr "A apărut o eroare la actualizarea titlului"
@@ -3917,7 +4004,7 @@ msgid "An error occurred while dismissing the feature highlight. Refresh the pag
msgstr "A apărut o eroare la respingerea evidențierii funcțiilor. Reîmprospătați pagina și încercați din nou."
msgid "An error occurred while drawing job relationship links."
-msgstr "A apărut o eroare în timpul trasării legăturilor de relații de muncă."
+msgstr "S-a produs o eroare în timpul trasării linkurilor de relaționare a joburilor."
msgid "An error occurred while enabling Service Desk."
msgstr "A apărut o eroare la activarea Biroului de Servicii."
@@ -3932,7 +4019,7 @@ msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
msgid "An error occurred while fetching codequality mr diff reports."
-msgstr "A apărut o eroare în timpul preluării rapoartelor codequality diff cerere de îmbinare."
+msgstr "S-a produs o eroare în timpul preluării rapoartelor codequality care au creat diff în mr."
msgid "An error occurred while fetching commit data."
msgstr ""
@@ -3983,7 +4070,7 @@ msgid "An error occurred while fetching the job log."
msgstr "A apărut o eroare la preluarea jurnalului de job."
msgid "An error occurred while fetching the job logs."
-msgstr "A apărut o eroare în timpul preluării jurnalelor de lucru."
+msgstr "A apărut o eroare în timpul preluării jurnalelor de joburi."
msgid "An error occurred while fetching the job."
msgstr "A apărut o eroare la preluarea jobului."
@@ -4055,7 +4142,7 @@ msgid "An error occurred while loading the Jobs tab."
msgstr ""
msgid "An error occurred while loading the Needs tab."
-msgstr "A apărut o eroare la încărcarea filei Necesități."
+msgstr "A apărut o eroare la încărcarea filei „Needsâ€"
msgid "An error occurred while loading the Test Reports tab."
msgstr "A apărut o eroare la încărcarea filei Rapoarte test."
@@ -4117,6 +4204,9 @@ msgstr "A apărut o eroare la analizarea căutărilor recente"
msgid "An error occurred while parsing the file."
msgstr "A apărut o eroare în timpul analizării fișierului."
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr "A apărut o eroare în timpul lipirii textului în editor. Vă rugăm să încercați din nou."
+
msgid "An error occurred while removing epics."
msgstr "A apărut o eroare la eliminarea epicelor."
@@ -4124,7 +4214,7 @@ msgid "An error occurred while removing issues."
msgstr "A apărut o eroare la eliminarea problemelor."
msgid "An error occurred while rendering preview broadcast message"
-msgstr "A apărut o eroare în timpul redării mesajului de transmisie de previzualizare"
+msgstr "A apărut o eroare la redarea previzualizării mesajului de difuzare."
msgid "An error occurred while rendering the editor"
msgstr "A apărut o eroare în timpul redării editorului"
@@ -4136,7 +4226,7 @@ msgid "An error occurred while retrieving calendar activity"
msgstr "A apărut o eroare la preluarea activităților din calendar"
msgid "An error occurred while retrieving diff"
-msgstr "A apărut o eroare în timpul preluării diff"
+msgstr "A apărut o eroare în timpul preluării diff-ului"
msgid "An error occurred while retrieving diff files"
msgstr "S-a produs o eroare în timpul recuperării fișierelor diff"
@@ -4157,7 +4247,7 @@ msgid "An error occurred while subscribing to notifications."
msgstr "A apărut o eroare la abonarea la notificări."
msgid "An error occurred while triggering the job."
-msgstr "A apărut o eroare la declanșarea lucrării."
+msgstr "S-a produs o eroare la declanșarea jobului."
msgid "An error occurred while trying to generate the report. Please try again later."
msgstr "A apărut o eroare în timpul încercării de generare a raportului. Vă rugăm să încercați din nou mai târziu."
@@ -4175,19 +4265,19 @@ msgid "An error occurred while updating assignees."
msgstr "A apărut o eroare la actualizarea responsabililor."
msgid "An error occurred while updating configuration."
-msgstr "S-a produs o eroare în timpul actualizării configurației."
+msgstr "S-a produs o eroare la actualizarea configurației."
msgid "An error occurred while updating labels."
-msgstr "S-a produs o eroare în timpul actualizării etichetelor."
+msgstr "S-a produs o eroare la actualizarea etichetelor."
msgid "An error occurred while updating the comment"
msgstr "A apărut o eroare la actualizarea comentariului"
msgid "An error occurred while updating the configuration."
-msgstr "A apărut o eroare în timpul actualizării configurației."
+msgstr ""
msgid "An error occurred while updating the notification settings. Please try again."
-msgstr "A apărut o eroare în timpul actualizării setărilor de notificare. Vă rugăm să încercați din nou."
+msgstr "A apărut o eroare la actualizarea setărilor de notificare. Vă rugăm să încercați din nou."
msgid "An error occurred while uploading the file. Please try again."
msgstr "S-a întâmplat o eroare în timpul încărcării fișierului. Vă rugăm încercați din nou."
@@ -4211,10 +4301,10 @@ msgid "An example project for managing Kubernetes clusters integrated with GitLa
msgstr "Un exemplu de proiect pentru gestionarea clusterelor Kubernetes integrat cu GitLab"
msgid "An example project that shows off the best practices for setting up GitLab for your own organization, including sample issues, merge requests, and milestones"
-msgstr "Un proiect de exemplu care prezintă cele mai bune practici pentru configurarea GitLab pentru propria organizație, inclusiv exemple de probleme, merge request-uri și obiectivuri."
+msgstr "Un proiect de exemplu care prezintă cele mai bune practici pentru configurarea GitLab pentru propria organizație, inclusiv exemple de probleme, merge request-uri și obiective."
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
-msgstr "Un exemplu care arată cum să utilizați Jsonnet cu conducte dinamice copii ale GitLab"
+msgstr "Un exemplu care arată cum să folosiți Jsonnet cu conductele copil dinamice GitLab"
msgid "An incident has been resolved in %{project_path}."
msgstr ""
@@ -4231,6 +4321,9 @@ msgstr "Există deja o problemă"
msgid "An unauthenticated user"
msgstr "Un utilizator neautentificat"
+msgid "An unexpected error occurred"
+msgstr "A apărut o eroare neașteptată"
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "A apărut o eroare neașteptată în timpul verificării mediului de proiect."
@@ -4241,7 +4334,7 @@ msgid "An unexpected error occurred while communicating with the Web Terminal."
msgstr "A apărut o eroare neașteptată în timpul comunicării cu Terminalul Web."
msgid "An unexpected error occurred while loading the code quality diff."
-msgstr "S-a întâmplat o eroare neașteptată în timpul încărcării quality diff-ul codului."
+msgstr "A apărut o eroare neașteptată în timpul încărcării diff-ului de calitate a codului."
msgid "An unexpected error occurred while starting the Web Terminal."
msgstr "A apărut o eroare neașteptată la pornirea Terminalului Web."
@@ -4259,25 +4352,25 @@ msgid "Analytics"
msgstr "Statistici"
msgid "Analyze a review version of your web application."
-msgstr "Analizați o versiune de revizuire a aplicației dvs. web."
+msgstr "Analizează o versiune de revizuire a aplicației dvs. web."
msgid "Analyze your dependencies for known vulnerabilities."
-msgstr "Analizați-vă dependențele pentru vulnerabilități cunoscute."
+msgstr "Analizează dependențele dvs. pentru vulnerabilități cunoscute."
msgid "Analyze your infrastructure as code configuration files for known vulnerabilities."
-msgstr ""
+msgstr "Analizează fișierele de configurare a infrastructurii ca și cod pentru vulnerabilități cunoscute."
msgid "Analyze your source code and git history for secrets."
msgstr "Analizați-vă codul sursă și istoricul git pentru a găsi secrete."
msgid "Analyze your source code for known vulnerabilities."
-msgstr "Analizați-vă codul sursă pentru vulnerabilități cunoscute."
+msgstr "Analizează codul dvs. sursă pentru vulnerabilități cunoscute."
msgid "Analyzing file…"
msgstr "Se analizează fișierul…"
msgid "Ancestors"
-msgstr "Ancestori"
+msgstr "Antecesori"
msgid "And this registration token:"
msgstr "Și acest token de înregistrare:"
@@ -4321,6 +4414,9 @@ msgstr "Orice obiectiv"
msgid "Any namespace"
msgstr "Orice spațiu de nume"
+msgid "Anyone can register for an account."
+msgstr "Oricine se poate înregistra pentru un cont."
+
msgid "App ID"
msgstr "ID Aplicație"
@@ -4355,7 +4451,7 @@ msgid "Application settings update failed"
msgstr "Actualizarea setărilor aplicației a eșuat"
msgid "Application uninstalled but failed to destroy: %{error_message}"
-msgstr "Aplicație dezinstalată, dar nu a reușit să distrugă: %{error_message}"
+msgstr "Aplicația a fost dezinstalată, dar nu a reușit să fie ștearsă: %{error_message}"
msgid "Application was successfully destroyed."
msgstr "Aplicația a fost distrusă cu succes."
@@ -4374,7 +4470,7 @@ msgstr "Domenii permise pentru înscrieri"
msgid "ApplicationSettings|Approve %d user"
msgid_plural "ApplicationSettings|Approve %d users"
-msgstr[0] "Aprobați %d utilizatori"
+msgstr[0] "Aprobați %d utilizator"
msgstr[1] "Aprobați %d utilizatori"
msgstr[2] "Aprobați %d de utilizatori"
@@ -4382,7 +4478,7 @@ msgid "ApplicationSettings|Approve users"
msgstr ""
msgid "ApplicationSettings|Approve users in the pending approval status?"
-msgstr "Aprobați utilizatorii în statusul de aprobare în așteptare?"
+msgstr "Aprobați utilizatorii care se află în stadiul de așteptare a aprobării?"
msgid "ApplicationSettings|Approve users who are pending approval?"
msgstr ""
@@ -4400,10 +4496,10 @@ msgid "ApplicationSettings|Denied domains for sign-ups"
msgstr "Domenii refuzate pentru înscrieri"
msgid "ApplicationSettings|Denylist file"
-msgstr "Fișier denylist"
+msgstr "Fișier cu lista de refuzări"
msgid "ApplicationSettings|Domain denylist"
-msgstr "Denylist domeniu"
+msgstr "Lista de domenii refuzate"
msgid "ApplicationSettings|Email restrictions"
msgstr "Restricții de e-mail"
@@ -4412,13 +4508,13 @@ msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr "Restricții de e-mail pentru înscrieri"
msgid "ApplicationSettings|Enable domain denylist for sign ups"
-msgstr "Activați denylist-ul domeniului pentru înscrieri"
+msgstr "Activați lista de domenii refuzate pentru înscrieri"
msgid "ApplicationSettings|Enable email restrictions for sign ups"
msgstr "Activați restricțiile de e-mail pentru înscrieri"
msgid "ApplicationSettings|Enter denylist manually"
-msgstr "Introduceți manual denylist-ul"
+msgstr "Completați manual lista de refuzări"
msgid "ApplicationSettings|Markdown enabled"
msgstr "Markdown activat"
@@ -4427,7 +4523,7 @@ msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr "Lungimea minimă a parolei (număr de caractere)"
msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr "DOAR utilizatorii cu adrese de e-mail care se potrivesc cu aceste domenii vor putea să se înscrie. Sunt permise wildcard-uri. Folosiți linii separate pentru intrări multiple. Ex: domain.com, *.domain.com"
+msgstr "NUMAI utilizatorii cu adrese de e-mail care corespund acestor domenii se vor putea înscrie. Sunt permise caractere wildcard. Folosiți linii separate pentru intrări multiple. Ex: domain.com, *.domain.com"
msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
msgstr "După ce instanța atinge limita de utilizatori, orice utilizator care este adăugat sau solicită acces va trebui să fie aprobat de un administrator. Lăsați câmpul gol pentru nelimitat."
@@ -4436,13 +4532,13 @@ msgid "ApplicationSettings|Require admin approval for new sign-ups"
msgstr "Necesită aprobarea administratorului pentru noile înscrieri"
msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. See the %{linkStart}supported syntax%{linkEnd} for more information."
-msgstr "Restrânge înscrierile pentru adresele de e-mail care se potrivesc cu regex-ul dat. Pentru mai multe informații, consultați sintaxa %{linkStart}supported%{linkEnd}."
+msgstr "Limitează înscrierile pentru adresele de e-mail care se potrivesc cu regex-ul dat. Pentru mai multe informații, consultați %{linkStart}sintaxa acceptată %{linkEnd}."
msgid "ApplicationSettings|Save changes"
msgstr "Salvare modificări"
msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
-msgstr "Vezi %{linkStart}Instrucțiunile politicilor de parolă%{linkEnd} ale GitLab"
+msgstr "Consultați%{linkStart}Ghidul politicii privind parolele%{linkEnd} GitLab"
msgid "ApplicationSettings|Send confirmation email on sign-up"
msgstr "Trimiteți un e-mail de confirmare la înscriere"
@@ -4451,16 +4547,16 @@ msgid "ApplicationSettings|Sign-up enabled"
msgstr "Înregistrare activată"
msgid "ApplicationSettings|Upload denylist file"
-msgstr "Încărcați fișierul denylist"
+msgstr "Încărcați fișierul cu lista de refuzări"
msgid "ApplicationSettings|User cap"
msgstr "Limită utilizatori"
msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr "Utilizatorii cu adrese de e-mail care se potrivesc cu aceste domenii NU se vor putea înscrie. Sunt permise wildcard-uri. Folosiți linii separate pentru intrări multiple. Ex: domain.com, *.domain.com"
+msgstr "Utilizatorii cu adrese de e-mail care se potrivesc cu aceste domenii NU se vor putea înscrie. Sunt permise caractere wildcard. Folosiți linii separate pentru intrări multiple. Ex: domain.com, *.domain.com"
msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
-msgstr "Utilizatorii cu adrese de e-mail care se potrivesc cu aceste domenii NU se vor putea înscrie. Sunt permise wildcard-uri. Utilizați linii separate sau virgule pentru intrări multiple."
+msgstr "Utilizatorii cu adrese de e-mail care se potrivesc cu aceste domenii NU se vor putea înscrie. Sunt permise caractere wildcard. Folosiți linii separate sau virgule pentru intrări multiple."
msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
msgstr "Atunci când este activat, orice utilizator care vizitează %{host} și creează un cont va trebui să fie aprobat în mod explicit de către un administrator înainte de a se putea conecta. Această setare este eficientă numai înscrierile sunt activate."
@@ -4482,9 +4578,9 @@ msgstr "Aplică"
msgid "Apply %d suggestion"
msgid_plural "Apply %d suggestions"
-msgstr[0] "Aplicați %d sugestia"
-msgstr[1] "Aplicați %d sugestiile"
-msgstr[2] "Aplicați %d sugestiile"
+msgstr[0] "Aplicați %d sugestie"
+msgstr[1] "Aplicați %d sugestii"
+msgstr[2] "Aplicați %d de sugestii"
msgid "Apply a label"
msgstr "Aplicați o etichetă"
@@ -4514,16 +4610,16 @@ msgid "Applying command to %{commandDescription}"
msgstr "Aplicarea comenzii la %{commandDescription}"
msgid "Applying multiple commands"
-msgstr "Aplicarea mai multor comenzi"
+msgstr "Aplicarea de comenzi multiple"
msgid "Applying suggestion..."
-msgstr "Aplicând sugestia..."
+msgstr "Aplicarea sugestiei..."
msgid "Applying suggestions..."
msgstr "Aplicarea sugestiilor..."
msgid "Approval Status"
-msgstr "Statusul aprobării"
+msgstr "Statusul de aprobare"
msgid "Approval rules"
msgstr "Reguli de aprobare"
@@ -4542,9 +4638,9 @@ msgstr[2] "%d de membrii"
msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{strongStart}%{count} member%{strongEnd}. Approvals from this member are not revoked."
msgid_plural "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{strongStart}%{count} members%{strongEnd}. Approvals from these members are not revoked."
-msgstr[0] "Sunteți pe cale de a elimina grupul de aprobatori %{name} care are %{strongStart}%{count} membru%{strongEnd}. Aprobările de la acest membru nu sunt revocate."
-msgstr[1] "Sunteți pe cale de a elimina grupul de aprobatori %{name} care are %{strongStart}%{count} membri%{strongEnd}. Aprobările de la acești membri nu sunt revocate."
-msgstr[2] "Sunteți pe cale de a elimina grupul de aprobatori %{name} care are %{strongStart}%{count} de membri%{strongEnd}. Aprobările de la acești membri nu sunt revocate."
+msgstr[0] "Sunteți pe cale de a înlătura grupul de aprobatori %{name} care are %{strongStart}%{count} membru%{strongEnd}. Aprobările de la acest membru nu sunt revocate."
+msgstr[1] "Sunteți pe cale de a înlătura grupul de aprobatori %{name} care are %{strongStart}%{count} membri%{strongEnd}. Aprobările de la acești membri nu sunt revocate."
+msgstr[2] "Sunteți pe cale de a înlătura grupul de aprobatori %{name} care are %{strongStart}%{count} de membri%{strongEnd}. Aprobările de la acești membri nu sunt revocate."
msgid "ApprovalRuleSummary|%d member"
msgid_plural "ApprovalRuleSummary|%d members"
@@ -4592,7 +4688,7 @@ msgid "ApprovalRule|Approvals required"
msgstr "Aprobări necesare"
msgid "ApprovalRule|Approver Type"
-msgstr "Tip aprobator"
+msgstr "Tipul de aprobator"
msgid "ApprovalRule|Approvers"
msgstr "Aprobatori"
@@ -4613,7 +4709,7 @@ msgid "ApprovalRule|Increase quality and maintain standards."
msgstr ""
msgid "ApprovalRule|Learn more about merge request approval rules."
-msgstr ""
+msgstr "Aflați mai multe despre regulile de aprobare a merge request-ului."
msgid "ApprovalRule|Name"
msgstr "Nume"
@@ -4631,7 +4727,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 "Vă rugăm selectați măcar un nivel de severitate"
+msgstr "Vă rugăm selectați cel puțin un nivel de severitate"
msgid "ApprovalRule|Please select at least one vulnerability state"
msgstr ""
@@ -4661,13 +4757,13 @@ msgid "ApprovalRule|Select scanners"
msgstr "Selectați scanerele"
msgid "ApprovalRule|Select severity levels"
-msgstr "Selectați nivele de severitate"
+msgstr "Selectați nivelele de severitate"
msgid "ApprovalRule|Select vulnerability states"
msgstr ""
msgid "ApprovalRule|Severity levels"
-msgstr "Nivele severitate"
+msgstr "Nivele de severitate"
msgid "ApprovalRule|Target branch"
msgstr "Ramura țintă"
@@ -4688,7 +4784,7 @@ msgid "ApprovalSettings|Prevent approval by author"
msgstr ""
msgid "ApprovalSettings|Prevent approval by author."
-msgstr "Prevenire aprobare de către autor."
+msgstr "Prevenire a aprobării de către autor."
msgid "ApprovalSettings|Prevent approvals by users who add commits"
msgstr ""
@@ -4712,7 +4808,7 @@ msgid "ApprovalSettings|There was an error loading merge request approval settin
msgstr "S-a întâmplat o eroare încărcând setările de aprobare a cererilor de îmbinare."
msgid "ApprovalSettings|There was an error updating merge request approval settings."
-msgstr "S-a întâmplat o eroare actualizând setările de aprobare a cererilor de îmbinare."
+msgstr "S-a produs o eroare la actualizarea setărilor de aprobare a merge request-urilor."
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr "Această setare este configurată la nivel de instanță și poate fi schimbată doar de un administrator."
@@ -4724,10 +4820,10 @@ msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr "Aderă la separarea sarcinilor"
msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr "Cel puțin o regulă nu respectă separarea atribuțiilor"
+msgstr "Cel puțin o regulă nu respectă separarea sarcinilor"
msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr "Nu respectă separarea atribuțiilor"
+msgstr "Nu respectă separarea sarcinilor"
msgid "Approvals are optional."
msgstr "Aprobările sunt opționale."
@@ -4784,7 +4880,7 @@ msgid "Archive project"
msgstr "Arhivare proiect"
msgid "Archive test case"
-msgstr "Arhivare caz testare"
+msgstr "Arhivare a cazului de testare"
msgid "Archived"
msgstr "Arhivat"
@@ -4802,10 +4898,10 @@ msgid "Archived projects"
msgstr "Proiecte arhivate"
msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr "Arhivarea proiectului va face ca acesta să fie în întregime numai pentru citire. Acesta este ascuns din tabloul de bord și nu apare în căutări. %{strong_start}repozitoriul nu poate accepta commit-uri și nu pot fi create probleme, comentarii sau alte entități.%{strong_end} %{link_start}Aflați mai multe.%{link_end}"
+msgstr "Arhivarea proiectului va face ca acesta să fie în întregime numai în citire. Acesta este ascuns din tabloul de bord și nu apare în căutări. %{strong_start}repozitoriul nu poate accepta commit-uri și nu pot fi create probleme, comentarii sau alte entități.%{strong_end} %{link_start}Aflați mai multe.%{link_end}"
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
-msgstr "Sunteți ABSOLUT SIGUR că doriți să ștergeți acest grup?"
+msgstr "Sunteți ABSOLUT SIGUR că doriți să înlăturați acest grup?"
msgid "Are you absolutely sure?"
msgstr ""
@@ -4813,6 +4909,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "Sunteți sigur că doriți să arhivați acest proiect?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr "Sunteți sigur că doriți să distrugeți %{application}"
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "Sunteți sigur că doriți să dezarhivați acest proiect?"
@@ -4872,7 +4971,7 @@ msgstr "Sunteți sigur că doriți să renunțați la modificările dvs.?"
msgid "Are you sure you want to import %d repository?"
msgid_plural "Are you sure you want to import %d repositories?"
-msgstr[0] "Sunteți sigur că doriți să importați repozitoriul %d?"
+msgstr[0] "Sunteți sigur că doriți să importați %d repozitoriu?"
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?"
@@ -4898,28 +4997,28 @@ msgid "Are you sure you want to reindex?"
msgstr "Sunteți sigur că doriți să reindexați?"
msgid "Are you sure you want to remove %{email}?"
-msgstr "Sunteți sigur că doriți să eliminați %{email}?"
+msgstr "Sunteți sigur că doriți să înlăturați %{email}?"
msgid "Are you sure you want to remove %{group_name}?"
-msgstr "Sunteți sigur că doriți să eliminați %{group_name}?"
+msgstr "Sunteți sigur că doriți să înlăturați %{group_name}?"
msgid "Are you sure you want to remove the attachment?"
-msgstr "Sunteți sigur că doriți să eliminați atașamentul?"
+msgstr "Sunteți sigur că doriți să înlăturați atașamentul?"
msgid "Are you sure you want to remove the license?"
-msgstr "Sunteți sigur că doriți să eliminați licența?"
+msgstr "Sunteți sigur că doriți să înlăturați licența?"
msgid "Are you sure you want to remove this deploy key? If anything is still using this key, it will stop working."
-msgstr "Sunteți sigur că doriți să eliminați această cheie de implementare? Dacă mai există ceva care utilizează această cheie, nu va mai funcționa."
+msgstr "Sunteți sigur că doriți să înlăturați această cheie de implementare? Dacă mai există ceva care utilizează această cheie, nu va mai funcționa."
msgid "Are you sure you want to remove this identity?"
-msgstr "Sunteți sigur că doriți să eliminați această identitate?"
+msgstr "Sunteți sigur că doriți să înlăturați această identitate?"
msgid "Are you sure you want to remove this list?"
-msgstr "Sunteți sigur că doriți să eliminați această listă?"
+msgstr "Sunteți sigur că doriți să înlăturați această listă?"
msgid "Are you sure you want to remove this nickname?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să înlăturați această poreclă?"
msgid "Are you sure you want to reset the health check token?"
msgstr "Sunteți sigur că doriți să resetați tokenul de verificare a sănătății?"
@@ -4958,13 +5057,13 @@ msgid "Are you sure?"
msgstr "Sunteți sigur?"
msgid "Are you sure? All commits that were signed with this GPG key will be unverified."
-msgstr "Sunteți sigur? Toate modificările care au fost semnate cu această cheie GPG vor fi neverificate."
+msgstr "Sunteți sigur? Toate commit-urile care au fost semnate cu această cheie GPG vor fi neverificate."
msgid "Are you sure? Removing this GPG key does not affect already signed commits."
msgstr "Sunteți sigur? Eliminarea acestei chei GPG nu afectează commit-urile deja semnate."
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
-msgstr "Sunteți sigur? Dispozitivul va fi deconectat de la GitLab și toate token-urile de tip \"remember me\" vor fi revocate."
+msgstr "Sunteți sigur? Dispozitivul va fi deconectat de la GitLab și toate tokenurile de tip „amintiți-vă de mine†vor fi revocate."
msgid "Arrange charts"
msgstr "Aranjați diagramele"
@@ -4982,13 +5081,13 @@ msgid "Artifacts"
msgstr "Artefacte"
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
-msgstr "Pe măsură ce continuăm să dezvoltăm mai multe funcții pentru SAST, ne-ar plăcea să primim feedback-ul dvs. cu privire la funcția de configurare SAST din %{linkStart}acest număr%{linkEnd}."
+msgstr "Pe măsură ce continuăm să dezvoltăm mai multe funcții pentru SAST, ne-ar plăcea să primim feedback-ul dvs. cu privire la funcția de configurare SAST în %{linkStart}această problemă%{linkEnd}."
msgid "AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{commit_url} ):"
msgstr "%{user} a publicat commit-ul la ramura %{branch} a %{project_name} ( %{commit_url} ):"
msgid "AsanaService|Add commit messages as comments to Asana tasks."
-msgstr "Adaugați mesaje de confirmare ca și comentarii la sarcinile Asana."
+msgstr "Adăugați mesajele de commit-uri ca și comentarii la sarcinile Asana."
msgid "AsanaService|Comma-separated list of branches to be automatically inspected. Leave blank to include all branches."
msgstr "Listă de ramuri separate prin virgulă care urmează să fie inspectate automat. Lăsați necompletat pentru a include toate ramurile."
@@ -5027,10 +5126,10 @@ msgid "Assign To"
msgstr "Atribuire către"
msgid "Assign custom color like #FF0000"
-msgstr "Atribuiți culoarea personalizată, cum ar fi # FF0000"
+msgstr "Atribuire de culoare personalizată, cum ar fi # FF0000"
msgid "Assign labels"
-msgstr "Atribuiți etichete"
+msgstr "Atribuire etichete"
msgid "Assign milestone"
msgstr "Atribuire obiectiv"
@@ -5045,7 +5144,7 @@ msgid "Assign severity"
msgstr ""
msgid "Assign some issues to this milestone."
-msgstr "Atribuiți câteva probleme acestui obiectiv."
+msgstr "Atribuire de câteva probleme la acest obiectiv."
msgid "Assign to"
msgstr "Atribuire către"
@@ -5056,12 +5155,6 @@ msgstr "Atribuire unui utilizator comentator"
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr "Atribuiți-vă acestor probleme"
-
-msgid "Assign yourself to this issue"
-msgstr "Atribuiți-vă acestei probleme"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "Atribuit %{assignee_users_sentence}."
@@ -5096,7 +5189,7 @@ msgstr[1] "%d Responsabili"
msgstr[2] "%d de Responsabili"
msgid "Assignee has no permissions"
-msgstr "Responsabil nu are permisiuni"
+msgstr "Responsabilul nu are permisiuni"
msgid "Assignee lists not available with your current license"
msgstr "Listele de responsabili nu sunt disponibile cu licența dvs. curentă"
@@ -5117,10 +5210,10 @@ msgid "At least one approval from a code owner is required to change files match
msgstr "Cel puțin o aprobare din partea unui proprietar de cod este necesară pentru a schimba fișierele care corespund regulilor respective CODEOWNER."
msgid "At least one field of %{one_of_required_fields} must be present"
-msgstr "Măcar un câmp de %{one_of_required_fields} trebuie să fie prezent."
+msgstr "Cel puțin un câmp din %{one_of_required_fields} trebuie să fie prezent."
msgid "At least one of group_id or project_id must be specified"
-msgstr "Cel puțin unul dintre group_id sau project_id trebuie să fie specificat"
+msgstr "Cel puțin un group_id sau project_id trebuie să fie specificat"
msgid "At least one of your Personal Access Tokens is expired, but expiration enforcement is disabled. %{generate_new}"
msgstr "Cel puțin unul dintre token-urile personale de acces a expirat, dar aplicarea expirării este dezactivată. %{generate_new}"
@@ -5135,7 +5228,7 @@ msgid "Attach a file"
msgstr "Atașați un fișier"
msgid "Attach a file by drag &amp; drop or %{upload_link}"
-msgstr "Atașați un fișier prin tragere &amp; lăsare sau %{upload_link}"
+msgstr "Atașați un fișier prin glisare &amp; fixare sau %{upload_link}"
msgid "Attaching File - %{progress}"
msgstr "Atașarea fișierului - %{progress}"
@@ -5152,6 +5245,9 @@ msgstr "Atașarea fișierului a eșuat."
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr "Se solicită atenție"
+
msgid "Audit Events"
msgstr "Evenimente de audit"
@@ -5159,7 +5255,7 @@ msgid "Audit events"
msgstr ""
msgid "AuditLogs|(removed)"
-msgstr "(eliminat)"
+msgstr "(înlăturat)"
msgid "AuditLogs|Action"
msgstr "Acțiune"
@@ -5171,28 +5267,31 @@ msgid "AuditLogs|Date"
msgstr "Data"
msgid "AuditLogs|Failed to find %{type}. Please search for another %{type}."
-msgstr "Nu s-a găsit %{type}. Vă rugăm să căutați un alt %{type}."
+msgstr "Nu s-a reușit să se găsească %{type}. Vă rugăm să căutați un alt %{type}."
msgid "AuditLogs|Failed to find %{type}. Please try again."
-msgstr "Nu s-a găsit %{type}. Vă rugăm să încercați din nou."
+msgstr "Nu s-a reușit să se găsească %{type}. Vă rugăm să încercați din nou."
msgid "AuditLogs|Group Events"
-msgstr "Evenimente de grup"
+msgstr "Evenimentele grupului"
msgid "AuditLogs|IP Address"
-msgstr "Adresă IP"
+msgstr "Adresa IP"
+
+msgid "AuditLogs|Log"
+msgstr "Jurnal"
msgid "AuditLogs|Member Events"
-msgstr "Evenimente pentru membri"
+msgstr "Evenimentele membrilor"
msgid "AuditLogs|No matching %{type} found."
-msgstr "Nu s-a găsit nicio potrivire %{type}."
+msgstr "Nu s-a găsit niciun %{type} corespunzător."
msgid "AuditLogs|Object"
msgstr "Obiect"
msgid "AuditLogs|Project Events"
-msgstr "Evenimente de proiect"
+msgstr "Evenimentele proiectului"
msgid "AuditLogs|Target"
msgstr "Țintă"
@@ -5201,7 +5300,55 @@ msgid "AuditLogs|This month"
msgstr "Luna aceasta"
msgid "AuditLogs|User Events"
-msgstr "Evenimente utilizator"
+msgstr "Evenimentele utilizatorului"
+
+msgid "AuditStreams|Active"
+msgstr "Activ"
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr "Adăugați un punct final HTTP pentru a gestiona jurnalele de audit în sistemele terților."
+
+msgid "AuditStreams|Add external stream destination"
+msgstr "Adăugați o destinație de flux extern"
+
+msgid "AuditStreams|Add stream"
+msgstr "Adăugați un flux"
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr "S-a produs o eroare la crearea destinației fluxului de evenimente de audit extern. Vă rugăm să încercați din nou."
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr "S-a produs o eroare la ștergerea destinației fluxului de evenimente de audit extern. Vă rugăm să încercați din nou."
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr "S-a produs o eroare la preluarea fluxurilor de evenimente de audit extern. Vă rugăm să încercați din nou."
+
+msgid "AuditStreams|Cancel editing"
+msgstr "Anulați editarea"
+
+msgid "AuditStreams|Delete %{link}"
+msgstr "Ștergeți %{link}"
+
+msgid "AuditStreams|Destination URL"
+msgstr "Adresa URL de destinație"
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr "Destinațiile primesc toate datele evenimentelor de audit"
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr "Configurați streamingul pentru evenimentele de audit"
+
+msgid "AuditStreams|Stream count icon"
+msgstr "Pictograma numărului de fluxuri"
+
+msgid "AuditStreams|Streams"
+msgstr "Fluxuri"
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr "Acestea ar putea include informații sensibile. Asigurați-vă că aveți încredere în punctul final de destinație."
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr "Acest lucru este excelent pentru a păstra totul într-un singur loc."
msgid "Aug"
msgstr "Aug"
@@ -5225,10 +5372,10 @@ msgid "Authenticated API requests"
msgstr "Solicitări API autentificate"
msgid "Authenticated Git LFS rate limit period in seconds"
-msgstr "Perioadă limită rată Git LFS autentificat în secunde"
+msgstr "Perioada de limitare a ratei Git LFS autentificat în secunde"
msgid "Authenticated Git LFS request rate limit"
-msgstr "Limită rată cereri Git LFS autentificat"
+msgstr "Limita ratei de solicitare Git LFS autentificate."
msgid "Authenticated Git LFS requests"
msgstr ""
@@ -5237,7 +5384,7 @@ msgid "Authenticated web rate limit period in seconds"
msgstr "Perioada de limitare a vitezei web autentificate în secunde"
msgid "Authenticated web requests"
-msgstr "Solicitări autentificate web"
+msgstr "Solicitări web autentificate"
msgid "Authenticating"
msgstr "Autentificarea"
@@ -5255,7 +5402,7 @@ msgid "Authentication failed: %{error_message}"
msgstr "Autentificarea nu a reușit: %{error_message}"
msgid "Authentication log"
-msgstr "Jurnal autentificare"
+msgstr "Jurnal de autentificare"
msgid "Authentication method"
msgstr "Metoda de autentificare"
@@ -5282,16 +5429,16 @@ msgid "Authored %{timeago} by %{author}"
msgstr "Redactat %{timeago} de %{author}"
msgid "Authorization code:"
-msgstr "Cod de autorizare:"
+msgstr "Codul de autorizare:"
msgid "Authorization key"
-msgstr "Cheie de autorizare"
+msgstr "Cheia de autorizare"
msgid "Authorization required"
msgstr "Autorizație necesară"
msgid "Authorization token duration (minutes)"
-msgstr "Durata autorizării token-ului (minute)"
+msgstr "Durata tokenului de autorizare (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."
@@ -5306,7 +5453,7 @@ msgid "Authorize %{user} to use your account?"
msgstr "Autorizați %{user} să vă folosească contul?"
msgid "Authorized %{new_chat_name}"
-msgstr "Autorizat %{new_chat_name}"
+msgstr "S-a autorizat %{new_chat_name}"
msgid "Authorized At"
msgstr "Autorizat la"
@@ -5336,7 +5483,7 @@ msgid "Auto-cancel redundant pipelines"
msgstr "Auto-anularea conductelor redundante"
msgid "Auto-close referenced issues on default branch"
-msgstr "Închiderea automată a problemelor la care se face referire pe ramura implicită"
+msgstr "Închiderea automată a problemelor referite pe ramura implicită"
msgid "AutoDevOps|%{auto_devops_start}Automate building, testing, and deploying%{auto_devops_end} your applications based on your continuous integration and delivery configuration. %{quickstart_start}How do I get started?%{quickstart_end}"
msgstr "%{auto_devops_start}Automatizați construirea, testarea și implementarea%{auto_devops_end} aplicațiilor dvs. pe baza integrării continue și a configurației de livrare. %{quickstart_start}Cum pot începe?%{quickstart_end}"
@@ -5378,13 +5525,13 @@ msgid "AutoRemediation|Auto-fix solutions"
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 "Dacă utilizați scanarea de dependență și/sau de container, iar auto-fix este activat, auto-fix creează automat cereri de îmbinare cu remedieri de vulnerabilități."
+msgstr "Dacă utilizați scanarea dependențelor și/sau a containerelor și este activată funcția de auto-fixare, auto-fixarea creează automat merge request-uri cu remedieri ale vulnerabilităților."
msgid "AutoRemediation|Introducing GitLab auto-fix"
msgstr "Vă prezentăm GitLab auto-fix"
msgid "AutoRollback|Automatic rollbacks start when a critical alert is triggered. If the last successful deployment fails to roll back automatically, it can still be done manually."
-msgstr "Rollback-ul automat începe atunci când este declanșată o alertă critică. Dacă ultima implementare reușită nu reușește să se facă o revenire automată, aceasta se poate face în continuare manual."
+msgstr "Rollback-urile automate încep atunci când este declanșată o alertă critică. Dacă ultima implementare reușită nu reușește să facă o revenire în mod automat, aceasta se poate face în continuare manual."
msgid "AutoRollback|Automatically roll back to the last successful deployment when a critical problem is detected."
msgstr "Întoarceți automat la ultima implementare reușită atunci când este detectată o problemă critică."
@@ -5450,7 +5597,7 @@ msgid "Avatar for %{assigneeName}"
msgstr "Avatar pentru %{assigneeName}"
msgid "Avatar will be removed. Are you sure?"
-msgstr "Avatarul va fi eliminat. Sunteți sigur?"
+msgstr "Avatarul va fi înlăturat. Sunteți sigur?"
msgid "Average per day: %{average}"
msgstr "Media pe zi: %{average}"
@@ -5462,7 +5609,7 @@ msgid "Award added"
msgstr "Premiu adăugat"
msgid "Award removed"
-msgstr "Premiu eliminat"
+msgstr "Premiu înlăturat"
msgid "AwardEmoji|No emojis found."
msgstr "Nu s-au găsit emoji-uri."
@@ -5477,7 +5624,7 @@ msgid "Background Color"
msgstr "Culoare fundal"
msgid "Background Jobs"
-msgstr "Lucrări de fundal"
+msgstr "Joburi de fundal"
msgid "Background Migrations"
msgstr "Migrații de fundal"
@@ -5563,9 +5710,6 @@ msgstr "Sunteți pe cale de a șterge această insignă. Insignele șterse %{str
msgid "Badges|Your badges"
msgstr "Insignele tale"
-msgid "Balsamiq file could not be loaded."
-msgstr "Fișierul Balsamiq nu a putut fi încărcat."
-
msgid "BambooService|Atlassian Bamboo"
msgstr "Atlassian Bamboo"
@@ -5582,11 +5726,14 @@ msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo."
msgstr "Executați conducte CI/CD cu 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 "Executați conductele CI / CD cu Atlassian Bamboo. Trebuie să configurați etichetarea automată a revizuirilor și un declanșator de depozit în Bamboo. %{docs_link}"
+msgstr "Rulați pipeline-urile CI/CD cu Atlassian Bamboo. Trebuie să configurați etichetarea automată a revizuirilor și un declanșator de repozitoriu în Bamboo. %{docs_link}"
msgid "BambooService|The user with API access to the Bamboo server."
msgstr "Utilizatorul cu acces API la serverul Bamboo."
+msgid "Banner message"
+msgstr "Mesaj banner"
+
msgid "Based on"
msgstr "Bazat pe"
@@ -5594,7 +5741,7 @@ msgid "Basic information"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
-msgstr "Fiți atent. Schimbarea spațiului de nume al proiectului poate avea efecte secundare nedorite."
+msgstr "Aveți grijă. Schimbarea spațiului de nume al proiectului poate avea efecte secundare neintenționate."
msgid "Be careful. Renaming a project's repository can have unintended side effects."
msgstr "Fiți atent. Redenumirea unui repozitoriu al unui proiect poate avea efecte secundare nedorite."
@@ -5624,7 +5771,7 @@ msgid "Beta"
msgstr ""
msgid "Bi-weekly code coverage"
-msgstr "Acoperire bi-săptămânală a codului"
+msgstr "Acoperire bisăptămânală a codului"
msgid "Billable Users"
msgstr "Utilizatori facturabili"
@@ -5648,7 +5795,7 @@ 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 "Dacă doriți să vă reduceți planul, vă rugăm să contactați %{support_link_start}Suport Clienți%{support_link_end}."
+msgstr "Dacă doriți să vă retrogradați planul, vă rugăm să contactați %{support_link_start}Asistența pentru 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 "Aflați mai multe despre fiecare plan citind %{faq_link} nostru sau începeți o încercare gratuită de 30 de zile GitLab.com Ultimate."
@@ -5677,8 +5824,14 @@ msgstr "Pentru a gestiona planul pentru acest grup, vizitați secțiunea de fact
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "Deși GitLab termină disponibilitatea planului de Bronz, încă mai puteți reînnoi abonamentul Bronz încă o dată înainte de %{eoa_bronze_plan_end_date}. Oferim, de asemenea, un upgrade gratuit pe timp limitat la planul nostru Premium (până la 25 de utilizatori)! Aflați mai multe despre modificările și ofertele noastre din %{announcement_link}."
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
-msgstr "Evaluarea ta GitLab.com %{plan} va %{strong_open} expira după %{expiration_date}%{strong_close}. Puteți păstra accesul la funcțiile %{plan} prin actualizarea de mai jos."
+msgstr "Evaluarea dvs. GitLab.com %{plan} va %{strong_open} expira după %{expiration_date}%{strong_close}. Puteți păstra accesul la funcțiile %{plan} prin actualizarea de mai jos."
msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below."
msgstr "Perioada dvs. de evaluare GitLab.com a expirat la %{expiration_date}. Puteți restabili accesul la funcții în orice moment prin actualizarea de mai jos."
@@ -5711,7 +5864,7 @@ msgid "Billings|%{planName} plan"
msgstr "Plan %{planName}"
msgid "Billings|An error occurred while extending your trial."
-msgstr "S-a întâmplat o eroare prelungind perioada de încercare."
+msgstr "S-a produs o eroare în timpul prelungirii perioadei de încercare."
msgid "Billings|An error occurred while reactivating your trial."
msgstr "A apărut o eroare la reactivarea perioadei dvs. de încercare."
@@ -5777,7 +5930,7 @@ msgid "Billing|Awaiting member signup"
msgstr ""
msgid "Billing|Cannot remove user"
-msgstr "Nu se poate elimina utilizatorul"
+msgstr "Nu se poate înlătura utilizatorul"
msgid "Billing|Direct memberships"
msgstr "Abonamente directe"
@@ -5795,7 +5948,7 @@ msgid "Billing|Group invite"
msgstr "Invitație de grup"
msgid "Billing|Members who were invited via a group invitation cannot be removed. You can either remove the entire group, or ask an Owner of the invited group to remove the member."
-msgstr "Membrii care au fost invitați printr-o invitație de grup nu pot fi eliminați. Puteți fie să eliminați întregul grup, fie să solicitați unui proprietar al grupului invitat să îl elimine pe membru."
+msgstr "Membrii care au fost invitați printr-o invitație de grup nu pot fi înlăturați. Puteți fie să înlăturați întregul grup, fie să solicitați unui proprietar al grupului invitat să-l înlăture pe membru."
msgid "Billing|No users to display."
msgstr "Niciun utilizator de afișat."
@@ -5807,31 +5960,31 @@ msgid "Billing|Project invite"
msgstr "Invitație proiect"
msgid "Billing|Remove user %{username} from your subscription"
-msgstr "Eliminați utilizatorul %{username} din abonament"
+msgstr "Înlăturați utilizatorul %{username} din abonament"
msgid "Billing|Toggle seat details"
-msgstr "Comută detaliile locului"
+msgstr "Comutare detalii seat on/off"
msgid "Billing|Type %{username} to confirm"
msgstr "Tastați %{username} pentru a confirma"
msgid "Billing|User was successfully removed"
-msgstr "Utilizatorul a fost eliminat cu succes"
+msgstr "Utilizatorul a fost înlăturat cu succes"
msgid "Billing|Users occupying seats in"
-msgstr "Utilizatori care ocupă locuri în"
+msgstr "Utilizatori care ocupă seat-uri în"
msgid "Billing|View pending approvals"
msgstr ""
msgid "Billing|You are about to remove user %{username} from your subscription. If you continue, the user will be removed from the %{namespace} group and all its subgroups and projects. This action can't be undone."
-msgstr "Ești pe cale să elimini utilizatorul %{username} din abonament. Dacă continuați, utilizatorul va fi eliminat din grupul %{namespace} și din toate subgrupurile și proiectele acestuia. Această acțiune nu poate fi anulată."
+msgstr "Sunteți pe cale să înlăturați utilizatorul %{username} din abonament. Dacă veți continua, utilizatorul va fi înlăturat din grupul %{namespace} și din toate subgrupurile și proiectele acestuia. Această acțiune nu poate fi anulată."
msgid "Bitbucket Server Import"
-msgstr "Import server Bitbucket"
+msgstr "Importul din Serverul Bitbucket"
msgid "Bitbucket Server import"
-msgstr "Import server Bitbucket"
+msgstr "Importul din Serverul Bitbucket"
msgid "Bitbucket import"
msgstr "Import din Bitbucket"
@@ -5852,7 +6005,7 @@ msgid "Blocked by %d issue"
msgid_plural "Blocked by %d issues"
msgstr[0] "Blocat de %d problemă"
msgstr[1] "Blocat de %d probleme"
-msgstr[2] "Blocat de %d probleme"
+msgstr[2] "Blocat de %d de probleme"
msgid "Blocked issue"
msgstr "Problemă blocată"
@@ -5864,16 +6017,16 @@ msgid "Blocking issues"
msgstr "Blocarea problemelor"
msgid "Blocks"
-msgstr "Blocuri"
+msgstr "Blochează"
msgid "Blog"
msgstr "Blog"
msgid "Board scope affects which epics are displayed for anyone who visits this board"
-msgstr ""
+msgstr "Scopul bordului afectează ce epice sunt afișate pentru oricine vizitează acest bord"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
-msgstr "Domeniul de aplicare al forumului afectează ce probleme sunt afișate pentru oricine vizitează acest panou"
+msgstr "Scopul bordului afectează ce probleme sunt afișate pentru oricine vizitează acest bord"
msgid "BoardNewEpic|Groups"
msgstr "Grupuri"
@@ -5891,7 +6044,7 @@ msgid "BoardNewEpic|Select a group"
msgstr "Selectați un grup"
msgid "BoardNewIssue|No matching results"
-msgstr "Nu există rezultate potrivite"
+msgstr "Nu există rezultate care să se potrivească"
msgid "BoardNewIssue|Projects"
msgstr "Proiecte"
@@ -5902,14 +6055,17 @@ msgstr "Căutați proiecte"
msgid "BoardNewIssue|Select a project"
msgstr "Selectați un proiect"
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
-msgstr "S-a întâmplat o eroare preluând obiective, vă rugăm încercați din nou."
+msgstr "A apărut o eroare în timpul obținerii obiectivelor, vă rugăm să încercați din nou."
msgid "BoardScope|An error occurred while searching for labels, please try again."
-msgstr ""
+msgstr "A apărut o eroare în timpul căutării etichetelor, vă rugăm să încercați din nou."
msgid "BoardScope|An error occurred while searching for users, please try again."
-msgstr "S-a întâmplat o eroare căutând utilizatori, vă rugăm încercați din nou."
+msgstr "A apărut o eroare în timpul căutării utilizatorilor, vă rugăm să încercați din nou."
msgid "BoardScope|Any Milestone"
msgstr "Orice obiectiv"
@@ -5917,110 +6073,131 @@ msgstr "Orice obiectiv"
msgid "BoardScope|Any assignee"
msgstr "Orice responsabil"
-msgid "BoardScope|Any label"
+msgid "BoardScope|Any iteration"
msgstr ""
+msgid "BoardScope|Any label"
+msgstr "Orice etichetă"
+
msgid "BoardScope|Assignee"
msgstr "Responsabil"
msgid "BoardScope|Choose labels"
+msgstr "Alegeți etichete"
+
+msgid "BoardScope|Current iteration"
msgstr ""
msgid "BoardScope|Edit"
msgstr "Editare"
-msgid "BoardScope|Labels"
+msgid "BoardScope|Iteration"
msgstr ""
+msgid "BoardScope|Labels"
+msgstr "Etichete"
+
msgid "BoardScope|Milestone"
msgstr "Obiectiv"
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr "Niciun obiectiv"
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr "Căutați obiective"
msgid "BoardScope|Select assignee"
msgstr "Selectați responsabilul"
-msgid "BoardScope|Select labels"
+msgid "BoardScope|Select iteration"
msgstr ""
+msgid "BoardScope|Select labels"
+msgstr "Selectați etichete"
+
msgid "BoardScope|Select milestone"
msgstr "Selectați obiectivul"
msgid "BoardScope|Select weight"
-msgstr "Selectare greutate"
+msgstr "Selectați greutate"
msgid "BoardScope|Started"
-msgstr "Început/ă"
+msgstr "Începută"
msgid "BoardScope|Upcoming"
-msgstr "ÃŽn viitor"
+msgstr "Viitoare"
msgid "BoardScope|Weight"
msgstr "Greutate"
msgid "Boards"
-msgstr "Panouri"
+msgstr "Borduri"
msgid "Boards and board lists"
-msgstr ""
+msgstr "Borduri și liste de borduri"
msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] "+ %{displayedIssuablesCount} mai mult %{issuableType}"
msgstr[1] "+ %{displayedIssuablesCount} mai multe %{issuableType}s"
-msgstr[2] "+ %{displayedIssuablesCount} de mai multe %{issuableType}s"
+msgstr[2] "+ %{displayedIssuablesCount} mai multe %{issuableType}s"
msgid "Boards|An error occurred while creating the epic. Please try again."
-msgstr "A apărut o eroare în timpul creării epicului. Vă rugăm să încercați din nou."
+msgstr "A apărut o eroare în timpul creării epicei. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while creating the issue. Please try again."
-msgstr "A apărut o eroare la crearea problemei. Vă rugăm să încercați din nou."
+msgstr "A apărut o eroare în timpul creării 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."
+msgstr "A apărut o eroare în timpul creării listei. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while fetching child groups. Please try again."
-msgstr ""
+msgstr "S-a produs o eroare în timpul căutării grupurilor copil. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while fetching group projects. Please try again."
-msgstr "A apărut o eroare la preluarea proiectelor de grup. Vă rugăm să încercați din nou."
+msgstr "A apărut o eroare în timpul preluării proiectelor de grup. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while fetching issues. Please reload the page."
-msgstr "S-a întâmplat o eroare preluând problemele. Vă rugăm reîncărcați pagina."
+msgstr "A apărut o eroare în timpul preluării problemelor. Vă rugăm să reîncărcați pagina."
msgid "Boards|An error occurred while fetching labels. Please reload the page."
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 "A apărut o eroare în timpul preluării epicelor panoului. Vă rugăm să reîncărcați pagina."
+msgstr "A apărut o eroare în timpul preluării epicelor bordului. Vă rugăm să reîncărcați pagina."
msgid "Boards|An error occurred while fetching the board issues. Please reload the page."
-msgstr "A apărut o eroare în timpul preluării problemelor de bord. Vă rugăm să reîncărcați pagina."
+msgstr "A apărut o eroare în timpul preluării problemelor bordului. Vă rugăm să reîncărcați pagina."
msgid "Boards|An error occurred while fetching the board lists. Please reload the page."
-msgstr "S-a produs o eroare în timpul preluării listelor de bord. Vă rugăm să reîncărcați pagina."
+msgstr "S-a produs o eroare în timpul preluării listelor bordului. Vă rugăm să reîncărcați pagina."
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
-msgstr "A apărut o eroare în timpul preluării secțiunilor swimlanes. Vă rugăm să reîncărcați pagina."
+msgstr "S-a produs o eroare în timpul preluării bordului swimlanes. Vă rugăm să reîncărcați pagina."
+
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr "S-a produs o eroare în timpul preluării bordului. Vă rugăm să reîncărcați pagina."
msgid "Boards|An error occurred while generating lists. Please reload the page."
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 "A apărut o eroare în timpul mutării epicului. Vă rugăm să încercați din nou."
+msgstr "A apărut o eroare în timpul mutării epicei. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while moving the issue. Please try again."
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 "A apărut o eroare la eliminarea listei. Vă rugăm să încercați din nou."
+msgstr "A apărut o eroare în timpul îndepărtării 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."
+msgstr "A survenit o eroare în timp ce se actualiza lista bordului. Vă rugăm să încercați din nou."
msgid "Boards|Blocked by %{blockedByCount} %{issuableType}"
msgid_plural "Boards|Blocked by %{blockedByCount} %{issuableType}s"
@@ -6029,58 +6206,58 @@ msgstr[1] "Blocat de %{blockedByCount} %{issuableType}s"
msgstr[2] "Blocat de %{blockedByCount} %{issuableType}s"
msgid "Boards|Collapse"
-msgstr "Colapsare"
+msgstr "Restrângere"
msgid "Boards|Edit board"
-msgstr "Editați panoul"
+msgstr "Editare bord"
msgid "Boards|Expand"
msgstr "Extindeți"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
-msgstr "Nu s-a putut prelua blocarea %{issuableType}s"
+msgstr "Nu s-a reușit preluarea %{issuableType}s care blochează"
msgid "Boards|New board"
-msgstr ""
+msgstr "Bord nou"
msgid "Boards|New epic"
-msgstr "Epic nou"
+msgstr "Epică nouă"
msgid "Boards|Retrieving blocking %{issuableType}s"
-msgstr "Retragerea blocării %{issuableType}s"
+msgstr "Recuperarea %{issuableType}s care blochează"
msgid "Boards|View all blocking %{issuableType}s"
-msgstr "Vezi toate tipurile de blocare %{issuableType}s"
+msgstr "Vizualizați toate %{issuableType}s care blochează"
msgid "Boards|View scope"
-msgstr "Vezi domeniul de aplicare"
+msgstr "Vizualizați scopul"
msgid "Board|An error occurred while fetching the board, please try again."
-msgstr ""
+msgstr "A apărut o eroare la preluarea bordului, vă rugăm să încercați din nou."
msgid "Board|Are you sure you want to delete this board?"
msgstr "Sunteți sigur că vreți să ștergeți acest bord?"
msgid "Board|Board scope"
-msgstr "Domeniul de aplicare"
+msgstr "Scopul bordului"
msgid "Board|Create board"
-msgstr "Creare bord"
+msgstr "Creați un bord"
msgid "Board|Create new board"
-msgstr "Creare bord nou"
+msgstr "Creați un nou bord"
msgid "Board|Delete board"
-msgstr "Ștergere panou"
+msgstr "Ștergeți bordul"
msgid "Board|Edit board"
-msgstr "Editare panou"
+msgstr "Editați bordul"
msgid "Board|Enter board name"
-msgstr "Introducere nume panou"
+msgstr "Introduceți numele bordului"
msgid "Board|Failed to delete board. Please try again."
-msgstr "Nu s-a reușit ștergerea panoului. Vă rugăm să încercați din nou."
+msgstr "Nu s-a reușit ștergerea bordului. Vă rugăm să încercați din nou."
msgid "Board|Load more epics"
msgstr "Încărcați mai multe epice"
@@ -6112,6 +6289,9 @@ msgstr "Ramura există deja"
msgid "Branch changed"
msgstr "Ramură schimbată"
+msgid "Branch has been updated since the merge was requested."
+msgstr "Ramura a fost actualizată de când a fost solicitată îmbinarea."
+
msgid "Branch is already taken"
msgstr "Ramura este deja luată"
@@ -6134,7 +6314,7 @@ msgid "Branches|All"
msgstr "Toate"
msgid "Branches|Cancel, keep branch"
-msgstr "Anulați, păstrați ramura"
+msgstr "Anulare, păstrați ramura"
msgid "Branches|Can’t find HEAD commit for this branch"
msgstr ""
@@ -6161,7 +6341,7 @@ msgid "Branches|Delete protected branch. Are you ABSOLUTELY SURE?"
msgstr "Ștergeți ramura protejată. Sunteți ABSOLUT SIGUR?"
msgid "Branches|Deleting the %{strongStart}%{branchName}%{strongEnd} branch cannot be undone. Are you sure?"
-msgstr "Ștergerea %{strongStart}%{branchName}%{strongEnd} nu poate fi anulată. Sunteți sigur?"
+msgstr "Ștergerea ramurii %{strongStart}%{branchName}%{strongEnd} 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?"
@@ -6227,7 +6407,7 @@ msgid "Branches|This branch hasn’t been merged into %{defaultBranchName}. To a
msgstr "Această ramură nu a fost îmbinată în %{defaultBranchName}. Pentru a evita pierderea de date, luați în considerare îmbinarea acestei ramuri înainte de a o șterge."
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
-msgstr "Pentru a renunța la modificările locale și pentru a suprascrie ramura cu versiunea upstream, ștergeți-o aici și alegeți 'Actualizare imediată' de mai sus."
+msgstr "Pentru a renunța la modificările locale și a suprascrie ramura cu versiunea upstream, ștergeți-o aici și alegeți „Actualizare imediată†de mai sus."
msgid "Branches|Unable to load branches"
msgstr ""
@@ -6245,7 +6425,7 @@ msgid "Branches|You're about to permanently delete the protected branch %{strong
msgstr "Sunteți pe cale să ștergeți definitiv ramura protejată %{strongStart}%{branchName}.%{strongEnd}"
msgid "Branches|diverged from upstream"
-msgstr "deviat din upstream"
+msgstr "deviat din amonte"
msgid "Branches|merged"
msgstr "îmbinate"
@@ -6271,9 +6451,6 @@ msgstr "Mesajul difuzat a fost actualizat cu succes."
msgid "Broadcast Messages"
msgstr "Mesaje difuzate"
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr "Mesajele difuzate sunt afișate pentru fiecare utilizator și pot fi utilizate pentru a notifica utilizatorii cu privire la întreținerea programată, actualizările recente și multe altele."
-
msgid "Browse Directory"
msgstr "Explorați directorul"
@@ -6313,6 +6490,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Grupuri existente"
@@ -6355,12 +6535,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr "Grup nou"
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr "Fără părinte"
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6373,9 +6559,15 @@ msgstr "Se afișează %{start}-%{end} din %{total} de la %{link}"
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr "Se afișează %{start}-%{end} din %{total} care se potrivește filtrului \"%{filter}\" din %{link}"
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr "Grup sursă"
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6388,6 +6580,9 @@ msgstr "Nu aveți grupuri de importat"
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6563,7 +6758,7 @@ msgid "CICD|Deployment strategy"
msgstr "Strategia de implementare"
msgid "CICD|Jobs"
-msgstr "Job-uri"
+msgstr "Joburi"
msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr "Limitați accesul CI_JOB_TOKEN"
@@ -6626,7 +6821,7 @@ msgid "Cadence is not automated"
msgstr "Cadența nu este automatizată"
msgid "Calculate the number of slices during reindexing. The multiplier is applied to the number of shards per index. Learn more about %{slice_multiplier_link_start}slice multiplier configuration%{slice_multiplier_link_end}."
-msgstr ""
+msgstr "Calculează numărul de tranșe în timpul reindexării. Multiplicatorul se aplică la numărul de fragmente pe indexare. Aflați mai multe despre %{slice_multiplier_link_start}configurarea multiplicatorului de tranșe%{slice_multiplier_link_end}."
msgid "Callback URL"
msgstr "URL callback"
@@ -6680,7 +6875,7 @@ msgid "Can't be empty"
msgstr "Nu poate fi gol"
msgid "Can't create snippet: %{err}"
-msgstr "Nu se poate crea un fragment: %{err}"
+msgstr "Nu se poate crea un fragment de cod: %{err}"
msgid "Can't fetch content for the blob: %{err}"
msgstr "Nu se poate prelua conținutul pentru blob: %{err}"
@@ -6698,7 +6893,7 @@ msgid "Can't scan the code?"
msgstr "Nu puteți scana codul?"
msgid "Can't update snippet: %{err}"
-msgstr "Nu se poate actualiza fragmentul: %{err}"
+msgstr "Nu se poate actualiza fragmentul de cod: %{err}"
msgid "Canary"
msgstr "Canary"
@@ -6746,7 +6941,7 @@ msgid "Cancel running"
msgstr "Anulați rularea"
msgid "Cancel this job"
-msgstr "Anulați aceast job"
+msgstr "Anulați acest job"
msgid "Cancel your account"
msgstr "Anulați-vă contul"
@@ -6782,10 +6977,10 @@ msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
msgid "Cannot have multiple Jira imports running at the same time"
-msgstr ""
+msgstr "Nu puteți avea mai multe importuri Jira care rulează în același timp"
msgid "Cannot have multiple unresolved alerts"
-msgstr ""
+msgstr "Nu pot exista mai multe alerte nerezolvate"
msgid "Cannot import because issues are not available in this project."
msgstr ""
@@ -6890,13 +7085,13 @@ msgid "Change milestone"
msgstr ""
msgid "Change path"
-msgstr "Schimbă calea"
+msgstr "Schimbați calea"
msgid "Change reviewer(s)"
msgstr "Schimbați revizor(ii)"
msgid "Change reviewer(s)."
-msgstr "Schimbați revizor(ii)"
+msgstr "Schimbare de revizor(i)"
msgid "Change role"
msgstr "Schimbați rolul"
@@ -6914,7 +7109,7 @@ msgid "Change title"
msgstr "Schimbați titlul"
msgid "Change your password"
-msgstr "Schimbă-ți parola"
+msgstr "Schimbați-vă parola"
msgid "Change your password or recover your current one"
msgstr "Schimbați-vă parola sau recuperați-vă parola curentă"
@@ -6967,6 +7162,9 @@ msgstr "Acest lucru va crea un nou commit pentru reversarea modificările existe
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr "Schimbările dvs. vor fi aplicate ramurii %{branchName} deoarece un merge request este deschis."
+msgid "Changed"
+msgstr "Modificat"
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6997,6 +7195,12 @@ msgstr "Schimbările aduse titlului nu au fost salvate"
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr "Caractere rămase"
+
+msgid "Characters over limit"
+msgstr "Caractere peste limită"
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7052,7 +7256,7 @@ msgid "Check again"
msgstr "Verificați din nou"
msgid "Check feature availability on namespace plan"
-msgstr ""
+msgstr "Verificați disponibilitatea funcției în planul spațiului de nume"
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7067,10 +7271,10 @@ msgid "Check with your administrator."
msgstr ""
msgid "Check your Docker images for known vulnerabilities."
-msgstr "Verificați imaginile dvs. Docker pentru vulnerabilități cunoscute."
+msgstr "Verifică 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."
+msgstr "Verifică imaginile clusterului dvs. Kubernetes pentru vulnerabilități cunoscute."
msgid "Check your source instance permissions."
msgstr "Verificați permisiunile instanței sursă."
@@ -7094,13 +7298,13 @@ msgid "Checkout"
msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
-msgstr ""
+msgstr "%{selectedPlanPrice} USD per pachet de stocare de 10 GB pe an"
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
-msgstr "$%{selectedPlanPrice} pe pachet de 1,000 de minute"
+msgstr "$%{selectedPlanPrice} pe pachet de 1.000 de minute"
msgid "Checkout|$%{selectedPlanPrice} per user per year"
-msgstr ""
+msgstr "%{selectedPlanPrice} USD per utilizator pe an"
msgid "Checkout|%d CI minute pack"
msgid_plural "Checkout|%d CI minute packs"
@@ -7115,31 +7319,31 @@ msgid "Checkout|%{name}'s CI minutes"
msgstr "Minutele CI ale %{name}"
msgid "Checkout|%{name}'s GitLab subscription"
-msgstr ""
+msgstr "Abonament GitLab pentru %{name}"
msgid "Checkout|%{name}'s storage subscription"
-msgstr ""
+msgstr "Abonamentul de stocare pentru %{name}"
msgid "Checkout|%{quantity} CI minutes"
-msgstr ""
+msgstr "%{quantity} de minute CI"
msgid "Checkout|%{quantity} GB of storage"
-msgstr ""
+msgstr "%{quantity} GB de stocare"
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{quantity} pachet de stocare"
+msgstr[1] "%{quantity} pachete de stocare"
+msgstr[2] "%{quantity} de pachete de stocare"
msgid "Checkout|%{selectedPlanText} plan"
-msgstr ""
+msgstr "Planul %{selectedPlanText}"
msgid "Checkout|%{startDate} - %{endDate}"
msgstr "%{startDate} - %{endDate}"
msgid "Checkout|(may be %{linkStart}charged upon purchase%{linkEnd})"
-msgstr "(poate fi %{linkStart}plătit la achiziție%{linkEnd})"
+msgstr "(poate fi %{linkStart}facturată la cumpărare%{linkEnd})"
msgid "Checkout|(x%{numberOfUsers})"
msgstr "(x%{numberOfUsers})"
@@ -7148,55 +7352,58 @@ msgid "Checkout|(x%{quantity})"
msgstr "(x%{quantity})"
msgid "Checkout|An unknown error has occurred. Please try again by refreshing this page."
-msgstr ""
+msgstr "A survenit o eroare necunoscută. Vă rugăm să încercați din nou prin reîmprospătarea acestei pagini."
msgid "Checkout|Billing address"
msgstr "Adresa de facturare"
msgid "Checkout|CI minute pack"
-msgstr "Pachet minute CI"
+msgstr "Pachet de 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."
+msgstr "Pachetele de minute CI se utilizează numai după ce ați folosit cota lunară a abonamentului dvs. Minutele suplimentare se vor reporta de la o lună la alta și sunt valabile timp de un an."
msgid "Checkout|CI minutes"
-msgstr ""
+msgstr "Minute CI"
+
+msgid "Checkout|Calculating your subscription..."
+msgstr "Se calculează abonamentul dvs...."
msgid "Checkout|Checkout"
-msgstr ""
+msgstr "Checkout"
msgid "Checkout|City"
-msgstr " OraÈ™"
+msgstr "OraÈ™"
msgid "Checkout|Confirm purchase"
-msgstr " Confirmați achiziția"
+msgstr "Confirmați achiziția"
msgid "Checkout|Confirming..."
msgstr "Se confirmă..."
msgid "Checkout|Continue to billing"
-msgstr ""
+msgstr "Continuați cu facturarea"
msgid "Checkout|Continue to payment"
-msgstr ""
+msgstr "Continuați cu plata"
msgid "Checkout|Country"
-msgstr ""
+msgstr "Èšara"
msgid "Checkout|Create a new group"
-msgstr " Creați un grup nou"
+msgstr "Creați un grup nou"
msgid "Checkout|Credit card form failed to load. Please try again."
-msgstr " Formularul cardului de credit nu s-a încărcat. Vă rugăm să încercați din nou."
+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 " Formularul cardului de credit nu s-a încărcat: %{message}"
+msgstr "Formularul cardului de credit nu s-a încărcat: %{message}"
msgid "Checkout|Edit"
msgstr "Editați"
msgid "Checkout|Enter a number greater than 0"
-msgstr ""
+msgstr "Introduceți un număr mai mare de 0"
msgid "Checkout|Exp %{expirationMonth}/%{expirationYear}"
msgstr "Exp %{expirationMonth}/%{expirationYear}"
@@ -7211,70 +7418,73 @@ msgid "Checkout|Failed to load countries. Please try again."
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 ""
+msgstr "Nu s-a reușit încărcarea județelor. Vă rugăm să încercați din nou."
msgid "Checkout|Failed to load the payment form. Please try again."
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 ""
+msgstr "Nu s-a reușit înregistrarea cardului de credit. Vă rugăm să încercați din nou."
msgid "Checkout|GB"
msgstr "GB"
msgid "Checkout|GitLab group"
-msgstr "Grup GitLab"
+msgstr "Grupul GitLab"
msgid "Checkout|GitLab plan"
-msgstr "Plan GitLab"
+msgstr "Planul GitLab"
msgid "Checkout|Group"
-msgstr "Grup"
+msgstr "Grupul"
msgid "Checkout|Name of company or organization using GitLab"
msgstr "Numele companiei sau organizației care utilizează GitLab"
msgid "Checkout|Need more users? Purchase GitLab for your %{company}."
-msgstr "Nevoie de mai mulți utilizatori? Achiziționați GitLab pentru %{company} dumneavoastră."
+msgstr "Aveți nevoie de mai mulți utilizatori? Achiziționați GitLab pentru %{company} dumneavoastră."
msgid "Checkout|Number of users"
-msgstr "Număr de utilizatori"
+msgstr "Numărul de utilizatori"
msgid "Checkout|Payment method"
-msgstr ""
+msgstr "Modalitatea de plată"
msgid "Checkout|Please select a country"
-msgstr ""
+msgstr "Vă rugăm să selectați o țară"
msgid "Checkout|Please select a state"
-msgstr ""
+msgstr "Vă rugăm să selectați un județ"
msgid "Checkout|Purchase details"
-msgstr "Detalii achiziție"
+msgstr "Detalii de achiziție"
msgid "Checkout|Select"
msgstr "Selectați"
msgid "Checkout|State"
-msgstr ""
+msgstr "JudeÈ›"
msgid "Checkout|Storage packs"
-msgstr ""
+msgstr "Pachete de stocare"
msgid "Checkout|Street address"
-msgstr ""
+msgstr "Adresa străzii"
msgid "Checkout|Submitting the credit card form failed with code %{errorCode}: %{errorMessage}"
-msgstr "Trimiterea formularului de card de credit a eșuat cu codul %{errorCode}: %{errorMessage}"
+msgstr "Trimiterea formularului cardului de credit a eșuat cu codul %{errorCode}: %{errorMessage}"
msgid "Checkout|Subscription details"
-msgstr "Detalii abonament"
+msgstr "Detaliile abonamentului"
msgid "Checkout|Subtotal"
-msgstr "Subtotal"
+msgstr "Total parțial"
msgid "Checkout|Tax"
-msgstr ""
+msgstr "Taxe"
+
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr "Acest număr trebuie să fie %{minimumNumberOfUsers} (seat-urile dvs. în uz) sau mai mult."
msgid "Checkout|Total"
msgstr "Total"
@@ -7283,28 +7493,28 @@ msgid "Checkout|Total minutes: %{quantity}"
msgstr "Total minute: %{quantity}"
msgid "Checkout|Total storage: %{quantity} GB"
-msgstr ""
+msgstr "Spațiu de stocare total: %{quantity} GB"
msgid "Checkout|Users"
msgstr "Utilizatori"
msgid "Checkout|You'll create your new group after checkout"
-msgstr ""
+msgstr "Vă veți crea noul grup după checkout"
msgid "Checkout|Your organization"
-msgstr "Organizația dvs."
+msgstr "Organizația dumneavoastră"
msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
-msgstr ""
+msgstr "Abonamentul dvs. de stocare are aceeași durată ca și abonamentul principal, iar prețul este calculat în mod proporțional."
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"
+msgstr "Codul poștal"
msgid "Checkout|a storage subscription"
-msgstr ""
+msgstr "un abonament de stocare"
msgid "Checkout|company or team"
msgstr "companie sau echipă"
@@ -7313,10 +7523,10 @@ msgid "Checkout|minutes"
msgstr "minute"
msgid "Checkout|x %{quantity} %{units} per pack"
-msgstr ""
+msgstr "x %{quantity} de %{units} per pachet"
msgid "Checkout|x %{quantity} %{units} per pack ="
-msgstr "x %{quantity}%{units} per pachet ="
+msgstr "x %{quantity} de %{units} per pachet ="
msgid "Cherry-pick this commit"
msgstr "Cherry-pick acest commit"
@@ -7373,7 +7583,7 @@ msgid "Choose the top-level group for your repository imports."
msgstr ""
msgid "Choose visibility level, enable/disable project features and their permissions, disable email notifications, and show default award emoji."
-msgstr ""
+msgstr "Alegeți nivelul de vizibilitate, activați/dezactivați caracteristicile proiectului și permisiunile acestora, dezactivați notificările prin e-mail și afișați emoji-ul de recompensă implicit."
msgid "Choose what content you want to see on a group’s overview page."
msgstr ""
@@ -7421,7 +7631,7 @@ msgid "CiStatusLabel|skipped"
msgstr "sărit"
msgid "CiStatusLabel|waiting for delayed job"
-msgstr "în așteptarea unei lucrări întârziate"
+msgstr "în așteptarea unui job întârziat"
msgid "CiStatusLabel|waiting for manual action"
msgstr "așteptare pentru acțiunea manuală"
@@ -7487,10 +7697,10 @@ msgid "CiVariables|Protected"
msgstr "Protejat"
msgid "CiVariables|Remove variable"
-msgstr "Eliminați variabila"
+msgstr "Înlăturați variabila"
msgid "CiVariables|Remove variable row"
-msgstr "Eliminați rândul variabil"
+msgstr "Înlăturați rândul variabil"
msgid "CiVariables|Scope"
msgstr "Domeniul de aplicare"
@@ -7499,10 +7709,10 @@ msgid "CiVariables|Specify variable values to be used in this run. The values sp
msgstr ""
msgid "CiVariables|State"
-msgstr ""
+msgstr "Stare"
msgid "CiVariables|Type"
-msgstr "Tip"
+msgstr "Tipul"
msgid "CiVariables|Value"
msgstr "Valoare"
@@ -7519,24 +7729,12 @@ msgstr "Toate mediile"
msgid "CiVariable|Create wildcard"
msgstr "Creați un wildcard"
-msgid "CiVariable|Masked"
-msgstr "Mascat"
-
msgid "CiVariable|New environment"
msgstr "Mediu nou"
-msgid "CiVariable|Protected"
-msgstr "Protejat"
-
msgid "CiVariable|Search environments"
msgstr "Căutați medii"
-msgid "CiVariable|Toggle masked"
-msgstr "Comutator mascat"
-
-msgid "CiVariable|Toggle protected"
-msgstr "Comutator protejat"
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7550,7 +7748,7 @@ msgid "Clean up image tags"
msgstr ""
msgid "Cleanup policies are executed by background workers. This setting defines the maximum number of workers that can run concurrently. Set it to 0 to remove all workers and not execute the cleanup policies."
-msgstr ""
+msgstr "Politicile de curățare sunt executate de procesele de curățare în fundal. Această setare definește numărul maxim de procese de curățare care pot rula concomitent. Setați-o la 0 pentru a înlătura toate procesele de curățare și pentru a nu executa politicile de curățare."
msgid "Cleanup policy maximum number of tags to be deleted"
msgstr ""
@@ -7559,7 +7757,7 @@ msgid "Cleanup policy maximum processing time (seconds)"
msgstr ""
msgid "Cleanup policy maximum workers running concurrently"
-msgstr ""
+msgstr "Politica de curățare - numărul maxim de procese de curățare care se execută concomitent"
msgid "Clear"
msgstr ""
@@ -7594,6 +7792,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr "Debifați această casetă de selectare dacă doriți să utilizați în schimb un token de acces personal."
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr "Debifați această casetă de selectare dacă doriți să utilizați în schimb un token de acces personal sau o parolă LDAP."
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr "Debifați această casetă de selectare dacă doriți să utilizați un furnizor de autentificare extern."
+
msgid "Clear weight"
msgstr ""
@@ -7628,7 +7835,7 @@ msgid "Click to expand text"
msgstr "Faceți clic pentru a extinde textul"
msgid "Click to hide"
-msgstr "Clic pentru ascundere"
+msgstr "Faceți clic pentru a ascunde"
msgid "Click to reveal"
msgstr "Faceți clic pentru afișare"
@@ -7679,7 +7886,7 @@ msgid "Clones this issue, without comments, to %{project}."
msgstr ""
msgid "Close"
-msgstr "ÃŽnchide"
+msgstr "Închideți"
msgid "Close %{issueType}"
msgstr "Închideți %{issueType}"
@@ -7724,7 +7931,7 @@ msgid "Closed: %{closed}"
msgstr "ÃŽnchis: %{closed}"
msgid "Closes this %{quick_action_target}."
-msgstr "Închide această %{quick_action_target}."
+msgstr "Închideți această %{quick_action_target}."
msgid "Cloud Run"
msgstr ""
@@ -7745,187 +7952,214 @@ msgid "Cluster does not exist"
msgstr ""
msgid "Cluster is required for Stages::ClusterEndpointInserter"
-msgstr ""
+msgstr "Clusterul este necesar pentru Stagii::ClusterEndpointInserter"
msgid "Cluster level"
msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
+msgstr "Tipul de cluster trebuie să fie specificat pentru Stagii::ClusterEndpointInserter"
+
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
-msgstr ""
+msgstr "%{name} a fost șters cu succes"
msgid "ClusterAgents|%{number} of %{total} agents"
-msgstr ""
+msgstr "%{number} din %{total} agenți"
msgid "ClusterAgents|%{number} of %{total} clusters connected through cluster certificates"
-msgstr ""
+msgstr "%{number} din %{total} clustere conectate prin certificate de cluster"
msgid "ClusterAgents|%{titleIcon}Connected"
-msgstr ""
+msgstr "%{titleIcon}Conectat"
msgid "ClusterAgents|%{titleIcon}Not connected"
-msgstr ""
+msgstr "%{titleIcon}Neconectat"
msgid "ClusterAgents|%{tokenName} created"
-msgstr ""
+msgstr "%{tokenName} a fost creat"
msgid "ClusterAgents|%{tokenName} revoked"
-msgstr ""
+msgstr "%{tokenName} a fost revocat"
msgid "ClusterAgents|Access tokens"
-msgstr ""
+msgstr "Tokenuri de acces"
-msgid "ClusterAgents|Actions"
-msgstr ""
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
+msgstr "Adăugați un fișier de configurare a agentului la %{linkStart}acest repozitoriu%{linkEnd} și selectați-l sau creați unul nou pentru a-l înregistra cu GitLab:"
msgid "ClusterAgents|Advanced installation methods"
-msgstr ""
+msgstr "Metode avansate de instalare"
msgid "ClusterAgents|Agent"
-msgstr ""
+msgstr "Agent"
msgid "ClusterAgents|Agent %{strongStart}connected%{strongEnd}"
-msgstr ""
+msgstr "Agent %{strongStart}conectat%{strongEnd}"
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
+msgstr "Agent %{strongStart}disconectat%{strongEnd}"
+
+msgid "ClusterAgents|Agent access token:"
msgstr ""
msgid "ClusterAgents|Agent might not be connected to GitLab"
-msgstr ""
+msgstr "Agentul s-ar putea să nu fie conectat la GitLab"
msgid "ClusterAgents|Agent never connected to GitLab"
-msgstr ""
+msgstr "Agentul nu s-a conectat niciodată la GitLab"
msgid "ClusterAgents|Agent version mismatch"
-msgstr ""
+msgstr "Versiunea agentului nu corespunde"
msgid "ClusterAgents|Agent version mismatch and update"
-msgstr ""
+msgstr "Versiunea și actualizarea agentului nu corespund"
msgid "ClusterAgents|Agent version update required"
-msgstr ""
+msgstr "Este necesară actualizarea versiunii agentului"
msgid "ClusterAgents|All"
-msgstr ""
+msgstr "Tot"
msgid "ClusterAgents|An error occurred while loading your Agents"
-msgstr ""
+msgstr "A apărut o eroare la încărcarea agenților d-voastră"
msgid "ClusterAgents|An error occurred while loading your agent"
msgstr "A apărut o eroare la încărcarea agentului dumneavoastră"
msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
-msgstr ""
+msgstr "S-a produs o eroare în timpul recuperării activității agentului GitLab. Reîncărcați pagina pentru a încerca din nou."
msgid "ClusterAgents|An unknown error occurred. Please try again."
msgstr "A apărut o eroare necunoscută. Vă rugăm să încercați din nou."
msgid "ClusterAgents|Are you sure you want to delete this agent? You cannot undo this."
-msgstr ""
+msgstr "Sunteți sigur că doriți să ștergeți acest agent? Acest lucru nu poate fi anulat."
msgid "ClusterAgents|Certificate"
-msgstr ""
+msgstr "Certificat"
msgid "ClusterAgents|Configuration"
-msgstr ""
+msgstr "Configurație"
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
-msgstr ""
+msgid "ClusterAgents|Connect existing cluster"
+msgstr "Conectați clusterul existent"
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
+msgstr "Conectați-vă cu agentul GitLab"
msgid "ClusterAgents|Connected"
msgstr "Conectat"
msgid "ClusterAgents|Connection status"
-msgstr ""
+msgstr "Starea conexiunii"
+
+msgid "ClusterAgents|Copy command"
+msgstr "Copiați comanda"
msgid "ClusterAgents|Copy token"
-msgstr "Copiați token"
+msgstr "Copiați tokenul"
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
msgstr ""
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr "Creați tokenul de acces al agentului"
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr "Creați un agent: %{searchTerm}"
+
+msgid "ClusterAgents|Create token"
+msgstr "Creați un token"
+
msgid "ClusterAgents|Created by"
msgstr "Creat de"
msgid "ClusterAgents|Created by %{name} %{time}"
-msgstr "Creat de %{name} %{time}"
+msgstr "Creat de %{name} la %{time}"
msgid "ClusterAgents|Date created"
msgstr "Data creării"
+msgid "ClusterAgents|Default configuration"
+msgstr "Configurație implicită"
+
msgid "ClusterAgents|Delete"
-msgstr ""
+msgstr "Ștergere"
msgid "ClusterAgents|Delete agent"
-msgstr ""
+msgstr "Ștergere agent"
msgid "ClusterAgents|Deprecated"
-msgstr ""
+msgstr "Depreciat"
msgid "ClusterAgents|Description"
msgstr "Descriere"
msgid "ClusterAgents|Event occurred"
-msgstr ""
+msgstr "Evenimentul a avut loc"
+
+msgid "ClusterAgents|Failed to create a token"
+msgstr "Nu s-a reușit crearea unui token"
msgid "ClusterAgents|Failed to register an agent"
-msgstr ""
+msgstr "Înregistrarea unui agent nu a reușit"
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
-msgstr ""
+msgstr "Agentul GitLab"
msgid "ClusterAgents|GitLab Agent for Kubernetes"
-msgstr ""
+msgstr "Agentul GitLab pentru Kubernetes"
msgid "ClusterAgents|Give feedback"
-msgstr ""
+msgstr "Oferiți feedback"
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
-msgstr ""
+msgid "ClusterAgents|How do I register an agent?"
+msgstr "Cum se înregistrează un agent?"
msgid "ClusterAgents|How to update an agent?"
-msgstr ""
+msgstr "Cum să actualizez un agent?"
msgid "ClusterAgents|Install a new agent"
-msgstr ""
+msgstr "Instalați un agent nou"
msgid "ClusterAgents|Last connected %{timeAgo}."
-msgstr ""
+msgstr "Ultima conectare acum %{timeAgo}."
msgid "ClusterAgents|Last contact"
-msgstr ""
-
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
+msgstr "Ultimul contact"
msgid "ClusterAgents|Learn how to troubleshoot"
-msgstr ""
+msgstr "Învățați cum să depanați"
msgid "ClusterAgents|Make sure you are using a valid token."
-msgstr ""
+msgstr "Asigurați-vă că utilizați un token valid."
msgid "ClusterAgents|Name"
msgstr "Nume"
@@ -7934,217 +8168,202 @@ msgid "ClusterAgents|Never"
msgstr "Niciodată"
msgid "ClusterAgents|Never connected"
-msgstr ""
+msgstr "Niciodată conectat"
msgid "ClusterAgents|No agents"
-msgstr ""
+msgstr "Fără agenți"
msgid "ClusterAgents|No clusters connected through cluster certificates"
-msgstr ""
+msgstr "Nu există clustere conectate prin certificate de cluster"
msgid "ClusterAgents|Not connected"
-msgstr ""
+msgstr "Neconectat"
msgid "ClusterAgents|Recommended"
-msgstr ""
+msgstr "Recomandat"
msgid "ClusterAgents|Recommended installation method"
msgstr "Metoda de instalare recomandată"
msgid "ClusterAgents|Register"
-msgstr ""
-
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
+msgstr "ÃŽnregistrare"
-msgid "ClusterAgents|Registering Agent"
-msgstr "ÃŽnregistrarea Agentului"
-
-msgid "ClusterAgents|Registration token"
-msgstr "Token de înregistrare"
+msgid "ClusterAgents|Registering agent"
+msgstr "ÃŽnregistrarea agentului"
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
-msgstr ""
+msgstr "Necesită un rol de Întreținător sau mai mare pentru a șterge agenți"
msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
-msgstr ""
+msgstr "Necesită un rol de Întreținător sau mai mare pentru a instala noi agenți"
msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
-msgstr ""
+msgstr "Necesită un rol de Întreținător sau mai mare pentru a efectua aceste acțiuni"
msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
-msgstr ""
+msgstr "Necesită un rol de Întreținător sau un rol mai mare pentru a conecta clusterele existente"
msgid "ClusterAgents|Security"
-msgstr ""
+msgstr "Securitate"
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
-msgstr ""
+msgstr "Consultați actualizările activității agentului, cum ar fi tokenurile create sau revocate și clusterele conectate sau neconectate."
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
-msgstr ""
+msgid "ClusterAgents|Select an agent or enter a name to create new"
+msgstr "Selectați un agent sau introduceți un nume pentru a crea un agent nou"
msgid "ClusterAgents|Tell us what you think"
-msgstr ""
+msgstr "Spuneți-ne ce părere aveți"
msgid "ClusterAgents|The GitLab Agent provides an increased level of security when connecting Kubernetes clusters to GitLab. %{linkStart}Learn more about the GitLab Agent.%{linkEnd}"
-msgstr ""
+msgstr "Agentul GitLab oferă un nivel ridicat de securitate la conectarea clusterelor Kubernetes la GitLab. %{linkStart}Aflați mai multe despre agentul GitLab.%{linkEnd}"
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
-msgstr ""
+msgstr "Agentul nu a mai fost conectat de mult timp. Poate exista o problemă de conectivitate. Ultimul contact a fost acum %{timeAgo}."
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
-msgstr ""
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgstr "Versiunea agentului nu se potrivește între toate podurile clusterului dumneavoastră. Aceasta se poate întâmpla atunci când tocmai a fost implementată o nouă versiune de agent și Kubernetes închide podurile vechi."
msgid "ClusterAgents|There's no activity from the past day"
msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Nu există nicio activitate din ultima zi"
+msgstr[1] "Nu există nicio activitate din ultimele %d zile."
+msgstr[2] "Nu există nicio activitate din ultimele %d de zile."
msgid "ClusterAgents|This agent has no tokens"
-msgstr ""
+msgstr "Acest agent nu are tokenuri"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
-msgstr ""
-
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
+msgstr "Pentru a șterge agentul, tastați %{name} pentru a confirma:"
msgid "ClusterAgents|Token created by %{userName}"
-msgstr ""
+msgstr "Token creat de %{userName}"
msgid "ClusterAgents|Token revoked by %{userName}"
-msgstr ""
+msgstr "Token revocat de %{userName}"
msgid "ClusterAgents|Unknown user"
msgstr "Utilizator necunoscut"
msgid "ClusterAgents|View all %{number} agents"
-msgstr ""
+msgstr "Vedeți toți cei %{number} (de) agenți"
msgid "ClusterAgents|View all %{number} clusters"
-msgstr ""
+msgstr "Vedeți toate cele %{number} (de) clustere"
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
-msgstr ""
+msgstr "Ne-ar plăcea să aflăm mai multe despre experiența d-voastră cu agentul GitLab."
msgid "ClusterAgents|What is GitLab Agent activity?"
-msgstr ""
+msgstr "Ce este activitatea agentului GitLab?"
+
+msgid "ClusterAgents|What is default configuration?"
+msgstr "Ce este configurația implicită?"
msgid "ClusterAgents|You cannot see this token again after you close this window."
-msgstr ""
+msgstr "Nu veți mai putea vedea acest token după ce închideți această fereastră."
msgid "ClusterAgents|You will need to create a token to connect to your agent"
-msgstr ""
+msgstr "Va trebui să creați un token pentru a vă conecta la agent"
msgid "ClusterAgents|Your agent version is out of sync with your GitLab version (v%{version}), which might cause compatibility problems. Update the agent installed on your cluster to the most recent version."
-msgstr ""
+msgstr "Versiunea agentului dvs. nu este sincronizată cu versiunea GitLab (v%{version}), ceea ce ar putea cauza probleme de compatibilitate. Actualizați agentul instalat pe clusterul dvs. la cea mai recentă versiune."
msgid "ClusterAgents|Your instance doesn't have the %{linkStart}GitLab Agent Server (KAS)%{linkEnd} set up. Ask a GitLab Administrator to install it."
-msgstr ""
+msgstr "Instanța dvs. nu are configurat %{linkStart}Serverul agentului GitLab (KAS)%{linkEnd}. Cereți unui administrator GitLab să-l instaleze."
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
-msgstr ""
+msgstr "Utilizatorul are permisiuni insuficiente pentru a crea un token pentru acest proiect"
msgid "ClusterAgent|You have insufficient permissions to create a cluster agent for this project"
-msgstr ""
+msgstr "Nu aveți permisiuni suficiente pentru a crea un agent de cluster pentru acest proiect"
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
-msgstr ""
+msgstr "Nu aveți permisiuni suficiente pentru a șterge acest agent de cluster"
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 ""
+msgstr "Gestionarea aplicațiilor cu un singur clic a fost înlăturată în GitLab 14.0. Aplicațiile dvs. sunt în continuare instalate în clusterul dvs., iar integrările continuă să funcționeze."
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
-msgstr ""
+msgstr "%{linkStart}Mai multe informații%{linkEnd}"
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
-msgstr ""
+msgstr "Un proiect de gestionare a clusterului poate fi utilizat pentru a rula joburi de implementare cu privilegii Kubernetes %{code_open}cluster-admin%{code_close}."
msgid "ClusterIntegration|A service token scoped to %{code}kube-system%{end_code} with %{code}cluster-admin%{end_code} privileges."
-msgstr "Un token de serviciu care oferă acces la %{code}kube-system%{end_code} cu privilegii de %{code}cluster-admin%{end_code}."
+msgstr "Un token de serviciu atribuit la %{code}kube-system%{end_code} cu privilegii %{code}cluster-admin%{end_code}."
msgid "ClusterIntegration|API URL"
-msgstr "URL API"
+msgstr "URL-ul API-ului"
msgid "ClusterIntegration|API URL should be a valid http/https url."
-msgstr "URL-ul API trebuie să fie un URL HTTP/HTTPS valid."
+msgstr "URL-ul API-ului trebuie să fie un URL HTTP/HTTPS valid."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Adăugați clusterul Kubernetes"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Adăugați o integrare a clusterului Kubernetes"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
-msgstr "Adăugarea unui cluster Kubernetes la grupul dvs. va partaja automat clusterul în toate proiectele dvs. Utilizați aplicații de analiză de cod, implementați-vă aplicațiile și executați cu ușurință pipeline-urile dvs. pentru toate proiectele care utilizează același cluster."
+msgstr "Adăugarea unui cluster Kubernetes la grupul dvs. va partaja automat clusterul în toate proiectele dumneavoastră. Utilizați aplicații de analiză de cod, implementați-vă aplicațiile și executați cu ușurință pipeline-urile dvs. pentru toate proiectele care utilizează același cluster."
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 "Adăugarea unui cluster Kubernetes va partaja automat clusterul în toate proiectele dvs. Utilizați aplicații de analiză, implementați-vă aplicațiile și executați cu ușurință pipeline-urile dvs. pentru toate proiectele care utilizează același cluster."
+msgstr "Adăugarea unui cluster Kubernetes va partaja automat clusterul în toate proiectele dumneavoastră. Utilizați aplicații de analiză, implementați-vă aplicațiile și executați cu ușurință pipeline-urile dvs. pentru toate proiectele care utilizează același cluster."
msgid "ClusterIntegration|Adding an integration to your group will share the cluster across all your projects."
-msgstr "Adăugarea unei grupări de integrare va împărți grupul în toate proiectele dvs."
+msgstr "Adăugarea unei integrări la grupul dvs. va împărți clusterul între toate proiectele dvs."
msgid "ClusterIntegration|Adding an integration will share the cluster across all projects."
-msgstr "Adăugarea unei integrări va împărți grupul în toate proiectele."
+msgstr "Adăugarea unei integrări va împărți clusterul între toate proiectele."
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
-msgstr ""
+msgstr "Opțiuni avansate privind integrarea acestui cluster Kubernetes"
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
-msgstr ""
+msgstr "Permiteți ca GitLab să administreze numele de spațiu și conturile de servicii pentru acest cluster. %{linkStart}Mai multe informații%{linkEnd}"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
-msgstr ""
+msgstr "Permiteți GitLab să administreze spațiile de nume și conturile de servicii pentru acest cluster."
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Elasticsearch for pod logs."
-msgstr ""
+msgstr "Permite GitLab să interogheze un Elasticsearch în cluster configurat în mod specific pentru jurnalele pod."
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
+msgstr "Permiteți ca GitLab să interogheze un Prometheus în cluster configurat în mod specific pentru metrici."
msgid "ClusterIntegration|Amazon EKS"
-msgstr " Amazon EKS"
+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."
msgid "ClusterIntegration|An error occurred while trying to fetch project zones: %{error}"
-msgstr "A apărut o eroare la încercarea de a prelua zonele de proiect: %{error}"
+msgstr "A apărut o eroare la încercarea de a prelua zonele proiectului: %{error}"
msgid "ClusterIntegration|An error occurred while trying to fetch your projects: %{error}"
msgstr "A apărut o eroare la încercarea de a prelua proiectele dvs: %{error}"
msgid "ClusterIntegration|An error occurred while trying to fetch zone machine types: %{error}"
-msgstr "A apărut o eroare la încercarea de a prelua tipurile de mașini de zonă: %{error}"
+msgstr "A apărut o eroare la încercarea de a prelua tipurile de mașini din zonă: %{error}"
msgid "ClusterIntegration|An unknown error occurred while attempting to connect to Kubernetes."
-msgstr ""
+msgstr "A apărut o eroare necunoscută în timpul încercării de conectare la Kubernetes."
msgid "ClusterIntegration|Any project namespaces"
-msgstr ""
+msgstr "Oricare spațiu de nume de proiect"
msgid "ClusterIntegration|Apply for credit"
msgstr "Solicitați credit"
msgid "ClusterIntegration|Authenticate with AWS"
-msgstr ""
+msgstr "Autentificați-vă cu AWS"
msgid "ClusterIntegration|Authenticate with Amazon Web Services"
-msgstr ""
+msgstr "Autentificare cu Amazon Web Services"
msgid "ClusterIntegration|Authentication Error"
-msgstr ""
+msgstr "Eroare de autentificare"
msgid "ClusterIntegration|Base domain"
msgstr "Domeniu de bază"
@@ -8156,226 +8375,217 @@ msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Pachetul autorității de certificare (format PEM)"
msgid "ClusterIntegration|Check your CA certificate"
-msgstr ""
+msgstr "Verificați-vă certificatul CA"
msgid "ClusterIntegration|Check your cluster status"
-msgstr ""
+msgstr "Verificați-vă starea clusterului"
msgid "ClusterIntegration|Check your token"
-msgstr ""
+msgstr "Verificați-vă tokenul"
msgid "ClusterIntegration|Choose the %{linkStart}security group%{linkEnd} to apply to the EKS-managed Elastic Network Interfaces that are created in your worker node subnets."
-msgstr ""
+msgstr "Alegeți %{linkStart}grupul de securitate%{linkEnd} care să se aplice Interfețelor Rețelei Elastice administrate de EKS care sunt create în subrețelele nodului dvs. de lucru."
msgid "ClusterIntegration|Choose the %{linkStart}subnets %{linkEnd} in your VPC where your worker nodes will run."
-msgstr ""
+msgstr "Alegeți %{linkStart}subrețelele %{linkEnd} din VPC-ul dvs. în care vor rula nodurile de lucru."
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
-msgstr ""
+msgstr "Alegeți %{linkStart}tipul de instanță%{linkEnd} al nodului de lucru."
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Alegeți care dintre mediile dvs. vor utiliza acest cluster."
msgid "ClusterIntegration|Clear cluster cache"
-msgstr ""
+msgstr "Goliți cache-ul clusterului"
msgid "ClusterIntegration|Clear the local cache of namespace and service accounts."
-msgstr ""
+msgstr "Goliți cache-ul local al numelui de spațiu și al conturilor de servicii."
msgid "ClusterIntegration|Cluster Region"
-msgstr ""
+msgstr "Regiunea clusterului"
msgid "ClusterIntegration|Cluster management project"
-msgstr ""
+msgstr "Proiect de gestionare a clusterului"
msgid "ClusterIntegration|Cluster name is required."
-msgstr ""
+msgstr "Numele clusterului este obligatoriu."
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 ""
+msgstr "Clusterele sunt utilizate prin selectarea celui mai apropiat ancestru cu un domeniu de aplicare a mediului corespunzător. De exemplu, clusterele de proiect vor prevala asupra clusterelor de grup. %{linkStart}Mai multe informații%{linkEnd}"
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
-msgstr ""
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
+msgstr "Conectați un cluster Kubernetes"
msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
+msgstr "Conectați-vă cu un certificat"
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
-msgstr ""
+msgstr "Conectați-vă clusterul la GitLab prin intermediul %{linkStart}certificatelor de cluster%{linkEnd}."
msgid "ClusterIntegration|Connection Error"
-msgstr ""
+msgstr "Eroare de conexiune"
msgid "ClusterIntegration|Copy API URL"
-msgstr ""
+msgstr "Copiați URL-ul API-ului"
msgid "ClusterIntegration|Copy CA Certificate"
-msgstr ""
+msgstr "Copiați certificatul CA"
msgid "ClusterIntegration|Copy Kubernetes cluster name"
-msgstr ""
+msgstr "Copiați numele clusterului Kubernetes"
msgid "ClusterIntegration|Could not load IAM roles"
-msgstr ""
+msgstr "Nu s-au putut încărca rolurile IAM"
msgid "ClusterIntegration|Could not load Key Pairs"
-msgstr ""
+msgstr "Nu s-au putut încărca perechile de chei"
msgid "ClusterIntegration|Could not load VPCs for the selected region"
-msgstr ""
+msgstr "Nu s-au putut încărca VPC-uri pentru regiunea selectată"
msgid "ClusterIntegration|Could not load instance types"
-msgstr ""
+msgstr "Nu s-au putut încărca tipurile de instanțe"
msgid "ClusterIntegration|Could not load networks"
-msgstr ""
+msgstr "Nu s-au putut încărca rețelele"
msgid "ClusterIntegration|Could not load security groups for the selected VPC"
-msgstr ""
+msgstr "Nu s-au putut încărca grupurile de securitate pentru VPC-ul selectat"
msgid "ClusterIntegration|Could not load subnets for the selected VPC"
-msgstr ""
+msgstr "Nu s-au putut încărca subrețelele pentru VPC-ul selectat"
msgid "ClusterIntegration|Could not load subnetworks"
-msgstr ""
+msgstr "Nu s-au putut încărca subrețelele"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Creați clusterul Kubernetes"
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
-msgstr ""
+msgstr "Crearea clusterului Kubernetes"
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
-msgstr ""
+msgstr "Ștergeți toate resursele GitLab atașate la acest cluster în timpul eliminării"
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 "Implementați fiecare mediu în propriul său spațiu de nume. În caz contrar, mediile din cadrul unui proiect partajează un spațiu de nume la nivelul întregului proiect. Rețineți că oricine poate declanșa o implementare a unui spațiu de nume, poate citi secretele acestuia. Dacă sunt modificate, mediile existente vor utiliza spațiile de nume actuale până când cache-ul clusterului este golit."
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 ""
+msgstr "Implementați fiecare mediu în propriul său spațiu de nume. În caz contrar, mediile din cadrul unui proiect partajează un spațiu de nume la nivelul întregului proiect. Rețineți că oricine poate declanșa o implementare a unui spațiu de nume, poate citi secretele acestuia. Dacă sunt modificate, mediile existente vor utiliza spațiile de nume actuale până când cache-ul clusterului este golit. %{linkStart} Mai multe informații%{linkEnd}"
msgid "ClusterIntegration|Did you know?"
-msgstr ""
+msgstr "Știați că?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
-msgstr ""
+msgstr "Serviciul Elastic Kubernetes"
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
-msgstr ""
+msgstr "Activați Cloud Run pentru Anthos"
msgid "ClusterIntegration|Enable Elastic Stack integration"
-msgstr ""
+msgstr "Activați integrarea Elastic Stack"
msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
+msgstr "Activați integrarea Prometheus"
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
-msgstr ""
+msgstr "Activați sau dezactivați conexiunea GitLab la clusterul dvs. Kubernetes."
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
-msgstr ""
+msgstr "Activați această setare dacă utilizați controlul accesului bazat pe roluri (RBAC)."
+
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr "Introduceți detalii despre clusterul dumneavoastră. %{linkStart}Cum pot utiliza un certificat pentru a mă conecta la clusterul meu?%{linkEnd}"
msgid "ClusterIntegration|Enter new Service Token"
-msgstr ""
+msgstr "Introduceți un nou Token de serviciu"
msgid "ClusterIntegration|Enter the details for your Amazon EKS Kubernetes cluster"
-msgstr ""
+msgstr "Introduceți detaliile pentru clusterul dvs. Amazon EKS Kubernetes"
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
-msgstr ""
+msgstr "Introduceți detaliile pentru clusterul dvs. Kubernetes"
+
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr "Introduceți detaliile certificatului clusterului dvs. Kubernetes"
msgid "ClusterIntegration|Environment scope"
-msgstr ""
+msgstr "Domeniul mediului"
msgid "ClusterIntegration|Environment scope is required."
-msgstr ""
+msgstr "Este necesar un domeniu pentru mediu."
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
-msgstr ""
+msgstr "Fiecare cont nou Google Cloud Platform (GCP) primește un credit de 300 de dolari la %{sign_up_link}. În parteneriat cu Google, GitLab poate să ofere un credit de 200 de dolari suplimentari atât pentru noile conturi GCP, cât și pentru cele existente, pentru a demara integrarea GitLab cu Google Kubernetes Engine."
msgid "ClusterIntegration|Failed to configure EKS provider: %{message}"
-msgstr ""
+msgstr "Nu s-a reușit configurarea furnizorului EKS: %{message}"
msgid "ClusterIntegration|Failed to configure Google Kubernetes Engine Cluster: %{message}"
-msgstr ""
+msgstr "Nu s-a reușit configurarea Clusterului Google Kubernetes Engine: %{message}"
msgid "ClusterIntegration|Failed to fetch CloudFormation stack: %{message}"
-msgstr ""
+msgstr "Nu s-a reușit obținerea stivei CloudFormation: %{message}"
msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}"
-msgstr ""
+msgstr "Nu s-a reușit solicitarea către Google Cloud Platform: %{message}"
msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
+msgstr "Nu s-a reușit executarea Kubeclient: %{message}"
msgid "ClusterIntegration|Fetching machine types"
-msgstr ""
+msgstr "Preluarea tipurilor de mașini"
msgid "ClusterIntegration|Fetching projects"
-msgstr ""
+msgstr "Preluarea proiectelor"
msgid "ClusterIntegration|Fetching zones"
-msgstr ""
+msgstr "Preluarea zonelor"
msgid "ClusterIntegration|GitLab Integration"
-msgstr ""
+msgstr "Integrarea GitLab"
msgid "ClusterIntegration|GitLab failed to authenticate."
-msgstr ""
+msgstr "GitLab nu a reușit să se autentifice."
msgid "ClusterIntegration|GitLab failed to connect to the cluster."
-msgstr ""
+msgstr "GitLab nu a reușit să se conecteze la cluster."
msgid "ClusterIntegration|GitLab-managed cluster"
-msgstr ""
+msgstr "Cluster gestionat de GitLab"
msgid "ClusterIntegration|Google Cloud Platform project"
msgstr "Proiect Google Cloud Platform"
msgid "ClusterIntegration|Google GKE"
-msgstr ""
+msgstr "Google GKE"
msgid "ClusterIntegration|Google Kubernetes Engine"
-msgstr "Motor Google Kubernetes"
+msgstr "Motorul Google Kubernetes"
msgid "ClusterIntegration|Google Kubernetes Engine project"
-msgstr ""
+msgstr "Proiectul Google Kubernetes Engine"
msgid "ClusterIntegration|Group cluster"
-msgstr ""
+msgstr "Cluster de grup"
msgid "ClusterIntegration|HTTP Error"
-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 ""
+msgstr "Eroare HTTP"
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
-msgstr "Dacă nu doriți să ștergeți toate resursele GitLab asociate, puteți elimina pur și simplu integrarea."
+msgstr "Dacă nu doriți să ștergeți toate resursele GitLab asociate, puteți înlătura 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 ""
+msgstr "Pentru a vizualiza starea de sănătate a clusterului dvs., trebuie mai întâi să activaÈ›i Prometheus în fila „Integrăriâ€."
msgid "ClusterIntegration|Instance cluster"
-msgstr ""
+msgstr "Cluster de instanță"
msgid "ClusterIntegration|Instance type"
-msgstr "Tip de instanță"
+msgstr "Tipul de instanță"
msgid "ClusterIntegration|Integration disabled"
msgstr "Integrare dezactivată"
@@ -8387,10 +8597,10 @@ msgid "ClusterIntegration|Integrations allow you to use applications installed i
msgstr "Integrările vă permit să utilizați aplicațiile instalate în clusterul dvs. ca parte a fluxului de lucru GitLab."
msgid "ClusterIntegration|Key pair name"
-msgstr " Numele perechii de chei"
+msgstr "Numele perechii de chei"
msgid "ClusterIntegration|Kubernetes cluster is being created..."
-msgstr ""
+msgstr "Se creează clusterul Kubernetes..."
msgid "ClusterIntegration|Kubernetes cluster name"
msgstr "Numele clusterului Kubernetes"
@@ -8405,19 +8615,19 @@ msgid "ClusterIntegration|Kubernetes version not found"
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 "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}."
+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 "Aflați mai multe despre %{help_link_start} zone %{help_link_end}."
+msgstr "Aflați mai multe despre %{help_link_start}zone%{help_link_end}."
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "Aflați mai multe despre Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr "Aflați mai multe despre Kubernetes."
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
-msgstr "Aflați mai multe despre grupurile de cluster Kubernetes"
+msgstr "Aflați mai multe despre grupul de clustere Kubernetes"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
-msgstr "Aflați mai multe despre clusterele Kubernetes de instanță"
+msgstr "Aflați mai multe despre instanța de clustere Kubernetes"
msgid "ClusterIntegration|Loading IAM Roles"
msgstr "Încărcarea rolurilor IAM"
@@ -8432,136 +8642,133 @@ msgid "ClusterIntegration|Loading instance types"
msgstr "Încărcarea tipurilor de instanțe"
msgid "ClusterIntegration|Loading networks"
-msgstr " Se încarcă rețelele"
+msgstr "Încărcarea rețelelor"
msgid "ClusterIntegration|Loading security groups"
-msgstr " Se încarcă grupurile de securitate"
+msgstr "Încărcarea grupurilor de securitate"
msgid "ClusterIntegration|Loading subnets"
-msgstr ""
+msgstr "Se încarcă subrețelele"
msgid "ClusterIntegration|Loading subnetworks"
-msgstr ""
+msgstr "Se încarcă subrețelele"
msgid "ClusterIntegration|Machine type"
-msgstr "Tipul mașinii"
+msgstr "Tipul de mașină"
msgid "ClusterIntegration|Make sure your API endpoint is correct"
-msgstr " Asigurați-vă că punctul final API este corect"
+msgstr "Asigurați-vă că punctul final API este corect"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters"
-msgstr ""
+msgstr "Verificați că îndepliniți condițiile de cont %{link_to_requirements} pentru a crea clustere Kubernetes"
msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{provider_link}"
-msgstr " Gestionați clusterul Kubernetes vizitând %{provider_link}"
+msgstr "Gestionați-vă clusterul Kubernetes vizitând %{provider_link}"
msgid "ClusterIntegration|Namespace per environment"
-msgstr ""
+msgstr "Spațiu de nume pe mediu"
msgid "ClusterIntegration|No IAM Roles found"
-msgstr ""
+msgstr "Nu s-au găsit roluri IAM"
msgid "ClusterIntegration|No Key Pairs found"
-msgstr ""
+msgstr "Nu s-au găsit perechi de chei"
msgid "ClusterIntegration|No VPCs found"
-msgstr ""
+msgstr "Nu s-au găsit VPC-uri"
msgid "ClusterIntegration|No instance type found"
-msgstr ""
+msgstr "Nu s-a găsit niciun tip de instanță"
msgid "ClusterIntegration|No machine types matched your search"
-msgstr ""
+msgstr "Nu s-au găsit tipuri de mașini care să corespundă căutării dvs."
msgid "ClusterIntegration|No networks found"
-msgstr ""
+msgstr "Nu s-au găsit rețele"
msgid "ClusterIntegration|No projects found"
-msgstr ""
+msgstr "Nu s-au găsit proiecte"
msgid "ClusterIntegration|No projects matched your search"
-msgstr ""
+msgstr "Nu s-au găsit proiecte care să corespundă căutării dvs."
msgid "ClusterIntegration|No security group found"
-msgstr ""
+msgstr "Nu s-a găsit niciun grup de securitate"
msgid "ClusterIntegration|No subnet found"
msgstr "Nu a fost găsită nicio subrețea"
msgid "ClusterIntegration|No subnetworks found"
-msgstr ""
+msgstr "Nu s-au găsit subrețele"
msgid "ClusterIntegration|No zones matched your search"
-msgstr ""
+msgstr "Nu s-au găsit zone care să corespundă căutării dvs."
msgid "ClusterIntegration|Node calculations use the Kubernetes Metrics API. Make sure your cluster has metrics installed"
-msgstr ""
+msgstr "Calculele de noduri utilizează API-ul Kubernetes Metrics. Asigurați-vă că în clusterul dvs. sunt instalate metrici"
msgid "ClusterIntegration|Number of nodes"
-msgstr ""
+msgstr "Numărul de noduri"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
-msgstr ""
-
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
+msgstr "Numărul de noduri trebuie să fie o valoare numerică."
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
-msgstr ""
+msgstr "Verificați contul dvs. Google dacă îndeplinește următoarele cerințe:"
msgid "ClusterIntegration|Project cluster"
-msgstr ""
+msgstr "Clusterul proiectului"
msgid "ClusterIntegration|Project namespace (optional, unique)"
-msgstr ""
+msgstr "Spațiul de nume al proiectului (opțional, unic)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
-msgstr ""
+msgstr "Prefixul spațiului de nume al proiectului (opțional, unic)"
msgid "ClusterIntegration|Provider details"
-msgstr ""
+msgstr "Detalii despre furnizor"
msgid "ClusterIntegration|Provision Role ARN"
-msgstr ""
+msgstr "Rolul prestabilit ARN"
msgid "ClusterIntegration|RBAC-enabled cluster"
-msgstr ""
+msgstr "Clusterul activat RBAC"
msgid "ClusterIntegration|Read our %{linkStart}help page%{linkEnd} on Kubernetes cluster integration."
-msgstr ""
+msgstr "Citiți %{linkStart}pagina noastră de ajutor%{linkEnd} privind integrarea clusterului Kubernetes."
msgid "ClusterIntegration|Read our %{link_start}help page%{link_end} on Kubernetes cluster integration."
-msgstr ""
+msgstr "Citiți %{link_start}pagina noastră de ajutor%{link_end} privind integrarea clusterului Kubernetes."
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
-msgstr ""
+msgstr "Înlăturați integrarea clusterului Kubernetes"
msgid "ClusterIntegration|Remove integration"
-msgstr ""
+msgstr "Înlăturați integrarea"
msgid "ClusterIntegration|Remove integration and resources"
-msgstr "Eliminați integrarea și resursele"
+msgstr "Înlăturați integrarea și resursele"
msgid "ClusterIntegration|Remove integration and resources?"
-msgstr "Eliminați integrarea și resursele?"
+msgstr "Înlăturați integrarea și resursele?"
msgid "ClusterIntegration|Remove integration?"
-msgstr "Eliminați integrarea?"
+msgstr "Înlăturați integrarea?"
msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster."
-msgstr ""
+msgstr "Înlăturați configurația acestui cluster Kubernetes din acest proiect. Aceasta nu va șterge clusterul Kubernetes real."
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
-msgstr "Eliminați clusterul din proiect, dar păstrați resursele asociate"
+msgstr "Înlăturați clusterul din proiect, dar păstrați resursele asociate"
msgid "ClusterIntegration|Save changes"
-msgstr ""
+msgstr "Salvați modificările"
msgid "ClusterIntegration|Search IAM Roles"
msgstr "Căutați roluri IAM"
msgid "ClusterIntegration|Search Key Pairs"
-msgstr ""
+msgstr "Căutați perechi cheie"
msgid "ClusterIntegration|Search VPCs"
msgstr "Căutați VPC-uri"
@@ -8579,40 +8786,40 @@ msgid "ClusterIntegration|Search projects"
msgstr "Căutați proiecte"
msgid "ClusterIntegration|Search security groups"
-msgstr " Căutați grupuri de securitate"
+msgstr "Căutați grupuri de securitate"
msgid "ClusterIntegration|Search subnets"
-msgstr " Căutați subrețele"
+msgstr "Căutați subrețele"
msgid "ClusterIntegration|Search subnetworks"
-msgstr " Căutați subrețele"
+msgstr "Căutați subrețele"
msgid "ClusterIntegration|Search zones"
msgstr "Căutați zone"
msgid "ClusterIntegration|Security group"
-msgstr " Grup de securitate"
+msgstr "Grup de securitate"
msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster"
msgstr "Vizualizați și editați detaliile pentru clusterul dvs. Kubernetes"
msgid "ClusterIntegration|Select a VPC"
-msgstr ""
+msgstr "Selectați un VPC"
msgid "ClusterIntegration|Select a VPC to choose a security group"
-msgstr " Selectați un VPC pentru a alege un grup de securitate"
+msgstr "Selectați un VPC pentru a alege un grup de securitate"
msgid "ClusterIntegration|Select a VPC to choose a subnet"
-msgstr " Selectați un VPC pentru a alege o subrețea"
+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 "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"
-msgstr ""
+msgstr "Selectați o rețea"
msgid "ClusterIntegration|Select a network to choose a subnetwork"
-msgstr " Selectați o rețea pentru a alege o subrețea"
+msgstr "Selectați o rețea pentru a alege o subrețea"
msgid "ClusterIntegration|Select a region to choose a Key Pair"
msgstr "Selectați o regiune pentru a alege o pereche de chei"
@@ -8621,22 +8828,22 @@ msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr "Selectați o regiune pentru a alege un VPC"
msgid "ClusterIntegration|Select a security group"
-msgstr ""
+msgstr "Selectați un grup de securitate"
msgid "ClusterIntegration|Select a subnet"
-msgstr ""
+msgstr "Selectați o subrețea"
msgid "ClusterIntegration|Select a subnetwork"
-msgstr ""
+msgstr "Selectați o subrețea"
msgid "ClusterIntegration|Select a zone to choose a network"
-msgstr " Selectați o zonă pentru a alege o rețea"
+msgstr "Selectați o zonă pentru a alege o rețea"
msgid "ClusterIntegration|Select an instance type"
-msgstr ""
+msgstr "Selectați un tip de instanță"
msgid "ClusterIntegration|Select key pair"
-msgstr ""
+msgstr "Selectați o cheie pereche"
msgid "ClusterIntegration|Select machine type"
msgstr "Selectați tipul mașinii"
@@ -8651,13 +8858,13 @@ msgid "ClusterIntegration|Select project to choose zone"
msgstr "Selectați proiectul pentru a alege zona"
msgid "ClusterIntegration|Select service role"
-msgstr ""
+msgstr "Selectați rolul serviciului"
msgid "ClusterIntegration|Select the key pair name that will be used to create EC2 nodes. To use a new key pair name, first create one on %{linkStart}Amazon Web Services%{linkEnd}."
msgstr "Selectați numele perechii de chei care va fi utilizată pentru a crea noduri EC2. Pentru a utiliza un nou nume de pereche de chei, creați mai întâi unul pe %{linkStart}Amazon Web Services%{linkEnd}."
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 ""
+msgstr "Selectați regiunea în care doriți să creați noul cluster. Asigurați-vă că aveți acces la această regiune pentru ca rolul dvs. să se poată autentifica. Dacă nu este selectată nicio regiune, vom utiliza %{codeStart}DEFAULT_REGION%{codeEnd}. Aflați mai multe despre %{linkStart}Regiuni%{linkEnd}."
msgid "ClusterIntegration|Select zone"
msgstr "Selectați zona"
@@ -8666,19 +8873,19 @@ msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Selectați zona pentru a alege tipul mașinii"
msgid "ClusterIntegration|Service Token"
-msgstr ""
+msgstr "Tokenul serviciului"
msgid "ClusterIntegration|Service role"
-msgstr ""
+msgstr "Rolul serviciului"
msgid "ClusterIntegration|Service token is required."
-msgstr ""
+msgstr "Tokenul de serviciu este necesar."
msgid "ClusterIntegration|Set a prefix for your namespaces. If not set, defaults to your project path. If modified, existing environments will use their current namespaces until the cluster cache is cleared."
-msgstr "Setați un prefix pentru spațiile 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."
+msgstr "Setați un prefix pentru spațiile dvs. de nume. Dacă nu este setat, se va folosi implicit calea proiectului. Dacă este modificat, mediile existente vor utiliza spațiile lor de nume curente până când cache-ul clusterului este șters."
msgid "ClusterIntegration|Something went wrong on our end."
-msgstr "A fost ceva în neregulă la noi."
+msgstr "Ceva nu a mers bine la noi."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr "Ceva nu a mers bine în timpul creării clusterului Kubernetes"
@@ -8690,28 +8897,28 @@ msgid "ClusterIntegration|Subnets"
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 %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
-msgstr ""
+msgstr "Amazon Resource Name (ARN) asociat rolului dumneavoastră. Dacă nu aveți un rol furnizat, creați mai întâi unul pe %{awsLinkStart}Amazon Web Services%{awsLinkEnd} utilizând contul și ID-urile externe de mai sus. %{moreInfoStart}Mai multe informații%{moreInfoEnd}"
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
-msgstr ""
+msgstr "Certificatul Kubernetes folosit pentru autentificarea în cluster."
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "Adresa URL folosită pentru accesarea API-ului Kubernetes."
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
-msgstr ""
+msgstr "Metoda bazată pe certificate pentru conectarea clusterelor la GitLab a fost %{linkStart}depreciată%{linkEnd} în GitLab 14.5."
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
-msgstr ""
+msgstr "Spațiul de nume asociat cu proiectul dumneavoastră. Acesta va fi utilizat pentru borduri de implementare, jurnalele și terminalele Web."
msgid "ClusterIntegration|The region the new cluster will be created in. You must reauthenticate to change regions."
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 "A existat o problemă la autentificarea cu clusterul dvs. Vă rugăm să vă asigurați că certificatul CA și token-ul sunt valabile."
+msgstr "A apărut o problemă la autentificarea cu clusterul dumneavoastră. Vă rugăm să vă asigurați că certificatul CA și tokenul sunt valabile."
msgid "ClusterIntegration|There was an HTTP error when connecting to your cluster."
-msgstr "A existat o eroare HTTP la conectarea la clusterul dumneavoastră."
+msgstr "S-a produs 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 "Acest cont trebuie să aibă permisiuni pentru a crea un cluster Kubernetes în %{link_to_container_project} specificat mai jos"
@@ -8720,94 +8927,100 @@ msgid "ClusterIntegration|This is necessary if your integration has become out o
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 ""
+msgstr "Acest lucru este necesar pentru a șterge asociațiile existente între mediu și spațiu de nume din clusterele gestionate anterior de GitLab."
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
-msgstr ""
+msgstr "Această opțiune vă va permite să instalați aplicații în clustere RBAC."
msgid "ClusterIntegration|This project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
-msgstr ""
+msgstr "Acest proiect nu are activată facturarea. Pentru a crea un cluster, %{linkToBillingStart}activați facturarea%{linkToBillingEnd} și încercați din nou."
msgid "ClusterIntegration|This will permanently delete the following resources:"
-msgstr ""
+msgstr "Aceasta va șterge permanent următoarele resurse:"
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
-msgstr ""
+msgstr "Pentru a crea un cluster, creați mai întâi un proiect pe %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgid "ClusterIntegration|To remove your integration and resources, type %{clusterName} to confirm:"
-msgstr ""
+msgstr "Pentru a înlătura integrarea și resursele, tastați %{clusterName} pentru a confirma:"
msgid "ClusterIntegration|To remove your integration, type %{clusterName} to confirm:"
-msgstr ""
+msgstr "Pentru a înlătura integrarea, tastați %{clusterName} pentru a confirma:"
msgid "ClusterIntegration|To use a new project, first create one on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
-msgstr ""
+msgstr "Pentru a utiliza un proiect nou, creați mai întâi unul pe %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgid "ClusterIntegration|Troubleshooting tips:"
-msgstr ""
+msgstr "Sfaturi de depanare:"
msgid "ClusterIntegration|Unable to Authenticate"
-msgstr ""
+msgstr "Nu se poate autentifica"
msgid "ClusterIntegration|Unable to Connect"
-msgstr ""
+msgstr "Nu se poate conecta"
msgid "ClusterIntegration|Unknown Error"
-msgstr ""
+msgstr "Eroare necunoscută"
+
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr "Folosiți GitLab pentru a implementa în clusterul dvs., pentru a executa joburi, pentru a utiliza aplicații de revizuire și multe altele."
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
-msgstr ""
+msgstr "Utilizați %{linkStart}agentul GitLab%{linkEnd} pentru a vă conecta în siguranță clusterele Kubernetes la GitLab. Vă puteți implementa aplicațiile, rula pipeline-urile, utiliza Aplicații de revizuire și multe altele."
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
-msgstr ""
+msgstr "Folosește suplimentele Cloud Run, Istio și HTTP Load Balancing pentru acest cluster."
+
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr "Folosiți AutoDevOps cu multiple clustere? %{help_link_start}Citiți mai întâi acest lucru.%{help_link_end}"
msgid "ClusterIntegration|VPC"
-msgstr ""
+msgstr "VPC"
msgid "ClusterIntegration|Validating project billing status"
-msgstr ""
+msgstr "Validarea stării de facturare a proiectului"
msgid "ClusterIntegration|We could not verify that one of your projects on GCP has billing enabled. Please try again."
-msgstr ""
+msgstr "Nu am putut verifica dacă unul dintre proiectele dvs. de pe GCP are facturarea activată. Vă rugăm să încercați din nou."
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
-msgstr ""
+msgstr "Nu am reușit să preluăm niciun proiect. Asigurați-vă că aveți un proiect pe %{docsLinkStart}Platforma Google Cloud%{docsLinkEnd}."
-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 "Cu un cluster Kubernetes asociat acestui proiect, puteți utiliza aplicațiile de revizuire, puteți implementa aplicațiile, puteți executa pipeline-uri și multe altele într-un mod ușor."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr "Unde doriți să creați un cluster?"
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
-msgstr ""
+msgstr "Sunteți pe cale să înlăturați integrarea clusterului dvs. și toate resursele create de GitLab asociate cu acest cluster."
msgid "ClusterIntegration|You are about to remove your cluster integration."
-msgstr ""
+msgstr "Sunteți pe cale să vă înlăturați integrarea clusterului."
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 ""
+msgstr "Trebuie să acordați acces la resursele AWS ale organizației dvs. pentru a crea un nou cluster EKS. Pentru a acorda acces, creați un rol de furnizare folosind contul și ID-ul extern de mai jos și furnizați-ne ARN-ul."
msgid "ClusterIntegration|You should select at least two subnets"
-msgstr ""
+msgstr "Ar trebui să selectați cel puțin două subrețele"
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
-msgstr ""
+msgstr "Contul dvs trebuie să aibă %{link_to_kubernetes_engine}"
msgid "ClusterIntegration|Your cluster API is unreachable. Please ensure your API URL is correct."
-msgstr ""
+msgstr "Integrarea clusterului dvs. este inaccesibilă. Vă rugăm să vă asigurați că adresa URL a API-ului este corectă."
msgid "ClusterIntegration|Your service role is distinct from the provision role used when authenticating. It will allow Amazon EKS and the Kubernetes control plane to manage AWS resources on your behalf. To use a new role, first create one on %{linkStart}Amazon Web Services%{linkEnd}."
-msgstr ""
+msgstr "Rolul dvs. de serviciu este diferit de rolul de furnizare utilizat la autentificare. Acesta va permite ca Amazon EKS și planul de control Kubernetes să gestioneze resursele AWS în numele dvs. Pentru a utiliza un rol nou, creați mai întâi unul pe %{linkStart}Amazon Web Services%{linkEnd}."
msgid "ClusterIntegration|Zone"
-msgstr ""
+msgstr "Zona"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
-msgstr ""
+msgstr "accesul la Google Kubernetes Engine"
msgid "ClusterIntegration|meets the requirements"
-msgstr ""
+msgstr "îndeplinește cerințele"
msgid "ClusterIntegration|sign up"
-msgstr ""
+msgstr "înscrieți-vă"
msgid "Clusters|An error occurred while loading clusters"
msgstr ""
@@ -8852,7 +9065,7 @@ msgid "Code review"
msgstr ""
msgid "Code snippet"
-msgstr ""
+msgstr "Fragment de cod"
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr "Fragment de cod copiat. Introduceți-l în locația corectă din fișierul YAML."
@@ -8891,7 +9104,7 @@ msgid "Collapse"
msgstr ""
msgid "Collapse all threads"
-msgstr ""
+msgstr "Restrângeți toate subiectele"
msgid "Collapse approvers"
msgstr ""
@@ -8945,10 +9158,10 @@ msgid "Comment"
msgstr "Comentariu"
msgid "Comment & resolve thread"
-msgstr ""
+msgstr "Comentați și rezolvați subiectul"
msgid "Comment & unresolve thread"
-msgstr ""
+msgstr "Comentați și marcați subiectul ca nerezolvat"
msgid "Comment '%{label}' position"
msgstr ""
@@ -8987,7 +9200,7 @@ msgid "Commit (when editing commit message)"
msgstr "Commit (la editarea mesajului de commit)"
msgid "Commit Message"
-msgstr "Commit mesaj"
+msgstr "Mesajul commit-ului"
msgid "Commit SHA"
msgstr ""
@@ -9008,7 +9221,7 @@ msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "Statistici commit-uri pentru %{ref} %{start_time} - %{end_time}"
msgid "Commit to %{branchName} branch"
-msgstr "Commit la %{branchName} ramura"
+msgstr "Commit la ramura %{branchName}"
msgid "CommitBoxTitle|Commit"
msgstr "Commit"
@@ -9016,9 +9229,6 @@ msgstr "Commit"
msgid "CommitMessage|Add %{file_name}"
msgstr "Adăugați %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "redactat"
@@ -9145,6 +9355,9 @@ msgstr "Vizualizați merge request-ul deschis"
msgid "Complete"
msgstr "Complet"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9158,79 +9371,91 @@ msgid "Compliance report"
msgstr ""
msgid "ComplianceDashboard|created by:"
-msgstr ""
+msgstr "creat de:"
msgid "ComplianceFrameworks|Add framework"
-msgstr ""
+msgstr "Adăugați un framework"
msgid "ComplianceFrameworks|Background color"
-msgstr ""
+msgstr "Culoare de fundal"
msgid "ComplianceFrameworks|Cancel"
-msgstr ""
+msgstr "Anulare"
msgid "ComplianceFrameworks|Compliance framework deleted successfully"
-msgstr ""
+msgstr "Framework de conformitate șters cu succes"
msgid "ComplianceFrameworks|Compliance pipeline configuration (optional)"
-msgstr ""
+msgstr "Configurarea pipeline-ului de conformitate (opțional)"
msgid "ComplianceFrameworks|Configuration not found"
-msgstr ""
-
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
+msgstr "Configurația nu a fost găsită"
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
-msgstr ""
+msgstr "Ștergeți framework-ul de conformitate %{framework}"
msgid "ComplianceFrameworks|Delete framework"
-msgstr ""
+msgstr "Ștergeți framework-ul"
msgid "ComplianceFrameworks|Description"
-msgstr ""
+msgstr "Descriere"
msgid "ComplianceFrameworks|Description is required"
-msgstr ""
+msgstr "Descrierea este obligatorie"
msgid "ComplianceFrameworks|Edit framework"
-msgstr ""
+msgstr "Editați framework-ul"
msgid "ComplianceFrameworks|Error deleting the compliance framework. Please try again"
-msgstr ""
+msgstr "Eroare la ștergerea framework-ului de conformitate. Vă rugăm să încercați din nou"
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page"
-msgstr ""
+msgstr "Eroare la preluarea datelor framework-urilor de conformitate. Vă rugăm să reîmprospătați pagina"
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
-msgstr ""
+msgstr "Eroare la preluarea datelor framework-urilor de conformitate. Vă rugăm împrospătați pagina sau încercați un alt framework"
+
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr "Framework-urile care au fost adăugate vor apărea aici."
msgid "ComplianceFrameworks|Invalid format"
-msgstr ""
+msgstr "Format invalid"
msgid "ComplianceFrameworks|Name"
-msgstr ""
+msgstr "Nume"
msgid "ComplianceFrameworks|Name is required"
-msgstr ""
+msgstr "Numele este obligatoriu"
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
-msgstr ""
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
+msgstr "Încă nu sunt configurate framework-uri de conformitate"
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Format necesar: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "ComplianceFrameworks|Unable to save this compliance framework. Please try again"
-msgstr ""
+msgstr "Nu se poate salva acest framework de conformitate. Vă rugăm să încercați din nou"
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 ""
+msgstr "Sunteți pe cale să ștergeți definitiv framework-ul de conformitate %{framework} din toate proiectele care îl au aplicat în prezent, ceea ce poate elimina alte funcționalități. Acest lucru nu poate fi anulat."
+
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr "Adăugați un framework la %{linkStart}%{groupName}%{linkEnd} și acesta va apărea aici."
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr "Adăugați framework-ul în %{groupName}"
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr "După ce se adaugă un framework la %{linkStart}%{groupName}%{linkEnd}, acesta va apărea"
msgid "ComplianceFramework|Edit compliance framework"
-msgstr ""
+msgstr "Editați framework-ul de conformitate"
msgid "ComplianceFramework|New compliance framework"
-msgstr ""
+msgstr "Framework nou de conformitate"
+
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr "Nu au fost setate încă framework-uri de conformitate"
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9269,28 +9494,28 @@ msgid "Configuration help"
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."
+msgstr "Configurați sertarul și conținutul %{italic_start}Noutăți%{italic_end}."
msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
msgstr "Configurați %{link} pentru a urmări evenimentele. %{link_start}Învățați mai multe.%{link_end}"
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."
+msgstr "Configurați %{repository_checks_link_start}controalele de repozitoriu%{link_end} și %{housekeeping_link_start}curățenia%{link_end} în repozitorii."
msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
msgstr ""
msgid "Configure Container Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings) to customize Container Scanning settings."
-msgstr ""
+msgstr "Configurați Scanarea containerelor în „.gitlab-ci.yml†utilizând șablonul gestionat de GitLab. Puteți [adăuga suprascrieri de variabile](https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings) pentru a personaliza setările de scanare a containerelor."
msgid "Configure Container Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
-msgstr ""
+msgstr "ConfiguraÈ›i scanarea containerelor în „.gitlab-ci.ymlâ€, creând acest fiÈ™ier dacă nu există deja."
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 "Configurați Scanarea dependențelor în „.gitlab-ci.yml†utilizând șablonul gestionat de GitLab. Puteți [adăuga suprascrieri de variabile(https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) pentru a personaliza setările de scanare a dependențelor."
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"
+msgstr "ConfiguraÈ›i Scanarea dependenÈ›elor în „.gitlab-ci.ymlâ€, creând acest fiÈ™ier dacă nu există deja"
msgid "Configure GitLab"
msgstr ""
@@ -9308,22 +9533,22 @@ msgid "Configure Prometheus"
msgstr "Configurați Prometeu"
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
-msgstr ""
+msgstr "Configurați SAST IaC în „.gitlab-ci.yml†utilizând șablonul gestionat de GitLab. Puteți [adăuga suprascrieri de variabile](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) pentru a personaliza setările SAST IaC."
msgid "Configure SAST IaC in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
msgid "Configure SAST in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST settings."
-msgstr "Configurați SAST în `.gitlab-ci.yml` utilizând șablonul gestionat de GitLab. Puteți [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) pentru a personaliza setările SAST."
+msgstr "Configurați SAST în „.gitlab-ci.yml†utilizând șablonul gestionat de GitLab. Puteți [adăuga suprascrieri de variabile](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) pentru a personaliza setările SAST."
msgid "Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist"
-msgstr "Configurați SAST în `.gitlab-ci.yml`, creând acest fișier dacă nu există deja."
+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 ""
+msgstr "Configurați Detectarea secretelor în „.gitlab-ci.yml†utilizând șablonul gestionat de GitLab. Puteți [adăuga suprascrieri de variabile](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings) pentru a personaliza setările de Detectare a secretelor."
msgid "Configure Secret Detection in `.gitlab-ci.yml`, creating this file if it does not already exist"
-msgstr ""
+msgstr "ConfiguraÈ›i Detectarea secretelor în „.gitlab-ci.ymlâ€, creând acest fiÈ™ier dacă nu există deja."
msgid "Configure Sentry integration for error tracking"
msgstr ""
@@ -9340,6 +9565,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9383,7 +9611,10 @@ msgid "Configure via Merge Request"
msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
-msgstr ""
+msgstr "Configurați ce liste sunt afișate pentru oricine vizitează acest bord"
+
+msgid "Configure with a merge request"
+msgstr "Configurați cu un merge request"
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9394,6 +9625,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr "Confirmați distrugerea aplicației"
+
msgid "Confirm new password"
msgstr "Confirmați noua parolă"
@@ -9401,7 +9635,7 @@ msgid "Confirm user"
msgstr "Confirmați utilizatorul"
msgid "Confirm your account"
-msgstr "Confirmă-ți contul"
+msgstr "Confirmați-vă contul"
msgid "Confirm your email address"
msgstr "Confirmați-vă adresa de e-mail"
@@ -9425,22 +9659,22 @@ msgid "Conflict: This file was modified in both the source and target branches."
msgstr "Conflict: Acest fișier a fost modificat atât în ramurile sursă, cât și în ramurile țintă."
msgid "Conflict: This file was modified in the source branch, but removed in the target branch."
-msgstr "Conflict: Acest fișier a fost modificat în ramura sursă, dar eliminat în ramura țintă."
+msgstr "Conflict: Acest fișier a fost modificat în ramura sursă, dar înlăturat în ramura țintă."
msgid "Conflict: This file was removed in the source branch, but modified in the target branch."
-msgstr "Conflict: Acest fișier a fost eliminat în ramura sursă, dar modificat în ramura țintă."
+msgstr "Conflict: Acest fișier a fost înlăturat în ramura sursă, dar modificat în ramura țintă."
msgid "Conflict: This file was removed in the source branch, but renamed in the target branch."
-msgstr "Conflict: Acest fișier a fost eliminat în ramura sursă, dar redenumit în ramura țintă."
+msgstr "Conflict: Acest fișier a fost înlăturat în ramura sursă, dar redenumit în ramura țintă."
msgid "Conflict: This file was renamed differently in the source and target branches."
msgstr "Conflict: Acest fișier a fost redenumit diferit în ramurile sursă și țintă."
msgid "Conflict: This file was renamed in the source branch, but removed in the target branch."
-msgstr "Conflict: Acest fișier a fost redenumit în ramura sursă, dar eliminat în ramura țintă."
+msgstr "Conflict: Acest fișier a fost redenumit în ramura sursă, dar înlăturat în ramura țintă."
msgid "Confluence"
-msgstr "Confluență"
+msgstr "Confluence"
msgid "Confluence Cloud Workspace URL"
msgstr "Adresa URL a spațiului de lucru Cloud Confluence"
@@ -9452,10 +9686,10 @@ msgid "ConfluenceService|Link to a Confluence Workspace from the sidebar."
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 "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ă."
+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 "Wiki-ul dvs. GitLab este încă disponibil la %{wiki_link}. Pentru a reactiva link-ul către wiki-ul GitLab, dezactivați această integrare."
+msgstr "Wiki-ul dvs. GitLab este încă disponibil la %{wiki_link}. Pentru a reactiva linkul către wiki-ul GitLab, dezactivați această integrare."
msgid "Congratulations, your free trial is activated."
msgstr "Felicitări, evaluarea dvs. gratuită este activată."
@@ -9463,6 +9697,12 @@ msgstr "Felicitări, evaluarea dvs. gratuită este activată."
msgid "Connect"
msgstr "Conectare"
+msgid "Connect a Kubernetes Cluster"
+msgstr "Conectați un cluster Kubernetes"
+
+msgid "Connect a cluster"
+msgstr "Conectați un cluster"
+
msgid "Connect all repositories"
msgstr ""
@@ -9509,7 +9749,7 @@ msgid "Container Registry"
msgstr ""
msgid "Container Scanning"
-msgstr "Scanare container"
+msgstr "Scanarea containerelor"
msgid "Container does not exist"
msgstr "Containerul nu există"
@@ -9533,19 +9773,19 @@ msgid "Container repository"
msgstr ""
msgid "ContainerRegistry| Please visit the %{linkStart}administration settings%{linkEnd} to enable this feature."
-msgstr ""
+msgstr " Vă rugăm să vizitați %{linkStart}setările de administrare%{linkEnd} pentru a activa această funcție."
msgid "ContainerRegistry|%{count} Image repository"
msgid_plural "ContainerRegistry|%{count} Image repositories"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{count} repozitoriu de imagini"
+msgstr[1] "%{count} repozitorii de imagini"
+msgstr[2] "%{count} de repozitorii de imagini"
msgid "ContainerRegistry|%{count} Tag"
msgid_plural "ContainerRegistry|%{count} Tags"
msgstr[0] "%{count} Etichetă"
msgstr[1] "%{count} Etichete"
-msgstr[2] "%{count} de etichete"
+msgstr[2] "%{count} de Etichete"
msgid "ContainerRegistry|%{strongStart}Disabled%{strongEnd} - Tags will not be automatically deleted."
msgstr "%{strongStart}Dezactivat%{strongEnd} - Etichetele nu vor fi șterse automat."
@@ -9554,313 +9794,316 @@ msgid "ContainerRegistry|%{strongStart}Enabled%{strongEnd} - Tags that match the
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 "%{title} a fost programat cu succes pentru ștergere"
+msgstr "%{title} a fost programată cu succes pentru ștergere"
msgid "ContainerRegistry|-- tags"
msgstr "-- etichete"
msgid "ContainerRegistry|Build an image"
-msgstr "Construiește o imagine"
+msgstr "Construiți o imagine"
msgid "ContainerRegistry|CLI Commands"
-msgstr ""
+msgstr "Comenzi CLI"
msgid "ContainerRegistry|Cleanup disabled"
-msgstr " Curățare dezactivată"
+msgstr "Curățarea dezactivată"
msgid "ContainerRegistry|Cleanup in progress"
-msgstr ""
+msgstr "Curățarea este în curs"
msgid "ContainerRegistry|Cleanup incomplete"
-msgstr ""
+msgstr "Curățarea este incompletă"
msgid "ContainerRegistry|Cleanup is currently removing tags"
-msgstr ""
+msgstr "Curățarea este în curs de eliminare a etichetelor"
msgid "ContainerRegistry|Cleanup is disabled for this project"
-msgstr ""
+msgstr "Curățarea este dezactivată pentru acest proiect"
msgid "ContainerRegistry|Cleanup is ongoing"
-msgstr "Curățare în desfășurare"
+msgstr "Curățarea este în curs de desfășurare"
msgid "ContainerRegistry|Cleanup pending"
-msgstr ""
-
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
+msgstr "Curățarea este în așteptare"
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
-msgstr ""
+msgstr "Politica de curățare pentru etichete este dezactivată"
msgid "ContainerRegistry|Cleanup policy successfully saved."
-msgstr ""
+msgstr "Politica de curățare a fost salvată cu succes."
msgid "ContainerRegistry|Cleanup ran but some tags were not removed"
-msgstr ""
+msgstr "Curățarea a funcționat, dar unele etichete nu au fost înlăturate"
msgid "ContainerRegistry|Cleanup timed out"
msgstr "Curățarea a expirat"
msgid "ContainerRegistry|Cleanup timed out before it could delete all tags"
-msgstr ""
+msgstr "Curățarea a expirat înainte de a putea șterge toate etichetele"
msgid "ContainerRegistry|Cleanup will run %{time}"
-msgstr ""
+msgstr "Curățarea va rula %{time}"
msgid "ContainerRegistry|Cleanup will run soon"
-msgstr ""
+msgstr "Curățarea se va efectua în curând"
msgid "ContainerRegistry|Configuration digest: %{digest}"
-msgstr ""
+msgstr "Digestul configurației: %{digest}"
msgid "ContainerRegistry|Container Registry"
-msgstr ""
+msgstr "Registrul de container"
msgid "ContainerRegistry|Copy build command"
-msgstr ""
+msgstr "Copiați comanda de construire"
msgid "ContainerRegistry|Copy login command"
-msgstr ""
+msgstr "Copiați comanda de conectare"
msgid "ContainerRegistry|Copy push command"
-msgstr ""
+msgstr "Copiați comanda push"
msgid "ContainerRegistry|Delete image repository?"
-msgstr ""
+msgstr "Ștergeți repozitoriul de imagini?"
msgid "ContainerRegistry|Delete selected tags"
-msgstr ""
+msgstr "Ștergeți etichetele selectate"
msgid "ContainerRegistry|Delete tag"
-msgstr ""
+msgstr "Ștergeți eticheta"
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 "Ștergerea depozitului de imagine va șterge toate imaginile și etichetele din interior. Această acțiune nu poate fi anulată. Introduceți următoarele pentru a confirma: %{code}"
+msgstr "Ștergerea repozitoriului imaginii va șterge toate imaginile și etichetele din acesta. Această acțiune nu poate fi anulată. Vă rugăm să tastați următoarele pentru a confirma: %{code}"
msgid "ContainerRegistry|Digest: %{imageId}"
-msgstr ""
+msgstr "Digest: %{imageId}"
msgid "ContainerRegistry|Docker connection error"
-msgstr ""
+msgstr "Eroare de conexiune Docker"
msgid "ContainerRegistry|Enable expiration policy"
-msgstr ""
+msgstr "Activați politica de expirare"
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
-msgstr ""
+msgstr "Politica de expirare va rula în %{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 ""
+msgstr "Dacă nu sunteți deja conectat, trebuie să vă autentificați în Registrul de containere utilizând numele de utilizator și parola GitLab. Dacă aveți activată %{twofaDocLinkStart}Autentificarea cu doi factori%{twofaDocLinkEnd}, utilizați un %{personalAccessTokensDocLinkStart}Token de acces personal%{personalAccessTokensDocLinkEnd} în locul unei parole."
msgid "ContainerRegistry|Image repository deletion failed"
-msgstr ""
+msgstr "Ștergerea repozitoriului de imagini a eșuat"
msgid "ContainerRegistry|Image repository not found"
-msgstr ""
+msgstr "Repozitoriul de imagini nu a fost găsit"
msgid "ContainerRegistry|Image repository will be deleted"
-msgstr ""
+msgstr "Repozitoriul de imagini va fi șters"
msgid "ContainerRegistry|Image repository with no name located at the project URL."
-msgstr ""
+msgstr "Repozitoriu de imagini fără nume localizat la adresa URL a proiectului."
msgid "ContainerRegistry|Image tags"
-msgstr " Etichete imagine"
+msgstr "Etichete de imagine"
msgid "ContainerRegistry|Invalid tag: missing manifest digest"
-msgstr " Etichetă nevalidă: lipsă rezumat manifest"
+msgstr "Etichetă nevalabilă: lipsește digestul manifestului"
msgid "ContainerRegistry|Keep tags matching:"
-msgstr ""
+msgstr "Păstrați etichetele care se potrivesc:"
msgid "ContainerRegistry|Keep the most recent:"
-msgstr " Păstrați cele mai recente:"
+msgstr "Păstrați-le pe cele mai recente:"
msgid "ContainerRegistry|Keep these tags"
-msgstr " Păstrați aceste etichete"
+msgstr "Păstrați aceste etichete"
msgid "ContainerRegistry|Last updated %{time}"
-msgstr " Ultima actualizare %{time}"
+msgstr "Ultima actualizare %{time}"
msgid "ContainerRegistry|Login"
-msgstr " Autentificare"
+msgstr "Autentificare"
msgid "ContainerRegistry|Manifest digest: %{digest}"
-msgstr " Rezumat manifest: %{digest}"
+msgstr "Digestul manifestului: %{digest}"
msgid "ContainerRegistry|Missing or insufficient permission, delete button disabled"
-msgstr " Permisiune lipsă sau insuficientă, butonul de ștergere este dezactivat"
+msgstr "Permisiune lipsă sau insuficientă, butonul de ștergere este dezactivat"
msgid "ContainerRegistry|Next cleanup scheduled to run on:"
-msgstr " Următoarea curățare programată să ruleze pe:"
+msgstr "Următoarea curățare programată să ruleze pe:"
msgid "ContainerRegistry|Not yet scheduled"
-msgstr " Nu este încă programat"
+msgstr "Nu este încă programat"
msgid "ContainerRegistry|Note: Any policy update will result in a change to the scheduled run date and time"
-msgstr "Notă: Orice actualizare a politicii va avea ca rezultat o modificare a datei și orei de execuție programate"
+msgstr "Nota: Orice actualizare a politicii va avea ca rezultat o modificare a datei și orei de execuție programate"
msgid "ContainerRegistry|Please try different search criteria"
-msgstr ""
+msgstr "Vă rugăm să încercați alte criterii de căutare"
msgid "ContainerRegistry|Published %{timeInfo}"
msgstr " Publicat %{timeInfo}"
msgid "ContainerRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
-msgstr ""
+msgstr "Publicat în repozitoriul de imagini %{repositoryPath} la %{time} pe %{date}"
msgid "ContainerRegistry|Push an image"
-msgstr ""
+msgstr "Faceți push unei imagini"
msgid "ContainerRegistry|Remember to run %{docLinkStart}garbage collection%{docLinkEnd} to remove the stale data from storage."
-msgstr ""
+msgstr "Nu uitați să executați %{docLinkStart}colectarea de gunoaie%{docLinkEnd} pentru a înlătura datele vechi din stocare"
msgid "ContainerRegistry|Remove repository"
-msgstr ""
+msgstr "Înlăturați repozitoriul"
msgid "ContainerRegistry|Remove tag"
msgid_plural "ContainerRegistry|Remove tags"
-msgstr[0] "Eliminați eticheta"
-msgstr[1] "Eliminați etichetele"
-msgstr[2] "Eliminați etichetele"
+msgstr[0] "Înlăturați eticheta"
+msgstr[1] "Înlăturați etichetele"
+msgstr[2] "Înlăturați etichetele"
msgid "ContainerRegistry|Remove tags matching:"
-msgstr ""
+msgstr "Înlăturați etichetele care se potrivesc:"
msgid "ContainerRegistry|Remove tags older than:"
-msgstr " Eliminați etichetele mai vechi de:"
+msgstr "Înlăturați etichetele mai vechi de:"
msgid "ContainerRegistry|Remove these tags"
-msgstr " Eliminați aceste etichete"
+msgstr "Înlăturați aceste etichete"
msgid "ContainerRegistry|Root image"
-msgstr ""
+msgstr "Imaginea rădăcină"
msgid "ContainerRegistry|Run cleanup:"
+msgstr "Executați curățarea:"
+
+msgid "ContainerRegistry|Set up cleanup"
msgstr ""
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "Unele etichete nu au fost șterse"
msgid "ContainerRegistry|Something went wrong while fetching the cleanup policy."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării politicii de curățare."
msgid "ContainerRegistry|Something went wrong while fetching the image details."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării detaliilor imaginii."
msgid "ContainerRegistry|Something went wrong while fetching the repository list."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării listei de repozitorii."
msgid "ContainerRegistry|Something went wrong while fetching the tags list."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării listei de etichete."
msgid "ContainerRegistry|Something went wrong while marking the tag for deletion."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul marcării etichetei pentru ștergere."
msgid "ContainerRegistry|Something went wrong while marking the tags for deletion."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul marcării etichetelor pentru ștergere."
msgid "ContainerRegistry|Something went wrong while scheduling %{title} for deletion. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul programării pentru ștergere a %{title}. Vă rugăm să încercați din nou."
msgid "ContainerRegistry|Something went wrong while scheduling the image for deletion."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul programării ștergerii imaginii."
msgid "ContainerRegistry|Something went wrong while updating the cleanup policy."
-msgstr ""
+msgstr "Ceva nu a mers bine în timp ce se actualiza politica de curățare."
msgid "ContainerRegistry|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Ne pare rău, filtrul dvs. nu a produs niciun rezultat."
msgid "ContainerRegistry|Tag successfully marked for deletion."
-msgstr " Etichetă marcată cu succes pentru ștergere."
+msgstr "Etichetă marcată cu succes pentru ștergere."
msgid "ContainerRegistry|Tags successfully marked for deletion."
-msgstr " Etichete marcate cu succes pentru ștergere."
+msgstr "Etichete marcate cu succes pentru ștergere."
+
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr "În mod temporar, etichetele nu pot fi marcate pentru ștergere. Vă rugăm să încercați din nou în câteva minute. %{docLinkStart}Mai multe detalii%{docLinkEnd}."
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 ""
+msgstr "Etichetele care corespund acestor reguli sunt %{strongStart}păstrate%{strongEnd}, chiar dacă se potrivesc unei reguli de eliminare de mai jos. %{secondStrongStart}Cea mai recentă%{secondStrongEnd} etichetă este întotdeauna păstrată."
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}removed%{strongEnd}, unless a rule above says to keep them."
-msgstr ""
+msgstr "Etichetele care corespund acestor reguli sunt %{strongStart}înlăturate%{strongEnd}, cu excepția cazului în care o regulă de mai sus prevede păstrarea lor."
msgid "ContainerRegistry|Tags with names that match this regex pattern are kept. %{linkStart}View regex examples.%{linkEnd}"
-msgstr ""
+msgstr "Etichetele cu nume care se potrivesc acestui model regex sunt păstrate. %{linkStart}Consultați exemple de regex.%{linkEnd}"
msgid "ContainerRegistry|Tags with names that match this regex pattern are removed. %{linkStart}View regex examples.%{linkEnd}"
-msgstr ""
+msgstr "Etichetele cu nume care se potrivesc acestui model regex sunt înlăturate. %{linkStart}Consultați exemple de regex.%{linkEnd}"
msgid "ContainerRegistry|The cleanup policy timed out before it could delete all tags. An administrator can %{adminLinkStart}manually run cleanup now%{adminLinkEnd} or you can wait for the cleanup policy to automatically run again. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
+msgstr "Politica de curățare a expirat înainte de a putea fi șterse toate etichetele. Un administrator poate %{adminLinkStart}executa manual curățarea acum%{adminLinkEnd} sau puteți aștepta ca politica de curățare să se execute din nou în mod automat. %{docLinkStart}Mai multe informații%{docLinkEnd}"
msgid "ContainerRegistry|The filter returned no results"
-msgstr ""
+msgstr "Filtrul nu a returnat niciun rezultat"
msgid "ContainerRegistry|The image repository could not be found."
-msgstr ""
+msgstr "Repozitoriul de imagini nu a putut fi găsit."
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 ""
+msgstr "Ultima etichetă legată de această imagine a fost recent înlăturată. Această imagine goală și toate datele asociate vor fi înlăturate automat ca parte a procesului obișnuit de Colectare a gunoiului. Dacă aveți întrebări, contactați administratorul dumneavoastră."
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 "Repozitoriul de imagini solicitat nu există sau a fost șters. Dacă sunteți de părere că este vorba de o eroare, încercați să reîmprospătați pagina."
msgid "ContainerRegistry|The value of this input should be less than 256 characters"
-msgstr ""
+msgstr "Valoarea acestei intrări trebuie să fie mai mică de 256 de caractere"
msgid "ContainerRegistry|There are no container images available in this group"
-msgstr ""
+msgstr "Nu există imagini de container disponibile în acest grup"
msgid "ContainerRegistry|There are no container images stored for this project"
-msgstr ""
+msgstr "Nu există imagini de container stocate pentru acest proiect"
msgid "ContainerRegistry|There was an error during the deletion of this image repository, please try again."
-msgstr ""
+msgstr "A apărut o eroare la ștergerea acestui repozitoriu de imagini, încercați din nou."
msgid "ContainerRegistry|This image has no active tags"
-msgstr ""
+msgstr "Această imagine nu are etichete active"
msgid "ContainerRegistry|This image repository has failed to be deleted"
-msgstr ""
+msgstr "Acest repozitoriu de imagini nu a putut fi șters"
msgid "ContainerRegistry|This image repository is scheduled for deletion"
-msgstr ""
+msgstr "Acest repozitoriu de imagini este programat pentru ștergere"
msgid "ContainerRegistry|This image repository will be deleted. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Acest repozitoriu de imagini va fi șters. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "ContainerRegistry|This project's cleanup policy for tags is not enabled."
-msgstr ""
+msgstr "Politica de curățare a acestui proiect pentru etichete nu este activată."
msgid "ContainerRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "Pentru a vă extinde căutarea, modificați sau înlăturați filtrele de mai sus."
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 ""
+msgstr "Avem probleme cu conectarea la Registrul de container. Vă rugăm să încercați să reîmprospătați pagina. Dacă această eroare persistă, vă rugăm să consultați %{docLinkStart}documentația de depanare%{docLinkEnd}."
msgid "ContainerRegistry|With the Container Registry, every project can have its own space to store its Docker images. %{docLinkStart}More Information%{docLinkEnd}"
-msgstr ""
+msgstr "Cu ajutorul Registrului de container, fiecare proiect poate avea propriul spațiu pentru a-și stoca imaginile Docker. %{docLinkStart}Mai multe informații%{docLinkEnd}"
msgid "ContainerRegistry|With the Container Registry, every project can have its own space to store its Docker images. Push at least one Docker image in one of this group's projects in order to show up here. %{docLinkStart}More Information%{docLinkEnd}"
-msgstr ""
+msgstr "Cu ajutorul Registrului de container, fiecare proiect poate avea propriul spațiu pentru a-și stoca imaginile Docker. Faceți push la cel puțin o imagine Docker în unul dintre proiectele acestui grup pentru a apărea aici. %{docLinkStart}Mai multe informații%{docLinkEnd}"
msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
+msgstr "Cu Registrul de container GitLab, fiecare proiect poate avea propriul său spațiu pentru a stoca imagini. %{docLinkStart}Mai multe informații%{docLinkEnd}"
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
-msgstr ""
+msgstr "Sunteți pe cale să înlăturați etichetele %{item}. Sunteți sigur?"
msgid "ContainerRegistry|You are about to remove %{item}. Are you sure?"
-msgstr ""
+msgstr "Sunteți pe cale să înlăturați %{item}. Sunteți sigur?"
msgid "ContainerRegistry|You are about to remove repository %{title}. Once you confirm, this repository will be permanently deleted."
-msgstr ""
+msgstr "Sunteți pe cale să înlăturați repozitoriul %{title}. Odată ce confirmați, acest repozitoriu va fi șters definitiv."
msgid "ContainerRegistry|You can add an image to this registry with the following commands:"
-msgstr ""
+msgstr "Puteți adăuga o imagine la acest registru cu următoarele comenzi:"
msgid "Content parsed with %{link}."
msgstr ""
@@ -9875,19 +10118,19 @@ msgid "Contents of .gitlab-ci.yml"
msgstr ""
msgid "ContextCommits|Failed to create context commits. Please try again."
-msgstr ""
+msgstr "Nu s-au putut crea commit-uri de context. Vă rugăm să încercați din nou."
msgid "ContextCommits|Failed to create/remove context commits. Please try again."
-msgstr ""
+msgstr "Nu s-au putut crea/înlătura commit-uri de context. Vă rugăm să încercați din nou."
msgid "ContextCommits|Failed to delete context commits. Please try again."
-msgstr ""
+msgstr "Nu s-au putut șterge commit-urile de context. Vă rugăm să încercați din nou."
msgid "Continue"
msgstr ""
msgid "Continue to the next step"
-msgstr ""
+msgstr "Treceți la etapa următoare"
msgid "Continuous Integration and Deployment"
msgstr "Integrare și implementare continuă"
@@ -9959,13 +10202,13 @@ msgid "Control whether to display customer experience improvement content and th
msgstr ""
msgid "Control which projects can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable. It is a security risk to disable this feature, because unauthorized projects might attempt to retrieve an active token and access the API."
-msgstr "Controlați ce proiecte pot fi accesate prin cereri API autentificate cu variabila CI_JOB_TOKEN CI/CD a acestui proiect. Este un risc de securitate să dezactivați această funcție, deoarece proiectele neautorizate ar putea încerca să regăsească un token activ și să acceseze API-ul."
+msgstr "Controlați ce proiecte pot fi accesate prin cereri API autentificate cu variabila CI/CD CI_JOB_TOKEN a acestui proiect. Dezactivarea acestei funcții reprezintă un risc de securitate, deoarece proiectele neautorizate ar putea încerca să recupereze un token activ și să acceseze API-ul."
msgid "Cookie domain"
msgstr ""
msgid "Copied"
-msgstr "Copiată"
+msgstr "S-a copiat"
msgid "Copied labels and milestone from %{source_issuable_reference}."
msgstr ""
@@ -9986,10 +10229,10 @@ msgid "Copy %{type}"
msgstr ""
msgid "Copy Account ID to clipboard"
-msgstr ""
+msgstr "Copiați ID-ul contului în clipboard"
msgid "Copy External ID to clipboard"
-msgstr ""
+msgstr "Copiați ID-ul extern în clipboard"
msgid "Copy ID"
msgstr ""
@@ -10040,7 +10283,7 @@ msgid "Copy file path"
msgstr ""
msgid "Copy issue URL to clipboard"
-msgstr ""
+msgstr "Copiați URL-ul problemei în clipboard"
msgid "Copy key"
msgstr ""
@@ -10073,7 +10316,7 @@ msgid "Copy this registration token."
msgstr ""
msgid "Copy to clipboard"
-msgstr ""
+msgstr "Copiați în clipboard"
msgid "Copy token"
msgstr ""
@@ -10090,6 +10333,9 @@ 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|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10126,6 +10372,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10141,9 +10393,6 @@ msgstr "Pentru a utiliza acest corpus, editați fișierul YAML corespunzător"
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10220,13 +10469,13 @@ msgid "Could not load usage counts. Please refresh the page to try again."
msgstr ""
msgid "Could not remove %{user} from %{group}. Cannot remove last group owner."
-msgstr ""
+msgstr "Nu s-a putut înlătura %{user} din %{group}. Nu se poate elimina ultimul proprietar de grup."
msgid "Could not remove %{user} from %{group}. User is not a group member."
-msgstr ""
+msgstr "Nu s-a putut înlătura %{user} din %{group}. Utilizatorul nu este membru al grupului."
msgid "Could not remove the trigger."
-msgstr ""
+msgstr "Nu s-a putut elimina declanșatorul."
msgid "Could not restore the group"
msgstr ""
@@ -10261,7 +10510,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10300,9 +10549,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr "Creați un cluster Kubernetes"
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr "Creați un cluster"
+
msgid "Create a group"
msgstr ""
@@ -10385,7 +10640,7 @@ msgid "Create issue"
msgstr ""
msgid "Create issue to resolve all threads"
-msgstr ""
+msgstr "Creați o problemă pentru a rezolva toate subiectele"
msgid "Create iteration"
msgstr ""
@@ -10414,9 +10669,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr "Creează un nou %{name} prin e-mail"
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10441,6 +10693,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10460,7 +10715,7 @@ msgid "Create service account"
msgstr ""
msgid "Create snippet"
-msgstr ""
+msgstr "Creați un fragment de cod"
msgid "Create tag %{tagName}"
msgstr ""
@@ -10471,9 +10726,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10726,43 +10978,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10777,10 +11011,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10808,7 +11042,7 @@ msgid "CsvParser|Trailing quote on quoted field is malformed"
msgstr "Citatul final pe câmpul citat este incorect"
msgid "CsvParser|Unable to auto-detect delimiter; defaulted to \",\""
-msgstr "Imposibil de detectat automat delimitatorul; implicit la \",\""
+msgstr "Imposibil de detectat automat delimitatorul; implicit la „ ,â€"
msgid "Current"
msgstr ""
@@ -10891,19 +11125,16 @@ msgstr "Interval personalizat"
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10913,7 +11144,7 @@ msgid "Customize colors"
msgstr ""
msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
-msgstr ""
+msgstr "Personalizați modul în care adresele de e-mail și numele de utilizator FogBugz sunt importate în GitLab. În etapa următoare, veți putea selecta proiectele pe care doriți să le importați."
msgid "Customize icon"
msgstr ""
@@ -10934,181 +11165,205 @@ msgid "Cycle Time"
msgstr ""
msgid "CycleAnalyticsEvent|%{label_reference} label was added to the issue"
-msgstr ""
+msgstr "Eticheta %{label_reference} a fost adăugată la problemă"
msgid "CycleAnalyticsEvent|%{label_reference} label was added to the merge request"
msgstr "Eticheta %{label_reference} a fost adăugată la merge request"
msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the issue"
-msgstr ""
+msgstr "Eticheta %{label_reference} a fost înlăturată din problemă"
msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the merge request"
-msgstr "Eticheta %{label_reference} a fost eliminată din merge request"
+msgstr "Eticheta %{label_reference} a fost înlăturată din merge request"
msgid "CycleAnalyticsEvent|Issue closed"
-msgstr ""
+msgstr "Problemă închisă"
msgid "CycleAnalyticsEvent|Issue created"
-msgstr ""
+msgstr "Problemă creată"
msgid "CycleAnalyticsEvent|Issue first added to a board"
-msgstr ""
+msgstr "Problema a fost adăugată pentru prima dată la un bord"
msgid "CycleAnalyticsEvent|Issue first associated with a milestone"
-msgstr ""
+msgstr "Problema a fost asociată pentru prima dată cu un obiectiv"
msgid "CycleAnalyticsEvent|Issue first associated with a milestone or issue first added to a board"
-msgstr ""
+msgstr "Problema a fost asociată pentru prima dată cu un obiectiv sau problema a fost adăugată pentru prima dată la un bord"
msgid "CycleAnalyticsEvent|Issue first mentioned in a commit"
-msgstr ""
+msgstr "Problema a fost menționată pentru prima dată într-un commit"
msgid "CycleAnalyticsEvent|Issue label was added"
-msgstr ""
+msgstr "Eticheta problemei a fost adăugată"
msgid "CycleAnalyticsEvent|Issue label was removed"
-msgstr ""
+msgstr "Eticheta problemei a fost înlăturată"
msgid "CycleAnalyticsEvent|Issue last edited"
-msgstr ""
+msgstr "Ultima problemă editată"
msgid "CycleAnalyticsEvent|Merge request closed"
-msgstr ""
+msgstr "Merge request închis"
msgid "CycleAnalyticsEvent|Merge request created"
-msgstr ""
+msgstr "Merge request creat"
msgid "CycleAnalyticsEvent|Merge request first commit time"
-msgstr ""
+msgstr "Data primului commit al Merge-Request-ului"
msgid "CycleAnalyticsEvent|Merge request first deployed to production"
-msgstr ""
+msgstr "Primul merge request implementat în producție"
msgid "CycleAnalyticsEvent|Merge request label was added"
-msgstr ""
+msgstr "Eticheta merge request-ului a fost adăugată"
msgid "CycleAnalyticsEvent|Merge request label was removed"
-msgstr ""
+msgstr "Eticheta merge request-ului a fost înlăturată"
msgid "CycleAnalyticsEvent|Merge request last build finish time"
-msgstr ""
+msgstr "Data finalizării ultimului build al merge request-ului"
msgid "CycleAnalyticsEvent|Merge request last build start time"
-msgstr ""
+msgstr "Data începerii ultimului build al merge request-ului"
msgid "CycleAnalyticsEvent|Merge request last edited"
-msgstr ""
+msgstr "Merge request modificat ultima dată"
msgid "CycleAnalyticsEvent|Merge request merged"
-msgstr ""
+msgstr "Merge request îmbinat"
msgid "CycleAnalyticsStage|Code"
-msgstr ""
+msgstr "Cod"
msgid "CycleAnalyticsStage|Issue"
-msgstr ""
+msgstr "Problemă"
msgid "CycleAnalyticsStage|Plan"
-msgstr "Plan"
+msgstr "Planificare"
msgid "CycleAnalyticsStage|Review"
-msgstr ""
+msgstr "Revizie"
msgid "CycleAnalyticsStage|Staging"
-msgstr ""
+msgstr "Pre-producție"
msgid "CycleAnalyticsStage|Test"
-msgstr ""
+msgstr "Test"
msgid "CycleAnalyticsStage|Total"
-msgstr ""
+msgstr "Total"
msgid "CycleAnalyticsStage|is not available for the selected group"
-msgstr ""
+msgstr "nu este disponibil pentru grupul selectat"
msgid "CycleAnalyticsStage|should be under a group"
msgstr "ar trebui să fie sub un grup"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
-msgstr ""
+msgstr "%{selectedLabelsCount} selectată(e) (%{maxLabels} maxim)"
+
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr "Agregare dezactivată"
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr "Agregare activată"
msgid "CycleAnalytics|Average time to completion"
-msgstr ""
+msgstr "Durata medie de finalizare"
+
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr "Creați un flux de valoare personalizat pentru a vizualiza metrici despre stadiile specifice procesului dvs. de dezvoltare. Utilizați fluxul de valori pentru a vizualiza ciclul de viață DevSecOps, pentru a determina viteza grupului dvs. și pentru a identifica procesele ineficiente."
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr "Creați un flux de valoare personalizat..."
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr "Fluxuri de valoare personalizate pentru a vă măsura ciclul de viață DevSecOps"
msgid "CycleAnalytics|Date"
-msgstr ""
+msgstr "Data"
msgid "CycleAnalytics|Display chart filters"
-msgstr ""
+msgstr "Afișează filtrele graficului"
+
+msgid "CycleAnalytics|Filter by stop date"
+msgstr "Filtrați după data de oprire"
msgid "CycleAnalytics|Lead Time for Changes"
-msgstr ""
+msgstr "Timpul de livrare pentru schimbări"
msgid "CycleAnalytics|Number of tasks"
-msgstr ""
+msgstr "Număr de sarcini"
msgid "CycleAnalytics|Only %{maxLabels} labels can be selected at this time"
-msgstr ""
+msgstr "Numai %{maxLabels} etichete pot fi selectate în acest moment"
msgid "CycleAnalytics|Project selected"
msgid_plural "CycleAnalytics|%d projects selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Proiect selectat"
+msgstr[1] "%d proiecte selectate"
+msgstr[2] "%d de proiecte selectate"
msgid "CycleAnalytics|Select labels"
-msgstr ""
+msgstr "Selectați etichete"
msgid "CycleAnalytics|Show"
-msgstr ""
+msgstr "Afișare"
msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} label"
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Se afișează %{subjectFilterText} și %{selectedLabelsCount} etichetă"
+msgstr[1] "Se afișează %{subjectFilterText} și %{selectedLabelsCount} etichete"
+msgstr[2] "Se afișează %{subjectFilterText} și %{selectedLabelsCount} de etichete"
msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
-msgstr ""
+msgstr "Se afișează datele pentru grupul „%{groupName}†și %{selectedProjectCount} proiecte de la %{createdAfter} la %{createdBefore}"
msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
-msgstr ""
+msgstr "Se afișează datele pentru grupul „%{groupName}†de la %{createdAfter} la %{createdBefore}"
msgid "CycleAnalytics|Stage time: %{title}"
-msgstr ""
+msgstr "Timp de stadiu: %{title}"
msgid "CycleAnalytics|Tasks by type"
-msgstr ""
+msgstr "Sarcini după tip"
msgid "CycleAnalytics|The average time items spent in this stage. Data limited to items completed within this date range."
-msgstr ""
+msgstr "Timpul mediu petrecut de elemente în acest stadiu. Datele se limitează la elementele finalizate în acest interval de timp."
msgid "CycleAnalytics|The given date range is larger than 180 days"
-msgstr ""
+msgstr "Intervalul de timp dat este mai mare de 180 de zile"
msgid "CycleAnalytics|The total time items spent across each value stream stage. Data limited to items completed within this date range."
-msgstr ""
+msgstr "Timpul total petrecut de elemente pe fiecare stadiu al fluxului de valoare. Datele se limitează la elementele completate în acest interval de timp."
msgid "CycleAnalytics|There is no data for 'Stage time' available. Adjust the current filters."
-msgstr ""
+msgstr "Nu sunt disponibile date pentru „Timpul stadiuluiâ€. AjustaÈ›i filtrele curente."
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
-msgstr ""
+msgstr "Nu sunt disponibile date pentru „Timpul totalâ€. AjustaÈ›i filtrele curente."
+
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr "A apărut o eroare la actualizarea statusului agregării, vă rugăm să încercați din nou."
msgid "CycleAnalytics|Total time"
-msgstr ""
+msgstr "Timpul total"
msgid "CycleAnalytics|Type of work"
-msgstr ""
+msgstr "Tipul lucrării"
+
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr "Dacă este activată, rezultatele arată elementele care au un eveniment de oprire în intervalul de date. Dacă este dezactivată, rezultatele arată elementele care au un eveniment de început în intervalul de date."
msgid "CycleAnalytics|group dropdown filter"
-msgstr ""
+msgstr "filtrul derulant de grup"
msgid "CycleAnalytics|not allowed for the given start event"
-msgstr ""
+msgstr "nepermis pentru evenimentul de start dat"
msgid "CycleAnalytics|project dropdown filter"
-msgstr ""
+msgstr "filtru derulant de proiect"
msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
@@ -11116,10 +11371,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11168,28 +11423,28 @@ msgid "DSN"
msgstr ""
msgid "Dashboard"
-msgstr ""
+msgstr "Tablou de bord"
msgid "Dashboard uid not found"
-msgstr ""
+msgstr "Nu s-a găsit uid-ul tabloului de bord"
msgid "DashboardProjects|All"
-msgstr ""
+msgstr "Toate"
msgid "DashboardProjects|Personal"
msgstr "Personal"
msgid "DashboardProjects|Trending"
-msgstr ""
+msgstr "Tendințe"
msgid "Dashboard|%{firstProject} and %{secondProject}"
-msgstr ""
+msgstr "%{firstProject} și %{secondProject}"
msgid "Dashboard|%{firstProject}, %{rest}, and %{secondProject}"
-msgstr ""
+msgstr "%{firstProject}, %{rest} și %{secondProject}"
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
-msgstr ""
+msgstr "Nu se poate adăuga %{invalidProjects}. Acest tablou de bord este disponibil pentru proiectele publice și pentru proiectele private din grupurile cu un plan Premium."
msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
msgstr ""
@@ -11198,289 +11453,289 @@ msgid "DastConfig|DAST Settings"
msgstr ""
msgid "DastConfig|Generate code snippet"
-msgstr ""
+msgstr "Generați un fragment de cod"
msgid "DastConfig|Scan Configuration"
msgstr ""
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
-msgstr ""
+msgstr "O scanare pasivă monitorizează toate mesajele HTTP (solicitări și răspunsuri) trimise către țintă. O scanare activă atacă ținta pentru a găsi vulnerabilități potențiale."
msgid "DastProfiles|AJAX spider"
-msgstr ""
+msgstr "Spider AJAX"
msgid "DastProfiles|API"
-msgstr ""
+msgstr "API"
msgid "DastProfiles|API endpoint URL"
-msgstr ""
+msgstr "URL-ul punctului final API"
msgid "DastProfiles|Active"
-msgstr ""
+msgstr "Activ"
msgid "DastProfiles|Additional request headers (optional)"
-msgstr ""
+msgstr "Anteturi suplimentare de solicitare (opțional)"
msgid "DastProfiles|Are you sure you want to delete this profile?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să ștergeți acest profil?"
msgid "DastProfiles|Authentication"
-msgstr ""
+msgstr "Autentificare"
msgid "DastProfiles|Authentication URL"
-msgstr ""
+msgstr "URL de autentificare"
msgid "DastProfiles|Branch missing"
-msgstr ""
+msgstr "Ramură lipsă"
msgid "DastProfiles|Choose a scan method"
-msgstr ""
+msgstr "Alegeți o metodă de scanare"
msgid "DastProfiles|Could not create the scanner profile. Please try again."
-msgstr ""
+msgstr "Nu s-a putut crea profilul scanerului. Vă rugăm să încercați din nou."
msgid "DastProfiles|Could not create the site profile. Please try again."
-msgstr ""
+msgstr "Nu s-a putut crea profilul site-ului. Vă rugăm să încercați din nou."
msgid "DastProfiles|Could not delete scanner profile. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Nu s-a putut șterge profilul scanerului. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
msgid "DastProfiles|Could not delete scanner profiles:"
-msgstr ""
+msgstr "Nu s-au putut șterge profilurile scanerului:"
msgid "DastProfiles|Could not delete site profile. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Nu s-a putut șterge profilul site-ului. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
msgid "DastProfiles|Could not delete site profiles:"
-msgstr ""
+msgstr "Nu s-au putut șterge profilurile site-ului:"
msgid "DastProfiles|Could not fetch scanner profiles. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Nu s-au putut prelua profilurile scanerului. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
msgid "DastProfiles|Could not fetch site profiles. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Nu s-au putut prelua profilurile site-ului. Actualizați pagina sau încercați din nou mai târziu."
msgid "DastProfiles|Could not update the scanner profile. Please try again."
-msgstr ""
+msgstr "Nu s-a putut actualiza profilul scanerului. Vă rugăm să încercați din nou."
msgid "DastProfiles|Could not update the site profile. Please try again."
+msgstr "Nu s-a putut actualiza profilul site-ului. Vă rugăm să încercați din nou."
+
+msgid "DastProfiles|DAST profile library"
msgstr ""
msgid "DastProfiles|Debug messages"
-msgstr ""
+msgstr "Mesaje de depanare"
msgid "DastProfiles|Delete profile"
-msgstr ""
+msgstr "Ștergeți profilul"
msgid "DastProfiles|Do you want to discard this scanner profile?"
-msgstr ""
+msgstr "Doriți să renunțați la acest profil de scaner?"
msgid "DastProfiles|Do you want to discard this site profile?"
-msgstr ""
+msgstr "Doriți să renunțați la acest profil de site?"
msgid "DastProfiles|Do you want to discard your changes?"
-msgstr ""
+msgstr "Doriți să renunțați la modificările efectuate?"
msgid "DastProfiles|Edit profile"
-msgstr ""
+msgstr "Editați profilul"
msgid "DastProfiles|Edit scanner profile"
-msgstr ""
+msgstr "Editați profilul scanerului"
msgid "DastProfiles|Edit site profile"
-msgstr ""
+msgstr "Editați profilul site-ului"
msgid "DastProfiles|Enable Authentication"
-msgstr ""
+msgstr "Activați autentificarea"
msgid "DastProfiles|Enter URLs in a comma-separated list."
-msgstr ""
+msgstr "Introduceți adresele URL într-o listă separată prin virgule."
msgid "DastProfiles|Enter headers in a comma-separated list."
-msgstr ""
+msgstr "Introduceți anteturile într-o listă separată prin virgule."
msgid "DastProfiles|Error Details"
-msgstr ""
+msgstr "Detalii despre erori"
msgid "DastProfiles|Excluded URLs"
-msgstr ""
+msgstr "URL-uri excluse"
msgid "DastProfiles|Excluded URLs (optional)"
-msgstr ""
+msgstr "URL-uri excluse (opțional)"
msgid "DastProfiles|Excluded paths"
-msgstr ""
+msgstr "Căi excluse"
msgid "DastProfiles|Excluded paths (optional)"
-msgstr ""
+msgstr "Căi excluse (opțional)"
msgid "DastProfiles|Hide debug messages"
-msgstr ""
+msgstr "Ascundeți mesajele de depanare"
msgid "DastProfiles|Include debug messages in the DAST console output."
-msgstr ""
-
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
+msgstr "Includeți mesaje de depanare în ieșirea consolei DAST."
msgid "DastProfiles|Manage profiles"
-msgstr ""
+msgstr "Gestionați profilurile"
msgid "DastProfiles|Manage site profiles"
-msgstr ""
+msgstr "Gestionați profilurile site-ului"
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
-msgstr ""
+msgstr "Minim = 0 (nu este activat niciun timeout), Maxim = 2880 de minute"
msgid "DastProfiles|Minimum = 1 second, Maximum = 3600 seconds"
-msgstr ""
+msgstr " Minim = 1 secundă, Maxim = 3600 de secunde"
msgid "DastProfiles|New scanner profile"
-msgstr ""
+msgstr "Profil nou de scaner"
msgid "DastProfiles|New site profile"
-msgstr ""
+msgstr "Profil site nou"
msgid "DastProfiles|No scanner profiles created yet"
-msgstr ""
+msgstr "Niciun profil de scaner creat încă"
msgid "DastProfiles|No site profiles created yet"
-msgstr ""
+msgstr "Niciun profil de site creat încă"
msgid "DastProfiles|Not Validated"
-msgstr ""
+msgstr "Nu este validat"
msgid "DastProfiles|Passive"
-msgstr ""
+msgstr "Pasiv"
msgid "DastProfiles|Password"
-msgstr ""
+msgstr "Parolă"
msgid "DastProfiles|Password form field"
-msgstr ""
+msgstr "Câmp de formular pentru parolă"
msgid "DastProfiles|Profile name"
-msgstr ""
+msgstr "Numele profilului"
msgid "DastProfiles|Request header names and values. Headers are added to every request made by DAST."
-msgstr ""
+msgstr "Numele și valorile antetului solicitării. La fiecare solicitare făcută de DAST se adaugă anteturi."
msgid "DastProfiles|Request headers"
-msgstr ""
+msgstr "Anteturile solicitării"
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
-msgstr ""
+msgstr "Executați spiderul AJAX, în plus față de spiderul tradițional, pentru a parcurge site-ul țintă."
msgid "DastProfiles|Save commonly used configurations for target sites and scan specifications as profiles. Use these with an on-demand scan."
-msgstr ""
+msgstr "Salvați ca profiluri configurațiile utilizate frecvent pentru site-urile țintă și specificațiile de scanare. Folosiți-le pentru scanări la cerere."
msgid "DastProfiles|Save profile"
-msgstr ""
+msgstr "Salvați profilul"
msgid "DastProfiles|Scan method"
-msgstr ""
+msgstr "Metoda de scanare"
msgid "DastProfiles|Scan mode"
-msgstr ""
+msgstr "Modul de scanare"
msgid "DastProfiles|Scanner Profile"
-msgstr ""
+msgstr "Profilul scanerului"
msgid "DastProfiles|Scanner Profiles"
-msgstr ""
+msgstr "Profiluri de scanare"
msgid "DastProfiles|Scanner name"
-msgstr ""
+msgstr "Numele scanerului"
msgid "DastProfiles|Select branch"
-msgstr ""
+msgstr "Selectați ramura"
msgid "DastProfiles|Show debug messages"
-msgstr ""
+msgstr "Afișați mesajele de depanare"
msgid "DastProfiles|Site Profile"
-msgstr ""
+msgstr "Profilul site-ului"
msgid "DastProfiles|Site Profiles"
-msgstr ""
+msgstr "Profiluri de site"
msgid "DastProfiles|Site name"
-msgstr ""
+msgstr "Numele site-ului"
msgid "DastProfiles|Site type"
-msgstr ""
+msgstr "Tipul site-ului"
msgid "DastProfiles|Spider timeout"
-msgstr ""
+msgstr "Timeout Spider"
msgid "DastProfiles|Target URL"
-msgstr ""
+msgstr "URL țintă"
msgid "DastProfiles|Target timeout"
-msgstr ""
+msgstr "Timeout țintă"
msgid "DastProfiles|The maximum number of minutes allowed for the spider to traverse the site."
-msgstr ""
+msgstr "Numărul maxim de minute permise pentru ca Spider-ul să traverseze site-ul."
msgid "DastProfiles|The maximum number of seconds allowed for the site under test to respond to a request."
-msgstr ""
+msgstr "Numărul maxim de secunde permise pentru ca site-ul testat să răspundă la o cerere."
msgid "DastProfiles|This profile is currently being used in a policy."
-msgstr ""
+msgstr "Acest profil este utilizat în prezent într-o politică."
msgid "DastProfiles|This scanner profile is currently being used by a policy. To make edits you must remove it from the active policy."
-msgstr ""
+msgstr "Acest profil de scanare este utilizat în prezent de o politică. Pentru a face modificări, trebuie să-l eliminați din politica activă."
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 "Acest profil de site este utilizat în prezent de o politică. Pentru a face modificări, trebuie să-l înlăturați din politica activă."
msgid "DastProfiles|Turn on AJAX spider"
-msgstr ""
+msgstr "Activați Spider-ul AJAX"
msgid "DastProfiles|URL"
-msgstr ""
+msgstr "URL"
msgid "DastProfiles|URLs to skip during the authenticated scan."
-msgstr ""
+msgstr "URL-uri care trebuie să fie sărite în timpul scanării autentificate."
msgid "DastProfiles|Username"
-msgstr ""
+msgstr "Nume utilizator"
msgid "DastProfiles|Username form field"
-msgstr ""
+msgstr "Câmpul de formular Nume de utilizator"
msgid "DastProfiles|Validated"
-msgstr ""
+msgstr "Validat"
msgid "DastProfiles|Validation status"
-msgstr ""
+msgstr "Starea validării"
msgid "DastProfiles|Website"
-msgstr ""
+msgstr "Site web"
msgid "DastProfiles|What does each method do?"
-msgstr ""
+msgstr "Ce face fiecare metodă?"
msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
-msgstr ""
+msgstr "Puteți alege o scanare pasivă sau puteți valida site-ul țintă din pagina de gestionare a profilului site-ului. %{docsLinkStart}Aflați mai multe despre validarea site-ului.%{docsLinkEnd}"
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
msgstr "Nu puteți rula o scanare activă pe un site nevalidat."
msgid "DastProfiles|folder/dast_example.har or https://example.com/dast_example.har"
-msgstr ""
+msgstr "folder/dast_example.har sau https://example.com/dast_example.har"
msgid "DastProfiles|folder/example.postman_collection.json or https://example.com/"
-msgstr ""
+msgstr "folder/example.postman_collection.json sau https://example.com/"
msgid "DastProfiles|folder/openapi.json or https://example.com/openapi.json"
-msgstr ""
+msgstr "folder/openapi.json sau https://example.com/openapi.json"
msgid "DastSiteValidation|Copy HTTP header to clipboard"
msgstr ""
msgid "DastSiteValidation|Copy Meta tag to clipboard"
-msgstr "Copiere etichetă Meta la clipboard"
+msgstr "Copiere etichetă Meta în clipboard"
msgid "DastSiteValidation|Could not create validation token. Please try again."
msgstr ""
@@ -11504,25 +11759,25 @@ msgid "DastSiteValidation|Revoke validation"
msgstr ""
msgid "DastSiteValidation|Step 1 - Choose site validation method"
-msgstr ""
+msgstr "Etapa 1 - Alegeți metoda de validare a site-ului"
msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
-msgstr ""
+msgstr "Etapa 2 - Adăugați următorul antet HTTP la site-ul dvs."
msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
-msgstr "Pasul 2 - Adăugați eticheta meta site-ului dvs."
+msgstr "Etapa 2 - Adăugați următoarea etichetă meta la site-ul dumneavoastră"
msgid "DastSiteValidation|Step 2 - Add following text to the target site"
-msgstr ""
+msgstr "Etapa 2 - Adăugați următorul text pe site-ul țintă"
msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
-msgstr ""
+msgstr "Etapa 3 - Confirmați locația antetului și validați"
msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
-msgstr "Pasul 3 - Confirmați locația etichetei meta și validați"
+msgstr "Etapa 3 - Confirmați locația etichetei meta și validați"
msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
-msgstr ""
+msgstr "Etapa 3 - Confirmați locația fișierului text și validați"
msgid "DastSiteValidation|Text file validation"
msgstr ""
@@ -11540,7 +11795,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 "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."
+msgstr "Pentru a efectua o scanare activă, validați site-ul țintă. Toate profilurile de site care partajează același URL de bază partajează același status de validare."
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -11569,20 +11824,23 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr "Reîmprospătarea datelor"
+
msgid "Data type"
-msgstr ""
+msgstr "Tipul de date"
msgid "Database update failed"
msgstr ""
msgid "DatadogIntegration|%{linkOpen}API key%{linkClose} used for authentication with Datadog."
-msgstr "%{linkOpen}cheie API %{linkClose} folosită pentru autentificarea cu Datadog."
+msgstr "%{linkOpen}Cheie API %{linkClose} folosită pentru autentificarea cu Datadog."
msgid "DatadogIntegration|(Advanced) The full URL for your Datadog site."
msgstr "(Avansat) Adresa URL completă pentru site-ul dvs. Datadog."
msgid "DatadogIntegration|API URL"
-msgstr "API URL"
+msgstr "URL API"
msgid "DatadogIntegration|Custom tags in Datadog. Enter one tag per line in the %{codeOpen}key:value%{codeClose} format. %{linkOpen}How do I use tags?%{linkClose}"
msgstr ""
@@ -11591,13 +11849,13 @@ msgid "DatadogIntegration|Environment"
msgstr "Mediu"
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 "Pentru implementări auto-gestionate, setați %{codeOpen}mediul%{codeClose} etichetei pentru toate datele trimise către Datadog. %{linkOpen}Cum folosesc etichetele?%{linkClose}"
+msgstr "Pentru implementările autogestionate, setați eticheta %{codeOpen}env%{codeClose} pentru toate datele trimise către Datadog. %{linkOpen}Cum se utilizează etichetele?%{linkClose}"
msgid "DatadogIntegration|How do I set up this integration?"
-msgstr "Cum pot configura această integrare?"
+msgstr "Cum se configurează această integrare?"
msgid "DatadogIntegration|Send CI/CD pipeline information to Datadog to monitor for job failures and troubleshoot performance issues. %{docs_link}"
-msgstr "Trimiteți informații despre conducta CI / CD către Datadog pentru a monitoriza eșecurile lucrărilor și a depana problemele de performanță. %{docs_link}"
+msgstr "Trimiteți informații despre pipeline-ul CI/CD către Datadog pentru a monitoriza eșecurile joburilor și pentru a rezolva problemele de performanță. %{docs_link}"
msgid "DatadogIntegration|Service"
msgstr "Serviciu"
@@ -11698,11 +11956,8 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
-msgstr "Ștergerea pretabilită întârziată a proiectului"
+msgstr "Ștergerea întârziată implicită a proiectului"
msgid "Default deletion delay"
msgstr ""
@@ -11719,9 +11974,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -11870,10 +12122,10 @@ msgid "Delete self monitoring project"
msgstr "Ștergeți proiectul de auto-monitorizare"
msgid "Delete snippet"
-msgstr ""
+msgstr "Ștergeți fragmentul de cod"
msgid "Delete snippet?"
-msgstr ""
+msgstr "Ștergeți fragment de cod?"
msgid "Delete source branch"
msgstr ""
@@ -11906,7 +12158,7 @@ msgid "DeleteProject|Failed to remove project repository. Please try again or co
msgstr ""
msgid "DeleteProject|Failed to remove project snippets. Please try again or contact administrator."
-msgstr ""
+msgstr "Nu s-au putut elimina fragmentele de cod ale proiectului Vă rugăm să încercați din nou sau să contactați administratorul."
msgid "DeleteProject|Failed to remove some tags in project container registry. Please try again or contact administrator."
msgstr ""
@@ -11954,10 +12206,10 @@ msgid "Deleting a project places it into a read-only state until %{date}, at whi
msgstr ""
msgid "Deleting the project will delete its repository and all related resources, including issues and merge requests."
-msgstr "Ștergerea proiectului va șterge depozitul și toate resursele conexe, inclusiv problemele și cererile de îmbinare."
+msgstr "Ștergerea proiectului va șterge repozitoriul acestuia și toate resursele aferente, inclusiv problemele și merge request-urile."
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
-msgstr "Ștergere în așteptare. Acest proiect va fi șters pe %{date}. Depozitul și alte resurse ale proiectului pot fi doar citite."
+msgstr "În așteptarea ștergerii. Acest proiect va fi șters la %{date}. Repozitoriul și alte resurse ale proiectului sunt numai în citire."
msgid "Denied"
msgstr ""
@@ -12038,13 +12290,13 @@ msgid "Dependencies|Packager"
msgstr ""
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
-msgstr ""
+msgstr "Jobul %{codeStartTag}dependency_scanning%{codeEndTag} a eșuat și nu poate genera lista. Vă rugăm să vă asigurați că lucrarea se execută corect și să rulați din nou pipeline-ul."
msgid "Dependencies|The component dependency path is based on the lock file. There may be several paths. In these cases, the longest path is displayed."
msgstr ""
msgid "Dependencies|There may be multiple paths"
-msgstr ""
+msgstr "Pot exista mai multe căi"
msgid "Dependencies|Toggle vulnerability list"
msgstr ""
@@ -12065,7 +12317,7 @@ msgid "Dependency Proxy"
msgstr ""
msgid "Dependency Scanning"
-msgstr ""
+msgstr "Scanarea dependențelor"
msgid "Dependency list"
msgstr ""
@@ -12083,7 +12335,7 @@ msgid "DependencyProxy|Copy prefix"
msgstr ""
msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
+msgstr "Creați un proxy local pentru stocarea imaginilor din amonte utilizate frecvent. %{docLinkStart}Aflați mai multe%{docLinkEnd} despre proxy-urile de dependență."
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12149,7 +12401,7 @@ msgid "Deploy keys grant read/write access to all repositories in your instance"
msgstr ""
msgid "Deploy progress not found. To see pods, ensure your environment matches %{linkStart}deploy board criteria%{linkEnd}."
-msgstr ""
+msgstr "Progresul implementării nu a fost găsit. Pentru a vedea pod-urile, asigurați-vă că mediul dvs. corespunde %{linkStart}criteriilor de implementare a bordului%{linkEnd}."
msgid "Deploy static assets and resources to Google managed CDN"
msgstr ""
@@ -12158,10 +12410,10 @@ msgid "Deploy to..."
msgstr ""
msgid "DeployBoards|To see deployment progress for your environments, make sure you are deploying to %{codeStart}$KUBE_NAMESPACE%{codeEnd} and annotating with %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} and %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd}."
-msgstr ""
+msgstr "Pentru a vedea progresul implementării pentru mediile dvs., asigurați-vă că implementați în %{codeStart}$KUBE_NAMESPACE%{codeEnd} și că adnotați cu %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} și %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd}."
msgid "DeployBoard|Kubernetes Pods"
-msgstr ""
+msgstr "Pod-uri Kubernetes"
msgid "DeployFreeze|Add a freeze period to prevent unintended releases during a period of time for a given environment. You must update the deployment jobs in %{filename} according to the deploy freezes added here. %{freeze_period_link_start}Learn more.%{freeze_period_link_end}"
msgstr ""
@@ -12248,13 +12500,13 @@ msgid "DeployTokens|Active Deploy Tokens (%{active_tokens})"
msgstr ""
msgid "DeployTokens|Allows read and write access to the package registry."
-msgstr "Permite acces de citire și scriere la registrul de pachete."
+msgstr "Permite acces în citire și scriere la registrul de pachete."
msgid "DeployTokens|Allows read-only access to registry images."
msgstr ""
msgid "DeployTokens|Allows read-only access to the package registry."
-msgstr "Permite numai acces de citire la registrul de pachete."
+msgstr "Permite numai acces în citire la registrul de pachete."
msgid "DeployTokens|Allows read-only access to the repository."
msgstr ""
@@ -12269,7 +12521,7 @@ msgid "DeployTokens|Copy username"
msgstr ""
msgid "DeployTokens|Create a new deploy token for all projects in this group. %{link_start}What are deploy tokens?%{link_end}"
-msgstr "Creați un token de implementare nou pentru toate proiectele în acest grup. %{link_start}Ce sunt token-urile de implementare?%{link_end}"
+msgstr "Creați un token de implementare nou pentru toate proiectele din acest grup. %{link_start}Ce sunt tokenurile de implementare?%{link_end}"
msgid "DeployTokens|Create deploy token"
msgstr ""
@@ -12287,7 +12539,7 @@ msgid "DeployTokens|Enter a unique name for your deploy token."
msgstr "Introduceți un nume unic pentru token-ul dvs. de implementare."
msgid "DeployTokens|Enter a username for your token. Defaults to %{code_start}gitlab+deploy-token-{n}%{code_end}."
-msgstr "Introduceți un utilizator pentru token-ul dvs. Valoarea implicită este %{code_start}gitlab+deploy-token{n}%{code_end}"
+msgstr "Introduceți un nume de utilizator pentru tokenul dvs. Valoarea implicită este %{code_start}gitlab+deploy-token{n}%{code_end}"
msgid "DeployTokens|Enter an expiration date for your token. Defaults to never expire."
msgstr "Introduceți o dată de expirare pentru token-ul dvs. În mod implicit, nu expiră niciodată."
@@ -12370,6 +12622,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr " Aprobări curente: %{current}"
+
+msgid "DeploymentApproval|Approval options"
+msgstr "Opțiuni de aprobare"
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr "Aprobați sau respingeți implementarea #%{deploymentIid}"
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr "Aprobat de %{user} %{time}"
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr "Aprobat de d-voastră %{time}"
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr "Aprobarea va executa jobul manual din implementarea #%{deploymentIid}. Respingerea va eșua jobul manual."
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr "Nivel de implementare: %{tier}"
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr "Mediu: %{environment}"
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr "Job manual: %{jobName}"
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12416,61 +12695,64 @@ msgstr[1] ""
msgstr[2] ""
msgid "Deployment|API"
-msgstr ""
+msgstr "API"
msgid "Deployment|Cancelled"
-msgstr ""
+msgstr "Anulat"
msgid "Deployment|Created"
-msgstr ""
+msgstr "Creat"
msgid "Deployment|Deployment ID"
-msgstr ""
+msgstr "ID de implementare"
msgid "Deployment|Failed"
-msgstr ""
+msgstr "Eșuat"
msgid "Deployment|Latest Deployed"
-msgstr ""
+msgstr "Ultima implementare"
+
+msgid "Deployment|Needs Approval"
+msgstr "Are nevoie de aprobare"
msgid "Deployment|Running"
-msgstr ""
+msgstr "În curs de execuție"
msgid "Deployment|Skipped"
-msgstr ""
+msgstr "Omis"
msgid "Deployment|Success"
-msgstr ""
+msgstr "Succes"
msgid "Deployment|This deployment was created using the API"
-msgstr ""
+msgstr "Această implementare a fost creată utilizând API-ul"
msgid "Deployment|Triggerer"
-msgstr ""
+msgstr "Declanșator"
msgid "Deployment|Waiting"
-msgstr ""
+msgstr "În așteptare"
msgid "Deployment|blocked"
-msgstr ""
+msgstr "blocat"
msgid "Deployment|canceled"
-msgstr ""
+msgstr "anulat"
msgid "Deployment|created"
-msgstr ""
+msgstr "creat"
msgid "Deployment|failed"
-msgstr ""
+msgstr "eșuat"
msgid "Deployment|running"
-msgstr ""
+msgstr "în curs de execuție"
msgid "Deployment|skipped"
-msgstr ""
+msgstr "omis"
msgid "Deployment|success"
-msgstr ""
+msgstr "succes"
msgid "Deprecated API rate limits"
msgstr ""
@@ -12626,7 +12908,7 @@ msgid "DesignManagement|Requested design version does not exist. Showing latest
msgstr ""
msgid "DesignManagement|Resolve thread"
-msgstr ""
+msgstr "Rezolvați subiectul"
msgid "DesignManagement|Resolved Comments"
msgstr ""
@@ -12653,7 +12935,7 @@ msgid "DesignManagement|To upload designs, you'll need to enable LFS and have an
msgstr ""
msgid "DesignManagement|Unresolve thread"
-msgstr ""
+msgstr "Marcați subiectul ca nerezolvat"
msgid "DesignManagement|Upload designs"
msgstr ""
@@ -12701,10 +12983,10 @@ msgid "DevopsAdoption|Add a group to get started"
msgstr ""
msgid "DevopsAdoption|Add or remove groups"
-msgstr "Adăugați sau eliminați grupuri"
+msgstr "Adăugați sau înlăturați grupuri"
msgid "DevopsAdoption|Add or remove subgroups"
-msgstr "Adăugați sau eliminați subgrupuri"
+msgstr "Adăugați sau înlăturați subgrupuri"
msgid "DevopsAdoption|Adopted"
msgstr ""
@@ -12728,7 +13010,7 @@ msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from th
msgstr ""
msgid "DevopsAdoption|At least one approval on a merge request"
-msgstr "Măcar o aprobare pe o cerere de îmbinare"
+msgstr "Cel puțin o aprobare pentru un merge request"
msgid "DevopsAdoption|At least one deploy"
msgstr ""
@@ -12755,13 +13037,13 @@ msgid "DevopsAdoption|DAST"
msgstr "DAST"
msgid "DevopsAdoption|DAST enabled for at least one project"
-msgstr "DAST activat pentru măcar un proiect"
+msgstr "DAST activat pentru cel puțin un proiect"
msgid "DevopsAdoption|Dependency Scanning"
-msgstr "Scanare Dependență"
+msgstr "Scanarea dependențelor"
msgid "DevopsAdoption|Dependency Scanning enabled for at least one project"
-msgstr "Scanare Dependență activată pentru măcar un proiect"
+msgstr "Scanarea dependențelor activată pentru cel puțin un proiect"
msgid "DevopsAdoption|Deploys"
msgstr ""
@@ -12773,19 +13055,19 @@ msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your
msgstr ""
msgid "DevopsAdoption|Edit groups"
-msgstr "Editați grupuri"
+msgstr "Editare grupuri"
msgid "DevopsAdoption|Edit subgroups"
-msgstr "Editați subgrupuri"
+msgstr "Editare subgrupuri"
msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Data is updated at the beginning of each month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Fuzz Testing"
-msgstr "Testare Fuzz"
+msgstr "Fuzzing API"
msgid "DevopsAdoption|Fuzz Testing enabled for at least one project"
-msgstr "Testare Fuzz activată pentru măcar un proiect"
+msgstr "Testare Fuzz activată pentru cel puțin un proiect"
msgid "DevopsAdoption|Issues"
msgstr ""
@@ -12827,7 +13109,7 @@ msgid "DevopsAdoption|SAST"
msgstr "SAST"
msgid "DevopsAdoption|SAST enabled for at least one project"
-msgstr "SAST activat pentru măcar un proiect"
+msgstr "SAST activat pentru cel puțin un proiect"
msgid "DevopsAdoption|Sec"
msgstr ""
@@ -13001,7 +13283,7 @@ msgid "Discard changes to %{path}?"
msgstr ""
msgid "Discard draft"
-msgstr ""
+msgstr "Respingeți schița"
msgid "DiscordService|Discord Notifications"
msgstr ""
@@ -13016,7 +13298,7 @@ msgid "Discover GitLab Geo"
msgstr ""
msgid "Discover projects, groups and snippets. Share your projects with others"
-msgstr ""
+msgstr "Descoperiți proiecte, grupuri și fragmente de cod. Partajați-vă proiectele cu alții"
msgid "Discover|Check your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of services."
msgstr ""
@@ -13087,6 +13369,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13106,13 +13391,13 @@ msgid "Display source"
msgstr ""
msgid "Display time tracking in issues in total hours only."
-msgstr "Afișați urmărirea timpului în probleme în ore totale numai."
+msgstr "Afișarea urmăririi timpului în probleme numai în totalul de ore."
msgid "Do not display content for customer experience improvement and offers from third parties"
msgstr ""
msgid "Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}"
-msgstr "Nu împingeți forțat referințe divergente. După ce replica este creată, această setare poate fi modifcată numai folosind API-ul. %{mirroring_docs_link_start}Aflați mai multe despre această opțiune%{link_closing_tag} și %{mirroring_api_docs_link_start}API-ul%{link_closing_tag}"
+msgstr "Nu forțați împingerea peste referințele divergente. După ce replica este creată, această setare poate fi modificată numai folosind API-ul. %{mirroring_docs_link_start}Aflați mai multe despre această opțiune%{link_closing_tag} și despre %{mirroring_api_docs_link_start}API%{link_closing_tag}."
msgid "Do you want to remove this deploy key?"
msgstr ""
@@ -13133,7 +13418,7 @@ msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
-msgstr "Nu se aplică proiectelor în spații de nume personale, ce sunt șterse imediat după solicitare."
+msgstr "Nu se aplică proiectelor din spațiile de nume personale, care sunt șterse imediat la cerere."
msgid "Does not delete the source branch."
msgstr ""
@@ -13144,6 +13429,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13205,7 +13493,7 @@ msgid "Download image"
msgstr ""
msgid "Download payload"
-msgstr ""
+msgstr "Descărcare payload"
msgid "Download raw data (.csv)"
msgstr ""
@@ -13220,7 +13508,7 @@ msgid "DownloadCommit|Email Patches"
msgstr "Patch-uri e-mail"
msgid "DownloadCommit|Plain Diff"
-msgstr "Diff plain"
+msgstr "Plain Diff"
msgid "DownloadSource|Download"
msgstr ""
@@ -13232,7 +13520,10 @@ msgid "Downvotes"
msgstr ""
msgid "Draft"
-msgstr ""
+msgstr "Schiță"
+
+msgid "Draft: %{filename}"
+msgstr "Schiță: %{filename}"
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13279,11 +13570,50 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
msgid "Dynamic Application Security Testing (DAST)"
-msgstr ""
+msgstr "Testarea dinamică a securității aplicațiilor (DAST)"
msgid "E-mail:"
msgstr ""
@@ -13337,7 +13667,7 @@ msgid "Edit Slack integration"
msgstr ""
msgid "Edit Snippet"
-msgstr ""
+msgstr "Editați fragmentul de cod"
msgid "Edit System Hook"
msgstr ""
@@ -13381,9 +13711,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13427,7 +13754,7 @@ msgid "Edit wiki page"
msgstr ""
msgid "Edit your most recent comment in a thread (from an empty textarea)"
-msgstr ""
+msgstr "Editați cel mai recent comentariu al dvs. dintr-un subiect (dintr-o zonă de text goală)"
msgid "Edit, lint, and visualize your pipeline."
msgstr ""
@@ -13481,7 +13808,7 @@ msgid "Elasticsearch's region."
msgstr ""
msgid "Elastic|None. Select namespaces to index."
-msgstr ""
+msgstr "Niciunul. Selectați spațiile de nume pentru indexare."
msgid "Elastic|None. Select projects to index."
msgstr ""
@@ -13544,7 +13871,7 @@ msgid "EmailError|It appears that the email is blank. Make sure your reply is at
msgstr "Se pare că e-mailul este gol. Asigurați-vă că răspunsul dvs se află în partea de sus a e-mailului, nu putem procesa răspunsurile inline."
msgid "EmailError|The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member."
-msgstr "Subiectul la care răspundeți nu mai există, poate că a fost șters? Dacă credeți că este o eroare, contactați un membru al personalului."
+msgstr "Subiectul la care răspundeți nu mai există, poate că a fost șters? În cazul în care credeți că este o eroare, contactați un membru al personalului."
msgid "EmailError|We couldn't figure out what the email is for. Please create your issue or comment through the web interface."
msgstr "Nu ne-am putut da seama pentru ce este e-mailul. Vă rugăm să creați problema sau comentariul dvs. prin interfața web."
@@ -13577,7 +13904,7 @@ msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
msgid "Emails"
-msgstr "E-mail-uri"
+msgstr "E-mailuri"
msgid "Emails sent from Service Desk have this name."
msgstr ""
@@ -13592,7 +13919,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 "Trimiteți prin e-mail commit-urile și diff-ul fiecărui push la o listă de destinatari."
+msgstr "Trimite prin e-mail commit-urile și diff-ul fiecărui push către o listă de destinatari."
msgid "EmailsOnPushService|Emails on push"
msgstr ""
@@ -13676,7 +14003,7 @@ msgid "Enable What's new: Current tier only"
msgstr ""
msgid "Enable a Prometheus endpoint that exposes health and performance statistics. The Health Check menu item appears in the Monitoring section of the Admin Area. Restart required."
-msgstr "Activați un punct final Prometheus care expune statistici de sănătate și performanță. Elementul-meniu Health Check apare în secția de Monitorizare a Admin Area."
+msgstr "Activează un punct final Prometheus care expune statisticile de sănătate È™i performanță. Elementul de meniu „Health Check†apare în secÈ›iunea „Monitorizare†din „Zona Adminâ€. Este necesară repornirea."
msgid "Enable access to the performance bar for non-administrators in a given group."
msgstr "Activați acces la bara de performanță pentru non-administratori într-un grup specificat."
@@ -13685,7 +14012,7 @@ msgid "Enable access tokens to expire after 2 hours. If disabled, tokens do not
msgstr ""
msgid "Enable admin mode"
-msgstr "Activați modul administrator"
+msgstr "Activați modul admin"
msgid "Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}."
msgstr ""
@@ -13708,11 +14035,14 @@ msgstr "Activați menajul automat al repozitoriului"
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr "Activați caching-ul de expirare a containerului."
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr "Activați eliminarea întârziată a proiectului în mod implicit pentru grupuri nou-create."
msgid "Enable email notification"
-msgstr "Activați notificare e-mail"
+msgstr "Activați notificarea prin e-mail"
msgid "Enable error tracking"
msgstr ""
@@ -13730,7 +14060,7 @@ msgid "Enable header and footer in emails"
msgstr ""
msgid "Enable health and performance metrics endpoint"
-msgstr "Activați punctul final de metrici sănătate și performanță"
+msgstr "Activați punctul final de metrici de sănătate și performanță"
msgid "Enable in-product marketing emails"
msgstr ""
@@ -13754,7 +14084,7 @@ msgid "Enable maintenance mode"
msgstr ""
msgid "Enable multipart emails"
-msgstr "Activați e-mailuri multipart"
+msgstr "Activați e-mailurile multipart"
msgid "Enable only for confidential applications exclusively used by a trusted backend server that can securely store the client secret. Do not enable for native-mobile, single-page, or other JavaScript applications because they cannot keep the client secret confidential."
msgstr ""
@@ -13814,22 +14144,22 @@ msgid "Enable version check"
msgstr ""
msgid "EnableReviewApp|%{stepStart}Step 1%{stepEnd}. Ensure you have Kubernetes set up and have a base domain for your %{linkStart}cluster%{linkEnd}."
-msgstr ""
+msgstr "%{stepStart}Etapa 1%{stepEnd}. Asigurați-vă că ați configurat Kubernetes și că aveți un domeniu de bază pentru %{linkStart}clusterul%{linkEnd} dumneavoastră."
msgid "EnableReviewApp|%{stepStart}Step 2%{stepEnd}. Copy the following snippet:"
-msgstr ""
+msgstr "%{stepStart}Etapa 2%{stepEnd}. Copiați următorul fragment de cod:"
msgid "EnableReviewApp|%{stepStart}Step 3%{stepEnd}. Add it to the project %{linkStart}gitlab-ci.yml%{linkEnd} file."
msgstr ""
msgid "EnableReviewApp|%{stepStart}Step 4 (optional)%{stepEnd}. Enable Visual Reviews by following the %{linkStart}setup instructions%{linkEnd}."
-msgstr "%{stepStart}Pasul 4 (opțional)%{stepEnd}. Activați Recenzii Vizuale urmărind %{linkStart}instrucțiunile de setare%{linkEnd}."
+msgstr "%{stepStart}Etapa 4 (opțională)%{stepEnd}. Activați „Recenzii vizuale†urmând %{linkStart}instrucțiunile de configurare%{linkEnd}."
msgid "EnableReviewApp|Close"
msgstr ""
msgid "EnableReviewApp|Copy snippet text"
-msgstr ""
+msgstr "Copiați textul fragmentului de cod"
msgid "Enabled"
msgstr ""
@@ -13883,7 +14213,7 @@ msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd}
msgstr ""
msgid "Enter %{weights_link_start}weights%{weights_link_end} for storages for new repositories. Configured storages appear below."
-msgstr "Introduceți %{weights_link_start}greutăți%{weights_link_end} pentru stocări pentru repozitoriile noi. Stocări configurate apar mai jos."
+msgstr "Introduceți %{weights_link_start}greutăți%{weights_link_end} pentru stocări pentru repozitoriile noi. Stocările configurate apar mai jos."
msgid "Enter 2FA for Admin Mode"
msgstr ""
@@ -13952,7 +14282,7 @@ msgid "Enter the username for password-protected Elasticsearch servers."
msgstr ""
msgid "Enter your Packagist server. Defaults to https://packagist.org."
-msgstr "Introduceți server-ul dvs. Packagist. Valoarea implicită este https://packagist.org."
+msgstr "Introduceți serverul dvs. Packagist. Valoarea implicită este https://packagist.org."
msgid "Enter your Packagist token."
msgstr "Introduceți tokenul dvs. Packagist"
@@ -13976,16 +14306,16 @@ msgid "Environment does not have deployments"
msgstr ""
msgid "Environment is required for Stages::MetricEndpointInserter"
-msgstr ""
+msgstr "Mediul este necesar pentru Stagii::MetricEndpointInserter"
msgid "Environment is required for Stages::VariableEndpointInserter"
-msgstr ""
+msgstr "Mediul este necesar pentru Stagii::VariableEndpointInserter"
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
-msgstr ""
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
+msgstr "Variabila de mediu %{environment_variable} nu există sau nu indică un director valid."
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
msgstr ""
@@ -13997,22 +14327,22 @@ msgid "Environment:"
msgstr ""
msgid "EnvironmentDashboard|API"
-msgstr ""
+msgstr "API"
msgid "EnvironmentDashboard|Created through the Deployment API"
-msgstr ""
+msgstr "Creat prin API-ul de implementare"
msgid "EnvironmentDashboard|You are looking at the last updated environment"
-msgstr ""
+msgstr "Vizualizați ultimul mediu actualizat"
msgid "Environments"
msgstr ""
msgid "Environments Dashboard"
-msgstr ""
+msgstr "Tabloul de bord de medii"
msgid "Environments allow you to track deployments of your application. %{linkStart}More information%{linkEnd}."
-msgstr "Mediile vă permit să urmăriți implementări ale aplicației dvs. %{linkStart}Mai multe informații%{linkEnd}"
+msgstr "Mediile vă permit să urmăriți implementările aplicației dvs. %{linkStart}Mai multe informații%{linkEnd}"
msgid "Environments in %{name}"
msgstr ""
@@ -14021,28 +14351,28 @@ msgid "EnvironmentsAlert|%{severity} • %{title} %{text}. %{linkStart}View Deta
msgstr ""
msgid "EnvironmentsDashboard|Add a project to the dashboard"
-msgstr ""
+msgstr "Adăugați un proiect în tabloul de bord"
msgid "EnvironmentsDashboard|Add projects"
-msgstr ""
+msgstr "Adăugați proiecte"
msgid "EnvironmentsDashboard|Environments Dashboard"
-msgstr ""
+msgstr "Tabloul de bord de medii"
msgid "EnvironmentsDashboard|Job: %{job}"
-msgstr ""
+msgstr "Jobul: %{job}"
msgid "EnvironmentsDashboard|More actions"
-msgstr ""
+msgstr "Mai multe acțiuni"
msgid "EnvironmentsDashboard|Remove"
-msgstr ""
+msgstr "Înlăturați"
msgid "EnvironmentsDashboard|The environments dashboard provides a summary of each project's environments' status, including pipeline and alert statuses."
-msgstr "Panoul de control al mediilor oferă un rezumat al stării mediului fiecărui proiect, inclusiv starea conductelor și a alertelor."
+msgstr "Tabloul de bord al mediilor oferă un rezumat al stării mediilor fiecărui proiect, inclusiv a stărilor pipeline și de alertă."
msgid "EnvironmentsDashboard|This dashboard displays 3 environments per project, and is linked to the Operations Dashboard. When you add or remove a project from one dashboard, GitLab adds or removes the project from the other. %{linkStart}More information%{linkEnd}"
-msgstr ""
+msgstr "Acest tablou de bord afiÈ™ează 3 medii per proiect È™i este legat de „Tabloul de bord de operaÈ›iuniâ€. Atunci când adăugaÈ›i sau înlăturaÈ›i un proiect dintr-un tablou de bord, GitLab adaugă sau înlătură proiectul din celălalt. %{linkStart}Mai multe informaÈ›ii%{linkEnd}"
msgid "Environments|An error occurred while canceling the auto stop, please try again"
msgstr ""
@@ -14116,6 +14446,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14131,9 +14464,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr "Log-uri de la %{start} la %{end}."
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14195,7 +14525,7 @@ msgid "Environments|Stopping %{environmentName}"
msgstr ""
msgid "Environments|There are no deployments for this environment yet. %{linkStart}Learn more about setting up deployments.%{linkEnd}"
-msgstr ""
+msgstr "Nu există încă implementări pentru acest mediu. %{linkStart}Aflați mai multe despre configurarea implementărilor.%{linkEnd}"
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -14215,7 +14545,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr "Actualizat"
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14231,7 +14564,7 @@ msgid "Epic"
msgstr ""
msgid "Epic Boards"
-msgstr ""
+msgstr "Borduri de epice"
msgid "Epic cannot be found."
msgstr ""
@@ -14378,10 +14711,10 @@ msgid "Error creating new iteration"
msgstr ""
msgid "Error creating repository for snippet with id %{snippet_id}"
-msgstr ""
+msgstr "Eroare la crearea repozitoriului pentru fragmentul de cod cu ID-ul %{snippet_id}"
msgid "Error creating the snippet"
-msgstr ""
+msgstr "Eroare la crearea fragmentului de cod"
msgid "Error deleting project. Check logs for error details."
msgstr ""
@@ -14393,7 +14726,7 @@ msgid "Error fetching diverging counts for branches. Please try again."
msgstr ""
msgid "Error fetching forked projects. Please try again."
-msgstr ""
+msgstr "Eroare la preluarea proiectelor din forkuri. Vă rugăm să încercați din nou."
msgid "Error fetching labels."
msgstr ""
@@ -14402,7 +14735,7 @@ msgid "Error fetching network graph."
msgstr ""
msgid "Error fetching payload data."
-msgstr ""
+msgstr "Eroare la preluarea datelor payload"
msgid "Error fetching refs"
msgstr ""
@@ -14447,7 +14780,7 @@ msgid "Error loading project data. Please try again."
msgstr "Eroare la încărcarea datelor proiectului. Vă rugăm să încercați din nou."
msgid "Error loading template types."
-msgstr ""
+msgstr "Eroare la încărcarea tipurilor de șabloane."
msgid "Error loading template."
msgstr ""
@@ -14519,7 +14852,7 @@ msgid "Error updating status of to-do item."
msgstr ""
msgid "Error updating the snippet"
-msgstr ""
+msgstr "Eroare la actualizarea fragmentului de cod"
msgid "Error uploading file"
msgstr ""
@@ -14552,7 +14885,7 @@ msgid "Error: No AWS credentials were supplied"
msgstr ""
msgid "Error: No AWS provision role found for user"
-msgstr ""
+msgstr "Eroare: nu a fost găsit niciun rol de furnizare AWS pentru utilizator"
msgid "Error: Unable to create deploy freeze"
msgstr ""
@@ -14567,34 +14900,43 @@ msgid "ErrorTracking|Active"
msgstr "Activ"
msgid "ErrorTracking|After adding your Auth Token, select the Connect button to load projects."
-msgstr ""
+msgstr "După adăugarea Tokenului Auth, selectați butonul „Conectare†pentru a încărca proiectele."
msgid "ErrorTracking|Auth Token"
-msgstr "Token de autentificare"
+msgstr "Token Auth"
msgid "ErrorTracking|Click Connect to reestablish the connection to Sentry and activate the dropdown."
-msgstr ""
+msgstr "Faceți clic pe „Conectare†pentru a restabili conexiunea cu Sentry și pentru a activa lista derulantă."
msgid "ErrorTracking|Connection failed. Check Auth Token and try again."
-msgstr ""
+msgstr "Conexiunea a eșuat. Verificați Tokenul Auth și încercați din nou."
msgid "ErrorTracking|Enable error tracking"
-msgstr ""
+msgstr "Activați urmărirea erorilor"
msgid "ErrorTracking|Error tracking backend"
-msgstr ""
+msgstr "Backend de urmărire a erorilor"
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
-msgstr ""
+msgstr "Dacă auto-găzduiți Sentry, introduceți URL-ul complet al instanței Sentry. Dacă utilizați soluția găzduită Sentry, introduceți https://sentry.io"
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr "Urmărirea integrată a erorilor este %{epicLinkStart}dezactivată în mod implicit%{epicLinkEnd} È™i nu mai este activă pentru acest proiect. Pentru a reactiva urmărirea erorilor pe instanÈ›ele cu auto-găzduire, puteÈ›i fie %{flagLinkStart}să activaÈ›i Feature Flagâ€%{flagLinkEnd} pentru urmărirea integrată a erorilor, fie să furnizaÈ›i %{settingsLinkStart}URL-ul API-ului Sentry È™i un Token Auth%{settingsLinkEnd} pe pagina de setări a proiectului dumneavoastră. Cu toate acestea, urmărirea erorilor nu este pregătită pentru utilizarea în producÈ›ie È™i nu poate fi activată pe GitLab.com."
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr "Urmărirea integrată a erorilor este %{epicLinkStart}dezactivată în mod implicit%{epicLinkEnd} și nu mai este activă pentru acest proiect. Pentru a reactiva urmărirea erorilor pe instanțele cu auto-găzduire, puteți fie %{flagLinkStart}să activați Feature Flag%{flagLinkEnd} pentru urmărirea integrată a erorilor, fie să furnizați URL-ul API-ului Sentry și un Token Auth mai jos. Cu toate acestea, urmărirea erorilor nu este pregătită pentru utilizarea în producție și nu poate fi activată pe GitLab.com."
msgid "ErrorTracking|No projects available"
-msgstr ""
+msgstr "Nu există proiecte disponibile"
msgid "ErrorTracking|Select project"
-msgstr ""
+msgstr "Selectați proiectul"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
-msgstr ""
+msgstr "Pentru a activa selectarea proiectului, introduceți un Token Auth valabil."
+
+msgid "ErrorTracking|View project settings"
+msgstr "Vizualizați setările proiectului"
msgid "Errors"
msgstr ""
@@ -14642,7 +14984,7 @@ msgid "EscalationPolicies|A schedule is required for adding an escalation policy
msgstr ""
msgid "EscalationPolicies|A user is required for adding an escalation policy."
-msgstr "Un utilizator este necesar pentru adăugarea unei politici de escaladare."
+msgstr "Pentru a adăuga o politică de escaladare este necesar un utilizator."
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
@@ -14669,7 +15011,7 @@ msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
msgid "EscalationPolicies|Email user"
-msgstr "Utilizator e-mail"
+msgstr "Trimiteți e-mail utilizatorului"
msgid "EscalationPolicies|Escalation policies"
msgstr ""
@@ -14696,7 +15038,7 @@ msgid "EscalationPolicies|Remove escalation rule"
msgstr ""
msgid "EscalationPolicies|Search for user"
-msgstr "Căutați pentru utilizator"
+msgstr "Căutare utilizator"
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -14756,7 +15098,7 @@ msgid "Events"
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."
+msgstr "Toate încercările de %{action} au eșuat: %{job_error_message}. Vă rugăm să încercați din nou."
msgid "Every 3 months"
msgstr ""
@@ -14783,7 +15125,7 @@ msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
-msgstr "Fiecare lună (Ziua %{day} la %{time})"
+msgstr "În fiecare lună (Ziua %{day} la %{time})"
msgid "Every month on the %{day} at %{time} %{timezone}"
msgstr ""
@@ -14836,6 +15178,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14848,6 +15193,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr "Cu excepția politicii:"
@@ -14888,7 +15236,7 @@ msgid "Expand all files"
msgstr ""
msgid "Expand all threads"
-msgstr ""
+msgstr "Extindeți toate subiectele"
msgid "Expand approvers"
msgstr ""
@@ -14918,7 +15266,7 @@ msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
-msgstr ""
+msgstr "Trebuie să aibă exact unul dintre Utilizator, Spațiu de nume sau Proiect."
msgid "Expiration"
msgstr ""
@@ -14968,6 +15316,9 @@ msgstr ""
msgid "Explore groups"
msgstr "Explorați grupurile"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Explorați proiectele"
@@ -14978,7 +15329,7 @@ msgid "Explore public projects"
msgstr ""
msgid "Explore snippets"
-msgstr ""
+msgstr "Explorați fragmentele de cod"
msgid "Explore topics"
msgstr ""
@@ -15038,10 +15389,10 @@ msgid "External storage URL"
msgstr ""
msgid "External storage authentication token"
-msgstr ""
+msgstr "Token de autentificare a stocării externe"
msgid "External storage for repository static objects"
-msgstr "Stocare externă pentru obiecte statice din repozitoriu."
+msgstr "Stocare externă pentru obiectele statice ale repozitoriului"
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -15097,11 +15448,17 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr "Un alt tracker de probleme este deja în uz"
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
-msgstr ""
+msgstr "Nu toate datele pot fi afișate aici. Pentru a vizualiza mai multe detalii sau a face modificări la această problemă, accesați %{linkStart}%{trackerName}%{linkEnd}"
+
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr "O singură integrare a trackerului de probleme poate fi activă la un moment dat. Vă rugăm să dezactivați mai întâi trackerul activ și să încercați din nou."
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
-msgstr ""
+msgstr "Această problemă este sincronizată cu %{trackerName}"
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15194,7 +15551,7 @@ msgid "Failed to deploy to"
msgstr ""
msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
-msgstr ""
+msgstr "Operațiunea rebase nu a reușit să fie pusă în coadă, posibil din cauza unei tranzacții cu durată lungă de viață. Încercați din nou mai târziu."
msgid "Failed to fetch the iteration for this issue. Please try again."
msgstr ""
@@ -15211,6 +15568,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr "Generarea exportului a eșuat, vă rugăm încercați mai târziu."
+msgid "Failed to generate report, please try again after sometime"
+msgstr "Nu s-a putut genera raportul, încercați din nou mai târziu"
+
msgid "Failed to get ref."
msgstr ""
@@ -15404,229 +15764,229 @@ msgid "Favicon will be removed. Are you sure?"
msgstr ""
msgid "Feature Flags"
-msgstr ""
+msgstr "Feature Flags"
msgid "Feature deprecation and removal"
msgstr ""
msgid "Feature flag status"
-msgstr ""
+msgstr "Statusul Feature Flag"
msgid "Feature flag was not removed."
-msgstr ""
+msgstr "Feature Flag-ul nu a fost înlăturat."
msgid "Feature flag was successfully removed."
-msgstr ""
+msgstr "Feature Flag-ul a fost înlăturat cu succes."
msgid "FeatureFlags|%d user"
msgid_plural "FeatureFlags|%d users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d utilizator"
+msgstr[1] "%d utilizatori"
+msgstr[2] "%d de utilizatori"
msgid "FeatureFlags|%{percent} by available ID"
-msgstr ""
+msgstr "%{percent} după ID-ul disponibil"
msgid "FeatureFlags|%{percent} by session ID"
-msgstr ""
+msgstr "%{percent} după ID-ul sesiunii"
msgid "FeatureFlags|%{percent} by user ID"
-msgstr ""
+msgstr "%{percent} după ID-ul utilizatorului"
msgid "FeatureFlags|%{percent} randomly"
-msgstr ""
+msgstr "%{percent} aleatoriu"
msgid "FeatureFlags|* (All Environments)"
-msgstr ""
+msgstr "* (Toate mediile)"
msgid "FeatureFlags|API URL"
-msgstr ""
+msgstr "Adresa URL API"
msgid "FeatureFlags|Active"
-msgstr ""
+msgstr "Activ"
msgid "FeatureFlags|Add strategy"
-msgstr ""
+msgstr "Adăugați strategia"
msgid "FeatureFlags|All Environments"
-msgstr ""
+msgstr "Toate mediile"
msgid "FeatureFlags|All Users"
-msgstr ""
+msgstr "Toți utilizatorii"
msgid "FeatureFlags|All users"
-msgstr ""
+msgstr "Toți utilizatorii"
msgid "FeatureFlags|Configure"
-msgstr ""
+msgstr "Configurare"
msgid "FeatureFlags|Configure feature flags"
-msgstr ""
+msgstr "Configurați Feature Flags"
msgid "FeatureFlags|Consider using the more flexible \"Percent rollout\" strategy instead."
-msgstr ""
+msgstr "LuaÈ›i în considerare, în schimb, posibilitatea de a utiliza strategia mai flexibilă „Implementare procentualăâ€."
msgid "FeatureFlags|Create feature flag"
-msgstr ""
+msgstr "Creați un Feature Flag"
msgid "FeatureFlags|Delete %{name}?"
-msgstr ""
+msgstr "Ștergeți %{name}?"
msgid "FeatureFlags|Delete feature flag"
-msgstr ""
+msgstr "Ștergeți un Feature Flag"
msgid "FeatureFlags|Description"
-msgstr ""
+msgstr "Descriere"
msgid "FeatureFlags|Edit Feature Flag"
-msgstr ""
+msgstr "Editați Feature Flag-ul"
msgid "FeatureFlags|Edit User List"
-msgstr ""
+msgstr "Editarea listei de utilizatori"
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
-msgstr ""
+msgstr "Activați funcții pentru utilizatori și medii specifice prin configurarea strategiilor Feature Flag."
msgid "FeatureFlags|Environment Specs"
-msgstr ""
+msgstr "Specificații de mediu"
msgid "FeatureFlags|Feature Flag"
-msgstr ""
+msgstr "Feature Flag"
msgid "FeatureFlags|Feature Flag User List Details"
-msgstr ""
+msgstr "Detaliile listei de utilizatori Feature Flag"
msgid "FeatureFlags|Feature Flag User Lists"
-msgstr ""
+msgstr "Liste de utilizatori Feature Flag"
msgid "FeatureFlags|Feature Flag behavior is built up by creating a set of rules to define the status of target environments. A default wildcard rule %{codeStart}*%{codeEnd} for %{boldStart}All Environments%{boldEnd} is set, and you are able to add as many rules as you need by choosing environment specs below. You can toggle the behavior for each of your rules to set them %{boldStart}Active%{boldEnd} or %{boldStart}Inactive%{boldEnd}."
-msgstr ""
+msgstr "Comportamentul Feature Flag se construiește prin crearea unui set de reguli care să definească starea mediilor țintă. Se stabilește o regulă implicită de tip wildcard %{codeStart}*%{codeEnd} pentru %{boldStart}Toate mediile%{boldEnd} și puteți adăuga câte reguli aveți nevoie alegând specificațiile mediului de mai jos. Puteți comuta comportamentul pentru fiecare dintre regulile dvs. pentru a le seta %{boldStart}Active%{boldEnd} sau %{boldStart}Inactive%{boldEnd}."
msgid "FeatureFlags|Feature Flag has no strategies"
-msgstr ""
+msgstr "Feature Flag nu are strategii"
msgid "FeatureFlags|Feature Flags"
-msgstr ""
+msgstr "Feature Flags"
msgid "FeatureFlags|Feature flag %{name} will be removed. Are you sure?"
-msgstr ""
+msgstr "Feature Flag %{name} va fi înlăturat. Sunteți sigur?"
msgid "FeatureFlags|Feature flags allow you to configure your code into different flavors by dynamically toggling certain functionality."
-msgstr ""
+msgstr "Feature Flags vă permit să vă configurați codul în diferite variante prin comutarea dinamică a anumitor funcționalități."
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
-msgstr ""
+msgstr "Limita de Feature Flags a fost atinsă (%{featureFlagsLimit}). Ștergeți unul sau mai multe feature flag-uri înainte de a adăuga altele noi."
msgid "FeatureFlags|Get started with feature flags"
-msgstr ""
+msgstr "Începeți cu Feature Flags"
msgid "FeatureFlags|ID"
-msgstr ""
+msgstr "ID"
msgid "FeatureFlags|Inactive"
-msgstr ""
+msgstr "Inactiv"
msgid "FeatureFlags|Inactive flag for %{scope}"
-msgstr ""
+msgstr "Flag inactiv pentru %{scope}"
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
-msgstr ""
+msgstr "Instalați o %{docsLinkAnchoredStart}bibliotecă client compatibilă%{docsLinkAnchoredEnd} și specificați URL-ul API-ului, numele aplicației și ID-ul instanței în timpul setării configurației. %{docsLinkStart}Mai multe informații%{docsLinkEnd}"
msgid "FeatureFlags|Instance ID"
-msgstr ""
+msgstr "ID-ul instanței"
msgid "FeatureFlags|List details"
-msgstr ""
+msgstr "Detalii listă"
msgid "FeatureFlags|Loading feature flags"
-msgstr ""
+msgstr "Se încarcă Feature Flags"
msgid "FeatureFlags|More information"
-msgstr ""
+msgstr "Mai multe informații"
msgid "FeatureFlags|Name"
-msgstr ""
+msgstr "Nume"
msgid "FeatureFlags|New"
msgstr "Nou"
msgid "FeatureFlags|New Feature Flag"
-msgstr ""
+msgstr "Un nou Feature Flag"
msgid "FeatureFlags|New User List"
-msgstr ""
+msgstr "Listă de utilizatori nouă"
msgid "FeatureFlags|New feature flag"
-msgstr ""
+msgstr "Un nou feature flag"
msgid "FeatureFlags|No user list selected"
-msgstr ""
+msgstr "Nu este selectată nicio listă de utilizatori"
msgid "FeatureFlags|Percent of users"
-msgstr ""
+msgstr "Procentul de utilizatori"
msgid "FeatureFlags|Percent rollout"
-msgstr ""
+msgstr "Implementare procentuală"
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
-msgstr ""
+msgstr "Implementarea procentuală trebuie să fie un număr întreg între 0 și 100"
msgid "FeatureFlags|Remove"
-msgstr ""
+msgstr "Înlăturați"
msgid "FeatureFlags|Search code references"
-msgstr ""
+msgstr "Căutați referințe de cod"
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
-msgstr ""
+msgstr "Setați numele aplicației client Unleash la numele mediului în care se execută aplicația dumneavoastră. Această valoare este utilizată pentru a se potrivi cu domeniul mediului. Consultați %{linkStart}exemplul de configurare a clientului%{linkEnd}."
msgid "FeatureFlags|Status"
-msgstr ""
+msgstr "Status"
msgid "FeatureFlags|Strategies"
-msgstr ""
+msgstr "Strategii"
msgid "FeatureFlags|There was an error fetching the feature flags."
-msgstr ""
+msgstr "S-a produs o eroare la preluarea Feature Flags-urilor."
msgid "FeatureFlags|To prevent accidental actions we ask you to confirm your intention. Please type %{projectName} to proceed or close this modal to cancel."
-msgstr ""
+msgstr "Pentru a preveni acțiunile accidentale, vă rugăm să vă confirmați intenția. Vă rugăm să tastați %{projectName} pentru a continua sau să închideți acest mod pentru a anula."
msgid "FeatureFlags|Try again in a few moments or contact your support team."
-msgstr ""
+msgstr "Încercați din nou în câteva momente sau contactați echipa de asistență."
msgid "FeatureFlags|User IDs"
-msgstr ""
+msgstr "ID-uri de utilizator"
msgid "FeatureFlags|User List"
-msgstr ""
+msgstr "Lista de utilizatori"
msgid "FeatureFlags|User Lists"
-msgstr ""
+msgstr "Liste de utilizatori"
msgid "FeatureFlags|View user lists"
-msgstr ""
+msgstr "Vizualizați listele de utilizatori"
msgid "FeatureFlag|Percentage"
-msgstr ""
+msgstr "Procentaj"
msgid "FeatureFlag|Select a user list"
-msgstr ""
+msgstr "Selectați o listă de utilizatori"
msgid "FeatureFlag|Select the environment scope for this feature flag"
-msgstr ""
+msgstr "Selectați domeniul mediului pentru acest Feature Flag"
msgid "FeatureFlag|There are no configured user lists"
msgstr "Nu există liste de utilizatori configurate"
msgid "FeatureFlag|Type"
-msgstr ""
+msgstr "Tip"
msgid "FeatureFlag|User IDs"
-msgstr ""
+msgstr "ID-uri de utilizator"
msgid "FeatureFlag|User List"
-msgstr ""
+msgstr "Lista de utilizatori"
msgid "Feb"
msgstr ""
@@ -15634,8 +15994,8 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
-msgstr ""
+msgid "Fetch and check out this merge request's feature branch:"
+msgstr "Obțineți și verificați această ramură de caracteristică a merge request-ului:"
msgid "Fetching incoming email"
msgstr ""
@@ -15698,7 +16058,7 @@ msgid "Files API Rate Limits"
msgstr ""
msgid "Files breadcrumb"
-msgstr ""
+msgstr "Breadcrumb de fișiere"
msgid "Files with large changes are collapsed by default."
msgstr ""
@@ -15775,9 +16135,6 @@ msgstr ""
msgid "Filter users"
msgstr "Filtrați utilizatorii"
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15836,7 +16193,7 @@ msgid "Fixed:"
msgstr "Fixă:"
msgid "Flags"
-msgstr ""
+msgstr "Semnalizatori"
msgid "FloC|Configure whether you want to participate in FloC."
msgstr ""
@@ -15974,7 +16331,7 @@ msgid "ForkProject|Internal"
msgstr ""
msgid "ForkProject|Please select a namespace"
-msgstr ""
+msgstr "Vă rugăm să selectați un spațiu de nume"
msgid "ForkProject|Please select a visibility level"
msgstr ""
@@ -15989,7 +16346,7 @@ msgid "ForkProject|Public"
msgstr ""
msgid "ForkProject|Select a namespace"
-msgstr ""
+msgstr "Selectați un spațiu de nume"
msgid "ForkProject|The project can be accessed by any logged in user."
msgstr ""
@@ -16001,7 +16358,7 @@ msgid "ForkProject|Visibility level"
msgstr ""
msgid "ForkProject|Want to house several dependent projects under the same namespace?"
-msgstr ""
+msgstr "Doriți să găzduiți mai multe proiecte dependente sub același spațiu de nume?"
msgid "ForkSuggestion|Cancel"
msgstr ""
@@ -16013,10 +16370,10 @@ msgid "ForkSuggestion|You can’t %{edit_start}edit%{edit_end} files directly in
msgstr ""
msgid "ForkedFromProjectPath|Forked from"
-msgstr ""
+msgstr "Fork derivat de la"
msgid "ForkedFromProjectPath|Forked from an inaccessible project"
-msgstr ""
+msgstr "Fork derivat de la un proiect inaccesibil"
msgid "Forking in progress"
msgstr ""
@@ -16042,9 +16399,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16072,6 +16426,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16135,9 +16492,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr "Generic"
@@ -16169,7 +16523,7 @@ msgid "Geo sites"
msgstr ""
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
-msgstr ""
+msgstr "%{boldStart}N/A%{boldEnd}: Geo nu verifică încă această componentă. Consultați %{linkStart}tipurile de date pe care intenționăm să le susținem%{linkEnd}."
msgid "Geo|%{component} synced"
msgstr ""
@@ -16253,7 +16607,7 @@ msgid "Geo|Data replication lag"
msgstr ""
msgid "Geo|Data type"
-msgstr ""
+msgstr "Tipul de date"
msgid "Geo|Disabled"
msgstr ""
@@ -16289,7 +16643,7 @@ msgid "Geo|Geo sites are paused using a command run on the site"
msgstr ""
msgid "Geo|Geo supports replication of many data types."
-msgstr ""
+msgstr "Geo acceptă replicarea mai multor tipuri de date."
msgid "Geo|Go to the primary site"
msgstr ""
@@ -16687,9 +17041,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16702,6 +17053,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16753,9 +17107,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16868,7 +17219,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 subdomains of subdomains. If your namespace or groupname contains a dot, it does not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages work if you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Când utilizați Pages sub domeniul general al unei instanțe GitLab (%{pages_host}), nu puteți utiliza HTTPS cu subdomeniile unor subdomenii. Dacă spațiul de nume sau numele de grup al dvs. conține un punct, nu funcționează. Aceasta este o limitare a protocolului HTTP Over TLS. Paginile HTTP funcționează dacă nu redirecționați HTTP to HTTPS. %{docs_link_start}Aflați mai multe.%{link_end}"
msgid "GitLabPages|With GitLab Pages you can host your static website directly from your GitLab repository. %{docs_link_start}Learn more.%{link_end}"
msgstr ""
@@ -16958,46 +17309,55 @@ msgid "Global notification settings"
msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
-msgstr ""
+msgstr "%{count} (de) rezultate implicite furnizate. Utilizați tastele săgeată sus și jos pentru a naviga în lista de rezultate ale căutării."
msgid "GlobalSearch|Issues I've created"
-msgstr ""
+msgstr "Problemele pe care le-am creat"
msgid "GlobalSearch|Issues assigned to me"
-msgstr ""
+msgstr "Problemele care mi-au fost atribuite"
msgid "GlobalSearch|Merge requests I've created"
-msgstr ""
+msgstr "Merge request-urile pe care le-am creat"
msgid "GlobalSearch|Merge requests assigned to me"
-msgstr ""
+msgstr "Merge request-urile care mi-au fost atribuite"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
-msgstr ""
+msgstr "Merge request-uri pentru care sunt un recenzent"
msgid "GlobalSearch|Results updated. %{count} results available. Use the up and down arrow keys to navigate search results list, or ENTER to submit."
-msgstr ""
+msgstr "Rezultatele s-au actualizat. %{count} (de) rezultate disponibile. Utilizați tastele săgeată sus și jos pentru a naviga în lista de rezultate ale căutării sau tasta ENTER pentru a trimite."
msgid "GlobalSearch|Search GitLab"
-msgstr ""
+msgstr "Căutați în GitLab"
+
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr "Căutați proiecte, probleme etc."
msgid "GlobalSearch|Search results are loading"
-msgstr ""
+msgstr "Rezultatele căutării se încarcă"
+
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr "A apărut o eroare la preluarea sugestiilor de autocompletare a căutării."
msgid "GlobalSearch|Type and press the enter key to submit search."
-msgstr ""
+msgstr "Tastați și apăsați tasta Enter pentru a trimite căutarea."
msgid "GlobalSearch|Type for new suggestions to appear below."
-msgstr ""
+msgstr "Tastați pentru ca noile sugestii să apară mai jos."
+
+msgid "GlobalSearch|What are you searching for?"
+msgstr "Ce căutați?"
msgid "GlobalSearch|in all GitLab"
-msgstr ""
+msgstr "peste tot în GitLab"
msgid "GlobalSearch|in group"
-msgstr ""
+msgstr "în grup"
msgid "GlobalSearch|in project"
-msgstr ""
+msgstr "în proiect"
msgid "Go Back"
msgstr ""
@@ -17029,6 +17389,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr "Accesați pagina de medii pentru a aproba sau respinge"
+
msgid "Go to epic"
msgstr ""
@@ -17045,7 +17408,7 @@ msgid "Go to find file"
msgstr ""
msgid "Go to issue boards"
-msgstr ""
+msgstr "Mergeți la bordurile de probleme"
msgid "Go to issues"
msgstr ""
@@ -17093,7 +17456,7 @@ msgid "Go to repository graph"
msgstr ""
msgid "Go to snippets"
-msgstr ""
+msgstr "Mergeți la fragmente de cod"
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
msgstr ""
@@ -17102,7 +17465,7 @@ msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restri
msgstr ""
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
-msgstr ""
+msgstr "MergeÈ›i la „Zona Admin &gt; RestricÈ›ii de înscriere†și bifaÈ›i „Lista de domenii refuzateâ€."
msgid "Go to the activity feed"
msgstr ""
@@ -17141,7 +17504,7 @@ msgid "Go to your projects"
msgstr ""
msgid "Go to your snippets"
-msgstr ""
+msgstr "Mergeți la fragmentele dvs. de cod"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
@@ -17155,9 +17518,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17167,6 +17527,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr "Anulare"
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr "Regiunea configurată este legată de ramura sau eticheta selectată"
+
+msgid "GoogleCloud|Create service account"
+msgstr "Creați un cont de servicii"
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr "Contul de servicii generat este legat de ramura sau eticheta selectată"
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr "Proiectul Google Cloud"
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr "Solicitarea de revocare a tokenului Google OAuth2 nu a reușit"
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr "A fost solicitată revocarea tokenului Google OAuth2"
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr "Înțeleg responsabilitățile implicate de gestionarea cheilor conturilor de servicii"
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr "Se generează un nou cont de servicii pentru proiectul Google Cloud selectat"
+
+msgid "GoogleCloud|Refs"
+msgstr "Referințe"
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr "Revocarea autorizațiilor"
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr "Revocarea autorizațiilor acordate către GitLab. Acest lucru nu invalidează conturile de servicii."
+
msgid "Got it"
msgstr ""
@@ -17360,7 +17756,7 @@ msgid "Group pipeline minutes were successfully reset."
msgstr ""
msgid "Group project URLs are prefixed with the group namespace"
-msgstr ""
+msgstr "URL-urile proiectului de grup sunt prefixate cu spațiul de nume al grupului"
msgid "Group requires separate account"
msgstr ""
@@ -17371,9 +17767,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17480,178 +17873,178 @@ msgid "GroupRoadmap|Within 3 years"
msgstr ""
msgid "GroupSAML|\"persistent\" recommended"
-msgstr ""
+msgstr "recomandat „persistentâ€"
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enable %{linkStart}SSO enforcement%{linkEnd} to reduce security risks."
-msgstr ""
+msgstr "%{strongOpen}Avertisment%{strongClose} - Activați %{linkStart}aplicarea SSO%{linkEnd} pentru a reduce riscurile de securitate."
msgid "GroupSAML|Active SAML Group Links (%{count})"
-msgstr ""
+msgstr "Linkuri active de grup SAML (%{count})"
msgid "GroupSAML|An error occurred generating your SCIM token. Please try again."
-msgstr ""
+msgstr "S-a produs o eroare la generarea tokenului dvs. SCIM. Vă rugăm să încercați din nou."
msgid "GroupSAML|An error occurred resetting your SCIM token. Please try again."
-msgstr ""
+msgstr "S-a produs o eroare la resetarea tokenului dvs. SCIM. Vă rugăm să încercați din nou."
msgid "GroupSAML|Are you sure you want to remove the SAML group link?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să înlăturați linkul grupului SAML?"
msgid "GroupSAML|Are you sure you want to reset the SCIM token? SCIM provisioning will stop working until the new token is updated."
-msgstr ""
+msgstr "Sunteți sigur că doriți să resetați tokenul SCIM? Provizionarea SCIM va înceta să funcționeze până când noul token este actualizat."
msgid "GroupSAML|Before enforcing SSO, enable SAML authentication."
-msgstr ""
+msgstr "Înainte de a impune SSO, activați autentificarea SAML."
msgid "GroupSAML|Before enforcing SSO-only authentication for Git activity, enable SSO-only authentication for web activity."
-msgstr ""
+msgstr "Înainte de a impune autentificarea exclusiv SSO pentru activitatea Git, activați autentificarea exclusiv SSO pentru activitatea web."
msgid "GroupSAML|Certificate fingerprint"
-msgstr ""
+msgstr "Amprenta digitală a certificatului"
msgid "GroupSAML|Configuration"
-msgstr ""
+msgstr "Configurare"
msgid "GroupSAML|Copy SAML Response XML"
-msgstr ""
+msgstr "Copiați XML-ul de răspuns SAML"
msgid "GroupSAML|Could not create SAML group link: %{errors}."
-msgstr "Nu s-a putut crea legătura de grup SAML: %{errors}."
+msgstr "Nu s-a putut crea linkul grupului SAML: %{errors}."
msgid "GroupSAML|Default membership role"
-msgstr ""
+msgstr "Rolul implicit al unui membru"
msgid "GroupSAML|Enable SAML authentication for this group"
-msgstr ""
+msgstr "Activați autentificarea SAML pentru acest grup"
msgid "GroupSAML|Enforce SSO-only authentication for Git and Dependency Proxy activity for this group"
-msgstr ""
+msgstr "Impuneți autentificarea exclusiv SSO pentru activitatea „Git†și „Proxy de dependență†pentru acest grup"
msgid "GroupSAML|Enforce SSO-only authentication for web activity for this group"
-msgstr ""
+msgstr "Impuneți autentificarea exclusiv SSO pentru activitatea web pentru acest grup"
msgid "GroupSAML|Enforce users to have dedicated group-managed accounts for this group"
-msgstr ""
+msgstr "Impuneți utilizatorilor să aibă conturi dedicate gestionate de grup pentru acest grup"
msgid "GroupSAML|Generate a SCIM token"
-msgstr ""
+msgstr "Generați un token SCIM"
msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Identity Management."
-msgstr ""
+msgstr "Generați un token SCIM pentru a vă configura sistemul de gestionare a identității între domenii."
msgid "GroupSAML|Identity"
-msgstr ""
+msgstr "Identitate"
msgid "GroupSAML|Identity provider single sign-on URL"
-msgstr ""
+msgstr "URL-ul de autentificare unică (SSO) al furnizorului de identitate"
msgid "GroupSAML|Make sure you save this token — you won't be able to access it again."
-msgstr ""
+msgstr "Asigurați-vă că salvați acest token — nu îl veți mai putea accesa din nou."
msgid "GroupSAML|Manage your group’s membership while adding another level of security with SAML."
-msgstr ""
+msgstr "Gestionați apartenența la grupul dvs., adăugând în același timp un alt nivel de securitate cu SAML."
msgid "GroupSAML|Members"
-msgstr ""
+msgstr "Membri"
msgid "GroupSAML|Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
-msgstr ""
+msgstr "Membrii vor fi redirecÈ›ionaÈ›i aici atunci când se conectează la grupul dumneavoastră. ObÈ›ineÈ›i acest lucru de la furnizorul dvs. de identitate, unde poate fi numit È™i „SSO Service Locationâ€, „SAML Token Issuance Endpoint†sau „SAML 2.0/W-Federation URLâ€."
msgid "GroupSAML|NameID"
-msgstr ""
+msgstr "NameID"
msgid "GroupSAML|NameID Format"
-msgstr ""
+msgstr "Format NameID"
msgid "GroupSAML|New SAML group link saved."
-msgstr ""
+msgstr "Noul link de grup SAML a fost salvat."
msgid "GroupSAML|No active SAML group links"
-msgstr ""
+msgstr "Nu există linkuri de grup SAML active"
msgid "GroupSAML|Prohibit outer forks for this group"
-msgstr ""
+msgstr "Interziceți forkurile externe pentru acest grup"
msgid "GroupSAML|Reset SCIM token"
-msgstr ""
+msgstr "Resetați tokenul SCIM"
msgid "GroupSAML|Role to assign members of this SAML group."
-msgstr ""
+msgstr "Rolul care se atribuie membrilor acestui grup SAML."
msgid "GroupSAML|SAML Group Links"
-msgstr ""
+msgstr "Legăturile grupului SAML"
msgid "GroupSAML|SAML Group Name"
-msgstr ""
+msgstr "Numele grupului SAML"
msgid "GroupSAML|SAML Group Name: %{saml_group_name}"
-msgstr ""
+msgstr "Numele grupului SAML: %{saml_group_name}"
msgid "GroupSAML|SAML Response Output"
-msgstr ""
+msgstr "Ieșirea răspunsului SAML"
msgid "GroupSAML|SAML Response XML"
-msgstr ""
+msgstr "XML-ul răspunsului SAML"
msgid "GroupSAML|SAML Single Sign On"
-msgstr ""
+msgstr "Autentificare unică (SSO) SAML"
msgid "GroupSAML|SAML Single Sign On Settings"
-msgstr ""
+msgstr "Setări pentru autentificarea unică (SSO) SAML"
msgid "GroupSAML|SAML group link was successfully removed."
-msgstr ""
+msgstr "Linkul grupului SAML a fost înlăturat cu succes."
msgid "GroupSAML|SCIM Token"
-msgstr ""
+msgstr "Token SCIM"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
-msgstr ""
+msgstr "Amprenta digitală SHA1 a certificatului de semnare a tokenului SAML. ObÈ›ineÈ›i acest lucru de la furnizorul de identitate, unde poate fi numit È™i „Thumbprintâ€."
msgid "GroupSAML|The SCIM token is now hidden. To see the value of the token again, you need to %{linkStart}reset it%{linkEnd}."
-msgstr ""
+msgstr "Tokenul SCIM este acum ascuns. Pentru a vedea din nou valoarea tokenului, trebuie să %{linkStart}îl resetați%{linkEnd}."
msgid "GroupSAML|The case-sensitive group name that will be sent by the SAML identity provider."
-msgstr ""
+msgstr "Numele grupului sensibil la majuscule și minuscule care va fi trimis de furnizorul de identitate SAML."
msgid "GroupSAML|This will be set as the access level of users added to the group."
-msgstr ""
+msgstr "Acesta va fi setat ca nivelul de acces al utilizatorilor adăugați la grup."
msgid "GroupSAML|To be able to enable group-managed accounts, you first need to enable enforced SSO."
-msgstr ""
+msgstr "Pentru a putea activa conturile gestionate de grup, trebuie mai întâi să activați forțarea autentificării SSO."
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
-msgstr ""
+msgstr "Pentru a putea interzice forkurile externe, trebuie mai întâi să impuneți conturi gestionate de grupuri dedicate."
msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
-msgstr ""
+msgstr "Utilizați linkurile grupului SAML pentru a gestiona apartenența la un grup utilizând SAML."
msgid "GroupSAML|Valid SAML Response"
-msgstr ""
+msgstr "Răspuns SAML valid"
msgid "GroupSAML|With prohibit outer forks flag enabled group members will be able to fork project only inside your group."
-msgstr ""
+msgstr "Odată ce indicatorul de interzicere a forkurilor exterioare este activat, membrii grupului vor putea să creeze forkuri pentru proiecte numai în interiorul grupului dumneavoastră."
msgid "GroupSAML|as %{access_level}"
-msgstr ""
+msgstr "ca %{access_level}"
msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
-msgstr ""
+msgstr "trebuie să corespundă cu NameID stocat din „%{extern_uid}†pentru a identifica utilizatorul și a permite conectarea"
msgid "GroupSAML|recommend persistent ID instead of email"
-msgstr ""
+msgstr "se recomandă un ID persistent în loc de e-mail"
msgid "GroupSaml|Copy SCIM API endpoint URL"
-msgstr ""
+msgstr "Copiați URL-ul punctului final al API-ului SCIM"
msgid "GroupSaml|Copy SCIM token"
-msgstr ""
+msgstr "Copiați tokenul SCIM"
msgid "GroupSaml|SCIM API endpoint URL"
-msgstr ""
+msgstr "URL-ul punctului final al API-ului SCIM"
msgid "GroupSaml|Your SCIM token"
-msgstr ""
+msgstr "Tokenul dvs. SCIM"
msgid "GroupSelect|No matching results"
msgstr ""
@@ -17663,178 +18056,178 @@ msgid "GroupSelect|Select a group"
msgstr ""
msgid "GroupSettings|Allow project and group access token creation"
-msgstr ""
+msgstr "Permiteți crearea de tokenuri de acces pentru proiect și grup"
msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
+msgstr "Permiteți crearea de organizații și contacte și asocierea acestora cu probleme."
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
-msgstr ""
+msgstr "Se aplică tuturor subgrupurilor, cu excepția cazului în care este înlocuită de proprietarul grupului. Grupurile deja adăugate la proiect își pierd accesul."
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
-msgstr "Pipeline-ul Auto DevOps a fost actualizată pentru grup"
+msgstr "Pipeline-ul Auto DevOps a fost actualizat pentru grup"
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 ""
+msgstr "Este disponibil numai pentru grupul de nivel superior. Se aplică la toate subgrupurile. Grupurile deja partajate cu un grup din afara %{group} sunt în continuare partajate, doar dacă nu sunt eliminate manual."
msgid "GroupSettings|Badges"
msgstr "Insigne"
msgid "GroupSettings|Be careful. Changing a group's parent can have unintended side effects. %{learn_more_link_start}Learn more.%{learn_more_link_end}"
-msgstr ""
+msgstr "Aveți grijă. Schimbarea părintelui unui grup poate avea efecte secundare neintenționate. %{learn_more_link_start}Aflați mai multe.%{learn_more_link_end}"
msgid "GroupSettings|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
-msgstr ""
+msgstr "Nu se poate actualiza calea de acces deoarece există proiecte din acest grup care conțin imagini Docker în registrul de containere. Vă rugăm să eliminați mai întâi imaginile din proiectele dvs. și să încercați din nou."
msgid "GroupSettings|Change group URL"
-msgstr ""
+msgstr "Schimbați URL-ul grupului"
msgid "GroupSettings|Changing a group's URL can have unintended side effects."
-msgstr ""
+msgstr "Schimbarea URL-ului unui grup poate avea efecte secundare neintenționate."
msgid "GroupSettings|Choose a group path that does not start with a dash or end with a period. It can also contain alphanumeric characters and underscores."
-msgstr ""
+msgstr "Alegeți o cale de grup care nu începe cu o liniuță și nu se termină cu un punct. De asemenea, poate conține caractere alfanumerice și caractere de subliniere."
msgid "GroupSettings|Compliance frameworks"
-msgstr ""
+msgstr "Framework-uri de conformitate"
msgid "GroupSettings|Configure compliance frameworks to make them available to projects in this group. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Configurați framework-urile de conformitate pentru a le face disponibile proiectelor din acest grup. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "GroupSettings|Custom project templates"
-msgstr ""
+msgstr "Șabloane de proiect personalizate"
msgid "GroupSettings|Customize this group's badges."
-msgstr ""
+msgstr "Personalizați insignele acestui grup."
msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within this group"
-msgstr "Implicit la conducta Auto DevOps pentru toate proiectele din acest grup"
+msgstr "Setări implicite pentru pipeline-ul Auto DevOps la toate proiectele din acest grup"
msgid "GroupSettings|Disable email notifications"
msgstr "Dezactivați notificările prin e-mail"
msgid "GroupSettings|Disable group mentions"
-msgstr ""
+msgstr "Dezactivați mențiunile de grup"
msgid "GroupSettings|Enable customer relations"
-msgstr ""
+msgstr "Activați relațiile cu clienții"
msgid "GroupSettings|Enable delayed project deletion"
-msgstr "Activați eliminarea întârziată a proiectului"
+msgstr "Activați ștergerea întârziată a proiectului"
msgid "GroupSettings|Export group"
-msgstr ""
+msgstr "Exportați grupul"
msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
-msgstr "Dacă nespecificată la nivel de grup sau instanță, valoarea implicită este %{default_initial_branch_name}. Nu afectează repozitorii existente."
+msgstr "Dacă nu este specificată la nivel de grup sau de instanță, valoarea implicită este %{default_initial_branch_name}. Nu afectează repozitoriile existente."
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
-msgstr ""
+msgstr "Dacă vizibilitatea grupului părinte este mai mică decât vizibilitatea curentă a grupului, nivelele de vizibilitate pentru subgrupuri și proiecte vor fi modificate pentru a corespunde vizibilității noului grup părinte."
msgid "GroupSettings|New runners registration token has been generated!"
-msgstr ""
+msgstr "A fost generat un nou token de înregistrare a executorilor!"
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
+msgstr "Ignoră preferințele de notificare ale utilizatorilor pentru toți membrii grupului, subgrupurilor și proiectelor."
msgid "GroupSettings|Pipeline settings was updated for the group"
-msgstr ""
+msgstr "Setările pipeline-ului au fost actualizate pentru grup"
msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
-msgstr "Vă rugăm alegeți un URL grup fără litere speciale sau spații."
+msgstr "Vă rugăm să alegeți un URL de grup fără caractere speciale sau spații."
msgid "GroupSettings|Prevent forking outside of the group"
-msgstr ""
+msgstr "Împiedicați forkingul în afara grupului"
msgid "GroupSettings|Prevent forking setting was not saved"
-msgstr ""
+msgstr "Setarea prevenirii forkingului nu a fost salvată"
msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
-msgstr ""
+msgstr "Împiedicați membrii să trimită invitații către grupuri din afara %{group} și a subgrupurilor sale"
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
-msgstr ""
+msgstr "Împiedicați partajarea unui proiect din %{group} cu alte grupuri"
msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
-msgstr ""
+msgstr "Împiedică membrii grupului să fie notificați dacă grupul este menționat."
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
-msgstr ""
+msgstr "Proiectele vor fi șterse definitiv după o perioadă de așteptare de %{waiting_period} (de) zi(le). Moștenit de subgrupuri."
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 ""
+msgstr "Proiectele vor fi șterse definitiv după o perioadă de așteptare de %{waiting_period} (de) zi(le). Această întârziere poate fi %{link_start}personalizată de un administrator%{link_end} în setările instanței. Moștenit de subgrupuri."
msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
-msgstr ""
+msgstr "Selectați un proiect cu fișierul %{code_start}.gitlab/insights.yml%{code_end}."
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
-msgstr "Selectați un subgrup de utilizat ca sursă pentru șabloane de proiect personalizate pentru acest grup."
+msgstr "Selectați un subgrup care să fie utilizat ca sursă pentru șabloanele de proiect personalizate pentru acest grup."
msgid "GroupSettings|Select parent group"
-msgstr ""
+msgstr "Selectați grupul părinte"
msgid "GroupSettings|Select the project that contains your custom Insights file."
-msgstr ""
+msgstr "Selectați proiectul care conține fișierul Insights personalizat."
+
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
+msgstr "Setați numele și protecțiile inițiale pentru ramura implicită a noilor repozitorii create în grup."
msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
-msgstr "Setați mărimea maximă a Pagini GitLab pentru acest grup. %{link_start}Aflați mai multe.%{link_end}"
+msgstr "Setați dimensiunea maximă a GitLab Pages pentru acest grup. %{link_start}Aflați mai multe.%{link_end}"
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
-msgstr ""
-
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
-msgstr "Numele implicit pentru ramura inițială ale noi repozitorii create în acest grup."
+msgstr "Pipeline-ul Auto DevOps se execută dacă nu se găsește niciun fișier de configurare CI alternativ."
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
msgstr "Proiectele din acest subgrup pot fi selectate ca șabloane pentru proiecte noi create în grup. %{link_start}Aflați mai multe.%{link_end}"
msgid "GroupSettings|There was a problem updating Auto DevOps pipeline: %{error_messages}."
-msgstr "A apărut o problemă la actualizarea conductei Auto DevOps: %{error_messages}."
+msgstr "A apărut o problemă la actualizarea pipeline-ului Auto DevOps: %{error_messages}."
msgid "GroupSettings|There was a problem updating the pipeline settings: %{error_messages}."
-msgstr "A apărut o problemă la actualizarea setărilor conductei: %{error_messages}"
+msgstr "A apărut o problemă la actualizarea setărilor pipeline-ului: %{error_messages}."
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
-msgstr ""
+msgstr "Această setare se aplică pe %{ancestor_group} și a fost suprascrisă pe acest subgrup."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Această setare se aplicată pe %{ancestor_group}. Pentru a partaja proiectele din acest grup cu un alt grup, solicitați proprietarului să anuleze această setare sau %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "Această setare este aplicată pe %{ancestor_group}. Puteți să anula setarea sau %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|Transfer group"
-msgstr ""
+msgstr "Transferați grupul"
msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
-msgstr ""
+msgstr "Utilizatorii pot crea %{link_start_project}tokenuri de acces la proiect%{link_end} și %{link_start_group}tokenuri de acces la grup%{link_end} în acest grup."
msgid "GroupSettings|What are badges?"
-msgstr ""
+msgstr "Ce sunt insignele?"
msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals."
-msgstr ""
+msgstr "Atunci când numărul de utilizatori activi depășește acest număr, utilizatorii suplimentari trebuie să fie %{user_cap_docs_link_start}aprobați de un proprietar%{user_cap_docs_link_end}. Lăsați gol dacă nu doriți să impuneți aprobări."
msgid "GroupSettings|When the number of active users exceeds this number, additional users must be %{user_cap_docs_link_start}approved by an owner%{user_cap_docs_link_end}. Leave empty if you don't want to enforce approvals. Increasing the user cap will not automatically approve pending users."
-msgstr ""
+msgstr "Atunci când numărul de utilizatori activi depășește acest număr, utilizatorii suplimentari trebuie să fie %{user_cap_docs_link_start}aprobați de un proprietar%{user_cap_docs_link_end}. Lăsați gol dacă nu doriți să impuneți aprobări. Prin creșterea plafonului de utilizatori nu se aprobă automat utilizatorii în așteptare."
msgid "GroupSettings|You can only transfer the group to a group you manage."
-msgstr ""
+msgstr "Puteți transfera grupul doar într-un grup pe care îl gestionați."
msgid "GroupSettings|You will need to update your local repositories to point to the new location."
-msgstr ""
+msgstr "Va trebui să vă actualizați repozitoriile locale pentru a indica noua locație."
msgid "GroupSettings|cannot be changed by you"
-msgstr ""
+msgstr "nu poate fi modificat de dumneavoastră"
msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
-msgstr ""
+msgstr "nu poate fi dezactivat când este activat grupul părinte „Partajare cu blocare de grupâ€, cu excepÈ›ia proprietarului grupului părinte"
msgid "GroupSettings|cannot change when group contains projects with NPM packages"
-msgstr ""
+msgstr "nu se poate modifica atunci când grupul conține proiecte cu pachete NPM"
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
-msgstr ""
+msgstr "înlăturați blocarea grupului partajat din %{ancestor_group_name}"
msgid "Groups"
msgstr "Grupuri"
@@ -17888,73 +18281,73 @@ msgid "GroupsEmptyState|You can manage your group member’s permissions and acc
msgstr ""
msgid "GroupsNew|%{linkStart}Groups%{linkEnd} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
-msgstr ""
+msgstr "%{linkStart}Grupurile%{linkEnd} vă permit să gestionați și să colaborați în cadrul mai multor proiecte. Membrii unui grup au acces la toate proiectele sale."
msgid "GroupsNew|Assemble related projects together and grant members access to several projects at once."
-msgstr ""
+msgstr "Asamblați proiecte conexe și acordați membrilor acces la mai multe proiecte în același timp."
msgid "GroupsNew|Connect instance"
-msgstr ""
+msgstr "Conectați instanța"
msgid "GroupsNew|Contact an administrator to enable options for importing your group."
-msgstr ""
+msgstr "Contactați un administrator pentru a activa opțiunile pentru importul grupului dvs."
msgid "GroupsNew|Create group"
-msgstr ""
+msgstr "Creați un grup"
msgid "GroupsNew|Create new group"
-msgstr ""
+msgstr "Creați un grup nou"
+
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr "Creați aceasta în %{pat_link_start}setările de utilizator%{pat_link_end} ale instanței GitLab sursă. Din %{short_living_link_start}motive de securitate%{short_living_link_end}, utilizați o dată de expirare scurtă atunci când creați tokenul."
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
-msgstr ""
+msgstr "Exportați grupurile cu toate datele aferente și mutați-le într-o nouă instanță GitLab."
msgid "GroupsNew|GitLab source URL"
-msgstr ""
+msgstr "URL-ul sursei GitLab"
msgid "GroupsNew|Groups can also be nested by creating %{linkStart}subgroups%{linkEnd}."
-msgstr ""
+msgstr "Grupurile pot fi, de asemenea, imbricate prin crearea de %{linkStart}subgrupuri%{linkEnd}."
msgid "GroupsNew|Import group"
-msgstr ""
+msgstr "Importați grupul"
msgid "GroupsNew|Import groups from another instance of GitLab"
-msgstr ""
+msgstr "Importați grupuri dintr-o altă instanță GitLab"
msgid "GroupsNew|My Awesome Group"
-msgstr ""
-
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
+msgstr "Grupul meu minunat"
msgid "GroupsNew|No import options available"
-msgstr ""
+msgstr "Nu sunt disponibile opțiuni de import"
msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
-msgstr ""
+msgstr "Nu toate obiectele asociate sunt migrate. %{docs_link_start}Mai multe informații%{docs_link_end}."
msgid "GroupsNew|Personal access token"
-msgstr ""
+msgstr "Token de acces personal"
msgid "GroupsNew|Please fill in GitLab source URL."
-msgstr ""
+msgstr "Vă rugăm să completați URL-ul sursei GitLab."
msgid "GroupsNew|Please fill in your personal access token."
-msgstr ""
+msgstr "Vă rugăm să completați tokenul de acces personal."
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
-msgstr ""
+msgstr "Furnizați acreditări pentru o altă instanță a GitLab pentru a vă importa grupurile direct."
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
-msgstr ""
+msgstr "Această caracteristică este depășită și este înlocuită de %{docs_link_start}migrarea grupurilor%{docs_link_end}."
msgid "GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here."
-msgstr ""
+msgstr "Pentru a importa un grup, navigați la setările de grup pentru instanța sursă GitLab, %{link_start}generați un fișier de export%{link_end} și încărcați-l aici."
msgid "GroupsNew|Upload file"
-msgstr ""
+msgstr "Încărcați fișierul"
msgid "GroupsNew|e.g. h8d3f016698e..."
-msgstr ""
+msgstr "de exemplu, h8d3f01016698e..."
msgid "GroupsTree|Are you sure you want to leave the \"%{fullName}\" group?"
msgstr ""
@@ -18046,6 +18439,111 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr "Registrul Harbor"
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr "După ce integrarea Harbor este activată, variabilele globale \"$HARBOR_USERNAME\", \"$HARBOR_PASSWORD\", \"$HARBOR_URL\" și \"$HARBOR_PROJECT\" vor fi create pentru utilizarea CI/CD."
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr "URL-ul de bază al instanței Harbor."
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr "Introduceți parola Harbor"
+
+msgid "HarborIntegration|Harbor URL"
+msgstr "URL Harbor"
+
+msgid "HarborIntegration|Harbor password"
+msgstr "Parola Harbor"
+
+msgid "HarborIntegration|Harbor project name"
+msgstr "Numele proiectului Harbor"
+
+msgid "HarborIntegration|Harbor username"
+msgstr "Numele de utilizator Harbor"
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr "Parola pentru numele dvs. de utilizator Harbor."
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr "Numele proiectului în Harbor."
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr "Utilizați Harbor ca registru de containere al acestui proiect."
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18152,7 +18650,7 @@ msgid "Help"
msgstr ""
msgid "Helps prevent bots from brute-force attacks."
-msgstr ""
+msgstr "Ajută la împiedicarea atacurilor prin forță brută de către boți."
msgid "Helps prevent bots from creating accounts."
msgstr ""
@@ -18164,7 +18662,7 @@ msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
-msgstr ""
+msgstr "Ajută la reducerea volumului de solicitări (de exemplu, de la crawlerele sau roboții abuzivi)"
msgid "Helps reduce request volume for protected paths."
msgstr ""
@@ -18212,13 +18710,16 @@ msgid "Hide marketing-related entries from the Help page"
msgstr "Ascundeți intrările legate de marketing din pagina de Ajutor"
msgid "Hide payload"
-msgstr ""
+msgstr "Ascundere payload"
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr "Ascundeți subiectul"
+
msgid "Hide tooltips or popovers"
-msgstr ""
+msgstr "Ascundeți sfaturile ecran sau sugestiile popover"
msgid "Hide value"
msgid_plural "Hide values"
@@ -18290,7 +18791,7 @@ msgid "Homepage"
msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
-msgstr "Execuția hook-ului a eșuat. Asigurați-vă că grupul are un proiect cu commit-uri."
+msgstr "Executarea hook-ului a eșuat. Asigurați-vă ca grupul să aibă un proiect cu commit-uri."
msgid "Hook was successfully created."
msgstr ""
@@ -18367,9 +18868,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr "Vreau să explorez GitLab pentru a vedea dacă merită să fac schimbarea"
@@ -18377,7 +18875,7 @@ msgid "I want to learn the basics of Git"
msgstr "Vreau să învăț elementele de bază ale Git"
msgid "I want to move my repository to GitLab from somewhere else"
-msgstr "Vreau să mut depozitul meu în GitLab din altă parte"
+msgstr "Vreau să-mi mut depozitul în GitLab de undeva din altă parte"
msgid "I want to store my code"
msgstr "Doresc să-mi stochez codul"
@@ -18445,9 +18943,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18506,7 +19001,7 @@ msgid "If disabled, a diverged local branch will not be automatically updated wi
msgstr ""
msgid "If disabled, only administrators can configure repository mirroring."
-msgstr "Dacă dezactivat, numai administratorii pot configura replicarea repozitoriului."
+msgstr "Dacă este dezactivat, numai administratorii pot configura replicarea repozitoriului."
msgid "If enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
msgstr ""
@@ -18577,8 +19072,14 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
-msgstr "Dacă ați achiziționat sau ați reînnoit abonamentul și aveți un cod de activare, vă rugăm să îl introduceți mai jos pentru a începe procesul de activare."
+msgstr "Dacă ați achiziționat sau ați reînnoit abonamentul și aveți un cod de activare, vă rugăm să-l introduceți mai jos pentru a începe procesul de activare."
msgid "If your HTTP repository is not publicly accessible, add your credentials."
msgstr ""
@@ -18605,10 +19106,10 @@ msgid "ImageDiffViewer|Swipe"
msgstr ""
msgid "ImageViewerDimensions|H"
-msgstr ""
+msgstr "H"
msgid "ImageViewerDimensions|W"
-msgstr ""
+msgstr "W"
msgid "Images with incorrect dimensions are not resized automatically, and may result in unexpected behavior."
msgstr ""
@@ -18649,7 +19150,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18679,14 +19180,8 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
-msgstr ""
+msgstr "Importați mai multe repozitorii prin încărcarea unui fișier manifest."
msgid "Import project"
msgstr ""
@@ -18694,9 +19189,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18776,10 +19268,10 @@ msgid "ImportProjects|Importing the project failed: %{reason}"
msgstr ""
msgid "ImportProjects|Requesting namespaces failed"
-msgstr ""
+msgstr "Solicitarea spațiilor de nume a eșuat"
msgid "ImportProjects|Requesting your %{provider} repositories failed"
-msgstr ""
+msgstr "Solicitarea repozitoriilor dvs. %{provider} a eșuat"
msgid "ImportProjects|Select the repositories you want to import"
msgstr ""
@@ -18830,22 +19322,22 @@ msgid "InProductMarketing|%{organization_name} logo"
msgstr ""
msgid "InProductMarketing|%{strong_start}Advanced application security%{strong_end} — including SAST, DAST scanning, FUZZ testing, dependency scanning, license compliance, secrete detection"
-msgstr ""
+msgstr "%{strong_start}Securitatea avansată a aplicațiilor%{strong_end} — inclusiv scanarea SAST, DAST, testarea FUZZ, scanarea dependențelor, conformitatea licențelor, detectarea secretelor"
msgid "InProductMarketing|%{strong_start}Company wide portfolio management%{strong_end} — including multi-level epics, scoped labels"
msgstr ""
msgid "InProductMarketing|%{strong_start}Executive level insights%{strong_end} — including reporting on productivity, tasks by type, days to completion, value stream"
-msgstr ""
+msgstr "%{strong_start}Perspective la nivel executiv%{strong_end} — inclusiv rapoarte de productivitate, tipuri de sarcini, zile până la finalizare, fluxuri de valoare"
msgid "InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
msgstr ""
msgid "InProductMarketing|%{strong_start}Multiple approval roles%{strong_end} — including code owners and required merge approvals"
-msgstr ""
+msgstr "%{strong_start}Roluri multiple de aprobare%{strong_end} — inclusiv proprietarii de coduri și aprobările de îmbinare necesare"
msgid "InProductMarketing|%{strong_start}Overall, how difficult or easy was it to get started with GitLab?%{strong_end}"
-msgstr "%{strong_start}În general, cât de dificil sau ușor a fost să începi cu GitLab?%{strong_end}"
+msgstr "%{strong_start}În general, cât de dificil sau ușor a fost să începeți cu GitLab?%{strong_end}"
msgid "InProductMarketing|*GitLab*, noun: a synonym for efficient teams"
msgstr ""
@@ -18881,7 +19373,7 @@ msgid "InProductMarketing|Automated security scans directly within GitLab"
msgstr ""
msgid "InProductMarketing|Be a DevOps hero"
-msgstr "Devino un erou DevOps"
+msgstr "Deveniți un erou DevOps"
msgid "InProductMarketing|Beef up your security"
msgstr ""
@@ -18902,7 +19394,7 @@ msgid "InProductMarketing|By enabling code owners and required merge approvals t
msgstr ""
msgid "InProductMarketing|Click on the number below that corresponds with your answer — 1 being very difficult, 5 being very easy."
-msgstr "Faceți clic pe numărul de mai jos care corespunde răspunsului dvs. - 1 fiind foarte dificil, 5 fiind foarte ușor."
+msgstr "Faceți clic pe numărul de mai jos care corespunde răspunsului dvs. — 1 fiind foarte dificil, 5 fiind foarte ușor."
msgid "InProductMarketing|Code owners"
msgstr ""
@@ -18938,10 +19430,10 @@ msgid "InProductMarketing|Define who owns specific files or directories, so the
msgstr ""
msgid "InProductMarketing|Deliver Better Products Faster"
-msgstr "Livrați Produse mai Bune, mai Repede"
+msgstr "Livrați produse mai bune, mai repede"
msgid "InProductMarketing|Dependency scanning"
-msgstr ""
+msgstr "Scanarea dependențelor"
msgid "InProductMarketing|Did you know teams that use GitLab are far more efficient?"
msgstr ""
@@ -18989,7 +19481,7 @@ msgid "InProductMarketing|Facebook"
msgstr ""
msgid "InProductMarketing|Feedback from users like you really improves our product. Thanks for your help!"
-msgstr "Feedback-ul utilizatorilor ca dvs. îmbunătățește cu adevărat produsul nostru. Mulțumim pentru ajutor!"
+msgstr "Feedbackul de la utilizatori ca dvs. îmbunătățește cu adevărat produsul nostru. Vă mulțumim pentru ajutor!"
msgid "InProductMarketing|Feel the need for speed?"
msgstr ""
@@ -19001,13 +19493,13 @@ msgid "InProductMarketing|Find out how your teams are really doing"
msgstr ""
msgid "InProductMarketing|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
-msgstr ""
+msgstr "Aflați dacă bibliotecile dvs. externe sunt sigure. Rulați joburi de scanare a dependențelor care verifică vulnerabilitățile cunoscute în bibliotecile dvs. externe."
msgid "InProductMarketing|Follow our steps"
msgstr ""
msgid "InProductMarketing|Free 30-day trial"
-msgstr "Perioadă de încercare de 30 de zile gratuită"
+msgstr "Încercare gratuită de 30 de zile"
msgid "InProductMarketing|Get going with CI/CD quickly using our %{quick_start_link}. Start with an available runner and then create a CI .yml file – it's really that easy."
msgstr ""
@@ -19036,14 +19528,11 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
msgid "InProductMarketing|GitLab provides static application security testing (SAST), dynamic application security testing (DAST), container scanning, and dependency scanning to help you deliver secure applications along with license compliance."
-msgstr ""
+msgstr "GitLab oferă testarea statică a securității aplicațiilor (SAST), testarea dinamică a securității aplicațiilor (DAST), scanarea containerelor și scanarea dependențelor pentru a vă ajuta să livrați aplicații sigure, împreună cu respectarea licențelor."
msgid "InProductMarketing|GitLab's CI/CD makes software development easier. Don't believe us? Here are three ways you can take it for a fast (and satisfying) test drive:"
msgstr ""
@@ -19070,7 +19559,7 @@ msgid "InProductMarketing|How (and why) mirroring makes sense"
msgstr ""
msgid "InProductMarketing|How long does it take us to close issues/MRs by types like feature requests, bugs, tech debt, security?"
-msgstr ""
+msgstr "Cât timp ne ia să închidem problemele/MR-uri în funcție de tipuri, cum ar fi solicitări de funcții, erori, datorii tehnice, securitate?"
msgid "InProductMarketing|How many days does it take our team to complete various tasks?"
msgstr ""
@@ -19094,7 +19583,7 @@ msgid "InProductMarketing|Improve code quality and streamline reviews"
msgstr ""
msgid "InProductMarketing|Increase Operational Efficiencies"
-msgstr "Sporiți Eficiența Operațională"
+msgstr "Creșteți eficiența operațională"
msgid "InProductMarketing|Invite them to help out."
msgstr ""
@@ -19115,16 +19604,7 @@ msgid "InProductMarketing|Invite your team now"
msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
-msgstr "Invitați-vă echipa astăzi pentru a construi cod mai bun (și procese) împreună"
-
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
+msgstr "Invitați-vă echipa astăzi pentru a construi împreună cod mai bun (și procese)"
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19157,10 +19637,10 @@ msgid "InProductMarketing|Move on to easily creating a Pages website %{ci_templa
msgstr ""
msgid "InProductMarketing|Multiple owners, confusing workstreams? We've got you covered"
-msgstr ""
+msgstr "Proprietari multipli, fluxuri de lucru confuze? Vă oferim o soluție"
msgid "InProductMarketing|Multiple required approvers"
-msgstr ""
+msgstr "Mai mulți aprobatori necesari"
msgid "InProductMarketing|Need an alternative to importing?"
msgstr ""
@@ -19181,10 +19661,10 @@ msgid "InProductMarketing|Rapid development, simplified"
msgstr ""
msgid "InProductMarketing|Reduce Security & Compliance Risk"
-msgstr "Reduceți Riscul de Securitate și Conformitate"
+msgstr "Reduceți riscurile de securitate și conformitate"
msgid "InProductMarketing|Require multiple approvers on a merge request, so you know it's in good shape before it's merged."
-msgstr ""
+msgstr "Solicitați mai multe aprobări pentru un merge request, astfel încât să știți că este în formă bună înainte de a fi îmbinat."
msgid "InProductMarketing|Roadmaps"
msgstr ""
@@ -19241,7 +19721,7 @@ msgid "InProductMarketing|Streamline code review, know at a glance who's unavail
msgstr ""
msgid "InProductMarketing|Take this 1-question survey!"
-msgstr "Faceți acest sondaj cu 1 întrebare!"
+msgstr "Participați la acest sondaj cu 1 întrebare!"
msgid "InProductMarketing|Take your first steps with GitLab"
msgstr ""
@@ -19259,7 +19739,7 @@ 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 "Asta este tot ce este nevoie pentru a începe cu GitLab, dar dacă sunteți nou în lucrul cu Git, consultați %{basics_link} pentru sfaturi și trucuri utile pentru început."
msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series."
msgstr "Acesta este e-mailul %{current_series} din %{total_series} în seria %{track}."
@@ -19307,7 +19787,7 @@ msgid "InProductMarketing|Use GitLab CI/CD"
msgstr ""
msgid "InProductMarketing|Use our AWS cloudformation template to spin up your runners in just a few clicks!"
-msgstr "Utilizați șablonul nostru de cloudformation AWS pentru a vă dezvolta executorii în doar câteva clicuri!"
+msgstr "Utilizați șablonul nostru cloudformation AWS pentru a vă dezvolta executorii în doar câteva clicuri!"
msgid "InProductMarketing|Used by more than 100,000 organizations from around the globe:"
msgstr "Utilizat de peste 100.000 de organizații din întreaga lume:"
@@ -19409,106 +19889,127 @@ msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
-msgstr ""
+msgstr "%{hours} ore, %{minutes} minute rămase"
msgid "IncidentManagement|%{minutes} minutes remaining"
-msgstr ""
+msgstr "%{minutes} minute rămase"
msgid "IncidentManagement|Achieved SLA"
-msgstr ""
+msgstr "SLA atins"
+
+msgid "IncidentManagement|Acknowledged"
+msgstr "Confirmat"
msgid "IncidentManagement|All"
-msgstr ""
+msgstr "Toate"
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list."
-msgstr ""
+msgstr "Toate alertele promovate în incidente sunt afișate automat în listă."
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
-msgstr ""
+msgstr "Toate alertele generate de incidente sunt afișate automat în listă. De asemenea, puteți crea un nou incident utilizând butonul de mai jos."
+
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr "S-a produs o eroare la preluarea statutului incidentului. Vă rugăm să reîncărcați pagina."
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr "S-a produs o eroare la actualizarea stării incidentului. Vă rugăm să reîncărcați pagina și să încercați din nou."
+
+msgid "IncidentManagement|Assign paging status"
+msgstr "Atribuiți starea notificării"
msgid "IncidentManagement|Assignees"
-msgstr ""
+msgstr "Responsabili"
msgid "IncidentManagement|Closed"
-msgstr ""
+msgstr "ÃŽnchis"
msgid "IncidentManagement|Create incident"
-msgstr ""
+msgstr "Creați un incident"
msgid "IncidentManagement|Critical - S1"
-msgstr ""
+msgstr "Critic - S1"
msgid "IncidentManagement|Date created"
-msgstr ""
+msgstr "Data creării"
msgid "IncidentManagement|Display your incidents in a dedicated view"
-msgstr ""
+msgstr "Afișați-vă incidentele într-o vizualizare dedicată"
msgid "IncidentManagement|High - S2"
-msgstr ""
+msgstr "Ridicat - S2"
msgid "IncidentManagement|Incident"
-msgstr ""
+msgstr "Incident"
msgid "IncidentManagement|Incidents"
-msgstr ""
+msgstr "Incidente"
msgid "IncidentManagement|Low - S4"
-msgstr ""
+msgstr "Scăzut - S4"
msgid "IncidentManagement|Medium - S3"
-msgstr ""
+msgstr "Mediu - S3"
msgid "IncidentManagement|Missed SLA"
-msgstr ""
+msgstr "SLA ratat"
msgid "IncidentManagement|No incidents to display."
-msgstr ""
+msgstr "Niciun incident de afișat."
msgid "IncidentManagement|None"
-msgstr ""
+msgstr "Niciunul"
msgid "IncidentManagement|Open"
-msgstr ""
+msgstr "Deschis"
msgid "IncidentManagement|Page your team with escalation policies"
-msgstr ""
+msgstr "Notificați-vă echipa folosind politicile de escaladare"
msgid "IncidentManagement|Paged"
-msgstr ""
+msgstr "Notificat"
msgid "IncidentManagement|Published"
-msgstr ""
+msgstr "Publicat"
msgid "IncidentManagement|Published to status page"
-msgstr ""
+msgstr "Publicat pe pagina de stare"
+
+msgid "IncidentManagement|Resolved"
+msgstr "Rezolvat"
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr "Setarea statutului la Confirmat sau Rezolvat oprește trimiterea de notificări atunci când sunt selectate politicile de escaladare pentru incident."
msgid "IncidentManagement|Severity"
-msgstr ""
+msgstr "Severitate"
msgid "IncidentManagement|Status"
-msgstr ""
+msgstr "Starea"
msgid "IncidentManagement|There are no closed incidents"
-msgstr ""
+msgstr "Nu există incidente închise"
msgid "IncidentManagement|There was an error displaying the incidents."
-msgstr ""
+msgstr "A apărut o eroare la afișarea incidentelor."
msgid "IncidentManagement|Time to SLA"
-msgstr ""
+msgstr "Timp până la SLA"
+
+msgid "IncidentManagement|Triggered"
+msgstr "Declanșat"
msgid "IncidentManagement|Unassigned"
-msgstr ""
+msgstr "Neatribuit"
msgid "IncidentManagement|Unknown"
-msgstr ""
+msgstr "Necunoscut"
msgid "IncidentManagement|Unpublished"
-msgstr ""
+msgstr "Nepublicat"
msgid "IncidentManagement|Use escalation policies to automatically page your team when incidents are created."
-msgstr ""
+msgstr "Utilizați politicile de escaladare pentru a vă contacta automat echipa atunci când sunt create incidente."
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
@@ -19535,7 +20036,7 @@ msgid "IncidentSettings|Time limit"
msgstr ""
msgid "IncidentSettings|Time limit must be a multiple of 15 minutes."
-msgstr ""
+msgstr "Limita de timp trebuie să fie un multiplu de 15 minute."
msgid "IncidentSettings|Time limit must be a valid number."
msgstr ""
@@ -19579,35 +20080,44 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr "Adăugați un nou eveniment cronologic"
+
msgid "Incident|Alert details"
-msgstr ""
+msgstr "Detalii de alertă"
msgid "Incident|Are you sure you wish to delete this image?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să ștergeți această imagine?"
msgid "Incident|Delete image"
-msgstr ""
+msgstr "Ștergeți imaginea"
msgid "Incident|Deleting %{filename}"
-msgstr ""
+msgstr "Se șterge %{filename}"
msgid "Incident|Edit image text or link"
-msgstr ""
+msgstr "Editați textul imaginii sau linkul"
msgid "Incident|Editing %{filename}"
-msgstr ""
+msgstr "Se editează %{filename}"
msgid "Incident|Metrics"
-msgstr ""
+msgstr "Metrici"
+
+msgid "Incident|No timeline items have been added yet."
+msgstr "Încă nu au fost adăugate elemente de cronologie."
msgid "Incident|Summary"
-msgstr ""
+msgstr "Rezumat"
msgid "Incident|There was an issue loading alert data. Please try again."
-msgstr ""
+msgstr "A apărut o problemă la încărcarea datelor de alertă. Vă rugăm să încercați din nou."
msgid "Incident|There was an issue loading incident data. Please try again."
-msgstr ""
+msgstr "A apărut o problemă la încărcarea datelor incidentului. Vă rugăm să încercați din nou."
+
+msgid "Incident|Timeline"
+msgstr "Cronologie"
msgid "Include author name in notification email body"
msgstr ""
@@ -19625,7 +20135,7 @@ msgid "Include the username in the URL if required: %{code_open}https://username
msgstr ""
msgid "Includes LFS objects. It can be overridden per group, or per project. 0 for unlimited."
-msgstr ""
+msgstr "Include obiecte LFS. Se poate suprascrie pentru fiecare grup sau proiect. 0 pentru nelimitat."
msgid "Includes an MVC structure to help you get started"
msgstr ""
@@ -19679,7 +20189,7 @@ msgid "Infrastructure Registry"
msgstr ""
msgid "Infrastructure as Code (IaC) Scanning"
-msgstr ""
+msgstr "Scanarea infrastructurii ca și cod (IaC)"
msgid "InfrastructureRegistry|Copy Terraform Command"
msgstr ""
@@ -19717,6 +20227,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr "Numele inițial implicit al ramurii"
+
+msgid "Initial default branch protection"
+msgstr "Protecția inițială implicită a ramurii"
+
msgid "Inline"
msgstr ""
@@ -19853,7 +20369,7 @@ msgid "Integrations|Add an integration"
msgstr ""
msgid "Integrations|Add namespace"
-msgstr ""
+msgstr "Adăugați spațiu de nume"
msgid "Integrations|All details"
msgstr ""
@@ -19913,13 +20429,16 @@ msgid "Integrations|Enter your alias"
msgstr ""
msgid "Integrations|Failed to link namespace. Please try again."
-msgstr ""
+msgstr "Spațiul de nume n-a putut fi conectat. Vă rugăm să încercați din nou."
msgid "Integrations|Failed to load namespaces. Please try again."
-msgstr ""
+msgstr "Spațiile de nume nu au putut fi încărcate. Vă rugăm să încercați din nou."
+
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr "Nu s-a reușit conectarea la GitLab."
msgid "Integrations|Failed to unlink namespace. Please try again."
-msgstr ""
+msgstr "Spațiul de nume n-a putut fi deconectat. Vă rugăm să încercați din nou."
msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
msgstr ""
@@ -19949,22 +20468,22 @@ msgid "Integrations|Known limitations"
msgstr ""
msgid "Integrations|Link namespaces"
-msgstr ""
+msgstr "Conectați spațiile de nume"
msgid "Integrations|Linked namespaces"
-msgstr ""
+msgstr "Spații de nume conectate"
msgid "Integrations|Namespace successfully linked"
-msgstr ""
+msgstr "Spațiu de nume conectat cu succes"
msgid "Integrations|Namespaces are the GitLab groups and subgroups you link to this Jira instance."
-msgstr ""
+msgstr "Spațiile de nume sunt grupurile și subgrupurile GitLab pe care le asociați acestei instanțe Jira."
msgid "Integrations|No available namespaces."
-msgstr ""
+msgstr "Niciun spațiu de nume disponibil."
msgid "Integrations|No linked namespaces"
-msgstr ""
+msgstr "Niciun spațiu de nume conectat."
msgid "Integrations|Projects using custom settings"
msgstr "Proiecte utilizând setări personalizate"
@@ -20009,7 +20528,7 @@ msgid "Integrations|Sign in to GitLab"
msgstr ""
msgid "Integrations|Sign in to add namespaces"
-msgstr ""
+msgstr "Autentificați-vă pentru a adăuga spații de nume"
msgid "Integrations|Standard"
msgstr ""
@@ -20018,7 +20537,7 @@ msgid "Integrations|There are no projects using custom settings"
msgstr ""
msgid "Integrations|This integration only works with GitLab.com. Adding a namespace only works in browsers that allow cross-site cookies. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
+msgstr "Această integrare funcționează numai cu GitLab.com. Adăugarea unui spațiu de nume funcționează numai în browserele care permit cookie-uri între site-uri. %{linkStart}Aflați mai multe%{linkEnd}."
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
@@ -20032,6 +20551,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr "Puteți închide această fereastră."
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20042,6 +20564,9 @@ msgid "Integrations|You haven't activated any integrations yet."
msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
+msgstr "Trebuie să aveți permisiuni de proprietar sau de întreținător pentru a conecta spații de nume."
+
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
msgstr ""
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
@@ -20050,6 +20575,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20129,7 +20657,7 @@ msgid "Invalid field"
msgstr ""
msgid "Invalid file format with specified file type"
-msgstr ""
+msgstr "Format de fișier nevalid cu tipul de fișier specificat"
msgid "Invalid file."
msgstr ""
@@ -20156,10 +20684,10 @@ msgid "Invalid pod_name"
msgstr ""
msgid "Invalid policy type"
-msgstr "Tip politică invalid"
+msgstr "Tip de politică invalid"
msgid "Invalid repository bundle for snippet with id %{snippet_id}"
-msgstr ""
+msgstr "Pachet de repozitoriu nevalabil pentru fragmentul cu ID-ul %{snippet_id}"
msgid "Invalid repository path"
msgstr ""
@@ -20197,9 +20725,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20215,12 +20740,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr "E-mail invitație a fost preluat deja"
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20314,6 +20833,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20332,6 +20854,12 @@ msgstr "Ceva nu a mers bine"
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20344,6 +20872,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20366,7 +20897,7 @@ msgid "InviteMember|Invite your team"
msgstr ""
msgid "InviteMember|Invited users will be added with developer level permissions. %{linkStart}View the documentation%{linkEnd} to see how to change this later."
-msgstr ""
+msgstr "Utilizatorii invitați vor fi adăugați cu permisiuni la nivel de dezvoltator. %{linkStart}Consultați documentația%{linkEnd} pentru a vedea cum să modificați acest lucru mai târziu."
msgid "InviteReminderEmail|%{inviter} is still waiting for you to join GitLab"
msgstr ""
@@ -20486,10 +21017,10 @@ msgid "Issue Analytics"
msgstr ""
msgid "Issue Boards"
-msgstr ""
+msgstr "Borduri de probleme"
msgid "Issue Type"
-msgstr "Tip Problemă"
+msgstr "Tip de problemă"
msgid "Issue already promoted to epic."
msgstr ""
@@ -20525,7 +21056,7 @@ msgid "Issue published on status page."
msgstr ""
msgid "Issue types"
-msgstr ""
+msgstr "Tipuri de probleme"
msgid "Issue update failed"
msgstr ""
@@ -20536,9 +21067,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20581,8 +21109,8 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr ""
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr "Unele dintre bordurile dvs. sunt ascunse, adăugați o licență pentru a le vedea din nou."
msgid "IssueBoards|Switch board"
msgstr ""
@@ -20666,7 +21194,7 @@ msgid "Issues must match this scope to appear in this list."
msgstr ""
msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
-msgstr ""
+msgstr "Probleme cu comentarii, merge request-uri cu diff-uri și comentarii, etichete, obiective, fragmente de cod și alte entități de proiect"
msgid "Issues with label %{label}"
msgstr ""
@@ -20711,7 +21239,7 @@ msgid "It is not possible to %{action} files that are stored in LFS using the we
msgstr ""
msgid "It looks like you have some draft commits in this branch."
-msgstr ""
+msgstr "Se pare că aveți câteva schițe de commit-uri în această ramură."
msgid "It looks like you're attempting to activate your subscription. Use %{a_start}the Subscription page%{a_end} instead."
msgstr ""
@@ -20723,7 +21251,7 @@ msgid "It must have a header row and at least two columns: the first column is t
msgstr ""
msgid "It seems like the Dependency Scanning job ran successfully, but no dependencies have been detected in your project."
-msgstr ""
+msgstr "Se pare că jobul de Scanare a dependențelor a rulat cu succes, dar nu au fost detectate dependențe în proiectul dvs."
msgid "It seems that there is currently no available data for code coverage"
msgstr ""
@@ -20752,10 +21280,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20770,12 +21301,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20785,6 +21310,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20806,7 +21334,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr "Cadențe iterații"
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20824,6 +21358,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20833,10 +21370,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20848,6 +21391,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20860,6 +21406,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20930,19 +21479,19 @@ msgid "Jira-GitLab user mapping template"
msgstr ""
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
-msgstr "Creați ramură pentru problemă Jira %{jiraIssue}"
+msgstr "Creați ramură pentru problema Jira %{jiraIssue}"
msgid "JiraConnect|Failed to create branch."
msgstr "Crearea ramurii a eșuat."
msgid "JiraConnect|Failed to create branch. Please try again."
-msgstr "Crearea ramurii a eșuat. Vă rugăm încercați din nou."
+msgstr "Crearea ramurii a eșuat. Vă rugăm să încercați din nou."
msgid "JiraConnect|New branch was successfully created."
-msgstr "Ramura nouă a fost creată cu succes."
+msgstr "Noua ramură a fost creată cu succes."
msgid "JiraConnect|You can now close this window and return to Jira."
-msgstr "Puteți închide această fereastră acum și să vă întoarceți la Jira."
+msgstr "Puteți închide acum această fereastră și vă puteți întoarce la Jira."
msgid "JiraConnect|You don't have permission to create branches for this project. Select a different project or contact the project owner for access. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -20963,7 +21512,7 @@ msgid "JiraRequest|An error occurred while requesting data from Jira: %{messages
msgstr ""
msgid "JiraRequest|The Jira API URL for connecting to Jira is not valid. Check your Jira integration API URL and try again."
-msgstr "URL-ul API Jira pentru conectarea la Jira nu este valid. Verificați-vă URL-ul API Integrație Jira și încercați din nou."
+msgstr "URL-ul API-ului Jira pentru conectarea la Jira nu este valid. Verificați-vă URL-ul API de integrare Jira și încercați din nou."
msgid "JiraRequest|The credentials for accessing Jira are not allowed to access the data. Check your %{docs_link_start}Jira integration credentials%{docs_link_end} and try again."
msgstr ""
@@ -20975,10 +21524,10 @@ msgid "JiraService| on branch %{branch_link}"
msgstr ""
msgid "JiraService|%{jiraDocsLinkStart}Enable the Jira integration%{jiraDocsLinkEnd} to view your Jira issues in GitLab."
-msgstr ""
+msgstr "%{jiraDocsLinkStart}Activați integrarea Jira%{jiraDocsLinkEnd} pentru a vizualiza problemele dvs. Jira în GitLab."
msgid "JiraService|%{jira_docs_link_start}Enable the Jira integration%{jira_docs_link_end} to view your Jira issues in GitLab."
-msgstr ""
+msgstr "%{jira_docs_link_start}Activați integrarea Jira%{jira_docs_link_end} pentru a vizualiza problemele dvs. Jira în GitLab."
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgstr ""
@@ -20993,7 +21542,7 @@ msgid "JiraService|Base URL of the Jira instance."
msgstr ""
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
-msgstr ""
+msgstr "Definiți tipul de problemă Jira care urmează să fie creată dintr-o vulnerabilitate."
msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
msgstr ""
@@ -21014,10 +21563,10 @@ msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
-msgstr ""
+msgstr "Nu s-a reușit încărcarea problemei Jira. Vizualizați problema în Jira sau reîncărcați pagina."
msgid "JiraService|Fetch issue types for this Jira project"
-msgstr ""
+msgstr "Obțineți tipurile de probleme pentru acest proiect Jira"
msgid "JiraService|For example, 12, 24"
msgstr ""
@@ -21038,7 +21587,7 @@ msgid "JiraService|Issues created from vulnerabilities in this project will be J
msgstr ""
msgid "JiraService|Jira API URL"
-msgstr ""
+msgstr "URL-ul API-ului Jira"
msgid "JiraService|Jira comments are created when an issue is referenced in a commit."
msgstr ""
@@ -21047,7 +21596,7 @@ msgid "JiraService|Jira comments are created when an issue is referenced in a me
msgstr "Comentariile Jira sunt create atunci când se face referire la o problemă într-un merge request."
msgid "JiraService|Jira issue type"
-msgstr ""
+msgstr "Tipul problemei Jira"
msgid "JiraService|Jira issues"
msgstr ""
@@ -21071,10 +21620,10 @@ msgid "JiraService|Project key changed, refresh list"
msgstr ""
msgid "JiraService|Project key is required to generate issue types"
-msgstr ""
+msgstr "Cheia proiectului este necesară pentru a genera tipuri de probleme"
msgid "JiraService|Select issue type"
-msgstr ""
+msgstr "Selectați tipul de problemă"
msgid "JiraService|Set a custom final state by using transition IDs. %{linkStart}Learn about transition IDs%{linkEnd}"
msgstr ""
@@ -21115,11 +21664,8 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
-msgstr ""
+msgstr "Toți utilizatorii GitLab cu acces la acest proiect GitLab pot vizualiza toate problemele din proiectul Jira pe care îl selectați."
msgid "JiraService|Web URL"
msgstr ""
@@ -21130,6 +21676,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr "Lucrați la problemele Jira fără să părăsiți GitLab. Adăugați un meniu Jira pentru a accesa o listă doar în citire a problemelor dvs. Jira. %{jira_issues_link_start}Aflați mai multe.%{link_end}"
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21176,7 +21725,7 @@ msgid "Job was retried"
msgstr ""
msgid "Jobs"
-msgstr "Job-uri"
+msgstr "Joburi"
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 ""
@@ -21193,6 +21742,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21202,6 +21754,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21229,15 +21787,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr "Brut complet"
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21253,9 +21820,27 @@ msgstr "Jobul a fost șters de %{userLink}"
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21265,6 +21850,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr "Afișați brut complet"
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21289,6 +21877,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21326,7 +21917,7 @@ msgid "July"
msgstr ""
msgid "Jump to next unresolved thread"
-msgstr ""
+msgstr "Săriți la următorul subiect nerezolvat"
msgid "Jun"
msgstr ""
@@ -21371,7 +21962,7 @@ msgid "Key: %{key}"
msgstr ""
msgid "Keyboard shortcuts"
-msgstr ""
+msgstr "Scurtături de la tastatură"
msgid "KeyboardKey|Alt"
msgstr ""
@@ -21649,6 +22240,9 @@ msgstr ""
msgid "Last updated"
msgstr "Ultima actualizare"
+msgid "Last updated %{time} ago"
+msgstr "Ultima actualizare acum %{time}"
+
msgid "Last used"
msgstr ""
@@ -21755,7 +22349,13 @@ msgid "Learn more about group-level project templates"
msgstr ""
msgid "Learn more about groups."
-msgstr ""
+msgstr "Aflați mai multe despre grupuri."
+
+msgid "Learn more about max seats used"
+msgstr "Aflați mai multe despre numărul maxim de seat-uri utilizate"
+
+msgid "Learn more about seats owed"
+msgstr "Aflați mai multe despre seat-urile datorate"
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21898,6 +22498,9 @@ msgstr "Este recomandat să lăsați această setare activată."
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr "Mai puține detalii"
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21910,6 +22513,9 @@ msgstr ""
msgid "License Compliance"
msgstr "Conformitatea licenței"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21928,6 +22534,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21955,9 +22564,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21994,6 +22600,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22003,6 +22615,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22018,6 +22636,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22031,7 +22655,7 @@ 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 ""
+msgstr "Caracteristicile din Ediția Enterprise cu licență pot fi utilizate dacă planul spațiului de nume al proiectului include caracteristica respectivă sau dacă proiectul este public."
msgid "Licensed Features"
msgstr ""
@@ -22103,7 +22727,7 @@ msgid "Licenses|Unacceptable license, if detected it will disallow a merge reque
msgstr ""
msgid "Licenses|View license details for your project"
-msgstr ""
+msgstr "Vizualizați detaliile licenței pentru proiectul dvs."
msgid "Limit display of time tracking units to hours."
msgstr ""
@@ -22112,7 +22736,7 @@ msgid "Limit project size at a global, group, and project level. %{link_start}Le
msgstr ""
msgid "Limit sign in from multiple IP addresses"
-msgstr ""
+msgstr "Limitați conectarea de la mai multe adrese IP"
msgid "Limit the number of concurrent operations this secondary site can run in the background."
msgstr ""
@@ -22124,7 +22748,7 @@ msgid "Limit the number of issues and epics per minute a user can create through
msgstr "Limitați numărul de probleme și epice pe care un utilizator le poate crea prin cereri API și web pe minut."
msgid "Limit the number of namespaces and projects that can be indexed."
-msgstr ""
+msgstr "Limitați numărul de spații de nume și proiecte care pot fi indexate."
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22145,7 +22769,7 @@ msgid "Link Prometheus monitoring to GitLab."
msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
-msgstr ""
+msgstr "Conectați Sentry la GitLab pentru a descoperi și a vizualiza erorile generate de aplicația dvs."
msgid "Link URL"
msgstr ""
@@ -22190,7 +22814,7 @@ msgid "LinkedIn:"
msgstr ""
msgid "LinkedPipelines|%{counterLabel} more downstream pipelines"
-msgstr ""
+msgstr "%{counterLabel} alte pipeline-uri în aval"
msgid "Links"
msgstr ""
@@ -22207,9 +22831,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22226,13 +22847,13 @@ msgid "List the merge requests that must be merged before this one."
msgstr ""
msgid "List view"
-msgstr ""
+msgstr "Vizualizare listă"
msgid "List your Bitbucket Server repositories"
msgstr ""
msgid "Live preview"
-msgstr ""
+msgstr "Previzualizare live"
msgid "Load more"
msgstr ""
@@ -22259,7 +22880,7 @@ msgid "Loading more"
msgstr ""
msgid "Loading snippet"
-msgstr ""
+msgstr "Se încarcă fragmentul de cod"
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -22412,7 +23033,7 @@ msgid "MRDiffFile|Changes are too large to be shown."
msgstr ""
msgid "MRDiffFile|View file @ %{commitSha}"
-msgstr ""
+msgstr "Vizualizați fișierul @ %{commitSha}"
msgid "MRDiff|Show changes only"
msgstr ""
@@ -22483,6 +23104,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22516,6 +23140,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22535,7 +23162,7 @@ msgid "Mark as done"
msgstr ""
msgid "Mark as draft"
-msgstr ""
+msgstr "Marcați ca schiță"
msgid "Mark as ready"
msgstr ""
@@ -22592,13 +23219,13 @@ msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
msgid "Marked as draft. Can only be merged when marked as ready."
-msgstr ""
+msgstr "Marcat ca schiță. Poate fi îmbinat doar atunci când este marcat ca fiind finalizat."
msgid "Marked as ready. Merging is now allowed."
msgstr ""
msgid "Marked this %{noun} as a draft."
-msgstr ""
+msgstr "Acest %{noun} a fost marcat ca fiind o schiță."
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -22610,7 +23237,7 @@ msgid "Marked to do as done."
msgstr ""
msgid "Marks this %{noun} as a draft."
-msgstr ""
+msgstr "Marchează acest %{noun} ca fiind o schiță."
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -22678,6 +23305,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr "Max. seat-uri utilizate"
+
msgid "Max session time"
msgstr ""
@@ -22745,7 +23375,7 @@ msgid "Maximum delay (Minutes)"
msgstr ""
msgid "Maximum diff patch size"
-msgstr "Dimensiune maximă patch diff"
+msgstr "Dimensiunea maximă a patch-ului diff"
msgid "Maximum diff patch size (Bytes)"
msgstr ""
@@ -22798,9 +23428,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22822,6 +23449,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr "Numărul maxim de solicitări pe minut pentru un utilizator autentificat"
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr "Numărul maxim de solicitări pe minut pentru o adresă IP neautentificată"
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22856,7 +23489,7 @@ msgid "Maximum requests per minute"
msgstr ""
msgid "Maximum running slices"
-msgstr ""
+msgstr "Maximum de tranșe care rulează"
msgid "Maximum size limit for a single commit."
msgstr ""
@@ -22877,7 +23510,7 @@ msgid "Maximum size of pages (MB)"
msgstr ""
msgid "Maximum snippet size"
-msgstr "Mărime maximă fragment de cod"
+msgstr "Mărimea maximă a fragmentului de cod"
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
@@ -22991,7 +23624,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 "Sunteți sigur că doriți să eliminați %{usersName} din \"%{source}\"?"
+msgstr "Sunteți sigur că doriți să înlăturați %{usersName} din \"%{source}\"?"
msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
msgstr ""
@@ -23059,9 +23692,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23098,11 +23728,11 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
-msgstr ""
+msgstr "Îmbinare blocată: merge request-ul trebuie să fie marcat ca fiind gata. Este încă marcat ca schiță."
msgid "Merge blocked: new changes were just added."
msgstr "Îmbinare blocată: tocmai au fost adăugate modificări noi."
@@ -23111,7 +23741,7 @@ msgid "Merge blocked: pipeline must succeed. It's waiting for a manual job to co
msgstr ""
msgid "Merge blocked: the source branch must be rebased onto the target branch."
-msgstr "Îmbinare blocată: ramura sursă trebuie să fie rebazată pe ramura țintă."
+msgstr "Îmbinare blocată: trebuie făcut un rebase a ramurii sursă pe ramura țintă."
msgid "Merge commit SHA"
msgstr ""
@@ -23135,7 +23765,7 @@ msgid "Merge locally"
msgstr ""
msgid "Merge options"
-msgstr ""
+msgstr "Opțiuni de îmbinare"
msgid "Merge request"
msgstr "Merge request"
@@ -23173,8 +23803,8 @@ msgstr "Merge request-uri"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
-msgstr ""
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
+msgstr "Îmbinați ramura de caracteristică în ramura țintă și rezolvați orice conflict. %{linkStart}Cum le rezolv?%{linkEnd}"
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
msgstr ""
@@ -23252,10 +23882,10 @@ msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
+msgstr "A apărut o eroare în timpul salvării schiței de comentariu."
msgid "MergeRequests|Create issue to resolve thread"
-msgstr ""
+msgstr "Creați o problemă pentru a rezolva subiectul"
msgid "MergeRequests|Saving the comment failed"
msgstr ""
@@ -23267,19 +23897,19 @@ msgid "MergeRequests|Squashing not allowed: This project doesn't allow you to sq
msgstr ""
msgid "MergeRequests|Thread stays resolved"
-msgstr ""
+msgstr "Subiectul rămâne rezolvat"
msgid "MergeRequests|Thread stays unresolved"
-msgstr ""
+msgstr "Subiectul rămâne nerezolvat"
msgid "MergeRequests|Thread will be resolved"
-msgstr ""
+msgstr "Subiectul va fi rezolvat"
msgid "MergeRequests|Thread will be unresolved"
-msgstr ""
+msgstr "Subiectul va fi marcat ca nerezolvat"
msgid "MergeRequests|View file @ %{commitId}"
-msgstr ""
+msgstr "Vizualizați fișierul @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
@@ -23288,19 +23918,19 @@ msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
msgid "MergeRequests|started a thread"
-msgstr ""
+msgstr "a început un subiect"
msgid "MergeRequests|started a thread on %{linkStart}an old version of the diff%{linkEnd}"
-msgstr ""
+msgstr "a început un subiect pe %{linkStart}o versiune veche de diff%{linkEnd}"
msgid "MergeRequests|started a thread on %{linkStart}the diff%{linkEnd}"
-msgstr ""
+msgstr "a început un subiect pe %{linkStart}diff%{linkEnd}"
msgid "MergeRequests|started a thread on an outdated change in commit %{linkStart}%{commitDisplay}%{linkEnd}"
-msgstr ""
+msgstr "a început un subiect pe o modificare învechită în commit-ul %{linkStart}%{commitDisplay}%{linkEnd}"
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
-msgstr ""
+msgstr "a început un subiect pe commit-ul %{linkStart}%{commitDisplay}%{linkEnd}"
msgid "MergeRequest|Approved by @%{username}"
msgstr ""
@@ -23399,16 +24029,16 @@ msgid "Metrics - Prometheus"
msgstr ""
msgid "Metrics Dashboard"
-msgstr ""
+msgstr "Tabloul de bord al metricilor"
msgid "Metrics Dashboard YAML definition"
-msgstr ""
+msgstr "Definiția YAML a Tabloul de bord al metricilor"
msgid "Metrics Dashboard YAML definition is invalid:"
-msgstr ""
+msgstr "Definiția YAML a Tabloul de bord al metricilor nu este validă:"
msgid "Metrics Dashboard YAML definition is valid."
-msgstr ""
+msgstr "Definiția YAML a Tabloul de bord al metricilor este validă."
msgid "Metrics and profiling"
msgstr ""
@@ -23417,43 +24047,43 @@ msgid "Metrics:"
msgstr ""
msgid "MetricsDashboardAnnotation|Annotation can't belong to both a cluster and an environment at the same time"
-msgstr ""
+msgstr "Adnotarea nu poate aparține atât unui cluster, cât și unui mediu în același timp"
msgid "MetricsDashboardAnnotation|Annotation has not been deleted"
-msgstr ""
+msgstr "Adnotarea nu a fost ștearsă"
msgid "MetricsDashboardAnnotation|Annotation must belong to a cluster or an environment"
-msgstr ""
+msgstr "Adnotarea trebuie să aparțină unui cluster sau unui mediu"
msgid "MetricsDashboardAnnotation|Dashboard with requested path can not be found"
-msgstr ""
+msgstr "Tabloul de bord cu calea solicitată nu poate fi găsit"
msgid "MetricsDashboardAnnotation|You are not authorized to create annotation for selected cluster"
-msgstr ""
+msgstr "Nu sunteți autorizat să creați adnotări pentru clusterul selectat"
msgid "MetricsDashboardAnnotation|You are not authorized to create annotation for selected environment"
-msgstr ""
+msgstr "Nu sunteți autorizat să creați adnotări pentru mediul selectat"
msgid "MetricsDashboardAnnotation|You are not authorized to delete this annotation"
-msgstr ""
+msgstr "Nu sunteți autorizat să ștergeți această adnotare"
msgid "MetricsDashboardAnnotation|can't be before starting_at time"
-msgstr ""
+msgstr "nu poate fi anterioară datei de starting_at"
msgid "MetricsSettings|Add a button to the metrics dashboard linking directly to your existing external dashboard."
-msgstr ""
+msgstr "Adăugați un buton la tabloul de bord al metricilor care să facă legătura directă cu tabloul de bord extern existent."
msgid "MetricsSettings|Choose whether to display dashboard metrics in UTC or the user's local timezone."
-msgstr ""
+msgstr "Alegeți dacă doriți să afișați metricile tabloului de bord în UTC sau în fusul orar local al utilizatorului."
msgid "MetricsSettings|Dashboard timezone"
-msgstr ""
+msgstr "Fusul orar al tabloului de bord"
msgid "MetricsSettings|External dashboard URL"
-msgstr ""
+msgstr "URL-ul tabloului de bord extern"
msgid "MetricsSettings|Manage metrics dashboard settings."
-msgstr ""
+msgstr "Gestionați setările tabloul de bord al metricilor"
msgid "MetricsSettings|Metrics"
msgstr ""
@@ -23465,16 +24095,16 @@ msgid "MetricsSettings|User's local timezone"
msgstr ""
msgid "MetricsUsersStarredDashboards|Dashboard with requested path can not be found"
-msgstr ""
+msgstr "Tabloul de bord cu calea solicitată nu poate fi găsit"
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
-msgstr ""
+msgstr "Nu sunteți autorizat să adăugați o stea la acest tablou de bord"
msgid "Metrics|1. Define and preview panel"
msgstr ""
msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
+msgstr "2. Lipiți panoul YAML în tabloul de bord"
msgid "Metrics|Add metric"
msgstr ""
@@ -23486,7 +24116,7 @@ msgid "Metrics|Avg"
msgstr ""
msgid "Metrics|Back to dashboard"
-msgstr ""
+msgstr "ÃŽnapoi la tabloul de bord"
msgid "Metrics|Cancel"
msgstr ""
@@ -23504,25 +24134,25 @@ msgid "Metrics|Copy YAML"
msgstr ""
msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
+msgstr "Copiați și lipiți YAML-ul panoului în fișierul YAML al tabloului de bord."
msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
+msgstr "Creați tabloul de bord personalizat %{fileName}"
msgid "Metrics|Create metric"
msgstr ""
msgid "Metrics|Create new dashboard"
-msgstr ""
+msgstr "Creați un nou tablou de bord"
msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
+msgstr "Creați fișierul de configurare a tabloului de bord"
msgid "Metrics|Current"
msgstr ""
msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
+msgstr "Fișierele tabloului de bord pot fi găsite în %{codeStart}.gitlab/dashboards%{codeEnd} la rădăcina acestui proiect."
msgid "Metrics|Define panel YAML below to preview panel."
msgstr ""
@@ -23537,19 +24167,19 @@ msgid "Metrics|Duplicate"
msgstr ""
msgid "Metrics|Duplicate current dashboard"
-msgstr ""
+msgstr "Duplicați tabloul de bord curent"
msgid "Metrics|Duplicate dashboard"
-msgstr ""
+msgstr "Duplicați tabloul de bord"
msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
+msgstr "Duplicați acest tablou de bord pentru a adăuga un panou sau pentru a edita YAML-ul tabloului de bord."
msgid "Metrics|Duplicating..."
msgstr ""
msgid "Metrics|Edit dashboard YAML"
-msgstr ""
+msgstr "Editați YAML-ul tabloului de bord"
msgid "Metrics|Edit metric"
msgid_plural "Metrics|Edit metrics"
@@ -23621,7 +24251,7 @@ msgid "Metrics|Refresh Prometheus data"
msgstr ""
msgid "Metrics|Refresh dashboard"
-msgstr ""
+msgstr "Actualizați tabloul de bord"
msgid "Metrics|Select a value"
msgstr ""
@@ -23630,13 +24260,13 @@ msgid "Metrics|Set refresh rate"
msgstr ""
msgid "Metrics|Star dashboard"
-msgstr ""
+msgstr "Adăugați tabloul de bord în favorite"
msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
+msgstr "A apărut o eroare la crearea tabloului de bord."
msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "A apărut o eroare la crearea panoului de control. %{error}"
+msgstr "A apărut o eroare la crearea tabloului de bord. %{error}"
msgid "Metrics|There was an error fetching annotations. Please try again."
msgstr ""
@@ -23648,7 +24278,7 @@ msgid "Metrics|There was an error getting annotations information."
msgstr ""
msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
+msgstr "A apărut o eroare la obținerea informațiilor privind avertismentele de validare a tabloului de bord."
msgid "Metrics|There was an error getting deployment information."
msgstr ""
@@ -23669,7 +24299,7 @@ msgid "Metrics|There was an error while retrieving metrics. %{message}"
msgstr ""
msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
+msgstr "Pentru a crea un nou tablou de bord, adăugați un nou fișier YAML la %{codeStart}.gitlab/dashboards%{codeEnd} la rădăcina acestui proiect."
msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
msgstr ""
@@ -23678,13 +24308,13 @@ msgid "Metrics|Unit label"
msgstr ""
msgid "Metrics|Unstar dashboard"
-msgstr ""
+msgstr "Eliminați tabloul de bord din favorite"
msgid "Metrics|Used as a title for the chart"
msgstr ""
msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
-msgstr ""
+msgstr "Se utilizează atunci când interogarea returnează o singură serie. Dacă aceasta returnează mai multe serii, etichetele legendei acestora vor fi preluate din răspuns."
msgid "Metrics|Validating query"
msgstr ""
@@ -23702,13 +24332,13 @@ 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 "Puteți salva o copie a acestui tablou de bord în repozitoriul dvs. pentru a putea fi personalizat. Selectați un nume de fișier și o ramură pentru a-l salva."
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
+msgstr "Schema tabloului de bord nu este validă. Editați tabloul de bord pentru a corecta schema YAML."
msgid "Metrics|e.g. HTTP requests"
msgstr "ex. Solicitări HTTP"
@@ -23728,9 +24358,6 @@ msgstr ""
msgid "Mi"
msgstr "Mi"
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23851,6 +24478,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23869,6 +24499,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23887,12 +24520,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24010,6 +24652,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr "Mai multe detalii"
+
msgid "More Information"
msgstr ""
@@ -24086,13 +24731,13 @@ msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
msgstr ""
msgid "Moved issue to %{label} column in the board."
-msgstr ""
+msgstr "Problema a fost mutată în coloana %{label} de pe bord."
msgid "Moved this issue to %{path_to_project}."
msgstr ""
msgid "Moves issue to %{label} column in the board."
-msgstr ""
+msgstr "Problema a fost mutată în coloana %{label} de pe bord."
msgid "Moves this issue to %{path_to_project}."
msgstr ""
@@ -24106,16 +24751,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24125,25 +24770,25 @@ msgid "Multi-project Runners cannot be removed"
msgstr ""
msgid "Multiple HTTP integrations are not supported for this project"
-msgstr ""
+msgstr "Integrările HTTP multiple nu sunt acceptate pentru acest proiect"
msgid "Multiple IP address ranges are supported."
-msgstr ""
+msgstr "Sunt acceptate mai multe intervale de adrese IP."
msgid "Multiple Prometheus integrations are not supported"
-msgstr ""
+msgstr "Integrările multiple Prometheus nu sunt acceptate"
msgid "Multiple domains are supported."
-msgstr ""
+msgstr "Sunt acceptate domenii multiple."
msgid "Multiple model types found: %{model_types}"
-msgstr ""
+msgstr "Au fost găsite mai multe tipuri de modele: %{model_types}"
msgid "Multiple uploaders found: %{uploader_types}"
-msgstr ""
+msgstr "Au fost găsite mai multe încărcătoare: %{uploader_types}"
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
-msgstr "Multiplicator aplicabil intervalelor de sondaj. Valori decimale sunt suportate. Valoarea implicită este 1."
+msgstr "Multiplicator aplicabil intervalelor de sondare. Sunt acceptate valorile zecimale. Valoarea implicită este 1."
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -24185,58 +24830,85 @@ msgid "Name:"
msgstr ""
msgid "Namespace"
-msgstr ""
+msgstr "Spațiu de nume"
msgid "Namespace ID:"
-msgstr ""
+msgstr "ID-ul spațiului de nume:"
msgid "Namespace is empty"
-msgstr ""
+msgstr "Spațiul de nume este gol"
msgid "Namespace:"
-msgstr ""
+msgstr "Spațiu de nume:"
msgid "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked project"
msgid_plural "NamespaceStorageSize|%{namespace_name} contains %{locked_project_count} locked projects"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{namespace_name} conține %{locked_project_count} proiect blocat"
+msgstr[1] "%{namespace_name} conține %{locked_project_count} proiecte blocate"
+msgstr[2] "%{namespace_name} conține %{locked_project_count} de proiecte blocate"
msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{base_message}"
-msgstr ""
+msgstr "%{namespace_name} este acum numai în citire. Nu puteți: %{base_message}"
msgid "NamespaceStorageSize|If you reach 100%% storage capacity, you will not be able to: %{base_message}"
-msgstr ""
+msgstr "Dacă ajungeți la 100%% din capacitatea de stocare, nu veți mai putea: %{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 ""
+msgstr "Vă rugăm să achiziționați spațiu de stocare suplimentar pentru a vă debloca proiectele care depășesc limita proiectelor gratuite %{free_size_limit}. Nu puteți %{base_message}"
msgid "NamespaceStorageSize|You have consumed all of your additional storage, please purchase more to unlock your projects over the free %{free_size_limit} limit. You can't %{base_message}"
-msgstr ""
+msgstr "Ați consumat tot spațiul de stocare suplimentar, vă rugăm să achiziționați mai mult pentru a vă debloca proiectele peste limita gratuită %{free_size_limit}. Nu puteți %{base_message}"
msgid "NamespaceStorageSize|You have reached %{usage_in_percent} of %{namespace_name}'s storage capacity (%{used_storage} of %{storage_limit})"
-msgstr ""
+msgstr "Ați atins %{usage_in_percent} din capacitatea de stocare a %{namespace_name} (%{used_storage} din %{storage_limit})"
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on one or more projects."
-msgstr ""
+msgstr "Ați atins limita de stocare liberă de %{free_size_limit} pe unul sau mai multe proiecte."
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
-msgstr ""
+msgstr "faceți push către repozitoriul dvs., creați conducte, creați probleme sau adăugați comentarii. Pentru a reduce capacitatea de stocare, ștergeți repozitoriile, artefactele, wiki-urile, problemele și pipeline-urile neutilizate."
+
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr "Spațiul de nume %{name_with_link} are %{percent} sau mai puțin spațiu de stocare rămas a spațiului de nume."
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr "Spațiul de nume %{name_with_link} și-a depășit limita de stocare a spațiului de nume."
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr "Spațiul de nume %{name}(%{url}) are %{percent} sau mai puțin spațiu de stocare rămas a spațiului de nume."
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr "Spațiul de nume %{name}(%{url}) și-a depășit limita de stocare a spațiului de nume."
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr "Acțiune necesară: A rămas mai puțin de %{percentage_of_available_storage}din spațiul de stocare a spațiului de nume pentru %{namespace_name}"
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr "Acțiune necesară: Stocarea a fost depășită pentru %{namespace_name}"
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr "Cumpărați mai mult spațiu de stocare"
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr "Vă recomandăm să cumpărați spațiu de stocare suplimentar pentru a vă asigura că serviciul dvs. nu este întrerupt."
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr "Vă recomandăm să cumpărați spațiu de stocare suplimentar pentru a relua serviciul normal."
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 ""
+msgstr "Utilizatorii în așteptare trebuie să fie revizuiți și aprobați de un proprietar de grup. Aflați mai multe despre %{user_caps_link_start}plafoanele de utilizatori%{link_end} și %{users_pending_approval_link_start}utilizatorii în așteptare de aprobare%{link_end}."
msgid "NamespaceUserCap|View pending approvals"
-msgstr ""
+msgstr "Vizualizați aprobările în așteptare"
msgid "NamespaceUserCap|Your group has reached its billable member limit"
-msgstr ""
+msgstr "Grupul dvs. a atins limita de membri facturabili"
msgid "Namespaces"
-msgstr ""
+msgstr "Spații de nume"
msgid "Namespaces to index"
-msgstr ""
+msgstr "Spațiu de nume pentru indexare"
msgid "Naming, topics, avatar"
msgstr ""
@@ -24298,6 +24970,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr "Necesită atenția dvs."
+
msgid "Needs"
msgstr ""
@@ -24383,7 +25058,7 @@ msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
msgid "NetworkPolicies|Invalid or unsupported policy kind"
-msgstr "Tip politică invalid sau nesuportat"
+msgstr "Tip de politică invalidă sau neacceptată"
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Eroare Kubernetes: %{error}"
@@ -24425,7 +25100,7 @@ msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
+msgstr "Pentru a activa alertele, %{installLinkStart}instalați mai întâi un agent%{installLinkEnd}."
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -24484,9 +25159,6 @@ msgstr "Niciodată"
msgid "New"
msgstr "Nou"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24548,7 +25220,7 @@ msgid "New Requirement"
msgstr ""
msgid "New Snippet"
-msgstr ""
+msgstr "Fragment de cod nou"
msgid "New Test Case"
msgstr ""
@@ -24580,14 +25252,17 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
msgid "New epic"
-msgstr "Epic nou"
+msgstr "Epică nouă"
msgid "New epic title"
-msgstr "Titlu epic nou"
+msgstr "Titlu nou de epică"
msgid "New file"
msgstr "Fișier nou"
@@ -24655,6 +25330,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr "Nou %{issueType} asociat"
+
msgid "New release"
msgstr ""
@@ -24670,11 +25348,8 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
-msgstr ""
+msgstr "Fragment de cod nou"
msgid "New subgroup"
msgstr ""
@@ -24721,6 +25396,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr "Următoarea actualizare"
+
msgid "Nickname"
msgstr ""
@@ -24769,6 +25447,9 @@ msgstr "Nu s-au găsit artefacte"
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr "Nicio solicitare de atenție"
+
msgid "No authentication methods configured."
msgstr ""
@@ -24796,12 +25477,6 @@ msgstr ""
msgid "No committers"
msgstr "Niciun comitent"
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24880,9 +25555,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24904,8 +25576,8 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
-msgstr ""
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
+msgstr "Nu s-a găsit niciun %{issuable} corespunzător. Asigurați-vă că adăugați un URL %{issuable} valid."
msgid "No matching labels"
msgstr ""
@@ -24937,11 +25609,8 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
-msgstr ""
+msgstr "Niciun spațiu de nume"
msgid "No other labels with such name or description"
msgstr ""
@@ -24962,7 +25631,7 @@ msgid "No policy matches this license"
msgstr ""
msgid "No preview for this file type"
-msgstr ""
+msgstr "Nicio previzualizare pentru acest tip de fișier"
msgid "No prioritized labels with such name or description"
msgstr ""
@@ -25016,11 +25685,14 @@ msgid "No stack trace for this error"
msgstr ""
msgid "No starrers matched your search"
-msgstr ""
+msgstr "Nimeni care l-a adăugat la favorite nu corespunde căutării dv."
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr "Nu s-au găsit sugestii"
+
msgid "No tag selected"
msgstr ""
@@ -25055,7 +25727,7 @@ msgid "No. of commits"
msgstr ""
msgid "Nobody has starred this repository yet"
-msgstr ""
+msgstr "Nimeni nu a marcat încă acest repozitoriu ca favorit"
msgid "Node was successfully created."
msgstr ""
@@ -25177,6 +25849,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25565,7 +26240,7 @@ msgid "OnCallSchedules|You are currently a part of:"
msgstr ""
msgid "OnCallSchedules|Your schedule has been successfully created. To add individual users to this schedule, use the Add a rotation button. To enable notifications for this schedule, you must also create an %{linkStart}escalation policy%{linkEnd}."
-msgstr "Programul dvs. a fost creat cu succes. Pentru a adăuga utilizatori individuali la acest program, utilizați butonul Adăugați o rotație. Pentru a activa notificări pentru acest program, trebuie să creați și o %{linkStart}politică de escaladare%{linkEnd}."
+msgstr "Programarea dvs. a fost creată cu succes. Pentru a adăuga utilizatori individuali la această programare, utilizaÈ›i butonul „AdăugaÈ›i o rotaÈ›ieâ€. Pentru a activa notificările pentru această programare, trebuie să creaÈ›i, de asemenea, o %{linkStart}politică de escaladare%{linkEnd}."
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
msgstr ""
@@ -25621,10 +26296,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25745,7 +26420,7 @@ msgid "One or more of your %{provider} projects cannot be imported into GitLab d
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 "Unul sau mai multe fișiere de dependență nu sunt acceptate, iar lista de dependențe poate fi incompletă. Mai jos este o listă a tipurilor de fișiere acceptate."
msgid "One or more of your personal access tokens has expired."
msgstr ""
@@ -25766,11 +26441,14 @@ msgid "Only Project Members"
msgstr ""
msgid "Only active projects show up in the search and on the dashboard."
-msgstr "Doar proiectele active sunt afișate în căutare și în panoul de control."
+msgstr "Numai proiectele active apar în căutări și în tabloul de bord."
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr "Permiteți oricui să se înregistreze pentru conturi pe instanțele GitLab pe care intenționați să le folosească oricine. Permițând oricui să se înregistreze, face ca instanțele GitLab să fie mai vulnerabile."
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25789,11 +26467,8 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
-msgstr ""
+msgstr "Numai proiectele create sub o licență Ultimate sunt disponibile în Tablourile de bord de securitate."
msgid "Only reCAPTCHA v2 is supported:"
msgstr ""
@@ -25822,12 +26497,12 @@ msgstr ""
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 ""
-
msgid "Open errors"
msgstr ""
+msgid "Open in Gitpod"
+msgstr "Deschideți în Gitpod"
+
msgid "Open in Web IDE"
msgstr ""
@@ -25840,9 +26515,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "Deschideți bara laterală"
@@ -25870,6 +26542,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr "Deschide o fereastră nouă"
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25883,22 +26558,22 @@ msgid "Operations"
msgstr ""
msgid "Operations Dashboard"
-msgstr ""
+msgstr "Tabloul de bord de operațiuni"
msgid "OperationsDashboard|Add a project to the dashboard"
-msgstr ""
+msgstr "Adăugați un proiect în tabloul de bord"
msgid "OperationsDashboard|Add projects"
-msgstr ""
+msgstr "Adăugați proiecte"
msgid "OperationsDashboard|More information"
-msgstr ""
+msgstr "Mai multe informații"
msgid "OperationsDashboard|Operations Dashboard"
-msgstr ""
+msgstr "Tabloul de bord al operațiunilor"
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
-msgstr ""
+msgstr "Tablou de bord de operațiuni oferă un rezumat al stării de sănătate operațională a fiecărui proiect, inclusiv a statusului conductelor și a alertelor."
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -25973,7 +26648,7 @@ msgid "OutboundRequests|Outbound requests"
msgstr ""
msgid "OutboundRequests|Requests to these domains and IP addresses are accessible to both system hooks and web hooks even when local requests are not allowed. IP ranges such as 1:0:0:0:0:0:0:0/124 and 127.0.0.0/28 are supported. Domain wildcards are not supported. To separate entries use commas, semicolons, or newlines. The allowlist can hold a maximum of 1000 entries. Domains must be IDNA encoded."
-msgstr ""
+msgstr "Solicitările către aceste domenii și adrese IP sunt accesibile atât hook-urilor de sistem, cât și celor web, chiar și atunci când nu sunt permise solicitările locale. Sunt acceptate intervale IP precum 1:0:0:0:0:0:0:0:0:0/124 și 127.0.0.0.0/28. Nu sunt acceptate caractere wildcard de domeniu. Pentru a separa intrările, utilizați virgule, punct și virgulă sau linii noi. Lista de permisiuni poate conține maximum 1000 de intrări. Domeniile trebuie să fie codificate IDNA."
msgid "OutboundRequests|Resolve IP addresses once and uses them to submit requests."
msgstr ""
@@ -25988,7 +26663,7 @@ msgid "Outdent"
msgstr ""
msgid "Overridden"
-msgstr ""
+msgstr "Suprascris"
msgid "Overview"
msgstr ""
@@ -26011,6 +26686,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr "Proprietarii pot modifica această selecție."
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26066,31 +26744,31 @@ msgid "Package registry rate limits"
msgstr ""
msgid "Package type"
-msgstr ""
+msgstr "Tipul de pachet"
msgid "Package type must be Conan"
-msgstr ""
+msgstr "Tipul pachetului trebuie să fie Conan"
msgid "Package type must be Debian"
-msgstr ""
+msgstr "Tipul pachetului trebuie să fie Debian"
msgid "Package type must be Helm"
-msgstr ""
+msgstr "Tipul pachetului trebuie să fie Helm"
msgid "Package type must be Maven"
-msgstr ""
+msgstr "Tipul pachetului trebuie să fie Maven"
msgid "Package type must be NPM"
msgstr ""
msgid "Package type must be NuGet"
-msgstr ""
+msgstr "Tipul pachetului trebuie să fie NuGet"
msgid "Package type must be PyPi"
-msgstr ""
+msgstr "Tipul pachetului trebuie să fie PyPi"
msgid "Package type must be RubyGems"
-msgstr ""
+msgstr "Tipul pachetului trebuie să fie RubyGems"
msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
@@ -26402,7 +27080,7 @@ msgid "PackageRegistry|To widen your search, change or remove the filters above.
msgstr ""
msgid "PackageRegistry|Type"
-msgstr ""
+msgstr "Tip"
msgid "PackageRegistry|Unable to fetch package version information."
msgstr ""
@@ -26423,7 +27101,7 @@ msgid "PackageRegistry|You are about to delete version %{version} of %{name}. Ar
msgstr ""
msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
-msgstr ""
+msgstr "S-ar putea, de asemenea, să fie nevoie să configurați autentificarea cu ajutorul unui token auth. %{linkStart}Consultați documentația%{linkEnd} pentru a afla mai multe."
msgid "PackageRegistry|npm"
msgstr ""
@@ -26648,7 +27326,7 @@ msgid "People without permission will never get a notification."
msgstr ""
msgid "Percent rollout must be an integer number between 0 and 100"
-msgstr ""
+msgstr "Implementarea procentuală trebuie să fie un număr întreg între 0 și 100"
msgid "Percentage"
msgstr ""
@@ -26741,7 +27419,7 @@ msgid "Permalink"
msgstr ""
msgid "Permanently remove group"
-msgstr "Eliminați definitiv grupul"
+msgstr "Înlăturați definitiv grupul"
msgid "Permissions"
msgstr ""
@@ -26779,6 +27457,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26912,7 +27593,7 @@ msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
msgstr ""
msgid "PipelineEditorTutorial|💡 Tip: Visualize and validate your pipeline"
-msgstr ""
+msgstr "💡 Sfat: Vizualizați și validați-vă pipeline-ul"
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
msgstr ""
@@ -27005,10 +27686,10 @@ msgid "PipelineSource|Web IDE"
msgstr "IDE Web"
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
-msgstr ""
+msgstr "Pipeline: %{ciStatus}"
msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
-msgstr ""
+msgstr "Pipeline: %{ci_status}"
msgid "PipelineWizardDefaultCommitMessage|Add %{filename}"
msgstr ""
@@ -27055,6 +27736,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr "A apărut o eroare neașteptată la încercarea de a configura șablonul. Eroarea a fost înregistrată."
+
msgid "Pipelines"
msgstr ""
@@ -27064,224 +27748,230 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
-msgstr ""
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr "„Hello world†cu GitLab Cl"
-msgid "Pipelines|Add a code quality job"
-msgstr ""
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr "Un GitLab Runner este o aplicație care funcționează cu GitLab CI/CD pentru a rula joburi într-un pipeline. Instalați GitLab Runner și înregistrați-vă propriii executori pentru a începe cu CI/CD."
+
+msgid "Pipelines|API"
+msgstr "API"
msgid "Pipelines|Are you sure you want to run this pipeline?"
-msgstr ""
+msgstr "Sigur doriți să rulați acest pipeline?"
msgid "Pipelines|Auto DevOps"
-msgstr ""
+msgstr "Auto DevOps"
msgid "Pipelines|Build with confidence"
-msgstr ""
+msgstr "Construiți cu încredere"
msgid "Pipelines|By revoking a trigger you will break any processes making use of it. Are you sure?"
-msgstr ""
+msgstr "Prin revocarea unui declanșator, veți întrerupe toate procesele care îl utilizează. Sunteți sigur?"
msgid "Pipelines|CI lint"
-msgstr ""
+msgstr "CI lint"
msgid "Pipelines|CI/CD template to test and deploy your %{name} project."
-msgstr ""
+msgstr "Șablon CI/CD pentru a testa și implementa proiectul dvs. %{name}."
msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
+msgstr "Pipeline copil (%{link_start}părinte%{link_end})"
msgid "Pipelines|Clear runner caches"
-msgstr ""
+msgstr "Ștergeți cache-urile executorilor"
msgid "Pipelines|Configuration validation currently not available."
-msgstr ""
+msgstr "Validarea configurației nu este disponibilă în prezent."
msgid "Pipelines|Copy trigger token"
-msgstr ""
+msgstr "Copiați tokenul declanșatorului"
msgid "Pipelines|Could not load artifacts."
-msgstr ""
+msgstr "Nu s-au putut încărca artefacte."
msgid "Pipelines|Could not load merged YAML content"
-msgstr ""
+msgstr "Conținutul YAML îmbinat nu a putut fi încărcat"
msgid "Pipelines|Description"
-msgstr ""
+msgstr "Descriere"
msgid "Pipelines|Edit"
-msgstr ""
+msgstr "Editare"
msgid "Pipelines|Editor"
-msgstr ""
+msgstr "Editor"
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
-msgstr ""
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
+msgstr "Familiarizați-vă cu sintaxa GitLab CI prin configurarea unui pipeline simplu care rulează un script „Hello world†pentru a vedea cum se execută, explorați modul în care funcționează CI/CD."
msgid "Pipelines|Get started with GitLab CI/CD"
-msgstr ""
+msgstr "Începeți cu GitLab CI/CD"
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
-msgstr ""
+msgstr "GitLab CI/CD vă poate construi, testa și implementa automat codul. Lăsați GitLab să se ocupe de sarcinile consumatoare de timp, astfel încât să puteți petrece mai mult timp creând."
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
-msgstr ""
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
+msgstr "GitLab Runner este o aplicație care funcționează cu GitLab CI/CD pentru a rula joburi într-un pipeline. Există executori activi disponibili pentru a vă rula joburile chiar acum. Dacă preferați, puteți %{settingsLinkStart}configura executorii dvs.%{settingsLinkEnd} sau %{docsLinkStart}învăța mai multe%{docsLinkEnd} despre executori."
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
-msgstr ""
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgstr "Dacă nu sunteți sigur, vă rugăm să cereți unui responsabil de proiect să-l revizuiască pentru dumneavoastră."
-msgid "Pipelines|Install GitLab Runners"
-msgstr ""
+msgid "Pipelines|Install GitLab Runner"
+msgstr "Instalați GitLab Runner"
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
-msgstr ""
+msgstr "Se recomandă revizuirea amănunțită a codului înainte de a rula acest pipeline cu resursa CI a proiectului părinte."
msgid "Pipelines|Last Used"
-msgstr ""
+msgstr "Ultima utilizare"
-msgid "Pipelines|Learn about Runners"
-msgstr ""
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
+msgstr "Învățați noțiunile de bază despre conducte și fișiere .yml"
msgid "Pipelines|Lint"
-msgstr ""
+msgstr "Lint"
msgid "Pipelines|Loading Pipelines"
-msgstr ""
+msgstr "Încărcare conducte"
msgid "Pipelines|Loading pipelines"
-msgstr ""
+msgstr "Încărcarea conductelor"
msgid "Pipelines|Merged YAML is view only"
-msgstr ""
+msgstr "YAML-ul îmbinat este doar în vizualizare"
msgid "Pipelines|More Information"
-msgstr ""
+msgstr "Mai multe informații"
+
+msgid "Pipelines|No runners detected"
+msgstr "Nu a fost detectat niciun executor"
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
-msgstr ""
+msgstr "Încă nu a fost creat niciun declanșator. Adăugați unul folosind formularul de mai sus."
msgid "Pipelines|Owner"
-msgstr ""
+msgstr "Proprietar"
msgid "Pipelines|Pipeline Editor"
-msgstr ""
+msgstr "Editor de pipeline"
msgid "Pipelines|Project cache successfully reset."
-msgstr ""
+msgstr "Cache-ul proiectului a fost resetat cu succes."
+
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr "Sunteți gata să configurați CI/CD pentru proiectul dumneavoastră?"
msgid "Pipelines|Revoke trigger"
-msgstr ""
+msgstr "Revocare declanșator"
+
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr "Executorii sunt disponibili pentru a vă rula joburile acum"
msgid "Pipelines|Something went wrong while cleaning runners cache."
-msgstr ""
+msgstr "A apărut o eroare în timpul curățării cache-ului executorilor."
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 ""
+msgstr "Spațiul de nume %{namespace_name} mai are %{percentage}%% sau mai puține minute rămase de pipeline pentru executorii partajați. După epuizarea lor, nu se va mai executa niciun job sau pipeline nou în proiectele sale."
msgid "Pipelines|The %{namespace_name} namespace has exceeded its pipeline minutes quota. Buy additional pipeline minutes, or no new jobs or pipelines in its projects will run."
-msgstr ""
+msgstr "Spațiul de nume %{namespace_name} a depășit cota de minute de pipeline. Achiziționați minute suplimentare de pipeline sau nu se vor executa noi lucrări sau pipeline-uri în proiectele sale."
msgid "Pipelines|The CI configuration was not loaded, please try again."
-msgstr ""
+msgstr "Configurația CI nu a fost încărcată, vă rugăm să încercați din nou."
msgid "Pipelines|The GitLab CI configuration could not be updated."
-msgstr ""
+msgstr "Configurația GitLab CI nu a putut fi actualizată."
msgid "Pipelines|There are currently no finished pipelines."
-msgstr ""
+msgstr "În prezent, nu există pipeline-uri finalizate."
msgid "Pipelines|There are currently no pipelines."
-msgstr ""
+msgstr "Nu există în prezent niciun pipeline."
msgid "Pipelines|There was a problem with loading the pipeline data."
-msgstr ""
+msgstr "A apărut o problemă în timpul încărcării datelor pipeline-ului."
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
-msgstr ""
+msgstr "A apărut o eroare în timpul preluării pipeline-urilor. Încercați din nou în câteva momente sau contactați echipa de asistență."
msgid "Pipelines|This GitLab CI configuration is invalid."
-msgstr ""
+msgstr "Această configurație GitLab CI nu este validă."
msgid "Pipelines|This GitLab CI configuration is invalid:"
-msgstr ""
+msgstr "Această configurație GitLab CI nu este validă:"
msgid "Pipelines|This GitLab CI configuration is invalid: %{reason}."
-msgstr ""
+msgstr "Această configurație GitLab CI nu este validă: %{reason}."
msgid "Pipelines|This GitLab CI configuration is valid."
-msgstr ""
+msgstr "Această configurație GitLab CI este validă."
msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
+msgstr "Acesta este un pipeline copil în interiorul unui pipeline părinte"
msgid "Pipelines|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
-msgstr ""
+msgstr "Acest pipeline a rulat pe conținutul acestui merge request combinat cu conținutul tuturor celorlalte merge request-uri puse în coadă pentru îmbinarea în ramura țintă."
msgid "Pipelines|This pipeline ran on the contents of this merge request's source branch, not the target branch."
-msgstr ""
+msgstr "Acest pipeline a rulat pe conținutul ramurii sursă al acestui merge request, nu pe cel al ramurii țintă."
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 ""
+msgstr "Acest pipeline va rula codul care provine dintr-un merge request al unui fork de proiect. Ceea ce înseamnă că acest cod poate avea considerente de securitate, cum ar fi expunerea variabilelor CI."
msgid "Pipelines|This project is not currently set up to run pipelines."
-msgstr ""
-
-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 ""
+msgstr "Acest proiect nu este configurat în prezent pentru a executa pipeline-uri."
msgid "Pipelines|Token"
-msgstr ""
+msgstr "Token"
msgid "Pipelines|Trigger user has insufficient permissions to project"
-msgstr ""
+msgstr "Utilizatorul care declanșează are permisiuni insuficiente pentru proiect"
-msgid "Pipelines|Use a CI/CD template"
-msgstr ""
+msgid "Pipelines|Try test template"
+msgstr "Încercați șablonul de testare"
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
-msgstr ""
-
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
+msgstr "Utilizați un exemplu de fișier șablon %{codeStart}.gitlab-ci.yml%{codeEnd} pentru a explora modul în care funcționează CI/CD."
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
-msgstr ""
+msgstr "Utilizați un șablon bazat pe limbajul sau framework-ul proiectului dvs. pentru a începe cu GitLab CI/CD."
msgid "Pipelines|Use template"
-msgstr ""
+msgstr "Utilizați șablonul"
msgid "Pipelines|Validating GitLab CI configuration…"
-msgstr ""
+msgstr "Se validează configurația GitLab CI…"
msgid "Pipelines|View merged YAML"
-msgstr ""
+msgstr "Vizualizați YAML-ul îmbinat"
msgid "Pipelines|Visualize"
-msgstr ""
+msgstr "Vizualizare"
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
-msgstr ""
+msgstr "Schimbările dvs. au fost comise cu succes. Acum se redirecționează către noua pagină a merge request-ului."
msgid "Pipelines|error"
-msgstr ""
+msgstr "eroare"
msgid "Pipelines|invalid"
-msgstr ""
+msgstr "invalid"
msgid "Pipelines|latest"
-msgstr ""
+msgstr "ultimele"
msgid "Pipelines|merge request"
-msgstr ""
+msgstr "merge request"
msgid "Pipelines|merge train"
-msgstr ""
+msgstr "merge train"
msgid "Pipelines|stuck"
-msgstr ""
+msgstr "blocat"
msgid "Pipelines|yaml invalid"
-msgstr ""
+msgstr "yaml invalid"
msgid "Pipeline|Actions"
msgstr ""
@@ -27301,9 +27991,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27319,9 +28006,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27425,10 +28109,10 @@ msgid "Pipeline|Variables"
msgstr ""
msgid "Pipeline|View commit"
-msgstr ""
+msgstr "Vizualizați commit-ul"
msgid "Pipeline|View pipeline"
-msgstr ""
+msgstr "Vizualizați pipeline-ul"
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
@@ -27655,9 +28339,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27712,8 +28393,8 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
-msgstr ""
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
+msgstr "Indică orice linkuri doriți: documentație, fișiere binare construite sau alte materiale conexe. Acestea pot fi linkuri interne sau externe din instanța GitLab. Fiecare URL și titlu de link trebuie să fie unice."
msgid "Policies"
msgstr "Politici"
@@ -27740,7 +28421,7 @@ msgid "PolicyRuleMultiSelect|Select all"
msgstr ""
msgid "Polling interval multiplier"
-msgstr ""
+msgstr "Multiplicatorul intervalului de sondare"
msgid "Popularity"
msgstr ""
@@ -27757,8 +28438,8 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
-msgstr ""
+msgid "Pre-defined push rules"
+msgstr "Reguli push predefinite"
msgid "Preferences"
msgstr ""
@@ -27794,7 +28475,7 @@ msgid "Preferences|Enable Gitpod integration"
msgstr ""
msgid "Preferences|Enable integrated code intelligence on code views"
-msgstr ""
+msgstr "Activați inteligența codului integrată în vizualizările de cod"
msgid "Preferences|Failed to save preferences."
msgstr ""
@@ -27865,6 +28546,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr "Pregătirea raportului pentru scanare."
+
msgid "Prev"
msgstr ""
@@ -27902,7 +28586,7 @@ msgid "Preview changes"
msgstr ""
msgid "Preview payload"
-msgstr ""
+msgstr "Vizualizare payload"
msgid "Previous Artifacts"
msgstr ""
@@ -27965,7 +28649,7 @@ msgid "Private projects Minutes cost factor"
msgstr ""
msgid "Private projects can be created in your personal namespace with:"
-msgstr ""
+msgstr "Proiectele private pot fi create în spațiul dvs. de nume personal cu:"
msgid "Problem with %{name} command: %{message}."
msgstr ""
@@ -27977,7 +28661,7 @@ msgid "Product Analytics"
msgstr ""
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
-msgstr ""
+msgstr "În prezent, nu există date pentru acest tip de grafic. Vă rugăm să consultați fila „Configurare†dacă nu ați configurat deja instrumentul de analiză a produselor."
msgid "Productivity"
msgstr ""
@@ -28052,10 +28736,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 "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."
+msgstr "Sunteți pe cale să ștergeți definitiv %{yourAccount} și toate problemele, merge request-urile și grupurile legate de contul dumneavoastră. După ce confirmați %{deleteAccount}, această operațiune nu mai poate fi anulată, nici contul recuperat."
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
-msgstr ""
+msgstr "Veți schimba numele de utilizator %{currentUsernameBold} în %{newUsernameBold}. Profilul și proiectele vor fi redirecționate către spațiul de nume %{newUsername}, dar această redirecționare va expira odată ce spațiul de nume %{currentUsername} este înregistrat de un alt utilizator sau grup. Vă rugăm să actualizați telecomenzile repozitoriului Git cât mai curând posibil."
msgid "Profiles|%{provider} Active"
msgstr ""
@@ -28174,6 +28858,9 @@ msgstr "Introduceți parola pentru a confirma modificarea e-mail-ului"
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28195,9 +28882,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28217,7 +28901,7 @@ msgid "Profiles|Invalid password"
msgstr ""
msgid "Profiles|Invalid username"
-msgstr ""
+msgstr "Nume de utilizator invalid"
msgid "Profiles|Job title"
msgstr ""
@@ -28234,6 +28918,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28339,6 +29026,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28420,9 +29110,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr "https://website.com"
@@ -28598,10 +29285,10 @@ msgid "Project uploads"
msgstr ""
msgid "Project visibility level will be changed to match namespace rules when transferring to a group."
-msgstr "Nivelul vizibilității proiectului va fi modificat pentru a se potrivi cu regulile spațiului de nume atunci când se transferă la un grup."
+msgstr "Nivelul de vizibilitate al proiectului va fi modificat pentru a se potrivi cu regulile spațiului de nume atunci când se transferă într-un grup."
msgid "Project was not found or you do not have permission to add this project to Security Dashboards."
-msgstr ""
+msgstr "Proiectul nu a fost găsit sau nu aveți permisiunea de a adăuga acest proiect în Tablourile de bord de securitate."
msgid "Project: %{name}"
msgstr ""
@@ -28646,10 +29333,10 @@ msgid "ProjectOverview|Star"
msgstr ""
msgid "ProjectOverview|Starrer"
-msgstr "Starrer"
+msgstr "Favorit de"
msgid "ProjectOverview|Starrers"
-msgstr ""
+msgstr "Favorit de"
msgid "ProjectOverview|Unstar"
msgstr ""
@@ -28826,7 +29513,7 @@ msgid "ProjectService|Trigger event when a deployment starts or finishes."
msgstr ""
msgid "ProjectService|Trigger event when a merge request is created, updated, or merged."
-msgstr "Declanșați evenimentul atunci când un merge request este creat, actualizat sau îmbinat."
+msgstr "Declanșează evenimentul atunci când un merge request este creat, actualizat sau fuzionat."
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
@@ -28859,7 +29546,7 @@ msgid "ProjectSettings|Allow"
msgstr ""
msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
-msgstr ""
+msgstr "Afișați întotdeauna butoanele emoji de recompensă cu degetul mare în sus și degetul mare în jos pe probleme, merge request-uri și fragmente de cod."
msgid "ProjectSettings|Analytics"
msgstr ""
@@ -28883,7 +29570,7 @@ msgid "ProjectSettings|Choose the method, options, checks, and squash options fo
msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, and merge suggestions."
-msgstr ""
+msgstr "Alegeți-vă metoda de îmbinare, opțiunile de îmbinare, verificările de îmbinare și sugestiile de îmbinare."
msgid "ProjectSettings|Choose your merge method, options, checks, and squash options."
msgstr ""
@@ -28904,7 +29591,7 @@ msgid "ProjectSettings|Determine what happens to the commit history when you mer
msgstr "Determinați ce se întâmplă cu istoricul de commit-uri atunci când îmbinați un merge request."
msgid "ProjectSettings|Disable email notifications"
-msgstr ""
+msgstr "Dezactivați notificările prin e-mail"
msgid "ProjectSettings|Do not allow"
msgstr ""
@@ -28922,12 +29609,12 @@ msgid "ProjectSettings|Encourage"
msgstr ""
msgid "ProjectSettings|Every merge creates a merge commit."
-msgstr ""
+msgstr "Fiecare îmbinare creează un commit de îmbinare."
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28943,13 +29630,13 @@ msgid "ProjectSettings|Failed to update tag!"
msgstr ""
msgid "ProjectSettings|Fast-forward merge"
-msgstr ""
+msgstr "ÃŽmbinare fast-forward"
msgid "ProjectSettings|Fast-forward merges only."
-msgstr ""
+msgstr "Numai îmbinări fast-forward."
msgid "ProjectSettings|Flexible tool to collaboratively develop ideas and plan work in this project."
-msgstr "Unealtă flexibilă pentru a dezvolta idei colaborativ și de a planifica muncă în acest proiect."
+msgstr "Instrument flexibil pentru dezvoltarea în colaborare a ideilor și planificarea activității în cadrul acestui proiect."
msgid "ProjectSettings|Forks"
msgstr ""
@@ -28967,7 +29654,7 @@ msgid "ProjectSettings|Housekeeping, export, archive, change path, transfer, and
msgstr ""
msgid "ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts."
-msgstr ""
+msgstr "În cazul în care merge train-urile sunt activate, îmbinarea este posibilă numai dacă un rebase al ramurii poate fi făcut fără conflicte."
msgid "ProjectSettings|Internal"
msgstr ""
@@ -29000,19 +29687,19 @@ msgid "ProjectSettings|Merge checks"
msgstr ""
msgid "ProjectSettings|Merge commit"
-msgstr ""
+msgstr "Commit de fuziune"
msgid "ProjectSettings|Merge commit message template"
msgstr ""
msgid "ProjectSettings|Merge commit with semi-linear history"
-msgstr ""
+msgstr "Commit de fuziune cu istoric semiliniar"
msgid "ProjectSettings|Merge method"
msgstr ""
msgid "ProjectSettings|Merge options"
-msgstr ""
+msgstr "Opțiuni de îmbinare"
msgid "ProjectSettings|Merge requests"
msgstr ""
@@ -29026,11 +29713,14 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr "Îmbinarea este permisă numai atunci când ramura sursă este actualizată cu cea țintă."
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
msgid "ProjectSettings|Note: The container registry is always visible when a project is public and the container registry is set to '%{access_level_description}'"
-msgstr "Notă: Registrul containerului este întotdeauna vizibil când un proiect este public și registrul containerului este setat la \"%{access_level_description}\""
+msgstr "Notă: Registrul containerului este întotdeauna vizibil când un proiect este public È™i registrul containerului este setat la „%{access_level_description}â€"
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
@@ -29096,13 +29786,13 @@ msgid "ProjectSettings|Show default award emojis"
msgstr ""
msgid "ProjectSettings|Show link to create or view a merge request when pushing from the command line"
-msgstr "Afișați linkul pentru a crea sau a vizualiza un merge request atunci când publicați din linia de comandă"
+msgstr "Afișați linkul pentru a crea sau a vizualiza un merge request atunci când se face push din linia de comandă"
msgid "ProjectSettings|Skipped pipelines are considered successful"
msgstr ""
msgid "ProjectSettings|Snippets"
-msgstr ""
+msgstr "Fragmente de cod"
msgid "ProjectSettings|Squash commit message template"
msgstr ""
@@ -29144,13 +29834,13 @@ msgid "ProjectSettings|This project"
msgstr ""
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
-msgstr ""
+msgstr "Această setare este aplicată la nivel de server și poate fi suprascrisă de un administrator."
msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
-msgstr ""
+msgstr "Această setare este aplicată la nivel de server, dar a fost suprascrisă pentru acest proiect."
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
-msgstr ""
+msgstr "Această setare va fi aplicată tuturor proiectelor, cu excepția cazului în care este suprascrisă de un administrator."
msgid "ProjectSettings|Transfer project"
msgstr ""
@@ -29159,7 +29849,7 @@ msgid "ProjectSettings|Upstream project"
msgstr ""
msgid "ProjectSettings|Used for every new merge request."
-msgstr "Folosit pentru fiecare merge request nou."
+msgstr "Utilizat pentru fiecare nou merge request."
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
@@ -29171,13 +29861,13 @@ msgid "ProjectSettings|Users can request access"
msgstr ""
msgid "ProjectSettings|View and edit files in this project."
-msgstr ""
+msgstr "Vizualizați și editați fișierele din acest proiect."
msgid "ProjectSettings|View and edit files in this project. Non-project members have only read access."
msgstr ""
msgid "ProjectSettings|View project analytics."
-msgstr ""
+msgstr "Vizualizați analizele proiectului."
msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
@@ -29197,8 +29887,11 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr "Când îmbinarea semiliniară nu este posibilă, utilizatorul i se oferă opțiunea de a efectua un rebase."
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
-msgstr ""
+msgstr "Atunci când există un conflict de îmbinare, utilizatorului i se oferă opțiunea de a face un rebase."
msgid "ProjectSettings|Wiki"
msgstr ""
@@ -29260,6 +29953,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29278,9 +29974,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29375,7 +30068,7 @@ msgid "ProjectsNew|Allows you to immediately clone this project’s repository.
msgstr ""
msgid "ProjectsNew|Analyze your source code for known security vulnerabilities."
-msgstr ""
+msgstr "Analizează codul dvs. sursă pentru vulnerabilități cunoscute."
msgid "ProjectsNew|Connect your external repository to GitLab CI/CD."
msgstr ""
@@ -29405,7 +30098,7 @@ msgid "ProjectsNew|Description format"
msgstr ""
msgid "ProjectsNew|Enable Static Application Security Testing (SAST)"
-msgstr ""
+msgstr "Activați testarea statică a securității aplicațiilor (SAST)"
msgid "ProjectsNew|Import"
msgstr ""
@@ -29425,6 +30118,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29441,7 +30140,7 @@ msgid "ProjectsNew|Visibility Level"
msgstr ""
msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr ""
+msgstr "Doriți să adăpostiți mai multe proiecte dependente în același spațiu de nume? %{link_start}Creați un grup.%{link_end}"
msgid "Prometheus"
msgstr ""
@@ -29504,7 +30203,7 @@ msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
-msgstr ""
+msgstr "Monitorizați starea de sănătate a aplicației cu metrici și tablouri de bord Prometheus"
msgid "PrometheusService|More information"
msgstr ""
@@ -29528,7 +30227,7 @@ msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
-msgstr ""
+msgstr "URL-ul de bază a API-ului Prometheus."
msgid "PrometheusService|The contents of the credentials.json file of your service account."
msgstr ""
@@ -29591,7 +30290,7 @@ msgid "Promotions|Add %{link_start} description templates %{link_end} to help yo
msgstr ""
msgid "Promotions|Add Group Webhooks and GitLab Enterprise Edition."
-msgstr "Adăugați webhook-uri grup și GitLab Enterprise Edition."
+msgstr "Adăugați Webhook-uri de grup și GitLab Enterprise Edition."
msgid "Promotions|Better Protected Branches"
msgstr "Ramuri mai bine protejate"
@@ -29606,7 +30305,7 @@ msgid "Promotions|Buy GitLab Enterprise Edition"
msgstr ""
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
-msgstr ""
+msgstr "Contactați un proprietar al grupului %{namespace_name} pentru a actualiza planul."
msgid "Promotions|Contact owner %{link_start}%{owner_name}%{link_end} to upgrade the plan."
msgstr ""
@@ -29696,7 +30395,7 @@ msgid "Promotions|Upgrade your plan to activate Audit Events."
msgstr "Actualizați-vă planul pentru a activa Evenimentele Audit."
msgid "Promotions|Upgrade your plan to activate Group Webhooks."
-msgstr "Actualizați-vă planul pentru a activa webhook-uri grup."
+msgstr "Actualizați-vă planul pentru a activa Webhook-uri de grup."
msgid "Promotions|Upgrade your plan to improve merge requests."
msgstr "Actualizați-vă planul pentru a îmbunătăți cererile de îmbinare."
@@ -29708,7 +30407,7 @@ msgid "Promotions|Upgrade your plan to improve repositories."
msgstr "Actualizați-vă planul pentru a îmbunătăți repozitoriile."
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 "Webhook-urile vă permit să declanșați un URL dacă, de exemplu, cod nou este împins sau o nouă problemă este creată. Puteți configura webhook-urile să asculte pentru evenimente specifice, ca împingeri, probleme, sau cereri de îmbinare. Webhook-uri de grup se aplică la toate proiectele dintr-un grup, permițându-vă să standardizați funcționalitatea webhook în intregul dvs. grup."
+msgstr "Webhook-urile vă permit să declanșați o adresă URL dacă, de exemplu, este publicat un cod nou sau este creată o problemă nouă. Puteți configura webhook-urile pentru a asculta evenimente specifice, cum ar fi push-uri, probleme sau merge request-uri. Webhook-urile de grup se vor aplica la toate proiectele dintr-un grup, permițându-vă să standardizați funcționalitatea webhook-urilor în întregul dvs. grup."
msgid "Promotions|Weight"
msgstr ""
@@ -29930,7 +30629,7 @@ msgid "ProtectedTag|default"
msgstr ""
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
-msgstr ""
+msgstr "Sfat pro: %{linkStart}Auto DevOps%{linkEnd} folosește clusterele Kubernetes pentru a vă implementa codul!"
msgid "Provide a number our sales team can use to call you."
msgstr ""
@@ -29939,10 +30638,10 @@ msgid "Provider"
msgstr ""
msgid "Provision instructions"
-msgstr ""
+msgstr "Instrucțiuni de furnizare"
msgid "Provisioned by:"
-msgstr ""
+msgstr "Furnizat de:"
msgid "Proxy support for this API is not available currently"
msgstr ""
@@ -29993,10 +30692,10 @@ msgid "Pull"
msgstr ""
msgid "Pull requests from fork are not supported"
-msgstr ""
+msgstr "Pull request-urile din fork nu sunt acceptate"
msgid "Puma is running with a thread count above 1 and the Rugged service is enabled. This may decrease performance in some environments. See our %{link_start}documentation%{link_end} for details of this issue."
-msgstr ""
+msgstr "Puma rulează cu un număr de subiecte mai mare de 1 și serviciul Rugged este activat. Acest lucru poate scădea performanța în anumite medii. Consultați %{link_start}documentația%{link_end} noastră pentru detalii despre această problemă."
msgid "Purchase more minutes"
msgstr ""
@@ -30034,8 +30733,11 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
-msgstr ""
+msgid "Push rules"
+msgstr "Reguli pentru push"
+
+msgid "Push the target branch up to GitLab."
+msgstr "Faceți push ramurii țintă către GitLab."
msgid "Push to create a project"
msgstr ""
@@ -30101,10 +30803,10 @@ msgid "PushoverService|%{user_name} pushed new branch \"%{ref}\"."
msgstr ""
msgid "PushoverService|Enter your application key."
-msgstr "Introduceți-vă cheia de aplicație."
+msgstr "Introduceți cheia aplicației."
msgid "PushoverService|Enter your user key."
-msgstr "Introduceți-vă cheia de utilizator."
+msgstr "Introduceți cheia dvs. de utilizator."
msgid "PushoverService|Get real-time notifications on your device."
msgstr ""
@@ -30152,7 +30854,7 @@ msgid "Quick range"
msgstr ""
msgid "Quickly and easily edit multiple files in your project."
-msgstr ""
+msgstr "Editați rapid și ușor mai multe fișiere din proiectul dumneavoastră."
msgid "Quota of CI/CD minutes"
msgstr ""
@@ -30182,7 +30884,7 @@ msgid "Rate limit access to specified paths."
msgstr ""
msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
-msgstr ""
+msgstr "Limitele de viteză pot ajuta la reducerea volumului de solicitări (de exemplu, de la crawlerele sau roboții abuzivi)."
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -30239,19 +30941,19 @@ msgid "Reauthenticating with SAML provider."
msgstr ""
msgid "Rebase"
-msgstr ""
+msgstr "Rebase"
msgid "Rebase in progress"
-msgstr ""
+msgstr "Rebase în desfășurare"
msgid "Rebase source branch"
-msgstr ""
+msgstr "Faceți un rebase al ramurii sursă"
msgid "Rebase source branch on the target branch."
-msgstr ""
+msgstr "Faceți un rebase al ramurii sursă pe ramura țintă."
msgid "Rebase without pipeline"
-msgstr ""
+msgstr "Rebase fără pipeline"
msgid "Recaptcha verified?"
msgstr ""
@@ -30464,13 +31166,19 @@ msgid "Registry setup"
msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
-msgstr ""
+msgstr "Starea de reindexare: %{status} (Multiplicatorul tranșelor: %{multiplier}, Maximum de tranșe care rulează: %{max_slices})"
+
+msgid "Reject"
+msgstr "Respingeți"
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr "Se referă la %{issuable_type} %{add_related_issue_link}"
+
msgid "Related feature flags"
-msgstr ""
+msgstr "Feature Flags asociate"
msgid "Related issues"
msgstr ""
@@ -30478,9 +31186,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30539,7 +31244,7 @@ msgid "Releases"
msgstr ""
msgid "Releases are based on Git tags and mark specific points in a project's development history. They can contain information about the type of changes and can also deliver binaries, like compiled versions of your software."
-msgstr ""
+msgstr "Lansările se bazează pe etichete Git și marchează puncte specifice din istoricul dezvoltării unui proiect. Ele pot conține informații despre tipul de modificări și pot furniza, de asemenea, binare, cum ar fi versiunile compilate ale software-ului dumneavoastră."
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 ""
@@ -30566,7 +31271,7 @@ msgid "Remediations"
msgstr ""
msgid "Remember me"
-msgstr ""
+msgstr "Amintiți-vă de mine"
msgid "Remind later"
msgstr ""
@@ -30644,7 +31349,7 @@ msgid "Remove favicon"
msgstr ""
msgid "Remove file"
-msgstr "Ștergeți fișierul"
+msgstr "Înlăturați fișierul"
msgid "Remove fork relationship"
msgstr ""
@@ -30674,7 +31379,7 @@ msgid "Remove link"
msgstr ""
msgid "Remove list"
-msgstr "Ștergeți lista"
+msgstr "Înlăturați lista"
msgid "Remove log"
msgstr ""
@@ -30712,6 +31417,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30922,8 +31630,11 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
-msgstr ""
+msgid "Report couldn't be prepared."
+msgstr "Raportul nu a putut fi pregătit."
+
+msgid "Report for the scan has been removed from the database."
+msgstr "Raportul pentru scanare a fost eliminat din baza de date."
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr ""
@@ -30938,22 +31649,22 @@ msgid "Reporting"
msgstr ""
msgid "Reports|%{combinedString} and %{resolvedString}"
-msgstr ""
+msgstr "%{combinedString} și %{resolvedString}"
msgid "Reports|%{recentlyFailed} out of %{failed} failed test has failed more than once in the last 14 days"
-msgstr ""
+msgstr "%{recentlyFailed} din %{failed} din testele eșuate a eșuat mai mult de o dată în ultimele 14 zile"
msgid "Reports|%{recentlyFailed} out of %{failed} failed tests has failed more than once in the last 14 days"
msgid_plural "Reports|%{recentlyFailed} out of %{failed} failed tests have failed more than once in the last 14 days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{recentlyFailed} din %{failed} din testele eșuate a eșuat mai mult de o dată în ultimele 14 zile"
+msgstr[1] "%{recentlyFailed} din %{failed} din testele eșuate au eșuat mai mult de o dată în ultimele 14 zile"
+msgstr[2] "%{recentlyFailed} din %{failed} din testele eșuate au eșuat mai mult de o dată în ultimele 14 zile"
msgid "Reports|Accessibility scanning detected %d issue for the source branch only"
msgid_plural "Reports|Accessibility scanning detected %d issues for the source branch only"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Scanarea accesibilității a detectat %d problemă numai pentru ramura sursă"
+msgstr[1] "Scanarea accesibilității a detectat %d probleme numai pentru ramura sursă"
+msgstr[2] "Scanarea accesibilității a detectat %d de probleme numai pentru ramura sursă"
msgid "Reports|Accessibility scanning detected %{strong_start}%{number}%{strong_end} issue for the source branch only"
msgid_plural "Reports|Accessibility scanning detected %{strong_start}%{number}%{strong_end} issues for the source branch only"
@@ -30962,100 +31673,118 @@ msgstr[1] ""
msgstr[2] ""
msgid "Reports|Accessibility scanning detected no issues for the source branch only"
-msgstr ""
+msgstr "Scanarea accesibilității nu a detectat probleme exclusiv pentru ramura sursă"
msgid "Reports|Accessibility scanning failed loading results"
-msgstr ""
+msgstr "Scanarea de accesibilitate nu a reușit să încarce rezultatele"
msgid "Reports|Accessibility scanning results are being parsed"
-msgstr ""
+msgstr "Rezultatele scanării accesibilității sunt analizate"
msgid "Reports|Actions"
-msgstr ""
+msgstr "Acțiuni"
msgid "Reports|Activity"
-msgstr ""
+msgstr "Activitate"
msgid "Reports|An error occurred while loading %{name} results"
-msgstr ""
+msgstr "A apărut o eroare la încărcarea rezultatelor %{name}."
msgid "Reports|An error occurred while loading report"
-msgstr ""
+msgstr "A apărut o eroare în timpul încărcării raportului"
msgid "Reports|Base report parsing error:"
-msgstr ""
+msgstr "Eroare de analiză a raportului de bază:"
msgid "Reports|Classname"
-msgstr ""
+msgstr "Numele clasei"
msgid "Reports|Execution time"
-msgstr ""
+msgstr "Timp de execuție"
msgid "Reports|Failed %{count} time in %{baseBranch} in the last 14 days"
msgid_plural "Reports|Failed %{count} times in %{baseBranch} in the last 14 days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "A eșuat %{count} dată în %{baseBranch} în ultimele 14 zile"
+msgstr[1] "A eșuat de %{count} ori în %{baseBranch} în ultimele 14 zile"
+msgstr[2] "A eșuat de %{count} de ori în %{baseBranch} în ultimele 14 zile"
msgid "Reports|Failed %{count} time in %{base_branch} in the last 14 days"
msgid_plural "Reports|Failed %{count} times in %{base_branch} in the last 14 days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "A eșuat %{count} dată în %{base_branch} în ultimele 14 zile"
+msgstr[1] "A eșuat de %{count} ori în %{base_branch} în ultimele 14 zile"
+msgstr[2] "A eșuat de %{count} de ori în %{base_branch} în ultimele 14 zile"
msgid "Reports|Failure"
-msgstr ""
+msgstr "Eșec"
msgid "Reports|Filename"
+msgstr "Numele fișierului"
+
+msgid "Reports|Full report"
msgstr ""
msgid "Reports|Head report parsing error:"
-msgstr ""
+msgstr "Eroare de analiză a raportului principal:"
msgid "Reports|Identifier"
+msgstr "Identificator"
+
+msgid "Reports|Metrics report scanning detected no new changes"
msgstr ""
msgid "Reports|Metrics reports are loading"
-msgstr ""
+msgstr "Rapoartele de metrici se încarcă"
msgid "Reports|Metrics reports changed on %{numberOfChanges} %{pointsString}"
-msgstr ""
+msgstr "Rapoartele de metrici s-au modificat în %{numberOfChanges} %{pointsString}"
msgid "Reports|Metrics reports did not change"
-msgstr ""
+msgstr "Rapoartele de metrici nu s-au modificat"
msgid "Reports|Metrics reports failed loading results"
+msgstr "Rapoartele de metrici nu au reușit să încarce rezultatele"
+
+msgid "Reports|Metrics reports failed to load results"
msgstr ""
-msgid "Reports|Scanner"
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|Scanner"
+msgstr "Scaner"
+
msgid "Reports|Severity"
-msgstr ""
+msgstr "Severitatea"
msgid "Reports|System output"
-msgstr ""
+msgstr "Ieșirea sistemului"
msgid "Reports|Test summary"
-msgstr ""
+msgstr "Rezumatul testului"
msgid "Reports|Test summary failed loading results"
+msgstr "Rezumatul testului nu a reușit să încarce rezultatele"
+
+msgid "Reports|Test summary failed to load results"
msgstr ""
msgid "Reports|Test summary results are being parsed"
+msgstr "Rezultatele rezumatului testului sunt analizate"
+
+msgid "Reports|Test summary results are loading"
msgstr ""
msgid "Reports|Tool"
-msgstr ""
+msgstr "Instrument"
msgid "Reports|Vulnerability"
-msgstr ""
+msgstr "Vulnerabilitate"
msgid "Reports|Vulnerability Name"
-msgstr ""
+msgstr "Denumirea vulnerabilității"
msgid "Reports|no changed test results"
-msgstr ""
+msgstr "nu s-au modificat rezultatele testelor"
msgid "Repositories"
msgstr ""
@@ -31109,7 +31838,7 @@ msgid "RepositoriesAnalytics|No test coverage to display"
msgstr ""
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
-msgstr ""
+msgstr "Vă rugăm să selectați un proiect sau mai multe proiecte pentru a afișa cele mai recente date de acoperire a testelor."
msgid "RepositoriesAnalytics|Please select projects to display."
msgstr ""
@@ -31202,7 +31931,7 @@ msgid "Repository update events"
msgstr ""
msgid "Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / Pipeline Artifacts: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}"
-msgstr ""
+msgstr "Repozitoriu: %{counter_repositories} / Wikis: %{counter_wikis} / Artefacte de construcție: %{counter_build_artifacts} / Artefacte de pipeline: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Fragmente de cod: %{counter_snippets} / Pachete: %{counter_packages} / Încărcări: %{counter_uploads}"
msgid "RepositorySettingsAccessLevel|Select"
msgstr ""
@@ -31412,7 +32141,7 @@ msgid "Resolve these conflicts or ask someone with write access to this reposito
msgstr ""
msgid "Resolve thread"
-msgstr ""
+msgstr "Rezolvați subiectul"
msgid "Resolved"
msgstr ""
@@ -31558,8 +32287,8 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
-msgstr ""
+msgid "Review the changes locally."
+msgstr "Examinați modificările la nivel local."
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
msgstr ""
@@ -31621,9 +32350,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31643,10 +32369,10 @@ msgid "Rule name is already taken."
msgstr ""
msgid "Rules that define what git pushes are accepted for a project in this group. All newly created projects in this group will use these settings."
-msgstr ""
+msgstr "Reguli care definesc ce push-uri git sunt acceptate pentru un proiect din acest grup. Toate proiectele nou create în acest grup vor utiliza aceste setări."
msgid "Rules that define what git pushes are accepted for a project. All newly created projects will use these settings."
-msgstr ""
+msgstr "Reguli care definesc ce push-uri git sunt acceptate pentru un proiect. Toate proiectele nou create vor utiliza aceste setări."
msgid "Run %{code_start}git fsck%{code_end} periodically in all project and wiki repositories to look for silent disk corruption issues."
msgstr "Executați %{code_start}git fsck%{code_end} periodic în toate proiectele și repozitoriile wiki pentru a căuta probleme de corupție disc silențioase."
@@ -31655,7 +32381,7 @@ msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Run CI/CD pipelines with Jenkins when you push to a repository, or when a merge request is created, updated, or merged. %{docs_link}"
-msgstr "Rulați conducte CI / CD cu Jenkins atunci când publicați lîntr-un repozitoriu sau când un merge request este creat, actualizat sau îmbinat. %{docs_link}"
+msgstr "Rulați conductele CI/CD cu Jenkins atunci când faceți push către un repozitoriu sau atunci când o cerere de îmbinare este creată, actualizată sau îmbinată. %{docs_link}"
msgid "Run CI/CD pipelines with Jenkins."
msgstr ""
@@ -31675,10 +32401,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
-msgstr ""
+msgid "Runner cannot be deleted, please contact your administrator."
+msgstr "Executorul nu poate fi șters, vă rugăm să vă contactați administratorul."
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31699,6 +32425,24 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31708,7 +32452,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31735,9 +32479,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31750,12 +32506,21 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31765,6 +32530,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31774,18 +32542,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31807,25 +32569,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31834,15 +32602,30 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31876,9 +32659,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31891,21 +32680,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31915,7 +32734,7 @@ msgstr "Executori"
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31936,25 +32755,31 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
msgid "Runners|Stop the runner from accepting new jobs."
-msgstr "Opriți executorul din a accepta noi joburi."
+msgstr "Împiedicați executorul să mai accepte noi joburi."
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31970,10 +32795,10 @@ msgid "Runners|Use Group runners when you want all projects in a group to have a
msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
-msgstr "Utilizați executorul pentru joburi fără etichete, în adiția joburilor etichetate."
+msgstr "Folosiți executorul pentru joburi fără etichete, în plus față de joburile cu etichete."
-msgid "Runners|Use the runner for the currently assigned projects only."
-msgstr "Utilizați executorul numai pentru proiecte atribuite în prezent."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
msgstr "Utilizați executorul pe conducte numai pentru ramuri protejate."
@@ -31990,17 +32815,14 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
msgstr ""
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
-msgstr ""
-
-msgid "Runners|You cannot assign to other projects"
-msgstr ""
+msgstr "Puteți configura un anumit executor pentru a fi utilizat de mai multe proiecte, dar nu puteți face din acesta un executor partajat."
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
msgstr ""
@@ -32035,9 +32857,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32152,10 +32971,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32192,7 +33011,7 @@ msgid "Scheduled Deletion At - %{permanent_deletion_time}"
msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
-msgstr ""
+msgstr "A fost programat un rebase al ramurii %{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 ""
@@ -32219,7 +33038,7 @@ msgid "Scopes"
msgstr ""
msgid "Scopes (select at least one)"
-msgstr "Domenii de aplicare (selectați măcar unul)"
+msgstr "Domenii de aplicare (selectați cel puțin unul)"
msgid "Scopes can't be blank"
msgstr ""
@@ -32291,7 +33110,7 @@ msgid "Search files"
msgstr ""
msgid "Search for Namespace"
-msgstr ""
+msgstr "Căutați spațiul de nume"
msgid "Search for a LDAP group"
msgstr ""
@@ -32347,6 +33166,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr "Limitele ratei de căutare"
+
msgid "Search refs"
msgstr ""
@@ -32402,13 +33224,13 @@ msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
-msgstr ""
+msgstr "Se afișează %{count} %{scope} pentru %{term_element} în fragmentele dvs. de cod personale și de proiect"
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 ""
+msgstr "Se afișează %{from} - %{to} din %{count} %{scope} pentru %{term_element} în fragmentele dvs. de cod personale și de proiect"
msgid "SearchResults|code result"
msgid_plural "SearchResults|code results"
@@ -32460,9 +33282,9 @@ msgstr[2] ""
msgid "SearchResults|snippet"
msgid_plural "SearchResults|snippets"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "fragment de cod"
+msgstr[1] "fragmente de cod"
+msgstr[2] "de fragmente de cod"
msgid "SearchResults|user"
msgid_plural "SearchResults|users"
@@ -32482,6 +33304,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr "Seat-uri deținute"
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32501,11 +33326,20 @@ msgid "Secret"
msgstr ""
msgid "Secret Detection"
-msgstr ""
+msgstr "Detectarea secretelor"
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr "Secure Code Warrior"
+
+msgid "Secure Files"
+msgstr "Fișiere Securizate"
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr "Token sigur care identifică o solicitare stocare externă."
@@ -32519,10 +33353,10 @@ msgid "Security Configuration"
msgstr ""
msgid "Security Dashboard"
-msgstr ""
+msgstr "Tabloul de bord de securitate"
msgid "Security dashboard"
-msgstr ""
+msgstr "Tabloul de bord de securitate"
msgid "Security navigation"
msgstr ""
@@ -32537,7 +33371,7 @@ msgid "SecurityApprovals|A merge request approval is required when a security re
msgstr ""
msgid "SecurityApprovals|A merge request approval is required when test coverage declines."
-msgstr "O aprobare de cerere de îmbinare este necesară când acoperirea testului scade."
+msgstr "O aprobare de merge request este necesară când acoperirea scade."
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ă."
@@ -32573,13 +33407,13 @@ msgid "SecurityConfiguration|%{featureName} merge request creation mutation fail
msgstr ""
msgid "SecurityConfiguration|%{scanType} configuration code snippet"
-msgstr ""
+msgstr "Fragment de cod de configurare %{scanType}"
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
msgid "SecurityConfiguration|Available with Ultimate"
-msgstr ""
+msgstr "Disponibil cu Ultimate"
msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
msgstr ""
@@ -32597,7 +33431,7 @@ msgid "SecurityConfiguration|Configure %{feature}"
msgstr ""
msgid "SecurityConfiguration|Configure with a merge request"
-msgstr ""
+msgstr "Configurați cu un merge request"
msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
msgstr ""
@@ -32627,10 +33461,13 @@ msgid "SecurityConfiguration|Enabled"
msgstr ""
msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups"
-msgstr "Statistici vulnerabilități nivel-înalt de-a lungul proiectelor și grupurilor"
+msgstr "Statistici la nivel înalt privind vulnerabilitatea în cadrul proiectelor și grupurilor"
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:"
+msgstr "Începeți imediat analiza riscurilor și remedierea acestora cu ajutorul funcțiilor de securitate a aplicațiilor. Începeți cu SAST și Detecția de secrete, disponibile pentru toate planurile. Faceți upgrade la Ultimate pentru a obține toate caracteristicile, inclusiv:"
+
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
@@ -32638,14 +33475,14 @@ msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
-msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr "Gestionează profilurile pentru a fi utilizate de scanările DAST."
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
-msgstr "Mai multe tipuri de scanări, incluzând Scanarea Containerului, DAST, Scanarea dependenței, Testarea Fuzz și Conformitatea Licențelor"
+msgstr "Mai multe tipuri de scanare, inclusiv Scanarea de containere, DAST, Scanarea dependențelor, Fuzzing și Conformitatea licențelor"
msgid "SecurityConfiguration|Not enabled"
msgstr ""
@@ -32698,6 +33535,12 @@ msgstr "%{branches}%{plural}"
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr "%{branches} și %{lastBranch}%{plural}"
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32713,11 +33556,17 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr "Toate politicile"
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
-msgstr "A apărut o eroare la desemnarea proiectului dvs. al politicii de securitate"
+msgstr "S-a produs o eroare la atribuirea proiectului dvs. de politică de securitate"
msgid "SecurityOrchestration|An error occurred unassigning your security policy project"
-msgstr ""
+msgstr "S-a produs o eroare la anularea atribuirii proiectului de politică de securitate"
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -32728,12 +33577,21 @@ msgstr "Descriere"
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr "Editați politica"
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32743,6 +33601,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32755,9 +33616,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr "Rețea"
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr "Politică nouă"
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32798,7 +33671,7 @@ msgid "SecurityOrchestration|Policy summary"
msgstr ""
msgid "SecurityOrchestration|Policy type"
-msgstr "Tip politică"
+msgstr "Tipul de politică"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
@@ -32806,6 +33679,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32824,12 +33700,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32848,6 +33733,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr "Selectați un proiect în care veți stoca politicile de securitate. %{linkStart}Mai multe informații.%{linkEnd}"
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr "Selectați proiect de securitate"
@@ -32857,10 +33745,13 @@ msgstr "Ne pare rău, filtrul dvs. nu a produs rezultate"
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32884,6 +33775,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32939,43 +33839,46 @@ msgid "SecurityPolicies|Environment(s)"
msgstr "Mediu (medii)"
msgid "SecurityPolicies|Policy type"
-msgstr ""
+msgstr "Tip de politică"
msgid "SecurityReports|%{count}+ projects"
msgstr ""
msgid "SecurityReports|%{firstProject} and %{secondProject}"
-msgstr ""
+msgstr "%{firstProject} și %{secondProject}"
msgid "SecurityReports|%{firstProject}, %{secondProject}, and %{rest}"
-msgstr ""
+msgstr "%{firstProject}, %{secondProject}, și %{rest}"
msgid "SecurityReports|Add or remove projects to monitor in the security area. Projects included in this list will have their results displayed in the security dashboard and vulnerability report."
-msgstr ""
+msgstr "Adăugați sau eliminați proiecte de monitorizat în zona de securitate. Proiectele incluse în această listă vor avea rezultatele lor afișate în tabloul de bord de securitate și în raportul de vulnerabilitate."
msgid "SecurityReports|Add projects"
-msgstr ""
+msgstr "Adăugați proiecte"
msgid "SecurityReports|All activity"
-msgstr ""
+msgstr "Toată activitatea"
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
-msgstr ""
+msgstr "Deși este rar să nu existe vulnerabilități, se poate întâmpla. Verificați setările pentru a vă asigura că ați configurat corect tabloul de bord."
msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's why we are reaching out to customers like you to help guide what we work on this year for Vulnerability Management. We have a lot of exciting ideas and ask that you assist us by taking a short survey %{boldStart}no longer than 10 minutes%{boldEnd} to evaluate a few of our potential features."
-msgstr ""
+msgstr "La GitLab, totul se bazează pe iterație și feedback. De aceea, ne adresăm clienților ca dvs. pentru a ne ajuta să ne ghidăm la ceea ce vom lucra în acest an pentru Managementul vulnerabilităților. Avem o mulțime de idei interesante și vă rugăm să ne ajutați răspunzând la un scurt sondaj %{boldStart}care nu durează mai mult de 10 minute%{boldEnd} pentru a evalua câteva dintre caracteristicile noastre potențiale."
msgid "SecurityReports|Change status"
+msgstr "Schimbă starea"
+
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
-msgstr ""
+msgstr "Comentariu adăugat la „%{vulnerabilityName}â€"
msgid "SecurityReports|Comment deleted on '%{vulnerabilityName}'"
-msgstr ""
+msgstr "Comentariu È™ters la „%{vulnerabilityName}â€"
msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
-msgstr ""
+msgstr "Comentariu editat la „%{vulnerabilityName}â€"
msgid "SecurityReports|Configure security testing"
msgstr ""
@@ -33107,13 +34010,16 @@ msgid "SecurityReports|Projects added"
msgstr ""
msgid "SecurityReports|Remove project from dashboard"
+msgstr "Eliminați proiectul din tabloul de bord"
+
+msgid "SecurityReports|Report has expired"
msgstr ""
msgid "SecurityReports|Scan details"
msgstr ""
msgid "SecurityReports|Security Dashboard"
-msgstr ""
+msgstr "Tablou de bord de securitate"
msgid "SecurityReports|Security reports can only be accessed by authorized users."
msgstr ""
@@ -33133,7 +34039,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33145,16 +34051,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33214,6 +34123,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33226,15 +34138,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33271,15 +34186,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
+msgstr "Selectați un framework de conformitate care să se aplice acestui proiect. %{linkStart}Cum se adaugă acestea?%{linkEnd}"
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"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33287,7 +34199,7 @@ msgid "Select a milestone"
msgstr ""
msgid "Select a new namespace"
-msgstr ""
+msgstr "Selectați un nou spațiu de nume"
msgid "Select a project"
msgstr ""
@@ -33305,7 +34217,7 @@ msgid "Select a template repository"
msgstr ""
msgid "Select a template type"
-msgstr ""
+msgstr "Selectați un tip de șablon"
msgid "Select a time zone"
msgstr "Selectați un fus orar"
@@ -33374,7 +34286,7 @@ msgid "Select project"
msgstr ""
msgid "Select project and zone to choose machine type"
-msgstr ""
+msgstr "Selectați proiectul și zona pentru a alege tipul de mașină"
msgid "Select project to choose zone"
msgstr ""
@@ -33418,11 +34330,14 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr "Selectați ramura sau eticheta țintă"
+
msgid "Select timezone"
msgstr ""
msgid "Select type"
-msgstr ""
+msgstr "Selectați tipul"
msgid "Selected"
msgstr ""
@@ -33431,7 +34346,7 @@ msgid "Selected commits"
msgstr ""
msgid "Selected levels cannot be used by non-admin users for groups, projects or snippets. If the public level is restricted, user profiles are only visible to logged in users."
-msgstr ""
+msgstr "Nivelele selectate nu pot fi utilizate de utilizatorii care nu sunt administratori pentru grupuri, proiecte sau fragmente de cod. Dacă nivelul public este restricționat, profilurile utilizatorilor sunt vizibile numai pentru utilizatorii conectați."
msgid "Selected projects"
msgstr ""
@@ -33494,7 +34409,7 @@ msgid "Send email"
msgstr ""
msgid "Send email in multipart format (HTML and plain text). Uncheck to send email messages in plain text only."
-msgstr "Trimiteți e-mail în format multipart (HTML și text brut). Debifați pentru a trimite mesaje e-mail numai în text brut."
+msgstr "Trimiteți e-mailuri în format multipart (HTML și text simplu). Debifați pentru a trimite mesajele de e-mail numai în format text simplu."
msgid "Send email notification"
msgstr ""
@@ -33527,7 +34442,7 @@ msgid "Sentry"
msgstr ""
msgid "Sentry API URL"
-msgstr ""
+msgstr "URL-ul API-ului Sentry"
msgid "Sentry event"
msgstr ""
@@ -33614,7 +34529,7 @@ msgid "Serverless|The deploy job has not finished."
msgstr ""
msgid "Serverless|The functions listed in the %{startTag}serverless.yml%{endTag} file don't match the namespace of your cluster."
-msgstr ""
+msgstr "Funcțiile enumerate în fișierul %{startTag}serverless.yml%{endTag} nu se potrivesc cu spațiul de nume al clusterului dumneavoastră."
msgid "Serverless|There is currently no function data available from Knative. This could be for a variety of reasons including:"
msgstr ""
@@ -33641,7 +34556,7 @@ msgid "Service Desk"
msgstr ""
msgid "Service Desk allows people to create issues in your GitLab instance without their own user account. It provides a unique email address for end users to create issues in a project. Replies can be sent either through the GitLab interface or by email. End users only see threads through email."
-msgstr ""
+msgstr "Service Desk permite oamenilor să creeze probleme în instanța GitLab fără a avea propriul cont de utilizator. Acesta oferă o adresă de e-mail unică pentru ca utilizatorii finali să creeze probleme într-un proiect. Răspunsurile pot fi trimise fie prin interfața GitLab, fie prin e-mail. Utilizatorii finali văd subiectele doar prin e-mail."
msgid "Service account generated successfully"
msgstr ""
@@ -33689,7 +34604,7 @@ msgid "ServicePing|Turn on service ping"
msgstr "Activați ping serviciu"
msgid "ServicePing|Turn on service ping to review instance-level analytics."
-msgstr "Porniți ping serviciu pentru a revizui analitici la nivel instanță."
+msgstr "Activați ping-ul serviciului pentru a revizui analizele la nivel de instanță."
msgid "Services"
msgstr ""
@@ -33749,11 +34664,14 @@ 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 ""
+msgstr "Setați proiectele și limitele maxime de dimensiune, durata sesiunii, opțiunile utilizatorului și verificați disponibilitatea caracteristicilor pentru planul spațiului de nume."
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr "Setați limitele ratei căutărilor efectuate prin solicitări web sau API."
+
msgid "Set severity"
msgstr ""
@@ -33799,6 +34717,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr "Setați acest număr la 0 pentru a dezactiva limita."
+
msgid "Set time estimate"
msgstr ""
@@ -33844,9 +34765,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33980,7 +34898,7 @@ msgid "Shared runners help link"
msgstr ""
msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
-msgstr ""
+msgstr "Prin resetarea minutelor de pipeline pentru acest spațiu de nume, minutele utilizate în prezent vor fi setate la zero."
msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
msgstr ""
@@ -34025,7 +34943,7 @@ msgid "Show all activity"
msgstr ""
msgid "Show all breadcrumbs"
-msgstr ""
+msgstr "Afișați toate breadcrumb-urile"
msgid "Show all epics"
msgstr ""
@@ -34102,6 +35020,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr "Afișare subiecte"
+
msgid "Show whitespace changes"
msgstr ""
@@ -34270,6 +35191,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr "Conectat la GitLab"
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34376,7 +35300,7 @@ msgid "SlackService|Perform common operations in this project by entering slash
msgstr ""
msgid "Slice multiplier"
-msgstr ""
+msgstr "Multiplicator de tranșe"
msgid "Smartcard"
msgstr ""
@@ -34385,55 +35309,55 @@ msgid "Smartcard authentication failed: client certificate header is missing."
msgstr ""
msgid "Snippet"
-msgstr ""
+msgstr "Fragment de cod"
msgid "Snippets"
-msgstr ""
+msgstr "Fragmente de cod"
msgid "Snippets with non-text files can only be edited via Git."
-msgstr ""
+msgstr "Fragmentele de cod cu fișiere non-text pot fi editate numai prin Git."
msgid "SnippetsEmptyState|Code snippets"
-msgstr ""
+msgstr "Fragmente de cod"
msgid "SnippetsEmptyState|Documentation"
-msgstr ""
+msgstr "Documentație"
msgid "SnippetsEmptyState|New snippet"
-msgstr ""
+msgstr "Fragment de cod nou"
msgid "SnippetsEmptyState|No snippets found"
-msgstr ""
+msgstr "Nu au fost găsite fragmente de cod"
msgid "SnippetsEmptyState|Store, share, and embed small pieces of code and text."
-msgstr ""
+msgstr "Stochează, partajează și integrează bucăți mici de cod și text."
msgid "SnippetsEmptyState|There are no snippets to show."
-msgstr ""
+msgstr "Nu există fragmente de cod de afișat."
msgid "Snippets|%{spammable_titlecase} was submitted to Akismet successfully."
-msgstr ""
+msgstr "%{spammable_titlecase} a fost trimis la Akismet cu succes."
msgid "Snippets|Add another file %{num}/%{total}"
-msgstr ""
+msgstr "Adăugați alt fișier %{num}/%{total}"
msgid "Snippets|Delete file"
-msgstr ""
+msgstr "Ștergeți fișierul"
msgid "Snippets|Description (optional)"
-msgstr ""
+msgstr "Descriere (opțional)"
msgid "Snippets|Error with Akismet. Please check the logs for more info."
-msgstr ""
+msgstr "Eroare cu Akismet. Vă rugăm să verificați jurnalele pentru mai multe informații."
msgid "Snippets|Files"
-msgstr ""
+msgstr "Fișiere"
msgid "Snippets|Give your file a name to add code highlighting, e.g. example.rb for Ruby"
-msgstr ""
+msgstr "Dați fișierului dvs. un nume pentru adăugarea evidențierii codului, de exemplu, example.rb pentru Ruby"
msgid "Snippets|Optionally add a description about what your snippet does or how to use it…"
-msgstr ""
+msgstr "Adăugați opțional o descriere despre ceea ce face fragmentul dvs. de cod sau despre cum să-l utilizați…"
msgid "Snowplow"
msgstr ""
@@ -34441,6 +35365,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr "Unele acțiuni elimină cererile de atenție, cum ar fi aprobarea unui revizor sau îmbinarea unui merge request de către cineva."
+
msgid "Some changes are not shown"
msgstr ""
@@ -34450,6 +35377,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr "Cineva a editat fișierul în același timp cu dumneavoastră. Vă rugăm să verificați %{link_start}fișierul %{icon}%{link_end} și să vă asigurați că modificările dvs. nu vor elimina neintenționat modificările lor."
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34489,9 +35419,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34624,9 +35551,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34634,10 +35558,10 @@ msgid "Something went wrong with your automatic subscription renewal."
msgstr ""
msgid "Something went wrong, unable to add %{project} to dashboard"
-msgstr ""
+msgstr "Ceva nu a mers bine, nu se poate adăuga %{project} la tabloul de bord"
msgid "Something went wrong, unable to add projects to dashboard"
-msgstr ""
+msgstr "Ceva nu a funcționat, nu se pot adăuga proiecte la tabloul de bord"
msgid "Something went wrong, unable to delete project"
msgstr ""
@@ -34775,7 +35699,7 @@ msgid "SortOptions|Oldest sign in"
msgstr ""
msgid "SortOptions|Oldest starred"
-msgstr ""
+msgstr "Cea mai veche favorizare"
msgid "SortOptions|Oldest updated"
msgstr ""
@@ -34796,7 +35720,7 @@ msgid "SortOptions|Recent sign in"
msgstr ""
msgid "SortOptions|Recently starred"
-msgstr ""
+msgstr "Cea mai recentă favorizare"
msgid "SortOptions|Size"
msgstr ""
@@ -34823,7 +35747,7 @@ msgid "SortOptions|Title"
msgstr ""
msgid "SortOptions|Type"
-msgstr ""
+msgstr "Tip"
msgid "SortOptions|Version"
msgstr ""
@@ -34898,13 +35822,13 @@ msgid "SourcegraphAdmin|Enable Sourcegraph"
msgstr ""
msgid "SourcegraphAdmin|Enable code intelligence powered by %{link_start}Sourcegraph%{link_end} on your GitLab instance's code views and merge requests."
-msgstr ""
+msgstr "Activați inteligența codului alimentată de %{link_start}Sourcegraph%{link_end} în vizualizările de cod și merge request-urile instanței dvs. GitLab."
msgid "SourcegraphAdmin|Learn more."
msgstr ""
msgid "SourcegraphAdmin|Only public projects have code intelligence enabled and communicate with Sourcegraph."
-msgstr ""
+msgstr "Numai proiectele publice au activată inteligența codului și pot să comunice cu Sourcegraph."
msgid "SourcegraphAdmin|Save changes"
msgstr ""
@@ -34970,7 +35894,7 @@ msgid "Stack trace"
msgstr ""
msgid "Stacktrace snippet"
-msgstr ""
+msgstr "Fragment de cod de urmărire a stivei"
msgid "Stage"
msgstr ""
@@ -34991,22 +35915,22 @@ msgid "StarProject|Star"
msgstr ""
msgid "Starred Projects"
-msgstr ""
+msgstr "Proiecte favorite"
msgid "Starred Projects' Activity"
-msgstr ""
+msgstr "Activitatea proiectelor favorite"
msgid "Starred projects"
-msgstr ""
+msgstr "Proiecte favorite"
msgid "StarredProjectsEmptyState|Visit a project page and press on a star icon. Then, you can find the project on this page."
-msgstr ""
+msgstr "Vizitați pagina unui proiect și apăsați pe o pictogramă cu stea. Apoi, puteți găsi proiectul pe această pagină."
msgid "StarredProjectsEmptyState|You don't have starred projects yet."
-msgstr ""
+msgstr "Nu aveți încă proiecte favorite."
msgid "Starrers"
-msgstr ""
+msgstr "Favorit de"
msgid "Stars"
msgstr ""
@@ -35050,6 +35974,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr "Începeți să introduceți modificările și vom genera un fișier YAML pe care să-l adăugați în repozitoriul dvs."
+
msgid "Start merge train"
msgstr ""
@@ -35063,7 +35990,7 @@ msgid "Start search"
msgstr ""
msgid "Start thread"
-msgstr ""
+msgstr "Începeți subiectul"
msgid "Start your Free Ultimate Trial"
msgstr ""
@@ -35114,7 +36041,7 @@ msgid "State/Province/City"
msgstr ""
msgid "Static Application Security Testing (SAST)"
-msgstr ""
+msgstr "Testarea statică a securității aplicațiilor (SAST)"
msgid "StaticSiteEditor|1. Add a clear title to describe the change."
msgstr ""
@@ -35194,6 +36121,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35266,9 +36196,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35317,17 +36244,20 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr "Etapa %{currentStep} din %{stepCount}"
+
msgid "Step 1."
-msgstr ""
+msgstr "Etapa 1."
msgid "Step 2."
-msgstr ""
+msgstr "Etapa 2."
msgid "Step 3."
-msgstr ""
+msgstr "Etapa 3."
msgid "Step 4."
-msgstr ""
+msgstr "Etapa 4."
msgid "Stop Terminal"
msgstr ""
@@ -35482,10 +36412,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35528,7 +36458,7 @@ msgid "SubscriptionTable|Last invoice"
msgstr ""
msgid "SubscriptionTable|Loading subscriptions"
-msgstr ""
+msgstr "Încărcarea abonamentelor"
msgid "SubscriptionTable|Manage"
msgstr ""
@@ -35612,7 +36542,7 @@ msgid "Subscriptions|We understand. Maybe you have some questions for our sales
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 ""
+msgstr "Abonamentul dvs. pentru %{strong}%{namespace_name}%{strong_close} a expirat și sunteți acum pe %{pricing_link_start}nivelul GitLab Free%{pricing_link_end}. Nu vă faceți griji, datele dvs. sunt în siguranță. Luați legătura cu echipa noastră de asistență (%{support_email}). Ei vă vor ajuta cu plăcere cu reînnoirea abonamentului."
msgid "Subtracted"
msgstr ""
@@ -35729,7 +36659,7 @@ msgid "SuggestedColors|Lavendar"
msgstr ""
msgid "SuggestedColors|Magenta-pink"
-msgstr ""
+msgstr "Magenta-roz"
msgid "SuggestedColors|Medium sea green"
msgstr ""
@@ -35831,7 +36761,7 @@ 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 ""
+msgstr "Sunteți gata să începeți? Un plan GitLab este ideal pentru organizații în creștere și pentru utilizarea în echipe multiple."
msgid "SuperSonics|Start free trial"
msgstr ""
@@ -35866,8 +36796,11 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36010,12 +36943,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36172,6 +37099,12 @@ msgstr "Traiectoria țintă"
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr "Ramura sau eticheta țintă"
+
+msgid "Target roles"
+msgstr "Roluri țintă"
+
msgid "Target-Branch"
msgstr ""
@@ -36197,7 +37130,7 @@ msgid "Team domain"
msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after a merge request has been created or updated"
-msgstr "Declanșați TeamCity CI după ce un merge request a fost creat sau actualizat"
+msgstr "Declanșează TeamCity CI după ce un merge request a fost creat sau actualizat"
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
@@ -36205,9 +37138,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36416,7 +37346,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 "Sunteți pe cale să înlăturați fișierul de stare %{name}. Acest lucru va șterge definitiv toate versiunile de stare și istoricul. Infrastructura furnizată anterior va rămâne intactă și numai fișierul de stare cu toate versiunile sale vor fi înlăturate. Această acțiune nu poate fi anulată."
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
@@ -36615,19 +37545,16 @@ msgstr ""
msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{type} conține următoarea eroare:"
+msgstr[1] "%{type} conține următoarele erori:"
+msgstr[2] "%{type} conține următoarele erori:"
msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
-msgstr ""
+msgstr "Cheia API utilizată de GitLab pentru accesarea punctului final al serviciului Spam Check."
msgid "The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment."
msgstr ""
-msgid "The CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36658,6 +37585,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36670,6 +37600,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr "Mesajul difuzat se afișează numai utilizatorilor din proiecte și grupuri care au aceste roluri."
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36691,12 +37624,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
-msgstr ""
+msgid "The contact does not belong to the issue group's root ancestor"
+msgstr "Contactul nu aparține strămoșului rădăcină al grupului de probleme."
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36908,7 +37847,7 @@ msgid "The maximum number of CI/CD minutes on shared runners that a group can us
msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
-msgstr ""
+msgstr "Numărul maxim de etichete pe care un singur proces de curățare le acceptă pentru curățare. Dacă numărul de etichete depășește această limită, lista de etichete care urmează să fie șterse este trunchiată la acest număr. Pentru a înlătura această limită, setați-o la 0."
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "Conflictele de îmbinare pentru acest merge request nu pot fi rezolvate prin GitLab. Încercați să le rezolvați pe plan local."
@@ -36974,7 +37913,7 @@ msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The project has already been added to your dashboard."
-msgstr ""
+msgstr "Proiectul a fost deja adăugat la tabloul de bord."
msgid "The project is accessible only by members of the project. Access must be granted explicitly to each user."
msgstr ""
@@ -36983,7 +37922,7 @@ msgid "The project is still being deleted. Please try again later."
msgstr ""
msgid "The project was successfully forked."
-msgstr ""
+msgstr "Crearea forkului de proiect s-a făcut cu succes."
msgid "The project was successfully imported."
msgstr ""
@@ -36991,6 +37930,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr "Compilarea asociată CI a eșuat."
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37000,6 +37942,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr "Artefactul de raport furnizat de compilarea CI nu a putut fi analizat."
+
+msgid "The report has been successfully prepared."
+msgstr "Raportul a fost întocmit cu succes."
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37019,19 +37967,25 @@ msgid "The repository must be accessible over %{code_open}http://%{code_close},
msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
-msgstr ""
+msgstr "Același executor partajat execută cod din mai multe proiecte, numai dacă nu configurați scalarea automată cu %{link} setat la 1 (care este pe GitLab.com)."
+
+msgid "The scan has been created."
+msgstr "Scanarea a fost creată."
msgid "The snippet can be accessed without any authentication."
-msgstr ""
+msgstr "Fragmentul de cod poate fi accesat fără nicio autentificare."
msgid "The snippet is visible only to me."
-msgstr ""
+msgstr "Fragmentul de cod este vizibil numai pentru mine."
msgid "The snippet is visible only to project members."
-msgstr ""
+msgstr "Fragmentul de cod este vizibil numai pentru membrii proiectului."
msgid "The snippet is visible to any logged in user except external users."
-msgstr ""
+msgstr "Fragmentul de cod este vizibil pentru orice utilizator conectat, cu excepția utilizatorilor externi."
+
+msgid "The source project of this merge request has been removed."
+msgstr "Proiectul sursă al acestui merge request a fost înlăturat."
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37289,7 +38243,7 @@ msgid "There was an error creating the dashboard, branch name is invalid."
msgstr ""
msgid "There was an error creating the dashboard, branch named: %{branch} already exists."
-msgstr ""
+msgstr "S-a produs o eroare la crearea tabloului de bord, ramura numită: %{branch} există deja."
msgid "There was an error creating the issue"
msgstr ""
@@ -37307,7 +38261,7 @@ msgid "There was an error fetching data for the selected stage"
msgstr ""
msgid "There was an error fetching data for the tasks by type chart"
-msgstr ""
+msgstr "A apărut o eroare la preluarea datelor pentru graficul de sarcini după tip"
msgid "There was an error fetching label data for the selected group"
msgstr ""
@@ -37318,9 +38272,6 @@ 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"
@@ -37361,7 +38312,7 @@ msgid "There was an error importing the Jira project."
msgstr ""
msgid "There was an error loading related feature flags"
-msgstr ""
+msgstr "S-a produs o eroare la încărcarea Feature Flags asociate"
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -37406,10 +38357,10 @@ msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
msgid "There was an error updating the dashboard, branch name is invalid."
-msgstr ""
+msgstr "S-a produs o eroare la actualizarea tabloului de bord, numele ramurii nu este valid."
msgid "There was an error updating the dashboard, branch named: %{branch} already exists."
-msgstr ""
+msgstr "S-a produs o eroare la actualizarea tabloului de bord, ramura numită: %{branch} există deja."
msgid "There was an error when reseting email token."
msgstr ""
@@ -37462,6 +38413,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37474,8 +38428,8 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
-msgstr ""
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
+msgstr "Acest %{noteableTypeText} este %{confidentialLinkStart}confidențial%{confidentialLinkEnd} și %{lockedLinkStart}blocat%{lockedLinkEnd}."
msgid "This %{noteableTypeText} is locked."
msgstr ""
@@ -37501,8 +38455,8 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
-msgstr ""
+msgid "This URL already exists."
+msgstr "Acest URL există deja."
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
@@ -37510,23 +38464,23 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
-msgstr ""
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
+msgstr "Această acțiune șterge %{codeOpen}%{project_path_with_namespace}%{codeClose} și tot ce conține acest proiect. %{strongOpen}Nu există cale de întoarcere%{strongClose}"
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
-msgstr ""
+msgstr "Această acțiune șterge %{codeOpen}%{project_path_with_namespace}%{codeClose} pe %{date} și tot ce conține acest proiect."
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
-msgstr ""
+msgstr "Această acțiune șterge %{codeOpen}%{project_path_with_namespace}%{codeClose} pe %{date} și tot ce conține acest proiect. %{strongOpen}Nu există cale de întoarcere.%{strongClose}"
msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}immediately%{strongClose}."
msgstr ""
msgid "This also resolves all related threads"
-msgstr ""
+msgstr "Aceasta rezolvă, de asemenea, toate subiectele conexe"
msgid "This also resolves this thread"
-msgstr ""
+msgstr "Aceasta rezolvă și acest subiect"
msgid "This application was created by %{user_link}."
msgstr ""
@@ -37556,16 +38510,16 @@ msgid "This block is self-referential"
msgstr ""
msgid "This board's scope is reduced"
-msgstr ""
+msgstr "Acest bord a fost restrâns în scop"
msgid "This chart could not be displayed"
msgstr ""
msgid "This clears repository check states for all projects in the database and cannot be undone. Are you sure?"
-msgstr "Acest lucru va șterge statuturile verificărilor de repozitoriu pentru toate proiectele din baza de date. Acest lucru nu poate fi anulat. Sunteți sigur?"
+msgstr "Acest lucru șterge stările de verificare a repozitoriilor pentru toate proiectele din baza de date și nu poate fi anulat. Sunteți sigur?"
msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
-msgstr ""
+msgstr "Acest fragment de cod conține tot ceea ce se reflectă în formularul de configurare. Copiați-l și lipiți-l în fișierul %{linkStart}.gitlab-ci.yml%{linkEnd} și salvați modificările. Scanările %{scanType} viitoare vor utiliza aceste setări."
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -37574,7 +38528,7 @@ msgid "This commit is part of merge request %{link_to_merge_request}. Comments c
msgstr "Acest commit face parte din merge request-ul %{link_to_merge_request}. Comentariile create aici vor fi create în contextul acelui merge request."
msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
-msgstr ""
+msgstr "Acest commit a fost semnat cu semnături %{strong_open}multiple%{strong_close}."
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -37597,6 +38551,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr "Această implementare nu este în așteptarea aprobărilor."
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37624,6 +38584,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr "Acest mediu nu este protejat."
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37750,9 +38713,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr "Acest job se implementează în mediul protejat „%{environment}â€, care necesită aprobări."
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37766,10 +38735,10 @@ msgid "This job has not started yet"
msgstr ""
msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
-msgstr ""
+msgstr "Acest job este o implementare neactualizată la %{environmentLink} utilizând clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}."
msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}. View the %{deploymentLink}."
-msgstr ""
+msgstr "Acest job este o implementare neactualizată la %{environmentLink} utilizând clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}. Vedeți %{deploymentLink}."
msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink}."
msgstr ""
@@ -37787,10 +38756,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 "Acest job creează o implementare la %{environmentLink} folosind clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}."
msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}. This will overwrite the %{deploymentLink}."
-msgstr ""
+msgstr "Acest job creează o implementare la %{environmentLink} folosind clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}. Aceasta va suprascrie %{deploymentLink}."
msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink}."
msgstr ""
@@ -37805,7 +38774,7 @@ msgid "This job is creating a deployment to %{environmentLink}. This will overwr
msgstr ""
msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
-msgstr ""
+msgstr "Acest job este implementat la %{environmentLink} utilizând clusterul %{clusterNameOrLink} și spațiul de nume %{kubernetesNamespace}."
msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink}."
msgstr ""
@@ -37844,7 +38813,7 @@ msgid "This link points to external content"
msgstr ""
msgid "This may expose confidential information as the selected fork is in another namespace that can have other members."
-msgstr ""
+msgstr "Acest lucru poate expune informații confidențiale, deoarece forkul selectat se află într-un alt spațiu de nume care poate avea și alți membri."
msgid "This means you can not push code until you create an empty repository or import existing one."
msgstr ""
@@ -37853,7 +38822,7 @@ msgid "This merge request branch is protected from force push."
msgstr ""
msgid "This merge request cannot be rebased while there are conflicts."
-msgstr ""
+msgstr "Nu se poate face un rebase al acestui merge request atât timp cât există conflicte."
msgid "This merge request does not have accessibility reports"
msgstr ""
@@ -37880,7 +38849,7 @@ 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 "Acest spațiu de nume a fost deja luat! Vă rugăm să alegeți altul."
msgid "This only applies to repository indexing operations."
msgstr ""
@@ -37889,10 +38858,10 @@ msgid "This option is only available on GitLab.com"
msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
-msgstr ""
+msgstr "Această pagină nu este disponibilă deoarece nu aveți permisiunea de a citi informații în mai multe proiecte."
msgid "This page sends a payload. Go back to the events page to see a newly created event."
-msgstr ""
+msgstr "Această pagină trimite o sarcină. Întoarceți-vă la pagina evenimentelor pentru a vedea un eveniment nou creat."
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
msgstr ""
@@ -37955,7 +38924,7 @@ msgid "This project will be deleted on %{date} since its parent group '%{parent_
msgstr ""
msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you house your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
-msgstr ""
+msgstr "Acest proiect va locui în grupul dvs. %{strong_open}%{namespace}%{strong_close}. Un proiect este locul în care vă găzduiți fișierele (repozitoriile), vă planificați activitatea (probleme), vă publicați documentația (wiki) și multe altele."
msgid "This repository"
msgstr ""
@@ -37979,10 +38948,10 @@ 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 "Această setare poate fi suprascrisă în fiecare proiect."
msgid "This setting is allowed for forked projects only"
-msgstr ""
+msgstr "Această setare este permisă numai pentru forkurile de proiecte"
msgid "This subscription is for"
msgstr ""
@@ -37990,6 +38959,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr "Acest titlu există deja."
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38036,7 +39008,7 @@ msgid "This will remove the fork relationship between this project and other pro
msgstr ""
msgid "Thread to reply to cannot be found"
-msgstr ""
+msgstr "Nu se poate găsi subiectul la care să răspundeți"
msgid "Threat monitoring"
msgstr ""
@@ -38393,7 +39365,7 @@ msgid "Timeout connecting to the Google API. Please try again."
msgstr ""
msgid "Timeout for moderately fast Gitaly operations (in seconds). Provide a value between Default timeout and Fast timeout."
-msgstr "Timp expirare pentru operațiuni moderat rapide Gitaly (în secunde). Furnizați o valoare între Timp expirare implicit și Timp expirare rapid."
+msgstr "Timpul de expirare pentru operațiunile Gitaly moderat de rapide (în secunde). Furnizați o valoare între Timpul de așteptare implicit și Timpul de așteptare rapid."
msgid "Timeout for most Gitaly operations (in seconds)."
msgstr ""
@@ -38420,10 +39392,10 @@ msgid "Time|s"
msgstr ""
msgid "Tip: Hover over a job to see the jobs it depends on to run."
-msgstr ""
+msgstr "Sfat: Deplasați cursorul peste un job pentru a vedea joburile de care depinde pentru a se executa."
msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
-msgstr ""
+msgstr "Sfat: adăugați un %{linkStart}CODEOWNERS%{linkEnd} pentru a adăuga automat aprobatorii pe baza căilor de acces la fișiere și a tipurilor de fișiere."
msgid "Title"
msgstr ""
@@ -38464,6 +39436,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr "Pentru a cere cuiva să examineze un merge request, selectați %{strongStart}Solicită atenție%{strongEnd}. Selectați din nou pentru a elimina solicitarea."
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38531,7 +39506,7 @@ msgid "To keep this project going, create a new merge request"
msgstr ""
msgid "To learn more about this project, read %{link_to_wiki}"
-msgstr ""
+msgstr "Pentru a afla mai multe despre acest proiect, citiți %{link_to_wiki}"
msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
msgstr ""
@@ -38545,6 +39520,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr "Pentru a păstra performanța, sunt afișate doar %{strongStart}%{visible} din %{total}%{strongEnd} fișiere."
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38563,8 +39541,8 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
-msgstr ""
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr "Pentru reînnoire, exportați fișierul de utilizare a licenței și trimiteți-l prin e-mail la %{renewal_service_email}. O nouă licență va fi trimisă prin e-mail la adresa de e-mail înregistrată în %{customers_dot}. Puteți adăuga această licență la instanța dumneavoastră."
msgid "To resolve this, try to:"
msgstr "Pentru a rezolva asta, încercați:"
@@ -38576,10 +39554,10 @@ msgid "To see all the user's personal access tokens you must impersonate them fi
msgstr ""
msgid "To see this project's operational details, %{linkStart}upgrade its group plan to Premium%{linkEnd}. You can also remove the project from the dashboard."
-msgstr "Pentru a vedea detaliile operaționale ale acestui proiect, faceți %{linkStart}upgrade planului său la Premium%{linkEnd}. De asemenea, puteți elimina proiectul de pe panoul de control."
+msgstr "Pentru a vedea detaliile operaționale ale acestui proiect, %{linkStart}actualizați planul său de grup la Premium%{linkEnd}. De asemenea, puteți înlătura proiectul din tabloul de bord."
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 "Pentru a vedea detaliile operaționale ale acestui proiect, contactați un proprietar al grupului %{groupName} pentru a actualiza planul. De asemenea, puteți elimina proiectul din tabloul de bord."
msgid "To see what's changed or create a merge request, choose a branch or tag (like %{branch}), or enter a commit (like %{sha})."
msgstr ""
@@ -38600,7 +39578,7 @@ msgid "To unsubscribe from this issue, please paste the following link into your
msgstr ""
msgid "To update Snippets with multiple files, you must use the `files` parameter"
-msgstr ""
+msgstr "Pentru a actualiza Fragmentele cu mai multe fiÈ™iere, trebuie să folosiÈ›i parametrul „filesâ€."
msgid "To use the additional formats, you must start the required %{container_link_start}companion containers%{container_link_end}."
msgstr "Pentru a folosi formate suplimentare, trebuie să porniți %{container_link_start}containerele însoțitoare%{container_link_end}."
@@ -38627,40 +39605,40 @@ msgid "Today"
msgstr ""
msgid "Todos count"
-msgstr ""
+msgstr "Număr de todos"
msgid "Todos|Are you looking for things to do? Take a look at %{strongStart}%{openIssuesLinkStart}open issues%{openIssuesLinkEnd}%{strongEnd}, contribute to %{strongStart}%{mergeRequestLinkStart}a merge request%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd}, or mention someone in a comment to automatically assign them a new to-do item."
-msgstr ""
+msgstr "Căutați lucruri de făcut? Aruncați o privire la %{strongStart}%{openIssuesLinkStart}problemele deschise%{openIssuesLinkEnd}%{strongEnd}, contribuiți la %{strongStart}%{mergeRequestLinkStart}un merge request%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd} sau menționați pe cineva într-un comentariu pentru a-i atribui automat un nou element de făcut."
msgid "Todos|Filter by author"
-msgstr ""
+msgstr "Filtrați după autor"
msgid "Todos|Filter by group"
-msgstr ""
+msgstr "Filtrați după grup"
msgid "Todos|Filter by project"
-msgstr ""
+msgstr "Filtrați după proiect"
msgid "Todos|It's how you always know what to work on next."
-msgstr ""
+msgstr "În acest fel știți totdeauna la ce să lucrați în continuare."
msgid "Todos|Mark all as done"
-msgstr ""
+msgstr "Marcați totul ca terminat"
msgid "Todos|Nothing is on your to-do list. Nice work!"
-msgstr ""
+msgstr "Nu aveÈ›i nimic pe lista de sarcini „de făcutâ€. Bine lucrat!"
msgid "Todos|Undo mark all as done"
-msgstr ""
+msgstr "Anulați marcarea tuturor ca fiind făcute"
msgid "Todos|When an issue or merge request is assigned to you, or when you receive a %{strongStart}@mention%{strongEnd} in a comment, this automatically triggers a new item in your To-Do List."
-msgstr ""
+msgstr "Atunci când vi se atribuie o problemă sau un merge request sau când primiÈ›i o %{strongStart}@mention%{strongEnd} într-un comentariu, aceasta declanÈ™ează automat un nou element în Lista de sarcini „De făcutâ€."
msgid "Todos|You're all done!"
-msgstr ""
+msgstr "Ați terminat totul!"
msgid "Todos|Your To-Do List shows what to work on next"
-msgstr ""
+msgstr "Lista de sarcini „De făcut†arată la ce să lucrați în continuare"
msgid "Toggle GitLab Next"
msgstr ""
@@ -38696,7 +39674,7 @@ msgid "Toggle focus mode"
msgstr ""
msgid "Toggle keyboard shortcuts help dialog"
-msgstr ""
+msgstr "Comută dialogul de ajutor pentru scurtăturile de la tastatură"
msgid "Toggle navigation"
msgstr ""
@@ -38713,9 +39691,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38747,7 +39722,7 @@ msgid "Too many changes to show."
msgstr ""
msgid "Too many namespaces enabled. Manage them through the console or the API."
-msgstr ""
+msgstr "Prea multe spații de nume activate. Gestionați-le prin consolă sau prin API."
msgid "Too many projects enabled. Manage them through the console or the API."
msgstr ""
@@ -38761,6 +39736,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38843,7 +39821,7 @@ msgid "Transfer project"
msgstr ""
msgid "Transfer your project into another namespace. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Transferați-vă proiectul într-un alt spațiu de nume. %{link_start}Aflați mai multe.%{link_end}"
msgid "TransferGroup|Cannot transfer group to one of its subgroup."
msgstr ""
@@ -38854,6 +39832,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38876,28 +39857,28 @@ msgid "TransferProject|Cannot move project"
msgstr ""
msgid "TransferProject|Please select a new namespace for your project."
-msgstr ""
+msgstr "Vă rugăm să selectați un nou spațiu de nume pentru proiectul dvs."
msgid "TransferProject|Project cannot be transferred, because tags are present in its container registry"
msgstr ""
msgid "TransferProject|Project is already in this namespace."
-msgstr ""
+msgstr "Proiectul este deja în acest spațiu de nume."
msgid "TransferProject|Project with same name or path in target namespace already exists"
-msgstr "Există deja un proiect cu același nume sau traiectorie în spațiul de nume țintă"
+msgstr "Există deja un proiect cu același nume sau cale în spațiul de nume țintă"
msgid "TransferProject|Root namespace can't be updated if project has NPM packages"
-msgstr ""
+msgstr "Spațiul de nume rădăcină nu poate fi actualizat dacă proiectul are pachete NPM"
msgid "TransferProject|You don't have permission to transfer projects into that namespace."
-msgstr ""
+msgstr "Nu aveți permisiunea de a transfera proiecte în acel spațiu de nume."
msgid "TransferProject|You don't have permission to transfer this project."
msgstr ""
msgid "Tree view"
-msgstr ""
+msgstr "Afișaj arborescent"
msgid "Trending"
msgstr ""
@@ -39043,6 +40024,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39128,10 +40112,10 @@ msgid "Two-factor grace period"
msgstr "Perioadă de grație cu doi factori"
msgid "Type"
-msgstr ""
+msgstr "Tip"
msgid "Type/State"
-msgstr ""
+msgstr "Tip/Stare"
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39170,7 +40154,7 @@ msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{
msgstr ""
msgid "URL of the Grafana instance to link to from the Metrics Dashboard menu item."
-msgstr "URL-ul instanței Grafana care are să fie conectat din elementul-meniu Măsurători din Panoul de control."
+msgstr "URL-ul instanÈ›ei Grafana la care se face legătura din opÈ›iunea de meniu „Tablou de bord de metriciâ€."
msgid "URL of the external Spam Check endpoint"
msgstr ""
@@ -39247,6 +40231,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39283,6 +40270,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39296,7 +40286,7 @@ 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 "Dezarhivarea proiectului va restabili capacitatea membrilor săi de a face modificări la acesta. Commit-urile pot fi făcute în repozitoriu, iar problemele, comentariile și alte entități pot fi create. %{strong_start}Odată activat, acest proiect apare în căutare și în tabloul de bord.%{strong_end} %{link_start}Aflați mai multe.%{link_end}"
msgid "Unassign from commenting user"
msgstr ""
@@ -39401,22 +40391,25 @@ msgid "Unlocks the discussion."
msgstr ""
msgid "Unmarked this %{noun} as a draft."
-msgstr ""
+msgstr "Acest %{noun} nu mai este marcat ca schiță."
msgid "Unmarks this %{noun} as a draft."
-msgstr ""
+msgstr "Anulați marcarea acestui %{noun} ca fiind o schiță."
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr "Statusul de aprobare nerecunoscut."
+
msgid "Unrecognized cluster type"
-msgstr ""
+msgstr "Tipul de cluster nerecunoscut"
msgid "Unresolve"
msgstr ""
msgid "Unresolve thread"
-msgstr ""
+msgstr "Marcați subiect ca nerezolvat"
msgid "Unresolved"
msgstr ""
@@ -39452,7 +40445,7 @@ msgid "Unsupported sort value."
msgstr ""
msgid "Unsupported todo type passed. Supported todo types are: %{todo_types}"
-msgstr ""
+msgstr "Tipul de todo transmis nu este acceptat. Tipurile de todo acceptate sunt: %{todo_types}"
msgid "Until revoked, expired personal access tokens pose a security risk."
msgstr ""
@@ -39589,9 +40582,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39610,9 +40600,6 @@ msgstr ""
msgid "Upload image"
msgstr "încărcați o imagine"
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39622,6 +40609,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr "Încărcat"
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39679,8 +40669,8 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
-msgstr ""
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+msgstr "Începând cu %{storage_enforcement_date}, limitele de stocare se vor aplica acestui spațiu de nume. Vizualizați și gestionați utilizarea dvs. în setările %{strong_start}%{namespace_type} &gt; Cotele de utilizare%{strong_end}."
msgid "UsageQuota|Git repository."
msgstr ""
@@ -39731,7 +40721,7 @@ msgid "UsageQuota|Shared bits of code and text."
msgstr ""
msgid "UsageQuota|Snippets"
-msgstr ""
+msgstr "Fragmente de cod"
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
@@ -39746,22 +40736,22 @@ msgid "UsageQuota|Storage used"
msgstr ""
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
-msgstr ""
+msgstr "Aceasta este cantitatea totală de spațiu de stocare utilizată pentru toate proiectele dvs. din acest spațiu de nume."
msgid "UsageQuota|This is the total amount of storage used by projects above the free %{actualRepositorySizeLimit} storage limit."
msgstr ""
msgid "UsageQuota|This namespace contains locked projects"
-msgstr ""
+msgstr "Acest spațiu de nume conține proiecte blocate"
msgid "UsageQuota|This namespace has no projects which use shared runners"
-msgstr ""
+msgstr "Acest spațiu de nume nu are niciun proiect care să folosească executori partajați"
msgid "UsageQuota|Total excess storage used"
msgstr ""
msgid "UsageQuota|Total namespace storage used"
-msgstr ""
+msgstr "Stocarea totală a spațiului de nume utilizată"
msgid "UsageQuota|Unlimited"
msgstr ""
@@ -39815,7 +40805,7 @@ msgid "UsageQuota|Your purchased storage is running low. To avoid locked project
msgstr ""
msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
-msgstr ""
+msgstr "din %{formattedLimit} din spațiul de stocare al spațiului dvs. de nume"
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
msgstr ""
@@ -39908,7 +40898,7 @@ msgid "UsageTrends|Users"
msgstr ""
msgid "Use %{code_start}::%{code_end} to create a %{link_start}scoped label set%{link_end} (eg. %{code_start}priority::1%{code_end})"
-msgstr ""
+msgstr "Utilizați %{code_start}::%{code_end} pentru a crea un %{link_start}set de etichete cu scop%{link_end} (ex. %{code_start}priority::1%{code_end})"
msgid "Use .gitlab-ci.yml"
msgstr ""
@@ -39916,6 +40906,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr "Utilizați Fișiere Securizate pentru a stoca fișiere utilizate de pipeline-urile dvs., cum ar fi depozitele de chei Android sau profilurile de provizionare și certificatele de semnare Apple."
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39925,6 +40918,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr "Folosiți bannere și notificări pentru a vă anunța utilizatorii despre întreținerea programată, actualizările recente și multe altele."
+
msgid "Use cURL"
msgstr ""
@@ -39932,7 +40928,7 @@ msgid "Use custom color #FF0000"
msgstr ""
msgid "Use double quotes for multiple keywords, such as %{code_open}\"your search\"%{code_close}"
-msgstr "Utilizați ghilimele duble pentru multiple cuvinte-cheie, ca %{code_open}\"căutarea dvs.\"%{code_close}"
+msgstr "Folosiți ghilimele duble pentru multiple cuvinte cheie, cum ar fi %{code_open}\"căutarea dumneavoastră\"%{code_close}"
msgid "Use hashed storage"
msgstr ""
@@ -39977,7 +40973,7 @@ msgid "Use the search bar on the top of this page"
msgstr ""
msgid "Use this token to validate received payloads."
-msgstr ""
+msgstr "Utilizați acest token pentru a valida payload-urile primite."
msgid "Use webhook"
msgstr ""
@@ -40049,7 +41045,7 @@ msgid "User identity was successfully updated."
msgstr ""
msgid "User is not allowed to resolve thread"
-msgstr ""
+msgstr "Utilizatorul nu are voie să rezolve subiectul"
msgid "User key"
msgstr "Cheie utilizator"
@@ -40100,73 +41096,73 @@ msgid "UserAvailability|(Busy)"
msgstr ""
msgid "UserLists|Add"
-msgstr ""
+msgstr "Adăugați"
msgid "UserLists|Add Users"
-msgstr ""
+msgstr "Adăugare de utilizatori"
msgid "UserLists|Add users"
-msgstr ""
+msgstr "Adăugați utilizatori"
msgid "UserLists|Cancel"
-msgstr ""
+msgstr "Anulare"
msgid "UserLists|Create"
-msgstr ""
+msgstr "Creați"
msgid "UserLists|Define a set of users to be used within feature flag strategies"
-msgstr ""
+msgstr "Definiți un set de utilizatori care să fie utilizați în cadrul strategiilor Feature Flag"
msgid "UserLists|Edit"
-msgstr ""
+msgstr "Editați"
msgid "UserLists|Edit %{name}"
-msgstr ""
+msgstr "Editați %{name}"
msgid "UserLists|Enter a comma separated list of user IDs. These IDs should be the users of the system in which the feature flag is set, not GitLab IDs"
-msgstr ""
+msgstr "Introduceți o listă de ID-uri de utilizator separate prin virgulă. Aceste ID-uri trebuie să fie utilizatori ai sistemului în care este setat Feature Flag, nu ID-uri GitLab"
msgid "UserLists|Feature flag user list"
-msgstr ""
+msgstr "Listă de utilizatori Feature Flag"
msgid "UserLists|Get started with user lists"
-msgstr ""
+msgstr "Începeți cu listele de utilizatori"
msgid "UserLists|Lists allow you to define a set of users to be used with feature flags. %{linkStart}Read more about feature flag lists.%{linkEnd}"
-msgstr ""
+msgstr "Listele vă permit să definiți un set de utilizatori care să fie folosiți cu Feature Flags. %{linkStart}Citiți mai multe despre listele Feature Flag.%{linkEnd}"
msgid "UserLists|Loading user lists"
-msgstr ""
+msgstr "Încărcarea listelor de utilizatori"
msgid "UserLists|Name"
-msgstr ""
+msgstr "Nume"
msgid "UserLists|New list"
-msgstr ""
+msgstr "Lista nouă"
msgid "UserLists|New user list"
-msgstr ""
+msgstr "Listă nouă de utilizatori"
msgid "UserLists|Save"
-msgstr ""
+msgstr "Salvați"
msgid "UserLists|There are no users"
-msgstr ""
+msgstr "Nu există utilizatori"
msgid "UserLists|There was an error fetching the user lists."
-msgstr ""
+msgstr "A survenit o eroare la preluarea listelor de utilizatori."
msgid "UserLists|User ID"
-msgstr ""
+msgstr "ID utilizator"
msgid "UserLists|User IDs"
-msgstr ""
+msgstr "ID-uri utilizator"
msgid "UserLists|User Lists"
-msgstr ""
+msgstr "Liste de utilizatori"
msgid "UserLists|User lists allow you to define a set of users to use with Feature Flags."
-msgstr ""
+msgstr "Listele de utilizatori vă permit să definiți un set de utilizatori care să fie utilizați cu Feature Flags."
msgid "UserList|Delete %{name}?"
msgstr ""
@@ -40217,7 +41213,7 @@ msgid "UserProfile|Most Recent Activity"
msgstr ""
msgid "UserProfile|No snippets found."
-msgstr ""
+msgstr "Nu au fost găsite fragmente de cod."
msgid "UserProfile|Overview"
msgstr ""
@@ -40235,16 +41231,16 @@ msgid "UserProfile|Retry"
msgstr ""
msgid "UserProfile|Snippets"
-msgstr ""
+msgstr "Fragmente de cod"
msgid "UserProfile|Snippets in GitLab can either be private, internal, or public."
-msgstr ""
+msgstr "Fragmentele de cod din GitLab pot fi private, interne sau publice."
msgid "UserProfile|Star projects to track their progress and show your appreciation."
msgstr ""
msgid "UserProfile|Starred projects"
-msgstr ""
+msgstr "Proiecte marcate"
msgid "UserProfile|Subscribe"
msgstr ""
@@ -40262,7 +41258,7 @@ msgid "UserProfile|This user hasn't contributed to any projects"
msgstr ""
msgid "UserProfile|This user hasn't starred any projects"
-msgstr ""
+msgstr "Acest utilizator nu a marcat niciun proiect ca favorit"
msgid "UserProfile|This user is blocked"
msgstr ""
@@ -40274,10 +41270,10 @@ msgid "UserProfile|Unconfirmed user"
msgstr ""
msgid "UserProfile|View all"
-msgstr ""
+msgstr "Vizualizați toate"
msgid "UserProfile|View user in admin area"
-msgstr ""
+msgstr "Vizualizați utilizatorul în zona admin"
msgid "UserProfile|You are not following other users."
msgstr ""
@@ -40292,7 +41288,7 @@ msgid "UserProfile|You haven't created any personal projects."
msgstr ""
msgid "UserProfile|You haven't created any snippets."
-msgstr ""
+msgstr "Nu ați creat niciun fragment de cod."
msgid "UserProfile|Your projects can be available publicly, internally, or privately, at your choice."
msgstr ""
@@ -40379,7 +41375,7 @@ 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 ""
+msgstr "Folosirea %{code_start}::%{code_end} indică un %{link_start}set de etichete cu scop%{link_end}"
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr ""
@@ -40580,85 +41576,85 @@ msgid "VersionCheck|Your GitLab Version"
msgstr ""
msgid "View Documentation"
-msgstr ""
+msgstr "Vizualizați documentația"
msgid "View Stage: %{title}"
msgstr ""
msgid "View alert details at"
-msgstr ""
+msgstr "Vizualizați detaliile alertei la"
msgid "View alert details."
-msgstr ""
+msgstr "Vizualizați detaliile alertei."
msgid "View all environments."
-msgstr ""
+msgstr "Vizualizați toate mediile."
msgid "View all issues"
-msgstr ""
+msgstr "Vizualizați toate problemele"
msgid "View blame"
-msgstr ""
+msgstr "Vizualizați blame"
msgid "View blame prior to this change"
-msgstr ""
+msgstr "Consultați blame înainte de această modificare"
msgid "View chart"
msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Vizualizați diagrama"
+msgstr[1] "Vizualizați diagramele"
+msgstr[2] "Vizualizați diagramele"
msgid "View dependency details for your project"
-msgstr ""
+msgstr "Vizualizați detaliile de dependență pentru proiectul dumneavoastră"
msgid "View deployment"
-msgstr ""
+msgstr "Vizualizați desfășurarea"
msgid "View details"
-msgstr ""
+msgstr "Vizualizați detaliile"
msgid "View details: %{details_url}"
-msgstr ""
+msgstr "Vizualizați detalii: %{details_url}"
msgid "View documentation"
-msgstr ""
+msgstr "Vizualizați documentația"
msgid "View downstream pipeline"
msgstr ""
msgid "View eligible approvers"
-msgstr ""
+msgstr "Vizualizați aprobatorii eligibili"
msgid "View epics list"
-msgstr ""
+msgstr "Vizualizați lista de epice"
msgid "View exposed artifact"
msgid_plural "View %d exposed artifacts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Vizualizați artefactul expus"
+msgstr[1] "Vizualizați %d artefacte expuse"
+msgstr[2] "Vizualizați %d de artefacte expuse"
msgid "View file @ "
-msgstr ""
+msgstr "Vizualizați fișierul @ "
msgid "View file @ %{commitSha}"
-msgstr ""
+msgstr "Vizualizați fișierul @ %{commitSha}"
msgid "View full dashboard"
-msgstr ""
+msgstr "Vizualizați tabloul de bord complet"
msgid "View full log"
-msgstr ""
+msgstr "Vizualizați jurnalul complet"
msgid "View group in admin area"
-msgstr ""
+msgstr "Vizualizați grupul în zona admin"
msgid "View group labels"
-msgstr ""
+msgstr "Vizualizarea etichetelor de grup"
msgid "View group pipeline usage quota"
-msgstr ""
+msgstr "Vizualizați cota de utilizare de pipeline a grupului"
msgid "View incident details at"
msgstr ""
@@ -40667,100 +41663,100 @@ msgid "View incident details."
msgstr ""
msgid "View incident issues."
-msgstr ""
+msgstr "Vedeți problemele legate de incident."
msgid "View issue"
-msgstr ""
+msgstr "Vizualizați problema"
msgid "View issues"
-msgstr ""
+msgstr "Vizualizați problemele"
msgid "View it on GitLab"
msgstr ""
msgid "View job"
-msgstr ""
+msgstr "Vedeți jobul"
msgid "View job log"
-msgstr ""
+msgstr "Afișați log-ul jobului"
msgid "View jobs"
-msgstr ""
+msgstr "Afișați joburile"
msgid "View labels"
-msgstr ""
+msgstr "Vizualizați etichetele"
msgid "View log"
-msgstr ""
+msgstr "Vedeți jurnalul"
msgid "View logs"
-msgstr ""
+msgstr "Vedeți jurnalele"
msgid "View merge request"
-msgstr ""
+msgstr "Vizualizați merge request-ul"
msgid "View milestones"
msgstr ""
msgid "View on %{url}"
-msgstr ""
+msgstr "Vizualizați pe %{url}"
msgid "View open merge request"
msgstr "Vizualizați merge request-ul deschis"
msgid "View page @ "
-msgstr ""
+msgstr "Vizualizați pagina @ "
msgid "View performance dashboard."
-msgstr ""
+msgstr "Vizualizați tabloul de bord de performanță."
msgid "View project"
-msgstr ""
+msgstr "Vizualizați proiectul"
msgid "View project in admin area"
-msgstr ""
+msgstr "Vizualizați proiectul în zonă admin"
msgid "View project labels"
-msgstr ""
+msgstr "Vizualizați etichetele proiectului"
msgid "View public GPG key"
msgid_plural "View public GPG keys"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Vizualizați cheia publică GPG"
+msgstr[1] "Vizualizați cheile publice GPG"
+msgstr[2] "Vizualizați cheile publice GPG"
msgid "View replaced file @ "
-msgstr ""
+msgstr "Vizualizați fișierul înlocuit @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
-msgstr ""
+msgstr "Vedeți limbajele și framework-urile acceptate"
msgid "View the documentation"
-msgstr ""
+msgstr "Consultați documentația"
msgid "View the latest successful deployment to this environment"
-msgstr ""
+msgstr "Vizualizați cea mai recentă implementare de succes în acest mediu"
msgid "View the performance dashboard at"
-msgstr ""
+msgstr "Vizualizați tabloul de bord de performanță la"
msgid "View usage details"
-msgstr ""
+msgstr "Vizualizați detaliile de utilizare"
msgid "View users statistics"
-msgstr ""
+msgstr "Vizualizați statisticile utilizatorilor"
msgid "Viewed"
-msgstr ""
+msgstr "Vizualizat"
msgid "Viewing commit"
-msgstr ""
+msgstr "Vizualizare commit"
+
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr "Vizualizarea proiectelor și a datelor de proiectare de pe un site principal nu este posibilă atunci când se utilizează un URL unificat. Vizitați direct site-ul secundar. %{geo_help_url}"
msgid "Violation"
msgstr ""
@@ -40867,9 +41863,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40891,6 +41884,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40961,7 +41957,7 @@ msgid "VulnerabilityManagement|Verified as fixed or mitigated"
msgstr ""
msgid "VulnerabilityManagement|Vulnerability name or type. Ex: Cross-site scripting"
-msgstr ""
+msgstr "Numele sau tipul vulnerabilității. De exemplu: Scripturi cross-site"
msgid "VulnerabilityManagement|Will not fix or a false-positive"
msgstr ""
@@ -41011,6 +42007,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41024,7 +42023,7 @@ msgid "Vulnerability|Crash state"
msgstr ""
msgid "Vulnerability|Crash type"
-msgstr ""
+msgstr "Tipul de incident"
msgid "Vulnerability|Description"
msgstr ""
@@ -41078,7 +42077,7 @@ msgid "Vulnerability|Information related how the vulnerability was discovered an
msgstr ""
msgid "Vulnerability|Learn more about this vulnerability and the best way to resolve it."
-msgstr ""
+msgstr "Aflați mai multe despre această vulnerabilitate și modalitatea cea mai bună de a o rezolva."
msgid "Vulnerability|Links"
msgstr ""
@@ -41087,7 +42086,7 @@ msgid "Vulnerability|Method"
msgstr ""
msgid "Vulnerability|Namespace"
-msgstr ""
+msgstr "Spațiu de nume"
msgid "Vulnerability|Project"
msgstr ""
@@ -41107,9 +42106,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41126,7 +42122,7 @@ 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 ""
+msgstr "Scanerul a determinat că această vulnerabilitate este un fals pozitiv. Verificați evaluarea înainte de a-i schimba statutul. %{linkStart}Aflați mai multe despre detectarea falsului pozitiv.%{linkEnd}"
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -41150,11 +42146,14 @@ msgid "WARNING:"
msgstr "ATENÈšIE:"
msgid "WARNING: This snippet contains hidden files which might be used to mask malicious behavior. Exercise caution if cloning and executing code from this snippet."
-msgstr ""
+msgstr "AVERTISMENT: Acest fragment de cod conține fișiere ascunse care pot fi folosite pentru a masca un comportament rău intenționat. Fiți precauți la clonarea și executarea codului din acest fragment de cod."
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr "Se așteaptă aprobarea"
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41176,6 +42175,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41237,7 +42239,7 @@ msgid "We sent you an email with reset password instructions"
msgstr ""
msgid "We tried to automatically renew your subscription for %{strong}%{namespace_name}%{strong_close} on %{expires_on} but something went wrong so your subscription was downgraded to the free plan. Don't worry, your data is safe. We suggest you check your payment method and get in touch with our support team (%{support_link}). They'll gladly help with your subscription renewal."
-msgstr ""
+msgstr "Am încercat să vă reînnoim automat abonamentul pentru %{strong}%{namespace_name}%{strong_close} pe %{expires_on}, dar ceva nu a mers bine, așa că abonamentul dvs. a fost retrogradat la planul gratuit. Nu vă faceți griji, datele dvs. sunt în siguranță. Vă sugerăm să vă verificați metoda de plată și să luați legătura cu echipa noastră de asistență (%{support_link}). Aceștia vă vor ajuta cu plăcere să vă reînnoiți abonamentul."
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
@@ -41330,150 +42332,153 @@ msgid "Webhooks Help"
msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
-msgstr ""
+msgstr "Se adaugă un comentariu la o problemă confidențială."
msgid "Webhooks|A comment is added to an issue."
-msgstr ""
+msgstr "Se adaugă un comentariu la o problemă."
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
-msgstr ""
+msgstr "O problemă confidențială este creată, actualizată, închisă sau redeschisă."
msgid "Webhooks|A deployment starts, finishes, fails, or is canceled."
-msgstr ""
+msgstr "O implementare începe, se termină, eșuează sau este anulată."
msgid "Webhooks|A feature flag is turned on or off."
-msgstr ""
+msgstr "Un Feature Flag este activat sau dezactivat."
msgid "Webhooks|A group member is created, updated, or removed."
-msgstr ""
+msgstr "Un membru al grupului este creat, actualizat sau înlăturat."
msgid "Webhooks|A job's status changes."
-msgstr ""
+msgstr "Starea unui job se modifică."
msgid "Webhooks|A merge request is created, updated, or merged."
-msgstr ""
+msgstr "Un merge request este creat, actualizat sau îmbinat."
msgid "Webhooks|A new tag is pushed to the repository."
-msgstr ""
+msgstr "O nouă etichetă este împinsă în repozitoriu."
msgid "Webhooks|A pipeline's status changes."
-msgstr ""
+msgstr "Se modifică starea unui pipeline."
msgid "Webhooks|A release is created or updated."
-msgstr ""
+msgstr "Se creează sau se actualizează o versiune."
msgid "Webhooks|A subgroup is created or removed."
-msgstr ""
+msgstr "Se creează sau se înlătură un subgrup."
msgid "Webhooks|A wiki page is created or updated."
-msgstr ""
+msgstr "Se creează sau se actualizează o pagină wiki."
msgid "Webhooks|An issue is created, updated, closed, or reopened."
-msgstr ""
+msgstr "O problemă este creată, actualizată, închisă sau redeschisă."
msgid "Webhooks|Are you sure you want to delete this group hook?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să ștergeți acest hook de grup?"
msgid "Webhooks|Are you sure you want to delete this project hook?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să ștergeți acest hook de proiect?"
msgid "Webhooks|Are you sure you want to delete this webhook?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să ștergeți acest webhook?"
msgid "Webhooks|Comments"
-msgstr ""
+msgstr "Comentarii"
msgid "Webhooks|Confidential comments"
-msgstr ""
+msgstr "Comentarii confidențiale"
msgid "Webhooks|Confidential issues events"
-msgstr ""
+msgstr "Evenimente de probleme confidențiale"
msgid "Webhooks|Delete webhook"
-msgstr ""
+msgstr "Ștergeți webhook-ul"
msgid "Webhooks|Deployment events"
-msgstr ""
+msgstr "Evenimente de implementare"
msgid "Webhooks|Enable SSL verification"
-msgstr ""
+msgstr "Activați verificarea SSL"
msgid "Webhooks|Failed to connect"
-msgstr ""
+msgstr "Nu s-a reușit conectarea"
msgid "Webhooks|Fails to connect"
-msgstr ""
+msgstr "Nu se conectează"
msgid "Webhooks|Feature flag events"
-msgstr ""
+msgstr "Evenimentele Feature Flag"
msgid "Webhooks|Issues events"
-msgstr ""
+msgstr "Evenimente de probleme"
msgid "Webhooks|Job events"
-msgstr ""
+msgstr "Evenimente de job"
msgid "Webhooks|Member events"
-msgstr ""
+msgstr "Evenimente de membri"
msgid "Webhooks|Merge request events"
-msgstr ""
+msgstr "Evenimente de merge request"
msgid "Webhooks|Pipeline events"
-msgstr ""
+msgstr "Evenimente de pipeline"
msgid "Webhooks|Push events"
-msgstr ""
+msgstr "Evenimente de push"
msgid "Webhooks|Push to the repository."
-msgstr ""
+msgstr "Push către repozitoriu."
msgid "Webhooks|Releases events"
-msgstr ""
+msgstr "Evenimente de lansări"
msgid "Webhooks|SSL verification"
msgstr ""
msgid "Webhooks|Secret token"
-msgstr ""
+msgstr "Token secret"
msgid "Webhooks|Subgroup events"
-msgstr ""
+msgstr "Evenimente de subgrup"
msgid "Webhooks|Tag push events"
-msgstr ""
+msgstr "Evenimente de push de etichete"
msgid "Webhooks|The webhook %{help_link_start}failed to connect%{help_link_end}, and will retry in %{retry_time}. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below."
-msgstr ""
+msgstr "Webhook-ul %{help_link_start}nu a reușit să se conecteze%{help_link_end} și va reîncerca în %{retry_time}. Pentru a-l reactiva, verificați %{strong_start}Evenimentele recente%{strong_end} pentru detalii despre erori, apoi testați setările dvs. mai jos."
msgid "Webhooks|The webhook failed to connect, and is disabled. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below."
-msgstr ""
+msgstr "Webhook-ul nu a reușit să se conecteze și este dezactivat. Pentru a-l reactiva, verificați %{strong_start}Evenimentele recente%{strong_end} pentru detalii despre eroare, apoi testați setările dvs. mai jos."
msgid "Webhooks|The webhook was triggered more than %{limit} times per minute and is now disabled. To re-enable this webhook, fix the problems shown in %{strong_start}Recent events%{strong_end}, then re-test your settings. %{support_link_start}Contact Support%{support_link_end} if you need help re-enabling your webhook."
-msgstr ""
+msgstr "Webhook-ul a fost declanșat de mai mult de %{limit} (de) ori pe minut și este acum dezactivat. Pentru a reactiva acest webhook, rezolvați problemele afișate în %{strong_start}Evenimentele recente%{strong_end}, apoi retestați-vă setările. %{support_link_start}Contactați serviciul de asistență%{support_link_end} dacă aveți nevoie de ajutor pentru a vă reactiva webhook-ul."
msgid "Webhooks|Trigger"
-msgstr ""
+msgstr "Declanșator"
msgid "Webhooks|URL"
-msgstr ""
+msgstr "URL"
msgid "Webhooks|URL must be percent-encoded if it contains one or more special characters."
-msgstr ""
+msgstr "URL-ul trebuie să fie codificat-procentual atunci când conține unul sau mai multe caractere speciale."
msgid "Webhooks|Used to validate received payloads. Sent with the request in the %{code_start}X-Gitlab-Token HTTP%{code_end} header."
-msgstr ""
+msgstr "Utilizat pentru a valida payload-urile primite. Trimis împreună cu cererea în antetul %{code_start}X-Gitlab-Token HTTP%{code_end}."
msgid "Webhooks|Webhook failed to connect"
-msgstr ""
+msgstr "Webhook-ul nu a reușit să se conecteze"
msgid "Webhooks|Webhook fails to connect"
-msgstr ""
+msgstr "Webhook-ul nu reușește să se conecteze"
msgid "Webhooks|Webhook was automatically disabled"
-msgstr ""
+msgstr "Webhook-ul a fost dezactivat automat"
msgid "Webhooks|Wiki page events"
+msgstr "Evenimente de pagină Wiki"
+
+msgid "Website"
msgstr ""
msgid "Website:"
@@ -41521,9 +42526,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41566,15 +42568,15 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
+msgstr "Atunci când este activată, politicile de curățare se execută mai rapid, dar solicită mai mult Redis."
+
msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
msgstr ""
msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
-msgid "When inactive, an external authentication provider must be used."
-msgstr "Când inactiv, un furnizor de autentificare extern trebuie utilizat."
-
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
@@ -41590,6 +42592,9 @@ msgstr[2] "Când aceste merge request-uri sunt acceptate"
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41737,9 +42742,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41764,12 +42766,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41782,23 +42778,11 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
-msgstr ""
+msgstr "Sfat: Puteți muta această pagină adăugând calea la începutul titlului."
msgid "WikiPage|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
-msgstr ""
+msgstr "Indicație: Puteți să specificați calea completă a noului fișier. Vom crea automat toate directoarele care lipsesc."
msgid "WikiPage|Title"
msgstr ""
@@ -41806,18 +42790,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41893,6 +42868,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41900,10 +42878,13 @@ msgid "WorkItem|Something went wrong when fetching the work item. Please try aga
msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
+msgstr "Ceva a mers prost la preluarea tipurilor de articole de lucru. Vă rugăm să încercați din nou"
+
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
msgstr ""
msgid "WorkItem|Type"
-msgstr ""
+msgstr "Tip"
msgid "WorkItem|Work Items"
msgstr ""
@@ -41966,13 +42947,13 @@ msgid "You"
msgstr ""
msgid "You already have pending todo for this alert"
-msgstr ""
+msgstr "Aveți deja un todo în așteptare pentru această alertă"
msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
msgstr ""
msgid "You are about to delete this forked project containing:"
-msgstr ""
+msgstr "Sunteți pe cale să ștergeți acest fork de proiect care conține:"
msgid "You are about to delete this project containing:"
msgstr ""
@@ -42005,16 +42986,16 @@ msgid "You are going to delete %{project_full_name}. Deleted projects CANNOT be
msgstr ""
msgid "You are going to remove %{group_name}. This will also delete all of its subgroups and projects. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
-msgstr "Veți elimina %{group_name}. Această acțiune va elimina de asemenea și toate subgrupurile și proiectele sale. Grupuri șterse NU pot fi restaurate! Sunteți ABSOLUT sigur?"
+msgstr "Veți înlătura %{group_name}. De asemenea, se vor șterge toate subgrupurile și proiectele sale. Grupurile înlăturate NU pot fi restaurate! Sunteți ABSOLUT sigur?"
msgid "You are going to remove the fork relationship from %{project_full_name}. Are you ABSOLUTELY sure?"
msgstr ""
msgid "You are going to transfer %{group_name} to another namespace. Are you ABSOLUTELY sure?"
-msgstr ""
+msgstr "Veți transfera %{group_name} în alt spațiu de nume. Sunteți ABSOLUT sigur?"
msgid "You are going to transfer %{project_full_name} to another namespace. Are you ABSOLUTELY sure?"
-msgstr ""
+msgstr "Veți transfera %{project_full_name} într-un alt spațiu de nume. Sunteți ABSOLUT sigur?"
msgid "You are going to turn off the confidentiality. This means %{strongStart}everyone%{strongEnd} will be able to see and leave a comment on this %{issuableType}."
msgstr ""
@@ -42101,10 +43082,10 @@ msgid "You can also upload existing files from your computer using the instructi
msgstr ""
msgid "You can also use group access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Puteți utiliza, de asemenea, tokenuri de acces de grup cu Git pentru a vă autentifica prin HTTP(S). %{link_start}Aflați mai multe.%{link_end}"
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Puteți utiliza, de asemenea, tokenuri de acces la proiect cu Git pentru a vă autentifica prin HTTP(S). %{link_start}Aflați mai multe.%{link_end}"
msgid "You can always change your URL later"
msgstr ""
@@ -42112,6 +43093,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr "Îl puteți verifica în setările %{pat_link_start}tokenurilor de acces personale%{pat_link_end}."
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr "Îl puteți verifica în setările tokenurilor de acces personale %{pat_link}."
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42205,6 +43192,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr "Puteți îmbina numai după ce elementele de mai sus sunt rezolvate."
+
msgid "You can only transfer the project to namespaces you manage."
msgstr "Puteți transfera proiectul numai în spațiile de nume pe care le gestionați."
@@ -42235,6 +43225,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr "Nu puteți aproba propria implementare."
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42278,7 +43271,7 @@ msgid "You do not have permission to approve a member"
msgstr ""
msgid "You do not have permission to leave this %{namespaceType}."
-msgstr ""
+msgstr "Nu aveți permisiunea de a părăsi acest %{namespaceType}."
msgid "You do not have permission to run a pipeline on this branch."
msgstr ""
@@ -42319,6 +43312,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr "Nu aveți permisiunea de a revizui această implementare. Contactați proprietarul proiectului sau al grupului pentru ajutor."
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42356,7 +43352,7 @@ msgid "You have been redirected to the only result; see the %{a_start}search res
msgstr ""
msgid "You have been unsubscribed from this thread."
-msgstr ""
+msgstr "Ați fost dezabonat de la acest subiect."
msgid "You have declined the invitation to join %{title} %{name}."
msgstr ""
@@ -42368,7 +43364,7 @@ msgid "You have insufficient permissions to configure escalation policies for th
msgstr ""
msgid "You have insufficient permissions to create a Todo for this alert"
-msgstr ""
+msgstr "Nu aveți permisiuni suficiente pentru a crea un Todo pentru această alertă"
msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
@@ -42400,11 +43396,11 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
-msgstr ""
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr "Aveți mai mulți utilizatori activi decât sunt permiși de licența dumneavoastră. Înainte de %{date} GitLab trebuie să vă reconcilieze abonamentul. Pentru finalizarea acestui proces, exportați fișierul de utilizare a licenței dvs. și trimiteți-l prin e-mail la adresa %{renewal_service_email}. O nouă licență va fi trimisă prin e-mail la adresa de e-mail înregistrată în %{customers_dot}. Puteți adăuga această licență la instanța dvs."
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
-msgstr ""
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr "Aveți mai mulți utilizatori activi decât sunt permiși de licența dumneavoastră. GitLab trebuie acum să vă reconcilieze abonamentul. Pentru finalizarea acestui proces, exportați fișierul de utilizare a licenței dvs. și trimiteți-l prin e-mail la adresa %{renewal_service_email}. O nouă licență va fi trimisă prin e-mail la adresa de e-mail înregistrată în %{customers_dot}. Puteți adăuga această licență la instanța dvs."
msgid "You have no permissions"
msgstr ""
@@ -42515,7 +43511,7 @@ msgid "You will only receive notifications for the events you choose"
msgstr ""
msgid "You will only receive notifications for threads you have participated in"
-msgstr ""
+msgstr "Veți primi notificări doar pentru subiectele la care ați participat."
msgid "You will receive notifications for any activity"
msgstr ""
@@ -42583,6 +43579,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr "Adresa URL sau ID-ul YouTube"
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr "Abonamentul dvs. %{group} va expira acum în %{days}."
@@ -42595,11 +43594,14 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr "%{spammable_entity_type} dvs. a fost recunoscut(ă) ca fiind spam. Vă rugăm să modificați conținutul sau să rezolvați reCAPTCHA pentru a continua."
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
-msgstr ""
+msgstr "Abonamentul dvs. %{strong}%{plan_name}%{strong_close} pentru %{strong}%{namespace_name}%{strong_close} va expira pe %{strong}%{expires_on}%{strong_close}."
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
msgstr "Sintaxa dvs. de configurare CI/CD este invalidă. Vizualizați fila Lint pentru mai multe detalii."
@@ -42656,7 +43658,7 @@ msgid "Your SSH keys (%{count})"
msgstr "Cheile dvs. SSH (%{count})"
msgid "Your To-Do List"
-msgstr "Lista dvs. de sarcini"
+msgstr "Lista dvs. „De făcutâ€"
msgid "Your U2F device did not send a valid JSON response."
msgstr "Dispozitivul dvs. U2F nu a trimis un răspuns valid JSON."
@@ -42683,10 +43685,10 @@ 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 authenticated with SSO or SAML. To %{push_pull_link_start}push and pull%{link_end} over %{protocol} with Git using this account, you must %{set_password_link_start}set a password%{link_end} or %{set_up_pat_link_start}set up a Personal Access Token%{link_end} to use instead of a password. For more information, see %{clone_with_https_link_start}Clone with HTTPS%{link_end}."
-msgstr ""
+msgstr "Contul dvs. este autentificat cu SSO sau SAML. Pentru a face %{push_pull_link_start}push și pull%{link_end} pe %{protocol} cu Git folosind acest cont, trebuie %{set_password_link_start}să setați o parolă%{link_end} sau %{set_up_pat_link_start}să configurați un Token de acces personal%{link_end} pentru a fi folosit în locul unei parole. Pentru mai multe informații, consultați %{clone_with_https_link_start}Clonare cu HTTPS%{link_end}."
msgid "Your account is authenticated with SSO or SAML. To %{push_pull_link_start}push and pull%{link_end} over %{protocol} with Git using this account, you must %{set_up_pat_link_start}set up a Personal Access Token%{link_end} to use instead of a password. For more information, see %{clone_with_https_link_start}Clone with HTTPS%{link_end}."
-msgstr ""
+msgstr "Contul dvs. este autentificat cu SSO sau SAML. Pentru a face %{push_pull_link_start}push și pull%{link_end} pe %{protocol} cu Git folosind acest cont, trebuie %{set_up_pat_link_start}să configurați un Token de acces personal%{link_end} pentru a fi folosit în locul unei parole. Pentru mai multe informații, consultați %{clone_with_https_link_start}Clonare cu HTTPS%{link_end}."
msgid "Your account is locked."
msgstr "Contul dvs. este blocat."
@@ -42878,7 +43880,7 @@ msgid "Your sign-in page is %{url}."
msgstr "Pagina dvs. de conectare este %{url}."
msgid "Your snippets"
-msgstr ""
+msgstr "Fragmentele dvs. de cod"
msgid "Your subscription expired!"
msgstr "Abonamentul dvs. a expirat!"
@@ -42886,8 +43888,8 @@ msgstr "Abonamentul dvs. a expirat!"
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
-msgstr ""
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
+msgstr "Abonamentul dvs. a expirat. Pentru a-l reînnoi, exportați fișierul de utilizare a licenței și trimiteți-l prin e-mail la %{renewal_service_email}. O nouă licență va fi trimisă prin e-mail la adresa de e-mail înregistrată în %{customers_dot}. Puteți adăuga această licență la instanța dumneavoastră. Pentru a utiliza nivelul gratuit, înlăturați licența curentă."
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
@@ -43130,7 +44132,7 @@ msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
msgid "cannot be used for user namespace"
-msgstr ""
+msgstr "nu poate fi utilizat pentru spațiul de nume de utilizator"
msgid "cannot block others"
msgstr "nu poate bloca pe alții"
@@ -43147,6 +44149,12 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] "modificare"
+msgstr[1] "modificări"
+msgstr[2] "de modificări"
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43157,25 +44165,25 @@ msgid "ciReport|%{improvedNum} improved"
msgstr "%{improvedNum} îmbunătățit"
msgid "ciReport|%{linkStartTag}Learn more about API Fuzzing%{linkEndTag}"
-msgstr "%{linkStartTag}Aflați mai multe despre API Fuzzing%{linkEndTag}"
+msgstr "%{linkStartTag}Aflați mai multe despre Fuzzing API%{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
-msgstr "%{linkStartTag} Aflați mai multe despre Scanarea Containerelor %{linkEndTag}"
+msgstr "%{linkStartTag}Aflați mai multe despre Scanarea containerelor %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Coverage Fuzzing %{linkEndTag}"
msgstr ""
msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
-msgstr "%{linkStartTag} Aflați mai multe despre DAST %{linkEndTag}"
+msgstr "%{linkStartTag}Aflați mai multe despre DAST %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
-msgstr ""
+msgstr "%{linkStartTag}Aflați mai multe despre scanarea dependențelor %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
-msgstr "%{linkStartTag} Aflați mai multe despre SAST %{linkEndTag}"
+msgstr "%{linkStartTag}Aflați mai multe despre SAST %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Secret Detection %{linkEndTag}"
-msgstr ""
+msgstr "%{linkStartTag}Aflați mai multe despre Detectarea secretelor %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about codequality reports %{linkEndTag}"
msgstr ""
@@ -43199,10 +44207,10 @@ msgid "ciReport|: Loading resulted in an error"
msgstr ": Încărcarea a dus la o eroare"
msgid "ciReport|API Fuzzing"
-msgstr "API Fuzzing"
+msgstr "Fuzzing API"
msgid "ciReport|API fuzzing"
-msgstr "API fuzzing"
+msgstr "Fuzzing API"
msgid "ciReport|All projects"
msgstr "Toate proiectele"
@@ -43241,7 +44249,16 @@ msgid "ciReport|Checks"
msgstr "Verificări"
msgid "ciReport|Cluster Image Scanning"
-msgstr "Scanare Imagini Cluster"
+msgstr "Scanarea imaginii clusterului"
+
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43253,13 +44270,13 @@ msgid "ciReport|Code quality scanning detected %{issueCount} changes in merged r
msgstr ""
msgid "ciReport|Container Scanning"
-msgstr "Scanare container"
+msgstr "Scanarea containerelor"
msgid "ciReport|Container scanning"
-msgstr "Scanare container"
+msgstr "Scanarea containerelor"
msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
-msgstr "Scanarea containerului detectează vulnerabilitățile cunoscute în imaginile dvs. docker."
+msgstr "Scanarea containerelor detectează vulnerabilitățile cunoscute în imaginile dvs. docker."
msgid "ciReport|Could not dismiss vulnerability because the associated pipeline no longer exists. Refresh the page and try again."
msgstr "Nu s-a putut respinge vulnerabilitatea deoarece conducta asociată nu mai există. Reîmprospătați pagina și încercați din nou."
@@ -43283,13 +44300,13 @@ msgid "ciReport|DAST"
msgstr "DAST"
msgid "ciReport|Dependency Scanning"
-msgstr ""
+msgstr "Scanarea dependențelor"
msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies."
-msgstr "Scanarea dependenței detectează vulnerabilitățile cunoscute în dependențele codului dvs. sursă."
+msgstr "Scanarea dependențelor detectează vulnerabilitățile cunoscute în dependențele codului dvs. sursă."
msgid "ciReport|Dependency scanning"
-msgstr ""
+msgstr "Scanarea dependențelor"
msgid "ciReport|Download patch to resolve"
msgstr ""
@@ -43298,7 +44315,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 "Testarea dinamică a securității aplicațiilor (DAST) detectează vulnerabilitățile cunoscute în aplicația dvs. web."
+msgstr "Testarea dinamică a securității aplicațiilor (DAST) detectează vulnerabilitățile cunoscute din aplicația dvs. web."
msgid "ciReport|Failed to load %{reportName} report"
msgstr ""
@@ -43321,6 +44338,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43348,9 +44374,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "Gestionați licențele"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr "Nou"
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43367,13 +44399,13 @@ msgid "ciReport|SAST"
msgstr "SAST"
msgid "ciReport|Secret Detection"
-msgstr ""
+msgstr "Detectarea secretelor"
msgid "ciReport|Secret Detection detects secrets and credentials vulnerabilities in your source code."
-msgstr ""
+msgstr "Detectarea secretelor detectează secretele și vulnerabilitățile de acreditare din codul dvs. sursă."
msgid "ciReport|Secret detection"
-msgstr ""
+msgstr "Detectarea secretelor"
msgid "ciReport|Security scanning"
msgstr "Scanare de securitate"
@@ -43388,7 +44420,7 @@ msgid "ciReport|Solution"
msgstr "Soluție"
msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
-msgstr "Testarea securității statice a aplicațiilor (SAST) detectează vulnerabilitățile cunoscute în codul dvs. sursă."
+msgstr "Testarea statică a securității aplicațiilor (SAST) detectează vulnerabilitățile cunoscute în codul dvs. sursă."
msgid "ciReport|TTFB P90"
msgstr "TTFB P90"
@@ -43435,45 +44467,6 @@ msgstr "închis"
msgid "closed issue"
msgstr "problemă închisă"
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr "Felicitări! Prima dvs. pipeline rulează %{emojiStart}zap%{emojiEnd}"
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr "colectați informații de utilizare"
@@ -43492,8 +44485,8 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
-msgstr ""
+msgid "contacts can only be added to root groups"
+msgstr "contactele pot fi adăugate numai la grupurile rădăcină"
msgid "container registry images"
msgstr ""
@@ -43586,7 +44579,7 @@ msgid "draft"
msgid_plural "drafts"
msgstr[0] "schiță"
msgstr[1] "schițe"
-msgstr[2] "schițe"
+msgstr[2] "de schițe"
msgid "e.g. %{token}"
msgstr "ex. %{token}"
@@ -43600,6 +44593,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr "e-mail-ul '%{email}' nu este un e-mail verificat."
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "activat"
@@ -43622,7 +44618,7 @@ msgid "environment_id parameter is required when type is container_policy"
msgstr "parametrul environment_id este necesar atunci când tipul este container_policy"
msgid "epic"
-msgstr "epic"
+msgstr "epică"
msgid "error"
msgstr "eroare"
@@ -43688,7 +44684,7 @@ msgid "for this project"
msgstr "pentru acest proiect"
msgid "fork"
-msgstr "bifurcație"
+msgstr "fork"
msgid "from"
msgstr "de la"
@@ -43696,8 +44692,8 @@ msgstr "de la"
msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] "din %d job"
-msgstr[1] "din %d job-uri"
-msgstr[2] "din %d de job-uri"
+msgstr[1] "din %d joburi"
+msgstr[2] "din %d de joburi"
msgid "frontmatter"
msgstr ""
@@ -43939,6 +44935,12 @@ msgstr "Afișarea acestui bloc matematic poate cauza probleme de performanță p
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "merge request"
@@ -43976,7 +44978,7 @@ msgid "mrWidget|%{boldHeaderStart}Looks like there's no pipeline here.%{boldHead
msgstr ""
msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
-msgstr ""
+msgstr "%{linkStart}Configurați acum%{linkEnd} pentru a vă analiza codul sursă pentru vulnerabilitățile de securitate cunoscute."
msgid "mrWidget|%{mergeError}."
msgstr "%{mergeError}."
@@ -44035,6 +45037,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr "Anulați auto-îmbinarea"
@@ -44063,7 +45071,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "mrWidget|Create issue to resolve all threads"
-msgstr ""
+msgstr "Creați o problemă pentru a rezolva toate subiectele"
msgid "mrWidget|Delete source branch"
msgstr "Ștergeți ramura sursă"
@@ -44102,7 +45110,7 @@ msgid "mrWidget|If the last pipeline ran in the fork project, it may be inaccura
msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
-msgstr "Salt la primul subiect nerezolvat"
+msgstr "Săriți la primul subiect nerezolvat"
msgid "mrWidget|Learn more"
msgstr ""
@@ -44126,13 +45134,13 @@ msgid "mrWidget|Merge"
msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
-msgstr ""
+msgstr "Îmbinare blocată: toate subiectele trebuie să fie rezolvate."
msgid "mrWidget|Merge blocked: denied licenses must be removed."
msgstr ""
msgid "mrWidget|Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally."
-msgstr "Îmbinare blocată: îmbinarea fast-forward nu este posibilă. Pentru a îmbina acest request, mai întâi rebazați pe plan local."
+msgstr "Îmbinare blocată: nu este posibilă o îmbinare fast-forward. Pentru a îmbina această solicitare, mai întâi faceți un rebase local."
msgid "mrWidget|Merge blocked: merge conflicts must be resolved."
msgstr ""
@@ -44152,9 +45160,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44201,7 +45206,7 @@ msgid "mrWidget|Open in Web IDE"
msgstr "Deschideți în Web IDE"
msgid "mrWidget|Plain diff"
-msgstr "Diff simplu"
+msgstr "Plain diff"
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -44219,7 +45224,7 @@ msgid "mrWidget|Refreshing now"
msgstr ""
msgid "mrWidget|Remove from merge train"
-msgstr "Eliminați din merge train"
+msgstr "Înlăturați din merge train"
msgid "mrWidget|Request to merge"
msgstr ""
@@ -44227,6 +45232,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr "Rezolvați conflictele"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44237,7 +45245,7 @@ msgid "mrWidget|Revoke approval"
msgstr "Revocați aprobarea"
msgid "mrWidget|SAST and Secret Detection is not enabled."
-msgstr ""
+msgstr "SAST și Detecția secretelor nu sunt activate."
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr "Setat de %{merge_author} pentru a fi adăugat merge train-ului automat când conducta reușește"
@@ -44330,7 +45338,7 @@ msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
msgid "must be set for a project namespace"
-msgstr ""
+msgstr "trebuie să fie setat pentru un spațiu de nume de proiect"
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -44347,9 +45355,6 @@ msgstr "grupul-meu-minunat"
msgid "my-channel"
msgstr "canalul meu"
-msgid "n/a"
-msgstr "n/a"
-
msgid "need attention"
msgstr "au nevoie de atenție"
@@ -44410,6 +45415,9 @@ msgstr ""
msgid "or"
msgstr "sau"
+msgid "organizations can only be added to root groups"
+msgstr "organizațiile pot fi adăugate numai la grupurile rădăcină"
+
msgid "other card matches"
msgstr ""
@@ -44503,9 +45511,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr "avatar proiect"
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44519,7 +45524,7 @@ msgid "project name"
msgstr "numele proiectului"
msgid "project namespace cannot be the parent of another namespace"
-msgstr ""
+msgstr "spațiul de nume de proiect nu poate fi părintele unui alt spațiu de nume"
msgid "projects"
msgstr "proiecte"
@@ -44552,22 +45557,22 @@ msgid "remaining"
msgstr "rămase"
msgid "remove"
-msgstr "elimină"
+msgstr "înlăturați"
msgid "remove due date"
msgstr ""
msgid "remove start date"
-msgstr "eliminați data de începere"
+msgstr "înlăturați data de începere"
msgid "remove weight"
msgstr ""
msgid "removed"
-msgstr "eliminat"
+msgstr "înlăturat"
msgid "removed a Zoom call from this issue"
-msgstr "a eliminat un apel Zoom din această problemă"
+msgstr "a fost îndepărtat un apel Zoom din această problemă"
msgid "rendered diff"
msgstr ""
@@ -44707,9 +45712,6 @@ msgstr ""
msgid "the correct format."
msgstr "formatul corect."
-msgid "the file"
-msgstr "fișierul"
-
msgid "the following epic(s)"
msgstr ""
@@ -44762,7 +45764,7 @@ msgid "user avatar"
msgstr "avatar utilizator"
msgid "user namespace cannot be the parent of another namespace"
-msgstr ""
+msgstr "spațiul de nume al utilizatorului nu poate fi părintele unui alt spațiu de nume"
msgid "username"
msgstr "utilizator"
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index 55409d05a9c..adc00df5888 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ru\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:12\n"
msgid " %{start} to %{end}"
msgstr " %{start} по %{end}"
@@ -28,15 +28,9 @@ msgstr " Получено %{time}"
msgid " Please sign in."
msgstr " ПожалуйÑта, войдите."
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr " Попробуйте %{action} Ñтот файл еще раз."
-msgid " Type"
-msgstr " Тип"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Вам нужно Ñделать Ñто до %{grace_period_deadline}."
@@ -447,6 +441,13 @@ msgstr[1] "еще %d комментариÑ"
msgstr[2] "еще %d комментариев"
msgstr[3] "еще %d комментариев"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d открытое обÑуждение"
@@ -468,6 +469,13 @@ msgstr[1] "%d личных проекта будут удалены без воÐ
msgstr[2] "%d личных проектов будут удалены без возможноÑти воÑÑтановлениÑ."
msgstr[3] "%d личных проектов будут удалены без возможноÑти воÑÑтановлениÑ."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d ранее Ñлитый коммит"
@@ -489,12 +497,12 @@ msgstr[1] "%d проекта выбрано"
msgstr[2] "%d проектов выбрано"
msgstr[3] "%d проектов выбрано"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми"
-msgstr[1] "%d запроÑа Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми"
-msgstr[2] "%d запроÑов Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми"
-msgstr[3] "%d запроÑÑ‹ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -620,9 +628,6 @@ msgstr "%{actionText} и переоткрыть %{noteable}"
msgid "%{address} is an invalid IP address range"
msgstr "%{address} — недопуÑтимый диапазон IP-адреÑов"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "%{anchorOpen}Узнайте больше%{anchorClose} о том, как наÑтроить/отключить региÑтрацию на Ñвоем ÑкземплÑре."
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link} клонировал %{original_issue} в %{new_issue}."
@@ -872,6 +877,9 @@ msgstr "%{integrations_link_start}Интеграции%{link_end} позволÑ
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} будет удален! Вы уверены?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -950,8 +958,8 @@ msgstr "%{level_name} запрещено, Ñ‚.к. проект-иÑточник Ð
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "%{link_start}Подробнее%{link_end} о ролÑÑ…."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{link_start}Удалите Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ %{draft_snippet}%{link_end} из заголовка, чтобы позволить Ñтому запроÑу на ÑлиÑние выполнитьÑÑ Ð¿Ñ€Ð¸ готовноÑти."
@@ -959,9 +967,6 @@ msgstr "%{link_start}Удалите Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ %{draft_snippet}%{link_end} Ð
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "%{link_start}Ðачните заголовок Ñ %{draft_snippet}%{link_end}, чтобы предотвратить ÑлиÑние черновика запроÑа на ÑлиÑние до того, как он будет готов."
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr "%{link_start}Какую информацию Ñобирает GitLab Inc.?%{link_end}"
@@ -1031,6 +1036,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, подтвердите ваш email ÑейчаÑ!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} день"
@@ -1170,10 +1178,20 @@ msgstr "%{spanStart}в%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} по %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1486,8 +1504,8 @@ msgstr ""
msgid "+%{tags} more"
msgstr "+ещё %{tags}"
-msgid ", and "
-msgstr ", и "
+msgid ", "
+msgstr ""
msgid ", or "
msgstr ", или "
@@ -1850,9 +1868,18 @@ msgstr "Ðовый релиз %{tag} Ð´Ð»Ñ %{name} опубликован. По
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "Ðовый релиз %{tag} Ð´Ð»Ñ %{name} опубликован. ПоÑетите Ñтраницу Релизов, чтобы узнать больше:"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "Был Ñоздан новый токен заимÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð°Ð²."
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "ÐÐµÐºÐ¾Ð½Ñ„Ð¸Ð´ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ»ÑŒ не может иметь конфиденциальную цель в качеÑтве родителÑ"
@@ -2045,6 +2072,9 @@ msgstr "Об автоматичеÑком развёртывании"
msgid "About this feature"
msgstr "Об Ñтой функциональноÑти"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Отчёты о Жалобах"
@@ -2075,9 +2105,6 @@ msgstr "ДоÑтуп запрещен Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑ
msgid "Access denied: %{error}"
msgstr "ДоÑтуп запрещён: %{error}"
-msgid "Access expiration date"
-msgstr "Дата Ð¿Ñ€ÐµÐºÑ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа"
-
msgid "Access expires"
msgstr "ДоÑтуп иÑтекает"
@@ -2231,6 +2258,9 @@ msgstr "отпиÑатьÑÑ"
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr "ДейÑтвие"
@@ -2288,6 +2318,9 @@ msgstr "Добавить клаÑтер Kubernetes"
msgid "Add LICENSE"
msgstr "Добавить LICENSE"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2411,6 +2444,9 @@ msgstr "Добавить комментарий"
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2639,6 +2675,9 @@ msgstr "К цели добавлÑетÑÑ Ð·Ð°Ð´Ð°Ñ‡Ð°."
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr "ÐаÑтройте чаÑтоту обновлений GitLab UI."
@@ -2720,6 +2759,9 @@ msgstr "Guest"
msgid "AdminArea|Included Free in license"
msgstr "Включены в лицензию беÑплатно"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "Ðедавние группы"
@@ -2732,6 +2774,9 @@ msgstr "Ðедавние пользователи"
msgid "AdminArea|Maintainer"
msgstr "Maintainer"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr "Минимальный доÑтуп"
@@ -2744,6 +2789,9 @@ msgstr "Ðовый проект"
msgid "AdminArea|New user"
msgstr "Ðовый пользователь"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "Owner"
@@ -2828,12 +2876,18 @@ msgstr "Удалить Проект %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Let's Encrypt будет наÑтроена Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑкземплÑра GitLab Ñ Ð¸Ñпользованием Ñтого адреÑа Ñлектронной почты. Ð’Ñ‹ будете получать Ñлектронные пиÑьма Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми об иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ñертификатов. %{link_start}Подробнее.%{link_end}"
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr "Ð’Ñе новые проекты могут иÑпользовать общие runner'Ñ‹ ÑкземплÑра по умолчанию."
msgid "AdminSettings|Auto DevOps domain"
msgstr "Домен Auto DevOps"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "ÐаÑтроить Let's Encrypt"
@@ -2873,6 +2927,27 @@ msgstr "Почта Let's Encrypt"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ ÑеанÑа Ð´Ð»Ñ Git-операций, когда включена 2FA."
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr "Ðовые переменные CI/CD в проектах и группах по умолчанию защищены."
@@ -2888,6 +2963,9 @@ msgstr "Требовать от пользователей подтверждеÐ
msgid "AdminSettings|Required pipeline configuration"
msgstr "Ð¢Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñборочной линии"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr "Выберите шаблон CI/CD"
@@ -2903,6 +2981,12 @@ msgstr "ПродолжительноÑÑ‚ÑŒ ÑеанÑа Ð´Ð»Ñ Git-операцÐ
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "Задайте шаблон CI/CD в качеÑтве обÑзательной конфигурации Ñборочной линии Ð´Ð»Ñ Ð²Ñех проектов данного ÑкземплÑра. ÐŸÑ€Ð¾ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ CI/CD ÑливаетÑÑ Ñ Ð¾Ð±Ñзательной при запуÑке Ñборочной линии. %{link_start}Что такое обÑÐ·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñборочной линии?%{link_end}"
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr "Задайте макÑимальный размер GitLab Pages на проект (0 — без ограничений). %{link_start}Подробнее.%{link_end}"
@@ -2912,9 +2996,6 @@ msgstr "ÐаÑтройки размера и домена Ð´Ð»Ñ ÑтатичеÑ
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 "ПоÑледние артефакты Ð´Ð»Ñ Ð²Ñех заданий в недавних уÑпешных Ñборочных линиÑÑ… каждого проекта ÑохранÑÑŽÑ‚ÑÑ Ð±ÐµÑÑрочно."
@@ -2924,6 +3005,9 @@ msgstr "Проекты в Ñтой группе могут быть выбран
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr "Шаблон обÑзательной конфигурации Ñборочной линии может быть как одним из предоÑтавленных GitLab, так и пользовательÑким, добавленным в репозиторий шаблонов ÑкземплÑра. %{link_start}Как мне Ñоздать репозиторий шаблонов ÑкземплÑра?%{link_end}"
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "Ðктивные пользователи"
@@ -3830,7 +3914,7 @@ msgstr "Разрешить пользователÑм без прав админ
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Разрешить иÑпользовать только выбранные протоколы Ð´Ð»Ñ Ð´Ð¾Ñтупа к Git."
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3944,6 +4028,9 @@ msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Amazon не %{link_start}наÑтроена
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr "ÐšÐ¾Ñ€Ð¿Ð¾Ñ€Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ GitLab была Ñоздана Ð´Ð»Ñ Ð²Ð°Ñ Ð²Ð°ÑˆÐµÐ¹ организацией:"
@@ -3998,6 +4085,9 @@ msgstr "Произошла ошибка при получении публичн
msgid "An error occurred previewing the blob"
msgstr "Произошла ошибка при предварительном проÑмотре объекта"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr "Произошла ошибка при обновлении заголовка"
@@ -4241,6 +4331,9 @@ msgstr "Произошла ошибка при обработке недавне
msgid "An error occurred while parsing the file."
msgstr "Произошла ошибка при обработке файла."
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "Произошла ошибка при удалении целей."
@@ -4356,6 +4449,9 @@ msgstr "ОбÑуждение уже ÑущеÑтвует"
msgid "An unauthenticated user"
msgstr "Ðеавторизованный пользователь"
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "Произошла Ð½ÐµÐ¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° при проверке Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°."
@@ -4446,6 +4542,9 @@ msgstr ""
msgid "Any namespace"
msgstr "Любое проÑтранÑтво имен"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "ID приложениÑ"
@@ -4945,6 +5044,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "Ð’Ñ‹ уверены, что хотите архивировать Ñтот проект?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "Ð’Ñ‹ уверены, что хотите воÑÑтановить Ñтот проект?"
@@ -5189,12 +5291,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr "ВзÑÑ‚ÑŒ на ÑÐµÐ±Ñ Ñти обÑуждениÑ"
-
-msgid "Assign yourself to this issue"
-msgstr "ВзÑÑ‚ÑŒ на ÑÐµÐ±Ñ Ñто обÑуждение"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "Ðазначены %{assignee_users_sentence}."
@@ -5287,6 +5383,9 @@ msgstr "Ðе удалоÑÑŒ прикрепить файл."
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr "Ðудит Ñобытий"
@@ -5317,6 +5416,9 @@ msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹"
msgid "AuditLogs|IP Address"
msgstr "IP-адреÑ"
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ ÑƒÑ‡Ð°Ñтника"
@@ -5338,6 +5440,54 @@ msgstr "Этот меÑÑц"
msgid "AuditLogs|User Events"
msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "Ðвг."
@@ -5698,9 +5848,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "Ваши значки"
-msgid "Balsamiq file could not be loaded."
-msgstr "Файл Balsamiq не может быть загружен."
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5722,6 +5869,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5812,6 +5962,12 @@ msgstr "Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð°Ñ€Ð¸Ñ„Ð½Ñ‹Ð¼ планом Ñтой грÑ
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6038,6 +6194,9 @@ msgstr "ПоиÑк проектов"
msgid "BoardNewIssue|Select a project"
msgstr "Выбрать проект"
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "Произошла ошибка при получении Ñтапов, пожалуйÑта, попробуйте ещё раз."
@@ -6053,6 +6212,9 @@ msgstr "Любой Ñтап"
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6062,24 +6224,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr "Редактировать"
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr "Этап"
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6144,6 +6321,9 @@ msgstr "Произошла ошибка при получении ÑпиÑка Ð
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr "Произошла ошибка при получении дорожек доÑки. ПожалуйÑта, перезагрузите Ñтраницу."
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr "Произошла ошибка при Ñоздании ÑпиÑков. ПожалуйÑта, перезагрузите Ñтраницу."
@@ -6250,6 +6430,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Ветвь уже ÑущеÑтвует"
@@ -6409,9 +6592,6 @@ msgstr "Широковещательное Ñообщение уÑпешно оÐ
msgid "Broadcast Messages"
msgstr "Широковещательные СообщениÑ"
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr "Широковещательные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‚ÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ могут иÑпользоватьÑÑ Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ о плановом обÑлуживании, поÑледних обновлениÑÑ… и многом другом."
-
msgid "Browse Directory"
msgstr "ПроÑмотр каталога"
@@ -6451,6 +6631,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "СущеÑтвующие группы"
@@ -6493,12 +6676,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°"
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупна"
msgid "BulkImport|No parent"
msgstr "Без родителÑ"
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6511,9 +6700,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr "ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°"
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "В новую группу"
@@ -6526,6 +6721,9 @@ msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ групп Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°"
msgid "BulkImport|Your imported groups will appear here."
msgstr "ЗдеÑÑŒ поÑвÑÑ‚ÑÑ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ðµ группы."
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7106,6 +7304,9 @@ msgstr "Это ÑоздаÑÑ‚ новый коммит Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобÑ
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr "Изменён ответÑтвенный(ые)."
@@ -7136,6 +7337,12 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² заголовке не были ÑохраненÑ
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr "Ðе удалоÑÑŒ отобразить диаграммы, так как Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа данных иÑтекло. %{documentationLink}"
@@ -7303,6 +7510,9 @@ msgstr "Пакеты минут CI иÑпользуютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ поÑÐ
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr "Оформление"
@@ -7417,6 +7627,9 @@ msgstr "Подытог"
msgid "Checkout|Tax"
msgstr "Ðалоги"
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr "Итого"
@@ -7660,24 +7873,12 @@ msgstr "Ð’Ñе Ñреды"
msgid "CiVariable|Create wildcard"
msgstr "Создать шаблон"
-msgid "CiVariable|Masked"
-msgstr "ЗамаÑкировано"
-
msgid "CiVariable|New environment"
msgstr "Ðовое окружение"
-msgid "CiVariable|Protected"
-msgstr "Защищено"
-
msgid "CiVariable|Search environments"
msgstr "ИÑкать окружениÑ"
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr "Включить защиту"
-
msgid "Classification Label (optional)"
msgstr "Метка клаÑÑификации (опционально)"
@@ -7735,6 +7936,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr "ОчиÑтить шаблоны ввода данных Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка"
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr "ОчиÑтить приоритет"
@@ -7894,6 +8104,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7918,7 +8131,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7933,6 +8146,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7972,22 +8188,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr "КонфигурациÑ"
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7996,10 +8215,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ"
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr "Копировать токен"
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8011,6 +8248,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8026,10 +8266,13 @@ msgstr "ОпиÑание"
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8041,10 +8284,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8059,9 +8299,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8095,13 +8332,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8122,10 +8353,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8137,13 +8365,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8159,9 +8384,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8183,6 +8405,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8225,9 +8450,6 @@ msgstr "URL API должен быть правильным адреÑом http/h
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Добавить клаÑтер Kubernetes"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Добавить интеграцию Ñ ÐºÐ»Ð°Ñтером Kubernetes"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8336,10 +8558,7 @@ msgstr "ТребуетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ клаÑтера."
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8387,17 +8606,8 @@ msgstr "Ðе удалоÑÑŒ загрузить подÑети"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Создать клаÑтер Kubernetes"
-msgid "ClusterIntegration|Create cluster on"
-msgstr "Создать клаÑтер на"
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr "Создать новый клаÑтер"
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr "Создать новый клаÑтер на EKS"
-
-msgid "ClusterIntegration|Create new cluster on GKE"
-msgstr "Создать новый клаÑтер на GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "СоздаетÑÑ ÐºÐ»Ð°Ñтер Kubernetes"
@@ -8432,6 +8642,9 @@ msgstr "Включить или выключить Ñоединение GitLab Ñ
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Включите Ñтот параметр, еÑли иÑпользуетÑÑ Ñ€Ð¾Ð»ÐµÐ²Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ доÑтупа (RBAC)."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8441,6 +8654,9 @@ msgstr "Введите параметры Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клаÑтера A
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Введите ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ вашем клаÑтере Kubernetes"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "Среда окружениÑ"
@@ -8504,9 +8720,6 @@ msgstr "КлаÑтер группы"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
-msgstr "ЕÑли вы наÑтраиваете неÑколько клаÑтеров и вы иÑпользуете Auto DevOps, %{help_link_start}прочтите Ñто%{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -8552,7 +8765,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8645,9 +8858,6 @@ msgstr "КоличеÑтво узлов"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr "КоличеÑтво узлов должно быть чиÑлом."
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "ПожалуйÑта, убедитеÑÑŒ, что ваш аккаунт Google отвечает Ñледующим требованиÑм:"
@@ -8897,12 +9107,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr "VPC"
@@ -8915,8 +9131,8 @@ msgstr "Мы не Ñмогли подтвердить, что один из ва
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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 "ЕÑли привÑзать клаÑтер Kubernetes к Ñтому проекту, вы Ñ Ð»Ñ‘Ð³ÐºÐ¾Ñтью Ñможете иÑпользовать Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ€ÐµÐ²ÑŒÑŽ, развертывать ваши приложениÑ, запуÑкать Ñборочные линии и многое другое."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr ""
@@ -9159,9 +9375,6 @@ msgstr "Коммит"
msgid "CommitMessage|Add %{file_name}"
msgstr "Добавить %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "Ñоздал"
@@ -9288,6 +9501,9 @@ msgstr ""
msgid "Complete"
msgstr "Завершено"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9321,9 +9537,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9348,6 +9561,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9357,7 +9573,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9369,12 +9585,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9483,6 +9711,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr "ÐаÑтроить ÑущеÑтвующую уÑтановку"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9528,6 +9759,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9537,6 +9771,9 @@ msgstr "Подтвердить"
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9606,6 +9843,12 @@ msgstr "ПоздравлÑем, беÑплатный пробный период
msgid "Connect"
msgstr "Подключить"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr "Подключить вÑе репозитории"
@@ -9731,9 +9974,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9791,8 +10031,8 @@ msgstr "Ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Docker"
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
-msgstr "Правила иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹"
+msgid "ContainerRegistry|Expiration policy is disabled."
+msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr ""
@@ -9888,6 +10128,9 @@ msgstr "Корневой образ"
msgid "ContainerRegistry|Run cleanup:"
msgstr "ЗапуÑтить очиÑтку:"
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "Ðекоторые теги не были удалены"
@@ -9927,6 +10170,9 @@ msgstr "Тег уÑпешно помечен Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ."
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr "Теги уÑпешно помечены Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ."
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr "Теги, которые ÑоответÑтвуют Ñтим правилам будут %{strongStart}Ñохранены%{strongEnd}, даже, еÑли они ÑоответÑтвуют правилам ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ. %{secondStrongStart}ПоÑледний%{secondStrongEnd} тег вÑегда ÑохранÑетÑÑ."
@@ -10236,6 +10482,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10272,6 +10521,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10287,9 +10542,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10407,7 +10659,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10446,9 +10698,15 @@ msgstr "Создать новый домен"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr "Сначала Ñоздайте учетную запиÑÑŒ GitLab, а затем подключите ее к вашей учетной запиÑи %{label}."
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr "Создать команду в Mattermost Ð´Ð»Ñ Ñтой группы"
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10560,9 +10818,6 @@ msgstr "Создать новый"
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr "Создать новую Ñборочную линию CI/CD"
-
msgid "Create new Value Stream"
msgstr "Создать новый Поток ценноÑти"
@@ -10587,6 +10842,9 @@ msgstr "Создать новую метку"
msgid "Create new project"
msgstr "Создать новый проект"
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr "Создайте или импортируйте Ñвой первый проект"
@@ -10617,9 +10875,6 @@ msgstr "Создать тему"
msgid "Create user"
msgstr "Создать пользователÑ"
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr "Создать шаблон: %{searchTerm}"
@@ -10872,43 +11127,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10923,10 +11160,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11037,19 +11274,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11178,15 +11412,33 @@ msgstr "должен быть в группе"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} выбрано (макÑимум — %{maxLabels})"
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11243,12 +11495,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr "Групповой выпадающий фильтр"
@@ -11264,10 +11522,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11414,6 +11672,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11468,9 +11729,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11718,6 +11976,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr "Данные вÑе еще вычиÑлÑÑŽÑ‚ÑÑ..."
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr "Тип данных"
@@ -11847,9 +12108,6 @@ msgstr "Ветвь по умолчанию"
msgid "Default branch and protected branches"
msgstr "Ветвь по умолчанию и защищенные ветки"
-msgid "Default branch protection"
-msgstr "Защита ветки по умолчанию"
-
msgid "Default delayed project deletion"
msgstr "Отложенное удаление проекта по умолчанию"
@@ -11868,9 +12126,6 @@ msgstr "Первый день недели по умолчанию"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Первый день недели по умолчанию в календарÑÑ… и ÑредÑтвах выбора даты."
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr "Защита от ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð° по умолчанию"
@@ -12525,6 +12780,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12589,6 +12871,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13248,6 +13533,9 @@ msgstr "Отклонено в Ñборке %{pipelineLink}"
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr "Отклонено в Ñборке %{pipelineLink} в %{projectLink}"
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13305,6 +13593,9 @@ msgstr "Домен"
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13395,6 +13686,9 @@ msgstr "ГолоÑа \"против\""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13440,6 +13734,45 @@ msgstr "Дата завершениÑ"
msgid "Duration"
msgstr "ДлительноÑÑ‚ÑŒ"
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13542,9 +13875,6 @@ msgstr "Правка группы: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "Изменить идентификацию Ð´Ð»Ñ %{user_name}"
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13869,6 +14199,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr "Включить отложенное удаление проектов Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… групп по умолчанию."
@@ -14146,7 +14479,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14278,6 +14611,9 @@ msgstr "ОкружениÑ"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "ÐžÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ - Ñто меÑта где код развёртываетÑÑ, например теÑтовое окружение или продакшн."
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14293,9 +14629,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr "Журналы Ñ %{start} по %{end}."
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Ðовое окружение"
@@ -14377,8 +14710,11 @@ msgstr ""
msgid "Environments|Updated"
msgstr "Обновлено"
-msgid "Environments|You don't have any environments right now"
-msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ ни одного Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° данный момент"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr ""
@@ -14749,6 +15085,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr "Ðет доÑтупных проектов"
@@ -14758,6 +15100,9 @@ msgstr "Выбрать проект"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr "Ошибки"
@@ -14999,6 +15344,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15011,6 +15359,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr "За иÑключением политики:"
@@ -15131,6 +15482,9 @@ msgstr "Обзор Групп"
msgid "Explore groups"
msgstr "Обзор групп"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Обзор проектов"
@@ -15260,9 +15614,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15375,6 +15735,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr "Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ ÑÑылку"
@@ -15799,7 +16162,7 @@ msgstr "Фев."
msgid "February"
msgstr "Февраль"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15940,9 +16303,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr "Фильтровать ваши репозитории по имени"
-
msgid "Filter..."
msgstr "Фильтр..."
@@ -16207,9 +16567,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16237,6 +16594,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "От ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð¾ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ в рабочей Ñреде"
@@ -16300,9 +16660,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16852,9 +17209,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16867,6 +17221,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr "Член команды GitLab"
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "Пользователь GitLab"
@@ -16918,9 +17275,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ GitLab или Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17146,15 +17500,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr "ПоиÑк в GitLab"
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17194,6 +17557,9 @@ msgstr ""
msgid "Go to environments"
msgstr "Перейти в окружениÑ"
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17320,9 +17686,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17332,6 +17695,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr "Готово"
@@ -17536,9 +17935,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17941,13 +18337,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18070,6 +18466,9 @@ msgstr "Создать группу"
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18088,9 +18487,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18211,6 +18607,113 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr "HTTP Basic: доÑтуп запрещен\\nÐ’Ñ‹ должны иÑпользовать личный токен Ñ Ð´Ð¾Ñтупом к «api» Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Git через HTTP.\\nÐ’Ñ‹ можете Ñоздать его на %{profile_personal_access_tokens_url}"
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr "Ð¥Ñшированное хранилище должно быть включено Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Geo"
@@ -18383,6 +18886,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18534,9 +19040,6 @@ msgstr ""
msgid "I forgot my password"
msgstr "Я забыл пароль"
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18612,9 +19115,6 @@ msgstr "ИÐФОРМÐЦИЯ: Срок дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ SSH-клюÑ
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr "ИÐФОРМÐЦИЯ: Срок дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ SSH-ключа иÑтекает. ПожалуйÑта, Ñоздайте новый."
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "IP-адреÑ"
@@ -18744,6 +19244,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18818,7 +19324,7 @@ msgstr "Импортировать ÑкÑпортированный проект
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18848,12 +19354,6 @@ msgstr ""
msgid "Import issues"
msgstr "Импорт обÑуждений"
-msgid "Import members"
-msgstr "Импорт учаÑтников"
-
-msgid "Import members from another project"
-msgstr "Импорт учаÑтников из другого проекта"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Импортировать неÑколько репозиториев, загрузив файл манифеÑта."
@@ -18863,9 +19363,6 @@ msgstr "Импортировать проект"
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr "Импорт учаÑтников проекта"
-
msgid "Import projects from Bitbucket"
msgstr "Импорт проектов из Bitbucket"
@@ -19206,9 +19703,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19287,15 +19781,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19587,6 +20072,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19596,6 +20084,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19653,6 +20150,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19668,6 +20171,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19749,6 +20255,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19770,6 +20279,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19779,6 +20291,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "Включать Ð¸Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° в текÑте ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñлектронной почте"
@@ -19887,6 +20402,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20089,6 +20610,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20203,6 +20727,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20215,12 +20742,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20368,9 +20901,6 @@ msgstr "Приглашение"
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr "Приглашение"
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20386,12 +20916,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr "ПриглаÑить группу"
-
-msgid "Invite member"
-msgstr "ПриглаÑить учаÑтников"
-
msgid "Invite members"
msgstr "ПриглаÑить учаÑтников"
@@ -20485,6 +21009,9 @@ msgstr "ПриглаÑить учаÑтников"
msgid "InviteMembersModal|Members were successfully added"
msgstr "УчаÑтники уÑпешно добавлены"
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "ПоиÑк группы Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ"
@@ -20503,6 +21030,12 @@ msgstr "Что-то пошло не так"
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr "Чтобы назначить обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¼Ñƒ учаÑтнику команды, нужен проект Ð´Ð»Ñ Ñтих обÑуждений. %{linkStart}Создайте проект.%{linkEnd}"
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr "Вы приглашаете группу в группу %{strongStart}%{name}%{strongEnd}."
@@ -20515,6 +21048,9 @@ msgstr "Ð’Ñ‹ приглашаете учаÑтников в группу %{stron
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr "Ð’Ñ‹ приглашаете учаÑтников в проект %{strongStart}%{name}%{strongEnd}."
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr "ПриглаÑить группу"
@@ -20707,9 +21243,6 @@ msgstr "ОбÑуждение было закрыто %{name} %{reason}"
msgid "Issue weight"
msgstr "Приоритет обÑуждениÑ"
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20752,8 +21285,8 @@ msgstr "Удалить доÑку"
msgid "IssueBoards|No matching boards found"
msgstr "Ðет подходÑщих доÑок"
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr "Ðекоторые из ваших доÑок Ñкрыты. Ðктивируйте лицензию, чтобы Ñнова увидеть их."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr ""
msgid "IssueBoards|Switch board"
msgstr "Переключить доÑку"
@@ -20923,10 +21456,13 @@ msgstr "Ð˜Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð°"
msgid "Iterations"
msgstr "Итерации"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20941,12 +21477,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20956,6 +21486,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20977,7 +21510,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20995,6 +21534,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21004,10 +21546,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21019,6 +21567,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21031,6 +21582,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21286,9 +21840,6 @@ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Email"
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21301,6 +21852,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21364,6 +21918,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21373,6 +21930,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21400,15 +21963,24 @@ msgstr "ПроÑмотр"
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "Скачать"
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21424,9 +21996,27 @@ msgstr ""
msgid "Job|Keep"
msgstr "ОÑтавить"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "Прокрутить вниз"
@@ -21436,6 +22026,9 @@ msgstr "Прокрутить вверх"
msgid "Job|Show complete raw"
msgstr "Показать полный иÑходный текÑÑ‚"
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21460,6 +22053,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21821,6 +22417,9 @@ msgstr "ПоÑледнÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° обновлениÑ"
msgid "Last updated"
msgstr "ПоÑледний раз обновлено"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21929,6 +22528,12 @@ msgstr "Узнать больше о шаблонах проекта группÐ
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22070,6 +22675,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22082,6 +22690,9 @@ msgstr ""
msgid "License Compliance"
msgstr "Служба комплаенÑа лицензий"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22100,6 +22711,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22127,9 +22741,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22172,6 +22783,13 @@ msgstr[1] "Служба комплаенÑа лицензий обнаружил
msgstr[2] "Служба комплаенÑа лицензий обнаружил %d новых лицензий и политик нарушений; необходимо утверждение"
msgstr[3] "Служба комплаенÑа лицензий обнаружил %d новых лицензий и политик нарушений; необходимо утверждение"
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr "Служба комплаенÑа лицензий не обнаружила лицензий только Ð´Ð»Ñ Ð¸Ñходной ветки"
@@ -22181,6 +22799,12 @@ msgstr "Служба комплаенÑа лицензий не обнаружи
msgid "LicenseCompliance|License name"
msgstr "Ðазвание лицензии"
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr "Удалить лицензию"
@@ -22196,6 +22820,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr "Эта Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ в Ñтом проекте."
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить лицензию %{name} из Ñтого проекта."
@@ -22385,9 +23015,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22661,6 +23288,9 @@ msgstr "Управление метками группы"
msgid "Manage labels"
msgstr "Управление метками"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22694,6 +23324,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22856,6 +23489,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22976,9 +23612,6 @@ msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ"
msgid "Maximum job timeout has a value which could not be accepted"
msgstr "МакÑимальный тайм-аут Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ значение, которое не может быть принÑто"
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23000,6 +23633,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23239,9 +23878,6 @@ msgstr "ПоиÑк приглашённых"
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23278,7 +23914,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23353,7 +23989,7 @@ msgstr "ЗапроÑÑ‹ на ÑлиÑние"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "ЗапроÑÑ‹ на ÑлиÑние- Ñто меÑто, где можно предлагать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½Ð¾Ñимые в проект, и обÑуждать Ñти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸"
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23909,9 +24545,6 @@ msgstr "например, запроÑов в Ñекунду"
msgid "Mi"
msgstr "Ми"
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr "ПеренеÑено %{success_count}/%{total_count} файлов."
@@ -24033,6 +24666,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr "Выполненные задачи"
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Удалить Ñтап"
@@ -24051,6 +24687,9 @@ msgstr "Этап %{milestoneTitle} не найден"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24069,12 +24708,21 @@ msgstr "Повышение ÑƒÑ€Ð¾Ð²Ð½Ñ %{milestoneTitle} Ñделает его
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "Это дейÑтвие не может быть отменено."
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24192,6 +24840,9 @@ msgstr "МеÑÑц"
msgid "Months"
msgstr "МеÑÑцы"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr "Больше информации"
@@ -24288,16 +24939,16 @@ msgstr "Развернуть повторно"
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24406,6 +25057,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr "Ожидающие Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ð¸ должны быть проверены и одобрены владельцем группы. Узнайте больше о %{user_caps_link_start}пользовательÑкой вмеÑтимоÑти%{link_end} и об %{users_pending_approval_link_start}одобрении пользователей%{link_end}."
@@ -24481,6 +25159,9 @@ msgstr ""
msgid "Need help?"
msgstr "Ðужна помощь?"
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24667,9 +25348,6 @@ msgstr "Ðикогда"
msgid "New"
msgstr "Ðовый"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24764,6 +25442,9 @@ msgstr "Ðовый каталог"
msgid "New discussion"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð´Ð¸ÑкуÑÑиÑ"
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr "Ðовое окружение"
@@ -24839,6 +25520,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr "Ðовый релиз"
@@ -24854,9 +25538,6 @@ msgstr "Ðовый региÑтрационный токен обработчиÐ
msgid "New schedule"
msgstr "Ðовое раÑпиÑание"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Ðовый Ñниппет"
@@ -24905,6 +25586,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ð´Ð¸ÑкуÑÑиÑ"
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr "Ðикнейм"
@@ -24953,6 +25637,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "Методы аутентификации не наÑтроены."
@@ -24980,12 +25667,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25064,9 +25745,6 @@ msgstr ""
msgid "No iteration"
msgstr "Ðет итераций"
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr "Ðет итераций Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"
@@ -25088,7 +25766,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25121,9 +25799,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr "Ðет Ñтапов Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"
-
msgid "No namespace"
msgstr ""
@@ -25205,6 +25880,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr "Тег не выбран"
@@ -25362,6 +26040,9 @@ msgstr "Показывать только иÑторию"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr "Этот комментарий изменилÑÑ Ñ Ñ‚ÐµÑ… пор, как вы начали редактирование, проÑмотрите %{open_link}обновленный комментарий%{close_link}, чтобы убедитьÑÑ, что Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ потерÑна"
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25810,10 +26491,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25961,6 +26642,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25979,9 +26663,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Только учаÑтники проекта могут оÑтавлÑÑ‚ÑŒ комментарии."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr "Будут импортированы только учаÑтники проекта. УчаÑтники группы будут пропущены."
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26012,10 +26693,10 @@ msgstr "Открыто"
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26030,9 +26711,6 @@ msgstr ""
msgid "Open raw"
msgstr "Открыть иÑходник"
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26060,6 +26738,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "ОткроетÑÑ Ð² новом окне"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ. Проверьте журналы пода Ð´Ð»Ñ %{pod_name} Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации."
@@ -26201,6 +26882,9 @@ msgstr ""
msgid "Owner"
msgstr "Владелец"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26970,6 +27654,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr "Выберите имÑ"
@@ -27246,6 +27933,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Сборочные линии"
@@ -27255,12 +27945,15 @@ msgstr "Диаграммы Ñборочных линий"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr "ÐаÑтройки Ñборочных линий Ð´Ð»Ñ '%{project_name}' были уÑпешно обновлены."
-msgid "Pipelines|API"
-msgstr "API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
+msgid "Pipelines|API"
+msgstr "API"
+
msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr ""
@@ -27306,8 +27999,8 @@ msgstr "Правка"
msgid "Pipelines|Editor"
msgstr "Редактор"
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
-msgstr "ОзнакомьтеÑÑŒ Ñ ÑинтакÑиÑом GitLab CI/CD, начав Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¹ трёхÑтапной Ñборочной линии."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
+msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
msgstr "Ðачать работу Ñ GitLab CI/CD"
@@ -27315,13 +28008,13 @@ msgstr "Ðачать работу Ñ GitLab CI/CD"
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
-msgstr "ПовыÑьте качеÑтво кода Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27330,7 +28023,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27348,6 +28041,9 @@ msgstr "Объединённый YAML доÑтупен только Ð´Ð»Ñ Ð¿Ñ€Ð
msgid "Pipelines|More Information"
msgstr "Больше информации"
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27360,9 +28056,15 @@ msgstr "Редактор Ñборочных линий"
msgid "Pipelines|Project cache successfully reset."
msgstr "КÑш проекта уÑпешно очищен."
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "Что-то пошло не так, при очиÑтке кÑша обработчиков заданий."
@@ -27417,24 +28119,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "Этот проект в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ наÑтроен Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Ñборочных линий."
-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 "Токен"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
-msgstr "ИÑпользовать шаблон CI/CD"
+msgid "Pipelines|Try test template"
+msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr "ИÑпользуйте шаблон %{codeStart}.gitlab-ci.yml%{codeEnd}, чтобы изучить, как работает CI/CD."
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27492,9 +28188,6 @@ msgstr "Проверка ÑоÑтоÑÐ½Ð¸Ñ Ñборочной линии"
msgid "Pipeline|Checking pipeline status."
msgstr "Проверка ÑоÑтоÑÐ½Ð¸Ñ Ñборочной линии."
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27510,9 +28203,6 @@ msgstr "Дата"
msgid "Pipeline|Detached merge request pipeline"
msgstr "Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð¾Ñ‚ÑоединившегоÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñа на ÑлиÑние"
-msgid "Pipeline|Duration"
-msgstr "ДлительноÑÑ‚ÑŒ"
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27846,9 +28536,6 @@ msgstr "ПожалуйÑта, выберите файл"
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr "ПожалуйÑта, выберите группу."
-
msgid "Please select a valid target branch"
msgstr "ПожалуйÑта, выберите дейÑтвительную целевую ветку"
@@ -27903,7 +28590,7 @@ msgstr "Под не найден"
msgid "Pods in use"
msgstr "ИÑпользуемые поды"
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27948,7 +28635,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28056,6 +28743,9 @@ msgstr "ИÑпользовать отноÑительное времÑ"
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr "Пред."
@@ -28365,6 +29055,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28386,9 +29079,6 @@ msgstr "Полное имÑ"
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28425,6 +29115,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28530,6 +29223,9 @@ msgstr "Эта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ отображатьÑÑ Ð² ваÑ
msgid "Profiles|Time settings"
msgstr "ÐаÑтройки времени"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ"
@@ -28611,9 +29307,6 @@ msgstr "Ваше Ð¸Ð¼Ñ Ð±Ñ‹Ð»Ð¾ автоматичеÑки уÑтановлен
msgid "Profiles|Your status"
msgstr "Ваш ÑтатуÑ"
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29118,8 +29811,8 @@ msgstr "Каждое ÑлиÑние Ñоздает коммит ÑлиÑниÑ."
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr "Каждый проект может иметь Ñвоё ÑобÑтвенное проÑтранÑтво Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð·Ð¾Ð² Docker"
-msgid "ProjectSettings|Every project can have its own space to store its packages."
-msgstr "Каждый проект может иметь ÑобÑтвенное проÑтранÑтво Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñвоих пакетов."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
+msgstr ""
msgid "ProjectSettings|Everyone"
msgstr "Каждый"
@@ -29217,6 +29910,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr "ÐŸÑ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑлиÑнию"
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr "Коммиты ÑлиÑÐ½Ð¸Ñ Ð½Ðµ ÑоздаютÑÑ."
@@ -29388,6 +30084,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr "При возникновении конфликтов ÑлиÑÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŽ предоÑтавлÑетÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ выбрать перебазирование."
@@ -29451,6 +30150,9 @@ msgstr "Pages/Hugo"
msgid "ProjectTemplates|Pages/Jekyll"
msgstr "Pages/Jekyll"
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Pages/ПроÑтой HTML"
@@ -29469,9 +30171,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr "Spring"
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29616,6 +30315,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr "Ðет доÑтупных опций импорта"
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30225,7 +30930,10 @@ msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸"
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30658,9 +31366,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30670,9 +31384,6 @@ msgstr ""
msgid "Related merge requests"
msgstr "СвÑзанные запроÑÑ‹ на ÑлиÑние"
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr "ОтноÑитÑÑ Ðº"
@@ -30905,6 +31616,9 @@ msgstr "Удалить потраченное времÑ"
msgid "Remove time estimate"
msgstr "Удалить оценку времени"
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31115,7 +31829,10 @@ msgstr "ПожаловатьÑÑ"
msgid "Report abuse to admin"
msgstr "Сообщить о нарушении админиÑтратору"
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31207,12 +31924,18 @@ msgstr "Отказ"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr "Отчеты по метрикам загружаютÑÑ"
@@ -31225,6 +31948,12 @@ msgstr "Отчеты о метриках не изменилиÑÑŒ"
msgid "Reports|Metrics reports failed loading results"
msgstr "Отчетам о метриках не удалоÑÑŒ загрузить результаты"
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31240,9 +31969,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31759,7 +32494,7 @@ msgstr ""
msgid "Review requests for you"
msgstr "ЗапроÑÑ‹ рецензий Ð´Ð»Ñ Ð²Ð°Ñ"
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31823,9 +32558,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr "Удаление"
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31877,10 +32609,10 @@ msgstr "ЗапуÑк заданий без тегов"
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31901,6 +32633,26 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31910,7 +32662,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31937,9 +32689,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31952,12 +32716,22 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31967,6 +32741,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31976,18 +32753,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32009,25 +32780,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32036,15 +32813,31 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32078,9 +32871,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32093,21 +32892,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32117,7 +32946,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32138,6 +32967,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32147,16 +32979,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32174,7 +33009,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32192,7 +33027,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32201,9 +33036,6 @@ 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 "Ð’Ñ‹ иÑпользовали %{quotaUsed} из %{quotaLimit} ваших минут Ñборки на общих Runner'ах."
@@ -32237,9 +33069,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "ВыполнÑетÑÑ"
@@ -32354,10 +33183,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32549,6 +33378,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32695,6 +33527,9 @@ msgstr ""
msgid "Seats"
msgstr "МеÑта"
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr "Данные об иÑпользовании меÑÑ‚ на %{last_enqueue_time} (обновлÑетÑÑ ÐµÐ¶ÐµÐ´Ð½ÐµÐ²Ð½Ð¾)"
@@ -32719,6 +33554,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32845,16 +33689,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32911,6 +33758,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32926,6 +33779,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32941,12 +33800,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32956,6 +33824,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32968,9 +33839,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33019,6 +33902,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33037,12 +33923,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33061,6 +33956,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33070,10 +33968,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33097,6 +33998,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33181,6 +34091,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33322,6 +34235,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33346,7 +34262,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33358,16 +34274,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33427,6 +34346,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33439,15 +34361,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33484,15 +34409,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr "Выберите файл на левой боковой панели, чтобы начать редактирование. ПоÑле Ñтого вы Ñможете зафикÑировать Ñвои изменениÑ."
-msgid "Select a group to invite"
-msgstr "Выберите группу"
-
msgid "Select a label"
msgstr "Выберите метку"
@@ -33631,6 +34553,9 @@ msgstr ""
msgid "Select target branch"
msgstr "Выбор целевой ветки"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33967,6 +34892,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34012,6 +34940,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr "Задать оценку времени"
@@ -34057,9 +34988,6 @@ msgstr "УÑтановить приоритет на %{weight}."
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "Добавить Ñмайл"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34316,6 +35244,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr "Показать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð²"
@@ -34485,6 +35416,9 @@ msgstr ""
msgid "Signed in"
msgstr "ÐвторизовалиÑÑŒ"
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34656,6 +35590,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34665,6 +35602,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr "Кто-то отредактировал обÑуждение одновременно Ñ Ð²Ð°Ð¼Ð¸. ПожалуйÑта, проверьте %{linkStart}обÑуждение%{linkEnd} и убедитеÑÑŒ, что внеÑённые Вами Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñлучайно не затёрли чужие."
@@ -34704,9 +35644,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr "Что-то пошло не так при переключении кнопки"
-
msgid "Something went wrong while adding your award. Please try again."
msgstr "Что-то пошло не так при добавлении вашей награды. ПожалуйÑта, попробуйте ещё раз."
@@ -34839,9 +35776,6 @@ msgstr "Что-то пошло не так при обновлении требÐ
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35265,6 +36199,9 @@ msgstr "Дата начала"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35409,6 +36346,9 @@ msgstr "СтатуÑ:"
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35481,9 +36421,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35532,6 +36469,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr "Будьте в курÑе производительноÑти и работоÑпоÑобноÑти вашего Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ наÑтройки Prometheus Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° ваших развёртываний."
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35697,10 +36637,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36081,8 +37021,12 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr "Чтобы активировать подпиÑку, подключитеÑÑŒ к Ñерверам GitLab через %{linkStart}Облачное Лицензирование%{linkEnd}, безоблачный ÑпоÑоб ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñкой."
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36225,12 +37169,6 @@ msgstr ""
msgid "System Info"
msgstr "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ ÑиÑтеме"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr "СиÑтемное (%{default})"
@@ -36387,6 +37325,12 @@ msgstr ""
msgid "Target branch"
msgstr "Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð²ÐµÑ‚ÐºÐ°"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36420,9 +37364,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "Шаблон"
@@ -36847,9 +37788,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36880,6 +37818,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36892,6 +37833,9 @@ msgstr "Ветка Ð´Ð»Ñ Ñтого проекта не имеет активн
msgid "The branch or tag does not exist"
msgstr "Ветка или тег не ÑущеÑтвует"
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36913,12 +37857,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "Соединение будет отключено через %{timeout}. Ð”Ð»Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸ÐµÐ², требующих больше времени, иÑпользуйте комбинацию clone/push."
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr "Содержание Ñтой Ñтраницы не закодировано в UTF-8. Редактировать можно только через Git репозиторий."
@@ -37214,6 +38164,9 @@ msgstr "Проект был уÑпешно импортирован."
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37223,6 +38176,12 @@ msgstr "Удаленное зеркалирование занÑло ÑлишкÐ
msgid "The remote repository is being updated..."
msgstr "Удаленный репозиторий обновлÑетÑÑ..."
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37244,6 +38203,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr "ДоÑтуп к Ñниппету можно получить без какой-либо аутентификации."
@@ -37256,6 +38218,9 @@ msgstr "Сниппет виден только учаÑтникам проект
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37541,9 +38506,6 @@ 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 ""
@@ -37685,6 +38647,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37697,7 +38662,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37724,7 +38689,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37733,7 +38698,7 @@ msgstr "Это дейÑтвие может привеÑти к потере да
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37820,6 +38785,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37847,6 +38818,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37973,9 +38947,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr "Это задание завиÑит от рабочих заданий на верхнем уровне, которые должны завершитьÑÑ ÑƒÑпешно, чтобы Ñто задание было запущено"
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr "Это фоновое задание не Ñодержит траÑÑировку иÑполнениÑ."
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Это фоновое задание отменено"
@@ -38213,6 +39193,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Этот пользователь не может быть разблокирован вручную из GitLab"
@@ -38689,6 +39672,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr "Чтобы добавить запиÑÑŒ вручную, предоÑтавьте Ñледующую информацию в приложении на Ñвоем телефоне."
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38770,6 +39756,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38788,7 +39777,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr "Чтобы получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ наÑтроенных вручную Ñлужб Prometheus, добавьте Ñледующий URL и ключ авторизации в файл конфигурации веб-обработчика Prometheus. Узнайте подробнее о %{linkStart}наÑтройке Prometheus%{linkEnd} Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ уведомлений в GitLab."
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38938,9 +39927,6 @@ msgstr "Переключить боковую панель"
msgid "Toggle the Performance Bar"
msgstr "Показать/Ñкрыть панель производительноÑти"
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38986,6 +39972,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39079,6 +40068,9 @@ msgstr "Ðевозможно обновить путь поÑкольку в ÑÑ
msgid "TransferGroup|Database is not supported."
msgstr "База данных не поддерживаетÑÑ."
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr "Группа Ñодержит проекты Ñ Ð¿Ð°ÐºÐµÑ‚Ð°Ð¼Ð¸ NPM."
@@ -39268,6 +40260,9 @@ msgstr "Попробовать Ñнова"
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39472,6 +40467,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr "Ðе удалоÑÑŒ загрузить отличиÑ"
@@ -39508,6 +40506,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr "Ðевозможно обновить Ñто обÑуждение в данный момент."
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39634,6 +40635,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39814,9 +40818,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "Загрузить новый файл"
@@ -39835,9 +40836,6 @@ msgstr "Загрузить файл"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39847,6 +40845,9 @@ msgstr "Загрузить карту объектов"
msgid "UploadLink|click to upload"
msgstr "кликните Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39904,7 +40905,7 @@ msgstr "Текущий период иÑпользованиÑ"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40141,6 +41142,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40150,6 +41154,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40963,9 +41970,6 @@ msgstr "ПроÑмотр заменённого файла @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr "ПроÑмотр поддерживаемых Ñзыков и фреймворков"
@@ -40990,6 +41994,9 @@ msgstr ""
msgid "Viewing commit"
msgstr "ПроÑмотр коммита"
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41095,9 +42102,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41119,6 +42123,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41239,6 +42246,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41335,9 +42345,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41383,6 +42390,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41404,6 +42414,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41704,6 +42717,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41749,9 +42765,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41794,13 +42807,13 @@ msgstr "Когда runner закреплён, он не может быть на
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41819,6 +42832,9 @@ msgstr[3] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr "Когда:"
@@ -41966,9 +42982,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41993,12 +43006,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42011,18 +43018,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42035,18 +43030,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "Ðапишите что-нибудь или перетащите Ñюда файлы…"
@@ -42122,6 +43108,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42131,6 +43120,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42341,6 +43333,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42434,6 +43432,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr "Ð’Ñ‹ можете перенеÑти проект только в те проÑтранÑтва имен, которыми управлÑете."
@@ -42464,6 +43465,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42548,6 +43552,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr "У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно прав Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñтого дейÑтвиÑ."
@@ -42630,10 +43637,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42813,6 +43820,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42825,6 +43835,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43116,7 +44129,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43381,6 +44394,13 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43478,6 +44498,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43556,6 +44585,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr "РаÑÑледуйте Ñту уÑзвимоÑÑ‚ÑŒ, вынеÑÑ Ð½Ð° обÑуждение"
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43584,9 +44622,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43672,45 +44716,6 @@ msgstr "закрыто"
msgid "closed issue"
msgstr "закрытое обÑуждение"
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43729,7 +44734,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43839,6 +44844,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "включено"
@@ -44181,6 +45189,13 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
@@ -44278,6 +45293,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44397,9 +45418,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "СлиÑние не удалоÑÑŒ."
-msgid "mrWidget|Merge locally"
-msgstr "Слить локально"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44472,6 +45490,9 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
msgid "mrWidget|Resolve conflicts"
msgstr "Разрешить конфликты"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "Откатить"
@@ -44592,9 +45613,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr "н/д"
-
msgid "need attention"
msgstr "требуют вниманиÑ"
@@ -44655,6 +45673,9 @@ msgstr ""
msgid "or"
msgstr "или"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44752,9 +45773,6 @@ msgstr ""
msgid "project access tokens"
msgstr "токены доÑтупа к проекту"
-msgid "project avatar"
-msgstr "логотип проекта"
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44957,9 +45975,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/si_LK/gitlab.po b/locale/si_LK/gitlab.po
index e8298febc0c..136f87e6dbe 100644
--- a/locale/si_LK/gitlab.po
+++ b/locale/si_LK/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: si-LK\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:41\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr " %{start} සිට %{end}"
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr " කරුණà·à¶šà¶» ඇතුළු වන්න."
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr " වර්ගය"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "තවත් අදහස් %d"
msgstr[1] "තවත් අදහස් %d"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -393,8 +397,8 @@ msgstr[1] ""
msgid "%d tag"
msgid_plural "%d tags"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "අනන්â€à¶ºà¶± %d"
+msgstr[1] "අනන්â€à¶ºà¶± %d"
msgid "%d tag per image name"
msgid_plural "%d tags per image name"
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -555,8 +556,8 @@ msgstr ""
msgid "%{count} contact"
msgid_plural "%{count} contacts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "සබඳත෠%{count}"
+msgstr[1] "සබඳත෠%{count}"
msgid "%{count} files touched"
msgstr ""
@@ -577,8 +578,8 @@ msgstr ""
msgid "%{count} more release"
msgid_plural "%{count} more releases"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "තව නිකුතු %{count}"
+msgstr[1] "තව නිකුතු %{count}"
msgid "%{count} of %{required} approvals from %{name}"
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "දවස් %{no_of_days}"
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr "%{start} සිට %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1055,7 +1067,7 @@ msgid "%{template_project_id} is unknown or invalid"
msgstr ""
msgid "%{text} is available"
-msgstr ""
+msgstr "%{text} තිබේ"
msgid "%{timebox_name} should belong either to a project or a group."
msgstr ""
@@ -1145,7 +1157,7 @@ msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notif
msgstr ""
msgid "%{widget} options"
-msgstr ""
+msgstr "%{widget} විකල්ප"
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
@@ -1188,14 +1200,14 @@ msgstr ""
msgid "(%d closed)"
msgid_plural "(%d closed)"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "(%d වස෠ඇත)"
+msgstr[1] "(%d වස෠ඇත)"
msgid "(%{mrCount} merged)"
-msgstr ""
+msgstr "(%{mrCount} සංයුක්තයි)"
msgid "(%{value}) has already been taken"
-msgstr ""
+msgstr "(%{value}) දà·à¶±à¶§à¶¸à¶­à·Š ගෙන ඇත"
msgid "(+%{count}&nbsp;rules)"
msgstr ""
@@ -1216,7 +1228,7 @@ msgid "(deleted)"
msgstr ""
msgid "(expired)"
-msgstr ""
+msgstr "(කල් ඉකුත්ය)"
msgid "(leave blank if you don't want to change it)"
msgstr ""
@@ -1264,17 +1276,17 @@ msgstr ""
msgid "+%d more"
msgid_plural "+%d more"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "තව +%d"
+msgstr[1] "තව +%d"
msgid "+%{approvers} more approvers"
msgstr ""
msgid "+%{extra} more"
-msgstr ""
+msgstr "තවත් +%{extra}"
msgid "+%{more_assignees_count}"
-msgstr ""
+msgstr "+%{more_assignees_count}"
msgid "+%{more_assignees_count} more assignees"
msgstr ""
@@ -1288,8 +1300,8 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
-msgstr ", සහ "
+msgid ", "
+msgstr ""
msgid ", or "
msgstr ", à·„à· "
@@ -1513,7 +1525,7 @@ msgid "8 hours"
msgstr "පà·à¶º 8"
msgid ":%{startLine} to %{endLine}"
-msgstr ""
+msgstr ":%{startLine} සිට %{endLine}"
msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents."
msgstr ""
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1651,7 +1672,7 @@ msgid "ACTION REQUIRED: Something went wrong while obtaining the Let's Encrypt c
msgstr ""
msgid "API"
-msgstr ""
+msgstr "යෙ.ක්â€à¶».මු."
msgid "API Fuzzing"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr "මෙම විà·à·šà·‚à·à¶‚ගය ගà·à¶±"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr "ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œà¶º"
@@ -2020,7 +2044,7 @@ msgid "Add"
msgstr "එකතු"
msgid "Add \"%{value}\""
-msgstr ""
+msgstr "\"%{value}\" එකතු කරන්න"
msgid "Add %{linkStart}assets%{linkEnd} to your Release. GitLab automatically includes read-only assets, like source code and release evidence."
msgstr ""
@@ -2038,6 +2062,9 @@ msgid "Add Kubernetes cluster"
msgstr ""
msgid "Add LICENSE"
+msgstr "බලපත්â€à¶»à¶ºà¶šà·Š එකතු කරන්න"
+
+msgid "Add License"
msgstr ""
msgid "Add New Site"
@@ -2050,7 +2077,7 @@ msgid "Add Zoom meeting"
msgstr ""
msgid "Add a %{type}"
-msgstr ""
+msgstr "%{type} ක් එකතු කරන්න"
msgid "Add a GCP region"
msgstr ""
@@ -2095,10 +2122,10 @@ msgid "Add a line"
msgstr ""
msgid "Add a link"
-msgstr ""
+msgstr "සබà·à¶³à·’යක් එකතු කරන්න"
msgid "Add a link to Grafana"
-msgstr ""
+msgstr "ග්â€à¶»à·à·†à·à¶±à· ට සබà·à¶³à·’යක් එකතු කරන්න"
msgid "Add a new issue"
msgstr ""
@@ -2116,7 +2143,7 @@ msgid "Add a suffix to Service Desk email address. %{linkStart}Learn more.%{link
msgstr ""
msgid "Add a table"
-msgstr ""
+msgstr "වගුවක් එකතු කරන්න"
msgid "Add a task list"
msgstr ""
@@ -2158,11 +2185,14 @@ msgid "Add child epic to an epic"
msgstr ""
msgid "Add comment now"
-msgstr ""
+msgstr "දà·à¶±à·Š අදහස එකතු කරන්න"
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2182,7 +2212,7 @@ msgid "Add deploy keys to grant read/write access to this repository. %{link_sta
msgstr ""
msgid "Add email address"
-msgstr ""
+msgstr "වි-තà·à¶´à·‘ල එකතු කරන්න"
msgid "Add email participant(s)"
msgstr ""
@@ -2230,10 +2260,10 @@ msgid "Add previously merged commits"
msgstr ""
msgid "Add project"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ය එකතු කරන්න"
msgid "Add projects"
-msgstr ""
+msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ එකතු කරන්න"
msgid "Add reaction"
msgstr ""
@@ -2281,7 +2311,7 @@ msgid "Add user(s) to the group:"
msgstr ""
msgid "Add users to group"
-msgstr ""
+msgstr "පරිà·à·“ලකයින් සමූහයට එකතු කරන්න"
msgid "Add variable"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr "අමුත්තà·"
msgid "AdminArea|Included Free in license"
msgstr "බලපත්â€à¶»à¶ºà·™à·„à·’ නොමිලේ ඇතුළත්ය"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr "නඩත්තුකරු"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr "නව ව්â€à¶ºà·à¶´à·˜à¶­à·’ය"
msgid "AdminArea|New user"
msgstr "නව පරිà·à·“ලක"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "හිමිකරු"
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "ලෙට්'ස් එන්ක්â€à¶»à·’ප්ට් වින්â€à¶ºà·à·ƒà¶œà¶­ කරන්න"
@@ -2625,6 +2673,27 @@ msgstr "ලෙට්'ස් එන්ක්â€à¶»à·’ප්ට් වි-තà·à¶
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "යෙදුමේ à·„à·à¶³à·”."
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "නිකිණි"
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr "සියළු පරිසර"
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr "නව පරිසරය"
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr "පරිසර සොයන්න"
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr "සහතිකය"
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr "ලියà·à¶´à¶¯à·’ංචිය"
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr "ආරක්â€à·‚à·à·€"
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
-msgstr ""
-
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr "නොදන්න෠දà·à·‚යකි"
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr "ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œ"
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,44 +10829,26 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
-msgstr "නව සබඳතà·à·€à¶ºà¶šà·Š à·ƒà·à¶¯à¶±à·Šà¶±"
-
-msgid "Crm|Create organization"
-msgstr "සංවිධà·à¶±à¶ºà¶šà·Š à·ƒà·à¶¯à¶±à·Šà¶±"
-
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr "සබඳතà·à·€à¶º සංස්කරණය"
-msgid "Crm|Email"
-msgstr "වි-තà·à¶´à·‘ල"
-
-msgid "Crm|First name"
-msgstr "පළමු නම"
-
-msgid "Crm|Last name"
-msgstr "අවසà·à¶± නම"
-
-msgid "Crm|New Organization"
-msgstr "නව සංවිධà·à¶±à¶º"
+msgid "Crm|Edit organization"
+msgstr ""
msgid "Crm|New contact"
msgstr "නව සබඳතà·à·€à¶º"
@@ -10631,10 +10862,10 @@ msgstr "කිසිදු සබඳතà·à·€à¶ºà¶šà·Š හමු නොවිණ
msgid "Crm|No organizations found"
msgstr "සංවිධà·à¶± කිසිවක් හමු නොවිණි"
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr "වසම"
msgid "Domain Name"
msgstr "වසමේ නම"
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr "නවම්"
msgid "February"
msgstr "නවම්"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr "මà·à¶­à·˜à¶šà·à·€à·š නම"
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr "ළඟ෠විය නොහà·à¶šà·’ය"
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr "CSV ගොනුව උඩුගත කරන්න"
msgid "Upload File"
msgstr "ගොනුව උඩුගත කරන්න"
-msgid "Upload License"
-msgstr "බලපත්â€à¶»à¶º උඩුගත කරන්න"
-
msgid "Upload New File"
msgstr "නව ගොනුව උඩුගත කරන්න"
@@ -39385,9 +40364,6 @@ msgstr "ගොනුව උඩුගත කරන්න"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ".gitlab-ci.yml භà·à·€à·’ත෠කරන්න"
msgid "Use GitLab Runner in AWS"
msgstr "AWS à·„à·’ ගිට්ලà·à¶¶à·Š ධà·à·€à¶š භà·à·€à·’ත෠කරන්න"
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr "තත්â€à·€à¶º වෙනස් කරන්න"
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr "ඉල්ලීම/ප්â€à¶»à¶­à·’චà·à¶»à¶º"
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr "ගොනුව එහි අන්තර්ගතය පිටපත් වීමට පූරණය වන තෙක් රà·à¶³à·™à¶±à·Šà¶±"
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr "වියමන අඩවිය:"
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr "මෙම විධà·à¶±à¶º කරන්නේ කුමක්ද?"
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr "අවලංගු කරන්න"
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr "ආකෘතිය"
-msgid "WikiPage|Get a richer editing experience"
-msgstr "පොහොසත් සංස්කරණ අත්දà·à¶šà·“මක් ගන්න"
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr "යළි උත්සà·à·„ය"
msgid "WikiPage|Save changes"
msgstr "වෙනස්කම් සුරකින්න"
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr "සිරà·à·ƒà·’ය"
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr "පසුව උත්සà·à·„ කරන්න"
-
msgid "WikiPage|Update %{pageTitle}"
msgstr "%{pageTitle} යà·à·€à¶­à·Šà¶šà·à¶½"
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "ඔබගේ අන්තර්ගතය ලියන්න හ෠ගොනු මෙතà·à¶±à¶§ අදින්න…"
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -41986,7 +42965,7 @@ msgid "You can resolve the merge conflict using either the Interactive mode, by
msgstr ""
msgid "You can see your chat accounts."
-msgstr ""
+msgstr "ඔබගේ කතà·à¶¶à·ƒà·Š ගිණුම් දà·à¶šà·“මට à·„à·à¶šà·’ය."
msgid "You can set up jobs to only use runners with specific tags. Separate tags with commas."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42073,7 +43055,7 @@ msgid "You don't have any active chat names."
msgstr ""
msgid "You don't have any applications"
-msgstr ""
+msgstr "ඔබ සතුව කිසිදු යෙදුමක් නà·à¶­"
msgid "You don't have any authorized applications"
msgstr ""
@@ -42082,12 +43064,15 @@ msgid "You don't have any deployments right now."
msgstr ""
msgid "You don't have any open merge requests"
-msgstr ""
+msgstr "ඔබ සතුව විවෘත සංයුක්ත ඉල්ලීම් නà·à¶­"
msgid "You don't have any projects available."
msgstr ""
msgid "You don't have any recent searches"
+msgstr "ඔබ සතුව මෑත සෙවීම් නà·à¶­"
+
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
msgstr ""
msgid "You don't have sufficient permission to perform this action."
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42237,7 +43222,7 @@ msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue.
msgstr ""
msgid "You need permission."
-msgstr ""
+msgstr "ඔබට අවසරය ඇවà·à·ƒà·’ය."
msgid "You need to register a two-factor authentication app before you can set up a device."
msgstr ""
@@ -42353,6 +43338,9 @@ msgstr "යූටියුබ්"
msgid "YouTube URL or ID"
msgstr "යූටියුබ් ඒ.à·ƒ.නි. à·„à· à·„à·à¶³à·”."
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42414,16 +43405,16 @@ msgid "Your Projects' Activity"
msgstr "ඔබගේ ව්â€à¶ºà·à¶´à·˜à¶­à·’වල ක්â€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸à·Š"
msgid "Your SSH key has expired"
-msgstr ""
+msgstr "ඔබගේ SSH යතුර කල් ඉකුත් වී ඇත"
msgid "Your SSH key is expiring soon."
-msgstr ""
+msgstr "ඔබගේ SSH යතුර ළඟදී කල් ඉකුත් වේ."
msgid "Your SSH key was deleted"
msgstr ""
msgid "Your SSH keys (%{count})"
-msgstr ""
+msgstr "ඔබගේ SSH යතුරු (%{count})"
msgid "Your To-Do List"
msgstr ""
@@ -42465,16 +43456,16 @@ msgid "Your account uses dedicated credentials for the \"%{group_name}\" group a
msgstr ""
msgid "Your action succeeded."
-msgstr ""
+msgstr "ඔබගේ ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œà¶º à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’."
msgid "Your applications (%{size})"
-msgstr ""
+msgstr "ඔබගේ යෙදුම් (%{size})"
msgid "Your authorized applications"
msgstr ""
msgid "Your browser does not support iFrames"
-msgstr ""
+msgstr "ඔබගේ අතිරික්සුව අයිෆ්රේම්ස් සඳහ෠සහය නොදක්වයි"
msgid "Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer)."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42795,10 +43786,10 @@ msgid "approved by: "
msgstr ""
msgid "archived"
-msgstr ""
+msgstr "සංරක්â€à·‚ිතයි"
msgid "archived:"
-msgstr ""
+msgstr "සංරක්â€à·‚ිතයි:"
msgid "artifacts"
msgstr ""
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr "සංයුක්ත කළ නොහà·à¶šà·’ය"
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "බලපත්â€à¶» කළමනà·à¶šà¶»à¶«à¶º"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr "නව"
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "කේතයේ ගුණත්වයට වෙනසක් නà·à¶­"
@@ -43198,45 +44218,6 @@ msgstr "වස෠ඇත"
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "සබල කර ඇත"
@@ -43451,7 +44435,7 @@ msgid "fork"
msgstr ""
msgid "from"
-msgstr ""
+msgstr "වෙතින්"
msgid "from %d job"
msgid_plural "from %d jobs"
@@ -43665,7 +44649,7 @@ msgid "latest version"
msgstr ""
msgid "leave %{group_name}"
-msgstr ""
+msgstr "%{group_name} à·„à·à¶»à¶ºà¶±à·Šà¶±"
msgid "less than a minute"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "සංයුක්ත ඉල්ලීම"
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr "ස්වයං සංයුක්තය අවලංගු කරන්න"
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "සංයුක්තය අසමත් විය."
-msgid "mrWidget|Merge locally"
-msgstr "ස්ථà·à¶±à·“යව සංයුක්ත කරන්න"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr "සංයුක්ත කිරීමට ඉල්ලන්න"
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr "මà·à¶œà·š-නà·à¶½à·’කà·à·€"
-msgid "n/a"
-msgstr "අ/නොවේ"
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr "à·„à·"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44431,7 +45423,7 @@ msgid "stuck"
msgstr ""
msgid "success"
-msgstr ""
+msgstr "à·ƒà·à¶»à·Šà¶®à¶šà¶ºà·’"
msgid "suggestPipeline|1/2: Choose a template"
msgstr ""
@@ -44449,7 +45441,7 @@ msgid "suggestPipeline|We’re adding a GitLab CI configuration file to add a pi
msgstr ""
msgid "tag name"
-msgstr ""
+msgstr "අනන්â€à¶ºà¶±à¶ºà·š නම"
msgid "terraform states"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr "නිවà·à¶»à¶¯à·’ ආකෘතිය."
-msgid "the file"
-msgstr "ගොනුව"
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index b9a921402db..7a7d52c8e66 100644
--- a/locale/sk_SK/gitlab.po
+++ b/locale/sk_SK/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: sk\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:38\n"
+"PO-Revision-Date: 2022-04-01 09:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -447,6 +441,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -468,6 +469,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -489,8 +497,8 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -620,9 +628,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -872,6 +877,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -950,7 +958,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -959,9 +967,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -1031,6 +1036,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1170,10 +1178,20 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1486,7 +1504,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1850,9 +1868,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -2045,6 +2072,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -2075,9 +2105,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2231,6 +2258,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2288,6 +2318,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2411,6 +2444,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2639,6 +2675,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2720,6 +2759,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2732,6 +2774,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2744,6 +2789,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2828,12 +2876,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2873,6 +2927,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2888,6 +2963,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2903,6 +2981,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2912,9 +2996,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2924,6 +3005,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3830,7 +3914,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3944,6 +4028,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3998,6 +4085,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4241,6 +4331,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4356,6 +4449,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4446,6 +4542,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4945,6 +5044,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5189,12 +5291,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5287,6 +5383,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5317,6 +5416,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5338,6 +5440,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5698,9 +5848,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5722,6 +5869,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5812,6 +5962,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6038,6 +6194,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -6053,6 +6212,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6062,24 +6224,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6144,6 +6321,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6250,6 +6430,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6409,9 +6592,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6451,6 +6631,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6493,12 +6676,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6511,9 +6700,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6526,6 +6721,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7106,6 +7304,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -7136,6 +7337,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7303,6 +7510,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7417,6 +7627,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7660,24 +7873,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7735,6 +7936,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7894,6 +8104,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7918,7 +8131,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7933,6 +8146,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7972,22 +8188,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7996,10 +8215,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8011,6 +8248,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8026,10 +8266,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8041,10 +8284,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8059,9 +8299,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8095,13 +8332,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8122,10 +8353,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8137,13 +8365,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8159,9 +8384,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8183,6 +8405,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8225,9 +8450,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8336,10 +8558,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8387,16 +8606,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8432,6 +8642,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8441,6 +8654,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8504,9 +8720,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8552,7 +8765,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8645,9 +8858,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8897,12 +9107,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8915,7 +9131,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9159,9 +9375,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9288,6 +9501,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9321,9 +9537,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9348,6 +9561,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9357,7 +9573,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9369,12 +9585,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9483,6 +9711,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9528,6 +9759,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9537,6 +9771,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9606,6 +9843,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9731,9 +9974,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9791,7 +10031,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9888,6 +10128,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9927,6 +10170,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10236,6 +10482,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10272,6 +10521,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10287,9 +10542,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10407,7 +10659,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10446,9 +10698,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10560,9 +10818,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10587,6 +10842,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10617,9 +10875,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10872,43 +11127,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10923,10 +11160,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11037,19 +11274,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11178,15 +11412,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11243,12 +11495,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11264,10 +11522,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11414,6 +11672,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11468,9 +11729,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11718,6 +11976,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11847,9 +12108,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11868,9 +12126,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12525,6 +12780,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12589,6 +12871,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13248,6 +13533,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13305,6 +13593,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13395,6 +13686,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13440,6 +13734,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13542,9 +13875,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13869,6 +14199,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14146,7 +14479,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14278,6 +14611,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14293,9 +14629,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14377,7 +14710,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14749,6 +15085,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14758,6 +15100,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14999,6 +15344,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15011,6 +15359,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -15131,6 +15482,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15260,9 +15614,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15375,6 +15735,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15799,7 +16162,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15940,9 +16303,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16207,9 +16567,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16237,6 +16594,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16300,9 +16660,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16852,9 +17209,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16867,6 +17221,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16918,9 +17275,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17146,15 +17500,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17194,6 +17557,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17320,9 +17686,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17332,6 +17695,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17536,9 +17935,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17941,13 +18337,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18070,6 +18466,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18088,9 +18487,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18211,6 +18607,113 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18383,6 +18886,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18534,9 +19040,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18612,9 +19115,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18744,6 +19244,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18818,7 +19324,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18848,12 +19354,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18863,9 +19363,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19206,9 +19703,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19287,15 +19781,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19587,6 +20072,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19596,6 +20084,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19653,6 +20150,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19668,6 +20171,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19749,6 +20255,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19770,6 +20279,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19779,6 +20291,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19887,6 +20402,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20089,6 +20610,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20203,6 +20727,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20215,12 +20742,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20368,9 +20901,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20386,12 +20916,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20485,6 +21009,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20503,6 +21030,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20515,6 +21048,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20707,9 +21243,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20752,7 +21285,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20923,10 +21456,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20941,12 +21477,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20956,6 +21486,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20977,7 +21510,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20995,6 +21534,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21004,10 +21546,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21019,6 +21567,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21031,6 +21582,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21286,9 +21840,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21301,6 +21852,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21364,6 +21918,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21373,6 +21930,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21400,15 +21963,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21424,9 +21996,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21436,6 +22026,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21460,6 +22053,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21821,6 +22417,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21929,6 +22528,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22070,6 +22675,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22082,6 +22690,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22100,6 +22711,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22127,9 +22741,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22172,6 +22783,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22181,6 +22799,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22196,6 +22820,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22385,9 +23015,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22661,6 +23288,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22694,6 +23324,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22856,6 +23489,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22976,9 +23612,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23000,6 +23633,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23239,9 +23878,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23278,7 +23914,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23353,7 +23989,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23909,9 +24545,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -24033,6 +24666,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24051,6 +24687,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24069,12 +24708,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24192,6 +24840,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24288,16 +24939,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24406,6 +25057,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24481,6 +25159,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24667,9 +25348,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24764,6 +25442,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24839,6 +25520,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24854,9 +25538,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24905,6 +25586,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24953,6 +25637,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24980,12 +25667,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25064,9 +25745,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25088,7 +25766,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25121,9 +25799,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25205,6 +25880,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25362,6 +26040,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25810,10 +26491,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25961,6 +26642,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25979,9 +26663,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26012,10 +26693,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26030,9 +26711,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26060,6 +26738,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26201,6 +26882,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26970,6 +27654,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27246,6 +27933,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27255,10 +27945,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27306,7 +27999,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27315,13 +28008,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27330,7 +28023,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27348,6 +28041,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27360,9 +28056,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27417,24 +28119,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27492,9 +28188,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27510,9 +28203,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27846,9 +28536,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27903,7 +28590,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27948,7 +28635,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28056,6 +28743,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28365,6 +29055,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28386,9 +29079,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28425,6 +29115,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28530,6 +29223,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28611,9 +29307,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29118,7 +29811,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29217,6 +29910,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29388,6 +30084,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29451,6 +30150,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29469,9 +30171,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29616,6 +30315,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30225,7 +30930,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30658,9 +31366,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30670,9 +31384,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30905,6 +31616,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31115,7 +31829,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31207,12 +31924,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31225,6 +31948,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31240,9 +31969,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31759,7 +32494,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31823,9 +32558,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31877,10 +32609,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31901,6 +32633,26 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31910,7 +32662,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31937,9 +32689,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31952,12 +32716,22 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31967,6 +32741,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31976,18 +32753,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32009,25 +32780,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32036,15 +32813,31 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32078,9 +32871,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32093,21 +32892,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32117,7 +32946,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32138,6 +32967,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32147,16 +32979,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32174,7 +33009,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32192,7 +33027,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32201,9 +33036,6 @@ 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 ""
@@ -32237,9 +33069,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32354,10 +33183,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32549,6 +33378,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32695,6 +33527,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32719,6 +33554,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32845,16 +33689,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32911,6 +33758,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32926,6 +33779,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32941,12 +33800,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32956,6 +33824,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32968,9 +33839,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33019,6 +33902,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33037,12 +33923,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33061,6 +33956,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33070,10 +33968,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33097,6 +33998,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33181,6 +34091,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33322,6 +34235,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33346,7 +34262,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33358,16 +34274,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33427,6 +34346,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33439,15 +34361,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33484,15 +34409,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33631,6 +34553,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33967,6 +34892,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34012,6 +34940,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -34057,9 +34988,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34316,6 +35244,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34485,6 +35416,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34656,6 +35590,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34665,6 +35602,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34704,9 +35644,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34839,9 +35776,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35265,6 +36199,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35409,6 +36346,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35481,9 +36421,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35532,6 +36469,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35697,10 +36637,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36081,8 +37021,12 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36225,12 +37169,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36387,6 +37325,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36420,9 +37364,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36847,9 +37788,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36880,6 +37818,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36892,6 +37833,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36913,12 +37857,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37214,6 +38164,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37223,6 +38176,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37244,6 +38203,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37256,6 +38218,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37541,9 +38506,6 @@ 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 ""
@@ -37685,6 +38647,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37697,7 +38662,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37724,7 +38689,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37733,7 +38698,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37820,6 +38785,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37847,6 +38818,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37973,9 +38947,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38213,6 +39193,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38689,6 +39672,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38770,6 +39756,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38788,7 +39777,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38938,9 +39927,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38986,6 +39972,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39079,6 +40068,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39268,6 +40260,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39472,6 +40467,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39508,6 +40506,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39634,6 +40635,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39814,9 +40818,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39835,9 +40836,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39847,6 +40845,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39904,7 +40905,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40141,6 +41142,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40150,6 +41154,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40963,9 +41970,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40990,6 +41994,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41095,9 +42102,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41119,6 +42123,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41239,6 +42246,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41335,9 +42345,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41383,6 +42390,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41404,6 +42414,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41704,6 +42717,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41749,9 +42765,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41794,13 +42807,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41819,6 +42832,9 @@ msgstr[3] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41966,9 +42982,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41993,12 +43006,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42011,18 +43018,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42035,18 +43030,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42122,6 +43108,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42131,6 +43120,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42341,6 +43333,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42434,6 +43432,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42464,6 +43465,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42548,6 +43552,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42630,10 +43637,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42813,6 +43820,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42825,6 +43835,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43116,7 +44129,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43381,6 +44394,13 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43478,6 +44498,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43556,6 +44585,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43584,9 +44622,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43672,45 +44716,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43729,7 +44734,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43839,6 +44844,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44181,6 +45189,13 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44278,6 +45293,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44397,9 +45418,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44472,6 +45490,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44592,9 +45613,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44655,6 +45673,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44752,9 +45773,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44957,9 +45975,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/sl_SI/gitlab.po b/locale/sl_SI/gitlab.po
index 34d87747867..75ed035f9a2 100644
--- a/locale/sl_SI/gitlab.po
+++ b/locale/sl_SI/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: sl\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -447,6 +441,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -468,6 +469,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -489,8 +497,8 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -620,9 +628,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -872,6 +877,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -950,7 +958,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -959,9 +967,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -1031,6 +1036,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1170,10 +1178,20 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1486,7 +1504,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1850,9 +1868,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -2045,6 +2072,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -2075,9 +2105,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2231,6 +2258,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2288,6 +2318,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2411,6 +2444,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2639,6 +2675,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2720,6 +2759,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2732,6 +2774,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2744,6 +2789,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2828,12 +2876,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2873,6 +2927,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2888,6 +2963,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2903,6 +2981,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2912,9 +2996,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2924,6 +3005,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3830,7 +3914,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3944,6 +4028,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3998,6 +4085,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4241,6 +4331,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4356,6 +4449,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4446,6 +4542,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4945,6 +5044,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5189,12 +5291,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5287,6 +5383,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5317,6 +5416,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5338,6 +5440,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5698,9 +5848,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5722,6 +5869,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5812,6 +5962,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6038,6 +6194,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -6053,6 +6212,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -6062,24 +6224,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6144,6 +6321,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6250,6 +6430,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6409,9 +6592,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6451,6 +6631,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6493,12 +6676,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6511,9 +6700,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6526,6 +6721,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7106,6 +7304,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -7136,6 +7337,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7303,6 +7510,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7417,6 +7627,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7660,24 +7873,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7735,6 +7936,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7894,6 +8104,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7918,7 +8131,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7933,6 +8146,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7972,22 +8188,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7996,10 +8215,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -8011,6 +8248,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -8026,10 +8266,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -8041,10 +8284,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -8059,9 +8299,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -8095,13 +8332,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -8122,10 +8353,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -8137,13 +8365,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8159,9 +8384,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8183,6 +8405,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8225,9 +8450,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8336,10 +8558,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8387,16 +8606,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8432,6 +8642,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8441,6 +8654,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8504,9 +8720,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8552,7 +8765,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8645,9 +8858,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8897,12 +9107,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8915,7 +9131,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9159,9 +9375,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9288,6 +9501,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9321,9 +9537,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9348,6 +9561,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9357,7 +9573,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9369,12 +9585,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9483,6 +9711,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9528,6 +9759,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9537,6 +9771,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9606,6 +9843,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9731,9 +9974,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9791,7 +10031,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9888,6 +10128,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9927,6 +10170,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10236,6 +10482,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10272,6 +10521,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10287,9 +10542,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10407,7 +10659,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10446,9 +10698,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10560,9 +10818,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10587,6 +10842,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10617,9 +10875,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10872,43 +11127,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10923,10 +11160,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -11037,19 +11274,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11178,15 +11412,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11243,12 +11495,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11264,10 +11522,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11414,6 +11672,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11468,9 +11729,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11718,6 +11976,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11847,9 +12108,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11868,9 +12126,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12525,6 +12780,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12589,6 +12871,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13248,6 +13533,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13305,6 +13593,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13395,6 +13686,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13440,6 +13734,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13542,9 +13875,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13869,6 +14199,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14146,7 +14479,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14278,6 +14611,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14293,9 +14629,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14377,7 +14710,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14749,6 +15085,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14758,6 +15100,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14999,6 +15344,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15011,6 +15359,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -15131,6 +15482,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15260,9 +15614,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15375,6 +15735,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15799,7 +16162,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15940,9 +16303,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16207,9 +16567,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16237,6 +16594,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16300,9 +16660,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16852,9 +17209,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16867,6 +17221,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16918,9 +17275,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -17146,15 +17500,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17194,6 +17557,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17320,9 +17686,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17332,6 +17695,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17536,9 +17935,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17941,13 +18337,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18070,6 +18466,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18088,9 +18487,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18211,6 +18607,113 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18383,6 +18886,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18534,9 +19040,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18612,9 +19115,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18744,6 +19244,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18818,7 +19324,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18848,12 +19354,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18863,9 +19363,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19206,9 +19703,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19287,15 +19781,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19587,6 +20072,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19596,6 +20084,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19653,6 +20150,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19668,6 +20171,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19749,6 +20255,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19770,6 +20279,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19779,6 +20291,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19887,6 +20402,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -20089,6 +20610,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20203,6 +20727,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20215,12 +20742,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20368,9 +20901,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20386,12 +20916,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20485,6 +21009,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20503,6 +21030,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20515,6 +21048,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20707,9 +21243,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20752,7 +21285,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20923,10 +21456,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20941,12 +21477,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20956,6 +21486,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20977,7 +21510,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20995,6 +21534,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21004,10 +21546,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21019,6 +21567,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -21031,6 +21582,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21286,9 +21840,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21301,6 +21852,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21364,6 +21918,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21373,6 +21930,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21400,15 +21963,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21424,9 +21996,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21436,6 +22026,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21460,6 +22053,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21821,6 +22417,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21929,6 +22528,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22070,6 +22675,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -22082,6 +22690,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22100,6 +22711,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22127,9 +22741,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22172,6 +22783,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22181,6 +22799,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22196,6 +22820,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22385,9 +23015,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22661,6 +23288,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22694,6 +23324,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22856,6 +23489,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22976,9 +23612,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23000,6 +23633,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23239,9 +23878,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23278,7 +23914,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23353,7 +23989,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23909,9 +24545,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -24033,6 +24666,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -24051,6 +24687,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24069,12 +24708,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24192,6 +24840,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24288,16 +24939,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24406,6 +25057,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24481,6 +25159,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24667,9 +25348,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24764,6 +25442,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24839,6 +25520,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24854,9 +25538,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24905,6 +25586,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24953,6 +25637,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24980,12 +25667,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25064,9 +25745,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -25088,7 +25766,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25121,9 +25799,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25205,6 +25880,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25362,6 +26040,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25810,10 +26491,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25961,6 +26642,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25979,9 +26663,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26012,10 +26693,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -26030,9 +26711,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -26060,6 +26738,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26201,6 +26882,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26970,6 +27654,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27246,6 +27933,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27255,10 +27945,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27306,7 +27999,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27315,13 +28008,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27330,7 +28023,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27348,6 +28041,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27360,9 +28056,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27417,24 +28119,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27492,9 +28188,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27510,9 +28203,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27846,9 +28536,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27903,7 +28590,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27948,7 +28635,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -28056,6 +28743,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28365,6 +29055,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28386,9 +29079,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28425,6 +29115,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28530,6 +29223,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28611,9 +29307,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29118,7 +29811,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29217,6 +29910,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29388,6 +30084,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29451,6 +30150,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29469,9 +30171,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29616,6 +30315,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30225,7 +30930,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30658,9 +31366,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30670,9 +31384,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30905,6 +31616,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31115,7 +31829,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31207,12 +31924,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31225,6 +31948,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31240,9 +31969,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31759,7 +32494,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31823,9 +32558,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31877,10 +32609,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31901,6 +32633,26 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31910,7 +32662,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31937,9 +32689,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31952,12 +32716,22 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31967,6 +32741,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31976,18 +32753,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -32009,25 +32780,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32036,15 +32813,31 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -32078,9 +32871,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32093,21 +32892,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32117,7 +32946,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32138,6 +32967,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -32147,16 +32979,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32174,7 +33009,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32192,7 +33027,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32201,9 +33036,6 @@ 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 ""
@@ -32237,9 +33069,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32354,10 +33183,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32549,6 +33378,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32695,6 +33527,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32719,6 +33554,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32845,16 +33689,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32911,6 +33758,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32926,6 +33779,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32941,12 +33800,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32956,6 +33824,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32968,9 +33839,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33019,6 +33902,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33037,12 +33923,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33061,6 +33956,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33070,10 +33968,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33097,6 +33998,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33181,6 +34091,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33322,6 +34235,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33346,7 +34262,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33358,16 +34274,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33427,6 +34346,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33439,15 +34361,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33484,15 +34409,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33631,6 +34553,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33967,6 +34892,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34012,6 +34940,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -34057,9 +34988,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34316,6 +35244,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34485,6 +35416,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34656,6 +35590,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34665,6 +35602,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34704,9 +35644,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34839,9 +35776,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35265,6 +36199,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35409,6 +36346,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35481,9 +36421,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35532,6 +36469,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35697,10 +36637,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36081,8 +37021,12 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36225,12 +37169,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36387,6 +37325,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36420,9 +37364,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36847,9 +37788,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36880,6 +37818,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36892,6 +37833,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36913,12 +37857,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -37214,6 +38164,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37223,6 +38176,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37244,6 +38203,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37256,6 +38218,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37541,9 +38506,6 @@ 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 ""
@@ -37685,6 +38647,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37697,7 +38662,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37724,7 +38689,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37733,7 +38698,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37820,6 +38785,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37847,6 +38818,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37973,9 +38947,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -38213,6 +39193,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38689,6 +39672,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38770,6 +39756,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38788,7 +39777,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38938,9 +39927,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38986,6 +39972,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -39079,6 +40068,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39268,6 +40260,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39472,6 +40467,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39508,6 +40506,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39634,6 +40635,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39814,9 +40818,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39835,9 +40836,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39847,6 +40845,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39904,7 +40905,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40141,6 +41142,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40150,6 +41154,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40963,9 +41970,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40990,6 +41994,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41095,9 +42102,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -41119,6 +42123,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41239,6 +42246,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41335,9 +42345,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41383,6 +42390,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41404,6 +42414,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41704,6 +42717,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41749,9 +42765,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41794,13 +42807,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41819,6 +42832,9 @@ msgstr[3] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41966,9 +42982,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41993,12 +43006,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -42011,18 +43018,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42035,18 +43030,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -42122,6 +43108,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42131,6 +43120,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42341,6 +43333,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42434,6 +43432,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42464,6 +43465,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42548,6 +43552,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42630,10 +43637,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42813,6 +43820,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42825,6 +43835,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43116,7 +44129,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43381,6 +44394,13 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43478,6 +44498,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43556,6 +44585,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43584,9 +44622,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43672,45 +44716,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43729,7 +44734,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43839,6 +44844,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -44181,6 +45189,13 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44278,6 +45293,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44397,9 +45418,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44472,6 +45490,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44592,9 +45613,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44655,6 +45673,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44752,9 +45773,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44957,9 +45975,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index 32768125b2e..541ea8ab272 100644
--- a/locale/sq_AL/gitlab.po
+++ b/locale/sq_AL/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: sq\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index 178d6dd0450..d8be5ba784e 100644
--- a/locale/sr_CS/gitlab.po
+++ b/locale/sr_CS/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: sr-CS\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -394,6 +388,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -412,6 +412,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -430,8 +436,8 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -544,9 +550,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -787,6 +790,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -865,7 +871,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -874,9 +880,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -946,6 +949,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1081,10 +1087,19 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1387,7 +1402,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1726,9 +1741,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1921,6 +1945,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1951,9 +1978,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2107,6 +2131,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2164,6 +2191,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2287,6 +2317,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2515,6 +2548,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2596,6 +2632,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2608,6 +2647,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2620,6 +2662,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2704,12 +2749,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2749,6 +2800,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2764,6 +2836,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2779,6 +2854,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2788,9 +2869,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2800,6 +2878,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3706,7 +3787,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3820,6 +3901,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3874,6 +3958,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4117,6 +4204,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4231,6 +4321,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4321,6 +4414,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4813,6 +4909,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5056,12 +5155,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5152,6 +5245,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5182,6 +5278,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5203,6 +5302,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5563,9 +5710,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5587,6 +5731,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5677,6 +5824,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5902,6 +6055,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5917,6 +6073,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5926,24 +6085,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6007,6 +6181,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6112,6 +6289,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6271,9 +6451,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6313,6 +6490,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6355,12 +6535,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6373,9 +6559,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6388,6 +6580,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6967,6 +7162,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6997,6 +7195,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7162,6 +7366,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7276,6 +7483,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7519,24 +7729,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7594,6 +7792,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7753,6 +7960,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7777,7 +7987,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7792,6 +8002,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7831,22 +8044,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7855,10 +8071,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7870,6 +8104,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7885,10 +8122,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7900,10 +8140,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7918,9 +8155,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7954,13 +8188,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7981,10 +8209,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7996,13 +8221,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8017,9 +8239,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8041,6 +8260,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8083,9 +8305,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8194,10 +8413,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8245,16 +8461,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8290,6 +8497,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8299,6 +8509,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8362,9 +8575,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8410,7 +8620,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8503,9 +8713,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8755,12 +8962,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8773,7 +8986,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9016,9 +9229,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9145,6 +9355,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9178,9 +9391,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9205,6 +9415,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9214,7 +9427,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9226,12 +9439,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9340,6 +9565,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9385,6 +9613,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9394,6 +9625,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9463,6 +9697,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9586,9 +9826,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9646,7 +9883,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9742,6 +9979,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9781,6 +10021,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10090,6 +10333,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10126,6 +10372,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10141,9 +10393,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10261,7 +10510,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10300,9 +10549,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10414,9 +10669,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10441,6 +10693,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10471,9 +10726,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10726,43 +10978,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10777,10 +11011,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10891,19 +11125,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11032,15 +11263,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11095,12 +11344,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11116,10 +11371,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11266,6 +11521,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11320,9 +11578,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11569,6 +11824,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11698,9 +11956,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11719,9 +11974,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12370,6 +12622,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12433,6 +12712,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13087,6 +13369,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13144,6 +13429,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13234,6 +13522,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13279,6 +13570,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13381,9 +13711,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13708,6 +14035,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13984,7 +14314,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14116,6 +14446,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14131,9 +14464,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14215,7 +14545,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14587,6 +14920,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14596,6 +14935,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14836,6 +15178,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14848,6 +15193,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14968,6 +15316,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15097,9 +15448,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15211,6 +15568,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15634,7 +15994,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15775,9 +16135,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16042,9 +16399,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16072,6 +16426,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16135,9 +16492,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16687,9 +17041,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16702,6 +17053,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16753,9 +17107,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16981,15 +17332,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17029,6 +17389,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17155,9 +17518,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17167,6 +17527,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17371,9 +17767,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17776,13 +18169,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17905,6 +18298,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17923,9 +18319,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18046,6 +18439,111 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18217,6 +18715,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18367,9 +18868,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18445,9 +18943,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18577,6 +19072,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18649,7 +19150,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18679,12 +19180,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18694,9 +19189,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19036,9 +19528,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19117,15 +19606,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19417,6 +19897,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19426,6 +19909,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19483,6 +19975,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19498,6 +19996,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19579,6 +20080,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19600,6 +20104,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19609,6 +20116,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19717,6 +20227,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19918,6 +20434,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20032,6 +20551,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20044,12 +20566,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20197,9 +20725,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20215,12 +20740,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20314,6 +20833,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20332,6 +20854,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20344,6 +20872,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20536,9 +21067,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20581,7 +21109,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20752,10 +21280,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20770,12 +21301,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20785,6 +21310,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20806,7 +21334,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20824,6 +21358,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20833,10 +21370,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20848,6 +21391,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20860,6 +21406,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21115,9 +21664,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21130,6 +21676,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21193,6 +21742,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21202,6 +21754,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21229,15 +21787,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21253,9 +21820,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21265,6 +21850,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21289,6 +21877,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21649,6 +22240,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21757,6 +22351,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21898,6 +22498,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21910,6 +22513,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21928,6 +22534,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21955,9 +22564,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21994,6 +22600,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22003,6 +22615,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22018,6 +22636,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22207,9 +22831,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22483,6 +23104,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22516,6 +23140,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22678,6 +23305,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22798,9 +23428,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22822,6 +23449,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23059,9 +23692,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23098,7 +23728,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23173,7 +23803,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23728,9 +24358,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23851,6 +24478,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23869,6 +24499,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23887,12 +24520,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24010,6 +24652,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24106,16 +24751,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24223,6 +24868,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24298,6 +24970,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24484,9 +25159,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24580,6 +25252,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24655,6 +25330,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24670,9 +25348,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24721,6 +25396,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24769,6 +25447,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24796,12 +25477,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24880,9 +25555,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24904,7 +25576,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24937,9 +25609,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25021,6 +25690,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25177,6 +25849,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25621,10 +26296,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25771,6 +26446,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25789,9 +26467,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25822,10 +26497,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25840,9 +26515,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25870,6 +26542,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26011,6 +26686,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26779,6 +27457,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27055,6 +27736,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27064,10 +27748,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27115,7 +27802,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27124,13 +27811,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27139,7 +27826,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27157,6 +27844,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27169,9 +27859,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27226,24 +27922,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27301,9 +27991,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27319,9 +28006,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27655,9 +28339,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27712,7 +28393,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27757,7 +28438,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27865,6 +28546,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28174,6 +28858,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28195,9 +28882,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28234,6 +28918,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28339,6 +29026,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28420,9 +29110,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28927,7 +29614,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29026,6 +29713,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29197,6 +29887,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29260,6 +29953,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29278,9 +29974,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29425,6 +30118,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30034,7 +30733,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30466,9 +31168,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30478,9 +31186,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30712,6 +31417,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30922,7 +31630,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31009,12 +31720,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31027,6 +31744,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31042,9 +31765,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31558,7 +32287,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31621,9 +32350,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31675,10 +32401,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31699,6 +32425,24 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31708,7 +32452,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31735,9 +32479,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31750,12 +32506,21 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31765,6 +32530,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31774,18 +32542,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31807,25 +32569,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31834,15 +32602,30 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31876,9 +32659,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31891,21 +32680,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31915,7 +32734,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31936,6 +32755,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31945,16 +32767,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31972,7 +32797,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31990,7 +32815,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31999,9 +32824,6 @@ 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 ""
@@ -32035,9 +32857,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32152,10 +32971,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32347,6 +33166,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32482,6 +33304,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32506,6 +33331,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32632,16 +33466,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32698,6 +33535,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32713,6 +33556,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32728,12 +33577,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32743,6 +33601,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32755,9 +33616,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32806,6 +33679,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32824,12 +33700,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32848,6 +33733,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32857,10 +33745,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32884,6 +33775,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32968,6 +33868,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33109,6 +34012,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33133,7 +34039,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33145,16 +34051,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33214,6 +34123,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33226,15 +34138,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33271,15 +34186,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33418,6 +34330,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33754,6 +34669,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33799,6 +34717,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33844,9 +34765,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34102,6 +35020,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34270,6 +35191,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34441,6 +35365,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34450,6 +35377,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34489,9 +35419,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34624,9 +35551,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35050,6 +35974,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35194,6 +36121,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35266,9 +36196,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35317,6 +36244,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35482,10 +36412,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35866,8 +36796,11 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36010,12 +36943,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36172,6 +37099,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36205,9 +37138,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36625,9 +37555,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36658,6 +37585,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36670,6 +37600,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36691,12 +37624,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36991,6 +37930,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37000,6 +37942,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37021,6 +37969,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37033,6 +37984,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37318,9 +38272,6 @@ 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 ""
@@ -37462,6 +38413,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37474,7 +38428,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37501,7 +38455,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37510,7 +38464,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37597,6 +38551,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37624,6 +38584,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37750,9 +38713,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37990,6 +38959,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38464,6 +39436,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38545,6 +39520,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38563,7 +39541,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38713,9 +39691,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38761,6 +39736,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38854,6 +39832,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39043,6 +40024,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39247,6 +40231,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39283,6 +40270,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39409,6 +40399,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39589,9 +40582,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39610,9 +40600,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39622,6 +40609,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39679,7 +40669,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39916,6 +40906,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39925,6 +40918,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40735,9 +41731,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40762,6 +41755,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40867,9 +41863,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40891,6 +41884,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41011,6 +42007,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41107,9 +42106,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41155,6 +42151,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41176,6 +42175,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41476,6 +42478,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41521,9 +42526,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41566,13 +42568,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41590,6 +42592,9 @@ msgstr[2] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41737,9 +42742,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41764,12 +42766,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41782,18 +42778,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41806,18 +42790,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41893,6 +42868,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41902,6 +42880,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42112,6 +43093,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42205,6 +43192,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42235,6 +43225,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42319,6 +43312,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42400,10 +43396,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42583,6 +43579,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42595,6 +43594,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42886,7 +43888,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43147,6 +44149,12 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43243,6 +44251,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43321,6 +44338,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43348,9 +44374,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43435,45 +44467,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43492,7 +44485,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43600,6 +44593,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43939,6 +44935,12 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44035,6 +45037,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44152,9 +45160,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44227,6 +45232,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44347,9 +45355,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44410,6 +45415,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44503,9 +45511,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44707,9 +45712,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index e250c32e8bf..4708a83734b 100644
--- a/locale/sr_SP/gitlab.po
+++ b/locale/sr_SP/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: sr\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -394,6 +388,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -412,6 +412,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -430,8 +436,8 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -544,9 +550,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -787,6 +790,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -865,7 +871,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -874,9 +880,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -946,6 +949,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -1081,10 +1087,19 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1387,7 +1402,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1726,9 +1741,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1921,6 +1945,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1951,9 +1978,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -2107,6 +2131,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2164,6 +2191,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2287,6 +2317,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2515,6 +2548,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2596,6 +2632,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2608,6 +2647,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2620,6 +2662,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2704,12 +2749,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2749,6 +2800,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2764,6 +2836,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2779,6 +2854,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2788,9 +2869,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2800,6 +2878,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3706,7 +3787,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3820,6 +3901,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3874,6 +3958,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -4117,6 +4204,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4231,6 +4321,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4321,6 +4414,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4813,6 +4909,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -5056,12 +5155,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5152,6 +5245,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5182,6 +5278,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5203,6 +5302,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5563,9 +5710,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5587,6 +5731,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5677,6 +5824,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5902,6 +6055,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5917,6 +6073,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5926,24 +6085,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -6007,6 +6181,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -6112,6 +6289,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6271,9 +6451,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6313,6 +6490,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6355,12 +6535,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6373,9 +6559,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6388,6 +6580,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6967,6 +7162,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6997,6 +7195,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7162,6 +7366,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7276,6 +7483,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7519,24 +7729,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7594,6 +7792,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7753,6 +7960,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7777,7 +7987,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7792,6 +8002,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7831,22 +8044,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7855,10 +8071,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7870,6 +8104,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7885,10 +8122,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7900,10 +8140,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7918,9 +8155,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7954,13 +8188,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7981,10 +8209,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7996,13 +8221,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -8017,9 +8239,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -8041,6 +8260,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -8083,9 +8305,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8194,10 +8413,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8245,16 +8461,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8290,6 +8497,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8299,6 +8509,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8362,9 +8575,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8410,7 +8620,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8503,9 +8713,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8755,12 +8962,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8773,7 +8986,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -9016,9 +9229,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9145,6 +9355,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9178,9 +9391,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9205,6 +9415,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9214,7 +9427,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9226,12 +9439,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9340,6 +9565,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9385,6 +9613,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9394,6 +9625,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9463,6 +9697,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9586,9 +9826,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9646,7 +9883,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9742,6 +9979,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9781,6 +10021,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -10090,6 +10333,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -10126,6 +10372,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -10141,9 +10393,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10261,7 +10510,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10300,9 +10549,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10414,9 +10669,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10441,6 +10693,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10471,9 +10726,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10726,43 +10978,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10777,10 +11011,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10891,19 +11125,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11032,15 +11263,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11095,12 +11344,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11116,10 +11371,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11266,6 +11521,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11320,9 +11578,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11569,6 +11824,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11698,9 +11956,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11719,9 +11974,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12370,6 +12622,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12433,6 +12712,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -13087,6 +13369,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13144,6 +13429,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13234,6 +13522,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13279,6 +13570,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13381,9 +13711,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13708,6 +14035,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13984,7 +14314,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14116,6 +14446,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14131,9 +14464,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14215,7 +14545,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14587,6 +14920,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14596,6 +14935,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14836,6 +15178,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14848,6 +15193,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14968,6 +15316,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -15097,9 +15448,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15211,6 +15568,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15634,7 +15994,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15775,9 +16135,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -16042,9 +16399,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16072,6 +16426,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -16135,9 +16492,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16687,9 +17041,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16702,6 +17053,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16753,9 +17107,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16981,15 +17332,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -17029,6 +17389,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -17155,9 +17518,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17167,6 +17527,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17371,9 +17767,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17776,13 +18169,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17905,6 +18298,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17923,9 +18319,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -18046,6 +18439,111 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18217,6 +18715,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18367,9 +18868,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18445,9 +18943,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18577,6 +19072,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18649,7 +19150,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18679,12 +19180,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18694,9 +19189,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -19036,9 +19528,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19117,15 +19606,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19417,6 +19897,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19426,6 +19909,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19483,6 +19975,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19498,6 +19996,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19579,6 +20080,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19600,6 +20104,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19609,6 +20116,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19717,6 +20227,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19918,6 +20434,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20032,6 +20551,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20044,12 +20566,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20197,9 +20725,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20215,12 +20740,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20314,6 +20833,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20332,6 +20854,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20344,6 +20872,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20536,9 +21067,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20581,7 +21109,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20752,10 +21280,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20770,12 +21301,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20785,6 +21310,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20806,7 +21334,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20824,6 +21358,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20833,10 +21370,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20848,6 +21391,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20860,6 +21406,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21115,9 +21664,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21130,6 +21676,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21193,6 +21742,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21202,6 +21754,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21229,15 +21787,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21253,9 +21820,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21265,6 +21850,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21289,6 +21877,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21649,6 +22240,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21757,6 +22351,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21898,6 +22498,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21910,6 +22513,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21928,6 +22534,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21955,9 +22564,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21994,6 +22600,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22003,6 +22615,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -22018,6 +22636,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22207,9 +22831,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22483,6 +23104,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22516,6 +23140,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22678,6 +23305,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22798,9 +23428,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22822,6 +23449,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23059,9 +23692,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23098,7 +23728,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23173,7 +23803,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23728,9 +24358,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23851,6 +24478,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23869,6 +24499,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23887,12 +24520,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -24010,6 +24652,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -24106,16 +24751,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24223,6 +24868,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24298,6 +24970,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24484,9 +25159,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24580,6 +25252,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24655,6 +25330,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24670,9 +25348,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24721,6 +25396,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24769,6 +25447,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24796,12 +25477,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24880,9 +25555,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24904,7 +25576,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24937,9 +25609,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -25021,6 +25690,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25177,6 +25849,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25621,10 +26296,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25771,6 +26446,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25789,9 +26467,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25822,10 +26497,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25840,9 +26515,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25870,6 +26542,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26011,6 +26686,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26779,6 +27457,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -27055,6 +27736,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -27064,10 +27748,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -27115,7 +27802,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27124,13 +27811,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27139,7 +27826,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -27157,6 +27844,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27169,9 +27859,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27226,24 +27922,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27301,9 +27991,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27319,9 +28006,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27655,9 +28339,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27712,7 +28393,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27757,7 +28438,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27865,6 +28546,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -28174,6 +28858,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28195,9 +28882,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28234,6 +28918,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28339,6 +29026,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28420,9 +29110,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28927,7 +29614,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29026,6 +29713,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29197,6 +29887,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29260,6 +29953,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29278,9 +29974,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29425,6 +30118,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30034,7 +30733,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30466,9 +31168,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30478,9 +31186,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30712,6 +31417,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30922,7 +31630,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31009,12 +31720,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -31027,6 +31744,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31042,9 +31765,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31558,7 +32287,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31621,9 +32350,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31675,10 +32401,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31699,6 +32425,24 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31708,7 +32452,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31735,9 +32479,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31750,12 +32506,21 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31765,6 +32530,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31774,18 +32542,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31807,25 +32569,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31834,15 +32602,30 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31876,9 +32659,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31891,21 +32680,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31915,7 +32734,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31936,6 +32755,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31945,16 +32767,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31972,7 +32797,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31990,7 +32815,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31999,9 +32824,6 @@ 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 ""
@@ -32035,9 +32857,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -32152,10 +32971,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32347,6 +33166,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32482,6 +33304,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32506,6 +33331,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32632,16 +33466,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32698,6 +33535,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32713,6 +33556,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32728,12 +33577,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32743,6 +33601,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32755,9 +33616,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32806,6 +33679,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32824,12 +33700,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32848,6 +33733,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32857,10 +33745,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32884,6 +33775,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32968,6 +33868,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -33109,6 +34012,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33133,7 +34039,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33145,16 +34051,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33214,6 +34123,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33226,15 +34138,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33271,15 +34186,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33418,6 +34330,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33754,6 +34669,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33799,6 +34717,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33844,9 +34765,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34102,6 +35020,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34270,6 +35191,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34441,6 +35365,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34450,6 +35377,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34489,9 +35419,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34624,9 +35551,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -35050,6 +35974,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -35194,6 +36121,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35266,9 +36196,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35317,6 +36244,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35482,10 +36412,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35866,8 +36796,11 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36010,12 +36943,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -36172,6 +37099,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -36205,9 +37138,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36625,9 +37555,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36658,6 +37585,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36670,6 +37600,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36691,12 +37624,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36991,6 +37930,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37000,6 +37942,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37021,6 +37969,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -37033,6 +37984,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37318,9 +38272,6 @@ 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 ""
@@ -37462,6 +38413,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37474,7 +38428,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37501,7 +38455,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37510,7 +38464,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37597,6 +38551,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37624,6 +38584,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37750,9 +38713,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37990,6 +38959,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38464,6 +39436,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38545,6 +39520,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38563,7 +39541,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38713,9 +39691,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38761,6 +39736,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38854,6 +39832,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -39043,6 +40024,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39247,6 +40231,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39283,6 +40270,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39409,6 +40399,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39589,9 +40582,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39610,9 +40600,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39622,6 +40609,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39679,7 +40669,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39916,6 +40906,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39925,6 +40918,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40735,9 +41731,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40762,6 +41755,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40867,9 +41863,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40891,6 +41884,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41011,6 +42007,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41107,9 +42106,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41155,6 +42151,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41176,6 +42175,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41476,6 +42478,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41521,9 +42526,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41566,13 +42568,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41590,6 +42592,9 @@ msgstr[2] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41737,9 +42742,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41764,12 +42766,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41782,18 +42778,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41806,18 +42790,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41893,6 +42868,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41902,6 +42880,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42112,6 +43093,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42205,6 +43192,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42235,6 +43225,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42319,6 +43312,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42400,10 +43396,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42583,6 +43579,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42595,6 +43594,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42886,7 +43888,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43147,6 +44149,12 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43243,6 +44251,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43321,6 +44338,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43348,9 +44374,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43435,45 +44467,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43492,7 +44485,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43600,6 +44593,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43939,6 +44935,12 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -44035,6 +45037,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -44152,9 +45160,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -44227,6 +45232,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44347,9 +45355,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44410,6 +45415,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44503,9 +45511,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44707,9 +45712,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index 7a029eff528..95c0abc7047 100644
--- a/locale/sv_SE/gitlab.po
+++ b/locale/sv_SE/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: sv-SE\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr " Insamlad %{time}"
msgid " Please sign in."
msgstr " Vänligen logga in."
-msgid " Target Path"
-msgstr " Målets sökväg"
-
msgid " Try to %{action} this file again."
msgstr " Försök att %{action} denna fil igen."
-msgid " Type"
-msgstr " Typ"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "%d kommentar till"
msgstr[1] "%d kommentarer till"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d öppet ärende"
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} kommer att tas bort! Är du säker?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} dag"
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr "%{start} till %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
-msgstr ""
-
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr "Ny katalog"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index f0bf366021c..8b563841425 100644
--- a/locale/sw_KE/gitlab.po
+++ b/locale/sw_KE/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: sw\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:40\n"
+"PO-Revision-Date: 2022-04-01 09:15\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/ta_IN/gitlab.po b/locale/ta_IN/gitlab.po
index 8f14762e477..689b991ff9d 100644
--- a/locale/ta_IN/gitlab.po
+++ b/locale/ta_IN/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ta\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:37\n"
+"PO-Revision-Date: 2022-04-01 09:12\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index 4713d33cf40..c6bab9c14fe 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: tr\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr " Lütfen oturum açın."
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr " Bu dosyaya yine %{action} deneyin."
-msgid " Type"
-msgstr " Tür"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Bunu %{grace_period_deadline} önce yapmanız gerekiyor."
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] "%d yorum daha"
msgstr[1] "%d yorum daha"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d açık konu"
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "%d kişisel proje kaldırılır ve geri yüklenemez."
msgstr[1] "%d kişisel proje kaldırılır ve geri yüklenemez."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "Önceden birleştirilmiş %d işlem"
@@ -371,10 +375,10 @@ msgid_plural "%d projects selected"
msgstr[0] "%d proje seçildi"
msgstr[1] "%d proje seçildi"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "Uyarı içeren %d istek"
-msgstr[1] "Uyarı içeren %d istek"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -468,9 +472,6 @@ msgstr ""
msgid "%{address} is an invalid IP address range"
msgstr "%{address} geçersiz bir IP adresi aralığıdır"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} kaldırılacak! Emin misiniz?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, e-posta adresinizi şimdi onaylayın!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} gün"
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr "%{start} - %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr "+%{tags} daha fazla"
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "Yeni bir kimliğe bürünme belirteci oluşturuldu."
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr "Otomatik dağıtım hakkında"
msgid "About this feature"
msgstr "Bu özellik hakkında"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Kötüye Kullanım Raporları"
@@ -1827,9 +1851,6 @@ msgstr "LDAP hesabınız için erişim reddedildi."
msgid "Access denied: %{error}"
msgstr "EriÅŸim reddedildi: %{error}"
-msgid "Access expiration date"
-msgstr "EriÅŸim bitiÅŸ tarihi"
-
msgid "Access expires"
msgstr "EriÅŸim sona eriyor"
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr "Kubernetes kümesi ekle"
msgid "Add LICENSE"
msgstr "LÄ°SANS ekle"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr "Åžimdi yorum ekle"
msgid "Add comment to design"
msgstr "Tasarıma yorum ekle"
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr "EpiÄŸe bir sorun ekler."
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr "Misafir"
msgid "AdminArea|Included Free in license"
msgstr "Lisansa ücretsiz dahildir"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "Son gruplar"
@@ -2484,6 +2520,9 @@ msgstr "Son üyeler"
msgid "AdminArea|Maintainer"
msgstr "Sorumlu"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr "Yeni proje"
msgid "AdminArea|New user"
msgstr "Yeni kullanıcı"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "Sahibi"
@@ -2580,12 +2622,18 @@ msgstr "%{projectName} projesi silinsin mi?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Otomatik DevOps etki alanı"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr "Let's Encrypt e-postası"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr "Gerekli iş hattı yapılandırması"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "Etkin Kullanıcılar"
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Git erişimi için yalnızca seçili protokollerin kullanılmasına izin ver."
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "Blob datanın öngösteriminde, bir hata meydana geldi"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr "Son aramalar ayrıştırılırken bir hata oluştu"
msgid "An error occurred while parsing the file."
msgstr "Dosyayı ayrıştırırken bir hata oluştu."
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr "Bir sorun zaten var"
msgid "An unauthenticated user"
msgstr "Kimliği doğrulanmamış bir kullanıcı"
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "Proje ortamı kontrol edilirken beklenmeyen bir hata oluştu."
@@ -4196,6 +4286,9 @@ msgstr "Herhangi bir dönüm noktası"
msgid "Any namespace"
msgstr "Herhangi isim alanı"
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr "Uygulama KimliÄŸi"
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "Bu projeyi arÅŸivlemek istediÄŸinizden emin misiniz?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "Bu projeyi arşivden kaldırmak istediğinizden emin misiniz?"
@@ -4923,12 +5019,6 @@ msgstr "Yorum yapan kullanıcıya ata"
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr "Kendinizi bu soruna atayın"
-
-msgid "Assign yourself to this issue"
-msgstr "Kendinizi bu soruna atayın"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "%{assignee_users_sentence} atandı."
@@ -5017,6 +5107,9 @@ msgstr "Dosya ekleme başarısız oldu."
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr "Denetim Etkinlikleri"
@@ -5047,6 +5140,9 @@ msgstr "Grup Etkinlikleri"
msgid "AuditLogs|IP Address"
msgstr "IP Adresi"
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr "Kullanıcı Etkinlikleri"
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "AÄŸustos"
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "Rozetleriniz"
-msgid "Balsamiq file could not be loaded."
-msgstr "Balsamiq dosyası yüklenemedi."
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr "Bu grubun planını yönetmek için, %{parent_billing_page_link} fatural
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr "Proje ara"
msgid "BoardNewIssue|Select a project"
msgstr "Bir proje seç"
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Dal zaten alınmış"
@@ -6133,9 +6310,6 @@ msgstr "Yayın Mesajı başarıyla güncellendi."
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "Dizine Gözat"
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr "Vekil(ler) deÄŸiÅŸtirildi."
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr "Ödeme"
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr "Tüm ortamlar"
msgid "CiVariable|Create wildcard"
msgstr "Joker oluÅŸtur"
-msgid "CiVariable|Masked"
-msgstr "Maskeli"
-
msgid "CiVariable|New environment"
msgstr "Yeni ortam"
-msgid "CiVariable|Protected"
-msgstr "Korumalı"
-
msgid "CiVariable|Search environments"
msgstr "Ortamları ara"
-msgid "CiVariable|Toggle masked"
-msgstr "Maskelemeyi aç/kapat"
-
-msgid "CiVariable|Toggle protected"
-msgstr "Korumayı aç/kapat"
-
msgid "Classification Label (optional)"
msgstr "Sınıflandırma Etiketi (isteğe bağlı)"
@@ -7453,6 +7648,15 @@ msgstr "Başlangıç tarihini temizle"
msgid "Clear templates search input"
msgstr "Şablonları arama girişini temizle"
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr "API URL'leri geçerli bir http/https url'si olmalıdır."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Kubernetes kümesi ekle"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Bir Kubernetes küme entegrasyonu ekleyin"
-
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 "Grubunuza bir Kubernetes kümesi eklemek, tüm projeleriniz arasında kümeyi otomatik olarak paylaşır. Uygulamaları gözden geçirmeyi kullanın, uygulamalarınızı dağıtın ve aynı kümeyi kullanan tüm projeler için iş hattınızı kolayca çalıştırın."
@@ -8052,10 +8268,7 @@ msgstr "Küme ismi gerekli."
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Kubernetes kümesi oluştur"
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr "Yeni küme oluştur"
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr "GitLab'ın Kubernetes kümeniz ile olan bağlantısını etkinleştirin
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Rol tabanlı erişim kontrolü (RBAC) kullanıyorsanız bu ayarı etkinleştirin."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr "Yeni Hizmet Erişim Anahtarını girin"
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Kubernetes kümeniz için ayrıntıları girin"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "Ortam kapsamı"
@@ -8220,9 +8430,6 @@ msgstr "Grup kümesi"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
-msgstr "Birden fazla küme oluşturuyorsanız ve Otomatik DevOps kullanıyorsanız, %{help_link_start}ilk önce bunu okuyunuz %{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr "Ä°ÅŸlem"
msgid "CommitMessage|Add %{file_name}"
msgstr "%{file_name} ekle"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr "oluÅŸturdu:"
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr "Onayla"
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr "BaÄŸlan"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,8 +9735,8 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
-msgstr "Sona erme ilkesi devre dışı"
+msgid "ContainerRegistry|Expiration policy is disabled."
+msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "Sona erme ilkesi %{time} süresi içinde çalışacak"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr "Yeni Etki Alanı Oluştur"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr "Yeni oluÅŸtur"
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr "Yeni etiket oluÅŸtur"
msgid "Create new project"
msgstr "Yeni proje oluÅŸtur"
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr "Özel aralık"
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr "Profilleri yönet"
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr "Veri hala hesaplanıyor..."
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr "Varsayılan dal"
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr "Haftanın varsayılan ilk günü"
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr "Varsayılan proje silme koruması"
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr "BitiÅŸ tarihi"
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr "Grubu düzenle: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr "Ortamlar"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr "Yeni ortam"
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr "Güncellendi"
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr "Proje seç"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr "Grupları Keşfet"
msgid "Explore groups"
msgstr "Grupları keşfedin"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "Projeleri keÅŸfedin"
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr "Åžub"
msgid "February"
msgstr "Åžubat"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr "Sonuçları filtrele..."
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr "Süzgeç..."
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr "GitLab Sorunu"
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr "GitLab üyesi ya da e-posta adresi"
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr "GitLab'da ara"
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr "Ortamlara git"
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr "Grup oluÅŸtur"
msgid "GroupsNew|Create new group"
msgstr "Yeni grup oluÅŸtur"
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr "Yükü gizle"
msgid "Hide shared projects"
msgstr "Paylaşılan projeleri gizle"
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr "Åžifremi unuttum"
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "IP Adresi"
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr "İçe aktarma sorunları"
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr "Üyeleri başka bir projeden içe aktar"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr "Projeyi içe aktar"
msgid "Import project from"
msgstr "Projeden içe aktar"
-msgid "Import project members"
-msgstr "Proje üyelerini içe aktar"
-
msgid "Import projects from Bitbucket"
msgstr "Bitbucket'ten projeleri içe aktar"
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr "%{minutes} mdakika kaldı"
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr "Tümü"
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr "Atamalar"
@@ -19313,6 +19800,12 @@ msgstr "Yayınlanma"
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr "Önem"
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr "SLA zamanı"
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr "Atanmamış"
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr "Özel ayarları kullan"
msgid "Integrations|Use default settings"
msgstr "Varsayılan ayarları kullan"
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr "Davet et"
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr "Grup davet et"
-
-msgid "Invite member"
-msgstr "Ãœye davet et"
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr "Sorun, %{name} %{reason} tarafından kapatıldı"
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,8 +20933,8 @@ msgstr "Panoyu sil"
msgid "IssueBoards|No matching boards found"
msgstr "Eşleşen pano bulunamadı"
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr "Bazı panolarınız gizlendi, tekrar görmek için bir lisans etkinleştirin."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr ""
msgid "IssueBoards|Switch board"
msgstr "Panoyu deÄŸiÅŸtir"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr "Yinelemeler"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr "Kullanıcı adı veya e-posta"
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr "Gözat"
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "Ä°ndir"
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr "En alta kaydır"
@@ -21094,6 +21674,9 @@ msgstr "En üste kaydır"
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr "Son güncelleme denemesi"
msgid "Last updated"
msgstr "Son güncelleme"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr "Son kullanılan"
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr "Lisans UyumluluÄŸu"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr "Lisansı kaldır"
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr "Grup etiketlerini yönet"
msgid "Manage labels"
msgstr "Etiketleri yönet"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr "Dönüm noktasını yönet"
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr "BirleÅŸtirme istekleri"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr "ör. ist/sn"
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Dönüm noktasını sil"
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr "Ay"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr "Daha Fazla Bilgi"
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr "Çıkış yapın ve farklı bir hesapla oturum açın"
msgid "Need help?"
msgstr "Yardım ister misiniz?"
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr "Yeni"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr "Yeni dizin"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr "Yeni ortam"
@@ -24471,6 +25140,9 @@ msgstr "Yeni proje/depo"
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr "Yeni zamanlama"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Yeni parçacık"
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr "Gösterilecek yineleme yok"
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr "Gösterilecek dönüm noktası yok"
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr "Sadece geçmişi göster"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Sadece proje üyeleri yorum yapabilir."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,12 +26301,12 @@ msgstr "Açık"
msgid "Open Selection"
msgstr "Seçimi Aç"
-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 errors"
msgstr "Açık hatalar"
+msgid "Open in Gitpod"
+msgstr ""
+
msgid "Open in Web IDE"
msgstr ""
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr "Ham olarak aç"
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "Kenar çubuğunu aç"
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "Yeni bir pencerede açılır"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr "Sahibi"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "İş hatları"
@@ -26873,10 +27551,13 @@ msgstr "İş hatları çizelgeleri"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr "'%{project_name}' için iş hattı ayarları başarıyla güncellendi."
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr "Ä°ÅŸlem"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr "Göreceli zamanları kullan"
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr "Önceki"
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr "Tam isim"
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 ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr "Bu bilgiler profilinizde görünecek"
msgid "Profiles|Time settings"
msgstr "Zaman ayarları"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "İki Aşamalı Kimlik Doğrulama"
@@ -28229,9 +28913,6 @@ msgstr "Adınız, %{provider_label} hesabınıza göre otomatik olarak ayarlandÄ
msgid "Profiles|Your status"
msgstr "Durumunuz"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "Örneğin. MacBook anahtarım"
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr "Birleştirme önerileri"
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr "Yollama etkinlikleri"
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr "Kötüye kullanımı yöneticiye bildir"
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr "Metriklerin raporları değişmedi"
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr "Test özeti"
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr "Ä°nceleme istekleriniz"
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "Yol haritası"
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "Çalışıyor"
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr "Projeleri ara"
msgid "Search projects..."
msgstr "Projeleri ara..."
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr "Projeler eklendi"
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr "Sayfa Seç"
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr "Davet etmek için bir grup seçin"
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr "Hedef dalı seç"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr "Saat dilimi seçin"
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "Durum ifadesi ekle"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr "Adınızın ve profil resminizin yanında bir gösterge belirir"
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr "Boşluk değişikliklerini göster"
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr "Oturum açıldı:"
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr "BaÅŸlama tarihi"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr "Durum:"
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr "Abonelik başarıyla oluşturuldu."
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr "Hedef Yol"
msgid "Target branch"
msgstr "Hedef dal"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "Åžablon"
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr "Uzak depo güncelleniyor..."
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr "Bu işlem veri kaybına yol açabilir. Yanlışlıkla yapılacak işleml
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Bu iÅŸ iptal edildi"
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr "Kenar çubuğunu aç/kapat"
msgid "Toggle the Performance Bar"
msgstr "Performans Çubuğunu aç/kapat"
-msgid "Toggle thread"
-msgstr "Konuyu aç/kapat"
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr "Tekrar dene"
msgid "Try again?"
msgstr "Tekrar denensin mi?"
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "GitLab’ın sunduğu her şeyi 30 gün boyunca deneyin."
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr "Bu epik şu anda güncellenemiyor."
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "Yeni Dosya Yükle"
@@ -39385,9 +40364,6 @@ msgstr "Dosya yükle"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr "yüklemek için tıklayın"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr "Mevcut dönem kullanımı"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr "Değiştirilen @ dosyayı görüntüle "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "İçeriğinizi yazın veya dosyaları buraya sürükleyin…"
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr "AboneliÄŸiniz sona erdi!"
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr "birleÅŸtirilemez"
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "Lisansları yönet"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "Kod kalitesinde deÄŸiÅŸiklik yok"
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "etkin"
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "birleÅŸtirme isteÄŸi"
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "Birleştirme başarısız."
-msgid "mrWidget|Merge locally"
-msgstr "Yerel olarak birleÅŸtir"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr "BirleÅŸtirme isteÄŸi"
msgid "mrWidget|Resolve conflicts"
msgstr "Çakışmaları çöz"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "Geri al"
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr "yok"
-
msgid "need attention"
msgstr "dikkat gerekli"
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr "veya"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr "proje profil resmi"
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index b714ffb61e0..d30657ba8dc 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: uk\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:10\n"
msgid " %{start} to %{end}"
msgstr " %{start} до %{end}"
@@ -28,15 +28,9 @@ msgstr " Зібрано %{time}"
msgid " Please sign in."
msgstr " Будь лаÑка, увійдіть."
-msgid " Target Path"
-msgstr " Цільовий шлÑÑ…"
-
msgid " Try to %{action} this file again."
msgstr " Спробуйте %{action} цей файл знову."
-msgid " Type"
-msgstr " Тип"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Ви повинні зробити це до %{grace_period_deadline}."
@@ -447,6 +441,13 @@ msgstr[1] "ще %d коментарі"
msgstr[2] "ще %d коментарів"
msgstr[3] "ще %d коментарів"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d відкрита задача"
@@ -468,6 +469,13 @@ msgstr[1] "%d оÑобиÑÑ‚Ñ– проєкти будуть видалені Ñ– Ð
msgstr[2] "%d оÑобиÑтих проєктів будуть видалені Ñ– не зможуть бути відновлені."
msgstr[3] "%d оÑобиÑтих проєктів будуть видалені Ñ– не зможуть бути відновлені."
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] "%d бал"
+msgstr[1] "%d бали"
+msgstr[2] "%d балів"
+msgstr[3] "%d балів"
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d раніше об'єднаний коміт"
@@ -489,12 +497,12 @@ msgstr[1] "%d проєкти обрано"
msgstr[2] "%d проєктів обрано"
msgstr[3] "%d проєктів обрано"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d запит із зауваженнÑми"
-msgstr[1] "%d запити із зауваженнÑми"
-msgstr[2] "%d запитів із зауваженнÑми"
-msgstr[3] "%d запитів із зауваженнÑми"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -615,14 +623,11 @@ msgid "%{actionText} & close %{noteable}"
msgstr "%{actionText} та закрити %{noteable}"
msgid "%{actionText} & reopen %{noteable}"
-msgstr ""
+msgstr "%{actionText} і повторно відкрити %{noteable}"
msgid "%{address} is an invalid IP address range"
msgstr "%{address} - недійÑний діапазон IP-адреÑ"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "%{anchorOpen}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{anchorClose} про те, Ñк Ви можете налаштувати / вимкнути реєÑтрацію у Ñвоєму інÑтанÑÑ–."
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link} клонув(-ла) %{original_issue} до %{new_issue}."
@@ -872,6 +877,9 @@ msgstr "%{integrations_link_start}Інтеграції%{link_end} дозволÑ
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} буде видалено! Ви впевнені?"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr "%{issueType} дії"
@@ -950,8 +958,8 @@ msgstr "%{level_name} не допуÑкаєтьÑÑ, оÑкільки проєк
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr "%{linkStart}Докладніше:%{linkEnd}"
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "%{link_start}ДовідайтеÑÑŒ більше%{link_end} про ролі."
+msgid "%{link_start}Add a license%{link_end} that you have received from 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} з назви , щоб зробити можливим Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ†ÑŒÐ¾Ð³Ð¾ запиту, коли він буде готовий."
@@ -959,9 +967,6 @@ msgstr "%{link_start}Видаліть %{draft_snippet} префікÑ%{link_end}
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "%{link_start}Почніть заголовок з %{draft_snippet}%{link_end}, щоб запобігти злиттю чернетки запиту на злиттÑ, перш ніж він буде готовий."
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr "%{link_start}Завантажте ліцензійний файл%{link_end} або введіть ліцензійний ключ, Ñкий ви отримали від GitLab Inc."
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr "%{link_start}Яку інформацію збирає ÐºÐ¾Ð¼Ð¿Ð°Ð½Ñ–Ñ GitLab Inc.?%{link_end}"
@@ -1031,6 +1036,9 @@ msgstr "%{name}(%{url}) проÑÑ‚Ñ–Ñ€ імен вичерпавÑÑ Ñƒ хвил
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, підтвердіть Ñвою адреÑу електронної пошти зараз!"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days} день"
@@ -1170,11 +1178,21 @@ msgstr "%{spanStart}в%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} до %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr "%{strongOpen}ПопередженнÑ:%{strongClose} поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ SAML може Ñпричинити автоматичне Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÑƒÑ‡Ð°Ñників із груп."
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
-msgstr "%{strongStart}Порада:%{strongEnd}Ви також можете перевірити запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾, %{linkStart}дотримуючиÑÑŒ цих вказівок%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -1486,8 +1504,8 @@ msgstr "+%{more_reviewers_count} більше оглÑдачів"
msgid "+%{tags} more"
msgstr "+%{tags} більше"
-msgid ", and "
-msgstr ", Ñ– "
+msgid ", "
+msgstr ", "
msgid ", or "
msgstr ", або "
@@ -1710,7 +1728,7 @@ msgid "1000+"
msgstr "1000+"
msgid "192.168.0.0/24 or 2001:0DB8:1234::/48"
-msgstr ""
+msgstr "192.168.0.0/24 або 2001:0DB8:1234::/48"
msgid "1st contribution!"
msgstr "Перший внеÑок!"
@@ -1850,9 +1868,18 @@ msgstr "Опубліковано новий Реліз %{tag} Ð´Ð»Ñ %{name}. П
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "Опубліковано новий Реліз %{tag} Ð´Ð»Ñ %{name}. ПереглÑньте Ñторінку Релізів щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ:"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "Створено новий токен імітуваннÑ."
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr "Ðовий перÑональний токен доÑтупу, названий %{token_name}, був Ñтворений."
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "Ðеконфіденційний епік не може бути призначеним Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð´ÐµÐ½Ñ†Ñ–Ð¹Ð½Ð¾Ð³Ð¾ батьківÑького епіка"
@@ -2045,6 +2072,9 @@ msgstr "Про авто розгортаннÑ"
msgid "About this feature"
msgstr "Про цю функцію"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Звіти про зловживаннÑ"
@@ -2075,9 +2105,6 @@ msgstr "ДоÑтуп до вашого облікового запиÑу LDAP з
msgid "Access denied: %{error}"
msgstr "ДоÑтуп заборонено: %{error}"
-msgid "Access expiration date"
-msgstr "Дата Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð´Ð¾Ñтупу"
-
msgid "Access expires"
msgstr "Ð§Ð°Ñ Ð´Ð¾Ñтупу закінчуєтьÑÑ"
@@ -2231,6 +2258,9 @@ msgstr "СкаÑувати підпиÑку"
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr "Ви можете %{unsubscribe_link} у будь-Ñкий чаÑ"
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr "ДіÑ"
@@ -2262,7 +2292,7 @@ msgid "Activity"
msgstr "ÐктивніÑÑ‚ÑŒ"
msgid "Activity|An error occurred while retrieving activity. Reload the page to try again."
-msgstr ""
+msgstr "При отриманні даних активноÑÑ‚Ñ– ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Перезавантажте Ñторінку, Ñ– Ñпробуйте знову."
msgid "Add"
msgstr "Додати"
@@ -2288,6 +2318,9 @@ msgstr "Додати Kubernetes-клаÑтер"
msgid "Add LICENSE"
msgstr "Додати файл ліцензії (LICENSE)"
+msgid "Add License"
+msgstr "Додати ліцензію"
+
msgid "Add New Site"
msgstr "Додати новий Ñайт"
@@ -2355,7 +2388,7 @@ msgid "Add a numbered list"
msgstr "Додати нумерований ÑпиÑок"
msgid "Add a related epic"
-msgstr ""
+msgstr "Додати пов’Ñзаний епік"
msgid "Add a related issue"
msgstr "Додати пов'Ñзану задачу"
@@ -2411,6 +2444,9 @@ msgstr "Додати коментар"
msgid "Add comment to design"
msgstr "Додати коментар до дизайну"
+msgid "Add comment..."
+msgstr "Додати коментар..."
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr "Додати коментар до завдань Asana. %{docs_link}"
@@ -2472,7 +2508,7 @@ msgid "Add or subtract spent time"
msgstr "Додати або віднÑти витрачений чаÑ"
msgid "Add people"
-msgstr ""
+msgstr "Додати людей"
msgid "Add previously merged commits"
msgstr "Додати раніше злиті коміти"
@@ -2639,6 +2675,9 @@ msgstr "Додає задачу до епіку."
msgid "Adds email participant(s)."
msgstr "Додає учаÑника(ів)."
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2720,6 +2759,9 @@ msgstr "ГіÑÑ‚ÑŒ"
msgid "AdminArea|Included Free in license"
msgstr "Безкоштовно включені в ліцензію"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "ОÑтанні групи"
@@ -2732,6 +2774,9 @@ msgstr "ОÑтанні кориÑтувачі"
msgid "AdminArea|Maintainer"
msgstr "Керівник"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr "Мінімальний доÑтуп"
@@ -2744,6 +2789,9 @@ msgstr "Ðовий проєкт"
msgid "AdminArea|New user"
msgstr "Ðовий кориÑтувач"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "ВлаÑник"
@@ -2828,12 +2876,18 @@ msgstr "Видалити проєкт %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr "Let's Encrypt буде налаштований Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інÑтанÑа GitLab за допомогою цієї адреÑи електронної пошти. Ви отримуватимете повідомленнÑ, Ñкі попереджають про Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії Ñертифікатів. %{link_start}ДізнайтеÑÑŒ більше. %{link_end}"
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr "Ð’ÑÑ– нові проєкти за замовчуваннÑм можуть викориÑтовувати загальні runner'и (Runner'и) інÑтанÑа."
msgid "AdminSettings|Auto DevOps domain"
msgstr "Домен Auto DevOps"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Ðалаштувати Let's Encrypt"
@@ -2873,6 +2927,27 @@ msgstr "електронна пошта Let's Encrypt"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr "МакÑимальна триваліÑÑ‚ÑŒ ÑеÑÑ–Ñ— Ð´Ð»Ñ Git операцій, коли 2FA увімкнена."
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr "Ðові змінні CI / CD у проєктах та групах за замовчуваннÑм захищені."
@@ -2888,6 +2963,9 @@ msgstr "Вимагати від кориÑтувачів підтвердженÐ
msgid "AdminSettings|Required pipeline configuration"
msgstr "Ðеобхідна ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñƒ"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr "Виберіть шаблон CI/CD"
@@ -2903,6 +2981,12 @@ msgstr "ТриваліÑÑ‚ÑŒ ÑеÑÑ–Ñ— Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— з Git, коли
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "Ð’Ñтановити шаблон CI/CD Ñк необхідну конфігурацію конвеєра Ð´Ð»Ñ Ð²ÑÑ–Ñ… проєктів інÑтанÑа. ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ CI/CD об'єднуєтьÑÑ Ð² необхідну конфігурацію конвеєра під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку конвеєра. %{link_start}Що Ñ” необхідною конфігурацією Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð²?%{link_end}"
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr "Ð’Ñтановіть макÑимальний розмір GitLab Pages Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ проєкту (0 Ð´Ð»Ñ Ð½ÐµÐ¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð¾Ñ— кількоÑÑ‚Ñ–). %{link_start}ДовідайтеÑÑŒ більше.%{link_end}"
@@ -2912,9 +2996,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 "ОÑтанні артефакти Ð´Ð»Ñ Ð²ÑÑ–Ñ… завдань у оÑтанніх уÑпішних конвеєрах у кожному проєкті зберігаютьÑÑ Ñ‚Ð° не мають терміну дії."
@@ -2924,6 +3005,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr "Шаблон Ð´Ð»Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¾Ñ— конфігурації конвеєра може бути одним із шаблонів, наданих GitLab, або інший шаблон доданий до репозиторію шаблонів інÑтанÑу. %{link_start}Як Ñтворити шаблон інÑтанÑу?%{link_end}"
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "Ðктивні кориÑтувачі"
@@ -3830,8 +3914,8 @@ msgstr "Дозволити кориÑтувачам без прав адміні
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Дозволити викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ вибраних протоколів Ð´Ð»Ñ Ð´Ð¾Ñтупу до Git."
-msgid "Allow owners to manage default branch protection per group"
-msgstr "Дозволити влаÑникам керувати захиÑтом гілок за замовчуваннÑм Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— групи"
+msgid "Allow owners to manage default branch protection per group."
+msgstr "Дозволити влаÑникам керувати захиÑтом гілок за замовчуваннÑм Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— групи."
msgid "Allow owners to manually add users outside of LDAP"
msgstr "Дозволити влаÑникам вручну додавати кориÑтувачів за межами LDAP"
@@ -3944,6 +4028,9 @@ msgstr "Amazon-автентифікацію не %{link_start}налаштова
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 Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr "Ваша Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñтворила вам обліковий Ð·Ð°Ð¿Ð¸Ñ Enterprise User GitLab:"
@@ -3998,6 +4085,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду об'єкта"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr "ВідбулаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°"
@@ -4241,6 +4331,9 @@ msgstr "Помилка при обробці Ñ–Ñторії пошуків"
msgid "An error occurred while parsing the file."
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при обробці файлу."
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "Помилка при видаленні епіків."
@@ -4356,6 +4449,9 @@ msgstr "Ð¦Ñ Ð·Ð°Ð´Ð°Ñ‡Ð° вже Ñ–Ñнує"
msgid "An unauthenticated user"
msgstr "Ðеавторизований кориÑтувач"
+msgid "An unexpected error occurred"
+msgstr "СталаÑÑŒ неочікувана помилка"
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "Ðеочікувана помилка при перевірці Ñередовища проєкту."
@@ -4446,6 +4542,9 @@ msgstr "Будь-Ñкий етап"
msgid "Any namespace"
msgstr "Будь-Ñкий проÑÑ‚Ñ–Ñ€ імен"
+msgid "Anyone can register for an account."
+msgstr "Будь-хто може зареєÑтрувати обліковий запиÑ."
+
msgid "App ID"
msgstr "Ідентифікатор заÑтоÑунку"
@@ -4940,11 +5039,14 @@ msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
msgstr "Ви ÐБСОЛЮТÐО ВПЕВÐЕÐІ що бажаєте видалити цю групу?"
msgid "Are you absolutely sure?"
-msgstr ""
+msgstr "Ви абÑолютно впевнені?"
msgid "Are you sure that you want to archive this project?"
msgstr "Ви впевнені, що хочете заархівувати цей проєкт?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "Ви впевнені, що хочете розархівувати цей проєкт?"
@@ -4976,7 +5078,7 @@ msgid "Are you sure you want to delete this SSH key?"
msgstr "Ви впевнені, що хочете видалити цей SSH-ключ?"
msgid "Are you sure you want to delete this comment?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити цей коментар?"
msgid "Are you sure you want to delete this deploy key?"
msgstr "Ви впевнені, що хочете видалити цей ключ розгортаннÑ?"
@@ -4985,7 +5087,7 @@ msgid "Are you sure you want to delete this device? This action cannot be undone
msgstr "Ви впевнені, що хочете видалити цей приÑтрій? Цю дію неможливо ÑкаÑувати."
msgid "Are you sure you want to delete this label?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити цю мітку?"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Ви впевнені, що хочете видалити цей розклад Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°?"
@@ -5052,7 +5154,7 @@ msgid "Are you sure you want to remove this list?"
msgstr "Ви впевнені, що хочете видалити цей ÑпиÑок?"
msgid "Are you sure you want to remove this nickname?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити цей пÑевдонім?"
msgid "Are you sure you want to reset the health check token?"
msgstr "Ви впевнені, що Ви хочете перегенерувати цей ключ перевірки працездатноÑÑ‚Ñ–?"
@@ -5070,7 +5172,7 @@ msgid "Are you sure you want to revoke this personal access token? This action c
msgstr "Ви впевнені, що хочете відкликати цей перÑональний токен доÑтупу? Ð¦Ñ Ð´Ñ–Ñ Ð½Ðµ може бути ÑкаÑована."
msgid "Are you sure you want to revoke this project access token? This action cannot be undone."
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити цей проєктний токен доÑтупу? Ð¦Ñ Ð´Ñ–Ñ Ð½Ðµ може бути ÑкаÑована."
msgid "Are you sure you want to stop this environment?"
msgstr "Ви впевнені що хочете зупинити це Ñередовище?"
@@ -5189,12 +5291,6 @@ msgstr ""
msgid "Assign to me"
msgstr "Призначити Ñобі"
-msgid "Assign yourself to these issues"
-msgstr "Призначити ці задачі Ñобі"
-
-msgid "Assign yourself to this issue"
-msgstr "Призначити цю задачу Ñобі"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "Призначено %{assignee_users_sentence}."
@@ -5285,6 +5381,9 @@ msgid "Attaching the file failed."
msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¸ÐºÑ€Ñ–Ð¿Ð¸Ñ‚Ð¸ файл."
msgid "Attention"
+msgstr "Увага"
+
+msgid "Attention requested"
msgstr ""
msgid "Audit Events"
@@ -5317,6 +5416,9 @@ msgstr "Події групи"
msgid "AuditLogs|IP Address"
msgstr "IP-адреÑа"
+msgid "AuditLogs|Log"
+msgstr "Журнал"
+
msgid "AuditLogs|Member Events"
msgstr "Події учаÑника"
@@ -5338,6 +5440,54 @@ msgstr "Цього міÑÑцÑ"
msgid "AuditLogs|User Events"
msgstr "Події кориÑтувача"
+msgid "AuditStreams|Active"
+msgstr "Ðктивний"
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr "Видалити %{link}"
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "Ñерп."
@@ -5698,9 +5848,6 @@ msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ цей значок. Вида
msgid "Badges|Your badges"
msgstr "Ваші значки"
-msgid "Balsamiq file could not be loaded."
-msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл Balsamiq."
-
msgid "BambooService|Atlassian Bamboo"
msgstr "Atlassian Bamboo"
@@ -5722,6 +5869,9 @@ msgstr "ЗапуÑтити CI/CD конвеєри за допомогою Atlass
msgid "BambooService|The user with API access to the Bamboo server."
msgstr "КориÑтувач із API доÑтупом до Bambooo Ñервера."
+msgid "Banner message"
+msgstr "Заголовок повідомленнÑ"
+
msgid "Based on"
msgstr "Ðа оÑнові"
@@ -5812,6 +5962,12 @@ msgstr "Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ð»Ð°Ð½Ð¾Ð¼ цієї групи відвіÐ
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "Ðе дивлÑчиÑÑŒ на те, що GitLab припинÑÑ” доÑтуп до Бронзового плану, ви можете продовжити бронзову підпиÑку ще один раз до %{eoa_bronze_plan_end_date}. Також ми пропонуємо обмежене за чаÑом безкоштовне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ Преміум плану (до 25 кориÑтувачів)! ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про зміни та пропозиції у нашому %{announcement_link}."
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -6038,6 +6194,9 @@ msgstr "Пошук проєктів"
msgid "BoardNewIssue|Select a project"
msgstr "Вибрати проєкт"
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÑ‚Ð°Ð¿Ñ–Ð² ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте ще раз."
@@ -6053,6 +6212,9 @@ msgstr "Будь-Ñкий етап"
msgid "BoardScope|Any assignee"
msgstr "Будь-Ñкий виконавець"
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr "Будь-Ñка мітка"
@@ -6062,24 +6224,39 @@ msgstr "Виконавець"
msgid "BoardScope|Choose labels"
msgstr "Вибрати мітки"
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr "Редагувати"
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr "Мітки"
msgid "BoardScope|Milestone"
msgstr "Етап"
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr "Етап відÑутній"
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr "Пошук етапів"
msgid "BoardScope|Select assignee"
msgstr "Обрати виконавцÑ"
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr "Вибрати мітку"
@@ -6144,6 +6321,9 @@ msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑпиÑків дошки ÑталаÑÑ
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡ дошки ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, перезавантажте Ñторінку."
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾ÑˆÐºÐ¸ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, перезавантажте Ñторінку."
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr "Під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑпиÑків ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, перезавантажте Ñторінку."
@@ -6250,6 +6430,9 @@ msgstr "Гілка вже Ñ–Ñнує"
msgid "Branch changed"
msgstr "Гілку змінено"
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "Гілка вже Ñ–Ñнує"
@@ -6409,9 +6592,6 @@ msgstr "ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпішно оновлено."
msgid "Broadcast Messages"
msgstr "ПовідомленнÑ"
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "ПереглÑнути каталог"
@@ -6451,6 +6631,9 @@ msgstr "%{host} працює із заÑтарілою верÑією GitLab (v%
msgid "BulkImport|%{feature} (require v%{version})"
msgstr "%{feature} (потрібна v%{version})"
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "ІÑнуючі групи"
@@ -6493,12 +6676,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr "Ðова група"
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð½ÐµÐ´Ð¾Ñтупна"
msgid "BulkImport|No parent"
msgstr "Ðемає батьківÑького елемента"
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr "Повторний імпорт Ñтворює нову групу. Він не ÑинхронізуєтьÑÑ Ð· наÑвною групою."
@@ -6511,9 +6700,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr "Показано %{start}-%{end} із %{total} відповідного фільтра \"%{filter}\" від %{link}"
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr "Група джерел"
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "Ð”Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— групи"
@@ -6526,6 +6721,9 @@ msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” груп Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ"
msgid "BulkImport|Your imported groups will appear here."
msgstr "Ваші імпортовані групи з'ÑвлÑÑ‚ÑŒÑÑ Ñ‚ÑƒÑ‚."
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -7106,6 +7304,9 @@ msgstr "Це Ñтворить новий коміт, щоб анулювати Ñ
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr "Ваші зміни будуть внеÑені до %{branchName} , оÑкільки запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸Ð¹."
+msgid "Changed"
+msgstr "Змінено"
+
msgid "Changed assignee(s)."
msgstr "Змінено виконавцÑ(ців)."
@@ -7136,6 +7337,12 @@ msgstr "Зміни в заголовку не збережені"
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr "ЗалишилоÑÑ Ñимволів"
+
+msgid "Characters over limit"
+msgstr "КількіÑÑ‚ÑŒ Ñимволів перевищена"
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr "Графіки не можуть відображатиÑÑ, оÑкільки вичерпано Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ даних. %{documentationLink}"
@@ -7303,6 +7510,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr "CI хвилини"
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr "ÐžÑ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð¼Ð¾Ð²Ð»ÐµÐ½Ð½Ñ"
@@ -7417,6 +7627,9 @@ msgstr "Проміжна Ñума"
msgid "Checkout|Tax"
msgstr "Податки"
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr "Ð’Ñього"
@@ -7660,24 +7873,12 @@ msgstr "Ð’ÑÑ– Ñередовища"
msgid "CiVariable|Create wildcard"
msgstr "Створити шаблон"
-msgid "CiVariable|Masked"
-msgstr "Приховано"
-
msgid "CiVariable|New environment"
msgstr "Ðове Ñередовище"
-msgid "CiVariable|Protected"
-msgstr "Захищений"
-
msgid "CiVariable|Search environments"
msgstr "Пошук Ñередовищ"
-msgid "CiVariable|Toggle masked"
-msgstr "Ввімкнути/вимкнути приховуваннÑ"
-
-msgid "CiVariable|Toggle protected"
-msgstr "Ввімкнути/вимкнути захиÑÑ‚"
-
msgid "Classification Label (optional)"
msgstr "Мітка клаÑифікації (необов'Ñзково)"
@@ -7735,6 +7936,15 @@ msgstr "ОчиÑтити дату початку"
msgid "Clear templates search input"
msgstr "ОчиÑтити поле вводу Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ шаблонів"
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr "ОчиÑтити вагу"
@@ -7894,11 +8104,14 @@ msgstr "Рівень клаÑтера"
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr "%{name} уÑпішно видалено"
msgid "ClusterAgents|%{number} of %{total} agents"
-msgstr ""
+msgstr "%{number} з %{total} агентів"
msgid "ClusterAgents|%{number} of %{total} clusters connected through cluster certificates"
msgstr "%{number} з %{total} клаÑтерів, підключених через Ñертифікати клаÑтера"
@@ -7918,8 +8131,8 @@ msgstr "%{tokenName} відкликано"
msgid "ClusterAgents|Access tokens"
msgstr "Токени доÑтупу"
-msgid "ClusterAgents|Actions"
-msgstr "Дії"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
+msgstr ""
msgid "ClusterAgents|Advanced installation methods"
msgstr "Додаткові методи вÑтановленнÑ"
@@ -7933,6 +8146,9 @@ msgstr "Ðгент %{strongStart}підключено%{strongEnd}"
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr "Ðгент %{strongStart}відключений%{strongEnd}"
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr "Ðгент не може підключитиÑÑ Ð´Ð¾ Gitlab"
@@ -7940,10 +8156,10 @@ msgid "ClusterAgents|Agent never connected to GitLab"
msgstr "Agent ніколи не підключаєтьÑÑ Ð´Ð¾ GitLab"
msgid "ClusterAgents|Agent version mismatch"
-msgstr ""
+msgstr "ÐевідповідніÑÑ‚ÑŒ верÑÑ–Ñ— агента"
msgid "ClusterAgents|Agent version mismatch and update"
-msgstr ""
+msgstr "ÐевідповідніÑÑ‚ÑŒ верÑÑ–Ñ— агента та оновленнÑ"
msgid "ClusterAgents|Agent version update required"
msgstr ""
@@ -7972,35 +8188,56 @@ msgstr "Сертифікат"
msgid "ClusterAgents|Configuration"
msgstr "КонфігураціÑ"
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr "Підключити Ñ–Ñнуючий клаÑтер"
+msgid "ClusterAgents|Connect a cluster"
+msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
-msgstr "Підключити за допомогою Ñертифіката"
+msgid "ClusterAgents|Connect a cluster (agent)"
+msgstr ""
+
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
+msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
+msgid "ClusterAgents|Connect existing cluster"
+msgstr "Підключити Ñ–Ñнуючий клаÑтер"
+
msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr "З'єднатиÑÑ Ð· GitLab Agent"
-msgid "ClusterAgents|Connect your cluster through an agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr "Підключено"
msgid "ClusterAgents|Connection status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·'єднаннÑ"
+msgid "ClusterAgents|Copy command"
+msgstr "Скопіювати команду"
+
msgid "ClusterAgents|Copy token"
msgstr "Копіювати токен"
-msgid "ClusterAgents|Create a new cluster"
-msgstr "Створити новий клаÑтер"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr "Створити токен доÑтупу Ð´Ð»Ñ Ð°Ð³ÐµÐ½Ñ‚Ñ–Ð²"
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
+msgstr "Створити токен"
msgid "ClusterAgents|Created by"
msgstr "Створено"
@@ -8011,6 +8248,9 @@ msgstr "Створено %{name} %{time}"
msgid "ClusterAgents|Date created"
msgstr "Дата ÑтвореннÑ"
+msgid "ClusterAgents|Default configuration"
+msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð·Ð° замовчуваннÑм"
+
msgid "ClusterAgents|Delete"
msgstr "Видалити"
@@ -8026,11 +8266,14 @@ msgstr "ОпиÑ"
msgid "ClusterAgents|Event occurred"
msgstr "ВідбулаÑÑ Ð¿Ð¾Ð´Ñ–Ñ"
+msgid "ClusterAgents|Failed to create a token"
+msgstr "Помилка при Ñтворенні токена"
+
msgid "ClusterAgents|Failed to register an agent"
msgstr "Помилка реєÑтрації агента"
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
-msgstr "Ð”Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ð³Ð¾ методу вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %{linkStart}див. документацію%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
+msgstr ""
msgid "ClusterAgents|GitLab Agent"
msgstr "Ðгент GitLab"
@@ -8041,17 +8284,14 @@ msgstr "GitLab Ðгент Ð´Ð»Ñ Kubernetes"
msgid "ClusterAgents|Give feedback"
msgstr "Ðадати відгук"
-msgid "ClusterAgents|Go to the repository files"
-msgstr "Перейти до файлів репозиторію"
-
-msgid "ClusterAgents|How to register an agent?"
-msgstr "Як зареєÑтрувати агента?"
+msgid "ClusterAgents|How do I register an agent?"
+msgstr ""
msgid "ClusterAgents|How to update an agent?"
-msgstr ""
+msgstr "Як оновити агента?"
msgid "ClusterAgents|Install a new agent"
-msgstr ""
+msgstr "Ð’Ñтановити новий агент"
msgid "ClusterAgents|Last connected %{timeAgo}."
msgstr "ОÑтаннє Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ %{timeAgo}."
@@ -8059,9 +8299,6 @@ msgstr "ОÑтаннє Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ %{timeAgo}."
msgid "ClusterAgents|Last contact"
msgstr "ОÑтанній контакт"
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr "ДізнайтеÑÑ, Ñк Ñтворити токен доÑтупу агентів"
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr "ДізнайтеÑÑ, Ñк уÑунути неполадки"
@@ -8078,7 +8315,7 @@ msgid "ClusterAgents|Never connected"
msgstr "Ðіколи не підключавÑÑ"
msgid "ClusterAgents|No agents"
-msgstr ""
+msgstr "Ðемає агентів"
msgid "ClusterAgents|No clusters connected through cluster certificates"
msgstr "Ðемає клаÑтерів, підключених через Ñертифікати клаÑтера"
@@ -8095,15 +8332,9 @@ msgstr "Рекомендований ÑпоÑіб уÑтановки"
msgid "ClusterAgents|Register"
msgstr "РеєÑтраціÑ"
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
+msgid "ClusterAgents|Registering agent"
msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð°Ð³ÐµÐ½Ñ‚Ð°"
-msgid "ClusterAgents|Registration token"
-msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ñ‚Ð¾ÐºÐµÐ½Ð°"
-
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr "Ð”Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð°Ð³ÐµÐ½Ñ‚Ñ–Ð² потрібна роль Керівника або вища"
@@ -8122,11 +8353,8 @@ msgstr "Безпека"
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr "Див. Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ– агента, наприклад Ñтворені або відкликані токени, підключені чи не підключені клаÑтери."
-msgid "ClusterAgents|Select an agent"
-msgstr "Вибрати агента"
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
-msgstr "Виберіть агента Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації в GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
+msgstr "Виберіть агента або введіть ім'Ñ, щоб Ñтворити новий"
msgid "ClusterAgents|Tell us what you think"
msgstr "Розкажіть нам, що ви думаєте"
@@ -8137,14 +8365,11 @@ msgstr "GitLab Agent забезпечує підвищений рівень бе
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr "Ðгент не був підключений протÑгом тривалого чаÑу. Можливо, виникла проблема з підключеннÑм. ОÑтанній Ñ‡Ð°Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ² %{timeAgo}."
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
-msgstr "Рекомендований метод вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ” токен. Якщо ви хочете дотримуватиÑÑ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ð³Ð¾ ÑпоÑобу вÑтановленнÑ, зазначеного в документації, переконайтеÑÑ, що зберегли Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° перед закриттÑм цього вікна."
-
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
-msgstr "Токен реєÑтрації буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð°Ð³ÐµÐ½Ñ‚Ð° на вашому клаÑтері до GitLab. %{linkStart}Що таке реєÑтраційні токени?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
msgid_plural "ClusterAgents|There's no activity from the past %d days"
@@ -8159,9 +8384,6 @@ msgstr "Цей агент не має токенів"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr "Щоб видалити агента, введіть %{name} Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ:"
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr "Щоб вÑтановити новий агент, Ñпочатку додайте файл конфігурації агента до цього репозиторію. %{linkStart}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ GitLab Agent.%{linkEnd}"
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr "Токен, Ñтворений %{userName}"
@@ -8183,6 +8405,9 @@ msgstr "Ми хотіли б дізнатиÑÑŒ більше про ваш доÑ
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr "Що таке активніÑÑ‚ÑŒ GitLab Agent?"
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr "Ви більше не зможете побачити цей токен піÑÐ»Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ†ÑŒÐ¾Ð³Ð¾ вікна."
@@ -8225,9 +8450,6 @@ msgstr "API URL має бути дійÑною HTTP/HTTPS адреÑою."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Додати Kubernetes клаÑтер"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "Додати інтеграцію із клаÑтером Kubernetes"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ ÐºÐ»Ð°Ñтера Kubernetes до вашої групи автоматично зробить його доÑтупним у вÑÑ–Ñ… ваших проєктах. ВикориÑтовуйте Review Apps, розгортайте заÑтоÑунки Ñ– легко запуÑкайте Ñвої конвеєри Ð´Ð»Ñ Ð²ÑÑ–Ñ… проєктів з викориÑтаннÑм цього клаÑтера."
@@ -8336,11 +8558,8 @@ msgstr "Ім'Ñ ÐºÐ»Ð°Ñтера Ñ” обов'Ñзковим."
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr "КлаÑтери викориÑтовуютьÑÑ ÑˆÐ»Ñхом вибору найближчого предка з підходÑщою доÑтупніÑÑ‚ÑŽ Ð´Ð»Ñ Ñередовищ. Ðаприклад, проєктні клаÑтери перекривають групові клаÑтери. %{linkStart}Більше інформації%{linkEnd}"
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr "Підключити клаÑтер до Ñертифіката"
-
-msgid "ClusterIntegration|Connect existing cluster"
-msgstr "Підключити Ñ–Ñнуючий клаÑтер"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
+msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
msgstr "Підключити за допомогою Ñертифікату"
@@ -8387,17 +8606,8 @@ msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ підмережі"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Створити Kubernetes-клаÑтер"
-msgid "ClusterIntegration|Create cluster on"
-msgstr "Створити клаÑтер на"
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr "Створити новий клаÑтер"
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr "Створити новий клаÑтер на EKS"
-
-msgid "ClusterIntegration|Create new cluster on GKE"
-msgstr "Створити новий клаÑтер на GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Kubernetes-клаÑтера"
@@ -8432,6 +8642,9 @@ msgstr "Увімкніть або вимкніть Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ GitLab
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Увімкніть цей параметр, Ñкщо викориÑтовуєтьÑÑ Ñ€Ð¾Ð»ÑŒÐ¾Ð²Ðµ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупом (RBAC)."
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr "Введіть новий токен ÑервіÑа"
@@ -8441,6 +8654,9 @@ msgstr "Введіть параметри вашого Amazon EKS Kubernetes-кÐ
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Введіть параметри вашого Kubernetes-клаÑтера"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr "ДоÑтупніÑÑ‚ÑŒ Ð´Ð»Ñ Ñередовищ"
@@ -8504,9 +8720,6 @@ msgstr "КлаÑтер групи"
msgid "ClusterIntegration|HTTP Error"
msgstr "Помилка 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 "Якщо ви налаштовуєте декілька клаÑтерів Ñ– викориÑтовуєте Auto DevOps, %{help_link_start}прочитайте Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ це%{help_link_end}."
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr ""
@@ -8552,8 +8765,8 @@ msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про %{help_link_start_machine_type}
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про %{help_link_start}зони%{help_link_end}."
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Kubernetes."
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про групові клаÑтери Kubernetes"
@@ -8645,9 +8858,6 @@ msgstr "КількіÑÑ‚ÑŒ вузлів"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr "КількіÑÑ‚ÑŒ вузлів має бути чиÑлом."
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr "Введіть інформацію про доÑтуп до вашого клаÑтера Kubernetes. Якщо вам потрібна допомога, ви можете прочитати нашу %{linkStart}документацію%{linkEnd} про Kubernetes"
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Будь-лаÑка впевнітьÑÑ, що ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Google задовольнÑÑ” наÑтупним вимогам:"
@@ -8897,12 +9107,18 @@ msgstr "Ðе вдаєтьÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ"
msgid "ClusterIntegration|Unknown Error"
msgstr "Ðевідома помилка"
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "ВикориÑтовує Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð»Ñ Cloud Run, Istio та HTTP баланÑувальник Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ клаÑтеру."
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr "VPC"
@@ -8915,8 +9131,8 @@ msgstr "Ми не змогли перевірити, що один із ваши
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr "Ðам не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ жодного проєкту. ПереконайтеÑÑ, що у Ð²Ð°Ñ Ñ” проєкт на %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
-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 "За допомогою підключеного до цього проєкту Kubernetes-клаÑтера, ви можете викориÑтовувати Review Apps, розгортати ваші проєкти, запуÑкати конвеєри збірки тощо."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ інтеграцію вашого клаÑтера та вÑÑ– реÑурÑи пов'Ñзані з цим клаÑтером, Ñкі були Ñтворені GitLab."
@@ -9159,9 +9375,6 @@ msgstr "Коміт"
msgid "CommitMessage|Add %{file_name}"
msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr "Додати %{file_name} та Ñтворити Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð· ÑкоÑÑ‚Ñ– коду"
-
msgid "CommitWidget|authored"
msgstr "автор"
@@ -9288,6 +9501,9 @@ msgstr "ПереглÑнути відкритий запит на злиттÑ"
msgid "Complete"
msgstr "Завершено"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr "Завершено"
@@ -9321,9 +9537,6 @@ msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾ÑÑ‚Ñ– конвеєру (н
msgid "ComplianceFrameworks|Configuration not found"
msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ знайдена"
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9348,6 +9561,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr "ÐедійÑний формат"
@@ -9357,7 +9573,7 @@ msgstr "Ðазва"
msgid "ComplianceFrameworks|Name is required"
msgstr "Потрібна назва"
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9369,12 +9585,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr "Ðова оболонка Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾ÑÑ‚Ñ–"
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr "Затверджено автором"
@@ -9397,10 +9625,10 @@ msgid "Confidential"
msgstr "Конфіденційний"
msgid "Confidential issue"
-msgstr ""
+msgstr "Конфіденційна задача"
msgid "Confidential note"
-msgstr ""
+msgstr "Конфіденційна нотатка"
msgid "Confidentiality"
msgstr "КонфіденційніÑÑ‚ÑŒ"
@@ -9436,7 +9664,7 @@ msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей в `.gitlab-ci.yml`, ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файлу, Ñкщо він ще не Ñ–Ñнує"
msgid "Configure GitLab"
-msgstr ""
+msgstr "Ðалаштувати GitLab"
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "Ðалаштувати runner'ів GitLab Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ викориÑÑ‚Ð°Ð½Ð½Ñ Ð’ÐµÐ±-терміналу. %{helpStart}Докладніше.%{helpEnd}"
@@ -9483,6 +9711,9 @@ msgstr "Ðалаштуйте додаткові права, Ñховище веÐ
msgid "Configure existing installation"
msgstr "Ðалаштувати Ñ–Ñнуючу інÑталÑцію"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9528,6 +9759,9 @@ msgstr "Ðалаштувати через запит на злиттÑ"
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9537,6 +9771,9 @@ msgstr "Підтвердити"
msgid "Confirm approval"
msgstr "Підтвердити затвердженнÑ"
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr "Підвердіть новий пароль"
@@ -9606,6 +9843,12 @@ msgstr "Вітаємо, ваша безкоштовна пробна верÑÑ–Ñ
msgid "Connect"
msgstr "Підключити"
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr "Підключити вÑÑ– репозиторії"
@@ -9731,9 +9974,6 @@ msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð²Ð°Ñ”"
msgid "ContainerRegistry|Cleanup pending"
msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð² очікуванні"
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr "Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту тепер доÑтупні політики очищеннÑ. %{linkStart}ÐатиÑніть тут, щоб почати.%{linkEnd}"
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr "Політику Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ‚ÐµÐ³Ñ–Ð² вимкнено"
@@ -9791,8 +10031,8 @@ msgstr "Помилка Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Docker"
msgid "ContainerRegistry|Enable expiration policy"
msgstr "Увімкнути політику Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії"
-msgid "ContainerRegistry|Expiration policy is disabled"
-msgstr "Політика Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії вимкнена"
+msgid "ContainerRegistry|Expiration policy is disabled."
+msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "Політика Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії відбудетьÑÑ Ñ‡ÐµÑ€ÐµÐ· %{time}"
@@ -9888,6 +10128,9 @@ msgstr "Кореневий образ"
msgid "ContainerRegistry|Run cleanup:"
msgstr "Виконати очищеннÑ:"
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "ДеÑкі теги не були видалені"
@@ -9927,6 +10170,9 @@ msgstr "Тег уÑпішно позначений Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ."
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr "Теги уÑпішно позначені Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ."
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr "Теги, Ñкі відповідають цим правилам, %{strongStart}зберігаютьÑÑ%{strongEnd}, навіть Ñкщо вони відповідають правилу Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ. %{secondStrongStart}оÑтанній%{secondStrongEnd} тег завжди зберігаєтьÑÑ."
@@ -10236,6 +10482,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr "Дії"
@@ -10272,6 +10521,12 @@ msgstr "ОÑтаннє викориÑтаннÑ"
msgid "CorpusManagement|Latest Job:"
msgstr "ОÑтаннє завданнÑ:"
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr "Ðове завантаженнÑ"
@@ -10287,9 +10542,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr "Загальний розмір: %{totalSize}"
-msgid "CorpusMnagement|New corpus"
-msgstr "Ðовий корпуÑ"
-
msgid "Could not add admins as members"
msgstr "Ðе вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ адмініÑтраторів Ñк учаÑників"
@@ -10407,8 +10659,8 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ваші дизайни, оÑкільки один або кілька файлів, що завантажуютьÑÑ, не підтримуютьÑÑ."
-msgid "Couldn't assign policy to project"
-msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ політику Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ"
+msgid "Couldn't assign policy to project or group"
+msgstr ""
msgid "Country"
msgstr "Країна"
@@ -10446,11 +10698,17 @@ msgstr "Створити новий домен"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr "Спочатку Ñтворіть обліковий Ð·Ð°Ð¿Ð¸Ñ GitLab, а потім приєднайте його до облікового запиÑу %{label}."
+msgid "Create a Kubernetes cluster"
+msgstr "Створити Kubernetes-клаÑтер"
+
msgid "Create a Mattermost team for this group"
msgstr "Створити команду в Mattermost Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи"
+msgid "Create a cluster"
+msgstr "Створити клаÑтер"
+
msgid "Create a group"
-msgstr ""
+msgstr "Створити групу"
msgid "Create a merge request"
msgstr "Створити запит на злиттÑ"
@@ -10477,7 +10735,7 @@ msgid "Create a personal access token on your account to pull or push via %{prot
msgstr "Створити токен доÑтупу Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ аккаунта, щоб відправлÑти та отримувати через %{protocol}."
msgid "Create a project"
-msgstr ""
+msgstr "Створити проєкт"
msgid "Create an account using:"
msgstr "Створити обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° допомогою:"
@@ -10560,9 +10818,6 @@ msgstr "Створити новий"
msgid "Create new %{name} by email"
msgstr "Створити новий %{name} за електронною поштою"
-msgid "Create new CI/CD pipeline"
-msgstr "Створити новий CI/CD конвеєр"
-
msgid "Create new Value Stream"
msgstr "Створити нове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ"
@@ -10587,6 +10842,9 @@ msgstr "Створити нову мітку"
msgid "Create new project"
msgstr "Створити новий проєкт"
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr "Створіть або імпортуйте Ñвій перший проєкт"
@@ -10617,9 +10875,6 @@ msgstr "Створити тему"
msgid "Create user"
msgstr "Створити кориÑтувача"
-msgid "Create via merge request"
-msgstr "Створити через запит на злиттÑ"
-
msgid "Create wildcard: %{searchTerm}"
msgstr "Створити шаблон: %{searchTerm}"
@@ -10872,44 +11127,26 @@ msgstr "Кредитна картка:"
msgid "Critical vulnerabilities present"
msgstr "ПриÑутні критичні вразливоÑÑ‚Ñ–"
-msgid "Crm|Contact has been added"
-msgstr "Контакт додано"
-
-msgid "Crm|Contact has been updated"
-msgstr "Контакт оновлено"
-
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create organization"
-msgstr "Створити організацію"
-
-msgid "Crm|Customer Relations Contacts"
-msgstr "Контакти по роботі з клієнтами"
+msgid "Crm|Contact has been updated."
+msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr "Організації по роботі з клієнтами"
+msgid "Crm|Customer relations contacts"
+msgstr ""
-msgid "Crm|Default rate (optional)"
-msgstr "Рівень за замовчуваннÑм (необов'Ñзково)"
+msgid "Crm|Customer relations organizations"
+msgstr ""
-msgid "Crm|Description (optional)"
-msgstr "ÐžÐ¿Ð¸Ñ (необов'Ñзково)"
+msgid "Crm|Default rate"
+msgstr ""
msgid "Crm|Edit contact"
msgstr "Редагувати контакт"
-msgid "Crm|Email"
-msgstr "Електронна пошта"
-
-msgid "Crm|First name"
-msgstr "Ім'Ñ"
-
-msgid "Crm|Last name"
-msgstr "Прізвище"
-
-msgid "Crm|New Organization"
-msgstr "Ðова організаціÑ"
+msgid "Crm|Edit organization"
+msgstr ""
msgid "Crm|New contact"
msgstr "Ðовий контакт"
@@ -10923,11 +11160,11 @@ msgstr "Контактів не знайдено"
msgid "Crm|No organizations found"
msgstr "Організацій не знайдено"
-msgid "Crm|Organization has been added"
-msgstr "Організацію було додано"
+msgid "Crm|Organization has been added."
+msgstr ""
-msgid "Crm|Phone number (optional)"
-msgstr "Ðомер телефону (необов'Ñзково)"
+msgid "Crm|Organization has been updated."
+msgstr ""
msgid "Cron Timezone"
msgstr "ЧаÑовий поÑÑ Cron"
@@ -11037,19 +11274,16 @@ msgstr "КориÑтувацький діапазон"
msgid "Custom range (UTC)"
msgstr "КориÑтувацький діапазон (UTC)"
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr "ÐŸÐ¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñького доÑвіду та Ñторонні пропозиції"
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -11178,15 +11412,33 @@ msgstr "має бути в групі"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} вибрано (%{maxLabels} max)"
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Дата"
msgid "CycleAnalytics|Display chart filters"
msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñ–Ð² графіків"
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -11243,12 +11495,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
-msgid "CycleAnalytics|Total time"
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
msgstr ""
+msgid "CycleAnalytics|Total time"
+msgstr "Загальний чаÑ"
+
msgid "CycleAnalytics|Type of work"
msgstr "Тип роботи"
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr "випадаючий фільтр груп"
@@ -11264,12 +11522,12 @@ msgstr "Ð”Ð»Ñ Ð²Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— DAG потрібно щонайменшÐ
msgid "DAST Configuration"
msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ DAST"
-msgid "DAST Scans"
-msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ DAST"
-
msgid "DAST profile not found: %{name}"
msgstr "Профіль DAST не знайдено: %{name}"
+msgid "DAST profiles"
+msgstr ""
+
msgid "DNS"
msgstr "DNS"
@@ -11358,7 +11616,7 @@ msgid "DastProfiles|AJAX spider"
msgstr "AJAX spider"
msgid "DastProfiles|API"
-msgstr ""
+msgstr "API"
msgid "DastProfiles|API endpoint URL"
msgstr ""
@@ -11414,6 +11672,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ профіль Ñайту. Будь лаÑка, Ñпробуйте ще раз."
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11468,9 +11729,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr "Керувати профілÑми"
@@ -11718,6 +11976,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr "Дані вÑе ще обчиÑлюютьÑÑ..."
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr "Тип даних"
@@ -11847,9 +12108,6 @@ msgstr "Гілка за замовчуваннÑм"
msgid "Default branch and protected branches"
msgstr "Гілка за замовчуваннÑм Ñ– захищені гілки"
-msgid "Default branch protection"
-msgstr "ЗахиÑÑ‚ гілки за замовчуваннÑм"
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11868,9 +12126,6 @@ msgstr "Перший день Ñ‚Ð¸Ð¶Ð½Ñ Ð·Ð° замовчуваннÑм"
msgid "Default first day of the week in calendars and date pickers."
msgstr "Перший день Ñ‚Ð¸Ð¶Ð½Ñ Ð·Ð° замовчуваннÑм в календарÑÑ… та при виборі дати."
-msgid "Default initial branch name"
-msgstr "Ðазва початкової гілки за замовчуваннÑм"
-
msgid "Default project deletion protection"
msgstr "ЗахиÑÑ‚ від Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ за замовчуваннÑм"
@@ -12007,7 +12262,7 @@ msgid "Delete pipeline"
msgstr "Видалити конвеєр"
msgid "Delete pipeline schedule"
-msgstr ""
+msgstr "Видалити розклад конвеєра"
msgid "Delete project"
msgstr "Видалити проєкт"
@@ -12040,7 +12295,7 @@ msgid "Delete this epic and all descendants?"
msgstr ""
msgid "Delete this project"
-msgstr ""
+msgstr "Видалити цей проєкт"
msgid "Delete user list"
msgstr "Видалити ÑпиÑок кориÑтувачів"
@@ -12106,7 +12361,7 @@ msgid "Deleting the project will delete its repository and all related resources
msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
-msgstr ""
+msgstr "ОчікуєтьÑÑ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ. Цей проєкт буде видалено %{date}. Репозиторій та інші реÑурÑи проєкту доÑтупні лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ."
msgid "Denied"
msgstr "Відмовлено"
@@ -12511,7 +12766,7 @@ msgid "Deploying to AWS is easy with GitLab"
msgstr ""
msgid "Deployment"
-msgstr ""
+msgstr "РозгортаннÑ"
msgid "Deployment Frequency"
msgstr "ЧаÑтота РозгортаннÑ"
@@ -12525,6 +12780,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12589,6 +12871,9 @@ msgstr "Ðевдало"
msgid "Deployment|Latest Deployed"
msgstr "ОÑтанній розгорнутий"
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr "ВиконуєтьÑÑ"
@@ -13248,6 +13533,9 @@ msgstr "Відхилено в конвеєрі %{pipelineLink}"
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr "Відхилено в конвеєрі %{pipelineLink} в %{projectLink}"
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13305,6 +13593,9 @@ msgstr "Домен"
msgid "Domain Name"
msgstr "Доменне ім'Ñ"
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr "Ще не зареєÑтровані?"
@@ -13395,6 +13686,9 @@ msgstr "Дизлайки"
msgid "Draft"
msgstr "Чернетка"
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13440,6 +13734,45 @@ msgstr "Запланована дата завершеннÑ"
msgid "Duration"
msgstr "ТриваліÑÑ‚ÑŒ"
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "Під Ñ‡Ð°Ñ Ñ†ÑŒÐ¾Ð³Ð¾ процеÑу вам буде запропоновано вказати URL-адреÑи з боку GitLab. ВикориÑтовуйте URL-адреÑи, показані нижче."
@@ -13542,9 +13875,6 @@ msgstr "Редагувати групу: %{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "Редагувати ідентифікацію Ð´Ð»Ñ %{user_name}"
-msgid "Edit in Web IDE"
-msgstr "Редагувати у веб-IDE"
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13869,6 +14199,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -14146,7 +14479,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -14278,6 +14611,9 @@ msgstr "Середовища"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "Середовища — це міÑцÑ, куди можна розгорнути код, наприклад staging або production."
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14293,9 +14629,6 @@ msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про зупинку Ñередовищ
msgid "Environments|Logs from %{start} to %{end}."
msgstr "Логи від %{start} до %{end}."
-msgid "Environments|More information"
-msgstr "Детальніше"
-
msgid "Environments|New environment"
msgstr "Ðове Ñередовище"
@@ -14377,8 +14710,11 @@ msgstr "Майбутнє розгортаннÑ"
msgid "Environments|Updated"
msgstr "Оновлено"
-msgid "Environments|You don't have any environments right now"
-msgstr "Ви поки не налаштували жодного Ñередовища"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr ""
@@ -14749,6 +15085,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr "Ðемає доÑтупних проєктів"
@@ -14758,6 +15100,9 @@ msgstr "Виберіть проєкт"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr "Помилки"
@@ -14999,6 +15344,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -15011,6 +15359,9 @@ msgstr "Потрібен лише один з %{attributes}"
msgid "Example: @sub\\.company\\.com$"
msgstr "Приклад: @sub\\.company\\.com$"
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr "Політика виключеннÑ:"
@@ -15039,7 +15390,7 @@ msgid "Existing sign in methods may be removed"
msgstr "ІÑнуючі методи входу можуть бути видалені."
msgid "Exit."
-msgstr ""
+msgstr "Вихід."
msgid "Expand"
msgstr "Розгорнути"
@@ -15131,6 +15482,9 @@ msgstr "ОглÑд Груп"
msgid "Explore groups"
msgstr "ОглÑд груп"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "ОглÑд проєктів"
@@ -15260,9 +15614,15 @@ msgstr "URL-адреÑа Ñлужби"
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15375,6 +15735,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ref."
@@ -15799,7 +16162,7 @@ msgstr "лют."
msgid "February"
msgstr "лютий"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15940,9 +16303,6 @@ msgstr "Фільтрувати результати..."
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr "Фільтр..."
@@ -16207,9 +16567,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -16237,6 +16594,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr "З %{providerTitle}"
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "З моменту ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ– до Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° production"
@@ -16300,9 +16660,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16850,10 +17207,7 @@ msgid "GitLab Issue"
msgstr "Задача GitLab"
msgid "GitLab KAS"
-msgstr ""
-
-msgid "GitLab Memberships CSV Export"
-msgstr ""
+msgstr "GitLab KAS"
msgid "GitLab Pages"
msgstr "Gitlab Pages"
@@ -16867,6 +17221,9 @@ msgstr "Бот Підтримки GitLab"
msgid "GitLab Team Member"
msgstr "УчаÑник команди GitLab"
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "GitLab КориÑтувач"
@@ -16918,9 +17275,6 @@ msgstr ""
msgid "GitLab logo"
msgstr "Логотип GitLab"
-msgid "GitLab member or Email address"
-msgstr "УчаÑник GitLab або адреÑа електронної пошти"
-
msgid "GitLab metadata URL"
msgstr "URL-адреÑа метаданних GitLab"
@@ -17146,15 +17500,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr "Пошук в GitLab"
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "Введіть та натиÑніть клавішу Enter Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ."
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr "Введіть, щоб нижче з'ÑвилиÑÑ Ð½Ð¾Ð²Ñ– пропозиції."
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr "У вÑьому GitLab"
@@ -17194,6 +17557,9 @@ msgstr "Перейти до визначеннÑ"
msgid "Go to environments"
msgstr "Перейти до Ñередовищ"
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr "Перейти до епіку"
@@ -17320,9 +17686,6 @@ msgstr "Проєкт Google Cloud"
msgid "Google Cloud authorizations required"
msgstr "Потрібно авторизуватиÑÑ Ð² Google Cloud"
-msgid "Google Cloud project"
-msgstr "Проєкт Google Cloud"
-
msgid "Google Cloud project misconfigured"
msgstr "Ðеправильно налаштовано проєкт Google Cloud"
@@ -17332,6 +17695,42 @@ msgstr "Потрібен проєкт Google Cloud"
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Google не %{link_start}налаштована належним чином%{link_end}. ЗвернітьÑÑ Ð´Ð¾ вашого адмініÑтратора GitLab Ñкщо хочете викориÑтовувати цю Ñлужбу."
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr "Зрозуміло"
@@ -17536,9 +17935,6 @@ msgstr "Групові runner'и"
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr "Змінні групи (уÑпадковані)"
@@ -17941,13 +18337,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -18070,6 +18466,9 @@ msgstr "Створити групу"
msgid "GroupsNew|Create new group"
msgstr "Створити нову групу"
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -18088,9 +18487,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr "ÐœÐ¾Ñ Ð´Ð¸Ð²Ð¾Ð²Ð¸Ð¶Ð½Ð° група"
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr "Ðемає доÑтупних параметрів імпорту"
@@ -18125,16 +18521,16 @@ msgid "GroupsTree|Are you sure you want to leave the \"%{fullName}\" group?"
msgstr "Ви впевнені, що хочете залишити групу \"%{fullName}\"?"
msgid "GroupsTree|Delete"
-msgstr ""
+msgstr "Видалити"
msgid "GroupsTree|Edit"
-msgstr ""
+msgstr "Редагувати"
msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ñ‚Ð¸ групу. Будь-лаÑка впевнітьÑÑ, що ви не єдитий влаÑник."
msgid "GroupsTree|Leave group"
-msgstr ""
+msgstr "Залишити групу"
msgid "GroupsTree|Loading groups"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿"
@@ -18146,7 +18542,7 @@ msgid "GroupsTree|No groups or projects matched your search"
msgstr "Жодна группа чи проєкт не задовольнÑÑ” параметрам вашого запиту"
msgid "GroupsTree|Options"
-msgstr ""
+msgstr "Параметри"
msgid "GroupsTree|Search by name"
msgstr "Пошук за іменем"
@@ -18170,7 +18566,7 @@ msgid "Groups|Group URL"
msgstr ""
msgid "Groups|Group avatar"
-msgstr ""
+msgstr "Ðватар групи"
msgid "Groups|Group description (optional)"
msgstr ""
@@ -18185,16 +18581,16 @@ msgid "Groups|Group path is unavailable. Path has been replaced with a suggested
msgstr ""
msgid "Groups|Learn more"
-msgstr ""
+msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ"
msgid "Groups|Must start with letter, digit, emoji, or underscore. Can also contain periods, dashes, spaces, and parentheses."
msgstr ""
msgid "Groups|Remove avatar"
-msgstr ""
+msgstr "Видалити аватар"
msgid "Groups|Save changes"
-msgstr ""
+msgstr "Зберегти зміни"
msgid "Guideline"
msgstr "Керівництво"
@@ -18211,6 +18607,113 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr "Базовий HTTP: відмовлено у доÑтупі\\nВи повинні викориÑтовувати перÑональний токен доÑтупу із облаÑÑ‚ÑŽ дії 'api' Ð´Ð»Ñ Git через HTTP.\\nВи можете згенерувати його в %{profile_personal_access_tokens_url}"
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18383,6 +18886,9 @@ msgstr "Приховати кориÑне навантаженнÑ"
msgid "Hide shared projects"
msgstr "Сховати Ñпільні проєкти"
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18534,9 +19040,6 @@ msgstr "Я приймаю %{terms_link}"
msgid "I forgot my password"
msgstr "Я забув пароль"
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18612,9 +19115,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "IP-адреÑа"
@@ -18744,6 +19244,12 @@ msgstr "Якщо ви хочете знову увімкнути двофактÐ
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr "Якщо ви хочете знову увімкнути двофакторну автентифікацію, перейдіть на Ñторінку %{settings_link_to}."
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr "Якщо ви придбали або поновили Ñвою підпиÑку Ñ– маєте код активації, введіть його нижче, щоб почати Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ—."
@@ -18818,7 +19324,7 @@ msgstr "Імпортувати екÑпортований проєкт GitLab"
msgid "Import and export rate limits"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñтоти імпорту та екÑпорту"
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18848,12 +19354,6 @@ msgstr ""
msgid "Import issues"
msgstr "Імпорт задач"
-msgid "Import members"
-msgstr "Імпортувати учаÑників"
-
-msgid "Import members from another project"
-msgstr "Імпортувати учаÑників з іншого проєкту"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "Імпортувати кілька репозиторіїв, надіÑлавши файл маніфеÑту."
@@ -18863,9 +19363,6 @@ msgstr "Імпорт проєкту"
msgid "Import project from"
msgstr "Імпортувати проєкт з"
-msgid "Import project members"
-msgstr "Імпортувати учаÑників проєкту"
-
msgid "Import projects from Bitbucket"
msgstr "Імпортувати проєкти з Bitbucket"
@@ -19042,7 +19539,7 @@ msgid "InProductMarketing|And finally %{deploy_link} a Python application."
msgstr ""
msgid "InProductMarketing|And many more..."
-msgstr ""
+msgstr "І багато іншого..."
msgid "InProductMarketing|Are your runners ready?"
msgstr ""
@@ -19141,7 +19638,7 @@ msgid "InProductMarketing|Easy"
msgstr "Легко"
msgid "InProductMarketing|Epics"
-msgstr ""
+msgstr "Епіки"
msgid "InProductMarketing|Expand your DevOps journey with a free GitLab trial"
msgstr ""
@@ -19206,9 +19703,6 @@ msgstr "ОÑнови Git"
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr "GitHub Enterprise Ð´Ð»Ñ GitLab"
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -19287,15 +19781,6 @@ msgstr "ЗапроÑити Ñвою команду зараз"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr "ЗапроÑÑ–Ñ‚ÑŒ Ñвоїх товаришів по команді в GitLab"
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr "Ð’Ñе це Ñ” в ÑтатиÑтиці"
@@ -19357,7 +19842,7 @@ msgid "InProductMarketing|Require multiple approvers on a merge request, so you
msgstr ""
msgid "InProductMarketing|Roadmaps"
-msgstr ""
+msgstr "Дорожні карти"
msgid "InProductMarketing|Scoped labels"
msgstr ""
@@ -19587,6 +20072,9 @@ msgstr "ЗалишилоÑÑŒ%{minutes} хвилин"
msgid "IncidentManagement|Achieved SLA"
msgstr "Укладена угода про рівень поÑлуг (SLA)"
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr "Ð’ÑÑ–"
@@ -19596,6 +20084,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr "УÑÑ– попередженнÑ, переведені до розрÑду інцидентів, автоматично відображаютьÑÑ Ñƒ ÑпиÑку. Ви також можете Ñтворити новий інцидент за допомогою кнопки нижче."
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr "Виконавці"
@@ -19636,7 +20133,7 @@ msgid "IncidentManagement|No incidents to display."
msgstr "Ðемає інцидентів Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ."
msgid "IncidentManagement|None"
-msgstr ""
+msgstr "Ðемає"
msgid "IncidentManagement|Open"
msgstr "Відкрити"
@@ -19653,6 +20150,12 @@ msgstr "Опубліковано"
msgid "IncidentManagement|Published to status page"
msgstr "Опубліковано на Ñторінці ÑтатуÑу"
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr "Рівень"
@@ -19668,6 +20171,9 @@ msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ–Ð
msgid "IncidentManagement|Time to SLA"
msgstr "Ð§Ð°Ñ Ð½Ð° угоду про рівень поÑлуг (SLA)"
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr "Ðепризначено"
@@ -19749,6 +20255,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19770,6 +20279,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr "Метрики"
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr "ПідÑумок"
@@ -19779,6 +20291,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr "Вказати ім'Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° в тілі ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ електронній пошті"
@@ -19887,6 +20402,12 @@ msgstr ""
msgid "Inherited:"
msgstr "УÑпадковано:"
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr "Вбудований"
@@ -20048,7 +20569,7 @@ msgid "Integrations|Comment settings:"
msgstr "Параметри коментарів:"
msgid "Integrations|Connection details"
-msgstr ""
+msgstr "Деталі підключеннÑ"
msgid "Integrations|Connection failed. Please check your settings."
msgstr ""
@@ -20075,7 +20596,7 @@ msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
msgstr ""
msgid "Integrations|Enable SSL verification"
-msgstr ""
+msgstr "Увімкнути перевірку SSL"
msgid "Integrations|Enable comments"
msgstr "Увімкнути коментарі"
@@ -20089,6 +20610,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -20156,7 +20680,7 @@ msgid "Integrations|Return to GitLab for Jira"
msgstr ""
msgid "Integrations|SSL verification"
-msgstr ""
+msgstr "Перевірка SSL"
msgid "Integrations|Save settings?"
msgstr "Зберегти налаштуваннÑ?"
@@ -20203,6 +20727,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr "ВикориÑтовувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм"
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -20215,12 +20742,18 @@ msgstr "Ви ще не активували жодної інтеграції."
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr "Ви активували кожну інтеграцію 🎉"
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20368,9 +20901,6 @@ msgstr "ЗапрошеннÑ"
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr "ЗапроÑити"
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20386,12 +20916,6 @@ msgstr "ЗапроÑити групу"
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr "ЗапроÑити групу"
-
-msgid "Invite member"
-msgstr "ЗапроÑити учаÑника"
-
msgid "Invite members"
msgstr "ЗапроÑити учаÑників"
@@ -20485,6 +21009,9 @@ msgstr "ЗапроÑити учаÑників"
msgid "InviteMembersModal|Members were successfully added"
msgstr "УчаÑники були уÑпішно додані"
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "Шукайте групу, щоб запроÑити"
@@ -20503,6 +21030,12 @@ msgstr "ЩоÑÑŒ пішло не так"
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20515,6 +21048,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr "ЗапроÑити групу"
@@ -20707,9 +21243,6 @@ msgstr "Задачу було закрито %{name} %{reason}"
msgid "Issue weight"
msgstr "Вага задачі"
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr "Вік"
@@ -20717,7 +21250,7 @@ msgid "IssueAnalytics|Assignees"
msgstr "Виконавці"
msgid "IssueAnalytics|Created by"
-msgstr ""
+msgstr "Створено"
msgid "IssueAnalytics|Due date"
msgstr "Запланована дата завершеннÑ"
@@ -20752,8 +21285,8 @@ msgstr "Видалити дошку"
msgid "IssueBoards|No matching boards found"
msgstr "Ðе знайдено відповідних дошок"
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr "ДеÑкі з ваших дошок Ñ” прихованими, активуйте ліцензію, щоб побачити Ñ—Ñ… знову."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr ""
msgid "IssueBoards|Switch board"
msgstr "Перемкнути дошку"
@@ -20855,10 +21388,10 @@ msgid "IssuesAnalytics|Avg/Month:"
msgstr "Ð’ Ñередньому за міÑÑць:"
msgid "IssuesAnalytics|Issues created"
-msgstr ""
+msgstr "Створені задачі"
msgid "IssuesAnalytics|Issues created per month"
-msgstr ""
+msgstr "Створені задачі за міÑÑць"
msgid "IssuesAnalytics|Last 12 months"
msgstr "ОÑтанні 12 міÑÑців"
@@ -20923,10 +21456,13 @@ msgstr "Ітерацію оновлено"
msgid "Iterations"
msgstr "Ітерації"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20941,12 +21477,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr "Створити ітерацію"
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20956,6 +21486,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "ТриваліÑÑ‚ÑŒ"
@@ -20977,7 +21510,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20995,6 +21534,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -21004,10 +21546,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -21019,6 +21567,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr "Обрати дату початку"
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr "Дата початку"
@@ -21031,6 +21582,9 @@ msgstr "Ð†Ñ‚ÐµÑ€Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ»Ð° видалена."
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -21286,9 +21840,6 @@ msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача або адреÑа електроннÐ
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr "ПереглÑнути задачі Jira в GitLab"
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -21301,6 +21852,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21364,6 +21918,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr "Створити файл конфігурації CI/CD"
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21373,6 +21930,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr "Ðемає завдань Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21398,20 +21961,29 @@ msgid "Job|Browse"
msgstr "ПереглÑнути"
msgid "Job|Cancel"
+msgstr "СкаÑувати"
+
+msgid "Job|Canceled"
msgstr ""
msgid "Job|Complete Raw"
msgstr "Повний неформатований"
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "Завантажити"
msgid "Job|Erase job log and artifacts"
msgstr ""
-msgid "Job|Finished at"
+msgid "Job|Failed"
msgstr ""
+msgid "Job|Finished at"
+msgstr "Завершено о"
+
msgid "Job|Job artifacts"
msgstr "Ðртефакти завдань"
@@ -21424,7 +21996,25 @@ msgstr ""
msgid "Job|Keep"
msgstr "Залишити"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
+msgstr "Повторити"
+
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
msgstr ""
msgid "Job|Scroll to bottom"
@@ -21436,9 +22026,12 @@ msgstr "Прокрутити вгору"
msgid "Job|Show complete raw"
msgstr "Показати повний неформатований"
-msgid "Job|Status"
+msgid "Job|Skipped"
msgstr ""
+msgid "Job|Status"
+msgstr "СтатуÑ"
+
msgid "Job|The artifacts were removed"
msgstr "Ðртефакти були видалені"
@@ -21460,6 +22053,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21717,7 +22313,7 @@ msgstr[2] "ОÑтанніх %d днів"
msgstr[3] "ОÑтанніх %d днів"
msgid "Last %{days} days"
-msgstr ""
+msgstr "ОÑтанні %{days} днів"
msgid "Last 2 weeks"
msgstr "ОÑтанні 2 тижні"
@@ -21735,7 +22331,7 @@ msgid "Last Accessed On"
msgstr ""
msgid "Last Activity"
-msgstr ""
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–ÑÑ‚ÑŒ"
msgid "Last Name"
msgstr "Прізвище"
@@ -21821,6 +22417,9 @@ msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ñпроба оновленнÑ"
msgid "Last updated"
msgstr "ВоÑтаннє оновленно"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr "ВоÑтаннє викориÑтано"
@@ -21900,7 +22499,7 @@ msgid "Learn more about Auto DevOps"
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Auto DevOps"
msgid "Learn more about GitLab"
-msgstr ""
+msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про GitLab"
msgid "Learn more about Needs relationships"
msgstr ""
@@ -21929,6 +22528,12 @@ msgstr "Докладніше про шаблони проєктів на рівÐ
msgid "Learn more about groups."
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про групи."
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -22070,6 +22675,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr "Let's Encrypt не приймає Ð°Ð´Ñ€ÐµÑ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти з example.com"
@@ -22082,6 +22690,9 @@ msgstr "Давайте поговоримо!"
msgid "License Compliance"
msgstr "ВідповідніÑÑ‚ÑŒ ліцензіÑм"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -22100,6 +22711,9 @@ msgstr "%{docLinkStart}Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ—%{docLinkEnd} а
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr "%{docLinkStart}Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ—%{docLinkEnd} неактивні"
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr "ПрийнÑтна Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² проєкті"
@@ -22127,9 +22741,6 @@ msgstr "Заборонити запит на злиттÑ, Ñкщо його бÑ
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про %{linkStart}Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ—%{linkEnd}"
-msgid "LicenseCompliance|License Approvals"
-msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ—"
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -22172,6 +22783,13 @@ msgstr[1] "Служба ВідповідноÑÑ‚Ñ– Ліцензій виÑвил
msgstr[2] "Служба ВідповідноÑÑ‚Ñ– Ліцензій виÑвила %d нових ліцензій Ñ– Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸; необхідне затвердженнÑ"
msgstr[3] "Служба ВідповідноÑÑ‚Ñ– Ліцензій виÑвила %d нових ліцензій Ñ– Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸; необхідне затвердженнÑ"
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr "ВідповідніÑÑ‚ÑŒ ЛіцензіÑм не виÑвила ліцензій лише Ð´Ð»Ñ Ð³Ñ–Ð»ÐºÐ¸ джерела"
@@ -22181,6 +22799,12 @@ msgstr "ВідповідніÑÑ‚ÑŒ ЛіцензіÑм не виÑвила нов
msgid "LicenseCompliance|License name"
msgstr "Ðазва ліцензії"
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr "Видалити ліцензію"
@@ -22196,6 +22820,12 @@ msgstr "Ðаразі немає політик, Ñкі б відповідали
msgid "LicenseCompliance|This license already exists in this project."
msgstr "Така Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Ð²Ð¶Ðµ Ñ–Ñнує в цьому проєкті."
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ ліцензію %{name} із цього проєкту."
@@ -22317,7 +22947,7 @@ msgid "Link"
msgstr "ПоÑиланнÑ"
msgid "Link (optional)"
-msgstr ""
+msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ (необов'Ñзково)"
msgid "Link Prometheus monitoring to GitLab."
msgstr ""
@@ -22385,9 +23015,6 @@ msgstr "СпиÑок доÑтупних репозиторіїв"
msgid "List of all merge commits"
msgstr "СпиÑок уÑÑ–Ñ… комітів злиттÑ"
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22602,7 +23229,7 @@ msgid "Made this issue confidential."
msgstr "Цю задачу зроблено конфіденційною."
msgid "Mailgun"
-msgstr ""
+msgstr "Mailgun"
msgid "Mailgun HTTP webhook signing key"
msgstr ""
@@ -22661,6 +23288,9 @@ msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ°Ð¼Ð¸ групи"
msgid "Manage labels"
msgstr "Керувати мітками"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÐµÑ‚Ð°Ð¿Ð°Ð¼Ð¸"
@@ -22694,6 +23324,9 @@ msgstr ""
msgid "Manual"
msgstr "Вручну"
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ порÑдок задач"
@@ -22773,7 +23406,7 @@ msgid "Marked as draft. Can only be merged when marked as ready."
msgstr ""
msgid "Marked as ready. Merging is now allowed."
-msgstr ""
+msgstr "Позначено Ñк готове. Тепер Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾."
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -22856,11 +23489,14 @@ msgstr "МакÑимальний розмір файлу 200 KB."
msgid "Max role"
msgstr "МакÑимальна роль"
-msgid "Max session time"
+msgid "Max seats used"
msgstr ""
+msgid "Max session time"
+msgstr "МакÑимальний Ñ‡Ð°Ñ ÑеанÑу"
+
msgid "Maximum 20 characters"
-msgstr ""
+msgstr "МакÑимум 20 Ñимволів"
msgid "Maximum Conan package file size in bytes"
msgstr ""
@@ -22932,7 +23568,7 @@ msgid "Maximum duration of a session."
msgstr ""
msgid "Maximum field length"
-msgstr ""
+msgstr "МакÑимальна довжина полÑ"
msgid "Maximum file size indexed (KiB)"
msgstr ""
@@ -22976,9 +23612,6 @@ msgstr "МакÑимальний Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ"
msgid "Maximum job timeout has a value which could not be accepted"
msgstr "МакÑимальний Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ має недопуÑтиме значеннÑ"
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -23000,6 +23633,12 @@ msgstr "МакÑимальна кількіÑÑ‚ÑŒ дзеркал, що можуÑ
msgid "Maximum number of projects."
msgstr "МакÑимальна кількіÑÑ‚ÑŒ проєктів."
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -23010,7 +23649,7 @@ msgid "Maximum page reached"
msgstr ""
msgid "Maximum page size"
-msgstr ""
+msgstr "МакÑимальний розмір Ñторінки"
msgid "Maximum project export download requests per minute"
msgstr ""
@@ -23076,7 +23715,7 @@ msgid "May"
msgstr "травень"
msgid "Mean time to merge"
-msgstr ""
+msgstr "Середній Ñ‡Ð°Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ"
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
@@ -23239,9 +23878,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -23278,7 +23914,7 @@ msgstr "Запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¾Ð±'єднано"
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -23353,7 +23989,7 @@ msgstr "Запити на злиттÑ"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "Запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ â€” це ÑпоÑіб запропонувати Ñвої зміни до проєкту Ñ– обговорити Ñ—Ñ… із іншими"
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23486,7 +24122,7 @@ msgid "MergeRequest|Approved by @%{username}"
msgstr ""
msgid "MergeRequest|Can't show this merge request because of an internal error. Contact your administrator."
-msgstr ""
+msgstr "Ðе вдаєтьÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚Ð¸ цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‡ÐµÑ€ÐµÐ· внутрішню помилку. ЗвернітьÑÑ Ð´Ð¾ Ñвого адмініÑтратора."
msgid "MergeRequest|Can't show this merge request because the fork project was deleted."
msgstr ""
@@ -23528,7 +24164,7 @@ msgid "Merged this merge request."
msgstr ""
msgid "Merged: %{merged}"
-msgstr ""
+msgstr "Об'єднано: %{merged}"
msgid "Merges this merge request immediately."
msgstr ""
@@ -23909,9 +24545,6 @@ msgstr "напр. зап/Ñек"
msgid "Mi"
msgstr "Мі"
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr "ПеренеÑено %{success_count}/%{total_count} файлів."
@@ -24033,6 +24666,9 @@ msgstr "Закрити етап"
msgid "Milestones|Completed Issues (closed)"
msgstr "Виконані задачі (закриті)"
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "Видалити етап"
@@ -24051,6 +24687,9 @@ msgstr "Етап %{milestoneTitle} не знайдено"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -24069,12 +24708,21 @@ msgstr "ПеренеÑÐµÐ½Ð½Ñ %{milestoneTitle} на рівень групи з
msgid "Milestones|Reopen Milestone"
msgstr "Повторно відкрити етап"
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "Цю дію не можна ÑкаÑувати."
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr "Мінімальна доÑтупна пропуÑкна здатніÑÑ‚ÑŒ необхідна Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку попередньої Ñинхронізації дзеркал."
@@ -24192,6 +24840,9 @@ msgstr "МіÑÑць"
msgid "Months"
msgstr "МіÑÑці"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr "Більше інформації"
@@ -24223,7 +24874,7 @@ msgid "More topics"
msgstr "Більше тем"
msgid "Most relevant"
-msgstr ""
+msgstr "Ðайбільш актуальні"
msgid "Most stars"
msgstr "Ðайбільше в обраних"
@@ -24288,16 +24939,16 @@ msgstr "Повторно розгорнути"
msgid "MrDeploymentActions|Stop environment"
msgstr "Зупинити Ñередовище"
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24406,6 +25057,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24431,7 +25109,7 @@ msgid "Navigate to the project to close the milestone."
msgstr "Перейдіть до проєкту, щоб закрити етап."
msgid "Navigation bar"
-msgstr ""
+msgstr "Панель навігації"
msgid "NavigationTheme|Blue"
msgstr "Синій"
@@ -24481,6 +25159,9 @@ msgstr "Вийти Ñ– зайти під іншим обліковим запиÑ
msgid "Need help?"
msgstr "Потрібна допомога?"
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24500,7 +25181,7 @@ msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart
msgstr ""
msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
+msgstr "%{labelStart}та%{labelEnd} %{spanStart}надÑилають Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ GitLab.%{spanEnd}"
msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
msgstr ""
@@ -24608,7 +25289,7 @@ msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
+msgstr "Щоб увімкнути попередженнÑ, %{installLinkStart}Ñпочатку вÑтановіть агента%{installLinkEnd}."
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -24667,9 +25348,6 @@ msgstr "Ðіколи"
msgid "New"
msgstr "Ðовий"
-msgid "New %{issueType}"
-msgstr "Ðовий %{issueType}"
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24764,6 +25442,9 @@ msgstr "Ðовий каталог"
msgid "New discussion"
msgstr "Ðова диÑкуÑÑ–Ñ"
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr "Ðове Ñередовище"
@@ -24839,6 +25520,9 @@ msgstr "Ðовий проєкт/репозиторій"
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr "Ðовий реліз"
@@ -24854,9 +25538,6 @@ msgstr "Згенеровано новий реєÑтраційний токен
msgid "New schedule"
msgstr "Ðовий Розклад"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "Ðовий Ñніпет"
@@ -24900,9 +25581,12 @@ msgid "Next file in diff"
msgstr ""
msgid "Next scan"
-msgstr ""
+msgstr "ÐаÑтупне ÑкануваннÑ"
msgid "Next unresolved discussion"
+msgstr "ÐаÑтупне невирішене обговореннÑ"
+
+msgid "Next update"
msgstr ""
msgid "Nickname"
@@ -24918,7 +25602,7 @@ msgid "No %{providerTitle} repositories found"
msgstr "Ðе знайдено репозиторіїв %{providerTitle}"
msgid "No CSV data to display."
-msgstr ""
+msgstr "Ðемає даних CSV Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ."
msgid "No Epic"
msgstr "Ðемає епіка"
@@ -24953,6 +25637,9 @@ msgstr ""
msgid "No assignee"
msgstr "Ðемає виконавцÑ"
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr "Методи автентифікації не налаштовано."
@@ -24980,12 +25667,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -25064,9 +25745,6 @@ msgstr "Проблем не знайдено"
msgid "No iteration"
msgstr "Ðемає ітерації"
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr "Ðемає ітерацій Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ"
@@ -25088,7 +25766,7 @@ msgstr "Ðемає ліцензії. Ð’ÑÑ– права захищені"
msgid "No matches found"
msgstr "Збігів не знайдено"
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -25121,9 +25799,6 @@ msgstr "Ðемає повідомлень у журналі"
msgid "No milestone"
msgstr "Етап відÑутній"
-msgid "No milestones to show"
-msgstr "Ðемає етапів Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ"
-
msgid "No namespace"
msgstr "Ðемає проÑтору імен"
@@ -25205,6 +25880,9 @@ msgstr "Ðіхто з тих, хто додав в обране не задовÑ
msgid "No start date"
msgstr "Ðемає дати початку"
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -25362,6 +26040,9 @@ msgstr "Показати лише Ñ–Ñторію"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr "Цей коментар було змінено піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк ви його почали редагувати. Будь лаÑка, переглÑньте %{open_link}оновлений коментар%{close_link}, щоб переконатиÑÑ Ð² тому, що інформацію не було втрачено"
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25810,10 +26491,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25961,6 +26642,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Тільки адмініÑтратори можуть видалÑти проєкт"
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25979,9 +26663,6 @@ msgstr "Продовжуйте тільки Ñкщо ви довірÑєте %{i
msgid "Only project members can comment."
msgstr "Тільки учаÑники проєкту можуть залишати коментарі."
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr "Лише учаÑника проєкту будуть імпортовані. УчаÑники групи будуть пропущені."
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -26012,12 +26693,12 @@ msgstr "Відкрито"
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 ""
-
msgid "Open errors"
msgstr "Відкрити помилки"
+msgid "Open in Gitpod"
+msgstr ""
+
msgid "Open in Web IDE"
msgstr ""
@@ -26030,9 +26711,6 @@ msgstr "Відкрити у вашому IDE"
msgid "Open raw"
msgstr "Відкрити в неформатованому виглÑді"
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr "Розгорніть бічну панель"
@@ -26060,6 +26738,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr "ВідкриваєтьÑÑ Ñƒ новому вікні"
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð°ÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾. Перевірте журнал pod'а %{pod_name} Ð´Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆ детальної інформації."
@@ -26201,6 +26882,9 @@ msgstr "ВлаÑник:"
msgid "Owner"
msgstr "ВлаÑник"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26970,6 +27654,9 @@ msgstr "URL-адреÑа Ñерверу Phabricator"
msgid "Phabricator Tasks"
msgstr "Задачі Phabricator"
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr "Виберіть ім'Ñ"
@@ -27246,6 +27933,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "Конвеєри"
@@ -27255,12 +27945,15 @@ msgstr "СтатиÑтика конвеєрів"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð² Ð´Ð»Ñ \"%{project_name}\" уÑпішно оновлено."
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
msgid "Pipelines|API"
msgstr "API"
-msgid "Pipelines|Add a code quality job"
-msgstr "Додати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÑкоÑÑ‚Ñ– коду"
-
msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr "Ви впевнені, що хочете запуÑтити цей конвеєр?"
@@ -27306,7 +27999,7 @@ msgstr "Редагувати"
msgid "Pipelines|Editor"
msgstr "Редактор"
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -27315,13 +28008,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -27330,8 +28023,8 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr "ОÑтанній викориÑтаний"
-msgid "Pipelines|Learn about Runners"
-msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Runner'ів"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
+msgstr ""
msgid "Pipelines|Lint"
msgstr ""
@@ -27348,6 +28041,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr "Більше інформації"
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -27360,9 +28056,15 @@ msgstr "Редактор Конвеєрів"
msgid "Pipelines|Project cache successfully reset."
msgstr "Кеш проєкту уÑпішно очищено."
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "Помилка при очищенні кеша runner'ів."
@@ -27417,22 +28119,16 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "Цей проєкт в даний Ñ‡Ð°Ñ Ð½Ðµ налаштований Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку конвеєрів."
-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 "Токен"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
-msgstr "ВикориÑтовувати шаблон CI/CD"
-
-msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
+msgid "Pipelines|Try test template"
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
+msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
@@ -27492,9 +28188,6 @@ msgstr "Перевірка ÑтатуÑу конвеєра"
msgid "Pipeline|Checking pipeline status."
msgstr "Перевірка ÑтатуÑу конвеєра."
-msgid "Pipeline|Commit"
-msgstr "Коміт"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°. Ð”Ð»Ñ ÑƒÑÑƒÐ½ÐµÐ½Ð½Ñ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´Ð¾Ðº, прочитайте %{linkStart}документацію%{linkEnd}."
@@ -27510,9 +28203,6 @@ msgstr "Дата"
msgid "Pipeline|Detached merge request pipeline"
msgstr "Відділений конвеєр запиту на злиттÑ"
-msgid "Pipeline|Duration"
-msgstr "ТриваліÑÑ‚ÑŒ"
-
msgid "Pipeline|Failed"
msgstr "Ðевдало"
@@ -27846,9 +28536,6 @@ msgstr "Будь лаÑка, виберіть файл"
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr "Будь лаÑка, оберіть групу."
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27903,7 +28590,7 @@ msgstr "Pod не знайдено"
msgid "Pods in use"
msgstr "Pod’и у викориÑтанні"
-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."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27948,7 +28635,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27991,7 +28678,7 @@ msgid "Preferences|Failed to save preferences."
msgstr ""
msgid "Preferences|For example: 30 minutes ago."
-msgstr ""
+msgstr "Ðаприклад: 30 хвилин тому."
msgid "Preferences|Gitpod"
msgstr "Gitpod"
@@ -28056,6 +28743,9 @@ msgstr "ВикориÑтовувати відноÑний чаÑ"
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr "Ðазад"
@@ -28365,6 +29055,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28386,9 +29079,6 @@ msgstr "Повне ім'Ñ"
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28425,6 +29115,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28530,6 +29223,9 @@ msgstr "Ð¦Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ´Ðµ відображатиÑÑ Ñƒ вашÐ
msgid "Profiles|Time settings"
msgstr "Параметри чаÑу"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "Двофакторна автентифікаціÑ"
@@ -28611,9 +29307,6 @@ msgstr "Ваше Ñ–Ð¼â€™Ñ Ð±ÑƒÐ»Ð¾ автоматично вÑтановленÐ
msgid "Profiles|Your status"
msgstr "Ваш ÑтатуÑ"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "наприклад, мій ключ MacBook"
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -29118,7 +29811,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr "Кожен проєкт може мати влаÑний проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñвоїх образів Docker"
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -29217,6 +29910,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29388,6 +30084,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29451,6 +30150,9 @@ msgstr "Pages/Hugo"
msgid "ProjectTemplates|Pages/Jekyll"
msgstr "Pages/Jekyll"
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Pages/проÑтий HTML"
@@ -29469,9 +30171,6 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29616,6 +30315,12 @@ msgstr "Мігрувати Ñвої дані із зовнішнього джеÑ
msgid "ProjectsNew|No import options available"
msgstr "Варіанти імпорту не доÑтупні"
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -30225,7 +30930,10 @@ msgstr "Події Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ (push)"
msgid "Push project from command line"
msgstr "Виконати push проєкту за допомогою командного Ñ€Ñдка"
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30554,7 +31262,7 @@ msgid "Regex pattern"
msgstr "Шаблон у виглÑді регулÑрного виразу"
msgid "Region"
-msgstr ""
+msgstr "Регіон"
msgid "Regions"
msgstr ""
@@ -30658,9 +31366,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr "Відхилено (закрито)"
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30670,9 +31384,6 @@ msgstr "ПовʼÑзані задачі"
msgid "Related merge requests"
msgstr "Пов'Ñзані запити на злиттÑ"
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr "ВідноÑитьÑÑ Ð´Ð¾"
@@ -30905,6 +31616,9 @@ msgstr "Видалити витрачений чаÑ"
msgid "Remove time estimate"
msgstr "Видалити запланований чаÑ"
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -31115,7 +31829,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr "Повідомити адмініÑтратора про порушеннÑ"
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -31207,12 +31924,18 @@ msgstr "Помилка"
msgid "Reports|Filename"
msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr "Звіти по метрикам завантажуютьÑÑ"
@@ -31225,6 +31948,12 @@ msgstr "Звіти по метрикам не змінилиÑÑ"
msgid "Reports|Metrics reports failed loading results"
msgstr "Помилка при завантаженні результатів Ð´Ð»Ñ Ð·Ð²Ñ–Ñ‚Ñ–Ð² по метрикам"
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31240,9 +31969,15 @@ msgstr "ТеÑтовий звіт"
msgid "Reports|Test summary failed loading results"
msgstr "Помилка при завантаженні результатів Ð´Ð»Ñ Ñ‚ÐµÑтового звіту"
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "Результати Ð´Ð»Ñ Ñ‚ÐµÑтового звіту оброблÑÑŽÑ‚ÑŒÑÑ"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr "ІнÑтрумент"
@@ -31759,7 +32494,7 @@ msgstr "ПереглÑнути зміни"
msgid "Review requests for you"
msgstr "ПереглÑньте запити Ð´Ð»Ñ Ð²Ð°Ñ"
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31823,9 +32558,6 @@ msgstr "додаваннÑ"
msgid "RightSidebar|deleting the"
msgstr "видаленнÑ"
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr "План-графік"
@@ -31877,10 +32609,10 @@ msgstr "Виконати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÐµÐ· тегів"
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31901,6 +32633,26 @@ msgstr "ДоÑтупні Runner'и: %{active_runners_count}"
msgid "Runners page."
msgstr "Сторінка Runner'ів."
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr "Ðктивні"
@@ -31910,7 +32662,7 @@ msgstr "Ð’ÑÑ–"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31937,9 +32689,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31952,12 +32716,22 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr "Скопіювати токен Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації"
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31967,6 +32741,9 @@ msgstr "ОпиÑ"
msgid "Runners|Details"
msgstr "Деталі"
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr "Завантажити та вÑтановити бінарний файл"
@@ -31976,18 +32753,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr "Група"
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 ""
-
msgid "Runners|Install a runner"
msgstr "Ð’Ñтановити runner"
@@ -31995,7 +32766,7 @@ msgid "Runners|Instance"
msgstr "ІнÑтанÑ"
msgid "Runners|Jobs"
-msgstr ""
+msgstr "ЗавданнÑ"
msgid "Runners|Last contact"
msgstr "ОÑтанній контакт"
@@ -32009,25 +32780,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr "Ім'Ñ"
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -32036,15 +32813,31 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr "Платформа"
@@ -32078,9 +32871,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr "ВерÑÑ–Ñ"
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -32093,21 +32892,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -32117,7 +32946,7 @@ msgstr "Runner'и"
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -32138,6 +32967,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr "СтатуÑ"
@@ -32147,16 +32979,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr "Теги"
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -32174,7 +33009,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -32192,7 +33027,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -32201,9 +33036,6 @@ 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 "Ви викориÑтали %{quotaUsed} із ваших %{quotaLimit} хвилин Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð² загальних runner'ів."
@@ -32237,9 +33069,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "ВиконуєтьÑÑ"
@@ -32354,10 +33183,10 @@ msgstr "ЗбереженнÑ"
msgid "Saving project."
msgstr "Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ."
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32549,6 +33378,9 @@ msgstr "Пошук проєктів"
msgid "Search projects..."
msgstr "Пошук проєктів..."
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32695,6 +33527,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32719,6 +33554,15 @@ msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ñекретів"
msgid "Secret token"
msgstr "Секретний токен"
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32845,16 +33689,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32911,6 +33758,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32926,6 +33779,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32941,12 +33800,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32956,6 +33824,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32968,9 +33839,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr "Мережа"
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr "Ðова політика"
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33019,6 +33902,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr "Правила"
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -33037,12 +33923,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -33061,6 +33956,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -33070,10 +33968,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr "СтатуÑ"
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -33097,6 +33998,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -33181,6 +34091,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr "Змінити ÑтатуÑ"
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "Коментар додано до \"%{vulnerabilityName}\""
@@ -33322,6 +34235,9 @@ msgstr "Додані проєкти"
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -33346,7 +34262,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr "Рівень"
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -33358,16 +34274,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr "СтатуÑ"
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33427,6 +34346,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr "Звіт про вразливоÑÑ‚Ñ–"
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33439,15 +34361,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33484,15 +34409,12 @@ msgstr "Вибрати Ñторінку"
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr "Ð”Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ виберіть його в лівій бічній панелі. Пізніше ви будете мати можливіÑÑ‚ÑŒ закомітити Ñвої зміни."
-msgid "Select a group to invite"
-msgstr "Виберіть групу Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ"
-
msgid "Select a label"
msgstr "Вибрати мітку"
@@ -33631,6 +34553,9 @@ msgstr "Виберіть підпиÑку"
msgid "Select target branch"
msgstr "Вибір цільової гілки"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr "Обрати чаÑовий поÑÑ"
@@ -33967,6 +34892,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -34012,6 +34940,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr "Ð’Ñтановити запланований чаÑ"
@@ -34057,9 +34988,6 @@ msgstr "Ð’Ñтановити вагу %{weight}."
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr "Додати Ñмайлик-ÑтатуÑ"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34316,6 +35244,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr "Показати зміни пробілів"
@@ -34485,6 +35416,9 @@ msgstr ""
msgid "Signed in"
msgstr "Вхід виконано"
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34656,6 +35590,9 @@ msgstr "Snowplow"
msgid "Solution"
msgstr "РішеннÑ"
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34665,6 +35602,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr "ХтоÑÑŒ редагував цю задачу в одночаÑно із вами. Будь лаÑка, ознайомтеÑÑ Ñ–Ð· %{linkStart}нею%{linkEnd} Ñ– переконайтеÑÑ, ваші зміни не затруть зміни інших."
@@ -34704,9 +35644,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr "Помилка при перемиканні кнопки"
-
msgid "Something went wrong while adding your award. Please try again."
msgstr "Проблема при додаванні вашої нагороди. Будь лаÑка, Ñпробуйте знову."
@@ -34839,9 +35776,6 @@ msgstr "ЩоÑÑŒ пішо не так під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼Ð¾Ð
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑків"
@@ -35265,6 +36199,9 @@ msgstr "Дата початку"
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr "Створити ланцюжок змін"
@@ -35409,6 +36346,9 @@ msgstr "СтатуÑ:"
msgid "Status: %{title}"
msgstr "СтатуÑ: %{title}"
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35481,9 +36421,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35532,6 +36469,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr "Будьте в курÑÑ– продуктивноÑÑ‚Ñ– та Ñтану вашого Ñередовища шлÑхом Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Prometheus Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ ваших розгортань."
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr "Крок 1."
@@ -35697,10 +36637,10 @@ msgstr "ПідпиÑку уÑпішно Ñтворено."
msgid "Subscription successfully deleted."
msgstr "ПідпиÑку уÑпішно видалено."
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -36081,8 +37021,12 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -36225,12 +37169,6 @@ msgstr ""
msgid "System Info"
msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ ÑиÑтему"
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr "СиÑтемне Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм (%{default})"
@@ -36387,6 +37325,12 @@ msgstr ""
msgid "Target branch"
msgstr "Цільова гілка"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr "Цільова гілка"
@@ -36420,9 +37364,6 @@ msgstr ""
msgid "Telephone number"
msgstr "Ðомер телефону"
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr "Шаблон"
@@ -36847,9 +37788,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36880,6 +37818,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36892,6 +37833,9 @@ msgstr "Ð¦Ñ Ð³Ñ–Ð»ÐºÐ° Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту не має активÐ
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "ПідÑвітка Ñимволів дозволÑÑ” обмежувати заголовок до %{titleLength} Ñимволів Ñ– обмежувати довжину Ñ€Ñдків тіла %{bodyLength} Ñимволами Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб вони залишаютьÑÑ Ñ‡Ð¸Ñ‚Ð°Ð±ÐµÐ»ÑŒÐ½Ð¸Ð¼Ð¸ в git."
@@ -36913,12 +37857,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "Ð—â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ припинено піÑÐ»Ñ %{timeout}. Ð”Ð»Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð², Ñким потрібно більше чаÑу, викориÑтовуйте комбінацію clone/push."
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr "ВміÑÑ‚ цієї Ñторінки не закодований в UTF-8. Зміни можна вноÑити лише через репозиторій Git."
@@ -37214,6 +38164,9 @@ msgstr "Проєкт уÑпішно імпортовано."
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -37223,6 +38176,12 @@ msgstr "Віддалене дзеркало зайнÑло забагато ча
msgid "The remote repository is being updated..."
msgstr "Віддалений репозиторій в процеÑÑ– оновленнÑ..."
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -37244,6 +38203,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr "ДоÑтуп до Ñніпета можливий без будь-Ñкої автентифікації."
@@ -37256,6 +38218,9 @@ msgstr "Цей Ñніпет видимий тільки Ð´Ð»Ñ ÑƒÑ‡Ð°ÑникіÐ
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr "Вказана вкладка недійÑна. Будь лаÑка, виберіть іншу"
@@ -37541,9 +38506,6 @@ 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 ""
@@ -37685,6 +38647,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37697,7 +38662,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37724,7 +38689,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37733,7 +38698,7 @@ msgstr "Ð¦Ñ Ð´Ñ–Ñ Ð¼Ð¾Ð¶Ðµ призвеÑти до втрати даних. Щ
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37820,6 +38785,12 @@ msgstr ""
msgid "This credential has expired"
msgstr "Термін дії цих облікових даних закінчивÑÑ"
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr "Цей приÑтрій уже зареєÑтровано на нашій Ñтороні."
@@ -37847,6 +38818,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37973,9 +38947,15 @@ msgstr "Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ від інших завдань
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr "Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ від попередніх, Ñкі повинні завершитиÑÑ ÑƒÑпішно Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ запуÑку"
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr "Лог Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñутній."
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ відмінене"
@@ -38213,6 +39193,9 @@ msgstr "Це підпиÑка длÑ"
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Цей кориÑтувач не може бути розблокований вручну в GitLab"
@@ -38689,6 +39672,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr "Щоб додати Ð·Ð°Ð¿Ð¸Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ, надайте наÑтупні відомоÑÑ‚Ñ– заÑтоÑунку у вашому телефоні."
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38770,6 +39756,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38788,7 +39777,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½ÑŒ від ÑервіÑів Prometheus, Ñкі Ñконфігуровані вручну, додайте наÑтупний URL та ключ авторизаціх до вашого конфігураційного файлу веб-хуків Prometheus. ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про %{linkStart}ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€ÑƒÐ²Ð°Ð½Ñ Prometheus%{linkEnd} Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб відправлÑти Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ñ–Ð· Gitlab."
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38938,9 +39927,6 @@ msgstr "Перемикач бічної панелі"
msgid "Toggle the Performance Bar"
msgstr "Увімкнути/вимкнути панель продуктивноÑÑ‚Ñ–"
-msgid "Toggle thread"
-msgstr "Закрити/відкрити обговореннÑ"
-
msgid "Toggled :%{name}: emoji award."
msgstr "Увімкнено/вимкнено :%{name}: Ñмайлик-винагороду."
@@ -38986,6 +39972,9 @@ msgstr ""
msgid "Topic avatar"
msgstr "Іконка теми"
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr "Ðазва теми"
@@ -39079,6 +40068,9 @@ msgstr "Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ шлÑÑ… тому що в цій гр
msgid "TransferGroup|Database is not supported."
msgstr "База даних не підтримуєтьÑÑ."
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr "Група міÑтить проєкти з пакетами NPM."
@@ -39268,6 +40260,9 @@ msgstr "Спробуйте ще раз"
msgid "Try again?"
msgstr "Спробуйте ще раз?"
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "Спробуйте вÑÑ– функції GitLab протÑгом 30 днів."
@@ -39472,6 +40467,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39508,6 +40506,9 @@ msgstr "Ðеможливо оновити цей епік в даний моме
msgid "Unable to update this issue at this time."
msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ цю задачу зараз."
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39634,6 +40635,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39814,9 +40818,6 @@ msgstr "Завантажити CSV файл"
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr "Завантажити ліцензію"
-
msgid "Upload New File"
msgstr "ÐадіÑлати новий файл"
@@ -39835,9 +40836,6 @@ msgstr "ÐадіÑлати файл"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr "Завантажити новий файл"
@@ -39847,6 +40845,9 @@ msgstr "Завантажити файл відповідноÑÑ‚Ñ– об’єкт
msgid "UploadLink|click to upload"
msgstr "ÐатиÑніть, щоб надіÑлати"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ до терміналу"
@@ -39904,7 +40905,7 @@ msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð° поточний період"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -40141,6 +41142,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -40150,6 +41154,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40963,9 +41970,6 @@ msgstr "ПереглÑд заміненого файлу @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40990,6 +41994,9 @@ msgstr ""
msgid "Viewing commit"
msgstr "ПереглÑд коміту"
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -41095,9 +42102,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr "Змінити ÑтатуÑ"
@@ -41119,6 +42123,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -41239,6 +42246,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr "КлаÑ"
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -41335,9 +42345,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -41383,6 +42390,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr "Зачекайте Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¹Ð¾Ð³Ð¾ вміÑту"
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -41404,6 +42414,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41704,6 +42717,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr "Сайт:"
@@ -41749,9 +42765,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr "Що ви шукаєте?"
-
msgid "What does this command do?"
msgstr "Що робить Ñ†Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°?"
@@ -41794,13 +42807,13 @@ msgstr "Коли runner закріплений (за проєктами), йог
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41819,6 +42832,9 @@ msgstr[3] "Коли ці запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¸Ð¹Ð½Ñто"
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr "Коли:"
@@ -41966,9 +42982,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr "СкаÑувати"
@@ -41993,12 +43006,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr "Формат"
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr "Продовжити редагуваннÑ"
-
msgid "WikiPage|Learn more."
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ."
@@ -42011,18 +43018,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -42035,18 +43030,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "Ðапишіть текÑÑ‚ або перетÑгніть файли Ñюди…"
@@ -42122,6 +43108,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr "Ðове завданнÑ"
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -42131,6 +43120,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -42341,6 +43333,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr "Ви завжди можете відредагувати це пізніше"
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -42434,6 +43432,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr "Ви можете редагувати файли, лише перебуваючи у ÑкійÑÑŒ гілці"
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr "Ви можете переміщувати проєкт тільки в проÑтори імен, Ñкими ви керуєте."
@@ -42464,6 +43465,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr "Ви не можете отримати доÑтуп до неформатованого файлу. Будь лаÑка, зачекайте хвилину."
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42548,6 +43552,9 @@ msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” жодних доÑтупних проєктів."
msgid "You don't have any recent searches"
msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” недавніх пошуків"
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr "У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав, щоб виконати цю дію."
@@ -42630,10 +43637,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42813,6 +43820,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42825,6 +43835,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -43116,7 +44129,7 @@ msgstr "Термін дії вашої підпиÑки закінчивÑÑ!"
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -43212,10 +44225,10 @@ msgid "access:"
msgstr "доÑтуп:"
msgid "added"
-msgstr ""
+msgstr "додано"
msgid "added %{emails}"
-msgstr ""
+msgstr "додано %{emails}"
msgid "added a Zoom call to this issue"
msgstr "додано дзвінок Zoom до цієї задачі"
@@ -43301,7 +44314,7 @@ msgid "branch name"
msgstr "ім'Ñ Ð³Ñ–Ð»ÐºÐ¸"
msgid "builds"
-msgstr ""
+msgstr "збірки"
msgid "by"
msgstr "від"
@@ -43381,6 +44394,13 @@ msgstr "не може блокувати Ñам Ñебе"
msgid "cannot merge"
msgstr "не може виконувати злиттÑ"
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43478,6 +44498,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43556,6 +44585,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr "ДоÑлідити цю вразливіÑÑ‚ÑŒ, Ñтворивши задачу"
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43584,9 +44622,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñми"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "Ðемає змін у ÑкоÑÑ‚Ñ– коду"
@@ -43672,45 +44716,6 @@ msgstr "закрито"
msgid "closed issue"
msgstr "закрита задача"
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43729,7 +44734,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43839,6 +44844,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "увімкнено"
@@ -44181,6 +45189,13 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð°Ñ‚ÐµÐ¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ блоку"
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "запит на злиттÑ"
@@ -44210,7 +45225,7 @@ msgid "mrWidgetCommitsAdded|Adds %{commitCount} to %{targetBranch}."
msgstr ""
msgid "mrWidgetNothingToMerge|This merge request contains no changes."
-msgstr ""
+msgstr "Цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð½Ðµ міÑтить змін."
msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, 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 ""
@@ -44278,6 +45293,12 @@ msgstr "Затверджено вами"
msgid "mrWidget|Approved by you and others"
msgstr "Затверджено вами та іншими"
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr "СкаÑувати автоматичне злиттÑ"
@@ -44397,9 +45418,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð¾ невдало."
-msgid "mrWidget|Merge locally"
-msgstr "Злити локально"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr "ÐедоÑтупне: запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð¾Ñтупні лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· архівних проєктів."
@@ -44472,6 +45490,9 @@ msgstr "Запит на злиттÑ"
msgid "mrWidget|Resolve conflicts"
msgstr "Вирішити конфлікти"
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr "Ðнулювати"
@@ -44592,9 +45613,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr "н/д"
-
msgid "need attention"
msgstr "потребує уваги"
@@ -44655,6 +45673,9 @@ msgstr "відкрита задачу"
msgid "or"
msgstr "або"
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44666,10 +45687,10 @@ msgstr[2] "із %d теÑтів"
msgstr[3] "із %d теÑтів"
msgid "packages"
-msgstr ""
+msgstr "пакети"
msgid "pages"
-msgstr ""
+msgstr "Ñторінки"
msgid "parent"
msgid_plural "parents"
@@ -44752,9 +45773,6 @@ msgstr "токен доÑтупу до проєкту"
msgid "project access tokens"
msgstr "токени доÑтупу до проєкту"
-msgid "project avatar"
-msgstr "аватар проєкту"
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44813,7 +45831,7 @@ msgid "remove weight"
msgstr "видалити вагу"
msgid "removed"
-msgstr ""
+msgstr "видалено"
msgid "removed a Zoom call from this issue"
msgstr "видалено дзвінок Zoom із цієї задачі"
@@ -44829,13 +45847,13 @@ msgstr[2] "відповідей"
msgstr[3] "відповідей"
msgid "repositories"
-msgstr ""
+msgstr "репозиторії"
msgid "repository:"
msgstr "репозиторій:"
msgid "required"
-msgstr ""
+msgstr "обов'Ñзково"
msgid "satisfied"
msgstr "задоволено"
@@ -44957,9 +45975,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
@@ -45052,10 +46067,10 @@ msgstr ""
msgid "vulnerability"
msgid_plural "vulnerabilities"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "вразливіÑÑ‚ÑŒ"
+msgstr[1] "вразливоÑÑ‚Ñ–"
+msgstr[2] "вразливоÑтей"
+msgstr[3] "вразливоÑтей"
msgid "vulnerability|Add a comment"
msgstr "Додати коментар"
@@ -45070,7 +46085,7 @@ msgid "vulnerability|Add comment & dismiss"
msgstr "Додати коментар та відхилити"
msgid "vulnerability|Add comment and dismiss"
-msgstr ""
+msgstr "Додати коментар та відхилити"
msgid "vulnerability|Dismiss vulnerability"
msgstr "Відхилити вразливіÑÑ‚ÑŒ"
@@ -45112,5 +46127,5 @@ msgid "{project}"
msgstr "{project}"
msgid "✔"
-msgstr ""
+msgstr "✔"
diff --git a/locale/ur_PK/gitlab.po b/locale/ur_PK/gitlab.po
index f3bc4fc2e28..33e4fc9a548 100644
--- a/locale/ur_PK/gitlab.po
+++ b/locale/ur_PK/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: ur-PK\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:11\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/uz_UZ/gitlab.po b/locale/uz_UZ/gitlab.po
index 2b19d6ad5ce..898ac868397 100644
--- a/locale/uz_UZ/gitlab.po
+++ b/locale/uz_UZ/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: uz\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:41\n"
+"PO-Revision-Date: 2022-04-01 09:16\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -341,6 +335,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -356,6 +355,11 @@ msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
msgstr[1] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -371,8 +375,8 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgstr[1] ""
@@ -468,9 +472,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -702,6 +703,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -780,7 +784,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -789,9 +793,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -861,6 +862,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -992,10 +996,18 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1288,7 +1300,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1602,9 +1614,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1797,6 +1818,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1827,9 +1851,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1983,6 +2004,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -2040,6 +2064,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2163,6 +2190,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2391,6 +2421,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2472,6 +2505,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2484,6 +2520,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2496,6 +2535,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2580,12 +2622,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2625,6 +2673,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2640,6 +2709,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2655,6 +2727,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2664,9 +2742,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2676,6 +2751,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3582,7 +3660,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3696,6 +3774,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3750,6 +3831,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3993,6 +4077,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -4106,6 +4193,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4196,6 +4286,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4681,6 +4774,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4923,12 +5019,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -5017,6 +5107,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -5047,6 +5140,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -5068,6 +5164,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5428,9 +5572,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5452,6 +5593,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5542,6 +5686,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5766,6 +5916,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5781,6 +5934,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5790,24 +5946,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5870,6 +6041,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5974,6 +6148,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -6133,9 +6310,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6175,6 +6349,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6217,12 +6394,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6235,9 +6418,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6250,6 +6439,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6828,6 +7020,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6858,6 +7053,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -7021,6 +7222,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -7135,6 +7339,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7378,24 +7585,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7453,6 +7648,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7612,6 +7816,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7636,7 +7843,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7651,6 +7858,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7690,22 +7900,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7714,10 +7927,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7729,6 +7960,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7744,10 +7978,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7759,10 +7996,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7777,9 +8011,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7813,13 +8044,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7840,10 +8065,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7855,13 +8077,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7875,9 +8094,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7899,6 +8115,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7941,9 +8160,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -8052,10 +8268,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -8103,16 +8316,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8148,6 +8352,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8157,6 +8364,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8220,9 +8430,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8268,7 +8475,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8361,9 +8568,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8613,12 +8817,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8631,7 +8841,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8873,9 +9083,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -9002,6 +9209,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -9035,9 +9245,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -9062,6 +9269,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -9071,7 +9281,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -9083,12 +9293,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9197,6 +9419,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9242,6 +9467,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9251,6 +9479,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9320,6 +9551,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9441,9 +9678,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9501,7 +9735,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9596,6 +9830,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9635,6 +9872,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9944,6 +10184,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9980,6 +10223,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9995,9 +10244,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -10115,7 +10361,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10154,9 +10400,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10268,9 +10520,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10295,6 +10544,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10325,9 +10577,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10580,43 +10829,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10631,10 +10862,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10745,19 +10976,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10886,15 +11114,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10947,12 +11193,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10968,10 +11220,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -11118,6 +11370,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11172,9 +11427,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11420,6 +11672,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11549,9 +11804,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11570,9 +11822,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12215,6 +12464,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12277,6 +12553,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12926,6 +13205,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12983,6 +13265,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -13073,6 +13358,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13118,6 +13406,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13220,9 +13547,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13547,6 +13871,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13822,7 +14149,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13954,6 +14281,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13969,9 +14299,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -14053,7 +14380,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14425,6 +14755,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14434,6 +14770,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14673,6 +15012,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14685,6 +15027,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14805,6 +15150,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14934,9 +15282,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -15047,6 +15401,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15469,7 +15826,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15610,9 +15967,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15877,9 +16231,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15907,6 +16258,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15970,9 +16324,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16522,9 +16873,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16537,6 +16885,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16588,9 +16939,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16816,15 +17164,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16864,6 +17221,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16990,9 +17350,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -17002,6 +17359,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17206,9 +17599,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17611,13 +18001,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17740,6 +18130,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17758,9 +18151,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17881,6 +18271,109 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -18051,6 +18544,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18200,9 +18696,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18278,9 +18771,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18410,6 +18900,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18480,7 +18976,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18510,12 +19006,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18525,9 +19015,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18866,9 +19353,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18947,15 +19431,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19247,6 +19722,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19256,6 +19734,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19313,6 +19800,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19328,6 +19821,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19409,6 +19905,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19430,6 +19929,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19439,6 +19941,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19547,6 +20052,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19747,6 +20258,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19861,6 +20375,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19873,12 +20390,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -20026,9 +20549,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -20044,12 +20564,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20143,6 +20657,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -20161,6 +20678,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20173,6 +20696,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20365,9 +20891,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20410,7 +20933,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20581,10 +21104,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20599,12 +21125,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20614,6 +21134,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20635,7 +21158,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20653,6 +21182,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20662,10 +21194,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20677,6 +21215,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20689,6 +21230,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20944,9 +21488,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20959,6 +21500,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -21022,6 +21566,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21031,6 +21578,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21058,15 +21611,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -21082,9 +21644,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -21094,6 +21674,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -21118,6 +21701,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21477,6 +22063,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21585,6 +22174,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21726,6 +22321,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21738,6 +22336,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21756,6 +22357,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21783,9 +22387,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21816,6 +22417,11 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21825,6 +22431,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21840,6 +22452,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -22029,9 +22647,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22305,6 +22920,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22338,6 +22956,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22500,6 +23121,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22620,9 +23244,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22644,6 +23265,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22879,9 +23506,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22918,7 +23542,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22993,7 +23617,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23547,9 +24171,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23669,6 +24290,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23687,6 +24311,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23705,12 +24332,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23828,6 +24464,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23924,16 +24563,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -24040,6 +24679,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -24115,6 +24781,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24301,9 +24970,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24396,6 +25062,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24471,6 +25140,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24486,9 +25158,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24537,6 +25206,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24585,6 +25257,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24612,12 +25287,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24696,9 +25365,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24720,7 +25386,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24753,9 +25419,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24837,6 +25500,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24992,6 +25658,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25432,10 +26101,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25581,6 +26250,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25599,9 +26271,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25632,10 +26301,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25650,9 +26319,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25680,6 +26346,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25821,6 +26490,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26588,6 +27260,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26864,6 +27539,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26873,10 +27551,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26924,7 +27605,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26933,13 +27614,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26948,7 +27629,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26966,6 +27647,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26978,9 +27662,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -27035,24 +27725,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -27110,9 +27794,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -27128,9 +27809,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27464,9 +28142,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27521,7 +28196,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27566,7 +28241,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27674,6 +28349,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27983,6 +28661,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -28004,9 +28685,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -28043,6 +28721,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28148,6 +28829,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28229,9 +28913,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28736,7 +29417,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28835,6 +29516,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -29006,6 +29690,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -29069,6 +29756,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -29087,9 +29777,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29234,6 +29921,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29843,7 +30536,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30274,9 +30970,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30286,9 +30988,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30519,6 +31218,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30729,7 +31431,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30811,12 +31516,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30829,6 +31540,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30844,9 +31561,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31357,7 +32080,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31419,9 +32142,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31473,10 +32193,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31497,6 +32217,22 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31506,7 +32242,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31533,9 +32269,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31548,12 +32296,20 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31563,6 +32319,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31572,18 +32331,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31605,25 +32358,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31632,15 +32391,29 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31674,9 +32447,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31689,21 +32468,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31713,7 +32522,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31734,6 +32543,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31743,16 +32555,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31770,7 +32585,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31788,7 +32603,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31797,9 +32612,6 @@ 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 ""
@@ -31833,9 +32645,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31950,10 +32759,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -32145,6 +32954,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32269,6 +33081,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32293,6 +33108,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32419,16 +33243,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32485,6 +33312,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32500,6 +33333,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32515,12 +33354,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32530,6 +33378,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32542,9 +33393,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32593,6 +33456,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32611,12 +33477,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32635,6 +33510,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32644,10 +33522,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32671,6 +33552,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32755,6 +33645,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32896,6 +33789,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32920,7 +33816,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32932,16 +33828,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -33001,6 +33900,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -33013,15 +33915,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -33058,15 +33963,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -33205,6 +34107,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33541,6 +34446,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33586,6 +34494,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33631,9 +34542,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33888,6 +34796,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -34055,6 +34966,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34226,6 +35140,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34235,6 +35152,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34274,9 +35194,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34409,9 +35326,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34835,6 +35749,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34979,6 +35896,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -35051,9 +35971,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -35102,6 +36019,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35267,10 +36187,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35651,8 +36571,10 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
+msgstr[1] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35795,12 +36717,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35957,6 +36873,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35990,9 +36912,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36403,9 +37322,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36436,6 +37352,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36448,6 +37367,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36469,12 +37391,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36768,6 +37696,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36777,6 +37708,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36798,6 +37735,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36810,6 +37750,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -37095,9 +38038,6 @@ 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 ""
@@ -37239,6 +38179,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37251,7 +38194,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37278,7 +38221,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37287,7 +38230,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37374,6 +38317,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37401,6 +38350,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37527,9 +38479,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37767,6 +38725,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38239,6 +39200,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38320,6 +39284,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38338,7 +39305,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38488,9 +39455,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38536,6 +39500,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38629,6 +39596,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38818,6 +39788,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -39022,6 +39995,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -39058,6 +40034,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -39184,6 +40163,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39364,9 +40346,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39385,9 +40364,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39397,6 +40373,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39454,7 +40433,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39691,6 +40670,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39700,6 +40682,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40507,9 +41492,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40534,6 +41516,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40639,9 +41624,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40663,6 +41645,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40783,6 +41768,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40879,9 +41867,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40927,6 +41912,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40948,6 +41936,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41248,6 +42239,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41293,9 +42287,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41338,13 +42329,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41361,6 +42352,9 @@ msgstr[1] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41508,9 +42502,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41535,12 +42526,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41553,18 +42538,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41577,18 +42550,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41664,6 +42628,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41673,6 +42640,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41883,6 +42853,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41976,6 +42952,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -42006,6 +42985,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -42090,6 +43072,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -42170,10 +43155,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42353,6 +43338,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42365,6 +43353,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42656,7 +43647,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42913,6 +43904,11 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43008,6 +44004,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -43086,6 +44091,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -43112,9 +44126,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -43198,45 +44218,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43255,7 +44236,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43361,6 +44342,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43697,6 +44681,11 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43792,6 +44781,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43907,9 +44902,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43982,6 +44974,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -44102,9 +45097,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -44165,6 +45157,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44254,9 +45249,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44457,9 +45449,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/vi_VN/gitlab.po b/locale/vi_VN/gitlab.po
index 8054a8dcc76..d6abfa24f4d 100644
--- a/locale/vi_VN/gitlab.po
+++ b/locale/vi_VN/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: vi\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:10\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr ""
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr ""
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
@@ -288,6 +282,10 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -300,6 +298,10 @@ msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -312,8 +314,8 @@ msgid "%d project selected"
msgid_plural "%d projects selected"
msgstr[0] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgid "%d second"
@@ -392,9 +394,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -617,6 +616,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr ""
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -695,7 +697,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -704,9 +706,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -776,6 +775,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -903,10 +905,17 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1189,7 +1198,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1478,9 +1487,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1673,6 +1691,9 @@ msgstr ""
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -1703,9 +1724,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1859,6 +1877,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -1916,6 +1937,9 @@ msgstr ""
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2039,6 +2063,9 @@ msgstr ""
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2267,6 +2294,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2348,6 +2378,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2360,6 +2393,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2372,6 +2408,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2456,12 +2495,18 @@ msgstr ""
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2501,6 +2546,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2516,6 +2582,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2531,6 +2600,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2540,9 +2615,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2552,6 +2624,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3458,7 +3533,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3572,6 +3647,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3626,6 +3704,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3869,6 +3950,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -3981,6 +4065,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4071,6 +4158,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4549,6 +4639,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4790,12 +4883,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -4882,6 +4969,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -4912,6 +5002,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -4933,6 +5026,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -5293,9 +5434,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5317,6 +5455,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5407,6 +5548,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5630,6 +5777,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5645,6 +5795,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5654,24 +5807,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5733,6 +5901,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5836,6 +6007,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -5995,9 +6169,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6037,6 +6208,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6079,12 +6253,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6097,9 +6277,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6112,6 +6298,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6689,6 +6878,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6719,6 +6911,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -6880,6 +7078,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -6994,6 +7195,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7237,24 +7441,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7312,6 +7504,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7471,6 +7672,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7495,7 +7699,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7510,6 +7714,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7549,22 +7756,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7573,10 +7783,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7588,6 +7816,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7603,10 +7834,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7618,10 +7852,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7636,9 +7867,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7672,13 +7900,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7699,10 +7921,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7714,13 +7933,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7733,9 +7949,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7757,6 +7970,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7799,9 +8015,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -7910,10 +8123,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -7961,16 +8171,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8006,6 +8207,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8015,6 +8219,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8078,9 +8285,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8126,7 +8330,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8219,9 +8423,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8471,12 +8672,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8489,7 +8696,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8730,9 +8937,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -8859,6 +9063,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -8892,9 +9099,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -8919,6 +9123,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -8928,7 +9135,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -8940,12 +9147,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9054,6 +9273,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9099,6 +9321,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9108,6 +9333,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9177,6 +9405,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9296,9 +9530,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9356,7 +9587,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9450,6 +9681,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9489,6 +9723,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9798,6 +10035,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9834,6 +10074,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9849,9 +10095,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -9969,7 +10212,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10008,9 +10251,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10122,9 +10371,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10149,6 +10395,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10179,9 +10428,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10434,43 +10680,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10485,10 +10713,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10599,19 +10827,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10740,15 +10965,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10799,12 +11042,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10820,10 +11069,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -10970,6 +11219,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11024,9 +11276,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11271,6 +11520,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11400,9 +11652,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11421,9 +11670,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12060,6 +12306,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12121,6 +12394,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12765,6 +13041,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12822,6 +13101,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -12912,6 +13194,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -12957,6 +13242,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13059,9 +13383,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13386,6 +13707,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13660,7 +13984,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13792,6 +14116,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13807,9 +14134,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -13891,7 +14215,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14263,6 +14590,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14272,6 +14605,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14510,6 +14846,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14522,6 +14861,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14642,6 +14984,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14771,9 +15116,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -14883,6 +15234,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15304,7 +15658,7 @@ msgstr ""
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15445,9 +15799,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15712,9 +16063,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15742,6 +16090,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15805,9 +16156,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16357,9 +16705,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16372,6 +16717,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16423,9 +16771,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16651,15 +16996,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16699,6 +17053,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16825,9 +17182,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -16837,6 +17191,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17041,9 +17431,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17446,13 +17833,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17575,6 +17962,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17593,9 +17983,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17716,6 +18103,107 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -17885,6 +18373,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18033,9 +18524,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18111,9 +18599,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18243,6 +18728,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18311,7 +18802,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18341,12 +18832,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18356,9 +18841,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18696,9 +19178,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18777,15 +19256,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19077,6 +19547,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19086,6 +19559,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19143,6 +19625,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19158,6 +19646,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19239,6 +19730,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19260,6 +19754,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19269,6 +19766,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19377,6 +19877,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19576,6 +20082,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19690,6 +20199,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19702,12 +20214,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -19855,9 +20373,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -19873,12 +20388,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -19972,6 +20481,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -19990,6 +20502,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20002,6 +20520,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20194,9 +20715,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20239,7 +20757,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20410,10 +20928,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20428,12 +20949,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20443,6 +20958,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20464,7 +20982,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20482,6 +21006,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20491,10 +21018,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20506,6 +21039,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20518,6 +21054,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20773,9 +21312,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20788,6 +21324,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -20851,6 +21390,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -20860,6 +21402,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -20887,15 +21435,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -20911,9 +21468,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -20923,6 +21498,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -20947,6 +21525,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21305,6 +21886,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21413,6 +21997,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21554,6 +22144,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21566,6 +22159,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21584,6 +22180,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21611,9 +22210,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21638,6 +22234,10 @@ msgid "LicenseCompliance|License Compliance detected %d new license and policy v
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
msgstr[0] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21647,6 +22247,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21662,6 +22268,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -21851,9 +22463,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22127,6 +22736,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22160,6 +22772,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22322,6 +22937,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22442,9 +23060,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22466,6 +23081,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22699,9 +23320,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22738,7 +23356,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22813,7 +23431,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23366,9 +23984,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23487,6 +24102,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23505,6 +24123,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23523,12 +24144,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23646,6 +24276,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23742,16 +24375,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23857,6 +24490,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -23932,6 +24592,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24118,9 +24781,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24212,6 +24872,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24287,6 +24950,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24302,9 +24968,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24353,6 +25016,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24401,6 +25067,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24428,12 +25097,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24512,9 +25175,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24536,7 +25196,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24569,9 +25229,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24653,6 +25310,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24807,6 +25467,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25243,10 +25906,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25391,6 +26054,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25409,9 +26075,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25442,10 +26105,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25460,9 +26123,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25490,6 +26150,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25631,6 +26294,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26397,6 +27063,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26673,6 +27342,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26682,10 +27354,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26733,7 +27408,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26742,13 +27417,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26757,7 +27432,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26775,6 +27450,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26787,9 +27465,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -26844,24 +27528,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -26919,9 +27597,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -26937,9 +27612,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27273,9 +27945,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27330,7 +27999,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27375,7 +28044,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27483,6 +28152,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27792,6 +28464,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -27813,9 +28488,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -27852,6 +28524,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -27957,6 +28632,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28038,9 +28716,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28545,7 +29220,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28644,6 +29319,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -28815,6 +29493,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -28878,6 +29559,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -28896,9 +29580,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29043,6 +29724,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29652,7 +30339,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30082,9 +30772,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30094,9 +30790,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30326,6 +31019,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30536,7 +31232,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30613,12 +31312,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30631,6 +31336,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30646,9 +31357,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31156,7 +31873,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31217,9 +31934,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31271,10 +31985,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31295,6 +32009,20 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31304,7 +32032,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31331,9 +32059,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31346,12 +32086,19 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31361,6 +32108,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31370,18 +32120,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31403,25 +32147,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31430,15 +32180,28 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31472,9 +32235,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31487,21 +32256,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31511,7 +32310,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31532,6 +32331,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31541,16 +32343,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Runners|This runner has not run any jobs."
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31568,7 +32373,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31586,7 +32391,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31595,9 +32400,6 @@ 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 ""
@@ -31631,9 +32433,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31748,10 +32547,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -31943,6 +32742,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32056,6 +32858,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32080,6 +32885,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32206,16 +33020,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32272,6 +33089,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32287,6 +33110,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32302,12 +33131,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32317,6 +33155,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32329,9 +33170,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32380,6 +33233,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32398,12 +33254,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32422,6 +33287,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32431,10 +33299,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
+
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32458,6 +33329,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32542,6 +33422,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32683,6 +33566,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32707,7 +33593,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32719,16 +33605,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -32788,6 +33677,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -32800,15 +33692,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -32845,15 +33740,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -32992,6 +33884,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33328,6 +34223,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33373,6 +34271,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33418,9 +34319,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33674,6 +34572,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -33840,6 +34741,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34011,6 +34915,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34020,6 +34927,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34059,9 +34969,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34194,9 +35101,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34620,6 +35524,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34764,6 +35671,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -34836,9 +35746,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -34887,6 +35794,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35052,10 +35962,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35436,8 +36346,9 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35580,12 +36491,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35742,6 +36647,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35775,9 +36686,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36181,9 +37089,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36214,6 +37119,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36226,6 +37134,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36247,12 +37158,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36545,6 +37462,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36554,6 +37474,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36575,6 +37501,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36587,6 +37516,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -36872,9 +37804,6 @@ 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 ""
@@ -37016,6 +37945,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37028,7 +37960,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37055,7 +37987,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37064,7 +37996,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37151,6 +38083,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37178,6 +38116,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37304,9 +38245,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37544,6 +38491,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38014,6 +38964,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38095,6 +39048,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38113,7 +39069,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38263,9 +39219,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38311,6 +39264,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38404,6 +39360,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38593,6 +39552,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -38797,6 +39759,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -38833,6 +39798,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -38959,6 +39927,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39139,9 +40110,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39160,9 +40128,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39172,6 +40137,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39229,7 +40197,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39466,6 +40434,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39475,6 +40446,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40279,9 +41253,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40306,6 +41277,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40411,9 +41385,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40435,6 +41406,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40555,6 +41529,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40651,9 +41628,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40699,6 +41673,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40720,6 +41697,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41020,6 +42000,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41065,9 +42048,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41110,13 +42090,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41132,6 +42112,9 @@ msgstr[0] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41279,9 +42262,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41306,12 +42286,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41324,18 +42298,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41348,18 +42310,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41435,6 +42388,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41444,6 +42400,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41654,6 +42613,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41747,6 +42712,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -41777,6 +42745,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -41861,6 +42832,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -41940,10 +42914,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42123,6 +43097,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42135,6 +43112,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42426,7 +43406,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42679,6 +43659,10 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -42773,6 +43757,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -42851,6 +43844,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -42876,9 +43878,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -42961,45 +43969,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43018,7 +43987,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43122,6 +44091,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43455,6 +44427,10 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43549,6 +44525,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43662,9 +44644,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43737,6 +44716,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -43857,9 +44839,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -43920,6 +44899,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44005,9 +44987,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44207,9 +45186,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index 0d4bd6ac254..643a417a96e 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: zh-CN\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:11\n"
msgid " %{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -28,15 +28,9 @@ msgstr "收集于 %{time}"
msgid " Please sign in."
msgstr "请登录。"
-msgid " Target Path"
-msgstr " 目标路径"
-
msgid " Try to %{action} this file again."
msgstr "å†æ¬¡å°è¯•%{action}此文件。"
-msgid " Type"
-msgstr " 类型"
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " 您需è¦åœ¨ %{grace_period_deadline} 之å‰æ‰§è¡Œæ­¤æ“作。"
@@ -134,7 +128,7 @@ msgstr[0] "%dä½æ ¸å‡†äºº(您已批准)"
msgid "%d assigned issue"
msgid_plural "%d assigned issues"
-msgstr[0] ""
+msgstr[0] "%d 个已分é…的议题"
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -288,6 +282,10 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] "%d个更多评论"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] "%d个开å¯ä¸­çš„议题"
@@ -300,6 +298,10 @@ msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] "%d个个人项目将被删除,无法æ¢å¤ã€‚"
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] "%d 点"
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] "%d个以å‰åˆå¹¶çš„æ交"
@@ -312,9 +314,9 @@ msgid "%d project selected"
msgid_plural "%d projects selected"
msgstr[0] "选择了%d个项目"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d个带有警告的请求"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -358,19 +360,19 @@ msgstr[0] "%d个æ¼æ´žå·²å¿½ç•¥"
msgid "%d vulnerability set to confirmed"
msgid_plural "%d vulnerabilities set to confirmed"
-msgstr[0] ""
+msgstr[0] "%d 个æ¼æ´žè®¾ç½®ä¸ºå·²ç¡®è®¤"
msgid "%d vulnerability set to dismissed"
msgid_plural "%d vulnerabilities set to dismissed"
-msgstr[0] ""
+msgstr[0] "%d 个æ¼æ´žè®¾ç½®ä¸ºå¿½ç•¥"
msgid "%d vulnerability set to needs triage"
msgid_plural "%d vulnerabilities set to needs triage"
-msgstr[0] ""
+msgstr[0] "%d 个æ¼æ´žè®¾ç½®ä¸ºéœ€è¦åˆ†ç±»"
msgid "%d vulnerability set to resolved"
msgid_plural "%d vulnerabilities set to resolved"
-msgstr[0] ""
+msgstr[0] "%d 个æ¼æ´žè®¾ç½®ä¸ºå·²è§£å†³"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
@@ -392,9 +394,6 @@ msgstr "%{actionText} & é‡æ–°æ‰“å¼€ %{noteable}"
msgid "%{address} is an invalid IP address range"
msgstr "%{address}为无效的IP地å€èŒƒå›´"
-msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr "%{anchorOpen}了解更多%{anchorClose}如何在您的实例上定制或ç¦ç”¨æ³¨å†Œ"
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr "%{author_link}将%{original_issue}克隆到%{new_issue}。"
@@ -451,10 +450,10 @@ msgid "%{completedWeight} of %{totalWeight} weight completed"
msgstr "总æƒé‡%{totalWeight}中的%{completedWeight}已完æˆ"
msgid "%{completed} of %{total} issues closed"
-msgstr ""
+msgstr "%{total} 议题中的 %{completed} 个已关闭"
msgid "%{completed} of %{total} weight completed"
-msgstr ""
+msgstr "总æƒé‡ %{total} 中的 %{completed} 已完æˆ"
msgid "%{cores} cores"
msgstr "%{cores}个核心"
@@ -617,6 +616,9 @@ msgstr "%{integrations_link_start}集æˆ%{link_end}使得将第三方应用程åº
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} 将被删除ï¼æ‚¨ç¡®å®šå—?"
+msgid "%{issuable}(s) already assigned"
+msgstr "%{issuable} 已分é…"
+
msgid "%{issueType} actions"
msgstr "%{issueType}æ“作"
@@ -695,8 +697,8 @@ msgstr "由于派生的æºé¡¹ç›®å¯è§æ€§è¾ƒä½Žï¼Œå› æ­¤ä¸å…许使用%{level_n
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr "%{linkStart}了解更多。%{linkEnd}"
-msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr "%{link_start}查看更多%{link_end} 关于角色的信æ¯ã€‚"
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
+msgstr "%{link_start}添加您从 GitLab Inc. 收到的许å¯è¯%{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 "%{link_start}从标题中删除%{draft_snippet}å‰ç¼€%{link_end},å…许此åˆå¹¶è¯·æ±‚在准备就绪时被åˆå¹¶ã€‚"
@@ -704,9 +706,6 @@ msgstr "%{link_start}从标题中删除%{draft_snippet}å‰ç¼€%{link_end},å…è®
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "使用 %{link_start} %{draft_snippet}%{link_end} 开始标题,以防止åˆå¹¶è¯·æ±‚è‰ç¨¿åœ¨å‡†å¤‡å°±ç»ªä¹‹å‰åˆå¹¶ã€‚"
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr "%{link_start}上传许å¯è¯%{link_end} 文件或输入您收到的许å¯è¯å¯†é’¥ã€‚"
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr "%{link_start}GitLab Inc. 收集哪些信æ¯ï¼Ÿ%{link_end}"
@@ -776,6 +775,9 @@ msgstr "%{name}(%{url})的共享 Runner æµæ°´çº¿åˆ†é’Ÿæ•°å·²ç”¨å®Œï¼Œå…¶ä¸‹é¡¹ç
msgid "%{name}, confirm your email address now!"
msgstr "%{name},请确认您的电å­é‚®ä»¶åœ°å€ï¼"
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] "%{no_of_days}天"
@@ -799,7 +801,7 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr "%{openedIssues}个开å¯ä¸­ï¼Œ %{closedIssues}个已关闭"
msgid "%{percentage}%% issues closed"
-msgstr ""
+msgstr "%{percentage}%% 的议题已关闭"
msgid "%{percentage}%% weight completed"
msgstr "%{percentage}%%æƒé‡å·²å®Œæˆ"
@@ -903,11 +905,18 @@ msgstr "%{spanStart}在%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "从%{start}到%{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] "%{strongOpen}%{errors}%{strongClose} 点"
+
msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr "%{strongOpen}警告:%{strongClose} SAML 群组链接会导致 GitLab 自动从群组中移除æˆå‘˜ã€‚"
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
-msgstr "%{strongStart}æ示:%{strongEnd}您å¯ä»¥%{linkStart}通过以下命令%{linkEnd}å°†åˆå¹¶è¯·æ±‚检出到本地。"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr "%{strongStart}需è¦æ‚¨çš„注æ„%{strongEnd} 指的是需è¦æ‚¨ä½œä¸ºæŒ‡æ´¾äººæˆ–审核者帮助处ç†çš„åˆå¹¶è¯·æ±‚。"
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
+msgstr "%{strongStart}æ示:%{strongEnd} 您也å¯ä»¥åœ¨æœ¬åœ°æ£€å‡ºåˆå¹¶è¯·æ±‚。%{linkStart}了解更多。%{linkEnd}"
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -1189,8 +1198,8 @@ msgstr "+%{more_reviewers_count} ä½è¯„审者"
msgid "+%{tags} more"
msgstr "+其余%{tags}个"
-msgid ", and "
-msgstr ", 和 "
+msgid ", "
+msgstr ", "
msgid ", or "
msgstr ",或"
@@ -1216,7 +1225,7 @@ msgid_plural "- Users"
msgstr[0] "- 用户"
msgid "- of - issues closed"
-msgstr ""
+msgstr "-/- 议题已关闭"
msgid "- of - weight completed"
msgstr "- 于总计 - æƒé‡å·²å®Œæˆ"
@@ -1338,7 +1347,7 @@ msgid "1000+"
msgstr "1000+"
msgid "192.168.0.0/24 or 2001:0DB8:1234::/48"
-msgstr ""
+msgstr "192.168.0.0/24 或 2001:0DB8:1234::/48"
msgid "1st contribution!"
msgstr "最高贡献"
@@ -1478,9 +1487,18 @@ msgstr "%{name}的新的版本%{tag}å·²å‘布。请访问 %{release_link_start}å
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "%{name}的新的版本%{tag}å·²å‘布。请访问å‘布页é¢äº†è§£æ›´å¤šä¿¡æ¯ã€‚"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "已创建新的身份模拟令牌。"
+msgid "A new personal access token has been created"
+msgstr "已创建新的个人访问令牌"
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr "已创建一个新的个人访问令牌,å称为 %{token_name}。"
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "éžç§å¯†å²è¯—ä¸èƒ½åˆ†é…ç»™ç§å¯†çš„父å²è¯—。"
@@ -1653,10 +1671,10 @@ msgid "AWS Secret Access Key"
msgstr "AWS秘密访问密钥"
msgid "AWS access key ID (Optional)"
-msgstr ""
+msgstr "AWS 访问密钥 ID(å¯é€‰ï¼‰"
msgid "AWS secret access key (Optional)"
-msgstr ""
+msgstr "AWS secret 访问密钥(å¯é€‰ï¼‰"
msgid "AWS service error: %{error}"
msgstr "AWSæœåŠ¡é”™è¯¯ï¼š%{error}"
@@ -1673,6 +1691,9 @@ msgstr "关于自动部署"
msgid "About this feature"
msgstr "关于此功能"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "滥用报告"
@@ -1703,9 +1724,6 @@ msgstr "无法使用您的LDAPå¸æˆ·è¿›è¡Œç™»å½•ã€‚"
msgid "Access denied: %{error}"
msgstr "æ‹’ç»è®¿é—®ï¼š%{error}"
-msgid "Access expiration date"
-msgstr "访问过期时间"
-
msgid "Access expires"
msgstr "访问过期"
@@ -1859,6 +1877,9 @@ msgstr "å–消订阅"
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr "您å¯ä»¥éšæ—¶ %{unsubscribe_link}。"
+msgid "Acknowledge"
+msgstr "确认"
+
msgid "Action"
msgstr "æ“作"
@@ -1890,7 +1911,7 @@ msgid "Activity"
msgstr "动æ€"
msgid "Activity|An error occurred while retrieving activity. Reload the page to try again."
-msgstr ""
+msgstr "获å–活动时å‘生错误,é‡æ–°åŠ è½½é¡µé¢ä»¥é‡è¯•ã€‚"
msgid "Add"
msgstr "添加"
@@ -1916,6 +1937,9 @@ msgstr "添加 Kubernetes 集群"
msgid "Add LICENSE"
msgstr "添加LICENSE"
+msgid "Add License"
+msgstr "添加许å¯è¯"
+
msgid "Add New Site"
msgstr "添加新站点"
@@ -1929,7 +1953,7 @@ msgid "Add a %{type}"
msgstr "添加一个%{type}"
msgid "Add a GCP region"
-msgstr ""
+msgstr "添加 GCP 区域"
msgid "Add a GPG key"
msgstr "添加GPG密钥"
@@ -1983,7 +2007,7 @@ msgid "Add a numbered list"
msgstr "添加编å·åˆ—表"
msgid "Add a related epic"
-msgstr ""
+msgstr "添加相关å²è¯—"
msgid "Add a related issue"
msgstr "添加一个相关议题"
@@ -2039,6 +2063,9 @@ msgstr "ç«‹å³æ·»åŠ è¯„论"
msgid "Add comment to design"
msgstr "添加注释到设计"
+msgid "Add comment..."
+msgstr "添加评论"
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr "å°†æ交消æ¯æ·»åŠ ä¸ºAsana任务的评论。 %{docs_link}"
@@ -2100,7 +2127,7 @@ msgid "Add or subtract spent time"
msgstr "增加或å‡å°‘耗时"
msgid "Add people"
-msgstr ""
+msgstr "添加人员"
msgid "Add previously merged commits"
msgstr "添加先å‰åˆå¹¶çš„æ交"
@@ -2169,7 +2196,7 @@ msgid "Add webhook"
msgstr "添加webhook"
msgid "Add your team members and others to GitLab."
-msgstr ""
+msgstr "将您的团队æˆå‘˜åŠå…¶å®ƒäººæ·»åŠ è‡³ GitLab。"
msgid "Add/remove"
msgstr "添加/删除"
@@ -2267,6 +2294,9 @@ msgstr "将议题添加到å²è¯—。"
msgid "Adds email participant(s)."
msgstr "添加电å­é‚®ä»¶å‚与者。"
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr "添加与创建它的 %{issuable_type} å…³è”çš„æ­¤ %{issuable_type}"
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr "调整 GitLab UI 轮询更新的频率。"
@@ -2348,6 +2378,9 @@ msgstr "访客"
msgid "AdminArea|Included Free in license"
msgstr "å…费包å«äºŽè®¸å¯è¯ä¸­"
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr "最新群组"
@@ -2360,6 +2393,9 @@ msgstr "最新用户"
msgid "AdminArea|Maintainer"
msgstr "维护者"
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr "最å°è®¿é—®æƒé™"
@@ -2372,6 +2408,9 @@ msgstr "新建项目"
msgid "AdminArea|New user"
msgstr "新建用户"
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr "所有者"
@@ -2456,12 +2495,18 @@ msgstr "删除项目 %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr "我们将为此GitLab 实例使用此电å­é‚®ä»¶åœ°å€é…置一个Let's Encryptè´¦å·ã€‚ 您将收到电å­é‚®ä»¶è¯ä¹¦è¿‡æœŸè­¦å‘Šã€‚ %{link_start}了解更多信æ¯ã€‚%{link_end}"
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr "å½±å“所有新的和现有的群组。"
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr "默认情况下,所有新项目都å¯ä»¥ä½¿ç”¨å®žä¾‹çš„共享Runner。"
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps 域"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "é…ç½® Let's Encrypt"
@@ -2501,6 +2546,27 @@ msgstr "Let's Encrypt 电å­é‚®ä»¶"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr "å¯ç”¨2FA时,Gitæ“作会è¯çš„最大有效期é™ã€‚"
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr "项目和群组中的新 CI/CD å˜é‡é»˜è®¤ä¸ºå—ä¿æŠ¤ã€‚"
@@ -2516,6 +2582,9 @@ msgstr "è¦æ±‚用户è¯æ˜Žè‡ªå®šä¹‰åŸŸå的所有æƒ"
msgid "AdminSettings|Required pipeline configuration"
msgstr "强制æµæ°´çº¿é…ç½®"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr "选择一个 CI/CD 模æ¿"
@@ -2531,6 +2600,12 @@ msgstr "å¯ç”¨2FAæ—¶Gitæ“作的会è¯æŒç»­æ—¶é—´ï¼ˆåˆ†é’Ÿï¼‰"
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr "å°†CI/CD模æ¿è®¾ç½®ä¸ºå®žä¾‹ä¸­æ‰€æœ‰é¡¹ç›®æ‰€éœ€çš„æµæ°´çº¿é…置。当æµæ°´çº¿è¿è¡Œæ—¶ï¼Œé¡¹ç›®CI/CDé…ç½®åˆå¹¶åˆ°æ‰€éœ€çš„æµæ°´çº¿é…置中。%{link_start}什么是必需的æµæ°´çº¿é…ç½®?%{link_end}"
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr "设置在实例中创建的新仓库的默认分支的åˆå§‹å称和ä¿æŠ¤ã€‚"
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr "设置æ¯ä¸ªé¡¹ç›®çš„GitLab Pagesçš„æœ€å¤§å¤§å° ï¼ˆ0表示无é™åˆ¶ï¼‰ã€‚%{link_start}了解更多信æ¯ã€‚%{link_end}"
@@ -2540,9 +2615,6 @@ msgstr "Pages é™æ€ç«™ç‚¹çš„大å°å’ŒåŸŸå设置。"
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr "在所有项目中,自动评审应用和自动部署阶段使用的默认域å。"
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 "存储了æ¯ä¸ªé¡¹ç›®ä¸­æœ€è¿‘æˆåŠŸå®Œæˆçš„æµæ°´çº¿ä¸­æ‰€æœ‰ä½œä¸šçš„最新产物,并且ä¸ä¼šè¿‡æœŸã€‚"
@@ -2552,6 +2624,9 @@ msgstr "å¯ä»¥é€‰æ‹©è¯¥ç¾¤ç»„中的项目作为在实例中创建新项目的模
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr "所需æµæ°´çº¿é…置的模æ¿å¯ä»¥æ˜¯GitLabæ供的模æ¿ä¹‹ä¸€ï¼Œä¹Ÿå¯ä»¥æ˜¯æ·»åŠ åˆ°å®žä¾‹æ¨¡æ¿ä»“库的自定义模æ¿ã€‚%{link_start}如何创建实例模æ¿ä»“库?%{link_end}"
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "激活用户"
@@ -3024,7 +3099,7 @@ msgid "Akismet helps prevent the creation of spam issues in public projects."
msgstr "Akismet有助于防止在公共项目中产生垃圾信æ¯ã€‚"
msgid "Alert"
-msgstr ""
+msgstr "警报"
msgid "AlertManagement|Acknowledged"
msgstr "已确认"
@@ -3458,8 +3533,8 @@ msgstr "å…许éžç®¡ç†å‘˜è®¿é—®æ€§èƒ½æ "
msgid "Allow only the selected protocols to be used for Git access."
msgstr "ä»…å…许所选å议用于 Git 访问。"
-msgid "Allow owners to manage default branch protection per group"
-msgstr "å…许所有者管ç†åœ¨ç¾¤ç»„级别默认分支ä¿æŠ¤"
+msgid "Allow owners to manage default branch protection per group."
+msgstr "å…许所有者管ç†æ¯ä¸ªç¾¤ç»„的默认分支ä¿æŠ¤ã€‚"
msgid "Allow owners to manually add users outside of LDAP"
msgstr "å…许负责人手动添加LDAP之外的用户"
@@ -3572,6 +3647,9 @@ msgstr "Amazon的身份验è¯æœª%{link_start}正确é…ç½®%{link_end}。如需使
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 Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr "管ç†å‘˜å·²å°†æœ€é•¿åˆ°æœŸæ—¥æœŸè®¾ç½®ä¸º %{maxDate}。%{helpLinkStart}了解更多%{helpLinkEnd}。"
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr "您的组织已ç»ä¸ºæ‚¨åˆ›å»ºäº†ä¼ä¸š GitLab è´¦å·ï¼š"
@@ -3626,6 +3704,9 @@ msgstr "获å–公共部署密钥时出错。请é‡è¯•ã€‚"
msgid "An error occurred previewing the blob"
msgstr "预览 blob 时出错"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr "更新标题时出现错误"
@@ -3869,6 +3950,9 @@ msgstr "解æžæœ€è¿‘æœç´¢æ—¶å‘生错误"
msgid "An error occurred while parsing the file."
msgstr "解æžæ–‡ä»¶æ—¶å‘生了错误。"
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr "在编辑器中粘贴文本时å‘生错误。请é‡è¯•ã€‚"
+
msgid "An error occurred while removing epics."
msgstr "删除å²è¯—æ—¶å‘生错误。"
@@ -3981,6 +4065,9 @@ msgstr "议题已ç»å­˜åœ¨"
msgid "An unauthenticated user"
msgstr "未ç»è®¤è¯çš„用户"
+msgid "An unexpected error occurred"
+msgstr "å‘生æ„外错误"
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "检查项目环境时å‘生æ„外错误。"
@@ -4071,6 +4158,9 @@ msgstr "任何里程碑"
msgid "Any namespace"
msgstr "任何命å空间"
+msgid "Anyone can register for an account."
+msgstr "任何人都å¯ä»¥æ³¨å†Œä¸€ä¸ªå¸æˆ·ã€‚"
+
msgid "App ID"
msgstr "应用ID"
@@ -4133,14 +4223,14 @@ msgid "ApplicationSettings|Approve users in the pending approval status?"
msgstr "批准处于待批准状æ€çš„用户?"
msgid "ApplicationSettings|Approve users who are pending approval?"
-msgstr ""
+msgstr "è¦æ‰¹å‡†å¤„于待批准状æ€çš„用户å—?"
msgid "ApplicationSettings|By making this change, you will automatically approve %d user who is pending approval."
msgid_plural "ApplicationSettings|By making this change, you will automatically approve %d users who are pending approval."
-msgstr[0] ""
+msgstr[0] "通过此å˜æ›´ï¼Œæ‚¨å°†è‡ªåŠ¨æ‰¹å‡† %d å处于待批准状æ€çš„用户。"
msgid "ApplicationSettings|By making this change, you will automatically approve all users who are pending approval."
-msgstr ""
+msgstr "通过此å˜æ›´ï¼Œæ‚¨å°†è‡ªåŠ¨æ‰¹å‡†æ‰€æœ‰å¤„于待批准状æ€çš„用户。"
msgid "ApplicationSettings|Denied domains for sign-ups"
msgstr "æ‹’ç»æ³¨å†Œçš„域"
@@ -4343,7 +4433,7 @@ msgid "ApprovalRule|Examples: QA, Security."
msgstr "示例:QAã€å®‰å…¨ã€‚"
msgid "ApprovalRule|Improve your organization's code review with required approvals."
-msgstr ""
+msgstr "通过执行必需的批准,改进组织的代ç å®¡æŸ¥ã€‚"
msgid "ApprovalRule|Increase quality and maintain standards."
msgstr "æ高质é‡å¹¶ä¿æŒæ ‡å‡†ã€‚"
@@ -4391,7 +4481,7 @@ msgid "ApprovalRule|Select All"
msgstr "选择全部"
msgid "ApprovalRule|Select eligible approvers by expertise or files changed."
-msgstr ""
+msgstr "按专业领域或被更改的文件,选择符åˆæ¡ä»¶çš„核准人。"
msgid "ApprovalRule|Select scanners"
msgstr "选择扫æ工具"
@@ -4544,11 +4634,14 @@ msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
msgstr "您ç»å¯¹ç¡®å®šè¦åˆ é™¤æ­¤ç¾¤ç»„å—?"
msgid "Are you absolutely sure?"
-msgstr ""
+msgstr "您是å¦ç»å¯¹ç¡®å®šï¼Ÿ"
msgid "Are you sure that you want to archive this project?"
msgstr "确定è¦å½’档此项目å—?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr "您确定è¦åˆ é™¤ %{application} å—?"
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "确定è¦å–消归档此项目å—?"
@@ -4580,7 +4673,7 @@ msgid "Are you sure you want to delete this SSH key?"
msgstr "您确定è¦åˆ é™¤æ­¤SSH密钥å—?"
msgid "Are you sure you want to delete this comment?"
-msgstr ""
+msgstr "您确定è¦åˆ é™¤æ­¤è¯„论å—?"
msgid "Are you sure you want to delete this deploy key?"
msgstr "您确定è¦åˆ é™¤æ­¤éƒ¨ç½²å¯†é’¥å—?"
@@ -4589,7 +4682,7 @@ msgid "Are you sure you want to delete this device? This action cannot be undone
msgstr "您确定è¦åˆ é™¤æ­¤è®¾å¤‡å—?此æ“作无法撤销。"
msgid "Are you sure you want to delete this label?"
-msgstr ""
+msgstr "您确定è¦åˆ é™¤æ­¤æ ‡è®°å—?"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "确定è¦åˆ é™¤æ­¤æµæ°´çº¿è®¡åˆ’å—?"
@@ -4653,7 +4746,7 @@ msgid "Are you sure you want to remove this list?"
msgstr "您确定è¦åˆ é™¤æ­¤åˆ—表å—?"
msgid "Are you sure you want to remove this nickname?"
-msgstr ""
+msgstr "您确定è¦åˆ é™¤æ­¤æ˜µç§°å—?"
msgid "Are you sure you want to reset the health check token?"
msgstr "确定è¦é‡ç½®è¿è¡ŒçŠ¶å†µæ£€æŸ¥ä»¤ç‰Œå—?"
@@ -4671,7 +4764,7 @@ msgid "Are you sure you want to revoke this personal access token? This action c
msgstr "您确定è¦æ’¤æ¶ˆæ­¤ä¸ªäººè®¿é—®ä»¤ç‰Œå—?此æ“作无法撤消。"
msgid "Are you sure you want to revoke this project access token? This action cannot be undone."
-msgstr ""
+msgstr "您确定è¦æ’¤é”€æ­¤é¡¹ç›®è®¿é—®ä»¤ç‰Œå—?此æ“作ä¸èƒ½æ’¤æ¶ˆã€‚"
msgid "Are you sure you want to stop this environment?"
msgstr "是å¦ç¡®å®šç»ˆæ­¢å½“å‰çŽ¯å¢ƒï¼Ÿ"
@@ -4790,12 +4883,6 @@ msgstr "分é…给评论用户"
msgid "Assign to me"
msgstr "分é…给我"
-msgid "Assign yourself to these issues"
-msgstr "将这些议题分é…给自己"
-
-msgid "Assign yourself to this issue"
-msgstr "将此议题分é…给自己"
-
msgid "Assigned %{assignee_users_sentence}."
msgstr "已指派%{assignee_users_sentence}。"
@@ -4880,7 +4967,10 @@ msgid "Attaching the file failed."
msgstr "添加附件失败。"
msgid "Attention"
-msgstr ""
+msgstr "注æ„"
+
+msgid "Attention requested"
+msgstr "已请求关注"
msgid "Audit Events"
msgstr "审计事件"
@@ -4912,6 +5002,9 @@ msgstr "群组事件"
msgid "AuditLogs|IP Address"
msgstr "IP地å€"
+msgid "AuditLogs|Log"
+msgstr "日志"
+
msgid "AuditLogs|Member Events"
msgstr "æˆå‘˜äº‹ä»¶"
@@ -4933,6 +5026,54 @@ msgstr "本月"
msgid "AuditLogs|User Events"
msgstr "用户事件"
+msgid "AuditStreams|Active"
+msgstr "有效"
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr "添加一个 HTTP 端点æ¥ç®¡ç†ç¬¬ä¸‰æ–¹ç³»ç»Ÿä¸­çš„审计日志。"
+
+msgid "AuditStreams|Add external stream destination"
+msgstr "添加外部事件æµç›®çš„地"
+
+msgid "AuditStreams|Add stream"
+msgstr "添加事件æµ"
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr "创建外部审计事件æµç›®çš„地时出错。请å†è¯•ä¸€æ¬¡ã€‚"
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr "删除外部审计事件æµç›®çš„地时出错。请å†è¯•ä¸€æ¬¡ã€‚"
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr "获å–外部审计事件æµæ—¶å‡ºé”™ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
+
+msgid "AuditStreams|Cancel editing"
+msgstr "å–消编辑"
+
+msgid "AuditStreams|Delete %{link}"
+msgstr "删除 %{link}"
+
+msgid "AuditStreams|Destination URL"
+msgstr "目的地 URL"
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr "目的地接收所有审计事件数æ®"
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr "为审计事件设置事件æµ"
+
+msgid "AuditStreams|Stream count icon"
+msgstr "事件æµè®¡æ•°"
+
+msgid "AuditStreams|Streams"
+msgstr "事件æµ"
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr "å¯èƒ½åŒ…括æ•æ„Ÿä¿¡æ¯ï¼Œè¯·ç¡®ä¿æ‚¨ä¿¡ä»»ç›®çš„地端点。"
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr "éžå¸¸é€‚åˆå°†æ‰€æœ‰æ•°æ®ä¿å­˜åœ¨ä¸€ä¸ªåœ°æ–¹ã€‚"
+
msgid "Aug"
msgstr "8月"
@@ -4949,7 +5090,7 @@ msgid "Authenticate with GitHub"
msgstr "使用GitHub身份验è¯"
msgid "Authenticated API rate limit period in seconds"
-msgstr "以秒为å•ä½çš„èº«ä»½éªŒè¯ API 速率é™åˆ¶æœŸé™"
+msgstr "已身份验è¯çš„ API 速率é™åˆ¶æœŸï¼ˆä»¥ç§’为å•ä½ï¼‰"
msgid "Authenticated API requests"
msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„ API 请求"
@@ -4964,7 +5105,7 @@ msgid "Authenticated Git LFS requests"
msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„ Git LFS 请求"
msgid "Authenticated web rate limit period in seconds"
-msgstr "认è¯çš„网页速率é™åˆ¶æ—¶é—´ï¼ˆç§’)"
+msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„ Web 速率é™åˆ¶æœŸï¼ˆä»¥ç§’为å•ä½ï¼‰"
msgid "Authenticated web requests"
msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„ Web 请求"
@@ -5045,10 +5186,10 @@ msgid "Authorized applications (%{size})"
msgstr "已授æƒåº”用 (%{size})"
msgid "AuthorizedApplication|Are you sure you want to revoke this application?"
-msgstr ""
+msgstr "您确定è¦æ’¤é”€è¿™ä¸ªç”³è¯·å—?"
msgid "AuthorizedApplication|Revoke application"
-msgstr ""
+msgstr "撤销申请"
msgid "Authors: %{authors}"
msgstr "作者人数:%{authors}"
@@ -5293,9 +5434,6 @@ msgstr "您将删除此徽章。已删除的徽章%{strongStart}将无法æ¢å¤%
msgid "Badges|Your badges"
msgstr "您的徽章"
-msgid "Balsamiq file could not be loaded."
-msgstr "无法加载 balsamiq 文件。"
-
msgid "BambooService|Atlassian Bamboo"
msgstr "Atlassian Bamboo"
@@ -5317,6 +5455,9 @@ msgstr "使用Atlassian Bambooè¿è¡ŒCI/CDæµæ°´çº¿ã€‚您必须在Bamboo中设置
msgid "BambooService|The user with API access to the Bamboo server."
msgstr "对 Bamboo æœåŠ¡å™¨å…·æœ‰ API 访问æƒé™çš„用户。"
+msgid "Banner message"
+msgstr "横幅消æ¯"
+
msgid "Based on"
msgstr "基于"
@@ -5407,6 +5548,12 @@ msgstr "访问%{parent_billing_page_link}的计费部分以管ç†è¯¥é¡¹ç›®çš„订
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "虽然 GitLab å°†åœæ­¢ä½¿ç”¨ Bronze 方案,但您ä»ç„¶å¯ä»¥åœ¨ %{eoa_bronze_plan_end_date} 之å‰å†ç»­è®¢ä¸€æ¬¡ Bronze 订阅。 我们还æä¾›é™æ—¶å…è´¹å‡çº§åˆ°æˆ‘们的高级方案(最多 25 ä¸ªç”¨æˆ·ï¼‰ï¼ åœ¨æˆ‘ä»¬çš„ %{announcement_link} 中了解有关改å˜å’Œä¼˜æƒ çš„更多信æ¯ã€‚"
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr "您的GitLab.com%{plan}试用将在%{strong_open}%{expiration_date}过期%{strong_close}。您å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹å¼å‡çº§ä»¥ä¿ç•™å¯¹%{plan}功能的访问æƒé™ã€‚"
@@ -5630,6 +5777,9 @@ msgstr "æœç´¢é¡¹ç›®"
msgid "BoardNewIssue|Select a project"
msgstr "选择一个项目"
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "获å–里程碑时å‘生错误,请é‡è¯•ã€‚"
@@ -5645,6 +5795,9 @@ msgstr "任何里程碑"
msgid "BoardScope|Any assignee"
msgstr "任何指派人"
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr "任何标记"
@@ -5654,24 +5807,39 @@ msgstr "指派人"
msgid "BoardScope|Choose labels"
msgstr "选择标记"
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr "编辑"
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr "标记"
msgid "BoardScope|Milestone"
msgstr "里程碑"
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr "无里程碑"
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr "æœç´¢é‡Œç¨‹ç¢‘"
msgid "BoardScope|Select assignee"
msgstr "选择指派人"
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr "选择标记"
@@ -5733,6 +5901,9 @@ msgstr "获å–看æ¿åˆ—表时å‘生错误。请é‡æ–°åŠ è½½é¡µé¢ã€‚"
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr "读å–看æ¿æ³³é“时出错。请é‡æ–°åŠ è½½é¡µé¢ã€‚"
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr "在获å–看æ¿æ—¶å‘生错误。请é‡æ–°åŠ è½½é¡µé¢ã€‚"
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr "生æˆåˆ—表时å‘生错误。请é‡æ–°åŠ è½½é¡µé¢ã€‚"
@@ -5836,6 +6007,9 @@ msgstr "分支已ç»å­˜åœ¨"
msgid "Branch changed"
msgstr "分支已更改"
+msgid "Branch has been updated since the merge was requested."
+msgstr "自请求åˆå¹¶ä»¥æ¥ï¼Œåˆ†æ”¯å·²æ›´æ–°ã€‚"
+
msgid "Branch is already taken"
msgstr "分支已被采用"
@@ -5995,9 +6169,6 @@ msgstr "广播消æ¯å·²æˆåŠŸæ›´æ–°ã€‚"
msgid "Broadcast Messages"
msgstr "广播消æ¯"
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr "将为æ¯ä¸ªç”¨æˆ·å±•ç¤ºå¹¿æ’­æ¶ˆæ¯ï¼Œå¯ç”¨äºŽé€šçŸ¥ç”¨æˆ·æœ‰å…³è®¡åˆ’维护ã€æœ€è¿‘å‡çº§ç­‰ä¿¡æ¯ã€‚"
-
msgid "Browse Directory"
msgstr "æµè§ˆç›®å½•"
@@ -6037,6 +6208,9 @@ msgstr "%{host} 正在è¿è¡Œè¿‡æ—¶çš„ GitLab 版本(v%{version})"
msgid "BulkImport|%{feature} (require v%{version})"
msgstr "%{feature}ï¼ˆéœ€è¦ v%{version})"
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "现有群组"
@@ -6079,12 +6253,18 @@ msgstr "å称已用作å¦ä¸€ç»„的目标。"
msgid "BulkImport|New group"
msgstr "新建群组"
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr "没有历å²è®°å½•"
msgid "BulkImport|No parent"
msgstr "没有父级"
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr "é‡æ–°å¯¼å…¥ä¼šåˆ›å»ºä¸€ä¸ªæ–°ç¾¤ç»„。它ä¸ä¸ŽçŽ°æœ‰ç¾¤ç»„åŒæ­¥ã€‚"
@@ -6097,9 +6277,15 @@ 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"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr "æºç¾¤ç»„"
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "到新群组"
@@ -6112,6 +6298,9 @@ msgstr "您没有è¦å¯¼å…¥çš„群组"
msgid "BulkImport|Your imported groups will appear here."
msgstr "您导入的群组将出现在这里。"
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr "需与群组关è”但是当å‰ä¸Žé¡¹ç›®å…³è”"
@@ -6240,13 +6429,13 @@ msgid "CICDAnalytics|Shared Runners Usage"
msgstr "共享 Runner 的使用情况"
msgid "CICDAnalytics|Shared runner pipeline minute duration by month"
-msgstr ""
+msgstr "共享 runner æµæ°´çº¿åˆ†é’ŸæŒç»­æ—¶é—´ï¼ˆæŒ‰æœˆï¼‰"
msgid "CICDAnalytics|Shared runner usage"
msgstr "共享 Runner 的使用情况"
msgid "CICDAnalytics|Shared runner usage is the total runtime of all jobs that ran on shared runners"
-msgstr ""
+msgstr "共享 Runner 的使用é‡æ˜¯åœ¨å…±äº« Runner 上è¿è¡Œçš„所有作业的总è¿è¡Œæ—¶é—´"
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr "获å–å‘布统计信æ¯æ—¶å‡ºçŽ°é”™è¯¯"
@@ -6384,7 +6573,7 @@ msgid "Can create groups:"
msgstr "å¯ä»¥åˆ›å»ºç¾¤ç»„:"
msgid "Can not delete primary training"
-msgstr ""
+msgstr "ä¸èƒ½åˆ é™¤åˆçº§åŸ¹è®­"
msgid "Can't apply as the source branch was deleted."
msgstr "由于æºåˆ†æ”¯å·²åˆ é™¤ï¼Œå› æ­¤æ— æ³•åº”用。"
@@ -6689,6 +6878,9 @@ msgstr "这将创建一个新的æ交, æ¥è¿˜åŽŸçŽ°æœ‰çš„更改。"
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr "åˆå¹¶è¯·æ±‚已开å¯ï¼Œå˜æ›´å°†è¢«æ交到%{branchName}。"
+msgid "Changed"
+msgstr "已更改"
+
msgid "Changed assignee(s)."
msgstr "å·²å˜æ›´çš„指派人"
@@ -6719,6 +6911,12 @@ msgstr "标题更改尚未ä¿å­˜"
msgid "Changing any setting here requires an application restart"
msgstr "更改此处的任何设置都需è¦é‡æ–°å¯åŠ¨åº”用程åº"
+msgid "Characters left"
+msgstr "剩余字符"
+
+msgid "Characters over limit"
+msgstr "字符超过é™åˆ¶"
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr "无法显示图表,因为数æ®è¯·æ±‚已超时。 %{documentationLink}"
@@ -6880,6 +7078,9 @@ msgstr "CI 分钟包仅在您使用完订阅的æ¯æœˆé…é¢åŽä½¿ç”¨ã€‚é¢å¤–çš„
msgid "Checkout|CI minutes"
msgstr "CI 分钟"
+msgid "Checkout|Calculating your subscription..."
+msgstr "正在计算您的订阅..."
+
msgid "Checkout|Checkout"
msgstr " 支付"
@@ -6994,6 +7195,9 @@ msgstr "å°è®¡"
msgid "Checkout|Tax"
msgstr "税é¢"
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr "此数字必须为 %{minimumNumberOfUsers} (使用中的席ä½æ•°ï¼‰æˆ–更多。"
+
msgid "Checkout|Total"
msgstr "总计"
@@ -7237,24 +7441,12 @@ msgstr "所有环境"
msgid "CiVariable|Create wildcard"
msgstr "创建通é…符"
-msgid "CiVariable|Masked"
-msgstr "å·²éšè—"
-
msgid "CiVariable|New environment"
msgstr "新建环境"
-msgid "CiVariable|Protected"
-msgstr "å—ä¿æŠ¤"
-
msgid "CiVariable|Search environments"
msgstr "æœç´¢çŽ¯å¢ƒ"
-msgid "CiVariable|Toggle masked"
-msgstr "切æ¢éšè—"
-
-msgid "CiVariable|Toggle protected"
-msgstr "开关ä¿æŠ¤çŠ¶æ€"
-
msgid "Classification Label (optional)"
msgstr "分类标签(å¯é€‰)"
@@ -7298,7 +7490,7 @@ msgid "Clear recent searches"
msgstr "清除最近的æœç´¢"
msgid "Clear repository checks"
-msgstr ""
+msgstr "清除仓库检查"
msgid "Clear search"
msgstr "清除æœç´¢"
@@ -7312,6 +7504,15 @@ msgstr "清除开始日期"
msgid "Clear templates search input"
msgstr "清除模æ¿æœç´¢è¾“å…¥"
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr "清除此å¤é€‰æ¡†ï¼Œä½¿ç”¨ä¸ªäººè®¿é—®ä»¤ç‰Œä»£æ›¿ã€‚"
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr "清除此å¤é€‰æ¡†ï¼Œä½¿ç”¨ä¸ªäººè®¿é—®ä»¤ç‰Œæˆ– LDAP 密ç ä»£æ›¿ã€‚"
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr "清除此å¤é€‰æ¡†ï¼Œä½¿ç”¨å¤–部身份验è¯ä»£æ›¿ã€‚"
+
msgid "Clear weight"
msgstr "清除æƒé‡"
@@ -7469,13 +7670,16 @@ msgid "Cluster level"
msgstr "集群级别"
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
+msgstr "必须为 Stages::ClusterEndpointInserter 指定集群类型"
+
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr "%{name} å·²æˆåŠŸåˆ é™¤"
msgid "ClusterAgents|%{number} of %{total} agents"
-msgstr ""
+msgstr "å…± %{total} 个代ç†ä¸­çš„ %{number} 个"
msgid "ClusterAgents|%{number} of %{total} clusters connected through cluster certificates"
msgstr "%{total}个集群中的%{number}个通过集群è¯ä¹¦è¿žæŽ¥"
@@ -7495,8 +7699,8 @@ msgstr "%{tokenName} 已撤销"
msgid "ClusterAgents|Access tokens"
msgstr "访问令牌"
-msgid "ClusterAgents|Actions"
-msgstr "æ“作"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
+msgstr "添加代ç†é…置文件到 %{linkStart}此仓库%{linkEnd} 并选择它,或创建一个新的é…置文件在 GitLab 注册:"
msgid "ClusterAgents|Advanced installation methods"
msgstr "高级安装方法"
@@ -7510,6 +7714,9 @@ msgstr "代ç†%{strongStart}已连接%{strongEnd}"
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr "代ç†%{strongStart}未连接%{strongEnd}"
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr "代ç†å¯èƒ½æ— æ³•è¿žæŽ¥åˆ° GitLab"
@@ -7517,13 +7724,13 @@ msgid "ClusterAgents|Agent never connected to GitLab"
msgstr "代ç†ä»Žæœªè¿žæŽ¥åˆ° GitLab"
msgid "ClusterAgents|Agent version mismatch"
-msgstr ""
+msgstr "代ç†ç‰ˆæœ¬ä¸åŒ¹é…"
msgid "ClusterAgents|Agent version mismatch and update"
-msgstr ""
+msgstr "代ç†ç‰ˆæœ¬ä¸åŒ¹é…和更新"
msgid "ClusterAgents|Agent version update required"
-msgstr ""
+msgstr "需è¦æ›´æ–°ä»£ç†ç‰ˆæœ¬"
msgid "ClusterAgents|All"
msgstr "全部"
@@ -7549,35 +7756,56 @@ msgstr "è¯ä¹¦"
msgid "ClusterAgents|Configuration"
msgstr "é…ç½®"
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr "连接现有集群"
+msgid "ClusterAgents|Connect a cluster"
+msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
-msgstr "使用è¯ä¹¦è¿žæŽ¥"
+msgid "ClusterAgents|Connect a cluster (agent)"
+msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
+msgid "ClusterAgents|Connect a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Connect existing cluster"
+msgstr "连接现有集群"
+
msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr "与 GitLab 代ç†è¿žæŽ¥"
-msgid "ClusterAgents|Connect your cluster through an agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr "已连接"
msgid "ClusterAgents|Connection status"
msgstr "连接状æ€"
+msgid "ClusterAgents|Copy command"
+msgstr "å¤åˆ¶å‘½ä»¤"
+
msgid "ClusterAgents|Copy token"
msgstr "å¤åˆ¶ä»¤ç‰Œ"
-msgid "ClusterAgents|Create a new cluster"
-msgstr "创建新集群"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr "创建代ç†è®¿é—®ä»¤ç‰Œ"
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr "创建代ç†ï¼š%{searchTerm}"
+
+msgid "ClusterAgents|Create token"
+msgstr "创建令牌"
msgid "ClusterAgents|Created by"
msgstr "创建人"
@@ -7588,6 +7816,9 @@ msgstr "由 %{name} %{time} 创建"
msgid "ClusterAgents|Date created"
msgstr "创建日期"
+msgid "ClusterAgents|Default configuration"
+msgstr "默认é…ç½®"
+
msgid "ClusterAgents|Delete"
msgstr "删除"
@@ -7603,11 +7834,14 @@ msgstr "æè¿°"
msgid "ClusterAgents|Event occurred"
msgstr "å‘生的事件"
+msgid "ClusterAgents|Failed to create a token"
+msgstr "创建令牌失败"
+
msgid "ClusterAgents|Failed to register an agent"
msgstr "代ç†æ³¨å†Œå¤±è´¥"
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
-msgstr "有关高级安装方法, %{linkStart}å‚è§æ–‡æ¡£%{linkEnd}。"
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
+msgstr ""
msgid "ClusterAgents|GitLab Agent"
msgstr "GitLab 代ç†"
@@ -7618,17 +7852,14 @@ msgstr "适用于 Kubernetes çš„ GitLab 代ç†"
msgid "ClusterAgents|Give feedback"
msgstr "æä¾›å馈"
-msgid "ClusterAgents|Go to the repository files"
-msgstr "转到仓库文件"
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr "如何注册代ç†ï¼Ÿ"
msgid "ClusterAgents|How to update an agent?"
-msgstr ""
+msgstr "如何更新代ç†ï¼Ÿ"
msgid "ClusterAgents|Install a new agent"
-msgstr ""
+msgstr "安装一个新代ç†"
msgid "ClusterAgents|Last connected %{timeAgo}."
msgstr "上次连接在 %{timeAgo}。"
@@ -7636,9 +7867,6 @@ msgstr "上次连接在 %{timeAgo}。"
msgid "ClusterAgents|Last contact"
msgstr "最åŽä¸€æ¬¡è”ç³»"
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr "了解如何创建一个 agent 访问令牌"
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr "了解如何排除故障"
@@ -7655,7 +7883,7 @@ msgid "ClusterAgents|Never connected"
msgstr "从未连接"
msgid "ClusterAgents|No agents"
-msgstr ""
+msgstr "无代ç†"
msgid "ClusterAgents|No clusters connected through cluster certificates"
msgstr "没有通过集群è¯ä¹¦è¿žæŽ¥çš„集群"
@@ -7672,15 +7900,9 @@ msgstr "推è安装方法"
msgid "ClusterAgents|Register"
msgstr "注册"
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr "注册代ç†ä»¥ç”Ÿæˆä¸€ä¸ªä»¤ç‰Œï¼Œç”¨äºŽåœ¨ä¸‹ä¸€æ­¥å°†ä»£ç†å®‰è£…到您的集群中。"
-
-msgid "ClusterAgents|Registering Agent"
+msgid "ClusterAgents|Registering agent"
msgstr "注册代ç†"
-msgid "ClusterAgents|Registration token"
-msgstr "注册令牌"
-
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr "需è¦æœ‰è‡³å°‘维护者级别的æƒé™ï¼Œæ‰å¯åˆ é™¤ä»£ç†ã€‚"
@@ -7699,11 +7921,8 @@ msgstr "安全"
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr "查看代ç†åŠ¨æ€æ›´æ–°ï¼Œä¾‹å¦‚已创建或已撤销的令牌,以åŠå·²è¿žæŽ¥æˆ–未连接的集群。"
-msgid "ClusterAgents|Select an agent"
-msgstr "选择代ç†"
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
-msgstr "选择è¦æ³¨å†Œåˆ° GitLab 的代ç†"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
+msgstr "选择一个代ç†æˆ–输入å称æ¥åˆ›å»ºä¸€ä¸ªæ–°ä»£ç†"
msgid "ClusterAgents|Tell us what you think"
msgstr "告诉我们您的想法"
@@ -7714,14 +7933,11 @@ msgstr "当将 Kubernetes 集群连接到 GitLab 时,GitLab 代ç†æ供更高
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr "代ç†é•¿æ—¶é—´æœªè¿žæŽ¥ï¼Œå¯èƒ½æœ‰è¿žæŽ¥é—®é¢˜ï¼Œæœ€åŽè¿žæŽ¥æ—¶é—´æ˜¯ %{timeAgo}。"
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
-msgstr "推è的安装方法包括令牌, 如果您想éµå¾ªæ–‡æ¡£ä¸­æ供的高级安装方法,请确ä¿æ‚¨åœ¨å…³é—­æ­¤çª—å£ä¹‹å‰ä¿å­˜ä»¤ç‰Œå€¼ã€‚"
-
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
-msgstr "注册令牌将用于将您集群上的代ç†è¿žæŽ¥åˆ° GitLab。 %{linkStart}注册令牌是什么?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
+msgstr "集群的 pod 中的代ç†ç‰ˆæœ¬ä¸åŒ¹é…。当刚刚部署了新的代ç†ç‰ˆæœ¬å¹¶ä¸” Kubernetes 正在关闭旧的 Pod 时,å¯èƒ½ä¼šå‘生这ç§æƒ…况。"
msgid "ClusterAgents|There's no activity from the past day"
msgid_plural "ClusterAgents|There's no activity from the past %d days"
@@ -7733,9 +7949,6 @@ msgstr "此代ç†æ²¡æœ‰ä»¤ç‰Œ"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr "è¦åˆ é™¤ä»£ç†ï¼Œè¯·è¾“å…¥ %{name} 进行确认:"
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr "如果è¦å®‰è£…新的代ç†ï¼Œé¦–先需è¦å‘此仓库添加此代ç†çš„é…置文件。%{linkStart}了解更多关于安装 GitLab Agent çš„ä¿¡æ¯ã€‚%{linkEnd}"
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr "由 %{userName} 创建的令牌"
@@ -7757,6 +7970,9 @@ msgstr "我们想è¦äº†è§£ä½ å¯¹ GitLab Agent 的想法。"
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr "什么是 GitLab 代ç†åŠ¨æ€ï¼Ÿ"
+msgid "ClusterAgents|What is default configuration?"
+msgstr "什么是默认é…置?"
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr "关闭此窗å£åŽï¼Œæ‚¨æ— æ³•å†çœ‹åˆ°æ­¤ä»¤ç‰Œã€‚"
@@ -7764,7 +7980,7 @@ msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr "您需è¦åˆ›å»ºä¸€ä¸ªä»¤ç‰Œæ‰èƒ½è¿žæŽ¥åˆ°æ‚¨çš„代ç†"
msgid "ClusterAgents|Your agent version is out of sync with your GitLab version (v%{version}), which might cause compatibility problems. Update the agent installed on your cluster to the most recent version."
-msgstr ""
+msgstr "您的代ç†ç‰ˆæœ¬ä¸Žæ‚¨çš„ GitLab 版本 (v%{version}) ä¸åŒæ­¥ï¼Œè¿™å¯èƒ½ä¼šå¯¼è‡´å…¼å®¹æ€§é—®é¢˜ã€‚将集群上安装的代ç†æ›´æ–°åˆ°æœ€æ–°ç‰ˆæœ¬ã€‚"
msgid "ClusterAgents|Your instance doesn't have the %{linkStart}GitLab Agent Server (KAS)%{linkEnd} set up. Ask a GitLab Administrator to install it."
msgstr "您的实例没有设置 %{linkStart}GitLab 代ç†æœåŠ¡å™¨ (KAS)%{linkEnd} 。è¦æ±‚ GitLab 管ç†å‘˜å®‰è£…它。"
@@ -7799,9 +8015,6 @@ msgstr "API URL应该是有效的 http/https URL。"
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "添加 Kubernetes 集群"
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr "添加Kubernetes集群集æˆ"
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr "å°†Kubernetes集群添加到群组åŽï¼Œç¾¤ç»„中的所有项目都将共享该集群。您å¯ä»¥åœ¨åŒä¸€é›†ç¾¤ä¸Šä½¿ç”¨è¯„审应用ã€éƒ¨ç½²åº”用以åŠè¿è¡Œç¾¤é›†ä¸­æ‰€æœ‰é¡¹ç›®çš„æµæ°´çº¿ã€‚"
@@ -7910,11 +8123,8 @@ msgstr "群集å称为必填项。"
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr "层级中最低且匹é…环境范围的集群将会被使用。例如,项目群集将优先于群组群集。%{linkStart}更多信æ¯%{linkEnd}"
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr "使用è¯ä¹¦è¿žæŽ¥é›†ç¾¤"
-
-msgid "ClusterIntegration|Connect existing cluster"
-msgstr "连接现有集群"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
+msgstr "连接 Kubernetes 集群"
msgid "ClusterIntegration|Connect with a certificate"
msgstr "用è¯ä¹¦è¿žæŽ¥"
@@ -7961,17 +8171,8 @@ msgstr "无法加载å­ç½‘"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "创建Kubernetes集群"
-msgid "ClusterIntegration|Create cluster on"
-msgstr "创建集群于"
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr "创建新集群"
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr "在EKS上创建新集群"
-
-msgid "ClusterIntegration|Create new cluster on GKE"
-msgstr "在GKE上创建新集群"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
+msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "正在创建 Kubernetes 集群"
@@ -8006,6 +8207,9 @@ msgstr "å¯ç”¨æˆ–ç¦ç”¨GitLab与Kubernetes群集的连接。"
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "如果使用基于角色的访问控制(RBAC),请å¯ç”¨æ­¤è®¾ç½®ã€‚"
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr "输入有关您的集群的详细信æ¯ã€‚%{linkStart}如何使用è¯ä¹¦è¿žæŽ¥åˆ°æˆ‘的集群?%{linkEnd}"
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr "输入新的æœåŠ¡ä»¤ç‰Œ"
@@ -8015,6 +8219,9 @@ msgstr "输入Amazon EKS Kubernetes集群的详细信æ¯"
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "输入Kubernetes集群的详细信æ¯"
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr "输入您的 Kubernetes 集群è¯ä¹¦è¯¦ç»†ä¿¡æ¯"
+
msgid "ClusterIntegration|Environment scope"
msgstr "环境范围"
@@ -8078,9 +8285,6 @@ msgstr "群组级集群"
msgid "ClusterIntegration|HTTP Error"
msgstr "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 "如果您正在设置多个群集并使用Auto DevOps,请%{help_link_start}先查阅此处%{help_link_end}。"
-
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
msgstr "如果您ä¸æƒ³åˆ é™¤æ‰€æœ‰ç›¸å…³çš„GitLab资æºï¼Œæ‚¨å¯ä»¥åªåˆ é™¤é›†æˆã€‚"
@@ -8126,8 +8330,8 @@ msgstr "进一步了解 %{help_link_start_machine_type}实例类型%{help_link_e
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr "进一步了解 %{help_link_start}地域%{help_link_end}。"
-msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr "了解更多的Kubernetesä¿¡æ¯"
+msgid "ClusterIntegration|Learn more about Kubernetes."
+msgstr "了解更多关于 Kubernetes çš„ä¿¡æ¯ã€‚"
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
msgstr "了解更多的群组级Kubernetes集群信æ¯"
@@ -8219,9 +8423,6 @@ msgstr "节点数é‡"
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr "节点数必须是数值。"
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr "请输入Kubernetes集群的访问信æ¯ã€‚如需帮助,å¯å‚阅Kubernetes集群的%{linkStart}文档%{linkEnd}"
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "请确ä¿æ‚¨çš„ Google å¸æˆ·ç¬¦åˆä»¥ä¸‹è¦æ±‚:"
@@ -8471,12 +8672,18 @@ msgstr "无法连接"
msgid "ClusterIntegration|Unknown Error"
msgstr "未知错误"
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr "使用 GitLab 部署到您的集群,è¿è¡Œä½œä¸šï¼Œä½¿ç”¨ review app 等等。"
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr "使用 %{linkStart}GitLab 代ç†%{linkEnd} 将您的 Kubernetes 集群安全地连接到 GitLab。您å¯ä»¥éƒ¨ç½²æ‚¨çš„应用程åºã€è¿è¡Œæ‚¨çš„æµæ°´çº¿ã€ä½¿ç”¨ Review Apps 等等。"
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "为此集群使用Cloud Run,Istioå’ŒHTTP负载平衡æ’件。"
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr "在多个集群中使用 AutoDevOps? %{help_link_start}请先阅读此内容。%{help_link_end}"
+
msgid "ClusterIntegration|VPC"
msgstr "VPC"
@@ -8489,8 +8696,8 @@ msgstr "无法验è¯æ‚¨åœ¨ GCP 上的æŸä¸ªé¡¹ç›®æ˜¯å¦å¯ç”¨äº†è®¡è´¹ã€‚请é‡è
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr "我们无法获å–任何项目。请确ä¿æ‚¨åœ¨%{docsLinkStart}Google 云平å°%{docsLinkEnd}上拥有项目。"
-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 "使用与此项目关è”çš„Kubernetes集群,å¯ä»¥æ–¹ä¾¿åœ°ä½¿ç”¨è¯„审应用,部署应用程åºï¼Œè¿è¡Œæµæ°´çº¿ç­‰ç­‰ã€‚"
+msgid "ClusterIntegration|Where do you want to create a cluster?"
+msgstr "您想è¦åœ¨å“ªé‡Œåˆ›å»ºé›†ç¾¤ï¼Ÿ"
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr "您å³å°†åˆ é™¤é›†ç¾¤é›†æˆå’Œä¸Žæ­¤é›†ç¾¤ä¸­GitLab创建的所有资æºã€‚"
@@ -8730,9 +8937,6 @@ msgstr "æ交"
msgid "CommitMessage|Add %{file_name}"
msgstr "添加 %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr "添加 %{file_name} 并创建代ç è´¨é‡ä½œä¸š"
-
msgid "CommitWidget|authored"
msgstr "编辑于"
@@ -8859,6 +9063,9 @@ msgstr "查看开放的åˆå¹¶è¯·æ±‚"
msgid "Complete"
msgstr "完æˆ"
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr "已完æˆ"
@@ -8892,9 +9099,6 @@ msgstr "åˆè§„æµæ°´çº¿é…置(å¯é€‰ï¼‰"
msgid "ComplianceFrameworks|Configuration not found"
msgstr "找ä¸åˆ°é…ç½®"
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr "å·²é…置的åˆè§„框架显示在此处。"
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr "删除åˆè§„框架%{framework}"
@@ -8919,6 +9123,9 @@ msgstr "获å–åˆè§„框架数æ®æ—¶å‡ºé”™ã€‚请刷新页é¢"
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr "获å–åˆè§„框架数æ®æ—¶å‡ºé”™ã€‚请刷新页é¢æˆ–å°è¯•å…¶å®ƒçš„框架"
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr "已添加的框架将出现在此处。"
+
msgid "ComplianceFrameworks|Invalid format"
msgstr "无效格å¼"
@@ -8928,8 +9135,8 @@ msgstr "å称"
msgid "ComplianceFrameworks|Name is required"
msgstr "å称是必需的"
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
-msgstr "未é…ç½®åˆè§„框架"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
+msgstr "尚未设置åˆè§„框架"
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
msgstr "所需格å¼ï¼š %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}。 %{linkStart}了解更多。%{linkEnd}"
@@ -8940,12 +9147,24 @@ msgstr "无法ä¿å­˜æ­¤åˆè§„性框架。请é‡è¯•"
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr "您å³å°†ä»Žæ‰€æœ‰å½“å‰åº”用的项目中永久删除åˆè§„框架 %{framework} ,这å¯èƒ½ä¼šåˆ é™¤å…¶å®ƒåŠŸèƒ½ã€‚æ­¤æ“作无法撤消。"
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr "添加一个框架到 %{linkStart}%{groupName}%{linkEnd} 并将出现在这里。"
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr "在 %{groupName} 中添加框架"
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr "在框架被添加到 %{linkStart}%{groupName}%{linkEnd} 之åŽï¼Œå°†å‡ºçŽ°åœ¨è¿™é‡Œã€‚"
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr "编辑åˆè§„框架"
msgid "ComplianceFramework|New compliance framework"
msgstr "新建åˆè§„框架"
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr "尚未建立åˆè§„框架"
+
msgid "ComplianceReport|Approved by author"
msgstr "由作者批准"
@@ -8968,10 +9187,10 @@ msgid "Confidential"
msgstr "ç§å¯†"
msgid "Confidential issue"
-msgstr ""
+msgstr "机密议题"
msgid "Confidential note"
-msgstr ""
+msgstr "ç§å¯†å¤‡æ³¨"
msgid "Confidentiality"
msgstr "ç§å¯†æ€§"
@@ -8995,10 +9214,10 @@ msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
msgstr "é…ç½® CAPTCHAã€IP 地å€é™åˆ¶å’Œå…¶ä»–å垃圾邮件措施。"
msgid "Configure Container Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings) to customize Container Scanning settings."
-msgstr ""
+msgstr "在 `.gitlab-ci.yml` 使用 GitLab 托管的模æ¿é…置容器扫æ功能。您å¯ä»¥æ·»åŠ è¦†ç›–çš„å˜é‡æ¥è‡ªå®šä¹‰å®¹å™¨æ‰«æ设置。"
msgid "Configure Container Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
-msgstr ""
+msgstr "在 `.gitlab-ci.yml` 中é…置容器扫æ,如果该文件ä¸å­˜åœ¨åˆ™åˆ›å»ºè¯¥æ–‡ä»¶"
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) æ¥è‡ªå®šä¹‰ä¾èµ–项扫æ设置。"
@@ -9007,7 +9226,7 @@ msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if
msgstr "在`.gitlab-ci.yml`中é…ç½®ä¾èµ–扫æ,如果该文件ä¸å­˜åœ¨åˆ™åˆ›å»ºè¯¥æ–‡ä»¶"
msgid "Configure GitLab"
-msgstr ""
+msgstr "é…ç½® GitLab"
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "é…ç½® GitLab Runner 以开始使用Web终端。 %{helpStart}了解更多。%{helpEnd}"
@@ -9054,17 +9273,20 @@ msgstr "调整高级æƒé™ã€å¤§æ–‡ä»¶å­˜å‚¨ã€åŒé‡è®¤è¯å’Œå®¢æˆ·å…³ç³»è®¾ç½®
msgid "Configure existing installation"
msgstr "é…置现有安装"
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr "é…ç½®æµæ°´çº¿ï¼Œå°†ç½‘络应用ã€åŽç«¯æœåŠ¡ã€API å’Œé™æ€èµ„æºéƒ¨ç½²åˆ° Google Cloud"
msgid "Configure region"
-msgstr ""
+msgstr "é…置区域"
msgid "Configure region for environment"
-msgstr ""
+msgstr "为环境é…置区域"
msgid "Configure regions"
-msgstr ""
+msgstr "é…置区域"
msgid "Configure repository mirroring."
msgstr "é…置仓库镜åƒã€‚"
@@ -9099,8 +9321,11 @@ msgstr "通过åˆå¹¶è¯·æ±‚é…ç½®"
msgid "Configure which lists are shown for anyone who visits this board"
msgstr "é…置显示给任何访问此看æ¿çš„人的列表"
+msgid "Configure with a merge request"
+msgstr "使用åˆå¹¶è¯·æ±‚进行é…ç½®"
+
msgid "Configure your environments to be deployed to specific geographical regions"
-msgstr ""
+msgstr "é…置您è¦éƒ¨ç½²åˆ°ç‰¹å®šåœ°ç†åŒºåŸŸçš„环境"
msgid "Confirm"
msgstr "确认"
@@ -9108,6 +9333,9 @@ msgstr "确认"
msgid "Confirm approval"
msgstr "确认批准"
+msgid "Confirm destroy application"
+msgstr "确认销æ¯åº”用程åº"
+
msgid "Confirm new password"
msgstr "确认新密ç "
@@ -9177,6 +9405,12 @@ msgstr "æ­å–œï¼Œæ‚¨çš„å…费试用已激活。"
msgid "Connect"
msgstr "连接"
+msgid "Connect a Kubernetes Cluster"
+msgstr "连接 Kubernetes 集群"
+
+msgid "Connect a cluster"
+msgstr "连接集群"
+
msgid "Connect all repositories"
msgstr "连接所有仓库"
@@ -9296,9 +9530,6 @@ msgstr "正在清ç†ä¸­"
msgid "ContainerRegistry|Cleanup pending"
msgstr "清ç†æŒ‚起中"
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr "清ç†ç­–略现在å¯ç”¨äºŽæ­¤é¡¹ç›®ã€‚ %{linkStart}å•å‡»æ­¤å¤„开始。%{linkEnd}"
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr "ç¦ç”¨æ ‡ç­¾æ¸…ç†ç­–ç•¥"
@@ -9356,8 +9587,8 @@ msgstr "Docker连接错误"
msgid "ContainerRegistry|Enable expiration policy"
msgstr "å¯ç”¨è¿‡æœŸç­–ç•¥"
-msgid "ContainerRegistry|Expiration policy is disabled"
-msgstr "过期策略已ç¦ç”¨"
+msgid "ContainerRegistry|Expiration policy is disabled."
+msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "到期策略将在%{time}åŽè¿è¡Œ"
@@ -9450,6 +9681,9 @@ msgstr "根镜åƒ"
msgid "ContainerRegistry|Run cleanup:"
msgstr "è¿è¡Œæ¸…ç†ï¼š"
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "部分标签未被删除"
@@ -9489,6 +9723,9 @@ msgstr "标签已æˆåŠŸæ ‡è®°ä¸ºå¾…删除。"
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr "标签已æˆåŠŸæ ‡è®°ä¸ºå¾…删除。"
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr "标签暂时ä¸èƒ½æ ‡è®°ä¸ºåˆ é™¤ã€‚请几分钟åŽå†è¯•ã€‚%{docLinkStart}更多详情%{docLinkEnd}。"
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr "匹é…这些规则的标签会被%{strongStart}ä¿ç•™%{strongEnd},å³ä½¿å®ƒä»¬ä¸Žä¸‹é¢çš„删除规则相匹é…。 %{secondStrongStart}最新的%{secondStrongEnd}标签总是会被ä¿ç•™ã€‚"
@@ -9798,6 +10035,9 @@ msgstr "语料库管ç†"
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr "确定è¦åˆ é™¤è¯­æ–™åº“å—?"
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr "动作"
@@ -9805,7 +10045,7 @@ msgid "CorpusManagement|Corpus file"
msgstr "语料库文件"
msgid "CorpusManagement|Corpus files are used in coverage-guided fuzz testing as seed inputs to improve testing."
-msgstr ""
+msgstr "语料库文件用于覆盖率引导的模糊测试,作为ç§å­è¾“å…¥æ¥æ”¹è¿›æµ‹è¯•ã€‚"
msgid "CorpusManagement|Corpus files must be in *.zip format. Maximum 5 GB"
msgstr "语料库文件必须以 *.zip æ ¼å¼ä¸Šä¼ ï¼ˆæœ€å¤§ 5 GB)"
@@ -9834,6 +10074,12 @@ msgstr "最åŽä½¿ç”¨"
msgid "CorpusManagement|Latest Job:"
msgstr "最新作业:"
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr "新上传"
@@ -9849,9 +10095,6 @@ msgstr "è¦ä½¿ç”¨è¿™ä¸ªè¯­æ–™åº“,编辑对应的YAML文件"
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr "总大å°ï¼š %{totalSize}"
-msgid "CorpusMnagement|New corpus"
-msgstr "新建语料库"
-
msgid "Could not add admins as members"
msgstr "无法将管ç†å‘˜æ·»åŠ ä¸ºæˆå‘˜"
@@ -9859,7 +10102,7 @@ msgid "Could not apply %{name} command."
msgstr "无法应用 %{name} 命令。"
msgid "Could not apply %{name} command. %{message}."
-msgstr ""
+msgstr "无法应用 %{name} 命令。 %{message}。"
msgid "Could not authorize chat nickname. Try again!"
msgstr "无法授æƒèŠå¤©æ˜µç§°ã€‚å†è¯•ä¸€æ¬¡ï¼"
@@ -9969,8 +10212,8 @@ msgstr "无法更新 wiki 页é¢"
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr "无法上传您的设计,因为ä¸æ”¯æŒå·²ä¸Šä¼ ä¸€ä¸ªæˆ–多个的文件。"
-msgid "Couldn't assign policy to project"
-msgstr "无法将策略分é…给项目"
+msgid "Couldn't assign policy to project or group"
+msgstr ""
msgid "Country"
msgstr "国家/地区"
@@ -10008,11 +10251,17 @@ msgstr "创建新域"
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr "请先创建一个GitLabå¸æˆ·ï¼Œç„¶åŽå°†å…¶è¿žæŽ¥åˆ°æ‚¨çš„ %{label} å¸æˆ·ã€‚"
+msgid "Create a Kubernetes cluster"
+msgstr "创建 Kubernetes 集群"
+
msgid "Create a Mattermost team for this group"
msgstr "为这个群组创建一个Mattermost团队"
+msgid "Create a cluster"
+msgstr "创建集群"
+
msgid "Create a group"
-msgstr ""
+msgstr "创建群组"
msgid "Create a merge request"
msgstr "创建一个åˆå¹¶ç”³è¯·"
@@ -10039,7 +10288,7 @@ msgid "Create a personal access token on your account to pull or push via %{prot
msgstr "在å¸æˆ·ä¸Šåˆ›å»ºä¸ªäººè®¿é—®ä»¤ç‰Œï¼Œä»¥é€šè¿‡ %{protocol} æ¥æ‹‰å–或推é€ã€‚"
msgid "Create a project"
-msgstr ""
+msgstr "创建项目"
msgid "Create an account using:"
msgstr "使用以下方å¼åˆ›å»ºå¸æˆ·ï¼š"
@@ -10122,9 +10371,6 @@ msgstr "创建新的"
msgid "Create new %{name} by email"
msgstr "通过电å­é‚®ä»¶åˆ›å»ºæ–°çš„ %{name}"
-msgid "Create new CI/CD pipeline"
-msgstr "创建新的 CI/CD æµæ°´çº¿"
-
msgid "Create new Value Stream"
msgstr "创建新价值æµ"
@@ -10149,6 +10395,9 @@ msgstr "创建新标记"
msgid "Create new project"
msgstr "新建项目"
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr "创建或导入您的第一个项目"
@@ -10179,9 +10428,6 @@ msgstr "创建主题"
msgid "Create user"
msgstr "创建用户"
-msgid "Create via merge request"
-msgstr "通过åˆå¹¶è¯·æ±‚创建"
-
msgid "Create wildcard: %{searchTerm}"
msgstr "创建通é…符: %{searchTerm}"
@@ -10405,7 +10651,7 @@ msgid "Creation date"
msgstr "创建日期"
msgid "Creator"
-msgstr ""
+msgstr "创建者"
msgid "Credentials"
msgstr "凭æ®"
@@ -10420,13 +10666,13 @@ msgid "CredentialsInventory|Personal Access Tokens"
msgstr "个人访问令牌"
msgid "CredentialsInventory|Project Access Tokens"
-msgstr ""
+msgstr "项目访问令牌"
msgid "CredentialsInventory|SSH Keys"
msgstr "SSH密钥"
msgid "Credit card required to be on file in order to create a pipeline"
-msgstr ""
+msgstr "信用å¡éœ€è¦å­˜æ¡£æ‰èƒ½åˆ›å»ºæµæ°´çº¿"
msgid "Credit card:"
msgstr "信用å¡ï¼š"
@@ -10434,44 +10680,26 @@ msgstr "信用å¡ï¼š"
msgid "Critical vulnerabilities present"
msgstr "存在严é‡æ¼æ´ž"
-msgid "Crm|Contact has been added"
-msgstr "è”系人已添加"
-
-msgid "Crm|Contact has been updated"
-msgstr "è”系人已更新"
-
-msgid "Crm|Create new contact"
-msgstr "创建新è”系人"
-
-msgid "Crm|Create organization"
-msgstr "创建组织"
+msgid "Crm|Contact has been added."
+msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr "客户关系è”系人"
+msgid "Crm|Contact has been updated."
+msgstr ""
-msgid "Crm|Customer Relations Organizations"
-msgstr "客户关系组织"
+msgid "Crm|Customer relations contacts"
+msgstr ""
-msgid "Crm|Default rate (optional)"
-msgstr "默认速率(å¯é€‰ï¼‰"
+msgid "Crm|Customer relations organizations"
+msgstr ""
-msgid "Crm|Description (optional)"
-msgstr "æè¿° (å¯é€‰)"
+msgid "Crm|Default rate"
+msgstr ""
msgid "Crm|Edit contact"
msgstr "编辑è”系人"
-msgid "Crm|Email"
-msgstr "电å­é‚®ä»¶"
-
-msgid "Crm|First name"
-msgstr "åå­—"
-
-msgid "Crm|Last name"
-msgstr "姓æ°"
-
-msgid "Crm|New Organization"
-msgstr "新建组织"
+msgid "Crm|Edit organization"
+msgstr ""
msgid "Crm|New contact"
msgstr "新建è”系人"
@@ -10485,11 +10713,11 @@ msgstr "找ä¸åˆ°è”系人"
msgid "Crm|No organizations found"
msgstr "未找到组织"
-msgid "Crm|Organization has been added"
-msgstr "组织已添加"
+msgid "Crm|Organization has been added."
+msgstr ""
-msgid "Crm|Phone number (optional)"
-msgstr "电è¯å·ç  (å¯é€‰)"
+msgid "Crm|Organization has been updated."
+msgstr ""
msgid "Cron Timezone"
msgstr "Cron 时区"
@@ -10599,20 +10827,17 @@ msgstr "自定义范围"
msgid "Custom range (UTC)"
msgstr "自定义范围 (UTC)"
-msgid "Customer Relations Contacts"
-msgstr "客户关系è”系人"
-
-msgid "Customer Relations Organizations"
-msgstr "客户关系组织"
-
msgid "Customer experience improvement and third-party offers"
msgstr "客户体验改善和第三方优惠"
msgid "Customer relations"
msgstr "客户关系"
-msgid "Customizable by owners."
-msgstr "由所有者自定义。"
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
+msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
msgstr "自定义 CI/CD 设置,包括 Auto DevOpsã€å…±äº«Runner和作业产物。"
@@ -10740,8 +10965,23 @@ msgstr "应该属于一个群组"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount}项已选择(最大%{maxLabels})"
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr "èšåˆå·²ç¦ç”¨"
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr "èšåˆå·²å¯ç”¨"
+
msgid "CycleAnalytics|Average time to completion"
-msgstr ""
+msgstr "å¹³å‡å®Œæˆæ—¶é—´"
+
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr "创建自定义价值æµï¼ŒæŸ¥çœ‹æœ‰å…³ç‰¹å®šäºŽæ‚¨çš„å¼€å‘æµç¨‹çš„阶段的指标。使用您的价值æµæ¥å¯è§†åŒ–您的 DevSecOps 生命周期,确定您的团队的速度,并识别低效的æµç¨‹ã€‚"
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr "创建自定义价值æµ"
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr "自定义价值æµæ¥è¡¡é‡æ‚¨çš„ DevSecOps 生命周期"
msgid "CycleAnalytics|Date"
msgstr "日期"
@@ -10749,8 +10989,11 @@ msgstr "日期"
msgid "CycleAnalytics|Display chart filters"
msgstr "显示图表筛选器"
+msgid "CycleAnalytics|Filter by stop date"
+msgstr "按åœæ­¢æ—¥æœŸè¿‡æ»¤"
+
msgid "CycleAnalytics|Lead Time for Changes"
-msgstr "å˜æ›´çš„交付时间"
+msgstr "å˜æ›´çš„å‰ç½®æ—¶é—´"
msgid "CycleAnalytics|Number of tasks"
msgstr "任务数"
@@ -10779,32 +11022,38 @@ msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter}
msgstr "显示群组“%{groupName}â€ä»Ž%{createdAfter}到%{createdBefore}çš„æ•°æ®"
msgid "CycleAnalytics|Stage time: %{title}"
-msgstr ""
+msgstr "阶段时间:%{title}"
msgid "CycleAnalytics|Tasks by type"
msgstr "按类型的任务"
msgid "CycleAnalytics|The average time items spent in this stage. Data limited to items completed within this date range."
-msgstr ""
+msgstr "项目在此阶段花费的平å‡æ—¶é—´ã€‚æ•°æ®ä»…é™äºŽåœ¨æ­¤æ—¥æœŸèŒƒå›´å†…完æˆçš„项目。"
msgid "CycleAnalytics|The given date range is larger than 180 days"
msgstr "给定的日期范围大于180天"
msgid "CycleAnalytics|The total time items spent across each value stream stage. Data limited to items completed within this date range."
-msgstr ""
+msgstr "项目在æ¯ä¸ªä»·å€¼æµé˜¶æ®µèŠ±è´¹çš„总时间。数æ®ä»…é™äºŽåœ¨æ­¤æ—¥æœŸèŒƒå›´å†…完æˆçš„项目。"
msgid "CycleAnalytics|There is no data for 'Stage time' available. Adjust the current filters."
-msgstr ""
+msgstr "没有å¯ç”¨çš„“分阶段时间â€æ•°æ®ï¼Œè¯·è°ƒæ•´å½“å‰è¿‡æ»¤å™¨ã€‚"
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
-msgstr ""
+msgstr "没有å¯ç”¨çš„“总时间â€æ•°æ®ï¼Œè¯·è°ƒæ•´å½“å‰è¿‡æ»¤å™¨ã€‚"
+
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr "æ›´æ–°èšåˆçŠ¶æ€æ—¶å‡ºé”™ï¼Œè¯·é‡è¯•ã€‚"
msgid "CycleAnalytics|Total time"
-msgstr ""
+msgstr "总时间"
msgid "CycleAnalytics|Type of work"
msgstr "工作类型"
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr "如果å¯ç”¨ï¼Œç»“果会显示在日期范围内的带有åœæ­¢äº‹ä»¶çš„事项。当ç¦ç”¨æ—¶ï¼Œç»“果会显示在日期范围内的开始事件的事项。"
+
msgid "CycleAnalytics|group dropdown filter"
msgstr "群组下拉列表筛选器"
@@ -10820,12 +11069,12 @@ msgstr "DAGå¯è§†åŒ–至少需è¦3个ä¾èµ–作业。"
msgid "DAST Configuration"
msgstr "DAST é…ç½®"
-msgid "DAST Scans"
-msgstr "DAST 扫æ"
-
msgid "DAST profile not found: %{name}"
msgstr "未找到 DAST é…置文件:%{name}"
+msgid "DAST profiles"
+msgstr ""
+
msgid "DNS"
msgstr "DNS"
@@ -10845,7 +11094,7 @@ msgid "DORA4Metrics|Deployment frequency"
msgstr "部署频率"
msgid "DORA4Metrics|Lead time for changes"
-msgstr ""
+msgstr "å˜æ›´çš„å‰ç½®æ—¶é—´"
msgid "DORA4Metrics|Median (last %{days}d)"
msgstr "中值(最近%{days}天)"
@@ -10914,16 +11163,16 @@ msgid "DastProfiles|AJAX spider"
msgstr "AJAX爬虫"
msgid "DastProfiles|API"
-msgstr ""
+msgstr "API 接å£"
msgid "DastProfiles|API endpoint URL"
-msgstr ""
+msgstr "API 端点 URL"
msgid "DastProfiles|Active"
msgstr "主动"
msgid "DastProfiles|Additional request headers (optional)"
-msgstr ""
+msgstr "é¢å¤–的请求头(å¯é€‰ï¼‰"
msgid "DastProfiles|Are you sure you want to delete this profile?"
msgstr "您确定è¦åˆ é™¤æ­¤é…ç½®å—?"
@@ -10938,7 +11187,7 @@ msgid "DastProfiles|Branch missing"
msgstr "缺少分支"
msgid "DastProfiles|Choose a scan method"
-msgstr ""
+msgstr "选择扫æ方法"
msgid "DastProfiles|Could not create the scanner profile. Please try again."
msgstr "无法创建扫æ工具é…置。请é‡è¯•ã€‚"
@@ -10970,6 +11219,9 @@ msgstr "无法更新扫æ工具é…置。请é‡è¯•ã€‚"
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr "无法更新站点é…置。请é‡è¯•ã€‚"
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr "调试消æ¯"
@@ -11010,13 +11262,13 @@ msgid "DastProfiles|Excluded URLs"
msgstr "排除的URL"
msgid "DastProfiles|Excluded URLs (optional)"
-msgstr ""
+msgstr "排除的 URL(å¯é€‰ï¼‰"
msgid "DastProfiles|Excluded paths"
-msgstr ""
+msgstr "排除的路径"
msgid "DastProfiles|Excluded paths (optional)"
-msgstr ""
+msgstr "排除的路径(å¯é€‰ï¼‰"
msgid "DastProfiles|Hide debug messages"
msgstr "éšè—调试消æ¯"
@@ -11024,9 +11276,6 @@ msgstr "éšè—调试消æ¯"
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr "在DAST控制å°è¾“出中包å«è°ƒè¯•æ¶ˆæ¯ã€‚"
-msgid "DastProfiles|Manage DAST scans"
-msgstr "ç®¡ç† DAST 扫æ"
-
msgid "DastProfiles|Manage profiles"
msgstr "管ç†é…ç½®"
@@ -11082,7 +11331,7 @@ msgid "DastProfiles|Save profile"
msgstr "ä¿å­˜é…ç½®"
msgid "DastProfiles|Scan method"
-msgstr ""
+msgstr "扫æ方法"
msgid "DastProfiles|Scan mode"
msgstr "扫æ模å¼"
@@ -11163,7 +11412,7 @@ msgid "DastProfiles|Website"
msgstr "网站"
msgid "DastProfiles|What does each method do?"
-msgstr ""
+msgstr "æ¯ç§æ–¹æ³•çš„作用是什么?"
msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr "您å¯ä»¥é€‰æ‹©è¢«åŠ¨æ‰«æ或从站点é…置文件管ç†é¡µé¢éªŒè¯ç›®æ ‡ç«™ç‚¹ã€‚ %{docsLinkStart}了解有关站点验è¯çš„更多信æ¯ã€‚%{docsLinkEnd}"
@@ -11172,13 +11421,13 @@ msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
msgstr "ä¸èƒ½å¯¹æœªç»éªŒè¯çš„站点è¿è¡Œä¸»åŠ¨æ‰«æ。"
msgid "DastProfiles|folder/dast_example.har or https://example.com/dast_example.har"
-msgstr ""
+msgstr "folder/dast_example.har 或 https://example.com/dast_example.har"
msgid "DastProfiles|folder/example.postman_collection.json or https://example.com/"
-msgstr ""
+msgstr "folder/example.postman_collection.json 或 https://example.com/"
msgid "DastProfiles|folder/openapi.json or https://example.com/openapi.json"
-msgstr ""
+msgstr "folder/openapi.json 或 https://example.com/openapi.json"
msgid "DastSiteValidation|Copy HTTP header to clipboard"
msgstr "å¤åˆ¶HTTP报头到剪贴æ¿"
@@ -11271,6 +11520,9 @@ msgstr "您将无法对%{url}è¿è¡Œä¸»åŠ¨æ‰«æ。"
msgid "Data is still calculating..."
msgstr "æ•°æ®ä»åœ¨è®¡ç®—中……"
+msgid "Data refresh"
+msgstr "æ•°æ®åˆ·æ–°"
+
msgid "Data type"
msgstr "æ•°æ®ç±»åž‹"
@@ -11287,7 +11539,7 @@ msgid "DatadogIntegration|API URL"
msgstr "API URL"
msgid "DatadogIntegration|Custom tags in Datadog. Enter one tag per line in the %{codeOpen}key:value%{codeClose} format. %{linkOpen}How do I use tags?%{linkClose}"
-msgstr ""
+msgstr "Datadog 中的自定义标签。以 %{codeOpen}key:value%{codeClose} çš„å½¢å¼æ¯è¡Œè¾“入一个标签。%{linkOpen}如何使用标签?%{linkClose}"
msgid "DatadogIntegration|Environment"
msgstr "环境"
@@ -11308,7 +11560,7 @@ msgid "DatadogIntegration|Tag all data from this GitLab instance in Datadog. Use
msgstr "在Datadog中,为æ¥è‡ªæ­¤GitLab实例的所有数æ®æ‰“标签。当管ç†å¤šä¸ªè‡ªåŠ©ç®¡ç†éƒ¨ç½²æ—¶å¾ˆæœ‰ç”¨ã€‚"
msgid "DatadogIntegration|Tags"
-msgstr ""
+msgstr "标签"
msgid "DatadogIntegration|The Datadog site to send data to. To send data to the EU site, use %{codeOpen}datadoghq.eu%{codeClose}."
msgstr "è¦å‘å…¶å‘é€æ•°æ®çš„Datadog站点。è¦å°†æ•°æ®å‘é€åˆ°EU站点,请使用%{codeOpen}datadoghq.eu%{codeClose}。"
@@ -11317,7 +11569,7 @@ msgid "DatadogIntegration|Trace your GitLab pipelines with Datadog."
msgstr "使用Datadog跟踪您的GitLabæµæ°´çº¿ã€‚"
msgid "DatadogIntegration|have an invalid format"
-msgstr ""
+msgstr "æ ¼å¼æ— æ•ˆ"
msgid "Datasource name not found"
msgstr "找ä¸åˆ°æ•°æ®æºå称"
@@ -11400,9 +11652,6 @@ msgstr "默认分支"
msgid "Default branch and protected branches"
msgstr "默认分支和å—ä¿æŠ¤çš„分支"
-msgid "Default branch protection"
-msgstr "默认分支ä¿æŠ¤"
-
msgid "Default delayed project deletion"
msgstr "默认延迟删除项目"
@@ -11421,9 +11670,6 @@ msgstr "æ¯å‘¨çš„默认起始日"
msgid "Default first day of the week in calendars and date pickers."
msgstr "在日期选择器中显示æ¯å‘¨é»˜è®¤çš„起始日。"
-msgid "Default initial branch name"
-msgstr "默认åˆå§‹åˆ†æ”¯å称"
-
msgid "Default project deletion protection"
msgstr "默认项目删除ä¿æŠ¤"
@@ -11461,7 +11707,7 @@ msgid "DefaultBranchProtection|Partially protected"
msgstr "部分ä¿æŠ¤"
msgid "DefaultBranchProtection|Protected against pushes"
-msgstr "ä¿æŠ¤é˜»æ­¢æŽ¨é€ã€‚"
+msgstr "针对推é€ä¿æŠ¤"
msgid "Define a custom deploy freeze pattern with %{cronSyntaxStart}cron syntax%{cronSyntaxEnd}"
msgstr "使用%{cronSyntaxStart}cron语法%{cronSyntaxEnd}定义自定义部署冻结模å¼"
@@ -11560,7 +11806,7 @@ msgid "Delete pipeline"
msgstr "删除æµæ°´çº¿"
msgid "Delete pipeline schedule"
-msgstr ""
+msgstr "删除æµæ°´çº¿è®¡åˆ’"
msgid "Delete project"
msgstr "删除项目"
@@ -11593,7 +11839,7 @@ msgid "Delete this epic and all descendants?"
msgstr "删除此å²è¯—和所有下级?"
msgid "Delete this project"
-msgstr ""
+msgstr "删除此项目"
msgid "Delete user list"
msgstr "删除用户列表"
@@ -11731,7 +11977,7 @@ msgid "Dependencies|Location and dependency path"
msgstr "ä½ç½®å’Œä¾èµ–项路径"
msgid "Dependencies|Packager"
-msgstr "打包程åº"
+msgstr "包管ç†å·¥å…·"
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "%{codeStartTag}dependency_scanning%{codeEndTag} 作业失败,无法生æˆåˆ—表。请确ä¿ä½œä¸šæ­£å¸¸è¿è¡Œå¹¶é‡å¯æµæ°´çº¿ã€‚"
@@ -11848,10 +12094,10 @@ msgid "Deploy to..."
msgstr "部署到 ..."
msgid "DeployBoards|To see deployment progress for your environments, make sure you are deploying to %{codeStart}$KUBE_NAMESPACE%{codeEnd} and annotating with %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} and %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd}."
-msgstr ""
+msgstr "è¦æŸ¥çœ‹æ‚¨çš„环境的部署进度,请确ä¿æ‚¨æ­£åœ¨éƒ¨ç½²åˆ° %{codeStart}$KUBE_NAMESPACE%{codeEnd} 并使用 %{codeStart}app.gitlab.com/app=$CI_PROJECT_PATH_SLUG%{codeEnd} å’Œ %{codeStart}app.gitlab.com/env=$CI_ENVIRONMENT_SLUG%{codeEnd} 进行注释。"
msgid "DeployBoard|Kubernetes Pods"
-msgstr ""
+msgstr "Kubernetes Pods"
msgid "DeployFreeze|Add a freeze period to prevent unintended releases during a period of time for a given environment. You must update the deployment jobs in %{filename} according to the deploy freezes added here. %{freeze_period_link_start}Learn more.%{freeze_period_link_end}"
msgstr "添加冻结期以防止在给定环境的一段时间内æ„外å‘布。您必须根æ®æ­¤å¤„添加的部署冻结更新%{filename}的部署作业。%{freeze_period_link_start}了解更多。%{freeze_period_link_end}"
@@ -11950,7 +12196,7 @@ msgid "DeployTokens|Allows read-only access to the repository."
msgstr "å…许以åªè¯»æƒé™è®¿é—®é•œåƒä»“库。"
msgid "DeployTokens|Allows write access to registry images."
-msgstr ""
+msgstr "å…许写入仓库镜åƒã€‚"
msgid "DeployTokens|Copy deploy token"
msgstr "å¤åˆ¶éƒ¨ç½²ä»¤ç‰Œ"
@@ -12046,55 +12292,82 @@ msgid "Deploying to AWS is easy with GitLab"
msgstr "使用GitLabè½»æ¾éƒ¨ç½²åˆ° AWS"
msgid "Deployment"
-msgstr ""
+msgstr "部署"
msgid "Deployment Frequency"
msgstr "部署频率"
msgid "Deployment Target|Project deployment target (optional)"
-msgstr ""
+msgstr "项目部署目标(å¯é€‰ï¼‰"
msgid "Deployment Target|Select the deployment target"
-msgstr ""
+msgstr "选择部署目标"
msgid "Deployment frequency"
msgstr "部署频率"
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr "当å‰æ‰¹å‡†ï¼š %{current}"
+
+msgid "DeploymentApproval|Approval options"
+msgstr "批准选项"
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr "批准或拒ç»éƒ¨ç½² #%{deploymentIid}"
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr "由 %{user} 于 %{time} 批准"
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr "由您批准于 %{time}"
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr "批准将从部署 #%{deploymentIid}è¿è¡Œæ‰‹åŠ¨ä½œä¸šã€‚æ‹’ç»å°†ä½¿æ‰‹åŠ¨ä½œä¸šå¤±è´¥ã€‚"
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr "部署等级: %{tier}"
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr "环境:%{environment}"
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr "手动作业:%{jobName}"
+
msgid "DeploymentTarget|GitLab Pages"
-msgstr ""
+msgstr "GitLab Pages"
msgid "DeploymentTarget|Heroku"
-msgstr ""
+msgstr "Heroku"
msgid "DeploymentTarget|Infrastructure provider (Terraform, Cloudformation, and so on)"
-msgstr ""
+msgstr "基础设施供应商(如Terraform,Cloudformation等)"
msgid "DeploymentTarget|Kubernetes (GKE, EKS, OpenShift, and so on)"
-msgstr ""
+msgstr "Kubernetes(GKEã€EKSã€OpenShift 等)"
msgid "DeploymentTarget|Managed container runtime (Fargate, Cloud Run, DigitalOcean App)"
-msgstr ""
+msgstr "托管容器è¿è¡Œæ—¶ï¼ˆFargateã€Cloud Runã€DigitalOcean App)"
msgid "DeploymentTarget|Mobile app store"
-msgstr ""
+msgstr "移动应用商店"
msgid "DeploymentTarget|No deployment planned"
-msgstr ""
+msgstr "没有部署计划"
msgid "DeploymentTarget|Other hosting service"
-msgstr ""
+msgstr "其他托管æœåŠ¡"
msgid "DeploymentTarget|Registry (package or container)"
-msgstr ""
+msgstr "仓库(软件包或容器)"
msgid "DeploymentTarget|Self-managed container runtime (Podman, Docker Swarm, Docker Compose)"
-msgstr ""
+msgstr "自助管ç†çš„容器è¿è¡Œæ—¶ï¼ˆPodmanã€Docker Swarmã€Docker Compose)"
msgid "DeploymentTarget|Serverless backend (Lambda, Cloud functions)"
-msgstr ""
+msgstr "æ— æœåŠ¡å™¨åŽç«¯ï¼ˆLambdaã€äº‘函数)"
msgid "DeploymentTarget|Virtual machine (for example, EC2)"
-msgstr ""
+msgstr "虚拟机(例如 EC2)"
msgid "Deployments"
msgstr "部署"
@@ -12121,6 +12394,9 @@ msgstr "失败"
msgid "Deployment|Latest Deployed"
msgstr "最近一次部署"
+msgid "Deployment|Needs Approval"
+msgstr "需è¦æ‰¹å‡†"
+
msgid "Deployment|Running"
msgstr "è¿è¡Œä¸­"
@@ -12134,7 +12410,7 @@ msgid "Deployment|This deployment was created using the API"
msgstr "此部署使用API创建"
msgid "Deployment|Triggerer"
-msgstr ""
+msgstr "触å‘器"
msgid "Deployment|Waiting"
msgstr "等待中"
@@ -12164,16 +12440,16 @@ msgid "Deprecated API rate limits"
msgstr "已弃用的 API 速率é™åˆ¶"
msgid "Deprecations|Feature deprecation and removal"
-msgstr ""
+msgstr "功能弃用和移除"
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
+msgstr "关于å¯èƒ½æ›¿æ¢çš„ä¿¡æ¯ï¼Œ%{epicStart}了解更多关于 Opstrace %{epicEnd}。"
msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr ""
+msgstr "14.7 版本中已弃用指标ã€æ—¥å¿—和跟踪功能,并在 15.0 版本%{epicStart}计划删除%{epicEnd}。"
msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7, and are %{removal_link_start} scheduled for removal %{link_end} in GitLab 15.0. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
+msgstr "14.7 版本中已弃用指标ã€æ—¥å¿—和跟踪功能,在 15.0 版本中%{removal_link_start}计划删除%{link_end},有关å¯èƒ½çš„替æ¢æ–¹æ¡ˆï¼Œ%{opstrace_link_start}了解有关 Opstrace 的更多信æ¯%{link_end}。"
msgid "Deprioritize label"
msgstr "å–消优先标记"
@@ -12420,10 +12696,10 @@ msgid "DevopsAdoption|At least one deploy"
msgstr "至少部署一次"
msgid "DevopsAdoption|At least one issue created"
-msgstr ""
+msgstr "已创建至少一个议题"
msgid "DevopsAdoption|At least one merge request created"
-msgstr ""
+msgstr "已创建至少一个åˆå¹¶è¯·æ±‚"
msgid "DevopsAdoption|At least one pipeline successfully run"
msgstr "至少有一æ¡æµæ°´çº¿è¿è¡ŒæˆåŠŸ"
@@ -12444,7 +12720,7 @@ msgid "DevopsAdoption|DAST enabled for at least one project"
msgstr "至少一个项目å¯ç”¨äº†DAST"
msgid "DevopsAdoption|Dependency Scanning"
-msgstr "ä¾èµ–扫æ"
+msgstr "ä¾èµ–项扫æ"
msgid "DevopsAdoption|Dependency Scanning enabled for at least one project"
msgstr "至少一个项目å¯ç”¨äº†ä¾èµ–扫æ"
@@ -12621,7 +12897,7 @@ msgid "Direct member"
msgstr "直接æˆå‘˜"
msgid "Direct members"
-msgstr ""
+msgstr "直接æˆå‘˜"
msgid "Direct non-authenticated users to this page."
msgstr "将未ç»èº«ä»½éªŒè¯çš„用户定å‘到此页é¢ã€‚"
@@ -12739,7 +13015,7 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] "忽略%d个选定的æ¼æ´žï¼Œå°†å®ƒä»¬å½’类为"
msgid "Dismiss Alert"
-msgstr ""
+msgstr "忽略警报"
msgid "Dismiss merge request promotion"
msgstr "关闭åˆå¹¶è¯·æ±‚推è"
@@ -12765,17 +13041,20 @@ msgstr "在æµæ°´çº¿%{pipelineLink}上忽略"
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr "在%{projectLink} 中的æµæ°´çº¿ %{pipelineLink}上忽略"
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr "显示æ¥è‡ªæ‰€æœ‰é…置的监控工具的警报。"
msgid "Display milestones"
-msgstr ""
+msgstr "显示里程碑"
msgid "Display name"
msgstr "显示å称"
msgid "Display progress of child issues"
-msgstr ""
+msgstr "显示å­è®®é¢˜çš„进度"
msgid "Display rendered file"
msgstr "显示渲染åŽæ–‡ä»¶"
@@ -12822,6 +13101,9 @@ msgstr "域å"
msgid "Domain Name"
msgstr "域å"
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr "还没有账户?"
@@ -12883,7 +13165,7 @@ msgid "Download image"
msgstr "下载图片"
msgid "Download payload"
-msgstr ""
+msgstr "下载负载"
msgid "Download raw data (.csv)"
msgstr "ä¸‹è½½åŽŸå§‹æ•°æ® (.csv)"
@@ -12912,6 +13194,9 @@ msgstr "踩"
msgid "Draft"
msgstr "è‰ç¨¿"
+msgid "Draft: %{filename}"
+msgstr "Draft:%{filename}"
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr "将您的设计拖到此处,或 %{linkStart}点击上传%{linkEnd}。"
@@ -12957,6 +13242,45 @@ msgstr "截止日期"
msgid "Duration"
msgstr "时长"
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "在此过程中,我们会è¦æ±‚您æä¾›æ¥è‡ª GitLab çš„ URL 。请使用下é¢çš„网å€ã€‚"
@@ -13059,11 +13383,8 @@ msgstr "编辑群组:%{group_name}"
msgid "Edit identity for %{user_name}"
msgstr "编辑 %{user_name} 的身份信æ¯"
-msgid "Edit in Web IDE"
-msgstr "在Web IDE中编辑"
-
msgid "Edit in pipeline editor"
-msgstr ""
+msgstr "在æµæ°´çº¿ç¼–辑器中编辑"
msgid "Edit in single-file editor"
msgstr "在å•æ–‡ä»¶ç¼–辑器中编辑"
@@ -13108,7 +13429,7 @@ msgid "Edit your most recent comment in a thread (from an empty textarea)"
msgstr "编辑你在最近主题中的评论(从空白文本区)"
msgid "Edit, lint, and visualize your pipeline."
-msgstr ""
+msgstr "编辑ã€æ•´ç†å’Œå¯è§†åŒ–您的æµæ°´çº¿ã€‚"
msgid "Edited"
msgstr "已编辑"
@@ -13386,6 +13707,9 @@ msgstr "å¯ç”¨è‡ªåŠ¨ä»“库例行维护"
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr "为创建于早于GitLab 12.7版本的项目å¯ç”¨å®¹å™¨è¿‡æœŸå’Œä¿ç•™ç­–略。"
+msgid "Enable container expiration caching."
+msgstr "å¯ç”¨å®¹å™¨è¿‡æœŸç¼“存。"
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr "默认情况下为新创建的群组å¯ç”¨å»¶è¿Ÿé¡¹ç›®åˆ é™¤ã€‚"
@@ -13414,7 +13738,7 @@ msgid "Enable in-product marketing emails"
msgstr "接收产å“è¥é”€ç”µå­é‚®ä»¶"
msgid "Enable incident management inbound alert limit"
-msgstr "å¯ç”¨äº‹ä»¶ç®¡ç†ä¼ å…¥è­¦å‘Šé™åˆ¶"
+msgstr "å¯ç”¨äº‹ä»¶ç®¡ç†å…¥ç«™è­¦æŠ¥é™åˆ¶"
msgid "Enable integration"
msgstr "å¯ç”¨é›†æˆ"
@@ -13435,7 +13759,7 @@ msgid "Enable multipart emails"
msgstr "å¯ç”¨ multipart 邮件"
msgid "Enable only for confidential applications exclusively used by a trusted backend server that can securely store the client secret. Do not enable for native-mobile, single-page, or other JavaScript applications because they cannot keep the client secret confidential."
-msgstr ""
+msgstr "请仅对å¯å®‰å…¨å­˜å‚¨å®¢æˆ·ç«¯ secret çš„å¯ä¿¡ä»»åŽç«¯æœåŠ¡å™¨ä¸“用的安全应用程åºå¯ç”¨ã€‚ä¸è¦ä¸ºåŽŸç”Ÿç§»åŠ¨ã€å•é¡µæˆ–其他 JavaScript 应用程åºå¯ç”¨ï¼Œå› ä¸ºå®ƒä»¬æ— æ³•å°†å®¢æˆ·ç«¯ secret ä¿å¯†ã€‚"
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "å¯ç”¨æˆ–ç¦ç”¨åŒ¿å化数æ®æ”¶é›†."
@@ -13459,7 +13783,7 @@ msgid "Enable security training"
msgstr "å¯ç”¨å®‰å…¨åŸ¹è®­"
msgid "Enable security training to help your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability."
-msgstr ""
+msgstr "å¯ç”¨å®‰å…¨åŸ¹è®­ï¼Œå¸®åŠ©æ‚¨çš„å¼€å‘者们学习如何修å¤æ¼æ´žã€‚å¼€å‘者å¯ä»¥é€šè¿‡æ‚¨é€‰æ‹©çš„培训供应商,选择与检测到的æ¼æ´žç›¸å…³çš„安全培训。"
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr "为该组中的所有项目和å­ç»„å¯ç”¨å…±äº«Runner。"
@@ -13552,7 +13876,7 @@ msgid "Enforce two-factor authentication for all user sign-ins."
msgstr "对所有用户登录强制执行åŒé‡è®¤è¯ã€‚"
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
-msgstr ""
+msgstr "通过将æœåŠ¡å¸æˆ·å¯†é’¥å­˜å‚¨åœ¨ secret 管ç†å™¨ä¸­æ¥å¢žå¼ºå®‰å…¨æ€§ - 了解更多关于 %{docLinkStart}使用 GitLab%{docLinkEnd} 进行 secret 管ç†çš„ä¿¡æ¯"
msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
msgstr "ç¡®ä¿ä»ŽGitLabæœåŠ¡å™¨åˆ°PrometheusæœåŠ¡å™¨çš„连接"
@@ -13615,7 +13939,7 @@ msgid "Enter the code from the two-factor app on your mobile device. If you've l
msgstr "输入移动设备åŒé‡éªŒè¯åº”用æ供的验è¯ç ã€‚如果设备已丢失,您å¯ä»¥è¾“入一个æ¢å¤ç ã€‚"
msgid "Enter the following to confirm:"
-msgstr ""
+msgstr "输入以下内容以确认:"
msgid "Enter the name of your application, and we'll return a unique %{type}."
msgstr "输入您的应用程åºçš„å称,我们会返回唯一的%{type}。"
@@ -13660,8 +13984,8 @@ msgstr "Stages::VariableEndpointInserter需è¦çŽ¯å¢ƒ"
msgid "Environment scope"
msgstr "环境范围"
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
-msgstr "环境å˜é‡ %{code_start}%{environment_variable}%{code_end} ä¸å­˜åœ¨æˆ–未指å‘有效目录。"
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
+msgstr "环境å˜é‡ %{environment_variable} ä¸å­˜åœ¨æˆ–未指å‘有效目录。"
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
msgstr "默认情况下,环境å˜é‡ç”±ç®¡ç†å‘˜é…置为 %{link_start}ä¿æŠ¤%{link_end}"
@@ -13792,6 +14116,9 @@ msgstr "环境"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "环境是指部署代ç çš„ä½ç½®ï¼Œä¾‹å¦‚预å‘布或生产。"
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr "在群集上安装Elastic Stack,以å¯ç”¨é«˜çº§æŸ¥è¯¢åŠŸèƒ½ï¼Œä¾‹å¦‚全文æœç´¢ã€‚"
@@ -13807,9 +14134,6 @@ msgstr "了解更多关于如何终止环境的信æ¯"
msgid "Environments|Logs from %{start} to %{end}."
msgstr "从%{start}到%{end}的日志。"
-msgid "Environments|More information"
-msgstr "更多信æ¯"
-
msgid "Environments|New environment"
msgstr "新建环境"
@@ -13891,8 +14215,11 @@ msgstr "å³å°†éƒ¨ç½²"
msgid "Environments|Updated"
msgstr "更新于"
-msgid "Environments|You don't have any environments right now"
-msgstr "当å‰æœªè®¾ç½®çŽ¯å¢ƒ"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
+msgstr ""
msgid "Environments|by %{avatar}"
msgstr "ç”± %{avatar} æä¾›"
@@ -14263,6 +14590,12 @@ 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"
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr "集æˆé”™è¯¯è·Ÿè¸ª %{epicLinkStart}默认关闭%{epicLinkEnd} 并且ä¸å†å¯¹æ­¤é¡¹ç›®ç”Ÿæ•ˆã€‚为了é‡æ–°å¯ç”¨ç§æœ‰åŒ–部署实例的错误跟踪,您å¯ä»¥%{flagLinkStart}打开功能标志%{flagLinkEnd} 用于集æˆé”™è¯¯è·Ÿè¸ªï¼Œ 或者在您的项目设置页é¢ä¸Šæ供一个 %{settingsLinkStart}Sentry API URL和身份验è¯ä»¤ç‰Œ%{settingsLinkEnd} 。然而,错误跟踪尚未准备就绪用户生产,无法在 SaaS 上å¯ç”¨ã€‚"
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr "集æˆé”™è¯¯è·Ÿè¸ª %{epicLinkStart}默认关闭%{epicLinkEnd} 并且ä¸å†å¯¹æ­¤é¡¹ç›®ç”Ÿæ•ˆã€‚为了é‡æ–°å¯ç”¨ç§æœ‰åŒ–部署实例的错误跟踪,您å¯ä»¥%{flagLinkStart}打开功能标志%{flagLinkEnd} 用于集æˆé”™è¯¯è·Ÿè¸ªï¼Œ 或者在下é¢æ供一个 Sentry API URL和身份验è¯ä»¤ç‰Œ 。然而,错误跟踪尚未准备就绪用户生产,无法在 SaaS 上å¯ç”¨ã€‚"
+
msgid "ErrorTracking|No projects available"
msgstr "æ— å¯ç”¨çš„项目"
@@ -14272,6 +14605,9 @@ msgstr "选择项目"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr "è¦å¯ç”¨é€‰æ‹©çš„项目,请输入有效的身份验è¯ä»¤ç‰Œã€‚"
+msgid "ErrorTracking|View project settings"
+msgstr "查看项目设置"
+
msgid "Errors"
msgstr "错误"
@@ -14282,7 +14618,7 @@ msgid "Errors:"
msgstr "错误:"
msgid "Escalate this incident"
-msgstr ""
+msgstr "å‡çº§æ­¤äº‹ä»¶"
msgid "Escalation Policies"
msgstr "å‡çº§ç­–ç•¥"
@@ -14297,7 +14633,7 @@ msgid "Escalation policies must have at least one rule"
msgstr "å‡çº§ç­–略必须至少有一个规则"
msgid "Escalation policy"
-msgstr ""
+msgstr "å‡çº§ç­–ç•¥"
msgid "Escalation policy:"
msgstr "å‡çº§ç­–略:"
@@ -14510,6 +14846,9 @@ msgstr "使用Hugo创建GitLab Pages站点所需的所有信æ¯"
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr "使用Jekyll创建GitLab Pages站点所需的所有信æ¯"
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr "使用纯HTML创建GitLab Pages网站所需的所有信æ¯"
@@ -14522,6 +14861,9 @@ msgstr "其中的一个%{attributes}是必需的"
msgid "Example: @sub\\.company\\.com$"
msgstr "示例: @sub\\.company\\.com$"
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr "除外(Except)æ¡ä»¶ï¼š"
@@ -14550,7 +14892,7 @@ msgid "Existing sign in methods may be removed"
msgstr "现有的登录方法å¯èƒ½ä¼šè¢«åˆ é™¤"
msgid "Exit."
-msgstr ""
+msgstr "退出。"
msgid "Expand"
msgstr "展开"
@@ -14642,6 +14984,9 @@ msgstr "æµè§ˆç¾¤ç»„"
msgid "Explore groups"
msgstr "æµè§ˆç¾¤ç»„"
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr "æµè§ˆé¡¹ç›®"
@@ -14649,7 +14994,7 @@ msgid "Explore public groups"
msgstr "æµè§ˆå…¬å¼€ç¾¤ç»„"
msgid "Explore public projects"
-msgstr ""
+msgstr "æµè§ˆå…¬å¼€é¡¹ç›®"
msgid "Explore snippets"
msgstr "æµè§ˆä»£ç ç‰‡æ®µ"
@@ -14724,13 +15069,13 @@ msgid "ExternalAuthorizationService|When no classification label is set the defa
msgstr "未设置分类标签的时候,将使用默认的分类标签`%{default_label}`。"
msgid "ExternalAuthorization|Access to projects is validated on an external service using their classification label."
-msgstr ""
+msgstr "项目的访问æƒé€šè¿‡å¤–部æœåŠ¡ä½¿ç”¨å…¶åˆ†ç±»æ ‡è®°è¿›è¡ŒéªŒè¯ã€‚"
msgid "ExternalAuthorization|Certificate used to authenticate with the external authorization service. If blank, the server certificate is validated when accessing over HTTPS."
-msgstr ""
+msgstr "外部授æƒ|用于通过外部授æƒæœåŠ¡è¿›è¡Œèº«ä»½éªŒè¯çš„è¯ä¹¦ã€‚如果为空,则在通过 HTTPS 访问时验è¯æœåŠ¡å™¨è¯ä¹¦ã€‚"
msgid "ExternalAuthorization|Classification label to use when requesting authorization if no specific label is defined on the project."
-msgstr ""
+msgstr "如果项目上未定义特定标记,在请求授æƒæ—¶ä½¿ç”¨çš„分类标记。"
msgid "ExternalAuthorization|Client authorization certificate"
msgstr "客户端授æƒè¯ä¹¦"
@@ -14757,23 +15102,29 @@ msgid "ExternalAuthorization|External classification policy authorization."
msgstr "外部分类策略授æƒã€‚"
msgid "ExternalAuthorization|Passphrase required to decrypt the private key. Encrypted when stored."
-msgstr ""
+msgstr "解密ç§é’¥æ‰€éœ€çš„密ç ã€‚存储时加密。"
msgid "ExternalAuthorization|Period GitLab waits for a response from the external service. If there is no response, access is denied. Default: 0.5 seconds."
-msgstr ""
+msgstr "GitLab 等待外部æœåŠ¡çš„å“应时长。如果没有å“应,访问被拒ç»ã€‚默认:0.5 秒。"
msgid "ExternalAuthorization|Private key of client authentication certificate. Encrypted when stored."
-msgstr ""
+msgstr "客户端身份认è¯è¯ä¹¦çš„ç§é’¥ã€‚存储时加密。"
msgid "ExternalAuthorization|Service URL"
msgstr "æœåŠ¡ URL"
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
-msgstr ""
+msgstr "项目å‘å…¶å‘出授æƒè¯·æ±‚çš„ URL。如果 URL 为空,则跨项目功能å¯ç”¨å¹¶ä¸”ä»å¯ä»¥ä¸ºé¡¹ç›®æŒ‡å®šåˆ†ç±»æ ‡è®°ã€‚"
+
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr "正在使用å¦ä¸€ä¸ªè®®é¢˜è·Ÿè¸ªå™¨"
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr "此处å¯èƒ½ä¸ä¼šæ˜¾ç¤ºæ‰€æœ‰æ•°æ®ï¼Œè¦æŸ¥çœ‹æ›´å¤šè¯¦ç»†ä¿¡æ¯æˆ–对此议题进行更改,请转到 %{linkStart}%{trackerName}%{linkEnd}。"
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr "åªèƒ½å­˜åœ¨ä¸€ä¸ªæœ‰æ•ˆçš„议题跟踪器集æˆã€‚请先ç¦ç”¨å½“å‰æœ‰æ•ˆçš„跟踪器,然åŽé‡è¯•ã€‚"
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr "此议题已与 %{trackerName} åŒæ­¥"
@@ -14812,7 +15163,7 @@ msgid_plural "Failed to archive designs. Please try again."
msgstr[0] "归档设计失败。请é‡è¯•ã€‚"
msgid "Failed to assign a reviewer because no user was specified."
-msgstr ""
+msgstr "由于没有指定用户,无法分é…审核者。"
msgid "Failed to assign a user because no user was found."
msgstr "由于未找到用户,因此无法指派用户。"
@@ -14878,11 +15229,14 @@ msgid "Failed to find import label for Jira import."
msgstr "找ä¸åˆ°ç”¨äºŽJira导入的导入标记。"
msgid "Failed to find users for %{missing}"
-msgstr ""
+msgstr "找ä¸åˆ°ç”¨æˆ· %{missing}"
msgid "Failed to generate export, please try again later."
msgstr "生æˆå¯¼å‡ºå¤±è´¥ï¼Œè¯·ç¨åŽå†è¯•ã€‚"
+msgid "Failed to generate report, please try again after sometime"
+msgstr "生æˆæŠ¥å‘Šå¤±è´¥ï¼Œè¯·ç¨åŽå†è¯•"
+
msgid "Failed to get ref."
msgstr "获å–ref失败。"
@@ -14980,7 +15334,7 @@ msgid "Failed to remove a to-do item for the design."
msgstr "无法删除设计的待办事项。"
msgid "Failed to remove attention because no user was found."
-msgstr ""
+msgstr "由于找ä¸åˆ°ç”¨æˆ·ï¼Œæ— æ³•ç§»é™¤å…³æ³¨ã€‚"
msgid "Failed to remove mirror."
msgstr "删除镜åƒå¤±è´¥ã€‚"
@@ -14995,7 +15349,7 @@ msgid "Failed to remove user key."
msgstr "无法删除用户密钥。"
msgid "Failed to request attention because no user was found."
-msgstr ""
+msgstr "由于找ä¸åˆ°ç”¨æˆ·ï¼Œæ— æ³•è¯·æ±‚关注。"
msgid "Failed to reset key. Please try again."
msgstr "é‡ç½®å¯†é’¥å¤±è´¥ã€‚请é‡è¯•ã€‚"
@@ -15079,7 +15433,7 @@ msgid "Feature Flags"
msgstr "功能标志"
msgid "Feature deprecation and removal"
-msgstr ""
+msgstr "功能弃用和移除"
msgid "Feature flag status"
msgstr "功能标志状æ€"
@@ -15304,8 +15658,8 @@ msgstr "2月"
msgid "February"
msgstr "2月"
-msgid "Fetch and check out the branch for this merge request"
-msgstr "获å–并查看此åˆå¹¶è¯·æ±‚的分支"
+msgid "Fetch and check out this merge request's feature branch:"
+msgstr "获å–并检出这个åˆå¹¶è¯·æ±‚的功能分支:"
msgid "Fetching incoming email"
msgstr "获å–接收邮件地å€"
@@ -15445,9 +15799,6 @@ msgstr "筛选结果..."
msgid "Filter users"
msgstr "过滤用户"
-msgid "Filter your repositories by name"
-msgstr "按å称筛选您的仓库"
-
msgid "Filter..."
msgstr "筛选..."
@@ -15578,7 +15929,7 @@ msgid "For each job, re-use the project workspace. If the workspace doesn't exis
msgstr "对于æ¯ä¸ªä½œä¸šï¼Œé‡æ–°ä½¿ç”¨é¡¹ç›®å·¥ä½œåŒºï¼Œå¦‚果工作区ä¸å­˜åœ¨ï¼Œè¯·ä½¿ç”¨ %{code_open}git clone%{code_close}。"
msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
+msgstr "例如,使用令牌的应用程åºæˆ–令牌的用途。ä¸è¦æ供令牌å称的æ•æ„Ÿä¿¡æ¯ï¼Œå› ä¸ºå®ƒå°†å¯¹æ‰€æœ‰ %{resource_type} æˆå‘˜å¯è§ã€‚"
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "对于大于此é™åˆ¶çš„文件,仅索引文件å,文件内容既ä¸ç¼–入索引也ä¸å¯æœç´¢ã€‚"
@@ -15712,9 +16063,6 @@ msgstr "在您的 .gitlab-ci.yml 中å‘现警告"
msgid "Framework successfully deleted"
msgstr "框架删除æˆåŠŸ"
-msgid "Free"
-msgstr "Free"
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr "å…费试用"
@@ -15742,6 +16090,9 @@ msgstr "从%{code_open}%{source_title}%{code_close}到"
msgid "From %{providerTitle}"
msgstr "%{providerTitle}æºåœ°å€"
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "从创建议题到部署至生产环境"
@@ -15758,7 +16109,7 @@ msgid "Full name"
msgstr "å…¨å"
msgid "GCP region configured"
-msgstr ""
+msgstr "å·²é…ç½® GCP 区域"
msgid "GPG Key ID:"
msgstr "GPG密钥ID:"
@@ -15805,9 +16156,6 @@ msgstr "为您需è¦è®¿é—®GitLab API的应用程åºç”Ÿæˆé¡¹ç›®è®¿é—®ä»¤ç‰Œã€‚"
msgid "Generate site and private keys at"
msgstr "生æˆç«™ç‚¹å’Œç§é’¥åœ¨"
-msgid "Generated service account is linked to the selected environment"
-msgstr "生æˆçš„æœåŠ¡å¸æˆ·ä¸Žæ‰€é€‰çŽ¯å¢ƒç›¸å…³è”"
-
msgid "Generic"
msgstr "通用"
@@ -15839,7 +16187,7 @@ msgid "Geo sites"
msgstr "Geo站点"
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
-msgstr ""
+msgstr "%{boldStart}N/A%{boldEnd}: Geo 尚未验è¯æ­¤ç»„件。请å‚阅 %{linkStart}我们计划支æŒçš„æ•°æ®ç±»åž‹%{linkEnd}。"
msgid "Geo|%{component} synced"
msgstr "%{component} å·²åŒæ­¥"
@@ -15941,7 +16289,7 @@ msgid "Geo|Failed"
msgstr "失败"
msgid "Geo|Filter Geo sites"
-msgstr ""
+msgstr "筛选 Geo 站点"
msgid "Geo|Filter by name"
msgstr "按å称筛选"
@@ -16031,7 +16379,7 @@ msgid "Geo|Offline"
msgstr "离线"
msgid "Geo|Open replications"
-msgstr ""
+msgstr "开放副本"
msgid "Geo|Pending synchronization"
msgstr "å¾…åŒæ­¥"
@@ -16079,7 +16427,7 @@ msgid "Geo|Remove tracking database entry"
msgstr "移除跟踪数æ®åº“æ¡ç›®"
msgid "Geo|Removing a Geo site stops the synchronization to and from that site. Are you sure?"
-msgstr ""
+msgstr "删除 Geo 站点会åœæ­¢ä¸Žè¯¥ç«™ç‚¹çš„åŒæ­¥ã€‚您确定å—?"
msgid "Geo|Replicated data is verified with the secondary site(s) using checksums"
msgstr "å¤åˆ¶çš„æ•°æ®ç”±ä½¿ç”¨æ ¡éªŒå’Œçš„次è¦ç«™ç‚¹éªŒè¯"
@@ -16355,10 +16703,7 @@ msgid "GitLab Issue"
msgstr "GitLab议题"
msgid "GitLab KAS"
-msgstr ""
-
-msgid "GitLab Memberships CSV Export"
-msgstr ""
+msgstr "GitLab KAS"
msgid "GitLab Pages"
msgstr "GitLab Pages"
@@ -16372,6 +16717,9 @@ msgstr "GitLab支æŒæœºå™¨äºº"
msgid "GitLab Team Member"
msgstr "GitLab团队æˆå‘˜"
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr "GitLab用户"
@@ -16409,7 +16757,7 @@ msgid "GitLab is a single application for the entire software development lifecy
msgstr "GitLab是æœåŠ¡äºŽæ•´ä¸ªè½¯ä»¶å¼€å‘生命周期的å•ä¸€åº”用程åºã€‚从项目规划和æºç ç®¡ç†åˆ°CI/CDã€ç›‘控和安全。"
msgid "GitLab is free to use. Many features for larger teams are part of our %{link_start}paid products%{link_end}. You can try Ultimate for free without any obligation or payment details."
-msgstr ""
+msgstr "GitLab å¯ä»¥å…费使用。大型团队的许多功能是我们 %{link_start}付费产å“%{link_end} 的一部分。您å¯ä»¥å…费试用 Ultimate,无需任何义务或付款细节。"
msgid "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later."
msgstr "GitLab正在为该域获å–Let's Encrypt SSLè¯ä¹¦ã€‚这个过程å¯èƒ½éœ€è¦ä¸€äº›æ—¶é—´ã€‚请ç¨åŽå†è¯•ã€‚"
@@ -16423,9 +16771,6 @@ msgstr "GitLab 正在进行维护并以åªè¯»æ¨¡å¼è¿è¡Œã€‚"
msgid "GitLab logo"
msgstr "GitLab logo"
-msgid "GitLab member or Email address"
-msgstr "GitLabæˆå‘˜æˆ–电å­é‚®ä»¶åœ°å€"
-
msgid "GitLab metadata URL"
msgstr "GitLab å…ƒæ•°æ® URL"
@@ -16538,7 +16883,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 subdomains of subdomains. If your namespace or groupname contains a dot, it does not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages work if you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "当在 GitLab 实例 (%{pages_host})的一般域å下使用 Pages 时,您ä¸èƒ½ä½¿ç”¨ HTTPS 与å­åŸŸçš„å­åŸŸå。 如果您的命å空间或群组å称包å«ä¸€ä¸ªç‚¹ï¼Œè¯¥å称无效。这是一个 HTTP On 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}"
@@ -16604,7 +16949,7 @@ msgid "Gitpod|The URL to your Gitpod instance configured to read your GitLab pro
msgstr "é…ç½®ä¸ºè¯»å– GitLab 项目的 Gitpod 实例的 URL,例如 https://gitpod.example.com。"
msgid "Gitpod|To use Gitpod you must first enable the feature in the integrations section of your %{linkStart}user preferences%{linkEnd}."
-msgstr ""
+msgstr "è¦ä½¿ç”¨ Gitpod,您必须首先在您的%{linkStart}用户å好设置%{linkEnd}的集æˆéƒ¨åˆ†ä¸­å¯ç”¨è¯¥åŠŸèƒ½ã€‚"
msgid "Gitpod|To use the integration, each user must also enable Gitpod on their GitLab account. %{link_start}How do I enable it?%{link_end} "
msgstr "è¦ä½¿ç”¨é›†æˆï¼Œæ¯ä¸ªç”¨æˆ·è¿˜å¿…须在其 GitLab è´¦å·ä¸Šå¯ç”¨ Gitpod。 %{link_start}如何å¯ç”¨å®ƒï¼Ÿ%{link_end} "
@@ -16651,15 +16996,24 @@ msgstr "结果已更新, %{count} 个结果å¯ç”¨ï¼Œä½¿ç”¨ä¸Šä¸‹ç®­å¤´é”®æµè§
msgid "GlobalSearch|Search GitLab"
msgstr "æœç´¢ GitLab"
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr "æœç´¢é¡¹ç›®ã€è®®é¢˜ç­‰ã€‚"
+
msgid "GlobalSearch|Search results are loading"
msgstr "æœç´¢ç»“果正在加载中"
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr "获å–æœç´¢è‡ªåŠ¨å®Œæˆå»ºè®®æ—¶å‡ºé”™ã€‚"
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr "输入并按回车键æ交æœç´¢ã€‚"
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr "新建议在下é¢æ˜¾ç¤ºã€‚"
+msgid "GlobalSearch|What are you searching for?"
+msgstr "您正在æœç´¢ä»€ä¹ˆï¼Ÿ"
+
msgid "GlobalSearch|in all GitLab"
msgstr "在整个 GitLab 实例中"
@@ -16699,6 +17053,9 @@ msgstr "转到定义"
msgid "Go to environments"
msgstr "转到环境"
+msgid "Go to environments page to approve or reject"
+msgstr "转到环境页é¢æ‰¹å‡†æˆ–æ‹’ç»"
+
msgid "Go to epic"
msgstr "转到å²è¯—"
@@ -16825,9 +17182,6 @@ msgstr "Google Cloud 项目"
msgid "Google Cloud authorizations required"
msgstr "éœ€è¦ Google Cloud 授æƒ"
-msgid "Google Cloud project"
-msgstr "Google Cloud 项目"
-
msgid "Google Cloud project misconfigured"
msgstr "Google Cloud 项目é…置错误"
@@ -16837,6 +17191,42 @@ msgstr "éœ€è¦ Google Cloud 项目"
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "谷歌的身份验è¯æœª%{link_start}正确é…ç½®%{link_end}。如需使用这项æœåŠ¡ï¼Œè¯·è”ç³»GitLab管ç†å‘˜ã€‚"
+msgid "GoogleCloud|Cancel"
+msgstr "å–消"
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr "å·²é…置的区域已链接到所选分支或标签"
+
+msgid "GoogleCloud|Create service account"
+msgstr "创建æœåŠ¡å¸æˆ·"
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr "已生æˆçš„æœåŠ¡å¸æˆ·å·²é“¾æŽ¥åˆ°æ‰€é€‰åˆ†æ”¯æˆ–标签"
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr "Google Cloud 项目"
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr "Google OAuth2 令牌撤销请求失败"
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr "已请求 Google OAuth2 令牌撤消"
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr "我了解管ç†æœåŠ¡å¸æˆ·å¯†é’¥æ‰€æ¶‰åŠçš„èŒè´£"
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr "为选定的 Google Cloud 项目生æˆæ–°çš„æœåŠ¡å¸æˆ·"
+
+msgid "GoogleCloud|Refs"
+msgstr "Refs"
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr "撤销授æƒ"
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr "撤销授予 GitLab 的授æƒï¼Œä¸ä¼šä½¿æœåŠ¡å¸æˆ·å¤±æ•ˆã€‚"
+
msgid "Got it"
msgstr "知é“了"
@@ -16931,7 +17321,7 @@ msgid "Group URL"
msgstr "群组URL"
msgid "Group access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "群组访问令牌创建已ç¦ç”¨ã€‚您ä»ç„¶å¯ä»¥ä½¿ç”¨å’Œç®¡ç†çŽ°æœ‰ä»¤ç‰Œã€‚ %{link_start}了解更多信æ¯ã€‚%{link_end}"
msgid "Group application: %{name}"
msgstr "群组应用程åºï¼š%{name}"
@@ -17041,9 +17431,6 @@ msgstr "群组Runner"
msgid "Group runners can be managed with the %{link}."
msgstr "群组 Runner å¯ä»¥ä½¿ç”¨ %{link} 管ç†ã€‚"
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr "群组共享æ供对所有群组æˆå‘˜ï¼ˆåŒ…括从上级群组继承群组æˆå‘˜èµ„格的æˆå‘˜ï¼‰çš„访问。"
-
msgid "Group variables (inherited)"
msgstr "群组å˜é‡ (继承)"
@@ -17063,7 +17450,7 @@ msgid "Group: %{name}"
msgstr "群组: %{name}"
msgid "GroupActivityMetrics|Issues created"
-msgstr ""
+msgstr "议题已创建"
msgid "GroupActivityMetrics|Last 90 days"
msgstr "过去 90 天"
@@ -17072,7 +17459,7 @@ msgid "GroupActivityMetrics|Members added"
msgstr "添加新æˆå‘˜æ•°"
msgid "GroupActivityMetrics|Merge Requests created"
-msgstr ""
+msgstr "åˆå¹¶è¯·æ±‚已创建"
msgid "GroupActivityMetrics|Recent activity"
msgstr "最近活动"
@@ -17336,7 +17723,7 @@ msgid "GroupSettings|Allow project and group access token creation"
msgstr "å…许项目和群组访问令牌创建"
msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
+msgstr "å…许创建组织和è”系人,并将它们与议题相关è”。"
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr "应用到所有å­ç¾¤ç»„,除éžè¢«ç¾¤ç»„所有者覆盖。已添加到项目的群组将失去访问æƒé™ã€‚"
@@ -17363,7 +17750,7 @@ msgid "GroupSettings|Changing a group's URL can have unintended side effects."
msgstr "更改群组 URL å¯èƒ½ä¼šäº§ç”Ÿæ„外的副作用。"
msgid "GroupSettings|Choose a group path that does not start with a dash or end with a period. It can also contain alphanumeric characters and underscores."
-msgstr ""
+msgstr "选择一个群组路径,ä¸èƒ½ä»¥ç ´æŠ˜å·å¼€å¤´æˆ–以å¥å·ç»“尾,å¯ä»¥åŒ…å«å­—æ¯æ•°å­—字符和下划线。"
msgid "GroupSettings|Compliance frameworks"
msgstr "åˆè§„框架"
@@ -17399,7 +17786,7 @@ msgid "GroupSettings|If not specified at the group or instance level, the defaul
msgstr "如果未在群组或实例级别指定,则默认为 %{default_initial_branch_name}。ä¸å½±å“现有仓库。"
msgid "GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
-msgstr ""
+msgstr "如果父组的å¯è§æ€§ä½ŽäºŽè¯¥ç»„的当å‰å¯è§æ€§ï¼Œåˆ™å­ç»„和项目的å¯è§æ€§çº§åˆ«å°†æ›´æ”¹ï¼ŒåŒ¹é…新父组的å¯è§æ€§ã€‚"
msgid "GroupSettings|New runners registration token has been generated!"
msgstr "已生æˆæ–°çš„Runner注册令牌ï¼"
@@ -17446,15 +17833,15 @@ msgstr "选择父组"
msgid "GroupSettings|Select the project that contains your custom Insights file."
msgstr "选择包å«è‡ªå®šä¹‰Insight文件的项目。"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
+msgstr "设置群组中创建的新仓库的默认分支的åˆå§‹å称和ä¿æŠ¤ã€‚"
+
msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr "为该群组设置GitLab Pages的最大大å°ã€‚ %{link_start}了解更多。%{link_end}"
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr "如果找ä¸åˆ°æ›¿ä»£ CI é…置文件,则Auto DevOps æµæ°´çº¿å°†è¿è¡Œã€‚"
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
-msgstr "群组中创建的新仓库的åˆå§‹åˆ†æ”¯çš„默认å称。"
-
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
msgstr "å¯ä»¥é€‰æ‹©è¯¥å­ç»„中的项目作为该组中创建的新项目的模æ¿ã€‚ %{link_start}了解更多。%{link_end}"
@@ -17477,7 +17864,7 @@ msgid "GroupSettings|Transfer group"
msgstr "转移群组"
msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group."
-msgstr ""
+msgstr "用户å¯ä»¥åœ¨è¯¥ç¾¤ç»„中创建 %{link_start_project}项目访问令牌%{link_end} å’Œ %{link_start_group}群组访问令牌%{link_end}。"
msgid "GroupSettings|What are badges?"
msgstr "什么是徽章?"
@@ -17516,10 +17903,10 @@ msgid "Groups and projects"
msgstr "群组和项目"
msgid "Groups are a great way to organize projects and people."
-msgstr ""
+msgstr "群组是组织项目和人员的好方法。"
msgid "Groups are the best way to manage projects and members."
-msgstr ""
+msgstr "群组是管ç†é¡¹ç›®å’Œæˆå‘˜çš„最佳方å¼ã€‚"
msgid "Groups to synchronize"
msgstr "需åŒæ­¥çš„群组"
@@ -17575,6 +17962,9 @@ msgstr "创建群组"
msgid "GroupsNew|Create new group"
msgstr "创建新的群组"
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr "在æºå®žä¾‹çš„ %{pat_link_start}用户设置%{pat_link_end} 中创建。出于 %{short_living_link_start}安全原因%{short_living_link_end},在创建令牌时使用较短的到期日期。"
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr "导出群组åŠå…¶æ‰€æœ‰ç›¸å…³æ•°æ®å¹¶ç§»åŠ¨åˆ°æ–°çš„ GitLab 实例。"
@@ -17593,9 +17983,6 @@ msgstr "从å¦ä¸€ä¸ªGitLab实例导入群组"
msgid "GroupsNew|My Awesome Group"
msgstr "My Awesome Group"
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr "导航到用户设置以查找您的 %{link_start}个人访问令牌%{link_end}。"
-
msgid "GroupsNew|No import options available"
msgstr "æ— å¯ç”¨çš„导入选项"
@@ -17615,7 +18002,7 @@ msgid "GroupsNew|Provide credentials for another instance of GitLab to import yo
msgstr "为å¦ä¸€ä¸ª GitLab 实例æ供凭æ®ä»¥ç›´æŽ¥å¯¼å…¥æ‚¨çš„群组。"
msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}group migration%{docs_link_end}."
-msgstr ""
+msgstr "此功能已弃用并由%{docs_link_start}群组è¿ç§»%{docs_link_end}å–代。"
msgid "GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here."
msgstr "è¦å¯¼å…¥ç¾¤ç»„,请导航到 GitLab æºå®žä¾‹çš„群组设置, %{link_start}生æˆå¯¼å‡ºæ–‡ä»¶%{link_end},然åŽåœ¨æ­¤å¤„上传。"
@@ -17630,16 +18017,16 @@ msgid "GroupsTree|Are you sure you want to leave the \"%{fullName}\" group?"
msgstr "您确定è¦é€€å‡ºç¾¤ç»„“%{fullName}â€å—?"
msgid "GroupsTree|Delete"
-msgstr ""
+msgstr "删除"
msgid "GroupsTree|Edit"
-msgstr ""
+msgstr "编辑"
msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
msgstr "无法退出群组。请确ä¿æ‚¨ä¸æ˜¯å”¯ä¸€çš„群组所有者。"
msgid "GroupsTree|Leave group"
-msgstr ""
+msgstr "离开群组"
msgid "GroupsTree|Loading groups"
msgstr "加载群组中"
@@ -17651,55 +18038,55 @@ msgid "GroupsTree|No groups or projects matched your search"
msgstr "没有任何群组或项目符åˆæ‚¨çš„æœç´¢"
msgid "GroupsTree|Options"
-msgstr ""
+msgstr "选项"
msgid "GroupsTree|Search by name"
msgstr "按å称æœç´¢"
msgid "Groups|Avatar will be removed. Are you sure?"
-msgstr ""
+msgstr "å³å°†åˆ é™¤å¤´åƒã€‚确定继续å—?"
msgid "Groups|Changing group URL can have unintended side effects."
-msgstr ""
+msgstr "更改群组 URL å¯èƒ½ä¼šæœ‰éžé¢„期åŽæžœã€‚"
msgid "Groups|Checking group URL availability..."
-msgstr ""
+msgstr "正在检查群组 URL 是å¦å¯ç”¨..."
msgid "Groups|Enter a descriptive name for your group."
-msgstr ""
+msgstr "请为群组填写一个æ述性的å称。"
msgid "Groups|Group ID"
-msgstr ""
+msgstr "群组 ID"
msgid "Groups|Group URL"
-msgstr ""
+msgstr "群组 URL"
msgid "Groups|Group avatar"
-msgstr ""
+msgstr "群组头åƒ"
msgid "Groups|Group description (optional)"
-msgstr ""
+msgstr "群组æ述(å¯é€‰ï¼‰"
msgid "Groups|Group name"
-msgstr ""
+msgstr "群组å称"
msgid "Groups|Group path is available."
-msgstr ""
+msgstr "群组路径å¯ç”¨ã€‚"
msgid "Groups|Group path is unavailable. Path has been replaced with a suggested available path."
-msgstr ""
+msgstr "群组路径ä¸å¯ç”¨ï¼Œå·²æ›¿æ¢ä¸ºå»ºè®®çš„å¯ç”¨è·¯å¾„。"
msgid "Groups|Learn more"
-msgstr ""
+msgstr "了解更多"
msgid "Groups|Must start with letter, digit, emoji, or underscore. Can also contain periods, dashes, spaces, and parentheses."
-msgstr ""
+msgstr "组å必须以字æ¯ã€æ•°å­—ã€è¡¨æƒ…或下划线开头,å¯ä»¥åŒ…å«å¥ç‚¹ã€ç ´æŠ˜å·ã€ç©ºæ ¼å’Œæ‹¬å·ã€‚"
msgid "Groups|Remove avatar"
-msgstr ""
+msgstr "删除头åƒ"
msgid "Groups|Save changes"
-msgstr ""
+msgstr "ä¿å­˜æ›´æ”¹"
msgid "Guideline"
msgstr "å‚考"
@@ -17711,11 +18098,112 @@ msgid "HAR file path or URL"
msgstr "HAR 文件路径或 URL"
msgid "HTTP Archive (HAR)"
-msgstr ""
+msgstr "HTTP 存档(HAR)"
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr "HTTP Basic:访问被拒ç»\\n您必须使用具有'api'æƒé™çš„个人访问令牌。\\n您å¯ä»¥åœ¨ %{profile_personal_access_tokens_url}中生æˆä¸€ä¸ª"
+msgid "Harbor Registry"
+msgstr "Harbor é•œåƒåº“"
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr "å¯ç”¨ Harbor 集æˆåŽï¼Œå°†åˆ›å»ºå…¨å±€å˜é‡ “$HARBOR_USERNAMEâ€ã€â€œ$HARBOR_PASSWORDâ€ã€â€œ$HARBOR_URLâ€å’Œ “$HARBOR_PROJECT†供 CI/CD 使用。"
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr "Harbor 实例的基础 URL。"
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr "输入 Harbor 密ç "
+
+msgid "HarborIntegration|Harbor URL"
+msgstr "Harbor URL"
+
+msgid "HarborIntegration|Harbor password"
+msgstr "Harbor 密ç "
+
+msgid "HarborIntegration|Harbor project name"
+msgstr "Harbor 项目å称"
+
+msgid "HarborIntegration|Harbor username"
+msgstr "Harbor 用户å"
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr "您的 Harbor 用户å的密ç ã€‚"
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr "Harbor 中的项目å称。"
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr "使用 Harbor 作为该项目的容器镜åƒåº“。"
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr "å¯ç”¨å“ˆå¸Œå­˜å‚¨åŽæ‰èƒ½ä½¿ç”¨ Geo"
@@ -17885,6 +18373,9 @@ msgstr "éšè—有效数æ®"
msgid "Hide shared projects"
msgstr "éšè—共享项目"
+msgid "Hide thread"
+msgstr "éšè—主题"
+
msgid "Hide tooltips or popovers"
msgstr "éšè—工具æ示或弹出窗å£"
@@ -17899,13 +18390,13 @@ msgid "Hierarchy|Current structure"
msgstr "当å‰ç»“æž„"
msgid "Hierarchy|Deliver value more efficiently by breaking down necessary work into a hierarchical structure. This structure helps teams understand scope, priorities, and how work cascades up toward larger goals."
-msgstr ""
+msgstr "通过将必è¦çš„工作分解为层次结构,更有效地交付价值。这ç§ç»“构有助于团队了解范围ã€ä¼˜å…ˆçº§ä»¥åŠå·¥ä½œå¦‚何é€æ­¥å®žçŽ°æ›´å¤§çš„目标。"
msgid "Hierarchy|Help us improve work items in GitLab!"
msgstr "帮助我们改进 GitLab 中的工作项ï¼"
msgid "Hierarchy|Is there a framework or type of work item you wish you had access to in GitLab? Give us your feedback and help us build the experiences valuable to you."
-msgstr ""
+msgstr "是å¦æœ‰æ‚¨å¸Œæœ›åœ¨ GitLab 中访问的框架或工作项类型?给我们您的å馈并帮助我们建立对您有价值的体验。"
msgid "Hierarchy|Planning hierarchy"
msgstr "规划结构"
@@ -18033,9 +18524,6 @@ msgstr "æˆ‘æŽ¥å— %{terms_link}"
msgid "I forgot my password"
msgstr "我忘记了密ç "
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr "我ç†è§£ç®¡ç†æœåŠ¡è´¦æˆ·å¯†é’¥æ‰€æ¶‰åŠçš„责任"
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr "我想探索 GitLab,看看是å¦å€¼å¾—切æ¢åˆ°è¿™é‡Œ"
@@ -18111,9 +18599,6 @@ msgstr "ä¿¡æ¯ï¼šæ‚¨çš„SSH密钥已过期。请生æˆä¸€ä¸ªæ–°å¯†é’¥ã€‚"
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr "ä¿¡æ¯ï¼šæ‚¨çš„SSH密钥å³å°†è¿‡æœŸã€‚请生æˆä¸€ä¸ªæ–°å¯†é’¥ã€‚"
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr "IP地å€"
@@ -18139,10 +18624,10 @@ msgid "Identities"
msgstr "身份标识"
msgid "IdentityVerification|Before you create your first project, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
-msgstr ""
+msgstr "在您创建第一个项目之å‰ï¼Œæˆ‘们需è¦æ‚¨ä½¿ç”¨æœ‰æ•ˆçš„付款方å¼éªŒè¯æ‚¨çš„身份。在此步骤中ä¸ä¼šå‘您收费。如果我们需è¦å‘您收费,我们会通知您。"
msgid "IdentityVerification|Before you create your group, we need you to verify your identity with a valid payment method. You will not be charged during this step. If we ever need to charge you, we will let you know."
-msgstr ""
+msgstr "在您创建群组之å‰ï¼Œæˆ‘们需è¦æ‚¨ä½¿ç”¨æœ‰æ•ˆçš„付款方å¼éªŒè¯æ‚¨çš„身份。在此步骤中ä¸ä¼šå‘您收费。如果我们需è¦å‘您收费,我们会通知您。"
msgid "IdentityVerification|Create a project"
msgstr "创建项目"
@@ -18151,7 +18636,7 @@ msgid "IdentityVerification|Verify your identity"
msgstr "验è¯æ‚¨çš„身份"
msgid "IdentityVerification|You can always verify your account at a later time to create a group."
-msgstr ""
+msgstr "您å¯ä»¥ç¨åŽéšæ—¶éªŒè¯æ‚¨çš„å¸æˆ·ï¼Œæ¥åˆ›å»ºä¸€ä¸ªç¾¤ç»„。"
msgid "If any indexed field exceeds this limit, it is truncated to this number of characters. The rest of the content is neither indexed nor searchable. This does not apply to repository and wiki indexing. For unlimited characters, set this to 0."
msgstr "如果任何索引字段超过此é™åˆ¶ï¼Œåˆ™å°†å…¶æˆªæ–­ä¸ºæ­¤å­—符数。其余内容既ä¸ç¼–入索引也ä¸å¯æœç´¢ã€‚è¿™ä¸é€‚用于仓库和 wiki 索引。对于无é™å­—符,将此设置为 0。"
@@ -18211,7 +18696,7 @@ msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be
msgstr "如果将%{codeStart}needs%{codeEnd}加到æµæ°´çº¿çš„作业里é¢ï¼Œæ‚¨å°†å¯ä»¥åœ¨%{linkStart}有å‘无环图 (DAG)%{linkEnd}页é¢çœ‹åˆ°ä½œä¸šä¹‹é—´çš„%{codeStart}needs%{codeEnd}关系。"
msgid "If you are added to a project, it will be displayed here."
-msgstr ""
+msgstr "如果您被添加到项目中,将显示在此处。"
msgid "If you did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr "如果您没有å‘起这些登录å°è¯•ï¼Œè¯·è”系您的管ç†å‘˜æˆ–在您的å¸æˆ·ä¸Šå¯ç”¨åŒé‡èº«ä»½éªŒè¯ï¼ˆ2FA)。"
@@ -18243,6 +18728,12 @@ msgstr "如果您想è¦é‡æ–°å¯ç”¨åŒé‡èº«ä»½éªŒè¯ï¼Œè¯·è®¿é—®%{two_factor_li
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr "如果您想è¦é‡æ–°å¯ç”¨åŒé‡èº«ä»½éªŒè¯ï¼Œè¯·è®¿é—®%{settings_link_to}页é¢ã€‚"
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr "如果您已购买或续订订阅并拥有激活ç ï¼Œè¯·åœ¨ä¸‹æ–¹è¾“入激活ç ä»¥å¼€å§‹æ¿€æ´»è¿‡ç¨‹ã€‚"
@@ -18311,8 +18802,8 @@ msgstr "导入一个从GitLab导出的项目"
msgid "Import and export rate limits"
msgstr "导入/导出速率é™åˆ¶"
-msgid "Import failed due to a GitHub error: %{original}"
-msgstr "由于GitHub错误,导入失败: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
+msgstr ""
msgid "Import from"
msgstr "导入自"
@@ -18341,12 +18832,6 @@ msgstr "导入进行中。刷新页é¢ä»¥æŸ¥çœ‹æ–°æ·»åŠ çš„议题。"
msgid "Import issues"
msgstr "导入议题"
-msgid "Import members"
-msgstr "导入æˆå‘˜"
-
-msgid "Import members from another project"
-msgstr "从å¦ä¸€ä¸ªé¡¹ç›®å¯¼å…¥æˆå‘˜"
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr "通过上传manifest文件导入多个仓库"
@@ -18356,9 +18841,6 @@ msgstr "导入项目"
msgid "Import project from"
msgstr "导入项目自"
-msgid "Import project members"
-msgstr "导入项目æˆå‘˜"
-
msgid "Import projects from Bitbucket"
msgstr "从Bitbucket导入项目"
@@ -18517,13 +18999,13 @@ msgid "InProductMarketing|3 ways to dive into GitLab CI/CD"
msgstr "深入了解 GitLab CI/CD çš„ 3 ç§æ–¹æ³•"
msgid "InProductMarketing|A single application eliminates complex integrations, data chokepoints, and toolchain maintenance, resulting in greater productivity and lower cost."
-msgstr ""
+msgstr "å•ä¸€åº”用程åºæ¶ˆé™¤äº†å¤æ‚的集æˆã€æ•°æ®æ‚务和工具链维护,使得生产力æ高和æˆæœ¬é™ä½Žã€‚"
msgid "InProductMarketing|Access advanced features, build more efficiently, strengthen security and compliance."
-msgstr ""
+msgstr "访问高级功能,更有效地构建,加强安全和åˆè§„。"
msgid "InProductMarketing|Access advanced features."
-msgstr ""
+msgstr "访问高级功能。"
msgid "InProductMarketing|Actually, GitLab makes the team work (better)"
msgstr "实际上,GitLab 使团队能够工作更好"
@@ -18532,7 +19014,7 @@ msgid "InProductMarketing|And finally %{deploy_link} a Python application."
msgstr "æœ€åŽ %{deploy_link} 一个 Python 应用程åºã€‚"
msgid "InProductMarketing|And many more..."
-msgstr ""
+msgstr "还有更多..."
msgid "InProductMarketing|Are your runners ready?"
msgstr "您的Runner准备好了å—?"
@@ -18553,10 +19035,10 @@ msgid "InProductMarketing|Blog"
msgstr "åšå®¢"
msgid "InProductMarketing|Break down silos to coordinate seamlessly across development, operations, and security with a consistent experience across the development lifecycle."
-msgstr ""
+msgstr "打破孤岛,在开å‘ã€è¿è¥å’Œå®‰å…¨ä¹‹é—´æ— ç¼å调,在整个开å‘生命周期中æ供一致的体验。"
msgid "InProductMarketing|Burn up/down charts"
-msgstr ""
+msgstr "燃起/燃尽图"
msgid "InProductMarketing|By enabling code owners and required merge approvals the right person will review the right MR. This is a win-win: cleaner code and a more efficient review process."
msgstr "通过å¯ç”¨ä»£ç æ‰€æœ‰è€…和所需的åˆå¹¶æ‰¹å‡†ï¼Œåˆé€‚的人将审查åˆé€‚çš„ MR。这是åŒèµ¢çš„:更干净的代ç å’Œæ›´æœ‰æ•ˆçš„审查过程。"
@@ -18565,19 +19047,19 @@ msgid "InProductMarketing|Click on the number below that corresponds with your a
msgstr "å•å‡»ä¸‹é¢ä¸Žæ‚¨çš„答案相对应的数字 - 1 表示éžå¸¸å›°éš¾ï¼Œ5 表示éžå¸¸å®¹æ˜“。"
msgid "InProductMarketing|Code owners"
-msgstr ""
+msgstr "代ç æ‰€æœ‰è€…"
msgid "InProductMarketing|Code owners and required merge approvals are part of the paid tiers of GitLab. You can start a free 30-day trial of GitLab Ultimate and enable these features in less than 5 minutes with no credit card required."
msgstr "代ç æ‰€æœ‰è€…和所需的åˆå¹¶æ‰¹å‡†æ˜¯ GitLab 付费版的一部分。您å¯ä»¥å¼€å§‹å…费试用 GitLab 旗舰版 30 天,并在 5 分钟内å¯ç”¨è¿™äº›åŠŸèƒ½ï¼Œæ— éœ€ä¿¡ç”¨å¡ã€‚"
msgid "InProductMarketing|Code review analytics"
-msgstr ""
+msgstr "代ç å®¡æ ¸åˆ†æž"
msgid "InProductMarketing|Collaboration across stages in GitLab"
-msgstr ""
+msgstr "GitLab 中跨阶段的å作"
msgid "InProductMarketing|Collaboration made easy"
-msgstr ""
+msgstr "让å作å˜å¾—简å•"
msgid "InProductMarketing|Create a custom CI runner with just a few clicks"
msgstr "åªéœ€å•å‡»å‡ ä¸‹å³å¯åˆ›å»ºè‡ªå®šä¹‰ CI Runner"
@@ -18589,19 +19071,19 @@ msgid "InProductMarketing|Create a project in GitLab in 5 minutes"
msgstr "在5分钟内在 GitLab 中创建一个项目"
msgid "InProductMarketing|Create well-defined workflows by using scoped labels on issues, merge requests, and epics. Labels with the same scope cannot be used together, which prevents conflicts."
-msgstr ""
+msgstr "通过在议题ã€åˆå¹¶è¯·æ±‚å’Œå²è¯—上使用范围标签,创建定义明确的工作æµã€‚无法将相åŒèŒƒå›´çš„标签一起使用,从而防止冲çªã€‚"
msgid "InProductMarketing|Create your first project!"
msgstr "创建您的第一个项目ï¼"
msgid "InProductMarketing|Define who owns specific files or directories, so the right reviewers are suggested when a merge request introduces changes to those files."
-msgstr ""
+msgstr "定义è°æ‹¥æœ‰ç‰¹å®šæ–‡ä»¶æˆ–目录,所以当åˆå¹¶è¯·æ±‚对这些文件进行更改时,建议确定正确的审核者。"
msgid "InProductMarketing|Deliver Better Products Faster"
msgstr "更快地交付更好的产å“"
msgid "InProductMarketing|Dependency scanning"
-msgstr ""
+msgstr "ä¾èµ–扫æ"
msgid "InProductMarketing|Did you know teams that use GitLab are far more efficient?"
msgstr "您知é“使用 GitLab 的团队效率更高å—?"
@@ -18613,10 +19095,10 @@ msgid "InProductMarketing|Dig in and create a project and a repo"
msgstr "深入并创建一个项目和仓库"
msgid "InProductMarketing|Discover Premium & Ultimate"
-msgstr ""
+msgstr "探索专业版和旗舰版"
msgid "InProductMarketing|Discover Premium & Ultimate."
-msgstr ""
+msgstr "探索专业版和旗舰版。"
msgid "InProductMarketing|Do you have a minute?"
msgstr "有空å—?"
@@ -18625,13 +19107,13 @@ msgid "InProductMarketing|Do you have a teammate who would be perfect for this t
msgstr "您有一ä½é€‚åˆæ­¤ä»»åŠ¡çš„团队æˆå‘˜å—?"
msgid "InProductMarketing|Dynamic application security testing"
-msgstr ""
+msgstr "动æ€åº”用程åºå®‰å…¨æµ‹è¯•"
msgid "InProductMarketing|Easy"
msgstr "简å•"
msgid "InProductMarketing|Epics"
-msgstr ""
+msgstr "å²è¯—"
msgid "InProductMarketing|Expand your DevOps journey with a free GitLab trial"
msgstr "通过å…费的 GitLab 试用扩展您的 DevOps 之旅"
@@ -18655,13 +19137,13 @@ msgid "InProductMarketing|Feel the need for speed?"
msgstr "感觉需è¦é€Ÿåº¦å—?"
msgid "InProductMarketing|Find and fix bottlenecks in your code review process by understanding how long open merge requests have been in review."
-msgstr ""
+msgstr "了解开放的åˆå¹¶è¯·æ±‚已被审核多长时间,查找和解决您的代ç å®¡æŸ¥è¿‡ç¨‹ä¸­çš„瓶颈。"
msgid "InProductMarketing|Find out how your teams are really doing"
msgstr "了解您的团队的实际情况"
msgid "InProductMarketing|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
-msgstr ""
+msgstr "了解您的外部库是å¦å®‰å…¨ã€‚è¿è¡Œä¾èµ–扫æ作业,检查您外部库中的已知æ¼æ´žã€‚"
msgid "InProductMarketing|Follow our steps"
msgstr "è·Ÿéšæˆ‘们的步骤"
@@ -18696,11 +19178,8 @@ msgstr "Git 基础知识"
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr "GitHub ä¼ä¸šé¡¹ç›®åˆ° GitLab"
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr "GitLab 更适åˆé˜Ÿå‹å¸®å¿™ï¼"
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
-msgstr ""
+msgstr "GitLab ä¸ŽåŸºç¡€è®¾æ–½æ— å…³ï¼ˆæ”¯æŒ GCPã€AWSã€Azureã€OpenShiftã€VMWareã€On Premã€Bare Metal 等),无论环境如何,都å¯æ供一致的工作æµç¨‹ä½“验。"
msgid "InProductMarketing|GitLab provides static application security testing (SAST), dynamic application security testing (DAST), container scanning, and dependency scanning to help you deliver secure applications along with license compliance."
msgstr "GitLab æä¾›é™æ€åº”用程åºå®‰å…¨æµ‹è¯•ï¼ˆSAST)ã€åŠ¨æ€åº”用程åºå®‰å…¨æµ‹è¯•ï¼ˆDAST)ã€å®¹å™¨æ‰«æå’Œä¾èµ–扫æ以帮助您æ供安全的应用程åºä»¥åŠéµå®ˆè®¸å¯å议。"
@@ -18777,15 +19256,6 @@ msgstr "ç«‹å³é‚€è¯·æ‚¨çš„团队"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr "ç«‹å³é‚€è¯·æ‚¨çš„团队一起构建更好的代ç ï¼ˆå’Œæµç¨‹ï¼‰"
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr "邀请您的队å‹åŠ å…¥GitLab"
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr "邀请您的队å‹å¸®åŠ©"
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr "今天邀请您的队å‹å¹¶å…±åŒå»ºç«‹æ›´å¥½çš„代ç ã€‚ 您甚至å¯ä»¥å°†ä»»åŠ¡åˆ†é…给新的队å‹ï¼Œå¦‚设置CI/CD,以帮助å¯åŠ¨å’Œè¿è¡Œé¡¹ç›®ã€‚"
-
msgid "InProductMarketing|It's all in the stats"
msgstr "一切尽在统计中"
@@ -18793,16 +19263,16 @@ msgid "InProductMarketing|It's also possible to simply %{external_repo_link} in
msgstr "为了利用 GitLab çš„ CI/CD,也å¯ä»¥ç®€å•åœ°è®¾ç½®ä¸º %{external_repo_link}"
msgid "InProductMarketing|Keep your code quality high by defining who should approve merge requests and how many approvals are required."
-msgstr ""
+msgstr "通过定义è°åº”该批准åˆå¹¶è¯·æ±‚以åŠéœ€è¦å¤šå°‘批准æ¥ä¿æŒæ‚¨çš„代ç è´¨é‡ã€‚"
msgid "InProductMarketing|Launch GitLab CI/CD in 20 minutes or less"
msgstr "在 20 分钟或更短的时间内å¯åŠ¨ GitLab CI/CD"
msgid "InProductMarketing|Lower cost of development"
-msgstr ""
+msgstr "é™ä½Žå¼€å‘æˆæœ¬"
msgid "InProductMarketing|Make it easier to collaborate on high-level ideas by grouping related issues in an epic."
-msgstr ""
+msgstr "通过将相关议题分组到å²è¯—中,更容易就高级想法进行å作。"
msgid "InProductMarketing|Making the switch? It's easier than you think to import your projects into GitLab. Move %{github_link}, or import something %{bitbucket_link}."
msgstr "进行转æ¢ï¼Ÿå°†é¡¹ç›®å¯¼å…¥ GitLab 比您想象的è¦å®¹æ˜“,移动 %{github_link},或者导入一些东西 %{bitbucket_link}。"
@@ -18811,7 +19281,7 @@ msgid "InProductMarketing|Master the art of importing!"
msgstr "掌æ¡å¯¼å…¥çš„艺术ï¼"
msgid "InProductMarketing|Merge request approval rule"
-msgstr ""
+msgstr "åˆå¹¶è¯·æ±‚批准规则"
msgid "InProductMarketing|Move on to easily creating a Pages website %{ci_template_link}"
msgstr "继续轻æ¾åˆ›å»º Pages 网站 %{ci_template_link}"
@@ -18820,7 +19290,7 @@ msgid "InProductMarketing|Multiple owners, confusing workstreams? We've got you
msgstr "多个所有者,混乱的工作æµï¼Ÿæˆ‘们已为您æä¾›ä¿éšœ"
msgid "InProductMarketing|Multiple required approvers"
-msgstr ""
+msgstr "多个必需的核准人"
msgid "InProductMarketing|Need an alternative to importing?"
msgstr "需è¦æ›¿ä»£å¯¼å…¥çš„方法å—?"
@@ -18835,7 +19305,7 @@ msgid "InProductMarketing|Our tool brings all the things together"
msgstr "我们的工具将所有东西整åˆåœ¨ä¸€èµ·"
msgid "InProductMarketing|Protect your web application by using DAST to examine for vulnerabilities in deployed environments."
-msgstr ""
+msgstr "通过使用 DAST 检查部署环境中的æ¼æ´žï¼Œä¿æŠ¤æ‚¨çš„ web 应用程åºã€‚"
msgid "InProductMarketing|Rapid development, simplified"
msgstr "快速开å‘,简化"
@@ -18844,13 +19314,13 @@ msgid "InProductMarketing|Reduce Security & Compliance Risk"
msgstr "é™ä½Žå®‰å…¨ä¸Žåˆè§„风险"
msgid "InProductMarketing|Require multiple approvers on a merge request, so you know it's in good shape before it's merged."
-msgstr ""
+msgstr "在åˆå¹¶è¯·æ±‚时需è¦å¤šä¸ªå®¡æ‰¹ï¼Œæ‰€ä»¥æ‚¨å¯ä»¥çŸ¥é“它处于良好状æ€ï¼Œç„¶åŽæ‰èƒ½åˆå¹¶ã€‚"
msgid "InProductMarketing|Roadmaps"
-msgstr ""
+msgstr "路线图"
msgid "InProductMarketing|Scoped labels"
-msgstr ""
+msgstr "范围标记"
msgid "InProductMarketing|Security that's integrated into your development lifecycle"
msgstr "集æˆåˆ°æ‚¨çš„å¼€å‘生命周期中的安全性"
@@ -18859,7 +19329,7 @@ msgid "InProductMarketing|Sometimes you're not ready to make a full transition t
msgstr "有时您还没有准备好完全过渡到新工具。如果您还没有准备好完全æ交, %{mirroring_link} 为您æ供了一ç§ä¸Žå½“å‰å·¥å…·å¹¶è¡Œè¯•ç”¨ GitLab 的安全方法。"
msgid "InProductMarketing|Speed. Efficiency. Trust."
-msgstr ""
+msgstr "快速,高效,值得信任。"
msgid "InProductMarketing|Spin up an autoscaling runner in GitLab"
msgstr "在 GitLab 中å¯åŠ¨è‡ªåŠ¨ç¼©æ”¾Runner"
@@ -18871,7 +19341,7 @@ msgid "InProductMarketing|Start a Self-Managed trial"
msgstr "开始试用"
msgid "InProductMarketing|Start a free trial"
-msgstr ""
+msgstr "开始å…费试用"
msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr "开始å…费试用旗舰版 - 无需信用å¡"
@@ -18940,7 +19410,7 @@ msgid "InProductMarketing|To understand and get the most out of GitLab, start at
msgstr "è¦äº†è§£å¹¶å……分利用GitLab,请从头开始,从%{project_link}开始。在GitLab中,仓库是项目的一部分,所以在您创建了您的项目之åŽï¼Œæ‚¨å¯ä»¥ç»§ç»­æ‰§è¡Œ%{repo_link}。"
msgid "InProductMarketing|Track completed issues in a chart, so you can see how a milestone is progressing at a glance."
-msgstr ""
+msgstr "通过在图表中跟踪已完æˆçš„议题,一目了然地观望里程碑的进展。"
msgid "InProductMarketing|Try GitLab Ultimate for free"
msgstr "å…费试用 GitLab 旗舰版"
@@ -18979,7 +19449,7 @@ msgid "InProductMarketing|Very easy"
msgstr "éžå¸¸å®¹æ˜“"
msgid "InProductMarketing|Visualize your epics and milestones in a timeline."
-msgstr ""
+msgstr "在时间线上å¯è§†åŒ–您的å²è¯—和里程碑。"
msgid "InProductMarketing|Want to host GitLab on your servers?"
msgstr "想在您的æœåŠ¡å™¨ä¸Šæ‰˜ç®¡ GitLab?"
@@ -19003,7 +19473,7 @@ msgid "InProductMarketing|YouTube"
msgstr "YouTube"
msgid "InProductMarketing|Your software, deployed your way"
-msgstr ""
+msgstr "按您的想法,部署您的软件"
msgid "InProductMarketing|Your teams can be more efficient"
msgstr "您的团队å¯ä»¥æ›´å…·æ•ˆçŽ‡"
@@ -19077,6 +19547,9 @@ msgstr "剩余%{minutes}分钟"
msgid "IncidentManagement|Achieved SLA"
msgstr "已实现 SLA"
+msgid "IncidentManagement|Acknowledged"
+msgstr "已确认"
+
msgid "IncidentManagement|All"
msgstr "全部"
@@ -19086,6 +19559,15 @@ msgstr "æå‡ä¸ºäº‹ä»¶çš„所有警报都会自动显示在列表中。"
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr "æå‡åˆ°äº‹ä»¶çš„所有警报都自动显示在列表中,您也å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„按钮创建一个新事件。"
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr "获å–事件状æ€æ—¶å‡ºé”™ã€‚请é‡æ–°åŠ è½½é¡µé¢ã€‚"
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr "更新事件状æ€æ—¶å‡ºé”™ã€‚请刷新页é¢ï¼Œç„¶åŽå†è¯•ä¸€æ¬¡ã€‚"
+
+msgid "IncidentManagement|Assign paging status"
+msgstr "分é…分页状æ€"
+
msgid "IncidentManagement|Assignees"
msgstr "指派人"
@@ -19126,16 +19608,16 @@ msgid "IncidentManagement|No incidents to display."
msgstr "没有è¦æ˜¾ç¤ºçš„事件。"
msgid "IncidentManagement|None"
-msgstr ""
+msgstr "æ— "
msgid "IncidentManagement|Open"
msgstr "打开"
msgid "IncidentManagement|Page your team with escalation policies"
-msgstr ""
+msgstr "通知您的团队使用å‡çº§ç­–ç•¥"
msgid "IncidentManagement|Paged"
-msgstr ""
+msgstr "已通知"
msgid "IncidentManagement|Published"
msgstr "å·²å‘布"
@@ -19143,11 +19625,17 @@ msgstr "å·²å‘布"
msgid "IncidentManagement|Published to status page"
msgstr "å‘布到状æ€é¡µ"
+msgid "IncidentManagement|Resolved"
+msgstr "已解决"
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr "当为事件选择å‡çº§ç­–略时,设置状æ€ä¸ºå·²ç¡®è®¤æˆ–已解决时åœæ­¢é€šçŸ¥ã€‚"
+
msgid "IncidentManagement|Severity"
msgstr "严é‡æ€§"
msgid "IncidentManagement|Status"
-msgstr ""
+msgstr "状æ€"
msgid "IncidentManagement|There are no closed incidents"
msgstr "没有已关闭的事件"
@@ -19158,6 +19646,9 @@ msgstr "显示事件时出错。"
msgid "IncidentManagement|Time to SLA"
msgstr "è·SLA时间"
+msgid "IncidentManagement|Triggered"
+msgstr "已触å‘"
+
msgid "IncidentManagement|Unassigned"
msgstr "å–消指派"
@@ -19168,7 +19659,7 @@ msgid "IncidentManagement|Unpublished"
msgstr "未å‘布"
msgid "IncidentManagement|Use escalation policies to automatically page your team when incidents are created."
-msgstr ""
+msgstr "事件创建时,使用å‡çº§ç­–略自动为您的团队创建页é¢ã€‚"
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr "å¯ç”¨â€è·SLA时间â€å€’计时器"
@@ -19216,10 +19707,10 @@ msgid "Incidents"
msgstr "事件"
msgid "Incidents|Add image details"
-msgstr ""
+msgstr "添加镜åƒè¯¦ç»†ä¿¡æ¯"
msgid "Incidents|Add text or a link to display with your image. If you don't add either, the file name displays instead."
-msgstr ""
+msgstr "添加文本或链接æ¥å±•ç¤ºæ‚¨çš„é•œåƒã€‚如果您没有添加,文件å将会显示。"
msgid "Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to attach it to the incident"
msgstr "放置或%{linkStart}上传%{linkEnd}指标截图,将其附加到事件中。"
@@ -19234,11 +19725,14 @@ msgid "Incidents|There was an issue loading metric images."
msgstr "加载指标图片时出现问题。"
msgid "Incidents|There was an issue updating your image."
-msgstr ""
+msgstr "更新您的镜åƒæ—¶å‡ºçŽ°é—®é¢˜ã€‚"
msgid "Incidents|There was an issue uploading your image."
msgstr "上传您的镜åƒæ—¶å‡ºçŽ°é—®é¢˜ã€‚"
+msgid "Incident|Add new timeline event"
+msgstr "添加时间线事件"
+
msgid "Incident|Alert details"
msgstr "警报详情"
@@ -19246,20 +19740,23 @@ msgid "Incident|Are you sure you wish to delete this image?"
msgstr "您确定è¦åˆ é™¤æ­¤é•œåƒå—?"
msgid "Incident|Delete image"
-msgstr ""
+msgstr "删除镜åƒ"
msgid "Incident|Deleting %{filename}"
msgstr "删除%{filename}"
msgid "Incident|Edit image text or link"
-msgstr ""
+msgstr "编辑镜åƒæ–‡æœ¬æˆ–链接"
msgid "Incident|Editing %{filename}"
-msgstr ""
+msgstr "正在编辑 %{filename}"
msgid "Incident|Metrics"
msgstr "指标"
+msgid "Incident|No timeline items have been added yet."
+msgstr "尚未添加任何时间线事项。"
+
msgid "Incident|Summary"
msgstr "摘è¦"
@@ -19269,6 +19766,9 @@ msgstr "加载警报数æ®æ—¶å‡ºçŽ°é—®é¢˜ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr "加载事件数æ®æ—¶å‡ºçŽ°é—®é¢˜ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
+msgid "Incident|Timeline"
+msgstr "时间线"
+
msgid "Include author name in notification email body"
msgstr "在通知电å­é‚®ä»¶æ­£æ–‡ä¸­åŒ…å«ä½œè€…姓å"
@@ -19377,6 +19877,12 @@ msgstr "已继承"
msgid "Inherited:"
msgstr "继承:"
+msgid "Initial default branch name"
+msgstr "åˆå§‹é»˜è®¤åˆ†æ”¯å称"
+
+msgid "Initial default branch protection"
+msgstr "åˆå§‹é»˜è®¤åˆ†æ”¯ä¿æŠ¤"
+
msgid "Inline"
msgstr "内è”"
@@ -19526,7 +20032,7 @@ msgid "Integrations|Branches for which notifications are to be sent"
msgstr "è¦å‘é€é€šçŸ¥çš„分支"
msgid "Integrations|Clear if using a self-signed certificate."
-msgstr ""
+msgstr "如果使用自签åè¯ä¹¦ï¼Œè¯·æ¸…除"
msgid "Integrations|Comment detail:"
msgstr "评论细节:"
@@ -19535,7 +20041,7 @@ msgid "Integrations|Comment settings:"
msgstr "评论设置:"
msgid "Integrations|Connection details"
-msgstr ""
+msgstr "连接情况"
msgid "Integrations|Connection failed. Please check your settings."
msgstr "连接失败。请检查您的设置。"
@@ -19562,7 +20068,7 @@ msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
msgstr "在 Slack 工作区中å¯ç”¨ GitLab.com æ–œæ å‘½ä»¤ã€‚"
msgid "Integrations|Enable SSL verification"
-msgstr ""
+msgstr "å¯ç”¨ SSL 验è¯"
msgid "Integrations|Enable comments"
msgstr "å¯ç”¨è¯„论"
@@ -19576,6 +20082,9 @@ msgstr "无法链接命å空间,请é‡è¯•ã€‚"
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr "加载命å空间失败,请é‡è¯•ã€‚"
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr "无法登录 GitLab。"
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr "无法å–消链接命å空间,请é‡è¯•ã€‚"
@@ -19643,7 +20152,7 @@ msgid "Integrations|Return to GitLab for Jira"
msgstr "返回GitLab for Jira"
msgid "Integrations|SSL verification"
-msgstr ""
+msgstr "SSL 验è¯"
msgid "Integrations|Save settings?"
msgstr "ä¿å­˜è®¾ç½®å—?"
@@ -19676,7 +20185,7 @@ msgid "Integrations|There are no projects using custom settings"
msgstr "没有使用自定义设置的项目"
msgid "Integrations|This integration only works with GitLab.com. Adding a namespace only works in browsers that allow cross-site cookies. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
+msgstr "此集æˆä»…适用于 SaaS。添加命å空间仅适用于å…许跨站点 cookie çš„æµè§ˆå™¨ã€‚ %{linkStart}了解更多%{linkEnd}。"
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr "此集æˆå’Œç»§æ‰¿é¡¹ç›®å·²è¢«é‡ç½®ã€‚"
@@ -19690,6 +20199,9 @@ msgstr "使用自定义设置"
msgid "Integrations|Use default settings"
msgstr "使用默认设置"
+msgid "Integrations|You can close this window."
+msgstr "您å¯ä»¥å…³é—­æ­¤çª—å£ã€‚"
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr "您现在å¯ä»¥å…³é—­æ­¤çª—å£å¹¶è¿”回GitLab for Jira应用。"
@@ -19702,12 +20214,18 @@ msgstr "您尚未激活任何集æˆã€‚"
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr "您必须拥有所有者或维护者æƒé™æ‰èƒ½é“¾æŽ¥å‘½å空间。"
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr "您现在应该在 Jira Cloud 议题中看到动æ€ã€‚%{linkStart}了解更多%{linkEnd}"
msgid "Integrations|You've activated every integration 🎉"
msgstr "æ‚¨å·²æ¿€æ´»æ‰€æœ‰é›†æˆ ðŸŽ‰"
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr "当您在禅é“中创建项目的议题时,禅é“议题会显示在此处。"
@@ -19745,7 +20263,7 @@ msgid "Interval Pattern"
msgstr "循环周期"
msgid "Introduced in GitLab 13.1, before using %{reindexing_link_start}zero-downtime reindexing%{link_end} and %{migrations_link_start}Advanced Search migrations%{link_end}, you need to %{recreate_link_start}recreate your index%{link_end}."
-msgstr ""
+msgstr "从 13.1 版本起,您需è¦å…ˆ%{recreate_link_start}é‡å»ºç´¢å¼•%{link_end}æ‰èƒ½æ‰§è¡Œ%{reindexing_link_start}ä¸åœæœºé‡ç´¢å¼•%{link_end}å’Œ%{migrations_link_start}高级æœç´¢è¿ç§»%{link_end}。"
msgid "Introducing Your DevOps Reports"
msgstr "介ç»æ‚¨çš„ DevOps 报告"
@@ -19855,9 +20373,6 @@ msgstr "邀请"
msgid "Invitation declined"
msgstr "邀请被拒ç»"
-msgid "Invite"
-msgstr "邀请"
-
msgid "Invite \"%{email}\" by email"
msgstr "通过电å­é‚®ä»¶é‚€è¯·â€œ%{email}â€"
@@ -19873,12 +20388,6 @@ msgstr "邀请群组"
msgid "Invite email has already been taken"
msgstr "邀请邮件已被使用"
-msgid "Invite group"
-msgstr "邀请群组"
-
-msgid "Invite member"
-msgstr "邀请æˆå‘˜"
-
msgid "Invite members"
msgstr "邀请æˆå‘˜"
@@ -19972,6 +20481,9 @@ msgstr "邀请æˆå‘˜"
msgid "InviteMembersModal|Members were successfully added"
msgstr "æˆå‘˜å·²æˆåŠŸæ·»åŠ "
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr "æœç´¢è¦é‚€è¯·çš„群组"
@@ -19990,6 +20502,12 @@ msgstr "出现错误"
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr "è¦å‘新团队æˆå‘˜åˆ†é…议题,您需è¦ä¸€ä¸ªè®®é¢˜æ‰€å±žçš„项目。 %{linkStart}从创建一个项目开始。%{linkEnd}"
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr "您正在邀请一个群组加入 %{strongStart}%{name}%{strongEnd} 群组。"
@@ -20002,6 +20520,9 @@ msgstr "您正在邀请æˆå‘˜åŠ å…¥ %{strongStart}%{name}%{strongEnd} 群组。"
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr "您正在邀请æˆå‘˜åŠ å…¥ %{strongStart}%{name}%{strongEnd} 项目。"
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr "邀请群组"
@@ -20194,9 +20715,6 @@ msgstr "%{reason},议题由 %{name} 关闭。"
msgid "Issue weight"
msgstr "议题æƒé‡"
-msgid "Issue(s) already assigned"
-msgstr "议题已指派"
-
msgid "IssueAnalytics|Age"
msgstr "年龄"
@@ -20204,7 +20722,7 @@ msgid "IssueAnalytics|Assignees"
msgstr "指派人"
msgid "IssueAnalytics|Created by"
-msgstr ""
+msgstr "创建者"
msgid "IssueAnalytics|Due date"
msgstr "截止日期"
@@ -20239,8 +20757,8 @@ msgstr "删除看æ¿"
msgid "IssueBoards|No matching boards found"
msgstr "未找到匹é…的看æ¿"
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr "您的一些看æ¿è¢«éšè—,请激活许å¯è¯åŽå†æ¬¡æŸ¥çœ‹ã€‚"
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
+msgstr "您的一些看æ¿è¢«éšè—,请添加许å¯è¯åŽå†æ¬¡æŸ¥çœ‹ã€‚"
msgid "IssueBoards|Switch board"
msgstr "切æ¢çœ‹æ¿"
@@ -20342,10 +20860,10 @@ msgid "IssuesAnalytics|Avg/Month:"
msgstr "月å‡ï¼š"
msgid "IssuesAnalytics|Issues created"
-msgstr ""
+msgstr "议题已创建"
msgid "IssuesAnalytics|Issues created per month"
-msgstr ""
+msgstr "æ¯æœˆåˆ›å»ºçš„议题"
msgid "IssuesAnalytics|Last 12 months"
msgstr "最近12个月"
@@ -20372,7 +20890,7 @@ msgid "It looks like you have some draft commits in this branch."
msgstr "看起æ¥ä½ åœ¨è¿™ä¸ªåˆ†æ”¯ä¸Šæœ‰ä¸€äº›è‰ç¨¿æ交。"
msgid "It looks like you're attempting to activate your subscription. Use %{a_start}the Subscription page%{a_end} instead."
-msgstr ""
+msgstr "您似乎正在å°è¯•æ¿€æ´»æ‚¨çš„订阅。请使用 %{a_start}订阅页é¢%{a_end} 代替。"
msgid "It may be several days before you see feature usage data."
msgstr "您å¯èƒ½è¦è¿‡å‡ å¤©æ‰èƒ½çœ‹åˆ°åŠŸèƒ½ä½¿ç”¨æƒ…况数æ®ã€‚"
@@ -20410,11 +20928,14 @@ msgstr "迭代已更新"
msgid "Iterations"
msgstr "迭代"
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr "添加迭代"
-msgid "Iterations|Automated scheduling"
-msgstr "自动调度计划"
+msgid "Iterations|All"
+msgstr ""
msgid "Iterations|Cadence configuration is invalid."
msgstr "周期é…置无效。"
@@ -20428,12 +20949,6 @@ msgstr "找ä¸åˆ°è¿­ä»£å‘¨æœŸ"
msgid "Iterations|Create cadence"
msgstr "创建周期"
-msgid "Iterations|Create cadence and start iteration"
-msgstr "创建周期并开始迭代"
-
-msgid "Iterations|Create iteration"
-msgstr "创建迭代"
-
msgid "Iterations|Delete cadence"
msgstr "删除周期"
@@ -20443,6 +20958,9 @@ msgstr "删除迭代周期?"
msgid "Iterations|Delete iteration?"
msgstr "删除迭代?"
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "时长"
@@ -20464,8 +20982,14 @@ msgstr "未æ¥è¿­ä»£"
msgid "Iterations|Iteration cadences"
msgstr "迭代周期"
-msgid "Iterations|Iteration scheduling will be handled automatically"
-msgstr "迭代调度会自动处ç†"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
+msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
msgstr "将未完æˆçš„议题移至下一次迭代"
@@ -20482,6 +21006,9 @@ msgstr "没有已关闭的迭代。"
msgid "Iterations|No iteration cadences to show."
msgstr "没有è¦æ˜¾ç¤ºçš„迭代周期。"
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr "周期中没有迭代。"
@@ -20491,11 +21018,17 @@ msgstr "没有开放的迭代。"
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr "您希望安排的未æ¥è¿­ä»£æ¬¡æ•°"
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr "滚动议题"
-msgid "Iterations|Save cadence"
-msgstr "ä¿å­˜å‘¨æœŸ"
+msgid "Iterations|Save changes"
+msgstr ""
msgid "Iterations|Select duration"
msgstr "选择æŒç»­æ—¶é—´"
@@ -20506,6 +21039,9 @@ msgstr "选择数é‡"
msgid "Iterations|Select start date"
msgstr "选择开始日期"
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr "开始日期"
@@ -20518,6 +21054,9 @@ msgstr "迭代已被删除。"
msgid "Iterations|The start date of your first iteration"
msgstr "第一次迭代的开始日期"
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr "这将删除周期以åŠå…¶ä¸­çš„所有迭代。"
@@ -20603,7 +21142,7 @@ msgid "JiraConnect|You can now close this window and return to Jira."
msgstr "您现在å¯ä»¥å…³é—­æ­¤çª—å£å¹¶è¿”回Jira。"
msgid "JiraConnect|You don't have permission to create branches for this project. Select a different project or contact the project owner for access. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "您无æƒä¸ºæ­¤é¡¹ç›®åˆ›å»ºåˆ†æ”¯ã€‚选择其他项目或è”系项目所有者以获å–访问æƒé™ã€‚ %{linkStart}了解更多。%{linkEnd}"
msgid "JiraRequest|A connection error occurred while connecting to Jira. Try your request again."
msgstr "连接到 Jira æ—¶å‘生连接错误。请您å†æ¬¡å°è¯•è¯·æ±‚。"
@@ -20654,10 +21193,10 @@ msgid "JiraService|Define the type of Jira issue to create from a vulnerability.
msgstr "定义è¦ä»Žæ¼æ´žåˆ›å»ºçš„ Jira 议题的类型。"
msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
-msgstr ""
+msgstr "在å¯ç”¨ GitLab 议题的åŒæ—¶æ˜¾ç¤º Jira 议题å¯èƒ½ä¼šä»¤äººå›°æƒ‘。如果它们ä¸ä¼šè¢«ä½¿ç”¨ï¼Œè¯·è€ƒè™‘ %{linkStart}ç¦ç”¨ GitLab 议题%{linkEnd}。"
msgid "JiraService|Enable Jira issue creation from vulnerabilities"
-msgstr ""
+msgstr "å¯ç”¨ä»Žæ¼æ´žåˆ›å»º Jira 议题"
msgid "JiraService|Enable Jira issues"
msgstr "å¯ç”¨Jira议题"
@@ -20773,23 +21312,23 @@ msgstr "用户å或电å­é‚®ä»¶"
msgid "JiraService|Using Jira for issue tracking?"
msgstr "使用Jira进行议题跟踪å—?"
-msgid "JiraService|View Jira issues in GitLab"
-msgstr "在GitLab查看Jira议题"
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
-msgstr ""
+msgstr "警告:有æƒè®¿é—®æ­¤ GitLab 项目的所有 GitLab 用户都å¯ä»¥æŸ¥çœ‹æ‚¨é€‰æ‹©çš„ Jira 项目中的所有议题。"
msgid "JiraService|Web URL"
msgstr "Web URL"
msgid "JiraService|When a Jira issue is mentioned in a commit or merge request, a remote link and comment (if enabled) will be created."
-msgstr ""
+msgstr "在æ交或åˆå¹¶è¯·æ±‚中æåŠ Jira 议题时,将创建远程链接和评论(如果å¯ç”¨ï¼‰ã€‚"
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
-msgstr ""
+msgstr "在ä¸ç¦»å¼€ GitLab çš„æƒ…å†µä¸‹å¤„ç† Jira 议题。添加一个 Jira èœå•ï¼Œè®¿é—®æ‚¨çš„ Jira 议题åªè¯»åˆ—表。"
+
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr "在ä¸ç¦»å¼€ GitLab çš„æƒ…å†µä¸‹å¤„ç† Jira 议题。添加 Jira èœå•ï¼Œè®¿é—® Jira 议题的åªè¯»åˆ—表。%{jira_issues_link_start}了解更多。%{link_end}"
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "您必须在å¯ç”¨æ­¤é›†æˆä¹‹å‰é…ç½® Jira。%{jira_doc_link_start}了解更多。%{link_end}"
msgid "Job"
msgstr "作业"
@@ -20851,6 +21390,9 @@ msgstr "您确定è¦é‡è¯•æ­¤ä½œä¸šå—?"
msgid "Jobs|Create CI/CD configuration file"
msgstr "创建CI/CDé…置文件"
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr "作业已阻塞。请检查Runner。"
@@ -20860,6 +21402,12 @@ msgstr "作业是GitLab CI/CDæµæ°´çº¿çš„基本组æˆéƒ¨åˆ†ã€‚æ¯ä¸ªä½œä¸šéƒ½æœ‰
msgid "Jobs|No jobs to show"
msgstr "没有å¯æ˜¾ç¤ºçš„作业"
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr "使用作业自动执行任务"
@@ -20867,38 +21415,47 @@ msgid "Jobs|You're about to retry a job that failed because it attempted to depl
msgstr "ä½ å³å°†é‡è¯•ä¸€ä¸ªä½œä¸šï¼Œæ­¤ä½œä¸šå› è¯•å›¾éƒ¨ç½²æ—§çš„代ç è€Œå¤±è´¥ã€‚ é‡è¯•æ­¤ä»»åŠ¡å¯èƒ½å¯¼è‡´ç”¨æ—§ç‰ˆæœ¬æºä»£ç è¦†ç›–环境。"
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id}"
-msgstr ""
+msgstr "%{boldStart}æµæ°´çº¿%{boldEnd} %{id}"
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source}"
-msgstr ""
+msgstr "对于具有 %{source} çš„ %{mrId} çš„ %{boldStart}æµæ°´çº¿%{boldEnd} %{id}"
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source} into %{target}"
-msgstr ""
+msgstr "对于从 %{source} 到 %{target} çš„ %{mrId} çš„ %{boldStart}æµæ°´çº¿%{boldEnd} %{id}"
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
-msgstr ""
+msgstr "对于 %{ref} çš„ %{boldStart}æµæ°´çº¿%{boldEnd} %{id}"
msgid "Job|Are you sure you want to erase this job log and artifacts?"
-msgstr ""
+msgstr "您确定è¦åˆ é™¤æ­¤ä½œä¸šæ—¥å¿—和产物å—?"
msgid "Job|Browse"
msgstr "æµè§ˆ"
msgid "Job|Cancel"
+msgstr "å–消"
+
+msgid "Job|Canceled"
msgstr ""
msgid "Job|Complete Raw"
msgstr "完整原始日志"
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr "下载"
msgid "Job|Erase job log and artifacts"
msgstr "擦除作业日志和产物"
-msgid "Job|Finished at"
+msgid "Job|Failed"
msgstr ""
+msgid "Job|Finished at"
+msgstr "完æˆäºŽ"
+
msgid "Job|Job artifacts"
msgstr "作业产物"
@@ -20911,7 +21468,25 @@ msgstr "作业已被 %{userLink} 删除"
msgid "Job|Keep"
msgstr "ä¿æŒ"
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
+msgstr "é‡è¯•"
+
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
msgstr ""
msgid "Job|Scroll to bottom"
@@ -20923,9 +21498,12 @@ msgstr "滚动到顶部"
msgid "Job|Show complete raw"
msgstr "显示完整æº"
-msgid "Job|Status"
+msgid "Job|Skipped"
msgstr ""
+msgid "Job|Status"
+msgstr "状æ€"
+
msgid "Job|The artifacts were removed"
msgstr "作业产物已被删除"
@@ -20947,6 +21525,9 @@ msgstr "此作业已阻塞,因为您未分é…任何具备这些标签的å¯ç”¨
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr "此作业已阻塞,因为没有å¯ç”¨çš„Runner处ç†æ­¤é¡¹ä½œä¸šã€‚"
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "å…许失败"
@@ -21305,6 +21886,9 @@ msgstr "上次更新å°è¯•"
msgid "Last updated"
msgstr "最近更新"
+msgid "Last updated %{time} ago"
+msgstr "最åŽæ›´æ–°äºŽ %{time} å‰"
+
msgid "Last used"
msgstr "最åŽä½¿ç”¨"
@@ -21348,7 +21932,7 @@ msgid "Lead Time"
msgstr "交付时间"
msgid "Lead time"
-msgstr "交付时间"
+msgstr "å‰ç½®æ—¶é—´"
msgid "Learn GitLab"
msgstr "学习GitLab"
@@ -21384,7 +21968,7 @@ msgid "Learn more about Auto DevOps"
msgstr "了解更多关于Auto DevOps"
msgid "Learn more about GitLab"
-msgstr ""
+msgstr "进一步了解 GitLab"
msgid "Learn more about Needs relationships"
msgstr "了解更多关于Needs关系的信æ¯"
@@ -21413,6 +21997,12 @@ msgstr "了解更多关于群组级项目模æ¿"
msgid "Learn more about groups."
msgstr "了解关于群组的更多信æ¯ã€‚"
+msgid "Learn more about max seats used"
+msgstr "了解更多关于最大席ä½æ•°çš„ä¿¡æ¯"
+
+msgid "Learn more about seats owed"
+msgstr "了解更多关于欠缺席ä½çš„ä¿¡æ¯"
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr "在 %{configuration_link_start}高级æœç´¢é…ç½®%{configuration_link_end} 中了解更多关于切片和副本的信æ¯ï¼Œç›´åˆ°æ‚¨ %{recreated_link_start}é‡æ–°åˆ›å»º%{recreated_link_end} 索引,æ‰èƒ½è¿›è¡Œæ›´æ”¹ã€‚"
@@ -21554,6 +22144,9 @@ msgstr "建议å¯ç”¨æ­¤è®¾ç½®ã€‚"
msgid "Legacy burndown chart"
msgstr "旧版燃尽图"
+msgid "Less Details"
+msgstr "收起详情"
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr "Let's Encryptä¸æŽ¥å—example.com的电å­é‚®ä»¶"
@@ -21566,6 +22159,9 @@ msgstr "让我们æ¥è°ˆè°ˆï¼"
msgid "License Compliance"
msgstr "许å¯è¯åˆè§„"
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr "许å¯è¯åˆè§„"
@@ -21584,6 +22180,9 @@ msgstr "%{docLinkStart}许å¯è¯æ‰¹å‡†%{docLinkEnd}有效"
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr "%{docLinkStart}许å¯è¯æ‰¹å‡†%{docLinkEnd}无效"
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr "项目中å¯æŽ¥å—的许å¯è¯"
@@ -21611,9 +22210,6 @@ msgstr "如检测到则ä¸å…许åˆå¹¶è¯·æ±‚并指示开å‘人员删除"
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr "了解更多有关%{linkStart}许å¯è¯æ‰¹å‡†%{linkEnd}çš„ä¿¡æ¯"
-msgid "LicenseCompliance|License Approvals"
-msgstr "许å¯è¯æ‰¹å‡†"
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] "许å¯è¯åˆè§„检查åªåœ¨æºåˆ†æ”¯ä¸Šæ£€æµ‹åˆ°%d个许å¯è¯åŠç­–ç•¥è¿å。"
@@ -21638,6 +22234,10 @@ msgid "LicenseCompliance|License Compliance detected %d new license and policy v
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
msgstr[0] "许å¯è¯åˆè§„检测到%d个新的许å¯è¯åŠç­–ç•¥è¿å。需è¦æ‰¹å‡†ã€‚"
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr "许å¯è¯åˆè§„仅在æºåˆ†æ”¯æœªæ£€æµ‹åˆ°è®¸å¯è¯"
@@ -21647,6 +22247,12 @@ msgstr "许å¯è¯åˆè§„未检测到新许å¯è¯"
msgid "LicenseCompliance|License name"
msgstr "许å¯è¯å称"
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr "删除许å¯è¯"
@@ -21662,6 +22268,12 @@ msgstr "此项目目å‰æ²¡æœ‰åŒ¹é…的策略。"
msgid "LicenseCompliance|This license already exists in this project."
msgstr "此许å¯è¯å·²ç»å­˜åœ¨äºŽè¯¥é¡¹ç›®ä¸­ã€‚"
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr "您å³å°†ä»Žå½“å‰é¡¹ç›®ä¸­åˆ é™¤è®¸å¯è¯%{name}。"
@@ -21708,16 +22320,16 @@ msgid "Licenses|Displays licenses detected in the project, based on the %{linkSt
msgstr "显示项目中检测到的许å¯è¯ï¼ŒåŸºäºŽ%{linkStart}最新的æˆåŠŸæ‰«æ%{linkEnd}"
msgid "Licenses|Drag your license file here or %{linkStart}click to upload%{linkEnd}."
-msgstr ""
+msgstr "将您的许å¯è¯æ–‡ä»¶æ‹–动到此处,或 %{linkStart}点击上传%{linkEnd}"
msgid "Licenses|Drop your license file to start the upload."
-msgstr ""
+msgstr "拖放您的许å¯æ–‡ä»¶ï¼Œå¼€å§‹ä¸Šä¼ ã€‚"
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
msgstr "获å–许å¯è¯åˆ—表时出错。请检查您的网络连接并é‡è¯•ã€‚"
msgid "Licenses|Error: You are trying to upload something other than a file"
-msgstr ""
+msgstr "错误: 您正在å°è¯•ä¸Šä¼ æ–‡ä»¶ä»¥å¤–的内容"
msgid "Licenses|License Compliance"
msgstr "许å¯è¯åˆè§„性"
@@ -21738,7 +22350,7 @@ msgid "Licenses|Specified policies in this project"
msgstr "本项目中的指定政策"
msgid "Licenses|The file could not be uploaded."
-msgstr ""
+msgstr "此文件无法上传。"
msgid "Licenses|The license list details information about the licenses used within your project."
msgstr "许å¯è¯åˆ—表详细说明您项目中使用的许å¯è¯ä¿¡æ¯ã€‚"
@@ -21783,7 +22395,7 @@ msgid "Link"
msgstr "链接"
msgid "Link (optional)"
-msgstr ""
+msgstr "链接(å¯é€‰ï¼‰"
msgid "Link Prometheus monitoring to GitLab."
msgstr "将Prometheus监控链接到 GitLab。"
@@ -21822,7 +22434,7 @@ msgid "Linked emails (%{email_count})"
msgstr "链接的电å­é‚®ä»¶ (%{email_count})"
msgid "Linked epics"
-msgstr ""
+msgstr "å…³è”å²è¯—"
msgid "Linked issues"
msgstr "相关议题"
@@ -21851,14 +22463,11 @@ msgstr "列出å¯ç”¨ä»“库"
msgid "List of all merge commits"
msgstr "所有åˆå¹¶æ交列表"
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
-msgstr ""
+msgstr "åˆé€‚çš„ GCP ä½ç½®åˆ—表"
msgid "List of users allowed to exceed the rate limit."
-msgstr ""
+msgstr "å…许超过速率é™åˆ¶çš„用户列表。"
msgid "List options"
msgstr "列表选项"
@@ -22080,7 +22689,7 @@ msgid "Maintenance mode"
msgstr "维护模å¼"
msgid "Make adjustments to how your GitLab instance is set up."
-msgstr ""
+msgstr "调整您 GitLab 实例的设置方å¼ã€‚"
msgid "Make and review changes in the browser with the Web IDE"
msgstr "使用Web IDE在æµè§ˆå™¨ä¸­åˆ›å»ºå’ŒæŸ¥çœ‹æ›´æ”¹"
@@ -22127,6 +22736,9 @@ msgstr "管ç†ç¾¤ç»„标记"
msgid "Manage labels"
msgstr "管ç†æ ‡è®°"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr "管ç†é‡Œç¨‹ç¢‘"
@@ -22160,6 +22772,9 @@ msgstr "Manifest文件导入"
msgid "Manual"
msgstr "手动"
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr "无法ä¿å­˜è®®é¢˜çš„顺åº"
@@ -22227,10 +22842,10 @@ msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "添加斜体文本(%{modifier_key}I)"
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
-msgstr ""
+msgstr "添加删除线文本 (%{modifierKey}⇧X)"
msgid "MarkdownEditor|Add strikethrough text (%{modifier_key}⇧X)"
-msgstr ""
+msgstr "添加带删除线的文本(%{modifier_key}⇧X)"
msgid "Marked For Deletion At - %{deletion_time}"
msgstr "标记删除于 - %{deletion_time}"
@@ -22322,6 +22937,9 @@ msgstr "最大文件大å°ä¸º200 KB。"
msgid "Max role"
msgstr "最大角色"
+msgid "Max seats used"
+msgstr "使用的最大席ä½æ•°"
+
msgid "Max session time"
msgstr "最大会è¯æ—¶é—´"
@@ -22442,9 +23060,6 @@ msgstr "最大作业超时"
msgid "Maximum job timeout has a value which could not be accepted"
msgstr "作业最大超时设置无效"
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr "个人访问令牌有最长有效期设定,过期日期必须设为%{maximum_allowable_date}之å‰ã€‚"
-
msgid "Maximum lines in a diff"
msgstr "差异中的最大行数"
@@ -22466,6 +23081,12 @@ msgstr "å¯ä»¥åŒæ—¶åŒæ­¥çš„最大镜åƒæ•°ã€‚"
msgid "Maximum number of projects."
msgstr "最大项目数é‡ã€‚"
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„用户æ¯åˆ†é’Ÿçš„最大请求数"
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr "未ç»èº«ä»½éªŒè¯çš„ IP 地å€æ¯åˆ†é’Ÿçš„最大请求数"
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr "æ¯ä¸ªåŽŸå§‹è·¯å¾„æ¯åˆ†é’Ÿçš„最大请求数(默认为 300)。设置为 0 以ç¦ç”¨èŠ‚æµã€‚"
@@ -22494,7 +23115,7 @@ msgid "Maximum push size (MB)"
msgstr "最大推é€å¤§å° (MB)"
msgid "Maximum requests per 10 minutes per user"
-msgstr ""
+msgstr "æ¯ä¸ªç”¨æˆ·10分钟内的最大请求数"
msgid "Maximum requests per minute"
msgstr "æ¯åˆ†é’Ÿæœ€å¤§è¯·æ±‚æ•°"
@@ -22588,14 +23209,14 @@ msgstr "群组æˆå‘˜åªèƒ½æŸ¥çœ‹ä»–们有æƒè®¿é—®çš„项目"
msgid "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seat in use and will be billed for the overage."
msgid_plural "MembersOverage|If you continue, the %{groupName} group will have %{quantity} seats in use and will be billed for the overage."
-msgstr[0] ""
+msgstr[0] "如果您继续, %{groupName} 组将有 %{quantity} 个席ä½åœ¨ä½¿ç”¨ä¸­ï¼Œå¹¶ä¼šæ”¶å–超é¢è´¹ç”¨ã€‚"
msgid "MembersOverage|You are about to incur additional charges"
-msgstr ""
+msgstr "您å³å°†äº§ç”Ÿé¢å¤–费用"
msgid "MembersOverage|Your subscription includes %d seat."
msgid_plural "MembersOverage|Your subscription includes %d seats."
-msgstr[0] ""
+msgstr[0] "您的订阅包括 %d 个席ä½ã€‚"
msgid "Membership"
msgstr "æˆå‘˜èµ„æ ¼"
@@ -22699,9 +23320,6 @@ msgstr "æœç´¢å·²é‚€è¯·"
msgid "Member|Deny access"
msgstr "æ‹’ç»è®¿é—®"
-msgid "Member|Remove member"
-msgstr "移除æˆå‘˜"
-
msgid "Member|Revoke invite"
msgstr "撤销邀请"
@@ -22738,8 +23356,8 @@ msgstr "åˆå¹¶è¯·æ±‚å·²åˆå¹¶"
msgid "Merge automatically (%{strategy})"
msgstr "自动åˆå¹¶(%{strategy})"
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
-msgstr "åˆå¹¶è¢«é˜»æ­¢ï¼šå¿…é¡»åˆå¹¶æˆ–关闭所有åˆå¹¶è¯·æ±‚ä¾èµ–项。"
+msgid "Merge blocked: all merge request dependencies must be merged."
+msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
msgstr "åˆå¹¶è¢«é˜»æ­¢ï¼šåˆå¹¶è¯·æ±‚必须标记为就绪。它ä»ç„¶è¢«æ ‡è®°ä¸ºè‰ç¨¿ã€‚"
@@ -22813,8 +23431,8 @@ msgstr "åˆå¹¶è¯·æ±‚"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "åˆå¹¶è¯·æ±‚用于æ出对项目的更改并与他人进行讨论"
-msgid "Merge the branch and fix any conflicts that come up"
-msgstr "åˆå¹¶åˆ†æ”¯å¹¶è§£å†³å‡ºçŽ°çš„任何冲çª"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
+msgstr "将功能分支åˆå¹¶åˆ°ç›®æ ‡åˆ†æ”¯å¹¶ä¿®å¤ä»»ä½•å†²çªã€‚ %{linkStart}我该如何修å¤å®ƒä»¬ï¼Ÿ%{linkEnd}"
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
msgstr "åˆå¹¶ä¸å¯ç”¨ï¼šåˆå¹¶è¯·æ±‚åœ¨æ¬¡è¦ Geo 节点中是åªè¯»çš„。"
@@ -22901,10 +23519,10 @@ msgid "MergeRequests|Saving the comment failed"
msgstr "ä¿å­˜è¯„论失败"
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
-msgstr ""
+msgstr "压缩失败:本地æ交,解决任何存在的冲çªï¼Œç„¶åŽæŽ¨é€åˆ†æ”¯ã€‚"
msgid "MergeRequests|Squashing not allowed: This project doesn't allow you to squash commits when merging."
-msgstr ""
+msgstr "ä¸å…许压缩:此项目ä¸å…许您在åˆå¹¶æ—¶åŽ‹ç¼©æ交。"
msgid "MergeRequests|Thread stays resolved"
msgstr "主题ä¿æŒå·²è§£å†³çŠ¶æ€"
@@ -23366,9 +23984,6 @@ msgstr "例如:req / sec"
msgid "Mi"
msgstr "Mi"
-msgid "Middleman project with Static Site Editor support"
-msgstr "支æŒé™æ€ç«™ç‚¹ç¼–辑器的Middleman项目"
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr "å·²è¿ç§» %{success_count}/%{total_count} 文件。"
@@ -23487,6 +24102,9 @@ msgstr "关闭里程碑"
msgid "Milestones|Completed Issues (closed)"
msgstr "已完æˆçš„议题(已关闭)"
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "删除里程碑"
@@ -23505,6 +24123,9 @@ msgstr "未找到里程碑 %{milestoneTitle}"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr "处ç†ä¸­çš„议题(打开和已分é…)"
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr "项目里程碑"
@@ -23523,12 +24144,21 @@ msgstr "å‡çº§%{milestoneTitle}åŽï¼Œè¯¥é‡Œç¨‹ç¢‘å°†å¯ç”¨äºŽ%{groupName}群组å
msgid "Milestones|Reopen Milestone"
msgstr "é‡å¯é‡Œç¨‹ç¢‘"
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "该æ“作无法撤销。"
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr "未å¯åŠ¨çš„议题(开放和未分é…)"
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr "在我们预先安排更多镜åƒä¹‹å‰å¯ç”¨çš„最å°å®¹é‡ã€‚"
@@ -23646,6 +24276,9 @@ msgstr "月"
msgid "Months"
msgstr "月"
+msgid "More Details"
+msgstr "更多详情"
+
msgid "More Information"
msgstr "更多信æ¯"
@@ -23742,16 +24375,16 @@ msgstr "é‡æ–°éƒ¨ç½²"
msgid "MrDeploymentActions|Stop environment"
msgstr "终止环境"
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23788,7 +24421,7 @@ msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/e
msgstr "必须与 %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd} 中的 %{codeStart}geo_node_name%{codeEnd} 匹é…。%{linkStart}了解更多%{linkEnd}"
msgid "My awesome group"
-msgstr ""
+msgstr "我最棒的团队"
msgid "My company or team"
msgstr "我的公å¸æˆ–团队"
@@ -23857,6 +24490,33 @@ msgstr "您已ç»è¾¾åˆ°äº†ä¸€ä¸ªæˆ–多个项目的 %{free_size_limit} çš„å…è´¹å
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr "推é€åˆ°æ‚¨çš„仓库,创建æµæ°´çº¿ï¼Œåˆ›å»ºè®®é¢˜æˆ–添加评论。如需å‡å°‘存储使用,请删除未使用的仓库,产物,wiki,议题和æµæ°´çº¿ã€‚"
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr "%{name_with_link} 命å空间剩余 %{percent} 或更少的命å空间存储空间。"
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr "%{name_with_link} 命å空间已超出其命å空间存储é™åˆ¶ã€‚"
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr "%{name}(%{url}) 命å空间剩余 %{percent} 或更少命å空间存储空间。"
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr "%{name}(%{url}) 命å空间已超出其命å空间存储é™åˆ¶ã€‚"
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr "购买更多存储"
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr "我们建议您购买é¢å¤–存储,确ä¿æ‚¨çš„æœåŠ¡ä¸ä¸­æ–­ã€‚"
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr "我们建议您购买é¢å¤–的存储æ¥æ¢å¤æ­£å¸¸æœåŠ¡ã€‚"
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr "需è¦å®¡æ ¸çš„用户必须由群组所有者审核。了解更多关于%{user_caps_link_start}用户上é™%{link_end}å’Œ%{users_pending_approval_link_start}用户等待批准%{link_end}çš„ä¿¡æ¯ã€‚"
@@ -23932,6 +24592,9 @@ msgstr "退出并登录到其他账å·"
msgid "Need help?"
msgstr "如需帮助:"
+msgid "Need your attention"
+msgstr "需è¦æ‚¨çš„注æ„"
+
msgid "Needs"
msgstr "Needs"
@@ -24118,9 +24781,6 @@ msgstr "从ä¸"
msgid "New"
msgstr "新增"
-msgid "New %{issueType}"
-msgstr "新建%{issueType}"
-
msgid "New %{type} in %{project}"
msgstr "在 %{project} 中新建 %{type}"
@@ -24212,6 +24872,9 @@ msgstr "新建目录"
msgid "New discussion"
msgstr "新建讨论"
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr "新环境"
@@ -24287,6 +24950,9 @@ msgstr "新建项目/仓库"
msgid "New public deploy key"
msgstr "新建公共部署密钥"
+msgid "New related %{issueType}"
+msgstr "新建关è”çš„ %{issueType}"
+
msgid "New release"
msgstr "新建å‘布"
@@ -24302,9 +24968,6 @@ msgstr "已生æˆæ–°çš„Runner注册令牌ï¼"
msgid "New schedule"
msgstr "新建计划"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr "为选定的 Google Cloud 项目生æˆæ–°çš„æœåŠ¡å¸æˆ·"
-
msgid "New snippet"
msgstr "新建代ç ç‰‡æ®µ"
@@ -24353,6 +25016,9 @@ msgstr "下一次扫æ"
msgid "Next unresolved discussion"
msgstr "下一个未解决的讨论"
+msgid "Next update"
+msgstr "下次更新"
+
msgid "Nickname"
msgstr "昵称"
@@ -24401,6 +25067,9 @@ msgstr "未找到产物"
msgid "No assignee"
msgstr "无指派人"
+msgid "No attention request"
+msgstr "没有关注请求"
+
msgid "No authentication methods configured."
msgstr "未é…置身份验è¯æ–¹æ³•ã€‚"
@@ -24428,12 +25097,6 @@ msgstr "此处无æ交"
msgid "No committers"
msgstr "没有æ交者"
-msgid "No compliance frameworks are in use."
-msgstr "没有使用中的åˆè§„框架。"
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr "没有使用中的åˆè§„框架。从群组设置中的 %{link} 部分创建一个。"
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr "没有收到确认邮件?检查您的垃圾邮件文件夹或 %{request_link_start}请求新的确认邮件%{request_link_end}。"
@@ -24512,9 +25175,6 @@ msgstr "未å‘现议题"
msgid "No iteration"
msgstr "无迭代"
-msgid "No iterations found"
-msgstr "未找到迭代"
-
msgid "No iterations to show"
msgstr "没有å¯æ˜¾ç¤ºè¿­ä»£"
@@ -24536,8 +25196,8 @@ msgstr "未设定许å¯è¯ã€‚版æƒæ‰€æœ‰ã€‚"
msgid "No matches found"
msgstr "没有找到匹é…项"
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
-msgstr "未找到匹é…的议题。请确ä¿æ‚¨æ­£åœ¨æ·»åŠ ä¸€ä¸ªæœ‰æ•ˆçš„议题 URL。"
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
+msgstr "æœªæ‰¾åˆ°åŒ¹é… %{issuable} 的地å€ã€‚请确ä¿æ‚¨æ­£åœ¨æ·»åŠ ä¸€ä¸ªæœ‰æ•ˆçš„ %{issuable} URL。"
msgid "No matching labels"
msgstr "没有匹é…的标记"
@@ -24569,9 +25229,6 @@ msgstr "未记录任何消æ¯"
msgid "No milestone"
msgstr "无里程碑"
-msgid "No milestones to show"
-msgstr "没有è¦æ˜¾ç¤ºçš„里程碑"
-
msgid "No namespace"
msgstr "没有命å空间"
@@ -24618,7 +25275,7 @@ msgid "No ref selected"
msgstr "未选择ref"
msgid "No regions configured"
-msgstr ""
+msgstr "未é…置区域"
msgid "No related merge requests found."
msgstr "未找到相关的åˆå¹¶è¯·æ±‚。"
@@ -24653,6 +25310,9 @@ msgstr "没有符åˆæ‚¨æœç´¢æ¡ä»¶çš„星标用户"
msgid "No start date"
msgstr "没有开始日期"
+msgid "No suggestions found"
+msgstr "未找到任何建议"
+
msgid "No tag selected"
msgstr "未选中标签"
@@ -24807,6 +25467,9 @@ msgstr "仅显示历å²è®°å½•"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr "自您开始编辑以æ¥ï¼Œæ­¤è¯„论已更改,请查看 %{open_link}更新过的评论%{close_link} 以确ä¿ä¿¡æ¯ä¸ä¼šä¸¢å¤±"
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr "此评论是ä¿å¯†çš„,åªå¯¹é¡¹ç›®æˆå‘˜å¯è§"
@@ -25243,12 +25906,12 @@ msgstr "管ç†ç«™ç‚¹é…置文件"
msgid "OnDemandScans|My daily scan"
msgstr "我的æ¯æ—¥æ‰«æ"
-msgid "OnDemandScans|New DAST scan"
-msgstr "创建新的 DAST 扫æ"
-
msgid "OnDemandScans|New on-demand DAST scan"
msgstr "新建按需扫æDAST"
+msgid "OnDemandScans|New scan"
+msgstr ""
+
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
msgstr "å°šæ— é…置文件。如需创建新扫æ,需è¦è‡³å°‘有一个完整的扫æ工具é…置文件。"
@@ -25391,6 +26054,9 @@ msgstr "仅活动的项目显示在æœç´¢å’Œä»ªè¡¨æ¿ä¸Šã€‚"
msgid "Only admins can delete project"
msgstr "åªæœ‰ç®¡ç†å‘˜å¯ä»¥åˆ é™¤é¡¹ç›®"
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr "åªå…许任何人在您打算被任何人使用的 GitLab 实例上注册å¸æˆ·ã€‚å…许任何人注册会使 GitLab 实例更容易å—到攻击。"
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr "仅在å¯ç”¨è¿œç¨‹å­˜å‚¨æ—¶æœ‰æ•ˆã€‚设置为 0 表示没有大å°é™åˆ¶ã€‚"
@@ -25409,17 +26075,14 @@ msgstr "åªæœ‰åœ¨æ‚¨ä¿¡ä»» %{idp_url} æ—¶æ‰èƒ½ç»§ç»­æŽ§åˆ¶GitLabå¸æˆ·ç™»å½•ã€‚
msgid "Only project members can comment."
msgstr "åªæœ‰é¡¹ç›®æˆå‘˜å¯ä»¥å‘表评论。"
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr "仅导入项目æˆå‘˜ã€‚群组æˆå‘˜å°†è¢«è·³è¿‡ã€‚"
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
-msgstr "åªæœ‰åœ¨æ——舰版许å¯ä¸‹åˆ›å»ºçš„项目æ‰èƒ½åœ¨å®‰å…¨ä»ªè¡¨æ¿ä¸­ä½¿ç”¨ã€‚"
+msgstr "åªæœ‰åœ¨æ——舰版许å¯ä¸‹åˆ›å»ºçš„项目æ‰èƒ½åœ¨å®‰å…¨ä»ªè¡¨ç›˜ä¸­ä½¿ç”¨ã€‚"
msgid "Only reCAPTCHA v2 is supported:"
msgstr "仅支æŒreCAPTCHA v2:"
msgid "Only required if not using role instance credentials."
-msgstr ""
+msgstr "仅当ä¸ä½¿ç”¨è§’色实例凭æ®æ—¶æ‰éœ€è¦ã€‚"
msgid "Only use lowercase letters, numbers, and underscores."
msgstr "仅使用å°å†™å­—æ¯ã€æ•°å­—和下划线。"
@@ -25442,12 +26105,12 @@ msgstr "开放中"
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 "打开 CLI 并连接到您想è¦å®‰è£…代ç†çš„集群。 使用此安装方法æ¥æœ€å°åŒ–任何手动步骤。令牌已ç»åŒ…å«åœ¨å‘½ä»¤ä¸­ã€‚"
-
msgid "Open errors"
msgstr "打开错误"
+msgid "Open in Gitpod"
+msgstr "在 Gitpod 中打开"
+
msgid "Open in Web IDE"
msgstr "在Web IDE中打开"
@@ -25460,9 +26123,6 @@ msgstr "在您的IDE中打开"
msgid "Open raw"
msgstr "打开原始文件"
-msgid "Open registration is enabled on your instance."
-msgstr "您实例上å¯ç”¨äº†å¼€æ”¾æ³¨å†Œã€‚"
-
msgid "Open sidebar"
msgstr "打开侧边æ "
@@ -25485,11 +26145,14 @@ msgid "Opened issues"
msgstr "å¼€å¯çš„议题"
msgid "OpenedNDaysAgo|Created"
-msgstr ""
+msgstr "已创建"
msgid "Opens in a new window"
msgstr "打开一个新窗å£"
+msgid "Opens new window"
+msgstr "打开新窗å£"
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr "æ“作失败。请检查 Pod 日志 %{pod_name} 了解更多信æ¯ã€‚"
@@ -25593,7 +26256,7 @@ msgid "OutboundRequests|Outbound requests"
msgstr "出站请求"
msgid "OutboundRequests|Requests to these domains and IP addresses are accessible to both system hooks and web hooks even when local requests are not allowed. IP ranges such as 1:0:0:0:0:0:0:0/124 and 127.0.0.0/28 are supported. Domain wildcards are not supported. To separate entries use commas, semicolons, or newlines. The allowlist can hold a maximum of 1000 entries. Domains must be IDNA encoded."
-msgstr ""
+msgstr "å³ä½¿ä¸å…许本地请求,系统 hook å’Œ Webhook 也å¯ä»¥è®¿é—®å¯¹è¿™äº›åŸŸåå’Œ IP 地å€çš„è¯·æ±‚ã€‚æ”¯æŒ 1:0:0:0:0:0:0:0/124 å’Œ 127.0.0.0/28 ç­‰ IP 范围。ä¸æ”¯æŒåŸŸå通é…符。è¦åˆ†éš”æ¡ç›®ï¼Œè¯·ä½¿ç”¨é€—å·ã€åˆ†å·æˆ–æ¢è¡Œç¬¦ã€‚å…许列表最多å¯åŒ…å« 1000 个æ¡ç›®ã€‚域å必须是 IDNA ç¼–ç çš„。"
msgid "OutboundRequests|Resolve IP addresses once and uses them to submit requests."
msgstr "解æžIP地å€å¹¶ä½¿ç”¨å®ƒä»¬æ交请求。"
@@ -25631,6 +26294,9 @@ msgstr "拥有者:"
msgid "Owner"
msgstr "所有者"
+msgid "Owners can modify this selection."
+msgstr "所有者å¯ä»¥ä¿®æ”¹æ­¤é€‰æ‹©ã€‚"
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr "å‘é€é‚®ä»¶æ—¶å‘生错误。"
@@ -26317,7 +26983,7 @@ msgid "PerformanceBar|Memory"
msgstr "内存"
msgid "PerformanceBar|Memory report"
-msgstr ""
+msgstr "内存报告"
msgid "PerformanceBar|Redis calls"
msgstr "Redis调用"
@@ -26397,6 +27063,9 @@ msgstr "PharibatoræœåŠ¡å™¨URL"
msgid "Phabricator Tasks"
msgstr "Phabricator任务"
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr "选择一个å称"
@@ -26629,49 +27298,52 @@ msgid "PipelineStatusTooltip|Pipeline: %{ci_status}"
msgstr "æµæ°´çº¿ï¼š%{ci_status}"
msgid "PipelineWizardDefaultCommitMessage|Add %{filename}"
-msgstr ""
+msgstr "添加 %{filename}"
msgid "PipelineWizardDefaultCommitMessage|Update %{filename}"
-msgstr ""
+msgstr "æ›´æ–° %{filename}"
msgid "PipelineWizardInputValidation|At least one entry is required"
-msgstr ""
+msgstr "至少需è¦ä¸€ä¸ªæ¡ç›®"
msgid "PipelineWizardInputValidation|This field is required"
-msgstr ""
+msgstr "此字段是必需的"
msgid "PipelineWizardInputValidation|This value is not valid"
-msgstr ""
+msgstr "此值无效"
msgid "PipelineWizardListWidget|add another step"
-msgstr ""
+msgstr "添加å¦ä¸€ä¸ªæ­¥éª¤"
msgid "PipelineWizardListWidget|remove step"
-msgstr ""
+msgstr "移除步骤"
msgid "PipelineWizard|Commit"
-msgstr ""
+msgstr "æ交"
msgid "PipelineWizard|Commit Message"
-msgstr ""
+msgstr "æ交消æ¯"
msgid "PipelineWizard|Commit changes to your file"
-msgstr ""
+msgstr "æ交你对文件的更改"
msgid "PipelineWizard|Commit file to Branch"
-msgstr ""
+msgstr "æ交文件到分支"
msgid "PipelineWizard|Commit your new file"
-msgstr ""
+msgstr "æ交您的新文件"
msgid "PipelineWizard|The file has been committed."
-msgstr ""
+msgstr "文件已æ交。"
msgid "PipelineWizard|There was a problem committing the changes."
-msgstr ""
+msgstr "æ交更改时出现问题。"
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
-msgstr ""
+msgstr "检查您的文件是å¦å·²å­˜åœ¨äºŽæŒ‡å®šåˆ†æ”¯æ—¶å‡ºçŽ°é—®é¢˜ã€‚"
+
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr "å°è¯•è®¾ç½®æ¨¡æ¿æ—¶å‘生æ„外错误。错误已被记录。"
msgid "Pipelines"
msgstr "æµæ°´çº¿"
@@ -26682,12 +27354,15 @@ msgstr "æµæ°´çº¿ç»Ÿè®¡å›¾"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr "“%{project_name}â€çš„æµæ°´çº¿è®¾ç½®å·²æˆåŠŸæ›´æ–°ã€‚"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr "使用 GitLab CI 实现 \"Hello world\""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr "GitLab Runner 是一个使用 GitLab CI/CD 在æµæ°´çº¿ä¸­è¿è¡Œä½œä¸šçš„应用程åºã€‚安装 GitLab Runner 并注册您自己的 runner æ¥å¼€å§‹ä½¿ç”¨ CI/CD。"
+
msgid "Pipelines|API"
msgstr "API"
-msgid "Pipelines|Add a code quality job"
-msgstr "添加代ç è´¨é‡ä½œä¸š"
-
msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr "您确定è¦è¿è¡Œè¿™æ¡æµæ°´çº¿å—?"
@@ -26707,7 +27382,7 @@ msgid "Pipelines|CI/CD template to test and deploy your %{name} project."
msgstr "用于测试和部署您的 %{name} 项目的 CI/CD 模æ¿ã€‚"
msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
+msgstr "å­æµæ°´çº¿ï¼ˆ%{link_start}父æµæ°´çº¿%{link_end})"
msgid "Pipelines|Clear runner caches"
msgstr "清除Runner缓存"
@@ -26733,8 +27408,8 @@ msgstr "编辑"
msgid "Pipelines|Editor"
msgstr "编辑器"
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
-msgstr "从基本的 3 阶段 CI/CD æµæ°´çº¿å¼€å§‹ï¼Œç†Ÿæ‚‰ GitLab CI/CD 语法。"
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
+msgstr "通过设置一个è¿è¡Œ \"Hello world\" 脚本的简å•æµæ°´çº¿æ¥ç†Ÿæ‚‰ GitLab CI 语法,查看它如何è¿è¡Œï¼ŒæŽ¢ç´¢ CI/CD 的工作方å¼ã€‚"
msgid "Pipelines|Get started with GitLab CI/CD"
msgstr "开始使用 GitLab CI/CD"
@@ -26742,14 +27417,14 @@ msgstr "开始使用 GitLab CI/CD"
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr "GitLab CI/CDå¯ä»¥è‡ªåŠ¨æž„建,测试和部署您的代ç ã€‚让GitLab处ç†è´¹æ—¶çš„任务,您就有花更多的时间进行创造性的工作。"
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
+msgstr "GitLab Runner 是一个与 GitLab CI/CD åˆä½œåœ¨æµæ°´çº¿ä¸­è¿è¡Œä½œä¸šçš„应用程åºã€‚现在有å¯ç”¨çš„ runner å¯ä»¥è¿è¡Œæ‚¨çš„作业。您å¯ä»¥%{settingsLinkStart}é…置您的 runner%{settingsLinkEnd} 或%{docsLinkStart}了解更多关于 runner çš„ä¿¡æ¯%{docsLinkEnd}。"
+
msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr "如果您ä¸ç¡®å®šï¼Œè¯·é¡¹ç›®ç»´æŠ¤è€…为您审核。"
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
-msgstr "使用 GitLab CI/CD æ高代ç è´¨é‡"
-
-msgid "Pipelines|Install GitLab Runners"
-msgstr "安装 GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
+msgstr "安装 GitLab Runner"
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr "建议在使用父项目的CI资æºè¿è¡Œæ­¤æµæ°´çº¿ä¹‹å‰å¯¹ä»£ç è¿›è¡Œè¯¦å°½çš„审核。"
@@ -26757,8 +27432,8 @@ msgstr "建议在使用父项目的CI资æºè¿è¡Œæ­¤æµæ°´çº¿ä¹‹å‰å¯¹ä»£ç è¿›è
msgid "Pipelines|Last Used"
msgstr "最近使用"
-msgid "Pipelines|Learn about Runners"
-msgstr "了解 Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
+msgstr "学习æµæ°´çº¿å’Œ .yml 文件的基础知识"
msgid "Pipelines|Lint"
msgstr "Lint"
@@ -26775,6 +27450,9 @@ msgstr "åˆå¹¶åŽçš„ YAML ä»…ä¾›æµè§ˆ"
msgid "Pipelines|More Information"
msgstr "更多信æ¯"
+msgid "Pipelines|No runners detected"
+msgstr "未检测到 runner"
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr "尚未创建触å‘器。请使用上é¢çš„表å•æ·»åŠ è§¦å‘器。"
@@ -26787,8 +27465,14 @@ msgstr "æµæ°´çº¿ç¼–辑器"
msgid "Pipelines|Project cache successfully reset."
msgstr "项目缓存é‡ç½®æˆåŠŸã€‚"
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr "准备好为您的项目设置 CI/CD å—?"
+
msgid "Pipelines|Revoke trigger"
-msgstr ""
+msgstr "撤销触å‘器"
+
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr "Runner 现在å¯ä»¥è¿è¡Œæ‚¨çš„作业"
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr "清ç†runner缓存时å‘生错误。"
@@ -26833,10 +27517,10 @@ msgid "Pipelines|This is a child pipeline within the parent pipeline"
msgstr "æ­¤æµæ°´çº¿ä¸ºå…·æœ‰çˆ¶æµæ°´çº¿çš„å­æµæ°´çº¿"
msgid "Pipelines|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
-msgstr ""
+msgstr "æ­¤æµæ°´çº¿åœ¨æ­¤åˆå¹¶è¯·æ±‚的内容上è¿è¡Œï¼Œå¹¶ç»“åˆæ‰€æœ‰å…¶å®ƒæŽ’队等待åˆå¹¶åˆ°ç›®æ ‡åˆ†æ”¯çš„åˆå¹¶è¯·æ±‚的内容。"
msgid "Pipelines|This pipeline ran on the contents of this merge request's source branch, not the target branch."
-msgstr ""
+msgstr "æ­¤æµæ°´çº¿åœ¨æ­¤åˆå¹¶è¯·æ±‚çš„æºåˆ†æ”¯çš„内容上è¿è¡Œï¼Œè€Œä¸æ˜¯ç›®æ ‡åˆ†æ”¯ã€‚"
msgid "Pipelines|This pipeline will run code originating from a forked project merge request. This means that the code can potentially have security considerations like exposing CI variables."
msgstr "此管é“å°†è¿è¡Œæºè‡ªæ´¾ç”Ÿé¡¹ç›®åˆå¹¶è¯·æ±‚的代ç ã€‚ è¿™æ„味ç€è¯¥ä»£ç å¯èƒ½å­˜åœ¨å®‰å…¨é—®é¢˜ï¼Œå¦‚暴露CIå˜é‡ã€‚"
@@ -26844,24 +27528,18 @@ msgstr "此管é“å°†è¿è¡Œæºè‡ªæ´¾ç”Ÿé¡¹ç›®åˆå¹¶è¯·æ±‚的代ç ã€‚ è¿™æ„味ç
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr "此项目当å‰æœªé…ç½®è¿è¡Œæµæ°´çº¿ã€‚"
-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 "为了使您的代ç åº“ä¿æŒç®€å•ã€å¯è¯»å¹¶å¯ä¾›è´¡çŒ®è€…访问,å¯ä»¥ä½¿ç”¨ GitLab CI/CD æ¥åˆ†æžæ‚¨æ¯æ¬¡æŽ¨é€åˆ°é¡¹ç›®çš„代ç è´¨é‡ã€‚"
-
msgid "Pipelines|Token"
msgstr "令牌"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr "触å‘用户没有足够的项目æƒé™"
-msgid "Pipelines|Use a CI/CD template"
-msgstr "使用 CI/CD 模æ¿"
+msgid "Pipelines|Try test template"
+msgstr "å°è¯•æµ‹è¯•æ¨¡æ¿"
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr "使用 %{codeStart}.gitlab-ci.yml%{codeEnd} 模æ¿æ–‡ä»¶æ¥æŽ¢ç´¢CI/CD 如何工作。"
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr "使用 CI/CD 模æ¿"
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr "使用基于您的项目语言或框架的模æ¿å¼€å§‹ä½¿ç”¨ GitLab CI/CD。"
@@ -26890,10 +27568,10 @@ msgid "Pipelines|latest"
msgstr "最新"
msgid "Pipelines|merge request"
-msgstr ""
+msgstr "åˆå¹¶è¯·æ±‚"
msgid "Pipelines|merge train"
-msgstr ""
+msgstr "åˆå¹¶é˜Ÿåˆ—"
msgid "Pipelines|stuck"
msgstr "阻塞"
@@ -26919,9 +27597,6 @@ msgstr "检查æµæ°´çº¿çŠ¶æ€"
msgid "Pipeline|Checking pipeline status."
msgstr "检查æµæ°´çº¿çŠ¶æ€ã€‚"
-msgid "Pipeline|Commit"
-msgstr "æ交"
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr "无法获å–æµæ°´çº¿çŠ¶æ€ã€‚有关故障排除步骤,请å‚阅%{linkStart}文档%{linkEnd}。"
@@ -26937,9 +27612,6 @@ msgstr "日期"
msgid "Pipeline|Detached merge request pipeline"
msgstr "游离的åˆå¹¶è¯·æ±‚æµæ°´çº¿"
-msgid "Pipeline|Duration"
-msgstr "时长"
-
msgid "Pipeline|Failed"
msgstr "失败"
@@ -27028,10 +27700,10 @@ msgid "Pipeline|This change will not change the overall test coverage if merged.
msgstr "如果åˆå¹¶ï¼Œæ­¤æ›´æ”¹ä¸ä¼šæ›´æ”¹æ•´ä½“测试覆盖率。"
msgid "Pipeline|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
-msgstr ""
+msgstr "æ­¤æµæ°´çº¿åœ¨æ­¤åˆå¹¶è¯·æ±‚的内容上è¿è¡Œï¼Œå¹¶ç»“åˆæ‰€æœ‰å…¶å®ƒæŽ’队等待åˆå¹¶åˆ°ç›®æ ‡åˆ†æ”¯çš„åˆå¹¶è¯·æ±‚的内容。"
msgid "Pipeline|This pipeline ran on the contents of this merge request's source branch, not the target branch."
-msgstr ""
+msgstr "æ­¤æµæ°´çº¿åœ¨æ­¤åˆå¹¶è¯·æ±‚çš„æºåˆ†æ”¯çš„内容上è¿è¡Œï¼Œè€Œä¸æ˜¯ç›®æ ‡åˆ†æ”¯ã€‚"
msgid "Pipeline|Trigger author"
msgstr "触å‘者"
@@ -27058,10 +27730,10 @@ msgid "Pipeline|for"
msgstr "使用æ交"
msgid "Pipeline|merge request"
-msgstr ""
+msgstr "åˆå¹¶è¯·æ±‚"
msgid "Pipeline|merge train"
-msgstr ""
+msgstr "åˆå¹¶é˜Ÿåˆ—"
msgid "Pipeline|on"
msgstr "于"
@@ -27273,9 +27945,6 @@ msgstr "请选择一个文件"
msgid "Please select a group"
msgstr "请选择一个群组"
-msgid "Please select a group."
-msgstr "请选择一个群组。"
-
msgid "Please select a valid target branch"
msgstr "请选择一个有效的目标分支"
@@ -27330,14 +27999,14 @@ msgstr "未找到Pod"
msgid "Pods in use"
msgstr "正在使用的Pod"
-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 "指å‘您需è¦çš„任何链接:文档,生æˆçš„二进制文件或其他相关æ料。这些å¯ä»¥æ˜¯æ‚¨çš„GitLab实例的内部或外部链接。ä¸å…许é‡å¤çš„URL。"
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
+msgstr "指å‘您喜欢的任何链接:文档ã€æž„建的二进制文件或其他相关æ料。这些å¯ä»¥æ˜¯æ¥è‡ª GitLab 实例的内部或外部链接。æ¯ä¸ª URL 和链接标题必须是唯一的。"
msgid "Policies"
msgstr "ç­–ç•¥"
msgid "Policy '%{escalation_policy_name}' does not exist."
-msgstr ""
+msgstr "策略“%{escalation_policy_name}â€ä¸å­˜åœ¨ã€‚"
msgid "Policy management project does have any policies in %{policy_path}"
msgstr "策略管ç†é¡¹ç›®çš„任何策略ä½äºŽ%{policy_path}"
@@ -27346,16 +28015,16 @@ msgid "Policy project doesn't exist"
msgstr "策略项目ä¸å­˜åœ¨"
msgid "PolicyRuleMultiSelect|%{firstLabel} +%{numberOfAdditionalLabels} more"
-msgstr ""
+msgstr "%{firstLabel} +%{numberOfAdditionalLabels} 更多"
msgid "PolicyRuleMultiSelect|All %{itemTypeName}"
-msgstr ""
+msgstr "所有 %{itemTypeName}"
msgid "PolicyRuleMultiSelect|Select %{itemTypeName}"
-msgstr ""
+msgstr "选择 %{itemTypeName}"
msgid "PolicyRuleMultiSelect|Select all"
-msgstr ""
+msgstr "选择所有"
msgid "Polling interval multiplier"
msgstr "轮询间隔å€æ•°"
@@ -27375,8 +28044,8 @@ msgstr "Postman 集åˆæ–‡ä»¶è·¯å¾„或 URL"
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr "检测到å¯èƒ½ä¸éœ€è¦çš„字符:Unicode BiDi Control"
-msgid "Pre-defined push rules."
-msgstr "预定义的推é€è§„则。"
+msgid "Pre-defined push rules"
+msgstr "预定义推é€è§„则"
msgid "Preferences"
msgstr "å好设置"
@@ -27483,6 +28152,9 @@ msgstr "使用相对时间"
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr "当您在æ述或评论框中键入时,在键入以下字符之一åŽï¼Œé€‰å®šçš„文本将被相应的字符包围:%{supported_characters}。"
+msgid "Preparing the report for the scan."
+msgstr "准备扫æ报告。"
+
msgid "Prev"
msgstr "上一页"
@@ -27502,7 +28174,7 @@ msgid "Prevent project forking outside current group"
msgstr "阻止项目派生到当å‰ç¾¤ç»„以外"
msgid "Prevent users from changing their profile name"
-msgstr "ç¦æ­¢ç”¨æˆ·æ›´æ”¹é…置文件å称"
+msgstr "ç¦æ­¢ç”¨æˆ·æ›´æ”¹ä¸ªäººèµ„æ–™å称"
msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr "防止用户在维护期间执行写æ“作。"
@@ -27586,7 +28258,7 @@ msgid "Private projects can be created in your personal namespace with:"
msgstr "ç§æœ‰é¡¹ç›®å¯ä»¥åœ¨ä¸ªäººå称空间中创建:"
msgid "Problem with %{name} command: %{message}."
-msgstr ""
+msgstr "%{name} 命令出错: %{message}。"
msgid "Proceed"
msgstr "继续"
@@ -27792,6 +28464,9 @@ msgstr "输入您的密ç ä»¥ç¡®è®¤ç”µå­é‚®ä»¶æ›´æ”¹"
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr "输入您的代è¯ï¼Œè®©äººä»¬çŸ¥é“如何称呼您"
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr "到期日期"
@@ -27813,9 +28488,6 @@ 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 "GitLab 无法自动验è¯æ‚¨çš„身份。为了安全起è§ï¼Œæ‚¨å¿…须通过 %{openingTag}é‡ç½®æ‚¨çš„密ç %{closingTag} 进行密ç è®¾ç½®æ¥åˆ é™¤æ‚¨çš„è´¦å·ã€‚"
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr "为您的个人密钥命å。这将是公开å¯è§çš„。"
-
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 "如果设置密ç åŽï¼Œåˆ é™¤è´¦å·çš„选项ä»ç„¶ä¸å¯ç”¨ï¼Œè¯·å‘é€ç”µå­é‚®ä»¶ %{data_request} 开始账å·åˆ é™¤æµç¨‹ã€‚"
@@ -27852,6 +28524,9 @@ msgstr "密钥在此日期无效,SSH 密钥的最大有效期为 %{max_ssh_key
msgid "Profiles|Key can still be used after expiration."
msgstr "密钥到期åŽä»å¯ä½¿ç”¨ã€‚"
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr "密钥在过期日期åŽä»å¯ä½¿ç”¨ã€‚"
@@ -27957,6 +28632,9 @@ msgstr "此信æ¯å°†æ˜¾ç¤ºåœ¨æ‚¨çš„个人资料中"
msgid "Profiles|Time settings"
msgstr "时间设置"
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr "åŒé‡è®¤è¯"
@@ -28038,9 +28716,6 @@ msgstr "您的姓å是根æ®æ‚¨çš„ %{provider_label} å¸æˆ·è‡ªåŠ¨è®¾ç½®çš„,ä»
msgid "Profiles|Your status"
msgstr "您当å‰çš„状æ€ï¼Ÿ"
-msgid "Profiles|e.g. My MacBook key"
-msgstr "例如: My MacBook Key"
-
msgid "Profiles|https://website.com"
msgstr "https://website.com"
@@ -28063,7 +28738,7 @@ msgid "Progress"
msgstr "进度"
msgid "Progress tracking"
-msgstr ""
+msgstr "进展跟踪"
msgid "Project"
msgstr "项目"
@@ -28219,7 +28894,7 @@ msgid "Project visibility level will be changed to match namespace rules when tr
msgstr "当项目转移到群组åŽï¼Œå…¶å¯è§æ€§çº§åˆ«å°†æ›´æ”¹ä¸ºä¸Žå‘½å空间规则匹é…。"
msgid "Project was not found or you do not have permission to add this project to Security Dashboards."
-msgstr "未找到项目或者您没有æƒé™å°†æ­¤é¡¹ç›®æ·»åŠ åˆ°å®‰å…¨ä»ªè¡¨æ¿ã€‚"
+msgstr "未找到项目或者您没有æƒé™å°†æ­¤é¡¹ç›®æ·»åŠ åˆ°å®‰å…¨ä»ªè¡¨ç›˜ã€‚"
msgid "Project: %{name}"
msgstr "项目: %{name}"
@@ -28297,7 +28972,7 @@ msgid "ProjectQualitySummary|Failure"
msgstr "失败"
msgid "ProjectQualitySummary|Get insight into the overall percentage of tests in your project that succeed, fail and are skipped."
-msgstr ""
+msgstr "深入了解项目中æˆåŠŸã€å¤±è´¥å’Œè¢«è·³è¿‡çš„测试的总体百分比。"
msgid "ProjectQualitySummary|Latest pipeline results"
msgstr "最新æµæ°´çº¿ç»“æžœ"
@@ -28318,10 +28993,10 @@ msgid "ProjectQualitySummary|See project Code Coverage Statistics"
msgstr "查看项目代ç è¦†ç›–率统计"
msgid "ProjectQualitySummary|Set up test runs"
-msgstr ""
+msgstr "设置测试è¿è¡Œ"
msgid "ProjectQualitySummary|Set up test runs (opens in a new tab)"
-msgstr ""
+msgstr "设置测试è¿è¡Œï¼ˆåœ¨æ–°æ ‡ç­¾ä¸­æ‰“开)"
msgid "ProjectQualitySummary|Skipped"
msgstr "跳过"
@@ -28545,8 +29220,8 @@ msgstr "æ¯æ¬¡åˆå¹¶éƒ½ä¼šåˆ›å»ºä¸€ä¸ªåˆå¹¶æ交。"
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr "æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å…¶Dockeré•œåƒ"
-msgid "ProjectSettings|Every project can have its own space to store its packages."
-msgstr "æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å®ƒçš„软件包。"
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
+msgstr ""
msgid "ProjectSettings|Everyone"
msgstr "所有人"
@@ -28600,10 +29275,10 @@ msgid "ProjectSettings|LFS objects from this repository are available to forks.
msgstr "此仓库中的 LFS 对象å¯ä¾›æ´¾ç”Ÿã€‚ %{linkStart}我如何移除它们?%{linkEnd}"
msgid "ProjectSettings|Learn about commit history."
-msgstr ""
+msgstr "了解æ交历å²ã€‚"
msgid "ProjectSettings|Leave empty to use default template."
-msgstr ""
+msgstr "留空使用默认模æ¿ã€‚"
msgid "ProjectSettings|Manage who can see the project in the public access directory."
msgstr "管ç†è°å¯ä»¥åœ¨å…¬å…±è®¿é—®ç›®å½•ä¸­çœ‹åˆ°è¿™ä¸ªé¡¹ç›®ã€‚"
@@ -28612,7 +29287,7 @@ msgid "ProjectSettings|Manages large files such as audio, video, and graphics fi
msgstr "管ç†å¤§åž‹æ–‡ä»¶ï¼Œä¾‹å¦‚音频ã€è§†é¢‘和图形文件。"
msgid "ProjectSettings|Maximum %{maxLength} characters."
-msgstr ""
+msgstr "最多 %{maxLength} 个字符。"
msgid "ProjectSettings|Merge checks"
msgstr "åˆå¹¶æ£€æŸ¥"
@@ -28644,6 +29319,9 @@ msgstr "如果最新æµæ°´çº¿æœªæˆåŠŸæˆ–ä»åœ¨è¿è¡Œï¼Œåˆ™æ— æ³•åˆå¹¶åˆå¹¶è¯·
msgid "ProjectSettings|Merge suggestions"
msgstr "åˆå¹¶å»ºè®®"
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr "åªæœ‰å½“æºåˆ†æ”¯ä¸Žå…¶ç›®æ ‡æ˜¯æœ€æ–°çš„时候,æ‰å…许åˆå¹¶ã€‚"
+
msgid "ProjectSettings|No merge commits are created."
msgstr "没有创建åˆå¹¶æ交。"
@@ -28753,7 +29431,7 @@ msgid "ProjectSettings|The default target project for merge requests created in
msgstr "在此派生项目中创建的åˆå¹¶è¯·æ±‚的默认目标项目。"
msgid "ProjectSettings|The default template will be applied on save."
-msgstr ""
+msgstr "ä¿å­˜æ—¶å°†åº”用默认模æ¿ã€‚"
msgid "ProjectSettings|These checks must pass before merge requests can be merged."
msgstr "必须通过这些检查æ‰èƒ½åˆå¹¶åˆå¹¶è¯·æ±‚。"
@@ -28810,11 +29488,14 @@ msgid "ProjectSettings|What are badges?"
msgstr "什么是徽章?"
msgid "ProjectSettings|What are merge trains?"
-msgstr ""
+msgstr "什么是åˆå¹¶é˜Ÿåˆ—?"
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr "在 CI/CD é…置文件中å¯ç”¨åˆå¹¶è¯·æ±‚æµæ°´çº¿æ—¶ï¼Œæµæ°´çº¿ä¼šéªŒè¯æºåˆ†æ”¯å’Œç›®æ ‡åˆ†æ”¯çš„组åˆç»“果。%{link_start}如何é…ç½®åˆå¹¶è¯·æ±‚æµæ°´çº¿ï¼Ÿ%{link_end}"
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr "当åŠçº¿æ€§åˆå¹¶ä¸å¯èƒ½æ—¶ï¼Œç”¨æˆ·å¯ä»¥é€‰æ‹©å˜åŸºã€‚"
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr "当出现åˆå¹¶å†²çªæ—¶ï¼Œç”¨æˆ·å¯ä»¥é€‰æ‹©å˜åŸºï¼ˆrebase)。"
@@ -28878,6 +29559,9 @@ msgstr "Pages/Hugo"
msgid "ProjectTemplates|Pages/Jekyll"
msgstr "Pages/Jekyll"
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Pages/Plain HTML"
@@ -28896,9 +29580,6 @@ msgstr "Serverless Framework/JS"
msgid "ProjectTemplates|Spring"
msgstr "Spring"
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr "é™æ€ç«™ç‚¹ç¼–辑器/Middleman"
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr "Tencent Serverless 框架/NextjsSSR"
@@ -28930,7 +29611,7 @@ msgid "Projects are organized into groups"
msgstr "项目被组织æˆç¾¤ç»„"
msgid "Projects are where you store your code, access issues, wiki and other features of GitLab."
-msgstr ""
+msgstr "项目是您存储您的代ç ã€è®¿é—®è®®é¢˜ã€wiki 和其它功能的地方。"
msgid "Projects contributed to"
msgstr "贡献的项目"
@@ -29032,7 +29713,7 @@ msgid "ProjectsNew|Import project"
msgstr "导入项目"
msgid "ProjectsNew|Include a Getting Started README"
-msgstr ""
+msgstr "包å«ä¸€ä¸ªè‡ªè¿°æ–‡ä»¶"
msgid "ProjectsNew|Initialize repository with a README"
msgstr "使用自述文件åˆå§‹åŒ–仓库"
@@ -29043,6 +29724,12 @@ msgstr "从外部æºï¼ˆå¦‚ GitHubã€Bitbucket 或 GitLab 的其他实例)è¿ç§
msgid "ProjectsNew|No import options available"
msgstr "没有å¯ç”¨çš„导入选项"
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr "项目é…ç½®"
@@ -29050,7 +29737,7 @@ msgid "ProjectsNew|Project description %{tag_start}(optional)%{tag_end}"
msgstr "项目æè¿°%{tag_start}(å¯é€‰)%{tag_end}"
msgid "ProjectsNew|Recommended if you're new to GitLab"
-msgstr ""
+msgstr "如果您是 GitLab 新手,建议使用"
msgid "ProjectsNew|Run CI/CD for external repository"
msgstr "为外部仓库è¿è¡ŒCI/CD"
@@ -29470,7 +30157,7 @@ msgid "ProtectedBranch|Unprotect"
msgstr "å–消ä¿æŠ¤"
msgid "ProtectedBranch|Unprotect branch"
-msgstr ""
+msgstr "å–消ä¿æŠ¤åˆ†æ”¯"
msgid "ProtectedBranch|What are protected branches?"
msgstr "什么是å—ä¿æŠ¤çš„分支?"
@@ -29500,7 +30187,7 @@ msgid "ProtectedEnvironment|Protected Environment (%{protected_environments_coun
msgstr "å—ä¿æŠ¤çš„环境 (%{protected_environments_count})"
msgid "ProtectedEnvironment|Required approvals"
-msgstr ""
+msgstr "所需批准"
msgid "ProtectedEnvironment|Select an environment"
msgstr "选择一个环境"
@@ -29524,13 +30211,13 @@ msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "环境已ç»ä¸è¢«ä¿æŠ¤"
msgid "ProtectedTags|Unprotect tag"
-msgstr ""
+msgstr "å–消ä¿æŠ¤æ ‡ç­¾"
msgid "ProtectedTags|default"
msgstr "默认"
msgid "ProtectedTag|By default, protected tags restrict who can modify the tag."
-msgstr ""
+msgstr "默认情况下,å—ä¿æŠ¤çš„标签é™åˆ¶è°å¯ä»¥ä¿®æ”¹æ ‡ç­¾ã€‚"
msgid "ProtectedTag|Learn more."
msgstr "了解更多。"
@@ -29593,7 +30280,7 @@ msgid "Public projects Minutes cost factor"
msgstr "公开项目分钟æˆæœ¬ç³»æ•°"
msgid "Public projects are an easy way to allow everyone to have read-only access."
-msgstr ""
+msgstr "公开项目是使æ¯ä¸ªäººéƒ½èƒ½å¤Ÿåªè¯»è®¿é—®çš„一ç§ç®€å•æ–¹å¼ã€‚"
msgid "Publish to status page"
msgstr "å‘布到状æ€é¡µ"
@@ -29623,7 +30310,7 @@ msgid "Purchase more storage"
msgstr "购买更多存储"
msgid "PurchaseStep|An error occurred in the purchase step. If the problem persists please contact support at https://support.gitlab.com."
-msgstr ""
+msgstr "购买步骤出错。如果问题ä»ç„¶å­˜åœ¨ï¼Œè¯·è”系支æŒäººå‘˜ã€‚"
msgid "Push"
msgstr "推é€"
@@ -29652,8 +30339,11 @@ msgstr "推é€äº‹ä»¶"
msgid "Push project from command line"
msgstr "从命令行推é€é¡¹ç›®"
-msgid "Push the result of the merge to GitLab"
-msgstr "å°†åˆå¹¶ç»“果推é€åˆ°GitLab"
+msgid "Push rules"
+msgstr "推é€è§„则"
+
+msgid "Push the target branch up to GitLab."
+msgstr "将目标分支推é€åˆ° GitLab。"
msgid "Push to create a project"
msgstr "通过推é€åˆ›å»ºé¡¹ç›®"
@@ -29836,7 +30526,7 @@ msgid "Read more about project permissions %{help_link_open}here%{help_link_clos
msgstr "于%{help_link_open}此处%{help_link_close}了解有关项目æƒé™çš„更多信æ¯"
msgid "Read more about related epics"
-msgstr ""
+msgstr "阅读更多关于相关å²è¯—çš„ä¿¡æ¯"
msgid "Read more about related issues"
msgstr "了解更多关于相关议题的信æ¯"
@@ -29869,7 +30559,7 @@ msgid "Rebase source branch on the target branch."
msgstr "在目标分支上Rebaseæºåˆ†æ”¯ã€‚"
msgid "Rebase without pipeline"
-msgstr ""
+msgstr "没有æµæ°´çº¿çš„å˜åŸº"
msgid "Recaptcha verified?"
msgstr "é‡æ–°éªŒè¯ï¼Ÿ"
@@ -29978,10 +30668,10 @@ msgid "Regex pattern"
msgstr "正则表达å¼"
msgid "Region"
-msgstr ""
+msgstr "区域"
msgid "Regions"
-msgstr ""
+msgstr "区域"
msgid "Register"
msgstr "注册"
@@ -30020,7 +30710,7 @@ msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr "å¯ç”¨æœåŠ¡ Ping 并注册此功能。"
msgid "RegistrationFeatures|Read more about the %{link_start}Registration Features Program%{link_end}."
-msgstr ""
+msgstr "阅读有关%{link_start}注册功能计划%{link_end}的更多信æ¯ã€‚"
msgid "RegistrationFeatures|Registration Features Program"
msgstr "Registration Features Program"
@@ -30082,9 +30772,15 @@ msgstr "é•œåƒåº“设置"
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr "é‡æ–°ç´¢å¼•çŠ¶æ€ï¼š %{status} (切片乘数: %{multiplier},最大è¿è¡Œåˆ‡ç‰‡ï¼š %{max_slices})"
+msgid "Reject"
+msgstr "æ‹’ç»"
+
msgid "Rejected (closed)"
msgstr "已拒ç»(关闭)"
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr "å…³è”到 %{issuable_type} %{add_related_issue_link}"
+
msgid "Related feature flags"
msgstr "相关的功能标志"
@@ -30094,9 +30790,6 @@ msgstr "相关议题"
msgid "Related merge requests"
msgstr "相关åˆå¹¶è¯·æ±‚"
-msgid "Related to #%{issue_id}."
-msgstr "与#%{issue_id}相关。"
-
msgid "Relates to"
msgstr "å…³è”到"
@@ -30228,7 +30921,7 @@ msgid "Remove attention request"
msgstr "删除关注请求"
msgid "Remove attention request(s)"
-msgstr ""
+msgstr "删除关注请求"
msgid "Remove avatar"
msgstr "删除头åƒ"
@@ -30326,6 +31019,9 @@ msgstr "删除消耗时间"
msgid "Remove time estimate"
msgstr "删除时间估计"
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr "删除用户"
@@ -30369,7 +31065,7 @@ msgid "Removed an issue from an epic."
msgstr "从å²è¯—中移除了一个议题。"
msgid "Removed attention from %{users_sentence}."
-msgstr ""
+msgstr "已从 %{users_sentence} 删除关注。"
msgid "Removed attention request from @%{username}"
msgstr "已从 @%{username} 移除关注请求"
@@ -30423,7 +31119,7 @@ msgid "Removes an issue from an epic."
msgstr "从å²è¯—中移除一个议题。"
msgid "Removes attention from %{users_sentence}."
-msgstr ""
+msgstr "从 %{users_sentence} 删除关注。"
msgid "Removes parent epic %{epic_ref}."
msgstr "删除父å²è¯—%{epic_ref}。"
@@ -30536,8 +31232,11 @@ msgstr "报告滥用"
msgid "Report abuse to admin"
msgstr "å‘管ç†å‘˜æŠ¥å‘Šæ»¥ç”¨è¡Œä¸º"
-msgid "Report is generating and will be sent to your email address."
-msgstr ""
+msgid "Report couldn't be prepared."
+msgstr "无法准备报告。"
+
+msgid "Report for the scan has been removed from the database."
+msgstr "扫æ报告已从数æ®åº“中删除。"
msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "由%{reportedBy}报告于%{timeAgo}"
@@ -30567,7 +31266,7 @@ msgstr[0] "æ— éšœç¢æ€§æ‰«æ检测到%d个仅存在于æºåˆ†æ”¯çš„问题"
msgid "Reports|Accessibility scanning detected %{strong_start}%{number}%{strong_end} issue for the source branch only"
msgid_plural "Reports|Accessibility scanning detected %{strong_start}%{number}%{strong_end} issues for the source branch only"
-msgstr[0] ""
+msgstr[0] "æ— éšœç¢æ€§æ‰«æ检测到 %{strong_start}%{number}%{strong_end} 个仅针对æºåˆ†æ”¯çš„问题"
msgid "Reports|Accessibility scanning detected no issues for the source branch only"
msgstr "æ— éšœç¢æ€§æ‰«æ没有检测到仅存在于æºåˆ†æ”¯çš„问题"
@@ -30613,12 +31312,18 @@ msgstr "失败"
msgid "Reports|Filename"
msgstr "文件å"
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr "HEAD 报告解æžé”™è¯¯ï¼š"
msgid "Reports|Identifier"
msgstr "标识符"
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr "指标报告扫æ未检测到新å˜æ›´"
+
msgid "Reports|Metrics reports are loading"
msgstr "正在加载指标报告"
@@ -30631,6 +31336,12 @@ msgstr "指标报告无å˜åŒ–"
msgid "Reports|Metrics reports failed loading results"
msgstr "指标报告加载结果失败"
+msgid "Reports|Metrics reports failed to load results"
+msgstr "指标报告未能加载结果"
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr "指标报告:%{strong_start}%{numberOfChanges}%{strong_end} 个 %{changes}"
+
msgid "Reports|Scanner"
msgstr "扫æ工具"
@@ -30646,9 +31357,15 @@ msgstr "测试总结报告"
msgid "Reports|Test summary failed loading results"
msgstr "测试总结报告加载失败"
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr "测试总结报告解æžä¸­"
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr "工具"
@@ -30824,13 +31541,13 @@ msgid "Request attention"
msgstr "请求关注"
msgid "Request attention from %{users_sentence}."
-msgstr ""
+msgstr "æ¥è‡ª %{users_sentence} 的请求关注"
msgid "Request attention from assignee or reviewer"
-msgstr ""
+msgstr "æ¥è‡ªæŒ‡æ´¾äººæˆ–审核者的请求关注"
msgid "Request attention from assignee(s) or reviewer(s)"
-msgstr ""
+msgstr "æ¥è‡ªæŒ‡æ´¾äººæˆ–审核者的请求关注"
msgid "Request attention to review"
msgstr "请求关注审核"
@@ -30857,7 +31574,7 @@ msgid "Requested %{time_ago}"
msgstr "请求的 %{time_ago}"
msgid "Requested attention from %{users_sentence}."
-msgstr ""
+msgstr "已从 %{users_sentence} 请求关注。"
msgid "Requested attention from @%{username}"
msgstr "请求æ¥è‡ª @%{username} 的注æ„事项"
@@ -31072,7 +31789,7 @@ msgid "Restore project"
msgstr "æ¢å¤é¡¹ç›®"
msgid "Restoring projects"
-msgstr ""
+msgstr "项目æ¢å¤ä¸­"
msgid "Restoring the group will prevent the group, its subgroups and projects from being removed on this date."
msgstr "æ¢å¤è¯¥ç¾¤ç»„将防止该群组åŠå…¶å­ç¾¤ç»„和项目在此日期被删除。"
@@ -31105,7 +31822,7 @@ msgid "Retry"
msgstr "é‡è¯•"
msgid "Retry failed jobs"
-msgstr ""
+msgstr "é‡è¯•å¤±è´¥çš„作业"
msgid "Retry job"
msgstr "é‡è¯•ä½œä¸š"
@@ -31156,8 +31873,8 @@ msgstr "审阅更改"
msgid "Review requests for you"
msgstr "您的审核请求"
-msgid "Review the changes locally"
-msgstr "在本地查看更改"
+msgid "Review the changes locally."
+msgstr "在本地查看更改。"
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
msgstr "查看在您的身份验è¯æ供商中é…ç½®æœåŠ¡æ供商的æµç¨‹ - 在这里,GitLab是“æœåŠ¡æ供商â€æˆ–“ä¾èµ–æ–¹â€ã€‚"
@@ -31217,9 +31934,6 @@ msgstr "添加"
msgid "RightSidebar|deleting the"
msgstr "删除"
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr "没看到您è¦å¯»æ‰¾çš„?%{linkStart}点击此处%{linkEnd}查看完整的选项列表,包括完全å¯å®šåˆ¶çš„选项。"
-
msgid "Roadmap"
msgstr "路线图"
@@ -31271,12 +31985,12 @@ msgstr "è¿è¡Œæœªæ ‡è®°çš„作业"
msgid "Runner API"
msgstr "Runner API"
+msgid "Runner cannot be deleted, please contact your administrator."
+msgstr "Runner 无法删除,请è”系您的管ç†å‘˜ã€‚"
+
msgid "Runner tokens"
msgstr "Runner令牌"
-msgid "Runner was not deleted because it is assigned to multiple projects."
-msgstr "Runner未删除,因为它已分é…给多个项目。"
-
msgid "Runner was not updated."
msgstr "Runner未更新。"
@@ -31295,6 +32009,20 @@ msgstr "当å‰åœ¨çº¿Runner: %{active_runners_count}"
msgid "Runners page."
msgstr "Runner页é¢."
+msgid "Runners|%{percentage} spot."
+msgstr "%{percentage} 点。"
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr "容é‡ä¸º 1,通过自动扩展组é‡æ–°ç”Ÿæˆå¯ç”¨æš– HA。容é‡ä¸º 2,å¯ç”¨çƒ­ HA,因为å³ä½¿èŠ‚点丢失,该æœåŠ¡ä¹Ÿå¯ç”¨ã€‚容é‡ä¸º 3 个或更多,å¯ç”¨çƒ­ HA 和手动扩展 runner 队列。"
+
msgid "Runners|Active"
msgstr "å¯ç”¨"
@@ -31304,8 +32032,8 @@ msgstr "全部"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
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 "Amazon Linux 2 Docker HA,具有手动扩展和å¯é€‰è°ƒåº¦åŠŸèƒ½ã€‚éžçŽ°åœºã€‚ Linux Docker 执行器的默认选择。"
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
+msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr "获å–指令时å‘生错误"
@@ -31317,7 +32045,7 @@ msgid "Runners|Assigned Group"
msgstr "指派群组"
msgid "Runners|Assigned Projects (%{projectCount})"
-msgstr ""
+msgstr "分é…项目 (%{projectCount})"
msgid "Runners|Associated with one or more projects"
msgstr "与一个或多个项目关è”"
@@ -31331,9 +32059,21 @@ msgstr "适用于群组中的所有项目和å­ç»„"
msgid "Runners|Can run untagged jobs"
msgstr "å¯ä»¥è¿è¡Œæœªæ ‡è®°çš„作业"
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr "容é‡ä¸º 1,通过自动扩展组é‡æ–°ç”Ÿæˆå¯ç”¨æš– HA。容é‡ä¸º 2,å¯ç”¨çƒ­ HA,因为å³ä½¿èŠ‚点丢失,该æœåŠ¡ä¹Ÿå¯ç”¨ã€‚容é‡ä¸º 3 个或更多,å¯ç”¨çƒ­ HA 和手动扩展 runner 队列。"
+
msgid "Runners|Change to project runner"
msgstr "更改为项目 runner"
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr "选择您首选的 GitLab Runner"
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr "注册runner的命令"
@@ -31346,12 +32086,19 @@ msgstr "å¤åˆ¶è¯´æ˜Ž"
msgid "Runners|Copy registration token"
msgstr "å¤åˆ¶æ³¨å†Œä»¤ç‰Œ"
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Delete runner"
msgstr "删除 runner"
msgid "Runners|Delete runner %{name}?"
msgstr "删除 runner %{name}?"
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr "在 AWS 中部署 GitLab Runner"
@@ -31361,6 +32108,9 @@ msgstr "æè¿°"
msgid "Runners|Details"
msgstr "详情"
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr "ä¸çŸ¥é“您在寻找什么?查看完整的选项列表,%{linkStart}这里%{linkEnd}包括完全å¯è‡ªå®šä¹‰çš„选项 。"
+
msgid "Runners|Download and install binary"
msgstr "下载并安装二进制文件"
@@ -31370,18 +32120,12 @@ msgstr "下载最新的二进制文件"
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 "对于æ¯ä¸ªè§£å†³æ–¹æ¡ˆï¼Œæ‚¨å°†é€‰æ‹©ä¸€ä¸ªå®¹é‡ã€‚ 1 通过自动扩展组é‡æ–°ç”Ÿæˆå¯ç”¨æš– HA。 2 å¯ç”¨çƒ­ HA,因为å³ä½¿èŠ‚点丢失,该æœåŠ¡ä¹Ÿå¯ç”¨ã€‚ 3 个或更多å¯ç”¨çƒ­ HA 和手动扩展runner组。"
-
msgid "Runners|Group"
msgstr "群组"
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 "如果您ä¸é€‰æ‹© AWS VPC,runner将部署到您选择的 AWS 区域中的默认 VPC。请咨询您的 AWS 管ç†å‘˜ï¼Œä»¥äº†è§£éƒ¨ç½²åˆ°æ‚¨ AWS 账户中任何给定区域的默认 VPC 中是å¦å­˜åœ¨ä»»ä½•å®‰å…¨é£Žé™©ã€‚"
-
msgid "Runners|Install a runner"
msgstr "安装Runner"
@@ -31389,7 +32133,7 @@ msgid "Runners|Instance"
msgstr "实例"
msgid "Runners|Jobs"
-msgstr ""
+msgstr "作业"
msgid "Runners|Last contact"
msgstr "最åŽè”ç³»"
@@ -31403,26 +32147,32 @@ msgstr "最大作业超时"
msgid "Runners|Members of the %{type} can register runners"
msgstr "%{type}çš„æˆå‘˜å¯ä»¥æ³¨å†ŒRunner"
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr "å称"
msgid "Runners|Never contacted"
msgstr "未连接过"
+msgid "Runners|Never contacted:"
+msgstr ""
+
+msgid "Runners|New group runners view"
+msgstr "新建群组 runner 视图"
+
msgid "Runners|New registration token generated!"
msgstr "已生æˆæ–°çš„注册令牌ï¼"
-msgid "Runners|New runner, has not contacted yet"
-msgstr "新的 runner,尚未连接"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
+msgstr "未å‘现。Windows Shell executor 的默认选择。"
-msgid "Runners|No contact from this runner in over 3 months"
-msgstr "超过 3 个月没有è”系此 runner"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr "没有å‘现。这是 Linux Docker 执行器的默认选择。"
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
-msgstr "æ­¤ runner 最近没有è”系;最åŽä¸€æ¬¡è”系是 %{timeAgo}"
-
-msgid "Runners|Not available to run jobs"
-msgstr "ä¸å¯ç”¨äºŽè¿è¡Œä½œä¸š"
+msgid "Runners|Not accepting jobs"
+msgstr "ä¸æŽ¥å—作业"
msgid "Runners|Offline"
msgstr "离线"
@@ -31430,15 +32180,28 @@ msgstr "离线"
msgid "Runners|Offline runners"
msgstr "离线 Runners"
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr "在线"
msgid "Runners|Online runners"
msgstr "在线 Runners"
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr "æš‚åœæŽ¥å—作业"
+
msgid "Runners|Paused"
msgstr "已暂åœ"
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr "å¹³å°"
@@ -31472,9 +32235,15 @@ msgstr "注册令牌已å¤åˆ¶ï¼"
msgid "Runners|Reset token"
msgstr "é‡ç½®ä»¤ç‰Œ"
+msgid "Runners|Resume accepting jobs"
+msgstr "æ¢å¤æŽ¥å—作业"
+
msgid "Runners|Revision"
msgstr "版本"
+msgid "Runners|Rocket launch illustration"
+msgstr "ç«ç®­å‘射图"
+
msgid "Runners|Runner"
msgstr "Runner"
@@ -31487,21 +32256,51 @@ msgstr "Runner %{name} 已删除"
msgid "Runners|Runner assigned to project."
msgstr "分é…给项目的runner"
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
-msgstr "Runner 处于离线状æ€ï¼Œæœ€åŽè¿žæŽ¥æ˜¯åœ¨%{runner_contact}å‰"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
-msgstr "Runner 处于在线状æ€ï¼Œæœ€åŽè¿žæŽ¥æ˜¯åœ¨%{runner_contact}å‰"
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
+msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr "Runner 处于在线状æ€ï¼›æœ€åŽè¿žæŽ¥æ˜¯åœ¨%{timeAgo}å‰"
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
-msgstr "Runner 处于已暂åœçŠ¶æ€ï¼Œæœ€åŽè¿žæŽ¥æ˜¯åœ¨%{runner_contact}å‰"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
+msgstr ""
msgid "Runners|Runner registration"
msgstr "Runner 注册"
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr "å–消分é…到项目的runner。"
@@ -31511,8 +32310,8 @@ msgstr "Runner"
msgid "Runners|Runs untagged jobs"
msgstr "è¿è¡Œæœªæ ‡è®°çš„作业"
-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。"
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
+msgstr "在此选择您的首选选项。在下一步中,您å¯ä»¥åœ¨ AWS CloudFormation 控制å°ä¸­é€‰æ‹©æ‚¨çš„ runner 能力。"
msgid "Runners|Show runner installation and registration instructions"
msgstr "显示runner安装和注册说明"
@@ -31532,6 +32331,9 @@ msgstr "Stale"
msgid "Runners|Stale runners"
msgstr "过期 runners"
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr "状æ€"
@@ -31541,18 +32343,21 @@ msgstr "åœæ­¢ Runner 接收新的作业。"
msgid "Runners|Tags"
msgstr "标签"
+msgid "Runners|Take me there!"
+msgstr "带我去那里ï¼"
+
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
+msgstr "新视图为您æ供更多空间并更好地了解 runner 队ä¼ã€‚"
+
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr "Runner 将被永久删除,ä¸å†é€‚用于项目或群组。您确定è¦ç»§ç»­å—?"
-msgid "Runners|This runner has never contacted this instance"
-msgstr "此 runner 从未连接到此实例"
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
msgid "Runners|This runner is associated with specific projects."
msgstr "æ­¤Runner与特定项目相关è”。"
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
-msgstr "此Runner适用于您的 GitLab 实例中的所有群组和项目。"
-
msgid "Runners|This runner is available to all projects and subgroups in a group."
msgstr "æ­¤Runner适用于一个群组中的所有项目和å­ç¾¤ç»„。"
@@ -31568,8 +32373,8 @@ msgstr "当您希望群组中的所有项目都å¯ä»¥è®¿é—®ä¸€ç»„Runner时,请
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr "除了带标签的作业外,还å¯ä»¥å°†Runner用于没有标签的作业。"
-msgid "Runners|Use the runner for the currently assigned projects only."
-msgstr "ä»…å°†Runner用于当å‰åˆ†é…的项目。"
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
msgstr "åªä¸ºå—ä¿æŠ¤çš„分支使用æµæ°´çº¿ä¸Šçš„Runner。"
@@ -31586,8 +32391,8 @@ msgstr "查看安装说明"
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
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 "Windows 2019 Shell,具有手动缩放和å¯é€‰è°ƒåº¦åŠŸèƒ½ã€‚éžçŽ°åœºã€‚ Windows Shell 执行程åºçš„默认选择。"
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
+msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
msgstr "您将è¦å°†æ­¤å®žä¾‹çš„runner更改为项目runner,此æ“作ä¸å¯é€†ï¼Œæ‚¨ç¡®å®šè¦ç»§ç»­å—?"
@@ -31595,9 +32400,6 @@ 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。"
-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 "您已使用了%{quotaUsed},超出了共享æµæ°´çº¿æ—¶é—´é…é¢é™åˆ¶ï¼ˆ%{quotaLimit} )。"
@@ -31631,9 +32433,6 @@ msgstr "特定"
msgid "Runners|stale"
msgstr "stale"
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr "è¿è¡Œä¸­"
@@ -31748,23 +32547,23 @@ msgstr "ä¿å­˜ä¸­"
msgid "Saving project."
msgstr "正在ä¿å­˜é¡¹ç›®ã€‚"
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
-msgstr ""
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
+msgstr "%{thenLabelStart}然åŽ%{thenLabelEnd} 需è¦ä»¥ä¸‹ %{approvalsRequired} 个核准人的批准:"
msgid "ScanResultPolicy|add an approver"
-msgstr ""
+msgstr "添加核准人"
msgid "ScanResultPolicy|scanners"
-msgstr ""
+msgstr "扫æ器"
msgid "ScanResultPolicy|severity levels"
-msgstr ""
+msgstr "严é‡ç¨‹åº¦"
msgid "ScanResultPolicy|vulnerability states"
-msgstr ""
+msgstr "æ¼æ´žçŠ¶æ€"
msgid "Scanner"
msgstr "扫æ工具"
@@ -31899,7 +32698,7 @@ msgid "Search for a user"
msgstr "æœç´¢ç”¨æˆ·"
msgid "Search for an emoji"
-msgstr ""
+msgstr "æœç´¢ emoji"
msgid "Search for projects, issues, etc."
msgstr "æœç´¢é¡¹ç›®ã€è®®é¢˜ç­‰ç­‰â€¦"
@@ -31943,6 +32742,9 @@ msgstr "æœç´¢é¡¹ç›®"
msgid "Search projects..."
msgstr "æœç´¢é¡¹ç›®..."
+msgid "Search rate limits"
+msgstr "æœç´¢é€ŸçŽ‡é™åˆ¶"
+
msgid "Search refs"
msgstr "æœç´¢refs"
@@ -32056,6 +32858,9 @@ msgstr "ç›®å‰ä¸æ”¯æŒä½œè€…和消æ¯åŒæ—¶æœç´¢ã€‚"
msgid "Seats"
msgstr "席ä½"
+msgid "Seats owed"
+msgstr "所欠席ä½æ•°"
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr "席ä½ä½¿ç”¨æƒ…况数æ®ï¼Œæˆªè‡³ %{last_enqueue_time} (æ¯å¤©æ›´æ–°ï¼‰"
@@ -32080,6 +32885,15 @@ msgstr "密ç æ£€æµ‹"
msgid "Secret token"
msgstr "Secret令牌"
+msgid "Secure Code Warrior"
+msgstr "Secure Code Warrior"
+
+msgid "Secure Files"
+msgstr "安全文件"
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr "识别外部存储请求的安全令牌。"
@@ -32093,7 +32907,7 @@ msgid "Security Configuration"
msgstr "安全é…ç½®"
msgid "Security Dashboard"
-msgstr "安全仪表æ¿"
+msgstr "安全仪表盘"
msgid "Security dashboard"
msgstr "安全仪表盘"
@@ -32206,18 +33020,21 @@ 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|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr "管ç†è¯­æ–™åº“"
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
+msgstr "管ç†åœ¨è¦†ç›–模糊测试中用作输入ç§å­çš„语料库文件。"
+
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr "管ç†ä¾› DAST 扫æ使用的é…置文件。"
-msgid "SecurityConfiguration|Manage scans"
-msgstr "管ç†æ‰«æ"
-
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
msgstr "更多扫æ类型,包括容器扫æ,DAST,ä¾èµ–扫æ,模糊和许å¯è¯åˆè§„。"
@@ -32272,6 +33089,12 @@ msgstr "%{branches} %{plural}"
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr "%{branches} 和 %{lastBranch} %{plural}"
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ".yaml 预览"
@@ -32282,11 +33105,17 @@ msgid "SecurityOrchestration|Add rule"
msgstr "添加规则"
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
-msgstr ""
+msgstr "解除警报åŽï¼Œè¯¥ä¿¡æ¯å°†ä¸å†æ˜¾ç¤ºã€‚"
msgid "SecurityOrchestration|All policies"
msgstr "所有策略"
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr "分é…您的安全策略项目时出错"
@@ -32300,6 +33129,9 @@ msgid "SecurityOrchestration|Description"
msgstr "æè¿°"
msgid "SecurityOrchestration|Don't show the alert anymore"
+msgstr "ä¸å†æ˜¾ç¤ºè­¦æŠ¥"
+
+msgid "SecurityOrchestration|Edit network policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -32308,15 +33140,24 @@ msgstr "编辑策略"
msgid "SecurityOrchestration|Edit policy project"
msgstr "编辑策略项目"
-msgid "SecurityOrchestration|Empty policy name"
+msgid "SecurityOrchestration|Edit scan exection policy"
msgstr ""
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Empty policy name"
+msgstr "空策略å称"
+
msgid "SecurityOrchestration|Enabled"
msgstr "å¯ç”¨"
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr "强制此项目的安全性。 %{linkStart}更多信æ¯ã€‚%{linkEnd}"
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr "如果您正在使用Auto DevOps,如果您改å˜äº†æ­¤éƒ¨åˆ†çš„策略,您的 %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} 文件将ä¸ä¼šè¢«æ›´æ–° Auto DevOps 用户应按照 %{linkStart}容器网络策略文档%{linkEnd}进行更改。"
@@ -32324,25 +33165,37 @@ msgid "SecurityOrchestration|Invalid policy type"
msgstr "无效的策略类型"
msgid "SecurityOrchestration|Latest scan run against %{agent}"
-msgstr ""
+msgstr "针对 %{agent} è¿è¡Œçš„最新扫æ"
msgid "SecurityOrchestration|Network"
msgstr "网络"
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr "æ–°ç­–ç•¥"
-msgid "SecurityOrchestration|No actions defined - policy will not run."
+msgid "SecurityOrchestration|New scan exection policy"
msgstr ""
-msgid "SecurityOrchestration|No description"
+msgid "SecurityOrchestration|New scan result policy"
msgstr ""
+msgid "SecurityOrchestration|No actions defined - policy will not run."
+msgstr "未定义任何æ“作 - ç­–ç•¥ä¸ä¼šè¿è¡Œã€‚"
+
+msgid "SecurityOrchestration|No description"
+msgstr "æ— æè¿°"
+
msgid "SecurityOrchestration|No rules defined - policy will not run."
msgstr "未定义规则 - 策略无法è¿è¡Œã€‚"
msgid "SecurityOrchestration|Not enabled"
-msgstr ""
+msgstr "未å¯ç”¨"
msgid "SecurityOrchestration|Only owners can update Security Policy Project"
msgstr "åªæœ‰æ‰€æœ‰è€…å¯ä»¥æ›´æ–°å®‰å…¨ç­–略项目"
@@ -32351,7 +33204,7 @@ msgid "SecurityOrchestration|Policies"
msgstr "ç­–ç•¥"
msgid "SecurityOrchestration|Policy Type"
-msgstr ""
+msgstr "策略类型"
msgid "SecurityOrchestration|Policy cannot be enabled for non-existing branches (%{branches})"
msgstr "无法为ä¸å­˜åœ¨çš„分支å¯ç”¨ç­–ç•¥ (%{branches})"
@@ -32375,16 +33228,19 @@ msgid "SecurityOrchestration|Policy type"
msgstr "策略类型"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
-msgstr ""
+msgstr "如果å‘生以下任何情况,则需è¦æ¥è‡ª %{approvers} çš„ %{approvals} %{plural} :"
msgid "SecurityOrchestration|Rules"
msgstr "规则"
-msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
msgstr ""
+msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
+msgstr "è¿è¡Œ %{actions} å’Œ %{lastAction} 扫æ"
+
msgid "SecurityOrchestration|Runs a %{action} scan"
-msgstr ""
+msgstr "è¿è¡Œ %{action} 扫æ"
msgid "SecurityOrchestration|Scan Execution"
msgstr "扫æ执行"
@@ -32398,12 +33254,21 @@ msgstr "扫æ执行"
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr "扫æ执行策略åªèƒ½ç”±é¡¹ç›®æ‰€æœ‰è€…创建。"
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr "扫æ结果"
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr "扫æ结果策略åªèƒ½ç”±é¡¹ç›®æ‰€æœ‰è€…创建。"
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr "è¦æ‰§è¡Œçš„扫æ %{cadence}"
@@ -32422,6 +33287,9 @@ msgstr "安全策略项目已æˆåŠŸå–消关è”"
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr "选择一个项目æ¥å­˜å‚¨æ‚¨çš„安全策略。 %{linkStart}更多信æ¯ã€‚%{linkEnd}"
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr "选择安全项目"
@@ -32431,12 +33299,15 @@ msgstr "对ä¸èµ·ï¼Œæ‚¨çš„过滤器没有产生任何结果。"
msgid "SecurityOrchestration|Status"
msgstr "状æ€"
-msgid "SecurityOrchestration|Summary"
-msgstr "摘è¦"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
+msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
msgstr ""
+msgid "SecurityOrchestration|Summary"
+msgstr "摘è¦"
+
msgid "SecurityOrchestration|There was a problem creating the new security policy"
msgstr "创建新的安全策略时出现问题"
@@ -32444,7 +33315,7 @@ msgid "SecurityOrchestration|This project does not contain any security policies
msgstr "此项目ä¸åŒ…å«ä»»ä½•å®‰å…¨ç­–略。"
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
-msgstr ""
+msgstr "æ­¤è§†å›¾ä»…æ˜¾ç¤ºä»£ç† %{agent} 的扫æ结果。您å¯ä»¥åœ¨%{linkStart}æ¼æ´žæŠ¥å‘Šçš„ Operational Vulnerabilities 选项å¡ä¸­%{linkEnd}查看所有代ç†çš„扫æ结果。"
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr "è¦æ‰©å¤§æ‚¨çš„æœç´¢èŒƒå›´ï¼Œè¯·åœ¨ä¸Šé¢æ›´æ”¹è¿‡æ»¤è§„则或选择ä¸åŒçš„安全策略项目。"
@@ -32458,6 +33329,15 @@ msgstr "å–消链接安全项目会移除在链接的安全项目中存储的所
msgid "SecurityOrchestration|Update scan policies"
msgstr "更新扫æç­–ç•¥"
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr "查看策略项目"
+
msgid "SecurityOrchestration|a"
msgstr "一个"
@@ -32525,7 +33405,7 @@ msgid "SecurityReports|%{firstProject}, %{secondProject}, and %{rest}"
msgstr "%{firstProject},%{secondProject},åŠ%{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 "添加或删除安全区内的项目。 此列表中项目的扫æ结果将显示在安全仪表盘和æ¼æ´žæŠ¥å‘Šä¸­ã€‚"
msgid "SecurityReports|Add projects"
msgstr "添加项目"
@@ -32542,6 +33422,9 @@ msgstr "在 GitLab,我们专注于迭代和å馈。这就是为什么我们è¦
msgid "SecurityReports|Change status"
msgstr "更改状æ€"
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr "解æžä»¥ä¸‹å®‰å…¨æŠ¥å‘Šæ—¶æ£€æŸ¥ç”Ÿæˆçš„消æ¯ï¼Œå› ä¸ºå®ƒä»¬å¯èƒ½ä¼šé˜»æ­¢ GitLab 获å–结果。确ä¿å®‰å…¨æŠ¥å‘Šç¬¦åˆæ”¯æŒçš„ %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}。"
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr "评论已添加到'%{vulnerabilityName}'"
@@ -32585,7 +33468,7 @@ msgid "SecurityReports|Download scanned URLs"
msgstr "下载扫æçš„ URL"
msgid "SecurityReports|Either you don't have permission to view this dashboard or the dashboard has not been setup. Please check your permission settings with your administrator or check your dashboard configurations to proceed."
-msgstr "您无æƒæŸ¥çœ‹æ­¤ä»ªè¡¨æ¿æˆ–尚未设置仪表æ¿ã€‚请å‘管ç†å‘˜æŸ¥è¯¢æ‚¨çš„æƒé™è®¾ç½®ï¼Œæˆ–检查仪表æ¿é…置以继续。"
+msgstr "您无æƒæŸ¥çœ‹æ­¤ä»ªè¡¨ç›˜æˆ–尚未设置仪表盘。请å‘管ç†å‘˜æŸ¥è¯¢æ‚¨çš„æƒé™è®¾ç½®ï¼Œæˆ–检查仪表盘é…置并继续。"
msgid "SecurityReports|Ensure that %{trackingStart}issue tracking%{trackingEnd} is enabled for this project and you have %{permissionsStart}permission to create new issues%{permissionsEnd}."
msgstr "请确ä¿æ­¤é¡¹ç›®å¯ç”¨%{trackingStart}议题跟踪%{trackingEnd}并且您有%{permissionsStart}æƒé™åˆ›å»ºæ–°è®®é¢˜%{permissionsEnd}。"
@@ -32612,7 +33495,7 @@ msgid "SecurityReports|Issues created from a vulnerability cannot be removed."
msgstr "ç”±æ¼æ´žç”Ÿæˆçš„议题ä¸å¯è¢«åˆ é™¤ã€‚"
msgid "SecurityReports|Learn more about setting up your dashboard"
-msgstr "了解更多关于仪表æ¿åˆ›å»ºçš„ä¿¡æ¯"
+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 "管ç†å’Œè·Ÿè¸ªæ‚¨ç»„内项目中å‘现的æ¼æ´žã€‚é…置安全测试时,此处显示项目中的æ¼æ´žã€‚"
@@ -32675,19 +33558,22 @@ msgid "SecurityReports|Project"
msgstr "项目"
msgid "SecurityReports|Project was not found or you do not have permission to add this project to Security Dashboards."
-msgstr "未找到项目或者您没有æƒé™å°†æ­¤é¡¹ç›®æ·»åŠ åˆ°å®‰å…¨ä»ªè¡¨æ¿ã€‚"
+msgstr "未找到项目或者您没有æƒé™å°†æ­¤é¡¹ç›®æ·»åŠ åˆ°å®‰å…¨ä»ªè¡¨ç›˜ã€‚"
msgid "SecurityReports|Projects added"
msgstr "项目已添加"
msgid "SecurityReports|Remove project from dashboard"
-msgstr "从仪表æ¿åˆ é™¤é¡¹ç›®"
+msgstr "从仪表盘删除项目"
+
+msgid "SecurityReports|Report has expired"
+msgstr ""
msgid "SecurityReports|Scan details"
msgstr "扫æ详情"
msgid "SecurityReports|Security Dashboard"
-msgstr "安全仪表æ¿"
+msgstr "安全仪表盘"
msgid "SecurityReports|Security reports can only be accessed by authorized users."
msgstr "安全报告åªèƒ½ç”±æŽˆæƒçš„用户访问。"
@@ -32707,8 +33593,8 @@ msgstr "设置状æ€"
msgid "SecurityReports|Severity"
msgstr "严é‡ç¨‹åº¦"
-msgid "SecurityReports|Software and container dependency survey"
-msgstr "软件和容器ä¾èµ–性调查"
+msgid "SecurityReports|Show %{pageSize} items"
+msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
msgstr "有时扫æ工具无法确定调查结果的严é‡æ€§ï¼Œè¿™äº›ç»“æžœå¯èƒ½ä»ç„¶æ˜¯æ½œåœ¨çš„风险æ¥æºï¼Œè¯·æ‰‹åŠ¨æŸ¥çœ‹"
@@ -32719,17 +33605,20 @@ msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰ç¬¦åˆç­›é€‰å™¨çš„任何结果"
msgid "SecurityReports|Status"
msgstr "状æ€"
+msgid "SecurityReports|Submit vulnerability"
+msgstr "æ交æ¼æ´ž"
+
msgid "SecurityReports|Take survey"
msgstr "å‚加调查"
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
-msgstr ""
-
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr "æ¼æ´žæŠ¥å‘Šæ˜¾ç¤ºé¡¹ç›®é»˜è®¤åˆ†æ”¯ä¸Šæœ€æ–°æˆåŠŸæµæ°´çº¿çš„结果,以åŠæœ€æ–°å®¹å™¨æ‰«æçš„æ¼æ´žã€‚ %{linkStart}了解更多。%{linkEnd}"
-msgid "SecurityReports|The 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}。"
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr "安全报告包å«ä¸€ä¸ªæˆ–多个无法解æžä¸”未记录的æ¼æ´žå‘现。è¦è°ƒæŸ¥ä¸€ä¸ªæŠ¥å‘Šï¼Œä¸‹è½½ä½œä¸šè¾“出中的产物。确ä¿åˆ›å»ºçš„安全报告都符åˆç›¸å…³çš„ %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}。"
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
+msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr "添加评论时出错。"
@@ -32788,6 +33677,9 @@ msgstr "æ¼æ´žç®¡ç†åŠŸèƒ½è°ƒæŸ¥"
msgid "SecurityReports|Vulnerability Report"
msgstr "æ¼æ´žæŠ¥å‘Š"
+msgid "SecurityReports|Warning parsing security reports"
+msgstr "警告解æžå®‰å…¨æŠ¥å‘Š"
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr "虽然您的æµæ°´çº¿ä¸­æ²¡æœ‰æ¼æ´žï¼Œè¿™ç§çŽ°è±¡å¾ˆç½•è§ï¼Œä½†ä¹Ÿæ˜¯æœ‰å¯èƒ½çš„。无论如何,建议您仔细检查设置以确ä¿ä»ªè¡¨æ¿çš„é…置正确。"
@@ -32800,15 +33692,18 @@ msgstr "您没有足够的æƒé™è®¿é—®æ­¤æŠ¥å‘Š"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr "您必须以授æƒç”¨æˆ·èº«ä»½ç™»å½•æ‰èƒ½æŸ¥çœ‹æ­¤æŠ¥å‘Š"
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr "您的å馈对我们很é‡è¦ï¼æˆ‘们将在7天内å†æ¬¡è¯¢é—®ã€‚"
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr "您的å馈对我们很é‡è¦ï¼æˆ‘们将在一周内å†æ¬¡è¯¢é—®ã€‚"
msgid "SecurityReports|scanned resources"
msgstr "扫æ资æº"
+msgid "SecurityTraining|Primary Training"
+msgstr "åˆçº§åŸ¹è®­"
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr "当多个培训åˆä½œä¼™ä¼´å¯ç”¨æ—¶ï¼Œæ¥è‡ªæ­¤åˆä½œä¼™ä¼´çš„培训将优先进行。"
+
msgid "See example DevOps Score page in our documentation."
msgstr "请å‚阅我们文档中的示例 DevOps Score 页é¢ã€‚"
@@ -32845,15 +33740,12 @@ msgstr "选择页é¢"
msgid "Select a branch"
msgstr "选择分支"
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
-msgstr "选择一个åˆè§„框架æ¥åº”用于此项目。%{linkStart}了解更多信æ¯ã€‚%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
+msgstr "选择适用于该项目的åˆè§„框架。 %{linkStart}这些是如何添加的?%{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"
-msgstr "选择è¦é‚€è¯·çš„组"
-
msgid "Select a label"
msgstr "选择一个标记"
@@ -32992,6 +33884,9 @@ msgstr "选择订阅"
msgid "Select target branch"
msgstr "选择目标分支"
+msgid "Select target branch or tag"
+msgstr "选择目标分支或标签"
+
msgid "Select timezone"
msgstr "选择时区"
@@ -33179,10 +34074,10 @@ msgid "Serverless|No functions available"
msgstr "没有å¯ç”¨çš„功能"
msgid "Serverless|Serverless was %{linkStart}deprecated%{linkEnd} in GitLab 14.3."
-msgstr ""
+msgstr "æ— æœåŠ¡å™¨åœ¨ 14.3 版本中%{linkStart}已弃用%{linkEnd}。"
msgid "Serverless|Serverless was %{postLinkStart}deprecated%{postLinkEnd}. But if you opt to use it, you must install Knative in your Kubernetes cluster first. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "æ— æœåŠ¡å™¨ %{postLinkStart}已弃用%{postLinkEnd}。但是如果您选择使用它,必须先在您的 Kubernetes 集群中安装 Knative。%{linkStart}了解更多。%{linkEnd}"
msgid "Serverless|The deploy job has not finished."
msgstr "部署作业尚未完æˆã€‚"
@@ -33221,7 +34116,7 @@ msgid "Service account generated successfully"
msgstr "æœåŠ¡å¸æˆ·ç”ŸæˆæˆåŠŸ"
msgid "Service accounts"
-msgstr ""
+msgstr "æœåŠ¡å¸æˆ·"
msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
msgstr "æœåŠ¡ ping 在您的é…置文件中被ç¦ç”¨ï¼Œå¹¶ä¸”无法通过此表å•å¯ç”¨ã€‚"
@@ -33328,6 +34223,9 @@ msgstr "设置项目和最大空间é™åˆ¶ã€ä¼šè¯æŒç»­æ—¶é—´ã€ç”¨æˆ·é€‰é¡¹ï¼Œ
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr "为 Packages registry API 请求é…置速率é™åˆ¶ä»¥å–代一般用户和 IP 速率é™åˆ¶ã€‚"
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr "设置 web 或 API 请求æœç´¢çš„速率é™åˆ¶ã€‚"
+
msgid "Set severity"
msgstr "设置严é‡æ€§"
@@ -33365,7 +34263,7 @@ msgid "Set the milestone to %{milestone_reference}."
msgstr "将里程碑设置为%{milestone_reference}。"
msgid "Set the per-user rate limit for getting a user by ID via the API."
-msgstr ""
+msgstr "设置通过 API 按 ID 获å–用户的æ¯ç”¨æˆ·é€ŸçŽ‡é™åˆ¶ã€‚"
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr "为由 Web 或 API 请求创建的 notes 设置æ¯ä¸ªç”¨æˆ·çš„速率é™åˆ¶ã€‚"
@@ -33373,6 +34271,9 @@ msgstr "为由 Web 或 API 请求创建的 notes 设置æ¯ä¸ªç”¨æˆ·çš„速率é™å
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr "以秒为å•ä½è®¾ç½®è¶…时,以将次è¦ç«™ç‚¹çŠ¶æ€å‘é€åˆ°ä¸»ç«™ç‚¹å’Œæ¬¡è¦ç«™ç‚¹å…许的 IP。"
+msgid "Set this number to 0 to disable the limit."
+msgstr "将此数字设置为 0 æ¥ç¦ç”¨é™åˆ¶ã€‚"
+
msgid "Set time estimate"
msgstr "设置时间估计"
@@ -33418,9 +34319,6 @@ msgstr "å°†æƒé‡è®¾ç½®ä¸º%{weight}。"
msgid "Set what should be replicated by this secondary site."
msgstr "设置此次è¦èŠ‚点应该å¤åˆ¶çš„内容。"
-msgid "SetStatusModal|Add status emoji"
-msgstr "添加状æ€è¡¨æƒ…"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr "您的å字和头åƒæ—边显示标识。"
@@ -33531,7 +34429,7 @@ msgid "Shared Runners"
msgstr "共享Runner"
msgid "Shared projects"
-msgstr "分享项目"
+msgstr "共享项目"
msgid "Shared runners"
msgstr "共享Runner"
@@ -33546,7 +34444,7 @@ msgid "Shared runners details"
msgstr "共享Runner的详细信æ¯"
msgid "Shared runners enabled cannot be enabled until a valid credit card is on file"
-msgstr ""
+msgstr "在有效信用å¡å­˜æ¡£ä¹‹å‰ï¼Œæ— æ³•ä½¿ç”¨å·²å¯ç”¨çš„共享 runner"
msgid "Shared runners help link"
msgstr "共享Runner帮助链接"
@@ -33606,7 +34504,7 @@ msgid "Show all issues."
msgstr "显示所有议题。"
msgid "Show all milestones"
-msgstr ""
+msgstr "显示所有里程碑"
msgid "Show all test cases."
msgstr "显示所有测试用例。"
@@ -33645,7 +34543,7 @@ msgid "Show file contents"
msgstr "显示文件内容"
msgid "Show group milestones"
-msgstr ""
+msgstr "显示群组里程碑"
msgid "Show labels"
msgstr "显示标记"
@@ -33663,10 +34561,10 @@ msgid "Show open epics"
msgstr "显示开放中的å²è¯—"
msgid "Show project milestones"
-msgstr ""
+msgstr "显示项目里程碑"
msgid "Show sub-group milestones"
-msgstr ""
+msgstr "显示å­ç»„里程碑"
msgid "Show the Closed list"
msgstr "显示已关闭列表"
@@ -33674,6 +34572,9 @@ msgstr "显示已关闭列表"
msgid "Show the Open list"
msgstr "显示已打开列表"
+msgid "Show thread"
+msgstr "显示主题"
+
msgid "Show whitespace changes"
msgstr "显示空白å˜æ›´å†…容"
@@ -33703,7 +34604,7 @@ msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
msgstr "显示群组 “%{group_name}†从 2019 å¹´ 11 月 1 日到 2019 å¹´ 12 月 31 日的数æ®"
msgid "Showing data for workflow items created in this date range. Date range limited to %{maxDateRange} days."
-msgstr ""
+msgstr "显示在此日期范围内创建的工作æµäº‹é¡¹çš„æ•°æ®ã€‚日期范围最多 %{maxDateRange} 天。"
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr "显示基于最近%{timerange}天的事件的图表。"
@@ -33840,6 +34741,9 @@ msgstr "用户å太短(最短为%{min_length}字符)。"
msgid "Signed in"
msgstr "已登录"
+msgid "Signed in to GitLab"
+msgstr "已登录到 GitLab"
+
msgid "Signed in to GitLab as %{user_link}"
msgstr "以%{user_link}身份登录到 GitLab"
@@ -33898,7 +34802,7 @@ msgid "Slack logo"
msgstr "Slack logo"
msgid "SlackIntegration|Are you sure you want to remove this project from the Slack application?"
-msgstr ""
+msgstr "您确定è¦ä»Ž Slack 应用程åºä¸­åˆ é™¤æ­¤é¡¹ç›®å—?"
msgid "SlackIntegration|GitLab for Slack"
msgstr "GitLab for Slack"
@@ -33910,7 +34814,7 @@ msgid "SlackIntegration|Project alias"
msgstr "项目别å"
msgid "SlackIntegration|Remove project"
-msgstr ""
+msgstr "删除项目"
msgid "SlackIntegration|Select a GitLab project to link with your Slack workspace."
msgstr "选择一个è¦è¿žæŽ¥åˆ°ä½ çš„ Slack 工作区的项目。"
@@ -34011,6 +34915,9 @@ msgstr "Snowplow"
msgid "Solution"
msgstr "解决方案"
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr "æŸäº›æ“作会移除关注请求,例如审核者批准或åˆå¹¶åˆå¹¶è¯·æ±‚的任何人。"
+
msgid "Some changes are not shown"
msgstr "一些å˜åŒ–未显示"
@@ -34020,6 +34927,9 @@ msgstr "æŸäº›å­å²è¯—å¯èƒ½ç”±äºŽåº”用筛选器而被éšè—"
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr "æŸäº›å¸¸è§åŸŸåä¸è¢«å…许。%{learn_more_link}"
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr "有人在您编辑文件的åŒæ—¶ç¼–辑了该文件。请检查 %{link_start}文件 %{icon}%{link_end} 并确ä¿æ‚¨çš„更改ä¸ä¼šæ— æ„中删除他们的更改。"
+
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 "其他用户åŒæ—¶ç¼–辑了这个议题。请检查%{linkStart}议题%{linkEnd}并确ä¿æ‚¨çš„更改ä¸ä¼šæ— æ„中移除他们的更改。"
@@ -34059,9 +34969,6 @@ msgstr "å°è¯•åŠ è½½è®®é¢˜è”系人时出错。"
msgid "Something went wrong when reordering designs. Please try again"
msgstr "é‡æ–°æŽ’åºè®¾è®¡æ—¶å‡ºäº†ç‚¹é—®é¢˜ã€‚请å†è¯•ä¸€æ¬¡"
-msgid "Something went wrong when toggling the button"
-msgstr "点击按钮时出错"
-
msgid "Something went wrong while adding your award. Please try again."
msgstr "添加赞èµæ—¶å‡ºé”™ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
@@ -34194,9 +35101,6 @@ msgstr "更新需求时出了错。"
msgid "Something went wrong while updating assignees"
msgstr "更新指派人时出错"
-msgid "Something went wrong while updating work item. Please try again"
-msgstr "更新工作项时出错。请å†è¯•ä¸€æ¬¡"
-
msgid "Something went wrong while updating your list settings"
msgstr "更新列表设置时出现错误"
@@ -34471,10 +35375,10 @@ msgid "SourcegraphAdmin|Enable code intelligence powered by %{link_start}Sourceg
msgstr "在您的GitLab实例的代ç è§†å›¾å’Œåˆå¹¶è¯·æ±‚上å¯ç”¨ç”±%{link_start}Sourcegraph%{link_end}æ供的代ç æ™ºèƒ½ã€‚"
msgid "SourcegraphAdmin|Learn more."
-msgstr ""
+msgstr "了解更多。"
msgid "SourcegraphAdmin|Only public projects have code intelligence enabled and communicate with Sourcegraph."
-msgstr ""
+msgstr "åªæœ‰å…¬å¼€é¡¹ç›®å¯ç”¨äº†ä»£ç æ™ºèƒ½å¹¶ä¸Ž Sourcegraph 进行通信。"
msgid "SourcegraphAdmin|Save changes"
msgstr "ä¿å­˜æ›´æ”¹"
@@ -34483,7 +35387,7 @@ msgid "SourcegraphAdmin|Sourcegraph URL"
msgstr "Sourcegraph网å€"
msgid "SourcegraphAdmin|https://sourcegraph.example.com"
-msgstr ""
+msgstr "https://sourcegraph.example.com"
msgid "SourcegraphPreferences|This feature is experimental and currently limited to certain projects."
msgstr "此功能是实验性的,目å‰ä»…é™äºŽæŸäº›é¡¹ç›®ã€‚"
@@ -34618,7 +35522,10 @@ msgid "Start date"
msgstr "开始日期"
msgid "Start free trial"
-msgstr ""
+msgstr "开始å…费试用"
+
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr "开始输入更改,我们将生æˆä¸€ä¸ª YAML 文件供您添加到您的仓库"
msgid "Start merge train"
msgstr "å¯åŠ¨åˆå¹¶é˜Ÿåˆ—"
@@ -34651,7 +35558,7 @@ msgid "Started asynchronous removal of all repository check states."
msgstr "已开始所有仓库检查状æ€çš„异步删除。"
msgid "Started escalation for this incident."
-msgstr ""
+msgstr "已开始å‡çº§æ­¤äº‹ä»¶ã€‚"
msgid "Starting..."
msgstr "正在å¯åŠ¨..."
@@ -34666,7 +35573,7 @@ msgid "Starts at (UTC)"
msgstr "开始于(UTC)"
msgid "Starts escalations for this incident"
-msgstr ""
+msgstr "开始å‡çº§æ­¤äº‹ä»¶"
msgid "Starts on"
msgstr "开始于"
@@ -34764,6 +35671,9 @@ msgstr "状æ€:"
msgid "Status: %{title}"
msgstr "状æ€: %{title}"
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr "%{failed} 个失败, %{pending} 个待处ç†"
+
msgid "StatusCheck|%{failed} failed"
msgstr "%{failed} 个失败"
@@ -34836,9 +35746,6 @@ msgstr "目标分支"
msgid "StatusCheck|Update status check"
msgstr "更新状æ€æ£€æŸ¥"
-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 "æ›´æ–°æ­¤åˆå¹¶è¯·æ±‚时,会å‘以下 API å‘é€è°ƒç”¨ä»¥ç¡®è®¤å…¶çŠ¶æ€ã€‚ %{linkStart}了解更多%{linkEnd}。"
-
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr "您将è¦åˆ é™¤ %{name} 状æ€æ£€æŸ¥ã€‚"
@@ -34887,6 +35794,9 @@ msgstr "状æ€é¡µé¢å‰ç«¯"
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr "通过é…ç½®Prometheusæ¥ç›‘控你的部署,了解环境的性能和å¥åº·åº¦çš„最新状æ€ã€‚"
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr "第 %{currentStep} 步,共 %{stepCount} 步"
+
msgid "Step 1."
msgstr "第 1 步."
@@ -34930,7 +35840,7 @@ msgid "Strikethrough"
msgstr "删除线"
msgid "Strikethrough text"
-msgstr ""
+msgstr "删除线文本"
msgid "Subgroup information"
msgstr "å­ç¾¤ç»„ä¿¡æ¯"
@@ -35052,12 +35962,12 @@ msgstr "订阅已æˆåŠŸåˆ›å»ºã€‚"
msgid "Subscription successfully deleted."
msgstr "订阅已æˆåŠŸåˆ é™¤ã€‚"
+msgid "SubscriptionBanner|Add new license"
+msgstr "添加新的许å¯è¯"
+
msgid "SubscriptionBanner|Export license usage file"
msgstr "导出许å¯è¯ä½¿ç”¨æ–‡ä»¶"
-msgid "SubscriptionBanner|Upload new license"
-msgstr "上传新许å¯è¯"
-
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
msgstr "如果您有%{doc_link_start}任何问题需è¦è§£ç­”%{doc_link_end},我们很ä¹æ„为您æ供帮助。"
@@ -35077,7 +35987,7 @@ msgid "SubscriptionEmail|You can find more information about the quarterly recon
msgstr "您å¯ä»¥åœ¨%{doc_link_start}文档%{doc_link_end}中找到关于季度对账过程的更多信æ¯ã€‚"
msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
+msgstr "您的当å‰ç”¨æˆ·æ•°ä¸­æœ‰%{seat_quantity}å用户超出了你的 GitLab %{subscription_name} 订阅中的用户数é‡ã€‚å³ä½¿å½“å‰è¶…越了你的订阅用户数,您ä»ç„¶å¯ä»¥æ·»åŠ ç”¨æˆ·ï¼Œä¸”æ¯ä¸ªå­£åº¦ä¼šä¾ç…§è¶…出的用户数å‘您收å–é¢å¤–费用。"
msgid "SubscriptionTable|Add seats"
msgstr "添加席ä½"
@@ -35167,19 +36077,19 @@ msgid "Subscriptions"
msgstr "订阅"
msgid "Subscriptions|Chat with sales"
-msgstr ""
+msgstr "与销售沟通"
msgid "Subscriptions|Close"
-msgstr ""
+msgstr "关闭"
msgid "Subscriptions|Not ready to buy yet?"
-msgstr ""
+msgstr "尚未准备好购买?"
msgid "Subscriptions|Start a free trial"
-msgstr ""
+msgstr "开始å…费试用"
msgid "Subscriptions|We understand. Maybe you have some questions for our sales team, or maybe you'd like to try some of the paid features first. What would you like to do?"
-msgstr ""
+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 "您对 %{strong}%{namespace_name}%{strong_close} 的订阅已过期,您现在在 %{pricing_link_start}标准版%{pricing_link_end}了。别担心,您的数æ®æ˜¯å®‰å…¨çš„。请è”系我们的支æŒå›¢é˜Ÿï¼ˆ%{support_email})。他们将ä¹æ„帮助您更新订阅。"
@@ -35392,7 +36302,7 @@ msgid "SuperSonics|Maximum users"
msgstr "最大用户数"
msgid "SuperSonics|Offline cloud"
-msgstr ""
+msgstr "离线云"
msgid "SuperSonics|Paste your activation code"
msgstr "粘贴您的激活ç "
@@ -35436,8 +36346,9 @@ msgstr "这是 %{billableUsersLinkStart}计费用户%{billableUsersLinkEnd} çš„æ
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr "è¦æ¿€æ´»æ‚¨çš„订阅,请通过 %{linkStart}Cloud Licensing%{linkEnd} æœåŠ¡è¿žæŽ¥åˆ° GitLab æœåŠ¡å™¨ï¼Œè¿™æ˜¯ä¸€ç§è½»æ¾ç®¡ç†è®¢é˜…çš„æ–¹å¼ã€‚"
-msgid "SuperSonics|Upload a license file"
-msgstr "上传许å¯æ–‡ä»¶"
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
msgid "SuperSonics|Users in subscription"
msgstr "订阅数内的用户"
@@ -35461,10 +36372,10 @@ msgid "SuperSonics|You do not have an active subscription"
msgstr "您没有有效订阅"
msgid "SuperSonics|You have a future dated license"
-msgstr ""
+msgstr "您有一个未æ¥æ—¥æœŸçš„许å¯è¯"
msgid "SuperSonics|You have added a license that activates on %{date}. Please see the subscription history table below for more details."
-msgstr ""
+msgstr "您已ç»æ·»åŠ äº†æ¿€æ´»äºŽ %{date} 的许å¯è¯ã€‚详情请查看下é¢çš„订阅历å²è¡¨ã€‚"
msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
msgstr "您已æˆåŠŸæ·»åŠ åœ¨ %{date} 激活的许å¯è¯ã€‚有关更多详细信æ¯ï¼Œè¯·å‚阅下é¢çš„订阅历å²è¡¨ã€‚"
@@ -35580,12 +36491,6 @@ msgstr "系统钩å­å¸®åŠ©"
msgid "System Info"
msgstr "系统信æ¯"
-msgid "System OAuth applications"
-msgstr "系统 OAuth 应用程åº"
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr "系统 OAuth 应用程åºä¸å±žäºŽä»»ä½•ç”¨æˆ·ï¼Œåªèƒ½ç”±ç®¡ç†å‘˜ç®¡ç†"
-
msgid "System default (%{default})"
msgstr "系统默认值(%{default})"
@@ -35626,7 +36531,7 @@ msgid "Tag name is required"
msgstr "标签å称为必填项"
msgid "Tag push"
-msgstr ""
+msgstr "标签推é€"
msgid "Tag push events"
msgstr "标签推é€äº‹ä»¶"
@@ -35731,7 +36636,7 @@ msgid "TagsPage|protected"
msgstr "å·²ä¿æŠ¤"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
-msgstr ""
+msgstr "查看文档,å‘现 GitLab 的所有功能。"
msgid "Target Branch"
msgstr "目标分支"
@@ -35742,6 +36647,12 @@ msgstr "目标路径"
msgid "Target branch"
msgstr "目标分支"
+msgid "Target branch or tag"
+msgstr "目标分支或标签"
+
+msgid "Target roles"
+msgstr "目标角色"
+
msgid "Target-Branch"
msgstr "目标分支"
@@ -35775,9 +36686,6 @@ msgstr "æ¯æ¬¡æŽ¨é€åˆ°å­˜å‚¨åº“åŽè§¦å‘ TeamCity CI,分支删除除外"
msgid "Telephone number"
msgstr "电è¯å·ç "
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr "%{linkStart}在此å馈议题中%{linkEnd},告诉我们您对新 Markdown 编辑器的体验。"
-
msgid "Template"
msgstr "模æ¿"
@@ -36130,7 +37038,7 @@ msgid "Tests"
msgstr "测试"
msgid "Text (optional)"
-msgstr ""
+msgstr "文本(å¯é€‰ï¼‰"
msgid "Text added to the body of all email messages. %{character_limit} character limit"
msgstr "添加到所有电å­é‚®ä»¶æ­£æ–‡çš„文本。 %{character_limit} 字符é™åˆ¶"
@@ -36181,9 +37089,6 @@ msgstr "用于访问垃圾邮件检查æœåŠ¡ç«¯ç‚¹çš„ API 密钥."
msgid "The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment."
msgstr "CSV导出将在åŽå°åˆ›å»ºã€‚完æˆåŽï¼Œå®ƒå°†ä»¥é™„件形å¼å‘é€åˆ°%{email}。"
-msgid "The CSV export you requested of all user memberships is attached to this email."
-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 "GitLab 订阅æœåŠ¡ (customers.gitlab.com) ç›®å‰æ­£åœ¨ä¸­æ–­ã€‚您å¯ä»¥é€šè¿‡ %{linkStart}status.gitlab.com%{linkEnd}监控状æ€å¹¶èŽ·å–更新。"
@@ -36214,6 +37119,9 @@ msgstr "URL 应该以 http:// 或 https:// 开头"
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr "连接到Elasticsearchçš„URL。对于集群,请添加用逗å·åˆ†éš”çš„URL。"
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr "应用程åºå¯ç”¨äºŽå®¢æˆ·ç«¯å¯†é’¥å¯ä»¥ä¿æŒä¿å¯†çš„地方。原生移动应用和å•é¡µåº”用被视为为éžä¿å¯†ã€‚"
@@ -36226,6 +37134,9 @@ msgstr "此项目的分支没有活跃的æµæ°´çº¿é…置。"
msgid "The branch or tag does not exist"
msgstr "分支或标签ä¸å­˜åœ¨"
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr "广播消æ¯ä»…å‘具有这些角色的项目和群组中的用户显示。"
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "字符çªå‡ºæ˜¾ç¤ºå™¨å¸®åŠ©æ‚¨å°†ä¸»é¢˜è¡Œä¿æŒä¸º %{titleLength} 字符并将正文包装为 %{bodyLength} 以便它们在git中å¯è¯»ã€‚"
@@ -36247,12 +37158,18 @@ msgstr "åˆè§„报告显示åˆå¹¶è¯·æ±‚在å—ä¿æŠ¤çš„环境中åˆå¹¶ã€‚"
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "该连接将在 %{timeout}åŽè¶…时。如仓库导入耗时超过该时间,请使用克隆/推é€ç»„åˆã€‚"
-msgid "The contact does not belong to the issue group or an ancestor"
-msgstr "è”系人ä¸å±žäºŽè®®é¢˜æ‰€åœ¨ç¾¤ç»„或上级群组"
+msgid "The contact does not belong to the issue group's root ancestor"
+msgstr "è”系人ä¸å±žäºŽè®®é¢˜ç¾¤ç»„的根父组"
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr "内容编辑器å¯èƒ½ä¼šæ›´æ”¹æ–‡æ¡£çš„ Markdown æ ¼å¼æ ·å¼ï¼Œè¿™å¯èƒ½ä¸Žæ‚¨åŽŸæ¥çš„ Markdown æ ·å¼ä¸åŒ¹é…。"
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr "此页é¢çš„内容未以UTF-8ç¼–ç ã€‚编辑åªèƒ½é€šè¿‡Git仓库进行。"
@@ -36260,7 +37177,7 @@ msgid "The contents of this group, its subgroups and projects will be permanentl
msgstr "该群组,其å­ç»„和项目的内容将于%{deletion_adjourned_period}天åŽåœ¨%{date}永久删除。在此之åŽï¼Œæ‚¨çš„æ•°æ®å°†æ— æ³•æ¢å¤ã€‚"
msgid "The current epic"
-msgstr ""
+msgstr "当å‰å²è¯—"
msgid "The current issue"
msgstr "当å‰è®®é¢˜"
@@ -36423,7 +37340,7 @@ msgid "The latest pipeline for this merge request has failed."
msgstr "æ­¤åˆå¹¶è¯·æ±‚的最新æµæ°´çº¿å·²å¤±è´¥ã€‚"
msgid "The license key is invalid."
-msgstr ""
+msgstr "许å¯è¯å¯†é’¥æ— æ•ˆã€‚"
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr "许å¯è¯å¯†é’¥æ— æ•ˆã€‚请确ä¿å®ƒä¸Žæ‚¨ä»ŽGitLab Inc.收到的一致。"
@@ -36441,7 +37358,7 @@ msgid "The license was successfully uploaded and will be active from %{starts_at
msgstr "许å¯è¯å·²æˆåŠŸä¸Šä¼ ï¼Œå°†äºŽ%{starts_at}激活。您å¯ä»¥åœ¨ä¸‹é¢çœ‹åˆ°è¯¦ç»†ä¿¡æ¯ã€‚"
msgid "The license you uploaded is invalid. If the issue persists, contact support at %{link}."
-msgstr ""
+msgstr "您上传的许å¯è¯æ— æ•ˆã€‚如果问题ä»ç„¶å­˜åœ¨ï¼Œè¯·é€šè¿‡ %{link} è”系支æŒäººå‘˜ã€‚"
msgid "The list creation wizard is already open"
msgstr "列表创建å‘导已打开"
@@ -36545,6 +37462,9 @@ msgstr "该项目已æˆåŠŸå¯¼å…¥ã€‚"
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr "用于在作业日志中查找测试覆盖率输出的正则表达å¼ã€‚例如,对 Simplecov (Ruby) 使用%{regex}。留空以ç¦ç”¨ã€‚"
+msgid "The related CI build failed."
+msgstr "相关的 CI 构建失败。"
+
msgid "The remote mirror URL is invalid."
msgstr "è¿œç¨‹é•œåƒ URL 无效。"
@@ -36554,6 +37474,12 @@ msgstr "远程仓库镜åƒè¶…时未完æˆã€‚"
msgid "The remote repository is being updated..."
msgstr "远程仓库正在更新......"
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr "æ— æ³•è§£æž CI 构建æ供的报告产物。"
+
+msgid "The report has been successfully prepared."
+msgstr "报告已æˆåŠŸç¼–写。"
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr "å¯ä»¥æ交存储库,并å¯ä»¥åˆ›å»ºé—®é¢˜ï¼Œè¯„论和其他实体。"
@@ -36575,6 +37501,9 @@ msgstr "仓库必须能够通过%{code_open}http://%{code_close}, %{code_open}ht
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 "åŒä¸€ä¸ªå…±äº«runnerå¯æ‰§è¡Œå¤šä¸ªé¡¹ç›®çš„代ç ï¼Œé™¤éžæ‚¨é…置了自动伸缩,将%{link}设置为1 (GitLab.com 上的设置)。"
+msgid "The scan has been created."
+msgstr "扫æ已创建。"
+
msgid "The snippet can be accessed without any authentication."
msgstr "无需任何身份验è¯å³å¯è®¿é—®è¯¥ä»£ç ç‰‡æ®µã€‚"
@@ -36587,6 +37516,9 @@ msgstr "该代ç ç‰‡æ®µä»…对项目æˆå‘˜å¯è§ã€‚"
msgid "The snippet is visible to any logged in user except external users."
msgstr "该代ç ç‰‡æ®µå¯¹é™¤å¤–部用户外的所有登录用户å¯è§ã€‚"
+msgid "The source project of this merge request has been removed."
+msgstr "æ­¤åˆå¹¶è¯·æ±‚çš„æºé¡¹ç›®å·²è¢«åˆ é™¤ã€‚"
+
msgid "The specified tab is invalid, please select another"
msgstr "指定标签页无效,请选择å¦ä¸€ä¸ª"
@@ -36872,9 +37804,6 @@ 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 "获å–阶段总计数时出错"
@@ -37016,6 +37945,9 @@ msgstr "这些å˜é‡æ˜¯ä»Žä¸Šçº§ç¾¤ç»„继承的。"
msgid "These will be sent to %{email} in an attachment once finished."
msgstr "这些将在附件完æˆåŽå‘é€è‡³ %{email}。"
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr "第三方建议链接"
@@ -37028,8 +37960,8 @@ msgstr "æ­¤%{issuableType}是ç§å¯†çš„"
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr "æ­¤%{issuable}已被é”定。åªæœ‰%{strong_open}项目æˆå‘˜%{strong_close}æ‰å¯ä»¥å‘表评论。"
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
-msgstr "æ­¤%{noteableTypeText}为%{confidentialLinkStart}ç§å¯†çš„%{linkEnd}且%{lockedLinkStart}é”定的%{linkEnd}。"
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
+msgstr "æ­¤ %{noteableTypeText} 是%{confidentialLinkStart}ç§å¯†çš„%{confidentialLinkEnd}且%{lockedLinkStart}å·²é”定%{lockedLinkEnd}。"
msgid "This %{noteableTypeText} is locked."
msgstr "æ­¤%{noteableTypeText}å·²é”定。"
@@ -37055,8 +37987,8 @@ msgstr "此 PDF 太大而无法显示。请下载查看。"
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr "此项目目å‰å·²å­˜æ¡£å¹¶åªè¯»ã€‚如果您想è¦æ¢å¤æ‹‰å–é•œåƒï¼Œè¯·å…ˆå–消归档。"
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
-msgstr "æ­¤URLå·²ç»ç”¨äºŽå¦ä¸€ä¸ªé“¾æŽ¥ï¼›ä¸å…许é‡å¤ URL"
+msgid "This URL already exists."
+msgstr "此 URL 已存在"
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr "æ­¤æ“作å¯èƒ½å¯¼è‡´æ•°æ®ä¸¢å¤±ã€‚为防止æ„外,我们会è¦æ±‚您确认您的æ“作。"
@@ -37064,14 +37996,14 @@ msgstr "æ­¤æ“作å¯èƒ½å¯¼è‡´æ•°æ®ä¸¢å¤±ã€‚为防止æ„外,我们会è¦æ±‚您
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr "æ­¤æ“作无法撤消,它将永久删除%{key}SSH密钥"
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
-msgstr ""
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
+msgstr "æ­¤æ“作会删除 %{codeOpen}%{project_path_with_namespace}%{codeClose} 和此项目包å«çš„所有内容。 %{strongOpen}无法撤消。%{strongClose}"
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
-msgstr ""
+msgstr "æ­¤æ“作会删除在 %{date} 创建的 %{codeOpen}%{project_path_with_namespace}%{codeClose} 以åŠè¯¥é¡¹ç›®åŒ…å«çš„所有内容。"
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
-msgstr ""
+msgstr "æ­¤æ“作会删除在 %{date} 创建的 %{codeOpen}%{project_path_with_namespace}%{codeClose} 以åŠè¯¥é¡¹ç›®åŒ…å«çš„所有内容。%{strongOpen}æ­¤æ“作ä¸å¯æ¢å¤ã€‚%{strongClose}"
msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}immediately%{strongClose}."
msgstr "æ­¤æ“作将%{strongOpen}ç«‹å³%{strongClose}%{strongOpen}永久删除%{strongClose} %{codeOpen}%{group}%{codeClose}。"
@@ -37151,6 +38083,12 @@ msgstr "此内容无法显示,因为它存储在 LFS 中。您å¯ä»¥ %{linkSta
msgid "This credential has expired"
msgstr "此凭è¯å·²è¿‡æœŸ"
+msgid "This deployment is not waiting for approvals."
+msgstr "此部署ä¸ç­‰å¾…批准。"
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr "此设备已注册。"
@@ -37178,6 +38116,9 @@ msgstr "正在部署到此环境"
msgid "This environment is being re-deployed"
msgstr "正在é‡æ–°éƒ¨ç½²åˆ°æ­¤çŽ¯å¢ƒ"
+msgid "This environment is not protected."
+msgstr "此环境ä¸å—ä¿æŠ¤ã€‚"
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr "此环境的Canary Ingress最近有更新。请ç¨åŽå†è¯•ã€‚"
@@ -37212,7 +38153,7 @@ msgid "This group can't be removed because it is linked to a subscription. To re
msgstr "此群组ä¸èƒ½è¢«åˆ é™¤ï¼Œå› ä¸ºå®ƒå·²é“¾æŽ¥åˆ°ä¸€ä¸ªè®¢é˜…,è¦åˆ é™¤æ­¤ç¾¤ç»„, %{linkStart}将订阅%{linkEnd} 链接到å¦ä¸€ä¸ªç¾¤ç»„。"
msgid "This group can't be transferred because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group."
-msgstr ""
+msgstr "无法转移此群组,它已链接到一个订阅。è¦è½¬ç§»æ­¤ç¾¤ç»„,请将%{linkStart}此订阅%{linkEnd}链接到其他群组。"
msgid "This group cannot be invited to a project inside a group with enforced SSO"
msgstr "此群组ä¸èƒ½è¢«é‚€è¯·åˆ°å¼ºåˆ¶SSO的群组中"
@@ -37239,7 +38180,7 @@ msgid "This group, its subgroups and projects will be removed on %{date} since i
msgstr "此群组ã€å…¶å­ç¾¤ç»„åŠé¡¹ç›®å°†äºŽ%{date}被删除,因为其父群组“%{parent_group_name}â€å·²è¢«è®¡åˆ’移除。"
msgid "This incident is already escalated with '%{escalation_policy_name}'."
-msgstr ""
+msgstr "此事件已å‡çº§ä¸ºâ€œ%{escalation_policy_name}â€ã€‚"
msgid "This invitation was sent to %{mail_to_invite_email}, but you are signed in as %{link_to_current_user} with email %{mail_to_current_user}."
msgstr "此邀请已å‘é€è‡³ %{mail_to_invite_email},但您以 %{link_to_current_user} 身份使用电å­é‚®ä»¶ %{mail_to_current_user}登录。"
@@ -37281,10 +38222,10 @@ msgid "This is your current session"
msgstr "这是您当å‰çš„会è¯"
msgid "This issue cannot be assigned to a confidential epic because it is public."
-msgstr ""
+msgstr "此议题ä¸èƒ½åˆ†é…ç»™ç§å¯†å²è¯—,因为它是公开的。"
msgid "This issue cannot be made public because it belongs to a confidential epic."
-msgstr ""
+msgstr "此议题ä¸èƒ½å…¬å¼€ï¼Œå› ä¸ºå®ƒå±žäºŽç§å¯†å²è¯—。"
msgid "This issue is confidential and should only be visible to team members with at least Reporter access."
msgstr "此议题是ä¿å¯†çš„,åªèƒ½æ˜¾ç¤ºç»™æ‹¥æœ‰è‡³å°‘“报告人â€è®¿é—®æƒé™çš„团队æˆå‘˜ã€‚"
@@ -37304,9 +38245,15 @@ msgstr "该作业ä¾èµ–于其他产物已过期/已删除的作业:%{invalid_d
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr "当å‰ä½œä¸šéœ€åœ¨ä¸Šçº§ä½œä¸šæˆåŠŸåŽæ‰å¯è¢«å¯åŠ¨ã€‚"
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr "此作业部署到å—ä¿æŠ¤çš„环境\"%{environment}\",需è¦æ‰¹å‡†ã€‚"
+
msgid "This job does not have a trace."
msgstr "此作业无输出日志。"
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr "此作业已å–消"
@@ -37404,7 +38351,7 @@ msgid "This means you can not push code until you create an empty repository or
msgstr "在创建一个空的仓库或导入现有仓库之å‰ï¼Œå°†æ— æ³•æŽ¨é€ä»£ç ã€‚"
msgid "This merge request branch is protected from force push."
-msgstr ""
+msgstr "这个åˆå¹¶è¯·æ±‚分支ä¸ä¼šè¢«å¼ºåˆ¶æŽ¨é€ã€‚"
msgid "This merge request cannot be rebased while there are conflicts."
msgstr "存在冲çªæ—¶ï¼Œæ­¤åˆå¹¶è¯·æ±‚无法 rebase。"
@@ -37458,13 +38405,13 @@ msgid "This pipeline was triggered by a schedule."
msgstr "æ­¤æµæ°´çº¿æ˜¯ç”±å®šæ—¶è®¡åˆ’触å‘çš„."
msgid "This process deletes the project repository and all related resources."
-msgstr ""
+msgstr "æ­¤æµç¨‹å°†åˆ é™¤é¡¹ç›®ä»“库和所有相关资æºã€‚"
msgid "This project"
msgstr "当å‰é¡¹ç›®"
msgid "This project can be restored until %{date}."
-msgstr ""
+msgstr "此项目å¯ä»¥æ¢å¤åˆ° %{date}。"
msgid "This project cannot be %{visibilityLevel} because the visibility of %{openShowLink}%{name}%{closeShowLink} is %{visibility}. To make this project %{visibilityLevel}, you must first %{openEditLink}change the visibility%{closeEditLink} of the parent group."
msgstr "此项目ä¸èƒ½ä¸º%{visibilityLevel} ,因为 %{openShowLink}%{name}%{closeShowLink} çš„å¯è§æ€§ä¸º %{visibility}。è¦ä½¿è¿™ä¸ªé¡¹ç›®ä¸º%{visibilityLevel},您必须首先%{openEditLink}更改父组的å¯è§æ€§%{closeEditLink}。"
@@ -37485,7 +38432,7 @@ msgid "This project is %{strongStart}NOT%{strongEnd} a fork, and has the followi
msgstr "这个项目 %{strongStart}ä¸æ˜¯%{strongEnd} 一个派生项目,并具有以下内容:"
msgid "This project is %{strongStart}NOT%{strongEnd} a fork. This process deletes the project repository and all related resources."
-msgstr ""
+msgstr "此项目 %{strongStart}ä¸æ˜¯%{strongEnd} 一个派生项目,此æµç¨‹å°†åˆ é™¤é¡¹ç›®ä»“库和所有相关的资æºã€‚"
msgid "This project is archived and cannot be commented on."
msgstr "此项目已存档,无法添加评论。"
@@ -37544,6 +38491,9 @@ msgstr "此订阅适用于"
msgid "This suggestion already matches its content."
msgstr "此建议已ç»ä¸Žå®ƒçš„内容相åŒã€‚"
+msgid "This title already exists."
+msgstr "此标题已存在。"
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr "无法从GitLab手动解ç¦æ­¤ç”¨æˆ·"
@@ -38014,6 +38964,9 @@ msgstr "è¦æ·»åŠ è‡ªå®šä¹‰åŽç¼€ï¼Œè¯·è®¾ç½®æœåŠ¡å°ç”µå­é‚®ä»¶åœ°å€ã€‚%{link
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr "如需手动添加æ¡ç›®ï¼Œè¯·åœ¨æ‰‹æœºåº”用中æ供以下信æ¯ã€‚"
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr "è¦è®©æŸäººæŸ¥çœ‹åˆå¹¶è¯·æ±‚,请选择 %{strongStart}请求关注%{strongEnd}。å†æ¬¡é€‰æ‹©ä»¥ç§»é™¤è¯·æ±‚。"
+
msgid "To confirm, type %{phrase_code}"
msgstr "è¦ç¡®è®¤ï¼Œè¯·é”®å…¥ %{phrase_code}"
@@ -38095,6 +39048,9 @@ msgstr "è‹¥è¦å°†å˜é‡ä¼ é€’到触å‘æµæ°´çº¿ï¼Œè¯·åœ¨ API 请求中添加 %{c
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr "为了个性化您的GitLab体验,我们想了解更多关于您的信æ¯"
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr "为了ä¿æŒæ€§èƒ½ï¼Œåªæ˜¾ç¤º %{strongStart}%{visible}/%{total}%{strongEnd} 个文件。"
+
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}。"
@@ -38113,8 +39069,8 @@ msgstr "è¦é‡æ–°æ¿€æ´»æ‚¨çš„å¸æˆ·ï¼Œè¯·åœ¨ %{gitlab_url}登录 GitLab。"
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 "è¦ä»Žæ‰‹åŠ¨é…置的PrometheusæœåŠ¡æŽ¥æ”¶è­¦æŠ¥ï¼Œè¯·å°†ä»¥ä¸‹URL和授æƒå¯†é’¥æ·»åŠ åˆ°Prometheus webhooké…置文件中。了解更多关于 %{linkStart}é…ç½®Prometheus%{linkEnd} 将警报å‘é€åˆ°GitLab。"
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
-msgstr "è‹¥è¦æ›´æ–°ï¼Œè¯·å°†æ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¯¼å‡ºå¹¶å‘é€ç”µå­é‚®ä»¶è‡³ %{renewal_service_email}。新的许å¯è¯å°†ä¼šè¢«å‘é€åˆ°åœ¨ %{customers_dot} 注册的电å­é‚®ä»¶åœ°å€ã€‚ 您å¯ä»¥å°†æ­¤è®¸å¯è¯ä¸Šä¼ åˆ°æ‚¨çš„实例。"
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr "è‹¥è¦æ›´æ–°ï¼Œè¯·å°†æ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¯¼å‡ºå¹¶å‘é€ç”µå­é‚®ä»¶è‡³ %{renewal_service_email}。 新的许å¯è¯å°†å‘é€åˆ°åœ¨ %{customers_dot} 注册的电å­é‚®ä»¶åœ°å€ã€‚您å¯ä»¥å°†æ­¤è®¸å¯è¯æ·»åŠ åˆ°æ‚¨çš„实例。"
msgid "To resolve this, try to:"
msgstr "è¦è§£å†³æ­¤é—®é¢˜ï¼Œè¯·å°è¯•ï¼š"
@@ -38177,7 +39133,7 @@ msgid "Today"
msgstr "今日"
msgid "Todos count"
-msgstr ""
+msgstr "待办事项计数"
msgid "Todos|Are you looking for things to do? Take a look at %{strongStart}%{openIssuesLinkStart}open issues%{openIssuesLinkEnd}%{strongEnd}, contribute to %{strongStart}%{mergeRequestLinkStart}a merge request%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd}, or mention someone in a comment to automatically assign them a new to-do item."
msgstr "您正在寻找è¦åšçš„事情å—? 查看 %{strongStart}%{openIssuesLinkStart}打开的议题%{openIssuesLinkEnd}%{strongEnd},贡献给 %{strongStart}%{mergeRequestLinkStart}åˆå¹¶è¯·æ±‚%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd},或在评论中æåŠæŸäººï¼Œè‡ªåŠ¨åˆ†é…新的待办事项。"
@@ -38263,9 +39219,6 @@ msgstr "切æ¢è¾¹æ "
msgid "Toggle the Performance Bar"
msgstr "切æ¢æ€§èƒ½æ "
-msgid "Toggle thread"
-msgstr "切æ¢ä¸»é¢˜"
-
msgid "Toggled :%{name}: emoji award."
msgstr "åˆ‡æ¢ :%{name}: 表情符å·èµžèµã€‚"
@@ -38311,6 +39264,9 @@ msgstr "主题 %{topic_name} å·²æˆåŠŸåˆ›å»ºã€‚"
msgid "Topic avatar"
msgstr "主题头åƒ"
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr "主题å称"
@@ -38404,6 +39360,9 @@ msgstr "无法更新路径。因为此群组下的项目包å«äº†å®¹å™¨é•œåƒåº“
msgid "TransferGroup|Database is not supported."
msgstr "ä¸æ”¯æŒçš„æ•°æ®åº“。"
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr "群组包å«å¸¦æœ‰NPM软件包的项目。"
@@ -38453,7 +39412,7 @@ msgid "Trending"
msgstr "热门"
msgid "Trials|%{planName} Trial"
-msgstr ""
+msgstr "%{planName} 试用"
msgid "Trials|Compare all plans"
msgstr "比较所有方案"
@@ -38462,7 +39421,7 @@ msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr "创建一个新群组以开始您的旗舰版试用。"
msgid "Trials|Day %{daysUsed}/%{duration}"
-msgstr ""
+msgstr "第 %{daysUsed}/%{duration} 天"
msgid "Trials|Go back to GitLab"
msgstr "返回GitLab"
@@ -38593,6 +39552,9 @@ msgstr "请é‡è¯•"
msgid "Try again?"
msgstr "é‡è¯•ï¼Ÿ"
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr "30天内体验GitLab的所有功能。"
@@ -38714,7 +39676,7 @@ msgid "URL is triggered when repository is updated"
msgstr "æ›´æ–°ä»“åº“æ—¶è§¦å‘ URL"
msgid "URL must be percent-encoded if necessary."
-msgstr ""
+msgstr "如有必è¦ï¼ŒURL å¿…é¡»ç»è¿‡ç™¾åˆ†æ¯”ç¼–ç ã€‚"
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr "URL必须以%{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}或%{codeStart}ftp://%{codeEnd}开始"
@@ -38797,6 +39759,9 @@ msgstr "无法加载æ交。请ç¨åŽå†è¯•ã€‚"
msgid "Unable to load file contents. Try again later."
msgstr "无法加载文件内容。ç¨åŽå†è¯•ã€‚"
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr "无法加载差异"
@@ -38833,6 +39798,9 @@ msgstr "当å‰æ— æ³•æ›´æ–°æ­¤ å²è¯—。"
msgid "Unable to update this issue at this time."
msgstr "当å‰æ— æ³•æ›´æ–°è¿™ä¸ªè®®é¢˜ã€‚"
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr "å–消批准åˆå¹¶è¯·æ±‚"
@@ -38933,7 +39901,7 @@ msgid "Unlock account"
msgstr "解é”账户"
msgid "Unlock more features with GitLab Ultimate"
-msgstr ""
+msgstr "使用旗舰版解é”更多功能"
msgid "Unlock the discussion"
msgstr "解é”讨论"
@@ -38959,6 +39927,9 @@ msgstr "å–消标记此%{noun}为è‰ç¨¿ã€‚"
msgid "Unreachable"
msgstr "无法访问"
+msgid "Unrecognized approval status."
+msgstr "未识别的批准状æ€ã€‚"
+
msgid "Unrecognized cluster type"
msgstr "无法识别的集群类型"
@@ -38999,7 +39970,7 @@ msgid "Unsubscribes from this %{quick_action_target}."
msgstr "å–消订阅%{quick_action_target}."
msgid "Unsupported sort value."
-msgstr ""
+msgstr "ä¸æ”¯æŒçš„排åºå€¼ã€‚"
msgid "Unsupported todo type passed. Supported todo types are: %{todo_types}"
msgstr "传入了ä¸æ”¯æŒçš„待办事项类型。支æŒçš„待办事项类型为: %{todo_types}"
@@ -39139,9 +40110,6 @@ msgstr "上传CSV文件"
msgid "Upload File"
msgstr "上传文件"
-msgid "Upload License"
-msgstr "上传许å¯è¯"
-
msgid "Upload New File"
msgstr "上传新文件"
@@ -39160,9 +40128,6 @@ msgstr "上传文件"
msgid "Upload image"
msgstr "上传图片"
-msgid "Upload license"
-msgstr "上传许å¯è¯"
-
msgid "Upload new file"
msgstr "上传新文件"
@@ -39172,6 +40137,9 @@ msgstr "上传对象图"
msgid "UploadLink|click to upload"
msgstr "点击上传"
+msgid "Uploaded"
+msgstr "已上传"
+
msgid "Uploading changes to terminal"
msgstr "正在将å˜æ›´å†…容上传到终端"
@@ -39229,8 +40197,8 @@ msgstr "当å‰å‘¨æœŸä½¿ç”¨é‡"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr "文件附件和较å°çš„设计图表。"
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
-msgstr ""
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+msgstr "从 %{storage_enforcement_date} 开始,存储é™åˆ¶å°†åº”用于此命å空间。在 %{strong_start}%{namespace_type} 设置 &gt; 使用é…é¢%{strong_end} 中查看和管ç†æ‚¨çš„使用é‡ã€‚"
msgid "UsageQuota|Git repository."
msgstr "Git仓库。"
@@ -39293,7 +40261,7 @@ msgid "UsageQuota|Storage type"
msgstr "存储类型"
msgid "UsageQuota|Storage used"
-msgstr ""
+msgstr "已使用存储"
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr "这是此å称空间中所有项目使用的存储空间总和。"
@@ -39466,6 +40434,9 @@ msgstr "使用 .gitlab-ci.yml"
msgid "Use GitLab Runner in AWS"
msgstr "在 AWS 中使用 GitLab Runner"
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr "使用安全文件æ¥å­˜å‚¨æ‚¨æµæ°´çº¿ä½¿ç”¨çš„æ–‡ä»¶ï¼Œä¾‹å¦‚å®‰å“ keystores 或 Apple provising profile 和签åè¯ä¹¦ã€‚"
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr "在您的移动设备或计算机上使用一次性密ç éªŒè¯å™¨æ¥å¯ç”¨åŒé‡éªŒè¯ (2FA)。"
@@ -39475,6 +40446,9 @@ msgstr "使用 AWS CloudFormation æ¨¡æ¿ (CFT) 在 AWS 中安装和é…ç½® GitLab
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr "使用 authorized_keys 文件æ¥éªŒè¯ SSH 密钥"
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr "使用横幅和通知,通知您的用户有关定期维护ã€æœ€è¿‘å‡çº§ç­‰ä¿¡æ¯ã€‚"
+
msgid "Use cURL"
msgstr "使用 cURL"
@@ -39491,10 +40465,10 @@ msgid "Use hashed storage paths for newly created and renamed repositories. Alwa
msgstr "对新创建和é‡å‘½å的仓库使用哈希存储路径。从 13.0 版起始终å¯ç”¨ã€‚"
msgid "Use issue count"
-msgstr ""
+msgstr "使用议题计数"
msgid "Use issue weight"
-msgstr ""
+msgstr "使用议题æƒé‡"
msgid "Use one line per URI"
msgstr "æ¯ä¸ªURIå ä¸€è¡Œ"
@@ -39878,7 +40852,7 @@ msgid "Users"
msgstr "用户"
msgid "Users API rate limit"
-msgstr ""
+msgstr "用户 API 调用速率é™åˆ¶"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr "%{linkStart}Gitpod%{linkEnd} 集æˆåŽï¼Œç”¨æˆ·å¯ä»¥ä»Ž GitLab æµè§ˆå™¨é€‰é¡¹å¡å¯åŠ¨å¼€å‘环境。"
@@ -40204,7 +41178,7 @@ msgid "View group labels"
msgstr "查看群组标记"
msgid "View group pipeline usage quota"
-msgstr ""
+msgstr "查看群组æµæ°´çº¿ç”¨é‡é…é¢"
msgid "View incident details at"
msgstr "查看事件详细信æ¯äºŽ"
@@ -40279,9 +41253,6 @@ msgstr "查看替æ¢æ–‡ä»¶ @ "
msgid "View seat usage"
msgstr "查看席ä½ä½¿ç”¨æƒ…况"
-msgid "View setting"
-msgstr "查看设置"
-
msgid "View supported languages and frameworks"
msgstr "查看支æŒçš„语言和框架"
@@ -40306,6 +41277,9 @@ msgstr "已查看"
msgid "Viewing commit"
msgstr "查看æ交"
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr "使用统一的 URL 无法从主站查看项目和设计数æ®ï¼Œç›´æŽ¥è®¿é—®æ¬¡è¦ç«™ç‚¹ã€‚%{geo_help_url}"
+
msgid "Violation"
msgstr "è¿è§„"
@@ -40358,7 +41332,7 @@ msgid "Vulnerabilities over time"
msgstr "æ¼æ´žè¶‹åŠ¿å›¾"
msgid "Vulnerability"
-msgstr ""
+msgstr "æ¼æ´ž"
msgid "Vulnerability Report"
msgstr "æ¼æ´žæŠ¥å‘Š"
@@ -40411,9 +41385,6 @@ msgstr "添加æ¼æ´žå‘现"
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr "未è¯å®žçš„未确认å‘现"
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr "更改状æ€"
@@ -40424,22 +41395,25 @@ msgid "VulnerabilityManagement|Create Jira issue"
msgstr "创建 Jira 议题"
msgid "VulnerabilityManagement|Enter a name"
-msgstr ""
+msgstr "输入å称"
msgid "VulnerabilityManagement|Enter the CVE or CWE code"
-msgstr ""
+msgstr "输入 CVE 或 CWE ç¼–å·"
msgid "VulnerabilityManagement|Enter the CVE or CWE identifier URL"
-msgstr ""
+msgstr "输入 CVE 或 CWE 标识符 URL"
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr "获å–å…³è”çš„ Jira 议题"
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr "识别ç å’Œ URL 是必填字段"
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr "在æ¼æ´žæŠ¥å‘Šä¸­æ‰‹åŠ¨æ·»åŠ æ¼æ´žæ¡ç›®ã€‚"
msgid "VulnerabilityManagement|Name is a required field"
-msgstr ""
+msgstr "å称是必填的"
msgid "VulnerabilityManagement|Needs triage"
msgstr "需è¦åˆ†ç±»"
@@ -40457,16 +41431,16 @@ msgid "VulnerabilityManagement|Select a method"
msgstr "选择方法"
msgid "VulnerabilityManagement|Select a severity level"
-msgstr ""
+msgstr "选择严é‡æ€§çº§åˆ«"
msgid "VulnerabilityManagement|Select a status"
-msgstr ""
+msgstr "选择状æ€"
msgid "VulnerabilityManagement|Severity is a required field"
-msgstr ""
+msgstr "严é‡æ€§çº§åˆ«æ˜¯å¿…å¡«çš„"
msgid "VulnerabilityManagement|Something went wrong while creating vulnerability"
-msgstr ""
+msgstr "创建æ¼æ´žä¿¡æ¯æ—¶å‡ºé”™ã€‚"
msgid "VulnerabilityManagement|Something went wrong while trying to delete the comment. Please try again later."
msgstr "试图删除评论时出错。请ç¨åŽå†è¯•ã€‚"
@@ -40493,10 +41467,10 @@ msgid "VulnerabilityManagement|Something went wrong, could not update vulnerabil
msgstr "出错了,无法更新æ¼æ´žçŠ¶æ€ã€‚"
msgid "VulnerabilityManagement|Status is a required field"
-msgstr ""
+msgstr "状æ€æ˜¯å¿…å¡«çš„"
msgid "VulnerabilityManagement|Submit vulnerability"
-msgstr ""
+msgstr "æ交æ¼æ´žä¿¡æ¯"
msgid "VulnerabilityManagement|Summary, detailed description, steps to reproduce, etc."
msgstr "总结ã€è¯¦ç»†è¯´æ˜Žã€é‡çŽ°æ­¥éª¤ç­‰"
@@ -40555,6 +41529,9 @@ msgstr "CVSS v3"
msgid "Vulnerability|Class"
msgstr "类型"
+msgid "Vulnerability|Cluster"
+msgstr "集群"
+
msgid "Vulnerability|Code Review"
msgstr "代ç å®¡æŸ¥"
@@ -40651,9 +41628,6 @@ msgstr "请求/å“应"
msgid "Vulnerability|Scanner Provider"
msgstr "扫æ工具æ供者"
-msgid "Vulnerability|Secure Code Warrior"
-msgstr "Secure Code Warrior"
-
msgid "Vulnerability|Security Audit"
msgstr "安全审计"
@@ -40694,11 +41668,14 @@ msgid "WARNING:"
msgstr "警告:"
msgid "WARNING: This snippet contains hidden files which might be used to mask malicious behavior. Exercise caution if cloning and executing code from this snippet."
-msgstr ""
+msgstr "警告:此代ç ç‰‡æ®µåŒ…å«å¯èƒ½ç”¨äºŽæŽ©ç›–æ¶æ„行为的éšè—文件,克隆和执行其中的代ç éœ€è¦è°¨æ…Žã€‚"
msgid "Wait for the file to load to copy its contents"
msgstr "等待文件加载以å¤åˆ¶å…¶å†…容"
+msgid "Waiting for approval"
+msgstr "等待批准"
+
msgid "Waiting for merge (open and assigned)"
msgstr "等待åˆå¹¶(å¼€å¯ä¸­å’Œå·²åˆ†é…)"
@@ -40720,6 +41697,9 @@ msgstr "警告:显示此图表å¯èƒ½ä¼šå¼•èµ·é¡µé¢çš„性能问题。"
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr "警告:åŒæ­¥ LDAP 会删除直接æˆå‘˜çš„访问æƒé™ã€‚"
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr "我们目å‰æ— æ³•èŽ·å–æ­¤æµæ°´çº¿æŠ¥å¤´çš„æ•°æ®ã€‚"
@@ -40916,13 +41896,13 @@ msgid "Webhooks|An issue is created, updated, closed, or reopened."
msgstr "已创建ã€æ›´æ–°ã€å…³é—­æˆ–é‡æ–°æ‰“开议题。"
msgid "Webhooks|Are you sure you want to delete this group hook?"
-msgstr ""
+msgstr "您确实需è¦åˆ é™¤è¿™ä¸ªç¾¤ç»„ hook å—?"
msgid "Webhooks|Are you sure you want to delete this project hook?"
-msgstr ""
+msgstr "您确实需è¦åˆ é™¤è¿™ä¸ªé¡¹ç›® hook å—?"
msgid "Webhooks|Are you sure you want to delete this webhook?"
-msgstr ""
+msgstr "您确实需è¦åˆ é™¤è¿™ä¸ª webhook å—?"
msgid "Webhooks|Comments"
msgstr "评论"
@@ -40934,7 +41914,7 @@ msgid "Webhooks|Confidential issues events"
msgstr "ç§å¯†è®®é¢˜äº‹ä»¶"
msgid "Webhooks|Delete webhook"
-msgstr ""
+msgstr "删除 webhook"
msgid "Webhooks|Deployment events"
msgstr "部署事件"
@@ -41020,6 +42000,9 @@ msgstr "Webhook 被自动ç¦ç”¨"
msgid "Webhooks|Wiki page events"
msgstr "Wiki页é¢äº‹ä»¶"
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr "网站:"
@@ -41065,9 +42048,6 @@ msgstr "什么是实例审计事件?"
msgid "What are project audit events?"
msgstr "什么是项目审计事件?"
-msgid "What are you searching for?"
-msgstr "您è¦æœç´¢ä»€ä¹ˆï¼Ÿ"
-
msgid "What does this command do?"
msgstr "这个命令有什么作用?"
@@ -41110,15 +42090,15 @@ msgstr "当Runner被é”定时,ä¸èƒ½å°†å…¶åˆ†é…给其他项目"
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr "如果å¯ç”¨ï¼Œåˆ™ä¸å†æŽ¥å—无过期日期或无效过期日期的 SSH 密钥。留空为无é™åˆ¶ã€‚"
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
+msgstr "å¯ç”¨åŽï¼Œæ¸…ç†ç­–略执行速度更快,但会给 Redis 带æ¥æ›´å¤šè´Ÿè½½ã€‚"
+
msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
msgstr "å¯ç”¨åŽï¼ŒçŽ°æœ‰çš„个人访问令牌å¯èƒ½ä¼šè¢«æ’¤é”€ã€‚留空表示没有é™åˆ¶ã€‚"
msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr "å¯ç”¨åŽï¼ŒDatadog 会收集作业日志并与æµæ°´çº¿æ‰§è¡Œè·Ÿè¸ªä¸€èµ·æ˜¾ç¤ºã€‚"
-msgid "When inactive, an external authentication provider must be used."
-msgstr "当未激活时,必须使用外部身份验è¯æ供程åºã€‚"
-
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr "当默认分支中的åˆå¹¶è¯·æ±‚å’Œæ交关闭时,它们引用的任何议题也会关闭。"
@@ -41132,6 +42112,9 @@ msgstr[0] "当åˆå¹¶è¯·æ±‚被接å—æ—¶"
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 "使用%{code_open}http://%{code_close}或%{code_open}https://%{code_close}å议时,请æ供仓库的实际地å€ã€‚ä¸æ”¯æŒHTTPé‡å®šå‘。"
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr "当:"
@@ -41169,7 +42152,7 @@ msgid "Wiki"
msgstr "Wiki"
msgid "Wiki page"
-msgstr ""
+msgstr "Wiki 页é¢"
msgid "Wiki page was successfully created."
msgstr "Wiki页é¢å·²æˆåŠŸåˆ›å»ºã€‚"
@@ -41223,7 +42206,7 @@ msgid "WikiEmpty|Create your first page"
msgstr "创建您的第一个页é¢"
msgid "WikiEmpty|Enable the Confluence Wiki integration"
-msgstr "å¯ç”¨Conflence Wiki集æˆ"
+msgstr "å¯ç”¨Confluence Wiki集æˆ"
msgid "WikiEmpty|Go to Confluence"
msgstr "转到Confluence"
@@ -41277,10 +42260,7 @@ msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Pl
msgstr "有人在您编辑页é¢çš„åŒæ—¶ç¼–辑了页é¢ã€‚请查看%{wikiLinkStart}页é¢%{wikiLinkEnd}并确ä¿æ‚¨çš„更改ä¸ä¼šæ— æ„中删除它们的更改。"
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
-msgstr ""
-
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr "确定è¦åˆ‡æ¢å›žç»å…¸ç¼–辑器å—?"
+msgstr "å°è¯•æ¸²æŸ“内容编辑器时å‘生错误,请ç¨åŽå†è¯•ã€‚"
msgid "WikiPage|Cancel"
msgstr "å–消"
@@ -41306,12 +42286,6 @@ msgstr "编辑æ¥æº"
msgid "WikiPage|Format"
msgstr "æ ¼å¼"
-msgid "WikiPage|Get a richer editing experience"
-msgstr "获得更丰富的编辑体验"
-
-msgid "WikiPage|Keep editing"
-msgstr "继续编辑"
-
msgid "WikiPage|Learn more."
msgstr "了解更多。"
@@ -41324,18 +42298,6 @@ msgstr "é‡è¯•"
msgid "WikiPage|Save changes"
msgstr "ä¿å­˜æ›´æ”¹"
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr "切æ¢å›žç»å…¸ç¼–辑器。"
-
-msgid "WikiPage|Switch to classic editor"
-msgstr "切æ¢åˆ°ç»å…¸ç¼–辑器"
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 "此编辑器处于测试阶段,å¯èƒ½æ— æ³•æ­£ç¡®æ˜¾ç¤ºé¡µé¢å†…容。切æ¢å›žç»å…¸ç¼–辑器将放弃您在新编辑器中所åšçš„更改。"
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr "æ示:您å¯ä»¥é€šè¿‡åœ¨æ ‡é¢˜å¼€å¤´æ·»åŠ è·¯å¾„æ¥ç§»åŠ¨æ­¤é¡µé¢ã€‚"
@@ -41348,18 +42310,9 @@ msgstr "标题"
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr "è¦é“¾æŽ¥åˆ°ï¼ˆæ–°ï¼‰é¡µé¢ï¼Œåªéœ€é”®å…¥ %{linkExample}。更多示例请查看 %{linkStart}文档%{linkEnd}。"
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr "试用新的å¯è§†åŒ– Markdown 编辑器。阅读 %{linkStart}文档%{linkEnd} 以了解当å‰æ”¯æŒçš„功能。"
-
-msgid "WikiPage|Try this later"
-msgstr "ç¨åŽå†è¯•"
-
msgid "WikiPage|Update %{pageTitle}"
msgstr "æ›´æ–° %{pageTitle}"
-msgid "WikiPage|Use the new editor"
-msgstr "使用新的编辑器"
-
msgid "WikiPage|Write your content or drag files here…"
msgstr "在这里编写您的内容或将文件拖动到此处..."
@@ -41435,17 +42388,23 @@ msgstr "创建工作项"
msgid "WorkItem|New Task"
msgstr "新建任务"
-msgid "WorkItem|Something went wrong when creating a work item. Please try again"
+msgid "WorkItem|Select type"
msgstr ""
+msgid "WorkItem|Something went wrong when creating a work item. Please try again"
+msgstr "创建工作项时出现错误,请å†è¯•ä¸€æ¬¡ã€‚"
+
msgid "WorkItem|Something went wrong when fetching the work item. Please try again."
-msgstr ""
+msgstr "获å–工作项时出现错误,请å†è¯•ä¸€æ¬¡ã€‚"
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
+msgstr "获å–工作项类型时出现错误,请å†è¯•ä¸€æ¬¡ã€‚"
+
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
msgstr ""
msgid "WorkItem|Type"
-msgstr ""
+msgstr "类型"
msgid "WorkItem|Work Items"
msgstr "工作事项"
@@ -41514,10 +42473,10 @@ msgid "You are about to add %{usersTag} people to the discussion. They will all
msgstr "å³å°†æŠŠ%{usersTag}相关人员添加到讨论中。他们都会收到通知。"
msgid "You are about to delete this forked project containing:"
-msgstr ""
+msgstr "您将è¦åˆ é™¤æ­¤æ´¾ç”Ÿé¡¹ç›®ï¼Œå…¶ä¸­åŒ…å«ï¼š"
msgid "You are about to delete this project containing:"
-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}以外的任何群组和项目。"
@@ -41538,7 +42497,7 @@ msgid "You are attempting to update a file that has changed since you started ed
msgstr "您正在å°è¯•æ›´æ–°çš„文件自您开始编辑以æ¥å·²ç»å‘生更改。"
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
-msgstr ""
+msgstr "如果超过此数字,将为您计费。%{qsrOverageLinkStart}计费如何è¿ä½œï¼Ÿ%{qsrOverageLinkEnd}"
msgid "You are connected to the Prometheus server, but there is currently no data to display."
msgstr "您已连接到PrometheusæœåŠ¡å™¨ï¼Œä½†å½“å‰æ²¡æœ‰æ•°æ®å¯æ˜¾ç¤ºã€‚"
@@ -41598,7 +42557,7 @@ msgid "You are not authorized to update this scanner profile"
msgstr "您无æƒæ›´æ–°æ­¤æ‰«æ工具é…置文件"
msgid "You are not authorized to upload metric images"
-msgstr ""
+msgstr "您无æƒä¸Šä¼ æŒ‡æ ‡é•œåƒ"
msgid "You are now impersonating %{username}"
msgstr "您正在使用%{username}的身份"
@@ -41654,6 +42613,12 @@ msgstr "您å¯ä»¥ç¨åŽæ›´æ”¹æ‚¨çš„ URL"
msgid "You can always edit this later"
msgstr "您也å¯ä»¥ç¨åŽç¼–辑此选项。"
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr "您å¯ä»¥åœ¨ %{pat_link_start}个人访问令牌%{pat_link_end} 中查看它。"
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr "您å¯ä»¥åœ¨æ‚¨çš„个人访问令牌设置 %{pat_link} 中查看它。"
+
msgid "You can create a new %{link}."
msgstr "您å¯ä»¥åˆ›å»ºä¸€ä¸ªæ–°çš„%{link}。"
@@ -41730,7 +42695,7 @@ msgid "You can now close this window."
msgstr "您现在å¯ä»¥å…³é—­æ­¤çª—å£ã€‚"
msgid "You can now export your security dashboard to a CSV report."
-msgstr "现在你å¯ä»¥å¯¼å‡ºå®‰å…¨ä»ªè¡¨æ¿åˆ°CSV报告。"
+msgstr "现在你å¯ä»¥å¯¼å‡ºå®‰å…¨ä»ªè¡¨ç›˜åˆ° CSV 报告。"
msgid "You can now submit a merge request to get this change into the original branch."
msgstr "您现在å¯ä»¥æ交åˆå¹¶è¯·æ±‚以将此更改å‘é€åˆ°æºåˆ†æ”¯ã€‚"
@@ -41747,6 +42712,9 @@ msgstr "您一次最多åªèƒ½æ·»åŠ  %{max_contacts} 个è”系人"
msgid "You can only edit files when you are on a branch"
msgstr "åªèƒ½åœ¨åˆ†æ”¯ä¸Šç¼–辑文件"
+msgid "You can only merge once the items above are resolved."
+msgstr "解决以上问题åŽï¼Œæ‚¨æ‰èƒ½åˆå¹¶ã€‚"
+
msgid "You can only transfer the project to namespaces you manage."
msgstr "您åªèƒ½å°†é¡¹ç›®è½¬ç§»åˆ°æ‚¨ç®¡ç†çš„命å空间。"
@@ -41777,6 +42745,9 @@ msgstr "您ä¸èƒ½ %{action} %{state} 用户。"
msgid "You cannot access the raw file. Please wait a minute."
msgstr "您ä¸èƒ½è®¿é—®åŽŸå§‹æ–‡ä»¶ã€‚请ç¨å€™ã€‚"
+msgid "You cannot approve your own deployment."
+msgstr "您ä¸èƒ½æ‰¹å‡†æ‚¨è‡ªå·±çš„部署。"
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr "您ä¸èƒ½å°† replace_ids 与 add_ids 或 remove_ids 结åˆä½¿ç”¨"
@@ -41861,6 +42832,9 @@ msgstr "您没有任何å¯ç”¨çš„项目。"
msgid "You don't have any recent searches"
msgstr "您没有任何近期的æœç´¢"
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr "您无æƒæŸ¥çœ‹æ­¤éƒ¨ç½²ã€‚è”系项目或群组所有者寻求帮助。"
+
msgid "You don't have sufficient permission to perform this action."
msgstr "你没有足够的æƒé™æ¥æ‰§è¡Œæ­¤æ“作。"
@@ -41940,11 +42914,11 @@ msgstr "您没有足够的æƒé™æ¥æ›´æ–°æ­¤HTTP集æˆ"
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr "您没有足够的æƒé™æŸ¥çœ‹æ­¤è½®æ¢çš„ç­æ¬¡"
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
-msgstr "您的活跃用户数超过了您的许å¯è¯æ‰€å…许的数é‡ã€‚在 %{date} 之å‰å¿…须调节您的订阅。è¦å®Œæˆæ­¤è¿‡ç¨‹ï¼Œè¯·å¯¼å‡ºæ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¹¶å°†å…¶é€šè¿‡ç”µå­é‚®ä»¶å‘é€è‡³ %{renewal_service_email}。新的许å¯è¯å°†é€šè¿‡ç”µå­é‚®ä»¶å‘é€åˆ° %{customers_dot} 注册的电å­é‚®ä»¶åœ°å€ã€‚您å¯ä»¥å°†æ­¤è®¸å¯è¯ä¸Šä¼ åˆ°æ‚¨çš„实例。"
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr "您的活跃用户数超过了您的许å¯è¯æ‰€å…许的数é‡ã€‚在 %{date} 之å‰å¿…须调节您的订阅。è¦å®Œæˆæ­¤è¿‡ç¨‹ï¼Œè¯·å¯¼å‡ºæ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¹¶å°†å…¶é€šè¿‡ç”µå­é‚®ä»¶å‘é€è‡³ %{renewal_service_email}。新的许å¯è¯å°†é€šè¿‡ç”µå­é‚®ä»¶å‘é€åˆ° %{customers_dot} 注册的电å­é‚®ä»¶åœ°å€ã€‚您å¯ä»¥å°†æ­¤è®¸å¯è¯æ·»åŠ åˆ°æ‚¨çš„实例。"
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
-msgstr "您的活跃用户数超过了您的许å¯è¯æ‰€å…许的数é‡ï¼Œå¿…须调节您的订阅。è¦å®Œæˆæ­¤è¿‡ç¨‹ï¼Œè¯·å¯¼å‡ºæ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¹¶å°†å…¶é€šè¿‡ç”µå­é‚®ä»¶å‘é€è‡³ %{renewal_service_email}。新的许å¯è¯å°†é€šè¿‡ç”µå­é‚®ä»¶å‘é€åˆ° %{customers_dot} 注册的电å­é‚®ä»¶åœ°å€ã€‚您å¯ä»¥å°†æ­¤è®¸å¯è¯ä¸Šä¼ åˆ°æ‚¨çš„实例。"
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
+msgstr "您的活跃用户数超过了您的许å¯è¯æ‰€å…许的数é‡ï¼Œå¿…须调节您的订阅。è¦å®Œæˆæ­¤è¿‡ç¨‹ï¼Œè¯·å¯¼å‡ºæ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¹¶å°†å…¶é€šè¿‡ç”µå­é‚®ä»¶å‘é€è‡³ %{renewal_service_email}。新的许å¯è¯å°†é€šè¿‡ç”µå­é‚®ä»¶å‘é€åˆ° %{customers_dot} 注册的电å­é‚®ä»¶åœ°å€ã€‚您å¯ä»¥å°†æ­¤è®¸å¯è¯æ·»åŠ åˆ°æ‚¨çš„实例。"
msgid "You have no permissions"
msgstr "没有æƒé™"
@@ -42123,6 +43097,9 @@ msgstr "YouTube"
msgid "YouTube URL or ID"
msgstr "YouTube URL或ID"
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr "您的%{group}æˆå‘˜èµ„格将在%{days}天内到期。"
@@ -42135,6 +43112,9 @@ msgstr "您的 %{plan} 订阅已于 %{expiry_date} 到期"
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr "您的 %{plan} 订阅于 %{expiry_date} 到期"
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr "您的 %{spammable_entity_type} 已被识别为垃圾邮件。请更改内容或解决 reCAPTCHA æ¥ç»§ç»­ã€‚"
+
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 "您的%{strong}%{plan_name}%{strong_close}订阅将于%{strong}%{expires_on}%{strong_close}到期。此åŽï¼Œæ‚¨å°†æ— æ³•åˆ›å»ºè®®é¢˜æˆ–åˆå¹¶è¯·æ±‚,åŒæ—¶ä¹Ÿæ— æ³•è®¿é—®å…¶ä»–众多功能。"
@@ -42388,7 +43368,7 @@ msgid "Your public email will be displayed on your public profile."
msgstr "您的公开电å­é‚®ä»¶å°†æ˜¾ç¤ºåœ¨æ‚¨çš„公开个人资料中。"
msgid "Your request for access could not be processed: %{error_message}"
-msgstr ""
+msgstr "无法处ç†æ‚¨çš„请求:%{error_message}"
msgid "Your request for access has been queued for review."
msgstr "您的访问请求已进入审核队列。"
@@ -42426,8 +43406,8 @@ msgstr "您的订阅已过期ï¼"
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr "您的订阅剩余 %{total_seats_count} 个席ä½ä¸­çš„ %{remaining_seats_count} 个。å³ä½¿æ‚¨è¾¾åˆ°è®¢é˜…的席ä½æ•°é‡ï¼Œæ‚¨ä¹Ÿå¯ä»¥ç»§ç»­æ·»åŠ ç”¨æˆ·ï¼Œç³»ç»Ÿä¼šå‘您收å–超é¢è´¹ç”¨ã€‚"
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
-msgstr "您的订阅现在已过期。若è¦æ›´æ–°ï¼Œè¯·å°†æ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¯¼å‡ºå¹¶å‘é€ç”µå­é‚®ä»¶è‡³ %{renewal_service_email}。新的许å¯è¯å°†å‘é€ç”µå­é‚®ä»¶åˆ°åœ¨ %{customers_dot} 注册的电å­é‚®ä»¶åœ°å€ã€‚ 您å¯ä»¥ä¸Šä¼ æ­¤è®¸å¯è¯åˆ°æ‚¨çš„实例。è¦ä½¿ç”¨æ ‡å‡†ç‰ˆï¼Œè¯·åˆ é™¤æ‚¨å½“å‰çš„许å¯è¯ã€‚"
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
+msgstr "您的订阅现已过期。è¦ç»­è®¢ï¼Œè¯·å¯¼å‡ºæ‚¨çš„许å¯è¯ä½¿ç”¨æ–‡ä»¶å¹¶å°†å…¶é€šè¿‡ç”µå­é‚®ä»¶å‘é€åˆ° %{renewal_service_email}。新的许å¯è¯å°†é€šè¿‡ç”µå­é‚®ä»¶å‘é€åˆ°åœ¨ %{customers_dot}中注册的电å­é‚®ä»¶åœ°å€ã€‚您å¯ä»¥å°†æ­¤è®¸å¯è¯æ·»åŠ åˆ°æ‚¨çš„实例。è¦ä½¿ç”¨å…费版,请删除您当å‰çš„许å¯è¯ã€‚"
msgid "Your subscription will expire in %{remaining_days} day."
msgid_plural "Your subscription will expire in %{remaining_days} days."
@@ -42568,7 +43548,7 @@ msgid "archived:"
msgstr "存档:"
msgid "artifacts"
-msgstr ""
+msgstr "产物"
msgid "assign yourself"
msgstr "分é…给自己"
@@ -42599,7 +43579,7 @@ msgid "branch name"
msgstr "分支å称"
msgid "builds"
-msgstr ""
+msgstr "构建"
msgid "by"
msgstr "æ¥è‡ª"
@@ -42679,6 +43659,10 @@ msgstr "本身ä¸èƒ½è¢«é˜»å¡ž"
msgid "cannot merge"
msgstr "无法åˆå¹¶"
+msgid "change"
+msgid_plural "changes"
+msgstr[0] "å˜æ›´"
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr "%{danger_start}%{degradedNum} é™ä½Ž%{danger_end}ã€%{same_start}%{sameNum} 相åŒ%{same_end} å’Œ %{success_start}%{improvedNum} 改善%{success_end}"
@@ -42773,6 +43757,15 @@ msgstr "检查"
msgid "ciReport|Cluster Image Scanning"
msgstr "集群镜åƒæ‰«æ"
+msgid "ciReport|Code Quality"
+msgstr "Code Quality"
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr "Code Quality 加载结果失败"
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr "æ­£åœ¨è§£æž Code Quality 测试指标结果"
+
msgid "ciReport|Code quality degraded"
msgstr "代ç è´¨é‡ä¸‹é™äº†"
@@ -42851,6 +43844,15 @@ msgstr "IaC 扫æ"
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr "通过创建议题æ¥è°ƒæŸ¥æ­¤æ¼æ´ž"
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr "负载性能"
@@ -42876,9 +43878,15 @@ msgstr "加载代ç è´¨é‡æŠ¥å‘Š"
msgid "ciReport|Manage licenses"
msgstr "管ç†è®¸å¯è¯"
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr "新增"
+msgid "ciReport|No changes to Code Quality."
+msgstr "Code Quality æ— å˜åŒ–。"
+
msgid "ciReport|No changes to code quality"
msgstr "代ç è´¨é‡æ— å˜åŒ–"
@@ -42961,45 +43969,6 @@ msgstr "已关闭"
msgid "closed issue"
msgstr "已关闭议题"
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr "æ¯å½“您或您的团队æˆå‘˜å¯¹æ‚¨çš„项目进行更改时,都会è¿è¡Œä»£ç è´¨é‡ä½œä¸šã€‚ 您å¯ä»¥åœ¨ä½œä¸šæ—¥å¿—中查看代ç è´¨é‡ä½œä¸šçš„结果。"
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr "æ­å–œï¼æ‚¨çš„第一个æµæ°´çº¿æ­£åœ¨è¿è¡Œ %{emojiStart}zap%{emojiEnd}"
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr "知é“了"
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr "让我们从创建一个新的 CI 文件开始。"
-
-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 "ä¸çŸ¥é“如何修å¤å¤±è´¥çš„作业?我们在文档中汇编了一些有关如何对代ç è´¨é‡ä½œä¸šè¿›è¡Œæ•…障排除的技巧。"
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr "阅读文档"
-
-msgid "codeQualityWalkthrough|Something went wrong. %{emojiStart}thinking%{emojiEnd} Let's fix it."
-msgstr "出错了, %{emojiStart}thinking%{emojiEnd} 让我们æ¥ä¿®å¤å®ƒã€‚"
-
-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 "è¦å¼€å§‹å¤„ç†ä»£ç è´¨é‡, 我们首先需è¦ä½¿ç”¨æˆ‘们的代ç ç¼–辑器创建一个新的 CI 文件。 我们在代ç ç¼–辑器中添加了一个代ç è´¨é‡æ¨¡æ¿ï¼Œä»¥å¸®åŠ©æ‚¨å¯åŠ¨ %{emojiStart}wink%{emojiEnd} 。%{lineBreak}在准备就绪时花一些时间查看模æ¿ï¼Œå‡†å¤‡å®ŒæˆåŽï¼Œä½¿ç”¨é¡µé¢åº•éƒ¨çš„ %{strongStart}æ交更改%{strongEnd} 按钮。"
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr "代ç è´¨é‡ä½œä¸šæ•…障排查"
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr "查看日志"
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr "干得好ï¼æ‚¨åˆšåˆšå®žçŽ°äº†ä»£ç è´¨é‡å®¡æŸ¥çš„自动化。 %{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 "您的作业失败了,ä¸ç”¨æ‹…心å‘生这ç§æƒ…况,让我们查看日志,看看如何修å¤å®ƒã€‚"
-
-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 "您的æµæ°´çº¿å¯èƒ½éœ€è¦å‡ åˆ†é’Ÿæ‰èƒ½è¿è¡Œï¼Œå¦‚果您å¯ç”¨äº†ç”µå­é‚®ä»¶é€šçŸ¥ï¼Œæ‚¨å°†æ”¶åˆ°ä¸€å°åŒ…å«æµæ°´çº¿çŠ¶æ€çš„电å­é‚®ä»¶ã€‚"
-
msgid "collect usage information"
msgstr "收集使用信æ¯"
@@ -43018,11 +43987,11 @@ msgstr "å·²æ交"
msgid "compliance violation has already been recorded"
msgstr "è¿è§„行为已被记录"
-msgid "contact with same email already exists in group hierarchy"
-msgstr "群组层次结构中已存在具有相åŒç”µå­é‚®ä»¶çš„è”系人"
+msgid "contacts can only be added to root groups"
+msgstr "è”系人åªèƒ½æ·»åŠ åˆ°æ ¹ç¾¤ç»„"
msgid "container registry images"
-msgstr ""
+msgstr "容器镜åƒåº“é•œåƒ"
msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr "container_nameåªèƒ½åŒ…å«å°å†™å­—æ¯ï¼Œæ•°å­—,'-'å’Œ'.',并且必须以字æ¯å’Œæ•°å­—字符开头和结尾"
@@ -43064,7 +44033,7 @@ msgid "data"
msgstr "æ•°æ®"
msgid "database"
-msgstr ""
+msgstr "æ•°æ®åº“"
msgid "date must not be after 9999-12-31"
msgstr "日期ä¸èƒ½åœ¨9999-12-31之åŽ"
@@ -43122,6 +44091,9 @@ msgstr "符åˆæ¡ä»¶çš„用户"
msgid "email '%{email}' is not a verified email."
msgstr "邮箱“%{email}â€è¿˜æœªè¢«éªŒè¯ã€‚"
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr "å·²å¯ç”¨"
@@ -43177,7 +44149,7 @@ msgid "failed to dismiss associated finding(id=%{finding_id}): %{message}"
msgstr "无法忽略关è”çš„å‘现(id=%{finding_id}): %{message}"
msgid "failed to dismiss finding: %{message}"
-msgstr ""
+msgstr "忽略å‘现失败:%{message}"
msgid "failed to revert associated finding(id=%{finding_id}) to detected"
msgstr "无法将关è”çš„å‘现(id=%{finding_id})æ¢å¤åˆ°ä¸ºæ£€æµ‹åˆ°"
@@ -43333,7 +44305,7 @@ msgid "is not a valid X509 certificate."
msgstr "ä¸æ˜¯æœ‰æ•ˆçš„X509è¯ä¹¦ã€‚"
msgid "is not allowed for sign-up. Please use your regular email address."
-msgstr ""
+msgstr "ä¸å…许注册。请使用您的常规电å­é‚®ä»¶åœ°å€ã€‚"
msgid "is not allowed for this group."
msgstr "在此群组中ä¸è¢«å…许。"
@@ -43345,7 +44317,7 @@ msgid "is not allowed since the group is not top-level group."
msgstr "ä¸å…许,因为该群组ä¸æ˜¯é¡¶çº§ç¾¤ç»„。"
msgid "is not allowed. Please use your regular email address."
-msgstr ""
+msgstr "ä¸å…许。请使用您的常规电å­é‚®ä»¶åœ°å€ã€‚"
msgid "is not allowed. We do not currently support project-level iterations"
msgstr "ä¸è¢«å…许。我们目å‰ä¸æ”¯æŒé¡¹ç›®çº§è¿­ä»£"
@@ -43432,7 +44404,7 @@ msgid "level: %{level}"
msgstr "等级: %{level}"
msgid "lfs objects"
-msgstr ""
+msgstr "LFS 对象"
msgid "limit of %{project_limit} reached"
msgstr "已达到%{project_limit}çš„é™åˆ¶"
@@ -43455,6 +44427,10 @@ msgstr "显示此公å¼å—å¯èƒ½ä¼šå¯¼è‡´æ­¤é¡µé¢å‡ºçŽ°æ€§èƒ½é—®é¢˜"
msgid "math|There was an error rendering this math block"
msgstr "渲染此数学表达å¼æ—¶å‡ºé”™"
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "åˆå¹¶è¯·æ±‚"
@@ -43549,6 +44525,12 @@ msgstr "由您核准"
msgid "mrWidget|Approved by you and others"
msgstr "由您或其他人核准"
+msgid "mrWidget|Assign yourself to these issues"
+msgstr "将这些议题分é…给自己"
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr "将这个议题分é…给自己"
+
msgid "mrWidget|Cancel auto-merge"
msgstr "å–消自动åˆå¹¶"
@@ -43651,7 +44633,7 @@ msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual
msgstr "åˆå¹¶è¢«é˜»æ­¢ï¼šæµæ°´çº¿å¿…é¡»æˆåŠŸã€‚等待手动完æˆæ“作。"
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
-msgstr ""
+msgstr "åˆå¹¶å—阻:æµæ°´çº¿å¿…é¡»æˆåŠŸã€‚推é€ä¸€ä¸ªä¿®å¤å¤±è´¥çš„æ交,或者%{linkStart}了解其它解决方案。%{linkEnd}"
msgid "mrWidget|Merge blocked: this merge request must be approved."
msgstr "åˆå¹¶è¢«é˜»æ­¢ï¼šå¿…须批准此åˆå¹¶è¯·æ±‚。"
@@ -43662,9 +44644,6 @@ msgstr "åˆå¹¶é˜»å¡žï¼šè§£å†³ä¸Šè¿°é—®é¢˜åŽæ‰èƒ½åˆå¹¶ã€‚"
msgid "mrWidget|Merge failed."
msgstr "åˆå¹¶å¤±è´¥ã€‚"
-msgid "mrWidget|Merge locally"
-msgstr "本地åˆå¹¶"
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr "åˆå¹¶ä¸å¯ç”¨ï¼šåˆå¹¶è¯·æ±‚在归档项目上是åªè¯»çš„。"
@@ -43737,6 +44716,9 @@ msgstr "请求åˆå¹¶"
msgid "mrWidget|Resolve conflicts"
msgstr "解决冲çª"
+msgid "mrWidget|Resolve locally"
+msgstr "本地解决"
+
msgid "mrWidget|Revert"
msgstr "还原"
@@ -43857,9 +44839,6 @@ msgstr "my-awesome-group"
msgid "my-channel"
msgstr "我的频é“"
-msgid "n/a"
-msgstr "ä¸é€‚用"
-
msgid "need attention"
msgstr "需è¦å…³æ³¨"
@@ -43920,6 +44899,9 @@ msgstr "å¼€å¯çš„议题"
msgid "or"
msgstr "或"
+msgid "organizations can only be added to root groups"
+msgstr "机构组织åªèƒ½æ·»åŠ åˆ° root 群组"
+
msgid "other card matches"
msgstr "其他å¡ç‰‡åŒ¹é…"
@@ -43928,10 +44910,10 @@ msgid_plural "out of %d total tests"
msgstr[0] "于总计%d个测试中"
msgid "packages"
-msgstr ""
+msgstr "软件包"
msgid "pages"
-msgstr ""
+msgstr "Pages"
msgid "parent"
msgid_plural "parents"
@@ -44005,9 +44987,6 @@ msgstr "项目访问令牌"
msgid "project access tokens"
msgstr "项目访问令牌"
-msgid "project avatar"
-msgstr "项目头åƒ"
-
msgid "project bots cannot be added to other groups / projects"
msgstr "项目机器人ä¸èƒ½æ·»åŠ åˆ°å…¶ä»–群组/项目"
@@ -44079,7 +45058,7 @@ msgid_plural "replies"
msgstr[0] "æ¡å›žå¤"
msgid "repositories"
-msgstr ""
+msgstr "仓库"
msgid "repository:"
msgstr "仓库:"
@@ -44202,16 +45181,13 @@ msgid "tag name"
msgstr "标签å称"
msgid "terraform states"
-msgstr ""
+msgstr "terraform 状æ€"
msgid "the correct format."
msgstr "正确的格å¼ã€‚"
-msgid "the file"
-msgstr "文件"
-
msgid "the following epic(s)"
-msgstr ""
+msgstr "下列å²è¯—"
msgid "the following issue(s)"
msgstr "下列议题"
@@ -44359,5 +45335,5 @@ msgid "{project}"
msgstr "{project}"
msgid "✔"
-msgstr ""
+msgstr "✔"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index 4356c4d81ec..c9eeaf4a13e 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -12,9 +12,9 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: zh-HK\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:41\n"
+"PO-Revision-Date: 2022-04-01 09:17\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -28,15 +28,9 @@ msgstr ""
msgid " Please sign in."
msgstr "請登入您的帳戶"
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr "請嘗試å†%{action}此檔案。"
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " 您需è¦åœ¨ %{grace_period_deadline} 之å‰åŸ·è¡Œæ­¤æ“作。"
@@ -288,6 +282,10 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -300,6 +298,10 @@ msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
msgstr[0] ""
+msgid "%d point"
+msgid_plural "%d points"
+msgstr[0] ""
+
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
msgstr[0] ""
@@ -312,8 +314,8 @@ msgid "%d project selected"
msgid_plural "%d projects selected"
msgstr[0] ""
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
msgstr[0] ""
msgid "%d second"
@@ -392,9 +394,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -617,6 +616,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "將會移除 %{issuableType}ï¼ç¢ºå®šï¼Ÿ"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -695,7 +697,7 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -704,9 +706,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -776,6 +775,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -903,10 +905,17 @@ msgstr ""
msgid "%{start} to %{end}"
msgstr ""
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1189,7 +1198,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1478,9 +1487,18 @@ msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr ""
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr ""
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1673,6 +1691,9 @@ msgstr "關於自動部署"
msgid "About this feature"
msgstr ""
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "濫用報告"
@@ -1703,9 +1724,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr ""
-
msgid "Access expires"
msgstr ""
@@ -1859,6 +1877,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -1916,6 +1937,9 @@ msgstr "增加 Kubernetes å¢é›†"
msgid "Add LICENSE"
msgstr ""
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2039,6 +2063,9 @@ msgstr "ç«‹å³ç•™è¨€"
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2267,6 +2294,9 @@ msgstr ""
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2348,6 +2378,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2360,6 +2393,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2372,6 +2408,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2456,12 +2495,18 @@ msgstr "刪除項目 %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr ""
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2501,6 +2546,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2516,6 +2582,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2531,6 +2600,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2540,9 +2615,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2552,6 +2624,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr ""
@@ -3458,7 +3533,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr ""
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3572,6 +3647,9 @@ msgstr ""
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3626,6 +3704,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "é è¦½ blob 檔案時發生錯誤"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3869,6 +3950,9 @@ msgstr ""
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr ""
@@ -3981,6 +4065,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr ""
@@ -4071,6 +4158,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4549,6 +4639,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr ""
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr ""
@@ -4790,12 +4883,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -4882,6 +4969,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -4912,6 +5002,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -4933,6 +5026,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "八月"
@@ -5293,9 +5434,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr "您的徽章"
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5317,6 +5455,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5407,6 +5548,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5630,6 +5777,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5645,6 +5795,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5654,24 +5807,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5733,6 +5901,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5836,6 +6007,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr "分支已被採å–"
@@ -5995,9 +6169,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr "ç€è¦½ç›®éŒ„"
@@ -6037,6 +6208,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6079,12 +6253,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6097,9 +6277,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6112,6 +6298,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6689,6 +6878,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6719,6 +6911,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -6880,6 +7078,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -6994,6 +7195,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7237,24 +7441,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7312,6 +7504,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7471,6 +7672,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7495,7 +7699,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7510,6 +7714,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7549,22 +7756,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7573,10 +7783,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7588,6 +7816,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7603,10 +7834,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7618,10 +7852,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7636,9 +7867,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7672,13 +7900,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7699,10 +7921,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7714,13 +7933,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7733,9 +7949,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7757,6 +7970,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7799,9 +8015,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -7910,10 +8123,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -7961,16 +8171,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8006,6 +8207,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8015,6 +8219,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8078,9 +8285,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8126,7 +8330,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8219,9 +8423,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8471,12 +8672,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8489,7 +8696,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8730,9 +8937,6 @@ msgstr "æ交"
msgid "CommitMessage|Add %{file_name}"
msgstr "添加 %{file_name}"
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -8859,6 +9063,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -8892,9 +9099,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -8919,6 +9123,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -8928,7 +9135,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -8940,12 +9147,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9054,6 +9273,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9099,6 +9321,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9108,6 +9333,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9177,6 +9405,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9296,9 +9530,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9356,7 +9587,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9450,6 +9681,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9489,6 +9723,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9798,6 +10035,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9834,6 +10074,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9849,9 +10095,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -9969,7 +10212,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10008,9 +10251,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10122,9 +10371,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10149,6 +10395,9 @@ msgstr "建立新標籤"
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10179,9 +10428,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10434,43 +10680,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Contact has been updated"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Create new contact"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Create organization"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Customer Relations Contacts"
-msgstr ""
-
-msgid "Crm|Customer Relations Organizations"
-msgstr ""
-
-msgid "Crm|Default rate (optional)"
-msgstr ""
-
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10485,10 +10713,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10599,19 +10827,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10740,15 +10965,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10799,12 +11042,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10820,10 +11069,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -10970,6 +11219,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11024,9 +11276,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11271,6 +11520,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11400,9 +11652,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11421,9 +11670,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12060,6 +12306,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12121,6 +12394,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12765,6 +13041,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12822,6 +13101,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -12912,6 +13194,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -12957,6 +13242,45 @@ msgstr "截止日期"
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13059,9 +13383,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13386,6 +13707,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13660,7 +13984,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13792,6 +14116,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13807,9 +14134,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -13891,7 +14215,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14263,6 +14590,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14272,6 +14605,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14510,6 +14846,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14522,6 +14861,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14642,6 +14984,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14771,9 +15116,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -14883,6 +15234,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15304,7 +15658,7 @@ msgstr "二月"
msgid "February"
msgstr "二月"
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15445,9 +15799,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15712,9 +16063,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15742,6 +16090,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "從創建議題到部署到生產環境"
@@ -15805,9 +16156,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16357,9 +16705,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16372,6 +16717,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16423,9 +16771,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16651,15 +16996,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16699,6 +17053,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16825,9 +17182,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -16837,6 +17191,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17041,9 +17431,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17446,13 +17833,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17575,6 +17962,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17593,9 +17983,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17716,6 +18103,107 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -17885,6 +18373,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18033,9 +18524,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18111,9 +18599,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18243,6 +18728,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18311,7 +18802,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18341,12 +18832,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18356,9 +18841,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18696,9 +19178,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18777,15 +19256,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19077,6 +19547,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19086,6 +19559,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19143,6 +19625,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19158,6 +19646,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19239,6 +19730,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19260,6 +19754,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19269,6 +19766,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19377,6 +19877,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19576,6 +20082,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19690,6 +20199,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19702,12 +20214,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -19855,9 +20373,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -19873,12 +20388,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -19972,6 +20481,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -19990,6 +20502,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20002,6 +20520,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20194,9 +20715,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20239,7 +20757,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20410,10 +20928,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20428,12 +20949,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20443,6 +20958,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20464,7 +20982,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20482,6 +21006,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20491,10 +21018,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20506,6 +21039,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20518,6 +21054,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20773,9 +21312,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20788,6 +21324,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -20851,6 +21390,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -20860,6 +21402,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -20887,15 +21435,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -20911,9 +21468,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -20923,6 +21498,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -20947,6 +21525,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21305,6 +21886,9 @@ msgstr ""
msgid "Last updated"
msgstr "最後更新"
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21413,6 +21997,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21554,6 +22144,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21566,6 +22159,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21584,6 +22180,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21611,9 +22210,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21638,6 +22234,10 @@ msgid "LicenseCompliance|License Compliance detected %d new license and policy v
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
msgstr[0] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21647,6 +22247,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21662,6 +22268,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -21851,9 +22463,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22127,6 +22736,9 @@ msgstr "管ç†ç¾¤çµ„標籤"
msgid "Manage labels"
msgstr "管ç†æ¨™ç±¤"
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22160,6 +22772,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22322,6 +22937,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22442,9 +23060,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22466,6 +23081,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22699,9 +23320,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22738,7 +23356,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22813,7 +23431,7 @@ msgstr "åˆä½µè«‹æ±‚"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23366,9 +23984,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23487,6 +24102,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr "刪除里程碑"
@@ -23505,6 +24123,9 @@ msgstr "找ä¸åˆ°é‡Œç¨‹ç¢‘ %{milestoneTitle}"
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23523,12 +24144,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr "這動作無法復原。"
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23646,6 +24276,9 @@ msgstr ""
msgid "Months"
msgstr "月"
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23742,16 +24375,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23857,6 +24490,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -23932,6 +24592,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24118,9 +24781,6 @@ msgstr ""
msgid "New"
msgstr ""
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24212,6 +24872,9 @@ msgstr "新增目錄"
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24287,6 +24950,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24302,9 +24968,6 @@ msgstr ""
msgid "New schedule"
msgstr "新增计划"
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr "新代碼片段"
@@ -24353,6 +25016,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24401,6 +25067,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24428,12 +25097,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24512,9 +25175,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24536,7 +25196,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24569,9 +25229,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr "沒有è¦é¡¯ç¤ºçš„里程碑"
-
msgid "No namespace"
msgstr ""
@@ -24653,6 +25310,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24807,6 +25467,9 @@ msgstr "åªé¡¯ç¤ºæ­·å²ç´€éŒ„"
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25243,10 +25906,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25391,6 +26054,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25409,9 +26075,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25442,10 +26105,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25460,9 +26123,6 @@ msgstr ""
msgid "Open raw"
msgstr "打開原文件"
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25490,6 +26150,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25631,6 +26294,9 @@ msgstr ""
msgid "Owner"
msgstr "所有者"
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26397,6 +27063,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26673,6 +27342,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr "æµæ°´ç·š"
@@ -26682,10 +27354,13 @@ msgstr "æµæ°´ç·šåœ–表"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
+msgstr ""
+
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26733,7 +27408,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26742,13 +27417,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26757,7 +27432,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26775,6 +27450,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26787,9 +27465,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -26844,24 +27528,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -26919,9 +27597,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -26937,9 +27612,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27273,9 +27945,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27330,7 +27999,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27375,7 +28044,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27483,6 +28152,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27792,6 +28464,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -27813,9 +28488,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -27852,6 +28524,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -27957,6 +28632,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28038,9 +28716,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28545,7 +29220,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28644,6 +29319,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -28815,6 +29493,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -28878,6 +29559,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -28896,9 +29580,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29043,6 +29724,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29652,7 +30339,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30082,9 +30772,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30094,9 +30790,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30326,6 +31019,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30536,7 +31232,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30613,12 +31312,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30631,6 +31336,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30646,9 +31357,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31156,7 +31873,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31217,9 +31934,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31271,10 +31985,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31295,6 +32009,20 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31304,7 +32032,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31331,9 +32059,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31346,12 +32086,19 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31361,6 +32108,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31370,18 +32120,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31403,25 +32147,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31430,15 +32180,28 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31472,9 +32235,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31487,21 +32256,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
+msgstr ""
+
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31511,7 +32310,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31532,6 +32331,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31541,16 +32343,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31568,7 +32373,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31586,7 +32391,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31595,9 +32400,6 @@ 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 ""
@@ -31631,9 +32433,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31748,10 +32547,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -31943,6 +32742,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32056,6 +32858,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32080,6 +32885,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32206,16 +33020,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32272,6 +33089,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32287,6 +33110,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32302,12 +33131,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32317,6 +33155,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32329,9 +33170,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32380,6 +33233,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32398,12 +33254,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32422,6 +33287,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32431,10 +33299,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32458,6 +33329,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32542,6 +33422,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32683,6 +33566,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32707,7 +33593,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32719,16 +33605,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -32788,6 +33677,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -32800,15 +33692,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -32845,15 +33740,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -32992,6 +33884,9 @@ msgstr ""
msgid "Select target branch"
msgstr "é¸æ“‡ç›®æ¨™åˆ†æ”¯"
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33328,6 +34223,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33373,6 +34271,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33418,9 +34319,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33674,6 +34572,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -33840,6 +34741,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34011,6 +34915,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34020,6 +34927,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34059,9 +34969,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34194,9 +35101,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34620,6 +35524,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34764,6 +35671,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -34836,9 +35746,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -34887,6 +35794,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35052,10 +35962,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35436,8 +36346,9 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35580,12 +36491,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35742,6 +36647,12 @@ msgstr ""
msgid "Target branch"
msgstr "目標分支"
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35775,9 +36686,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36181,9 +37089,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36214,6 +37119,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36226,6 +37134,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36247,12 +37158,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36545,6 +37462,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36554,6 +37474,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36575,6 +37501,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36587,6 +37516,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -36872,9 +37804,6 @@ 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 ""
@@ -37016,6 +37945,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37028,7 +37960,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37055,7 +37987,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37064,7 +37996,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37151,6 +38083,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37178,6 +38116,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37304,9 +38245,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37544,6 +38491,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38014,6 +38964,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38095,6 +39048,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38113,7 +39069,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38263,9 +39219,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38311,6 +39264,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38404,6 +39360,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38593,6 +39552,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -38797,6 +39759,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -38833,6 +39798,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -38959,6 +39927,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39139,9 +40110,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr "上傳新文件"
@@ -39160,9 +40128,6 @@ msgstr "上傳文件"
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39172,6 +40137,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr "點擊上傳"
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39229,7 +40197,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39466,6 +40434,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39475,6 +40446,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40279,9 +41253,6 @@ msgstr "檢視已å–代檔案 @ "
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40306,6 +41277,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40411,9 +41385,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40435,6 +41406,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40555,6 +41529,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40651,9 +41628,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40699,6 +41673,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40720,6 +41697,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41020,6 +42000,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41065,9 +42048,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41110,13 +42090,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41132,6 +42112,9 @@ msgstr[0] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41279,9 +42262,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41306,12 +42286,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41324,18 +42298,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41348,18 +42310,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41435,6 +42388,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41444,6 +42400,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41654,6 +42613,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41747,6 +42712,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -41777,6 +42745,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -41861,6 +42832,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -41940,10 +42914,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42123,6 +43097,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42135,6 +43112,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42426,7 +43406,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42679,6 +43659,10 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -42773,6 +43757,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -42851,6 +43844,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -42876,9 +43878,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr "程å¼ç¢¼å“質沒有變更"
@@ -42961,45 +43969,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43018,7 +43987,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43122,6 +44091,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43455,6 +44427,10 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43549,6 +44525,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43662,9 +44644,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43737,6 +44716,9 @@ msgstr "請求åˆä½µ"
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -43857,9 +44839,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr ""
-
msgid "need attention"
msgstr ""
@@ -43920,6 +44899,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44005,9 +44987,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44207,9 +45186,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index a55faa75002..4524e6d60ed 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -12,31 +12,25 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Project-ID: 288872\n"
"X-Crowdin-Language: zh-TW\n"
-"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-03-01 20:36\n"
+"PO-Revision-Date: 2022-04-01 09:11\n"
msgid " %{start} to %{end}"
-msgstr ""
+msgstr " %{start} 到 %{end}"
msgid " (from %{timeoutSource})"
msgstr " (來自 %{timeoutSource})"
msgid " Collected %{time}"
-msgstr ""
+msgstr " 已收集 %{time}"
msgid " Please sign in."
msgstr " 請登入。"
-msgid " Target Path"
-msgstr ""
-
msgid " Try to %{action} this file again."
msgstr " è«‹å†æ¬¡ %{action} 此檔案。"
-msgid " Type"
-msgstr ""
-
msgid " You need to do this before %{grace_period_deadline}."
msgstr " 您需è¦åœ¨ %{grace_period_deadline} 之å‰åŸ·è¡Œæ­¤å‹•ä½œã€‚"
@@ -50,19 +44,19 @@ msgid " or "
msgstr " 或 "
msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
-msgstr ""
+msgstr " 或 %{emphasisStart}ï¼åˆä½µè«‹æ±‚ID%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
msgstr ""
msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
-msgstr ""
+msgstr " 或 %{emphasisStart}&epic id%{emphasisEnd}"
msgid " or references (e.g. path/to/project!merge_request_id)"
msgstr " 或引用 (例如:專案/路徑!åˆä½µè«‹æ±‚_ID)"
msgid " reacted with :%{name}:"
-msgstr ""
+msgstr " 回應 :%{name}:"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "「%{ref}ã€ä¸Šæ²’有「%{path}ã€"
@@ -71,30 +65,30 @@ msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit
msgstr ""
msgid "#%{issueIid} (closed)"
-msgstr ""
+msgstr "#%{issueIid}(已關閉)"
msgid "#general, #development"
-msgstr ""
+msgstr "#一般, #開發"
msgid "%d Alert"
msgid_plural "%d Alerts"
-msgstr[0] ""
+msgstr[0] "%d 則警示"
msgid "%d Alert:"
msgid_plural "%d Alerts:"
-msgstr[0] ""
+msgstr[0] "%d 則警示:"
msgid "%d Approval"
msgid_plural "%d Approvals"
-msgstr[0] ""
+msgstr[0] "%d ä½æ ¸å‡†è€…"
msgid "%d Module"
msgid_plural "%d Modules"
-msgstr[0] ""
+msgstr[0] "%d個模組"
msgid "%d Other"
msgid_plural "%d Others"
-msgstr[0] ""
+msgstr[0] "%d 其他"
msgid "%d Package"
msgid_plural "%d Packages"
@@ -102,11 +96,11 @@ msgstr[0] ""
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
-msgstr[0] ""
+msgstr[0] "%d 掃æ的網å€"
msgid "%d URL scanned"
msgid_plural "%d URLs scanned"
-msgstr[0] ""
+msgstr[0] "已掃æ %d 個網å€"
msgid "%d additional approver"
msgid_plural "%d additional approvers"
@@ -126,11 +120,11 @@ msgstr[0] ""
msgid "%d approver"
msgid_plural "%d approvers"
-msgstr[0] ""
+msgstr[0] "%d ä½æ ¸å‡†è€…"
msgid "%d approver (you've approved)"
msgid_plural "%d approvers (you've approved)"
-msgstr[0] ""
+msgstr[0] "%d ä½æ ¸å‡†è€… (你已批准)"
msgid "%d assigned issue"
msgid_plural "%d assigned issues"
@@ -138,19 +132,19 @@ msgstr[0] ""
msgid "%d changed file"
msgid_plural "%d changed files"
-msgstr[0] ""
+msgstr[0] "%d 個已變更檔案"
msgid "%d character remaining"
msgid_plural "%d characters remaining"
-msgstr[0] ""
+msgstr[0] "剩下 %d 個字元"
msgid "%d child epic"
msgid_plural "%d child epics"
-msgstr[0] ""
+msgstr[0] "%d 個å­å²è©©"
msgid "%d code quality issue"
msgid_plural "%d code quality issues"
-msgstr[0] ""
+msgstr[0] "%d 個程å¼ç¢¼å“質å•é¡Œ"
msgid "%d comment"
msgid_plural "%d comments"
@@ -158,11 +152,11 @@ msgstr[0] "%d 則留言"
msgid "%d comment on this commit"
msgid_plural "%d comments on this commit"
-msgstr[0] ""
+msgstr[0] "此更動有 %d 個留言"
msgid "%d commenter"
msgid_plural "%d commenters"
-msgstr[0] ""
+msgstr[0] "%d ä½è©•è«–者"
msgid "%d commit"
msgid_plural "%d commits"
@@ -170,7 +164,7 @@ msgstr[0] "%d 次æ交"
msgid "%d commit author"
msgid_plural "%d commit authors"
-msgstr[0] ""
+msgstr[0] "%d ä½æ交作者"
msgid "%d commit behind"
msgid_plural "%d commits behind"
@@ -198,11 +192,11 @@ msgstr[0] ""
msgid "%d error"
msgid_plural "%d errors"
-msgstr[0] ""
+msgstr[0] "%d 個錯誤"
msgid "%d error found:"
msgid_plural "%d errors found:"
-msgstr[0] ""
+msgstr[0] "ç™¼ç¾ %d 個錯誤:"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -210,7 +204,7 @@ msgstr[0] "%d 個匯出工具"
msgid "%d failed"
msgid_plural "%d failed"
-msgstr[0] ""
+msgstr[0] "%d 次失敗"
msgid "%d failed security job"
msgid_plural "%d failed security jobs"
@@ -218,7 +212,7 @@ msgstr[0] ""
msgid "%d file"
msgid_plural "%d files"
-msgstr[0] ""
+msgstr[0] "%d 個檔案"
msgid "%d fixed test result"
msgid_plural "%d fixed test results"
@@ -226,7 +220,7 @@ msgstr[0] "%d 個確定的測試çµæžœ"
msgid "%d fork"
msgid_plural "%d forks"
-msgstr[0] ""
+msgstr[0] "%d 個分支"
msgid "%d group"
msgid_plural "%d groups"
@@ -234,11 +228,11 @@ msgstr[0] ""
msgid "%d group selected"
msgid_plural "%d groups selected"
-msgstr[0] ""
+msgstr[0] "é¸å–了 %d 個群組"
msgid "%d hour"
msgid_plural "%d hours"
-msgstr[0] ""
+msgstr[0] "%d å°æ™‚"
msgid "%d inaccessible merge request"
msgid_plural "%d inaccessible merge requests"
@@ -288,21 +282,29 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] "還有 %d 則留言"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d open issue"
msgid_plural "%d open issues"
-msgstr[0] ""
+msgstr[0] "%d 個開放議題"
msgid "%d pending comment"
msgid_plural "%d pending comments"
-msgstr[0] ""
+msgstr[0] "%d 待處ç†è©•è«–"
msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
+msgstr[0] "%d 項個人專案將會永久移除,無法復原。"
+
+msgid "%d point"
+msgid_plural "%d points"
msgstr[0] ""
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
-msgstr[0] ""
+msgstr[0] "%d 個先å‰åˆä½µçš„æ交"
msgid "%d project"
msgid_plural "%d projects"
@@ -310,11 +312,11 @@ msgstr[0] "%d 個專案"
msgid "%d project selected"
msgid_plural "%d projects selected"
-msgstr[0] ""
+msgstr[0] "é¸æ“‡äº†%d 個專案"
-msgid "%d request with warnings"
-msgid_plural "%d requests with warnings"
-msgstr[0] "%d 個有警告的請求"
+msgid "%d removed license"
+msgid_plural "%d removed licenses"
+msgstr[0] ""
msgid "%d second"
msgid_plural "%d seconds"
@@ -322,7 +324,7 @@ msgstr[0] "%d秒"
msgid "%d shard selected"
msgid_plural "%d shards selected"
-msgstr[0] ""
+msgstr[0] "%d 個檔案已é¸å–"
msgid "%d star"
msgid_plural "%d stars"
@@ -392,9 +394,6 @@ msgstr ""
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 ""
-
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -617,6 +616,9 @@ msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} 將被刪除ï¼æ‚¨ç¢ºå®šå—Žï¼Ÿ"
+msgid "%{issuable}(s) already assigned"
+msgstr ""
+
msgid "%{issueType} actions"
msgstr ""
@@ -695,7 +697,7 @@ msgstr "由於分å‰çš„æºé …ç›®å¯è¦‹æ€§è¼ƒä½Žï¼Œå› æ­¤ä¸å…許使用 %{level_
msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about roles."
+msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -704,9 +706,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr ""
-msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
@@ -776,6 +775,9 @@ msgstr ""
msgid "%{name}, confirm your email address now!"
msgstr ""
+msgid "%{name}: %{resultsString}"
+msgstr ""
+
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
msgstr[0] ""
@@ -903,10 +905,17 @@ msgstr "%{spanStart}æ–¼%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
msgstr "%{start} 到 %{end}"
+msgid "%{strongOpen}%{errors}%{strongClose} point"
+msgid_plural "%{strongOpen}%{errors}%{strongClose} points"
+msgstr[0] ""
+
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}"
+msgid "%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer."
+msgstr ""
+
+msgid "%{strongStart}Tip:%{strongEnd} You can also check out merge requests locally. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
@@ -1189,7 +1198,7 @@ msgstr ""
msgid "+%{tags} more"
msgstr ""
-msgid ", and "
+msgid ", "
msgstr ""
msgid ", or "
@@ -1478,9 +1487,18 @@ msgstr "%{name} 的新版本 %{tag} å·²ç¶“ç™¼å¸ƒã€‚è«‹å­˜å– %{release_link_star
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
msgstr "%{name} 的新版本 %{tag} 已經發布。請存å–發布版é é¢äº†è§£æ›´å¤šè³‡è¨Šã€‚"
+msgid "A new email address has been added to your GitLab account: %{email}"
+msgstr ""
+
msgid "A new impersonation token has been created."
msgstr "已建立新的身份模擬權æ–。"
+msgid "A new personal access token has been created"
+msgstr ""
+
+msgid "A new personal access token, named %{token_name}, has been created."
+msgstr ""
+
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
@@ -1673,6 +1691,9 @@ msgstr "關於自動部署"
msgid "About this feature"
msgstr "關於此功能"
+msgid "About your company"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "濫用報告"
@@ -1703,9 +1724,6 @@ msgstr ""
msgid "Access denied: %{error}"
msgstr ""
-msgid "Access expiration date"
-msgstr "å­˜å–éŽæœŸæ™‚é–“"
-
msgid "Access expires"
msgstr ""
@@ -1859,6 +1877,9 @@ msgstr ""
msgid "AccountValidation|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Acknowledge"
+msgstr ""
+
msgid "Action"
msgstr ""
@@ -1916,6 +1937,9 @@ msgstr "加入 Kubernetes å¢é›†"
msgid "Add LICENSE"
msgstr "加入授權æ¢æ¬¾"
+msgid "Add License"
+msgstr ""
+
msgid "Add New Site"
msgstr ""
@@ -2039,6 +2063,9 @@ msgstr "ç«‹å³åŠ å…¥ç•™è¨€"
msgid "Add comment to design"
msgstr ""
+msgid "Add comment..."
+msgstr ""
+
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
@@ -2267,6 +2294,9 @@ msgstr "å‘å²è©©åŠ å…¥è­°é¡Œã€‚"
msgid "Adds email participant(s)."
msgstr ""
+msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was created from"
+msgstr ""
+
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2348,6 +2378,9 @@ msgstr ""
msgid "AdminArea|Included Free in license"
msgstr ""
+msgid "AdminArea|Instance OAuth applications"
+msgstr ""
+
msgid "AdminArea|Latest groups"
msgstr ""
@@ -2360,6 +2393,9 @@ msgstr ""
msgid "AdminArea|Maintainer"
msgstr ""
+msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
+msgstr ""
+
msgid "AdminArea|Minimal access"
msgstr ""
@@ -2372,6 +2408,9 @@ msgstr ""
msgid "AdminArea|New user"
msgstr ""
+msgid "AdminArea|No applications found"
+msgstr ""
+
msgid "AdminArea|Owner"
msgstr ""
@@ -2456,12 +2495,18 @@ msgstr "刪除專案 %{projectName}?"
msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab instance using this email address. You will receive emails to warn of expiring certificates. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Affects all new and existing groups."
+msgstr ""
+
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
msgstr ""
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps 網域"
+msgid "AdminSettings|CI/CD limits"
+msgstr ""
+
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
@@ -2501,6 +2546,27 @@ msgstr ""
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
+msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of active pipelines per project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of jobs in a single pipeline"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline schedules"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per group"
+msgstr ""
+
+msgid "AdminSettings|Maximum number of runners registered per project"
+msgstr ""
+
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr ""
@@ -2516,6 +2582,9 @@ msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr "強制æµæ°´ç·šè¨­å®š"
+msgid "AdminSettings|Save %{name} limits"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2531,6 +2600,12 @@ msgstr ""
msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
+msgid "AdminSettings|Set limit to 0 to disable it."
+msgstr ""
+
+msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -2540,9 +2615,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
-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 ""
@@ -2552,6 +2624,9 @@ msgstr ""
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
+msgid "AdminSettings|Total number of jobs in currently active pipelines"
+msgstr ""
+
msgid "AdminStatistics|Active Users"
msgstr "æ´»èºä½¿ç”¨è€…"
@@ -3458,7 +3533,7 @@ msgstr ""
msgid "Allow only the selected protocols to be used for Git access."
msgstr "僅å…許é¸å–之用於 Git å­˜å–的通訊å”定。"
-msgid "Allow owners to manage default branch protection per group"
+msgid "Allow owners to manage default branch protection per group."
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
@@ -3572,6 +3647,9 @@ msgstr "Amazon 身份驗證未%{link_start}正確設定%{link_end}。如需使ç”
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
+msgid "An Administrator has set the maximum expiration date to %{maxDate}. %{helpLinkStart}Learn more%{helpLinkEnd}."
+msgstr ""
+
msgid "An Enterprise User GitLab account has been created for you by your organization:"
msgstr ""
@@ -3626,6 +3704,9 @@ msgstr ""
msgid "An error occurred previewing the blob"
msgstr "é è¦½ blob 時發生錯誤"
+msgid "An error occurred when loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "An error occurred when updating the title"
msgstr ""
@@ -3869,6 +3950,9 @@ msgstr "解æžæœ€è¿‘æœå°‹æ™‚發生錯誤"
msgid "An error occurred while parsing the file."
msgstr ""
+msgid "An error occurred while pasting text in the editor. Please try again."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "移除å²è©©æ™‚發生錯誤。"
@@ -3981,6 +4065,9 @@ msgstr ""
msgid "An unauthenticated user"
msgstr ""
+msgid "An unexpected error occurred"
+msgstr ""
+
msgid "An unexpected error occurred while checking the project environment."
msgstr "檢查專案環境時發生æ„外錯誤。"
@@ -4071,6 +4158,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "Anyone can register for an account."
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4549,6 +4639,9 @@ msgstr ""
msgid "Are you sure that you want to archive this project?"
msgstr "確定è¦æ­¸æª”此專案嗎?"
+msgid "Are you sure that you want to destroy %{application}"
+msgstr ""
+
msgid "Are you sure that you want to unarchive this project?"
msgstr "確定è¦å–消歸檔此專案嗎?"
@@ -4790,12 +4883,6 @@ msgstr ""
msgid "Assign to me"
msgstr ""
-msgid "Assign yourself to these issues"
-msgstr ""
-
-msgid "Assign yourself to this issue"
-msgstr ""
-
msgid "Assigned %{assignee_users_sentence}."
msgstr ""
@@ -4882,6 +4969,9 @@ msgstr ""
msgid "Attention"
msgstr ""
+msgid "Attention requested"
+msgstr ""
+
msgid "Audit Events"
msgstr ""
@@ -4912,6 +5002,9 @@ msgstr ""
msgid "AuditLogs|IP Address"
msgstr ""
+msgid "AuditLogs|Log"
+msgstr ""
+
msgid "AuditLogs|Member Events"
msgstr ""
@@ -4933,6 +5026,54 @@ msgstr ""
msgid "AuditLogs|User Events"
msgstr ""
+msgid "AuditStreams|Active"
+msgstr ""
+
+msgid "AuditStreams|Add an HTTP endpoint to manage audit logs in third-party systems."
+msgstr ""
+
+msgid "AuditStreams|Add external stream destination"
+msgstr ""
+
+msgid "AuditStreams|Add stream"
+msgstr ""
+
+msgid "AuditStreams|An error occurred when creating external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when deleting external audit event stream destination. Please try it again."
+msgstr ""
+
+msgid "AuditStreams|An error occurred when fetching external audit event streams. Please try it again"
+msgstr ""
+
+msgid "AuditStreams|Cancel editing"
+msgstr ""
+
+msgid "AuditStreams|Delete %{link}"
+msgstr ""
+
+msgid "AuditStreams|Destination URL"
+msgstr ""
+
+msgid "AuditStreams|Destinations receive all audit event data"
+msgstr ""
+
+msgid "AuditStreams|Setup streaming for audit events"
+msgstr ""
+
+msgid "AuditStreams|Stream count icon"
+msgstr ""
+
+msgid "AuditStreams|Streams"
+msgstr ""
+
+msgid "AuditStreams|This could include sensitive information. Make sure you trust the destination endpoint."
+msgstr ""
+
+msgid "AuditStreams|This is great for keeping everything one place."
+msgstr ""
+
msgid "Aug"
msgstr "8月"
@@ -5293,9 +5434,6 @@ msgstr ""
msgid "Badges|Your badges"
msgstr ""
-msgid "Balsamiq file could not be loaded."
-msgstr ""
-
msgid "BambooService|Atlassian Bamboo"
msgstr ""
@@ -5317,6 +5455,9 @@ msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
+msgid "Banner message"
+msgstr ""
+
msgid "Based on"
msgstr ""
@@ -5407,6 +5548,12 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
+msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
+msgstr ""
+
+msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+msgstr ""
+
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -5630,6 +5777,9 @@ msgstr ""
msgid "BoardNewIssue|Select a project"
msgstr ""
+msgid "BoardScope|An error occurred while getting iterations. Please try again."
+msgstr ""
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5645,6 +5795,9 @@ msgstr ""
msgid "BoardScope|Any assignee"
msgstr ""
+msgid "BoardScope|Any iteration"
+msgstr ""
+
msgid "BoardScope|Any label"
msgstr ""
@@ -5654,24 +5807,39 @@ msgstr ""
msgid "BoardScope|Choose labels"
msgstr ""
+msgid "BoardScope|Current iteration"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
+msgid "BoardScope|Iteration"
+msgstr ""
+
msgid "BoardScope|Labels"
msgstr ""
msgid "BoardScope|Milestone"
msgstr ""
+msgid "BoardScope|No iteration"
+msgstr ""
+
msgid "BoardScope|No milestone"
msgstr ""
+msgid "BoardScope|Search iterations"
+msgstr ""
+
msgid "BoardScope|Search milestones"
msgstr ""
msgid "BoardScope|Select assignee"
msgstr ""
+msgid "BoardScope|Select iteration"
+msgstr ""
+
msgid "BoardScope|Select labels"
msgstr ""
@@ -5733,6 +5901,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
msgstr ""
+msgid "Boards|An error occurred while fetching the board. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while generating lists. Please reload the page."
msgstr ""
@@ -5836,6 +6007,9 @@ msgstr ""
msgid "Branch changed"
msgstr ""
+msgid "Branch has been updated since the merge was requested."
+msgstr ""
+
msgid "Branch is already taken"
msgstr ""
@@ -5995,9 +6169,6 @@ msgstr ""
msgid "Broadcast Messages"
msgstr ""
-msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
-
msgid "Browse Directory"
msgstr ""
@@ -6037,6 +6208,9 @@ msgstr ""
msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
+msgid "BulkImport|Destination"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6079,12 +6253,18 @@ msgstr ""
msgid "BulkImport|New group"
msgstr ""
+msgid "BulkImport|No additional information provided."
+msgstr ""
+
msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
msgstr ""
+msgid "BulkImport|Project import history"
+msgstr ""
+
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6097,9 +6277,15 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source"
+msgstr ""
+
msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|Template / File-based import / GitLab Migration"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6112,6 +6298,9 @@ msgstr ""
msgid "BulkImport|Your imported groups will appear here."
msgstr ""
+msgid "BulkImport|Your imported projects will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6689,6 +6878,9 @@ msgstr ""
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
msgstr ""
+msgid "Changed"
+msgstr ""
+
msgid "Changed assignee(s)."
msgstr ""
@@ -6719,6 +6911,12 @@ msgstr ""
msgid "Changing any setting here requires an application restart"
msgstr ""
+msgid "Characters left"
+msgstr ""
+
+msgid "Characters over limit"
+msgstr ""
+
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
msgstr ""
@@ -6880,6 +7078,9 @@ msgstr ""
msgid "Checkout|CI minutes"
msgstr ""
+msgid "Checkout|Calculating your subscription..."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -6994,6 +7195,9 @@ msgstr ""
msgid "Checkout|Tax"
msgstr ""
+msgid "Checkout|This number must be %{minimumNumberOfUsers} (your seats in use) or more."
+msgstr ""
+
msgid "Checkout|Total"
msgstr ""
@@ -7237,24 +7441,12 @@ msgstr ""
msgid "CiVariable|Create wildcard"
msgstr ""
-msgid "CiVariable|Masked"
-msgstr ""
-
msgid "CiVariable|New environment"
msgstr ""
-msgid "CiVariable|Protected"
-msgstr ""
-
msgid "CiVariable|Search environments"
msgstr ""
-msgid "CiVariable|Toggle masked"
-msgstr ""
-
-msgid "CiVariable|Toggle protected"
-msgstr ""
-
msgid "Classification Label (optional)"
msgstr ""
@@ -7312,6 +7504,15 @@ msgstr ""
msgid "Clear templates search input"
msgstr ""
+msgid "Clear this checkbox to use a personal access token instead."
+msgstr ""
+
+msgid "Clear this checkbox to use a personal access token or LDAP password instead."
+msgstr ""
+
+msgid "Clear this checkbox to use an external authentication provider instead."
+msgstr ""
+
msgid "Clear weight"
msgstr ""
@@ -7471,6 +7672,9 @@ msgstr ""
msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr ""
+msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
+msgstr ""
+
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
@@ -7495,7 +7699,7 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
-msgid "ClusterAgents|Actions"
+msgid "ClusterAgents|Add an agent configuration file to %{linkStart}this repository%{linkEnd} and select it, or create a new one to register with GitLab:"
msgstr ""
msgid "ClusterAgents|Advanced installation methods"
@@ -7510,6 +7714,9 @@ msgstr ""
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr ""
+msgid "ClusterAgents|Agent access token:"
+msgstr ""
+
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
@@ -7549,22 +7756,25 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
-msgid "ClusterAgents|Connect a cluster through an agent"
+msgid "ClusterAgents|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
+msgid "ClusterAgents|Connect a cluster"
msgstr ""
-msgid "ClusterAgents|Connect with a certificate"
+msgid "ClusterAgents|Connect a cluster (agent)"
msgstr ""
-msgid "ClusterAgents|Connect with an agent"
+msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect with the GitLab Agent"
+msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect your cluster through an agent"
+msgid "ClusterAgents|Connect existing cluster"
+msgstr ""
+
+msgid "ClusterAgents|Connect with the GitLab Agent"
msgstr ""
msgid "ClusterAgents|Connected"
@@ -7573,10 +7783,28 @@ msgstr ""
msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy command"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
-msgid "ClusterAgents|Create a new cluster"
+msgid "ClusterAgents|Create a cluster"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create a cluster (deprecated)"
+msgstr ""
+
+msgid "ClusterAgents|Create agent access token"
+msgstr ""
+
+msgid "ClusterAgents|Create agent: %{searchTerm}"
+msgstr ""
+
+msgid "ClusterAgents|Create token"
msgstr ""
msgid "ClusterAgents|Created by"
@@ -7588,6 +7816,9 @@ msgstr ""
msgid "ClusterAgents|Date created"
msgstr ""
+msgid "ClusterAgents|Default configuration"
+msgstr ""
+
msgid "ClusterAgents|Delete"
msgstr ""
@@ -7603,10 +7834,13 @@ msgstr ""
msgid "ClusterAgents|Event occurred"
msgstr ""
+msgid "ClusterAgents|Failed to create a token"
+msgstr ""
+
msgid "ClusterAgents|Failed to register an agent"
msgstr ""
-msgid "ClusterAgents|For the advanced installation method %{linkStart}see the documentation%{linkEnd}."
+msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
msgstr ""
msgid "ClusterAgents|GitLab Agent"
@@ -7618,10 +7852,7 @@ msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr ""
-msgid "ClusterAgents|Go to the repository files"
-msgstr ""
-
-msgid "ClusterAgents|How to register an agent?"
+msgid "ClusterAgents|How do I register an agent?"
msgstr ""
msgid "ClusterAgents|How to update an agent?"
@@ -7636,9 +7867,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Learn how to create an agent access token"
-msgstr ""
-
msgid "ClusterAgents|Learn how to troubleshoot"
msgstr ""
@@ -7672,13 +7900,7 @@ msgstr ""
msgid "ClusterAgents|Register"
msgstr ""
-msgid "ClusterAgents|Register an agent to generate a token that will be used to install the agent on your cluster in the next step."
-msgstr ""
-
-msgid "ClusterAgents|Registering Agent"
-msgstr ""
-
-msgid "ClusterAgents|Registration token"
+msgid "ClusterAgents|Registering agent"
msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
@@ -7699,10 +7921,7 @@ msgstr ""
msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
msgstr ""
-msgid "ClusterAgents|Select an agent"
-msgstr ""
-
-msgid "ClusterAgents|Select an agent to register with GitLab"
+msgid "ClusterAgents|Select an agent or enter a name to create new"
msgstr ""
msgid "ClusterAgents|Tell us what you think"
@@ -7714,13 +7933,10 @@ msgstr ""
msgid "ClusterAgents|The agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
-msgstr ""
-
-msgid "ClusterAgents|The recommended installation method includes the token. If you want to follow the advanced installation method provided in the docs, make sure you save the token value before you close this window."
+msgid "ClusterAgents|The agent uses the token to connect with GitLab."
msgstr ""
-msgid "ClusterAgents|The registration token will be used to connect the agent on your cluster to GitLab. %{linkStart}What are registration tokens?%{linkEnd}"
+msgid "ClusterAgents|The agent version do not match each other across your cluster's pods. This can happen when a new agent version was just deployed and Kubernetes is shutting down the old pods."
msgstr ""
msgid "ClusterAgents|There's no activity from the past day"
@@ -7733,9 +7949,6 @@ msgstr ""
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr ""
-msgid "ClusterAgents|To install a new agent, first add the agent's configuration file to this repository. %{linkStart}Learn more about installing GitLab Agent.%{linkEnd}"
-msgstr ""
-
msgid "ClusterAgents|Token created by %{userName}"
msgstr ""
@@ -7757,6 +7970,9 @@ msgstr ""
msgid "ClusterAgents|What is GitLab Agent activity?"
msgstr ""
+msgid "ClusterAgents|What is default configuration?"
+msgstr ""
+
msgid "ClusterAgents|You cannot see this token again after you close this window."
msgstr ""
@@ -7799,9 +8015,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add a Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
msgstr ""
@@ -7910,10 +8123,7 @@ msgstr ""
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|Connect cluster with certificate"
-msgstr ""
-
-msgid "ClusterIntegration|Connect existing cluster"
+msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Connect with a certificate"
@@ -7961,16 +8171,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create cluster on"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
-
-msgid "ClusterIntegration|Create new cluster on GKE"
+msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
@@ -8006,6 +8207,9 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
+msgid "ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}"
+msgstr ""
+
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -8015,6 +8219,9 @@ msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
+msgstr ""
+
msgid "ClusterIntegration|Environment scope"
msgstr ""
@@ -8078,9 +8285,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-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 ""
@@ -8126,7 +8330,7 @@ msgstr ""
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Learn more about Kubernetes"
+msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
@@ -8219,9 +8423,6 @@ msgstr ""
msgid "ClusterIntegration|Number of nodes must be a numerical value."
msgstr ""
-msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{linkStart}documentation%{linkEnd} on Kubernetes"
-msgstr ""
-
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
@@ -8471,12 +8672,18 @@ msgstr ""
msgid "ClusterIntegration|Unknown Error"
msgstr ""
+msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
+msgstr ""
+
msgid "ClusterIntegration|Use the %{linkStart}GitLab Agent%{linkEnd} to safely connect your Kubernetes clusters to GitLab. You can deploy your applications, run your pipelines, use Review Apps, and much more."
msgstr ""
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
+msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
+msgstr ""
+
msgid "ClusterIntegration|VPC"
msgstr ""
@@ -8489,7 +8696,7 @@ msgstr ""
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
-msgid "ClusterIntegration|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."
+msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
@@ -8730,9 +8937,6 @@ msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
-msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
-
msgid "CommitWidget|authored"
msgstr ""
@@ -8859,6 +9063,9 @@ msgstr ""
msgid "Complete"
msgstr ""
+msgid "Complete verification to sign in."
+msgstr ""
+
msgid "Completed"
msgstr ""
@@ -8892,9 +9099,6 @@ msgstr ""
msgid "ComplianceFrameworks|Configuration not found"
msgstr ""
-msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
-msgstr ""
-
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
msgstr ""
@@ -8919,6 +9123,9 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
+msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
+msgstr ""
+
msgid "ComplianceFrameworks|Invalid format"
msgstr ""
@@ -8928,7 +9135,7 @@ msgstr ""
msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|No compliance frameworks are configured"
+msgid "ComplianceFrameworks|No compliance frameworks are set up yet"
msgstr ""
msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
@@ -8940,12 +9147,24 @@ msgstr ""
msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
+msgid "ComplianceFramework|Add a framework to %{linkStart}%{groupName}%{linkEnd} and it will appear here."
+msgstr ""
+
+msgid "ComplianceFramework|Add framework in %{groupName}"
+msgstr ""
+
+msgid "ComplianceFramework|After a framework is added to %{linkStart}%{groupName}%{linkEnd}, it will appear here."
+msgstr ""
+
msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
msgid "ComplianceFramework|New compliance framework"
msgstr ""
+msgid "ComplianceFramework|No compliance frameworks are set up yet"
+msgstr ""
+
msgid "ComplianceReport|Approved by author"
msgstr ""
@@ -9054,6 +9273,9 @@ msgstr ""
msgid "Configure existing installation"
msgstr ""
+msgid "Configure pipeline"
+msgstr ""
+
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9099,6 +9321,9 @@ msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
+msgid "Configure with a merge request"
+msgstr ""
+
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9108,6 +9333,9 @@ msgstr ""
msgid "Confirm approval"
msgstr ""
+msgid "Confirm destroy application"
+msgstr ""
+
msgid "Confirm new password"
msgstr ""
@@ -9177,6 +9405,12 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect a Kubernetes Cluster"
+msgstr ""
+
+msgid "Connect a cluster"
+msgstr ""
+
msgid "Connect all repositories"
msgstr ""
@@ -9296,9 +9530,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
-msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9356,7 +9587,7 @@ msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
msgstr ""
-msgid "ContainerRegistry|Expiration policy is disabled"
+msgid "ContainerRegistry|Expiration policy is disabled."
msgstr ""
msgid "ContainerRegistry|Expiration policy will run in %{time}"
@@ -9450,6 +9681,9 @@ msgstr ""
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
+msgid "ContainerRegistry|Set up cleanup"
+msgstr ""
+
msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
@@ -9489,6 +9723,9 @@ msgstr ""
msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr ""
+msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
+msgstr ""
+
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9798,6 +10035,9 @@ msgstr ""
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
+msgid "CorpusManagement|A corpus is used by fuzz testing to improve coverage. Corpus files can be manually created or auto-generated. %{linkStart}Learn more%{linkEnd}"
+msgstr ""
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9834,6 +10074,12 @@ msgstr ""
msgid "CorpusManagement|Latest Job:"
msgstr ""
+msgid "CorpusManagement|Manage your fuzz testing corpus files"
+msgstr ""
+
+msgid "CorpusManagement|New corpus"
+msgstr ""
+
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9849,9 +10095,6 @@ msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
msgstr ""
-msgid "CorpusMnagement|New corpus"
-msgstr ""
-
msgid "Could not add admins as members"
msgstr ""
@@ -9969,7 +10212,7 @@ msgstr ""
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
-msgid "Couldn't assign policy to project"
+msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
@@ -10008,9 +10251,15 @@ msgstr ""
msgid "Create a GitLab account first, and then connect it to your %{label} account."
msgstr ""
+msgid "Create a Kubernetes cluster"
+msgstr ""
+
msgid "Create a Mattermost team for this group"
msgstr ""
+msgid "Create a cluster"
+msgstr ""
+
msgid "Create a group"
msgstr ""
@@ -10122,9 +10371,6 @@ msgstr ""
msgid "Create new %{name} by email"
msgstr ""
-msgid "Create new CI/CD pipeline"
-msgstr ""
-
msgid "Create new Value Stream"
msgstr ""
@@ -10149,6 +10395,9 @@ msgstr ""
msgid "Create new project"
msgstr ""
+msgid "Create one"
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10179,9 +10428,6 @@ msgstr ""
msgid "Create user"
msgstr ""
-msgid "Create via merge request"
-msgstr ""
-
msgid "Create wildcard: %{searchTerm}"
msgstr ""
@@ -10434,43 +10680,25 @@ msgstr ""
msgid "Critical vulnerabilities present"
msgstr ""
-msgid "Crm|Contact has been added"
-msgstr ""
-
-msgid "Crm|Contact has been updated"
-msgstr ""
-
-msgid "Crm|Create new contact"
-msgstr ""
-
-msgid "Crm|Create organization"
+msgid "Crm|Contact has been added."
msgstr ""
-msgid "Crm|Customer Relations Contacts"
+msgid "Crm|Contact has been updated."
msgstr ""
-msgid "Crm|Customer Relations Organizations"
+msgid "Crm|Customer relations contacts"
msgstr ""
-msgid "Crm|Default rate (optional)"
+msgid "Crm|Customer relations organizations"
msgstr ""
-msgid "Crm|Description (optional)"
+msgid "Crm|Default rate"
msgstr ""
msgid "Crm|Edit contact"
msgstr ""
-msgid "Crm|Email"
-msgstr ""
-
-msgid "Crm|First name"
-msgstr ""
-
-msgid "Crm|Last name"
-msgstr ""
-
-msgid "Crm|New Organization"
+msgid "Crm|Edit organization"
msgstr ""
msgid "Crm|New contact"
@@ -10485,10 +10713,10 @@ msgstr ""
msgid "Crm|No organizations found"
msgstr ""
-msgid "Crm|Organization has been added"
+msgid "Crm|Organization has been added."
msgstr ""
-msgid "Crm|Phone number (optional)"
+msgid "Crm|Organization has been updated."
msgstr ""
msgid "Cron Timezone"
@@ -10599,19 +10827,16 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Relations Contacts"
-msgstr ""
-
-msgid "Customer Relations Organizations"
-msgstr ""
-
msgid "Customer experience improvement and third-party offers"
msgstr ""
msgid "Customer relations"
msgstr ""
-msgid "Customizable by owners."
+msgid "Customer relations contacts"
+msgstr ""
+
+msgid "Customer relations organizations"
msgstr ""
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
@@ -10740,15 +10965,33 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|Aggregation disabled"
+msgstr ""
+
+msgid "CycleAnalytics|Aggregation enabled"
+msgstr ""
+
msgid "CycleAnalytics|Average time to completion"
msgstr ""
+msgid "CycleAnalytics|Create a custom value stream to view metrics about stages specific to your development process. Use your value stream to visualize your DevSecOps lifecycle, determine the velocity of your group, and identify inefficient processes."
+msgstr ""
+
+msgid "CycleAnalytics|Create a custom value stream…"
+msgstr ""
+
+msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
+msgid "CycleAnalytics|Filter by stop date"
+msgstr ""
+
msgid "CycleAnalytics|Lead Time for Changes"
msgstr ""
@@ -10799,12 +11042,18 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
+msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgstr ""
+
msgid "CycleAnalytics|Total time"
msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
+msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
+msgstr ""
+
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10820,10 +11069,10 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
-msgid "DAST Scans"
+msgid "DAST profile not found: %{name}"
msgstr ""
-msgid "DAST profile not found: %{name}"
+msgid "DAST profiles"
msgstr ""
msgid "DNS"
@@ -10970,6 +11219,9 @@ msgstr ""
msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr ""
+msgid "DastProfiles|DAST profile library"
+msgstr ""
+
msgid "DastProfiles|Debug messages"
msgstr ""
@@ -11024,9 +11276,6 @@ msgstr ""
msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
-msgid "DastProfiles|Manage DAST scans"
-msgstr ""
-
msgid "DastProfiles|Manage profiles"
msgstr ""
@@ -11271,6 +11520,9 @@ msgstr ""
msgid "Data is still calculating..."
msgstr ""
+msgid "Data refresh"
+msgstr ""
+
msgid "Data type"
msgstr ""
@@ -11400,9 +11652,6 @@ msgstr ""
msgid "Default branch and protected branches"
msgstr ""
-msgid "Default branch protection"
-msgstr ""
-
msgid "Default delayed project deletion"
msgstr ""
@@ -11421,9 +11670,6 @@ msgstr ""
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
-msgid "Default initial branch name"
-msgstr ""
-
msgid "Default project deletion protection"
msgstr ""
@@ -12060,6 +12306,33 @@ msgstr ""
msgid "Deployment frequency"
msgstr ""
+msgid "DeploymentApproval| Current approvals: %{current}"
+msgstr ""
+
+msgid "DeploymentApproval|Approval options"
+msgstr ""
+
+msgid "DeploymentApproval|Approve or reject deployment #%{deploymentIid}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by %{user} %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approved by you %{time}"
+msgstr ""
+
+msgid "DeploymentApproval|Approving will run the manual job from deployment #%{deploymentIid}. Rejecting will fail the manual job."
+msgstr ""
+
+msgid "DeploymentApproval|Deployment tier: %{tier}"
+msgstr ""
+
+msgid "DeploymentApproval|Environment: %{environment}"
+msgstr ""
+
+msgid "DeploymentApproval|Manual job: %{jobName}"
+msgstr ""
+
msgid "DeploymentTarget|GitLab Pages"
msgstr ""
@@ -12121,6 +12394,9 @@ msgstr ""
msgid "Deployment|Latest Deployed"
msgstr ""
+msgid "Deployment|Needs Approval"
+msgstr ""
+
msgid "Deployment|Running"
msgstr ""
@@ -12765,6 +13041,9 @@ msgstr ""
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
+msgid "Display"
+msgstr ""
+
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -12822,6 +13101,9 @@ msgstr ""
msgid "Domain Name"
msgstr ""
+msgid "Don't have a group?"
+msgstr ""
+
msgid "Don't have an account yet?"
msgstr ""
@@ -12912,6 +13194,9 @@ msgstr ""
msgid "Draft"
msgstr ""
+msgid "Draft: %{filename}"
+msgstr ""
+
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -12957,6 +13242,45 @@ msgstr ""
msgid "Duration"
msgstr ""
+msgid "Duration|%s days"
+msgstr ""
+
+msgid "Duration|%s hours"
+msgstr ""
+
+msgid "Duration|%s minutes"
+msgstr ""
+
+msgid "Duration|%s months"
+msgstr ""
+
+msgid "Duration|%s seconds"
+msgstr ""
+
+msgid "Duration|%s weeks"
+msgstr ""
+
+msgid "Duration|%s years"
+msgstr ""
+
+msgid "Duration|1 day"
+msgstr ""
+
+msgid "Duration|1 hour"
+msgstr ""
+
+msgid "Duration|1 minute"
+msgstr ""
+
+msgid "Duration|1 month"
+msgstr ""
+
+msgid "Duration|1 week"
+msgstr ""
+
+msgid "Duration|1 year"
+msgstr ""
+
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13059,9 +13383,6 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
-msgid "Edit in Web IDE"
-msgstr ""
-
msgid "Edit in pipeline editor"
msgstr ""
@@ -13386,6 +13707,9 @@ msgstr ""
msgid "Enable container expiration and retention policies for projects created earlier than GitLab 12.7."
msgstr ""
+msgid "Enable container expiration caching."
+msgstr ""
+
msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
@@ -13660,7 +13984,7 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
+msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
@@ -13792,6 +14116,9 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
+msgid "Environments|How do I create an environment?"
+msgstr ""
+
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13807,9 +14134,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|More information"
-msgstr ""
-
msgid "Environments|New environment"
msgstr ""
@@ -13891,7 +14215,10 @@ msgstr ""
msgid "Environments|Updated"
msgstr ""
-msgid "Environments|You don't have any environments right now"
+msgid "Environments|You don't have any environments."
+msgstr ""
+
+msgid "Environments|You don't have any stopped environments."
msgstr ""
msgid "Environments|by %{avatar}"
@@ -14263,6 +14590,12 @@ msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a %{settingsLinkStart}Sentry API URL and Auth Token%{settingsLinkEnd} on your project settings page. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
+msgid "ErrorTracking|Integrated error tracking is %{epicLinkStart}turned off by default%{epicLinkEnd} and no longer active for this project. To re-enable error tracking on self-hosted instances, you can either %{flagLinkStart}turn on the feature flag%{flagLinkEnd} for integrated error tracking, or provide a Sentry API URL and Auth Token below. However, error tracking is not ready for production use and cannot be enabled on GitLab.com."
+msgstr ""
+
msgid "ErrorTracking|No projects available"
msgstr ""
@@ -14272,6 +14605,9 @@ msgstr ""
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
msgstr ""
+msgid "ErrorTracking|View project settings"
+msgstr ""
+
msgid "Errors"
msgstr ""
@@ -14510,6 +14846,9 @@ msgstr ""
msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr ""
+msgid "Everything you need to create a GitLab Pages site using Middleman"
+msgstr ""
+
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr ""
@@ -14522,6 +14861,9 @@ msgstr ""
msgid "Example: @sub\\.company\\.com$"
msgstr ""
+msgid "Examples"
+msgstr ""
+
msgid "Except policy:"
msgstr ""
@@ -14642,6 +14984,9 @@ msgstr ""
msgid "Explore groups"
msgstr ""
+msgid "Explore paid plans"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
@@ -14771,9 +15116,15 @@ msgstr ""
msgid "ExternalAuthorization|URL to which the projects make authorization requests. If the URL is blank, cross-project features are available and can still specify classification labels for projects."
msgstr ""
+msgid "ExternalIssueIntegration|Another issue tracker is already in use"
+msgstr ""
+
msgid "ExternalIssueIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}%{trackerName}%{linkEnd}."
msgstr ""
+msgid "ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again."
+msgstr ""
+
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
msgstr ""
@@ -14883,6 +15234,9 @@ msgstr ""
msgid "Failed to generate export, please try again later."
msgstr ""
+msgid "Failed to generate report, please try again after sometime"
+msgstr ""
+
msgid "Failed to get ref."
msgstr ""
@@ -15304,7 +15658,7 @@ msgstr "2月"
msgid "February"
msgstr ""
-msgid "Fetch and check out the branch for this merge request"
+msgid "Fetch and check out this merge request's feature branch:"
msgstr ""
msgid "Fetching incoming email"
@@ -15445,9 +15799,6 @@ msgstr ""
msgid "Filter users"
msgstr ""
-msgid "Filter your repositories by name"
-msgstr ""
-
msgid "Filter..."
msgstr ""
@@ -15712,9 +16063,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -15742,6 +16090,9 @@ msgstr ""
msgid "From %{providerTitle}"
msgstr ""
+msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -15805,9 +16156,6 @@ msgstr ""
msgid "Generate site and private keys at"
msgstr ""
-msgid "Generated service account is linked to the selected environment"
-msgstr ""
-
msgid "Generic"
msgstr ""
@@ -16357,9 +16705,6 @@ msgstr ""
msgid "GitLab KAS"
msgstr ""
-msgid "GitLab Memberships CSV Export"
-msgstr ""
-
msgid "GitLab Pages"
msgstr ""
@@ -16372,6 +16717,9 @@ msgstr ""
msgid "GitLab Team Member"
msgstr ""
+msgid "GitLab Ultimate trial"
+msgstr ""
+
msgid "GitLab User"
msgstr ""
@@ -16423,9 +16771,6 @@ msgstr ""
msgid "GitLab logo"
msgstr ""
-msgid "GitLab member or Email address"
-msgstr ""
-
msgid "GitLab metadata URL"
msgstr ""
@@ -16651,15 +16996,24 @@ msgstr ""
msgid "GlobalSearch|Search GitLab"
msgstr ""
+msgid "GlobalSearch|Search for projects, issues, etc."
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
+msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
+msgstr ""
+
msgid "GlobalSearch|Type and press the enter key to submit search."
msgstr ""
msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
+msgid "GlobalSearch|What are you searching for?"
+msgstr ""
+
msgid "GlobalSearch|in all GitLab"
msgstr ""
@@ -16699,6 +17053,9 @@ msgstr ""
msgid "Go to environments"
msgstr ""
+msgid "Go to environments page to approve or reject"
+msgstr ""
+
msgid "Go to epic"
msgstr ""
@@ -16825,9 +17182,6 @@ msgstr ""
msgid "Google Cloud authorizations required"
msgstr ""
-msgid "Google Cloud project"
-msgstr ""
-
msgid "Google Cloud project misconfigured"
msgstr ""
@@ -16837,6 +17191,42 @@ msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
+msgid "GoogleCloud|Cancel"
+msgstr ""
+
+msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Create service account"
+msgstr ""
+
+msgid "GoogleCloud|Generated service account is linked to the selected branch or tag"
+msgstr ""
+
+msgid "GoogleCloud|Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation request failed"
+msgstr ""
+
+msgid "GoogleCloud|Google OAuth2 token revocation requested"
+msgstr ""
+
+msgid "GoogleCloud|I understand the responsibilities involved with managing service account keys"
+msgstr ""
+
+msgid "GoogleCloud|New service account is generated for the selected Google Cloud project"
+msgstr ""
+
+msgid "GoogleCloud|Refs"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations"
+msgstr ""
+
+msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invalidate service accounts."
+msgstr ""
+
msgid "Got it"
msgstr ""
@@ -17041,9 +17431,6 @@ msgstr ""
msgid "Group runners can be managed with the %{link}."
msgstr ""
-msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
-
msgid "Group variables (inherited)"
msgstr ""
@@ -17446,13 +17833,13 @@ 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}"
+msgid "GroupSettings|Set the initial name and protections for the default branch of new repositories created in the group."
msgstr ""
-msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
-msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
@@ -17575,6 +17962,9 @@ msgstr ""
msgid "GroupsNew|Create new group"
msgstr ""
+msgid "GroupsNew|Create this in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, use a short expiration date when creating the token."
+msgstr ""
+
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -17593,9 +17983,6 @@ msgstr ""
msgid "GroupsNew|My Awesome Group"
msgstr ""
-msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
-msgstr ""
-
msgid "GroupsNew|No import options available"
msgstr ""
@@ -17716,6 +18103,107 @@ msgstr ""
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
+msgid "Harbor Registry"
+msgstr ""
+
+msgid "HarborIntegration|After the Harbor integration is activated, global variables ‘$HARBOR_USERNAME’, ‘$HARBOR_PASSWORD’, ‘$HARBOR_URL’ and ‘$HARBOR_PROJECT’ will be created for CI/CD use."
+msgstr ""
+
+msgid "HarborIntegration|Base URL of the Harbor instance."
+msgstr ""
+
+msgid "HarborIntegration|Enter Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor URL"
+msgstr ""
+
+msgid "HarborIntegration|Harbor password"
+msgstr ""
+
+msgid "HarborIntegration|Harbor project name"
+msgstr ""
+
+msgid "HarborIntegration|Harbor username"
+msgstr ""
+
+msgid "HarborIntegration|Password for your Harbor username."
+msgstr ""
+
+msgid "HarborIntegration|The name of the project in Harbor."
+msgstr ""
+
+msgid "HarborIntegration|Use Harbor as this project's container registry."
+msgstr ""
+
+msgid "HarborRegistry|%{count} Image repository"
+msgid_plural "HarborRegistry|%{count} Image repositories"
+msgstr[0] ""
+
+msgid "HarborRegistry|%{count} Tag"
+msgid_plural "HarborRegistry|%{count} Tags"
+msgstr[0] ""
+
+msgid "HarborRegistry|Configuration digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Digest: %{imageId}"
+msgstr ""
+
+msgid "HarborRegistry|Harbor Registry"
+msgstr ""
+
+msgid "HarborRegistry|Harbor connection error"
+msgstr ""
+
+msgid "HarborRegistry|Invalid tag: missing manifest digest"
+msgstr ""
+
+msgid "HarborRegistry|Last updated %{time}"
+msgstr ""
+
+msgid "HarborRegistry|Manifest digest: %{digest}"
+msgstr ""
+
+msgid "HarborRegistry|Please try different search criteria"
+msgstr ""
+
+msgid "HarborRegistry|Published %{timeInfo}"
+msgstr ""
+
+msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
+msgstr ""
+
+msgid "HarborRegistry|Root image"
+msgstr ""
+
+msgid "HarborRegistry|Sorry, your filter produced no results."
+msgstr ""
+
+msgid "HarborRegistry|The filter returned no results"
+msgstr ""
+
+msgid "HarborRegistry|The image repository could not be found."
+msgstr ""
+
+msgid "HarborRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
+msgstr ""
+
+msgid "HarborRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
+msgstr ""
+
+msgid "HarborRegistry|This image has no active tags"
+msgstr ""
+
+msgid "HarborRegistry|To widen your search, change or remove the filters above."
+msgstr ""
+
+msgid "HarborRegistry|We are having trouble connecting to the Harbor Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
+msgstr ""
+
+msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
+msgstr ""
+
msgid "Hashed Storage must be enabled to use Geo"
msgstr ""
@@ -17885,6 +18373,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide thread"
+msgstr ""
+
msgid "Hide tooltips or popovers"
msgstr ""
@@ -18033,9 +18524,6 @@ msgstr ""
msgid "I forgot my password"
msgstr ""
-msgid "I understand the responsibilities involved with managing service account keys"
-msgstr ""
-
msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
@@ -18111,9 +18599,6 @@ msgstr ""
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
msgstr ""
-msgid "IP"
-msgstr ""
-
msgid "IP Address"
msgstr ""
@@ -18243,6 +18728,12 @@ msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
msgstr ""
+msgid "If you want to remove this email address, visit %{profile_link}"
+msgstr ""
+
+msgid "If you want to remove this email address, visit the %{settings_link_to} page."
+msgstr ""
+
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -18311,7 +18802,7 @@ msgstr ""
msgid "Import and export rate limits"
msgstr ""
-msgid "Import failed due to a GitHub error: %{original}"
+msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
msgstr ""
msgid "Import from"
@@ -18341,12 +18832,6 @@ msgstr ""
msgid "Import issues"
msgstr ""
-msgid "Import members"
-msgstr ""
-
-msgid "Import members from another project"
-msgstr ""
-
msgid "Import multiple repositories by uploading a manifest file."
msgstr ""
@@ -18356,9 +18841,6 @@ msgstr ""
msgid "Import project from"
msgstr ""
-msgid "Import project members"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -18696,9 +19178,6 @@ msgstr ""
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
-msgid "InProductMarketing|GitLab is better with teammates to help out!"
-msgstr ""
-
msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS, Azure, OpenShift, VMWare, On Prem, Bare Metal, and more), offering a consistent workflow experience – irrespective of the environment."
msgstr ""
@@ -18777,15 +19256,6 @@ msgstr ""
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
-msgid "InProductMarketing|Invite your teammates to GitLab"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates to help"
-msgstr ""
-
-msgid "InProductMarketing|Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running."
-msgstr ""
-
msgid "InProductMarketing|It's all in the stats"
msgstr ""
@@ -19077,6 +19547,9 @@ msgstr ""
msgid "IncidentManagement|Achieved SLA"
msgstr ""
+msgid "IncidentManagement|Acknowledged"
+msgstr ""
+
msgid "IncidentManagement|All"
msgstr ""
@@ -19086,6 +19559,15 @@ msgstr ""
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list. You can also create a new incident using the button below."
msgstr ""
+msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
+msgstr ""
+
+msgid "IncidentManagement|An error occurred while updating the incident status. Please reload the page and try again."
+msgstr ""
+
+msgid "IncidentManagement|Assign paging status"
+msgstr ""
+
msgid "IncidentManagement|Assignees"
msgstr ""
@@ -19143,6 +19625,12 @@ msgstr ""
msgid "IncidentManagement|Published to status page"
msgstr ""
+msgid "IncidentManagement|Resolved"
+msgstr ""
+
+msgid "IncidentManagement|Setting the status to Acknowledged or Resolved stops paging when escalation policies are selected for the incident."
+msgstr ""
+
msgid "IncidentManagement|Severity"
msgstr ""
@@ -19158,6 +19646,9 @@ msgstr ""
msgid "IncidentManagement|Time to SLA"
msgstr ""
+msgid "IncidentManagement|Triggered"
+msgstr ""
+
msgid "IncidentManagement|Unassigned"
msgstr ""
@@ -19239,6 +19730,9 @@ msgstr ""
msgid "Incidents|There was an issue uploading your image."
msgstr ""
+msgid "Incident|Add new timeline event"
+msgstr ""
+
msgid "Incident|Alert details"
msgstr ""
@@ -19260,6 +19754,9 @@ msgstr ""
msgid "Incident|Metrics"
msgstr ""
+msgid "Incident|No timeline items have been added yet."
+msgstr ""
+
msgid "Incident|Summary"
msgstr ""
@@ -19269,6 +19766,9 @@ msgstr ""
msgid "Incident|There was an issue loading incident data. Please try again."
msgstr ""
+msgid "Incident|Timeline"
+msgstr ""
+
msgid "Include author name in notification email body"
msgstr ""
@@ -19377,6 +19877,12 @@ msgstr ""
msgid "Inherited:"
msgstr ""
+msgid "Initial default branch name"
+msgstr ""
+
+msgid "Initial default branch protection"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -19576,6 +20082,9 @@ msgstr ""
msgid "Integrations|Failed to load namespaces. Please try again."
msgstr ""
+msgid "Integrations|Failed to sign in to GitLab."
+msgstr ""
+
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
@@ -19690,6 +20199,9 @@ msgstr ""
msgid "Integrations|Use default settings"
msgstr ""
+msgid "Integrations|You can close this window."
+msgstr ""
+
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
msgstr ""
@@ -19702,12 +20214,18 @@ msgstr ""
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr ""
+msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
+msgstr ""
+
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|Your browser is not supported"
+msgstr ""
+
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
@@ -19855,9 +20373,6 @@ msgstr ""
msgid "Invitation declined"
msgstr ""
-msgid "Invite"
-msgstr ""
-
msgid "Invite \"%{email}\" by email"
msgstr ""
@@ -19873,12 +20388,6 @@ msgstr ""
msgid "Invite email has already been taken"
msgstr ""
-msgid "Invite group"
-msgstr ""
-
-msgid "Invite member"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -19972,6 +20481,9 @@ msgstr ""
msgid "InviteMembersModal|Members were successfully added"
msgstr ""
+msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgstr ""
+
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
@@ -19990,6 +20502,12 @@ msgstr ""
msgid "InviteMembersModal|To assign issues to a new team member, you need a project for the issues. %{linkStart}Create a project to get started.%{linkEnd}"
msgstr ""
+msgid "InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier."
+msgstr ""
+
+msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
+msgstr ""
+
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr ""
@@ -20002,6 +20520,9 @@ msgstr ""
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
+msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
+msgstr ""
+
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -20194,9 +20715,6 @@ msgstr ""
msgid "Issue weight"
msgstr ""
-msgid "Issue(s) already assigned"
-msgstr ""
-
msgid "IssueAnalytics|Age"
msgstr ""
@@ -20239,7 +20757,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found"
msgstr ""
-msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
+msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr ""
msgid "IssueBoards|Switch board"
@@ -20410,10 +20928,13 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgstr ""
+
msgid "Iterations|Add iteration"
msgstr ""
-msgid "Iterations|Automated scheduling"
+msgid "Iterations|All"
msgstr ""
msgid "Iterations|Cadence configuration is invalid."
@@ -20428,12 +20949,6 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create cadence and start iteration"
-msgstr ""
-
-msgid "Iterations|Create iteration"
-msgstr ""
-
msgid "Iterations|Delete cadence"
msgstr ""
@@ -20443,6 +20958,9 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Done"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -20464,7 +20982,13 @@ msgstr ""
msgid "Iterations|Iteration cadences"
msgstr ""
-msgid "Iterations|Iteration scheduling will be handled automatically"
+msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
+msgstr ""
+
+msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
+msgstr ""
+
+msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
@@ -20482,6 +21006,9 @@ msgstr ""
msgid "Iterations|No iteration cadences to show."
msgstr ""
+msgid "Iterations|No iterations found"
+msgstr ""
+
msgid "Iterations|No iterations in cadence."
msgstr ""
@@ -20491,10 +21018,16 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Open"
+msgstr ""
+
+msgid "Iterations|Requires update"
+msgstr ""
+
msgid "Iterations|Roll over issues"
msgstr ""
-msgid "Iterations|Save cadence"
+msgid "Iterations|Save changes"
msgstr ""
msgid "Iterations|Select duration"
@@ -20506,6 +21039,9 @@ msgstr ""
msgid "Iterations|Select start date"
msgstr ""
+msgid "Iterations|Some of your cadences need to be updated"
+msgstr ""
+
msgid "Iterations|Start date"
msgstr ""
@@ -20518,6 +21054,9 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This cadence requires an update"
+msgstr ""
+
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
@@ -20773,9 +21312,6 @@ msgstr ""
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
-msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
-
msgid "JiraService|Warning: All GitLab users with access to this GitLab project can view all issues from the Jira project you select."
msgstr ""
@@ -20788,6 +21324,9 @@ msgstr ""
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
+msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. %{jira_issues_link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "JiraService|You must configure Jira before enabling this integration. %{jira_doc_link_start}Learn more.%{link_end}"
msgstr ""
@@ -20851,6 +21390,9 @@ msgstr ""
msgid "Jobs|Create CI/CD configuration file"
msgstr ""
+msgid "Jobs|Filter jobs"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -20860,6 +21402,12 @@ msgstr ""
msgid "Jobs|No jobs to show"
msgstr ""
+msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
+msgstr ""
+
+msgid "Jobs|Status"
+msgstr ""
+
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -20887,15 +21435,24 @@ msgstr ""
msgid "Job|Cancel"
msgstr ""
+msgid "Job|Canceled"
+msgstr ""
+
msgid "Job|Complete Raw"
msgstr ""
+msgid "Job|Created"
+msgstr ""
+
msgid "Job|Download"
msgstr ""
msgid "Job|Erase job log and artifacts"
msgstr ""
+msgid "Job|Failed"
+msgstr ""
+
msgid "Job|Finished at"
msgstr ""
@@ -20911,9 +21468,27 @@ msgstr ""
msgid "Job|Keep"
msgstr ""
+msgid "Job|Manual"
+msgstr ""
+
+msgid "Job|Passed"
+msgstr ""
+
+msgid "Job|Pending"
+msgstr ""
+
+msgid "Job|Preparing"
+msgstr ""
+
msgid "Job|Retry"
msgstr ""
+msgid "Job|Running"
+msgstr ""
+
+msgid "Job|Scheduled"
+msgstr ""
+
msgid "Job|Scroll to bottom"
msgstr ""
@@ -20923,6 +21498,9 @@ msgstr ""
msgid "Job|Show complete raw"
msgstr ""
+msgid "Job|Skipped"
+msgstr ""
+
msgid "Job|Status"
msgstr ""
@@ -20947,6 +21525,9 @@ msgstr ""
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
msgstr ""
+msgid "Job|Waiting for resource"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -21305,6 +21886,9 @@ msgstr ""
msgid "Last updated"
msgstr ""
+msgid "Last updated %{time} ago"
+msgstr ""
+
msgid "Last used"
msgstr ""
@@ -21413,6 +21997,12 @@ msgstr ""
msgid "Learn more about groups."
msgstr ""
+msgid "Learn more about max seats used"
+msgstr ""
+
+msgid "Learn more about seats owed"
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced Search configuration%{configuration_link_end} documentation. Changes don't take place until you %{recreated_link_start}recreate%{recreated_link_end} the index."
msgstr ""
@@ -21554,6 +22144,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Less Details"
+msgstr ""
+
msgid "Let's Encrypt does not accept emails on example.com"
msgstr ""
@@ -21566,6 +22159,9 @@ msgstr ""
msgid "License Compliance"
msgstr ""
+msgid "License Compliance| Used by"
+msgstr ""
+
msgid "License compliance"
msgstr ""
@@ -21584,6 +22180,9 @@ msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
msgstr ""
+msgid "LicenseCompliance|Acceptable for use in this project"
+msgstr ""
+
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -21611,9 +22210,6 @@ msgstr ""
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
msgstr ""
-msgid "LicenseCompliance|License Approvals"
-msgstr ""
-
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only"
msgstr[0] ""
@@ -21638,6 +22234,10 @@ msgid "LicenseCompliance|License Compliance detected %d new license and policy v
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
msgstr[0] ""
+msgid "LicenseCompliance|License Compliance detected %d removed license"
+msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
+msgstr[0] ""
+
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -21647,6 +22247,12 @@ msgstr ""
msgid "LicenseCompliance|License name"
msgstr ""
+msgid "LicenseCompliance|No policy matches this license"
+msgstr ""
+
+msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
+msgstr ""
+
msgid "LicenseCompliance|Remove license"
msgstr ""
@@ -21662,6 +22268,12 @@ msgstr ""
msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
+msgid "LicenseCompliance|Uncategorized"
+msgstr ""
+
+msgid "LicenseCompliance|Update approvals"
+msgstr ""
+
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr ""
@@ -21851,9 +22463,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of environments for this project"
-msgstr ""
-
msgid "List of suitable GCP locations"
msgstr ""
@@ -22127,6 +22736,9 @@ msgstr ""
msgid "Manage labels"
msgstr ""
+msgid "Manage members"
+msgstr ""
+
msgid "Manage milestones"
msgstr ""
@@ -22160,6 +22772,9 @@ msgstr ""
msgid "Manual"
msgstr ""
+msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
+msgstr ""
+
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -22322,6 +22937,9 @@ msgstr ""
msgid "Max role"
msgstr ""
+msgid "Max seats used"
+msgstr ""
+
msgid "Max session time"
msgstr ""
@@ -22442,9 +23060,6 @@ msgstr ""
msgid "Maximum job timeout has a value which could not be accepted"
msgstr ""
-msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
-msgstr ""
-
msgid "Maximum lines in a diff"
msgstr ""
@@ -22466,6 +23081,12 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
+msgid "Maximum number of requests per minute for an authenticated user"
+msgstr ""
+
+msgid "Maximum number of requests per minute for an unauthenticated IP address"
+msgstr ""
+
msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
msgstr ""
@@ -22699,9 +23320,6 @@ msgstr ""
msgid "Member|Deny access"
msgstr ""
-msgid "Member|Remove member"
-msgstr ""
-
msgid "Member|Revoke invite"
msgstr ""
@@ -22738,7 +23356,7 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
-msgid "Merge blocked: all merge request dependencies must be merged or closed."
+msgid "Merge blocked: all merge request dependencies must be merged."
msgstr ""
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
@@ -22813,7 +23431,7 @@ msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
-msgid "Merge the branch and fix any conflicts that come up"
+msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
@@ -23366,9 +23984,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Middleman project with Static Site Editor support"
-msgstr ""
-
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -23487,6 +24102,9 @@ msgstr ""
msgid "Milestones|Completed Issues (closed)"
msgstr ""
+msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Delete milestone"
msgstr ""
@@ -23505,6 +24123,9 @@ msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
+msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
+msgstr ""
+
msgid "Milestones|Project Milestone"
msgstr ""
@@ -23523,12 +24144,21 @@ msgstr ""
msgid "Milestones|Reopen Milestone"
msgstr ""
+msgid "Milestones|There are no closed milestones"
+msgstr ""
+
+msgid "Milestones|There are no open milestones"
+msgstr ""
+
msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
msgstr ""
+msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
+msgstr ""
+
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -23646,6 +24276,9 @@ msgstr ""
msgid "Months"
msgstr ""
+msgid "More Details"
+msgstr ""
+
msgid "More Information"
msgstr ""
@@ -23742,16 +24375,16 @@ msgstr ""
msgid "MrDeploymentActions|Stop environment"
msgstr ""
-msgid "MrList|Assigned to %{name}, go to their profile."
+msgid "MrList|Assigned to %{name}"
msgstr ""
-msgid "MrList|Attention requested from assignee %{name}, go to their profile."
+msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
-msgid "MrList|Attention requested from reviewer %{name}, go to their profile."
+msgid "MrList|Attention requested from reviewer %{name}"
msgstr ""
-msgid "MrList|Review requested from %{name}, go to their profile."
+msgid "MrList|Review requested from %{name}"
msgstr ""
msgid "Multi-project"
@@ -23857,6 +24490,33 @@ msgstr ""
msgid "NamespaceStorageSize|push to your repository, create pipelines, create issues or add comments. To reduce storage capacity, delete unused repositories, artifacts, wikis, issues, and pipelines."
msgstr ""
+msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name_with_link} namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
+msgstr ""
+
+msgid "NamespaceStorage|%{name}(%{url}) namespace has exceeded its namespace storage limit."
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Action required: Storage has been exceeded for %{namespace_name}"
+msgstr ""
+
+msgid "NamespaceStorage|Buy more storage"
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to ensure your service is not interrupted."
+msgstr ""
+
+msgid "NamespaceStorage|We recommend that you buy additional storage to resume normal service."
+msgstr ""
+
msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}user caps%{link_end} and %{users_pending_approval_link_start}users pending approval%{link_end}."
msgstr ""
@@ -23932,6 +24592,9 @@ msgstr ""
msgid "Need help?"
msgstr ""
+msgid "Need your attention"
+msgstr ""
+
msgid "Needs"
msgstr ""
@@ -24118,9 +24781,6 @@ msgstr ""
msgid "New"
msgstr "新增"
-msgid "New %{issueType}"
-msgstr ""
-
msgid "New %{type} in %{project}"
msgstr ""
@@ -24212,6 +24872,9 @@ msgstr ""
msgid "New discussion"
msgstr ""
+msgid "New email address added"
+msgstr ""
+
msgid "New environment"
msgstr ""
@@ -24287,6 +24950,9 @@ msgstr ""
msgid "New public deploy key"
msgstr ""
+msgid "New related %{issueType}"
+msgstr ""
+
msgid "New release"
msgstr ""
@@ -24302,9 +24968,6 @@ msgstr ""
msgid "New schedule"
msgstr ""
-msgid "New service account is generated for the selected Google Cloud project"
-msgstr ""
-
msgid "New snippet"
msgstr ""
@@ -24353,6 +25016,9 @@ msgstr ""
msgid "Next unresolved discussion"
msgstr ""
+msgid "Next update"
+msgstr ""
+
msgid "Nickname"
msgstr ""
@@ -24401,6 +25067,9 @@ msgstr ""
msgid "No assignee"
msgstr ""
+msgid "No attention request"
+msgstr ""
+
msgid "No authentication methods configured."
msgstr ""
@@ -24428,12 +25097,6 @@ msgstr ""
msgid "No committers"
msgstr ""
-msgid "No compliance frameworks are in use."
-msgstr ""
-
-msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
-msgstr ""
-
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
@@ -24512,9 +25175,6 @@ msgstr ""
msgid "No iteration"
msgstr ""
-msgid "No iterations found"
-msgstr ""
-
msgid "No iterations to show"
msgstr ""
@@ -24536,7 +25196,7 @@ msgstr ""
msgid "No matches found"
msgstr ""
-msgid "No matching issue found. Make sure that you are adding a valid issue URL."
+msgid "No matching %{issuable} found. Make sure that you are adding a valid %{issuable} URL."
msgstr ""
msgid "No matching labels"
@@ -24569,9 +25229,6 @@ msgstr ""
msgid "No milestone"
msgstr ""
-msgid "No milestones to show"
-msgstr ""
-
msgid "No namespace"
msgstr ""
@@ -24653,6 +25310,9 @@ msgstr ""
msgid "No start date"
msgstr ""
+msgid "No suggestions found"
+msgstr ""
+
msgid "No tag selected"
msgstr ""
@@ -24807,6 +25467,9 @@ msgstr ""
msgid "Notes|This comment has changed since you started editing, please review the %{open_link}updated comment%{close_link} to ensure information is not lost"
msgstr ""
+msgid "Notes|This comment is confidential and only visible to group members"
+msgstr ""
+
msgid "Notes|This comment is confidential and only visible to project members"
msgstr ""
@@ -25243,10 +25906,10 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
-msgid "OnDemandScans|New DAST scan"
+msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
-msgid "OnDemandScans|New on-demand DAST scan"
+msgid "OnDemandScans|New scan"
msgstr ""
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
@@ -25391,6 +26054,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only allow anyone to register for accounts on GitLab instances that you intend to be used by anyone. Allowing anyone to register makes GitLab instances more vulnerable."
+msgstr ""
+
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
@@ -25409,9 +26075,6 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
-msgid "Only project members will be imported. Group members will be skipped."
-msgstr ""
-
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
@@ -25442,10 +26105,10 @@ msgstr ""
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."
+msgid "Open errors"
msgstr ""
-msgid "Open errors"
+msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
@@ -25460,9 +26123,6 @@ msgstr ""
msgid "Open raw"
msgstr ""
-msgid "Open registration is enabled on your instance."
-msgstr ""
-
msgid "Open sidebar"
msgstr ""
@@ -25490,6 +26150,9 @@ msgstr ""
msgid "Opens in a new window"
msgstr ""
+msgid "Opens new window"
+msgstr ""
+
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -25631,6 +26294,9 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "Owners can modify this selection."
+msgstr ""
+
msgid "PQL|An error occurred while sending hand raise lead."
msgstr ""
@@ -26397,6 +27063,9 @@ msgstr ""
msgid "Phabricator Tasks"
msgstr ""
+msgid "Phone"
+msgstr ""
+
msgid "Pick a name"
msgstr ""
@@ -26673,6 +27342,9 @@ msgstr ""
msgid "PipelineWizard|There was a problem while checking whether your file already exists in the specified branch."
msgstr ""
+msgid "PipelineWizard|There was an unexpected error trying to set up the template. The error has been logged."
+msgstr ""
+
msgid "Pipelines"
msgstr ""
@@ -26682,10 +27354,13 @@ msgstr ""
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
-msgid "Pipelines|API"
+msgid "Pipelines|\"Hello world\" with GitLab CI"
+msgstr ""
+
+msgid "Pipelines|A GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. Install GitLab Runner and register your own runners to get started with CI/CD."
msgstr ""
-msgid "Pipelines|Add a code quality job"
+msgid "Pipelines|API"
msgstr ""
msgid "Pipelines|Are you sure you want to run this pipeline?"
@@ -26733,7 +27408,7 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
+msgid "Pipelines|Get familiar with GitLab CI syntax by setting up a simple pipeline running a \"Hello world\" script to see how it runs, explore how CI/CD works."
msgstr ""
msgid "Pipelines|Get started with GitLab CI/CD"
@@ -26742,13 +27417,13 @@ msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
+msgid "Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline. There are active runners available to run your jobs right now. If you prefer, you can %{settingsLinkStart}configure your runners%{settingsLinkEnd} or %{docsLinkStart}learn more%{docsLinkEnd} about runners."
msgstr ""
-msgid "Pipelines|Improve code quality with GitLab CI/CD"
+msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
-msgid "Pipelines|Install GitLab Runners"
+msgid "Pipelines|Install GitLab Runner"
msgstr ""
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
@@ -26757,7 +27432,7 @@ msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
-msgid "Pipelines|Learn about Runners"
+msgid "Pipelines|Learn the basics of pipelines and .yml files"
msgstr ""
msgid "Pipelines|Lint"
@@ -26775,6 +27450,9 @@ msgstr ""
msgid "Pipelines|More Information"
msgstr ""
+msgid "Pipelines|No runners detected"
+msgstr ""
+
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
msgstr ""
@@ -26787,9 +27465,15 @@ msgstr ""
msgid "Pipelines|Project cache successfully reset."
msgstr ""
+msgid "Pipelines|Ready to set up CI/CD for your project?"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
+msgid "Pipelines|Runners are available to run your jobs now"
+msgstr ""
+
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -26844,24 +27528,18 @@ msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
msgstr ""
-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 ""
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
-msgid "Pipelines|Use a CI/CD template"
+msgid "Pipelines|Try test template"
msgstr ""
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
-msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
-
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
@@ -26919,9 +27597,6 @@ msgstr ""
msgid "Pipeline|Checking pipeline status."
msgstr ""
-msgid "Pipeline|Commit"
-msgstr ""
-
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -26937,9 +27612,6 @@ msgstr ""
msgid "Pipeline|Detached merge request pipeline"
msgstr ""
-msgid "Pipeline|Duration"
-msgstr ""
-
msgid "Pipeline|Failed"
msgstr ""
@@ -27273,9 +27945,6 @@ msgstr ""
msgid "Please select a group"
msgstr ""
-msgid "Please select a group."
-msgstr ""
-
msgid "Please select a valid target branch"
msgstr ""
@@ -27330,7 +27999,7 @@ msgstr ""
msgid "Pods in use"
msgstr ""
-msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
+msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Each URL and link title must be unique."
msgstr ""
msgid "Policies"
@@ -27375,7 +28044,7 @@ msgstr ""
msgid "Potentially unwanted character detected: Unicode BiDi Control"
msgstr ""
-msgid "Pre-defined push rules."
+msgid "Pre-defined push rules"
msgstr ""
msgid "Preferences"
@@ -27483,6 +28152,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
+msgid "Preparing the report for the scan."
+msgstr ""
+
msgid "Prev"
msgstr ""
@@ -27792,6 +28464,9 @@ msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
+msgid "Profiles|Example: MacBook key"
+msgstr ""
+
msgid "Profiles|Expiration date"
msgstr ""
@@ -27813,9 +28488,6 @@ msgstr ""
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
-msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
-
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 ""
@@ -27852,6 +28524,9 @@ msgstr ""
msgid "Profiles|Key can still be used after expiration."
msgstr ""
+msgid "Profiles|Key titles are publicly visible."
+msgstr ""
+
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -27957,6 +28632,9 @@ msgstr ""
msgid "Profiles|Time settings"
msgstr ""
+msgid "Profiles|Title"
+msgstr ""
+
msgid "Profiles|Two-Factor Authentication"
msgstr ""
@@ -28038,9 +28716,6 @@ msgstr ""
msgid "Profiles|Your status"
msgstr ""
-msgid "Profiles|e.g. My MacBook key"
-msgstr ""
-
msgid "Profiles|https://website.com"
msgstr ""
@@ -28545,7 +29220,7 @@ msgstr ""
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr ""
-msgid "ProjectSettings|Every project can have its own space to store its packages."
+msgid "ProjectSettings|Every project can have its own space to store its packages. Note: The Package Registry is always visible when a project is public."
msgstr ""
msgid "ProjectSettings|Everyone"
@@ -28644,6 +29319,9 @@ msgstr ""
msgid "ProjectSettings|Merge suggestions"
msgstr ""
+msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
+msgstr ""
+
msgid "ProjectSettings|No merge commits are created."
msgstr ""
@@ -28815,6 +29493,9 @@ msgstr ""
msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches. %{link_start}How to configure merge request pipelines?%{link_end}"
msgstr ""
+msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
+msgstr ""
+
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr ""
@@ -28878,6 +29559,9 @@ msgstr ""
msgid "ProjectTemplates|Pages/Jekyll"
msgstr ""
+msgid "ProjectTemplates|Pages/Middleman"
+msgstr ""
+
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr ""
@@ -28896,9 +29580,6 @@ msgstr ""
msgid "ProjectTemplates|Spring"
msgstr ""
-msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
-
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
msgstr ""
@@ -29043,6 +29724,12 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Pick a group or namespace"
+msgstr ""
+
+msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
+msgstr ""
+
msgid "ProjectsNew|Project Configuration"
msgstr ""
@@ -29652,7 +30339,10 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
-msgid "Push the result of the merge to GitLab"
+msgid "Push rules"
+msgstr ""
+
+msgid "Push the target branch up to GitLab."
msgstr ""
msgid "Push to create a project"
@@ -30082,9 +30772,15 @@ msgstr ""
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
+msgid "Reject"
+msgstr ""
+
msgid "Rejected (closed)"
msgstr ""
+msgid "Relate to %{issuable_type} %{add_related_issue_link}"
+msgstr ""
+
msgid "Related feature flags"
msgstr ""
@@ -30094,9 +30790,6 @@ msgstr ""
msgid "Related merge requests"
msgstr ""
-msgid "Related to #%{issue_id}."
-msgstr ""
-
msgid "Relates to"
msgstr ""
@@ -30326,6 +31019,9 @@ msgstr ""
msgid "Remove time estimate"
msgstr ""
+msgid "Remove topic avatar"
+msgstr ""
+
msgid "Remove user"
msgstr ""
@@ -30536,7 +31232,10 @@ msgstr ""
msgid "Report abuse to admin"
msgstr ""
-msgid "Report is generating and will be sent to your email address."
+msgid "Report couldn't be prepared."
+msgstr ""
+
+msgid "Report for the scan has been removed from the database."
msgstr ""
msgid "Reported %{timeAgo} by %{reportedBy}"
@@ -30613,12 +31312,18 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Full report"
+msgstr ""
+
msgid "Reports|Head report parsing error:"
msgstr ""
msgid "Reports|Identifier"
msgstr ""
+msgid "Reports|Metrics report scanning detected no new changes"
+msgstr ""
+
msgid "Reports|Metrics reports are loading"
msgstr ""
@@ -30631,6 +31336,12 @@ msgstr ""
msgid "Reports|Metrics reports failed loading results"
msgstr ""
+msgid "Reports|Metrics reports failed to load results"
+msgstr ""
+
+msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -30646,9 +31357,15 @@ msgstr ""
msgid "Reports|Test summary failed loading results"
msgstr ""
+msgid "Reports|Test summary failed to load results"
+msgstr ""
+
msgid "Reports|Test summary results are being parsed"
msgstr ""
+msgid "Reports|Test summary results are loading"
+msgstr ""
+
msgid "Reports|Tool"
msgstr ""
@@ -31156,7 +31873,7 @@ msgstr ""
msgid "Review requests for you"
msgstr ""
-msgid "Review the changes locally"
+msgid "Review the changes locally."
msgstr ""
msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
@@ -31217,9 +31934,6 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
-msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
-msgstr ""
-
msgid "Roadmap"
msgstr ""
@@ -31271,10 +31985,10 @@ msgstr ""
msgid "Runner API"
msgstr ""
-msgid "Runner tokens"
+msgid "Runner cannot be deleted, please contact your administrator."
msgstr ""
-msgid "Runner was not deleted because it is assigned to multiple projects."
+msgid "Runner tokens"
msgstr ""
msgid "Runner was not updated."
@@ -31295,6 +32009,20 @@ msgstr ""
msgid "Runners page."
msgstr ""
+msgid "Runners|%{percentage} spot."
+msgstr ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
+msgstr[0] ""
+
+msgid "Runners|%{strongStart}%{count}%{strongEnd} runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+
+msgid "Runners|A capacity of 1 enables warm HA through Auto Scaling group re-spawn. A capacity of 2 enables hot HA because the service is available even when a node is lost. A capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Active"
msgstr ""
@@ -31304,7 +32032,7 @@ msgstr ""
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
@@ -31331,9 +32059,21 @@ msgstr ""
msgid "Runners|Can run untagged jobs"
msgstr ""
+msgid "Runners|Capacity of 1 enables warm HA through Auto Scaling group re-spawn. Capacity of 2 enables hot HA because the service is available even when a node is lost. Capacity of 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|Change to project runner"
msgstr ""
+msgid "Runners|Checkbox"
+msgstr ""
+
+msgid "Runners|Choose your preferred GitLab Runner"
+msgstr ""
+
+msgid "Runners|Clear selection"
+msgstr ""
+
msgid "Runners|Command to register runner"
msgstr ""
@@ -31346,12 +32086,19 @@ msgstr ""
msgid "Runners|Copy registration token"
msgstr ""
+msgid "Runners|Delete %d runner"
+msgid_plural "Runners|Delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Delete runner"
msgstr ""
msgid "Runners|Delete runner %{name}?"
msgstr ""
+msgid "Runners|Delete selected"
+msgstr ""
+
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -31361,6 +32108,9 @@ msgstr ""
msgid "Runners|Details"
msgstr ""
+msgid "Runners|Don't see what you are looking for? See the full list of options, including a fully customizable option %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Runners|Download and install binary"
msgstr ""
@@ -31370,18 +32120,12 @@ msgstr ""
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
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 ""
-
msgid "Runners|Group"
msgstr ""
msgid "Runners|IP Address"
msgstr ""
-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 ""
-
msgid "Runners|Install a runner"
msgstr ""
@@ -31403,25 +32147,31 @@ msgstr ""
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
+msgid "Runners|Multi-project runners cannot be deleted"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
msgid "Runners|Never contacted"
msgstr ""
-msgid "Runners|New registration token generated!"
+msgid "Runners|Never contacted:"
msgstr ""
-msgid "Runners|New runner, has not contacted yet"
+msgid "Runners|New group runners view"
msgstr ""
-msgid "Runners|No contact from this runner in over 3 months"
+msgid "Runners|New registration token generated!"
msgstr ""
-msgid "Runners|No recent contact from this runner; last contact was %{timeAgo}"
+msgid "Runners|No spot. Default choice for Windows Shell executor."
msgstr ""
-msgid "Runners|Not available to run jobs"
+msgid "Runners|No spot. This is the default choice for Linux Docker executor."
+msgstr ""
+
+msgid "Runners|Not accepting jobs"
msgstr ""
msgid "Runners|Offline"
@@ -31430,15 +32180,28 @@ msgstr ""
msgid "Runners|Offline runners"
msgstr ""
+msgid "Runners|Offline:"
+msgstr ""
+
msgid "Runners|Online"
msgstr ""
msgid "Runners|Online runners"
msgstr ""
+msgid "Runners|Online:"
+msgstr ""
+
+msgid "Runners|Pause from accepting jobs"
+msgstr ""
+
msgid "Runners|Paused"
msgstr ""
+msgid "Runners|Permanently delete %d runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -31472,9 +32235,15 @@ msgstr ""
msgid "Runners|Reset token"
msgstr ""
+msgid "Runners|Resume accepting jobs"
+msgstr ""
+
msgid "Runners|Revision"
msgstr ""
+msgid "Runners|Rocket launch illustration"
+msgstr ""
+
msgid "Runners|Runner"
msgstr ""
@@ -31487,21 +32256,51 @@ msgstr ""
msgid "Runners|Runner assigned to project."
msgstr ""
-msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
+msgid "Runners|Runner cannot be deleted, please contact your administrator"
+msgstr ""
+
+msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
+msgstr ""
+
+msgid "Runners|Runner has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
+msgstr ""
+
+msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is offline; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
msgstr ""
msgid "Runners|Runner is online; last contact was %{timeAgo}"
msgstr ""
-msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
+msgid "Runners|Runner is stale; it has never contacted this instance"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
+msgstr ""
+
+msgid "Runners|Runner is stale; last contact was %{timeAgo}"
msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner statuses"
+msgstr ""
+
msgid "Runners|Runner unassigned from project."
msgstr ""
@@ -31511,7 +32310,7 @@ msgstr ""
msgid "Runners|Runs untagged jobs"
msgstr ""
-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."
+msgid "Runners|Select your preferred option here. In the next step, you can choose the capacity for your runner in the AWS CloudFormation console."
msgstr ""
msgid "Runners|Show runner installation and registration instructions"
@@ -31532,6 +32331,9 @@ msgstr ""
msgid "Runners|Stale runners"
msgstr ""
+msgid "Runners|Stale:"
+msgstr ""
+
msgid "Runners|Status"
msgstr ""
@@ -31541,16 +32343,19 @@ msgstr ""
msgid "Runners|Tags"
msgstr ""
-msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgid "Runners|Take me there!"
msgstr ""
-msgid "Runners|This runner has never contacted this instance"
+msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
msgstr ""
-msgid "Runners|This runner is associated with specific projects."
+msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
msgstr ""
-msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
+msgid "Runners|This runner has not run any jobs."
+msgstr ""
+
+msgid "Runners|This runner is associated with specific projects."
msgstr ""
msgid "Runners|This runner is available to all projects and subgroups in a group."
@@ -31568,7 +32373,7 @@ msgstr ""
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr ""
-msgid "Runners|Use the runner for the currently assigned projects only."
+msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
msgstr ""
msgid "Runners|Use the runner on pipelines for protected branches only."
@@ -31586,7 +32391,7 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
-msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
@@ -31595,9 +32400,6 @@ 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 ""
@@ -31631,9 +32433,6 @@ msgstr ""
msgid "Runners|stale"
msgstr ""
-msgid "Runner|This runner has not run any jobs."
-msgstr ""
-
msgid "Running"
msgstr ""
@@ -31748,10 +32547,10 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} scan in an open merge request targeting the %{branches} branch(es) finds %{vulnerabilitiesAllowed} or more %{severities} vulnerabilities that are %{vulnerabilityStates}"
+msgid "ScanResultPolicy|%{ifLabelStart}if%{ifLabelEnd} %{scanners} find(s) more than %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} vulnerabilities in an open merge request targeting %{branches}"
msgstr ""
-msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers: %{approvers}"
+msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr ""
msgid "ScanResultPolicy|add an approver"
@@ -31943,6 +32742,9 @@ msgstr ""
msgid "Search projects..."
msgstr ""
+msgid "Search rate limits"
+msgstr ""
+
msgid "Search refs"
msgstr ""
@@ -32056,6 +32858,9 @@ msgstr ""
msgid "Seats"
msgstr ""
+msgid "Seats owed"
+msgstr ""
+
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -32080,6 +32885,15 @@ msgstr ""
msgid "Secret token"
msgstr ""
+msgid "Secure Code Warrior"
+msgstr ""
+
+msgid "Secure Files"
+msgstr ""
+
+msgid "Secure Files|File did not match the provided checksum"
+msgstr ""
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -32206,16 +33020,19 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Learn more about vulnerability training"
+msgstr ""
+
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
msgstr ""
-msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgid "SecurityConfiguration|Manage profiles"
msgstr ""
-msgid "SecurityConfiguration|Manage scans"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
@@ -32272,6 +33089,12 @@ msgstr ""
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr ""
+msgid "SecurityOrchestration|%{scanners}"
+msgstr ""
+
+msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -32287,6 +33110,12 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
+msgid "SecurityOrchestration|All scanners find"
+msgstr ""
+
+msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgstr ""
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
@@ -32302,12 +33131,21 @@ msgstr ""
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
+msgid "SecurityOrchestration|Edit network policy"
+msgstr ""
+
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
+msgid "SecurityOrchestration|Edit scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Edit scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Empty policy name"
msgstr ""
@@ -32317,6 +33155,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|If any scanner finds a newly detected critical vulnerability in an open merge request targeting the master branch, then require two approvals from any member of App security."
+msgstr ""
+
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -32329,9 +33170,21 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
+msgid "SecurityOrchestration|Network policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New network policy"
+msgstr ""
+
msgid "SecurityOrchestration|New policy"
msgstr ""
+msgid "SecurityOrchestration|New scan exection policy"
+msgstr ""
+
+msgid "SecurityOrchestration|New scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -32380,6 +33233,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
+msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
+msgstr ""
+
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr ""
@@ -32398,12 +33254,21 @@ msgstr ""
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan execution policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Scan execution policy allow to create rules which forces security scans for particular branches at certain time. Supported types are SAST, DAST, Secret detection, Container scan, License scan, API fuzzing, coverage-guided fuzzing."
+msgstr ""
+
msgid "SecurityOrchestration|Scan result"
msgstr ""
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
msgstr ""
+msgid "SecurityOrchestration|Scan result policy"
+msgstr ""
+
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr ""
@@ -32422,6 +33287,9 @@ msgstr ""
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Select policy"
+msgstr ""
+
msgid "SecurityOrchestration|Select security project"
msgstr ""
@@ -32431,10 +33299,13 @@ msgstr ""
msgid "SecurityOrchestration|Status"
msgstr ""
-msgid "SecurityOrchestration|Summary"
+msgid "SecurityOrchestration|Step 1: Choose a policy type"
msgstr ""
-msgid "SecurityOrchestration|The %{scanners} %{severities} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|Step 2: Policy details"
+msgstr ""
+
+msgid "SecurityOrchestration|Summary"
msgstr ""
msgid "SecurityOrchestration|There was a problem creating the new security policy"
@@ -32458,6 +33329,15 @@ msgstr ""
msgid "SecurityOrchestration|Update scan policies"
msgstr ""
+msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
+msgstr ""
+
+msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgstr ""
+
+msgid "SecurityOrchestration|View policy project"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr ""
@@ -32542,6 +33422,9 @@ msgstr ""
msgid "SecurityReports|Change status"
msgstr ""
+msgid "SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -32683,6 +33566,9 @@ msgstr ""
msgid "SecurityReports|Remove project from dashboard"
msgstr ""
+msgid "SecurityReports|Report has expired"
+msgstr ""
+
msgid "SecurityReports|Scan details"
msgstr ""
@@ -32707,7 +33593,7 @@ msgstr ""
msgid "SecurityReports|Severity"
msgstr ""
-msgid "SecurityReports|Software and container dependency survey"
+msgid "SecurityReports|Show %{pageSize} items"
msgstr ""
msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity. Those findings may still be a potential source of risk though. Please review these manually."
@@ -32719,16 +33605,19 @@ msgstr ""
msgid "SecurityReports|Status"
msgstr ""
-msgid "SecurityReports|Take survey"
+msgid "SecurityReports|Submit vulnerability"
msgstr ""
-msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
+msgid "SecurityReports|Take survey"
msgstr ""
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-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}."
+msgid "SecurityReports|The following security reports contain one or more vulnerability findings that could not be parsed and were not recorded. To investigate a report, download the artifacts in the job output. Ensure the security report conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
+msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
msgstr ""
msgid "SecurityReports|There was an error adding the comment."
@@ -32788,6 +33677,9 @@ msgstr ""
msgid "SecurityReports|Vulnerability Report"
msgstr ""
+msgid "SecurityReports|Warning parsing security reports"
+msgstr ""
+
msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipeline, it can happen. In any event, we ask that you double check your settings to make sure all security scanning jobs have passed successfully."
msgstr ""
@@ -32800,15 +33692,18 @@ msgstr ""
msgid "SecurityReports|You must sign in as an authorized user to see this report"
msgstr ""
-msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
-msgstr ""
-
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
msgstr ""
msgid "SecurityReports|scanned resources"
msgstr ""
+msgid "SecurityTraining|Primary Training"
+msgstr ""
+
+msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
+msgstr ""
+
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -32845,15 +33740,12 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
+msgid "Select a compliance framework to apply to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
-msgid "Select a group to invite"
-msgstr ""
-
msgid "Select a label"
msgstr ""
@@ -32992,6 +33884,9 @@ msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Select target branch or tag"
+msgstr ""
+
msgid "Select timezone"
msgstr ""
@@ -33328,6 +34223,9 @@ msgstr ""
msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set rate limits for searches performed by web or API requests."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -33373,6 +34271,9 @@ msgstr ""
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
+msgid "Set this number to 0 to disable the limit."
+msgstr ""
+
msgid "Set time estimate"
msgstr ""
@@ -33418,9 +34319,6 @@ msgstr ""
msgid "Set what should be replicated by this secondary site."
msgstr ""
-msgid "SetStatusModal|Add status emoji"
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -33674,6 +34572,9 @@ msgstr ""
msgid "Show the Open list"
msgstr ""
+msgid "Show thread"
+msgstr ""
+
msgid "Show whitespace changes"
msgstr ""
@@ -33840,6 +34741,9 @@ msgstr ""
msgid "Signed in"
msgstr ""
+msgid "Signed in to GitLab"
+msgstr ""
+
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -34011,6 +34915,9 @@ msgstr ""
msgid "Solution"
msgstr ""
+msgid "Some actions remove attention requests, like a reviewer approving or anyone merging the merge request."
+msgstr ""
+
msgid "Some changes are not shown"
msgstr ""
@@ -34020,6 +34927,9 @@ msgstr ""
msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
+msgid "Someone edited the file the same time you did. Please check out %{link_start}the file %{icon}%{link_end} and make sure your changes will not unintentionally remove theirs."
+msgstr ""
+
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -34059,9 +34969,6 @@ msgstr ""
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
-msgid "Something went wrong when toggling the button"
-msgstr ""
-
msgid "Something went wrong while adding your award. Please try again."
msgstr ""
@@ -34194,9 +35101,6 @@ msgstr ""
msgid "Something went wrong while updating assignees"
msgstr ""
-msgid "Something went wrong while updating work item. Please try again"
-msgstr ""
-
msgid "Something went wrong while updating your list settings"
msgstr ""
@@ -34620,6 +35524,9 @@ msgstr ""
msgid "Start free trial"
msgstr ""
+msgid "Start inputting changes and we will generate a YAML-file for you to add to your repository"
+msgstr ""
+
msgid "Start merge train"
msgstr ""
@@ -34764,6 +35671,9 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck| %{failed} failed, and %{pending} pending"
+msgstr ""
+
msgid "StatusCheck|%{failed} failed"
msgstr ""
@@ -34836,9 +35746,6 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
-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 ""
@@ -34887,6 +35794,9 @@ msgstr ""
msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
msgstr ""
+msgid "Step %{currentStep} of %{stepCount}"
+msgstr ""
+
msgid "Step 1."
msgstr ""
@@ -35052,10 +35962,10 @@ msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
-msgid "SubscriptionBanner|Export license usage file"
+msgid "SubscriptionBanner|Add new license"
msgstr ""
-msgid "SubscriptionBanner|Upload new license"
+msgid "SubscriptionBanner|Export license usage file"
msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
@@ -35436,8 +36346,9 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr ""
-msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgid "SuperSonics|User in subscription"
+msgid_plural "SuperSonics|Users in subscription"
+msgstr[0] ""
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -35580,12 +36491,6 @@ msgstr ""
msgid "System Info"
msgstr ""
-msgid "System OAuth applications"
-msgstr ""
-
-msgid "System OAuth applications don't belong to any user and can only be managed by admins"
-msgstr ""
-
msgid "System default (%{default})"
msgstr ""
@@ -35742,6 +36647,12 @@ msgstr ""
msgid "Target branch"
msgstr ""
+msgid "Target branch or tag"
+msgstr ""
+
+msgid "Target roles"
+msgstr ""
+
msgid "Target-Branch"
msgstr ""
@@ -35775,9 +36686,6 @@ msgstr ""
msgid "Telephone number"
msgstr ""
-msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
-msgstr ""
-
msgid "Template"
msgstr ""
@@ -36181,9 +37089,6 @@ 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 CSV export you requested of all user memberships is attached to this email."
-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 ""
@@ -36214,6 +37119,9 @@ msgstr ""
msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs separated by commas."
msgstr ""
+msgid "The `/merge` quick action requires the SHA of the head of the branch."
+msgstr ""
+
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
msgstr ""
@@ -36226,6 +37134,9 @@ msgstr ""
msgid "The branch or tag does not exist"
msgstr ""
+msgid "The broadcast message displays only to users in projects and groups who have these roles."
+msgstr ""
+
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
@@ -36247,12 +37158,18 @@ msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
-msgid "The contact does not belong to the issue group or an ancestor"
+msgid "The contact does not belong to the issue group's root ancestor"
msgstr ""
msgid "The content editor may change the markdown formatting style of the document, which may not match your original markdown style."
msgstr ""
+msgid "The content for this wiki page failed to load. To fix this error, reload the page."
+msgstr ""
+
+msgid "The content for this wiki page failed to render."
+msgstr ""
+
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr ""
@@ -36545,6 +37462,9 @@ msgstr ""
msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
msgstr ""
+msgid "The related CI build failed."
+msgstr ""
+
msgid "The remote mirror URL is invalid."
msgstr ""
@@ -36554,6 +37474,12 @@ msgstr ""
msgid "The remote repository is being updated..."
msgstr ""
+msgid "The report artifact provided by the CI build couldn't be parsed."
+msgstr ""
+
+msgid "The report has been successfully prepared."
+msgstr ""
+
msgid "The repository can be committed to, and issues, comments and other entities can be created."
msgstr ""
@@ -36575,6 +37501,9 @@ msgstr ""
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
+msgid "The scan has been created."
+msgstr ""
+
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -36587,6 +37516,9 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source project of this merge request has been removed."
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -36872,9 +37804,6 @@ 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 ""
@@ -37016,6 +37945,9 @@ msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
+msgid "Things to be aware of before transferring:"
+msgstr ""
+
msgid "Third Party Advisory Link"
msgstr ""
@@ -37028,7 +37960,7 @@ msgstr ""
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
-msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
+msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr ""
msgid "This %{noteableTypeText} is locked."
@@ -37055,7 +37987,7 @@ msgstr ""
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
msgstr ""
-msgid "This URL is already used for another link; duplicate URLs are not allowed"
+msgid "This URL already exists."
msgstr ""
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
@@ -37064,7 +37996,7 @@ msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back%{strongClose}"
+msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
msgstr ""
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
@@ -37151,6 +38083,12 @@ msgstr ""
msgid "This credential has expired"
msgstr ""
+msgid "This deployment is not waiting for approvals."
+msgstr ""
+
+msgid "This deployment job does not run automatically and must be started manually, but you do not have access to this job's protected environment. The job can only be started by a project member allowed to deploy to the environment."
+msgstr ""
+
msgid "This device has already been registered with us."
msgstr ""
@@ -37178,6 +38116,9 @@ msgstr ""
msgid "This environment is being re-deployed"
msgstr ""
+msgid "This environment is not protected."
+msgstr ""
+
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -37304,9 +38245,15 @@ msgstr ""
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
msgstr ""
+msgid "This job deploys to the protected environment \"%{environment}\" which requires approvals."
+msgstr ""
+
msgid "This job does not have a trace."
msgstr ""
+msgid "This job does not run automatically and must be started manually, but you do not have access to it."
+msgstr ""
+
msgid "This job has been canceled"
msgstr ""
@@ -37544,6 +38491,9 @@ msgstr ""
msgid "This suggestion already matches its content."
msgstr ""
+msgid "This title already exists."
+msgstr ""
+
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
@@ -38014,6 +38964,9 @@ msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
+msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr ""
@@ -38095,6 +39048,9 @@ msgstr ""
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
+msgid "To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed."
+msgstr ""
+
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
@@ -38113,7 +39069,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
-msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "To resolve this, try to:"
@@ -38263,9 +39219,6 @@ msgstr ""
msgid "Toggle the Performance Bar"
msgstr ""
-msgid "Toggle thread"
-msgstr ""
-
msgid "Toggled :%{name}: emoji award."
msgstr ""
@@ -38311,6 +39264,9 @@ msgstr ""
msgid "Topic avatar"
msgstr ""
+msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr ""
+
msgid "Topic name"
msgstr ""
@@ -38404,6 +39360,9 @@ msgstr ""
msgid "TransferGroup|Database is not supported."
msgstr ""
+msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
+msgstr ""
+
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr ""
@@ -38593,6 +39552,9 @@ msgstr ""
msgid "Try again?"
msgstr ""
+msgid "Try all GitLab features for free for 30 days. No credit card required."
+msgstr ""
+
msgid "Try all GitLab has to offer for 30 days."
msgstr ""
@@ -38797,6 +39759,9 @@ msgstr ""
msgid "Unable to load file contents. Try again later."
msgstr ""
+msgid "Unable to load refs"
+msgstr ""
+
msgid "Unable to load the diff"
msgstr ""
@@ -38833,6 +39798,9 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unable to verify the user"
+msgstr ""
+
msgid "Unapprove a merge request"
msgstr ""
@@ -38959,6 +39927,9 @@ msgstr ""
msgid "Unreachable"
msgstr ""
+msgid "Unrecognized approval status."
+msgstr ""
+
msgid "Unrecognized cluster type"
msgstr ""
@@ -39139,9 +40110,6 @@ msgstr ""
msgid "Upload File"
msgstr ""
-msgid "Upload License"
-msgstr ""
-
msgid "Upload New File"
msgstr ""
@@ -39160,9 +40128,6 @@ msgstr ""
msgid "Upload image"
msgstr ""
-msgid "Upload license"
-msgstr ""
-
msgid "Upload new file"
msgstr ""
@@ -39172,6 +40137,9 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
+msgid "Uploaded"
+msgstr ""
+
msgid "Uploading changes to terminal"
msgstr ""
@@ -39229,7 +40197,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}Group Settings &gt; Usage quotas%{strong_end}."
+msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
msgstr ""
msgid "UsageQuota|Git repository."
@@ -39466,6 +40434,9 @@ msgstr ""
msgid "Use GitLab Runner in AWS"
msgstr ""
+msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
@@ -39475,6 +40446,9 @@ msgstr ""
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
+msgid "Use banners and notifications to notify your users about scheduled maintenance, recent upgrades, and more."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -40279,9 +41253,6 @@ msgstr ""
msgid "View seat usage"
msgstr ""
-msgid "View setting"
-msgstr ""
-
msgid "View supported languages and frameworks"
msgstr ""
@@ -40306,6 +41277,9 @@ msgstr ""
msgid "Viewing commit"
msgstr ""
+msgid "Viewing projects and designs data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
+msgstr ""
+
msgid "Violation"
msgstr ""
@@ -40411,9 +41385,6 @@ msgstr ""
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
msgstr ""
-msgid "VulnerabilityManagement|At least one identifier is required"
-msgstr ""
-
msgid "VulnerabilityManagement|Change status"
msgstr ""
@@ -40435,6 +41406,9 @@ msgstr ""
msgid "VulnerabilityManagement|Fetching linked Jira issues"
msgstr ""
+msgid "VulnerabilityManagement|Identifier code and URL are required fields"
+msgstr ""
+
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
msgstr ""
@@ -40555,6 +41529,9 @@ msgstr ""
msgid "Vulnerability|Class"
msgstr ""
+msgid "Vulnerability|Cluster"
+msgstr ""
+
msgid "Vulnerability|Code Review"
msgstr ""
@@ -40651,9 +41628,6 @@ msgstr ""
msgid "Vulnerability|Scanner Provider"
msgstr ""
-msgid "Vulnerability|Secure Code Warrior"
-msgstr ""
-
msgid "Vulnerability|Security Audit"
msgstr ""
@@ -40699,6 +41673,9 @@ msgstr ""
msgid "Wait for the file to load to copy its contents"
msgstr ""
+msgid "Waiting for approval"
+msgstr ""
+
msgid "Waiting for merge (open and assigned)"
msgstr ""
@@ -40720,6 +41697,9 @@ msgstr ""
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
+msgid "Watch how"
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -41020,6 +42000,9 @@ msgstr ""
msgid "Webhooks|Wiki page events"
msgstr ""
+msgid "Website"
+msgstr ""
+
msgid "Website:"
msgstr ""
@@ -41065,9 +42048,6 @@ msgstr ""
msgid "What are project audit events?"
msgstr ""
-msgid "What are you searching for?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -41110,13 +42090,13 @@ msgstr ""
msgid "When enabled, SSH keys with no expiry date or an invalid expiration date are no longer accepted. Leave blank for no limit."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
+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."
+msgid "When enabled, job logs are collected by Datadog and displayed along with pipeline execution traces."
msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
@@ -41132,6 +42112,9 @@ msgstr[0] ""
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
msgstr ""
+msgid "When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, pipeline minutes, and users, and start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "When:"
msgstr ""
@@ -41279,9 +42262,6 @@ msgstr ""
msgid "WikiPage|An error occurred while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
-msgstr ""
-
msgid "WikiPage|Cancel"
msgstr ""
@@ -41306,12 +42286,6 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
-msgid "WikiPage|Get a richer editing experience"
-msgstr ""
-
-msgid "WikiPage|Keep editing"
-msgstr ""
-
msgid "WikiPage|Learn more."
msgstr ""
@@ -41324,18 +42298,6 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch me back to the classic editor."
-msgstr ""
-
-msgid "WikiPage|Switch to classic editor"
-msgstr ""
-
-msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-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 ""
-
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -41348,18 +42310,9 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
-msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
-msgstr ""
-
-msgid "WikiPage|Try this later"
-msgstr ""
-
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use the new editor"
-msgstr ""
-
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -41435,6 +42388,9 @@ msgstr ""
msgid "WorkItem|New Task"
msgstr ""
+msgid "WorkItem|Select type"
+msgstr ""
+
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
msgstr ""
@@ -41444,6 +42400,9 @@ msgstr ""
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
msgstr ""
+msgid "WorkItem|Something went wrong while updating the work item. Please try again."
+msgstr ""
+
msgid "WorkItem|Type"
msgstr ""
@@ -41654,6 +42613,12 @@ msgstr ""
msgid "You can always edit this later"
msgstr ""
+msgid "You can check it in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
+msgstr ""
+
+msgid "You can check it in your in your personal access tokens settings %{pat_link}."
+msgstr ""
+
msgid "You can create a new %{link}."
msgstr ""
@@ -41747,6 +42712,9 @@ msgstr ""
msgid "You can only edit files when you are on a branch"
msgstr ""
+msgid "You can only merge once the items above are resolved."
+msgstr ""
+
msgid "You can only transfer the project to namespaces you manage."
msgstr ""
@@ -41777,6 +42745,9 @@ msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
msgstr ""
+msgid "You cannot approve your own deployment."
+msgstr ""
+
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
@@ -41861,6 +42832,9 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
+msgid "You don't have permission to review this deployment. Contact the project or group owner for help."
+msgstr ""
+
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -41940,10 +42914,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
-msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
-msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance."
+msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr ""
msgid "You have no permissions"
@@ -42123,6 +43097,9 @@ msgstr ""
msgid "YouTube URL or ID"
msgstr ""
+msgid "Your %{doc_link_start}namespace%{doc_link_end}, %{strong_start}%{namespace_name}%{strong_end} has more than %{free_limit} members. From June 22, 2022, it will be limited to %{free_limit}, and the remaining members will get a %{link_start}status of Over limit%{link_end} and lose access to the namespace. You can go to the Usage Quotas page to manage which %{free_limit} members will remain in your namespace. To get more members, an owner can start a trial or upgrade to a paid tier."
+msgstr ""
+
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -42135,6 +43112,9 @@ msgstr ""
msgid "Your %{plan} subscription expires on %{expiry_date}"
msgstr ""
+msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
@@ -42426,7 +43406,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr ""
-msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license."
+msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr ""
msgid "Your subscription will expire in %{remaining_days} day."
@@ -42679,6 +43659,10 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "change"
+msgid_plural "changes"
+msgstr[0] ""
+
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -42773,6 +43757,15 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
+msgid "ciReport|Code Quality"
+msgstr ""
+
+msgid "ciReport|Code Quality failed loading results"
+msgstr ""
+
+msgid "ciReport|Code Quality test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -42851,6 +43844,15 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|License Compliance"
+msgstr ""
+
+msgid "ciReport|License Compliance failed loading results"
+msgstr ""
+
+msgid "ciReport|License Compliance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load Performance"
msgstr ""
@@ -42876,9 +43878,15 @@ msgstr ""
msgid "ciReport|Manage licenses"
msgstr ""
+msgid "ciReport|Manually Added"
+msgstr ""
+
msgid "ciReport|New"
msgstr ""
+msgid "ciReport|No changes to Code Quality."
+msgstr ""
+
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -42961,45 +43969,6 @@ msgstr ""
msgid "closed issue"
msgstr ""
-msgid "codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs."
-msgstr ""
-
-msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Got it"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
-
-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 ""
-
-msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
-
-msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
-
-msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
-
-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 ""
-
msgid "collect usage information"
msgstr ""
@@ -43018,7 +43987,7 @@ msgstr ""
msgid "compliance violation has already been recorded"
msgstr ""
-msgid "contact with same email already exists in group hierarchy"
+msgid "contacts can only be added to root groups"
msgstr ""
msgid "container registry images"
@@ -43122,6 +44091,9 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
+msgid "email address settings"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -43455,6 +44427,10 @@ msgstr ""
msgid "math|There was an error rendering this math block"
msgstr ""
+msgid "member"
+msgid_plural "members"
+msgstr[0] ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -43549,6 +44525,12 @@ msgstr ""
msgid "mrWidget|Approved by you and others"
msgstr ""
+msgid "mrWidget|Assign yourself to these issues"
+msgstr ""
+
+msgid "mrWidget|Assign yourself to this issue"
+msgstr ""
+
msgid "mrWidget|Cancel auto-merge"
msgstr ""
@@ -43662,9 +44644,6 @@ msgstr ""
msgid "mrWidget|Merge failed."
msgstr ""
-msgid "mrWidget|Merge locally"
-msgstr ""
-
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
msgstr ""
@@ -43737,6 +44716,9 @@ msgstr ""
msgid "mrWidget|Resolve conflicts"
msgstr ""
+msgid "mrWidget|Resolve locally"
+msgstr ""
+
msgid "mrWidget|Revert"
msgstr ""
@@ -43857,9 +44839,6 @@ msgstr ""
msgid "my-channel"
msgstr ""
-msgid "n/a"
-msgstr "ä¸é©ç”¨"
-
msgid "need attention"
msgstr ""
@@ -43920,6 +44899,9 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "organizations can only be added to root groups"
+msgstr ""
+
msgid "other card matches"
msgstr ""
@@ -44005,9 +44987,6 @@ msgstr ""
msgid "project access tokens"
msgstr ""
-msgid "project avatar"
-msgstr ""
-
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -44207,9 +45186,6 @@ msgstr ""
msgid "the correct format."
msgstr ""
-msgid "the file"
-msgstr ""
-
msgid "the following epic(s)"
msgstr ""
diff --git a/metrics_server/metrics_server.rb b/metrics_server/metrics_server.rb
index 2aadc63d65d..695f3a65930 100644
--- a/metrics_server/metrics_server.rb
+++ b/metrics_server/metrics_server.rb
@@ -84,7 +84,7 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
end
FileUtils.mkdir_p(@metrics_dir, mode: 0700)
- ::Prometheus::CleanupMultiprocDirService.new.execute if @wipe_metrics_dir
+ ::Prometheus::CleanupMultiprocDirService.new(@metrics_dir).execute if @wipe_metrics_dir
# We need to `warmup: true` since otherwise the sampler and exporter threads enter
# a race where not all Prometheus db files will be visible to the exporter, resulting
diff --git a/package.json b/package.json
index 9116f040048..8080ac4f664 100644
--- a/package.json
+++ b/package.json
@@ -41,13 +41,13 @@
"storybook:install": "yarn --cwd ./storybook install",
"storybook:build": "yarn --cwd ./storybook build",
"storybook:start": "./scripts/frontend/start_storybook.sh",
- "stylelint-create-utility-map": "node scripts/frontend/stylelint/stylelint-utility-map.js",
+ "stylelint-create-utility-map": "node scripts/frontend/stylelint/stylelint_utility_map.js",
"webpack": "NODE_OPTIONS=\"--max-old-space-size=3584\" webpack --config config/webpack.config.js",
"webpack-vendor": "NODE_OPTIONS=\"--max-old-space-size=3584\" webpack --config config/webpack.vendor.config.js",
"webpack-prod": "NODE_OPTIONS=\"--max-old-space-size=3584\" NODE_ENV=production webpack --config config/webpack.config.js"
},
"dependencies": {
- "@apollo/client": "^3.3.11",
+ "@apollo/client": "^3.5.10",
"@babel/core": "^7.10.1",
"@babel/plugin-proposal-class-properties": "^7.10.1",
"@babel/plugin-proposal-json-strings": "^7.10.1",
@@ -56,11 +56,11 @@
"@babel/preset-env": "^7.10.1",
"@gitlab/at.js": "1.5.7",
"@gitlab/favicon-overlay": "2.0.0",
- "@gitlab/svgs": "2.6.0",
- "@gitlab/ui": "37.3.0",
+ "@gitlab/svgs": "2.8.0",
+ "@gitlab/ui": "38.8.1",
"@gitlab/visual-review-tools": "1.6.1",
- "@rails/actioncable": "6.1.4-6",
- "@rails/ujs": "6.1.4-6",
+ "@rails/actioncable": "6.1.4-7",
+ "@rails/ujs": "6.1.4-7",
"@sentry/browser": "5.30.0",
"@sourcegraph/code-host-integration": "0.0.60",
"@tiptap/core": "^2.0.0-beta.174",
@@ -95,11 +95,11 @@
"@tiptap/vue-2": "^2.0.0-beta.77",
"@toast-ui/editor": "^2.5.2",
"@toast-ui/vue-editor": "^2.5.2",
- "apollo-upload-client": "^14.1.3",
+ "apollo-upload-client": "15.0.0",
"autosize": "^5.0.1",
"aws-sdk": "^2.637.0",
"axios": "^0.24.0",
- "babel-loader": "^8.2.2",
+ "babel-loader": "^8.2.4",
"babel-plugin-lodash": "^3.3.4",
"bootstrap": "4.5.3",
"cache-loader": "^4.1.0",
@@ -109,7 +109,7 @@
"codesandbox-api": "0.0.23",
"compression-webpack-plugin": "^5.0.2",
"copy-webpack-plugin": "^6.4.1",
- "core-js": "^3.21.1",
+ "core-js": "^3.22.0",
"cron-validator": "^1.1.1",
"cronstrue": "^1.122.0",
"cropper": "^2.3.0",
@@ -157,18 +157,20 @@
"portal-vue": "^2.1.7",
"postcss": "8.4.5",
"prismjs": "^1.21.0",
- "prosemirror-markdown": "1.7.1",
+ "prosemirror-markdown": "1.8.0",
"prosemirror-model": "^1.16.1",
"prosemirror-state": "^1.3.4",
"prosemirror-tables": "^1.1.1",
- "prosemirror-view": "^1.23.7",
+ "prosemirror-view": "^1.23.10",
"raphael": "^2.2.7",
"raw-loader": "^4.0.2",
+ "rehype-raw": "^6.1.1",
+ "remark-parse": "^10.0.1",
+ "remark-rehype": "^10.1.0",
"scrollparent": "^2.0.1",
"select2": "3.5.2-browserify",
"smooshpack": "^0.0.62",
"sortablejs": "^1.10.2",
- "sql.js": "^0.4.0",
"string-hash": "1.1.3",
"style-loader": "^2.0.0",
"swagger-ui-dist": "4.8.0",
@@ -176,6 +178,7 @@
"three-orbit-controls": "^82.1.0",
"three-stl-loader": "^1.0.4",
"timeago.js": "^4.0.2",
+ "unified": "^10.1.2",
"url-loader": "^4.1.1",
"uuid": "8.1.0",
"visibilityjs": "^1.2.4",
@@ -191,7 +194,7 @@
"vuex": "^3.6.0",
"web-vitals": "^0.2.4",
"webpack": "^4.46.0",
- "webpack-bundle-analyzer": "^4.4.2",
+ "webpack-bundle-analyzer": "^4.5.0",
"webpack-cli": "^4.9.2",
"webpack-stats-plugin": "^0.3.1",
"worker-loader": "^2.0.0",
@@ -200,12 +203,15 @@
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.10.1",
- "@gitlab/eslint-plugin": "11.0.0",
+ "@gitlab/eslint-plugin": "12.0.1",
"@gitlab/stylelint-config": "4.0.0",
"@graphql-eslint/eslint-plugin": "3.0.0",
"@testing-library/dom": "^7.16.2",
+ "@types/jest": "^26.0.24",
"@vue/test-utils": "1.3.0",
"acorn": "^6.3.0",
+ "ajv": "^8.10.0",
+ "ajv-formats": "^2.1.1",
"axios-mock-adapter": "^1.15.0",
"babel-jest": "^26.5.2",
"babel-plugin-dynamic-import-node": "^2.3.3",
@@ -250,17 +256,16 @@
"stylelint": "^14.3.0",
"timezone-mock": "^1.0.8",
"vue-jest": "4.0.1",
- "webpack-dev-server": "4.7.4",
+ "webpack-dev-server": "4.8.1",
"xhr-mock": "^2.5.1",
"yarn-check-webpack-plugin": "^1.2.0",
- "yarn-deduplicate": "^3.1.0"
+ "yarn-deduplicate": "^4.0.0"
},
"blockedDependencies": {
"bootstrap-vue": "https://docs.gitlab.com/ee/development/fe_guide/dependencies.html#bootstrapvue"
},
"resolutions": {
- "@apollo/client/subscriptions-transport-ws": "0.11.0",
- "chokidar": "^3.4.0",
+ "chokidar": "^3.5.3",
"@types/node": "14.17.5"
},
"engines": {
diff --git a/qa/.confiner/master.yml b/qa/.confiner/master.yml
new file mode 100644
index 00000000000..bfb44facd7d
--- /dev/null
+++ b/qa/.confiner/master.yml
@@ -0,0 +1,34 @@
+- name: Quarantine E2E tests in Master that fail consistently
+ plugin:
+ name: gitlab # https://gitlab.com/gitlab-org/quality/confiner/-/blob/main/doc/plugins/gitlab.md
+ args:
+ threshold: 3 # 3 failures
+ private_token: $QA_GITLAB_CI_TOKEN
+ project_id: gitlab-org/gitlab-qa-mirror # https://gitlab.com/gitlab-org/gitlab-qa-mirror/
+ target_project: gitlab-org/gitlab
+ failure_issue_labels: QA,Quality
+ failure_issue_prefix: "Failure in "
+ pwd: qa # E2E specs reside in the qa subdirectory
+ timeout: 30
+ ref: master
+ actions:
+ - quarantine
+
+- name: Dequarantine E2E tests in Master that pass consistently
+ plugin:
+ name: gitlab # https://gitlab.com/gitlab-org/quality/confiner/-/blob/main/doc/plugins/gitlab.md
+ args:
+ threshold: 10 # at least 10 passes consecutively with no failures to be a candidate for dequarantine
+ private_token: $QA_GITLAB_CI_TOKEN
+
+ # we do not run quarantined jobs automatically on master, but we still commit to master
+ project_id: gitlab-org/quality/nightly # https://gitlab.com/gitlab-org/quality/nightly/
+ target_project: gitlab-org/gitlab # https://gitlab.com/gitlab-org/gitlab
+ failure_issue_labels: QA,Quality
+ failure_issue_prefix: "Failure in "
+ pwd: qa # E2E specs reside in the qa subdirectory
+ timeout: 30
+ ref: master
+ job_pattern: '.+-quarantine'
+ actions:
+ - dequarantine
diff --git a/qa/.confiner/nightly.yml b/qa/.confiner/nightly.yml
new file mode 100644
index 00000000000..78089525b0e
--- /dev/null
+++ b/qa/.confiner/nightly.yml
@@ -0,0 +1,19 @@
+- name: Quarantine E2E tests in Nightly that fail consistently
+ plugin:
+ name: gitlab
+ args:
+ threshold: 3
+ private_token: $QA_GITLAB_CI_TOKEN
+ project_id: gitlab-org/quality/nightly # https://gitlab.com/gitlab-org/quality/nightly/
+ target_project: gitlab-org/gitlab
+ failure_issue_labels: QA,Quality,found:nightly
+ failure_issue_prefix: "Failure in "
+ pwd: qa
+ timeout: 30
+ ref: master
+ environment:
+ name: nightly
+ pattern: 'pipeline: :nightly'
+ job_pattern: '^((?!quarantine).)*$'
+ actions:
+ - quarantine
diff --git a/qa/.confiner/quarantine.yml b/qa/.confiner/quarantine.yml
deleted file mode 100644
index 6534d72525d..00000000000
--- a/qa/.confiner/quarantine.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-- name: Quarantine E2E tests that fail consistently
- plugin:
- name: gitlab # https://gitlab.com/gitlab-org/quality/confiner/-/blob/main/doc/plugins/gitlab.md
- args:
- threshold: 3 # 3 failures
- private_token: $QA_GITLAB_CI_TOKEN
- project_id: gitlab-org/gitlab-qa-mirror # https://gitlab.com/gitlab-org/gitlab-qa-mirror/
- target_project: gitlab-org/gitlab
- failure_issue_labels: QA,Quality
- failure_issue_prefix: "Failure in "
- pwd: qa # E2E specs reside in the qa subdirectory
- timeout: 30
- ref: master
- actions:
- - quarantine
diff --git a/qa/.gitignore b/qa/.gitignore
index b54b8666e28..3c5db4b565e 100644
--- a/qa/.gitignore
+++ b/qa/.gitignore
@@ -1,6 +1,8 @@
tmp/
+reports/
+no_of_examples/
+
.ruby-version
.tool-versions
.ruby-gemset
urls.yml
-reports/
diff --git a/qa/.rspec_internal b/qa/.rspec_internal
new file mode 100644
index 00000000000..ea32ca1e093
--- /dev/null
+++ b/qa/.rspec_internal
@@ -0,0 +1,4 @@
+--force-color
+--order random
+--format documentation
+--require specs/spec_helper
diff --git a/qa/Gemfile b/qa/Gemfile
index 05acab5653f..b504d6d4e90 100644
--- a/qa/Gemfile
+++ b/qa/Gemfile
@@ -3,7 +3,7 @@
source 'https://rubygems.org'
gem 'gitlab-qa', require: 'gitlab/qa'
-gem 'activesupport', '~> 6.1.4.6' # This should stay in sync with the root's Gemfile
+gem 'activesupport', '~> 6.1.4.7' # This should stay in sync with the root's Gemfile
gem 'allure-rspec', '~> 2.16.0'
gem 'capybara', '~> 3.35.0'
gem 'capybara-screenshot', '~> 1.0.23'
@@ -30,7 +30,7 @@ gem 'terminal-table', '~> 3.0.0', require: false
gem 'slack-notifier', '~> 2.4', require: false
gem 'fog-google', '~> 1.17', require: false
-gem 'confiner', '~> 0.2'
+gem 'confiner', '~> 0.3'
gem 'chemlab', '~> 0.9'
gem 'chemlab-library-www-gitlab-com', '~> 0.1'
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index 4be8adaef33..c4809a17f66 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -57,8 +57,8 @@ GEM
concord (0.1.5)
adamantium (~> 0.2.0)
equalizer (~> 0.0.9)
- concurrent-ruby (1.1.9)
- confiner (0.2.3)
+ concurrent-ruby (1.1.10)
+ confiner (0.3.0)
gitlab (>= 4.17)
zeitwerk (~> 2.5.1)
declarative (0.0.20)
@@ -357,14 +357,14 @@ PLATFORMS
ruby
DEPENDENCIES
- activesupport (~> 6.1.4.6)
+ activesupport (~> 6.1.4.7)
airborne (~> 0.3.4)
allure-rspec (~> 2.16.0)
capybara (~> 3.35.0)
capybara-screenshot (~> 1.0.23)
chemlab (~> 0.9)
chemlab-library-www-gitlab-com (~> 0.1)
- confiner (~> 0.2)
+ confiner (~> 0.3)
deprecation_toolkit (~> 1.5.1)
faker (~> 2.19, >= 2.19.0)
fog-google (~> 1.17)
diff --git a/qa/qa/fixtures/package_managers/npm/npm_upload_install_package_project.yaml.erb b/qa/qa/fixtures/package_managers/npm/npm_upload_install_package_project.yaml.erb
index 8d94d03ef9b..5f2ff31b318 100644
--- a/qa/qa/fixtures/package_managers/npm/npm_upload_install_package_project.yaml.erb
+++ b/qa/qa/fixtures/package_managers/npm/npm_upload_install_package_project.yaml.erb
@@ -16,6 +16,7 @@ deploy:
install:
stage: install
script:
+ - echo "//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=<%= auth_token %>">.npmrc
- "npm config set @<%= registry_scope %>:registry <%= gitlab_address_with_port %>/api/v4/projects/${CI_PROJECT_ID}/packages/npm/"
- "npm install <%= package.name %>"
cache:
diff --git a/qa/qa/fixtures/script_extensions/test.html b/qa/qa/fixtures/script_extensions/test.html
new file mode 100644
index 00000000000..0be2c080fd8
--- /dev/null
+++ b/qa/qa/fixtures/script_extensions/test.html
@@ -0,0 +1,6 @@
+<html>
+ <head></head>
+ <body>
+ <h1>Hello world</h1>
+ </body>
+</html>
diff --git a/qa/qa/flow/pipeline.rb b/qa/qa/flow/pipeline.rb
index 999f352e834..d19b2530bb8 100644
--- a/qa/qa/flow/pipeline.rb
+++ b/qa/qa/flow/pipeline.rb
@@ -5,17 +5,24 @@ module QA
module Pipeline
module_function
- # In some cases we don't need to wait for anything, blocked, running or pending is acceptable
- # Some cases only we do need pipeline to finish with expected condition (completed, succeeded or replicated)
- def visit_latest_pipeline(pipeline_condition: nil)
+ # Acceptable statuses:
+ # canceled, created, failed, manual, passed
+ # pending, running, skipped
+ def visit_latest_pipeline(status: nil, wait: nil, skip_wait: true)
Page::Project::Menu.perform(&:click_ci_cd_pipelines)
- Page::Project::Pipeline::Index.perform(&:"wait_for_latest_pipeline_#{pipeline_condition}") if pipeline_condition
- Page::Project::Pipeline::Index.perform(&:click_on_latest_pipeline)
+ Page::Project::Pipeline::Index.perform do |index|
+ index.has_any_pipeline?(wait: wait)
+ index.wait_for_latest_pipeline(status: status, wait: wait) if status || !skip_wait
+ index.click_on_latest_pipeline
+ end
end
- def wait_for_latest_pipeline(pipeline_condition:)
+ def wait_for_latest_pipeline(status: nil, wait: nil)
Page::Project::Menu.perform(&:click_ci_cd_pipelines)
- Page::Project::Pipeline::Index.perform(&:"wait_for_latest_pipeline_#{pipeline_condition}")
+ Page::Project::Pipeline::Index.perform do |index|
+ index.has_any_pipeline?(wait: wait)
+ index.wait_for_latest_pipeline(status: status, wait: wait)
+ end
end
end
end
diff --git a/qa/qa/page/admin/settings/component/performance_bar.rb b/qa/qa/page/admin/settings/component/performance_bar.rb
index 9e92fa362fb..ebf0e744b5e 100644
--- a/qa/qa/page/admin/settings/component/performance_bar.rb
+++ b/qa/qa/page/admin/settings/component/performance_bar.rb
@@ -12,7 +12,7 @@ module QA
end
def enable_performance_bar
- check_element(:enable_performance_bar_checkbox)
+ check_element(:enable_performance_bar_checkbox, true)
Capybara.current_session.driver.browser.manage.add_cookie(name: 'perf_bar_enabled', value: 'true')
end
diff --git a/qa/qa/page/admin/settings/component/snowplow.rb b/qa/qa/page/admin/settings/component/snowplow.rb
index e05679feac3..c7f103e29a8 100644
--- a/qa/qa/page/admin/settings/component/snowplow.rb
+++ b/qa/qa/page/admin/settings/component/snowplow.rb
@@ -31,11 +31,11 @@ module QA
private
def check_snowplow_enabled_checkbox
- check_element(:snowplow_enabled_checkbox)
+ check_element(:snowplow_enabled_checkbox, true)
end
def uncheck_snowplow_enabled_checkbox
- uncheck_element(:snowplow_enabled_checkbox)
+ uncheck_element(:snowplow_enabled_checkbox, true)
end
def click_save_changes_button
diff --git a/qa/qa/page/admin/settings/component/usage_statistics.rb b/qa/qa/page/admin/settings/component/usage_statistics.rb
index 0275b7ae926..c296e63e28e 100644
--- a/qa/qa/page/admin/settings/component/usage_statistics.rb
+++ b/qa/qa/page/admin/settings/component/usage_statistics.rb
@@ -11,7 +11,7 @@ module QA
end
def has_disabled_usage_data_checkbox?
- has_element?(:enable_usage_data_checkbox, disabled: true)
+ has_element?(:enable_usage_data_checkbox, disabled: true, visible: false)
end
end
end
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 526dd25ccc9..83db8bc0fd6 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -133,7 +133,9 @@ module QA
end
def all_elements(name, **kwargs)
- if kwargs.keys.none? { |key| [:minimum, :maximum, :count, :between].include?(key) }
+ all_args = [:minimum, :maximum, :count, :between]
+
+ if kwargs.keys.none? { |key| all_args.include?(key) }
raise ArgumentError, "Please use :minimum, :maximum, :count, or :between so that all is more reliable"
end
@@ -247,6 +249,8 @@ module QA
else
find_element(name, **original_kwargs).disabled? == disabled
end
+ rescue Capybara::ElementNotFound
+ false
end
# Check for the element before waiting for requests, just in case unrelated requests are in progress.
@@ -467,8 +471,8 @@ module QA
return element_when_flag_disabled if has_element?(element_when_flag_disabled)
raise ElementNotFound,
- "Could not find the expected element as #{element_when_flag_enabled} or #{element_when_flag_disabled}." \
- "The relevant feature flag is #{feature_flag}"
+ "Could not find the expected element as #{element_when_flag_enabled} or #{element_when_flag_disabled}." \
+ "The relevant feature flag is #{feature_flag}"
end
end
end
diff --git a/qa/qa/page/component/access_tokens.rb b/qa/qa/page/component/access_tokens.rb
index 3c8a6cf6a1d..6a9249621e1 100644
--- a/qa/qa/page/component/access_tokens.rb
+++ b/qa/qa/page/component/access_tokens.rb
@@ -19,7 +19,7 @@ module QA
end
base.view 'app/views/shared/tokens/_scopes_form.html.haml' do
- element :api_checkbox, '#{scope}_checkbox' # rubocop:disable QA/ElementWithPattern, Lint/InterpolationCheck
+ element :api_label, '#{scope}_label' # rubocop:disable QA/ElementWithPattern, Lint/InterpolationCheck
end
base.view 'app/views/shared/access_tokens/_created_container.html.haml' do
@@ -36,7 +36,7 @@ module QA
end
def check_api
- check_element(:api_checkbox)
+ click_element(:api_label)
end
def click_create_token_button
diff --git a/qa/qa/page/component/confirm_modal.rb b/qa/qa/page/component/confirm_modal.rb
index a90be76c879..76200490f66 100644
--- a/qa/qa/page/component/confirm_modal.rb
+++ b/qa/qa/page/component/confirm_modal.rb
@@ -8,10 +8,14 @@ module QA
def self.included(base)
super
+
+ base.view 'app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue' do
+ element :confirm_ok_button
+ end
end
def fill_confirmation_text(text)
- fill_element :confirm_input, text
+ fill_element(:confirm_input, text)
end
def wait_for_confirm_button_enabled
@@ -22,7 +26,11 @@ module QA
def confirm_transfer
wait_for_confirm_button_enabled
- click_element :confirm_button
+ click_element(:confirm_button)
+ end
+
+ def click_confirmation_ok_button
+ click_element(:confirm_ok_button)
end
end
end
diff --git a/qa/qa/page/component/members_filter.rb b/qa/qa/page/component/members_filter.rb
index ac07fe7e9fa..fce4560d255 100644
--- a/qa/qa/page/component/members_filter.rb
+++ b/qa/qa/page/component/members_filter.rb
@@ -10,15 +10,14 @@ module QA
super
base.view 'app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue' do
- element :members_filtered_search_bar_content
+ element :search_bar_input
+ element :search_button
end
end
def search_member(username)
- # TODO: Update the two actions below to use direct qa selectors once this is implemented:
- # https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1688
- find_element(:members_filtered_search_bar_content).find('input').set(username)
- find('.gl-search-box-by-click-search-button').click
+ fill_element :search_bar_input, username
+ click_element :search_button
end
end
end
diff --git a/qa/qa/page/component/wiki_page_form.rb b/qa/qa/page/component/wiki_page_form.rb
index 8f504b784b2..74b6c6b2d5e 100644
--- a/qa/qa/page/component/wiki_page_form.rb
+++ b/qa/qa/page/component/wiki_page_form.rb
@@ -14,7 +14,6 @@ module QA
element :wiki_content_textarea
element :wiki_message_textbox
element :wiki_submit_button
- element :try_new_editor_container
element :editing_mode_button
end
diff --git a/qa/qa/page/dashboard/todos.rb b/qa/qa/page/dashboard/todos.rb
index d8baadcf73d..d5660823118 100644
--- a/qa/qa/page/dashboard/todos.rb
+++ b/qa/qa/page/dashboard/todos.rb
@@ -17,7 +17,11 @@ module QA
end
def has_todo_list?
- has_element? :todo_item_container
+ has_element?(:todo_item_container)
+ end
+
+ def has_no_todo_list?
+ has_no_element?(:todo_item_container)
end
def has_latest_todo_item_with_content?(action, title)
diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb
index c34b8f33a5d..d8b7bb90437 100644
--- a/qa/qa/page/main/login.rb
+++ b/qa/qa/page/main/login.rb
@@ -130,6 +130,10 @@ module QA
has_css?(".active", text: 'Standard')
end
+ def has_arkose_labs_token?
+ has_css?('[name="arkose_labs_token"][value]', visible: false)
+ end
+
def switch_to_sign_in_tab
click_element :sign_in_tab
end
@@ -174,6 +178,17 @@ module QA
fill_element :login_field, user.username
fill_element :password_field, user.password
+
+ if Runtime::Env.running_on_dot_com?
+ # Arkose only appears in staging.gitlab.com, gitlab.com, etc...
+
+ # Wait until the ArkoseLabs challenge has initialized
+ Support::WaitForRequests.wait_for_requests
+ Support::Waiter.wait_until(max_duration: 5, reload_page: false, raise_on_failure: false) do
+ has_arkose_labs_token?
+ end
+ end
+
click_element :sign_in_button
Support::WaitForRequests.wait_for_requests
diff --git a/qa/qa/page/main/menu.rb b/qa/qa/page/main/menu.rb
index e3bb585955b..0bb74455f81 100644
--- a/qa/qa/page/main/menu.rb
+++ b/qa/qa/page/main/menu.rb
@@ -45,6 +45,14 @@ module QA
element :search_term_field
end
+ view 'app/views/layouts/_header_search.html.haml' do
+ element :search_box
+ end
+
+ view 'app/assets/javascripts/header_search/components/app.vue' do
+ element :search_term_field
+ end
+
def go_to_groups
within_groups_menu do
click_element(:menu_item_link, title: 'Your groups')
@@ -146,6 +154,7 @@ module QA
end
def search_for(term)
+ click_element(:search_box)
fill_element :search_term_field, "#{term}\n"
end
diff --git a/qa/qa/page/project/import/github.rb b/qa/qa/page/project/import/github.rb
index 47f7e701ae8..89d044bac8d 100644
--- a/qa/qa/page/project/import/github.rb
+++ b/qa/qa/page/project/import/github.rb
@@ -75,11 +75,10 @@ module QA
# @return [Boolean]
def has_imported_project?(gh_project_name, wait: QA::Support::WaitForRequests::DEFAULT_MAX_WAIT_TIME)
within_element(:project_import_row, source_project: gh_project_name, skip_finished_loading_check: true) do
- # TODO: remove retrier with reload:true once https://gitlab.com/gitlab-org/gitlab/-/issues/292861 is fixed
wait_until(
max_duration: wait,
sleep_interval: 5,
- reload: true,
+ reload: false,
skip_finished_loading_check_on_refresh: true
) do
has_element?(:import_status_indicator, text: "Complete")
diff --git a/qa/qa/page/project/infrastructure/kubernetes/index.rb b/qa/qa/page/project/infrastructure/kubernetes/index.rb
index 0424682179e..34d2ad55429 100644
--- a/qa/qa/page/project/infrastructure/kubernetes/index.rb
+++ b/qa/qa/page/project/infrastructure/kubernetes/index.rb
@@ -6,12 +6,13 @@ module QA
module Infrastructure
module Kubernetes
class Index < Page::Base
- view 'app/assets/javascripts/clusters_list/components/clusters_view_all.vue' do
- element :connect_existing_cluster_button
+ view 'app/assets/javascripts/clusters_list/components/clusters_actions.vue' do
+ element :clusters_actions_button
end
def connect_existing_cluster
- click_link 'Connect existing cluster'
+ within_element(:clusters_actions_button) { click_button(class: 'dropdown-toggle-split') }
+ click_link 'Connect a cluster (certificate - deprecated)'
end
def has_cluster?(cluster)
diff --git a/qa/qa/page/project/new.rb b/qa/qa/page/project/new.rb
index 340e40127c9..26fff85dd99 100644
--- a/qa/qa/page/project/new.rb
+++ b/qa/qa/page/project/new.rb
@@ -13,6 +13,7 @@ module QA
view 'app/views/projects/_new_project_fields.html.haml' do
element :initialize_with_readme_checkbox
+ element :initialize_with_sast_checkbox
element :project_name
element :project_path
element :project_description
@@ -20,10 +21,6 @@ module QA
element :visibility_radios
end
- view 'app/views/projects/_new_project_initialize_with_sast.html.haml' do
- element :initialize_with_sast_checkbox
- end
-
view 'app/views/projects/project_templates/_template.html.haml' do
element :use_template_button
element :template_option_row
diff --git a/qa/qa/page/project/pipeline/index.rb b/qa/qa/page/project/pipeline/index.rb
index d088ba76bc0..70ac35eeffe 100644
--- a/qa/qa/page/project/pipeline/index.rb
+++ b/qa/qa/page/project/pipeline/index.rb
@@ -21,54 +21,46 @@ module QA
element :run_pipeline_button
end
- def click_on_latest_pipeline
- all_elements(:pipeline_url_link, minimum: 1, wait: QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME).first.click
- end
-
- def wait_for_latest_pipeline_succeeded
- wait_for_latest_pipeline_status { has_selector?(".ci-status-icon-success") }
+ view 'app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue' do
+ element :pipeline_row_container
end
- def wait_for_latest_pipeline_completed
- wait_for_latest_pipeline_status { has_selector?(".ci-status-icon-success") || has_selector?(".ci-status-icon-failed") }
+ def latest_pipeline
+ all_elements(:pipeline_row_container, minimum: 1).first
end
- def wait_for_latest_pipeline_skipped
- wait_for_latest_pipeline_status { has_text?('skipped') }
+ def latest_pipeline_status
+ latest_pipeline.find(element_selector_css(:pipeline_commit_status)).text
end
- def wait_for_latest_pipeline_status
- wait_until(max_duration: 90, reload: true, sleep_interval: 5) { has_pipeline? }
+ # If no status provided, wait for pipeline to complete
+ def wait_for_latest_pipeline(status: nil, wait: nil, reload: false)
+ wait ||= Support::Repeater::DEFAULT_MAX_WAIT_TIME
+ finished_status = %w[passed failed canceled skipped manual]
- wait_until(reload: false, max_duration: 360) do
- within_element_by_index(:pipeline_commit_status, 0) { yield }
+ wait_until(max_duration: wait, reload: reload, sleep_interval: 1) do
+ status ? latest_pipeline_status == status : finished_status.include?(latest_pipeline_status)
end
end
- def wait_for_latest_pipeline_success_or_retry
- wait_for_latest_pipeline_completion
-
- if has_text?('failed')
- click_element :pipeline_retry_button
- wait_for_latest_pipeline_success
- end
- end
-
- def has_pipeline?
- has_element? :pipeline_url_link
+ def has_any_pipeline?(wait: nil)
+ wait ||= Support::Repeater::DEFAULT_MAX_WAIT_TIME
+ wait_until(max_duration: wait) { has_element?(:pipeline_row_container) }
end
def has_no_pipeline?
- has_no_element? :pipeline_url_link
+ has_no_element?(:pipeline_row_container)
end
def click_run_pipeline_button
- click_element :run_pipeline_button, Page::Project::Pipeline::New
+ click_element(:run_pipeline_button, Page::Project::Pipeline::New)
+ end
+
+ def click_on_latest_pipeline
+ latest_pipeline.find(element_selector_css(:pipeline_url_link)).click
end
end
end
end
end
end
-
-QA::Page::Project::Pipeline::Index.prepend_mod_with('Page::Project::Pipeline::Index', namespace: QA)
diff --git a/qa/qa/page/project/pipeline/new.rb b/qa/qa/page/project/pipeline/new.rb
index 644a21b46e9..96a48e6240a 100644
--- a/qa/qa/page/project/pipeline/new.rb
+++ b/qa/qa/page/project/pipeline/new.rb
@@ -7,10 +7,20 @@ module QA
class New < QA::Page::Base
view 'app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue' do
element :run_pipeline_button, required: true
+ element :ci_variable_row_container
+ element :ci_variable_key_field
+ element :ci_variable_value_field
end
def click_run_pipeline_button
- click_element :run_pipeline_button
+ click_element(:run_pipeline_button, Page::Project::Pipeline::Show)
+ end
+
+ def add_variable(key, value, row_index: 0)
+ within_element_by_index(:ci_variable_row_container, row_index) do
+ fill_element(:ci_variable_key_field, key)
+ fill_element(:ci_variable_value_field, value)
+ end
end
end
end
diff --git a/qa/qa/page/project/pipeline/show.rb b/qa/qa/page/project/pipeline/show.rb
index 6f4757a34e8..f499b748fb4 100644
--- a/qa/qa/page/project/pipeline/show.rb
+++ b/qa/qa/page/project/pipeline/show.rb
@@ -8,7 +8,7 @@ module QA
include Component::CiBadgeLink
view 'app/assets/javascripts/vue_shared/components/header_ci_component.vue' do
- element :pipeline_header
+ element :pipeline_header, required: true
end
view 'app/assets/javascripts/pipelines/components/graph/graph_component.vue' do
@@ -16,14 +16,14 @@ module QA
end
view 'app/assets/javascripts/pipelines/components/graph/job_item.vue' do
- element :job_item_container
- element :job_link
+ element :job_item_container, required: true
+ element :job_link, required: true
element :job_action_button
end
view 'app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue' do
- element :expand_pipeline_button
- element :child_pipeline
+ element :expand_linked_pipeline_button
+ element :linked_pipeline_container
end
view 'app/assets/javascripts/reports/components/report_section.vue' do
@@ -73,14 +73,18 @@ module QA
end
end
- def has_child_pipeline?(title: nil)
- title ? find_child_pipeline_by_title(title) : has_element?(:child_pipeline)
+ def has_linked_pipeline?(title: nil)
+ title ? find_linked_pipeline_by_title(title) : has_element?(:linked_pipeline_container)
end
- def has_no_child_pipeline?
- has_no_element?(:child_pipeline)
+ alias_method :has_child_pipeline?, :has_linked_pipeline?
+
+ def has_no_linked_pipeline?
+ has_no_element?(:linked_pipeline_container)
end
+ alias_method :has_no_child_pipeline?, :has_no_linked_pipeline?
+
def click_job(job_name)
# Retry due to transient bug https://gitlab.com/gitlab-org/gitlab/-/issues/347126
QA::Support::Retrier.retry_on_exception do
@@ -88,22 +92,24 @@ module QA
end
end
- def child_pipelines
- all_elements(:child_pipeline, minimum: 1)
+ def linked_pipelines
+ all_elements(:linked_pipeline_container, minimum: 1)
end
- def find_child_pipeline_by_title(title)
- child_pipelines.find { |pipeline| pipeline[:title].include?(title) }
+ def find_linked_pipeline_by_title(title)
+ linked_pipelines.find { |pipeline| pipeline[:title].include?(title) }
end
- def expand_child_pipeline(title: nil)
- child_pipeline = title ? find_child_pipeline_by_title(title) : child_pipelines.first
+ def expand_linked_pipeline(title: nil)
+ linked_pipeline = title ? find_linked_pipeline_by_title(title) : linked_pipelines.first
- within_element_by_index(:child_pipeline, child_pipelines.index(child_pipeline)) do
- click_element(:expand_pipeline_button)
+ within_element_by_index(:linked_pipeline_container, linked_pipelines.index(linked_pipeline)) do
+ click_element(:expand_linked_pipeline_button)
end
end
+ alias_method :expand_child_pipeline, :expand_linked_pipeline
+
def expand_license_report
within_element(:license_report_widget) do
click_element(:expand_report_button)
diff --git a/qa/qa/page/project/pipeline_editor/show.rb b/qa/qa/page/project/pipeline_editor/show.rb
index caf54a10025..1a8e1e07994 100644
--- a/qa/qa/page/project/pipeline_editor/show.rb
+++ b/qa/qa/page/project/pipeline_editor/show.rb
@@ -15,9 +15,9 @@ module QA
element :target_branch_field, required: true
end
- view 'app/assets/javascripts/pipeline_editor/components/drawer/pipeline_editor_drawer.vue' do
- element :toggle_sidebar_collapse_button
- element :drawer_content
+ view 'app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue' do
+ element :drawer_toggle, required: true
+ element :template_repo_link, required: true
end
view 'app/assets/javascripts/vue_shared/components/source_editor.vue' do
@@ -46,13 +46,6 @@ module QA
element :file_editor_container
end
- def initialize
- super
-
- wait_for_requests
- close_toggle_sidebar
- end
-
def open_branch_selector_dropdown
click_element(:branch_selector_button)
end
@@ -148,15 +141,6 @@ module QA
find('.nav-item', text: name).click
end
end
-
- # If the page thinks user has never opened pipeline editor before
- # It will expand pipeline editor sidebar by default
- # Collapse the sidebar if it is expanded
- def close_toggle_sidebar
- return unless has_element?(:drawer_content)
-
- click_element(:toggle_sidebar_collapse_button)
- end
end
end
end
diff --git a/qa/qa/page/project/settings/services/jenkins.rb b/qa/qa/page/project/settings/services/jenkins.rb
index 3d7da8d0161..8e092371491 100644
--- a/qa/qa/page/project/settings/services/jenkins.rb
+++ b/qa/qa/page/project/settings/services/jenkins.rb
@@ -7,10 +7,10 @@ module QA
module Services
class Jenkins < QA::Page::Base
view 'app/assets/javascripts/integrations/edit/components/dynamic_field.vue' do
- element :jenkins_url_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
- element :project_name_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
- element :username_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
- element :password_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
+ element :service_jenkins_url_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
+ element :service_project_name_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
+ element :service_username_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
+ element :service_password_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern
end
view 'app/assets/javascripts/integrations/edit/components/integration_form.vue' do
@@ -28,19 +28,19 @@ module QA
private
def set_jenkins_url(jenkins_url)
- fill_element(:jenkins_url_field, jenkins_url)
+ fill_element(:service_jenkins_url_field, jenkins_url)
end
def set_project_name(project_name)
- fill_element(:project_name_field, project_name)
+ fill_element(:service_project_name_field, project_name)
end
def set_username(username)
- fill_element(:username_field, username)
+ fill_element(:service_username_field, username)
end
def set_password(password)
- fill_element(:password_field, password)
+ fill_element(:service_password_field, password)
end
def click_save_changes_button
diff --git a/qa/qa/resource/bulk_import_group.rb b/qa/qa/resource/bulk_import_group.rb
index a22529152e1..31db8ae4cc6 100644
--- a/qa/qa/resource/bulk_import_group.rb
+++ b/qa/qa/resource/bulk_import_group.rb
@@ -7,10 +7,14 @@ module QA
:destination_group,
:import_id
- attribute :access_token do
+ attribute :import_access_token do
api_client.personal_access_token
end
+ attribute :gitlab_address do
+ QA::Runtime::Scenario.gitlab_address
+ end
+
# In most cases we will want to set path the same as source group
# but it can be set to a custom name as well when imported via API
attribute :destination_group_path do
@@ -19,18 +23,16 @@ module QA
# Can't define path as attribue since @path is set in base class initializer
alias_method :path, :destination_group_path
- delegate :gitlab_address, to: 'QA::Runtime::Scenario'
-
- def fabricate_via_browser_ui!
+ def fabricate!
Page::Main::Menu.perform(&:go_to_create_group)
Page::Group::New.perform do |group|
group.switch_to_import_tab
- group.connect_gitlab_instance(gitlab_address, api_client.personal_access_token)
+ group.connect_gitlab_instance(gitlab_address, import_access_token)
end
Page::Group::BulkImport.perform do |import_page|
- import_page.import_group(path, sandbox.path)
+ import_page.import_group(destination_group_path, sandbox.full_path)
end
reload!
@@ -49,7 +51,7 @@ module QA
{
configuration: {
url: gitlab_address,
- access_token: access_token
+ access_token: import_access_token
},
entities: [
{
diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb
index 740a8920cf2..dba3eb2e219 100644
--- a/qa/qa/resource/project.rb
+++ b/qa/qa/resource/project.rb
@@ -90,7 +90,12 @@ module QA
Page::Project::New.perform(&:click_blank_project_link)
Page::Project::New.perform do |new_page|
- new_page.choose_test_namespace unless @personal_namespace
+ if @personal_namespace
+ new_page.choose_namespace(@personal_namespace)
+ else
+ new_page.choose_test_namespace
+ end
+
new_page.choose_name(@name)
new_page.add_description(@description)
new_page.set_visibility(@visibility)
@@ -105,7 +110,16 @@ module QA
def fabricate_via_api!
resource_web_url(api_get)
rescue ResourceNotFoundError
- super
+ response = super
+
+ # If a project is being imported, wait until it completes before we let the test continue.
+ # Otherwise we see Git repository errors
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/356101
+ Support::Retrier.retry_until(max_duration: 60, sleep_interval: 5) do
+ %w[none finished].include?(reload!.api_resource[:import_status])
+ end
+
+ response
end
def api_get_path
@@ -295,13 +309,6 @@ module QA
merge_requests.find { |mr| mr[:title] == title }
end
- def runners(tag_list: nil)
- url = tag_list ? "#{api_runners_path}?tag_list=#{tag_list.compact.join(',')}" : api_runners_path
- response = get(request_url(url, per_page: '100'))
-
- parse_body(response)
- end
-
def registry_repositories
response = get(request_url(api_registry_repositories_path))
parse_body(response)
@@ -336,16 +343,17 @@ module QA
parse_body(response)
end
- def pipelines
- response = get(request_url(api_pipelines_path))
- parse_body(response)
- end
-
def pipeline_schedules
response = get(request_url(api_pipeline_schedules_path))
parse_body(response)
end
+ def pipelines(auto_paginate: false, attempts: 0)
+ return parse_body(api_get_from(api_pipelines_path)) unless auto_paginate
+
+ auto_paginated_response(request_url(api_pipelines_path, per_page: '100'), attempts: attempts)
+ end
+
def issues(auto_paginate: false, attempts: 0)
return parse_body(api_get_from(api_issues_path)) unless auto_paginate
@@ -380,9 +388,7 @@ module QA
api_resource[:import_status] == "finished"
end
- unless mirror_succeeded
- raise "Mirroring failed with error: #{api_resource[:import_error]}"
- end
+ raise "Mirroring failed with error: #{api_resource[:import_error]}" unless mirror_succeeded
end
def remove_via_api!
diff --git a/qa/qa/resource/runner.rb b/qa/qa/resource/runner.rb
index 9c5c9992442..c014563671d 100644
--- a/qa/qa/resource/runner.rb
+++ b/qa/qa/resource/runner.rb
@@ -31,7 +31,7 @@ module QA
end
def fabricate_via_api!
- Service::DockerRun::GitlabRunner.new(name).tap do |runner|
+ @docker_container = Service::DockerRun::GitlabRunner.new(name).tap do |runner|
runner.pull
runner.token = @token ||= project.runners_token
runner.address = Runtime::Scenario.gitlab_address
@@ -46,12 +46,22 @@ module QA
end
def remove_via_api!
- runners = project.runners(tag_list: @tags)
+ runners = list_of_runners(tag_list: @tags)
- return if runners.blank?
+ # If we have no runners, print the logs from the runner docker container in case they show why it isn't running.
+ if runners.blank?
+ dump_logs
+
+ return
+ end
this_runner = runners.find { |runner| runner[:description] == name }
+
+ # As above, but now we should have a specific runner. If not, print the logs from the runner docker container
+ # to see if we can find out why the runner isn't running.
unless this_runner
+ dump_logs
+
raise "Project #{project.path_with_namespace} does not have a runner with a description matching #{name} #{"or tags #{@tags}" if @tags&.any?}. Runners available: #{runners}"
end
@@ -62,6 +72,20 @@ module QA
Service::DockerRun::GitlabRunner.new(name).remove!
end
+ def list_of_runners(tag_list: nil)
+ url = tag_list ? "#{api_post_path}?tag_list=#{tag_list.compact.join(',')}" : api_post_path
+ response = get(request_url(url, per_page: '100'))
+
+ # Capturing 500 error code responses to log this issue better. We can consider cleaning it up once https://gitlab.com/gitlab-org/gitlab/-/issues/331753 is addressed.
+ raise "Response returned a #{response.code} error code. #{response.body}" if response.code == Support::API::HTTP_STATUS_SERVER_ERROR
+
+ parse_body(response)
+ end
+
+ def reload!
+ super if method(:running?).super_method.call
+ end
+
def api_delete_path
"/runners/#{id}"
end
@@ -70,10 +94,21 @@ module QA
end
def api_post_path
+ "/runners"
end
def api_post_body
end
+
+ private
+
+ def dump_logs
+ if @docker_container.running?
+ @docker_container.logs { |line| QA::Runtime::Logger.debug(line) }
+ else
+ QA::Runtime::Logger.debug("No runner container found named #{name}")
+ end
+ end
end
end
end
diff --git a/qa/qa/runtime/api/repository_storage_moves.rb b/qa/qa/runtime/api/repository_storage_moves.rb
index c3b2095be32..fb8d70c0836 100644
--- a/qa/qa/runtime/api/repository_storage_moves.rb
+++ b/qa/qa/runtime/api/repository_storage_moves.rb
@@ -24,7 +24,7 @@ module QA
Logger.debug('Getting repository storage moves')
Support::Waiter.wait_until do
- with_paginated_response_body(Request.new(api_client, "/#{resource_name(resource)}_repository_storage_moves", per_page: '100').url) do |page|
+ get(Request.new(api_client, "/#{resource_name(resource)}_repository_storage_moves", per_page: '100').url) do |page|
break true if page.any? { |item| yield item }
end
end
diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb
index f1d93ce376a..89e84f414b1 100644
--- a/qa/qa/runtime/browser.rb
+++ b/qa/qa/runtime/browser.rb
@@ -194,6 +194,8 @@ module QA
def initialize(instance, page_class)
@session_address = Runtime::Address.new(instance, page_class)
@page_class = page_class
+
+ Session.enable_interception if Runtime::Env.can_intercept?
end
def url
@@ -255,6 +257,27 @@ module QA
@network_conditions_configured = false
end
+ def self.enable_interception
+ script = File.read("#{__dir__}/script_extensions/interceptor.js")
+ command = {
+ cmd: 'Page.addScriptToEvaluateOnNewDocument',
+ params: {
+ source: script
+ }
+ }
+ @interceptor_script_params = Capybara.current_session.driver.browser.send(:bridge).send_command(command)
+ end
+
+ def self.disable_interception
+ return unless @interceptor_script_params
+
+ command = {
+ cmd: 'Page.removeScriptToEvaluateOnNewDocument',
+ params: @interceptor_script_params
+ }
+ Capybara.current_session.driver.browser.send(:bridge).send_command(command)
+ end
+
private
def simulate_slow_connection
diff --git a/qa/qa/runtime/env.rb b/qa/qa/runtime/env.rb
index 63207751c78..e4537009406 100644
--- a/qa/qa/runtime/env.rb
+++ b/qa/qa/runtime/env.rb
@@ -37,6 +37,14 @@ module QA
ENV['QA_PRAEFECT_REPOSITORY_STORAGE']
end
+ def interception_enabled?
+ enabled?(ENV['INTERCEPT_REQUESTS'], default: true)
+ end
+
+ def can_intercept?
+ browser == :chrome && interception_enabled?
+ end
+
def ci_job_url
ENV['CI_JOB_URL']
end
diff --git a/qa/qa/runtime/script_extensions/interceptor.js b/qa/qa/runtime/script_extensions/interceptor.js
new file mode 100644
index 00000000000..9e98b0421b4
--- /dev/null
+++ b/qa/qa/runtime/script_extensions/interceptor.js
@@ -0,0 +1,158 @@
+(() => {
+ const CACHE_NAME = 'INTERCEPTOR_CACHE';
+
+ /**
+ * Fetches and parses JSON from the sessionStorage cache
+ * @returns {(Object)}
+ */
+ const getCache = () => {
+ return JSON.parse(sessionStorage.getItem(CACHE_NAME));
+ };
+
+ /**
+ * Commits an object to the sessionStorage cache
+ * @param {Object} data
+ */
+ const saveCache = (data) => {
+ sessionStorage.setItem(CACHE_NAME, JSON.stringify(data));
+ };
+
+ /**
+ * Checks if the cache is available
+ * and if the current context has access to it
+ * @returns {boolean} can we access the cache?
+ */
+ const checkCache = () => {
+ try {
+ getCache();
+ return true;
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.warn(`Couldn't access cache: ${error.toString()}`);
+ return false;
+ }
+ };
+
+ /**
+ * @callback cacheCommitCallback
+ * @param {object} cache
+ * @return {object} mutated cache
+ */
+
+ /**
+ * If the cache is available, takes a callback function that is called
+ * with an object returned from getCache,
+ * and saves whatever is returned from the callback function
+ * to the cache
+ * @param {cacheCommitCallback} cb
+ */
+ const commitToCache = (cb) => {
+ if (checkCache()) {
+ const cache = cb(getCache());
+ saveCache(cache);
+ }
+ };
+
+ window.Interceptor = {
+ saveCache,
+ commitToCache,
+ getCache,
+ checkCache,
+ activeFetchRequests: 0,
+ };
+
+ const pureFetch = window.fetch;
+ const pureXHROpen = window.XMLHttpRequest.prototype.open;
+
+ /**
+ * Replacement for XMLHttpRequest.prototype.open
+ * listens for complete xhr events
+ * if the xhr response has a status code higher than 400
+ * then commit request/response metadata to the cache
+ * @param method intercepted HTTP method (GET|POST|etc..)
+ * @param url intercepted HTTP url
+ * @param args intercepted XHR arguments (credentials, headers, options
+ * @return {Promise} the result of the original XMLHttpRequest.prototype.open implementation
+ */
+ function interceptXhr(method, url, ...args) {
+ this.addEventListener(
+ 'readystatechange',
+ () => {
+ const self = this;
+ if (this.readyState === XMLHttpRequest.DONE) {
+ if (this.status >= 400 || this.status === 0) {
+ commitToCache((cache) => {
+ // eslint-disable-next-line no-param-reassign
+ cache.errors ||= [];
+ cache.errors.push({
+ status: self.status === 0 ? -1 : self.status,
+ url,
+ method,
+ headers: { 'x-request-id': self.getResponseHeader('x-request-id') },
+ });
+ return cache;
+ });
+ }
+ }
+ },
+ false,
+ );
+ return pureXHROpen.apply(this, [method, url, ...args]);
+ }
+
+ /**
+ * Replacement for fetch implementation
+ * tracks active requests, and commits metadata to the cache
+ * if the response is not ok or was cancelled.
+ * Additionally tracks activeFetchRequests on the Interceptor object
+ * @param url target HTTP url
+ * @param opts fetch options, including request method, body, etc
+ * @param args additional fetch arguments
+ * @returns {Promise<"success"|"error">} the result of the original fetch call
+ */
+ async function interceptedFetch(url, opts, ...args) {
+ const method = opts && opts.method ? opts.method : 'GET';
+ window.Interceptor.activeFetchRequests += 1;
+ try {
+ const response = await pureFetch(url, opts, ...args);
+ window.Interceptor.activeFetchRequests += -1;
+ const clone = response.clone();
+
+ if (!clone.ok) {
+ commitToCache((cache) => {
+ // eslint-disable-next-line no-param-reassign
+ cache.errors ||= [];
+ cache.errors.push({
+ status: clone.status,
+ url,
+ method,
+ headers: { 'x-request-id': clone.headers.get('x-request-id') },
+ });
+ return cache;
+ });
+ }
+ return response;
+ } catch (error) {
+ commitToCache((cache) => {
+ // eslint-disable-next-line no-param-reassign
+ cache.errors ||= [];
+ cache.errors.push({
+ status: -1,
+ url,
+ method,
+ });
+ return cache;
+ });
+
+ window.Interceptor.activeFetchRequests += -1;
+ throw error;
+ }
+ }
+
+ if (checkCache()) {
+ saveCache({});
+ }
+
+ window.fetch = interceptedFetch;
+ window.XMLHttpRequest.prototype.open = interceptXhr;
+})();
diff --git a/qa/qa/scenario/bootable.rb b/qa/qa/scenario/bootable.rb
index 2a9bbbc9fdb..8eedfab3cff 100644
--- a/qa/qa/scenario/bootable.rb
+++ b/qa/qa/scenario/bootable.rb
@@ -31,7 +31,7 @@ module QA
end
next
- elsif opt.name == :count_examples_only
+ elsif opt.name == :count_examples_only || opt.name == :test_metadata_only
parser.on(opt.arg, opt.desc) do |value|
QA::Runtime::Env.dry_run = true
Runtime::Scenario.define(opt.name, value)
diff --git a/qa/qa/scenario/shared_attributes.rb b/qa/qa/scenario/shared_attributes.rb
index d5d7aedb47f..ad2d2d3a960 100644
--- a/qa/qa/scenario/shared_attributes.rb
+++ b/qa/qa/scenario/shared_attributes.rb
@@ -14,6 +14,7 @@ module QA
attribute :parallel, '--parallel', 'Execute tests in parallel'
attribute :loop, '--loop', 'Execute test repeatedly'
attribute :count_examples_only, '--count-examples-only', 'Return the number of examples without running them'
+ attribute :test_metadata_only, '--test-metadata-only', 'Return all e2e test metadata without running them'
end
end
end
diff --git a/qa/qa/service/docker_run/base.rb b/qa/qa/service/docker_run/base.rb
index 512960e8232..85c06e6c307 100644
--- a/qa/qa/service/docker_run/base.rb
+++ b/qa/qa/service/docker_run/base.rb
@@ -11,6 +11,12 @@ module QA
@runner_network = Runtime::Scenario.attributes[:runner_network] || @network
end
+ def logs
+ shell "docker logs #{@name}" do |line|
+ yield " #{line.chomp}"
+ end
+ end
+
def network
shell "docker network inspect #{@network}"
rescue CommandError
diff --git a/qa/qa/service/docker_run/gitlab_runner.rb b/qa/qa/service/docker_run/gitlab_runner.rb
index 595d47bf162..0a8ac39dabd 100644
--- a/qa/qa/service/docker_run/gitlab_runner.rb
+++ b/qa/qa/service/docker_run/gitlab_runner.rb
@@ -43,6 +43,8 @@ module QA
#{@image} #{add_gitlab_tls_cert if @address.include? "https"} && docker exec --detach #{@name} sh -c "#{register_command}"
CMD
+ wait_until_running_and_configured
+
# Prove airgappedness
if runner_network == 'airgapped'
shell("docker exec #{@name} sh -c '#{prove_airgap}'")
@@ -111,6 +113,10 @@ module QA
&& docker cp #{gitlab_tls_certificate.path} #{@name}:/etc/gitlab-runner/certs/gitlab.test.crt
CMD
end
+
+ def wait_until_running_and_configured
+ wait_until_shell_command_matches("docker logs #{@name}", /Configuration loaded/)
+ end
end
end
end
diff --git a/qa/qa/service/praefect_manager.rb b/qa/qa/service/praefect_manager.rb
index c364b00629c..1215268919c 100644
--- a/qa/qa/service/praefect_manager.rb
+++ b/qa/qa/service/praefect_manager.rb
@@ -530,9 +530,17 @@ module QA
storage_repositories[2..-3]
end
+ def modify_repo_access_time(node, repo_path, update_time)
+ repo = "/var/opt/gitlab/git-data/repositories/#{repo_path}"
+ shell(%{
+ docker exec --user git #{node} bash -c 'find #{repo} -exec touch -d "#{update_time}" {} \\;'
+ })
+ end
+
def add_repo_to_disk(node, repo_path)
cmd = "GIT_DIR=. git init --initial-branch=main /var/opt/gitlab/git-data/repositories/#{repo_path}"
shell "docker exec --user git #{node} bash -c '#{cmd}'"
+ modify_repo_access_time(node, repo_path, "24 hours ago")
end
def remove_repo_from_disk(repo_path)
diff --git a/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb
index c39db63f64d..79bba484bea 100644
--- a/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb
@@ -1,7 +1,9 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Manage', :github, :requires_admin, :reliable do
+ # Spec uses real github.com, which means outage of github.com can actually block deployment
+ # Keep spec in reliable bucket but don't run in blocking pipelines
+ RSpec.describe 'Manage', :github, :reliable, :skip_live_env, :requires_admin do
describe 'Project import', issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/353583' do
let!(:api_client) { Runtime::API::Client.as_admin }
let!(:group) { Resource::Group.fabricate_via_api! { |resource| resource.api_client = api_client } }
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 84eda023576..6585d08d2ac 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
@@ -21,11 +21,11 @@ module QA
end
end
- let(:github_repo) { ENV['QA_LARGE_GH_IMPORT_REPO'] || 'rspec/rspec-core' }
- let(:import_max_duration) { ENV['QA_LARGE_GH_IMPORT_DURATION'] ? ENV['QA_LARGE_GH_IMPORT_DURATION'].to_i : 7200 }
+ let(:github_repo) { ENV['QA_LARGE_IMPORT_REPO'] || 'rspec/rspec-core' }
+ let(:import_max_duration) { ENV['QA_LARGE_IMPORT_DURATION'] ? ENV['QA_LARGE_IMPORT_DURATION'].to_i : 7200 }
let(:github_client) do
Octokit::Client.new(
- access_token: ENV['QA_LARGE_GH_IMPORT_GH_TOKEN'] || Runtime::Env.github_access_token,
+ access_token: ENV['QA_LARGE_IMPORT_GH_TOKEN'] || Runtime::Env.github_access_token,
auto_paginate: true
)
end
@@ -106,37 +106,47 @@ module QA
end
end
+ # rubocop:disable RSpec/InstanceVariable
after do |example|
user.remove_via_api! unless example.exception
next unless defined?(@import_time)
- # save data for comparison after run finished
+ # save data for comparison notification creation
save_json(
"data",
{
+ importer: :github,
import_time: @import_time,
reported_stats: @stats,
- github: {
+ source: {
+ name: "GitHub",
project_name: github_repo,
- branches: gh_branches.length,
- commits: gh_commits.length,
- labels: gh_labels.length,
- milestones: gh_milestones.length,
- prs: gh_prs.length,
- pr_comments: gh_prs.sum { |_k, v| v[:comments].length },
- issues: gh_issues.length,
- issue_comments: gh_issues.sum { |_k, v| v[:comments].length }
+ address: "https://github.com",
+ data: {
+ branches: gh_branches.length,
+ commits: gh_commits.length,
+ labels: gh_labels.length,
+ milestones: gh_milestones.length,
+ mrs: gh_prs.length,
+ mr_comments: gh_prs.sum { |_k, v| v[:comments].length },
+ issues: gh_issues.length,
+ issue_comments: gh_issues.sum { |_k, v| v[:comments].length }
+ }
},
- gitlab: {
+ target: {
+ name: "GitLab",
project_name: imported_project.path_with_namespace,
- branches: gl_branches.length,
- commits: gl_commits.length,
- labels: gl_labels.length,
- milestones: gl_milestones.length,
- mrs: mrs.length,
- mr_comments: mrs.sum { |_k, v| v[:comments].length },
- issues: gl_issues.length,
- issue_comments: gl_issues.sum { |_k, v| v[:comments].length }
+ address: QA::Runtime::Scenario.gitlab_address,
+ data: {
+ branches: gl_branches.length,
+ commits: gl_commits.length,
+ labels: gl_labels.length,
+ milestones: gl_milestones.length,
+ mrs: mrs.length,
+ mr_comments: mrs.sum { |_k, v| v[:comments].length },
+ issues: gl_issues.length,
+ issue_comments: gl_issues.sum { |_k, v| v[:comments].length }
+ }
},
not_imported: {
mrs: @mr_diff,
@@ -145,6 +155,7 @@ module QA
}
)
end
+ # rubocop:enable RSpec/InstanceVariable
it(
'imports large Github repo via api',
@@ -153,7 +164,7 @@ module QA
start = Time.now
# import the project and log gitlab path
- Runtime::Logger.info("== Importing project '#{github_repo}' in to '#{imported_project.reload!.full_path}' ==")
+ logger.info("== Importing project '#{github_repo}' in to '#{imported_project.reload!.full_path}' ==")
# fetch all objects right after import has started
fetch_github_objects
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
new file mode 100644
index 00000000000..edb7838e81d
--- /dev/null
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
@@ -0,0 +1,412 @@
+# frozen_string_literal: true
+
+# rubocop:disable Rails/Pluck, Layout/LineLength, RSpec/MultipleMemoizedHelpers
+module QA
+ RSpec.describe "Manage", requires_admin: 'uses admin API client for resource creation',
+ feature_flag: { name: 'bulk_import_projects', scope: :global },
+ only: { job: 'large-gitlab-import' } do
+ describe "Gitlab migration" do
+ let(:logger) { Runtime::Logger.logger }
+ let(:differ) { RSpec::Support::Differ.new(color: true) }
+ let(:gitlab_group) { ENV['QA_LARGE_IMPORT_GROUP'] || 'gitlab-migration' }
+ let(:gitlab_project) { ENV['QA_LARGE_IMPORT_REPO'] || 'dri' }
+ let(:gitlab_source_address) { 'https://staging.gitlab.com' }
+
+ let(:import_wait_duration) do
+ {
+ max_duration: (ENV['QA_LARGE_IMPORT_DURATION'] || 3600).to_i,
+ sleep_interval: 30
+ }
+ end
+
+ let(:admin_api_client) { Runtime::API::Client.as_admin }
+
+ # explicitly create PAT via api to not create it via UI in environments where admin token env var is not present
+ let(:target_api_client) do
+ Runtime::API::Client.new(
+ user: user,
+ personal_access_token: Resource::PersonalAccessToken.fabricate_via_api! do |pat|
+ pat.api_client = admin_api_client
+ end.token
+ )
+ end
+
+ let(:user) do
+ Resource::User.fabricate_via_api! do |usr|
+ usr.api_client = admin_api_client
+ end
+ end
+
+ let(:source_api_client) do
+ Runtime::API::Client.new(
+ gitlab_source_address,
+ personal_access_token: ENV["QA_LARGE_IMPORT_GL_TOKEN"],
+ is_new_session: false
+ )
+ end
+
+ let(:sandbox) do
+ Resource::Sandbox.fabricate_via_api! do |group|
+ group.api_client = admin_api_client
+ end
+ end
+
+ let(:destination_group) do
+ Resource::Group.fabricate_via_api! do |group|
+ group.api_client = admin_api_client
+ group.sandbox = sandbox
+ group.path = "imported-group-destination-#{SecureRandom.hex(4)}"
+ end
+ end
+
+ # Source group and it's objects
+ #
+ let(:source_group) do
+ Resource::Sandbox.fabricate_via_api! do |group|
+ group.api_client = source_api_client
+ group.path = gitlab_group
+ end
+ end
+
+ let(:source_project) { source_group.projects.find { |project| project.name.include?(gitlab_project) }.reload! }
+ let(:source_branches) { source_project.repository_branches(auto_paginate: true).map { |b| b[:name] } }
+ let(:source_commits) { source_project.commits(auto_paginate: true).map { |c| c[:id] } }
+ let(:source_labels) { source_project.labels(auto_paginate: true).map { |l| l.except(:id) } }
+ let(:source_milestones) { source_project.milestones(auto_paginate: true).map { |ms| ms.except(:id, :web_url, :project_id) } }
+ let(:source_pipelines) { source_project.pipelines.map { |pp| pp.except(:id, :web_url, :project_id) } }
+ let(:source_mrs) { fetch_mrs(source_project, source_api_client) }
+ let(:source_issues) { fetch_issues(source_project, source_api_client) }
+
+ # Imported group and it's objects
+ #
+ let(:imported_group) do
+ Resource::BulkImportGroup.fabricate_via_api! do |group|
+ group.import_access_token = source_api_client.personal_access_token # token for importing on source instance
+ group.api_client = target_api_client # token used by qa framework to access resources in destination instance
+ group.gitlab_address = gitlab_source_address
+ group.source_group = source_group
+ group.sandbox = destination_group
+ end
+ end
+
+ let(:imported_project) { imported_group.projects.find { |project| project.name.include?(gitlab_project) }.reload! }
+ let(:branches) { imported_project.repository_branches(auto_paginate: true).map { |b| b[:name] } }
+ let(:commits) { imported_project.commits(auto_paginate: true).map { |c| c[:id] } }
+ let(:labels) { imported_project.labels(auto_paginate: true).map { |l| l.except(:id) } }
+ let(:milestones) { imported_project.milestones(auto_paginate: true).map { |ms| ms.except(:id, :web_url, :project_id) } }
+ let(:pipelines) { imported_project.pipelines.map { |pp| pp.except(:id, :web_url, :project_id) } }
+ let(:mrs) { fetch_mrs(imported_project, target_api_client) }
+ let(:issues) { fetch_issues(imported_project, target_api_client) }
+
+ before do
+ Runtime::Feature.enable(:bulk_import_projects)
+
+ destination_group.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
+ end
+
+ # rubocop:disable RSpec/InstanceVariable
+ after do |example|
+ next unless defined?(@import_time)
+
+ # save data for comparison notification creation
+ save_json(
+ "data",
+ {
+ importer: :gitlab,
+ import_time: @import_time,
+ source: {
+ name: "GitLab Source",
+ project_name: source_project.path_with_namespace,
+ address: gitlab_source_address,
+ data: {
+ branches: source_branches.length,
+ commits: source_commits.length,
+ labels: source_labels.length,
+ milestones: source_milestones.length,
+ pipelines: source_pipelines.length,
+ mrs: source_mrs.length,
+ mr_comments: source_mrs.sum { |_k, v| v[:comments].length },
+ issues: source_issues.length,
+ issue_comments: source_issues.sum { |_k, v| v[:comments].length }
+ }
+ },
+ target: {
+ name: "GitLab Target",
+ project_name: imported_project.path_with_namespace,
+ address: QA::Runtime::Scenario.gitlab_address,
+ data: {
+ branches: branches.length,
+ commits: commits.length,
+ labels: labels.length,
+ milestones: milestones.length,
+ pipelines: pipelines.length,
+ mrs: mrs.length,
+ mr_comments: mrs.sum { |_k, v| v[:comments].length },
+ issues: issues.length,
+ issue_comments: issues.sum { |_k, v| v[:comments].length }
+ }
+ },
+ not_imported: {
+ mrs: @mr_diff,
+ issues: @issue_diff
+ }
+ }
+ )
+ end
+ # rubocop:enable RSpec/InstanceVariable
+
+ it "migrates large gitlab group via api", testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358842' do
+ start = Time.now
+
+ # trigger import and log imported group path
+ logger.info("== Importing group '#{gitlab_group}' in to '#{imported_group.full_path}' ==")
+
+ # fetch all objects right after import has started
+ fetch_source_gitlab_objects
+
+ # wait for import to finish and save import time
+ logger.info("== Waiting for import to be finished ==")
+ expect { imported_group.import_status }.to eventually_eq('finished').within(import_wait_duration)
+ @import_time = Time.now - start
+
+ aggregate_failures do
+ verify_repository_import
+ verify_labels_import
+ verify_milestones_import
+ verify_pipelines_import
+ verify_merge_requests_import
+ verify_issues_import
+ end
+ end
+
+ # Fetch source project objects for comparison
+ #
+ # @return [void]
+ def fetch_source_gitlab_objects
+ logger.info("== Fetching source group objects ==")
+
+ source_branches
+ source_commits
+ source_labels
+ source_milestones
+ source_pipelines
+ source_mrs
+ source_issues
+ end
+
+ # Verify repository imported correctly
+ #
+ # @return [void]
+ def verify_repository_import
+ logger.info("== Verifying repository import ==")
+ expect(imported_project.description).to eq(source_project.description)
+ expect(branches).to match_array(source_branches)
+ expect(commits).to match_array(source_commits)
+ end
+
+ # Verify imported labels
+ #
+ # @return [void]
+ def verify_labels_import
+ logger.info("== Verifying label import ==")
+ expect(labels).to include(*source_labels)
+ end
+
+ # Verify milestones import
+ #
+ # @return [void]
+ def verify_milestones_import
+ logger.info("== Verifying milestones import ==")
+ expect(milestones).to match_array(source_milestones)
+ end
+
+ # Verify pipelines import
+ #
+ # @return [void]
+ def verify_pipelines_import
+ logger.info("== Verifying pipelines import ==")
+ expect(pipelines).to match_array(source_pipelines)
+ end
+
+ # Verify imported merge requests and mr issues
+ #
+ # @return [void]
+ def verify_merge_requests_import
+ logger.info("== Verifying merge request import ==")
+ @mr_diff = verify_mrs_or_issues('mr')
+ end
+
+ # Verify imported issues and issue comments
+ #
+ # @return [void]
+ def verify_issues_import
+ logger.info("== Verifying issue import ==")
+ @issue_diff = verify_mrs_or_issues('issue')
+ end
+
+ # Verify imported mrs or issues and return missing items
+ #
+ # @param [String] type verification object, 'mr' or 'issue'
+ # @return [Hash]
+ def verify_mrs_or_issues(type)
+ # Compare length to have easy to read overview how many objects are missing
+ #
+ expected = type == 'mr' ? source_mrs : source_issues
+ actual = type == 'mr' ? mrs : issues
+ count_msg = "Expected to contain same amount of #{type}s. Source: #{expected.length}, Target: #{actual.length}"
+ expect(actual.length).to eq(expected.length), count_msg
+
+ missing_comments = verify_comments(type, actual, expected)
+
+ {
+ "#{type}s": (expected.keys - actual.keys).map { |it| actual[it].slice(:title, :url) },
+ "#{type}_comments": missing_comments
+ }
+ end
+
+ # Verify imported comments
+ #
+ # @param [String] type verification object, 'mrs' or 'issues'
+ # @param [Hash] actual
+ # @param [Hash] expected
+ # @return [Hash]
+ def verify_comments(type, actual, expected)
+ actual.each_with_object([]) do |(key, actual_item), missing_comments|
+ expected_item = expected[key]
+ title = actual_item[:title]
+ msg = "expected #{type} with title '#{title}' to have"
+
+ # Print title in the error message to see which object is missing
+ #
+ expect(actual_item).to be_truthy, "#{msg} been imported"
+ next unless expected_item
+
+ # Print difference in the description
+ #
+ expected_body = expected_item[:body]
+ actual_body = actual_item[:body]
+ body_msg = "#{msg} same description. diff:\n#{differ.diff(expected_body, actual_body)}"
+ expect(actual_body).to eq(expected_body), body_msg
+
+ # Print difference in state
+ #
+ expected_state = expected_item[:state]
+ actual_state = actual_item[:state]
+ state_msg = "#{msg} same state. Source: #{expected_state}, Target: #{actual_state}"
+ expect(actual_state).to eq(expected_state), state_msg
+
+ # Print amount difference first
+ #
+ expected_comments = expected_item[:comments]
+ actual_comments = actual_item[:comments]
+ comment_count_msg = <<~MSG
+ #{msg} same amount of comments. Source: #{expected_comments.length}, Target: #{actual_comments.length}
+ MSG
+ expect(actual_comments.length).to eq(expected_comments.length), comment_count_msg
+ expect(actual_comments).to match_array(expected_comments)
+
+ # Save missing comments
+ #
+ comment_diff = expected_comments - actual_comments
+ next if comment_diff.empty?
+
+ missing_comments << {
+ title: title,
+ target_url: actual_item[:url],
+ source_url: expected_item[:url],
+ missing_comments: comment_diff
+ }
+ end
+ end
+
+ private
+
+ # Project merge requests with comments
+ #
+ # @param [QA::Resource::Project]
+ # @param [Runtime::API::Client] client
+ # @return [Hash]
+ def fetch_mrs(project, client)
+ imported_mrs = project.merge_requests(auto_paginate: true, attempts: 2)
+
+ Parallel.map(imported_mrs, in_threads: 4) do |mr|
+ resource = Resource::MergeRequest.init do |resource|
+ resource.project = project
+ resource.iid = mr[:iid]
+ resource.api_client = client
+ end
+
+ [mr[:iid], {
+ url: mr[:web_url],
+ title: mr[:title],
+ body: sanitize_description(mr[:description]) || '',
+ state: mr[:state],
+ comments: resource
+ .comments(auto_paginate: true, attempts: 2)
+ .map { |c| sanitize_comment(c[:body]) }
+ }]
+ end.to_h
+ end
+
+ # Project issues with comments
+ #
+ # @param [QA::Resource::Project]
+ # @param [Runtime::API::Client] client
+ # @return [Hash]
+ def fetch_issues(project, client)
+ imported_issues = project.issues(auto_paginate: true, attempts: 2)
+
+ Parallel.map(imported_issues, in_threads: 4) do |issue|
+ resource = Resource::Issue.init do |issue_resource|
+ issue_resource.project = project
+ issue_resource.iid = issue[:iid]
+ issue_resource.api_client = client
+ end
+
+ [issue[:iid], {
+ url: issue[:web_url],
+ title: issue[:title],
+ state: issue[:state],
+ body: sanitize_description(issue[:description]) || '',
+ comments: resource
+ .comments(auto_paginate: true, attempts: 2)
+ .map { |c| sanitize_comment(c[:body]) }
+ }]
+ end.to_h
+ end
+
+ # Importer user mention pattern
+ #
+ # @return [Regex]
+ def created_by_pattern
+ @created_by_pattern ||= /\n\n \*By gitlab-migration on \S+ \(imported from GitLab\)\*/
+ end
+
+ # Remove added prefixes and legacy diff format from comments
+ #
+ # @param [String] body
+ # @return [String]
+ def sanitize_comment(body)
+ body&.gsub(created_by_pattern, "")
+ end
+
+ # Remove created by prefix from descripion
+ #
+ # @param [String] body
+ # @return [String]
+ def sanitize_description(body)
+ body&.gsub(created_by_pattern, "")
+ end
+
+ # Save json as file
+ #
+ # @param [String] name
+ # @param [Hash] json
+ # @return [void]
+ def save_json(name, json)
+ File.open("tmp/#{name}.json", "w") { |file| file.write(JSON.pretty_generate(json)) }
+ end
+ end
+ end
+end
+# rubocop:enable Rails/Pluck, Layout/LineLength, RSpec/MultipleMemoizedHelpers
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb
index 70f19e9f3d7..5a9cef6fded 100644
--- a/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb
@@ -3,7 +3,11 @@
module QA
# Disable on live envs until bulk_import_projects toggle is on by default
# Otherwise tests running in parallel can disable feature in the middle of other test
- RSpec.shared_context 'with gitlab project migration', :requires_admin, :skip_live_env do
+ RSpec.shared_context 'with gitlab project migration', requires_admin: 'creates a user via API',
+ feature_flag: {
+ name: 'bulk_import_projects',
+ scope: :global
+ } do
let(:source_project_with_readme) { false }
let(:import_wait_duration) { { max_duration: 300, sleep_interval: 2 } }
let(:admin_api_client) { Runtime::API::Client.as_admin }
diff --git a/qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb
index 624ddbb68e1..cd1b7730fa9 100644
--- a/qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb
+++ b/qa/qa/specs/features/api/3_create/gitaly/changing_repository_storage_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Changing Gitaly repository storage', :requires_admin do
+ describe 'Changing Gitaly repository storage', :requires_admin, except: { job: 'review-qa-*' } do
praefect_manager = Service::PraefectManager.new
shared_examples 'repository storage move' do
@@ -11,12 +11,16 @@ module QA
expect { project.change_repository_storage(destination_storage[:name]) }.not_to raise_error
expect { praefect_manager.verify_storage_move(source_storage, destination_storage, repo_type: :project) }.not_to raise_error
- Resource::Repository::ProjectPush.fabricate! do |push|
- push.project = project
- push.file_name = 'new_file'
- push.file_content = '# This is a new file'
- push.commit_message = 'Add new file'
- push.new_branch = false
+ Support::Retrier.retry_on_exception(sleep_interval: 5) do
+ # For a short period of time after migrating, the repository can be 'read only' which may lead to errors
+ # 'The repository is temporarily read-only. Please try again later.'
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add new file'
+ commit.add_files([
+ { file_path: 'new_file', content: '# This is a new file' }
+ ])
+ end
end
expect(project).to have_file('README.md')
@@ -45,7 +49,7 @@ module QA
# Note: This test doesn't have the :orchestrated tag because it runs in the Test::Integration::Praefect
# scenario with other tests that aren't considered orchestrated.
# It also runs on staging using nfs-file07 as non-cluster storage and nfs-file22 as cluster/praefect storage
- context 'when moving from Gitaly to Gitaly Cluster', :requires_praefect, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347828', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/284645', type: :investigating } do
+ context 'when moving from Gitaly to Gitaly Cluster', :requires_praefect, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347828' do
let(:source_storage) { { type: :gitaly, name: QA::Runtime::Env.non_cluster_repository_storage } }
let(:destination_storage) { { type: :praefect, name: QA::Runtime::Env.praefect_repository_storage } }
let(:project) do
diff --git a/qa/qa/specs/features/api/3_create/integrations/webhook_events_spec.rb b/qa/qa/specs/features/api/3_create/integrations/webhook_events_spec.rb
index 7a277d754c9..aae0329003b 100644
--- a/qa/qa/specs/features/api/3_create/integrations/webhook_events_spec.rb
+++ b/qa/qa/specs/features/api/3_create/integrations/webhook_events_spec.rb
@@ -70,7 +70,7 @@ module QA
end
end
- it 'sends an issues and note event', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349723' do
+ it 'sends an issues and note event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349723' do
setup_webhook(issues: true, note: true) do |webhook, smocker|
issue = Resource::Issue.fabricate_via_api! do |issue_init|
issue_init.project = webhook.project
diff --git a/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb b/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb
new file mode 100644
index 00000000000..c06912e0367
--- /dev/null
+++ b/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Create' do
+ describe 'Create a new project from a template' do
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'templated-project'
+ project.template_name = 'dotnetcore'
+ end
+ end
+
+ it 'commits via the api', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/357234' do
+ expect do
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.update_files(
+ [
+ {
+ file_path: '.gitlab-ci.yml',
+ content: 'script'
+ }
+ ]
+ )
+ commit.add_files(
+ [
+ {
+ file_path: 'foo',
+ content: 'bar'
+ }
+ ]
+ )
+ end
+ end.not_to raise_exception
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb b/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb
index 0d10783735b..6e6198328e5 100644
--- a/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb
+++ b/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb
@@ -7,7 +7,7 @@ module QA
let(:api_client) { Runtime::API::Client.new(:gitlab) }
let(:executor) { "qa-runner-#{Time.now.to_i}" }
- let(:runner_tags) { ['runner-registration-e2e-test'] }
+ let(:runner_tags) { ["runner-registration-e2e-test-#{Faker::Alphanumeric.alphanumeric(number: 8)}"] }
let!(:runner) do
Resource::Runner.fabricate! do |runner|
runner.name = executor
@@ -15,21 +15,19 @@ module QA
end
end
- before do
- sleep 5 # Runner should register within 5 seconds
- end
-
# Removing a runner via the UI is covered by `spec/features/runners_spec.rb``
- it 'removes the runner', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/355302', type: :investigating } do
- expect(runner.project.runners.size).to eq(1)
- expect(runner.project.runners.first[:description]).to eq(executor)
+ it 'removes the runner', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354828' do
+ runners = nil
+ expect { (runners = runner.list_of_runners(tag_list: runner_tags)).size }
+ .to eventually_eq(1).within(max_duration: 10, sleep_interval: 1)
+ expect(runners.first[:description]).to eq(executor)
- request = Runtime::API::Request.new(api_client, "runners/#{runner.project.runners.first[:id]}")
+ request = Runtime::API::Request.new(api_client, "runners/#{runners.first[:id]}")
response = delete(request.url)
expect(response.code).to eq(Support::API::HTTP_STATUS_NO_CONTENT)
expect(response.body).to be_empty
- expect(runner.project.runners).to be_empty
+ expect(runner.list_of_runners(tag_list: runner_tags)).to be_empty
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/log_into_mattermost_via_gitlab_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/log_into_mattermost_via_gitlab_spec.rb
index 6bfb9c96fbd..80e660c1c1d 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/log_into_mattermost_via_gitlab_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/log_into_mattermost_via_gitlab_spec.rb
@@ -11,7 +11,7 @@ module QA
Page::Mattermost::Login.perform(&:sign_in_using_oauth)
Page::Mattermost::Main.perform do |mattermost|
- expect(mattermost).to have_content(/(Welcome to: Mattermost|Logout GitLab Mattermost)/)
+ expect(mattermost).to have_content(/(GitLab Mattermost|What’s the name of your organization)/)
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb
index 2933d580957..3921595204c 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'Create project badge' do
+ describe 'Create project badge', :reliable do
let(:badge_name) { "project-badge-#{SecureRandom.hex(8)}" }
let(:expected_badge_link_url) { "#{Runtime::Scenario.gitlab_address}/#{project.path_with_namespace}" }
let(:expected_badge_image_url) { "#{Runtime::Scenario.gitlab_address}/#{project.path_with_namespace}/badges/main/pipeline.svg" }
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
index d803f5e473c..3bf5a11b074 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
@@ -1,7 +1,9 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Manage', :reliable, :github, :requires_admin do
+ # Spec uses real github.com, which means outage of github can actually block deployment
+ # Keep spec in reliable bucket but don't run in blocking pipelines
+ RSpec.describe 'Manage', :github, :reliable, :skip_live_env, :requires_admin do
describe 'Project import' do
let(:github_repo) { 'gitlab-qa-github/import-test' }
let(:api_client) { Runtime::API::Client.as_admin }
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb
index 2aefa1c39ed..5d0befea1ce 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'Personal project permissions' do
+ describe 'Personal project permissions', :reliable do
let!(:owner) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
let!(:owner_api_client) { Runtime::API::Client.new(:gitlab, user: owner) }
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb
index e7025920def..96f5731ea65 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Plan', :smoke, :reliable do
+ RSpec.describe 'Plan', :smoke do
describe 'mention' do
let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
let(:project) do
diff --git a/qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb b/qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb
index e5a6c57656e..ea531d84634 100644
--- a/qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb
@@ -30,7 +30,7 @@ module QA
setup_project_integration_with_jenkins
- expect(page).to have_text("Jenkins CI activated.")
+ expect(page).to have_text("Jenkins settings saved and active.")
QA::Support::Retrier.retry_on_exception do
Resource::Repository::ProjectPush.fabricate! do |push|
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb
index c4aacd8fb06..3373f4f4233 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', :reliable do
describe 'Merge request custom templates' do
let(:template_name) { 'custom_merge_request_template'}
let(:template_content) { 'This is a custom merge request template test' }
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 b0c6d01e8ca..d1e852979d0 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
@@ -3,7 +3,7 @@
module QA
RSpec.describe 'Create' do
describe 'Merge request creation from fork', quarantine: {
- only: { subdomain: %i[canary production] },
+ only: :production,
issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/343801",
type: :investigation
} do
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb
index a2b27e294e6..8885163b5e3 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', :reliable do
describe 'Reverting a commit' do
let(:file_name) { "secret_file.md" }
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 90ca836f8b0..d66895de9c1 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
@@ -19,7 +19,7 @@ module QA
Flow::Login.sign_in
end
- it 'can be reverted', :can_use_large_setup, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347709', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/335987', type: :investigating } do
+ it 'can be reverted', :can_use_large_setup, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347709' do
revertable_merge_request.visit!
Page::MergeRequest::Show.perform do |merge_request|
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb
index f335cfdb367..095444d99f1 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', :reliable do
context 'File management' do
file_name = 'QA Test - File name'
file_content = 'QA Test - File content'
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb
index 25c095d9eda..95e7a2a12d0 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', :reliable do
context 'File management' do
let(:file) { Resource::File.fabricate_via_api! }
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 ce99822b572..0560a5b125c 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
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Multiple file snippet' do
+ describe 'Multiple file snippet', :reliable do
let(:snippet) do
Resource::Snippet.fabricate_via_browser_ui! do |snippet|
snippet.title = 'Personal snippet with multiple files'
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 70891ec72c7..77b3c4df7e1 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
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', :reliable do
describe 'Multiple file snippet' do
let(:snippet) do
Resource::ProjectSnippet.fabricate_via_browser_ui! do |snippet|
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb
index b6092ef0c4c..e9339342386 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Multiple file snippet' do
+ describe 'Multiple file snippet', :reliable do
let(:personal_snippet) do
Resource::Snippet.fabricate_via_api! do |snippet|
snippet.title = 'Personal snippet to delete file from'
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb
index 6777c113f36..182a21a9377 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Sharing snippets' do
+ describe 'Sharing snippets', :reliable do
let(:snippet) do
Resource::Snippet.fabricate! do |snippet|
snippet.title = 'Shared snippet'
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb
index 653c0657c81..e9871a70560 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb
@@ -2,10 +2,13 @@
module QA
RSpec.describe 'Create' do
- describe 'Open a fork in Web IDE', quarantine: {
+ describe 'Open a fork in Web IDE',
+ # TODO: remove limitation to only run on main when the test is fixed
+ only: { pipeline: :main },
+ quarantine: {
issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/351696",
type: :flaky
- } do
+ } do
let(:parent_project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'parent-project'
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb
index 7704111ea21..5bb60e64da5 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb
@@ -135,7 +135,7 @@ module QA
def go_to_pipeline_job(user)
Flow::Login.sign_in(as: user)
project.visit!
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'completed')
+ Flow::Pipeline.visit_latest_pipeline
Page::Project::Pipeline::Show.perform do |pipeline|
pipeline.click_job('job')
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb
new file mode 100644
index 00000000000..496cc5f8a60
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+module QA
+ # TODO:
+ # Remove FF :ci_trigger_forward_variables
+ # when https://gitlab.com/gitlab-org/gitlab/-/issues/355572 is closed
+ RSpec.describe 'Verify', :runner, feature_flag: {
+ name: 'ci_trigger_forward_variables',
+ scope: :global
+ } do
+ describe 'UI defined variable' do
+ include_context 'variable inheritance test prep'
+
+ before do
+ add_ci_file(downstream1_project, [downstream1_ci_file])
+ add_ci_file(upstream_project, [upstream_ci_file, upstream_child1_ci_file])
+
+ start_pipeline_with_variable
+ Page::Project::Pipeline::Show.perform do |show|
+ Support::Waiter.wait_until { show.passed? }
+ end
+ end
+
+ it(
+ 'is inheritable when forward:pipeline_variables is true',
+ :aggregate_failures,
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358197'
+ ) do
+ visit_job_page('child1', 'child1_job')
+ verify_job_log_shows_variable_value
+
+ page.go_back
+
+ visit_job_page('downstream1', 'downstream1_job')
+ verify_job_log_shows_variable_value
+ end
+
+ def upstream_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ stages:
+ - test
+ - deploy
+
+ child1_trigger:
+ stage: test
+ trigger:
+ include: .child1-ci.yml
+ forward:
+ pipeline_variables: true
+
+ downstream1_trigger:
+ stage: deploy
+ trigger:
+ project: #{downstream1_project.full_path}
+ forward:
+ pipeline_variables: true
+ YAML
+ }
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb
new file mode 100644
index 00000000000..2a0aaf6d7a3
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb
@@ -0,0 +1,91 @@
+# frozen_string_literal: true
+
+module QA
+ # TODO:
+ # Remove FF :ci_trigger_forward_variables
+ # when https://gitlab.com/gitlab-org/gitlab/-/issues/355572 is closed
+ RSpec.describe 'Verify', :runner, feature_flag: {
+ name: 'ci_trigger_forward_variables',
+ scope: :global
+ } do
+ describe 'UI defined variable' do
+ include_context 'variable inheritance test prep'
+
+ before do
+ add_ci_file(downstream1_project, [downstream1_ci_file])
+ add_ci_file(downstream2_project, [downstream2_ci_file])
+ add_ci_file(upstream_project, [upstream_ci_file, upstream_child1_ci_file, upstream_child2_ci_file])
+
+ start_pipeline_with_variable
+ Page::Project::Pipeline::Show.perform do |show|
+ Support::Waiter.wait_until { show.passed? }
+ end
+ end
+
+ it(
+ 'is not inheritable when forward:pipeline_variables is false',
+ :aggregate_failures,
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358199'
+ ) do
+ visit_job_page('child1', 'child1_job')
+ verify_job_log_does_not_show_variable_value
+
+ page.go_back
+
+ visit_job_page('downstream1', 'downstream1_job')
+ verify_job_log_does_not_show_variable_value
+ end
+
+ it(
+ 'is not inheritable by default',
+ :aggregate_failures,
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358200'
+ ) do
+ visit_job_page('child2', 'child2_job')
+ verify_job_log_does_not_show_variable_value
+
+ page.go_back
+
+ visit_job_page('downstream2', 'downstream2_job')
+ verify_job_log_does_not_show_variable_value
+ end
+
+ def upstream_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ stages:
+ - test
+ - deploy
+
+ child1_trigger:
+ stage: test
+ trigger:
+ include: .child1-ci.yml
+ forward:
+ pipeline_variables: false
+
+ # default behavior
+ child2_trigger:
+ stage: test
+ trigger:
+ include: .child2-ci.yml
+
+ downstream1_trigger:
+ stage: deploy
+ trigger:
+ project: #{downstream1_project.full_path}
+ forward:
+ pipeline_variables: false
+
+ # default behavior
+ downstream2_trigger:
+ stage: deploy
+ trigger:
+ project: #{downstream2_project.full_path}
+ YAML
+ }
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb
index bd3135bafdc..1bba5355790 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb
@@ -1,7 +1,10 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Verify', :smoke, :runner do
+ RSpec.describe 'Verify', :smoke, :runner, quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/356295',
+ type: :investigating
+ } do
describe 'Pipeline creation and processing' do
let(:executor) { "qa-runner-#{Time.now.to_i}" }
@@ -58,6 +61,16 @@ module QA
artifacts:
paths:
- my-artifacts/
+
+ test-coverage-report:
+ tags:
+ - #{executor}
+ script: mkdir coverage; echo "CONTENTS" > coverage/cobertura.xml
+ artifacts:
+ reports:
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage/cobertura.xml
YAML
}
]
@@ -71,7 +84,8 @@ module QA
'test-success': 'passed',
'test-failure': 'failed',
'test-tags-mismatch': 'pending',
- 'test-artifacts': 'passed'
+ 'test-artifacts': 'passed',
+ 'test-coverage-report': 'passed'
}.each do |job, status|
Page::Project::Pipeline::Show.perform do |pipeline|
pipeline.click_job(job)
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb
index 9521cd20fc5..2fa6b9179ef 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb
@@ -32,7 +32,7 @@ module QA
add_included_files
add_main_ci_file
project.visit!
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'succeeded')
+ Flow::Pipeline.visit_latest_pipeline(status: 'passed')
end
after do
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb
index 9abb25c8dc1..3356d1274c8 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/locked_artifacts_spec.rb
@@ -56,7 +56,7 @@ module QA
)
end.project.visit!
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'completed')
+ Flow::Pipeline.visit_latest_pipeline
Page::Project::Pipeline::Show.perform do |pipeline|
pipeline.click_job('test-artifacts')
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/multi-project_pipelines_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/multi-project_pipelines_spec.rb
new file mode 100644
index 00000000000..0d8756fc9a3
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/multi-project_pipelines_spec.rb
@@ -0,0 +1,105 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Verify' do
+ describe 'Multi-project pipelines' do
+ let(:downstream_job_name) { 'downstream_job' }
+ let(:executor) { "qa-runner-#{SecureRandom.hex(4)}" }
+ let!(:group) { Resource::Group.fabricate_via_api! }
+
+ let(:upstream_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.group = group
+ project.name = 'upstream-project'
+ end
+ end
+
+ let(:downstream_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.group = group
+ project.name = 'downstream-project'
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate_via_api! do |runner|
+ runner.token = group.reload!.runners_token
+ runner.name = executor
+ runner.tags = [executor]
+ end
+ end
+
+ before do
+ add_ci_file(downstream_project, downstream_ci_file)
+ add_ci_file(upstream_project, upstream_ci_file)
+
+ Flow::Login.sign_in
+ upstream_project.visit!
+ Flow::Pipeline.visit_latest_pipeline(status: 'passed')
+ end
+
+ after do
+ runner.remove_via_api!
+ [upstream_project, downstream_project].each(&:remove_via_api!)
+ end
+
+ it(
+ 'creates a multi-project pipeline',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358064'
+ ) do
+ Page::Project::Pipeline::Show.perform do |show|
+ expect(show).to have_passed
+ expect(show).not_to have_job(downstream_job_name)
+
+ show.expand_linked_pipeline
+
+ expect(show).to have_job(downstream_job_name)
+ end
+ end
+
+ private
+
+ def add_ci_file(project, file)
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add CI config file'
+ commit.add_files([file])
+ end
+ end
+
+ def upstream_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ stages:
+ - test
+ - deploy
+
+ job1:
+ stage: test
+ tags: ["#{executor}"]
+ script: echo 'done'
+
+ staging:
+ stage: deploy
+ trigger:
+ project: #{downstream_project.path_with_namespace}
+ strategy: depend
+ YAML
+ }
+ end
+
+ def downstream_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ "#{downstream_job_name}":
+ stage: test
+ tags: ["#{executor}"]
+ script: echo 'done'
+ YAML
+ }
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb
new file mode 100644
index 00000000000..5b7a569fa8a
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb
@@ -0,0 +1,119 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Verify', :runner, :reliable do
+ describe 'Parent-child pipelines dependent relationship' do
+ let!(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'pipelines-dependent-relationship'
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate_via_api! do |runner|
+ runner.project = project
+ runner.name = project.name
+ runner.tags = ["#{project.name}"]
+ end
+ end
+
+ before do
+ Flow::Login.sign_in
+ end
+
+ after do
+ runner.remove_via_api!
+ end
+
+ it(
+ 'parent pipelines passes if child passes',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358062'
+ ) do
+ add_ci_files(success_child_ci_file)
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |parent_pipeline|
+ expect(parent_pipeline).to have_child_pipeline
+ expect { parent_pipeline.has_passed? }.to eventually_be_truthy
+ end
+ end
+
+ it(
+ 'parent pipeline fails if child fails',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358063'
+ ) do
+ add_ci_files(fail_child_ci_file)
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |parent_pipeline|
+ expect(parent_pipeline).to have_child_pipeline
+ expect { parent_pipeline.has_failed? }.to eventually_be_truthy
+ end
+ end
+
+ private
+
+ def success_child_ci_file
+ {
+ file_path: '.child-ci.yml',
+ content: <<~YAML
+ child_job:
+ stage: test
+ tags: ["#{project.name}"]
+ script: echo "Child job done!"
+
+ YAML
+ }
+ end
+
+ def fail_child_ci_file
+ {
+ file_path: '.child-ci.yml',
+ content: <<~YAML
+ child_job:
+ stage: test
+ tags: ["#{project.name}"]
+ script: exit 1
+
+ YAML
+ }
+ end
+
+ def parent_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ stages:
+ - test
+ - deploy
+
+ job1:
+ stage: test
+ trigger:
+ include: ".child-ci.yml"
+ strategy: depend
+
+ job2:
+ stage: deploy
+ tags: ["#{project.name}"]
+ script: echo "parent deploy done"
+
+ YAML
+ }
+ end
+
+ def add_ci_files(child_ci_file)
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add parent and child pipelines CI files.'
+ commit.add_files(
+ [
+ child_ci_file,
+ parent_ci_file
+ ]
+ )
+ end.project.visit!
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb
new file mode 100644
index 00000000000..9e3c29db9e7
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb
@@ -0,0 +1,118 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Verify', :runner, :reliable do
+ describe 'Parent-child pipelines independent relationship' do
+ let!(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'pipeline-independent-relationship'
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate_via_api! do |runner|
+ runner.project = project
+ runner.name = project.name
+ runner.tags = [project.name]
+ end
+ end
+
+ before do
+ Flow::Login.sign_in
+ end
+
+ after do
+ runner.remove_via_api!
+ end
+
+ it(
+ 'parent pipelines passes if child passes',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358059'
+ ) do
+ add_ci_files(success_child_ci_file)
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |parent_pipeline|
+ expect(parent_pipeline).to have_child_pipeline
+ expect { parent_pipeline.has_passed? }.to eventually_be_truthy
+ end
+ end
+
+ it(
+ 'parent pipeline passes even if child fails',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358060'
+ ) do
+ add_ci_files(fail_child_ci_file)
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |parent_pipeline|
+ expect(parent_pipeline).to have_child_pipeline
+ expect { parent_pipeline.has_passed? }.to eventually_be_truthy
+ end
+ end
+
+ private
+
+ def success_child_ci_file
+ {
+ file_path: '.child-ci.yml',
+ content: <<~YAML
+ child_job:
+ stage: test
+ tags: ["#{project.name}"]
+ script: echo "Child job done!"
+
+ YAML
+ }
+ end
+
+ def fail_child_ci_file
+ {
+ file_path: '.child-ci.yml',
+ content: <<~YAML
+ child_job:
+ stage: test
+ tags: ["#{project.name}"]
+ script: exit 1
+
+ YAML
+ }
+ end
+
+ def parent_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ stages:
+ - test
+ - deploy
+
+ job1:
+ stage: test
+ trigger:
+ include: ".child-ci.yml"
+
+ job2:
+ stage: deploy
+ tags: ["#{project.name}"]
+ script: echo "parent deploy done"
+
+ YAML
+ }
+ end
+
+ def add_ci_files(child_ci_file)
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add parent and child pipelines CI files.'
+ commit.add_files(
+ [
+ child_ci_file,
+ parent_ci_file
+ ]
+ )
+ end.project.visit!
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb
index 0bc3fb7b829..bbcc71bade7 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb
@@ -3,8 +3,8 @@
module QA
RSpec.describe 'Verify', :runner do
describe 'Pass dotenv variables to downstream via bridge' do
- let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(8)}" }
- let(:upstream_var) { Faker::Alphanumeric.alphanumeric(8) }
+ let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" }
+ let(:upstream_var) { Faker::Alphanumeric.alphanumeric(number: 8) }
let(:group) { Resource::Group.fabricate_via_api! }
let(:upstream_project) do
@@ -34,7 +34,7 @@ module QA
add_ci_file(downstream_project, downstream_ci_file)
add_ci_file(upstream_project, upstream_ci_file)
upstream_project.visit!
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'succeeded')
+ Flow::Pipeline.visit_latest_pipeline(status: 'passed')
end
after do
@@ -44,8 +44,8 @@ module QA
it 'runs the pipeline with composed config', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348088' do
Page::Project::Pipeline::Show.perform do |parent_pipeline|
- Support::Waiter.wait_until { parent_pipeline.has_child_pipeline? }
- parent_pipeline.expand_child_pipeline
+ Support::Waiter.wait_until { parent_pipeline.has_linked_pipeline? }
+ parent_pipeline.expand_linked_pipeline
parent_pipeline.click_job('downstream_test')
end
@@ -73,7 +73,7 @@ module QA
stage: build
tags: ["#{executor}"]
script:
- - echo "DYNAMIC_ENVIRONMENT_VAR=#{upstream_var}" >> variables.env
+ - for i in `seq 1 20`; do echo "VAR_$i=#{upstream_var}" >> variables.env; done;
artifacts:
reports:
dotenv: variables.env
@@ -81,7 +81,7 @@ module QA
trigger:
stage: deploy
variables:
- PASSED_MY_VAR: $DYNAMIC_ENVIRONMENT_VAR
+ PASSED_MY_VAR: "$VAR_#{rand(1..20)}"
trigger: #{downstream_project.full_path}
YAML
}
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb
index 0e7a38626aa..b9f616aa733 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb
@@ -22,7 +22,7 @@ module QA
it(
'can create merge request',
- test_case: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349130'
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349130'
) do
Page::Project::PipelineEditor::New.perform(&:create_new_ci)
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb
index d1e9981ae74..f36593218a9 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb
@@ -42,7 +42,7 @@ module QA
it 'can trigger pipeline', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348011' do
Page::Project::Pipeline::Index.perform do |index|
- expect(index).not_to have_pipeline # should not auto trigger pipeline
+ expect(index).to have_no_pipeline # should not auto trigger pipeline
index.click_run_pipeline_button
end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb
index 7a2c2b4ae90..fb7e3a8437f 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb
@@ -1,11 +1,10 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Verify', :runner, quarantine: {
- type: :flaky,
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/351994'
- } do
+ RSpec.describe 'Verify', :runner do
describe 'Run pipeline with manual jobs' do
+ let(:executor) { "qa-runner-#{SecureRandom.hex(4)}" }
+
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'pipeline-with-manual-job'
@@ -16,7 +15,8 @@ module QA
let!(:runner) do
Resource::Runner.fabricate! do |runner|
runner.project = project
- runner.name = "qa-runner-#{SecureRandom.hex(3)}"
+ runner.name = executor
+ runner.tags = [executor]
end
end
@@ -36,22 +36,26 @@ module QA
Prep:
stage: Stage1
+ tags: ["#{executor}"]
script: exit 0
when: manual
Build:
stage: Stage2
+ tags: ["#{executor}"]
needs: ['Prep']
script: exit 0
parallel: 6
Test:
stage: Stage3
+ tags: ["#{executor}"]
needs: ['Build']
script: exit 0
Deploy:
stage: Stage3
+ tags: ["#{executor}"]
needs: ['Test']
script: exit 0
parallel: 6
@@ -65,15 +69,17 @@ module QA
before do
Flow::Login.sign_in
project.visit!
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'skipped')
+ Flow::Pipeline.visit_latest_pipeline(status: 'skipped')
end
after do
runner&.remove_via_api!
- project&.remove_via_api!
end
- it 'does not leave any job in skipped state', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349158' do
+ it(
+ 'does not leave any job in skipped state',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349158'
+ ) do
Page::Project::Pipeline::Show.perform do |show|
show.click_job_action('Prep') # Trigger pipeline manually
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb
index ed46481d3be..1c75beebb48 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb
@@ -23,7 +23,7 @@ module QA
Flow::Login.sign_in
add_ci_files
project.visit!
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'succeeded')
+ Flow::Pipeline.visit_latest_pipeline(status: 'passed')
end
after do
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb
index 94ac857f0fe..205b4d1168a 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb
@@ -23,7 +23,7 @@ module QA
Flow::Login.sign_in
add_ci_files
project.visit!
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'succeeded')
+ Flow::Pipeline.visit_latest_pipeline(status: 'passed')
end
after do
diff --git a/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb
index 8aa01888ae3..f8261bba342 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb
@@ -22,8 +22,6 @@ module QA
Page::Project::Menu.perform(&:go_to_ci_cd_settings)
Page::Project::Settings::CiCd.perform do |settings|
- sleep 5 # Runner should register within 5 seconds
-
settings.expand_runners_settings do |page|
expect(page).to have_content(executor)
expect(page).to have_online_runner
diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb
index c833aa1a5b8..f570ad335fe 100644
--- a/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_omnibus_spec.rb
@@ -3,6 +3,8 @@
module QA
RSpec.describe 'Package', :orchestrated, :skip_live_env do
describe 'Self-managed Container Registry' do
+ include Support::Helpers::MaskToken
+
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'project-with-registry'
@@ -110,9 +112,9 @@ module QA
let(:auth_token) do
case authentication_token_type
when :personal_access_token
- "\"#{personal_access_token}\""
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project)
when :project_deploy_token
- "\"#{project_deploy_token.token}\""
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project)
when :ci_job_token
'$CI_JOB_TOKEN'
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb
index 2da0f6a0cf8..d5ef9dce10d 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb
@@ -8,6 +8,7 @@ module QA
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'composer-package-project'
+ project.visibility = :private
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb
index 22495796605..1840ae4e7f8 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb
@@ -12,6 +12,7 @@ module QA
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'conan-package-project'
+ project.visibility = :private
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb
index 71acc3a8f92..e37102c17f7 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb
@@ -8,6 +8,7 @@ module QA
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'generic-package-project'
+ project.visibility = :private
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb
index d2e816f9bf9..078465770c6 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb
@@ -5,6 +5,7 @@ module QA
describe 'Helm Registry' do
using RSpec::Parameterized::TableSyntax
include Runtime::Fixtures
+ include Support::Helpers::MaskToken
include_context 'packages registry qa scenario'
let(:package_name) { "gitlab_qa_helm-#{SecureRandom.hex(8)}" }
@@ -32,11 +33,13 @@ module QA
let(:access_token) do
case authentication_token_type
when :personal_access_token
- personal_access_token
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: package_project)
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: client_project)
when :ci_job_token
'${CI_JOB_TOKEN}'
when :project_deploy_token
- project_deploy_token.token
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: package_project)
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: client_project)
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
index 04aaefbaf5c..0ee5f1b6a0b 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
@@ -5,6 +5,7 @@ module QA
describe 'npm instance level endpoint' do
using RSpec::Parameterized::TableSyntax
include Runtime::Fixtures
+ include Support::Helpers::MaskToken
let!(:registry_scope) { Runtime::Namespace.sandbox_name }
let!(:personal_access_token) do
@@ -78,11 +79,13 @@ module QA
let(:auth_token) do
case authentication_token_type
when :personal_access_token
- "\"#{personal_access_token}\""
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project)
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: another_project)
when :ci_job_token
'${CI_JOB_TOKEN}'
when :project_deploy_token
- "\"#{project_deploy_token.token}\""
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project)
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: another_project)
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
index cad1802f3e9..5ebcb94d0d0 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
@@ -5,6 +5,7 @@ module QA
describe 'npm project level endpoint' do
using RSpec::Parameterized::TableSyntax
include Runtime::Fixtures
+ include Support::Helpers::MaskToken
let!(:registry_scope) { Runtime::Namespace.sandbox_name }
let!(:personal_access_token) do
@@ -34,6 +35,7 @@ module QA
let!(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'npm-project-level'
+ project.visibility = :private
end
end
@@ -69,11 +71,11 @@ module QA
let(:auth_token) do
case authentication_token_type
when :personal_access_token
- "\"#{personal_access_token}\""
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project)
when :ci_job_token
'${CI_JOB_TOKEN}'
when :project_deploy_token
- "\"#{project_deploy_token.token}\""
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project)
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
index b0a6555a16b..0ddb59d6625 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
@@ -5,6 +5,7 @@ module QA
describe 'NuGet group level endpoint' do
using RSpec::Parameterized::TableSyntax
include Runtime::Fixtures
+ include Support::Helpers::MaskToken
let(:project) do
Resource::Project.fabricate_via_api! do |project|
@@ -61,6 +62,8 @@ module QA
after do
runner.remove_via_api!
package.remove_via_api!
+ project.remove_via_api!
+ another_project.remove_via_api!
end
where(:case_name, :authentication_token_type, :token_name, :testcase) do
@@ -73,11 +76,13 @@ module QA
let(:auth_token_password) do
case authentication_token_type
when :personal_access_token
- "\"#{personal_access_token.token}\""
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token.token, project: project)
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token.token, project: another_project)
when :ci_job_token
'${CI_JOB_TOKEN}'
when :group_deploy_token
- "\"#{group_deploy_token.token}\""
+ use_ci_variable(name: 'GROUP_DEPLOY_TOKEN', value: group_deploy_token.token, project: project)
+ use_ci_variable(name: 'GROUP_DEPLOY_TOKEN', value: group_deploy_token.token, project: another_project)
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
index 4cac055634e..d5fd78480d2 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
@@ -3,6 +3,8 @@
module QA
RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
describe 'NuGet project level endpoint' do
+ include Support::Helpers::MaskToken
+
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'nuget-package-project'
@@ -77,11 +79,11 @@ module QA
let(:auth_token_password) do
case authentication_token_type
when :personal_access_token
- "\"#{personal_access_token.token}\""
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token.token, project: project)
when :ci_job_token
'${CI_JOB_TOKEN}'
when :project_deploy_token
- "\"#{project_deploy_token.token}\""
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project)
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb
index a0c2eca5bd2..4614eced300 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb
@@ -4,10 +4,12 @@ module QA
RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
describe 'PyPI Repository' do
include Runtime::Fixtures
+ include Support::Helpers::MaskToken
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'pypi-package-project'
+ project.visibility = :private
end
end
@@ -30,7 +32,7 @@ module QA
let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) }
let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" }
let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" }
- let(:personal_access_token) { Runtime::Env.personal_access_token }
+ let(:personal_access_token) { use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: Runtime::Env.personal_access_token, project: project) }
before do
Flow::Login.sign_in
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb
index b2208dc644c..409a1c10943 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb
@@ -1,13 +1,15 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :requires_admin, :packages, :object_storage do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage,
+ feature_flag: { name: 'rubygem_packages', scope: :project } do
describe 'RubyGems Repository' do
include Runtime::Fixtures
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'rubygems-package-project'
+ project.visibility = :private
end
end
diff --git a/qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_dependent_relationship_spec.rb b/qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_dependent_relationship_spec.rb
deleted file mode 100644
index e34f41b4c95..00000000000
--- a/qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_dependent_relationship_spec.rb
+++ /dev/null
@@ -1,113 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Release', :runner, :reliable do
- describe 'Parent-child pipelines dependent relationship' do
- let!(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'pipelines-dependent-relationship'
- end
- end
-
- let!(:runner) do
- Resource::Runner.fabricate_via_api! do |runner|
- runner.project = project
- runner.name = project.name
- runner.tags = ["#{project.name}"]
- end
- end
-
- before do
- Flow::Login.sign_in
- end
-
- after do
- runner.remove_via_api!
- end
-
- it 'parent pipelines passes if child passes', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348092' do
- add_ci_files(success_child_ci_file)
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'completed')
-
- Page::Project::Pipeline::Show.perform do |parent_pipeline|
- expect(parent_pipeline).to have_child_pipeline
- expect(parent_pipeline).to have_passed
- end
- end
-
- it 'parent pipeline fails if child fails', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348091' do
- add_ci_files(fail_child_ci_file)
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'completed')
-
- Page::Project::Pipeline::Show.perform do |parent_pipeline|
- expect(parent_pipeline).to have_child_pipeline
- expect(parent_pipeline).to have_failed
- end
- end
-
- private
-
- def success_child_ci_file
- {
- file_path: '.child-ci.yml',
- content: <<~YAML
- child_job:
- stage: test
- tags: ["#{project.name}"]
- script: echo "Child job done!"
-
- YAML
- }
- end
-
- def fail_child_ci_file
- {
- file_path: '.child-ci.yml',
- content: <<~YAML
- child_job:
- stage: test
- tags: ["#{project.name}"]
- script: exit 1
-
- YAML
- }
- end
-
- def parent_ci_file
- {
- file_path: '.gitlab-ci.yml',
- content: <<~YAML
- stages:
- - test
- - deploy
-
- job1:
- stage: test
- trigger:
- include: ".child-ci.yml"
- strategy: depend
-
- job2:
- stage: deploy
- tags: ["#{project.name}"]
- script: echo "parent deploy done"
-
- YAML
- }
- end
-
- def add_ci_files(child_ci_file)
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'Add parent and child pipelines CI files.'
- commit.add_files(
- [
- child_ci_file,
- parent_ci_file
- ]
- )
- end.project.visit!
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_independent_relationship_spec.rb b/qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_independent_relationship_spec.rb
deleted file mode 100644
index ef0c8d35c37..00000000000
--- a/qa/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_independent_relationship_spec.rb
+++ /dev/null
@@ -1,112 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Release', :runner, :reliable do
- describe 'Parent-child pipelines independent relationship' do
- let!(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'pipeline-independent-relationship'
- end
- end
-
- let!(:runner) do
- Resource::Runner.fabricate_via_api! do |runner|
- runner.project = project
- runner.name = project.name
- runner.tags = [project.name]
- end
- end
-
- before do
- Flow::Login.sign_in
- end
-
- after do
- runner.remove_via_api!
- end
-
- it 'parent pipelines passes if child passes', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348093' do
- add_ci_files(success_child_ci_file)
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'completed')
-
- Page::Project::Pipeline::Show.perform do |parent_pipeline|
- expect(parent_pipeline).to have_child_pipeline
- expect(parent_pipeline).to have_passed
- end
- end
-
- it 'parent pipeline passes even if child fails', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348094' do
- add_ci_files(fail_child_ci_file)
- Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'completed')
-
- Page::Project::Pipeline::Show.perform do |parent_pipeline|
- expect(parent_pipeline).to have_child_pipeline
- expect(parent_pipeline).to have_passed
- end
- end
-
- private
-
- def success_child_ci_file
- {
- file_path: '.child-ci.yml',
- content: <<~YAML
- child_job:
- stage: test
- tags: ["#{project.name}"]
- script: echo "Child job done!"
-
- YAML
- }
- end
-
- def fail_child_ci_file
- {
- file_path: '.child-ci.yml',
- content: <<~YAML
- child_job:
- stage: test
- tags: ["#{project.name}"]
- script: exit 1
-
- YAML
- }
- end
-
- def parent_ci_file
- {
- file_path: '.gitlab-ci.yml',
- content: <<~YAML
- stages:
- - test
- - deploy
-
- job1:
- stage: test
- trigger:
- include: ".child-ci.yml"
-
- job2:
- stage: deploy
- tags: ["#{project.name}"]
- script: echo "parent deploy done"
-
- YAML
- }
- end
-
- def add_ci_files(child_ci_file)
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'Add parent and child pipelines CI files.'
- commit.add_files(
- [
- child_ci_file,
- parent_ci_file
- ]
- )
- end.project.visit!
- end
- end
- end
-end
diff --git a/qa/qa/specs/helpers/feature_flag.rb b/qa/qa/specs/helpers/feature_flag.rb
new file mode 100644
index 00000000000..b9de2332c19
--- /dev/null
+++ b/qa/qa/specs/helpers/feature_flag.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'rspec/core'
+
+module QA
+ module Specs
+ module Helpers
+ module FeatureFlag
+ extend self
+
+ def skip_or_run_feature_flag_tests_or_contexts(example)
+ if example.metadata.key?(:feature_flag)
+ feature_flag_tag = example.metadata[:feature_flag]
+
+ global_feature_flag_message = 'Skipping on .com environments due to global feature flag usage'
+ feature_flag_message = 'Skipping on production due to feature flag usage'
+
+ if feature_flag_tag.is_a?(Hash) && feature_flag_tag[:scope] == :global
+ # Tests using a global feature flag will be skipped on live .com environments.
+ # This is to avoid flakiness with other tests running in parallel on the same environment
+ # as well as interfering with feature flag experimentation done by development groups.
+ example.metadata[:skip] = global_feature_flag_message if ContextSelector.dot_com?
+ else
+ # Tests using a feature flag scoped to an actor (ex: :project, :user, :group), or
+ # with no scope defined (such as in the case of a low risk global feature flag),
+ # will only be skipped in canary and production due to no admin account existing there.
+ example.metadata[:skip] = feature_flag_message if ContextSelector.context_matches?(:production)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/runner.rb b/qa/qa/specs/runner.rb
index 2b9adf0e870..c30e5d822c4 100644
--- a/qa/qa/specs/runner.rb
+++ b/qa/qa/specs/runner.rb
@@ -52,6 +52,8 @@ module QA
tags_for_rspec
end
+ # rubocop:disable Metrics/AbcSize
+ # rubocop:disable Metrics/CyclomaticComplexity
def perform
args = []
args.push('--tty') if tty
@@ -89,12 +91,29 @@ module QA
File.open(filename, 'w') { |f| f.write(total_examples) } if total_examples.to_i > 0
$stdout.puts "Total examples in #{Runtime::Scenario.klass}: #{total_examples}#{total_examples.to_i > 0 ? ". Saved to file: #{filename}" : ''}"
+ elsif Runtime::Scenario.attributes[:test_metadata_only]
+ args.unshift('--dry-run')
+
+ output_file = Pathname.new(File.join(Runtime::Path.qa_root, 'tmp', 'test-metadata.json'))
+
+ RSpec.configure do |config|
+ config.add_formatter(QA::Support::JsonFormatter, output_file)
+ config.fail_if_no_examples = true
+ end
+
+ RSpec::Core::Runner.run(args.flatten, $stderr, $stdout) do |status|
+ abort if status.nonzero?
+ end
+
+ $stdout.puts "Saved to file: #{output_file}"
else
RSpec::Core::Runner.run(args.flatten, *DEFAULT_STD_ARGS).tap do |status|
abort if status.nonzero?
end
end
end
+ # rubocop:enable Metrics/AbcSize
+ # rubocop:enable Metrics/CyclomaticComplexity
private
diff --git a/qa/qa/support/api.rb b/qa/qa/support/api.rb
index 976188e45c6..0c0a1a90ff2 100644
--- a/qa/qa/support/api.rb
+++ b/qa/qa/support/api.rb
@@ -20,9 +20,7 @@ module QA
verify_ssl: false
}
- RestClient::Request.execute(
- default_args.merge(args)
- )
+ RestClient::Request.execute(default_args.merge(args))
rescue RestClient::ExceptionWithResponse => e
return_response_or_raise(e)
end
@@ -56,13 +54,16 @@ module QA
end
end
- def put(url, payload = nil)
+ def put(url, payload = nil, args = {})
with_retry_on_too_many_requests do
- RestClient::Request.execute(
+ default_args = {
method: :put,
url: url,
payload: payload,
- verify_ssl: false)
+ verify_ssl: false
+ }
+
+ RestClient::Request.execute(default_args.merge(args))
rescue RestClient::ExceptionWithResponse => e
return_response_or_raise(e)
end
diff --git a/qa/qa/support/formatters/feature_flag_formatter.rb b/qa/qa/support/formatters/feature_flag_formatter.rb
new file mode 100644
index 00000000000..94c039586f9
--- /dev/null
+++ b/qa/qa/support/formatters/feature_flag_formatter.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module QA
+ module Support
+ module Formatters
+ class FeatureFlagFormatter < ::RSpec::Core::Formatters::BaseFormatter
+ include Specs::Helpers::FeatureFlag
+
+ ::RSpec::Core::Formatters.register(
+ self,
+ :example_group_started,
+ :example_started
+ )
+
+ # Starts example group
+ # @param [RSpec::Core::Notifications::GroupNotification] example_group_notification
+ # @return [void]
+ def example_group_started(example_group_notification)
+ group = example_group_notification.group
+
+ skip_or_run_feature_flag_tests_or_contexts(group)
+ end
+
+ # Starts example
+ # @param [RSpec::Core::Notifications::ExampleNotification] example_notification
+ # @return [void]
+ def example_started(example_notification)
+ example = example_notification.example
+
+ # if skip propagated from example_group, do not reset skip metadata
+ skip_or_run_feature_flag_tests_or_contexts(example) unless example.metadata[:skip]
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/support/formatters/test_stats_formatter.rb b/qa/qa/support/formatters/test_stats_formatter.rb
index 16fc0a50b1b..9d19c2e8bb5 100644
--- a/qa/qa/support/formatters/test_stats_formatter.rb
+++ b/qa/qa/support/formatters/test_stats_formatter.rb
@@ -64,6 +64,7 @@ module QA
name: example.full_description,
file_path: file_path,
status: example.execution_result.status,
+ smoke: example.metadata.key?(:smoke).to_s,
reliable: example.metadata.key?(:reliable).to_s,
quarantined: quarantined(example.metadata),
retried: ((example.metadata[:retry_attempts] || 0) > 0).to_s,
diff --git a/qa/qa/support/helpers/mask_token.rb b/qa/qa/support/helpers/mask_token.rb
new file mode 100644
index 00000000000..1f8161f7173
--- /dev/null
+++ b/qa/qa/support/helpers/mask_token.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module QA
+ module Support
+ module Helpers
+ module MaskToken
+ def use_ci_variable(name:, value:, project:)
+ Resource::CiVariable.fabricate_via_api! do |ci_variable|
+ ci_variable.project = project
+ ci_variable.key = name
+ ci_variable.value = value
+ ci_variable.protected = true
+ end
+ "$#{name}"
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/support/helpers/plan.rb b/qa/qa/support/helpers/plan.rb
index 298a6d3f036..b6950c6bacd 100644
--- a/qa/qa/support/helpers/plan.rb
+++ b/qa/qa/support/helpers/plan.rb
@@ -57,8 +57,9 @@ module QA
}.freeze
LICENSE_TYPE = {
- license_file: 'license file',
- cloud_license: 'cloud license'
+ legacy_license: 'legacy license',
+ online_cloud: 'online license',
+ offline_cloud: 'offline license'
}.freeze
end
end
diff --git a/qa/qa/support/loglinking.rb b/qa/qa/support/loglinking.rb
index 89519e9537c..caf381912d3 100644
--- a/qa/qa/support/loglinking.rb
+++ b/qa/qa/support/loglinking.rb
@@ -5,7 +5,7 @@ module QA
# Static address variables declared for mapping environment to logging URLs
STAGING_ADDRESS = 'https://staging.gitlab.com'
STAGING_REF_ADDRESS = 'https://staging-ref.gitlab.com'
- PRODUCTION_ADDRESS = 'https://www.gitlab.com'
+ PRODUCTION_ADDRESS = 'https://gitlab.com'
PRE_PROD_ADDRESS = 'https://pre.gitlab.com'
SENTRY_ENVIRONMENTS = {
staging: 'https://sentry.gitlab.net/gitlab/staginggitlabcom/?environment=gstg',
@@ -30,7 +30,7 @@ module QA
errors = ["Correlation Id: #{correlation_id}"]
errors << "Sentry Url: #{sentry_uri}&query=correlation_id%3A%22#{correlation_id}%22" if sentry_uri
- errors << "Kibana Url: #{kibana_uri}app/discover#/?_a=(query:(language:kuery,query:'json.correlation_id%20:%20#{correlation_id}'))" if kibana_uri
+ errors << "Kibana Url: #{kibana_uri}app/discover#/?_a=(query:(language:kuery,query:'json.correlation_id%20:%20#{correlation_id}'))&_g=(time:(from:now-24h%2Fh,to:now))" if kibana_uri
errors.join("\n")
end
diff --git a/qa/qa/support/matchers/have_matcher.rb b/qa/qa/support/matchers/have_matcher.rb
index a90d2df96ae..b96566a9e5d 100644
--- a/qa/qa/support/matchers/have_matcher.rb
+++ b/qa/qa/support/matchers/have_matcher.rb
@@ -10,6 +10,7 @@ module QA
file_content
assignee
child_pipeline
+ linked_pipeline
content
design
file
diff --git a/qa/qa/support/page_error_checker.rb b/qa/qa/support/page_error_checker.rb
index ede9b49bda6..192b8c147cd 100644
--- a/qa/qa/support/page_error_checker.rb
+++ b/qa/qa/support/page_error_checker.rb
@@ -49,7 +49,7 @@ module QA
error_code = 404 if Nokogiri::HTML.parse(page.html).xpath("//img").map { |t| t[:alt] }.first.eql?('404')
# 500 error page in header surrounded by newlines, try to match
- five_hundred_test = Nokogiri::HTML.parse(page.html).xpath("//h1").map.first
+ five_hundred_test = Nokogiri::HTML.parse(page.html).xpath("//h1/text()").map.first
unless five_hundred_test.nil?
error_code = 500 if five_hundred_test.text.include?('500')
end
@@ -61,6 +61,39 @@ module QA
end
end
+ # Log request errors triggered from async api calls from the browser
+ #
+ # If any errors are found in the session, log them
+ # using QA::Runtime::Logger
+ # @param [Capybara::Session] page
+ def log_request_errors(page)
+ return if QA::Runtime::Browser.blank_page?
+
+ url = page.driver.browser.current_url
+ QA::Runtime::Logger.debug "Fetching API error cache for #{url}"
+
+ cache = page.execute_script <<~JS
+ return !(typeof(Interceptor)==="undefined") ? Interceptor.getCache() : null;
+ JS
+
+ return unless cache&.dig('errors')
+
+ grouped_errors = group_errors(cache['errors'])
+
+ errors = grouped_errors.map do |error_metadata, request_id_string|
+ "#{error_metadata} -- #{request_id_string}"
+ end
+
+ unless errors.nil? || errors.empty?
+ QA::Runtime::Logger.error "Interceptor Api Errors\n#{errors.join("\n")}"
+ end
+
+ # clear the cache after logging the errors
+ page.execute_script <<~JS
+ Interceptor && Interceptor.saveCache({});
+ JS
+ end
+
def error_report_for(logs)
logs
.map(&:message)
@@ -70,6 +103,16 @@ module QA
def logs(page)
page.driver.browser.manage.logs.get(:browser)
end
+
+ private
+
+ def group_errors(errors)
+ errors.each_with_object({}) do |error, memo|
+ url = error['url']&.split('?')&.first || 'Unknown url'
+ key = "[#{error['status']}] #{error['method']} #{url}"
+ memo[key] = "Correlation Id: #{error.dig('headers', 'x-request-id') || 'Correlation Id not found'}"
+ end
+ end
end
end
end
diff --git a/qa/qa/support/wait_for_requests.rb b/qa/qa/support/wait_for_requests.rb
index 16af4bae521..89674a1d5c6 100644
--- a/qa/qa/support/wait_for_requests.rb
+++ b/qa/qa/support/wait_for_requests.rb
@@ -16,12 +16,16 @@ module QA
Waiter.wait_until(log: false) do
finished_all_ajax_requests? && (!skip_finished_loading_check ? finished_loading?(wait: 1) : true)
end
+ QA::Support::PageErrorChecker.log_request_errors(Capybara.page) if QA::Runtime::Env.can_intercept?
rescue Repeater::WaitExceededError
raise $!, 'Page did not fully load. This could be due to an unending async request or loading icon.'
end
def finished_all_ajax_requests?
- Capybara.page.evaluate_script('window.pendingRequests || window.pendingRailsUJSRequests || 0').zero? # rubocop:disable Style/NumericPredicate
+ requests = %w[window.pendingRequests window.pendingRailsUJSRequests 0]
+ requests.unshift('(window.Interceptor && window.Interceptor.activeFetchRequests)') if Runtime::Env.can_intercept?
+ script = requests.join(' || ')
+ Capybara.page.evaluate_script(script).zero? # rubocop:disable Style/NumericPredicate
end
def finished_loading?(wait: DEFAULT_MAX_WAIT_TIME)
diff --git a/qa/qa/tools/reliable_report.rb b/qa/qa/tools/reliable_report.rb
index 96e5690ce30..b3df6de3d54 100644
--- a/qa/qa/tools/reliable_report.rb
+++ b/qa/qa/tools/reliable_report.rb
@@ -11,6 +11,8 @@ module QA
include Support::InfluxdbTools
include Support::API
+ RELIABLE_REPORT_LABEL = "reliable test report"
+
# Project for report creation: https://gitlab.com/gitlab-org/gitlab
PROJECT_ID = 278964
@@ -28,7 +30,11 @@ module QA
reporter = new(range)
reporter.print_report
- reporter.report_in_issue_and_slack if report_in_issue_and_slack == "true"
+
+ if report_in_issue_and_slack == "true"
+ reporter.report_in_issue_and_slack
+ reporter.close_previous_reports
+ end
rescue StandardError => e
reporter&.notify_failure(e)
raise(e)
@@ -51,16 +57,15 @@ module QA
# @return [void]
def report_in_issue_and_slack
puts "Creating report".colorize(:green)
- response = post(
- "#{gitlab_api_url}/projects/#{PROJECT_ID}/issues",
- {
- title: "Reliable e2e test report",
- description: report_issue_body,
- labels: "Quality,test,type::maintenance,reliable test report,automation:ml"
- },
- headers: { "PRIVATE-TOKEN" => gitlab_access_token }
+ issue = api_update(
+ :post,
+ "projects/#{PROJECT_ID}/issues",
+ title: "Reliable e2e test report",
+ description: report_issue_body,
+ labels: "#{RELIABLE_REPORT_LABEL},Quality,test,type::maintenance,automation:ml"
)
- web_url = parse_body(response)[:web_url]
+ @report_iid = issue[:iid]
+ web_url = issue[:web_url]
puts "Created report issue: #{web_url}"
puts "Sending slack notification".colorize(:green)
@@ -76,6 +81,25 @@ module QA
puts "Done!"
end
+ # Close previous reliable test reports
+ #
+ # @return [void]
+ def close_previous_reports
+ puts "Closing previous reports".colorize(:green)
+ issues = api_get("projects/#{PROJECT_ID}/issues?labels=#{RELIABLE_REPORT_LABEL}&state=opened")
+
+ issues
+ .reject { |issue| issue[:iid] == report_iid }
+ .each do |issue|
+ issue_iid = issue[:iid]
+ issue_endpoint = "projects/#{PROJECT_ID}/issues/#{issue_iid}"
+
+ puts "Closing previous report '#{issue[:web_url]}'"
+ api_update(:put, issue_endpoint, state_event: "close")
+ api_update(:post, "#{issue_endpoint}/notes", body: "Closed issue in favor of ##{report_iid}")
+ end
+ end
+
# Notify failure
#
# @param [StandardError] error
@@ -89,7 +113,39 @@ module QA
private
- attr_reader :range, :slack_channel
+ attr_reader :range, :slack_channel, :report_iid
+
+ # Slack notifier
+ #
+ # @return [Slack::Notifier]
+ def notifier
+ @notifier ||= Slack::Notifier.new(
+ slack_webhook_url,
+ channel: slack_channel,
+ username: "Reliable Spec Report"
+ )
+ end
+
+ # Gitlab access token
+ #
+ # @return [String]
+ def gitlab_access_token
+ @gitlab_access_token ||= ENV["GITLAB_ACCESS_TOKEN"] || raise("Missing GITLAB_ACCESS_TOKEN env variable")
+ end
+
+ # Gitlab api url
+ #
+ # @return [String]
+ def gitlab_api_url
+ @gitlab_api_url ||= ENV["CI_API_V4_URL"] || raise("Missing CI_API_V4_URL env variable")
+ end
+
+ # Slack webhook url
+ #
+ # @return [String]
+ def slack_webhook_url
+ @slack_webhook_url ||= ENV["SLACK_WEBHOOK"] || raise("Missing SLACK_WEBHOOK env variable")
+ end
# Markdown formatted report issue body
#
@@ -316,6 +372,7 @@ module QA
|> filter(fn: (r) => r.status != "pending" and
r.merge_request == "false" and
r.quarantined == "false" and
+ r.smoke == "false" and
r.reliable == "#{reliable}" and
r._field == "id"
)
@@ -323,36 +380,30 @@ module QA
QUERY
end
- # Slack notifier
+ # Api get request
#
- # @return [Slack::Notifier]
- def notifier
- @notifier ||= Slack::Notifier.new(
- slack_webhook_url,
- channel: slack_channel,
- username: "Reliable Spec Report"
- )
+ # @param [String] path
+ # @param [Hash] payload
+ # @return [Hash, Array]
+ def api_get(path)
+ response = get("#{gitlab_api_url}/#{path}", { headers: { "PRIVATE-TOKEN" => gitlab_access_token } })
+ parse_body(response)
end
- # Gitlab access token
+ # Api update request
#
- # @return [String]
- def gitlab_access_token
- @gitlab_access_token ||= ENV["GITLAB_ACCESS_TOKEN"] || raise("Missing GITLAB_ACCESS_TOKEN env variable")
- end
-
- # Gitlab api url
- #
- # @return [String]
- def gitlab_api_url
- @gitlab_api_url ||= ENV["CI_API_V4_URL"] || raise("Missing CI_API_V4_URL env variable")
- end
-
- # Slack webhook url
- #
- # @return [String]
- def slack_webhook_url
- @slack_webhook_url ||= ENV["SLACK_WEBHOOK"] || raise("Missing SLACK_WEBHOOK env variable")
+ # @param [Symbol] verb :post or :put
+ # @param [String] path
+ # @param [Hash] payload
+ # @return [Hash, Array]
+ def api_update(verb, path, **payload)
+ response = send(
+ verb,
+ "#{gitlab_api_url}/#{path}",
+ payload,
+ { headers: { "PRIVATE-TOKEN" => gitlab_access_token } }
+ )
+ parse_body(response)
end
end
end
diff --git a/qa/qa/tools/test_resources_handler.rb b/qa/qa/tools/test_resources_handler.rb
index 476f87fff6b..5218e6df217 100644
--- a/qa/qa/tools/test_resources_handler.rb
+++ b/qa/qa/tools/test_resources_handler.rb
@@ -75,11 +75,15 @@ module QA
# Download files from GCS bucket by environment name
# Delete the files afterward
def download(ci_project_name)
- files_list = gcs_storage.list_objects(BUCKET, prefix: ci_project_name).items.each_with_object([]) do |obj, arr|
+ bucket_items = gcs_storage.list_objects(BUCKET, prefix: ci_project_name).items
+
+ files_list = bucket_items&.each_with_object([]) do |obj, arr|
arr << obj.name
end
- return puts "\nNothing to download!" if files_list.empty?
+ return puts "\nNothing to download!" if files_list.blank?
+
+ FileUtils.mkdir_p('tmp/')
files_list.each do |file_name|
local_path = "tmp/#{file_name.split('/').last}"
diff --git a/qa/qa/vendor/jenkins/page/configure_job.rb b/qa/qa/vendor/jenkins/page/configure_job.rb
index 471567ec828..65719795720 100644
--- a/qa/qa/vendor/jenkins/page/configure_job.rb
+++ b/qa/qa/vendor/jenkins/page/configure_job.rb
@@ -15,6 +15,7 @@ module QA
def configure(scm_url:)
set_git_source_code_management_url(scm_url)
+ set_git_branches_to_build("*/#{Runtime::Env.default_branch}")
click_build_when_change_is_pushed_to_gitlab
set_publish_status_to_gitlab
@@ -31,6 +32,10 @@ module QA
set_repository_url(repository_url)
end
+ def set_git_branches_to_build(branches)
+ find('.setting-name', text: "Branch Specifier (blank for 'any')").find(:xpath, "..").find('input').set branches
+ end
+
def click_build_when_change_is_pushed_to_gitlab
find('label', text: 'Build when a change is pushed to GitLab').find(:xpath, "..").find('input').click
end
diff --git a/qa/spec/page/base_spec.rb b/qa/spec/page/base_spec.rb
index 52345876149..146e71da933 100644
--- a/qa/spec/page/base_spec.rb
+++ b/qa/spec/page/base_spec.rb
@@ -1,5 +1,6 @@
# frozen_string_literal: true
+# rubocop:disable QA/ElementWithPattern
RSpec.describe QA::Page::Base do
describe 'page helpers' do
it 'exposes helpful page helpers' do
@@ -11,12 +12,12 @@ RSpec.describe QA::Page::Base do
subject do
Class.new(described_class) do
view 'path/to/some/view.html.haml' do
- element :something, 'string pattern' # rubocop:disable QA/ElementWithPattern
- element :something_else, /regexp pattern/ # rubocop:disable QA/ElementWithPattern
+ element :something, 'string pattern'
+ element :something_else, /regexp pattern/
end
view 'path/to/some/_partial.html.haml' do
- element :another_element, 'string pattern' # rubocop:disable QA/ElementWithPattern
+ element :another_element, 'string pattern'
end
end
end
@@ -95,6 +96,7 @@ RSpec.describe QA::Page::Base do
describe '#all_elements' do
before do
allow(subject).to receive(:all)
+ allow(subject).to receive(:wait_for_requests)
end
it 'raises an error if count or minimum are not specified' do
@@ -108,7 +110,7 @@ RSpec.describe QA::Page::Base do
end
end
- context 'elements' do
+ describe 'elements' do
subject do
Class.new(described_class) do
view 'path/to/some/view.html.haml' do
@@ -133,35 +135,37 @@ RSpec.describe QA::Page::Base do
describe '#visible?', 'Page is currently visible' do
let(:page) { subject.new }
+ before do
+ allow(page).to receive(:wait_for_requests)
+ end
+
context 'with elements' do
- context 'on the page' do
- before do
- # required elements not there, meaning not on page
- allow(page).to receive(:has_no_element?).and_return(false)
- end
+ before do
+ allow(page).to receive(:has_no_element?).and_return(has_no_element)
+ end
+
+ context 'with element on the page' do
+ let(:has_no_element) { false }
it 'is visible' do
expect(page).to be_visible
end
- end
- context 'not on the page' do
- before do
- # required elements are not on the page
- allow(page).to receive(:has_no_element?).and_return(true)
+ it 'does not raise error if page has elements' do
+ expect { page.visible? }.not_to raise_error
end
+ end
+
+ context 'with element not on the page' do
+ let(:has_no_element) { true }
it 'is not visible' do
expect(page).not_to be_visible
end
end
-
- it 'does not raise error if page has elements' do
- expect { page.visible? }.not_to raise_error
- end
end
- context 'no elements' do
+ context 'with no elements' do
subject do
Class.new(described_class) do
view 'path/to/some/view.html.haml' do
@@ -180,3 +184,4 @@ RSpec.describe QA::Page::Base do
end
end
end
+# rubocop:enable QA/ElementWithPattern
diff --git a/qa/spec/page/logging_spec.rb b/qa/spec/page/logging_spec.rb
index 054332eea29..93a08108787 100644
--- a/qa/spec/page/logging_spec.rb
+++ b/qa/spec/page/logging_spec.rb
@@ -72,41 +72,47 @@ RSpec.describe QA::Support::Page::Logging do
end
it 'logs has_element?' do
- expect { subject.has_element?(:element) }
- .to output(/has_element\? :element \(wait: #{QA::Runtime::Browser::CAPYBARA_MAX_WAIT_TIME}\) returned: true/o).to_stdout_from_any_process
+ expect { subject.has_element?(:element) }.to output(
+ /has_element\? :element \(wait: #{Capybara.default_max_wait_time}\) returned: true/o
+ ).to_stdout_from_any_process
end
it 'logs has_element? with text' do
- expect { subject.has_element?(:element, text: "some text") }
- .to output(/has_element\? :element with text "some text" \(wait: #{QA::Runtime::Browser::CAPYBARA_MAX_WAIT_TIME}\) returned: true/o).to_stdout_from_any_process
+ expect { subject.has_element?(:element, text: "some text") }.to output(
+ /has_element\? :element with text "some text" \(wait: #{Capybara.default_max_wait_time}\) returned: true/o
+ ).to_stdout_from_any_process
end
it 'logs has_no_element?' do
allow(page).to receive(:has_no_css?).and_return(true)
- expect { subject.has_no_element?(:element) }
- .to output(/has_no_element\? :element \(wait: #{QA::Runtime::Browser::CAPYBARA_MAX_WAIT_TIME}\) returned: true/o).to_stdout_from_any_process
+ expect { subject.has_no_element?(:element) }.to output(
+ /has_no_element\? :element \(wait: #{Capybara.default_max_wait_time}\) returned: true/o
+ ).to_stdout_from_any_process
end
it 'logs has_no_element? with text' do
allow(page).to receive(:has_no_css?).and_return(true)
- expect { subject.has_no_element?(:element, text: "more text") }
- .to output(/has_no_element\? :element with text "more text" \(wait: #{QA::Runtime::Browser::CAPYBARA_MAX_WAIT_TIME}\) returned: true/o).to_stdout_from_any_process
+ expect { subject.has_no_element?(:element, text: "more text") }.to output(
+ /has_no_element\? :element with text "more text" \(wait: #{Capybara.default_max_wait_time}\) returned: true/o
+ ).to_stdout_from_any_process
end
it 'logs has_text?' do
allow(page).to receive(:has_text?).and_return(true)
- expect { subject.has_text? 'foo' }
- .to output(/has_text\?\('foo', wait: #{QA::Runtime::Browser::CAPYBARA_MAX_WAIT_TIME}\) returned true/o).to_stdout_from_any_process
+ expect { subject.has_text? 'foo' }.to output(
+ /has_text\?\('foo', wait: #{Capybara.default_max_wait_time}\) returned true/o
+ ).to_stdout_from_any_process
end
it 'logs has_no_text?' do
allow(page).to receive(:has_no_text?).with('foo', any_args).and_return(true)
- expect { subject.has_no_text? 'foo' }
- .to output(/has_no_text\?\('foo', wait: #{QA::Runtime::Browser::CAPYBARA_MAX_WAIT_TIME}\) returned true/o).to_stdout_from_any_process
+ expect { subject.has_no_text? 'foo' }.to output(
+ /has_no_text\?\('foo', wait: #{Capybara.default_max_wait_time}\) returned true/o
+ ).to_stdout_from_any_process
end
it 'logs finished_loading?' do
@@ -123,7 +129,7 @@ RSpec.describe QA::Support::Page::Logging do
.to output(/end within element :element/).to_stdout_from_any_process
end
- context 'all_elements' do
+ context 'with all_elements' do
it 'logs the number of elements found' do
allow(page).to receive(:all).and_return([1, 2])
diff --git a/qa/spec/resource/api_fabricator_spec.rb b/qa/spec/resource/api_fabricator_spec.rb
index ec9907916eb..581236e5ac5 100644
--- a/qa/spec/resource/api_fabricator_spec.rb
+++ b/qa/spec/resource/api_fabricator_spec.rb
@@ -156,7 +156,7 @@ RSpec.describe QA::Resource::ApiFabricator do
Fabrication of FooBarResource using the API failed (400) with `#{raw_post}`.
Correlation Id: foobar
Sentry Url: https://sentry.gitlab.net/gitlab/staginggitlabcom/?environment=gstg-cny&query=correlation_id%3A%22foobar%22
- Kibana Url: https://nonprod-log.gitlab.net/app/discover#/?_a=(query:(language:kuery,query:'json.correlation_id%20:%20foobar'))
+ Kibana Url: https://nonprod-log.gitlab.net/app/discover#/?_a=(query:(language:kuery,query:'json.correlation_id%20:%20foobar'))&_g=(time:(from:now-24h%2Fh,to:now))
ERROR
end
end
diff --git a/qa/spec/resource/base_spec.rb b/qa/spec/resource/base_spec.rb
index eab205ec5d1..6dac8e0e3ee 100644
--- a/qa/spec/resource/base_spec.rb
+++ b/qa/spec/resource/base_spec.rb
@@ -4,6 +4,7 @@ RSpec.describe QA::Resource::Base do
include QA::Support::Helpers::StubEnv
let(:resource) { spy('resource') }
+ let(:api_client) { instance_double('Runtime::API::Client') }
let(:location) { 'http://location' }
let(:log_regex) { %r{==> Built a MyResource with username 'qa' via #{method} in [\d.\-e]+ seconds+} }
@@ -114,6 +115,7 @@ RSpec.describe QA::Resource::Base do
allow(QA::Runtime::Logger).to receive(:debug)
allow(resource).to receive(:api_support?).and_return(true)
allow(resource).to receive(:fabricate_via_api!)
+ allow(resource).to receive(:api_client) { api_client }
end
it 'logs the resource and build method' do
@@ -154,7 +156,6 @@ RSpec.describe QA::Resource::Base do
before do
allow(QA::Runtime::Logger).to receive(:debug)
- # allow(resource).to receive(:fabricate!)
end
it 'logs the resource and build method' do
diff --git a/qa/spec/runtime/script_extensions/interceptor_spec.rb b/qa/spec/runtime/script_extensions/interceptor_spec.rb
new file mode 100644
index 00000000000..28e8007973c
--- /dev/null
+++ b/qa/spec/runtime/script_extensions/interceptor_spec.rb
@@ -0,0 +1,119 @@
+# frozen_string_literal: true
+
+RSpec.describe 'Interceptor' do
+ let(:browser) { Capybara.current_session }
+ # need a real host for the js runtime
+ let(:url) { "file://#{__dir__}/../../../qa/fixtures/script_extensions/test.html" }
+
+ before(:context) do
+ skip 'Only can test for chrome' unless QA::Runtime::Env.can_intercept?
+
+ QA::Runtime::Browser.configure!
+ QA::Runtime::Browser::Session.enable_interception
+ end
+
+ after(:context) do
+ QA::Runtime::Browser::Session.disable_interception
+ end
+
+ before do
+ browser.visit url
+
+ clear_cache
+ end
+
+ after do
+ browser.visit 'about:blank'
+ end
+
+ context 'with Interceptor' do
+ context 'with caching' do
+ it 'checks the cache' do
+ expect(check_cache).to be(true)
+ end
+
+ it 'returns false if the cache cannot be accessed' do
+ browser.visit 'about:blank'
+
+ expect(check_cache).to be(false)
+ end
+
+ it 'gets and sets the cache data' do
+ commit_to_cache({ foo: 'bar' })
+
+ expect(get_cache['data']).to eql({ 'foo' => 'bar' })
+ end
+ end
+
+ context 'when intercepting' do
+ let(:resource_url) { 'chrome://chrome-urls' }
+
+ it 'intercepts fetch errors' do
+ trigger_fetch(resource_url, 'GET')
+
+ errors = get_cache['errors']
+
+ expect(errors.size).to be(1)
+ expect(errors[0]['status']).to be(-1)
+ expect(errors[0]['method']).to eql('GET')
+ expect(errors[0]['url']).to eql(resource_url)
+ end
+
+ it 'intercepts xhr' do
+ trigger_xhr(resource_url, 'POST')
+
+ errors = get_cache['errors']
+
+ expect(errors.size).to be(1)
+ expect(errors[0]['status']).to be(-1)
+ expect(errors[0]['method']).to eql('POST')
+ expect(errors[0]['url']).to eql(resource_url)
+ end
+ end
+ end
+
+ def clear_cache
+ browser.execute_script <<~JS
+ Interceptor.saveCache({})
+ JS
+ end
+
+ def check_cache
+ browser.execute_script <<~JS
+ return Interceptor.checkCache()
+ JS
+ end
+
+ def trigger_fetch(url, method)
+ browser.execute_script <<~JS
+ (() => {
+ fetch('#{url}', { method: '#{method}' })
+ })()
+ JS
+ end
+
+ def trigger_xhr(url, method)
+ browser.execute_script <<~JS
+ (() => {
+ let xhr = new XMLHttpRequest();
+ xhr.open('#{method}', '#{url}')
+ xhr.send()
+ })()
+ JS
+ end
+
+ def commit_to_cache(payload)
+ browser.execute_script <<~JS
+ Interceptor.commitToCache((cache) => {
+ cache.data = JSON.parse('#{payload.to_json}');
+ return cache
+ })
+ JS
+ end
+
+ def get_cache
+ browser.execute_script <<~JS
+ return Interceptor.getCache()
+ JS
+ end
+end
diff --git a/qa/spec/service/docker_run/gitlab_runner_spec.rb b/qa/spec/service/docker_run/gitlab_runner_spec.rb
index a8838db10cf..d9f201cf67e 100644
--- a/qa/spec/service/docker_run/gitlab_runner_spec.rb
+++ b/qa/spec/service/docker_run/gitlab_runner_spec.rb
@@ -24,6 +24,7 @@ module QA
before do
allow(subject).to receive(:shell)
+ allow(subject).to receive(:wait_until_running_and_configured)
end
context 'defaults' do
diff --git a/qa/spec/spec_helper.rb b/qa/spec/spec_helper.rb
index 655b0088feb..b81c41bb79c 100644
--- a/qa/spec/spec_helper.rb
+++ b/qa/spec/spec_helper.rb
@@ -20,6 +20,7 @@ RSpec.configure do |config|
config.add_formatter QA::Support::Formatters::ContextFormatter
config.add_formatter QA::Support::Formatters::QuarantineFormatter
+ config.add_formatter QA::Support::Formatters::FeatureFlagFormatter
config.add_formatter QA::Support::Formatters::TestStatsFormatter if QA::Runtime::Env.export_metrics?
config.before(:suite) do |suite|
@@ -77,7 +78,17 @@ RSpec.configure do |config|
# If any tests failed, leave the resources behind to help troubleshoot, otherwise remove them.
# Do not remove the shared resource on live environments
- QA::Resource::ReusableCollection.remove_all_via_api! if !suite.reporter.failed_examples.present? && !QA::Runtime::Env.running_on_dot_com?
+ begin
+ next if suite.reporter.failed_examples.present?
+ next unless QA::Runtime::Scenario.attributes.include?(:gitlab_address)
+ next if QA::Runtime::Env.running_on_dot_com?
+
+ QA::Resource::ReusableCollection.remove_all_via_api!
+ rescue QA::Resource::Errors::InternalServerError => e
+ # Temporarily prevent this error from failing jobs while the cause is investigated
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/354387
+ QA::Runtime::Logger.debug(e.message)
+ end
end
config.append_after(:suite) do
@@ -105,6 +116,9 @@ RSpec.configure do |config|
# show exception that triggers a retry if verbose_retry is set to true
config.display_try_failure_messages = true
+ # This option allows to use shorthand aliases for adding :focus metadata - fit, fdescribe and fcontext
+ config.filter_run_when_matching :focus
+
if ENV['CI'] && !QA::Runtime::Env.disable_rspec_retry?
non_quarantine_retries = QA::Runtime::Env.ci_project_name =~ /staging|canary|production/ ? 3 : 2
config.around do |example|
diff --git a/qa/spec/specs/allure_report_spec.rb b/qa/spec/specs/allure_report_spec.rb
index 86ceaf51cbb..85befb2f602 100644
--- a/qa/spec/specs/allure_report_spec.rb
+++ b/qa/spec/specs/allure_report_spec.rb
@@ -3,7 +3,7 @@
describe QA::Runtime::AllureReport do
include QA::Support::Helpers::StubEnv
- let(:rspec_config) { double('RSpec::Core::Configuration', 'add_formatter': nil, append_after: nil) }
+ let(:rspec_config) { instance_double('RSpec::Core::Configuration', 'add_formatter': nil, append_after: nil) }
let(:png_path) { 'png_path' }
let(:html_path) { 'html_path' }
@@ -42,11 +42,14 @@ describe QA::Runtime::AllureReport do
context 'with report generation enabled' do
let(:generate_report) { 'true' }
+ let(:session) { instance_double('Capybara::Session') }
+ let(:attributes) { class_spy('Runtime::Scenario') }
+ let(:version_response) { instance_double('HTTPResponse', code: 200, body: versions.to_json) }
+
let(:png_file) { 'png-file' }
let(:html_file) { 'html-file' }
let(:ci_job) { 'ee:relative 5' }
let(:versions) { { version: '14', revision: '6ced31db947' } }
- let(:session) { double('session') }
let(:browser_log) { ['log message 1', 'log message 2'] }
before do
@@ -54,11 +57,13 @@ describe QA::Runtime::AllureReport do
stub_env('CI_JOB_NAME', ci_job)
stub_env('GITLAB_QA_ADMIN_ACCESS_TOKEN', 'token')
+ stub_const('QA::Runtime::Scenario', attributes)
+
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')
+ allow(RestClient::Request).to receive(:execute) { version_response }
+ allow(attributes).to receive(:gitlab_address).and_return("https://gitlab.com")
allow(Capybara).to receive(:current_session).and_return(session)
allow(session).to receive_message_chain('driver.browser.logs.get').and_return(browser_log)
diff --git a/qa/spec/specs/helpers/feature_flag_spec.rb b/qa/spec/specs/helpers/feature_flag_spec.rb
new file mode 100644
index 00000000000..a1300ecf073
--- /dev/null
+++ b/qa/spec/specs/helpers/feature_flag_spec.rb
@@ -0,0 +1,164 @@
+# frozen_string_literal: true
+
+require 'rspec/core/sandbox'
+
+RSpec.describe QA::Specs::Helpers::FeatureFlag do
+ include QA::Support::Helpers::StubEnv
+ include QA::Specs::Helpers::RSpec
+
+ around do |ex|
+ RSpec::Core::Sandbox.sandboxed do |config|
+ config.add_formatter QA::Support::Formatters::ContextFormatter
+ config.add_formatter QA::Support::Formatters::QuarantineFormatter
+ config.add_formatter QA::Support::Formatters::FeatureFlagFormatter
+
+ # If there is an example-within-an-example, we want to make sure the inner example
+ # does not get a reference to the outer example (the real spec) if it calls
+ # something like `pending`
+ config.before(:context) { RSpec.current_example = nil }
+
+ config.color_mode = :off
+
+ ex.run
+ end
+ end
+
+ describe '.skip_or_run_feature_flag_tests_or_contexts' do
+ shared_examples 'runs with given feature flag metadata' do |metadata|
+ it do
+ group = describe_successfully 'Feature flag test', feature_flag: metadata do
+ it('passes') {}
+ end
+
+ expect(group.examples.first.execution_result.status).to eq(:passed)
+ end
+ end
+
+ shared_examples 'skips with given feature flag metadata' do |metadata|
+ it do
+ group = describe_successfully 'Feature flag test', feature_flag: metadata do
+ it('is skipped') {}
+ end
+
+ expect(group.examples.first.execution_result.status).to eq(:pending)
+ end
+ end
+
+ context 'when run on staging' do
+ before(:context) do
+ QA::Runtime::Scenario.define(:gitlab_address, 'https://staging.gitlab.com')
+ end
+
+ context 'when no scope is defined' do
+ it_behaves_like 'runs with given feature flag metadata', { name: 'no_scope_ff' }
+
+ it 'is skipped if quarantine tag is also applied' do
+ group = describe_successfully(
+ 'Feature flag with no scope',
+ feature_flag: { name: 'quarantine_with_ff' },
+ quarantine: {
+ issue: 'https://gitlab.com/test-group/test/-/issues/123',
+ type: 'bug'
+ }
+ ) do
+ it('is skipped') {}
+ end
+
+ expect(group.examples.first.execution_result.status).to eq(:pending)
+ end
+ end
+
+ it_behaves_like 'runs with given feature flag metadata', { name: 'actor_ff', scope: :project }
+
+ it_behaves_like 'skips with given feature flag metadata', { name: 'global_ff', scope: :global }
+
+ context 'when should be skipped in a specific job' do
+ before do
+ stub_env('CI_JOB_NAME', 'job-to-skip')
+ end
+
+ it 'is skipped for that job' do
+ group = describe_successfully(
+ 'Test should be skipped',
+ feature_flag: { name: 'skip_job_ff' },
+ except: { job: 'job-to-skip' }
+ ) do
+ it('does not run on staging in specified job') {}
+ end
+
+ expect(group.examples.first.execution_result.status).to eq(:pending)
+ end
+ end
+
+ context 'when should only run in a specific job' do
+ before do
+ stub_env('CI_JOB_NAME', 'job-to-run')
+ end
+
+ it 'is run for that job' do
+ group = describe_successfully(
+ 'Test should run',
+ feature_flag: { name: 'run_job_ff' },
+ only: { job: 'job-to-run' }
+ ) do
+ it('runs on staging in specified job') {}
+ end
+
+ expect(group.examples.first.execution_result.status).to eq(:passed)
+ end
+
+ it 'skips if test is set to only run in a job different from current CI job' do
+ group = describe_successfully(
+ 'Test should be skipped',
+ feature_flag: { name: 'skip_job_ff' },
+ only: { job: 'other-job' }
+ ) do
+ it('does not run on staging in specified job') {}
+ end
+
+ expect(group.examples.first.execution_result.status).to eq(:pending)
+ end
+ end
+ end
+
+ context 'when run on production' do
+ before(:context) do
+ QA::Runtime::Scenario.define(:gitlab_address, 'https://gitlab.com')
+ end
+
+ context 'when no scope is defined' do
+ it_behaves_like 'skips with given feature flag metadata', { name: 'no_scope_ff' }
+
+ context 'for only one test in the example group' do
+ it 'only skips specified test and runs all others' do
+ group = describe_successfully 'Feature flag set for one test' do
+ it('is skipped', feature_flag: { name: 'single_test_ff' }) {}
+ it('passes') {}
+ end
+
+ expect(group.examples[0].execution_result.status).to eq(:pending)
+ expect(group.examples[1].execution_result.status).to eq(:passed)
+ end
+ end
+ end
+
+ it_behaves_like 'skips with given feature flag metadata', { name: 'actor_ff', scope: :project }
+
+ it_behaves_like 'skips with given feature flag metadata', { name: 'global_ff', scope: :global }
+ end
+
+ # The nightly package job, for example, does not run against a live environment with
+ # a defined gitlab_address. In this case, feature_flag tag logic can be safely ignored
+ context 'when run without a gitlab address specified' do
+ before(:context) do
+ QA::Runtime::Scenario.define(:gitlab_address, nil)
+ end
+
+ it_behaves_like 'runs with given feature flag metadata', { name: 'no_scope_ff' }
+
+ it_behaves_like 'runs with given feature flag metadata', { name: 'actor_ff', scope: :project }
+
+ it_behaves_like 'runs with given feature flag metadata', { name: 'global_ff', scope: :global }
+ end
+ end
+end
diff --git a/qa/spec/specs/runner_spec.rb b/qa/spec/specs/runner_spec.rb
index e52ca1fb17c..d5e442acfe7 100644
--- a/qa/spec/specs/runner_spec.rb
+++ b/qa/spec/specs/runner_spec.rb
@@ -86,6 +86,41 @@ RSpec.describe QA::Specs::Runner do
end
end
+ context 'when test_metadata_only is set as an option' do
+ let(:rspec_config) { instance_double('RSpec::Core::Configuration') }
+ let(:output_file) { Pathname.new('/root/tmp/test-metadata.json') }
+
+ before do
+ QA::Runtime::Scenario.define(:test_metadata_only, true)
+ allow(RSpec).to receive(:configure).and_yield(rspec_config)
+ allow(rspec_config).to receive(:add_formatter)
+ allow(rspec_config).to receive(:fail_if_no_examples=)
+ end
+
+ it 'sets the `--dry-run` flag' do
+ expect_rspec_runner_arguments(['--dry-run', '--tag', '~orchestrated', '--tag', '~transient', '--tag', '~geo', *described_class::DEFAULT_TEST_PATH_ARGS], [$stderr, anything])
+
+ subject.perform
+ end
+
+ it 'configures json formatted output to file' do
+ allow(QA::Runtime::Path).to receive(:qa_root).and_return('/root')
+
+ expect(rspec_config).to receive(:add_formatter)
+ .with(QA::Support::JsonFormatter, output_file)
+ expect(rspec_config).to receive(:fail_if_no_examples=)
+ .with(true)
+
+ allow(RSpec::Core::Runner).to receive(:run).and_return(0)
+
+ subject.perform
+ end
+
+ after do
+ QA::Runtime::Scenario.attributes.delete(:test_metadata_only)
+ end
+ end
+
context 'when tags are set' do
subject { described_class.new.tap { |runner| runner.tags = %i[orchestrated github] } }
diff --git a/qa/spec/specs/scenario_shared_examples.rb b/qa/spec/specs/scenario_shared_examples.rb
new file mode 100644
index 00000000000..7d806d50d21
--- /dev/null
+++ b/qa/spec/specs/scenario_shared_examples.rb
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.shared_examples 'a QA scenario class' do
+ let(:attributes) { class_spy('Runtime::Scenario') }
+ let(:runner) { class_spy('Specs::Runner') }
+ let(:release) { class_spy('Runtime::Release') }
+ let(:feature) { class_spy('Runtime::Feature') }
+
+ let(:args) { { gitlab_address: 'http://gitlab_address' } }
+ let(:named_options) { %w[--address http://gitlab_address] }
+ let(:tags) { [] }
+ let(:options) { %w[path1 path2] }
+
+ before do
+ stub_const('QA::Specs::Runner', runner)
+ stub_const('QA::Runtime::Release', release)
+ stub_const('QA::Runtime::Scenario', attributes)
+ stub_const('QA::Runtime::Feature', feature)
+
+ allow(attributes).to receive(:gitlab_address).and_return(args[:gitlab_address])
+ allow(runner).to receive(:perform).and_yield(runner)
+ allow(QA::Runtime::Address).to receive(:valid?).and_return(true)
+ end
+
+ it 'responds to perform' do
+ expect(subject).to respond_to(:perform)
+ end
+
+ it 'sets an address of the subject' do
+ subject.perform(args)
+
+ expect(attributes).to have_received(:define).with(:gitlab_address, 'http://gitlab_address').at_least(:once)
+ end
+
+ it 'performs before hooks only once' do
+ subject.perform(args)
+
+ expect(release).to have_received(:perform_before_hooks).once
+ end
+
+ it 'sets tags on runner' do
+ subject.perform(args)
+
+ expect(runner).to have_received(:tags=).with(tags)
+ end
+
+ context 'with RSpec options' do
+ it 'sets options on runner' do
+ subject.perform(args, *options)
+
+ expect(runner).to have_received(:options=).with(options)
+ end
+ end
+
+ context 'with named command-line options' do
+ it 'converts options to attributes' do
+ described_class.launch!(named_options)
+
+ args do |k, v|
+ expect(attributes).to have_received(:define).with(k, v)
+ end
+ end
+
+ it 'raises an error if the option is invalid' do
+ expect { described_class.launch!(['--foo']) }.to raise_error(OptionParser::InvalidOption)
+ end
+
+ it 'passes on options after --' do
+ expect(described_class).to receive(:perform).with(attributes, *%w[--tag quarantine])
+
+ described_class.launch!(named_options.push(*%w[-- --tag quarantine]))
+ end
+ end
+ end
+end
diff --git a/qa/spec/specs/spec_helper.rb b/qa/spec/specs/spec_helper.rb
new file mode 100644
index 00000000000..e4514c6c64f
--- /dev/null
+++ b/qa/spec/specs/spec_helper.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+require_relative '../../qa'
+
+require_relative 'scenario_shared_examples'
diff --git a/qa/spec/support/formatters/test_stats_formatter_spec.rb b/qa/spec/support/formatters/test_stats_formatter_spec.rb
index 518c7407ba6..ba59588d186 100644
--- a/qa/spec/support/formatters/test_stats_formatter_spec.rb
+++ b/qa/spec/support/formatters/test_stats_formatter_spec.rb
@@ -8,14 +8,15 @@ describe QA::Support::Formatters::TestStatsFormatter do
include QA::Specs::Helpers::RSpec
include ActiveSupport::Testing::TimeHelpers
- let(:url) { "http://influxdb.net" }
- let(:token) { "token" }
- let(:ci_timestamp) { "2021-02-23T20:58:41Z" }
- let(:ci_job_name) { "test-job 1/5" }
- let(:ci_job_url) { "url" }
- let(:ci_pipeline_url) { "url" }
- let(:ci_pipeline_id) { "123" }
+ let(:url) { 'http://influxdb.net' }
+ let(:token) { 'token' }
+ let(:ci_timestamp) { '2021-02-23T20:58:41Z' }
+ let(:ci_job_name) { 'test-job 1/5' }
+ let(:ci_job_url) { 'url' }
+ let(:ci_pipeline_url) { 'url' }
+ let(:ci_pipeline_id) { '123' }
let(:run_type) { 'staging-full' }
+ let(:smoke) { 'false' }
let(:reliable) { 'false' }
let(:quarantined) { 'false' }
let(:influx_client) { instance_double('InfluxDB2::Client', create_write_api: influx_write_api) }
@@ -25,6 +26,7 @@ describe QA::Support::Formatters::TestStatsFormatter do
let(:ui_fabrication) { 0 }
let(:api_fabrication) { 0 }
let(:fabrication_resources) { {} }
+ let(:testcase) { 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/1234' }
let(:influx_client_args) do
{
@@ -42,14 +44,15 @@ describe QA::Support::Formatters::TestStatsFormatter do
name: 'stats export spec',
file_path: file_path.gsub('./qa/specs/features', ''),
status: :passed,
+ smoke: smoke,
reliable: reliable,
quarantined: quarantined,
- retried: "false",
- job_name: "test-job",
- merge_request: "false",
+ retried: 'false',
+ job_name: 'test-job',
+ merge_request: 'false',
run_type: run_type,
stage: stage.match(%r{\d{1,2}_(\w+)}).captures.first,
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/1234'
+ testcase: testcase
},
fields: {
id: './spec/support/formatters/test_stats_formatter_spec.rb[1:1]',
@@ -78,12 +81,6 @@ describe QA::Support::Formatters::TestStatsFormatter do
around do |example|
RSpec::Core::Sandbox.sandboxed do |config|
config.formatter = QA::Support::Formatters::TestStatsFormatter
-
- config.append_after do |example|
- example.metadata[:api_fabrication] = Thread.current[:api_fabrication]
- example.metadata[:browser_ui_fabrication] = Thread.current[:browser_ui_fabrication]
- end
-
config.before(:context) { RSpec.current_example = nil }
example.run
@@ -93,10 +90,11 @@ describe QA::Support::Formatters::TestStatsFormatter do
before do
allow(InfluxDB2::Client).to receive(:new).with(url, token, **influx_client_args) { influx_client }
allow(QA::Tools::TestResourceDataProcessor).to receive(:resources) { fabrication_resources }
+ allow_any_instance_of(RSpec::Core::Example::ExecutionResult).to receive(:run_time).and_return(0) # rubocop:disable RSpec/AnyInstanceOf
end
- context "without influxdb variables configured" do
- it "skips export without influxdb url" do
+ context 'without influxdb variables configured' do
+ it 'skips export without influxdb url' do
stub_env('QA_INFLUXDB_URL', nil)
stub_env('QA_INFLUXDB_TOKEN', nil)
@@ -105,7 +103,7 @@ describe QA::Support::Formatters::TestStatsFormatter do
expect(influx_client).not_to have_received(:create_write_api)
end
- it "skips export without influxdb token" do
+ it 'skips export without influxdb token' do
stub_env('QA_INFLUXDB_URL', url)
stub_env('QA_INFLUXDB_TOKEN', nil)
@@ -145,6 +143,19 @@ describe QA::Support::Formatters::TestStatsFormatter do
end
end
+ context 'with smoke spec' do
+ let(:smoke) { 'true' }
+
+ it 'exports data to influxdb with correct smoke tag' do
+ run_spec do
+ it('spec', :smoke, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/1234') {}
+ end
+
+ expect(influx_write_api).to have_received(:write).once
+ expect(influx_write_api).to have_received(:write).with(data: [data])
+ end
+ end
+
context 'with quarantined spec' do
let(:quarantined) { 'true' }
@@ -210,16 +221,18 @@ describe QA::Support::Formatters::TestStatsFormatter do
end
context 'with fabrication runtimes' do
- let(:ui_fabrication) { 10 }
let(:api_fabrication) { 4 }
-
- before do
- Thread.current[:api_fabrication] = api_fabrication
- Thread.current[:browser_ui_fabrication] = ui_fabrication
- end
+ let(:ui_fabrication) { 10 }
+ let(:testcase) { nil }
it 'exports data to influxdb with fabrication times' do
- run_spec
+ run_spec do
+ # Main logic tracks fabrication time in thread local variable and injects it as metadata from
+ # global after hook defined in main spec_helper.
+ #
+ # Inject the values directly since we do not load e2e test spec_helper in unit tests
+ it('spec', api_fabrication: 4, browser_ui_fabrication: 10) {}
+ end
expect(influx_write_api).to have_received(:write).once
expect(influx_write_api).to have_received(:write).with(data: [data])
diff --git a/qa/spec/support/loglinking_spec.rb b/qa/spec/support/loglinking_spec.rb
index cba8a139767..e02ae45ee93 100644
--- a/qa/spec/support/loglinking_spec.rb
+++ b/qa/spec/support/loglinking_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe QA::Support::Loglinking do
expect(QA::Support::Loglinking.failure_metadata('foo123')).to eql(<<~ERROR.chomp)
Correlation Id: foo123
- Kibana Url: https://kibana.address/app/discover#/?_a=(query:(language:kuery,query:'json.correlation_id%20:%20foo123'))
+ Kibana Url: https://kibana.address/app/discover#/?_a=(query:(language:kuery,query:'json.correlation_id%20:%20foo123'))&_g=(time:(from:now-24h%2Fh,to:now))
ERROR
end
end
@@ -83,7 +83,7 @@ RSpec.describe QA::Support::Loglinking do
describe '.logging_environment' do
let(:staging_address) { 'https://staging.gitlab.com' }
let(:staging_ref_address) { 'https://staging-ref.gitlab.com' }
- let(:production_address) { 'https://www.gitlab.com' }
+ let(:production_address) { 'https://gitlab.com' }
let(:pre_prod_address) { 'https://pre.gitlab.com' }
let(:logging_env_array) do
[
diff --git a/qa/spec/support/page_error_checker_spec.rb b/qa/spec/support/page_error_checker_spec.rb
index b9b085fa7b9..7c8aaeb182a 100644
--- a/qa/spec/support/page_error_checker_spec.rb
+++ b/qa/spec/support/page_error_checker_spec.rb
@@ -238,6 +238,88 @@ RSpec.describe QA::Support::PageErrorChecker do
end
end
+ describe '::log_request_errors' do
+ let(:page_url) { 'https://baz.foo' }
+ let(:browser) { double('browser', current_url: page_url) }
+ let(:driver) { double('driver', browser: browser) }
+ let(:session) { double('session', driver: driver) }
+
+ before do
+ allow(Capybara).to receive(:current_session).and_return(session)
+ end
+
+ it 'logs from the error cache' do
+ error = {
+ 'url' => 'https://foo.bar',
+ 'status' => 500,
+ 'method' => 'GET',
+ 'headers' => { 'x-request-id' => '12345' }
+ }
+
+ expect(page).to receive(:driver).and_return(driver)
+ expect(page).to receive(:execute_script).and_return({ 'errors' => [error] })
+ expect(page).to receive(:execute_script)
+
+ expect(QA::Runtime::Logger).to receive(:debug).with("Fetching API error cache for #{page_url}")
+ expect(QA::Runtime::Logger).to receive(:error).with(<<~ERROR.chomp)
+ Interceptor Api Errors
+ [500] GET https://foo.bar -- Correlation Id: 12345
+ ERROR
+
+ QA::Support::PageErrorChecker.log_request_errors(page)
+ end
+
+ it 'removes duplicates' do
+ error = {
+ 'url' => 'https://foo.bar',
+ 'status' => 500,
+ 'method' => 'GET',
+ 'headers' => { 'x-request-id' => '12345' }
+ }
+ expect(page).to receive(:driver).and_return(driver)
+ expect(page).to receive(:execute_script).and_return({ 'errors' => [error, error, error] })
+ expect(page).to receive(:execute_script)
+
+ expect(QA::Runtime::Logger).to receive(:debug).with("Fetching API error cache for #{page_url}")
+ expect(QA::Runtime::Logger).to receive(:error).with(<<~ERROR.chomp).exactly(1).time
+ Interceptor Api Errors
+ [500] GET https://foo.bar -- Correlation Id: 12345
+ ERROR
+
+ QA::Support::PageErrorChecker.log_request_errors(page)
+ end
+
+ it 'chops the url query string' do
+ error = {
+ 'url' => 'https://foo.bar?query={ sensitive-data: 12345 }',
+ 'status' => 500,
+ 'method' => 'GET',
+ 'headers' => { 'x-request-id' => '12345' }
+ }
+ expect(page).to receive(:driver).and_return(driver)
+ expect(page).to receive(:execute_script).and_return({ 'errors' => [error] })
+ expect(page).to receive(:execute_script)
+
+ expect(QA::Runtime::Logger).to receive(:debug).with("Fetching API error cache for #{page_url}")
+ expect(QA::Runtime::Logger).to receive(:error).with(<<~ERROR.chomp)
+ Interceptor Api Errors
+ [500] GET https://foo.bar -- Correlation Id: 12345
+ ERROR
+
+ QA::Support::PageErrorChecker.log_request_errors(page)
+ end
+
+ it 'returns if cache is nil' do
+ expect(page).to receive(:driver).and_return(driver)
+ expect(page).to receive(:execute_script).and_return(nil)
+
+ expect(QA::Runtime::Logger).to receive(:debug).with("Fetching API error cache for #{page_url}")
+ expect(QA::Runtime::Logger).not_to receive(:error)
+
+ QA::Support::PageErrorChecker.log_request_errors(page)
+ end
+ end
+
describe '.logs' do
before do
logs_class = Class.new do
diff --git a/qa/spec/support/shared_contexts/merge_train_spec_with_user_prep.rb b/qa/spec/support/shared_contexts/merge_train_spec_with_user_prep.rb
new file mode 100644
index 00000000000..9d1a37cb0b8
--- /dev/null
+++ b/qa/spec/support/shared_contexts/merge_train_spec_with_user_prep.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.shared_context 'merge train spec with user prep' do
+ let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" }
+ let(:file_name) { Faker::Lorem.word }
+ let(:mr_title) { Faker::Lorem.sentence }
+ let(:admin_api_client) { Runtime::API::Client.as_admin }
+
+ let(:user) do
+ Resource::User.fabricate_via_api! do |user|
+ user.api_client = admin_api_client
+ end
+ end
+
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'pipeline-for-merge-trains'
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate! do |runner|
+ runner.project = project
+ runner.name = executor
+ runner.tags = [executor]
+ end
+ end
+
+ let!(:project_files) do
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files(
+ [
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ test_merge_train:
+ tags:
+ - #{executor}
+ script:
+ - sleep 10
+ - echo 'OK!'
+ only:
+ - merge_requests
+ YAML
+ },
+ {
+ file_path: file_name,
+ content: Faker::Lorem.sentence
+ }
+ ]
+ )
+ end
+ end
+
+ before do
+ project.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
+
+ Flow::Login.sign_in
+ project.visit!
+ Flow::MergeRequest.enable_merge_trains
+
+ Flow::Login.sign_in(as: user)
+
+ Resource::MergeRequest.fabricate_via_api! do |merge_request|
+ merge_request.title = mr_title
+ merge_request.project = project
+ merge_request.description = Faker::Lorem.sentence
+ merge_request.target_new_branch = false
+ merge_request.update_existing_file = true
+ merge_request.file_name = file_name
+ merge_request.file_content = Faker::Lorem.sentence
+ end.visit!
+
+ Page::MergeRequest::Show.perform do |show|
+ show.has_pipeline_status?('passed')
+ show.try_to_merge!
+ end
+ end
+
+ after do
+ runner&.remove_via_api!
+ user&.remove_via_api!
+ end
+ end
+end
diff --git a/qa/spec/support/shared_contexts/variable_inheritance_shared_context.rb b/qa/spec/support/shared_contexts/variable_inheritance_shared_context.rb
new file mode 100644
index 00000000000..1dc8870d4d9
--- /dev/null
+++ b/qa/spec/support/shared_contexts/variable_inheritance_shared_context.rb
@@ -0,0 +1,150 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.shared_context 'variable inheritance test prep' do
+ let(:random_string) { Faker::Alphanumeric.alphanumeric(number: 8) }
+
+ let(:group) do
+ Resource::Group.fabricate_via_api! do |group|
+ group.path = "group-for-variable-inheritance-#{random_string}"
+ end
+ end
+
+ let(:upstream_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.group = group
+ project.name = 'upstream-variable-inheritance'
+ project.description = 'Project for pipeline with variable defined via UI - Upstream'
+ end
+ end
+
+ let(:downstream1_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.group = group
+ project.name = 'downstream1-variable-inheritance'
+ project.description = 'Project for pipeline with variable defined via UI - Downstream'
+ end
+ end
+
+ let(:downstream2_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.group = group
+ project.name = 'downstream2-variable-inheritance'
+ project.description = 'Project for pipeline with variable defined via UI - Downstream'
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate! do |runner|
+ runner.token = group.reload!.runners_token
+ runner.name = random_string
+ runner.tags = [random_string]
+ end
+ end
+
+ before do
+ Runtime::Feature.enable(:ci_trigger_forward_variables)
+ Flow::Login.sign_in
+ end
+
+ after do
+ runner.remove_via_api!
+ Runtime::Feature.disable(:ci_trigger_forward_variables)
+ end
+
+ def start_pipeline_with_variable
+ upstream_project.visit!
+ Flow::Pipeline.wait_for_latest_pipeline
+ Page::Project::Pipeline::Index.perform(&:click_run_pipeline_button)
+ Page::Project::Pipeline::New.perform do |new|
+ new.add_variable('TEST_VAR', 'This is great!')
+ new.click_run_pipeline_button
+ end
+ end
+
+ def add_ci_file(project, files)
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add CI config file'
+ commit.add_files(files)
+ end
+ end
+
+ def visit_job_page(pipeline_title, job_name)
+ Page::Project::Pipeline::Show.perform do |show|
+ show.expand_child_pipeline(title: pipeline_title)
+ show.click_job(job_name)
+ end
+ end
+
+ def verify_job_log_shows_variable_value
+ Page::Project::Job::Show.perform do |show|
+ show.wait_until { show.successful? }
+ expect(show.output).to have_content('This is great!')
+ end
+ end
+
+ def verify_job_log_does_not_show_variable_value
+ Page::Project::Job::Show.perform do |show|
+ show.wait_until { show.successful? }
+ expect(show.output).to have_no_content('This is great!')
+ end
+ end
+
+ def upstream_child1_ci_file
+ {
+ file_path: '.child1-ci.yml',
+ content: <<~YAML
+ child1_job:
+ stage: test
+ tags: ["#{random_string}"]
+ script:
+ - echo $TEST_VAR
+ - echo Done!
+ YAML
+ }
+ end
+
+ def upstream_child2_ci_file
+ {
+ file_path: '.child2-ci.yml',
+ content: <<~YAML
+ child2_job:
+ stage: test
+ tags: ["#{random_string}"]
+ script:
+ - echo $TEST_VAR
+ - echo Done!
+ YAML
+ }
+ end
+
+ def downstream1_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ downstream1_job:
+ stage: deploy
+ tags: ["#{random_string}"]
+ script:
+ - echo $TEST_VAR
+ - echo Done!
+ YAML
+ }
+ end
+
+ def downstream2_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ downstream2_job:
+ stage: deploy
+ tags: ["#{random_string}"]
+ script:
+ - echo $TEST_VAR
+ - echo Done!
+ YAML
+ }
+ end
+ end
+end
diff --git a/qa/spec/support/shared_examples/scenario_shared_examples.rb b/qa/spec/support/shared_examples/scenario_shared_examples.rb
deleted file mode 100644
index 5e448349cf9..00000000000
--- a/qa/spec/support/shared_examples/scenario_shared_examples.rb
+++ /dev/null
@@ -1,76 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.shared_examples 'a QA scenario class' do
- let(:attributes) { spy('Runtime::Scenario') }
- let(:runner) { spy('Specs::Runner') }
- let(:release) { spy('Runtime::Release') }
- let(:feature) { spy('Runtime::Feature') }
-
- let(:args) { { gitlab_address: 'http://gitlab_address' } }
- let(:named_options) { %w[--address http://gitlab_address] }
- let(:tags) { [] }
- let(:options) { %w[path1 path2] }
-
- before do
- stub_const('QA::Specs::Runner', runner)
- stub_const('QA::Runtime::Release', release)
- stub_const('QA::Runtime::Scenario', attributes)
- stub_const('QA::Runtime::Feature', feature)
-
- allow(attributes).to receive(:gitlab_address).and_return(args[:gitlab_address])
- allow(runner).to receive(:perform).and_yield(runner)
- allow(QA::Runtime::Address).to receive(:valid?).and_return(true)
- end
-
- it 'responds to perform' do
- expect(subject).to respond_to(:perform)
- end
-
- it 'sets an address of the subject' do
- subject.perform(args)
-
- expect(attributes).to have_received(:define).with(:gitlab_address, 'http://gitlab_address').at_least(:once)
- end
-
- it 'performs before hooks only once' do
- subject.perform(args)
-
- expect(release).to have_received(:perform_before_hooks).once
- end
-
- it 'sets tags on runner' do
- subject.perform(args)
-
- expect(runner).to have_received(:tags=).with(tags)
- end
-
- context 'specifying RSpec options' do
- it 'sets options on runner' do
- subject.perform(args, *options)
-
- expect(runner).to have_received(:options=).with(options)
- end
- end
-
- context 'with named command-line options' do
- it 'converts options to attributes' do
- described_class.launch!(named_options)
-
- args do |k, v|
- expect(attributes).to have_received(:define).with(k, v)
- end
- end
-
- it 'raises an error if the option is invalid' do
- expect { described_class.launch!(['--foo']) }.to raise_error(OptionParser::InvalidOption)
- end
-
- it 'passes on options after --' do
- expect(described_class).to receive(:perform).with(attributes, *%w[--tag quarantine])
-
- described_class.launch!(named_options.push(*%w[-- --tag quarantine]))
- end
- end
- end
-end
diff --git a/qa/spec/support/wait_for_requests_spec.rb b/qa/spec/support/wait_for_requests_spec.rb
index 2492820b67f..221d61ea2b4 100644
--- a/qa/spec/support/wait_for_requests_spec.rb
+++ b/qa/spec/support/wait_for_requests_spec.rb
@@ -5,37 +5,38 @@ RSpec.describe QA::Support::WaitForRequests do
before do
allow(subject).to receive(:finished_all_ajax_requests?).and_return(true)
allow(subject).to receive(:finished_loading?).and_return(true)
+ allow(QA::Support::PageErrorChecker).to receive(:check_page_for_error_code)
end
context 'when skip_finished_loading_check is defaulted to false' do
it 'calls finished_loading?' do
- expect(subject).to receive(:finished_loading?).with(hash_including(wait: 1))
-
subject.wait_for_requests
+
+ expect(subject).to have_received(:finished_loading?).with(hash_including(wait: 1))
end
end
context 'when skip_finished_loading_check is true' do
it 'does not call finished_loading?' do
- expect(subject).not_to receive(:finished_loading?)
-
subject.wait_for_requests(skip_finished_loading_check: true)
+
+ expect(subject).not_to have_received(:finished_loading?)
end
end
context 'when skip_resp_code_check is defaulted to false' do
it 'call report' do
- allow(QA::Support::PageErrorChecker).to receive(:check_page_for_error_code).with(Capybara.page)
-
subject.wait_for_requests
+
+ expect(QA::Support::PageErrorChecker).to have_received(:check_page_for_error_code).with(Capybara.page)
end
end
context 'when skip_resp_code_check is true' do
it 'does not parse for an error code' do
- expect(QA::Support::PageErrorChecker).not_to receive(:check_page_for_error_code)
-
subject.wait_for_requests(skip_resp_code_check: true)
+
+ expect(QA::Support::PageErrorChecker).not_to have_received(:check_page_for_error_code)
end
end
end
diff --git a/qa/spec/tools/reliable_report_spec.rb b/qa/spec/tools/reliable_report_spec.rb
index 318b0833f62..d5c898779b8 100644
--- a/qa/spec/tools/reliable_report_spec.rb
+++ b/qa/spec/tools/reliable_report_spec.rb
@@ -5,7 +5,6 @@ describe QA::Tools::ReliableReport do
subject(:run) { described_class.run(range: range, report_in_issue_and_slack: create_issue) }
- let(:gitlab_response) { instance_double("RestClient::Response", code: 200, body: { web_url: issue_url }.to_json) }
let(:slack_notifier) { instance_double("Slack::Notifier", post: nil) }
let(:influx_client) { instance_double("InfluxDB2::Client", create_query_api: query_api) }
let(:query_api) { instance_double("InfluxDB2::QueryApi") }
@@ -71,6 +70,7 @@ describe QA::Tools::ReliableReport do
|> filter(fn: (r) => r.status != "pending" and
r.merge_request == "false" and
r.quarantined == "false" and
+ r.smoke == "false" and
r.reliable == "#{reliable}" and
r._field == "id"
)
@@ -117,7 +117,7 @@ describe QA::Tools::ReliableReport do
stub_env("CI_API_V4_URL", "gitlab_api_url")
stub_env("GITLAB_ACCESS_TOKEN", "gitlab_token")
- allow(RestClient::Request).to receive(:execute).and_return(gitlab_response)
+ allow(RestClient::Request).to receive(:execute)
allow(Slack::Notifier).to receive(:new).and_return(slack_notifier)
allow(InfluxDB2::Client).to receive(:new).and_return(influx_client)
@@ -138,6 +138,37 @@ describe QA::Tools::ReliableReport do
context "with report creation" do
let(:create_issue) { "true" }
+ let(:iid) { 2 }
+ let(:old_iid) { 1 }
+ let(:issue_endpoint) { "gitlab_api_url/projects/278964/issues" }
+
+ let(:common_api_args) do
+ {
+ verify_ssl: false,
+ headers: { "PRIVATE-TOKEN" => "gitlab_token" }
+ }
+ end
+
+ let(:create_issue_response) do
+ instance_double(
+ "RestClient::Response",
+ code: 200,
+ body: { web_url: issue_url, iid: iid }.to_json
+ )
+ end
+
+ let(:open_issues_response) do
+ instance_double(
+ "RestClient::Response",
+ code: 200,
+ body: [{ web_url: issue_url, iid: iid }, { web_url: issue_url, iid: old_iid }].to_json
+ )
+ end
+
+ let(:success_response) do
+ instance_double("RestClient::Response", code: 200, body: {}.to_json)
+ end
+
let(:issue_body) do
<<~TXT.strip
[[_TOC_]]
@@ -156,19 +187,48 @@ describe QA::Tools::ReliableReport do
TXT
end
- it "creates report issue", :aggregate_failures do
+ before do
+ allow(RestClient::Request).to receive(:execute).exactly(4).times.and_return(
+ create_issue_response,
+ open_issues_response,
+ success_response,
+ success_response
+ )
+ end
+
+ it "creates report issue" do
expect { run }.to output.to_stdout
expect(RestClient::Request).to have_received(:execute).with(
method: :post,
- url: "gitlab_api_url/projects/278964/issues",
- verify_ssl: false,
- headers: { "PRIVATE-TOKEN" => "gitlab_token" },
+ url: issue_endpoint,
payload: {
title: "Reliable e2e test report",
description: issue_body,
- labels: "Quality,test,type::maintenance,reliable test report,automation:ml"
- }
+ labels: "reliable test report,Quality,test,type::maintenance,automation:ml"
+ },
+ **common_api_args
+ )
+ expect(RestClient::Request).to have_received(:execute).with(
+ method: :get,
+ url: "#{issue_endpoint}?labels=reliable test report&state=opened",
+ **common_api_args
+ )
+ expect(RestClient::Request).to have_received(:execute).with(
+ method: :put,
+ url: "#{issue_endpoint}/#{old_iid}",
+ payload: {
+ state_event: "close"
+ },
+ **common_api_args
+ )
+ expect(RestClient::Request).to have_received(:execute).with(
+ method: :post,
+ url: "#{issue_endpoint}/#{old_iid}/notes",
+ payload: {
+ body: "Closed issue in favor of ##{iid}"
+ },
+ **common_api_args
)
expect(slack_notifier).to have_received(:post).with(
icon_emoji: ":tanuki-protect:",
diff --git a/rubocop/cop/database/disable_referential_integrity.rb b/rubocop/cop/database/disable_referential_integrity.rb
new file mode 100644
index 00000000000..80d52678011
--- /dev/null
+++ b/rubocop/cop/database/disable_referential_integrity.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ module Database
+ # Cop that checks if 'disable_referential_integrity' method is called.
+ class DisableReferentialIntegrity < RuboCop::Cop::Cop
+ MSG = <<~TEXT
+ Do not use `disable_referential_integrity`, disable triggers in a safe
+ transaction instead. Follow the format:
+ BEGIN;
+ ALTER TABLE my_table DISABLE TRIGGER ALL;
+ -- execute query that requires disabled triggers
+ ALTER TABLE my_table ENABLE TRIGGER ALL;
+ COMMIT;
+ TEXT
+
+ def_node_matcher :disable_referential_integrity?, <<~PATTERN
+ (send _ :disable_referential_integrity)
+ PATTERN
+
+ RESTRICT_ON_SEND = %i[disable_referential_integrity].freeze
+
+ def on_send(node)
+ return unless disable_referential_integrity?(node)
+
+ add_offense(node)
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/gitlab/avoid_feature_category_not_owned.rb b/rubocop/cop/gitlab/avoid_feature_category_not_owned.rb
new file mode 100644
index 00000000000..fb790f44a96
--- /dev/null
+++ b/rubocop/cop/gitlab/avoid_feature_category_not_owned.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require_relative '../../code_reuse_helpers'
+
+module RuboCop
+ module Cop
+ module Gitlab
+ class AvoidFeatureCategoryNotOwned < RuboCop::Cop::Cop
+ include ::RuboCop::CodeReuseHelpers
+
+ MSG = 'Avoid adding new endpoints with `feature_category :not_owned`. See https://docs.gitlab.com/ee/development/feature_categorization'
+ RESTRICT_ON_SEND = %i[feature_category get post put patch delete].freeze
+
+ def_node_matcher :feature_category_not_owned?, <<~PATTERN
+ (send _ :feature_category (sym :not_owned) ...)
+ PATTERN
+
+ def_node_matcher :feature_category_not_owned_api?, <<~PATTERN
+ (send nil? {:get :post :put :patch :delete} _
+ (hash <(pair (sym :feature_category) (sym :not_owned)) ...>)
+ )
+ PATTERN
+
+ def on_send(node)
+ return unless file_needs_feature_category?(node)
+ return unless setting_not_owned?(node)
+
+ add_offense(node, location: :expression)
+ end
+
+ private
+
+ def file_needs_feature_category?(node)
+ in_controller?(node) || in_worker?(node) || in_api?(node)
+ end
+
+ def setting_not_owned?(node)
+ feature_category_not_owned?(node) || feature_category_not_owned_api?(node)
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/gitlab/mark_used_feature_flags.rb b/rubocop/cop/gitlab/mark_used_feature_flags.rb
index 7e01c2765c9..290e62436e2 100644
--- a/rubocop/cop/gitlab/mark_used_feature_flags.rb
+++ b/rubocop/cop/gitlab/mark_used_feature_flags.rb
@@ -31,6 +31,7 @@ module RuboCop
].freeze
SELF_METHODS = %i[
push_frontend_feature_flag
+ push_force_frontend_feature_flag
limit_feature_flag=
limit_feature_flag_for_override=
].freeze + EXPERIMENT_METHODS + RUGGED_METHODS + WORKER_METHODS
diff --git a/rubocop/cop/qa/duplicate_testcase_link.rb b/rubocop/cop/qa/duplicate_testcase_link.rb
deleted file mode 100644
index 82549707a83..00000000000
--- a/rubocop/cop/qa/duplicate_testcase_link.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-module RuboCop
- module Cop
- module QA
- # This cop checks for duplicate testcase links across e2e specs
- #
- # @example
- #
- # # bad
- # it 'some test', testcase: '(...)/quality/test_cases/1892'
- # it 'another test, testcase: '(...)/quality/test_cases/1892'
- #
- # # good
- # it 'some test', testcase: '(...)/quality/test_cases/1892'
- # it 'another test, testcase: '(...)/quality/test_cases/1894'
- class DuplicateTestcaseLink < RuboCop::Cop::Cop
- MESSAGE = "Don't reuse the same testcase link in different tests. Replace one of `%s`."
-
- @testcase_set = Set.new
-
- def_node_matcher :duplicate_testcase_link, <<~PATTERN
- (block
- (send nil? ...
- ...
- (hash
- (pair
- (sym :testcase)
- (str $_))...)...)...)
- PATTERN
-
- def on_block(node)
- duplicate_testcase_link(node) do |link|
- break unless self.class.duplicate?(link)
-
- add_offense(node, message: MESSAGE % link)
- end
- end
-
- def self.duplicate?(link)
- !@testcase_set.add?(link)
- end
- end
- end
- end
-end
diff --git a/rubocop/cop/qa/testcase_link_format.rb b/rubocop/cop/qa/testcase_link_format.rb
deleted file mode 100644
index 683098e6eec..00000000000
--- a/rubocop/cop/qa/testcase_link_format.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../../qa_helpers'
-
-module RuboCop
- module Cop
- module QA
- # This cop checks for correct format of testcase links across e2e specs
- #
- # @example
- #
- # # bad
- # it 'some test', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/557'
- # it 'another test, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/2455'
- #
- # # good
- # it 'some test', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348312'
- # it 'another test, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348236'
- class TestcaseLinkFormat < RuboCop::Cop::Cop
- include QAHelpers
-
- TESTCASE_FORMAT = %r{https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/\d+}.freeze
- MESSAGE = "Testcase link format incorrect. Please link a test case from the GitLab project. See: https://docs.gitlab.com/ee/development/testing_guide/end_to_end/best_practices.html#link-a-test-to-its-test-case."
-
- def_node_matcher :testcase_link_format, <<~PATTERN
- (block
- (send nil? ...
- ...
- (hash
- (pair
- (sym :testcase)
- (str $_))...)...)...)
- PATTERN
-
- def on_block(node)
- return unless in_qa_file?(node)
-
- testcase_link_format(node) do |link|
- add_offense(node, message: MESSAGE % link) unless TESTCASE_FORMAT =~ link
- end
- end
- end
- end
- end
-end
diff --git a/scripts/frontend/graphql_possible_types_extraction.js b/scripts/frontend/graphql_possible_types_extraction.js
new file mode 100755
index 00000000000..61f783086e7
--- /dev/null
+++ b/scripts/frontend/graphql_possible_types_extraction.js
@@ -0,0 +1,69 @@
+#!/usr/bin/env node
+
+const fs = require('fs/promises');
+const path = require('path');
+const assert = require('assert');
+
+const ROOT_DIR = path.join(__dirname, '../../');
+const GRAPHQL_SCHEMA = path.join(ROOT_DIR, 'tmp/tests/graphql/gitlab_schema.json');
+const POSSIBLE_TYPES_REL = 'app/assets/javascripts/graphql_shared/possible_types.json';
+const POSSIBLE_TYPES = path.join(ROOT_DIR, POSSIBLE_TYPES_REL);
+
+function extractTypes(schema) {
+ return Object.fromEntries(
+ // eslint-disable-next-line no-underscore-dangle
+ schema.data.__schema.types
+ .filter((type) => type.possibleTypes)
+ .map(({ name, possibleTypes }) => [name, possibleTypes.map((subtype) => subtype.name)]),
+ );
+}
+
+async function main() {
+ let schema;
+ try {
+ schema = JSON.parse(await fs.readFile(GRAPHQL_SCHEMA, 'utf-8'));
+ } catch (e) {
+ console.error(
+ 'Could not read the GraphQL Schema, make sure to run: bundle exec rake gitlab:graphql:schema:dump',
+ );
+ throw e;
+ }
+
+ const possibleTypes = extractTypes(schema);
+
+ if (process.argv.includes('--check')) {
+ const previousTypes = JSON.parse(await fs.readFile(POSSIBLE_TYPES, 'utf-8'));
+
+ assert.deepStrictEqual(
+ previousTypes,
+ possibleTypes,
+ `
+${POSSIBLE_TYPES_REL} needs to be regenerated, please run:
+ node scripts/frontend/graphql_possible_types_extraction.js --write
+and commit the changes!
+ `,
+ );
+ return;
+ }
+
+ if (process.argv.includes('--write')) {
+ const stringifiedPossibleTypes = JSON.stringify(possibleTypes, null, 2);
+ await fs.writeFile(POSSIBLE_TYPES, `${stringifiedPossibleTypes}\n`);
+ console.log(`Successfully updated ${POSSIBLE_TYPES_REL}`);
+ return;
+ }
+
+ throw new Error(`
+ERROR: Please use the script correctly:
+Usage: graphql_possible_types_extraction [options]
+
+Options:
+ --check Check whether there are new Interface or Union types
+ --write Generate new possible types
+ `);
+}
+
+main().catch((error) => {
+ console.warn(error.message);
+ process.exitCode = 1;
+});
diff --git a/scripts/frontend/startup_css/constants.js b/scripts/frontend/startup_css/constants.js
index 83f43143e1b..10d60657e09 100644
--- a/scripts/frontend/startup_css/constants.js
+++ b/scripts/frontend/startup_css/constants.js
@@ -50,7 +50,7 @@ const createMainOutput = ({ outFile, cssKeys, type }) => ({
htmlPaths: [
path.join(FIXTURES_ROOT, `startup_css/project-${type}.html`),
path.join(FIXTURES_ROOT, `startup_css/project-${type}-signed-out.html`),
- path.join(FIXTURES_ROOT, `startup_css/project-${type}-search-ff-on.html`),
+ path.join(FIXTURES_ROOT, `startup_css/project-${type}-search-ff-off.html`),
],
cssKeys,
purgeOptions: {
diff --git a/scripts/frontend/stylelint/stylelint-duplicate-selectors.js b/scripts/frontend/stylelint/stylelint-duplicate-selectors.js
deleted file mode 100644
index 982ddf524a3..00000000000
--- a/scripts/frontend/stylelint/stylelint-duplicate-selectors.js
+++ /dev/null
@@ -1,25 +0,0 @@
-const stylelint = require('stylelint');
-const utils = require('./stylelint-utils');
-
-const ruleName = 'stylelint-gitlab/duplicate-selectors';
-
-const messages = stylelint.utils.ruleMessages(ruleName, {
- expected: (selector1, selector2) => {
- return `"${selector1}" and "${selector2}" have the same properties.`;
- },
-});
-
-module.exports = stylelint.createPlugin(ruleName, (enabled) => {
- if (!enabled) {
- return;
- }
-
- // eslint-disable-next-line consistent-return
- return (root, result) => {
- const selectorGroups = {};
- utils.createPropertiesHashmap(root, result, ruleName, messages, selectorGroups, true);
- };
-});
-
-module.exports.ruleName = ruleName;
-module.exports.messages = messages;
diff --git a/scripts/frontend/stylelint/stylelint-utility-classes.js b/scripts/frontend/stylelint/stylelint-utility-classes.js
deleted file mode 100644
index 14827145b54..00000000000
--- a/scripts/frontend/stylelint/stylelint-utility-classes.js
+++ /dev/null
@@ -1,25 +0,0 @@
-const stylelint = require('stylelint');
-const utils = require('./stylelint-utils');
-const utilityClasses = require('./utility-classes-map');
-
-const ruleName = 'stylelint-gitlab/utility-classes';
-
-const messages = stylelint.utils.ruleMessages(ruleName, {
- expected: (selector1, selector2) => {
- return `"${selector1}" has the same properties as our BS4 utility class "${selector2}" so please use that instead.`;
- },
-});
-
-module.exports = stylelint.createPlugin(ruleName, (enabled) => {
- if (!enabled) {
- return;
- }
-
- // eslint-disable-next-line consistent-return
- return (root, result) => {
- utils.createPropertiesHashmap(root, result, ruleName, messages, utilityClasses, false);
- };
-});
-
-module.exports.ruleName = ruleName;
-module.exports.messages = messages;
diff --git a/scripts/frontend/stylelint/stylelint-utility-map.js b/scripts/frontend/stylelint/stylelint-utility-map.js
deleted file mode 100644
index 676f83cd067..00000000000
--- a/scripts/frontend/stylelint/stylelint-utility-map.js
+++ /dev/null
@@ -1,64 +0,0 @@
-const fs = require('fs');
-const path = require('path');
-const postcss = require('postcss');
-const prettier = require('prettier');
-const sass = require('sass');
-
-const utils = require('./stylelint-utils');
-
-const ROOT_PATH = path.resolve(__dirname, '../../..');
-const hashMapPath = path.resolve(__dirname, './utility-classes-map.js');
-
-//
-// This creates a JS based hash map (saved in utility-classes-map.js) of the different values in the utility classes
-//
-sass.render(
- {
- data: `
- @import './functions';
- @import './variables';
- @import './mixins';
- @import './utilities';
- `,
- includePaths: [path.resolve(ROOT_PATH, 'node_modules/bootstrap/scss')],
- },
- (err, result) => {
- if (err) {
- return console.error('Error ', err);
- }
-
- const cssResult = result.css.toString();
-
- // We just use postcss to create a CSS tree
- return postcss([])
- .process(cssResult, {
- // This suppresses a postcss warning
- from: undefined,
- })
- .then((processedResult) => {
- const selectorGroups = {};
- utils.createPropertiesHashmap(
- processedResult.root,
- processedResult,
- null,
- null,
- selectorGroups,
- true,
- );
-
- const prettierOptions = prettier.resolveConfig.sync(hashMapPath);
- const prettyHashmap = prettier.format(
- `module.exports = ${JSON.stringify(selectorGroups)};`,
- prettierOptions,
- );
-
- fs.writeFile(hashMapPath, prettyHashmap, (e) => {
- if (e) {
- return console.log(e);
- }
-
- return console.log('The file was saved!');
- });
- });
- },
-);
diff --git a/scripts/frontend/stylelint/stylelint_duplicate_selectors.js b/scripts/frontend/stylelint/stylelint_duplicate_selectors.js
new file mode 100644
index 00000000000..77c1f1292b7
--- /dev/null
+++ b/scripts/frontend/stylelint/stylelint_duplicate_selectors.js
@@ -0,0 +1,25 @@
+const stylelint = require('stylelint');
+const utils = require('./stylelint_utils');
+
+const ruleName = 'stylelint-gitlab/duplicate-selectors';
+
+const messages = stylelint.utils.ruleMessages(ruleName, {
+ expected: (selector1, selector2) => {
+ return `"${selector1}" and "${selector2}" have the same properties.`;
+ },
+});
+
+module.exports = stylelint.createPlugin(ruleName, (enabled) => {
+ if (!enabled) {
+ return;
+ }
+
+ // eslint-disable-next-line consistent-return
+ return (root, result) => {
+ const selectorGroups = {};
+ utils.createPropertiesHashmap(root, result, ruleName, messages, selectorGroups, true);
+ };
+});
+
+module.exports.ruleName = ruleName;
+module.exports.messages = messages;
diff --git a/scripts/frontend/stylelint/stylelint_utility_classes.js b/scripts/frontend/stylelint/stylelint_utility_classes.js
new file mode 100644
index 00000000000..ad2b2ddbb20
--- /dev/null
+++ b/scripts/frontend/stylelint/stylelint_utility_classes.js
@@ -0,0 +1,25 @@
+const stylelint = require('stylelint');
+const utils = require('./stylelint_utils');
+const utilityClasses = require('./utility_classes_map');
+
+const ruleName = 'stylelint-gitlab/utility-classes';
+
+const messages = stylelint.utils.ruleMessages(ruleName, {
+ expected: (selector1, selector2) => {
+ return `"${selector1}" has the same properties as our BS4 utility class "${selector2}" so please use that instead.`;
+ },
+});
+
+module.exports = stylelint.createPlugin(ruleName, (enabled) => {
+ if (!enabled) {
+ return;
+ }
+
+ // eslint-disable-next-line consistent-return
+ return (root, result) => {
+ utils.createPropertiesHashmap(root, result, ruleName, messages, utilityClasses, false);
+ };
+});
+
+module.exports.ruleName = ruleName;
+module.exports.messages = messages;
diff --git a/scripts/frontend/stylelint/stylelint_utility_map.js b/scripts/frontend/stylelint/stylelint_utility_map.js
new file mode 100644
index 00000000000..187b2065823
--- /dev/null
+++ b/scripts/frontend/stylelint/stylelint_utility_map.js
@@ -0,0 +1,64 @@
+const fs = require('fs');
+const path = require('path');
+const postcss = require('postcss');
+const prettier = require('prettier');
+const sass = require('sass');
+
+const utils = require('./stylelint_utils');
+
+const ROOT_PATH = path.resolve(__dirname, '../../..');
+const hashMapPath = path.resolve(__dirname, './utility_classes_map.js');
+
+//
+// This creates a JS based hash map (saved in utility_classes_map.js) of the different values in the utility classes
+//
+sass.render(
+ {
+ data: `
+ @import './functions';
+ @import './variables';
+ @import './mixins';
+ @import './utilities';
+ `,
+ includePaths: [path.resolve(ROOT_PATH, 'node_modules/bootstrap/scss')],
+ },
+ (err, result) => {
+ if (err) {
+ return console.error('Error ', err);
+ }
+
+ const cssResult = result.css.toString();
+
+ // We just use postcss to create a CSS tree
+ return postcss([])
+ .process(cssResult, {
+ // This suppresses a postcss warning
+ from: undefined,
+ })
+ .then((processedResult) => {
+ const selectorGroups = {};
+ utils.createPropertiesHashmap(
+ processedResult.root,
+ processedResult,
+ null,
+ null,
+ selectorGroups,
+ true,
+ );
+
+ const prettierOptions = prettier.resolveConfig.sync(hashMapPath);
+ const prettyHashmap = prettier.format(
+ `module.exports = ${JSON.stringify(selectorGroups)};`,
+ prettierOptions,
+ );
+
+ fs.writeFile(hashMapPath, prettyHashmap, (e) => {
+ if (e) {
+ return console.log(e);
+ }
+
+ return console.log('The file was saved!');
+ });
+ });
+ },
+);
diff --git a/scripts/frontend/stylelint/stylelint-utils.js b/scripts/frontend/stylelint/stylelint_utils.js
index c9d9c7d9aad..c9d9c7d9aad 100644
--- a/scripts/frontend/stylelint/stylelint-utils.js
+++ b/scripts/frontend/stylelint/stylelint_utils.js
diff --git a/scripts/frontend/stylelint/utility-classes-map.js b/scripts/frontend/stylelint/utility_classes_map.js
index a174812ff93..a174812ff93 100644
--- a/scripts/frontend/stylelint/utility-classes-map.js
+++ b/scripts/frontend/stylelint/utility_classes_map.js
diff --git a/scripts/gitlab_workhorse_component_helpers.sh b/scripts/gitlab_workhorse_component_helpers.sh
index 06fe7b2ea51..ebd43a125b9 100644
--- a/scripts/gitlab_workhorse_component_helpers.sh
+++ b/scripts/gitlab_workhorse_component_helpers.sh
@@ -30,6 +30,7 @@ function create_gitlab_workhorse_package() {
function extract_gitlab_workhorse_package() {
local tar_working_folder="${TMP_TEST_FOLDER}"
+ mkdir -p "${tar_working_folder}"
echoinfo "Extracting archive to ${tar_working_folder}"
diff --git a/scripts/lint-doc.sh b/scripts/lint-doc.sh
index aba815cdf28..5a3f439009d 100755
--- a/scripts/lint-doc.sh
+++ b/scripts/lint-doc.sh
@@ -128,7 +128,7 @@ function run_locally_or_in_docker() {
$cmd $args
elif hash docker 2>/dev/null
then
- docker run -t -v ${PWD}:/gitlab -w /gitlab --rm registry.gitlab.com/gitlab-org/gitlab-docs/lint-markdown:alpine-3.15-vale-2.15.0-markdownlint-0.31.0 ${cmd} ${args}
+ docker run -t -v ${PWD}:/gitlab -w /gitlab --rm registry.gitlab.com/gitlab-org/gitlab-docs/lint-markdown:alpine-3.15-vale-2.15.5-markdownlint-0.31.1 ${cmd} ${args}
else
echo
echo " ✖ ERROR: '${cmd}' not found. Install '${cmd}' or Docker to proceed." >&2
diff --git a/scripts/merge-simplecov b/scripts/merge-simplecov
index 32a0cd86f82..24be731549b 100755
--- a/scripts/merge-simplecov
+++ b/scripts/merge-simplecov
@@ -5,4 +5,7 @@ require_relative '../spec/simplecov_env'
SimpleCovEnv.configure_profile
SimpleCovEnv.configure_formatter
-SimpleCov.collate Dir.glob(File.join(SimpleCov.coverage_path, '*', '.resultset.json'))
+resultset_files = Dir.glob(File.join(SimpleCov.coverage_path, '*', '.resultset.json'))
+exit(0) if resultset_files.empty?
+
+SimpleCov.collate(resultset_files)
diff --git a/scripts/qa/testcases-check b/scripts/qa/testcases-check
new file mode 100755
index 00000000000..1d7a9d04e7b
--- /dev/null
+++ b/scripts/qa/testcases-check
@@ -0,0 +1,79 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require 'json'
+
+TESTCASE_FORMAT = %r{https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/\d+}.freeze
+
+testcases = []
+missing_testcases = []
+formatted_duplicates = []
+testcase_format_errors = []
+missing_message = %"\n*** The following tests are missing testcase links:\n\n%s\n"
+duplicate_message = %"\n*** The following tests have duplicate testcase links:\n\n%s"
+format_message = %"\n*** The following testcase links are incorrectly formatted:\n\n%s\n"
+
+test_metadata_file = ARGV.shift
+
+unless test_metadata_file
+ puts "usage: #{__FILE__} <test_metadata_file>"
+ exit 1
+end
+
+file = File.read(test_metadata_file)
+
+unless file =~ %r{.*\"examples\":\[\{\"id\"\:.*}
+ puts "\nRspec output did not match regex. Check test-metadata.json file.\n"
+ exit 1
+end
+
+puts "\nAnalyzing testcase data...\n"
+
+data_hash = JSON.parse(file)
+tests = data_hash['examples']
+
+tests.each do |test|
+ next if test['id'] =~ %r{.\/qa\/specs\/features\/sanity\/*}
+
+ if test['testcase']
+ testcases.push(["#{test['testcase']}", "#{test['id']} - #{test['full_description']}"])
+
+ unless TESTCASE_FORMAT =~ test['testcase']
+ testcase_format_errors.push(
+ <<~FORMAT_ERRORS
+ ==> #{test['testcase']} in file: #{test['id']} with title:
+ #{test['full_description']}
+ FORMAT_ERRORS
+ )
+ end
+ else
+ missing_testcases.push(" ==> #{test['id']} - #{test['full_description']}\n")
+ end
+end
+
+testcase_list = testcases.group_by {|testcase| testcase.shift}.transform_values(&:flatten)
+
+duplicates = testcase_list.select {|k, v| v.count > 1}
+
+unless duplicates.empty?
+ duplicates.each do |duplicate|
+ formatted_duplicates.append(
+ <<~DUPLICATES
+ Testcase link #{duplicate[0]} is used in too many tests:
+ ==> #{duplicate[1].join("\n ==> ")}\n
+ DUPLICATES
+ )
+ end
+end
+
+if formatted_duplicates.empty? && missing_testcases.empty? && testcase_format_errors.empty?
+ puts "\nNo errors found."
+else
+ puts "\n*** Testcase link violations detected! ***\n"
+ puts duplicate_message % formatted_duplicates.join("\n") unless formatted_duplicates.empty?
+ puts missing_message % missing_testcases.join("\n") unless missing_testcases.empty?
+ puts format_message % testcase_format_errors.join("\n") unless testcase_format_errors.empty?
+ puts "\n*** Please link a unique test case from the GitLab project for the errors listed above.\n"
+ puts " See: https://docs.gitlab.com/ee/development/testing_guide/end_to_end/best_practices.html#link-a-test-to-its-test-case."
+ exit 1
+end
diff --git a/scripts/review_apps/base-config.yaml b/scripts/review_apps/base-config.yaml
index 0f6603fea8c..91c645a0ed9 100644
--- a/scripts/review_apps/base-config.yaml
+++ b/scripts/review_apps/base-config.yaml
@@ -1,3 +1,6 @@
+safe-to-evict: &safe-to-evict
+ cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
+
global:
appConfig:
enableUsagePing: false
@@ -29,6 +32,8 @@ gitlab:
storageClass: ssd
nodeSelector:
preemptible: "false"
+ podAnnotations:
+ <<: *safe-to-evict
gitlab-exporter:
enabled: false
mailroom:
@@ -107,6 +112,8 @@ gitlab-runner:
memory: 150M
nodeSelector:
preemptible: "true"
+ podAnnotations:
+ <<: *safe-to-evict
minio:
resources:
requests:
@@ -117,6 +124,8 @@ minio:
memory: 280M
nodeSelector:
preemptible: "true"
+ podAnnotations:
+ <<: *safe-to-evict
nginx-ingress:
controller:
config:
@@ -159,6 +168,8 @@ postgresql:
master:
nodeSelector:
preemptible: "false"
+ podAnnotations:
+ <<: *safe-to-evict
prometheus:
install: false
redis:
@@ -174,6 +185,8 @@ redis:
master:
nodeSelector:
preemptible: "true"
+ podAnnotations:
+ <<: *safe-to-evict
registry:
hpa:
minReplicas: 1
diff --git a/scripts/review_apps/review-apps.sh b/scripts/review_apps/review-apps.sh
index 695de95b8fc..f529c8eaafe 100755
--- a/scripts/review_apps/review-apps.sh
+++ b/scripts/review_apps/review-apps.sh
@@ -213,7 +213,7 @@ function create_application_secret() {
local initial_root_password_shared_secret
local gitlab_license_shared_secret
- initial_root_password_shared_secret=$(kubectl get secret --namespace ${namespace} --no-headers -o=custom-columns=NAME:.metadata.name shared-gitlab-initial-root-password | tail -n 1)
+ initial_root_password_shared_secret=$(kubectl get secret --namespace ${namespace} --no-headers -o=custom-columns=NAME:.metadata.name shared-gitlab-initial-root-password 2> /dev/null | tail -n 1)
if [[ "${initial_root_password_shared_secret}" == "" ]]; then
echoinfo "Creating the 'shared-gitlab-initial-root-password' secret in the ${namespace} namespace..." true
kubectl create secret generic --namespace "${namespace}" \
@@ -226,7 +226,7 @@ function create_application_secret() {
if [ -z "${REVIEW_APPS_EE_LICENSE_FILE}" ]; then echo "License not found" && return; fi
- gitlab_license_shared_secret=$(kubectl get secret --namespace ${namespace} --no-headers -o=custom-columns=NAME:.metadata.name shared-gitlab-license | tail -n 1)
+ gitlab_license_shared_secret=$(kubectl get secret --namespace ${namespace} --no-headers -o=custom-columns=NAME:.metadata.name shared-gitlab-license 2> /dev/null | tail -n 1)
if [[ "${gitlab_license_shared_secret}" == "" ]]; then
echoinfo "Creating the 'shared-gitlab-license' secret in the ${namespace} namespace..." true
kubectl create secret generic --namespace "${namespace}" \
diff --git a/scripts/static-analysis b/scripts/static-analysis
index 9c6a948adc1..317652eb075 100755
--- a/scripts/static-analysis
+++ b/scripts/static-analysis
@@ -55,6 +55,7 @@ class StaticAnalysis
Task.new(%w[yarn run internal:stylelint], 8),
Task.new(%w[scripts/lint-conflicts.sh], 1),
Task.new(%w[yarn run block-dependencies], 1),
+ Task.new(%w[yarn run check-dependencies], 1),
Task.new(%w[scripts/lint-rugged], 1),
Task.new(%w[scripts/gemfile_lock_changed.sh], 1)
].compact.freeze
diff --git a/scripts/vendor_template b/scripts/vendor_template
new file mode 100755
index 00000000000..96d013ea772
--- /dev/null
+++ b/scripts/vendor_template
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+#
+# Run it as:
+# vendor_template https://gitlab.com/pages/hugo hugo "Pages/Hugo template"
+#
+
+## Check which OS the script runs from since gtar/tar behaves differently
+## on macOS and Linux
+if [ "$(uname)" == "Darwin" ]; then
+ GTAR="gtar"
+else
+ GTAR="tar"
+fi
+
+## Check if jq is installed
+hash jq 2>/dev/null || echo "ERROR: jq is not installed. Install it and run the script again."
+
+REPO_URL=$1
+SHORT_NAME=$2
+COMMENT=$3
+FILENAME="$SHORT_NAME.tar.gz"
+
+# Check if the extracted project exists
+if [ ! -f $FILENAME ]
+then
+ echo
+ echo "ERROR: $FILENAME doesn't exist. Did you export the project?"
+ exit 1
+fi
+
+$GTAR --list --file="$FILENAME"
+rm -rf tar-base project-$SHORT_NAME
+mkdir -p "./tar-base"
+tar xf "$2.tar.gz" -C "./tar-base" ./VERSION ./tree/project.json
+git clone "$REPO_URL" project-$SHORT_NAME
+cd project-$SHORT_NAME
+rm -rf .git
+git init
+git add -A .
+git commit --author "GitLab <root@localhost>" -m "$COMMENT"
+git bundle create project.bundle --all
+mv -f project.bundle ../tar-base/
+cd ../tar-base
+cat tree/project.json | jq '.issues = [] | .releases = [] | .merge_requests = [] | .ci_pipelines = [] | .pipeline_schedules = [] | .services = [] | .pipelines = [] | .protected_branches = [] | .project_members = [] | .labels = [] | del(.ci_cd_settings, .external_authorization_classification_label, .project_feature)' -c > project.json
+rm -rf tree
+ls -alth
+tar cvzf "$FILENAME" ./
+cd ..
+
+echo "=> Moving $FILENAME to the vendored templates"
+mv tar-base/$FILENAME vendor/project_templates/
+
+echo "=> Cleaning up"
+rm -rf tar-base "project-$SHORT_NAME" $FILENAME
+
+echo "=> The following files are included in the bundled repo:"
+$GTAR --list --file="vendor/project_templates/$FILENAME"
diff --git a/scripts/verify-tff-mapping b/scripts/verify-tff-mapping
index b09fd09a737..b3462f74faa 100755
--- a/scripts/verify-tff-mapping
+++ b/scripts/verify-tff-mapping
@@ -149,7 +149,7 @@ class MappingTest
end
end
-results = tests.map { |test| MappingTest.new(test) }
+results = tests.map { |test| MappingTest.new(**test) }
failed_tests = results.select(&:failed?)
if failed_tests.any?
diff --git a/sidekiq_cluster/cli.rb b/sidekiq_cluster/cli.rb
index e04f5ab1d42..c0940370d3b 100644
--- a/sidekiq_cluster/cli.rb
+++ b/sidekiq_cluster/cli.rb
@@ -100,6 +100,11 @@ module Gitlab
unless @dryrun
@logger.info("Starting cluster with #{queue_groups.length} processes")
+
+ # Make sure we reset the metrics directory prior to:
+ # - starting a metrics server process
+ # - starting new workers
+ ::Prometheus::CleanupMultiprocDirService.new(@metrics_dir).execute
end
start_and_supervise_workers(queue_groups)
@@ -137,7 +142,7 @@ module Gitlab
# and the metrics server died, restart it.
if supervisor.alive && dead_pids.include?(metrics_server_pid)
@logger.info('Sidekiq metrics server terminated, restarting...')
- metrics_server_pid = restart_metrics_server(wipe_metrics_dir: false)
+ metrics_server_pid = restart_metrics_server
all_pids = worker_pids + Array(metrics_server_pid)
else
# If a worker process died we'll just terminate the whole cluster.
@@ -154,15 +159,14 @@ module Gitlab
def start_metrics_server
return unless metrics_server_enabled?
- restart_metrics_server(wipe_metrics_dir: true)
+ restart_metrics_server
end
- def restart_metrics_server(wipe_metrics_dir: false)
+ def restart_metrics_server
@logger.info("Starting metrics server on port #{sidekiq_exporter_port}")
MetricsServer.fork(
'sidekiq',
metrics_dir: @metrics_dir,
- wipe_metrics_dir: wipe_metrics_dir,
reset_signals: TERMINATE_SIGNALS + FORWARD_SIGNALS
)
end
diff --git a/spec/commands/sidekiq_cluster/cli_spec.rb b/spec/commands/sidekiq_cluster/cli_spec.rb
index 2cb3f67b03d..bbf5f2bc4d9 100644
--- a/spec/commands/sidekiq_cluster/cli_spec.rb
+++ b/spec/commands/sidekiq_cluster/cli_spec.rb
@@ -41,6 +41,7 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
end
let(:supervisor) { instance_double(Gitlab::SidekiqCluster::SidekiqProcessSupervisor) }
+ let(:metrics_cleanup_service) { instance_double(Prometheus::CleanupMultiprocDirService, execute: nil) }
before do
stub_env('RAILS_ENV', 'test')
@@ -54,6 +55,8 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
allow(Gitlab::ProcessManagement).to receive(:write_pid)
allow(Gitlab::SidekiqCluster::SidekiqProcessSupervisor).to receive(:instance).and_return(supervisor)
allow(supervisor).to receive(:supervise)
+
+ allow(Prometheus::CleanupMultiprocDirService).to receive(:new).and_return(metrics_cleanup_service)
end
after do
@@ -300,6 +303,13 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
allow(Gitlab::SidekiqCluster).to receive(:start).and_return([])
end
+ it 'wipes the metrics directory before starting workers' do
+ expect(metrics_cleanup_service).to receive(:execute).ordered
+ expect(Gitlab::SidekiqCluster).to receive(:start).ordered.and_return([])
+
+ cli.run(%w(foo))
+ end
+
context 'when there are no sidekiq_health_checks settings set' do
let(:sidekiq_exporter_enabled) { true }
@@ -379,7 +389,7 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
with_them do
specify do
if start_metrics_server
- expect(MetricsServer).to receive(:fork).with('sidekiq', metrics_dir: metrics_dir, wipe_metrics_dir: true, reset_signals: trapped_signals)
+ expect(MetricsServer).to receive(:fork).with('sidekiq', metrics_dir: metrics_dir, reset_signals: trapped_signals)
else
expect(MetricsServer).not_to receive(:fork)
end
diff --git a/spec/components/diffs/overflow_warning_component_spec.rb b/spec/components/diffs/overflow_warning_component_spec.rb
new file mode 100644
index 00000000000..ee4014ee492
--- /dev/null
+++ b/spec/components/diffs/overflow_warning_component_spec.rb
@@ -0,0 +1,184 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Diffs::OverflowWarningComponent, type: :component do
+ include RepoHelpers
+
+ subject(:component) do
+ described_class.new(
+ diffs: diffs,
+ diff_files: diff_files,
+ project: project,
+ commit: commit,
+ merge_request: merge_request
+ )
+ end
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:repository) { project.repository }
+ let_it_be(:commit) { project.commit(sample_commit.id) }
+ let_it_be(:diffs) { commit.raw_diffs }
+ let_it_be(:diff) { diffs.first }
+ let_it_be(:diff_refs) { commit.diff_refs }
+ let_it_be(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: diff_refs, repository: repository) }
+ let_it_be(:diff_files) { [diff_file] }
+ let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+
+ let(:expected_button_classes) do
+ "btn gl-alert-action btn-default gl-button btn-default-secondary"
+ end
+
+ describe "rendered component" do
+ subject { rendered_component }
+
+ context "on a commit page" do
+ before do
+ with_controller_class Projects::CommitController do
+ render_inline component
+ end
+ end
+
+ it { is_expected.to include(component.message) }
+
+ it "links to the diff" do
+ expect(component.diff_link).to eq(
+ ActionController::Base.helpers.link_to(
+ _("Plain diff"),
+ project_commit_path(project, commit, format: :diff),
+ class: expected_button_classes
+ )
+ )
+
+ is_expected.to include(component.diff_link)
+ end
+
+ it "links to the patch" do
+ expect(component.patch_link).to eq(
+ ActionController::Base.helpers.link_to(
+ _("Email patch"),
+ project_commit_path(project, commit, format: :patch),
+ class: expected_button_classes
+ )
+ )
+
+ is_expected.to include(component.patch_link)
+ end
+ end
+
+ context "on a merge request page and the merge request is persisted" do
+ before do
+ with_controller_class Projects::MergeRequests::DiffsController do
+ render_inline component
+ end
+ end
+
+ it { is_expected.to include(component.message) }
+
+ it "links to the diff" do
+ expect(component.diff_link).to eq(
+ ActionController::Base.helpers.link_to(
+ _("Plain diff"),
+ merge_request_path(merge_request, format: :diff),
+ class: expected_button_classes
+ )
+ )
+
+ is_expected.to include(component.diff_link)
+ end
+
+ it "links to the patch" do
+ expect(component.patch_link).to eq(
+ ActionController::Base.helpers.link_to(
+ _("Email patch"),
+ merge_request_path(merge_request, format: :patch),
+ class: expected_button_classes
+ )
+ )
+
+ is_expected.to include(component.patch_link)
+ end
+ end
+
+ context "both conditions fail" do
+ before do
+ allow(component).to receive(:commit?).and_return(false)
+ allow(component).to receive(:merge_request?).and_return(false)
+ render_inline component
+ end
+
+ it { is_expected.to include(component.message) }
+ it { is_expected.not_to include(expected_button_classes) }
+ it { is_expected.not_to include("Plain diff") }
+ it { is_expected.not_to include("Email patch") }
+ end
+ end
+
+ describe "#message" do
+ subject { component.message }
+
+ it { is_expected.to be_a(String) }
+
+ it "is HTML-safe" do
+ expect(subject.html_safe?).to be_truthy
+ end
+ end
+
+ describe "#diff_link" do
+ subject { component.diff_link }
+
+ before do
+ allow(component).to receive(:link_to).and_return("foo")
+ render_inline component
+ end
+
+ it "is a string when on a commit page" do
+ allow(component).to receive(:commit?).and_return(true)
+
+ is_expected.to eq("foo")
+ end
+
+ it "is a string when on a merge request page" do
+ allow(component).to receive(:commit?).and_return(false)
+ allow(component).to receive(:merge_request?).and_return(true)
+
+ is_expected.to eq("foo")
+ end
+
+ it "is nil in other situations" do
+ allow(component).to receive(:commit?).and_return(false)
+ allow(component).to receive(:merge_request?).and_return(false)
+
+ is_expected.to be_nil
+ end
+ end
+
+ describe "#patch_link" do
+ subject { component.patch_link }
+
+ before do
+ allow(component).to receive(:link_to).and_return("foo")
+ render_inline component
+ end
+
+ it "is a string when on a commit page" do
+ allow(component).to receive(:commit?).and_return(true)
+
+ is_expected.to eq("foo")
+ end
+
+ it "is a string when on a merge request page" do
+ allow(component).to receive(:commit?).and_return(false)
+ allow(component).to receive(:merge_request?).and_return(true)
+
+ is_expected.to eq("foo")
+ end
+
+ it "is nil in other situations" do
+ allow(component).to receive(:commit?).and_return(false)
+ allow(component).to receive(:merge_request?).and_return(false)
+
+ is_expected.to be_nil
+ end
+ end
+end
diff --git a/spec/components/diffs/stats_component_spec.rb b/spec/components/diffs/stats_component_spec.rb
new file mode 100644
index 00000000000..2e5a5f2ca26
--- /dev/null
+++ b/spec/components/diffs/stats_component_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Diffs::StatsComponent, type: :component do
+ include RepoHelpers
+
+ subject(:component) do
+ described_class.new(diff_files: diff_files)
+ end
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:repository) { project.repository }
+ let_it_be(:commit) { project.commit(sample_commit.id) }
+ let_it_be(:diffs) { commit.raw_diffs }
+ let_it_be(:diff) { diffs.first }
+ let_it_be(:diff_refs) { commit.diff_refs }
+ let_it_be(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: diff_refs, repository: repository) }
+ let_it_be(:diff_files) { [diff_file] }
+
+ describe "rendered component" do
+ subject { rendered_component }
+
+ let(:element) { page.find(".js-diff-stats-dropdown") }
+
+ before do
+ render_inline component
+ end
+
+ it { is_expected.to have_selector(".js-diff-stats-dropdown") }
+
+ it "renders the data attributes" do
+ expect(element["data-changed"]).to eq("1")
+ expect(element["data-added"]).to eq("10")
+ expect(element["data-deleted"]).to eq("3")
+
+ expect(Gitlab::Json.parse(element["data-files"])).to eq([{
+ "href" => "##{Digest::SHA1.hexdigest(diff_file.file_path)}",
+ "title" => diff_file.new_path,
+ "name" => diff_file.file_path,
+ "path" => diff_file.file_path,
+ "icon" => "file-modified",
+ "iconColor" => "",
+ "added" => diff_file.added_lines,
+ "removed" => diff_file.removed_lines
+ }])
+ end
+ end
+
+ describe "#diff_file_path_text" do
+ it "returns full path by default" do
+ expect(subject.diff_file_path_text(diff_file)).to eq(diff_file.new_path)
+ end
+
+ it "returns truncated path" do
+ expect(subject.diff_file_path_text(diff_file, max: 10)).to eq("...open.rb")
+ end
+
+ it "returns the path if max is oddly small" do
+ expect(subject.diff_file_path_text(diff_file, max: 3)).to eq(diff_file.new_path)
+ end
+
+ it "returns the path if max is oddly large" do
+ expect(subject.diff_file_path_text(diff_file, max: 100)).to eq(diff_file.new_path)
+ end
+ end
+end
diff --git a/spec/components/pajamas/alert_component_spec.rb b/spec/components/pajamas/alert_component_spec.rb
new file mode 100644
index 00000000000..628d715ff64
--- /dev/null
+++ b/spec/components/pajamas/alert_component_spec.rb
@@ -0,0 +1,104 @@
+# frozen_string_literal: true
+require "spec_helper"
+
+RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
+ context 'with content' do
+ before do
+ render_inline(described_class.new) { '_content_' }
+ end
+
+ it 'has content' do
+ expect(rendered_component).to have_text('_content_')
+ end
+ end
+
+ context 'with defaults' do
+ before do
+ render_inline described_class.new
+ end
+
+ it 'does not set a title' do
+ expect(rendered_component).not_to have_selector('.gl-alert-title')
+ expect(rendered_component).to have_selector('.gl-alert-icon-no-title')
+ end
+
+ it 'renders the default variant' do
+ expect(rendered_component).to have_selector('.gl-alert-info')
+ expect(rendered_component).to have_selector("[data-testid='information-o-icon']")
+ end
+
+ it 'renders a dismiss button' do
+ expect(rendered_component).to have_selector('.gl-dismiss-btn.js-close')
+ expect(rendered_component).to have_selector("[data-testid='close-icon']")
+ end
+ end
+
+ context 'with custom options' do
+ context 'with simple options' do
+ context 'without dismissible content' do
+ before do
+ render_inline described_class.new(
+ title: '_title_',
+ dismissible: false,
+ alert_class: '_alert_class_',
+ alert_data: {
+ feature_id: '_feature_id_',
+ dismiss_endpoint: '_dismiss_endpoint_'
+ }
+ )
+ end
+
+ it 'sets the title' do
+ expect(rendered_component).to have_selector('.gl-alert-title')
+ expect(rendered_component).to have_content('_title_')
+ expect(rendered_component).not_to have_selector('.gl-alert-icon-no-title')
+ end
+
+ it 'sets to not be dismissible' do
+ expect(rendered_component).not_to have_selector('.gl-dismiss-btn.js-close')
+ expect(rendered_component).not_to have_selector("[data-testid='close-icon']")
+ end
+
+ it 'sets the alert_class' do
+ expect(rendered_component).to have_selector('._alert_class_')
+ end
+
+ it 'sets the alert_data' do
+ expect(rendered_component).to have_selector('[data-feature-id="_feature_id_"][data-dismiss-endpoint="_dismiss_endpoint_"]')
+ end
+ end
+ end
+
+ context 'with dismissible content' do
+ before do
+ render_inline described_class.new(
+ close_button_class: '_close_button_class_',
+ close_button_data: {
+ testid: '_close_button_testid_'
+ }
+ )
+ end
+
+ it 'renders a dismiss button and data' do
+ expect(rendered_component).to have_selector('.gl-dismiss-btn.js-close._close_button_class_')
+ expect(rendered_component).to have_selector("[data-testid='close-icon']")
+ expect(rendered_component).to have_selector('[data-testid="_close_button_testid_"]')
+ end
+ end
+
+ context 'with setting variant type' do
+ where(:variant) { [:warning, :success, :danger, :tip] }
+
+ before do
+ render_inline described_class.new(variant: variant)
+ end
+
+ with_them do
+ it 'renders the variant' do
+ expect(rendered_component).to have_selector(".gl-alert-#{variant}")
+ expect(rendered_component).to have_selector("[data-testid='#{described_class::ICONS[variant]}-icon']")
+ end
+ end
+ end
+ end
+end
diff --git a/spec/controllers/concerns/import_url_params_spec.rb b/spec/controllers/concerns/import_url_params_spec.rb
index ddffb243f7a..170263d10a4 100644
--- a/spec/controllers/concerns/import_url_params_spec.rb
+++ b/spec/controllers/concerns/import_url_params_spec.rb
@@ -55,4 +55,22 @@ RSpec.describe ImportUrlParams do
end
end
end
+
+ context 'url with provided mixed credentials' do
+ let(:params) do
+ ActionController::Parameters.new(project: {
+ import_url: 'https://user@url.com',
+ import_url_user: '', import_url_password: 'password'
+ })
+ end
+
+ describe '#import_url_params' do
+ it 'returns import_url built from both url and hash credentials' do
+ expect(import_url_params).to eq(
+ import_url: 'https://user:password@url.com',
+ import_type: 'git'
+ )
+ end
+ end
+ end
end
diff --git a/spec/controllers/explore/projects_controller_spec.rb b/spec/controllers/explore/projects_controller_spec.rb
index c3f6c653376..bf578489916 100644
--- a/spec/controllers/explore/projects_controller_spec.rb
+++ b/spec/controllers/explore/projects_controller_spec.rb
@@ -112,6 +112,13 @@ RSpec.describe Explore::ProjectsController do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to render_template('topic')
end
+
+ it 'finds topic by case insensitive name' do
+ get :topic, params: { topic_name: 'TOPIC1' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('topic')
+ end
end
end
end
diff --git a/spec/controllers/graphql_controller_spec.rb b/spec/controllers/graphql_controller_spec.rb
index dbaed8aaa19..4de31e2e135 100644
--- a/spec/controllers/graphql_controller_spec.rb
+++ b/spec/controllers/graphql_controller_spec.rb
@@ -134,6 +134,47 @@ RSpec.describe GraphqlController do
post :execute
end
+
+ it 'calls the track gitlab cli when trackable method' do
+ agent = 'GLab - GitLab CLI'
+ request.env['HTTP_USER_AGENT'] = agent
+
+ expect(Gitlab::UsageDataCounters::GitLabCliActivityUniqueCounter)
+ .to receive(:track_api_request_when_trackable).with(user_agent: agent, user: user)
+
+ post :execute
+ end
+
+ it "assigns username in ApplicationContext" do
+ post :execute
+
+ expect(Gitlab::ApplicationContext.current).to include('meta.user' => user.username)
+ end
+ end
+
+ context 'when 2FA is required for the user' do
+ let(:user) { create(:user, last_activity_on: Date.yesterday) }
+
+ before do
+ group = create(:group, require_two_factor_authentication: true)
+ group.add_developer(user)
+
+ sign_in(user)
+ end
+
+ it 'does not redirect if 2FA is enabled' do
+ expect(controller).not_to receive(:redirect_to)
+
+ post :execute
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+
+ expected_message = "Authentication error: " \
+ "enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}" %
+ { mfa_help_page: EnforcesTwoFactorAuthentication::MFA_HELP_PAGE }
+
+ expect(json_response).to eq({ 'errors' => [{ 'message' => expected_message }] })
+ end
end
context 'when user uses an API token' do
@@ -189,6 +230,12 @@ RSpec.describe GraphqlController do
expect(assigns(:context)[:is_sessionless_user]).to be true
end
+ it "assigns username in ApplicationContext" do
+ subject
+
+ expect(Gitlab::ApplicationContext.current).to include('meta.user' => user.username)
+ end
+
it 'calls the track api when trackable method' do
agent = 'vs-code-gitlab-workflow/3.11.1 VSCode/1.52.1 Node.js/12.14.1 (darwin; x64)'
request.env['HTTP_USER_AGENT'] = agent
@@ -208,6 +255,16 @@ RSpec.describe GraphqlController do
subject
end
+
+ it 'calls the track gitlab cli when trackable method' do
+ agent = 'GLab - GitLab CLI'
+ request.env['HTTP_USER_AGENT'] = agent
+
+ expect(Gitlab::UsageDataCounters::GitLabCliActivityUniqueCounter)
+ .to receive(:track_api_request_when_trackable).with(user_agent: agent, user: user)
+
+ subject
+ end
end
context 'when user is not logged in' do
@@ -222,6 +279,12 @@ RSpec.describe GraphqlController do
expect(assigns(:context)[:is_sessionless_user]).to be false
end
+
+ it "does not assign a username in ApplicationContext" do
+ subject
+
+ expect(Gitlab::ApplicationContext.current.key?('meta.user')).to be false
+ end
end
it 'includes request object in context' do
diff --git a/spec/controllers/groups/group_links_controller_spec.rb b/spec/controllers/groups/group_links_controller_spec.rb
index fafe9715946..28febd786de 100644
--- a/spec/controllers/groups/group_links_controller_spec.rb
+++ b/spec/controllers/groups/group_links_controller_spec.rb
@@ -35,120 +35,6 @@ RSpec.describe Groups::GroupLinksController do
end
end
- describe '#create' do
- let(:shared_with_group_id) { shared_with_group.id }
- let(:shared_group_access) { GroupGroupLink.default_access }
-
- subject do
- post(:create,
- params: { group_id: shared_group,
- shared_with_group_id: shared_with_group_id,
- shared_group_access: shared_group_access })
- end
-
- shared_examples 'creates group group link' do
- it 'links group with selected group' do
- expect { subject }.to change { shared_with_group.shared_groups.include?(shared_group) }.from(false).to(true)
- end
-
- it 'redirects to group links page' do
- subject
-
- expect(response).to(redirect_to(group_group_members_path(shared_group)))
- end
-
- it 'allows access for group member' do
- expect { subject }.to(
- change { group_member.can?(:read_group, shared_group) }.from(false).to(true))
- end
- end
-
- context 'when user has correct access to both groups' do
- before do
- shared_with_group.add_developer(user)
- shared_group.add_owner(user)
- end
-
- context 'when default access level is requested' do
- include_examples 'creates group group link'
- end
-
- context 'when owner access is requested' do
- let(:shared_group_access) { Gitlab::Access::OWNER }
-
- before do
- shared_with_group.add_owner(group_member)
- end
-
- include_examples 'creates group group link'
-
- it 'allows admin access for group member' do
- expect { subject }.to(
- change { group_member.can?(:admin_group, shared_group) }.from(false).to(true))
- end
- end
-
- it 'updates project permissions', :sidekiq_inline do
- expect { subject }.to change { group_member.can?(:read_project, project) }.from(false).to(true)
- end
-
- context 'when shared with group id is not present' do
- let(:shared_with_group_id) { nil }
-
- it 'redirects to group links page' do
- subject
-
- expect(response).to(redirect_to(group_group_members_path(shared_group)))
- expect(flash[:alert]).to eq('Please select a group.')
- end
- end
-
- context 'when link is not persisted in the database' do
- before do
- allow(::Groups::GroupLinks::CreateService).to(
- receive_message_chain(:new, :execute)
- .and_return({ status: :error,
- http_status: 409,
- message: 'error' }))
- end
-
- it 'redirects to group links page' do
- subject
-
- expect(response).to(redirect_to(group_group_members_path(shared_group)))
- expect(flash[:alert]).to eq('error')
- end
- end
- end
-
- context 'when user does not have access to the group' do
- before do
- shared_group.add_owner(user)
- end
-
- it 'renders 404' do
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when user does not have admin access to the shared group' do
- before do
- shared_with_group.add_developer(user)
- shared_group.add_developer(user)
- end
-
- it 'renders 404' do
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- include_examples 'placeholder is passed as `id` parameter', :create
- end
-
describe '#update' do
let!(:link) do
create(:group_group_link, { shared_group: shared_group,
@@ -193,7 +79,8 @@ RSpec.describe Groups::GroupLinksController do
subject
- expect(json_response).to eq({ "expires_in" => "about 1 month", "expires_soon" => false })
+ expect(json_response).to eq({ "expires_in" => controller.helpers.time_ago_with_tooltip(expiry_date),
+ "expires_soon" => false })
end
end
diff --git a/spec/controllers/groups/runners_controller_spec.rb b/spec/controllers/groups/runners_controller_spec.rb
index b4950b93a3f..a53f09e2afc 100644
--- a/spec/controllers/groups/runners_controller_spec.rb
+++ b/spec/controllers/groups/runners_controller_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Groups::RunnersController do
sign_in(user)
end
- describe '#index' do
+ describe '#index', :snowplow do
context 'when user is owner' do
before do
group.add_owner(user)
@@ -30,6 +30,12 @@ RSpec.describe Groups::RunnersController do
expect(response).to render_template(:index)
expect(assigns(:group_runners_limited_count)).to be(2)
end
+
+ it 'tracks the event' do
+ get :index, params: { group_id: group }
+
+ expect_snowplow_event(category: described_class.name, action: 'index', user: user, namespace: group)
+ end
end
context 'when user is not owner' do
@@ -42,6 +48,12 @@ RSpec.describe Groups::RunnersController do
expect(response).to have_gitlab_http_status(:not_found)
end
+
+ it 'does not track the event' do
+ get :index, params: { group_id: group }
+
+ expect_no_snowplow_event
+ end
end
end
diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb
index a82c5681911..be30011905c 100644
--- a/spec/controllers/groups_controller_spec.rb
+++ b/spec/controllers/groups_controller_spec.rb
@@ -509,6 +509,14 @@ RSpec.describe GroupsController, factory_default: :keep do
expect(assigns(:issues)).to eq([issue_1])
end
end
+
+ it 'saves the sort order to user preferences' do
+ stub_feature_flags(vue_issues_list: true)
+
+ get :issues, params: { id: group.to_param, sort: 'priority' }
+
+ expect(user.reload.user_preference.issues_sort).to eq('priority')
+ end
end
describe 'GET #merge_requests', :sidekiq_might_not_need_inline do
@@ -1076,19 +1084,6 @@ RSpec.describe GroupsController, factory_default: :keep do
enable_admin_mode!(admin)
end
- context 'when the group export feature flag is not enabled' do
- before do
- sign_in(admin)
- stub_feature_flags(group_import_export: false)
- end
-
- it 'returns a not found error' do
- post :export, params: { id: group.to_param }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
context 'when the user does not have permission to export the group' do
before do
sign_in(guest)
@@ -1189,19 +1184,6 @@ RSpec.describe GroupsController, factory_default: :keep do
end
end
- context 'when the group export feature flag is not enabled' do
- before do
- sign_in(admin)
- stub_feature_flags(group_import_export: false)
- end
-
- it 'returns a not found error' do
- post :export, params: { id: group.to_param }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
context 'when the user does not have the required permissions' do
before do
sign_in(guest)
diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb
index 4e2123c8cc4..70dc710f604 100644
--- a/spec/controllers/help_controller_spec.rb
+++ b/spec/controllers/help_controller_spec.rb
@@ -142,11 +142,11 @@ RSpec.describe HelpController do
context 'for Markdown formats' do
subject { get :show, params: { path: path }, format: :md }
- let(:path) { 'ssh/index' }
+ let(:path) { 'user/ssh' }
context 'when requested file exists' do
before do
- expect_file_read(File.join(Rails.root, 'doc/ssh/index.md'), content: fixture_file('blockquote_fence_after.md'))
+ expect_file_read(File.join(Rails.root, 'doc/user/ssh.md'), content: fixture_file('blockquote_fence_after.md'))
subject
end
@@ -257,7 +257,7 @@ RSpec.describe HelpController do
it 'always renders not found' do
get :show,
params: {
- path: 'ssh/index'
+ path: 'user/ssh'
},
format: :foo
expect(response).to be_not_found
diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb
index 91e43adc472..6d24830af27 100644
--- a/spec/controllers/import/bitbucket_controller_spec.rb
+++ b/spec/controllers/import/bitbucket_controller_spec.rb
@@ -26,31 +26,55 @@ RSpec.describe Import::BitbucketController do
session[:oauth_request_token] = {}
end
- it "updates access token" do
- expires_at = Time.current + 1.day
- expires_in = 1.day
- access_token = double(token: token,
- secret: secret,
- expires_at: expires_at,
- expires_in: expires_in,
- refresh_token: refresh_token)
- allow_any_instance_of(OAuth2::Client)
- .to receive(:get_token)
- .with(hash_including(
- 'grant_type' => 'authorization_code',
- 'code' => code,
- redirect_uri: users_import_bitbucket_callback_url),
- {})
- .and_return(access_token)
- stub_omniauth_provider('bitbucket')
-
- get :callback, params: { code: code }
-
- expect(session[:bitbucket_token]).to eq(token)
- expect(session[:bitbucket_refresh_token]).to eq(refresh_token)
- expect(session[:bitbucket_expires_at]).to eq(expires_at)
- expect(session[:bitbucket_expires_in]).to eq(expires_in)
- expect(controller).to redirect_to(status_import_bitbucket_url)
+ context "when auth state param is invalid" do
+ let(:random_key) { "pure_random" }
+ let(:external_bitbucket_auth_url) { "http://fake.bitbucket.host/url" }
+
+ it "redirects to external auth url" do
+ allow(SecureRandom).to receive(:base64).and_return(random_key)
+ allow_next_instance_of(OAuth2::Client) do |client|
+ allow(client).to receive_message_chain(:auth_code, :authorize_url)
+ .with(redirect_uri: users_import_bitbucket_callback_url, state: random_key)
+ .and_return(external_bitbucket_auth_url)
+ end
+
+ get :callback, params: { code: code, state: "invalid-token" }
+
+ expect(controller).to redirect_to(external_bitbucket_auth_url)
+ end
+ end
+
+ context "when auth state param is valid" do
+ before do
+ session[:bitbucket_auth_state] = 'state'
+ end
+
+ it "updates access token" do
+ expires_at = Time.current + 1.day
+ expires_in = 1.day
+ access_token = double(token: token,
+ secret: secret,
+ expires_at: expires_at,
+ expires_in: expires_in,
+ refresh_token: refresh_token)
+ allow_any_instance_of(OAuth2::Client)
+ .to receive(:get_token)
+ .with(hash_including(
+ 'grant_type' => 'authorization_code',
+ 'code' => code,
+ redirect_uri: users_import_bitbucket_callback_url),
+ {})
+ .and_return(access_token)
+ stub_omniauth_provider('bitbucket')
+
+ get :callback, params: { code: code, state: 'state' }
+
+ expect(session[:bitbucket_token]).to eq(token)
+ expect(session[:bitbucket_refresh_token]).to eq(refresh_token)
+ expect(session[:bitbucket_expires_at]).to eq(expires_at)
+ expect(session[:bitbucket_expires_in]).to eq(expires_in)
+ expect(controller).to redirect_to(status_import_bitbucket_url)
+ end
end
end
@@ -59,46 +83,68 @@ RSpec.describe Import::BitbucketController do
@repo = double(name: 'vim', slug: 'vim', owner: 'asd', full_name: 'asd/vim', clone_url: 'http://test.host/demo/url.git', 'valid?' => true)
@invalid_repo = double(name: 'mercurialrepo', slug: 'mercurialrepo', owner: 'asd', full_name: 'asd/mercurialrepo', clone_url: 'http://test.host/demo/mercurialrepo.git', 'valid?' => false)
allow(controller).to receive(:provider_url).and_return('http://demobitbucket.org')
+ end
- assign_session_tokens
+ context "when token does not exists" do
+ let(:random_key) { "pure_random" }
+ let(:external_bitbucket_auth_url) { "http://fake.bitbucket.host/url" }
+
+ it 'redirects to authorize url with state included' do
+ allow(SecureRandom).to receive(:base64).and_return(random_key)
+ allow_next_instance_of(OAuth2::Client) do |client|
+ allow(client).to receive_message_chain(:auth_code, :authorize_url)
+ .with(redirect_uri: users_import_bitbucket_callback_url, state: random_key)
+ .and_return(external_bitbucket_auth_url)
+ end
+
+ get :status, format: :json
+
+ expect(controller).to redirect_to(external_bitbucket_auth_url)
+ end
end
- it_behaves_like 'import controller status' do
+ context "when token is valid" do
before do
- allow(controller).to receive(:provider_url).and_return('http://demobitbucket.org')
+ assign_session_tokens
end
- let(:repo) { @repo }
- let(:repo_id) { @repo.full_name }
- let(:import_source) { @repo.full_name }
- let(:provider_name) { 'bitbucket' }
- let(:client_repos_field) { :repos }
- end
+ it_behaves_like 'import controller status' do
+ before do
+ allow(controller).to receive(:provider_url).and_return('http://demobitbucket.org')
+ end
- it 'returns invalid repos' do
- allow_any_instance_of(Bitbucket::Client).to receive(:repos).and_return([@repo, @invalid_repo])
+ let(:repo) { @repo }
+ let(:repo_id) { @repo.full_name }
+ let(:import_source) { @repo.full_name }
+ let(:provider_name) { 'bitbucket' }
+ let(:client_repos_field) { :repos }
+ end
- get :status, format: :json
+ it 'returns invalid repos' do
+ allow_any_instance_of(Bitbucket::Client).to receive(:repos).and_return([@repo, @invalid_repo])
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['incompatible_repos'].length).to eq(1)
- expect(json_response.dig("incompatible_repos", 0, "id")).to eq(@invalid_repo.full_name)
- expect(json_response['provider_repos'].length).to eq(1)
- expect(json_response.dig("provider_repos", 0, "id")).to eq(@repo.full_name)
- end
+ get :status, format: :json
- context 'when filtering' do
- let(:filter) { '<html>test</html>' }
- let(:expected_filter) { 'test' }
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['incompatible_repos'].length).to eq(1)
+ expect(json_response.dig("incompatible_repos", 0, "id")).to eq(@invalid_repo.full_name)
+ expect(json_response['provider_repos'].length).to eq(1)
+ expect(json_response.dig("provider_repos", 0, "id")).to eq(@repo.full_name)
+ end
- subject { get :status, params: { filter: filter }, as: :json }
+ context 'when filtering' do
+ let(:filter) { '<html>test</html>' }
+ let(:expected_filter) { 'test' }
- it 'passes sanitized filter param to bitbucket client' do
- expect_next_instance_of(Bitbucket::Client) do |client|
- expect(client).to receive(:repos).with(filter: expected_filter).and_return([@repo])
- end
+ subject { get :status, params: { filter: filter }, as: :json }
- subject
+ it 'passes sanitized filter param to bitbucket client' do
+ expect_next_instance_of(Bitbucket::Client) do |client|
+ expect(client).to receive(:repos).with(filter: expected_filter).and_return([@repo])
+ end
+
+ subject
+ end
end
end
end
diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb
index fd380f9b763..ef66124bff1 100644
--- a/spec/controllers/import/github_controller_spec.rb
+++ b/spec/controllers/import/github_controller_spec.rb
@@ -82,11 +82,33 @@ RSpec.describe Import::GithubController do
expect(controller).to redirect_to(new_import_url)
expect(flash[:alert]).to eq('Access denied to your GitHub account.')
end
+
+ it "includes namespace_id from session if it is present" do
+ namespace_id = 1
+ session[:namespace_id] = 1
+
+ get :callback, params: { state: valid_auth_state }
+
+ expect(controller).to redirect_to(status_import_github_url(namespace_id: namespace_id))
+ end
end
end
describe "POST personal_access_token" do
it_behaves_like 'a GitHub-ish import controller: POST personal_access_token'
+
+ it 'passes namespace_id param as query param if it was present' do
+ namespace_id = 5
+ status_import_url = public_send("status_import_#{provider}_url", { namespace_id: namespace_id })
+
+ allow_next_instance_of(Gitlab::LegacyGithubImport::Client) do |client|
+ allow(client).to receive(:user).and_return(true)
+ end
+
+ post :personal_access_token, params: { personal_access_token: 'some-token', namespace_id: 5 }
+
+ expect(controller).to redirect_to(status_import_url)
+ end
end
describe "GET status" do
@@ -258,7 +280,9 @@ RSpec.describe Import::GithubController do
context 'when user input contains colons and spaces' do
before do
- allow(controller).to receive(:client_repos).and_return([])
+ allow_next_instance_of(Gitlab::GithubImport::Client) do |client|
+ allow(client).to receive(:search_repos_by_name).and_return(items: [])
+ end
end
it 'sanitizes user input' do
@@ -293,6 +317,22 @@ RSpec.describe Import::GithubController do
end
describe "GET realtime_changes" do
+ let(:user) { create(:user) }
+
it_behaves_like 'a GitHub-ish import controller: GET realtime_changes'
+
+ before do
+ assign_session_token(provider)
+ end
+
+ it 'includes stats in response' do
+ create(:project, import_type: provider, namespace: user.namespace, import_status: :finished, import_source: 'example/repo')
+
+ get :realtime_changes
+
+ expect(json_response[0]).to include('stats')
+ expect(json_response[0]['stats']).to include('fetched')
+ expect(json_response[0]['stats']).to include('imported')
+ end
end
end
diff --git a/spec/controllers/jira_connect/events_controller_spec.rb b/spec/controllers/jira_connect/events_controller_spec.rb
index 2129b24b2fb..5e90ceb0f9c 100644
--- a/spec/controllers/jira_connect/events_controller_spec.rb
+++ b/spec/controllers/jira_connect/events_controller_spec.rb
@@ -114,17 +114,6 @@ RSpec.describe JiraConnect::EventsController do
base_url: base_url
)
end
-
- context 'when the `jira_connect_installation_update` feature flag is disabled' do
- before do
- stub_feature_flags(jira_connect_installation_update: false)
- end
-
- it 'does not update the installation', :aggregate_failures do
- expect { subject }.not_to change { installation.reload.attributes }
- expect(response).to have_gitlab_http_status(:ok)
- end
- end
end
context 'when the new base_url is invalid' do
diff --git a/spec/controllers/jira_connect/subscriptions_controller_spec.rb b/spec/controllers/jira_connect/subscriptions_controller_spec.rb
index f548c1f399d..e9c94f09c99 100644
--- a/spec/controllers/jira_connect/subscriptions_controller_spec.rb
+++ b/spec/controllers/jira_connect/subscriptions_controller_spec.rb
@@ -75,6 +75,18 @@ RSpec.describe JiraConnect::SubscriptionsController do
expect(json_response).to include('login_path' => nil)
end
end
+
+ context 'with context qsh' do
+ # The JSON endpoint will be requested by frontend using a JWT that Atlassian provides via Javascript.
+ # This JWT will likely use a context-qsh because Atlassian don't know for which endpoint it will be used.
+ # Read more about context JWT here: https://developer.atlassian.com/cloud/jira/platform/understanding-jwt-for-connect-apps/
+
+ let(:qsh) { 'context-qsh' }
+
+ specify do
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
end
end
end
@@ -102,7 +114,7 @@ RSpec.describe JiraConnect::SubscriptionsController do
end
context 'with valid JWT' do
- let(:claims) { { iss: installation.client_key, sub: 1234 } }
+ let(:claims) { { iss: installation.client_key, sub: 1234, qsh: '123' } }
let(:jwt) { Atlassian::Jwt.encode(claims, installation.shared_secret) }
let(:jira_user) { { 'groups' => { 'items' => [{ 'name' => jira_group_name }] } } }
let(:jira_group_name) { 'site-admins' }
@@ -158,7 +170,7 @@ RSpec.describe JiraConnect::SubscriptionsController do
.stub_request(:get, "#{installation.base_url}/rest/api/3/user?accountId=1234&expand=groups")
.to_return(body: jira_user.to_json, status: 200, headers: { 'Content-Type' => 'application/json' })
- delete :destroy, params: { jwt: jwt, id: subscription.id }
+ delete :destroy, params: { jwt: jwt, id: subscription.id, format: :json }
end
context 'without JWT' do
@@ -170,7 +182,7 @@ RSpec.describe JiraConnect::SubscriptionsController do
end
context 'with valid JWT' do
- let(:claims) { { iss: installation.client_key, sub: 1234 } }
+ let(:claims) { { iss: installation.client_key, sub: 1234, qsh: '123' } }
let(:jwt) { Atlassian::Jwt.encode(claims, installation.shared_secret) }
it 'deletes the subscription' do
diff --git a/spec/controllers/oauth/jira/authorizations_controller_spec.rb b/spec/controllers/oauth/jira/authorizations_controller_spec.rb
deleted file mode 100644
index f4a335b30f4..00000000000
--- a/spec/controllers/oauth/jira/authorizations_controller_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Oauth::Jira::AuthorizationsController do
- describe 'GET new' do
- it 'redirects to OAuth authorization with correct params' do
- get :new, params: { client_id: 'client-123', scope: 'foo', redirect_uri: 'http://example.com/' }
-
- expect(response).to redirect_to(oauth_authorization_url(client_id: 'client-123',
- response_type: 'code',
- scope: 'foo',
- redirect_uri: oauth_jira_callback_url))
- end
-
- it 'replaces the GitHub "repo" scope with "api"' do
- get :new, params: { client_id: 'client-123', scope: 'repo', redirect_uri: 'http://example.com/' }
-
- expect(response).to redirect_to(oauth_authorization_url(client_id: 'client-123',
- response_type: 'code',
- scope: 'api',
- redirect_uri: oauth_jira_callback_url))
- end
- end
-
- describe 'GET callback' do
- it 'redirects to redirect_uri on session with code param' do
- session['redirect_uri'] = 'http://example.com'
-
- get :callback, params: { code: 'hash-123' }
-
- expect(response).to redirect_to('http://example.com?code=hash-123')
- end
-
- it 'redirects to redirect_uri on session with code param preserving existing query' do
- session['redirect_uri'] = 'http://example.com?foo=bar'
-
- get :callback, params: { code: 'hash-123' }
-
- expect(response).to redirect_to('http://example.com?foo=bar&code=hash-123')
- end
- end
-
- describe 'POST access_token' do
- it 'returns oauth params in a format Jira expects' do
- expect_any_instance_of(Doorkeeper::Request::AuthorizationCode).to receive(:authorize) do
- double(status: :ok, body: { 'access_token' => 'fake-123', 'scope' => 'foo', 'token_type' => 'bar' })
- end
-
- post :access_token, params: { code: 'code-123', client_id: 'client-123', client_secret: 'secret-123' }
-
- expect(response.body).to eq('access_token=fake-123&scope=foo&token_type=bar')
- end
- end
-end
diff --git a/spec/controllers/oauth/jira_dvcs/authorizations_controller_spec.rb b/spec/controllers/oauth/jira_dvcs/authorizations_controller_spec.rb
new file mode 100644
index 00000000000..496ef7859f9
--- /dev/null
+++ b/spec/controllers/oauth/jira_dvcs/authorizations_controller_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Oauth::JiraDvcs::AuthorizationsController do
+ describe 'GET new' do
+ it 'redirects to OAuth authorization with correct params' do
+ get :new, params: { client_id: 'client-123', scope: 'foo', redirect_uri: 'http://example.com/' }
+
+ expect(response).to redirect_to(oauth_authorization_url(client_id: 'client-123',
+ response_type: 'code',
+ scope: 'foo',
+ redirect_uri: oauth_jira_dvcs_callback_url))
+ end
+
+ it 'replaces the GitHub "repo" scope with "api"' do
+ get :new, params: { client_id: 'client-123', scope: 'repo', redirect_uri: 'http://example.com/' }
+
+ expect(response).to redirect_to(oauth_authorization_url(client_id: 'client-123',
+ response_type: 'code',
+ scope: 'api',
+ redirect_uri: oauth_jira_dvcs_callback_url))
+ end
+ end
+
+ describe 'GET callback' do
+ it 'redirects to redirect_uri on session with code param' do
+ session['redirect_uri'] = 'http://example.com'
+
+ get :callback, params: { code: 'hash-123' }
+
+ expect(response).to redirect_to('http://example.com?code=hash-123')
+ end
+
+ it 'redirects to redirect_uri on session with code param preserving existing query' do
+ session['redirect_uri'] = 'http://example.com?foo=bar'
+
+ get :callback, params: { code: 'hash-123' }
+
+ expect(response).to redirect_to('http://example.com?foo=bar&code=hash-123')
+ end
+ end
+
+ describe 'POST access_token' do
+ it 'returns oauth params in a format Jira expects' do
+ expect_any_instance_of(Doorkeeper::Request::AuthorizationCode).to receive(:authorize) do
+ double(status: :ok, body: { 'access_token' => 'fake-123', 'scope' => 'foo', 'token_type' => 'bar' })
+ end
+
+ post :access_token, params: { code: 'code-123', client_id: 'client-123', client_secret: 'secret-123' }
+
+ expect(response.body).to eq('access_token=fake-123&scope=foo&token_type=bar')
+ end
+ end
+end
diff --git a/spec/controllers/profiles/accounts_controller_spec.rb b/spec/controllers/profiles/accounts_controller_spec.rb
index 011528016ce..1b4b67eeaff 100644
--- a/spec/controllers/profiles/accounts_controller_spec.rb
+++ b/spec/controllers/profiles/accounts_controller_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe Profiles::AccountsController do
end
end
- [:twitter, :facebook, :google_oauth2, :gitlab, :github, :bitbucket, :crowd, :auth0, :authentiq, :dingtalk].each do |provider|
+ [:twitter, :facebook, :google_oauth2, :gitlab, :github, :bitbucket, :crowd, :auth0, :authentiq, :dingtalk, :alicloud].each do |provider|
describe "#{provider} provider" do
let(:user) { create(:omniauth_user, provider: provider.to_s) }
diff --git a/spec/controllers/profiles/keys_controller_spec.rb b/spec/controllers/profiles/keys_controller_spec.rb
index 66f6135df1e..63818337722 100644
--- a/spec/controllers/profiles/keys_controller_spec.rb
+++ b/spec/controllers/profiles/keys_controller_spec.rb
@@ -17,7 +17,25 @@ RSpec.describe Profiles::KeysController do
post :create, params: { key: build(:key, expires_at: expires_at).attributes }
end.to change { Key.count }.by(1)
- expect(Key.last.expires_at).to be_like_time(expires_at)
+ key = Key.last
+ expect(key.expires_at).to be_like_time(expires_at)
+ expect(key.fingerprint_md5).to be_present
+ expect(key.fingerprint_sha256).to be_present
+ end
+
+ context 'with FIPS mode', :fips_mode do
+ it 'creates a new key without MD5 fingerprint' do
+ expires_at = 3.days.from_now
+
+ expect do
+ post :create, params: { key: build(:rsa_key_4096, expires_at: expires_at).attributes }
+ end.to change { Key.count }.by(1)
+
+ key = Key.last
+ expect(key.expires_at).to be_like_time(expires_at)
+ expect(key.fingerprint_md5).to be_nil
+ expect(key.fingerprint_sha256).to be_present
+ end
end
end
end
diff --git a/spec/controllers/profiles/preferences_controller_spec.rb b/spec/controllers/profiles/preferences_controller_spec.rb
index b7870a63f9d..7add3a72337 100644
--- a/spec/controllers/profiles/preferences_controller_spec.rb
+++ b/spec/controllers/profiles/preferences_controller_spec.rb
@@ -46,6 +46,8 @@ RSpec.describe Profiles::PreferencesController do
it "changes the user's preferences" do
prefs = {
color_scheme_id: '1',
+ diffs_deletion_color: '#123456',
+ diffs_addition_color: '#abcdef',
dashboard: 'stars',
theme_id: '2',
first_day_of_week: '1',
@@ -84,5 +86,27 @@ RSpec.describe Profiles::PreferencesController do
expect(response.parsed_body['type']).to eq('alert')
end
end
+
+ context 'on invalid diffs colors setting' do
+ it 'responds with error for diffs_deletion_color' do
+ prefs = { diffs_deletion_color: '#1234567' }
+
+ go params: prefs
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(response.parsed_body['message']).to eq _('Failed to save preferences.')
+ expect(response.parsed_body['type']).to eq('alert')
+ end
+
+ it 'responds with error for diffs_addition_color' do
+ prefs = { diffs_addition_color: '#1234567' }
+
+ go params: prefs
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(response.parsed_body['message']).to eq _('Failed to save preferences.')
+ expect(response.parsed_body['type']).to eq('alert')
+ end
+ end
end
end
diff --git a/spec/controllers/profiles/two_factor_auths_controller_spec.rb b/spec/controllers/profiles/two_factor_auths_controller_spec.rb
index 47086ccdd2c..33cba675777 100644
--- a/spec/controllers/profiles/two_factor_auths_controller_spec.rb
+++ b/spec/controllers/profiles/two_factor_auths_controller_spec.rb
@@ -104,17 +104,29 @@ RSpec.describe Profiles::TwoFactorAuthsController do
expect(subject).to receive(:build_qr_code).and_return(code)
get :show
- expect(assigns[:qr_code]).to eq code
+ expect(assigns[:qr_code]).to eq(code)
end
- it 'generates a unique otp_secret every time the page is loaded' do
- expect(User).to receive(:generate_otp_secret).with(32).and_call_original.twice
+ it 'generates a single otp_secret with multiple page loads', :freeze_time do
+ expect(User).to receive(:generate_otp_secret).with(32).and_call_original.once
+
+ user.update!(otp_secret: nil, otp_secret_expires_at: nil)
2.times do
get :show
end
end
+ it 'generates a new otp_secret once the ttl has expired' do
+ expect(User).to receive(:generate_otp_secret).with(32).and_call_original.once
+
+ user.update!(otp_secret: "FT7KAVNU63YZH7PBRVPVL7CPSAENXY25", otp_secret_expires_at: 2.minutes.from_now)
+
+ travel_to(10.minutes.from_now) do
+ get :show
+ end
+ end
+
it_behaves_like 'user must first verify their primary email address' do
let(:go) { get :show }
end
@@ -183,7 +195,12 @@ RSpec.describe Profiles::TwoFactorAuthsController do
expect(subject).to receive(:build_qr_code).and_return(code)
go
- expect(assigns[:qr_code]).to eq code
+ expect(assigns[:qr_code]).to eq(code)
+ end
+
+ it 'assigns account_string' do
+ go
+ expect(assigns[:account_string]).to eq("#{Gitlab.config.gitlab.host}:#{user.email}")
end
it 'renders show' do
diff --git a/spec/controllers/projects/artifacts_controller_spec.rb b/spec/controllers/projects/artifacts_controller_spec.rb
index f410c16b30b..d51880b282d 100644
--- a/spec/controllers/projects/artifacts_controller_spec.rb
+++ b/spec/controllers/projects/artifacts_controller_spec.rb
@@ -323,6 +323,7 @@ RSpec.describe Projects::ArtifactsController do
subject
expect(response).to have_gitlab_http_status(:ok)
+ expect(response.headers['Gitlab-Workhorse-Detect-Content-Type']).to eq('true')
expect(send_data).to start_with('artifacts-entry:')
expect(params.keys).to eq(%w(Archive Entry))
@@ -338,7 +339,7 @@ RSpec.describe Projects::ArtifactsController do
def params
@params ||= begin
- base64_params = send_data.sub(/\Aartifacts\-entry:/, '')
+ base64_params = send_data.delete_prefix('artifacts-entry:')
Gitlab::Json.parse(Base64.urlsafe_decode64(base64_params))
end
end
diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb
index ea22e6b6f10..1580ad9361d 100644
--- a/spec/controllers/projects/branches_controller_spec.rb
+++ b/spec/controllers/projects/branches_controller_spec.rb
@@ -688,21 +688,23 @@ RSpec.describe Projects::BranchesController do
end
context 'when gitaly is not available' do
+ let(:request) { get :index, format: :html, params: { namespace_id: project.namespace, project_id: project } }
+
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)
+ it 'returns with a status 503' do
+ request
+
+ expect(response).to have_gitlab_http_status(:service_unavailable)
end
it 'sets gitaly_unavailable variable' do
+ request
+
expect(assigns[:gitaly_unavailable]).to be_truthy
end
end
diff --git a/spec/controllers/projects/commit_controller_spec.rb b/spec/controllers/projects/commit_controller_spec.rb
index 72fee40a6e9..a72c98552a5 100644
--- a/spec/controllers/projects/commit_controller_spec.rb
+++ b/spec/controllers/projects/commit_controller_spec.rb
@@ -60,6 +60,22 @@ RSpec.describe Projects::CommitController do
end
end
+ context 'with valid page' do
+ it 'responds with 200' do
+ go(id: commit.id, page: 1)
+
+ expect(response).to be_ok
+ end
+ end
+
+ context 'with invalid page' do
+ it 'does not return an error' do
+ go(id: commit.id, page: ['invalid'])
+
+ expect(response).to be_ok
+ end
+ end
+
it 'handles binary files' do
go(id: TestEnv::BRANCH_SHA['binary-encoding'], format: 'html')
@@ -212,6 +228,21 @@ RSpec.describe Projects::CommitController do
end
end
+ context 'when the revert commit is missing' do
+ it 'renders the 404 page' do
+ post(:revert,
+ params: {
+ namespace_id: project.namespace,
+ project_id: project,
+ start_branch: 'master',
+ id: '1234567890'
+ })
+
+ expect(response).not_to be_successful
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
context 'when the revert was successful' do
it 'redirects to the commits page' do
post(:revert,
@@ -269,6 +300,21 @@ RSpec.describe Projects::CommitController do
end
end
+ context 'when the cherry-pick commit is missing' do
+ it 'renders the 404 page' do
+ post(:cherry_pick,
+ params: {
+ namespace_id: project.namespace,
+ project_id: project,
+ start_branch: 'master',
+ id: '1234567890'
+ })
+
+ expect(response).not_to be_successful
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
context 'when the cherry-pick was successful' do
it 'redirects to the commits page' do
post(:cherry_pick,
diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb
index 62b93a2728b..9821618df8d 100644
--- a/spec/controllers/projects/compare_controller_spec.rb
+++ b/spec/controllers/projects/compare_controller_spec.rb
@@ -58,11 +58,13 @@ RSpec.describe Projects::CompareController do
from_project_id: from_project_id,
from: from_ref,
to: to_ref,
- w: whitespace
+ w: whitespace,
+ page: page
}
end
let(:whitespace) { nil }
+ let(:page) { nil }
context 'when the refs exist in the same project' do
context 'when we set the white space param' do
@@ -196,6 +198,34 @@ RSpec.describe Projects::CompareController do
expect(response).to have_gitlab_http_status(:found)
end
end
+
+ context 'when page is valid' do
+ let(:from_project_id) { nil }
+ let(:from_ref) { '08f22f25' }
+ let(:to_ref) { '66eceea0' }
+ let(:page) { 1 }
+
+ it 'shows the diff' do
+ show_request
+
+ expect(response).to be_successful
+ expect(assigns(:diffs).diff_files.first).to be_present
+ expect(assigns(:commits).length).to be >= 1
+ end
+ end
+
+ context 'when page is not valid' do
+ let(:from_project_id) { nil }
+ let(:from_ref) { '08f22f25' }
+ let(:to_ref) { '66eceea0' }
+ let(:page) { ['invalid'] }
+
+ it 'does not return an error' do
+ show_request
+
+ expect(response).to be_successful
+ end
+ end
end
describe 'GET diff_for_path' do
diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb
index fdfc21887a6..f4cad5790a3 100644
--- a/spec/controllers/projects/environments_controller_spec.rb
+++ b/spec/controllers/projects/environments_controller_spec.rb
@@ -254,38 +254,54 @@ RSpec.describe Projects::EnvironmentsController do
end
describe 'PATCH #stop' do
+ subject { patch :stop, params: environment_params(format: :json) }
+
context 'when env not available' do
it 'returns 404' do
allow_any_instance_of(Environment).to receive(:available?) { false }
- patch :stop, params: environment_params(format: :json)
+ subject
expect(response).to have_gitlab_http_status(:not_found)
end
end
context 'when stop action' do
- it 'returns action url' do
+ it 'returns action url for single stop action' do
action = create(:ci_build, :manual)
allow_any_instance_of(Environment)
- .to receive_messages(available?: true, stop_with_action!: action)
+ .to receive_messages(available?: true, stop_with_actions!: [action])
- patch :stop, params: environment_params(format: :json)
+ subject
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq(
{ 'redirect_url' =>
project_job_url(project, action) })
end
+
+ it 'returns environment url for multiple stop actions' do
+ actions = create_list(:ci_build, 2, :manual)
+
+ allow_any_instance_of(Environment)
+ .to receive_messages(available?: true, stop_with_actions!: actions)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to eq(
+ { 'redirect_url' =>
+ project_environment_url(project, environment) })
+ end
end
context 'when no stop action' do
it 'returns env url' do
allow_any_instance_of(Environment)
- .to receive_messages(available?: true, stop_with_action!: nil)
+ .to receive_messages(available?: true, stop_with_actions!: nil)
- patch :stop, params: environment_params(format: :json)
+ subject
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq(
diff --git a/spec/controllers/projects/group_links_controller_spec.rb b/spec/controllers/projects/group_links_controller_spec.rb
index ea15d483c90..96705d82ac5 100644
--- a/spec/controllers/projects/group_links_controller_spec.rb
+++ b/spec/controllers/projects/group_links_controller_spec.rb
@@ -18,136 +18,6 @@ RSpec.describe Projects::GroupLinksController do
travel_back
end
- describe '#create' do
- shared_context 'link project to group' do
- before do
- post(:create, params: {
- namespace_id: project.namespace,
- project_id: project,
- link_group_id: group.id,
- link_group_access: ProjectGroupLink.default_access
- })
- end
- end
-
- context 'when project is not allowed to be shared with a group' do
- before do
- group.update!(share_with_group_lock: false)
- end
-
- include_context 'link project to group'
-
- it 'responds with status 404' do
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when user has access to group they want to link project to' do
- before do
- group.add_developer(user)
- end
-
- include_context 'link project to group'
-
- it 'links project with selected group' do
- expect(group.shared_projects).to include project
- end
-
- it 'redirects to project group links page' do
- expect(response).to redirect_to(
- project_project_members_path(project)
- )
- end
- end
-
- context 'when user doers not have access to group they want to link to' do
- include_context 'link project to group'
-
- it 'renders 404' do
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- it 'does not share project with that group' do
- expect(group.shared_projects).not_to include project
- end
- end
-
- context 'when user does not have access to the public group' do
- let(:group) { create(:group, :public) }
-
- include_context 'link project to group'
-
- it 'renders 404' do
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- it 'does not share project with that group' do
- expect(group.shared_projects).not_to include project
- end
- end
-
- context 'when project group id equal link group id' do
- before do
- group2.add_developer(user)
-
- post(:create, params: {
- namespace_id: project.namespace,
- project_id: project,
- link_group_id: group2.id,
- link_group_access: ProjectGroupLink.default_access
- })
- end
-
- it 'does not share project with selected group' do
- expect(group2.shared_projects).not_to include project
- end
-
- it 'redirects to project group links page' do
- expect(response).to redirect_to(
- project_project_members_path(project)
- )
- end
- end
-
- context 'when link group id is not present' do
- before do
- post(:create, params: {
- namespace_id: project.namespace,
- project_id: project,
- link_group_access: ProjectGroupLink.default_access
- })
- end
-
- it 'redirects to project group links page' do
- expect(response).to redirect_to(
- project_project_members_path(project)
- )
- expect(flash[:alert]).to eq('Please select a group.')
- end
- end
-
- context 'when link is not persisted in the database' do
- before do
- allow(::Projects::GroupLinks::CreateService).to receive_message_chain(:new, :execute)
- .and_return({ status: :error, http_status: 409, message: 'error' })
-
- post(:create, params: {
- namespace_id: project.namespace,
- project_id: project,
- link_group_id: group.id,
- link_group_access: ProjectGroupLink.default_access
- })
- end
-
- it 'redirects to project group links page' do
- expect(response).to redirect_to(
- project_project_members_path(project)
- )
- expect(flash[:alert]).to eq('error')
- end
- end
- end
-
describe '#update' do
let_it_be(:link) do
create(
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 9d3711d8a96..ce0af784cdf 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -148,6 +148,13 @@ RSpec.describe Projects::IssuesController do
allow(Kaminari.config).to receive(:default_per_page).and_return(1)
end
+ it 'redirects to last page when out of bounds on non-html requests' do
+ get :index, params: params.merge(page: last_page + 1), format: 'atom'
+
+ expect(response).to have_gitlab_http_status(:redirect)
+ expect(response).to redirect_to(action: 'index', format: 'atom', page: last_page, state: 'opened')
+ end
+
it 'does not use pagination if disabled' do
allow(controller).to receive(:pagination_disabled?).and_return(true)
diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb
index ed68d6a87b8..e9f1232b5e7 100644
--- a/spec/controllers/projects/jobs_controller_spec.rb
+++ b/spec/controllers/projects/jobs_controller_spec.rb
@@ -796,7 +796,7 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do
retried_build = Ci::Build.last
- Ci::RetryBuildService.clone_accessors.each do |accessor|
+ Ci::Build.clone_accessors.each do |accessor|
expect(job.read_attribute(accessor))
.to eq(retried_build.read_attribute(accessor)),
"Mismatched attribute on \"#{accessor}\". " \
diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb
index 2df31904380..07874c8a8af 100644
--- a/spec/controllers/projects/notes_controller_spec.rb
+++ b/spec/controllers/projects/notes_controller_spec.rb
@@ -423,7 +423,21 @@ RSpec.describe Projects::NotesController do
end
context 'when creating a confidential note' do
- let(:extra_request_params) { { format: :json } }
+ let(:project) { create(:project) }
+ let(:note_params) do
+ { note: note_text, noteable_id: issue.id, noteable_type: 'Issue' }.merge(extra_note_params)
+ end
+
+ let(:request_params) do
+ {
+ note: note_params,
+ namespace_id: project.namespace,
+ project_id: project,
+ target_type: 'issue',
+ target_id: issue.id,
+ format: :json
+ }
+ end
context 'when `confidential` parameter is not provided' do
it 'sets `confidential` to `false` in JSON response' do
diff --git a/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb b/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb
index a655c742973..fc741d0f3f6 100644
--- a/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb
+++ b/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb
@@ -41,17 +41,5 @@ RSpec.describe Projects::Packages::InfrastructureRegistryController do
it_behaves_like 'returning response status', :not_found
end
-
- context 'with package file pending destruction' do
- let_it_be(:package_file_pending_destruction) { create(:package_file, :pending_destruction, package: terraform_module) }
-
- let(:terraform_module_package_file) { terraform_module.package_files.first }
-
- it 'does not return them' do
- subject
-
- expect(assigns(:package_files)).to contain_exactly(terraform_module_package_file)
- end
- end
end
end
diff --git a/spec/controllers/projects/pipelines/tests_controller_spec.rb b/spec/controllers/projects/pipelines/tests_controller_spec.rb
index e6ff3a487ac..113781bab7c 100644
--- a/spec/controllers/projects/pipelines/tests_controller_spec.rb
+++ b/spec/controllers/projects/pipelines/tests_controller_spec.rb
@@ -40,28 +40,56 @@ RSpec.describe Projects::Pipelines::TestsController do
let(:suite_name) { 'test' }
let(:build_ids) { pipeline.latest_builds.pluck(:id) }
- before do
- build = main_pipeline.builds.last
- build.update_column(:finished_at, 1.day.ago) # Just to be sure we are included in the report window
-
- # The JUnit fixture for the given build has 3 failures.
- # This service will create 1 test case failure record for each.
- Ci::TestFailureHistoryService.new(main_pipeline).execute
+ context 'when artifacts are expired' do
+ before do
+ pipeline.job_artifacts.first.update!(expire_at: Date.yesterday)
+ end
+
+ it 'renders not_found errors', :aggregate_failures do
+ get_tests_show_json(build_ids)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['errors']).to eq('Test report artifacts have expired')
+ end
+
+ context 'when ci_test_report_artifacts_expired is disabled' do
+ before do
+ stub_feature_flags(ci_test_report_artifacts_expired: false)
+ end
+ it 'renders test suite', :aggregate_failures do
+ get_tests_show_json(build_ids)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['name']).to eq('test')
+ end
+ end
end
- it 'renders test suite data' do
- get_tests_show_json(build_ids)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['name']).to eq('test')
-
- # Each test failure in this pipeline has a matching failure in the default branch
- recent_failures = json_response['test_cases'].map { |tc| tc['recent_failures'] }
- expect(recent_failures).to eq([
- { 'count' => 1, 'base_branch' => 'master' },
- { 'count' => 1, 'base_branch' => 'master' },
- { 'count' => 1, 'base_branch' => 'master' }
- ])
+ context 'when artifacts are not expired' do
+ before do
+ build = main_pipeline.builds.last
+ build.update_column(:finished_at, 1.day.ago) # Just to be sure we are included in the report window
+
+ # The JUnit fixture for the given build has 3 failures.
+ # This service will create 1 test case failure record for each.
+ Ci::TestFailureHistoryService.new(main_pipeline).execute
+ end
+
+ it 'renders test suite data', :aggregate_failures do
+ get_tests_show_json(build_ids)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['name']).to eq('test')
+ expect(json_response['artifacts_expired']).to be_falsey
+
+ # Each test failure in this pipeline has a matching failure in the default branch
+ recent_failures = json_response['test_cases'].map { |tc| tc['recent_failures'] }
+ expect(recent_failures).to eq([
+ { 'count' => 1, 'base_branch' => 'master' },
+ { 'count' => 1, 'base_branch' => 'master' },
+ { 'count' => 1, 'base_branch' => 'master' }
+ ])
+ end
end
end
diff --git a/spec/controllers/projects/services_controller_spec.rb b/spec/controllers/projects/services_controller_spec.rb
index 35e5422d072..7e96c59fbb1 100644
--- a/spec/controllers/projects/services_controller_spec.rb
+++ b/spec/controllers/projects/services_controller_spec.rb
@@ -359,10 +359,9 @@ RSpec.describe Projects::ServicesController do
def prometheus_integration_as_data
pi = project.prometheus_integration.reload
attrs = pi.attributes.except('encrypted_properties',
- 'encrypted_properties_iv',
- 'encrypted_properties_tmp')
+ 'encrypted_properties_iv')
- [attrs, pi.encrypted_properties_tmp]
+ [attrs, pi.properties]
end
end
diff --git a/spec/controllers/projects/static_site_editor_controller_spec.rb b/spec/controllers/projects/static_site_editor_controller_spec.rb
index 26161b5fb5c..e1f25589eeb 100644
--- a/spec/controllers/projects/static_site_editor_controller_spec.rb
+++ b/spec/controllers/projects/static_site_editor_controller_spec.rb
@@ -76,12 +76,11 @@ RSpec.describe Projects::StaticSiteEditorController do
get :show, params: default_params
end
- it 'increases the views counter' do
- expect(Gitlab::UsageDataCounters::StaticSiteEditorCounter).to have_received(:increment_views_count)
- end
+ it 'redirects to the Web IDE' do
+ get :show, params: default_params
- it 'renders the edit page' do
- expect(response).to render_template(:show)
+ expected_path_regex = %r[-/ide/project/#{project.full_path}/edit/master/-/README.md]
+ expect(response).to redirect_to(expected_path_regex)
end
it 'assigns ref and path variables' do
@@ -96,62 +95,6 @@ RSpec.describe Projects::StaticSiteEditorController do
expect(response).to have_gitlab_http_status(:not_found)
end
end
-
- context 'when invalid config file' do
- let(:service_response) { ServiceResponse.error(message: 'invalid') }
-
- it 'redirects to project page and flashes error message' do
- expect(response).to redirect_to(project_path(project))
- expect(controller).to set_flash[:alert].to('invalid')
- end
- end
-
- context 'with a service response payload containing multiple data types' do
- let(:data) do
- {
- a_string: 'string',
- an_array: [
- {
- foo: 'bar'
- }
- ],
- an_integer: 123,
- a_hash: {
- a_deeper_hash: {
- foo: 'bar'
- }
- },
- a_boolean: true,
- a_nil: nil
- }
- end
-
- let(:assigns_data) { assigns(:data) }
-
- it 'leaves data values which are strings as strings' do
- expect(assigns_data[:a_string]).to eq('string')
- end
-
- it 'leaves data values which are integers as integers' do
- expect(assigns_data[:an_integer]).to eq(123)
- end
-
- it 'serializes data values which are booleans to JSON' do
- expect(assigns_data[:a_boolean]).to eq('true')
- end
-
- it 'serializes data values which are arrays to JSON' do
- expect(assigns_data[:an_array]).to eq('[{"foo":"bar"}]')
- end
-
- it 'serializes data values which are hashes to JSON' do
- expect(assigns_data[:a_hash]).to eq('{"a_deeper_hash":{"foo":"bar"}}')
- end
-
- it 'serializes data values which are nil to an empty string' do
- expect(assigns_data[:a_nil]).to eq('')
- end
- end
end
end
end
diff --git a/spec/controllers/projects/todos_controller_spec.rb b/spec/controllers/projects/todos_controller_spec.rb
index 9a73417ffdb..d87f4258b9c 100644
--- a/spec/controllers/projects/todos_controller_spec.rb
+++ b/spec/controllers/projects/todos_controller_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Projects::TodosController do
let(:issue) { create(:issue, project: project) }
let(:merge_request) { create(:merge_request, source_project: project) }
- let(:design) { create(:design, project: project, issue: issue) }
+ let(:design) { create(:design, :with_versions, project: project, issue: issue) }
let(:parent) { project }
shared_examples 'issuable todo actions' do
diff --git a/spec/controllers/projects/usage_quotas_controller_spec.rb b/spec/controllers/projects/usage_quotas_controller_spec.rb
index 6125ba13f96..2831de00348 100644
--- a/spec/controllers/projects/usage_quotas_controller_spec.rb
+++ b/spec/controllers/projects/usage_quotas_controller_spec.rb
@@ -4,17 +4,44 @@ require 'spec_helper'
RSpec.describe Projects::UsageQuotasController do
let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, namespace: user.namespace) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
describe 'GET #index' do
render_views
- it 'does not render search settings partial' do
+ subject { get(:index, params: { namespace_id: project.namespace, project_id: project }) }
+
+ before do
sign_in(user)
- get(:index, params: { namespace_id: user.namespace, project_id: project })
+ end
+
+ context 'when user does not have read_usage_quotas permission' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'renders not_found' do
+ subject
+
+ expect(response).to render_template('errors/not_found')
+ expect(response).not_to render_template('shared/search_settings')
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when user has read_usage_quotas permission' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'renders index with 200 status code' do
+ subject
- expect(response).to render_template('index')
- expect(response).not_to render_template('shared/search_settings')
+ expect(response).to render_template('index')
+ expect(response).not_to render_template('shared/search_settings')
+ expect(response).to have_gitlab_http_status(:ok)
+ end
end
end
end
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index c098ea71f7a..07bd198137a 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -473,28 +473,6 @@ RSpec.describe ProjectsController do
end
end
end
-
- 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 '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)
-
- post :create, params: { project: params }
- end
- end
end
describe 'GET edit' do
@@ -1159,16 +1137,15 @@ RSpec.describe ProjectsController do
context 'when gitaly is unavailable' do
before do
expect_next_instance_of(TagsFinder) do |finder|
- allow(finder).to receive(:execute).and_raise(Gitlab::Git::CommandError)
+ allow(finder).to receive(:execute).and_raise(Gitlab::Git::CommandError, 'something went wrong')
end
end
- it 'gets an empty list of tags' do
+ it 'responds with 503 error' do
get :refs, params: { namespace_id: project.namespace, id: project, ref: "123456" }
- expect(json_response["Branches"]).to include("master")
- expect(json_response["Tags"]).to eq([])
- expect(json_response["Commits"]).to include("123456")
+ expect(response).to have_gitlab_http_status(:service_unavailable)
+ expect(json_response['error']).to eq 'Unable to load refs'
end
end
@@ -1466,14 +1443,15 @@ RSpec.describe ProjectsController do
end
describe '#download_export', :clean_gitlab_redis_rate_limiting do
+ let(:project) { create(:project, :with_export, service_desk_enabled: false) }
let(:action) { :download_export }
context 'object storage enabled' do
context 'when project export is enabled' do
- it 'returns 302' do
+ it 'returns 200' do
get action, params: { namespace_id: project.namespace, id: project }
- expect(response).to have_gitlab_http_status(:found)
+ expect(response).to have_gitlab_http_status(:ok)
end
end
@@ -1513,14 +1491,37 @@ RSpec.describe ProjectsController do
expect(response.body).to eq('This endpoint has been requested too many times. Try again later.')
expect(response).to have_gitlab_http_status(:too_many_requests)
end
+ end
+
+ context 'applies correct scope when throttling', :clean_gitlab_redis_rate_limiting do
+ before do
+ stub_application_setting(project_download_export_limit: 1)
+ end
- it 'applies correct scope when throttling' do
+ it 'applies throttle per namespace' do
expect(Gitlab::ApplicationRateLimiter)
.to receive(:throttled?)
- .with(:project_download_export, scope: [user, project])
+ .with(:project_download_export, scope: [user, project.namespace])
post action, params: { namespace_id: project.namespace, id: project }
end
+
+ it 'throttles downloads within same namespaces' do
+ # simulate prior request to the same namespace, which increments the rate limit counter for that scope
+ Gitlab::ApplicationRateLimiter.throttled?(:project_download_export, scope: [user, project.namespace])
+
+ get action, params: { namespace_id: project.namespace, id: project }
+ expect(response).to have_gitlab_http_status(:too_many_requests)
+ end
+
+ it 'allows downloads from different namespaces' do
+ # simulate prior request to a different namespace, which increments the rate limit counter for that scope
+ Gitlab::ApplicationRateLimiter.throttled?(:project_download_export,
+ scope: [user, create(:project, :with_export).namespace])
+
+ get action, params: { namespace_id: project.namespace, id: project }
+ expect(response).to have_gitlab_http_status(:ok)
+ end
end
end
end
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb
index 9482448fc03..4abcd414e51 100644
--- a/spec/controllers/search_controller_spec.rb
+++ b/spec/controllers/search_controller_spec.rb
@@ -211,6 +211,7 @@ RSpec.describe SearchController do
:global_search_merge_requests_tab | 'merge_requests'
:global_search_wiki_tab | 'wiki_blobs'
:global_search_commits_tab | 'commits'
+ :global_search_users_tab | 'users'
end
with_them do
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
index 03d053e6f97..877ca7cd6c6 100644
--- a/spec/controllers/sessions_controller_spec.rb
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -193,6 +193,10 @@ RSpec.describe SessionsController do
end
context 'with reCAPTCHA' do
+ before do
+ stub_feature_flags(arkose_labs_login_challenge: false)
+ end
+
def unsuccesful_login(user_params, sesion_params: {})
# Without this, `verify_recaptcha` arbitrarily returns true in test env
Recaptcha.configuration.skip_verify_env.delete('test')
@@ -234,7 +238,7 @@ RSpec.describe SessionsController do
unsuccesful_login(user_params)
- expect(response).to render_template(:new)
+ expect(response).to redirect_to new_user_session_path
expect(flash[:alert]).to include _('There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.')
expect(subject.current_user).to be_nil
end
@@ -258,7 +262,7 @@ RSpec.describe SessionsController do
it 'displays an error when the reCAPTCHA is not solved' do
unsuccesful_login(user_params, sesion_params: { failed_login_attempts: 6 })
- expect(response).to render_template(:new)
+ expect(response).to redirect_to new_user_session_path
expect(flash[:alert]).to include _('There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.')
expect(subject.current_user).to be_nil
end
@@ -278,7 +282,7 @@ RSpec.describe SessionsController do
it 'displays an error when the reCAPTCHA is not solved' do
unsuccesful_login(user_params)
- expect(response).to render_template(:new)
+ expect(response).to redirect_to new_user_session_path
expect(flash[:alert]).to include _('There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.')
expect(subject.current_user).to be_nil
end
diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb
index 8442c214cd3..ffcd759435c 100644
--- a/spec/controllers/uploads_controller_spec.rb
+++ b/spec/controllers/uploads_controller_spec.rb
@@ -701,6 +701,24 @@ RSpec.describe UploadsController do
end
end
end
+
+ context 'when viewing alert metric images' do
+ let!(:user) { create(:user) }
+ let!(:project) { create(:project) }
+ let(:alert) { create(:alert_management_alert, project: project) }
+ let(:metric_image) { create(:alert_metric_image, alert: alert) }
+
+ before do
+ project.add_developer(user)
+ sign_in(user)
+ end
+
+ it "responds with status 200" do
+ get :show, params: { model: "alert_management_metric_image", mounted_as: 'file', id: metric_image.id, filename: metric_image.filename }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
end
def post_authorize(verified: true)
diff --git a/spec/db/migration_spec.rb b/spec/db/migration_spec.rb
new file mode 100644
index 00000000000..ac649925751
--- /dev/null
+++ b/spec/db/migration_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Migrations Validation' do
+ using RSpec::Parameterized::TableSyntax
+
+ # The range describes the timestamps that given migration helper can be used
+ let(:all_migration_classes) do
+ {
+ 2022_01_26_21_06_58.. => Gitlab::Database::Migration[2.0],
+ 2021_09_01_15_33_24.. => Gitlab::Database::Migration[1.0],
+ 2021_05_31_05_39_16..2021_09_01_15_33_24 => ActiveRecord::Migration[6.1],
+ ..2021_05_31_05_39_16 => ActiveRecord::Migration[6.0]
+ }
+ end
+
+ where(:migration) do
+ Gitlab::Database.database_base_models.flat_map do |_, model|
+ model.connection.migration_context.migrations
+ end.uniq
+ end
+
+ with_them do
+ let(:migration_instance) { migration.send(:migration) }
+ let(:allowed_migration_classes) { all_migration_classes.select { |r, _| r.include?(migration.version) }.values }
+
+ it 'uses one of the allowed migration classes' do
+ expect(allowed_migration_classes).to include(be > migration_instance.class)
+ end
+ end
+end
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 177a565bbc0..04f73050ea5 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -10,6 +10,10 @@ RSpec.describe 'Database schema' do
let(:tables) { connection.tables }
let(:columns_name_with_jsonb) { retrieve_columns_name_with_jsonb }
+ IGNORED_INDEXES_ON_FKS = {
+ issues: %w[work_item_type_id]
+ }.with_indifferent_access.freeze
+
# List of columns historically missing a FK, don't add more columns
# See: https://docs.gitlab.com/ee/development/foreign_keys.html#naming-foreign-keys
IGNORED_FK_COLUMNS = {
@@ -18,7 +22,7 @@ RSpec.describe 'Database schema' do
approvals: %w[user_id],
approver_groups: %w[target_id],
approvers: %w[target_id user_id],
- analytics_cycle_analytics_aggregations: %w[last_full_run_issues_id last_full_run_merge_requests_id last_incremental_issues_id last_incremental_merge_requests_id],
+ analytics_cycle_analytics_aggregations: %w[last_full_issues_id last_full_merge_requests_id last_incremental_issues_id last_full_run_issues_id last_full_run_merge_requests_id last_incremental_merge_requests_id],
analytics_cycle_analytics_merge_request_stage_events: %w[author_id group_id merge_request_id milestone_id project_id stage_event_hash_id state_id],
analytics_cycle_analytics_issue_stage_events: %w[author_id group_id issue_id milestone_id project_id stage_event_hash_id state_id],
audit_events: %w[author_id entity_id target_id],
@@ -115,6 +119,7 @@ RSpec.describe 'Database schema' do
columns.first.chomp
end
foreign_keys_columns = all_foreign_keys.map(&:column)
+ required_indexed_columns = foreign_keys_columns - ignored_index_columns(table)
# Add the primary key column to the list of indexed columns because
# postgres and mysql both automatically create an index on the primary
@@ -122,7 +127,7 @@ RSpec.describe 'Database schema' do
# automatically generated indexes (like the primary key index).
first_indexed_column.push(primary_key_column)
- expect(first_indexed_column.uniq).to include(*foreign_keys_columns)
+ expect(first_indexed_column.uniq).to include(*required_indexed_columns)
end
end
@@ -175,18 +180,16 @@ RSpec.describe 'Database schema' do
'PrometheusAlert' => %w[operator]
}.freeze
- context 'for enums' do
- ApplicationRecord.descendants.each do |model|
- # skip model if it is an abstract class as it would not have an associated DB table
- next if model.abstract_class?
+ context 'for enums', :eager_load do
+ # skip model if it is an abstract class as it would not have an associated DB table
+ let(:models) { ApplicationRecord.descendants.reject(&:abstract_class?) }
- describe model do
- let(:ignored_enums) { ignored_limit_enums(model.name) }
- let(:enums) { model.defined_enums.keys - ignored_enums }
+ it 'uses smallint for enums in all models', :aggregate_failures do
+ models.each do |model|
+ ignored_enums = ignored_limit_enums(model.name)
+ enums = model.defined_enums.keys - ignored_enums
- it 'uses smallint for enums' do
- expect(model).to use_smallint_for_enums(enums)
- end
+ expect(model).to use_smallint_for_enums(enums)
end
end
end
@@ -305,8 +308,12 @@ RSpec.describe 'Database schema' do
@models_by_table_name ||= ApplicationRecord.descendants.reject(&:abstract_class).group_by(&:table_name)
end
- def ignored_fk_columns(column)
- IGNORED_FK_COLUMNS.fetch(column, [])
+ def ignored_fk_columns(table)
+ IGNORED_FK_COLUMNS.fetch(table, [])
+ end
+
+ def ignored_index_columns(table)
+ IGNORED_INDEXES_ON_FKS.fetch(table, [])
end
def ignored_limit_enums(model)
diff --git a/spec/deprecation_toolkit_env.rb b/spec/deprecation_toolkit_env.rb
index 5e7ff34463c..fa4fdf805ec 100644
--- a/spec/deprecation_toolkit_env.rb
+++ b/spec/deprecation_toolkit_env.rb
@@ -56,11 +56,8 @@ module DeprecationToolkitEnv
# In this case, we recommend to add a silence together with an issue to patch or update
# the dependency causing the problem.
# See https://gitlab.com/gitlab-org/gitlab/-/commit/aea37f506bbe036378998916d374966c031bf347#note_647515736
- #
- # - ruby/lib/grpc/generic/interceptors.rb: https://gitlab.com/gitlab-org/gitlab/-/issues/339305
def self.allowed_kwarg_warning_paths
%w[
- ruby/lib/grpc/generic/interceptors.rb
]
end
diff --git a/spec/events/ci/pipeline_created_event_spec.rb b/spec/events/ci/pipeline_created_event_spec.rb
new file mode 100644
index 00000000000..191c2e450dc
--- /dev/null
+++ b/spec/events/ci/pipeline_created_event_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::PipelineCreatedEvent do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:data, :valid) do
+ { pipeline_id: 1 } | true
+ { pipeline_id: nil } | false
+ { pipeline_id: "test" } | false
+ {} | false
+ { job_id: 1 } | false
+ end
+
+ with_them do
+ let(:event) { described_class.new(data: data) }
+
+ it 'validates the data according to the schema' do
+ if valid
+ expect { event }.not_to raise_error
+ else
+ expect { event }.to raise_error(Gitlab::EventStore::InvalidEvent)
+ end
+ end
+ end
+end
diff --git a/spec/experiments/ios_specific_templates_experiment_spec.rb b/spec/experiments/ios_specific_templates_experiment_spec.rb
new file mode 100644
index 00000000000..4d02381dbde
--- /dev/null
+++ b/spec/experiments/ios_specific_templates_experiment_spec.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IosSpecificTemplatesExperiment do
+ subject do
+ described_class.new(actor: user, project: project) do |e|
+ e.candidate { true }
+ end.run
+ end
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :auto_devops_disabled) }
+
+ let!(:project_setting) { create(:project_setting, project: project, target_platforms: target_platforms) }
+ let(:target_platforms) { %w(ios) }
+
+ before do
+ stub_experiments(ios_specific_templates: :candidate)
+ project.add_developer(user) if user
+ end
+
+ it { is_expected.to be true }
+
+ describe 'skipping the experiment' do
+ context 'no actor' do
+ let_it_be(:user) { nil }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'actor cannot create pipelines' do
+ before do
+ project.add_guest(user)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'targeting a non iOS platform' do
+ let(:target_platforms) { [] }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'project has a ci.yaml file' do
+ before do
+ allow(project).to receive(:has_ci?).and_return(true)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'project has pipelines' do
+ before do
+ create(:ci_pipeline, project: project)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+end
diff --git a/spec/experiments/new_project_sast_enabled_experiment_spec.rb b/spec/experiments/new_project_sast_enabled_experiment_spec.rb
deleted file mode 100644
index 041e5dfa469..00000000000
--- a/spec/experiments/new_project_sast_enabled_experiment_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe NewProjectSastEnabledExperiment do
- it "defines the expected behaviors and variants" do
- expect(subject.variant_names).to match_array([
- :candidate,
- :free_indicator,
- :unchecked_candidate,
- :unchecked_free_indicator
- ])
- end
-
- it "publishes to the database" do
- expect(subject).to receive(:publish_to_database)
-
- subject.publish
- end
-end
diff --git a/spec/experiments/video_tutorials_continuous_onboarding_experiment_spec.rb b/spec/experiments/video_tutorials_continuous_onboarding_experiment_spec.rb
new file mode 100644
index 00000000000..596791308a4
--- /dev/null
+++ b/spec/experiments/video_tutorials_continuous_onboarding_experiment_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe VideoTutorialsContinuousOnboardingExperiment do
+ it "defines a control and candidate" do
+ expect(subject.behaviors.keys).to match_array(%w[control candidate])
+ end
+end
diff --git a/spec/factories/alert_management/metric_images.rb b/spec/factories/alert_management/metric_images.rb
new file mode 100644
index 00000000000..d7d8182af3e
--- /dev/null
+++ b/spec/factories/alert_management/metric_images.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :alert_metric_image, class: 'AlertManagement::MetricImage' do
+ association :alert, factory: :alert_management_alert
+ url { generate(:url) }
+
+ trait :local do
+ file_store { ObjectStorage::Store::LOCAL }
+ end
+
+ after(:build) do |image|
+ image.file = fixture_file_upload('spec/fixtures/rails_sample.jpg', 'image/jpg')
+ end
+ end
+end
diff --git a/spec/factories/application_settings.rb b/spec/factories/application_settings.rb
index 8ac003d0a98..c28d3c20a86 100644
--- a/spec/factories/application_settings.rb
+++ b/spec/factories/application_settings.rb
@@ -4,5 +4,6 @@ FactoryBot.define do
factory :application_setting do
default_projects_limit { 42 }
import_sources { [] }
+ restricted_visibility_levels { [] }
end
end
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index 011021f6320..56c12d73a3b 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -10,7 +10,7 @@ FactoryBot.define do
options do
{
- image: 'ruby:2.7',
+ image: 'image:1.0',
services: ['postgres'],
script: ['ls -a']
}
@@ -175,6 +175,58 @@ FactoryBot.define do
end
end
+ trait :prepare_staging do
+ name { 'prepare staging' }
+ environment { 'staging' }
+
+ options do
+ {
+ script: %w(ls),
+ environment: { name: 'staging', action: 'prepare' }
+ }
+ end
+
+ set_expanded_environment_name
+ end
+
+ trait :start_staging do
+ name { 'start staging' }
+ environment { 'staging' }
+
+ options do
+ {
+ script: %w(ls),
+ environment: { name: 'staging', action: 'start' }
+ }
+ end
+
+ set_expanded_environment_name
+ end
+
+ trait :stop_staging do
+ name { 'stop staging' }
+ environment { 'staging' }
+
+ options do
+ {
+ script: %w(ls),
+ environment: { name: 'staging', action: 'stop' }
+ }
+ end
+
+ set_expanded_environment_name
+ end
+
+ trait :set_expanded_environment_name do
+ after(:build) do |build, evaluator|
+ build.assign_attributes(
+ metadata_attributes: {
+ expanded_environment_name: build.expanded_environment_name
+ }
+ )
+ end
+ end
+
trait :allowed_to_fail do
allow_failure { true }
end
@@ -455,7 +507,7 @@ FactoryBot.define do
trait :extended_options do
options do
{
- image: { name: 'ruby:2.7', entrypoint: '/bin/sh' },
+ image: { name: 'image:1.0', entrypoint: '/bin/sh' },
services: ['postgres', { name: 'docker:stable-dind', entrypoint: '/bin/sh', command: 'sleep 30', alias: 'docker' }, { name: 'mysql:latest', variables: { MYSQL_ROOT_PASSWORD: 'root123.' } }],
script: %w(echo),
after_script: %w(ls date),
@@ -497,6 +549,22 @@ FactoryBot.define do
options { {} }
end
+ trait :coverage_report_cobertura do
+ options do
+ {
+ artifacts: {
+ expire_in: '7d',
+ reports: {
+ coverage_report: {
+ coverage_format: 'cobertura',
+ path: 'cobertura.xml'
+ }
+ }
+ }
+ }
+ end
+ end
+
# TODO: move Security traits to ee_ci_build
# https://gitlab.com/gitlab-org/gitlab/-/issues/210486
trait :dast do
diff --git a/spec/factories/ci/job_artifacts.rb b/spec/factories/ci/job_artifacts.rb
index 77b07c4a404..cdbcdced5f4 100644
--- a/spec/factories/ci/job_artifacts.rb
+++ b/spec/factories/ci/job_artifacts.rb
@@ -302,6 +302,56 @@ FactoryBot.define do
end
end
+ # Bandit reports are correctly de-duplicated when ran in the same pipeline
+ # as a corresponding semgrep report.
+ # This report does not include signature tracking.
+ trait :sast_bandit do
+ file_type { :sast }
+ file_format { :raw }
+
+ after(:build) do |artifact, _|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/security_reports/master/gl-sast-report-bandit.json'), 'application/json')
+ end
+ end
+
+ # Equivalent Semgrep report for :sast_bandit report.
+ # This report includes signature tracking.
+ trait :sast_semgrep_for_bandit do
+ file_type { :sast }
+ file_format { :raw }
+
+ after(:build) do |artifact, _|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-bandit.json'), 'application/json')
+ end
+ end
+
+ # Gosec reports are not correctly de-duplicated when ran in the same pipeline
+ # as a corresponding semgrep report.
+ # This report includes signature tracking.
+ trait :sast_gosec do
+ file_type { :sast }
+ file_format { :raw }
+
+ after(:build) do |artifact, _|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/security_reports/master/gl-sast-report-gosec.json'), 'application/json')
+ end
+ end
+
+ # Equivalent Semgrep report for :sast_gosec report.
+ # This report includes signature tracking.
+ trait :sast_semgrep_for_gosec do
+ file_type { :sast }
+ file_format { :raw }
+
+ after(:build) do |artifact, _|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-gosec.json'), 'application/json')
+ end
+ end
+
trait :common_security_report do
file_format { :raw }
file_type { :dependency_scanning }
diff --git a/spec/factories/custom_emoji.rb b/spec/factories/custom_emoji.rb
index 88e50eafa7c..09ac4a79a85 100644
--- a/spec/factories/custom_emoji.rb
+++ b/spec/factories/custom_emoji.rb
@@ -3,9 +3,8 @@
FactoryBot.define do
factory :custom_emoji, class: 'CustomEmoji' do
sequence(:name) { |n| "custom_emoji#{n}" }
- namespace
group
file { 'https://gitlab.com/images/partyparrot.png' }
- creator { namespace.owner }
+ creator factory: :user
end
end
diff --git a/spec/factories/events.rb b/spec/factories/events.rb
index d182dc9f95f..403165a3935 100644
--- a/spec/factories/events.rb
+++ b/spec/factories/events.rb
@@ -59,6 +59,11 @@ FactoryBot.define do
target { design }
end
+ factory :design_updated_event, traits: [:has_design] do
+ action { :updated }
+ target { design }
+ end
+
factory :project_created_event do
project factory: :project
action { :created }
diff --git a/spec/factories/gitlab/database/background_migration/batched_migrations.rb b/spec/factories/gitlab/database/background_migration/batched_migrations.rb
index 79b4447b76e..5ff90ff44b9 100644
--- a/spec/factories/gitlab/database/background_migration/batched_migrations.rb
+++ b/spec/factories/gitlab/database/background_migration/batched_migrations.rb
@@ -13,12 +13,24 @@ FactoryBot.define do
total_tuple_count { 10_000 }
pause_ms { 100 }
- trait :finished do
- status { :finished }
+ trait(:paused) do
+ status { 0 }
end
- trait :failed do
- status { :failed }
+ trait(:active) do
+ status { 1 }
+ end
+
+ trait(:finished) do
+ status { 3 }
+ end
+
+ trait(:failed) do
+ status { 4 }
+ end
+
+ trait(:finalizing) do
+ status { 5 }
end
end
end
diff --git a/spec/factories/go_module_versions.rb b/spec/factories/go_module_versions.rb
index 145e6c95921..bdbd5a4423a 100644
--- a/spec/factories/go_module_versions.rb
+++ b/spec/factories/go_module_versions.rb
@@ -5,12 +5,10 @@ FactoryBot.define do
skip_create
initialize_with do
- p = attributes[:params]
- s = Packages::SemVer.parse(p.semver, prefixed: true)
+ s = Packages::SemVer.parse(semver, prefixed: true)
+ raise ArgumentError, "invalid sematic version: #{semver.inspect}" if !s && semver
- raise ArgumentError, "invalid sematic version: '#{p.semver}'" if !s && p.semver
-
- new(p.mod, p.type, p.commit, name: p.name, semver: s, ref: p.ref)
+ new(mod, type, commit, name: name, semver: s, ref: ref)
end
mod { association(:go_module) }
@@ -20,8 +18,6 @@ FactoryBot.define do
semver { nil }
ref { nil }
- params { OpenStruct.new(mod: mod, type: type, commit: commit, name: name, semver: semver, ref: ref) }
-
trait :tagged do
ref { mod.project.repository.find_tag(name) }
commit { ref.dereferenced_target }
@@ -36,8 +32,8 @@ FactoryBot.define do
.max_by(&:to_s)
.to_s
end
-
- params { OpenStruct.new(mod: mod, type: :ref, commit: commit, semver: name, ref: ref) }
+ type { :ref }
+ semver { name }
end
end
end
diff --git a/spec/factories/groups.rb b/spec/factories/groups.rb
index aa264ad3377..152ae061605 100644
--- a/spec/factories/groups.rb
+++ b/spec/factories/groups.rb
@@ -118,14 +118,5 @@ FactoryBot.define do
create(:crm_settings, group: group, enabled: true)
end
end
-
- trait :test_group do
- path { "test-group-fulfillment#{SecureRandom.hex(4)}" }
- created_at { 4.days.ago }
-
- after(:create) do |group|
- group.add_owner(create(:user, email: "test-user-#{SecureRandom.hex(4)}@test.com"))
- end
- end
end
end
diff --git a/spec/factories/integrations.rb b/spec/factories/integrations.rb
index 0ffa15ad403..3945637c2c3 100644
--- a/spec/factories/integrations.rb
+++ b/spec/factories/integrations.rb
@@ -189,7 +189,7 @@ FactoryBot.define do
end
trait :chat_notification do
- webhook { 'https://example.com/webhook' }
+ sequence(:webhook) { |n| "https://example.com/webhook/#{n}" }
end
trait :inactive do
diff --git a/spec/factories/issues.rb b/spec/factories/issues.rb
index 26c858665a8..8c714f7736f 100644
--- a/spec/factories/issues.rb
+++ b/spec/factories/issues.rb
@@ -58,6 +58,11 @@ FactoryBot.define do
end
end
+ trait :task do
+ issue_type { :task }
+ association :work_item_type, :default, :task
+ end
+
factory :incident do
issue_type { :incident }
association :work_item_type, :default, :incident
diff --git a/spec/factories/keys.rb b/spec/factories/keys.rb
index 2af1c6cc62d..6b800e3d790 100644
--- a/spec/factories/keys.rb
+++ b/spec/factories/keys.rb
@@ -19,6 +19,12 @@ FactoryBot.define do
user
end
+ factory :personal_key_4096 do
+ user
+
+ key { SSHData::PrivateKey::RSA.generate(4096, unsafe_allow_small_key: true).public_key.openssh(comment: 'dummy@gitlab.com') }
+ end
+
factory :another_key do
factory :another_deploy_key, class: 'DeployKey'
end
@@ -74,6 +80,8 @@ FactoryBot.define do
qpPN5jAskkAUzOh5L/M+dmq2jNn03U9xwORCYPZj+fFM9bL99/0knsV0ypZDZyWH dummy@gitlab.com
KEY
end
+
+ factory :rsa_deploy_key_5120, class: 'DeployKey'
end
factory :rsa_key_8192 do
diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb
index 26804b38db8..e897a5e022a 100644
--- a/spec/factories/merge_requests.rb
+++ b/spec/factories/merge_requests.rb
@@ -65,11 +65,12 @@ FactoryBot.define do
transient do
merged_by { author }
+ merged_at { nil }
end
after(:build) do |merge_request, evaluator|
metrics = merge_request.build_metrics
- metrics.merged_at = 1.week.from_now
+ metrics.merged_at = evaluator.merged_at || 1.week.from_now
metrics.merged_by = evaluator.merged_by
metrics.pipeline = create(:ci_empty_pipeline)
end
diff --git a/spec/factories/project_statistics.rb b/spec/factories/project_statistics.rb
index ee2ad507c2d..53107879d77 100644
--- a/spec/factories/project_statistics.rb
+++ b/spec/factories/project_statistics.rb
@@ -24,6 +24,7 @@ FactoryBot.define do
project_statistics.snippets_size = evaluator.size_multiplier * 6
project_statistics.pipeline_artifacts_size = evaluator.size_multiplier * 7
project_statistics.uploads_size = evaluator.size_multiplier * 8
+ project_statistics.container_registry_size = evaluator.size_multiplier * 9
end
end
end
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
index ef1313541f8..b3395758729 100644
--- a/spec/factories/projects.rb
+++ b/spec/factories/projects.rb
@@ -59,7 +59,7 @@ FactoryBot.define do
builds_access_level = [evaluator.builds_access_level, evaluator.repository_access_level].min
merge_requests_access_level = [evaluator.merge_requests_access_level, evaluator.repository_access_level].min
- hash = {
+ project_feature_hash = {
wiki_access_level: evaluator.wiki_access_level,
builds_access_level: builds_access_level,
snippets_access_level: evaluator.snippets_access_level,
@@ -75,7 +75,16 @@ FactoryBot.define do
security_and_compliance_access_level: evaluator.security_and_compliance_access_level
}
- project.build_project_feature(hash)
+ project_namespace_hash = {
+ name: evaluator.name,
+ path: evaluator.path,
+ parent: evaluator.namespace,
+ shared_runners_enabled: evaluator.shared_runners_enabled,
+ visibility_level: evaluator.visibility_level
+ }
+
+ project.build_project_namespace(project_namespace_hash)
+ project.build_project_feature(project_feature_hash)
end
after(:create) do |project, evaluator|
diff --git a/spec/factories/work_items/work_item_types.rb b/spec/factories/work_items/work_item_types.rb
index 0920b36bcbd..1b6137503d3 100644
--- a/spec/factories/work_items/work_item_types.rb
+++ b/spec/factories/work_items/work_item_types.rb
@@ -37,5 +37,10 @@ FactoryBot.define do
base_type { WorkItems::Type.base_types[:requirement] }
icon_name { 'issue-type-requirements' }
end
+
+ trait :task do
+ base_type { WorkItems::Type.base_types[:task] }
+ icon_name { 'issue-type-task' }
+ end
end
end
diff --git a/spec/fast_spec_helper.rb b/spec/fast_spec_helper.rb
index ce3c9af22f1..6cbe97fb3f3 100644
--- a/spec/fast_spec_helper.rb
+++ b/spec/fast_spec_helper.rb
@@ -1,6 +1,5 @@
# frozen_string_literal: true
-# $" is $LOADED_FEATURES, but RuboCop didn't like it
if $".include?(File.expand_path('spec_helper.rb', __dir__))
# There's no need to load anything here if spec_helper is already loaded
# because spec_helper is more extensive than fast_spec_helper
diff --git a/spec/features/admin/admin_broadcast_messages_spec.rb b/spec/features/admin/admin_broadcast_messages_spec.rb
index e40f4c4678c..875eb9dd0ce 100644
--- a/spec/features/admin/admin_broadcast_messages_spec.rb
+++ b/spec/features/admin/admin_broadcast_messages_spec.rb
@@ -22,9 +22,8 @@ RSpec.describe 'Admin Broadcast Messages' do
it 'creates a customized broadcast banner message' do
fill_in 'broadcast_message_message', with: 'Application update from **4:00 CST to 5:00 CST**'
- fill_in 'broadcast_message_color', with: '#f2dede'
fill_in 'broadcast_message_target_path', with: '*/user_onboarded'
- fill_in 'broadcast_message_font', with: '#b94a48'
+ select 'light-indigo', from: 'broadcast_message_theme'
select Date.today.next_year.year, from: 'broadcast_message_ends_at_1i'
check 'Guest'
check 'Owner'
@@ -35,7 +34,7 @@ RSpec.describe 'Admin Broadcast Messages' do
expect(page).to have_content 'Guest, Owner'
expect(page).to have_content '*/user_onboarded'
expect(page).to have_selector 'strong', text: '4:00 CST to 5:00 CST'
- expect(page).to have_selector %(div[style="background-color: #f2dede; color: #b94a48"])
+ expect(page).to have_selector %(.light-indigo[role=alert])
end
it 'creates a customized broadcast notification message' do
@@ -90,7 +89,7 @@ RSpec.describe 'Admin Broadcast Messages' do
fill_in 'broadcast_message_message', with: "Live **Markdown** previews. :tada:"
select 'Notification', from: 'broadcast_message_broadcast_type'
- page.within('.js-broadcast-notification-message-preview') do
+ page.within('#broadcast-message-preview') do
expect(page).to have_selector('strong', text: 'Markdown')
expect(page).to have_emoji('tada')
end
diff --git a/spec/features/admin/admin_dev_ops_report_spec.rb b/spec/features/admin/admin_dev_ops_report_spec.rb
deleted file mode 100644
index cee79f8f440..00000000000
--- a/spec/features/admin/admin_dev_ops_report_spec.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'DevOps Report page', :js do
- before do
- admin = create(:admin)
- sign_in(admin)
- gitlab_enable_admin_mode_sign_in(admin)
- end
-
- context 'with devops_adoption feature flag disabled' do
- before do
- stub_feature_flags(devops_adoption: false)
- end
-
- it 'has dismissable intro callout' do
- visit admin_dev_ops_report_path
-
- expect(page).to have_content 'Introducing Your DevOps Report'
-
- page.within(find('[data-testid="devops-score-container"]')) do
- find('[data-testid="close-icon"]').click
- end
-
- expect(page).not_to have_content 'Introducing Your DevOps Report'
- end
-
- context 'when usage ping is disabled' do
- before do
- stub_application_setting(usage_ping_enabled: false)
- end
-
- it 'shows empty state' do
- visit admin_dev_ops_report_path
-
- expect(page).to have_text('Service ping is off')
- end
-
- it 'hides the intro callout' do
- visit admin_dev_ops_report_path
-
- expect(page).not_to have_content 'Introducing Your DevOps Report'
- end
- end
-
- context 'when there is no data to display' do
- it 'shows empty state' do
- stub_application_setting(usage_ping_enabled: true)
-
- visit admin_dev_ops_report_path
-
- expect(page).to have_content('Data is still calculating')
- end
- end
-
- context 'when there is data to display' do
- it 'shows the DevOps Score app' do
- stub_application_setting(usage_ping_enabled: true)
- create(:dev_ops_report_metric)
-
- visit admin_dev_ops_report_path
-
- expect(page).to have_selector('[data-testid="devops-score-app"]')
- end
- end
- end
-end
diff --git a/spec/features/admin/admin_dev_ops_reports_spec.rb b/spec/features/admin/admin_dev_ops_reports_spec.rb
new file mode 100644
index 00000000000..bf32819cb52
--- /dev/null
+++ b/spec/features/admin/admin_dev_ops_reports_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'DevOps Report page', :js do
+ before do
+ admin = create(:admin)
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
+ end
+
+ context 'with devops_adoption feature flag disabled' do
+ before do
+ stub_feature_flags(devops_adoption: false)
+ end
+
+ it 'has dismissable intro callout' do
+ visit admin_dev_ops_reports_path
+
+ expect(page).to have_content 'Introducing Your DevOps Report'
+
+ page.within(find('[data-testid="devops-score-container"]')) do
+ find('[data-testid="close-icon"]').click
+ end
+
+ expect(page).not_to have_content 'Introducing Your DevOps Report'
+ end
+
+ context 'when usage ping is disabled' do
+ before do
+ stub_application_setting(usage_ping_enabled: false)
+ end
+
+ it 'shows empty state' do
+ visit admin_dev_ops_reports_path
+
+ expect(page).to have_text('Service ping is off')
+ end
+
+ it 'hides the intro callout' do
+ visit admin_dev_ops_reports_path
+
+ expect(page).not_to have_content 'Introducing Your DevOps Report'
+ end
+ end
+
+ context 'when there is no data to display' do
+ it 'shows empty state' do
+ stub_application_setting(usage_ping_enabled: true)
+
+ visit admin_dev_ops_reports_path
+
+ expect(page).to have_content('Data is still calculating')
+ end
+ end
+
+ context 'when there is data to display' do
+ it 'shows the DevOps Score app' do
+ stub_application_setting(usage_ping_enabled: true)
+ create(:dev_ops_report_metric)
+
+ visit admin_dev_ops_reports_path
+
+ expect(page).to have_selector('[data-testid="devops-score-app"]')
+ end
+ end
+ end
+end
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index 3f0c7e64a1f..7fe49c2571c 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -3,65 +3,71 @@
require 'spec_helper'
RSpec.describe "Admin Runners" do
- include StubENV
- include Spec::Support::Helpers::ModalHelpers
+ include Spec::Support::Helpers::Features::RunnersHelpers
+
+ let_it_be(:admin) { create(:admin) }
before do
- stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
- admin = create(:admin)
sign_in(admin)
gitlab_enable_admin_mode_sign_in(admin)
wait_for_requests
end
- describe "Runners page", :js do
+ describe "Admin Runners page", :js do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:namespace) { create(:namespace) }
let_it_be(:project) { create(:project, namespace: namespace, creator: user) }
- context "when there are runners" do
- it 'has all necessary texts' do
- create(:ci_runner, :instance, created_at: 1.year.ago, contacted_at: Time.zone.now)
- create(:ci_runner, :instance, created_at: 1.year.ago, contacted_at: 1.week.ago)
- create(:ci_runner, :instance, created_at: 1.year.ago, contacted_at: 1.year.ago)
-
+ context "runners registration" do
+ before do
visit admin_runners_path
-
- expect(page).to have_text "Register an instance runner"
- expect(page).to have_text "Online runners 1"
- expect(page).to have_text "Offline runners 2"
- expect(page).to have_text "Stale runners 1"
end
- it 'with an instance runner shows an instance badge' do
- runner = create(:ci_runner, :instance)
+ it_behaves_like "shows and resets runner registration token" do
+ let(:dropdown_text) { 'Register an instance runner' }
+ let(:registration_token) { Gitlab::CurrentSettings.runners_registration_token }
+ end
+ end
- visit admin_runners_path
+ context "when there are runners" do
+ context "with an instance runner" do
+ let!(:instance_runner) { create(:ci_runner, :instance) }
- within "[data-testid='runner-row-#{runner.id}']" do
- expect(page).to have_selector '.badge', text: 'shared'
+ before do
+ visit admin_runners_path
end
- end
- it 'with a group runner shows a group badge' do
- runner = create(:ci_runner, :group, groups: [group])
+ it_behaves_like 'shows runner in list' do
+ let(:runner) { instance_runner }
+ end
- visit admin_runners_path
+ it_behaves_like 'pauses, resumes and deletes a runner' do
+ let(:runner) { instance_runner }
+ end
- within "[data-testid='runner-row-#{runner.id}']" do
- expect(page).to have_selector '.badge', text: 'group'
+ it 'shows an instance badge' do
+ within_runner_row(instance_runner.id) do
+ expect(page).to have_selector '.badge', text: 'shared'
+ end
end
end
- it 'with a project runner shows a project badge' do
- runner = create(:ci_runner, :project, projects: [project])
+ context "with multiple runners" do
+ before do
+ create(:ci_runner, :instance, created_at: 1.year.ago, contacted_at: Time.zone.now)
+ create(:ci_runner, :instance, created_at: 1.year.ago, contacted_at: 1.week.ago)
+ create(:ci_runner, :instance, created_at: 1.year.ago, contacted_at: 1.year.ago)
- visit admin_runners_path
+ visit admin_runners_path
+ end
- within "[data-testid='runner-row-#{runner.id}']" do
- expect(page).to have_selector '.badge', text: 'specific'
+ it 'has all necessary texts' do
+ expect(page).to have_text "Register an instance runner"
+ expect(page).to have_text "Online runners 1"
+ expect(page).to have_text "Offline runners 2"
+ expect(page).to have_text "Stale runners 1"
end
end
@@ -73,44 +79,8 @@ RSpec.describe "Admin Runners" do
visit admin_runners_path
- within "[data-testid='runner-row-#{runner.id}'] [data-label='Jobs']" do
- expect(page).to have_content '2'
- end
- end
-
- describe 'delete runner' do
- let!(:runner) { create(:ci_runner, description: 'runner-foo') }
-
- before do
- visit admin_runners_path
-
- within "[data-testid='runner-row-#{runner.id}']" do
- click_on 'Delete runner'
- end
- end
-
- it 'shows a confirmation modal' do
- expect(page).to have_text "Delete runner ##{runner.id} (#{runner.short_sha})?"
- expect(page).to have_text "Are you sure you want to continue?"
- end
-
- it 'deletes a runner' do
- within '.modal' do
- click_on 'Delete runner'
- end
-
- expect(page.find('.gl-toast')).to have_text(/Runner .+ deleted/)
- expect(page).not_to have_content 'runner-foo'
- end
-
- it 'cancels runner deletion' do
- within '.modal' do
- click_on 'Cancel'
- end
-
- wait_for_requests
-
- expect(page).to have_content 'runner-foo'
+ within_runner_row(runner.id) do
+ expect(find("[data-label='Jobs']")).to have_content '2'
end
end
@@ -154,35 +124,69 @@ RSpec.describe "Admin Runners" do
end
end
+ describe 'filter by paused' do
+ before do
+ create(:ci_runner, :instance, description: 'runner-active')
+ create(:ci_runner, :instance, description: 'runner-paused', active: false)
+
+ visit admin_runners_path
+ end
+
+ it 'shows all runners' do
+ expect(page).to have_link('All 2')
+
+ expect(page).to have_content 'runner-active'
+ expect(page).to have_content 'runner-paused'
+ end
+
+ it 'shows paused runners' do
+ input_filtered_search_filter_is_only('Paused', 'Yes')
+
+ expect(page).to have_link('All 1')
+
+ expect(page).not_to have_content 'runner-active'
+ expect(page).to have_content 'runner-paused'
+ end
+
+ it 'shows active runners' do
+ input_filtered_search_filter_is_only('Paused', 'No')
+
+ expect(page).to have_link('All 1')
+
+ expect(page).to have_content 'runner-active'
+ expect(page).not_to have_content 'runner-paused'
+ end
+ end
+
describe 'filter by status' do
let!(:never_contacted) { create(:ci_runner, :instance, description: 'runner-never-contacted', contacted_at: nil) }
before do
create(:ci_runner, :instance, description: 'runner-1', contacted_at: Time.zone.now)
create(:ci_runner, :instance, description: 'runner-2', contacted_at: Time.zone.now)
- create(:ci_runner, :instance, description: 'runner-paused', active: false, contacted_at: Time.zone.now)
+ create(:ci_runner, :instance, description: 'runner-offline', contacted_at: 1.week.ago)
visit admin_runners_path
end
it 'shows all runners' do
+ expect(page).to have_link('All 4')
+
expect(page).to have_content 'runner-1'
expect(page).to have_content 'runner-2'
- expect(page).to have_content 'runner-paused'
+ expect(page).to have_content 'runner-offline'
expect(page).to have_content 'runner-never-contacted'
-
- expect(page).to have_link('All 4')
end
it 'shows correct runner when status matches' do
- input_filtered_search_filter_is_only('Status', 'Active')
+ input_filtered_search_filter_is_only('Status', 'Online')
- expect(page).to have_link('All 3')
+ expect(page).to have_link('All 2')
expect(page).to have_content 'runner-1'
expect(page).to have_content 'runner-2'
- expect(page).to have_content 'runner-never-contacted'
- expect(page).not_to have_content 'runner-paused'
+ expect(page).not_to have_content 'runner-offline'
+ expect(page).not_to have_content 'runner-never-contacted'
end
it 'shows no runner when status does not match' do
@@ -194,15 +198,15 @@ RSpec.describe "Admin Runners" do
end
it 'shows correct runner when status is selected and search term is entered' do
- input_filtered_search_filter_is_only('Status', 'Active')
+ input_filtered_search_filter_is_only('Status', 'Online')
input_filtered_search_keys('runner-1')
expect(page).to have_link('All 1')
expect(page).to have_content 'runner-1'
expect(page).not_to have_content 'runner-2'
+ expect(page).not_to have_content 'runner-offline'
expect(page).not_to have_content 'runner-never-contacted'
- expect(page).not_to have_content 'runner-paused'
end
it 'shows correct runner when status filter is entered' do
@@ -216,7 +220,7 @@ RSpec.describe "Admin Runners" do
expect(page).not_to have_content 'runner-paused'
expect(page).to have_content 'runner-never-contacted'
- within "[data-testid='runner-row-#{never_contacted.id}']" do
+ within_runner_row(never_contacted.id) do
expect(page).to have_selector '.badge', text: 'never contacted'
end
end
@@ -308,7 +312,7 @@ RSpec.describe "Admin Runners" do
visit admin_runners_path
- input_filtered_search_filter_is_only('Status', 'Active')
+ input_filtered_search_filter_is_only('Paused', 'No')
expect(page).to have_content 'runner-project'
expect(page).to have_content 'runner-group'
@@ -330,6 +334,17 @@ RSpec.describe "Admin Runners" do
create(:ci_runner, :instance, description: 'runner-red', tag_list: ['red'])
end
+ it 'shows tags suggestions' do
+ visit admin_runners_path
+
+ open_filtered_search_suggestions('Tags')
+
+ page.within(search_bar_selector) do
+ expect(page).to have_content 'blue'
+ expect(page).to have_content 'red'
+ end
+ end
+
it 'shows correct runner when tag matches' do
visit admin_runners_path
@@ -403,15 +418,7 @@ RSpec.describe "Admin Runners" do
visit admin_runners_path
end
- it 'has all necessary texts including no runner message' do
- expect(page).to have_text "Register an instance runner"
-
- expect(page).to have_text "Online runners 0"
- expect(page).to have_text "Offline runners 0"
- expect(page).to have_text "Stale runners 0"
-
- expect(page).to have_text 'No runners found'
- end
+ it_behaves_like "shows no runners"
it 'shows tabs with total counts equal to 0' do
expect(page).to have_link('All 0')
@@ -427,65 +434,17 @@ RSpec.describe "Admin Runners" do
expect(page).to have_current_path(admin_runners_path('status[]': 'NEVER_CONTACTED') )
end
- end
- describe 'runners registration' do
- let!(:token) { Gitlab::CurrentSettings.runners_registration_token }
-
- before do
- visit admin_runners_path
+ it 'updates ACTIVE runner status to paused=false' do
+ visit admin_runners_path('status[]': 'ACTIVE')
- click_on 'Register an instance runner'
+ expect(page).to have_current_path(admin_runners_path('paused[]': 'false') )
end
- describe 'show registration instructions' do
- before do
- click_on 'Show runner installation and registration instructions'
-
- wait_for_requests
- end
-
- it 'opens runner installation modal' do
- expect(page).to have_text "Install a runner"
-
- expect(page).to have_text "Environment"
- expect(page).to have_text "Architecture"
- expect(page).to have_text "Download and install binary"
- end
-
- it 'dismisses runner installation modal' do
- within_modal do
- click_button('Close', match: :first)
- end
-
- expect(page).not_to have_text "Install a runner"
- end
- end
+ it 'updates PAUSED runner status to paused=true' do
+ visit admin_runners_path('status[]': 'PAUSED')
- it 'has a registration token' do
- click_on 'Click to reveal'
- expect(page.find('[data-testid="token-value"]')).to have_content(token)
- end
-
- describe 'reset registration token' do
- let(:page_token) { find('[data-testid="token-value"]').text }
-
- before do
- click_on 'Reset registration token'
-
- within_modal do
- click_button('Reset token', match: :first)
- end
-
- wait_for_requests
- end
-
- it 'changes registration token' do
- click_on 'Register an instance runner'
-
- click_on 'Click to reveal'
- expect(page_token).not_to eq token
- end
+ expect(page).to have_current_path(admin_runners_path('paused[]': 'true') )
end
end
end
@@ -637,47 +596,4 @@ RSpec.describe "Admin Runners" do
end
end
end
-
- private
-
- def search_bar_selector
- '[data-testid="runners-filtered-search"]'
- end
-
- # The filters must be clicked first to be able to receive events
- # See: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1493
- def focus_filtered_search
- page.within(search_bar_selector) do
- page.find('.gl-filtered-search-term-token').click
- end
- end
-
- def input_filtered_search_keys(search_term)
- focus_filtered_search
-
- page.within(search_bar_selector) do
- page.find('input').send_keys(search_term)
- click_on 'Search'
- end
-
- wait_for_requests
- end
-
- def input_filtered_search_filter_is_only(filter, value)
- focus_filtered_search
-
- page.within(search_bar_selector) do
- click_on filter
-
- # For OPERATOR_IS_ONLY, clicking the filter
- # immediately preselects "=" operator
-
- page.find('input').send_keys(value)
- page.find('input').send_keys(:enter)
-
- click_on 'Search'
- end
-
- wait_for_requests
- end
end
diff --git a/spec/features/admin/admin_sees_background_migrations_spec.rb b/spec/features/admin/admin_sees_background_migrations_spec.rb
index d05a09a79ef..432721d63ad 100644
--- a/spec/features/admin/admin_sees_background_migrations_spec.rb
+++ b/spec/features/admin/admin_sees_background_migrations_spec.rb
@@ -5,9 +5,9 @@ require 'spec_helper'
RSpec.describe "Admin > Admin sees background migrations" do
let_it_be(:admin) { create(:admin) }
- let_it_be(:active_migration) { create(:batched_background_migration, table_name: 'active', status: :active) }
- let_it_be(:failed_migration) { create(:batched_background_migration, table_name: 'failed', status: :failed, total_tuple_count: 100) }
- let_it_be(:finished_migration) { create(:batched_background_migration, table_name: 'finished', status: :finished) }
+ let_it_be(:active_migration) { create(:batched_background_migration, :active, table_name: 'active') }
+ let_it_be(:failed_migration) { create(:batched_background_migration, :failed, table_name: 'failed', total_tuple_count: 100) }
+ let_it_be(:finished_migration) { create(:batched_background_migration, :finished, table_name: 'finished') }
before_all do
create(:batched_background_migration_job, :failed, batched_migration: failed_migration, batch_size: 10, min_value: 6, max_value: 15, attempts: 3)
@@ -81,7 +81,7 @@ RSpec.describe "Admin > Admin sees background migrations" do
expect(page).to have_content(failed_migration.job_class_name)
expect(page).to have_content(failed_migration.table_name)
expect(page).to have_content('0.00%')
- expect(page).to have_content(failed_migration.status.humanize)
+ expect(page).to have_content(failed_migration.status_name.to_s)
click_button('Retry')
expect(page).not_to have_content(failed_migration.job_class_name)
@@ -106,7 +106,7 @@ RSpec.describe "Admin > Admin sees background migrations" do
expect(page).to have_content(finished_migration.job_class_name)
expect(page).to have_content(finished_migration.table_name)
expect(page).to have_content('100.00%')
- expect(page).to have_content(finished_migration.status.humanize)
+ expect(page).to have_content(finished_migration.status_name.to_s)
end
end
end
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index df93bd773a6..4cdc3df978d 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -34,16 +34,16 @@ RSpec.describe 'Admin updates settings' do
it 'uncheck all restricted visibility levels' do
page.within('.as-visibility-access') do
- find('#application_setting_visibility_level_0').set(false)
- find('#application_setting_visibility_level_10').set(false)
- find('#application_setting_visibility_level_20').set(false)
+ find('#application_setting_restricted_visibility_levels_0').set(false)
+ find('#application_setting_restricted_visibility_levels_10').set(false)
+ find('#application_setting_restricted_visibility_levels_20').set(false)
click_button 'Save changes'
end
expect(page).to have_content "Application settings saved successfully"
- expect(find('#application_setting_visibility_level_0')).not_to be_checked
- expect(find('#application_setting_visibility_level_10')).not_to be_checked
- expect(find('#application_setting_visibility_level_20')).not_to be_checked
+ expect(find('#application_setting_restricted_visibility_levels_0')).not_to be_checked
+ expect(find('#application_setting_restricted_visibility_levels_10')).not_to be_checked
+ expect(find('#application_setting_restricted_visibility_levels_20')).not_to be_checked
end
it 'modify import sources' do
@@ -311,7 +311,9 @@ RSpec.describe 'Admin updates settings' do
end
context 'CI/CD page' do
- it 'change CI/CD settings' do
+ let_it_be(:default_plan) { create(:default_plan) }
+
+ it 'changes CI/CD settings' do
visit ci_cd_admin_application_settings_path
page.within('.as-ci-cd') do
@@ -329,6 +331,33 @@ RSpec.describe 'Admin updates settings' do
expect(page).to have_content "Application settings saved successfully"
end
+ it 'changes CI/CD limits', :aggregate_failures do
+ visit ci_cd_admin_application_settings_path
+
+ page.within('.as-ci-cd') do
+ fill_in 'plan_limits_ci_pipeline_size', with: 10
+ fill_in 'plan_limits_ci_active_jobs', with: 20
+ fill_in 'plan_limits_ci_active_pipelines', with: 25
+ fill_in 'plan_limits_ci_project_subscriptions', with: 30
+ fill_in 'plan_limits_ci_pipeline_schedules', with: 40
+ fill_in 'plan_limits_ci_needs_size_limit', with: 50
+ fill_in 'plan_limits_ci_registered_group_runners', with: 60
+ fill_in 'plan_limits_ci_registered_project_runners', with: 70
+ click_button 'Save Default limits'
+ end
+
+ limits = default_plan.reload.limits
+ expect(limits.ci_pipeline_size).to eq(10)
+ expect(limits.ci_active_jobs).to eq(20)
+ expect(limits.ci_active_pipelines).to eq(25)
+ expect(limits.ci_project_subscriptions).to eq(30)
+ expect(limits.ci_pipeline_schedules).to eq(40)
+ expect(limits.ci_needs_size_limit).to eq(50)
+ expect(limits.ci_registered_group_runners).to eq(60)
+ expect(limits.ci_registered_project_runners).to eq(70)
+ expect(page).to have_content 'Application limits saved successfully'
+ end
+
context 'Runner Registration' do
context 'when feature is enabled' do
before do
@@ -421,7 +450,7 @@ RSpec.describe 'Admin updates settings' do
visit ci_cd_admin_application_settings_path
page.within('.as-registry') do
- find('#application_setting_container_registry_expiration_policies_caching.form-check-input').click
+ find('#application_setting_container_registry_expiration_policies_caching').click
click_button 'Save changes'
end
@@ -489,8 +518,8 @@ RSpec.describe 'Admin updates settings' do
page.within('.as-spam') do
fill_in 'reCAPTCHA site key', with: 'key'
fill_in 'reCAPTCHA private key', with: 'key'
- check 'Enable reCAPTCHA'
- check 'Enable reCAPTCHA for login'
+ find('#application_setting_recaptcha_enabled').set(true)
+ find('#application_setting_login_recaptcha_protection_enabled').set(true)
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'
@@ -825,31 +854,45 @@ RSpec.describe 'Admin updates settings' do
before do
stub_usage_data_connections
stub_database_flavor_check
-
- visit service_usage_data_admin_application_settings_path
end
- it 'loads usage ping payload on click', :js do
- expected_payload_content = /(?=.*"uuid")(?=.*"hostname")/m
+ context 'when service data cached', :clean_gitlab_redis_cache do
+ before do
+ allow(Rails.cache).to receive(:exist?).with('usage_data').and_return(true)
- expect(page).not_to have_content expected_payload_content
+ visit service_usage_data_admin_application_settings_path
+ end
- click_button('Preview payload')
+ it 'loads usage ping payload on click', :js do
+ expected_payload_content = /(?=.*"uuid")(?=.*"hostname")/m
- wait_for_requests
+ expect(page).not_to have_content expected_payload_content
- expect(page).to have_button 'Hide payload'
- expect(page).to have_content expected_payload_content
- end
+ click_button('Preview payload')
- it 'generates usage ping payload on button click', :js do
- expect_next_instance_of(Admin::ApplicationSettingsController) do |instance|
- expect(instance).to receive(:usage_data).and_call_original
+ wait_for_requests
+
+ expect(page).to have_button 'Hide payload'
+ expect(page).to have_content expected_payload_content
+ end
+
+ it 'generates usage ping payload on button click', :js do
+ expect_next_instance_of(Admin::ApplicationSettingsController) do |instance|
+ expect(instance).to receive(:usage_data).and_call_original
+ end
+
+ click_button('Download payload')
+
+ wait_for_requests
end
+ end
- click_button('Download payload')
+ context 'when service data not cached' do
+ it 'renders missing cache information' do
+ visit service_usage_data_admin_application_settings_path
- wait_for_requests
+ expect(page).to have_text('Service Ping payload not found in the application cache')
+ end
end
end
end
diff --git a/spec/features/admin/admin_users_impersonation_tokens_spec.rb b/spec/features/admin/admin_users_impersonation_tokens_spec.rb
index 6643ebe82e6..15bc2318022 100644
--- a/spec/features/admin/admin_users_impersonation_tokens_spec.rb
+++ b/spec/features/admin/admin_users_impersonation_tokens_spec.rb
@@ -36,14 +36,14 @@ RSpec.describe 'Admin > Users > Impersonation Tokens', :js do
click_on "1"
# Scopes
- check "api"
+ check "read_api"
check "read_user"
click_on "Create impersonation token"
expect(active_impersonation_tokens).to have_text(name)
expect(active_impersonation_tokens).to have_text('in')
- expect(active_impersonation_tokens).to have_text('api')
+ expect(active_impersonation_tokens).to have_text('read_api')
expect(active_impersonation_tokens).to have_text('read_user')
expect(PersonalAccessTokensFinder.new(impersonation: true).execute.count).to equal(1)
expect(created_impersonation_token).not_to be_empty
diff --git a/spec/features/admin/clusters/eks_spec.rb b/spec/features/admin/clusters/eks_spec.rb
index 71d2bba73b1..4667f9c20a1 100644
--- a/spec/features/admin/clusters/eks_spec.rb
+++ b/spec/features/admin/clusters/eks_spec.rb
@@ -15,8 +15,8 @@ RSpec.describe 'Instance-level AWS EKS Cluster', :js do
before do
visit admin_clusters_path
- click_button 'Actions'
- click_link 'Create a new cluster'
+ click_button(class: 'dropdown-toggle-split')
+ click_link 'Create a cluster (deprecated)'
end
context 'when user creates a cluster on AWS EKS' do
diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb
index 5dd627f3b76..bf976168bbe 100644
--- a/spec/features/boards/boards_spec.rb
+++ b/spec/features/boards/boards_spec.rb
@@ -282,7 +282,7 @@ RSpec.describe 'Project issue boards', :js do
it 'shows issue count on the list' do
page.within(find(".board:nth-child(2)")) do
expect(page.find('[data-testid="board-items-count"]')).to have_text(total_planning_issues)
- expect(page).not_to have_selector('.js-max-issue-size')
+ expect(page).not_to have_selector('.max-issue-size')
end
end
end
diff --git a/spec/features/boards/focus_mode_spec.rb b/spec/features/boards/focus_mode_spec.rb
index 2bd1e625236..453a8d8870b 100644
--- a/spec/features/boards/focus_mode_spec.rb
+++ b/spec/features/boards/focus_mode_spec.rb
@@ -12,6 +12,6 @@ RSpec.describe 'Issue Boards focus mode', :js do
end
it 'shows focus mode button to anonymous users' do
- expect(page).to have_selector('.js-focus-mode-btn')
+ expect(page).to have_button _('Toggle focus mode')
end
end
diff --git a/spec/features/boards/multi_select_spec.rb b/spec/features/boards/multi_select_spec.rb
index 9148fb23214..cad303a14e5 100644
--- a/spec/features/boards/multi_select_spec.rb
+++ b/spec/features/boards/multi_select_spec.rb
@@ -72,7 +72,7 @@ RSpec.describe 'Multi Select Issue', :js do
wait_for_requests
- page.within(all('.js-board-list')[2]) do
+ page.within(all('.board-list')[2]) do
expect(find('.board-card:nth-child(1)')).to have_content(issue1.title)
expect(find('.board-card:nth-child(2)')).to have_content(issue2.title)
end
@@ -87,7 +87,7 @@ RSpec.describe 'Multi Select Issue', :js do
wait_for_requests
- page.within(all('.js-board-list')[2]) do
+ page.within(all('.board-list')[2]) do
expect(find('.board-card:nth-child(1)')).to have_content(issue1.title)
expect(find('.board-card:nth-child(2)')).to have_content(issue2.title)
expect(find('.board-card:nth-child(3)')).to have_content(issue3.title)
@@ -102,7 +102,7 @@ RSpec.describe 'Multi Select Issue', :js do
wait_for_requests
- page.within(all('.js-board-list')[1]) do
+ page.within(all('.board-list')[1]) do
expect(find('.board-card:nth-child(1)')).to have_content(issue1.title)
expect(find('.board-card:nth-child(2)')).to have_content(issue2.title)
expect(find('.board-card:nth-child(3)')).to have_content(issue5.title)
diff --git a/spec/features/clusters/create_agent_spec.rb b/spec/features/clusters/create_agent_spec.rb
index e03126d344e..c7326204bf6 100644
--- a/spec/features/clusters/create_agent_spec.rb
+++ b/spec/features/clusters/create_agent_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe 'Cluster agent registration', :js do
end
it 'allows the user to select an agent to install, and displays the resulting agent token' do
- click_button('Actions')
+ click_button('Connect a cluster')
expect(page).to have_content('Register')
click_button('Select an agent')
@@ -34,7 +34,7 @@ RSpec.describe 'Cluster agent registration', :js do
expect(page).to have_content('You cannot see this token again after you close this window.')
expect(page).to have_content('example-agent-token')
- expect(page).to have_content('docker run --pull=always --rm')
+ expect(page).to have_content('helm upgrade --install')
within find('.modal-footer') do
click_button('Close')
diff --git a/spec/features/commit_spec.rb b/spec/features/commit_spec.rb
index 3fd613ce393..c9fa10d58e6 100644
--- a/spec/features/commit_spec.rb
+++ b/spec/features/commit_spec.rb
@@ -33,6 +33,10 @@ RSpec.describe 'Commit' do
it "reports the correct number of total changes" do
expect(page).to have_content("Changes #{commit.diffs.size}")
end
+
+ it 'renders diff stats', :js do
+ expect(page).to have_selector(".diff-stats")
+ end
end
describe "pagination" do
diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb
index db841ffc627..4b38df175e2 100644
--- a/spec/features/commits_spec.rb
+++ b/spec/features/commits_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe 'Commits' do
before do
sign_in(user)
stub_ci_pipeline_to_return_yaml_file
+ stub_feature_flags(pipeline_tabs_vue: false)
end
let(:creator) { create(:user, developer_projects: [project]) }
@@ -93,6 +94,7 @@ RSpec.describe 'Commits' do
context 'Download artifacts', :js do
before do
+ stub_feature_flags(pipeline_tabs_vue: false)
create(:ci_job_artifact, :archive, file: artifacts_file, job: build)
end
@@ -122,6 +124,7 @@ RSpec.describe 'Commits' do
context "when logged as reporter", :js do
before do
+ stub_feature_flags(pipeline_tabs_vue: false)
project.add_reporter(user)
create(:ci_job_artifact, :archive, file: artifacts_file, job: build)
visit builds_project_pipeline_path(project, pipeline)
diff --git a/spec/features/error_tracking/user_searches_sentry_errors_spec.rb b/spec/features/error_tracking/user_searches_sentry_errors_spec.rb
index 89bf79ebb81..40718deed75 100644
--- a/spec/features/error_tracking/user_searches_sentry_errors_spec.rb
+++ b/spec/features/error_tracking/user_searches_sentry_errors_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe 'When a user searches for Sentry errors', :js, :use_clean_rails_m
expect(results.count).to be(3)
end
- find('.gl-form-input').set('NotFound').native.send_keys(:return)
+ find('.filtered-search-input-container .gl-form-input').set('NotFound').native.send_keys(:return)
page.within(find('.gl-table')) do
results = page.all('.table-row')
diff --git a/spec/features/groups/clusters/eks_spec.rb b/spec/features/groups/clusters/eks_spec.rb
index 3cca2d0919c..0e64a2faf3e 100644
--- a/spec/features/groups/clusters/eks_spec.rb
+++ b/spec/features/groups/clusters/eks_spec.rb
@@ -20,8 +20,8 @@ RSpec.describe 'Group AWS EKS Cluster', :js do
before do
visit group_clusters_path(group)
- click_button 'Actions'
- click_link 'Create a new cluster'
+ click_button(class: 'dropdown-toggle-split')
+ click_link 'Create a cluster (deprecated)'
end
context 'when user creates a cluster on AWS EKS' do
diff --git a/spec/features/groups/clusters/user_spec.rb b/spec/features/groups/clusters/user_spec.rb
index 2ed6ddc09ab..74ea72b238f 100644
--- a/spec/features/groups/clusters/user_spec.rb
+++ b/spec/features/groups/clusters/user_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe 'User Cluster', :js do
before do
visit group_clusters_path(group)
- click_link 'Connect with a certificate'
+ click_link 'Connect a cluster (deprecated)'
end
context 'when user filled form with valid parameters' do
@@ -119,7 +119,6 @@ RSpec.describe 'User Cluster', :js do
it 'user sees creation form with the successful message' do
expect(page).to have_content('Kubernetes cluster integration was successfully removed.')
- expect(page).to have_link('Connect with a certificate')
end
end
end
diff --git a/spec/features/groups/group_runners_spec.rb b/spec/features/groups/group_runners_spec.rb
new file mode 100644
index 00000000000..1d821edefa3
--- /dev/null
+++ b/spec/features/groups/group_runners_spec.rb
@@ -0,0 +1,168 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe "Group Runners" do
+ include Spec::Support::Helpers::Features::RunnersHelpers
+
+ let_it_be(:group_owner) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+
+ before do
+ group.add_owner(group_owner)
+ sign_in(group_owner)
+ end
+
+ describe "Group runners page", :js do
+ let!(:group_registration_token) { group.runners_token }
+
+ context "runners registration" do
+ before do
+ visit group_runners_path(group)
+ end
+
+ it_behaves_like "shows and resets runner registration token" do
+ let(:dropdown_text) { 'Register a group runner' }
+ let(:registration_token) { group_registration_token }
+ end
+ end
+
+ context "with no runners" do
+ before do
+ visit group_runners_path(group)
+ end
+
+ it_behaves_like "shows no runners"
+
+ it 'shows tabs with total counts equal to 0' do
+ expect(page).to have_link('All 0')
+ expect(page).to have_link('Group 0')
+ expect(page).to have_link('Project 0')
+ end
+ end
+
+ context "with an online group runner" do
+ let!(:group_runner) do
+ create(:ci_runner, :group, groups: [group], description: 'runner-foo', contacted_at: Time.zone.now)
+ end
+
+ before do
+ visit group_runners_path(group)
+ end
+
+ it_behaves_like 'shows runner in list' do
+ let(:runner) { group_runner }
+ end
+
+ it_behaves_like 'pauses, resumes and deletes a runner' do
+ let(:runner) { group_runner }
+ end
+
+ it 'shows a group badge' do
+ within_runner_row(group_runner.id) do
+ expect(page).to have_selector '.badge', text: 'group'
+ end
+ end
+
+ it 'can edit runner information' do
+ within_runner_row(group_runner.id) do
+ expect(find_link('Edit')[:href]).to end_with(edit_group_runner_path(group, group_runner))
+ end
+ end
+ end
+
+ context "with an online project runner" do
+ let!(:project_runner) do
+ create(:ci_runner, :project, projects: [project], description: 'runner-bar', contacted_at: Time.zone.now)
+ end
+
+ before do
+ visit group_runners_path(group)
+ end
+
+ it_behaves_like 'shows runner in list' do
+ let(:runner) { project_runner }
+ end
+
+ it_behaves_like 'pauses, resumes and deletes a runner' do
+ let(:runner) { project_runner }
+ end
+
+ it 'shows a project (specific) badge' do
+ within_runner_row(project_runner.id) do
+ expect(page).to have_selector '.badge', text: 'specific'
+ end
+ end
+
+ it 'can edit runner information' do
+ within_runner_row(project_runner.id) do
+ expect(find_link('Edit')[:href]).to end_with(edit_group_runner_path(group, project_runner))
+ end
+ end
+ end
+
+ context 'with a multi-project runner' do
+ let(:project) { create(:project, group: group) }
+ let(:project_2) { create(:project, group: group) }
+ let!(:runner) { create(:ci_runner, :project, projects: [project, project_2], description: 'group-runner') }
+
+ it 'user cannot remove the project runner' do
+ visit group_runners_path(group)
+
+ within_runner_row(runner.id) do
+ expect(page).to have_button 'Delete runner', disabled: true
+ end
+ end
+ end
+
+ context 'filtered search' do
+ before do
+ visit group_runners_path(group)
+ end
+
+ it 'allows user to search by paused and status', :js do
+ focus_filtered_search
+
+ page.within(search_bar_selector) do
+ expect(page).to have_link('Paused')
+ expect(page).to have_content('Status')
+ end
+ end
+ end
+ end
+
+ describe "Group runner edit page", :js do
+ let!(:runner) do
+ create(:ci_runner, :group, groups: [group], description: 'runner-foo', contacted_at: Time.zone.now)
+ end
+
+ it 'user edits the runner to be protected' do
+ visit edit_group_runner_path(group, runner)
+
+ expect(page.find_field('runner[access_level]')).not_to be_checked
+
+ check 'runner_access_level'
+ click_button 'Save changes'
+
+ expect(page).to have_content 'Protected Yes'
+ end
+
+ context 'when a runner has a tag' do
+ before do
+ runner.update!(tag_list: ['tag'])
+ end
+
+ it 'user edits runner not to run untagged jobs' do
+ visit edit_group_runner_path(group, runner)
+
+ expect(page.find_field('runner[run_untagged]')).to be_checked
+
+ uncheck 'runner_run_untagged'
+ click_button 'Save changes'
+
+ expect(page).to have_content 'Can run untagged jobs No'
+ end
+ end
+ end
+end
diff --git a/spec/features/groups/import_export/export_file_spec.rb b/spec/features/groups/import_export/export_file_spec.rb
index 9feb8085e66..e3cb1ad77a7 100644
--- a/spec/features/groups/import_export/export_file_spec.rb
+++ b/spec/features/groups/import_export/export_file_spec.rb
@@ -26,22 +26,6 @@ RSpec.describe 'Group Export', :js do
end
end
- context 'when the group import/export FF is disabled' do
- before do
- stub_feature_flags(group_import_export: false)
-
- group.add_owner(user)
- sign_in(user)
- end
-
- it 'does not show the group export options' do
- visit edit_group_path(group)
-
- expect(page).to have_content('Advanced')
- expect(page).not_to have_content('Export group')
- end
- end
-
context 'when the signed in user does not have the required permission level' do
before do
group.add_guest(user)
diff --git a/spec/features/groups/members/manage_groups_spec.rb b/spec/features/groups/members/manage_groups_spec.rb
index 5ab5a7ea716..5a9223d9ee8 100644
--- a/spec/features/groups/members/manage_groups_spec.rb
+++ b/spec/features/groups/members/manage_groups_spec.rb
@@ -3,7 +3,6 @@
require 'spec_helper'
RSpec.describe 'Groups > Members > Manage groups', :js do
- include Select2Helper
include Spec::Support::Helpers::Features::MembersHelpers
include Spec::Support::Helpers::Features::InviteMembersModalHelper
include Spec::Support::Helpers::ModalHelpers
@@ -119,16 +118,92 @@ RSpec.describe 'Groups > Members > Manage groups', :js do
describe 'group search results' do
let_it_be(:group, refind: true) { create(:group) }
- let_it_be(:group_within_hierarchy) { create(:group, parent: group) }
- let_it_be(:group_outside_hierarchy) { create(:group) }
- before_all do
- group.add_owner(user)
- group_within_hierarchy.add_owner(user)
- group_outside_hierarchy.add_owner(user)
+ context 'with instance admin considerations' do
+ let_it_be(:group_to_share) { create(:group) }
+
+ context 'when user is an admin' do
+ let_it_be(:admin) { create(:admin) }
+
+ before do
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
+ end
+
+ it 'shows groups where the admin has no direct membership' do
+ visit group_group_members_path(group)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_share)
+ expect_not_to_have_group(group)
+ end
+ end
+
+ it 'shows groups where the admin has at least guest level membership' do
+ group_to_share.add_guest(admin)
+
+ visit group_group_members_path(group)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_share)
+ expect_not_to_have_group(group)
+ end
+ end
+ end
+
+ context 'when user is not an admin' do
+ before do
+ group.add_owner(user)
+ end
+
+ it 'shows groups where the user has no direct membership' do
+ visit group_group_members_path(group)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_not_to_have_group(group_to_share)
+ expect_not_to_have_group(group)
+ end
+ end
+
+ it 'shows groups where the user has at least guest level membership' do
+ group_to_share.add_guest(user)
+
+ visit group_group_members_path(group)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_share)
+ expect_not_to_have_group(group)
+ end
+ end
+ end
end
- context 'when the invite members group modal is enabled' do
+ context 'when user is not an admin and there are hierarchy considerations' do
+ let_it_be(:group_within_hierarchy) { create(:group, parent: group) }
+ let_it_be(:group_outside_hierarchy) { create(:group) }
+
+ before_all do
+ group.add_owner(user)
+ group_within_hierarchy.add_owner(user)
+ group_outside_hierarchy.add_owner(user)
+ end
+
it 'does not show self or ancestors', :aggregate_failures do
group_sibbling = create(:group, parent: group)
group_sibbling.add_owner(user)
@@ -139,46 +214,46 @@ RSpec.describe 'Groups > Members > Manage groups', :js do
click_on 'Select a group'
wait_for_requests
- page.within('[data-testid="group-select-dropdown"]') do
- expect(page).to have_selector("[entity-id='#{group_outside_hierarchy.id}']")
- expect(page).to have_selector("[entity-id='#{group_sibbling.id}']")
- expect(page).not_to have_selector("[entity-id='#{group.id}']")
- expect(page).not_to have_selector("[entity-id='#{group_within_hierarchy.id}']")
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_outside_hierarchy)
+ expect_to_have_group(group_sibbling)
+ expect_not_to_have_group(group)
+ expect_not_to_have_group(group_within_hierarchy)
end
end
- end
- context 'when sharing with groups outside the hierarchy is enabled' do
- it 'shows groups within and outside the hierarchy in search results' do
- visit group_group_members_path(group)
+ context 'when sharing with groups outside the hierarchy is enabled' do
+ it 'shows groups within and outside the hierarchy in search results' do
+ visit group_group_members_path(group)
- click_on 'Invite a group'
- click_on 'Select a group'
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
- expect(page).to have_text group_within_hierarchy.name
- expect(page).to have_text group_outside_hierarchy.name
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_within_hierarchy)
+ expect_to_have_group(group_outside_hierarchy)
+ end
+ end
end
- end
- context 'when sharing with groups outside the hierarchy is disabled' do
- before do
- group.namespace_settings.update!(prevent_sharing_groups_outside_hierarchy: true)
- end
+ context 'when sharing with groups outside the hierarchy is disabled' do
+ before do
+ group.namespace_settings.update!(prevent_sharing_groups_outside_hierarchy: true)
+ end
- it 'shows only groups within the hierarchy in search results' do
- visit group_group_members_path(group)
+ it 'shows only groups within the hierarchy in search results' do
+ visit group_group_members_path(group)
- click_on 'Invite a group'
- click_on 'Select a group'
+ click_on 'Invite a group'
+ click_on 'Select a group'
- expect(page).to have_text group_within_hierarchy.name
- expect(page).not_to have_text group_outside_hierarchy.name
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_within_hierarchy)
+ expect_not_to_have_group(group_outside_hierarchy)
+ end
+ end
end
end
end
-
- def click_groups_tab
- expect(page).to have_link 'Groups'
- click_link "Groups"
- end
end
diff --git a/spec/features/groups/members/manage_members_spec.rb b/spec/features/groups/members/manage_members_spec.rb
index 533d2118b30..468001c3be6 100644
--- a/spec/features/groups/members/manage_members_spec.rb
+++ b/spec/features/groups/members/manage_members_spec.rb
@@ -42,46 +42,6 @@ RSpec.describe 'Groups > Members > Manage members' do
end
end
- it 'add user to group', :js, :snowplow, :aggregate_failures do
- group.add_owner(user1)
-
- visit group_group_members_path(group)
-
- invite_member(user2.name, role: 'Reporter')
-
- page.within(second_row) do
- expect(page).to have_content(user2.name)
- expect(page).to have_button('Reporter')
- end
-
- expect_snowplow_event(
- category: 'Members::CreateService',
- action: 'create_member',
- label: 'group-members-page',
- property: 'existing_user',
- user: user1
- )
- end
-
- it 'do not disclose email addresses', :js do
- group.add_owner(user1)
- create(:user, email: 'undisclosed_email@gitlab.com', name: "Jane 'invisible' Doe")
-
- visit group_group_members_path(group)
-
- click_on 'Invite members'
- find('[data-testid="members-token-select-input"]').set('@gitlab.com')
-
- wait_for_requests
-
- expect(page).to have_content('No matches found')
-
- find('[data-testid="members-token-select-input"]').set('undisclosed_email@gitlab.com')
- wait_for_requests
-
- expect(page).to have_content('Invite "undisclosed_email@gitlab.com" by email')
- end
-
it 'remove user from group', :js do
group.add_owner(user1)
group.add_developer(user2)
@@ -106,43 +66,29 @@ RSpec.describe 'Groups > Members > Manage members' do
end
end
- it 'add yourself to group when already an owner', :js, :aggregate_failures do
- group.add_owner(user1)
-
- visit group_group_members_path(group)
-
- invite_member(user1.name, role: 'Reporter')
-
- page.within(first_row) do
- expect(page).to have_content(user1.name)
- expect(page).to have_content('Owner')
- end
- end
+ context 'when inviting' do
+ it 'add yourself to group when already an owner', :js do
+ group.add_owner(user1)
- it 'invite user to group', :js, :snowplow do
- group.add_owner(user1)
+ visit group_group_members_path(group)
- visit group_group_members_path(group)
+ invite_member(user1.name, role: 'Reporter', refresh: false)
- invite_member('test@example.com', role: 'Reporter')
+ expect(page).to have_selector(invite_modal_selector)
+ expect(page).to have_content("not authorized to update member")
- expect(page).to have_link 'Invited'
- click_link 'Invited'
+ page.refresh
- aggregate_failures do
- page.within(members_table) do
- expect(page).to have_content('test@example.com')
- expect(page).to have_content('Invited')
- expect(page).to have_button('Reporter')
+ page.within find_member_row(user1) do
+ expect(page).to have_content('Owner')
end
+ end
- expect_snowplow_event(
- category: 'Members::InviteService',
- action: 'create_member',
- label: 'group-members-page',
- property: 'net_new_user',
- user: user1
- )
+ it_behaves_like 'inviting members', 'group-members-page' do
+ let_it_be(:entity) { group }
+ let_it_be(:members_page_path) { group_group_members_path(entity) }
+ let_it_be(:subentity) { create(:group, parent: group) }
+ let_it_be(:subentity_members_page_path) { group_group_members_path(subentity) }
end
end
@@ -169,4 +115,57 @@ RSpec.describe 'Groups > Members > Manage members' do
end
end
end
+
+ describe 'member search results', :js do
+ before do
+ group.add_owner(user1)
+ end
+
+ it 'does not disclose email addresses' do
+ create(:user, email: 'undisclosed_email@gitlab.com', name: "Jane 'invisible' Doe")
+
+ visit group_group_members_path(group)
+
+ click_on 'Invite members'
+ find(member_dropdown_selector).set('@gitlab.com')
+
+ wait_for_requests
+
+ expect(page).to have_content('No matches found')
+
+ find(member_dropdown_selector).set('undisclosed_email@gitlab.com')
+ wait_for_requests
+
+ expect(page).to have_content('Invite "undisclosed_email@gitlab.com" by email')
+ end
+
+ it 'does not show project_bots', :aggregate_failures do
+ internal_project_bot = create(:user, :project_bot, name: '_internal_project_bot_')
+ project = create(:project, group: group)
+ project.add_maintainer(internal_project_bot)
+
+ external_group = create(:group)
+ external_project_bot = create(:user, :project_bot, name: '_external_project_bot_')
+ external_project = create(:project, group: external_group)
+ external_project.add_maintainer(external_project_bot)
+ external_project.add_maintainer(user1)
+
+ visit group_group_members_path(group)
+
+ click_on 'Invite members'
+
+ page.within invite_modal_selector do
+ field = find(member_dropdown_selector)
+ field.native.send_keys :tab
+ field.click
+
+ wait_for_requests
+
+ expect(page).to have_content(user1.name)
+ expect(page).to have_content(user2.name)
+ expect(page).not_to have_content(internal_project_bot.name)
+ expect(page).not_to have_content(external_project_bot.name)
+ end
+ end
+ end
end
diff --git a/spec/features/groups/members/sort_members_spec.rb b/spec/features/groups/members/sort_members_spec.rb
index 03758e0d401..bf8e64fa1e2 100644
--- a/spec/features/groups/members/sort_members_spec.rb
+++ b/spec/features/groups/members/sort_members_spec.rb
@@ -5,8 +5,8 @@ require 'spec_helper'
RSpec.describe 'Groups > Members > Sort members', :js do
include Spec::Support::Helpers::Features::MembersHelpers
- let(:owner) { create(:user, name: 'John Doe') }
- let(:developer) { create(:user, name: 'Mary Jane', last_sign_in_at: 5.days.ago) }
+ let(:owner) { create(:user, name: 'John Doe', created_at: 5.days.ago, last_activity_on: Date.today) }
+ let(:developer) { create(:user, name: 'Mary Jane', created_at: 1.day.ago, last_sign_in_at: 5.days.ago, last_activity_on: Date.today - 5) }
let(:group) { create(:group) }
before do
@@ -50,6 +50,42 @@ RSpec.describe 'Groups > Members > Sort members', :js do
expect_sort_by('Max role', :desc)
end
+ it 'sorts by user created on ascending' do
+ visit_members_list(sort: :oldest_created_user)
+
+ expect(first_row.text).to include(owner.name)
+ expect(second_row.text).to include(developer.name)
+
+ expect_sort_by('Created on', :asc)
+ end
+
+ it 'sorts by user created on descending' do
+ visit_members_list(sort: :recent_created_user)
+
+ expect(first_row.text).to include(developer.name)
+ expect(second_row.text).to include(owner.name)
+
+ expect_sort_by('Created on', :desc)
+ end
+
+ it 'sorts by last activity ascending' do
+ visit_members_list(sort: :oldest_last_activity)
+
+ expect(first_row.text).to include(developer.name)
+ expect(second_row.text).to include(owner.name)
+
+ expect_sort_by('Last activity', :asc)
+ end
+
+ it 'sorts by last activity descending' do
+ visit_members_list(sort: :recent_last_activity)
+
+ expect(first_row.text).to include(owner.name)
+ expect(second_row.text).to include(developer.name)
+
+ expect_sort_by('Last activity', :desc)
+ end
+
it 'sorts by access granted ascending' do
visit_members_list(sort: :last_joined)
diff --git a/spec/features/groups/milestone_spec.rb b/spec/features/groups/milestone_spec.rb
index 4edf27e8fa4..42eaa8358a1 100644
--- a/spec/features/groups/milestone_spec.rb
+++ b/spec/features/groups/milestone_spec.rb
@@ -66,7 +66,7 @@ RSpec.describe 'Group milestones' do
context 'when no milestones' do
it 'renders no milestones text' do
visit group_milestones_path(group)
- expect(page).to have_content('No milestones to show')
+ expect(page).to have_content('Use milestones to track issues and merge requests')
end
end
diff --git a/spec/features/groups/milestones_sorting_spec.rb b/spec/features/groups/milestones_sorting_spec.rb
index a06e64fdee0..22d7ff91d41 100644
--- a/spec/features/groups/milestones_sorting_spec.rb
+++ b/spec/features/groups/milestones_sorting_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe 'Milestones sorting', :js do
sign_in(user)
end
- it 'visit group milestones and sort by due_date_asc' do
+ it 'visit group milestones and sort by due_date_asc', :js do
visit group_milestones_path(group)
expect(page).to have_button('Due soon')
@@ -27,13 +27,13 @@ RSpec.describe 'Milestones sorting', :js do
expect(page.all('ul.content-list > li strong > a').map(&:text)).to eq(['v2.0', 'v2.0', 'v3.0', 'v1.0', 'v1.0'])
end
- click_button 'Due soon'
+ within '[data-testid=milestone_sort_by_dropdown]' do
+ click_button 'Due soon'
+ expect(find('.gl-new-dropdown-contents').all('.gl-new-dropdown-item-text-wrapper p').map(&:text)).to eq(['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending'])
- expect(find('ul.dropdown-menu-sort li').all('a').map(&:text)).to eq(['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending'])
-
- click_link 'Due later'
-
- expect(page).to have_button('Due later')
+ click_button 'Due later'
+ expect(page).to have_button('Due later')
+ end
# assert descending sorting
within '.milestones' do
diff --git a/spec/features/groups/settings/ci_cd_spec.rb b/spec/features/groups/settings/ci_cd_spec.rb
index 8851aeb6381..c5ad524e647 100644
--- a/spec/features/groups/settings/ci_cd_spec.rb
+++ b/spec/features/groups/settings/ci_cd_spec.rb
@@ -5,52 +5,73 @@ require 'spec_helper'
RSpec.describe 'Group CI/CD settings' do
include WaitForRequests
- let(:user) { create(:user) }
- let(:group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group, reload: true) { create(:group) }
- before do
+ before_all do
group.add_owner(user)
+ end
+
+ before do
sign_in(user)
end
- describe 'new group runners view banner' do
- it 'displays banner' do
- visit group_settings_ci_cd_path(group)
+ describe 'Runners section' do
+ let(:shared_runners_toggle) { page.find('[data-testid="enable-runners-toggle"]') }
+
+ context 'with runner_list_group_view_vue_ui enabled' do
+ before do
+ visit group_settings_ci_cd_path(group)
+ end
+
+ it 'displays the new group runners view banner' do
+ expect(page).to have_content(s_('Runners|New group runners view'))
+ expect(page).to have_link(href: group_runners_path(group))
+ end
- expect(page).to have_content(s_('Runners|New group runners view'))
- expect(page).to have_link(href: group_runners_path(group))
+ it 'has "Enable shared runners for this group" toggle', :js do
+ expect(shared_runners_toggle).to have_content(_('Enable shared runners for this group'))
+ end
end
- it 'does not display banner' do
- stub_feature_flags(runner_list_group_view_vue_ui: false)
+ context 'with runner_list_group_view_vue_ui disabled' do
+ before do
+ stub_feature_flags(runner_list_group_view_vue_ui: false)
- visit group_settings_ci_cd_path(group)
+ visit group_settings_ci_cd_path(group)
+ end
- expect(page).not_to have_content(s_('Runners|New group runners view'))
- expect(page).not_to have_link(href: group_runners_path(group))
- end
- end
+ it 'does not display the new group runners view banner' do
+ expect(page).not_to have_content(s_('Runners|New group runners view'))
+ expect(page).not_to have_link(href: group_runners_path(group))
+ end
- describe 'runners registration token' do
- let!(:token) { group.runners_token }
+ it 'has "Enable shared runners for this group" toggle', :js do
+ expect(shared_runners_toggle).to have_content(_('Enable shared runners for this group'))
+ end
- before do
- visit group_settings_ci_cd_path(group)
- end
+ context 'with runners registration token' do
+ let!(:token) { group.runners_token }
- it 'has a registration token' do
- expect(page.find('#registration_token')).to have_content(token)
- end
+ before do
+ visit group_settings_ci_cd_path(group)
+ end
- describe 'reload registration token' do
- let(:page_token) { find('#registration_token').text }
+ it 'displays the registration token' do
+ expect(page.find('#registration_token')).to have_content(token)
+ end
- before do
- click_button 'Reset registration token'
- end
+ describe 'reload registration token' do
+ let(:page_token) { find('#registration_token').text }
+
+ before do
+ click_button 'Reset registration token'
+ end
- it 'changes registration token' do
- expect(page_token).not_to eq token
+ it 'changes the registration token' do
+ expect(page_token).not_to eq token
+ end
+ end
end
end
end
diff --git a/spec/features/issuables/shortcuts_issuable_spec.rb b/spec/features/issuables/shortcuts_issuable_spec.rb
index 7e8f39c47a7..528420062dd 100644
--- a/spec/features/issuables/shortcuts_issuable_spec.rb
+++ b/spec/features/issuables/shortcuts_issuable_spec.rb
@@ -15,12 +15,20 @@ RSpec.describe 'Blob shortcuts', :js do
end
shared_examples "quotes the selected text" do
- it "quotes the selected text", :quarantine do
- select_element('.note-text')
+ it 'quotes the selected text in main comment form', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/356388' do
+ select_element('#notes-list .note:first-child .note-text')
find('body').native.send_key('r')
expect(find('.js-main-target-form .js-vue-comment-form').value).to include(note_text)
end
+
+ it 'quotes the selected text in the discussion reply form', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/356388' do
+ find('#notes-list .note:first-child .js-reply-button').click
+ select_element('#notes-list .note:first-child .note-text')
+ find('body').native.send_key('r')
+
+ expect(find('#notes-list .note:first-child .js-vue-markdown-field .js-gfm-input').value).to include(note_text)
+ end
end
describe 'pressing "r"' do
diff --git a/spec/features/issues/incident_issue_spec.rb b/spec/features/issues/incident_issue_spec.rb
index 2956ddede2e..a2519a44604 100644
--- a/spec/features/issues/incident_issue_spec.rb
+++ b/spec/features/issues/incident_issue_spec.rb
@@ -56,5 +56,37 @@ RSpec.describe 'Incident Detail', :js do
end
end
end
+
+ context 'when on summary tab' do
+ before do
+ click_link 'Summary'
+ end
+
+ it 'shows the summary tab with all components' do
+ page.within('.issuable-details') do
+ hidden_items = find_all('.js-issue-widgets')
+
+ # Linked Issues/MRs and comment box
+ expect(hidden_items.count).to eq(2)
+
+ expect(hidden_items).to all(be_visible)
+ end
+ end
+ end
+
+ context 'when on alert details tab' do
+ before do
+ click_link 'Alert details'
+ end
+
+ it 'does not show the linked issues and notes/comment components' do
+ page.within('.issuable-details') do
+ hidden_items = find_all('.js-issue-widgets')
+
+ # Linked Issues/MRs and comment box are hidden on page
+ expect(hidden_items.count).to eq(0)
+ end
+ end
+ end
end
end
diff --git a/spec/features/issues/user_creates_issue_spec.rb b/spec/features/issues/user_creates_issue_spec.rb
index 446f13dc4d0..8a5e33ba18c 100644
--- a/spec/features/issues/user_creates_issue_spec.rb
+++ b/spec/features/issues/user_creates_issue_spec.rb
@@ -71,6 +71,12 @@ RSpec.describe "User creates issue" do
expect(preview).to have_css("gl-emoji")
expect(textarea).not_to be_visible
+
+ click_button("Write")
+ fill_in("Description", with: "/confidential")
+ click_button("Preview")
+
+ expect(form).to have_content('Makes this issue confidential.')
end
end
end
diff --git a/spec/features/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb
index 8c906e6a27c..3b440002cb5 100644
--- a/spec/features/issues/user_edits_issue_spec.rb
+++ b/spec/features/issues/user_edits_issue_spec.rb
@@ -35,6 +35,12 @@ RSpec.describe "Issues > User edits issue", :js do
end
expect(form).to have_button("Write")
+
+ click_button("Write")
+ fill_in("Description", with: "/confidential")
+ click_button("Preview")
+
+ expect(form).to have_content('Makes this issue confidential.')
end
it 'allows user to select unassigned' do
diff --git a/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb b/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb
index 6473fe01052..311818d2d15 100644
--- a/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb
+++ b/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb
@@ -6,6 +6,10 @@ RSpec.describe 'Issues > Real-time sidebar', :js do
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:user) { create(:user) }
+ let_it_be(:label) { create(:label, project: project, name: 'Development') }
+
+ let(:labels_widget) { find('[data-testid="sidebar-labels"]') }
+ let(:labels_value) { find('[data-testid="value-wrapper"]') }
before_all do
project.add_developer(user)
@@ -32,4 +36,37 @@ RSpec.describe 'Issues > Real-time sidebar', :js do
expect(page.find('.assignee')).to have_content user.name
end
end
+
+ it 'updates the label in real-time' do
+ Capybara::Session.new(:other_session)
+
+ using_session :other_session do
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ expect(labels_value).to have_content('None')
+ end
+
+ sign_in(user)
+
+ visit project_issue_path(project, issue)
+ wait_for_requests
+ expect(labels_value).to have_content('None')
+
+ page.within(labels_widget) do
+ click_on 'Edit'
+ end
+
+ wait_for_all_requests
+
+ click_button label.name
+ click_button 'Close'
+
+ wait_for_requests
+
+ expect(labels_value).to have_content(label.name)
+
+ using_session :other_session do
+ expect(labels_value).to have_content(label.name)
+ end
+ end
end
diff --git a/spec/features/jira_connect/subscriptions_spec.rb b/spec/features/jira_connect/subscriptions_spec.rb
index 0b7321bf271..94c293c88b9 100644
--- a/spec/features/jira_connect/subscriptions_spec.rb
+++ b/spec/features/jira_connect/subscriptions_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe 'Subscriptions Content Security Policy' do
it 'appends to CSP directives' do
visit jira_connect_subscriptions_path(jwt: jwt)
- is_expected.to include("frame-ancestors 'self' https://*.atlassian.net")
+ is_expected.to include("frame-ancestors 'self' https://*.atlassian.net https://*.jira.com")
is_expected.to include("script-src 'self' https://some-cdn.test https://connect-cdn.atl-paas.net")
is_expected.to include("style-src 'self' https://some-cdn.test 'unsafe-inline'")
end
diff --git a/spec/features/jira_oauth_provider_authorize_spec.rb b/spec/features/jira_oauth_provider_authorize_spec.rb
index daecae56101..a216d2d44b2 100644
--- a/spec/features/jira_oauth_provider_authorize_spec.rb
+++ b/spec/features/jira_oauth_provider_authorize_spec.rb
@@ -4,13 +4,13 @@ require 'spec_helper'
RSpec.describe 'JIRA OAuth Provider' do
describe 'JIRA DVCS OAuth Authorization' do
- let(:application) { create(:oauth_application, redirect_uri: oauth_jira_callback_url, scopes: 'read_user') }
+ let(:application) { create(:oauth_application, redirect_uri: oauth_jira_dvcs_callback_url, scopes: 'read_user') }
before do
sign_in(user)
- visit oauth_jira_authorize_path(client_id: application.uid,
- redirect_uri: oauth_jira_callback_url,
+ visit oauth_jira_dvcs_authorize_path(client_id: application.uid,
+ redirect_uri: oauth_jira_dvcs_callback_url,
response_type: 'code',
state: 'my_state',
scope: 'read_user')
diff --git a/spec/features/merge_request/user_merges_merge_request_spec.rb b/spec/features/merge_request/user_merges_merge_request_spec.rb
index d1be93cae02..a861ca2eea5 100644
--- a/spec/features/merge_request/user_merges_merge_request_spec.rb
+++ b/spec/features/merge_request/user_merges_merge_request_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe "User merges a merge request", :js do
end
shared_examples "fast forward merge a merge request" do
- it "merges a merge request", :sidekiq_might_not_need_inline do
+ it "merges a merge request", :sidekiq_inline do
expect(page).to have_content("Fast-forward merge without a merge commit").and have_button("Merge")
page.within(".mr-state-widget") do
@@ -42,4 +42,23 @@ RSpec.describe "User merges a merge request", :js do
it_behaves_like "fast forward merge a merge request"
end
end
+
+ context 'sidebar merge requests counter' do
+ let(:project) { create(:project, :public, :repository) }
+ let!(:merge_request) { create(:merge_request, source_project: project) }
+
+ it 'decrements the open MR count', :sidekiq_inline do
+ create(:merge_request, source_project: project, source_branch: 'branch-1')
+
+ visit(merge_request_path(merge_request))
+
+ expect(page).to have_css('.js-merge-counter', text: '2')
+
+ page.within(".mr-state-widget") do
+ click_button("Merge")
+ end
+
+ expect(page).to have_css('.js-merge-counter', text: '1')
+ end
+ end
end
diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb
index 1779567624c..ad602afe68a 100644
--- a/spec/features/merge_request/user_posts_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_notes_spec.rb
@@ -169,7 +169,7 @@ RSpec.describe 'Merge request > User posts notes', :js do
end
page.within('.modal') do
- click_button('OK', match: :first)
+ click_button('Cancel editing', match: :first)
end
expect(find('.js-note-text').text).to eq ''
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 27f7c699c50..c9b21d4a4ae 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -17,6 +17,9 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
project.add_maintainer(user)
project_only_mwps.add_maintainer(user)
sign_in(user)
+
+ stub_feature_flags(refactor_mr_widgets_extensions: false)
+ stub_feature_flags(refactor_mr_widgets_extensions_user: false)
end
context 'new merge request', :sidekiq_might_not_need_inline 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 beb658bb7a0..f77a42ee506 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
@@ -379,4 +379,41 @@ RSpec.describe 'User comments on a diff', :js do
end
end
end
+
+ context 'failed to load metadata' do
+ let(:dummy_controller) do
+ Class.new(Projects::MergeRequests::DiffsController) do
+ def diffs_metadata
+ render json: '', status: :internal_server_error
+ end
+ end
+ end
+
+ before do
+ stub_const('Projects::MergeRequests::DiffsController', dummy_controller)
+
+ click_diff_line(find_by_scrolling("[id='#{sample_compare.changes[1][:line_code]}']"))
+
+ page.within('.js-discussion-note-form') do
+ fill_in('note_note', with: "```suggestion\n# change to a comment\n```")
+ click_button('Add comment now')
+ end
+
+ wait_for_requests
+
+ visit(project_merge_request_path(project, merge_request))
+
+ wait_for_requests
+ end
+
+ it 'displays an error' do
+ page.within('.discussion-notes') do
+ click_button('Apply suggestion')
+
+ wait_for_requests
+
+ expect(page).to have_content('Unable to fully load the default commit message. You can still apply this suggestion and the commit message will be correct.')
+ end
+ end
+ end
end
diff --git a/spec/features/merge_requests/user_mass_updates_spec.rb b/spec/features/merge_requests/user_mass_updates_spec.rb
index f781ba0827c..a15b6072e70 100644
--- a/spec/features/merge_requests/user_mass_updates_spec.rb
+++ b/spec/features/merge_requests/user_mass_updates_spec.rb
@@ -70,7 +70,7 @@ RSpec.describe 'Merge requests > User mass updates', :js do
it 'updates merge request with assignee' do
change_assignee(user.name)
- expect(find('.issuable-meta a.author-link')[:title]).to eq "Attention requested from assignee #{user.name}, go to their profile."
+ expect(find('.issuable-meta a.author-link')[:title]).to eq "Attention requested from assignee #{user.name}"
end
end
end
diff --git a/spec/features/milestones/user_deletes_milestone_spec.rb b/spec/features/milestones/user_deletes_milestone_spec.rb
index ede9faed876..40626407642 100644
--- a/spec/features/milestones/user_deletes_milestone_spec.rb
+++ b/spec/features/milestones/user_deletes_milestone_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe "User deletes milestone", :js do
click_button("Delete")
click_button("Delete milestone")
- expect(page).to have_content("No milestones to show")
+ expect(page).to have_content("Use milestones to track issues and merge requests over a fixed period of time")
visit(activity_project_path(project))
diff --git a/spec/features/oauth_login_spec.rb b/spec/features/oauth_login_spec.rb
index 93674057fed..ea5bb8c33b2 100644
--- a/spec/features/oauth_login_spec.rb
+++ b/spec/features/oauth_login_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe 'OAuth Login', :js, :allow_forgery_protection do
end
providers = [:github, :twitter, :bitbucket, :gitlab, :google_oauth2,
- :facebook, :cas3, :auth0, :authentiq, :salesforce, :dingtalk]
+ :facebook, :cas3, :auth0, :authentiq, :salesforce, :dingtalk, :alicloud]
around do |example|
with_omniauth_full_host { example.run }
diff --git a/spec/features/profiles/personal_access_tokens_spec.rb b/spec/features/profiles/personal_access_tokens_spec.rb
index f1e5658cd7b..8cbc0491441 100644
--- a/spec/features/profiles/personal_access_tokens_spec.rb
+++ b/spec/features/profiles/personal_access_tokens_spec.rb
@@ -47,14 +47,14 @@ RSpec.describe 'Profile > Personal Access Tokens', :js do
click_on "1"
# Scopes
- check "api"
+ check "read_api"
check "read_user"
click_on "Create personal access token"
expect(active_personal_access_tokens).to have_text(name)
expect(active_personal_access_tokens).to have_text('in')
- expect(active_personal_access_tokens).to have_text('api')
+ expect(active_personal_access_tokens).to have_text('read_api')
expect(active_personal_access_tokens).to have_text('read_user')
expect(created_personal_access_token).not_to be_empty
end
diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb
index 026da5814e3..4b6ed458c68 100644
--- a/spec/features/profiles/user_edit_profile_spec.rb
+++ b/spec/features/profiles/user_edit_profile_spec.rb
@@ -8,8 +8,6 @@ RSpec.describe 'User edit profile' do
let(:user) { create(:user) }
before do
- stub_feature_flags(improved_emoji_picker: false)
-
sign_in(user)
visit(profile_path)
end
@@ -169,10 +167,9 @@ RSpec.describe 'User edit profile' do
context 'user status', :js do
def select_emoji(emoji_name, is_modal = false)
- emoji_menu_class = is_modal ? '.js-modal-status-emoji-menu' : '.js-status-emoji-menu'
- toggle_button = find('.js-toggle-emoji-menu')
+ toggle_button = find('.emoji-menu-toggle-button')
toggle_button.click
- emoji_button = find(%Q{#{emoji_menu_class} .js-emoji-btn gl-emoji[data-name="#{emoji_name}"]})
+ emoji_button = find("gl-emoji[data-name=\"#{emoji_name}\"]")
emoji_button.click
end
@@ -207,7 +204,7 @@ RSpec.describe 'User edit profile' do
end
it 'adds message and emoji to user status' do
- emoji = 'tanabata_tree'
+ emoji = '8ball'
message = 'Playing outside'
select_emoji(emoji)
fill_in 'js-status-message-field', with: message
@@ -356,7 +353,7 @@ RSpec.describe 'User edit profile' do
end
it 'adds emoji to user status' do
- emoji = 'biohazard'
+ emoji = '8ball'
open_user_status_modal
select_emoji(emoji, true)
set_user_status_in_modal
@@ -387,18 +384,18 @@ RSpec.describe 'User edit profile' do
it 'opens the emoji modal again after closing it' do
open_user_status_modal
- select_emoji('biohazard', true)
+ select_emoji('8ball', true)
- find('.js-toggle-emoji-menu').click
+ find('.emoji-menu-toggle-button').click
- expect(page).to have_selector('.emoji-menu')
+ expect(page).to have_selector('.emoji-picker-emoji')
end
it 'does not update the awards panel emoji' do
project.add_maintainer(user)
visit(project_issue_path(project, issue))
- emoji = 'biohazard'
+ emoji = '8ball'
open_user_status_modal
select_emoji(emoji, true)
@@ -420,7 +417,7 @@ RSpec.describe 'User edit profile' do
end
it 'adds message and emoji to user status' do
- emoji = 'tanabata_tree'
+ emoji = '8ball'
message = 'Playing outside'
open_user_status_modal
select_emoji(emoji, true)
@@ -495,9 +492,7 @@ RSpec.describe 'User edit profile' do
open_user_status_modal
find('.js-status-message-field').native.send_keys(message)
- within('.js-toggle-emoji-menu') do
- expect(page).to have_emoji('speech_balloon')
- end
+ expect(page).to have_emoji('speech_balloon')
end
context 'note header' do
diff --git a/spec/features/profiles/user_visits_profile_preferences_page_spec.rb b/spec/features/profiles/user_visits_profile_preferences_page_spec.rb
index e19e29bf63a..4c61e8d45e4 100644
--- a/spec/features/profiles/user_visits_profile_preferences_page_spec.rb
+++ b/spec/features/profiles/user_visits_profile_preferences_page_spec.rb
@@ -18,14 +18,6 @@ RSpec.describe 'User visits the profile preferences page', :js do
end
describe 'User changes their syntax highlighting theme', :js do
- it 'creates a flash message' do
- choose 'user_color_scheme_id_5'
-
- wait_for_requests
-
- expect_preferences_saved_message
- end
-
it 'updates their preference' do
choose 'user_color_scheme_id_5'
diff --git a/spec/features/projects/blobs/balsamiq_spec.rb b/spec/features/projects/blobs/balsamiq_spec.rb
deleted file mode 100644
index bce60856544..00000000000
--- a/spec/features/projects/blobs/balsamiq_spec.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Balsamiq file blob', :js do
- let(:project) { create(:project, :public, :repository) }
-
- before do
- visit project_blob_path(project, 'add-balsamiq-file/files/images/balsamiq.bmpr')
-
- wait_for_requests
- end
-
- it 'displays Balsamiq file content' do
- expect(page).to have_content("Mobile examples")
- end
-end
diff --git a/spec/features/projects/blobs/blob_line_permalink_updater_spec.rb b/spec/features/projects/blobs/blob_line_permalink_updater_spec.rb
index 11e2d24c36a..9b0edcd09d2 100644
--- a/spec/features/projects/blobs/blob_line_permalink_updater_spec.rb
+++ b/spec/features/projects/blobs/blob_line_permalink_updater_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe 'Blob button line permalinks (BlobLinePermalinkUpdater)', :js do
find('#L3').click
find("#L5").click
- expect(find('.js-data-file-blob-permalink-url')['href']).to eq(get_absolute_url(project_blob_path(project, tree_join(sha, path), anchor: "LC5")))
+ expect(find('.js-data-file-blob-permalink-url')['href']).to eq(get_absolute_url(project_blob_path(project, tree_join(sha, path), anchor: "L5")))
end
it 'with initial fragment hash, changes fragment hash if line number clicked' do
@@ -50,7 +50,7 @@ RSpec.describe 'Blob button line permalinks (BlobLinePermalinkUpdater)', :js do
find('#L3').click
find("#L5").click
- expect(find('.js-data-file-blob-permalink-url')['href']).to eq(get_absolute_url(project_blob_path(project, tree_join(sha, path), anchor: "LC5")))
+ expect(find('.js-data-file-blob-permalink-url')['href']).to eq(get_absolute_url(project_blob_path(project, tree_join(sha, path), anchor: "L5")))
end
end
@@ -75,7 +75,7 @@ RSpec.describe 'Blob button line permalinks (BlobLinePermalinkUpdater)', :js do
find('#L3').click
find("#L5").click
- expect(find('.js-blob-blame-link')['href']).to eq(get_absolute_url(project_blame_path(project, tree_join('master', path), anchor: "LC5")))
+ expect(find('.js-blob-blame-link')['href']).to eq(get_absolute_url(project_blame_path(project, tree_join('master', path), anchor: "L5")))
end
it 'with initial fragment hash, changes fragment hash if line number clicked' do
@@ -86,7 +86,7 @@ RSpec.describe 'Blob button line permalinks (BlobLinePermalinkUpdater)', :js do
find('#L3').click
find("#L5").click
- expect(find('.js-blob-blame-link')['href']).to eq(get_absolute_url(project_blame_path(project, tree_join('master', path), anchor: "LC5")))
+ expect(find('.js-blob-blame-link')['href']).to eq(get_absolute_url(project_blame_path(project, tree_join('master', path), anchor: "L5")))
end
end
end
diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb
index 363d08da024..d906bb396be 100644
--- a/spec/features/projects/branches_spec.rb
+++ b/spec/features/projects/branches_spec.rb
@@ -36,6 +36,8 @@ RSpec.describe 'Branches' do
expect(page).to have_content(sorted_branches(repository, count: 5, sort_by: :updated_desc, state: 'active'))
expect(page).to have_content(sorted_branches(repository, count: 4, sort_by: :updated_asc, state: 'stale'))
+ expect(page).to have_button('Copy branch name')
+
expect(page).to have_link('Show more active branches', href: project_branches_filtered_path(project, state: 'active'))
expect(page).not_to have_content('Show more stale branches')
end
@@ -197,14 +199,6 @@ RSpec.describe 'Branches' do
project.add_maintainer(user)
end
- describe 'Initial branches page' do
- it 'shows description for admin' do
- visit project_branches_filtered_path(project, state: 'all')
-
- expect(page).to have_content("Protected branches can be managed in project settings")
- end
- end
-
it 'shows the merge request button' do
visit project_branches_path(project)
diff --git a/spec/features/projects/cluster_agents_spec.rb b/spec/features/projects/cluster_agents_spec.rb
index e9162359940..5d931afe4a7 100644
--- a/spec/features/projects/cluster_agents_spec.rb
+++ b/spec/features/projects/cluster_agents_spec.rb
@@ -27,7 +27,6 @@ RSpec.describe 'ClusterAgents', :js do
end
it 'displays empty state', :aggregate_failures do
- expect(page).to have_content('Install a new agent')
expect(page).to have_selector('.empty-state')
end
end
diff --git a/spec/features/projects/clusters/eks_spec.rb b/spec/features/projects/clusters/eks_spec.rb
index 0dd6effe551..7e599ff1198 100644
--- a/spec/features/projects/clusters/eks_spec.rb
+++ b/spec/features/projects/clusters/eks_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe 'AWS EKS Cluster', :js do
visit project_clusters_path(project)
click_button(class: 'dropdown-toggle-split')
- click_link 'Create a new cluster'
+ click_link 'Create a cluster (certificate - deprecated)'
end
context 'when user creates a cluster on AWS EKS' do
diff --git a/spec/features/projects/clusters/gcp_spec.rb b/spec/features/projects/clusters/gcp_spec.rb
index 90d7e2d02e9..491121a3743 100644
--- a/spec/features/projects/clusters/gcp_spec.rb
+++ b/spec/features/projects/clusters/gcp_spec.rb
@@ -135,7 +135,7 @@ RSpec.describe 'Gcp Cluster', :js do
visit project_clusters_path(project)
click_button(class: 'dropdown-toggle-split')
- click_link 'Connect with a certificate'
+ click_link 'Connect a cluster (certificate - deprecated)'
end
it 'user sees the "Environment scope" field' do
@@ -154,7 +154,6 @@ RSpec.describe 'Gcp Cluster', :js do
it 'user sees creation form with the successful message' do
expect(page).to have_content('Kubernetes cluster integration was successfully removed.')
- expect(page).to have_link('Connect with a certificate')
end
end
end
@@ -220,6 +219,6 @@ RSpec.describe 'Gcp Cluster', :js do
def visit_create_cluster_page
click_button(class: 'dropdown-toggle-split')
- click_link 'Create a new cluster'
+ click_link 'Create a cluster (certificate - deprecated)'
end
end
diff --git a/spec/features/projects/clusters/user_spec.rb b/spec/features/projects/clusters/user_spec.rb
index 3fd78d338da..b6bfaa3a9b9 100644
--- a/spec/features/projects/clusters/user_spec.rb
+++ b/spec/features/projects/clusters/user_spec.rb
@@ -25,8 +25,8 @@ RSpec.describe 'User Cluster', :js do
before do
visit project_clusters_path(project)
- click_link 'Certificate'
- click_link 'Connect with a certificate'
+ click_button(class: 'dropdown-toggle-split')
+ click_link 'Connect a cluster (certificate - deprecated)'
end
context 'when user filled form with valid parameters' do
@@ -108,7 +108,6 @@ RSpec.describe 'User Cluster', :js do
it 'user sees creation form with the successful message' do
expect(page).to have_content('Kubernetes cluster integration was successfully removed.')
- expect(page).to have_link('Connect with a certificate')
end
end
end
diff --git a/spec/features/projects/clusters_spec.rb b/spec/features/projects/clusters_spec.rb
index b9a544144c3..0ecd7795964 100644
--- a/spec/features/projects/clusters_spec.rb
+++ b/spec/features/projects/clusters_spec.rb
@@ -20,7 +20,6 @@ RSpec.describe 'Clusters', :js do
end
it 'sees empty state' do
- expect(page).to have_link('Connect with a certificate')
expect(page).to have_selector('.empty-state')
end
end
@@ -222,11 +221,11 @@ RSpec.describe 'Clusters', :js do
visit project_clusters_path(project)
click_button(class: 'dropdown-toggle-split')
- click_link 'Create a new cluster'
+ click_link 'Create a cluster (certificate - deprecated)'
end
def visit_connect_cluster_page
click_button(class: 'dropdown-toggle-split')
- click_link 'Connect with a certificate'
+ click_link 'Connect a cluster (certificate - deprecated)'
end
end
diff --git a/spec/features/projects/commits/multi_view_diff_spec.rb b/spec/features/projects/commits/multi_view_diff_spec.rb
index ecdd398c739..009dd05c6d1 100644
--- a/spec/features/projects/commits/multi_view_diff_spec.rb
+++ b/spec/features/projects/commits/multi_view_diff_spec.rb
@@ -27,17 +27,11 @@ RSpec.describe 'Multiple view Diffs', :js do
context 'when :rendered_diffs_viewer is off' do
context 'and diff does not have ipynb' do
- include_examples "no multiple viewers", 'ddd0f15ae83993f5cb66a927a28673882e99100b'
+ it_behaves_like "no multiple viewers", 'ddd0f15ae83993f5cb66a927a28673882e99100b'
end
context 'and diff has ipynb' do
- include_examples "no multiple viewers", '5d6ed1503801ca9dc28e95eeb85a7cf863527aee'
-
- it 'shows the transformed diff' do
- diff = page.find('.diff-file, .file-holder', match: :first)
-
- expect(diff['innerHTML']).to include('%% Cell type:markdown id:0aac5da7-745c-4eda-847a-3d0d07a1bb9b tags:')
- end
+ it_behaves_like "no multiple viewers", '5d6ed1503801ca9dc28e95eeb85a7cf863527aee'
end
end
@@ -45,14 +39,28 @@ RSpec.describe 'Multiple view Diffs', :js do
let(:feature_flag_on) { true }
context 'and diff does not include ipynb' do
- include_examples "no multiple viewers", 'ddd0f15ae83993f5cb66a927a28673882e99100b'
- end
+ it_behaves_like "no multiple viewers", 'ddd0f15ae83993f5cb66a927a28673882e99100b'
- context 'and opening a diff with ipynb' do
- context 'but the changes are not renderable' do
- include_examples "no multiple viewers", 'a867a602d2220e5891b310c07d174fbe12122830'
+ context 'and in inline diff' do
+ let(:ref) { '54fcc214b94e78d7a41a9a8fe6d87a5e59500e51' }
+
+ it 'does not change display for non-ipynb' do
+ expect(page).to have_selector line_with_content('new', 1)
+ end
end
+ context 'and in parallel diff' do
+ let(:ref) { '54fcc214b94e78d7a41a9a8fe6d87a5e59500e51' }
+
+ it 'does not change display for non-ipynb' do
+ page.find('#parallel-diff-btn').click
+
+ expect(page).to have_selector line_with_content('new', 1)
+ end
+ end
+ end
+
+ context 'and opening a diff with ipynb' do
it 'loads the rendered diff as hidden' do
diff = page.find('.diff-file, .file-holder', match: :first)
@@ -76,10 +84,55 @@ RSpec.describe 'Multiple view Diffs', :js do
expect(classes_for_element(diff, 'toHideBtn')).not_to include('selected')
expect(classes_for_element(diff, 'toShowBtn')).to include('selected')
end
+
+ it 'transforms the diff' do
+ diff = page.find('.diff-file, .file-holder', match: :first)
+
+ expect(diff['innerHTML']).to include('%% Cell type:markdown id:0aac5da7-745c-4eda-847a-3d0d07a1bb9b tags:')
+ end
+
+ context 'on parallel view' do
+ before do
+ page.find('#parallel-diff-btn').click
+ end
+
+ it 'lines without mapping cannot receive comments' do
+ expect(page).not_to have_selector('td.line_content.nomappinginraw ~ td.diff-line-num > .add-diff-note')
+ expect(page).to have_selector('td.line_content:not(.nomappinginraw) ~ td.diff-line-num > .add-diff-note')
+ end
+
+ it 'lines numbers without mapping are empty' do
+ expect(page).not_to have_selector('td.nomappinginraw + td.diff-line-num')
+ expect(page).to have_selector('td.nomappinginraw + td.diff-line-num', visible: false)
+ end
+
+ it 'transforms the diff' do
+ diff = page.find('.diff-file, .file-holder', match: :first)
+
+ expect(diff['innerHTML']).to include('%% Cell type:markdown id:0aac5da7-745c-4eda-847a-3d0d07a1bb9b tags:')
+ end
+ end
+
+ context 'on inline view' do
+ it 'lines without mapping cannot receive comments' do
+ expect(page).not_to have_selector('tr.line_holder[class$="nomappinginraw"] > td.diff-line-num > .add-diff-note')
+ expect(page).to have_selector('tr.line_holder:not([class$="nomappinginraw"]) > td.diff-line-num > .add-diff-note')
+ end
+
+ it 'lines numbers without mapping are empty' do
+ elements = page.all('tr.line_holder[class$="nomappinginraw"] > td.diff-line-num').map { |e| e.text(:all) }
+
+ expect(elements).to all(be == "")
+ end
+ end
end
end
def classes_for_element(node, data_diff_entity, visible: true)
node.find("[data-diff-toggle-entity=\"#{data_diff_entity}\"]", visible: visible)[:class]
end
+
+ def line_with_content(old_or_new, line_number)
+ "td.#{old_or_new}_line.diff-line-num[data-linenumber=\"#{line_number}\"] > a[data-linenumber=\"#{line_number}\"]"
+ end
end
diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb
index 99137018d6b..6cf59394af7 100644
--- a/spec/features/projects/environments/environments_spec.rb
+++ b/spec/features/projects/environments/environments_spec.rb
@@ -70,7 +70,7 @@ RSpec.describe 'Environments page', :js do
it 'shows no environments' do
visit_environments(project, scope: 'stopped')
- expect(page).to have_content('You don\'t have any environments right now')
+ expect(page).to have_content(s_('Environments|You don\'t have any stopped environments.'))
end
end
@@ -99,7 +99,7 @@ RSpec.describe 'Environments page', :js do
it 'shows no environments' do
visit_environments(project, scope: 'available')
- expect(page).to have_content('You don\'t have any environments right now')
+ expect(page).to have_content(s_('Environments|You don\'t have any environments.'))
end
end
@@ -120,7 +120,7 @@ RSpec.describe 'Environments page', :js do
end
it 'does not show environments and counters are set to zero' do
- expect(page).to have_content('You don\'t have any environments right now')
+ expect(page).to have_content(s_('Environments|You don\'t have any environments.'))
expect(page).to have_link("#{_('Available')} 0")
expect(page).to have_link("#{_('Stopped')} 0")
diff --git a/spec/features/projects/import_export/import_file_spec.rb b/spec/features/projects/import_export/import_file_spec.rb
index 1e5c5d33ad9..c7fbaa85483 100644
--- a/spec/features/projects/import_export/import_file_spec.rb
+++ b/spec/features/projects/import_export/import_file_spec.rb
@@ -24,9 +24,9 @@ RSpec.describe 'Import/Export - project import integration test', :js do
context 'when selecting the namespace' do
let(:user) { create(:admin) }
let!(:namespace) { user.namespace }
- let(:randomHex) { SecureRandom.hex }
- let(:project_name) { 'Test Project Name' + randomHex }
- let(:project_path) { 'test-project-name' + randomHex }
+ let(:random_hex) { SecureRandom.hex }
+ let(:project_name) { 'Test Project Name' + random_hex }
+ let(:project_path) { 'test-project-name' + random_hex }
it 'user imports an exported project successfully', :sidekiq_might_not_need_inline do
visit new_project_path
diff --git a/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb b/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb
index 762f9c33510..48ae70d3ec9 100644
--- a/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb
+++ b/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb
@@ -10,8 +10,8 @@ RSpec.describe 'User uploads new design', :js do
let(:issue) { create(:issue, project: project) }
before do
- # Cause of raising query limiting threshold https://gitlab.com/gitlab-org/gitlab/-/issues/347334
- stub_const("Gitlab::QueryLimiting::Transaction::THRESHOLD", 102)
+ # Cause of raising query limiting threshold https://gitlab.com/gitlab-org/gitlab/-/issues/358845
+ stub_const("Gitlab::QueryLimiting::Transaction::THRESHOLD", 106)
sign_in(user)
enable_design_management(feature_enabled)
diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb
index fde6240d373..3b70d177fce 100644
--- a/spec/features/projects/jobs/user_browses_jobs_spec.rb
+++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb
@@ -67,19 +67,8 @@ RSpec.describe 'User browses jobs' do
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
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 6adc3503492..9bd6476f836 100644
--- a/spec/features/projects/members/groups_with_access_list_spec.rb
+++ b/spec/features/projects/members/groups_with_access_list_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'Projects > Members > Groups with access list', :js do
include Spec::Support::Helpers::Features::MembersHelpers
include Spec::Support::Helpers::ModalHelpers
+ include Spec::Support::Helpers::Features::InviteMembersModalHelper
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group, :public) }
@@ -95,8 +96,4 @@ RSpec.describe 'Projects > Members > Groups with access list', :js do
expect(members_table).to have_content(group.full_name)
end
end
-
- def click_groups_tab
- click_link 'Groups'
- end
end
diff --git a/spec/features/projects/members/invite_group_spec.rb b/spec/features/projects/members/invite_group_spec.rb
index 9c256504934..a48229249e0 100644
--- a/spec/features/projects/members/invite_group_spec.rb
+++ b/spec/features/projects/members/invite_group_spec.rb
@@ -17,20 +17,18 @@ RSpec.describe 'Project > Members > Invite group', :js do
visit project_project_members_path(project)
- expect(page).to have_selector('button[data-test-id="invite-group-button"]')
+ expect(page).to have_selector(invite_group_selector)
end
- it 'does not display the button when visiting the page not signed in' do
+ it 'does not display the button when visiting the page not signed in' do
project = create(:project, namespace: create(:group))
visit project_project_members_path(project)
- expect(page).not_to have_selector('button[data-test-id="invite-group-button"]')
+ expect(page).not_to have_selector(invite_group_selector)
end
describe 'Share with group lock' do
- let(:invite_group_selector) { 'button[data-test-id="invite-group-button"]' }
-
shared_examples 'the project can be shared with groups' do
it 'the "Invite a group" button exists' do
visit project_project_members_path(project)
@@ -158,21 +156,95 @@ RSpec.describe 'Project > Members > Invite group', :js do
describe 'the groups dropdown' do
let_it_be(:parent_group) { create(:group, :public) }
let_it_be(:project_group) { create(:group, :public, parent: parent_group) }
- let_it_be(:public_sub_subgroup) { create(:group, :public, parent: project_group) }
- let_it_be(:public_sibbling_group) { create(:group, :public, parent: parent_group) }
- let_it_be(:private_sibbling_group) { create(:group, :private, parent: parent_group) }
- let_it_be(:private_membership_group) { create(:group, :private) }
- let_it_be(:public_membership_group) { create(:group, :public) }
let_it_be(:project) { create(:project, group: project_group) }
- before do
- private_membership_group.add_guest(maintainer)
- public_membership_group.add_maintainer(maintainer)
+ context 'with instance admin considerations' do
+ let_it_be(:group_to_share) { create(:group) }
- sign_in(maintainer)
+ context 'when user is an admin' do
+ let_it_be(:admin) { create(:admin) }
+
+ before do
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
+ end
+
+ it 'shows groups where the admin has no direct membership' do
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_share)
+ end
+ end
+
+ it 'shows groups where the admin has at least guest level membership' do
+ group_to_share.add_guest(admin)
+
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_share)
+ end
+ end
+ end
+
+ context 'when user is not an admin' do
+ before do
+ project.add_maintainer(maintainer)
+ sign_in(maintainer)
+ end
+
+ it 'does not show groups where the user has no direct membership' do
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_not_to_have_group(group_to_share)
+ end
+ end
+
+ it 'shows groups where the user has at least guest level membership' do
+ group_to_share.add_guest(maintainer)
+
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_share)
+ end
+ end
+ end
end
context 'for a project in a nested group' do
+ let_it_be(:public_sub_subgroup) { create(:group, :public, parent: project_group) }
+ let_it_be(:public_sibbling_group) { create(:group, :public, parent: parent_group) }
+ let_it_be(:private_sibbling_group) { create(:group, :private, parent: parent_group) }
+ let_it_be(:private_membership_group) { create(:group, :private) }
+ let_it_be(:public_membership_group) { create(:group, :public) }
+ let_it_be(:project) { create(:project, group: project_group) }
+
+ before do
+ private_membership_group.add_guest(maintainer)
+ public_membership_group.add_maintainer(maintainer)
+
+ sign_in(maintainer)
+ end
+
it 'does not show the groups inherited from projects' do
project.add_maintainer(maintainer)
public_sibbling_group.add_maintainer(maintainer)
@@ -183,7 +255,7 @@ RSpec.describe 'Project > Members > Invite group', :js do
click_on 'Select a group'
wait_for_requests
- page.within('[data-testid="group-select-dropdown"]') do
+ page.within(group_dropdown_selector) do
expect_to_have_group(public_membership_group)
expect_to_have_group(public_sibbling_group)
expect_to_have_group(private_membership_group)
@@ -204,7 +276,7 @@ RSpec.describe 'Project > Members > Invite group', :js do
click_on 'Select a group'
wait_for_requests
- page.within('[data-testid="group-select-dropdown"]') do
+ page.within(group_dropdown_selector) do
expect_to_have_group(public_membership_group)
expect_to_have_group(public_sibbling_group)
expect_to_have_group(private_membership_group)
@@ -215,14 +287,10 @@ RSpec.describe 'Project > Members > Invite group', :js do
expect_not_to_have_group(project_group)
end
end
-
- def expect_to_have_group(group)
- expect(page).to have_selector("[entity-id='#{group.id}']")
- end
-
- def expect_not_to_have_group(group)
- expect(page).not_to have_selector("[entity-id='#{group.id}']")
- end
end
end
+
+ def invite_group_selector
+ 'button[data-test-id="invite-group-button"]'
+ end
end
diff --git a/spec/features/projects/members/list_spec.rb b/spec/features/projects/members/list_spec.rb
deleted file mode 100644
index f2424a4acc3..00000000000
--- a/spec/features/projects/members/list_spec.rb
+++ /dev/null
@@ -1,206 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Project members list', :js do
- include Spec::Support::Helpers::Features::MembersHelpers
- include Spec::Support::Helpers::Features::InviteMembersModalHelper
- include Spec::Support::Helpers::ModalHelpers
-
- let_it_be(:user1) { create(:user, name: 'John Doe') }
- let_it_be(:user2) { create(:user, name: 'Mary Jane') }
- let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project, :internal, namespace: group) }
-
- before do
- sign_in(user1)
- group.add_owner(user1)
- end
-
- it 'show members from project and group', :aggregate_failures do
- project.add_developer(user2)
-
- visit_members_page
-
- expect(first_row).to have_content(user1.name)
- expect(second_row).to have_content(user2.name)
- end
-
- it 'show user once if member of both group and project', :aggregate_failures do
- project.add_developer(user1)
-
- visit_members_page
-
- expect(first_row).to have_content(user1.name)
- expect(second_row).to be_blank
- end
-
- it 'update user access level' do
- project.add_developer(user2)
-
- visit_members_page
-
- page.within find_member_row(user2) do
- click_button('Developer')
- click_button('Reporter')
-
- expect(page).to have_button('Reporter')
- end
- end
-
- it 'add user to project', :snowplow, :aggregate_failures do
- visit_members_page
-
- invite_member(user2.name, role: 'Reporter')
-
- page.within find_member_row(user2) do
- expect(page).to have_button('Reporter')
- end
-
- expect_snowplow_event(
- category: 'Members::CreateService',
- action: 'create_member',
- label: 'project-members-page',
- property: 'existing_user',
- user: user1
- )
- end
-
- it 'uses ProjectMember access_level_roles for the invite members modal access option', :aggregate_failures do
- visit_members_page
-
- click_on 'Invite members'
-
- click_on 'Guest'
- wait_for_requests
-
- page.within '.dropdown-menu' do
- expect(page).to have_button('Guest')
- expect(page).to have_button('Reporter')
- expect(page).to have_button('Developer')
- expect(page).to have_button('Maintainer')
- expect(page).not_to have_button('Owner')
- end
- end
-
- it 'remove user from project' do
- other_user = create(:user)
- project.add_developer(other_user)
-
- visit_members_page
-
- # Open modal
- page.within find_member_row(other_user) do
- click_button 'Remove member'
- end
-
- within_modal do
- expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
- click_button('Remove member')
- end
-
- wait_for_requests
-
- expect(members_table).not_to have_content(other_user.name)
- end
-
- it 'invite user to project', :snowplow, :aggregate_failures do
- visit_members_page
-
- invite_member('test@example.com', role: 'Reporter')
-
- click_link 'Invited'
-
- page.within find_invited_member_row('test@example.com') do
- expect(page).to have_button('Reporter')
- end
-
- expect_snowplow_event(
- category: 'Members::InviteService',
- action: 'create_member',
- label: 'project-members-page',
- property: 'net_new_user',
- user: user1
- )
- end
-
- context 'as a signed out visitor viewing a public project' do
- let_it_be(:project) { create(:project, :public) }
-
- before do
- sign_out(user1)
- end
-
- it 'does not show the Invite members button when not signed in' do
- visit_members_page
-
- expect(page).not_to have_button('Invite members')
- end
- end
-
- context 'project bots' do
- let(:project_bot) { create(:user, :project_bot, name: 'project_bot') }
-
- before do
- project.add_maintainer(project_bot)
- end
-
- it 'does not show form used to change roles and "Expiration date" or the remove user button', :aggregate_failures do
- visit_members_page
-
- page.within find_username_row(project_bot) do
- expect(page).not_to have_button('Maintainer')
- expect(page).to have_field('Expiration date', disabled: true)
- expect(page).not_to have_button('Remove member')
- end
- end
- end
-
- describe 'when user has 2FA enabled' do
- let_it_be(:admin) { create(:admin) }
- let_it_be(:user_with_2fa) { create(:user, :two_factor_via_otp) }
-
- before do
- project.add_guest(user_with_2fa)
- end
-
- it 'shows 2FA badge to user with "Maintainer" access level' do
- project.add_maintainer(user1)
-
- visit_members_page
-
- expect(find_member_row(user_with_2fa)).to have_content('2FA')
- end
-
- it 'shows 2FA badge to admins' do
- sign_in(admin)
- gitlab_enable_admin_mode_sign_in(admin)
-
- visit_members_page
-
- expect(find_member_row(user_with_2fa)).to have_content('2FA')
- end
-
- it 'does not show 2FA badge to users with access level below "Maintainer"' do
- group.add_developer(user1)
-
- visit_members_page
-
- expect(find_member_row(user_with_2fa)).not_to have_content('2FA')
- end
-
- it 'shows 2FA badge to themselves' do
- sign_in(user_with_2fa)
-
- visit_members_page
-
- expect(find_member_row(user_with_2fa)).to have_content('2FA')
- end
- end
-
- private
-
- def visit_members_page
- visit project_project_members_path(project)
- end
-end
diff --git a/spec/features/projects/members/manage_members_spec.rb b/spec/features/projects/members/manage_members_spec.rb
new file mode 100644
index 00000000000..0f4120e88e0
--- /dev/null
+++ b/spec/features/projects/members/manage_members_spec.rb
@@ -0,0 +1,205 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Projects > Members > Manage members', :js do
+ include Spec::Support::Helpers::Features::MembersHelpers
+ include Spec::Support::Helpers::Features::InviteMembersModalHelper
+ include Spec::Support::Helpers::ModalHelpers
+
+ let_it_be(:user1) { create(:user, name: 'John Doe') }
+ let_it_be(:user2) { create(:user, name: 'Mary Jane') }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :internal, namespace: group) }
+
+ before do
+ sign_in(user1)
+ group.add_owner(user1)
+ end
+
+ it 'show members from project and group', :aggregate_failures do
+ project.add_developer(user2)
+
+ visit_members_page
+
+ expect(first_row).to have_content(user1.name)
+ expect(second_row).to have_content(user2.name)
+ end
+
+ it 'show user once if member of both group and project', :aggregate_failures do
+ project.add_developer(user1)
+
+ visit_members_page
+
+ expect(first_row).to have_content(user1.name)
+ expect(second_row).to be_blank
+ end
+
+ it 'update user access level' do
+ project.add_developer(user2)
+
+ visit_members_page
+
+ page.within find_member_row(user2) do
+ click_button('Developer')
+ click_button('Reporter')
+
+ expect(page).to have_button('Reporter')
+ end
+ end
+
+ it 'uses ProjectMember access_level_roles for the invite members modal access option', :aggregate_failures do
+ visit_members_page
+
+ click_on 'Invite members'
+
+ click_on 'Guest'
+ wait_for_requests
+
+ page.within '.dropdown-menu' do
+ expect(page).to have_button('Guest')
+ expect(page).to have_button('Reporter')
+ expect(page).to have_button('Developer')
+ expect(page).to have_button('Maintainer')
+ expect(page).not_to have_button('Owner')
+ end
+ end
+
+ it 'remove user from project' do
+ other_user = create(:user)
+ project.add_developer(other_user)
+
+ visit_members_page
+
+ # Open modal
+ page.within find_member_row(other_user) do
+ click_button 'Remove member'
+ end
+
+ within_modal do
+ expect(page).to have_unchecked_field 'Also unassign this user from related issues and merge requests'
+ click_button('Remove member')
+ end
+
+ wait_for_requests
+
+ expect(members_table).not_to have_content(other_user.name)
+ end
+
+ it_behaves_like 'inviting members', 'project-members-page' do
+ let_it_be(:entity) { project }
+ let_it_be(:members_page_path) { project_project_members_path(entity) }
+ let_it_be(:subentity) { project }
+ let_it_be(:subentity_members_page_path) { project_project_members_path(entity) }
+ end
+
+ describe 'member search results' do
+ it 'does not show project_bots', :aggregate_failures do
+ internal_project_bot = create(:user, :project_bot, name: '_internal_project_bot_')
+ project.add_maintainer(internal_project_bot)
+
+ external_group = create(:group)
+ external_project_bot = create(:user, :project_bot, name: '_external_project_bot_')
+ external_project = create(:project, group: external_group)
+ external_project.add_maintainer(external_project_bot)
+ external_project.add_maintainer(user1)
+
+ visit_members_page
+
+ click_on 'Invite members'
+
+ page.within invite_modal_selector do
+ field = find(member_dropdown_selector)
+ field.native.send_keys :tab
+ field.click
+
+ wait_for_requests
+
+ expect(page).to have_content(user1.name)
+ expect(page).to have_content(user2.name)
+ expect(page).not_to have_content(internal_project_bot.name)
+ expect(page).not_to have_content(external_project_bot.name)
+ end
+ end
+ end
+
+ context 'as a signed out visitor viewing a public project' do
+ let_it_be(:project) { create(:project, :public) }
+
+ before do
+ sign_out(user1)
+ end
+
+ it 'does not show the Invite members button when not signed in' do
+ visit_members_page
+
+ expect(page).not_to have_button('Invite members')
+ end
+ end
+
+ context 'project bots' do
+ let(:project_bot) { create(:user, :project_bot, name: 'project_bot') }
+
+ before do
+ project.add_maintainer(project_bot)
+ end
+
+ it 'does not show form used to change roles and "Expiration date" or the remove user button', :aggregate_failures do
+ visit_members_page
+
+ page.within find_username_row(project_bot) do
+ expect(page).not_to have_button('Maintainer')
+ expect(page).to have_field('Expiration date', disabled: true)
+ expect(page).not_to have_button('Remove member')
+ end
+ end
+ end
+
+ describe 'when user has 2FA enabled' do
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:user_with_2fa) { create(:user, :two_factor_via_otp) }
+
+ before do
+ project.add_guest(user_with_2fa)
+ end
+
+ it 'shows 2FA badge to user with "Maintainer" access level' do
+ project.add_maintainer(user1)
+
+ visit_members_page
+
+ expect(find_member_row(user_with_2fa)).to have_content('2FA')
+ end
+
+ it 'shows 2FA badge to admins' do
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
+
+ visit_members_page
+
+ expect(find_member_row(user_with_2fa)).to have_content('2FA')
+ end
+
+ it 'does not show 2FA badge to users with access level below "Maintainer"' do
+ group.add_developer(user1)
+
+ visit_members_page
+
+ expect(find_member_row(user_with_2fa)).not_to have_content('2FA')
+ end
+
+ it 'shows 2FA badge to themselves' do
+ sign_in(user_with_2fa)
+
+ visit_members_page
+
+ expect(find_member_row(user_with_2fa)).to have_content('2FA')
+ end
+ end
+
+ private
+
+ def visit_members_page
+ visit project_project_members_path(project)
+ end
+end
diff --git a/spec/features/projects/members/sorting_spec.rb b/spec/features/projects/members/sorting_spec.rb
index 653564d1566..8aadd6302d0 100644
--- a/spec/features/projects/members/sorting_spec.rb
+++ b/spec/features/projects/members/sorting_spec.rb
@@ -5,8 +5,8 @@ require 'spec_helper'
RSpec.describe 'Projects > Members > Sorting', :js do
include Spec::Support::Helpers::Features::MembersHelpers
- let(:maintainer) { create(:user, name: 'John Doe') }
- let(:developer) { create(:user, name: 'Mary Jane', last_sign_in_at: 5.days.ago) }
+ let(:maintainer) { create(:user, name: 'John Doe', created_at: 5.days.ago, last_activity_on: Date.today) }
+ let(:developer) { create(:user, name: 'Mary Jane', created_at: 1.day.ago, last_sign_in_at: 5.days.ago, last_activity_on: Date.today - 5) }
let(:project) { create(:project, namespace: maintainer.namespace, creator: maintainer) }
before do
@@ -42,6 +42,42 @@ RSpec.describe 'Projects > Members > Sorting', :js do
expect_sort_by('Max role', :desc)
end
+ it 'sorts by user created on ascending' do
+ visit_members_list(sort: :oldest_created_user)
+
+ expect(first_row.text).to have_content(maintainer.name)
+ expect(second_row.text).to have_content(developer.name)
+
+ expect_sort_by('Created on', :asc)
+ end
+
+ it 'sorts by user created on descending' do
+ visit_members_list(sort: :recent_created_user)
+
+ expect(first_row.text).to have_content(developer.name)
+ expect(second_row.text).to have_content(maintainer.name)
+
+ expect_sort_by('Created on', :desc)
+ end
+
+ it 'sorts by last activity ascending' do
+ visit_members_list(sort: :oldest_last_activity)
+
+ expect(first_row.text).to have_content(developer.name)
+ expect(second_row.text).to have_content(maintainer.name)
+
+ expect_sort_by('Last activity', :asc)
+ end
+
+ it 'sorts by last activity descending' do
+ visit_members_list(sort: :recent_last_activity)
+
+ expect(first_row.text).to have_content(maintainer.name)
+ expect(second_row.text).to have_content(developer.name)
+
+ expect_sort_by('Last activity', :desc)
+ end
+
it 'sorts by access granted ascending' do
visit_members_list(sort: :last_joined)
diff --git a/spec/features/projects/milestones/milestones_sorting_spec.rb b/spec/features/projects/milestones/milestones_sorting_spec.rb
index 565c61cfaa0..2ad820e4a06 100644
--- a/spec/features/projects/milestones/milestones_sorting_spec.rb
+++ b/spec/features/projects/milestones/milestones_sorting_spec.rb
@@ -5,49 +5,55 @@ require 'spec_helper'
RSpec.describe 'Milestones sorting', :js do
let(:user) { create(:user) }
let(:project) { create(:project, name: 'test', namespace: user.namespace) }
+ let(:milestones_for_sort_by) do
+ {
+ 'Due later' => %w[b c a],
+ 'Name, ascending' => %w[a b c],
+ 'Name, descending' => %w[c b a],
+ 'Start later' => %w[a c b],
+ 'Start soon' => %w[b c a],
+ 'Due soon' => %w[a c b]
+ }
+ end
+
+ let(:ordered_milestones) do
+ ['Due soon', 'Due later', 'Start soon', 'Start later', 'Name, ascending', 'Name, descending']
+ end
before do
- # Milestones
- create(:milestone,
- due_date: 10.days.from_now,
- created_at: 2.hours.ago,
- title: "aaa", project: project)
- create(:milestone,
- due_date: 11.days.from_now,
- created_at: 1.hour.ago,
- title: "bbb", project: project)
+ create(:milestone, start_date: 7.days.from_now, due_date: 10.days.from_now, title: "a", project: project)
+ create(:milestone, start_date: 6.days.from_now, due_date: 11.days.from_now, title: "c", project: project)
+ create(:milestone, start_date: 5.days.from_now, due_date: 12.days.from_now, title: "b", project: project)
sign_in(user)
end
- it 'visit project milestones and sort by due_date_asc' do
+ it 'visit project milestones and sort by various orders' do
visit project_milestones_path(project)
expect(page).to have_button('Due soon')
- # assert default sorting
+ # assert default sorting order
within '.milestones' do
- expect(page.all('ul.content-list > li').first.text).to include('aaa')
- expect(page.all('ul.content-list > li').last.text).to include('bbb')
+ expect(page.all('ul.content-list > li strong > a').map(&:text)).to eq(%w[a c b])
end
- click_button 'Due soon'
+ # assert milestones listed for given sort order
+ selected_sort_order = 'Due soon'
+ milestones_for_sort_by.each do |sort_by, expected_milestones|
+ within '[data-testid=milestone_sort_by_dropdown]' do
+ click_button selected_sort_order
+ milestones = find('.gl-new-dropdown-contents').all('.gl-new-dropdown-item-text-wrapper p').map(&:text)
+ expect(milestones).to eq(ordered_milestones)
- sort_options = find('ul.dropdown-menu-sort li').all('a').collect(&:text)
+ click_button sort_by
+ expect(page).to have_button(sort_by)
+ end
- expect(sort_options[0]).to eq('Due soon')
- expect(sort_options[1]).to eq('Due later')
- expect(sort_options[2]).to eq('Start soon')
- expect(sort_options[3]).to eq('Start later')
- expect(sort_options[4]).to eq('Name, ascending')
- expect(sort_options[5]).to eq('Name, descending')
+ within '.milestones' do
+ expect(page.all('ul.content-list > li strong > a').map(&:text)).to eq(expected_milestones)
+ end
- click_link 'Due later'
-
- expect(page).to have_button('Due later')
-
- within '.milestones' do
- expect(page.all('ul.content-list > li').first.text).to include('bbb')
- expect(page.all('ul.content-list > li').last.text).to include('aaa')
+ selected_sort_order = sort_by
end
end
end
diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb
index c57e39b6508..0046dfe436f 100644
--- a/spec/features/projects/new_project_spec.rb
+++ b/spec/features/projects/new_project_spec.rb
@@ -191,7 +191,8 @@ RSpec.describe 'New project', :js do
click_link 'Create blank project'
end
- it 'selects the user namespace' do
+ it 'does not select the user namespace' do
+ click_on 'Pick a group or namespace'
expect(page).to have_button user.username
end
end
@@ -328,6 +329,14 @@ RSpec.describe 'New project', :js do
click_on 'Create project'
+ expect(page).to have_content(
+ s_('ProjectsNew|Pick a group or namespace where you want to create this project.')
+ )
+
+ click_on 'Pick a group or namespace'
+ click_on user.username
+ click_on 'Create project'
+
expect(page).to have_css('#import-project-pane.active')
expect(page).not_to have_css('.toggle-import-form.hide')
end
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index 6b9dfdf3a7b..219c8ec0070 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe 'Pipeline', :js do
before do
sign_in(user)
project.add_role(user, role)
+ stub_feature_flags(pipeline_tabs_vue: false)
end
shared_context 'pipeline builds' do
@@ -356,6 +357,7 @@ RSpec.describe 'Pipeline', :js do
context 'page tabs' do
before do
+ stub_feature_flags(pipeline_tabs_vue: false)
visit_pipeline
end
@@ -388,6 +390,7 @@ RSpec.describe 'Pipeline', :js do
let(:pipeline) { create(:ci_pipeline, :with_test_reports, :with_report_results, project: project) }
before do
+ stub_feature_flags(pipeline_tabs_vue: false)
visit_pipeline
wait_for_requests
end
@@ -924,6 +927,7 @@ RSpec.describe 'Pipeline', :js do
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
before do
+ stub_feature_flags(pipeline_tabs_vue: false)
visit builds_project_pipeline_path(project, pipeline)
end
@@ -944,6 +948,10 @@ RSpec.describe 'Pipeline', :js do
end
context 'page tabs' do
+ before do
+ stub_feature_flags(pipeline_tabs_vue: false)
+ end
+
it 'shows Pipeline, Jobs and DAG tabs with link' do
expect(page).to have_link('Pipeline')
expect(page).to have_link('Jobs')
@@ -1014,6 +1022,10 @@ RSpec.describe 'Pipeline', :js do
end
describe 'GET /:project/-/pipelines/:id/failures' do
+ before do
+ stub_feature_flags(pipeline_tabs_vue: false)
+ end
+
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: '1234') }
let(:pipeline_failures_page) { failures_project_pipeline_path(project, pipeline) }
let!(:failed_build) { create(:ci_build, :failed, pipeline: pipeline) }
@@ -1139,6 +1151,7 @@ RSpec.describe 'Pipeline', :js do
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
before do
+ stub_feature_flags(pipeline_tabs_vue: false)
visit dag_project_pipeline_path(project, pipeline)
end
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index 0e1728858ec..8b1a22ae05a 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -623,6 +623,7 @@ RSpec.describe 'Pipelines', :js do
create(:generic_commit_status, pipeline: pipeline, stage: 'external', name: 'jenkins', stage_idx: 3, ref: 'master')
+ stub_feature_flags(pipeline_tabs_vue: false)
visit project_pipeline_path(project, pipeline)
wait_for_requests
end
diff --git a/spec/features/projects/releases/user_views_releases_spec.rb b/spec/features/projects/releases/user_views_releases_spec.rb
index 98935fdf872..a7348b62fc0 100644
--- a/spec/features/projects/releases/user_views_releases_spec.rb
+++ b/spec/features/projects/releases/user_views_releases_spec.rb
@@ -24,129 +24,111 @@ RSpec.describe 'User views releases', :js do
stub_default_url_options(host: 'localhost')
end
- shared_examples 'releases index page' do
- context('when the user is a maintainer') do
- before do
- sign_in(maintainer)
+ context('when the user is a maintainer') do
+ before do
+ sign_in(maintainer)
- visit project_releases_path(project)
+ visit project_releases_path(project)
- wait_for_requests
- end
+ wait_for_requests
+ end
- it 'sees the release' do
- page.within("##{release_v1.tag}") do
- expect(page).to have_content(release_v1.name)
- expect(page).to have_content(release_v1.tag)
- expect(page).not_to have_content('Upcoming Release')
- end
+ it 'sees the release' do
+ page.within("##{release_v1.tag}") do
+ expect(page).to have_content(release_v1.name)
+ expect(page).to have_content(release_v1.tag)
+ expect(page).not_to have_content('Upcoming Release')
end
+ end
- it 'renders the correct links', :aggregate_failures do
- page.within("##{release_v1.tag} .js-assets-list") do
- external_link_indicator_selector = '[data-testid="external-link-indicator"]'
+ it 'renders the correct links', :aggregate_failures do
+ page.within("##{release_v1.tag} .js-assets-list") do
+ external_link_indicator_selector = '[data-testid="external-link-indicator"]'
- expect(page).to have_link internal_link.name, href: internal_link.url
- expect(find_link(internal_link.name)).not_to have_css(external_link_indicator_selector)
+ expect(page).to have_link internal_link.name, href: internal_link.url
+ expect(find_link(internal_link.name)).not_to have_css(external_link_indicator_selector)
- expect(page).to have_link internal_link_with_redirect.name, href: Gitlab::Routing.url_helpers.project_release_url(project, release_v1) << "/downloads#{internal_link_with_redirect.filepath}"
- expect(find_link(internal_link_with_redirect.name)).not_to have_css(external_link_indicator_selector)
+ expect(page).to have_link internal_link_with_redirect.name, href: Gitlab::Routing.url_helpers.project_release_url(project, release_v1) << "/downloads#{internal_link_with_redirect.filepath}"
+ expect(find_link(internal_link_with_redirect.name)).not_to have_css(external_link_indicator_selector)
- expect(page).to have_link external_link.name, href: external_link.url
- expect(find_link(external_link.name)).to have_css(external_link_indicator_selector)
- end
+ expect(page).to have_link external_link.name, href: external_link.url
+ expect(find_link(external_link.name)).to have_css(external_link_indicator_selector)
end
+ end
- context 'with an upcoming release' do
- it 'sees the upcoming tag' do
- page.within("##{release_v3.tag}") do
- expect(page).to have_content('Upcoming Release')
- end
+ context 'with an upcoming release' do
+ it 'sees the upcoming tag' do
+ page.within("##{release_v3.tag}") do
+ expect(page).to have_content('Upcoming Release')
end
end
+ end
- context 'with a tag containing a slash' do
- it 'sees the release' do
- page.within("##{release_v2.tag.parameterize}") do
- expect(page).to have_content(release_v2.name)
- expect(page).to have_content(release_v2.tag)
- end
+ context 'with a tag containing a slash' do
+ it 'sees the release' do
+ page.within("##{release_v2.tag.parameterize}") do
+ expect(page).to have_content(release_v2.name)
+ expect(page).to have_content(release_v2.tag)
end
end
+ end
- context 'sorting' do
- def sort_page(by:, direction:)
- within '[data-testid="releases-sort"]' do
- find('.dropdown-toggle').click
-
- click_button(by, class: 'dropdown-item')
-
- find('.sorting-direction-button').click if direction == :ascending
- end
- end
-
- shared_examples 'releases sort order' do
- it "sorts the releases #{description}" do
- card_titles = page.all('.release-block .card-title', minimum: expected_releases.count)
-
- card_titles.each_with_index do |title, index|
- expect(title).to have_content(expected_releases[index].name)
- end
- end
- end
+ context 'sorting' do
+ def sort_page(by:, direction:)
+ within '[data-testid="releases-sort"]' do
+ find('.dropdown-toggle').click
- context "when the page is sorted by the default sort order" do
- let(:expected_releases) { [release_v3, release_v2, release_v1] }
+ click_button(by, class: 'dropdown-item')
- it_behaves_like 'releases sort order'
+ find('.sorting-direction-button').click if direction == :ascending
end
+ end
- context "when the page is sorted by created_at ascending " do
- let(:expected_releases) { [release_v2, release_v1, release_v3] }
+ shared_examples 'releases sort order' do
+ it "sorts the releases #{description}" do
+ card_titles = page.all('.release-block .card-title', minimum: expected_releases.count)
- before do
- sort_page by: 'Created date', direction: :ascending
+ card_titles.each_with_index do |title, index|
+ expect(title).to have_content(expected_releases[index].name)
end
-
- it_behaves_like 'releases sort order'
end
end
- end
- context('when the user is a guest') do
- before do
- sign_in(guest)
- end
+ context "when the page is sorted by the default sort order" do
+ let(:expected_releases) { [release_v3, release_v2, release_v1] }
- it 'renders release info except for Git-related data' do
- visit project_releases_path(project)
+ it_behaves_like 'releases sort order'
+ end
- within('.release-block', match: :first) do
- expect(page).to have_content(release_v3.description)
- expect(page).to have_content(release_v3.tag)
- expect(page).to have_content(release_v3.name)
+ context "when the page is sorted by created_at ascending " do
+ let(:expected_releases) { [release_v2, release_v1, release_v3] }
- # The following properties (sometimes) include Git info,
- # so they are not rendered for Guest users
- expect(page).not_to have_content(release_v3.commit.short_id)
+ before do
+ sort_page by: 'Created date', direction: :ascending
end
+
+ it_behaves_like 'releases sort order'
end
end
end
- context 'when the releases_index_apollo_client feature flag is enabled' do
+ context('when the user is a guest') do
before do
- stub_feature_flags(releases_index_apollo_client: true)
+ sign_in(guest)
end
- it_behaves_like 'releases index page'
- end
+ it 'renders release info except for Git-related data' do
+ visit project_releases_path(project)
- context 'when the releases_index_apollo_client feature flag is disabled' do
- before do
- stub_feature_flags(releases_index_apollo_client: false)
- end
+ within('.release-block', match: :first) do
+ expect(page).to have_content(release_v3.description)
+ expect(page).to have_content(release_v3.tag)
+ expect(page).to have_content(release_v3.name)
- it_behaves_like 'releases index page'
+ # The following properties (sometimes) include Git info,
+ # so they are not rendered for Guest users
+ expect(page).not_to have_content(release_v3.commit.short_id)
+ end
+ end
end
end
diff --git a/spec/features/projects/terraform_spec.rb b/spec/features/projects/terraform_spec.rb
index 2c63f2bfc02..d9e45b5e78e 100644
--- a/spec/features/projects/terraform_spec.rb
+++ b/spec/features/projects/terraform_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'Terraform', :js do
end
it 'sees an empty state' do
- expect(page).to have_content('Get started with Terraform')
+ expect(page).to have_content("Your project doesn't have any Terraform state files")
end
end
diff --git a/spec/features/projects/user_creates_project_spec.rb b/spec/features/projects/user_creates_project_spec.rb
index 6491a7425f7..b07f2d12660 100644
--- a/spec/features/projects/user_creates_project_spec.rb
+++ b/spec/features/projects/user_creates_project_spec.rb
@@ -33,29 +33,6 @@ RSpec.describe 'User creates a project', :js do
end
it 'creates a new project that is not blank' do
- stub_experiments(new_project_sast_enabled: 'candidate')
-
- visit(new_project_path)
-
- click_link 'Create blank project'
- 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)'
-
- click_button('Create project')
-
- project = Project.last
-
- expect(page).to have_current_path(project_path(project), ignore_query: true)
- 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
-
- it 'allows creating a new project when the new_project_sast_enabled is assigned the unchecked candidate' do
- stub_experiments(new_project_sast_enabled: 'unchecked_candidate')
-
visit(new_project_path)
click_link 'Create blank project'
@@ -93,7 +70,7 @@ RSpec.describe 'User creates a project', :js do
fill_in :project_name, with: 'A Subgroup Project'
fill_in :project_path, with: 'a-subgroup-project'
- click_button user.username
+ click_on 'Pick a group or namespace'
click_button subgroup.full_path
click_button('Create project')
@@ -120,9 +97,6 @@ RSpec.describe 'User creates a project', :js do
fill_in :project_name, with: 'a-new-project'
fill_in :project_path, with: 'a-new-project'
- click_button user.username
- click_button group.full_path
-
page.within('#content-body') do
click_button('Create project')
end
diff --git a/spec/features/projects/user_sorts_projects_spec.rb b/spec/features/projects/user_sorts_projects_spec.rb
index 71e43467a39..7c970f7ee3d 100644
--- a/spec/features/projects/user_sorts_projects_spec.rb
+++ b/spec/features/projects/user_sorts_projects_spec.rb
@@ -14,25 +14,29 @@ RSpec.describe 'User sorts projects and order persists' do
it "is set on the dashboard_projects_path" do
visit(dashboard_projects_path)
- expect(find('.dropdown-menu a.is-active', text: project_paths_label)).to have_content(project_paths_label)
+ expect(find('#sort-projects-dropdown')).to have_content(project_paths_label)
end
it "is set on the explore_projects_path" do
visit(explore_projects_path)
- expect(find('.dropdown-menu a.is-active', text: project_paths_label)).to have_content(project_paths_label)
+ expect(find('#sort-projects-dropdown')).to have_content(project_paths_label)
end
it "is set on the group_canonical_path" do
visit(group_canonical_path(group))
- expect(find('.dropdown-menu a.is-active', text: group_paths_label)).to have_content(group_paths_label)
+ within '[data-testid=group_sort_by_dropdown]' do
+ expect(find('.gl-dropdown-toggle')).to have_content(group_paths_label)
+ end
end
it "is set on the details_group_path" do
visit(details_group_path(group))
- expect(find('.dropdown-menu a.is-active', text: group_paths_label)).to have_content(group_paths_label)
+ within '[data-testid=group_sort_by_dropdown]' do
+ expect(find('.gl-dropdown-toggle')).to have_content(group_paths_label)
+ end
end
end
@@ -58,23 +62,27 @@ RSpec.describe 'User sorts projects and order persists' do
it_behaves_like "sort order persists across all views", "Name", "Name"
end
- context 'from group homepage' do
+ context 'from group homepage', :js do
before do
sign_in(user)
visit(group_canonical_path(group))
- find('button.dropdown-menu-toggle').click
- first(:link, 'Last created').click
+ within '[data-testid=group_sort_by_dropdown]' do
+ find('button.gl-dropdown-toggle').click
+ first(:button, 'Last created').click
+ end
end
it_behaves_like "sort order persists across all views", "Created date", "Last created"
end
- context 'from group details' do
+ context 'from group details', :js do
before do
sign_in(user)
visit(details_group_path(group))
- find('button.dropdown-menu-toggle').click
- first(:link, 'Most stars').click
+ within '[data-testid=group_sort_by_dropdown]' do
+ find('button.gl-dropdown-toggle').click
+ first(:button, 'Most stars').click
+ end
end
it_behaves_like "sort order persists across all views", "Stars", "Most stars"
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index 1049f8bc18f..db64f84aa76 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -15,6 +15,12 @@ RSpec.describe 'Project' do
end
shared_examples 'creates from template' do |template, sub_template_tab = nil|
+ let(:selected_template) { page.find('.project-fields-form .selected-template') }
+
+ choose_template_selector = '.choose-template'
+ template_option_selector = '.template-option'
+ template_name_selector = '.description strong'
+
it "is created from template", :js do
click_link 'Create from template'
find(".project-template #{sub_template_tab}").click if sub_template_tab
@@ -27,6 +33,39 @@ RSpec.describe 'Project' do
expect(page).to have_content template.name
end
+
+ it 'is created using keyboard navigation', :js do
+ click_link 'Create from template'
+
+ first_template = first(template_option_selector)
+ first_template_name = first_template.find(template_name_selector).text
+ first_template.find(choose_template_selector).click
+
+ expect(selected_template).to have_text(first_template_name)
+
+ click_button "Change template"
+ find("#built-in").click
+
+ # Jumps down 1 template, skipping the `preview` buttons
+ 2.times do
+ page.send_keys :tab
+ end
+
+ # Ensure the template with focus is selected
+ project_name = "project from template"
+ focused_template = page.find(':focus').ancestor(template_option_selector)
+ focused_template_name = focused_template.find(template_name_selector).text
+ focused_template.find(choose_template_selector).send_keys :enter
+ fill_in "project_name", with: project_name
+
+ expect(selected_template).to have_text(focused_template_name)
+
+ page.within '#content-body' do
+ click_button "Create project"
+ end
+
+ expect(page).to have_content project_name
+ end
end
context 'create with project template' do
diff --git a/spec/features/refactor_blob_viewer_disabled/projects/blobs/balsamiq_spec.rb b/spec/features/refactor_blob_viewer_disabled/projects/blobs/balsamiq_spec.rb
deleted file mode 100644
index 3638e98a08a..00000000000
--- a/spec/features/refactor_blob_viewer_disabled/projects/blobs/balsamiq_spec.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Balsamiq file blob', :js do
- let(:project) { create(:project, :public, :repository) }
-
- before do
- stub_feature_flags(refactor_blob_viewer: false)
- visit project_blob_path(project, 'add-balsamiq-file/files/images/balsamiq.bmpr')
-
- wait_for_requests
- end
-
- it 'displays Balsamiq file content' do
- expect(page).to have_content("Mobile examples")
- end
-end
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index 49c468976b9..2dddcd62a6c 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -352,6 +352,7 @@ RSpec.describe 'Runners' do
before do
group.add_owner(user)
+ stub_feature_flags(runner_list_group_view_vue_ui: false)
end
context 'group with no runners' do
diff --git a/spec/features/search/user_searches_for_projects_spec.rb b/spec/features/search/user_searches_for_projects_spec.rb
index c38ad077cd0..562da56275c 100644
--- a/spec/features/search/user_searches_for_projects_spec.rb
+++ b/spec/features/search/user_searches_for_projects_spec.rb
@@ -8,6 +8,8 @@ RSpec.describe 'User searches for projects', :js do
context 'when signed out' do
context 'when block_anonymous_global_searches is disabled' do
before do
+ allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit).and_return(1000)
+ allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit_unauthenticated).and_return(1000)
stub_feature_flags(block_anonymous_global_searches: false)
end
diff --git a/spec/features/search/user_uses_header_search_field_spec.rb b/spec/features/search/user_uses_header_search_field_spec.rb
index 8736f16b991..7350a54e8df 100644
--- a/spec/features/search/user_uses_header_search_field_spec.rb
+++ b/spec/features/search/user_uses_header_search_field_spec.rb
@@ -17,12 +17,15 @@ RSpec.describe 'User uses header search field', :js do
end
before do
+ allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit).and_return(1000)
+ allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(:search_rate_limit_unauthenticated).and_return(1000)
sign_in(user)
end
shared_examples 'search field examples' do
before do
visit(url)
+ wait_for_all_requests
end
it 'starts searching by pressing the enter key' do
@@ -37,7 +40,6 @@ RSpec.describe 'User uses header search field', :js do
before do
find('#search')
find('body').native.send_keys('s')
-
wait_for_all_requests
end
@@ -49,6 +51,7 @@ RSpec.describe 'User uses header search field', :js do
context 'when clicking the search field' do
before do
page.find('#search').click
+ wait_for_all_requests
end
it 'shows category search dropdown', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/250285' do
@@ -59,7 +62,7 @@ RSpec.describe 'User uses header search field', :js do
let!(:issue) { create(:issue, project: project, author: user, assignees: [user]) }
it 'shows assigned issues' do
- find('.search-input-container .dropdown-menu').click_link('Issues assigned to me')
+ find('[data-testid="header-search-dropdown-menu"]').click_link('Issues assigned to me')
expect(page).to have_selector('.issues-list .issue')
expect_tokens([assignee_token(user.name)])
@@ -67,7 +70,7 @@ RSpec.describe 'User uses header search field', :js do
end
it 'shows created issues' do
- find('.search-input-container .dropdown-menu').click_link("Issues I've created")
+ find('[data-testid="header-search-dropdown-menu"]').click_link("Issues I've created")
expect(page).to have_selector('.issues-list .issue')
expect_tokens([author_token(user.name)])
@@ -79,7 +82,7 @@ RSpec.describe 'User uses header search field', :js do
let!(:merge_request) { create(:merge_request, source_project: project, author: user, assignees: [user]) }
it 'shows assigned merge requests' do
- find('.search-input-container .dropdown-menu').click_link('Merge requests assigned to me')
+ find('[data-testid="header-search-dropdown-menu"]').click_link('Merge requests assigned to me')
expect(page).to have_selector('.mr-list .merge-request')
expect_tokens([assignee_token(user.name)])
@@ -87,7 +90,7 @@ RSpec.describe 'User uses header search field', :js do
end
it 'shows created merge requests' do
- find('.search-input-container .dropdown-menu').click_link("Merge requests I've created")
+ find('[data-testid="header-search-dropdown-menu"]').click_link("Merge requests I've created")
expect(page).to have_selector('.mr-list .merge-request')
expect_tokens([author_token(user.name)])
@@ -150,10 +153,9 @@ RSpec.describe 'User uses header search field', :js do
it 'displays search options' do
fill_in_search('test')
-
- expect(page).to have_selector(scoped_search_link('test'))
- expect(page).to have_selector(scoped_search_link('test', group_id: group.id))
- expect(page).to have_selector(scoped_search_link('test', project_id: project.id, group_id: group.id))
+ expect(page).to have_selector(scoped_search_link('test', search_code: true))
+ expect(page).to have_selector(scoped_search_link('test', group_id: group.id, search_code: true))
+ expect(page).to have_selector(scoped_search_link('test', project_id: project.id, group_id: group.id, search_code: true))
end
end
@@ -165,10 +167,9 @@ RSpec.describe 'User uses header search field', :js do
it 'displays search options' do
fill_in_search('test')
-
- expect(page).to have_selector(scoped_search_link('test'))
- expect(page).not_to have_selector(scoped_search_link('test', group_id: project.namespace_id))
- expect(page).to have_selector(scoped_search_link('test', project_id: project.id))
+ expect(page).to have_selector(scoped_search_link('test', search_code: true, repository_ref: 'master'))
+ expect(page).not_to have_selector(scoped_search_link('test', search_code: true, group_id: project.namespace_id, repository_ref: 'master'))
+ expect(page).to have_selector(scoped_search_link('test', search_code: true, project_id: project.id, repository_ref: 'master'))
end
it 'displays a link to project merge requests' do
@@ -217,7 +218,6 @@ RSpec.describe 'User uses header search field', :js do
it 'displays search options' do
fill_in_search('test')
-
expect(page).to have_selector(scoped_search_link('test'))
expect(page).to have_selector(scoped_search_link('test', group_id: group.id))
expect(page).not_to have_selector(scoped_search_link('test', project_id: project.id))
@@ -248,18 +248,20 @@ RSpec.describe 'User uses header search field', :js do
end
end
- def scoped_search_link(term, project_id: nil, group_id: nil)
+ def scoped_search_link(term, project_id: nil, group_id: nil, search_code: nil, repository_ref: nil)
# search_path will accept group_id and project_id but the order does not match
# what is expected in the href, so the variable must be built manually
href = search_path(search: term)
+ href.concat("&nav_source=navbar")
href.concat("&project_id=#{project_id}") if project_id
href.concat("&group_id=#{group_id}") if group_id
- href.concat("&nav_source=navbar")
+ href.concat("&search_code=true") if search_code
+ href.concat("&repository_ref=#{repository_ref}") if repository_ref
- ".dropdown a[href='#{href}']"
+ "[data-testid='header-search-dropdown-menu'] a[href='#{href}']"
end
def dashboard_search_options_popup_menu
- "div[data-testid='dashboard-search-options']"
+ "[data-testid='header-search-dropdown-menu'] .header-search-dropdown-content"
end
end
diff --git a/spec/features/static_site_editor_spec.rb b/spec/features/static_site_editor_spec.rb
deleted file mode 100644
index 98313905a33..00000000000
--- a/spec/features/static_site_editor_spec.rb
+++ /dev/null
@@ -1,113 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Static Site Editor' do
- include ContentSecurityPolicyHelpers
-
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :public, :repository) }
-
- let(:sse_path) { project_show_sse_path(project, 'master/README.md') }
-
- before_all do
- project.add_developer(user)
- end
-
- before do
- sign_in(user)
- end
-
- context "when no config file is present" do
- before do
- visit sse_path
- end
-
- it 'renders SSE page with all generated config values and default config file values' do
- node = page.find('#static-site-editor')
-
- # assert generated config values are present
- expect(node['data-base-url']).to eq("/#{project.full_path}/-/sse/master%2FREADME.md")
- expect(node['data-branch']).to eq('master')
- expect(node['data-commit-id']).to match(/\A[0-9a-f]{40}\z/)
- expect(node['data-is-supported-content']).to eq('true')
- expect(node['data-merge-requests-illustration-path'])
- .to match(%r{/assets/illustrations/merge_requests-.*\.svg})
- expect(node['data-namespace']).to eq(project.namespace.full_path)
- expect(node['data-project']).to eq(project.path)
- expect(node['data-project-id']).to eq(project.id.to_s)
-
- # assert default config file values are present
- expect(node['data-image-upload-path']).to eq('source/images')
- expect(node['data-mounts']).to eq('[{"source":"source","target":""}]')
- expect(node['data-static-site-generator']).to eq('middleman')
- end
- end
-
- context "when a config file is present" do
- let(:config_file_yml) do
- <<~YAML
- image_upload_path: custom-image-upload-path
- mounts:
- - source: source1
- target: ""
- - source: source2
- target: target2
- static_site_generator: middleman
- YAML
- end
-
- before do
- allow_next_instance_of(Repository) do |repository|
- allow(repository).to receive(:blob_data_at).and_return(config_file_yml)
- end
-
- visit sse_path
- end
-
- it 'renders Static Site Editor page values read from config file' do
- node = page.find('#static-site-editor')
-
- # assert user-specified config file values are present
- expected_mounts = '[{"source":"source1","target":""},{"source":"source2","target":"target2"}]'
- expect(node['data-image-upload-path']).to eq('custom-image-upload-path')
- expect(node['data-mounts']).to eq(expected_mounts)
- expect(node['data-static-site-generator']).to eq('middleman')
- end
- end
-
- describe 'Static Site Editor Content Security Policy' do
- subject { response_headers['Content-Security-Policy'] }
-
- context 'when no global CSP config exists' do
- before do
- setup_csp_for_controller(Projects::StaticSiteEditorController)
- end
-
- it 'does not add CSP directives' do
- visit sse_path
-
- is_expected.to be_blank
- end
- end
-
- context 'when a global CSP config exists' do
- let_it_be(:cdn_url) { 'https://some-cdn.test' }
- let_it_be(:youtube_url) { 'https://www.youtube.com' }
-
- before do
- csp = ActionDispatch::ContentSecurityPolicy.new do |p|
- p.frame_src :self, cdn_url
- end
-
- setup_existing_csp_for_controller(Projects::StaticSiteEditorController, csp)
- end
-
- it 'appends youtube to the CSP frame-src policy' do
- visit sse_path
-
- is_expected.to eql("frame-src 'self' #{cdn_url} #{youtube_url}")
- end
- end
- end
-end
diff --git a/spec/features/task_lists_spec.rb b/spec/features/task_lists_spec.rb
index 0f8daaf8e15..6907701de9c 100644
--- a/spec/features/task_lists_spec.rb
+++ b/spec/features/task_lists_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'Task Lists', :js do
MARKDOWN
end
- let(:singleIncompleteMarkdown) do
+ let(:single_incomplete_markdown) do
<<-MARKDOWN.strip_heredoc
This is a task list:
@@ -30,7 +30,7 @@ RSpec.describe 'Task Lists', :js do
MARKDOWN
end
- let(:singleCompleteMarkdown) do
+ let(:single_complete_markdown) do
<<-MARKDOWN.strip_heredoc
This is a task list:
@@ -94,7 +94,7 @@ RSpec.describe 'Task Lists', :js do
end
describe 'single incomplete task' do
- let!(:issue) { create(:issue, description: singleIncompleteMarkdown, author: user, project: project) }
+ let!(:issue) { create(:issue, description: single_incomplete_markdown, author: user, project: project) }
it 'renders' do
visit_issue(project, issue)
@@ -113,7 +113,7 @@ RSpec.describe 'Task Lists', :js do
end
describe 'single complete task' do
- let!(:issue) { create(:issue, description: singleCompleteMarkdown, author: user, project: project) }
+ let!(:issue) { create(:issue, description: single_complete_markdown, author: user, project: project) }
it 'renders' do
visit_issue(project, issue)
@@ -171,7 +171,7 @@ RSpec.describe 'Task Lists', :js do
describe 'single incomplete task' do
let!(:note) do
- create(:note, note: singleIncompleteMarkdown, noteable: issue,
+ create(:note, note: single_incomplete_markdown, noteable: issue,
project: project, author: user)
end
@@ -186,7 +186,7 @@ RSpec.describe 'Task Lists', :js do
describe 'single complete task' do
let!(:note) do
- create(:note, note: singleCompleteMarkdown, noteable: issue,
+ create(:note, note: single_complete_markdown, noteable: issue,
project: project, author: user)
end
@@ -264,7 +264,7 @@ RSpec.describe 'Task Lists', :js do
end
describe 'single incomplete task' do
- let!(:merge) { create(:merge_request, :simple, description: singleIncompleteMarkdown, author: user, source_project: project) }
+ let!(:merge) { create(:merge_request, :simple, description: single_incomplete_markdown, author: user, source_project: project) }
it 'renders for description' do
visit_merge_request(project, merge)
@@ -283,7 +283,7 @@ RSpec.describe 'Task Lists', :js do
end
describe 'single complete task' do
- let!(:merge) { create(:merge_request, :simple, description: singleCompleteMarkdown, author: user, source_project: project) }
+ let!(:merge) { create(:merge_request, :simple, description: single_complete_markdown, author: user, source_project: project) }
it 'renders for description' do
visit_merge_request(project, merge)
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index 8610cae58a4..822bf898034 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -818,7 +818,6 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions do
context 'when 2FA is required for the user' do
before do
- stub_feature_flags(mr_attention_requests: false)
group = create(:group, require_two_factor_authentication: true)
group.add_developer(user)
end
@@ -840,7 +839,15 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions do
expect(page).to have_current_path(profile_two_factor_auth_path, ignore_query: true)
- fill_in 'pin_code', with: user.reload.current_otp
+ # Use the secret shown on the page to generate the OTP that will be entered.
+ # This detects issues wherein a new secret gets generated after the
+ # page is shown.
+ wait_for_requests
+
+ otp_secret = page.find('.two-factor-secret').text.gsub('Key:', '').delete(' ')
+ current_otp = ROTP::TOTP.new(otp_secret).now
+
+ fill_in 'pin_code', with: current_otp
fill_in 'current_password', with: user.password
click_button 'Register with two-factor app'
diff --git a/spec/finders/bulk_imports/entities_finder_spec.rb b/spec/finders/bulk_imports/entities_finder_spec.rb
index e053011b60d..54c792cb4d8 100644
--- a/spec/finders/bulk_imports/entities_finder_spec.rb
+++ b/spec/finders/bulk_imports/entities_finder_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe BulkImports::EntitiesFinder do
end
context 'when status is specified' do
- subject { described_class.new(user: user, status: 'failed') }
+ subject { described_class.new(user: user, params: { status: 'failed' }) }
it 'returns a list of import entities filtered by status' do
expect(subject.execute)
@@ -61,7 +61,7 @@ RSpec.describe BulkImports::EntitiesFinder do
end
context 'when invalid status is specified' do
- subject { described_class.new(user: user, status: 'invalid') }
+ subject { described_class.new(user: user, params: { status: 'invalid' }) }
it 'does not filter entities by status' do
expect(subject.execute)
@@ -74,11 +74,37 @@ RSpec.describe BulkImports::EntitiesFinder do
end
context 'when bulk import and status are specified' do
- subject { described_class.new(user: user, bulk_import: user_import_2, status: 'finished') }
+ subject { described_class.new(user: user, bulk_import: user_import_2, params: { status: 'finished' }) }
it 'returns matched import entities' do
expect(subject.execute).to contain_exactly(finished_entity_2)
end
end
+
+ context 'when order is specifed' do
+ subject { described_class.new(user: user, params: { sort: order }) }
+
+ context 'when order is specified as asc' do
+ let(:order) { :asc }
+
+ it 'returns entities sorted ascending' do
+ expect(subject.execute).to eq([
+ started_entity_1, finished_entity_1, failed_entity_1,
+ started_entity_2, finished_entity_2, failed_entity_2
+ ])
+ end
+ end
+
+ context 'when order is specified as desc' do
+ let(:order) { :desc }
+
+ it 'returns entities sorted descending' do
+ expect(subject.execute).to eq([
+ failed_entity_2, finished_entity_2, started_entity_2,
+ failed_entity_1, finished_entity_1, started_entity_1
+ ])
+ end
+ end
+ end
end
end
diff --git a/spec/finders/bulk_imports/imports_finder_spec.rb b/spec/finders/bulk_imports/imports_finder_spec.rb
index aac83c86c84..2f550514a33 100644
--- a/spec/finders/bulk_imports/imports_finder_spec.rb
+++ b/spec/finders/bulk_imports/imports_finder_spec.rb
@@ -16,19 +16,39 @@ RSpec.describe BulkImports::ImportsFinder do
end
context 'when status is specified' do
- subject { described_class.new(user: user, status: 'started') }
+ subject { described_class.new(user: user, params: { status: 'started' }) }
it 'returns a list of import entities filtered by status' do
expect(subject.execute).to contain_exactly(started_import)
end
context 'when invalid status is specified' do
- subject { described_class.new(user: user, status: 'invalid') }
+ subject { described_class.new(user: user, params: { status: 'invalid' }) }
it 'does not filter entities by status' do
expect(subject.execute).to contain_exactly(started_import, finished_import)
end
end
end
+
+ context 'when order is specifed' do
+ subject { described_class.new(user: user, params: { sort: order }) }
+
+ context 'when order is specified as asc' do
+ let(:order) { :asc }
+
+ it 'returns entities sorted ascending' do
+ expect(subject.execute).to eq([started_import, finished_import])
+ end
+ end
+
+ context 'when order is specified as desc' do
+ let(:order) { :desc }
+
+ it 'returns entities sorted descending' do
+ expect(subject.execute).to eq([finished_import, started_import])
+ end
+ end
+ end
end
end
diff --git a/spec/finders/ci/jobs_finder_spec.rb b/spec/finders/ci/jobs_finder_spec.rb
index 959716b1fd3..45e8cf5a582 100644
--- a/spec/finders/ci/jobs_finder_spec.rb
+++ b/spec/finders/ci/jobs_finder_spec.rb
@@ -7,9 +7,9 @@ RSpec.describe Ci::JobsFinder, '#execute' do
let_it_be(:admin) { create(:user, :admin) }
let_it_be(:project) { create(:project, :private, public_builds: false) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
- let_it_be(:job_1) { create(:ci_build) }
- let_it_be(:job_2) { create(:ci_build, :running) }
- let_it_be(:job_3) { create(:ci_build, :success, pipeline: pipeline, name: 'build') }
+ let_it_be(:pending_job) { create(:ci_build, :pending) }
+ let_it_be(:running_job) { create(:ci_build, :running) }
+ let_it_be(:successful_job) { create(:ci_build, :success, pipeline: pipeline, name: 'build') }
let(:params) { {} }
@@ -17,7 +17,7 @@ RSpec.describe Ci::JobsFinder, '#execute' do
subject { described_class.new(current_user: admin, params: params).execute }
it 'returns all jobs' do
- expect(subject).to match_array([job_1, job_2, job_3])
+ expect(subject).to match_array([pending_job, running_job, successful_job])
end
context 'non admin user' do
@@ -37,7 +37,7 @@ RSpec.describe Ci::JobsFinder, '#execute' do
end
context 'scope is present' do
- let(:jobs) { [job_1, job_2, job_3] }
+ let(:jobs) { [pending_job, running_job, successful_job] }
where(:scope, :index) do
[
@@ -55,11 +55,11 @@ RSpec.describe Ci::JobsFinder, '#execute' do
end
context 'scope is an array' do
- let(:jobs) { [job_1, job_2, job_3] }
- let(:params) {{ scope: ['running'] }}
+ let(:jobs) { [pending_job, running_job, successful_job, canceled_job] }
+ let(:params) {{ scope: %w'running success' }}
it 'filters by the job statuses in the scope' do
- expect(subject).to match_array([job_2])
+ expect(subject).to contain_exactly(running_job, successful_job)
end
end
end
@@ -73,7 +73,7 @@ RSpec.describe Ci::JobsFinder, '#execute' do
end
it 'returns jobs for the specified project' do
- expect(subject).to match_array([job_3])
+ expect(subject).to match_array([successful_job])
end
end
@@ -99,7 +99,7 @@ RSpec.describe Ci::JobsFinder, '#execute' do
context 'when pipeline is present' do
before_all do
project.add_maintainer(user)
- job_3.update!(retried: true)
+ successful_job.update!(retried: true)
end
let_it_be(:job_4) { create(:ci_build, :success, pipeline: pipeline, name: 'build') }
@@ -122,7 +122,7 @@ RSpec.describe Ci::JobsFinder, '#execute' do
let(:params) { { include_retried: true } }
it 'returns retried jobs' do
- expect(subject).to match_array([job_3, job_4])
+ expect(subject).to match_array([successful_job, job_4])
end
end
end
diff --git a/spec/finders/concerns/finder_methods_spec.rb b/spec/finders/concerns/finder_methods_spec.rb
index 195449d70c3..09ec8110129 100644
--- a/spec/finders/concerns/finder_methods_spec.rb
+++ b/spec/finders/concerns/finder_methods_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe FinderMethods do
end
def execute
- Project.all.order(id: :desc)
+ Project.where.not(name: 'foo').order(id: :desc)
end
private
@@ -21,22 +21,30 @@ RSpec.describe FinderMethods do
end
end
- let(:user) { create(:user) }
- let(:finder) { finder_class.new(user) }
- let(:authorized_project) { create(:project) }
- let(:unauthorized_project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:authorized_project) { create(:project) }
+ let_it_be(:unmatched_project) { create(:project, name: 'foo') }
+ let_it_be(:unauthorized_project) { create(:project) }
- before do
+ subject(:finder) { finder_class.new(user) }
+
+ before_all do
authorized_project.add_developer(user)
+ unmatched_project.add_developer(user)
end
+ # rubocop:disable Rails/FindById
describe '#find_by!' do
it 'returns the project if the user has access' do
expect(finder.find_by!(id: authorized_project.id)).to eq(authorized_project)
end
- it 'raises not found when the project is not found' do
- expect { finder.find_by!(id: 0) }.to raise_error(ActiveRecord::RecordNotFound)
+ it 'raises not found when the project is not found by id' do
+ expect { finder.find_by!(id: non_existing_record_id) }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'raises not found when the project is not found by filter' do
+ expect { finder.find_by!(id: unmatched_project.id) }.to raise_error(ActiveRecord::RecordNotFound)
end
it 'raises not found the user does not have access' do
@@ -53,19 +61,34 @@ RSpec.describe FinderMethods do
finder.find_by!(id: authorized_project.id)
end
end
+ # rubocop:enable Rails/FindById
describe '#find' do
it 'returns the project if the user has access' do
expect(finder.find(authorized_project.id)).to eq(authorized_project)
end
- it 'raises not found when the project is not found' do
- expect { finder.find(0) }.to raise_error(ActiveRecord::RecordNotFound)
+ it 'raises not found when the project is not found by id' do
+ expect { finder.find(non_existing_record_id) }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'raises not found when the project is not found by filter' do
+ expect { finder.find(unmatched_project.id) }.to raise_error(ActiveRecord::RecordNotFound)
end
it 'raises not found the user does not have access' do
expect { finder.find(unauthorized_project.id) }.to raise_error(ActiveRecord::RecordNotFound)
end
+
+ it 'ignores ordering' do
+ # Memoise the finder result so we can add message expectations to it
+ relation = finder.execute
+ allow(finder).to receive(:execute).and_return(relation)
+
+ expect(relation).to receive(:reorder).with(nil).and_call_original
+
+ finder.find(authorized_project.id)
+ end
end
describe '#find_by' do
@@ -73,8 +96,12 @@ RSpec.describe FinderMethods do
expect(finder.find_by(id: authorized_project.id)).to eq(authorized_project)
end
- it 'returns nil when the project is not found' do
- expect(finder.find_by(id: 0)).to be_nil
+ it 'returns nil when the project is not found by id' do
+ expect(finder.find_by(id: non_existing_record_id)).to be_nil
+ end
+
+ it 'returns nil when the project is not found by filter' do
+ expect(finder.find_by(id: unmatched_project.id)).to be_nil
end
it 'returns nil when the user does not have access' do
diff --git a/spec/finders/concerns/finder_with_cross_project_access_spec.rb b/spec/finders/concerns/finder_with_cross_project_access_spec.rb
index 116b523bd99..0798528c200 100644
--- a/spec/finders/concerns/finder_with_cross_project_access_spec.rb
+++ b/spec/finders/concerns/finder_with_cross_project_access_spec.rb
@@ -93,11 +93,11 @@ RSpec.describe FinderWithCrossProjectAccess do
it 'checks the accessibility of the subject directly' do
expect_access_check_on_result
- finder.find_by!(id: result.id)
+ finder.find(result.id)
end
it 're-enables the check after the find failed' do
- finder.find_by!(id: non_existing_record_id) rescue ActiveRecord::RecordNotFound
+ finder.find(non_existing_record_id) rescue ActiveRecord::RecordNotFound
expect(finder.instance_variable_get(:@should_skip_cross_project_check))
.to eq(false)
diff --git a/spec/finders/keys_finder_spec.rb b/spec/finders/keys_finder_spec.rb
index 277c852c953..332aa7afde1 100644
--- a/spec/finders/keys_finder_spec.rb
+++ b/spec/finders/keys_finder_spec.rb
@@ -5,23 +5,22 @@ require 'spec_helper'
RSpec.describe KeysFinder do
subject { described_class.new(params).execute }
- let(:user) { create(:user) }
- let(:params) { {} }
-
- let!(:key_1) do
- create(:personal_key,
+ let_it_be(:user) { create(:user) }
+ let_it_be(:key_1) do
+ create(:rsa_key_4096,
last_used_at: 7.days.ago,
user: user,
- key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1016k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=',
- fingerprint: 'ba:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d1',
- fingerprint_sha256: 'nUhzNyftwADy8AH3wFY31tAKs7HufskYTte2aXo/lCg')
+ fingerprint: 'df:73:db:29:3c:a5:32:cf:09:17:7e:8e:9d:de:d7:f7',
+ fingerprint_sha256: 'ByDU7hQ1JB95l6p53rHrffc4eXvEtqGUtQhS+Dhyy7g')
end
- let!(:key_2) { create(:personal_key, last_used_at: nil, user: user) }
- let!(:key_3) { create(:personal_key, last_used_at: 2.days.ago) }
+ let_it_be(:key_2) { create(:personal_key_4096, last_used_at: nil, user: user) }
+ let_it_be(:key_3) { create(:personal_key_4096, last_used_at: 2.days.ago) }
+
+ let(:params) { {} }
context 'key_type' do
- let!(:deploy_key) { create(:deploy_key) }
+ let_it_be(:deploy_key) { create(:deploy_key) }
context 'when `key_type` is `ssh`' do
before do
@@ -64,35 +63,41 @@ RSpec.describe KeysFinder do
end
context 'with valid fingerprints' do
- let!(:deploy_key) do
- create(:deploy_key,
- user: user,
- key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1017k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=',
- fingerprint: '8a:4a:12:92:0b:50:47:02:d4:5a:8e:a9:44:4e:08:b4',
- fingerprint_sha256: '4DPHOVNh53i9dHb5PpY2vjfyf5qniTx1/pBFPoZLDdk')
- end
+ let_it_be(:deploy_key) { create(:rsa_deploy_key_5120, user: user) }
context 'personal key with valid MD5 params' do
context 'with an existent fingerprint' do
before do
- params[:fingerprint] = 'ba:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d1'
+ params[:fingerprint] = 'df:73:db:29:3c:a5:32:cf:09:17:7e:8e:9d:de:d7:f7'
end
it 'returns the key' do
expect(subject).to eq(key_1)
expect(subject.user).to eq(user)
end
+
+ context 'with FIPS mode', :fips_mode do
+ it 'raises InvalidFingerprint' do
+ expect { subject }.to raise_error(KeysFinder::InvalidFingerprint)
+ end
+ end
end
context 'deploy key with an existent fingerprint' do
before do
- params[:fingerprint] = '8a:4a:12:92:0b:50:47:02:d4:5a:8e:a9:44:4e:08:b4'
+ params[:fingerprint] = 'fe:fa:3a:4d:7d:51:ec:bf:c7:64:0c:96:d0:17:8a:d0'
end
it 'returns the key' do
expect(subject).to eq(deploy_key)
expect(subject.user).to eq(user)
end
+
+ context 'with FIPS mode', :fips_mode do
+ it 'raises InvalidFingerprint' do
+ expect { subject }.to raise_error(KeysFinder::InvalidFingerprint)
+ end
+ end
end
context 'with a non-existent fingerprint' do
@@ -103,13 +108,19 @@ RSpec.describe KeysFinder do
it 'returns nil' do
expect(subject).to be_nil
end
+
+ context 'with FIPS mode', :fips_mode do
+ it 'raises InvalidFingerprint' do
+ expect { subject }.to raise_error(KeysFinder::InvalidFingerprint)
+ end
+ end
end
end
context 'personal key with valid SHA256 params' do
context 'with an existent fingerprint' do
before do
- params[:fingerprint] = 'SHA256:nUhzNyftwADy8AH3wFY31tAKs7HufskYTte2aXo/lCg'
+ params[:fingerprint] = 'SHA256:ByDU7hQ1JB95l6p53rHrffc4eXvEtqGUtQhS+Dhyy7g'
end
it 'returns key' do
@@ -120,7 +131,7 @@ RSpec.describe KeysFinder do
context 'deploy key with an existent fingerprint' do
before do
- params[:fingerprint] = 'SHA256:4DPHOVNh53i9dHb5PpY2vjfyf5qniTx1/pBFPoZLDdk'
+ params[:fingerprint] = 'SHA256:PCCupLbFHScm4AbEufbGDvhBU27IM0MVAor715qKQK8'
end
it 'returns key' do
diff --git a/spec/finders/packages/build_infos_for_many_packages_finder_spec.rb b/spec/finders/packages/build_infos_for_many_packages_finder_spec.rb
new file mode 100644
index 00000000000..f3c79d0c825
--- /dev/null
+++ b/spec/finders/packages/build_infos_for_many_packages_finder_spec.rb
@@ -0,0 +1,136 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Packages::BuildInfosForManyPackagesFinder do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:package) { create(:package) }
+ let_it_be(:build_infos) { create_list(:package_build_info, 5, :with_pipeline, package: package) }
+ let_it_be(:build_info_with_empty_pipeline) { create(:package_build_info, package: package) }
+
+ let_it_be(:other_package) { create(:package) }
+ let_it_be(:other_build_infos) { create_list(:package_build_info, 5, :with_pipeline, package: other_package) }
+ let_it_be(:other_build_info_with_empty_pipeline) { create(:package_build_info, package: other_package) }
+
+ let_it_be(:all_build_infos) { build_infos + other_build_infos }
+
+ let(:finder) { described_class.new(packages, params) }
+ let(:packages) { nil }
+ let(:first) { nil }
+ let(:last) { nil }
+ let(:after) { nil }
+ let(:before) { nil }
+ let(:max_page_size) { nil }
+ let(:support_next_page) { false }
+ let(:params) do
+ {
+ first: first,
+ last: last,
+ after: after,
+ before: before,
+ max_page_size: max_page_size,
+ support_next_page: support_next_page
+ }
+ end
+
+ describe '#execute' do
+ subject { finder.execute }
+
+ shared_examples 'returning the expected build infos' do
+ let(:expected_build_infos) do
+ expected_build_infos_indexes.map do |idx|
+ all_build_infos[idx]
+ end
+ end
+
+ let(:after) do
+ all_build_infos[after_index].pipeline_id if after_index
+ end
+
+ let(:before) do
+ all_build_infos[before_index].pipeline_id if before_index
+ end
+
+ it { is_expected.to eq(expected_build_infos) }
+ end
+
+ context 'with nil packages' do
+ let(:packages) { nil }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'with [] packages' do
+ let(:packages) { [] }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'with empy scope packages' do
+ let(:packages) { Packages::Package.none }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'with a single package' do
+ let(:packages) { package.id }
+
+ # rubocop: disable Layout/LineLength
+ where(:first, :last, :after_index, :before_index, :max_page_size, :support_next_page, :expected_build_infos_indexes) do
+ # F L AI BI MPS SNP
+ nil | nil | nil | nil | nil | false | [4, 3, 2, 1, 0]
+ nil | nil | nil | nil | 10 | false | [4, 3, 2, 1, 0]
+ nil | nil | nil | nil | 2 | false | [4, 3]
+ 2 | nil | nil | nil | nil | false | [4, 3]
+ 2 | nil | nil | nil | nil | true | [4, 3, 2]
+ 2 | nil | 3 | nil | nil | false | [2, 1]
+ 2 | nil | 3 | nil | nil | true | [2, 1, 0]
+ 3 | nil | 4 | nil | 2 | false | [3, 2]
+ 3 | nil | 4 | nil | 2 | true | [3, 2, 1]
+ nil | 2 | nil | nil | nil | false | [1, 0]
+ nil | 2 | nil | nil | nil | true | [2, 1, 0]
+ nil | 2 | nil | 1 | nil | false | [3, 2]
+ nil | 2 | nil | 1 | nil | true | [4, 3, 2]
+ nil | 3 | nil | 0 | 2 | false | [2, 1]
+ nil | 3 | nil | 0 | 2 | true | [3, 2, 1]
+ end
+ # rubocop: enable Layout/LineLength
+
+ with_them do
+ it_behaves_like 'returning the expected build infos'
+ end
+ end
+
+ context 'with many packages' do
+ let(:packages) { [package.id, other_package.id] }
+
+ # using after_index/before_index when receiving multiple packages doesn't
+ # make sense but we still verify here that the behavior is coherent.
+ # rubocop: disable Layout/LineLength
+ where(:first, :last, :after_index, :before_index, :max_page_size, :support_next_page, :expected_build_infos_indexes) do
+ # F L AI BI MPS SNP
+ nil | nil | nil | nil | nil | false | [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
+ nil | nil | nil | nil | 10 | false | [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
+ nil | nil | nil | nil | 2 | false | [9, 8, 4, 3]
+ 2 | nil | nil | nil | nil | false | [9, 8, 4, 3]
+ 2 | nil | nil | nil | nil | true | [9, 8, 7, 4, 3, 2]
+ 2 | nil | 3 | nil | nil | false | [2, 1]
+ 2 | nil | 3 | nil | nil | true | [2, 1, 0]
+ 3 | nil | 4 | nil | 2 | false | [3, 2]
+ 3 | nil | 4 | nil | 2 | true | [3, 2, 1]
+ nil | 2 | nil | nil | nil | false | [6, 5, 1, 0]
+ nil | 2 | nil | nil | nil | true | [7, 6, 5, 2, 1, 0]
+ nil | 2 | nil | 1 | nil | false | [6, 5, 3, 2]
+ nil | 2 | nil | 1 | nil | true | [7, 6, 5, 4, 3, 2]
+ nil | 3 | nil | 0 | 2 | false | [6, 5, 2, 1]
+ nil | 3 | nil | 0 | 2 | true | [7, 6, 5, 3, 2, 1]
+ end
+
+ with_them do
+ it_behaves_like 'returning the expected build infos'
+ end
+ # rubocop: enable Layout/LineLength
+ end
+ end
+end
diff --git a/spec/finders/packages/group_packages_finder_spec.rb b/spec/finders/packages/group_packages_finder_spec.rb
index c2dbfb59eb2..954db6481cd 100644
--- a/spec/finders/packages/group_packages_finder_spec.rb
+++ b/spec/finders/packages/group_packages_finder_spec.rb
@@ -149,6 +149,22 @@ RSpec.describe Packages::GroupPackagesFinder do
it { is_expected.to match_array([package1, package2]) }
end
+ context 'preload_pipelines' do
+ it 'preloads pipelines by default' do
+ expect(Packages::Package).to receive(:preload_pipelines).and_call_original
+ expect(subject).to match_array([package1, package2])
+ end
+
+ context 'set to false' do
+ let(:params) { { preload_pipelines: false } }
+
+ it 'does not preload pipelines' do
+ expect(Packages::Package).not_to receive(:preload_pipelines)
+ expect(subject).to match_array([package1, package2])
+ end
+ end
+ end
+
context 'with package_name' do
let_it_be(:named_package) { create(:maven_package, project: project, name: 'maven') }
diff --git a/spec/finders/packages/packages_finder_spec.rb b/spec/finders/packages/packages_finder_spec.rb
index b72f4aab3ec..6cea0a44541 100644
--- a/spec/finders/packages/packages_finder_spec.rb
+++ b/spec/finders/packages/packages_finder_spec.rb
@@ -81,6 +81,22 @@ RSpec.describe ::Packages::PackagesFinder do
it { is_expected.to match_array([conan_package, maven_package]) }
end
+ context 'preload_pipelines' do
+ it 'preloads pipelines by default' do
+ expect(Packages::Package).to receive(:preload_pipelines).and_call_original
+ expect(subject).to match_array([maven_package, conan_package])
+ end
+
+ context 'set to false' do
+ let(:params) { { preload_pipelines: false } }
+
+ it 'does not preload pipelines' do
+ expect(Packages::Package).not_to receive(:preload_pipelines)
+ expect(subject).to match_array([maven_package, conan_package])
+ end
+ end
+ end
+
it_behaves_like 'concerning versionless param'
it_behaves_like 'concerning package statuses'
end
diff --git a/spec/finders/releases/group_releases_finder_spec.rb b/spec/finders/releases/group_releases_finder_spec.rb
index b8899a8ee40..5eac6f4fbdc 100644
--- a/spec/finders/releases/group_releases_finder_spec.rb
+++ b/spec/finders/releases/group_releases_finder_spec.rb
@@ -95,8 +95,6 @@ RSpec.describe Releases::GroupReleasesFinder do
end
describe 'with subgroups' do
- let(:params) { { include_subgroups: true } }
-
subject(:releases) { described_class.new(group, user, params).execute(**args) }
context 'with a single-level subgroup' do
@@ -164,22 +162,12 @@ RSpec.describe Releases::GroupReleasesFinder do
end
end
- context 'when the user a guest on the group' do
- before do
- group.add_guest(user)
- end
-
- it 'returns all releases' do
- expect(releases).to match_array([v1_1_1, v1_1_0, v6, v1_0_0, p3])
- end
- end
-
context 'performance testing' do
shared_examples 'avoids N+1 queries' do |query_params = {}|
context 'with subgroups' do
let(:params) { query_params }
- it 'include_subgroups avoids N+1 queries' do
+ it 'subgroups avoids N+1 queries' do
control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) do
releases
end.count
@@ -196,7 +184,6 @@ RSpec.describe Releases::GroupReleasesFinder do
end
it_behaves_like 'avoids N+1 queries'
- it_behaves_like 'avoids N+1 queries', { simple: true }
end
end
end
diff --git a/spec/finders/user_recent_events_finder_spec.rb b/spec/finders/user_recent_events_finder_spec.rb
index 6019d22059d..d7f7bb9cebe 100644
--- a/spec/finders/user_recent_events_finder_spec.rb
+++ b/spec/finders/user_recent_events_finder_spec.rb
@@ -8,9 +8,9 @@ RSpec.describe UserRecentEventsFinder do
let_it_be(:private_project) { create(:project, :private, creator: project_owner) }
let_it_be(:internal_project) { create(:project, :internal, creator: project_owner) }
let_it_be(:public_project) { create(:project, :public, creator: project_owner) }
- let!(:private_event) { create(:event, project: private_project, author: project_owner) }
- let!(:internal_event) { create(:event, project: internal_project, author: project_owner) }
- let!(:public_event) { create(:event, project: public_project, author: project_owner) }
+ let_it_be(:private_event) { create(:event, project: private_project, author: project_owner) }
+ let_it_be(:internal_event) { create(:event, project: internal_project, author: project_owner) }
+ let_it_be(:public_event) { create(:event, project: public_project, author: project_owner) }
let_it_be(:issue) { create(:issue, project: public_project) }
let(:limit) { nil }
@@ -18,210 +18,266 @@ RSpec.describe UserRecentEventsFinder do
subject(:finder) { described_class.new(current_user, project_owner, nil, params) }
- describe '#execute' do
- context 'when profile is public' do
- it 'returns all the events' do
- expect(finder.execute).to include(private_event, internal_event, public_event)
+ shared_examples 'UserRecentEventsFinder examples' do
+ describe '#execute' do
+ context 'when profile is public' do
+ it 'returns all the events' do
+ expect(finder.execute).to include(private_event, internal_event, public_event)
+ end
end
- end
- context 'when profile is private' do
- it 'returns no event' do
- allow(Ability).to receive(:allowed?).and_call_original
- allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, project_owner).and_return(false)
+ context 'when profile is private' do
+ it 'returns no event' do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, project_owner).and_return(false)
- expect(finder.execute).to be_empty
+ expect(finder.execute).to be_empty
+ end
end
- end
- it 'does not include the events if the user cannot read cross project' do
- allow(Ability).to receive(:allowed?).and_call_original
- expect(Ability).to receive(:allowed?).with(current_user, :read_cross_project) { false }
+ it 'does not include the events if the user cannot read cross project' do
+ allow(Ability).to receive(:allowed?).and_call_original
+ expect(Ability).to receive(:allowed?).with(current_user, :read_cross_project) { false }
- expect(finder.execute).to be_empty
- end
+ expect(finder.execute).to be_empty
+ end
- context 'events from multiple users' do
- let_it_be(:second_user, reload: true) { create(:user) }
- let_it_be(:private_project_second_user) { create(:project, :private, creator: second_user) }
+ context 'events from multiple users' do
+ let_it_be(:second_user, reload: true) { create(:user) }
+ let_it_be(:private_project_second_user) { create(:project, :private, creator: second_user) }
- let(:internal_project_second_user) { create(:project, :internal, creator: second_user) }
- let(:public_project_second_user) { create(:project, :public, creator: second_user) }
- let!(:private_event_second_user) { create(:event, project: private_project_second_user, author: second_user) }
- let!(:internal_event_second_user) { create(:event, project: internal_project_second_user, author: second_user) }
- let!(:public_event_second_user) { create(:event, project: public_project_second_user, author: second_user) }
+ let_it_be(:internal_project_second_user) { create(:project, :internal, creator: second_user) }
+ let_it_be(:public_project_second_user) { create(:project, :public, creator: second_user) }
+ let_it_be(:private_event_second_user) { create(:event, project: private_project_second_user, author: second_user) }
+ let_it_be(:internal_event_second_user) { create(:event, project: internal_project_second_user, author: second_user) }
+ let_it_be(:public_event_second_user) { create(:event, project: public_project_second_user, author: second_user) }
- it 'includes events from all users', :aggregate_failures do
- events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
+ it 'includes events from all users', :aggregate_failures do
+ events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
- expect(events).to include(private_event, internal_event, public_event)
- expect(events).to include(private_event_second_user, internal_event_second_user, public_event_second_user)
- expect(events.size).to eq(6)
- end
+ expect(events).to include(private_event, internal_event, public_event)
+ expect(events).to include(private_event_second_user, internal_event_second_user, public_event_second_user)
+ expect(events.size).to eq(6)
+ end
- context 'selected events' do
- let!(:push_event) { create(:push_event, project: public_project, author: project_owner) }
- let!(:push_event_second_user) { create(:push_event, project: public_project_second_user, author: second_user) }
+ context 'selected events' do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:push_event1) { create(:push_event, project: public_project, author: project_owner) }
+ let_it_be(:push_event2) { create(:push_event, project: public_project_second_user, author: second_user) }
+ let_it_be(:merge_event1) { create(:event, :merged, target_type: MergeRequest.to_s, project: public_project, author: project_owner) }
+ let_it_be(:merge_event2) { create(:event, :merged, target_type: MergeRequest.to_s, project: public_project_second_user, author: second_user) }
+ let_it_be(:comment_event1) { create(:event, :commented, target_type: Note.to_s, project: public_project, author: project_owner) }
+ let_it_be(:comment_event2) { create(:event, :commented, target_type: DiffNote.to_s, project: public_project, author: project_owner) }
+ let_it_be(:comment_event3) { create(:event, :commented, target_type: DiscussionNote.to_s, project: public_project_second_user, author: second_user) }
+ let_it_be(:issue_event1) { create(:event, :created, project: public_project, target: issue, author: project_owner) }
+ let_it_be(:issue_event2) { create(:event, :updated, project: public_project, target: issue, author: project_owner) }
+ let_it_be(:issue_event3) { create(:event, :closed, project: public_project_second_user, target: issue, author: second_user) }
+ let_it_be(:wiki_event1) { create(:wiki_page_event, project: public_project, author: project_owner) }
+ let_it_be(:wiki_event2) { create(:wiki_page_event, project: public_project_second_user, author: second_user) }
+ let_it_be(:design_event1) { create(:design_event, project: public_project, author: project_owner) }
+ let_it_be(:design_event2) { create(:design_updated_event, project: public_project_second_user, author: second_user) }
+
+ where(:event_filter, :ordered_expected_events) do
+ EventFilter.new(EventFilter::PUSH) | lazy { [push_event1, push_event2] }
+ EventFilter.new(EventFilter::MERGED) | lazy { [merge_event1, merge_event2] }
+ EventFilter.new(EventFilter::COMMENTS) | lazy { [comment_event1, comment_event2, comment_event3] }
+ EventFilter.new(EventFilter::TEAM) | lazy { [private_event, internal_event, public_event, private_event_second_user, internal_event_second_user, public_event_second_user] }
+ EventFilter.new(EventFilter::ISSUE) | lazy { [issue_event1, issue_event2, issue_event3] }
+ EventFilter.new(EventFilter::WIKI) | lazy { [wiki_event1, wiki_event2] }
+ EventFilter.new(EventFilter::DESIGNS) | lazy { [design_event1, design_event2] }
+ end
- it 'only includes selected events (PUSH) from all users', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::PUSH)
- events = described_class.new(current_user, [project_owner, second_user], event_filter, params).execute
+ with_them do
+ it 'only returns selected events from all users (id DESC)' do
+ events = described_class.new(current_user, [project_owner, second_user], event_filter, params).execute
- expect(events).to contain_exactly(push_event, push_event_second_user)
+ expect(events).to eq(ordered_expected_events.reverse)
+ end
+ end
end
- end
- it 'does not include events from users with private profile', :aggregate_failures do
- allow(Ability).to receive(:allowed?).and_call_original
- allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, second_user).and_return(false)
+ it 'does not include events from users with private profile', :aggregate_failures do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, second_user).and_return(false)
- events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
+ events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
- expect(events).to contain_exactly(private_event, internal_event, public_event)
- end
+ expect(events).to contain_exactly(private_event, internal_event, public_event)
+ end
- context 'with pagination params' do
- using RSpec::Parameterized::TableSyntax
+ context 'with pagination params' do
+ using RSpec::Parameterized::TableSyntax
- where(:limit, :offset, :ordered_expected_events) do
- nil | nil | lazy { [public_event_second_user, internal_event_second_user, private_event_second_user, public_event, internal_event, private_event] }
- 2 | nil | lazy { [public_event_second_user, internal_event_second_user] }
- nil | 4 | lazy { [internal_event, private_event] }
- 2 | 2 | lazy { [private_event_second_user, public_event] }
- end
+ where(:limit, :offset, :ordered_expected_events) do
+ nil | nil | lazy { [public_event_second_user, internal_event_second_user, private_event_second_user, public_event, internal_event, private_event] }
+ 2 | nil | lazy { [public_event_second_user, internal_event_second_user] }
+ nil | 4 | lazy { [internal_event, private_event] }
+ 2 | 2 | lazy { [private_event_second_user, public_event] }
+ end
- with_them do
- let(:params) { { limit: limit, offset: offset }.compact }
+ with_them do
+ let(:params) { { limit: limit, offset: offset }.compact }
- it 'returns paginated events sorted by id (DESC)' do
- events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
+ it 'returns paginated events sorted by id (DESC)' do
+ events = described_class.new(current_user, [project_owner, second_user], nil, params).execute
- expect(events).to eq(ordered_expected_events)
+ expect(events).to eq(ordered_expected_events)
+ end
end
end
end
- end
- context 'filter activity events' do
- let!(:push_event) { create(:push_event, project: public_project, author: project_owner) }
- let!(:merge_event) { create(:event, :merged, project: public_project, author: project_owner) }
- let!(:issue_event) { create(:event, :closed, project: public_project, target: issue, author: project_owner) }
- let!(:comment_event) { create(:event, :commented, project: public_project, author: project_owner) }
- let!(:wiki_event) { create(:wiki_page_event, project: public_project, author: project_owner) }
- let!(:design_event) { create(:design_event, project: public_project, author: project_owner) }
- let!(:team_event) { create(:event, :joined, project: public_project, author: project_owner) }
-
- it 'includes all events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::ALL)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
-
- expect(events).to include(private_event, internal_event, public_event)
- expect(events).to include(push_event, merge_event, issue_event, comment_event, wiki_event, design_event, team_event)
- expect(events.size).to eq(10)
- end
+ context 'filter activity events' do
+ let_it_be(:push_event) { create(:push_event, project: public_project, author: project_owner) }
+ let_it_be(:merge_event) { create(:event, :merged, project: public_project, author: project_owner) }
+ let_it_be(:issue_event) { create(:event, :closed, project: public_project, target: issue, author: project_owner) }
+ let_it_be(:comment_event) { create(:event, :commented, project: public_project, author: project_owner) }
+ let_it_be(:wiki_event) { create(:wiki_page_event, project: public_project, author: project_owner) }
+ let_it_be(:design_event) { create(:design_event, project: public_project, author: project_owner) }
+ let_it_be(:team_event) { create(:event, :joined, project: public_project, author: project_owner) }
+
+ it 'includes all events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::ALL)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
+
+ expect(events).to include(private_event, internal_event, public_event)
+ expect(events).to include(push_event, merge_event, issue_event, comment_event, wiki_event, design_event, team_event)
+ expect(events.size).to eq(10)
+ end
- it 'only includes push events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::PUSH)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ context 'when unknown filter is given' do
+ it 'includes returns all events', :aggregate_failures do
+ event_filter = EventFilter.new('unknown')
+ allow(event_filter).to receive(:filter).and_return('unknown')
- expect(events).to include(push_event)
- expect(events.size).to eq(1)
- end
+ events = described_class.new(current_user, [project_owner], event_filter, params).execute
- it 'only includes merge events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::MERGED)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(private_event, internal_event, public_event)
+ expect(events).to include(push_event, merge_event, issue_event, comment_event, wiki_event, design_event, team_event)
+ expect(events.size).to eq(10)
+ end
+ end
- expect(events).to include(merge_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes push events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::PUSH)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes issue events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::ISSUE)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(push_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(issue_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes merge events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::MERGED)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes comments events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::COMMENTS)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(merge_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(comment_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes issue events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::ISSUE)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes wiki events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::WIKI)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(issue_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(wiki_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes comments events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::COMMENTS)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes design events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::DESIGNS)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(comment_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(design_event)
- expect(events.size).to eq(1)
- end
+ it 'only includes wiki events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::WIKI)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- it 'only includes team events', :aggregate_failures do
- event_filter = EventFilter.new(EventFilter::TEAM)
- events = described_class.new(current_user, project_owner, event_filter, params).execute
+ expect(events).to include(wiki_event)
+ expect(events.size).to eq(1)
+ end
- expect(events).to include(private_event, internal_event, public_event, team_event)
- expect(events.size).to eq(4)
- end
- end
+ it 'only includes design events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::DESIGNS)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- describe 'issue activity events' do
- let(:issue) { create(:issue, project: public_project) }
- let(:note) { create(:note_on_issue, noteable: issue, project: public_project) }
- let!(:event_a) { create(:event, :commented, target: note, author: project_owner) }
- let!(:event_b) { create(:event, :closed, target: issue, author: project_owner) }
+ expect(events).to include(design_event)
+ expect(events.size).to eq(1)
+ end
- it 'includes all issue related events', :aggregate_failures do
- events = finder.execute
+ it 'only includes team events', :aggregate_failures do
+ event_filter = EventFilter.new(EventFilter::TEAM)
+ events = described_class.new(current_user, project_owner, event_filter, params).execute
- expect(events).to include(event_a)
- expect(events).to include(event_b)
+ expect(events).to include(private_event, internal_event, public_event, team_event)
+ expect(events.size).to eq(4)
+ end
end
- end
- context 'limits' do
- before do
- stub_const("#{described_class}::DEFAULT_LIMIT", 1)
- stub_const("#{described_class}::MAX_LIMIT", 3)
- end
+ describe 'issue activity events' do
+ let(:issue) { create(:issue, project: public_project) }
+ let(:note) { create(:note_on_issue, noteable: issue, project: public_project) }
+ let!(:event_a) { create(:event, :commented, target: note, author: project_owner) }
+ let!(:event_b) { create(:event, :closed, target: issue, author: project_owner) }
- context 'when limit is not set' do
- it 'returns events limited to DEFAULT_LIMIT' do
- expect(finder.execute.size).to eq(described_class::DEFAULT_LIMIT)
+ it 'includes all issue related events', :aggregate_failures do
+ events = finder.execute
+
+ expect(events).to include(event_a)
+ expect(events).to include(event_b)
end
end
- context 'when limit is set' do
- let(:limit) { 2 }
+ context 'limits' do
+ before do
+ stub_const("#{described_class}::DEFAULT_LIMIT", 1)
+ stub_const("#{described_class}::MAX_LIMIT", 3)
+ end
- it 'returns events limited to specified limit' do
- expect(finder.execute.size).to eq(limit)
+ context 'when limit is not set' do
+ it 'returns events limited to DEFAULT_LIMIT' do
+ expect(finder.execute.size).to eq(described_class::DEFAULT_LIMIT)
+ end
end
- end
- context 'when limit is set to a number that exceeds maximum limit' do
- let(:limit) { 4 }
+ context 'when limit is set' do
+ let(:limit) { 2 }
- before do
- create(:event, project: public_project, author: project_owner)
+ it 'returns events limited to specified limit' do
+ expect(finder.execute.size).to eq(limit)
+ end
end
- it 'returns events limited to MAX_LIMIT' do
- expect(finder.execute.size).to eq(described_class::MAX_LIMIT)
+ context 'when limit is set to a number that exceeds maximum limit' do
+ let(:limit) { 4 }
+
+ before do
+ create(:event, project: public_project, author: project_owner)
+ end
+
+ it 'returns events limited to MAX_LIMIT' do
+ expect(finder.execute.size).to eq(described_class::MAX_LIMIT)
+ end
end
end
end
end
+
+ context 'when the optimized_followed_users_queries FF is on' do
+ before do
+ stub_feature_flags(optimized_followed_users_queries: true)
+ end
+
+ it_behaves_like 'UserRecentEventsFinder examples'
+ end
+
+ context 'when the optimized_followed_users_queries FF is off' do
+ before do
+ stub_feature_flags(optimized_followed_users_queries: false)
+ end
+
+ it_behaves_like 'UserRecentEventsFinder examples'
+ end
end
diff --git a/spec/finders/users_finder_spec.rb b/spec/finders/users_finder_spec.rb
index fab48cf3178..271dce44db7 100644
--- a/spec/finders/users_finder_spec.rb
+++ b/spec/finders/users_finder_spec.rb
@@ -6,13 +6,15 @@ RSpec.describe UsersFinder do
describe '#execute' do
include_context 'UsersFinder#execute filter by project context'
+ let_it_be(:project_bot) { create(:user, :project_bot) }
+
context 'with a normal user' do
- let(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
- it 'returns all users' do
+ it 'returns searchable users' do
users = described_class.new(user).execute
- expect(users).to contain_exactly(user, normal_user, blocked_user, external_user, omniauth_user, internal_user, admin_user)
+ expect(users).to contain_exactly(user, normal_user, external_user, unconfirmed_user, omniauth_user, internal_user, admin_user, project_bot)
end
it 'filters by username' do
@@ -34,9 +36,9 @@ RSpec.describe UsersFinder do
end
it 'filters by search' do
- users = described_class.new(user, search: 'orando').execute
+ users = described_class.new(user, search: 'ohndo').execute
- expect(users).to contain_exactly(blocked_user)
+ expect(users).to contain_exactly(normal_user)
end
it 'does not filter by private emails search' do
@@ -45,18 +47,6 @@ RSpec.describe UsersFinder do
expect(users).to be_empty
end
- it 'filters by blocked users' do
- users = described_class.new(user, blocked: true).execute
-
- expect(users).to contain_exactly(blocked_user)
- end
-
- it 'filters by active users' do
- users = described_class.new(user, active: true).execute
-
- expect(users).to contain_exactly(user, normal_user, external_user, omniauth_user, admin_user)
- end
-
it 'filters by external users' do
users = described_class.new(user, external: true).execute
@@ -66,7 +56,7 @@ RSpec.describe UsersFinder do
it 'filters by non external users' do
users = described_class.new(user, non_external: true).execute
- expect(users).to contain_exactly(user, normal_user, blocked_user, omniauth_user, internal_user, admin_user)
+ expect(users).to contain_exactly(user, normal_user, unconfirmed_user, omniauth_user, internal_user, admin_user, project_bot)
end
it 'filters by created_at' do
@@ -83,7 +73,7 @@ RSpec.describe UsersFinder do
it 'filters by non internal users' do
users = described_class.new(user, non_internal: true).execute
- expect(users).to contain_exactly(user, normal_user, external_user, blocked_user, omniauth_user, admin_user)
+ expect(users).to contain_exactly(user, normal_user, unconfirmed_user, external_user, omniauth_user, admin_user, project_bot)
end
it 'does not filter by custom attributes' do
@@ -92,23 +82,23 @@ RSpec.describe UsersFinder do
custom_attributes: { foo: 'bar' }
).execute
- expect(users).to contain_exactly(user, normal_user, blocked_user, external_user, omniauth_user, internal_user, admin_user)
+ expect(users).to contain_exactly(user, normal_user, external_user, unconfirmed_user, omniauth_user, internal_user, admin_user, project_bot)
end
it 'orders returned results' do
users = described_class.new(user, sort: 'id_asc').execute
- expect(users).to eq([normal_user, admin_user, blocked_user, external_user, omniauth_user, internal_user, user])
+ expect(users).to eq([normal_user, admin_user, external_user, unconfirmed_user, omniauth_user, internal_user, project_bot, user])
end
it 'does not filter by admins' do
users = described_class.new(user, admins: true).execute
- expect(users).to contain_exactly(user, normal_user, external_user, admin_user, blocked_user, omniauth_user, internal_user)
+ expect(users).to contain_exactly(user, normal_user, external_user, admin_user, unconfirmed_user, omniauth_user, internal_user, project_bot)
end
end
context 'with an admin user', :enable_admin_mode do
- let(:admin) { create(:admin) }
+ let_it_be(:admin) { create(:admin) }
it 'filters by external users' do
users = described_class.new(admin, external: true).execute
@@ -119,7 +109,19 @@ RSpec.describe UsersFinder do
it 'returns all users' do
users = described_class.new(admin).execute
- expect(users).to contain_exactly(admin, normal_user, blocked_user, external_user, omniauth_user, internal_user, admin_user)
+ expect(users).to contain_exactly(admin, normal_user, blocked_user, unconfirmed_user, banned_user, external_user, omniauth_user, internal_user, admin_user, project_bot)
+ end
+
+ it 'filters by blocked users' do
+ users = described_class.new(admin, blocked: true).execute
+
+ expect(users).to contain_exactly(blocked_user)
+ end
+
+ it 'filters by active users' do
+ users = described_class.new(admin, active: true).execute
+
+ expect(users).to contain_exactly(admin, normal_user, unconfirmed_user, external_user, omniauth_user, admin_user, project_bot)
end
it 'returns only admins' do
diff --git a/spec/fixtures/api/schemas/entities/member_user.json b/spec/fixtures/api/schemas/entities/member_user.json
index d42c686bb65..0750e81e115 100644
--- a/spec/fixtures/api/schemas/entities/member_user.json
+++ b/spec/fixtures/api/schemas/entities/member_user.json
@@ -1,15 +1,28 @@
{
"type": "object",
- "required": ["id", "name", "username", "avatar_url", "web_url", "blocked", "two_factor_enabled", "show_status"],
+ "required": [
+ "id",
+ "name",
+ "username",
+ "created_at",
+ "last_activity_on",
+ "avatar_url",
+ "web_url",
+ "blocked",
+ "two_factor_enabled",
+ "show_status"
+ ],
"properties": {
"id": { "type": "integer" },
"name": { "type": "string" },
"username": { "type": "string" },
+ "created_at": { "type": ["string"] },
"avatar_url": { "type": ["string", "null"] },
"web_url": { "type": "string" },
"blocked": { "type": "boolean" },
"two_factor_enabled": { "type": "boolean" },
"availability": { "type": ["string", "null"] },
+ "last_activity_on": { "type": ["string", "null"] },
"status": {
"type": "object",
"required": ["emoji"],
diff --git a/spec/fixtures/api/schemas/group_link/group_group_link.json b/spec/fixtures/api/schemas/group_link/group_group_link.json
index bfca5c885e3..689679cbc0f 100644
--- a/spec/fixtures/api/schemas/group_link/group_group_link.json
+++ b/spec/fixtures/api/schemas/group_link/group_group_link.json
@@ -4,12 +4,19 @@
{ "$ref": "group_link.json" },
{
"required": [
- "can_update",
- "can_remove"
+ "source"
],
"properties": {
- "can_update": { "type": "boolean" },
- "can_remove": { "type": "boolean" }
+ "source": {
+ "type": "object",
+ "required": ["id", "full_name", "web_url"],
+ "properties": {
+ "id": { "type": "integer" },
+ "full_name": { "type": "string" },
+ "web_url": { "type": "string" }
+ },
+ "additionalProperties": false
+ }
}
}
]
diff --git a/spec/fixtures/api/schemas/group_link/group_link.json b/spec/fixtures/api/schemas/group_link/group_link.json
index 300790728a8..3c2195df11e 100644
--- a/spec/fixtures/api/schemas/group_link/group_link.json
+++ b/spec/fixtures/api/schemas/group_link/group_link.json
@@ -5,7 +5,10 @@
"created_at",
"expires_at",
"access_level",
- "valid_roles"
+ "valid_roles",
+ "can_update",
+ "can_remove",
+ "is_direct_member"
],
"properties": {
"id": { "type": "integer" },
@@ -33,6 +36,9 @@
"web_url": { "type": "string" }
},
"additionalProperties": false
- }
+ },
+ "can_update": { "type": "boolean" },
+ "can_remove": { "type": "boolean" },
+ "is_direct_member": { "type": "boolean" }
}
}
diff --git a/spec/fixtures/api/schemas/group_link/project_group_link.json b/spec/fixtures/api/schemas/group_link/project_group_link.json
index bfca5c885e3..615c808e5aa 100644
--- a/spec/fixtures/api/schemas/group_link/project_group_link.json
+++ b/spec/fixtures/api/schemas/group_link/project_group_link.json
@@ -4,12 +4,18 @@
{ "$ref": "group_link.json" },
{
"required": [
- "can_update",
- "can_remove"
+ "source"
],
"properties": {
- "can_update": { "type": "boolean" },
- "can_remove": { "type": "boolean" }
+ "source": {
+ "type": "object",
+ "required": ["id", "full_name"],
+ "properties": {
+ "id": { "type": "integer" },
+ "full_name": { "type": "string" }
+ },
+ "additionalProperties": false
+ }
}
}
]
diff --git a/spec/fixtures/api/schemas/public_api/v4/agent.json b/spec/fixtures/api/schemas/public_api/v4/agent.json
new file mode 100644
index 00000000000..4821d5e0b04
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/agent.json
@@ -0,0 +1,18 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "config_project",
+ "created_at",
+ "created_by_user_id"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "name": { "type": "string" },
+ "config_project": { "$ref": "project_identity.json" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "created_by_user_id": { "type": "integer" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/agents.json b/spec/fixtures/api/schemas/public_api/v4/agents.json
new file mode 100644
index 00000000000..5fe3d7f9481
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/agents.json
@@ -0,0 +1,4 @@
+{
+ "type": "array",
+ "items": { "$ref": "agent.json" }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/issue.json b/spec/fixtures/api/schemas/public_api/v4/issue.json
index 3173a8ebfb5..90b368b5226 100644
--- a/spec/fixtures/api/schemas/public_api/v4/issue.json
+++ b/spec/fixtures/api/schemas/public_api/v4/issue.json
@@ -86,6 +86,7 @@
"due_date": { "type": ["string", "null"] },
"confidential": { "type": "boolean" },
"web_url": { "type": "uri" },
+ "severity": { "type": "string", "enum": ["UNKNOWN", "LOW", "MEDIUM", "HIGH", "CRITICAL"] },
"time_stats": {
"time_estimate": { "type": "integer" },
"total_time_spent": { "type": "integer" },
diff --git a/spec/fixtures/api/schemas/public_api/v4/issue_links.json b/spec/fixtures/api/schemas/public_api/v4/issue_links.json
deleted file mode 100644
index d254615dd58..00000000000
--- a/spec/fixtures/api/schemas/public_api/v4/issue_links.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "type": "array",
- "items": {
- "type": "object",
- "properties" : {
- "$ref": "./issue_link.json"
- }
- }
-}
diff --git a/spec/fixtures/api/schemas/public_api/v4/project_identity.json b/spec/fixtures/api/schemas/public_api/v4/project_identity.json
new file mode 100644
index 00000000000..6471dd560c5
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/project_identity.json
@@ -0,0 +1,22 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "description",
+ "name",
+ "name_with_namespace",
+ "path",
+ "path_with_namespace",
+ "created_at"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "description": { "type": ["string", "null"] },
+ "name": { "type": "string" },
+ "name_with_namespace": { "type": "string" },
+ "path": { "type": "string" },
+ "path_with_namespace": { "type": "string" },
+ "created_at": { "type": "string", "format": "date-time" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/related_issues.json b/spec/fixtures/api/schemas/public_api/v4/related_issues.json
new file mode 100644
index 00000000000..83095ab44c1
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/related_issues.json
@@ -0,0 +1,26 @@
+{
+ "type": "array",
+ "items": {
+ "type": "object",
+ "allOf": [
+ { "$ref": "../../../../../../spec/fixtures/api/schemas/public_api/v4/issue.json" },
+ {
+ "required" : [
+ "link_type",
+ "issue_link_id",
+ "link_created_at",
+ "link_updated_at"
+ ],
+ "properties" : {
+ "link_type": {
+ "type": "string",
+ "enum": ["relates_to", "blocks", "is_blocked_by"]
+ },
+ "issue_link_id": { "type": "integer" },
+ "link_created_at": { "type": "string" },
+ "link_updated_at": { "type": "string" }
+ }
+ }
+ ]
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/release/release_for_guest.json b/spec/fixtures/api/schemas/public_api/v4/release/release_for_guest.json
index 465e1193a64..0f9a5ccfa7d 100644
--- a/spec/fixtures/api/schemas/public_api/v4/release/release_for_guest.json
+++ b/spec/fixtures/api/schemas/public_api/v4/release/release_for_guest.json
@@ -5,6 +5,7 @@
"name": { "type": "string" },
"description": { "type": "string" },
"description_html": { "type": "string" },
+ "tag_name": { "type": "string"},
"created_at": { "type": "string", "format": "date-time" },
"released_at": { "type": "string", "format": "date-time" },
"upcoming_release": { "type": "boolean" },
diff --git a/spec/fixtures/api/schemas/public_api/v4/resource_access_token.json b/spec/fixtures/api/schemas/public_api/v4/resource_access_token.json
new file mode 100644
index 00000000000..3636c970e83
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/resource_access_token.json
@@ -0,0 +1,31 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "user_id",
+ "active",
+ "created_at",
+ "expires_at",
+ "revoked",
+ "access_level",
+ "scopes",
+ "last_used_at"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "name": { "type": "string" },
+ "user_id": { "type": "integer" },
+ "active": { "type": "boolean" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "expires_at": { "type": ["string", "null"], "format": "date" },
+ "revoked": { "type": "boolean" },
+ "access_level": { "type": "integer" },
+ "scopes": {
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ "last_used_at": { "type": ["string", "null"], "format": "date-time" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/resource_access_tokens.json b/spec/fixtures/api/schemas/public_api/v4/resource_access_tokens.json
new file mode 100644
index 00000000000..1bf013b8bca
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/resource_access_tokens.json
@@ -0,0 +1,4 @@
+{
+ "type": "array",
+ "items": { "$ref": "resource_access_token.json" }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/user/admin.json b/spec/fixtures/api/schemas/public_api/v4/user/admin.json
index f733914fbf8..8d06e16848f 100644
--- a/spec/fixtures/api/schemas/public_api/v4/user/admin.json
+++ b/spec/fixtures/api/schemas/public_api/v4/user/admin.json
@@ -26,7 +26,8 @@
"can_create_group",
"can_create_project",
"two_factor_enabled",
- "external"
+ "external",
+ "namespace_id"
],
"properties": {
"$ref": "full.json"
diff --git a/spec/fixtures/avatars/avatar1.png b/spec/fixtures/avatars/avatar1.png
new file mode 100644
index 00000000000..7e8afb39f17
--- /dev/null
+++ b/spec/fixtures/avatars/avatar1.png
Binary files differ
diff --git a/spec/fixtures/avatars/avatar2.png b/spec/fixtures/avatars/avatar2.png
new file mode 100644
index 00000000000..462678b1871
--- /dev/null
+++ b/spec/fixtures/avatars/avatar2.png
Binary files differ
diff --git a/spec/fixtures/avatars/avatar3.png b/spec/fixtures/avatars/avatar3.png
new file mode 100644
index 00000000000..e065f681817
--- /dev/null
+++ b/spec/fixtures/avatars/avatar3.png
Binary files differ
diff --git a/spec/fixtures/avatars/avatar4.png b/spec/fixtures/avatars/avatar4.png
new file mode 100644
index 00000000000..647ee193cbd
--- /dev/null
+++ b/spec/fixtures/avatars/avatar4.png
Binary files differ
diff --git a/spec/fixtures/avatars/avatar5.png b/spec/fixtures/avatars/avatar5.png
new file mode 100644
index 00000000000..27e973dc5e3
--- /dev/null
+++ b/spec/fixtures/avatars/avatar5.png
Binary files differ
diff --git a/spec/fixtures/emails/service_desk_reply_to_and_from.eml b/spec/fixtures/emails/service_desk_reply_to_and_from.eml
deleted file mode 100644
index 2545e0d30f8..00000000000
--- a/spec/fixtures/emails/service_desk_reply_to_and_from.eml
+++ /dev/null
@@ -1,28 +0,0 @@
-Delivered-To: incoming+email-test-project_id-issue-@appmail.adventuretime.ooo
-Return-Path: <jake@adventuretime.ooo>
-Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
-Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
-Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+email-test-project_id-issue-@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
-Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
-Date: Thu, 13 Jun 2013 17:03:48 -0400
-Reply-To: Marceline <marceline@adventuretime.ooo>
-From: Finn the Human <finn@adventuretime.ooo>
-Sender: Jake the Dog <jake@adventuretime.ooo>
-To: support@adventuretime.ooo
-Delivered-To: support@adventuretime.ooo
-Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
-Subject: The message subject! @all
-Mime-Version: 1.0
-Content-Type: text/plain;
- charset=ISO-8859-1
-Content-Transfer-Encoding: 7bit
-X-Sieve: CMU Sieve 2.2
-X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
- 13 Jun 2013 14:03:48 -0700 (PDT)
-X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
-
-Service desk stuff!
-
-```
-a = b
-```
diff --git a/spec/fixtures/markdown/markdown_golden_master_examples.yml b/spec/fixtures/markdown/markdown_golden_master_examples.yml
index 8556811974d..bdd7c13c1a3 100644
--- a/spec/fixtures/markdown/markdown_golden_master_examples.yml
+++ b/spec/fixtures/markdown/markdown_golden_master_examples.yml
@@ -377,6 +377,34 @@
</ol>
</details>
+- name: diagram_kroki_nomnoml
+ markdown: |-
+ ```nomnoml
+ #stroke: #a86128
+ [<frame>Decorator pattern|
+ [<abstract>Component||+ operation()]
+ [Client] depends --> [Component]
+ [Decorator|- next: Component]
+ [Decorator] decorates -- [ConcreteComponent]
+ [Component] <:- [Decorator]
+ [Component] <:- [ConcreteComponent]
+ ]
+ ```
+ html: |-
+ <a class="no-attachment-icon" href="http://localhost:8000/nomnoml/svg/eNp1jbsOwjAMRfd-haUuIJQBBlRFVZb2L1CGkBqpgtpR6oEhH0_CW6hsts-9xwD1LJHPqKF2zX67ayqAQ3uKbkLTo-fohCMEJ4KRUoYFu2MuOS-m4ykwIUlKG-CAOT0yrdb2EewuY2YWBgxIwwxKmXx8dZ6h95ekgPAqGv4miuk-YnEVFfmIgr-Fzw6tVt-CZb7osdUNUAReJA==" target="_blank" rel="noopener noreferrer" data-diagram="nomnoml" data-diagram-src="data:text/plain;base64,ICAjc3Ryb2tlOiAjYTg2MTI4CiAgWzxmcmFtZT5EZWNvcmF0b3IgcGF0dGVybnwKICAgIFs8YWJzdHJhY3Q+Q29tcG9uZW50fHwrIG9wZXJhdGlvbigpXQogICAgW0NsaWVudF0gZGVwZW5kcyAtLT4gW0NvbXBvbmVudF0KICAgIFtEZWNvcmF0b3J8LSBuZXh0OiBDb21wb25lbnRdCiAgICBbRGVjb3JhdG9yXSBkZWNvcmF0ZXMgLS0gW0NvbmNyZXRlQ29tcG9uZW50XQogICAgW0NvbXBvbmVudF0gPDotIFtEZWNvcmF0b3JdCiAgICBbQ29tcG9uZW50XSA8Oi0gW0NvbmNyZXRlQ29tcG9uZW50XQogIF0K"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="js-render-kroki lazy" data-src="http://localhost:8000/nomnoml/svg/eNp1jbsOwjAMRfd-haUuIJQBBlRFVZb2L1CGkBqpgtpR6oEhH0_CW6hsts-9xwD1LJHPqKF2zX67ayqAQ3uKbkLTo-fohCMEJ4KRUoYFu2MuOS-m4ykwIUlKG-CAOT0yrdb2EewuY2YWBgxIwwxKmXx8dZ6h95ekgPAqGv4miuk-YnEVFfmIgr-Fzw6tVt-CZb7osdUNUAReJA=="></a>
+
+- name: diagram_plantuml
+ markdown: |-
+ ```plantuml
+ Alice -> Bob: Authentication Request
+ Bob --> Alice: Authentication Response
+
+ Alice -> Bob: Another authentication Request
+ Alice <-- Bob: Another authentication Response
+ ```
+ html: |-
+ <a class="no-attachment-icon" href="http://localhost:8080/png/U9nJK73CoKnELT2rKt3AJx9IS2mjoKZDAybCJYp9pCzJ24ejB4qjBk5I0Cagw09LWPLZKLTSa9zNdCe5L8bcO5u-K6MHGY8kWo7ARNHr2QY7MW00AeWxTG00" target="_blank" rel="noopener noreferrer" data-diagram="plantuml" data-diagram-src="data:text/plain;base64,ICBBbGljZSAtPiBCb2I6IEF1dGhlbnRpY2F0aW9uIFJlcXVlc3QKICBCb2IgLS0+IEFsaWNlOiBBdXRoZW50aWNhdGlvbiBSZXNwb25zZQoKICBBbGljZSAtPiBCb2I6IEFub3RoZXIgYXV0aGVudGljYXRpb24gUmVxdWVzdAogIEFsaWNlIDwtLSBCb2I6IEFub3RoZXIgYXV0aGVudGljYXRpb24gUmVzcG9uc2UK"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="lazy" data-src="http://localhost:8080/png/U9nJK73CoKnELT2rKt3AJx9IS2mjoKZDAybCJYp9pCzJ24ejB4qjBk5I0Cagw09LWPLZKLTSa9zNdCe5L8bcO5u-K6MHGY8kWo7ARNHr2QY7MW00AeWxTG00"></a>
+
- name: div
markdown: |-
<div>plain text</div>
diff --git a/spec/fixtures/security_reports/master/gl-sast-report-bandit.json b/spec/fixtures/security_reports/master/gl-sast-report-bandit.json
new file mode 100644
index 00000000000..a80833354ed
--- /dev/null
+++ b/spec/fixtures/security_reports/master/gl-sast-report-bandit.json
@@ -0,0 +1,43 @@
+{
+ "version": "14.0.4",
+ "vulnerabilities": [
+ {
+ "id": "985a5666dcae22adef5ac12f8a8a2dacf9b9b481ae5d87cd0ac1712b0fd64864",
+ "category": "sast",
+ "message": "Deserialization of Untrusted Data",
+ "description": "Avoid using `load()`. `PyYAML.load` can create arbitrary Python\nobjects. A malicious actor could exploit this to run arbitrary\ncode. Use `safe_load()` instead.\n",
+ "cve": "",
+ "severity": "Critical",
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit"
+ },
+ "location": {
+ "file": "app/app.py",
+ "start_line": 39
+ },
+ "identifiers": [
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B506",
+ "value": "B506"
+ }
+ ]
+ }
+ ],
+ "scan": {
+ "scanner": {
+ "id": "bandit",
+ "name": "Bandit",
+ "url": "https://github.com/PyCQA/bandit",
+ "vendor": {
+ "name": "GitLab"
+ },
+ "version": "1.7.1"
+ },
+ "type": "sast",
+ "start_time": "2022-03-11T00:21:49",
+ "end_time": "2022-03-11T00:21:50",
+ "status": "success"
+ }
+}
diff --git a/spec/fixtures/security_reports/master/gl-sast-report-gosec.json b/spec/fixtures/security_reports/master/gl-sast-report-gosec.json
new file mode 100644
index 00000000000..42986ea1045
--- /dev/null
+++ b/spec/fixtures/security_reports/master/gl-sast-report-gosec.json
@@ -0,0 +1,68 @@
+{
+ "version": "14.0.4",
+ "vulnerabilities": [
+ {
+ "id": "2e5656ff30e2e7cc93c36b4845c8a689ddc47fdbccf45d834c67442fbaa89be0",
+ "category": "sast",
+ "name": "Key Exchange without Entity Authentication",
+ "message": "Use of ssh InsecureIgnoreHostKey should be audited",
+ "description": "The software performs a key exchange with an actor without verifying the identity of that actor.",
+ "cve": "og.go:8:7: func foo() {\n8: \t_ = ssh.InsecureIgnoreHostKey()\n9: }\n:CWE-322",
+ "severity": "Medium",
+ "confidence": "High",
+ "raw_source_code_extract": "7: func foo() {\n8: \t_ = ssh.InsecureIgnoreHostKey()\n9: }\n",
+ "scanner": {
+ "id": "gosec",
+ "name": "Gosec"
+ },
+ "location": {
+ "file": "og.go",
+ "start_line": 8
+ },
+ "identifiers": [
+ {
+ "type": "gosec_rule_id",
+ "name": "Gosec Rule ID G106",
+ "value": "G106"
+ },
+ {
+ "type": "CWE",
+ "name": "CWE-322",
+ "value": "322",
+ "url": "https://cwe.mitre.org/data/definitions/322.html"
+ }
+ ],
+ "tracking": {
+ "type": "source",
+ "items": [
+ {
+ "file": "og.go",
+ "line_start": 8,
+ "line_end": 8,
+ "signatures": [
+ {
+ "algorithm": "scope_offset",
+ "value": "og.go|foo[0]:1"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "scan": {
+ "scanner": {
+ "id": "gosec",
+ "name": "Gosec",
+ "url": "https://github.com/securego/gosec",
+ "vendor": {
+ "name": "GitLab"
+ },
+ "version": "2.10.0"
+ },
+ "type": "sast",
+ "start_time": "2022-03-15T20:33:12",
+ "end_time": "2022-03-15T20:33:17",
+ "status": "success"
+ }
+}
diff --git a/spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-bandit.json b/spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-bandit.json
new file mode 100644
index 00000000000..2a60a75366e
--- /dev/null
+++ b/spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-bandit.json
@@ -0,0 +1,71 @@
+{
+ "version": "14.0.4",
+ "vulnerabilities": [
+ {
+ "id": "985a5666dcae22adef5ac12f8a8a2dacf9b9b481ae5d87cd0ac1712b0fd64864",
+ "category": "sast",
+ "message": "Deserialization of Untrusted Data",
+ "description": "Avoid using `load()`. `PyYAML.load` can create arbitrary Python\nobjects. A malicious actor could exploit this to run arbitrary\ncode. Use `safe_load()` instead.\n",
+ "cve": "",
+ "severity": "Critical",
+ "scanner": {
+ "id": "semgrep",
+ "name": "Semgrep"
+ },
+ "location": {
+ "file": "app/app.py",
+ "start_line": 39
+ },
+ "identifiers": [
+ {
+ "type": "semgrep_id",
+ "name": "bandit.B506",
+ "value": "bandit.B506",
+ "url": "https://semgrep.dev/r/gitlab.bandit.B506"
+ },
+ {
+ "type": "cwe",
+ "name": "CWE-502",
+ "value": "502",
+ "url": "https://cwe.mitre.org/data/definitions/502.html"
+ },
+ {
+ "type": "bandit_test_id",
+ "name": "Bandit Test ID B506",
+ "value": "B506"
+ }
+ ],
+ "tracking": {
+ "type": "source",
+ "items": [
+ {
+ "file": "app/app.py",
+ "line_start": 39,
+ "line_end": 39,
+ "signatures": [
+ {
+ "algorithm": "scope_offset",
+ "value": "app/app.py|yaml_hammer[0]:13"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "scan": {
+ "scanner": {
+ "id": "semgrep",
+ "name": "Semgrep",
+ "url": "https://github.com/returntocorp/semgrep",
+ "vendor": {
+ "name": "GitLab"
+ },
+ "version": "0.82.0"
+ },
+ "type": "sast",
+ "start_time": "2022-03-11T18:48:16",
+ "end_time": "2022-03-11T18:48:22",
+ "status": "success"
+ }
+}
diff --git a/spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-gosec.json b/spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-gosec.json
new file mode 100644
index 00000000000..3d8c65d5823
--- /dev/null
+++ b/spec/fixtures/security_reports/master/gl-sast-report-semgrep-for-gosec.json
@@ -0,0 +1,70 @@
+{
+ "version": "14.0.4",
+ "vulnerabilities": [
+ {
+ "id": "79f6537b7ec83c7717f5bd1a4f12645916caafefe2e4359148d889855505aa67",
+ "category": "sast",
+ "message": "Key Exchange without Entity Authentication",
+ "description": "Audit the use of ssh.InsecureIgnoreHostKey\n",
+ "cve": "",
+ "severity": "Medium",
+ "scanner": {
+ "id": "semgrep",
+ "name": "Semgrep"
+ },
+ "location": {
+ "file": "og.go",
+ "start_line": 8
+ },
+ "identifiers": [
+ {
+ "type": "semgrep_id",
+ "name": "gosec.G106-1",
+ "value": "gosec.G106-1"
+ },
+ {
+ "type": "cwe",
+ "name": "CWE-322",
+ "value": "322",
+ "url": "https://cwe.mitre.org/data/definitions/322.html"
+ },
+ {
+ "type": "gosec_rule_id",
+ "name": "Gosec Rule ID G106",
+ "value": "G106"
+ }
+ ],
+ "tracking": {
+ "type": "source",
+ "items": [
+ {
+ "file": "og.go",
+ "line_start": 8,
+ "line_end": 8,
+ "signatures": [
+ {
+ "algorithm": "scope_offset",
+ "value": "og.go|foo[0]:1"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "scan": {
+ "scanner": {
+ "id": "semgrep",
+ "name": "Semgrep",
+ "url": "https://github.com/returntocorp/semgrep",
+ "vendor": {
+ "name": "GitLab"
+ },
+ "version": "0.82.0"
+ },
+ "type": "sast",
+ "start_time": "2022-03-15T20:36:58",
+ "end_time": "2022-03-15T20:37:05",
+ "status": "success"
+ }
+}
diff --git a/spec/frontend/__helpers__/matchers/index.js b/spec/frontend/__helpers__/matchers/index.js
index 76571bafb06..9b83ced10e1 100644
--- a/spec/frontend/__helpers__/matchers/index.js
+++ b/spec/frontend/__helpers__/matchers/index.js
@@ -1,3 +1,4 @@
export * from './to_have_sprite_icon';
export * from './to_have_tracking_attributes';
export * from './to_match_interpolated_text';
+export * from './to_validate_json_schema';
diff --git a/spec/frontend/__helpers__/matchers/to_validate_json_schema.js b/spec/frontend/__helpers__/matchers/to_validate_json_schema.js
new file mode 100644
index 00000000000..ff391f08c55
--- /dev/null
+++ b/spec/frontend/__helpers__/matchers/to_validate_json_schema.js
@@ -0,0 +1,34 @@
+// NOTE: Make sure to initialize ajv when using this helper
+
+const getAjvErrorMessage = ({ errors }) => {
+ return (errors || []).map((error) => {
+ return `Error with item ${error.instancePath}: ${error.message}`;
+ });
+};
+
+export function toValidateJsonSchema(testData, validator) {
+ if (!(validator instanceof Function && validator.schema)) {
+ return {
+ validator,
+ message: () =>
+ 'Validator must be a validating function with property "schema", created with `ajv.compile`. See https://ajv.js.org/api.html#ajv-compile-schema-object-data-any-boolean-promise-any.',
+ pass: false,
+ };
+ }
+
+ const isValid = validator(testData);
+
+ return {
+ actual: testData,
+ message: () => {
+ if (isValid) {
+ // We can match, but still fail because we're in a `expect...not.` context
+ return 'Expected the given data not to pass the schema validation, but found that it was considered valid.';
+ }
+
+ const errorMessages = getAjvErrorMessage(validator).join('\n');
+ return `Expected the given data to pass the schema validation, but found that it was considered invalid. Errors:\n${errorMessages}`;
+ },
+ pass: isValid,
+ };
+}
diff --git a/spec/frontend/__helpers__/matchers/to_validate_json_schema_spec.js b/spec/frontend/__helpers__/matchers/to_validate_json_schema_spec.js
new file mode 100644
index 00000000000..fd42c710c65
--- /dev/null
+++ b/spec/frontend/__helpers__/matchers/to_validate_json_schema_spec.js
@@ -0,0 +1,65 @@
+import Ajv from 'ajv';
+import AjvFormats from 'ajv-formats';
+
+const JSON_SCHEMA = {
+ type: 'object',
+ properties: {
+ fruit: {
+ type: 'string',
+ minLength: 3,
+ },
+ },
+};
+
+const ajv = new Ajv({
+ strictTypes: false,
+ strictTuples: false,
+ allowMatchingProperties: true,
+});
+
+AjvFormats(ajv);
+const schema = ajv.compile(JSON_SCHEMA);
+
+describe('custom matcher toValidateJsonSchema', () => {
+ it('throws error if validator is not compiled correctly', () => {
+ expect(() => {
+ expect({}).toValidateJsonSchema({});
+ }).toThrow(
+ 'Validator must be a validating function with property "schema", created with `ajv.compile`. See https://ajv.js.org/api.html#ajv-compile-schema-object-data-any-boolean-promise-any.',
+ );
+ });
+
+ describe('positive assertions', () => {
+ it.each`
+ description | input
+ ${'valid input'} | ${{ fruit: 'apple' }}
+ `('schema validation passes for $description', ({ input }) => {
+ expect(input).toValidateJsonSchema(schema);
+ });
+
+ it('throws if not matching', () => {
+ expect(() => expect(null).toValidateJsonSchema(schema)).toThrowError(
+ `Expected the given data to pass the schema validation, but found that it was considered invalid. Errors:
+Error with item : must be object`,
+ );
+ });
+ });
+
+ describe('negative assertions', () => {
+ it.each`
+ description | input
+ ${'no input'} | ${null}
+ ${'input with invalid type'} | ${'banana'}
+ ${'input with invalid length'} | ${{ fruit: 'aa' }}
+ ${'input with invalid type'} | ${{ fruit: 12345 }}
+ `('schema validation fails for $description', ({ input }) => {
+ expect(input).not.toValidateJsonSchema(schema);
+ });
+
+ it('throws if matching', () => {
+ expect(() => expect({ fruit: 'apple' }).not.toValidateJsonSchema(schema)).toThrowError(
+ 'Expected the given data not to pass the schema validation, but found that it was considered valid.',
+ );
+ });
+ });
+});
diff --git a/spec/frontend/__helpers__/mock_apollo_helper.js b/spec/frontend/__helpers__/mock_apollo_helper.js
index c07a6d8ef85..bae9f33be87 100644
--- a/spec/frontend/__helpers__/mock_apollo_helper.js
+++ b/spec/frontend/__helpers__/mock_apollo_helper.js
@@ -1,7 +1,7 @@
import { InMemoryCache } from '@apollo/client/core';
import { createMockClient as createMockApolloClient } from 'mock-apollo-client';
import VueApollo from 'vue-apollo';
-import possibleTypes from '~/graphql_shared/possibleTypes.json';
+import possibleTypes from '~/graphql_shared/possible_types.json';
import { typePolicies } from '~/lib/graphql';
export function createMockClient(handlers = [], resolvers = {}, cacheOptions = {}) {
diff --git a/spec/frontend/__helpers__/mock_dom_observer.js b/spec/frontend/__helpers__/mock_dom_observer.js
index dd26b594ad9..bc2646be4c2 100644
--- a/spec/frontend/__helpers__/mock_dom_observer.js
+++ b/spec/frontend/__helpers__/mock_dom_observer.js
@@ -22,14 +22,14 @@ class MockObserver {
takeRecords() {}
- // eslint-disable-next-line babel/camelcase
+ // eslint-disable-next-line camelcase
$_triggerObserve(node, { entry = {}, options = {} } = {}) {
if (this.$_hasObserver(node, options)) {
this.$_cb([{ target: node, ...entry }]);
}
}
- // eslint-disable-next-line babel/camelcase
+ // eslint-disable-next-line camelcase
$_hasObserver(node, options = {}) {
return this.$_observers.some(
([obvNode, obvOptions]) => node === obvNode && isMatch(options, obvOptions),
diff --git a/spec/frontend/__helpers__/vuex_action_helper.js b/spec/frontend/__helpers__/vuex_action_helper.js
index 68203b544ef..95a811d0385 100644
--- a/spec/frontend/__helpers__/vuex_action_helper.js
+++ b/spec/frontend/__helpers__/vuex_action_helper.js
@@ -49,6 +49,7 @@ const noop = () => {};
* expectedActions: [],
* })
*/
+
export default (
actionArg,
payloadArg,
diff --git a/spec/frontend/__helpers__/yaml_transformer.js b/spec/frontend/__helpers__/yaml_transformer.js
new file mode 100644
index 00000000000..a23f9b1f715
--- /dev/null
+++ b/spec/frontend/__helpers__/yaml_transformer.js
@@ -0,0 +1,11 @@
+/* eslint-disable import/no-commonjs */
+const JsYaml = require('js-yaml');
+
+// This will transform YAML files to JSON strings
+module.exports = {
+ process: (sourceContent) => {
+ const jsonContent = JsYaml.load(sourceContent);
+ const json = JSON.stringify(jsonContent);
+ return `module.exports = ${json}`;
+ },
+};
diff --git a/spec/frontend/access_tokens/components/__snapshots__/expires_at_field_spec.js.snap b/spec/frontend/access_tokens/components/__snapshots__/expires_at_field_spec.js.snap
index dd742419d32..36003154b58 100644
--- a/spec/frontend/access_tokens/components/__snapshots__/expires_at_field_spec.js.snap
+++ b/spec/frontend/access_tokens/components/__snapshots__/expires_at_field_spec.js.snap
@@ -8,7 +8,7 @@ exports[`~/access_tokens/components/expires_at_field should render datepicker wi
optionaltext="(optional)"
>
<gl-datepicker-stub
- ariallabel=""
+ arialabel=""
autocomplete=""
container=""
displayfield="true"
diff --git a/spec/frontend/add_context_commits_modal/store/actions_spec.js b/spec/frontend/add_context_commits_modal/store/actions_spec.js
index fa4d52cbfbb..4b58a69c2b8 100644
--- a/spec/frontend/add_context_commits_modal/store/actions_spec.js
+++ b/spec/frontend/add_context_commits_modal/store/actions_spec.js
@@ -42,9 +42,9 @@ describe('AddContextCommitsModalStoreActions', () => {
});
describe('setBaseConfig', () => {
- it('commits SET_BASE_CONFIG', (done) => {
+ it('commits SET_BASE_CONFIG', () => {
const options = { contextCommitsPath, mergeRequestIid, projectId };
- testAction(
+ return testAction(
setBaseConfig,
options,
{
@@ -59,62 +59,54 @@ describe('AddContextCommitsModalStoreActions', () => {
},
],
[],
- done,
);
});
});
describe('setTabIndex', () => {
- it('commits SET_TABINDEX', (done) => {
- testAction(
+ it('commits SET_TABINDEX', () => {
+ return testAction(
setTabIndex,
{ tabIndex: 1 },
{ tabIndex: 0 },
[{ type: types.SET_TABINDEX, payload: { tabIndex: 1 } }],
[],
- done,
);
});
});
describe('setCommits', () => {
- it('commits SET_COMMITS', (done) => {
- testAction(
+ it('commits SET_COMMITS', () => {
+ return testAction(
setCommits,
{ commits: [], silentAddition: false },
{ isLoadingCommits: false, commits: [] },
[{ type: types.SET_COMMITS, payload: [] }],
[],
- done,
);
});
- it('commits SET_COMMITS_SILENT', (done) => {
- testAction(
+ it('commits SET_COMMITS_SILENT', () => {
+ return testAction(
setCommits,
{ commits: [], silentAddition: true },
{ isLoadingCommits: true, commits: [] },
[{ type: types.SET_COMMITS_SILENT, payload: [] }],
[],
- done,
);
});
});
describe('createContextCommits', () => {
- it('calls API to create context commits', (done) => {
+ it('calls API to create context commits', async () => {
mock.onPost(contextCommitEndpoint).reply(200, {});
- testAction(createContextCommits, { commits: [] }, {}, [], [], done);
+ await testAction(createContextCommits, { commits: [] }, {}, [], []);
- createContextCommits(
+ await createContextCommits(
{ state: { projectId, mergeRequestIid }, commit: () => null },
{ commits: [] },
- )
- .then(() => {
- done();
- })
- .catch(done.fail);
+ );
});
});
@@ -126,9 +118,9 @@ describe('AddContextCommitsModalStoreActions', () => {
)
.reply(200, [dummyCommit]);
});
- it('commits FETCH_CONTEXT_COMMITS', (done) => {
+ it('commits FETCH_CONTEXT_COMMITS', () => {
const contextCommit = { ...dummyCommit, isSelected: true };
- testAction(
+ return testAction(
fetchContextCommits,
null,
{
@@ -144,20 +136,18 @@ describe('AddContextCommitsModalStoreActions', () => {
{ type: 'setCommits', payload: { commits: [contextCommit], silentAddition: true } },
{ type: 'setSelectedCommits', payload: [contextCommit] },
],
- done,
);
});
});
describe('setContextCommits', () => {
- it('commits SET_CONTEXT_COMMITS', (done) => {
- testAction(
+ it('commits SET_CONTEXT_COMMITS', () => {
+ return testAction(
setContextCommits,
{ data: [] },
{ contextCommits: [], isLoadingContextCommits: false },
[{ type: types.SET_CONTEXT_COMMITS, payload: { data: [] } }],
[],
- done,
);
});
});
@@ -168,71 +158,66 @@ describe('AddContextCommitsModalStoreActions', () => {
.onDelete('/api/v4/projects/gitlab-org%2Fgitlab/merge_requests/1/context_commits')
.reply(204);
});
- it('calls API to remove context commits', (done) => {
- testAction(
+ it('calls API to remove context commits', () => {
+ return testAction(
removeContextCommits,
{ forceReload: false },
{ mergeRequestIid, projectId, toRemoveCommits: [] },
[],
[],
- done,
);
});
});
describe('setSelectedCommits', () => {
- it('commits SET_SELECTED_COMMITS', (done) => {
- testAction(
+ it('commits SET_SELECTED_COMMITS', () => {
+ return testAction(
setSelectedCommits,
[dummyCommit],
{ selectedCommits: [] },
[{ type: types.SET_SELECTED_COMMITS, payload: [dummyCommit] }],
[],
- done,
);
});
});
describe('setSearchText', () => {
- it('commits SET_SEARCH_TEXT', (done) => {
+ it('commits SET_SEARCH_TEXT', () => {
const searchText = 'Dummy Text';
- testAction(
+ return testAction(
setSearchText,
searchText,
{ searchText: '' },
[{ type: types.SET_SEARCH_TEXT, payload: searchText }],
[],
- done,
);
});
});
describe('setToRemoveCommits', () => {
- it('commits SET_TO_REMOVE_COMMITS', (done) => {
+ it('commits SET_TO_REMOVE_COMMITS', () => {
const commitId = 'abcde';
- testAction(
+ return testAction(
setToRemoveCommits,
[commitId],
{ toRemoveCommits: [] },
[{ type: types.SET_TO_REMOVE_COMMITS, payload: [commitId] }],
[],
- done,
);
});
});
describe('resetModalState', () => {
- it('commits RESET_MODAL_STATE', (done) => {
+ it('commits RESET_MODAL_STATE', () => {
const commitId = 'abcde';
- testAction(
+ return testAction(
resetModalState,
null,
{ toRemoveCommits: [commitId] },
[{ type: types.RESET_MODAL_STATE }],
[],
- done,
);
});
});
diff --git a/spec/frontend/admin/statistics_panel/store/actions_spec.js b/spec/frontend/admin/statistics_panel/store/actions_spec.js
index c7481b664b3..e7cdb5feb6a 100644
--- a/spec/frontend/admin/statistics_panel/store/actions_spec.js
+++ b/spec/frontend/admin/statistics_panel/store/actions_spec.js
@@ -22,8 +22,8 @@ describe('Admin statistics panel actions', () => {
mock.onGet(/api\/(.*)\/application\/statistics/).replyOnce(200, mockStatistics);
});
- it('dispatches success with received data', (done) =>
- testAction(
+ it('dispatches success with received data', () => {
+ return testAction(
actions.fetchStatistics,
null,
state,
@@ -37,8 +37,8 @@ describe('Admin statistics panel actions', () => {
),
},
],
- done,
- ));
+ );
+ });
});
describe('error', () => {
@@ -46,8 +46,8 @@ describe('Admin statistics panel actions', () => {
mock.onGet(/api\/(.*)\/application\/statistics/).replyOnce(500);
});
- it('dispatches error', (done) =>
- testAction(
+ it('dispatches error', () => {
+ return testAction(
actions.fetchStatistics,
null,
state,
@@ -61,26 +61,26 @@ describe('Admin statistics panel actions', () => {
payload: new Error('Request failed with status code 500'),
},
],
- done,
- ));
+ );
+ });
});
});
describe('requestStatistic', () => {
- it('should commit the request mutation', (done) =>
- testAction(
+ it('should commit the request mutation', () => {
+ return testAction(
actions.requestStatistics,
null,
state,
[{ type: types.REQUEST_STATISTICS }],
[],
- done,
- ));
+ );
+ });
});
describe('receiveStatisticsSuccess', () => {
- it('should commit received data', (done) =>
- testAction(
+ it('should commit received data', () => {
+ return testAction(
actions.receiveStatisticsSuccess,
mockStatistics,
state,
@@ -91,13 +91,13 @@ describe('Admin statistics panel actions', () => {
},
],
[],
- done,
- ));
+ );
+ });
});
describe('receiveStatisticsError', () => {
- it('should commit error', (done) => {
- testAction(
+ it('should commit error', () => {
+ return testAction(
actions.receiveStatisticsError,
500,
state,
@@ -108,7 +108,6 @@ describe('Admin statistics panel actions', () => {
},
],
[],
- done,
);
});
});
diff --git a/spec/frontend/admin/topics/components/remove_avatar_spec.js b/spec/frontend/admin/topics/components/remove_avatar_spec.js
index d4656f0a199..97d257c682c 100644
--- a/spec/frontend/admin/topics/components/remove_avatar_spec.js
+++ b/spec/frontend/admin/topics/components/remove_avatar_spec.js
@@ -1,10 +1,11 @@
-import { GlButton, GlModal } from '@gitlab/ui';
+import { GlButton, GlModal, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import RemoveAvatar from '~/admin/topics/components/remove_avatar.vue';
const modalID = 'fake-id';
const path = 'topic/path/1';
+const name = 'Topic 1';
jest.mock('lodash/uniqueId', () => () => 'fake-id');
jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
@@ -16,10 +17,14 @@ describe('RemoveAvatar', () => {
wrapper = shallowMount(RemoveAvatar, {
provide: {
path,
+ name,
},
directives: {
GlModal: createMockDirective(),
},
+ stubs: {
+ GlSprintf,
+ },
});
};
@@ -55,8 +60,8 @@ describe('RemoveAvatar', () => {
const modal = findModal();
expect(modal.exists()).toBe(true);
- expect(modal.props('title')).toBe('Confirm remove avatar');
- expect(modal.text()).toBe('Avatar will be removed. Are you sure?');
+ expect(modal.props('title')).toBe('Remove topic avatar');
+ expect(modal.text()).toBe(`Topic avatar for ${name} will be removed. This cannot be undone.`);
});
it('contains the correct modal ID', () => {
diff --git a/spec/frontend/admin/users/components/actions/actions_spec.js b/spec/frontend/admin/users/components/actions/actions_spec.js
index fa485e73999..b758c15a91a 100644
--- a/spec/frontend/admin/users/components/actions/actions_spec.js
+++ b/spec/frontend/admin/users/components/actions/actions_spec.js
@@ -1,9 +1,9 @@
import { GlDropdownItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import { kebabCase } from 'lodash';
import Actions from '~/admin/users/components/actions';
-import SharedDeleteAction from '~/admin/users/components/actions/shared/shared_delete_action.vue';
+import eventHub, {
+ EVENT_OPEN_DELETE_USER_MODAL,
+} from '~/admin/users/components/modals/delete_user_modal_event_hub';
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';
@@ -14,12 +14,11 @@ describe('Action components', () => {
const findDropdownItem = () => wrapper.find(GlDropdownItem);
- const initComponent = ({ component, props, stubs = {} } = {}) => {
+ const initComponent = ({ component, props } = {}) => {
wrapper = shallowMount(component, {
propsData: {
...props,
},
- stubs,
});
};
@@ -29,7 +28,7 @@ describe('Action components', () => {
});
describe('CONFIRMATION_ACTIONS', () => {
- it.each(CONFIRMATION_ACTIONS)('renders a dropdown item for "%s"', async (action) => {
+ it.each(CONFIRMATION_ACTIONS)('renders a dropdown item for "%s"', (action) => {
initComponent({
component: Actions[capitalizeFirstCharacter(action)],
props: {
@@ -38,20 +37,23 @@ describe('Action components', () => {
},
});
- await nextTick();
expect(findDropdownItem().exists()).toBe(true);
});
});
describe('DELETE_ACTION_COMPONENTS', () => {
+ beforeEach(() => {
+ jest.spyOn(eventHub, '$emit').mockImplementation();
+ });
+
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"',
- async (action, expectedPath) => {
+ it.each(DELETE_ACTIONS)(
+ 'renders a dropdown item that opens the delete user modal when clicked for "%s"',
+ async (action) => {
initComponent({
component: Actions[capitalizeFirstCharacter(action)],
props: {
@@ -59,21 +61,19 @@ describe('Action components', () => {
paths,
userDeletionObstacles,
},
- stubs: { SharedDeleteAction },
});
- await nextTick();
- const sharedAction = wrapper.find(SharedDeleteAction);
+ await findDropdownItem().vm.$emit('click');
- expect(sharedAction.attributes('data-block-user-url')).toBe(paths.block);
- 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-user-deletion-obstacles')).toBe(
- JSON.stringify(userDeletionObstacles),
+ expect(eventHub.$emit).toHaveBeenCalledWith(
+ EVENT_OPEN_DELETE_USER_MODAL,
+ expect.objectContaining({
+ username: 'John Doe',
+ blockPath: paths.block,
+ deletePath: paths[action],
+ 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 7a17ef2cc6c..265569ac0e3 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
@@ -1,160 +1,28 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`User Operation confirmation modal renders modal with form included 1`] = `
-<div>
- <p>
- <gl-sprintf-stub
- message="content"
- />
- </p>
-
- <user-deletion-obstacles-list-stub
- obstacles="schedule1,policy1"
- username="username"
+exports[`Delete user modal renders modal with form included 1`] = `
+<form
+ action=""
+ method="post"
+>
+ <input
+ name="_method"
+ type="hidden"
+ value="delete"
/>
- <p>
- <gl-sprintf-stub
- message="To confirm, type %{username}"
- />
- </p>
-
- <form
- action="delete-url"
- method="post"
- >
- <input
- name="_method"
- type="hidden"
- value="delete"
- />
-
- <input
- name="authenticity_token"
- type="hidden"
- value="csrf"
- />
-
- <gl-form-input-stub
- autocomplete="off"
- autofocus=""
- name="username"
- type="text"
- value=""
- />
- </form>
- <gl-button-stub
- buttontextclasses=""
- category="primary"
- icon=""
- size="medium"
- variant="default"
- >
- Cancel
- </gl-button-stub>
-
- <gl-button-stub
- buttontextclasses=""
- category="secondary"
- disabled="true"
- icon=""
- size="medium"
- variant="danger"
- >
-
- secondaryAction
-
- </gl-button-stub>
-
- <gl-button-stub
- buttontextclasses=""
- category="primary"
- disabled="true"
- icon=""
- size="medium"
- variant="danger"
- >
- action
- </gl-button-stub>
-</div>
-`;
-
-exports[`User Operation confirmation modal when user's name has leading and trailing whitespace displays user's name without whitespace 1`] = `
-<div>
- <p>
- content
- </p>
-
- <user-deletion-obstacles-list-stub
- obstacles="schedule1,policy1"
- username="John Smith"
+ <input
+ name="authenticity_token"
+ type="hidden"
+ value="csrf"
/>
- <p>
- To confirm, type
- <code
- class="gl-white-space-pre-wrap"
- >
- John Smith
- </code>
- </p>
-
- <form
- action="delete-url"
- method="post"
- >
- <input
- name="_method"
- type="hidden"
- value="delete"
- />
-
- <input
- name="authenticity_token"
- type="hidden"
- value="csrf"
- />
-
- <gl-form-input-stub
- autocomplete="off"
- autofocus=""
- name="username"
- type="text"
- value=""
- />
- </form>
- <gl-button-stub
- buttontextclasses=""
- category="primary"
- icon=""
- size="medium"
- variant="default"
- >
- Cancel
- </gl-button-stub>
-
- <gl-button-stub
- buttontextclasses=""
- category="secondary"
- disabled="true"
- icon=""
- size="medium"
- variant="danger"
- >
-
- secondaryAction
-
- </gl-button-stub>
-
- <gl-button-stub
- buttontextclasses=""
- category="primary"
- disabled="true"
- icon=""
- size="medium"
- variant="danger"
- >
- action
- </gl-button-stub>
-</div>
+ <gl-form-input-stub
+ autocomplete="off"
+ autofocus=""
+ name="username"
+ type="text"
+ value=""
+ />
+</form>
`;
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 f875cd24ee1..09a345ac826 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,6 +1,8 @@
import { GlButton, GlFormInput, GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import eventHub, {
+ EVENT_OPEN_DELETE_USER_MODAL,
+} from '~/admin/users/components/modals/delete_user_modal_event_hub';
import DeleteUserModal from '~/admin/users/components/modals/delete_user_modal.vue';
import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
import ModalStub from './stubs/modal_stub';
@@ -9,7 +11,7 @@ const TEST_DELETE_USER_URL = 'delete-url';
const TEST_BLOCK_USER_URL = 'block-url';
const TEST_CSRF = 'csrf';
-describe('User Operation confirmation modal', () => {
+describe('Delete user modal', () => {
let wrapper;
let formSubmitSpy;
@@ -27,28 +29,36 @@ describe('User Operation confirmation modal', () => {
const getMethodParam = () => new FormData(findForm().element).get('_method');
const getFormAction = () => findForm().attributes('action');
const findUserDeletionObstaclesList = () => wrapper.findComponent(UserDeletionObstaclesList);
+ const findMessageUsername = () => wrapper.findByTestId('message-username');
+ const findConfirmUsername = () => wrapper.findByTestId('confirm-username');
+ const emitOpenModalEvent = (modalData) => {
+ return eventHub.$emit(EVENT_OPEN_DELETE_USER_MODAL, modalData);
+ };
const setUsername = (username) => {
- findUsernameInput().vm.$emit('input', username);
+ return findUsernameInput().vm.$emit('input', username);
};
const username = 'username';
const badUsername = 'bad_username';
- const userDeletionObstacles = '["schedule1", "policy1"]';
+ const userDeletionObstacles = ['schedule1', 'policy1'];
+
+ const mockModalData = {
+ username,
+ blockPath: TEST_BLOCK_USER_URL,
+ deletePath: TEST_DELETE_USER_URL,
+ userDeletionObstacles,
+ i18n: {
+ title: 'Modal for %{username}',
+ primaryButtonLabel: 'Delete user',
+ messageBody: 'Delete %{username} or rather %{strongStart}block user%{strongEnd}?',
+ },
+ };
- const createComponent = (props = {}, stubs = {}) => {
- wrapper = shallowMount(DeleteUserModal, {
+ const createComponent = (stubs = {}) => {
+ wrapper = shallowMountExtended(DeleteUserModal, {
propsData: {
- username,
- title: 'title',
- content: 'content',
- action: 'action',
- secondaryAction: 'secondaryAction',
- deleteUserUrl: TEST_DELETE_USER_URL,
- blockUserUrl: TEST_BLOCK_USER_URL,
csrfToken: TEST_CSRF,
- userDeletionObstacles,
- ...props,
},
stubs: {
GlModal: ModalStub,
@@ -68,7 +78,7 @@ describe('User Operation confirmation modal', () => {
it('renders modal with form included', () => {
createComponent();
- expect(wrapper.element).toMatchSnapshot();
+ expect(findForm().element).toMatchSnapshot();
});
describe('on created', () => {
@@ -83,11 +93,11 @@ describe('User Operation confirmation modal', () => {
});
describe('with incorrect username', () => {
- beforeEach(async () => {
+ beforeEach(() => {
createComponent();
- setUsername(badUsername);
+ emitOpenModalEvent(mockModalData);
- await nextTick();
+ return setUsername(badUsername);
});
it('shows incorrect username', () => {
@@ -101,11 +111,11 @@ describe('User Operation confirmation modal', () => {
});
describe('with correct username', () => {
- beforeEach(async () => {
+ beforeEach(() => {
createComponent();
- setUsername(username);
+ emitOpenModalEvent(mockModalData);
- await nextTick();
+ return setUsername(username);
});
it('shows correct username', () => {
@@ -117,11 +127,9 @@ describe('User Operation confirmation modal', () => {
expect(findSecondaryButton().attributes('disabled')).toBeFalsy();
});
- describe('when primary action is submitted', () => {
- beforeEach(async () => {
- findPrimaryButton().vm.$emit('click');
-
- await nextTick();
+ describe('when primary action is clicked', () => {
+ beforeEach(() => {
+ return findPrimaryButton().vm.$emit('click');
});
it('clears the input', () => {
@@ -136,11 +144,9 @@ describe('User Operation confirmation modal', () => {
});
});
- describe('when secondary action is submitted', () => {
- beforeEach(async () => {
- findSecondaryButton().vm.$emit('click');
-
- await nextTick();
+ describe('when secondary action is clicked', () => {
+ beforeEach(() => {
+ return findSecondaryButton().vm.$emit('click');
});
it('has correct form attributes and calls submit', () => {
@@ -154,22 +160,23 @@ describe('User Operation confirmation modal', () => {
describe("when user's name has leading and trailing whitespace", () => {
beforeEach(() => {
- createComponent(
- {
- username: ' John Smith ',
- },
- { GlSprintf },
- );
+ createComponent({ GlSprintf });
+ return emitOpenModalEvent({ ...mockModalData, username: ' John Smith ' });
});
it("displays user's name without whitespace", () => {
- expect(wrapper.element).toMatchSnapshot();
+ expect(findMessageUsername().text()).toBe('John Smith');
+ expect(findConfirmUsername().text()).toBe('John Smith');
});
- it("shows enabled buttons when user's name is entered without whitespace", async () => {
- setUsername('John Smith');
+ it('passes user name without whitespace to the obstacles', () => {
+ expect(findUserDeletionObstaclesList().props()).toMatchObject({
+ userName: 'John Smith',
+ });
+ });
- await nextTick();
+ it("shows enabled buttons when user's name is entered without whitespace", async () => {
+ await setUsername('John Smith');
expect(findPrimaryButton().attributes('disabled')).toBeUndefined();
expect(findSecondaryButton().attributes('disabled')).toBeUndefined();
@@ -177,17 +184,20 @@ describe('User Operation confirmation modal', () => {
});
describe('Related user-deletion-obstacles list', () => {
- it('does NOT render the list when user has no related obstacles', () => {
- createComponent({ userDeletionObstacles: '[]' });
+ it('does NOT render the list when user has no related obstacles', async () => {
+ createComponent();
+ await emitOpenModalEvent({ ...mockModalData, userDeletionObstacles: [] });
+
expect(findUserDeletionObstaclesList().exists()).toBe(false);
});
- it('renders the list when user has related obstalces', () => {
+ it('renders the list when user has related obstalces', async () => {
createComponent();
+ await emitOpenModalEvent(mockModalData);
const obstacles = findUserDeletionObstaclesList();
expect(obstacles.exists()).toBe(true);
- expect(obstacles.props('obstacles')).toEqual(JSON.parse(userDeletionObstacles));
+ expect(obstacles.props('obstacles')).toEqual(userDeletionObstacles);
});
});
});
diff --git a/spec/frontend/admin/users/components/modals/user_modal_manager_spec.js b/spec/frontend/admin/users/components/modals/user_modal_manager_spec.js
deleted file mode 100644
index 4786357faa1..00000000000
--- a/spec/frontend/admin/users/components/modals/user_modal_manager_spec.js
+++ /dev/null
@@ -1,126 +0,0 @@
-import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import UserModalManager from '~/admin/users/components/modals/user_modal_manager.vue';
-import ModalStub from './stubs/modal_stub';
-
-describe('Users admin page Modal Manager', () => {
- let wrapper;
-
- const modalConfiguration = {
- action1: {
- title: 'action1',
- content: 'Action Modal 1',
- },
- action2: {
- title: 'action2',
- content: 'Action Modal 2',
- },
- };
-
- const findModal = () => wrapper.find({ ref: 'modal' });
-
- const createComponent = (props = {}) => {
- wrapper = mount(UserModalManager, {
- propsData: {
- selector: '.js-delete-user-modal-button',
- modalConfiguration,
- csrfToken: 'dummyCSRF',
- ...props,
- },
- stubs: {
- DeleteUserModal: ModalStub,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('render behavior', () => {
- it('does not renders modal when initialized', () => {
- createComponent();
- expect(findModal().exists()).toBeFalsy();
- });
-
- it('throws if action has no proper configuration', () => {
- createComponent({
- modalConfiguration: {},
- });
- expect(() => wrapper.vm.show({ glModalAction: 'action1' })).toThrow();
- });
-
- it('renders modal with expected props when valid configuration is passed', async () => {
- createComponent();
- wrapper.vm.show({
- glModalAction: 'action1',
- extraProp: 'extraPropValue',
- });
-
- await nextTick();
- const modal = findModal();
- expect(modal.exists()).toBeTruthy();
- expect(modal.vm.$attrs.csrfToken).toEqual('dummyCSRF');
- expect(modal.vm.$attrs.extraProp).toEqual('extraPropValue');
- expect(modal.vm.showWasCalled).toBeTruthy();
- });
- });
-
- describe('click handling', () => {
- let button;
- let button2;
-
- const createButtons = () => {
- button = document.createElement('button');
- button2 = document.createElement('button');
- button.setAttribute('class', 'js-delete-user-modal-button');
- button.setAttribute('data-username', 'foo');
- button.setAttribute('data-gl-modal-action', 'action1');
- button.setAttribute('data-block-user-url', '/block');
- button.setAttribute('data-delete-user-url', '/delete');
- document.body.appendChild(button);
- document.body.appendChild(button2);
- };
- const removeButtons = () => {
- button.remove();
- button = null;
- button2.remove();
- button2 = null;
- };
-
- beforeEach(() => {
- createButtons();
- createComponent();
- });
-
- afterEach(() => {
- removeButtons();
- });
-
- it('renders the modal when the button is clicked', async () => {
- button.click();
-
- await nextTick();
-
- expect(findModal().exists()).toBe(true);
- });
-
- it('does not render the modal when a misconfigured button is clicked', async () => {
- button.removeAttribute('data-gl-modal-action');
- button.click();
-
- await nextTick();
-
- expect(findModal().exists()).toBe(false);
- });
-
- it('does not render the modal when a button without the selector class is clicked', async () => {
- button2.click();
-
- await nextTick();
-
- expect(findModal().exists()).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js b/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js
index 6193233881d..ed185c11732 100644
--- a/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js
+++ b/spec/frontend/alerts_settings/components/alerts_settings_wrapper_spec.js
@@ -476,9 +476,6 @@ describe('AlertsSettingsWrapper', () => {
destroyHttpIntegration(wrapper);
expect(destroyIntegrationHandler).toHaveBeenCalled();
- await waitForPromises();
-
- expect(findIntegrations()).toHaveLength(3);
});
it('displays flash if mutation had a recoverable error', async () => {
diff --git a/spec/frontend/alerts_settings/components/mocks/apollo_mock.js b/spec/frontend/alerts_settings/components/mocks/apollo_mock.js
index 694dff56632..170af1b5e0c 100644
--- a/spec/frontend/alerts_settings/components/mocks/apollo_mock.js
+++ b/spec/frontend/alerts_settings/components/mocks/apollo_mock.js
@@ -102,7 +102,7 @@ export const destroyIntegrationResponse = {
httpIntegrationDestroy: {
errors: [],
integration: {
- __typename: 'AlertManagementIntegration',
+ __typename: 'AlertManagementHttpIntegration',
id: '37',
type: 'HTTP',
active: true,
diff --git a/spec/frontend/api/alert_management_alerts_api_spec.js b/spec/frontend/api/alert_management_alerts_api_spec.js
new file mode 100644
index 00000000000..aac14e64286
--- /dev/null
+++ b/spec/frontend/api/alert_management_alerts_api_spec.js
@@ -0,0 +1,140 @@
+import MockAdapter from 'axios-mock-adapter';
+import * as alertManagementAlertsApi from '~/api/alert_management_alerts_api';
+import axios from '~/lib/utils/axios_utils';
+
+describe('~/api/alert_management_alerts_api.js', () => {
+ let mock;
+ let originalGon;
+
+ const projectId = 1;
+ const alertIid = 2;
+
+ const imageData = { filePath: 'test', filename: 'hello', id: 5, url: null };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+
+ originalGon = window.gon;
+ window.gon = { api_version: 'v4' };
+ });
+
+ afterEach(() => {
+ mock.restore();
+ window.gon = originalGon;
+ });
+
+ describe('fetchAlertMetricImages', () => {
+ beforeEach(() => {
+ jest.spyOn(axios, 'get');
+ });
+
+ it('retrieves metric images from the correct URL and returns them in the response data', () => {
+ const expectedUrl = `/api/v4/projects/${projectId}/alert_management_alerts/${alertIid}/metric_images`;
+ const expectedData = [imageData];
+ const options = { alertIid, id: projectId };
+
+ mock.onGet(expectedUrl).reply(200, { data: expectedData });
+
+ return alertManagementAlertsApi.fetchAlertMetricImages(options).then(({ data }) => {
+ expect(axios.get).toHaveBeenCalledWith(expectedUrl);
+ expect(data.data).toEqual(expectedData);
+ });
+ });
+ });
+
+ describe('uploadAlertMetricImage', () => {
+ beforeEach(() => {
+ jest.spyOn(axios, 'post');
+ });
+
+ it('uploads a metric image to the correct URL and returns it in the response data', () => {
+ const expectedUrl = `/api/v4/projects/${projectId}/alert_management_alerts/${alertIid}/metric_images`;
+ const expectedData = [imageData];
+
+ const file = new File(['zip contents'], 'hello');
+ const url = 'https://www.example.com';
+ const urlText = 'Example website';
+
+ const expectedFormData = new FormData();
+ expectedFormData.append('file', file);
+ expectedFormData.append('url', url);
+ expectedFormData.append('url_text', urlText);
+
+ mock.onPost(expectedUrl).reply(201, { data: expectedData });
+
+ return alertManagementAlertsApi
+ .uploadAlertMetricImage({
+ alertIid,
+ id: projectId,
+ file,
+ url,
+ urlText,
+ })
+ .then(({ data }) => {
+ expect(data).toEqual({ data: expectedData });
+ expect(axios.post).toHaveBeenCalledWith(expectedUrl, expectedFormData, {
+ headers: { 'Content-Type': 'multipart/form-data' },
+ });
+ });
+ });
+ });
+
+ describe('updateAlertMetricImage', () => {
+ beforeEach(() => {
+ jest.spyOn(axios, 'put');
+ });
+
+ it('updates a metric image to the correct URL and returns it in the response data', () => {
+ const imageIid = 3;
+ const expectedUrl = `/api/v4/projects/${projectId}/alert_management_alerts/${alertIid}/metric_images/${imageIid}`;
+ const expectedData = [imageData];
+
+ const url = 'https://www.example.com';
+ const urlText = 'Example website';
+
+ const expectedFormData = new FormData();
+ expectedFormData.append('url', url);
+ expectedFormData.append('url_text', urlText);
+
+ mock.onPut(expectedUrl).reply(200, { data: expectedData });
+
+ return alertManagementAlertsApi
+ .updateAlertMetricImage({
+ alertIid,
+ id: projectId,
+ imageId: imageIid,
+ url,
+ urlText,
+ })
+ .then(({ data }) => {
+ expect(data).toEqual({ data: expectedData });
+ expect(axios.put).toHaveBeenCalledWith(expectedUrl, expectedFormData);
+ });
+ });
+ });
+
+ describe('deleteAlertMetricImage', () => {
+ beforeEach(() => {
+ jest.spyOn(axios, 'delete');
+ });
+
+ it('deletes a metric image to the correct URL and returns it in the response data', () => {
+ const imageIid = 3;
+ const expectedUrl = `/api/v4/projects/${projectId}/alert_management_alerts/${alertIid}/metric_images/${imageIid}`;
+ const expectedData = [imageData];
+
+ mock.onDelete(expectedUrl).reply(204, { data: expectedData });
+
+ return alertManagementAlertsApi
+ .deleteAlertMetricImage({
+ alertIid,
+ id: projectId,
+ imageId: imageIid,
+ })
+ .then(({ data }) => {
+ expect(data).toEqual({ data: expectedData });
+ expect(axios.delete).toHaveBeenCalledWith(expectedUrl);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/api_spec.js b/spec/frontend/api_spec.js
index bc3e12d3fc4..85332bf21d8 100644
--- a/spec/frontend/api_spec.js
+++ b/spec/frontend/api_spec.js
@@ -2,6 +2,9 @@ import MockAdapter from 'axios-mock-adapter';
import Api, { DEFAULT_PER_PAGE } from '~/api';
import axios from '~/lib/utils/axios_utils';
import httpStatus from '~/lib/utils/http_status';
+import createFlash from '~/flash';
+
+jest.mock('~/flash');
describe('Api', () => {
const dummyApiVersion = 'v3000';
@@ -155,66 +158,44 @@ describe('Api', () => {
});
describe('group', () => {
- it('fetches a group', (done) => {
+ it('fetches a group', () => {
const groupId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}`;
mock.onGet(expectedUrl).reply(httpStatus.OK, {
name: 'test',
});
- Api.group(groupId, (response) => {
- expect(response.name).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.group(groupId, (response) => {
+ expect(response.name).toBe('test');
+ resolve();
+ });
});
});
});
describe('groupMembers', () => {
- it('fetches group members', (done) => {
+ it('fetches group members', () => {
const groupId = '54321';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/members`;
const expectedData = [{ id: 7 }];
mock.onGet(expectedUrl).reply(httpStatus.OK, expectedData);
- Api.groupMembers(groupId)
- .then(({ data }) => {
- expect(data).toEqual(expectedData);
- })
- .then(done)
- .catch(done.fail);
- });
- });
-
- describe('addGroupMembersByUserId', () => {
- it('adds an existing User as a new Group Member by User ID', () => {
- const groupId = 1;
- const expectedUserId = 2;
- const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/1/members`;
- const params = {
- user_id: expectedUserId,
- access_level: 10,
- expires_at: undefined,
- };
-
- mock.onPost(expectedUrl).reply(200, {
- id: expectedUserId,
- state: 'active',
- });
-
- return Api.addGroupMembersByUserId(groupId, params).then(({ data }) => {
- expect(data.id).toBe(expectedUserId);
- expect(data.state).toBe('active');
+ return Api.groupMembers(groupId).then(({ data }) => {
+ expect(data).toEqual(expectedData);
});
});
});
- describe('inviteGroupMembersByEmail', () => {
+ describe('inviteGroupMembers', () => {
it('invites a new email address to create a new User and become a Group Member', () => {
const groupId = 1;
const email = 'email@example.com';
+ const userId = '1';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/1/invitations`;
const params = {
email,
+ userId,
access_level: 10,
expires_at: undefined,
};
@@ -223,14 +204,14 @@ describe('Api', () => {
status: 'success',
});
- return Api.inviteGroupMembersByEmail(groupId, params).then(({ data }) => {
+ return Api.inviteGroupMembers(groupId, params).then(({ data }) => {
expect(data.status).toBe('success');
});
});
});
describe('groupMilestones', () => {
- it('fetches group milestones', (done) => {
+ it('fetches group milestones', () => {
const groupId = '16';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/milestones`;
const expectedData = [
@@ -250,17 +231,14 @@ describe('Api', () => {
];
mock.onGet(expectedUrl).reply(httpStatus.OK, expectedData);
- Api.groupMilestones(groupId)
- .then(({ data }) => {
- expect(data).toEqual(expectedData);
- })
- .then(done)
- .catch(done.fail);
+ return Api.groupMilestones(groupId).then(({ data }) => {
+ expect(data).toEqual(expectedData);
+ });
});
});
describe('groups', () => {
- it('fetches groups', (done) => {
+ it('fetches groups', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups.json`;
@@ -270,16 +248,18 @@ describe('Api', () => {
},
]);
- Api.groups(query, options, (response) => {
- expect(response.length).toBe(1);
- expect(response[0].name).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.groups(query, options, (response) => {
+ expect(response.length).toBe(1);
+ expect(response[0].name).toBe('test');
+ resolve();
+ });
});
});
});
describe('groupLabels', () => {
- it('fetches group labels', (done) => {
+ it('fetches group labels', () => {
const options = { params: { search: 'foo' } };
const expectedGroup = 'gitlab-org';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${expectedGroup}/labels`;
@@ -290,18 +270,15 @@ describe('Api', () => {
},
]);
- Api.groupLabels(expectedGroup, options)
- .then((res) => {
- expect(res.length).toBe(1);
- expect(res[0].name).toBe('Foo Label');
- })
- .then(done)
- .catch(done.fail);
+ return Api.groupLabels(expectedGroup, options).then((res) => {
+ expect(res.length).toBe(1);
+ expect(res[0].name).toBe('Foo Label');
+ });
});
});
describe('namespaces', () => {
- it('fetches namespaces', (done) => {
+ it('fetches namespaces', () => {
const query = 'dummy query';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/namespaces.json`;
mock.onGet(expectedUrl).reply(httpStatus.OK, [
@@ -310,16 +287,18 @@ describe('Api', () => {
},
]);
- Api.namespaces(query, (response) => {
- expect(response.length).toBe(1);
- expect(response[0].name).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.namespaces(query, (response) => {
+ expect(response.length).toBe(1);
+ expect(response[0].name).toBe('test');
+ resolve();
+ });
});
});
});
describe('projects', () => {
- it('fetches projects with membership when logged in', (done) => {
+ it('fetches projects with membership when logged in', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects.json`;
@@ -330,14 +309,16 @@ describe('Api', () => {
},
]);
- Api.projects(query, options, (response) => {
- expect(response.length).toBe(1);
- expect(response[0].name).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.projects(query, options, (response) => {
+ expect(response.length).toBe(1);
+ expect(response[0].name).toBe('test');
+ resolve();
+ });
});
});
- it('fetches projects without membership when not logged in', (done) => {
+ it('fetches projects without membership when not logged in', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects.json`;
@@ -347,31 +328,30 @@ describe('Api', () => {
},
]);
- Api.projects(query, options, (response) => {
- expect(response.length).toBe(1);
- expect(response[0].name).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.projects(query, options, (response) => {
+ expect(response.length).toBe(1);
+ expect(response[0].name).toBe('test');
+ resolve();
+ });
});
});
});
describe('updateProject', () => {
- it('update a project with the given payload', (done) => {
+ it('update a project with the given payload', () => {
const projectPath = 'foo';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}`;
mock.onPut(expectedUrl).reply(httpStatus.OK, { foo: 'bar' });
- Api.updateProject(projectPath, { foo: 'bar' })
- .then(({ data }) => {
- expect(data.foo).toBe('bar');
- done();
- })
- .catch(done.fail);
+ return Api.updateProject(projectPath, { foo: 'bar' }).then(({ data }) => {
+ expect(data.foo).toBe('bar');
+ });
});
});
describe('projectUsers', () => {
- it('fetches all users of a particular project', (done) => {
+ it('fetches all users of a particular project', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const projectPath = 'gitlab-org%2Fgitlab-ce';
@@ -382,13 +362,10 @@ describe('Api', () => {
},
]);
- Api.projectUsers('gitlab-org/gitlab-ce', query, options)
- .then((response) => {
- expect(response.length).toBe(1);
- expect(response[0].name).toBe('test');
- })
- .then(done)
- .catch(done.fail);
+ return Api.projectUsers('gitlab-org/gitlab-ce', query, options).then((response) => {
+ expect(response.length).toBe(1);
+ expect(response[0].name).toBe('test');
+ });
});
});
@@ -396,38 +373,32 @@ describe('Api', () => {
const projectPath = 'abc';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests`;
- it('fetches all merge requests for a project', (done) => {
+ it('fetches all merge requests for a project', () => {
const mockData = [{ source_branch: 'foo' }, { source_branch: 'bar' }];
mock.onGet(expectedUrl).reply(httpStatus.OK, mockData);
- Api.projectMergeRequests(projectPath)
- .then(({ data }) => {
- expect(data.length).toEqual(2);
- expect(data[0].source_branch).toBe('foo');
- expect(data[1].source_branch).toBe('bar');
- })
- .then(done)
- .catch(done.fail);
+ return Api.projectMergeRequests(projectPath).then(({ data }) => {
+ expect(data.length).toEqual(2);
+ expect(data[0].source_branch).toBe('foo');
+ expect(data[1].source_branch).toBe('bar');
+ });
});
- it('fetches merge requests filtered with passed params', (done) => {
+ it('fetches merge requests filtered with passed params', () => {
const params = {
source_branch: 'bar',
};
const mockData = [{ source_branch: 'bar' }];
mock.onGet(expectedUrl, { params }).reply(httpStatus.OK, mockData);
- Api.projectMergeRequests(projectPath, params)
- .then(({ data }) => {
- expect(data.length).toEqual(1);
- expect(data[0].source_branch).toBe('bar');
- })
- .then(done)
- .catch(done.fail);
+ return Api.projectMergeRequests(projectPath, params).then(({ data }) => {
+ expect(data.length).toEqual(1);
+ expect(data[0].source_branch).toBe('bar');
+ });
});
});
describe('projectMergeRequest', () => {
- it('fetches a merge request', (done) => {
+ it('fetches a merge request', () => {
const projectPath = 'abc';
const mergeRequestId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}`;
@@ -435,17 +406,14 @@ describe('Api', () => {
title: 'test',
});
- Api.projectMergeRequest(projectPath, mergeRequestId)
- .then(({ data }) => {
- expect(data.title).toBe('test');
- })
- .then(done)
- .catch(done.fail);
+ return Api.projectMergeRequest(projectPath, mergeRequestId).then(({ data }) => {
+ expect(data.title).toBe('test');
+ });
});
});
describe('projectMergeRequestChanges', () => {
- it('fetches the changes of a merge request', (done) => {
+ it('fetches the changes of a merge request', () => {
const projectPath = 'abc';
const mergeRequestId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}/changes`;
@@ -453,17 +421,14 @@ describe('Api', () => {
title: 'test',
});
- Api.projectMergeRequestChanges(projectPath, mergeRequestId)
- .then(({ data }) => {
- expect(data.title).toBe('test');
- })
- .then(done)
- .catch(done.fail);
+ return Api.projectMergeRequestChanges(projectPath, mergeRequestId).then(({ data }) => {
+ expect(data.title).toBe('test');
+ });
});
});
describe('projectMergeRequestVersions', () => {
- it('fetches the versions of a merge request', (done) => {
+ it('fetches the versions of a merge request', () => {
const projectPath = 'abc';
const mergeRequestId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}/versions`;
@@ -473,30 +438,24 @@ describe('Api', () => {
},
]);
- Api.projectMergeRequestVersions(projectPath, mergeRequestId)
- .then(({ data }) => {
- expect(data.length).toBe(1);
- expect(data[0].id).toBe(123);
- })
- .then(done)
- .catch(done.fail);
+ return Api.projectMergeRequestVersions(projectPath, mergeRequestId).then(({ data }) => {
+ expect(data.length).toBe(1);
+ expect(data[0].id).toBe(123);
+ });
});
});
describe('projectRunners', () => {
- it('fetches the runners of a project', (done) => {
+ it('fetches the runners of a project', () => {
const projectPath = 7;
const params = { scope: 'active' };
const mockData = [{ id: 4 }];
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/runners`;
mock.onGet(expectedUrl, { params }).reply(httpStatus.OK, mockData);
- Api.projectRunners(projectPath, { params })
- .then(({ data }) => {
- expect(data).toEqual(mockData);
- })
- .then(done)
- .catch(done.fail);
+ return Api.projectRunners(projectPath, { params }).then(({ data }) => {
+ expect(data).toEqual(mockData);
+ });
});
});
@@ -525,7 +484,7 @@ describe('Api', () => {
});
describe('projectMilestones', () => {
- it('fetches project milestones', (done) => {
+ it('fetches project milestones', () => {
const projectId = 1;
const options = { state: 'active' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/1/milestones`;
@@ -537,13 +496,10 @@ describe('Api', () => {
},
]);
- Api.projectMilestones(projectId, options)
- .then(({ data }) => {
- expect(data.length).toBe(1);
- expect(data[0].title).toBe('milestone1');
- })
- .then(done)
- .catch(done.fail);
+ return Api.projectMilestones(projectId, options).then(({ data }) => {
+ expect(data.length).toBe(1);
+ expect(data[0].title).toBe('milestone1');
+ });
});
});
@@ -566,36 +522,15 @@ describe('Api', () => {
});
});
- describe('addProjectMembersByUserId', () => {
- it('adds an existing User as a new Project Member by User ID', () => {
- const projectId = 1;
- const expectedUserId = 2;
- const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/1/members`;
- const params = {
- user_id: expectedUserId,
- access_level: 10,
- expires_at: undefined,
- };
-
- mock.onPost(expectedUrl).reply(200, {
- id: expectedUserId,
- state: 'active',
- });
-
- return Api.addProjectMembersByUserId(projectId, params).then(({ data }) => {
- expect(data.id).toBe(expectedUserId);
- expect(data.state).toBe('active');
- });
- });
- });
-
- describe('inviteProjectMembersByEmail', () => {
+ describe('inviteProjectMembers', () => {
it('invites a new email address to create a new User and become a Project Member', () => {
const projectId = 1;
- const expectedEmail = 'email@example.com';
+ const email = 'email@example.com';
+ const userId = '1';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/1/invitations`;
const params = {
- email: expectedEmail,
+ email,
+ userId,
access_level: 10,
expires_at: undefined,
};
@@ -604,14 +539,14 @@ describe('Api', () => {
status: 'success',
});
- return Api.inviteProjectMembersByEmail(projectId, params).then(({ data }) => {
+ return Api.inviteProjectMembers(projectId, params).then(({ data }) => {
expect(data.status).toBe('success');
});
});
});
describe('newLabel', () => {
- it('creates a new project label', (done) => {
+ it('creates a new project label', () => {
const namespace = 'some namespace';
const project = 'some project';
const labelData = { some: 'data' };
@@ -630,13 +565,15 @@ describe('Api', () => {
];
});
- Api.newLabel(namespace, project, labelData, (response) => {
- expect(response.name).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.newLabel(namespace, project, labelData, (response) => {
+ expect(response.name).toBe('test');
+ resolve();
+ });
});
});
- it('creates a new group label', (done) => {
+ it('creates a new group label', () => {
const namespace = 'group/subgroup';
const labelData = { name: 'Foo', color: '#000000' };
const expectedUrl = Api.buildUrl(Api.groupLabelsPath).replace(':namespace_path', namespace);
@@ -651,15 +588,17 @@ describe('Api', () => {
];
});
- Api.newLabel(namespace, undefined, labelData, (response) => {
- expect(response.name).toBe('Foo');
- done();
+ return new Promise((resolve) => {
+ Api.newLabel(namespace, undefined, labelData, (response) => {
+ expect(response.name).toBe('Foo');
+ resolve();
+ });
});
});
});
describe('groupProjects', () => {
- it('fetches group projects', (done) => {
+ it('fetches group projects', () => {
const groupId = '123456';
const query = 'dummy query';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/projects.json`;
@@ -669,11 +608,40 @@ describe('Api', () => {
},
]);
- Api.groupProjects(groupId, query, {}, (response) => {
- expect(response.length).toBe(1);
- expect(response[0].name).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.groupProjects(groupId, query, {}, (response) => {
+ expect(response.length).toBe(1);
+ expect(response[0].name).toBe('test');
+ resolve();
+ });
+ });
+ });
+
+ it('uses flesh on error by default', async () => {
+ const groupId = '123456';
+ const query = 'dummy query';
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/projects.json`;
+ const flashCallback = (callCount) => {
+ expect(createFlash).toHaveBeenCalledTimes(callCount);
+ createFlash.mockClear();
+ };
+
+ mock.onGet(expectedUrl).reply(500, null);
+
+ const response = await Api.groupProjects(groupId, query, {}, () => {}).then(() => {
+ flashCallback(1);
});
+ expect(response).toBeUndefined();
+ });
+
+ it('NOT uses flesh on error with param useCustomErrorHandler', async () => {
+ const groupId = '123456';
+ const query = 'dummy query';
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/projects.json`;
+
+ mock.onGet(expectedUrl).reply(500, null);
+ const apiCall = Api.groupProjects(groupId, query, {}, () => {}, true);
+ await expect(apiCall).rejects.toThrow();
});
});
@@ -734,12 +702,14 @@ describe('Api', () => {
templateKey,
)}`;
- it('fetches an issue template', (done) => {
+ it('fetches an issue template', () => {
mock.onGet(expectedUrl).reply(httpStatus.OK, 'test');
- Api.issueTemplate(namespace, project, templateKey, templateType, (error, response) => {
- expect(response).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.issueTemplate(namespace, project, templateKey, templateType, (_, response) => {
+ expect(response).toBe('test');
+ resolve();
+ });
});
});
@@ -747,8 +717,11 @@ describe('Api', () => {
it('rejects the Promise', () => {
mock.onGet(expectedUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
- Api.issueTemplate(namespace, project, templateKey, templateType, () => {
- expect(mock.history.get).toHaveLength(1);
+ return new Promise((resolve) => {
+ Api.issueTemplate(namespace, project, templateKey, templateType, () => {
+ expect(mock.history.get).toHaveLength(1);
+ resolve();
+ });
});
});
});
@@ -760,19 +733,21 @@ describe('Api', () => {
const templateType = 'template type';
const expectedUrl = `${dummyUrlRoot}/${namespace}/${project}/templates/${templateType}`;
- it('fetches all templates by type', (done) => {
+ it('fetches all templates by type', () => {
const expectedData = [
{ key: 'Template1', name: 'Template 1', content: 'This is template 1!' },
];
mock.onGet(expectedUrl).reply(httpStatus.OK, expectedData);
- Api.issueTemplates(namespace, project, templateType, (error, response) => {
- expect(response.length).toBe(1);
- const { key, name, content } = response[0];
- expect(key).toBe('Template1');
- expect(name).toBe('Template 1');
- expect(content).toBe('This is template 1!');
- done();
+ return new Promise((resolve) => {
+ Api.issueTemplates(namespace, project, templateType, (_, response) => {
+ expect(response.length).toBe(1);
+ const { key, name, content } = response[0];
+ expect(key).toBe('Template1');
+ expect(name).toBe('Template 1');
+ expect(content).toBe('This is template 1!');
+ resolve();
+ });
});
});
@@ -788,34 +763,44 @@ describe('Api', () => {
});
describe('projectTemplates', () => {
- it('fetches a list of templates', (done) => {
+ it('fetches a list of templates', () => {
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/gitlab-org%2Fgitlab-ce/templates/licenses`;
mock.onGet(expectedUrl).reply(httpStatus.OK, 'test');
- Api.projectTemplates('gitlab-org/gitlab-ce', 'licenses', {}, (response) => {
- expect(response).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.projectTemplates('gitlab-org/gitlab-ce', 'licenses', {}, (response) => {
+ expect(response).toBe('test');
+ resolve();
+ });
});
});
});
describe('projectTemplate', () => {
- it('fetches a single template', (done) => {
+ it('fetches a single template', () => {
const data = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/gitlab-org%2Fgitlab-ce/templates/licenses/test%20license`;
mock.onGet(expectedUrl).reply(httpStatus.OK, 'test');
- Api.projectTemplate('gitlab-org/gitlab-ce', 'licenses', 'test license', data, (response) => {
- expect(response).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.projectTemplate(
+ 'gitlab-org/gitlab-ce',
+ 'licenses',
+ 'test license',
+ data,
+ (response) => {
+ expect(response).toBe('test');
+ resolve();
+ },
+ );
});
});
});
describe('users', () => {
- it('fetches users', (done) => {
+ it('fetches users', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/users.json`;
@@ -825,68 +810,56 @@ describe('Api', () => {
},
]);
- Api.users(query, options)
- .then(({ data }) => {
- expect(data.length).toBe(1);
- expect(data[0].name).toBe('test');
- })
- .then(done)
- .catch(done.fail);
+ return Api.users(query, options).then(({ data }) => {
+ expect(data.length).toBe(1);
+ expect(data[0].name).toBe('test');
+ });
});
});
describe('user', () => {
- it('fetches single user', (done) => {
+ it('fetches single user', () => {
const userId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/users/${userId}`;
mock.onGet(expectedUrl).reply(httpStatus.OK, {
name: 'testuser',
});
- Api.user(userId)
- .then(({ data }) => {
- expect(data.name).toBe('testuser');
- })
- .then(done)
- .catch(done.fail);
+ return Api.user(userId).then(({ data }) => {
+ expect(data.name).toBe('testuser');
+ });
});
});
describe('user counts', () => {
- it('fetches single user counts', (done) => {
+ it('fetches single user counts', () => {
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/user_counts`;
mock.onGet(expectedUrl).reply(httpStatus.OK, {
merge_requests: 4,
});
- Api.userCounts()
- .then(({ data }) => {
- expect(data.merge_requests).toBe(4);
- })
- .then(done)
- .catch(done.fail);
+ return Api.userCounts().then(({ data }) => {
+ expect(data.merge_requests).toBe(4);
+ });
});
});
describe('user status', () => {
- it('fetches single user status', (done) => {
+ it('fetches single user status', () => {
const userId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/users/${userId}/status`;
mock.onGet(expectedUrl).reply(httpStatus.OK, {
message: 'testmessage',
});
- Api.userStatus(userId)
- .then(({ data }) => {
- expect(data.message).toBe('testmessage');
- })
- .then(done)
- .catch(done.fail);
+ return Api.userStatus(userId).then(({ data }) => {
+ expect(data.message).toBe('testmessage');
+ });
});
});
describe('user projects', () => {
- it('fetches all projects that belong to a particular user', (done) => {
+ it('fetches all projects that belong to a particular user', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const userId = '123456';
@@ -897,16 +870,18 @@ describe('Api', () => {
},
]);
- Api.userProjects(userId, query, options, (response) => {
- expect(response.length).toBe(1);
- expect(response[0].name).toBe('test');
- done();
+ return new Promise((resolve) => {
+ Api.userProjects(userId, query, options, (response) => {
+ expect(response.length).toBe(1);
+ expect(response[0].name).toBe('test');
+ resolve();
+ });
});
});
});
describe('commitPipelines', () => {
- it('fetches pipelines for a given commit', (done) => {
+ it('fetches pipelines for a given commit', () => {
const projectId = 'example/foobar';
const commitSha = 'abc123def';
const expectedUrl = `${dummyUrlRoot}/${projectId}/commit/${commitSha}/pipelines`;
@@ -916,13 +891,10 @@ describe('Api', () => {
},
]);
- Api.commitPipelines(projectId, commitSha)
- .then(({ data }) => {
- expect(data.length).toBe(1);
- expect(data[0].name).toBe('test');
- })
- .then(done)
- .catch(done.fail);
+ return Api.commitPipelines(projectId, commitSha).then(({ data }) => {
+ expect(data.length).toBe(1);
+ expect(data[0].name).toBe('test');
+ });
});
});
@@ -947,7 +919,7 @@ describe('Api', () => {
});
describe('createBranch', () => {
- it('creates new branch', (done) => {
+ it('creates new branch', () => {
const ref = 'main';
const branch = 'new-branch-name';
const dummyProjectPath = 'gitlab-org/gitlab-ce';
@@ -961,18 +933,15 @@ describe('Api', () => {
name: branch,
});
- Api.createBranch(dummyProjectPath, { ref, branch })
- .then(({ data }) => {
- expect(data.name).toBe(branch);
- expect(axios.post).toHaveBeenCalledWith(expectedUrl, { ref, branch });
- })
- .then(done)
- .catch(done.fail);
+ return Api.createBranch(dummyProjectPath, { ref, branch }).then(({ data }) => {
+ expect(data.name).toBe(branch);
+ expect(axios.post).toHaveBeenCalledWith(expectedUrl, { ref, branch });
+ });
});
});
describe('projectForks', () => {
- it('gets forked projects', (done) => {
+ it('gets forked projects', () => {
const dummyProjectPath = 'gitlab-org/gitlab-ce';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${encodeURIComponent(
dummyProjectPath,
@@ -982,20 +951,17 @@ describe('Api', () => {
mock.onGet(expectedUrl).replyOnce(httpStatus.OK, ['fork']);
- Api.projectForks(dummyProjectPath, { visibility: 'private' })
- .then(({ data }) => {
- expect(data).toEqual(['fork']);
- expect(axios.get).toHaveBeenCalledWith(expectedUrl, {
- params: { visibility: 'private' },
- });
- })
- .then(done)
- .catch(done.fail);
+ return Api.projectForks(dummyProjectPath, { visibility: 'private' }).then(({ data }) => {
+ expect(data).toEqual(['fork']);
+ expect(axios.get).toHaveBeenCalledWith(expectedUrl, {
+ params: { visibility: 'private' },
+ });
+ });
});
});
describe('createContextCommits', () => {
- it('creates a new context commit', (done) => {
+ it('creates a new context commit', () => {
const projectPath = 'abc';
const mergeRequestId = '123456';
const commitsData = ['abcdefg'];
@@ -1014,17 +980,16 @@ describe('Api', () => {
},
]);
- Api.createContextCommits(projectPath, mergeRequestId, expectedData)
- .then(({ data }) => {
+ return Api.createContextCommits(projectPath, mergeRequestId, expectedData).then(
+ ({ data }) => {
expect(data[0].title).toBe('Dummy commit');
- })
- .then(done)
- .catch(done.fail);
+ },
+ );
});
});
describe('allContextCommits', () => {
- it('gets all context commits', (done) => {
+ it('gets all context commits', () => {
const projectPath = 'abc';
const mergeRequestId = '123456';
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectPath}/merge_requests/${mergeRequestId}/context_commits`;
@@ -1035,17 +1000,14 @@ describe('Api', () => {
.onGet(expectedUrl)
.replyOnce(200, [{ id: 'abcdef', short_id: 'abcdefghi', title: 'Dummy commit title' }]);
- Api.allContextCommits(projectPath, mergeRequestId)
- .then(({ data }) => {
- expect(data[0].title).toBe('Dummy commit title');
- })
- .then(done)
- .catch(done.fail);
+ return Api.allContextCommits(projectPath, mergeRequestId).then(({ data }) => {
+ expect(data[0].title).toBe('Dummy commit title');
+ });
});
});
describe('removeContextCommits', () => {
- it('removes context commits', (done) => {
+ it('removes context commits', () => {
const projectPath = 'abc';
const mergeRequestId = '123456';
const commitsData = ['abcdefg'];
@@ -1058,12 +1020,9 @@ describe('Api', () => {
mock.onDelete(expectedUrl).replyOnce(204);
- Api.removeContextCommits(projectPath, mergeRequestId, expectedData)
- .then(() => {
- expect(axios.delete).toHaveBeenCalledWith(expectedUrl, { data: expectedData });
- })
- .then(done)
- .catch(done.fail);
+ return Api.removeContextCommits(projectPath, mergeRequestId, expectedData).then(() => {
+ expect(axios.delete).toHaveBeenCalledWith(expectedUrl, { data: expectedData });
+ });
});
});
@@ -1306,41 +1265,37 @@ describe('Api', () => {
});
describe('updateIssue', () => {
- it('update an issue with the given payload', (done) => {
+ it('update an issue with the given payload', () => {
const projectId = 8;
const issue = 1;
const expectedArray = [1, 2, 3];
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/issues/${issue}`;
mock.onPut(expectedUrl).reply(httpStatus.OK, { assigneeIds: expectedArray });
- Api.updateIssue(projectId, issue, { assigneeIds: expectedArray })
- .then(({ data }) => {
- expect(data.assigneeIds).toEqual(expectedArray);
- done();
- })
- .catch(done.fail);
+ return Api.updateIssue(projectId, issue, { assigneeIds: expectedArray }).then(({ data }) => {
+ expect(data.assigneeIds).toEqual(expectedArray);
+ });
});
});
describe('updateMergeRequest', () => {
- it('update an issue with the given payload', (done) => {
+ it('update an issue with the given payload', () => {
const projectId = 8;
const mergeRequest = 1;
const expectedArray = [1, 2, 3];
const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/merge_requests/${mergeRequest}`;
mock.onPut(expectedUrl).reply(httpStatus.OK, { assigneeIds: expectedArray });
- Api.updateMergeRequest(projectId, mergeRequest, { assigneeIds: expectedArray })
- .then(({ data }) => {
+ return Api.updateMergeRequest(projectId, mergeRequest, { assigneeIds: expectedArray }).then(
+ ({ data }) => {
expect(data.assigneeIds).toEqual(expectedArray);
- done();
- })
- .catch(done.fail);
+ },
+ );
});
});
describe('tags', () => {
- it('fetches all tags of a particular project', (done) => {
+ it('fetches all tags of a particular project', () => {
const query = 'dummy query';
const options = { unused: 'option' };
const projectId = 8;
@@ -1351,13 +1306,10 @@ describe('Api', () => {
},
]);
- Api.tags(projectId, query, options)
- .then(({ data }) => {
- expect(data.length).toBe(1);
- expect(data[0].name).toBe('test');
- })
- .then(done)
- .catch(done.fail);
+ return Api.tags(projectId, query, options).then(({ data }) => {
+ expect(data.length).toBe(1);
+ expect(data[0].name).toBe('test');
+ });
});
});
@@ -1641,6 +1593,18 @@ describe('Api', () => {
});
});
+ describe('dependency proxy cache', () => {
+ it('schedules the cache list for deletion', async () => {
+ const groupId = 1;
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${groupId}/dependency_proxy/cache`;
+
+ mock.onDelete(expectedUrl).reply(httpStatus.ACCEPTED);
+ const { status } = await Api.deleteDependencyProxyCacheList(groupId, {});
+
+ expect(status).toBe(httpStatus.ACCEPTED);
+ });
+ });
+
describe('Feature Flag User List', () => {
let expectedUrl;
let projectId;
@@ -1727,4 +1691,36 @@ describe('Api', () => {
});
});
});
+
+ describe('projectProtectedBranch', () => {
+ const branchName = 'new-branch-name';
+ const dummyProjectId = 5;
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${dummyProjectId}/protected_branches/${branchName}`;
+
+ it('returns 404 for non-existing branch', () => {
+ jest.spyOn(axios, 'get');
+
+ mock.onGet(expectedUrl).replyOnce(httpStatus.NOT_FOUND, {
+ message: '404 Not found',
+ });
+
+ return Api.projectProtectedBranch(dummyProjectId, branchName).catch((error) => {
+ expect(error.response.status).toBe(httpStatus.NOT_FOUND);
+ expect(axios.get).toHaveBeenCalledWith(expectedUrl);
+ });
+ });
+
+ it('returns 200 with branch information', () => {
+ const expectedObj = { name: branchName };
+
+ jest.spyOn(axios, 'get');
+
+ mock.onGet(expectedUrl).replyOnce(httpStatus.OK, expectedObj);
+
+ return Api.projectProtectedBranch(dummyProjectId, branchName).then((data) => {
+ expect(data).toEqual(expectedObj);
+ expect(axios.get).toHaveBeenCalledWith(expectedUrl);
+ });
+ });
+ });
});
diff --git a/spec/frontend/authentication/u2f/authenticate_spec.js b/spec/frontend/authentication/u2f/authenticate_spec.js
index 153d4be56af..31782899ce4 100644
--- a/spec/frontend/authentication/u2f/authenticate_spec.js
+++ b/spec/frontend/authentication/u2f/authenticate_spec.js
@@ -36,24 +36,19 @@ describe('U2FAuthenticate', () => {
window.u2f = oldu2f;
});
- it('falls back to normal 2fa', (done) => {
- component
- .start()
- .then(() => {
- expect(component.switchToFallbackUI).toHaveBeenCalled();
- done();
- })
- .catch(done.fail);
+ it('falls back to normal 2fa', async () => {
+ await component.start();
+ expect(component.switchToFallbackUI).toHaveBeenCalled();
});
});
describe('with u2f available', () => {
- beforeEach((done) => {
+ beforeEach(() => {
// bypass automatic form submission within renderAuthenticated
jest.spyOn(component, 'renderAuthenticated').mockReturnValue(true);
u2fDevice = new MockU2FDevice();
- component.start().then(done).catch(done.fail);
+ return component.start();
});
it('allows authenticating via a U2F device', () => {
diff --git a/spec/frontend/authentication/u2f/register_spec.js b/spec/frontend/authentication/u2f/register_spec.js
index a814144ac7a..810396aa9fd 100644
--- a/spec/frontend/authentication/u2f/register_spec.js
+++ b/spec/frontend/authentication/u2f/register_spec.js
@@ -8,12 +8,12 @@ describe('U2FRegister', () => {
let container;
let component;
- beforeEach((done) => {
+ beforeEach(() => {
loadFixtures('u2f/register.html');
u2fDevice = new MockU2FDevice();
container = $('#js-register-token-2fa');
component = new U2FRegister(container, {});
- component.start().then(done).catch(done.fail);
+ return component.start();
});
it('allows registering a U2F device', () => {
diff --git a/spec/frontend/badges/components/badge_spec.js b/spec/frontend/badges/components/badge_spec.js
index 2310fb8bd8e..fe4cf8ce8eb 100644
--- a/spec/frontend/badges/components/badge_spec.js
+++ b/spec/frontend/badges/components/badge_spec.js
@@ -89,11 +89,9 @@ describe('Badge component', () => {
});
describe('behavior', () => {
- beforeEach((done) => {
+ beforeEach(() => {
setFixtures('<div id="dummy-element"></div>');
- createComponent({ ...dummyProps }, '#dummy-element')
- .then(done)
- .catch(done.fail);
+ return createComponent({ ...dummyProps }, '#dummy-element');
});
it('shows a badge image after loading', () => {
diff --git a/spec/frontend/badges/store/actions_spec.js b/spec/frontend/badges/store/actions_spec.js
index 75699f24463..02e1b8e65e4 100644
--- a/spec/frontend/badges/store/actions_spec.js
+++ b/spec/frontend/badges/store/actions_spec.js
@@ -33,41 +33,38 @@ describe('Badges store actions', () => {
});
describe('requestNewBadge', () => {
- it('commits REQUEST_NEW_BADGE', (done) => {
- testAction(
+ it('commits REQUEST_NEW_BADGE', () => {
+ return testAction(
actions.requestNewBadge,
null,
state,
[{ type: mutationTypes.REQUEST_NEW_BADGE }],
[],
- done,
);
});
});
describe('receiveNewBadge', () => {
- it('commits RECEIVE_NEW_BADGE', (done) => {
+ it('commits RECEIVE_NEW_BADGE', () => {
const newBadge = createDummyBadge();
- testAction(
+ return testAction(
actions.receiveNewBadge,
newBadge,
state,
[{ type: mutationTypes.RECEIVE_NEW_BADGE, payload: newBadge }],
[],
- done,
);
});
});
describe('receiveNewBadgeError', () => {
- it('commits RECEIVE_NEW_BADGE_ERROR', (done) => {
- testAction(
+ it('commits RECEIVE_NEW_BADGE_ERROR', () => {
+ return testAction(
actions.receiveNewBadgeError,
null,
state,
[{ type: mutationTypes.RECEIVE_NEW_BADGE_ERROR }],
[],
- done,
);
});
});
@@ -87,7 +84,7 @@ describe('Badges store actions', () => {
};
});
- it('dispatches requestNewBadge and receiveNewBadge for successful response', (done) => {
+ it('dispatches requestNewBadge and receiveNewBadge for successful response', async () => {
const dummyResponse = createDummyBadgeResponse();
endpointMock.replyOnce((req) => {
@@ -105,16 +102,12 @@ describe('Badges store actions', () => {
});
const dummyBadge = transformBackendBadge(dummyResponse);
- actions
- .addBadge({ state, dispatch })
- .then(() => {
- expect(dispatch.mock.calls).toEqual([['receiveNewBadge', dummyBadge]]);
- })
- .then(done)
- .catch(done.fail);
+
+ await actions.addBadge({ state, dispatch });
+ expect(dispatch.mock.calls).toEqual([['receiveNewBadge', dummyBadge]]);
});
- it('dispatches requestNewBadge and receiveNewBadgeError for error response', (done) => {
+ it('dispatches requestNewBadge and receiveNewBadgeError for error response', async () => {
endpointMock.replyOnce((req) => {
expect(req.data).toBe(
JSON.stringify({
@@ -129,52 +122,43 @@ describe('Badges store actions', () => {
return [500, ''];
});
- actions
- .addBadge({ state, dispatch })
- .then(() => done.fail('Expected Ajax call to fail!'))
- .catch(() => {
- expect(dispatch.mock.calls).toEqual([['receiveNewBadgeError']]);
- })
- .then(done)
- .catch(done.fail);
+ await expect(actions.addBadge({ state, dispatch })).rejects.toThrow();
+ expect(dispatch.mock.calls).toEqual([['receiveNewBadgeError']]);
});
});
describe('requestDeleteBadge', () => {
- it('commits REQUEST_DELETE_BADGE', (done) => {
- testAction(
+ it('commits REQUEST_DELETE_BADGE', () => {
+ return testAction(
actions.requestDeleteBadge,
badgeId,
state,
[{ type: mutationTypes.REQUEST_DELETE_BADGE, payload: badgeId }],
[],
- done,
);
});
});
describe('receiveDeleteBadge', () => {
- it('commits RECEIVE_DELETE_BADGE', (done) => {
- testAction(
+ it('commits RECEIVE_DELETE_BADGE', () => {
+ return testAction(
actions.receiveDeleteBadge,
badgeId,
state,
[{ type: mutationTypes.RECEIVE_DELETE_BADGE, payload: badgeId }],
[],
- done,
);
});
});
describe('receiveDeleteBadgeError', () => {
- it('commits RECEIVE_DELETE_BADGE_ERROR', (done) => {
- testAction(
+ it('commits RECEIVE_DELETE_BADGE_ERROR', () => {
+ return testAction(
actions.receiveDeleteBadgeError,
badgeId,
state,
[{ type: mutationTypes.RECEIVE_DELETE_BADGE_ERROR, payload: badgeId }],
[],
- done,
);
});
});
@@ -188,91 +172,76 @@ describe('Badges store actions', () => {
dispatch = jest.fn();
});
- it('dispatches requestDeleteBadge and receiveDeleteBadge for successful response', (done) => {
+ it('dispatches requestDeleteBadge and receiveDeleteBadge for successful response', async () => {
endpointMock.replyOnce(() => {
expect(dispatch.mock.calls).toEqual([['requestDeleteBadge', badgeId]]);
dispatch.mockClear();
return [200, ''];
});
- actions
- .deleteBadge({ state, dispatch }, { id: badgeId })
- .then(() => {
- expect(dispatch.mock.calls).toEqual([['receiveDeleteBadge', badgeId]]);
- })
- .then(done)
- .catch(done.fail);
+ await actions.deleteBadge({ state, dispatch }, { id: badgeId });
+ expect(dispatch.mock.calls).toEqual([['receiveDeleteBadge', badgeId]]);
});
- it('dispatches requestDeleteBadge and receiveDeleteBadgeError for error response', (done) => {
+ it('dispatches requestDeleteBadge and receiveDeleteBadgeError for error response', async () => {
endpointMock.replyOnce(() => {
expect(dispatch.mock.calls).toEqual([['requestDeleteBadge', badgeId]]);
dispatch.mockClear();
return [500, ''];
});
- actions
- .deleteBadge({ state, dispatch }, { id: badgeId })
- .then(() => done.fail('Expected Ajax call to fail!'))
- .catch(() => {
- expect(dispatch.mock.calls).toEqual([['receiveDeleteBadgeError', badgeId]]);
- })
- .then(done)
- .catch(done.fail);
+ await expect(actions.deleteBadge({ state, dispatch }, { id: badgeId })).rejects.toThrow();
+ expect(dispatch.mock.calls).toEqual([['receiveDeleteBadgeError', badgeId]]);
});
});
describe('editBadge', () => {
- it('commits START_EDITING', (done) => {
+ it('commits START_EDITING', () => {
const dummyBadge = createDummyBadge();
- testAction(
+ return testAction(
actions.editBadge,
dummyBadge,
state,
[{ type: mutationTypes.START_EDITING, payload: dummyBadge }],
[],
- done,
);
});
});
describe('requestLoadBadges', () => {
- it('commits REQUEST_LOAD_BADGES', (done) => {
+ it('commits REQUEST_LOAD_BADGES', () => {
const dummyData = 'this is not real data';
- testAction(
+ return testAction(
actions.requestLoadBadges,
dummyData,
state,
[{ type: mutationTypes.REQUEST_LOAD_BADGES, payload: dummyData }],
[],
- done,
);
});
});
describe('receiveLoadBadges', () => {
- it('commits RECEIVE_LOAD_BADGES', (done) => {
+ it('commits RECEIVE_LOAD_BADGES', () => {
const badges = dummyBadges;
- testAction(
+ return testAction(
actions.receiveLoadBadges,
badges,
state,
[{ type: mutationTypes.RECEIVE_LOAD_BADGES, payload: badges }],
[],
- done,
);
});
});
describe('receiveLoadBadgesError', () => {
- it('commits RECEIVE_LOAD_BADGES_ERROR', (done) => {
- testAction(
+ it('commits RECEIVE_LOAD_BADGES_ERROR', () => {
+ return testAction(
actions.receiveLoadBadgesError,
null,
state,
[{ type: mutationTypes.RECEIVE_LOAD_BADGES_ERROR }],
[],
- done,
);
});
});
@@ -286,7 +255,7 @@ describe('Badges store actions', () => {
dispatch = jest.fn();
});
- it('dispatches requestLoadBadges and receiveLoadBadges for successful response', (done) => {
+ it('dispatches requestLoadBadges and receiveLoadBadges for successful response', async () => {
const dummyData = 'this is just some data';
const dummyReponse = [
createDummyBadgeResponse(),
@@ -299,18 +268,13 @@ describe('Badges store actions', () => {
return [200, dummyReponse];
});
- actions
- .loadBadges({ state, dispatch }, dummyData)
- .then(() => {
- const badges = dummyReponse.map(transformBackendBadge);
+ await actions.loadBadges({ state, dispatch }, dummyData);
+ const badges = dummyReponse.map(transformBackendBadge);
- expect(dispatch.mock.calls).toEqual([['receiveLoadBadges', badges]]);
- })
- .then(done)
- .catch(done.fail);
+ expect(dispatch.mock.calls).toEqual([['receiveLoadBadges', badges]]);
});
- it('dispatches requestLoadBadges and receiveLoadBadgesError for error response', (done) => {
+ it('dispatches requestLoadBadges and receiveLoadBadgesError for error response', async () => {
const dummyData = 'this is just some data';
endpointMock.replyOnce(() => {
expect(dispatch.mock.calls).toEqual([['requestLoadBadges', dummyData]]);
@@ -318,53 +282,44 @@ describe('Badges store actions', () => {
return [500, ''];
});
- actions
- .loadBadges({ state, dispatch }, dummyData)
- .then(() => done.fail('Expected Ajax call to fail!'))
- .catch(() => {
- expect(dispatch.mock.calls).toEqual([['receiveLoadBadgesError']]);
- })
- .then(done)
- .catch(done.fail);
+ await expect(actions.loadBadges({ state, dispatch }, dummyData)).rejects.toThrow();
+ expect(dispatch.mock.calls).toEqual([['receiveLoadBadgesError']]);
});
});
describe('requestRenderedBadge', () => {
- it('commits REQUEST_RENDERED_BADGE', (done) => {
- testAction(
+ it('commits REQUEST_RENDERED_BADGE', () => {
+ return testAction(
actions.requestRenderedBadge,
null,
state,
[{ type: mutationTypes.REQUEST_RENDERED_BADGE }],
[],
- done,
);
});
});
describe('receiveRenderedBadge', () => {
- it('commits RECEIVE_RENDERED_BADGE', (done) => {
+ it('commits RECEIVE_RENDERED_BADGE', () => {
const dummyBadge = createDummyBadge();
- testAction(
+ return testAction(
actions.receiveRenderedBadge,
dummyBadge,
state,
[{ type: mutationTypes.RECEIVE_RENDERED_BADGE, payload: dummyBadge }],
[],
- done,
);
});
});
describe('receiveRenderedBadgeError', () => {
- it('commits RECEIVE_RENDERED_BADGE_ERROR', (done) => {
- testAction(
+ it('commits RECEIVE_RENDERED_BADGE_ERROR', () => {
+ return testAction(
actions.receiveRenderedBadgeError,
null,
state,
[{ type: mutationTypes.RECEIVE_RENDERED_BADGE_ERROR }],
[],
- done,
);
});
});
@@ -388,56 +343,41 @@ describe('Badges store actions', () => {
dispatch = jest.fn();
});
- it('returns immediately if imageUrl is empty', (done) => {
+ it('returns immediately if imageUrl is empty', async () => {
jest.spyOn(axios, 'get').mockImplementation(() => {});
badgeInForm.imageUrl = '';
- actions
- .renderBadge({ state, dispatch })
- .then(() => {
- expect(axios.get).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ await actions.renderBadge({ state, dispatch });
+ expect(axios.get).not.toHaveBeenCalled();
});
- it('returns immediately if linkUrl is empty', (done) => {
+ it('returns immediately if linkUrl is empty', async () => {
jest.spyOn(axios, 'get').mockImplementation(() => {});
badgeInForm.linkUrl = '';
- actions
- .renderBadge({ state, dispatch })
- .then(() => {
- expect(axios.get).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ await actions.renderBadge({ state, dispatch });
+ expect(axios.get).not.toHaveBeenCalled();
});
- it('escapes user input', (done) => {
+ it('escapes user input', async () => {
jest
.spyOn(axios, 'get')
.mockImplementation(() => Promise.resolve({ data: createDummyBadgeResponse() }));
badgeInForm.imageUrl = '&make-sandwich=true';
badgeInForm.linkUrl = '<script>I am dangerous!</script>';
- actions
- .renderBadge({ state, dispatch })
- .then(() => {
- expect(axios.get.mock.calls.length).toBe(1);
- const url = axios.get.mock.calls[0][0];
+ await actions.renderBadge({ state, dispatch });
+ expect(axios.get.mock.calls.length).toBe(1);
+ const url = axios.get.mock.calls[0][0];
- expect(url).toMatch(new RegExp(`^${dummyEndpointUrl}/render?`));
- expect(url).toMatch(
- new RegExp('\\?link_url=%3Cscript%3EI%20am%20dangerous!%3C%2Fscript%3E&'),
- );
- expect(url).toMatch(new RegExp('&image_url=%26make-sandwich%3Dtrue$'));
- })
- .then(done)
- .catch(done.fail);
+ expect(url).toMatch(new RegExp(`^${dummyEndpointUrl}/render?`));
+ expect(url).toMatch(
+ new RegExp('\\?link_url=%3Cscript%3EI%20am%20dangerous!%3C%2Fscript%3E&'),
+ );
+ expect(url).toMatch(new RegExp('&image_url=%26make-sandwich%3Dtrue$'));
});
- it('dispatches requestRenderedBadge and receiveRenderedBadge for successful response', (done) => {
+ it('dispatches requestRenderedBadge and receiveRenderedBadge for successful response', async () => {
const dummyReponse = createDummyBadgeResponse();
endpointMock.replyOnce(() => {
expect(dispatch.mock.calls).toEqual([['requestRenderedBadge']]);
@@ -445,71 +385,57 @@ describe('Badges store actions', () => {
return [200, dummyReponse];
});
- actions
- .renderBadge({ state, dispatch })
- .then(() => {
- const renderedBadge = transformBackendBadge(dummyReponse);
+ await actions.renderBadge({ state, dispatch });
+ const renderedBadge = transformBackendBadge(dummyReponse);
- expect(dispatch.mock.calls).toEqual([['receiveRenderedBadge', renderedBadge]]);
- })
- .then(done)
- .catch(done.fail);
+ expect(dispatch.mock.calls).toEqual([['receiveRenderedBadge', renderedBadge]]);
});
- it('dispatches requestRenderedBadge and receiveRenderedBadgeError for error response', (done) => {
+ it('dispatches requestRenderedBadge and receiveRenderedBadgeError for error response', async () => {
endpointMock.replyOnce(() => {
expect(dispatch.mock.calls).toEqual([['requestRenderedBadge']]);
dispatch.mockClear();
return [500, ''];
});
- actions
- .renderBadge({ state, dispatch })
- .then(() => done.fail('Expected Ajax call to fail!'))
- .catch(() => {
- expect(dispatch.mock.calls).toEqual([['receiveRenderedBadgeError']]);
- })
- .then(done)
- .catch(done.fail);
+ await expect(actions.renderBadge({ state, dispatch })).rejects.toThrow();
+ expect(dispatch.mock.calls).toEqual([['receiveRenderedBadgeError']]);
});
});
describe('requestUpdatedBadge', () => {
- it('commits REQUEST_UPDATED_BADGE', (done) => {
- testAction(
+ it('commits REQUEST_UPDATED_BADGE', () => {
+ return testAction(
actions.requestUpdatedBadge,
null,
state,
[{ type: mutationTypes.REQUEST_UPDATED_BADGE }],
[],
- done,
);
});
});
describe('receiveUpdatedBadge', () => {
- it('commits RECEIVE_UPDATED_BADGE', (done) => {
+ it('commits RECEIVE_UPDATED_BADGE', () => {
const updatedBadge = createDummyBadge();
- testAction(
+ return testAction(
actions.receiveUpdatedBadge,
updatedBadge,
state,
[{ type: mutationTypes.RECEIVE_UPDATED_BADGE, payload: updatedBadge }],
[],
- done,
);
});
});
describe('receiveUpdatedBadgeError', () => {
- it('commits RECEIVE_UPDATED_BADGE_ERROR', (done) => {
- testAction(
+ it('commits RECEIVE_UPDATED_BADGE_ERROR', () => {
+ return testAction(
actions.receiveUpdatedBadgeError,
null,
state,
[{ type: mutationTypes.RECEIVE_UPDATED_BADGE_ERROR }],
[],
- done,
);
});
});
@@ -529,7 +455,7 @@ describe('Badges store actions', () => {
dispatch = jest.fn();
});
- it('dispatches requestUpdatedBadge and receiveUpdatedBadge for successful response', (done) => {
+ it('dispatches requestUpdatedBadge and receiveUpdatedBadge for successful response', async () => {
const dummyResponse = createDummyBadgeResponse();
endpointMock.replyOnce((req) => {
@@ -547,16 +473,11 @@ describe('Badges store actions', () => {
});
const updatedBadge = transformBackendBadge(dummyResponse);
- actions
- .saveBadge({ state, dispatch })
- .then(() => {
- expect(dispatch.mock.calls).toEqual([['receiveUpdatedBadge', updatedBadge]]);
- })
- .then(done)
- .catch(done.fail);
+ await actions.saveBadge({ state, dispatch });
+ expect(dispatch.mock.calls).toEqual([['receiveUpdatedBadge', updatedBadge]]);
});
- it('dispatches requestUpdatedBadge and receiveUpdatedBadgeError for error response', (done) => {
+ it('dispatches requestUpdatedBadge and receiveUpdatedBadgeError for error response', async () => {
endpointMock.replyOnce((req) => {
expect(req.data).toBe(
JSON.stringify({
@@ -571,53 +492,44 @@ describe('Badges store actions', () => {
return [500, ''];
});
- actions
- .saveBadge({ state, dispatch })
- .then(() => done.fail('Expected Ajax call to fail!'))
- .catch(() => {
- expect(dispatch.mock.calls).toEqual([['receiveUpdatedBadgeError']]);
- })
- .then(done)
- .catch(done.fail);
+ await expect(actions.saveBadge({ state, dispatch })).rejects.toThrow();
+ expect(dispatch.mock.calls).toEqual([['receiveUpdatedBadgeError']]);
});
});
describe('stopEditing', () => {
- it('commits STOP_EDITING', (done) => {
- testAction(
+ it('commits STOP_EDITING', () => {
+ return testAction(
actions.stopEditing,
null,
state,
[{ type: mutationTypes.STOP_EDITING }],
[],
- done,
);
});
});
describe('updateBadgeInForm', () => {
- it('commits UPDATE_BADGE_IN_FORM', (done) => {
+ it('commits UPDATE_BADGE_IN_FORM', () => {
const dummyBadge = createDummyBadge();
- testAction(
+ return testAction(
actions.updateBadgeInForm,
dummyBadge,
state,
[{ type: mutationTypes.UPDATE_BADGE_IN_FORM, payload: dummyBadge }],
[],
- done,
);
});
describe('updateBadgeInModal', () => {
- it('commits UPDATE_BADGE_IN_MODAL', (done) => {
+ it('commits UPDATE_BADGE_IN_MODAL', () => {
const dummyBadge = createDummyBadge();
- testAction(
+ return testAction(
actions.updateBadgeInModal,
dummyBadge,
state,
[{ type: mutationTypes.UPDATE_BADGE_IN_MODAL, payload: dummyBadge }],
[],
- done,
);
});
});
diff --git a/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js b/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
index b0e9e5dd00b..e9535d8cc12 100644
--- a/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
+++ b/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
@@ -29,53 +29,56 @@ describe('Batch comments store actions', () => {
});
describe('addDraftToDiscussion', () => {
- it('commits ADD_NEW_DRAFT if no errors returned', (done) => {
+ it('commits ADD_NEW_DRAFT if no errors returned', () => {
res = { id: 1 };
mock.onAny().reply(200, res);
- testAction(
+ return testAction(
actions.addDraftToDiscussion,
{ endpoint: TEST_HOST, data: 'test' },
null,
[{ type: 'ADD_NEW_DRAFT', payload: res }],
[],
- done,
);
});
- it('does not commit ADD_NEW_DRAFT if errors returned', (done) => {
+ it('does not commit ADD_NEW_DRAFT if errors returned', () => {
mock.onAny().reply(500);
- testAction(
+ return testAction(
actions.addDraftToDiscussion,
{ endpoint: TEST_HOST, data: 'test' },
null,
[],
[],
- done,
);
});
});
describe('createNewDraft', () => {
- it('commits ADD_NEW_DRAFT if no errors returned', (done) => {
+ it('commits ADD_NEW_DRAFT if no errors returned', () => {
res = { id: 1 };
mock.onAny().reply(200, res);
- testAction(
+ return testAction(
actions.createNewDraft,
{ endpoint: TEST_HOST, data: 'test' },
null,
[{ type: 'ADD_NEW_DRAFT', payload: res }],
[],
- done,
);
});
- it('does not commit ADD_NEW_DRAFT if errors returned', (done) => {
+ it('does not commit ADD_NEW_DRAFT if errors returned', () => {
mock.onAny().reply(500);
- testAction(actions.createNewDraft, { endpoint: TEST_HOST, data: 'test' }, null, [], [], done);
+ return testAction(
+ actions.createNewDraft,
+ { endpoint: TEST_HOST, data: 'test' },
+ null,
+ [],
+ [],
+ );
});
});
@@ -90,7 +93,7 @@ describe('Batch comments store actions', () => {
};
});
- it('commits DELETE_DRAFT if no errors returned', (done) => {
+ it('commits DELETE_DRAFT if no errors returned', () => {
const commit = jest.fn();
const context = {
getters,
@@ -99,16 +102,12 @@ describe('Batch comments store actions', () => {
res = { id: 1 };
mock.onAny().reply(200);
- actions
- .deleteDraft(context, { id: 1 })
- .then(() => {
- expect(commit).toHaveBeenCalledWith('DELETE_DRAFT', 1);
- })
- .then(done)
- .catch(done.fail);
+ return actions.deleteDraft(context, { id: 1 }).then(() => {
+ expect(commit).toHaveBeenCalledWith('DELETE_DRAFT', 1);
+ });
});
- it('does not commit DELETE_DRAFT if errors returned', (done) => {
+ it('does not commit DELETE_DRAFT if errors returned', () => {
const commit = jest.fn();
const context = {
getters,
@@ -116,13 +115,9 @@ describe('Batch comments store actions', () => {
};
mock.onAny().reply(500);
- actions
- .deleteDraft(context, { id: 1 })
- .then(() => {
- expect(commit).not.toHaveBeenCalledWith('DELETE_DRAFT', 1);
- })
- .then(done)
- .catch(done.fail);
+ return actions.deleteDraft(context, { id: 1 }).then(() => {
+ expect(commit).not.toHaveBeenCalledWith('DELETE_DRAFT', 1);
+ });
});
});
@@ -137,7 +132,7 @@ describe('Batch comments store actions', () => {
};
});
- it('commits SET_BATCH_COMMENTS_DRAFTS with returned data', (done) => {
+ it('commits SET_BATCH_COMMENTS_DRAFTS with returned data', () => {
const commit = jest.fn();
const dispatch = jest.fn();
const context = {
@@ -151,14 +146,10 @@ describe('Batch comments store actions', () => {
res = { id: 1 };
mock.onAny().reply(200, res);
- actions
- .fetchDrafts(context)
- .then(() => {
- expect(commit).toHaveBeenCalledWith('SET_BATCH_COMMENTS_DRAFTS', { id: 1 });
- expect(dispatch).toHaveBeenCalledWith('convertToDiscussion', '1', { root: true });
- })
- .then(done)
- .catch(done.fail);
+ return actions.fetchDrafts(context).then(() => {
+ expect(commit).toHaveBeenCalledWith('SET_BATCH_COMMENTS_DRAFTS', { id: 1 });
+ expect(dispatch).toHaveBeenCalledWith('convertToDiscussion', '1', { root: true });
+ });
});
});
@@ -177,32 +168,24 @@ describe('Batch comments store actions', () => {
rootGetters = { discussionsStructuredByLineCode: 'discussions' };
});
- it('dispatches actions & commits', (done) => {
+ it('dispatches actions & commits', () => {
mock.onAny().reply(200);
- actions
- .publishReview({ dispatch, commit, getters, rootGetters })
- .then(() => {
- expect(commit.mock.calls[0]).toEqual(['REQUEST_PUBLISH_REVIEW']);
- expect(commit.mock.calls[1]).toEqual(['RECEIVE_PUBLISH_REVIEW_SUCCESS']);
+ return actions.publishReview({ dispatch, commit, getters, rootGetters }).then(() => {
+ expect(commit.mock.calls[0]).toEqual(['REQUEST_PUBLISH_REVIEW']);
+ expect(commit.mock.calls[1]).toEqual(['RECEIVE_PUBLISH_REVIEW_SUCCESS']);
- expect(dispatch.mock.calls[0]).toEqual(['updateDiscussionsAfterPublish']);
- })
- .then(done)
- .catch(done.fail);
+ expect(dispatch.mock.calls[0]).toEqual(['updateDiscussionsAfterPublish']);
+ });
});
- it('dispatches error commits', (done) => {
+ it('dispatches error commits', () => {
mock.onAny().reply(500);
- actions
- .publishReview({ dispatch, commit, getters, rootGetters })
- .then(() => {
- expect(commit.mock.calls[0]).toEqual(['REQUEST_PUBLISH_REVIEW']);
- expect(commit.mock.calls[1]).toEqual(['RECEIVE_PUBLISH_REVIEW_ERROR']);
- })
- .then(done)
- .catch(done.fail);
+ return actions.publishReview({ dispatch, commit, getters, rootGetters }).then(() => {
+ expect(commit.mock.calls[0]).toEqual(['REQUEST_PUBLISH_REVIEW']);
+ expect(commit.mock.calls[1]).toEqual(['RECEIVE_PUBLISH_REVIEW_ERROR']);
+ });
});
});
@@ -262,7 +245,7 @@ describe('Batch comments store actions', () => {
});
describe('expandAllDiscussions', () => {
- it('dispatches expandDiscussion for all drafts', (done) => {
+ it('dispatches expandDiscussion for all drafts', () => {
const state = {
drafts: [
{
@@ -271,7 +254,7 @@ describe('Batch comments store actions', () => {
],
};
- testAction(
+ return testAction(
actions.expandAllDiscussions,
null,
state,
@@ -282,7 +265,6 @@ describe('Batch comments store actions', () => {
payload: { discussionId: '1' },
},
],
- done,
);
});
});
diff --git a/spec/frontend/behaviors/gl_emoji_spec.js b/spec/frontend/behaviors/gl_emoji_spec.js
index cac1ea67cf5..8842ad636ec 100644
--- a/spec/frontend/behaviors/gl_emoji_spec.js
+++ b/spec/frontend/behaviors/gl_emoji_spec.js
@@ -77,6 +77,12 @@ describe('gl_emoji', () => {
'<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament">â”</gl-emoji>',
`<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament"><img class="emoji" title=":grey_question:" alt=":grey_question:" src="/-/emojis/${EMOJI_VERSION}/grey_question.png" width="20" height="20" align="absmiddle"></gl-emoji>`,
],
+ [
+ 'custom emoji with image fallback',
+ '<gl-emoji data-fallback-src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" data-name="party-parrot" data-unicode-version="custom"></gl-emoji>',
+ '<gl-emoji data-fallback-src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" data-name="party-parrot" data-unicode-version="custom"><img class="emoji" title=":party-parrot:" alt=":party-parrot:" src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" width="20" height="20" align="absmiddle"></gl-emoji>',
+ '<gl-emoji data-fallback-src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" data-name="party-parrot" data-unicode-version="custom"><img class="emoji" title=":party-parrot:" alt=":party-parrot:" src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" width="20" height="20" align="absmiddle"></gl-emoji>',
+ ],
])('%s', (name, markup, withEmojiSupport, withoutEmojiSupport) => {
it(`renders correctly with emoji support`, async () => {
jest.spyOn(EmojiUnicodeSupport, 'default').mockReturnValue(true);
diff --git a/spec/frontend/blob/balsamiq/balsamiq_viewer_spec.js b/spec/frontend/blob/balsamiq/balsamiq_viewer_spec.js
deleted file mode 100644
index d7531d15b9a..00000000000
--- a/spec/frontend/blob/balsamiq/balsamiq_viewer_spec.js
+++ /dev/null
@@ -1,363 +0,0 @@
-import sqljs from 'sql.js';
-import ClassSpecHelper from 'helpers/class_spec_helper';
-import BalsamiqViewer from '~/blob/balsamiq/balsamiq_viewer';
-import axios from '~/lib/utils/axios_utils';
-
-jest.mock('sql.js');
-
-describe('BalsamiqViewer', () => {
- const mockArrayBuffer = new ArrayBuffer(10);
- let balsamiqViewer;
- let viewer;
-
- describe('class constructor', () => {
- beforeEach(() => {
- viewer = {};
-
- balsamiqViewer = new BalsamiqViewer(viewer);
- });
-
- it('should set .viewer', () => {
- expect(balsamiqViewer.viewer).toBe(viewer);
- });
- });
-
- describe('loadFile', () => {
- let bv;
- const endpoint = 'endpoint';
- const requestSuccess = Promise.resolve({
- data: mockArrayBuffer,
- status: 200,
- });
-
- beforeEach(() => {
- viewer = {};
- bv = new BalsamiqViewer(viewer);
- });
-
- it('should call `axios.get` on `endpoint` param with responseType set to `arraybuffer', () => {
- jest.spyOn(axios, 'get').mockReturnValue(requestSuccess);
- jest.spyOn(bv, 'renderFile').mockReturnValue();
-
- bv.loadFile(endpoint);
-
- expect(axios.get).toHaveBeenCalledWith(
- endpoint,
- expect.objectContaining({
- responseType: 'arraybuffer',
- }),
- );
- });
-
- it('should call `renderFile` on request success', (done) => {
- jest.spyOn(axios, 'get').mockReturnValue(requestSuccess);
- jest.spyOn(bv, 'renderFile').mockImplementation(() => {});
-
- bv.loadFile(endpoint)
- .then(() => {
- expect(bv.renderFile).toHaveBeenCalledWith(mockArrayBuffer);
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('should not call `renderFile` on request failure', (done) => {
- jest.spyOn(axios, 'get').mockReturnValue(Promise.reject());
- jest.spyOn(bv, 'renderFile').mockImplementation(() => {});
-
- bv.loadFile(endpoint)
- .then(() => {
- done.fail('Expected loadFile to throw error!');
- })
- .catch(() => {
- expect(bv.renderFile).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
- });
- });
-
- describe('renderFile', () => {
- let container;
- let previews;
-
- beforeEach(() => {
- viewer = {
- appendChild: jest.fn(),
- };
- previews = [document.createElement('ul'), document.createElement('ul')];
-
- balsamiqViewer = {
- initDatabase: jest.fn(),
- getPreviews: jest.fn(),
- renderPreview: jest.fn(),
- };
- balsamiqViewer.viewer = viewer;
-
- balsamiqViewer.getPreviews.mockReturnValue(previews);
- balsamiqViewer.renderPreview.mockImplementation((preview) => preview);
- viewer.appendChild.mockImplementation((containerElement) => {
- container = containerElement;
- });
-
- BalsamiqViewer.prototype.renderFile.call(balsamiqViewer, mockArrayBuffer);
- });
-
- it('should call .initDatabase', () => {
- expect(balsamiqViewer.initDatabase).toHaveBeenCalledWith(mockArrayBuffer);
- });
-
- it('should call .getPreviews', () => {
- expect(balsamiqViewer.getPreviews).toHaveBeenCalled();
- });
-
- it('should call .renderPreview for each preview', () => {
- const allArgs = balsamiqViewer.renderPreview.mock.calls;
-
- expect(allArgs.length).toBe(2);
-
- previews.forEach((preview, i) => {
- expect(allArgs[i][0]).toBe(preview);
- });
- });
-
- it('should set the container HTML', () => {
- expect(container.innerHTML).toBe('<ul></ul><ul></ul>');
- });
-
- it('should add inline preview classes', () => {
- expect(container.classList[0]).toBe('list-inline');
- expect(container.classList[1]).toBe('previews');
- });
-
- it('should call viewer.appendChild', () => {
- expect(viewer.appendChild).toHaveBeenCalledWith(container);
- });
- });
-
- describe('initDatabase', () => {
- let uint8Array;
- let data;
-
- beforeEach(() => {
- uint8Array = {};
- data = 'data';
- balsamiqViewer = {};
- window.Uint8Array = jest.fn();
- window.Uint8Array.mockReturnValue(uint8Array);
-
- BalsamiqViewer.prototype.initDatabase.call(balsamiqViewer, data);
- });
-
- it('should instantiate Uint8Array', () => {
- expect(window.Uint8Array).toHaveBeenCalledWith(data);
- });
-
- it('should call sqljs.Database', () => {
- expect(sqljs.Database).toHaveBeenCalledWith(uint8Array);
- });
-
- it('should set .database', () => {
- expect(balsamiqViewer.database).not.toBe(null);
- });
- });
-
- describe('getPreviews', () => {
- let database;
- let thumbnails;
- let getPreviews;
-
- beforeEach(() => {
- database = {
- exec: jest.fn(),
- };
- thumbnails = [{ values: [0, 1, 2] }];
-
- balsamiqViewer = {
- database,
- };
-
- jest
- .spyOn(BalsamiqViewer, 'parsePreview')
- .mockImplementation((preview) => preview.toString());
- database.exec.mockReturnValue(thumbnails);
-
- getPreviews = BalsamiqViewer.prototype.getPreviews.call(balsamiqViewer);
- });
-
- it('should call database.exec', () => {
- expect(database.exec).toHaveBeenCalledWith('SELECT * FROM thumbnails');
- });
-
- it('should call .parsePreview for each value', () => {
- const allArgs = BalsamiqViewer.parsePreview.mock.calls;
-
- expect(allArgs.length).toBe(3);
-
- thumbnails[0].values.forEach((value, i) => {
- expect(allArgs[i][0]).toBe(value);
- });
- });
-
- it('should return an array of parsed values', () => {
- expect(getPreviews).toEqual(['0', '1', '2']);
- });
- });
-
- describe('getResource', () => {
- let database;
- let resourceID;
- let resource;
- let getResource;
-
- beforeEach(() => {
- database = {
- exec: jest.fn(),
- };
- resourceID = 4;
- resource = ['resource'];
-
- balsamiqViewer = {
- database,
- };
-
- database.exec.mockReturnValue(resource);
-
- getResource = BalsamiqViewer.prototype.getResource.call(balsamiqViewer, resourceID);
- });
-
- it('should call database.exec', () => {
- expect(database.exec).toHaveBeenCalledWith(
- `SELECT * FROM resources WHERE id = '${resourceID}'`,
- );
- });
-
- it('should return the selected resource', () => {
- expect(getResource).toBe(resource[0]);
- });
- });
-
- describe('renderPreview', () => {
- let previewElement;
- let innerHTML;
- let preview;
- let renderPreview;
-
- beforeEach(() => {
- innerHTML = '<a>innerHTML</a>';
- previewElement = {
- outerHTML: '<p>outerHTML</p>',
- classList: {
- add: jest.fn(),
- },
- };
- preview = {};
-
- balsamiqViewer = {
- renderTemplate: jest.fn(),
- };
-
- jest.spyOn(document, 'createElement').mockReturnValue(previewElement);
- balsamiqViewer.renderTemplate.mockReturnValue(innerHTML);
-
- renderPreview = BalsamiqViewer.prototype.renderPreview.call(balsamiqViewer, preview);
- });
-
- it('should call classList.add', () => {
- expect(previewElement.classList.add).toHaveBeenCalledWith('preview');
- });
-
- it('should call .renderTemplate', () => {
- expect(balsamiqViewer.renderTemplate).toHaveBeenCalledWith(preview);
- });
-
- it('should set .innerHTML', () => {
- expect(previewElement.innerHTML).toBe(innerHTML);
- });
-
- it('should return element', () => {
- expect(renderPreview).toBe(previewElement);
- });
- });
-
- describe('renderTemplate', () => {
- let preview;
- let name;
- let resource;
- let template;
- let renderTemplate;
-
- beforeEach(() => {
- preview = { resourceID: 1, image: 'image' };
- name = 'name';
- resource = 'resource';
- template = `
- <div class="card">
- <div class="card-header">name</div>
- <div class="card-body">
- <img class="img-thumbnail" src="data:image/png;base64,image"/>
- </div>
- </div>
- `;
-
- balsamiqViewer = {
- getResource: jest.fn(),
- };
-
- jest.spyOn(BalsamiqViewer, 'parseTitle').mockReturnValue(name);
- balsamiqViewer.getResource.mockReturnValue(resource);
-
- renderTemplate = BalsamiqViewer.prototype.renderTemplate.call(balsamiqViewer, preview);
- });
-
- it('should call .getResource', () => {
- expect(balsamiqViewer.getResource).toHaveBeenCalledWith(preview.resourceID);
- });
-
- it('should call .parseTitle', () => {
- expect(BalsamiqViewer.parseTitle).toHaveBeenCalledWith(resource);
- });
-
- it('should return the template string', () => {
- expect(renderTemplate.replace(/\s/g, '')).toEqual(template.replace(/\s/g, ''));
- });
- });
-
- describe('parsePreview', () => {
- let preview;
- let parsePreview;
-
- beforeEach(() => {
- preview = ['{}', '{ "id": 1 }'];
-
- jest.spyOn(JSON, 'parse');
-
- parsePreview = BalsamiqViewer.parsePreview(preview);
- });
-
- ClassSpecHelper.itShouldBeAStaticMethod(BalsamiqViewer, 'parsePreview');
-
- it('should return the parsed JSON', () => {
- expect(parsePreview).toEqual(JSON.parse('{ "id": 1 }'));
- });
- });
-
- describe('parseTitle', () => {
- let title;
- let parseTitle;
-
- beforeEach(() => {
- title = { values: [['{}', '{}', '{"name":"name"}']] };
-
- jest.spyOn(JSON, 'parse');
-
- parseTitle = BalsamiqViewer.parseTitle(title);
- });
-
- ClassSpecHelper.itShouldBeAStaticMethod(BalsamiqViewer, 'parsePreview');
-
- it('should return the name value', () => {
- expect(parseTitle).toBe('name');
- });
- });
-});
diff --git a/spec/frontend/boards/boards_util_spec.js b/spec/frontend/boards/boards_util_spec.js
index d45b6e35a45..ab3cf072357 100644
--- a/spec/frontend/boards/boards_util_spec.js
+++ b/spec/frontend/boards/boards_util_spec.js
@@ -1,6 +1,12 @@
import { formatIssueInput, filterVariables } from '~/boards/boards_util';
describe('formatIssueInput', () => {
+ const issueInput = {
+ labelIds: ['gid://gitlab/GroupLabel/5'],
+ projectPath: 'gitlab-org/gitlab-test',
+ id: 'gid://gitlab/Issue/11',
+ };
+
it('correctly merges boardConfig into the issue', () => {
const boardConfig = {
labels: [
@@ -14,12 +20,6 @@ describe('formatIssueInput', () => {
weight: 1,
};
- const issueInput = {
- labelIds: ['gid://gitlab/GroupLabel/5'],
- projectPath: 'gitlab-org/gitlab-test',
- id: 'gid://gitlab/Issue/11',
- };
-
const result = formatIssueInput(issueInput, boardConfig);
expect(result).toEqual({
projectPath: 'gitlab-org/gitlab-test',
@@ -27,8 +27,26 @@ describe('formatIssueInput', () => {
labelIds: ['gid://gitlab/GroupLabel/5', 'gid://gitlab/GroupLabel/44'],
assigneeIds: ['gid://gitlab/User/55'],
milestoneId: 'gid://gitlab/Milestone/66',
+ weight: 1,
});
});
+
+ it('does not add weight to input if weight is NONE', () => {
+ const boardConfig = {
+ weight: -2, // NO_WEIGHT
+ };
+
+ const result = formatIssueInput(issueInput, boardConfig);
+ const expected = {
+ projectPath: 'gitlab-org/gitlab-test',
+ id: 'gid://gitlab/Issue/11',
+ labelIds: ['gid://gitlab/GroupLabel/5'],
+ assigneeIds: [],
+ milestoneId: undefined,
+ };
+
+ expect(result).toEqual(expected);
+ });
});
describe('filterVariables', () => {
diff --git a/spec/frontend/boards/components/board_filtered_search_spec.js b/spec/frontend/boards/components/board_filtered_search_spec.js
index 85ba703a6ee..731578e15a3 100644
--- a/spec/frontend/boards/components/board_filtered_search_spec.js
+++ b/spec/frontend/boards/components/board_filtered_search_spec.js
@@ -124,7 +124,7 @@ describe('BoardFilteredSearch', () => {
{ type: 'milestone', value: { data: 'New Milestone', operator: '=' } },
{ type: 'type', value: { data: 'INCIDENT', operator: '=' } },
{ type: 'weight', value: { data: '2', operator: '=' } },
- { type: 'iteration', value: { data: '3341', operator: '=' } },
+ { type: 'iteration', value: { data: 'Any&3', operator: '=' } },
{ type: 'release', value: { data: 'v1.0.0', operator: '=' } },
];
jest.spyOn(urlUtility, 'updateHistory');
@@ -134,7 +134,7 @@ describe('BoardFilteredSearch', () => {
title: '',
replace: true,
url:
- 'http://test.host/?author_username=root&label_name[]=label&label_name[]=label%262&assignee_username=root&milestone_title=New%20Milestone&iteration_id=3341&types=INCIDENT&weight=2&release_tag=v1.0.0',
+ 'http://test.host/?author_username=root&label_name[]=label&label_name[]=label%262&assignee_username=root&milestone_title=New%20Milestone&iteration_id=Any&iteration_cadence_id=3&types=INCIDENT&weight=2&release_tag=v1.0.0',
});
});
diff --git a/spec/frontend/boards/components/board_form_spec.js b/spec/frontend/boards/components/board_form_spec.js
index c976ba7525b..6a659623b53 100644
--- a/spec/frontend/boards/components/board_form_spec.js
+++ b/spec/frontend/boards/components/board_form_spec.js
@@ -62,7 +62,7 @@ describe('BoardForm', () => {
};
},
provide: {
- rootPath: 'root',
+ boardBaseUrl: 'root',
},
mocks: {
$apollo: {
diff --git a/spec/frontend/boards/components/board_top_bar_spec.js b/spec/frontend/boards/components/board_top_bar_spec.js
new file mode 100644
index 00000000000..997768a0cc7
--- /dev/null
+++ b/spec/frontend/boards/components/board_top_bar_spec.js
@@ -0,0 +1,88 @@
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import Vuex from 'vuex';
+
+import BoardTopBar from '~/boards/components/board_top_bar.vue';
+import BoardAddNewColumnTrigger from '~/boards/components/board_add_new_column_trigger.vue';
+import BoardsSelector from '~/boards/components/boards_selector.vue';
+import ConfigToggle from '~/boards/components/config_toggle.vue';
+import IssueBoardFilteredSearch from '~/boards/components/issue_board_filtered_search.vue';
+import NewBoardButton from '~/boards/components/new_board_button.vue';
+import ToggleFocus from '~/boards/components/toggle_focus.vue';
+
+describe('BoardTopBar', () => {
+ let wrapper;
+
+ Vue.use(Vuex);
+
+ const createStore = ({ mockGetters = {} } = {}) => {
+ return new Vuex.Store({
+ state: {},
+ getters: {
+ isEpicBoard: () => false,
+ ...mockGetters,
+ },
+ });
+ };
+
+ const createComponent = ({ provide = {}, mockGetters = {} } = {}) => {
+ const store = createStore({ mockGetters });
+ wrapper = shallowMount(BoardTopBar, {
+ store,
+ provide: {
+ swimlanesFeatureAvailable: false,
+ canAdminList: false,
+ isSignedIn: false,
+ fullPath: 'gitlab-org',
+ boardType: 'group',
+ releasesFetchPath: '/releases',
+ ...provide,
+ },
+ stubs: { IssueBoardFilteredSearch },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('base template', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders BoardsSelector component', () => {
+ expect(wrapper.findComponent(BoardsSelector).exists()).toBe(true);
+ });
+
+ it('renders IssueBoardFilteredSearch component', () => {
+ expect(wrapper.findComponent(IssueBoardFilteredSearch).exists()).toBe(true);
+ });
+
+ it('renders NewBoardButton component', () => {
+ expect(wrapper.findComponent(NewBoardButton).exists()).toBe(true);
+ });
+
+ it('renders ConfigToggle component', () => {
+ expect(wrapper.findComponent(ConfigToggle).exists()).toBe(true);
+ });
+
+ it('renders ToggleFocus component', () => {
+ expect(wrapper.findComponent(ToggleFocus).exists()).toBe(true);
+ });
+
+ it('does not render BoardAddNewColumnTrigger component', () => {
+ expect(wrapper.findComponent(BoardAddNewColumnTrigger).exists()).toBe(false);
+ });
+ });
+
+ describe('when user can admin list', () => {
+ beforeEach(() => {
+ createComponent({ provide: { canAdminList: true } });
+ });
+
+ it('renders BoardAddNewColumnTrigger component', () => {
+ expect(wrapper.findComponent(BoardAddNewColumnTrigger).exists()).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/boards/components/boards_selector_spec.js b/spec/frontend/boards/components/boards_selector_spec.js
index 0c044deb78c..f60d04af4fc 100644
--- a/spec/frontend/boards/components/boards_selector_spec.js
+++ b/spec/frontend/boards/components/boards_selector_spec.js
@@ -1,5 +1,4 @@
import { GlDropdown, GlLoadingIcon, GlDropdownSectionHeader } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import Vuex from 'vuex';
@@ -14,6 +13,7 @@ import groupRecentBoardsQuery from '~/boards/graphql/group_recent_boards.query.g
import projectRecentBoardsQuery from '~/boards/graphql/project_recent_boards.query.graphql';
import defaultStore from '~/boards/stores';
import createMockApollo from 'helpers/mock_apollo_helper';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import {
mockGroupBoardResponse,
mockProjectBoardResponse,
@@ -60,7 +60,7 @@ describe('BoardsSelector', () => {
searchBoxInput.trigger('input');
};
- const getDropdownItems = () => wrapper.findAll('.js-dropdown-item');
+ const getDropdownItems = () => wrapper.findAllByTestId('dropdown-item');
const getDropdownHeaders = () => wrapper.findAllComponents(GlDropdownSectionHeader);
const getLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findDropdown = () => wrapper.findComponent(GlDropdown);
@@ -100,11 +100,15 @@ describe('BoardsSelector', () => {
[groupRecentBoardsQuery, groupRecentBoardsQueryHandlerSuccess],
]);
- wrapper = mount(BoardsSelector, {
+ wrapper = mountExtended(BoardsSelector, {
store,
apolloProvider: fakeApollo,
propsData: {
throttleDuration,
+ },
+ attachTo: document.body,
+ provide: {
+ fullPath: '',
boardBaseUrl: `${TEST_HOST}/board/base/url`,
hasMissingBoards: false,
canAdminBoard: true,
@@ -112,10 +116,6 @@ describe('BoardsSelector', () => {
scopedIssueBoardFeatureEnabled: true,
weights: [],
},
- attachTo: document.body,
- provide: {
- fullPath: '',
- },
});
};
diff --git a/spec/frontend/boards/components/issuable_title_spec.js b/spec/frontend/boards/components/issuable_title_spec.js
deleted file mode 100644
index 4b7f491b998..00000000000
--- a/spec/frontend/boards/components/issuable_title_spec.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import IssuableTitle from '~/boards/components/issuable_title.vue';
-
-describe('IssuableTitle', () => {
- let wrapper;
- const defaultProps = {
- title: 'One',
- refPath: 'path',
- };
- const createComponent = () => {
- wrapper = shallowMount(IssuableTitle, {
- propsData: { ...defaultProps },
- });
- };
- const findIssueContent = () => wrapper.find('[data-testid="issue-title"]');
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- it('renders a title of an issue in the sidebar', () => {
- expect(findIssueContent().text()).toContain('One');
- });
-
- it('renders a referencePath of an issue in the sidebar', () => {
- expect(findIssueContent().text()).toContain('path');
- });
-});
diff --git a/spec/frontend/boards/components/issue_board_filtered_search_spec.js b/spec/frontend/boards/components/issue_board_filtered_search_spec.js
index 76e8b84d8ef..e4a6a2b8b76 100644
--- a/spec/frontend/boards/components/issue_board_filtered_search_spec.js
+++ b/spec/frontend/boards/components/issue_board_filtered_search_spec.js
@@ -14,10 +14,11 @@ describe('IssueBoardFilter', () => {
const createComponent = ({ isSignedIn = false } = {}) => {
wrapper = shallowMount(IssueBoardFilteredSpec, {
- propsData: { fullPath: 'gitlab-org', boardType: 'group' },
provide: {
isSignedIn,
releasesFetchPath: '/releases',
+ fullPath: 'gitlab-org',
+ boardType: 'group',
},
});
};
diff --git a/spec/frontend/boards/components/issue_time_estimate_spec.js b/spec/frontend/boards/components/issue_time_estimate_spec.js
index 635964b6b4a..948a7a20f7f 100644
--- a/spec/frontend/boards/components/issue_time_estimate_spec.js
+++ b/spec/frontend/boards/components/issue_time_estimate_spec.js
@@ -5,6 +5,8 @@ import IssueTimeEstimate from '~/boards/components/issue_time_estimate.vue';
describe('Issue Time Estimate component', () => {
let wrapper;
+ const findIssueTimeEstimate = () => wrapper.find('[data-testid="issue-time-estimate"]');
+
afterEach(() => {
wrapper.destroy();
});
@@ -26,7 +28,7 @@ describe('Issue Time Estimate component', () => {
});
it('renders expanded time estimate in tooltip', () => {
- expect(wrapper.find('.js-issue-time-estimate').text()).toContain('2 weeks 3 days 1 minute');
+ expect(findIssueTimeEstimate().text()).toContain('2 weeks 3 days 1 minute');
});
it('prevents tooltip xss', async () => {
@@ -42,7 +44,7 @@ describe('Issue Time Estimate component', () => {
expect(alertSpy).not.toHaveBeenCalled();
expect(wrapper.find('time').text().trim()).toEqual('0m');
- expect(wrapper.find('.js-issue-time-estimate').text()).toContain('0m');
+ expect(findIssueTimeEstimate().text()).toContain('0m');
});
});
@@ -63,7 +65,7 @@ describe('Issue Time Estimate component', () => {
});
it('renders expanded time estimate in tooltip', () => {
- expect(wrapper.find('.js-issue-time-estimate').text()).toContain('104 hours 1 minute');
+ expect(findIssueTimeEstimate().text()).toContain('104 hours 1 minute');
});
});
});
diff --git a/spec/frontend/boards/components/item_count_spec.js b/spec/frontend/boards/components/item_count_spec.js
index 45980c36f1c..06cd3910fc0 100644
--- a/spec/frontend/boards/components/item_count_spec.js
+++ b/spec/frontend/boards/components/item_count_spec.js
@@ -29,7 +29,7 @@ describe('IssueCount', () => {
});
it('does not contains maxIssueCount in the template', () => {
- expect(vm.find('.js-max-issue-size').exists()).toBe(false);
+ expect(vm.find('.max-issue-size').exists()).toBe(false);
});
});
@@ -50,7 +50,7 @@ describe('IssueCount', () => {
});
it('contains maxIssueCount in the template', () => {
- expect(vm.find('.js-max-issue-size').text()).toEqual(String(maxIssueCount));
+ expect(vm.find('.max-issue-size').text()).toEqual(String(maxIssueCount));
});
it('does not have text-danger class when issueSize is less than maxIssueCount', () => {
@@ -75,7 +75,7 @@ describe('IssueCount', () => {
});
it('contains maxIssueCount in the template', () => {
- expect(vm.find('.js-max-issue-size').text()).toEqual(String(maxIssueCount));
+ expect(vm.find('.max-issue-size').text()).toEqual(String(maxIssueCount));
});
it('has text-danger class', () => {
diff --git a/spec/frontend/boards/stores/actions_spec.js b/spec/frontend/boards/stores/actions_spec.js
index ad661a31556..eacf9db191e 100644
--- a/spec/frontend/boards/stores/actions_spec.js
+++ b/spec/frontend/boards/stores/actions_spec.js
@@ -166,31 +166,29 @@ describe('setFilters', () => {
});
describe('performSearch', () => {
- it('should dispatch setFilters, fetchLists and resetIssues action', (done) => {
- testAction(
+ it('should dispatch setFilters, fetchLists and resetIssues action', () => {
+ return testAction(
actions.performSearch,
{},
{},
[],
[{ type: 'setFilters', payload: {} }, { type: 'fetchLists' }, { type: 'resetIssues' }],
- done,
);
});
});
describe('setActiveId', () => {
- it('should commit mutation SET_ACTIVE_ID', (done) => {
+ it('should commit mutation SET_ACTIVE_ID', () => {
const state = {
activeId: inactiveId,
};
- testAction(
+ return testAction(
actions.setActiveId,
{ id: 1, sidebarType: 'something' },
state,
[{ type: types.SET_ACTIVE_ID, payload: { id: 1, sidebarType: 'something' } }],
[],
- done,
);
});
});
@@ -219,10 +217,10 @@ describe('fetchLists', () => {
const formattedLists = formatBoardLists(queryResponse.data.group.board.lists);
- it('should commit mutations RECEIVE_BOARD_LISTS_SUCCESS on success', (done) => {
+ it('should commit mutations RECEIVE_BOARD_LISTS_SUCCESS on success', () => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
- testAction(
+ return testAction(
actions.fetchLists,
{},
state,
@@ -233,14 +231,13 @@ describe('fetchLists', () => {
},
],
[],
- done,
);
});
- it('should commit mutations RECEIVE_BOARD_LISTS_FAILURE on failure', (done) => {
+ it('should commit mutations RECEIVE_BOARD_LISTS_FAILURE on failure', () => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(Promise.reject());
- testAction(
+ return testAction(
actions.fetchLists,
{},
state,
@@ -250,11 +247,10 @@ describe('fetchLists', () => {
},
],
[],
- done,
);
});
- it('dispatch createList action when backlog list does not exist and is not hidden', (done) => {
+ it('dispatch createList action when backlog list does not exist and is not hidden', () => {
queryResponse = {
data: {
group: {
@@ -269,7 +265,7 @@ describe('fetchLists', () => {
};
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
- testAction(
+ return testAction(
actions.fetchLists,
{},
state,
@@ -280,7 +276,6 @@ describe('fetchLists', () => {
},
],
[{ type: 'createList', payload: { backlog: true } }],
- done,
);
});
@@ -951,10 +946,10 @@ describe('fetchItemsForList', () => {
});
});
- it('should commit mutations REQUEST_ITEMS_FOR_LIST and RECEIVE_ITEMS_FOR_LIST_SUCCESS on success', (done) => {
+ it('should commit mutations REQUEST_ITEMS_FOR_LIST and RECEIVE_ITEMS_FOR_LIST_SUCCESS on success', () => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
- testAction(
+ return testAction(
actions.fetchItemsForList,
{ listId },
state,
@@ -973,14 +968,13 @@ describe('fetchItemsForList', () => {
},
],
[],
- done,
);
});
- it('should commit mutations REQUEST_ITEMS_FOR_LIST and RECEIVE_ITEMS_FOR_LIST_FAILURE on failure', (done) => {
+ it('should commit mutations REQUEST_ITEMS_FOR_LIST and RECEIVE_ITEMS_FOR_LIST_FAILURE on failure', () => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(Promise.reject());
- testAction(
+ return testAction(
actions.fetchItemsForList,
{ listId },
state,
@@ -996,7 +990,6 @@ describe('fetchItemsForList', () => {
{ type: types.RECEIVE_ITEMS_FOR_LIST_FAILURE, payload: listId },
],
[],
- done,
);
});
});
@@ -1398,8 +1391,8 @@ describe('setAssignees', () => {
const node = { username: 'name' };
describe('when succeeds', () => {
- it('calls the correct mutation with the correct values', (done) => {
- testAction(
+ it('calls the correct mutation with the correct values', () => {
+ return testAction(
actions.setAssignees,
{ assignees: [node], iid: '1' },
{ commit: () => {} },
@@ -1410,7 +1403,6 @@ describe('setAssignees', () => {
},
],
[],
- done,
);
});
});
@@ -1728,7 +1720,7 @@ describe('setActiveItemSubscribed', () => {
projectPath: 'gitlab-org/gitlab-test',
};
- it('should commit subscribed status', (done) => {
+ it('should commit subscribed status', () => {
jest.spyOn(gqlClient, 'mutate').mockResolvedValue({
data: {
updateIssuableSubscription: {
@@ -1746,7 +1738,7 @@ describe('setActiveItemSubscribed', () => {
value: subscribedState,
};
- testAction(
+ return testAction(
actions.setActiveItemSubscribed,
input,
{ ...state, ...getters },
@@ -1757,7 +1749,6 @@ describe('setActiveItemSubscribed', () => {
},
],
[],
- done,
);
});
@@ -1783,7 +1774,7 @@ describe('setActiveItemTitle', () => {
projectPath: 'h/b',
};
- it('should commit title after setting the issue', (done) => {
+ it('should commit title after setting the issue', () => {
jest.spyOn(gqlClient, 'mutate').mockResolvedValue({
data: {
updateIssuableTitle: {
@@ -1801,7 +1792,7 @@ describe('setActiveItemTitle', () => {
value: testTitle,
};
- testAction(
+ return testAction(
actions.setActiveItemTitle,
input,
{ ...state, ...getters },
@@ -1812,7 +1803,6 @@ describe('setActiveItemTitle', () => {
},
],
[],
- done,
);
});
@@ -1829,14 +1819,14 @@ describe('setActiveItemConfidential', () => {
const state = { boardItems: { [mockIssue.id]: mockIssue } };
const getters = { activeBoardItem: mockIssue };
- it('set confidential value on board item', (done) => {
+ it('set confidential value on board item', () => {
const payload = {
itemId: getters.activeBoardItem.id,
prop: 'confidential',
value: true,
};
- testAction(
+ return testAction(
actions.setActiveItemConfidential,
true,
{ ...state, ...getters },
@@ -1847,7 +1837,6 @@ describe('setActiveItemConfidential', () => {
},
],
[],
- done,
);
});
});
@@ -1876,10 +1865,10 @@ describe('fetchGroupProjects', () => {
},
};
- it('should commit mutations REQUEST_GROUP_PROJECTS and RECEIVE_GROUP_PROJECTS_SUCCESS on success', (done) => {
+ it('should commit mutations REQUEST_GROUP_PROJECTS and RECEIVE_GROUP_PROJECTS_SUCCESS on success', () => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
- testAction(
+ return testAction(
actions.fetchGroupProjects,
{},
state,
@@ -1894,14 +1883,13 @@ describe('fetchGroupProjects', () => {
},
],
[],
- done,
);
});
- it('should commit mutations REQUEST_GROUP_PROJECTS and RECEIVE_GROUP_PROJECTS_FAILURE on failure', (done) => {
+ it('should commit mutations REQUEST_GROUP_PROJECTS and RECEIVE_GROUP_PROJECTS_FAILURE on failure', () => {
jest.spyOn(gqlClient, 'query').mockRejectedValue();
- testAction(
+ return testAction(
actions.fetchGroupProjects,
{},
state,
@@ -1915,16 +1903,15 @@ describe('fetchGroupProjects', () => {
},
],
[],
- done,
);
});
});
describe('setSelectedProject', () => {
- it('should commit mutation SET_SELECTED_PROJECT', (done) => {
+ it('should commit mutation SET_SELECTED_PROJECT', () => {
const project = mockGroupProjects[0];
- testAction(
+ return testAction(
actions.setSelectedProject,
project,
{},
@@ -1935,7 +1922,6 @@ describe('setSelectedProject', () => {
},
],
[],
- done,
);
});
});
diff --git a/spec/frontend/captcha/apollo_captcha_link_spec.js b/spec/frontend/captcha/apollo_captcha_link_spec.js
index eab52344d1f..cd32e63d00c 100644
--- a/spec/frontend/captcha/apollo_captcha_link_spec.js
+++ b/spec/frontend/captcha/apollo_captcha_link_spec.js
@@ -95,70 +95,82 @@ describe('apolloCaptchaLink', () => {
return { operationName: 'operation', variables: {}, setContext: mockContext };
}
- it('successful responses are passed through', (done) => {
+ it('successful responses are passed through', () => {
setupLink(SUCCESS_RESPONSE);
- link.request(mockOperation()).subscribe((result) => {
- expect(result).toEqual(SUCCESS_RESPONSE);
- expect(mockLinkImplementation).toHaveBeenCalledTimes(1);
- expect(waitForCaptchaToBeSolved).not.toHaveBeenCalled();
- done();
+
+ return new Promise((resolve) => {
+ link.request(mockOperation()).subscribe((result) => {
+ expect(result).toEqual(SUCCESS_RESPONSE);
+ expect(mockLinkImplementation).toHaveBeenCalledTimes(1);
+ expect(waitForCaptchaToBeSolved).not.toHaveBeenCalled();
+ resolve();
+ });
});
});
- it('non-spam related errors are passed through', (done) => {
+ it('non-spam related errors are passed through', () => {
setupLink(NON_CAPTCHA_ERROR_RESPONSE);
- link.request(mockOperation()).subscribe((result) => {
- expect(result).toEqual(NON_CAPTCHA_ERROR_RESPONSE);
- expect(mockLinkImplementation).toHaveBeenCalledTimes(1);
- expect(mockContext).not.toHaveBeenCalled();
- expect(waitForCaptchaToBeSolved).not.toHaveBeenCalled();
- done();
+
+ return new Promise((resolve) => {
+ link.request(mockOperation()).subscribe((result) => {
+ expect(result).toEqual(NON_CAPTCHA_ERROR_RESPONSE);
+ expect(mockLinkImplementation).toHaveBeenCalledTimes(1);
+ expect(mockContext).not.toHaveBeenCalled();
+ expect(waitForCaptchaToBeSolved).not.toHaveBeenCalled();
+ resolve();
+ });
});
});
- it('unresolvable spam errors are passed through', (done) => {
+ it('unresolvable spam errors are passed through', () => {
setupLink(SPAM_ERROR_RESPONSE);
- link.request(mockOperation()).subscribe((result) => {
- expect(result).toEqual(SPAM_ERROR_RESPONSE);
- expect(mockLinkImplementation).toHaveBeenCalledTimes(1);
- expect(mockContext).not.toHaveBeenCalled();
- expect(waitForCaptchaToBeSolved).not.toHaveBeenCalled();
- done();
+ return new Promise((resolve) => {
+ link.request(mockOperation()).subscribe((result) => {
+ expect(result).toEqual(SPAM_ERROR_RESPONSE);
+ expect(mockLinkImplementation).toHaveBeenCalledTimes(1);
+ expect(mockContext).not.toHaveBeenCalled();
+ expect(waitForCaptchaToBeSolved).not.toHaveBeenCalled();
+ resolve();
+ });
});
});
describe('resolvable spam errors', () => {
- it('re-submits request with spam headers if the captcha modal was solved correctly', (done) => {
+ it('re-submits request with spam headers if the captcha modal was solved correctly', () => {
waitForCaptchaToBeSolved.mockResolvedValue(CAPTCHA_RESPONSE);
setupLink(CAPTCHA_ERROR_RESPONSE, SUCCESS_RESPONSE);
- link.request(mockOperation()).subscribe((result) => {
- expect(result).toEqual(SUCCESS_RESPONSE);
- expect(waitForCaptchaToBeSolved).toHaveBeenCalledWith(CAPTCHA_SITE_KEY);
- expect(mockContext).toHaveBeenCalledWith({
- headers: {
- 'X-GitLab-Captcha-Response': CAPTCHA_RESPONSE,
- 'X-GitLab-Spam-Log-Id': SPAM_LOG_ID,
- },
+ return new Promise((resolve) => {
+ link.request(mockOperation()).subscribe((result) => {
+ expect(result).toEqual(SUCCESS_RESPONSE);
+ expect(waitForCaptchaToBeSolved).toHaveBeenCalledWith(CAPTCHA_SITE_KEY);
+ expect(mockContext).toHaveBeenCalledWith({
+ headers: {
+ 'X-GitLab-Captcha-Response': CAPTCHA_RESPONSE,
+ 'X-GitLab-Spam-Log-Id': SPAM_LOG_ID,
+ },
+ });
+ expect(mockLinkImplementation).toHaveBeenCalledTimes(2);
+ resolve();
});
- expect(mockLinkImplementation).toHaveBeenCalledTimes(2);
- done();
});
});
- it('throws error if the captcha modal was not solved correctly', (done) => {
+ it('throws error if the captcha modal was not solved correctly', () => {
const error = new UnsolvedCaptchaError();
waitForCaptchaToBeSolved.mockRejectedValue(error);
setupLink(CAPTCHA_ERROR_RESPONSE, SUCCESS_RESPONSE);
- link.request(mockOperation()).subscribe({
- next: done.catch,
- error: (result) => {
- expect(result).toEqual(error);
- expect(waitForCaptchaToBeSolved).toHaveBeenCalledWith(CAPTCHA_SITE_KEY);
- expect(mockContext).not.toHaveBeenCalled();
- expect(mockLinkImplementation).toHaveBeenCalledTimes(1);
- done();
- },
+ return new Promise((resolve, reject) => {
+ link.request(mockOperation()).subscribe({
+ next: reject,
+ error: (result) => {
+ expect(result).toEqual(error);
+ expect(waitForCaptchaToBeSolved).toHaveBeenCalledWith(CAPTCHA_SITE_KEY);
+ expect(mockContext).not.toHaveBeenCalled();
+ expect(mockLinkImplementation).toHaveBeenCalledTimes(1);
+ resolve();
+ },
+ });
});
});
});
diff --git a/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js b/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js
index 085ab1c0c30..2fedbbecd64 100644
--- a/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js
+++ b/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js
@@ -36,7 +36,7 @@ describe('Ci variable modal', () => {
const findAddorUpdateButton = () =>
findModal()
.findAll(GlButton)
- .wrappers.find((button) => button.props('variant') === 'success');
+ .wrappers.find((button) => button.props('variant') === 'confirm');
const deleteVariableButton = () =>
findModal()
.findAll(GlButton)
diff --git a/spec/frontend/ci_variable_list/store/actions_spec.js b/spec/frontend/ci_variable_list/store/actions_spec.js
index 426e6cae8fb..eb31fcd3ef4 100644
--- a/spec/frontend/ci_variable_list/store/actions_spec.js
+++ b/spec/frontend/ci_variable_list/store/actions_spec.js
@@ -86,10 +86,10 @@ describe('CI variable list store actions', () => {
});
describe('deleteVariable', () => {
- it('dispatch correct actions on successful deleted variable', (done) => {
+ it('dispatch correct actions on successful deleted variable', () => {
mock.onPatch(state.endpoint).reply(200);
- testAction(
+ return testAction(
actions.deleteVariable,
{},
state,
@@ -99,16 +99,13 @@ describe('CI variable list store actions', () => {
{ type: 'receiveDeleteVariableSuccess' },
{ type: 'fetchVariables' },
],
- () => {
- done();
- },
);
});
- it('should show flash error and set error in state on delete failure', (done) => {
+ it('should show flash error and set error in state on delete failure', async () => {
mock.onPatch(state.endpoint).reply(500, '');
- testAction(
+ await testAction(
actions.deleteVariable,
{},
state,
@@ -120,19 +117,16 @@ describe('CI variable list store actions', () => {
payload: payloadError,
},
],
- () => {
- expect(createFlash).toHaveBeenCalled();
- done();
- },
);
+ expect(createFlash).toHaveBeenCalled();
});
});
describe('updateVariable', () => {
- it('dispatch correct actions on successful updated variable', (done) => {
+ it('dispatch correct actions on successful updated variable', () => {
mock.onPatch(state.endpoint).reply(200);
- testAction(
+ return testAction(
actions.updateVariable,
{},
state,
@@ -142,16 +136,13 @@ describe('CI variable list store actions', () => {
{ type: 'receiveUpdateVariableSuccess' },
{ type: 'fetchVariables' },
],
- () => {
- done();
- },
);
});
- it('should show flash error and set error in state on update failure', (done) => {
+ it('should show flash error and set error in state on update failure', async () => {
mock.onPatch(state.endpoint).reply(500, '');
- testAction(
+ await testAction(
actions.updateVariable,
mockVariable,
state,
@@ -163,19 +154,16 @@ describe('CI variable list store actions', () => {
payload: payloadError,
},
],
- () => {
- expect(createFlash).toHaveBeenCalled();
- done();
- },
);
+ expect(createFlash).toHaveBeenCalled();
});
});
describe('addVariable', () => {
- it('dispatch correct actions on successful added variable', (done) => {
+ it('dispatch correct actions on successful added variable', () => {
mock.onPatch(state.endpoint).reply(200);
- testAction(
+ return testAction(
actions.addVariable,
{},
state,
@@ -185,16 +173,13 @@ describe('CI variable list store actions', () => {
{ type: 'receiveAddVariableSuccess' },
{ type: 'fetchVariables' },
],
- () => {
- done();
- },
);
});
- it('should show flash error and set error in state on add failure', (done) => {
+ it('should show flash error and set error in state on add failure', async () => {
mock.onPatch(state.endpoint).reply(500, '');
- testAction(
+ await testAction(
actions.addVariable,
{},
state,
@@ -206,19 +191,16 @@ describe('CI variable list store actions', () => {
payload: payloadError,
},
],
- () => {
- expect(createFlash).toHaveBeenCalled();
- done();
- },
);
+ expect(createFlash).toHaveBeenCalled();
});
});
describe('fetchVariables', () => {
- it('dispatch correct actions on fetchVariables', (done) => {
+ it('dispatch correct actions on fetchVariables', () => {
mock.onGet(state.endpoint).reply(200, { variables: mockData.mockVariables });
- testAction(
+ return testAction(
actions.fetchVariables,
{},
state,
@@ -230,29 +212,24 @@ describe('CI variable list store actions', () => {
payload: prepareDataForDisplay(mockData.mockVariables),
},
],
- () => {
- done();
- },
);
});
- it('should show flash error and set error in state on fetch variables failure', (done) => {
+ it('should show flash error and set error in state on fetch variables failure', async () => {
mock.onGet(state.endpoint).reply(500);
- testAction(actions.fetchVariables, {}, state, [], [{ type: 'requestVariables' }], () => {
- expect(createFlash).toHaveBeenCalledWith({
- message: 'There was an error fetching the variables.',
- });
- done();
+ await testAction(actions.fetchVariables, {}, state, [], [{ type: 'requestVariables' }]);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'There was an error fetching the variables.',
});
});
});
describe('fetchEnvironments', () => {
- it('dispatch correct actions on fetchEnvironments', (done) => {
+ it('dispatch correct actions on fetchEnvironments', () => {
Api.environments = jest.fn().mockResolvedValue({ data: mockData.mockEnvironments });
- testAction(
+ return testAction(
actions.fetchEnvironments,
{},
state,
@@ -264,28 +241,17 @@ describe('CI variable list store actions', () => {
payload: prepareEnvironments(mockData.mockEnvironments),
},
],
- () => {
- done();
- },
);
});
- it('should show flash error and set error in state on fetch environments failure', (done) => {
+ it('should show flash error and set error in state on fetch environments failure', async () => {
Api.environments = jest.fn().mockRejectedValue();
- testAction(
- actions.fetchEnvironments,
- {},
- state,
- [],
- [{ type: 'requestEnvironments' }],
- () => {
- expect(createFlash).toHaveBeenCalledWith({
- message: 'There was an error fetching the environments information.',
- });
- done();
- },
- );
+ await testAction(actions.fetchEnvironments, {}, state, [], [{ type: 'requestEnvironments' }]);
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'There was an error fetching the environments information.',
+ });
});
});
diff --git a/spec/frontend/clusters_list/components/agent_empty_state_spec.js b/spec/frontend/clusters_list/components/agent_empty_state_spec.js
index ed2a0d0b97b..22775aa6603 100644
--- a/spec/frontend/clusters_list/components/agent_empty_state_spec.js
+++ b/spec/frontend/clusters_list/components/agent_empty_state_spec.js
@@ -1,8 +1,6 @@
-import { GlEmptyState, GlSprintf, GlLink, GlButton } from '@gitlab/ui';
+import { GlEmptyState, GlSprintf, GlLink } from '@gitlab/ui';
import AgentEmptyState from '~/clusters_list/components/agent_empty_state.vue';
-import { INSTALL_AGENT_MODAL_ID } from '~/clusters_list/constants';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { helpPagePath } from '~/helpers/help_page_helper';
const emptyStateImage = '/path/to/image';
@@ -15,16 +13,12 @@ describe('AgentEmptyStateComponent', () => {
};
const findInstallDocsLink = () => wrapper.findComponent(GlLink);
- const findIntegrationButton = () => wrapper.findComponent(GlButton);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
beforeEach(() => {
wrapper = shallowMountExtended(AgentEmptyState, {
provide: provideData,
- directives: {
- GlModalDirective: createMockDirective(),
- },
- stubs: { GlEmptyState, GlSprintf },
+ stubs: { GlSprintf },
});
});
@@ -38,17 +32,7 @@ describe('AgentEmptyStateComponent', () => {
expect(findEmptyState().exists()).toBe(true);
});
- it('renders button for the agent registration', () => {
- expect(findIntegrationButton().exists()).toBe(true);
- });
-
it('renders correct href attributes for the docs link', () => {
expect(findInstallDocsLink().attributes('href')).toBe(installDocsUrl);
});
-
- it('renders correct modal id for the agent registration modal', () => {
- const binding = getBinding(findIntegrationButton().element, 'gl-modal-directive');
-
- expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
- });
});
diff --git a/spec/frontend/clusters_list/components/agent_table_spec.js b/spec/frontend/clusters_list/components/agent_table_spec.js
index db723622a51..a466a35428a 100644
--- a/spec/frontend/clusters_list/components/agent_table_spec.js
+++ b/spec/frontend/clusters_list/components/agent_table_spec.js
@@ -9,7 +9,7 @@ import timeagoMixin from '~/vue_shared/mixins/timeago';
import { clusterAgents, connectedTimeNow, connectedTimeInactive } from './mock_data';
const defaultConfigHelpUrl =
- '/help/user/clusters/agent/install/index#create-an-agent-without-configuration-file';
+ '/help/user/clusters/agent/install/index#create-an-agent-configuration-file';
const provideData = {
gitlabVersion: '14.8',
diff --git a/spec/frontend/clusters_list/components/agent_token_spec.js b/spec/frontend/clusters_list/components/agent_token_spec.js
index a80c8ffaad4..7f6ec2eb3a2 100644
--- a/spec/frontend/clusters_list/components/agent_token_spec.js
+++ b/spec/frontend/clusters_list/components/agent_token_spec.js
@@ -53,7 +53,7 @@ describe('InstallAgentModal', () => {
});
it('shows agent token as an input value', () => {
- expect(findInput().props('value')).toBe('agent-token');
+ expect(findInput().props('value')).toBe(agentToken);
});
it('renders a copy button', () => {
@@ -65,12 +65,12 @@ describe('InstallAgentModal', () => {
});
it('shows warning alert', () => {
- expect(findAlert().props('title')).toBe(I18N_AGENT_TOKEN.tokenSingleUseWarningTitle);
+ expect(findAlert().text()).toBe(I18N_AGENT_TOKEN.tokenSingleUseWarningTitle);
});
it('shows code block with agent installation command', () => {
- expect(findCodeBlock().props('code')).toContain('--agent-token=agent-token');
- expect(findCodeBlock().props('code')).toContain('--kas-address=kas.example.com');
+ expect(findCodeBlock().props('code')).toContain(`--set config.token=${agentToken}`);
+ expect(findCodeBlock().props('code')).toContain(`--set config.kasAddress=${kasAddress}`);
});
});
});
diff --git a/spec/frontend/clusters_list/components/agents_spec.js b/spec/frontend/clusters_list/components/agents_spec.js
index 3cfa4b92bc0..92cfff7d490 100644
--- a/spec/frontend/clusters_list/components/agents_spec.js
+++ b/spec/frontend/clusters_list/components/agents_spec.js
@@ -308,7 +308,7 @@ describe('Agents', () => {
});
it('displays an alert message', () => {
- expect(findAlert().text()).toBe('An error occurred while loading your Agents');
+ expect(findAlert().text()).toBe('An error occurred while loading your agents');
});
});
diff --git a/spec/frontend/clusters_list/components/available_agents_dropwdown_spec.js b/spec/frontend/clusters_list/components/available_agents_dropwdown_spec.js
index eca2b1f5cb1..197735d3c77 100644
--- a/spec/frontend/clusters_list/components/available_agents_dropwdown_spec.js
+++ b/spec/frontend/clusters_list/components/available_agents_dropwdown_spec.js
@@ -1,5 +1,6 @@
import { GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { ENTER_KEY } from '~/lib/utils/keys';
import AvailableAgentsDropdown from '~/clusters_list/components/available_agents_dropdown.vue';
import { I18N_AVAILABLE_AGENTS_DROPDOWN } from '~/clusters_list/constants';
@@ -18,6 +19,7 @@ describe('AvailableAgentsDropdown', () => {
propsData,
stubs: { GlDropdown },
});
+ wrapper.vm.$refs.dropdown.hide = jest.fn();
};
afterEach(() => {
@@ -96,6 +98,25 @@ describe('AvailableAgentsDropdown', () => {
expect(findDropdown().props('text')).toBe('new-agent');
});
});
+
+ describe('click enter to register new agent without configuration', () => {
+ beforeEach(async () => {
+ await findSearchInput().vm.$emit('input', 'new-agent');
+ await findSearchInput().vm.$emit('keydown', new KeyboardEvent({ key: ENTER_KEY }));
+ });
+
+ it('emits agentSelected with the name of the clicked agent', () => {
+ expect(wrapper.emitted('agentSelected')).toEqual([['new-agent']]);
+ });
+
+ it('marks the clicked item as selected', () => {
+ expect(findDropdown().props('text')).toBe('new-agent');
+ });
+
+ it('closes the dropdown', () => {
+ expect(wrapper.vm.$refs.dropdown.hide).toHaveBeenCalledTimes(1);
+ });
+ });
});
describe('registration in progress', () => {
diff --git a/spec/frontend/clusters_list/components/clusters_actions_spec.js b/spec/frontend/clusters_list/components/clusters_actions_spec.js
index 312df12ab5f..21dcc66c639 100644
--- a/spec/frontend/clusters_list/components/clusters_actions_spec.js
+++ b/spec/frontend/clusters_list/components/clusters_actions_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlDropdownItem, GlButton } from '@gitlab/ui';
+import { GlDropdown, GlDropdownItem, GlTooltip } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ClustersActions from '~/clusters_list/components/clusters_actions.vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
@@ -7,12 +7,14 @@ import { INSTALL_AGENT_MODAL_ID, CLUSTERS_ACTIONS } from '~/clusters_list/consta
describe('ClustersActionsComponent', () => {
let wrapper;
- const newClusterPath = 'path/to/create/cluster';
+ const newClusterPath = 'path/to/add/cluster';
const addClusterPath = 'path/to/connect/existing/cluster';
+ const newClusterDocsPath = 'path/to/create/new/cluster';
const defaultProvide = {
newClusterPath,
addClusterPath,
+ newClusterDocsPath,
canAddCluster: true,
displayClusterAgents: true,
certificateBasedClustersEnabled: true,
@@ -20,12 +22,13 @@ describe('ClustersActionsComponent', () => {
const findDropdown = () => wrapper.findComponent(GlDropdown);
const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findTooltip = () => wrapper.findComponent(GlTooltip);
const findDropdownItemIds = () =>
findDropdownItems().wrappers.map((x) => x.attributes('data-testid'));
+ const findDropdownItemTexts = () => findDropdownItems().wrappers.map((x) => x.text());
const findNewClusterLink = () => wrapper.findByTestId('new-cluster-link');
+ const findNewClusterDocsLink = () => wrapper.findByTestId('create-cluster-link');
const findConnectClusterLink = () => wrapper.findByTestId('connect-cluster-link');
- const findConnectNewAgentLink = () => wrapper.findByTestId('connect-new-agent-link');
- const findConnectWithAgentButton = () => wrapper.findComponent(GlButton);
const createWrapper = (provideData = {}) => {
wrapper = shallowMountExtended(ClustersActions, {
@@ -35,7 +38,6 @@ describe('ClustersActionsComponent', () => {
},
directives: {
GlModalDirective: createMockDirective(),
- GlTooltip: createMockDirective(),
},
});
};
@@ -49,12 +51,15 @@ describe('ClustersActionsComponent', () => {
});
describe('when the certificate based clusters are enabled', () => {
it('renders actions menu', () => {
- expect(findDropdown().props('text')).toBe(CLUSTERS_ACTIONS.actionsButton);
+ expect(findDropdown().exists()).toBe(true);
});
- it('renders correct href attributes for the links', () => {
- expect(findNewClusterLink().attributes('href')).toBe(newClusterPath);
- expect(findConnectClusterLink().attributes('href')).toBe(addClusterPath);
+ it('shows split button in dropdown', () => {
+ expect(findDropdown().props('split')).toBe(true);
+ });
+
+ it("doesn't show the tooltip", () => {
+ expect(findTooltip().exists()).toBe(false);
});
describe('when user cannot add clusters', () => {
@@ -67,8 +72,7 @@ describe('ClustersActionsComponent', () => {
});
it('shows tooltip explaining why dropdown is disabled', () => {
- const tooltip = getBinding(findDropdown().element, 'gl-tooltip');
- expect(tooltip.value).toBe(CLUSTERS_ACTIONS.dropdownDisabledHint);
+ expect(findTooltip().attributes('title')).toBe(CLUSTERS_ACTIONS.dropdownDisabledHint);
});
it('does not bind split dropdown button', () => {
@@ -79,33 +83,36 @@ describe('ClustersActionsComponent', () => {
});
describe('when on project level', () => {
- it('renders a dropdown with 3 actions items', () => {
- expect(findDropdownItemIds()).toEqual([
- 'connect-new-agent-link',
- 'new-cluster-link',
- 'connect-cluster-link',
- ]);
+ it(`displays default action as ${CLUSTERS_ACTIONS.connectWithAgent}`, () => {
+ expect(findDropdown().props('text')).toBe(CLUSTERS_ACTIONS.connectWithAgent);
});
- it('renders correct modal id for the agent link', () => {
- const binding = getBinding(findConnectNewAgentLink().element, 'gl-modal-directive');
+ it('renders correct modal id for the default action', () => {
+ const binding = getBinding(findDropdown().element, 'gl-modal-directive');
expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
});
- it('shows tooltip', () => {
- const tooltip = getBinding(findDropdown().element, 'gl-tooltip');
- expect(tooltip.value).toBe(CLUSTERS_ACTIONS.connectWithAgent);
+ it('renders a dropdown with 3 actions items', () => {
+ expect(findDropdownItemIds()).toEqual([
+ 'create-cluster-link',
+ 'new-cluster-link',
+ 'connect-cluster-link',
+ ]);
});
- it('shows split button in dropdown', () => {
- expect(findDropdown().props('split')).toBe(true);
+ it('renders correct texts for the dropdown items', () => {
+ expect(findDropdownItemTexts()).toEqual([
+ CLUSTERS_ACTIONS.createCluster,
+ CLUSTERS_ACTIONS.createClusterCertificate,
+ CLUSTERS_ACTIONS.connectClusterCertificate,
+ ]);
});
- it('binds split button with modal id', () => {
- const binding = getBinding(findDropdown().element, 'gl-modal-directive');
-
- expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
+ it('renders correct href attributes for the links', () => {
+ expect(findNewClusterDocsLink().attributes('href')).toBe(newClusterDocsPath);
+ expect(findNewClusterLink().attributes('href')).toBe(newClusterPath);
+ expect(findConnectClusterLink().attributes('href')).toBe(addClusterPath);
});
});
@@ -114,17 +121,20 @@ describe('ClustersActionsComponent', () => {
createWrapper({ displayClusterAgents: false });
});
- it('renders a dropdown with 2 actions items', () => {
- expect(findDropdownItemIds()).toEqual(['new-cluster-link', 'connect-cluster-link']);
+ it(`displays default action as ${CLUSTERS_ACTIONS.connectClusterDeprecated}`, () => {
+ expect(findDropdown().props('text')).toBe(CLUSTERS_ACTIONS.connectClusterDeprecated);
});
- it('shows tooltip', () => {
- const tooltip = getBinding(findDropdown().element, 'gl-tooltip');
- expect(tooltip.value).toBe(CLUSTERS_ACTIONS.connectExistingCluster);
+ it('renders a dropdown with 1 action item', () => {
+ expect(findDropdownItemIds()).toEqual(['new-cluster-link']);
});
- it('does not show split button in dropdown', () => {
- expect(findDropdown().props('split')).toBe(false);
+ it('renders correct text for the dropdown item', () => {
+ expect(findDropdownItemTexts()).toEqual([CLUSTERS_ACTIONS.createClusterDeprecated]);
+ });
+
+ it('renders correct href attributes for the links', () => {
+ expect(findNewClusterLink().attributes('href')).toBe(newClusterPath);
});
it('does not bind dropdown button to modal', () => {
@@ -140,17 +150,26 @@ describe('ClustersActionsComponent', () => {
createWrapper({ certificateBasedClustersEnabled: false });
});
- it('it does not show the the dropdown', () => {
- expect(findDropdown().exists()).toBe(false);
+ it(`displays default action as ${CLUSTERS_ACTIONS.connectCluster}`, () => {
+ expect(findDropdown().props('text')).toBe(CLUSTERS_ACTIONS.connectCluster);
});
- it('shows the connect with agent button', () => {
- expect(findConnectWithAgentButton().props()).toMatchObject({
- disabled: !defaultProvide.canAddCluster,
- category: 'primary',
- variant: 'confirm',
- });
- expect(findConnectWithAgentButton().text()).toBe(CLUSTERS_ACTIONS.connectWithAgent);
+ it('renders correct modal id for the default action', () => {
+ const binding = getBinding(findDropdown().element, 'gl-modal-directive');
+
+ expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
+ });
+
+ it('renders a dropdown with 1 action item', () => {
+ expect(findDropdownItemIds()).toEqual(['create-cluster-link']);
+ });
+
+ it('renders correct text for the dropdown item', () => {
+ expect(findDropdownItemTexts()).toEqual([CLUSTERS_ACTIONS.createCluster]);
+ });
+
+ it('renders correct href attributes for the links', () => {
+ expect(findNewClusterDocsLink().attributes('href')).toBe(newClusterDocsPath);
});
});
});
diff --git a/spec/frontend/clusters_list/components/clusters_empty_state_spec.js b/spec/frontend/clusters_list/components/clusters_empty_state_spec.js
index fe2189296a6..2c3a224f3c8 100644
--- a/spec/frontend/clusters_list/components/clusters_empty_state_spec.js
+++ b/spec/frontend/clusters_list/components/clusters_empty_state_spec.js
@@ -1,10 +1,8 @@
-import { GlEmptyState, GlButton } from '@gitlab/ui';
+import { GlEmptyState } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ClustersEmptyState from '~/clusters_list/components/clusters_empty_state.vue';
-import ClusterStore from '~/clusters_list/store';
const clustersEmptyStateImage = 'path/to/svg';
-const addClusterPath = '/path/to/connect/cluster';
const emptyStateHelpText = 'empty state text';
describe('ClustersEmptyStateComponent', () => {
@@ -12,52 +10,28 @@ describe('ClustersEmptyStateComponent', () => {
const defaultProvideData = {
clustersEmptyStateImage,
- addClusterPath,
};
- const findButton = () => wrapper.findComponent(GlButton);
const findEmptyStateText = () => wrapper.findByTestId('clusters-empty-state-text');
- const createWrapper = ({
- provideData = { emptyStateHelpText: null },
- isChildComponent = false,
- canAddCluster = true,
- } = {}) => {
+ const createWrapper = ({ provideData = { emptyStateHelpText: null } } = {}) => {
wrapper = shallowMountExtended(ClustersEmptyState, {
- store: ClusterStore({ canAddCluster }),
- propsData: { isChildComponent },
provide: { ...defaultProvideData, ...provideData },
stubs: { GlEmptyState },
});
};
- beforeEach(() => {
- createWrapper();
- });
-
afterEach(() => {
wrapper.destroy();
});
- describe('when the component is loaded independently', () => {
- it('should render the action button', () => {
- expect(findButton().exists()).toBe(true);
- });
- });
-
describe('when the help text is not provided', () => {
- it('should not render the empty state text', () => {
- expect(findEmptyStateText().exists()).toBe(false);
- });
- });
-
- describe('when the component is loaded as a child component', () => {
beforeEach(() => {
- createWrapper({ isChildComponent: true });
+ createWrapper();
});
- it('should not render the action button', () => {
- expect(findButton().exists()).toBe(false);
+ it('should not render the empty state text', () => {
+ expect(findEmptyStateText().exists()).toBe(false);
});
});
@@ -70,13 +44,4 @@ describe('ClustersEmptyStateComponent', () => {
expect(findEmptyStateText().text()).toBe(emptyStateHelpText);
});
});
-
- describe('when the user cannot add clusters', () => {
- beforeEach(() => {
- createWrapper({ canAddCluster: false });
- });
- it('should disable the button', () => {
- expect(findButton().props('disabled')).toBe(true);
- });
- });
});
diff --git a/spec/frontend/clusters_list/components/clusters_view_all_spec.js b/spec/frontend/clusters_list/components/clusters_view_all_spec.js
index 2c1e3d909cc..b4eb9242003 100644
--- a/spec/frontend/clusters_list/components/clusters_view_all_spec.js
+++ b/spec/frontend/clusters_list/components/clusters_view_all_spec.js
@@ -1,24 +1,21 @@
-import { GlCard, GlLoadingIcon, GlButton, GlSprintf, GlBadge } from '@gitlab/ui';
+import { GlCard, GlLoadingIcon, GlSprintf, GlBadge } from '@gitlab/ui';
import Vue from 'vue';
import Vuex from 'vuex';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ClustersViewAll from '~/clusters_list/components/clusters_view_all.vue';
import Agents from '~/clusters_list/components/agents.vue';
import Clusters from '~/clusters_list/components/clusters.vue';
-import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import {
AGENT,
CERTIFICATE_BASED,
AGENT_CARD_INFO,
CERTIFICATE_BASED_CARD_INFO,
MAX_CLUSTERS_LIST,
- INSTALL_AGENT_MODAL_ID,
} from '~/clusters_list/constants';
import { sprintf } from '~/locale';
Vue.use(Vuex);
-const addClusterPath = '/path/to/add/cluster';
const defaultBranchName = 'default-branch';
describe('ClustersViewAllComponent', () => {
@@ -32,11 +29,6 @@ describe('ClustersViewAllComponent', () => {
defaultBranchName,
};
- const defaultProvide = {
- addClusterPath,
- canAddCluster: true,
- };
-
const entryData = {
loadingClusters: false,
totalClusters: 0,
@@ -46,37 +38,20 @@ describe('ClustersViewAllComponent', () => {
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findAgentsComponent = () => wrapper.findComponent(Agents);
const findClustersComponent = () => wrapper.findComponent(Clusters);
- const findInstallAgentButtonTooltip = () => wrapper.findByTestId('install-agent-button-tooltip');
- const findConnectExistingClusterButtonTooltip = () =>
- wrapper.findByTestId('connect-existing-cluster-button-tooltip');
const findCardsContainer = () => wrapper.findByTestId('clusters-cards-container');
const findAgentCardTitle = () => wrapper.findByTestId('agent-card-title');
const findRecommendedBadge = () => wrapper.findComponent(GlBadge);
const findClustersCardTitle = () => wrapper.findByTestId('clusters-card-title');
- const findFooterButton = (line) => findCards().at(line).findComponent(GlButton);
- const getTooltipText = (el) => {
- const binding = getBinding(el, 'gl-tooltip');
-
- return binding.value;
- };
const createStore = (initialState) =>
new Vuex.Store({
state: initialState,
});
- const createWrapper = ({ initialState = entryData, provideData } = {}) => {
+ const createWrapper = ({ initialState = entryData } = {}) => {
wrapper = shallowMountExtended(ClustersViewAll, {
store: createStore(initialState),
propsData,
- provide: {
- ...defaultProvide,
- ...provideData,
- },
- directives: {
- GlModalDirective: createMockDirective(),
- GlTooltip: createMockDirective(),
- },
stubs: { GlCard, GlSprintf },
});
};
@@ -138,25 +113,10 @@ describe('ClustersViewAllComponent', () => {
expect(findAgentsComponent().props('defaultBranchName')).toBe(defaultBranchName);
});
- it('should show install new Agent button in the footer', () => {
- expect(findFooterButton(0).exists()).toBe(true);
- expect(findFooterButton(0).props('disabled')).toBe(false);
- });
-
- it('does not show tooltip for install new Agent button', () => {
- expect(getTooltipText(findInstallAgentButtonTooltip().element)).toBe('');
- });
-
describe('when there are no agents', () => {
it('should show the empty title', () => {
expect(findAgentCardTitle().text()).toBe(AGENT_CARD_INFO.emptyTitle);
});
-
- it('should render correct modal id for the agent link', () => {
- const binding = getBinding(findFooterButton(0).element, 'gl-modal-directive');
-
- expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
- });
});
describe('when the agents are present', () => {
@@ -191,22 +151,6 @@ describe('ClustersViewAllComponent', () => {
});
});
});
-
- describe('when the user cannot add clusters', () => {
- beforeEach(() => {
- createWrapper({ provideData: { canAddCluster: false } });
- });
-
- it('should disable the button', () => {
- expect(findFooterButton(0).props('disabled')).toBe(true);
- });
-
- it('should show a tooltip explaining why the button is disabled', () => {
- expect(getTooltipText(findInstallAgentButtonTooltip().element)).toBe(
- AGENT_CARD_INFO.installAgentDisabledHint,
- );
- });
- });
});
describe('clusters tab', () => {
@@ -214,43 +158,10 @@ describe('ClustersViewAllComponent', () => {
expect(findClustersComponent().props('limit')).toBe(MAX_CLUSTERS_LIST);
});
- it('should pass the is-child-component prop', () => {
- expect(findClustersComponent().props('isChildComponent')).toBe(true);
- });
-
describe('when there are no clusters', () => {
it('should show the empty title', () => {
expect(findClustersCardTitle().text()).toBe(CERTIFICATE_BASED_CARD_INFO.emptyTitle);
});
-
- it('should show install new cluster button in the footer', () => {
- expect(findFooterButton(1).exists()).toBe(true);
- expect(findFooterButton(1).props('disabled')).toBe(false);
- });
-
- it('should render correct href for the button in the footer', () => {
- expect(findFooterButton(1).attributes('href')).toBe(addClusterPath);
- });
-
- it('does not show tooltip for install new cluster button', () => {
- expect(getTooltipText(findConnectExistingClusterButtonTooltip().element)).toBe('');
- });
- });
-
- describe('when the user cannot add clusters', () => {
- beforeEach(() => {
- createWrapper({ provideData: { canAddCluster: false } });
- });
-
- it('should disable the button', () => {
- expect(findFooterButton(1).props('disabled')).toBe(true);
- });
-
- it('should show a tooltip explaining why the button is disabled', () => {
- expect(getTooltipText(findConnectExistingClusterButtonTooltip().element)).toBe(
- CERTIFICATE_BASED_CARD_INFO.connectExistingClusterDisabledHint,
- );
- });
});
describe('when the clusters are present', () => {
diff --git a/spec/frontend/clusters_list/mocks/apollo.js b/spec/frontend/clusters_list/mocks/apollo.js
index b0f2978a230..3467b4c665c 100644
--- a/spec/frontend/clusters_list/mocks/apollo.js
+++ b/spec/frontend/clusters_list/mocks/apollo.js
@@ -1,4 +1,5 @@
const agent = {
+ __typename: 'ClusterAgent',
id: 'agent-id',
name: 'agent-name',
webPath: 'agent-webPath',
diff --git a/spec/frontend/clusters_list/store/actions_spec.js b/spec/frontend/clusters_list/store/actions_spec.js
index f4b69053e14..7663f329b3f 100644
--- a/spec/frontend/clusters_list/store/actions_spec.js
+++ b/spec/frontend/clusters_list/store/actions_spec.js
@@ -24,14 +24,12 @@ describe('Clusters store actions', () => {
captureException.mockRestore();
});
- it('should report sentry error', (done) => {
+ it('should report sentry error', async () => {
const sentryError = new Error('New Sentry Error');
const tag = 'sentryErrorTag';
- testAction(actions.reportSentryError, { error: sentryError, tag }, {}, [], [], () => {
- expect(captureException).toHaveBeenCalledWith(sentryError);
- done();
- });
+ await testAction(actions.reportSentryError, { error: sentryError, tag }, {}, [], []);
+ expect(captureException).toHaveBeenCalledWith(sentryError);
});
});
@@ -62,10 +60,10 @@ describe('Clusters store actions', () => {
afterEach(() => mock.restore());
- it('should commit SET_CLUSTERS_DATA with received response', (done) => {
+ it('should commit SET_CLUSTERS_DATA with received response', () => {
mock.onGet().reply(200, apiData, headers);
- testAction(
+ return testAction(
actions.fetchClusters,
{ endpoint: apiData.endpoint },
{},
@@ -75,14 +73,13 @@ describe('Clusters store actions', () => {
{ type: types.SET_LOADING_CLUSTERS, payload: false },
],
[],
- () => done(),
);
});
- it('should show flash on API error', (done) => {
+ it('should show flash on API error', async () => {
mock.onGet().reply(400, 'Not Found');
- testAction(
+ await testAction(
actions.fetchClusters,
{ endpoint: apiData.endpoint },
{},
@@ -100,13 +97,10 @@ describe('Clusters store actions', () => {
},
},
],
- () => {
- expect(createFlash).toHaveBeenCalledWith({
- message: expect.stringMatching('error'),
- });
- done();
- },
);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: expect.stringMatching('error'),
+ });
});
describe('multiple api requests', () => {
@@ -128,8 +122,8 @@ describe('Clusters store actions', () => {
pollStop.mockRestore();
});
- it('should stop polling after MAX Requests', (done) => {
- testAction(
+ it('should stop polling after MAX Requests', async () => {
+ await testAction(
actions.fetchClusters,
{ endpoint: apiData.endpoint },
{},
@@ -139,47 +133,43 @@ describe('Clusters store actions', () => {
{ type: types.SET_LOADING_CLUSTERS, payload: false },
],
[],
- () => {
- expect(pollRequest).toHaveBeenCalledTimes(1);
+ );
+ expect(pollRequest).toHaveBeenCalledTimes(1);
+ expect(pollStop).toHaveBeenCalledTimes(0);
+ jest.advanceTimersByTime(pollInterval);
+
+ return waitForPromises()
+ .then(() => {
+ expect(pollRequest).toHaveBeenCalledTimes(2);
expect(pollStop).toHaveBeenCalledTimes(0);
jest.advanceTimersByTime(pollInterval);
-
- waitForPromises()
- .then(() => {
- expect(pollRequest).toHaveBeenCalledTimes(2);
- expect(pollStop).toHaveBeenCalledTimes(0);
- jest.advanceTimersByTime(pollInterval);
- })
- .then(() => waitForPromises())
- .then(() => {
- expect(pollRequest).toHaveBeenCalledTimes(MAX_REQUESTS);
- expect(pollStop).toHaveBeenCalledTimes(0);
- jest.advanceTimersByTime(pollInterval);
- })
- .then(() => waitForPromises())
- .then(() => {
- expect(pollRequest).toHaveBeenCalledTimes(MAX_REQUESTS + 1);
- // Stops poll once it exceeds the MAX_REQUESTS limit
- expect(pollStop).toHaveBeenCalledTimes(1);
- jest.advanceTimersByTime(pollInterval);
- })
- .then(() => waitForPromises())
- .then(() => {
- // Additional poll requests are not made once pollStop is called
- expect(pollRequest).toHaveBeenCalledTimes(MAX_REQUESTS + 1);
- expect(pollStop).toHaveBeenCalledTimes(1);
- })
- .then(done)
- .catch(done.fail);
- },
- );
+ })
+ .then(() => waitForPromises())
+ .then(() => {
+ expect(pollRequest).toHaveBeenCalledTimes(MAX_REQUESTS);
+ expect(pollStop).toHaveBeenCalledTimes(0);
+ jest.advanceTimersByTime(pollInterval);
+ })
+ .then(() => waitForPromises())
+ .then(() => {
+ expect(pollRequest).toHaveBeenCalledTimes(MAX_REQUESTS + 1);
+ // Stops poll once it exceeds the MAX_REQUESTS limit
+ expect(pollStop).toHaveBeenCalledTimes(1);
+ jest.advanceTimersByTime(pollInterval);
+ })
+ .then(() => waitForPromises())
+ .then(() => {
+ // Additional poll requests are not made once pollStop is called
+ expect(pollRequest).toHaveBeenCalledTimes(MAX_REQUESTS + 1);
+ expect(pollStop).toHaveBeenCalledTimes(1);
+ });
});
- it('should stop polling and report to Sentry when data is invalid', (done) => {
+ it('should stop polling and report to Sentry when data is invalid', async () => {
const badApiResponse = { clusters: {} };
mock.onGet().reply(200, badApiResponse, pollHeaders);
- testAction(
+ await testAction(
actions.fetchClusters,
{ endpoint: apiData.endpoint },
{},
@@ -202,12 +192,9 @@ describe('Clusters store actions', () => {
},
},
],
- () => {
- expect(pollRequest).toHaveBeenCalledTimes(1);
- expect(pollStop).toHaveBeenCalledTimes(1);
- done();
- },
);
+ expect(pollRequest).toHaveBeenCalledTimes(1);
+ expect(pollStop).toHaveBeenCalledTimes(1);
});
});
});
diff --git a/spec/frontend/code_navigation/components/app_spec.js b/spec/frontend/code_navigation/components/app_spec.js
index 0d7c0360e9b..f2f97092c5a 100644
--- a/spec/frontend/code_navigation/components/app_spec.js
+++ b/spec/frontend/code_navigation/components/app_spec.js
@@ -38,12 +38,17 @@ describe('Code navigation app component', () => {
const codeNavigationPath = 'code/nav/path.js';
const path = 'blob/path.js';
const definitionPathPrefix = 'path/prefix';
+ const wrapTextNodes = true;
- factory({}, { codeNavigationPath, blobPath: path, pathPrefix: definitionPathPrefix });
+ factory(
+ {},
+ { codeNavigationPath, blobPath: path, pathPrefix: definitionPathPrefix, wrapTextNodes },
+ );
expect(setInitialData).toHaveBeenCalledWith(expect.anything(), {
blobs: [{ codeNavigationPath, path }],
definitionPathPrefix,
+ wrapTextNodes,
});
});
diff --git a/spec/frontend/code_navigation/store/actions_spec.js b/spec/frontend/code_navigation/store/actions_spec.js
index 73f935deeca..c26416aca94 100644
--- a/spec/frontend/code_navigation/store/actions_spec.js
+++ b/spec/frontend/code_navigation/store/actions_spec.js
@@ -7,15 +7,16 @@ import axios from '~/lib/utils/axios_utils';
jest.mock('~/code_navigation/utils');
describe('Code navigation actions', () => {
+ const wrapTextNodes = true;
+
describe('setInitialData', () => {
- it('commits SET_INITIAL_DATA', (done) => {
- testAction(
+ it('commits SET_INITIAL_DATA', () => {
+ return testAction(
actions.setInitialData,
- { projectPath: 'test' },
+ { projectPath: 'test', wrapTextNodes },
{},
- [{ type: 'SET_INITIAL_DATA', payload: { projectPath: 'test' } }],
+ [{ type: 'SET_INITIAL_DATA', payload: { projectPath: 'test', wrapTextNodes } }],
[],
- done,
);
});
});
@@ -30,7 +31,7 @@ describe('Code navigation actions', () => {
const codeNavigationPath =
'gitlab-org/gitlab-shell/-/jobs/1114/artifacts/raw/lsif/cmd/check/main.go.json';
- const state = { blobs: [{ path: 'index.js', codeNavigationPath }] };
+ const state = { blobs: [{ path: 'index.js', codeNavigationPath }], wrapTextNodes };
beforeEach(() => {
window.gon = { api_version: '1' };
@@ -57,8 +58,8 @@ describe('Code navigation actions', () => {
]);
});
- it('commits REQUEST_DATA_SUCCESS with normalized data', (done) => {
- testAction(
+ it('commits REQUEST_DATA_SUCCESS with normalized data', () => {
+ return testAction(
actions.fetchData,
null,
state,
@@ -80,12 +81,11 @@ describe('Code navigation actions', () => {
},
],
[],
- done,
);
});
- it('calls addInteractionClass with data', (done) => {
- testAction(
+ it('calls addInteractionClass with data', () => {
+ return testAction(
actions.fetchData,
null,
state,
@@ -107,16 +107,17 @@ describe('Code navigation actions', () => {
},
],
[],
- )
- .then(() => {
- expect(addInteractionClass).toHaveBeenCalledWith('index.js', {
+ ).then(() => {
+ expect(addInteractionClass).toHaveBeenCalledWith({
+ path: 'index.js',
+ d: {
start_line: 0,
start_char: 0,
hover: { value: '123' },
- });
- })
- .then(done)
- .catch(done.fail);
+ },
+ wrapTextNodes,
+ });
+ });
});
});
@@ -125,14 +126,13 @@ describe('Code navigation actions', () => {
mock.onGet(codeNavigationPath).replyOnce(500);
});
- it('dispatches requestDataError', (done) => {
- testAction(
+ it('dispatches requestDataError', () => {
+ return testAction(
actions.fetchData,
null,
state,
[{ type: 'REQUEST_DATA' }],
[{ type: 'requestDataError' }],
- done,
);
});
});
@@ -144,14 +144,19 @@ describe('Code navigation actions', () => {
data: {
'index.js': { '0:0': 'test', '1:1': 'console.log' },
},
+ wrapTextNodes,
};
actions.showBlobInteractionZones({ state }, 'index.js');
expect(addInteractionClass).toHaveBeenCalled();
expect(addInteractionClass.mock.calls.length).toBe(2);
- expect(addInteractionClass.mock.calls[0]).toEqual(['index.js', 'test']);
- expect(addInteractionClass.mock.calls[1]).toEqual(['index.js', 'console.log']);
+ expect(addInteractionClass.mock.calls[0]).toEqual([
+ { path: 'index.js', d: 'test', wrapTextNodes },
+ ]);
+ expect(addInteractionClass.mock.calls[1]).toEqual([
+ { path: 'index.js', d: 'console.log', wrapTextNodes },
+ ]);
});
it('does not call addInteractionClass when no data exists', () => {
@@ -175,20 +180,20 @@ describe('Code navigation actions', () => {
target = document.querySelector('.js-test');
});
- it('returns early when no data exists', (done) => {
- testAction(actions.showDefinition, { target }, {}, [], [], done);
+ it('returns early when no data exists', () => {
+ return testAction(actions.showDefinition, { target }, {}, [], []);
});
- it('commits SET_CURRENT_DEFINITION when target is not code navitation element', (done) => {
- testAction(actions.showDefinition, { target }, { data: {} }, [], [], done);
+ it('commits SET_CURRENT_DEFINITION when target is not code navitation element', () => {
+ return testAction(actions.showDefinition, { target }, { data: {} }, [], []);
});
- it('commits SET_CURRENT_DEFINITION with LSIF data', (done) => {
+ it('commits SET_CURRENT_DEFINITION with LSIF data', () => {
target.classList.add('js-code-navigation');
target.setAttribute('data-line-index', '0');
target.setAttribute('data-char-index', '0');
- testAction(
+ return testAction(
actions.showDefinition,
{ target },
{ data: { 'index.js': { '0:0': { hover: 'test' } } } },
@@ -203,7 +208,6 @@ describe('Code navigation actions', () => {
},
],
[],
- done,
);
});
diff --git a/spec/frontend/code_navigation/store/mutations_spec.js b/spec/frontend/code_navigation/store/mutations_spec.js
index cb10729f4b6..b2f1b3bddfd 100644
--- a/spec/frontend/code_navigation/store/mutations_spec.js
+++ b/spec/frontend/code_navigation/store/mutations_spec.js
@@ -13,10 +13,12 @@ describe('Code navigation mutations', () => {
mutations.SET_INITIAL_DATA(state, {
blobs: ['test'],
definitionPathPrefix: 'https://test.com/blob/main',
+ wrapTextNodes: true,
});
expect(state.blobs).toEqual(['test']);
expect(state.definitionPathPrefix).toBe('https://test.com/blob/main');
+ expect(state.wrapTextNodes).toBe(true);
});
});
diff --git a/spec/frontend/code_navigation/utils/index_spec.js b/spec/frontend/code_navigation/utils/index_spec.js
index 6a01249d2a3..682c8bce8c5 100644
--- a/spec/frontend/code_navigation/utils/index_spec.js
+++ b/spec/frontend/code_navigation/utils/index_spec.js
@@ -45,14 +45,42 @@ describe('addInteractionClass', () => {
${0} | ${0} | ${0}
${0} | ${8} | ${2}
${1} | ${0} | ${0}
+ ${1} | ${0} | ${0}
`(
'it sets code navigation attributes for line $line and character $char',
({ line, char, index }) => {
- addInteractionClass('index.js', { start_line: line, start_char: char });
+ addInteractionClass({ path: 'index.js', d: { start_line: line, start_char: char } });
expect(document.querySelectorAll(`#LC${line + 1} span`)[index].classList).toContain(
'js-code-navigation',
);
},
);
+
+ describe('wrapTextNodes', () => {
+ beforeEach(() => {
+ setFixtures(
+ '<div data-path="index.js"><div class="blob-content"><div id="LC1" class="line"> Text </div></div></div>',
+ );
+ });
+
+ const params = { path: 'index.js', d: { start_line: 0, start_char: 0 } };
+ const findAllSpans = () => document.querySelectorAll('#LC1 span');
+
+ it('does not wrap text nodes by default', () => {
+ addInteractionClass(params);
+ const spans = findAllSpans();
+ expect(spans.length).toBe(0);
+ });
+
+ it('wraps text nodes if wrapTextNodes is true', () => {
+ addInteractionClass({ ...params, wrapTextNodes: true });
+ const spans = findAllSpans();
+
+ expect(spans.length).toBe(3);
+ expect(spans[0].textContent).toBe(' ');
+ expect(spans[1].textContent).toBe('Text');
+ expect(spans[2].textContent).toBe(' ');
+ });
+ });
});
diff --git a/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js b/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js
index 1a2e188e7ae..b1c8ba48475 100644
--- a/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js
+++ b/spec/frontend/commit/commit_box_pipeline_mini_graph_spec.js
@@ -1,7 +1,18 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
import { shallowMount } from '@vue/test-utils';
+import createMockApollo from 'helpers/mock_apollo_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
import CommitBoxPipelineMiniGraph from '~/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue';
-import { mockStages } from './mock_data';
+import getLinkedPipelinesQuery from '~/projects/commit_box/info/graphql/queries/get_linked_pipelines.query.graphql';
+import getPipelineStagesQuery from '~/projects/commit_box/info/graphql/queries/get_pipeline_stages.query.graphql';
+import { mockPipelineStagesQueryResponse, mockStages } from './mock_data';
+
+jest.mock('~/flash');
+
+Vue.use(VueApollo);
describe('Commit box pipeline mini graph', () => {
let wrapper;
@@ -10,34 +21,36 @@ describe('Commit box pipeline mini graph', () => {
const findUpstream = () => wrapper.findByTestId('commit-box-mini-graph-upstream');
const findDownstream = () => wrapper.findByTestId('commit-box-mini-graph-downstream');
- const createComponent = () => {
+ const stagesHandler = jest.fn().mockResolvedValue(mockPipelineStagesQueryResponse);
+
+ const createComponent = ({ props = {} } = {}) => {
+ const handlers = [
+ [getLinkedPipelinesQuery, {}],
+ [getPipelineStagesQuery, stagesHandler],
+ ];
+
wrapper = extendedWrapper(
shallowMount(CommitBoxPipelineMiniGraph, {
propsData: {
stages: mockStages,
+ ...props,
},
- mocks: {
- $apollo: {
- queries: {
- pipeline: {
- loading: false,
- },
- },
- },
- },
+ apolloProvider: createMockApollo(handlers),
}),
);
- };
- beforeEach(() => {
- createComponent();
- });
+ return waitForPromises();
+ };
afterEach(() => {
wrapper.destroy();
});
describe('linked pipelines', () => {
+ beforeEach(async () => {
+ await createComponent();
+ });
+
it('should display the mini pipeine graph', () => {
expect(findMiniGraph().exists()).toBe(true);
});
@@ -47,4 +60,18 @@ describe('Commit box pipeline mini graph', () => {
expect(findDownstream().exists()).toBe(false);
});
});
+
+ describe('when data is mismatched', () => {
+ beforeEach(async () => {
+ await createComponent({ props: { stages: [] } });
+ });
+
+ it('calls create flash with expected arguments', () => {
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'There was a problem handling the pipeline data.',
+ captureError: true,
+ error: new Error('Rest stages and graphQl stages must be the same length'),
+ });
+ });
+ });
});
diff --git a/spec/frontend/commit/components/commit_box_pipeline_status_spec.js b/spec/frontend/commit/components/commit_box_pipeline_status_spec.js
new file mode 100644
index 00000000000..db7b7b45397
--- /dev/null
+++ b/spec/frontend/commit/components/commit_box_pipeline_status_spec.js
@@ -0,0 +1,150 @@
+import { GlLoadingIcon, GlLink } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import CommitBoxPipelineStatus from '~/projects/commit_box/info/components/commit_box_pipeline_status.vue';
+import {
+ COMMIT_BOX_POLL_INTERVAL,
+ PIPELINE_STATUS_FETCH_ERROR,
+} from '~/projects/commit_box/info/constants';
+import getLatestPipelineStatusQuery from '~/projects/commit_box/info/graphql/queries/get_latest_pipeline_status.query.graphql';
+import * as graphQlUtils from '~/pipelines/components/graph/utils';
+import { mockPipelineStatusResponse } from '../mock_data';
+
+const mockProvide = {
+ fullPath: 'root/ci-project',
+ iid: '46',
+ graphqlResourceEtag: '/api/graphql:pipelines/id/320',
+};
+
+Vue.use(VueApollo);
+
+jest.mock('~/flash');
+
+describe('Commit box pipeline status', () => {
+ let wrapper;
+
+ const statusSuccessHandler = jest.fn().mockResolvedValue(mockPipelineStatusResponse);
+ const failedHandler = jest.fn().mockRejectedValue(new Error('GraphQL error'));
+
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findStatusIcon = () => wrapper.findComponent(CiIcon);
+ const findPipelineLink = () => wrapper.findComponent(GlLink);
+
+ const advanceToNextFetch = () => {
+ jest.advanceTimersByTime(COMMIT_BOX_POLL_INTERVAL);
+ };
+
+ const createMockApolloProvider = (handler) => {
+ const requestHandlers = [[getLatestPipelineStatusQuery, handler]];
+
+ return createMockApollo(requestHandlers);
+ };
+
+ const createComponent = (handler = statusSuccessHandler) => {
+ wrapper = shallowMount(CommitBoxPipelineStatus, {
+ provide: {
+ ...mockProvide,
+ },
+ apolloProvider: createMockApolloProvider(handler),
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('loading state', () => {
+ it('should display loading state when loading', () => {
+ createComponent();
+
+ expect(findLoadingIcon().exists()).toBe(true);
+ expect(findStatusIcon().exists()).toBe(false);
+ });
+ });
+
+ describe('loaded state', () => {
+ beforeEach(async () => {
+ createComponent();
+
+ await waitForPromises();
+ });
+
+ it('should display pipeline status after the query is resolved successfully', async () => {
+ expect(findStatusIcon().exists()).toBe(true);
+
+ expect(findLoadingIcon().exists()).toBe(false);
+ expect(createFlash).toHaveBeenCalledTimes(0);
+ });
+
+ it('should link to the latest pipeline', () => {
+ const {
+ data: {
+ project: {
+ pipeline: {
+ detailedStatus: { detailsPath },
+ },
+ },
+ },
+ } = mockPipelineStatusResponse;
+
+ expect(findPipelineLink().attributes('href')).toBe(detailsPath);
+ });
+ });
+
+ describe('error state', () => {
+ it('createFlash should show if there is an error fetching the pipeline status', async () => {
+ createComponent(failedHandler);
+
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: PIPELINE_STATUS_FETCH_ERROR,
+ });
+ });
+ });
+
+ describe('polling', () => {
+ it('polling interval is set for pipeline stages', () => {
+ createComponent();
+
+ const expectedInterval = wrapper.vm.$apollo.queries.pipelineStatus.options.pollInterval;
+
+ expect(expectedInterval).toBe(COMMIT_BOX_POLL_INTERVAL);
+ });
+
+ it('polls for pipeline status', async () => {
+ createComponent();
+
+ await waitForPromises();
+
+ expect(statusSuccessHandler).toHaveBeenCalledTimes(1);
+
+ advanceToNextFetch();
+ await waitForPromises();
+
+ expect(statusSuccessHandler).toHaveBeenCalledTimes(2);
+
+ advanceToNextFetch();
+ await waitForPromises();
+
+ expect(statusSuccessHandler).toHaveBeenCalledTimes(3);
+ });
+
+ it('toggles pipelineStatus polling with visibility check', async () => {
+ jest.spyOn(graphQlUtils, 'toggleQueryPollingByVisibility');
+
+ createComponent();
+
+ await waitForPromises();
+
+ expect(graphQlUtils.toggleQueryPollingByVisibility).toHaveBeenCalledWith(
+ wrapper.vm.$apollo.queries.pipelineStatus,
+ );
+ });
+ });
+});
diff --git a/spec/frontend/commit/mock_data.js b/spec/frontend/commit/mock_data.js
index ef018a4fbd7..8db162c07c2 100644
--- a/spec/frontend/commit/mock_data.js
+++ b/spec/frontend/commit/mock_data.js
@@ -115,3 +115,49 @@ export const mockStages = [
dropdown_path: '/root/ci-project/-/pipelines/611/stage.json?stage=qa',
},
];
+
+export const mockPipelineStagesQueryResponse = {
+ data: {
+ project: {
+ id: 'gid://gitlab/Project/20',
+ pipeline: {
+ id: 'gid://gitlab/Ci::Pipeline/320',
+ stages: {
+ nodes: [
+ {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/409',
+ name: 'build',
+ detailedStatus: {
+ id: 'success-409-409',
+ group: 'success',
+ icon: 'status_success',
+ __typename: 'DetailedStatus',
+ },
+ },
+ ],
+ },
+ },
+ },
+ },
+};
+
+export const mockPipelineStatusResponse = {
+ data: {
+ project: {
+ id: 'gid://gitlab/Project/20',
+ pipeline: {
+ id: 'gid://gitlab/Ci::Pipeline/320',
+ detailedStatus: {
+ id: 'pending-320-320',
+ detailsPath: '/root/ci-project/-/pipelines/320',
+ icon: 'status_pending',
+ group: 'pending',
+ __typename: 'DetailedStatus',
+ },
+ __typename: 'Pipeline',
+ },
+ __typename: 'Project',
+ },
+ },
+};
diff --git a/spec/frontend/commit/pipelines/pipelines_table_spec.js b/spec/frontend/commit/pipelines/pipelines_table_spec.js
index 203a4d23160..9b01af1e585 100644
--- a/spec/frontend/commit/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/commit/pipelines/pipelines_table_spec.js
@@ -120,18 +120,20 @@ describe('Pipelines table in Commits and Merge requests', () => {
});
describe('pipeline badge counts', () => {
- it('should receive update-pipelines-count event', (done) => {
+ it('should receive update-pipelines-count event', () => {
const element = document.createElement('div');
document.body.appendChild(element);
- element.addEventListener('update-pipelines-count', (event) => {
- expect(event.detail.pipelineCount).toEqual(10);
- done();
- });
+ return new Promise((resolve) => {
+ element.addEventListener('update-pipelines-count', (event) => {
+ expect(event.detail.pipelineCount).toEqual(10);
+ resolve();
+ });
- createComponent();
+ createComponent();
- element.appendChild(wrapper.vm.$el);
+ element.appendChild(wrapper.vm.$el);
+ });
});
});
});
diff --git a/spec/frontend/commit/pipelines/utils_spec.js b/spec/frontend/commit/pipelines/utils_spec.js
new file mode 100644
index 00000000000..472e35a6eb3
--- /dev/null
+++ b/spec/frontend/commit/pipelines/utils_spec.js
@@ -0,0 +1,59 @@
+import { formatStages } from '~/projects/commit_box/info/utils';
+
+const graphqlStage = [
+ {
+ __typename: 'CiStage',
+ name: 'deploy',
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ icon: 'status_success',
+ group: 'success',
+ id: 'success-409-409',
+ },
+ },
+];
+
+const restStage = [
+ {
+ name: 'deploy',
+ title: 'deploy: passed',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ tooltip: 'passed',
+ has_details: true,
+ details_path: '/root/ci-project/-/pipelines/318#deploy',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png',
+ },
+ path: '/root/ci-project/-/pipelines/318#deploy',
+ dropdown_path: '/root/ci-project/-/pipelines/318/stage.json?stage=deploy',
+ },
+];
+
+describe('Utils', () => {
+ it('combines REST and GraphQL stages correctly for component', () => {
+ expect(formatStages(graphqlStage, restStage)).toEqual([
+ {
+ dropdown_path: '/root/ci-project/-/pipelines/318/stage.json?stage=deploy',
+ name: 'deploy',
+ status: {
+ __typename: 'DetailedStatus',
+ group: 'success',
+ icon: 'status_success',
+ id: 'success-409-409',
+ },
+ title: 'deploy: passed',
+ },
+ ]);
+ });
+
+ it('throws an error if arrays are not the same length', () => {
+ expect(() => {
+ formatStages(graphqlStage, []);
+ }).toThrow('Rest stages and graphQl stages must be the same length');
+ });
+});
diff --git a/spec/frontend/commits_spec.js b/spec/frontend/commits_spec.js
index 8189ebe6e55..a049a6997f0 100644
--- a/spec/frontend/commits_spec.js
+++ b/spec/frontend/commits_spec.js
@@ -70,29 +70,17 @@ describe('Commits List', () => {
mock.restore();
});
- it('should save the last search string', (done) => {
+ it('should save the last search string', async () => {
commitsList.searchField.val('GitLab');
- commitsList
- .filterResults()
- .then(() => {
- expect(ajaxSpy).toHaveBeenCalled();
- expect(commitsList.lastSearch).toEqual('GitLab');
-
- done();
- })
- .catch(done.fail);
+ await commitsList.filterResults();
+ expect(ajaxSpy).toHaveBeenCalled();
+ expect(commitsList.lastSearch).toEqual('GitLab');
});
- it('should not make ajax call if the input does not change', (done) => {
- commitsList
- .filterResults()
- .then(() => {
- expect(ajaxSpy).not.toHaveBeenCalled();
- expect(commitsList.lastSearch).toEqual('');
-
- done();
- })
- .catch(done.fail);
+ it('should not make ajax call if the input does not change', async () => {
+ await commitsList.filterResults();
+ expect(ajaxSpy).not.toHaveBeenCalled();
+ expect(commitsList.lastSearch).toEqual('');
});
});
});
diff --git a/spec/frontend/confidential_merge_request/components/__snapshots__/project_form_group_spec.js.snap b/spec/frontend/confidential_merge_request/components/__snapshots__/project_form_group_spec.js.snap
index c2fa6556847..d9f161b47b1 100644
--- a/spec/frontend/confidential_merge_request/components/__snapshots__/project_form_group_spec.js.snap
+++ b/spec/frontend/confidential_merge_request/components/__snapshots__/project_form_group_spec.js.snap
@@ -12,7 +12,7 @@ exports[`Confidential merge request project form group component renders empty s
<!---->
<p
- class="text-muted mt-1 mb-0"
+ class="gl-text-gray-600 gl-mt-1 gl-mb-0"
>
No forks are available to you.
@@ -27,7 +27,7 @@ exports[`Confidential merge request project form group component renders empty s
</a>
and set the fork's visibility to private.
<gl-link-stub
- class="w-auto p-0 d-inline-block text-primary bg-transparent"
+ class="gl-w-auto gl-p-0 gl-display-inline-block gl-bg-transparent"
href="/help"
target="_blank"
>
@@ -62,13 +62,13 @@ exports[`Confidential merge request project form group component renders fork dr
/>
<p
- class="text-muted mt-1 mb-0"
+ class="gl-text-gray-600 gl-mt-1 gl-mb-0"
>
To protect this issue's confidentiality, a private fork of this project was selected.
<gl-link-stub
- class="w-auto p-0 d-inline-block text-primary bg-transparent"
+ class="gl-w-auto gl-p-0 gl-display-inline-block gl-bg-transparent"
href="/help"
target="_blank"
>
diff --git a/spec/frontend/content_editor/components/code_block_bubble_menu_spec.js b/spec/frontend/content_editor/components/code_block_bubble_menu_spec.js
new file mode 100644
index 00000000000..074c311495f
--- /dev/null
+++ b/spec/frontend/content_editor/components/code_block_bubble_menu_spec.js
@@ -0,0 +1,142 @@
+import { BubbleMenu } from '@tiptap/vue-2';
+import { GlButton, GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
+import Vue from 'vue';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import CodeBlockBubbleMenu from '~/content_editor/components/code_block_bubble_menu.vue';
+import eventHubFactory from '~/helpers/event_hub_factory';
+import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
+import codeBlockLanguageLoader from '~/content_editor/services/code_block_language_loader';
+import { createTestEditor, emitEditorEvent } from '../test_utils';
+
+describe('content_editor/components/code_block_bubble_menu', () => {
+ let wrapper;
+ let tiptapEditor;
+ let bubbleMenu;
+ let eventHub;
+
+ const buildEditor = () => {
+ tiptapEditor = createTestEditor({ extensions: [CodeBlockHighlight] });
+ eventHub = eventHubFactory();
+ };
+
+ const buildWrapper = () => {
+ wrapper = mountExtended(CodeBlockBubbleMenu, {
+ provide: {
+ tiptapEditor,
+ eventHub,
+ },
+ });
+ };
+
+ const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findDropdownItemsData = () =>
+ findDropdownItems().wrappers.map((x) => ({
+ text: x.text(),
+ visible: x.isVisible(),
+ checked: x.props('isChecked'),
+ }));
+
+ beforeEach(() => {
+ buildEditor();
+ buildWrapper();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders bubble menu component', async () => {
+ tiptapEditor.commands.insertContent('<pre>test</pre>');
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ expect(bubbleMenu.props('editor')).toBe(tiptapEditor);
+ expect(bubbleMenu.classes()).toEqual(['gl-shadow', 'gl-rounded-base']);
+ });
+
+ it('selects plaintext language by default', async () => {
+ tiptapEditor.commands.insertContent('<pre>test</pre>');
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Plain text');
+ });
+
+ it('selects appropriate language based on the code block', async () => {
+ tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Javascript');
+ });
+
+ it("selects Custom (syntax) if the language doesn't exist in the list", async () => {
+ tiptapEditor.commands.insertContent('<pre lang="nomnoml">test</pre>');
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Custom (nomnoml)');
+ });
+
+ it('delete button deletes the code block', async () => {
+ tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
+
+ await wrapper.findComponent(GlButton).vm.$emit('click');
+
+ expect(tiptapEditor.getText()).toBe('');
+ });
+
+ describe('when opened and search is changed', () => {
+ beforeEach(async () => {
+ tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
+
+ wrapper.findComponent(GlSearchBoxByType).vm.$emit('input', 'js');
+
+ await Vue.nextTick();
+ });
+
+ it('shows dropdown items', () => {
+ expect(findDropdownItemsData()).toEqual([
+ { text: 'Javascript', visible: true, checked: true },
+ { text: 'Java', visible: true, checked: false },
+ { text: 'Javascript', visible: false, checked: false },
+ { text: 'JSON', visible: true, checked: false },
+ ]);
+ });
+
+ describe('when dropdown item is clicked', () => {
+ beforeEach(async () => {
+ jest.spyOn(codeBlockLanguageLoader, 'loadLanguages').mockResolvedValue();
+
+ findDropdownItems().at(1).vm.$emit('click');
+
+ await Vue.nextTick();
+ });
+
+ it('loads language', () => {
+ expect(codeBlockLanguageLoader.loadLanguages).toHaveBeenCalledWith(['java']);
+ });
+
+ it('sets code block', () => {
+ expect(tiptapEditor.getJSON()).toMatchObject({
+ content: [
+ {
+ type: 'codeBlock',
+ attrs: {
+ language: 'java',
+ },
+ },
+ ],
+ });
+ });
+
+ it('updates selected dropdown', () => {
+ expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Java');
+ });
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/components/formatting_bubble_menu_spec.js b/spec/frontend/content_editor/components/formatting_bubble_menu_spec.js
index e44a7fa4ddb..192ddee78c6 100644
--- a/spec/frontend/content_editor/components/formatting_bubble_menu_spec.js
+++ b/spec/frontend/content_editor/components/formatting_bubble_menu_spec.js
@@ -9,7 +9,7 @@ import {
} from '~/content_editor/constants';
import { createTestEditor } from '../test_utils';
-describe('content_editor/components/top_toolbar', () => {
+describe('content_editor/components/formatting_bubble_menu', () => {
let wrapper;
let trackingSpy;
let tiptapEditor;
diff --git a/spec/frontend/content_editor/components/wrappers/image_spec.js b/spec/frontend/content_editor/components/wrappers/image_spec.js
deleted file mode 100644
index 7b057f9cabc..00000000000
--- a/spec/frontend/content_editor/components/wrappers/image_spec.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import { GlLoadingIcon } from '@gitlab/ui';
-import { NodeViewWrapper } from '@tiptap/vue-2';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import ImageWrapper from '~/content_editor/components/wrappers/image.vue';
-
-describe('content/components/wrappers/image', () => {
- let wrapper;
-
- const createWrapper = async (nodeAttrs = {}) => {
- wrapper = shallowMountExtended(ImageWrapper, {
- propsData: {
- node: {
- attrs: nodeAttrs,
- },
- },
- });
- };
- const findImage = () => wrapper.findByTestId('image');
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders a node-view-wrapper with display-inline-block class', () => {
- createWrapper();
-
- expect(wrapper.findComponent(NodeViewWrapper).classes()).toContain('gl-display-inline-block');
- });
-
- it('renders an image that displays the node src', () => {
- const src = 'foobar.png';
-
- createWrapper({ src });
-
- expect(findImage().attributes().src).toBe(src);
- });
-
- describe('when uploading', () => {
- beforeEach(() => {
- createWrapper({ uploading: true });
- });
-
- it('renders a gl-loading-icon component', () => {
- expect(findLoadingIcon().exists()).toBe(true);
- });
-
- it('adds gl-opacity-5 class selector to image', () => {
- expect(findImage().classes()).toContain('gl-opacity-5');
- });
- });
-
- describe('when not uploading', () => {
- beforeEach(() => {
- createWrapper({ uploading: false });
- });
-
- it('does not render a gl-loading-icon component', () => {
- expect(findLoadingIcon().exists()).toBe(false);
- });
-
- it('does not add gl-opacity-5 class selector to image', () => {
- expect(findImage().classes()).not.toContain('gl-opacity-5');
- });
- });
-});
diff --git a/spec/frontend/content_editor/components/wrappers/media_spec.js b/spec/frontend/content_editor/components/wrappers/media_spec.js
new file mode 100644
index 00000000000..3e95e2f3914
--- /dev/null
+++ b/spec/frontend/content_editor/components/wrappers/media_spec.js
@@ -0,0 +1,69 @@
+import { GlLoadingIcon } from '@gitlab/ui';
+import { NodeViewWrapper } from '@tiptap/vue-2';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import MediaWrapper from '~/content_editor/components/wrappers/media.vue';
+
+describe('content/components/wrappers/media', () => {
+ let wrapper;
+
+ const createWrapper = async (nodeAttrs = {}) => {
+ wrapper = shallowMountExtended(MediaWrapper, {
+ propsData: {
+ node: {
+ attrs: nodeAttrs,
+ type: {
+ name: 'image',
+ },
+ },
+ },
+ });
+ };
+ const findMedia = () => wrapper.findByTestId('media');
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a node-view-wrapper with display-inline-block class', () => {
+ createWrapper();
+
+ expect(wrapper.findComponent(NodeViewWrapper).classes()).toContain('gl-display-inline-block');
+ });
+
+ it('renders an image that displays the node src', () => {
+ const src = 'foobar.png';
+
+ createWrapper({ src });
+
+ expect(findMedia().attributes().src).toBe(src);
+ });
+
+ describe('when uploading', () => {
+ beforeEach(() => {
+ createWrapper({ uploading: true });
+ });
+
+ it('renders a gl-loading-icon component', () => {
+ expect(findLoadingIcon().exists()).toBe(true);
+ });
+
+ it('adds gl-opacity-5 class selector to the media tag', () => {
+ expect(findMedia().classes()).toContain('gl-opacity-5');
+ });
+ });
+
+ describe('when not uploading', () => {
+ beforeEach(() => {
+ createWrapper({ uploading: false });
+ });
+
+ it('does not render a gl-loading-icon component', () => {
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+
+ it('does not add gl-opacity-5 class selector to the media tag', () => {
+ expect(findMedia().classes()).not.toContain('gl-opacity-5');
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/attachment_spec.js b/spec/frontend/content_editor/extensions/attachment_spec.js
index ec67545cf17..d3c42104e47 100644
--- a/spec/frontend/content_editor/extensions/attachment_spec.js
+++ b/spec/frontend/content_editor/extensions/attachment_spec.js
@@ -1,7 +1,10 @@
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
+import waitForPromises from 'helpers/wait_for_promises';
import Attachment from '~/content_editor/extensions/attachment';
import Image from '~/content_editor/extensions/image';
+import Audio from '~/content_editor/extensions/audio';
+import Video from '~/content_editor/extensions/video';
import Link from '~/content_editor/extensions/link';
import Loading from '~/content_editor/extensions/loading';
import { VARIANT_DANGER } from '~/flash';
@@ -14,6 +17,23 @@ const PROJECT_WIKI_ATTACHMENT_IMAGE_HTML = `<p data-sourcepos="1:1-1:27" dir="au
<img alt="test-file" class="lazy" data-src="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png">
</a>
</p>`;
+
+const PROJECT_WIKI_ATTACHMENT_VIDEO_HTML = `<p data-sourcepos="1:1-1:132" dir="auto">
+ <span class="media-container video-container">
+ <video src="/group1/project1/-/wikis/test-file.mp4" controls="true" data-setup="{}" data-title="test-file" width="400" preload="metadata" data-canonical-src="test-file.mp4">
+ </video>
+ <a href="/himkp/test/-/wikis/test-file.mp4" target="_blank" rel="noopener noreferrer" title="Download 'test-file'" data-canonical-src="test-file.mp4">test-file</a>
+ </span>
+</p>`;
+
+const PROJECT_WIKI_ATTACHMENT_AUDIO_HTML = `<p data-sourcepos="3:1-3:74" dir="auto">
+ <span class="media-container audio-container">
+ <audio src="/himkp/test/-/wikis/test-file.mp3" controls="true" data-setup="{}" data-title="test-file" data-canonical-src="test-file.mp3">
+ </audio>
+ <a href="/himkp/test/-/wikis/test-file.mp3" target="_blank" rel="noopener noreferrer" title="Download 'test-file'" data-canonical-src="test-file.mp3">test-file</a>
+ </span>
+</p>`;
+
const PROJECT_WIKI_ATTACHMENT_LINK_HTML = `<p data-sourcepos="1:1-1:26" dir="auto">
<a href="/group1/project1/-/wikis/test-file.zip" data-canonical-src="test-file.zip">test-file</a>
</p>`;
@@ -23,6 +43,8 @@ describe('content_editor/extensions/attachment', () => {
let doc;
let p;
let image;
+ let audio;
+ let video;
let loading;
let link;
let renderMarkdown;
@@ -31,15 +53,18 @@ describe('content_editor/extensions/attachment', () => {
const uploadsPath = '/uploads/';
const imageFile = new File(['foo'], 'test-file.png', { type: 'image/png' });
+ const audioFile = new File(['foo'], 'test-file.mp3', { type: 'audio/mpeg' });
+ const videoFile = new File(['foo'], 'test-file.mp4', { type: 'video/mp4' });
const attachmentFile = new File(['foo'], 'test-file.zip', { type: 'application/zip' });
const expectDocumentAfterTransaction = ({ number, expectedDoc, action }) => {
return new Promise((resolve) => {
let counter = 1;
- const handleTransaction = () => {
+ const handleTransaction = async () => {
if (counter === number) {
expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
tiptapEditor.off('update', handleTransaction);
+ await waitForPromises();
resolve();
}
@@ -60,18 +85,22 @@ describe('content_editor/extensions/attachment', () => {
Loading,
Link,
Image,
+ Audio,
+ Video,
Attachment.configure({ renderMarkdown, uploadsPath, eventHub }),
],
});
({
- builders: { doc, p, image, loading, link },
+ builders: { doc, p, image, audio, video, loading, link },
} = createDocBuilder({
tiptapEditor,
names: {
loading: { markType: Loading.name },
image: { nodeType: Image.name },
link: { nodeType: Link.name },
+ audio: { nodeType: Audio.name },
+ video: { nodeType: Video.name },
},
}));
@@ -103,17 +132,22 @@ describe('content_editor/extensions/attachment', () => {
tiptapEditor.commands.setContent(initialDoc.toJSON());
});
- describe('when the file has image mime type', () => {
- const base64EncodedFile = 'data:image/png;base64,Zm9v';
+ describe.each`
+ nodeType | mimeType | html | file | mediaType
+ ${'image'} | ${'image/png'} | ${PROJECT_WIKI_ATTACHMENT_IMAGE_HTML} | ${imageFile} | ${(attrs) => image(attrs)}
+ ${'audio'} | ${'audio/mpeg'} | ${PROJECT_WIKI_ATTACHMENT_AUDIO_HTML} | ${audioFile} | ${(attrs) => audio(attrs)}
+ ${'video'} | ${'video/mp4'} | ${PROJECT_WIKI_ATTACHMENT_VIDEO_HTML} | ${videoFile} | ${(attrs) => video(attrs)}
+ `('when the file has $nodeType mime type', ({ mimeType, html, file, mediaType }) => {
+ const base64EncodedFile = `data:${mimeType};base64,Zm9v`;
beforeEach(() => {
- renderMarkdown.mockResolvedValue(PROJECT_WIKI_ATTACHMENT_IMAGE_HTML);
+ renderMarkdown.mockResolvedValue(html);
});
describe('when uploading succeeds', () => {
const successResponse = {
link: {
- markdown: '![test-file](test-file.png)',
+ markdown: `![test-file](${file.name})`,
},
};
@@ -121,21 +155,21 @@ describe('content_editor/extensions/attachment', () => {
mock.onPost().reply(httpStatus.OK, successResponse);
});
- it('inserts an image with src set to the encoded image file and uploading true', async () => {
- const expectedDoc = doc(p(image({ uploading: true, src: base64EncodedFile })));
+ it('inserts a media content with src set to the encoded content and uploading true', async () => {
+ const expectedDoc = doc(p(mediaType({ uploading: true, src: base64EncodedFile })));
await expectDocumentAfterTransaction({
number: 1,
expectedDoc,
- action: () => tiptapEditor.commands.uploadAttachment({ file: imageFile }),
+ action: () => tiptapEditor.commands.uploadAttachment({ file }),
});
});
- it('updates the inserted image with canonicalSrc when upload is successful', async () => {
+ it('updates the inserted content with canonicalSrc when upload is successful', async () => {
const expectedDoc = doc(
p(
- image({
- canonicalSrc: 'test-file.png',
+ mediaType({
+ canonicalSrc: file.name,
src: base64EncodedFile,
alt: 'test-file',
uploading: false,
@@ -146,7 +180,7 @@ describe('content_editor/extensions/attachment', () => {
await expectDocumentAfterTransaction({
number: 2,
expectedDoc,
- action: () => tiptapEditor.commands.uploadAttachment({ file: imageFile }),
+ action: () => tiptapEditor.commands.uploadAttachment({ file }),
});
});
});
@@ -162,17 +196,19 @@ describe('content_editor/extensions/attachment', () => {
await expectDocumentAfterTransaction({
number: 2,
expectedDoc,
- action: () => tiptapEditor.commands.uploadAttachment({ file: imageFile }),
+ action: () => tiptapEditor.commands.uploadAttachment({ file }),
});
});
- it('emits an alert event that includes an error message', (done) => {
- tiptapEditor.commands.uploadAttachment({ file: imageFile });
+ it('emits an alert event that includes an error message', () => {
+ tiptapEditor.commands.uploadAttachment({ file });
- eventHub.$on('alert', ({ message, variant }) => {
- expect(variant).toBe(VARIANT_DANGER);
- expect(message).toBe('An error occurred while uploading the image. Please try again.');
- done();
+ return new Promise((resolve) => {
+ eventHub.$on('alert', ({ message, variant }) => {
+ expect(variant).toBe(VARIANT_DANGER);
+ expect(message).toBe('An error occurred while uploading the file. Please try again.');
+ resolve();
+ });
});
});
});
@@ -243,13 +279,12 @@ describe('content_editor/extensions/attachment', () => {
});
});
- it('emits an alert event that includes an error message', (done) => {
+ it('emits an alert event that includes an error message', () => {
tiptapEditor.commands.uploadAttachment({ file: attachmentFile });
eventHub.$on('alert', ({ message, variant }) => {
expect(variant).toBe(VARIANT_DANGER);
expect(message).toBe('An error occurred while uploading the file. Please try again.');
- done();
});
});
});
diff --git a/spec/frontend/content_editor/extensions/code_block_highlight_spec.js b/spec/frontend/content_editor/extensions/code_block_highlight_spec.js
index 05fa0f79ef0..02e5b1dc271 100644
--- a/spec/frontend/content_editor/extensions/code_block_highlight_spec.js
+++ b/spec/frontend/content_editor/extensions/code_block_highlight_spec.js
@@ -1,5 +1,5 @@
import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
-import { createTestEditor } from '../test_utils';
+import { createTestEditor, createDocBuilder, triggerNodeInputRule } from '../test_utils';
const CODE_BLOCK_HTML = `<pre class="code highlight js-syntax-highlight language-javascript" lang="javascript" v-pre="true">
<code>
@@ -12,34 +12,78 @@ const CODE_BLOCK_HTML = `<pre class="code highlight js-syntax-highlight language
describe('content_editor/extensions/code_block_highlight', () => {
let parsedCodeBlockHtmlFixture;
let tiptapEditor;
+ let doc;
+ let codeBlock;
+ let languageLoader;
const parseHTML = (html) => new DOMParser().parseFromString(html, 'text/html');
const preElement = () => parsedCodeBlockHtmlFixture.querySelector('pre');
beforeEach(() => {
- tiptapEditor = createTestEditor({ extensions: [CodeBlockHighlight] });
- parsedCodeBlockHtmlFixture = parseHTML(CODE_BLOCK_HTML);
+ languageLoader = { loadLanguages: jest.fn() };
+ tiptapEditor = createTestEditor({
+ extensions: [CodeBlockHighlight.configure({ languageLoader })],
+ });
- tiptapEditor.commands.setContent(CODE_BLOCK_HTML);
+ ({
+ builders: { doc, codeBlock },
+ } = createDocBuilder({
+ tiptapEditor,
+ names: {
+ codeBlock: { nodeType: CodeBlockHighlight.name },
+ },
+ }));
});
- it('extracts language and params attributes from Markdown API output', () => {
- const language = preElement().getAttribute('lang');
+ describe('when parsing HTML', () => {
+ beforeEach(() => {
+ parsedCodeBlockHtmlFixture = parseHTML(CODE_BLOCK_HTML);
- expect(tiptapEditor.getJSON().content[0].attrs).toMatchObject({
- language,
+ tiptapEditor.commands.setContent(CODE_BLOCK_HTML);
+ });
+ it('extracts language and params attributes from Markdown API output', () => {
+ const language = preElement().getAttribute('lang');
+
+ expect(tiptapEditor.getJSON().content[0].attrs).toMatchObject({
+ language,
+ });
+ });
+
+ it('adds code, highlight, and js-syntax-highlight to code block element', () => {
+ const editorHtmlOutput = parseHTML(tiptapEditor.getHTML()).querySelector('pre');
+
+ expect(editorHtmlOutput.classList.toString()).toContain('code highlight js-syntax-highlight');
});
- });
- it('adds code, highlight, and js-syntax-highlight to code block element', () => {
- const editorHtmlOutput = parseHTML(tiptapEditor.getHTML()).querySelector('pre');
+ it('adds content-editor-code-block class to the pre element', () => {
+ const editorHtmlOutput = parseHTML(tiptapEditor.getHTML()).querySelector('pre');
- expect(editorHtmlOutput.classList.toString()).toContain('code highlight js-syntax-highlight');
+ expect(editorHtmlOutput.classList.toString()).toContain('content-editor-code-block');
+ });
});
- it('adds content-editor-code-block class to the pre element', () => {
- const editorHtmlOutput = parseHTML(tiptapEditor.getHTML()).querySelector('pre');
+ describe.each`
+ inputRule
+ ${'```'}
+ ${'~~~'}
+ `('when typing $inputRule input rule', ({ inputRule }) => {
+ const language = 'javascript';
+
+ beforeEach(() => {
+ triggerNodeInputRule({
+ tiptapEditor,
+ inputRuleText: `${inputRule}${language} `,
+ });
+ });
+
+ it('creates a new code block and loads related language', () => {
+ const expectedDoc = doc(codeBlock({ language }));
- expect(editorHtmlOutput.classList.toString()).toContain('content-editor-code-block');
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+
+ it('loads language when language loader is available', () => {
+ expect(languageLoader.loadLanguages).toHaveBeenCalledWith([language]);
+ });
});
});
diff --git a/spec/frontend/content_editor/extensions/frontmatter_spec.js b/spec/frontend/content_editor/extensions/frontmatter_spec.js
index a8cbad6ef81..4f80c2cb81a 100644
--- a/spec/frontend/content_editor/extensions/frontmatter_spec.js
+++ b/spec/frontend/content_editor/extensions/frontmatter_spec.js
@@ -23,7 +23,7 @@ describe('content_editor/extensions/frontmatter', () => {
});
it('does not insert a frontmatter block when executing code block input rule', () => {
- const expectedDoc = doc(codeBlock(''));
+ const expectedDoc = doc(codeBlock({ language: 'plaintext' }, ''));
const inputRuleText = '``` ';
triggerNodeInputRule({ tiptapEditor, inputRuleText });
diff --git a/spec/frontend/content_editor/services/code_block_language_loader_spec.js b/spec/frontend/content_editor/services/code_block_language_loader_spec.js
new file mode 100644
index 00000000000..905c1685b94
--- /dev/null
+++ b/spec/frontend/content_editor/services/code_block_language_loader_spec.js
@@ -0,0 +1,120 @@
+import codeBlockLanguageBlocker from '~/content_editor/services/code_block_language_loader';
+import waitForPromises from 'helpers/wait_for_promises';
+import { backtickInputRegex } from '~/content_editor/extensions/code_block_highlight';
+
+describe('content_editor/services/code_block_language_loader', () => {
+ let languageLoader;
+ let lowlight;
+
+ beforeEach(() => {
+ lowlight = {
+ languages: [],
+ registerLanguage: jest
+ .fn()
+ .mockImplementation((language) => lowlight.languages.push(language)),
+ registered: jest.fn().mockImplementation((language) => lowlight.languages.includes(language)),
+ };
+ languageLoader = codeBlockLanguageBlocker;
+ languageLoader.lowlight = lowlight;
+ });
+
+ describe('findLanguageBySyntax', () => {
+ it.each`
+ syntax | language
+ ${'javascript'} | ${{ syntax: 'javascript', label: 'Javascript' }}
+ ${'js'} | ${{ syntax: 'javascript', label: 'Javascript' }}
+ ${'jsx'} | ${{ syntax: 'javascript', label: 'Javascript' }}
+ `('returns a language by syntax and its variants', ({ syntax, language }) => {
+ expect(languageLoader.findLanguageBySyntax(syntax)).toMatchObject(language);
+ });
+
+ it('returns Custom (syntax) if the language does not exist', () => {
+ expect(languageLoader.findLanguageBySyntax('foobar')).toMatchObject({
+ syntax: 'foobar',
+ label: 'Custom (foobar)',
+ });
+ });
+
+ it('returns plaintext if no syntax is passed', () => {
+ expect(languageLoader.findLanguageBySyntax('')).toMatchObject({
+ syntax: 'plaintext',
+ label: 'Plain text',
+ });
+ });
+ });
+
+ describe('filterLanguages', () => {
+ it('filters languages by the given search term', () => {
+ expect(languageLoader.filterLanguages('ts')).toEqual([
+ { label: 'Device Tree', syntax: 'dts' },
+ { label: 'Kotlin', syntax: 'kotlin', variants: 'kt, kts' },
+ { label: 'TypeScript', syntax: 'typescript', variants: 'ts, tsx' },
+ ]);
+ });
+ });
+
+ describe('loadLanguages', () => {
+ it('loads highlight.js language packages identified by a list of languages', async () => {
+ const languages = ['javascript', 'ruby'];
+
+ await languageLoader.loadLanguages(languages);
+
+ languages.forEach((language) => {
+ expect(lowlight.registerLanguage).toHaveBeenCalledWith(language, expect.any(Function));
+ });
+ });
+
+ describe('when language is already registered', () => {
+ it('does not load the language again', async () => {
+ const languages = ['javascript'];
+
+ await languageLoader.loadLanguages(languages);
+ await languageLoader.loadLanguages(languages);
+
+ expect(lowlight.registerLanguage).toHaveBeenCalledTimes(1);
+ });
+ });
+ });
+
+ describe('loadLanguagesFromDOM', () => {
+ it('loads highlight.js language packages identified by pre tags in a DOM fragment', async () => {
+ const parser = new DOMParser();
+ const { body } = parser.parseFromString(
+ `
+ <pre lang="javascript"></pre>
+ <pre lang="ruby"></pre>
+ `,
+ 'text/html',
+ );
+
+ await languageLoader.loadLanguagesFromDOM(body);
+
+ expect(lowlight.registerLanguage).toHaveBeenCalledWith('javascript', expect.any(Function));
+ expect(lowlight.registerLanguage).toHaveBeenCalledWith('ruby', expect.any(Function));
+ });
+ });
+
+ describe('loadLanguageFromInputRule', () => {
+ it('loads highlight.js language packages identified from the input rule', async () => {
+ const match = new RegExp(backtickInputRegex).exec('```js ');
+ const attrs = languageLoader.loadLanguageFromInputRule(match);
+
+ await waitForPromises();
+
+ expect(attrs).toEqual({ language: 'javascript' });
+ expect(lowlight.registerLanguage).toHaveBeenCalledWith('javascript', expect.any(Function));
+ });
+ });
+
+ describe('isLanguageLoaded', () => {
+ it('returns true when a language is registered', async () => {
+ const language = 'javascript';
+
+ expect(languageLoader.isLanguageLoaded(language)).toBe(false);
+
+ await languageLoader.loadLanguages([language]);
+
+ expect(languageLoader.isLanguageLoaded(language)).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/services/content_editor_spec.js b/spec/frontend/content_editor/services/content_editor_spec.js
index 3bc72b13302..5b7a27b501d 100644
--- a/spec/frontend/content_editor/services/content_editor_spec.js
+++ b/spec/frontend/content_editor/services/content_editor_spec.js
@@ -11,6 +11,7 @@ describe('content_editor/services/content_editor', () => {
let contentEditor;
let serializer;
let deserializer;
+ let languageLoader;
let eventHub;
let doc;
let p;
@@ -27,8 +28,15 @@ describe('content_editor/services/content_editor', () => {
serializer = { deserialize: jest.fn() };
deserializer = { deserialize: jest.fn() };
+ languageLoader = { loadLanguagesFromDOM: jest.fn() };
eventHub = eventHubFactory();
- contentEditor = new ContentEditor({ tiptapEditor, serializer, deserializer, eventHub });
+ contentEditor = new ContentEditor({
+ tiptapEditor,
+ serializer,
+ deserializer,
+ eventHub,
+ languageLoader,
+ });
});
describe('.dispose', () => {
@@ -43,10 +51,12 @@ describe('content_editor/services/content_editor', () => {
describe('when setSerializedContent succeeds', () => {
let document;
+ const dom = {};
+ const testMarkdown = '**bold text**';
beforeEach(() => {
document = doc(p('document'));
- deserializer.deserialize.mockResolvedValueOnce({ document });
+ deserializer.deserialize.mockResolvedValueOnce({ document, dom });
});
it('emits loadingContent and loadingSuccess event in the eventHub', () => {
@@ -59,14 +69,20 @@ describe('content_editor/services/content_editor', () => {
expect(loadingContentEmitted).toBe(true);
});
- contentEditor.setSerializedContent('**bold text**');
+ contentEditor.setSerializedContent(testMarkdown);
});
it('sets the deserialized document in the tiptap editor object', async () => {
- await contentEditor.setSerializedContent('**bold text**');
+ await contentEditor.setSerializedContent(testMarkdown);
expect(contentEditor.tiptapEditor.state.doc.toJSON()).toEqual(document.toJSON());
});
+
+ it('passes deserialized DOM document to language loader', async () => {
+ await contentEditor.setSerializedContent(testMarkdown);
+
+ expect(languageLoader.loadLanguagesFromDOM).toHaveBeenCalledWith(dom);
+ });
});
describe('when setSerializedContent fails', () => {
diff --git a/spec/frontend/contributors/store/actions_spec.js b/spec/frontend/contributors/store/actions_spec.js
index a4054ab1fc8..ef0ff8ca208 100644
--- a/spec/frontend/contributors/store/actions_spec.js
+++ b/spec/frontend/contributors/store/actions_spec.js
@@ -17,10 +17,14 @@ describe('Contributors store actions', () => {
mock = new MockAdapter(axios);
});
- it('should commit SET_CHART_DATA with received response', (done) => {
+ afterEach(() => {
+ mock.restore();
+ });
+
+ it('should commit SET_CHART_DATA with received response', () => {
mock.onGet().reply(200, chartData);
- testAction(
+ return testAction(
actions.fetchChartData,
{ endpoint },
{},
@@ -30,30 +34,22 @@ describe('Contributors store actions', () => {
{ type: types.SET_LOADING_STATE, payload: false },
],
[],
- () => {
- mock.restore();
- done();
- },
);
});
- it('should show flash on API error', (done) => {
+ it('should show flash on API error', async () => {
mock.onGet().reply(400, 'Not Found');
- testAction(
+ await testAction(
actions.fetchChartData,
{ endpoint },
{},
[{ type: types.SET_LOADING_STATE, payload: true }],
[],
- () => {
- expect(createFlash).toHaveBeenCalledWith({
- message: expect.stringMatching('error'),
- });
- mock.restore();
- done();
- },
);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: expect.stringMatching('error'),
+ });
});
});
});
diff --git a/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js b/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js
index 55c502b96bb..c365cb6a9f4 100644
--- a/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js
+++ b/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js
@@ -14,53 +14,49 @@ import {
describe('GCP Cluster Dropdown Store Actions', () => {
describe('setProject', () => {
- it('should set project', (done) => {
- testAction(
+ it('should set project', () => {
+ return testAction(
actions.setProject,
selectedProjectMock,
{ selectedProject: {} },
[{ type: 'SET_PROJECT', payload: selectedProjectMock }],
[],
- done,
);
});
});
describe('setZone', () => {
- it('should set zone', (done) => {
- testAction(
+ it('should set zone', () => {
+ return testAction(
actions.setZone,
selectedZoneMock,
{ selectedZone: '' },
[{ type: 'SET_ZONE', payload: selectedZoneMock }],
[],
- done,
);
});
});
describe('setMachineType', () => {
- it('should set machine type', (done) => {
- testAction(
+ it('should set machine type', () => {
+ return testAction(
actions.setMachineType,
selectedMachineTypeMock,
{ selectedMachineType: '' },
[{ type: 'SET_MACHINE_TYPE', payload: selectedMachineTypeMock }],
[],
- done,
);
});
});
describe('setIsValidatingProjectBilling', () => {
- it('should set machine type', (done) => {
- testAction(
+ it('should set machine type', () => {
+ return testAction(
actions.setIsValidatingProjectBilling,
true,
{ isValidatingProjectBilling: null },
[{ type: 'SET_IS_VALIDATING_PROJECT_BILLING', payload: true }],
[],
- done,
);
});
});
@@ -94,8 +90,8 @@ describe('GCP Cluster Dropdown Store Actions', () => {
});
describe('validateProjectBilling', () => {
- it('checks project billing status from Google API', (done) => {
- testAction(
+ it('checks project billing status from Google API', () => {
+ return testAction(
actions.validateProjectBilling,
true,
{
@@ -110,7 +106,6 @@ describe('GCP Cluster Dropdown Store Actions', () => {
{ type: 'SET_PROJECT_BILLING_STATUS', payload: true },
],
[{ type: 'setIsValidatingProjectBilling', payload: false }],
- done,
);
});
});
diff --git a/spec/frontend/crm/contact_form_spec.js b/spec/frontend/crm/contact_form_spec.js
deleted file mode 100644
index 0edab4f5ec5..00000000000
--- a/spec/frontend/crm/contact_form_spec.js
+++ /dev/null
@@ -1,157 +0,0 @@
-import { GlAlert } from '@gitlab/ui';
-import Vue from 'vue';
-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 ContactForm from '~/crm/components/contact_form.vue';
-import createContactMutation from '~/crm/components/queries/create_contact.mutation.graphql';
-import updateContactMutation from '~/crm/components/queries/update_contact.mutation.graphql';
-import getGroupContactsQuery from '~/crm/components/queries/get_group_contacts.query.graphql';
-import {
- createContactMutationErrorResponse,
- createContactMutationResponse,
- getGroupContactsQueryResponse,
- updateContactMutationErrorResponse,
- updateContactMutationResponse,
-} from './mock_data';
-
-describe('Customer relations contact form component', () => {
- Vue.use(VueApollo);
- let wrapper;
- let fakeApollo;
- let mutation;
- let queryHandler;
-
- const findSaveContactButton = () => wrapper.findByTestId('save-contact-button');
- const findCancelButton = () => wrapper.findByTestId('cancel-button');
- const findForm = () => wrapper.find('form');
- const findError = () => wrapper.findComponent(GlAlert);
-
- const mountComponent = ({ mountFunction = shallowMountExtended, editForm = false } = {}) => {
- fakeApollo = createMockApollo([[mutation, queryHandler]]);
- fakeApollo.clients.defaultClient.cache.writeQuery({
- query: getGroupContactsQuery,
- variables: { groupFullPath: 'flightjs' },
- data: getGroupContactsQueryResponse.data,
- });
- const propsData = { drawerOpen: true };
- if (editForm)
- propsData.contact = { firstName: 'First', lastName: 'Last', email: 'email@example.com' };
- wrapper = mountFunction(ContactForm, {
- provide: { groupId: 26, groupFullPath: 'flightjs' },
- apolloProvider: fakeApollo,
- propsData,
- });
- };
-
- beforeEach(() => {
- mutation = createContactMutation;
- queryHandler = jest.fn().mockResolvedValue(createContactMutationResponse);
- });
-
- afterEach(() => {
- wrapper.destroy();
- fakeApollo = null;
- });
-
- describe('Save contact button', () => {
- it('should be disabled when required fields are empty', () => {
- mountComponent();
-
- expect(findSaveContactButton().props('disabled')).toBe(true);
- });
-
- it('should not be disabled when required fields have values', async () => {
- mountComponent();
-
- wrapper.find('#contact-first-name').vm.$emit('input', 'A');
- wrapper.find('#contact-last-name').vm.$emit('input', 'B');
- wrapper.find('#contact-email').vm.$emit('input', 'C');
- await waitForPromises();
-
- expect(findSaveContactButton().props('disabled')).toBe(false);
- });
- });
-
- it("should emit 'close' when cancel button is clicked", () => {
- mountComponent();
-
- findCancelButton().vm.$emit('click');
-
- expect(wrapper.emitted().close).toBeTruthy();
- });
-
- describe('when create mutation is successful', () => {
- it("should emit 'close'", async () => {
- mountComponent();
-
- findForm().trigger('submit');
- await waitForPromises();
-
- expect(wrapper.emitted().close).toBeTruthy();
- });
- });
-
- describe('when create mutation fails', () => {
- it('should show error on reject', async () => {
- queryHandler = jest.fn().mockRejectedValue('ERROR');
- mountComponent();
-
- findForm().trigger('submit');
- await waitForPromises();
-
- expect(findError().exists()).toBe(true);
- });
-
- it('should show error on error response', async () => {
- queryHandler = jest.fn().mockResolvedValue(createContactMutationErrorResponse);
- mountComponent();
-
- findForm().trigger('submit');
- await waitForPromises();
-
- expect(findError().exists()).toBe(true);
- expect(findError().text()).toBe('create contact is invalid.');
- });
- });
-
- describe('when update mutation is successful', () => {
- it("should emit 'close'", async () => {
- mutation = updateContactMutation;
- queryHandler = jest.fn().mockResolvedValue(updateContactMutationResponse);
- mountComponent({ editForm: true });
-
- findForm().trigger('submit');
- await waitForPromises();
-
- expect(wrapper.emitted().close).toBeTruthy();
- });
- });
-
- describe('when update mutation fails', () => {
- beforeEach(() => {
- mutation = updateContactMutation;
- });
-
- it('should show error on reject', async () => {
- queryHandler = jest.fn().mockRejectedValue('ERROR');
- mountComponent({ editForm: true });
- findForm().trigger('submit');
- await waitForPromises();
-
- expect(findError().exists()).toBe(true);
- });
-
- it('should show error on error response', async () => {
- queryHandler = jest.fn().mockResolvedValue(updateContactMutationErrorResponse);
- mountComponent({ editForm: true });
-
- findForm().trigger('submit');
- await waitForPromises();
-
- expect(findError().exists()).toBe(true);
- expect(findError().text()).toBe('update contact is invalid.');
- });
- });
-});
diff --git a/spec/frontend/crm/contact_form_wrapper_spec.js b/spec/frontend/crm/contact_form_wrapper_spec.js
new file mode 100644
index 00000000000..6307889a7aa
--- /dev/null
+++ b/spec/frontend/crm/contact_form_wrapper_spec.js
@@ -0,0 +1,88 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ContactFormWrapper from '~/crm/contacts/components/contact_form_wrapper.vue';
+import ContactForm from '~/crm/components/form.vue';
+import getGroupContactsQuery from '~/crm/contacts/components/graphql/get_group_contacts.query.graphql';
+import createContactMutation from '~/crm/contacts/components/graphql/create_contact.mutation.graphql';
+import updateContactMutation from '~/crm/contacts/components/graphql/update_contact.mutation.graphql';
+
+describe('Customer relations contact form wrapper', () => {
+ let wrapper;
+
+ const findContactForm = () => wrapper.findComponent(ContactForm);
+
+ const $apollo = {
+ queries: {
+ contacts: {
+ loading: false,
+ },
+ },
+ };
+ const $route = {
+ params: {
+ id: 7,
+ },
+ };
+ const contacts = [{ id: 'gid://gitlab/CustomerRelations::Contact/7' }];
+
+ const mountComponent = ({ isEditMode = false } = {}) => {
+ wrapper = shallowMountExtended(ContactFormWrapper, {
+ propsData: {
+ isEditMode,
+ },
+ provide: {
+ groupFullPath: 'flightjs',
+ groupId: 26,
+ },
+ mocks: {
+ $apollo,
+ $route,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('in edit mode', () => {
+ it('should render contact form with correct props', () => {
+ mountComponent({ isEditMode: true });
+
+ const contactForm = findContactForm();
+ expect(contactForm.props('fields')).toHaveLength(5);
+ expect(contactForm.props('title')).toBe('Edit contact');
+ expect(contactForm.props('successMessage')).toBe('Contact has been updated.');
+ expect(contactForm.props('mutation')).toBe(updateContactMutation);
+ expect(contactForm.props('getQuery')).toMatchObject({
+ query: getGroupContactsQuery,
+ variables: { groupFullPath: 'flightjs' },
+ });
+ expect(contactForm.props('getQueryNodePath')).toBe('group.contacts');
+ expect(contactForm.props('existingId')).toBe(contacts[0].id);
+ expect(contactForm.props('additionalCreateParams')).toMatchObject({
+ groupId: 'gid://gitlab/Group/26',
+ });
+ });
+ });
+
+ describe('in create mode', () => {
+ it('should render contact form with correct props', () => {
+ mountComponent();
+
+ const contactForm = findContactForm();
+ expect(contactForm.props('fields')).toHaveLength(5);
+ expect(contactForm.props('title')).toBe('New contact');
+ expect(contactForm.props('successMessage')).toBe('Contact has been added.');
+ expect(contactForm.props('mutation')).toBe(createContactMutation);
+ expect(contactForm.props('getQuery')).toMatchObject({
+ query: getGroupContactsQuery,
+ variables: { groupFullPath: 'flightjs' },
+ });
+ expect(contactForm.props('getQueryNodePath')).toBe('group.contacts');
+ expect(contactForm.props('existingId')).toBeNull();
+ expect(contactForm.props('additionalCreateParams')).toMatchObject({
+ groupId: 'gid://gitlab/Group/26',
+ });
+ });
+ });
+});
diff --git a/spec/frontend/crm/contacts_root_spec.js b/spec/frontend/crm/contacts_root_spec.js
index b30349305a3..b02d94e9cb1 100644
--- a/spec/frontend/crm/contacts_root_spec.js
+++ b/spec/frontend/crm/contacts_root_spec.js
@@ -5,11 +5,9 @@ import VueRouter from 'vue-router';
import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
-import ContactsRoot from '~/crm/components/contacts_root.vue';
-import ContactForm from '~/crm/components/contact_form.vue';
-import getGroupContactsQuery from '~/crm/components/queries/get_group_contacts.query.graphql';
-import { NEW_ROUTE_NAME, EDIT_ROUTE_NAME } from '~/crm/constants';
-import routes from '~/crm/routes';
+import ContactsRoot from '~/crm/contacts/components/contacts_root.vue';
+import getGroupContactsQuery from '~/crm/contacts/components/graphql/get_group_contacts.query.graphql';
+import routes from '~/crm/contacts/routes';
import { getGroupContactsQueryResponse } from './mock_data';
describe('Customer relations contacts root app', () => {
@@ -23,8 +21,6 @@ describe('Customer relations contacts root app', () => {
const findRowByName = (rowName) => wrapper.findAllByRole('row', { name: rowName });
const findIssuesLinks = () => wrapper.findAllByTestId('issues-link');
const findNewContactButton = () => wrapper.findByTestId('new-contact-button');
- const findEditContactButton = () => wrapper.findByTestId('edit-contact-button');
- const findContactForm = () => wrapper.findComponent(ContactForm);
const findError = () => wrapper.findComponent(GlAlert);
const successQueryHandler = jest.fn().mockResolvedValue(getGroupContactsQueryResponse);
@@ -40,8 +36,8 @@ describe('Customer relations contacts root app', () => {
router,
provide: {
groupFullPath: 'flightjs',
- groupIssuesPath: '/issues',
groupId: 26,
+ groupIssuesPath: '/issues',
canAdminCrmContact,
},
apolloProvider: fakeApollo,
@@ -82,71 +78,6 @@ describe('Customer relations contacts root app', () => {
});
});
- describe('contact form', () => {
- it('should not exist by default', async () => {
- mountComponent();
- await waitForPromises();
-
- expect(findContactForm().exists()).toBe(false);
- });
-
- it('should exist when user clicks new contact button', async () => {
- mountComponent();
-
- findNewContactButton().vm.$emit('click');
- await waitForPromises();
-
- expect(findContactForm().exists()).toBe(true);
- });
-
- it('should exist when user navigates directly to `new` route', async () => {
- router.replace({ name: NEW_ROUTE_NAME });
- mountComponent();
- await waitForPromises();
-
- expect(findContactForm().exists()).toBe(true);
- });
-
- it('should exist when user clicks edit contact button', async () => {
- mountComponent({ mountFunction: mountExtended });
- await waitForPromises();
-
- findEditContactButton().vm.$emit('click');
- await waitForPromises();
-
- expect(findContactForm().exists()).toBe(true);
- });
-
- it('should exist when user navigates directly to `edit` route', async () => {
- router.replace({ name: EDIT_ROUTE_NAME, params: { id: 16 } });
- mountComponent();
- await waitForPromises();
-
- expect(findContactForm().exists()).toBe(true);
- });
-
- it('should not exist when new form emits close', async () => {
- router.replace({ name: NEW_ROUTE_NAME });
- mountComponent();
-
- findContactForm().vm.$emit('close');
- await waitForPromises();
-
- expect(findContactForm().exists()).toBe(false);
- });
-
- it('should not exist when edit form emits close', async () => {
- router.replace({ name: EDIT_ROUTE_NAME, params: { id: 16 } });
- mountComponent();
- await waitForPromises();
-
- findContactForm().vm.$emit('close');
- await waitForPromises();
-
- expect(findContactForm().exists()).toBe(false);
- });
- });
-
describe('error', () => {
it('should exist on reject', async () => {
mountComponent({ queryHandler: jest.fn().mockRejectedValue('ERROR') });
diff --git a/spec/frontend/crm/form_spec.js b/spec/frontend/crm/form_spec.js
index 0e3abc05c37..5c349b24ea1 100644
--- a/spec/frontend/crm/form_spec.js
+++ b/spec/frontend/crm/form_spec.js
@@ -6,12 +6,12 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import Form from '~/crm/components/form.vue';
-import routes from '~/crm/routes';
-import createContactMutation from '~/crm/components/queries/create_contact.mutation.graphql';
-import updateContactMutation from '~/crm/components/queries/update_contact.mutation.graphql';
-import getGroupContactsQuery from '~/crm/components/queries/get_group_contacts.query.graphql';
-import createOrganizationMutation from '~/crm/components/queries/create_organization.mutation.graphql';
-import getGroupOrganizationsQuery from '~/crm/components/queries/get_group_organizations.query.graphql';
+import routes from '~/crm/contacts/routes';
+import createContactMutation from '~/crm/contacts/components/graphql/create_contact.mutation.graphql';
+import updateContactMutation from '~/crm/contacts/components/graphql/update_contact.mutation.graphql';
+import getGroupContactsQuery from '~/crm/contacts/components/graphql/get_group_contacts.query.graphql';
+import createOrganizationMutation from '~/crm/organizations/components/graphql/create_organization.mutation.graphql';
+import getGroupOrganizationsQuery from '~/crm/organizations/components/graphql/get_group_organizations.query.graphql';
import {
createContactMutationErrorResponse,
createContactMutationResponse,
@@ -101,6 +101,11 @@ describe('Reusable form component', () => {
{ name: 'phone', label: 'Phone' },
{ name: 'description', label: 'Description' },
],
+ getQuery: {
+ query: getGroupContactsQuery,
+ variables: { groupFullPath: 'flightjs' },
+ },
+ getQueryNodePath: 'group.contacts',
...propsData,
});
};
@@ -108,13 +113,8 @@ describe('Reusable form component', () => {
const mountContactCreate = () => {
const propsData = {
title: 'New contact',
- successMessage: 'Contact has been added',
+ successMessage: 'Contact has been added.',
buttonLabel: 'Create contact',
- getQuery: {
- query: getGroupContactsQuery,
- variables: { groupFullPath: 'flightjs' },
- },
- getQueryNodePath: 'group.contacts',
mutation: createContactMutation,
additionalCreateParams: { groupId: 'gid://gitlab/Group/26' },
};
@@ -124,14 +124,9 @@ describe('Reusable form component', () => {
const mountContactUpdate = () => {
const propsData = {
title: 'Edit contact',
- successMessage: 'Contact has been updated',
+ successMessage: 'Contact has been updated.',
mutation: updateContactMutation,
- existingModel: {
- id: 'gid://gitlab/CustomerRelations::Contact/12',
- firstName: 'First',
- lastName: 'Last',
- email: 'email@example.com',
- },
+ existingId: 'gid://gitlab/CustomerRelations::Contact/12',
};
mountContact({ propsData });
};
@@ -143,6 +138,11 @@ describe('Reusable form component', () => {
{ name: 'defaultRate', label: 'Default rate', input: { type: 'number', step: '0.01' } },
{ name: 'description', label: 'Description' },
],
+ getQuery: {
+ query: getGroupOrganizationsQuery,
+ variables: { groupFullPath: 'flightjs' },
+ },
+ getQueryNodePath: 'group.organizations',
...propsData,
});
};
@@ -150,13 +150,8 @@ describe('Reusable form component', () => {
const mountOrganizationCreate = () => {
const propsData = {
title: 'New organization',
- successMessage: 'Organization has been added',
+ successMessage: 'Organization has been added.',
buttonLabel: 'Create organization',
- getQuery: {
- query: getGroupOrganizationsQuery,
- variables: { groupFullPath: 'flightjs' },
- },
- getQueryNodePath: 'group.organizations',
mutation: createOrganizationMutation,
additionalCreateParams: { groupId: 'gid://gitlab/Group/26' },
};
@@ -167,17 +162,17 @@ describe('Reusable form component', () => {
[FORM_CREATE_CONTACT]: {
mountFunction: mountContactCreate,
mutationErrorResponse: createContactMutationErrorResponse,
- toastMessage: 'Contact has been added',
+ toastMessage: 'Contact has been added.',
},
[FORM_UPDATE_CONTACT]: {
mountFunction: mountContactUpdate,
mutationErrorResponse: updateContactMutationErrorResponse,
- toastMessage: 'Contact has been updated',
+ toastMessage: 'Contact has been updated.',
},
[FORM_CREATE_ORG]: {
mountFunction: mountOrganizationCreate,
mutationErrorResponse: createOrganizationMutationErrorResponse,
- toastMessage: 'Organization has been added',
+ toastMessage: 'Organization has been added.',
},
};
const asTestParams = (...keys) => keys.map((name) => [name, forms[name]]);
diff --git a/spec/frontend/crm/mock_data.js b/spec/frontend/crm/mock_data.js
index e351e101b29..35bc7fb69b4 100644
--- a/spec/frontend/crm/mock_data.js
+++ b/spec/frontend/crm/mock_data.js
@@ -157,3 +157,28 @@ export const createOrganizationMutationErrorResponse = {
},
},
};
+
+export const updateOrganizationMutationResponse = {
+ data: {
+ customerRelationsOrganizationUpdate: {
+ __typeName: 'CustomerRelationsOrganizationUpdatePayload',
+ organization: {
+ __typename: 'CustomerRelationsOrganization',
+ id: 'gid://gitlab/CustomerRelations::Organization/2',
+ name: 'A',
+ defaultRate: null,
+ description: null,
+ },
+ errors: [],
+ },
+ },
+};
+
+export const updateOrganizationMutationErrorResponse = {
+ data: {
+ customerRelationsOrganizationUpdate: {
+ organization: null,
+ errors: ['Description is invalid.'],
+ },
+ },
+};
diff --git a/spec/frontend/crm/new_organization_form_spec.js b/spec/frontend/crm/new_organization_form_spec.js
deleted file mode 100644
index 0a7909774c9..00000000000
--- a/spec/frontend/crm/new_organization_form_spec.js
+++ /dev/null
@@ -1,109 +0,0 @@
-import { GlAlert } from '@gitlab/ui';
-import Vue from 'vue';
-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 NewOrganizationForm from '~/crm/components/new_organization_form.vue';
-import createOrganizationMutation from '~/crm/components/queries/create_organization.mutation.graphql';
-import getGroupOrganizationsQuery from '~/crm/components/queries/get_group_organizations.query.graphql';
-import {
- createOrganizationMutationErrorResponse,
- createOrganizationMutationResponse,
- getGroupOrganizationsQueryResponse,
-} from './mock_data';
-
-describe('Customer relations organizations root app', () => {
- Vue.use(VueApollo);
- let wrapper;
- let fakeApollo;
- let queryHandler;
-
- const findCreateNewOrganizationButton = () =>
- wrapper.findByTestId('create-new-organization-button');
- const findCancelButton = () => wrapper.findByTestId('cancel-button');
- const findForm = () => wrapper.find('form');
- const findError = () => wrapper.findComponent(GlAlert);
-
- const mountComponent = () => {
- fakeApollo = createMockApollo([[createOrganizationMutation, queryHandler]]);
- fakeApollo.clients.defaultClient.cache.writeQuery({
- query: getGroupOrganizationsQuery,
- variables: { groupFullPath: 'flightjs' },
- data: getGroupOrganizationsQueryResponse.data,
- });
- wrapper = shallowMountExtended(NewOrganizationForm, {
- provide: { groupId: 26, groupFullPath: 'flightjs' },
- apolloProvider: fakeApollo,
- propsData: { drawerOpen: true },
- });
- };
-
- beforeEach(() => {
- queryHandler = jest.fn().mockResolvedValue(createOrganizationMutationResponse);
- });
-
- afterEach(() => {
- wrapper.destroy();
- fakeApollo = null;
- });
-
- describe('Create new organization button', () => {
- it('should be disabled by default', () => {
- mountComponent();
-
- expect(findCreateNewOrganizationButton().attributes('disabled')).toBeTruthy();
- });
-
- it('should not be disabled when first, last and email have values', async () => {
- mountComponent();
-
- wrapper.find('#organization-name').vm.$emit('input', 'A');
- await waitForPromises();
-
- expect(findCreateNewOrganizationButton().attributes('disabled')).toBeFalsy();
- });
- });
-
- it("should emit 'close' when cancel button is clicked", () => {
- mountComponent();
-
- findCancelButton().vm.$emit('click');
-
- expect(wrapper.emitted().close).toBeTruthy();
- });
-
- describe('when query is successful', () => {
- it("should emit 'close'", async () => {
- mountComponent();
-
- findForm().trigger('submit');
- await waitForPromises();
-
- expect(wrapper.emitted().close).toBeTruthy();
- });
- });
-
- describe('when query fails', () => {
- it('should show error on reject', async () => {
- queryHandler = jest.fn().mockRejectedValue('ERROR');
- mountComponent();
-
- findForm().trigger('submit');
- await waitForPromises();
-
- expect(findError().exists()).toBe(true);
- });
-
- it('should show error on error response', async () => {
- queryHandler = jest.fn().mockResolvedValue(createOrganizationMutationErrorResponse);
- mountComponent();
-
- findForm().trigger('submit');
- await waitForPromises();
-
- expect(findError().exists()).toBe(true);
- expect(findError().text()).toBe('create organization is invalid.');
- });
- });
-});
diff --git a/spec/frontend/crm/organization_form_wrapper_spec.js b/spec/frontend/crm/organization_form_wrapper_spec.js
new file mode 100644
index 00000000000..1a5a7c6ca5d
--- /dev/null
+++ b/spec/frontend/crm/organization_form_wrapper_spec.js
@@ -0,0 +1,88 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import OrganizationFormWrapper from '~/crm/organizations/components/organization_form_wrapper.vue';
+import OrganizationForm from '~/crm/components/form.vue';
+import getGroupOrganizationsQuery from '~/crm/organizations/components/graphql/get_group_organizations.query.graphql';
+import createOrganizationMutation from '~/crm/organizations/components/graphql/create_organization.mutation.graphql';
+import updateOrganizationMutation from '~/crm/organizations/components/graphql/update_organization.mutation.graphql';
+
+describe('Customer relations organization form wrapper', () => {
+ let wrapper;
+
+ const findOrganizationForm = () => wrapper.findComponent(OrganizationForm);
+
+ const $apollo = {
+ queries: {
+ organizations: {
+ loading: false,
+ },
+ },
+ };
+ const $route = {
+ params: {
+ id: 7,
+ },
+ };
+ const organizations = [{ id: 'gid://gitlab/CustomerRelations::Organization/7' }];
+
+ const mountComponent = ({ isEditMode = false } = {}) => {
+ wrapper = shallowMountExtended(OrganizationFormWrapper, {
+ propsData: {
+ isEditMode,
+ },
+ provide: {
+ groupFullPath: 'flightjs',
+ groupId: 26,
+ },
+ mocks: {
+ $apollo,
+ $route,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('in edit mode', () => {
+ it('should render organization form with correct props', () => {
+ mountComponent({ isEditMode: true });
+
+ const organizationForm = findOrganizationForm();
+ expect(organizationForm.props('fields')).toHaveLength(3);
+ expect(organizationForm.props('title')).toBe('Edit organization');
+ expect(organizationForm.props('successMessage')).toBe('Organization has been updated.');
+ expect(organizationForm.props('mutation')).toBe(updateOrganizationMutation);
+ expect(organizationForm.props('getQuery')).toMatchObject({
+ query: getGroupOrganizationsQuery,
+ variables: { groupFullPath: 'flightjs' },
+ });
+ expect(organizationForm.props('getQueryNodePath')).toBe('group.organizations');
+ expect(organizationForm.props('existingId')).toBe(organizations[0].id);
+ expect(organizationForm.props('additionalCreateParams')).toMatchObject({
+ groupId: 'gid://gitlab/Group/26',
+ });
+ });
+ });
+
+ describe('in create mode', () => {
+ it('should render organization form with correct props', () => {
+ mountComponent();
+
+ const organizationForm = findOrganizationForm();
+ expect(organizationForm.props('fields')).toHaveLength(3);
+ expect(organizationForm.props('title')).toBe('New organization');
+ expect(organizationForm.props('successMessage')).toBe('Organization has been added.');
+ expect(organizationForm.props('mutation')).toBe(createOrganizationMutation);
+ expect(organizationForm.props('getQuery')).toMatchObject({
+ query: getGroupOrganizationsQuery,
+ variables: { groupFullPath: 'flightjs' },
+ });
+ expect(organizationForm.props('getQueryNodePath')).toBe('group.organizations');
+ expect(organizationForm.props('existingId')).toBeNull();
+ expect(organizationForm.props('additionalCreateParams')).toMatchObject({
+ groupId: 'gid://gitlab/Group/26',
+ });
+ });
+ });
+});
diff --git a/spec/frontend/crm/organizations_root_spec.js b/spec/frontend/crm/organizations_root_spec.js
index aef417964f4..231208d938e 100644
--- a/spec/frontend/crm/organizations_root_spec.js
+++ b/spec/frontend/crm/organizations_root_spec.js
@@ -5,11 +5,9 @@ import VueRouter from 'vue-router';
import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
-import OrganizationsRoot from '~/crm/components/organizations_root.vue';
-import NewOrganizationForm from '~/crm/components/new_organization_form.vue';
-import { NEW_ROUTE_NAME } from '~/crm/constants';
-import routes from '~/crm/routes';
-import getGroupOrganizationsQuery from '~/crm/components/queries/get_group_organizations.query.graphql';
+import OrganizationsRoot from '~/crm/organizations/components/organizations_root.vue';
+import routes from '~/crm/organizations/routes';
+import getGroupOrganizationsQuery from '~/crm/organizations/components/graphql/get_group_organizations.query.graphql';
import { getGroupOrganizationsQueryResponse } from './mock_data';
describe('Customer relations organizations root app', () => {
@@ -23,7 +21,6 @@ describe('Customer relations organizations root app', () => {
const findRowByName = (rowName) => wrapper.findAllByRole('row', { name: rowName });
const findIssuesLinks = () => wrapper.findAllByTestId('issues-link');
const findNewOrganizationButton = () => wrapper.findByTestId('new-organization-button');
- const findNewOrganizationForm = () => wrapper.findComponent(NewOrganizationForm);
const findError = () => wrapper.findComponent(GlAlert);
const successQueryHandler = jest.fn().mockResolvedValue(getGroupOrganizationsQueryResponse);
@@ -37,7 +34,11 @@ describe('Customer relations organizations root app', () => {
fakeApollo = createMockApollo([[getGroupOrganizationsQuery, queryHandler]]);
wrapper = mountFunction(OrganizationsRoot, {
router,
- provide: { canAdminCrmOrganization, groupFullPath: 'flightjs', groupIssuesPath: '/issues' },
+ provide: {
+ canAdminCrmOrganization,
+ groupFullPath: 'flightjs',
+ groupIssuesPath: '/issues',
+ },
apolloProvider: fakeApollo,
});
};
@@ -76,42 +77,6 @@ describe('Customer relations organizations root app', () => {
});
});
- describe('new organization form', () => {
- it('should not exist by default', async () => {
- mountComponent();
- await waitForPromises();
-
- expect(findNewOrganizationForm().exists()).toBe(false);
- });
-
- it('should exist when user clicks new contact button', async () => {
- mountComponent();
-
- findNewOrganizationButton().vm.$emit('click');
- await waitForPromises();
-
- expect(findNewOrganizationForm().exists()).toBe(true);
- });
-
- it('should exist when user navigates directly to /new', async () => {
- router.replace({ name: NEW_ROUTE_NAME });
- mountComponent();
- await waitForPromises();
-
- expect(findNewOrganizationForm().exists()).toBe(true);
- });
-
- it('should not exist when form emits close', async () => {
- router.replace({ name: NEW_ROUTE_NAME });
- mountComponent();
-
- findNewOrganizationForm().vm.$emit('close');
- await waitForPromises();
-
- expect(findNewOrganizationForm().exists()).toBe(false);
- });
- });
-
it('should render error message on reject', async () => {
mountComponent({ queryHandler: jest.fn().mockRejectedValue('ERROR') });
await waitForPromises();
diff --git a/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap b/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap
index 4ecf82a4714..402e55347af 100644
--- a/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap
+++ b/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap
@@ -5,16 +5,19 @@ exports[`Design note component should match the snapshot 1`] = `
class="design-note note-form"
id="note_123"
>
- <user-avatar-link-stub
- imgalt="foo-bar"
- imgcssclasses=""
- imgsize="40"
- imgsrc=""
- linkhref=""
- tooltipplacement="top"
- tooltiptext=""
- username=""
- />
+ <gl-avatar-link-stub
+ class="gl-float-left gl-mr-3"
+ href="https://gitlab.com/user"
+ >
+ <gl-avatar-stub
+ alt="avatar"
+ entityid="0"
+ entityname="foo-bar"
+ shape="circle"
+ size="32"
+ src="https://gitlab.com/avatar"
+ />
+ </gl-avatar-link-stub>
<div
class="gl-display-flex gl-justify-content-space-between"
@@ -22,8 +25,10 @@ exports[`Design note component should match the snapshot 1`] = `
<div>
<gl-link-stub
class="js-user-link"
+ data-testid="user-link"
data-user-id="1"
data-username="foo-bar"
+ href="https://gitlab.com/user"
>
<span
class="note-header-author-name gl-font-weight-bold"
@@ -69,8 +74,9 @@ exports[`Design note component should match the snapshot 1`] = `
</div>
<div
- class="note-text js-note-text md"
+ class="note-text md"
data-qa-selector="note_content"
+ data-testid="note-text"
/>
</timeline-entry-item-stub>
diff --git a/spec/frontend/design_management/components/design_notes/design_discussion_spec.js b/spec/frontend/design_management/components/design_notes/design_discussion_spec.js
index bbf2190ad47..77935fbde11 100644
--- a/spec/frontend/design_management/components/design_notes/design_discussion_spec.js
+++ b/spec/frontend/design_management/components/design_notes/design_discussion_spec.js
@@ -31,7 +31,6 @@ describe('Design discussions component', () => {
const findReplyForm = () => wrapper.find(DesignReplyForm);
const findRepliesWidget = () => wrapper.find(ToggleRepliesWidget);
const findResolveButton = () => wrapper.find('[data-testid="resolve-button"]');
- const findResolveIcon = () => wrapper.find('[data-testid="resolve-icon"]');
const findResolvedMessage = () => wrapper.find('[data-testid="resolved-message"]');
const findResolveLoadingIcon = () => wrapper.find(GlLoadingIcon);
const findResolveCheckbox = () => wrapper.find('[data-testid="resolve-checkbox"]');
@@ -117,7 +116,7 @@ describe('Design discussions component', () => {
});
it('does not render an icon to resolve a thread', () => {
- expect(findResolveIcon().exists()).toBe(false);
+ expect(findResolveButton().exists()).toBe(false);
});
it('does not render a checkbox in reply form', async () => {
@@ -147,7 +146,7 @@ describe('Design discussions component', () => {
});
it('renders a correct icon to resolve a thread', () => {
- expect(findResolveIcon().props('name')).toBe('check-circle');
+ expect(findResolveButton().props('icon')).toBe('check-circle');
});
it('renders a checkbox with Resolve thread text in reply form', async () => {
@@ -203,7 +202,7 @@ describe('Design discussions component', () => {
});
it('renders a correct icon to resolve a thread', () => {
- expect(findResolveIcon().props('name')).toBe('check-circle-filled');
+ expect(findResolveButton().props('icon')).toBe('check-circle-filled');
});
it('emit todo:toggle when discussion is resolved', async () => {
diff --git a/spec/frontend/design_management/components/design_notes/design_note_spec.js b/spec/frontend/design_management/components/design_notes/design_note_spec.js
index 35fd1273270..1f84fde9f7f 100644
--- a/spec/frontend/design_management/components/design_notes/design_note_spec.js
+++ b/spec/frontend/design_management/components/design_notes/design_note_spec.js
@@ -1,10 +1,10 @@
-import { shallowMount } from '@vue/test-utils';
import { ApolloMutation } from 'vue-apollo';
import { nextTick } from 'vue';
+import { GlAvatar, GlAvatarLink } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import DesignNote from '~/design_management/components/design_notes/design_note.vue';
import DesignReplyForm from '~/design_management/components/design_notes/design_reply_form.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
-import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
const scrollIntoViewMock = jest.fn();
const note = {
@@ -12,6 +12,8 @@ const note = {
author: {
id: 'gid://gitlab/User/1',
username: 'foo-bar',
+ avatarUrl: 'https://gitlab.com/avatar',
+ webUrl: 'https://gitlab.com/user',
},
body: 'test',
userPermissions: {
@@ -30,14 +32,15 @@ const mutate = jest.fn().mockResolvedValue({ data: { updateNote: {} } });
describe('Design note component', () => {
let wrapper;
- const findUserAvatar = () => wrapper.find(UserAvatarLink);
- const findUserLink = () => wrapper.find('.js-user-link');
- const findReplyForm = () => wrapper.find(DesignReplyForm);
- const findEditButton = () => wrapper.find('.js-note-edit');
- const findNoteContent = () => wrapper.find('.js-note-text');
+ const findUserAvatar = () => wrapper.findComponent(GlAvatar);
+ const findUserAvatarLink = () => wrapper.findComponent(GlAvatarLink);
+ const findUserLink = () => wrapper.findByTestId('user-link');
+ const findReplyForm = () => wrapper.findComponent(DesignReplyForm);
+ const findEditButton = () => wrapper.findByTestId('note-edit');
+ const findNoteContent = () => wrapper.findByTestId('note-text');
function createComponent(props = {}, data = { isEditing: false }) {
- wrapper = shallowMount(DesignNote, {
+ wrapper = shallowMountExtended(DesignNote, {
propsData: {
note: {},
...props,
@@ -71,12 +74,24 @@ describe('Design note component', () => {
expect(wrapper.element).toMatchSnapshot();
});
- it('should render an author', () => {
+ it('should render avatar with correct props', () => {
+ createComponent({
+ note,
+ });
+
+ expect(findUserAvatar().props()).toMatchObject({
+ src: note.author.avatarUrl,
+ entityName: note.author.username,
+ });
+
+ expect(findUserAvatarLink().attributes('href')).toBe(note.author.webUrl);
+ });
+
+ it('should render author details', () => {
createComponent({
note,
});
- expect(findUserAvatar().exists()).toBe(true);
expect(findUserLink().exists()).toBe(true);
});
@@ -107,7 +122,7 @@ describe('Design note component', () => {
},
});
- findEditButton().trigger('click');
+ findEditButton().vm.$emit('click');
await nextTick();
expect(findReplyForm().exists()).toBe(true);
diff --git a/spec/frontend/design_management/pages/index_spec.js b/spec/frontend/design_management/pages/index_spec.js
index a240a41959f..87531e8b645 100644
--- a/spec/frontend/design_management/pages/index_spec.js
+++ b/spec/frontend/design_management/pages/index_spec.js
@@ -183,7 +183,7 @@ describe('Design management index page', () => {
[moveDesignMutation, moveDesignHandler],
];
- fakeApollo = createMockApollo(requestHandlers);
+ fakeApollo = createMockApollo(requestHandlers, {}, { addTypename: true });
wrapper = shallowMount(Index, {
apolloProvider: fakeApollo,
router,
diff --git a/spec/frontend/diffs/components/commit_item_spec.js b/spec/frontend/diffs/components/commit_item_spec.js
index d887029124f..eee17e118a0 100644
--- a/spec/frontend/diffs/components/commit_item_spec.js
+++ b/spec/frontend/diffs/components/commit_item_spec.js
@@ -11,7 +11,9 @@ jest.mock('~/user_popovers');
const TEST_AUTHOR_NAME = 'test';
const TEST_AUTHOR_EMAIL = 'test+test@gitlab.com';
const TEST_AUTHOR_GRAVATAR = `${TEST_HOST}/avatar/test?s=40`;
-const TEST_SIGNATURE_HTML = '<a>Legit commit</a>';
+const TEST_SIGNATURE_HTML = `<a class="btn gpg-status-box valid" data-content="signature-content" data-html="true" data-placement="top" data-title="signature-title" data-toggle="popover" role="button" tabindex="0">
+ Verified
+</a>`;
const TEST_PIPELINE_STATUS_PATH = `${TEST_HOST}/pipeline/status`;
describe('diffs/components/commit_item', () => {
@@ -82,7 +84,7 @@ describe('diffs/components/commit_item', () => {
const imgElement = avatarElement.find('img');
expect(avatarElement.attributes('href')).toBe(commit.author.web_url);
- expect(imgElement.classes()).toContain('s40');
+ expect(imgElement.classes()).toContain('s32');
expect(imgElement.attributes('alt')).toBe(commit.author.name);
expect(imgElement.attributes('src')).toBe(commit.author.avatar_url);
});
@@ -156,8 +158,9 @@ describe('diffs/components/commit_item', () => {
it('renders signature html', () => {
const actionsElement = getCommitActionsElement();
+ const signatureElement = actionsElement.find('.gpg-status-box');
- expect(actionsElement.html()).toContain(TEST_SIGNATURE_HTML);
+ expect(signatureElement.html()).toBe(TEST_SIGNATURE_HTML);
});
});
diff --git a/spec/frontend/diffs/components/diff_line_note_form_spec.js b/spec/frontend/diffs/components/diff_line_note_form_spec.js
index 0ccf996e220..fb9dc22ce25 100644
--- a/spec/frontend/diffs/components/diff_line_note_form_spec.js
+++ b/spec/frontend/diffs/components/diff_line_note_form_spec.js
@@ -4,7 +4,7 @@ import DiffLineNoteForm from '~/diffs/components/diff_line_note_form.vue';
import { createStore } from '~/mr_notes/stores';
import NoteForm from '~/notes/components/note_form.vue';
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
-import { noteableDataMock } from '../../notes/mock_data';
+import { noteableDataMock } from 'jest/notes/mock_data';
import diffFileMockData from '../mock_data/diff_file';
jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal', () => {
@@ -98,7 +98,7 @@ describe('DiffLineNoteForm', () => {
});
describe('saveNoteForm', () => {
- it('should call saveNote action with proper params', (done) => {
+ it('should call saveNote action with proper params', async () => {
const saveDiffDiscussionSpy = jest
.spyOn(wrapper.vm, 'saveDiffDiscussion')
.mockReturnValue(Promise.resolve());
@@ -123,16 +123,11 @@ describe('DiffLineNoteForm', () => {
lineRange,
};
- wrapper.vm
- .handleSaveNote('note body')
- .then(() => {
- expect(saveDiffDiscussionSpy).toHaveBeenCalledWith({
- note: 'note body',
- formData,
- });
- })
- .then(done)
- .catch(done.fail);
+ await wrapper.vm.handleSaveNote('note body');
+ expect(saveDiffDiscussionSpy).toHaveBeenCalledWith({
+ note: 'note body',
+ formData,
+ });
});
});
});
diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js
index d6a2aa104cd..3b567fbc704 100644
--- a/spec/frontend/diffs/store/actions_spec.js
+++ b/spec/frontend/diffs/store/actions_spec.js
@@ -9,46 +9,7 @@ import {
INLINE_DIFF_VIEW_TYPE,
PARALLEL_DIFF_VIEW_TYPE,
} from '~/diffs/constants';
-import {
- setBaseConfig,
- fetchDiffFilesBatch,
- fetchDiffFilesMeta,
- fetchCoverageFiles,
- assignDiscussionsToDiff,
- removeDiscussionsFromDiff,
- startRenderDiffsQueue,
- setInlineDiffViewType,
- setParallelDiffViewType,
- showCommentForm,
- cancelCommentForm,
- loadMoreLines,
- scrollToLineIfNeededInline,
- scrollToLineIfNeededParallel,
- loadCollapsedDiff,
- toggleFileDiscussions,
- saveDiffDiscussion,
- setHighlightedRow,
- toggleTreeOpen,
- scrollToFile,
- setShowTreeList,
- renderFileForDiscussionId,
- setRenderTreeList,
- setShowWhitespace,
- setRenderIt,
- receiveFullDiffError,
- fetchFullDiff,
- toggleFullDiff,
- switchToFullDiffFromRenamedFile,
- setFileCollapsedByUser,
- setExpandedDiffLines,
- setSuggestPopoverDismissed,
- changeCurrentCommit,
- moveToNeighboringCommit,
- setCurrentDiffFileIdFromNote,
- navigateToDiffFileIndex,
- setFileByFile,
- reviewFile,
-} from '~/diffs/store/actions';
+import * as diffActions from '~/diffs/store/actions';
import * as types from '~/diffs/store/mutation_types';
import * as utils from '~/diffs/store/utils';
import * as treeWorkerUtils from '~/diffs/utils/tree_worker_utils';
@@ -62,6 +23,8 @@ import { diffMetadata } from '../mock_data/diff_metadata';
jest.mock('~/flash');
describe('DiffsStoreActions', () => {
+ let mock;
+
useLocalStorageSpy();
const originalMethods = {
@@ -83,15 +46,20 @@ describe('DiffsStoreActions', () => {
});
});
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
afterEach(() => {
['requestAnimationFrame', 'requestIdleCallback'].forEach((method) => {
global[method] = originalMethods[method];
});
createFlash.mockClear();
+ mock.restore();
});
describe('setBaseConfig', () => {
- it('should set given endpoint and project path', (done) => {
+ it('should set given endpoint and project path', () => {
const endpoint = '/diffs/set/endpoint';
const endpointMetadata = '/diffs/set/endpoint/metadata';
const endpointBatch = '/diffs/set/endpoint/batch';
@@ -104,8 +72,8 @@ describe('DiffsStoreActions', () => {
b: ['y', 'hash:a'],
};
- testAction(
- setBaseConfig,
+ return testAction(
+ diffActions.setBaseConfig,
{
endpoint,
endpointBatch,
@@ -153,23 +121,12 @@ describe('DiffsStoreActions', () => {
},
],
[],
- done,
);
});
});
describe('fetchDiffFilesBatch', () => {
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- it('should fetch batch diff files', (done) => {
+ it('should fetch batch diff files', () => {
const endpointBatch = '/fetch/diffs_batch';
const res1 = { diff_files: [{ file_hash: 'test' }], pagination: { total_pages: 7 } };
const res2 = { diff_files: [{ file_hash: 'test2' }], pagination: { total_pages: 7 } };
@@ -199,8 +156,8 @@ describe('DiffsStoreActions', () => {
)
.reply(200, res2);
- testAction(
- fetchDiffFilesBatch,
+ return testAction(
+ diffActions.fetchDiffFilesBatch,
{},
{ endpointBatch, diffViewType: 'inline', diffFiles: [] },
[
@@ -216,7 +173,6 @@ describe('DiffsStoreActions', () => {
{ type: types.SET_BATCH_LOADING_STATE, payload: 'error' },
],
[{ type: 'startRenderDiffsQueue' }, { type: 'startRenderDiffsQueue' }],
- done,
);
});
@@ -229,13 +185,14 @@ describe('DiffsStoreActions', () => {
({ viewStyle, otherView }) => {
const endpointBatch = '/fetch/diffs_batch';
- fetchDiffFilesBatch({
- commit: () => {},
- state: {
- endpointBatch: `${endpointBatch}?view=${otherView}`,
- diffViewType: viewStyle,
- },
- })
+ diffActions
+ .fetchDiffFilesBatch({
+ commit: () => {},
+ state: {
+ endpointBatch: `${endpointBatch}?view=${otherView}`,
+ diffViewType: viewStyle,
+ },
+ })
.then(() => {
expect(mock.history.get[0].url).toContain(`view=${viewStyle}`);
expect(mock.history.get[0].url).not.toContain(`view=${otherView}`);
@@ -248,19 +205,16 @@ describe('DiffsStoreActions', () => {
describe('fetchDiffFilesMeta', () => {
const endpointMetadata = '/fetch/diffs_metadata.json?view=inline';
const noFilesData = { ...diffMetadata };
- let mock;
beforeEach(() => {
- mock = new MockAdapter(axios);
-
delete noFilesData.diff_files;
mock.onGet(endpointMetadata).reply(200, diffMetadata);
});
- it('should fetch diff meta information', (done) => {
- testAction(
- fetchDiffFilesMeta,
+ it('should fetch diff meta information', () => {
+ return testAction(
+ diffActions.fetchDiffFilesMeta,
{},
{ endpointMetadata, diffViewType: 'inline' },
[
@@ -275,55 +229,41 @@ describe('DiffsStoreActions', () => {
},
],
[],
- () => {
- mock.restore();
- done();
- },
);
});
});
describe('fetchCoverageFiles', () => {
- let mock;
const endpointCoverage = '/fetch';
- beforeEach(() => {
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => mock.restore());
-
- it('should commit SET_COVERAGE_DATA with received response', (done) => {
+ it('should commit SET_COVERAGE_DATA with received response', () => {
const data = { files: { 'app.js': { 1: 0, 2: 1 } } };
mock.onGet(endpointCoverage).reply(200, { data });
- testAction(
- fetchCoverageFiles,
+ return testAction(
+ diffActions.fetchCoverageFiles,
{},
{ endpointCoverage },
[{ type: types.SET_COVERAGE_DATA, payload: { data } }],
[],
- done,
);
});
- it('should show flash on API error', (done) => {
+ it('should show flash on API error', async () => {
mock.onGet(endpointCoverage).reply(400);
- testAction(fetchCoverageFiles, {}, { endpointCoverage }, [], [], () => {
- expect(createFlash).toHaveBeenCalledTimes(1);
- expect(createFlash).toHaveBeenCalledWith({
- message: expect.stringMatching('Something went wrong'),
- });
- done();
+ await testAction(diffActions.fetchCoverageFiles, {}, { endpointCoverage }, [], []);
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: expect.stringMatching('Something went wrong'),
});
});
});
describe('setHighlightedRow', () => {
it('should mark currently selected diff and set lineHash and fileHash of highlightedRow', () => {
- testAction(setHighlightedRow, 'ABC_123', {}, [
+ return testAction(diffActions.setHighlightedRow, 'ABC_123', {}, [
{ type: types.SET_HIGHLIGHTED_ROW, payload: 'ABC_123' },
{ type: types.SET_CURRENT_DIFF_FILE, payload: 'ABC' },
]);
@@ -335,7 +275,7 @@ describe('DiffsStoreActions', () => {
window.location.hash = '';
});
- it('should merge discussions into diffs', (done) => {
+ it('should merge discussions into diffs', () => {
window.location.hash = 'ABC_123';
const state = {
@@ -397,8 +337,8 @@ describe('DiffsStoreActions', () => {
const discussions = [singleDiscussion];
- testAction(
- assignDiscussionsToDiff,
+ return testAction(
+ diffActions.assignDiscussionsToDiff,
discussions,
state,
[
@@ -425,26 +365,24 @@ describe('DiffsStoreActions', () => {
},
],
[],
- done,
);
});
- it('dispatches setCurrentDiffFileIdFromNote with note ID', (done) => {
+ it('dispatches setCurrentDiffFileIdFromNote with note ID', () => {
window.location.hash = 'note_123';
- testAction(
- assignDiscussionsToDiff,
+ return testAction(
+ diffActions.assignDiscussionsToDiff,
[],
{ diffFiles: [] },
[],
[{ type: 'setCurrentDiffFileIdFromNote', payload: '123' }],
- done,
);
});
});
describe('removeDiscussionsFromDiff', () => {
- it('should remove discussions from diffs', (done) => {
+ it('should remove discussions from diffs', () => {
const state = {
diffFiles: [
{
@@ -480,8 +418,8 @@ describe('DiffsStoreActions', () => {
line_code: 'ABC_1_1',
};
- testAction(
- removeDiscussionsFromDiff,
+ return testAction(
+ diffActions.removeDiscussionsFromDiff,
singleDiscussion,
state,
[
@@ -495,7 +433,6 @@ describe('DiffsStoreActions', () => {
},
],
[],
- done,
);
});
});
@@ -528,7 +465,7 @@ describe('DiffsStoreActions', () => {
});
};
- startRenderDiffsQueue({ state, commit: pseudoCommit });
+ diffActions.startRenderDiffsQueue({ state, commit: pseudoCommit });
expect(state.diffFiles[0].renderIt).toBe(true);
expect(state.diffFiles[1].renderIt).toBe(true);
@@ -536,69 +473,61 @@ describe('DiffsStoreActions', () => {
});
describe('setInlineDiffViewType', () => {
- it('should set diff view type to inline and also set the cookie properly', (done) => {
- testAction(
- setInlineDiffViewType,
+ it('should set diff view type to inline and also set the cookie properly', async () => {
+ await testAction(
+ diffActions.setInlineDiffViewType,
null,
{},
[{ type: types.SET_DIFF_VIEW_TYPE, payload: INLINE_DIFF_VIEW_TYPE }],
[],
- () => {
- expect(Cookies.get('diff_view')).toEqual(INLINE_DIFF_VIEW_TYPE);
- done();
- },
);
+ expect(Cookies.get('diff_view')).toEqual(INLINE_DIFF_VIEW_TYPE);
});
});
describe('setParallelDiffViewType', () => {
- it('should set diff view type to parallel and also set the cookie properly', (done) => {
- testAction(
- setParallelDiffViewType,
+ it('should set diff view type to parallel and also set the cookie properly', async () => {
+ await testAction(
+ diffActions.setParallelDiffViewType,
null,
{},
[{ type: types.SET_DIFF_VIEW_TYPE, payload: PARALLEL_DIFF_VIEW_TYPE }],
[],
- () => {
- expect(Cookies.get(DIFF_VIEW_COOKIE_NAME)).toEqual(PARALLEL_DIFF_VIEW_TYPE);
- done();
- },
);
+ expect(Cookies.get(DIFF_VIEW_COOKIE_NAME)).toEqual(PARALLEL_DIFF_VIEW_TYPE);
});
});
describe('showCommentForm', () => {
- it('should call mutation to show comment form', (done) => {
+ it('should call mutation to show comment form', () => {
const payload = { lineCode: 'lineCode', fileHash: 'hash' };
- testAction(
- showCommentForm,
+ return testAction(
+ diffActions.showCommentForm,
payload,
{},
[{ type: types.TOGGLE_LINE_HAS_FORM, payload: { ...payload, hasForm: true } }],
[],
- done,
);
});
});
describe('cancelCommentForm', () => {
- it('should call mutation to cancel comment form', (done) => {
+ it('should call mutation to cancel comment form', () => {
const payload = { lineCode: 'lineCode', fileHash: 'hash' };
- testAction(
- cancelCommentForm,
+ return testAction(
+ diffActions.cancelCommentForm,
payload,
{},
[{ type: types.TOGGLE_LINE_HAS_FORM, payload: { ...payload, hasForm: false } }],
[],
- done,
);
});
});
describe('loadMoreLines', () => {
- it('should call mutation to show comment form', (done) => {
+ it('should call mutation to show comment form', () => {
const endpoint = '/diffs/load/more/lines';
const params = { since: 6, to: 26 };
const lineNumbers = { oldLineNumber: 3, newLineNumber: 5 };
@@ -606,12 +535,11 @@ describe('DiffsStoreActions', () => {
const isExpandDown = false;
const nextLineNumbers = {};
const options = { endpoint, params, lineNumbers, fileHash, isExpandDown, nextLineNumbers };
- const mock = new MockAdapter(axios);
const contextLines = { contextLines: [{ lineCode: 6 }] };
mock.onGet(endpoint).reply(200, contextLines);
- testAction(
- loadMoreLines,
+ return testAction(
+ diffActions.loadMoreLines,
options,
{},
[
@@ -621,31 +549,23 @@ describe('DiffsStoreActions', () => {
},
],
[],
- () => {
- mock.restore();
- done();
- },
);
});
});
describe('loadCollapsedDiff', () => {
const state = { showWhitespace: true };
- it('should fetch data and call mutation with response and the give parameter', (done) => {
+ it('should fetch data and call mutation with response and the give parameter', () => {
const file = { hash: 123, load_collapsed_diff_url: '/load/collapsed/diff/url' };
const data = { hash: 123, parallelDiffLines: [{ lineCode: 1 }] };
- const mock = new MockAdapter(axios);
const commit = jest.fn();
mock.onGet(file.loadCollapsedDiffUrl).reply(200, data);
- loadCollapsedDiff({ commit, getters: { commitId: null }, state }, file)
+ return diffActions
+ .loadCollapsedDiff({ commit, getters: { commitId: null }, state }, file)
.then(() => {
expect(commit).toHaveBeenCalledWith(types.ADD_COLLAPSED_DIFFS, { file, data });
-
- mock.restore();
- done();
- })
- .catch(done.fail);
+ });
});
it('should fetch data without commit ID', () => {
@@ -656,7 +576,7 @@ describe('DiffsStoreActions', () => {
jest.spyOn(axios, 'get').mockReturnValue(Promise.resolve({ data: {} }));
- loadCollapsedDiff({ commit() {}, getters, state }, file);
+ diffActions.loadCollapsedDiff({ commit() {}, getters, state }, file);
expect(axios.get).toHaveBeenCalledWith(file.load_collapsed_diff_url, {
params: { commit_id: null, w: '0' },
@@ -671,7 +591,7 @@ describe('DiffsStoreActions', () => {
jest.spyOn(axios, 'get').mockReturnValue(Promise.resolve({ data: {} }));
- loadCollapsedDiff({ commit() {}, getters, state }, file);
+ diffActions.loadCollapsedDiff({ commit() {}, getters, state }, file);
expect(axios.get).toHaveBeenCalledWith(file.load_collapsed_diff_url, {
params: { commit_id: '123', w: '0' },
@@ -689,7 +609,7 @@ describe('DiffsStoreActions', () => {
const dispatch = jest.fn();
- toggleFileDiscussions({ getters, dispatch });
+ diffActions.toggleFileDiscussions({ getters, dispatch });
expect(dispatch).toHaveBeenCalledWith(
'collapseDiscussion',
@@ -707,7 +627,7 @@ describe('DiffsStoreActions', () => {
const dispatch = jest.fn();
- toggleFileDiscussions({ getters, dispatch });
+ diffActions.toggleFileDiscussions({ getters, dispatch });
expect(dispatch).toHaveBeenCalledWith(
'expandDiscussion',
@@ -725,7 +645,7 @@ describe('DiffsStoreActions', () => {
const dispatch = jest.fn();
- toggleFileDiscussions({ getters, dispatch });
+ diffActions.toggleFileDiscussions({ getters, dispatch });
expect(dispatch).toHaveBeenCalledWith(
'expandDiscussion',
@@ -743,7 +663,7 @@ describe('DiffsStoreActions', () => {
it('should not call handleLocationHash when there is not hash', () => {
window.location.hash = '';
- scrollToLineIfNeededInline({}, lineMock);
+ diffActions.scrollToLineIfNeededInline({}, lineMock);
expect(commonUtils.handleLocationHash).not.toHaveBeenCalled();
});
@@ -751,7 +671,7 @@ describe('DiffsStoreActions', () => {
it('should not call handleLocationHash when the hash does not match any line', () => {
window.location.hash = 'XYZ_456';
- scrollToLineIfNeededInline({}, lineMock);
+ diffActions.scrollToLineIfNeededInline({}, lineMock);
expect(commonUtils.handleLocationHash).not.toHaveBeenCalled();
});
@@ -759,14 +679,14 @@ describe('DiffsStoreActions', () => {
it('should call handleLocationHash only when the hash matches a line', () => {
window.location.hash = 'ABC_123';
- scrollToLineIfNeededInline(
+ diffActions.scrollToLineIfNeededInline(
{},
{
lineCode: 'ABC_456',
},
);
- scrollToLineIfNeededInline({}, lineMock);
- scrollToLineIfNeededInline(
+ diffActions.scrollToLineIfNeededInline({}, lineMock);
+ diffActions.scrollToLineIfNeededInline(
{},
{
lineCode: 'XYZ_456',
@@ -789,7 +709,7 @@ describe('DiffsStoreActions', () => {
it('should not call handleLocationHash when there is not hash', () => {
window.location.hash = '';
- scrollToLineIfNeededParallel({}, lineMock);
+ diffActions.scrollToLineIfNeededParallel({}, lineMock);
expect(commonUtils.handleLocationHash).not.toHaveBeenCalled();
});
@@ -797,7 +717,7 @@ describe('DiffsStoreActions', () => {
it('should not call handleLocationHash when the hash does not match any line', () => {
window.location.hash = 'XYZ_456';
- scrollToLineIfNeededParallel({}, lineMock);
+ diffActions.scrollToLineIfNeededParallel({}, lineMock);
expect(commonUtils.handleLocationHash).not.toHaveBeenCalled();
});
@@ -805,7 +725,7 @@ describe('DiffsStoreActions', () => {
it('should call handleLocationHash only when the hash matches a line', () => {
window.location.hash = 'ABC_123';
- scrollToLineIfNeededParallel(
+ diffActions.scrollToLineIfNeededParallel(
{},
{
left: null,
@@ -814,8 +734,8 @@ describe('DiffsStoreActions', () => {
},
},
);
- scrollToLineIfNeededParallel({}, lineMock);
- scrollToLineIfNeededParallel(
+ diffActions.scrollToLineIfNeededParallel({}, lineMock);
+ diffActions.scrollToLineIfNeededParallel(
{},
{
left: null,
@@ -831,7 +751,7 @@ describe('DiffsStoreActions', () => {
});
describe('saveDiffDiscussion', () => {
- it('dispatches actions', (done) => {
+ it('dispatches actions', () => {
const commitId = 'something';
const formData = {
diffFile: { ...mockDiffFile },
@@ -856,33 +776,29 @@ describe('DiffsStoreActions', () => {
}
});
- saveDiffDiscussion({ state, dispatch }, { note, formData })
- .then(() => {
- expect(dispatch).toHaveBeenCalledTimes(5);
- expect(dispatch).toHaveBeenNthCalledWith(1, 'saveNote', expect.any(Object), {
- root: true,
- });
+ return diffActions.saveDiffDiscussion({ state, dispatch }, { note, formData }).then(() => {
+ expect(dispatch).toHaveBeenCalledTimes(5);
+ expect(dispatch).toHaveBeenNthCalledWith(1, 'saveNote', expect.any(Object), {
+ root: true,
+ });
- const postData = dispatch.mock.calls[0][1];
- expect(postData.data.note.commit_id).toBe(commitId);
+ const postData = dispatch.mock.calls[0][1];
+ expect(postData.data.note.commit_id).toBe(commitId);
- expect(dispatch).toHaveBeenNthCalledWith(2, 'updateDiscussion', 'test', { root: true });
- expect(dispatch).toHaveBeenNthCalledWith(3, 'assignDiscussionsToDiff', ['discussion']);
- })
- .then(done)
- .catch(done.fail);
+ expect(dispatch).toHaveBeenNthCalledWith(2, 'updateDiscussion', 'test', { root: true });
+ expect(dispatch).toHaveBeenNthCalledWith(3, 'assignDiscussionsToDiff', ['discussion']);
+ });
});
});
describe('toggleTreeOpen', () => {
- it('commits TOGGLE_FOLDER_OPEN', (done) => {
- testAction(
- toggleTreeOpen,
+ it('commits TOGGLE_FOLDER_OPEN', () => {
+ return testAction(
+ diffActions.toggleTreeOpen,
'path',
{},
[{ type: types.TOGGLE_FOLDER_OPEN, payload: 'path' }],
[],
- done,
);
});
});
@@ -904,7 +820,7 @@ describe('DiffsStoreActions', () => {
},
};
- scrollToFile({ state, commit, getters }, { path: 'path' });
+ diffActions.scrollToFile({ state, commit, getters }, { path: 'path' });
expect(document.location.hash).toBe('#test');
});
@@ -918,28 +834,27 @@ describe('DiffsStoreActions', () => {
},
};
- scrollToFile({ state, commit, getters }, { path: 'path' });
+ diffActions.scrollToFile({ state, commit, getters }, { path: 'path' });
expect(commit).toHaveBeenCalledWith(types.SET_CURRENT_DIFF_FILE, 'test');
});
});
describe('setShowTreeList', () => {
- it('commits toggle', (done) => {
- testAction(
- setShowTreeList,
+ it('commits toggle', () => {
+ return testAction(
+ diffActions.setShowTreeList,
{ showTreeList: true },
{},
[{ type: types.SET_SHOW_TREE_LIST, payload: true }],
[],
- done,
);
});
it('updates localStorage', () => {
jest.spyOn(localStorage, 'setItem').mockImplementation(() => {});
- setShowTreeList({ commit() {} }, { showTreeList: true });
+ diffActions.setShowTreeList({ commit() {} }, { showTreeList: true });
expect(localStorage.setItem).toHaveBeenCalledWith('mr_tree_show', true);
});
@@ -947,7 +862,7 @@ describe('DiffsStoreActions', () => {
it('does not update localStorage', () => {
jest.spyOn(localStorage, 'setItem').mockImplementation(() => {});
- setShowTreeList({ commit() {} }, { showTreeList: true, saving: false });
+ diffActions.setShowTreeList({ commit() {} }, { showTreeList: true, saving: false });
expect(localStorage.setItem).not.toHaveBeenCalled();
});
@@ -994,7 +909,7 @@ describe('DiffsStoreActions', () => {
it('renders and expands file for the given discussion id', () => {
const localState = state({ collapsed: true, renderIt: false });
- renderFileForDiscussionId({ rootState, state: localState, commit }, '123');
+ diffActions.renderFileForDiscussionId({ rootState, state: localState, commit }, '123');
expect(commit).toHaveBeenCalledWith('RENDER_FILE', localState.diffFiles[0]);
expect($emit).toHaveBeenCalledTimes(1);
@@ -1004,7 +919,7 @@ describe('DiffsStoreActions', () => {
it('jumps to discussion on already rendered and expanded file', () => {
const localState = state({ collapsed: false, renderIt: true });
- renderFileForDiscussionId({ rootState, state: localState, commit }, '123');
+ diffActions.renderFileForDiscussionId({ rootState, state: localState, commit }, '123');
expect(commit).not.toHaveBeenCalled();
expect($emit).toHaveBeenCalledTimes(1);
@@ -1013,19 +928,18 @@ describe('DiffsStoreActions', () => {
});
describe('setRenderTreeList', () => {
- it('commits SET_RENDER_TREE_LIST', (done) => {
- testAction(
- setRenderTreeList,
+ it('commits SET_RENDER_TREE_LIST', () => {
+ return testAction(
+ diffActions.setRenderTreeList,
{ renderTreeList: true },
{},
[{ type: types.SET_RENDER_TREE_LIST, payload: true }],
[],
- done,
);
});
it('sets localStorage', () => {
- setRenderTreeList({ commit() {} }, { renderTreeList: true });
+ diffActions.setRenderTreeList({ commit() {} }, { renderTreeList: true });
expect(localStorage.setItem).toHaveBeenCalledWith('mr_diff_tree_list', true);
});
@@ -1034,11 +948,9 @@ describe('DiffsStoreActions', () => {
describe('setShowWhitespace', () => {
const endpointUpdateUser = 'user/prefs';
let putSpy;
- let mock;
let gon;
beforeEach(() => {
- mock = new MockAdapter(axios);
putSpy = jest.spyOn(axios, 'put');
gon = window.gon;
@@ -1047,25 +959,23 @@ describe('DiffsStoreActions', () => {
});
afterEach(() => {
- mock.restore();
window.gon = gon;
});
- it('commits SET_SHOW_WHITESPACE', (done) => {
- testAction(
- setShowWhitespace,
+ it('commits SET_SHOW_WHITESPACE', () => {
+ return testAction(
+ diffActions.setShowWhitespace,
{ showWhitespace: true, updateDatabase: false },
{},
[{ type: types.SET_SHOW_WHITESPACE, payload: true }],
[],
- done,
);
});
it('saves to the database when the user is logged in', async () => {
window.gon = { current_user_id: 12345 };
- await setShowWhitespace(
+ await diffActions.setShowWhitespace(
{ state: { endpointUpdateUser }, commit() {} },
{ showWhitespace: true, updateDatabase: true },
);
@@ -1076,7 +986,7 @@ describe('DiffsStoreActions', () => {
it('does not try to save to the API if the user is not logged in', async () => {
window.gon = {};
- await setShowWhitespace(
+ await diffActions.setShowWhitespace(
{ state: { endpointUpdateUser }, commit() {} },
{ showWhitespace: true, updateDatabase: true },
);
@@ -1085,7 +995,7 @@ describe('DiffsStoreActions', () => {
});
it('emits eventHub event', async () => {
- await setShowWhitespace(
+ await diffActions.setShowWhitespace(
{ state: {}, commit() {} },
{ showWhitespace: true, updateDatabase: false },
);
@@ -1095,53 +1005,47 @@ describe('DiffsStoreActions', () => {
});
describe('setRenderIt', () => {
- it('commits RENDER_FILE', (done) => {
- testAction(setRenderIt, 'file', {}, [{ type: types.RENDER_FILE, payload: 'file' }], [], done);
+ it('commits RENDER_FILE', () => {
+ return testAction(
+ diffActions.setRenderIt,
+ 'file',
+ {},
+ [{ type: types.RENDER_FILE, payload: 'file' }],
+ [],
+ );
});
});
describe('receiveFullDiffError', () => {
- it('updates state with the file that did not load', (done) => {
- testAction(
- receiveFullDiffError,
+ it('updates state with the file that did not load', () => {
+ return testAction(
+ diffActions.receiveFullDiffError,
'file',
{},
[{ type: types.RECEIVE_FULL_DIFF_ERROR, payload: 'file' }],
[],
- done,
);
});
});
describe('fetchFullDiff', () => {
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => {
- mock.restore();
- });
-
describe('success', () => {
beforeEach(() => {
mock.onGet(`${TEST_HOST}/context`).replyOnce(200, ['test']);
});
- it('commits the success and dispatches an action to expand the new lines', (done) => {
+ it('commits the success and dispatches an action to expand the new lines', () => {
const file = {
context_lines_path: `${TEST_HOST}/context`,
file_path: 'test',
file_hash: 'test',
};
- testAction(
- fetchFullDiff,
+ return testAction(
+ diffActions.fetchFullDiff,
file,
null,
[{ type: types.RECEIVE_FULL_DIFF_SUCCESS, payload: { filePath: 'test' } }],
[{ type: 'setExpandedDiffLines', payload: { file, data: ['test'] } }],
- done,
);
});
});
@@ -1151,14 +1055,13 @@ describe('DiffsStoreActions', () => {
mock.onGet(`${TEST_HOST}/context`).replyOnce(500);
});
- it('dispatches receiveFullDiffError', (done) => {
- testAction(
- fetchFullDiff,
+ it('dispatches receiveFullDiffError', () => {
+ return testAction(
+ diffActions.fetchFullDiff,
{ context_lines_path: `${TEST_HOST}/context`, file_path: 'test', file_hash: 'test' },
null,
[],
[{ type: 'receiveFullDiffError', payload: 'test' }],
- done,
);
});
});
@@ -1173,14 +1076,13 @@ describe('DiffsStoreActions', () => {
};
});
- it('dispatches fetchFullDiff when file is not expanded', (done) => {
- testAction(
- toggleFullDiff,
+ it('dispatches fetchFullDiff when file is not expanded', () => {
+ return testAction(
+ diffActions.toggleFullDiff,
'test',
state,
[{ type: types.REQUEST_FULL_DIFF, payload: 'test' }],
[{ type: 'fetchFullDiff', payload: state.diffFiles[0] }],
- done,
);
});
});
@@ -1202,16 +1104,13 @@ describe('DiffsStoreActions', () => {
};
const testData = [{ rich_text: 'test' }, { rich_text: 'file2' }];
let renamedFile;
- let mock;
beforeEach(() => {
- mock = new MockAdapter(axios);
jest.spyOn(utils, 'prepareLineForRenamedFile').mockImplementation(() => preparedLine);
});
afterEach(() => {
renamedFile = null;
- mock.restore();
});
describe('success', () => {
@@ -1228,7 +1127,7 @@ describe('DiffsStoreActions', () => {
'performs the correct mutations and starts a render queue for view type $diffViewType',
({ diffViewType }) => {
return testAction(
- switchToFullDiffFromRenamedFile,
+ diffActions.switchToFullDiffFromRenamedFile,
{ diffFile: renamedFile },
{ diffViewType },
[
@@ -1249,9 +1148,9 @@ describe('DiffsStoreActions', () => {
});
describe('setFileUserCollapsed', () => {
- it('commits SET_FILE_COLLAPSED', (done) => {
- testAction(
- setFileCollapsedByUser,
+ it('commits SET_FILE_COLLAPSED', () => {
+ return testAction(
+ diffActions.setFileCollapsedByUser,
{ filePath: 'test', collapsed: true },
null,
[
@@ -1261,7 +1160,6 @@ describe('DiffsStoreActions', () => {
},
],
[],
- done,
);
});
});
@@ -1273,11 +1171,11 @@ describe('DiffsStoreActions', () => {
});
});
- it('commits SET_CURRENT_VIEW_DIFF_FILE_LINES when lines less than MAX_RENDERING_DIFF_LINES', (done) => {
+ it('commits SET_CURRENT_VIEW_DIFF_FILE_LINES when lines less than MAX_RENDERING_DIFF_LINES', () => {
utils.convertExpandLines.mockImplementation(() => ['test']);
- testAction(
- setExpandedDiffLines,
+ return testAction(
+ diffActions.setExpandedDiffLines,
{ file: { file_path: 'path' }, data: [] },
{ diffViewType: 'inline' },
[
@@ -1287,16 +1185,15 @@ describe('DiffsStoreActions', () => {
},
],
[],
- done,
);
});
- it('commits ADD_CURRENT_VIEW_DIFF_FILE_LINES when lines more than MAX_RENDERING_DIFF_LINES', (done) => {
+ it('commits ADD_CURRENT_VIEW_DIFF_FILE_LINES when lines more than MAX_RENDERING_DIFF_LINES', () => {
const lines = new Array(501).fill().map((_, i) => `line-${i}`);
utils.convertExpandLines.mockReturnValue(lines);
- testAction(
- setExpandedDiffLines,
+ return testAction(
+ diffActions.setExpandedDiffLines,
{ file: { file_path: 'path' }, data: [] },
{ diffViewType: 'inline' },
[
@@ -1312,41 +1209,34 @@ describe('DiffsStoreActions', () => {
{ type: 'TOGGLE_DIFF_FILE_RENDERING_MORE', payload: 'path' },
],
[],
- done,
);
});
});
describe('setSuggestPopoverDismissed', () => {
- it('commits SET_SHOW_SUGGEST_POPOVER', (done) => {
+ it('commits SET_SHOW_SUGGEST_POPOVER', async () => {
const state = { dismissEndpoint: `${TEST_HOST}/-/user_callouts` };
- const mock = new MockAdapter(axios);
mock.onPost(state.dismissEndpoint).reply(200, {});
jest.spyOn(axios, 'post');
- testAction(
- setSuggestPopoverDismissed,
+ await testAction(
+ diffActions.setSuggestPopoverDismissed,
null,
state,
[{ type: types.SET_SHOW_SUGGEST_POPOVER }],
[],
- () => {
- expect(axios.post).toHaveBeenCalledWith(state.dismissEndpoint, {
- feature_name: 'suggest_popover_dismissed',
- });
-
- mock.restore();
- done();
- },
);
+ expect(axios.post).toHaveBeenCalledWith(state.dismissEndpoint, {
+ feature_name: 'suggest_popover_dismissed',
+ });
});
});
describe('changeCurrentCommit', () => {
it('commits the new commit information and re-requests the diff metadata for the commit', () => {
return testAction(
- changeCurrentCommit,
+ diffActions.changeCurrentCommit,
{ commitId: 'NEW' },
{
commit: {
@@ -1384,7 +1274,7 @@ describe('DiffsStoreActions', () => {
({ commitId, commit, msg }) => {
const err = new Error(msg);
const actionReturn = testAction(
- changeCurrentCommit,
+ diffActions.changeCurrentCommit,
{ commitId },
{
endpoint: 'URL/OLD',
@@ -1410,7 +1300,7 @@ describe('DiffsStoreActions', () => {
'for the direction "$direction", dispatches the action to move to the SHA "$expected"',
({ direction, expected, currentCommit }) => {
return testAction(
- moveToNeighboringCommit,
+ diffActions.moveToNeighboringCommit,
{ direction },
{ commit: currentCommit },
[],
@@ -1431,7 +1321,7 @@ describe('DiffsStoreActions', () => {
'given `{ "isloading": $diffsAreLoading, "commit": $currentCommit }` in state, no actions are dispatched',
({ direction, diffsAreLoading, currentCommit }) => {
return testAction(
- moveToNeighboringCommit,
+ diffActions.moveToNeighboringCommit,
{ direction },
{ commit: currentCommit, isLoading: diffsAreLoading },
[],
@@ -1450,7 +1340,7 @@ describe('DiffsStoreActions', () => {
notesById: { 1: { discussion_id: '2' } },
};
- setCurrentDiffFileIdFromNote({ commit, state, rootGetters }, '1');
+ diffActions.setCurrentDiffFileIdFromNote({ commit, state, rootGetters }, '1');
expect(commit).toHaveBeenCalledWith(types.SET_CURRENT_DIFF_FILE, '123');
});
@@ -1463,7 +1353,7 @@ describe('DiffsStoreActions', () => {
notesById: { 1: { discussion_id: '2' } },
};
- setCurrentDiffFileIdFromNote({ commit, state, rootGetters }, '1');
+ diffActions.setCurrentDiffFileIdFromNote({ commit, state, rootGetters }, '1');
expect(commit).not.toHaveBeenCalled();
});
@@ -1476,21 +1366,20 @@ describe('DiffsStoreActions', () => {
notesById: { 1: { discussion_id: '2' } },
};
- setCurrentDiffFileIdFromNote({ commit, state, rootGetters }, '1');
+ diffActions.setCurrentDiffFileIdFromNote({ commit, state, rootGetters }, '1');
expect(commit).not.toHaveBeenCalled();
});
});
describe('navigateToDiffFileIndex', () => {
- it('commits SET_CURRENT_DIFF_FILE', (done) => {
- testAction(
- navigateToDiffFileIndex,
+ it('commits SET_CURRENT_DIFF_FILE', () => {
+ return testAction(
+ diffActions.navigateToDiffFileIndex,
0,
{ diffFiles: [{ file_hash: '123' }] },
[{ type: types.SET_CURRENT_DIFF_FILE, payload: '123' }],
[],
- done,
);
});
});
@@ -1498,19 +1387,13 @@ describe('DiffsStoreActions', () => {
describe('setFileByFile', () => {
const updateUserEndpoint = 'user/prefs';
let putSpy;
- let mock;
beforeEach(() => {
- mock = new MockAdapter(axios);
putSpy = jest.spyOn(axios, 'put');
mock.onPut(updateUserEndpoint).reply(200, {});
});
- afterEach(() => {
- mock.restore();
- });
-
it.each`
value
${true}
@@ -1519,7 +1402,7 @@ describe('DiffsStoreActions', () => {
'commits SET_FILE_BY_FILE and persists the File-by-File user preference with the new value $value',
async ({ value }) => {
await testAction(
- setFileByFile,
+ diffActions.setFileByFile,
{ fileByFile: value },
{
viewDiffsFileByFile: null,
@@ -1551,7 +1434,7 @@ describe('DiffsStoreActions', () => {
const commitSpy = jest.fn();
const getterSpy = jest.fn().mockReturnValue([]);
- reviewFile(
+ diffActions.reviewFile(
{
commit: commitSpy,
getters: {
diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js
index 55c0141552d..03bcaab0d2b 100644
--- a/spec/frontend/diffs/store/utils_spec.js
+++ b/spec/frontend/diffs/store/utils_spec.js
@@ -13,7 +13,7 @@ import {
} from '~/diffs/constants';
import * as utils from '~/diffs/store/utils';
import { MERGE_REQUEST_NOTEABLE_TYPE } from '~/notes/constants';
-import { noteableDataMock } from '../../notes/mock_data';
+import { noteableDataMock } from 'jest/notes/mock_data';
import diffFileMockData from '../mock_data/diff_file';
import { diffMetadata } from '../mock_data/diff_metadata';
diff --git a/spec/frontend/editor/components/helpers.js b/spec/frontend/editor/components/helpers.js
new file mode 100644
index 00000000000..3e6cd2a236d
--- /dev/null
+++ b/spec/frontend/editor/components/helpers.js
@@ -0,0 +1,12 @@
+import { EDITOR_TOOLBAR_RIGHT_GROUP } from '~/editor/constants';
+
+export const buildButton = (id = 'foo-bar-btn', options = {}) => {
+ return {
+ __typename: 'Item',
+ id,
+ label: options.label || 'Foo Bar Button',
+ icon: options.icon || 'foo-bar',
+ selected: options.selected || false,
+ group: options.group || EDITOR_TOOLBAR_RIGHT_GROUP,
+ };
+};
diff --git a/spec/frontend/editor/components/source_editor_toolbar_button_spec.js b/spec/frontend/editor/components/source_editor_toolbar_button_spec.js
new file mode 100644
index 00000000000..5135091af4a
--- /dev/null
+++ b/spec/frontend/editor/components/source_editor_toolbar_button_spec.js
@@ -0,0 +1,146 @@
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import { GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import SourceEditorToolbarButton from '~/editor/components/source_editor_toolbar_button.vue';
+import getToolbarItemQuery from '~/editor/graphql/get_item.query.graphql';
+import updateToolbarItemMutation from '~/editor/graphql/update_item.mutation.graphql';
+import { buildButton } from './helpers';
+
+Vue.use(VueApollo);
+
+describe('Source Editor Toolbar button', () => {
+ let wrapper;
+ let mockApollo;
+ const defaultBtn = buildButton();
+
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ const createComponentWithApollo = ({ propsData } = {}) => {
+ mockApollo = createMockApollo();
+ mockApollo.clients.defaultClient.cache.writeQuery({
+ query: getToolbarItemQuery,
+ variables: { id: defaultBtn.id },
+ data: {
+ item: {
+ ...defaultBtn,
+ },
+ },
+ });
+
+ wrapper = shallowMount(SourceEditorToolbarButton, {
+ propsData,
+ apolloProvider: mockApollo,
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ mockApollo = null;
+ });
+
+ describe('default', () => {
+ const defaultProps = {
+ category: 'primary',
+ variant: 'default',
+ };
+ const customProps = {
+ category: 'secondary',
+ variant: 'info',
+ };
+ it('renders a default button without props', async () => {
+ createComponentWithApollo();
+ const btn = findButton();
+ expect(btn.exists()).toBe(true);
+ expect(btn.props()).toMatchObject(defaultProps);
+ });
+
+ it('renders a button based on the props passed', async () => {
+ createComponentWithApollo({
+ propsData: {
+ button: customProps,
+ },
+ });
+ const btn = findButton();
+ expect(btn.props()).toMatchObject(customProps);
+ });
+ });
+
+ describe('button updates', () => {
+ it('it properly updates button on Apollo cache update', async () => {
+ const { id } = defaultBtn;
+
+ createComponentWithApollo({
+ propsData: {
+ button: {
+ id,
+ },
+ },
+ });
+
+ expect(findButton().props('selected')).toBe(false);
+
+ mockApollo.clients.defaultClient.cache.writeQuery({
+ query: getToolbarItemQuery,
+ variables: { id },
+ data: {
+ item: {
+ ...defaultBtn,
+ selected: true,
+ },
+ },
+ });
+
+ jest.runOnlyPendingTimers();
+ await nextTick();
+
+ expect(findButton().props('selected')).toBe(true);
+ });
+ });
+
+ describe('click handler', () => {
+ it('fires the click handler on the button when available', () => {
+ const spy = jest.fn();
+ createComponentWithApollo({
+ propsData: {
+ button: {
+ onClick: spy,
+ },
+ },
+ });
+ expect(spy).not.toHaveBeenCalled();
+ findButton().vm.$emit('click');
+ expect(spy).toHaveBeenCalled();
+ });
+ it('emits the "click" event', () => {
+ createComponentWithApollo();
+ jest.spyOn(wrapper.vm, '$emit');
+ expect(wrapper.vm.$emit).not.toHaveBeenCalled();
+ findButton().vm.$emit('click');
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('click');
+ });
+ it('triggers the mutation exposing the changed "selected" prop', () => {
+ const { id } = defaultBtn;
+ createComponentWithApollo({
+ propsData: {
+ button: {
+ id,
+ },
+ },
+ });
+ jest.spyOn(wrapper.vm.$apollo, 'mutate');
+ expect(wrapper.vm.$apollo.mutate).not.toHaveBeenCalled();
+ findButton().vm.$emit('click');
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: updateToolbarItemMutation,
+ variables: {
+ id,
+ propsToUpdate: {
+ selected: true,
+ },
+ },
+ });
+ });
+ });
+});
diff --git a/spec/frontend/editor/components/source_editor_toolbar_spec.js b/spec/frontend/editor/components/source_editor_toolbar_spec.js
new file mode 100644
index 00000000000..6e99eadbd97
--- /dev/null
+++ b/spec/frontend/editor/components/source_editor_toolbar_spec.js
@@ -0,0 +1,116 @@
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import { GlButtonGroup } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import SourceEditorToolbar from '~/editor/components/source_editor_toolbar.vue';
+import SourceEditorToolbarButton from '~/editor/components/source_editor_toolbar_button.vue';
+import { EDITOR_TOOLBAR_LEFT_GROUP, EDITOR_TOOLBAR_RIGHT_GROUP } from '~/editor/constants';
+import getToolbarItemsQuery from '~/editor/graphql/get_items.query.graphql';
+import { buildButton } from './helpers';
+
+Vue.use(VueApollo);
+
+describe('Source Editor Toolbar', () => {
+ let wrapper;
+ let mockApollo;
+
+ const findButtons = () => wrapper.findAllComponents(SourceEditorToolbarButton);
+
+ const createApolloMockWithCache = (items = []) => {
+ mockApollo = createMockApollo();
+ mockApollo.clients.defaultClient.cache.writeQuery({
+ query: getToolbarItemsQuery,
+ data: {
+ items: {
+ nodes: items,
+ },
+ },
+ });
+ };
+
+ const createComponentWithApollo = (items = []) => {
+ createApolloMockWithCache(items);
+ wrapper = shallowMount(SourceEditorToolbar, {
+ apolloProvider: mockApollo,
+ stubs: {
+ GlButtonGroup,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ mockApollo = null;
+ });
+
+ describe('groups', () => {
+ it.each`
+ group | expectedGroup
+ ${EDITOR_TOOLBAR_LEFT_GROUP} | ${EDITOR_TOOLBAR_LEFT_GROUP}
+ ${EDITOR_TOOLBAR_RIGHT_GROUP} | ${EDITOR_TOOLBAR_RIGHT_GROUP}
+ ${undefined} | ${EDITOR_TOOLBAR_RIGHT_GROUP}
+ ${'non-existing'} | ${EDITOR_TOOLBAR_RIGHT_GROUP}
+ `('puts item with group="$group" into $expectedGroup group', ({ group, expectedGroup }) => {
+ const item = buildButton('first', {
+ group,
+ });
+ createComponentWithApollo([item]);
+ expect(findButtons()).toHaveLength(1);
+ [EDITOR_TOOLBAR_RIGHT_GROUP, EDITOR_TOOLBAR_LEFT_GROUP].forEach((g) => {
+ if (g === expectedGroup) {
+ expect(wrapper.vm.getGroupItems(g)).toEqual([expect.objectContaining({ id: 'first' })]);
+ } else {
+ expect(wrapper.vm.getGroupItems(g)).toHaveLength(0);
+ }
+ });
+ });
+ });
+
+ describe('buttons update', () => {
+ it('it properly updates buttons on Apollo cache update', async () => {
+ const item = buildButton('first', {
+ group: EDITOR_TOOLBAR_RIGHT_GROUP,
+ });
+ createComponentWithApollo();
+
+ expect(findButtons()).toHaveLength(0);
+
+ mockApollo.clients.defaultClient.cache.writeQuery({
+ query: getToolbarItemsQuery,
+ data: {
+ items: {
+ nodes: [item],
+ },
+ },
+ });
+
+ jest.runOnlyPendingTimers();
+ await nextTick();
+
+ expect(findButtons()).toHaveLength(1);
+ });
+ });
+
+ describe('click handler', () => {
+ it('emits the "click" event when a button is clicked', () => {
+ const item1 = buildButton('first', {
+ group: EDITOR_TOOLBAR_LEFT_GROUP,
+ });
+ const item2 = buildButton('second', {
+ group: EDITOR_TOOLBAR_RIGHT_GROUP,
+ });
+ createComponentWithApollo([item1, item2]);
+ jest.spyOn(wrapper.vm, '$emit');
+ expect(wrapper.vm.$emit).not.toHaveBeenCalled();
+
+ findButtons().at(0).vm.$emit('click');
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('click', item1);
+
+ findButtons().at(1).vm.$emit('click');
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('click', item2);
+
+ expect(wrapper.vm.$emit.mock.calls).toHaveLength(2);
+ });
+ });
+});
diff --git a/spec/frontend/editor/schema/ci/ci_schema_spec.js b/spec/frontend/editor/schema/ci/ci_schema_spec.js
new file mode 100644
index 00000000000..628c34a27c1
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/ci_schema_spec.js
@@ -0,0 +1,90 @@
+import Ajv from 'ajv';
+import AjvFormats from 'ajv-formats';
+import CiSchema from '~/editor/schema/ci.json';
+
+// JSON POSITIVE TESTS
+import AllowFailureJson from './json_tests/positive_tests/allow_failure.json';
+import EnvironmentJson from './json_tests/positive_tests/environment.json';
+import GitlabCiDependenciesJson from './json_tests/positive_tests/gitlab-ci-dependencies.json';
+import GitlabCiJson from './json_tests/positive_tests/gitlab-ci.json';
+import InheritJson from './json_tests/positive_tests/inherit.json';
+import MultipleCachesJson from './json_tests/positive_tests/multiple-caches.json';
+import RetryJson from './json_tests/positive_tests/retry.json';
+import TerraformReportJson from './json_tests/positive_tests/terraform_report.json';
+import VariablesMixStringAndUserInputJson from './json_tests/positive_tests/variables_mix_string_and_user_input.json';
+import VariablesJson from './json_tests/positive_tests/variables.json';
+
+// JSON NEGATIVE TESTS
+import DefaultNoAdditionalPropertiesJson from './json_tests/negative_tests/default_no_additional_properties.json';
+import InheritDefaultNoAdditionalPropertiesJson from './json_tests/negative_tests/inherit_default_no_additional_properties.json';
+import JobVariablesMustNotContainObjectsJson from './json_tests/negative_tests/job_variables_must_not_contain_objects.json';
+import ReleaseAssetsLinksEmptyJson from './json_tests/negative_tests/release_assets_links_empty.json';
+import ReleaseAssetsLinksInvalidLinkTypeJson from './json_tests/negative_tests/release_assets_links_invalid_link_type.json';
+import ReleaseAssetsLinksMissingJson from './json_tests/negative_tests/release_assets_links_missing.json';
+import RetryUnknownWhenJson from './json_tests/negative_tests/retry_unknown_when.json';
+
+// YAML POSITIVE TEST
+import CacheYaml from './yaml_tests/positive_tests/cache.yml';
+import FilterYaml from './yaml_tests/positive_tests/filter.yml';
+import IncludeYaml from './yaml_tests/positive_tests/include.yml';
+import RulesYaml from './yaml_tests/positive_tests/rules.yml';
+
+// YAML NEGATIVE TEST
+import CacheNegativeYaml from './yaml_tests/negative_tests/cache.yml';
+import IncludeNegativeYaml from './yaml_tests/negative_tests/include.yml';
+
+const ajv = new Ajv({
+ strictTypes: false,
+ strictTuples: false,
+ allowMatchingProperties: true,
+});
+
+AjvFormats(ajv);
+const schema = ajv.compile(CiSchema);
+
+describe('positive tests', () => {
+ it.each(
+ Object.entries({
+ // JSON
+ AllowFailureJson,
+ EnvironmentJson,
+ GitlabCiDependenciesJson,
+ GitlabCiJson,
+ InheritJson,
+ MultipleCachesJson,
+ RetryJson,
+ TerraformReportJson,
+ VariablesMixStringAndUserInputJson,
+ VariablesJson,
+
+ // YAML
+ CacheYaml,
+ FilterYaml,
+ IncludeYaml,
+ RulesYaml,
+ }),
+ )('schema validates %s', (_, input) => {
+ expect(input).toValidateJsonSchema(schema);
+ });
+});
+
+describe('negative tests', () => {
+ it.each(
+ Object.entries({
+ // JSON
+ DefaultNoAdditionalPropertiesJson,
+ JobVariablesMustNotContainObjectsJson,
+ InheritDefaultNoAdditionalPropertiesJson,
+ ReleaseAssetsLinksEmptyJson,
+ ReleaseAssetsLinksInvalidLinkTypeJson,
+ ReleaseAssetsLinksMissingJson,
+ RetryUnknownWhenJson,
+
+ // YAML
+ CacheNegativeYaml,
+ IncludeNegativeYaml,
+ }),
+ )('schema validates %s', (_, input) => {
+ expect(input).not.toValidateJsonSchema(schema);
+ });
+});
diff --git a/spec/frontend/editor/schema/ci/json_tests/negative_tests/default_no_additional_properties.json b/spec/frontend/editor/schema/ci/json_tests/negative_tests/default_no_additional_properties.json
new file mode 100644
index 00000000000..955c19ef1ab
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/negative_tests/default_no_additional_properties.json
@@ -0,0 +1,12 @@
+{
+ "default": {
+ "secrets": {
+ "DATABASE_PASSWORD": {
+ "vault": "production/db/password"
+ }
+ },
+ "environment": {
+ "name": "test"
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/negative_tests/inherit_default_no_additional_properties.json b/spec/frontend/editor/schema/ci/json_tests/negative_tests/inherit_default_no_additional_properties.json
new file mode 100644
index 00000000000..7411e4c2434
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/negative_tests/inherit_default_no_additional_properties.json
@@ -0,0 +1,8 @@
+{
+ "karma": {
+ "inherit": {
+ "default": ["secrets"]
+ },
+ "script": "karma"
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/negative_tests/job_variables_must_not_contain_objects.json b/spec/frontend/editor/schema/ci/json_tests/negative_tests/job_variables_must_not_contain_objects.json
new file mode 100644
index 00000000000..bfdbf26ee70
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/negative_tests/job_variables_must_not_contain_objects.json
@@ -0,0 +1,12 @@
+{
+ "gitlab-ci-variables-object": {
+ "stage": "test",
+ "script": ["true"],
+ "variables": {
+ "DEPLOY_ENVIRONMENT": {
+ "value": "staging",
+ "description": "The deployment target. Change this variable to 'canary' or 'production' if needed."
+ }
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_empty.json b/spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_empty.json
new file mode 100644
index 00000000000..84a1aa14698
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_empty.json
@@ -0,0 +1,13 @@
+{
+ "gitlab-ci-release-assets-links-empty": {
+ "script": "dostuff",
+ "stage": "deploy",
+ "release": {
+ "description": "Created using the release-cli $EXTRA_DESCRIPTION",
+ "tag_name": "$CI_COMMIT_TAG",
+ "assets": {
+ "links": []
+ }
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_invalid_link_type.json b/spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_invalid_link_type.json
new file mode 100644
index 00000000000..048911aefa3
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_invalid_link_type.json
@@ -0,0 +1,24 @@
+{
+ "gitlab-ci-release-assets-links-invalid-link-type": {
+ "script": "dostuff",
+ "stage": "deploy",
+ "release": {
+ "description": "Created using the release-cli $EXTRA_DESCRIPTION",
+ "tag_name": "$CI_COMMIT_TAG",
+ "assets": {
+ "links": [
+ {
+ "name": "asset1",
+ "url": "https://example.com/assets/1"
+ },
+ {
+ "name": "asset2",
+ "url": "https://example.com/assets/2",
+ "filepath": "/pretty/url/1",
+ "link_type": "invalid"
+ }
+ ]
+ }
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_missing.json b/spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_missing.json
new file mode 100644
index 00000000000..6f0b5a3bff8
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/negative_tests/release_assets_links_missing.json
@@ -0,0 +1,11 @@
+{
+ "gitlab-ci-release-assets-links-missing": {
+ "script": "dostuff",
+ "stage": "deploy",
+ "release": {
+ "description": "Created using the release-cli $EXTRA_DESCRIPTION",
+ "tag_name": "$CI_COMMIT_TAG",
+ "assets": {}
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/negative_tests/retry_unknown_when.json b/spec/frontend/editor/schema/ci/json_tests/negative_tests/retry_unknown_when.json
new file mode 100644
index 00000000000..433504f52c6
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/negative_tests/retry_unknown_when.json
@@ -0,0 +1,9 @@
+{
+ "gitlab-ci-retry-object-unknown-when": {
+ "stage": "test",
+ "script": "rspec",
+ "retry": {
+ "when": "gitlab-ci-retry-object-unknown-when"
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/allow_failure.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/allow_failure.json
new file mode 100644
index 00000000000..44d42116c1a
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/allow_failure.json
@@ -0,0 +1,19 @@
+{
+ "job1": {
+ "stage": "test",
+ "script": ["execute_script_that_will_fail"],
+ "allow_failure": true
+ },
+ "job2": {
+ "script": ["exit 1"],
+ "allow_failure": {
+ "exit_codes": 137
+ }
+ },
+ "job3": {
+ "script": ["exit 137"],
+ "allow_failure": {
+ "exit_codes": [137, 255]
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/environment.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/environment.json
new file mode 100644
index 00000000000..0c6f7935063
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/environment.json
@@ -0,0 +1,75 @@
+{
+ "deploy to production 1": {
+ "stage": "deploy",
+ "script": "git push production HEAD: master",
+ "environment": "production"
+ },
+ "deploy to production 2": {
+ "stage": "deploy",
+ "script": "git push production HEAD:master",
+ "environment": {
+ "name": "production"
+ }
+ },
+ "deploy to production 3": {
+ "stage": "deploy",
+ "script": "git push production HEAD:master",
+ "environment": {
+ "name": "production",
+ "url": "https://prod.example.com"
+ }
+ },
+ "review_app 1": {
+ "stage": "deploy",
+ "script": "make deploy-app",
+ "environment": {
+ "name": "review/$CI_COMMIT_REF_NAME",
+ "url": "https://$CI_ENVIRONMENT_SLUG.example.com",
+ "on_stop": "stop_review_app"
+ }
+ },
+ "stop_review_app": {
+ "stage": "deploy",
+ "variables": {
+ "GIT_STRATEGY": "none"
+ },
+ "script": "make delete-app",
+ "when": "manual",
+ "environment": {
+ "name": "review/$CI_COMMIT_REF_NAME",
+ "action": "stop"
+ }
+ },
+ "review_app 2": {
+ "script": "deploy-review-app",
+ "environment": {
+ "name": "review/$CI_COMMIT_REF_NAME",
+ "auto_stop_in": "1 day"
+ }
+ },
+ "deploy 1": {
+ "stage": "deploy",
+ "script": "make deploy-app",
+ "environment": {
+ "name": "production",
+ "kubernetes": {
+ "namespace": "production"
+ }
+ }
+ },
+ "deploy 2": {
+ "script": "echo",
+ "environment": {
+ "name": "customer-portal",
+ "deployment_tier": "production"
+ }
+ },
+ "deploy as review app": {
+ "stage": "deploy",
+ "script": "make deploy",
+ "environment": {
+ "name": "review/$CI_COMMIT_REF_NAME",
+ "url": "https://$CI_ENVIRONMENT_SLUG.example.com/"
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci-dependencies.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci-dependencies.json
new file mode 100644
index 00000000000..5ffa7fa799e
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci-dependencies.json
@@ -0,0 +1,68 @@
+{
+ ".build_config": {
+ "before_script": ["echo test"]
+ },
+ ".build_script": "echo build script",
+ "default": {
+ "image": "ruby:2.5",
+ "services": ["docker:dind"],
+ "cache": {
+ "paths": ["vendor/"]
+ },
+ "before_script": ["bundle install --path vendor/"],
+ "after_script": ["rm -rf tmp/"]
+ },
+ "stages": ["install", "build", "test", "deploy"],
+ "image": "foo:latest",
+ "install task1": {
+ "image": "node:latest",
+ "stage": "install",
+ "script": "npm install",
+ "artifacts": {
+ "paths": ["node_modules/"]
+ }
+ },
+ "build dev": {
+ "image": "node:latest",
+ "stage": "build",
+ "needs": [
+ {
+ "job": "install task1"
+ }
+ ],
+ "script": "npm run build:dev"
+ },
+ "build prod": {
+ "image": "node:latest",
+ "stage": "build",
+ "needs": ["install task1"],
+ "script": "npm run build:prod"
+ },
+ "test": {
+ "image": "node:latest",
+ "stage": "build",
+ "needs": [
+ "install task1",
+ {
+ "job": "build dev",
+ "artifacts": true
+ }
+ ],
+ "script": "npm run test"
+ },
+ "deploy it": {
+ "image": "node:latest",
+ "stage": "deploy",
+ "needs": [
+ {
+ "job": "build dev",
+ "artifacts": false
+ },
+ {
+ "job": "build prod",
+ "artifacts": true
+ }
+ ],
+ "script": "npm run test"
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json
new file mode 100644
index 00000000000..89420bbc35f
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json
@@ -0,0 +1,350 @@
+{
+ ".build_config": {
+ "before_script": ["echo test"]
+ },
+ ".build_script": "echo build script",
+ ".example_variables": {
+ "foo": "hello",
+ "bar": 42
+ },
+ ".example_services": [
+ "docker:dind",
+ {
+ "name": "sql:latest",
+ "command": ["/usr/bin/super-sql", "run"]
+ }
+ ],
+ "default": {
+ "image": "ruby:2.5",
+ "services": ["docker:dind"],
+ "cache": {
+ "paths": ["vendor/"]
+ },
+ "before_script": ["bundle install --path vendor/"],
+ "after_script": ["rm -rf tmp/"],
+ "tags": ["ruby", "postgres"],
+ "artifacts": {
+ "name": "%CI_COMMIT_REF_NAME%",
+ "expose_as": "artifact 1",
+ "paths": ["path/to/file.txt", "target/*.war"],
+ "when": "on_failure"
+ },
+ "retry": 2,
+ "timeout": "3 hours 30 minutes",
+ "interruptible": true
+ },
+ "stages": ["build", "test", "deploy", "random"],
+ "image": "foo:latest",
+ "services": ["sql:latest"],
+ "before_script": ["echo test", "echo test2"],
+ "after_script": [],
+ "cache": {
+ "key": "asd",
+ "paths": ["dist/", ".foo"],
+ "untracked": false,
+ "policy": "pull"
+ },
+ "variables": {
+ "STAGE": "yep",
+ "PROD": "nope"
+ },
+ "include": [
+ "https://gitlab.com/awesome-project/raw/master/.before-script-template.yml",
+ "/templates/.after-script-template.yml",
+ { "template": "Auto-DevOps.gitlab-ci.yml" },
+ {
+ "project": "my-group/my-project",
+ "ref": "master",
+ "file": "/templates/.gitlab-ci-template.yml"
+ },
+ {
+ "project": "my-group/my-project",
+ "ref": "master",
+ "file": ["/templates/.gitlab-ci-template.yml", "/templates/another-template-to-include.yml"]
+ }
+ ],
+ "build": {
+ "image": {
+ "name": "node:latest"
+ },
+ "services": [],
+ "stage": "build",
+ "script": "npm run build",
+ "before_script": ["npm install"],
+ "rules": [
+ {
+ "if": "moo",
+ "changes": ["Moofile"],
+ "exists": ["main.cow"],
+ "when": "delayed",
+ "start_in": "3 hours"
+ }
+ ],
+ "retry": {
+ "max": 1,
+ "when": "stuck_or_timeout_failure"
+ },
+ "cache": {
+ "key": "$CI_COMMIT_REF_NAME",
+ "paths": ["node_modules/"],
+ "policy": "pull-push"
+ },
+ "artifacts": {
+ "paths": ["dist/"],
+ "expose_as": "link_name_in_merge_request",
+ "name": "bundles",
+ "when": "on_success",
+ "expire_in": "1 week",
+ "reports": {
+ "junit": "result.xml",
+ "cobertura": "cobertura-coverage.xml",
+ "codequality": "codequality.json",
+ "sast": "sast.json",
+ "dependency_scanning": "scan.json",
+ "container_scanning": "scan2.json",
+ "dast": "dast.json",
+ "license_management": "license.json",
+ "performance": "performance.json",
+ "metrics": "metrics.txt"
+ }
+ },
+ "variables": {
+ "FOO_BAR": "..."
+ },
+ "only": {
+ "kubernetes": "active",
+ "variables": ["$FOO_BAR == '...'"],
+ "changes": ["/path/to/file", "/another/file"]
+ },
+ "except": ["master", "tags"],
+ "tags": ["docker"],
+ "allow_failure": true,
+ "when": "manual"
+ },
+ "error-report": {
+ "when": "on_failure",
+ "script": "report error",
+ "stage": "test"
+ },
+ "test": {
+ "image": {
+ "name": "node:latest",
+ "entrypoint": [""]
+ },
+ "stage": "test",
+ "script": "npm test",
+ "parallel": 5,
+ "retry": {
+ "max": 2,
+ "when": [
+ "runner_system_failure",
+ "stuck_or_timeout_failure",
+ "script_failure",
+ "unknown_failure",
+ "always"
+ ]
+ },
+ "artifacts": {
+ "reports": {
+ "junit": ["result.xml"],
+ "cobertura": ["cobertura-coverage.xml"],
+ "codequality": ["codequality.json"],
+ "sast": ["sast.json"],
+ "dependency_scanning": ["scan.json"],
+ "container_scanning": ["scan2.json"],
+ "dast": ["dast.json"],
+ "license_management": ["license.json"],
+ "performance": ["performance.json"],
+ "metrics": ["metrics.txt"]
+ }
+ },
+ "coverage": "/Cycles: \\d+\\.\\d+$/",
+ "dependencies": []
+ },
+ "docker": {
+ "script": "docker build -t foo:latest",
+ "when": "delayed",
+ "start_in": "10 min",
+ "timeout": "1h",
+ "retry": 1,
+ "only": {
+ "changes": ["Dockerfile", "docker/scripts/*"]
+ }
+ },
+ "deploy": {
+ "services": [
+ {
+ "name": "sql:latest",
+ "entrypoint": [""],
+ "command": ["/usr/bin/super-sql", "run"],
+ "alias": "super-sql"
+ },
+ "sql:latest",
+ {
+ "name": "sql:latest",
+ "alias": "default-sql"
+ }
+ ],
+ "script": "dostuff",
+ "stage": "deploy",
+ "environment": {
+ "name": "prod",
+ "url": "http://example.com",
+ "on_stop": "stop-deploy"
+ },
+ "only": ["master"],
+ "release": {
+ "name": "Release $CI_COMMIT_TAG",
+ "description": "Created using the release-cli $EXTRA_DESCRIPTION",
+ "tag_name": "$CI_COMMIT_TAG",
+ "ref": "$CI_COMMIT_TAG",
+ "milestones": ["m1", "m2", "m3"],
+ "released_at": "2020-07-15T08:00:00Z",
+ "assets": {
+ "links": [
+ {
+ "name": "asset1",
+ "url": "https://example.com/assets/1"
+ },
+ {
+ "name": "asset2",
+ "url": "https://example.com/assets/2",
+ "filepath": "/pretty/url/1",
+ "link_type": "other"
+ },
+ {
+ "name": "asset3",
+ "url": "https://example.com/assets/3",
+ "link_type": "runbook"
+ },
+ {
+ "name": "asset4",
+ "url": "https://example.com/assets/4",
+ "link_type": "package"
+ },
+ {
+ "name": "asset5",
+ "url": "https://example.com/assets/5",
+ "link_type": "image"
+ }
+ ]
+ }
+ }
+ },
+ ".performance-tmpl": {
+ "after_script": ["echo after"],
+ "before_script": ["echo before"],
+ "variables": {
+ "SCRIPT_NOT_REQUIRED": "true"
+ }
+ },
+ "performance-a": {
+ "extends": ".performance-tmpl",
+ "script": "echo test"
+ },
+ "performance-b": {
+ "extends": ".performance-tmpl"
+ },
+ "workflow": {
+ "rules": [
+ {
+ "if": "$CI_COMMIT_REF_NAME =~ /-wip$/",
+ "when": "never"
+ },
+ {
+ "if": "$CI_COMMIT_TAG",
+ "when": "never"
+ },
+ {
+ "when": "always"
+ }
+ ]
+ },
+ "job": {
+ "script": "echo Hello, Rules!",
+ "rules": [
+ {
+ "if": "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == \"master\"",
+ "when": "manual",
+ "allow_failure": true
+ }
+ ]
+ },
+ "microservice_a": {
+ "trigger": {
+ "include": "path/to/microservice_a.yml"
+ }
+ },
+ "microservice_b": {
+ "trigger": {
+ "include": [{ "local": "path/to/microservice_b.yml" }, { "template": "SAST.gitlab-cy.yml" }],
+ "strategy": "depend"
+ }
+ },
+ "child-pipeline": {
+ "stage": "test",
+ "trigger": {
+ "include": [
+ {
+ "artifact": "generated-config.yml",
+ "job": "generate-config"
+ }
+ ]
+ }
+ },
+ "child-pipeline-simple": {
+ "stage": "test",
+ "trigger": {
+ "include": "other/file.yml"
+ }
+ },
+ "complex": {
+ "stage": "deploy",
+ "trigger": {
+ "project": "my/deployment",
+ "branch": "stable"
+ }
+ },
+ "parallel-integer": {
+ "stage": "test",
+ "script": ["echo ${CI_NODE_INDEX} ${CI_NODE_TOTAL}"],
+ "parallel": 5
+ },
+ "parallel-matrix-simple": {
+ "stage": "test",
+ "script": ["echo ${MY_VARIABLE}"],
+ "parallel": {
+ "matrix": [
+ {
+ "MY_VARIABLE": 0
+ },
+ {
+ "MY_VARIABLE": "sample"
+ },
+ {
+ "MY_VARIABLE": ["element0", 1, "element2"]
+ }
+ ]
+ }
+ },
+ "parallel-matrix-gitlab-docs": {
+ "stage": "deploy",
+ "script": ["bin/deploy"],
+ "parallel": {
+ "matrix": [
+ {
+ "PROVIDER": "aws",
+ "STACK": ["app1", "app2"]
+ },
+ {
+ "PROVIDER": "ovh",
+ "STACK": ["monitoring", "backup", "app"]
+ },
+ {
+ "PROVIDER": ["gcp", "vultr"],
+ "STACK": ["data", "processing"]
+ }
+ ]
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/inherit.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/inherit.json
new file mode 100644
index 00000000000..3f72afa6ceb
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/inherit.json
@@ -0,0 +1,54 @@
+{
+ "default": {
+ "image": "ruby:2.4",
+ "before_script": ["echo Hello World"]
+ },
+ "variables": {
+ "DOMAIN": "example.com",
+ "WEBHOOK_URL": "https://my-webhook.example.com"
+ },
+ "rubocop": {
+ "inherit": {
+ "default": false,
+ "variables": false
+ },
+ "script": "bundle exec rubocop"
+ },
+ "rspec": {
+ "inherit": {
+ "default": ["image"],
+ "variables": ["WEBHOOK_URL"]
+ },
+ "script": "bundle exec rspec"
+ },
+ "capybara": {
+ "inherit": {
+ "variables": false
+ },
+ "script": "bundle exec capybara"
+ },
+ "karma": {
+ "inherit": {
+ "default": true,
+ "variables": ["DOMAIN"]
+ },
+ "script": "karma"
+ },
+ "inherit literally all": {
+ "inherit": {
+ "default": [
+ "after_script",
+ "artifacts",
+ "before_script",
+ "cache",
+ "image",
+ "interruptible",
+ "retry",
+ "services",
+ "tags",
+ "timeout"
+ ]
+ },
+ "script": "true"
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/multiple-caches.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/multiple-caches.json
new file mode 100644
index 00000000000..360938e5ce7
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/multiple-caches.json
@@ -0,0 +1,24 @@
+{
+ "test-job": {
+ "stage": "build",
+ "cache": [
+ {
+ "key": {
+ "files": ["Gemfile.lock"]
+ },
+ "paths": ["vendor/ruby"]
+ },
+ {
+ "key": {
+ "files": ["yarn.lock"]
+ },
+ "paths": [".yarn-cache/"]
+ }
+ ],
+ "script": [
+ "bundle install --path=vendor",
+ "yarn install --cache-folder .yarn-cache",
+ "echo Run tests..."
+ ]
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/retry.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/retry.json
new file mode 100644
index 00000000000..1337e5e7bc8
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/retry.json
@@ -0,0 +1,60 @@
+{
+ "gitlab-ci-retry-int": {
+ "stage": "test",
+ "script": "rspec",
+ "retry": 2
+ },
+ "gitlab-ci-retry-object-no-max": {
+ "stage": "test",
+ "script": "rspec",
+ "retry": {
+ "when": "runner_system_failure"
+ }
+ },
+ "gitlab-ci-retry-object-single-when": {
+ "stage": "test",
+ "script": "rspec",
+ "retry": {
+ "max": 2,
+ "when": "runner_system_failure"
+ }
+ },
+ "gitlab-ci-retry-object-multiple-when": {
+ "stage": "test",
+ "script": "rspec",
+ "retry": {
+ "max": 2,
+ "when": ["runner_system_failure", "stuck_or_timeout_failure"]
+ }
+ },
+ "gitlab-ci-retry-object-multiple-when-dupes": {
+ "stage": "test",
+ "script": "rspec",
+ "retry": {
+ "max": 2,
+ "when": ["runner_system_failure", "runner_system_failure"]
+ }
+ },
+ "gitlab-ci-retry-object-all-when": {
+ "stage": "test",
+ "script": "rspec",
+ "retry": {
+ "max": 2,
+ "when": [
+ "always",
+ "unknown_failure",
+ "script_failure",
+ "api_failure",
+ "stuck_or_timeout_failure",
+ "runner_system_failure",
+ "runner_unsupported",
+ "stale_schedule",
+ "job_execution_timeout",
+ "archived_failure",
+ "unmet_prerequisites",
+ "scheduler_failure",
+ "data_integrity_failure"
+ ]
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/terraform_report.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/terraform_report.json
new file mode 100644
index 00000000000..0e444a4ba62
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/terraform_report.json
@@ -0,0 +1,50 @@
+{
+ "image": {
+ "name": "registry.gitlab.com/gitlab-org/gitlab-build-images:terraform",
+ "entrypoint": [
+ "/usr/bin/env",
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+ ]
+ },
+ "variables": {
+ "PLAN": "plan.tfplan",
+ "JSON_PLAN_FILE": "tfplan.json"
+ },
+ "cache": {
+ "paths": [".terraform"]
+ },
+ "before_script": [
+ "alias convert_report=\"jq -r '([.resource_changes[]?.change.actions?]|flatten)|{\"create\":(map(select(.==\"create\"))|length),\"update\":(map(select(.==\"update\"))|length),\"delete\":(map(select(.==\"delete\"))|length)}'\"",
+ "terraform --version",
+ "terraform init"
+ ],
+ "stages": ["validate", "build", "test", "deploy"],
+ "validate": {
+ "stage": "validate",
+ "script": ["terraform validate"]
+ },
+ "plan": {
+ "stage": "build",
+ "script": [
+ "terraform plan -out=$PLAN",
+ "terraform show --json $PLAN | convert_report > $JSON_PLAN_FILE"
+ ],
+ "artifacts": {
+ "name": "plan",
+ "paths": ["$PLAN"],
+ "reports": {
+ "terraform": "$JSON_PLAN_FILE"
+ }
+ }
+ },
+ "apply": {
+ "stage": "deploy",
+ "environment": {
+ "name": "production"
+ },
+ "script": ["terraform apply -input=false $PLAN"],
+ "dependencies": ["plan"],
+ "when": "manual",
+ "only": ["master"]
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/variables.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/variables.json
new file mode 100644
index 00000000000..ce59b3fbbec
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/variables.json
@@ -0,0 +1,22 @@
+{
+ "variables": {
+ "DEPLOY_ENVIRONMENT": {
+ "value": "staging",
+ "description": "The deployment target. Change this variable to 'canary' or 'production' if needed."
+ }
+ },
+ "gitlab-ci-variables-string": {
+ "stage": "test",
+ "script": ["true"],
+ "variables": {
+ "TEST_VAR": "String variable"
+ }
+ },
+ "gitlab-ci-variables-integer": {
+ "stage": "test",
+ "script": ["true"],
+ "variables": {
+ "canonical": 685230
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/variables_mix_string_and_user_input.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/variables_mix_string_and_user_input.json
new file mode 100644
index 00000000000..87a9ec05b57
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/variables_mix_string_and_user_input.json
@@ -0,0 +1,10 @@
+{
+ "variables": {
+ "SOME_STR": "--batch-mode --errors --fail-at-end --show-version",
+ "SOME_INT": 10,
+ "SOME_USER_INPUT_FLAG": {
+ "value": "flag value",
+ "description": "Some Flag!"
+ }
+ }
+}
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/cache.yml b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/cache.yml
new file mode 100644
index 00000000000..ee533f54d3b
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/cache.yml
@@ -0,0 +1,15 @@
+# Covers https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70779
+stages:
+ - prepare
+
+# invalid cache:when value
+job1:
+ stage: prepare
+ cache:
+ when: 0
+
+# invalid cache:when value
+job2:
+ stage: prepare
+ cache:
+ when: 'never'
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/include.yml b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/include.yml
new file mode 100644
index 00000000000..287150a765f
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/yaml_tests/negative_tests/include.yml
@@ -0,0 +1,17 @@
+# Covers https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70779
+stages:
+ - prepare
+
+# missing file property
+childPipeline:
+ stage: prepare
+ trigger:
+ include:
+ - project: 'my-group/my-pipeline-library'
+
+# missing project property
+childPipeline2:
+ stage: prepare
+ trigger:
+ include:
+ - file: '.gitlab-ci.yml'
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/cache.yml b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/cache.yml
new file mode 100644
index 00000000000..436c7d72699
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/cache.yml
@@ -0,0 +1,25 @@
+# Covers https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70779
+stages:
+ - prepare
+
+# test for cache:when values
+job1:
+ stage: prepare
+ script:
+ - echo 'running job'
+ cache:
+ when: 'on_success'
+
+job2:
+ stage: prepare
+ script:
+ - echo 'running job'
+ cache:
+ when: 'on_failure'
+
+job3:
+ stage: prepare
+ script:
+ - echo 'running job'
+ cache:
+ when: 'always'
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/filter.yml b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/filter.yml
new file mode 100644
index 00000000000..2b29c24fa3c
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/filter.yml
@@ -0,0 +1,18 @@
+# Covers https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79335
+deploy-template:
+ script:
+ - echo "hello world"
+ only:
+ - foo
+ except:
+ - bar
+
+# null value allowed
+deploy-without-only:
+ extends: deploy-template
+ only:
+
+# null value allowed
+deploy-without-except:
+ extends: deploy-template
+ except:
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/include.yml b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/include.yml
new file mode 100644
index 00000000000..3497be28058
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/include.yml
@@ -0,0 +1,32 @@
+# Covers https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70779
+
+# test for include:rules
+include:
+ - local: builds.yml
+ rules:
+ - if: '$INCLUDE_BUILDS == "true"'
+ when: always
+
+stages:
+ - prepare
+
+# test for trigger:include
+childPipeline:
+ stage: prepare
+ script:
+ - echo 'creating pipeline...'
+ trigger:
+ include:
+ - project: 'my-group/my-pipeline-library'
+ file: '.gitlab-ci.yml'
+
+# accepts optional ref property
+childPipeline2:
+ stage: prepare
+ script:
+ - echo 'creating pipeline...'
+ trigger:
+ include:
+ - project: 'my-group/my-pipeline-library'
+ file: '.gitlab-ci.yml'
+ ref: 'main'
diff --git a/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/rules.yml b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/rules.yml
new file mode 100644
index 00000000000..27a199cff13
--- /dev/null
+++ b/spec/frontend/editor/schema/ci/yaml_tests/positive_tests/rules.yml
@@ -0,0 +1,13 @@
+# Covers https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74164
+
+# test for workflow:rules:changes and workflow:rules:exists
+workflow:
+ rules:
+ - if: '$CI_PIPELINE_SOURCE == "schedule"'
+ exists:
+ - Dockerfile
+ changes:
+ - Dockerfile
+ variables:
+ IS_A_FEATURE: 'true'
+ when: always
diff --git a/spec/frontend/environments/deploy_board_component_spec.js b/spec/frontend/environments/deploy_board_component_spec.js
index f0fb4d1027c..6bf87f7b07f 100644
--- a/spec/frontend/environments/deploy_board_component_spec.js
+++ b/spec/frontend/environments/deploy_board_component_spec.js
@@ -23,9 +23,9 @@ describe('Deploy Board', () => {
});
describe('with valid data', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper = createComponent();
- nextTick(done);
+ return nextTick();
});
it('should render percentage with completion value provided', () => {
@@ -127,14 +127,14 @@ describe('Deploy Board', () => {
});
describe('with empty state', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper = createComponent({
deployBoardData: {},
isLoading: false,
isEmpty: true,
logsPath,
});
- nextTick(done);
+ return nextTick();
});
it('should render the empty state', () => {
@@ -146,14 +146,14 @@ describe('Deploy Board', () => {
});
describe('with loading state', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper = createComponent({
deployBoardData: {},
isLoading: true,
isEmpty: false,
logsPath,
});
- nextTick(done);
+ return nextTick();
});
it('should render loading spinner', () => {
@@ -163,7 +163,7 @@ describe('Deploy Board', () => {
describe('has legend component', () => {
let statuses = [];
- beforeEach((done) => {
+ beforeEach(() => {
wrapper = createComponent({
isLoading: false,
isEmpty: false,
@@ -171,7 +171,7 @@ describe('Deploy Board', () => {
deployBoardData: deployBoardMockData,
});
({ statuses } = wrapper.vm);
- nextTick(done);
+ return nextTick();
});
it('with all the possible statuses', () => {
diff --git a/spec/frontend/environments/empty_state_spec.js b/spec/frontend/environments/empty_state_spec.js
new file mode 100644
index 00000000000..974afc6d032
--- /dev/null
+++ b/spec/frontend/environments/empty_state_spec.js
@@ -0,0 +1,53 @@
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { s__ } from '~/locale';
+import EmptyState from '~/environments/components/empty_state.vue';
+import { ENVIRONMENTS_SCOPE } from '~/environments/constants';
+
+const HELP_PATH = '/help';
+
+describe('~/environments/components/empty_state.vue', () => {
+ let wrapper;
+
+ const createWrapper = ({ propsData = {} } = {}) =>
+ mountExtended(EmptyState, {
+ propsData: {
+ scope: ENVIRONMENTS_SCOPE.AVAILABLE,
+ helpPath: HELP_PATH,
+ ...propsData,
+ },
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('shows an empty state for available environments', () => {
+ wrapper = createWrapper();
+
+ const title = wrapper.findByRole('heading', {
+ name: s__("Environments|You don't have any environments."),
+ });
+
+ expect(title.exists()).toBe(true);
+ });
+
+ it('shows an empty state for stopped environments', () => {
+ wrapper = createWrapper({ propsData: { scope: ENVIRONMENTS_SCOPE.STOPPED } });
+
+ const title = wrapper.findByRole('heading', {
+ name: s__("Environments|You don't have any stopped environments."),
+ });
+
+ expect(title.exists()).toBe(true);
+ });
+
+ it('shows a link to the the help path', () => {
+ wrapper = createWrapper();
+
+ const link = wrapper.findByRole('link', {
+ name: s__('Environments|How do I create an environment?'),
+ });
+
+ expect(link.attributes('href')).toBe(HELP_PATH);
+ });
+});
diff --git a/spec/frontend/environments/emtpy_state_spec.js b/spec/frontend/environments/emtpy_state_spec.js
deleted file mode 100644
index 862d90e50dc..00000000000
--- a/spec/frontend/environments/emtpy_state_spec.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import EmptyState from '~/environments/components/empty_state.vue';
-
-describe('environments empty state', () => {
- let vm;
-
- beforeEach(() => {
- vm = shallowMount(EmptyState, {
- propsData: {
- helpPath: 'bar',
- },
- });
- });
-
- afterEach(() => {
- vm.destroy();
- });
-
- it('renders the empty state', () => {
- expect(vm.find('.js-blank-state-title').text()).toEqual(
- "You don't have any environments right now",
- );
- });
-});
diff --git a/spec/frontend/environments/environment_item_spec.js b/spec/frontend/environments/environment_item_spec.js
index 0b36d2a940d..0761d04229c 100644
--- a/spec/frontend/environments/environment_item_spec.js
+++ b/spec/frontend/environments/environment_item_spec.js
@@ -1,4 +1,5 @@
import { mount } from '@vue/test-utils';
+import { GlAvatarLink, GlAvatar } from '@gitlab/ui';
import { cloneDeep } from 'lodash';
import { format } from 'timeago.js';
import { mockTracking, unmockTracking, triggerEvent } from 'helpers/tracking_helper';
@@ -44,10 +45,16 @@ describe('Environment item', () => {
const findAutoStop = () => wrapper.find('.js-auto-stop');
const findUpcomingDeployment = () => wrapper.find('[data-testid="upcoming-deployment"]');
+ const findLastDeployment = () => wrapper.find('[data-testid="environment-deployment-id-cell"]');
const findUpcomingDeploymentContent = () =>
wrapper.find('[data-testid="upcoming-deployment-content"]');
const findUpcomingDeploymentStatusLink = () =>
wrapper.find('[data-testid="upcoming-deployment-status-link"]');
+ const findLastDeploymentAvatarLink = () => findLastDeployment().findComponent(GlAvatarLink);
+ const findLastDeploymentAvatar = () => findLastDeployment().findComponent(GlAvatar);
+ const findUpcomingDeploymentAvatarLink = () =>
+ findUpcomingDeployment().findComponent(GlAvatarLink);
+ const findUpcomingDeploymentAvatar = () => findUpcomingDeployment().findComponent(GlAvatar);
afterEach(() => {
wrapper.destroy();
@@ -79,9 +86,19 @@ describe('Environment item', () => {
describe('With user information', () => {
it('should render user avatar with link to profile', () => {
- expect(wrapper.find('.js-deploy-user-container').props('linkHref')).toEqual(
- environment.last_deployment.user.web_url,
- );
+ const avatarLink = findLastDeploymentAvatarLink();
+ const avatar = findLastDeploymentAvatar();
+ const { username, avatar_url, web_url } = environment.last_deployment.user;
+
+ expect(avatarLink.attributes('href')).toBe(web_url);
+ expect(avatar.props()).toMatchObject({
+ src: avatar_url,
+ entityName: username,
+ });
+ expect(avatar.attributes()).toMatchObject({
+ title: username,
+ alt: `${username}'s avatar`,
+ });
});
});
@@ -108,9 +125,16 @@ describe('Environment item', () => {
describe('When the envionment has an upcoming deployment', () => {
describe('When the upcoming deployment has a deployable', () => {
it('should render the build ID and user', () => {
- expect(findUpcomingDeploymentContent().text()).toMatchInterpolatedText(
- '#27 by upcoming-username',
- );
+ const avatarLink = findUpcomingDeploymentAvatarLink();
+ const avatar = findUpcomingDeploymentAvatar();
+ const { username, avatar_url, web_url } = environment.upcoming_deployment.user;
+
+ expect(findUpcomingDeploymentContent().text()).toMatchInterpolatedText('#27 by');
+ expect(avatarLink.attributes('href')).toBe(web_url);
+ expect(avatar.props()).toMatchObject({
+ src: avatar_url,
+ entityName: username,
+ });
});
it('should render a status icon with a link and tooltip', () => {
@@ -139,10 +163,17 @@ describe('Environment item', () => {
});
});
- it('should still renders the build ID and user', () => {
- expect(findUpcomingDeploymentContent().text()).toMatchInterpolatedText(
- '#27 by upcoming-username',
- );
+ it('should still render the build ID and user avatar', () => {
+ const avatarLink = findUpcomingDeploymentAvatarLink();
+ const avatar = findUpcomingDeploymentAvatar();
+ const { username, avatar_url, web_url } = environment.upcoming_deployment.user;
+
+ expect(findUpcomingDeploymentContent().text()).toMatchInterpolatedText('#27 by');
+ expect(avatarLink.attributes('href')).toBe(web_url);
+ expect(avatar.props()).toMatchObject({
+ src: avatar_url,
+ entityName: username,
+ });
});
it('should not render the status icon', () => {
@@ -383,7 +414,7 @@ describe('Environment item', () => {
});
it('should hide non-folder properties', () => {
- expect(wrapper.find('[data-testid="environment-deployment-id-cell"]').exists()).toBe(false);
+ expect(findLastDeployment().exists()).toBe(false);
expect(wrapper.find('[data-testid="environment-build-cell"]').exists()).toBe(false);
});
});
diff --git a/spec/frontend/environments/environment_table_spec.js b/spec/frontend/environments/environment_table_spec.js
index c7582e4b06d..666e87c748e 100644
--- a/spec/frontend/environments/environment_table_spec.js
+++ b/spec/frontend/environments/environment_table_spec.js
@@ -122,7 +122,7 @@ describe('Environment table', () => {
expect(wrapper.find('.deploy-board-icon').exists()).toBe(true);
});
- it('should toggle deploy board visibility when arrow is clicked', (done) => {
+ it('should toggle deploy board visibility when arrow is clicked', async () => {
const mockItem = {
name: 'review',
size: 1,
@@ -142,7 +142,6 @@ describe('Environment table', () => {
eventHub.$on('toggleDeployBoard', (env) => {
expect(env.id).toEqual(mockItem.id);
- done();
});
factory({
@@ -154,7 +153,7 @@ describe('Environment table', () => {
},
});
- wrapper.find('.deploy-board-icon').trigger('click');
+ await wrapper.find('.deploy-board-icon').trigger('click');
});
it('should set the environment to change and weight when a change canary weight event is recevied', async () => {
diff --git a/spec/frontend/environments/graphql/mock_data.js b/spec/frontend/environments/graphql/mock_data.js
index 1b7b35702de..7e436476a8f 100644
--- a/spec/frontend/environments/graphql/mock_data.js
+++ b/spec/frontend/environments/graphql/mock_data.js
@@ -543,6 +543,7 @@ export const resolvedEnvironment = {
externalUrl: 'https://example.org',
environmentType: 'review',
nameWithoutType: 'hello',
+ tier: 'development',
lastDeployment: {
id: 78,
iid: 24,
@@ -551,6 +552,7 @@ export const resolvedEnvironment = {
status: 'success',
createdAt: '2022-01-07T15:47:27.415Z',
deployedAt: '2022-01-07T15:47:32.450Z',
+ tierInYaml: 'staging',
tag: false,
isLast: true,
user: {
diff --git a/spec/frontend/environments/new_environment_item_spec.js b/spec/frontend/environments/new_environment_item_spec.js
index 1d7a33fb95b..cf0c8a7e7ca 100644
--- a/spec/frontend/environments/new_environment_item_spec.js
+++ b/spec/frontend/environments/new_environment_item_spec.js
@@ -73,6 +73,34 @@ describe('~/environments/components/new_environment_item.vue', () => {
expect(name.text()).toHaveLength(80);
});
+ describe('tier', () => {
+ it('displays the tier of the environment when defined in yaml', () => {
+ wrapper = createWrapper({ apolloProvider: createApolloProvider() });
+
+ const tier = wrapper.findByTitle(s__('Environment|Deployment tier'));
+
+ expect(tier.text()).toBe(resolvedEnvironment.lastDeployment.tierInYaml);
+ });
+
+ it('does not display the tier if not defined in yaml', () => {
+ const environment = {
+ ...resolvedEnvironment,
+ lastDeployment: {
+ ...resolvedEnvironment.lastDeployment,
+ tierInYaml: null,
+ },
+ };
+ wrapper = createWrapper({
+ propsData: { environment },
+ apolloProvider: createApolloProvider(),
+ });
+
+ const tier = wrapper.findByTitle(s__('Environment|Deployment tier'));
+
+ expect(tier.exists()).toBe(false);
+ });
+ });
+
describe('url', () => {
it('shows a link for the url if one is present', () => {
wrapper = createWrapper({ apolloProvider: createApolloProvider() });
diff --git a/spec/frontend/error_tracking/store/actions_spec.js b/spec/frontend/error_tracking/store/actions_spec.js
index aaaa1194a29..6bac21341a7 100644
--- a/spec/frontend/error_tracking/store/actions_spec.js
+++ b/spec/frontend/error_tracking/store/actions_spec.js
@@ -28,9 +28,9 @@ describe('Sentry common store actions', () => {
const params = { endpoint, redirectUrl, status };
describe('updateStatus', () => {
- it('should handle successful status update', (done) => {
+ it('should handle successful status update', async () => {
mock.onPut().reply(200, {});
- testAction(
+ await testAction(
actions.updateStatus,
params,
{},
@@ -41,20 +41,15 @@ describe('Sentry common store actions', () => {
},
],
[],
- () => {
- done();
- expect(visitUrl).toHaveBeenCalledWith(redirectUrl);
- },
);
+ expect(visitUrl).toHaveBeenCalledWith(redirectUrl);
});
- it('should handle unsuccessful status update', (done) => {
+ it('should handle unsuccessful status update', async () => {
mock.onPut().reply(400, {});
- testAction(actions.updateStatus, params, {}, [], [], () => {
- expect(visitUrl).not.toHaveBeenCalled();
- expect(createFlash).toHaveBeenCalledTimes(1);
- done();
- });
+ await testAction(actions.updateStatus, params, {}, [], []);
+ expect(visitUrl).not.toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalledTimes(1);
});
});
diff --git a/spec/frontend/error_tracking/store/details/actions_spec.js b/spec/frontend/error_tracking/store/details/actions_spec.js
index 623cb82851d..a3a6f7cc309 100644
--- a/spec/frontend/error_tracking/store/details/actions_spec.js
+++ b/spec/frontend/error_tracking/store/details/actions_spec.js
@@ -28,10 +28,10 @@ describe('Sentry error details store actions', () => {
describe('startPollingStacktrace', () => {
const endpoint = '123/stacktrace';
- it('should commit SET_ERROR with received response', (done) => {
+ it('should commit SET_ERROR with received response', () => {
const payload = { error: [1, 2, 3] };
mockedAdapter.onGet().reply(200, payload);
- testAction(
+ return testAction(
actions.startPollingStacktrace,
{ endpoint },
{},
@@ -40,37 +40,29 @@ describe('Sentry error details store actions', () => {
{ type: types.SET_LOADING_STACKTRACE, payload: false },
],
[],
- () => {
- done();
- },
);
});
- it('should show flash on API error', (done) => {
+ it('should show flash on API error', async () => {
mockedAdapter.onGet().reply(400);
- testAction(
+ await testAction(
actions.startPollingStacktrace,
{ endpoint },
{},
[{ type: types.SET_LOADING_STACKTRACE, payload: false }],
[],
- () => {
- expect(createFlash).toHaveBeenCalledTimes(1);
- done();
- },
);
+ expect(createFlash).toHaveBeenCalledTimes(1);
});
- it('should not restart polling when receiving an empty 204 response', (done) => {
+ it('should not restart polling when receiving an empty 204 response', async () => {
mockedRestart = jest.spyOn(Poll.prototype, 'restart');
mockedAdapter.onGet().reply(204);
- testAction(actions.startPollingStacktrace, { endpoint }, {}, [], [], () => {
- mockedRestart = jest.spyOn(Poll.prototype, 'restart');
- expect(mockedRestart).toHaveBeenCalledTimes(0);
- done();
- });
+ await testAction(actions.startPollingStacktrace, { endpoint }, {}, [], []);
+ mockedRestart = jest.spyOn(Poll.prototype, 'restart');
+ expect(mockedRestart).toHaveBeenCalledTimes(0);
});
});
});
diff --git a/spec/frontend/error_tracking/store/list/actions_spec.js b/spec/frontend/error_tracking/store/list/actions_spec.js
index 5465bde397c..7173f68bb96 100644
--- a/spec/frontend/error_tracking/store/list/actions_spec.js
+++ b/spec/frontend/error_tracking/store/list/actions_spec.js
@@ -20,11 +20,11 @@ describe('error tracking actions', () => {
});
describe('startPolling', () => {
- it('should start polling for data', (done) => {
+ it('should start polling for data', () => {
const payload = { errors: [{ id: 1 }, { id: 2 }] };
mock.onGet().reply(httpStatusCodes.OK, payload);
- testAction(
+ return testAction(
actions.startPolling,
{},
{},
@@ -35,16 +35,13 @@ describe('error tracking actions', () => {
{ type: types.SET_LOADING, payload: false },
],
[{ type: 'stopPolling' }],
- () => {
- done();
- },
);
});
- it('should show flash on API error', (done) => {
+ it('should show flash on API error', async () => {
mock.onGet().reply(httpStatusCodes.BAD_REQUEST);
- testAction(
+ await testAction(
actions.startPolling,
{},
{},
@@ -53,11 +50,8 @@ describe('error tracking actions', () => {
{ type: types.SET_LOADING, payload: false },
],
[],
- () => {
- expect(createFlash).toHaveBeenCalledTimes(1);
- done();
- },
);
+ expect(createFlash).toHaveBeenCalledTimes(1);
});
});
diff --git a/spec/frontend/error_tracking_settings/store/actions_spec.js b/spec/frontend/error_tracking_settings/store/actions_spec.js
index 1b9be042dd4..bcd816c2ae0 100644
--- a/spec/frontend/error_tracking_settings/store/actions_spec.js
+++ b/spec/frontend/error_tracking_settings/store/actions_spec.js
@@ -27,9 +27,9 @@ describe('error tracking settings actions', () => {
refreshCurrentPage.mockClear();
});
- it('should request and transform the project list', (done) => {
+ it('should request and transform the project list', async () => {
mock.onGet(TEST_HOST).reply(() => [200, { projects: projectList }]);
- testAction(
+ await testAction(
actions.fetchProjects,
null,
state,
@@ -41,16 +41,13 @@ describe('error tracking settings actions', () => {
payload: projectList.map(convertObjectPropsToCamelCase),
},
],
- () => {
- expect(mock.history.get.length).toBe(1);
- done();
- },
);
+ expect(mock.history.get.length).toBe(1);
});
- it('should handle a server error', (done) => {
+ it('should handle a server error', async () => {
mock.onGet(`${TEST_HOST}.json`).reply(() => [400]);
- testAction(
+ await testAction(
actions.fetchProjects,
null,
state,
@@ -61,27 +58,23 @@ describe('error tracking settings actions', () => {
type: 'receiveProjectsError',
},
],
- () => {
- expect(mock.history.get.length).toBe(1);
- done();
- },
);
+ expect(mock.history.get.length).toBe(1);
});
- it('should request projects correctly', (done) => {
- testAction(
+ it('should request projects correctly', () => {
+ return testAction(
actions.requestProjects,
null,
state,
[{ type: types.SET_PROJECTS_LOADING, payload: true }, { type: types.RESET_CONNECT }],
[],
- done,
);
});
- it('should receive projects correctly', (done) => {
+ it('should receive projects correctly', () => {
const testPayload = [];
- testAction(
+ return testAction(
actions.receiveProjectsSuccess,
testPayload,
state,
@@ -91,13 +84,12 @@ describe('error tracking settings actions', () => {
{ type: types.SET_PROJECTS_LOADING, payload: false },
],
[],
- done,
);
});
- it('should handle errors when receiving projects', (done) => {
+ it('should handle errors when receiving projects', () => {
const testPayload = [];
- testAction(
+ return testAction(
actions.receiveProjectsError,
testPayload,
state,
@@ -107,7 +99,6 @@ describe('error tracking settings actions', () => {
{ type: types.SET_PROJECTS_LOADING, payload: false },
],
[],
- done,
);
});
});
@@ -126,18 +117,16 @@ describe('error tracking settings actions', () => {
mock.restore();
});
- it('should save the page', (done) => {
+ it('should save the page', async () => {
mock.onPatch(TEST_HOST).reply(200);
- testAction(actions.updateSettings, null, state, [], [{ type: 'requestSettings' }], () => {
- expect(mock.history.patch.length).toBe(1);
- expect(refreshCurrentPage).toHaveBeenCalled();
- done();
- });
+ await testAction(actions.updateSettings, null, state, [], [{ type: 'requestSettings' }]);
+ expect(mock.history.patch.length).toBe(1);
+ expect(refreshCurrentPage).toHaveBeenCalled();
});
- it('should handle a server error', (done) => {
+ it('should handle a server error', async () => {
mock.onPatch(TEST_HOST).reply(400);
- testAction(
+ await testAction(
actions.updateSettings,
null,
state,
@@ -149,57 +138,50 @@ describe('error tracking settings actions', () => {
payload: new Error('Request failed with status code 400'),
},
],
- () => {
- expect(mock.history.patch.length).toBe(1);
- done();
- },
);
+ expect(mock.history.patch.length).toBe(1);
});
- it('should request to save the page', (done) => {
- testAction(
+ it('should request to save the page', () => {
+ return testAction(
actions.requestSettings,
null,
state,
[{ type: types.UPDATE_SETTINGS_LOADING, payload: true }],
[],
- done,
);
});
- it('should handle errors when requesting to save the page', (done) => {
- testAction(
+ it('should handle errors when requesting to save the page', () => {
+ return testAction(
actions.receiveSettingsError,
{},
state,
[{ type: types.UPDATE_SETTINGS_LOADING, payload: false }],
[],
- done,
);
});
});
describe('generic actions to update the store', () => {
const testData = 'test';
- it('should reset the `connect success` flag when updating the api host', (done) => {
- testAction(
+ it('should reset the `connect success` flag when updating the api host', () => {
+ return testAction(
actions.updateApiHost,
testData,
state,
[{ type: types.UPDATE_API_HOST, payload: testData }, { type: types.RESET_CONNECT }],
[],
- done,
);
});
- it('should reset the `connect success` flag when updating the token', (done) => {
- testAction(
+ it('should reset the `connect success` flag when updating the token', () => {
+ return testAction(
actions.updateToken,
testData,
state,
[{ type: types.UPDATE_TOKEN, payload: testData }, { type: types.RESET_CONNECT }],
[],
- done,
);
});
diff --git a/spec/frontend/feature_flags/store/edit/actions_spec.js b/spec/frontend/feature_flags/store/edit/actions_spec.js
index 12fccd79170..b6114cb0c9f 100644
--- a/spec/frontend/feature_flags/store/edit/actions_spec.js
+++ b/spec/frontend/feature_flags/store/edit/actions_spec.js
@@ -40,7 +40,7 @@ describe('Feature flags Edit Module actions', () => {
});
describe('success', () => {
- it('dispatches requestUpdateFeatureFlag and receiveUpdateFeatureFlagSuccess ', (done) => {
+ it('dispatches requestUpdateFeatureFlag and receiveUpdateFeatureFlagSuccess ', () => {
const featureFlag = {
name: 'name',
description: 'description',
@@ -57,7 +57,7 @@ describe('Feature flags Edit Module actions', () => {
};
mock.onPut(mockedState.endpoint, mapStrategiesToRails(featureFlag)).replyOnce(200);
- testAction(
+ return testAction(
updateFeatureFlag,
featureFlag,
mockedState,
@@ -70,16 +70,15 @@ describe('Feature flags Edit Module actions', () => {
type: 'receiveUpdateFeatureFlagSuccess',
},
],
- done,
);
});
});
describe('error', () => {
- it('dispatches requestUpdateFeatureFlag and receiveUpdateFeatureFlagError ', (done) => {
+ it('dispatches requestUpdateFeatureFlag and receiveUpdateFeatureFlagError ', () => {
mock.onPut(`${TEST_HOST}/endpoint.json`).replyOnce(500, { message: [] });
- testAction(
+ return testAction(
updateFeatureFlag,
{
name: 'feature_flag',
@@ -97,28 +96,26 @@ describe('Feature flags Edit Module actions', () => {
payload: { message: [] },
},
],
- done,
);
});
});
});
describe('requestUpdateFeatureFlag', () => {
- it('should commit REQUEST_UPDATE_FEATURE_FLAG mutation', (done) => {
- testAction(
+ it('should commit REQUEST_UPDATE_FEATURE_FLAG mutation', () => {
+ return testAction(
requestUpdateFeatureFlag,
null,
mockedState,
[{ type: types.REQUEST_UPDATE_FEATURE_FLAG }],
[],
- done,
);
});
});
describe('receiveUpdateFeatureFlagSuccess', () => {
- it('should commit RECEIVE_UPDATE_FEATURE_FLAG_SUCCESS mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_UPDATE_FEATURE_FLAG_SUCCESS mutation', () => {
+ return testAction(
receiveUpdateFeatureFlagSuccess,
null,
mockedState,
@@ -128,20 +125,18 @@ describe('Feature flags Edit Module actions', () => {
},
],
[],
- done,
);
});
});
describe('receiveUpdateFeatureFlagError', () => {
- it('should commit RECEIVE_UPDATE_FEATURE_FLAG_ERROR mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_UPDATE_FEATURE_FLAG_ERROR mutation', () => {
+ return testAction(
receiveUpdateFeatureFlagError,
'There was an error',
mockedState,
[{ type: types.RECEIVE_UPDATE_FEATURE_FLAG_ERROR, payload: 'There was an error' }],
[],
- done,
);
});
});
@@ -159,10 +154,10 @@ describe('Feature flags Edit Module actions', () => {
});
describe('success', () => {
- it('dispatches requestFeatureFlag and receiveFeatureFlagSuccess ', (done) => {
+ it('dispatches requestFeatureFlag and receiveFeatureFlagSuccess ', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`).replyOnce(200, { id: 1 });
- testAction(
+ return testAction(
fetchFeatureFlag,
{ id: 1 },
mockedState,
@@ -176,16 +171,15 @@ describe('Feature flags Edit Module actions', () => {
payload: { id: 1 },
},
],
- done,
);
});
});
describe('error', () => {
- it('dispatches requestFeatureFlag and receiveUpdateFeatureFlagError ', (done) => {
+ it('dispatches requestFeatureFlag and receiveUpdateFeatureFlagError ', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`, {}).replyOnce(500, {});
- testAction(
+ return testAction(
fetchFeatureFlag,
null,
mockedState,
@@ -198,41 +192,38 @@ describe('Feature flags Edit Module actions', () => {
type: 'receiveFeatureFlagError',
},
],
- done,
);
});
});
});
describe('requestFeatureFlag', () => {
- it('should commit REQUEST_FEATURE_FLAG mutation', (done) => {
- testAction(
+ it('should commit REQUEST_FEATURE_FLAG mutation', () => {
+ return testAction(
requestFeatureFlag,
null,
mockedState,
[{ type: types.REQUEST_FEATURE_FLAG }],
[],
- done,
);
});
});
describe('receiveFeatureFlagSuccess', () => {
- it('should commit RECEIVE_FEATURE_FLAG_SUCCESS mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_FEATURE_FLAG_SUCCESS mutation', () => {
+ return testAction(
receiveFeatureFlagSuccess,
{ id: 1 },
mockedState,
[{ type: types.RECEIVE_FEATURE_FLAG_SUCCESS, payload: { id: 1 } }],
[],
- done,
);
});
});
describe('receiveFeatureFlagError', () => {
- it('should commit RECEIVE_FEATURE_FLAG_ERROR mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_FEATURE_FLAG_ERROR mutation', () => {
+ return testAction(
receiveFeatureFlagError,
null,
mockedState,
@@ -242,20 +233,18 @@ describe('Feature flags Edit Module actions', () => {
},
],
[],
- done,
);
});
});
describe('toggelActive', () => {
- it('should commit TOGGLE_ACTIVE mutation', (done) => {
- testAction(
+ it('should commit TOGGLE_ACTIVE mutation', () => {
+ return testAction(
toggleActive,
true,
mockedState,
[{ type: types.TOGGLE_ACTIVE, payload: true }],
[],
- done,
);
});
});
diff --git a/spec/frontend/feature_flags/store/index/actions_spec.js b/spec/frontend/feature_flags/store/index/actions_spec.js
index a59f99f538c..ce62c3b0473 100644
--- a/spec/frontend/feature_flags/store/index/actions_spec.js
+++ b/spec/frontend/feature_flags/store/index/actions_spec.js
@@ -32,14 +32,13 @@ describe('Feature flags actions', () => {
});
describe('setFeatureFlagsOptions', () => {
- it('should commit SET_FEATURE_FLAGS_OPTIONS mutation', (done) => {
- testAction(
+ it('should commit SET_FEATURE_FLAGS_OPTIONS mutation', () => {
+ return testAction(
setFeatureFlagsOptions,
{ page: '1', scope: 'all' },
mockedState,
[{ type: types.SET_FEATURE_FLAGS_OPTIONS, payload: { page: '1', scope: 'all' } }],
[],
- done,
);
});
});
@@ -57,10 +56,10 @@ describe('Feature flags actions', () => {
});
describe('success', () => {
- it('dispatches requestFeatureFlags and receiveFeatureFlagsSuccess ', (done) => {
+ it('dispatches requestFeatureFlags and receiveFeatureFlagsSuccess ', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`).replyOnce(200, getRequestData, {});
- testAction(
+ return testAction(
fetchFeatureFlags,
null,
mockedState,
@@ -74,16 +73,15 @@ describe('Feature flags actions', () => {
type: 'receiveFeatureFlagsSuccess',
},
],
- done,
);
});
});
describe('error', () => {
- it('dispatches requestFeatureFlags and receiveFeatureFlagsError ', (done) => {
+ it('dispatches requestFeatureFlags and receiveFeatureFlagsError ', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`, {}).replyOnce(500, {});
- testAction(
+ return testAction(
fetchFeatureFlags,
null,
mockedState,
@@ -96,28 +94,26 @@ describe('Feature flags actions', () => {
type: 'receiveFeatureFlagsError',
},
],
- done,
);
});
});
});
describe('requestFeatureFlags', () => {
- it('should commit RECEIVE_FEATURE_FLAGS_SUCCESS mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_FEATURE_FLAGS_SUCCESS mutation', () => {
+ return testAction(
requestFeatureFlags,
null,
mockedState,
[{ type: types.REQUEST_FEATURE_FLAGS }],
[],
- done,
);
});
});
describe('receiveFeatureFlagsSuccess', () => {
- it('should commit RECEIVE_FEATURE_FLAGS_SUCCESS mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_FEATURE_FLAGS_SUCCESS mutation', () => {
+ return testAction(
receiveFeatureFlagsSuccess,
{ data: getRequestData, headers: {} },
mockedState,
@@ -128,20 +124,18 @@ describe('Feature flags actions', () => {
},
],
[],
- done,
);
});
});
describe('receiveFeatureFlagsError', () => {
- it('should commit RECEIVE_FEATURE_FLAGS_ERROR mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_FEATURE_FLAGS_ERROR mutation', () => {
+ return testAction(
receiveFeatureFlagsError,
null,
mockedState,
[{ type: types.RECEIVE_FEATURE_FLAGS_ERROR }],
[],
- done,
);
});
});
@@ -159,10 +153,10 @@ describe('Feature flags actions', () => {
});
describe('success', () => {
- it('dispatches requestRotateInstanceId and receiveRotateInstanceIdSuccess ', (done) => {
+ it('dispatches requestRotateInstanceId and receiveRotateInstanceIdSuccess ', () => {
mock.onPost(`${TEST_HOST}/endpoint.json`).replyOnce(200, rotateData, {});
- testAction(
+ return testAction(
rotateInstanceId,
null,
mockedState,
@@ -176,16 +170,15 @@ describe('Feature flags actions', () => {
type: 'receiveRotateInstanceIdSuccess',
},
],
- done,
);
});
});
describe('error', () => {
- it('dispatches requestRotateInstanceId and receiveRotateInstanceIdError ', (done) => {
+ it('dispatches requestRotateInstanceId and receiveRotateInstanceIdError ', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`, {}).replyOnce(500, {});
- testAction(
+ return testAction(
rotateInstanceId,
null,
mockedState,
@@ -198,28 +191,26 @@ describe('Feature flags actions', () => {
type: 'receiveRotateInstanceIdError',
},
],
- done,
);
});
});
});
describe('requestRotateInstanceId', () => {
- it('should commit REQUEST_ROTATE_INSTANCE_ID mutation', (done) => {
- testAction(
+ it('should commit REQUEST_ROTATE_INSTANCE_ID mutation', () => {
+ return testAction(
requestRotateInstanceId,
null,
mockedState,
[{ type: types.REQUEST_ROTATE_INSTANCE_ID }],
[],
- done,
);
});
});
describe('receiveRotateInstanceIdSuccess', () => {
- it('should commit RECEIVE_ROTATE_INSTANCE_ID_SUCCESS mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_ROTATE_INSTANCE_ID_SUCCESS mutation', () => {
+ return testAction(
receiveRotateInstanceIdSuccess,
{ data: rotateData, headers: {} },
mockedState,
@@ -230,20 +221,18 @@ describe('Feature flags actions', () => {
},
],
[],
- done,
);
});
});
describe('receiveRotateInstanceIdError', () => {
- it('should commit RECEIVE_ROTATE_INSTANCE_ID_ERROR mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_ROTATE_INSTANCE_ID_ERROR mutation', () => {
+ return testAction(
receiveRotateInstanceIdError,
null,
mockedState,
[{ type: types.RECEIVE_ROTATE_INSTANCE_ID_ERROR }],
[],
- done,
);
});
});
@@ -262,10 +251,10 @@ describe('Feature flags actions', () => {
mock.restore();
});
describe('success', () => {
- it('dispatches updateFeatureFlag and receiveUpdateFeatureFlagSuccess', (done) => {
+ it('dispatches updateFeatureFlag and receiveUpdateFeatureFlagSuccess', () => {
mock.onPut(featureFlag.update_path).replyOnce(200, featureFlag, {});
- testAction(
+ return testAction(
toggleFeatureFlag,
featureFlag,
mockedState,
@@ -280,15 +269,15 @@ describe('Feature flags actions', () => {
type: 'receiveUpdateFeatureFlagSuccess',
},
],
- done,
);
});
});
+
describe('error', () => {
- it('dispatches updateFeatureFlag and receiveUpdateFeatureFlagSuccess', (done) => {
+ it('dispatches updateFeatureFlag and receiveUpdateFeatureFlagSuccess', () => {
mock.onPut(featureFlag.update_path).replyOnce(500);
- testAction(
+ return testAction(
toggleFeatureFlag,
featureFlag,
mockedState,
@@ -303,7 +292,6 @@ describe('Feature flags actions', () => {
type: 'receiveUpdateFeatureFlagError',
},
],
- done,
);
});
});
@@ -315,8 +303,8 @@ describe('Feature flags actions', () => {
}));
});
- it('commits UPDATE_FEATURE_FLAG with the given flag', (done) => {
- testAction(
+ it('commits UPDATE_FEATURE_FLAG with the given flag', () => {
+ return testAction(
updateFeatureFlag,
featureFlag,
mockedState,
@@ -327,7 +315,6 @@ describe('Feature flags actions', () => {
},
],
[],
- done,
);
});
});
@@ -338,8 +325,8 @@ describe('Feature flags actions', () => {
}));
});
- it('commits RECEIVE_UPDATE_FEATURE_FLAG_SUCCESS with the given flag', (done) => {
- testAction(
+ it('commits RECEIVE_UPDATE_FEATURE_FLAG_SUCCESS with the given flag', () => {
+ return testAction(
receiveUpdateFeatureFlagSuccess,
featureFlag,
mockedState,
@@ -350,7 +337,6 @@ describe('Feature flags actions', () => {
},
],
[],
- done,
);
});
});
@@ -361,8 +347,8 @@ describe('Feature flags actions', () => {
}));
});
- it('commits RECEIVE_UPDATE_FEATURE_FLAG_ERROR with the given flag id', (done) => {
- testAction(
+ it('commits RECEIVE_UPDATE_FEATURE_FLAG_ERROR with the given flag id', () => {
+ return testAction(
receiveUpdateFeatureFlagError,
featureFlag.id,
mockedState,
@@ -373,22 +359,20 @@ describe('Feature flags actions', () => {
},
],
[],
- done,
);
});
});
describe('clearAlert', () => {
- it('should commit RECEIVE_CLEAR_ALERT', (done) => {
+ it('should commit RECEIVE_CLEAR_ALERT', () => {
const alertIndex = 3;
- testAction(
+ return testAction(
clearAlert,
alertIndex,
mockedState,
[{ type: 'RECEIVE_CLEAR_ALERT', payload: alertIndex }],
[],
- done,
);
});
});
diff --git a/spec/frontend/feature_flags/store/new/actions_spec.js b/spec/frontend/feature_flags/store/new/actions_spec.js
index 7900b200eb2..1dcd2da1d93 100644
--- a/spec/frontend/feature_flags/store/new/actions_spec.js
+++ b/spec/frontend/feature_flags/store/new/actions_spec.js
@@ -33,7 +33,7 @@ describe('Feature flags New Module Actions', () => {
});
describe('success', () => {
- it('dispatches requestCreateFeatureFlag and receiveCreateFeatureFlagSuccess ', (done) => {
+ it('dispatches requestCreateFeatureFlag and receiveCreateFeatureFlagSuccess ', () => {
const actionParams = {
name: 'name',
description: 'description',
@@ -50,7 +50,7 @@ describe('Feature flags New Module Actions', () => {
};
mock.onPost(mockedState.endpoint, mapStrategiesToRails(actionParams)).replyOnce(200);
- testAction(
+ return testAction(
createFeatureFlag,
actionParams,
mockedState,
@@ -63,13 +63,12 @@ describe('Feature flags New Module Actions', () => {
type: 'receiveCreateFeatureFlagSuccess',
},
],
- done,
);
});
});
describe('error', () => {
- it('dispatches requestCreateFeatureFlag and receiveCreateFeatureFlagError ', (done) => {
+ it('dispatches requestCreateFeatureFlag and receiveCreateFeatureFlagError ', () => {
const actionParams = {
name: 'name',
description: 'description',
@@ -88,7 +87,7 @@ describe('Feature flags New Module Actions', () => {
.onPost(mockedState.endpoint, mapStrategiesToRails(actionParams))
.replyOnce(500, { message: [] });
- testAction(
+ return testAction(
createFeatureFlag,
actionParams,
mockedState,
@@ -102,28 +101,26 @@ describe('Feature flags New Module Actions', () => {
payload: { message: [] },
},
],
- done,
);
});
});
});
describe('requestCreateFeatureFlag', () => {
- it('should commit REQUEST_CREATE_FEATURE_FLAG mutation', (done) => {
- testAction(
+ it('should commit REQUEST_CREATE_FEATURE_FLAG mutation', () => {
+ return testAction(
requestCreateFeatureFlag,
null,
mockedState,
[{ type: types.REQUEST_CREATE_FEATURE_FLAG }],
[],
- done,
);
});
});
describe('receiveCreateFeatureFlagSuccess', () => {
- it('should commit RECEIVE_CREATE_FEATURE_FLAG_SUCCESS mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_CREATE_FEATURE_FLAG_SUCCESS mutation', () => {
+ return testAction(
receiveCreateFeatureFlagSuccess,
null,
mockedState,
@@ -133,20 +130,18 @@ describe('Feature flags New Module Actions', () => {
},
],
[],
- done,
);
});
});
describe('receiveCreateFeatureFlagError', () => {
- it('should commit RECEIVE_CREATE_FEATURE_FLAG_ERROR mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_CREATE_FEATURE_FLAG_ERROR mutation', () => {
+ return testAction(
receiveCreateFeatureFlagError,
'There was an error',
mockedState,
[{ type: types.RECEIVE_CREATE_FEATURE_FLAG_ERROR, payload: 'There was an error' }],
[],
- done,
);
});
});
diff --git a/spec/frontend/filtered_search/droplab/plugins/ajax_filter_spec.js b/spec/frontend/filtered_search/droplab/plugins/ajax_filter_spec.js
index 88b3fc236e4..212b9ffc8f9 100644
--- a/spec/frontend/filtered_search/droplab/plugins/ajax_filter_spec.js
+++ b/spec/frontend/filtered_search/droplab/plugins/ajax_filter_spec.js
@@ -38,35 +38,25 @@ describe('AjaxFilter', () => {
dummyList.list.appendChild(dynamicList);
});
- it('calls onLoadingFinished after loading data', (done) => {
+ it('calls onLoadingFinished after loading data', async () => {
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);
+ await AjaxFilter.trigger();
+ expect(dummyConfig.onLoadingFinished.mock.calls.length).toBe(1);
});
- it('does not call onLoadingFinished if Ajax call fails', (done) => {
+ it('does not call onLoadingFinished if Ajax call fails', async () => {
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);
+ await expect(AjaxFilter.trigger()).rejects.toEqual(dummyError);
+ expect(dummyConfig.onLoadingFinished.mock.calls.length).toBe(0);
});
});
});
diff --git a/spec/frontend/filtered_search/filtered_search_manager_spec.js b/spec/frontend/filtered_search/filtered_search_manager_spec.js
index 83e7f6c9b3f..911a507af4c 100644
--- a/spec/frontend/filtered_search/filtered_search_manager_spec.js
+++ b/spec/frontend/filtered_search/filtered_search_manager_spec.js
@@ -190,43 +190,40 @@ describe('Filtered Search Manager', () => {
const defaultParams = '?scope=all';
const defaultState = '&state=opened';
- it('should search with a single word', (done) => {
+ it('should search with a single word', () => {
initializeManager();
input.value = 'searchTerm';
visitUrl.mockImplementation((url) => {
expect(url).toEqual(`${defaultParams}&search=searchTerm`);
- done();
});
manager.search();
});
- it('sets default state', (done) => {
+ it('sets default state', () => {
initializeManager({ useDefaultState: true });
input.value = 'searchTerm';
visitUrl.mockImplementation((url) => {
expect(url).toEqual(`${defaultParams}${defaultState}&search=searchTerm`);
- done();
});
manager.search();
});
- it('should search with multiple words', (done) => {
+ it('should search with multiple words', () => {
initializeManager();
input.value = 'awesome search terms';
visitUrl.mockImplementation((url) => {
expect(url).toEqual(`${defaultParams}&search=awesome+search+terms`);
- done();
});
manager.search();
});
- it('should search with special characters', (done) => {
+ it('should search with special characters', () => {
initializeManager();
input.value = '~!@#$%^&*()_+{}:<>,.?/';
@@ -234,13 +231,12 @@ describe('Filtered Search Manager', () => {
expect(url).toEqual(
`${defaultParams}&search=~!%40%23%24%25%5E%26*()_%2B%7B%7D%3A%3C%3E%2C.%3F%2F`,
);
- done();
});
manager.search();
});
- it('should use replacement URL for condition', (done) => {
+ it('should use replacement URL for condition', () => {
initializeManager();
tokensContainer.innerHTML = FilteredSearchSpecHelper.createTokensContainerHTML(
FilteredSearchSpecHelper.createFilterVisualTokenHTML('milestone', '=', '13', true),
@@ -248,7 +244,6 @@ describe('Filtered Search Manager', () => {
visitUrl.mockImplementation((url) => {
expect(url).toEqual(`${defaultParams}&milestone_title=replaced`);
- done();
});
manager.filteredSearchTokenKeys.conditions.push({
@@ -261,7 +256,7 @@ describe('Filtered Search Manager', () => {
manager.search();
});
- it('removes duplicated tokens', (done) => {
+ it('removes duplicated tokens', () => {
initializeManager();
tokensContainer.innerHTML = FilteredSearchSpecHelper.createTokensContainerHTML(`
${FilteredSearchSpecHelper.createFilterVisualTokenHTML('label', '=', '~bug')}
@@ -270,7 +265,6 @@ describe('Filtered Search Manager', () => {
visitUrl.mockImplementation((url) => {
expect(url).toEqual(`${defaultParams}&label_name[]=bug`);
- done();
});
manager.search();
diff --git a/spec/frontend/filtered_search/services/recent_searches_service_spec.js b/spec/frontend/filtered_search/services/recent_searches_service_spec.js
index dfa53652eb1..426a60df427 100644
--- a/spec/frontend/filtered_search/services/recent_searches_service_spec.js
+++ b/spec/frontend/filtered_search/services/recent_searches_service_spec.js
@@ -18,53 +18,47 @@ describe('RecentSearchesService', () => {
jest.spyOn(RecentSearchesService, 'isAvailable').mockReturnValue(true);
});
- it('should default to empty array', (done) => {
+ it('should default to empty array', () => {
const fetchItemsPromise = service.fetch();
- fetchItemsPromise
- .then((items) => {
- expect(items).toEqual([]);
- })
- .then(done)
- .catch(done.fail);
+ return fetchItemsPromise.then((items) => {
+ expect(items).toEqual([]);
+ });
});
- it('should reject when unable to parse', (done) => {
+ it('should reject when unable to parse', () => {
jest.spyOn(localStorage, 'getItem').mockReturnValue('fail');
const fetchItemsPromise = service.fetch();
- fetchItemsPromise
- .then(done.fail)
+ return fetchItemsPromise
+ .then(() => {
+ throw new Error();
+ })
.catch((error) => {
expect(error).toEqual(expect.any(SyntaxError));
- })
- .then(done)
- .catch(done.fail);
+ });
});
- it('should reject when service is unavailable', (done) => {
+ it('should reject when service is unavailable', () => {
RecentSearchesService.isAvailable.mockReturnValue(false);
- service
+ return service
.fetch()
- .then(done.fail)
+ .then(() => {
+ throw new Error();
+ })
.catch((error) => {
expect(error).toEqual(expect.any(Error));
- })
- .then(done)
- .catch(done.fail);
+ });
});
- it('should return items from localStorage', (done) => {
+ it('should return items from localStorage', () => {
jest.spyOn(localStorage, 'getItem').mockReturnValue('["foo", "bar"]');
const fetchItemsPromise = service.fetch();
- fetchItemsPromise
- .then((items) => {
- expect(items).toEqual(['foo', 'bar']);
- })
- .then(done)
- .catch(done.fail);
+ return fetchItemsPromise.then((items) => {
+ expect(items).toEqual(['foo', 'bar']);
+ });
});
describe('if .isAvailable returns `false`', () => {
@@ -74,16 +68,16 @@ describe('RecentSearchesService', () => {
jest.spyOn(Storage.prototype, 'getItem').mockImplementation(() => {});
});
- it('should not call .getItem', (done) => {
- RecentSearchesService.prototype
+ it('should not call .getItem', () => {
+ return RecentSearchesService.prototype
.fetch()
- .then(done.fail)
+ .then(() => {
+ throw new Error();
+ })
.catch((err) => {
expect(err).toEqual(new RecentSearchesServiceError());
expect(localStorage.getItem).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ });
});
});
});
diff --git a/spec/frontend/filtered_search/visual_token_value_spec.js b/spec/frontend/filtered_search/visual_token_value_spec.js
index 8ac5b6fbea6..bf526a8d371 100644
--- a/spec/frontend/filtered_search/visual_token_value_spec.js
+++ b/spec/frontend/filtered_search/visual_token_value_spec.js
@@ -46,7 +46,7 @@ describe('Filtered Search Visual Tokens', () => {
jest.spyOn(UsersCache, 'retrieve').mockImplementation((username) => usersCacheSpy(username));
});
- it('ignores error if UsersCache throws', (done) => {
+ it('ignores error if UsersCache throws', async () => {
const dummyError = new Error('Earth rotated backwards');
const { subject, tokenValueContainer, tokenValueElement } = findElements(authorToken);
const tokenValue = tokenValueElement.innerText;
@@ -55,16 +55,11 @@ describe('Filtered Search Visual Tokens', () => {
return Promise.reject(dummyError);
};
- subject
- .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
- .then(() => {
- expect(createFlash.mock.calls.length).toBe(0);
- })
- .then(done)
- .catch(done.fail);
+ await subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue);
+ expect(createFlash.mock.calls.length).toBe(0);
});
- it('does nothing if user cannot be found', (done) => {
+ it('does nothing if user cannot be found', async () => {
const { subject, tokenValueContainer, tokenValueElement } = findElements(authorToken);
const tokenValue = tokenValueElement.innerText;
usersCacheSpy = (username) => {
@@ -72,16 +67,11 @@ describe('Filtered Search Visual Tokens', () => {
return Promise.resolve(undefined);
};
- subject
- .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
- .then(() => {
- expect(tokenValueElement.innerText).toBe(tokenValue);
- })
- .then(done)
- .catch(done.fail);
+ await subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue);
+ expect(tokenValueElement.innerText).toBe(tokenValue);
});
- it('replaces author token with avatar and display name', (done) => {
+ it('replaces author token with avatar and display name', async () => {
const dummyUser = {
name: 'Important Person',
avatar_url: 'https://host.invalid/mypics/avatar.png',
@@ -93,21 +83,16 @@ describe('Filtered Search Visual Tokens', () => {
return Promise.resolve(dummyUser);
};
- subject
- .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
- .then(() => {
- expect(tokenValueContainer.dataset.originalValue).toBe(tokenValue);
- expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name);
- const avatar = tokenValueElement.querySelector('img.avatar');
-
- expect(avatar.getAttribute('src')).toBe(dummyUser.avatar_url);
- expect(avatar.getAttribute('alt')).toBe('');
- })
- .then(done)
- .catch(done.fail);
+ await subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue);
+ expect(tokenValueContainer.dataset.originalValue).toBe(tokenValue);
+ expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name);
+ const avatar = tokenValueElement.querySelector('img.avatar');
+
+ expect(avatar.getAttribute('src')).toBe(dummyUser.avatar_url);
+ expect(avatar.getAttribute('alt')).toBe('');
});
- it('escapes user name when creating token', (done) => {
+ it('escapes user name when creating token', async () => {
const dummyUser = {
name: '<script>',
avatar_url: `${TEST_HOST}/mypics/avatar.png`,
@@ -119,16 +104,11 @@ describe('Filtered Search Visual Tokens', () => {
return Promise.resolve(dummyUser);
};
- subject
- .updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
- .then(() => {
- expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name);
- tokenValueElement.querySelector('.avatar').remove();
+ await subject.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue);
+ expect(tokenValueElement.innerText.trim()).toBe(dummyUser.name);
+ tokenValueElement.querySelector('.avatar').remove();
- expect(tokenValueElement.innerHTML.trim()).toBe(escape(dummyUser.name));
- })
- .then(done)
- .catch(done.fail);
+ expect(tokenValueElement.innerHTML.trim()).toBe(escape(dummyUser.name));
});
});
@@ -177,48 +157,33 @@ describe('Filtered Search Visual Tokens', () => {
const findLabel = (tokenValue) =>
labelData.find((label) => tokenValue === `~${DropdownUtils.getEscapedText(label.title)}`);
- it('updates the color of a label token', (done) => {
+ it('updates the color of a label token', async () => {
const { subject, tokenValueContainer, tokenValueElement } = findElements(bugLabelToken);
const tokenValue = tokenValueElement.innerText;
const matchingLabel = findLabel(tokenValue);
- subject
- .updateLabelTokenColor(tokenValueContainer, tokenValue)
- .then(() => {
- expectValueContainerStyle(tokenValueContainer, matchingLabel);
- })
- .then(done)
- .catch(done.fail);
+ await subject.updateLabelTokenColor(tokenValueContainer, tokenValue);
+ expectValueContainerStyle(tokenValueContainer, matchingLabel);
});
- it('updates the color of a label token with spaces', (done) => {
+ it('updates the color of a label token with spaces', async () => {
const { subject, tokenValueContainer, tokenValueElement } = findElements(spaceLabelToken);
const tokenValue = tokenValueElement.innerText;
const matchingLabel = findLabel(tokenValue);
- subject
- .updateLabelTokenColor(tokenValueContainer, tokenValue)
- .then(() => {
- expectValueContainerStyle(tokenValueContainer, matchingLabel);
- })
- .then(done)
- .catch(done.fail);
+ await subject.updateLabelTokenColor(tokenValueContainer, tokenValue);
+ expectValueContainerStyle(tokenValueContainer, matchingLabel);
});
- it('does not change color of a missing label', (done) => {
+ it('does not change color of a missing label', async () => {
const { subject, tokenValueContainer, tokenValueElement } = findElements(missingLabelToken);
const tokenValue = tokenValueElement.innerText;
const matchingLabel = findLabel(tokenValue);
expect(matchingLabel).toBe(undefined);
- subject
- .updateLabelTokenColor(tokenValueContainer, tokenValue)
- .then(() => {
- expect(tokenValueContainer.getAttribute('style')).toBe(null);
- })
- .then(done)
- .catch(done.fail);
+ await subject.updateLabelTokenColor(tokenValueContainer, tokenValue);
+ expect(tokenValueContainer.getAttribute('style')).toBe(null);
});
});
diff --git a/spec/frontend/fixtures/startup_css.rb b/spec/frontend/fixtures/startup_css.rb
index e19a98c3bab..cf7383fa6ca 100644
--- a/spec/frontend/fixtures/startup_css.rb
+++ b/spec/frontend/fixtures/startup_css.rb
@@ -41,12 +41,12 @@ RSpec.describe 'Startup CSS fixtures', type: :controller do
expect(response).to be_successful
end
- # This Feature Flag is off by default
+ # This Feature Flag is on by default
# This ensures that the correct css is generated
- # When the feature flag is off, the general startup will capture it
+ # When the feature flag is on, the general startup will capture it
# This will be removed as part of https://gitlab.com/gitlab-org/gitlab/-/issues/339348
- it "startup_css/project-#{type}-search-ff-on.html" do
- stub_feature_flags(new_header_search: true)
+ it "startup_css/project-#{type}-search-ff-off.html" do
+ stub_feature_flags(new_header_search: false)
get :show, params: {
namespace_id: project.namespace.to_param,
diff --git a/spec/frontend/frequent_items/store/actions_spec.js b/spec/frontend/frequent_items/store/actions_spec.js
index fb0321545c2..3fc3eaf52a2 100644
--- a/spec/frontend/frequent_items/store/actions_spec.js
+++ b/spec/frontend/frequent_items/store/actions_spec.js
@@ -29,136 +29,126 @@ describe('Frequent Items Dropdown Store Actions', () => {
});
describe('setNamespace', () => {
- it('should set namespace', (done) => {
- testAction(
+ it('should set namespace', () => {
+ return testAction(
actions.setNamespace,
mockNamespace,
mockedState,
[{ type: types.SET_NAMESPACE, payload: mockNamespace }],
[],
- done,
);
});
});
describe('setStorageKey', () => {
- it('should set storage key', (done) => {
- testAction(
+ it('should set storage key', () => {
+ return testAction(
actions.setStorageKey,
mockStorageKey,
mockedState,
[{ type: types.SET_STORAGE_KEY, payload: mockStorageKey }],
[],
- done,
);
});
});
describe('requestFrequentItems', () => {
- it('should request frequent items', (done) => {
- testAction(
+ it('should request frequent items', () => {
+ return testAction(
actions.requestFrequentItems,
null,
mockedState,
[{ type: types.REQUEST_FREQUENT_ITEMS }],
[],
- done,
);
});
});
describe('receiveFrequentItemsSuccess', () => {
- it('should set frequent items', (done) => {
- testAction(
+ it('should set frequent items', () => {
+ return testAction(
actions.receiveFrequentItemsSuccess,
mockFrequentProjects,
mockedState,
[{ type: types.RECEIVE_FREQUENT_ITEMS_SUCCESS, payload: mockFrequentProjects }],
[],
- done,
);
});
});
describe('receiveFrequentItemsError', () => {
- it('should set frequent items error state', (done) => {
- testAction(
+ it('should set frequent items error state', () => {
+ return testAction(
actions.receiveFrequentItemsError,
null,
mockedState,
[{ type: types.RECEIVE_FREQUENT_ITEMS_ERROR }],
[],
- done,
);
});
});
describe('fetchFrequentItems', () => {
- it('should dispatch `receiveFrequentItemsSuccess`', (done) => {
+ it('should dispatch `receiveFrequentItemsSuccess`', () => {
mockedState.namespace = mockNamespace;
mockedState.storageKey = mockStorageKey;
- testAction(
+ return testAction(
actions.fetchFrequentItems,
null,
mockedState,
[],
[{ type: 'requestFrequentItems' }, { type: 'receiveFrequentItemsSuccess', payload: [] }],
- done,
);
});
- it('should dispatch `receiveFrequentItemsError`', (done) => {
+ it('should dispatch `receiveFrequentItemsError`', () => {
jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(false);
mockedState.namespace = mockNamespace;
mockedState.storageKey = mockStorageKey;
- testAction(
+ return testAction(
actions.fetchFrequentItems,
null,
mockedState,
[],
[{ type: 'requestFrequentItems' }, { type: 'receiveFrequentItemsError' }],
- done,
);
});
});
describe('requestSearchedItems', () => {
- it('should request searched items', (done) => {
- testAction(
+ it('should request searched items', () => {
+ return testAction(
actions.requestSearchedItems,
null,
mockedState,
[{ type: types.REQUEST_SEARCHED_ITEMS }],
[],
- done,
);
});
});
describe('receiveSearchedItemsSuccess', () => {
- it('should set searched items', (done) => {
- testAction(
+ it('should set searched items', () => {
+ return testAction(
actions.receiveSearchedItemsSuccess,
mockSearchedProjects,
mockedState,
[{ type: types.RECEIVE_SEARCHED_ITEMS_SUCCESS, payload: mockSearchedProjects }],
[],
- done,
);
});
});
describe('receiveSearchedItemsError', () => {
- it('should set searched items error state', (done) => {
- testAction(
+ it('should set searched items error state', () => {
+ return testAction(
actions.receiveSearchedItemsError,
null,
mockedState,
[{ type: types.RECEIVE_SEARCHED_ITEMS_ERROR }],
[],
- done,
);
});
});
@@ -168,10 +158,10 @@ describe('Frequent Items Dropdown Store Actions', () => {
gon.api_version = 'v4';
});
- it('should dispatch `receiveSearchedItemsSuccess`', (done) => {
+ it('should dispatch `receiveSearchedItemsSuccess`', () => {
mock.onGet(/\/api\/v4\/projects.json(.*)$/).replyOnce(200, mockSearchedProjects, {});
- testAction(
+ return testAction(
actions.fetchSearchedItems,
null,
mockedState,
@@ -183,45 +173,41 @@ describe('Frequent Items Dropdown Store Actions', () => {
payload: { data: mockSearchedProjects, headers: {} },
},
],
- done,
);
});
- it('should dispatch `receiveSearchedItemsError`', (done) => {
+ it('should dispatch `receiveSearchedItemsError`', () => {
gon.api_version = 'v4';
mock.onGet(/\/api\/v4\/projects.json(.*)$/).replyOnce(500);
- testAction(
+ return testAction(
actions.fetchSearchedItems,
null,
mockedState,
[],
[{ type: 'requestSearchedItems' }, { type: 'receiveSearchedItemsError' }],
- done,
);
});
});
describe('setSearchQuery', () => {
- it('should commit query and dispatch `fetchSearchedItems` when query is present', (done) => {
- testAction(
+ it('should commit query and dispatch `fetchSearchedItems` when query is present', () => {
+ return testAction(
actions.setSearchQuery,
{ query: 'test' },
mockedState,
[{ type: types.SET_SEARCH_QUERY, payload: { query: 'test' } }],
[{ type: 'fetchSearchedItems', payload: { query: 'test' } }],
- done,
);
});
- it('should commit query and dispatch `fetchFrequentItems` when query is empty', (done) => {
- testAction(
+ it('should commit query and dispatch `fetchFrequentItems` when query is empty', () => {
+ return testAction(
actions.setSearchQuery,
null,
mockedState,
[{ type: types.SET_SEARCH_QUERY, payload: null }],
[{ type: 'fetchFrequentItems' }],
- done,
);
});
});
diff --git a/spec/frontend/google_cloud/components/app_spec.js b/spec/frontend/google_cloud/components/app_spec.js
index 50b05fb30e0..0cafe6d3b9d 100644
--- a/spec/frontend/google_cloud/components/app_spec.js
+++ b/spec/frontend/google_cloud/components/app_spec.js
@@ -8,7 +8,7 @@ import GcpError from '~/google_cloud/components/errors/gcp_error.vue';
import NoGcpProjects from '~/google_cloud/components/errors/no_gcp_projects.vue';
const BASE_FEEDBACK_URL =
- 'https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/meta/-/issues/new';
+ 'https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/feedback/-/issues/new';
const SCREEN_COMPONENTS = {
Home,
ServiceAccountsForm,
diff --git a/spec/frontend/gpg_badges_spec.js b/spec/frontend/gpg_badges_spec.js
index 44c70f1ad4d..0bb50fc3e6f 100644
--- a/spec/frontend/gpg_badges_spec.js
+++ b/spec/frontend/gpg_badges_spec.js
@@ -40,30 +40,22 @@ describe('GpgBadges', () => {
mock.restore();
});
- it('does not make a request if there is no container element', (done) => {
+ it('does not make a request if there is no container element', async () => {
setFixtures('');
jest.spyOn(axios, 'get').mockImplementation(() => {});
- GpgBadges.fetch()
- .then(() => {
- expect(axios.get).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ await GpgBadges.fetch();
+ expect(axios.get).not.toHaveBeenCalled();
});
- it('throws an error if the endpoint is missing', (done) => {
+ it('throws an error if the endpoint is missing', async () => {
setFixtures('<div class="js-signature-container"></div>');
jest.spyOn(axios, 'get').mockImplementation(() => {});
- GpgBadges.fetch()
- .then(() => done.fail('Expected error to be thrown'))
- .catch((error) => {
- expect(error.message).toBe('Missing commit signatures endpoint!');
- expect(axios.get).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ await expect(GpgBadges.fetch()).rejects.toEqual(
+ new Error('Missing commit signatures endpoint!'),
+ );
+ expect(axios.get).not.toHaveBeenCalled();
});
it('fetches commit signatures', async () => {
@@ -104,31 +96,23 @@ describe('GpgBadges', () => {
});
});
- it('displays a loading spinner', (done) => {
+ it('displays a loading spinner', async () => {
mock.onGet(dummyUrl).replyOnce(200);
- GpgBadges.fetch()
- .then(() => {
- expect(document.querySelector('.js-loading-gpg-badge:empty')).toBe(null);
- const spinners = document.querySelectorAll('.js-loading-gpg-badge span.gl-spinner');
+ await GpgBadges.fetch();
+ expect(document.querySelector('.js-loading-gpg-badge:empty')).toBe(null);
+ const spinners = document.querySelectorAll('.js-loading-gpg-badge span.gl-spinner');
- expect(spinners.length).toBe(1);
- done();
- })
- .catch(done.fail);
+ expect(spinners.length).toBe(1);
});
- it('replaces the loading spinner', (done) => {
+ it('replaces the loading spinner', async () => {
mock.onGet(dummyUrl).replyOnce(200, dummyResponse);
- GpgBadges.fetch()
- .then(() => {
- expect(document.querySelector('.js-loading-gpg-badge')).toBe(null);
- const parentContainer = document.querySelector('.parent-container');
+ await GpgBadges.fetch();
+ expect(document.querySelector('.js-loading-gpg-badge')).toBe(null);
+ const parentContainer = document.querySelector('.parent-container');
- expect(parentContainer.innerHTML.trim()).toEqual(dummyBadgeHtml);
- done();
- })
- .catch(done.fail);
+ expect(parentContainer.innerHTML.trim()).toEqual(dummyBadgeHtml);
});
});
diff --git a/spec/frontend/groups/components/item_type_icon_spec.js b/spec/frontend/groups/components/item_type_icon_spec.js
index 9310943841e..f3652f1a410 100644
--- a/spec/frontend/groups/components/item_type_icon_spec.js
+++ b/spec/frontend/groups/components/item_type_icon_spec.js
@@ -8,7 +8,6 @@ describe('ItemTypeIcon', () => {
const defaultProps = {
itemType: ITEM_TYPE.GROUP,
- isGroupOpen: false,
};
const createComponent = (props = {}) => {
@@ -34,20 +33,14 @@ describe('ItemTypeIcon', () => {
});
it.each`
- type | isGroupOpen | icon
- ${ITEM_TYPE.GROUP} | ${true} | ${'folder-open'}
- ${ITEM_TYPE.GROUP} | ${false} | ${'folder-o'}
- ${ITEM_TYPE.PROJECT} | ${true} | ${'bookmark'}
- ${ITEM_TYPE.PROJECT} | ${false} | ${'bookmark'}
- `(
- 'shows "$icon" icon when `itemType` is "$type" and `isGroupOpen` is $isGroupOpen',
- ({ type, isGroupOpen, icon }) => {
- createComponent({
- itemType: type,
- isGroupOpen,
- });
- expect(findGlIcon().props('name')).toBe(icon);
- },
- );
+ type | icon
+ ${ITEM_TYPE.GROUP} | ${'subgroup'}
+ ${ITEM_TYPE.PROJECT} | ${'project'}
+ `('shows "$icon" icon when `itemType` is "$type"', ({ type, icon }) => {
+ createComponent({
+ itemType: type,
+ });
+ expect(findGlIcon().props('name')).toBe(icon);
+ });
});
});
diff --git a/spec/frontend/header_search/components/app_spec.js b/spec/frontend/header_search/components/app_spec.js
index dcbeeeffb2d..f0de5b083ae 100644
--- a/spec/frontend/header_search/components/app_spec.js
+++ b/spec/frontend/header_search/components/app_spec.js
@@ -16,6 +16,7 @@ import {
MOCK_USERNAME,
MOCK_DEFAULT_SEARCH_OPTIONS,
MOCK_SCOPED_SEARCH_OPTIONS,
+ MOCK_SORTED_AUTOCOMPLETE_OPTIONS,
} from '../mock_data';
Vue.use(Vuex);
@@ -108,6 +109,11 @@ describe('HeaderSearchApp', () => {
search | showDefault | showScoped | showAutocomplete | showDropdownNavigation
${null} | ${true} | ${false} | ${false} | ${true}
${''} | ${true} | ${false} | ${false} | ${true}
+ ${'1'} | ${false} | ${false} | ${false} | ${false}
+ ${')'} | ${false} | ${false} | ${false} | ${false}
+ ${'t'} | ${false} | ${false} | ${true} | ${true}
+ ${'te'} | ${false} | ${true} | ${true} | ${true}
+ ${'tes'} | ${false} | ${true} | ${true} | ${true}
${MOCK_SEARCH} | ${false} | ${true} | ${true} | ${true}
`(
'Header Search Dropdown Items',
@@ -115,7 +121,13 @@ describe('HeaderSearchApp', () => {
describe(`when search is ${search}`, () => {
beforeEach(() => {
window.gon.current_username = MOCK_USERNAME;
- createComponent({ search });
+ createComponent(
+ { search },
+ {
+ autocompleteGroupedSearchOptions: () =>
+ search.match(/^[A-Za-z]+$/g) ? MOCK_SORTED_AUTOCOMPLETE_OPTIONS : [],
+ },
+ );
findHeaderSearchInput().vm.$emit('click');
});
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
index f427482be46..7952661e2d2 100644
--- a/spec/frontend/header_search/components/header_search_autocomplete_items_spec.js
+++ b/spec/frontend/header_search/components/header_search_autocomplete_items_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdownItem, GlLoadingIcon, GlAvatar, GlAlert } from '@gitlab/ui';
+import { GlDropdownItem, GlLoadingIcon, GlAvatar, GlAlert, GlDropdownDivider } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
@@ -8,8 +8,18 @@ import {
LARGE_AVATAR_PX,
PROJECTS_CATEGORY,
SMALL_AVATAR_PX,
+ ISSUES_CATEGORY,
+ MERGE_REQUEST_CATEGORY,
+ RECENT_EPICS_CATEGORY,
} from '~/header_search/constants';
-import { MOCK_GROUPED_AUTOCOMPLETE_OPTIONS, MOCK_SORTED_AUTOCOMPLETE_OPTIONS } from '../mock_data';
+import {
+ MOCK_GROUPED_AUTOCOMPLETE_OPTIONS,
+ MOCK_SORTED_AUTOCOMPLETE_OPTIONS,
+ MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_SETTINGS_HELP,
+ MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_HELP,
+ MOCK_SEARCH,
+ MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_2,
+} from '../mock_data';
Vue.use(Vuex);
@@ -41,8 +51,14 @@ describe('HeaderSearchAutocompleteItems', () => {
});
const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findGlDropdownDividers = () => wrapper.findAllComponents(GlDropdownDivider);
const findFirstDropdownItem = () => findDropdownItems().at(0);
- const findDropdownItemTitles = () => findDropdownItems().wrappers.map((w) => w.text());
+ const findDropdownItemTitles = () =>
+ findDropdownItems().wrappers.map((w) => w.findAll('span').at(1).text());
+ const findDropdownItemSubTitles = () =>
+ findDropdownItems()
+ .wrappers.filter((w) => w.findAll('span').length > 2)
+ .map((w) => w.findAll('span').at(2).text());
const findDropdownItemLinks = () => findDropdownItems().wrappers.map((w) => w.attributes('href'));
const findGlLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findGlAvatar = () => wrapper.findComponent(GlAvatar);
@@ -87,10 +103,17 @@ describe('HeaderSearchAutocompleteItems', () => {
});
it('renders titles correctly', () => {
- const expectedTitles = MOCK_SORTED_AUTOCOMPLETE_OPTIONS.map((o) => o.label);
+ const expectedTitles = MOCK_SORTED_AUTOCOMPLETE_OPTIONS.map((o) => o.value || o.label);
expect(findDropdownItemTitles()).toStrictEqual(expectedTitles);
});
+ it('renders sub-titles correctly', () => {
+ const expectedSubTitles = MOCK_SORTED_AUTOCOMPLETE_OPTIONS.filter((o) => o.value).map(
+ (o) => o.label,
+ );
+ expect(findDropdownItemSubTitles()).toStrictEqual(expectedSubTitles);
+ });
+
it('renders links correctly', () => {
const expectedLinks = MOCK_SORTED_AUTOCOMPLETE_OPTIONS.map((o) => o.url);
expect(findDropdownItemLinks()).toStrictEqual(expectedLinks);
@@ -98,15 +121,30 @@ describe('HeaderSearchAutocompleteItems', () => {
});
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 }) => {
+ item | showAvatar | avatarSize | searchContext | entityId | entityName
+ ${{ data: [{ category: PROJECTS_CATEGORY, avatar_url: null }] }} | ${true} | ${String(LARGE_AVATAR_PX)} | ${{ project: { id: 29 } }} | ${'29'} | ${''}
+ ${{ data: [{ category: GROUPS_CATEGORY, avatar_url: '/123' }] }} | ${true} | ${String(LARGE_AVATAR_PX)} | ${{ group: { id: 12 } }} | ${'12'} | ${''}
+ ${{ data: [{ category: 'Help', avatar_url: '' }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${null} | ${'0'} | ${''}
+ ${{ data: [{ category: 'Settings' }] }} | ${false} | ${false} | ${null} | ${false} | ${false}
+ ${{ data: [{ category: GROUPS_CATEGORY, avatar_url: null }] }} | ${true} | ${String(LARGE_AVATAR_PX)} | ${{ group: { id: 1, name: 'test1' } }} | ${'1'} | ${'test1'}
+ ${{ data: [{ category: PROJECTS_CATEGORY, avatar_url: null }] }} | ${true} | ${String(LARGE_AVATAR_PX)} | ${{ project: { id: 2, name: 'test2' } }} | ${'2'} | ${'test2'}
+ ${{ data: [{ category: ISSUES_CATEGORY, avatar_url: null }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${{ project: { id: 3, name: 'test3' } }} | ${'3'} | ${'test3'}
+ ${{ data: [{ category: MERGE_REQUEST_CATEGORY, avatar_url: null }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${{ project: { id: 4, name: 'test4' } }} | ${'4'} | ${'test4'}
+ ${{ data: [{ category: RECENT_EPICS_CATEGORY, avatar_url: null }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${{ group: { id: 5, name: 'test5' } }} | ${'5'} | ${'test5'}
+ ${{ data: [{ category: GROUPS_CATEGORY, avatar_url: null, group_id: 6, group_name: 'test6' }] }} | ${true} | ${String(LARGE_AVATAR_PX)} | ${null} | ${'6'} | ${'test6'}
+ ${{ data: [{ category: PROJECTS_CATEGORY, avatar_url: null, project_id: 7, project_name: 'test7' }] }} | ${true} | ${String(LARGE_AVATAR_PX)} | ${null} | ${'7'} | ${'test7'}
+ ${{ data: [{ category: ISSUES_CATEGORY, avatar_url: null, project_id: 8, project_name: 'test8' }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${null} | ${'8'} | ${'test8'}
+ ${{ data: [{ category: MERGE_REQUEST_CATEGORY, avatar_url: null, project_id: 9, project_name: 'test9' }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${null} | ${'9'} | ${'test9'}
+ ${{ data: [{ category: RECENT_EPICS_CATEGORY, avatar_url: null, group_id: 10, group_name: 'test10' }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${null} | ${'10'} | ${'test10'}
+ ${{ data: [{ category: GROUPS_CATEGORY, avatar_url: null, group_id: 11, group_name: 'test11' }] }} | ${true} | ${String(LARGE_AVATAR_PX)} | ${{ group: { id: 1, name: 'test1' } }} | ${'11'} | ${'test11'}
+ ${{ data: [{ category: PROJECTS_CATEGORY, avatar_url: null, project_id: 12, project_name: 'test12' }] }} | ${true} | ${String(LARGE_AVATAR_PX)} | ${{ project: { id: 2, name: 'test2' } }} | ${'12'} | ${'test12'}
+ ${{ data: [{ category: ISSUES_CATEGORY, avatar_url: null, project_id: 13, project_name: 'test13' }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${{ project: { id: 3, name: 'test3' } }} | ${'13'} | ${'test13'}
+ ${{ data: [{ category: MERGE_REQUEST_CATEGORY, avatar_url: null, project_id: 14, project_name: 'test14' }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${{ project: { id: 4, name: 'test4' } }} | ${'14'} | ${'test14'}
+ ${{ data: [{ category: RECENT_EPICS_CATEGORY, avatar_url: null, group_id: 15, group_name: 'test15' }] }} | ${true} | ${String(SMALL_AVATAR_PX)} | ${{ group: { id: 5, name: 'test5' } }} | ${'15'} | ${'test15'}
+ `('GlAvatar', ({ item, showAvatar, avatarSize, searchContext, entityId, entityName }) => {
describe(`when category is ${item.data[0].category} and avatar_url is ${item.data[0].avatar_url}`, () => {
beforeEach(() => {
- createComponent({}, { autocompleteGroupedSearchOptions: () => [item] });
+ createComponent({ searchContext }, { autocompleteGroupedSearchOptions: () => [item] });
});
it(`should${showAvatar ? '' : ' not'} render`, () => {
@@ -116,6 +154,16 @@ describe('HeaderSearchAutocompleteItems', () => {
it(`should set avatarSize to ${avatarSize}`, () => {
expect(findGlAvatar().exists() && findGlAvatar().attributes('size')).toBe(avatarSize);
});
+
+ it(`should set avatar entityId to ${entityId}`, () => {
+ expect(findGlAvatar().exists() && findGlAvatar().attributes('entityid')).toBe(entityId);
+ });
+
+ it(`should set avatar entityName to ${entityName}`, () => {
+ expect(findGlAvatar().exists() && findGlAvatar().attributes('entityname')).toBe(
+ entityName,
+ );
+ });
});
});
});
@@ -140,6 +188,34 @@ describe('HeaderSearchAutocompleteItems', () => {
});
});
});
+
+ describe.each`
+ search | items | dividerCount
+ ${null} | ${[]} | ${0}
+ ${''} | ${[]} | ${0}
+ ${'1'} | ${[]} | ${0}
+ ${')'} | ${[]} | ${0}
+ ${'t'} | ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_SETTINGS_HELP} | ${1}
+ ${'te'} | ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_HELP} | ${0}
+ ${'tes'} | ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_2} | ${1}
+ ${MOCK_SEARCH} | ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_2} | ${1}
+ `('Header Search Dropdown Dividers', ({ search, items, dividerCount }) => {
+ describe(`when search is ${search}`, () => {
+ beforeEach(() => {
+ createComponent(
+ { search },
+ {
+ autocompleteGroupedSearchOptions: () => items,
+ },
+ {},
+ );
+ });
+
+ it(`component should have ${dividerCount} dividers`, () => {
+ expect(findGlDropdownDividers()).toHaveLength(dividerCount);
+ });
+ });
+ });
});
describe('watchers', () => {
diff --git a/spec/frontend/header_search/components/header_search_scoped_items_spec.js b/spec/frontend/header_search/components/header_search_scoped_items_spec.js
index a65b4d8b813..8788fb23458 100644
--- a/spec/frontend/header_search/components/header_search_scoped_items_spec.js
+++ b/spec/frontend/header_search/components/header_search_scoped_items_spec.js
@@ -1,17 +1,21 @@
-import { GlDropdownItem } from '@gitlab/ui';
+import { GlDropdownItem, GlDropdownDivider } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
import { trimText } from 'helpers/text_helper';
import HeaderSearchScopedItems from '~/header_search/components/header_search_scoped_items.vue';
-import { MOCK_SEARCH, MOCK_SCOPED_SEARCH_OPTIONS } from '../mock_data';
+import {
+ MOCK_SEARCH,
+ MOCK_SCOPED_SEARCH_OPTIONS,
+ MOCK_GROUPED_AUTOCOMPLETE_OPTIONS,
+} from '../mock_data';
Vue.use(Vuex);
describe('HeaderSearchScopedItems', () => {
let wrapper;
- const createComponent = (initialState, props) => {
+ const createComponent = (initialState, mockGetters, props) => {
const store = new Vuex.Store({
state: {
search: MOCK_SEARCH,
@@ -19,6 +23,8 @@ describe('HeaderSearchScopedItems', () => {
},
getters: {
scopedSearchOptions: () => MOCK_SCOPED_SEARCH_OPTIONS,
+ autocompleteGroupedSearchOptions: () => MOCK_GROUPED_AUTOCOMPLETE_OPTIONS,
+ ...mockGetters,
},
});
@@ -35,6 +41,7 @@ describe('HeaderSearchScopedItems', () => {
});
const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findGlDropdownDivider = () => wrapper.findComponent(GlDropdownDivider);
const findFirstDropdownItem = () => findDropdownItems().at(0);
const findDropdownItemTitles = () => findDropdownItems().wrappers.map((w) => trimText(w.text()));
const findDropdownItemAriaLabels = () =>
@@ -79,7 +86,7 @@ describe('HeaderSearchScopedItems', () => {
`('isOptionFocused', ({ currentFocusedOption, isFocused, ariaSelected }) => {
describe(`when currentFocusedOption.html_id is ${currentFocusedOption?.html_id}`, () => {
beforeEach(() => {
- createComponent({}, { currentFocusedOption });
+ createComponent({}, {}, { currentFocusedOption });
});
it(`should${isFocused ? '' : ' not'} have gl-bg-gray-50 applied`, () => {
@@ -91,5 +98,21 @@ describe('HeaderSearchScopedItems', () => {
});
});
});
+
+ describe.each`
+ autosuggestResults | showDivider
+ ${[]} | ${false}
+ ${MOCK_GROUPED_AUTOCOMPLETE_OPTIONS} | ${true}
+ `('scoped search items', ({ autosuggestResults, showDivider }) => {
+ describe(`when when we have ${autosuggestResults.length} auto-sugest results`, () => {
+ beforeEach(() => {
+ createComponent({}, { autocompleteGroupedSearchOptions: () => autosuggestResults }, {});
+ });
+
+ it(`divider should${showDivider ? '' : ' not'} be shown`, () => {
+ expect(findGlDropdownDivider().exists()).toBe(showDivider);
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/header_search/mock_data.js b/spec/frontend/header_search/mock_data.js
index 1d980679547..b6f0fdcc29d 100644
--- a/spec/frontend/header_search/mock_data.js
+++ b/spec/frontend/header_search/mock_data.js
@@ -96,19 +96,22 @@ export const MOCK_AUTOCOMPLETE_OPTIONS_RES = [
{
category: 'Projects',
id: 1,
- label: 'MockProject1',
+ label: 'Gitlab Org / MockProject1',
+ value: 'MockProject1',
url: 'project/1',
},
{
category: 'Groups',
id: 1,
- label: 'MockGroup1',
+ label: 'Gitlab Org / MockGroup1',
+ value: 'MockGroup1',
url: 'group/1',
},
{
category: 'Projects',
id: 2,
- label: 'MockProject2',
+ label: 'Gitlab Org / MockProject2',
+ value: 'MockProject2',
url: 'project/2',
},
{
@@ -123,21 +126,24 @@ export const MOCK_AUTOCOMPLETE_OPTIONS = [
category: 'Projects',
html_id: 'autocomplete-Projects-0',
id: 1,
- label: 'MockProject1',
+ label: 'Gitlab Org / MockProject1',
+ value: 'MockProject1',
url: 'project/1',
},
{
category: 'Groups',
html_id: 'autocomplete-Groups-1',
id: 1,
- label: 'MockGroup1',
+ label: 'Gitlab Org / MockGroup1',
+ value: 'MockGroup1',
url: 'group/1',
},
{
category: 'Projects',
html_id: 'autocomplete-Projects-2',
id: 2,
- label: 'MockProject2',
+ label: 'Gitlab Org / MockProject2',
+ value: 'MockProject2',
url: 'project/2',
},
{
@@ -157,7 +163,8 @@ export const MOCK_GROUPED_AUTOCOMPLETE_OPTIONS = [
html_id: 'autocomplete-Projects-0',
id: 1,
- label: 'MockProject1',
+ label: 'Gitlab Org / MockProject1',
+ value: 'MockProject1',
url: 'project/1',
},
{
@@ -165,7 +172,8 @@ export const MOCK_GROUPED_AUTOCOMPLETE_OPTIONS = [
html_id: 'autocomplete-Projects-2',
id: 2,
- label: 'MockProject2',
+ label: 'Gitlab Org / MockProject2',
+ value: 'MockProject2',
url: 'project/2',
},
],
@@ -178,7 +186,8 @@ export const MOCK_GROUPED_AUTOCOMPLETE_OPTIONS = [
html_id: 'autocomplete-Groups-1',
id: 1,
- label: 'MockGroup1',
+ label: 'Gitlab Org / MockGroup1',
+ value: 'MockGroup1',
url: 'group/1',
},
],
@@ -202,21 +211,24 @@ export const MOCK_SORTED_AUTOCOMPLETE_OPTIONS = [
category: 'Projects',
html_id: 'autocomplete-Projects-0',
id: 1,
- label: 'MockProject1',
+ label: 'Gitlab Org / MockProject1',
+ value: 'MockProject1',
url: 'project/1',
},
{
category: 'Projects',
html_id: 'autocomplete-Projects-2',
id: 2,
- label: 'MockProject2',
+ label: 'Gitlab Org / MockProject2',
+ value: 'MockProject2',
url: 'project/2',
},
{
category: 'Groups',
html_id: 'autocomplete-Groups-1',
id: 1,
- label: 'MockGroup1',
+ label: 'Gitlab Org / MockGroup1',
+ value: 'MockGroup1',
url: 'group/1',
},
{
@@ -226,3 +238,98 @@ export const MOCK_SORTED_AUTOCOMPLETE_OPTIONS = [
url: 'help/gitlab',
},
];
+
+export const MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_HELP = [
+ {
+ category: 'Help',
+ data: [
+ {
+ html_id: 'autocomplete-Help-1',
+ category: 'Help',
+ label: 'Rake Tasks Help',
+ url: '/help/raketasks/index',
+ },
+ {
+ html_id: 'autocomplete-Help-2',
+ category: 'Help',
+ label: 'System Hooks Help',
+ url: '/help/system_hooks/system_hooks',
+ },
+ ],
+ },
+];
+
+export const MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_SETTINGS_HELP = [
+ {
+ category: 'Settings',
+ data: [
+ {
+ html_id: 'autocomplete-Settings-0',
+ category: 'Settings',
+ label: 'User settings',
+ url: '/-/profile',
+ },
+ {
+ html_id: 'autocomplete-Settings-3',
+ category: 'Settings',
+ label: 'Admin Section',
+ url: '/admin',
+ },
+ ],
+ },
+ {
+ category: 'Help',
+ data: [
+ {
+ html_id: 'autocomplete-Help-1',
+ category: 'Help',
+ label: 'Rake Tasks Help',
+ url: '/help/raketasks/index',
+ },
+ {
+ html_id: 'autocomplete-Help-2',
+ category: 'Help',
+ label: 'System Hooks Help',
+ url: '/help/system_hooks/system_hooks',
+ },
+ ],
+ },
+];
+
+export const MOCK_GROUPED_AUTOCOMPLETE_OPTIONS_2 = [
+ {
+ category: 'Groups',
+ data: [
+ {
+ html_id: 'autocomplete-Groups-0',
+ category: 'Groups',
+ id: 148,
+ label: 'Jashkenas / Test Subgroup / test-subgroup',
+ url: '/jashkenas/test-subgroup/test-subgroup',
+ avatar_url: '',
+ },
+ {
+ html_id: 'autocomplete-Groups-1',
+ category: 'Groups',
+ id: 147,
+ label: 'Jashkenas / Test Subgroup',
+ url: '/jashkenas/test-subgroup',
+ avatar_url: '',
+ },
+ ],
+ },
+ {
+ category: 'Projects',
+ data: [
+ {
+ html_id: 'autocomplete-Projects-2',
+ category: 'Projects',
+ id: 1,
+ value: 'Gitlab Test',
+ label: 'Gitlab Org / Gitlab Test',
+ url: '/gitlab-org/gitlab-test',
+ avatar_url: '/uploads/-/system/project/avatar/1/icons8-gitlab-512.png',
+ },
+ ],
+ },
+];
diff --git a/spec/frontend/header_spec.js b/spec/frontend/header_spec.js
index 0d43accb7e5..937bc9aa478 100644
--- a/spec/frontend/header_spec.js
+++ b/spec/frontend/header_spec.js
@@ -60,7 +60,6 @@ describe('Header', () => {
setFixtures(`
<li class="js-nav-user-dropdown">
<a class="js-buy-pipeline-minutes-link" data-track-action="click_buy_ci_minutes" data-track-label="free" data-track-property="user_dropdown">Buy Pipeline minutes</a>
- <a class="js-upgrade-plan-link" data-track-action="click_upgrade_link" data-track-label="free" data-track-property="user_dropdown">Upgrade</a>
</li>`);
trackingSpy = mockTracking('_category_', $('.js-nav-user-dropdown').element, jest.spyOn);
@@ -81,14 +80,5 @@ describe('Header', () => {
property: 'user_dropdown',
});
});
-
- it('sends a tracking event when the dropdown is opened and contains Upgrade link', () => {
- $('.js-nav-user-dropdown').trigger('shown.bs.dropdown');
-
- expect(trackingSpy).toHaveBeenCalledWith('some:page', 'show_upgrade_link', {
- label: 'free',
- property: 'user_dropdown',
- });
- });
});
});
diff --git a/spec/frontend/ide/components/commit_sidebar/form_spec.js b/spec/frontend/ide/components/commit_sidebar/form_spec.js
index d3b2923ac6c..28f62a9775a 100644
--- a/spec/frontend/ide/components/commit_sidebar/form_spec.js
+++ b/spec/frontend/ide/components/commit_sidebar/form_spec.js
@@ -120,7 +120,7 @@ describe('IDE commit form', () => {
it('renders commit button in compact mode', () => {
expect(findBeginCommitButton().exists()).toBe(true);
- expect(findBeginCommitButton().text()).toBe('Commit…');
+ expect(findBeginCommitButton().text()).toBe('Create commit...');
});
it('does not render form', () => {
diff --git a/spec/frontend/ide/components/ide_side_bar_spec.js b/spec/frontend/ide/components/ide_side_bar_spec.js
index 34f14ef23a4..ace8988b8c9 100644
--- a/spec/frontend/ide/components/ide_side_bar_spec.js
+++ b/spec/frontend/ide/components/ide_side_bar_spec.js
@@ -1,4 +1,4 @@
-import { GlSkeletonLoading } from '@gitlab/ui';
+import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
diff --git a/spec/frontend/ide/components/new_dropdown/upload_spec.js b/spec/frontend/ide/components/new_dropdown/upload_spec.js
index 7303f81aad0..5a7419d6dce 100644
--- a/spec/frontend/ide/components/new_dropdown/upload_spec.js
+++ b/spec/frontend/ide/components/new_dropdown/upload_spec.js
@@ -69,25 +69,21 @@ describe('new dropdown upload', () => {
jest.spyOn(FileReader.prototype, 'readAsText');
});
- it('calls readAsText and creates file in plain text (without encoding) if the file content is plain text', (done) => {
+ it('calls readAsText and creates file in plain text (without encoding) if the file content is plain text', async () => {
const waitForCreate = new Promise((resolve) => vm.$on('create', resolve));
vm.createFile(textTarget, textFile);
expect(FileReader.prototype.readAsText).toHaveBeenCalledWith(textFile);
- waitForCreate
- .then(() => {
- expect(vm.$emit).toHaveBeenCalledWith('create', {
- name: textFile.name,
- type: 'blob',
- content: 'plain text',
- rawPath: '',
- mimeType: 'test/mime-text',
- });
- })
- .then(done)
- .catch(done.fail);
+ await waitForCreate;
+ expect(vm.$emit).toHaveBeenCalledWith('create', {
+ name: textFile.name,
+ type: 'blob',
+ content: 'plain text',
+ rawPath: '',
+ mimeType: 'test/mime-text',
+ });
});
it('creates a blob URL for the content if binary', () => {
diff --git a/spec/frontend/ide/stores/actions/merge_request_spec.js b/spec/frontend/ide/stores/actions/merge_request_spec.js
index e62811a4517..5592e2664c4 100644
--- a/spec/frontend/ide/stores/actions/merge_request_spec.js
+++ b/spec/frontend/ide/stores/actions/merge_request_spec.js
@@ -63,56 +63,47 @@ describe('IDE store merge request actions', () => {
mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests/).reply(200, mockData);
});
- it('calls getProjectMergeRequests service method', (done) => {
- store
- .dispatch('getMergeRequestsForBranch', { projectId: TEST_PROJECT, branchId: 'bar' })
- .then(() => {
- expect(service.getProjectMergeRequests).toHaveBeenCalledWith(TEST_PROJECT, {
- source_branch: 'bar',
- source_project_id: TEST_PROJECT_ID,
- state: 'opened',
- order_by: 'created_at',
- per_page: 1,
- });
-
- done();
- })
- .catch(done.fail);
+ it('calls getProjectMergeRequests service method', async () => {
+ await store.dispatch('getMergeRequestsForBranch', {
+ projectId: TEST_PROJECT,
+ branchId: 'bar',
+ });
+ expect(service.getProjectMergeRequests).toHaveBeenCalledWith(TEST_PROJECT, {
+ source_branch: 'bar',
+ source_project_id: TEST_PROJECT_ID,
+ state: 'opened',
+ order_by: 'created_at',
+ per_page: 1,
+ });
});
- it('sets the "Merge Request" Object', (done) => {
- store
- .dispatch('getMergeRequestsForBranch', { projectId: TEST_PROJECT, branchId: 'bar' })
- .then(() => {
- expect(store.state.projects.abcproject.mergeRequests).toEqual({
- 2: expect.objectContaining(mrData),
- });
- done();
- })
- .catch(done.fail);
+ it('sets the "Merge Request" Object', async () => {
+ await store.dispatch('getMergeRequestsForBranch', {
+ projectId: TEST_PROJECT,
+ branchId: 'bar',
+ });
+ expect(store.state.projects.abcproject.mergeRequests).toEqual({
+ 2: expect.objectContaining(mrData),
+ });
});
- it('sets "Current Merge Request" object to the most recent MR', (done) => {
- store
- .dispatch('getMergeRequestsForBranch', { projectId: TEST_PROJECT, branchId: 'bar' })
- .then(() => {
- expect(store.state.currentMergeRequestId).toEqual('2');
- done();
- })
- .catch(done.fail);
+ it('sets "Current Merge Request" object to the most recent MR', async () => {
+ await store.dispatch('getMergeRequestsForBranch', {
+ projectId: TEST_PROJECT,
+ branchId: 'bar',
+ });
+ expect(store.state.currentMergeRequestId).toEqual('2');
});
- it('does nothing if user cannot read MRs', (done) => {
+ it('does nothing if user cannot read MRs', async () => {
store.state.projects[TEST_PROJECT].userPermissions[PERMISSION_READ_MR] = false;
- store
- .dispatch('getMergeRequestsForBranch', { projectId: TEST_PROJECT, branchId: 'bar' })
- .then(() => {
- expect(service.getProjectMergeRequests).not.toHaveBeenCalled();
- expect(store.state.currentMergeRequestId).toBe('');
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('getMergeRequestsForBranch', {
+ projectId: TEST_PROJECT,
+ branchId: 'bar',
+ });
+ expect(service.getProjectMergeRequests).not.toHaveBeenCalled();
+ expect(store.state.currentMergeRequestId).toBe('');
});
});
@@ -122,15 +113,13 @@ describe('IDE store merge request actions', () => {
mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests/).reply(200, []);
});
- it('does not fail if there are no merge requests for current branch', (done) => {
- store
- .dispatch('getMergeRequestsForBranch', { projectId: TEST_PROJECT, branchId: 'foo' })
- .then(() => {
- expect(store.state.projects[TEST_PROJECT].mergeRequests).toEqual({});
- expect(store.state.currentMergeRequestId).toEqual('');
- done();
- })
- .catch(done.fail);
+ it('does not fail if there are no merge requests for current branch', async () => {
+ await store.dispatch('getMergeRequestsForBranch', {
+ projectId: TEST_PROJECT,
+ branchId: 'foo',
+ });
+ expect(store.state.projects[TEST_PROJECT].mergeRequests).toEqual({});
+ expect(store.state.currentMergeRequestId).toEqual('');
});
});
});
@@ -140,17 +129,18 @@ describe('IDE store merge request actions', () => {
mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests/).networkError();
});
- it('flashes message, if error', (done) => {
- store
- .dispatch('getMergeRequestsForBranch', { projectId: TEST_PROJECT, branchId: 'bar' })
+ it('flashes message, if error', () => {
+ return store
+ .dispatch('getMergeRequestsForBranch', {
+ projectId: TEST_PROJECT,
+ branchId: 'bar',
+ })
.catch(() => {
expect(createFlash).toHaveBeenCalled();
expect(createFlash.mock.calls[0][0].message).toBe(
'Error fetching merge requests for bar',
);
- })
- .then(done)
- .catch(done.fail);
+ });
});
});
});
@@ -165,29 +155,15 @@ describe('IDE store merge request actions', () => {
.reply(200, { title: 'mergerequest' });
});
- it('calls getProjectMergeRequestData service method', (done) => {
- store
- .dispatch('getMergeRequestData', { projectId: TEST_PROJECT, mergeRequestId: 1 })
- .then(() => {
- expect(service.getProjectMergeRequestData).toHaveBeenCalledWith(TEST_PROJECT, 1);
-
- done();
- })
- .catch(done.fail);
+ it('calls getProjectMergeRequestData service method', async () => {
+ await store.dispatch('getMergeRequestData', { projectId: TEST_PROJECT, mergeRequestId: 1 });
+ expect(service.getProjectMergeRequestData).toHaveBeenCalledWith(TEST_PROJECT, 1);
});
- it('sets the Merge Request Object', (done) => {
- store
- .dispatch('getMergeRequestData', { projectId: TEST_PROJECT, mergeRequestId: 1 })
- .then(() => {
- expect(store.state.currentMergeRequestId).toBe(1);
- expect(store.state.projects[TEST_PROJECT].mergeRequests['1'].title).toBe(
- 'mergerequest',
- );
-
- done();
- })
- .catch(done.fail);
+ it('sets the Merge Request Object', async () => {
+ await store.dispatch('getMergeRequestData', { projectId: TEST_PROJECT, mergeRequestId: 1 });
+ expect(store.state.currentMergeRequestId).toBe(1);
+ expect(store.state.projects[TEST_PROJECT].mergeRequests['1'].title).toBe('mergerequest');
});
});
@@ -196,32 +172,28 @@ describe('IDE store merge request actions', () => {
mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests\/1/).networkError();
});
- it('dispatches error action', (done) => {
+ it('dispatches error action', () => {
const dispatch = jest.fn();
- getMergeRequestData(
+ return getMergeRequestData(
{
commit() {},
dispatch,
state: store.state,
},
{ projectId: TEST_PROJECT, mergeRequestId: 1 },
- )
- .then(done.fail)
- .catch(() => {
- expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
- text: 'An error occurred while loading the merge request.',
- action: expect.any(Function),
- actionText: 'Please try again',
- actionPayload: {
- projectId: TEST_PROJECT,
- mergeRequestId: 1,
- force: false,
- },
- });
-
- done();
+ ).catch(() => {
+ expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
+ text: 'An error occurred while loading the merge request.',
+ action: expect.any(Function),
+ actionText: 'Please try again',
+ actionPayload: {
+ projectId: TEST_PROJECT,
+ mergeRequestId: 1,
+ force: false,
+ },
});
+ });
});
});
});
@@ -240,27 +212,22 @@ describe('IDE store merge request actions', () => {
.reply(200, { title: 'mergerequest' });
});
- it('calls getProjectMergeRequestChanges service method', (done) => {
- store
- .dispatch('getMergeRequestChanges', { projectId: TEST_PROJECT, mergeRequestId: 1 })
- .then(() => {
- expect(service.getProjectMergeRequestChanges).toHaveBeenCalledWith(TEST_PROJECT, 1);
-
- done();
- })
- .catch(done.fail);
+ it('calls getProjectMergeRequestChanges service method', async () => {
+ await store.dispatch('getMergeRequestChanges', {
+ projectId: TEST_PROJECT,
+ mergeRequestId: 1,
+ });
+ expect(service.getProjectMergeRequestChanges).toHaveBeenCalledWith(TEST_PROJECT, 1);
});
- it('sets the Merge Request Changes Object', (done) => {
- store
- .dispatch('getMergeRequestChanges', { projectId: TEST_PROJECT, mergeRequestId: 1 })
- .then(() => {
- expect(store.state.projects[TEST_PROJECT].mergeRequests['1'].changes.title).toBe(
- 'mergerequest',
- );
- done();
- })
- .catch(done.fail);
+ it('sets the Merge Request Changes Object', async () => {
+ await store.dispatch('getMergeRequestChanges', {
+ projectId: TEST_PROJECT,
+ mergeRequestId: 1,
+ });
+ expect(store.state.projects[TEST_PROJECT].mergeRequests['1'].changes.title).toBe(
+ 'mergerequest',
+ );
});
});
@@ -269,32 +236,30 @@ describe('IDE store merge request actions', () => {
mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests\/1\/changes/).networkError();
});
- it('dispatches error action', (done) => {
+ it('dispatches error action', async () => {
const dispatch = jest.fn();
- getMergeRequestChanges(
- {
- commit() {},
- dispatch,
- state: store.state,
+ await expect(
+ getMergeRequestChanges(
+ {
+ commit() {},
+ dispatch,
+ state: store.state,
+ },
+ { projectId: TEST_PROJECT, mergeRequestId: 1 },
+ ),
+ ).rejects.toEqual(new Error('Merge request changes not loaded abcproject'));
+
+ expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
+ text: 'An error occurred while loading the merge request changes.',
+ action: expect.any(Function),
+ actionText: 'Please try again',
+ actionPayload: {
+ projectId: TEST_PROJECT,
+ mergeRequestId: 1,
+ force: false,
},
- { projectId: TEST_PROJECT, mergeRequestId: 1 },
- )
- .then(done.fail)
- .catch(() => {
- expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
- text: 'An error occurred while loading the merge request changes.',
- action: expect.any(Function),
- actionText: 'Please try again',
- actionPayload: {
- projectId: TEST_PROJECT,
- mergeRequestId: 1,
- force: false,
- },
- });
-
- done();
- });
+ });
});
});
});
@@ -312,25 +277,20 @@ describe('IDE store merge request actions', () => {
jest.spyOn(service, 'getProjectMergeRequestVersions');
});
- it('calls getProjectMergeRequestVersions service method', (done) => {
- store
- .dispatch('getMergeRequestVersions', { projectId: TEST_PROJECT, mergeRequestId: 1 })
- .then(() => {
- expect(service.getProjectMergeRequestVersions).toHaveBeenCalledWith(TEST_PROJECT, 1);
-
- done();
- })
- .catch(done.fail);
+ it('calls getProjectMergeRequestVersions service method', async () => {
+ await store.dispatch('getMergeRequestVersions', {
+ projectId: TEST_PROJECT,
+ mergeRequestId: 1,
+ });
+ expect(service.getProjectMergeRequestVersions).toHaveBeenCalledWith(TEST_PROJECT, 1);
});
- it('sets the Merge Request Versions Object', (done) => {
- store
- .dispatch('getMergeRequestVersions', { projectId: TEST_PROJECT, mergeRequestId: 1 })
- .then(() => {
- expect(store.state.projects[TEST_PROJECT].mergeRequests['1'].versions.length).toBe(1);
- done();
- })
- .catch(done.fail);
+ it('sets the Merge Request Versions Object', async () => {
+ await store.dispatch('getMergeRequestVersions', {
+ projectId: TEST_PROJECT,
+ mergeRequestId: 1,
+ });
+ expect(store.state.projects[TEST_PROJECT].mergeRequests['1'].versions.length).toBe(1);
});
});
@@ -339,32 +299,28 @@ describe('IDE store merge request actions', () => {
mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests\/1\/versions/).networkError();
});
- it('dispatches error action', (done) => {
+ it('dispatches error action', () => {
const dispatch = jest.fn();
- getMergeRequestVersions(
+ return getMergeRequestVersions(
{
commit() {},
dispatch,
state: store.state,
},
{ projectId: TEST_PROJECT, mergeRequestId: 1 },
- )
- .then(done.fail)
- .catch(() => {
- expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
- text: 'An error occurred while loading the merge request version data.',
- action: expect.any(Function),
- actionText: 'Please try again',
- actionPayload: {
- projectId: TEST_PROJECT,
- mergeRequestId: 1,
- force: false,
- },
- });
-
- done();
+ ).catch(() => {
+ expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
+ text: 'An error occurred while loading the merge request version data.',
+ action: expect.any(Function),
+ actionText: 'Please try again',
+ actionPayload: {
+ projectId: TEST_PROJECT,
+ mergeRequestId: 1,
+ force: false,
+ },
});
+ });
});
});
});
@@ -503,37 +459,36 @@ describe('IDE store merge request actions', () => {
);
});
- it('dispatches actions for merge request data', (done) => {
- openMergeRequest({ state: store.state, dispatch: store.dispatch, getters: mockGetters }, mr)
- .then(() => {
- expect(store.dispatch.mock.calls).toEqual([
- ['getMergeRequestData', mr],
- ['setCurrentBranchId', testMergeRequest.source_branch],
- [
- 'getBranchData',
- {
- projectId: mr.projectId,
- branchId: testMergeRequest.source_branch,
- },
- ],
- [
- 'getFiles',
- {
- projectId: mr.projectId,
- branchId: testMergeRequest.source_branch,
- ref: 'abcd2322',
- },
- ],
- ['getMergeRequestVersions', mr],
- ['getMergeRequestChanges', mr],
- ['openMergeRequestChanges', testMergeRequestChanges.changes],
- ]);
- })
- .then(done)
- .catch(done.fail);
+ it('dispatches actions for merge request data', async () => {
+ await openMergeRequest(
+ { state: store.state, dispatch: store.dispatch, getters: mockGetters },
+ mr,
+ );
+ expect(store.dispatch.mock.calls).toEqual([
+ ['getMergeRequestData', mr],
+ ['setCurrentBranchId', testMergeRequest.source_branch],
+ [
+ 'getBranchData',
+ {
+ projectId: mr.projectId,
+ branchId: testMergeRequest.source_branch,
+ },
+ ],
+ [
+ 'getFiles',
+ {
+ projectId: mr.projectId,
+ branchId: testMergeRequest.source_branch,
+ ref: 'abcd2322',
+ },
+ ],
+ ['getMergeRequestVersions', mr],
+ ['getMergeRequestChanges', mr],
+ ['openMergeRequestChanges', testMergeRequestChanges.changes],
+ ]);
});
- it('updates activity bar view and gets file data, if changes are found', (done) => {
+ it('updates activity bar view and gets file data, if changes are found', async () => {
store.state.entries.foo = {
type: 'blob',
path: 'foo',
@@ -548,28 +503,24 @@ describe('IDE store merge request actions', () => {
{ new_path: 'bar', path: 'bar' },
];
- openMergeRequest({ state: store.state, dispatch: store.dispatch, getters: mockGetters }, mr)
- .then(() => {
- expect(store.dispatch).toHaveBeenCalledWith(
- 'openMergeRequestChanges',
- testMergeRequestChanges.changes,
- );
- })
- .then(done)
- .catch(done.fail);
+ await openMergeRequest(
+ { state: store.state, dispatch: store.dispatch, getters: mockGetters },
+ mr,
+ );
+ expect(store.dispatch).toHaveBeenCalledWith(
+ 'openMergeRequestChanges',
+ testMergeRequestChanges.changes,
+ );
});
- it('flashes message, if error', (done) => {
+ it('flashes message, if error', () => {
store.dispatch.mockRejectedValue();
- openMergeRequest(store, mr)
- .catch(() => {
- expect(createFlash).toHaveBeenCalledWith({
- message: expect.any(String),
- });
- })
- .then(done)
- .catch(done.fail);
+ return openMergeRequest(store, mr).catch(() => {
+ expect(createFlash).toHaveBeenCalledWith({
+ message: expect.any(String),
+ });
+ });
});
});
});
diff --git a/spec/frontend/ide/stores/actions/project_spec.js b/spec/frontend/ide/stores/actions/project_spec.js
index e07dcf22860..cc7d39b4d43 100644
--- a/spec/frontend/ide/stores/actions/project_spec.js
+++ b/spec/frontend/ide/stores/actions/project_spec.js
@@ -146,22 +146,16 @@ describe('IDE store project actions', () => {
});
});
- it('calls the service', (done) => {
- store
- .dispatch('refreshLastCommitData', {
- projectId: store.state.currentProjectId,
- branchId: store.state.currentBranchId,
- })
- .then(() => {
- expect(service.getBranchData).toHaveBeenCalledWith('abc/def', 'main');
-
- done();
- })
- .catch(done.fail);
+ it('calls the service', async () => {
+ await store.dispatch('refreshLastCommitData', {
+ projectId: store.state.currentProjectId,
+ branchId: store.state.currentBranchId,
+ });
+ expect(service.getBranchData).toHaveBeenCalledWith('abc/def', 'main');
});
- it('commits getBranchData', (done) => {
- testAction(
+ it('commits getBranchData', () => {
+ return testAction(
refreshLastCommitData,
{
projectId: store.state.currentProjectId,
@@ -181,14 +175,13 @@ describe('IDE store project actions', () => {
],
// action
[],
- done,
);
});
});
describe('showBranchNotFoundError', () => {
- it('dispatches setErrorMessage', (done) => {
- testAction(
+ it('dispatches setErrorMessage', () => {
+ return testAction(
showBranchNotFoundError,
'main',
null,
@@ -204,7 +197,6 @@ describe('IDE store project actions', () => {
},
},
],
- done,
);
});
});
@@ -216,8 +208,8 @@ describe('IDE store project actions', () => {
jest.spyOn(api, 'createBranch').mockResolvedValue();
});
- it('calls API', (done) => {
- createNewBranchFromDefault(
+ it('calls API', async () => {
+ await createNewBranchFromDefault(
{
state: {
currentProjectId: 'project-path',
@@ -230,21 +222,17 @@ describe('IDE store project actions', () => {
dispatch() {},
},
'new-branch-name',
- )
- .then(() => {
- expect(api.createBranch).toHaveBeenCalledWith('project-path', {
- ref: 'main',
- branch: 'new-branch-name',
- });
- })
- .then(done)
- .catch(done.fail);
+ );
+ expect(api.createBranch).toHaveBeenCalledWith('project-path', {
+ ref: 'main',
+ branch: 'new-branch-name',
+ });
});
- it('clears error message', (done) => {
+ it('clears error message', async () => {
const dispatchSpy = jest.fn().mockName('dispatch');
- createNewBranchFromDefault(
+ await createNewBranchFromDefault(
{
state: {
currentProjectId: 'project-path',
@@ -257,16 +245,12 @@ describe('IDE store project actions', () => {
dispatch: dispatchSpy,
},
'new-branch-name',
- )
- .then(() => {
- expect(dispatchSpy).toHaveBeenCalledWith('setErrorMessage', null);
- })
- .then(done)
- .catch(done.fail);
+ );
+ expect(dispatchSpy).toHaveBeenCalledWith('setErrorMessage', null);
});
- it('reloads window', (done) => {
- createNewBranchFromDefault(
+ it('reloads window', async () => {
+ await createNewBranchFromDefault(
{
state: {
currentProjectId: 'project-path',
@@ -279,18 +263,14 @@ describe('IDE store project actions', () => {
dispatch() {},
},
'new-branch-name',
- )
- .then(() => {
- expect(window.location.reload).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ );
+ expect(window.location.reload).toHaveBeenCalled();
});
});
describe('loadEmptyBranch', () => {
- it('creates a blank tree and sets loading state to false', (done) => {
- testAction(
+ it('creates a blank tree and sets loading state to false', () => {
+ return testAction(
loadEmptyBranch,
{ projectId: TEST_PROJECT_ID, branchId: 'main' },
store.state,
@@ -302,20 +282,18 @@ describe('IDE store project actions', () => {
},
],
expect.any(Object),
- done,
);
});
- it('does nothing, if tree already exists', (done) => {
+ it('does nothing, if tree already exists', () => {
const trees = { [`${TEST_PROJECT_ID}/main`]: [] };
- testAction(
+ return testAction(
loadEmptyBranch,
{ projectId: TEST_PROJECT_ID, branchId: 'main' },
{ trees },
[],
[],
- done,
);
});
});
@@ -372,56 +350,48 @@ describe('IDE store project actions', () => {
const branchId = '123-lorem';
const ref = 'abcd2322';
- it('when empty repo, loads empty branch', (done) => {
+ it('when empty repo, loads empty branch', () => {
const mockGetters = { emptyRepo: true };
- testAction(
+ return testAction(
loadBranch,
{ projectId, branchId },
{ ...store.state, ...mockGetters },
[],
[{ type: 'loadEmptyBranch', payload: { projectId, branchId } }],
- done,
);
});
- it('when branch already exists, does nothing', (done) => {
+ it('when branch already exists, does nothing', () => {
store.state.projects[projectId].branches[branchId] = {};
- testAction(loadBranch, { projectId, branchId }, store.state, [], [], done);
+ return testAction(loadBranch, { projectId, branchId }, store.state, [], []);
});
- it('fetches branch data', (done) => {
+ it('fetches branch data', async () => {
const mockGetters = { findBranch: () => ({ commit: { id: ref } }) };
jest.spyOn(store, 'dispatch').mockResolvedValue();
- loadBranch(
+ await loadBranch(
{ getters: mockGetters, state: store.state, dispatch: store.dispatch },
{ projectId, branchId },
- )
- .then(() => {
- expect(store.dispatch.mock.calls).toEqual([
- ['getBranchData', { projectId, branchId }],
- ['getMergeRequestsForBranch', { projectId, branchId }],
- ['getFiles', { projectId, branchId, ref }],
- ]);
- })
- .then(done)
- .catch(done.fail);
+ );
+ expect(store.dispatch.mock.calls).toEqual([
+ ['getBranchData', { projectId, branchId }],
+ ['getMergeRequestsForBranch', { projectId, branchId }],
+ ['getFiles', { projectId, branchId, ref }],
+ ]);
});
- it('shows an error if branch can not be fetched', (done) => {
+ it('shows an error if branch can not be fetched', async () => {
jest.spyOn(store, 'dispatch').mockReturnValue(Promise.reject());
- loadBranch(store, { projectId, branchId })
- .then(done.fail)
- .catch(() => {
- expect(store.dispatch.mock.calls).toEqual([
- ['getBranchData', { projectId, branchId }],
- ['showBranchNotFoundError', branchId],
- ]);
- done();
- });
+ await expect(loadBranch(store, { projectId, branchId })).rejects.toBeUndefined();
+
+ expect(store.dispatch.mock.calls).toEqual([
+ ['getBranchData', { projectId, branchId }],
+ ['showBranchNotFoundError', branchId],
+ ]);
});
});
@@ -449,17 +419,13 @@ describe('IDE store project actions', () => {
jest.spyOn(store, 'dispatch').mockResolvedValue();
});
- it('dispatches branch actions', (done) => {
- openBranch(store, branch)
- .then(() => {
- expect(store.dispatch.mock.calls).toEqual([
- ['setCurrentBranchId', branchId],
- ['loadBranch', { projectId, branchId }],
- ['loadFile', { basePath: undefined }],
- ]);
- })
- .then(done)
- .catch(done.fail);
+ it('dispatches branch actions', async () => {
+ await openBranch(store, branch);
+ expect(store.dispatch.mock.calls).toEqual([
+ ['setCurrentBranchId', branchId],
+ ['loadBranch', { projectId, branchId }],
+ ['loadFile', { basePath: undefined }],
+ ]);
});
});
@@ -468,22 +434,18 @@ describe('IDE store project actions', () => {
jest.spyOn(store, 'dispatch').mockReturnValue(Promise.reject());
});
- it('dispatches correct branch actions', (done) => {
- openBranch(store, branch)
- .then((val) => {
- expect(store.dispatch.mock.calls).toEqual([
- ['setCurrentBranchId', branchId],
- ['loadBranch', { projectId, branchId }],
- ]);
-
- expect(val).toEqual(
- new Error(
- `An error occurred while getting files for - <strong>${projectId}/${branchId}</strong>`,
- ),
- );
- })
- .then(done)
- .catch(done.fail);
+ it('dispatches correct branch actions', async () => {
+ const val = await openBranch(store, branch);
+ expect(store.dispatch.mock.calls).toEqual([
+ ['setCurrentBranchId', branchId],
+ ['loadBranch', { projectId, branchId }],
+ ]);
+
+ expect(val).toEqual(
+ new Error(
+ `An error occurred while getting files for - <strong>${projectId}/${branchId}</strong>`,
+ ),
+ );
});
});
});
diff --git a/spec/frontend/ide/stores/actions/tree_spec.js b/spec/frontend/ide/stores/actions/tree_spec.js
index 8d7328725e9..fc44cbb21ae 100644
--- a/spec/frontend/ide/stores/actions/tree_spec.js
+++ b/spec/frontend/ide/stores/actions/tree_spec.js
@@ -62,27 +62,21 @@ describe('Multi-file store tree actions', () => {
});
});
- it('adds data into tree', (done) => {
- store
- .dispatch('getFiles', basicCallParameters)
- .then(() => {
- projectTree = store.state.trees['abcproject/main'];
-
- expect(projectTree.tree.length).toBe(2);
- expect(projectTree.tree[0].type).toBe('tree');
- expect(projectTree.tree[0].tree[1].name).toBe('fileinfolder.js');
- expect(projectTree.tree[1].type).toBe('blob');
- expect(projectTree.tree[0].tree[0].tree[0].type).toBe('blob');
- expect(projectTree.tree[0].tree[0].tree[0].name).toBe('fileinsubfolder.js');
-
- done();
- })
- .catch(done.fail);
+ it('adds data into tree', async () => {
+ await store.dispatch('getFiles', basicCallParameters);
+ projectTree = store.state.trees['abcproject/main'];
+
+ expect(projectTree.tree.length).toBe(2);
+ expect(projectTree.tree[0].type).toBe('tree');
+ expect(projectTree.tree[0].tree[1].name).toBe('fileinfolder.js');
+ expect(projectTree.tree[1].type).toBe('blob');
+ expect(projectTree.tree[0].tree[0].tree[0].type).toBe('blob');
+ expect(projectTree.tree[0].tree[0].tree[0].name).toBe('fileinsubfolder.js');
});
});
describe('error', () => {
- it('dispatches error action', (done) => {
+ it('dispatches error action', async () => {
const dispatch = jest.fn();
store.state.projects = {
@@ -103,28 +97,26 @@ describe('Multi-file store tree actions', () => {
mock.onGet(/(.*)/).replyOnce(500);
- getFiles(
- {
- commit() {},
- dispatch,
- state: store.state,
- getters,
- },
- {
- projectId: 'abc/def',
- branchId: 'main-testing',
- },
- )
- .then(done.fail)
- .catch(() => {
- expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
- text: 'An error occurred while loading all the files.',
- action: expect.any(Function),
- actionText: 'Please try again',
- actionPayload: { projectId: 'abc/def', branchId: 'main-testing' },
- });
- done();
- });
+ await expect(
+ getFiles(
+ {
+ commit() {},
+ dispatch,
+ state: store.state,
+ getters,
+ },
+ {
+ projectId: 'abc/def',
+ branchId: 'main-testing',
+ },
+ ),
+ ).rejects.toEqual(new Error('Request failed with status code 500'));
+ expect(dispatch).toHaveBeenCalledWith('setErrorMessage', {
+ text: 'An error occurred while loading all the files.',
+ action: expect.any(Function),
+ actionText: 'Please try again',
+ actionPayload: { projectId: 'abc/def', branchId: 'main-testing' },
+ });
});
});
});
@@ -137,15 +129,9 @@ describe('Multi-file store tree actions', () => {
store.state.entries[tree.path] = tree;
});
- it('toggles the tree open', (done) => {
- store
- .dispatch('toggleTreeOpen', tree.path)
- .then(() => {
- expect(tree.opened).toBeTruthy();
-
- done();
- })
- .catch(done.fail);
+ it('toggles the tree open', async () => {
+ await store.dispatch('toggleTreeOpen', tree.path);
+ expect(tree.opened).toBeTruthy();
});
});
@@ -163,24 +149,23 @@ describe('Multi-file store tree actions', () => {
Object.assign(store.state.entries, createEntriesFromPaths(paths));
});
- it('opens the parents', (done) => {
- testAction(
+ it('opens the parents', () => {
+ return testAction(
showTreeEntry,
'grandparent/parent/child.txt',
store.state,
[{ type: types.SET_TREE_OPEN, payload: 'grandparent/parent' }],
[{ type: 'showTreeEntry', payload: 'grandparent/parent' }],
- done,
);
});
});
describe('setDirectoryData', () => {
- it('sets tree correctly if there are no opened files yet', (done) => {
+ it('sets tree correctly if there are no opened files yet', () => {
const treeFile = file({ name: 'README.md' });
store.state.trees['abcproject/main'] = {};
- testAction(
+ return testAction(
setDirectoryData,
{ projectId: 'abcproject', branchId: 'main', treeList: [treeFile] },
store.state,
@@ -201,7 +186,6 @@ describe('Multi-file store tree actions', () => {
},
],
[],
- done,
);
});
});
diff --git a/spec/frontend/ide/stores/actions_spec.js b/spec/frontend/ide/stores/actions_spec.js
index be43c618095..3889c4f11c3 100644
--- a/spec/frontend/ide/stores/actions_spec.js
+++ b/spec/frontend/ide/stores/actions_spec.js
@@ -43,15 +43,9 @@ describe('Multi-file store actions', () => {
});
describe('redirectToUrl', () => {
- it('calls visitUrl', (done) => {
- store
- .dispatch('redirectToUrl', 'test')
- .then(() => {
- expect(visitUrl).toHaveBeenCalledWith('test');
-
- done();
- })
- .catch(done.fail);
+ it('calls visitUrl', async () => {
+ await store.dispatch('redirectToUrl', 'test');
+ expect(visitUrl).toHaveBeenCalledWith('test');
});
});
@@ -89,15 +83,10 @@ describe('Multi-file store actions', () => {
expect(store.dispatch.mock.calls).toEqual(expect.arrayContaining(expectedCalls));
});
- it('removes all files from changedFiles state', (done) => {
- store
- .dispatch('discardAllChanges')
- .then(() => {
- expect(store.state.changedFiles.length).toBe(0);
- expect(store.state.openFiles.length).toBe(2);
- })
- .then(done)
- .catch(done.fail);
+ it('removes all files from changedFiles state', async () => {
+ await store.dispatch('discardAllChanges');
+ expect(store.state.changedFiles.length).toBe(0);
+ expect(store.state.openFiles.length).toBe(2);
});
});
@@ -121,24 +110,18 @@ describe('Multi-file store actions', () => {
});
describe('tree', () => {
- it('creates temp tree', (done) => {
- store
- .dispatch('createTempEntry', {
- name: 'test',
- type: 'tree',
- })
- .then(() => {
- const entry = store.state.entries.test;
-
- expect(entry).not.toBeNull();
- expect(entry.type).toBe('tree');
+ it('creates temp tree', async () => {
+ await store.dispatch('createTempEntry', {
+ name: 'test',
+ type: 'tree',
+ });
+ const entry = store.state.entries.test;
- done();
- })
- .catch(done.fail);
+ expect(entry).not.toBeNull();
+ expect(entry.type).toBe('tree');
});
- it('creates new folder inside another tree', (done) => {
+ it('creates new folder inside another tree', async () => {
const tree = {
type: 'tree',
name: 'testing',
@@ -148,22 +131,16 @@ describe('Multi-file store actions', () => {
store.state.entries[tree.path] = tree;
- store
- .dispatch('createTempEntry', {
- name: 'testing/test',
- type: 'tree',
- })
- .then(() => {
- expect(tree.tree[0].tempFile).toBeTruthy();
- expect(tree.tree[0].name).toBe('test');
- expect(tree.tree[0].type).toBe('tree');
-
- done();
- })
- .catch(done.fail);
+ await store.dispatch('createTempEntry', {
+ name: 'testing/test',
+ type: 'tree',
+ });
+ expect(tree.tree[0].tempFile).toBeTruthy();
+ expect(tree.tree[0].name).toBe('test');
+ expect(tree.tree[0].type).toBe('tree');
});
- it('does not create new tree if already exists', (done) => {
+ it('does not create new tree if already exists', async () => {
const tree = {
type: 'tree',
path: 'testing',
@@ -173,76 +150,52 @@ describe('Multi-file store actions', () => {
store.state.entries[tree.path] = tree;
- store
- .dispatch('createTempEntry', {
- name: 'testing',
- type: 'tree',
- })
- .then(() => {
- expect(store.state.entries[tree.path].tempFile).toEqual(false);
- expect(document.querySelector('.flash-alert')).not.toBeNull();
-
- done();
- })
- .catch(done.fail);
+ await store.dispatch('createTempEntry', {
+ name: 'testing',
+ type: 'tree',
+ });
+ expect(store.state.entries[tree.path].tempFile).toEqual(false);
+ expect(document.querySelector('.flash-alert')).not.toBeNull();
});
});
describe('blob', () => {
- it('creates temp file', (done) => {
+ it('creates temp file', async () => {
const name = 'test';
- store
- .dispatch('createTempEntry', {
- name,
- type: 'blob',
- mimeType: 'test/mime',
- })
- .then(() => {
- const f = store.state.entries[name];
-
- expect(f.tempFile).toBeTruthy();
- expect(f.mimeType).toBe('test/mime');
- expect(store.state.trees['abcproject/mybranch'].tree.length).toBe(1);
-
- done();
- })
- .catch(done.fail);
+ await store.dispatch('createTempEntry', {
+ name,
+ type: 'blob',
+ mimeType: 'test/mime',
+ });
+ const f = store.state.entries[name];
+
+ expect(f.tempFile).toBeTruthy();
+ expect(f.mimeType).toBe('test/mime');
+ expect(store.state.trees['abcproject/mybranch'].tree.length).toBe(1);
});
- it('adds tmp file to open files', (done) => {
+ it('adds tmp file to open files', async () => {
const name = 'test';
- store
- .dispatch('createTempEntry', {
- name,
- type: 'blob',
- })
- .then(() => {
- const f = store.state.entries[name];
-
- expect(store.state.openFiles.length).toBe(1);
- expect(store.state.openFiles[0].name).toBe(f.name);
+ await store.dispatch('createTempEntry', {
+ name,
+ type: 'blob',
+ });
+ const f = store.state.entries[name];
- done();
- })
- .catch(done.fail);
+ expect(store.state.openFiles.length).toBe(1);
+ expect(store.state.openFiles[0].name).toBe(f.name);
});
- it('adds tmp file to staged files', (done) => {
+ it('adds tmp file to staged files', async () => {
const name = 'test';
- store
- .dispatch('createTempEntry', {
- name,
- type: 'blob',
- })
- .then(() => {
- expect(store.state.stagedFiles).toEqual([expect.objectContaining({ name })]);
-
- done();
- })
- .catch(done.fail);
+ await store.dispatch('createTempEntry', {
+ name,
+ type: 'blob',
+ });
+ expect(store.state.stagedFiles).toEqual([expect.objectContaining({ name })]);
});
it('sets tmp file as active', () => {
@@ -251,24 +204,18 @@ describe('Multi-file store actions', () => {
expect(store.dispatch).toHaveBeenCalledWith('setFileActive', 'test');
});
- it('creates flash message if file already exists', (done) => {
+ it('creates flash message if file already exists', async () => {
const f = file('test', '1', 'blob');
store.state.trees['abcproject/mybranch'].tree = [f];
store.state.entries[f.path] = f;
- store
- .dispatch('createTempEntry', {
- name: 'test',
- type: 'blob',
- })
- .then(() => {
- expect(document.querySelector('.flash-alert')?.textContent.trim()).toEqual(
- `The name "${f.name}" is already taken in this directory.`,
- );
-
- done();
- })
- .catch(done.fail);
+ await store.dispatch('createTempEntry', {
+ name: 'test',
+ type: 'blob',
+ });
+ expect(document.querySelector('.flash-alert')?.textContent.trim()).toEqual(
+ `The name "${f.name}" is already taken in this directory.`,
+ );
});
});
});
@@ -372,45 +319,38 @@ describe('Multi-file store actions', () => {
});
describe('updateViewer', () => {
- it('updates viewer state', (done) => {
- store
- .dispatch('updateViewer', 'diff')
- .then(() => {
- expect(store.state.viewer).toBe('diff');
- })
- .then(done)
- .catch(done.fail);
+ it('updates viewer state', async () => {
+ await store.dispatch('updateViewer', 'diff');
+ expect(store.state.viewer).toBe('diff');
});
});
describe('updateActivityBarView', () => {
- it('commits UPDATE_ACTIVITY_BAR_VIEW', (done) => {
- testAction(
+ it('commits UPDATE_ACTIVITY_BAR_VIEW', () => {
+ return testAction(
updateActivityBarView,
'test',
{},
[{ type: 'UPDATE_ACTIVITY_BAR_VIEW', payload: 'test' }],
[],
- done,
);
});
});
describe('setEmptyStateSvgs', () => {
- it('commits setEmptyStateSvgs', (done) => {
- testAction(
+ it('commits setEmptyStateSvgs', () => {
+ return testAction(
setEmptyStateSvgs,
'svg',
{},
[{ type: 'SET_EMPTY_STATE_SVGS', payload: 'svg' }],
[],
- done,
);
});
});
describe('updateTempFlagForEntry', () => {
- it('commits UPDATE_TEMP_FLAG', (done) => {
+ it('commits UPDATE_TEMP_FLAG', () => {
const f = {
...file(),
path: 'test',
@@ -418,17 +358,16 @@ describe('Multi-file store actions', () => {
};
store.state.entries[f.path] = f;
- testAction(
+ return testAction(
updateTempFlagForEntry,
{ file: f, tempFile: false },
store.state,
[{ type: 'UPDATE_TEMP_FLAG', payload: { path: f.path, tempFile: false } }],
[],
- done,
);
});
- it('commits UPDATE_TEMP_FLAG and dispatches for parent', (done) => {
+ it('commits UPDATE_TEMP_FLAG and dispatches for parent', () => {
const parent = {
...file(),
path: 'testing',
@@ -441,17 +380,16 @@ describe('Multi-file store actions', () => {
store.state.entries[parent.path] = parent;
store.state.entries[f.path] = f;
- testAction(
+ return testAction(
updateTempFlagForEntry,
{ file: f, tempFile: false },
store.state,
[{ type: 'UPDATE_TEMP_FLAG', payload: { path: f.path, tempFile: false } }],
[{ type: 'updateTempFlagForEntry', payload: { file: parent, tempFile: false } }],
- done,
);
});
- it('does not dispatch for parent, if parent does not exist', (done) => {
+ it('does not dispatch for parent, if parent does not exist', () => {
const f = {
...file(),
path: 'test',
@@ -459,71 +397,66 @@ describe('Multi-file store actions', () => {
};
store.state.entries[f.path] = f;
- testAction(
+ return testAction(
updateTempFlagForEntry,
{ file: f, tempFile: false },
store.state,
[{ type: 'UPDATE_TEMP_FLAG', payload: { path: f.path, tempFile: false } }],
[],
- done,
);
});
});
describe('setCurrentBranchId', () => {
- it('commits setCurrentBranchId', (done) => {
- testAction(
+ it('commits setCurrentBranchId', () => {
+ return testAction(
setCurrentBranchId,
'branchId',
{},
[{ type: 'SET_CURRENT_BRANCH', payload: 'branchId' }],
[],
- done,
);
});
});
describe('toggleFileFinder', () => {
- it('commits TOGGLE_FILE_FINDER', (done) => {
- testAction(
+ it('commits TOGGLE_FILE_FINDER', () => {
+ return testAction(
toggleFileFinder,
true,
null,
[{ type: 'TOGGLE_FILE_FINDER', payload: true }],
[],
- done,
);
});
});
describe('setErrorMessage', () => {
- it('commis error messsage', (done) => {
- testAction(
+ it('commis error messsage', () => {
+ return testAction(
setErrorMessage,
'error',
null,
[{ type: types.SET_ERROR_MESSAGE, payload: 'error' }],
[],
- done,
);
});
});
describe('deleteEntry', () => {
- it('commits entry deletion', (done) => {
+ it('commits entry deletion', () => {
store.state.entries.path = 'testing';
- testAction(
+ return testAction(
deleteEntry,
'path',
store.state,
[{ type: types.DELETE_ENTRY, payload: 'path' }],
[{ type: 'stageChange', payload: 'path' }, createTriggerChangeAction()],
- done,
);
});
- it('does not delete a folder after it is emptied', (done) => {
+ it('does not delete a folder after it is emptied', () => {
const testFolder = {
type: 'tree',
tree: [],
@@ -540,7 +473,7 @@ describe('Multi-file store actions', () => {
'testFolder/entry-to-delete': testEntry,
};
- testAction(
+ return testAction(
deleteEntry,
'testFolder/entry-to-delete',
store.state,
@@ -549,7 +482,6 @@ describe('Multi-file store actions', () => {
{ type: 'stageChange', payload: 'testFolder/entry-to-delete' },
createTriggerChangeAction(),
],
- done,
);
});
@@ -569,8 +501,8 @@ describe('Multi-file store actions', () => {
});
describe('and previous does not exist', () => {
- it('reverts the rename before deleting', (done) => {
- testAction(
+ it('reverts the rename before deleting', () => {
+ return testAction(
deleteEntry,
testEntry.path,
store.state,
@@ -589,7 +521,6 @@ describe('Multi-file store actions', () => {
payload: testEntry.prevPath,
},
],
- done,
);
});
});
@@ -604,21 +535,20 @@ describe('Multi-file store actions', () => {
store.state.entries[oldEntry.path] = oldEntry;
});
- it('does not revert rename before deleting', (done) => {
- testAction(
+ it('does not revert rename before deleting', () => {
+ return testAction(
deleteEntry,
testEntry.path,
store.state,
[{ type: types.DELETE_ENTRY, payload: testEntry.path }],
[{ type: 'stageChange', payload: testEntry.path }, createTriggerChangeAction()],
- done,
);
});
- it('when previous is deleted, it reverts rename before deleting', (done) => {
+ it('when previous is deleted, it reverts rename before deleting', () => {
store.state.entries[testEntry.prevPath].deleted = true;
- testAction(
+ return testAction(
deleteEntry,
testEntry.path,
store.state,
@@ -637,7 +567,6 @@ describe('Multi-file store actions', () => {
payload: testEntry.prevPath,
},
],
- done,
);
});
});
@@ -650,7 +579,7 @@ describe('Multi-file store actions', () => {
jest.spyOn(eventHub, '$emit').mockImplementation();
});
- it('does not purge model cache for temporary entries that got renamed', (done) => {
+ it('does not purge model cache for temporary entries that got renamed', async () => {
Object.assign(store.state.entries, {
test: {
...file('test'),
@@ -660,19 +589,14 @@ describe('Multi-file store actions', () => {
},
});
- store
- .dispatch('renameEntry', {
- path: 'test',
- name: 'new',
- })
- .then(() => {
- expect(eventHub.$emit.mock.calls).not.toContain('editor.update.model.dispose.foo-bar');
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('renameEntry', {
+ path: 'test',
+ name: 'new',
+ });
+ expect(eventHub.$emit.mock.calls).not.toContain('editor.update.model.dispose.foo-bar');
});
- it('purges model cache for renamed entry', (done) => {
+ it('purges model cache for renamed entry', async () => {
Object.assign(store.state.entries, {
test: {
...file('test'),
@@ -682,17 +606,12 @@ describe('Multi-file store actions', () => {
},
});
- store
- .dispatch('renameEntry', {
- path: 'test',
- name: 'new',
- })
- .then(() => {
- expect(eventHub.$emit).toHaveBeenCalled();
- expect(eventHub.$emit).toHaveBeenCalledWith(`editor.update.model.dispose.foo-key`);
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('renameEntry', {
+ path: 'test',
+ name: 'new',
+ });
+ expect(eventHub.$emit).toHaveBeenCalled();
+ expect(eventHub.$emit).toHaveBeenCalledWith(`editor.update.model.dispose.foo-key`);
});
});
@@ -731,8 +650,8 @@ describe('Multi-file store actions', () => {
]);
});
- it('if not changed, completely unstages and discards entry if renamed to original', (done) => {
- testAction(
+ it('if not changed, completely unstages and discards entry if renamed to original', () => {
+ return testAction(
renameEntry,
{ path: 'renamed', name: 'orig' },
store.state,
@@ -751,24 +670,22 @@ describe('Multi-file store actions', () => {
},
],
[createTriggerRenameAction('renamed', 'orig')],
- done,
);
});
- it('if already in changed, does not add to change', (done) => {
+ it('if already in changed, does not add to change', () => {
store.state.changedFiles.push(renamedEntry);
- testAction(
+ return testAction(
renameEntry,
{ path: 'orig', name: 'renamed' },
store.state,
[expect.objectContaining({ type: types.RENAME_ENTRY })],
[createTriggerRenameAction('orig', 'renamed')],
- done,
);
});
- it('routes to the renamed file if the original file has been opened', (done) => {
+ it('routes to the renamed file if the original file has been opened', async () => {
store.state.currentProjectId = 'test/test';
store.state.currentBranchId = 'main';
@@ -776,17 +693,12 @@ describe('Multi-file store actions', () => {
opened: true,
});
- store
- .dispatch('renameEntry', {
- path: 'orig',
- name: 'renamed',
- })
- .then(() => {
- expect(router.push.mock.calls).toHaveLength(1);
- expect(router.push).toHaveBeenCalledWith(`/project/test/test/tree/main/-/renamed/`);
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('renameEntry', {
+ path: 'orig',
+ name: 'renamed',
+ });
+ expect(router.push.mock.calls).toHaveLength(1);
+ expect(router.push).toHaveBeenCalledWith(`/project/test/test/tree/main/-/renamed/`);
});
});
@@ -809,25 +721,20 @@ describe('Multi-file store actions', () => {
});
});
- it('updates entries in a folder correctly, when folder is renamed', (done) => {
- store
- .dispatch('renameEntry', {
- path: 'folder',
- name: 'new-folder',
- })
- .then(() => {
- const keys = Object.keys(store.state.entries);
-
- expect(keys.length).toBe(3);
- expect(keys.indexOf('new-folder')).toBe(0);
- expect(keys.indexOf('new-folder/file-1')).toBe(1);
- expect(keys.indexOf('new-folder/file-2')).toBe(2);
- })
- .then(done)
- .catch(done.fail);
+ it('updates entries in a folder correctly, when folder is renamed', async () => {
+ await store.dispatch('renameEntry', {
+ path: 'folder',
+ name: 'new-folder',
+ });
+ const keys = Object.keys(store.state.entries);
+
+ expect(keys.length).toBe(3);
+ expect(keys.indexOf('new-folder')).toBe(0);
+ expect(keys.indexOf('new-folder/file-1')).toBe(1);
+ expect(keys.indexOf('new-folder/file-2')).toBe(2);
});
- it('discards renaming of an entry if the root folder is renamed back to a previous name', (done) => {
+ it('discards renaming of an entry if the root folder is renamed back to a previous name', async () => {
const rootFolder = file('old-folder', 'old-folder', 'tree');
const testEntry = file('test', 'test', 'blob', rootFolder);
@@ -841,53 +748,45 @@ describe('Multi-file store actions', () => {
},
});
- store
- .dispatch('renameEntry', {
- path: 'old-folder',
- name: 'new-folder',
- })
- .then(() => {
- const { entries } = store.state;
-
- expect(Object.keys(entries).length).toBe(2);
- expect(entries['old-folder']).toBeUndefined();
- expect(entries['old-folder/test']).toBeUndefined();
-
- expect(entries['new-folder']).toBeDefined();
- expect(entries['new-folder/test']).toEqual(
- expect.objectContaining({
- path: 'new-folder/test',
- name: 'test',
- prevPath: 'old-folder/test',
- prevName: 'test',
- }),
- );
- })
- .then(() =>
- store.dispatch('renameEntry', {
- path: 'new-folder',
- name: 'old-folder',
- }),
- )
- .then(() => {
- const { entries } = store.state;
-
- expect(Object.keys(entries).length).toBe(2);
- expect(entries['new-folder']).toBeUndefined();
- expect(entries['new-folder/test']).toBeUndefined();
-
- expect(entries['old-folder']).toBeDefined();
- expect(entries['old-folder/test']).toEqual(
- expect.objectContaining({
- path: 'old-folder/test',
- name: 'test',
- prevPath: undefined,
- prevName: undefined,
- }),
- );
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('renameEntry', {
+ path: 'old-folder',
+ name: 'new-folder',
+ });
+ const { entries } = store.state;
+
+ expect(Object.keys(entries).length).toBe(2);
+ expect(entries['old-folder']).toBeUndefined();
+ expect(entries['old-folder/test']).toBeUndefined();
+
+ expect(entries['new-folder']).toBeDefined();
+ expect(entries['new-folder/test']).toEqual(
+ expect.objectContaining({
+ path: 'new-folder/test',
+ name: 'test',
+ prevPath: 'old-folder/test',
+ prevName: 'test',
+ }),
+ );
+
+ await store.dispatch('renameEntry', {
+ path: 'new-folder',
+ name: 'old-folder',
+ });
+ const { entries: newEntries } = store.state;
+
+ expect(Object.keys(newEntries).length).toBe(2);
+ expect(newEntries['new-folder']).toBeUndefined();
+ expect(newEntries['new-folder/test']).toBeUndefined();
+
+ expect(newEntries['old-folder']).toBeDefined();
+ expect(newEntries['old-folder/test']).toEqual(
+ expect.objectContaining({
+ path: 'old-folder/test',
+ name: 'test',
+ prevPath: undefined,
+ prevName: undefined,
+ }),
+ );
});
describe('with file in directory', () => {
@@ -919,24 +818,21 @@ describe('Multi-file store actions', () => {
});
});
- it('creates new directory', (done) => {
+ it('creates new directory', async () => {
expect(store.state.entries[newParentPath]).toBeUndefined();
- store
- .dispatch('renameEntry', { path: filePath, name: fileName, parentPath: newParentPath })
- .then(() => {
- expect(store.state.entries[newParentPath]).toEqual(
- expect.objectContaining({
- path: newParentPath,
- type: 'tree',
- tree: expect.arrayContaining([
- store.state.entries[`${newParentPath}/${fileName}`],
- ]),
- }),
- );
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('renameEntry', {
+ path: filePath,
+ name: fileName,
+ parentPath: newParentPath,
+ });
+ expect(store.state.entries[newParentPath]).toEqual(
+ expect.objectContaining({
+ path: newParentPath,
+ type: 'tree',
+ tree: expect.arrayContaining([store.state.entries[`${newParentPath}/${fileName}`]]),
+ }),
+ );
});
describe('when new directory exists', () => {
@@ -949,40 +845,30 @@ describe('Multi-file store actions', () => {
rootDir.tree.push(newDir);
});
- it('inserts in new directory', (done) => {
+ it('inserts in new directory', async () => {
expect(newDir.tree).toEqual([]);
- store
- .dispatch('renameEntry', {
- path: filePath,
- name: fileName,
- parentPath: newParentPath,
- })
- .then(() => {
- expect(newDir.tree).toEqual([store.state.entries[`${newParentPath}/${fileName}`]]);
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('renameEntry', {
+ path: filePath,
+ name: fileName,
+ parentPath: newParentPath,
+ });
+ expect(newDir.tree).toEqual([store.state.entries[`${newParentPath}/${fileName}`]]);
});
- it('when new directory is deleted, it undeletes it', (done) => {
- store.dispatch('deleteEntry', newParentPath);
+ it('when new directory is deleted, it undeletes it', async () => {
+ await store.dispatch('deleteEntry', newParentPath);
expect(store.state.entries[newParentPath].deleted).toBe(true);
expect(rootDir.tree.some((x) => x.path === newParentPath)).toBe(false);
- store
- .dispatch('renameEntry', {
- path: filePath,
- name: fileName,
- parentPath: newParentPath,
- })
- .then(() => {
- expect(store.state.entries[newParentPath].deleted).toBe(false);
- expect(rootDir.tree.some((x) => x.path === newParentPath)).toBe(true);
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('renameEntry', {
+ path: filePath,
+ name: fileName,
+ parentPath: newParentPath,
+ });
+ expect(store.state.entries[newParentPath].deleted).toBe(false);
+ expect(rootDir.tree.some((x) => x.path === newParentPath)).toBe(true);
});
});
});
@@ -1023,30 +909,25 @@ describe('Multi-file store actions', () => {
document.querySelector('.flash-container').remove();
});
- it('passes the error further unchanged without dispatching any action when response is 404', (done) => {
+ it('passes the error further unchanged without dispatching any action when response is 404', async () => {
mock.onGet(/(.*)/).replyOnce(404);
- getBranchData(...callParams)
- .then(done.fail)
- .catch((e) => {
- expect(dispatch.mock.calls).toHaveLength(0);
- expect(e.response.status).toEqual(404);
- expect(document.querySelector('.flash-alert')).toBeNull();
- done();
- });
+ await expect(getBranchData(...callParams)).rejects.toEqual(
+ new Error('Request failed with status code 404'),
+ );
+ expect(dispatch.mock.calls).toHaveLength(0);
+ expect(document.querySelector('.flash-alert')).toBeNull();
});
- it('does not pass the error further and flashes an alert if error is not 404', (done) => {
+ it('does not pass the error further and flashes an alert if error is not 404', async () => {
mock.onGet(/(.*)/).replyOnce(418);
- getBranchData(...callParams)
- .then(done.fail)
- .catch((e) => {
- expect(dispatch.mock.calls).toHaveLength(0);
- expect(e.response).toBeUndefined();
- expect(document.querySelector('.flash-alert')).not.toBeNull();
- done();
- });
+ await expect(getBranchData(...callParams)).rejects.toEqual(
+ new Error('Branch not loaded - <strong>abc/def/main-testing</strong>'),
+ );
+
+ expect(dispatch.mock.calls).toHaveLength(0);
+ expect(document.querySelector('.flash-alert')).not.toBeNull();
});
});
});
diff --git a/spec/frontend/ide/stores/modules/branches/actions_spec.js b/spec/frontend/ide/stores/modules/branches/actions_spec.js
index 135dbc1f746..306330e3ba2 100644
--- a/spec/frontend/ide/stores/modules/branches/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/branches/actions_spec.js
@@ -42,21 +42,20 @@ describe('IDE branches actions', () => {
});
describe('requestBranches', () => {
- it('should commit request', (done) => {
- testAction(
+ it('should commit request', () => {
+ return testAction(
requestBranches,
null,
mockedContext.state,
[{ type: types.REQUEST_BRANCHES }],
[],
- done,
);
});
});
describe('receiveBranchesError', () => {
- it('should commit error', (done) => {
- testAction(
+ it('should commit error', () => {
+ return testAction(
receiveBranchesError,
{ search: TEST_SEARCH },
mockedContext.state,
@@ -72,20 +71,18 @@ describe('IDE branches actions', () => {
},
},
],
- done,
);
});
});
describe('receiveBranchesSuccess', () => {
- it('should commit received data', (done) => {
- testAction(
+ it('should commit received data', () => {
+ return testAction(
receiveBranchesSuccess,
branches,
mockedContext.state,
[{ type: types.RECEIVE_BRANCHES_SUCCESS, payload: branches }],
[],
- done,
);
});
});
@@ -110,8 +107,8 @@ describe('IDE branches actions', () => {
});
});
- it('dispatches success with received data', (done) => {
- testAction(
+ it('dispatches success with received data', () => {
+ return testAction(
fetchBranches,
{ search: TEST_SEARCH },
mockedState,
@@ -121,7 +118,6 @@ describe('IDE branches actions', () => {
{ type: 'resetBranches' },
{ type: 'receiveBranchesSuccess', payload: branches },
],
- done,
);
});
});
@@ -131,8 +127,8 @@ describe('IDE branches actions', () => {
mock.onGet(/\/api\/v4\/projects\/\d+\/repository\/branches(.*)$/).replyOnce(500);
});
- it('dispatches error', (done) => {
- testAction(
+ it('dispatches error', () => {
+ return testAction(
fetchBranches,
{ search: TEST_SEARCH },
mockedState,
@@ -142,20 +138,18 @@ describe('IDE branches actions', () => {
{ type: 'resetBranches' },
{ type: 'receiveBranchesError', payload: { search: TEST_SEARCH } },
],
- done,
);
});
});
describe('resetBranches', () => {
- it('commits reset', (done) => {
- testAction(
+ it('commits reset', () => {
+ return testAction(
resetBranches,
null,
mockedContext.state,
[{ type: types.RESET_BRANCHES }],
[],
- done,
);
});
});
diff --git a/spec/frontend/ide/stores/modules/clientside/actions_spec.js b/spec/frontend/ide/stores/modules/clientside/actions_spec.js
index d2777623b0d..c2b9de192d9 100644
--- a/spec/frontend/ide/stores/modules/clientside/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/clientside/actions_spec.js
@@ -26,15 +26,13 @@ describe('IDE store module clientside actions', () => {
});
describe('pingUsage', () => {
- it('posts to usage endpoint', (done) => {
+ it('posts to usage endpoint', async () => {
const usageSpy = jest.fn(() => [200]);
mock.onPost(TEST_USAGE_URL).reply(() => usageSpy());
- testAction(actions.pingUsage, PING_USAGE_PREVIEW_KEY, rootGetters, [], [], () => {
- expect(usageSpy).toHaveBeenCalled();
- done();
- });
+ await testAction(actions.pingUsage, PING_USAGE_PREVIEW_KEY, rootGetters, [], []);
+ expect(usageSpy).toHaveBeenCalled();
});
});
});
diff --git a/spec/frontend/ide/stores/modules/commit/actions_spec.js b/spec/frontend/ide/stores/modules/commit/actions_spec.js
index cb6bb7c1202..d65039e89cc 100644
--- a/spec/frontend/ide/stores/modules/commit/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/commit/actions_spec.js
@@ -57,40 +57,25 @@ describe('IDE commit module actions', () => {
});
describe('updateCommitMessage', () => {
- it('updates store with new commit message', (done) => {
- store
- .dispatch('commit/updateCommitMessage', 'testing')
- .then(() => {
- expect(store.state.commit.commitMessage).toBe('testing');
- })
- .then(done)
- .catch(done.fail);
+ it('updates store with new commit message', async () => {
+ await store.dispatch('commit/updateCommitMessage', 'testing');
+ expect(store.state.commit.commitMessage).toBe('testing');
});
});
describe('discardDraft', () => {
- it('resets commit message to blank', (done) => {
+ it('resets commit message to blank', async () => {
store.state.commit.commitMessage = 'testing';
- store
- .dispatch('commit/discardDraft')
- .then(() => {
- expect(store.state.commit.commitMessage).not.toBe('testing');
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('commit/discardDraft');
+ expect(store.state.commit.commitMessage).not.toBe('testing');
});
});
describe('updateCommitAction', () => {
- it('updates store with new commit action', (done) => {
- store
- .dispatch('commit/updateCommitAction', '1')
- .then(() => {
- expect(store.state.commit.commitAction).toBe('1');
- })
- .then(done)
- .catch(done.fail);
+ it('updates store with new commit action', async () => {
+ await store.dispatch('commit/updateCommitAction', '1');
+ expect(store.state.commit.commitAction).toBe('1');
});
});
@@ -139,34 +124,24 @@ describe('IDE commit module actions', () => {
});
});
- it('updates commit message with short_id', (done) => {
- store
- .dispatch('commit/setLastCommitMessage', { short_id: '123' })
- .then(() => {
- expect(store.state.lastCommitMsg).toContain(
- 'Your changes have been committed. Commit <a href="http://testing/-/commit/123" class="commit-sha">123</a>',
- );
- })
- .then(done)
- .catch(done.fail);
+ it('updates commit message with short_id', async () => {
+ await store.dispatch('commit/setLastCommitMessage', { short_id: '123' });
+ expect(store.state.lastCommitMsg).toContain(
+ 'Your changes have been committed. Commit <a href="http://testing/-/commit/123" class="commit-sha">123</a>',
+ );
});
- it('updates commit message with stats', (done) => {
- store
- .dispatch('commit/setLastCommitMessage', {
- short_id: '123',
- stats: {
- additions: '1',
- deletions: '2',
- },
- })
- .then(() => {
- expect(store.state.lastCommitMsg).toBe(
- 'Your changes have been committed. Commit <a href="http://testing/-/commit/123" class="commit-sha">123</a> with 1 additions, 2 deletions.',
- );
- })
- .then(done)
- .catch(done.fail);
+ it('updates commit message with stats', async () => {
+ await store.dispatch('commit/setLastCommitMessage', {
+ short_id: '123',
+ stats: {
+ additions: '1',
+ deletions: '2',
+ },
+ });
+ expect(store.state.lastCommitMsg).toBe(
+ 'Your changes have been committed. Commit <a href="http://testing/-/commit/123" class="commit-sha">123</a> with 1 additions, 2 deletions.',
+ );
});
});
@@ -221,74 +196,49 @@ describe('IDE commit module actions', () => {
});
});
- it('updates stores working reference', (done) => {
- store
- .dispatch('commit/updateFilesAfterCommit', {
- data,
- branch,
- })
- .then(() => {
- expect(store.state.projects.abcproject.branches.main.workingReference).toBe(data.id);
- })
- .then(done)
- .catch(done.fail);
+ it('updates stores working reference', async () => {
+ await store.dispatch('commit/updateFilesAfterCommit', {
+ data,
+ branch,
+ });
+ expect(store.state.projects.abcproject.branches.main.workingReference).toBe(data.id);
});
- it('resets all files changed status', (done) => {
- store
- .dispatch('commit/updateFilesAfterCommit', {
- data,
- branch,
- })
- .then(() => {
- store.state.openFiles.forEach((entry) => {
- expect(entry.changed).toBeFalsy();
- });
- })
- .then(done)
- .catch(done.fail);
+ it('resets all files changed status', async () => {
+ await store.dispatch('commit/updateFilesAfterCommit', {
+ data,
+ branch,
+ });
+ store.state.openFiles.forEach((entry) => {
+ expect(entry.changed).toBeFalsy();
+ });
});
- it('sets files commit data', (done) => {
- store
- .dispatch('commit/updateFilesAfterCommit', {
- data,
- branch,
- })
- .then(() => {
- expect(f.lastCommitSha).toBe(data.id);
- })
- .then(done)
- .catch(done.fail);
+ it('sets files commit data', async () => {
+ await store.dispatch('commit/updateFilesAfterCommit', {
+ data,
+ branch,
+ });
+ expect(f.lastCommitSha).toBe(data.id);
});
- it('updates raw content for changed file', (done) => {
- store
- .dispatch('commit/updateFilesAfterCommit', {
- data,
- branch,
- })
- .then(() => {
- expect(f.raw).toBe(f.content);
- })
- .then(done)
- .catch(done.fail);
+ it('updates raw content for changed file', async () => {
+ await store.dispatch('commit/updateFilesAfterCommit', {
+ data,
+ branch,
+ });
+ expect(f.raw).toBe(f.content);
});
- it('emits changed event for file', (done) => {
- store
- .dispatch('commit/updateFilesAfterCommit', {
- data,
- branch,
- })
- .then(() => {
- expect(eventHub.$emit).toHaveBeenCalledWith(`editor.update.model.content.${f.key}`, {
- content: f.content,
- changed: false,
- });
- })
- .then(done)
- .catch(done.fail);
+ it('emits changed event for file', async () => {
+ await store.dispatch('commit/updateFilesAfterCommit', {
+ data,
+ branch,
+ });
+ expect(eventHub.$emit).toHaveBeenCalledWith(`editor.update.model.content.${f.key}`, {
+ content: f.content,
+ changed: false,
+ });
});
});
@@ -349,138 +299,93 @@ describe('IDE commit module actions', () => {
jest.spyOn(service, 'commit').mockResolvedValue({ data: COMMIT_RESPONSE });
});
- it('calls service', (done) => {
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(service.commit).toHaveBeenCalledWith('abcproject', {
- branch: expect.anything(),
- commit_message: 'testing 123',
- actions: [
- {
- action: commitActionTypes.update,
- file_path: expect.anything(),
- content: '\n',
- encoding: expect.anything(),
- last_commit_id: undefined,
- previous_path: undefined,
- },
- ],
- start_sha: TEST_COMMIT_SHA,
- });
-
- done();
- })
- .catch(done.fail);
+ it('calls service', async () => {
+ await store.dispatch('commit/commitChanges');
+ expect(service.commit).toHaveBeenCalledWith('abcproject', {
+ branch: expect.anything(),
+ commit_message: 'testing 123',
+ actions: [
+ {
+ action: commitActionTypes.update,
+ file_path: expect.anything(),
+ content: '\n',
+ encoding: expect.anything(),
+ last_commit_id: undefined,
+ previous_path: undefined,
+ },
+ ],
+ start_sha: TEST_COMMIT_SHA,
+ });
});
- it('sends lastCommit ID when not creating new branch', (done) => {
+ it('sends lastCommit ID when not creating new branch', async () => {
store.state.commit.commitAction = '1';
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(service.commit).toHaveBeenCalledWith('abcproject', {
- branch: expect.anything(),
- commit_message: 'testing 123',
- actions: [
- {
- action: commitActionTypes.update,
- file_path: expect.anything(),
- content: '\n',
- encoding: expect.anything(),
- last_commit_id: TEST_COMMIT_SHA,
- previous_path: undefined,
- },
- ],
- start_sha: undefined,
- });
-
- done();
- })
- .catch(done.fail);
+ await store.dispatch('commit/commitChanges');
+ expect(service.commit).toHaveBeenCalledWith('abcproject', {
+ branch: expect.anything(),
+ commit_message: 'testing 123',
+ actions: [
+ {
+ action: commitActionTypes.update,
+ file_path: expect.anything(),
+ content: '\n',
+ encoding: expect.anything(),
+ last_commit_id: TEST_COMMIT_SHA,
+ previous_path: undefined,
+ },
+ ],
+ start_sha: undefined,
+ });
});
- it('sets last Commit Msg', (done) => {
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(store.state.lastCommitMsg).toBe(
- 'Your changes have been committed. Commit <a href="webUrl/-/commit/123" class="commit-sha">123</a> with 1 additions, 2 deletions.',
- );
-
- done();
- })
- .catch(done.fail);
+ it('sets last Commit Msg', async () => {
+ await store.dispatch('commit/commitChanges');
+ expect(store.state.lastCommitMsg).toBe(
+ 'Your changes have been committed. Commit <a href="webUrl/-/commit/123" class="commit-sha">123</a> with 1 additions, 2 deletions.',
+ );
});
- it('adds commit data to files', (done) => {
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(store.state.entries[store.state.openFiles[0].path].lastCommitSha).toBe(
- COMMIT_RESPONSE.id,
- );
-
- done();
- })
- .catch(done.fail);
+ it('adds commit data to files', async () => {
+ await store.dispatch('commit/commitChanges');
+ expect(store.state.entries[store.state.openFiles[0].path].lastCommitSha).toBe(
+ COMMIT_RESPONSE.id,
+ );
});
- it('resets stores commit actions', (done) => {
+ it('resets stores commit actions', async () => {
store.state.commit.commitAction = COMMIT_TO_NEW_BRANCH;
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(store.state.commit.commitAction).not.toBe(COMMIT_TO_NEW_BRANCH);
- })
- .then(done)
- .catch(done.fail);
+ await store.dispatch('commit/commitChanges');
+ expect(store.state.commit.commitAction).not.toBe(COMMIT_TO_NEW_BRANCH);
});
- it('removes all staged files', (done) => {
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(store.state.stagedFiles.length).toBe(0);
- })
- .then(done)
- .catch(done.fail);
+ it('removes all staged files', async () => {
+ await store.dispatch('commit/commitChanges');
+ expect(store.state.stagedFiles.length).toBe(0);
});
describe('merge request', () => {
- it('redirects to new merge request page', (done) => {
+ it('redirects to new merge request page', async () => {
jest.spyOn(eventHub, '$on').mockImplementation();
store.state.commit.commitAction = COMMIT_TO_NEW_BRANCH;
store.state.commit.shouldCreateMR = true;
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(visitUrl).toHaveBeenCalledWith(
- `webUrl/-/merge_requests/new?merge_request[source_branch]=${store.getters['commit/placeholderBranchName']}&merge_request[target_branch]=main&nav_source=webide`,
- );
-
- done();
- })
- .catch(done.fail);
+ await store.dispatch('commit/commitChanges');
+ expect(visitUrl).toHaveBeenCalledWith(
+ `webUrl/-/merge_requests/new?merge_request[source_branch]=${store.getters['commit/placeholderBranchName']}&merge_request[target_branch]=main&nav_source=webide`,
+ );
});
- it('does not redirect to new merge request page when shouldCreateMR is not checked', (done) => {
+ it('does not redirect to new merge request page when shouldCreateMR is not checked', async () => {
jest.spyOn(eventHub, '$on').mockImplementation();
store.state.commit.commitAction = COMMIT_TO_NEW_BRANCH;
store.state.commit.shouldCreateMR = false;
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(visitUrl).not.toHaveBeenCalled();
- done();
- })
- .catch(done.fail);
+ await store.dispatch('commit/commitChanges');
+ expect(visitUrl).not.toHaveBeenCalled();
});
it('does not redirect to merge request page if shouldCreateMR is checked, but branch is the default branch', async () => {
@@ -514,17 +419,11 @@ describe('IDE commit module actions', () => {
});
});
- it('shows failed message', (done) => {
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- const alert = document.querySelector('.flash-container');
-
- expect(alert.textContent.trim()).toBe('failed message');
+ it('shows failed message', async () => {
+ await store.dispatch('commit/commitChanges');
+ const alert = document.querySelector('.flash-container');
- done();
- })
- .catch(done.fail);
+ expect(alert.textContent.trim()).toBe('failed message');
});
});
@@ -548,52 +447,37 @@ describe('IDE commit module actions', () => {
});
describe('first commit of a branch', () => {
- it('commits TOGGLE_EMPTY_STATE mutation on empty repo', (done) => {
+ it('commits TOGGLE_EMPTY_STATE mutation on empty repo', async () => {
jest.spyOn(service, 'commit').mockResolvedValue({ data: COMMIT_RESPONSE });
jest.spyOn(store, 'commit');
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(store.commit.mock.calls).toEqual(
- expect.arrayContaining([
- ['TOGGLE_EMPTY_STATE', expect.any(Object), expect.any(Object)],
- ]),
- );
- done();
- })
- .catch(done.fail);
+ await store.dispatch('commit/commitChanges');
+ expect(store.commit.mock.calls).toEqual(
+ expect.arrayContaining([['TOGGLE_EMPTY_STATE', expect.any(Object), expect.any(Object)]]),
+ );
});
- it('does not commmit TOGGLE_EMPTY_STATE mutation on existing project', (done) => {
+ it('does not commmit TOGGLE_EMPTY_STATE mutation on existing project', async () => {
COMMIT_RESPONSE.parent_ids.push('1234');
jest.spyOn(service, 'commit').mockResolvedValue({ data: COMMIT_RESPONSE });
jest.spyOn(store, 'commit');
- store
- .dispatch('commit/commitChanges')
- .then(() => {
- expect(store.commit.mock.calls).not.toEqual(
- expect.arrayContaining([
- ['TOGGLE_EMPTY_STATE', expect.any(Object), expect.any(Object)],
- ]),
- );
- done();
- })
- .catch(done.fail);
+ await store.dispatch('commit/commitChanges');
+ expect(store.commit.mock.calls).not.toEqual(
+ expect.arrayContaining([['TOGGLE_EMPTY_STATE', expect.any(Object), expect.any(Object)]]),
+ );
});
});
});
describe('toggleShouldCreateMR', () => {
- it('commits both toggle and interacting with MR checkbox actions', (done) => {
- testAction(
+ it('commits both toggle and interacting with MR checkbox actions', () => {
+ return testAction(
actions.toggleShouldCreateMR,
{},
store.state,
[{ type: mutationTypes.TOGGLE_SHOULD_CREATE_MR }],
[],
- done,
);
});
});
diff --git a/spec/frontend/ide/stores/modules/file_templates/actions_spec.js b/spec/frontend/ide/stores/modules/file_templates/actions_spec.js
index 9ff950b0875..1080a30d2d8 100644
--- a/spec/frontend/ide/stores/modules/file_templates/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/file_templates/actions_spec.js
@@ -20,21 +20,20 @@ describe('IDE file templates actions', () => {
});
describe('requestTemplateTypes', () => {
- it('commits REQUEST_TEMPLATE_TYPES', (done) => {
- testAction(
+ it('commits REQUEST_TEMPLATE_TYPES', () => {
+ return testAction(
actions.requestTemplateTypes,
null,
state,
[{ type: types.REQUEST_TEMPLATE_TYPES }],
[],
- done,
);
});
});
describe('receiveTemplateTypesError', () => {
- it('commits RECEIVE_TEMPLATE_TYPES_ERROR and dispatches setErrorMessage', (done) => {
- testAction(
+ it('commits RECEIVE_TEMPLATE_TYPES_ERROR and dispatches setErrorMessage', () => {
+ return testAction(
actions.receiveTemplateTypesError,
null,
state,
@@ -49,20 +48,18 @@ describe('IDE file templates actions', () => {
},
},
],
- done,
);
});
});
describe('receiveTemplateTypesSuccess', () => {
- it('commits RECEIVE_TEMPLATE_TYPES_SUCCESS', (done) => {
- testAction(
+ it('commits RECEIVE_TEMPLATE_TYPES_SUCCESS', () => {
+ return testAction(
actions.receiveTemplateTypesSuccess,
'test',
state,
[{ type: types.RECEIVE_TEMPLATE_TYPES_SUCCESS, payload: 'test' }],
[],
- done,
);
});
});
@@ -81,23 +78,17 @@ describe('IDE file templates actions', () => {
});
});
- it('rejects if selectedTemplateType is empty', (done) => {
+ it('rejects if selectedTemplateType is empty', async () => {
const dispatch = jest.fn().mockName('dispatch');
- actions
- .fetchTemplateTypes({ dispatch, state })
- .then(done.fail)
- .catch(() => {
- expect(dispatch).not.toHaveBeenCalled();
-
- done();
- });
+ await expect(actions.fetchTemplateTypes({ dispatch, state })).rejects.toBeUndefined();
+ expect(dispatch).not.toHaveBeenCalled();
});
- it('dispatches actions', (done) => {
+ it('dispatches actions', () => {
state.selectedTemplateType = { key: 'licenses' };
- testAction(
+ return testAction(
actions.fetchTemplateTypes,
null,
state,
@@ -111,7 +102,6 @@ describe('IDE file templates actions', () => {
payload: pages[0].concat(pages[1]).concat(pages[2]),
},
],
- done,
);
});
});
@@ -121,16 +111,15 @@ describe('IDE file templates actions', () => {
mock.onGet(/api\/(.*)\/templates\/licenses/).replyOnce(500);
});
- it('dispatches actions', (done) => {
+ it('dispatches actions', () => {
state.selectedTemplateType = { key: 'licenses' };
- testAction(
+ return testAction(
actions.fetchTemplateTypes,
null,
state,
[],
[{ type: 'requestTemplateTypes' }, { type: 'receiveTemplateTypesError' }],
- done,
);
});
});
@@ -184,8 +173,8 @@ describe('IDE file templates actions', () => {
});
describe('receiveTemplateError', () => {
- it('dispatches setErrorMessage', (done) => {
- testAction(
+ it('dispatches setErrorMessage', () => {
+ return testAction(
actions.receiveTemplateError,
'test',
state,
@@ -201,7 +190,6 @@ describe('IDE file templates actions', () => {
},
},
],
- done,
);
});
});
@@ -217,46 +205,43 @@ describe('IDE file templates actions', () => {
.replyOnce(200, { content: 'testing content' });
});
- it('dispatches setFileTemplate if template already has content', (done) => {
+ it('dispatches setFileTemplate if template already has content', () => {
const template = { content: 'already has content' };
- testAction(
+ return testAction(
actions.fetchTemplate,
template,
state,
[],
[{ type: 'setFileTemplate', payload: template }],
- done,
);
});
- it('dispatches success', (done) => {
+ it('dispatches success', () => {
const template = { key: 'mit' };
state.selectedTemplateType = { key: 'licenses' };
- testAction(
+ return testAction(
actions.fetchTemplate,
template,
state,
[],
[{ type: 'setFileTemplate', payload: { content: 'MIT content' } }],
- done,
);
});
- it('dispatches success and uses name key for API call', (done) => {
+ it('dispatches success and uses name key for API call', () => {
const template = { name: 'testing' };
state.selectedTemplateType = { key: 'licenses' };
- testAction(
+ return testAction(
actions.fetchTemplate,
template,
state,
[],
[{ type: 'setFileTemplate', payload: { content: 'testing content' } }],
- done,
);
});
});
@@ -266,18 +251,17 @@ describe('IDE file templates actions', () => {
mock.onGet(/api\/(.*)\/templates\/licenses\/mit/).replyOnce(500);
});
- it('dispatches error', (done) => {
+ it('dispatches error', () => {
const template = { name: 'testing' };
state.selectedTemplateType = { key: 'licenses' };
- testAction(
+ return testAction(
actions.fetchTemplate,
template,
state,
[],
[{ type: 'receiveTemplateError', payload: template }],
- done,
);
});
});
diff --git a/spec/frontend/ide/stores/modules/merge_requests/actions_spec.js b/spec/frontend/ide/stores/modules/merge_requests/actions_spec.js
index e1f2b165dd9..344fe3a41c3 100644
--- a/spec/frontend/ide/stores/modules/merge_requests/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/merge_requests/actions_spec.js
@@ -28,21 +28,20 @@ describe('IDE merge requests actions', () => {
});
describe('requestMergeRequests', () => {
- it('should commit request', (done) => {
- testAction(
+ it('should commit request', () => {
+ return testAction(
requestMergeRequests,
null,
mockedState,
[{ type: types.REQUEST_MERGE_REQUESTS }],
[],
- done,
);
});
});
describe('receiveMergeRequestsError', () => {
- it('should commit error', (done) => {
- testAction(
+ it('should commit error', () => {
+ return testAction(
receiveMergeRequestsError,
{ type: 'created', search: '' },
mockedState,
@@ -58,20 +57,18 @@ describe('IDE merge requests actions', () => {
},
},
],
- done,
);
});
});
describe('receiveMergeRequestsSuccess', () => {
- it('should commit received data', (done) => {
- testAction(
+ it('should commit received data', () => {
+ return testAction(
receiveMergeRequestsSuccess,
mergeRequests,
mockedState,
[{ type: types.RECEIVE_MERGE_REQUESTS_SUCCESS, payload: mergeRequests }],
[],
- done,
);
});
});
@@ -118,8 +115,8 @@ describe('IDE merge requests actions', () => {
});
});
- it('dispatches success with received data', (done) => {
- testAction(
+ it('dispatches success with received data', () => {
+ return testAction(
fetchMergeRequests,
{ type: 'created' },
mockedState,
@@ -129,7 +126,6 @@ describe('IDE merge requests actions', () => {
{ type: 'resetMergeRequests' },
{ type: 'receiveMergeRequestsSuccess', payload: mergeRequests },
],
- done,
);
});
});
@@ -156,8 +152,8 @@ describe('IDE merge requests actions', () => {
);
});
- it('dispatches success with received data', (done) => {
- testAction(
+ it('dispatches success with received data', () => {
+ return testAction(
fetchMergeRequests,
{ type: null },
{ ...mockedState, ...mockedRootState },
@@ -167,7 +163,6 @@ describe('IDE merge requests actions', () => {
{ type: 'resetMergeRequests' },
{ type: 'receiveMergeRequestsSuccess', payload: mergeRequests },
],
- done,
);
});
});
@@ -177,8 +172,8 @@ describe('IDE merge requests actions', () => {
mock.onGet(/\/api\/v4\/merge_requests(.*)$/).replyOnce(500);
});
- it('dispatches error', (done) => {
- testAction(
+ it('dispatches error', () => {
+ return testAction(
fetchMergeRequests,
{ type: 'created', search: '' },
mockedState,
@@ -188,21 +183,19 @@ describe('IDE merge requests actions', () => {
{ type: 'resetMergeRequests' },
{ type: 'receiveMergeRequestsError', payload: { type: 'created', search: '' } },
],
- done,
);
});
});
});
describe('resetMergeRequests', () => {
- it('commits reset', (done) => {
- testAction(
+ it('commits reset', () => {
+ return testAction(
resetMergeRequests,
null,
mockedState,
[{ type: types.RESET_MERGE_REQUESTS }],
[],
- done,
);
});
});
diff --git a/spec/frontend/ide/stores/modules/pane/actions_spec.js b/spec/frontend/ide/stores/modules/pane/actions_spec.js
index 42fe8b400b8..98c4f22dac8 100644
--- a/spec/frontend/ide/stores/modules/pane/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/pane/actions_spec.js
@@ -7,19 +7,19 @@ describe('IDE pane module actions', () => {
const TEST_VIEW_KEEP_ALIVE = { name: 'test-keep-alive', keepAlive: true };
describe('toggleOpen', () => {
- it('dispatches open if closed', (done) => {
- testAction(actions.toggleOpen, TEST_VIEW, { isOpen: false }, [], [{ type: 'open' }], done);
+ it('dispatches open if closed', () => {
+ return testAction(actions.toggleOpen, TEST_VIEW, { isOpen: false }, [], [{ type: 'open' }]);
});
- it('dispatches close if opened', (done) => {
- testAction(actions.toggleOpen, TEST_VIEW, { isOpen: true }, [], [{ type: 'close' }], done);
+ it('dispatches close if opened', () => {
+ return testAction(actions.toggleOpen, TEST_VIEW, { isOpen: true }, [], [{ type: 'close' }]);
});
});
describe('open', () => {
describe('with a view specified', () => {
- it('commits SET_OPEN and SET_CURRENT_VIEW', (done) => {
- testAction(
+ it('commits SET_OPEN and SET_CURRENT_VIEW', () => {
+ return testAction(
actions.open,
TEST_VIEW,
{},
@@ -28,12 +28,11 @@ describe('IDE pane module actions', () => {
{ type: types.SET_CURRENT_VIEW, payload: TEST_VIEW.name },
],
[],
- done,
);
});
- it('commits KEEP_ALIVE_VIEW if keepAlive is true', (done) => {
- testAction(
+ it('commits KEEP_ALIVE_VIEW if keepAlive is true', () => {
+ return testAction(
actions.open,
TEST_VIEW_KEEP_ALIVE,
{},
@@ -43,28 +42,26 @@ describe('IDE pane module actions', () => {
{ type: types.KEEP_ALIVE_VIEW, payload: TEST_VIEW_KEEP_ALIVE.name },
],
[],
- done,
);
});
});
describe('without a view specified', () => {
- it('commits SET_OPEN', (done) => {
- testAction(
+ it('commits SET_OPEN', () => {
+ return testAction(
actions.open,
undefined,
{},
[{ type: types.SET_OPEN, payload: true }],
[],
- done,
);
});
});
});
describe('close', () => {
- it('commits SET_OPEN', (done) => {
- testAction(actions.close, null, {}, [{ type: types.SET_OPEN, payload: false }], [], done);
+ it('commits SET_OPEN', () => {
+ return testAction(actions.close, null, {}, [{ type: types.SET_OPEN, payload: false }], []);
});
});
});
diff --git a/spec/frontend/ide/stores/modules/pipelines/actions_spec.js b/spec/frontend/ide/stores/modules/pipelines/actions_spec.js
index 3ede37e2eed..b76b673c3a2 100644
--- a/spec/frontend/ide/stores/modules/pipelines/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/pipelines/actions_spec.js
@@ -25,6 +25,7 @@ import {
import * as types from '~/ide/stores/modules/pipelines/mutation_types';
import state from '~/ide/stores/modules/pipelines/state';
import axios from '~/lib/utils/axios_utils';
+import waitForPromises from 'helpers/wait_for_promises';
import { pipelines, jobs } from '../../../mock_data';
describe('IDE pipelines actions', () => {
@@ -44,32 +45,30 @@ describe('IDE pipelines actions', () => {
});
describe('requestLatestPipeline', () => {
- it('commits request', (done) => {
- testAction(
+ it('commits request', () => {
+ return testAction(
requestLatestPipeline,
null,
mockedState,
[{ type: types.REQUEST_LATEST_PIPELINE }],
[],
- done,
);
});
});
describe('receiveLatestPipelineError', () => {
- it('commits error', (done) => {
- testAction(
+ it('commits error', () => {
+ return testAction(
receiveLatestPipelineError,
{ status: 404 },
mockedState,
[{ type: types.RECEIVE_LASTEST_PIPELINE_ERROR }],
[{ type: 'stopPipelinePolling' }],
- done,
);
});
- it('dispatches setErrorMessage is not 404', (done) => {
- testAction(
+ it('dispatches setErrorMessage is not 404', () => {
+ return testAction(
receiveLatestPipelineError,
{ status: 500 },
mockedState,
@@ -86,7 +85,6 @@ describe('IDE pipelines actions', () => {
},
{ type: 'stopPipelinePolling' },
],
- done,
);
});
});
@@ -123,7 +121,7 @@ describe('IDE pipelines actions', () => {
.reply(200, { data: { foo: 'bar' } }, { 'poll-interval': '10000' });
});
- it('dispatches request', (done) => {
+ it('dispatches request', async () => {
jest.spyOn(axios, 'get');
jest.spyOn(Visibility, 'hidden').mockReturnValue(false);
@@ -133,34 +131,21 @@ describe('IDE pipelines actions', () => {
currentProject: { path_with_namespace: 'abc/def' },
};
- fetchLatestPipeline({ dispatch, rootGetters });
+ await fetchLatestPipeline({ dispatch, rootGetters });
expect(dispatch).toHaveBeenCalledWith('requestLatestPipeline');
- jest.advanceTimersByTime(1000);
-
- new Promise((resolve) => requestAnimationFrame(resolve))
- .then(() => {
- expect(axios.get).toHaveBeenCalled();
- expect(axios.get).toHaveBeenCalledTimes(1);
- expect(dispatch).toHaveBeenCalledWith(
- 'receiveLatestPipelineSuccess',
- expect.anything(),
- );
-
- jest.advanceTimersByTime(10000);
- })
- .then(() => new Promise((resolve) => requestAnimationFrame(resolve)))
- .then(() => {
- expect(axios.get).toHaveBeenCalled();
- expect(axios.get).toHaveBeenCalledTimes(2);
- expect(dispatch).toHaveBeenCalledWith(
- 'receiveLatestPipelineSuccess',
- expect.anything(),
- );
- })
- .then(done)
- .catch(done.fail);
+ await waitForPromises();
+
+ expect(axios.get).toHaveBeenCalled();
+ expect(axios.get).toHaveBeenCalledTimes(1);
+ expect(dispatch).toHaveBeenCalledWith('receiveLatestPipelineSuccess', expect.anything());
+
+ jest.advanceTimersByTime(10000);
+
+ expect(axios.get).toHaveBeenCalled();
+ expect(axios.get).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenCalledWith('receiveLatestPipelineSuccess', expect.anything());
});
});
@@ -169,27 +154,22 @@ describe('IDE pipelines actions', () => {
mock.onGet('/abc/def/commit/abc123def456ghi789jkl/pipelines').reply(500);
});
- it('dispatches error', (done) => {
+ it('dispatches error', async () => {
const dispatch = jest.fn().mockName('dispatch');
const rootGetters = {
lastCommit: { id: 'abc123def456ghi789jkl' },
currentProject: { path_with_namespace: 'abc/def' },
};
- fetchLatestPipeline({ dispatch, rootGetters });
+ await fetchLatestPipeline({ dispatch, rootGetters });
- jest.advanceTimersByTime(1500);
+ await waitForPromises();
- new Promise((resolve) => requestAnimationFrame(resolve))
- .then(() => {
- expect(dispatch).toHaveBeenCalledWith('receiveLatestPipelineError', expect.anything());
- })
- .then(done)
- .catch(done.fail);
+ expect(dispatch).toHaveBeenCalledWith('receiveLatestPipelineError', expect.anything());
});
});
- it('sets latest pipeline to `null` and stops polling on empty project', (done) => {
+ it('sets latest pipeline to `null` and stops polling on empty project', () => {
mockedState = {
...mockedState,
rootGetters: {
@@ -197,26 +177,31 @@ describe('IDE pipelines actions', () => {
},
};
- testAction(
+ return testAction(
fetchLatestPipeline,
{},
mockedState,
[{ type: types.RECEIVE_LASTEST_PIPELINE_SUCCESS, payload: null }],
[{ type: 'stopPipelinePolling' }],
- done,
);
});
});
describe('requestJobs', () => {
- it('commits request', (done) => {
- testAction(requestJobs, 1, mockedState, [{ type: types.REQUEST_JOBS, payload: 1 }], [], done);
+ it('commits request', () => {
+ return testAction(
+ requestJobs,
+ 1,
+ mockedState,
+ [{ type: types.REQUEST_JOBS, payload: 1 }],
+ [],
+ );
});
});
describe('receiveJobsError', () => {
- it('commits error', (done) => {
- testAction(
+ it('commits error', () => {
+ return testAction(
receiveJobsError,
{ id: 1 },
mockedState,
@@ -232,20 +217,18 @@ describe('IDE pipelines actions', () => {
},
},
],
- done,
);
});
});
describe('receiveJobsSuccess', () => {
- it('commits data', (done) => {
- testAction(
+ it('commits data', () => {
+ return testAction(
receiveJobsSuccess,
{ id: 1, data: jobs },
mockedState,
[{ type: types.RECEIVE_JOBS_SUCCESS, payload: { id: 1, data: jobs } }],
[],
- done,
);
});
});
@@ -258,8 +241,8 @@ describe('IDE pipelines actions', () => {
mock.onGet(stage.dropdownPath).replyOnce(200, jobs);
});
- it('dispatches request', (done) => {
- testAction(
+ it('dispatches request', () => {
+ return testAction(
fetchJobs,
stage,
mockedState,
@@ -268,7 +251,6 @@ describe('IDE pipelines actions', () => {
{ type: 'requestJobs', payload: stage.id },
{ type: 'receiveJobsSuccess', payload: { id: stage.id, data: jobs } },
],
- done,
);
});
});
@@ -278,8 +260,8 @@ describe('IDE pipelines actions', () => {
mock.onGet(stage.dropdownPath).replyOnce(500);
});
- it('dispatches error', (done) => {
- testAction(
+ it('dispatches error', () => {
+ return testAction(
fetchJobs,
stage,
mockedState,
@@ -288,69 +270,64 @@ describe('IDE pipelines actions', () => {
{ type: 'requestJobs', payload: stage.id },
{ type: 'receiveJobsError', payload: stage },
],
- done,
);
});
});
});
describe('toggleStageCollapsed', () => {
- it('commits collapse', (done) => {
- testAction(
+ it('commits collapse', () => {
+ return testAction(
toggleStageCollapsed,
1,
mockedState,
[{ type: types.TOGGLE_STAGE_COLLAPSE, payload: 1 }],
[],
- done,
);
});
});
describe('setDetailJob', () => {
- it('commits job', (done) => {
- testAction(
+ it('commits job', () => {
+ return testAction(
setDetailJob,
'job',
mockedState,
[{ type: types.SET_DETAIL_JOB, payload: 'job' }],
[{ type: 'rightPane/open', payload: rightSidebarViews.jobsDetail }],
- done,
);
});
- it('dispatches rightPane/open as pipeline when job is null', (done) => {
- testAction(
+ it('dispatches rightPane/open as pipeline when job is null', () => {
+ return testAction(
setDetailJob,
null,
mockedState,
[{ type: types.SET_DETAIL_JOB, payload: null }],
[{ type: 'rightPane/open', payload: rightSidebarViews.pipelines }],
- done,
);
});
- it('dispatches rightPane/open as job', (done) => {
- testAction(
+ it('dispatches rightPane/open as job', () => {
+ return testAction(
setDetailJob,
'job',
mockedState,
[{ type: types.SET_DETAIL_JOB, payload: 'job' }],
[{ type: 'rightPane/open', payload: rightSidebarViews.jobsDetail }],
- done,
);
});
});
describe('requestJobLogs', () => {
- it('commits request', (done) => {
- testAction(requestJobLogs, null, mockedState, [{ type: types.REQUEST_JOB_LOGS }], [], done);
+ it('commits request', () => {
+ return testAction(requestJobLogs, null, mockedState, [{ type: types.REQUEST_JOB_LOGS }], []);
});
});
describe('receiveJobLogsError', () => {
- it('commits error', (done) => {
- testAction(
+ it('commits error', () => {
+ return testAction(
receiveJobLogsError,
null,
mockedState,
@@ -366,20 +343,18 @@ describe('IDE pipelines actions', () => {
},
},
],
- done,
);
});
});
describe('receiveJobLogsSuccess', () => {
- it('commits data', (done) => {
- testAction(
+ it('commits data', () => {
+ return testAction(
receiveJobLogsSuccess,
'data',
mockedState,
[{ type: types.RECEIVE_JOB_LOGS_SUCCESS, payload: 'data' }],
[],
- done,
);
});
});
@@ -395,8 +370,8 @@ describe('IDE pipelines actions', () => {
mock.onGet(`${TEST_HOST}/project/builds/trace`).replyOnce(200, { html: 'html' });
});
- it('dispatches request', (done) => {
- testAction(
+ it('dispatches request', () => {
+ return testAction(
fetchJobLogs,
null,
mockedState,
@@ -405,7 +380,6 @@ describe('IDE pipelines actions', () => {
{ type: 'requestJobLogs' },
{ type: 'receiveJobLogsSuccess', payload: { html: 'html' } },
],
- done,
);
});
@@ -426,22 +400,21 @@ describe('IDE pipelines actions', () => {
mock.onGet(`${TEST_HOST}/project/builds/trace`).replyOnce(500);
});
- it('dispatches error', (done) => {
- testAction(
+ it('dispatches error', () => {
+ return testAction(
fetchJobLogs,
null,
mockedState,
[],
[{ type: 'requestJobLogs' }, { type: 'receiveJobLogsError' }],
- done,
);
});
});
});
describe('resetLatestPipeline', () => {
- it('commits reset mutations', (done) => {
- testAction(
+ it('commits reset mutations', () => {
+ return testAction(
resetLatestPipeline,
null,
mockedState,
@@ -450,7 +423,6 @@ describe('IDE pipelines actions', () => {
{ type: types.SET_DETAIL_JOB, payload: null },
],
[],
- done,
);
});
});
diff --git a/spec/frontend/ide/stores/modules/terminal_sync/actions_spec.js b/spec/frontend/ide/stores/modules/terminal_sync/actions_spec.js
index 22b0615c6d0..448fd909f39 100644
--- a/spec/frontend/ide/stores/modules/terminal_sync/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/terminal_sync/actions_spec.js
@@ -22,43 +22,37 @@ describe('ide/stores/modules/terminal_sync/actions', () => {
});
describe('upload', () => {
- it('uploads to mirror and sets success', (done) => {
+ it('uploads to mirror and sets success', async () => {
mirror.upload.mockReturnValue(Promise.resolve());
- testAction(
+ await testAction(
actions.upload,
null,
rootState,
[{ type: types.START_LOADING }, { type: types.SET_SUCCESS }],
[],
- () => {
- expect(mirror.upload).toHaveBeenCalledWith(rootState);
- done();
- },
);
+ expect(mirror.upload).toHaveBeenCalledWith(rootState);
});
- it('sets error when failed', (done) => {
+ it('sets error when failed', () => {
const err = { message: 'it failed!' };
mirror.upload.mockReturnValue(Promise.reject(err));
- testAction(
+ return testAction(
actions.upload,
null,
rootState,
[{ type: types.START_LOADING }, { type: types.SET_ERROR, payload: err }],
[],
- done,
);
});
});
describe('stop', () => {
- it('disconnects from mirror', (done) => {
- testAction(actions.stop, null, rootState, [{ type: types.STOP }], [], () => {
- expect(mirror.disconnect).toHaveBeenCalled();
- done();
- });
+ it('disconnects from mirror', async () => {
+ await testAction(actions.stop, null, rootState, [{ type: types.STOP }], []);
+ expect(mirror.disconnect).toHaveBeenCalled();
});
});
@@ -83,20 +77,17 @@ describe('ide/stores/modules/terminal_sync/actions', () => {
};
});
- it('connects to mirror and sets success', (done) => {
+ it('connects to mirror and sets success', async () => {
mirror.connect.mockReturnValue(Promise.resolve());
- testAction(
+ await testAction(
actions.start,
null,
rootState,
[{ type: types.START_LOADING }, { type: types.SET_SUCCESS }],
[],
- () => {
- expect(mirror.connect).toHaveBeenCalledWith(TEST_SESSION.proxyWebsocketPath);
- done();
- },
);
+ expect(mirror.connect).toHaveBeenCalledWith(TEST_SESSION.proxyWebsocketPath);
});
it('sets error if connection fails', () => {
diff --git a/spec/frontend/ide/stores/plugins/terminal_spec.js b/spec/frontend/ide/stores/plugins/terminal_spec.js
index 912de88cb39..193300540fd 100644
--- a/spec/frontend/ide/stores/plugins/terminal_spec.js
+++ b/spec/frontend/ide/stores/plugins/terminal_spec.js
@@ -6,10 +6,10 @@ import { SET_BRANCH_WORKING_REFERENCE } from '~/ide/stores/mutation_types';
import createTerminalPlugin from '~/ide/stores/plugins/terminal';
const TEST_DATASET = {
- eeWebTerminalSvgPath: `${TEST_HOST}/web/terminal/svg`,
- eeWebTerminalHelpPath: `${TEST_HOST}/web/terminal/help`,
- eeWebTerminalConfigHelpPath: `${TEST_HOST}/web/terminal/config/help`,
- eeWebTerminalRunnersHelpPath: `${TEST_HOST}/web/terminal/runners/help`,
+ webTerminalSvgPath: `${TEST_HOST}/web/terminal/svg`,
+ webTerminalHelpPath: `${TEST_HOST}/web/terminal/help`,
+ webTerminalConfigHelpPath: `${TEST_HOST}/web/terminal/config/help`,
+ webTerminalRunnersHelpPath: `${TEST_HOST}/web/terminal/runners/help`,
};
Vue.use(Vuex);
@@ -40,10 +40,10 @@ describe('ide/stores/extend', () => {
it('dispatches terminal/setPaths', () => {
expect(store.dispatch).toHaveBeenCalledWith('terminal/setPaths', {
- webTerminalSvgPath: TEST_DATASET.eeWebTerminalSvgPath,
- webTerminalHelpPath: TEST_DATASET.eeWebTerminalHelpPath,
- webTerminalConfigHelpPath: TEST_DATASET.eeWebTerminalConfigHelpPath,
- webTerminalRunnersHelpPath: TEST_DATASET.eeWebTerminalRunnersHelpPath,
+ webTerminalSvgPath: TEST_DATASET.webTerminalSvgPath,
+ webTerminalHelpPath: TEST_DATASET.webTerminalHelpPath,
+ webTerminalConfigHelpPath: TEST_DATASET.webTerminalConfigHelpPath,
+ webTerminalRunnersHelpPath: TEST_DATASET.webTerminalRunnersHelpPath,
});
});
diff --git a/spec/frontend/image_diff/init_discussion_tab_spec.js b/spec/frontend/image_diff/init_discussion_tab_spec.js
index 5bc0c738944..f6f05037c95 100644
--- a/spec/frontend/image_diff/init_discussion_tab_spec.js
+++ b/spec/frontend/image_diff/init_discussion_tab_spec.js
@@ -11,23 +11,21 @@ describe('initDiscussionTab', () => {
`);
});
- it('should pass canCreateNote as false to initImageDiff', (done) => {
+ it('should pass canCreateNote as false to initImageDiff', () => {
jest
.spyOn(initImageDiffHelper, 'initImageDiff')
.mockImplementation((diffFileEl, canCreateNote) => {
expect(canCreateNote).toEqual(false);
- done();
});
initDiscussionTab();
});
- it('should pass renderCommentBadge as true to initImageDiff', (done) => {
+ it('should pass renderCommentBadge as true to initImageDiff', () => {
jest
.spyOn(initImageDiffHelper, 'initImageDiff')
.mockImplementation((diffFileEl, canCreateNote, renderCommentBadge) => {
expect(renderCommentBadge).toEqual(true);
- done();
});
initDiscussionTab();
diff --git a/spec/frontend/image_diff/replaced_image_diff_spec.js b/spec/frontend/image_diff/replaced_image_diff_spec.js
index cc4a2530fc4..2b401fc46bf 100644
--- a/spec/frontend/image_diff/replaced_image_diff_spec.js
+++ b/spec/frontend/image_diff/replaced_image_diff_spec.js
@@ -176,34 +176,36 @@ describe('ReplacedImageDiff', () => {
expect(ImageDiff.prototype.bindEvents).toHaveBeenCalled();
});
- it('should register click eventlistener to 2-up view mode', (done) => {
- jest.spyOn(ReplacedImageDiff.prototype, 'changeView').mockImplementation((viewMode) => {
- expect(viewMode).toEqual(viewTypes.TWO_UP);
- done();
- });
+ it('should register click eventlistener to 2-up view mode', () => {
+ const changeViewSpy = jest
+ .spyOn(ReplacedImageDiff.prototype, 'changeView')
+ .mockImplementation(() => {});
replacedImageDiff.bindEvents();
replacedImageDiff.viewModesEls[viewTypes.TWO_UP].click();
+
+ expect(changeViewSpy).toHaveBeenCalledWith(viewTypes.TWO_UP, expect.any(Object));
});
- it('should register click eventlistener to swipe view mode', (done) => {
- jest.spyOn(ReplacedImageDiff.prototype, 'changeView').mockImplementation((viewMode) => {
- expect(viewMode).toEqual(viewTypes.SWIPE);
- done();
- });
+ it('should register click eventlistener to swipe view mode', () => {
+ const changeViewSpy = jest
+ .spyOn(ReplacedImageDiff.prototype, 'changeView')
+ .mockImplementation(() => {});
replacedImageDiff.bindEvents();
replacedImageDiff.viewModesEls[viewTypes.SWIPE].click();
+
+ expect(changeViewSpy).toHaveBeenCalledWith(viewTypes.SWIPE, expect.any(Object));
});
- it('should register click eventlistener to onion skin view mode', (done) => {
- jest.spyOn(ReplacedImageDiff.prototype, 'changeView').mockImplementation((viewMode) => {
- expect(viewMode).toEqual(viewTypes.SWIPE);
- done();
- });
+ it('should register click eventlistener to onion skin view mode', () => {
+ const changeViewSpy = jest
+ .spyOn(ReplacedImageDiff.prototype, 'changeView')
+ .mockImplementation(() => {});
replacedImageDiff.bindEvents();
replacedImageDiff.viewModesEls[viewTypes.SWIPE].click();
+ expect(changeViewSpy).toHaveBeenCalledWith(viewTypes.SWIPE, expect.any(Object));
});
});
@@ -325,32 +327,34 @@ describe('ReplacedImageDiff', () => {
setupImageFrameEls();
});
- it('should pass showCommentIndicator normalized indicator values', (done) => {
+ it('should pass showCommentIndicator normalized indicator values', () => {
jest.spyOn(imageDiffHelper, 'showCommentIndicator').mockImplementation(() => {});
- jest
+ const resizeCoordinatesToImageElementSpy = jest
.spyOn(imageDiffHelper, 'resizeCoordinatesToImageElement')
- .mockImplementation((imageEl, meta) => {
- expect(meta.x).toEqual(indicator.x);
- expect(meta.y).toEqual(indicator.y);
- expect(meta.width).toEqual(indicator.image.width);
- expect(meta.height).toEqual(indicator.image.height);
- done();
- });
+ .mockImplementation(() => {});
+
replacedImageDiff.renderNewView(indicator);
+
+ expect(resizeCoordinatesToImageElementSpy).toHaveBeenCalledWith(undefined, {
+ x: indicator.x,
+ y: indicator.y,
+ width: indicator.image.width,
+ height: indicator.image.height,
+ });
});
- it('should call showCommentIndicator', (done) => {
+ it('should call showCommentIndicator', () => {
const normalized = {
normalized: true,
};
jest.spyOn(imageDiffHelper, 'resizeCoordinatesToImageElement').mockReturnValue(normalized);
- jest
+ const showCommentIndicatorSpy = jest
.spyOn(imageDiffHelper, 'showCommentIndicator')
- .mockImplementation((imageFrameEl, normalizedIndicator) => {
- expect(normalizedIndicator).toEqual(normalized);
- done();
- });
+ .mockImplementation(() => {});
+
replacedImageDiff.renderNewView(indicator);
+
+ expect(showCommentIndicatorSpy).toHaveBeenCalledWith(undefined, normalized);
});
});
});
diff --git a/spec/frontend/import_entities/components/import_status_spec.js b/spec/frontend/import_entities/components/import_status_spec.js
new file mode 100644
index 00000000000..686a21e3923
--- /dev/null
+++ b/spec/frontend/import_entities/components/import_status_spec.js
@@ -0,0 +1,145 @@
+import { GlAccordionItem, GlBadge, GlIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import ImportStatus from '~/import_entities/components/import_status.vue';
+import { STATUSES } from '~/import_entities/constants';
+
+describe('Import entities status component', () => {
+ let wrapper;
+
+ const createComponent = (propsData) => {
+ wrapper = shallowMount(ImportStatus, {
+ propsData,
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('success status', () => {
+ const getStatusText = () => wrapper.findComponent(GlBadge).text();
+
+ it('displays finished status as complete when no stats are provided', () => {
+ createComponent({
+ status: STATUSES.FINISHED,
+ });
+ expect(getStatusText()).toBe('Complete');
+ });
+
+ it('displays finished status as complete when all stats items were processed', () => {
+ const statItems = { label: 100, note: 200 };
+
+ createComponent({
+ status: STATUSES.FINISHED,
+ stats: {
+ fetched: { ...statItems },
+ imported: { ...statItems },
+ },
+ });
+
+ expect(getStatusText()).toBe('Complete');
+ });
+
+ it('displays finished status as partial when all stats items were processed', () => {
+ const statItems = { label: 100, note: 200 };
+
+ createComponent({
+ status: STATUSES.FINISHED,
+ stats: {
+ fetched: { ...statItems },
+ imported: { ...statItems, label: 50 },
+ },
+ });
+
+ expect(getStatusText()).toBe('Partial import');
+ });
+ });
+
+ describe('details drawer', () => {
+ const findDetailsDrawer = () => wrapper.findComponent(GlAccordionItem);
+
+ it('renders details drawer to be present when stats are provided', () => {
+ createComponent({
+ status: 'created',
+ stats: { fetched: { label: 1 }, imported: { label: 0 } },
+ });
+
+ expect(findDetailsDrawer().exists()).toBe(true);
+ });
+
+ it('does not render details drawer when no stats are provided', () => {
+ createComponent({
+ status: 'created',
+ });
+
+ expect(findDetailsDrawer().exists()).toBe(false);
+ });
+
+ it('does not render details drawer when stats are empty', () => {
+ createComponent({
+ status: 'created',
+ stats: { fetched: {}, imported: {} },
+ });
+
+ expect(findDetailsDrawer().exists()).toBe(false);
+ });
+
+ it('does not render details drawer when no known stats are provided', () => {
+ createComponent({
+ status: 'created',
+ stats: {
+ fetched: {
+ UNKNOWN_STAT: 100,
+ },
+ imported: {
+ UNKNOWN_STAT: 0,
+ },
+ },
+ });
+
+ expect(findDetailsDrawer().exists()).toBe(false);
+ });
+ });
+
+ describe('stats display', () => {
+ const getStatusIcon = () =>
+ wrapper.findComponent(GlAccordionItem).findComponent(GlIcon).props().name;
+
+ const createComponentWithStats = ({ fetched, imported }) => {
+ createComponent({
+ status: 'created',
+ stats: {
+ fetched: { label: fetched },
+ imported: { label: imported },
+ },
+ });
+ };
+
+ it('displays scheduled status when imported is 0', () => {
+ createComponentWithStats({
+ fetched: 100,
+ imported: 0,
+ });
+
+ expect(getStatusIcon()).toBe('status-scheduled');
+ });
+
+ it('displays running status when imported is not equal to fetched', () => {
+ createComponentWithStats({
+ fetched: 100,
+ imported: 10,
+ });
+
+ expect(getStatusIcon()).toBe('status-running');
+ });
+
+ it('displays success status when imported is equal to fetched', () => {
+ createComponentWithStats({
+ fetched: 100,
+ imported: 100,
+ });
+
+ expect(getStatusIcon()).toBe('status-success');
+ });
+ });
+});
diff --git a/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js b/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
index 16adf88700f..88fcedd31b2 100644
--- a/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
+++ b/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
@@ -31,7 +31,7 @@ describe('ImportProjectsTable', () => {
const findImportAllButton = () =>
wrapper
.findAll(GlButton)
- .filter((w) => w.props().variant === 'success')
+ .filter((w) => w.props().variant === 'confirm')
.at(0);
const findImportAllModal = () => wrapper.find({ ref: 'importAllModal' });
diff --git a/spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js b/spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js
index c8afa9ea57d..41a005199e1 100644
--- a/spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js
+++ b/spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js
@@ -98,6 +98,8 @@ describe('ProviderRepoTableRow', () => {
});
describe('when rendering imported project', () => {
+ const FAKE_STATS = {};
+
const repo = {
importSource: {
id: 'remote-1',
@@ -109,6 +111,7 @@ describe('ProviderRepoTableRow', () => {
fullPath: 'fullPath',
importSource: 'importSource',
importStatus: STATUSES.FINISHED,
+ stats: FAKE_STATS,
},
};
@@ -134,6 +137,10 @@ describe('ProviderRepoTableRow', () => {
it('does not render import button', () => {
expect(findImportButton().exists()).toBe(false);
});
+
+ it('passes stats to import status component', () => {
+ expect(wrapper.find(ImportStatus).props().stats).toBe(FAKE_STATS);
+ });
});
describe('when rendering incompatible project', () => {
diff --git a/spec/frontend/import_entities/import_projects/store/mutations_spec.js b/spec/frontend/import_entities/import_projects/store/mutations_spec.js
index e062d889325..77fae951300 100644
--- a/spec/frontend/import_entities/import_projects/store/mutations_spec.js
+++ b/spec/frontend/import_entities/import_projects/store/mutations_spec.js
@@ -232,6 +232,35 @@ describe('import_projects store mutations', () => {
updatedProjects[0].importStatus,
);
});
+
+ it('updates import stats of project', () => {
+ const repoId = 1;
+ state = {
+ repositories: [
+ { importedProject: { id: repoId, stats: {} }, importStatus: STATUSES.STARTED },
+ ],
+ };
+ const newStats = {
+ fetched: {
+ label: 10,
+ },
+ imported: {
+ label: 1,
+ },
+ };
+
+ const updatedProjects = [
+ {
+ id: repoId,
+ importStatus: STATUSES.FINISHED,
+ stats: newStats,
+ },
+ ];
+
+ mutations[types.RECEIVE_JOBS_SUCCESS](state, updatedProjects);
+
+ expect(state.repositories[0].importedProject.stats).toStrictEqual(newStats);
+ });
});
describe(`${types.REQUEST_NAMESPACES}`, () => {
diff --git a/spec/frontend/incidents/components/incidents_list_spec.js b/spec/frontend/incidents/components/incidents_list_spec.js
index 9ed0294e876..a556f3c17f3 100644
--- a/spec/frontend/incidents/components/incidents_list_spec.js
+++ b/spec/frontend/incidents/components/incidents_list_spec.js
@@ -7,6 +7,7 @@ import {
I18N,
TH_CREATED_AT_TEST_ID,
TH_SEVERITY_TEST_ID,
+ TH_ESCALATION_STATUS_TEST_ID,
TH_PUBLISHED_TEST_ID,
TH_INCIDENT_SLA_TEST_ID,
trackIncidentCreateNewOptions,
@@ -170,6 +171,7 @@ describe('Incidents List', () => {
expect(link.text()).toBe(title);
expect(link.attributes('href')).toContain(`issues/incident/${iid}`);
+ expect(link.find('.gl-text-truncate').exists()).toBe(true);
});
describe('Assignees', () => {
@@ -200,15 +202,14 @@ describe('Incidents List', () => {
describe('Escalation status', () => {
it('renders escalation status per row', () => {
- expect(findEscalationStatus().length).toBe(mockIncidents.length);
-
- const actualStatuses = findEscalationStatus().wrappers.map((status) => status.text());
- expect(actualStatuses).toEqual([
- 'Triggered',
- 'Acknowledged',
- 'Resolved',
- I18N.noEscalationStatus,
- ]);
+ const statuses = findEscalationStatus().wrappers;
+ const expectedStatuses = ['Triggered', 'Acknowledged', 'Resolved', I18N.noEscalationStatus];
+
+ expect(statuses.length).toBe(mockIncidents.length);
+ statuses.forEach((status, index) => {
+ expect(status.text()).toEqual(expectedStatuses[index]);
+ expect(status.classes('gl-text-truncate')).toBe(true);
+ });
});
describe('when feature is disabled', () => {
@@ -294,11 +295,12 @@ describe('Incidents List', () => {
const noneSort = 'none';
it.each`
- description | selector | initialSort | firstSort | nextSort
- ${'creation date'} | ${TH_CREATED_AT_TEST_ID} | ${descSort} | ${ascSort} | ${descSort}
- ${'severity'} | ${TH_SEVERITY_TEST_ID} | ${noneSort} | ${descSort} | ${ascSort}
- ${'publish date'} | ${TH_PUBLISHED_TEST_ID} | ${noneSort} | ${descSort} | ${ascSort}
- ${'due date'} | ${TH_INCIDENT_SLA_TEST_ID} | ${noneSort} | ${ascSort} | ${descSort}
+ description | selector | initialSort | firstSort | nextSort
+ ${'creation date'} | ${TH_CREATED_AT_TEST_ID} | ${descSort} | ${ascSort} | ${descSort}
+ ${'severity'} | ${TH_SEVERITY_TEST_ID} | ${noneSort} | ${descSort} | ${ascSort}
+ ${'status'} | ${TH_ESCALATION_STATUS_TEST_ID} | ${noneSort} | ${descSort} | ${ascSort}
+ ${'publish date'} | ${TH_PUBLISHED_TEST_ID} | ${noneSort} | ${descSort} | ${ascSort}
+ ${'due date'} | ${TH_INCIDENT_SLA_TEST_ID} | ${noneSort} | ${ascSort} | ${descSort}
`(
'updates sort with new direction when sorting by $description',
async ({ selector, initialSort, firstSort, nextSort }) => {
diff --git a/spec/frontend/integrations/edit/components/integration_form_spec.js b/spec/frontend/integrations/edit/components/integration_form_spec.js
index c4569070d09..ca481e009cf 100644
--- a/spec/frontend/integrations/edit/components/integration_form_spec.js
+++ b/spec/frontend/integrations/edit/components/integration_form_spec.js
@@ -9,8 +9,6 @@ import ActiveCheckbox from '~/integrations/edit/components/active_checkbox.vue';
import ConfirmationModal from '~/integrations/edit/components/confirmation_modal.vue';
import DynamicField from '~/integrations/edit/components/dynamic_field.vue';
import IntegrationForm from '~/integrations/edit/components/integration_form.vue';
-import JiraIssuesFields from '~/integrations/edit/components/jira_issues_fields.vue';
-import JiraTriggerFields from '~/integrations/edit/components/jira_trigger_fields.vue';
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';
@@ -55,7 +53,6 @@ describe('IntegrationForm', () => {
OverrideDropdown,
ActiveCheckbox,
ConfirmationModal,
- JiraTriggerFields,
TriggerFields,
},
mocks: {
@@ -74,8 +71,6 @@ describe('IntegrationForm', () => {
const findProjectSaveButton = () => wrapper.findByTestId('save-button');
const findInstanceOrGroupSaveButton = () => wrapper.findByTestId('save-button-instance-group');
const findTestButton = () => wrapper.findByTestId('test-button');
- const findJiraTriggerFields = () => wrapper.findComponent(JiraTriggerFields);
- const findJiraIssuesFields = () => wrapper.findComponent(JiraIssuesFields);
const findTriggerFields = () => wrapper.findComponent(TriggerFields);
const findGlForm = () => wrapper.findComponent(GlForm);
const findRedirectToField = () => wrapper.findByTestId('redirect-to-field');
@@ -198,49 +193,6 @@ describe('IntegrationForm', () => {
});
});
- describe('type is "slack"', () => {
- beforeEach(() => {
- createComponent({
- customStateProps: { type: 'slack' },
- });
- });
-
- it('does not render JiraTriggerFields', () => {
- expect(findJiraTriggerFields().exists()).toBe(false);
- });
-
- it('does not render JiraIssuesFields', () => {
- expect(findJiraIssuesFields().exists()).toBe(false);
- });
- });
-
- describe('type is "jira"', () => {
- beforeEach(() => {
- jest.spyOn(document, 'querySelector').mockReturnValue(document.createElement('form'));
-
- createComponent({
- customStateProps: { type: 'jira', testPath: '/test' },
- mountFn: mountExtended,
- });
- });
-
- it('renders JiraTriggerFields', () => {
- expect(findJiraTriggerFields().exists()).toBe(true);
- });
-
- it('renders JiraIssuesFields', () => {
- expect(findJiraIssuesFields().exists()).toBe(true);
- });
-
- describe('when JiraIssueFields emits `request-jira-issue-types` event', () => {
- it('dispatches `requestJiraIssueTypes` action', () => {
- findJiraIssuesFields().vm.$emit('request-jira-issue-types');
-
- expect(dispatch).toHaveBeenCalledWith('requestJiraIssueTypes', expect.any(FormData));
- });
- });
- });
-
describe('triggerEvents is present', () => {
it('renders TriggerFields', () => {
const events = [{ title: 'push' }];
@@ -272,9 +224,6 @@ describe('IntegrationForm', () => {
];
createComponent({
- provide: {
- glFeatures: { integrationFormSections: true },
- },
customStateProps: {
sections: [mockSectionConnection],
fields: [...sectionFields, ...nonSectionFields],
@@ -363,9 +312,6 @@ describe('IntegrationForm', () => {
describe('when integration has sections', () => {
beforeEach(() => {
createComponent({
- provide: {
- glFeatures: { integrationFormSections: true },
- },
customStateProps: {
sections: [mockSectionConnection],
},
@@ -396,9 +342,6 @@ describe('IntegrationForm', () => {
];
createComponent({
- provide: {
- glFeatures: { integrationFormSections: true },
- },
customStateProps: {
sections: [mockSectionConnection],
fields: [...sectionFields, ...nonSectionFields],
@@ -417,9 +360,6 @@ describe('IntegrationForm', () => {
({ formActive, novalidate }) => {
beforeEach(() => {
createComponent({
- provide: {
- glFeatures: { integrationFormSections: true },
- },
customStateProps: {
sections: [mockSectionConnection],
showActive: true,
@@ -441,9 +381,6 @@ describe('IntegrationForm', () => {
jest.spyOn(document, 'querySelector').mockReturnValue(document.createElement('form'));
createComponent({
- provide: {
- glFeatures: { integrationFormSections: true },
- },
customStateProps: {
sections: [mockSectionConnection],
testPath: '/test',
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 33fd08a5959..94e370a485f 100644
--- a/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
+++ b/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
@@ -10,7 +10,6 @@ describe('JiraIssuesFields', () => {
let wrapper;
const defaultProps = {
- editProjectPath: '/edit',
showJiraIssuesIntegration: true,
showJiraVulnerabilitiesIntegration: true,
upgradePlanPath: 'https://gitlab.com',
@@ -46,7 +45,6 @@ describe('JiraIssuesFields', () => {
const findPremiumUpgradeCTA = () => wrapper.findByTestId('premium-upgrade-cta');
const findUltimateUpgradeCTA = () => wrapper.findByTestId('ultimate-upgrade-cta');
const findJiraForVulnerabilities = () => wrapper.findByTestId('jira-for-vulnerabilities');
- const findConflictWarning = () => wrapper.findByTestId('conflict-warning-text');
const setEnableCheckbox = async (isEnabled = true) =>
findEnableCheckbox().vm.$emit('input', isEnabled);
@@ -75,10 +73,9 @@ describe('JiraIssuesFields', () => {
});
if (showJiraIssuesIntegration) {
- it('renders checkbox and input field', () => {
+ it('renders enable checkbox', () => {
expect(findEnableCheckbox().exists()).toBe(true);
expect(findEnableCheckboxDisabled()).toBeUndefined();
- expect(findProjectKey().exists()).toBe(true);
});
it('does not render the Premium CTA', () => {
@@ -98,9 +95,8 @@ describe('JiraIssuesFields', () => {
});
}
} else {
- it('does not render checkbox and input field', () => {
+ it('does not render enable checkbox', () => {
expect(findEnableCheckbox().exists()).toBe(false);
- expect(findProjectKey().exists()).toBe(false);
});
it('renders the Premium CTA', () => {
@@ -122,12 +118,8 @@ describe('JiraIssuesFields', () => {
createComponent({ props: { initialProjectKey: '' } });
});
- it('renders disabled project_key input', () => {
- const projectKey = findProjectKey();
-
- expect(projectKey.exists()).toBe(true);
- expect(projectKey.attributes('disabled')).toBe('disabled');
- expect(projectKey.attributes('required')).toBeUndefined();
+ it('does not render project_key input', () => {
+ expect(findProjectKey().exists()).toBe(false);
});
// As per https://vuejs.org/v2/guide/forms.html#Checkbox-1,
@@ -137,45 +129,23 @@ describe('JiraIssuesFields', () => {
});
describe('when isInheriting = true', () => {
- it('disables checkbox and sets input as readonly', () => {
+ it('disables checkbox', () => {
createComponent({ isInheriting: true });
expect(findEnableCheckboxDisabled()).toBe('disabled');
- expect(findProjectKey().attributes('readonly')).toBe('readonly');
});
});
describe('on enable issues', () => {
- it('enables project_key input as required', async () => {
+ it('renders project_key input as required', async () => {
await setEnableCheckbox(true);
- expect(findProjectKey().attributes('disabled')).toBeUndefined();
+ expect(findProjectKey().exists()).toBe(true);
expect(findProjectKey().attributes('required')).toBe('required');
});
});
});
- it('contains link to editProjectPath', () => {
- createComponent();
-
- expect(wrapper.find(`a[href="${defaultProps.editProjectPath}"]`).exists()).toBe(true);
- });
-
- describe('GitLab issues warning', () => {
- it.each`
- gitlabIssuesEnabled | scenario
- ${true} | ${'displays conflict warning'}
- ${false} | ${'does not display conflict warning'}
- `(
- '$scenario when `gitlabIssuesEnabled` is `$gitlabIssuesEnabled`',
- ({ gitlabIssuesEnabled }) => {
- createComponent({ props: { gitlabIssuesEnabled } });
-
- expect(findConflictWarning().exists()).toBe(gitlabIssuesEnabled);
- },
- );
- });
-
describe('Vulnerabilities creation', () => {
beforeEach(() => {
createComponent();
diff --git a/spec/frontend/invite_members/components/group_select_spec.js b/spec/frontend/invite_members/components/group_select_spec.js
index 192f3fdd381..e1563a7bb3a 100644
--- a/spec/frontend/invite_members/components/group_select_spec.js
+++ b/spec/frontend/invite_members/components/group_select_spec.js
@@ -4,7 +4,6 @@ import waitForPromises from 'helpers/wait_for_promises';
import * as groupsApi from '~/api/groups_api';
import GroupSelect from '~/invite_members/components/group_select.vue';
-const accessLevels = { Guest: 10, Reporter: 20, Developer: 30, Maintainer: 40, Owner: 50 };
const group1 = { id: 1, full_name: 'Group One', avatar_url: 'test' };
const group2 = { id: 2, full_name: 'Group Two', avatar_url: 'test' };
const allGroups = [group1, group2];
@@ -13,7 +12,6 @@ const createComponent = (props = {}) => {
return mount(GroupSelect, {
propsData: {
invalidGroups: [],
- accessLevels,
...props,
},
});
@@ -66,9 +64,8 @@ describe('GroupSelect', () => {
resolveApiRequest({ data: allGroups });
expect(groupsApi.getGroups).toHaveBeenCalledWith(group1.name, {
- active: true,
exclude_internal: true,
- min_access_level: accessLevels.Guest,
+ active: true,
});
});
diff --git a/spec/frontend/invite_members/components/invite_groups_modal_spec.js b/spec/frontend/invite_members/components/invite_groups_modal_spec.js
index 8085f48f6e2..f9cb4a149f2 100644
--- a/spec/frontend/invite_members/components/invite_groups_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_groups_modal_spec.js
@@ -42,18 +42,19 @@ describe('InviteGroupsModal', () => {
wrapper = null;
});
+ const findModal = () => wrapper.findComponent(GlModal);
const findGroupSelect = () => wrapper.findComponent(GroupSelect);
const findIntroText = () => wrapper.findByTestId('modal-base-intro-text').text();
- const findCancelButton = () => wrapper.findByTestId('cancel-button');
- const findInviteButton = () => wrapper.findByTestId('invite-button');
const findMembersFormGroup = () => wrapper.findByTestId('members-form-group');
const membersFormGroupInvalidFeedback = () =>
findMembersFormGroup().attributes('invalid-feedback');
- const clickInviteButton = () => findInviteButton().vm.$emit('click');
- const clickCancelButton = () => findCancelButton().vm.$emit('click');
- const triggerGroupSelect = (val) => findGroupSelect().vm.$emit('input', val);
const findBase = () => wrapper.findComponent(InviteModalBase);
- const hideModal = () => wrapper.findComponent(GlModal).vm.$emit('hide');
+ const triggerGroupSelect = (val) => findGroupSelect().vm.$emit('input', val);
+ const emitEventFromModal = (eventName) => () =>
+ findModal().vm.$emit(eventName, { preventDefault: jest.fn() });
+ const hideModal = emitEventFromModal('hidden');
+ const clickInviteButton = emitEventFromModal('primary');
+ const clickCancelButton = emitEventFromModal('cancel');
describe('displaying the correct introText and form group description', () => {
describe('when inviting to a project', () => {
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 dd16bb48cb8..84317da39e6 100644
--- a/spec/frontend/invite_members/components/invite_members_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js
@@ -23,7 +23,7 @@ import ContentTransition from '~/vue_shared/components/content_transition.vue';
import axios from '~/lib/utils/axios_utils';
import httpStatus from '~/lib/utils/http_status';
import { getParameterValues } from '~/lib/utils/url_utility';
-import { apiPaths, membersApiResponse, invitationsApiResponse } from '../mock_data/api_responses';
+import { GROUPS_INVITATIONS_PATH, invitationsApiResponse } from '../mock_data/api_responses';
import {
propsData,
inviteSource,
@@ -85,12 +85,13 @@ describe('InviteMembersModal', () => {
mock.restore();
});
+ const findModal = () => wrapper.findComponent(GlModal);
const findBase = () => wrapper.findComponent(InviteModalBase);
const findIntroText = () => wrapper.findByTestId('modal-base-intro-text').text();
- const findCancelButton = () => wrapper.findByTestId('cancel-button');
- const findInviteButton = () => wrapper.findByTestId('invite-button');
- const clickInviteButton = () => findInviteButton().vm.$emit('click');
- const clickCancelButton = () => findCancelButton().vm.$emit('click');
+ const emitEventFromModal = (eventName) => () =>
+ findModal().vm.$emit(eventName, { preventDefault: jest.fn() });
+ const clickInviteButton = emitEventFromModal('primary');
+ const clickCancelButton = emitEventFromModal('cancel');
const findMembersFormGroup = () => wrapper.findByTestId('members-form-group');
const membersFormGroupInvalidFeedback = () =>
findMembersFormGroup().attributes('invalid-feedback');
@@ -276,7 +277,7 @@ describe('InviteMembersModal', () => {
});
it('renders the modal with the correct title', () => {
- expect(wrapper.findComponent(GlModal).props('title')).toBe(MEMBERS_MODAL_CELEBRATE_TITLE);
+ expect(findModal().props('title')).toBe(MEMBERS_MODAL_CELEBRATE_TITLE);
});
it('includes the correct celebration text and emoji', () => {
@@ -300,11 +301,8 @@ describe('InviteMembersModal', () => {
});
describe('submitting the invite form', () => {
- const mockMembersApi = (code, data) => {
- mock.onPost(apiPaths.GROUPS_MEMBERS).reply(code, data);
- };
const mockInvitationsApi = (code, data) => {
- mock.onPost(apiPaths.GROUPS_INVITATIONS).reply(code, data);
+ mock.onPost(GROUPS_INVITATIONS_PATH).reply(code, data);
};
const expectedEmailRestrictedError =
@@ -328,7 +326,7 @@ describe('InviteMembersModal', () => {
await triggerMembersTokenSelect([user1, user2]);
wrapper.vm.$toast = { show: jest.fn() };
- jest.spyOn(Api, 'addGroupMembersByUserId').mockResolvedValue({ data: postData });
+ jest.spyOn(Api, 'inviteGroupMembers').mockResolvedValue({ data: postData });
});
describe('when triggered from regular mounting', () => {
@@ -336,12 +334,8 @@ describe('InviteMembersModal', () => {
clickInviteButton();
});
- it('sets isLoading on the Invite button when it is clicked', () => {
- expect(findInviteButton().props('loading')).toBe(true);
- });
-
- it('calls Api addGroupMembersByUserId with the correct params', () => {
- expect(Api.addGroupMembersByUserId).toHaveBeenCalledWith(propsData.id, postData);
+ it('calls Api inviteGroupMembers with the correct params', () => {
+ expect(Api.inviteGroupMembers).toHaveBeenCalledWith(propsData.id, postData);
});
it('displays the successful toastMessage', () => {
@@ -371,21 +365,9 @@ describe('InviteMembersModal', () => {
await triggerMembersTokenSelect([user1]);
});
- it('displays "Member already exists" api message for http status conflict', async () => {
- mockMembersApi(httpStatus.CONFLICT, membersApiResponse.MEMBER_ALREADY_EXISTS);
-
- clickInviteButton();
-
- await waitForPromises();
-
- expect(membersFormGroupInvalidFeedback()).toBe('Member already exists');
- expect(findMembersSelect().props('validationState')).toBe(false);
- expect(findInviteButton().props('loading')).toBe(false);
- });
-
describe('clearing the invalid state and message', () => {
beforeEach(async () => {
- mockMembersApi(httpStatus.CONFLICT, membersApiResponse.MEMBER_ALREADY_EXISTS);
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.EMAIL_TAKEN);
clickInviteButton();
@@ -393,7 +375,9 @@ describe('InviteMembersModal', () => {
});
it('clears the error when the list of members to invite is cleared', async () => {
- expect(membersFormGroupInvalidFeedback()).toBe('Member already exists');
+ expect(membersFormGroupInvalidFeedback()).toBe(
+ Object.values(invitationsApiResponse.EMAIL_TAKEN.message)[0],
+ );
expect(findMembersSelect().props('validationState')).toBe(false);
findMembersSelect().vm.$emit('clear');
@@ -414,7 +398,7 @@ describe('InviteMembersModal', () => {
});
it('clears the error when the modal is hidden', async () => {
- wrapper.findComponent(GlModal).vm.$emit('hide');
+ findModal().vm.$emit('hidden');
await nextTick();
@@ -424,15 +408,17 @@ describe('InviteMembersModal', () => {
});
it('clears the invalid state and message once the list of members to invite is cleared', async () => {
- mockMembersApi(httpStatus.CONFLICT, membersApiResponse.MEMBER_ALREADY_EXISTS);
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.EMAIL_TAKEN);
clickInviteButton();
await waitForPromises();
- expect(membersFormGroupInvalidFeedback()).toBe('Member already exists');
+ expect(membersFormGroupInvalidFeedback()).toBe(
+ Object.values(invitationsApiResponse.EMAIL_TAKEN.message)[0],
+ );
expect(findMembersSelect().props('validationState')).toBe(false);
- expect(findInviteButton().props('loading')).toBe(false);
+ expect(findModal().props('actionPrimary').attributes.loading).toBe(false);
findMembersSelect().vm.$emit('clear');
@@ -440,11 +426,14 @@ describe('InviteMembersModal', () => {
expect(membersFormGroupInvalidFeedback()).toBe('');
expect(findMembersSelect().props('validationState')).toBe(null);
- expect(findInviteButton().props('loading')).toBe(false);
+ expect(findModal().props('actionPrimary').attributes.loading).toBe(false);
});
it('displays the generic error for http server error', async () => {
- mockMembersApi(httpStatus.INTERNAL_SERVER_ERROR, 'Request failed with status code 500');
+ mockInvitationsApi(
+ httpStatus.INTERNAL_SERVER_ERROR,
+ 'Request failed with status code 500',
+ );
clickInviteButton();
@@ -454,7 +443,7 @@ describe('InviteMembersModal', () => {
});
it('displays the restricted user api message for response with bad request', async () => {
- mockMembersApi(httpStatus.BAD_REQUEST, membersApiResponse.SINGLE_USER_RESTRICTED);
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.EMAIL_RESTRICTED);
clickInviteButton();
@@ -464,7 +453,7 @@ describe('InviteMembersModal', () => {
});
it('displays the first part of the error when multiple existing users are restricted by email', async () => {
- mockMembersApi(httpStatus.CREATED, membersApiResponse.MULTIPLE_USERS_RESTRICTED);
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.MULTIPLE_RESTRICTED);
clickInviteButton();
@@ -475,19 +464,6 @@ describe('InviteMembersModal', () => {
);
expect(findMembersSelect().props('validationState')).toBe(false);
});
-
- it('displays an access_level error message received for the existing user', async () => {
- mockMembersApi(httpStatus.BAD_REQUEST, membersApiResponse.SINGLE_USER_ACCESS_LEVEL);
-
- clickInviteButton();
-
- await waitForPromises();
-
- expect(membersFormGroupInvalidFeedback()).toBe(
- 'should be greater than or equal to Owner inherited membership from group Gitlab Org',
- );
- expect(findMembersSelect().props('validationState')).toBe(false);
- });
});
});
@@ -508,7 +484,7 @@ describe('InviteMembersModal', () => {
await triggerMembersTokenSelect([user3]);
wrapper.vm.$toast = { show: jest.fn() };
- jest.spyOn(Api, 'inviteGroupMembersByEmail').mockResolvedValue({ data: postData });
+ jest.spyOn(Api, 'inviteGroupMembers').mockResolvedValue({ data: postData });
});
describe('when triggered from regular mounting', () => {
@@ -516,8 +492,8 @@ describe('InviteMembersModal', () => {
clickInviteButton();
});
- it('calls Api inviteGroupMembersByEmail with the correct params', () => {
- expect(Api.inviteGroupMembersByEmail).toHaveBeenCalledWith(propsData.id, postData);
+ it('calls Api inviteGroupMembers with the correct params', () => {
+ expect(Api.inviteGroupMembers).toHaveBeenCalledWith(propsData.id, postData);
});
it('displays the successful toastMessage', () => {
@@ -542,7 +518,7 @@ describe('InviteMembersModal', () => {
expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
expect(findMembersSelect().props('validationState')).toBe(false);
- expect(findInviteButton().props('loading')).toBe(false);
+ expect(findModal().props('actionPrimary').attributes.loading).toBe(false);
});
it('displays the restricted email error when restricted email is invited', async () => {
@@ -554,23 +530,11 @@ describe('InviteMembersModal', () => {
expect(membersFormGroupInvalidFeedback()).toContain(expectedEmailRestrictedError);
expect(findMembersSelect().props('validationState')).toBe(false);
- expect(findInviteButton().props('loading')).toBe(false);
- });
-
- it('displays the successful toast message when email has already been invited', async () => {
- mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.EMAIL_TAKEN);
- wrapper.vm.$toast = { show: jest.fn() };
-
- clickInviteButton();
-
- await waitForPromises();
-
- expect(wrapper.vm.$toast.show).toHaveBeenCalledWith('Members were successfully added');
- expect(findMembersSelect().props('validationState')).toBe(null);
+ expect(findModal().props('actionPrimary').attributes.loading).toBe(false);
});
it('displays the first error message when multiple emails return a restricted error message', async () => {
- mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.MULTIPLE_EMAIL_RESTRICTED);
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.MULTIPLE_RESTRICTED);
clickInviteButton();
@@ -617,19 +581,17 @@ describe('InviteMembersModal', () => {
format: 'json',
tasks_to_be_done: [],
tasks_project_id: '',
+ user_id: '1',
+ email: 'email@example.com',
};
- const emailPostData = { ...postData, email: 'email@example.com' };
- const idPostData = { ...postData, user_id: '1' };
-
describe('when invites are sent successfully', () => {
beforeEach(async () => {
createComponent();
await triggerMembersTokenSelect([user1, user3]);
wrapper.vm.$toast = { show: jest.fn() };
- jest.spyOn(Api, 'inviteGroupMembersByEmail').mockResolvedValue({ data: postData });
- jest.spyOn(Api, 'addGroupMembersByUserId').mockResolvedValue({ data: postData });
+ jest.spyOn(Api, 'inviteGroupMembers').mockResolvedValue({ data: postData });
});
describe('when triggered from regular mounting', () => {
@@ -637,12 +599,8 @@ describe('InviteMembersModal', () => {
clickInviteButton();
});
- it('calls Api inviteGroupMembersByEmail with the correct params', () => {
- expect(Api.inviteGroupMembersByEmail).toHaveBeenCalledWith(propsData.id, emailPostData);
- });
-
- it('calls Api addGroupMembersByUserId with the correct params', () => {
- expect(Api.addGroupMembersByUserId).toHaveBeenCalledWith(propsData.id, idPostData);
+ it('calls Api inviteGroupMembers with the correct params', () => {
+ expect(Api.inviteGroupMembers).toHaveBeenCalledWith(propsData.id, postData);
});
it('displays the successful toastMessage', () => {
@@ -655,12 +613,8 @@ describe('InviteMembersModal', () => {
clickInviteButton();
- expect(Api.inviteGroupMembersByEmail).toHaveBeenCalledWith(propsData.id, {
- ...emailPostData,
- invite_source: '_invite_source_',
- });
- expect(Api.addGroupMembersByUserId).toHaveBeenCalledWith(propsData.id, {
- ...idPostData,
+ expect(Api.inviteGroupMembers).toHaveBeenCalledWith(propsData.id, {
+ ...postData,
invite_source: '_invite_source_',
});
});
@@ -673,7 +627,6 @@ describe('InviteMembersModal', () => {
await triggerMembersTokenSelect([user1, user3]);
mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.EMAIL_INVALID);
- mockMembersApi(httpStatus.OK, '200 OK');
clickInviteButton();
});
@@ -692,7 +645,7 @@ describe('InviteMembersModal', () => {
await triggerMembersTokenSelect([user3]);
wrapper.vm.$toast = { show: jest.fn() };
- jest.spyOn(Api, 'inviteGroupMembersByEmail').mockResolvedValue({});
+ jest.spyOn(Api, 'inviteGroupMembers').mockResolvedValue({});
});
it('tracks the view for learn_gitlab source', () => {
diff --git a/spec/frontend/invite_members/components/invite_modal_base_spec.js b/spec/frontend/invite_members/components/invite_modal_base_spec.js
index 9e17112fb15..8355ae67f20 100644
--- a/spec/frontend/invite_members/components/invite_modal_base_spec.js
+++ b/spec/frontend/invite_members/components/invite_modal_base_spec.js
@@ -49,8 +49,6 @@ describe('InviteModalBase', () => {
const findDatepicker = () => wrapper.findComponent(GlDatepicker);
const findLink = () => wrapper.findComponent(GlLink);
const findIntroText = () => wrapper.findByTestId('modal-base-intro-text').text();
- const findCancelButton = () => wrapper.findByTestId('cancel-button');
- const findInviteButton = () => wrapper.findByTestId('invite-button');
const findMembersFormGroup = () => wrapper.findByTestId('members-form-group');
describe('rendering the modal', () => {
@@ -67,15 +65,21 @@ describe('InviteModalBase', () => {
});
it('renders the Cancel button text correctly', () => {
- expect(findCancelButton().text()).toBe(CANCEL_BUTTON_TEXT);
- });
-
- it('renders the Invite button text correctly', () => {
- expect(findInviteButton().text()).toBe(INVITE_BUTTON_TEXT);
+ expect(wrapper.findComponent(GlModal).props('actionCancel')).toMatchObject({
+ text: CANCEL_BUTTON_TEXT,
+ });
});
- it('renders the Invite button modal without isLoading', () => {
- expect(findInviteButton().props('loading')).toBe(false);
+ it('renders the Invite button correctly', () => {
+ expect(wrapper.findComponent(GlModal).props('actionPrimary')).toMatchObject({
+ text: INVITE_BUTTON_TEXT,
+ attributes: {
+ variant: 'confirm',
+ disabled: false,
+ loading: false,
+ 'data-qa-selector': 'invite_button',
+ },
+ });
});
describe('rendering the access levels dropdown', () => {
@@ -114,7 +118,7 @@ describe('InviteModalBase', () => {
isLoading: true,
});
- expect(findInviteButton().props('loading')).toBe(true);
+ expect(wrapper.findComponent(GlModal).props('actionPrimary').attributes.loading).toBe(true);
});
it('with invalidFeedbackMessage, set members form group validation state', () => {
diff --git a/spec/frontend/invite_members/components/members_token_select_spec.js b/spec/frontend/invite_members/components/members_token_select_spec.js
index 196a716d08c..bf5564e4d63 100644
--- a/spec/frontend/invite_members/components/members_token_select_spec.js
+++ b/spec/frontend/invite_members/components/members_token_select_spec.js
@@ -95,7 +95,7 @@ describe('MembersTokenSelect', () => {
expect(UserApi.getUsers).toHaveBeenCalledWith(searchParam, {
active: true,
- exclude_internal: true,
+ without_project_bots: true,
});
expect(tokenSelector.props('hideDropdownWithNoItems')).toBe(false);
});
@@ -172,7 +172,7 @@ describe('MembersTokenSelect', () => {
expect(UserApi.getUsers).toHaveBeenCalledWith(searchParam, {
active: true,
- exclude_internal: true,
+ without_project_bots: true,
saml_provider_id: samlProviderId,
});
});
diff --git a/spec/frontend/invite_members/components/user_limit_notification_spec.js b/spec/frontend/invite_members/components/user_limit_notification_spec.js
new file mode 100644
index 00000000000..c779cf2ee3f
--- /dev/null
+++ b/spec/frontend/invite_members/components/user_limit_notification_spec.js
@@ -0,0 +1,71 @@
+import { GlAlert, GlSprintf } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import UserLimitNotification from '~/invite_members/components/user_limit_notification.vue';
+
+describe('UserLimitNotification', () => {
+ let wrapper;
+
+ const findAlert = () => wrapper.findComponent(GlAlert);
+
+ const createComponent = (providers = {}) => {
+ wrapper = shallowMountExtended(UserLimitNotification, {
+ provide: {
+ name: 'my group',
+ newTrialRegistrationPath: 'newTrialRegistrationPath',
+ purchasePath: 'purchasePath',
+ freeUsersLimit: 5,
+ membersCount: 1,
+ ...providers,
+ },
+ stubs: { GlSprintf },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when limit is not reached', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders empty block', () => {
+ expect(findAlert().exists()).toBe(false);
+ });
+ });
+
+ describe('when close to limit', () => {
+ beforeEach(() => {
+ createComponent({ membersCount: 3 });
+ });
+
+ it("renders user's limit notification", () => {
+ const alert = findAlert();
+
+ expect(alert.attributes('title')).toEqual(
+ 'You only have space for 2 more members in my group',
+ );
+
+ expect(alert.text()).toEqual(
+ 'To get more members an owner of this namespace can start a trial or upgrade to a paid tier.',
+ );
+ });
+ });
+
+ describe('when limit is reached', () => {
+ beforeEach(() => {
+ createComponent({ membersCount: 5 });
+ });
+
+ it("renders user's limit notification", () => {
+ const alert = findAlert();
+
+ expect(alert.attributes('title')).toEqual("You've reached your 5 members limit for my group");
+
+ expect(alert.text()).toEqual(
+ 'New members will be unable to participate. You can manage your members by removing ones you no longer need. To get more members an owner of this namespace can start a trial or upgrade to a paid tier.',
+ );
+ });
+ });
+});
diff --git a/spec/frontend/invite_members/mock_data/api_responses.js b/spec/frontend/invite_members/mock_data/api_responses.js
index a3e426376d8..4ad3b6aeb66 100644
--- a/spec/frontend/invite_members/mock_data/api_responses.js
+++ b/spec/frontend/invite_members/mock_data/api_responses.js
@@ -1,12 +1,12 @@
-const INVITATIONS_API_EMAIL_INVALID = {
+const EMAIL_INVALID = {
message: { error: 'email contains an invalid email address' },
};
-const INVITATIONS_API_ERROR_EMAIL_INVALID = {
+const ERROR_EMAIL_INVALID = {
error: 'email contains an invalid email address',
};
-const INVITATIONS_API_EMAIL_RESTRICTED = {
+const EMAIL_RESTRICTED = {
message: {
'email@example.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.",
@@ -14,65 +14,31 @@ const INVITATIONS_API_EMAIL_RESTRICTED = {
status: 'error',
};
-const INVITATIONS_API_MULTIPLE_EMAIL_RESTRICTED = {
+const MULTIPLE_RESTRICTED = {
message: {
'email@example.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.",
'email4@example.com':
"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',
-};
-
-const INVITATIONS_API_EMAIL_TAKEN = {
- message: {
- 'email@example.org': 'Invite email has already been taken',
- },
- status: 'error',
-};
-
-const MEMBERS_API_MEMBER_ALREADY_EXISTS = {
- message: 'Member already exists',
-};
-
-const MEMBERS_API_SINGLE_USER_RESTRICTED = {
- message: {
- user: [
+ 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.",
- ],
},
+ status: 'error',
};
-const MEMBERS_API_SINGLE_USER_ACCESS_LEVEL = {
+const EMAIL_TAKEN = {
message: {
- access_level: [
- 'should be greater than or equal to Owner inherited membership from group Gitlab Org',
- ],
+ 'email@example.org': "The member's email address has already been taken",
},
-};
-
-const MEMBERS_API_MULTIPLE_USERS_RESTRICTED = {
- message:
- "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',
};
-export const apiPaths = {
- GROUPS_MEMBERS: '/api/v4/groups/1/members',
- GROUPS_INVITATIONS: '/api/v4/groups/1/invitations',
-};
-
-export const membersApiResponse = {
- MEMBER_ALREADY_EXISTS: MEMBERS_API_MEMBER_ALREADY_EXISTS,
- SINGLE_USER_ACCESS_LEVEL: MEMBERS_API_SINGLE_USER_ACCESS_LEVEL,
- SINGLE_USER_RESTRICTED: MEMBERS_API_SINGLE_USER_RESTRICTED,
- MULTIPLE_USERS_RESTRICTED: MEMBERS_API_MULTIPLE_USERS_RESTRICTED,
-};
+export const GROUPS_INVITATIONS_PATH = '/api/v4/groups/1/invitations';
export const invitationsApiResponse = {
- EMAIL_INVALID: INVITATIONS_API_EMAIL_INVALID,
- ERROR_EMAIL_INVALID: INVITATIONS_API_ERROR_EMAIL_INVALID,
- EMAIL_RESTRICTED: INVITATIONS_API_EMAIL_RESTRICTED,
- MULTIPLE_EMAIL_RESTRICTED: INVITATIONS_API_MULTIPLE_EMAIL_RESTRICTED,
- EMAIL_TAKEN: INVITATIONS_API_EMAIL_TAKEN,
+ EMAIL_INVALID,
+ ERROR_EMAIL_INVALID,
+ EMAIL_RESTRICTED,
+ MULTIPLE_RESTRICTED,
+ EMAIL_TAKEN,
};
diff --git a/spec/frontend/invite_members/mock_data/group_modal.js b/spec/frontend/invite_members/mock_data/group_modal.js
index c05c4edb7d0..c8588683885 100644
--- a/spec/frontend/invite_members/mock_data/group_modal.js
+++ b/spec/frontend/invite_members/mock_data/group_modal.js
@@ -1,5 +1,6 @@
export const propsData = {
id: '1',
+ rootId: '1',
name: 'test name',
isProject: false,
invalidGroups: [],
diff --git a/spec/frontend/invite_members/mock_data/member_modal.js b/spec/frontend/invite_members/mock_data/member_modal.js
index 590502909b2..1b0cc57fb5b 100644
--- a/spec/frontend/invite_members/mock_data/member_modal.js
+++ b/spec/frontend/invite_members/mock_data/member_modal.js
@@ -1,5 +1,6 @@
export const propsData = {
id: '1',
+ rootId: '1',
name: 'test name',
isProject: false,
accessLevels: { Guest: 10, Reporter: 20, Developer: 30, Maintainer: 40, Owner: 50 },
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 e2cc87c8547..8b2064df374 100644
--- a/spec/frontend/invite_members/utils/response_message_parser_spec.js
+++ b/spec/frontend/invite_members/utils/response_message_parser_spec.js
@@ -2,23 +2,19 @@ import {
responseMessageFromSuccess,
responseMessageFromError,
} from '~/invite_members/utils/response_message_parser';
-import { membersApiResponse, invitationsApiResponse } from '../mock_data/api_responses';
+import { invitationsApiResponse } from '../mock_data/api_responses';
describe('Response message parser', () => {
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 username2: id not found and restricted email. and username3: email is restricted.';
it.each([
- [[{ data: { message: expectedMessage } }]],
- [[{ data: { message: exampleFirstPartMultiple + exampleUserMsgMultiple } }]],
- [[{ data: { error: expectedMessage } }]],
- [[{ data: { message: [expectedMessage] } }]],
- [[{ data: { message: exampleKeyedMsg } }]],
+ [{ data: { message: expectedMessage } }],
+ [{ data: { error: expectedMessage } }],
+ [{ data: { message: [expectedMessage] } }],
+ [{ data: { message: exampleKeyedMsg } }],
])(`returns "${expectedMessage}" from success response: %j`, (successResponse) => {
expect(responseMessageFromSuccess(successResponse)).toBe(expectedMessage);
});
@@ -27,8 +23,6 @@ describe('Response message parser', () => {
describe('message from error response', () => {
it.each([
[{ response: { data: { error: expectedMessage } } }],
- [{ response: { data: { message: { user: [expectedMessage] } } } }],
- [{ response: { data: { message: { access_level: [expectedMessage] } } } }],
[{ response: { data: { message: { error: expectedMessage } } } }],
[{ response: { data: { message: expectedMessage } } }],
])(`returns "${expectedMessage}" from error response: %j`, (errorResponse) => {
@@ -41,18 +35,10 @@ describe('Response message parser', () => {
"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 }]],
+ [{ data: invitationsApiResponse.MULTIPLE_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/issuable_form_spec.js b/spec/frontend/issuable/issuable_form_spec.js
index 321c61ead1e..99ed18cf5bd 100644
--- a/spec/frontend/issuable/issuable_form_spec.js
+++ b/spec/frontend/issuable/issuable_form_spec.js
@@ -1,20 +1,46 @@
import $ from 'jquery';
import IssuableForm from '~/issuable/issuable_form';
-
-function createIssuable() {
- const instance = new IssuableForm($(document.createElement('form')));
-
- instance.titleField = $(document.createElement('input'));
-
- return instance;
-}
+import setWindowLocation from 'helpers/set_window_location_helper';
describe('IssuableForm', () => {
let instance;
+ const createIssuable = (form) => {
+ instance = new IssuableForm(form);
+ };
+
beforeEach(() => {
- instance = createIssuable();
+ setFixtures(`
+ <form>
+ <input name="[title]" />
+ </form>
+ `);
+ createIssuable($('form'));
+ });
+
+ describe('initAutosave', () => {
+ it('creates autosave with the searchTerm included', () => {
+ setWindowLocation('https://gitlab.test/foo?bar=true');
+ const autosave = instance.initAutosave();
+
+ expect(autosave.key.includes('bar=true')).toBe(true);
+ });
+
+ it("creates autosave fields without the searchTerm if it's an issue new form", () => {
+ setFixtures(`
+ <form data-new-issue-path="/issues/new">
+ <input name="[title]" />
+ </form>
+ `);
+ createIssuable($('form'));
+
+ setWindowLocation('https://gitlab.test/issues/new?bar=true');
+
+ const autosave = instance.initAutosave();
+
+ expect(autosave.key.includes('bar=true')).toBe(false);
+ });
});
describe('removeWip', () => {
diff --git a/spec/frontend/issues/create_merge_request_dropdown_spec.js b/spec/frontend/issues/create_merge_request_dropdown_spec.js
index c2cfb16fdf7..20b26f5abba 100644
--- a/spec/frontend/issues/create_merge_request_dropdown_spec.js
+++ b/spec/frontend/issues/create_merge_request_dropdown_spec.js
@@ -15,7 +15,7 @@ describe('CreateMergeRequestDropdown', () => {
<div id="dummy-wrapper-element">
<div class="available"></div>
<div class="unavailable">
- <div class="gl-spinner"></div>
+ <div class="js-create-mr-spinner"></div>
<div class="text"></div>
</div>
<div class="js-ref"></div>
@@ -38,21 +38,16 @@ describe('CreateMergeRequestDropdown', () => {
});
describe('getRef', () => {
- it('escapes branch names correctly', (done) => {
+ it('escapes branch names correctly', async () => {
const endpoint = `${dropdown.refsPath}contains%23hash`;
jest.spyOn(axios, 'get');
axiosMock.onGet(endpoint).replyOnce({});
- dropdown
- .getRef('contains#hash')
- .then(() => {
- expect(axios.get).toHaveBeenCalledWith(
- endpoint,
- expect.objectContaining({ cancelToken: expect.anything() }),
- );
- })
- .then(done)
- .catch(done.fail);
+ await dropdown.getRef('contains#hash');
+ expect(axios.get).toHaveBeenCalledWith(
+ endpoint,
+ expect.objectContaining({ cancelToken: expect.anything() }),
+ );
});
});
diff --git a/spec/frontend/issues/list/components/issue_card_time_info_spec.js b/spec/frontend/issues/list/components/issue_card_time_info_spec.js
index e9c48b60da4..c3f13ca6f9a 100644
--- a/spec/frontend/issues/list/components/issue_card_time_info_spec.js
+++ b/spec/frontend/issues/list/components/issue_card_time_info_spec.js
@@ -1,10 +1,11 @@
import { GlIcon, GlLink } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { useFakeDate } from 'helpers/fake_date';
+import { IssuableStatus } from '~/issues/constants';
import IssueCardTimeInfo from '~/issues/list/components/issue_card_time_info.vue';
describe('CE IssueCardTimeInfo component', () => {
- useFakeDate(2020, 11, 11);
+ useFakeDate(2020, 11, 11); // 2020 Dec 11
let wrapper;
@@ -24,7 +25,7 @@ describe('CE IssueCardTimeInfo component', () => {
const findDueDate = () => wrapper.find('[data-testid="issuable-due-date"]');
const mountComponent = ({
- closedAt = null,
+ state = IssuableStatus.Open,
dueDate = issue.dueDate,
milestoneDueDate = issue.milestone.dueDate,
milestoneStartDate = issue.milestone.startDate,
@@ -38,7 +39,7 @@ describe('CE IssueCardTimeInfo component', () => {
dueDate: milestoneDueDate,
startDate: milestoneStartDate,
},
- closedAt,
+ state,
dueDate,
},
},
@@ -91,7 +92,7 @@ describe('CE IssueCardTimeInfo component', () => {
describe('when in the past', () => {
describe('when issue is open', () => {
it('renders in red', () => {
- wrapper = mountComponent({ dueDate: new Date('2020-10-10') });
+ wrapper = mountComponent({ dueDate: '2020-10-10' });
expect(findDueDate().classes()).toContain('gl-text-red-500');
});
@@ -100,8 +101,8 @@ describe('CE IssueCardTimeInfo component', () => {
describe('when issue is closed', () => {
it('does not render in red', () => {
wrapper = mountComponent({
- dueDate: new Date('2020-10-10'),
- closedAt: '2020-09-05T13:06:25Z',
+ dueDate: '2020-10-10',
+ state: IssuableStatus.Closed,
});
expect(findDueDate().classes()).not.toContain('gl-text-red-500');
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 33c7ccac180..5a9bd1ff8e4 100644
--- a/spec/frontend/issues/list/components/issues_list_app_spec.js
+++ b/spec/frontend/issues/list/components/issues_list_app_spec.js
@@ -452,13 +452,26 @@ describe('CE IssuesListApp component', () => {
});
describe('IssuableByEmail component', () => {
- describe.each([true, false])(`when issue creation by email is enabled=%s`, (enabled) => {
- it(`${enabled ? 'renders' : 'does not render'}`, () => {
- wrapper = mountComponent({ provide: { initialEmail: enabled } });
-
- expect(findIssuableByEmail().exists()).toBe(enabled);
- });
- });
+ describe.each`
+ initialEmail | hasAnyIssues | isSignedIn | exists
+ ${false} | ${false} | ${false} | ${false}
+ ${false} | ${true} | ${false} | ${false}
+ ${false} | ${false} | ${true} | ${false}
+ ${false} | ${true} | ${true} | ${false}
+ ${true} | ${false} | ${false} | ${false}
+ ${true} | ${true} | ${false} | ${false}
+ ${true} | ${false} | ${true} | ${true}
+ ${true} | ${true} | ${true} | ${true}
+ `(
+ `when issue creation by email is enabled=$initialEmail`,
+ ({ initialEmail, hasAnyIssues, isSignedIn, exists }) => {
+ it(`${initialEmail ? 'renders' : 'does not render'}`, () => {
+ wrapper = mountComponent({ provide: { initialEmail, hasAnyIssues, isSignedIn } });
+
+ expect(findIssuableByEmail().exists()).toBe(exists);
+ });
+ },
+ );
});
describe('empty states', () => {
diff --git a/spec/frontend/issues/list/mock_data.js b/spec/frontend/issues/list/mock_data.js
index c883b20682e..b1a135ceb18 100644
--- a/spec/frontend/issues/list/mock_data.js
+++ b/spec/frontend/issues/list/mock_data.js
@@ -21,7 +21,6 @@ export const getIssuesQueryResponse = {
__typename: 'Issue',
id: 'gid://gitlab/Issue/123456',
iid: '789',
- closedAt: null,
confidential: false,
createdAt: '2021-05-22T04:08:01Z',
downvotes: 2,
@@ -30,6 +29,7 @@ export const getIssuesQueryResponse = {
humanTimeEstimate: null,
mergeRequestsCount: false,
moved: false,
+ state: 'opened',
title: 'Issue title',
updatedAt: '2021-05-22T04:08:01Z',
upvotes: 3,
diff --git a/spec/frontend/issues/related_merge_requests/store/actions_spec.js b/spec/frontend/issues/related_merge_requests/store/actions_spec.js
index 5f232fee09b..4327fac15d4 100644
--- a/spec/frontend/issues/related_merge_requests/store/actions_spec.js
+++ b/spec/frontend/issues/related_merge_requests/store/actions_spec.js
@@ -23,90 +23,82 @@ describe('RelatedMergeRequest store actions', () => {
});
describe('setInitialState', () => {
- it('commits types.SET_INITIAL_STATE with given props', (done) => {
+ it('commits types.SET_INITIAL_STATE with given props', () => {
const props = { a: 1, b: 2 };
- testAction(
+ return testAction(
actions.setInitialState,
props,
{},
[{ type: types.SET_INITIAL_STATE, payload: props }],
[],
- done,
);
});
});
describe('requestData', () => {
- it('commits types.REQUEST_DATA', (done) => {
- testAction(actions.requestData, null, {}, [{ type: types.REQUEST_DATA }], [], done);
+ it('commits types.REQUEST_DATA', () => {
+ return testAction(actions.requestData, null, {}, [{ type: types.REQUEST_DATA }], []);
});
});
describe('receiveDataSuccess', () => {
- it('commits types.RECEIVE_DATA_SUCCESS with data', (done) => {
+ it('commits types.RECEIVE_DATA_SUCCESS with data', () => {
const data = { a: 1, b: 2 };
- testAction(
+ return testAction(
actions.receiveDataSuccess,
data,
{},
[{ type: types.RECEIVE_DATA_SUCCESS, payload: data }],
[],
- done,
);
});
});
describe('receiveDataError', () => {
- it('commits types.RECEIVE_DATA_ERROR', (done) => {
- testAction(
+ it('commits types.RECEIVE_DATA_ERROR', () => {
+ return testAction(
actions.receiveDataError,
null,
{},
[{ type: types.RECEIVE_DATA_ERROR }],
[],
- done,
);
});
});
describe('fetchMergeRequests', () => {
describe('for a successful request', () => {
- it('should dispatch success action', (done) => {
+ it('should dispatch success action', () => {
const data = { a: 1 };
mock.onGet(`${state.apiEndpoint}?per_page=100`).replyOnce(200, data, { 'x-total': 2 });
- testAction(
+ return testAction(
actions.fetchMergeRequests,
null,
state,
[],
[{ type: 'requestData' }, { type: 'receiveDataSuccess', payload: { data, total: 2 } }],
- done,
);
});
});
describe('for a failing request', () => {
- it('should dispatch error action', (done) => {
+ it('should dispatch error action', async () => {
mock.onGet(`${state.apiEndpoint}?per_page=100`).replyOnce(400);
- testAction(
+ await testAction(
actions.fetchMergeRequests,
null,
state,
[],
[{ type: 'requestData' }, { type: 'receiveDataError' }],
- () => {
- expect(createFlash).toHaveBeenCalledTimes(1);
- expect(createFlash).toHaveBeenCalledWith({
- message: expect.stringMatching('Something went wrong'),
- });
-
- done();
- },
);
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: expect.stringMatching('Something went wrong'),
+ });
});
});
});
diff --git a/spec/frontend/issues/show/components/app_spec.js b/spec/frontend/issues/show/components/app_spec.js
index ac2717a5028..5ab64d8e9ca 100644
--- a/spec/frontend/issues/show/components/app_spec.js
+++ b/spec/frontend/issues/show/components/app_spec.js
@@ -2,11 +2,14 @@ import { GlIntersectionObserver } from '@gitlab/ui';
import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import '~/behaviors/markdown/render_gfm';
import { IssuableStatus, IssuableStatusText } from '~/issues/constants';
import IssuableApp from '~/issues/show/components/app.vue';
import DescriptionComponent from '~/issues/show/components/description.vue';
+import EditedComponent from '~/issues/show/components/edited.vue';
+import FormComponent from '~/issues/show/components/form.vue';
+import TitleComponent from '~/issues/show/components/title.vue';
import IncidentTabs from '~/issues/show/components/incidents/incident_tabs.vue';
import PinnedLinks from '~/issues/show/components/pinned_links.vue';
import { POLLING_DELAY } from '~/issues/show/constants';
@@ -21,10 +24,6 @@ import {
zoomMeetingUrl,
} from '../mock_data/mock_data';
-function formatText(text) {
- return text.trim().replace(/\s\s+/g, ' ');
-}
-
jest.mock('~/lib/utils/url_utility');
jest.mock('~/issues/show/event_hub');
@@ -39,10 +38,15 @@ describe('Issuable output', () => {
const findLockedBadge = () => wrapper.findByTestId('locked');
const findConfidentialBadge = () => wrapper.findByTestId('confidential');
const findHiddenBadge = () => wrapper.findByTestId('hidden');
- const findAlert = () => wrapper.find('.alert');
+
+ const findTitle = () => wrapper.findComponent(TitleComponent);
+ const findDescription = () => wrapper.findComponent(DescriptionComponent);
+ const findEdited = () => wrapper.findComponent(EditedComponent);
+ const findForm = () => wrapper.findComponent(FormComponent);
+ const findPinnedLinks = () => wrapper.findComponent(PinnedLinks);
const mountComponent = (props = {}, options = {}, data = {}) => {
- wrapper = mountExtended(IssuableApp, {
+ wrapper = shallowMountExtended(IssuableApp, {
directives: {
GlTooltip: createMockDirective(),
},
@@ -104,23 +108,15 @@ describe('Issuable output', () => {
});
it('should render a title/description/edited and update title/description/edited on update', () => {
- let editedText;
return axios
.waitForAll()
.then(() => {
- editedText = wrapper.find('.edited-text');
- })
- .then(() => {
- expect(document.querySelector('title').innerText).toContain('this is a title (#1)');
- expect(wrapper.find('.title').text()).toContain('this is a title');
- expect(wrapper.find('.md').text()).toContain('this is a description!');
- expect(wrapper.find('.js-task-list-field').element.value).toContain(
- 'this is a description',
- );
+ expect(findTitle().props('titleText')).toContain('this is a title');
+ expect(findDescription().props('descriptionText')).toContain('this is a description');
- expect(formatText(editedText.text())).toMatch(/Edited[\s\S]+?by Some User/);
- expect(editedText.find('.author-link').attributes('href')).toMatch(/\/some_user$/);
- expect(editedText.find('time').text()).toBeTruthy();
+ expect(findEdited().exists()).toBe(true);
+ expect(findEdited().props('updatedByPath')).toMatch(/\/some_user$/);
+ expect(findEdited().props('updatedAt')).toBeTruthy();
expect(wrapper.vm.state.lock_version).toBe(initialRequest.lock_version);
})
.then(() => {
@@ -128,20 +124,13 @@ describe('Issuable output', () => {
return axios.waitForAll();
})
.then(() => {
- expect(document.querySelector('title').innerText).toContain('2 (#1)');
- expect(wrapper.find('.title').text()).toContain('2');
- expect(wrapper.find('.md').text()).toContain('42');
- expect(wrapper.find('.js-task-list-field').element.value).toContain('42');
- expect(wrapper.find('.edited-text').text()).toBeTruthy();
- expect(formatText(wrapper.find('.edited-text').text())).toMatch(
- /Edited[\s\S]+?by Other User/,
- );
+ expect(findTitle().props('titleText')).toContain('2');
+ expect(findDescription().props('descriptionText')).toContain('42');
- expect(editedText.find('.author-link').attributes('href')).toMatch(/\/other_user$/);
- expect(editedText.find('time').text()).toBeTruthy();
- // As the lock_version value does not differ from the server,
- // we should not see an alert
- expect(findAlert().exists()).toBe(false);
+ expect(findEdited().exists()).toBe(true);
+ expect(findEdited().props('updatedByName')).toBe('Other User');
+ expect(findEdited().props('updatedByPath')).toMatch(/\/other_user$/);
+ expect(findEdited().props('updatedAt')).toBeTruthy();
});
});
@@ -149,7 +138,7 @@ describe('Issuable output', () => {
wrapper.vm.showForm = true;
await nextTick();
- expect(wrapper.find('.markdown-selector').exists()).toBe(true);
+ expect(findForm().exists()).toBe(true);
});
it('does not show actions if permissions are incorrect', async () => {
@@ -157,7 +146,7 @@ describe('Issuable output', () => {
wrapper.setProps({ canUpdate: false });
await nextTick();
- expect(wrapper.find('.markdown-selector').exists()).toBe(false);
+ expect(findForm().exists()).toBe(false);
});
it('does not update formState if form is already open', async () => {
@@ -177,8 +166,7 @@ describe('Issuable output', () => {
${'zoomMeetingUrl'} | ${zoomMeetingUrl}
${'publishedIncidentUrl'} | ${publishedIncidentUrl}
`('sets the $prop correctly on underlying pinned links', ({ prop, value }) => {
- expect(wrapper.vm[prop]).toBe(value);
- expect(wrapper.find(`[data-testid="${prop}"]`).attributes('href')).toBe(value);
+ expect(findPinnedLinks().props(prop)).toBe(value);
});
});
@@ -327,7 +315,6 @@ describe('Issuable output', () => {
expect(wrapper.vm.formState.lockedWarningVisible).toBe(true);
expect(wrapper.vm.formState.lock_version).toBe(1);
- expect(findAlert().exists()).toBe(true);
});
});
@@ -374,15 +361,22 @@ describe('Issuable output', () => {
});
describe('show inline edit button', () => {
- it('should not render by default', () => {
- expect(wrapper.find('.btn-edit').exists()).toBe(true);
+ it('should render by default', () => {
+ expect(findTitle().props('showInlineEditButton')).toBe(true);
});
it('should render if showInlineEditButton', async () => {
wrapper.setProps({ showInlineEditButton: true });
await nextTick();
- expect(wrapper.find('.btn-edit').exists()).toBe(true);
+ expect(findTitle().props('showInlineEditButton')).toBe(true);
+ });
+
+ it('should not render if showInlineEditButton is false', async () => {
+ wrapper.setProps({ showInlineEditButton: false });
+
+ await nextTick();
+ expect(findTitle().props('showInlineEditButton')).toBe(false);
});
});
@@ -533,13 +527,11 @@ describe('Issuable output', () => {
describe('Composable description component', () => {
const findIncidentTabs = () => wrapper.findComponent(IncidentTabs);
- const findDescriptionComponent = () => wrapper.findComponent(DescriptionComponent);
- const findPinnedLinks = () => wrapper.findComponent(PinnedLinks);
const borderClass = 'gl-border-b-1 gl-border-b-gray-100 gl-border-b-solid gl-mb-6';
describe('when using description component', () => {
it('renders the description component', () => {
- expect(findDescriptionComponent().exists()).toBe(true);
+ expect(findDescription().exists()).toBe(true);
});
it('does not render incident tabs', () => {
@@ -572,8 +564,8 @@ describe('Issuable output', () => {
);
});
- it('renders the description component', () => {
- expect(findDescriptionComponent().exists()).toBe(true);
+ it('does not the description component', () => {
+ expect(findDescription().exists()).toBe(false);
});
it('renders incident tabs', () => {
diff --git a/spec/frontend/issues/show/components/description_spec.js b/spec/frontend/issues/show/components/description_spec.js
index 08f8996de6f..0b3daadae1d 100644
--- a/spec/frontend/issues/show/components/description_spec.js
+++ b/spec/frontend/issues/show/components/description_spec.js
@@ -1,26 +1,35 @@
import $ from 'jquery';
import { nextTick } from 'vue';
import '~/behaviors/markdown/render_gfm';
-import { GlPopover, GlModal } from '@gitlab/ui';
+import { GlTooltip, GlModal } from '@gitlab/ui';
+import setWindowLocation from 'helpers/set_window_location_helper';
import { stubComponent } from 'helpers/stub_component';
import { TEST_HOST } from 'helpers/test_constants';
import { mockTracking } from 'helpers/tracking_helper';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import createFlash from '~/flash';
import Description from '~/issues/show/components/description.vue';
+import { updateHistory } from '~/lib/utils/url_utility';
import TaskList from '~/task_list';
import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
import CreateWorkItem from '~/work_items/pages/create_work_item.vue';
import {
descriptionProps as initialProps,
descriptionHtmlWithCheckboxes,
+ descriptionHtmlWithTask,
} from '../mock_data/mock_data';
jest.mock('~/flash');
+jest.mock('~/lib/utils/url_utility', () => ({
+ ...jest.requireActual('~/lib/utils/url_utility'),
+ updateHistory: jest.fn(),
+}));
jest.mock('~/task_list');
const showModal = jest.fn();
const hideModal = jest.fn();
+const $toast = {
+ show: jest.fn(),
+};
describe('Description component', () => {
let wrapper;
@@ -28,10 +37,9 @@ describe('Description component', () => {
const findGfmContent = () => wrapper.find('[data-testid="gfm-content"]');
const findTextarea = () => wrapper.find('[data-testid="textarea"]');
const findTaskActionButtons = () => wrapper.findAll('.js-add-task');
- const findConvertToTaskButton = () => wrapper.find('[data-testid="convert-to-task"]');
- const findTaskSvg = () => wrapper.find('[data-testid="issue-open-m-icon"]');
+ const findConvertToTaskButton = () => wrapper.find('.js-add-task');
- const findPopovers = () => wrapper.findAllComponents(GlPopover);
+ const findTooltips = () => wrapper.findAllComponents(GlTooltip);
const findModal = () => wrapper.findComponent(GlModal);
const findCreateWorkItem = () => wrapper.findComponent(CreateWorkItem);
const findWorkItemDetailModal = () => wrapper.findComponent(WorkItemDetailModal);
@@ -39,10 +47,14 @@ describe('Description component', () => {
function createComponent({ props = {}, provide = {} } = {}) {
wrapper = shallowMountExtended(Description, {
propsData: {
+ issueId: 1,
...initialProps,
...props,
},
provide,
+ mocks: {
+ $toast,
+ },
stubs: {
GlModal: stubComponent(GlModal, {
methods: {
@@ -50,12 +62,13 @@ describe('Description component', () => {
hide: hideModal,
},
}),
- GlPopover,
},
});
}
beforeEach(() => {
+ setWindowLocation(TEST_HOST);
+
if (!document.querySelector('.issuable-meta')) {
const metaData = document.createElement('div');
metaData.classList.add('issuable-meta');
@@ -253,9 +266,9 @@ describe('Description component', () => {
expect(findTaskActionButtons()).toHaveLength(3);
});
- it('renders a list of popovers corresponding to checkboxes in description HTML', () => {
- expect(findPopovers()).toHaveLength(3);
- expect(findPopovers().at(0).props('target')).toBe(
+ it('renders a list of tooltips corresponding to checkboxes in description HTML', () => {
+ expect(findTooltips()).toHaveLength(3);
+ expect(findTooltips().at(0).props('target')).toBe(
findTaskActionButtons().at(0).attributes('id'),
);
});
@@ -264,92 +277,113 @@ describe('Description component', () => {
expect(findModal().props('visible')).toBe(false);
});
- it('opens a modal when a button on popover is clicked and displays correct title', async () => {
- findConvertToTaskButton().vm.$emit('click');
- expect(showModal).toHaveBeenCalled();
- await nextTick();
+ it('opens a modal when a button is clicked and displays correct title', async () => {
+ await findConvertToTaskButton().trigger('click');
expect(findCreateWorkItem().props('initialTitle').trim()).toBe('todo 1');
});
- it('closes the modal on `closeCreateTaskModal` event', () => {
- findConvertToTaskButton().vm.$emit('click');
+ it('closes the modal on `closeCreateTaskModal` event', async () => {
+ await findConvertToTaskButton().trigger('click');
findCreateWorkItem().vm.$emit('closeModal');
expect(hideModal).toHaveBeenCalled();
});
- it('updates description HTML on `onCreate` event', async () => {
- const newTitle = 'New title';
- findConvertToTaskButton().vm.$emit('click');
- findCreateWorkItem().vm.$emit('onCreate', { title: newTitle });
+ it('emits `updateDescription` on `onCreate` event', () => {
+ const newDescription = `<p>New description</p>`;
+ findCreateWorkItem().vm.$emit('onCreate', newDescription);
expect(hideModal).toHaveBeenCalled();
- await nextTick();
+ expect(wrapper.emitted('updateDescription')).toEqual([[newDescription]]);
+ });
+
+ it('shows toast after delete success', async () => {
+ findWorkItemDetailModal().vm.$emit('workItemDeleted');
- expect(findTaskSvg().exists()).toBe(true);
- expect(wrapper.text()).toContain(newTitle);
+ expect($toast.show).toHaveBeenCalledWith('Work item deleted');
});
});
describe('work items detail', () => {
- const id = '1';
- const title = 'my first task';
- const type = 'task';
+ const findTaskLink = () => wrapper.find('a.gfm-issue');
- const createThenClickOnTask = () => {
- findConvertToTaskButton().vm.$emit('click');
- findCreateWorkItem().vm.$emit('onCreate', { id, title, type });
- return wrapper.findByRole('button', { name: title }).trigger('click');
- };
-
- beforeEach(() => {
- createComponent({
- props: {
- descriptionHtml: descriptionHtmlWithCheckboxes,
- },
- provide: {
- glFeatures: { workItems: true },
- },
+ describe('when opening and closing', () => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ descriptionHtml: descriptionHtmlWithTask,
+ },
+ provide: {
+ glFeatures: { workItems: true },
+ },
+ });
+ return nextTick();
});
- return nextTick();
- });
- it('opens when task button is clicked', async () => {
- expect(findWorkItemDetailModal().props('visible')).toBe(false);
+ it('opens when task button is clicked', async () => {
+ expect(findWorkItemDetailModal().props('visible')).toBe(false);
- await createThenClickOnTask();
+ await findTaskLink().trigger('click');
- expect(findWorkItemDetailModal().props('visible')).toBe(true);
- });
+ expect(findWorkItemDetailModal().props('visible')).toBe(true);
+ expect(updateHistory).toHaveBeenCalledWith({
+ url: `${TEST_HOST}/?work_item_id=2`,
+ replace: true,
+ });
+ });
- it('closes from an open state', async () => {
- await createThenClickOnTask();
+ it('closes from an open state', async () => {
+ await findTaskLink().trigger('click');
- expect(findWorkItemDetailModal().props('visible')).toBe(true);
+ expect(findWorkItemDetailModal().props('visible')).toBe(true);
- findWorkItemDetailModal().vm.$emit('close');
- await nextTick();
+ findWorkItemDetailModal().vm.$emit('close');
+ await nextTick();
- expect(findWorkItemDetailModal().props('visible')).toBe(false);
- });
+ expect(findWorkItemDetailModal().props('visible')).toBe(false);
+ expect(updateHistory).toHaveBeenLastCalledWith({
+ url: `${TEST_HOST}/`,
+ replace: true,
+ });
+ });
- it('shows error on error', async () => {
- const message = 'I am error';
+ it('tracks when opened', async () => {
+ const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
- await createThenClickOnTask();
- findWorkItemDetailModal().vm.$emit('error', message);
+ await findTaskLink().trigger('click');
- expect(createFlash).toHaveBeenCalledWith({ message });
+ expect(trackingSpy).toHaveBeenCalledWith(
+ 'workItems:show',
+ 'viewed_work_item_from_modal',
+ {
+ category: 'workItems:show',
+ label: 'work_item_view',
+ property: 'type_task',
+ },
+ );
+ });
});
- it('tracks when opened', async () => {
- const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
-
- await createThenClickOnTask();
-
- expect(trackingSpy).toHaveBeenCalledWith('workItems:show', 'viewed_work_item_from_modal', {
- category: 'workItems:show',
- label: 'work_item_view',
- property: 'type_task',
- });
+ describe('when url query `work_item_id` exists', () => {
+ it.each`
+ behavior | workItemId | visible
+ ${'opens'} | ${'123'} | ${true}
+ ${'does not open'} | ${'123e'} | ${false}
+ ${'does not open'} | ${'12e3'} | ${false}
+ ${'does not open'} | ${'1e23'} | ${false}
+ ${'does not open'} | ${'x'} | ${false}
+ ${'does not open'} | ${'undefined'} | ${false}
+ `(
+ '$behavior when url contains `work_item_id=$workItemId`',
+ async ({ workItemId, visible }) => {
+ setWindowLocation(`?work_item_id=${workItemId}`);
+
+ createComponent({
+ props: { descriptionHtml: descriptionHtmlWithTask },
+ provide: { glFeatures: { workItems: true } },
+ });
+
+ expect(findWorkItemDetailModal().props('visible')).toBe(visible);
+ },
+ );
});
});
});
diff --git a/spec/frontend/issues/show/components/fields/description_spec.js b/spec/frontend/issues/show/components/fields/description_spec.js
index dd511c3945c..0dcd70ac19b 100644
--- a/spec/frontend/issues/show/components/fields/description_spec.js
+++ b/spec/frontend/issues/show/components/fields/description_spec.js
@@ -14,9 +14,8 @@ describe('Description field component', () => {
propsData: {
markdownPreviewPath: '/',
markdownDocsPath: '/',
- formState: {
- description,
- },
+ quickActionsDocsPath: '/',
+ value: description,
},
stubs: {
MarkdownField,
diff --git a/spec/frontend/issues/show/components/fields/description_template_spec.js b/spec/frontend/issues/show/components/fields/description_template_spec.js
index abe2805e5b2..79a3bfa9840 100644
--- a/spec/frontend/issues/show/components/fields/description_template_spec.js
+++ b/spec/frontend/issues/show/components/fields/description_template_spec.js
@@ -1,74 +1,65 @@
-import Vue from 'vue';
+import { shallowMount } from '@vue/test-utils';
import descriptionTemplate from '~/issues/show/components/fields/description_template.vue';
describe('Issue description template component with templates as hash', () => {
- let vm;
- let formState;
+ let wrapper;
+ const defaultOptions = {
+ propsData: {
+ value: 'test',
+ issuableTemplates: {
+ test: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
+ },
+ projectId: 1,
+ projectPath: '/',
+ namespacePath: '/',
+ projectNamespace: '/',
+ },
+ };
- beforeEach(() => {
- const Component = Vue.extend(descriptionTemplate);
- formState = {
- description: 'test',
- };
+ const findIssuableSelector = () => wrapper.find('.js-issuable-selector');
- vm = new Component({
- propsData: {
- formState,
- issuableTemplates: {
- test: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
- },
- projectId: 1,
- projectPath: '/',
- namespacePath: '/',
- projectNamespace: '/',
- },
- }).$mount();
+ const createComponent = (options = defaultOptions) => {
+ wrapper = shallowMount(descriptionTemplate, options);
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
});
it('renders templates as JSON hash in data attribute', () => {
- expect(vm.$el.querySelector('.js-issuable-selector').getAttribute('data-data')).toBe(
+ createComponent();
+ expect(findIssuableSelector().attributes('data-data')).toBe(
'{"test":[{"name":"test","id":"test","project_path":"/","namespace_path":"/"}]}',
);
});
- it('updates formState when changing template', () => {
- vm.issuableTemplate.editor.setValue('test new template');
+ it('emits input event', () => {
+ createComponent();
+ wrapper.vm.issuableTemplate.editor.setValue('test new template');
- expect(formState.description).toBe('test new template');
+ expect(wrapper.emitted('input')).toEqual([['test new template']]);
});
- it('returns formState description with editor getValue', () => {
- formState.description = 'testing new template';
-
- expect(vm.issuableTemplate.editor.getValue()).toBe('testing new template');
+ it('returns value with editor getValue', () => {
+ createComponent();
+ expect(wrapper.vm.issuableTemplate.editor.getValue()).toBe('test');
});
-});
-
-describe('Issue description template component with templates as array', () => {
- let vm;
- let formState;
- beforeEach(() => {
- const Component = Vue.extend(descriptionTemplate);
- formState = {
- description: 'test',
- };
-
- vm = new Component({
- propsData: {
- formState,
- issuableTemplates: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
- projectId: 1,
- projectPath: '/',
- namespacePath: '/',
- projectNamespace: '/',
- },
- }).$mount();
- });
-
- it('renders templates as JSON array in data attribute', () => {
- expect(vm.$el.querySelector('.js-issuable-selector').getAttribute('data-data')).toBe(
- '[{"name":"test","id":"test","project_path":"/","namespace_path":"/"}]',
- );
+ describe('Issue description template component with templates as array', () => {
+ it('renders templates as JSON array in data attribute', () => {
+ createComponent({
+ propsData: {
+ value: 'test',
+ issuableTemplates: [{ name: 'test', id: 'test', project_path: '/', namespace_path: '/' }],
+ projectId: 1,
+ projectPath: '/',
+ namespacePath: '/',
+ projectNamespace: '/',
+ },
+ });
+ expect(findIssuableSelector().attributes('data-data')).toBe(
+ '[{"name":"test","id":"test","project_path":"/","namespace_path":"/"}]',
+ );
+ });
});
});
diff --git a/spec/frontend/issues/show/components/fields/title_spec.js b/spec/frontend/issues/show/components/fields/title_spec.js
index efd0b6fbd30..de04405d89b 100644
--- a/spec/frontend/issues/show/components/fields/title_spec.js
+++ b/spec/frontend/issues/show/components/fields/title_spec.js
@@ -12,9 +12,7 @@ describe('Title field component', () => {
wrapper = shallowMount(TitleField, {
propsData: {
- formState: {
- title: 'test',
- },
+ value: 'test',
},
});
});
diff --git a/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js b/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js
index 20c6cda33d4..35acca60de7 100644
--- a/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js
+++ b/spec/frontend/issues/show/components/incidents/incident_tabs_spec.js
@@ -34,8 +34,9 @@ describe('Incident Tabs component', () => {
provide: {
fullPath: '',
iid: '',
+ projectId: '',
uploadMetricsFeatureAvailable: true,
- glFeatures: { incidentTimelineEventTab: true, incidentTimelineEvents: true },
+ glFeatures: { incidentTimeline: true, incidentTimelineEvents: true },
},
data() {
return { alert: mockAlert, ...data };
@@ -57,7 +58,6 @@ describe('Incident Tabs component', () => {
const findTabs = () => wrapper.findAll(GlTab);
const findSummaryTab = () => findTabs().at(0);
- const findMetricsTab = () => wrapper.find('[data-testid="metrics-tab"]');
const findAlertDetailsTab = () => wrapper.find('[data-testid="alert-details-tab"]');
const findAlertDetailsComponent = () => wrapper.find(AlertDetailsTable);
const findDescriptionComponent = () => wrapper.find(DescriptionComponent);
@@ -111,20 +111,6 @@ describe('Incident Tabs component', () => {
});
});
- describe('upload metrics feature available', () => {
- it('shows the metric tab when metrics are available', () => {
- mountComponent({}, { provide: { uploadMetricsFeatureAvailable: true } });
-
- expect(findMetricsTab().exists()).toBe(true);
- });
-
- it('hides the tab when metrics are not available', () => {
- mountComponent({}, { provide: { uploadMetricsFeatureAvailable: false } });
-
- expect(findMetricsTab().exists()).toBe(false);
- });
- });
-
describe('Snowplow tracking', () => {
beforeEach(() => {
jest.spyOn(Tracking, 'event');
diff --git a/spec/frontend/issues/show/mock_data/mock_data.js b/spec/frontend/issues/show/mock_data/mock_data.js
index 89653ff82b2..7b0b8ca686a 100644
--- a/spec/frontend/issues/show/mock_data/mock_data.js
+++ b/spec/frontend/issues/show/mock_data/mock_data.js
@@ -72,3 +72,18 @@ export const descriptionHtmlWithCheckboxes = `
</li>
</ul>
`;
+
+export const descriptionHtmlWithTask = `
+ <ul data-sourcepos="1:1-3:7" class="task-list" dir="auto">
+ <li data-sourcepos="1:1-1:10" class="task-list-item">
+ <input type="checkbox" class="task-list-item-checkbox" disabled>
+ <a href="/gitlab-org/gitlab-test/-/issues/48" data-original="#48+" data-link="false" data-link-reference="false" data-project="1" data-issue="2" data-reference-format="+" data-reference-type="task" data-container="body" data-placement="top" title="1" class="gfm gfm-issue has-tooltip">1 (#48)</a>
+ </li>
+ <li data-sourcepos="2:1-2:7" class="task-list-item">
+ <input type="checkbox" class="task-list-item-checkbox" disabled> 2
+ </li>
+ <li data-sourcepos="3:1-3:7" class="task-list-item">
+ <input type="checkbox" class="task-list-item-checkbox" disabled> 3
+ </li>
+ </ul>
+`;
diff --git a/spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js b/spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js
index b0d5859cd31..3d7bf7acb41 100644
--- a/spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js
@@ -72,7 +72,7 @@ describe('GroupsListItem', () => {
expect(addSubscriptionSpy).toHaveBeenCalledWith(mockSubscriptionPath, mockGroup1.full_path);
expect(persistAlert).toHaveBeenCalledWith({
- linkUrl: '/help/integration/jira_development_panel.html#usage',
+ linkUrl: '/help/integration/jira_development_panel.html#use-the-integration',
message:
'You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}',
title: 'Namespace successfully linked',
diff --git a/spec/frontend/jira_connect/subscriptions/components/app_spec.js b/spec/frontend/jira_connect/subscriptions/components/app_spec.js
index 6b3ca7ffd65..ce02144f22f 100644
--- a/spec/frontend/jira_connect/subscriptions/components/app_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/components/app_spec.js
@@ -6,10 +6,12 @@ import JiraConnectApp from '~/jira_connect/subscriptions/components/app.vue';
import SignInPage from '~/jira_connect/subscriptions/pages/sign_in.vue';
import SubscriptionsPage from '~/jira_connect/subscriptions/pages/subscriptions.vue';
import UserLink from '~/jira_connect/subscriptions/components/user_link.vue';
+import BrowserSupportAlert from '~/jira_connect/subscriptions/components/browser_support_alert.vue';
import createStore from '~/jira_connect/subscriptions/store';
import { SET_ALERT } from '~/jira_connect/subscriptions/store/mutation_types';
import { I18N_DEFAULT_SIGN_IN_ERROR_MESSAGE } from '~/jira_connect/subscriptions/constants';
import { __ } from '~/locale';
+import AccessorUtilities from '~/lib/utils/accessor';
import { mockSubscription } from '../mock_data';
jest.mock('~/jira_connect/subscriptions/utils', () => ({
@@ -26,6 +28,7 @@ describe('JiraConnectApp', () => {
const findSignInPage = () => wrapper.findComponent(SignInPage);
const findSubscriptionsPage = () => wrapper.findComponent(SubscriptionsPage);
const findUserLink = () => wrapper.findComponent(UserLink);
+ const findBrowserSupportAlert = () => wrapper.findComponent(BrowserSupportAlert);
const createComponent = ({ provide, mountFn = shallowMountExtended } = {}) => {
store = createStore();
@@ -207,4 +210,29 @@ describe('JiraConnectApp', () => {
});
});
});
+
+ describe.each`
+ jiraConnectOauthEnabled | canUseCrypto | shouldShowAlert
+ ${false} | ${false} | ${false}
+ ${false} | ${true} | ${false}
+ ${true} | ${false} | ${true}
+ ${true} | ${true} | ${false}
+ `(
+ 'when `jiraConnectOauth` feature flag is $jiraConnectOauthEnabled and `AccessorUtilities.canUseCrypto` returns $canUseCrypto',
+ ({ jiraConnectOauthEnabled, canUseCrypto, shouldShowAlert }) => {
+ beforeEach(() => {
+ jest.spyOn(AccessorUtilities, 'canUseCrypto').mockReturnValue(canUseCrypto);
+
+ createComponent({ provide: { glFeatures: { jiraConnectOauth: jiraConnectOauthEnabled } } });
+ });
+
+ it(`does ${shouldShowAlert ? '' : 'not'} render BrowserSupportAlert component`, () => {
+ expect(findBrowserSupportAlert().exists()).toBe(shouldShowAlert);
+ });
+
+ it(`does ${!shouldShowAlert ? '' : 'not'} render the main Jira Connect app template`, () => {
+ expect(wrapper.findByTestId('jira-connect-app').exists()).toBe(!shouldShowAlert);
+ });
+ },
+ );
});
diff --git a/spec/frontend/jira_connect/subscriptions/components/browser_support_alert_spec.js b/spec/frontend/jira_connect/subscriptions/components/browser_support_alert_spec.js
new file mode 100644
index 00000000000..aa93a6be3c8
--- /dev/null
+++ b/spec/frontend/jira_connect/subscriptions/components/browser_support_alert_spec.js
@@ -0,0 +1,37 @@
+import { GlAlert, GlLink } from '@gitlab/ui';
+import { shallowMount, mount } from '@vue/test-utils';
+import BrowserSupportAlert from '~/jira_connect/subscriptions/components/browser_support_alert.vue';
+
+describe('BrowserSupportAlert', () => {
+ let wrapper;
+
+ const createComponent = ({ mountFn = shallowMount } = {}) => {
+ wrapper = mountFn(BrowserSupportAlert);
+ };
+
+ const findAlert = () => wrapper.findComponent(GlAlert);
+ const findLink = () => wrapper.findComponent(GlLink);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('displays a non-dismissible alert', () => {
+ createComponent();
+
+ expect(findAlert().exists()).toBe(true);
+ expect(findAlert().props()).toMatchObject({
+ dismissible: false,
+ title: BrowserSupportAlert.i18n.title,
+ variant: 'danger',
+ });
+ });
+
+ it('renders help link with target="_blank" and rel="noopener noreferrer"', () => {
+ createComponent({ mountFn: mount });
+ expect(findLink().attributes()).toMatchObject({
+ target: '_blank',
+ rel: 'noopener',
+ });
+ });
+});
diff --git a/spec/frontend/jira_connect/subscriptions/components/compatibility_alert_spec.js b/spec/frontend/jira_connect/subscriptions/components/compatibility_alert_spec.js
index f8ee8c2c664..5f38a0acb9d 100644
--- a/spec/frontend/jira_connect/subscriptions/components/compatibility_alert_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/components/compatibility_alert_spec.js
@@ -29,7 +29,7 @@ describe('CompatibilityAlert', () => {
createComponent({ mountFn: mount });
expect(findLink().attributes()).toMatchObject({
target: '_blank',
- rel: 'noopener noreferrer',
+ rel: 'noopener',
});
});
diff --git a/spec/frontend/jira_connect/subscriptions/pages/sign_in_spec.js b/spec/frontend/jira_connect/subscriptions/pages/sign_in_spec.js
index 175896c4ab0..97d1b077164 100644
--- a/spec/frontend/jira_connect/subscriptions/pages/sign_in_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/pages/sign_in_spec.js
@@ -5,7 +5,7 @@ import SignInLegacyButton from '~/jira_connect/subscriptions/components/sign_in_
import SignInOauthButton from '~/jira_connect/subscriptions/components/sign_in_oauth_button.vue';
import SubscriptionsList from '~/jira_connect/subscriptions/components/subscriptions_list.vue';
import createStore from '~/jira_connect/subscriptions/store';
-import { I18N_DEFAULT_SIGN_IN_BUTTON_TEXT } from '../../../../../app/assets/javascripts/jira_connect/subscriptions/constants';
+import { I18N_DEFAULT_SIGN_IN_BUTTON_TEXT } from '~/jira_connect/subscriptions/constants';
jest.mock('~/jira_connect/subscriptions/utils');
diff --git a/spec/frontend/jira_import/components/jira_import_form_spec.js b/spec/frontend/jira_import/components/jira_import_form_spec.js
index 7a550d85204..41d3cd46d01 100644
--- a/spec/frontend/jira_import/components/jira_import_form_spec.js
+++ b/spec/frontend/jira_import/components/jira_import_form_spec.js
@@ -6,7 +6,7 @@ import {
GlFormSelect,
GlLabel,
GlSearchBoxByType,
- GlTable,
+ GlTableLite,
} from '@gitlab/ui';
import { getByRole } from '@testing-library/dom';
import { mount, shallowMount } from '@vue/test-utils';
@@ -34,19 +34,19 @@ describe('JiraImportForm', () => {
const currentUsername = 'mrgitlab';
- const getAlert = () => wrapper.find(GlAlert);
+ const getAlert = () => wrapper.findComponent(GlAlert);
- const getSelectDropdown = () => wrapper.find(GlFormSelect);
+ const getSelectDropdown = () => wrapper.findComponent(GlFormSelect);
- const getContinueButton = () => wrapper.find(GlButton);
+ const getContinueButton = () => wrapper.findComponent(GlButton);
- const getCancelButton = () => wrapper.findAll(GlButton).at(1);
+ const getCancelButton = () => wrapper.findAllComponents(GlButton).at(1);
- const getLabel = () => wrapper.find(GlLabel);
+ const getLabel = () => wrapper.findComponent(GlLabel);
- const getTable = () => wrapper.find(GlTable);
+ const getTable = () => wrapper.findComponent(GlTableLite);
- const getUserDropdown = () => getTable().find(GlDropdown);
+ const getUserDropdown = () => getTable().findComponent(GlDropdown);
const getHeader = (name) => getByRole(wrapper.element, 'columnheader', { name });
@@ -107,14 +107,13 @@ describe('JiraImportForm', () => {
mutateSpy.mockRestore();
querySpy.mockRestore();
wrapper.destroy();
- wrapper = null;
});
describe('select dropdown project selection', () => {
it('is shown', () => {
wrapper = mountComponent();
- expect(wrapper.find(GlFormSelect).exists()).toBe(true);
+ expect(getSelectDropdown().exists()).toBe(true);
});
it('contains a list of Jira projects to select from', () => {
@@ -273,7 +272,7 @@ describe('JiraImportForm', () => {
wrapper = mountComponent({ mountFunction: mount });
- wrapper.find(GlSearchBoxByType).vm.$emit('input', 'fred');
+ wrapper.findComponent(GlSearchBoxByType).vm.$emit('input', 'fred');
});
it('makes a GraphQL call', () => {
diff --git a/spec/frontend/jobs/components/filtered_search/jobs_filtered_search_spec.js b/spec/frontend/jobs/components/filtered_search/jobs_filtered_search_spec.js
new file mode 100644
index 00000000000..322cfa3ba1f
--- /dev/null
+++ b/spec/frontend/jobs/components/filtered_search/jobs_filtered_search_spec.js
@@ -0,0 +1,49 @@
+import { GlFilteredSearch } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
+import JobsFilteredSearch from '~/jobs/components/filtered_search/jobs_filtered_search.vue';
+import { mockFailedSearchToken } from '../../mock_data';
+
+describe('Jobs filtered search', () => {
+ let wrapper;
+
+ const findFilteredSearch = () => wrapper.findComponent(GlFilteredSearch);
+ const getSearchToken = (type) =>
+ findFilteredSearch()
+ .props('availableTokens')
+ .find((token) => token.type === type);
+
+ const findStatusToken = () => getSearchToken('status');
+
+ const createComponent = () => {
+ wrapper = shallowMount(JobsFilteredSearch);
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('displays filtered search', () => {
+ expect(findFilteredSearch().exists()).toBe(true);
+ });
+
+ it('displays status token', () => {
+ expect(findStatusToken()).toMatchObject({
+ type: 'status',
+ icon: 'status',
+ title: 'Status',
+ unique: true,
+ operators: OPERATOR_IS_ONLY,
+ });
+ });
+
+ it('emits filter token to parent component', () => {
+ findFilteredSearch().vm.$emit('submit', mockFailedSearchToken);
+
+ expect(wrapper.emitted('filterJobsBySearch')).toEqual([[mockFailedSearchToken]]);
+ });
+});
diff --git a/spec/frontend/jobs/components/filtered_search/tokens/job_status_token_spec.js b/spec/frontend/jobs/components/filtered_search/tokens/job_status_token_spec.js
new file mode 100644
index 00000000000..ce8e482cc16
--- /dev/null
+++ b/spec/frontend/jobs/components/filtered_search/tokens/job_status_token_spec.js
@@ -0,0 +1,57 @@
+import { GlFilteredSearchToken, GlFilteredSearchSuggestion, GlIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { stubComponent } from 'helpers/stub_component';
+import JobStatusToken from '~/jobs/components/filtered_search/tokens/job_status_token.vue';
+
+describe('Job Status Token', () => {
+ let wrapper;
+
+ const findFilteredSearchToken = () => wrapper.findComponent(GlFilteredSearchToken);
+ const findAllFilteredSearchSuggestions = () =>
+ wrapper.findAllComponents(GlFilteredSearchSuggestion);
+ const findAllGlIcons = () => wrapper.findAllComponents(GlIcon);
+
+ const defaultProps = {
+ config: {
+ type: 'status',
+ icon: 'status',
+ title: 'Status',
+ unique: true,
+ },
+ value: {
+ data: '',
+ },
+ };
+
+ const createComponent = () => {
+ wrapper = shallowMount(JobStatusToken, {
+ propsData: {
+ ...defaultProps,
+ },
+ stubs: {
+ GlFilteredSearchToken: stubComponent(GlFilteredSearchToken, {
+ template: `<div><slot name="suggestions"></slot></div>`,
+ }),
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('passes config correctly', () => {
+ expect(findFilteredSearchToken().props('config')).toEqual(defaultProps.config);
+ });
+
+ it('renders all job statuses available', () => {
+ const expectedLength = 11;
+
+ expect(findAllFilteredSearchSuggestions()).toHaveLength(expectedLength);
+ expect(findAllGlIcons()).toHaveLength(expectedLength);
+ });
+});
diff --git a/spec/frontend/jobs/components/job_app_spec.js b/spec/frontend/jobs/components/job_app_spec.js
index 06ebcd7f134..9abe66b4696 100644
--- a/spec/frontend/jobs/components/job_app_spec.js
+++ b/spec/frontend/jobs/components/job_app_spec.js
@@ -375,8 +375,8 @@ describe('Job App', () => {
});
describe('sidebar', () => {
- it('has no blank blocks', (done) => {
- setupAndMount({
+ it('has no blank blocks', async () => {
+ await setupAndMount({
jobData: {
duration: null,
finished_at: null,
@@ -387,17 +387,14 @@ describe('Job App', () => {
tags: [],
cancel_path: null,
},
- })
- .then(() => {
- const blocks = wrapper.findAll('.blocks-container > *').wrappers;
- expect(blocks.length).toBeGreaterThan(0);
-
- blocks.forEach((block) => {
- expect(block.text().trim()).not.toBe('');
- });
- })
- .then(done)
- .catch(done.fail);
+ });
+
+ const blocks = wrapper.findAll('.blocks-container > *').wrappers;
+ expect(blocks.length).toBeGreaterThan(0);
+
+ blocks.forEach((block) => {
+ expect(block.text().trim()).not.toBe('');
+ });
});
});
});
diff --git a/spec/frontend/jobs/components/table/graphql/cache_config_spec.js b/spec/frontend/jobs/components/table/graphql/cache_config_spec.js
index ac79186cb46..88c97285b85 100644
--- a/spec/frontend/jobs/components/table/graphql/cache_config_spec.js
+++ b/spec/frontend/jobs/components/table/graphql/cache_config_spec.js
@@ -33,6 +33,26 @@ describe('jobs/components/table/graphql/cache_config', () => {
);
});
+ it('should not add to existing cache if the incoming elements are the same', () => {
+ // simulate that this is the last page
+ const finalExistingCache = {
+ ...CIJobConnectionExistingCache,
+ pageInfo: {
+ hasNextPage: false,
+ },
+ };
+
+ const res = cacheConfig.typePolicies.CiJobConnection.merge(
+ CIJobConnectionExistingCache,
+ finalExistingCache,
+ {
+ args: firstLoadArgs,
+ },
+ );
+
+ expect(res.nodes).toHaveLength(CIJobConnectionExistingCache.nodes.length);
+ });
+
it('should contain the pageInfo key as part of the result', () => {
const res = cacheConfig.typePolicies.CiJobConnection.merge({}, CIJobConnectionIncomingCache, {
args: firstLoadArgs,
diff --git a/spec/frontend/jobs/components/table/job_table_app_spec.js b/spec/frontend/jobs/components/table/job_table_app_spec.js
index 4d51624dfff..986fba21fb9 100644
--- a/spec/frontend/jobs/components/table/job_table_app_spec.js
+++ b/spec/frontend/jobs/components/table/job_table_app_spec.js
@@ -1,30 +1,48 @@
-import { GlSkeletonLoader, GlAlert, GlEmptyState, GlIntersectionObserver } from '@gitlab/ui';
+import {
+ GlSkeletonLoader,
+ GlAlert,
+ GlEmptyState,
+ GlIntersectionObserver,
+ GlLoadingIcon,
+} from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import { s__ } from '~/locale';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
import getJobsQuery from '~/jobs/components/table/graphql/queries/get_jobs.query.graphql';
import JobsTable from '~/jobs/components/table/jobs_table.vue';
import JobsTableApp from '~/jobs/components/table/jobs_table_app.vue';
import JobsTableTabs from '~/jobs/components/table/jobs_table_tabs.vue';
-import { mockJobsQueryResponse, mockJobsQueryEmptyResponse } from '../../mock_data';
+import JobsFilteredSearch from '~/jobs/components/filtered_search/jobs_filtered_search.vue';
+import {
+ mockJobsQueryResponse,
+ mockJobsQueryEmptyResponse,
+ mockFailedSearchToken,
+} from '../../mock_data';
const projectPath = 'gitlab-org/gitlab';
Vue.use(VueApollo);
+jest.mock('~/flash');
+
describe('Job table app', () => {
let wrapper;
+ let jobsTableVueSearch = true;
const successHandler = jest.fn().mockResolvedValue(mockJobsQueryResponse);
const failedHandler = jest.fn().mockRejectedValue(new Error('GraphQL error'));
const emptyHandler = jest.fn().mockResolvedValue(mockJobsQueryEmptyResponse);
const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
+ const findLoadingSpinner = () => wrapper.findComponent(GlLoadingIcon);
const findTable = () => wrapper.findComponent(JobsTable);
const findTabs = () => wrapper.findComponent(JobsTableTabs);
const findAlert = () => wrapper.findComponent(GlAlert);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+ const findFilteredSearch = () => wrapper.findComponent(JobsFilteredSearch);
const triggerInfiniteScroll = () =>
wrapper.findComponent(GlIntersectionObserver).vm.$emit('appear');
@@ -48,6 +66,7 @@ describe('Job table app', () => {
},
provide: {
fullPath: projectPath,
+ glFeatures: { jobsTableVueSearch },
},
apolloProvider: createMockApolloProvider(handler),
});
@@ -58,11 +77,21 @@ describe('Job table app', () => {
});
describe('loading state', () => {
- it('should display skeleton loader when loading', () => {
+ beforeEach(() => {
createComponent();
+ });
+ it('should display skeleton loader when loading', () => {
expect(findSkeletonLoader().exists()).toBe(true);
expect(findTable().exists()).toBe(false);
+ expect(findLoadingSpinner().exists()).toBe(false);
+ });
+
+ it('when switching tabs only the skeleton loader should show', () => {
+ findTabs().vm.$emit('fetchJobsByStatus', null);
+
+ expect(findSkeletonLoader().exists()).toBe(true);
+ expect(findLoadingSpinner().exists()).toBe(false);
});
});
@@ -76,6 +105,7 @@ describe('Job table app', () => {
it('should display the jobs table with data', () => {
expect(findTable().exists()).toBe(true);
expect(findSkeletonLoader().exists()).toBe(false);
+ expect(findLoadingSpinner().exists()).toBe(false);
});
it('should refetch jobs query on fetchJobsByStatus event', async () => {
@@ -98,8 +128,12 @@ describe('Job table app', () => {
});
it('handles infinite scrolling by calling fetch more', async () => {
+ expect(findLoadingSpinner().exists()).toBe(true);
+
await waitForPromises();
+ expect(findLoadingSpinner().exists()).toBe(false);
+
expect(successHandler).toHaveBeenCalledWith({
after: 'eyJpZCI6IjIzMTcifQ',
fullPath: 'gitlab-org/gitlab',
@@ -137,4 +171,69 @@ describe('Job table app', () => {
expect(findTable().exists()).toBe(true);
});
});
+
+ describe('filtered search', () => {
+ it('should display filtered search', () => {
+ createComponent();
+
+ expect(findFilteredSearch().exists()).toBe(true);
+ });
+
+ // this test should be updated once BE supports tab and filtered search filtering
+ // https://gitlab.com/gitlab-org/gitlab/-/issues/356210
+ it.each`
+ scope | shouldDisplay
+ ${null} | ${true}
+ ${['FAILED', 'SUCCESS', 'CANCELED']} | ${false}
+ `(
+ 'with tab scope $scope the filtered search displays $shouldDisplay',
+ async ({ scope, shouldDisplay }) => {
+ createComponent();
+
+ await waitForPromises();
+
+ await findTabs().vm.$emit('fetchJobsByStatus', scope);
+
+ expect(findFilteredSearch().exists()).toBe(shouldDisplay);
+ },
+ );
+
+ it('refetches jobs query when filtering', async () => {
+ createComponent();
+
+ jest.spyOn(wrapper.vm.$apollo.queries.jobs, 'refetch').mockImplementation(jest.fn());
+
+ expect(wrapper.vm.$apollo.queries.jobs.refetch).toHaveBeenCalledTimes(0);
+
+ await findFilteredSearch().vm.$emit('filterJobsBySearch', [mockFailedSearchToken]);
+
+ expect(wrapper.vm.$apollo.queries.jobs.refetch).toHaveBeenCalledTimes(1);
+ });
+
+ it('shows raw text warning when user inputs raw text', async () => {
+ const expectedWarning = {
+ message: s__(
+ 'Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens.',
+ ),
+ type: 'warning',
+ };
+
+ createComponent();
+
+ jest.spyOn(wrapper.vm.$apollo.queries.jobs, 'refetch').mockImplementation(jest.fn());
+
+ await findFilteredSearch().vm.$emit('filterJobsBySearch', ['raw text']);
+
+ expect(createFlash).toHaveBeenCalledWith(expectedWarning);
+ expect(wrapper.vm.$apollo.queries.jobs.refetch).toHaveBeenCalledTimes(0);
+ });
+
+ it('should not display filtered search', () => {
+ jobsTableVueSearch = false;
+
+ createComponent();
+
+ expect(findFilteredSearch().exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/jobs/components/table/jobs_table_tabs_spec.js b/spec/frontend/jobs/components/table/jobs_table_tabs_spec.js
index ac9b45be932..23632001060 100644
--- a/spec/frontend/jobs/components/table/jobs_table_tabs_spec.js
+++ b/spec/frontend/jobs/components/table/jobs_table_tabs_spec.js
@@ -1,3 +1,4 @@
+import { GlTab } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { trimText } from 'helpers/text_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
@@ -7,16 +8,31 @@ describe('Jobs Table Tabs', () => {
let wrapper;
const defaultProps = {
- jobCounts: { all: 848, pending: 0, running: 0, finished: 704 },
+ allJobsCount: 286,
+ loading: false,
};
- const findTab = (testId) => wrapper.findByTestId(testId);
+ const statuses = {
+ success: 'SUCCESS',
+ failed: 'FAILED',
+ canceled: 'CANCELED',
+ };
+
+ const findAllTab = () => wrapper.findByTestId('jobs-all-tab');
+ const findFinishedTab = () => wrapper.findByTestId('jobs-finished-tab');
+
+ const triggerTabChange = (index) => wrapper.findAllComponents(GlTab).at(index).vm.$emit('click');
- const createComponent = () => {
+ const createComponent = (props = defaultProps) => {
wrapper = extendedWrapper(
mount(JobsTableTabs, {
provide: {
- ...defaultProps,
+ jobStatuses: {
+ ...statuses,
+ },
+ },
+ propsData: {
+ ...props,
},
}),
);
@@ -30,13 +46,21 @@ describe('Jobs Table Tabs', () => {
wrapper.destroy();
});
+ it('displays All tab with count', () => {
+ expect(trimText(findAllTab().text())).toBe(`All ${defaultProps.allJobsCount}`);
+ });
+
+ it('displays Finished tab with no count', () => {
+ expect(findFinishedTab().text()).toBe('Finished');
+ });
+
it.each`
- tabId | text | count
- ${'jobs-all-tab'} | ${'All'} | ${defaultProps.jobCounts.all}
- ${'jobs-pending-tab'} | ${'Pending'} | ${defaultProps.jobCounts.pending}
- ${'jobs-running-tab'} | ${'Running'} | ${defaultProps.jobCounts.running}
- ${'jobs-finished-tab'} | ${'Finished'} | ${defaultProps.jobCounts.finished}
- `('displays the right tab text and badge count', ({ tabId, text, count }) => {
- expect(trimText(findTab(tabId).text())).toBe(`${text} ${count}`);
+ tabIndex | expectedScope
+ ${0} | ${null}
+ ${1} | ${[statuses.success, statuses.failed, statuses.canceled]}
+ `('emits fetchJobsByStatus with $expectedScope on tab change', ({ tabIndex, expectedScope }) => {
+ triggerTabChange(tabIndex);
+
+ expect(wrapper.emitted()).toEqual({ fetchJobsByStatus: [[expectedScope]] });
});
});
diff --git a/spec/frontend/jobs/components/trigger_block_spec.js b/spec/frontend/jobs/components/trigger_block_spec.js
index e0eb873dc2f..78596612d23 100644
--- a/spec/frontend/jobs/components/trigger_block_spec.js
+++ b/spec/frontend/jobs/components/trigger_block_spec.js
@@ -1,12 +1,12 @@
-import { GlButton, GlTable } from '@gitlab/ui';
+import { GlButton, GlTableLite } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import TriggerBlock from '~/jobs/components/trigger_block.vue';
describe('Trigger block', () => {
let wrapper;
- const findRevealButton = () => wrapper.find(GlButton);
- const findVariableTable = () => wrapper.find(GlTable);
+ const findRevealButton = () => wrapper.findComponent(GlButton);
+ const findVariableTable = () => wrapper.findComponent(GlTableLite);
const findShortToken = () => wrapper.find('[data-testid="trigger-short-token"]');
const findVariableValue = (index) =>
wrapper.findAll('[data-testid="trigger-build-value"]').at(index);
@@ -22,7 +22,6 @@ describe('Trigger block', () => {
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
describe('with short token and no variables', () => {
diff --git a/spec/frontend/jobs/mock_data.js b/spec/frontend/jobs/mock_data.js
index 73b9df1853d..27b6c04eded 100644
--- a/spec/frontend/jobs/mock_data.js
+++ b/spec/frontend/jobs/mock_data.js
@@ -1481,6 +1481,7 @@ export const mockJobsQueryResponse = {
project: {
id: '1',
jobs: {
+ count: 1,
pageInfo: {
endCursor: 'eyJpZCI6IjIzMTcifQ',
hasNextPage: true,
@@ -1911,10 +1912,19 @@ export const CIJobConnectionIncomingCacheRunningStatus = {
};
export const CIJobConnectionExistingCache = {
+ pageInfo: {
+ __typename: 'PageInfo',
+ endCursor: 'eyJpZCI6IjIwNTEifQ',
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: 'eyJpZCI6IjIxNzMifQ',
+ },
nodes: [
- { __ref: 'CiJob:gid://gitlab/Ci::Build/2057' },
- { __ref: 'CiJob:gid://gitlab/Ci::Build/2056' },
- { __ref: 'CiJob:gid://gitlab/Ci::Build/2051' },
+ { __ref: 'CiJob:gid://gitlab/Ci::Build/2100' },
+ { __ref: 'CiJob:gid://gitlab/Ci::Build/2101' },
+ { __ref: 'CiJob:gid://gitlab/Ci::Build/2102' },
],
statuses: 'PENDING',
};
+
+export const mockFailedSearchToken = { type: 'status', value: { data: 'FAILED', operator: '=' } };
diff --git a/spec/frontend/jobs/store/actions_spec.js b/spec/frontend/jobs/store/actions_spec.js
index 16448d6a3ca..b9f97a3c3ae 100644
--- a/spec/frontend/jobs/store/actions_spec.js
+++ b/spec/frontend/jobs/store/actions_spec.js
@@ -39,62 +39,60 @@ describe('Job State actions', () => {
});
describe('setJobEndpoint', () => {
- it('should commit SET_JOB_ENDPOINT mutation', (done) => {
- testAction(
+ it('should commit SET_JOB_ENDPOINT mutation', () => {
+ return testAction(
setJobEndpoint,
'job/872324.json',
mockedState,
[{ type: types.SET_JOB_ENDPOINT, payload: 'job/872324.json' }],
[],
- done,
);
});
});
describe('setJobLogOptions', () => {
- it('should commit SET_JOB_LOG_OPTIONS mutation', (done) => {
- testAction(
+ it('should commit SET_JOB_LOG_OPTIONS mutation', () => {
+ return testAction(
setJobLogOptions,
{ pagePath: 'job/872324/trace.json' },
mockedState,
[{ type: types.SET_JOB_LOG_OPTIONS, payload: { pagePath: 'job/872324/trace.json' } }],
[],
- done,
);
});
});
describe('hideSidebar', () => {
- it('should commit HIDE_SIDEBAR mutation', (done) => {
- testAction(hideSidebar, null, mockedState, [{ type: types.HIDE_SIDEBAR }], [], done);
+ it('should commit HIDE_SIDEBAR mutation', () => {
+ return testAction(hideSidebar, null, mockedState, [{ type: types.HIDE_SIDEBAR }], []);
});
});
describe('showSidebar', () => {
- it('should commit HIDE_SIDEBAR mutation', (done) => {
- testAction(showSidebar, null, mockedState, [{ type: types.SHOW_SIDEBAR }], [], done);
+ it('should commit SHOW_SIDEBAR mutation', () => {
+ return testAction(showSidebar, null, mockedState, [{ type: types.SHOW_SIDEBAR }], []);
});
});
describe('toggleSidebar', () => {
describe('when isSidebarOpen is true', () => {
- it('should dispatch hideSidebar', (done) => {
- testAction(toggleSidebar, null, mockedState, [], [{ type: 'hideSidebar' }], done);
+ it('should dispatch hideSidebar', () => {
+ return testAction(toggleSidebar, null, mockedState, [], [{ type: 'hideSidebar' }]);
});
});
describe('when isSidebarOpen is false', () => {
- it('should dispatch showSidebar', (done) => {
+ it('should dispatch showSidebar', () => {
mockedState.isSidebarOpen = false;
- testAction(toggleSidebar, null, mockedState, [], [{ type: 'showSidebar' }], done);
+ return testAction(toggleSidebar, null, mockedState, [], [{ type: 'showSidebar' }]);
});
});
});
describe('requestJob', () => {
- it('should commit REQUEST_JOB mutation', (done) => {
- testAction(requestJob, null, mockedState, [{ type: types.REQUEST_JOB }], [], done);
+ it('should commit REQUEST_JOB mutation', () => {
+ return testAction(requestJob, null, mockedState, [{ type: types.REQUEST_JOB }], []);
});
});
@@ -113,10 +111,10 @@ describe('Job State actions', () => {
});
describe('success', () => {
- it('dispatches requestJob and receiveJobSuccess ', (done) => {
+ it('dispatches requestJob and receiveJobSuccess ', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`).replyOnce(200, { id: 121212, name: 'karma' });
- testAction(
+ return testAction(
fetchJob,
null,
mockedState,
@@ -130,7 +128,6 @@ describe('Job State actions', () => {
type: 'receiveJobSuccess',
},
],
- done,
);
});
});
@@ -140,8 +137,8 @@ describe('Job State actions', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`).reply(500);
});
- it('dispatches requestJob and receiveJobError ', (done) => {
- testAction(
+ it('dispatches requestJob and receiveJobError ', () => {
+ return testAction(
fetchJob,
null,
mockedState,
@@ -154,46 +151,50 @@ describe('Job State actions', () => {
type: 'receiveJobError',
},
],
- done,
);
});
});
});
describe('receiveJobSuccess', () => {
- it('should commit RECEIVE_JOB_SUCCESS mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_JOB_SUCCESS mutation', () => {
+ return testAction(
receiveJobSuccess,
{ id: 121232132 },
mockedState,
[{ type: types.RECEIVE_JOB_SUCCESS, payload: { id: 121232132 } }],
[],
- done,
);
});
});
describe('receiveJobError', () => {
- it('should commit RECEIVE_JOB_ERROR mutation', (done) => {
- testAction(receiveJobError, null, mockedState, [{ type: types.RECEIVE_JOB_ERROR }], [], done);
+ it('should commit RECEIVE_JOB_ERROR mutation', () => {
+ return testAction(
+ receiveJobError,
+ null,
+ mockedState,
+ [{ type: types.RECEIVE_JOB_ERROR }],
+ [],
+ );
});
});
describe('scrollTop', () => {
- it('should dispatch toggleScrollButtons action', (done) => {
- testAction(scrollTop, null, mockedState, [], [{ type: 'toggleScrollButtons' }], done);
+ it('should dispatch toggleScrollButtons action', () => {
+ return testAction(scrollTop, null, mockedState, [], [{ type: 'toggleScrollButtons' }]);
});
});
describe('scrollBottom', () => {
- it('should dispatch toggleScrollButtons action', (done) => {
- testAction(scrollBottom, null, mockedState, [], [{ type: 'toggleScrollButtons' }], done);
+ it('should dispatch toggleScrollButtons action', () => {
+ return testAction(scrollBottom, null, mockedState, [], [{ type: 'toggleScrollButtons' }]);
});
});
describe('requestJobLog', () => {
- it('should commit REQUEST_JOB_LOG mutation', (done) => {
- testAction(requestJobLog, null, mockedState, [{ type: types.REQUEST_JOB_LOG }], [], done);
+ it('should commit REQUEST_JOB_LOG mutation', () => {
+ return testAction(requestJobLog, null, mockedState, [{ type: types.REQUEST_JOB_LOG }], []);
});
});
@@ -212,13 +213,13 @@ describe('Job State actions', () => {
});
describe('success', () => {
- it('dispatches requestJobLog, receiveJobLogSuccess and stopPollingJobLog when job is complete', (done) => {
+ it('dispatches requestJobLog, receiveJobLogSuccess and stopPollingJobLog when job is complete', () => {
mock.onGet(`${TEST_HOST}/endpoint/trace.json`).replyOnce(200, {
html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
complete: true,
});
- testAction(
+ return testAction(
fetchJobLog,
null,
mockedState,
@@ -239,7 +240,6 @@ describe('Job State actions', () => {
type: 'stopPollingJobLog',
},
],
- done,
);
});
@@ -255,8 +255,8 @@ describe('Job State actions', () => {
mock.onGet(`${TEST_HOST}/endpoint/trace.json`).replyOnce(200, jobLogPayload);
});
- it('dispatches startPollingJobLog', (done) => {
- testAction(
+ it('dispatches startPollingJobLog', () => {
+ return testAction(
fetchJobLog,
null,
mockedState,
@@ -266,14 +266,13 @@ describe('Job State actions', () => {
{ type: 'receiveJobLogSuccess', payload: jobLogPayload },
{ type: 'startPollingJobLog' },
],
- done,
);
});
- it('does not dispatch startPollingJobLog when timeout is non-empty', (done) => {
+ it('does not dispatch startPollingJobLog when timeout is non-empty', () => {
mockedState.jobLogTimeout = 1;
- testAction(
+ return testAction(
fetchJobLog,
null,
mockedState,
@@ -282,7 +281,6 @@ describe('Job State actions', () => {
{ type: 'toggleScrollisInBottom', payload: true },
{ type: 'receiveJobLogSuccess', payload: jobLogPayload },
],
- done,
);
});
});
@@ -293,8 +291,8 @@ describe('Job State actions', () => {
mock.onGet(`${TEST_HOST}/endpoint/trace.json`).reply(500);
});
- it('dispatches requestJobLog and receiveJobLogError ', (done) => {
- testAction(
+ it('dispatches requestJobLog and receiveJobLogError ', () => {
+ return testAction(
fetchJobLog,
null,
mockedState,
@@ -304,7 +302,6 @@ describe('Job State actions', () => {
type: 'receiveJobLogError',
},
],
- done,
);
});
});
@@ -358,65 +355,58 @@ describe('Job State actions', () => {
window.clearTimeout = origTimeout;
});
- it('should commit STOP_POLLING_JOB_LOG mutation ', (done) => {
+ it('should commit STOP_POLLING_JOB_LOG mutation ', async () => {
const jobLogTimeout = 7;
- testAction(
+ await testAction(
stopPollingJobLog,
null,
{ ...mockedState, jobLogTimeout },
[{ type: types.SET_JOB_LOG_TIMEOUT, payload: 0 }, { type: types.STOP_POLLING_JOB_LOG }],
[],
- )
- .then(() => {
- expect(window.clearTimeout).toHaveBeenCalledWith(jobLogTimeout);
- })
- .then(done)
- .catch(done.fail);
+ );
+ expect(window.clearTimeout).toHaveBeenCalledWith(jobLogTimeout);
});
});
describe('receiveJobLogSuccess', () => {
- it('should commit RECEIVE_JOB_LOG_SUCCESS mutation ', (done) => {
- testAction(
+ it('should commit RECEIVE_JOB_LOG_SUCCESS mutation ', () => {
+ return testAction(
receiveJobLogSuccess,
'hello world',
mockedState,
[{ type: types.RECEIVE_JOB_LOG_SUCCESS, payload: 'hello world' }],
[],
- done,
);
});
});
describe('receiveJobLogError', () => {
- it('should commit stop polling job log', (done) => {
- testAction(receiveJobLogError, null, mockedState, [], [{ type: 'stopPollingJobLog' }], done);
+ it('should commit stop polling job log', () => {
+ return testAction(receiveJobLogError, null, mockedState, [], [{ type: 'stopPollingJobLog' }]);
});
});
describe('toggleCollapsibleLine', () => {
- it('should commit TOGGLE_COLLAPSIBLE_LINE mutation ', (done) => {
- testAction(
+ it('should commit TOGGLE_COLLAPSIBLE_LINE mutation ', () => {
+ return testAction(
toggleCollapsibleLine,
{ isClosed: true },
mockedState,
[{ type: types.TOGGLE_COLLAPSIBLE_LINE, payload: { isClosed: true } }],
[],
- done,
);
});
});
describe('requestJobsForStage', () => {
- it('should commit REQUEST_JOBS_FOR_STAGE mutation ', (done) => {
- testAction(
+ it('should commit REQUEST_JOBS_FOR_STAGE mutation ', () => {
+ return testAction(
requestJobsForStage,
{ name: 'deploy' },
mockedState,
[{ type: types.REQUEST_JOBS_FOR_STAGE, payload: { name: 'deploy' } }],
[],
- done,
);
});
});
@@ -433,12 +423,12 @@ describe('Job State actions', () => {
});
describe('success', () => {
- it('dispatches requestJobsForStage and receiveJobsForStageSuccess ', (done) => {
+ it('dispatches requestJobsForStage and receiveJobsForStageSuccess ', () => {
mock
.onGet(`${TEST_HOST}/jobs.json`)
.replyOnce(200, { latest_statuses: [{ id: 121212, name: 'build' }], retried: [] });
- testAction(
+ return testAction(
fetchJobsForStage,
{ dropdown_path: `${TEST_HOST}/jobs.json` },
mockedState,
@@ -453,7 +443,6 @@ describe('Job State actions', () => {
type: 'receiveJobsForStageSuccess',
},
],
- done,
);
});
});
@@ -463,8 +452,8 @@ describe('Job State actions', () => {
mock.onGet(`${TEST_HOST}/jobs.json`).reply(500);
});
- it('dispatches requestJobsForStage and receiveJobsForStageError', (done) => {
- testAction(
+ it('dispatches requestJobsForStage and receiveJobsForStageError', () => {
+ return testAction(
fetchJobsForStage,
{ dropdown_path: `${TEST_HOST}/jobs.json` },
mockedState,
@@ -478,34 +467,31 @@ describe('Job State actions', () => {
type: 'receiveJobsForStageError',
},
],
- done,
);
});
});
});
describe('receiveJobsForStageSuccess', () => {
- it('should commit RECEIVE_JOBS_FOR_STAGE_SUCCESS mutation ', (done) => {
- testAction(
+ it('should commit RECEIVE_JOBS_FOR_STAGE_SUCCESS mutation ', () => {
+ return testAction(
receiveJobsForStageSuccess,
[{ id: 121212, name: 'karma' }],
mockedState,
[{ type: types.RECEIVE_JOBS_FOR_STAGE_SUCCESS, payload: [{ id: 121212, name: 'karma' }] }],
[],
- done,
);
});
});
describe('receiveJobsForStageError', () => {
- it('should commit RECEIVE_JOBS_FOR_STAGE_ERROR mutation ', (done) => {
- testAction(
+ it('should commit RECEIVE_JOBS_FOR_STAGE_ERROR mutation ', () => {
+ return testAction(
receiveJobsForStageError,
null,
mockedState,
[{ type: types.RECEIVE_JOBS_FOR_STAGE_ERROR }],
[],
- done,
);
});
});
diff --git a/spec/frontend/labels/components/promote_label_modal_spec.js b/spec/frontend/labels/components/promote_label_modal_spec.js
index d2fbdfc9a8d..8cfaba6f98a 100644
--- a/spec/frontend/labels/components/promote_label_modal_spec.js
+++ b/spec/frontend/labels/components/promote_label_modal_spec.js
@@ -50,7 +50,7 @@ describe('Promote label modal', () => {
vm.$destroy();
});
- it('redirects when a label is promoted', (done) => {
+ it('redirects when a label is promoted', () => {
const responseURL = `${TEST_HOST}/dummy/endpoint`;
jest.spyOn(axios, 'post').mockImplementation((url) => {
expect(url).toBe(labelMockData.url);
@@ -65,39 +65,35 @@ describe('Promote label modal', () => {
});
});
- vm.onSubmit()
- .then(() => {
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', {
- labelUrl: labelMockData.url,
- successful: true,
- });
- })
- .then(done)
- .catch(done.fail);
+ return vm.onSubmit().then(() => {
+ expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', {
+ labelUrl: labelMockData.url,
+ successful: true,
+ });
+ });
});
- it('displays an error if promoting a label failed', (done) => {
+ it('displays an error if promoting a label failed', () => {
const dummyError = new Error('promoting label failed');
dummyError.response = { status: 500 };
+
jest.spyOn(axios, 'post').mockImplementation((url) => {
expect(url).toBe(labelMockData.url);
expect(eventHub.$emit).toHaveBeenCalledWith(
'promoteLabelModal.requestStarted',
labelMockData.url,
);
+
return Promise.reject(dummyError);
});
- vm.onSubmit()
- .catch((error) => {
- expect(error).toBe(dummyError);
- expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', {
- labelUrl: labelMockData.url,
- successful: false,
- });
- })
- .then(done)
- .catch(done.fail);
+ return vm.onSubmit().catch((error) => {
+ expect(error).toBe(dummyError);
+ expect(eventHub.$emit).toHaveBeenCalledWith('promoteLabelModal.requestFinished', {
+ labelUrl: labelMockData.url,
+ successful: false,
+ });
+ });
});
});
});
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
index 971ba8b583c..5ac7a7985a8 100644
--- 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
@@ -82,34 +82,39 @@ describe('getSuppressNetworkErrorsDuringNavigationLink', () => {
isNavigatingAway.mockReturnValue(false);
});
- it('forwards successful requests', (done) => {
+ it('forwards successful requests', () => {
createSubscription(makeMockSuccessLink(), {
next({ data }) {
expect(data).toEqual({ foo: { id: 1 } });
},
- error: () => done.fail('Should not happen'),
- complete: () => done(),
+ error: () => {
+ throw new Error('Should not happen');
+ },
});
});
- it('forwards GraphQL errors', (done) => {
+ it('forwards GraphQL errors', () => {
createSubscription(makeMockGraphQLErrorLink(), {
next({ errors }) {
expect(errors).toEqual([{ message: 'foo' }]);
},
- error: () => done.fail('Should not happen'),
- complete: () => done(),
+ error: () => {
+ throw new Error('Should not happen');
+ },
});
});
- it('forwards network errors', (done) => {
+ it('forwards network errors', () => {
createSubscription(makeMockNetworkErrorLink(), {
- next: () => done.fail('Should not happen'),
+ next: () => {
+ throw new Error('Should not happen');
+ },
error: (error) => {
expect(error.message).toBe('NetworkError');
- done();
},
- complete: () => done.fail('Should not happen'),
+ complete: () => {
+ throw new Error('Should not happen');
+ },
});
});
});
@@ -119,23 +124,25 @@ describe('getSuppressNetworkErrorsDuringNavigationLink', () => {
isNavigatingAway.mockReturnValue(true);
});
- it('forwards successful requests', (done) => {
+ it('forwards successful requests', () => {
createSubscription(makeMockSuccessLink(), {
next({ data }) {
expect(data).toEqual({ foo: { id: 1 } });
},
- error: () => done.fail('Should not happen'),
- complete: () => done(),
+ error: () => {
+ throw new Error('Should not happen');
+ },
});
});
- it('forwards GraphQL errors', (done) => {
+ it('forwards GraphQL errors', () => {
createSubscription(makeMockGraphQLErrorLink(), {
next({ errors }) {
expect(errors).toEqual([{ message: 'foo' }]);
},
- error: () => done.fail('Should not happen'),
- complete: () => done(),
+ error: () => {
+ throw new Error('Should not happen');
+ },
});
});
});
diff --git a/spec/frontend/lib/gfm/index_spec.js b/spec/frontend/lib/gfm/index_spec.js
new file mode 100644
index 00000000000..5c72b5a51a7
--- /dev/null
+++ b/spec/frontend/lib/gfm/index_spec.js
@@ -0,0 +1,46 @@
+import { render } from '~/lib/gfm';
+
+describe('gfm', () => {
+ describe('render', () => {
+ it('processes Commonmark and provides an ast to the renderer function', async () => {
+ let result;
+
+ await render({
+ markdown: 'This is text',
+ renderer: (tree) => {
+ result = tree;
+ },
+ });
+
+ expect(result.type).toBe('root');
+ });
+
+ it('transforms raw HTML into individual nodes in the AST', async () => {
+ let result;
+
+ await render({
+ markdown: '<strong>This is bold text</strong>',
+ renderer: (tree) => {
+ result = tree;
+ },
+ });
+
+ expect(result.children[0].children[0]).toMatchObject({
+ type: 'element',
+ tagName: 'strong',
+ properties: {},
+ });
+ });
+
+ it('returns the result of executing the renderer function', async () => {
+ const result = await render({
+ markdown: '<strong>This is bold text</strong>',
+ renderer: () => {
+ return 'rendered tree';
+ },
+ });
+
+ expect(result).toBe('rendered tree');
+ });
+ });
+});
diff --git a/spec/frontend/lib/utils/apollo_startup_js_link_spec.js b/spec/frontend/lib/utils/apollo_startup_js_link_spec.js
index e58bc063004..06573f346e0 100644
--- a/spec/frontend/lib/utils/apollo_startup_js_link_spec.js
+++ b/spec/frontend/lib/utils/apollo_startup_js_link_spec.js
@@ -58,17 +58,16 @@ describe('StartupJSLink', () => {
link = ApolloLink.from([startupLink, new ApolloLink(() => Observable.of(FORWARDED_RESPONSE))]);
};
- it('forwards requests if no calls are set up', (done) => {
+ it('forwards requests if no calls are set up', () => {
setupLink();
link.request(mockOperation()).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls).toBe(null);
expect(startupLink.request).toEqual(StartupJSLink.noopRequest);
- done();
});
});
- it('forwards requests if the operation is not pre-loaded', (done) => {
+ it('forwards requests if the operation is not pre-loaded', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -82,12 +81,11 @@ describe('StartupJSLink', () => {
link.request(mockOperation({ operationName: 'notLoaded' })).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(1);
- done();
});
});
describe('variable match errors: ', () => {
- it('forwards requests if the variables are not matching', (done) => {
+ it('forwards requests if the variables are not matching', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -101,11 +99,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation()).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('forwards requests if more variables are set in the operation', (done) => {
+ it('forwards requests if more variables are set in the operation', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -118,11 +115,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation()).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('forwards requests if less variables are set in the operation', (done) => {
+ it('forwards requests if less variables are set in the operation', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -136,11 +132,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation({ variables: { id: 3 } })).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('forwards requests if different variables are set', (done) => {
+ it('forwards requests if different variables are set', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -154,11 +149,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation({ variables: { id: 3 } })).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('forwards requests if array variables have a different order', (done) => {
+ it('forwards requests if array variables have a different order', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -172,13 +166,12 @@ describe('StartupJSLink', () => {
link.request(mockOperation({ variables: { id: [4, 3] } })).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
});
describe('error handling', () => {
- it('forwards the call if the fetchCall is failing with a HTTP Error', (done) => {
+ it('forwards the call if the fetchCall is failing with a HTTP Error', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -192,11 +185,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation()).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('forwards the call if it errors (e.g. failing JSON)', (done) => {
+ it('forwards the call if it errors (e.g. failing JSON)', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -210,11 +202,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation()).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('forwards the call if the response contains an error', (done) => {
+ it('forwards the call if the response contains an error', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -228,11 +219,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation()).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it("forwards the call if the response doesn't contain a data object", (done) => {
+ it("forwards the call if the response doesn't contain a data object", () => {
window.gl = {
startup_graphql_calls: [
{
@@ -246,12 +236,11 @@ describe('StartupJSLink', () => {
link.request(mockOperation()).subscribe((result) => {
expect(result).toEqual(FORWARDED_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
});
- it('resolves the request if the operation is matching', (done) => {
+ it('resolves the request if the operation is matching', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -265,11 +254,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation()).subscribe((result) => {
expect(result).toEqual(STARTUP_JS_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('resolves the request exactly once', (done) => {
+ it('resolves the request exactly once', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -285,12 +273,11 @@ describe('StartupJSLink', () => {
expect(startupLink.startupCalls.size).toBe(0);
link.request(mockOperation()).subscribe((result2) => {
expect(result2).toEqual(FORWARDED_RESPONSE);
- done();
});
});
});
- it('resolves the request if the variables have a different order', (done) => {
+ it('resolves the request if the variables have a different order', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -304,11 +291,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation({ variables: { name: 'foo', id: 3 } })).subscribe((result) => {
expect(result).toEqual(STARTUP_JS_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('resolves the request if the variables have undefined values', (done) => {
+ it('resolves the request if the variables have undefined values', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -324,11 +310,10 @@ describe('StartupJSLink', () => {
.subscribe((result) => {
expect(result).toEqual(STARTUP_JS_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('resolves the request if the variables are of an array format', (done) => {
+ it('resolves the request if the variables are of an array format', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -342,11 +327,10 @@ describe('StartupJSLink', () => {
link.request(mockOperation({ variables: { id: [3, 4] } })).subscribe((result) => {
expect(result).toEqual(STARTUP_JS_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
- it('resolves multiple requests correctly', (done) => {
+ it('resolves multiple requests correctly', () => {
window.gl = {
startup_graphql_calls: [
{
@@ -368,7 +352,6 @@ describe('StartupJSLink', () => {
link.request(mockOperation({ operationName: OPERATION_NAME })).subscribe((result2) => {
expect(result2).toEqual(STARTUP_JS_RESPONSE);
expect(startupLink.startupCalls.size).toBe(0);
- done();
});
});
});
diff --git a/spec/frontend/lib/utils/common_utils_spec.js b/spec/frontend/lib/utils/common_utils_spec.js
index 0be0bf89210..763a9bd30fe 100644
--- a/spec/frontend/lib/utils/common_utils_spec.js
+++ b/spec/frontend/lib/utils/common_utils_spec.js
@@ -266,15 +266,18 @@ describe('common_utils', () => {
});
describe('debounceByAnimationFrame', () => {
- it('debounces a function to allow a maximum of one call per animation frame', (done) => {
+ it('debounces a function to allow a maximum of one call per animation frame', () => {
const spy = jest.fn();
const debouncedSpy = commonUtils.debounceByAnimationFrame(spy);
- window.requestAnimationFrame(() => {
- debouncedSpy();
- debouncedSpy();
+
+ return new Promise((resolve) => {
window.requestAnimationFrame(() => {
- expect(spy).toHaveBeenCalledTimes(1);
- done();
+ debouncedSpy();
+ debouncedSpy();
+ window.requestAnimationFrame(() => {
+ expect(spy).toHaveBeenCalledTimes(1);
+ resolve();
+ });
});
});
});
@@ -372,28 +375,24 @@ describe('common_utils', () => {
jest.spyOn(window, 'setTimeout');
});
- it('solves the promise from the callback', (done) => {
+ it('solves the promise from the callback', () => {
const expectedResponseValue = 'Success!';
- commonUtils
+ return commonUtils
.backOff((next, stop) =>
new Promise((resolve) => {
resolve(expectedResponseValue);
- })
- .then((resp) => {
- stop(resp);
- })
- .catch(done.fail),
+ }).then((resp) => {
+ stop(resp);
+ }),
)
.then((respBackoff) => {
expect(respBackoff).toBe(expectedResponseValue);
- done();
- })
- .catch(done.fail);
+ });
});
- it('catches the rejected promise from the callback ', (done) => {
+ it('catches the rejected promise from the callback ', () => {
const errorMessage = 'Mistakes were made!';
- commonUtils
+ return commonUtils
.backOff((next, stop) => {
new Promise((resolve, reject) => {
reject(new Error(errorMessage));
@@ -406,39 +405,34 @@ describe('common_utils', () => {
.catch((errBackoffResp) => {
expect(errBackoffResp instanceof Error).toBe(true);
expect(errBackoffResp.message).toBe(errorMessage);
- done();
});
});
- it('solves the promise correctly after retrying a third time', (done) => {
+ it('solves the promise correctly after retrying a third time', () => {
let numberOfCalls = 1;
const expectedResponseValue = 'Success!';
- commonUtils
+ return commonUtils
.backOff((next, stop) =>
- Promise.resolve(expectedResponseValue)
- .then((resp) => {
- if (numberOfCalls < 3) {
- numberOfCalls += 1;
- next();
- jest.runOnlyPendingTimers();
- } else {
- stop(resp);
- }
- })
- .catch(done.fail),
+ Promise.resolve(expectedResponseValue).then((resp) => {
+ if (numberOfCalls < 3) {
+ numberOfCalls += 1;
+ next();
+ jest.runOnlyPendingTimers();
+ } else {
+ stop(resp);
+ }
+ }),
)
.then((respBackoff) => {
const timeouts = window.setTimeout.mock.calls.map(([, timeout]) => timeout);
expect(timeouts).toEqual([2000, 4000]);
expect(respBackoff).toBe(expectedResponseValue);
- done();
- })
- .catch(done.fail);
+ });
});
- it('rejects the backOff promise after timing out', (done) => {
- commonUtils
+ it('rejects the backOff promise after timing out', () => {
+ return commonUtils
.backOff((next) => {
next();
jest.runOnlyPendingTimers();
@@ -449,7 +443,6 @@ describe('common_utils', () => {
expect(timeouts).toEqual([2000, 4000, 8000, 16000, 32000, 32000]);
expect(errBackoffResp instanceof Error).toBe(true);
expect(errBackoffResp.message).toBe('BACKOFF_TIMEOUT');
- done();
});
});
});
diff --git a/spec/frontend/lib/utils/confirm_via_gl_modal/confirm_modal_spec.js b/spec/frontend/lib/utils/confirm_via_gl_modal/confirm_modal_spec.js
index e06d1384610..d6131b1a1d7 100644
--- a/spec/frontend/lib/utils/confirm_via_gl_modal/confirm_modal_spec.js
+++ b/spec/frontend/lib/utils/confirm_via_gl_modal/confirm_modal_spec.js
@@ -5,12 +5,23 @@ import ConfirmModal from '~/lib/utils/confirm_via_gl_modal/confirm_modal.vue';
describe('Confirm Modal', () => {
let wrapper;
let modal;
+ const SECONDARY_TEXT = 'secondaryText';
+ const SECONDARY_VARIANT = 'danger';
- const createComponent = ({ primaryText, primaryVariant, title, hideCancel = false } = {}) => {
+ const createComponent = ({
+ primaryText,
+ primaryVariant,
+ secondaryText,
+ secondaryVariant,
+ title,
+ hideCancel = false,
+ } = {}) => {
wrapper = mount(ConfirmModal, {
propsData: {
primaryText,
primaryVariant,
+ secondaryText,
+ secondaryVariant,
hideCancel,
title,
},
@@ -65,6 +76,19 @@ describe('Confirm Modal', () => {
expect(props.actionCancel).toBeNull();
});
+ it('should not show secondary Button when secondary Text is not set', () => {
+ createComponent();
+ const props = findGlModal().props();
+ expect(props.actionSecondary).toBeNull();
+ });
+
+ it('should show secondary Button when secondaryText is set', () => {
+ createComponent({ secondaryText: SECONDARY_TEXT, secondaryVariant: SECONDARY_VARIANT });
+ const actionSecondary = findGlModal().props('actionSecondary');
+ expect(actionSecondary.text).toEqual(SECONDARY_TEXT);
+ expect(actionSecondary.attributes.variant).toEqual(SECONDARY_VARIANT);
+ });
+
it('should set the modal title when the `title` prop is set', () => {
const title = 'Modal title';
createComponent({ title });
diff --git a/spec/frontend/lib/utils/datetime/date_calculation_utility_spec.js b/spec/frontend/lib/utils/datetime/date_calculation_utility_spec.js
new file mode 100644
index 00000000000..47bb512cbb5
--- /dev/null
+++ b/spec/frontend/lib/utils/datetime/date_calculation_utility_spec.js
@@ -0,0 +1,17 @@
+import { newDateAsLocaleTime } from '~/lib/utils/datetime/date_calculation_utility';
+
+describe('newDateAsLocaleTime', () => {
+ it.each`
+ string | expected
+ ${'2022-03-22'} | ${new Date('2022-03-22T00:00:00.000Z')}
+ ${'2022-03-22T00:00:00.000Z'} | ${new Date('2022-03-22T00:00:00.000Z')}
+ ${2022} | ${null}
+ ${[]} | ${null}
+ ${{}} | ${null}
+ ${true} | ${null}
+ ${null} | ${null}
+ ${undefined} | ${null}
+ `('returns $expected given $string', ({ string, expected }) => {
+ expect(newDateAsLocaleTime(string)).toEqual(expected);
+ });
+});
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 1adc70450e8..018ae12c908 100644
--- a/spec/frontend/lib/utils/datetime/date_format_utility_spec.js
+++ b/spec/frontend/lib/utils/datetime/date_format_utility_spec.js
@@ -133,3 +133,15 @@ describe('formatTimeAsSummary', () => {
expect(utils.formatTimeAsSummary({ [unit]: value })).toBe(result);
});
});
+
+describe('durationTimeFormatted', () => {
+ it.each`
+ duration | expectedOutput
+ ${87} | ${'00:01:27'}
+ ${141} | ${'00:02:21'}
+ ${12} | ${'00:00:12'}
+ ${60} | ${'00:01:00'}
+ `('returns $expectedOutput when provided $duration', ({ duration, expectedOutput }) => {
+ expect(utils.durationTimeFormatted(duration)).toBe(expectedOutput);
+ });
+});
diff --git a/spec/frontend/lib/utils/datetime/timeago_utility_spec.js b/spec/frontend/lib/utils/datetime/timeago_utility_spec.js
index 2314ec678d3..1ef7047d959 100644
--- a/spec/frontend/lib/utils/datetime/timeago_utility_spec.js
+++ b/spec/frontend/lib/utils/datetime/timeago_utility_spec.js
@@ -1,4 +1,4 @@
-import { getTimeago, localTimeAgo, timeFor } from '~/lib/utils/datetime/timeago_utility';
+import { getTimeago, localTimeAgo, timeFor, duration } from '~/lib/utils/datetime/timeago_utility';
import { s__ } from '~/locale';
import '~/commons/bootstrap';
@@ -66,6 +66,54 @@ describe('TimeAgo utils', () => {
});
});
+ describe('duration', () => {
+ const ONE_DAY = 24 * 60 * 60;
+
+ it.each`
+ secs | formatted
+ ${0} | ${'0 seconds'}
+ ${30} | ${'30 seconds'}
+ ${59} | ${'59 seconds'}
+ ${60} | ${'1 minute'}
+ ${-60} | ${'1 minute'}
+ ${2 * 60} | ${'2 minutes'}
+ ${60 * 60} | ${'1 hour'}
+ ${2 * 60 * 60} | ${'2 hours'}
+ ${ONE_DAY} | ${'1 day'}
+ ${2 * ONE_DAY} | ${'2 days'}
+ ${7 * ONE_DAY} | ${'1 week'}
+ ${14 * ONE_DAY} | ${'2 weeks'}
+ ${31 * ONE_DAY} | ${'1 month'}
+ ${61 * ONE_DAY} | ${'2 months'}
+ ${365 * ONE_DAY} | ${'1 year'}
+ ${365 * 2 * ONE_DAY} | ${'2 years'}
+ `('formats $secs as "$formatted"', ({ secs, formatted }) => {
+ const ms = secs * 1000;
+
+ expect(duration(ms)).toBe(formatted);
+ });
+
+ // `duration` can be used to format Rails month durations.
+ // Ensure formatting for quantities such as `2.months.to_i`
+ // based on ActiveSupport::Duration::SECONDS_PER_MONTH.
+ // See: https://api.rubyonrails.org/classes/ActiveSupport/Duration.html
+ const SECONDS_PER_MONTH = 2629746; // 1.month.to_i
+
+ it.each`
+ duration | secs | formatted
+ ${'1.month'} | ${SECONDS_PER_MONTH} | ${'1 month'}
+ ${'2.months'} | ${SECONDS_PER_MONTH * 2} | ${'2 months'}
+ ${'3.months'} | ${SECONDS_PER_MONTH * 3} | ${'3 months'}
+ `(
+ 'formats ActiveSupport::Duration of `$duration` ($secs) as "$formatted"',
+ ({ secs, formatted }) => {
+ const ms = secs * 1000;
+
+ expect(duration(ms)).toBe(formatted);
+ },
+ );
+ });
+
describe('localTimeAgo', () => {
beforeEach(() => {
document.body.innerHTML =
diff --git a/spec/frontend/lib/utils/poll_spec.js b/spec/frontend/lib/utils/poll_spec.js
index 861808e3ad8..1f150599983 100644
--- a/spec/frontend/lib/utils/poll_spec.js
+++ b/spec/frontend/lib/utils/poll_spec.js
@@ -50,58 +50,48 @@ describe('Poll', () => {
};
});
- it('calls the success callback when no header for interval is provided', (done) => {
+ it('calls the success callback when no header for interval is provided', () => {
mockServiceCall({ status: 200 });
setup();
- waitForAllCallsToFinish(1, () => {
+ return waitForAllCallsToFinish(1, () => {
expect(callbacks.success).toHaveBeenCalled();
expect(callbacks.error).not.toHaveBeenCalled();
-
- done();
});
});
- it('calls the error callback when the http request returns an error', (done) => {
+ it('calls the error callback when the http request returns an error', () => {
mockServiceCall({ status: 500 }, true);
setup();
- waitForAllCallsToFinish(1, () => {
+ return waitForAllCallsToFinish(1, () => {
expect(callbacks.success).not.toHaveBeenCalled();
expect(callbacks.error).toHaveBeenCalled();
-
- done();
});
});
- it('skips the error callback when request is aborted', (done) => {
+ it('skips the error callback when request is aborted', () => {
mockServiceCall({ status: 0 }, true);
setup();
- waitForAllCallsToFinish(1, () => {
+ return waitForAllCallsToFinish(1, () => {
expect(callbacks.success).not.toHaveBeenCalled();
expect(callbacks.error).not.toHaveBeenCalled();
expect(callbacks.notification).toHaveBeenCalled();
-
- done();
});
});
- it('should call the success callback when the interval header is -1', (done) => {
+ it('should call the success callback when the interval header is -1', () => {
mockServiceCall({ status: 200, headers: { 'poll-interval': -1 } });
- setup()
- .then(() => {
- expect(callbacks.success).toHaveBeenCalled();
- expect(callbacks.error).not.toHaveBeenCalled();
-
- done();
- })
- .catch(done.fail);
+ return setup().then(() => {
+ expect(callbacks.success).toHaveBeenCalled();
+ expect(callbacks.error).not.toHaveBeenCalled();
+ });
});
describe('for 2xx status code', () => {
successCodes.forEach((httpCode) => {
- it(`starts polling when http status is ${httpCode} and interval header is provided`, (done) => {
+ it(`starts polling when http status is ${httpCode} and interval header is provided`, () => {
mockServiceCall({ status: httpCode, headers: { 'poll-interval': 1 } });
const Polling = new Poll({
@@ -114,22 +104,20 @@ describe('Poll', () => {
Polling.makeRequest();
- waitForAllCallsToFinish(2, () => {
+ return waitForAllCallsToFinish(2, () => {
Polling.stop();
expect(service.fetch.mock.calls).toHaveLength(2);
expect(service.fetch).toHaveBeenCalledWith({ page: 1 });
expect(callbacks.success).toHaveBeenCalled();
expect(callbacks.error).not.toHaveBeenCalled();
-
- done();
});
});
});
});
describe('with delayed initial request', () => {
- it('delays the first request', async (done) => {
+ it('delays the first request', async () => {
mockServiceCall({ status: 200, headers: { 'poll-interval': 1 } });
const Polling = new Poll({
@@ -144,21 +132,19 @@ describe('Poll', () => {
expect(Polling.timeoutID).toBeTruthy();
- waitForAllCallsToFinish(2, () => {
+ return waitForAllCallsToFinish(2, () => {
Polling.stop();
expect(service.fetch.mock.calls).toHaveLength(2);
expect(service.fetch).toHaveBeenCalledWith({ page: 1 });
expect(callbacks.success).toHaveBeenCalled();
expect(callbacks.error).not.toHaveBeenCalled();
-
- done();
});
});
});
describe('stop', () => {
- it('stops polling when method is called', (done) => {
+ it('stops polling when method is called', () => {
mockServiceCall({ status: 200, headers: { 'poll-interval': 1 } });
const Polling = new Poll({
@@ -175,18 +161,16 @@ describe('Poll', () => {
Polling.makeRequest();
- waitForAllCallsToFinish(1, () => {
+ return waitForAllCallsToFinish(1, () => {
expect(service.fetch.mock.calls).toHaveLength(1);
expect(service.fetch).toHaveBeenCalledWith({ page: 1 });
expect(Polling.stop).toHaveBeenCalled();
-
- done();
});
});
});
describe('enable', () => {
- it('should enable polling upon a response', (done) => {
+ it('should enable polling upon a response', () => {
mockServiceCall({ status: 200 });
const Polling = new Poll({
resource: service,
@@ -200,19 +184,18 @@ describe('Poll', () => {
response: { status: 200, headers: { 'poll-interval': 1 } },
});
- waitForAllCallsToFinish(1, () => {
+ return waitForAllCallsToFinish(1, () => {
Polling.stop();
expect(service.fetch.mock.calls).toHaveLength(1);
expect(service.fetch).toHaveBeenCalledWith({ page: 4 });
expect(Polling.options.data).toEqual({ page: 4 });
- done();
});
});
});
describe('restart', () => {
- it('should restart polling when its called', (done) => {
+ it('should restart polling when its called', () => {
mockServiceCall({ status: 200, headers: { 'poll-interval': 1 } });
const Polling = new Poll({
@@ -238,7 +221,7 @@ describe('Poll', () => {
Polling.makeRequest();
- waitForAllCallsToFinish(2, () => {
+ return waitForAllCallsToFinish(2, () => {
Polling.stop();
expect(service.fetch.mock.calls).toHaveLength(2);
@@ -247,7 +230,6 @@ describe('Poll', () => {
expect(Polling.enable).toHaveBeenCalled();
expect(Polling.restart).toHaveBeenCalled();
expect(Polling.options.data).toEqual({ page: 4 });
- done();
});
});
});
diff --git a/spec/frontend/lib/utils/text_markdown_spec.js b/spec/frontend/lib/utils/text_markdown_spec.js
index a5877aa6e3e..103305f0797 100644
--- a/spec/frontend/lib/utils/text_markdown_spec.js
+++ b/spec/frontend/lib/utils/text_markdown_spec.js
@@ -178,12 +178,23 @@ describe('init markdown', () => {
it.each`
text | expected
${'- item'} | ${'- item\n- '}
+ ${'* item'} | ${'* item\n* '}
+ ${'+ item'} | ${'+ item\n+ '}
${'- [ ] item'} | ${'- [ ] item\n- [ ] '}
- ${'- [x] item'} | ${'- [x] item\n- [x] '}
+ ${'- [x] item'} | ${'- [x] item\n- [ ] '}
+ ${'- [X] item'} | ${'- [X] item\n- [ ] '}
+ ${'- [ ] nbsp (U+00A0)'} | ${'- [ ] nbsp (U+00A0)\n- [ ] '}
${'- item\n - second'} | ${'- item\n - second\n - '}
+ ${'- - -'} | ${'- - -'}
+ ${'- --'} | ${'- --'}
+ ${'* **'} | ${'* **'}
+ ${' ** * ** * ** * **'} | ${' ** * ** * ** * **'}
+ ${'- - -x'} | ${'- - -x\n- '}
+ ${'+ ++'} | ${'+ ++\n+ '}
${'1. item'} | ${'1. item\n2. '}
${'1. [ ] item'} | ${'1. [ ] item\n2. [ ] '}
- ${'1. [x] item'} | ${'1. [x] item\n2. [x] '}
+ ${'1. [x] item'} | ${'1. [x] item\n2. [ ] '}
+ ${'1. [X] item'} | ${'1. [X] item\n2. [ ] '}
${'108. item'} | ${'108. item\n109. '}
${'108. item\n - second'} | ${'108. item\n - second\n - '}
${'108. item\n 1. second'} | ${'108. item\n 1. second\n 2. '}
@@ -207,10 +218,12 @@ describe('init markdown', () => {
${'- item\n- '} | ${'- item\n'}
${'- [ ] item\n- [ ] '} | ${'- [ ] item\n'}
${'- [x] item\n- [x] '} | ${'- [x] item\n'}
+ ${'- [X] item\n- [X] '} | ${'- [X] item\n'}
${'- item\n - second\n - '} | ${'- item\n - second\n'}
${'1. item\n2. '} | ${'1. item\n'}
${'1. [ ] item\n2. [ ] '} | ${'1. [ ] item\n'}
${'1. [x] item\n2. [x] '} | ${'1. [x] item\n'}
+ ${'1. [X] item\n2. [X] '} | ${'1. [X] item\n'}
${'108. item\n109. '} | ${'108. item\n'}
${'108. item\n - second\n - '} | ${'108. item\n - second\n'}
${'108. item\n 1. second\n 1. '} | ${'108. item\n 1. second\n'}
diff --git a/spec/frontend/lib/utils/unit_format/formatter_factory_spec.js b/spec/frontend/lib/utils/unit_format/formatter_factory_spec.js
index 0ca70e0a77e..9632d0f98f4 100644
--- a/spec/frontend/lib/utils/unit_format/formatter_factory_spec.js
+++ b/spec/frontend/lib/utils/unit_format/formatter_factory_spec.js
@@ -31,12 +31,17 @@ describe('unit_format/formatter_factory', () => {
expect(formatNumber(12.345, 4)).toBe('12.3450');
});
- it('formats a large integer with a length limit', () => {
+ it('formats a large integer with a max length - using legacy positional argument', () => {
expect(formatNumber(10 ** 7, undefined)).toBe('10,000,000');
expect(formatNumber(10 ** 7, undefined, 9)).toBe('1.00e+7');
expect(formatNumber(10 ** 7, undefined, 10)).toBe('10,000,000');
});
+ it('formats a large integer with a max length', () => {
+ expect(formatNumber(10 ** 7, undefined, { maxLength: 9 })).toBe('1.00e+7');
+ expect(formatNumber(10 ** 7, undefined, { maxLength: 10 })).toBe('10,000,000');
+ });
+
describe('formats with a different locale', () => {
let originalLang;
@@ -92,7 +97,7 @@ describe('unit_format/formatter_factory', () => {
expect(formatSuffix(-1000000)).toBe('-1,000,000pop.');
});
- it('formats a floating point nugative number', () => {
+ it('formats a floating point negative number', () => {
expect(formatSuffix(-0.1)).toBe('-0.1pop.');
expect(formatSuffix(-0.1, 0)).toBe('-0pop.');
expect(formatSuffix(-0.1, 2)).toBe('-0.10pop.');
@@ -108,10 +113,20 @@ describe('unit_format/formatter_factory', () => {
expect(formatSuffix(10 ** 10)).toBe('10,000,000,000pop.');
});
- it('formats a large integer with a length limit', () => {
+ it('formats using a unit separator', () => {
+ expect(formatSuffix(10, 0, { unitSeparator: ' ' })).toBe('10 pop.');
+ expect(formatSuffix(10, 0, { unitSeparator: ' x ' })).toBe('10 x pop.');
+ });
+
+ it('formats a large integer with a max length - using legacy positional argument', () => {
expect(formatSuffix(10 ** 7, undefined, 10)).toBe('1.00e+7pop.');
expect(formatSuffix(10 ** 10, undefined, 10)).toBe('1.00e+10pop.');
});
+
+ it('formats a large integer with a max length', () => {
+ expect(formatSuffix(10 ** 7, undefined, { maxLength: 10 })).toBe('1.00e+7pop.');
+ expect(formatSuffix(10 ** 10, undefined, { maxLength: 10 })).toBe('1.00e+10pop.');
+ });
});
describe('scaledSIFormatter', () => {
@@ -143,6 +158,10 @@ describe('unit_format/formatter_factory', () => {
expect(formatGibibytes(10 ** 10)).toBe('10GB');
expect(formatGibibytes(10 ** 11)).toBe('100GB');
});
+
+ it('formats bytes using a unit separator', () => {
+ expect(formatGibibytes(1, 0, { unitSeparator: ' ' })).toBe('1 B');
+ });
});
describe('scaled format with offset', () => {
@@ -174,6 +193,19 @@ describe('unit_format/formatter_factory', () => {
expect(formatGigaBytes(10 ** 9)).toBe('1EB');
});
+ it('formats bytes using a unit separator', () => {
+ expect(formatGigaBytes(1, undefined, { unitSeparator: ' ' })).toBe('1 GB');
+ });
+
+ it('formats long byte numbers with max length - using legacy positional argument', () => {
+ expect(formatGigaBytes(1, 8, 7)).toBe('1.00e+0GB');
+ });
+
+ it('formats long byte numbers with max length', () => {
+ expect(formatGigaBytes(1, 8)).toBe('1.00000000GB');
+ expect(formatGigaBytes(1, 8, { maxLength: 7 })).toBe('1.00e+0GB');
+ });
+
it('formatting of too large numbers is not suported', () => {
// formatting YB is out of range
expect(() => scaledSIFormatter('B', 9)).toThrow();
@@ -216,6 +248,10 @@ describe('unit_format/formatter_factory', () => {
expect(formatMilligrams(-100)).toBe('-100mg');
expect(formatMilligrams(-(10 ** 4))).toBe('-10g');
});
+
+ it('formats using a unit separator', () => {
+ expect(formatMilligrams(1, undefined, { unitSeparator: ' ' })).toBe('1 mg');
+ });
});
});
@@ -253,6 +289,10 @@ describe('unit_format/formatter_factory', () => {
expect(formatScaledBin(10 * 1024 ** 3)).toBe('10GiB');
expect(formatScaledBin(100 * 1024 ** 3)).toBe('100GiB');
});
+
+ it('formats using a unit separator', () => {
+ expect(formatScaledBin(1, undefined, { unitSeparator: ' ' })).toBe('1 B');
+ });
});
describe('scaled format with offset', () => {
@@ -288,6 +328,10 @@ describe('unit_format/formatter_factory', () => {
expect(formatGibibytes(100 * 1024 ** 3)).toBe('100EiB');
});
+ it('formats using a unit separator', () => {
+ expect(formatGibibytes(1, undefined, { unitSeparator: ' ' })).toBe('1 GiB');
+ });
+
it('formatting of too large numbers is not suported', () => {
// formatting YB is out of range
expect(() => scaledBinaryFormatter('B', 9)).toThrow();
diff --git a/spec/frontend/lib/utils/unit_format/index_spec.js b/spec/frontend/lib/utils/unit_format/index_spec.js
index 7fd273f1b58..dc9d6ece48e 100644
--- a/spec/frontend/lib/utils/unit_format/index_spec.js
+++ b/spec/frontend/lib/utils/unit_format/index_spec.js
@@ -74,10 +74,13 @@ describe('unit_format', () => {
it('seconds', () => {
expect(seconds(1)).toBe('1s');
+ expect(seconds(1, undefined, { unitSeparator: ' ' })).toBe('1 s');
});
it('milliseconds', () => {
expect(milliseconds(1)).toBe('1ms');
+ expect(milliseconds(1, undefined, { unitSeparator: ' ' })).toBe('1 ms');
+
expect(milliseconds(100)).toBe('100ms');
expect(milliseconds(1000)).toBe('1,000ms');
expect(milliseconds(10_000)).toBe('10,000ms');
@@ -87,6 +90,7 @@ describe('unit_format', () => {
it('decimalBytes', () => {
expect(decimalBytes(1)).toBe('1B');
expect(decimalBytes(1, 1)).toBe('1.0B');
+ expect(decimalBytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 B');
expect(decimalBytes(10)).toBe('10B');
expect(decimalBytes(10 ** 2)).toBe('100B');
@@ -104,31 +108,37 @@ describe('unit_format', () => {
it('kilobytes', () => {
expect(kilobytes(1)).toBe('1kB');
expect(kilobytes(1, 1)).toBe('1.0kB');
+ expect(kilobytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 kB');
});
it('megabytes', () => {
expect(megabytes(1)).toBe('1MB');
expect(megabytes(1, 1)).toBe('1.0MB');
+ expect(megabytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 MB');
});
it('gigabytes', () => {
expect(gigabytes(1)).toBe('1GB');
expect(gigabytes(1, 1)).toBe('1.0GB');
+ expect(gigabytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 GB');
});
it('terabytes', () => {
expect(terabytes(1)).toBe('1TB');
expect(terabytes(1, 1)).toBe('1.0TB');
+ expect(terabytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 TB');
});
it('petabytes', () => {
expect(petabytes(1)).toBe('1PB');
expect(petabytes(1, 1)).toBe('1.0PB');
+ expect(petabytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 PB');
});
it('bytes', () => {
expect(bytes(1)).toBe('1B');
expect(bytes(1, 1)).toBe('1.0B');
+ expect(bytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 B');
expect(bytes(10)).toBe('10B');
expect(bytes(100)).toBe('100B');
@@ -142,26 +152,31 @@ describe('unit_format', () => {
it('kibibytes', () => {
expect(kibibytes(1)).toBe('1KiB');
expect(kibibytes(1, 1)).toBe('1.0KiB');
+ expect(kibibytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 KiB');
});
it('mebibytes', () => {
expect(mebibytes(1)).toBe('1MiB');
expect(mebibytes(1, 1)).toBe('1.0MiB');
+ expect(mebibytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 MiB');
});
it('gibibytes', () => {
expect(gibibytes(1)).toBe('1GiB');
expect(gibibytes(1, 1)).toBe('1.0GiB');
+ expect(gibibytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 GiB');
});
it('tebibytes', () => {
expect(tebibytes(1)).toBe('1TiB');
expect(tebibytes(1, 1)).toBe('1.0TiB');
+ expect(tebibytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 TiB');
});
it('pebibytes', () => {
expect(pebibytes(1)).toBe('1PiB');
expect(pebibytes(1, 1)).toBe('1.0PiB');
+ expect(pebibytes(1, 1, { unitSeparator: ' ' })).toBe('1.0 PiB');
});
describe('getFormatter', () => {
diff --git a/spec/frontend/lib/utils/users_cache_spec.js b/spec/frontend/lib/utils/users_cache_spec.js
index 4034f39ee9c..30bdddd8e73 100644
--- a/spec/frontend/lib/utils/users_cache_spec.js
+++ b/spec/frontend/lib/utils/users_cache_spec.js
@@ -93,7 +93,7 @@ describe('UsersCache', () => {
.mockImplementation((query, options) => apiSpy(query, options));
});
- it('stores and returns data from API call if cache is empty', (done) => {
+ it('stores and returns data from API call if cache is empty', async () => {
apiSpy = (query, options) => {
expect(query).toBe('');
expect(options).toEqual({
@@ -105,16 +105,12 @@ describe('UsersCache', () => {
});
};
- UsersCache.retrieve(dummyUsername)
- .then((user) => {
- expect(user).toBe(dummyUser);
- expect(UsersCache.internalStorage[dummyUsername]).toBe(dummyUser);
- })
- .then(done)
- .catch(done.fail);
+ const user = await UsersCache.retrieve(dummyUsername);
+ expect(user).toBe(dummyUser);
+ expect(UsersCache.internalStorage[dummyUsername]).toBe(dummyUser);
});
- it('returns undefined if Ajax call fails and cache is empty', (done) => {
+ it('returns undefined if Ajax call fails and cache is empty', async () => {
const dummyError = new Error('server exploded');
apiSpy = (query, options) => {
@@ -126,26 +122,18 @@ describe('UsersCache', () => {
return Promise.reject(dummyError);
};
- UsersCache.retrieve(dummyUsername)
- .then((user) => done.fail(`Received unexpected user: ${JSON.stringify(user)}`))
- .catch((error) => {
- expect(error).toBe(dummyError);
- })
- .then(done)
- .catch(done.fail);
+ await expect(UsersCache.retrieve(dummyUsername)).rejects.toEqual(dummyError);
});
- it('makes no Ajax call if matching data exists', (done) => {
+ it('makes no Ajax call if matching data exists', async () => {
UsersCache.internalStorage[dummyUsername] = dummyUser;
- apiSpy = () => done.fail(new Error('expected no Ajax call!'));
+ apiSpy = () => {
+ throw new Error('expected no Ajax call!');
+ };
- UsersCache.retrieve(dummyUsername)
- .then((user) => {
- expect(user).toBe(dummyUser);
- })
- .then(done)
- .catch(done.fail);
+ const user = await UsersCache.retrieve(dummyUsername);
+ expect(user).toBe(dummyUser);
});
});
@@ -156,7 +144,7 @@ describe('UsersCache', () => {
jest.spyOn(UserApi, 'getUser').mockImplementation((id) => apiSpy(id));
});
- it('stores and returns data from API call if cache is empty', (done) => {
+ it('stores and returns data from API call if cache is empty', async () => {
apiSpy = (id) => {
expect(id).toBe(dummyUserId);
@@ -165,16 +153,12 @@ describe('UsersCache', () => {
});
};
- UsersCache.retrieveById(dummyUserId)
- .then((user) => {
- expect(user).toBe(dummyUser);
- expect(UsersCache.internalStorage[dummyUserId]).toBe(dummyUser);
- })
- .then(done)
- .catch(done.fail);
+ const user = await UsersCache.retrieveById(dummyUserId);
+ expect(user).toBe(dummyUser);
+ expect(UsersCache.internalStorage[dummyUserId]).toBe(dummyUser);
});
- it('returns undefined if Ajax call fails and cache is empty', (done) => {
+ it('returns undefined if Ajax call fails and cache is empty', async () => {
const dummyError = new Error('server exploded');
apiSpy = (id) => {
@@ -183,26 +167,18 @@ describe('UsersCache', () => {
return Promise.reject(dummyError);
};
- UsersCache.retrieveById(dummyUserId)
- .then((user) => done.fail(`Received unexpected user: ${JSON.stringify(user)}`))
- .catch((error) => {
- expect(error).toBe(dummyError);
- })
- .then(done)
- .catch(done.fail);
+ await expect(UsersCache.retrieveById(dummyUserId)).rejects.toEqual(dummyError);
});
- it('makes no Ajax call if matching data exists', (done) => {
+ it('makes no Ajax call if matching data exists', async () => {
UsersCache.internalStorage[dummyUserId] = dummyUser;
- apiSpy = () => done.fail(new Error('expected no Ajax call!'));
+ apiSpy = () => {
+ throw new Error('expected no Ajax call!');
+ };
- UsersCache.retrieveById(dummyUserId)
- .then((user) => {
- expect(user).toBe(dummyUser);
- })
- .then(done)
- .catch(done.fail);
+ const user = await UsersCache.retrieveById(dummyUserId);
+ expect(user).toBe(dummyUser);
});
});
@@ -213,7 +189,7 @@ describe('UsersCache', () => {
jest.spyOn(UserApi, 'getUserStatus').mockImplementation((id) => apiSpy(id));
});
- it('stores and returns data from API call if cache is empty', (done) => {
+ it('stores and returns data from API call if cache is empty', async () => {
apiSpy = (id) => {
expect(id).toBe(dummyUserId);
@@ -222,16 +198,12 @@ describe('UsersCache', () => {
});
};
- UsersCache.retrieveStatusById(dummyUserId)
- .then((userStatus) => {
- expect(userStatus).toBe(dummyUserStatus);
- expect(UsersCache.internalStorage[dummyUserId].status).toBe(dummyUserStatus);
- })
- .then(done)
- .catch(done.fail);
+ const userStatus = await UsersCache.retrieveStatusById(dummyUserId);
+ expect(userStatus).toBe(dummyUserStatus);
+ expect(UsersCache.internalStorage[dummyUserId].status).toBe(dummyUserStatus);
});
- it('returns undefined if Ajax call fails and cache is empty', (done) => {
+ it('returns undefined if Ajax call fails and cache is empty', async () => {
const dummyError = new Error('server exploded');
apiSpy = (id) => {
@@ -240,28 +212,20 @@ describe('UsersCache', () => {
return Promise.reject(dummyError);
};
- UsersCache.retrieveStatusById(dummyUserId)
- .then((userStatus) => done.fail(`Received unexpected user: ${JSON.stringify(userStatus)}`))
- .catch((error) => {
- expect(error).toBe(dummyError);
- })
- .then(done)
- .catch(done.fail);
+ await expect(UsersCache.retrieveStatusById(dummyUserId)).rejects.toEqual(dummyError);
});
- it('makes no Ajax call if matching data exists', (done) => {
+ it('makes no Ajax call if matching data exists', async () => {
UsersCache.internalStorage[dummyUserId] = {
status: dummyUserStatus,
};
- apiSpy = () => done.fail(new Error('expected no Ajax call!'));
+ apiSpy = () => {
+ throw new Error('expected no Ajax call!');
+ };
- UsersCache.retrieveStatusById(dummyUserId)
- .then((userStatus) => {
- expect(userStatus).toBe(dummyUserStatus);
- })
- .then(done)
- .catch(done.fail);
+ const userStatus = await UsersCache.retrieveStatusById(dummyUserId);
+ expect(userStatus).toBe(dummyUserStatus);
});
});
});
diff --git a/spec/frontend/members/components/table/members_table_spec.js b/spec/frontend/members/components/table/members_table_spec.js
index b2756e506eb..298a01e4f4d 100644
--- a/spec/frontend/members/components/table/members_table_spec.js
+++ b/spec/frontend/members/components/table/members_table_spec.js
@@ -10,6 +10,7 @@ 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 UserDate from '~/vue_shared/components/user_date.vue';
import {
MEMBER_TYPES,
MEMBER_STATE_CREATED,
@@ -106,14 +107,16 @@ describe('MembersTable', () => {
};
it.each`
- field | label | member | expectedComponent
- ${'account'} | ${'Account'} | ${memberMock} | ${MemberAvatar}
- ${'source'} | ${'Source'} | ${memberMock} | ${MemberSource}
- ${'granted'} | ${'Access granted'} | ${memberMock} | ${CreatedAt}
- ${'invited'} | ${'Invited'} | ${invite} | ${CreatedAt}
- ${'requested'} | ${'Requested'} | ${accessRequest} | ${CreatedAt}
- ${'maxRole'} | ${'Max role'} | ${memberCanUpdate} | ${RoleDropdown}
- ${'expiration'} | ${'Expiration'} | ${memberMock} | ${ExpirationDatepicker}
+ field | label | member | expectedComponent
+ ${'account'} | ${'Account'} | ${memberMock} | ${MemberAvatar}
+ ${'source'} | ${'Source'} | ${memberMock} | ${MemberSource}
+ ${'granted'} | ${'Access granted'} | ${memberMock} | ${CreatedAt}
+ ${'invited'} | ${'Invited'} | ${invite} | ${CreatedAt}
+ ${'requested'} | ${'Requested'} | ${accessRequest} | ${CreatedAt}
+ ${'maxRole'} | ${'Max role'} | ${memberCanUpdate} | ${RoleDropdown}
+ ${'expiration'} | ${'Expiration'} | ${memberMock} | ${ExpirationDatepicker}
+ ${'userCreatedAt'} | ${'Created on'} | ${memberMock} | ${UserDate}
+ ${'lastActivityOn'} | ${'Last activity'} | ${memberMock} | ${UserDate}
`('renders the $label field', ({ field, label, member, expectedComponent }) => {
createComponent({
members: [member],
diff --git a/spec/frontend/members/mock_data.js b/spec/frontend/members/mock_data.js
index 83856a00a15..06ccd107ce3 100644
--- a/spec/frontend/members/mock_data.js
+++ b/spec/frontend/members/mock_data.js
@@ -17,6 +17,7 @@ export const member = {
state: MEMBER_STATE_CREATED,
user: {
id: 123,
+ createdAt: '2022-03-10T18:03:04.812Z',
name: 'Administrator',
username: 'root',
webUrl: 'https://gitlab.com/root',
@@ -26,6 +27,7 @@ export const member = {
oncallSchedules: [{ name: 'schedule 1' }],
escalationPolicies: [{ name: 'policy 1' }],
availability: null,
+ lastActivityOn: '2022-03-15',
showStatus: true,
},
id: 238,
@@ -56,6 +58,7 @@ export const group = {
webUrl: 'https://gitlab.com/groups/parent-group/commit451',
},
id: 3,
+ isDirectMember: true,
createdAt: '2020-08-06T15:31:07.662Z',
expiresAt: null,
validRoles: { Guest: 10, Reporter: 20, Developer: 30, Maintainer: 40, Owner: 50 },
diff --git a/spec/frontend/merge_conflicts/store/actions_spec.js b/spec/frontend/merge_conflicts/store/actions_spec.js
index 3e1774a6d56..1b6a0f9e977 100644
--- a/spec/frontend/merge_conflicts/store/actions_spec.js
+++ b/spec/frontend/merge_conflicts/store/actions_spec.js
@@ -34,9 +34,9 @@ describe('merge conflicts actions', () => {
describe('fetchConflictsData', () => {
const conflictsPath = 'conflicts/path/mock';
- it('on success dispatches setConflictsData', (done) => {
+ it('on success dispatches setConflictsData', () => {
mock.onGet(conflictsPath).reply(200, {});
- testAction(
+ return testAction(
actions.fetchConflictsData,
conflictsPath,
{},
@@ -45,13 +45,12 @@ describe('merge conflicts actions', () => {
{ type: types.SET_LOADING_STATE, payload: false },
],
[{ type: 'setConflictsData', payload: {} }],
- done,
);
});
- it('when data has type equal to error ', (done) => {
+ it('when data has type equal to error ', () => {
mock.onGet(conflictsPath).reply(200, { type: 'error', message: 'error message' });
- testAction(
+ return testAction(
actions.fetchConflictsData,
conflictsPath,
{},
@@ -61,13 +60,12 @@ describe('merge conflicts actions', () => {
{ type: types.SET_LOADING_STATE, payload: false },
],
[],
- done,
);
});
- it('when request fails ', (done) => {
+ it('when request fails ', () => {
mock.onGet(conflictsPath).reply(400);
- testAction(
+ return testAction(
actions.fetchConflictsData,
conflictsPath,
{},
@@ -77,15 +75,14 @@ describe('merge conflicts actions', () => {
{ type: types.SET_LOADING_STATE, payload: false },
],
[],
- done,
);
});
});
describe('setConflictsData', () => {
- it('INTERACTIVE_RESOLVE_MODE updates the correct file ', (done) => {
+ it('INTERACTIVE_RESOLVE_MODE updates the correct file ', () => {
decorateFiles.mockReturnValue([{ bar: 'baz' }]);
- testAction(
+ return testAction(
actions.setConflictsData,
{ files, foo: 'bar' },
{},
@@ -96,7 +93,6 @@ describe('merge conflicts actions', () => {
},
],
[],
- done,
);
});
});
@@ -105,24 +101,21 @@ describe('merge conflicts actions', () => {
useMockLocationHelper();
const resolveConflictsPath = 'resolve/conflicts/path/mock';
- it('on success reloads the page', (done) => {
+ it('on success reloads the page', async () => {
mock.onPost(resolveConflictsPath).reply(200, { redirect_to: 'hrefPath' });
- testAction(
+ await testAction(
actions.submitResolvedConflicts,
resolveConflictsPath,
{},
[{ type: types.SET_SUBMIT_STATE, payload: true }],
[],
- () => {
- expect(window.location.assign).toHaveBeenCalledWith('hrefPath');
- done();
- },
);
+ expect(window.location.assign).toHaveBeenCalledWith('hrefPath');
});
- it('on errors shows flash', (done) => {
+ it('on errors shows flash', async () => {
mock.onPost(resolveConflictsPath).reply(400);
- testAction(
+ await testAction(
actions.submitResolvedConflicts,
resolveConflictsPath,
{},
@@ -131,13 +124,10 @@ describe('merge conflicts actions', () => {
{ type: types.SET_SUBMIT_STATE, payload: false },
],
[],
- () => {
- expect(createFlash).toHaveBeenCalledWith({
- message: 'Failed to save merge conflicts resolutions. Please try again!',
- });
- done();
- },
);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Failed to save merge conflicts resolutions. Please try again!',
+ });
});
});
@@ -193,9 +183,9 @@ describe('merge conflicts actions', () => {
});
describe('setViewType', () => {
- it('commits the right mutation', (done) => {
+ it('commits the right mutation', async () => {
const payload = 'viewType';
- testAction(
+ await testAction(
actions.setViewType,
payload,
{},
@@ -206,14 +196,11 @@ describe('merge conflicts actions', () => {
},
],
[],
- () => {
- expect(Cookies.set).toHaveBeenCalledWith('diff_view', payload, {
- expires: 365,
- secure: false,
- });
- done();
- },
);
+ expect(Cookies.set).toHaveBeenCalledWith('diff_view', payload, {
+ expires: 365,
+ secure: false,
+ });
});
});
@@ -252,8 +239,8 @@ describe('merge conflicts actions', () => {
});
describe('setFileResolveMode', () => {
- it('INTERACTIVE_RESOLVE_MODE updates the correct file ', (done) => {
- testAction(
+ it('INTERACTIVE_RESOLVE_MODE updates the correct file ', () => {
+ return testAction(
actions.setFileResolveMode,
{ file: files[0], mode: INTERACTIVE_RESOLVE_MODE },
{ conflictsData: { files }, getFileIndex: () => 0 },
@@ -267,11 +254,10 @@ describe('merge conflicts actions', () => {
},
],
[],
- done,
);
});
- it('EDIT_RESOLVE_MODE updates the correct file ', (done) => {
+ it('EDIT_RESOLVE_MODE updates the correct file ', async () => {
restoreFileLinesState.mockReturnValue([]);
const file = {
...files[0],
@@ -280,7 +266,7 @@ describe('merge conflicts actions', () => {
resolutionData: {},
resolveMode: EDIT_RESOLVE_MODE,
};
- testAction(
+ await testAction(
actions.setFileResolveMode,
{ file: files[0], mode: EDIT_RESOLVE_MODE },
{ conflictsData: { files }, getFileIndex: () => 0 },
@@ -294,17 +280,14 @@ describe('merge conflicts actions', () => {
},
],
[],
- () => {
- expect(restoreFileLinesState).toHaveBeenCalledWith(file);
- done();
- },
);
+ expect(restoreFileLinesState).toHaveBeenCalledWith(file);
});
});
describe('setPromptConfirmationState', () => {
- it('updates the correct file ', (done) => {
- testAction(
+ it('updates the correct file ', () => {
+ return testAction(
actions.setPromptConfirmationState,
{ file: files[0], promptDiscardConfirmation: true },
{ conflictsData: { files }, getFileIndex: () => 0 },
@@ -318,7 +301,6 @@ describe('merge conflicts actions', () => {
},
],
[],
- done,
);
});
});
@@ -333,11 +315,11 @@ describe('merge conflicts actions', () => {
],
};
- it('updates the correct file ', (done) => {
+ it('updates the correct file ', async () => {
const marLikeMockReturn = { foo: 'bar' };
markLine.mockReturnValue(marLikeMockReturn);
- testAction(
+ await testAction(
actions.handleSelected,
{ file, line: { id: 1, section: 'baz' } },
{ conflictsData: { files }, getFileIndex: () => 0 },
@@ -359,11 +341,8 @@ describe('merge conflicts actions', () => {
},
],
[],
- () => {
- expect(markLine).toHaveBeenCalledTimes(3);
- done();
- },
);
+ expect(markLine).toHaveBeenCalledTimes(3);
});
});
});
diff --git a/spec/frontend/milestones/components/delete_milestone_modal_spec.js b/spec/frontend/milestones/components/delete_milestone_modal_spec.js
index 8978de0e0e0..b9ba0833c4f 100644
--- a/spec/frontend/milestones/components/delete_milestone_modal_spec.js
+++ b/spec/frontend/milestones/components/delete_milestone_modal_spec.js
@@ -32,7 +32,7 @@ describe('delete_milestone_modal.vue', () => {
jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
});
- it('deletes milestone and redirects to overview page', (done) => {
+ it('deletes milestone and redirects to overview page', async () => {
const responseURL = `${TEST_HOST}/delete_milestone_modal.vue/milestoneOverview`;
jest.spyOn(axios, 'delete').mockImplementation((url) => {
expect(url).toBe(props.milestoneUrl);
@@ -48,19 +48,15 @@ describe('delete_milestone_modal.vue', () => {
});
});
- vm.onSubmit()
- .then(() => {
- expect(redirectTo).toHaveBeenCalledWith(responseURL);
- expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', {
- milestoneUrl: props.milestoneUrl,
- successful: true,
- });
- })
- .then(done)
- .catch(done.fail);
+ await vm.onSubmit();
+ expect(redirectTo).toHaveBeenCalledWith(responseURL);
+ expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', {
+ milestoneUrl: props.milestoneUrl,
+ successful: true,
+ });
});
- it('displays error if deleting milestone failed', (done) => {
+ it('displays error if deleting milestone failed', async () => {
const dummyError = new Error('deleting milestone failed');
dummyError.response = { status: 418 };
jest.spyOn(axios, 'delete').mockImplementation((url) => {
@@ -73,17 +69,12 @@ describe('delete_milestone_modal.vue', () => {
return Promise.reject(dummyError);
});
- vm.onSubmit()
- .catch((error) => {
- expect(error).toBe(dummyError);
- expect(redirectTo).not.toHaveBeenCalled();
- expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', {
- milestoneUrl: props.milestoneUrl,
- successful: false,
- });
- })
- .then(done)
- .catch(done.fail);
+ await expect(vm.onSubmit()).rejects.toEqual(dummyError);
+ expect(redirectTo).not.toHaveBeenCalled();
+ expect(eventHub.$emit).toHaveBeenCalledWith('deleteMilestoneModal.requestFinished', {
+ milestoneUrl: props.milestoneUrl,
+ successful: false,
+ });
});
});
diff --git a/spec/frontend/milestones/components/milestone_combobox_spec.js b/spec/frontend/milestones/components/milestone_combobox_spec.js
index 1af39aff30c..afd85fb78ce 100644
--- a/spec/frontend/milestones/components/milestone_combobox_spec.js
+++ b/spec/frontend/milestones/components/milestone_combobox_spec.js
@@ -340,7 +340,9 @@ describe('Milestone combobox component', () => {
await nextTick();
expect(
- findFirstProjectMilestonesDropdownItem().find('span').classes('selected-item'),
+ findFirstProjectMilestonesDropdownItem()
+ .find('svg')
+ .classes('gl-new-dropdown-item-check-icon'),
).toBe(true);
selectFirstProjectMilestone();
@@ -348,8 +350,8 @@ describe('Milestone combobox component', () => {
await nextTick();
expect(
- findFirstProjectMilestonesDropdownItem().find('span').classes('selected-item'),
- ).toBe(false);
+ findFirstProjectMilestonesDropdownItem().find('svg').classes('gl-visibility-hidden'),
+ ).toBe(true);
});
describe('when a project milestones is selected', () => {
@@ -464,17 +466,19 @@ describe('Milestone combobox component', () => {
await nextTick();
- expect(findFirstGroupMilestonesDropdownItem().find('span').classes('selected-item')).toBe(
- true,
- );
+ expect(
+ findFirstGroupMilestonesDropdownItem()
+ .find('svg')
+ .classes('gl-new-dropdown-item-check-icon'),
+ ).toBe(true);
selectFirstGroupMilestone();
await nextTick();
- expect(findFirstGroupMilestonesDropdownItem().find('span').classes('selected-item')).toBe(
- false,
- );
+ expect(
+ findFirstGroupMilestonesDropdownItem().find('svg').classes('gl-visibility-hidden'),
+ ).toBe(true);
});
describe('when a group milestones is selected', () => {
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 bd2e818df4f..28039321428 100644
--- a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
+++ b/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
@@ -5,7 +5,7 @@ exports[`Dashboard template matches the default snapshot 1`] = `
class="prometheus-graphs"
data-qa-selector="prometheus_graphs"
environmentstate="available"
- metricsdashboardbasepath="/monitoring/monitor-project/-/environments/1/metrics"
+ metricsdashboardbasepath="/monitoring/monitor-project/-/metrics?environment=1"
metricsendpoint="/monitoring/monitor-project/-/environments/1/additional_metrics.json"
>
<div>
@@ -17,11 +17,11 @@ exports[`Dashboard template matches the default snapshot 1`] = `
primarybuttontext=""
secondarybuttonlink=""
secondarybuttontext=""
- title="Feature deprecation and removal"
- variant="danger"
+ title="Feature deprecation"
+ variant="warning"
>
<gl-sprintf-stub
- message="The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
+ message="The metrics feature was deprecated in GitLab 14.7."
/>
<gl-sprintf-stub
diff --git a/spec/frontend/monitoring/components/__snapshots__/empty_state_spec.js.snap b/spec/frontend/monitoring/components/__snapshots__/empty_state_spec.js.snap
index 4f8a82692b8..08487a7a796 100644
--- a/spec/frontend/monitoring/components/__snapshots__/empty_state_spec.js.snap
+++ b/spec/frontend/monitoring/components/__snapshots__/empty_state_spec.js.snap
@@ -6,6 +6,7 @@ exports[`EmptyState shows gettingStarted state 1`] = `
<gl-empty-state-stub
description="Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
+ invertindarkmode="true"
primarybuttonlink="/clustersPath"
primarybuttontext="Install on clusters"
secondarybuttonlink="/settingsPath"
@@ -22,6 +23,7 @@ exports[`EmptyState shows noData state 1`] = `
<gl-empty-state-stub
description="You are connected to the Prometheus server, but there is currently no data to display."
+ invertindarkmode="true"
primarybuttonlink="/settingsPath"
primarybuttontext="Configure Prometheus"
secondarybuttonlink=""
@@ -38,6 +40,7 @@ exports[`EmptyState shows unableToConnect state 1`] = `
<gl-empty-state-stub
description="Ensure connectivity is available from the GitLab server to the Prometheus server"
+ invertindarkmode="true"
primarybuttonlink="/documentationPath"
primarybuttontext="View documentation"
secondarybuttonlink="/settingsPath"
diff --git a/spec/frontend/monitoring/components/__snapshots__/group_empty_state_spec.js.snap b/spec/frontend/monitoring/components/__snapshots__/group_empty_state_spec.js.snap
index 9b2aa3a5b5b..1d7ff420a17 100644
--- a/spec/frontend/monitoring/components/__snapshots__/group_empty_state_spec.js.snap
+++ b/spec/frontend/monitoring/components/__snapshots__/group_empty_state_spec.js.snap
@@ -4,6 +4,7 @@ exports[`GroupEmptyState given state BAD_QUERY passes the expected props to GlEm
Object {
"compact": true,
"description": null,
+ "invertInDarkMode": true,
"primaryButtonLink": "/path/to/settings",
"primaryButtonText": "Verify configuration",
"secondaryButtonLink": null,
@@ -31,6 +32,7 @@ exports[`GroupEmptyState given state CONNECTION_FAILED passes the expected props
Object {
"compact": true,
"description": "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating.",
+ "invertInDarkMode": true,
"primaryButtonLink": "/path/to/settings",
"primaryButtonText": "Verify configuration",
"secondaryButtonLink": null,
@@ -47,6 +49,7 @@ exports[`GroupEmptyState given state FOO STATE passes the expected props to GlEm
Object {
"compact": true,
"description": "An error occurred while loading the data. Please try again.",
+ "invertInDarkMode": true,
"primaryButtonLink": null,
"primaryButtonText": null,
"secondaryButtonLink": null,
@@ -63,6 +66,7 @@ exports[`GroupEmptyState given state LOADING passes the expected props to GlEmpt
Object {
"compact": true,
"description": "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available.",
+ "invertInDarkMode": true,
"primaryButtonLink": null,
"primaryButtonText": null,
"secondaryButtonLink": null,
@@ -79,6 +83,7 @@ exports[`GroupEmptyState given state NO_DATA passes the expected props to GlEmpt
Object {
"compact": true,
"description": null,
+ "invertInDarkMode": true,
"primaryButtonLink": null,
"primaryButtonText": null,
"secondaryButtonLink": null,
@@ -106,6 +111,7 @@ exports[`GroupEmptyState given state TIMEOUT passes the expected props to GlEmpt
Object {
"compact": true,
"description": null,
+ "invertInDarkMode": true,
"primaryButtonLink": null,
"primaryButtonText": null,
"secondaryButtonLink": null,
@@ -133,6 +139,7 @@ exports[`GroupEmptyState given state UNKNOWN_ERROR passes the expected props to
Object {
"compact": true,
"description": "An error occurred while loading the data. Please try again.",
+ "invertInDarkMode": true,
"primaryButtonLink": null,
"primaryButtonText": null,
"secondaryButtonLink": null,
diff --git a/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js b/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js
index d0d0c3071d5..d74f959ac0f 100644
--- a/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js
@@ -109,7 +109,7 @@ describe('Actions menu', () => {
describe('adding new metric from modal', () => {
let origPage;
- beforeEach((done) => {
+ beforeEach(() => {
jest.spyOn(Tracking, 'event').mockReturnValue();
createShallowWrapper();
@@ -118,7 +118,7 @@ describe('Actions menu', () => {
origPage = document.body.dataset.page;
document.body.dataset.page = 'projects:environments:metrics';
- nextTick(done);
+ return nextTick();
});
afterEach(() => {
diff --git a/spec/frontend/monitoring/components/dashboard_url_time_spec.js b/spec/frontend/monitoring/components/dashboard_url_time_spec.js
index 246dd598d19..64c48100b31 100644
--- a/spec/frontend/monitoring/components/dashboard_url_time_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_url_time_spec.js
@@ -126,7 +126,7 @@ describe('dashboard invalid url parameters', () => {
});
it('redirects to different time range', async () => {
- const toUrl = `${mockProjectDir}/-/environments/1/metrics`;
+ const toUrl = `${mockProjectDir}/-/metrics?environment=1`;
removeParams.mockReturnValueOnce(toUrl);
createMountedWrapper();
diff --git a/spec/frontend/monitoring/store/actions_spec.js b/spec/frontend/monitoring/store/actions_spec.js
index f60c531e3f6..d1a13fbf9cd 100644
--- a/spec/frontend/monitoring/store/actions_spec.js
+++ b/spec/frontend/monitoring/store/actions_spec.js
@@ -7,9 +7,9 @@ import * as commonUtils from '~/lib/utils/common_utils';
import statusCodes from '~/lib/utils/http_status';
import { ENVIRONMENT_AVAILABLE_STATE } from '~/monitoring/constants';
-import getAnnotations from '~/monitoring/queries/getAnnotations.query.graphql';
-import getDashboardValidationWarnings from '~/monitoring/queries/getDashboardValidationWarnings.query.graphql';
-import getEnvironments from '~/monitoring/queries/getEnvironments.query.graphql';
+import getAnnotations from '~/monitoring/queries/get_annotations.query.graphql';
+import getDashboardValidationWarnings from '~/monitoring/queries/get_dashboard_validation_warnings.query.graphql';
+import getEnvironments from '~/monitoring/queries/get_environments.query.graphql';
import { createStore } from '~/monitoring/stores';
import {
setGettingStartedEmptyState,
@@ -88,8 +88,8 @@ describe('Monitoring store actions', () => {
// Setup
describe('setGettingStartedEmptyState', () => {
- it('should commit SET_GETTING_STARTED_EMPTY_STATE mutation', (done) => {
- testAction(
+ it('should commit SET_GETTING_STARTED_EMPTY_STATE mutation', () => {
+ return testAction(
setGettingStartedEmptyState,
null,
state,
@@ -99,14 +99,13 @@ describe('Monitoring store actions', () => {
},
],
[],
- done,
);
});
});
describe('setInitialState', () => {
- it('should commit SET_INITIAL_STATE mutation', (done) => {
- testAction(
+ it('should commit SET_INITIAL_STATE mutation', () => {
+ return testAction(
setInitialState,
{
currentDashboard: '.gitlab/dashboards/dashboard.yml',
@@ -123,7 +122,6 @@ describe('Monitoring store actions', () => {
},
],
[],
- done,
);
});
});
@@ -233,51 +231,39 @@ describe('Monitoring store actions', () => {
};
});
- it('dispatches a failure', (done) => {
- result()
- .then(() => {
- expect(commit).toHaveBeenCalledWith(
- types.SET_ALL_DASHBOARDS,
- mockDashboardsErrorResponse.all_dashboards,
- );
- expect(dispatch).toHaveBeenCalledWith(
- 'receiveMetricsDashboardFailure',
- new Error('Request failed with status code 500'),
- );
- expect(createFlash).toHaveBeenCalled();
- done();
- })
- .catch(done.fail);
+ it('dispatches a failure', async () => {
+ await result();
+ expect(commit).toHaveBeenCalledWith(
+ types.SET_ALL_DASHBOARDS,
+ mockDashboardsErrorResponse.all_dashboards,
+ );
+ expect(dispatch).toHaveBeenCalledWith(
+ 'receiveMetricsDashboardFailure',
+ new Error('Request failed with status code 500'),
+ );
+ expect(createFlash).toHaveBeenCalled();
});
- it('dispatches a failure action when a message is returned', (done) => {
- result()
- .then(() => {
- expect(dispatch).toHaveBeenCalledWith(
- 'receiveMetricsDashboardFailure',
- new Error('Request failed with status code 500'),
- );
- expect(createFlash).toHaveBeenCalledWith({
- message: expect.stringContaining(mockDashboardsErrorResponse.message),
- });
- done();
- })
- .catch(done.fail);
+ it('dispatches a failure action when a message is returned', async () => {
+ await result();
+ expect(dispatch).toHaveBeenCalledWith(
+ 'receiveMetricsDashboardFailure',
+ new Error('Request failed with status code 500'),
+ );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: expect.stringContaining(mockDashboardsErrorResponse.message),
+ });
});
- it('does not show a flash error when showErrorBanner is disabled', (done) => {
+ it('does not show a flash error when showErrorBanner is disabled', async () => {
state.showErrorBanner = false;
- result()
- .then(() => {
- expect(dispatch).toHaveBeenCalledWith(
- 'receiveMetricsDashboardFailure',
- new Error('Request failed with status code 500'),
- );
- expect(createFlash).not.toHaveBeenCalled();
- done();
- })
- .catch(done.fail);
+ await result();
+ expect(dispatch).toHaveBeenCalledWith(
+ 'receiveMetricsDashboardFailure',
+ new Error('Request failed with status code 500'),
+ );
+ expect(createFlash).not.toHaveBeenCalled();
});
});
});
@@ -322,38 +308,30 @@ describe('Monitoring store actions', () => {
state.timeRange = defaultTimeRange;
});
- it('commits empty state when state.groups is empty', (done) => {
+ it('commits empty state when state.groups is empty', async () => {
const localGetters = {
metricsWithData: () => [],
};
- fetchDashboardData({ state, commit, dispatch, getters: localGetters })
- .then(() => {
- expect(Tracking.event).toHaveBeenCalledWith(
- document.body.dataset.page,
- 'dashboard_fetch',
- {
- label: 'custom_metrics_dashboard',
- property: 'count',
- value: 0,
- },
- );
- expect(dispatch).toHaveBeenCalledTimes(2);
- expect(dispatch).toHaveBeenCalledWith('fetchDeploymentsData');
- expect(dispatch).toHaveBeenCalledWith('fetchVariableMetricLabelValues', {
- defaultQueryParams: {
- start_time: expect.any(String),
- end_time: expect.any(String),
- step: expect.any(Number),
- },
- });
+ await fetchDashboardData({ state, commit, dispatch, getters: localGetters });
+ expect(Tracking.event).toHaveBeenCalledWith(document.body.dataset.page, 'dashboard_fetch', {
+ label: 'custom_metrics_dashboard',
+ property: 'count',
+ value: 0,
+ });
+ expect(dispatch).toHaveBeenCalledTimes(2);
+ expect(dispatch).toHaveBeenCalledWith('fetchDeploymentsData');
+ expect(dispatch).toHaveBeenCalledWith('fetchVariableMetricLabelValues', {
+ defaultQueryParams: {
+ start_time: expect.any(String),
+ end_time: expect.any(String),
+ step: expect.any(Number),
+ },
+ });
- expect(createFlash).not.toHaveBeenCalled();
- done();
- })
- .catch(done.fail);
+ expect(createFlash).not.toHaveBeenCalled();
});
- it('dispatches fetchPrometheusMetric for each panel query', (done) => {
+ it('dispatches fetchPrometheusMetric for each panel query', async () => {
state.dashboard.panelGroups = convertObjectPropsToCamelCase(
metricsDashboardResponse.dashboard.panel_groups,
);
@@ -363,34 +341,24 @@ describe('Monitoring store actions', () => {
metricsWithData: () => [metric.id],
};
- fetchDashboardData({ state, commit, dispatch, getters: localGetters })
- .then(() => {
- expect(dispatch).toHaveBeenCalledWith('fetchPrometheusMetric', {
- metric,
- defaultQueryParams: {
- start_time: expect.any(String),
- end_time: expect.any(String),
- step: expect.any(Number),
- },
- });
-
- expect(Tracking.event).toHaveBeenCalledWith(
- document.body.dataset.page,
- 'dashboard_fetch',
- {
- label: 'custom_metrics_dashboard',
- property: 'count',
- value: 1,
- },
- );
+ await fetchDashboardData({ state, commit, dispatch, getters: localGetters });
+ expect(dispatch).toHaveBeenCalledWith('fetchPrometheusMetric', {
+ metric,
+ defaultQueryParams: {
+ start_time: expect.any(String),
+ end_time: expect.any(String),
+ step: expect.any(Number),
+ },
+ });
- done();
- })
- .catch(done.fail);
- done();
+ expect(Tracking.event).toHaveBeenCalledWith(document.body.dataset.page, 'dashboard_fetch', {
+ label: 'custom_metrics_dashboard',
+ property: 'count',
+ value: 1,
+ });
});
- it('dispatches fetchPrometheusMetric for each panel query, handles an error', (done) => {
+ it('dispatches fetchPrometheusMetric for each panel query, handles an error', async () => {
state.dashboard.panelGroups = metricsDashboardViewModel.panelGroups;
const metric = state.dashboard.panelGroups[0].panels[0].metrics[0];
@@ -400,30 +368,24 @@ describe('Monitoring store actions', () => {
dispatch.mockRejectedValueOnce(new Error('Error fetching this metric'));
dispatch.mockResolvedValue();
- fetchDashboardData({ state, commit, dispatch })
- .then(() => {
- const defaultQueryParams = {
- start_time: expect.any(String),
- end_time: expect.any(String),
- step: expect.any(Number),
- };
-
- expect(dispatch).toHaveBeenCalledTimes(metricsDashboardPanelCount + 2); // plus 1 for deployments
- expect(dispatch).toHaveBeenCalledWith('fetchDeploymentsData');
- expect(dispatch).toHaveBeenCalledWith('fetchVariableMetricLabelValues', {
- defaultQueryParams,
- });
- expect(dispatch).toHaveBeenCalledWith('fetchPrometheusMetric', {
- metric,
- defaultQueryParams,
- });
+ await fetchDashboardData({ state, commit, dispatch });
+ const defaultQueryParams = {
+ start_time: expect.any(String),
+ end_time: expect.any(String),
+ step: expect.any(Number),
+ };
- expect(createFlash).toHaveBeenCalledTimes(1);
+ expect(dispatch).toHaveBeenCalledTimes(metricsDashboardPanelCount + 2); // plus 1 for deployments
+ expect(dispatch).toHaveBeenCalledWith('fetchDeploymentsData');
+ expect(dispatch).toHaveBeenCalledWith('fetchVariableMetricLabelValues', {
+ defaultQueryParams,
+ });
+ expect(dispatch).toHaveBeenCalledWith('fetchPrometheusMetric', {
+ metric,
+ defaultQueryParams,
+ });
- done();
- })
- .catch(done.fail);
- done();
+ expect(createFlash).toHaveBeenCalledTimes(1);
});
});
@@ -449,10 +411,10 @@ describe('Monitoring store actions', () => {
};
});
- it('commits result', (done) => {
+ it('commits result', () => {
mock.onGet(prometheusEndpointPath).reply(200, { data }); // One attempt
- testAction(
+ return testAction(
fetchPrometheusMetric,
{ metric, defaultQueryParams },
state,
@@ -472,10 +434,7 @@ describe('Monitoring store actions', () => {
},
],
[],
- () => {
- done();
- },
- ).catch(done.fail);
+ );
});
describe('without metric defined step', () => {
@@ -485,10 +444,10 @@ describe('Monitoring store actions', () => {
step: 60,
};
- it('uses calculated step', (done) => {
+ it('uses calculated step', async () => {
mock.onGet(prometheusEndpointPath).reply(200, { data }); // One attempt
- testAction(
+ await testAction(
fetchPrometheusMetric,
{ metric, defaultQueryParams },
state,
@@ -508,11 +467,8 @@ describe('Monitoring store actions', () => {
},
],
[],
- () => {
- expect(mock.history.get[0].params).toEqual(expectedParams);
- done();
- },
- ).catch(done.fail);
+ );
+ expect(mock.history.get[0].params).toEqual(expectedParams);
});
});
@@ -527,10 +483,10 @@ describe('Monitoring store actions', () => {
step: 7,
};
- it('uses metric step', (done) => {
+ it('uses metric step', async () => {
mock.onGet(prometheusEndpointPath).reply(200, { data }); // One attempt
- testAction(
+ await testAction(
fetchPrometheusMetric,
{ metric, defaultQueryParams },
state,
@@ -550,43 +506,39 @@ describe('Monitoring store actions', () => {
},
],
[],
- () => {
- expect(mock.history.get[0].params).toEqual(expectedParams);
- done();
- },
- ).catch(done.fail);
+ );
+ expect(mock.history.get[0].params).toEqual(expectedParams);
});
});
- it('commits failure, when waiting for results and getting a server error', (done) => {
+ it('commits failure, when waiting for results and getting a server error', async () => {
mock.onGet(prometheusEndpointPath).reply(500);
const error = new Error('Request failed with status code 500');
- testAction(
- fetchPrometheusMetric,
- { metric, defaultQueryParams },
- state,
- [
- {
- type: types.REQUEST_METRIC_RESULT,
- payload: {
- metricId: metric.metricId,
+ await expect(
+ testAction(
+ fetchPrometheusMetric,
+ { metric, defaultQueryParams },
+ state,
+ [
+ {
+ type: types.REQUEST_METRIC_RESULT,
+ payload: {
+ metricId: metric.metricId,
+ },
},
- },
- {
- type: types.RECEIVE_METRIC_RESULT_FAILURE,
- payload: {
- metricId: metric.metricId,
- error,
+ {
+ type: types.RECEIVE_METRIC_RESULT_FAILURE,
+ payload: {
+ metricId: metric.metricId,
+ error,
+ },
},
- },
- ],
- [],
- ).catch((e) => {
- expect(e).toEqual(error);
- done();
- });
+ ],
+ [],
+ ),
+ ).rejects.toEqual(error);
});
});
@@ -991,20 +943,16 @@ describe('Monitoring store actions', () => {
state.dashboardsEndpoint = '/dashboards.json';
});
- it('Succesful POST request resolves', (done) => {
+ it('Succesful POST request resolves', async () => {
mock.onPost(state.dashboardsEndpoint).reply(statusCodes.CREATED, {
dashboard: dashboardGitResponse[1],
});
- testAction(duplicateSystemDashboard, {}, state, [], [])
- .then(() => {
- expect(mock.history.post).toHaveLength(1);
- done();
- })
- .catch(done.fail);
+ await testAction(duplicateSystemDashboard, {}, state, [], []);
+ expect(mock.history.post).toHaveLength(1);
});
- it('Succesful POST request resolves to a dashboard', (done) => {
+ it('Succesful POST request resolves to a dashboard', async () => {
const mockCreatedDashboard = dashboardGitResponse[1];
const params = {
@@ -1025,50 +973,40 @@ describe('Monitoring store actions', () => {
dashboard: mockCreatedDashboard,
});
- testAction(duplicateSystemDashboard, params, state, [], [])
- .then((result) => {
- expect(mock.history.post).toHaveLength(1);
- expect(mock.history.post[0].data).toEqual(expectedPayload);
- expect(result).toEqual(mockCreatedDashboard);
-
- done();
- })
- .catch(done.fail);
+ const result = await testAction(duplicateSystemDashboard, params, state, [], []);
+ expect(mock.history.post).toHaveLength(1);
+ expect(mock.history.post[0].data).toEqual(expectedPayload);
+ expect(result).toEqual(mockCreatedDashboard);
});
- it('Failed POST request throws an error', (done) => {
+ it('Failed POST request throws an error', async () => {
mock.onPost(state.dashboardsEndpoint).reply(statusCodes.BAD_REQUEST);
- testAction(duplicateSystemDashboard, {}, state, [], []).catch((err) => {
- expect(mock.history.post).toHaveLength(1);
- expect(err).toEqual(expect.any(String));
-
- done();
- });
+ await expect(testAction(duplicateSystemDashboard, {}, state, [], [])).rejects.toEqual(
+ 'There was an error creating the dashboard.',
+ );
+ expect(mock.history.post).toHaveLength(1);
});
- it('Failed POST request throws an error with a description', (done) => {
+ it('Failed POST request throws an error with a description', async () => {
const backendErrorMsg = 'This file already exists!';
mock.onPost(state.dashboardsEndpoint).reply(statusCodes.BAD_REQUEST, {
error: backendErrorMsg,
});
- testAction(duplicateSystemDashboard, {}, state, [], []).catch((err) => {
- expect(mock.history.post).toHaveLength(1);
- expect(err).toEqual(expect.any(String));
- expect(err).toEqual(expect.stringContaining(backendErrorMsg));
-
- done();
- });
+ await expect(testAction(duplicateSystemDashboard, {}, state, [], [])).rejects.toEqual(
+ `There was an error creating the dashboard. ${backendErrorMsg}`,
+ );
+ expect(mock.history.post).toHaveLength(1);
});
});
// Variables manipulation
describe('updateVariablesAndFetchData', () => {
- it('should commit UPDATE_VARIABLE_VALUE mutation and fetch data', (done) => {
- testAction(
+ it('should commit UPDATE_VARIABLE_VALUE mutation and fetch data', () => {
+ return testAction(
updateVariablesAndFetchData,
{ pod: 'POD' },
state,
@@ -1083,7 +1021,6 @@ describe('Monitoring store actions', () => {
type: 'fetchDashboardData',
},
],
- done,
);
});
});
diff --git a/spec/frontend/monitoring/store/utils_spec.js b/spec/frontend/monitoring/store/utils_spec.js
index 697bdb9185f..c25de8caa95 100644
--- a/spec/frontend/monitoring/store/utils_spec.js
+++ b/spec/frontend/monitoring/store/utils_spec.js
@@ -547,7 +547,7 @@ describe('parseEnvironmentsResponse', () => {
{
id: 1,
name: 'env-1',
- metrics_path: `${projectPath}/environments/1/metrics`,
+ metrics_path: `${projectPath}/-/metrics?environment=1`,
},
],
},
@@ -562,7 +562,7 @@ describe('parseEnvironmentsResponse', () => {
{
id: 12,
name: 'env-12',
- metrics_path: `${projectPath}/environments/12/metrics`,
+ metrics_path: `${projectPath}/-/metrics?environment=12`,
},
],
},
diff --git a/spec/frontend/mr_notes/stores/actions_spec.js b/spec/frontend/mr_notes/stores/actions_spec.js
index c6578453d85..568c1b930c9 100644
--- a/spec/frontend/mr_notes/stores/actions_spec.js
+++ b/spec/frontend/mr_notes/stores/actions_spec.js
@@ -1,64 +1,37 @@
import MockAdapter from 'axios-mock-adapter';
-
-import testAction from 'helpers/vuex_action_helper';
import axios from '~/lib/utils/axios_utils';
-import { setEndpoints, setMrMetadata, fetchMrMetadata } from '~/mr_notes/stores/actions';
-import mutationTypes from '~/mr_notes/stores/mutation_types';
+import { createStore } from '~/mr_notes/stores';
describe('MR Notes Mutator Actions', () => {
+ let store;
+
+ beforeEach(() => {
+ store = createStore();
+ });
+
describe('setEndpoints', () => {
- it('should trigger the SET_ENDPOINTS state mutation', (done) => {
+ it('sets endpoints', async () => {
const endpoints = { endpointA: 'a' };
- testAction(
- setEndpoints,
- endpoints,
- {},
- [
- {
- type: mutationTypes.SET_ENDPOINTS,
- payload: endpoints,
- },
- ],
- [],
- done,
- );
- });
- });
+ await store.dispatch('setEndpoints', endpoints);
- describe('setMrMetadata', () => {
- it('should trigger the SET_MR_METADATA state mutation', async () => {
- const mrMetadata = { propA: 'a', propB: 'b' };
-
- await testAction(
- setMrMetadata,
- mrMetadata,
- {},
- [
- {
- type: mutationTypes.SET_MR_METADATA,
- payload: mrMetadata,
- },
- ],
- [],
- );
+ expect(store.state.page.endpoints).toEqual(endpoints);
});
});
describe('fetchMrMetadata', () => {
const mrMetadata = { meta: true, data: 'foo' };
- const state = {
- endpoints: {
- metadata: 'metadata',
- },
- };
+ const metadata = 'metadata';
+ const endpoints = { metadata };
let mock;
- beforeEach(() => {
+ beforeEach(async () => {
+ await store.dispatch('setEndpoints', endpoints);
+
mock = new MockAdapter(axios);
- mock.onGet(state.endpoints.metadata).reply(200, mrMetadata);
+ mock.onGet(metadata).reply(200, mrMetadata);
});
afterEach(() => {
@@ -66,27 +39,26 @@ describe('MR Notes Mutator Actions', () => {
});
it('should fetch the data from the API', async () => {
- await fetchMrMetadata({ state, dispatch: () => {} });
+ await store.dispatch('fetchMrMetadata');
await axios.waitForAll();
expect(mock.history.get).toHaveLength(1);
- expect(mock.history.get[0].url).toBe(state.endpoints.metadata);
+ expect(mock.history.get[0].url).toBe(metadata);
+ });
+
+ it('should set the fetched data into state', async () => {
+ await store.dispatch('fetchMrMetadata');
+
+ expect(store.state.page.mrMetadata).toEqual(mrMetadata);
});
- it('should set the fetched data into state', () => {
- return testAction(
- fetchMrMetadata,
- {},
- state,
- [],
- [
- {
- type: 'setMrMetadata',
- payload: mrMetadata,
- },
- ],
- );
+ it('should set failedToLoadMetadata flag when request fails', async () => {
+ mock.onGet(metadata).reply(500);
+
+ await store.dispatch('fetchMrMetadata');
+
+ expect(store.state.page.failedToLoadMetadata).toBe(true);
});
});
});
diff --git a/spec/frontend/notes/components/diff_discussion_header_spec.js b/spec/frontend/notes/components/diff_discussion_header_spec.js
index 9f94dd693cb..7878737fd31 100644
--- a/spec/frontend/notes/components/diff_discussion_header_spec.js
+++ b/spec/frontend/notes/components/diff_discussion_header_spec.js
@@ -4,7 +4,7 @@ import { nextTick } from 'vue';
import diffDiscussionHeader from '~/notes/components/diff_discussion_header.vue';
import createStore from '~/notes/stores';
-import mockDiffFile from '../../diffs/mock_data/diff_discussions';
+import mockDiffFile from 'jest/diffs/mock_data/diff_discussions';
import { discussionMock } from '../mock_data';
describe('diff_discussion_header component', () => {
diff --git a/spec/frontend/notes/components/note_actions_spec.js b/spec/frontend/notes/components/note_actions_spec.js
index 780f24b3aa8..bf5a6b4966a 100644
--- a/spec/frontend/notes/components/note_actions_spec.js
+++ b/spec/frontend/notes/components/note_actions_spec.js
@@ -87,8 +87,7 @@ describe('noteActions', () => {
});
it('should render emoji link', () => {
- expect(wrapper.find('.js-add-award').exists()).toBe(true);
- expect(wrapper.find('.js-add-award').attributes('data-position')).toBe('right');
+ expect(wrapper.find('[data-testid="note-emoji-button"]').exists()).toBe(true);
});
describe('actions dropdown', () => {
diff --git a/spec/frontend/notes/components/note_form_spec.js b/spec/frontend/notes/components/note_form_spec.js
index 3e80b24f128..b709141f4ac 100644
--- a/spec/frontend/notes/components/note_form_spec.js
+++ b/spec/frontend/notes/components/note_form_spec.js
@@ -81,7 +81,6 @@ describe('issue_note_form component', () => {
it('should show conflict message if note changes outside the component', async () => {
wrapper.setProps({
...props,
- isEditing: true,
noteBody: 'Foo',
});
@@ -111,6 +110,12 @@ describe('issue_note_form component', () => {
);
});
+ it('should set data-supports-quick-actions to enable autocomplete', () => {
+ const textarea = wrapper.find('textarea');
+
+ expect(textarea.attributes('data-supports-quick-actions')).toBe('true');
+ });
+
it('should link to markdown docs', () => {
const { markdownDocsPath } = notesDataMock;
const markdownField = wrapper.find(MarkdownField);
@@ -171,7 +176,6 @@ describe('issue_note_form component', () => {
it('should be possible to cancel', async () => {
wrapper.setProps({
...props,
- isEditing: true,
});
await nextTick();
@@ -185,7 +189,6 @@ describe('issue_note_form component', () => {
it('should be possible to update the note', async () => {
wrapper.setProps({
...props,
- isEditing: true,
});
await nextTick();
diff --git a/spec/frontend/notes/components/note_header_spec.js b/spec/frontend/notes/components/note_header_spec.js
index 4671d33219d..3513b562e0a 100644
--- a/spec/frontend/notes/components/note_header_spec.js
+++ b/spec/frontend/notes/components/note_header_spec.js
@@ -263,7 +263,7 @@ describe('NoteHeader component', () => {
});
describe('when author username link is hovered', () => {
- it('toggles hover specific CSS classes on author name link', (done) => {
+ it('toggles hover specific CSS classes on author name link', async () => {
createComponent({ author });
const authorUsernameLink = wrapper.find({ ref: 'authorUsernameLink' });
@@ -271,19 +271,15 @@ describe('NoteHeader component', () => {
authorUsernameLink.trigger('mouseenter');
- nextTick(() => {
- expect(authorNameLink.classes()).toContain('hover');
- expect(authorNameLink.classes()).toContain('text-underline');
+ await nextTick();
+ expect(authorNameLink.classes()).toContain('hover');
+ expect(authorNameLink.classes()).toContain('text-underline');
- authorUsernameLink.trigger('mouseleave');
+ authorUsernameLink.trigger('mouseleave');
- nextTick(() => {
- expect(authorNameLink.classes()).not.toContain('hover');
- expect(authorNameLink.classes()).not.toContain('text-underline');
-
- done();
- });
- });
+ await nextTick();
+ expect(authorNameLink.classes()).not.toContain('hover');
+ expect(authorNameLink.classes()).not.toContain('text-underline');
});
});
@@ -296,5 +292,13 @@ describe('NoteHeader component', () => {
createComponent({ isConfidential: status });
expect(findConfidentialIndicator().exists()).toBe(status);
});
+
+ it('shows confidential indicator tooltip for project context', () => {
+ createComponent({ isConfidential: true, noteableType: 'issue' });
+
+ expect(findConfidentialIndicator().attributes('title')).toBe(
+ 'This comment is confidential and only visible to project members',
+ );
+ });
});
});
diff --git a/spec/frontend/notes/components/noteable_discussion_spec.js b/spec/frontend/notes/components/noteable_discussion_spec.js
index 727ef02dcbb..c46d3bbe5b2 100644
--- a/spec/frontend/notes/components/noteable_discussion_spec.js
+++ b/spec/frontend/notes/components/noteable_discussion_spec.js
@@ -86,7 +86,6 @@ describe('noteable_discussion component', () => {
const noteFormProps = noteForm.props();
expect(noteFormProps.discussion).toBe(discussionMock);
- expect(noteFormProps.isEditing).toBe(false);
expect(noteFormProps.line).toBe(null);
expect(noteFormProps.saveButtonTitle).toBe('Comment');
expect(noteFormProps.autosaveKey).toBe(`Note/Issue/${discussionMock.id}/Reply`);
diff --git a/spec/frontend/notes/components/noteable_note_spec.js b/spec/frontend/notes/components/noteable_note_spec.js
index c7115a5911b..385edc59eb6 100644
--- a/spec/frontend/notes/components/noteable_note_spec.js
+++ b/spec/frontend/notes/components/noteable_note_spec.js
@@ -11,6 +11,7 @@ import NoteBody from '~/notes/components/note_body.vue';
import NoteHeader from '~/notes/components/note_header.vue';
import issueNote from '~/notes/components/noteable_note.vue';
import NotesModule from '~/notes/stores/modules';
+import { NOTEABLE_TYPE_MAPPING } from '~/notes/constants';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
@@ -226,6 +227,7 @@ describe('issue_note', () => {
expect(noteHeaderProps.author).toBe(note.author);
expect(noteHeaderProps.createdAt).toBe(note.created_at);
expect(noteHeaderProps.noteId).toBe(note.id);
+ expect(noteHeaderProps.noteableType).toBe(NOTEABLE_TYPE_MAPPING[note.noteable_type]);
});
it('should render note actions', () => {
diff --git a/spec/frontend/notes/components/notes_app_spec.js b/spec/frontend/notes/components/notes_app_spec.js
index bf36d6cb7a2..e227af88d3f 100644
--- a/spec/frontend/notes/components/notes_app_spec.js
+++ b/spec/frontend/notes/components/notes_app_spec.js
@@ -300,16 +300,18 @@ describe('note_app', () => {
await nextTick();
expect(wrapper.find(`.edit-note a[href="${markdownDocsPath}"]`).text().trim()).toEqual(
- 'Markdown is supported',
+ 'Markdown',
);
});
- it('should not render quick actions docs url', async () => {
+ it('should render quick actions docs url', async () => {
wrapper.find('.js-note-edit').trigger('click');
const { quickActionsDocsPath } = mockData.notesDataMock;
await nextTick();
- expect(wrapper.find(`.edit-note a[href="${quickActionsDocsPath}"]`).exists()).toBe(false);
+ expect(wrapper.find(`.edit-note a[href="${quickActionsDocsPath}"]`).text().trim()).toEqual(
+ 'quick actions',
+ );
});
});
diff --git a/spec/frontend/notes/components/sort_discussion_spec.js b/spec/frontend/notes/components/sort_discussion_spec.js
index a279dfd1ef3..bde27b7e5fc 100644
--- a/spec/frontend/notes/components/sort_discussion_spec.js
+++ b/spec/frontend/notes/components/sort_discussion_spec.js
@@ -38,8 +38,8 @@ describe('Sort Discussion component', () => {
createComponent();
});
- it('has local storage sync', () => {
- expect(findLocalStorageSync().exists()).toBe(true);
+ it('has local storage sync with the correct props', () => {
+ expect(findLocalStorageSync().props('asString')).toBe(true);
});
it('calls setDiscussionSortDirection when update is emitted', () => {
diff --git a/spec/frontend/notes/deprecated_notes_spec.js b/spec/frontend/notes/deprecated_notes_spec.js
index 7c52920da90..7193475c96a 100644
--- a/spec/frontend/notes/deprecated_notes_spec.js
+++ b/spec/frontend/notes/deprecated_notes_spec.js
@@ -561,7 +561,7 @@ describe.skip('Old Notes (~/deprecated_notes.js)', () => {
});
describe('postComment', () => {
- it('disables the submit button', (done) => {
+ it('disables the submit button', async () => {
const $submitButton = $form.find('.js-comment-submit-button');
expect($submitButton).not.toBeDisabled();
@@ -574,13 +574,8 @@ describe.skip('Old Notes (~/deprecated_notes.js)', () => {
return [200, note];
});
- notes
- .postComment(dummyEvent)
- .then(() => {
- expect($submitButton).not.toBeDisabled();
- })
- .then(done)
- .catch(done.fail);
+ await notes.postComment(dummyEvent);
+ expect($submitButton).not.toBeDisabled();
});
});
diff --git a/spec/frontend/notes/stores/actions_spec.js b/spec/frontend/notes/stores/actions_spec.js
index 7424a87bc0f..75e7756cd6b 100644
--- a/spec/frontend/notes/stores/actions_spec.js
+++ b/spec/frontend/notes/stores/actions_spec.js
@@ -62,118 +62,109 @@ describe('Actions Notes Store', () => {
});
describe('setNotesData', () => {
- it('should set received notes data', (done) => {
- testAction(
+ it('should set received notes data', () => {
+ return testAction(
actions.setNotesData,
notesDataMock,
{ notesData: {} },
[{ type: 'SET_NOTES_DATA', payload: notesDataMock }],
[],
- done,
);
});
});
describe('setNoteableData', () => {
- it('should set received issue data', (done) => {
- testAction(
+ it('should set received issue data', () => {
+ return testAction(
actions.setNoteableData,
noteableDataMock,
{ noteableData: {} },
[{ type: 'SET_NOTEABLE_DATA', payload: noteableDataMock }],
[],
- done,
);
});
});
describe('setUserData', () => {
- it('should set received user data', (done) => {
- testAction(
+ it('should set received user data', () => {
+ return testAction(
actions.setUserData,
userDataMock,
{ userData: {} },
[{ type: 'SET_USER_DATA', payload: userDataMock }],
[],
- done,
);
});
});
describe('setLastFetchedAt', () => {
- it('should set received timestamp', (done) => {
- testAction(
+ it('should set received timestamp', () => {
+ return testAction(
actions.setLastFetchedAt,
'timestamp',
{ lastFetchedAt: {} },
[{ type: 'SET_LAST_FETCHED_AT', payload: 'timestamp' }],
[],
- done,
);
});
});
describe('setInitialNotes', () => {
- it('should set initial notes', (done) => {
- testAction(
+ it('should set initial notes', () => {
+ return testAction(
actions.setInitialNotes,
[individualNote],
{ notes: [] },
[{ type: 'ADD_OR_UPDATE_DISCUSSIONS', payload: [individualNote] }],
[],
- done,
);
});
});
describe('setTargetNoteHash', () => {
- it('should set target note hash', (done) => {
- testAction(
+ it('should set target note hash', () => {
+ return testAction(
actions.setTargetNoteHash,
'hash',
{ notes: [] },
[{ type: 'SET_TARGET_NOTE_HASH', payload: 'hash' }],
[],
- done,
);
});
});
describe('toggleDiscussion', () => {
- it('should toggle discussion', (done) => {
- testAction(
+ it('should toggle discussion', () => {
+ return testAction(
actions.toggleDiscussion,
{ discussionId: discussionMock.id },
{ notes: [discussionMock] },
[{ type: 'TOGGLE_DISCUSSION', payload: { discussionId: discussionMock.id } }],
[],
- done,
);
});
});
describe('expandDiscussion', () => {
- it('should expand discussion', (done) => {
- testAction(
+ it('should expand discussion', () => {
+ return testAction(
actions.expandDiscussion,
{ discussionId: discussionMock.id },
{ notes: [discussionMock] },
[{ type: 'EXPAND_DISCUSSION', payload: { discussionId: discussionMock.id } }],
[{ type: 'diffs/renderFileForDiscussionId', payload: discussionMock.id }],
- done,
);
});
});
describe('collapseDiscussion', () => {
- it('should commit collapse discussion', (done) => {
- testAction(
+ it('should commit collapse discussion', () => {
+ return testAction(
actions.collapseDiscussion,
{ discussionId: discussionMock.id },
{ notes: [discussionMock] },
[{ type: 'COLLAPSE_DISCUSSION', payload: { discussionId: discussionMock.id } }],
[],
- done,
);
});
});
@@ -184,28 +175,18 @@ describe('Actions Notes Store', () => {
});
describe('closeMergeRequest', () => {
- it('sets state as closed', (done) => {
- store
- .dispatch('closeIssuable', { notesData: { closeIssuePath: '' } })
- .then(() => {
- expect(store.state.noteableData.state).toEqual('closed');
- expect(store.state.isToggleStateButtonLoading).toEqual(false);
- done();
- })
- .catch(done.fail);
+ it('sets state as closed', async () => {
+ await store.dispatch('closeIssuable', { notesData: { closeIssuePath: '' } });
+ expect(store.state.noteableData.state).toEqual('closed');
+ expect(store.state.isToggleStateButtonLoading).toEqual(false);
});
});
describe('reopenMergeRequest', () => {
- it('sets state as reopened', (done) => {
- store
- .dispatch('reopenIssuable', { notesData: { reopenIssuePath: '' } })
- .then(() => {
- expect(store.state.noteableData.state).toEqual('reopened');
- expect(store.state.isToggleStateButtonLoading).toEqual(false);
- done();
- })
- .catch(done.fail);
+ it('sets state as reopened', async () => {
+ await store.dispatch('reopenIssuable', { notesData: { reopenIssuePath: '' } });
+ expect(store.state.noteableData.state).toEqual('reopened');
+ expect(store.state.isToggleStateButtonLoading).toEqual(false);
});
});
});
@@ -222,42 +203,39 @@ describe('Actions Notes Store', () => {
});
describe('toggleStateButtonLoading', () => {
- it('should set loading as true', (done) => {
- testAction(
+ it('should set loading as true', () => {
+ return testAction(
actions.toggleStateButtonLoading,
true,
{},
[{ type: 'TOGGLE_STATE_BUTTON_LOADING', payload: true }],
[],
- done,
);
});
- it('should set loading as false', (done) => {
- testAction(
+ it('should set loading as false', () => {
+ return testAction(
actions.toggleStateButtonLoading,
false,
{},
[{ type: 'TOGGLE_STATE_BUTTON_LOADING', payload: false }],
[],
- done,
);
});
});
describe('toggleIssueLocalState', () => {
- it('sets issue state as closed', (done) => {
- testAction(actions.toggleIssueLocalState, 'closed', {}, [{ type: 'CLOSE_ISSUE' }], [], done);
+ it('sets issue state as closed', () => {
+ return testAction(actions.toggleIssueLocalState, 'closed', {}, [{ type: 'CLOSE_ISSUE' }], []);
});
- it('sets issue state as reopened', (done) => {
- testAction(
+ it('sets issue state as reopened', () => {
+ return testAction(
actions.toggleIssueLocalState,
'reopened',
{},
[{ type: 'REOPEN_ISSUE' }],
[],
- done,
);
});
});
@@ -291,8 +269,8 @@ describe('Actions Notes Store', () => {
return store.dispatch('stopPolling');
};
- beforeEach((done) => {
- store.dispatch('setNotesData', notesDataMock).then(done).catch(done.fail);
+ beforeEach(() => {
+ return store.dispatch('setNotesData', notesDataMock);
});
afterEach(() => {
@@ -405,14 +383,13 @@ describe('Actions Notes Store', () => {
});
describe('setNotesFetchedState', () => {
- it('should set notes fetched state', (done) => {
- testAction(
+ it('should set notes fetched state', () => {
+ return testAction(
actions.setNotesFetchedState,
true,
{},
[{ type: 'SET_NOTES_FETCHED_STATE', payload: true }],
[],
- done,
);
});
});
@@ -432,10 +409,10 @@ describe('Actions Notes Store', () => {
document.body.setAttribute('data-page', '');
});
- it('commits DELETE_NOTE and dispatches updateMergeRequestWidget', (done) => {
+ it('commits DELETE_NOTE and dispatches updateMergeRequestWidget', () => {
const note = { path: endpoint, id: 1 };
- testAction(
+ return testAction(
actions.removeNote,
note,
store.state,
@@ -453,16 +430,15 @@ describe('Actions Notes Store', () => {
type: 'updateResolvableDiscussionsCounts',
},
],
- done,
);
});
- it('dispatches removeDiscussionsFromDiff on merge request page', (done) => {
+ it('dispatches removeDiscussionsFromDiff on merge request page', () => {
const note = { path: endpoint, id: 1 };
document.body.setAttribute('data-page', 'projects:merge_requests:show');
- testAction(
+ return testAction(
actions.removeNote,
note,
store.state,
@@ -483,7 +459,6 @@ describe('Actions Notes Store', () => {
type: 'diffs/removeDiscussionsFromDiff',
},
],
- done,
);
});
});
@@ -503,10 +478,10 @@ describe('Actions Notes Store', () => {
document.body.setAttribute('data-page', '');
});
- it('dispatches removeNote', (done) => {
+ it('dispatches removeNote', () => {
const note = { path: endpoint, id: 1 };
- testAction(
+ return testAction(
actions.deleteNote,
note,
{},
@@ -520,7 +495,6 @@ describe('Actions Notes Store', () => {
},
},
],
- done,
);
});
});
@@ -536,8 +510,8 @@ describe('Actions Notes Store', () => {
axiosMock.onAny().reply(200, res);
});
- it('commits ADD_NEW_NOTE and dispatches updateMergeRequestWidget', (done) => {
- testAction(
+ it('commits ADD_NEW_NOTE and dispatches updateMergeRequestWidget', () => {
+ return testAction(
actions.createNewNote,
{ endpoint: `${TEST_HOST}`, data: {} },
store.state,
@@ -558,7 +532,6 @@ describe('Actions Notes Store', () => {
type: 'updateResolvableDiscussionsCounts',
},
],
- done,
);
});
});
@@ -572,14 +545,13 @@ describe('Actions Notes Store', () => {
axiosMock.onAny().replyOnce(200, res);
});
- it('does not commit ADD_NEW_NOTE or dispatch updateMergeRequestWidget', (done) => {
- testAction(
+ it('does not commit ADD_NEW_NOTE or dispatch updateMergeRequestWidget', () => {
+ return testAction(
actions.createNewNote,
{ endpoint: `${TEST_HOST}`, data: {} },
store.state,
[],
[],
- done,
);
});
});
@@ -595,8 +567,8 @@ describe('Actions Notes Store', () => {
});
describe('as note', () => {
- it('commits UPDATE_NOTE and dispatches updateMergeRequestWidget', (done) => {
- testAction(
+ it('commits UPDATE_NOTE and dispatches updateMergeRequestWidget', () => {
+ return testAction(
actions.toggleResolveNote,
{ endpoint: `${TEST_HOST}`, isResolved: true, discussion: false },
store.state,
@@ -614,14 +586,13 @@ describe('Actions Notes Store', () => {
type: 'updateMergeRequestWidget',
},
],
- done,
);
});
});
describe('as discussion', () => {
- it('commits UPDATE_DISCUSSION and dispatches updateMergeRequestWidget', (done) => {
- testAction(
+ it('commits UPDATE_DISCUSSION and dispatches updateMergeRequestWidget', () => {
+ return testAction(
actions.toggleResolveNote,
{ endpoint: `${TEST_HOST}`, isResolved: true, discussion: true },
store.state,
@@ -639,7 +610,6 @@ describe('Actions Notes Store', () => {
type: 'updateMergeRequestWidget',
},
],
- done,
);
});
});
@@ -656,41 +626,38 @@ describe('Actions Notes Store', () => {
});
describe('setCommentsDisabled', () => {
- it('should set comments disabled state', (done) => {
- testAction(
+ it('should set comments disabled state', () => {
+ return testAction(
actions.setCommentsDisabled,
true,
null,
[{ type: 'DISABLE_COMMENTS', payload: true }],
[],
- done,
);
});
});
describe('updateResolvableDiscussionsCounts', () => {
- it('commits UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS', (done) => {
- testAction(
+ it('commits UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS', () => {
+ return testAction(
actions.updateResolvableDiscussionsCounts,
null,
{},
[{ type: 'UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS' }],
[],
- done,
);
});
});
describe('convertToDiscussion', () => {
- it('commits CONVERT_TO_DISCUSSION with noteId', (done) => {
+ it('commits CONVERT_TO_DISCUSSION with noteId', () => {
const noteId = 'dummy-note-id';
- testAction(
+ return testAction(
actions.convertToDiscussion,
noteId,
{},
[{ type: 'CONVERT_TO_DISCUSSION', payload: noteId }],
[],
- done,
);
});
});
@@ -786,11 +753,11 @@ describe('Actions Notes Store', () => {
describe('replyToDiscussion', () => {
const payload = { endpoint: TEST_HOST, data: {} };
- it('updates discussion if response contains disussion', (done) => {
+ it('updates discussion if response contains disussion', () => {
const discussion = { notes: [] };
axiosMock.onAny().reply(200, { discussion });
- testAction(
+ return testAction(
actions.replyToDiscussion,
payload,
{
@@ -802,15 +769,14 @@ describe('Actions Notes Store', () => {
{ type: 'startTaskList' },
{ type: 'updateResolvableDiscussionsCounts' },
],
- done,
);
});
- it('adds a reply to a discussion', (done) => {
+ it('adds a reply to a discussion', () => {
const res = {};
axiosMock.onAny().reply(200, res);
- testAction(
+ return testAction(
actions.replyToDiscussion,
payload,
{
@@ -818,21 +784,19 @@ describe('Actions Notes Store', () => {
},
[{ type: mutationTypes.ADD_NEW_REPLY_TO_DISCUSSION, payload: res }],
[],
- done,
);
});
});
describe('removeConvertedDiscussion', () => {
- it('commits CONVERT_TO_DISCUSSION with noteId', (done) => {
+ it('commits CONVERT_TO_DISCUSSION with noteId', () => {
const noteId = 'dummy-id';
- testAction(
+ return testAction(
actions.removeConvertedDiscussion,
noteId,
{},
[{ type: 'REMOVE_CONVERTED_DISCUSSION', payload: noteId }],
[],
- done,
);
});
});
@@ -849,8 +813,8 @@ describe('Actions Notes Store', () => {
};
});
- it('when unresolved, dispatches action', (done) => {
- testAction(
+ it('when unresolved, dispatches action', () => {
+ return testAction(
actions.resolveDiscussion,
{ discussionId },
{ ...state, ...getters },
@@ -865,20 +829,18 @@ describe('Actions Notes Store', () => {
},
},
],
- done,
);
});
- it('when resolved, does nothing', (done) => {
+ it('when resolved, does nothing', () => {
getters.isDiscussionResolved = (id) => id === discussionId;
- testAction(
+ return testAction(
actions.resolveDiscussion,
{ discussionId },
{ ...state, ...getters },
[],
[],
- done,
);
});
});
@@ -891,22 +853,17 @@ describe('Actions Notes Store', () => {
const res = { errors: { something: ['went wrong'] } };
const error = { message: 'Unprocessable entity', response: { data: res } };
- it('throws an error', (done) => {
- actions
- .saveNote(
+ it('throws an error', async () => {
+ await expect(
+ actions.saveNote(
{
commit() {},
dispatch: () => Promise.reject(error),
},
payload,
- )
- .then(() => done.fail('Expected error to be thrown!'))
- .catch((err) => {
- expect(err).toBe(error);
- expect(createFlash).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ ),
+ ).rejects.toEqual(error);
+ expect(createFlash).not.toHaveBeenCalled();
});
});
@@ -914,46 +871,35 @@ describe('Actions Notes Store', () => {
const res = { errors: { base: ['something went wrong'] } };
const error = { message: 'Unprocessable entity', response: { data: res } };
- it('sets flash alert using errors.base message', (done) => {
- actions
- .saveNote(
- {
- commit() {},
- dispatch: () => Promise.reject(error),
- },
- { ...payload, flashContainer },
- )
- .then((resp) => {
- expect(resp.hasFlash).toBe(true);
- expect(createFlash).toHaveBeenCalledWith({
- message: 'Your comment could not be submitted because something went wrong',
- parent: flashContainer,
- });
- })
- .catch(() => done.fail('Expected success response!'))
- .then(done)
- .catch(done.fail);
+ it('sets flash alert using errors.base message', async () => {
+ const resp = await actions.saveNote(
+ {
+ commit() {},
+ dispatch: () => Promise.reject(error),
+ },
+ { ...payload, flashContainer },
+ );
+ expect(resp.hasFlash).toBe(true);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Your comment could not be submitted because something went wrong',
+ parent: flashContainer,
+ });
});
});
describe('if response contains no errors', () => {
const res = { valid: true };
- it('returns the response', (done) => {
- actions
- .saveNote(
- {
- commit() {},
- dispatch: () => Promise.resolve(res),
- },
- payload,
- )
- .then((data) => {
- expect(data).toBe(res);
- expect(createFlash).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ it('returns the response', async () => {
+ const data = await actions.saveNote(
+ {
+ commit() {},
+ dispatch: () => Promise.resolve(res),
+ },
+ payload,
+ );
+ expect(data).toBe(res);
+ expect(createFlash).not.toHaveBeenCalled();
});
});
});
@@ -970,19 +916,17 @@ describe('Actions Notes Store', () => {
flashContainer = {};
});
- const testSubmitSuggestion = (done, expectFn) => {
- actions
- .submitSuggestion(
- { commit, dispatch },
- { discussionId, noteId, suggestionId, flashContainer },
- )
- .then(expectFn)
- .then(done)
- .catch(done.fail);
+ const testSubmitSuggestion = async (expectFn) => {
+ await actions.submitSuggestion(
+ { commit, dispatch },
+ { discussionId, noteId, suggestionId, flashContainer },
+ );
+
+ expectFn();
};
- it('when service success, commits and resolves discussion', (done) => {
- testSubmitSuggestion(done, () => {
+ it('when service success, commits and resolves discussion', () => {
+ testSubmitSuggestion(() => {
expect(commit.mock.calls).toEqual([
[mutationTypes.SET_RESOLVING_DISCUSSION, true],
[mutationTypes.SET_RESOLVING_DISCUSSION, false],
@@ -997,12 +941,12 @@ describe('Actions Notes Store', () => {
});
});
- it('when service fails, flashes error message', (done) => {
+ it('when service fails, flashes error message', () => {
const response = { response: { data: { message: TEST_ERROR_MESSAGE } } };
Api.applySuggestion.mockReturnValue(Promise.reject(response));
- testSubmitSuggestion(done, () => {
+ return testSubmitSuggestion(() => {
expect(commit.mock.calls).toEqual([
[mutationTypes.SET_RESOLVING_DISCUSSION, true],
[mutationTypes.SET_RESOLVING_DISCUSSION, false],
@@ -1015,12 +959,12 @@ describe('Actions Notes Store', () => {
});
});
- it('when service fails, and no error message available, uses default message', (done) => {
+ it('when service fails, and no error message available, uses default message', () => {
const response = { response: 'foo' };
Api.applySuggestion.mockReturnValue(Promise.reject(response));
- testSubmitSuggestion(done, () => {
+ return testSubmitSuggestion(() => {
expect(commit.mock.calls).toEqual([
[mutationTypes.SET_RESOLVING_DISCUSSION, true],
[mutationTypes.SET_RESOLVING_DISCUSSION, false],
@@ -1033,10 +977,10 @@ describe('Actions Notes Store', () => {
});
});
- it('when resolve discussion fails, fail gracefully', (done) => {
+ it('when resolve discussion fails, fail gracefully', () => {
dispatch.mockReturnValue(Promise.reject());
- testSubmitSuggestion(done, () => {
+ return testSubmitSuggestion(() => {
expect(createFlash).not.toHaveBeenCalled();
});
});
@@ -1056,16 +1000,14 @@ describe('Actions Notes Store', () => {
flashContainer = {};
});
- const testSubmitSuggestionBatch = (done, expectFn) => {
- actions
- .submitSuggestionBatch({ commit, dispatch, state }, { flashContainer })
- .then(expectFn)
- .then(done)
- .catch(done.fail);
+ const testSubmitSuggestionBatch = async (expectFn) => {
+ await actions.submitSuggestionBatch({ commit, dispatch, state }, { flashContainer });
+
+ expectFn();
};
- it('when service succeeds, commits, resolves discussions, resets batch and applying batch state', (done) => {
- testSubmitSuggestionBatch(done, () => {
+ it('when service succeeds, commits, resolves discussions, resets batch and applying batch state', () => {
+ testSubmitSuggestionBatch(() => {
expect(commit.mock.calls).toEqual([
[mutationTypes.SET_APPLYING_BATCH_STATE, true],
[mutationTypes.SET_RESOLVING_DISCUSSION, true],
@@ -1085,12 +1027,12 @@ describe('Actions Notes Store', () => {
});
});
- it('when service fails, flashes error message, resets applying batch state', (done) => {
+ it('when service fails, flashes error message, resets applying batch state', () => {
const response = { response: { data: { message: TEST_ERROR_MESSAGE } } };
Api.applySuggestionBatch.mockReturnValue(Promise.reject(response));
- testSubmitSuggestionBatch(done, () => {
+ testSubmitSuggestionBatch(() => {
expect(commit.mock.calls).toEqual([
[mutationTypes.SET_APPLYING_BATCH_STATE, true],
[mutationTypes.SET_RESOLVING_DISCUSSION, true],
@@ -1106,12 +1048,12 @@ describe('Actions Notes Store', () => {
});
});
- it('when service fails, and no error message available, uses default message', (done) => {
+ it('when service fails, and no error message available, uses default message', () => {
const response = { response: 'foo' };
Api.applySuggestionBatch.mockReturnValue(Promise.reject(response));
- testSubmitSuggestionBatch(done, () => {
+ testSubmitSuggestionBatch(() => {
expect(commit.mock.calls).toEqual([
[mutationTypes.SET_APPLYING_BATCH_STATE, true],
[mutationTypes.SET_RESOLVING_DISCUSSION, true],
@@ -1128,10 +1070,10 @@ describe('Actions Notes Store', () => {
});
});
- it('when resolve discussions fails, fails gracefully, resets batch and applying batch state', (done) => {
+ it('when resolve discussions fails, fails gracefully, resets batch and applying batch state', () => {
dispatch.mockReturnValue(Promise.reject());
- testSubmitSuggestionBatch(done, () => {
+ testSubmitSuggestionBatch(() => {
expect(commit.mock.calls).toEqual([
[mutationTypes.SET_APPLYING_BATCH_STATE, true],
[mutationTypes.SET_RESOLVING_DISCUSSION, true],
@@ -1148,14 +1090,13 @@ describe('Actions Notes Store', () => {
describe('addSuggestionInfoToBatch', () => {
const suggestionInfo = batchSuggestionsInfoMock[0];
- it("adds a suggestion's info to the current batch", (done) => {
- testAction(
+ it("adds a suggestion's info to the current batch", () => {
+ return testAction(
actions.addSuggestionInfoToBatch,
suggestionInfo,
{ batchSuggestionsInfo: [] },
[{ type: 'ADD_SUGGESTION_TO_BATCH', payload: suggestionInfo }],
[],
- done,
);
});
});
@@ -1163,14 +1104,13 @@ describe('Actions Notes Store', () => {
describe('removeSuggestionInfoFromBatch', () => {
const suggestionInfo = batchSuggestionsInfoMock[0];
- it("removes a suggestion's info the current batch", (done) => {
- testAction(
+ it("removes a suggestion's info the current batch", () => {
+ return testAction(
actions.removeSuggestionInfoFromBatch,
suggestionInfo.suggestionId,
{ batchSuggestionsInfo: [suggestionInfo] },
[{ type: 'REMOVE_SUGGESTION_FROM_BATCH', payload: suggestionInfo.suggestionId }],
[],
- done,
);
});
});
@@ -1209,8 +1149,8 @@ describe('Actions Notes Store', () => {
});
describe('setDiscussionSortDirection', () => {
- it('calls the correct mutation with the correct args', (done) => {
- testAction(
+ it('calls the correct mutation with the correct args', () => {
+ return testAction(
actions.setDiscussionSortDirection,
{ direction: notesConstants.DESC, persist: false },
{},
@@ -1221,20 +1161,18 @@ describe('Actions Notes Store', () => {
},
],
[],
- done,
);
});
});
describe('setSelectedCommentPosition', () => {
- it('calls the correct mutation with the correct args', (done) => {
- testAction(
+ it('calls the correct mutation with the correct args', () => {
+ return testAction(
actions.setSelectedCommentPosition,
{},
{},
[{ type: mutationTypes.SET_SELECTED_COMMENT_POSITION, payload: {} }],
[],
- done,
);
});
});
@@ -1248,9 +1186,9 @@ describe('Actions Notes Store', () => {
};
describe('if response contains no errors', () => {
- it('dispatches requestDeleteDescriptionVersion', (done) => {
+ it('dispatches requestDeleteDescriptionVersion', () => {
axiosMock.onDelete(endpoint).replyOnce(200);
- testAction(
+ return testAction(
actions.softDeleteDescriptionVersion,
payload,
{},
@@ -1264,35 +1202,33 @@ describe('Actions Notes Store', () => {
payload: payload.versionId,
},
],
- done,
);
});
});
describe('if response contains errors', () => {
const errorMessage = 'Request failed with status code 503';
- it('dispatches receiveDeleteDescriptionVersionError and throws an error', (done) => {
+ it('dispatches receiveDeleteDescriptionVersionError and throws an error', async () => {
axiosMock.onDelete(endpoint).replyOnce(503);
- testAction(
- actions.softDeleteDescriptionVersion,
- payload,
- {},
- [],
- [
- {
- type: 'requestDeleteDescriptionVersion',
- },
- {
- type: 'receiveDeleteDescriptionVersionError',
- payload: new Error(errorMessage),
- },
- ],
- )
- .then(() => done.fail('Expected error to be thrown'))
- .catch(() => {
- expect(createFlash).toHaveBeenCalled();
- done();
- });
+ await expect(
+ testAction(
+ actions.softDeleteDescriptionVersion,
+ payload,
+ {},
+ [],
+ [
+ {
+ type: 'requestDeleteDescriptionVersion',
+ },
+ {
+ type: 'receiveDeleteDescriptionVersionError',
+ payload: new Error(errorMessage),
+ },
+ ],
+ ),
+ ).rejects.toEqual(new Error());
+
+ expect(createFlash).toHaveBeenCalled();
});
});
});
@@ -1306,14 +1242,13 @@ describe('Actions Notes Store', () => {
});
describe('updateAssignees', () => {
- it('update the assignees state', (done) => {
- testAction(
+ it('update the assignees state', () => {
+ return testAction(
actions.updateAssignees,
[userDataMock.id],
{ state: noteableDataMock },
[{ type: mutationTypes.UPDATE_ASSIGNEES, payload: [userDataMock.id] }],
[],
- done,
);
});
});
@@ -1376,28 +1311,26 @@ describe('Actions Notes Store', () => {
});
describe('updateDiscussionPosition', () => {
- it('update the assignees state', (done) => {
+ it('update the assignees state', () => {
const updatedPosition = { discussionId: 1, position: { test: true } };
- testAction(
+ return testAction(
actions.updateDiscussionPosition,
updatedPosition,
{ state: { discussions: [] } },
[{ type: mutationTypes.UPDATE_DISCUSSION_POSITION, payload: updatedPosition }],
[],
- done,
);
});
});
describe('setFetchingState', () => {
- it('commits SET_NOTES_FETCHING_STATE', (done) => {
- testAction(
+ it('commits SET_NOTES_FETCHING_STATE', () => {
+ return testAction(
actions.setFetchingState,
true,
null,
[{ type: mutationTypes.SET_NOTES_FETCHING_STATE, payload: true }],
[],
- done,
);
});
});
@@ -1409,9 +1342,9 @@ describe('Actions Notes Store', () => {
window.gon = {};
});
- it('updates the discussions and dispatches `updateResolvableDiscussionsCounts`', (done) => {
+ it('updates the discussions and dispatches `updateResolvableDiscussionsCounts`', () => {
axiosMock.onAny().reply(200, { discussion });
- testAction(
+ return testAction(
actions.fetchDiscussions,
{},
null,
@@ -1420,14 +1353,13 @@ describe('Actions Notes Store', () => {
{ type: mutationTypes.SET_FETCHING_DISCUSSIONS, payload: false },
],
[{ type: 'updateResolvableDiscussionsCounts' }],
- done,
);
});
- it('dispatches `fetchDiscussionsBatch` action if `paginatedIssueDiscussions` feature flag is enabled', (done) => {
+ it('dispatches `fetchDiscussionsBatch` action if `paginatedIssueDiscussions` feature flag is enabled', () => {
window.gon = { features: { paginatedIssueDiscussions: true } };
- testAction(
+ return testAction(
actions.fetchDiscussions,
{ path: 'test-path', filter: 'test-filter', persistFilter: 'test-persist-filter' },
null,
@@ -1444,7 +1376,6 @@ describe('Actions Notes Store', () => {
},
},
],
- done,
);
});
});
@@ -1458,9 +1389,9 @@ describe('Actions Notes Store', () => {
const actionPayload = { config, path: 'test-path', perPage: 20 };
- it('updates the discussions and dispatches `updateResolvableDiscussionsCounts if there are no headers', (done) => {
+ it('updates the discussions and dispatches `updateResolvableDiscussionsCounts if there are no headers', () => {
axiosMock.onAny().reply(200, { discussion }, {});
- testAction(
+ return testAction(
actions.fetchDiscussionsBatch,
actionPayload,
null,
@@ -1469,13 +1400,12 @@ describe('Actions Notes Store', () => {
{ type: mutationTypes.SET_FETCHING_DISCUSSIONS, payload: false },
],
[{ type: 'updateResolvableDiscussionsCounts' }],
- done,
);
});
- it('dispatches itself if there is `x-next-page-cursor` header', (done) => {
+ it('dispatches itself if there is `x-next-page-cursor` header', () => {
axiosMock.onAny().reply(200, { discussion }, { 'x-next-page-cursor': 1 });
- testAction(
+ return testAction(
actions.fetchDiscussionsBatch,
actionPayload,
null,
@@ -1486,7 +1416,6 @@ describe('Actions Notes Store', () => {
payload: { ...actionPayload, perPage: 30, cursor: 1 },
},
],
- done,
);
});
});
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/delete_button_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/delete_button_spec.js
index 6d7bf528495..ad67128502a 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/components/delete_button_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/delete_button_spec.js
@@ -1,7 +1,7 @@
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlTooltip, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import component from '~/packages_and_registries/container_registry/explorer/components/delete_button.vue';
+import { LIST_DELETE_BUTTON_DISABLED_FOR_MIGRATION } from '~/packages_and_registries/container_registry/explorer/constants/list';
describe('delete_button', () => {
let wrapper;
@@ -12,6 +12,7 @@ describe('delete_button', () => {
};
const findButton = () => wrapper.find(GlButton);
+ const findTooltip = () => wrapper.find(GlTooltip);
const mountComponent = (props) => {
wrapper = shallowMount(component, {
@@ -19,8 +20,9 @@ describe('delete_button', () => {
...defaultProps,
...props,
},
- directives: {
- GlTooltip: createMockDirective(),
+ stubs: {
+ GlTooltip,
+ GlSprintf,
},
});
};
@@ -33,41 +35,50 @@ describe('delete_button', () => {
describe('tooltip', () => {
it('the title is controlled by tooltipTitle prop', () => {
mountComponent();
- const tooltip = getBinding(wrapper.element, 'gl-tooltip');
+ const tooltip = findTooltip();
expect(tooltip).toBeDefined();
- expect(tooltip.value.title).toBe(defaultProps.tooltipTitle);
+ expect(tooltip.text()).toBe(defaultProps.tooltipTitle);
});
it('is disabled when tooltipTitle is disabled', () => {
mountComponent({ tooltipDisabled: true });
- const tooltip = getBinding(wrapper.element, 'gl-tooltip');
- expect(tooltip.value.disabled).toBe(true);
+ expect(findTooltip().props('disabled')).toBe(true);
});
- describe('button', () => {
- it('exists', () => {
- mountComponent();
- expect(findButton().exists()).toBe(true);
+ it('works with a link', () => {
+ mountComponent({
+ tooltipTitle: LIST_DELETE_BUTTON_DISABLED_FOR_MIGRATION,
+ tooltipLink: 'foo',
});
+ expect(findTooltip().text()).toMatchInterpolatedText(
+ LIST_DELETE_BUTTON_DISABLED_FOR_MIGRATION,
+ );
+ });
+ });
- it('has the correct props/attributes bound', () => {
- mountComponent({ disabled: true });
- expect(findButton().attributes()).toMatchObject({
- 'aria-label': 'Foo title',
- icon: 'remove',
- title: 'Foo title',
- variant: 'danger',
- disabled: 'true',
- category: 'secondary',
- });
- });
+ describe('button', () => {
+ it('exists', () => {
+ mountComponent();
+ expect(findButton().exists()).toBe(true);
+ });
- it('emits a delete event', () => {
- mountComponent();
- expect(wrapper.emitted('delete')).toEqual(undefined);
- findButton().vm.$emit('click');
- expect(wrapper.emitted('delete')).toEqual([[]]);
+ it('has the correct props/attributes bound', () => {
+ mountComponent({ disabled: true });
+ expect(findButton().attributes()).toMatchObject({
+ 'aria-label': 'Foo title',
+ icon: 'remove',
+ title: 'Foo title',
+ variant: 'danger',
+ disabled: 'true',
+ category: 'secondary',
});
});
+
+ it('emits a delete event', () => {
+ mountComponent();
+ expect(wrapper.emitted('delete')).toEqual(undefined);
+ findButton().vm.$emit('click');
+ expect(wrapper.emitted('delete')).toEqual([[]]);
+ });
});
});
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js
index 411bef54e40..690d827ec67 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js
@@ -10,6 +10,7 @@ import {
LIST_DELETE_BUTTON_DISABLED,
REMOVE_REPOSITORY_LABEL,
IMAGE_DELETE_SCHEDULED_STATUS,
+ IMAGE_MIGRATING_STATE,
SCHEDULED_STATUS,
ROOT_IMAGE_TEXT,
} from '~/packages_and_registries/container_registry/explorer/constants';
@@ -41,6 +42,9 @@ describe('Image List Row', () => {
item,
...props,
},
+ provide: {
+ config: {},
+ },
directives: {
GlTooltip: createMockDirective(),
},
@@ -178,6 +182,12 @@ describe('Image List Row', () => {
expect(findDeleteBtn().props('disabled')).toBe(state);
},
);
+
+ it('is disabled when migrationState is importing', () => {
+ mountComponent({ item: { ...item, migrationState: IMAGE_MIGRATING_STATE } });
+
+ expect(findDeleteBtn().props('disabled')).toBe(true);
+ });
});
describe('tags count', () => {
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js
index c91a9c0f0fb..7d09c09d03b 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js
@@ -1,4 +1,4 @@
-import { GlSprintf } from '@gitlab/ui';
+import { GlSprintf, GlLink } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import Component from '~/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue';
@@ -6,6 +6,7 @@ import {
CONTAINER_REGISTRY_TITLE,
LIST_INTRO_TEXT,
EXPIRATION_POLICY_DISABLED_TEXT,
+ SET_UP_CLEANUP,
} from '~/packages_and_registries/container_registry/explorer/constants';
import TitleArea from '~/vue_shared/components/registry/title_area.vue';
@@ -21,6 +22,7 @@ describe('registry_header', () => {
const findCommandsSlot = () => wrapper.find('[data-testid="commands-slot"]');
const findImagesCountSubHeader = () => wrapper.find('[data-testid="images-count"]');
const findExpirationPolicySubHeader = () => wrapper.find('[data-testid="expiration-policy"]');
+ const findSetupCleanUpLink = () => wrapper.findComponent(GlLink);
const mountComponent = async (propsData, slots) => {
wrapper = shallowMount(Component, {
@@ -88,6 +90,7 @@ describe('registry_header', () => {
});
const text = findExpirationPolicySubHeader();
+
expect(text.exists()).toBe(true);
expect(text.props()).toMatchObject({
text: EXPIRATION_POLICY_DISABLED_TEXT,
@@ -100,12 +103,17 @@ describe('registry_header', () => {
await mountComponent({
expirationPolicy: { enabled: true },
expirationPolicyHelpPagePath: 'foo',
+ showCleanupPolicyLink: true,
imagesCount: 1,
});
const text = findExpirationPolicySubHeader();
+ const cleanupLink = findSetupCleanUpLink();
+
expect(text.exists()).toBe(true);
expect(text.props('text')).toBe('Expiration policy will run in ');
+ expect(cleanupLink.exists()).toBe(true);
+ expect(cleanupLink.text()).toBe(SET_UP_CLEANUP);
});
it('when the expiration policy is completely disabled', async () => {
await mountComponent({
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js b/spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js
index fda1db4b7e1..7e6f88fe5bc 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/mock_data.js
@@ -5,6 +5,7 @@ export const imagesListResponse = [
name: 'rails-12009',
path: 'gitlab-org/gitlab-test/rails-12009',
status: null,
+ migrationState: 'default',
location: '0.0.0.0:5000/gitlab-org/gitlab-test/rails-12009',
canDelete: true,
createdAt: '2020-11-03T13:29:21Z',
@@ -17,6 +18,7 @@ export const imagesListResponse = [
name: 'rails-20572',
path: 'gitlab-org/gitlab-test/rails-20572',
status: null,
+ migrationState: 'default',
location: '0.0.0.0:5000/gitlab-org/gitlab-test/rails-20572',
canDelete: true,
createdAt: '2020-09-21T06:57:43Z',
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/pages/list_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/pages/list_spec.js
index da4bfcde217..79403d29d18 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/pages/list_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/pages/list_spec.js
@@ -6,7 +6,6 @@ import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import getContainerRepositoriesQuery from 'shared_queries/container_registry/get_container_repositories.query.graphql';
-import CleanupPolicyEnabledAlert from '~/packages_and_registries/shared/components/cleanup_policy_enabled_alert.vue';
import { FILTERED_SEARCH_TERM } from '~/packages_and_registries/shared/constants';
import DeleteImage from '~/packages_and_registries/container_registry/explorer/components/delete_image.vue';
import CliCommands from '~/packages_and_registries/shared/components/cli_commands.vue';
@@ -58,7 +57,6 @@ describe('List Page', () => {
const findPersistedSearch = () => wrapper.findComponent(PersistedSearch);
const findEmptySearchMessage = () => wrapper.find('[data-testid="emptySearch"]');
const findDeleteImage = () => wrapper.findComponent(DeleteImage);
- const findCleanupAlert = () => wrapper.findComponent(CleanupPolicyEnabledAlert);
const fireFirstSortUpdate = () => {
findPersistedSearch().vm.$emit('update', { sort: 'UPDATED_DESC', filters: [] });
@@ -511,33 +509,4 @@ describe('List Page', () => {
testTrackingCall('confirm_delete');
});
});
-
- describe('cleanup is on alert', () => {
- it('exist when showCleanupPolicyOnAlert is true and has the correct props', async () => {
- mountComponent({
- config: {
- showCleanupPolicyOnAlert: true,
- projectPath: 'foo',
- isGroupPage: false,
- cleanupPoliciesSettingsPath: 'bar',
- },
- });
-
- await waitForApolloRequestRender();
-
- expect(findCleanupAlert().exists()).toBe(true);
- expect(findCleanupAlert().props()).toMatchObject({
- projectPath: 'foo',
- cleanupPoliciesSettingsPath: 'bar',
- });
- });
-
- it('is hidden when showCleanupPolicyOnAlert is false', async () => {
- mountComponent();
-
- await waitForApolloRequestRender();
-
- expect(findCleanupAlert().exists()).toBe(false);
- });
- });
});
diff --git a/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js b/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
index 79894e25889..dbe9793fb8c 100644
--- a/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
+++ b/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
@@ -1,19 +1,26 @@
import {
+ GlAlert,
+ GlDropdown,
+ GlDropdownItem,
GlFormInputGroup,
GlFormGroup,
+ GlModal,
GlSkeletonLoader,
GlSprintf,
GlEmptyState,
} from '@gitlab/ui';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import MockAdapter from 'axios-mock-adapter';
import createMockApollo from 'helpers/mock_apollo_helper';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { stripTypenames } from 'helpers/graphql_helpers';
import waitForPromises from 'helpers/wait_for_promises';
import { GRAPHQL_PAGE_SIZE } from '~/packages_and_registries/dependency_proxy/constants';
+import axios from '~/lib/utils/axios_utils';
import DependencyProxyApp from '~/packages_and_registries/dependency_proxy/app.vue';
+import TitleArea from '~/vue_shared/components/registry/title_area.vue';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import ManifestsList from '~/packages_and_registries/dependency_proxy/components/manifests_list.vue';
@@ -21,13 +28,25 @@ import getDependencyProxyDetailsQuery from '~/packages_and_registries/dependency
import { proxyDetailsQuery, proxyData, pagination, proxyManifests } from './mock_data';
+const dummyApiVersion = 'v3000';
+const dummyGrouptId = 1;
+const dummyUrlRoot = '/gitlab';
+const dummyGon = {
+ api_version: dummyApiVersion,
+ relative_url_root: dummyUrlRoot,
+};
+let originalGon;
+const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/groups/${dummyGrouptId}/dependency_proxy/cache`;
+
describe('DependencyProxyApp', () => {
let wrapper;
let apolloProvider;
let resolver;
+ let mock;
const provideDefaults = {
groupPath: 'gitlab-org',
+ groupId: dummyGrouptId,
dependencyProxyAvailable: true,
noManifestsIllustration: 'noManifestsIllustration',
};
@@ -43,9 +62,14 @@ describe('DependencyProxyApp', () => {
apolloProvider,
provide,
stubs: {
+ GlAlert,
+ GlDropdown,
+ GlDropdownItem,
GlFormInputGroup,
GlFormGroup,
+ GlModal,
GlSprintf,
+ TitleArea,
},
});
}
@@ -59,13 +83,24 @@ describe('DependencyProxyApp', () => {
const findProxyCountText = () => wrapper.findByTestId('proxy-count');
const findManifestList = () => wrapper.findComponent(ManifestsList);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+ const findClearCacheDropdownList = () => wrapper.findComponent(GlDropdown);
+ const findClearCacheModal = () => wrapper.findComponent(GlModal);
+ const findClearCacheAlert = () => wrapper.findComponent(GlAlert);
beforeEach(() => {
resolver = jest.fn().mockResolvedValue(proxyDetailsQuery());
+
+ originalGon = window.gon;
+ window.gon = { ...dummyGon };
+
+ mock = new MockAdapter(axios);
+ mock.onDelete(expectedUrl).reply(202, {});
});
afterEach(() => {
wrapper.destroy();
+ window.gon = originalGon;
+ mock.restore();
});
describe('when the dependency proxy is not available', () => {
@@ -95,6 +130,12 @@ describe('DependencyProxyApp', () => {
expect(resolver).not.toHaveBeenCalled();
});
+
+ it('hides the clear cache dropdown list', () => {
+ createComponent(createComponentArguments);
+
+ expect(findClearCacheDropdownList().exists()).toBe(false);
+ });
});
describe('when the dependency proxy is available', () => {
@@ -165,6 +206,7 @@ describe('DependencyProxyApp', () => {
}),
);
createComponent();
+
return waitForPromises();
});
@@ -214,6 +256,34 @@ describe('DependencyProxyApp', () => {
fullPath: provideDefaults.groupPath,
});
});
+
+ it('shows the clear cache dropdown list', () => {
+ expect(findClearCacheDropdownList().exists()).toBe(true);
+
+ const clearCacheDropdownItem = findClearCacheDropdownList().findComponent(
+ GlDropdownItem,
+ );
+
+ expect(clearCacheDropdownItem.text()).toBe('Clear cache');
+ });
+
+ it('shows the clear cache confirmation modal', () => {
+ const modal = findClearCacheModal();
+
+ expect(modal.find('.modal-title').text()).toContain('Clear 2 images from cache?');
+ expect(modal.props('actionPrimary').text).toBe('Clear cache');
+ });
+
+ it('submits the clear cache request', async () => {
+ findClearCacheModal().vm.$emit('primary', { preventDefault: jest.fn() });
+
+ await waitForPromises();
+
+ expect(findClearCacheAlert().exists()).toBe(true);
+ expect(findClearCacheAlert().text()).toBe(
+ 'All items in the cache are scheduled for removal.',
+ );
+ });
});
});
});
diff --git a/spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_header_spec.js b/spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_header_spec.js
new file mode 100644
index 00000000000..636f3eeb04a
--- /dev/null
+++ b/spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_header_spec.js
@@ -0,0 +1,88 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlSprintf } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import TitleArea from '~/vue_shared/components/registry/title_area.vue';
+import HarborListHeader from '~/packages_and_registries/harbor_registry/components/list/harbor_list_header.vue';
+import MetadataItem from '~/vue_shared/components/registry/metadata_item.vue';
+import {
+ HARBOR_REGISTRY_TITLE,
+ LIST_INTRO_TEXT,
+} from '~/packages_and_registries/harbor_registry/constants/index';
+
+describe('harbor_list_header', () => {
+ let wrapper;
+
+ const findTitleArea = () => wrapper.find(TitleArea);
+ const findCommandsSlot = () => wrapper.find('[data-testid="commands-slot"]');
+ const findImagesMetaDataItem = () => wrapper.find(MetadataItem);
+
+ const mountComponent = async (propsData, slots) => {
+ wrapper = shallowMount(HarborListHeader, {
+ stubs: {
+ GlSprintf,
+ TitleArea,
+ },
+ propsData,
+ slots,
+ });
+ await nextTick();
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('header', () => {
+ it('has a title', () => {
+ mountComponent({ metadataLoading: true });
+
+ expect(findTitleArea().props()).toMatchObject({
+ title: HARBOR_REGISTRY_TITLE,
+ metadataLoading: true,
+ });
+ });
+
+ it('has a commands slot', () => {
+ mountComponent(null, { commands: '<div data-testid="commands-slot">baz</div>' });
+
+ expect(findCommandsSlot().text()).toBe('baz');
+ });
+
+ describe('sub header parts', () => {
+ describe('images count', () => {
+ it('exists', async () => {
+ await mountComponent({ imagesCount: 1 });
+
+ expect(findImagesMetaDataItem().exists()).toBe(true);
+ });
+
+ it('when there is one image', async () => {
+ await mountComponent({ imagesCount: 1 });
+
+ expect(findImagesMetaDataItem().props()).toMatchObject({
+ text: '1 Image repository',
+ icon: 'container-image',
+ });
+ });
+
+ it('when there is more than one image', async () => {
+ await mountComponent({ imagesCount: 3 });
+
+ expect(findImagesMetaDataItem().props('text')).toBe('3 Image repositories');
+ });
+ });
+ });
+ });
+
+ describe('info messages', () => {
+ describe('default message', () => {
+ it('is correctly bound to title_area props', () => {
+ mountComponent({ helpPagePath: 'foo' });
+
+ expect(findTitleArea().props('infoMessages')).toEqual([
+ { text: LIST_INTRO_TEXT, link: 'foo' },
+ ]);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_row_spec.js b/spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_row_spec.js
new file mode 100644
index 00000000000..8560c4f78f7
--- /dev/null
+++ b/spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_row_spec.js
@@ -0,0 +1,99 @@
+import { shallowMount, RouterLinkStub as RouterLink } from '@vue/test-utils';
+import { GlIcon, GlSprintf, GlSkeletonLoader } from '@gitlab/ui';
+
+import HarborListRow from '~/packages_and_registries/harbor_registry/components/list/harbor_list_row.vue';
+import ListItem from '~/vue_shared/components/registry/list_item.vue';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+import { harborListResponse } from '../../mock_data';
+
+describe('Harbor List Row', () => {
+ let wrapper;
+ const [item] = harborListResponse.repositories;
+
+ const findDetailsLink = () => wrapper.find(RouterLink);
+ const findClipboardButton = () => wrapper.findComponent(ClipboardButton);
+ const findTagsCount = () => wrapper.find('[data-testid="tags-count"]');
+ const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
+
+ const mountComponent = (props) => {
+ wrapper = shallowMount(HarborListRow, {
+ stubs: {
+ RouterLink,
+ GlSprintf,
+ ListItem,
+ },
+ propsData: {
+ item,
+ ...props,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('image title and path', () => {
+ it('contains a link to the details page', () => {
+ mountComponent();
+
+ const link = findDetailsLink();
+ expect(link.text()).toBe(item.name);
+ expect(findDetailsLink().props('to')).toMatchObject({
+ name: 'details',
+ params: {
+ id: item.id,
+ },
+ });
+ });
+
+ it('contains a clipboard button', () => {
+ mountComponent();
+ const button = findClipboardButton();
+ expect(button.exists()).toBe(true);
+ expect(button.props('text')).toBe(item.location);
+ expect(button.props('title')).toBe(item.location);
+ });
+ });
+
+ describe('tags count', () => {
+ it('exists', () => {
+ mountComponent();
+ expect(findTagsCount().exists()).toBe(true);
+ });
+
+ it('contains a tag icon', () => {
+ mountComponent();
+ const icon = findTagsCount().find(GlIcon);
+ expect(icon.exists()).toBe(true);
+ expect(icon.props('name')).toBe('tag');
+ });
+
+ describe('loading state', () => {
+ it('shows a loader when metadataLoading is true', () => {
+ mountComponent({ metadataLoading: true });
+
+ expect(findSkeletonLoader().exists()).toBe(true);
+ });
+
+ it('hides the tags count while loading', () => {
+ mountComponent({ metadataLoading: true });
+
+ expect(findTagsCount().exists()).toBe(false);
+ });
+ });
+
+ describe('tags count text', () => {
+ it('with one tag in the image', () => {
+ mountComponent({ item: { ...item, artifactCount: 1 } });
+
+ expect(findTagsCount().text()).toMatchInterpolatedText('1 Tag');
+ });
+ it('with more than one tag in the image', () => {
+ mountComponent({ item: { ...item, artifactCount: 3 } });
+
+ expect(findTagsCount().text()).toMatchInterpolatedText('3 Tags');
+ });
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_spec.js b/spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_spec.js
new file mode 100644
index 00000000000..f018eff58c9
--- /dev/null
+++ b/spec/frontend/packages_and_registries/harbor_registry/components/list/harbor_list_spec.js
@@ -0,0 +1,39 @@
+import { shallowMount } from '@vue/test-utils';
+import HarborList from '~/packages_and_registries/harbor_registry/components/list/harbor_list.vue';
+import HarborListRow from '~/packages_and_registries/harbor_registry/components/list/harbor_list_row.vue';
+import RegistryList from '~/packages_and_registries/shared/components/registry_list.vue';
+import { harborListResponse } from '../../mock_data';
+
+describe('Harbor List', () => {
+ let wrapper;
+
+ const findHarborListRow = () => wrapper.findAll(HarborListRow);
+
+ const mountComponent = (props) => {
+ wrapper = shallowMount(HarborList, {
+ stubs: { RegistryList },
+ propsData: {
+ images: harborListResponse.repositories,
+ pageInfo: harborListResponse.pageInfo,
+ ...props,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('list', () => {
+ it('contains one list element for each image', () => {
+ mountComponent();
+
+ expect(findHarborListRow().length).toBe(harborListResponse.repositories.length);
+ });
+
+ it('passes down the metadataLoading prop', () => {
+ mountComponent({ metadataLoading: true });
+ expect(findHarborListRow().at(0).props('metadataLoading')).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/harbor_registry/mock_data.js b/spec/frontend/packages_and_registries/harbor_registry/mock_data.js
new file mode 100644
index 00000000000..85399c22e79
--- /dev/null
+++ b/spec/frontend/packages_and_registries/harbor_registry/mock_data.js
@@ -0,0 +1,175 @@
+export const harborListResponse = {
+ repositories: [
+ {
+ artifactCount: 1,
+ creationTime: '2022-03-02T06:35:53.205Z',
+ id: 25,
+ name: 'shao/flinkx',
+ projectId: 21,
+ pullCount: 0,
+ updateTime: '2022-03-02T06:35:53.205Z',
+ location: 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
+ },
+ {
+ artifactCount: 1,
+ creationTime: '2022-03-02T06:35:53.205Z',
+ id: 26,
+ name: 'shao/flinkx1',
+ projectId: 21,
+ pullCount: 0,
+ updateTime: '2022-03-02T06:35:53.205Z',
+ location: 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
+ },
+ {
+ artifactCount: 1,
+ creationTime: '2022-03-02T06:35:53.205Z',
+ id: 27,
+ name: 'shao/flinkx2',
+ projectId: 21,
+ pullCount: 0,
+ updateTime: '2022-03-02T06:35:53.205Z',
+ location: 'demo.harbor.com/gitlab-cn/build/cng-images/gitlab-kas',
+ },
+ ],
+ totalCount: 3,
+ pageInfo: {
+ hasNextPage: false,
+ hasPreviousPage: false,
+ },
+};
+
+export const harborTagsResponse = {
+ tags: [
+ {
+ digest: 'sha256:7f386a1844faf341353e1c20f2f39f11f397604fedc475435d13f756eeb235d1',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:02310e655103823920157bc4410ea361dc638bc2cda59667d2cb1f2a988e264c',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:02310e655103823920157bc4410ea361dc638bc2cda59667d2cb1f2a988e264c',
+ name: '02310e655103823920157bc4410ea361dc638bc2cda59667d2cb1f2a988e264c',
+ revision: 'f53bde3d44699e04e11cf15fb415046a0913e2623d878d89bc21adb2cbda5255',
+ shortRevision: 'f53bde3d4',
+ createdAt: '2022-03-02T23:59:05+00:00',
+ totalSize: '6623124',
+ },
+ {
+ digest: 'sha256:4554416b84c4568fe93086620b637064ed029737aabe7308b96d50e3d9d92ed7',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:02deb4dddf177212b50e883d5e4f6c03731fad1a18cd27261736cd9dbba79160',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:02deb4dddf177212b50e883d5e4f6c03731fad1a18cd27261736cd9dbba79160',
+ name: '02deb4dddf177212b50e883d5e4f6c03731fad1a18cd27261736cd9dbba79160',
+ revision: 'e1fe52d8bab66d71bd54a6b8784d3b9edbc68adbd6ea87f5fa44d9974144ef9e',
+ shortRevision: 'e1fe52d8b',
+ createdAt: '2022-02-10T01:09:56+00:00',
+ totalSize: '920760',
+ },
+ {
+ digest: 'sha256:14f37b60e52b9ce0e9f8f7094b311d265384798592f783487c30aaa3d58e6345',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:03bc5971bab1e849ba52a20a31e7273053f22b2ddb1d04bd6b77d53a2635727a',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:03bc5971bab1e849ba52a20a31e7273053f22b2ddb1d04bd6b77d53a2635727a',
+ name: '03bc5971bab1e849ba52a20a31e7273053f22b2ddb1d04bd6b77d53a2635727a',
+ revision: 'c72770c6eb93c421bc496964b4bffc742b1ec2e642cdab876be7afda1856029f',
+ shortRevision: 'c72770c6e',
+ createdAt: '2021-12-22T04:48:48+00:00',
+ totalSize: '48609053',
+ },
+ {
+ digest: 'sha256:e925e3b8277ea23f387ed5fba5e78280cfac7cfb261a78cf046becf7b6a3faae',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:03f495bc5714bff78bb14293320d336afdf47fd47ddff0c3c5f09f8da86d5d19',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:03f495bc5714bff78bb14293320d336afdf47fd47ddff0c3c5f09f8da86d5d19',
+ name: '03f495bc5714bff78bb14293320d336afdf47fd47ddff0c3c5f09f8da86d5d19',
+ revision: '1ac2a43194f4e15166abdf3f26e6ec92215240490b9cac834d63de1a3d87494a',
+ shortRevision: '1ac2a4319',
+ createdAt: '2022-03-09T11:02:27+00:00',
+ totalSize: '35141894',
+ },
+ {
+ digest: 'sha256:7d8303fd5c077787a8c879f8f66b69e2b5605f48ccd3f286e236fb0749fcc1ca',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:05a4e58231e54b70aab2d6f22ba4fbe10e48aa4ddcbfef11c5662241c2ae4fda',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:05a4e58231e54b70aab2d6f22ba4fbe10e48aa4ddcbfef11c5662241c2ae4fda',
+ name: '05a4e58231e54b70aab2d6f22ba4fbe10e48aa4ddcbfef11c5662241c2ae4fda',
+ revision: 'cf8fee086701016e1a84e6824f0c896951fef4cce9d4745459558b87eec3232c',
+ shortRevision: 'cf8fee086',
+ createdAt: '2022-01-21T11:31:43+00:00',
+ totalSize: '48716070',
+ },
+ {
+ digest: 'sha256:b33611cefe20e4a41a6e0dce356a5d7ef3c177ea7536a58652f5b3a4f2f83549',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:093d2746876997723541aec8b88687a4cdb3b5bbb0279c5089b7891317741a9a',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:093d2746876997723541aec8b88687a4cdb3b5bbb0279c5089b7891317741a9a',
+ name: '093d2746876997723541aec8b88687a4cdb3b5bbb0279c5089b7891317741a9a',
+ revision: '1a4b48198b13d55242c5164e64d41c4e9f75b5d9506bc6e0efc1534dd0dd1f15',
+ shortRevision: '1a4b48198',
+ createdAt: '2022-01-21T11:31:51+00:00',
+ totalSize: '6623127',
+ },
+ {
+ digest: 'sha256:d25c3c020e2dbd4711a67b9fe308f4cbb7b0bb21815e722a02f91c570dc5d519',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:09698b3fae81dfd6e02554dbc82930f304a6356c8f541c80e8598a42aed985f7',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:09698b3fae81dfd6e02554dbc82930f304a6356c8f541c80e8598a42aed985f7',
+ name: '09698b3fae81dfd6e02554dbc82930f304a6356c8f541c80e8598a42aed985f7',
+ revision: '03e2e2777dde01c30469ee8c710973dd08a7a4f70494d7dc1583c24b525d7f61',
+ shortRevision: '03e2e2777',
+ createdAt: '2022-03-02T23:58:20+00:00',
+ totalSize: '911377',
+ },
+ {
+ digest: 'sha256:fb760e4d2184e9e8e39d6917534d4610fe01009734698a5653b2de1391ba28f4',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:09b830c3eaf80d547f3b523d8e242a2c411085c349dab86c520f36c7b7644f95',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:09b830c3eaf80d547f3b523d8e242a2c411085c349dab86c520f36c7b7644f95',
+ name: '09b830c3eaf80d547f3b523d8e242a2c411085c349dab86c520f36c7b7644f95',
+ revision: '350e78d60646bf6967244448c6aaa14d21ecb9a0c6cf87e9ff0361cbe59b9012',
+ shortRevision: '350e78d60',
+ createdAt: '2022-01-19T13:49:14+00:00',
+ totalSize: '48710241',
+ },
+ {
+ digest: 'sha256:407250f380cea92729cbc038c420e74900f53b852e11edc6404fe75a0fd2c402',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:0d03504a17b467eafc8c96bde70af26c74bd459a32b7eb2dd189dd6b3c121557',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:0d03504a17b467eafc8c96bde70af26c74bd459a32b7eb2dd189dd6b3c121557',
+ name: '0d03504a17b467eafc8c96bde70af26c74bd459a32b7eb2dd189dd6b3c121557',
+ revision: '76038370b7f3904364891457c4a6a234897255e6b9f45d0a852bf3a7e5257e18',
+ shortRevision: '76038370b',
+ createdAt: '2022-01-24T12:56:22+00:00',
+ totalSize: '280065',
+ },
+ {
+ digest: 'sha256:ada87f25218542951ce6720c27f3d0758e90c2540bd129f5cfb9e15b31e07b07',
+ location:
+ 'registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa/cache:0eb20a4a7cac2ebea821d420b3279654fe550fd8502f1785c1927aa84e5949eb',
+ path:
+ 'gitlab-org/gitlab/gitlab-ee-qa/cache:0eb20a4a7cac2ebea821d420b3279654fe550fd8502f1785c1927aa84e5949eb',
+ name: '0eb20a4a7cac2ebea821d420b3279654fe550fd8502f1785c1927aa84e5949eb',
+ revision: '3d4b49a7bbb36c48bb721f4d0e76e7950bec3878ee29cdfdd6da39f575d6d37f',
+ shortRevision: '3d4b49a7b',
+ createdAt: '2022-02-17T17:37:52+00:00',
+ totalSize: '48655767',
+ },
+ ],
+ totalCount: 100,
+ pageInfo: {
+ hasNextPage: false,
+ hasPreviousPage: false,
+ },
+};
+
+export const dockerCommands = {
+ dockerBuildCommand: 'foofoo',
+ dockerPushCommand: 'barbar',
+ dockerLoginCommand: 'bazbaz',
+};
diff --git a/spec/frontend/packages_and_registries/harbor_registry/pages/index_spec.js b/spec/frontend/packages_and_registries/harbor_registry/pages/index_spec.js
new file mode 100644
index 00000000000..55fc8066f65
--- /dev/null
+++ b/spec/frontend/packages_and_registries/harbor_registry/pages/index_spec.js
@@ -0,0 +1,24 @@
+import { shallowMount } from '@vue/test-utils';
+import component from '~/packages_and_registries/harbor_registry/pages/index.vue';
+
+describe('List Page', () => {
+ let wrapper;
+
+ const findRouterView = () => wrapper.find({ ref: 'router-view' });
+
+ const mountComponent = () => {
+ wrapper = shallowMount(component, {
+ stubs: {
+ RouterView: true,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ mountComponent();
+ });
+
+ it('has a router view', () => {
+ expect(findRouterView().exists()).toBe(true);
+ });
+});
diff --git a/spec/frontend/packages_and_registries/harbor_registry/pages/list_spec.js b/spec/frontend/packages_and_registries/harbor_registry/pages/list_spec.js
new file mode 100644
index 00000000000..61ee36a2794
--- /dev/null
+++ b/spec/frontend/packages_and_registries/harbor_registry/pages/list_spec.js
@@ -0,0 +1,140 @@
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import { GlSkeletonLoader } from '@gitlab/ui';
+import HarborListHeader from '~/packages_and_registries/harbor_registry/components/list/harbor_list_header.vue';
+import HarborRegistryList from '~/packages_and_registries/harbor_registry/pages/list.vue';
+import PersistedSearch from '~/packages_and_registries/shared/components/persisted_search.vue';
+import waitForPromises from 'helpers/wait_for_promises';
+// import { harborListResponse } from '~/packages_and_registries/harbor_registry/mock_api.js';
+import HarborList from '~/packages_and_registries/harbor_registry/components/list/harbor_list.vue';
+import CliCommands from '~/packages_and_registries/shared/components/cli_commands.vue';
+import { SORT_FIELDS } from '~/packages_and_registries/harbor_registry/constants/index';
+import { harborListResponse, dockerCommands } from '../mock_data';
+
+let mockHarborListResponse;
+jest.mock('~/packages_and_registries/harbor_registry/mock_api.js', () => ({
+ harborListResponse: () => mockHarborListResponse,
+}));
+
+describe('Harbor List Page', () => {
+ let wrapper;
+
+ const waitForHarborPageRequest = async () => {
+ await waitForPromises();
+ await nextTick();
+ };
+
+ beforeEach(() => {
+ mockHarborListResponse = Promise.resolve(harborListResponse);
+ });
+
+ const findHarborListHeader = () => wrapper.findComponent(HarborListHeader);
+ const findPersistedSearch = () => wrapper.findComponent(PersistedSearch);
+ const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
+ const findHarborList = () => wrapper.findComponent(HarborList);
+ const findCliCommands = () => wrapper.findComponent(CliCommands);
+
+ const fireFirstSortUpdate = () => {
+ findPersistedSearch().vm.$emit('update', { sort: 'UPDATED_DESC', filters: [] });
+ };
+
+ const mountComponent = ({ config = { isGroupPage: false } } = {}) => {
+ wrapper = shallowMount(HarborRegistryList, {
+ stubs: {
+ HarborListHeader,
+ },
+ provide() {
+ return {
+ config,
+ ...dockerCommands,
+ };
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains harbor registry header', async () => {
+ mountComponent();
+ fireFirstSortUpdate();
+ await waitForHarborPageRequest();
+ await nextTick();
+
+ expect(findHarborListHeader().exists()).toBe(true);
+ expect(findHarborListHeader().props()).toMatchObject({
+ imagesCount: 3,
+ metadataLoading: false,
+ });
+ });
+
+ describe('isLoading is true', () => {
+ it('shows the skeleton loader', async () => {
+ mountComponent();
+ fireFirstSortUpdate();
+
+ expect(findSkeletonLoader().exists()).toBe(true);
+ });
+
+ it('harborList is not visible', () => {
+ mountComponent();
+
+ expect(findHarborList().exists()).toBe(false);
+ });
+
+ it('cli commands is not visible', () => {
+ mountComponent();
+
+ expect(findCliCommands().exists()).toBe(false);
+ });
+
+ it('title has the metadataLoading props set to true', async () => {
+ mountComponent();
+ fireFirstSortUpdate();
+
+ expect(findHarborListHeader().props('metadataLoading')).toBe(true);
+ });
+ });
+
+ describe('list is not empty', () => {
+ describe('unfiltered state', () => {
+ it('quick start is visible', async () => {
+ mountComponent();
+ fireFirstSortUpdate();
+
+ await waitForHarborPageRequest();
+ await nextTick();
+
+ expect(findCliCommands().exists()).toBe(true);
+ });
+
+ it('list component is visible', async () => {
+ mountComponent();
+ fireFirstSortUpdate();
+
+ await waitForHarborPageRequest();
+ await nextTick();
+
+ expect(findHarborList().exists()).toBe(true);
+ });
+ });
+
+ describe('search and sorting', () => {
+ it('has a persisted search box element', async () => {
+ mountComponent();
+ fireFirstSortUpdate();
+ await waitForHarborPageRequest();
+ await nextTick();
+
+ const harborRegistrySearch = findPersistedSearch();
+ expect(harborRegistrySearch.exists()).toBe(true);
+ expect(harborRegistrySearch.props()).toMatchObject({
+ defaultOrder: 'UPDATED',
+ defaultSort: 'desc',
+ sortableFields: SORT_FIELDS,
+ });
+ });
+ });
+ });
+});
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
index b9383d6c38c..31ab108558c 100644
--- 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
@@ -20,10 +20,10 @@ jest.mock('~/api.js');
describe('Actions Package details store', () => {
describe('fetchPackageVersions', () => {
- it('should fetch the package versions', (done) => {
+ it('should fetch the package versions', async () => {
Api.projectPackage = jest.fn().mockResolvedValue({ data: packageEntity });
- testAction(
+ await testAction(
fetchPackageVersions,
undefined,
{ packageEntity },
@@ -33,20 +33,14 @@ describe('Actions Package details store', () => {
{ type: types.SET_LOADING, payload: false },
],
[],
- () => {
- expect(Api.projectPackage).toHaveBeenCalledWith(
- packageEntity.project_id,
- packageEntity.id,
- );
- done();
- },
);
+ expect(Api.projectPackage).toHaveBeenCalledWith(packageEntity.project_id, packageEntity.id);
});
- it("does not set the versions if they don't exist", (done) => {
+ it("does not set the versions if they don't exist", async () => {
Api.projectPackage = jest.fn().mockResolvedValue({ data: { packageEntity, versions: null } });
- testAction(
+ await testAction(
fetchPackageVersions,
undefined,
{ packageEntity },
@@ -55,20 +49,14 @@ describe('Actions Package details store', () => {
{ type: types.SET_LOADING, payload: false },
],
[],
- () => {
- expect(Api.projectPackage).toHaveBeenCalledWith(
- packageEntity.project_id,
- packageEntity.id,
- );
- done();
- },
);
+ expect(Api.projectPackage).toHaveBeenCalledWith(packageEntity.project_id, packageEntity.id);
});
- it('should create flash on API error', (done) => {
+ it('should create flash on API error', async () => {
Api.projectPackage = jest.fn().mockRejectedValue();
- testAction(
+ await testAction(
fetchPackageVersions,
undefined,
{ packageEntity },
@@ -77,41 +65,31 @@ describe('Actions Package details store', () => {
{ 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();
- },
);
+ expect(Api.projectPackage).toHaveBeenCalledWith(packageEntity.project_id, packageEntity.id);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: FETCH_PACKAGE_VERSIONS_ERROR,
+ type: 'warning',
+ });
});
});
describe('deletePackage', () => {
- it('should call Api.deleteProjectPackage', (done) => {
+ it('should call Api.deleteProjectPackage', async () => {
Api.deleteProjectPackage = jest.fn().mockResolvedValue();
- testAction(deletePackage, undefined, { packageEntity }, [], [], () => {
- expect(Api.deleteProjectPackage).toHaveBeenCalledWith(
- packageEntity.project_id,
- packageEntity.id,
- );
- done();
- });
+ await testAction(deletePackage, undefined, { packageEntity }, [], []);
+ expect(Api.deleteProjectPackage).toHaveBeenCalledWith(
+ packageEntity.project_id,
+ packageEntity.id,
+ );
});
- it('should create flash on API error', (done) => {
+ it('should create flash on API error', async () => {
Api.deleteProjectPackage = jest.fn().mockRejectedValue();
- testAction(deletePackage, undefined, { packageEntity }, [], [], () => {
- expect(createFlash).toHaveBeenCalledWith({
- message: DELETE_PACKAGE_ERROR_MESSAGE,
- type: 'warning',
- });
- done();
+ await testAction(deletePackage, undefined, { packageEntity }, [], []);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: DELETE_PACKAGE_ERROR_MESSAGE,
+ type: 'warning',
});
});
});
@@ -119,37 +97,33 @@ describe('Actions Package details store', () => {
describe('deletePackageFile', () => {
const fileId = 'a_file_id';
- it('should call Api.deleteProjectPackageFile and commit the right data', (done) => {
+ it('should call Api.deleteProjectPackageFile and commit the right data', async () => {
const packageFiles = [{ id: 'foo' }, { id: fileId }];
Api.deleteProjectPackageFile = jest.fn().mockResolvedValue();
- testAction(
+ await 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();
- },
);
+ expect(Api.deleteProjectPackageFile).toHaveBeenCalledWith(
+ packageEntity.project_id,
+ packageEntity.id,
+ fileId,
+ );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: DELETE_PACKAGE_FILE_SUCCESS_MESSAGE,
+ type: 'success',
+ });
});
- it('should create flash on API error', (done) => {
+
+ it('should create flash on API error', async () => {
Api.deleteProjectPackageFile = jest.fn().mockRejectedValue();
- testAction(deletePackageFile, fileId, { packageEntity }, [], [], () => {
- expect(createFlash).toHaveBeenCalledWith({
- message: DELETE_PACKAGE_FILE_ERROR_MESSAGE,
- type: 'warning',
- });
- done();
+ await testAction(deletePackageFile, fileId, { packageEntity }, [], []);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: DELETE_PACKAGE_FILE_ERROR_MESSAGE,
+ type: 'warning',
});
});
});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap
index d82af8f9e63..a33528d2d91 100644
--- a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap
@@ -21,7 +21,7 @@ exports[`packages_list_app renders 1`] = `
>
<img
alt=""
- class="gl-max-w-full"
+ class="gl-max-w-full gl-dark-invert-keep-hue"
role="img"
src="helpSvg"
/>
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/stores/actions_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/stores/actions_spec.js
index 3fbfe1060dc..d596f2dae33 100644
--- a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/stores/actions_spec.js
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/stores/actions_spec.js
@@ -32,8 +32,8 @@ describe('Actions Package list store', () => {
};
const filter = [];
- it('should fetch the project packages list when isGroupPage is false', (done) => {
- testAction(
+ it('should fetch the project packages list when isGroupPage is false', async () => {
+ await testAction(
actions.requestPackagesList,
undefined,
{ config: { isGroupPage: false, resourceId: 1 }, sorting, filter },
@@ -43,17 +43,14 @@ describe('Actions Package list store', () => {
{ type: 'receivePackagesListSuccess', payload: { data: 'foo', headers } },
{ type: 'setLoading', payload: false },
],
- () => {
- expect(Api.projectPackages).toHaveBeenCalledWith(1, {
- params: { page: 1, per_page: 20, sort: sorting.sort, order_by: sorting.orderBy },
- });
- done();
- },
);
+ expect(Api.projectPackages).toHaveBeenCalledWith(1, {
+ params: { page: 1, per_page: 20, sort: sorting.sort, order_by: sorting.orderBy },
+ });
});
- it('should fetch the group packages list when isGroupPage is true', (done) => {
- testAction(
+ it('should fetch the group packages list when isGroupPage is true', async () => {
+ await testAction(
actions.requestPackagesList,
undefined,
{ config: { isGroupPage: true, resourceId: 2 }, sorting, filter },
@@ -63,19 +60,16 @@ describe('Actions Package list store', () => {
{ type: 'receivePackagesListSuccess', payload: { data: 'baz', headers } },
{ type: 'setLoading', payload: false },
],
- () => {
- expect(Api.groupPackages).toHaveBeenCalledWith(2, {
- params: { page: 1, per_page: 20, sort: sorting.sort, order_by: sorting.orderBy },
- });
- done();
- },
);
+ expect(Api.groupPackages).toHaveBeenCalledWith(2, {
+ params: { page: 1, per_page: 20, sort: sorting.sort, order_by: sorting.orderBy },
+ });
});
- it('should fetch packages of a certain type when a filter with a type is present', (done) => {
+ it('should fetch packages of a certain type when a filter with a type is present', async () => {
const packageType = 'maven';
- testAction(
+ await testAction(
actions.requestPackagesList,
undefined,
{
@@ -89,24 +83,21 @@ describe('Actions Package list store', () => {
{ type: 'receivePackagesListSuccess', payload: { data: 'foo', headers } },
{ type: 'setLoading', payload: false },
],
- () => {
- expect(Api.projectPackages).toHaveBeenCalledWith(1, {
- params: {
- page: 1,
- per_page: 20,
- sort: sorting.sort,
- order_by: sorting.orderBy,
- package_type: packageType,
- },
- });
- done();
- },
);
+ expect(Api.projectPackages).toHaveBeenCalledWith(1, {
+ params: {
+ page: 1,
+ per_page: 20,
+ sort: sorting.sort,
+ order_by: sorting.orderBy,
+ package_type: packageType,
+ },
+ });
});
- it('should create flash on API error', (done) => {
+ it('should create flash on API error', async () => {
Api.projectPackages = jest.fn().mockRejectedValue();
- testAction(
+ await testAction(
actions.requestPackagesList,
undefined,
{ config: { isGroupPage: false, resourceId: 2 }, sorting, filter },
@@ -115,15 +106,12 @@ describe('Actions Package list store', () => {
{ type: 'setLoading', payload: true },
{ type: 'setLoading', payload: false },
],
- () => {
- expect(createFlash).toHaveBeenCalled();
- done();
- },
);
+ expect(createFlash).toHaveBeenCalled();
});
- it('should force the terraform_module type when forceTerraform is true', (done) => {
- testAction(
+ it('should force the terraform_module type when forceTerraform is true', async () => {
+ await testAction(
actions.requestPackagesList,
undefined,
{ config: { isGroupPage: false, resourceId: 1, forceTerraform: true }, sorting, filter },
@@ -133,27 +121,24 @@ describe('Actions Package list store', () => {
{ type: 'receivePackagesListSuccess', payload: { data: 'foo', headers } },
{ type: 'setLoading', payload: false },
],
- () => {
- expect(Api.projectPackages).toHaveBeenCalledWith(1, {
- params: {
- page: 1,
- per_page: 20,
- sort: sorting.sort,
- order_by: sorting.orderBy,
- package_type: 'terraform_module',
- },
- });
- done();
- },
);
+ expect(Api.projectPackages).toHaveBeenCalledWith(1, {
+ params: {
+ page: 1,
+ per_page: 20,
+ sort: sorting.sort,
+ order_by: sorting.orderBy,
+ package_type: 'terraform_module',
+ },
+ });
});
});
describe('receivePackagesListSuccess', () => {
- it('should set received packages', (done) => {
+ it('should set received packages', () => {
const data = 'foo';
- testAction(
+ return testAction(
actions.receivePackagesListSuccess,
{ data, headers },
null,
@@ -162,33 +147,30 @@ describe('Actions Package list store', () => {
{ type: types.SET_PAGINATION, payload: headers },
],
[],
- done,
);
});
});
describe('setInitialState', () => {
- it('should commit setInitialState', (done) => {
- testAction(
+ it('should commit setInitialState', () => {
+ return testAction(
actions.setInitialState,
'1',
null,
[{ type: types.SET_INITIAL_STATE, payload: '1' }],
[],
- done,
);
});
});
describe('setLoading', () => {
- it('should commit set main loading', (done) => {
- testAction(
+ it('should commit set main loading', () => {
+ return testAction(
actions.setLoading,
true,
null,
[{ type: types.SET_MAIN_LOADING, payload: true }],
[],
- done,
);
});
});
@@ -199,11 +181,11 @@ describe('Actions Package list store', () => {
delete_api_path: 'foo',
},
};
- it('should perform a delete operation on _links.delete_api_path', (done) => {
+ it('should perform a delete operation on _links.delete_api_path', () => {
mock.onDelete(payload._links.delete_api_path).replyOnce(200);
Api.projectPackages = jest.fn().mockResolvedValue({ data: 'foo' });
- testAction(
+ return testAction(
actions.requestDeletePackage,
payload,
{ pagination: { page: 1 } },
@@ -212,13 +194,12 @@ describe('Actions Package list store', () => {
{ type: 'setLoading', payload: true },
{ type: 'requestPackagesList', payload: { page: 1 } },
],
- done,
);
});
- it('should stop the loading and call create flash on api error', (done) => {
+ it('should stop the loading and call create flash on api error', async () => {
mock.onDelete(payload._links.delete_api_path).replyOnce(400);
- testAction(
+ await testAction(
actions.requestDeletePackage,
payload,
null,
@@ -227,50 +208,44 @@ describe('Actions Package list store', () => {
{ type: 'setLoading', payload: true },
{ type: 'setLoading', payload: false },
],
- () => {
- expect(createFlash).toHaveBeenCalled();
- done();
- },
);
+ expect(createFlash).toHaveBeenCalled();
});
it.each`
property | actionPayload
${'_links'} | ${{}}
${'delete_api_path'} | ${{ _links: {} }}
- `('should reject and createFlash when $property is missing', ({ actionPayload }, done) => {
- testAction(actions.requestDeletePackage, actionPayload, null, [], []).catch((e) => {
+ `('should reject and createFlash when $property is missing', ({ actionPayload }) => {
+ return testAction(actions.requestDeletePackage, actionPayload, null, [], []).catch((e) => {
expect(e).toEqual(new Error(MISSING_DELETE_PATH_ERROR));
expect(createFlash).toHaveBeenCalledWith({
message: DELETE_PACKAGE_ERROR_MESSAGE,
});
- done();
});
});
});
describe('setSorting', () => {
- it('should commit SET_SORTING', (done) => {
- testAction(
+ it('should commit SET_SORTING', () => {
+ return testAction(
actions.setSorting,
'foo',
null,
[{ type: types.SET_SORTING, payload: 'foo' }],
[],
- done,
);
});
});
describe('setFilter', () => {
- it('should commit SET_FILTER', (done) => {
- testAction(
+ it('should commit SET_FILTER', () => {
+ return testAction(
actions.setFilter,
'foo',
null,
[{ type: types.SET_FILTER, payload: 'foo' }],
[],
- done,
);
});
});
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 9e91b15bc6e..3670cfca8ea 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
@@ -73,7 +73,6 @@ describe('Package Search', () => {
mountComponent();
expect(findLocalStorageSync().props()).toMatchObject({
- asJson: true,
storageKey: 'package_registry_list_sorting',
value: {
orderBy: LIST_KEY_CREATED_AT,
diff --git a/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap
index 0154486e224..17905a8db2d 100644
--- a/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap
+++ b/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap
@@ -21,7 +21,7 @@ exports[`PackagesListApp renders 1`] = `
>
<img
alt=""
- class="gl-max-w-full"
+ class="gl-max-w-full gl-dark-invert-keep-hue"
role="img"
src="emptyListIllustration"
/>
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js b/spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js
index a6c929844b1..0a72f0269ee 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/registry_settings_app_spec.js
@@ -12,7 +12,6 @@ import {
UNAVAILABLE_USER_FEATURE_TEXT,
} from '~/packages_and_registries/settings/project/constants';
import expirationPolicyQuery from '~/packages_and_registries/settings/project/graphql/queries/get_expiration_policy.query.graphql';
-import CleanupPolicyEnabledAlert from '~/packages_and_registries/shared/components/cleanup_policy_enabled_alert.vue';
import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
import {
@@ -31,12 +30,11 @@ describe('Registry Settings App', () => {
adminSettingsPath: 'settingsPath',
enableHistoricEntries: false,
helpPagePath: 'helpPagePath',
- showCleanupPolicyOnAlert: false,
+ showCleanupPolicyLink: false,
};
const findSettingsComponent = () => wrapper.find(SettingsForm);
const findAlert = () => wrapper.find(GlAlert);
- const findCleanupAlert = () => wrapper.findComponent(CleanupPolicyEnabledAlert);
const mountComponent = (provide = defaultProvidedValues, config) => {
wrapper = shallowMount(component, {
@@ -69,26 +67,6 @@ describe('Registry Settings App', () => {
wrapper.destroy();
});
- describe('cleanup is on alert', () => {
- it('exist when showCleanupPolicyOnAlert is true and has the correct props', () => {
- mountComponent({
- ...defaultProvidedValues,
- showCleanupPolicyOnAlert: true,
- });
-
- expect(findCleanupAlert().exists()).toBe(true);
- expect(findCleanupAlert().props()).toMatchObject({
- projectPath: 'path',
- });
- });
-
- it('is hidden when showCleanupPolicyOnAlert is false', async () => {
- mountComponent();
-
- expect(findCleanupAlert().exists()).toBe(false);
- });
- });
-
describe('isEdited status', () => {
it.each`
description | apiResponse | workingCopy | result
diff --git a/spec/frontend/packages_and_registries/shared/components/__snapshots__/cleanup_policy_enabled_alert_spec.js.snap b/spec/frontend/packages_and_registries/shared/components/__snapshots__/cleanup_policy_enabled_alert_spec.js.snap
deleted file mode 100644
index 2cded2ead2e..00000000000
--- a/spec/frontend/packages_and_registries/shared/components/__snapshots__/cleanup_policy_enabled_alert_spec.js.snap
+++ /dev/null
@@ -1,19 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`CleanupPolicyEnabledAlert renders 1`] = `
-<gl-alert-stub
- class="gl-mt-2"
- dismissible="true"
- dismisslabel="Dismiss"
- primarybuttonlink=""
- primarybuttontext=""
- secondarybuttonlink=""
- secondarybuttontext=""
- title=""
- variant="info"
->
- <gl-sprintf-stub
- message="Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
- />
-</gl-alert-stub>
-`;
diff --git a/spec/frontend/packages_and_registries/shared/components/__snapshots__/registry_breadcrumb_spec.js.snap b/spec/frontend/packages_and_registries/shared/components/__snapshots__/registry_breadcrumb_spec.js.snap
index ceae8eebaef..3dd6023140f 100644
--- a/spec/frontend/packages_and_registries/shared/components/__snapshots__/registry_breadcrumb_spec.js.snap
+++ b/spec/frontend/packages_and_registries/shared/components/__snapshots__/registry_breadcrumb_spec.js.snap
@@ -10,11 +10,10 @@ exports[`Registry Breadcrumb when is not rootRoute renders 1`] = `
class="breadcrumb gl-breadcrumb-list"
>
<li
- class="breadcrumb-item gl-breadcrumb-item"
+ class="gl-breadcrumb-item"
>
<a
class=""
- href="/"
target="_self"
>
<span>
@@ -45,9 +44,10 @@ exports[`Registry Breadcrumb when is not rootRoute renders 1`] = `
<!---->
<li
- class="breadcrumb-item gl-breadcrumb-item"
+ class="gl-breadcrumb-item"
>
<a
+ aria-current="page"
class=""
href="#"
target="_self"
@@ -75,11 +75,11 @@ exports[`Registry Breadcrumb when is rootRoute renders 1`] = `
class="breadcrumb gl-breadcrumb-list"
>
<li
- class="breadcrumb-item gl-breadcrumb-item"
+ class="gl-breadcrumb-item"
>
<a
+ aria-current="page"
class=""
- href="/"
target="_self"
>
<span>
diff --git a/spec/frontend/packages_and_registries/shared/components/cleanup_policy_enabled_alert_spec.js b/spec/frontend/packages_and_registries/shared/components/cleanup_policy_enabled_alert_spec.js
deleted file mode 100644
index 269e087f5ac..00000000000
--- a/spec/frontend/packages_and_registries/shared/components/cleanup_policy_enabled_alert_spec.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import { GlAlert } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import component from '~/packages_and_registries/shared/components/cleanup_policy_enabled_alert.vue';
-import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
-
-describe('CleanupPolicyEnabledAlert', () => {
- let wrapper;
-
- const defaultProps = {
- projectPath: 'foo',
- cleanupPoliciesSettingsPath: 'label-bar',
- };
-
- const findAlert = () => wrapper.findComponent(GlAlert);
-
- const mountComponent = (props) => {
- wrapper = shallowMount(component, {
- stubs: {
- LocalStorageSync,
- },
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders', () => {
- mountComponent();
-
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('when dismissed is not visible', async () => {
- mountComponent();
-
- expect(findAlert().exists()).toBe(true);
- findAlert().vm.$emit('dismiss');
-
- await nextTick();
-
- expect(findAlert().exists()).toBe(false);
- });
-});
diff --git a/spec/frontend/packages_and_registries/shared/components/registry_breadcrumb_spec.js b/spec/frontend/packages_and_registries/shared/components/registry_breadcrumb_spec.js
index 6dfe116c285..15db454ac68 100644
--- a/spec/frontend/packages_and_registries/shared/components/registry_breadcrumb_spec.js
+++ b/spec/frontend/packages_and_registries/shared/components/registry_breadcrumb_spec.js
@@ -1,4 +1,4 @@
-import { mount } from '@vue/test-utils';
+import { mount, RouterLinkStub } from '@vue/test-utils';
import component from '~/packages_and_registries/shared/components/registry_breadcrumb.vue';
@@ -21,6 +21,9 @@ describe('Registry Breadcrumb', () => {
},
},
},
+ stubs: {
+ RouterLink: RouterLinkStub,
+ },
});
};
@@ -30,7 +33,6 @@ describe('Registry Breadcrumb', () => {
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
describe('when is rootRoute', () => {
@@ -46,7 +48,6 @@ describe('Registry Breadcrumb', () => {
const links = wrapper.findAll('a');
expect(links).toHaveLength(1);
- expect(links.at(0).attributes('href')).toBe('/');
});
it('the link text is calculated by nameGenerator', () => {
@@ -67,7 +68,6 @@ describe('Registry Breadcrumb', () => {
const links = wrapper.findAll('a');
expect(links).toHaveLength(2);
- expect(links.at(0).attributes('href')).toBe('/');
expect(links.at(1).attributes('href')).toBe('#');
});
diff --git a/spec/frontend/pager_spec.js b/spec/frontend/pager_spec.js
index 043ea470436..9df69124d66 100644
--- a/spec/frontend/pager_spec.js
+++ b/spec/frontend/pager_spec.js
@@ -68,34 +68,34 @@ describe('pager', () => {
it('shows loader while loading next page', async () => {
mockSuccess();
- jest.spyOn(Pager.loading, 'show').mockImplementation(() => {});
+ jest.spyOn(Pager.$loading, 'show').mockImplementation(() => {});
Pager.getOld();
await waitForPromises();
- expect(Pager.loading.show).toHaveBeenCalled();
+ expect(Pager.$loading.show).toHaveBeenCalled();
});
it('hides loader on success', async () => {
mockSuccess();
- jest.spyOn(Pager.loading, 'hide').mockImplementation(() => {});
+ jest.spyOn(Pager.$loading, 'hide').mockImplementation(() => {});
Pager.getOld();
await waitForPromises();
- expect(Pager.loading.hide).toHaveBeenCalled();
+ expect(Pager.$loading.hide).toHaveBeenCalled();
});
it('hides loader on error', async () => {
mockError();
- jest.spyOn(Pager.loading, 'hide').mockImplementation(() => {});
+ jest.spyOn(Pager.$loading, 'hide').mockImplementation(() => {});
Pager.getOld();
await waitForPromises();
- expect(Pager.loading.hide).toHaveBeenCalled();
+ expect(Pager.$loading.hide).toHaveBeenCalled();
});
it('sends request to url with offset and limit params', async () => {
@@ -122,12 +122,12 @@ describe('pager', () => {
Pager.limit = 20;
mockSuccess(1);
- jest.spyOn(Pager.loading, 'hide').mockImplementation(() => {});
+ jest.spyOn(Pager.$loading, 'hide').mockImplementation(() => {});
Pager.getOld();
await waitForPromises();
- expect(Pager.loading.hide).toHaveBeenCalled();
+ expect(Pager.$loading.hide).toHaveBeenCalled();
expect(Pager.disable).toBe(true);
});
@@ -175,5 +175,46 @@ describe('pager', () => {
expect(axios.get).toHaveBeenCalledWith(href, expect.any(Object));
});
});
+
+ describe('when `container` is passed', () => {
+ const href = '/some_list';
+ const container = '#js-pager';
+ let endlessScrollCallback;
+
+ beforeEach(() => {
+ jest.spyOn(axios, 'get');
+ jest.spyOn($.fn, 'endlessScroll').mockImplementation(({ callback }) => {
+ endlessScrollCallback = callback;
+ });
+ });
+
+ describe('when `container` is visible', () => {
+ it('makes API request', () => {
+ setFixtures(
+ `<div id="js-pager"><div class="content_list" data-href="${href}"></div></div>`,
+ );
+
+ Pager.init({ container });
+
+ endlessScrollCallback();
+
+ expect(axios.get).toHaveBeenCalledWith(href, expect.any(Object));
+ });
+ });
+
+ describe('when `container` is not visible', () => {
+ it('does not make API request', () => {
+ setFixtures(
+ `<div id="js-pager" style="display: none;"><div class="content_list" data-href="${href}"></div></div>`,
+ );
+
+ Pager.init({ container });
+
+ endlessScrollCallback();
+
+ expect(axios.get).not.toHaveBeenCalled();
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/pages/admin/application_settings/account_and_limits_spec.js b/spec/frontend/pages/admin/application_settings/account_and_limits_spec.js
index 9f326dc33c0..3a4f93d4464 100644
--- a/spec/frontend/pages/admin/application_settings/account_and_limits_spec.js
+++ b/spec/frontend/pages/admin/application_settings/account_and_limits_spec.js
@@ -23,13 +23,12 @@ describe('AccountAndLimits', () => {
expect($userInternalRegex.readOnly).toBeTruthy();
});
- it('is checked', (done) => {
+ it('is checked', () => {
if (!$userDefaultExternal.prop('checked')) $userDefaultExternal.click();
expect($userDefaultExternal.prop('checked')).toBeTruthy();
expect($userInternalRegex.placeholder).toEqual(PLACEHOLDER_USER_EXTERNAL_DEFAULT_TRUE);
expect($userInternalRegex.readOnly).toBeFalsy();
- done();
});
});
});
diff --git a/spec/frontend/pages/admin/jobs/index/components/stop_jobs_modal_spec.js b/spec/frontend/pages/admin/jobs/index/components/stop_jobs_modal_spec.js
index 52648d3ce00..ebf21c01324 100644
--- a/spec/frontend/pages/admin/jobs/index/components/stop_jobs_modal_spec.js
+++ b/spec/frontend/pages/admin/jobs/index/components/stop_jobs_modal_spec.js
@@ -26,7 +26,7 @@ describe('stop_jobs_modal.vue', () => {
});
describe('onSubmit', () => {
- it('stops jobs and redirects to overview page', (done) => {
+ it('stops jobs and redirects to overview page', async () => {
const responseURL = `${TEST_HOST}/stop_jobs_modal.vue/jobs`;
jest.spyOn(axios, 'post').mockImplementation((url) => {
expect(url).toBe(props.url);
@@ -37,29 +37,19 @@ describe('stop_jobs_modal.vue', () => {
});
});
- vm.onSubmit()
- .then(() => {
- expect(redirectTo).toHaveBeenCalledWith(responseURL);
- })
- .then(done)
- .catch(done.fail);
+ await vm.onSubmit();
+ expect(redirectTo).toHaveBeenCalledWith(responseURL);
});
- it('displays error if stopping jobs failed', (done) => {
+ it('displays error if stopping jobs failed', async () => {
const dummyError = new Error('stopping jobs failed');
jest.spyOn(axios, 'post').mockImplementation((url) => {
expect(url).toBe(props.url);
return Promise.reject(dummyError);
});
- vm.onSubmit()
- .then(done.fail)
- .catch((error) => {
- expect(error).toBe(dummyError);
- expect(redirectTo).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
+ await expect(vm.onSubmit()).rejects.toEqual(dummyError);
+ expect(redirectTo).not.toHaveBeenCalled();
});
});
});
diff --git a/spec/frontend/pages/dashboard/todos/index/todos_spec.js b/spec/frontend/pages/dashboard/todos/index/todos_spec.js
index ef295e7d1ba..ae53afa7fba 100644
--- a/spec/frontend/pages/dashboard/todos/index/todos_spec.js
+++ b/spec/frontend/pages/dashboard/todos/index/todos_spec.js
@@ -31,15 +31,17 @@ describe('Todos', () => {
});
describe('goToTodoUrl', () => {
- it('opens the todo url', (done) => {
+ it('opens the todo url', () => {
const todoLink = todoItem.dataset.url;
+ let expectedUrl = null;
visitUrl.mockImplementation((url) => {
- expect(url).toEqual(todoLink);
- done();
+ expectedUrl = url;
});
todoItem.click();
+
+ expect(expectedUrl).toEqual(todoLink);
});
describe('meta click', () => {
diff --git a/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js b/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
index 6fb03fa28fe..43c48617800 100644
--- a/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
+++ b/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
@@ -137,6 +137,16 @@ describe('BulkImportsHistoryApp', () => {
);
});
+ it('renders correct url for destination group when relative_url is empty', async () => {
+ mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
+ createComponent({ shallow: false });
+ await axios.waitForAll();
+
+ expect(wrapper.find('tbody tr a').attributes().href).toBe(
+ `/${DUMMY_RESPONSE[0].destination_namespace}/${DUMMY_RESPONSE[0].destination_name}`,
+ );
+ });
+
describe('details button', () => {
beforeEach(() => {
mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
diff --git a/spec/frontend/pages/import/history/components/import_error_details_spec.js b/spec/frontend/pages/import/history/components/import_error_details_spec.js
new file mode 100644
index 00000000000..4ff3f0361cf
--- /dev/null
+++ b/spec/frontend/pages/import/history/components/import_error_details_spec.js
@@ -0,0 +1,66 @@
+import { GlLoadingIcon } from '@gitlab/ui';
+import { mount, shallowMount } from '@vue/test-utils';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import ImportErrorDetails from '~/pages/import/history/components/import_error_details.vue';
+
+describe('ImportErrorDetails', () => {
+ const FAKE_ID = 5;
+ const API_URL = `/api/v4/projects/${FAKE_ID}`;
+
+ let wrapper;
+ let mock;
+
+ function createComponent({ shallow = true } = {}) {
+ const mountFn = shallow ? shallowMount : mount;
+ wrapper = mountFn(ImportErrorDetails, {
+ propsData: {
+ id: FAKE_ID,
+ },
+ });
+ }
+
+ 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 import_error if it is available', async () => {
+ const FAKE_IMPORT_ERROR = 'IMPORT ERROR';
+ mock.onGet(API_URL).reply(200, { import_error: FAKE_IMPORT_ERROR });
+ createComponent();
+ await axios.waitForAll();
+
+ expect(wrapper.find(GlLoadingIcon).exists()).toBe(false);
+ expect(wrapper.find('pre').text()).toBe(FAKE_IMPORT_ERROR);
+ });
+
+ it('renders default text if error is not available', async () => {
+ mock.onGet(API_URL).reply(200, { import_error: null });
+ createComponent();
+ await axios.waitForAll();
+
+ expect(wrapper.find(GlLoadingIcon).exists()).toBe(false);
+ expect(wrapper.find('pre').text()).toBe('No additional information provided.');
+ });
+ });
+});
diff --git a/spec/frontend/pages/import/history/components/import_history_app_spec.js b/spec/frontend/pages/import/history/components/import_history_app_spec.js
new file mode 100644
index 00000000000..0d821b114cf
--- /dev/null
+++ b/spec/frontend/pages/import/history/components/import_history_app_spec.js
@@ -0,0 +1,205 @@
+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 ImportErrorDetails from '~/pages/import/history/components/import_error_details.vue';
+import ImportHistoryApp from '~/pages/import/history/components/import_history_app.vue';
+import PaginationBar from '~/vue_shared/components/pagination_bar/pagination_bar.vue';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import { stubComponent } from 'helpers/stub_component';
+
+describe('ImportHistoryApp', () => {
+ const API_URL = '/api/v4/projects.json';
+
+ 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,
+ path_with_namespace: 'root/imported',
+ created_at: '2022-03-10T15:10:03.172Z',
+ import_url: null,
+ import_type: 'gitlab_project',
+ import_status: 'finished',
+ },
+ {
+ id: 2,
+ name_with_namespace: 'Administrator / Dummy',
+ path_with_namespace: 'root/dummy',
+ created_at: '2022-03-09T11:23:04.974Z',
+ import_url: 'https://dummy.github/url',
+ import_type: 'github',
+ import_status: 'failed',
+ },
+ {
+ id: 3,
+ name_with_namespace: 'Administrator / Dummy',
+ path_with_namespace: 'root/dummy2',
+ created_at: '2022-03-09T11:23:04.974Z',
+ import_url: 'git://non-http.url',
+ import_type: 'gi',
+ import_status: 'finished',
+ },
+ ];
+ let wrapper;
+ let mock;
+
+ function createComponent({ shallow = true } = {}) {
+ const mountFn = shallow ? shallowMount : mount;
+ wrapper = mountFn(ImportHistoryApp, {
+ provide: { assets: { gitlabLogo: 'http://dummy.host' } },
+ stubs: shallow ? { GlTable: { ...stubComponent(GlTable), props: ['items'] } } : {},
+ });
+ }
+
+ 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);
+ expect(table.props().items).toStrictEqual(DUMMY_RESPONSE);
+ });
+
+ 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();
+
+ const FAKE_NEXT_PAGE_REPLY = [
+ {
+ id: 4,
+ path_with_namespace: 'root/some_other_project',
+ created_at: '2022-03-10T15:10:03.172Z',
+ import_url: null,
+ import_type: 'gitlab_project',
+ import_status: 'finished',
+ },
+ ];
+
+ mock.onGet(API_URL).reply(200, FAKE_NEXT_PAGE_REPLY, DEFAULT_HEADERS);
+
+ 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 }));
+ expect(wrapper.find(GlTable).props().items).toStrictEqual(FAKE_NEXT_PAGE_REPLY);
+ });
+ });
+
+ 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 }),
+ );
+ });
+
+ it('resets page to 1 when page size is changed', async () => {
+ const NEW_PAGE_SIZE = 4;
+
+ mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
+ createComponent();
+ await axios.waitForAll();
+ wrapper.findComponent(PaginationBar).vm.$emit('set-page', 2);
+ 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, page: 1 }),
+ );
+ });
+
+ 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 failed', async () => {
+ expect(
+ extendedWrapper(wrapper.find('tbody').findAll('tr').at(1)).findByText('Details').exists(),
+ ).toBe(true);
+ });
+
+ it('does not render details button if relevant item does not failed', () => {
+ 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)
+ .findComponent(ImportErrorDetails);
+
+ expect(detailsRowContent.exists()).toBe(true);
+ expect(detailsRowContent.props().id).toBe(DUMMY_RESPONSE[1].id);
+ });
+ });
+});
diff --git a/spec/frontend/pages/profiles/show/emoji_menu_spec.js b/spec/frontend/pages/profiles/show/emoji_menu_spec.js
index f35fb57aec7..fa6e7e51a60 100644
--- a/spec/frontend/pages/profiles/show/emoji_menu_spec.js
+++ b/spec/frontend/pages/profiles/show/emoji_menu_spec.js
@@ -46,22 +46,18 @@ describe('EmojiMenu', () => {
const dummyEmoji = 'tropical_fish';
const dummyVotesBlock = () => $('<div />');
- it('calls selectEmojiCallback', (done) => {
+ it('calls selectEmojiCallback', async () => {
expect(dummySelectEmojiCallback).not.toHaveBeenCalled();
- emojiMenu.addAward(dummyVotesBlock(), dummyAwardUrl, dummyEmoji, false, () => {
- expect(dummySelectEmojiCallback).toHaveBeenCalledWith(dummyEmoji, dummyEmojiTag);
- done();
- });
+ await emojiMenu.addAward(dummyVotesBlock(), dummyAwardUrl, dummyEmoji, false);
+ expect(dummySelectEmojiCallback).toHaveBeenCalledWith(dummyEmoji, dummyEmojiTag);
});
- it('does not make an axios request', (done) => {
+ it('does not make an axios request', async () => {
jest.spyOn(axios, 'request').mockReturnValue();
- emojiMenu.addAward(dummyVotesBlock(), dummyAwardUrl, dummyEmoji, false, () => {
- expect(axios.request).not.toHaveBeenCalled();
- done();
- });
+ await emojiMenu.addAward(dummyVotesBlock(), dummyAwardUrl, dummyEmoji, false);
+ expect(axios.request).not.toHaveBeenCalled();
});
});
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_section_card_spec.js.snap b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_section_card_spec.js.snap
index 9e00ace761c..83feb621478 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_section_card_spec.js.snap
+++ b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_section_card_spec.js.snap
@@ -2,31 +2,26 @@
exports[`Learn GitLab Section Card renders correctly 1`] = `
<gl-card-stub
- bodyclass=""
- class="gl-pt-0 learn-gitlab-section-card"
+ bodyclass="gl-pt-0"
+ class="gl-pt-0 h-100"
footerclass=""
- headerclass=""
+ headerclass="gl-bg-white gl-border-0 gl-pb-0"
>
- <div
- class="learn-gitlab-section-card-header"
+ <img
+ src="workspace.svg"
+ />
+
+ <h2
+ class="gl-font-lg gl-mb-3"
>
- <img
- src="workspace.svg"
- />
-
- <h2
- class="gl-font-lg gl-mb-3"
- >
- Set up your workspace
- </h2>
-
- <p
- class="gl-text-gray-700 gl-mb-6"
- >
- Complete these tasks first so you can enjoy GitLab's features to their fullest:
- </p>
- </div>
+ Set up your workspace
+ </h2>
+ <p
+ class="gl-text-gray-700 gl-mb-6"
+ >
+ Complete these tasks first so you can enjoy GitLab's features to their fullest:
+ </p>
<learn-gitlab-section-link-stub
action="userAdded"
value="[object Object]"
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap
index 62cf769cffd..269c7467c8b 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap
+++ b/spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap
@@ -51,170 +51,204 @@ exports[`Learn GitLab renders correctly 1`] = `
</div>
<div
- class="row row-cols-1 row-cols-md-3 gl-mt-5"
+ class="row"
>
<div
- class="col gl-mb-6"
+ class="gl-mt-5 col-sm-12 col-mb-6 col-lg-4"
>
<div
- class="gl-card gl-pt-0 learn-gitlab-section-card"
+ class="gl-card gl-pt-0 h-100"
>
- <!---->
-
<div
- class="gl-card-body"
+ class="gl-card-header gl-bg-white gl-border-0 gl-pb-0"
>
- <div
- class="learn-gitlab-section-card-header"
+ <img
+ src="workspace.svg"
+ />
+
+ <h2
+ class="gl-font-lg gl-mb-3"
>
- <img
- src="workspace.svg"
- />
-
- <h2
- class="gl-font-lg gl-mb-3"
- >
- Set up your workspace
- </h2>
-
- <p
- class="gl-text-gray-700 gl-mb-6"
- >
- Complete these tasks first so you can enjoy GitLab's features to their fullest:
- </p>
- </div>
+ Set up your workspace
+ </h2>
+ <p
+ class="gl-text-gray-700 gl-mb-6"
+ >
+ Complete these tasks first so you can enjoy GitLab's features to their fullest:
+ </p>
+ </div>
+
+ <div
+ class="gl-card-body gl-pt-0"
+ >
<div
class="gl-mb-4"
>
- <span
- class="gl-text-green-500"
+ <!---->
+
+ <div
+ class="flex align-items-center"
>
- <svg
- aria-hidden="true"
- class="gl-icon s16"
- data-testid="completed-icon"
- role="img"
+ <span
+ class="gl-text-green-500"
>
- <use
- href="#check-circle-filled"
- />
- </svg>
-
- Invite your colleagues
-
- </span>
-
- <!---->
+ <svg
+ aria-hidden="true"
+ class="gl-icon s16"
+ data-testid="completed-icon"
+ role="img"
+ >
+ <use
+ href="#check-circle-filled"
+ />
+ </svg>
+
+ Invite your colleagues
+
+ </span>
+
+ <!---->
+ </div>
</div>
<div
class="gl-mb-4"
>
- <span
- class="gl-text-green-500"
+ <!---->
+
+ <div
+ class="flex align-items-center"
>
- <svg
- aria-hidden="true"
- class="gl-icon s16"
- data-testid="completed-icon"
- role="img"
+ <span
+ class="gl-text-green-500"
>
- <use
- href="#check-circle-filled"
- />
- </svg>
-
- Create or import a repository
-
- </span>
-
- <!---->
+ <svg
+ aria-hidden="true"
+ class="gl-icon s16"
+ data-testid="completed-icon"
+ role="img"
+ >
+ <use
+ href="#check-circle-filled"
+ />
+ </svg>
+
+ Create or import a repository
+
+ </span>
+
+ <!---->
+ </div>
</div>
<div
class="gl-mb-4"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Set up CI/CD"
- href="http://example.com/"
- target="_self"
- >
-
- Set up CI/CD
-
- </a>
-
<!---->
+
+ <div
+ class="flex align-items-center"
+ >
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="Set up CI/CD"
+ href="http://example.com/"
+ target="_self"
+ >
+
+ Set up CI/CD
+
+ </a>
+
+ <!---->
+ </div>
</div>
<div
class="gl-mb-4"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Start a free Ultimate trial"
- href="http://example.com/"
- target="_self"
- >
-
- Start a free Ultimate trial
-
- </a>
-
<!---->
+
+ <div
+ class="flex align-items-center"
+ >
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="Start a free Ultimate trial"
+ href="http://example.com/"
+ target="_self"
+ >
+
+ Start a free Ultimate trial
+
+ </a>
+
+ <!---->
+ </div>
</div>
<div
class="gl-mb-4"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Add code owners"
- href="http://example.com/"
- target="_self"
- >
-
- Add code owners
-
- </a>
-
- <span
+ <div
class="gl-font-style-italic gl-text-gray-500"
data-testid="trial-only"
>
- - Trial only
+ Trial only
- </span>
+ </div>
+
+ <div
+ class="flex align-items-center"
+ >
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="Add code owners"
+ href="http://example.com/"
+ target="_self"
+ >
+
+ Add code owners
+
+ </a>
+
+ <!---->
+ </div>
</div>
<div
class="gl-mb-4"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Add merge request approval"
- href="http://example.com/"
- target="_self"
- >
-
- Add merge request approval
-
- </a>
-
- <span
+ <div
class="gl-font-style-italic gl-text-gray-500"
data-testid="trial-only"
>
- - Trial only
+ Trial only
- </span>
+ </div>
+
+ <div
+ class="flex align-items-center"
+ >
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="Add merge request approval"
+ href="http://example.com/"
+ target="_self"
+ >
+
+ Add merge request approval
+
+ </a>
+
+ <!---->
+ </div>
</div>
</div>
@@ -222,71 +256,81 @@ exports[`Learn GitLab renders correctly 1`] = `
</div>
</div>
<div
- class="col gl-mb-6"
+ class="gl-mt-5 col-sm-12 col-mb-6 col-lg-4"
>
<div
- class="gl-card gl-pt-0 learn-gitlab-section-card"
+ class="gl-card gl-pt-0 h-100"
>
- <!---->
-
<div
- class="gl-card-body"
+ class="gl-card-header gl-bg-white gl-border-0 gl-pb-0"
>
- <div
- class="learn-gitlab-section-card-header"
+ <img
+ src="plan.svg"
+ />
+
+ <h2
+ class="gl-font-lg gl-mb-3"
>
- <img
- src="plan.svg"
- />
-
- <h2
- class="gl-font-lg gl-mb-3"
- >
- Plan and execute
- </h2>
-
- <p
- class="gl-text-gray-700 gl-mb-6"
- >
- Create a workflow for your new workspace, and learn how GitLab features work together:
- </p>
- </div>
+ Plan and execute
+ </h2>
+ <p
+ class="gl-text-gray-700 gl-mb-6"
+ >
+ Create a workflow for your new workspace, and learn how GitLab features work together:
+ </p>
+ </div>
+
+ <div
+ class="gl-card-body gl-pt-0"
+ >
<div
class="gl-mb-4"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Create an issue"
- href="http://example.com/"
- target="_self"
- >
-
- Create an issue
-
- </a>
-
<!---->
+
+ <div
+ class="flex align-items-center"
+ >
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="Create an issue"
+ href="http://example.com/"
+ target="_self"
+ >
+
+ Create an issue
+
+ </a>
+
+ <!---->
+ </div>
</div>
<div
class="gl-mb-4"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Submit a merge request"
- href="http://example.com/"
- target="_self"
- >
-
- Submit a merge request
-
- </a>
-
<!---->
+
+ <div
+ class="flex align-items-center"
+ >
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="Submit a merge request"
+ href="http://example.com/"
+ target="_self"
+ >
+
+ Submit a merge request
+
+ </a>
+
+ <!---->
+ </div>
</div>
</div>
@@ -294,54 +338,58 @@ exports[`Learn GitLab renders correctly 1`] = `
</div>
</div>
<div
- class="col gl-mb-6"
+ class="gl-mt-5 col-sm-12 col-mb-6 col-lg-4"
>
<div
- class="gl-card gl-pt-0 learn-gitlab-section-card"
+ class="gl-card gl-pt-0 h-100"
>
- <!---->
-
<div
- class="gl-card-body"
+ class="gl-card-header gl-bg-white gl-border-0 gl-pb-0"
>
- <div
- class="learn-gitlab-section-card-header"
+ <img
+ src="deploy.svg"
+ />
+
+ <h2
+ class="gl-font-lg gl-mb-3"
>
- <img
- src="deploy.svg"
- />
-
- <h2
- class="gl-font-lg gl-mb-3"
- >
- Deploy
- </h2>
-
- <p
- class="gl-text-gray-700 gl-mb-6"
- >
- Use your new GitLab workflow to deploy your application, monitor its health, and keep it secure:
- </p>
- </div>
+ Deploy
+ </h2>
+ <p
+ class="gl-text-gray-700 gl-mb-6"
+ >
+ Use your new GitLab workflow to deploy your application, monitor its health, and keep it secure:
+ </p>
+ </div>
+
+ <div
+ class="gl-card-body gl-pt-0"
+ >
<div
class="gl-mb-4"
>
- <a
- class="gl-link"
- data-testid="uncompleted-learn-gitlab-link"
- data-track-action="click_link"
- data-track-label="Run a Security scan using CI/CD"
- href="https://docs.gitlab.com/ee/foobar/"
- rel="noopener noreferrer"
- target="_blank"
- >
-
- Run a Security scan using CI/CD
-
- </a>
-
<!---->
+
+ <div
+ class="flex align-items-center"
+ >
+ <a
+ class="gl-link"
+ data-testid="uncompleted-learn-gitlab-link"
+ data-track-action="click_link"
+ data-track-label="Run a Security scan using CI/CD"
+ href="https://docs.gitlab.com/ee/foobar/"
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+
+ Run a Security scan using CI/CD
+
+ </a>
+
+ <!---->
+ </div>
</div>
</div>
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js
index e21371123e8..b8ebf2a1430 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js
+++ b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js
@@ -1,4 +1,4 @@
-import { shallowMount } from '@vue/test-utils';
+import { mount } from '@vue/test-utils';
import { stubExperiments } from 'helpers/experimentation_helper';
import { mockTracking, triggerEvent, unmockTracking } from 'helpers/tracking_helper';
import eventHub from '~/invite_members/event_hub';
@@ -26,7 +26,7 @@ describe('Learn GitLab Section Link', () => {
});
const createWrapper = (action = defaultAction, props = {}) => {
- wrapper = shallowMount(LearnGitlabSectionLink, {
+ wrapper = mount(LearnGitlabSectionLink, {
propsData: { action, value: { ...defaultProps, ...props } },
});
};
@@ -36,6 +36,8 @@ describe('Learn GitLab Section Link', () => {
const findUncompletedLink = () => wrapper.find('[data-testid="uncompleted-learn-gitlab-link"]');
+ const videoTutorialLink = () => wrapper.find('[data-testid="video-tutorial-link"]');
+
it('renders no icon when not completed', () => {
createWrapper(undefined, { completed: false });
@@ -130,4 +132,51 @@ describe('Learn GitLab Section Link', () => {
unmockTracking();
});
});
+
+ describe('video_tutorials_continuous_onboarding experiment', () => {
+ describe('when control', () => {
+ beforeEach(() => {
+ stubExperiments({ video_tutorials_continuous_onboarding: 'control' });
+ createWrapper('codeOwnersEnabled');
+ });
+
+ it('renders no video link', () => {
+ expect(videoTutorialLink().exists()).toBe(false);
+ });
+ });
+
+ describe('when candidate', () => {
+ beforeEach(() => {
+ stubExperiments({ video_tutorials_continuous_onboarding: 'candidate' });
+ createWrapper('codeOwnersEnabled');
+ });
+
+ it('renders video link with blank target', () => {
+ const videoLinkElement = videoTutorialLink();
+
+ expect(videoLinkElement.exists()).toBe(true);
+ expect(videoLinkElement.attributes('target')).toEqual('_blank');
+ });
+
+ it('tracks the click', () => {
+ const trackingSpy = mockTracking('_category_', wrapper.element, jest.spyOn);
+
+ videoTutorialLink().trigger('click');
+
+ expect(trackingSpy).toHaveBeenCalledWith('_category_', 'click_video_link', {
+ label: 'Add code owners',
+ property: 'Growth::Conversion::Experiment::LearnGitLab',
+ context: {
+ data: {
+ experiment: 'video_tutorials_continuous_onboarding',
+ variant: 'candidate',
+ },
+ schema: 'iglu:com.gitlab/gitlab_experiment/jsonschema/1-0-0',
+ },
+ });
+
+ unmockTracking();
+ });
+ });
+ });
});
diff --git a/spec/frontend/pages/projects/shared/permissions/components/project_feature_settings_spec.js b/spec/frontend/pages/projects/shared/permissions/components/project_feature_settings_spec.js
index 0fffcf433a3..5771e1b88e8 100644
--- a/spec/frontend/pages/projects/shared/permissions/components/project_feature_settings_spec.js
+++ b/spec/frontend/pages/projects/shared/permissions/components/project_feature_settings_spec.js
@@ -3,15 +3,17 @@ import { shallowMount } from '@vue/test-utils';
import ProjectFeatureSetting from '~/pages/projects/shared/permissions/components/project_feature_setting.vue';
describe('Project Feature Settings', () => {
+ const defaultOptions = [
+ [1, 1],
+ [2, 2],
+ [3, 3],
+ [4, 4],
+ [5, 5],
+ ];
+
const defaultProps = {
name: 'Test',
- options: [
- [1, 1],
- [2, 2],
- [3, 3],
- [4, 4],
- [5, 5],
- ],
+ options: defaultOptions,
value: 1,
disabledInput: false,
showToggle: true,
@@ -110,15 +112,25 @@ describe('Project Feature Settings', () => {
},
);
- it('should emit the change when a new option is selected', () => {
+ it('should emit the change when a new option is selected', async () => {
wrapper = mountComponent();
expect(wrapper.emitted('change')).toBeUndefined();
- wrapper.findAll('option').at(1).trigger('change');
+ await wrapper.findAll('option').at(1).setSelected();
expect(wrapper.emitted('change')).toHaveLength(1);
expect(wrapper.emitted('change')[0]).toEqual([2]);
});
+
+ it('value of select matches prop `value` if options are modified', async () => {
+ wrapper = mountComponent();
+
+ await wrapper.setProps({ value: 0, options: [[0, 0]] });
+ expect(wrapper.find('select').element.selectedIndex).toBe(0);
+
+ await wrapper.setProps({ value: 2, options: defaultOptions });
+ expect(wrapper.find('select').element.selectedIndex).toBe(1);
+ });
});
});
diff --git a/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js b/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
index 305dce51971..30d5f89d2f6 100644
--- a/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
+++ b/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
@@ -1,6 +1,6 @@
import { GlSprintf, GlToggle } from '@gitlab/ui';
import { shallowMount, mount } from '@vue/test-utils';
-import projectFeatureSetting from '~/pages/projects/shared/permissions/components/project_feature_setting.vue';
+import ProjectFeatureSetting from '~/pages/projects/shared/permissions/components/project_feature_setting.vue';
import settingsPanel from '~/pages/projects/shared/permissions/components/settings_panel.vue';
import {
featureAccessLevel,
@@ -21,6 +21,7 @@ const defaultProps = {
wikiAccessLevel: 20,
snippetsAccessLevel: 20,
operationsAccessLevel: 20,
+ metricsDashboardAccessLevel: 20,
pagesAccessLevel: 10,
analyticsAccessLevel: 20,
containerRegistryAccessLevel: 20,
@@ -75,7 +76,7 @@ describe('Settings Panel', () => {
const findLFSFeatureToggle = () => findLFSSettingsRow().find(GlToggle);
const findRepositoryFeatureProjectRow = () => wrapper.find({ ref: 'repository-settings' });
const findRepositoryFeatureSetting = () =>
- findRepositoryFeatureProjectRow().find(projectFeatureSetting);
+ findRepositoryFeatureProjectRow().find(ProjectFeatureSetting);
const findProjectVisibilitySettings = () => wrapper.find({ ref: 'project-visibility-settings' });
const findIssuesSettingsRow = () => wrapper.find({ ref: 'issues-settings' });
const findAnalyticsRow = () => wrapper.find({ ref: 'analytics-settings' });
@@ -106,7 +107,11 @@ describe('Settings Panel', () => {
'input[name="project[project_setting_attributes][warn_about_potentially_unwanted_characters]"]',
);
const findMetricsVisibilitySettings = () => wrapper.find({ ref: 'metrics-visibility-settings' });
+ const findMetricsVisibilityInput = () =>
+ findMetricsVisibilitySettings().findComponent(ProjectFeatureSetting);
const findOperationsSettings = () => wrapper.find({ ref: 'operations-settings' });
+ const findOperationsVisibilityInput = () =>
+ findOperationsSettings().findComponent(ProjectFeatureSetting);
const findConfirmDangerButton = () => wrapper.findComponent(ConfirmDanger);
afterEach(() => {
@@ -595,7 +600,7 @@ describe('Settings Panel', () => {
});
describe('Metrics dashboard', () => {
- it('should show the metrics dashboard access toggle', () => {
+ it('should show the metrics dashboard access select', () => {
wrapper = mountComponent();
expect(findMetricsVisibilitySettings().exists()).toBe(true);
@@ -610,23 +615,51 @@ describe('Settings Panel', () => {
});
it.each`
- scenario | selectedOption | selectedOptionLabel
- ${{ currentSettings: { visibilityLevel: visibilityOptions.PRIVATE } }} | ${String(featureAccessLevel.PROJECT_MEMBERS)} | ${'Only Project Members'}
- ${{ currentSettings: { operationsAccessLevel: featureAccessLevel.NOT_ENABLED } }} | ${String(featureAccessLevel.NOT_ENABLED)} | ${'Enable feature to choose access level'}
+ before | after
+ ${featureAccessLevel.NOT_ENABLED} | ${featureAccessLevel.EVERYONE}
+ ${featureAccessLevel.NOT_ENABLED} | ${featureAccessLevel.PROJECT_MEMBERS}
+ ${featureAccessLevel.EVERYONE} | ${featureAccessLevel.PROJECT_MEMBERS}
+ ${featureAccessLevel.EVERYONE} | ${featureAccessLevel.NOT_ENABLED}
+ ${featureAccessLevel.PROJECT_MEMBERS} | ${featureAccessLevel.NOT_ENABLED}
`(
- 'should disable the metrics visibility dropdown when #scenario',
- ({ scenario, selectedOption, selectedOptionLabel }) => {
- wrapper = mountComponent(scenario, mount);
+ 'when updating Operations Settings access level from `$before` to `$after`, Metric Dashboard access is updated to `$after` as well',
+ async ({ before, after }) => {
+ wrapper = mountComponent({
+ currentSettings: { operationsAccessLevel: before, metricsDashboardAccessLevel: before },
+ });
- const select = findMetricsVisibilitySettings().find('select');
- const option = select.find('option');
+ await findOperationsVisibilityInput().vm.$emit('change', after);
- expect(select.attributes('disabled')).toBe('disabled');
- expect(select.element.value).toBe(selectedOption);
- expect(option.attributes('value')).toBe(selectedOption);
- expect(option.text()).toBe(selectedOptionLabel);
+ expect(findMetricsVisibilityInput().props('value')).toBe(after);
},
);
+
+ it('when updating Operations Settings access level from `10` to `20`, Metric Dashboard access is not increased', async () => {
+ wrapper = mountComponent({
+ currentSettings: {
+ operationsAccessLevel: featureAccessLevel.PROJECT_MEMBERS,
+ metricsDashboardAccessLevel: featureAccessLevel.PROJECT_MEMBERS,
+ },
+ });
+
+ await findOperationsVisibilityInput().vm.$emit('change', featureAccessLevel.EVERYONE);
+
+ expect(findMetricsVisibilityInput().props('value')).toBe(featureAccessLevel.PROJECT_MEMBERS);
+ });
+
+ it('should reduce Metrics visibility level when visibility is set to private', async () => {
+ wrapper = mountComponent({
+ currentSettings: {
+ visibilityLevel: visibilityOptions.PUBLIC,
+ operationsAccessLevel: featureAccessLevel.EVERYONE,
+ metricsDashboardAccessLevel: featureAccessLevel.EVERYONE,
+ },
+ });
+
+ await findProjectVisibilityLevelInput().setValue(visibilityOptions.PRIVATE);
+
+ expect(findMetricsVisibilityInput().props('value')).toBe(featureAccessLevel.PROJECT_MEMBERS);
+ });
});
describe('Analytics', () => {
diff --git a/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js b/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js
new file mode 100644
index 00000000000..365bb878485
--- /dev/null
+++ b/spec/frontend/pages/shared/wikis/components/wiki_content_spec.js
@@ -0,0 +1,97 @@
+import { GlSkeletonLoader, GlAlert } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import { shallowMount } from '@vue/test-utils';
+import MockAdapter from 'axios-mock-adapter';
+import WikiContent from '~/pages/shared/wikis/components/wiki_content.vue';
+import { renderGFM } from '~/pages/shared/wikis/render_gfm_facade';
+import axios from '~/lib/utils/axios_utils';
+import httpStatus from '~/lib/utils/http_status';
+import waitForPromises from 'helpers/wait_for_promises';
+
+jest.mock('~/pages/shared/wikis/render_gfm_facade');
+
+describe('pages/shared/wikis/components/wiki_content', () => {
+ const PATH = '/test';
+ let wrapper;
+ let mock;
+
+ function buildWrapper(propsData = {}) {
+ wrapper = shallowMount(WikiContent, {
+ propsData: { getWikiContentUrl: PATH, ...propsData },
+ stubs: {
+ GlSkeletonLoader,
+ GlAlert,
+ },
+ });
+ }
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findGlAlert = () => wrapper.findComponent(GlAlert);
+ const findGlSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
+ const findContent = () => wrapper.find('[data-testid="wiki_page_content"]');
+
+ describe('when loading content', () => {
+ beforeEach(() => {
+ buildWrapper();
+ });
+
+ it('renders skeleton loader', () => {
+ expect(findGlSkeletonLoader().exists()).toBe(true);
+ });
+
+ it('does not render content container or error alert', () => {
+ expect(findGlAlert().exists()).toBe(false);
+ expect(findContent().exists()).toBe(false);
+ });
+ });
+
+ describe('when content loads successfully', () => {
+ const content = 'content';
+
+ beforeEach(() => {
+ mock.onGet(PATH, { params: { render_html: true } }).replyOnce(httpStatus.OK, { content });
+ buildWrapper();
+ return waitForPromises();
+ });
+
+ it('renders content container', () => {
+ expect(findContent().text()).toBe(content);
+ });
+
+ it('does not render skeleton loader or error alert', () => {
+ expect(findGlAlert().exists()).toBe(false);
+ expect(findGlSkeletonLoader().exists()).toBe(false);
+ });
+
+ it('calls renderGFM after nextTick', async () => {
+ await nextTick();
+
+ expect(renderGFM).toHaveBeenCalledWith(wrapper.element);
+ });
+ });
+
+ describe('when loading content fails', () => {
+ beforeEach(() => {
+ mock.onGet(PATH).replyOnce(httpStatus.INTERNAL_SERVER_ERROR, '');
+ buildWrapper();
+ return waitForPromises();
+ });
+
+ it('renders error alert', () => {
+ expect(findGlAlert().exists()).toBe(true);
+ });
+
+ it('does not render skeleton loader or content container', () => {
+ expect(findContent().exists()).toBe(false);
+ expect(findGlSkeletonLoader().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js b/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js
index e118a35804f..d7f8dc3c98e 100644
--- a/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js
+++ b/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js
@@ -1,5 +1,5 @@
import { nextTick } from 'vue';
-import { GlLoadingIcon, GlModal, GlAlert, GlButton } from '@gitlab/ui';
+import { GlAlert, GlButton } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
@@ -32,11 +32,7 @@ describe('WikiForm', () => {
const findMessage = () => wrapper.find('#wiki_message');
const findSubmitButton = () => wrapper.findByTestId('wiki-submit-button');
const findCancelButton = () => wrapper.findByTestId('wiki-cancel-button');
- const findUseNewEditorButton = () => wrapper.findByText('Use the new editor');
const findToggleEditingModeButton = () => wrapper.findByTestId('toggle-editing-mode-button');
- const findDismissContentEditorAlertButton = () => wrapper.findByText('Try this later');
- const findSwitchToOldEditorButton = () =>
- wrapper.findByRole('button', { name: 'Switch me back to the classic editor.' });
const findTitleHelpLink = () => wrapper.findByText('Learn more.');
const findMarkdownHelpLink = () => wrapper.findByTestId('wiki-markdown-help-link');
const findContentEditor = () => wrapper.findComponent(ContentEditor);
@@ -293,27 +289,21 @@ describe('WikiForm', () => {
);
});
- describe('when wikiSwitchBetweenContentEditorRawMarkdown feature flag is not enabled', () => {
+ describe('toggle editing mode control', () => {
beforeEach(() => {
- createWrapper({
- glFeatures: { wikiSwitchBetweenContentEditorRawMarkdown: false },
- });
- });
-
- it('hides toggle editing mode button', () => {
- expect(findToggleEditingModeButton().exists()).toBe(false);
- });
- });
-
- describe('when wikiSwitchBetweenContentEditorRawMarkdown feature flag is enabled', () => {
- beforeEach(() => {
- createWrapper({
- glFeatures: { wikiSwitchBetweenContentEditorRawMarkdown: true },
- });
+ createWrapper();
});
- it('hides gl-alert containing "use new editor" button', () => {
- expect(findUseNewEditorButton().exists()).toBe(false);
+ it.each`
+ format | enabled | action
+ ${'markdown'} | ${true} | ${'displays'}
+ ${'rdoc'} | ${false} | ${'hides'}
+ ${'asciidoc'} | ${false} | ${'hides'}
+ ${'org'} | ${false} | ${'hides'}
+ `('$action toggle editing mode button when format is $format', async ({ format, enabled }) => {
+ await setFormat(format);
+
+ expect(findToggleEditingModeButton().exists()).toBe(enabled);
});
it('displays toggle editing mode button', () => {
@@ -326,8 +316,8 @@ describe('WikiForm', () => {
});
describe('when clicking the toggle editing mode button', () => {
- beforeEach(() => {
- findToggleEditingModeButton().vm.$emit('click');
+ beforeEach(async () => {
+ await findToggleEditingModeButton().trigger('click');
});
it('hides the classic editor', () => {
@@ -343,17 +333,13 @@ describe('WikiForm', () => {
describe('when content editor is active', () => {
let mockContentEditor;
- beforeEach(() => {
+ beforeEach(async () => {
mockContentEditor = {
getSerializedContent: jest.fn(),
setSerializedContent: jest.fn(),
};
- findToggleEditingModeButton().vm.$emit('click');
- });
-
- it('hides switch to old editor button', () => {
- expect(findSwitchToOldEditorButton().exists()).toBe(false);
+ await findToggleEditingModeButton().trigger('click');
});
it('displays "Edit source" label in the toggle editing mode button', () => {
@@ -363,13 +349,13 @@ describe('WikiForm', () => {
describe('when clicking the toggle editing mode button', () => {
const contentEditorFakeSerializedContent = 'fake content';
- beforeEach(() => {
+ beforeEach(async () => {
mockContentEditor.getSerializedContent.mockReturnValueOnce(
contentEditorFakeSerializedContent,
);
findContentEditor().vm.$emit('initialized', mockContentEditor);
- findToggleEditingModeButton().vm.$emit('click');
+ await findToggleEditingModeButton().trigger('click');
});
it('hides the content editor', () => {
@@ -388,75 +374,12 @@ describe('WikiForm', () => {
});
describe('wiki content editor', () => {
- it.each`
- format | buttonExists
- ${'markdown'} | ${true}
- ${'rdoc'} | ${false}
- `(
- 'gl-alert containing "use new editor" button exists: $buttonExists if format is $format',
- async ({ format, buttonExists }) => {
- createWrapper();
-
- await setFormat(format);
-
- expect(findUseNewEditorButton().exists()).toBe(buttonExists);
- },
- );
-
- it('gl-alert containing "use new editor" button is dismissed on clicking dismiss button', async () => {
- createWrapper();
-
- await findDismissContentEditorAlertButton().trigger('click');
-
- expect(findUseNewEditorButton().exists()).toBe(false);
- });
-
- const assertOldEditorIsVisible = () => {
- expect(findContentEditor().exists()).toBe(false);
- expect(findClassicEditor().exists()).toBe(true);
- expect(findSubmitButton().props('disabled')).toBe(false);
-
- expect(wrapper.text()).not.toContain(
- "Switching will discard any changes you've made in the new editor.",
- );
- expect(wrapper.text()).not.toContain(
- "This editor is in beta and may not display the page's contents properly.",
- );
- };
-
- it('shows classic editor by default', () => {
- createWrapper({ persisted: true });
-
- assertOldEditorIsVisible();
- });
-
- describe('switch format to rdoc', () => {
- beforeEach(async () => {
- createWrapper({ persisted: true });
-
- await setFormat('rdoc');
- });
-
- it('continues to show the classic editor', assertOldEditorIsVisible);
-
- describe('switch format back to markdown', () => {
- beforeEach(async () => {
- await setFormat('markdown');
- });
-
- it(
- 'still shows the classic editor and does not automatically switch to the content editor ',
- assertOldEditorIsVisible,
- );
- });
- });
-
describe('clicking "use new editor": editor fails to load', () => {
beforeEach(async () => {
createWrapper({ mountFn: mount });
mock.onPost(/preview-markdown/).reply(400);
- await findUseNewEditorButton().trigger('click');
+ await findToggleEditingModeButton().trigger('click');
// try waiting for content editor to load (but it will never actually load)
await waitForPromises();
@@ -466,14 +389,14 @@ describe('WikiForm', () => {
expect(findSubmitButton().props('disabled')).toBe(true);
});
- describe('clicking "switch to classic editor"', () => {
+ describe('toggling editing modes to the classic editor', () => {
beforeEach(() => {
- return findSwitchToOldEditorButton().trigger('click');
+ return findToggleEditingModeButton().trigger('click');
});
- it('switches to classic editor directly without showing a modal', () => {
- expect(wrapper.findComponent(ContentEditor).exists()).toBe(false);
- expect(wrapper.findComponent(MarkdownField).exists()).toBe(true);
+ it('switches to classic editor', () => {
+ expect(findContentEditor().exists()).toBe(false);
+ expect(findClassicEditor().exists()).toBe(true);
});
});
});
@@ -484,31 +407,15 @@ describe('WikiForm', () => {
mock.onPost(/preview-markdown/).reply(200, { body: '<p>hello <strong>world</strong></p>' });
- await findUseNewEditorButton().trigger('click');
- });
-
- it('shows a tip to send feedback', () => {
- expect(wrapper.text()).toContain('Tell us your experiences with the new Markdown editor');
- });
-
- it('shows warnings that the rich text editor is in beta and may not work properly', () => {
- expect(wrapper.text()).toContain(
- "This editor is in beta and may not display the page's contents properly.",
- );
+ await findToggleEditingModeButton().trigger('click');
+ await waitForPromises();
});
it('shows the rich text editor when loading finishes', async () => {
- // wait for content editor to load
- await waitForPromises();
-
- expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(false);
- expect(wrapper.findComponent(ContentEditor).exists()).toBe(true);
+ expect(findContentEditor().exists()).toBe(true);
});
it('sends tracking event when editor loads', async () => {
- // wait for content editor to load
- await waitForPromises();
-
expect(trackingSpy).toHaveBeenCalledWith(undefined, CONTENT_EDITOR_LOADED_ACTION, {
label: WIKI_CONTENT_EDITOR_TRACKING_LABEL,
});
@@ -564,49 +471,6 @@ describe('WikiForm', () => {
expect(findContent().element.value).toBe('hello **world**');
});
});
-
- describe('clicking "switch to classic editor"', () => {
- let modal;
-
- beforeEach(async () => {
- modal = wrapper.findComponent(GlModal);
- jest.spyOn(modal.vm, 'show');
-
- findSwitchToOldEditorButton().trigger('click');
- });
-
- it('shows a modal confirming the change', () => {
- expect(modal.vm.show).toHaveBeenCalled();
- });
-
- describe('confirming "switch to classic editor" in the modal', () => {
- beforeEach(async () => {
- wrapper.vm.contentEditor.tiptapEditor.commands.setContent(
- '<p>hello __world__ from content editor</p>',
- true,
- );
-
- wrapper.findComponent(GlModal).vm.$emit('primary');
-
- await nextTick();
- });
-
- it('switches to classic editor', () => {
- expect(wrapper.findComponent(ContentEditor).exists()).toBe(false);
- expect(wrapper.findComponent(MarkdownField).exists()).toBe(true);
- });
-
- it('does not show a warning about content editor', () => {
- expect(wrapper.text()).not.toContain(
- "This editor is in beta and may not display the page's contents properly.",
- );
- });
-
- it('the classic editor retains its old value and does not use the content from the content editor', () => {
- expect(findContent().element.value).toBe(' My page content ');
- });
- });
- });
});
});
});
diff --git a/spec/frontend/pdf/page_spec.js b/spec/frontend/pdf/page_spec.js
index 4e0a6f78b63..07a7f1bb2ff 100644
--- a/spec/frontend/pdf/page_spec.js
+++ b/spec/frontend/pdf/page_spec.js
@@ -1,4 +1,4 @@
-import Vue from 'vue';
+import Vue, { nextTick } from 'vue';
import mountComponent from 'helpers/vue_mount_component_helper';
import PageComponent from '~/pdf/page/index.vue';
@@ -14,8 +14,7 @@ describe('Page component', () => {
vm.$destroy();
});
- it('renders the page when mounting', (done) => {
- const promise = Promise.resolve();
+ it('renders the page when mounting', async () => {
const testPage = {
render: jest.fn().mockReturnValue({ promise: Promise.resolve() }),
getViewport: jest.fn().mockReturnValue({}),
@@ -28,12 +27,9 @@ describe('Page component', () => {
expect(vm.rendering).toBe(true);
- promise
- .then(() => {
- expect(testPage.render).toHaveBeenCalledWith(vm.renderContext);
- expect(vm.rendering).toBe(false);
- })
- .then(done)
- .catch(done.fail);
+ await nextTick();
+
+ expect(testPage.render).toHaveBeenCalledWith(vm.renderContext);
+ expect(vm.rendering).toBe(false);
});
});
diff --git a/spec/frontend/pipeline_editor/components/drawer/pipeline_editor_drawer_spec.js b/spec/frontend/pipeline_editor/components/drawer/pipeline_editor_drawer_spec.js
index ba06f113120..33b53bf6a56 100644
--- a/spec/frontend/pipeline_editor/components/drawer/pipeline_editor_drawer_spec.js
+++ b/spec/frontend/pipeline_editor/components/drawer/pipeline_editor_drawer_spec.js
@@ -1,146 +1,27 @@
-import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import { useLocalStorageSpy } from 'helpers/local_storage_helper';
-import FirstPipelineCard from '~/pipeline_editor/components/drawer/cards/first_pipeline_card.vue';
-import GettingStartedCard from '~/pipeline_editor/components/drawer/cards/getting_started_card.vue';
-import PipelineConfigReferenceCard from '~/pipeline_editor/components/drawer/cards/pipeline_config_reference_card.vue';
-import VisualizeAndLintCard from '~/pipeline_editor/components/drawer/cards/visualize_and_lint_card.vue';
+import { GlDrawer } from '@gitlab/ui';
import PipelineEditorDrawer from '~/pipeline_editor/components/drawer/pipeline_editor_drawer.vue';
-import { DRAWER_EXPANDED_KEY } from '~/pipeline_editor/constants';
-import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
describe('Pipeline editor drawer', () => {
- useLocalStorageSpy();
-
let wrapper;
+ const findDrawer = () => wrapper.findComponent(GlDrawer);
+
const createComponent = () => {
- wrapper = shallowMount(PipelineEditorDrawer, {
- stubs: { LocalStorageSync },
- });
+ wrapper = shallowMount(PipelineEditorDrawer);
};
- const findFirstPipelineCard = () => wrapper.findComponent(FirstPipelineCard);
- const findGettingStartedCard = () => wrapper.findComponent(GettingStartedCard);
- const findPipelineConfigReferenceCard = () => wrapper.findComponent(PipelineConfigReferenceCard);
- const findToggleBtn = () => wrapper.findComponent(GlButton);
- const findVisualizeAndLintCard = () => wrapper.findComponent(VisualizeAndLintCard);
-
- const findArrowIcon = () => wrapper.find('[data-testid="toggle-icon"]');
- const findCollapseText = () => wrapper.find('[data-testid="collapse-text"]');
- const findDrawerContent = () => wrapper.find('[data-testid="drawer-content"]');
-
- const clickToggleBtn = async () => findToggleBtn().vm.$emit('click');
-
- const originalObjects = [];
-
- beforeEach(() => {
- originalObjects.push(window.gon, window.gl);
- });
-
afterEach(() => {
wrapper.destroy();
- localStorage.clear();
- [window.gon, window.gl] = originalObjects;
- });
-
- describe('default expanded state', () => {
- it('sets the drawer to be closed by default', async () => {
- createComponent();
- expect(findDrawerContent().exists()).toBe(false);
- });
- });
-
- describe('when the drawer is collapsed', () => {
- beforeEach(async () => {
- createComponent();
- });
-
- it('shows the left facing arrow icon', () => {
- expect(findArrowIcon().props('name')).toBe('chevron-double-lg-left');
- });
-
- it('does not show the collapse text', () => {
- expect(findCollapseText().exists()).toBe(false);
- });
-
- it('does not show the drawer content', () => {
- expect(findDrawerContent().exists()).toBe(false);
- });
-
- it('can open the drawer by clicking on the toggle button', async () => {
- expect(findDrawerContent().exists()).toBe(false);
-
- await clickToggleBtn();
-
- expect(findDrawerContent().exists()).toBe(true);
- });
- });
-
- describe('when the drawer is expanded', () => {
- beforeEach(async () => {
- createComponent();
- await clickToggleBtn();
- });
-
- it('shows the right facing arrow icon', () => {
- expect(findArrowIcon().props('name')).toBe('chevron-double-lg-right');
- });
-
- it('shows the collapse text', () => {
- expect(findCollapseText().exists()).toBe(true);
- });
-
- it('shows the drawer content', () => {
- expect(findDrawerContent().exists()).toBe(true);
- });
-
- it('shows all the introduction cards', () => {
- expect(findFirstPipelineCard().exists()).toBe(true);
- expect(findGettingStartedCard().exists()).toBe(true);
- expect(findPipelineConfigReferenceCard().exists()).toBe(true);
- expect(findVisualizeAndLintCard().exists()).toBe(true);
- });
-
- it('can close the drawer by clicking on the toggle button', async () => {
- expect(findDrawerContent().exists()).toBe(true);
-
- await clickToggleBtn();
-
- expect(findDrawerContent().exists()).toBe(false);
- });
});
- describe('local storage', () => {
- it('saves the drawer expanded value to local storage', async () => {
- localStorage.setItem(DRAWER_EXPANDED_KEY, 'false');
-
- createComponent();
- await clickToggleBtn();
-
- expect(localStorage.setItem.mock.calls).toEqual([
- [DRAWER_EXPANDED_KEY, 'false'],
- [DRAWER_EXPANDED_KEY, 'true'],
- ]);
- });
-
- it('loads the drawer collapsed when local storage is set to `false`, ', async () => {
- localStorage.setItem(DRAWER_EXPANDED_KEY, false);
- createComponent();
-
- await nextTick();
-
- expect(findDrawerContent().exists()).toBe(false);
- });
+ it('emits close event when closing the drawer', () => {
+ createComponent();
- it('loads the drawer expanded when local storage is set to `true`, ', async () => {
- localStorage.setItem(DRAWER_EXPANDED_KEY, true);
- createComponent();
+ expect(wrapper.emitted('close-drawer')).toBeUndefined();
- await nextTick();
+ findDrawer().vm.$emit('close');
- expect(findDrawerContent().exists()).toBe(true);
- });
+ expect(wrapper.emitted('close-drawer')).toHaveLength(1);
});
});
diff --git a/spec/frontend/pipeline_editor/components/editor/ci_editor_header_spec.js b/spec/frontend/pipeline_editor/components/editor/ci_editor_header_spec.js
index 3ee53d4a055..8f50325295e 100644
--- a/spec/frontend/pipeline_editor/components/editor/ci_editor_header_spec.js
+++ b/spec/frontend/pipeline_editor/components/editor/ci_editor_header_spec.js
@@ -1,5 +1,5 @@
-import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import CiEditorHeader from '~/pipeline_editor/components/editor/ci_editor_header.vue';
import {
@@ -11,11 +11,18 @@ describe('CI Editor Header', () => {
let wrapper;
let trackingSpy = null;
- const createComponent = () => {
- wrapper = shallowMount(CiEditorHeader, {});
+ const createComponent = ({ showDrawer = false } = {}) => {
+ wrapper = extendedWrapper(
+ shallowMount(CiEditorHeader, {
+ propsData: {
+ showDrawer,
+ },
+ }),
+ );
};
- const findLinkBtn = () => wrapper.findComponent(GlButton);
+ const findLinkBtn = () => wrapper.findByTestId('template-repo-link');
+ const findHelpBtn = () => wrapper.findByTestId('drawer-toggle');
afterEach(() => {
wrapper.destroy();
@@ -50,4 +57,42 @@ describe('CI Editor Header', () => {
});
});
});
+
+ describe('help button', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('finds the help button', () => {
+ expect(findHelpBtn().exists()).toBe(true);
+ });
+
+ it('has the information-o icon', () => {
+ expect(findHelpBtn().props('icon')).toBe('information-o');
+ });
+
+ describe('when pipeline editor drawer is closed', () => {
+ it('emits open drawer event when clicked', () => {
+ createComponent({ showDrawer: false });
+
+ expect(wrapper.emitted('open-drawer')).toBeUndefined();
+
+ findHelpBtn().vm.$emit('click');
+
+ expect(wrapper.emitted('open-drawer')).toHaveLength(1);
+ });
+ });
+
+ describe('when pipeline editor drawer is open', () => {
+ it('emits close drawer event when clicked', () => {
+ createComponent({ showDrawer: true });
+
+ expect(wrapper.emitted('close-drawer')).toBeUndefined();
+
+ findHelpBtn().vm.$emit('click');
+
+ expect(wrapper.emitted('close-drawer')).toHaveLength(1);
+ });
+ });
+ });
});
diff --git a/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js b/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js
index fee52db9b64..6dffb7e5470 100644
--- a/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js
+++ b/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js
@@ -40,6 +40,7 @@ describe('Pipeline editor tabs component', () => {
ciConfigData: mockLintResponse,
ciFileContent: mockCiYml,
isNewCiConfigFile: true,
+ showDrawer: false,
...props,
},
data() {
diff --git a/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js b/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js
index 6f969546171..98e2c17967c 100644
--- a/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js
+++ b/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js
@@ -1,6 +1,8 @@
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
-import { GlModal } from '@gitlab/ui';
+import { GlButton, GlDrawer, GlModal } from '@gitlab/ui';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import CiEditorHeader from '~/pipeline_editor/components/editor/ci_editor_header.vue';
import CommitSection from '~/pipeline_editor/components/commit/commit_section.vue';
import PipelineEditorDrawer from '~/pipeline_editor/components/drawer/pipeline_editor_drawer.vue';
import PipelineEditorFileNav from '~/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue';
@@ -18,24 +20,26 @@ describe('Pipeline editor home wrapper', () => {
let wrapper;
const createComponent = ({ props = {}, glFeatures = {}, data = {}, stubs = {} } = {}) => {
- wrapper = shallowMount(PipelineEditorHome, {
- data: () => data,
- propsData: {
- ciConfigData: mockLintResponse,
- ciFileContent: mockCiYml,
- isCiConfigDataLoading: false,
- isNewCiConfigFile: false,
- ...props,
- },
- provide: {
- projectFullPath: '',
- totalBranches: 19,
- glFeatures: {
- ...glFeatures,
+ wrapper = extendedWrapper(
+ shallowMount(PipelineEditorHome, {
+ data: () => data,
+ propsData: {
+ ciConfigData: mockLintResponse,
+ ciFileContent: mockCiYml,
+ isCiConfigDataLoading: false,
+ isNewCiConfigFile: false,
+ ...props,
},
- },
- stubs,
- });
+ provide: {
+ projectFullPath: '',
+ totalBranches: 19,
+ glFeatures: {
+ ...glFeatures,
+ },
+ },
+ stubs,
+ }),
+ );
};
const findBranchSwitcher = () => wrapper.findComponent(BranchSwitcher);
@@ -45,6 +49,7 @@ describe('Pipeline editor home wrapper', () => {
const findPipelineEditorDrawer = () => wrapper.findComponent(PipelineEditorDrawer);
const findPipelineEditorHeader = () => wrapper.findComponent(PipelineEditorHeader);
const findPipelineEditorTabs = () => wrapper.findComponent(PipelineEditorTabs);
+ const findHelpBtn = () => wrapper.findByTestId('drawer-toggle');
afterEach(() => {
wrapper.destroy();
@@ -70,10 +75,6 @@ describe('Pipeline editor home wrapper', () => {
it('shows the commit section by default', () => {
expect(findCommitSection().exists()).toBe(true);
});
-
- it('show the pipeline drawer', () => {
- expect(findPipelineEditorDrawer().exists()).toBe(true);
- });
});
describe('modal when switching branch', () => {
@@ -175,4 +176,58 @@ describe('Pipeline editor home wrapper', () => {
});
});
});
+
+ describe('help drawer', () => {
+ const clickHelpBtn = async () => {
+ findHelpBtn().vm.$emit('click');
+ await nextTick();
+ };
+
+ it('hides the drawer by default', () => {
+ createComponent();
+
+ expect(findPipelineEditorDrawer().props('isVisible')).toBe(false);
+ });
+
+ it('toggles the drawer on button click', async () => {
+ createComponent({
+ stubs: {
+ CiEditorHeader,
+ GlButton,
+ GlDrawer,
+ PipelineEditorTabs,
+ PipelineEditorDrawer,
+ },
+ });
+
+ await clickHelpBtn();
+
+ expect(findPipelineEditorDrawer().props('isVisible')).toBe(true);
+
+ await clickHelpBtn();
+
+ expect(findPipelineEditorDrawer().props('isVisible')).toBe(false);
+ });
+
+ it("closes the drawer through the drawer's close button", async () => {
+ createComponent({
+ stubs: {
+ CiEditorHeader,
+ GlButton,
+ GlDrawer,
+ PipelineEditorTabs,
+ PipelineEditorDrawer,
+ },
+ });
+
+ await clickHelpBtn();
+
+ expect(findPipelineEditorDrawer().props('isVisible')).toBe(true);
+
+ findPipelineEditorDrawer().find(GlDrawer).vm.$emit('close');
+ await nextTick();
+
+ expect(findPipelineEditorDrawer().props('isVisible')).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/pipeline_wizard/components/wrapper_spec.js b/spec/frontend/pipeline_wizard/components/wrapper_spec.js
index bd1679baf48..357a9d21723 100644
--- a/spec/frontend/pipeline_wizard/components/wrapper_spec.js
+++ b/spec/frontend/pipeline_wizard/components/wrapper_spec.js
@@ -1,21 +1,26 @@
import { Document, parseDocument } from 'yaml';
import { GlProgressBar } from '@gitlab/ui';
import { nextTick } from 'vue';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
import PipelineWizardWrapper, { i18n } from '~/pipeline_wizard/components/wrapper.vue';
import WizardStep from '~/pipeline_wizard/components/step.vue';
import CommitStep from '~/pipeline_wizard/components/commit.vue';
import YamlEditor from '~/pipeline_wizard/components/editor.vue';
import { sprintf } from '~/locale';
-import { steps as stepsYaml } from '../mock/yaml';
+import {
+ steps as stepsYaml,
+ compiledScenario1,
+ compiledScenario2,
+ compiledScenario3,
+} from '../mock/yaml';
describe('Pipeline Wizard - wrapper.vue', () => {
let wrapper;
const steps = parseDocument(stepsYaml).toJS();
const getAsYamlNode = (value) => new Document(value).contents;
- const createComponent = (props = {}) => {
- wrapper = shallowMountExtended(PipelineWizardWrapper, {
+ const createComponent = (props = {}, mountFn = shallowMountExtended) => {
+ wrapper = mountFn(PipelineWizardWrapper, {
propsData: {
projectPath: '/user/repo',
defaultBranch: 'main',
@@ -23,13 +28,21 @@ describe('Pipeline Wizard - wrapper.vue', () => {
steps: getAsYamlNode(steps),
...props,
},
+ stubs: {
+ CommitStep: true,
+ },
});
};
const getEditorContent = () => {
- return wrapper.getComponent(YamlEditor).attributes().doc.toString();
+ return wrapper.getComponent(YamlEditor).props().doc.toString();
};
- const getStepWrapper = () => wrapper.getComponent(WizardStep);
+ const getStepWrapper = () =>
+ wrapper.findAllComponents(WizardStep).wrappers.find((w) => w.isVisible());
const getGlProgressBarWrapper = () => wrapper.getComponent(GlProgressBar);
+ const findFirstVisibleStep = () =>
+ wrapper.findAllComponents('[data-testid="step"]').wrappers.find((w) => w.isVisible());
+ const findFirstInputFieldForTarget = (target) =>
+ wrapper.find(`[data-input-target="${target}"]`).find('input');
describe('display', () => {
afterEach(() => {
@@ -118,8 +131,9 @@ describe('Pipeline Wizard - wrapper.vue', () => {
}) => {
beforeAll(async () => {
createComponent();
+
for (const emittedValue of navigationEventChain) {
- wrapper.findComponent({ ref: 'step' }).vm.$emit(emittedValue);
+ findFirstVisibleStep().vm.$emit(emittedValue);
// We have to wait for the next step to be mounted
// before we can emit the next event, so we have to await
// inside the loop.
@@ -134,11 +148,11 @@ describe('Pipeline Wizard - wrapper.vue', () => {
if (expectCommitStepShown) {
it('does not show the step wrapper', async () => {
- expect(wrapper.findComponent(WizardStep).exists()).toBe(false);
+ expect(wrapper.findComponent(WizardStep).isVisible()).toBe(false);
});
it('shows the commit step page', () => {
- expect(wrapper.findComponent(CommitStep).exists()).toBe(true);
+ expect(wrapper.findComponent(CommitStep).isVisible()).toBe(true);
});
} else {
it('passes the correct step config to the step component', async () => {
@@ -146,7 +160,7 @@ describe('Pipeline Wizard - wrapper.vue', () => {
});
it('does not show the commit step page', () => {
- expect(wrapper.findComponent(CommitStep).exists()).toBe(false);
+ expect(wrapper.findComponent(CommitStep).isVisible()).toBe(false);
});
}
@@ -247,4 +261,54 @@ describe('Pipeline Wizard - wrapper.vue', () => {
expect(wrapper.getComponent(YamlEditor).props('highlight')).toBe(null);
});
});
+
+ describe('integration test', () => {
+ beforeAll(async () => {
+ createComponent({}, mountExtended);
+ });
+
+ it('updates the editor content after input on step 1', async () => {
+ findFirstInputFieldForTarget('$FOO').setValue('fooVal');
+ await nextTick();
+
+ expect(getEditorContent()).toBe(compiledScenario1);
+ });
+
+ it('updates the editor content after input on step 2', async () => {
+ findFirstVisibleStep().vm.$emit('next');
+ await nextTick();
+
+ findFirstInputFieldForTarget('$BAR').setValue('barVal');
+ await nextTick();
+
+ expect(getEditorContent()).toBe(compiledScenario2);
+ });
+
+ describe('navigating back', () => {
+ let inputField;
+
+ beforeAll(async () => {
+ findFirstVisibleStep().vm.$emit('back');
+ await nextTick();
+
+ inputField = findFirstInputFieldForTarget('$FOO');
+ });
+
+ afterAll(() => {
+ wrapper.destroy();
+ inputField = undefined;
+ });
+
+ it('still shows the input values from the former visit', () => {
+ expect(inputField.element.value).toBe('fooVal');
+ });
+
+ it('updates the editor content without modifying input that came from a later step', async () => {
+ inputField.setValue('newFooVal');
+ await nextTick();
+
+ expect(getEditorContent()).toBe(compiledScenario3);
+ });
+ });
+ });
});
diff --git a/spec/frontend/pipeline_wizard/mock/yaml.js b/spec/frontend/pipeline_wizard/mock/yaml.js
index 5eaeaa32a8c..e7087b59ce7 100644
--- a/spec/frontend/pipeline_wizard/mock/yaml.js
+++ b/spec/frontend/pipeline_wizard/mock/yaml.js
@@ -59,6 +59,17 @@ export const steps = `
bar: $BAR
`;
+export const compiledScenario1 = `foo: fooVal
+`;
+
+export const compiledScenario2 = `foo: fooVal
+bar: barVal
+`;
+
+export const compiledScenario3 = `foo: newFooVal
+bar: barVal
+`;
+
export const fullTemplate = `
title: some title
description: some description
diff --git a/spec/frontend/pipelines/components/pipeline_tabs_spec.js b/spec/frontend/pipelines/components/pipeline_tabs_spec.js
new file mode 100644
index 00000000000..e18c3edbad9
--- /dev/null
+++ b/spec/frontend/pipelines/components/pipeline_tabs_spec.js
@@ -0,0 +1,61 @@
+import { shallowMount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import PipelineTabs from '~/pipelines/components/pipeline_tabs.vue';
+import PipelineGraphWrapper from '~/pipelines/components/graph/graph_component_wrapper.vue';
+import Dag from '~/pipelines/components/dag/dag.vue';
+import JobsApp from '~/pipelines/components/jobs/jobs_app.vue';
+import TestReports from '~/pipelines/components/test_reports/test_reports.vue';
+
+describe('The Pipeline Tabs', () => {
+ let wrapper;
+
+ const findDagTab = () => wrapper.findByTestId('dag-tab');
+ const findFailedJobsTab = () => wrapper.findByTestId('failed-jobs-tab');
+ const findJobsTab = () => wrapper.findByTestId('jobs-tab');
+ const findPipelineTab = () => wrapper.findByTestId('pipeline-tab');
+ const findTestsTab = () => wrapper.findByTestId('tests-tab');
+
+ const findDagApp = () => wrapper.findComponent(Dag);
+ const findFailedJobsApp = () => wrapper.findComponent(JobsApp);
+ const findJobsApp = () => wrapper.findComponent(JobsApp);
+ const findPipelineApp = () => wrapper.findComponent(PipelineGraphWrapper);
+ const findTestsApp = () => wrapper.findComponent(TestReports);
+
+ const createComponent = (propsData = {}) => {
+ wrapper = extendedWrapper(
+ shallowMount(PipelineTabs, {
+ propsData,
+ stubs: {
+ Dag: { template: '<div id="dag"/>' },
+ JobsApp: { template: '<div class="jobs" />' },
+ PipelineGraph: { template: '<div id="graph" />' },
+ TestReports: { template: '<div id="tests" />' },
+ },
+ }),
+ );
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ // The failed jobs MUST be removed from here and tested individually once
+ // the logic for the tab is implemented.
+ describe('Tabs', () => {
+ it.each`
+ tabName | tabComponent | appComponent
+ ${'Pipeline'} | ${findPipelineTab} | ${findPipelineApp}
+ ${'Dag'} | ${findDagTab} | ${findDagApp}
+ ${'Jobs'} | ${findJobsTab} | ${findJobsApp}
+ ${'Failed Jobs'} | ${findFailedJobsTab} | ${findFailedJobsApp}
+ ${'Tests'} | ${findTestsTab} | ${findTestsApp}
+ `('shows $tabName tab and its associated component', ({ appComponent, tabComponent }) => {
+ expect(tabComponent().exists()).toBe(true);
+ expect(appComponent().exists()).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/pipelines/components/pipelines_filtered_search_spec.js b/spec/frontend/pipelines/components/pipelines_filtered_search_spec.js
index 0822b293f75..6c743f92116 100644
--- a/spec/frontend/pipelines/components/pipelines_filtered_search_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_filtered_search_spec.js
@@ -173,7 +173,7 @@ describe('Pipelines filtered search', () => {
{ type: 'filtered-search-term', value: { data: '' } },
];
- expect(findFilteredSearch().props('value')).toEqual(expectedValueProp);
+ expect(findFilteredSearch().props('value')).toMatchObject(expectedValueProp);
expect(findFilteredSearch().props('value')).toHaveLength(expectedValueProp.length);
});
});
diff --git a/spec/frontend/pipelines/empty_state/ci_templates_spec.js b/spec/frontend/pipelines/empty_state/ci_templates_spec.js
new file mode 100644
index 00000000000..606fdc9cac1
--- /dev/null
+++ b/spec/frontend/pipelines/empty_state/ci_templates_spec.js
@@ -0,0 +1,85 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
+import CiTemplates from '~/pipelines/components/pipelines_list/empty_state/ci_templates.vue';
+
+const pipelineEditorPath = '/-/ci/editor';
+const suggestedCiTemplates = [
+ { name: 'Android', logo: '/assets/illustrations/logos/android.svg' },
+ { name: 'Bash', logo: '/assets/illustrations/logos/bash.svg' },
+ { name: 'C++', logo: '/assets/illustrations/logos/c_plus_plus.svg' },
+];
+
+describe('CI Templates', () => {
+ let wrapper;
+ let trackingSpy;
+
+ const createWrapper = () => {
+ return shallowMountExtended(CiTemplates, {
+ provide: {
+ pipelineEditorPath,
+ suggestedCiTemplates,
+ },
+ });
+ };
+
+ const findTemplateDescription = () => wrapper.findByTestId('template-description');
+ const findTemplateLink = () => wrapper.findByTestId('template-link');
+ const findTemplateName = () => wrapper.findByTestId('template-name');
+ const findTemplateLogo = () => wrapper.findByTestId('template-logo');
+
+ beforeEach(() => {
+ wrapper = createWrapper();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('renders template list', () => {
+ it('renders all suggested templates', () => {
+ const content = wrapper.text();
+
+ expect(content).toContain('Android', 'Bash', 'C++');
+ });
+
+ it('has the correct template name', () => {
+ expect(findTemplateName().text()).toBe('Android');
+ });
+
+ it('links to the correct template', () => {
+ expect(findTemplateLink().attributes('href')).toBe(
+ pipelineEditorPath.concat('?template=Android'),
+ );
+ });
+
+ it('has the description of the template', () => {
+ expect(findTemplateDescription().text()).toBe(
+ 'CI/CD template to test and deploy your Android project.',
+ );
+ });
+
+ it('has the right logo of the template', () => {
+ expect(findTemplateLogo().attributes('src')).toBe('/assets/illustrations/logos/android.svg');
+ });
+ });
+
+ describe('tracking', () => {
+ beforeEach(() => {
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ afterEach(() => {
+ unmockTracking();
+ });
+
+ it('sends an event when template is clicked', () => {
+ findTemplateLink().vm.$emit('click');
+
+ expect(trackingSpy).toHaveBeenCalledTimes(1);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
+ label: 'Android',
+ });
+ });
+ });
+});
diff --git a/spec/frontend/pipelines/empty_state/pipelines_ci_templates_spec.js b/spec/frontend/pipelines/empty_state/pipelines_ci_templates_spec.js
new file mode 100644
index 00000000000..14860f20317
--- /dev/null
+++ b/spec/frontend/pipelines/empty_state/pipelines_ci_templates_spec.js
@@ -0,0 +1,158 @@
+import '~/commons';
+import { GlButton, GlSprintf } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
+import { stubExperiments } from 'helpers/experimentation_helper';
+import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
+import ExperimentTracking from '~/experimentation/experiment_tracking';
+import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue';
+import CiTemplates from '~/pipelines/components/pipelines_list/empty_state/ci_templates.vue';
+import {
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
+ RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
+ RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
+ I18N,
+} from '~/pipeline_editor/constants';
+
+const pipelineEditorPath = '/-/ci/editor';
+
+jest.mock('~/experimentation/experiment_tracking');
+
+describe('Pipelines CI Templates', () => {
+ let wrapper;
+ let trackingSpy;
+
+ const createWrapper = (propsData = {}, stubs = {}) => {
+ return shallowMountExtended(PipelinesCiTemplates, {
+ provide: {
+ pipelineEditorPath,
+ },
+ propsData,
+ stubs,
+ });
+ };
+
+ const findTestTemplateLink = () => wrapper.findByTestId('test-template-link');
+ const findCiTemplates = () => wrapper.findComponent(CiTemplates);
+ const findSettingsLink = () => wrapper.findByTestId('settings-link');
+ const findDocumentationLink = () => wrapper.findByTestId('documentation-link');
+ const findSettingsButton = () => wrapper.findByTestId('settings-button');
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('renders test template', () => {
+ beforeEach(() => {
+ wrapper = createWrapper();
+ });
+
+ it('links to the getting started template', () => {
+ expect(findTestTemplateLink().attributes('href')).toBe(
+ pipelineEditorPath.concat('?template=Getting-Started'),
+ );
+ });
+ });
+
+ describe('tracking', () => {
+ beforeEach(() => {
+ wrapper = createWrapper();
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ afterEach(() => {
+ unmockTracking();
+ });
+
+ it('sends an event when Getting-Started template is clicked', () => {
+ findTestTemplateLink().vm.$emit('click');
+
+ expect(trackingSpy).toHaveBeenCalledTimes(1);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
+ label: 'Getting-Started',
+ });
+ });
+ });
+
+ describe('when the runners_availability_section experiment is active', () => {
+ beforeEach(() => {
+ stubExperiments({ runners_availability_section: 'candidate' });
+ });
+
+ describe('when runners are available', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({ anyRunnersAvailable: true }, { GitlabExperiment, GlSprintf });
+ });
+
+ it('show the runners available section', () => {
+ expect(wrapper.text()).toContain(I18N.runners.title);
+ });
+
+ it('tracks an event when clicking the settings link', () => {
+ findSettingsLink().vm.$emit('click');
+
+ expect(ExperimentTracking).toHaveBeenCalledWith(
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ );
+ expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
+ RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
+ );
+ });
+
+ it('tracks an event when clicking the documentation link', () => {
+ findDocumentationLink().vm.$emit('click');
+
+ expect(ExperimentTracking).toHaveBeenCalledWith(
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ );
+ expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
+ RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
+ );
+ });
+ });
+
+ describe('when runners are not available', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({ anyRunnersAvailable: false }, { GitlabExperiment, GlButton });
+ });
+
+ it('show the no runners available section', () => {
+ expect(wrapper.text()).toContain(I18N.noRunners.title);
+ });
+
+ it('tracks an event when clicking the settings button', () => {
+ findSettingsButton().trigger('click');
+
+ expect(ExperimentTracking).toHaveBeenCalledWith(
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ );
+ expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
+ RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
+ );
+ });
+ });
+ });
+
+ describe.each`
+ experimentVariant | anyRunnersAvailable | templatesRendered
+ ${'control'} | ${true} | ${true}
+ ${'control'} | ${false} | ${true}
+ ${'candidate'} | ${true} | ${true}
+ ${'candidate'} | ${false} | ${false}
+ `(
+ 'when the runners_availability_section experiment variant is $experimentVariant and runners are available: $anyRunnersAvailable',
+ ({ experimentVariant, anyRunnersAvailable, templatesRendered }) => {
+ beforeEach(() => {
+ stubExperiments({ runners_availability_section: experimentVariant });
+ wrapper = createWrapper({ anyRunnersAvailable });
+ });
+
+ it(`renders the templates: ${templatesRendered}`, () => {
+ expect(findTestTemplateLink().exists()).toBe(templatesRendered);
+ expect(findCiTemplates().exists()).toBe(templatesRendered);
+ });
+ },
+ );
+});
diff --git a/spec/frontend/pipelines/empty_state_spec.js b/spec/frontend/pipelines/empty_state_spec.js
index 31b74a06efd..46dad4a035c 100644
--- a/spec/frontend/pipelines/empty_state_spec.js
+++ b/spec/frontend/pipelines/empty_state_spec.js
@@ -1,7 +1,7 @@
import '~/commons';
import { mount } from '@vue/test-utils';
import EmptyState from '~/pipelines/components/pipelines_list/empty_state.vue';
-import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/pipelines_ci_templates.vue';
+import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue';
describe('Pipelines Empty State', () => {
let wrapper;
diff --git a/spec/frontend/pipelines/graph/action_component_spec.js b/spec/frontend/pipelines/graph/action_component_spec.js
index fab6e6887b7..6e5aa572ec0 100644
--- a/spec/frontend/pipelines/graph/action_component_spec.js
+++ b/spec/frontend/pipelines/graph/action_component_spec.js
@@ -48,17 +48,14 @@ describe('pipeline graph action component', () => {
});
describe('on click', () => {
- it('emits `pipelineActionRequestComplete` after a successful request', (done) => {
+ it('emits `pipelineActionRequestComplete` after a successful request', async () => {
jest.spyOn(wrapper.vm, '$emit');
findButton().trigger('click');
- waitForPromises()
- .then(() => {
- expect(wrapper.vm.$emit).toHaveBeenCalledWith('pipelineActionRequestComplete');
- done();
- })
- .catch(done.fail);
+ await waitForPromises();
+
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('pipelineActionRequestComplete');
});
it('renders a loading icon while waiting for request', async () => {
diff --git a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
index 8bc6c086b9d..cb7073fb5f5 100644
--- a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
@@ -30,6 +30,7 @@ import LinksLayer from '~/pipelines/components/graph_shared/links_layer.vue';
import * as parsingUtils from '~/pipelines/components/parsing_utils';
import getPipelineHeaderData from '~/pipelines/graphql/queries/get_pipeline_header_data.query.graphql';
import * as sentryUtils from '~/pipelines/utils';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import { mockRunningPipelineHeaderData } from '../mock_data';
import { mapCallouts, mockCalloutsResponse, mockPipelineResponse } from './mock_data';
@@ -55,6 +56,7 @@ describe('Pipeline graph wrapper', () => {
wrapper.find(StageColumnComponent).findAll('[data-testid="stage-column-group"]');
const getViewSelector = () => wrapper.find(GraphViewSelector);
const getViewSelectorTrip = () => getViewSelector().findComponent(GlAlert);
+ const getLocalStorageSync = () => wrapper.findComponent(LocalStorageSync);
const createComponent = ({
apolloProvider,
@@ -376,6 +378,10 @@ describe('Pipeline graph wrapper', () => {
localStorage.clear();
});
+ it('sets the asString prop on the LocalStorageSync component', () => {
+ expect(getLocalStorageSync().props('asString')).toBe(true);
+ });
+
it('reads the view type from localStorage when available', () => {
const viewSelectorNeedsSegment = wrapper
.find(GlButtonGroup)
diff --git a/spec/frontend/pipelines/pipeline_triggerer_spec.js b/spec/frontend/pipelines/pipeline_triggerer_spec.js
index 701b1691c7b..58bfb68e85c 100644
--- a/spec/frontend/pipelines/pipeline_triggerer_spec.js
+++ b/spec/frontend/pipelines/pipeline_triggerer_spec.js
@@ -1,17 +1,11 @@
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
+import { GlAvatar, GlAvatarLink } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import pipelineTriggerer from '~/pipelines/components/pipelines_list/pipeline_triggerer.vue';
-import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
describe('Pipelines Triggerer', () => {
let wrapper;
- const expectComponentWithProps = (Component, props = {}) => {
- const componentWrapper = wrapper.find(Component);
- expect(componentWrapper.isVisible()).toBe(true);
- expect(componentWrapper.props()).toEqual(expect.objectContaining(props));
- };
-
const mockData = {
pipeline: {
user: {
@@ -22,40 +16,65 @@ describe('Pipelines Triggerer', () => {
},
};
- const createComponent = () => {
- wrapper = shallowMount(pipelineTriggerer, {
- propsData: mockData,
+ const createComponent = (props) => {
+ wrapper = shallowMountExtended(pipelineTriggerer, {
+ propsData: {
+ ...props,
+ },
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
});
};
- beforeEach(() => {
- createComponent();
- });
-
afterEach(() => {
wrapper.destroy();
});
- it('should render pipeline triggerer table cell', () => {
- expect(wrapper.find('[data-testid="pipeline-triggerer"]').exists()).toBe(true);
- });
+ const findAvatarLink = () => wrapper.findComponent(GlAvatarLink);
+ const findAvatar = () => wrapper.findComponent(GlAvatar);
+ const findTriggerer = () => wrapper.findByText('API');
+
+ describe('when user was a triggerer', () => {
+ beforeEach(() => {
+ createComponent(mockData);
+ });
+
+ it('should render pipeline triggerer table cell', () => {
+ expect(wrapper.find('[data-testid="pipeline-triggerer"]').exists()).toBe(true);
+ });
+
+ it('should render only user avatar', () => {
+ expect(findAvatarLink().exists()).toBe(true);
+ expect(findTriggerer().exists()).toBe(false);
+ });
+
+ it('should set correct props on avatar link component', () => {
+ expect(findAvatarLink().attributes()).toMatchObject({
+ title: mockData.pipeline.user.name,
+ href: mockData.pipeline.user.path,
+ });
+ });
- it('should pass triggerer information when triggerer is provided', () => {
- expectComponentWithProps(UserAvatarLink, {
- linkHref: mockData.pipeline.user.path,
- tooltipText: mockData.pipeline.user.name,
- imgSrc: mockData.pipeline.user.avatar_url,
+ it('should add tooltip to avatar link', () => {
+ const tooltip = getBinding(findAvatarLink().element, 'gl-tooltip');
+
+ expect(tooltip).toBeDefined();
+ });
+
+ it('should set correct props on avatar component', () => {
+ expect(findAvatar().attributes().src).toBe(mockData.pipeline.user.avatar_url);
});
});
- it('should render "API" when no triggerer is provided', async () => {
- wrapper.setProps({
- pipeline: {
- user: null,
- },
+ describe('when API was a triggerer', () => {
+ beforeEach(() => {
+ createComponent({ pipeline: {} });
});
- await nextTick();
- expect(wrapper.find('.js-pipeline-url-api').text()).toEqual('API');
+ it('should render label only', () => {
+ expect(findAvatarLink().exists()).toBe(false);
+ expect(findTriggerer().exists()).toBe(true);
+ });
});
});
diff --git a/spec/frontend/pipelines/pipeline_url_spec.js b/spec/frontend/pipelines/pipeline_url_spec.js
index 2a0aeed917c..c6104a13216 100644
--- a/spec/frontend/pipelines/pipeline_url_spec.js
+++ b/spec/frontend/pipelines/pipeline_url_spec.js
@@ -1,5 +1,6 @@
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import PipelineUrlComponent from '~/pipelines/components/pipelines_list/pipeline_url.vue';
+import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import { mockPipeline, mockPipelineBranch, mockPipelineTag } from './mock_data';
const projectPath = 'test/test';
@@ -57,6 +58,30 @@ describe('Pipeline Url Component', () => {
expect(findCommitShortSha().exists()).toBe(true);
});
+ describe('commit user avatar', () => {
+ it('renders when commit author exists', () => {
+ const pipelineBranch = mockPipelineBranch();
+ const { avatar_url, name, path } = pipelineBranch.pipeline.commit.author;
+ createComponent(pipelineBranch);
+
+ const component = wrapper.findComponent(UserAvatarLink);
+ expect(component.exists()).toBe(true);
+ expect(component.props()).toMatchObject({
+ imgSize: 16,
+ imgSrc: avatar_url,
+ imgAlt: name,
+ linkHref: path,
+ tooltipText: name,
+ });
+ });
+
+ it('does not render when commit author does not exist', () => {
+ createComponent();
+
+ expect(wrapper.findComponent(UserAvatarLink).exists()).toBe(false);
+ });
+ });
+
it('should render commit icon tooltip', () => {
createComponent({}, true);
diff --git a/spec/frontend/pipelines/pipelines_ci_templates_spec.js b/spec/frontend/pipelines/pipelines_ci_templates_spec.js
deleted file mode 100644
index 7064f7448ec..00000000000
--- a/spec/frontend/pipelines/pipelines_ci_templates_spec.js
+++ /dev/null
@@ -1,206 +0,0 @@
-import '~/commons';
-import { GlButton, GlSprintf } from '@gitlab/ui';
-import { sprintf } from '~/locale';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { mockTracking } from 'helpers/tracking_helper';
-import { stubExperiments } from 'helpers/experimentation_helper';
-import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
-import ExperimentTracking from '~/experimentation/experiment_tracking';
-import PipelinesCiTemplate from '~/pipelines/components/pipelines_list/pipelines_ci_templates.vue';
-import {
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
- RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
- RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
- I18N,
-} from '~/pipeline_editor/constants';
-
-const pipelineEditorPath = '/-/ci/editor';
-const suggestedCiTemplates = [
- { name: 'Android', logo: '/assets/illustrations/logos/android.svg' },
- { name: 'Bash', logo: '/assets/illustrations/logos/bash.svg' },
- { name: 'C++', logo: '/assets/illustrations/logos/c_plus_plus.svg' },
-];
-
-jest.mock('~/experimentation/experiment_tracking');
-
-describe('Pipelines CI Templates', () => {
- let wrapper;
- let trackingSpy;
-
- const createWrapper = (propsData = {}, stubs = {}) => {
- return shallowMountExtended(PipelinesCiTemplate, {
- provide: {
- pipelineEditorPath,
- suggestedCiTemplates,
- },
- propsData,
- stubs,
- });
- };
-
- const findTestTemplateLinks = () => wrapper.findAll('[data-testid="test-template-link"]');
- const findTemplateDescriptions = () => wrapper.findAll('[data-testid="template-description"]');
- const findTemplateLinks = () => wrapper.findAll('[data-testid="template-link"]');
- const findTemplateNames = () => wrapper.findAll('[data-testid="template-name"]');
- const findTemplateLogos = () => wrapper.findAll('[data-testid="template-logo"]');
- const findSettingsLink = () => wrapper.findByTestId('settings-link');
- const findDocumentationLink = () => wrapper.findByTestId('documentation-link');
- const findSettingsButton = () => wrapper.findByTestId('settings-button');
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('renders test template', () => {
- beforeEach(() => {
- wrapper = createWrapper();
- });
-
- it('links to the getting started template', () => {
- expect(findTestTemplateLinks().at(0).attributes('href')).toBe(
- pipelineEditorPath.concat('?template=Getting-Started'),
- );
- });
- });
-
- describe('renders template list', () => {
- beforeEach(() => {
- wrapper = createWrapper();
- });
-
- it('renders all suggested templates', () => {
- const content = wrapper.text();
-
- expect(content).toContain('Android', 'Bash', 'C++');
- });
-
- it('has the correct template name', () => {
- expect(findTemplateNames().at(0).text()).toBe('Android');
- });
-
- it('links to the correct template', () => {
- expect(findTemplateLinks().at(0).attributes('href')).toBe(
- pipelineEditorPath.concat('?template=Android'),
- );
- });
-
- it('has the description of the template', () => {
- expect(findTemplateDescriptions().at(0).text()).toBe(
- sprintf(I18N.templates.description, { name: 'Android' }),
- );
- });
-
- it('has the right logo of the template', () => {
- expect(findTemplateLogos().at(0).attributes('src')).toBe(
- '/assets/illustrations/logos/android.svg',
- );
- });
- });
-
- describe('tracking', () => {
- beforeEach(() => {
- wrapper = createWrapper();
- trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
- });
-
- it('sends an event when template is clicked', () => {
- findTemplateLinks().at(0).vm.$emit('click');
-
- expect(trackingSpy).toHaveBeenCalledTimes(1);
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
- label: 'Android',
- });
- });
-
- it('sends an event when Getting-Started template is clicked', () => {
- findTestTemplateLinks().at(0).vm.$emit('click');
-
- expect(trackingSpy).toHaveBeenCalledTimes(1);
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
- label: 'Getting-Started',
- });
- });
- });
-
- describe('when the runners_availability_section experiment is active', () => {
- beforeEach(() => {
- stubExperiments({ runners_availability_section: 'candidate' });
- });
-
- describe('when runners are available', () => {
- beforeEach(() => {
- wrapper = createWrapper({ anyRunnersAvailable: true }, { GitlabExperiment, GlSprintf });
- });
-
- it('show the runners available section', () => {
- expect(wrapper.text()).toContain(I18N.runners.title);
- });
-
- it('tracks an event when clicking the settings link', () => {
- findSettingsLink().vm.$emit('click');
-
- expect(ExperimentTracking).toHaveBeenCalledWith(
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- );
- expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
- RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
- );
- });
-
- it('tracks an event when clicking the documentation link', () => {
- findDocumentationLink().vm.$emit('click');
-
- expect(ExperimentTracking).toHaveBeenCalledWith(
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- );
- expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
- RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
- );
- });
- });
-
- describe('when runners are not available', () => {
- beforeEach(() => {
- wrapper = createWrapper({ anyRunnersAvailable: false }, { GitlabExperiment, GlButton });
- });
-
- it('show the no runners available section', () => {
- expect(wrapper.text()).toContain(I18N.noRunners.title);
- });
-
- it('tracks an event when clicking the settings button', () => {
- findSettingsButton().trigger('click');
-
- expect(ExperimentTracking).toHaveBeenCalledWith(
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- );
- expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
- RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
- );
- });
- });
- });
-
- describe.each`
- experimentVariant | anyRunnersAvailable | templatesRendered
- ${'control'} | ${true} | ${true}
- ${'control'} | ${false} | ${true}
- ${'candidate'} | ${true} | ${true}
- ${'candidate'} | ${false} | ${false}
- `(
- 'when the runners_availability_section experiment variant is $experimentVariant and runners are available: $anyRunnersAvailable',
- ({ experimentVariant, anyRunnersAvailable, templatesRendered }) => {
- beforeEach(() => {
- stubExperiments({ runners_availability_section: experimentVariant });
- wrapper = createWrapper({ anyRunnersAvailable });
- });
-
- it(`renders the templates: ${templatesRendered}`, () => {
- expect(findTestTemplateLinks().exists()).toBe(templatesRendered);
- expect(findTemplateLinks().exists()).toBe(templatesRendered);
- });
- },
- );
-});
diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js
index 20ed12cd1f5..d2b30c93746 100644
--- a/spec/frontend/pipelines/pipelines_spec.js
+++ b/spec/frontend/pipelines/pipelines_spec.js
@@ -14,7 +14,7 @@ import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import NavigationControls from '~/pipelines/components/pipelines_list/nav_controls.vue';
import PipelinesComponent from '~/pipelines/components/pipelines_list/pipelines.vue';
-import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/pipelines_ci_templates.vue';
+import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue';
import PipelinesTableComponent from '~/pipelines/components/pipelines_list/pipelines_table.vue';
import { RAW_TEXT_WARNING } from '~/pipelines/constants';
import Store from '~/pipelines/stores/pipelines_store';
diff --git a/spec/frontend/pipelines/test_reports/stores/actions_spec.js b/spec/frontend/pipelines/test_reports/stores/actions_spec.js
index 84a9f4776b9..d5acb115bc1 100644
--- a/spec/frontend/pipelines/test_reports/stores/actions_spec.js
+++ b/spec/frontend/pipelines/test_reports/stores/actions_spec.js
@@ -38,29 +38,25 @@ describe('Actions TestReports Store', () => {
mock.onGet(summaryEndpoint).replyOnce(200, summary, {});
});
- it('sets testReports and shows tests', (done) => {
- testAction(
+ it('sets testReports and shows tests', () => {
+ return testAction(
actions.fetchSummary,
null,
state,
[{ type: types.SET_SUMMARY, payload: summary }],
[{ type: 'toggleLoading' }, { type: 'toggleLoading' }],
- done,
);
});
- it('should create flash on API error', (done) => {
- testAction(
+ it('should create flash on API error', async () => {
+ await testAction(
actions.fetchSummary,
null,
{ summaryEndpoint: null },
[],
[{ type: 'toggleLoading' }, { type: 'toggleLoading' }],
- () => {
- expect(createFlash).toHaveBeenCalled();
- done();
- },
);
+ expect(createFlash).toHaveBeenCalled();
});
});
@@ -73,87 +69,80 @@ describe('Actions TestReports Store', () => {
.replyOnce(200, testReports.test_suites[0], {});
});
- it('sets test suite and shows tests', (done) => {
+ it('sets test suite and shows tests', () => {
const suite = testReports.test_suites[0];
const index = 0;
- testAction(
+ return testAction(
actions.fetchTestSuite,
index,
{ ...state, testReports },
[{ type: types.SET_SUITE, payload: { suite, index } }],
[{ type: 'toggleLoading' }, { type: 'toggleLoading' }],
- done,
);
});
- it('should create flash on API error', (done) => {
+ it('should create flash on API error', async () => {
const index = 0;
- testAction(
+ await testAction(
actions.fetchTestSuite,
index,
{ ...state, testReports, suiteEndpoint: null },
[],
[{ type: 'toggleLoading' }, { type: 'toggleLoading' }],
- () => {
- expect(createFlash).toHaveBeenCalled();
- done();
- },
);
+ expect(createFlash).toHaveBeenCalled();
});
describe('when we already have the suite data', () => {
- it('should not fetch suite', (done) => {
+ it('should not fetch suite', () => {
const index = 0;
testReports.test_suites[0].hasFullSuite = true;
- testAction(actions.fetchTestSuite, index, { ...state, testReports }, [], [], done);
+ return testAction(actions.fetchTestSuite, index, { ...state, testReports }, [], []);
});
});
});
describe('set selected suite index', () => {
- it('sets selectedSuiteIndex', (done) => {
+ it('sets selectedSuiteIndex', () => {
const selectedSuiteIndex = 0;
- testAction(
+ return testAction(
actions.setSelectedSuiteIndex,
selectedSuiteIndex,
{ ...state, hasFullReport: true },
[{ type: types.SET_SELECTED_SUITE_INDEX, payload: selectedSuiteIndex }],
[],
- done,
);
});
});
describe('remove selected suite index', () => {
- it('sets selectedSuiteIndex to null', (done) => {
- testAction(
+ it('sets selectedSuiteIndex to null', () => {
+ return testAction(
actions.removeSelectedSuiteIndex,
{},
state,
[{ type: types.SET_SELECTED_SUITE_INDEX, payload: null }],
[],
- done,
);
});
});
describe('toggles loading', () => {
- it('sets isLoading to true', (done) => {
- testAction(actions.toggleLoading, {}, state, [{ type: types.TOGGLE_LOADING }], [], done);
+ it('sets isLoading to true', () => {
+ return testAction(actions.toggleLoading, {}, state, [{ type: types.TOGGLE_LOADING }], []);
});
- it('toggles isLoading to false', (done) => {
- testAction(
+ it('toggles isLoading to false', () => {
+ return testAction(
actions.toggleLoading,
{},
{ ...state, isLoading: true },
[{ type: types.TOGGLE_LOADING }],
[],
- done,
);
});
});
diff --git a/spec/frontend/profile/add_ssh_key_validation_spec.js b/spec/frontend/profile/add_ssh_key_validation_spec.js
index a6bcca0ccb3..730a94592a7 100644
--- a/spec/frontend/profile/add_ssh_key_validation_spec.js
+++ b/spec/frontend/profile/add_ssh_key_validation_spec.js
@@ -1,4 +1,4 @@
-import AddSshKeyValidation from '../../../app/assets/javascripts/profile/add_ssh_key_validation';
+import AddSshKeyValidation from '~/profile/add_ssh_key_validation';
describe('AddSshKeyValidation', () => {
describe('submit', () => {
diff --git a/spec/frontend/profile/preferences/components/__snapshots__/diffs_colors_preview_spec.js.snap b/spec/frontend/profile/preferences/components/__snapshots__/diffs_colors_preview_spec.js.snap
new file mode 100644
index 00000000000..3025a2f87ae
--- /dev/null
+++ b/spec/frontend/profile/preferences/components/__snapshots__/diffs_colors_preview_spec.js.snap
@@ -0,0 +1,915 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`DiffsColorsPreview component renders diff colors preview 1`] = `
+<div
+ class="form-group"
+>
+ <label>
+ Preview
+ </label>
+
+ <table
+ class="code"
+ >
+ <tbody>
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="1"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span>
+ <span
+ class="c1"
+ >
+ #
+ <span
+ class="idiff deletion"
+ >
+ Removed
+ </span>
+ content
+ </span>
+ </span>
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="1"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span>
+ <span
+ class="c1"
+ >
+ #
+ <span
+ class="idiff addition"
+ >
+ Added
+ </span>
+ content
+ </span>
+ </span>
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="2"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span>
+ <span
+ class="n"
+ >
+ v
+ </span>
+
+ <span
+ class="o"
+ >
+ =
+ </span>
+
+ <span
+ class="mi"
+ >
+ 1
+ </span>
+ </span>
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="2"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span>
+ <span
+ class="n"
+ >
+ v
+ </span>
+
+ <span
+ class="o"
+ >
+ =
+ </span>
+
+ <span
+ class="mi"
+ >
+ 1
+ </span>
+ </span>
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="3"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span>
+ <span
+ class="n"
+ >
+ s
+ </span>
+
+ <span
+ class="o"
+ >
+ =
+ </span>
+
+ <span
+ class="s"
+ >
+ "string"
+ </span>
+ </span>
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="3"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span>
+ <span
+ class="n"
+ >
+ s
+ </span>
+
+ <span
+ class="o"
+ >
+ =
+ </span>
+
+ <span
+ class="s"
+ >
+ "string"
+ </span>
+ </span>
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="4"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span />
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="4"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span />
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="5"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span>
+ <span
+ class="k"
+ >
+ for
+ </span>
+
+ <span
+ class="n"
+ >
+ i
+ </span>
+
+ <span
+ class="ow"
+ >
+ in
+ </span>
+
+ <span
+ class="nb"
+ >
+ range
+ </span>
+ <span
+ class="p"
+ >
+ (
+ </span>
+ <span
+ class="o"
+ >
+ -
+ </span>
+ <span
+ class="mi"
+ >
+ 10
+ </span>
+ <span
+ class="p"
+ >
+ ,
+ </span>
+
+ <span
+ class="mi"
+ >
+ 10
+ </span>
+ <span
+ class="p"
+ >
+ ):
+ </span>
+ </span>
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="5"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span>
+ <span
+ class="k"
+ >
+ for
+ </span>
+
+ <span
+ class="n"
+ >
+ i
+ </span>
+
+ <span
+ class="ow"
+ >
+ in
+ </span>
+
+ <span
+ class="nb"
+ >
+ range
+ </span>
+ <span
+ class="p"
+ >
+ (
+ </span>
+ <span
+ class="o"
+ >
+ -
+ </span>
+ <span
+ class="mi"
+ >
+ 10
+ </span>
+ <span
+ class="p"
+ >
+ ,
+ </span>
+
+ <span
+ class="mi"
+ >
+ 10
+ </span>
+ <span
+ class="p"
+ >
+ ):
+ </span>
+ </span>
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="6"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span>
+ <span>
+
+ </span>
+
+ <span
+ class="k"
+ >
+ print
+ </span>
+ <span
+ class="p"
+ >
+ (
+ </span>
+ <span
+ class="n"
+ >
+ i
+ </span>
+
+ <span
+ class="o"
+ >
+ +
+ </span>
+
+ <span
+ class="mi"
+ >
+ 1
+ </span>
+ <span
+ class="p"
+ >
+ )
+ </span>
+ </span>
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="6"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span>
+ <span>
+
+ </span>
+
+ <span
+ class="k"
+ >
+ print
+ </span>
+ <span
+ class="p"
+ >
+ (
+ </span>
+ <span
+ class="n"
+ >
+ i
+ </span>
+
+ <span
+ class="o"
+ >
+ +
+ </span>
+
+ <span
+ class="mi"
+ >
+ 1
+ </span>
+ <span
+ class="p"
+ >
+ )
+ </span>
+ </span>
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="7"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span />
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="7"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span />
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="8"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span>
+ <span
+ class="k"
+ >
+ class
+ </span>
+
+ <span
+ class="nc"
+ >
+ LinkedList
+ </span>
+ <span
+ class="p"
+ >
+ (
+ </span>
+ <span
+ class="nb"
+ >
+ object
+ </span>
+ <span
+ class="p"
+ >
+ ):
+ </span>
+ </span>
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="8"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span>
+ <span
+ class="k"
+ >
+ class
+ </span>
+
+ <span
+ class="nc"
+ >
+ LinkedList
+ </span>
+ <span
+ class="p"
+ >
+ (
+ </span>
+ <span
+ class="nb"
+ >
+ object
+ </span>
+ <span
+ class="p"
+ >
+ ):
+ </span>
+ </span>
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="9"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span>
+ <span>
+
+ </span>
+
+ <span
+ class="k"
+ >
+ def
+ </span>
+
+ <span
+ class="nf"
+ >
+ __init__
+ </span>
+ <span
+ class="p"
+ >
+ (
+ </span>
+ <span
+ class="bp"
+ >
+ self
+ </span>
+ <span
+ class="p"
+ >
+ ,
+ </span>
+
+ <span
+ class="n"
+ >
+ x
+ </span>
+ <span
+ class="p"
+ >
+ ):
+ </span>
+ </span>
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="9"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span>
+ <span>
+
+ </span>
+
+ <span
+ class="k"
+ >
+ def
+ </span>
+
+ <span
+ class="nf"
+ >
+ __init__
+ </span>
+ <span
+ class="p"
+ >
+ (
+ </span>
+ <span
+ class="bp"
+ >
+ self
+ </span>
+ <span
+ class="p"
+ >
+ ,
+ </span>
+
+ <span
+ class="n"
+ >
+ x
+ </span>
+ <span
+ class="p"
+ >
+ ):
+ </span>
+ </span>
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="10"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span>
+ <span>
+
+ </span>
+
+ <span
+ class="bp"
+ >
+ self
+ </span>
+ <span
+ class="p"
+ >
+ .
+ </span>
+ <span
+ class="n"
+ >
+ val
+ </span>
+
+ <span
+ class="o"
+ >
+ =
+ </span>
+
+ <span
+ class="n"
+ >
+ x
+ </span>
+ </span>
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="10"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span>
+ <span>
+
+ </span>
+
+ <span
+ class="bp"
+ >
+ self
+ </span>
+ <span
+ class="p"
+ >
+ .
+ </span>
+ <span
+ class="n"
+ >
+ val
+ </span>
+
+ <span
+ class="o"
+ >
+ =
+ </span>
+
+ <span
+ class="n"
+ >
+ x
+ </span>
+ </span>
+ </td>
+ </tr>
+
+ <tr
+ class="line_holder parallel"
+ >
+ <td
+ class="old_line diff-line-num old"
+ >
+ <a
+ data-linenumber="11"
+ />
+ </td>
+
+ <td
+ class="line_content parallel left-side old"
+ >
+ <span>
+ <span>
+
+ </span>
+
+ <span
+ class="bp"
+ >
+ self
+ </span>
+ <span
+ class="p"
+ >
+ .
+ </span>
+ <span
+ class="nb"
+ >
+ next
+ </span>
+
+ <span
+ class="o"
+ >
+ =
+ </span>
+
+ <span
+ class="bp"
+ >
+ None
+ </span>
+ </span>
+ </td>
+
+ <td
+ class="new_line diff-line-num new"
+ >
+ <a
+ data-linenumber="11"
+ />
+ </td>
+
+ <td
+ class="line_content parallel right-side new"
+ >
+ <span>
+ <span>
+
+ </span>
+
+ <span
+ class="bp"
+ >
+ self
+ </span>
+ <span
+ class="p"
+ >
+ .
+ </span>
+ <span
+ class="nb"
+ >
+ next
+ </span>
+
+ <span
+ class="o"
+ >
+ =
+ </span>
+
+ <span
+ class="bp"
+ >
+ None
+ </span>
+ </span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+`;
diff --git a/spec/frontend/profile/preferences/components/diffs_colors_preview_spec.js b/spec/frontend/profile/preferences/components/diffs_colors_preview_spec.js
new file mode 100644
index 00000000000..e60602ab336
--- /dev/null
+++ b/spec/frontend/profile/preferences/components/diffs_colors_preview_spec.js
@@ -0,0 +1,23 @@
+import { shallowMount } from '@vue/test-utils';
+import DiffsColorsPreview from '~/profile/preferences/components/diffs_colors_preview.vue';
+
+describe('DiffsColorsPreview component', () => {
+ let wrapper;
+
+ function createComponent() {
+ wrapper = shallowMount(DiffsColorsPreview);
+ }
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ it('renders diff colors preview', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+});
diff --git a/spec/frontend/profile/preferences/components/diffs_colors_spec.js b/spec/frontend/profile/preferences/components/diffs_colors_spec.js
new file mode 100644
index 00000000000..02f501a0b06
--- /dev/null
+++ b/spec/frontend/profile/preferences/components/diffs_colors_spec.js
@@ -0,0 +1,153 @@
+import { shallowMount } from '@vue/test-utils';
+import { s__ } from '~/locale';
+import ColorPicker from '~/vue_shared/components/color_picker/color_picker.vue';
+import DiffsColors from '~/profile/preferences/components/diffs_colors.vue';
+import DiffsColorsPreview from '~/profile/preferences/components/diffs_colors_preview.vue';
+import * as CssUtils from '~/lib/utils/css_utils';
+
+describe('DiffsColors component', () => {
+ let wrapper;
+
+ const defaultInjectedProps = {
+ addition: '#00ff00',
+ deletion: '#ff0000',
+ };
+
+ const initialSuggestedColors = {
+ '#d99530': s__('SuggestedColors|Orange'),
+ '#1f75cb': s__('SuggestedColors|Blue'),
+ };
+
+ const findColorPickers = () => wrapper.findAllComponents(ColorPicker);
+
+ function createComponent(provide = {}) {
+ wrapper = shallowMount(DiffsColors, {
+ provide: {
+ ...defaultInjectedProps,
+ ...provide,
+ },
+ });
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ it('mounts', () => {
+ createComponent();
+
+ expect(wrapper.exists()).toBe(true);
+ });
+
+ describe('preview', () => {
+ it('should render preview', () => {
+ createComponent();
+
+ expect(wrapper.findComponent(DiffsColorsPreview).exists()).toBe(true);
+ });
+
+ it('should set preview classes', () => {
+ createComponent();
+
+ expect(wrapper.attributes('class')).toBe(
+ 'diff-custom-addition-color diff-custom-deletion-color',
+ );
+ });
+
+ it.each([
+ [{ addition: null }, 'diff-custom-deletion-color'],
+ [{ deletion: null }, 'diff-custom-addition-color'],
+ ])('should not set preview class if color not set', (provide, expectedClass) => {
+ createComponent(provide);
+
+ expect(wrapper.attributes('class')).toBe(expectedClass);
+ });
+
+ it.each([
+ [{}, '--diff-deletion-color: rgba(255,0,0,0.2); --diff-addition-color: rgba(0,255,0,0.2);'],
+ [{ addition: null }, '--diff-deletion-color: rgba(255,0,0,0.2);'],
+ [{ deletion: null }, '--diff-addition-color: rgba(0,255,0,0.2);'],
+ ])('should set correct CSS variables', (provide, expectedStyle) => {
+ createComponent(provide);
+
+ expect(wrapper.attributes('style')).toBe(expectedStyle);
+ });
+ });
+
+ describe('color pickers', () => {
+ it('should render both color pickers', () => {
+ createComponent();
+
+ const colorPickers = findColorPickers();
+
+ expect(colorPickers.length).toBe(2);
+ expect(colorPickers.at(0).props()).toMatchObject({
+ label: s__('Preferences|Color for removed lines'),
+ value: '#ff0000',
+ state: true,
+ });
+ expect(colorPickers.at(1).props()).toMatchObject({
+ label: s__('Preferences|Color for added lines'),
+ value: '#00ff00',
+ state: true,
+ });
+ });
+
+ describe('suggested colors', () => {
+ const suggestedColors = () => findColorPickers().at(0).props('suggestedColors');
+
+ it('contains initial suggested colors', () => {
+ createComponent();
+
+ expect(suggestedColors()).toMatchObject(initialSuggestedColors);
+ });
+
+ it('contains default diff colors of theme', () => {
+ jest.spyOn(CssUtils, 'getCssVariable').mockImplementation((variable) => {
+ if (variable === '--default-diff-color-addition') return '#111111';
+ if (variable === '--default-diff-color-deletion') return '#222222';
+ return '#000000';
+ });
+
+ createComponent();
+
+ expect(suggestedColors()).toMatchObject({
+ '#111111': s__('SuggestedColors|Default addition color'),
+ '#222222': s__('SuggestedColors|Default removal color'),
+ });
+ });
+
+ it('contains current diff colors if set', () => {
+ createComponent();
+
+ expect(suggestedColors()).toMatchObject({
+ [defaultInjectedProps.addition]: s__('SuggestedColors|Current addition color'),
+ [defaultInjectedProps.deletion]: s__('SuggestedColors|Current removal color'),
+ });
+ });
+
+ it.each([
+ [
+ { addition: null },
+ s__('SuggestedColors|Current removal color'),
+ s__('SuggestedColors|Current addition color'),
+ ],
+ [
+ { deletion: null },
+ s__('SuggestedColors|Current addition color'),
+ s__('SuggestedColors|Current removal color'),
+ ],
+ ])(
+ 'does not contain current diff color if not set %p',
+ (provide, expectedToContain, expectNotToContain) => {
+ createComponent(provide);
+
+ const suggestedColorsLabels = Object.values(suggestedColors());
+ expect(suggestedColorsLabels).toContain(expectedToContain);
+ expect(suggestedColorsLabels).not.toContain(expectNotToContain);
+ },
+ );
+ });
+ });
+});
diff --git a/spec/frontend/profile/preferences/components/integration_view_spec.js b/spec/frontend/profile/preferences/components/integration_view_spec.js
index 6ab0c70298c..92c53b8c91b 100644
--- a/spec/frontend/profile/preferences/components/integration_view_spec.js
+++ b/spec/frontend/profile/preferences/components/integration_view_spec.js
@@ -1,5 +1,5 @@
-import { GlFormText } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { GlFormGroup } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import IntegrationView from '~/profile/preferences/components/integration_view.vue';
@@ -21,7 +21,7 @@ describe('IntegrationView component', () => {
function createComponent(options = {}) {
const { props = {}, provide = {} } = options;
- return shallowMount(IntegrationView, {
+ return mountExtended(IntegrationView, {
provide: {
userFields,
...provide,
@@ -33,28 +33,20 @@ describe('IntegrationView component', () => {
});
}
- function findCheckbox() {
- return wrapper.find('[data-testid="profile-preferences-integration-checkbox"]');
- }
- function findFormGroup() {
- return wrapper.find('[data-testid="profile-preferences-integration-form-group"]');
- }
- function findHiddenField() {
- return wrapper.find('[data-testid="profile-preferences-integration-hidden-field"]');
- }
- function findFormGroupLabel() {
- return wrapper.find('[data-testid="profile-preferences-integration-form-group"] label');
- }
+ const findCheckbox = () => wrapper.findByLabelText(new RegExp(defaultProps.config.label));
+ const findFormGroup = () => wrapper.findComponent(GlFormGroup);
+ const findHiddenField = () =>
+ wrapper.findByTestId('profile-preferences-integration-hidden-field');
afterEach(() => {
wrapper.destroy();
wrapper = null;
});
- it('should render the title correctly', () => {
+ it('should render the form group legend correctly', () => {
wrapper = createComponent();
- expect(wrapper.find('label.label-bold').text()).toBe('Foo');
+ expect(wrapper.findByText(defaultProps.config.title).exists()).toBe(true);
});
it('should render the form correctly', () => {
@@ -106,13 +98,6 @@ describe('IntegrationView component', () => {
it('should render the help text', () => {
wrapper = createComponent();
- expect(wrapper.find(GlFormText).exists()).toBe(true);
expect(wrapper.find(IntegrationHelpText).exists()).toBe(true);
});
-
- it('should render the label correctly', () => {
- wrapper = createComponent();
-
- expect(findFormGroupLabel().text()).toBe('Enable foo');
- });
});
diff --git a/spec/frontend/projects/commit/store/actions_spec.js b/spec/frontend/projects/commit/store/actions_spec.js
index 305257c9ca5..56dffcbd48e 100644
--- a/spec/frontend/projects/commit/store/actions_spec.js
+++ b/spec/frontend/projects/commit/store/actions_spec.js
@@ -44,12 +44,12 @@ describe('Commit form modal store actions', () => {
});
describe('fetchBranches', () => {
- it('dispatch correct actions on fetchBranches', (done) => {
+ it('dispatch correct actions on fetchBranches', () => {
jest
.spyOn(axios, 'get')
.mockImplementation(() => Promise.resolve({ data: { Branches: mockData.mockBranches } }));
- testAction(
+ return testAction(
actions.fetchBranches,
{},
state,
@@ -60,19 +60,15 @@ describe('Commit form modal store actions', () => {
},
],
[{ type: 'requestBranches' }],
- () => {
- done();
- },
);
});
- it('should show flash error and set error in state on fetchBranches failure', (done) => {
+ it('should show flash error and set error in state on fetchBranches failure', async () => {
jest.spyOn(axios, 'get').mockRejectedValue();
- testAction(actions.fetchBranches, {}, state, [], [{ type: 'requestBranches' }], () => {
- expect(createFlash).toHaveBeenCalledWith({ message: PROJECT_BRANCHES_ERROR });
- done();
- });
+ await testAction(actions.fetchBranches, {}, state, [], [{ type: 'requestBranches' }]);
+
+ expect(createFlash).toHaveBeenCalledWith({ message: PROJECT_BRANCHES_ERROR });
});
});
diff --git a/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap b/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap
index b8f9951bbfc..26a3b27d958 100644
--- a/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap
+++ b/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap
@@ -36,7 +36,7 @@ exports[`Project remove modal initialized matches the snapshot 1`] = `
modalclass=""
modalid="fakeUniqueId"
ok-variant="danger"
- size="sm"
+ size="md"
title-class="gl-text-red-500"
titletag="h4"
>
diff --git a/spec/frontend/projects/new/components/deployment_target_select_spec.js b/spec/frontend/projects/new/components/deployment_target_select_spec.js
index 8fe4c5f1230..1c443879dc3 100644
--- a/spec/frontend/projects/new/components/deployment_target_select_spec.js
+++ b/spec/frontend/projects/new/components/deployment_target_select_spec.js
@@ -1,4 +1,5 @@
-import { GlFormGroup, GlFormSelect } from '@gitlab/ui';
+import { GlFormGroup, GlFormSelect, GlFormText, GlLink, GlSprintf } from '@gitlab/ui';
+import { nextTick } from 'vue';
import { shallowMount } from '@vue/test-utils';
import { mockTracking } from 'helpers/tracking_helper';
import DeploymentTargetSelect from '~/projects/new/components/deployment_target_select.vue';
@@ -6,7 +7,9 @@ import {
DEPLOYMENT_TARGET_SELECTIONS,
DEPLOYMENT_TARGET_LABEL,
DEPLOYMENT_TARGET_EVENT,
+ VISIT_DOCS_EVENT,
NEW_PROJECT_FORM,
+ K8S_OPTION,
} from '~/projects/new/constants';
describe('Deployment target select', () => {
@@ -15,11 +18,15 @@ describe('Deployment target select', () => {
const findFormGroup = () => wrapper.findComponent(GlFormGroup);
const findSelect = () => wrapper.findComponent(GlFormSelect);
+ const findText = () => wrapper.findComponent(GlFormText);
+ const findLink = () => wrapper.findComponent(GlLink);
const createdWrapper = () => {
wrapper = shallowMount(DeploymentTargetSelect, {
stubs: {
GlFormSelect,
+ GlFormText,
+ GlSprintf,
},
});
};
@@ -79,4 +86,34 @@ describe('Deployment target select', () => {
});
}
});
+
+ describe.each`
+ selectedTarget | isTextShown
+ ${null} | ${false}
+ ${DEPLOYMENT_TARGET_SELECTIONS[0]} | ${true}
+ ${DEPLOYMENT_TARGET_SELECTIONS[1]} | ${false}
+ `('K8s education text', ({ selectedTarget, isTextShown }) => {
+ beforeEach(() => {
+ findSelect().vm.$emit('input', selectedTarget);
+ });
+
+ it(`is ${!isTextShown ? 'not ' : ''}shown when selected option is ${selectedTarget}`, () => {
+ expect(findText().exists()).toBe(isTextShown);
+ });
+ });
+
+ describe('when user clicks on the docs link', () => {
+ beforeEach(async () => {
+ findSelect().vm.$emit('input', K8S_OPTION);
+ await nextTick();
+
+ findLink().trigger('click');
+ });
+
+ it('sends the snowplow tracking event', () => {
+ expect(trackingSpy).toHaveBeenCalledWith('_category_', VISIT_DOCS_EVENT, {
+ label: DEPLOYMENT_TARGET_LABEL,
+ });
+ });
+ });
});
diff --git a/spec/frontend/projects/new/components/new_project_url_select_spec.js b/spec/frontend/projects/new/components/new_project_url_select_spec.js
index 921f5b74278..ba22622e1f7 100644
--- a/spec/frontend/projects/new/components/new_project_url_select_spec.js
+++ b/spec/frontend/projects/new/components/new_project_url_select_spec.js
@@ -15,6 +15,7 @@ import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import eventHub from '~/projects/new/event_hub';
import NewProjectUrlSelect from '~/projects/new/components/new_project_url_select.vue';
import searchQuery from '~/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql';
+import { s__ } from '~/locale';
describe('NewProjectUrlSelect component', () => {
let wrapper;
@@ -61,7 +62,6 @@ describe('NewProjectUrlSelect component', () => {
namespaceId: '28',
rootUrl: 'https://gitlab.com/',
trackLabel: 'blank_project',
- userNamespaceFullPath: 'root',
userNamespaceId: '1',
};
@@ -91,7 +91,10 @@ describe('NewProjectUrlSelect component', () => {
const findButtonLabel = () => wrapper.findComponent(GlButton);
const findDropdown = () => wrapper.findComponent(GlDropdown);
const findInput = () => wrapper.findComponent(GlSearchBoxByType);
- const findHiddenInput = () => wrapper.find('[name="project[namespace_id]"]');
+ const findHiddenNamespaceInput = () => wrapper.find('[name="project[namespace_id]"]');
+
+ const findHiddenSelectedNamespaceInput = () =>
+ wrapper.find('[name="project[selected_namespace_id]"]');
const clickDropdownItem = async () => {
wrapper.findComponent(GlDropdownItem).vm.$emit('click');
@@ -122,11 +125,20 @@ describe('NewProjectUrlSelect component', () => {
});
it('renders a dropdown with the given namespace full path as the text', () => {
- expect(findDropdown().props('text')).toBe(defaultProvide.namespaceFullPath);
+ const dropdownProps = findDropdown().props();
+
+ expect(dropdownProps.text).toBe(defaultProvide.namespaceFullPath);
+ expect(dropdownProps.toggleClass).not.toContain('gl-text-gray-500!');
+ });
+
+ it('renders a hidden input with the given namespace id', () => {
+ expect(findHiddenNamespaceInput().attributes('value')).toBe(defaultProvide.namespaceId);
});
- it('renders a dropdown with the given namespace id in the hidden input', () => {
- expect(findHiddenInput().attributes('value')).toBe(defaultProvide.namespaceId);
+ it('renders a hidden input with the selected namespace id', () => {
+ expect(findHiddenSelectedNamespaceInput().attributes('value')).toBe(
+ defaultProvide.namespaceId,
+ );
});
});
@@ -142,11 +154,18 @@ describe('NewProjectUrlSelect component', () => {
});
it("renders a dropdown with the user's namespace full path as the text", () => {
- expect(findDropdown().props('text')).toBe(defaultProvide.userNamespaceFullPath);
+ const dropdownProps = findDropdown().props();
+
+ expect(dropdownProps.text).toBe(s__('ProjectsNew|Pick a group or namespace'));
+ expect(dropdownProps.toggleClass).toContain('gl-text-gray-500!');
+ });
+
+ it("renders a hidden input with the user's namespace id", () => {
+ expect(findHiddenNamespaceInput().attributes('value')).toBe(defaultProvide.userNamespaceId);
});
- it("renders a dropdown with the user's namespace id in the hidden input", () => {
- expect(findHiddenInput().attributes('value')).toBe(defaultProvide.userNamespaceId);
+ it('renders a hidden input with the selected namespace id', () => {
+ expect(findHiddenSelectedNamespaceInput().attributes('value')).toBe(undefined);
});
});
@@ -270,7 +289,7 @@ describe('NewProjectUrlSelect component', () => {
await clickDropdownItem();
- expect(findHiddenInput().attributes('value')).toBe(
+ expect(findHiddenNamespaceInput().attributes('value')).toBe(
getIdFromGraphQLId(data.currentUser.groups.nodes[0].id).toString(),
);
});
diff --git a/spec/frontend/releases/components/app_index_apollo_client_spec.js b/spec/frontend/releases/components/app_index_apollo_client_spec.js
deleted file mode 100644
index 9881ef9bc9f..00000000000
--- a/spec/frontend/releases/components/app_index_apollo_client_spec.js
+++ /dev/null
@@ -1,398 +0,0 @@
-import { cloneDeep } from 'lodash';
-import Vue, { nextTick } 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 waitForPromises from 'helpers/wait_for_promises';
-import allReleasesQuery from 'shared_queries/releases/all_releases.query.graphql';
-import createFlash from '~/flash';
-import { historyPushState } from '~/lib/utils/common_utils';
-import ReleasesIndexApolloClientApp from '~/releases/components/app_index_apollo_client.vue';
-import ReleaseBlock from '~/releases/components/release_block.vue';
-import ReleaseSkeletonLoader from '~/releases/components/release_skeleton_loader.vue';
-import ReleasesEmptyState from '~/releases/components/releases_empty_state.vue';
-import ReleasesPaginationApolloClient from '~/releases/components/releases_pagination_apollo_client.vue';
-import ReleasesSortApolloClient from '~/releases/components/releases_sort_apollo_client.vue';
-import { PAGE_SIZE, CREATED_ASC, DEFAULT_SORT } from '~/releases/constants';
-
-Vue.use(VueApollo);
-
-jest.mock('~/flash');
-
-let mockQueryParams;
-jest.mock('~/lib/utils/common_utils', () => ({
- ...jest.requireActual('~/lib/utils/common_utils'),
- historyPushState: jest.fn(),
-}));
-
-jest.mock('~/lib/utils/url_utility', () => ({
- ...jest.requireActual('~/lib/utils/url_utility'),
- getParameterByName: jest
- .fn()
- .mockImplementation((parameterName) => mockQueryParams[parameterName]),
-}));
-
-describe('app_index_apollo_client.vue', () => {
- const projectPath = 'project/path';
- const newReleasePath = 'path/to/new/release/page';
- const before = 'beforeCursor';
- const after = 'afterCursor';
-
- let wrapper;
- let allReleases;
- let singleRelease;
- let noReleases;
- let queryMock;
-
- const createComponent = ({
- singleResponse = Promise.resolve(singleRelease),
- fullResponse = Promise.resolve(allReleases),
- } = {}) => {
- const apolloProvider = createMockApollo([
- [
- allReleasesQuery,
- queryMock.mockImplementation((vars) => {
- return vars.first === 1 ? singleResponse : fullResponse;
- }),
- ],
- ]);
-
- wrapper = shallowMountExtended(ReleasesIndexApolloClientApp, {
- apolloProvider,
- provide: {
- newReleasePath,
- projectPath,
- },
- });
- };
-
- beforeEach(() => {
- mockQueryParams = {};
-
- allReleases = cloneDeep(originalAllReleasesQueryResponse);
-
- singleRelease = cloneDeep(originalAllReleasesQueryResponse);
- singleRelease.data.project.releases.nodes.splice(
- 1,
- singleRelease.data.project.releases.nodes.length,
- );
-
- noReleases = cloneDeep(originalAllReleasesQueryResponse);
- noReleases.data.project.releases.nodes = [];
-
- queryMock = jest.fn();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- // Finders
- const findLoadingIndicator = () => wrapper.findComponent(ReleaseSkeletonLoader);
- const findEmptyState = () => wrapper.findComponent(ReleasesEmptyState);
- const findNewReleaseButton = () =>
- wrapper.findByText(ReleasesIndexApolloClientApp.i18n.newRelease);
- const findAllReleaseBlocks = () => wrapper.findAllComponents(ReleaseBlock);
- const findPagination = () => wrapper.findComponent(ReleasesPaginationApolloClient);
- const findSort = () => wrapper.findComponent(ReleasesSortApolloClient);
-
- // Tests
- describe('component states', () => {
- // These need to be defined as functions, since `singleRelease` and
- // `allReleases` are generated in a `beforeEach`, and therefore
- // aren't available at test definition time.
- const getInProgressResponse = () => new Promise(() => {});
- const getErrorResponse = () => Promise.reject(new Error('Oops!'));
- const getSingleRequestLoadedResponse = () => Promise.resolve(singleRelease);
- const getFullRequestLoadedResponse = () => Promise.resolve(allReleases);
- const getLoadedEmptyResponse = () => Promise.resolve(noReleases);
-
- const toDescription = (bool) => (bool ? 'does' : 'does not');
-
- describe.each`
- description | singleResponseFn | fullResponseFn | loadingIndicator | emptyState | flashMessage | releaseCount | pagination
- ${'both requests loading'} | ${getInProgressResponse} | ${getInProgressResponse} | ${true} | ${false} | ${false} | ${0} | ${false}
- ${'both requests failed'} | ${getErrorResponse} | ${getErrorResponse} | ${false} | ${false} | ${true} | ${0} | ${false}
- ${'both requests loaded'} | ${getSingleRequestLoadedResponse} | ${getFullRequestLoadedResponse} | ${false} | ${false} | ${false} | ${2} | ${true}
- ${'both requests loaded with no results'} | ${getLoadedEmptyResponse} | ${getLoadedEmptyResponse} | ${false} | ${true} | ${false} | ${0} | ${false}
- ${'single request loading, full request loaded'} | ${getInProgressResponse} | ${getFullRequestLoadedResponse} | ${false} | ${false} | ${false} | ${2} | ${true}
- ${'single request loading, full request failed'} | ${getInProgressResponse} | ${getErrorResponse} | ${true} | ${false} | ${true} | ${0} | ${false}
- ${'single request loaded, full request loading'} | ${getSingleRequestLoadedResponse} | ${getInProgressResponse} | ${true} | ${false} | ${false} | ${1} | ${false}
- ${'single request loaded, full request failed'} | ${getSingleRequestLoadedResponse} | ${getErrorResponse} | ${false} | ${false} | ${true} | ${1} | ${false}
- ${'single request failed, full request loading'} | ${getErrorResponse} | ${getInProgressResponse} | ${true} | ${false} | ${false} | ${0} | ${false}
- ${'single request failed, full request loaded'} | ${getErrorResponse} | ${getFullRequestLoadedResponse} | ${false} | ${false} | ${false} | ${2} | ${true}
- ${'single request loaded with no results, full request loading'} | ${getLoadedEmptyResponse} | ${getInProgressResponse} | ${true} | ${false} | ${false} | ${0} | ${false}
- ${'single request loading, full request loadied with no results'} | ${getInProgressResponse} | ${getLoadedEmptyResponse} | ${false} | ${true} | ${false} | ${0} | ${false}
- `(
- '$description',
- ({
- singleResponseFn,
- fullResponseFn,
- loadingIndicator,
- emptyState,
- flashMessage,
- releaseCount,
- pagination,
- }) => {
- beforeEach(() => {
- createComponent({
- singleResponse: singleResponseFn(),
- fullResponse: fullResponseFn(),
- });
- });
-
- it(`${toDescription(loadingIndicator)} render a loading indicator`, async () => {
- await waitForPromises();
- expect(findLoadingIndicator().exists()).toBe(loadingIndicator);
- });
-
- it(`${toDescription(emptyState)} render an empty state`, () => {
- expect(findEmptyState().exists()).toBe(emptyState);
- });
-
- it(`${toDescription(flashMessage)} show a flash message`, () => {
- if (flashMessage) {
- expect(createFlash).toHaveBeenCalledWith({
- message: ReleasesIndexApolloClientApp.i18n.errorMessage,
- captureError: true,
- error: expect.any(Error),
- });
- } else {
- expect(createFlash).not.toHaveBeenCalled();
- }
- });
-
- it(`renders ${releaseCount} release(s)`, () => {
- expect(findAllReleaseBlocks()).toHaveLength(releaseCount);
- });
-
- it(`${toDescription(pagination)} render the pagination controls`, () => {
- expect(findPagination().exists()).toBe(pagination);
- });
-
- it('does render the "New release" button', () => {
- expect(findNewReleaseButton().exists()).toBe(true);
- });
-
- it('does render the sort controls', () => {
- expect(findSort().exists()).toBe(true);
- });
- },
- );
- });
-
- describe('URL parameters', () => {
- describe('when the URL contains no query parameters', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('makes a request with the correct GraphQL query parameters', () => {
- expect(queryMock).toHaveBeenCalledTimes(2);
-
- expect(queryMock).toHaveBeenCalledWith({
- first: 1,
- fullPath: projectPath,
- sort: DEFAULT_SORT,
- });
-
- expect(queryMock).toHaveBeenCalledWith({
- first: PAGE_SIZE,
- fullPath: projectPath,
- sort: DEFAULT_SORT,
- });
- });
- });
-
- describe('when the URL contains a "before" query parameter', () => {
- beforeEach(() => {
- mockQueryParams = { before };
- createComponent();
- });
-
- it('makes a request with the correct GraphQL query parameters', () => {
- expect(queryMock).toHaveBeenCalledTimes(1);
-
- expect(queryMock).toHaveBeenCalledWith({
- before,
- last: PAGE_SIZE,
- fullPath: projectPath,
- sort: DEFAULT_SORT,
- });
- });
- });
-
- describe('when the URL contains an "after" query parameter', () => {
- beforeEach(() => {
- mockQueryParams = { after };
- createComponent();
- });
-
- it('makes a request with the correct GraphQL query parameters', () => {
- expect(queryMock).toHaveBeenCalledTimes(2);
-
- expect(queryMock).toHaveBeenCalledWith({
- after,
- first: 1,
- fullPath: projectPath,
- sort: DEFAULT_SORT,
- });
-
- expect(queryMock).toHaveBeenCalledWith({
- after,
- first: PAGE_SIZE,
- fullPath: projectPath,
- sort: DEFAULT_SORT,
- });
- });
- });
-
- describe('when the URL contains both "before" and "after" query parameters', () => {
- beforeEach(() => {
- mockQueryParams = { before, after };
- createComponent();
- });
-
- it('ignores the "before" parameter and behaves as if only the "after" parameter was provided', () => {
- expect(queryMock).toHaveBeenCalledTimes(2);
-
- expect(queryMock).toHaveBeenCalledWith({
- after,
- first: 1,
- fullPath: projectPath,
- sort: DEFAULT_SORT,
- });
-
- expect(queryMock).toHaveBeenCalledWith({
- after,
- first: PAGE_SIZE,
- fullPath: projectPath,
- sort: DEFAULT_SORT,
- });
- });
- });
- });
-
- describe('New release button', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('renders the new release button with the correct href', () => {
- expect(findNewReleaseButton().attributes().href).toBe(newReleasePath);
- });
- });
-
- describe('pagination', () => {
- beforeEach(() => {
- mockQueryParams = { before };
- createComponent();
- });
-
- it('requeries the GraphQL endpoint when a pagination button is clicked', async () => {
- expect(queryMock.mock.calls).toEqual([[expect.objectContaining({ before })]]);
-
- mockQueryParams = { after };
- findPagination().vm.$emit('next', after);
-
- await nextTick();
-
- expect(queryMock.mock.calls).toEqual([
- [expect.objectContaining({ before })],
- [expect.objectContaining({ after })],
- [expect.objectContaining({ after })],
- ]);
- });
- });
-
- describe('sorting', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it(`sorts by ${DEFAULT_SORT} by default`, () => {
- expect(queryMock.mock.calls).toEqual([
- [expect.objectContaining({ sort: DEFAULT_SORT })],
- [expect.objectContaining({ sort: DEFAULT_SORT })],
- ]);
- });
-
- it('requeries the GraphQL endpoint and updates the URL when the sort is changed', async () => {
- findSort().vm.$emit('input', CREATED_ASC);
-
- await nextTick();
-
- expect(queryMock.mock.calls).toEqual([
- [expect.objectContaining({ sort: DEFAULT_SORT })],
- [expect.objectContaining({ sort: DEFAULT_SORT })],
- [expect.objectContaining({ sort: CREATED_ASC })],
- [expect.objectContaining({ sort: CREATED_ASC })],
- ]);
-
- // URL manipulation is tested in more detail in the `describe` block below
- expect(historyPushState).toHaveBeenCalled();
- });
-
- it('does not requery the GraphQL endpoint or update the URL if the sort is updated to the same value', async () => {
- findSort().vm.$emit('input', DEFAULT_SORT);
-
- await nextTick();
-
- expect(queryMock.mock.calls).toEqual([
- [expect.objectContaining({ sort: DEFAULT_SORT })],
- [expect.objectContaining({ sort: DEFAULT_SORT })],
- ]);
-
- expect(historyPushState).not.toHaveBeenCalled();
- });
- });
-
- describe('sorting + pagination interaction', () => {
- const nonPaginationQueryParam = 'nonPaginationQueryParam';
-
- beforeEach(() => {
- historyPushState.mockImplementation((newUrl) => {
- mockQueryParams = Object.fromEntries(new URL(newUrl).searchParams);
- });
- });
-
- describe.each`
- queryParamsBefore | paramName | paramInitialValue
- ${{ before, nonPaginationQueryParam }} | ${'before'} | ${before}
- ${{ after, nonPaginationQueryParam }} | ${'after'} | ${after}
- `(
- 'when the URL contains a "$paramName" pagination cursor',
- ({ queryParamsBefore, paramName, paramInitialValue }) => {
- beforeEach(async () => {
- mockQueryParams = queryParamsBefore;
- createComponent();
-
- findSort().vm.$emit('input', CREATED_ASC);
-
- await nextTick();
- });
-
- it(`resets the page's "${paramName}" pagination cursor when the sort is changed`, () => {
- const firstRequestVariables = queryMock.mock.calls[0][0];
- // Might be request #2 or #3, depending on the pagination direction
- const mostRecentRequestVariables =
- queryMock.mock.calls[queryMock.mock.calls.length - 1][0];
-
- expect(firstRequestVariables[paramName]).toBe(paramInitialValue);
- expect(mostRecentRequestVariables[paramName]).toBeUndefined();
- });
-
- it(`updates the URL to not include the "${paramName}" URL query parameter`, () => {
- expect(historyPushState).toHaveBeenCalledTimes(1);
-
- const updatedUrlQueryParams = Object.fromEntries(
- new URL(historyPushState.mock.calls[0][0]).searchParams,
- );
-
- expect(updatedUrlQueryParams[paramName]).toBeUndefined();
- });
- },
- );
- });
-});
diff --git a/spec/frontend/releases/components/app_index_spec.js b/spec/frontend/releases/components/app_index_spec.js
index 43e88650ae3..63ce4c8bb17 100644
--- a/spec/frontend/releases/components/app_index_spec.js
+++ b/spec/frontend/releases/components/app_index_spec.js
@@ -1,50 +1,87 @@
-import { shallowMount } from '@vue/test-utils';
-import { merge } from 'lodash';
-import Vue from 'vue';
-import Vuex from 'vuex';
-import { getParameterByName } from '~/lib/utils/url_utility';
-import AppIndex from '~/releases/components/app_index.vue';
+import { cloneDeep } from 'lodash';
+import Vue, { nextTick } 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 waitForPromises from 'helpers/wait_for_promises';
+import allReleasesQuery from '~/releases/graphql/queries/all_releases.query.graphql';
+import createFlash from '~/flash';
+import { historyPushState } from '~/lib/utils/common_utils';
+import ReleasesIndexApp from '~/releases/components/app_index.vue';
+import ReleaseBlock from '~/releases/components/release_block.vue';
import ReleaseSkeletonLoader from '~/releases/components/release_skeleton_loader.vue';
+import ReleasesEmptyState from '~/releases/components/releases_empty_state.vue';
import ReleasesPagination from '~/releases/components/releases_pagination.vue';
import ReleasesSort from '~/releases/components/releases_sort.vue';
+import { PAGE_SIZE, CREATED_ASC, DEFAULT_SORT } from '~/releases/constants';
+
+Vue.use(VueApollo);
+
+jest.mock('~/flash');
+
+let mockQueryParams;
+jest.mock('~/lib/utils/common_utils', () => ({
+ ...jest.requireActual('~/lib/utils/common_utils'),
+ historyPushState: jest.fn(),
+}));
jest.mock('~/lib/utils/url_utility', () => ({
...jest.requireActual('~/lib/utils/url_utility'),
- getParameterByName: jest.fn(),
+ getParameterByName: jest
+ .fn()
+ .mockImplementation((parameterName) => mockQueryParams[parameterName]),
}));
-Vue.use(Vuex);
-
describe('app_index.vue', () => {
+ const projectPath = 'project/path';
+ const newReleasePath = 'path/to/new/release/page';
+ const before = 'beforeCursor';
+ const after = 'afterCursor';
+
let wrapper;
- let fetchReleasesSpy;
- let urlParams;
-
- const createComponent = (storeUpdates) => {
- wrapper = shallowMount(AppIndex, {
- store: new Vuex.Store({
- modules: {
- index: merge(
- {
- namespaced: true,
- actions: {
- fetchReleases: fetchReleasesSpy,
- },
- state: {
- isLoading: true,
- releases: [],
- },
- },
- storeUpdates,
- ),
- },
- }),
+ let allReleases;
+ let singleRelease;
+ let noReleases;
+ let queryMock;
+
+ const createComponent = ({
+ singleResponse = Promise.resolve(singleRelease),
+ fullResponse = Promise.resolve(allReleases),
+ } = {}) => {
+ const apolloProvider = createMockApollo([
+ [
+ allReleasesQuery,
+ queryMock.mockImplementation((vars) => {
+ return vars.first === 1 ? singleResponse : fullResponse;
+ }),
+ ],
+ ]);
+
+ wrapper = shallowMountExtended(ReleasesIndexApp, {
+ apolloProvider,
+ provide: {
+ newReleasePath,
+ projectPath,
+ },
});
};
beforeEach(() => {
- fetchReleasesSpy = jest.fn();
- getParameterByName.mockImplementation((paramName) => urlParams[paramName]);
+ mockQueryParams = {};
+
+ allReleases = cloneDeep(originalAllReleasesQueryResponse);
+
+ singleRelease = cloneDeep(originalAllReleasesQueryResponse);
+ singleRelease.data.project.releases.nodes.splice(
+ 1,
+ singleRelease.data.project.releases.nodes.length,
+ );
+
+ noReleases = cloneDeep(originalAllReleasesQueryResponse);
+ noReleases.data.project.releases.nodes = [];
+
+ queryMock = jest.fn();
});
afterEach(() => {
@@ -52,120 +89,221 @@ describe('app_index.vue', () => {
});
// Finders
- const findLoadingIndicator = () => wrapper.find(ReleaseSkeletonLoader);
- const findEmptyState = () => wrapper.find('[data-testid="empty-state"]');
- const findSuccessState = () => wrapper.find('[data-testid="success-state"]');
- const findPagination = () => wrapper.find(ReleasesPagination);
- const findSortControls = () => wrapper.find(ReleasesSort);
- const findNewReleaseButton = () => wrapper.find('[data-testid="new-release-button"]');
-
- // Expectations
- const expectLoadingIndicator = (shouldExist) => {
- it(`${shouldExist ? 'renders' : 'does not render'} a loading indicator`, () => {
- expect(findLoadingIndicator().exists()).toBe(shouldExist);
- });
- };
+ const findLoadingIndicator = () => wrapper.findComponent(ReleaseSkeletonLoader);
+ const findEmptyState = () => wrapper.findComponent(ReleasesEmptyState);
+ const findNewReleaseButton = () => wrapper.findByText(ReleasesIndexApp.i18n.newRelease);
+ const findAllReleaseBlocks = () => wrapper.findAllComponents(ReleaseBlock);
+ const findPagination = () => wrapper.findComponent(ReleasesPagination);
+ const findSort = () => wrapper.findComponent(ReleasesSort);
- const expectEmptyState = (shouldExist) => {
- it(`${shouldExist ? 'renders' : 'does not render'} an empty state`, () => {
- expect(findEmptyState().exists()).toBe(shouldExist);
- });
- };
+ // Tests
+ describe('component states', () => {
+ // These need to be defined as functions, since `singleRelease` and
+ // `allReleases` are generated in a `beforeEach`, and therefore
+ // aren't available at test definition time.
+ const getInProgressResponse = () => new Promise(() => {});
+ const getErrorResponse = () => Promise.reject(new Error('Oops!'));
+ const getSingleRequestLoadedResponse = () => Promise.resolve(singleRelease);
+ const getFullRequestLoadedResponse = () => Promise.resolve(allReleases);
+ const getLoadedEmptyResponse = () => Promise.resolve(noReleases);
+
+ const toDescription = (bool) => (bool ? 'does' : 'does not');
+
+ describe.each`
+ description | singleResponseFn | fullResponseFn | loadingIndicator | emptyState | flashMessage | releaseCount | pagination
+ ${'both requests loading'} | ${getInProgressResponse} | ${getInProgressResponse} | ${true} | ${false} | ${false} | ${0} | ${false}
+ ${'both requests failed'} | ${getErrorResponse} | ${getErrorResponse} | ${false} | ${false} | ${true} | ${0} | ${false}
+ ${'both requests loaded'} | ${getSingleRequestLoadedResponse} | ${getFullRequestLoadedResponse} | ${false} | ${false} | ${false} | ${2} | ${true}
+ ${'both requests loaded with no results'} | ${getLoadedEmptyResponse} | ${getLoadedEmptyResponse} | ${false} | ${true} | ${false} | ${0} | ${false}
+ ${'single request loading, full request loaded'} | ${getInProgressResponse} | ${getFullRequestLoadedResponse} | ${false} | ${false} | ${false} | ${2} | ${true}
+ ${'single request loading, full request failed'} | ${getInProgressResponse} | ${getErrorResponse} | ${true} | ${false} | ${true} | ${0} | ${false}
+ ${'single request loaded, full request loading'} | ${getSingleRequestLoadedResponse} | ${getInProgressResponse} | ${true} | ${false} | ${false} | ${1} | ${false}
+ ${'single request loaded, full request failed'} | ${getSingleRequestLoadedResponse} | ${getErrorResponse} | ${false} | ${false} | ${true} | ${1} | ${false}
+ ${'single request failed, full request loading'} | ${getErrorResponse} | ${getInProgressResponse} | ${true} | ${false} | ${false} | ${0} | ${false}
+ ${'single request failed, full request loaded'} | ${getErrorResponse} | ${getFullRequestLoadedResponse} | ${false} | ${false} | ${false} | ${2} | ${true}
+ ${'single request loaded with no results, full request loading'} | ${getLoadedEmptyResponse} | ${getInProgressResponse} | ${true} | ${false} | ${false} | ${0} | ${false}
+ ${'single request loading, full request loadied with no results'} | ${getInProgressResponse} | ${getLoadedEmptyResponse} | ${false} | ${true} | ${false} | ${0} | ${false}
+ `(
+ '$description',
+ ({
+ singleResponseFn,
+ fullResponseFn,
+ loadingIndicator,
+ emptyState,
+ flashMessage,
+ releaseCount,
+ pagination,
+ }) => {
+ beforeEach(() => {
+ createComponent({
+ singleResponse: singleResponseFn(),
+ fullResponse: fullResponseFn(),
+ });
+ });
+
+ it(`${toDescription(loadingIndicator)} render a loading indicator`, async () => {
+ await waitForPromises();
+ expect(findLoadingIndicator().exists()).toBe(loadingIndicator);
+ });
+
+ it(`${toDescription(emptyState)} render an empty state`, () => {
+ expect(findEmptyState().exists()).toBe(emptyState);
+ });
+
+ it(`${toDescription(flashMessage)} show a flash message`, async () => {
+ await waitForPromises();
+ if (flashMessage) {
+ expect(createFlash).toHaveBeenCalledWith({
+ message: ReleasesIndexApp.i18n.errorMessage,
+ captureError: true,
+ error: expect.any(Error),
+ });
+ } else {
+ expect(createFlash).not.toHaveBeenCalled();
+ }
+ });
+
+ it(`renders ${releaseCount} release(s)`, () => {
+ expect(findAllReleaseBlocks()).toHaveLength(releaseCount);
+ });
+
+ it(`${toDescription(pagination)} render the pagination controls`, () => {
+ expect(findPagination().exists()).toBe(pagination);
+ });
+
+ it('does render the "New release" button', () => {
+ expect(findNewReleaseButton().exists()).toBe(true);
+ });
+
+ it('does render the sort controls', () => {
+ expect(findSort().exists()).toBe(true);
+ });
+ },
+ );
+ });
- const expectSuccessState = (shouldExist) => {
- it(`${shouldExist ? 'renders' : 'does not render'} the success state`, () => {
- expect(findSuccessState().exists()).toBe(shouldExist);
- });
- };
+ describe('URL parameters', () => {
+ describe('when the URL contains no query parameters', () => {
+ beforeEach(() => {
+ createComponent();
+ });
- const expectPagination = (shouldExist) => {
- it(`${shouldExist ? 'renders' : 'does not render'} the pagination controls`, () => {
- expect(findPagination().exists()).toBe(shouldExist);
- });
- };
+ it('makes a request with the correct GraphQL query parameters', () => {
+ expect(queryMock).toHaveBeenCalledTimes(2);
- const expectNewReleaseButton = (shouldExist) => {
- it(`${shouldExist ? 'renders' : 'does not render'} the "New release" button`, () => {
- expect(findNewReleaseButton().exists()).toBe(shouldExist);
- });
- };
+ expect(queryMock).toHaveBeenCalledWith({
+ first: 1,
+ fullPath: projectPath,
+ sort: DEFAULT_SORT,
+ });
- // Tests
- describe('on startup', () => {
- it.each`
- before | after
- ${null} | ${null}
- ${'before_param_value'} | ${null}
- ${null} | ${'after_param_value'}
- `(
- 'calls fetchRelease with the correct parameters based on the curent query parameters: before: $before, after: $after',
- ({ before, after }) => {
- urlParams = { before, after };
+ expect(queryMock).toHaveBeenCalledWith({
+ first: PAGE_SIZE,
+ fullPath: projectPath,
+ sort: DEFAULT_SORT,
+ });
+ });
+ });
+ describe('when the URL contains a "before" query parameter', () => {
+ beforeEach(() => {
+ mockQueryParams = { before };
createComponent();
+ });
- expect(fetchReleasesSpy).toHaveBeenCalledTimes(1);
- expect(fetchReleasesSpy).toHaveBeenCalledWith(expect.anything(), urlParams);
- },
- );
- });
+ it('makes a request with the correct GraphQL query parameters', () => {
+ expect(queryMock).toHaveBeenCalledTimes(1);
- describe('when the request to fetch releases has not yet completed', () => {
- beforeEach(() => {
- createComponent();
+ expect(queryMock).toHaveBeenCalledWith({
+ before,
+ last: PAGE_SIZE,
+ fullPath: projectPath,
+ sort: DEFAULT_SORT,
+ });
+ });
});
- expectLoadingIndicator(true);
- expectEmptyState(false);
- expectSuccessState(false);
- expectPagination(false);
- });
+ describe('when the URL contains an "after" query parameter', () => {
+ beforeEach(() => {
+ mockQueryParams = { after };
+ createComponent();
+ });
- describe('when the request fails', () => {
- beforeEach(() => {
- createComponent({
- state: {
- isLoading: false,
- hasError: true,
- },
+ it('makes a request with the correct GraphQL query parameters', () => {
+ expect(queryMock).toHaveBeenCalledTimes(2);
+
+ expect(queryMock).toHaveBeenCalledWith({
+ after,
+ first: 1,
+ fullPath: projectPath,
+ sort: DEFAULT_SORT,
+ });
+
+ expect(queryMock).toHaveBeenCalledWith({
+ after,
+ first: PAGE_SIZE,
+ fullPath: projectPath,
+ sort: DEFAULT_SORT,
+ });
});
});
- expectLoadingIndicator(false);
- expectEmptyState(false);
- expectSuccessState(false);
- expectPagination(true);
+ describe('when the URL contains both "before" and "after" query parameters', () => {
+ beforeEach(() => {
+ mockQueryParams = { before, after };
+ createComponent();
+ });
+
+ it('ignores the "before" parameter and behaves as if only the "after" parameter was provided', () => {
+ expect(queryMock).toHaveBeenCalledTimes(2);
+
+ expect(queryMock).toHaveBeenCalledWith({
+ after,
+ first: 1,
+ fullPath: projectPath,
+ sort: DEFAULT_SORT,
+ });
+
+ expect(queryMock).toHaveBeenCalledWith({
+ after,
+ first: PAGE_SIZE,
+ fullPath: projectPath,
+ sort: DEFAULT_SORT,
+ });
+ });
+ });
});
- describe('when the request succeeds but returns no releases', () => {
+ describe('New release button', () => {
beforeEach(() => {
- createComponent({
- state: {
- isLoading: false,
- },
- });
+ createComponent();
});
- expectLoadingIndicator(false);
- expectEmptyState(true);
- expectSuccessState(false);
- expectPagination(true);
+ it('renders the new release button with the correct href', () => {
+ expect(findNewReleaseButton().attributes().href).toBe(newReleasePath);
+ });
});
- describe('when the request succeeds and includes at least one release', () => {
+ describe('pagination', () => {
beforeEach(() => {
- createComponent({
- state: {
- isLoading: false,
- releases: [{}],
- },
- });
+ mockQueryParams = { before };
+ createComponent();
});
- expectLoadingIndicator(false);
- expectEmptyState(false);
- expectSuccessState(true);
- expectPagination(true);
+ it('requeries the GraphQL endpoint when a pagination button is clicked', async () => {
+ expect(queryMock.mock.calls).toEqual([[expect.objectContaining({ before })]]);
+
+ mockQueryParams = { after };
+ findPagination().vm.$emit('next', after);
+
+ await nextTick();
+
+ expect(queryMock.mock.calls).toEqual([
+ [expect.objectContaining({ before })],
+ [expect.objectContaining({ after })],
+ [expect.objectContaining({ after })],
+ ]);
+ });
});
describe('sorting', () => {
@@ -173,59 +311,88 @@ describe('app_index.vue', () => {
createComponent();
});
- it('renders the sort controls', () => {
- expect(findSortControls().exists()).toBe(true);
+ it(`sorts by ${DEFAULT_SORT} by default`, () => {
+ expect(queryMock.mock.calls).toEqual([
+ [expect.objectContaining({ sort: DEFAULT_SORT })],
+ [expect.objectContaining({ sort: DEFAULT_SORT })],
+ ]);
});
- it('calls the fetchReleases store method when the sort is updated', () => {
- fetchReleasesSpy.mockClear();
+ it('requeries the GraphQL endpoint and updates the URL when the sort is changed', async () => {
+ findSort().vm.$emit('input', CREATED_ASC);
+
+ await nextTick();
- findSortControls().vm.$emit('sort:changed');
+ expect(queryMock.mock.calls).toEqual([
+ [expect.objectContaining({ sort: DEFAULT_SORT })],
+ [expect.objectContaining({ sort: DEFAULT_SORT })],
+ [expect.objectContaining({ sort: CREATED_ASC })],
+ [expect.objectContaining({ sort: CREATED_ASC })],
+ ]);
- expect(fetchReleasesSpy).toHaveBeenCalledTimes(1);
+ // URL manipulation is tested in more detail in the `describe` block below
+ expect(historyPushState).toHaveBeenCalled();
});
- });
- describe('"New release" button', () => {
- describe('when the user is allowed to create releases', () => {
- const newReleasePath = 'path/to/new/release/page';
+ it('does not requery the GraphQL endpoint or update the URL if the sort is updated to the same value', async () => {
+ findSort().vm.$emit('input', DEFAULT_SORT);
- beforeEach(() => {
- createComponent({ state: { newReleasePath } });
- });
+ await nextTick();
- expectNewReleaseButton(true);
+ expect(queryMock.mock.calls).toEqual([
+ [expect.objectContaining({ sort: DEFAULT_SORT })],
+ [expect.objectContaining({ sort: DEFAULT_SORT })],
+ ]);
- it('renders the button with the correct href', () => {
- expect(findNewReleaseButton().attributes('href')).toBe(newReleasePath);
- });
+ expect(historyPushState).not.toHaveBeenCalled();
});
+ });
- describe('when the user is not allowed to create releases', () => {
- beforeEach(() => {
- createComponent();
- });
+ describe('sorting + pagination interaction', () => {
+ const nonPaginationQueryParam = 'nonPaginationQueryParam';
- expectNewReleaseButton(false);
+ beforeEach(() => {
+ historyPushState.mockImplementation((newUrl) => {
+ mockQueryParams = Object.fromEntries(new URL(newUrl).searchParams);
+ });
});
- });
- describe("when the browser's back button is pressed", () => {
- beforeEach(() => {
- urlParams = {
- before: 'before_param_value',
- };
+ describe.each`
+ queryParamsBefore | paramName | paramInitialValue
+ ${{ before, nonPaginationQueryParam }} | ${'before'} | ${before}
+ ${{ after, nonPaginationQueryParam }} | ${'after'} | ${after}
+ `(
+ 'when the URL contains a "$paramName" pagination cursor',
+ ({ queryParamsBefore, paramName, paramInitialValue }) => {
+ beforeEach(async () => {
+ mockQueryParams = queryParamsBefore;
+ createComponent();
- createComponent();
+ findSort().vm.$emit('input', CREATED_ASC);
- fetchReleasesSpy.mockClear();
+ await nextTick();
+ });
- window.dispatchEvent(new PopStateEvent('popstate'));
- });
+ it(`resets the page's "${paramName}" pagination cursor when the sort is changed`, () => {
+ const firstRequestVariables = queryMock.mock.calls[0][0];
+ // Might be request #2 or #3, depending on the pagination direction
+ const mostRecentRequestVariables =
+ queryMock.mock.calls[queryMock.mock.calls.length - 1][0];
- it('calls the fetchRelease store method with the parameters from the URL query', () => {
- expect(fetchReleasesSpy).toHaveBeenCalledTimes(1);
- expect(fetchReleasesSpy).toHaveBeenCalledWith(expect.anything(), urlParams);
- });
+ expect(firstRequestVariables[paramName]).toBe(paramInitialValue);
+ expect(mostRecentRequestVariables[paramName]).toBeUndefined();
+ });
+
+ it(`updates the URL to not include the "${paramName}" URL query parameter`, () => {
+ expect(historyPushState).toHaveBeenCalledTimes(1);
+
+ const updatedUrlQueryParams = Object.fromEntries(
+ new URL(historyPushState.mock.calls[0][0]).searchParams,
+ );
+
+ expect(updatedUrlQueryParams[paramName]).toBeUndefined();
+ });
+ },
+ );
});
});
diff --git a/spec/frontend/releases/components/app_show_spec.js b/spec/frontend/releases/components/app_show_spec.js
index 41c9746a363..c2ea6900d6e 100644
--- a/spec/frontend/releases/components/app_show_spec.js
+++ b/spec/frontend/releases/components/app_show_spec.js
@@ -143,6 +143,12 @@ describe('Release show component', () => {
describe('when the request succeeded, but the returned "project.release" key was null', () => {
beforeEach(async () => {
+ // As we return a release as `null`, Apollo also throws an error to the console
+ // about the missing field. We need to suppress console.error in order to check
+ // that flash message was called
+
+ // eslint-disable-next-line no-console
+ console.error = jest.fn();
const apolloProvider = createMockApollo([
[
oneReleaseQuery,
diff --git a/spec/frontend/releases/components/releases_pagination_apollo_client_spec.js b/spec/frontend/releases/components/releases_pagination_apollo_client_spec.js
deleted file mode 100644
index a538afd5d38..00000000000
--- a/spec/frontend/releases/components/releases_pagination_apollo_client_spec.js
+++ /dev/null
@@ -1,126 +0,0 @@
-import { mountExtended } from 'helpers/vue_test_utils_helper';
-import { historyPushState } from '~/lib/utils/common_utils';
-import ReleasesPaginationApolloClient from '~/releases/components/releases_pagination_apollo_client.vue';
-
-jest.mock('~/lib/utils/common_utils', () => ({
- ...jest.requireActual('~/lib/utils/common_utils'),
- historyPushState: jest.fn(),
-}));
-
-describe('releases_pagination_apollo_client.vue', () => {
- const startCursor = 'startCursor';
- const endCursor = 'endCursor';
- let wrapper;
- let onPrev;
- let onNext;
-
- const createComponent = (pageInfo) => {
- onPrev = jest.fn();
- onNext = jest.fn();
-
- wrapper = mountExtended(ReleasesPaginationApolloClient, {
- propsData: {
- pageInfo,
- },
- listeners: {
- prev: onPrev,
- next: onNext,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- const singlePageInfo = {
- hasPreviousPage: false,
- hasNextPage: false,
- startCursor,
- endCursor,
- };
-
- const onlyNextPageInfo = {
- hasPreviousPage: false,
- hasNextPage: true,
- startCursor,
- endCursor,
- };
-
- const onlyPrevPageInfo = {
- hasPreviousPage: true,
- hasNextPage: false,
- startCursor,
- endCursor,
- };
-
- const prevAndNextPageInfo = {
- hasPreviousPage: true,
- hasNextPage: true,
- startCursor,
- endCursor,
- };
-
- const findPrevButton = () => wrapper.findByTestId('prevButton');
- const findNextButton = () => wrapper.findByTestId('nextButton');
-
- describe.each`
- description | pageInfo | prevEnabled | nextEnabled
- ${'when there is only one page of results'} | ${singlePageInfo} | ${false} | ${false}
- ${'when there is a next page, but not a previous page'} | ${onlyNextPageInfo} | ${false} | ${true}
- ${'when there is a previous page, but not a next page'} | ${onlyPrevPageInfo} | ${true} | ${false}
- ${'when there is both a previous and next page'} | ${prevAndNextPageInfo} | ${true} | ${true}
- `('component states', ({ description, pageInfo, prevEnabled, nextEnabled }) => {
- describe(description, () => {
- beforeEach(() => {
- createComponent(pageInfo);
- });
-
- it(`renders the "Prev" button as ${prevEnabled ? 'enabled' : 'disabled'}`, () => {
- expect(findPrevButton().attributes().disabled).toBe(prevEnabled ? undefined : 'disabled');
- });
-
- it(`renders the "Next" button as ${nextEnabled ? 'enabled' : 'disabled'}`, () => {
- expect(findNextButton().attributes().disabled).toBe(nextEnabled ? undefined : 'disabled');
- });
- });
- });
-
- describe('button behavior', () => {
- beforeEach(() => {
- createComponent(prevAndNextPageInfo);
- });
-
- describe('next button behavior', () => {
- beforeEach(() => {
- findNextButton().trigger('click');
- });
-
- it('emits an "next" event with the "after" cursor', () => {
- expect(onNext.mock.calls).toEqual([[endCursor]]);
- });
-
- it('calls historyPushState with the new URL', () => {
- expect(historyPushState.mock.calls).toEqual([
- [expect.stringContaining(`?after=${endCursor}`)],
- ]);
- });
- });
-
- describe('prev button behavior', () => {
- beforeEach(() => {
- findPrevButton().trigger('click');
- });
-
- it('emits an "prev" event with the "before" cursor', () => {
- expect(onPrev.mock.calls).toEqual([[startCursor]]);
- });
-
- it('calls historyPushState with the new URL', () => {
- expect(historyPushState.mock.calls).toEqual([
- [expect.stringContaining(`?before=${startCursor}`)],
- ]);
- });
- });
- });
-});
diff --git a/spec/frontend/releases/components/releases_pagination_spec.js b/spec/frontend/releases/components/releases_pagination_spec.js
index b8c69b0ea70..59be808c802 100644
--- a/spec/frontend/releases/components/releases_pagination_spec.js
+++ b/spec/frontend/releases/components/releases_pagination_spec.js
@@ -1,140 +1,94 @@
-import { GlKeysetPagination } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
-import Vue from 'vue';
-import Vuex from 'vuex';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import { historyPushState } from '~/lib/utils/common_utils';
import ReleasesPagination from '~/releases/components/releases_pagination.vue';
-import createStore from '~/releases/stores';
-import createIndexModule from '~/releases/stores/modules/index';
jest.mock('~/lib/utils/common_utils', () => ({
...jest.requireActual('~/lib/utils/common_utils'),
historyPushState: jest.fn(),
}));
-Vue.use(Vuex);
-
-describe('~/releases/components/releases_pagination.vue', () => {
+describe('releases_pagination.vue', () => {
+ const startCursor = 'startCursor';
+ const endCursor = 'endCursor';
let wrapper;
- let indexModule;
-
- const cursors = {
- startCursor: 'startCursor',
- endCursor: 'endCursor',
- };
-
- const projectPath = 'my/project';
+ let onPrev;
+ let onNext;
const createComponent = (pageInfo) => {
- indexModule = createIndexModule({ projectPath });
-
- indexModule.state.pageInfo = pageInfo;
-
- indexModule.actions.fetchReleases = jest.fn();
-
- wrapper = mount(ReleasesPagination, {
- store: createStore({
- modules: {
- index: indexModule,
- },
- featureFlags: {},
- }),
+ onPrev = jest.fn();
+ onNext = jest.fn();
+
+ wrapper = mountExtended(ReleasesPagination, {
+ propsData: {
+ pageInfo,
+ },
+ listeners: {
+ prev: onPrev,
+ next: onNext,
+ },
});
};
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
- const findGlKeysetPagination = () => wrapper.findComponent(GlKeysetPagination);
- const findPrevButton = () => findGlKeysetPagination().find('[data-testid="prevButton"]');
- const findNextButton = () => findGlKeysetPagination().find('[data-testid="nextButton"]');
-
- const expectDisabledPrev = () => {
- expect(findPrevButton().attributes().disabled).toBe('disabled');
+ const singlePageInfo = {
+ hasPreviousPage: false,
+ hasNextPage: false,
+ startCursor,
+ endCursor,
};
- const expectEnabledPrev = () => {
- expect(findPrevButton().attributes().disabled).toBe(undefined);
+
+ const onlyNextPageInfo = {
+ hasPreviousPage: false,
+ hasNextPage: true,
+ startCursor,
+ endCursor,
};
- const expectDisabledNext = () => {
- expect(findNextButton().attributes().disabled).toBe('disabled');
+
+ const onlyPrevPageInfo = {
+ hasPreviousPage: true,
+ hasNextPage: false,
+ startCursor,
+ endCursor,
};
- const expectEnabledNext = () => {
- expect(findNextButton().attributes().disabled).toBe(undefined);
+
+ const prevAndNextPageInfo = {
+ hasPreviousPage: true,
+ hasNextPage: true,
+ startCursor,
+ endCursor,
};
- describe('when there is only one page of results', () => {
- beforeEach(() => {
- createComponent({
- hasPreviousPage: false,
- hasNextPage: false,
+ const findPrevButton = () => wrapper.findByTestId('prevButton');
+ const findNextButton = () => wrapper.findByTestId('nextButton');
+
+ describe.each`
+ description | pageInfo | prevEnabled | nextEnabled
+ ${'when there is only one page of results'} | ${singlePageInfo} | ${false} | ${false}
+ ${'when there is a next page, but not a previous page'} | ${onlyNextPageInfo} | ${false} | ${true}
+ ${'when there is a previous page, but not a next page'} | ${onlyPrevPageInfo} | ${true} | ${false}
+ ${'when there is both a previous and next page'} | ${prevAndNextPageInfo} | ${true} | ${true}
+ `('component states', ({ description, pageInfo, prevEnabled, nextEnabled }) => {
+ describe(description, () => {
+ beforeEach(() => {
+ createComponent(pageInfo);
});
- });
-
- it('does not render a GlKeysetPagination', () => {
- expect(findGlKeysetPagination().exists()).toBe(false);
- });
- });
- describe('when there is a next page, but not a previous page', () => {
- beforeEach(() => {
- createComponent({
- hasPreviousPage: false,
- hasNextPage: true,
+ it(`renders the "Prev" button as ${prevEnabled ? 'enabled' : 'disabled'}`, () => {
+ expect(findPrevButton().attributes().disabled).toBe(prevEnabled ? undefined : 'disabled');
});
- });
-
- it('renders a disabled "Prev" button', () => {
- expectDisabledPrev();
- });
- it('renders an enabled "Next" button', () => {
- expectEnabledNext();
- });
- });
-
- describe('when there is a previous page, but not a next page', () => {
- beforeEach(() => {
- createComponent({
- hasPreviousPage: true,
- hasNextPage: false,
- });
- });
-
- it('renders a enabled "Prev" button', () => {
- expectEnabledPrev();
- });
-
- it('renders an disabled "Next" button', () => {
- expectDisabledNext();
- });
- });
-
- describe('when there is both a previous page and a next page', () => {
- beforeEach(() => {
- createComponent({
- hasPreviousPage: true,
- hasNextPage: true,
+ it(`renders the "Next" button as ${nextEnabled ? 'enabled' : 'disabled'}`, () => {
+ expect(findNextButton().attributes().disabled).toBe(nextEnabled ? undefined : 'disabled');
});
});
-
- it('renders a enabled "Prev" button', () => {
- expectEnabledPrev();
- });
-
- it('renders an enabled "Next" button', () => {
- expectEnabledNext();
- });
});
describe('button behavior', () => {
beforeEach(() => {
- createComponent({
- hasPreviousPage: true,
- hasNextPage: true,
- ...cursors,
- });
+ createComponent(prevAndNextPageInfo);
});
describe('next button behavior', () => {
@@ -142,33 +96,29 @@ describe('~/releases/components/releases_pagination.vue', () => {
findNextButton().trigger('click');
});
- it('calls fetchReleases with the correct after cursor', () => {
- expect(indexModule.actions.fetchReleases.mock.calls).toEqual([
- [expect.anything(), { after: cursors.endCursor }],
- ]);
+ it('emits an "next" event with the "after" cursor', () => {
+ expect(onNext.mock.calls).toEqual([[endCursor]]);
});
it('calls historyPushState with the new URL', () => {
expect(historyPushState.mock.calls).toEqual([
- [expect.stringContaining(`?after=${cursors.endCursor}`)],
+ [expect.stringContaining(`?after=${endCursor}`)],
]);
});
});
- describe('previous button behavior', () => {
+ describe('prev button behavior', () => {
beforeEach(() => {
findPrevButton().trigger('click');
});
- it('calls fetchReleases with the correct before cursor', () => {
- expect(indexModule.actions.fetchReleases.mock.calls).toEqual([
- [expect.anything(), { before: cursors.startCursor }],
- ]);
+ it('emits an "prev" event with the "before" cursor', () => {
+ expect(onPrev.mock.calls).toEqual([[startCursor]]);
});
it('calls historyPushState with the new URL', () => {
expect(historyPushState.mock.calls).toEqual([
- [expect.stringContaining(`?before=${cursors.startCursor}`)],
+ [expect.stringContaining(`?before=${startCursor}`)],
]);
});
});
diff --git a/spec/frontend/releases/components/releases_sort_apollo_client_spec.js b/spec/frontend/releases/components/releases_sort_apollo_client_spec.js
deleted file mode 100644
index d93a932af01..00000000000
--- a/spec/frontend/releases/components/releases_sort_apollo_client_spec.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import { GlSorting, GlSortingItem } from '@gitlab/ui';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import ReleasesSortApolloClient from '~/releases/components/releases_sort_apollo_client.vue';
-import { RELEASED_AT_ASC, RELEASED_AT_DESC, CREATED_ASC, CREATED_DESC } from '~/releases/constants';
-
-describe('releases_sort_apollo_client.vue', () => {
- let wrapper;
-
- const createComponent = (valueProp = RELEASED_AT_ASC) => {
- wrapper = shallowMountExtended(ReleasesSortApolloClient, {
- propsData: {
- value: valueProp,
- },
- stubs: {
- GlSortingItem,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- const findSorting = () => wrapper.findComponent(GlSorting);
- const findSortingItems = () => wrapper.findAllComponents(GlSortingItem);
- const findReleasedDateItem = () =>
- findSortingItems().wrappers.find((item) => item.text() === 'Released date');
- const findCreatedDateItem = () =>
- findSortingItems().wrappers.find((item) => item.text() === 'Created date');
- const getSortingItemsInfo = () =>
- findSortingItems().wrappers.map((item) => ({
- label: item.text(),
- active: item.attributes().active === 'true',
- }));
-
- describe.each`
- valueProp | text | isAscending | items
- ${RELEASED_AT_ASC} | ${'Released date'} | ${true} | ${[{ label: 'Released date', active: true }, { label: 'Created date', active: false }]}
- ${RELEASED_AT_DESC} | ${'Released date'} | ${false} | ${[{ label: 'Released date', active: true }, { label: 'Created date', active: false }]}
- ${CREATED_ASC} | ${'Created date'} | ${true} | ${[{ label: 'Released date', active: false }, { label: 'Created date', active: true }]}
- ${CREATED_DESC} | ${'Created date'} | ${false} | ${[{ label: 'Released date', active: false }, { label: 'Created date', active: true }]}
- `('component states', ({ valueProp, text, isAscending, items }) => {
- beforeEach(() => {
- createComponent(valueProp);
- });
-
- it(`when the sort is ${valueProp}, provides the GlSorting with the props text="${text}" and isAscending=${isAscending}`, () => {
- expect(findSorting().props()).toEqual(
- expect.objectContaining({
- text,
- isAscending,
- }),
- );
- });
-
- it(`when the sort is ${valueProp}, renders the expected dropdown items`, () => {
- expect(getSortingItemsInfo()).toEqual(items);
- });
- });
-
- const clickReleasedDateItem = () => findReleasedDateItem().vm.$emit('click');
- const clickCreatedDateItem = () => findCreatedDateItem().vm.$emit('click');
- const clickSortDirectionButton = () => findSorting().vm.$emit('sortDirectionChange');
-
- const releasedAtDropdownItemDescription = 'released at dropdown item';
- const createdAtDropdownItemDescription = 'created at dropdown item';
- const sortDirectionButtonDescription = 'sort direction button';
-
- describe.each`
- initialValueProp | itemClickFn | itemToClickDescription | emittedEvent
- ${RELEASED_AT_ASC} | ${clickReleasedDateItem} | ${releasedAtDropdownItemDescription} | ${undefined}
- ${RELEASED_AT_ASC} | ${clickCreatedDateItem} | ${createdAtDropdownItemDescription} | ${CREATED_ASC}
- ${RELEASED_AT_ASC} | ${clickSortDirectionButton} | ${sortDirectionButtonDescription} | ${RELEASED_AT_DESC}
- ${RELEASED_AT_DESC} | ${clickReleasedDateItem} | ${releasedAtDropdownItemDescription} | ${undefined}
- ${RELEASED_AT_DESC} | ${clickCreatedDateItem} | ${createdAtDropdownItemDescription} | ${CREATED_DESC}
- ${RELEASED_AT_DESC} | ${clickSortDirectionButton} | ${sortDirectionButtonDescription} | ${RELEASED_AT_ASC}
- ${CREATED_ASC} | ${clickReleasedDateItem} | ${releasedAtDropdownItemDescription} | ${RELEASED_AT_ASC}
- ${CREATED_ASC} | ${clickCreatedDateItem} | ${createdAtDropdownItemDescription} | ${undefined}
- ${CREATED_ASC} | ${clickSortDirectionButton} | ${sortDirectionButtonDescription} | ${CREATED_DESC}
- ${CREATED_DESC} | ${clickReleasedDateItem} | ${releasedAtDropdownItemDescription} | ${RELEASED_AT_DESC}
- ${CREATED_DESC} | ${clickCreatedDateItem} | ${createdAtDropdownItemDescription} | ${undefined}
- ${CREATED_DESC} | ${clickSortDirectionButton} | ${sortDirectionButtonDescription} | ${CREATED_ASC}
- `('input event', ({ initialValueProp, itemClickFn, itemToClickDescription, emittedEvent }) => {
- beforeEach(() => {
- createComponent(initialValueProp);
- itemClickFn();
- });
-
- it(`emits ${
- emittedEvent || 'nothing'
- } when value prop is ${initialValueProp} and the ${itemToClickDescription} is clicked`, () => {
- expect(wrapper.emitted().input?.[0]?.[0]).toEqual(emittedEvent);
- });
- });
-
- describe('prop validation', () => {
- it('validates that the `value` prop is one of the expected sort strings', () => {
- expect(() => {
- createComponent('not a valid value');
- }).toThrow('Invalid prop: custom validator check failed');
- });
- });
-});
diff --git a/spec/frontend/releases/components/releases_sort_spec.js b/spec/frontend/releases/components/releases_sort_spec.js
index 7774532bc12..c6e1846d252 100644
--- a/spec/frontend/releases/components/releases_sort_spec.js
+++ b/spec/frontend/releases/components/releases_sort_spec.js
@@ -1,65 +1,103 @@
import { GlSorting, GlSortingItem } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import Vuex from 'vuex';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ReleasesSort from '~/releases/components/releases_sort.vue';
-import createStore from '~/releases/stores';
-import createIndexModule from '~/releases/stores/modules/index';
+import { RELEASED_AT_ASC, RELEASED_AT_DESC, CREATED_ASC, CREATED_DESC } from '~/releases/constants';
-Vue.use(Vuex);
-
-describe('~/releases/components/releases_sort.vue', () => {
+describe('releases_sort.vue', () => {
let wrapper;
- let store;
- let indexModule;
- const projectId = 8;
-
- const createComponent = () => {
- indexModule = createIndexModule({ projectId });
- store = createStore({
- modules: {
- index: indexModule,
+ const createComponent = (valueProp = RELEASED_AT_ASC) => {
+ wrapper = shallowMountExtended(ReleasesSort, {
+ propsData: {
+ value: valueProp,
},
- });
-
- store.dispatch = jest.fn();
-
- wrapper = shallowMount(ReleasesSort, {
- store,
stubs: {
GlSortingItem,
},
});
};
- const findReleasesSorting = () => wrapper.find(GlSorting);
- const findSortingItems = () => wrapper.findAll(GlSortingItem);
-
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
- beforeEach(() => {
- createComponent();
- });
+ const findSorting = () => wrapper.findComponent(GlSorting);
+ const findSortingItems = () => wrapper.findAllComponents(GlSortingItem);
+ const findReleasedDateItem = () =>
+ findSortingItems().wrappers.find((item) => item.text() === 'Released date');
+ const findCreatedDateItem = () =>
+ findSortingItems().wrappers.find((item) => item.text() === 'Created date');
+ const getSortingItemsInfo = () =>
+ findSortingItems().wrappers.map((item) => ({
+ label: item.text(),
+ active: item.attributes().active === 'true',
+ }));
+
+ describe.each`
+ valueProp | text | isAscending | items
+ ${RELEASED_AT_ASC} | ${'Released date'} | ${true} | ${[{ label: 'Released date', active: true }, { label: 'Created date', active: false }]}
+ ${RELEASED_AT_DESC} | ${'Released date'} | ${false} | ${[{ label: 'Released date', active: true }, { label: 'Created date', active: false }]}
+ ${CREATED_ASC} | ${'Created date'} | ${true} | ${[{ label: 'Released date', active: false }, { label: 'Created date', active: true }]}
+ ${CREATED_DESC} | ${'Created date'} | ${false} | ${[{ label: 'Released date', active: false }, { label: 'Created date', active: true }]}
+ `('component states', ({ valueProp, text, isAscending, items }) => {
+ beforeEach(() => {
+ createComponent(valueProp);
+ });
- it('has all the sortable items', () => {
- expect(findSortingItems()).toHaveLength(wrapper.vm.sortOptions.length);
+ it(`when the sort is ${valueProp}, provides the GlSorting with the props text="${text}" and isAscending=${isAscending}`, () => {
+ expect(findSorting().props()).toEqual(
+ expect.objectContaining({
+ text,
+ isAscending,
+ }),
+ );
+ });
+
+ it(`when the sort is ${valueProp}, renders the expected dropdown items`, () => {
+ expect(getSortingItemsInfo()).toEqual(items);
+ });
});
- it('on sort change set sorting in vuex and emit event', () => {
- findReleasesSorting().vm.$emit('sortDirectionChange');
- expect(store.dispatch).toHaveBeenCalledWith('index/setSorting', { sort: 'asc' });
- expect(wrapper.emitted('sort:changed')).toBeTruthy();
+ const clickReleasedDateItem = () => findReleasedDateItem().vm.$emit('click');
+ const clickCreatedDateItem = () => findCreatedDateItem().vm.$emit('click');
+ const clickSortDirectionButton = () => findSorting().vm.$emit('sortDirectionChange');
+
+ const releasedAtDropdownItemDescription = 'released at dropdown item';
+ const createdAtDropdownItemDescription = 'created at dropdown item';
+ const sortDirectionButtonDescription = 'sort direction button';
+
+ describe.each`
+ initialValueProp | itemClickFn | itemToClickDescription | emittedEvent
+ ${RELEASED_AT_ASC} | ${clickReleasedDateItem} | ${releasedAtDropdownItemDescription} | ${undefined}
+ ${RELEASED_AT_ASC} | ${clickCreatedDateItem} | ${createdAtDropdownItemDescription} | ${CREATED_ASC}
+ ${RELEASED_AT_ASC} | ${clickSortDirectionButton} | ${sortDirectionButtonDescription} | ${RELEASED_AT_DESC}
+ ${RELEASED_AT_DESC} | ${clickReleasedDateItem} | ${releasedAtDropdownItemDescription} | ${undefined}
+ ${RELEASED_AT_DESC} | ${clickCreatedDateItem} | ${createdAtDropdownItemDescription} | ${CREATED_DESC}
+ ${RELEASED_AT_DESC} | ${clickSortDirectionButton} | ${sortDirectionButtonDescription} | ${RELEASED_AT_ASC}
+ ${CREATED_ASC} | ${clickReleasedDateItem} | ${releasedAtDropdownItemDescription} | ${RELEASED_AT_ASC}
+ ${CREATED_ASC} | ${clickCreatedDateItem} | ${createdAtDropdownItemDescription} | ${undefined}
+ ${CREATED_ASC} | ${clickSortDirectionButton} | ${sortDirectionButtonDescription} | ${CREATED_DESC}
+ ${CREATED_DESC} | ${clickReleasedDateItem} | ${releasedAtDropdownItemDescription} | ${RELEASED_AT_DESC}
+ ${CREATED_DESC} | ${clickCreatedDateItem} | ${createdAtDropdownItemDescription} | ${undefined}
+ ${CREATED_DESC} | ${clickSortDirectionButton} | ${sortDirectionButtonDescription} | ${CREATED_ASC}
+ `('input event', ({ initialValueProp, itemClickFn, itemToClickDescription, emittedEvent }) => {
+ beforeEach(() => {
+ createComponent(initialValueProp);
+ itemClickFn();
+ });
+
+ it(`emits ${
+ emittedEvent || 'nothing'
+ } when value prop is ${initialValueProp} and the ${itemToClickDescription} is clicked`, () => {
+ expect(wrapper.emitted().input?.[0]?.[0]).toEqual(emittedEvent);
+ });
});
- it('on sort item click set sorting and emit event', () => {
- const item = findSortingItems().at(0);
- const { orderBy } = wrapper.vm.sortOptions[0];
- item.vm.$emit('click');
- expect(store.dispatch).toHaveBeenCalledWith('index/setSorting', { orderBy });
- expect(wrapper.emitted('sort:changed')).toBeTruthy();
+ describe('prop validation', () => {
+ it('validates that the `value` prop is one of the expected sort strings', () => {
+ expect(() => {
+ createComponent('not a valid value');
+ }).toThrow('Invalid prop: custom validator check failed');
+ });
});
});
diff --git a/spec/frontend/releases/stores/modules/list/actions_spec.js b/spec/frontend/releases/stores/modules/list/actions_spec.js
deleted file mode 100644
index 91406f7e2f4..00000000000
--- a/spec/frontend/releases/stores/modules/list/actions_spec.js
+++ /dev/null
@@ -1,197 +0,0 @@
-import { cloneDeep } from 'lodash';
-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';
-import {
- fetchReleases,
- receiveReleasesError,
- setSorting,
-} from '~/releases/stores/modules/index/actions';
-import * as types from '~/releases/stores/modules/index/mutation_types';
-import createState from '~/releases/stores/modules/index/state';
-import { gqClient, convertAllReleasesGraphQLResponse } from '~/releases/util';
-
-describe('Releases State actions', () => {
- let mockedState;
- let graphqlReleasesResponse;
-
- const projectPath = 'root/test-project';
- const projectId = 19;
- const before = 'testBeforeCursor';
- const after = 'testAfterCursor';
-
- beforeEach(() => {
- mockedState = {
- ...createState({
- projectId,
- projectPath,
- }),
- };
-
- graphqlReleasesResponse = cloneDeep(originalGraphqlReleasesResponse);
- });
-
- describe('fetchReleases', () => {
- describe('GraphQL query variables', () => {
- let vuexParams;
-
- beforeEach(() => {
- jest.spyOn(gqClient, 'query');
-
- vuexParams = { dispatch: jest.fn(), commit: jest.fn(), state: mockedState };
- });
-
- describe('when neither a before nor an after parameter is provided', () => {
- beforeEach(() => {
- fetchReleases(vuexParams, { before: undefined, after: undefined });
- });
-
- it('makes a GraphQl query with a first variable', () => {
- expect(gqClient.query).toHaveBeenCalledWith({
- query: allReleasesQuery,
- variables: { fullPath: projectPath, first: PAGE_SIZE, sort: 'RELEASED_AT_DESC' },
- });
- });
- });
-
- describe('when only a before parameter is provided', () => {
- beforeEach(() => {
- fetchReleases(vuexParams, { before, after: undefined });
- });
-
- it('makes a GraphQl query with last and before variables', () => {
- expect(gqClient.query).toHaveBeenCalledWith({
- query: allReleasesQuery,
- variables: { fullPath: projectPath, last: PAGE_SIZE, before, sort: 'RELEASED_AT_DESC' },
- });
- });
- });
-
- describe('when only an after parameter is provided', () => {
- beforeEach(() => {
- fetchReleases(vuexParams, { before: undefined, after });
- });
-
- it('makes a GraphQl query with first and after variables', () => {
- expect(gqClient.query).toHaveBeenCalledWith({
- query: allReleasesQuery,
- variables: { fullPath: projectPath, first: PAGE_SIZE, after, sort: 'RELEASED_AT_DESC' },
- });
- });
- });
-
- describe('when both before and after parameters are provided', () => {
- it('throws an error', () => {
- const callFetchReleases = () => {
- fetchReleases(vuexParams, { before, after });
- };
-
- expect(callFetchReleases).toThrowError(
- 'Both a `before` and an `after` parameter were provided to fetchReleases. These parameters cannot be used together.',
- );
- });
- });
-
- describe('when the sort parameters are provided', () => {
- it.each`
- sort | orderBy | ReleaseSort
- ${'asc'} | ${'released_at'} | ${'RELEASED_AT_ASC'}
- ${'desc'} | ${'released_at'} | ${'RELEASED_AT_DESC'}
- ${'asc'} | ${'created_at'} | ${'CREATED_ASC'}
- ${'desc'} | ${'created_at'} | ${'CREATED_DESC'}
- `(
- 'correctly sets $ReleaseSort based on $sort and $orderBy',
- ({ sort, orderBy, ReleaseSort }) => {
- mockedState.sorting.sort = sort;
- mockedState.sorting.orderBy = orderBy;
-
- fetchReleases(vuexParams, { before: undefined, after: undefined });
-
- expect(gqClient.query).toHaveBeenCalledWith({
- query: allReleasesQuery,
- variables: { fullPath: projectPath, first: PAGE_SIZE, sort: ReleaseSort },
- });
- },
- );
- });
- });
-
- describe('when the request is successful', () => {
- beforeEach(() => {
- jest.spyOn(gqClient, 'query').mockResolvedValue(graphqlReleasesResponse);
- });
-
- it(`commits ${types.REQUEST_RELEASES} and ${types.RECEIVE_RELEASES_SUCCESS}`, () => {
- const convertedResponse = convertAllReleasesGraphQLResponse(graphqlReleasesResponse);
-
- return testAction(
- fetchReleases,
- {},
- mockedState,
- [
- {
- type: types.REQUEST_RELEASES,
- },
- {
- type: types.RECEIVE_RELEASES_SUCCESS,
- payload: {
- data: convertedResponse.data,
- pageInfo: convertedResponse.paginationInfo,
- },
- },
- ],
- [],
- );
- });
- });
-
- describe('when the request fails', () => {
- beforeEach(() => {
- jest.spyOn(gqClient, 'query').mockRejectedValue(new Error('Something went wrong!'));
- });
-
- it(`commits ${types.REQUEST_RELEASES} and dispatch receiveReleasesError`, () => {
- return testAction(
- fetchReleases,
- {},
- mockedState,
- [
- {
- type: types.REQUEST_RELEASES,
- },
- ],
- [
- {
- type: 'receiveReleasesError',
- },
- ],
- );
- });
- });
- });
-
- describe('receiveReleasesError', () => {
- it('should commit RECEIVE_RELEASES_ERROR mutation', () => {
- return testAction(
- receiveReleasesError,
- null,
- mockedState,
- [{ type: types.RECEIVE_RELEASES_ERROR }],
- [],
- );
- });
- });
-
- describe('setSorting', () => {
- it('should commit SET_SORTING', () => {
- return testAction(
- setSorting,
- { orderBy: 'released_at', sort: 'asc' },
- null,
- [{ type: types.SET_SORTING, payload: { orderBy: 'released_at', sort: 'asc' } }],
- [],
- );
- });
- });
-});
diff --git a/spec/frontend/releases/stores/modules/list/helpers.js b/spec/frontend/releases/stores/modules/list/helpers.js
deleted file mode 100644
index 6669f44aa95..00000000000
--- a/spec/frontend/releases/stores/modules/list/helpers.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import state from '~/releases/stores/modules/index/state';
-
-export const resetStore = (store) => {
- store.replaceState(state());
-};
diff --git a/spec/frontend/releases/stores/modules/list/mutations_spec.js b/spec/frontend/releases/stores/modules/list/mutations_spec.js
deleted file mode 100644
index 49e324c28a5..00000000000
--- a/spec/frontend/releases/stores/modules/list/mutations_spec.js
+++ /dev/null
@@ -1,81 +0,0 @@
-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 originalReleases = [originalRelease];
-
-describe('Releases Store Mutations', () => {
- let stateCopy;
- let pageInfo;
- let releases;
-
- beforeEach(() => {
- stateCopy = createState({});
- pageInfo = convertAllReleasesGraphQLResponse(graphqlReleasesResponse).paginationInfo;
- releases = convertObjectPropsToCamelCase(originalReleases, { deep: true });
- });
-
- describe('REQUEST_RELEASES', () => {
- it('sets isLoading to true', () => {
- mutations[types.REQUEST_RELEASES](stateCopy);
-
- expect(stateCopy.isLoading).toEqual(true);
- });
- });
-
- describe('RECEIVE_RELEASES_SUCCESS', () => {
- beforeEach(() => {
- mutations[types.RECEIVE_RELEASES_SUCCESS](stateCopy, {
- pageInfo,
- data: releases,
- });
- });
-
- it('sets is loading to false', () => {
- expect(stateCopy.isLoading).toEqual(false);
- });
-
- it('sets hasError to false', () => {
- expect(stateCopy.hasError).toEqual(false);
- });
-
- it('sets data', () => {
- expect(stateCopy.releases).toEqual(releases);
- });
-
- it('sets pageInfo', () => {
- expect(stateCopy.pageInfo).toEqual(pageInfo);
- });
- });
-
- describe('RECEIVE_RELEASES_ERROR', () => {
- it('resets data', () => {
- mutations[types.RECEIVE_RELEASES_SUCCESS](stateCopy, {
- pageInfo,
- data: releases,
- });
-
- mutations[types.RECEIVE_RELEASES_ERROR](stateCopy);
-
- expect(stateCopy.isLoading).toEqual(false);
- expect(stateCopy.releases).toEqual([]);
- expect(stateCopy.pageInfo).toEqual({});
- });
- });
-
- describe('SET_SORTING', () => {
- it('should merge the sorting object with sort value', () => {
- mutations[types.SET_SORTING](stateCopy, { sort: 'asc' });
- expect(stateCopy.sorting).toEqual({ ...stateCopy.sorting, sort: 'asc' });
- });
-
- it('should merge the sorting object with order_by value', () => {
- mutations[types.SET_SORTING](stateCopy, { orderBy: 'created_at' });
- expect(stateCopy.sorting).toEqual({ ...stateCopy.sorting, orderBy: 'created_at' });
- });
- });
-});
diff --git a/spec/frontend/reports/accessibility_report/store/actions_spec.js b/spec/frontend/reports/accessibility_report/store/actions_spec.js
index 46dbe1ff7a1..bab6c4905a7 100644
--- a/spec/frontend/reports/accessibility_report/store/actions_spec.js
+++ b/spec/frontend/reports/accessibility_report/store/actions_spec.js
@@ -17,16 +17,15 @@ describe('Accessibility Reports actions', () => {
});
describe('setEndpoints', () => {
- it('should commit SET_ENDPOINTS mutation', (done) => {
+ it('should commit SET_ENDPOINTS mutation', () => {
const endpoint = 'endpoint.json';
- testAction(
+ return testAction(
actions.setEndpoint,
endpoint,
localState,
[{ type: types.SET_ENDPOINT, payload: endpoint }],
[],
- done,
);
});
});
@@ -46,11 +45,11 @@ describe('Accessibility Reports actions', () => {
});
describe('success', () => {
- it('should commit REQUEST_REPORT mutation and dispatch receiveReportSuccess', (done) => {
+ it('should commit REQUEST_REPORT mutation and dispatch receiveReportSuccess', () => {
const data = { report: { summary: {} } };
mock.onGet(`${TEST_HOST}/endpoint.json`).reply(200, data);
- testAction(
+ return testAction(
actions.fetchReport,
null,
localState,
@@ -61,60 +60,55 @@ describe('Accessibility Reports actions', () => {
type: 'receiveReportSuccess',
},
],
- done,
);
});
});
describe('error', () => {
- it('should commit REQUEST_REPORT and RECEIVE_REPORT_ERROR mutations', (done) => {
+ it('should commit REQUEST_REPORT and RECEIVE_REPORT_ERROR mutations', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`).reply(500);
- testAction(
+ return testAction(
actions.fetchReport,
null,
localState,
[{ type: types.REQUEST_REPORT }],
[{ type: 'receiveReportError' }],
- done,
);
});
});
});
describe('receiveReportSuccess', () => {
- it('should commit RECEIVE_REPORT_SUCCESS mutation with 200', (done) => {
- testAction(
+ it('should commit RECEIVE_REPORT_SUCCESS mutation with 200', () => {
+ return testAction(
actions.receiveReportSuccess,
{ status: 200, data: mockReport },
localState,
[{ type: types.RECEIVE_REPORT_SUCCESS, payload: mockReport }],
[{ type: 'stopPolling' }],
- done,
);
});
- it('should not commit RECEIVE_REPORTS_SUCCESS mutation with 204', (done) => {
- testAction(
+ it('should not commit RECEIVE_REPORTS_SUCCESS mutation with 204', () => {
+ return testAction(
actions.receiveReportSuccess,
{ status: 204, data: mockReport },
localState,
[],
[],
- done,
);
});
});
describe('receiveReportError', () => {
- it('should commit RECEIVE_REPORT_ERROR mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_REPORT_ERROR mutation', () => {
+ return testAction(
actions.receiveReportError,
null,
localState,
[{ type: types.RECEIVE_REPORT_ERROR }],
[{ type: 'stopPolling' }],
- done,
);
});
});
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 c548007a8a6..17f07ac2b8f 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
@@ -51,6 +51,7 @@ describe('code quality issue body issue body', () => {
${'blocker'} | ${'text-danger-800'} | ${'severity-critical'}
${'unknown'} | ${'text-secondary-400'} | ${'severity-unknown'}
${'invalid'} | ${'text-secondary-400'} | ${'severity-unknown'}
+ ${undefined} | ${'text-secondary-400'} | ${'severity-unknown'}
`(
'renders correct icon for "$severity" severity rating',
({ severity, iconClass, iconName }) => {
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 1f923f41274..b61b65c2713 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
@@ -135,7 +135,7 @@ describe('Grouped code quality reports app', () => {
});
it('does not render a help icon', () => {
- expect(findWidget().find('[data-testid="question-icon"]').exists()).toBe(false);
+ expect(findWidget().find('[data-testid="question-o-icon"]').exists()).toBe(false);
});
describe('when base report was not found', () => {
@@ -144,7 +144,7 @@ describe('Grouped code quality reports app', () => {
});
it('renders a help icon with more information', () => {
- expect(findWidget().find('[data-testid="question-icon"]').exists()).toBe(true);
+ expect(findWidget().find('[data-testid="question-o-icon"]').exists()).toBe(true);
});
});
});
diff --git a/spec/frontend/reports/codequality_report/store/actions_spec.js b/spec/frontend/reports/codequality_report/store/actions_spec.js
index 1821390786b..71f1a0f4de0 100644
--- a/spec/frontend/reports/codequality_report/store/actions_spec.js
+++ b/spec/frontend/reports/codequality_report/store/actions_spec.js
@@ -23,7 +23,7 @@ describe('Codequality Reports actions', () => {
});
describe('setPaths', () => {
- it('should commit SET_PATHS mutation', (done) => {
+ it('should commit SET_PATHS mutation', () => {
const paths = {
baseBlobPath: 'baseBlobPath',
headBlobPath: 'headBlobPath',
@@ -31,13 +31,12 @@ describe('Codequality Reports actions', () => {
helpPath: 'codequalityHelpPath',
};
- testAction(
+ return testAction(
actions.setPaths,
paths,
localState,
[{ type: types.SET_PATHS, payload: paths }],
[],
- done,
);
});
});
@@ -56,10 +55,10 @@ describe('Codequality Reports actions', () => {
});
describe('on success', () => {
- it('commits REQUEST_REPORTS and dispatches receiveReportsSuccess', (done) => {
+ it('commits REQUEST_REPORTS and dispatches receiveReportsSuccess', () => {
mock.onGet(endpoint).reply(200, reportIssues);
- testAction(
+ return testAction(
actions.fetchReports,
null,
localState,
@@ -70,51 +69,48 @@ describe('Codequality Reports actions', () => {
type: 'receiveReportsSuccess',
},
],
- done,
);
});
});
describe('on error', () => {
- it('commits REQUEST_REPORTS and dispatches receiveReportsError', (done) => {
+ it('commits REQUEST_REPORTS and dispatches receiveReportsError', () => {
mock.onGet(endpoint).reply(500);
- testAction(
+ return testAction(
actions.fetchReports,
null,
localState,
[{ type: types.REQUEST_REPORTS }],
[{ type: 'receiveReportsError', payload: expect.any(Error) }],
- done,
);
});
});
describe('when base report is not found', () => {
- it('commits REQUEST_REPORTS and dispatches receiveReportsError', (done) => {
+ it('commits REQUEST_REPORTS and dispatches receiveReportsError', () => {
const data = { status: STATUS_NOT_FOUND };
mock.onGet(`${TEST_HOST}/codequality_reports.json`).reply(200, data);
- testAction(
+ return testAction(
actions.fetchReports,
null,
localState,
[{ type: types.REQUEST_REPORTS }],
[{ type: 'receiveReportsError', payload: data }],
- done,
);
});
});
describe('while waiting for report results', () => {
- it('continues polling until it receives data', (done) => {
+ it('continues polling until it receives data', () => {
mock
.onGet(endpoint)
.replyOnce(204, undefined, pollIntervalHeader)
.onGet(endpoint)
.reply(200, reportIssues);
- Promise.all([
+ return Promise.all([
testAction(
actions.fetchReports,
null,
@@ -126,7 +122,6 @@ describe('Codequality Reports actions', () => {
type: 'receiveReportsSuccess',
},
],
- done,
),
axios
// wait for initial NO_CONTENT response to be fulfilled
@@ -134,24 +129,23 @@ describe('Codequality Reports actions', () => {
.then(() => {
jest.advanceTimersByTime(pollInterval);
}),
- ]).catch(done.fail);
+ ]);
});
- it('continues polling until it receives an error', (done) => {
+ it('continues polling until it receives an error', () => {
mock
.onGet(endpoint)
.replyOnce(204, undefined, pollIntervalHeader)
.onGet(endpoint)
.reply(500);
- Promise.all([
+ return Promise.all([
testAction(
actions.fetchReports,
null,
localState,
[{ type: types.REQUEST_REPORTS }],
[{ type: 'receiveReportsError', payload: expect.any(Error) }],
- done,
),
axios
// wait for initial NO_CONTENT response to be fulfilled
@@ -159,35 +153,33 @@ describe('Codequality Reports actions', () => {
.then(() => {
jest.advanceTimersByTime(pollInterval);
}),
- ]).catch(done.fail);
+ ]);
});
});
});
describe('receiveReportsSuccess', () => {
- it('commits RECEIVE_REPORTS_SUCCESS', (done) => {
+ it('commits RECEIVE_REPORTS_SUCCESS', () => {
const data = { issues: [] };
- testAction(
+ return testAction(
actions.receiveReportsSuccess,
data,
localState,
[{ type: types.RECEIVE_REPORTS_SUCCESS, payload: data }],
[],
- done,
);
});
});
describe('receiveReportsError', () => {
- it('commits RECEIVE_REPORTS_ERROR', (done) => {
- testAction(
+ it('commits RECEIVE_REPORTS_ERROR', () => {
+ return testAction(
actions.receiveReportsError,
null,
localState,
[{ type: types.RECEIVE_REPORTS_ERROR, payload: null }],
[],
- done,
);
});
});
diff --git a/spec/frontend/reports/components/report_section_spec.js b/spec/frontend/reports/components/report_section_spec.js
index f9eb6dd05f3..888b49f3e0c 100644
--- a/spec/frontend/reports/components/report_section_spec.js
+++ b/spec/frontend/reports/components/report_section_spec.js
@@ -2,6 +2,7 @@ import { mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import mountComponent, { mountComponentWithSlots } from 'helpers/vue_mount_component_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import HelpPopover from '~/vue_shared/components/help_popover.vue';
import reportSection from '~/reports/components/report_section.vue';
describe('Report section', () => {
@@ -9,6 +10,7 @@ describe('Report section', () => {
let wrapper;
const ReportSection = Vue.extend(reportSection);
const findCollapseButton = () => wrapper.findByTestId('report-section-expand-button');
+ const findPopover = () => wrapper.findComponent(HelpPopover);
const resolvedIssues = [
{
@@ -269,4 +271,33 @@ describe('Report section', () => {
expect(vm.$el.textContent.trim()).not.toContain('This is a success');
});
});
+
+ describe('help popover', () => {
+ describe('when popover options are defined', () => {
+ const options = {
+ title: 'foo',
+ content: 'bar',
+ };
+
+ beforeEach(() => {
+ createComponent({
+ popoverOptions: options,
+ });
+ });
+
+ it('popover is shown with options', () => {
+ expect(findPopover().props('options')).toEqual(options);
+ });
+ });
+
+ describe('when popover options are not defined', () => {
+ beforeEach(() => {
+ createComponent({ popoverOptions: {} });
+ });
+
+ it('popover is not shown', () => {
+ expect(findPopover().exists()).toBe(false);
+ });
+ });
+ });
});
diff --git a/spec/frontend/reports/components/summary_row_spec.js b/spec/frontend/reports/components/summary_row_spec.js
index 04d9d10dcd2..778660d9e44 100644
--- a/spec/frontend/reports/components/summary_row_spec.js
+++ b/spec/frontend/reports/components/summary_row_spec.js
@@ -1,25 +1,26 @@
import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import HelpPopover from '~/vue_shared/components/help_popover.vue';
import SummaryRow from '~/reports/components/summary_row.vue';
describe('Summary row', () => {
let wrapper;
- const props = {
- summary: 'SAST detected 1 new vulnerability and 1 fixed vulnerability',
- popoverOptions: {
- title: 'Static Application Security Testing (SAST)',
- content: '<a>Learn more about SAST</a>',
- },
- statusIcon: 'warning',
+ const summary = 'SAST detected 1 new vulnerability and 1 fixed vulnerability';
+ const popoverOptions = {
+ title: 'Static Application Security Testing (SAST)',
+ content: '<a>Learn more about SAST</a>',
};
+ const statusIcon = 'warning';
- const createComponent = ({ propsData = {}, slots = {} } = {}) => {
+ const createComponent = ({ props = {}, slots = {} } = {}) => {
wrapper = extendedWrapper(
mount(SummaryRow, {
propsData: {
+ summary,
+ popoverOptions,
+ statusIcon,
...props,
- ...propsData,
},
slots,
}),
@@ -28,6 +29,7 @@ describe('Summary row', () => {
const findSummary = () => wrapper.findByTestId('summary-row-description');
const findStatusIcon = () => wrapper.findByTestId('summary-row-icon');
+ const findHelpPopover = () => wrapper.findComponent(HelpPopover);
afterEach(() => {
wrapper.destroy();
@@ -36,7 +38,7 @@ describe('Summary row', () => {
it('renders provided summary', () => {
createComponent();
- expect(findSummary().text()).toContain(props.summary);
+ expect(findSummary().text()).toContain(summary);
});
it('renders provided icon', () => {
@@ -44,12 +46,22 @@ describe('Summary row', () => {
expect(findStatusIcon().classes()).toContain('js-ci-status-icon-warning');
});
+ it('renders help popover if popoverOptions are provided', () => {
+ createComponent();
+ expect(findHelpPopover().props('options')).toEqual(popoverOptions);
+ });
+
+ it('does not render help popover if popoverOptions are not provided', () => {
+ createComponent({ props: { popoverOptions: null } });
+ expect(findHelpPopover().exists()).toBe(false);
+ });
+
describe('summary slot', () => {
it('replaces the summary prop', () => {
const summarySlotContent = 'Summary slot content';
createComponent({ slots: { summary: summarySlotContent } });
- expect(wrapper.text()).not.toContain(props.summary);
+ expect(wrapper.text()).not.toContain(summary);
expect(findSummary().text()).toContain(summarySlotContent);
});
});
diff --git a/spec/frontend/reports/grouped_test_report/store/actions_spec.js b/spec/frontend/reports/grouped_test_report/store/actions_spec.js
index bbc3a5dbba5..5876827c548 100644
--- a/spec/frontend/reports/grouped_test_report/store/actions_spec.js
+++ b/spec/frontend/reports/grouped_test_report/store/actions_spec.js
@@ -24,8 +24,8 @@ describe('Reports Store Actions', () => {
});
describe('setPaths', () => {
- it('should commit SET_PATHS mutation', (done) => {
- testAction(
+ it('should commit SET_PATHS mutation', () => {
+ return testAction(
setPaths,
{ endpoint: 'endpoint.json', headBlobPath: '/blob/path' },
mockedState,
@@ -36,14 +36,13 @@ describe('Reports Store Actions', () => {
},
],
[],
- done,
);
});
});
describe('requestReports', () => {
- it('should commit REQUEST_REPORTS mutation', (done) => {
- testAction(requestReports, null, mockedState, [{ type: types.REQUEST_REPORTS }], [], done);
+ it('should commit REQUEST_REPORTS mutation', () => {
+ return testAction(requestReports, null, mockedState, [{ type: types.REQUEST_REPORTS }], []);
});
});
@@ -62,12 +61,12 @@ describe('Reports Store Actions', () => {
});
describe('success', () => {
- it('dispatches requestReports and receiveReportsSuccess ', (done) => {
+ it('dispatches requestReports and receiveReportsSuccess ', () => {
mock
.onGet(`${TEST_HOST}/endpoint.json`)
.replyOnce(200, { summary: {}, suites: [{ name: 'rspec' }] });
- testAction(
+ return testAction(
fetchReports,
null,
mockedState,
@@ -81,7 +80,6 @@ describe('Reports Store Actions', () => {
type: 'receiveReportsSuccess',
},
],
- done,
);
});
});
@@ -91,8 +89,8 @@ describe('Reports Store Actions', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`).reply(500);
});
- it('dispatches requestReports and receiveReportsError ', (done) => {
- testAction(
+ it('dispatches requestReports and receiveReportsError ', () => {
+ return testAction(
fetchReports,
null,
mockedState,
@@ -105,71 +103,65 @@ describe('Reports Store Actions', () => {
type: 'receiveReportsError',
},
],
- done,
);
});
});
});
describe('receiveReportsSuccess', () => {
- it('should commit RECEIVE_REPORTS_SUCCESS mutation with 200', (done) => {
- testAction(
+ it('should commit RECEIVE_REPORTS_SUCCESS mutation with 200', () => {
+ return testAction(
receiveReportsSuccess,
{ data: { summary: {} }, status: 200 },
mockedState,
[{ type: types.RECEIVE_REPORTS_SUCCESS, payload: { summary: {} } }],
[],
- done,
);
});
- it('should not commit RECEIVE_REPORTS_SUCCESS mutation with 204', (done) => {
- testAction(
+ it('should not commit RECEIVE_REPORTS_SUCCESS mutation with 204', () => {
+ return testAction(
receiveReportsSuccess,
{ data: { summary: {} }, status: 204 },
mockedState,
[],
[],
- done,
);
});
});
describe('receiveReportsError', () => {
- it('should commit RECEIVE_REPORTS_ERROR mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_REPORTS_ERROR mutation', () => {
+ return testAction(
receiveReportsError,
null,
mockedState,
[{ type: types.RECEIVE_REPORTS_ERROR }],
[],
- done,
);
});
});
describe('openModal', () => {
- it('should commit SET_ISSUE_MODAL_DATA', (done) => {
- testAction(
+ it('should commit SET_ISSUE_MODAL_DATA', () => {
+ return testAction(
openModal,
{ name: 'foo' },
mockedState,
[{ type: types.SET_ISSUE_MODAL_DATA, payload: { name: 'foo' } }],
[],
- done,
);
});
});
describe('closeModal', () => {
- it('should commit RESET_ISSUE_MODAL_DATA', (done) => {
- testAction(
+ it('should commit RESET_ISSUE_MODAL_DATA', () => {
+ return testAction(
closeModal,
{},
mockedState,
[{ type: types.RESET_ISSUE_MODAL_DATA, payload: {} }],
[],
- done,
);
});
});
diff --git a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
index 7854325e4ed..fea937b905f 100644
--- a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
+++ b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
@@ -106,114 +106,3 @@ exports[`Repository last commit component renders commit widget 1`] = `
</div>
</div>
`;
-
-exports[`Repository last commit component renders the signature HTML as returned by the backend 1`] = `
-<div
- class="well-segment commit gl-p-5 gl-w-full"
->
- <user-avatar-link-stub
- class="avatar-cell"
- imgalt=""
- imgcssclasses=""
- imgsize="40"
- imgsrc="https://test.com"
- linkhref="/test"
- tooltipplacement="top"
- tooltiptext=""
- username=""
- />
-
- <div
- class="commit-detail flex-list"
- >
- <div
- class="commit-content qa-commit-content"
- >
- <gl-link-stub
- class="commit-row-message item-title"
- href="/commit/123"
- >
- Commit title
- </gl-link-stub>
-
- <!---->
-
- <div
- class="committer"
- >
- <gl-link-stub
- class="commit-author-link js-user-link"
- href="/test"
- >
-
- Test
- </gl-link-stub>
-
- authored
-
- <timeago-tooltip-stub
- cssclass=""
- time="2019-01-01"
- tooltipplacement="bottom"
- />
- </div>
-
- <!---->
- </div>
-
- <div
- class="commit-actions flex-row"
- >
- <div>
- <button>
- Verified
- </button>
- </div>
-
- <div
- class="ci-status-link"
- >
- <gl-link-stub
- class="js-commit-pipeline"
- href="https://test.com/pipeline"
- title="Pipeline: failed"
- >
- <ci-icon-stub
- aria-label="Pipeline: failed"
- cssclasses=""
- size="24"
- status="[object Object]"
- />
- </gl-link-stub>
- </div>
-
- <gl-button-group-stub
- class="gl-ml-4 js-commit-sha-group"
- >
- <gl-button-stub
- buttontextclasses=""
- category="primary"
- class="gl-font-monospace"
- data-testid="last-commit-id-label"
- icon=""
- label="true"
- size="medium"
- variant="default"
- >
- 12345678
- </gl-button-stub>
-
- <clipboard-button-stub
- category="secondary"
- class="input-group-text"
- size="medium"
- text="123456789"
- title="Copy commit SHA"
- tooltipplacement="top"
- variant="default"
- />
- </gl-button-group-stub>
- </div>
- </div>
-</div>
-`;
diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js
index 96c03419dd6..2f6de03b73d 100644
--- a/spec/frontend/repository/components/blob_content_viewer_spec.js
+++ b/spec/frontend/repository/components/blob_content_viewer_spec.js
@@ -25,6 +25,7 @@ import { redirectTo } from '~/lib/utils/url_utility';
import { isLoggedIn } from '~/lib/utils/common_utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import httpStatusCodes from '~/lib/utils/http_status';
+import LineHighlighter from '~/blob/line_highlighter';
import {
simpleViewerMock,
richViewerMock,
@@ -39,6 +40,7 @@ import {
jest.mock('~/repository/components/blob_viewers');
jest.mock('~/lib/utils/url_utility');
jest.mock('~/lib/utils/common_utils');
+jest.mock('~/blob/line_highlighter');
let wrapper;
let mockResolver;
@@ -173,20 +175,30 @@ describe('Blob content viewer component', () => {
});
describe('legacy viewers', () => {
+ const legacyViewerUrl = 'some_file.js?format=json&viewer=simple';
+ const fileType = 'text';
+ const highlightJs = false;
+
it('loads a legacy viewer when a the fileType is text and the highlightJs feature is turned off', async () => {
await createComponent({
- blob: { ...simpleViewerMock, fileType: 'text', highlightJs: false },
+ blob: { ...simpleViewerMock, fileType, highlightJs },
});
expect(mockAxios.history.get).toHaveLength(1);
- expect(mockAxios.history.get[0].url).toEqual('some_file.js?format=json&viewer=simple');
+ expect(mockAxios.history.get[0].url).toBe(legacyViewerUrl);
});
it('loads a legacy viewer when a viewer component is not available', async () => {
await createComponent({ blob: { ...simpleViewerMock, fileType: 'unknown' } });
expect(mockAxios.history.get).toHaveLength(1);
- expect(mockAxios.history.get[0].url).toEqual('some_file.js?format=json&viewer=simple');
+ expect(mockAxios.history.get[0].url).toBe(legacyViewerUrl);
+ });
+
+ it('loads the LineHighlighter', async () => {
+ mockAxios.onGet(legacyViewerUrl).replyOnce(httpStatusCodes.OK, 'test');
+ await createComponent({ blob: { ...simpleViewerMock, fileType, highlightJs } });
+ expect(LineHighlighter).toHaveBeenCalled();
});
});
});
@@ -258,6 +270,7 @@ describe('Blob content viewer component', () => {
codeNavigationPath: simpleViewerMock.codeNavigationPath,
blobPath: simpleViewerMock.path,
pathPrefix: simpleViewerMock.projectBlobPathRoot,
+ wrapTextNodes: true,
});
});
diff --git a/spec/frontend/repository/components/breadcrumbs_spec.js b/spec/frontend/repository/components/breadcrumbs_spec.js
index 0e3e7075e99..eef66045573 100644
--- a/spec/frontend/repository/components/breadcrumbs_spec.js
+++ b/spec/frontend/repository/components/breadcrumbs_spec.js
@@ -12,7 +12,7 @@ const defaultMockRoute = {
describe('Repository breadcrumbs component', () => {
let wrapper;
- const factory = (currentPath, extraProps = {}, mockRoute = {}, newDirModal = true) => {
+ const factory = (currentPath, extraProps = {}, mockRoute = {}) => {
const $apollo = {
queries: {
userPermissions: {
@@ -36,7 +36,6 @@ describe('Repository breadcrumbs component', () => {
},
$apollo,
},
- provide: { glFeatures: { newDirModal } },
});
};
@@ -147,37 +146,21 @@ describe('Repository breadcrumbs component', () => {
});
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 () => {
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({ $apollo: { queries: { userPermissions: { loading: false } } } });
-
- await nextTick();
-
- expect(findNewDirectoryModal().exists()).toBe(true);
- });
+ beforeEach(() => {
+ factory('/', { canEditTree: true });
+ });
+ it('does not render the modal while loading', () => {
+ expect(findNewDirectoryModal().exists()).toBe(false);
});
- 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);
- });
+ it('renders the modal once loaded', async () => {
+ // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
+ // eslint-disable-next-line no-restricted-syntax
+ wrapper.setData({ $apollo: { queries: { userPermissions: { loading: false } } } });
+
+ await nextTick();
+
+ expect(findNewDirectoryModal().exists()).toBe(true);
});
});
});
diff --git a/spec/frontend/repository/components/last_commit_spec.js b/spec/frontend/repository/components/last_commit_spec.js
index bb710c3a96c..cfbf74e34aa 100644
--- a/spec/frontend/repository/components/last_commit_spec.js
+++ b/spec/frontend/repository/components/last_commit_spec.js
@@ -143,11 +143,30 @@ describe('Repository last commit component', () => {
});
it('renders the signature HTML as returned by the backend', async () => {
- factory(createCommitData({ signatureHtml: '<button>Verified</button>' }));
+ factory(
+ createCommitData({
+ signatureHtml: `<a
+ class="btn gpg-status-box valid"
+ data-content="signature-content"
+ data-html="true"
+ data-placement="top"
+ data-title="signature-title"
+ data-toggle="popover"
+ role="button"
+ tabindex="0"
+ >
+ Verified
+ </a>`,
+ }),
+ );
await nextTick();
- expect(vm.element).toMatchSnapshot();
+ expect(vm.find('.gpg-status-box').html()).toBe(
+ `<a class="btn gpg-status-box valid" data-content="signature-content" data-html="true" data-placement="top" data-title="signature-title" data-toggle="popover" role="button" tabindex="0">
+ Verified
+</a>`,
+ );
});
it('sets correct CSS class if the commit message is empty', async () => {
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 cdaec0a3a8b..2ef856c90ab 100644
--- a/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
+++ b/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
@@ -13,6 +13,7 @@ import { createAlert } from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { updateHistory } from '~/lib/utils/url_utility';
+import { createLocalState } from '~/runner/graphql/list/local_state';
import AdminRunnersApp from '~/runner/admin_runners/admin_runners_app.vue';
import RunnerTypeTabs from '~/runner/components/runner_type_tabs.vue';
import RunnerFilteredSearchBar from '~/runner/components/runner_filtered_search_bar.vue';
@@ -30,9 +31,10 @@ import {
INSTANCE_TYPE,
GROUP_TYPE,
PROJECT_TYPE,
+ PARAM_KEY_PAUSED,
PARAM_KEY_STATUS,
PARAM_KEY_TAG,
- STATUS_ACTIVE,
+ STATUS_ONLINE,
RUNNER_PAGE_SIZE,
} from '~/runner/constants';
import adminRunnersQuery from '~/runner/graphql/list/admin_runners.query.graphql';
@@ -40,9 +42,16 @@ import adminRunnersCountQuery from '~/runner/graphql/list/admin_runners_count.qu
import { captureException } from '~/runner/sentry_utils';
import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
-import { runnersData, runnersCountData, runnersDataPaginated } from '../mock_data';
+import {
+ runnersData,
+ runnersCountData,
+ runnersDataPaginated,
+ onlineContactTimeoutSecs,
+ staleTimeoutSecs,
+} from '../mock_data';
const mockRegistrationToken = 'MOCK_REGISTRATION_TOKEN';
+const mockRunners = runnersData.data.runners.nodes;
jest.mock('~/flash');
jest.mock('~/runner/sentry_utils');
@@ -58,6 +67,8 @@ describe('AdminRunnersApp', () => {
let wrapper;
let mockRunnersQuery;
let mockRunnersCountQuery;
+ let cacheConfig;
+ let localMutations;
const findRunnerStats = () => wrapper.findComponent(RunnerStats);
const findRunnerActionsCell = () => wrapper.findComponent(RunnerActionsCell);
@@ -69,18 +80,32 @@ describe('AdminRunnersApp', () => {
const findRunnerFilteredSearchBar = () => wrapper.findComponent(RunnerFilteredSearchBar);
const findFilteredSearch = () => wrapper.findComponent(FilteredSearch);
- const createComponent = ({ props = {}, mountFn = shallowMountExtended } = {}) => {
+ const createComponent = ({
+ props = {},
+ mountFn = shallowMountExtended,
+ provide,
+ ...options
+ } = {}) => {
+ ({ cacheConfig, localMutations } = createLocalState());
+
const handlers = [
[adminRunnersQuery, mockRunnersQuery],
[adminRunnersCountQuery, mockRunnersCountQuery],
];
wrapper = mountFn(AdminRunnersApp, {
- apolloProvider: createMockApollo(handlers),
+ apolloProvider: createMockApollo(handlers, {}, cacheConfig),
propsData: {
registrationToken: mockRegistrationToken,
...props,
},
+ provide: {
+ localMutations,
+ onlineContactTimeoutSecs,
+ staleTimeoutSecs,
+ ...provide,
+ },
+ ...options,
});
};
@@ -173,7 +198,7 @@ describe('AdminRunnersApp', () => {
});
it('shows the runners list', () => {
- expect(findRunnerList().props('runners')).toEqual(runnersData.data.runners.nodes);
+ expect(findRunnerList().props('runners')).toEqual(mockRunners);
});
it('runner item links to the runner admin page', async () => {
@@ -181,7 +206,7 @@ describe('AdminRunnersApp', () => {
await waitForPromises();
- const { id, shortSha } = runnersData.data.runners.nodes[0];
+ const { id, shortSha } = mockRunners[0];
const numericId = getIdFromGraphQLId(id);
const runnerLink = wrapper.find('tr [data-testid="td-summary"]').find(GlLink);
@@ -197,7 +222,7 @@ describe('AdminRunnersApp', () => {
const runnerActions = wrapper.find('tr [data-testid="td-actions"]').find(RunnerActionsCell);
- const runner = runnersData.data.runners.nodes[0];
+ const runner = mockRunners[0];
expect(runnerActions.props()).toEqual({
runner,
@@ -219,6 +244,10 @@ describe('AdminRunnersApp', () => {
expect(findFilteredSearch().props('tokens')).toEqual([
expect.objectContaining({
+ type: PARAM_KEY_PAUSED,
+ options: expect.any(Array),
+ }),
+ expect.objectContaining({
type: PARAM_KEY_STATUS,
options: expect.any(Array),
}),
@@ -232,12 +261,13 @@ describe('AdminRunnersApp', () => {
describe('Single runner row', () => {
let showToast;
- const mockRunner = runnersData.data.runners.nodes[0];
- const { id: graphqlId, shortSha } = mockRunner;
+ const { id: graphqlId, shortSha } = mockRunners[0];
const id = getIdFromGraphQLId(graphqlId);
+ const COUNT_QUERIES = 7; // Smart queries that display a filtered count of runners
+ const FILTERED_COUNT_QUERIES = 4; // Smart queries that display a count of runners in tabs
beforeEach(async () => {
- mockRunnersQuery.mockClear();
+ mockRunnersCountQuery.mockClear();
createComponent({ mountFn: mountExtended });
showToast = jest.spyOn(wrapper.vm.$root.$toast, 'show');
@@ -252,12 +282,18 @@ describe('AdminRunnersApp', () => {
expect(runnerLink.attributes('href')).toBe(`http://localhost/admin/runners/${id}`);
});
- it('When runner is deleted, data is refetched and a toast message is shown', async () => {
- expect(mockRunnersQuery).toHaveBeenCalledTimes(1);
+ it('When runner is paused or unpaused, some data is refetched', async () => {
+ expect(mockRunnersCountQuery).toHaveBeenCalledTimes(COUNT_QUERIES);
- findRunnerActionsCell().vm.$emit('deleted', { message: 'Runner deleted' });
+ findRunnerActionsCell().vm.$emit('toggledPaused');
- expect(mockRunnersQuery).toHaveBeenCalledTimes(2);
+ expect(mockRunnersCountQuery).toHaveBeenCalledTimes(COUNT_QUERIES + FILTERED_COUNT_QUERIES);
+
+ expect(showToast).toHaveBeenCalledTimes(0);
+ });
+
+ it('When runner is deleted, data is refetched and a toast message is shown', async () => {
+ findRunnerActionsCell().vm.$emit('deleted', { message: 'Runner deleted' });
expect(showToast).toHaveBeenCalledTimes(1);
expect(showToast).toHaveBeenCalledWith('Runner deleted');
@@ -266,7 +302,7 @@ describe('AdminRunnersApp', () => {
describe('when a filter is preselected', () => {
beforeEach(async () => {
- setWindowLocation(`?status[]=${STATUS_ACTIVE}&runner_type[]=${INSTANCE_TYPE}&tag[]=tag1`);
+ setWindowLocation(`?status[]=${STATUS_ONLINE}&runner_type[]=${INSTANCE_TYPE}&tag[]=tag1`);
createComponent();
await waitForPromises();
@@ -276,7 +312,7 @@ describe('AdminRunnersApp', () => {
expect(findRunnerFilteredSearchBar().props('value')).toEqual({
runnerType: INSTANCE_TYPE,
filters: [
- { type: 'status', value: { data: STATUS_ACTIVE, operator: '=' } },
+ { type: 'status', value: { data: STATUS_ONLINE, operator: '=' } },
{ type: 'tag', value: { data: 'tag1', operator: '=' } },
],
sort: 'CREATED_DESC',
@@ -286,7 +322,7 @@ describe('AdminRunnersApp', () => {
it('requests the runners with filter parameters', () => {
expect(mockRunnersQuery).toHaveBeenLastCalledWith({
- status: STATUS_ACTIVE,
+ status: STATUS_ONLINE,
type: INSTANCE_TYPE,
tagList: ['tag1'],
sort: DEFAULT_SORT,
@@ -299,7 +335,7 @@ describe('AdminRunnersApp', () => {
beforeEach(() => {
findRunnerFilteredSearchBar().vm.$emit('input', {
runnerType: null,
- filters: [{ type: PARAM_KEY_STATUS, value: { data: STATUS_ACTIVE, operator: '=' } }],
+ filters: [{ type: PARAM_KEY_STATUS, value: { data: STATUS_ONLINE, operator: '=' } }],
sort: CREATED_ASC,
});
});
@@ -307,13 +343,13 @@ describe('AdminRunnersApp', () => {
it('updates the browser url', () => {
expect(updateHistory).toHaveBeenLastCalledWith({
title: expect.any(String),
- url: 'http://test.host/admin/runners?status[]=ACTIVE&sort=CREATED_ASC',
+ url: 'http://test.host/admin/runners?status[]=ONLINE&sort=CREATED_ASC',
});
});
it('requests the runners with filters', () => {
expect(mockRunnersQuery).toHaveBeenLastCalledWith({
- status: STATUS_ACTIVE,
+ status: STATUS_ONLINE,
sort: CREATED_ASC,
first: RUNNER_PAGE_SIZE,
});
@@ -325,6 +361,41 @@ describe('AdminRunnersApp', () => {
expect(findRunnerList().props('loading')).toBe(true);
});
+ describe('when bulk delete is enabled', () => {
+ beforeEach(() => {
+ createComponent({
+ provide: {
+ glFeatures: { adminRunnersBulkDelete: true },
+ },
+ });
+ });
+
+ it('runner list is checkable', () => {
+ expect(findRunnerList().props('checkable')).toBe(true);
+ });
+
+ it('responds to checked items by updating the local cache', () => {
+ const setRunnerCheckedMock = jest
+ .spyOn(localMutations, 'setRunnerChecked')
+ .mockImplementation(() => {});
+
+ const runner = mockRunners[0];
+
+ expect(setRunnerCheckedMock).toHaveBeenCalledTimes(0);
+
+ findRunnerList().vm.$emit('checked', {
+ runner,
+ isChecked: true,
+ });
+
+ expect(setRunnerCheckedMock).toHaveBeenCalledTimes(1);
+ expect(setRunnerCheckedMock).toHaveBeenCalledWith({
+ runner,
+ isChecked: true,
+ });
+ });
+ });
+
describe('when no runners are found', () => {
beforeEach(async () => {
mockRunnersQuery = jest.fn().mockResolvedValue({
diff --git a/spec/frontend/runner/components/__snapshots__/runner_status_popover_spec.js.snap b/spec/frontend/runner/components/__snapshots__/runner_status_popover_spec.js.snap
new file mode 100644
index 00000000000..80a04401760
--- /dev/null
+++ b/spec/frontend/runner/components/__snapshots__/runner_status_popover_spec.js.snap
@@ -0,0 +1,3 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`RunnerStatusPopover renders complete text 1`] = `"Never contacted: Runner has never contacted GitLab (when you register a runner, use gitlab-runner run to bring it online) Online: Runner has contacted GitLab within the last 2 hours Offline: Runner has not contacted GitLab in more than 2 hours Stale: Runner has not contacted GitLab in more than 2 months"`;
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 0d579106860..7a949cb6505 100644
--- a/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
+++ b/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
@@ -92,6 +92,24 @@ describe('RunnerActionsCell', () => {
expect(findDeleteBtn().props('compact')).toBe(true);
});
+ it('Passes runner data to delete button', () => {
+ createComponent({
+ runner: mockRunner,
+ });
+
+ expect(findDeleteBtn().props('runner')).toEqual(mockRunner);
+ });
+
+ it('Emits toggledPaused events', () => {
+ createComponent();
+
+ expect(wrapper.emitted('toggledPaused')).toBe(undefined);
+
+ findRunnerPauseBtn().vm.$emit('toggledPaused');
+
+ expect(wrapper.emitted('toggledPaused')).toHaveLength(1);
+ });
+
it('Emits delete events', () => {
const value = { name: 'Runner' };
@@ -104,7 +122,7 @@ describe('RunnerActionsCell', () => {
expect(wrapper.emitted('deleted')).toEqual([[value]]);
});
- it('Does not render the runner delete button when user cannot delete', () => {
+ it('Renders the runner delete disabled button when user cannot delete', () => {
createComponent({
runner: {
userPermissions: {
@@ -114,7 +132,7 @@ describe('RunnerActionsCell', () => {
},
});
- expect(findDeleteBtn().exists()).toBe(false);
+ expect(findDeleteBtn().props('disabled')).toBe(true);
});
});
});
diff --git a/spec/frontend/runner/components/cells/runner_summary_cell_spec.js b/spec/frontend/runner/components/cells/runner_summary_cell_spec.js
index b6d957d27ea..b2e8c5a3ad9 100644
--- a/spec/frontend/runner/components/cells/runner_summary_cell_spec.js
+++ b/spec/frontend/runner/components/cells/runner_summary_cell_spec.js
@@ -5,6 +5,7 @@ import { INSTANCE_TYPE, PROJECT_TYPE } from '~/runner/constants';
const mockId = '1';
const mockShortSha = '2P6oDVDm';
const mockDescription = 'runner-1';
+const mockIpAddress = '0.0.0.0';
describe('RunnerTypeCell', () => {
let wrapper;
@@ -18,6 +19,7 @@ describe('RunnerTypeCell', () => {
id: `gid://gitlab/Ci::Runner/${mockId}`,
shortSha: mockShortSha,
description: mockDescription,
+ ipAddress: mockIpAddress,
runnerType: INSTANCE_TYPE,
...runner,
},
@@ -59,6 +61,10 @@ describe('RunnerTypeCell', () => {
expect(wrapper.text()).toContain(mockDescription);
});
+ it('Displays the runner ip address', () => {
+ expect(wrapper.text()).toContain(mockIpAddress);
+ });
+
it('Displays a custom slot', () => {
const slotContent = 'My custom runner summary';
diff --git a/spec/frontend/runner/components/registration/registration_dropdown_spec.js b/spec/frontend/runner/components/registration/registration_dropdown_spec.js
index da8ef7c3af0..5cd93df9967 100644
--- a/spec/frontend/runner/components/registration/registration_dropdown_spec.js
+++ b/spec/frontend/runner/components/registration/registration_dropdown_spec.js
@@ -8,6 +8,7 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import RegistrationDropdown from '~/runner/components/registration/registration_dropdown.vue';
+import RegistrationToken from '~/runner/components/registration/registration_token.vue';
import RegistrationTokenResetDropdownItem from '~/runner/components/registration/registration_token_reset_dropdown_item.vue';
import { INSTANCE_TYPE, GROUP_TYPE, PROJECT_TYPE } from '~/runner/constants';
@@ -30,11 +31,11 @@ describe('RegistrationDropdown', () => {
const findRegistrationInstructionsDropdownItem = () => wrapper.findComponent(GlDropdownItem);
const findTokenDropdownItem = () => wrapper.findComponent(GlDropdownForm);
+ const findRegistrationToken = () => wrapper.findComponent(RegistrationToken);
+ const findRegistrationTokenInput = () => wrapper.findByTestId('token-value').find('input');
const findTokenResetDropdownItem = () =>
wrapper.findComponent(RegistrationTokenResetDropdownItem);
- const findToggleMaskButton = () => wrapper.findByTestId('toggle-masked');
-
const createComponent = ({ props = {}, ...options } = {}, mountFn = shallowMount) => {
wrapper = extendedWrapper(
mountFn(RegistrationDropdown, {
@@ -134,9 +135,7 @@ describe('RegistrationDropdown', () => {
it('Displays masked value by default', () => {
createComponent({}, mount);
- expect(findTokenDropdownItem().text()).toMatchInterpolatedText(
- `Registration token ${maskToken}`,
- );
+ expect(findRegistrationTokenInput().element.value).toBe(maskToken);
});
});
@@ -155,16 +154,14 @@ describe('RegistrationDropdown', () => {
});
it('Updates the token when it gets reset', async () => {
+ const newToken = 'mock1';
createComponent({}, mount);
- const newToken = 'mock1';
+ expect(findRegistrationTokenInput().props('value')).not.toBe(newToken);
findTokenResetDropdownItem().vm.$emit('tokenReset', newToken);
- findToggleMaskButton().vm.$emit('click', { stopPropagation: jest.fn() });
await nextTick();
- expect(findTokenDropdownItem().text()).toMatchInterpolatedText(
- `Registration token ${newToken}`,
- );
+ expect(findRegistrationToken().props('value')).toBe(newToken);
});
});
diff --git a/spec/frontend/runner/components/registration/registration_token_spec.js b/spec/frontend/runner/components/registration/registration_token_spec.js
index 6b9708cc525..cb42c7c8493 100644
--- a/spec/frontend/runner/components/registration/registration_token_spec.js
+++ b/spec/frontend/runner/components/registration/registration_token_spec.js
@@ -1,20 +1,17 @@
-import { nextTick } from 'vue';
import { GlToast } from '@gitlab/ui';
import { createLocalVue } from '@vue/test-utils';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
import RegistrationToken from '~/runner/components/registration/registration_token.vue';
-import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
+import InputCopyToggleVisibility from '~/vue_shared/components/form/input_copy_toggle_visibility.vue';
const mockToken = '01234567890';
const mockMasked = '***********';
describe('RegistrationToken', () => {
let wrapper;
- let stopPropagation;
let showToast;
- const findToggleMaskButton = () => wrapper.findByTestId('toggle-masked');
- const findCopyButton = () => wrapper.findComponent(ModalCopyButton);
+ const findInputCopyToggleVisibility = () => wrapper.findComponent(InputCopyToggleVisibility);
const vueWithGlToast = () => {
const localVue = createLocalVue();
@@ -22,10 +19,14 @@ describe('RegistrationToken', () => {
return localVue;
};
- const createComponent = ({ props = {}, withGlToast = true } = {}) => {
+ const createComponent = ({
+ props = {},
+ withGlToast = true,
+ mountFn = shallowMountExtended,
+ } = {}) => {
const localVue = withGlToast ? vueWithGlToast() : undefined;
- wrapper = shallowMountExtended(RegistrationToken, {
+ wrapper = mountFn(RegistrationToken, {
propsData: {
value: mockToken,
...props,
@@ -36,61 +37,33 @@ describe('RegistrationToken', () => {
showToast = wrapper.vm.$toast ? jest.spyOn(wrapper.vm.$toast, 'show') : null;
};
- beforeEach(() => {
- stopPropagation = jest.fn();
-
- createComponent();
- });
-
afterEach(() => {
wrapper.destroy();
});
- it('Displays masked value by default', () => {
- expect(wrapper.text()).toBe(mockMasked);
- });
+ it('Displays value and copy button', () => {
+ createComponent();
- it('Displays button to reveal token', () => {
- expect(findToggleMaskButton().attributes('aria-label')).toBe('Click to reveal');
+ expect(findInputCopyToggleVisibility().props('value')).toBe(mockToken);
+ expect(findInputCopyToggleVisibility().props('copyButtonTitle')).toBe(
+ 'Copy registration token',
+ );
});
- it('Can copy the original token value', () => {
- expect(findCopyButton().props('text')).toBe(mockToken);
+ // Component integration test to ensure secure masking
+ it('Displays masked value by default', () => {
+ createComponent({ mountFn: mountExtended });
+
+ expect(wrapper.find('input').element.value).toBe(mockMasked);
});
- describe('When the reveal icon is clicked', () => {
+ describe('When the copy to clipboard button is clicked', () => {
beforeEach(() => {
- findToggleMaskButton().vm.$emit('click', { stopPropagation });
- });
-
- it('Click event is not propagated', async () => {
- expect(stopPropagation).toHaveBeenCalledTimes(1);
+ createComponent();
});
- it('Displays the actual value', () => {
- expect(wrapper.text()).toBe(mockToken);
- });
-
- it('Can copy the original token value', () => {
- expect(findCopyButton().props('text')).toBe(mockToken);
- });
-
- it('Displays button to mask token', () => {
- expect(findToggleMaskButton().attributes('aria-label')).toBe('Click to hide');
- });
-
- it('When user clicks again, displays masked value', async () => {
- findToggleMaskButton().vm.$emit('click', { stopPropagation });
- await nextTick();
-
- expect(wrapper.text()).toBe(mockMasked);
- expect(findToggleMaskButton().attributes('aria-label')).toBe('Click to reveal');
- });
- });
-
- describe('When the copy to clipboard button is clicked', () => {
it('shows a copied message', () => {
- findCopyButton().vm.$emit('success');
+ findInputCopyToggleVisibility().vm.$emit('copy');
expect(showToast).toHaveBeenCalledTimes(1);
expect(showToast).toHaveBeenCalledWith('Registration token copied!');
@@ -98,7 +71,7 @@ describe('RegistrationToken', () => {
it('does not fail when toast is not defined', () => {
createComponent({ withGlToast: false });
- findCopyButton().vm.$emit('success');
+ findInputCopyToggleVisibility().vm.$emit('copy');
// This block also tests for unhandled errors
expect(showToast).toBeNull();
diff --git a/spec/frontend/runner/components/runner_assigned_item_spec.js b/spec/frontend/runner/components/runner_assigned_item_spec.js
index c6156c16d4a..1ff6983fbe7 100644
--- a/spec/frontend/runner/components/runner_assigned_item_spec.js
+++ b/spec/frontend/runner/components/runner_assigned_item_spec.js
@@ -1,6 +1,7 @@
import { GlAvatar } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import RunnerAssignedItem from '~/runner/components/runner_assigned_item.vue';
+import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
const mockHref = '/group/project';
const mockName = 'Project';
@@ -40,7 +41,7 @@ describe('RunnerAssignedItem', () => {
alt: mockName,
entityName: mockName,
src: mockAvatarUrl,
- shape: 'rect',
+ shape: AVATAR_SHAPE_OPTION_RECT,
size: 48,
});
});
diff --git a/spec/frontend/runner/components/runner_bulk_delete_spec.js b/spec/frontend/runner/components/runner_bulk_delete_spec.js
new file mode 100644
index 00000000000..f5b56396cf1
--- /dev/null
+++ b/spec/frontend/runner/components/runner_bulk_delete_spec.js
@@ -0,0 +1,103 @@
+import Vue from 'vue';
+import { GlSprintf } from '@gitlab/ui';
+import VueApollo from 'vue-apollo';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
+import RunnerBulkDelete from '~/runner/components/runner_bulk_delete.vue';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { createLocalState } from '~/runner/graphql/list/local_state';
+import waitForPromises from 'helpers/wait_for_promises';
+
+Vue.use(VueApollo);
+
+jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal');
+
+describe('RunnerBulkDelete', () => {
+ let wrapper;
+ let mockState;
+ let mockCheckedRunnerIds;
+
+ const findClearBtn = () => wrapper.findByTestId('clear-btn');
+ const findDeleteBtn = () => wrapper.findByTestId('delete-btn');
+
+ const createComponent = () => {
+ const { cacheConfig, localMutations } = mockState;
+
+ wrapper = shallowMountExtended(RunnerBulkDelete, {
+ apolloProvider: createMockApollo(undefined, undefined, cacheConfig),
+ provide: {
+ localMutations,
+ },
+ stubs: {
+ GlSprintf,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ mockState = createLocalState();
+
+ jest
+ .spyOn(mockState.cacheConfig.typePolicies.Query.fields, 'checkedRunnerIds')
+ .mockImplementation(() => mockCheckedRunnerIds);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('When no runners are checked', () => {
+ beforeEach(async () => {
+ mockCheckedRunnerIds = [];
+
+ createComponent();
+
+ await waitForPromises();
+ });
+
+ it('shows no contents', () => {
+ expect(wrapper.html()).toBe('');
+ });
+ });
+
+ describe.each`
+ count | ids | text
+ ${1} | ${['gid:Runner/1']} | ${'1 runner'}
+ ${2} | ${['gid:Runner/1', 'gid:Runner/2']} | ${'2 runners'}
+ `('When $count runner(s) are checked', ({ count, ids, text }) => {
+ beforeEach(() => {
+ mockCheckedRunnerIds = ids;
+
+ createComponent();
+
+ jest.spyOn(mockState.localMutations, 'clearChecked').mockImplementation(() => {});
+ });
+
+ it(`shows "${text}"`, () => {
+ expect(wrapper.text()).toContain(text);
+ });
+
+ it('clears selection', () => {
+ expect(mockState.localMutations.clearChecked).toHaveBeenCalledTimes(0);
+
+ findClearBtn().vm.$emit('click');
+
+ expect(mockState.localMutations.clearChecked).toHaveBeenCalledTimes(1);
+ });
+
+ it('shows confirmation modal', () => {
+ expect(confirmAction).toHaveBeenCalledTimes(0);
+
+ findDeleteBtn().vm.$emit('click');
+
+ expect(confirmAction).toHaveBeenCalledTimes(1);
+
+ const [, confirmOptions] = confirmAction.mock.calls[0];
+ const { title, modalHtmlMessage, primaryBtnText } = confirmOptions;
+
+ expect(title).toMatch(text);
+ expect(primaryBtnText).toMatch(text);
+ expect(modalHtmlMessage).toMatch(`<strong>${count}</strong>`);
+ });
+ });
+});
diff --git a/spec/frontend/runner/components/runner_delete_button_spec.js b/spec/frontend/runner/components/runner_delete_button_spec.js
index 81c870f23cf..3eb257607b4 100644
--- a/spec/frontend/runner/components/runner_delete_button_spec.js
+++ b/spec/frontend/runner/components/runner_delete_button_spec.js
@@ -9,7 +9,11 @@ import waitForPromises from 'helpers/wait_for_promises';
import { captureException } from '~/runner/sentry_utils';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { createAlert } from '~/flash';
-import { I18N_DELETE_RUNNER } from '~/runner/constants';
+import {
+ I18N_DELETE_RUNNER,
+ I18N_DELETE_DISABLED_MANY_PROJECTS,
+ I18N_DELETE_DISABLED_UNKNOWN_REASON,
+} from '~/runner/constants';
import RunnerDeleteButton from '~/runner/components/runner_delete_button.vue';
import RunnerDeleteModal from '~/runner/components/runner_delete_modal.vue';
@@ -25,26 +29,32 @@ jest.mock('~/runner/sentry_utils');
describe('RunnerDeleteButton', () => {
let wrapper;
+ let apolloProvider;
+ let apolloCache;
let runnerDeleteHandler;
- const getTooltip = () => getBinding(wrapper.element, 'gl-tooltip').value;
- const getModal = () => getBinding(wrapper.element, 'gl-modal').value;
const findBtn = () => wrapper.findComponent(GlButton);
const findModal = () => wrapper.findComponent(RunnerDeleteModal);
+ const getTooltip = () => getBinding(wrapper.element, 'gl-tooltip').value;
+ const getModal = () => getBinding(findBtn().element, 'gl-modal').value;
+
const createComponent = ({ props = {}, mountFn = shallowMountExtended } = {}) => {
const { runner, ...propsData } = props;
wrapper = mountFn(RunnerDeleteButton, {
propsData: {
runner: {
+ // We need typename so that cache.identify works
+ // eslint-disable-next-line no-underscore-dangle
+ __typename: mockRunner.__typename,
id: mockRunner.id,
shortSha: mockRunner.shortSha,
...runner,
},
...propsData,
},
- apolloProvider: createMockApollo([[runnerDeleteMutation, runnerDeleteHandler]]),
+ apolloProvider,
directives: {
GlTooltip: createMockDirective(),
GlModal: createMockDirective(),
@@ -67,6 +77,11 @@ describe('RunnerDeleteButton', () => {
},
});
});
+ apolloProvider = createMockApollo([[runnerDeleteMutation, runnerDeleteHandler]]);
+ apolloCache = apolloProvider.defaultClient.cache;
+
+ jest.spyOn(apolloCache, 'evict');
+ jest.spyOn(apolloCache, 'gc');
createComponent();
});
@@ -88,6 +103,10 @@ describe('RunnerDeleteButton', () => {
expect(findModal().props('runnerName')).toBe(`#${mockRunnerId} (${mockRunner.shortSha})`);
});
+ it('Does not have tabindex when button is enabled', () => {
+ expect(wrapper.attributes('tabindex')).toBeUndefined();
+ });
+
it('Displays a modal when clicked', () => {
const modalId = `delete-runner-modal-${mockRunnerId}`;
@@ -140,6 +159,13 @@ describe('RunnerDeleteButton', () => {
expect(deleted[0][0].message).toMatch(`#${mockRunnerId}`);
expect(deleted[0][0].message).toMatch(`${mockRunner.shortSha}`);
});
+
+ it('evicts runner from apollo cache', () => {
+ expect(apolloCache.evict).toHaveBeenCalledWith({
+ id: apolloCache.identify(mockRunner),
+ });
+ expect(apolloCache.gc).toHaveBeenCalled();
+ });
});
describe('When update fails', () => {
@@ -190,6 +216,11 @@ describe('RunnerDeleteButton', () => {
it('error is shown to the user', () => {
expect(createAlert).toHaveBeenCalledTimes(1);
});
+
+ it('does not evict runner from apollo cache', () => {
+ expect(apolloCache.evict).not.toHaveBeenCalled();
+ expect(apolloCache.gc).not.toHaveBeenCalled();
+ });
});
});
@@ -230,4 +261,29 @@ describe('RunnerDeleteButton', () => {
});
});
});
+
+ describe.each`
+ reason | runner | tooltip
+ ${'runner belongs to more than 1 project'} | ${{ projectCount: 2 }} | ${I18N_DELETE_DISABLED_MANY_PROJECTS}
+ ${'unknown reason'} | ${{}} | ${I18N_DELETE_DISABLED_UNKNOWN_REASON}
+ `('When button is disabled because $reason', ({ runner, tooltip }) => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ disabled: true,
+ runner,
+ },
+ });
+ });
+
+ it('Displays a disabled delete button', () => {
+ expect(findBtn().props('disabled')).toBe(true);
+ });
+
+ it(`Tooltip "${tooltip}" is shown`, () => {
+ // tabindex is required for a11y
+ expect(wrapper.attributes('tabindex')).toBe('0');
+ expect(getTooltip()).toBe(tooltip);
+ });
+ });
});
diff --git a/spec/frontend/runner/components/runner_filtered_search_bar_spec.js b/spec/frontend/runner/components/runner_filtered_search_bar_spec.js
index fda96e5918e..b1b436e5443 100644
--- a/spec/frontend/runner/components/runner_filtered_search_bar_spec.js
+++ b/spec/frontend/runner/components/runner_filtered_search_bar_spec.js
@@ -4,7 +4,7 @@ import RunnerFilteredSearchBar from '~/runner/components/runner_filtered_search_
import { statusTokenConfig } from '~/runner/components/search_tokens/status_token_config';
import TagToken from '~/runner/components/search_tokens/tag_token.vue';
import { tagTokenConfig } from '~/runner/components/search_tokens/tag_token_config';
-import { PARAM_KEY_STATUS, PARAM_KEY_TAG, STATUS_ACTIVE, INSTANCE_TYPE } from '~/runner/constants';
+import { PARAM_KEY_STATUS, PARAM_KEY_TAG, STATUS_ONLINE, INSTANCE_TYPE } from '~/runner/constants';
import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
@@ -18,7 +18,7 @@ describe('RunnerList', () => {
const mockDefaultSort = 'CREATED_DESC';
const mockOtherSort = 'CONTACTED_DESC';
const mockFilters = [
- { type: PARAM_KEY_STATUS, value: { data: STATUS_ACTIVE, operator: '=' } },
+ { type: PARAM_KEY_STATUS, value: { data: STATUS_ONLINE, operator: '=' } },
{ type: 'filtered-search-term', value: { data: '' } },
];
@@ -113,7 +113,7 @@ describe('RunnerList', () => {
});
it('filter values are shown', () => {
- expect(findGlFilteredSearch().props('value')).toEqual(mockFilters);
+ expect(findGlFilteredSearch().props('value')).toMatchObject(mockFilters);
});
it('sort option is selected', () => {
diff --git a/spec/frontend/runner/components/runner_jobs_spec.js b/spec/frontend/runner/components/runner_jobs_spec.js
index 9abb2861005..9e40e911448 100644
--- a/spec/frontend/runner/components/runner_jobs_spec.js
+++ b/spec/frontend/runner/components/runner_jobs_spec.js
@@ -1,4 +1,4 @@
-import { GlSkeletonLoading } from '@gitlab/ui';
+import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
diff --git a/spec/frontend/runner/components/runner_list_spec.js b/spec/frontend/runner/components/runner_list_spec.js
index a0f42738d2c..872394430ae 100644
--- a/spec/frontend/runner/components/runner_list_spec.js
+++ b/spec/frontend/runner/components/runner_list_spec.js
@@ -6,7 +6,8 @@ import {
} from 'helpers/vue_test_utils_helper';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RunnerList from '~/runner/components/runner_list.vue';
-import { runnersData } from '../mock_data';
+import RunnerStatusPopover from '~/runner/components/runner_status_popover.vue';
+import { runnersData, onlineContactTimeoutSecs, staleTimeoutSecs } from '../mock_data';
const mockRunners = runnersData.data.runners.nodes;
const mockActiveRunnersCount = mockRunners.length;
@@ -28,26 +29,38 @@ describe('RunnerList', () => {
activeRunnersCount: mockActiveRunnersCount,
...props,
},
+ provide: {
+ onlineContactTimeoutSecs,
+ staleTimeoutSecs,
+ },
...options,
});
};
- beforeEach(() => {
- createComponent({}, mountExtended);
- });
-
afterEach(() => {
wrapper.destroy();
});
it('Displays headers', () => {
+ createComponent(
+ {
+ stubs: {
+ RunnerStatusPopover: {
+ template: '<div/>',
+ },
+ },
+ },
+ mountExtended,
+ );
+
const headerLabels = findHeaders().wrappers.map((w) => w.text());
+ expect(findHeaders().at(0).findComponent(RunnerStatusPopover).exists()).toBe(true);
+
expect(headerLabels).toEqual([
'Status',
'Runner',
'Version',
- 'IP',
'Jobs',
'Tags',
'Last contact',
@@ -56,19 +69,23 @@ describe('RunnerList', () => {
});
it('Sets runner id as a row key', () => {
- createComponent({});
+ createComponent();
expect(findTable().attributes('primary-key')).toBe('id');
});
it('Displays a list of runners', () => {
+ createComponent({}, mountExtended);
+
expect(findRows()).toHaveLength(4);
expect(findSkeletonLoader().exists()).toBe(false);
});
it('Displays details of a runner', () => {
- const { id, description, version, ipAddress, shortSha } = mockRunners[0];
+ const { id, description, version, shortSha } = mockRunners[0];
+
+ createComponent({}, mountExtended);
// Badges
expect(findCell({ fieldKey: 'status' }).text()).toMatchInterpolatedText(
@@ -83,7 +100,6 @@ describe('RunnerList', () => {
// Other fields
expect(findCell({ fieldKey: 'version' }).text()).toBe(version);
- expect(findCell({ fieldKey: 'ipAddress' }).text()).toBe(ipAddress);
expect(findCell({ fieldKey: 'jobCount' }).text()).toBe('0');
expect(findCell({ fieldKey: 'tagList' }).text()).toBe('');
expect(findCell({ fieldKey: 'contactedAt' }).text()).toEqual(expect.any(String));
@@ -92,6 +108,35 @@ describe('RunnerList', () => {
expect(findCell({ fieldKey: 'actions' }).exists()).toBe(true);
});
+ describe('When the list is checkable', () => {
+ beforeEach(() => {
+ createComponent(
+ {
+ props: {
+ checkable: true,
+ },
+ },
+ mountExtended,
+ );
+ });
+
+ it('Displays a checkbox field', () => {
+ expect(findCell({ fieldKey: 'checkbox' }).find('input').exists()).toBe(true);
+ });
+
+ it('Emits a checked event', () => {
+ const checkbox = findCell({ fieldKey: 'checkbox' }).find('input');
+
+ checkbox.setChecked();
+
+ expect(wrapper.emitted('checked')).toHaveLength(1);
+ expect(wrapper.emitted('checked')[0][0]).toEqual({
+ isChecked: true,
+ runner: mockRunners[0],
+ });
+ });
+ });
+
describe('Scoped cell slots', () => {
it('Render #runner-name slot in "summary" cell', () => {
createComponent(
@@ -156,6 +201,8 @@ describe('RunnerList', () => {
const { id, shortSha } = mockRunners[0];
const numericId = getIdFromGraphQLId(id);
+ createComponent({}, mountExtended);
+
expect(findCell({ fieldKey: 'summary' }).text()).toContain(`#${numericId} (${shortSha})`);
});
diff --git a/spec/frontend/runner/components/runner_pause_button_spec.js b/spec/frontend/runner/components/runner_pause_button_spec.js
index 3d9df03977e..9ebb30b6ed7 100644
--- a/spec/frontend/runner/components/runner_pause_button_spec.js
+++ b/spec/frontend/runner/components/runner_pause_button_spec.js
@@ -146,6 +146,10 @@ describe('RunnerPauseButton', () => {
it('The button does not have a loading state', () => {
expect(findBtn().props('loading')).toBe(false);
});
+
+ it('The button emits toggledPaused', () => {
+ expect(wrapper.emitted('toggledPaused')).toHaveLength(1);
+ });
});
describe('When update fails', () => {
diff --git a/spec/frontend/runner/components/runner_projects_spec.js b/spec/frontend/runner/components/runner_projects_spec.js
index 96de8d11bca..62ebc6539e2 100644
--- a/spec/frontend/runner/components/runner_projects_spec.js
+++ b/spec/frontend/runner/components/runner_projects_spec.js
@@ -1,4 +1,4 @@
-import { GlSkeletonLoading } from '@gitlab/ui';
+import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
diff --git a/spec/frontend/runner/components/runner_status_badge_spec.js b/spec/frontend/runner/components/runner_status_badge_spec.js
index c470c6bb989..bb833bd7d5a 100644
--- a/spec/frontend/runner/components/runner_status_badge_spec.js
+++ b/spec/frontend/runner/components/runner_status_badge_spec.js
@@ -7,6 +7,8 @@ import {
STATUS_OFFLINE,
STATUS_STALE,
STATUS_NEVER_CONTACTED,
+ I18N_NEVER_CONTACTED_TOOLTIP,
+ I18N_STALE_NEVER_CONTACTED_TOOLTIP,
} from '~/runner/constants';
describe('RunnerTypeBadge', () => {
@@ -59,7 +61,7 @@ describe('RunnerTypeBadge', () => {
expect(wrapper.text()).toBe('never contacted');
expect(findBadge().props('variant')).toBe('muted');
- expect(getTooltip().value).toMatch('This runner has never contacted');
+ expect(getTooltip().value).toBe(I18N_NEVER_CONTACTED_TOOLTIP);
});
it('renders offline state', () => {
@@ -72,9 +74,7 @@ describe('RunnerTypeBadge', () => {
expect(wrapper.text()).toBe('offline');
expect(findBadge().props('variant')).toBe('muted');
- expect(getTooltip().value).toBe(
- 'No recent contact from this runner; last contact was 1 day ago',
- );
+ expect(getTooltip().value).toBe('Runner is offline; last contact was 1 day ago');
});
it('renders stale state', () => {
@@ -87,7 +87,20 @@ describe('RunnerTypeBadge', () => {
expect(wrapper.text()).toBe('stale');
expect(findBadge().props('variant')).toBe('warning');
- expect(getTooltip().value).toBe('No contact from this runner in over 3 months');
+ expect(getTooltip().value).toBe('Runner is stale; last contact was 1 year ago');
+ });
+
+ it('renders stale state with no contact time', () => {
+ createComponent({
+ runner: {
+ contactedAt: null,
+ status: STATUS_STALE,
+ },
+ });
+
+ expect(wrapper.text()).toBe('stale');
+ expect(findBadge().props('variant')).toBe('warning');
+ expect(getTooltip().value).toBe(I18N_STALE_NEVER_CONTACTED_TOOLTIP);
});
describe('does not fail when data is missing', () => {
@@ -100,7 +113,7 @@ describe('RunnerTypeBadge', () => {
});
expect(wrapper.text()).toBe('online');
- expect(getTooltip().value).toBe('Runner is online; last contact was n/a');
+ expect(getTooltip().value).toBe('Runner is online; last contact was never');
});
it('status is missing', () => {
diff --git a/spec/frontend/runner/components/runner_status_popover_spec.js b/spec/frontend/runner/components/runner_status_popover_spec.js
new file mode 100644
index 00000000000..789283d1245
--- /dev/null
+++ b/spec/frontend/runner/components/runner_status_popover_spec.js
@@ -0,0 +1,36 @@
+import { GlSprintf } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import RunnerStatusPopover from '~/runner/components/runner_status_popover.vue';
+import HelpPopover from '~/vue_shared/components/help_popover.vue';
+import { onlineContactTimeoutSecs, staleTimeoutSecs } from '../mock_data';
+
+describe('RunnerStatusPopover', () => {
+ let wrapper;
+
+ const createComponent = ({ provide = {} } = {}) => {
+ wrapper = shallowMountExtended(RunnerStatusPopover, {
+ provide: {
+ onlineContactTimeoutSecs,
+ staleTimeoutSecs,
+ ...provide,
+ },
+ stubs: {
+ GlSprintf,
+ },
+ });
+ };
+
+ const findHelpPopover = () => wrapper.findComponent(HelpPopover);
+
+ it('renders popoover', () => {
+ createComponent();
+
+ expect(findHelpPopover().exists()).toBe(true);
+ });
+
+ it('renders complete text', () => {
+ createComponent();
+
+ expect(findHelpPopover().text()).toMatchSnapshot();
+ });
+});
diff --git a/spec/frontend/runner/graphql/local_state_spec.js b/spec/frontend/runner/graphql/local_state_spec.js
new file mode 100644
index 00000000000..5c4302e4aa2
--- /dev/null
+++ b/spec/frontend/runner/graphql/local_state_spec.js
@@ -0,0 +1,72 @@
+import createApolloClient from '~/lib/graphql';
+import { createLocalState } from '~/runner/graphql/list/local_state';
+import getCheckedRunnerIdsQuery from '~/runner/graphql/list/checked_runner_ids.query.graphql';
+
+describe('~/runner/graphql/list/local_state', () => {
+ let localState;
+ let apolloClient;
+
+ const createSubject = () => {
+ if (apolloClient) {
+ throw new Error('test subject already exists!');
+ }
+
+ localState = createLocalState();
+
+ const { cacheConfig, typeDefs } = localState;
+
+ apolloClient = createApolloClient({}, { cacheConfig, typeDefs });
+ };
+
+ const queryCheckedRunnerIds = () => {
+ const { checkedRunnerIds } = apolloClient.readQuery({
+ query: getCheckedRunnerIdsQuery,
+ });
+ return checkedRunnerIds;
+ };
+
+ beforeEach(() => {
+ createSubject();
+ });
+
+ afterEach(() => {
+ localState = null;
+ apolloClient = null;
+ });
+
+ describe('default', () => {
+ it('has empty checked list', () => {
+ expect(queryCheckedRunnerIds()).toEqual([]);
+ });
+ });
+
+ describe.each`
+ inputs | expected
+ ${[['a', true], ['b', true], ['b', true]]} | ${['a', 'b']}
+ ${[['a', true], ['b', true], ['a', false]]} | ${['b']}
+ ${[['c', true], ['b', true], ['a', true], ['d', false]]} | ${['c', 'b', 'a']}
+ `('setRunnerChecked', ({ inputs, expected }) => {
+ beforeEach(() => {
+ inputs.forEach(([id, isChecked]) => {
+ localState.localMutations.setRunnerChecked({ runner: { id }, isChecked });
+ });
+ });
+ it(`for inputs="${inputs}" has a ids="[${expected}]"`, () => {
+ expect(queryCheckedRunnerIds()).toEqual(expected);
+ });
+ });
+
+ describe('clearChecked', () => {
+ it('clears all checked items', () => {
+ ['a', 'b', 'c'].forEach((id) => {
+ localState.localMutations.setRunnerChecked({ runner: { id }, isChecked: true });
+ });
+
+ expect(queryCheckedRunnerIds()).toEqual(['a', 'b', 'c']);
+
+ localState.localMutations.clearChecked();
+
+ expect(queryCheckedRunnerIds()).toEqual([]);
+ });
+ });
+});
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 70e303e8626..02348bf737a 100644
--- a/spec/frontend/runner/group_runners/group_runners_app_spec.js
+++ b/spec/frontend/runner/group_runners/group_runners_app_spec.js
@@ -28,8 +28,9 @@ import {
INSTANCE_TYPE,
GROUP_TYPE,
PROJECT_TYPE,
+ PARAM_KEY_PAUSED,
PARAM_KEY_STATUS,
- STATUS_ACTIVE,
+ STATUS_ONLINE,
RUNNER_PAGE_SIZE,
I18N_EDIT,
} from '~/runner/constants';
@@ -38,7 +39,13 @@ import getGroupRunnersCountQuery from '~/runner/graphql/list/group_runners_count
import GroupRunnersApp from '~/runner/group_runners/group_runners_app.vue';
import { captureException } from '~/runner/sentry_utils';
import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
-import { groupRunnersData, groupRunnersDataPaginated, groupRunnersCountData } from '../mock_data';
+import {
+ groupRunnersData,
+ groupRunnersDataPaginated,
+ groupRunnersCountData,
+ onlineContactTimeoutSecs,
+ staleTimeoutSecs,
+} from '../mock_data';
Vue.use(VueApollo);
Vue.use(GlToast);
@@ -90,6 +97,10 @@ describe('GroupRunnersApp', () => {
groupRunnersLimitedCount: mockGroupRunnersLimitedCount,
...props,
},
+ provide: {
+ onlineContactTimeoutSecs,
+ staleTimeoutSecs,
+ },
});
};
@@ -178,13 +189,16 @@ describe('GroupRunnersApp', () => {
const tokens = findFilteredSearch().props('tokens');
- expect(tokens).toHaveLength(1);
- expect(tokens[0]).toEqual(
+ expect(tokens).toEqual([
+ expect.objectContaining({
+ type: PARAM_KEY_PAUSED,
+ options: expect.any(Array),
+ }),
expect.objectContaining({
type: PARAM_KEY_STATUS,
options: expect.any(Array),
}),
- );
+ ]);
});
describe('Single runner row', () => {
@@ -193,9 +207,11 @@ describe('GroupRunnersApp', () => {
const { webUrl, editUrl, node } = mockGroupRunnersEdges[0];
const { id: graphqlId, shortSha } = node;
const id = getIdFromGraphQLId(graphqlId);
+ const COUNT_QUERIES = 6; // Smart queries that display a filtered count of runners
+ const FILTERED_COUNT_QUERIES = 3; // Smart queries that display a count of runners in tabs
beforeEach(async () => {
- mockGroupRunnersQuery.mockClear();
+ mockGroupRunnersCountQuery.mockClear();
createComponent({ mountFn: mountExtended });
showToast = jest.spyOn(wrapper.vm.$root.$toast, 'show');
@@ -219,12 +235,20 @@ describe('GroupRunnersApp', () => {
});
});
- it('When runner is deleted, data is refetched and a toast is shown', async () => {
- expect(mockGroupRunnersQuery).toHaveBeenCalledTimes(1);
+ it('When runner is paused or unpaused, some data is refetched', async () => {
+ expect(mockGroupRunnersCountQuery).toHaveBeenCalledTimes(COUNT_QUERIES);
- findRunnerActionsCell().vm.$emit('deleted', { message: 'Runner deleted' });
+ findRunnerActionsCell().vm.$emit('toggledPaused');
+
+ expect(mockGroupRunnersCountQuery).toHaveBeenCalledTimes(
+ COUNT_QUERIES + FILTERED_COUNT_QUERIES,
+ );
- expect(mockGroupRunnersQuery).toHaveBeenCalledTimes(2);
+ expect(showToast).toHaveBeenCalledTimes(0);
+ });
+
+ it('When runner is deleted, data is refetched and a toast message is shown', async () => {
+ findRunnerActionsCell().vm.$emit('deleted', { message: 'Runner deleted' });
expect(showToast).toHaveBeenCalledTimes(1);
expect(showToast).toHaveBeenCalledWith('Runner deleted');
@@ -233,7 +257,7 @@ describe('GroupRunnersApp', () => {
describe('when a filter is preselected', () => {
beforeEach(async () => {
- setWindowLocation(`?status[]=${STATUS_ACTIVE}&runner_type[]=${INSTANCE_TYPE}`);
+ setWindowLocation(`?status[]=${STATUS_ONLINE}&runner_type[]=${INSTANCE_TYPE}`);
createComponent();
await waitForPromises();
@@ -242,7 +266,7 @@ describe('GroupRunnersApp', () => {
it('sets the filters in the search bar', () => {
expect(findRunnerFilteredSearchBar().props('value')).toEqual({
runnerType: INSTANCE_TYPE,
- filters: [{ type: 'status', value: { data: STATUS_ACTIVE, operator: '=' } }],
+ filters: [{ type: 'status', value: { data: STATUS_ONLINE, operator: '=' } }],
sort: 'CREATED_DESC',
pagination: { page: 1 },
});
@@ -251,7 +275,7 @@ describe('GroupRunnersApp', () => {
it('requests the runners with filter parameters', () => {
expect(mockGroupRunnersQuery).toHaveBeenLastCalledWith({
groupFullPath: mockGroupFullPath,
- status: STATUS_ACTIVE,
+ status: STATUS_ONLINE,
type: INSTANCE_TYPE,
sort: DEFAULT_SORT,
first: RUNNER_PAGE_SIZE,
@@ -263,7 +287,7 @@ describe('GroupRunnersApp', () => {
beforeEach(async () => {
findRunnerFilteredSearchBar().vm.$emit('input', {
runnerType: null,
- filters: [{ type: PARAM_KEY_STATUS, value: { data: STATUS_ACTIVE, operator: '=' } }],
+ filters: [{ type: PARAM_KEY_STATUS, value: { data: STATUS_ONLINE, operator: '=' } }],
sort: CREATED_ASC,
});
@@ -273,14 +297,14 @@ describe('GroupRunnersApp', () => {
it('updates the browser url', () => {
expect(updateHistory).toHaveBeenLastCalledWith({
title: expect.any(String),
- url: 'http://test.host/groups/group1/-/runners?status[]=ACTIVE&sort=CREATED_ASC',
+ url: 'http://test.host/groups/group1/-/runners?status[]=ONLINE&sort=CREATED_ASC',
});
});
it('requests the runners with filters', () => {
expect(mockGroupRunnersQuery).toHaveBeenLastCalledWith({
groupFullPath: mockGroupFullPath,
- status: STATUS_ACTIVE,
+ status: STATUS_ONLINE,
sort: CREATED_ASC,
first: RUNNER_PAGE_SIZE,
});
diff --git a/spec/frontend/runner/mock_data.js b/spec/frontend/runner/mock_data.js
index 49c25039719..fbe8926124c 100644
--- a/spec/frontend/runner/mock_data.js
+++ b/spec/frontend/runner/mock_data.js
@@ -14,6 +14,10 @@ import runnerWithGroupData from 'test_fixtures/graphql/runner/details/runner.que
import runnerProjectsData from 'test_fixtures/graphql/runner/details/runner_projects.query.graphql.json';
import runnerJobsData from 'test_fixtures/graphql/runner/details/runner_jobs.query.graphql.json';
+// Other mock data
+export const onlineContactTimeoutSecs = 2 * 60 * 60;
+export const staleTimeoutSecs = 5259492; // Ruby's `2.months`
+
export {
runnersData,
runnersCountData,
diff --git a/spec/frontend/runner/runner_search_utils_spec.js b/spec/frontend/runner/runner_search_utils_spec.js
index aff1ec882bb..7834e76fe48 100644
--- a/spec/frontend/runner/runner_search_utils_spec.js
+++ b/spec/frontend/runner/runner_search_utils_spec.js
@@ -181,6 +181,28 @@ describe('search_params.js', () => {
first: RUNNER_PAGE_SIZE,
},
},
+ {
+ name: 'paused runners',
+ urlQuery: '?paused[]=true',
+ search: {
+ runnerType: null,
+ filters: [{ type: 'paused', value: { data: 'true', operator: '=' } }],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { paused: true, sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ },
+ {
+ name: 'active runners',
+ urlQuery: '?paused[]=false',
+ search: {
+ runnerType: null,
+ filters: [{ type: 'paused', value: { data: 'false', operator: '=' } }],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: { paused: false, sort: 'CREATED_DESC', first: RUNNER_PAGE_SIZE },
+ },
];
describe('searchValidator', () => {
@@ -197,14 +219,18 @@ describe('search_params.js', () => {
expect(updateOutdatedUrl('http://test.host/?a=b')).toBe(null);
});
- it('returns updated url for updating NOT_CONNECTED to NEVER_CONTACTED', () => {
- expect(updateOutdatedUrl('http://test.host/admin/runners?status[]=NOT_CONNECTED')).toBe(
- 'http://test.host/admin/runners?status[]=NEVER_CONTACTED',
- );
+ it.each`
+ query | updatedQuery
+ ${'status[]=NOT_CONNECTED'} | ${'status[]=NEVER_CONTACTED'}
+ ${'status[]=NOT_CONNECTED&a=b'} | ${'status[]=NEVER_CONTACTED&a=b'}
+ ${'status[]=ACTIVE'} | ${'paused[]=false'}
+ ${'status[]=ACTIVE&a=b'} | ${'a=b&paused[]=false'}
+ ${'status[]=ACTIVE'} | ${'paused[]=false'}
+ ${'status[]=PAUSED'} | ${'paused[]=true'}
+ `('updates "$query" to "$updatedQuery"', ({ query, updatedQuery }) => {
+ const mockUrl = 'http://test.host/admin/runners?';
- expect(updateOutdatedUrl('http://test.host/admin/runners?status[]=NOT_CONNECTED&a=b')).toBe(
- 'http://test.host/admin/runners?status[]=NEVER_CONTACTED&a=b',
- );
+ expect(updateOutdatedUrl(`${mockUrl}${query}`)).toBe(`${mockUrl}${updatedQuery}`);
});
});
diff --git a/spec/frontend/runner/utils_spec.js b/spec/frontend/runner/utils_spec.js
index 3fa9784ecdf..1db9815dfd8 100644
--- a/spec/frontend/runner/utils_spec.js
+++ b/spec/frontend/runner/utils_spec.js
@@ -44,6 +44,10 @@ describe('~/runner/utils', () => {
thClass: expect.arrayContaining(mockClasses),
});
});
+
+ it('a field with custom options', () => {
+ expect(tableField({ foo: 'bar' })).toMatchObject({ foo: 'bar' });
+ });
});
describe('getPaginationVariables', () => {
diff --git a/spec/frontend/search/store/actions_spec.js b/spec/frontend/search/store/actions_spec.js
index 5f8cee8160f..67bd3194f20 100644
--- a/spec/frontend/search/store/actions_spec.js
+++ b/spec/frontend/search/store/actions_spec.js
@@ -56,7 +56,7 @@ describe('Global Search Store Actions', () => {
${actions.fetchGroups} | ${{ method: 'onGet', code: 200, res: MOCK_GROUPS }} | ${'success'} | ${[{ type: types.REQUEST_GROUPS }, { type: types.RECEIVE_GROUPS_SUCCESS, payload: MOCK_GROUPS }]} | ${0}
${actions.fetchGroups} | ${{ method: 'onGet', code: 500, res: null }} | ${'error'} | ${[{ type: types.REQUEST_GROUPS }, { type: types.RECEIVE_GROUPS_ERROR }]} | ${1}
${actions.fetchProjects} | ${{ method: 'onGet', code: 200, res: MOCK_PROJECTS }} | ${'success'} | ${[{ type: types.REQUEST_PROJECTS }, { type: types.RECEIVE_PROJECTS_SUCCESS, payload: MOCK_PROJECTS }]} | ${0}
- ${actions.fetchProjects} | ${{ method: 'onGet', code: 500, res: null }} | ${'error'} | ${[{ type: types.REQUEST_PROJECTS }, { type: types.RECEIVE_PROJECTS_ERROR }]} | ${2}
+ ${actions.fetchProjects} | ${{ method: 'onGet', code: 500, res: null }} | ${'error'} | ${[{ type: types.REQUEST_PROJECTS }, { type: types.RECEIVE_PROJECTS_ERROR }]} | ${1}
`(`axios calls`, ({ action, axiosMock, type, expectedMutations, flashCallCount }) => {
describe(action.name, () => {
describe(`on ${type}`, () => {
@@ -121,8 +121,8 @@ describe('Global Search Store Actions', () => {
describe('when groupId is set', () => {
it('calls Api.groupProjects with expected parameters', () => {
- actions.fetchProjects({ commit: mockCommit, state });
-
+ const callbackTest = jest.fn();
+ actions.fetchProjects({ commit: mockCommit, state }, undefined, callbackTest);
expect(Api.groupProjects).toHaveBeenCalledWith(
state.query.group_id,
state.query.search,
@@ -131,7 +131,8 @@ describe('Global Search Store Actions', () => {
include_subgroups: true,
with_shared: false,
},
- expect.any(Function),
+ callbackTest,
+ true,
);
expect(Api.projects).not.toHaveBeenCalled();
});
@@ -144,15 +145,10 @@ describe('Global Search Store Actions', () => {
it('calls Api.projects', () => {
actions.fetchProjects({ commit: mockCommit, state });
-
expect(Api.groupProjects).not.toHaveBeenCalled();
- expect(Api.projects).toHaveBeenCalledWith(
- state.query.search,
- {
- order_by: 'similarity',
- },
- expect.any(Function),
- );
+ expect(Api.projects).toHaveBeenCalledWith(state.query.search, {
+ order_by: 'similarity',
+ });
});
});
});
diff --git a/spec/frontend/search_autocomplete_spec.js b/spec/frontend/search_autocomplete_spec.js
index c643cf6557d..190f2803324 100644
--- a/spec/frontend/search_autocomplete_spec.js
+++ b/spec/frontend/search_autocomplete_spec.js
@@ -223,34 +223,22 @@ describe('Search autocomplete dropdown', () => {
});
}
- it('suggest Projects', (done) => {
- // eslint-disable-next-line promise/catch-or-return
- triggerAutocomplete().finally(() => {
- const list = widget.wrap.find('.dropdown-menu').find('ul');
- const link = "a[href$='/gitlab-org/gitlab-test']";
+ it('suggest Projects', async () => {
+ await triggerAutocomplete();
- expect(list.find(link).length).toBe(1);
+ const list = widget.wrap.find('.dropdown-menu').find('ul');
+ const link = "a[href$='/gitlab-org/gitlab-test']";
- done();
- });
-
- // Make sure jest properly acknowledge the `done` invocation
- jest.runOnlyPendingTimers();
+ expect(list.find(link).length).toBe(1);
});
- it('suggest Groups', (done) => {
- // eslint-disable-next-line promise/catch-or-return
- triggerAutocomplete().finally(() => {
- const list = widget.wrap.find('.dropdown-menu').find('ul');
- const link = "a[href$='/gitlab-org']";
+ it('suggest Groups', async () => {
+ await triggerAutocomplete();
- expect(list.find(link).length).toBe(1);
-
- done();
- });
+ const list = widget.wrap.find('.dropdown-menu').find('ul');
+ const link = "a[href$='/gitlab-org']";
- // Make sure jest properly acknowledge the `done` invocation
- jest.runOnlyPendingTimers();
+ expect(list.find(link).length).toBe(1);
});
});
diff --git a/spec/frontend/search_settings/components/search_settings_spec.js b/spec/frontend/search_settings/components/search_settings_spec.js
index 6beaea8dba5..d0a2018c7f0 100644
--- a/spec/frontend/search_settings/components/search_settings_spec.js
+++ b/spec/frontend/search_settings/components/search_settings_spec.js
@@ -1,5 +1,6 @@
import { GlSearchBoxByType } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import { setHTMLFixture } from 'helpers/fixtures';
import SearchSettings from '~/search_settings/components/search_settings.vue';
import { HIGHLIGHT_CLASS, HIDE_CLASS } from '~/search_settings/constants';
import { isExpanded, expandSection, closeSection } from '~/settings_panels';
@@ -11,7 +12,8 @@ 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.`;
+ const TEXT_CONTAIN_SEARCH_TERM = `This text contain ${SEARCH_TERM}.`;
+ const TEXT_WITH_SIBLING_ELEMENTS = `${SEARCH_TERM} <a data-testid="sibling" href="#">Learn more</a>.`;
let wrapper;
@@ -42,13 +44,7 @@ describe('search_settings/components/search_settings.vue', () => {
});
};
- const matchParentElement = () => {
- const highlightedList = Array.from(document.querySelectorAll(`.${HIGHLIGHT_CLASS}`));
- return highlightedList.map((element) => {
- return element.parentNode;
- });
- };
-
+ const findMatchSiblingElement = () => document.querySelector(`[data-testid="sibling"]`);
const findSearchBox = () => wrapper.find(GlSearchBoxByType);
const search = (term) => {
findSearchBox().vm.$emit('input', term);
@@ -56,7 +52,7 @@ describe('search_settings/components/search_settings.vue', () => {
const clearSearch = () => search('');
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div>
<div class="js-search-app"></div>
<div id="${ROOT_ID}">
@@ -69,6 +65,7 @@ describe('search_settings/components/search_settings.vue', () => {
<section id="${EXTRA_SETTINGS_ID}" class="settings">
<span>${SEARCH_TERM}</span>
<span>${TEXT_CONTAIN_SEARCH_TERM}</span>
+ <span>${TEXT_WITH_SIBLING_ELEMENTS}</span>
</section>
</div>
</div>
@@ -99,7 +96,7 @@ describe('search_settings/components/search_settings.vue', () => {
it('highlight elements that match the search term', () => {
search(SEARCH_TERM);
- expect(highlightedElementsCount()).toBe(2);
+ expect(highlightedElementsCount()).toBe(3);
});
it('highlight only search term and not the whole line', () => {
@@ -108,14 +105,26 @@ describe('search_settings/components/search_settings.vue', () => {
expect(highlightedTextNodes()).toBe(true);
});
- it('prevents search xss', () => {
+ // Regression test for https://gitlab.com/gitlab-org/gitlab/-/issues/350494
+ it('preserves elements that are siblings of matches', () => {
+ const snapshot = `
+ <a
+ data-testid="sibling"
+ href="#"
+ >
+ Learn more
+ </a>
+ `;
+
+ expect(findMatchSiblingElement()).toMatchInlineSnapshot(snapshot);
+
search(SEARCH_TERM);
- const parentNodeList = matchParentElement();
- parentNodeList.forEach((element) => {
- const scriptElement = element.getElementsByTagName('script');
- expect(scriptElement.length).toBe(0);
- });
+ expect(findMatchSiblingElement()).toMatchInlineSnapshot(snapshot);
+
+ clearSearch();
+
+ expect(findMatchSiblingElement()).toMatchInlineSnapshot(snapshot);
});
describe('default', () => {
diff --git a/spec/frontend/security_configuration/components/app_spec.js b/spec/frontend/security_configuration/components/app_spec.js
index 963577fa763..9a18cb636b2 100644
--- a/spec/frontend/security_configuration/components/app_spec.js
+++ b/spec/frontend/security_configuration/components/app_spec.js
@@ -1,4 +1,4 @@
-import { GlTab, GlTabs } from '@gitlab/ui';
+import { GlTab, GlTabs, GlLink } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
@@ -33,6 +33,7 @@ const autoDevopsHelpPagePath = '/autoDevopsHelpPagePath';
const autoDevopsPath = '/autoDevopsPath';
const gitlabCiHistoryPath = 'test/historyPath';
const projectFullPath = 'namespace/project';
+const vulnerabilityTrainingDocsPath = 'user/application_security/vulnerabilities/index';
useLocalStorageSpy();
@@ -55,6 +56,7 @@ describe('App component', () => {
autoDevopsHelpPagePath,
autoDevopsPath,
projectFullPath,
+ vulnerabilityTrainingDocsPath,
glFeatures: {
secureVulnerabilityTraining,
},
@@ -107,6 +109,7 @@ describe('App component', () => {
const findUpgradeBanner = () => wrapper.findComponent(UpgradeBanner);
const findAutoDevopsAlert = () => wrapper.findComponent(AutoDevopsAlert);
const findAutoDevopsEnabledAlert = () => wrapper.findComponent(AutoDevopsEnabledAlert);
+ const findVulnerabilityManagementTab = () => wrapper.findByTestId('vulnerability-management-tab');
const securityFeaturesMock = [
{
@@ -454,9 +457,14 @@ describe('App component', () => {
});
it('renders security training description', () => {
- const vulnerabilityManagementTab = wrapper.findByTestId('vulnerability-management-tab');
+ expect(findVulnerabilityManagementTab().text()).toContain(i18n.securityTrainingDescription);
+ });
+
+ it('renders link to help docs', () => {
+ const trainingLink = findVulnerabilityManagementTab().findComponent(GlLink);
- expect(vulnerabilityManagementTab.text()).toContain(i18n.securityTrainingDescription);
+ expect(trainingLink.text()).toBe('Learn more about vulnerability training');
+ expect(trainingLink.attributes('href')).toBe(vulnerabilityTrainingDocsPath);
});
});
diff --git a/spec/frontend/security_configuration/components/feature_card_badge_spec.js b/spec/frontend/security_configuration/components/feature_card_badge_spec.js
new file mode 100644
index 00000000000..dcde0808fa4
--- /dev/null
+++ b/spec/frontend/security_configuration/components/feature_card_badge_spec.js
@@ -0,0 +1,40 @@
+import { mount } from '@vue/test-utils';
+import { GlBadge, GlTooltip } from '@gitlab/ui';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import FeatureCardBadge from '~/security_configuration/components/feature_card_badge.vue';
+
+describe('Feature card badge component', () => {
+ let wrapper;
+
+ const createComponent = (propsData) => {
+ wrapper = extendedWrapper(
+ mount(FeatureCardBadge, {
+ propsData,
+ }),
+ );
+ };
+
+ const findTooltip = () => wrapper.findComponent(GlTooltip);
+ const findBadge = () => wrapper.findComponent(GlBadge);
+
+ describe('tooltip render', () => {
+ describe.each`
+ context | badge | badgeHref
+ ${'href on a badge object'} | ${{ tooltipText: 'test', badgeHref: 'href' }} | ${undefined}
+ ${'href as property '} | ${{ tooltipText: null, badgeHref: '' }} | ${'link'}
+ ${'default href no property on badge or component'} | ${{ tooltipText: null, badgeHref: '' }} | ${undefined}
+ `('given $context', ({ badge, badgeHref }) => {
+ beforeEach(() => {
+ createComponent({ badge, badgeHref });
+ });
+
+ it('should show badge when badge given in configuration and available', () => {
+ expect(findTooltip().exists()).toBe(Boolean(badge && badge.tooltipText));
+ });
+
+ it('should render correct link if link is provided', () => {
+ expect(findBadge().attributes().href).toEqual(badgeHref);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/security_configuration/components/feature_card_spec.js b/spec/frontend/security_configuration/components/feature_card_spec.js
index f0d902bf9fe..d10722be8ea 100644
--- a/spec/frontend/security_configuration/components/feature_card_spec.js
+++ b/spec/frontend/security_configuration/components/feature_card_spec.js
@@ -2,6 +2,7 @@ import { GlIcon } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import FeatureCard from '~/security_configuration/components/feature_card.vue';
+import FeatureCardBadge from '~/security_configuration/components/feature_card_badge.vue';
import ManageViaMr from '~/vue_shared/security_configuration/components/manage_via_mr.vue';
import { REPORT_TYPE_SAST } from '~/vue_shared/security_reports/constants';
import { makeFeature } from './utils';
@@ -16,6 +17,7 @@ describe('FeatureCard component', () => {
propsData,
stubs: {
ManageViaMr: true,
+ FeatureCardBadge: true,
},
}),
);
@@ -24,6 +26,8 @@ describe('FeatureCard component', () => {
const findLinks = ({ text, href }) =>
wrapper.findAll(`a[href="${href}"]`).filter((link) => link.text() === text);
+ const findBadge = () => wrapper.findComponent(FeatureCardBadge);
+
const findEnableLinks = () =>
findLinks({
text: `Enable ${feature.shortName ?? feature.name}`,
@@ -262,5 +266,28 @@ describe('FeatureCard component', () => {
});
});
});
+
+ describe('information badge', () => {
+ describe.each`
+ context | available | badge
+ ${'available feature with badge'} | ${true} | ${{ text: 'test' }}
+ ${'unavailable feature without badge'} | ${false} | ${null}
+ ${'available feature without badge'} | ${true} | ${null}
+ ${'unavailable feature with badge'} | ${false} | ${{ text: 'test' }}
+ ${'available feature with empty badge'} | ${false} | ${{}}
+ `('given $context', ({ available, badge }) => {
+ beforeEach(() => {
+ feature = makeFeature({
+ available,
+ badge,
+ });
+ createComponent({ feature });
+ });
+
+ it('should show badge when badge given in configuration and available', () => {
+ expect(findBadge().exists()).toBe(Boolean(available && badge && badge.text));
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/security_configuration/components/training_provider_list_spec.js b/spec/frontend/security_configuration/components/training_provider_list_spec.js
index b8c1bef0ddd..309a9cd4cd6 100644
--- a/spec/frontend/security_configuration/components/training_provider_list_spec.js
+++ b/spec/frontend/security_configuration/components/training_provider_list_spec.js
@@ -1,5 +1,13 @@
import * as Sentry from '@sentry/browser';
-import { GlAlert, GlLink, GlToggle, GlCard, GlSkeletonLoader, GlIcon } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlLink,
+ GlFormRadio,
+ GlToggle,
+ GlCard,
+ GlSkeletonLoader,
+ GlIcon,
+} from '@gitlab/ui';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
@@ -87,7 +95,7 @@ describe('TrainingProviderList component', () => {
const findLinks = () => wrapper.findAllComponents(GlLink);
const findToggles = () => wrapper.findAllComponents(GlToggle);
const findFirstToggle = () => findToggles().at(0);
- const findPrimaryProviderRadios = () => wrapper.findAllByTestId('primary-provider-radio');
+ const findPrimaryProviderRadios = () => wrapper.findAllComponents(GlFormRadio);
const findLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findErrorAlert = () => wrapper.findComponent(GlAlert);
const findLogos = () => wrapper.findAllByTestId('provider-logo');
@@ -177,8 +185,8 @@ describe('TrainingProviderList component', () => {
const primaryProviderRadioForCurrentCard = findPrimaryProviderRadios().at(index);
// if the given provider is not enabled it should not be possible select it as primary
- expect(primaryProviderRadioForCurrentCard.find('input').attributes('disabled')).toBe(
- isEnabled ? undefined : 'disabled',
+ expect(primaryProviderRadioForCurrentCard.attributes('disabled')).toBe(
+ isEnabled ? undefined : 'true',
);
expect(primaryProviderRadioForCurrentCard.text()).toBe(
diff --git a/spec/frontend/self_monitor/store/actions_spec.js b/spec/frontend/self_monitor/store/actions_spec.js
index 6bcb2a713ea..59ee87c4a02 100644
--- a/spec/frontend/self_monitor/store/actions_spec.js
+++ b/spec/frontend/self_monitor/store/actions_spec.js
@@ -16,27 +16,25 @@ describe('self monitor actions', () => {
});
describe('setSelfMonitor', () => {
- it('commits the SET_ENABLED mutation', (done) => {
- testAction(
+ it('commits the SET_ENABLED mutation', () => {
+ return testAction(
actions.setSelfMonitor,
null,
state,
[{ type: types.SET_ENABLED, payload: null }],
[],
- done,
);
});
});
describe('resetAlert', () => {
- it('commits the SET_ENABLED mutation', (done) => {
- testAction(
+ it('commits the SET_ENABLED mutation', () => {
+ return testAction(
actions.resetAlert,
null,
state,
[{ type: types.SET_SHOW_ALERT, payload: false }],
[],
- done,
);
});
});
@@ -54,8 +52,8 @@ describe('self monitor actions', () => {
});
});
- it('dispatches status request with job data', (done) => {
- testAction(
+ it('dispatches status request with job data', () => {
+ return testAction(
actions.requestCreateProject,
null,
state,
@@ -71,12 +69,11 @@ describe('self monitor actions', () => {
payload: '123',
},
],
- done,
);
});
- it('dispatches success with project path', (done) => {
- testAction(
+ it('dispatches success with project path', () => {
+ return testAction(
actions.requestCreateProjectStatus,
null,
state,
@@ -87,7 +84,6 @@ describe('self monitor actions', () => {
payload: { project_full_path: '/self-monitor-url' },
},
],
- done,
);
});
});
@@ -98,8 +94,8 @@ describe('self monitor actions', () => {
mock.onPost(state.createProjectEndpoint).reply(500);
});
- it('dispatches error', (done) => {
- testAction(
+ it('dispatches error', () => {
+ return testAction(
actions.requestCreateProject,
null,
state,
@@ -115,14 +111,13 @@ describe('self monitor actions', () => {
payload: new Error('Request failed with status code 500'),
},
],
- done,
);
});
});
describe('requestCreateProjectSuccess', () => {
- it('should commit the received data', (done) => {
- testAction(
+ it('should commit the received data', () => {
+ return testAction(
actions.requestCreateProjectSuccess,
{ project_full_path: '/self-monitor-url' },
state,
@@ -146,7 +141,6 @@ describe('self monitor actions', () => {
type: 'setSelfMonitor',
},
],
- done,
);
});
});
@@ -165,8 +159,8 @@ describe('self monitor actions', () => {
});
});
- it('dispatches status request with job data', (done) => {
- testAction(
+ it('dispatches status request with job data', () => {
+ return testAction(
actions.requestDeleteProject,
null,
state,
@@ -182,12 +176,11 @@ describe('self monitor actions', () => {
payload: '456',
},
],
- done,
);
});
- it('dispatches success with status', (done) => {
- testAction(
+ it('dispatches success with status', () => {
+ return testAction(
actions.requestDeleteProjectStatus,
null,
state,
@@ -198,7 +191,6 @@ describe('self monitor actions', () => {
payload: { status: 'success' },
},
],
- done,
);
});
});
@@ -209,8 +201,8 @@ describe('self monitor actions', () => {
mock.onDelete(state.deleteProjectEndpoint).reply(500);
});
- it('dispatches error', (done) => {
- testAction(
+ it('dispatches error', () => {
+ return testAction(
actions.requestDeleteProject,
null,
state,
@@ -226,14 +218,13 @@ describe('self monitor actions', () => {
payload: new Error('Request failed with status code 500'),
},
],
- done,
);
});
});
describe('requestDeleteProjectSuccess', () => {
- it('should commit mutations to remove previously set data', (done) => {
- testAction(
+ it('should commit mutations to remove previously set data', () => {
+ return testAction(
actions.requestDeleteProjectSuccess,
null,
state,
@@ -252,7 +243,6 @@ describe('self monitor actions', () => {
{ type: types.SET_LOADING, payload: false },
],
[],
- done,
);
});
});
diff --git a/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap b/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
index f57b9418be5..0f4dfdf8a75 100644
--- a/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
+++ b/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
@@ -3,7 +3,7 @@
exports[`EmptyStateComponent should render content 1`] = `
"<section class=\\"gl-display-flex empty-state gl-text-center gl-flex-direction-column\\">
<div class=\\"gl-max-w-full\\">
- <div class=\\"svg-250 svg-content\\"><img src=\\"/image.svg\\" alt=\\"\\" role=\\"img\\" class=\\"gl-max-w-full\\"></div>
+ <div class=\\"svg-250 svg-content\\"><img src=\\"/image.svg\\" alt=\\"\\" role=\\"img\\" class=\\"gl-max-w-full gl-dark-invert-keep-hue\\"></div>
</div>
<div class=\\"gl-max-w-full gl-m-auto\\">
<div class=\\"gl-mx-auto gl-my-0 gl-p-5\\">
diff --git a/spec/frontend/serverless/store/actions_spec.js b/spec/frontend/serverless/store/actions_spec.js
index 61b9bd121af..5fbecf081a6 100644
--- a/spec/frontend/serverless/store/actions_spec.js
+++ b/spec/frontend/serverless/store/actions_spec.js
@@ -7,13 +7,22 @@ import { mockServerlessFunctions, mockMetrics } from '../mock_data';
import { adjustMetricQuery } from '../utils';
describe('ServerlessActions', () => {
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
describe('fetchFunctions', () => {
- it('should successfully fetch functions', (done) => {
+ it('should successfully fetch functions', () => {
const endpoint = '/functions';
- const mock = new MockAdapter(axios);
mock.onGet(endpoint).reply(statusCodes.OK, JSON.stringify(mockServerlessFunctions));
- testAction(
+ return testAction(
fetchFunctions,
{ functionsPath: endpoint },
{},
@@ -22,68 +31,49 @@ describe('ServerlessActions', () => {
{ type: 'requestFunctionsLoading' },
{ type: 'receiveFunctionsSuccess', payload: mockServerlessFunctions },
],
- () => {
- mock.restore();
- done();
- },
);
});
- it('should successfully retry', (done) => {
+ it('should successfully retry', () => {
const endpoint = '/functions';
- const mock = new MockAdapter(axios);
mock
.onGet(endpoint)
.reply(() => new Promise((resolve) => setTimeout(() => resolve(200), Infinity)));
- testAction(
+ return testAction(
fetchFunctions,
{ functionsPath: endpoint },
{},
[],
[{ type: 'requestFunctionsLoading' }],
- () => {
- mock.restore();
- done();
- },
);
});
});
describe('fetchMetrics', () => {
- it('should return no prometheus', (done) => {
+ it('should return no prometheus', () => {
const endpoint = '/metrics';
- const mock = new MockAdapter(axios);
mock.onGet(endpoint).reply(statusCodes.NO_CONTENT);
- testAction(
+ return testAction(
fetchMetrics,
{ metricsPath: endpoint, hasPrometheus: false },
{},
[],
[{ type: 'receiveMetricsNoPrometheus' }],
- () => {
- mock.restore();
- done();
- },
);
});
- it('should successfully fetch metrics', (done) => {
+ it('should successfully fetch metrics', () => {
const endpoint = '/metrics';
- const mock = new MockAdapter(axios);
mock.onGet(endpoint).reply(statusCodes.OK, JSON.stringify(mockMetrics));
- testAction(
+ return testAction(
fetchMetrics,
{ metricsPath: endpoint, hasPrometheus: true },
{},
[],
[{ type: 'receiveMetricsSuccess', payload: adjustMetricQuery(mockMetrics) }],
- () => {
- mock.restore();
- done();
- },
);
});
});
diff --git a/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js b/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
index c105810e11c..0b672cbc93e 100644
--- a/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
+++ b/spec/frontend/set_status_modal/set_status_modal_wrapper_spec.js
@@ -26,7 +26,7 @@ describe('SetStatusModalWrapper', () => {
defaultEmoji,
};
- const createComponent = (props = {}, improvedEmojiPicker = false) => {
+ const createComponent = (props = {}) => {
return shallowMount(SetStatusModalWrapper, {
propsData: {
...defaultProps,
@@ -35,19 +35,15 @@ describe('SetStatusModalWrapper', () => {
mocks: {
$toast,
},
- provide: {
- glFeatures: { improvedEmojiPicker },
- },
});
};
const findModal = () => wrapper.find(GlModal);
const findFormField = (field) => wrapper.find(`[name="user[status][${field}]"]`);
const findClearStatusButton = () => wrapper.find('.js-clear-user-status-button');
- const findNoEmojiPlaceholder = () => wrapper.find('.js-no-emoji-placeholder');
- const findToggleEmojiButton = () => wrapper.find('.js-toggle-emoji-menu');
const findAvailabilityCheckbox = () => wrapper.find(GlFormCheckbox);
const findClearStatusAtMessage = () => wrapper.find('[data-testid="clear-status-at-message"]');
+ const getEmojiPicker = () => wrapper.findComponent(EmojiPicker);
const initModal = async ({ mockOnUpdateSuccess = true, mockOnUpdateFailure = true } = {}) => {
const modal = findModal();
@@ -95,12 +91,6 @@ describe('SetStatusModalWrapper', () => {
expect(findClearStatusButton().isVisible()).toBe(true);
});
- it('clicking the toggle emoji button displays the emoji list', () => {
- expect(wrapper.vm.showEmojiMenu).not.toHaveBeenCalled();
- findToggleEmojiButton().trigger('click');
- expect(wrapper.vm.showEmojiMenu).toHaveBeenCalled();
- });
-
it('displays the clear status at dropdown', () => {
expect(wrapper.find('[data-testid="clear-status-at-dropdown"]').exists()).toBe(true);
});
@@ -108,16 +98,6 @@ describe('SetStatusModalWrapper', () => {
it('does not display the clear status at message', () => {
expect(findClearStatusAtMessage().exists()).toBe(false);
});
- });
-
- describe('improvedEmojiPicker is true', () => {
- const getEmojiPicker = () => wrapper.findComponent(EmojiPicker);
-
- beforeEach(async () => {
- await initEmojiMock();
- wrapper = createComponent({}, true);
- return initModal();
- });
it('renders emoji picker dropdown with custom positioning', () => {
expect(getEmojiPicker().props()).toMatchObject({
@@ -147,10 +127,6 @@ describe('SetStatusModalWrapper', () => {
it('hides the clear status button', () => {
expect(findClearStatusButton().isVisible()).toBe(false);
});
-
- it('shows the placeholder emoji', () => {
- expect(findNoEmojiPlaceholder().isVisible()).toBe(true);
- });
});
describe('with no currentEmoji set', () => {
@@ -163,22 +139,6 @@ describe('SetStatusModalWrapper', () => {
it('does not set the hidden status emoji field', () => {
expect(findFormField('emoji').element.value).toBe('');
});
-
- it('hides the placeholder emoji', () => {
- expect(findNoEmojiPlaceholder().isVisible()).toBe(false);
- });
-
- describe('with no currentMessage set', () => {
- beforeEach(async () => {
- await initEmojiMock();
- wrapper = createComponent({ currentEmoji: '', currentMessage: '' });
- return initModal();
- });
-
- it('shows the placeholder emoji', () => {
- expect(findNoEmojiPlaceholder().isVisible()).toBe(true);
- });
- });
});
describe('with currentClearStatusAfter set', () => {
diff --git a/spec/frontend/shortcuts_spec.js b/spec/frontend/shortcuts_spec.js
index 49148123a1c..8b9a11056f2 100644
--- a/spec/frontend/shortcuts_spec.js
+++ b/spec/frontend/shortcuts_spec.js
@@ -41,7 +41,7 @@ describe('Shortcuts', () => {
).toHaveBeenCalled();
});
- it('focues preview button inside edit comment form', () => {
+ it('focuses preview button inside edit comment form', () => {
document.querySelector('.js-note-edit').click();
Shortcuts.toggleMarkdownPreview(
diff --git a/spec/frontend/sidebar/assignees_realtime_spec.js b/spec/frontend/sidebar/assignees_realtime_spec.js
index 2249a1c08b8..ae8f07bf901 100644
--- a/spec/frontend/sidebar/assignees_realtime_spec.js
+++ b/spec/frontend/sidebar/assignees_realtime_spec.js
@@ -2,11 +2,16 @@ import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
import AssigneesRealtime from '~/sidebar/components/assignees/assignees_realtime.vue';
import issuableAssigneesSubscription from '~/sidebar/queries/issuable_assignees.subscription.graphql';
import SidebarMediator from '~/sidebar/sidebar_mediator';
import getIssueAssigneesQuery from '~/vue_shared/components/sidebar/queries/get_issue_assignees.query.graphql';
-import Mock, { issuableQueryResponse, subscriptionNullResponse } from './mock_data';
+import Mock, {
+ issuableQueryResponse,
+ subscriptionNullResponse,
+ subscriptionResponse,
+} from './mock_data';
Vue.use(VueApollo);
@@ -20,7 +25,6 @@ describe('Assignees Realtime', () => {
const createComponent = ({
issuableType = 'issue',
- issuableId = 1,
subscriptionHandler = subscriptionInitialHandler,
} = {}) => {
fakeApollo = createMockApollo([
@@ -30,7 +34,6 @@ describe('Assignees Realtime', () => {
wrapper = shallowMount(AssigneesRealtime, {
propsData: {
issuableType,
- issuableId,
queryVariables: {
issuableIid: '1',
projectPath: 'path/to/project',
@@ -60,11 +63,23 @@ describe('Assignees Realtime', () => {
});
});
- it('calls the subscription with correct variable for issue', () => {
+ it('calls the subscription with correct variable for issue', async () => {
createComponent();
+ await waitForPromises();
expect(subscriptionInitialHandler).toHaveBeenCalledWith({
issuableId: 'gid://gitlab/Issue/1',
});
});
+
+ it('emits an `assigneesUpdated` event on subscription response', async () => {
+ createComponent({
+ subscriptionHandler: jest.fn().mockResolvedValue(subscriptionResponse),
+ });
+ await waitForPromises();
+
+ expect(wrapper.emitted('assigneesUpdated')).toEqual([
+ [{ id: '1', assignees: subscriptionResponse.data.issuableAssigneesUpdated.assignees.nodes }],
+ ]);
+ });
});
diff --git a/spec/frontend/sidebar/components/incidents/escalation_status_spec.js b/spec/frontend/sidebar/components/incidents/escalation_status_spec.js
index 7a736624fc0..8d8c10d10f1 100644
--- a/spec/frontend/sidebar/components/incidents/escalation_status_spec.js
+++ b/spec/frontend/sidebar/components/incidents/escalation_status_spec.js
@@ -1,4 +1,5 @@
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import waitForPromises from 'helpers/wait_for_promises';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import EscalationStatus from '~/sidebar/components/incidents/escalation_status.vue';
import {
@@ -25,6 +26,11 @@ describe('EscalationStatus', () => {
const findDropdownComponent = () => wrapper.findComponent(GlDropdown);
const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findDropdownMenu = () => findDropdownComponent().find('.dropdown-menu');
+ const toggleDropdown = async () => {
+ await findDropdownComponent().findComponent('button').trigger('click');
+ await waitForPromises();
+ };
describe('status', () => {
it('shows the current status', () => {
@@ -49,4 +55,32 @@ describe('EscalationStatus', () => {
expect(wrapper.emitted().input[0][0]).toBe(STATUS_ACKNOWLEDGED);
});
});
+
+ describe('close behavior', () => {
+ it('allows the dropdown to be closed by default', async () => {
+ createComponent();
+ // Open dropdown
+ await toggleDropdown();
+
+ expect(findDropdownMenu().classes('show')).toBe(true);
+
+ // Attempt to close dropdown
+ await toggleDropdown();
+
+ expect(findDropdownMenu().classes('show')).toBe(false);
+ });
+
+ it('preventDropdownClose prevents the dropdown from closing', async () => {
+ createComponent({ preventDropdownClose: true });
+ // Open dropdown
+ await toggleDropdown();
+
+ expect(findDropdownMenu().classes('show')).toBe(true);
+
+ // Attempt to close dropdown
+ await toggleDropdown();
+
+ expect(findDropdownMenu().classes('show')).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/sidebar/mock_data.js b/spec/frontend/sidebar/mock_data.js
index fbca00636b6..2b421037339 100644
--- a/spec/frontend/sidebar/mock_data.js
+++ b/spec/frontend/sidebar/mock_data.js
@@ -415,6 +415,28 @@ export const subscriptionNullResponse = {
},
};
+export const subscriptionResponse = {
+ data: {
+ issuableAssigneesUpdated: {
+ id: '1',
+ assignees: {
+ nodes: [
+ {
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/1',
+ avatarUrl:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon',
+ name: 'Administrator',
+ username: 'root',
+ webUrl: '/root',
+ status: null,
+ },
+ ],
+ },
+ },
+ },
+};
+
const mockUser1 = {
__typename: 'UserCore',
id: 'gid://gitlab/User/1',
diff --git a/spec/frontend/sidebar/participants_spec.js b/spec/frontend/sidebar/participants_spec.js
index 356628849d9..2517b625225 100644
--- a/spec/frontend/sidebar/participants_spec.js
+++ b/spec/frontend/sidebar/participants_spec.js
@@ -17,8 +17,7 @@ const PARTICIPANT_LIST = [PARTICIPANT, { ...PARTICIPANT, id: 2 }, { ...PARTICIPA
describe('Participants', () => {
let wrapper;
- const getMoreParticipantsButton = () => wrapper.find('button');
-
+ const getMoreParticipantsButton = () => wrapper.find('[data-testid="more-participants"]');
const getCollapsedParticipantsCount = () => wrapper.find('[data-testid="collapsed-count"]');
const mountComponent = (propsData) =>
@@ -167,7 +166,7 @@ describe('Participants', () => {
expect(wrapper.vm.isShowingMoreParticipants).toBe(false);
- getMoreParticipantsButton().trigger('click');
+ getMoreParticipantsButton().vm.$emit('click');
expect(wrapper.vm.isShowingMoreParticipants).toBe(true);
});
diff --git a/spec/frontend/snippets/components/edit_spec.js b/spec/frontend/snippets/components/edit_spec.js
index 61424fa1eb2..9cfe136129a 100644
--- a/spec/frontend/snippets/components/edit_spec.js
+++ b/spec/frontend/snippets/components/edit_spec.js
@@ -19,8 +19,8 @@ import {
SNIPPET_VISIBILITY_INTERNAL,
SNIPPET_VISIBILITY_PUBLIC,
} from '~/snippets/constants';
-import CreateSnippetMutation from '~/snippets/mutations/createSnippet.mutation.graphql';
-import UpdateSnippetMutation from '~/snippets/mutations/updateSnippet.mutation.graphql';
+import CreateSnippetMutation from '~/snippets/mutations/create_snippet.mutation.graphql';
+import UpdateSnippetMutation from '~/snippets/mutations/update_snippet.mutation.graphql';
import FormFooterActions from '~/vue_shared/components/form/form_footer_actions.vue';
import TitleField from '~/vue_shared/components/form/title.vue';
import { testEntries, createGQLSnippetsQueryResponse, createGQLSnippet } from '../test_utils';
diff --git a/spec/frontend/snippets/components/snippet_header_spec.js b/spec/frontend/snippets/components/snippet_header_spec.js
index 1b9d170556b..b750225a383 100644
--- a/spec/frontend/snippets/components/snippet_header_spec.js
+++ b/spec/frontend/snippets/components/snippet_header_spec.js
@@ -8,7 +8,7 @@ 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, { i18n } from '~/snippets/components/snippet_header.vue';
-import DeleteSnippetMutation from '~/snippets/mutations/deleteSnippet.mutation.graphql';
+import DeleteSnippetMutation from '~/snippets/mutations/delete_snippet.mutation.graphql';
import axios from '~/lib/utils/axios_utils';
import createFlash, { FLASH_TYPES } from '~/flash';
diff --git a/spec/frontend/task_list_spec.js b/spec/frontend/task_list_spec.js
index bf470e7e126..fbdb73ae6de 100644
--- a/spec/frontend/task_list_spec.js
+++ b/spec/frontend/task_list_spec.js
@@ -121,7 +121,7 @@ describe('TaskList', () => {
});
describe('update', () => {
- it('should disable task list items and make a patch request then enable them again', (done) => {
+ it('should disable task list items and make a patch request then enable them again', () => {
const response = { data: { lock_version: 3 } };
jest.spyOn(taskList, 'enableTaskListItems').mockImplementation(() => {});
jest.spyOn(taskList, 'disableTaskListItems').mockImplementation(() => {});
@@ -156,20 +156,17 @@ describe('TaskList', () => {
expect(taskList.onUpdate).toHaveBeenCalled();
- update
- .then(() => {
- expect(taskList.disableTaskListItems).toHaveBeenCalledWith(event);
- expect(axios.patch).toHaveBeenCalledWith(endpoint, patchData);
- expect(taskList.enableTaskListItems).toHaveBeenCalledWith(event);
- expect(taskList.onSuccess).toHaveBeenCalledWith(response.data);
- expect(taskList.lockVersion).toEqual(response.data.lock_version);
- })
- .then(done)
- .catch(done.fail);
+ return update.then(() => {
+ expect(taskList.disableTaskListItems).toHaveBeenCalledWith(event);
+ expect(axios.patch).toHaveBeenCalledWith(endpoint, patchData);
+ expect(taskList.enableTaskListItems).toHaveBeenCalledWith(event);
+ expect(taskList.onSuccess).toHaveBeenCalledWith(response.data);
+ expect(taskList.lockVersion).toEqual(response.data.lock_version);
+ });
});
});
- it('should handle request error and enable task list items', (done) => {
+ it('should handle request error and enable task list items', () => {
const response = { data: { error: 1 } };
jest.spyOn(taskList, 'enableTaskListItems').mockImplementation(() => {});
jest.spyOn(taskList, 'onUpdate').mockImplementation(() => {});
@@ -182,12 +179,9 @@ describe('TaskList', () => {
expect(taskList.onUpdate).toHaveBeenCalled();
- update
- .then(() => {
- expect(taskList.enableTaskListItems).toHaveBeenCalledWith(event);
- expect(taskList.onError).toHaveBeenCalledWith(response.data);
- })
- .then(done)
- .catch(done.fail);
+ return update.then(() => {
+ expect(taskList.enableTaskListItems).toHaveBeenCalledWith(event);
+ expect(taskList.onError).toHaveBeenCalledWith(response.data);
+ });
});
});
diff --git a/spec/frontend/terraform/components/empty_state_spec.js b/spec/frontend/terraform/components/empty_state_spec.js
index b1303cf2b5e..21bfff5f1be 100644
--- a/spec/frontend/terraform/components/empty_state_spec.js
+++ b/spec/frontend/terraform/components/empty_state_spec.js
@@ -13,15 +13,20 @@ describe('EmptyStateComponent', () => {
const findLink = () => wrapper.findComponent(GlLink);
beforeEach(() => {
- wrapper = shallowMount(EmptyState, { propsData, stubs: { GlEmptyState, GlLink } });
+ wrapper = shallowMount(EmptyState, { propsData });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
});
it('should render content', () => {
- expect(findEmptyState().exists()).toBe(true);
- expect(wrapper.text()).toContain('Get started with Terraform');
+ expect(findEmptyState().props('title')).toBe(
+ "Your project doesn't have any Terraform state files",
+ );
});
- it('should have a link to the GitLab managed Terraform States docs', () => {
+ it('should have a link to the GitLab managed Terraform states docs', () => {
expect(findLink().attributes('href')).toBe(docsUrl);
});
});
diff --git a/spec/frontend/terraform/components/mock_data.js b/spec/frontend/terraform/components/mock_data.js
new file mode 100644
index 00000000000..f0109047d4c
--- /dev/null
+++ b/spec/frontend/terraform/components/mock_data.js
@@ -0,0 +1,35 @@
+export const getStatesResponse = {
+ data: {
+ project: {
+ id: 'project-1',
+ terraformStates: {
+ count: 1,
+ nodes: {
+ _showDetails: true,
+ errorMessages: [],
+ loadingLock: false,
+ loadingRemove: false,
+ id: 'state-1',
+ name: 'state',
+ lockedAt: '01-01-2022',
+ updatedAt: '01-01-2022',
+ lockedByUser: {
+ id: 'user-1',
+ avatarUrl: 'avatar',
+ name: 'User 1',
+ username: 'user-1',
+ webUrl: 'web',
+ },
+ latestVersion: null,
+ },
+ pageInfo: {
+ __typename: 'PageInfo',
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: 'prev',
+ endCursor: 'next',
+ },
+ },
+ },
+ },
+};
diff --git a/spec/frontend/terraform/components/states_table_actions_spec.js b/spec/frontend/terraform/components/states_table_actions_spec.js
index a6c80b95af4..d01f6af9023 100644
--- a/spec/frontend/terraform/components/states_table_actions_spec.js
+++ b/spec/frontend/terraform/components/states_table_actions_spec.js
@@ -9,6 +9,8 @@ import StateActions from '~/terraform/components/states_table_actions.vue';
import lockStateMutation from '~/terraform/graphql/mutations/lock_state.mutation.graphql';
import removeStateMutation from '~/terraform/graphql/mutations/remove_state.mutation.graphql';
import unlockStateMutation from '~/terraform/graphql/mutations/unlock_state.mutation.graphql';
+import getStatesQuery from '~/terraform/graphql/queries/get_states.query.graphql';
+import { getStatesResponse } from './mock_data';
Vue.use(VueApollo);
@@ -49,6 +51,7 @@ describe('StatesTableActions', () => {
[lockStateMutation, lockResponse],
[removeStateMutation, removeResponse],
[unlockStateMutation, unlockResponse],
+ [getStatesQuery, jest.fn().mockResolvedValue(getStatesResponse)],
],
{
Mutation: {
diff --git a/spec/frontend/tracking/tracking_spec.js b/spec/frontend/tracking/tracking_spec.js
index d85299cdfc3..665bf44fc77 100644
--- a/spec/frontend/tracking/tracking_spec.js
+++ b/spec/frontend/tracking/tracking_spec.js
@@ -129,6 +129,72 @@ describe('Tracking', () => {
});
});
+ describe('.definition', () => {
+ const TEST_VALID_BASENAME = '202108302307_default_click_button';
+ const TEST_EVENT_DATA = { category: undefined, action: 'click_button' };
+ let eventSpy;
+ let dispatcherSpy;
+
+ beforeAll(() => {
+ Tracking.definitionsManifest = {
+ '202108302307_default_click_button': 'config/events/202108302307_default_click_button.yml',
+ };
+ });
+
+ beforeEach(() => {
+ eventSpy = jest.spyOn(Tracking, 'event');
+ dispatcherSpy = jest.spyOn(Tracking, 'dispatchFromDefinition');
+ });
+
+ it('throws an error if the definition does not exists', () => {
+ const basename = '20220230_default_missing_definition';
+ const expectedError = new Error(`Missing Snowplow event definition "${basename}"`);
+
+ expect(() => Tracking.definition(basename)).toThrow(expectedError);
+ });
+
+ it('dispatches an event from a definition present in the manifest', () => {
+ Tracking.definition(TEST_VALID_BASENAME);
+
+ expect(dispatcherSpy).toHaveBeenCalledWith(TEST_VALID_BASENAME, {});
+ });
+
+ it('push events to the queue if not loaded', () => {
+ Tracking.definitionsLoaded = false;
+ Tracking.definitionsEventsQueue = [];
+
+ const dispatched = Tracking.definition(TEST_VALID_BASENAME);
+
+ expect(dispatched).toBe(false);
+ expect(Tracking.definitionsEventsQueue[0]).toStrictEqual([TEST_VALID_BASENAME, {}]);
+ expect(eventSpy).not.toHaveBeenCalled();
+ });
+
+ it('dispatch events when the definition is loaded', () => {
+ const definition = { key: TEST_VALID_BASENAME, ...TEST_EVENT_DATA };
+ Tracking.definitions = [{ ...definition }];
+ Tracking.definitionsEventsQueue = [];
+ Tracking.definitionsLoaded = true;
+
+ const dispatched = Tracking.definition(TEST_VALID_BASENAME);
+
+ expect(dispatched).not.toBe(false);
+ expect(Tracking.definitionsEventsQueue).toEqual([]);
+ expect(eventSpy).toHaveBeenCalledWith(definition.category, definition.action, {});
+ });
+
+ it('lets defined event data takes precedence', () => {
+ const definition = { key: TEST_VALID_BASENAME, category: undefined, action: 'click_button' };
+ const eventData = { category: TEST_CATEGORY };
+ Tracking.definitions = [{ ...definition }];
+ Tracking.definitionsLoaded = true;
+
+ Tracking.definition(TEST_VALID_BASENAME, eventData);
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, definition.action, eventData);
+ });
+ });
+
describe('.enableFormTracking', () => {
it('tells snowplow to enable form tracking, with only explicit contexts', () => {
const config = { forms: { allow: ['form-class1'] }, fields: { allow: ['input-class1'] } };
diff --git a/spec/frontend/user_lists/components/edit_user_list_spec.js b/spec/frontend/user_lists/components/edit_user_list_spec.js
index 7cafe5e1f56..941c8244247 100644
--- a/spec/frontend/user_lists/components/edit_user_list_spec.js
+++ b/spec/frontend/user_lists/components/edit_user_list_spec.js
@@ -8,7 +8,7 @@ import { redirectTo } from '~/lib/utils/url_utility';
import EditUserList from '~/user_lists/components/edit_user_list.vue';
import UserListForm from '~/user_lists/components/user_list_form.vue';
import createStore from '~/user_lists/store/edit';
-import { userList } from '../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
jest.mock('~/api');
jest.mock('~/lib/utils/url_utility');
diff --git a/spec/frontend/user_lists/components/new_user_list_spec.js b/spec/frontend/user_lists/components/new_user_list_spec.js
index 5eb44970fe4..ace4a284347 100644
--- a/spec/frontend/user_lists/components/new_user_list_spec.js
+++ b/spec/frontend/user_lists/components/new_user_list_spec.js
@@ -7,7 +7,7 @@ import Api from '~/api';
import { redirectTo } from '~/lib/utils/url_utility';
import NewUserList from '~/user_lists/components/new_user_list.vue';
import createStore from '~/user_lists/store/new';
-import { userList } from '../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
jest.mock('~/api');
jest.mock('~/lib/utils/url_utility');
diff --git a/spec/frontend/user_lists/components/user_list_form_spec.js b/spec/frontend/user_lists/components/user_list_form_spec.js
index 42f7659600e..e09d8eac32f 100644
--- a/spec/frontend/user_lists/components/user_list_form_spec.js
+++ b/spec/frontend/user_lists/components/user_list_form_spec.js
@@ -1,6 +1,6 @@
import { mount } from '@vue/test-utils';
import Form from '~/user_lists/components/user_list_form.vue';
-import { userList } from '../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
describe('user_lists/components/user_list_form', () => {
let wrapper;
diff --git a/spec/frontend/user_lists/components/user_list_spec.js b/spec/frontend/user_lists/components/user_list_spec.js
index 88dad06938b..f126c733dd5 100644
--- a/spec/frontend/user_lists/components/user_list_spec.js
+++ b/spec/frontend/user_lists/components/user_list_spec.js
@@ -7,7 +7,7 @@ import Api from '~/api';
import UserList from '~/user_lists/components/user_list.vue';
import createStore from '~/user_lists/store/show';
import { parseUserIds, stringifyUserIds } from '~/user_lists/store/utils';
-import { userList } from '../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
jest.mock('~/api');
diff --git a/spec/frontend/user_lists/components/user_lists_spec.js b/spec/frontend/user_lists/components/user_lists_spec.js
index 10742c029c1..161eb036361 100644
--- a/spec/frontend/user_lists/components/user_lists_spec.js
+++ b/spec/frontend/user_lists/components/user_lists_spec.js
@@ -9,7 +9,7 @@ import UserListsComponent from '~/user_lists/components/user_lists.vue';
import UserListsTable from '~/user_lists/components/user_lists_table.vue';
import createStore from '~/user_lists/store/index';
import TablePagination from '~/vue_shared/components/pagination/table_pagination.vue';
-import { userList } from '../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
jest.mock('~/api');
diff --git a/spec/frontend/user_lists/components/user_lists_table_spec.js b/spec/frontend/user_lists/components/user_lists_table_spec.js
index 63587703392..08eb8ae0843 100644
--- a/spec/frontend/user_lists/components/user_lists_table_spec.js
+++ b/spec/frontend/user_lists/components/user_lists_table_spec.js
@@ -3,7 +3,7 @@ import { mount } from '@vue/test-utils';
import * as timeago from 'timeago.js';
import { nextTick } from 'vue';
import UserListsTable from '~/user_lists/components/user_lists_table.vue';
-import { userList } from '../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
jest.mock('timeago.js', () => ({
format: jest.fn().mockReturnValue('2 weeks ago'),
diff --git a/spec/frontend/user_lists/store/edit/actions_spec.js b/spec/frontend/user_lists/store/edit/actions_spec.js
index c4b0f888d3e..ca56c935ea5 100644
--- a/spec/frontend/user_lists/store/edit/actions_spec.js
+++ b/spec/frontend/user_lists/store/edit/actions_spec.js
@@ -4,7 +4,7 @@ import { redirectTo } from '~/lib/utils/url_utility';
import * as actions from '~/user_lists/store/edit/actions';
import * as types from '~/user_lists/store/edit/mutation_types';
import createState from '~/user_lists/store/edit/state';
-import { userList } from '../../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
jest.mock('~/api');
jest.mock('~/lib/utils/url_utility');
diff --git a/spec/frontend/user_lists/store/edit/mutations_spec.js b/spec/frontend/user_lists/store/edit/mutations_spec.js
index 0943c64e934..7971906429b 100644
--- a/spec/frontend/user_lists/store/edit/mutations_spec.js
+++ b/spec/frontend/user_lists/store/edit/mutations_spec.js
@@ -2,7 +2,7 @@ import statuses from '~/user_lists/constants/edit';
import * as types from '~/user_lists/store/edit/mutation_types';
import mutations from '~/user_lists/store/edit/mutations';
import createState from '~/user_lists/store/edit/state';
-import { userList } from '../../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
describe('User List Edit Mutations', () => {
let state;
diff --git a/spec/frontend/user_lists/store/index/actions_spec.js b/spec/frontend/user_lists/store/index/actions_spec.js
index c5d7d557de9..4a8d0afb963 100644
--- a/spec/frontend/user_lists/store/index/actions_spec.js
+++ b/spec/frontend/user_lists/store/index/actions_spec.js
@@ -12,7 +12,7 @@ import {
} from '~/user_lists/store/index/actions';
import * as types from '~/user_lists/store/index/mutation_types';
import createState from '~/user_lists/store/index/state';
-import { userList } from '../../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
jest.mock('~/api.js');
@@ -24,14 +24,13 @@ describe('~/user_lists/store/index/actions', () => {
});
describe('setUserListsOptions', () => {
- it('should commit SET_USER_LISTS_OPTIONS mutation', (done) => {
- testAction(
+ it('should commit SET_USER_LISTS_OPTIONS mutation', () => {
+ return testAction(
setUserListsOptions,
{ page: '1', scope: 'all' },
state,
[{ type: types.SET_USER_LISTS_OPTIONS, payload: { page: '1', scope: 'all' } }],
[],
- done,
);
});
});
@@ -42,8 +41,8 @@ describe('~/user_lists/store/index/actions', () => {
});
describe('success', () => {
- it('dispatches requestUserLists and receiveUserListsSuccess ', (done) => {
- testAction(
+ it('dispatches requestUserLists and receiveUserListsSuccess ', () => {
+ return testAction(
fetchUserLists,
null,
state,
@@ -57,16 +56,15 @@ describe('~/user_lists/store/index/actions', () => {
type: 'receiveUserListsSuccess',
},
],
- done,
);
});
});
describe('error', () => {
- it('dispatches requestUserLists and receiveUserListsError ', (done) => {
+ it('dispatches requestUserLists and receiveUserListsError ', () => {
Api.fetchFeatureFlagUserLists.mockRejectedValue();
- testAction(
+ return testAction(
fetchUserLists,
null,
state,
@@ -79,21 +77,20 @@ describe('~/user_lists/store/index/actions', () => {
type: 'receiveUserListsError',
},
],
- done,
);
});
});
});
describe('requestUserLists', () => {
- it('should commit RECEIVE_USER_LISTS_SUCCESS mutation', (done) => {
- testAction(requestUserLists, null, state, [{ type: types.REQUEST_USER_LISTS }], [], done);
+ it('should commit RECEIVE_USER_LISTS_SUCCESS mutation', () => {
+ return testAction(requestUserLists, null, state, [{ type: types.REQUEST_USER_LISTS }], []);
});
});
describe('receiveUserListsSuccess', () => {
- it('should commit RECEIVE_USER_LISTS_SUCCESS mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_USER_LISTS_SUCCESS mutation', () => {
+ return testAction(
receiveUserListsSuccess,
{ data: [userList], headers: {} },
state,
@@ -104,20 +101,18 @@ describe('~/user_lists/store/index/actions', () => {
},
],
[],
- done,
);
});
});
describe('receiveUserListsError', () => {
- it('should commit RECEIVE_USER_LISTS_ERROR mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_USER_LISTS_ERROR mutation', () => {
+ return testAction(
receiveUserListsError,
null,
state,
[{ type: types.RECEIVE_USER_LISTS_ERROR }],
[],
- done,
);
});
});
@@ -132,14 +127,13 @@ describe('~/user_lists/store/index/actions', () => {
Api.deleteFeatureFlagUserList.mockResolvedValue();
});
- it('should refresh the user lists', (done) => {
- testAction(
+ it('should refresh the user lists', () => {
+ return testAction(
deleteUserList,
userList,
state,
[],
[{ type: 'requestDeleteUserList', payload: userList }, { type: 'fetchUserLists' }],
- done,
);
});
});
@@ -149,8 +143,8 @@ describe('~/user_lists/store/index/actions', () => {
Api.deleteFeatureFlagUserList.mockRejectedValue({ response: { data: 'some error' } });
});
- it('should dispatch receiveDeleteUserListError', (done) => {
- testAction(
+ it('should dispatch receiveDeleteUserListError', () => {
+ return testAction(
deleteUserList,
userList,
state,
@@ -162,15 +156,14 @@ describe('~/user_lists/store/index/actions', () => {
payload: { list: userList, error: 'some error' },
},
],
- done,
);
});
});
});
describe('receiveDeleteUserListError', () => {
- it('should commit RECEIVE_DELETE_USER_LIST_ERROR with the given list', (done) => {
- testAction(
+ it('should commit RECEIVE_DELETE_USER_LIST_ERROR with the given list', () => {
+ return testAction(
receiveDeleteUserListError,
{ list: userList, error: 'mock error' },
state,
@@ -181,22 +174,20 @@ describe('~/user_lists/store/index/actions', () => {
},
],
[],
- done,
);
});
});
describe('clearAlert', () => {
- it('should commit RECEIVE_CLEAR_ALERT', (done) => {
+ it('should commit RECEIVE_CLEAR_ALERT', () => {
const alertIndex = 3;
- testAction(
+ return testAction(
clearAlert,
alertIndex,
state,
[{ type: 'RECEIVE_CLEAR_ALERT', payload: alertIndex }],
[],
- done,
);
});
});
diff --git a/spec/frontend/user_lists/store/index/mutations_spec.js b/spec/frontend/user_lists/store/index/mutations_spec.js
index 370838ae5fb..18d6a9b8f38 100644
--- a/spec/frontend/user_lists/store/index/mutations_spec.js
+++ b/spec/frontend/user_lists/store/index/mutations_spec.js
@@ -2,7 +2,7 @@ import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
import * as types from '~/user_lists/store/index/mutation_types';
import mutations from '~/user_lists/store/index/mutations';
import createState from '~/user_lists/store/index/state';
-import { userList } from '../../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
describe('~/user_lists/store/index/mutations', () => {
let state;
diff --git a/spec/frontend/user_lists/store/new/actions_spec.js b/spec/frontend/user_lists/store/new/actions_spec.js
index 916ec2e6da7..fa69fa7fa66 100644
--- a/spec/frontend/user_lists/store/new/actions_spec.js
+++ b/spec/frontend/user_lists/store/new/actions_spec.js
@@ -4,7 +4,7 @@ import { redirectTo } from '~/lib/utils/url_utility';
import * as actions from '~/user_lists/store/new/actions';
import * as types from '~/user_lists/store/new/mutation_types';
import createState from '~/user_lists/store/new/state';
-import { userList } from '../../../feature_flags/mock_data';
+import { userList } from 'jest/feature_flags/mock_data';
jest.mock('~/api');
jest.mock('~/lib/utils/url_utility');
diff --git a/spec/frontend/vue_mr_widget/components/approvals/approvals_spec.js b/spec/frontend/vue_mr_widget/components/approvals/approvals_spec.js
index 36850e623c7..4985417ad99 100644
--- a/spec/frontend/vue_mr_widget/components/approvals/approvals_spec.js
+++ b/spec/frontend/vue_mr_widget/components/approvals/approvals_spec.js
@@ -1,3 +1,4 @@
+import { nextTick } from 'vue';
import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import createFlash from '~/flash';
@@ -28,11 +29,6 @@ const testApprovals = () => ({
});
const testApprovalRulesResponse = () => ({ rules: [{ id: 2 }] });
-// For some reason, the `Promise.resolve()` needs to be deferred
-// or the timing doesn't work.
-const tick = () => Promise.resolve();
-const waitForTick = (done) => tick().then(done).catch(done.fail);
-
describe('MRWidget approvals', () => {
let wrapper;
let service;
@@ -105,7 +101,7 @@ describe('MRWidget approvals', () => {
// eslint-disable-next-line no-restricted-syntax
wrapper.setData({ fetchingApprovals: true });
- return tick().then(() => {
+ return nextTick().then(() => {
expect(wrapper.text()).toContain(FETCH_LOADING);
});
});
@@ -116,10 +112,10 @@ describe('MRWidget approvals', () => {
});
describe('when fetch approvals error', () => {
- beforeEach((done) => {
+ beforeEach(() => {
jest.spyOn(service, 'fetchApprovals').mockReturnValue(Promise.reject());
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('still shows loading message', () => {
@@ -133,13 +129,13 @@ describe('MRWidget approvals', () => {
describe('action button', () => {
describe('when mr is closed', () => {
- beforeEach((done) => {
+ beforeEach(() => {
mr.isOpen = false;
mr.approvals.user_has_approved = false;
mr.approvals.user_can_approve = true;
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('action is not rendered', () => {
@@ -148,12 +144,12 @@ describe('MRWidget approvals', () => {
});
describe('when user cannot approve', () => {
- beforeEach((done) => {
+ beforeEach(() => {
mr.approvals.user_has_approved = false;
mr.approvals.user_can_approve = false;
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('action is not rendered', () => {
@@ -168,9 +164,9 @@ describe('MRWidget approvals', () => {
});
describe('and MR is unapproved', () => {
- beforeEach((done) => {
+ beforeEach(() => {
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('approve action is rendered', () => {
@@ -188,10 +184,10 @@ describe('MRWidget approvals', () => {
});
describe('with no approvers', () => {
- beforeEach((done) => {
+ beforeEach(() => {
mr.approvals.approved_by = [];
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('approve action (with inverted style) is rendered', () => {
@@ -204,10 +200,10 @@ describe('MRWidget approvals', () => {
});
describe('with approvers', () => {
- beforeEach((done) => {
+ beforeEach(() => {
mr.approvals.approved_by = [{ user: { id: 7 } }];
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('approve additionally action is rendered', () => {
@@ -221,9 +217,9 @@ describe('MRWidget approvals', () => {
});
describe('when approve action is clicked', () => {
- beforeEach((done) => {
+ beforeEach(() => {
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('shows loading icon', () => {
@@ -234,15 +230,15 @@ describe('MRWidget approvals', () => {
action.vm.$emit('click');
- return tick().then(() => {
+ return nextTick().then(() => {
expect(action.props('loading')).toBe(true);
});
});
describe('and after loading', () => {
- beforeEach((done) => {
+ beforeEach(() => {
findAction().vm.$emit('click');
- waitForTick(done);
+ return nextTick();
});
it('calls service approve', () => {
@@ -259,10 +255,10 @@ describe('MRWidget approvals', () => {
});
describe('and error', () => {
- beforeEach((done) => {
+ beforeEach(() => {
jest.spyOn(service, 'approveMergeRequest').mockReturnValue(Promise.reject());
findAction().vm.$emit('click');
- waitForTick(done);
+ return nextTick();
});
it('flashes error message', () => {
@@ -273,12 +269,12 @@ describe('MRWidget approvals', () => {
});
describe('when user has approved', () => {
- beforeEach((done) => {
+ beforeEach(() => {
mr.approvals.user_has_approved = true;
mr.approvals.user_can_approve = false;
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('revoke action is rendered', () => {
@@ -291,9 +287,9 @@ describe('MRWidget approvals', () => {
describe('when revoke action is clicked', () => {
describe('and successful', () => {
- beforeEach((done) => {
+ beforeEach(() => {
findAction().vm.$emit('click');
- waitForTick(done);
+ return nextTick();
});
it('calls service unapprove', () => {
@@ -310,10 +306,10 @@ describe('MRWidget approvals', () => {
});
describe('and error', () => {
- beforeEach((done) => {
+ beforeEach(() => {
jest.spyOn(service, 'unapproveMergeRequest').mockReturnValue(Promise.reject());
findAction().vm.$emit('click');
- waitForTick(done);
+ return nextTick();
});
it('flashes error message', () => {
@@ -333,11 +329,11 @@ describe('MRWidget approvals', () => {
});
describe('and can approve', () => {
- beforeEach((done) => {
+ beforeEach(() => {
mr.approvals.user_can_approve = true;
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('is shown', () => {
@@ -350,11 +346,11 @@ describe('MRWidget approvals', () => {
});
describe('and cannot approve', () => {
- beforeEach((done) => {
+ beforeEach(() => {
mr.approvals.user_can_approve = false;
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('is shown', () => {
@@ -369,9 +365,9 @@ describe('MRWidget approvals', () => {
});
describe('approvals summary', () => {
- beforeEach((done) => {
+ beforeEach(() => {
createComponent();
- waitForTick(done);
+ return nextTick();
});
it('is rendered with props', () => {
diff --git a/spec/frontend/vue_mr_widget/components/extensions/utils_spec.js b/spec/frontend/vue_mr_widget/components/extensions/utils_spec.js
index 64e802c4fa5..98cfc04eb25 100644
--- a/spec/frontend/vue_mr_widget/components/extensions/utils_spec.js
+++ b/spec/frontend/vue_mr_widget/components/extensions/utils_spec.js
@@ -8,7 +8,7 @@ describe('generateText', () => {
${'%{danger_start}Hello world%{danger_end}'} | ${'<span class="gl-font-weight-bold gl-text-red-500">Hello world</span>'}
${'%{critical_start}Hello world%{critical_end}'} | ${'<span class="gl-font-weight-bold gl-text-red-800">Hello world</span>'}
${'%{same_start}Hello world%{same_end}'} | ${'<span class="gl-font-weight-bold gl-text-gray-700">Hello world</span>'}
- ${'%{small_start}Hello world%{small_end}'} | ${'<span class="gl-font-sm">Hello world</span>'}
+ ${'%{small_start}Hello world%{small_end}'} | ${'<span class="gl-font-sm gl-text-gray-700">Hello world</span>'}
${'%{strong_start}%{danger_start}Hello world%{danger_end}%{strong_end}'} | ${'<span class="gl-font-weight-bold"><span class="gl-font-weight-bold gl-text-red-500">Hello world</span></span>'}
${'%{no_exist_start}Hello world%{no_exist_end}'} | ${'Hello world'}
${['array']} | ${null}
diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js
index c0a30a5093d..f0106914674 100644
--- a/spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js
+++ b/spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js
@@ -175,22 +175,19 @@ describe('MemoryUsage', () => {
expect(el.querySelector('.js-usage-info')).toBeDefined();
});
- it('should show loading metrics message while metrics are being loaded', (done) => {
+ it('should show loading metrics message while metrics are being loaded', async () => {
vm.loadingMetrics = true;
vm.hasMetrics = false;
vm.loadFailed = false;
- nextTick(() => {
- expect(el.querySelector('.js-usage-info.usage-info-loading')).toBeDefined();
+ await nextTick();
- expect(el.querySelector('.js-usage-info .usage-info-load-spinner')).toBeDefined();
-
- expect(el.querySelector('.js-usage-info').innerText).toContain(messages.loadingMetrics);
- done();
- });
+ expect(el.querySelector('.js-usage-info.usage-info-loading')).toBeDefined();
+ expect(el.querySelector('.js-usage-info .usage-info-load-spinner')).toBeDefined();
+ expect(el.querySelector('.js-usage-info').innerText).toContain(messages.loadingMetrics);
});
- it('should show deployment memory usage when metrics are loaded', (done) => {
+ it('should show deployment memory usage when metrics are loaded', async () => {
// ignore BoostrapVue warnings
jest.spyOn(console, 'warn').mockImplementation();
@@ -199,37 +196,32 @@ describe('MemoryUsage', () => {
vm.loadFailed = false;
vm.memoryMetrics = metricsMockData.metrics.memory_values[0].values;
- nextTick(() => {
- expect(el.querySelector('.memory-graph-container')).toBeDefined();
- expect(el.querySelector('.js-usage-info').innerText).toContain(messages.hasMetrics);
- done();
- });
+ await nextTick();
+
+ expect(el.querySelector('.memory-graph-container')).toBeDefined();
+ expect(el.querySelector('.js-usage-info').innerText).toContain(messages.hasMetrics);
});
- it('should show failure message when metrics loading failed', (done) => {
+ it('should show failure message when metrics loading failed', async () => {
vm.loadingMetrics = false;
vm.hasMetrics = false;
vm.loadFailed = true;
- nextTick(() => {
- expect(el.querySelector('.js-usage-info.usage-info-failed')).toBeDefined();
+ await nextTick();
- expect(el.querySelector('.js-usage-info').innerText).toContain(messages.loadFailed);
- done();
- });
+ expect(el.querySelector('.js-usage-info.usage-info-failed')).toBeDefined();
+ expect(el.querySelector('.js-usage-info').innerText).toContain(messages.loadFailed);
});
- it('should show metrics unavailable message when metrics loading failed', (done) => {
+ it('should show metrics unavailable message when metrics loading failed', async () => {
vm.loadingMetrics = false;
vm.hasMetrics = false;
vm.loadFailed = false;
- nextTick(() => {
- expect(el.querySelector('.js-usage-info.usage-info-unavailable')).toBeDefined();
+ await nextTick();
- expect(el.querySelector('.js-usage-info').innerText).toContain(messages.metricsUnavailable);
- done();
- });
+ expect(el.querySelector('.js-usage-info.usage-info-unavailable')).toBeDefined();
+ expect(el.querySelector('.js-usage-info').innerText).toContain(messages.metricsUnavailable);
});
});
});
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js
index 7d86e453bc7..8efc4d84624 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js
@@ -198,14 +198,13 @@ describe('MRWidgetMerged', () => {
);
});
- it('hides button to copy commit SHA if SHA does not exist', (done) => {
+ it('hides button to copy commit SHA if SHA does not exist', async () => {
vm.mr.mergeCommitSha = null;
- nextTick(() => {
- expect(selectors.copyMergeShaButton).toBe(null);
- expect(vm.$el.querySelector('.mr-info-list').innerText).not.toContain('with');
- done();
- });
+ await nextTick();
+
+ expect(selectors.copyMergeShaButton).toBe(null);
+ expect(vm.$el.querySelector('.mr-info-list').innerText).not.toContain('with');
});
it('shows merge commit SHA link', () => {
@@ -214,24 +213,22 @@ describe('MRWidgetMerged', () => {
expect(selectors.mergeCommitShaLink.href).toBe(vm.mr.mergeCommitPath);
});
- it('should not show source branch deleted text', (done) => {
+ it('should not show source branch deleted text', async () => {
vm.mr.sourceBranchRemoved = false;
- nextTick(() => {
- expect(vm.$el.innerText).not.toContain('The source branch has been deleted');
- done();
- });
+ await nextTick();
+
+ expect(vm.$el.innerText).not.toContain('The source branch has been deleted');
});
- it('should show source branch deleting text', (done) => {
+ it('should show source branch deleting text', async () => {
vm.mr.isRemovingSourceBranch = true;
vm.mr.sourceBranchRemoved = false;
- nextTick(() => {
- expect(vm.$el.innerText).toContain('The source branch is being deleted');
- expect(vm.$el.innerText).not.toContain('The source branch has been deleted');
- done();
- });
+ await nextTick();
+
+ expect(vm.$el.innerText).toContain('The source branch is being deleted');
+ expect(vm.$el.innerText).not.toContain('The source branch has been deleted');
});
it('should use mergedEvent mergedAt as tooltip title', () => {
diff --git a/spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js b/spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js
new file mode 100644
index 00000000000..88b8e32bd5d
--- /dev/null
+++ b/spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js
@@ -0,0 +1,149 @@
+import { GlButton } from '@gitlab/ui';
+import MockAdapter from 'axios-mock-adapter';
+import testReportExtension from '~/vue_merge_request_widget/extensions/test_report';
+import { i18n } from '~/vue_merge_request_widget/extensions/test_report/constants';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { trimText } from 'helpers/text_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import axios from '~/lib/utils/axios_utils';
+import extensionsContainer from '~/vue_merge_request_widget/components/extensions/container';
+import { registerExtension } from '~/vue_merge_request_widget/components/extensions';
+import httpStatusCodes from '~/lib/utils/http_status';
+
+import { failedReport } from 'jest/reports/mock_data/mock_data';
+import mixedResultsTestReports from 'jest/reports/mock_data/new_and_fixed_failures_report.json';
+import newErrorsTestReports from 'jest/reports/mock_data/new_errors_report.json';
+import newFailedTestReports from 'jest/reports/mock_data/new_failures_report.json';
+import successTestReports from 'jest/reports/mock_data/no_failures_report.json';
+import resolvedFailures from 'jest/reports/mock_data/resolved_failures.json';
+
+const reportWithParsingErrors = failedReport;
+reportWithParsingErrors.suites[0].suite_errors = {
+ head: 'JUnit XML parsing failed: 2:24: FATAL: attributes construct error',
+ base: 'JUnit data parsing failed: string not matched',
+};
+
+describe('Test report extension', () => {
+ let wrapper;
+ let mock;
+
+ registerExtension(testReportExtension);
+
+ const endpoint = '/root/repo/-/merge_requests/4/test_reports.json';
+
+ const mockApi = (statusCode, data = mixedResultsTestReports) => {
+ mock.onGet(endpoint).reply(statusCode, data);
+ };
+
+ const findToggleCollapsedButton = () => wrapper.findByTestId('toggle-button');
+ const findTertiaryButton = () => wrapper.find(GlButton);
+ const findAllExtensionListItems = () => wrapper.findAllByTestId('extension-list-item');
+
+ const createComponent = () => {
+ wrapper = mountExtended(extensionsContainer, {
+ propsData: {
+ mr: {
+ testResultsPath: endpoint,
+ headBlobPath: 'head/blob/path',
+ pipeline: { path: 'pipeline/path' },
+ },
+ },
+ });
+ };
+
+ const createExpandedWidgetWithData = async (data = mixedResultsTestReports) => {
+ mockApi(httpStatusCodes.OK, data);
+ createComponent();
+ await waitForPromises();
+ findToggleCollapsedButton().trigger('click');
+ await waitForPromises();
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ mock.restore();
+ });
+
+ describe('summary', () => {
+ it('displays loading text', () => {
+ mockApi(httpStatusCodes.OK);
+ createComponent();
+
+ expect(wrapper.text()).toContain(i18n.loading);
+ });
+
+ it('displays failed loading text', async () => {
+ mockApi(httpStatusCodes.INTERNAL_SERVER_ERROR);
+ createComponent();
+
+ await waitForPromises();
+
+ expect(wrapper.text()).toContain(i18n.error);
+ });
+
+ it.each`
+ description | mockData | expectedResult
+ ${'mixed test results'} | ${mixedResultsTestReports} | ${'Test summary: 2 failed and 2 fixed test results, 11 total tests'}
+ ${'unchanged test results'} | ${successTestReports} | ${'Test summary: no changed test results, 11 total tests'}
+ ${'tests with errors'} | ${newErrorsTestReports} | ${'Test summary: 2 errors, 11 total tests'}
+ ${'failed test results'} | ${newFailedTestReports} | ${'Test summary: 2 failed, 11 total tests'}
+ ${'resolved failures'} | ${resolvedFailures} | ${'Test summary: 4 fixed test results, 11 total tests'}
+ `('displays summary text for $description', async ({ mockData, expectedResult }) => {
+ mockApi(httpStatusCodes.OK, mockData);
+ createComponent();
+
+ await waitForPromises();
+
+ expect(wrapper.text()).toContain(expectedResult);
+ });
+
+ it('displays a link to the full report', async () => {
+ mockApi(httpStatusCodes.OK);
+ createComponent();
+
+ await waitForPromises();
+
+ expect(findTertiaryButton().text()).toBe('Full report');
+ expect(findTertiaryButton().attributes('href')).toBe('pipeline/path/test_report');
+ });
+
+ it('shows an error when a suite has a parsing error', async () => {
+ mockApi(httpStatusCodes.OK, reportWithParsingErrors);
+ createComponent();
+
+ await waitForPromises();
+
+ expect(wrapper.text()).toContain(i18n.error);
+ });
+ });
+
+ describe('expanded data', () => {
+ it('displays summary for each suite', async () => {
+ await createExpandedWidgetWithData();
+
+ expect(trimText(findAllExtensionListItems().at(0).text())).toBe(
+ 'rspec:pg: 1 failed and 2 fixed test results, 8 total tests',
+ );
+ expect(trimText(findAllExtensionListItems().at(1).text())).toBe(
+ 'java ant: 1 failed, 3 total tests',
+ );
+ });
+
+ it('displays suite parsing errors', async () => {
+ await createExpandedWidgetWithData(reportWithParsingErrors);
+
+ const suiteText = trimText(findAllExtensionListItems().at(0).text());
+
+ expect(suiteText).toContain(
+ 'Head report parsing error: JUnit XML parsing failed: 2:24: FATAL: attributes construct error',
+ );
+ expect(suiteText).toContain(
+ 'Base report parsing error: JUnit data parsing failed: string not matched',
+ );
+ });
+ });
+});
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 0540107ea5f..9719e81fe12 100644
--- a/spec/frontend/vue_mr_widget/mr_widget_options_spec.js
+++ b/spec/frontend/vue_mr_widget/mr_widget_options_spec.js
@@ -46,6 +46,8 @@ describe('MrWidgetOptions', () => {
let mock;
const COLLABORATION_MESSAGE = 'Members who can merge are allowed to add commits';
+ const findExtensionToggleButton = () =>
+ wrapper.find('[data-testid="widget-extension"] [data-testid="toggle-button"]');
beforeEach(() => {
gl.mrWidgetData = { ...mockData };
@@ -187,9 +189,9 @@ describe('MrWidgetOptions', () => {
});
describe('when merge request is opened', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper.vm.mr.isOpen = true;
- nextTick(done);
+ return nextTick();
});
it('should render collaboration status', () => {
@@ -198,9 +200,9 @@ describe('MrWidgetOptions', () => {
});
describe('when merge request is not opened', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper.vm.mr.isOpen = false;
- nextTick(done);
+ return nextTick();
});
it('should not render collaboration status', () => {
@@ -215,9 +217,9 @@ describe('MrWidgetOptions', () => {
});
describe('when merge request is opened', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper.vm.mr.isOpen = true;
- nextTick(done);
+ return nextTick();
});
it('should not render collaboration status', () => {
@@ -229,11 +231,11 @@ describe('MrWidgetOptions', () => {
describe('showMergePipelineForkWarning', () => {
describe('when the source project and target project are the same', () => {
- beforeEach((done) => {
+ beforeEach(() => {
Vue.set(wrapper.vm.mr, 'mergePipelinesEnabled', true);
Vue.set(wrapper.vm.mr, 'sourceProjectId', 1);
Vue.set(wrapper.vm.mr, 'targetProjectId', 1);
- nextTick(done);
+ return nextTick();
});
it('should be false', () => {
@@ -242,11 +244,11 @@ describe('MrWidgetOptions', () => {
});
describe('when merge pipelines are not enabled', () => {
- beforeEach((done) => {
+ beforeEach(() => {
Vue.set(wrapper.vm.mr, 'mergePipelinesEnabled', false);
Vue.set(wrapper.vm.mr, 'sourceProjectId', 1);
Vue.set(wrapper.vm.mr, 'targetProjectId', 2);
- nextTick(done);
+ return nextTick();
});
it('should be false', () => {
@@ -255,11 +257,11 @@ describe('MrWidgetOptions', () => {
});
describe('when merge pipelines are enabled _and_ the source project and target project are different', () => {
- beforeEach((done) => {
+ beforeEach(() => {
Vue.set(wrapper.vm.mr, 'mergePipelinesEnabled', true);
Vue.set(wrapper.vm.mr, 'sourceProjectId', 1);
Vue.set(wrapper.vm.mr, 'targetProjectId', 2);
- nextTick(done);
+ return nextTick();
});
it('should be true', () => {
@@ -439,15 +441,10 @@ describe('MrWidgetOptions', () => {
expect(setFaviconOverlay).toHaveBeenCalledWith(overlayDataUrl);
});
- it('should not call setFavicon when there is no ciStatusFaviconPath', (done) => {
+ it('should not call setFavicon when there is no ciStatusFaviconPath', async () => {
wrapper.vm.mr.ciStatusFaviconPath = null;
- wrapper.vm
- .setFaviconHelper()
- .then(() => {
- expect(faviconElement.getAttribute('href')).toEqual(null);
- done();
- })
- .catch(done.fail);
+ await wrapper.vm.setFaviconHelper();
+ expect(faviconElement.getAttribute('href')).toEqual(null);
});
});
@@ -534,44 +531,36 @@ describe('MrWidgetOptions', () => {
expect(wrapper.find('.close-related-link').exists()).toBe(true);
});
- it('does not render if state is nothingToMerge', (done) => {
+ it('does not render if state is nothingToMerge', async () => {
wrapper.vm.mr.state = stateKey.nothingToMerge;
- nextTick(() => {
- expect(wrapper.find('.close-related-link').exists()).toBe(false);
- done();
- });
+ await nextTick();
+ expect(wrapper.find('.close-related-link').exists()).toBe(false);
});
});
describe('rendering source branch removal status', () => {
- it('renders when user cannot remove branch and branch should be removed', (done) => {
+ it('renders when user cannot remove branch and branch should be removed', async () => {
wrapper.vm.mr.canRemoveSourceBranch = false;
wrapper.vm.mr.shouldRemoveSourceBranch = true;
wrapper.vm.mr.state = 'readyToMerge';
- nextTick(() => {
- const tooltip = wrapper.find('[data-testid="question-o-icon"]');
-
- expect(wrapper.text()).toContain('Deletes the source branch');
- expect(tooltip.attributes('title')).toBe(
- 'A user with write access to the source branch selected this option',
- );
+ await nextTick();
+ const tooltip = wrapper.find('[data-testid="question-o-icon"]');
- done();
- });
+ expect(wrapper.text()).toContain('Deletes the source branch');
+ expect(tooltip.attributes('title')).toBe(
+ 'A user with write access to the source branch selected this option',
+ );
});
- it('does not render in merged state', (done) => {
+ it('does not render in merged state', async () => {
wrapper.vm.mr.canRemoveSourceBranch = false;
wrapper.vm.mr.shouldRemoveSourceBranch = true;
wrapper.vm.mr.state = 'merged';
- nextTick(() => {
- expect(wrapper.text()).toContain('The source branch has been deleted');
- expect(wrapper.text()).not.toContain('Deletes the source branch');
-
- done();
- });
+ await nextTick();
+ expect(wrapper.text()).toContain('The source branch has been deleted');
+ expect(wrapper.text()).not.toContain('Deletes the source branch');
});
});
@@ -605,7 +594,7 @@ describe('MrWidgetOptions', () => {
status: SUCCESS,
};
- beforeEach((done) => {
+ beforeEach(() => {
wrapper.vm.mr.deployments.push(
{
...deploymentMockData,
@@ -616,7 +605,7 @@ describe('MrWidgetOptions', () => {
},
);
- nextTick(done);
+ return nextTick();
});
it('renders multiple deployments', () => {
@@ -639,7 +628,7 @@ describe('MrWidgetOptions', () => {
describe('pipeline for target branch after merge', () => {
describe('with information for target branch pipeline', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper.vm.mr.state = 'merged';
wrapper.vm.mr.mergePipeline = {
id: 127,
@@ -747,7 +736,7 @@ describe('MrWidgetOptions', () => {
},
cancel_path: '/root/ci-web-terminal/pipelines/127/cancel',
};
- nextTick(done);
+ return nextTick();
});
it('renders pipeline block', () => {
@@ -755,7 +744,7 @@ describe('MrWidgetOptions', () => {
});
describe('with post merge deployments', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper.vm.mr.postMergeDeployments = [
{
id: 15,
@@ -787,7 +776,7 @@ describe('MrWidgetOptions', () => {
},
];
- nextTick(done);
+ return nextTick();
});
it('renders post deployment information', () => {
@@ -797,10 +786,10 @@ describe('MrWidgetOptions', () => {
});
describe('without information for target branch pipeline', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper.vm.mr.state = 'merged';
- nextTick(done);
+ return nextTick();
});
it('does not render pipeline block', () => {
@@ -809,10 +798,10 @@ describe('MrWidgetOptions', () => {
});
describe('when state is not merged', () => {
- beforeEach((done) => {
+ beforeEach(() => {
wrapper.vm.mr.state = 'archived';
- nextTick(done);
+ return nextTick();
});
it('does not render pipeline block', () => {
@@ -905,7 +894,7 @@ describe('MrWidgetOptions', () => {
beforeEach(() => {
pollRequest = jest.spyOn(Poll.prototype, 'makeRequest');
- registerExtension(workingExtension);
+ registerExtension(workingExtension());
createComponent();
});
@@ -937,9 +926,7 @@ describe('MrWidgetOptions', () => {
it('renders full data', async () => {
await waitForPromises();
- wrapper
- .find('[data-testid="widget-extension"] [data-testid="toggle-button"]')
- .trigger('click');
+ findExtensionToggleButton().trigger('click');
await nextTick();
@@ -975,6 +962,24 @@ describe('MrWidgetOptions', () => {
});
});
+ describe('expansion', () => {
+ it('hides collapse button', async () => {
+ registerExtension(workingExtension(false));
+ createComponent();
+ await waitForPromises();
+
+ expect(findExtensionToggleButton().exists()).toBe(false);
+ });
+
+ it('shows collapse button', async () => {
+ registerExtension(workingExtension(true));
+ createComponent();
+ await waitForPromises();
+
+ expect(findExtensionToggleButton().exists()).toBe(true);
+ });
+ });
+
describe('mock polling extension', () => {
let pollRequest;
let pollStop;
@@ -1025,7 +1030,7 @@ describe('MrWidgetOptions', () => {
it('captures sentry error and displays error when poll has failed', () => {
expect(captureException).toHaveBeenCalledTimes(1);
expect(captureException).toHaveBeenCalledWith(new Error('Fetch error'));
- expect(wrapper.findComponent(StatusIcon).props('iconName')).toBe('error');
+ expect(wrapper.findComponent(StatusIcon).props('iconName')).toBe('failed');
});
});
});
@@ -1036,7 +1041,7 @@ describe('MrWidgetOptions', () => {
const itHandlesTheException = () => {
expect(captureException).toHaveBeenCalledTimes(1);
expect(captureException).toHaveBeenCalledWith(new Error('Fetch error'));
- expect(wrapper.findComponent(StatusIcon).props('iconName')).toBe('error');
+ expect(wrapper.findComponent(StatusIcon).props('iconName')).toBe('failed');
};
beforeEach(() => {
diff --git a/spec/frontend/vue_mr_widget/stores/artifacts_list/actions_spec.js b/spec/frontend/vue_mr_widget/stores/artifacts_list/actions_spec.js
index 9423fa17c44..22562bb4ddb 100644
--- a/spec/frontend/vue_mr_widget/stores/artifacts_list/actions_spec.js
+++ b/spec/frontend/vue_mr_widget/stores/artifacts_list/actions_spec.js
@@ -22,27 +22,25 @@ describe('Artifacts App Store Actions', () => {
});
describe('setEndpoint', () => {
- it('should commit SET_ENDPOINT mutation', (done) => {
- testAction(
+ it('should commit SET_ENDPOINT mutation', () => {
+ return testAction(
setEndpoint,
'endpoint.json',
mockedState,
[{ type: types.SET_ENDPOINT, payload: 'endpoint.json' }],
[],
- done,
);
});
});
describe('requestArtifacts', () => {
- it('should commit REQUEST_ARTIFACTS mutation', (done) => {
- testAction(
+ it('should commit REQUEST_ARTIFACTS mutation', () => {
+ return testAction(
requestArtifacts,
null,
mockedState,
[{ type: types.REQUEST_ARTIFACTS }],
[],
- done,
);
});
});
@@ -62,7 +60,7 @@ describe('Artifacts App Store Actions', () => {
});
describe('success', () => {
- it('dispatches requestArtifacts and receiveArtifactsSuccess ', (done) => {
+ it('dispatches requestArtifacts and receiveArtifactsSuccess ', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`).replyOnce(200, [
{
text: 'result.txt',
@@ -72,7 +70,7 @@ describe('Artifacts App Store Actions', () => {
},
]);
- testAction(
+ return testAction(
fetchArtifacts,
null,
mockedState,
@@ -96,7 +94,6 @@ describe('Artifacts App Store Actions', () => {
type: 'receiveArtifactsSuccess',
},
],
- done,
);
});
});
@@ -106,8 +103,8 @@ describe('Artifacts App Store Actions', () => {
mock.onGet(`${TEST_HOST}/endpoint.json`).reply(500);
});
- it('dispatches requestArtifacts and receiveArtifactsError ', (done) => {
- testAction(
+ it('dispatches requestArtifacts and receiveArtifactsError ', () => {
+ return testAction(
fetchArtifacts,
null,
mockedState,
@@ -120,45 +117,41 @@ describe('Artifacts App Store Actions', () => {
type: 'receiveArtifactsError',
},
],
- done,
);
});
});
});
describe('receiveArtifactsSuccess', () => {
- it('should commit RECEIVE_ARTIFACTS_SUCCESS mutation with 200', (done) => {
- testAction(
+ it('should commit RECEIVE_ARTIFACTS_SUCCESS mutation with 200', () => {
+ return testAction(
receiveArtifactsSuccess,
{ data: { summary: {} }, status: 200 },
mockedState,
[{ type: types.RECEIVE_ARTIFACTS_SUCCESS, payload: { summary: {} } }],
[],
- done,
);
});
- it('should not commit RECEIVE_ARTIFACTS_SUCCESS mutation with 204', (done) => {
- testAction(
+ it('should not commit RECEIVE_ARTIFACTS_SUCCESS mutation with 204', () => {
+ return testAction(
receiveArtifactsSuccess,
{ data: { summary: {} }, status: 204 },
mockedState,
[],
[],
- done,
);
});
});
describe('receiveArtifactsError', () => {
- it('should commit RECEIVE_ARTIFACTS_ERROR mutation', (done) => {
- testAction(
+ it('should commit RECEIVE_ARTIFACTS_ERROR mutation', () => {
+ return testAction(
receiveArtifactsError,
null,
mockedState,
[{ type: types.RECEIVE_ARTIFACTS_ERROR }],
[],
- done,
);
});
});
diff --git a/spec/frontend/vue_mr_widget/test_extensions.js b/spec/frontend/vue_mr_widget/test_extensions.js
index 986c1d6545a..6344636873f 100644
--- a/spec/frontend/vue_mr_widget/test_extensions.js
+++ b/spec/frontend/vue_mr_widget/test_extensions.js
@@ -1,6 +1,6 @@
import { EXTENSION_ICONS } from '~/vue_merge_request_widget/constants';
-export const workingExtension = {
+export const workingExtension = (shouldCollapse = true) => ({
name: 'WidgetTestExtension',
props: ['targetProjectFullPath'],
expandEvent: 'test_expand_event',
@@ -11,6 +11,9 @@ export const workingExtension = {
statusIcon({ count }) {
return count > 0 ? EXTENSION_ICONS.warning : EXTENSION_ICONS.success;
},
+ shouldCollapse() {
+ return shouldCollapse;
+ },
},
methods: {
fetchCollapsedData({ targetProjectFullPath }) {
@@ -36,7 +39,7 @@ export const workingExtension = {
]);
},
},
-};
+});
export const collapsedDataErrorExtension = {
name: 'WidgetTestCollapsedErrorExtension',
@@ -99,7 +102,7 @@ export const fullDataErrorExtension = {
};
export const pollingExtension = {
- ...workingExtension,
+ ...workingExtension(),
enablePolling: true,
};
diff --git a/spec/frontend/vue_shared/alert_details/alert_details_spec.js b/spec/frontend/vue_shared/alert_details/alert_details_spec.js
index 7ee6e29e6de..7aa54a1c55a 100644
--- a/spec/frontend/vue_shared/alert_details/alert_details_spec.js
+++ b/spec/frontend/vue_shared/alert_details/alert_details_spec.js
@@ -12,12 +12,17 @@ import AlertSummaryRow from '~/vue_shared/alert_details/components/alert_summary
import { PAGE_CONFIG, SEVERITY_LEVELS } from '~/vue_shared/alert_details/constants';
import createIssueMutation from '~/vue_shared/alert_details/graphql/mutations/alert_issue_create.mutation.graphql';
import AlertDetailsTable from '~/vue_shared/components/alert_details_table.vue';
+import MetricImagesTab from '~/vue_shared/components/metric_images/metric_images_tab.vue';
+import createStore from '~/vue_shared/components/metric_images/store/';
+import service from '~/vue_shared/alert_details/service';
import mockAlerts from './mocks/alerts.json';
const mockAlert = mockAlerts[0];
const environmentName = 'Production';
const environmentPath = '/fake/path';
+jest.mock('~/vue_shared/alert_details/service');
+
describe('AlertDetails', () => {
let environmentData = { name: environmentName, path: environmentPath };
let mock;
@@ -67,9 +72,11 @@ describe('AlertDetails', () => {
$route: { params: {} },
},
stubs: {
- ...stubs,
AlertSummaryRow,
+ 'metric-images-tab': true,
+ ...stubs,
},
+ store: createStore({}, service),
}),
);
}
@@ -91,7 +98,7 @@ describe('AlertDetails', () => {
const findEnvironmentName = () => wrapper.findByTestId('environmentName');
const findEnvironmentPath = () => wrapper.findByTestId('environmentPath');
const findDetailsTable = () => wrapper.findComponent(AlertDetailsTable);
- const findMetricsTab = () => wrapper.findByTestId('metrics');
+ const findMetricsTab = () => wrapper.findComponent(MetricImagesTab);
describe('Alert details', () => {
describe('when alert is null', () => {
@@ -129,8 +136,21 @@ describe('AlertDetails', () => {
expect(wrapper.findByTestId('startTimeItem').exists()).toBe(true);
expect(wrapper.findByTestId('startTimeItem').props('time')).toBe(mockAlert.startedAt);
});
+ });
+
+ describe('Metrics tab', () => {
+ it('should mount without errors', () => {
+ mountComponent({
+ mountMethod: mount,
+ provide: {
+ canUpdate: true,
+ iid: '1',
+ },
+ stubs: {
+ MetricImagesTab,
+ },
+ });
- it('renders the metrics tab', () => {
expect(findMetricsTab().exists()).toBe(true);
});
});
@@ -312,7 +332,9 @@ describe('AlertDetails', () => {
describe('header', () => {
const findHeader = () => wrapper.findByTestId('alert-header');
- const stubs = { TimeAgoTooltip: { template: '<span>now</span>' } };
+ const stubs = {
+ TimeAgoTooltip: { template: '<span>now</span>' },
+ };
describe('individual header fields', () => {
describe.each`
diff --git a/spec/frontend/vue_shared/alert_details/service_spec.js b/spec/frontend/vue_shared/alert_details/service_spec.js
new file mode 100644
index 00000000000..790854d0ca7
--- /dev/null
+++ b/spec/frontend/vue_shared/alert_details/service_spec.js
@@ -0,0 +1,44 @@
+import { fileList, fileListRaw } from 'jest/vue_shared/components/metric_images/mock_data';
+import {
+ getMetricImages,
+ uploadMetricImage,
+ updateMetricImage,
+ deleteMetricImage,
+} from '~/vue_shared/alert_details/service';
+import * as alertManagementAlertsApi from '~/api/alert_management_alerts_api';
+
+jest.mock('~/api/alert_management_alerts_api');
+
+describe('Alert details service', () => {
+ it('fetches metric images', async () => {
+ alertManagementAlertsApi.fetchAlertMetricImages.mockResolvedValue({ data: fileListRaw });
+ const result = await getMetricImages();
+
+ expect(alertManagementAlertsApi.fetchAlertMetricImages).toHaveBeenCalled();
+ expect(result).toEqual(fileList);
+ });
+
+ it('uploads a metric image', async () => {
+ alertManagementAlertsApi.uploadAlertMetricImage.mockResolvedValue({ data: fileListRaw[0] });
+ const result = await uploadMetricImage();
+
+ expect(alertManagementAlertsApi.uploadAlertMetricImage).toHaveBeenCalled();
+ expect(result).toEqual(fileList[0]);
+ });
+
+ it('updates a metric image', async () => {
+ alertManagementAlertsApi.updateAlertMetricImage.mockResolvedValue({ data: fileListRaw[0] });
+ const result = await updateMetricImage();
+
+ expect(alertManagementAlertsApi.updateAlertMetricImage).toHaveBeenCalled();
+ expect(result).toEqual(fileList[0]);
+ });
+
+ it('deletes a metric image', async () => {
+ alertManagementAlertsApi.deleteAlertMetricImage.mockResolvedValue({ data: '' });
+ const result = await deleteMetricImage();
+
+ expect(alertManagementAlertsApi.deleteAlertMetricImage).toHaveBeenCalled();
+ expect(result).toEqual({});
+ });
+});
diff --git a/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap
index c14cf0db370..bdf5ea23812 100644
--- a/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap
+++ b/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap
@@ -218,65 +218,88 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
<div
class="award-menu-holder gl-my-2"
>
- <button
- aria-label="Add reaction"
- class="btn add-reaction-button js-add-award btn-default btn-md gl-button js-test-add-button-class"
+ <div
+ class="emoji-picker"
+ data-testid="emoji-picker"
title="Add reaction"
- type="button"
>
- <!---->
-
- <!---->
-
- <span
- class="gl-button-text"
+ <div
+ boundary="scrollParent"
+ class="dropdown b-dropdown gl-new-dropdown btn-group"
+ id="__BVID__13"
+ lazy=""
+ menu-class="dropdown-extended-height"
+ no-flip=""
>
- <span
- class="reaction-control-icon reaction-control-icon-neutral"
+ <!---->
+ <button
+ aria-expanded="false"
+ aria-haspopup="true"
+ class="btn dropdown-toggle btn-default btn-md add-reaction-button btn-icon gl-relative! gl-button gl-dropdown-toggle btn-default-secondary"
+ id="__BVID__13__BV_toggle_"
+ type="button"
>
- <svg
- aria-hidden="true"
- class="gl-icon s16"
- data-testid="slight-smile-icon"
- role="img"
+ <span
+ class="gl-sr-only"
>
- <use
- href="#slight-smile"
- />
- </svg>
- </span>
-
- <span
- class="reaction-control-icon reaction-control-icon-positive"
- >
- <svg
- aria-hidden="true"
- class="gl-icon s16"
- data-testid="smiley-icon"
- role="img"
+ Add reaction
+ </span>
+
+ <span
+ class="reaction-control-icon reaction-control-icon-neutral"
>
- <use
- href="#smiley"
- />
- </svg>
- </span>
-
- <span
- class="reaction-control-icon reaction-control-icon-super-positive"
- >
- <svg
- aria-hidden="true"
- class="gl-icon s16"
- data-testid="smile-icon"
- role="img"
+ <svg
+ aria-hidden="true"
+ class="gl-icon s16"
+ data-testid="slight-smile-icon"
+ role="img"
+ >
+ <use
+ href="#slight-smile"
+ />
+ </svg>
+ </span>
+
+ <span
+ class="reaction-control-icon reaction-control-icon-positive"
>
- <use
- href="#smile"
- />
- </svg>
- </span>
- </span>
- </button>
+ <svg
+ aria-hidden="true"
+ class="gl-icon s16"
+ data-testid="smiley-icon"
+ role="img"
+ >
+ <use
+ href="#smiley"
+ />
+ </svg>
+ </span>
+
+ <span
+ class="reaction-control-icon reaction-control-icon-super-positive"
+ >
+ <svg
+ aria-hidden="true"
+ class="gl-icon s16"
+ data-testid="smile-icon"
+ role="img"
+ >
+ <use
+ href="#smile"
+ />
+ </svg>
+ </span>
+ </button>
+ <ul
+ aria-labelledby="__BVID__13__BV_toggle_"
+ class="dropdown-menu dropdown-extended-height dropdown-menu-right"
+ role="menu"
+ tabindex="-1"
+ >
+ <!---->
+ </ul>
+ </div>
+ </div>
</div>
</div>
`;
diff --git a/spec/frontend/vue_shared/components/__snapshots__/identicon_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/identicon_spec.js.snap
deleted file mode 100644
index 1d8e04b83a3..00000000000
--- a/spec/frontend/vue_shared/components/__snapshots__/identicon_spec.js.snap
+++ /dev/null
@@ -1,21 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Identicon entity id is a GraphQL id matches snapshot 1`] = `
-<div
- class="avatar identicon s40 bg2"
->
-
- E
-
-</div>
-`;
-
-exports[`Identicon entity id is a number matches snapshot 1`] = `
-<div
- class="avatar identicon s40 bg2"
->
-
- E
-
-</div>
-`;
diff --git a/spec/frontend/vue_shared/components/awards_list_spec.js b/spec/frontend/vue_shared/components/awards_list_spec.js
index 95e9760c181..1c8cf726aca 100644
--- a/spec/frontend/vue_shared/components/awards_list_spec.js
+++ b/spec/frontend/vue_shared/components/awards_list_spec.js
@@ -76,7 +76,7 @@ describe('vue_shared/components/awards_list', () => {
count: Number(x.find('.js-counter').text()),
};
});
- const findAddAwardButton = () => wrapper.find('.js-add-award');
+ const findAddAwardButton = () => wrapper.find('[data-testid="emoji-picker"]');
describe('default', () => {
beforeEach(() => {
@@ -151,7 +151,6 @@ describe('vue_shared/components/awards_list', () => {
const btn = findAddAwardButton();
expect(btn.exists()).toBe(true);
- expect(btn.classes(TEST_ADD_BUTTON_CLASS)).toBe(true);
});
});
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 663ebd3e12f..4b44311b253 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
@@ -2,9 +2,6 @@ import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { HIGHLIGHT_CLASS_NAME } from '~/vue_shared/components/blob_viewers/constants';
import SimpleViewer from '~/vue_shared/components/blob_viewers/simple_viewer.vue';
-import LineHighlighter from '~/blob/line_highlighter';
-
-jest.mock('~/blob/line_highlighter');
describe('Blob Simple Viewer component', () => {
let wrapper;
@@ -30,20 +27,6 @@ describe('Blob Simple Viewer component', () => {
wrapper.destroy();
});
- describe('refactorBlobViewer feature flag', () => {
- it('loads the LineHighlighter if refactorBlobViewer is enabled', () => {
- createComponent('', false, { refactorBlobViewer: true });
-
- expect(LineHighlighter).toHaveBeenCalled();
- });
-
- it('does not load the LineHighlighter if refactorBlobViewer is disabled', () => {
- createComponent('', false, { refactorBlobViewer: false });
-
- expect(LineHighlighter).not.toHaveBeenCalled();
- });
- });
-
it('does not fail if content is empty', () => {
const spy = jest.spyOn(window.console, 'error');
createComponent('');
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js
index 575e8a73050..b6a181e6a0b 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js
@@ -26,7 +26,6 @@ import {
tokenValueMilestone,
tokenValueMembership,
tokenValueConfidential,
- tokenValueEmpty,
} from './mock_data';
jest.mock('~/vue_shared/components/filtered_search_bar/filtered_search_utils', () => ({
@@ -207,33 +206,14 @@ describe('FilteredSearchBarRoot', () => {
});
});
- describe('watchers', () => {
- describe('filterValue', () => {
- it('emits component event `onFilter` with empty array and false when filter was never selected', async () => {
- wrapper = createComponent({ initialFilterValue: [tokenValueEmpty] });
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({
- initialRender: false,
- filterValue: [tokenValueEmpty],
- });
-
- await nextTick();
- expect(wrapper.emitted('onFilter')[0]).toEqual([[], false]);
- });
+ describe('events', () => {
+ it('emits component event `onFilter` with empty array and true when initially selected filter value was cleared', async () => {
+ wrapper = createComponent({ initialFilterValue: [tokenValueLabel] });
- it('emits component event `onFilter` with empty array and true when initially selected filter value was cleared', async () => {
- wrapper = createComponent({ initialFilterValue: [tokenValueLabel] });
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({
- initialRender: false,
- filterValue: [tokenValueEmpty],
- });
+ wrapper.find(GlFilteredSearch).vm.$emit('clear');
- await nextTick();
- expect(wrapper.emitted('onFilter')[0]).toEqual([[], true]);
- });
+ await nextTick();
+ expect(wrapper.emitted('onFilter')[0]).toEqual([[], true]);
});
});
diff --git a/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js b/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js
index b67385cc43e..e636f58d868 100644
--- a/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js
+++ b/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js
@@ -89,8 +89,11 @@ describe('InputCopyToggleVisibility', () => {
});
describe('when clicked', () => {
+ let event;
+
beforeEach(async () => {
- await findRevealButton().trigger('click');
+ event = { stopPropagation: jest.fn() };
+ await findRevealButton().trigger('click', event);
});
it('displays value', () => {
@@ -110,6 +113,11 @@ describe('InputCopyToggleVisibility', () => {
it('emits `visibility-change` event', () => {
expect(wrapper.emitted('visibility-change')[0]).toEqual([true]);
});
+
+ it('stops propagation on click event', () => {
+ // in case the input is located in a dropdown or modal
+ expect(event.stopPropagation).toHaveBeenCalledTimes(1);
+ });
});
});
diff --git a/spec/frontend/vue_shared/components/help_popover_spec.js b/spec/frontend/vue_shared/components/help_popover_spec.js
index 597fb63d95c..64dce194327 100644
--- a/spec/frontend/vue_shared/components/help_popover_spec.js
+++ b/spec/frontend/vue_shared/components/help_popover_spec.js
@@ -34,7 +34,7 @@ describe('HelpPopover', () => {
it('renders a link button with an icon question', () => {
expect(findQuestionButton().props()).toMatchObject({
- icon: 'question',
+ icon: 'question-o',
variant: 'link',
});
});
diff --git a/spec/frontend/vue_shared/components/identicon_spec.js b/spec/frontend/vue_shared/components/identicon_spec.js
deleted file mode 100644
index 24fc3713e2b..00000000000
--- a/spec/frontend/vue_shared/components/identicon_spec.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import IdenticonComponent from '~/vue_shared/components/identicon.vue';
-
-describe('Identicon', () => {
- let wrapper;
-
- const defaultProps = {
- entityId: 1,
- entityName: 'entity-name',
- sizeClass: 's40',
- };
-
- const createComponent = (props = {}) => {
- wrapper = shallowMount(IdenticonComponent, {
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('entity id is a number', () => {
- beforeEach(() => createComponent());
-
- it('matches snapshot', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('adds a correct class to identicon', () => {
- expect(wrapper.find({ ref: 'identicon' }).classes()).toContain('bg2');
- });
- });
-
- describe('entity id is a GraphQL id', () => {
- beforeEach(() => createComponent({ entityId: 'gid://gitlab/Project/8' }));
-
- it('matches snapshot', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('adds a correct class to identicon', () => {
- expect(wrapper.find({ ref: 'identicon' }).classes()).toContain('bg2');
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/line_numbers_spec.js b/spec/frontend/vue_shared/components/line_numbers_spec.js
deleted file mode 100644
index 38c26226863..00000000000
--- a/spec/frontend/vue_shared/components/line_numbers_spec.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { GlIcon, GlLink } from '@gitlab/ui';
-import LineNumbers from '~/vue_shared/components/line_numbers.vue';
-
-describe('Line Numbers component', () => {
- let wrapper;
- const lines = 10;
-
- const createComponent = () => {
- wrapper = shallowMount(LineNumbers, { propsData: { lines } });
- };
-
- const findGlIcon = () => wrapper.findComponent(GlIcon);
- const findLineNumbers = () => wrapper.findAllComponents(GlLink);
- const findFirstLineNumber = () => findLineNumbers().at(0);
-
- beforeEach(() => createComponent());
-
- afterEach(() => wrapper.destroy());
-
- describe('rendering', () => {
- it('renders Line Numbers', () => {
- expect(findLineNumbers().length).toBe(lines);
- expect(findFirstLineNumber().attributes()).toMatchObject({
- id: 'L1',
- to: '#LC1',
- });
- });
-
- it('renders a link icon', () => {
- expect(findGlIcon().props()).toMatchObject({
- size: 12,
- name: 'link',
- });
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/local_storage_sync_spec.js b/spec/frontend/vue_shared/components/local_storage_sync_spec.js
index dac633fe6c8..a80717a1aea 100644
--- a/spec/frontend/vue_shared/components/local_storage_sync_spec.js
+++ b/spec/frontend/vue_shared/components/local_storage_sync_spec.js
@@ -1,31 +1,29 @@
import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
+const STORAGE_KEY = 'key';
+
describe('Local Storage Sync', () => {
let wrapper;
- const createComponent = ({ props = {}, slots = {} } = {}) => {
+ const createComponent = ({ value, asString = false, slots = {} } = {}) => {
wrapper = shallowMount(LocalStorageSync, {
- propsData: props,
+ propsData: { storageKey: STORAGE_KEY, value, asString },
slots,
});
};
+ const setStorageValue = (value) => localStorage.setItem(STORAGE_KEY, value);
+ const getStorageValue = (value) => localStorage.getItem(STORAGE_KEY, value);
+
afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- wrapper = null;
+ wrapper.destroy();
localStorage.clear();
});
it('is a renderless component', () => {
const html = '<div class="test-slot"></div>';
createComponent({
- props: {
- storageKey: 'key',
- },
slots: {
default: html,
},
@@ -35,233 +33,136 @@ describe('Local Storage Sync', () => {
});
describe('localStorage empty', () => {
- const storageKey = 'issue_list_order';
-
it('does not emit input event', () => {
- createComponent({
- props: {
- storageKey,
- value: 'ascending',
- },
- });
-
- expect(wrapper.emitted('input')).toBeFalsy();
- });
-
- it.each('foo', 3, true, ['foo', 'bar'], { foo: 'bar' })(
- 'saves updated value to localStorage',
- async (newValue) => {
- createComponent({
- props: {
- storageKey,
- value: 'initial',
- },
- });
-
- wrapper.setProps({ value: newValue });
+ createComponent({ value: 'ascending' });
- await nextTick();
- expect(localStorage.getItem(storageKey)).toBe(String(newValue));
- },
- );
-
- it('does not save default value', () => {
- const value = 'ascending';
+ expect(wrapper.emitted('input')).toBeUndefined();
+ });
- createComponent({
- props: {
- storageKey,
- value,
- },
- });
+ it('does not save initial value if it did not change', () => {
+ createComponent({ value: 'ascending' });
- expect(localStorage.getItem(storageKey)).toBe(null);
+ expect(getStorageValue()).toBeNull();
});
});
describe('localStorage has saved value', () => {
- const storageKey = 'issue_list_order_by';
const savedValue = 'last_updated';
beforeEach(() => {
- localStorage.setItem(storageKey, savedValue);
+ setStorageValue(savedValue);
+ createComponent({ asString: true });
});
it('emits input event with saved value', () => {
- createComponent({
- props: {
- storageKey,
- value: 'ascending',
- },
- });
-
expect(wrapper.emitted('input')[0][0]).toBe(savedValue);
});
- it('does not overwrite localStorage with prop value', () => {
- createComponent({
- props: {
- storageKey,
- value: 'created',
- },
- });
-
- expect(localStorage.getItem(storageKey)).toBe(savedValue);
+ it('does not overwrite localStorage with initial prop value', () => {
+ expect(getStorageValue()).toBe(savedValue);
});
it('updating the value updates localStorage', async () => {
- createComponent({
- props: {
- storageKey,
- value: 'created',
- },
- });
-
const newValue = 'last_updated';
- wrapper.setProps({
- value: newValue,
- });
+ await wrapper.setProps({ value: newValue });
- await nextTick();
- expect(localStorage.getItem(storageKey)).toBe(newValue);
+ expect(getStorageValue()).toBe(newValue);
});
+ });
+ describe('persist prop', () => {
it('persists the value by default', async () => {
const persistedValue = 'persisted';
+ createComponent({ asString: true });
+ // Sanity check to make sure we start with nothing saved.
+ expect(getStorageValue()).toBeNull();
- createComponent({
- props: {
- storageKey,
- },
- });
+ await wrapper.setProps({ value: persistedValue });
- wrapper.setProps({ value: persistedValue });
- await nextTick();
- expect(localStorage.getItem(storageKey)).toBe(persistedValue);
+ expect(getStorageValue()).toBe(persistedValue);
});
it('does not save a value if persist is set to false', async () => {
+ const value = 'saved';
const notPersistedValue = 'notPersisted';
+ createComponent({ asString: true });
+ // Save some value so we can test that it's not overwritten.
+ await wrapper.setProps({ value });
- createComponent({
- props: {
- storageKey,
- },
- });
+ expect(getStorageValue()).toBe(value);
- wrapper.setProps({ persist: false, value: notPersistedValue });
- await nextTick();
- expect(localStorage.getItem(storageKey)).not.toBe(notPersistedValue);
+ await wrapper.setProps({ persist: false, value: notPersistedValue });
+
+ expect(getStorageValue()).toBe(value);
});
});
- describe('with "asJson" prop set to "true"', () => {
- const storageKey = 'testStorageKey';
-
- describe.each`
- value | serializedValue
- ${null} | ${'null'}
- ${''} | ${'""'}
- ${true} | ${'true'}
- ${false} | ${'false'}
- ${42} | ${'42'}
- ${'42'} | ${'"42"'}
- ${'{ foo: '} | ${'"{ foo: "'}
- ${['test']} | ${'["test"]'}
- ${{ foo: 'bar' }} | ${'{"foo":"bar"}'}
- `('given $value', ({ value, serializedValue }) => {
- describe('is a new value', () => {
- beforeEach(async () => {
- createComponent({
- props: {
- storageKey,
- value: 'initial',
- asJson: true,
- },
- });
-
- wrapper.setProps({ value });
-
- await nextTick();
- });
-
- it('serializes the value correctly to localStorage', () => {
- expect(localStorage.getItem(storageKey)).toBe(serializedValue);
- });
- });
-
- describe('is already stored', () => {
- beforeEach(() => {
- localStorage.setItem(storageKey, serializedValue);
-
- createComponent({
- props: {
- storageKey,
- value: 'initial',
- asJson: true,
- },
- });
- });
-
- it('emits an input event with the deserialized value', () => {
- expect(wrapper.emitted('input')).toEqual([[value]]);
- });
- });
+ describe('saving and restoring', () => {
+ it.each`
+ value | asString
+ ${'foo'} | ${true}
+ ${'foo'} | ${false}
+ ${'{ a: 1 }'} | ${true}
+ ${'{ a: 1 }'} | ${false}
+ ${3} | ${false}
+ ${['foo', 'bar']} | ${false}
+ ${{ foo: 'bar' }} | ${false}
+ ${null} | ${false}
+ ${' '} | ${false}
+ ${true} | ${false}
+ ${false} | ${false}
+ ${42} | ${false}
+ ${'42'} | ${false}
+ ${'{ foo: '} | ${false}
+ `('saves and restores the same value', async ({ value, asString }) => {
+ // Create an initial component to save the value.
+ createComponent({ asString });
+ await wrapper.setProps({ value });
+ wrapper.destroy();
+ // Create a second component to restore the value. Restore is only done once, when the
+ // component is first mounted.
+ createComponent({ asString });
+
+ expect(wrapper.emitted('input')[0][0]).toEqual(value);
});
- describe('with bad JSON in storage', () => {
- const badJSON = '{ badJSON';
-
- beforeEach(() => {
- jest.spyOn(console, 'warn').mockImplementation();
- localStorage.setItem(storageKey, badJSON);
-
- createComponent({
- props: {
- storageKey,
- value: 'initial',
- asJson: true,
- },
- });
- });
-
- it('should console warn', () => {
- // eslint-disable-next-line no-console
- expect(console.warn).toHaveBeenCalledWith(
- `[gitlab] Failed to deserialize value from localStorage (key=${storageKey})`,
- badJSON,
- );
- });
-
- it('should not emit an input event', () => {
- expect(wrapper.emitted('input')).toBeUndefined();
- });
+ it('shows a warning when trying to save a non-string value when asString prop is true', async () => {
+ const spy = jest.spyOn(console, 'warn').mockImplementation();
+ createComponent({ asString: true });
+ await wrapper.setProps({ value: [] });
+
+ expect(spy).toHaveBeenCalled();
});
});
- it('clears localStorage when clear property is true', async () => {
- const storageKey = 'key';
- const value = 'initial';
+ describe('with bad JSON in storage', () => {
+ const badJSON = '{ badJSON';
+ let spy;
- createComponent({
- props: {
- storageKey,
- },
+ beforeEach(() => {
+ spy = jest.spyOn(console, 'warn').mockImplementation();
+ setStorageValue(badJSON);
+ createComponent();
});
- wrapper.setProps({
- value,
+
+ it('should console warn', () => {
+ expect(spy).toHaveBeenCalled();
});
- await nextTick();
+ it('should not emit an input event', () => {
+ expect(wrapper.emitted('input')).toBeUndefined();
+ });
+ });
- expect(localStorage.getItem(storageKey)).toBe(value);
+ it('clears localStorage when clear property is true', async () => {
+ const value = 'initial';
+ createComponent({ asString: true });
+ await wrapper.setProps({ value });
- wrapper.setProps({
- clear: true,
- });
+ expect(getStorageValue()).toBe(value);
- await nextTick();
+ await wrapper.setProps({ clear: true });
- expect(localStorage.getItem(storageKey)).toBe(null);
+ expect(getStorageValue()).toBeNull();
});
});
diff --git a/spec/frontend/vue_shared/components/markdown/apply_suggestion_spec.js b/spec/frontend/vue_shared/components/markdown/apply_suggestion_spec.js
index c56628fcbcd..ecb2b37c3a5 100644
--- a/spec/frontend/vue_shared/components/markdown/apply_suggestion_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/apply_suggestion_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlFormTextarea, GlButton } from '@gitlab/ui';
+import { GlDropdown, GlFormTextarea, GlButton, GlAlert } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import ApplySuggestionComponent from '~/vue_shared/components/markdown/apply_suggestion.vue';
@@ -10,9 +10,10 @@ describe('Apply Suggestion component', () => {
wrapper = shallowMount(ApplySuggestionComponent, { propsData: { ...propsData, ...props } });
};
- const findDropdown = () => wrapper.find(GlDropdown);
- const findTextArea = () => wrapper.find(GlFormTextarea);
- const findApplyButton = () => wrapper.find(GlButton);
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findTextArea = () => wrapper.findComponent(GlFormTextarea);
+ const findApplyButton = () => wrapper.findComponent(GlButton);
+ const findAlert = () => wrapper.findComponent(GlAlert);
beforeEach(() => createWrapper());
@@ -53,6 +54,20 @@ describe('Apply Suggestion component', () => {
});
});
+ describe('error', () => {
+ it('displays an error message', () => {
+ const errorMessage = 'Error message';
+ createWrapper({ errorMessage });
+
+ const alert = findAlert();
+
+ expect(alert.exists()).toBe(true);
+ expect(alert.props('variant')).toBe('danger');
+ expect(alert.props('dismissible')).toBe(false);
+ expect(alert.text()).toBe(errorMessage);
+ });
+ });
+
describe('apply suggestion', () => {
it('emits an apply event with no message if no message was added', () => {
findTextArea().vm.$emit('input', null);
diff --git a/spec/frontend/vue_shared/components/markdown/field_spec.js b/spec/frontend/vue_shared/components/markdown/field_spec.js
index b5daa389fc6..d1c4d777d44 100644
--- a/spec/frontend/vue_shared/components/markdown/field_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/field_spec.js
@@ -85,7 +85,7 @@ describe('Markdown field component', () => {
describe('mounted', () => {
const previewHTML = `
<p>markdown preview</p>
- <video src="${FIXTURES_PATH}/static/mock-video.mp4" muted="muted"></video>
+ <video src="${FIXTURES_PATH}/static/mock-video.mp4"></video>
`;
let previewLink;
let writeLink;
@@ -101,6 +101,21 @@ describe('Markdown field component', () => {
expect(subject.find('.zen-backdrop textarea').element).not.toBeNull();
});
+ it('renders referenced commands on markdown preview', async () => {
+ axiosMock
+ .onPost(markdownPreviewPath)
+ .reply(200, { references: { users: [], commands: 'test command' } });
+
+ previewLink = getPreviewLink();
+ previewLink.vm.$emit('click', { target: {} });
+
+ await axios.waitFor(markdownPreviewPath);
+ const referencedCommands = subject.find('[data-testid="referenced-commands"]');
+
+ expect(referencedCommands.exists()).toBe(true);
+ expect(referencedCommands.text()).toContain('test command');
+ });
+
describe('markdown preview', () => {
beforeEach(() => {
axiosMock.onPost(markdownPreviewPath).reply(200, { body: previewHTML });
diff --git a/spec/frontend/vue_shared/components/markdown/header_spec.js b/spec/frontend/vue_shared/components/markdown/header_spec.js
index 9ffb9c6a541..fa4ca63f910 100644
--- a/spec/frontend/vue_shared/components/markdown/header_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/header_spec.js
@@ -95,7 +95,7 @@ describe('Markdown field header component', () => {
it('hides toolbar in preview mode', () => {
createWrapper({ previewMarkdown: true });
- expect(findToolbar().classes().includes('gl-display-none')).toBe(true);
+ expect(findToolbar().classes().includes('gl-display-none!')).toBe(true);
});
it('emits toggle markdown event when clicking preview tab', async () => {
diff --git a/spec/frontend/vue_shared/components/metric_images/__snapshots__/metric_images_table_spec.js.snap b/spec/frontend/vue_shared/components/metric_images/__snapshots__/metric_images_table_spec.js.snap
new file mode 100644
index 00000000000..5dd12d9edf5
--- /dev/null
+++ b/spec/frontend/vue_shared/components/metric_images/__snapshots__/metric_images_table_spec.js.snap
@@ -0,0 +1,73 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Metrics upload item render the metrics image component 1`] = `
+<gl-card-stub
+ bodyclass="gl-border-1,gl-border-t-solid,gl-border-gray-100,[object Object]"
+ class="collapsible-card border gl-p-0 gl-mb-5"
+ footerclass=""
+ headerclass="gl-display-flex gl-align-items-center gl-border-b-0 gl-py-3"
+>
+ <gl-modal-stub
+ actioncancel="[object Object]"
+ actionprimary="[object Object]"
+ body-class="gl-pb-0! gl-min-h-6!"
+ dismisslabel="Close"
+ modalclass=""
+ modalid="delete-metric-modal"
+ size="sm"
+ titletag="h4"
+ >
+
+ <p>
+ Are you sure you wish to delete this image?
+ </p>
+ </gl-modal-stub>
+
+ <gl-modal-stub
+ actioncancel="[object Object]"
+ actionprimary="[object Object]"
+ data-testid="metric-image-edit-modal"
+ dismisslabel="Close"
+ modalclass=""
+ modalid="edit-metric-modal"
+ size="sm"
+ titletag="h4"
+ >
+
+ <gl-form-group-stub
+ label="Text (optional)"
+ label-for="upload-text-input"
+ labeldescription=""
+ optionaltext="(optional)"
+ >
+ <gl-form-input-stub
+ data-testid="metric-image-text-field"
+ id="upload-text-input"
+ />
+ </gl-form-group-stub>
+
+ <gl-form-group-stub
+ description="Must start with http or https"
+ label="Link (optional)"
+ label-for="upload-url-input"
+ labeldescription=""
+ optionaltext="(optional)"
+ >
+ <gl-form-input-stub
+ data-testid="metric-image-url-field"
+ id="upload-url-input"
+ />
+ </gl-form-group-stub>
+ </gl-modal-stub>
+
+ <div
+ class="gl-display-flex gl-flex-direction-column"
+ data-testid="metric-image-body"
+ >
+ <img
+ class="gl-max-w-full gl-align-self-center"
+ src="test_file_path"
+ />
+ </div>
+</gl-card-stub>
+`;
diff --git a/spec/frontend/vue_shared/components/metric_images/metric_images_tab_spec.js b/spec/frontend/vue_shared/components/metric_images/metric_images_tab_spec.js
new file mode 100644
index 00000000000..2cefa77b72d
--- /dev/null
+++ b/spec/frontend/vue_shared/components/metric_images/metric_images_tab_spec.js
@@ -0,0 +1,174 @@
+import { GlFormInput, GlModal } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import merge from 'lodash/merge';
+import Vuex from 'vuex';
+import MetricImagesTable from '~/vue_shared/components/metric_images/metric_images_table.vue';
+import MetricImagesTab from '~/vue_shared/components/metric_images/metric_images_tab.vue';
+import createStore from '~/vue_shared/components/metric_images/store';
+import waitForPromises from 'helpers/wait_for_promises';
+import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
+import { fileList, initialData } from './mock_data';
+
+const service = {
+ getMetricImages: jest.fn(),
+};
+
+const mockEvent = { preventDefault: jest.fn() };
+
+Vue.use(Vuex);
+
+describe('Metric images tab', () => {
+ let wrapper;
+ let store;
+
+ const mountComponent = (options = {}) => {
+ store = createStore({}, service);
+
+ wrapper = shallowMount(
+ MetricImagesTab,
+ merge(
+ {
+ store,
+ provide: {
+ canUpdate: true,
+ iid: initialData.issueIid,
+ projectId: initialData.projectId,
+ },
+ },
+ options,
+ ),
+ );
+ };
+
+ beforeEach(() => {
+ mountComponent();
+ });
+
+ afterEach(() => {
+ if (wrapper) {
+ wrapper.destroy();
+ wrapper = null;
+ }
+ });
+
+ const findUploadDropzone = () => wrapper.findComponent(UploadDropzone);
+ const findImages = () => wrapper.findAllComponents(MetricImagesTable);
+ const findModal = () => wrapper.findComponent(GlModal);
+ const submitModal = () => findModal().vm.$emit('primary', mockEvent);
+ const cancelModal = () => findModal().vm.$emit('hidden');
+
+ describe('empty state', () => {
+ beforeEach(() => {
+ mountComponent();
+ });
+
+ it('renders the upload component', () => {
+ expect(findUploadDropzone().exists()).toBe(true);
+ });
+ });
+
+ describe('permissions', () => {
+ beforeEach(() => {
+ mountComponent({ provide: { canUpdate: false } });
+ });
+
+ it('hides the upload component when disallowed', () => {
+ expect(findUploadDropzone().exists()).toBe(false);
+ });
+ });
+
+ describe('onLoad action', () => {
+ it('should load images', async () => {
+ service.getMetricImages.mockImplementation(() => Promise.resolve(fileList));
+
+ mountComponent();
+
+ await waitForPromises();
+
+ expect(findImages().length).toBe(1);
+ });
+ });
+
+ describe('add metric dialog', () => {
+ const testUrl = 'test url';
+
+ it('should open the add metric dialog when clicked', async () => {
+ mountComponent();
+
+ findUploadDropzone().vm.$emit('change');
+
+ await waitForPromises();
+
+ expect(findModal().attributes('visible')).toBe('true');
+ });
+
+ it('should close when cancelled', async () => {
+ mountComponent({
+ data() {
+ return { modalVisible: true };
+ },
+ });
+
+ cancelModal();
+
+ await waitForPromises();
+
+ expect(findModal().attributes('visible')).toBeFalsy();
+ });
+
+ it('should add files and url when selected', async () => {
+ mountComponent({
+ data() {
+ return { modalVisible: true, modalUrl: testUrl, currentFiles: fileList };
+ },
+ });
+
+ const dispatchSpy = jest.spyOn(store, 'dispatch');
+
+ submitModal();
+
+ await waitForPromises();
+
+ expect(dispatchSpy).toHaveBeenCalledWith('uploadImage', {
+ files: fileList,
+ url: testUrl,
+ urlText: '',
+ });
+ });
+
+ describe('url field', () => {
+ beforeEach(() => {
+ mountComponent({
+ data() {
+ return { modalVisible: true, modalUrl: testUrl };
+ },
+ });
+ });
+
+ it('should display the url field', () => {
+ expect(wrapper.find('#upload-url-input').attributes('value')).toBe(testUrl);
+ });
+
+ it('should display the url text field', () => {
+ expect(wrapper.find('#upload-text-input').attributes('value')).toBe('');
+ });
+
+ it('should clear url when cancelled', async () => {
+ cancelModal();
+
+ await waitForPromises();
+
+ expect(wrapper.findComponent(GlFormInput).attributes('value')).toBe('');
+ });
+
+ it('should clear url when submitted', async () => {
+ submitModal();
+
+ await waitForPromises();
+
+ expect(wrapper.findComponent(GlFormInput).attributes('value')).toBe('');
+ });
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/metric_images/metric_images_table_spec.js b/spec/frontend/vue_shared/components/metric_images/metric_images_table_spec.js
new file mode 100644
index 00000000000..d792bd46ccd
--- /dev/null
+++ b/spec/frontend/vue_shared/components/metric_images/metric_images_table_spec.js
@@ -0,0 +1,230 @@
+import { GlLink, GlModal } from '@gitlab/ui';
+import { shallowMount, mount } from '@vue/test-utils';
+import Vue from 'vue';
+import merge from 'lodash/merge';
+import Vuex from 'vuex';
+import createStore from '~/vue_shared/components/metric_images/store';
+import MetricsImageTable from '~/vue_shared/components/metric_images/metric_images_table.vue';
+import waitForPromises from 'helpers/wait_for_promises';
+
+const defaultProps = {
+ id: 1,
+ filePath: 'test_file_path',
+ filename: 'test_file_name',
+};
+
+const mockEvent = { preventDefault: jest.fn() };
+
+Vue.use(Vuex);
+
+describe('Metrics upload item', () => {
+ let wrapper;
+ let store;
+
+ const mountComponent = (options = {}, mountMethod = mount) => {
+ store = createStore();
+
+ wrapper = mountMethod(
+ MetricsImageTable,
+ merge(
+ {
+ store,
+ propsData: {
+ ...defaultProps,
+ },
+ provide: { canUpdate: true },
+ },
+ options,
+ ),
+ );
+ };
+
+ afterEach(() => {
+ if (wrapper) {
+ wrapper.destroy();
+ wrapper = null;
+ }
+ });
+
+ const findImageLink = () => wrapper.findComponent(GlLink);
+ const findLabelTextSpan = () => wrapper.find('[data-testid="metric-image-label-span"]');
+ const findCollapseButton = () => wrapper.find('[data-testid="collapse-button"]');
+ const findMetricImageBody = () => wrapper.find('[data-testid="metric-image-body"]');
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findEditModal = () => wrapper.find('[data-testid="metric-image-edit-modal"]');
+ const findDeleteButton = () => wrapper.find('[data-testid="delete-button"]');
+ const findEditButton = () => wrapper.find('[data-testid="edit-button"]');
+ const findImageTextInput = () => wrapper.find('[data-testid="metric-image-text-field"]');
+ const findImageUrlInput = () => wrapper.find('[data-testid="metric-image-url-field"]');
+
+ const closeModal = () => findModal().vm.$emit('hidden');
+ const submitModal = () => findModal().vm.$emit('primary', mockEvent);
+ const deleteImage = () => findDeleteButton().vm.$emit('click');
+ const closeEditModal = () => findEditModal().vm.$emit('hidden');
+ const submitEditModal = () => findEditModal().vm.$emit('primary', mockEvent);
+ const editImage = () => findEditButton().vm.$emit('click');
+
+ it('render the metrics image component', () => {
+ mountComponent({}, shallowMount);
+
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ it('shows a link with the correct url', () => {
+ const testUrl = 'test_url';
+ mountComponent({ propsData: { url: testUrl } });
+
+ expect(findImageLink().attributes('href')).toBe(testUrl);
+ expect(findImageLink().text()).toBe(defaultProps.filename);
+ });
+
+ it('shows a link with the url text, if url text is present', () => {
+ const testUrl = 'test_url';
+ const testUrlText = 'test_url_text';
+ mountComponent({ propsData: { url: testUrl, urlText: testUrlText } });
+
+ expect(findImageLink().attributes('href')).toBe(testUrl);
+ expect(findImageLink().text()).toBe(testUrlText);
+ });
+
+ it('shows the url text with no url, if no url is present', () => {
+ const testUrlText = 'test_url_text';
+ mountComponent({ propsData: { urlText: testUrlText } });
+
+ expect(findLabelTextSpan().text()).toBe(testUrlText);
+ });
+
+ describe('expand and collapse', () => {
+ beforeEach(() => {
+ mountComponent();
+ });
+
+ it('the card is expanded by default', () => {
+ expect(findMetricImageBody().isVisible()).toBe(true);
+ });
+
+ it('the card is collapsed when clicked', async () => {
+ findCollapseButton().trigger('click');
+
+ await waitForPromises();
+
+ expect(findMetricImageBody().isVisible()).toBe(false);
+ });
+ });
+
+ describe('delete functionality', () => {
+ it('should open the delete modal when clicked', async () => {
+ mountComponent({ stubs: { GlModal: true } });
+
+ deleteImage();
+
+ await waitForPromises();
+
+ expect(findModal().attributes('visible')).toBe('true');
+ });
+
+ describe('when the modal is open', () => {
+ beforeEach(() => {
+ mountComponent(
+ {
+ data() {
+ return { modalVisible: true };
+ },
+ },
+ shallowMount,
+ );
+ });
+
+ it('should close the modal when cancelled', async () => {
+ closeModal();
+
+ await waitForPromises();
+
+ expect(findModal().attributes('visible')).toBeFalsy();
+ });
+
+ it('should delete the image when selected', async () => {
+ const dispatchSpy = jest.spyOn(store, 'dispatch').mockImplementation(jest.fn());
+
+ submitModal();
+
+ await waitForPromises();
+
+ expect(dispatchSpy).toHaveBeenCalledWith('deleteImage', defaultProps.id);
+ });
+ });
+
+ describe('canUpdate permission', () => {
+ it('delete button is hidden when user lacks update permissions', () => {
+ mountComponent({ provide: { canUpdate: false } });
+
+ expect(findDeleteButton().exists()).toBe(false);
+ });
+ });
+ });
+
+ describe('edit functionality', () => {
+ it('should open the delete modal when clicked', async () => {
+ mountComponent({ stubs: { GlModal: true } });
+
+ editImage();
+
+ await waitForPromises();
+
+ expect(findEditModal().attributes('visible')).toBe('true');
+ });
+
+ describe('when the modal is open', () => {
+ beforeEach(() => {
+ mountComponent({
+ data() {
+ return { editModalVisible: true };
+ },
+ propsData: { urlText: 'test' },
+ stubs: { GlModal: true },
+ });
+ });
+
+ it('should close the modal when cancelled', async () => {
+ closeEditModal();
+
+ await waitForPromises();
+
+ expect(findEditModal().attributes('visible')).toBeFalsy();
+ });
+
+ it('should delete the image when selected', async () => {
+ const dispatchSpy = jest.spyOn(store, 'dispatch').mockImplementation(jest.fn());
+
+ submitEditModal();
+
+ await waitForPromises();
+
+ expect(dispatchSpy).toHaveBeenCalledWith('updateImage', {
+ imageId: defaultProps.id,
+ url: null,
+ urlText: 'test',
+ });
+ });
+
+ it('should clear edits when the modal is closed', async () => {
+ await findImageTextInput().setValue('test value');
+ await findImageUrlInput().setValue('http://www.gitlab.com');
+
+ expect(findImageTextInput().element.value).toBe('test value');
+ expect(findImageUrlInput().element.value).toBe('http://www.gitlab.com');
+
+ closeEditModal();
+
+ await waitForPromises();
+
+ editImage();
+
+ await waitForPromises();
+
+ expect(findImageTextInput().element.value).toBe('test');
+ expect(findImageUrlInput().element.value).toBe('');
+ });
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/metric_images/mock_data.js b/spec/frontend/vue_shared/components/metric_images/mock_data.js
new file mode 100644
index 00000000000..480491077fb
--- /dev/null
+++ b/spec/frontend/vue_shared/components/metric_images/mock_data.js
@@ -0,0 +1,5 @@
+export const fileList = [{ filePath: 'test', filename: 'hello', id: 5, url: null }];
+
+export const fileListRaw = [{ file_path: 'test', filename: 'hello', id: 5, url: null }];
+
+export const initialData = { issueIid: '123', projectId: 456 };
diff --git a/spec/frontend/vue_shared/components/metric_images/store/actions_spec.js b/spec/frontend/vue_shared/components/metric_images/store/actions_spec.js
new file mode 100644
index 00000000000..518cf354675
--- /dev/null
+++ b/spec/frontend/vue_shared/components/metric_images/store/actions_spec.js
@@ -0,0 +1,158 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import actionsFactory from '~/vue_shared/components/metric_images/store/actions';
+import * as types from '~/vue_shared/components/metric_images/store/mutation_types';
+import createStore from '~/vue_shared/components/metric_images/store';
+import testAction from 'helpers/vuex_action_helper';
+import createFlash from '~/flash';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { fileList, initialData } from '../mock_data';
+
+jest.mock('~/flash');
+const service = {
+ getMetricImages: jest.fn(),
+ uploadMetricImage: jest.fn(),
+ updateMetricImage: jest.fn(),
+ deleteMetricImage: jest.fn(),
+};
+
+const actions = actionsFactory(service);
+
+const defaultState = {
+ issueIid: 1,
+ projectId: '2',
+};
+
+Vue.use(Vuex);
+
+describe('Metrics tab store actions', () => {
+ let store;
+ let state;
+
+ beforeEach(() => {
+ store = createStore(defaultState);
+ state = store.state;
+ });
+
+ afterEach(() => {
+ createFlash.mockClear();
+ });
+
+ describe('fetching metric images', () => {
+ it('should call success action when fetching metric images', () => {
+ service.getMetricImages.mockImplementation(() => Promise.resolve(fileList));
+
+ testAction(actions.fetchImages, null, state, [
+ { type: types.REQUEST_METRIC_IMAGES },
+ {
+ type: types.RECEIVE_METRIC_IMAGES_SUCCESS,
+ payload: convertObjectPropsToCamelCase(fileList, { deep: true }),
+ },
+ ]);
+ });
+
+ it('should call error action when fetching metric images with an error', async () => {
+ service.getMetricImages.mockImplementation(() => Promise.reject());
+
+ await testAction(
+ actions.fetchImages,
+ null,
+ state,
+ [{ type: types.REQUEST_METRIC_IMAGES }, { type: types.RECEIVE_METRIC_IMAGES_ERROR }],
+ [],
+ );
+ expect(createFlash).toHaveBeenCalled();
+ });
+ });
+
+ describe('uploading metric images', () => {
+ const payload = {
+ // mock the FileList api
+ files: {
+ item() {
+ return fileList[0];
+ },
+ },
+ url: 'test_url',
+ };
+
+ it('should call success action when uploading an image', () => {
+ service.uploadMetricImage.mockImplementation(() => Promise.resolve(fileList[0]));
+
+ testAction(actions.uploadImage, payload, state, [
+ { type: types.REQUEST_METRIC_UPLOAD },
+ {
+ type: types.RECEIVE_METRIC_UPLOAD_SUCCESS,
+ payload: fileList[0],
+ },
+ ]);
+ });
+
+ it('should call error action when failing to upload an image', async () => {
+ service.uploadMetricImage.mockImplementation(() => Promise.reject());
+
+ await testAction(
+ actions.uploadImage,
+ payload,
+ state,
+ [{ type: types.REQUEST_METRIC_UPLOAD }, { type: types.RECEIVE_METRIC_UPLOAD_ERROR }],
+ [],
+ );
+ expect(createFlash).toHaveBeenCalled();
+ });
+ });
+
+ describe('updating metric images', () => {
+ const payload = {
+ url: 'test_url',
+ urlText: 'url text',
+ };
+
+ it('should call success action when updating an image', () => {
+ service.updateMetricImage.mockImplementation(() => Promise.resolve());
+
+ testAction(actions.updateImage, payload, state, [
+ { type: types.REQUEST_METRIC_UPLOAD },
+ {
+ type: types.RECEIVE_METRIC_UPDATE_SUCCESS,
+ },
+ ]);
+ });
+
+ it('should call error action when failing to update an image', async () => {
+ service.updateMetricImage.mockImplementation(() => Promise.reject());
+
+ await testAction(
+ actions.updateImage,
+ payload,
+ state,
+ [{ type: types.REQUEST_METRIC_UPLOAD }, { type: types.RECEIVE_METRIC_UPLOAD_ERROR }],
+ [],
+ );
+ expect(createFlash).toHaveBeenCalled();
+ });
+ });
+
+ describe('deleting a metric image', () => {
+ const payload = fileList[0].id;
+
+ it('should call success action when deleting an image', () => {
+ service.deleteMetricImage.mockImplementation(() => Promise.resolve());
+
+ testAction(actions.deleteImage, payload, state, [
+ {
+ type: types.RECEIVE_METRIC_DELETE_SUCCESS,
+ payload,
+ },
+ ]);
+ });
+ });
+
+ describe('initial data', () => {
+ it('should set the initial data correctly', () => {
+ testAction(actions.setInitialData, initialData, state, [
+ { type: types.SET_INITIAL_DATA, payload: initialData },
+ ]);
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/metric_images/store/mutations_spec.js b/spec/frontend/vue_shared/components/metric_images/store/mutations_spec.js
new file mode 100644
index 00000000000..754f729e657
--- /dev/null
+++ b/spec/frontend/vue_shared/components/metric_images/store/mutations_spec.js
@@ -0,0 +1,147 @@
+import { cloneDeep } from 'lodash';
+import * as types from '~/vue_shared/components/metric_images/store/mutation_types';
+import mutations from '~/vue_shared/components/metric_images/store/mutations';
+import { initialData } from '../mock_data';
+
+const defaultState = {
+ metricImages: [],
+ isLoadingMetricImages: false,
+ isUploadingImage: false,
+};
+
+const testImages = [
+ { filename: 'test.filename', id: 5, filePath: 'test/file/path', url: null },
+ { filename: 'second.filename', id: 6, filePath: 'second/file/path', url: 'test/url' },
+ { filename: 'third.filename', id: 7, filePath: 'third/file/path', url: 'test/url' },
+];
+
+describe('Metric images mutations', () => {
+ let state;
+
+ const createState = (customState = {}) => {
+ state = {
+ ...cloneDeep(defaultState),
+ ...customState,
+ };
+ };
+
+ beforeEach(() => {
+ createState();
+ });
+
+ describe('REQUEST_METRIC_IMAGES', () => {
+ beforeEach(() => {
+ mutations[types.REQUEST_METRIC_IMAGES](state);
+ });
+
+ it('should set the loading state', () => {
+ expect(state.isLoadingMetricImages).toBe(true);
+ });
+ });
+
+ describe('RECEIVE_METRIC_IMAGES_SUCCESS', () => {
+ beforeEach(() => {
+ mutations[types.RECEIVE_METRIC_IMAGES_SUCCESS](state, testImages);
+ });
+
+ it('should unset the loading state', () => {
+ expect(state.isLoadingMetricImages).toBe(false);
+ });
+
+ it('should set the metric images', () => {
+ expect(state.metricImages).toEqual(testImages);
+ });
+ });
+
+ describe('RECEIVE_METRIC_IMAGES_ERROR', () => {
+ beforeEach(() => {
+ mutations[types.RECEIVE_METRIC_IMAGES_ERROR](state);
+ });
+
+ it('should unset the loading state', () => {
+ expect(state.isLoadingMetricImages).toBe(false);
+ });
+ });
+
+ describe('REQUEST_METRIC_UPLOAD', () => {
+ beforeEach(() => {
+ mutations[types.REQUEST_METRIC_UPLOAD](state);
+ });
+
+ it('should set the loading state', () => {
+ expect(state.isUploadingImage).toBe(true);
+ });
+ });
+
+ describe('RECEIVE_METRIC_UPLOAD_SUCCESS', () => {
+ const initialImage = testImages[0];
+ const newImage = testImages[1];
+
+ beforeEach(() => {
+ createState({ metricImages: [initialImage] });
+ mutations[types.RECEIVE_METRIC_UPLOAD_SUCCESS](state, newImage);
+ });
+
+ it('should unset the loading state', () => {
+ expect(state.isUploadingImage).toBe(false);
+ });
+
+ it('should add the new metric image after the existing one', () => {
+ expect(state.metricImages).toMatchObject([initialImage, newImage]);
+ });
+ });
+
+ describe('RECEIVE_METRIC_UPLOAD_ERROR', () => {
+ beforeEach(() => {
+ mutations[types.RECEIVE_METRIC_UPLOAD_ERROR](state);
+ });
+
+ it('should unset the loading state', () => {
+ expect(state.isUploadingImage).toBe(false);
+ });
+ });
+
+ describe('RECEIVE_METRIC_UPDATE_SUCCESS', () => {
+ const initialImage = testImages[0];
+ const newImage = testImages[0];
+ newImage.url = 'https://www.gitlab.com';
+
+ beforeEach(() => {
+ createState({ metricImages: [initialImage] });
+ mutations[types.RECEIVE_METRIC_UPDATE_SUCCESS](state, newImage);
+ });
+
+ it('should unset the loading state', () => {
+ expect(state.isUploadingImage).toBe(false);
+ });
+
+ it('should replace the existing image with the new one', () => {
+ expect(state.metricImages).toMatchObject([newImage]);
+ });
+ });
+
+ describe('RECEIVE_METRIC_DELETE_SUCCESS', () => {
+ const deletedImageId = testImages[1].id;
+ const expectedResult = [testImages[0], testImages[2]];
+
+ beforeEach(() => {
+ createState({ metricImages: [...testImages] });
+ mutations[types.RECEIVE_METRIC_DELETE_SUCCESS](state, deletedImageId);
+ });
+
+ it('should remove the correct metric image', () => {
+ expect(state.metricImages).toEqual(expectedResult);
+ });
+ });
+
+ describe('SET_INITIAL_DATA', () => {
+ beforeEach(() => {
+ mutations[types.SET_INITIAL_DATA](state, initialData);
+ });
+
+ it('should unset the loading state', () => {
+ expect(state.modelIid).toBe(initialData.modelIid);
+ expect(state.projectId).toBe(initialData.projectId);
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/notes/placeholder_note_spec.js b/spec/frontend/vue_shared/components/notes/placeholder_note_spec.js
index c8dab0204d3..6881cb79740 100644
--- a/spec/frontend/vue_shared/components/notes/placeholder_note_spec.js
+++ b/spec/frontend/vue_shared/components/notes/placeholder_note_spec.js
@@ -3,7 +3,7 @@ import Vue from 'vue';
import Vuex from 'vuex';
import IssuePlaceholderNote from '~/vue_shared/components/notes/placeholder_note.vue';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
-import { userDataMock } from '../../../notes/mock_data';
+import { userDataMock } from 'jest/notes/mock_data';
Vue.use(Vuex);
diff --git a/spec/frontend/vue_shared/components/project_avatar/default_spec.js b/spec/frontend/vue_shared/components/project_avatar/default_spec.js
deleted file mode 100644
index d042db6051c..00000000000
--- a/spec/frontend/vue_shared/components/project_avatar/default_spec.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import Vue, { nextTick } from 'vue';
-import mountComponent from 'helpers/vue_mount_component_helper';
-import { projectData } from 'jest/ide/mock_data';
-import { TEST_HOST } from 'spec/test_constants';
-import { getFirstCharacterCapitalized } from '~/lib/utils/text_utility';
-import ProjectAvatarDefault from '~/vue_shared/components/deprecated_project_avatar/default.vue';
-
-describe('ProjectAvatarDefault component', () => {
- const Component = Vue.extend(ProjectAvatarDefault);
- let vm;
-
- beforeEach(() => {
- vm = mountComponent(Component, {
- project: projectData,
- });
- });
-
- afterEach(() => {
- vm.$destroy();
- });
-
- it('renders identicon if project has no avatar_url', async () => {
- const expectedText = getFirstCharacterCapitalized(projectData.name);
-
- vm.project = {
- ...vm.project,
- avatar_url: null,
- };
-
- await nextTick();
- const identiconEl = vm.$el.querySelector('.identicon');
-
- expect(identiconEl).not.toBe(null);
- expect(identiconEl.textContent.trim()).toEqual(expectedText);
- });
-
- it('renders avatar image if project has avatar_url', async () => {
- const avatarUrl = `${TEST_HOST}/images/home/nasa.svg`;
-
- vm.project = {
- ...vm.project,
- avatar_url: avatarUrl,
- };
-
- await nextTick();
- expect(vm.$el.querySelector('.avatar')).not.toBeNull();
- expect(vm.$el.querySelector('.identicon')).toBeNull();
- expect(vm.$el.querySelector('img')).toHaveAttr('src', avatarUrl);
- });
-});
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 5afa017aa76..397ab2254b9 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
@@ -2,7 +2,7 @@ import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import mockProjects from 'test_fixtures_static/projects.json';
import { trimText } from 'helpers/text_helper';
-import ProjectAvatar from '~/vue_shared/components/deprecated_project_avatar/default.vue';
+import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
import ProjectListItem from '~/vue_shared/components/project_selector/project_list_item.vue';
describe('ProjectListItem component', () => {
@@ -52,8 +52,13 @@ describe('ProjectListItem component', () => {
it(`renders the project avatar`, () => {
wrapper = shallowMount(Component, options);
+ const avatar = wrapper.findComponent(ProjectAvatar);
- expect(wrapper.findComponent(ProjectAvatar).exists()).toBe(true);
+ expect(avatar.exists()).toBe(true);
+ expect(avatar.props()).toMatchObject({
+ projectAvatarUrl: '',
+ projectName: project.name_with_namespace,
+ });
});
it(`renders a simple namespace name with a trailing slash`, () => {
diff --git a/spec/frontend/vue_shared/components/registry/persisted_dropdown_selection_spec.js b/spec/frontend/vue_shared/components/registry/persisted_dropdown_selection_spec.js
index c65ded000d3..616fefe847e 100644
--- a/spec/frontend/vue_shared/components/registry/persisted_dropdown_selection_spec.js
+++ b/spec/frontend/vue_shared/components/registry/persisted_dropdown_selection_spec.js
@@ -36,10 +36,10 @@ describe('Persisted dropdown selection', () => {
});
describe('local storage sync', () => {
- it('uses the local storage sync component', () => {
+ it('uses the local storage sync component with the correct props', () => {
createComponent();
- expect(findLocalStorageSync().exists()).toBe(true);
+ expect(findLocalStorageSync().props('asString')).toBe(true);
});
it('passes the right props', () => {
diff --git a/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap b/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap
index 6954bd5ccff..ac313e556fc 100644
--- a/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap
+++ b/spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap
@@ -42,7 +42,7 @@ exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
<gl-accordion-item-stub
class="gl-font-weight-normal"
title="More Details"
- title-visible="Less Details"
+ titlevisible="Less Details"
>
<p
class="gl-pt-2"
@@ -76,7 +76,7 @@ exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
<gl-accordion-item-stub
class="gl-font-weight-normal"
title="More Details"
- title-visible="Less Details"
+ titlevisible="Less Details"
>
<p
class="gl-pt-2"
@@ -110,7 +110,7 @@ exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
<gl-accordion-item-stub
class="gl-font-weight-normal"
title="More Details"
- title-visible="Less Details"
+ titlevisible="Less Details"
>
<p
class="gl-pt-2"
@@ -144,7 +144,7 @@ exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
<gl-accordion-item-stub
class="gl-font-weight-normal"
title="More Details"
- title-visible="Less Details"
+ titlevisible="Less Details"
>
<p
class="gl-pt-2"
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js
index 2e4c056df61..2bc513e87bf 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js
@@ -21,87 +21,81 @@ describe('LabelsSelect Actions', () => {
});
describe('setInitialState', () => {
- it('sets initial store state', (done) => {
- testAction(
+ it('sets initial store state', () => {
+ return testAction(
actions.setInitialState,
mockInitialState,
state,
[{ type: types.SET_INITIAL_STATE, payload: mockInitialState }],
[],
- done,
);
});
});
describe('toggleDropdownButton', () => {
- it('toggles dropdown button', (done) => {
- testAction(
+ it('toggles dropdown button', () => {
+ return testAction(
actions.toggleDropdownButton,
{},
state,
[{ type: types.TOGGLE_DROPDOWN_BUTTON }],
[],
- done,
);
});
});
describe('toggleDropdownContents', () => {
- it('toggles dropdown contents', (done) => {
- testAction(
+ it('toggles dropdown contents', () => {
+ return testAction(
actions.toggleDropdownContents,
{},
state,
[{ type: types.TOGGLE_DROPDOWN_CONTENTS }],
[],
- done,
);
});
});
describe('toggleDropdownContentsCreateView', () => {
- it('toggles dropdown create view', (done) => {
- testAction(
+ it('toggles dropdown create view', () => {
+ return testAction(
actions.toggleDropdownContentsCreateView,
{},
state,
[{ type: types.TOGGLE_DROPDOWN_CONTENTS_CREATE_VIEW }],
[],
- done,
);
});
});
describe('requestLabels', () => {
- it('sets value of `state.labelsFetchInProgress` to `true`', (done) => {
- testAction(actions.requestLabels, {}, state, [{ type: types.REQUEST_LABELS }], [], done);
+ it('sets value of `state.labelsFetchInProgress` to `true`', () => {
+ return testAction(actions.requestLabels, {}, state, [{ type: types.REQUEST_LABELS }], []);
});
});
describe('receiveLabelsSuccess', () => {
- it('sets provided labels to `state.labels`', (done) => {
+ it('sets provided labels to `state.labels`', () => {
const labels = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
- testAction(
+ return testAction(
actions.receiveLabelsSuccess,
labels,
state,
[{ type: types.RECEIVE_SET_LABELS_SUCCESS, payload: labels }],
[],
- done,
);
});
});
describe('receiveLabelsFailure', () => {
- it('sets value `state.labelsFetchInProgress` to `false`', (done) => {
- testAction(
+ it('sets value `state.labelsFetchInProgress` to `false`', () => {
+ return testAction(
actions.receiveLabelsFailure,
{},
state,
[{ type: types.RECEIVE_SET_LABELS_FAILURE }],
[],
- done,
);
});
@@ -125,72 +119,67 @@ describe('LabelsSelect Actions', () => {
});
describe('on success', () => {
- it('dispatches `requestLabels` & `receiveLabelsSuccess` actions', (done) => {
+ it('dispatches `requestLabels` & `receiveLabelsSuccess` actions', () => {
const labels = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
mock.onGet(/labels.json/).replyOnce(200, labels);
- testAction(
+ return testAction(
actions.fetchLabels,
{},
state,
[],
[{ type: 'requestLabels' }, { type: 'receiveLabelsSuccess', payload: labels }],
- done,
);
});
});
describe('on failure', () => {
- it('dispatches `requestLabels` & `receiveLabelsFailure` actions', (done) => {
+ it('dispatches `requestLabels` & `receiveLabelsFailure` actions', () => {
mock.onGet(/labels.json/).replyOnce(500, {});
- testAction(
+ return testAction(
actions.fetchLabels,
{},
state,
[],
[{ type: 'requestLabels' }, { type: 'receiveLabelsFailure' }],
- done,
);
});
});
});
describe('requestCreateLabel', () => {
- it('sets value `state.labelCreateInProgress` to `true`', (done) => {
- testAction(
+ it('sets value `state.labelCreateInProgress` to `true`', () => {
+ return testAction(
actions.requestCreateLabel,
{},
state,
[{ type: types.REQUEST_CREATE_LABEL }],
[],
- done,
);
});
});
describe('receiveCreateLabelSuccess', () => {
- it('sets value `state.labelCreateInProgress` to `false`', (done) => {
- testAction(
+ it('sets value `state.labelCreateInProgress` to `false`', () => {
+ return testAction(
actions.receiveCreateLabelSuccess,
{},
state,
[{ type: types.RECEIVE_CREATE_LABEL_SUCCESS }],
[],
- done,
);
});
});
describe('receiveCreateLabelFailure', () => {
- it('sets value `state.labelCreateInProgress` to `false`', (done) => {
- testAction(
+ it('sets value `state.labelCreateInProgress` to `false`', () => {
+ return testAction(
actions.receiveCreateLabelFailure,
{},
state,
[{ type: types.RECEIVE_CREATE_LABEL_FAILURE }],
[],
- done,
);
});
@@ -214,11 +203,11 @@ describe('LabelsSelect Actions', () => {
});
describe('on success', () => {
- it('dispatches `requestCreateLabel`, `fetchLabels` & `receiveCreateLabelSuccess` & `toggleDropdownContentsCreateView` actions', (done) => {
+ it('dispatches `requestCreateLabel`, `fetchLabels` & `receiveCreateLabelSuccess` & `toggleDropdownContentsCreateView` actions', () => {
const label = { id: 1 };
mock.onPost(/labels.json/).replyOnce(200, label);
- testAction(
+ return testAction(
actions.createLabel,
{},
state,
@@ -229,38 +218,35 @@ describe('LabelsSelect Actions', () => {
{ type: 'receiveCreateLabelSuccess' },
{ type: 'toggleDropdownContentsCreateView' },
],
- done,
);
});
});
describe('on failure', () => {
- it('dispatches `requestCreateLabel` & `receiveCreateLabelFailure` actions', (done) => {
+ it('dispatches `requestCreateLabel` & `receiveCreateLabelFailure` actions', () => {
mock.onPost(/labels.json/).replyOnce(500, {});
- testAction(
+ return testAction(
actions.createLabel,
{},
state,
[],
[{ type: 'requestCreateLabel' }, { type: 'receiveCreateLabelFailure' }],
- done,
);
});
});
});
describe('updateSelectedLabels', () => {
- it('updates `state.labels` based on provided `labels` param', (done) => {
+ it('updates `state.labels` based on provided `labels` param', () => {
const labels = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
- testAction(
+ return testAction(
actions.updateSelectedLabels,
labels,
state,
[{ type: types.UPDATE_SELECTED_LABELS, payload: { labels } }],
[],
- done,
);
});
});
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 67e1a3ce932..1b27a294b90 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
@@ -11,9 +11,15 @@ import DropdownValue from '~/vue_shared/components/sidebar/labels_select_widget/
import issueLabelsQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/issue_labels.query.graphql';
import updateIssueLabelsMutation from '~/boards/graphql/issue_set_labels.mutation.graphql';
import updateMergeRequestLabelsMutation from '~/sidebar/queries/update_merge_request_labels.mutation.graphql';
+import issuableLabelsSubscription from 'ee_else_ce/sidebar/queries/issuable_labels.subscription.graphql';
import updateEpicLabelsMutation from '~/vue_shared/components/sidebar/labels_select_widget/graphql/epic_update_labels.mutation.graphql';
import LabelsSelectRoot from '~/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue';
-import { mockConfig, issuableLabelsQueryResponse, updateLabelsMutationResponse } from './mock_data';
+import {
+ mockConfig,
+ issuableLabelsQueryResponse,
+ updateLabelsMutationResponse,
+ issuableLabelsSubscriptionResponse,
+} from './mock_data';
jest.mock('~/flash');
@@ -21,6 +27,7 @@ Vue.use(VueApollo);
const successfulQueryHandler = jest.fn().mockResolvedValue(issuableLabelsQueryResponse);
const successfulMutationHandler = jest.fn().mockResolvedValue(updateLabelsMutationResponse);
+const subscriptionHandler = jest.fn().mockResolvedValue(issuableLabelsSubscriptionResponse);
const errorQueryHandler = jest.fn().mockRejectedValue('Houston, we have a problem');
const updateLabelsMutation = {
@@ -42,10 +49,12 @@ describe('LabelsSelectRoot', () => {
issuableType = IssuableType.Issue,
queryHandler = successfulQueryHandler,
mutationHandler = successfulMutationHandler,
+ isRealtimeEnabled = false,
} = {}) => {
const mockApollo = createMockApollo([
[issueLabelsQuery, queryHandler],
[updateLabelsMutation[issuableType], mutationHandler],
+ [issuableLabelsSubscription, subscriptionHandler],
]);
wrapper = shallowMount(LabelsSelectRoot, {
@@ -65,6 +74,9 @@ describe('LabelsSelectRoot', () => {
allowLabelEdit: true,
allowLabelCreate: true,
labelsManagePath: 'test',
+ glFeatures: {
+ realtimeLabels: isRealtimeEnabled,
+ },
},
});
};
@@ -190,5 +202,26 @@ describe('LabelsSelectRoot', () => {
message: 'An error occurred while updating labels.',
});
});
+
+ it('does not emit `updateSelectedLabels` event when the subscription is triggered and FF is disabled', async () => {
+ createComponent();
+ await waitForPromises();
+
+ expect(wrapper.emitted('updateSelectedLabels')).toBeUndefined();
+ });
+
+ it('emits `updateSelectedLabels` event when the subscription is triggered and FF is enabled', async () => {
+ createComponent({ isRealtimeEnabled: true });
+ await waitForPromises();
+
+ expect(wrapper.emitted('updateSelectedLabels')).toEqual([
+ [
+ {
+ id: '1',
+ labels: issuableLabelsSubscriptionResponse.data.issuableLabelsUpdated.labels.nodes,
+ },
+ ],
+ ]);
+ });
});
});
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 49224fb915c..afad9314ace 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
@@ -141,6 +141,34 @@ export const issuableLabelsQueryResponse = {
},
};
+export const issuableLabelsSubscriptionResponse = {
+ data: {
+ issuableLabelsUpdated: {
+ id: '1',
+ labels: {
+ nodes: [
+ {
+ __typename: 'Label',
+ color: '#330066',
+ description: null,
+ id: 'gid://gitlab/ProjectLabel/1',
+ title: 'Label1',
+ textColor: '#000000',
+ },
+ {
+ __typename: 'Label',
+ color: '#000000',
+ description: null,
+ id: 'gid://gitlab/ProjectLabel/2',
+ title: 'Label2',
+ textColor: '#ffffff',
+ },
+ ],
+ },
+ },
+ },
+};
+
export const updateLabelsMutationResponse = {
data: {
updateIssuableLabels: {
diff --git a/spec/frontend/vue_shared/components/source_viewer/components/chunk_line_spec.js b/spec/frontend/vue_shared/components/source_viewer/components/chunk_line_spec.js
new file mode 100644
index 00000000000..eb2eec92534
--- /dev/null
+++ b/spec/frontend/vue_shared/components/source_viewer/components/chunk_line_spec.js
@@ -0,0 +1,69 @@
+import { GlLink } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ChunkLine from '~/vue_shared/components/source_viewer/components/chunk_line.vue';
+import {
+ BIDI_CHARS,
+ BIDI_CHARS_CLASS_LIST,
+ BIDI_CHAR_TOOLTIP,
+} from '~/vue_shared/components/source_viewer/constants';
+
+const DEFAULT_PROPS = {
+ number: 2,
+ content: '// Line content',
+ language: 'javascript',
+};
+
+describe('Chunk Line component', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMountExtended(ChunkLine, { propsData: { ...DEFAULT_PROPS, ...props } });
+ };
+
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findContent = () => wrapper.findByTestId('content');
+ const findWrappedBidiChars = () => wrapper.findAllByTestId('bidi-wrapper');
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => wrapper.destroy());
+
+ describe('rendering', () => {
+ it('wraps BiDi characters', () => {
+ const content = `// some content ${BIDI_CHARS.toString()} with BiDi chars`;
+ createComponent({ content });
+ const wrappedBidiChars = findWrappedBidiChars();
+
+ expect(wrappedBidiChars.length).toBe(BIDI_CHARS.length);
+
+ wrappedBidiChars.wrappers.forEach((_, i) => {
+ expect(wrappedBidiChars.at(i).text()).toBe(BIDI_CHARS[i]);
+ expect(wrappedBidiChars.at(i).attributes()).toMatchObject({
+ class: BIDI_CHARS_CLASS_LIST,
+ title: BIDI_CHAR_TOOLTIP,
+ });
+ });
+ });
+
+ it('renders a line number', () => {
+ expect(findLink().attributes()).toMatchObject({
+ 'data-line-number': `${DEFAULT_PROPS.number}`,
+ to: `#L${DEFAULT_PROPS.number}`,
+ id: `L${DEFAULT_PROPS.number}`,
+ });
+
+ expect(findLink().text()).toBe(DEFAULT_PROPS.number.toString());
+ });
+
+ it('renders content', () => {
+ expect(findContent().attributes()).toMatchObject({
+ id: `LC${DEFAULT_PROPS.number}`,
+ lang: DEFAULT_PROPS.language,
+ });
+
+ expect(findContent().text()).toBe(DEFAULT_PROPS.content);
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/source_viewer/components/chunk_spec.js b/spec/frontend/vue_shared/components/source_viewer/components/chunk_spec.js
new file mode 100644
index 00000000000..42c4f2eacb8
--- /dev/null
+++ b/spec/frontend/vue_shared/components/source_viewer/components/chunk_spec.js
@@ -0,0 +1,82 @@
+import { GlIntersectionObserver } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import Chunk from '~/vue_shared/components/source_viewer/components/chunk.vue';
+import ChunkLine from '~/vue_shared/components/source_viewer/components/chunk_line.vue';
+
+const DEFAULT_PROPS = {
+ chunkIndex: 2,
+ isHighlighted: false,
+ content: '// Line 1 content \n // Line 2 content',
+ startingFrom: 140,
+ totalLines: 50,
+ language: 'javascript',
+};
+
+describe('Chunk component', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMountExtended(Chunk, { propsData: { ...DEFAULT_PROPS, ...props } });
+ };
+
+ const findIntersectionObserver = () => wrapper.findComponent(GlIntersectionObserver);
+ const findChunkLines = () => wrapper.findAllComponents(ChunkLine);
+ const findLineNumbers = () => wrapper.findAllByTestId('line-number');
+ const findContent = () => wrapper.findByTestId('content');
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => wrapper.destroy());
+
+ describe('Intersection observer', () => {
+ it('renders an Intersection observer component', () => {
+ expect(findIntersectionObserver().exists()).toBe(true);
+ });
+
+ it('emits an appear event when intersection-observer appears', () => {
+ findIntersectionObserver().vm.$emit('appear');
+
+ expect(wrapper.emitted('appear')).toEqual([[DEFAULT_PROPS.chunkIndex]]);
+ });
+
+ it('does not emit an appear event is isHighlighted is true', () => {
+ createComponent({ isHighlighted: true });
+ findIntersectionObserver().vm.$emit('appear');
+
+ expect(wrapper.emitted('appear')).toEqual(undefined);
+ });
+ });
+
+ describe('rendering', () => {
+ it('does not render a Chunk Line component if isHighlighted is false', () => {
+ expect(findChunkLines().length).toBe(0);
+ });
+
+ it('renders simplified line numbers and content if isHighlighted is false', () => {
+ expect(findLineNumbers().length).toBe(DEFAULT_PROPS.totalLines);
+
+ expect(findLineNumbers().at(0).attributes()).toMatchObject({
+ 'data-line-number': `${DEFAULT_PROPS.startingFrom + 1}`,
+ href: `#L${DEFAULT_PROPS.startingFrom + 1}`,
+ id: `L${DEFAULT_PROPS.startingFrom + 1}`,
+ });
+
+ expect(findContent().text()).toBe(DEFAULT_PROPS.content);
+ });
+
+ it('renders Chunk Line components if isHighlighted is true', () => {
+ const splitContent = DEFAULT_PROPS.content.split('\n');
+ createComponent({ isHighlighted: true });
+
+ expect(findChunkLines().length).toBe(splitContent.length);
+
+ expect(findChunkLines().at(0).props()).toMatchObject({
+ number: DEFAULT_PROPS.startingFrom + 1,
+ content: splitContent[0],
+ language: DEFAULT_PROPS.language,
+ });
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js b/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js
index ab579945e22..6a9ea75127d 100644
--- a/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js
+++ b/spec/frontend/vue_shared/components/source_viewer/source_viewer_spec.js
@@ -1,24 +1,38 @@
import hljs from 'highlight.js/lib/core';
-import { GlLoadingIcon } from '@gitlab/ui';
-import Vue, { nextTick } from 'vue';
+import Vue from 'vue';
import VueRouter from 'vue-router';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import SourceViewer from '~/vue_shared/components/source_viewer/source_viewer.vue';
+import Chunk from '~/vue_shared/components/source_viewer/components/chunk.vue';
import { ROUGE_TO_HLJS_LANGUAGE_MAP } from '~/vue_shared/components/source_viewer/constants';
-import LineNumbers from '~/vue_shared/components/line_numbers.vue';
import waitForPromises from 'helpers/wait_for_promises';
-import * as sourceViewerUtils from '~/vue_shared/components/source_viewer/utils';
+import LineHighlighter from '~/blob/line_highlighter';
+import eventHub from '~/notes/event_hub';
+jest.mock('~/blob/line_highlighter');
jest.mock('highlight.js/lib/core');
Vue.use(VueRouter);
const router = new VueRouter();
+const generateContent = (content, totalLines = 1) => {
+ let generatedContent = '';
+ for (let i = 0; i < totalLines; i += 1) {
+ generatedContent += `Line: ${i + 1} = ${content}\n`;
+ }
+ return generatedContent;
+};
+
+const execImmediately = (callback) => callback();
+
describe('Source Viewer component', () => {
let wrapper;
const language = 'docker';
const mappedLanguage = ROUGE_TO_HLJS_LANGUAGE_MAP[language];
- const content = `// Some source code`;
- const DEFAULT_BLOB_DATA = { language, rawTextBlob: content };
+ const chunk1 = generateContent('// Some source code 1', 70);
+ const chunk2 = generateContent('// Some source code 2', 70);
+ const content = chunk1 + chunk2;
+ const path = 'some/path.js';
+ const DEFAULT_BLOB_DATA = { language, rawTextBlob: content, path };
const highlightedContent = `<span data-testid='test-highlighted' id='LC1'>${content}</span><span id='LC2'></span>`;
const createComponent = async (blob = {}) => {
@@ -29,15 +43,13 @@ describe('Source Viewer component', () => {
await waitForPromises();
};
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
- const findLineNumbers = () => wrapper.findComponent(LineNumbers);
- const findHighlightedContent = () => wrapper.findByTestId('test-highlighted');
- const findFirstLine = () => wrapper.find('#LC1');
+ const findChunks = () => wrapper.findAllComponents(Chunk);
beforeEach(() => {
hljs.highlight.mockImplementation(() => ({ value: highlightedContent }));
hljs.highlightAuto.mockImplementation(() => ({ value: highlightedContent }));
- jest.spyOn(sourceViewerUtils, 'wrapLines');
+ jest.spyOn(window, 'requestIdleCallback').mockImplementation(execImmediately);
+ jest.spyOn(eventHub, '$emit');
return createComponent();
});
@@ -45,6 +57,8 @@ describe('Source Viewer component', () => {
afterEach(() => wrapper.destroy());
describe('highlight.js', () => {
+ beforeEach(() => createComponent({ language: mappedLanguage }));
+
it('registers the language definition', async () => {
const languageDefinition = await import(`highlight.js/lib/languages/${mappedLanguage}`);
@@ -54,72 +68,51 @@ describe('Source Viewer component', () => {
);
});
- it('highlights the content', () => {
- expect(hljs.highlight).toHaveBeenCalledWith(content, { language: mappedLanguage });
+ it('highlights the first chunk', () => {
+ expect(hljs.highlight).toHaveBeenCalledWith(chunk1.trim(), { language: mappedLanguage });
});
describe('auto-detects if a language cannot be loaded', () => {
beforeEach(() => createComponent({ language: 'some_unknown_language' }));
it('highlights the content with auto-detection', () => {
- expect(hljs.highlightAuto).toHaveBeenCalledWith(content);
+ expect(hljs.highlightAuto).toHaveBeenCalledWith(chunk1.trim());
});
});
});
describe('rendering', () => {
- it('renders a loading icon if no highlighted content is available yet', async () => {
- hljs.highlight.mockImplementation(() => ({ value: null }));
- await createComponent();
-
- expect(findLoadingIcon().exists()).toBe(true);
- });
+ it('renders the first chunk', async () => {
+ const firstChunk = findChunks().at(0);
- it('calls the wrapLines helper method with highlightedContent and mappedLanguage', () => {
- expect(sourceViewerUtils.wrapLines).toHaveBeenCalledWith(highlightedContent, mappedLanguage);
- });
-
- it('renders Line Numbers', () => {
- expect(findLineNumbers().props('lines')).toBe(1);
- });
+ expect(firstChunk.props('content')).toContain(chunk1);
- it('renders the highlighted content', () => {
- expect(findHighlightedContent().exists()).toBe(true);
+ expect(firstChunk.props()).toMatchObject({
+ totalLines: 70,
+ startingFrom: 0,
+ });
});
- });
- describe('selecting a line', () => {
- let firstLine;
- let firstLineElement;
+ it('renders the second chunk', async () => {
+ const secondChunk = findChunks().at(1);
- beforeEach(() => {
- firstLine = findFirstLine();
- firstLineElement = firstLine.element;
+ expect(secondChunk.props('content')).toContain(chunk2.trim());
- jest.spyOn(firstLineElement, 'scrollIntoView');
- jest.spyOn(firstLineElement.classList, 'add');
- jest.spyOn(firstLineElement.classList, 'remove');
- });
-
- it('adds the highlight (hll) class', async () => {
- wrapper.vm.$router.push('#LC1');
- await nextTick();
-
- expect(firstLineElement.classList.add).toHaveBeenCalledWith('hll');
+ expect(secondChunk.props()).toMatchObject({
+ totalLines: 70,
+ startingFrom: 70,
+ });
});
+ });
- it('removes the highlight (hll) class from a previously highlighted line', async () => {
- wrapper.vm.$router.push('#LC2');
- await nextTick();
-
- expect(firstLineElement.classList.remove).toHaveBeenCalledWith('hll');
- });
+ it('emits showBlobInteractionZones on the eventHub when chunk appears', () => {
+ findChunks().at(0).vm.$emit('appear');
+ expect(eventHub.$emit).toBeCalledWith('showBlobInteractionZones', path);
+ });
- it('scrolls the line into view', () => {
- expect(firstLineElement.scrollIntoView).toHaveBeenCalledWith({
- behavior: 'smooth',
- block: 'center',
- });
+ describe('LineHighlighter', () => {
+ it('instantiates the lineHighlighter class', async () => {
+ expect(LineHighlighter).toHaveBeenCalledWith({ scrollBehavior: 'auto' });
});
});
});
diff --git a/spec/frontend/vue_shared/components/source_viewer/utils_spec.js b/spec/frontend/vue_shared/components/source_viewer/utils_spec.js
deleted file mode 100644
index 0631e7efd54..00000000000
--- a/spec/frontend/vue_shared/components/source_viewer/utils_spec.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { wrapLines } from '~/vue_shared/components/source_viewer/utils';
-
-describe('Wrap lines', () => {
- it.each`
- content | language | output
- ${'line 1'} | ${'javascript'} | ${'<span id="LC1" lang="javascript" class="line">line 1</span>'}
- ${'line 1\nline 2'} | ${'html'} | ${`<span id="LC1" lang="html" class="line">line 1</span>\n<span id="LC2" lang="html" class="line">line 2</span>`}
- ${'<span class="hljs-code">line 1\nline 2</span>'} | ${'html'} | ${`<span id="LC1" lang="html" class="hljs-code">line 1\n<span id="LC2" lang="html" class="line">line 2</span></span>`}
- ${'<span class="hljs-code">```bash'} | ${'bash'} | ${'<span id="LC1" lang="bash" class="hljs-code">```bash'}
- ${'<span class="hljs-code">```bash'} | ${'valid-language1'} | ${'<span id="LC1" lang="valid-language1" class="hljs-code">```bash'}
- ${'<span class="hljs-code">```bash'} | ${'valid_language2'} | ${'<span id="LC1" lang="valid_language2" class="hljs-code">```bash'}
- `('returns lines wrapped in spans containing line numbers', ({ content, language, output }) => {
- expect(wrapLines(content, language)).toBe(output);
- });
-
- it.each`
- language
- ${'invalidLanguage>'}
- ${'"invalidLanguage"'}
- ${'<invalidLanguage'}
- `('returns lines safely without XSS language is not valid', ({ language }) => {
- expect(wrapLines('<span class="hljs-code">```bash', language)).toBe(
- '<span id="LC1" lang="" class="hljs-code">```bash',
- );
- });
-});
diff --git a/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_new_spec.js b/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_new_spec.js
index f624f84eabd..5e05b54cb8c 100644
--- a/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_new_spec.js
+++ b/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_new_spec.js
@@ -109,19 +109,33 @@ describe('User Avatar Image Component', () => {
default: ['Action!'],
};
- beforeEach(() => {
- wrapper = shallowMount(UserAvatarImage, {
- propsData: PROVIDED_PROPS,
- slots,
+ describe('when `tooltipText` is provided and no default slot', () => {
+ beforeEach(() => {
+ wrapper = shallowMount(UserAvatarImage, {
+ propsData: { ...PROVIDED_PROPS },
+ });
});
- });
- it('renders the tooltip slot', () => {
- expect(wrapper.findComponent(GlTooltip).exists()).toBe(true);
+ it('renders the tooltip with `tooltipText` as content', () => {
+ expect(wrapper.findComponent(GlTooltip).text()).toBe(PROVIDED_PROPS.tooltipText);
+ });
});
- it('renders the tooltip content', () => {
- expect(wrapper.findComponent(GlTooltip).text()).toContain(slots.default[0]);
+ describe('when `tooltipText` and default slot is provided', () => {
+ beforeEach(() => {
+ wrapper = shallowMount(UserAvatarImage, {
+ propsData: { ...PROVIDED_PROPS },
+ slots,
+ });
+ });
+
+ it('does not render `tooltipText` inside the tooltip', () => {
+ expect(wrapper.findComponent(GlTooltip).text()).not.toBe(PROVIDED_PROPS.tooltipText);
+ });
+
+ it('renders the content provided via default slot', () => {
+ expect(wrapper.findComponent(GlTooltip).text()).toContain(slots.default[0]);
+ });
});
});
});
diff --git a/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_old_spec.js b/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_old_spec.js
index 5051b2b9cae..2c1be6ec47e 100644
--- a/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_old_spec.js
+++ b/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_old_spec.js
@@ -90,33 +90,38 @@ describe('User Avatar Image Component', () => {
});
});
- describe('dynamic tooltip content', () => {
- const props = PROVIDED_PROPS;
+ describe('Dynamic tooltip content', () => {
const slots = {
default: ['Action!'],
};
- beforeEach(() => {
- wrapper = shallowMount(UserAvatarImage, {
- propsData: { props },
- slots,
+ describe('when `tooltipText` is provided and no default slot', () => {
+ beforeEach(() => {
+ wrapper = shallowMount(UserAvatarImage, {
+ propsData: { ...PROVIDED_PROPS },
+ });
});
- });
- it('renders the tooltip slot', () => {
- expect(wrapper.findComponent(GlTooltip).exists()).toBe(true);
+ it('renders the tooltip with `tooltipText` as content', () => {
+ expect(wrapper.findComponent(GlTooltip).text()).toBe(PROVIDED_PROPS.tooltipText);
+ });
});
- it('renders the tooltip content', () => {
- expect(wrapper.findComponent(GlTooltip).text()).toContain(slots.default[0]);
- });
+ describe('when `tooltipText` and default slot is provided', () => {
+ beforeEach(() => {
+ wrapper = shallowMount(UserAvatarImage, {
+ propsData: { ...PROVIDED_PROPS },
+ slots,
+ });
+ });
- it('does not render tooltip data attributes on avatar image', () => {
- const avatarImg = wrapper.find('img');
+ it('does not render `tooltipText` inside the tooltip', () => {
+ expect(wrapper.findComponent(GlTooltip).text()).not.toBe(PROVIDED_PROPS.tooltipText);
+ });
- expect(avatarImg.attributes('title')).toBeFalsy();
- expect(avatarImg.attributes('data-placement')).not.toBeDefined();
- expect(avatarImg.attributes('data-container')).not.toBeDefined();
+ it('renders the content provided via default slot', () => {
+ expect(wrapper.findComponent(GlTooltip).text()).toContain(slots.default[0]);
+ });
});
});
});
diff --git a/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js b/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
index 66bb234aef6..20ff0848cff 100644
--- a/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
+++ b/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
@@ -153,4 +153,29 @@ describe('UserAvatarList', () => {
});
});
});
+
+ describe('additional styling for the image', () => {
+ it('should not add CSS class when feature flag `glAvatarForAllUserAvatars` is disabled', () => {
+ factory({
+ propsData: { items: createList(1) },
+ });
+
+ const link = wrapper.findComponent(UserAvatarLink);
+ expect(link.props('imgCssClasses')).not.toBe('gl-mr-3');
+ });
+
+ it('should add CSS class when feature flag `glAvatarForAllUserAvatars` is enabled', () => {
+ factory({
+ propsData: { items: createList(1) },
+ provide: {
+ glFeatures: {
+ glAvatarForAllUserAvatars: true,
+ },
+ },
+ });
+
+ const link = wrapper.findComponent(UserAvatarLink);
+ expect(link.props('imgCssClasses')).toBe('gl-mr-3');
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/user_select_spec.js b/spec/frontend/vue_shared/components/user_select_spec.js
index cb476910944..ec9128d5e38 100644
--- a/spec/frontend/vue_shared/components/user_select_spec.js
+++ b/spec/frontend/vue_shared/components/user_select_spec.js
@@ -16,7 +16,7 @@ import {
searchResponseOnMR,
projectMembersResponse,
participantsQueryResponse,
-} from '../../sidebar/mock_data';
+} from 'jest/sidebar/mock_data';
const assignee = {
id: 'gid://gitlab/User/4',
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 e79935f8fa6..040461f6be4 100644
--- a/spec/frontend/vue_shared/components/web_ide_link_spec.js
+++ b/spec/frontend/vue_shared/components/web_ide_link_spec.js
@@ -261,7 +261,10 @@ describe('Web IDE link component', () => {
});
it('should update local storage when selection changes', async () => {
- expect(findLocalStorageSync().props('value')).toBe(ACTION_WEB_IDE.key);
+ expect(findLocalStorageSync().props()).toMatchObject({
+ asString: true,
+ value: ACTION_WEB_IDE.key,
+ });
findActionsButton().vm.$emit('select', ACTION_GITPOD.key);
diff --git a/spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js b/spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js
index 64823cd4c6c..058cb30c1d5 100644
--- a/spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js
+++ b/spec/frontend/vue_shared/issuable/list/components/issuable_list_root_spec.js
@@ -1,4 +1,9 @@
-import { GlAlert, GlKeysetPagination, GlSkeletonLoading, GlPagination } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlKeysetPagination,
+ GlDeprecatedSkeletonLoading as GlSkeletonLoading,
+ GlPagination,
+} from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import VueDraggable from 'vuedraggable';
diff --git a/spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js b/spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js
index 6af07273cf6..46bfd7eceb1 100644
--- a/spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js
+++ b/spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js
@@ -26,8 +26,8 @@ describe('sast report actions', () => {
});
describe('setDiffEndpoint', () => {
- it(`should commit ${types.SET_DIFF_ENDPOINT} with the correct path`, (done) => {
- testAction(
+ it(`should commit ${types.SET_DIFF_ENDPOINT} with the correct path`, () => {
+ return testAction(
actions.setDiffEndpoint,
diffEndpoint,
state,
@@ -38,20 +38,19 @@ describe('sast report actions', () => {
},
],
[],
- done,
);
});
});
describe('requestDiff', () => {
- it(`should commit ${types.REQUEST_DIFF}`, (done) => {
- testAction(actions.requestDiff, {}, state, [{ type: types.REQUEST_DIFF }], [], done);
+ it(`should commit ${types.REQUEST_DIFF}`, () => {
+ return testAction(actions.requestDiff, {}, state, [{ type: types.REQUEST_DIFF }], []);
});
});
describe('receiveDiffSuccess', () => {
- it(`should commit ${types.RECEIVE_DIFF_SUCCESS} with the correct response`, (done) => {
- testAction(
+ it(`should commit ${types.RECEIVE_DIFF_SUCCESS} with the correct response`, () => {
+ return testAction(
actions.receiveDiffSuccess,
reports,
state,
@@ -62,14 +61,13 @@ describe('sast report actions', () => {
},
],
[],
- done,
);
});
});
describe('receiveDiffError', () => {
- it(`should commit ${types.RECEIVE_DIFF_ERROR} with the correct response`, (done) => {
- testAction(
+ it(`should commit ${types.RECEIVE_DIFF_ERROR} with the correct response`, () => {
+ return testAction(
actions.receiveDiffError,
error,
state,
@@ -80,7 +78,6 @@ describe('sast report actions', () => {
},
],
[],
- done,
);
});
});
@@ -107,9 +104,9 @@ describe('sast report actions', () => {
.replyOnce(200, reports.enrichData);
});
- it('should dispatch the `receiveDiffSuccess` action', (done) => {
+ it('should dispatch the `receiveDiffSuccess` action', () => {
const { diff, enrichData } = reports;
- testAction(
+ return testAction(
actions.fetchDiff,
{},
{ ...rootState, ...state },
@@ -124,7 +121,6 @@ describe('sast report actions', () => {
},
},
],
- done,
);
});
});
@@ -135,10 +131,10 @@ describe('sast report actions', () => {
mock.onGet(diffEndpoint).replyOnce(200, reports.diff);
});
- it('should dispatch the `receiveDiffSuccess` action with empty enrich data', (done) => {
+ it('should dispatch the `receiveDiffSuccess` action with empty enrich data', () => {
const { diff } = reports;
const enrichData = [];
- testAction(
+ return testAction(
actions.fetchDiff,
{},
{ ...rootState, ...state },
@@ -153,7 +149,6 @@ describe('sast report actions', () => {
},
},
],
- done,
);
});
});
@@ -167,14 +162,13 @@ describe('sast report actions', () => {
.replyOnce(404);
});
- it('should dispatch the `receiveError` action', (done) => {
- testAction(
+ it('should dispatch the `receiveError` action', () => {
+ return testAction(
actions.fetchDiff,
{},
{ ...rootState, ...state },
[],
[{ type: 'requestDiff' }, { type: 'receiveDiffError' }],
- done,
);
});
});
@@ -188,14 +182,13 @@ describe('sast report actions', () => {
.replyOnce(200, reports.enrichData);
});
- it('should dispatch the `receiveDiffError` action', (done) => {
- testAction(
+ it('should dispatch the `receiveDiffError` action', () => {
+ return testAction(
actions.fetchDiff,
{},
{ ...rootState, ...state },
[],
[{ type: 'requestDiff' }, { type: 'receiveDiffError' }],
- done,
);
});
});
diff --git a/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js b/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js
index d22fee864e7..4f4f653bb72 100644
--- a/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js
+++ b/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js
@@ -26,8 +26,8 @@ describe('secret detection report actions', () => {
});
describe('setDiffEndpoint', () => {
- it(`should commit ${types.SET_DIFF_ENDPOINT} with the correct path`, (done) => {
- testAction(
+ it(`should commit ${types.SET_DIFF_ENDPOINT} with the correct path`, () => {
+ return testAction(
actions.setDiffEndpoint,
diffEndpoint,
state,
@@ -38,20 +38,19 @@ describe('secret detection report actions', () => {
},
],
[],
- done,
);
});
});
describe('requestDiff', () => {
- it(`should commit ${types.REQUEST_DIFF}`, (done) => {
- testAction(actions.requestDiff, {}, state, [{ type: types.REQUEST_DIFF }], [], done);
+ it(`should commit ${types.REQUEST_DIFF}`, () => {
+ return testAction(actions.requestDiff, {}, state, [{ type: types.REQUEST_DIFF }], []);
});
});
describe('receiveDiffSuccess', () => {
- it(`should commit ${types.RECEIVE_DIFF_SUCCESS} with the correct response`, (done) => {
- testAction(
+ it(`should commit ${types.RECEIVE_DIFF_SUCCESS} with the correct response`, () => {
+ return testAction(
actions.receiveDiffSuccess,
reports,
state,
@@ -62,14 +61,13 @@ describe('secret detection report actions', () => {
},
],
[],
- done,
);
});
});
describe('receiveDiffError', () => {
- it(`should commit ${types.RECEIVE_DIFF_ERROR} with the correct response`, (done) => {
- testAction(
+ it(`should commit ${types.RECEIVE_DIFF_ERROR} with the correct response`, () => {
+ return testAction(
actions.receiveDiffError,
error,
state,
@@ -80,7 +78,6 @@ describe('secret detection report actions', () => {
},
],
[],
- done,
);
});
});
@@ -107,9 +104,10 @@ describe('secret detection report actions', () => {
.replyOnce(200, reports.enrichData);
});
- it('should dispatch the `receiveDiffSuccess` action', (done) => {
+ it('should dispatch the `receiveDiffSuccess` action', () => {
const { diff, enrichData } = reports;
- testAction(
+
+ return testAction(
actions.fetchDiff,
{},
{ ...rootState, ...state },
@@ -124,7 +122,6 @@ describe('secret detection report actions', () => {
},
},
],
- done,
);
});
});
@@ -135,10 +132,10 @@ describe('secret detection report actions', () => {
mock.onGet(diffEndpoint).replyOnce(200, reports.diff);
});
- it('should dispatch the `receiveDiffSuccess` action with empty enrich data', (done) => {
+ it('should dispatch the `receiveDiffSuccess` action with empty enrich data', () => {
const { diff } = reports;
const enrichData = [];
- testAction(
+ return testAction(
actions.fetchDiff,
{},
{ ...rootState, ...state },
@@ -153,7 +150,6 @@ describe('secret detection report actions', () => {
},
},
],
- done,
);
});
});
@@ -167,14 +163,13 @@ describe('secret detection report actions', () => {
.replyOnce(404);
});
- it('should dispatch the `receiveDiffError` action', (done) => {
- testAction(
+ it('should dispatch the `receiveDiffError` action', () => {
+ return testAction(
actions.fetchDiff,
{},
{ ...rootState, ...state },
[],
[{ type: 'requestDiff' }, { type: 'receiveDiffError' }],
- done,
);
});
});
@@ -188,14 +183,13 @@ describe('secret detection report actions', () => {
.replyOnce(200, reports.enrichData);
});
- it('should dispatch the `receiveDiffError` action', (done) => {
- testAction(
+ it('should dispatch the `receiveDiffError` action', () => {
+ return testAction(
actions.fetchDiff,
{},
{ ...rootState, ...state },
[],
[{ type: 'requestDiff' }, { type: 'receiveDiffError' }],
- done,
);
});
});
diff --git a/spec/frontend/vuex_shared/modules/modal/actions_spec.js b/spec/frontend/vuex_shared/modules/modal/actions_spec.js
index c151049df2d..928ed7d0d5f 100644
--- a/spec/frontend/vuex_shared/modules/modal/actions_spec.js
+++ b/spec/frontend/vuex_shared/modules/modal/actions_spec.js
@@ -4,28 +4,28 @@ import * as types from '~/vuex_shared/modules/modal/mutation_types';
describe('Vuex ModalModule actions', () => {
describe('open', () => {
- it('works', (done) => {
+ it('works', () => {
const data = { id: 7 };
- testAction(actions.open, data, {}, [{ type: types.OPEN, payload: data }], [], done);
+ return testAction(actions.open, data, {}, [{ type: types.OPEN, payload: data }], []);
});
});
describe('close', () => {
- it('works', (done) => {
- testAction(actions.close, null, {}, [{ type: types.CLOSE }], [], done);
+ it('works', () => {
+ return testAction(actions.close, null, {}, [{ type: types.CLOSE }], []);
});
});
describe('show', () => {
- it('works', (done) => {
- testAction(actions.show, null, {}, [{ type: types.SHOW }], [], done);
+ it('works', () => {
+ return testAction(actions.show, null, {}, [{ type: types.SHOW }], []);
});
});
describe('hide', () => {
- it('works', (done) => {
- testAction(actions.hide, null, {}, [{ type: types.HIDE }], [], done);
+ it('works', () => {
+ return testAction(actions.hide, null, {}, [{ type: types.HIDE }], []);
});
});
});
diff --git a/spec/frontend/work_items/components/item_title_spec.js b/spec/frontend/work_items/components/item_title_spec.js
index 0f6e7091c59..0d85df25b4f 100644
--- a/spec/frontend/work_items/components/item_title_spec.js
+++ b/spec/frontend/work_items/components/item_title_spec.js
@@ -4,10 +4,10 @@ import ItemTitle from '~/work_items/components/item_title.vue';
jest.mock('lodash/escape', () => jest.fn((fn) => fn));
-const createComponent = ({ initialTitle = 'Sample title', disabled = false } = {}) =>
+const createComponent = ({ title = 'Sample title', disabled = false } = {}) =>
shallowMount(ItemTitle, {
propsData: {
- initialTitle,
+ title,
disabled,
},
});
diff --git a/spec/frontend/work_items/components/work_item_actions_spec.js b/spec/frontend/work_items/components/work_item_actions_spec.js
new file mode 100644
index 00000000000..d0e9cfee353
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_actions_spec.js
@@ -0,0 +1,103 @@
+import { GlDropdownItem, GlModal } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import waitForPromises from 'helpers/wait_for_promises';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import WorkItemActions from '~/work_items/components/work_item_actions.vue';
+import deleteWorkItem from '~/work_items/graphql/delete_work_item.mutation.graphql';
+import { deleteWorkItemResponse, deleteWorkItemFailureResponse } from '../mock_data';
+
+describe('WorkItemActions component', () => {
+ let wrapper;
+ let glModalDirective;
+
+ Vue.use(VueApollo);
+
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findDeleteButton = () => wrapper.findComponent(GlDropdownItem);
+
+ const createComponent = ({
+ canUpdate = true,
+ deleteWorkItemHandler = jest.fn().mockResolvedValue(deleteWorkItemResponse),
+ } = {}) => {
+ glModalDirective = jest.fn();
+ wrapper = shallowMount(WorkItemActions, {
+ apolloProvider: createMockApollo([[deleteWorkItem, deleteWorkItemHandler]]),
+ propsData: { workItemId: '123', canUpdate },
+ directives: {
+ glModal: {
+ bind(_, { value }) {
+ glModalDirective(value);
+ },
+ },
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders modal', () => {
+ createComponent();
+
+ expect(findModal().exists()).toBe(true);
+ expect(findModal().props('visible')).toBe(false);
+ });
+
+ it('shows confirm modal when clicking Delete work item', () => {
+ createComponent();
+
+ findDeleteButton().vm.$emit('click');
+
+ expect(glModalDirective).toHaveBeenCalled();
+ });
+
+ it('calls delete mutation when clicking OK button', () => {
+ const deleteWorkItemHandler = jest.fn().mockResolvedValue(deleteWorkItemResponse);
+
+ createComponent({
+ deleteWorkItemHandler,
+ });
+
+ findModal().vm.$emit('ok');
+
+ expect(deleteWorkItemHandler).toHaveBeenCalled();
+ expect(wrapper.emitted('error')).toBeUndefined();
+ });
+
+ it('emits event after delete success', async () => {
+ createComponent();
+
+ findModal().vm.$emit('ok');
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('workItemDeleted')).not.toBeUndefined();
+ expect(wrapper.emitted('error')).toBeUndefined();
+ });
+
+ it('emits error event after delete failure', async () => {
+ createComponent({
+ deleteWorkItemHandler: jest.fn().mockResolvedValue(deleteWorkItemFailureResponse),
+ });
+
+ findModal().vm.$emit('ok');
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')[0]).toEqual([
+ "The resource that you are attempting to access does not exist or you don't have permission to perform this action",
+ ]);
+ expect(wrapper.emitted('workItemDeleted')).toBeUndefined();
+ });
+
+ it('does not render when canUpdate is false', () => {
+ createComponent({
+ canUpdate: false,
+ });
+
+ expect(wrapper.html()).toBe('');
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_detail_modal_spec.js b/spec/frontend/work_items/components/work_item_detail_modal_spec.js
new file mode 100644
index 00000000000..9f35ccb853b
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_detail_modal_spec.js
@@ -0,0 +1,58 @@
+import { GlModal } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import WorkItemDetail from '~/work_items/components/work_item_detail.vue';
+import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
+import WorkItemActions from '~/work_items/components/work_item_actions.vue';
+
+describe('WorkItemDetailModal component', () => {
+ let wrapper;
+
+ Vue.use(VueApollo);
+
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findWorkItemActions = () => wrapper.findComponent(WorkItemActions);
+ const findWorkItemDetail = () => wrapper.findComponent(WorkItemDetail);
+
+ const createComponent = ({ visible = true, workItemId = '1', canUpdate = false } = {}) => {
+ wrapper = shallowMount(WorkItemDetailModal, {
+ propsData: { visible, workItemId, canUpdate },
+ stubs: {
+ GlModal,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe.each([true, false])('when visible=%s', (visible) => {
+ it(`${visible ? 'renders' : 'does not render'} modal`, () => {
+ createComponent({ visible });
+
+ expect(findModal().props('visible')).toBe(visible);
+ });
+ });
+
+ it('renders heading', () => {
+ createComponent();
+
+ expect(wrapper.find('h2').text()).toBe('Work Item');
+ });
+
+ it('renders WorkItemDetail', () => {
+ createComponent();
+
+ expect(findWorkItemDetail().props()).toEqual({ workItemId: '1' });
+ });
+
+ it('shows work item actions', () => {
+ createComponent({
+ canUpdate: true,
+ });
+
+ expect(findWorkItemActions().exists()).toBe(true);
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_detail_spec.js b/spec/frontend/work_items/components/work_item_detail_spec.js
deleted file mode 100644
index 305f43ad8ba..00000000000
--- a/spec/frontend/work_items/components/work_item_detail_spec.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import { GlModal } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import WorkItemTitle from '~/work_items/components/item_title.vue';
-import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
-import { resolvers } from '~/work_items/graphql/resolvers';
-
-describe('WorkItemDetailModal component', () => {
- let wrapper;
-
- Vue.use(VueApollo);
-
- const findModal = () => wrapper.findComponent(GlModal);
- const findWorkItemTitle = () => wrapper.findComponent(WorkItemTitle);
-
- const createComponent = () => {
- wrapper = shallowMount(WorkItemDetailModal, {
- apolloProvider: createMockApollo([], resolvers),
- propsData: { visible: true },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders modal', () => {
- createComponent();
-
- expect(findModal().props()).toMatchObject({ visible: true });
- });
-
- it('renders work item title', () => {
- createComponent();
-
- expect(findWorkItemTitle().exists()).toBe(true);
- });
-});
diff --git a/spec/frontend/work_items/components/work_item_title_spec.js b/spec/frontend/work_items/components/work_item_title_spec.js
new file mode 100644
index 00000000000..9b1ef2d14e4
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_title_spec.js
@@ -0,0 +1,117 @@
+import { GlLoadingIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { mockTracking } from 'helpers/tracking_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import ItemTitle from '~/work_items/components/item_title.vue';
+import WorkItemTitle from '~/work_items/components/work_item_title.vue';
+import { i18n } from '~/work_items/constants';
+import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
+import { updateWorkItemMutationResponse, workItemQueryResponse } from '../mock_data';
+
+describe('WorkItemTitle component', () => {
+ let wrapper;
+
+ Vue.use(VueApollo);
+
+ const mutationSuccessHandler = jest.fn().mockResolvedValue(updateWorkItemMutationResponse);
+
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findItemTitle = () => wrapper.findComponent(ItemTitle);
+
+ const createComponent = ({ loading = false, mutationHandler = mutationSuccessHandler } = {}) => {
+ const { id, title, workItemType } = workItemQueryResponse.data.workItem;
+ wrapper = shallowMount(WorkItemTitle, {
+ apolloProvider: createMockApollo([[updateWorkItemMutation, mutationHandler]]),
+ propsData: {
+ loading,
+ workItemId: id,
+ workItemTitle: title,
+ workItemType: workItemType.name,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when loading', () => {
+ beforeEach(() => {
+ createComponent({ loading: true });
+ });
+
+ it('renders loading spinner', () => {
+ expect(findLoadingIcon().exists()).toBe(true);
+ });
+
+ it('does not render title', () => {
+ expect(findItemTitle().exists()).toBe(false);
+ });
+ });
+
+ describe('when loaded', () => {
+ beforeEach(() => {
+ createComponent({ loading: false });
+ });
+
+ it('does not render loading spinner', () => {
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+
+ it('renders title', () => {
+ expect(findItemTitle().props('title')).toBe(workItemQueryResponse.data.workItem.title);
+ });
+ });
+
+ describe('when updating the title', () => {
+ it('calls a mutation', () => {
+ const title = 'new title!';
+
+ createComponent();
+
+ findItemTitle().vm.$emit('title-changed', title);
+
+ expect(mutationSuccessHandler).toHaveBeenCalledWith({
+ input: {
+ id: workItemQueryResponse.data.workItem.id,
+ title,
+ },
+ });
+ });
+
+ it('does not call a mutation when the title has not changed', () => {
+ createComponent();
+
+ findItemTitle().vm.$emit('title-changed', workItemQueryResponse.data.workItem.title);
+
+ expect(mutationSuccessHandler).not.toHaveBeenCalled();
+ });
+
+ it('emits an error message when the mutation was unsuccessful', async () => {
+ createComponent({ mutationHandler: jest.fn().mockRejectedValue('Error!') });
+
+ findItemTitle().vm.$emit('title-changed', 'new title');
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[i18n.updateError]]);
+ });
+
+ it('tracks editing the title', async () => {
+ const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+
+ createComponent();
+
+ findItemTitle().vm.$emit('title-changed', 'new title');
+ await waitForPromises();
+
+ expect(trackingSpy).toHaveBeenCalledWith('workItems:show', 'updated_title', {
+ category: 'workItems:show',
+ label: 'item_title',
+ property: 'type_Task',
+ });
+ });
+ });
+});
diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js
index 832795fc4ac..722e1708c15 100644
--- a/spec/frontend/work_items/mock_data.js
+++ b/spec/frontend/work_items/mock_data.js
@@ -1,21 +1,14 @@
export const workItemQueryResponse = {
- workItem: {
- __typename: 'WorkItem',
- id: '1',
- title: 'Test',
- workItemType: {
- __typename: 'WorkItemType',
- id: 'work-item-type-1',
- },
- widgets: {
- __typename: 'LocalWorkItemWidgetConnection',
- nodes: [
- {
- __typename: 'LocalTitleWidget',
- type: 'TITLE',
- contentText: 'Test',
- },
- ],
+ data: {
+ workItem: {
+ __typename: 'WorkItem',
+ id: 'gid://gitlab/WorkItem/1',
+ title: 'Test',
+ workItemType: {
+ __typename: 'WorkItemType',
+ id: 'gid://gitlab/WorkItems::Type/5',
+ name: 'Task',
+ },
},
},
};
@@ -23,25 +16,15 @@ export const workItemQueryResponse = {
export const updateWorkItemMutationResponse = {
data: {
workItemUpdate: {
- __typename: 'LocalUpdateWorkItemPayload',
+ __typename: 'WorkItemUpdatePayload',
workItem: {
- __typename: 'LocalWorkItem',
- id: '1',
+ __typename: 'WorkItem',
+ id: 'gid://gitlab/WorkItem/1',
title: 'Updated title',
workItemType: {
__typename: 'WorkItemType',
- id: 'work-item-type-1',
- },
- widgets: {
- __typename: 'LocalWorkItemWidgetConnection',
- nodes: [
- {
- __typename: 'LocalTitleWidget',
- type: 'TITLE',
- enabled: true,
- contentText: 'Updated title',
- },
- ],
+ id: 'gid://gitlab/WorkItems::Type/5',
+ name: 'Task',
},
},
},
@@ -51,11 +34,11 @@ export const updateWorkItemMutationResponse = {
export const projectWorkItemTypesQueryResponse = {
data: {
workspace: {
- id: '1',
+ id: 'gid://gitlab/WorkItem/1',
workItemTypes: {
nodes: [
- { id: 'work-item-1', name: 'Issue' },
- { id: 'work-item-2', name: 'Incident' },
+ { id: 'gid://gitlab/WorkItems::Type/1', name: 'Issue' },
+ { id: 'gid://gitlab/WorkItems::Type/2', name: 'Incident' },
],
},
},
@@ -68,13 +51,53 @@ export const createWorkItemMutationResponse = {
__typename: 'WorkItemCreatePayload',
workItem: {
__typename: 'WorkItem',
- id: '1',
+ id: 'gid://gitlab/WorkItem/1',
title: 'Updated title',
workItemType: {
__typename: 'WorkItemType',
- id: 'work-item-type-1',
+ id: 'gid://gitlab/WorkItems::Type/5',
+ name: 'Task',
},
},
},
},
};
+
+export const createWorkItemFromTaskMutationResponse = {
+ data: {
+ workItemCreateFromTask: {
+ __typename: 'WorkItemCreateFromTaskPayload',
+ errors: [],
+ workItem: {
+ descriptionHtml: '<p>New description</p>',
+ id: 'gid://gitlab/WorkItem/13',
+ __typename: 'WorkItem',
+ },
+ },
+ },
+};
+
+export const deleteWorkItemResponse = {
+ data: { workItemDelete: { errors: [], __typename: 'WorkItemDeletePayload' } },
+};
+
+export const deleteWorkItemFailureResponse = {
+ data: { workItemDelete: null },
+ errors: [
+ {
+ message:
+ "The resource that you are attempting to access does not exist or you don't have permission to perform this action",
+ locations: [{ line: 2, column: 3 }],
+ path: ['workItemDelete'],
+ },
+ ],
+};
+
+export const workItemTitleSubscriptionResponse = {
+ data: {
+ issuableTitleUpdated: {
+ id: 'gid://gitlab/WorkItem/1',
+ title: 'new title',
+ },
+ },
+};
diff --git a/spec/frontend/work_items/pages/create_work_item_spec.js b/spec/frontend/work_items/pages/create_work_item_spec.js
index 185b05c5191..fb1f1d56356 100644
--- a/spec/frontend/work_items/pages/create_work_item_spec.js
+++ b/spec/frontend/work_items/pages/create_work_item_spec.js
@@ -1,15 +1,19 @@
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
-import { GlAlert, GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlAlert, GlFormSelect } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import CreateWorkItem from '~/work_items/pages/create_work_item.vue';
import ItemTitle from '~/work_items/components/item_title.vue';
-import { resolvers } from '~/work_items/graphql/resolvers';
import projectWorkItemTypesQuery from '~/work_items/graphql/project_work_item_types.query.graphql';
import createWorkItemMutation from '~/work_items/graphql/create_work_item.mutation.graphql';
-import { projectWorkItemTypesQueryResponse, createWorkItemMutationResponse } from '../mock_data';
+import createWorkItemFromTaskMutation from '~/work_items/graphql/create_work_item_from_task.mutation.graphql';
+import {
+ projectWorkItemTypesQueryResponse,
+ createWorkItemMutationResponse,
+ createWorkItemFromTaskMutationResponse,
+} from '../mock_data';
jest.mock('~/lib/utils/uuids', () => ({ uuids: () => ['testuuid'] }));
@@ -20,12 +24,15 @@ describe('Create work item component', () => {
let fakeApollo;
const querySuccessHandler = jest.fn().mockResolvedValue(projectWorkItemTypesQueryResponse);
- const mutationSuccessHandler = jest.fn().mockResolvedValue(createWorkItemMutationResponse);
+ const createWorkItemSuccessHandler = jest.fn().mockResolvedValue(createWorkItemMutationResponse);
+ const createWorkItemFromTaskSuccessHandler = jest
+ .fn()
+ .mockResolvedValue(createWorkItemFromTaskMutationResponse);
+ const errorHandler = jest.fn().mockRejectedValue('Houston, we have a problem');
const findAlert = () => wrapper.findComponent(GlAlert);
const findTitleInput = () => wrapper.findComponent(ItemTitle);
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findSelect = () => wrapper.findComponent(GlFormSelect);
const findCreateButton = () => wrapper.find('[data-testid="create-button"]');
const findCancelButton = () => wrapper.find('[data-testid="cancel-button"]');
@@ -36,15 +43,13 @@ describe('Create work item component', () => {
data = {},
props = {},
queryHandler = querySuccessHandler,
- mutationHandler = mutationSuccessHandler,
+ mutationHandler = createWorkItemSuccessHandler,
} = {}) => {
- fakeApollo = createMockApollo(
- [
- [projectWorkItemTypesQuery, queryHandler],
- [createWorkItemMutation, mutationHandler],
- ],
- resolvers,
- );
+ fakeApollo = createMockApollo([
+ [projectWorkItemTypesQuery, queryHandler],
+ [createWorkItemMutation, mutationHandler],
+ [createWorkItemFromTaskMutation, mutationHandler],
+ ]);
wrapper = shallowMount(CreateWorkItem, {
apolloProvider: fakeApollo,
data() {
@@ -123,6 +128,7 @@ describe('Create work item component', () => {
props: {
isModal: true,
},
+ mutationHandler: createWorkItemFromTaskSuccessHandler,
});
});
@@ -133,14 +139,12 @@ describe('Create work item component', () => {
});
it('emits `onCreate` on successful mutation', async () => {
- const mockTitle = 'Test title';
findTitleInput().vm.$emit('title-input', 'Test title');
wrapper.find('form').trigger('submit');
await waitForPromises();
- const expected = { id: '1', title: mockTitle };
- expect(wrapper.emitted('onCreate')).toEqual([[expected]]);
+ expect(wrapper.emitted('onCreate')).toEqual([['<p>New description</p>']]);
});
it('does not right margin for create button', () => {
@@ -177,16 +181,14 @@ describe('Create work item component', () => {
});
it('displays a list of work item types', () => {
- expect(findDropdownItems()).toHaveLength(2);
- expect(findDropdownItems().at(0).text()).toContain('Issue');
+ expect(findSelect().attributes('options').split(',')).toHaveLength(3);
});
it('selects a work item type on click', async () => {
- expect(findDropdown().props('text')).toBe('Type');
- findDropdownItems().at(0).vm.$emit('click');
+ const mockId = 'work-item-1';
+ findSelect().vm.$emit('input', mockId);
await nextTick();
-
- expect(findDropdown().props('text')).toBe('Issue');
+ expect(findSelect().attributes('value')).toBe(mockId);
});
});
@@ -206,21 +208,36 @@ describe('Create work item component', () => {
createComponent({
props: { initialTitle },
});
- expect(findTitleInput().props('initialTitle')).toBe(initialTitle);
+ expect(findTitleInput().props('title')).toBe(initialTitle);
});
describe('when title input field has a text', () => {
- beforeEach(() => {
+ beforeEach(async () => {
const mockTitle = 'Test title';
createComponent();
+ await waitForPromises();
findTitleInput().vm.$emit('title-input', mockTitle);
});
- it('renders a non-disabled Create button', () => {
+ it('renders a disabled Create button', () => {
+ expect(findCreateButton().props('disabled')).toBe(true);
+ });
+
+ it('renders a non-disabled Create button when work item type is selected', async () => {
+ findSelect().vm.$emit('input', 'work-item-1');
+ await nextTick();
expect(findCreateButton().props('disabled')).toBe(false);
});
+ });
+
+ it('shows an alert on mutation error', async () => {
+ createComponent({ mutationHandler: errorHandler });
+ await waitForPromises();
+ findTitleInput().vm.$emit('title-input', 'some title');
+ findSelect().vm.$emit('input', 'work-item-1');
+ wrapper.find('form').trigger('submit');
+ await waitForPromises();
- // TODO: write a proper test here when we have a backend implementation
- it.todo('shows an alert on mutation error');
+ expect(findAlert().text()).toBe(CreateWorkItem.createErrorText);
});
});
diff --git a/spec/frontend/work_items/pages/work_item_detail_spec.js b/spec/frontend/work_items/pages/work_item_detail_spec.js
new file mode 100644
index 00000000000..1eb6c0145e7
--- /dev/null
+++ b/spec/frontend/work_items/pages/work_item_detail_spec.js
@@ -0,0 +1,99 @@
+import { GlAlert } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import WorkItemDetail from '~/work_items/components/work_item_detail.vue';
+import WorkItemTitle from '~/work_items/components/work_item_title.vue';
+import { i18n } from '~/work_items/constants';
+import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
+import workItemTitleSubscription from '~/work_items/graphql/work_item_title.subscription.graphql';
+import { workItemTitleSubscriptionResponse, workItemQueryResponse } from '../mock_data';
+
+describe('WorkItemDetail component', () => {
+ let wrapper;
+
+ Vue.use(VueApollo);
+
+ const successHandler = jest.fn().mockResolvedValue(workItemQueryResponse);
+ const initialSubscriptionHandler = jest.fn().mockResolvedValue(workItemTitleSubscriptionResponse);
+
+ const findAlert = () => wrapper.findComponent(GlAlert);
+ const findWorkItemTitle = () => wrapper.findComponent(WorkItemTitle);
+
+ const createComponent = ({
+ workItemId = workItemQueryResponse.data.workItem.id,
+ handler = successHandler,
+ subscriptionHandler = initialSubscriptionHandler,
+ } = {}) => {
+ wrapper = shallowMount(WorkItemDetail, {
+ apolloProvider: createMockApollo([
+ [workItemQuery, handler],
+ [workItemTitleSubscription, subscriptionHandler],
+ ]),
+ propsData: { workItemId },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when there is no `workItemId` prop', () => {
+ beforeEach(() => {
+ createComponent({ workItemId: null });
+ });
+
+ it('skips the work item query', () => {
+ expect(successHandler).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('when loading', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders WorkItemTitle in loading state', () => {
+ expect(findWorkItemTitle().props('loading')).toBe(true);
+ });
+ });
+
+ describe('when loaded', () => {
+ beforeEach(() => {
+ createComponent();
+ return waitForPromises();
+ });
+
+ it('does not render WorkItemTitle in loading state', () => {
+ expect(findWorkItemTitle().props('loading')).toBe(false);
+ });
+ });
+
+ it('shows an error message when the work item query was unsuccessful', async () => {
+ const errorHandler = jest.fn().mockRejectedValue('Oops');
+ createComponent({ handler: errorHandler });
+ await waitForPromises();
+
+ expect(errorHandler).toHaveBeenCalled();
+ expect(findAlert().text()).toBe(i18n.fetchError);
+ });
+
+ it('shows an error message when WorkItemTitle emits an `error` event', async () => {
+ createComponent();
+
+ findWorkItemTitle().vm.$emit('error', i18n.updateError);
+ await waitForPromises();
+
+ expect(findAlert().text()).toBe(i18n.updateError);
+ });
+
+ it('calls the subscription', () => {
+ createComponent();
+
+ expect(initialSubscriptionHandler).toHaveBeenCalledWith({
+ issuableId: workItemQueryResponse.data.workItem.id,
+ });
+ });
+});
diff --git a/spec/frontend/work_items/pages/work_item_root_spec.js b/spec/frontend/work_items/pages/work_item_root_spec.js
index 728495e0e23..2803724b9af 100644
--- a/spec/frontend/work_items/pages/work_item_root_spec.js
+++ b/spec/frontend/work_items/pages/work_item_root_spec.js
@@ -1,108 +1,31 @@
-import Vue from 'vue';
import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import waitForPromises from 'helpers/wait_for_promises';
-import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
-import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
-import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
+import WorkItemDetail from '~/work_items/components/work_item_detail.vue';
import WorkItemsRoot from '~/work_items/pages/work_item_root.vue';
-import ItemTitle from '~/work_items/components/item_title.vue';
-import { resolvers } from '~/work_items/graphql/resolvers';
-import { workItemQueryResponse, updateWorkItemMutationResponse } from '../mock_data';
Vue.use(VueApollo);
-const WORK_ITEM_ID = '1';
-const WORK_ITEM_GID = `gid://gitlab/WorkItem/${WORK_ITEM_ID}`;
-
describe('Work items root component', () => {
- const mockUpdatedTitle = 'Updated title';
let wrapper;
- let fakeApollo;
-
- const findTitle = () => wrapper.findComponent(ItemTitle);
- const createComponent = ({ queryResponse = workItemQueryResponse } = {}) => {
- fakeApollo = createMockApollo(
- [[updateWorkItemMutation, jest.fn().mockResolvedValue(updateWorkItemMutationResponse)]],
- resolvers,
- {
- possibleTypes: {
- LocalWorkItemWidget: ['LocalTitleWidget'],
- },
- },
- );
- fakeApollo.clients.defaultClient.cache.writeQuery({
- query: workItemQuery,
- variables: {
- id: WORK_ITEM_GID,
- },
- data: queryResponse,
- });
+ const findWorkItemDetail = () => wrapper.findComponent(WorkItemDetail);
+ const createComponent = () => {
wrapper = shallowMount(WorkItemsRoot, {
propsData: {
- id: WORK_ITEM_ID,
+ id: '1',
},
- apolloProvider: fakeApollo,
});
};
afterEach(() => {
wrapper.destroy();
- fakeApollo = null;
});
- it('renders the title', () => {
+ it('renders WorkItemDetail', () => {
createComponent();
- expect(findTitle().exists()).toBe(true);
- expect(findTitle().props('initialTitle')).toBe('Test');
- });
-
- it('updates the title when it is edited', async () => {
- createComponent();
- jest.spyOn(wrapper.vm.$apollo, 'mutate');
-
- await findTitle().vm.$emit('title-changed', mockUpdatedTitle);
-
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation: updateWorkItemMutation,
- variables: {
- input: {
- id: WORK_ITEM_GID,
- title: mockUpdatedTitle,
- },
- },
- });
- });
-
- describe('tracking', () => {
- let trackingSpy;
-
- beforeEach(() => {
- trackingSpy = mockTracking('_category_', undefined, jest.spyOn);
-
- createComponent();
- });
-
- afterEach(() => {
- unmockTracking();
- });
-
- it('tracks item title updates', async () => {
- await findTitle().vm.$emit('title-changed', mockUpdatedTitle);
-
- await waitForPromises();
-
- expect(trackingSpy).toHaveBeenCalledTimes(1);
- expect(trackingSpy).toHaveBeenCalledWith('workItems:show', undefined, {
- action: 'updated_title',
- category: 'workItems:show',
- label: 'item_title',
- property: '[type_work_item]',
- });
- });
+ expect(findWorkItemDetail().props()).toEqual({ workItemId: 'gid://gitlab/WorkItem/1' });
});
});
diff --git a/spec/frontend/work_items/router_spec.js b/spec/frontend/work_items/router_spec.js
index 8c9054920a8..7e68c5e4f0e 100644
--- a/spec/frontend/work_items/router_spec.js
+++ b/spec/frontend/work_items/router_spec.js
@@ -37,7 +37,7 @@ describe('Work items router', () => {
it('renders work item on `/1` route', async () => {
await createComponent('/1');
- expect(wrapper.find(WorkItemsRoot).exists()).toBe(true);
+ expect(wrapper.findComponent(WorkItemsRoot).exists()).toBe(true);
});
it('renders create work item page on `/new` route', async () => {
diff --git a/spec/frontend_integration/content_editor/content_editor_integration_spec.js b/spec/frontend_integration/content_editor/content_editor_integration_spec.js
new file mode 100644
index 00000000000..1b45c0d43a3
--- /dev/null
+++ b/spec/frontend_integration/content_editor/content_editor_integration_spec.js
@@ -0,0 +1,63 @@
+import { nextTick } from 'vue';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { ContentEditor } from '~/content_editor';
+
+/**
+ * This spec exercises some workflows in the Content Editor without mocking
+ * any component.
+ *
+ */
+describe('content_editor', () => {
+ let wrapper;
+ let renderMarkdown;
+ let contentEditorService;
+
+ const buildWrapper = () => {
+ renderMarkdown = jest.fn();
+ wrapper = mountExtended(ContentEditor, {
+ propsData: {
+ renderMarkdown,
+ uploadsPath: '/',
+ },
+ listeners: {
+ initialized(contentEditor) {
+ contentEditorService = contentEditor;
+ },
+ },
+ });
+ };
+
+ describe('when loading initial content', () => {
+ describe('when the initial content is empty', () => {
+ it('still hides the loading indicator', async () => {
+ buildWrapper();
+
+ renderMarkdown.mockResolvedValue('');
+
+ await contentEditorService.setSerializedContent('');
+ await nextTick();
+
+ expect(wrapper.findByTestId('content-editor-loading-indicator').exists()).toBe(false);
+ });
+ });
+
+ describe('when the initial content is not empty', () => {
+ const initialContent = '<p><strong>bold text</strong></p>';
+ beforeEach(async () => {
+ buildWrapper();
+
+ renderMarkdown.mockResolvedValue(initialContent);
+
+ await contentEditorService.setSerializedContent('**bold text**');
+ await nextTick();
+ });
+ it('hides the loading indicator', async () => {
+ expect(wrapper.findByTestId('content-editor-loading-indicator').exists()).toBe(false);
+ });
+
+ it('displays the initial content', async () => {
+ expect(wrapper.html()).toContain(initialContent);
+ });
+ });
+ });
+});
diff --git a/spec/graphql/graphql_triggers_spec.rb b/spec/graphql/graphql_triggers_spec.rb
index 2d83edca363..84af33a5cb3 100644
--- a/spec/graphql/graphql_triggers_spec.rb
+++ b/spec/graphql/graphql_triggers_spec.rb
@@ -31,4 +31,20 @@ RSpec.describe GraphqlTriggers do
GraphqlTriggers.issuable_title_updated(work_item)
end
end
+
+ describe '.issuable_labels_updated' do
+ it 'triggers the issuableLabelsUpdated subscription' do
+ project = create(:project)
+ labels = create_list(:label, 3, project: project)
+ issue = create(:issue, labels: labels)
+
+ expect(GitlabSchema.subscriptions).to receive(:trigger).with(
+ 'issuableLabelsUpdated',
+ { issuable_id: issue.to_gid },
+ issue
+ )
+
+ GraphqlTriggers.issuable_labels_updated(issue)
+ end
+ end
end
diff --git a/spec/graphql/mutations/ci/runner/delete_spec.rb b/spec/graphql/mutations/ci/runner/delete_spec.rb
index c0f979e43cc..ee640b21918 100644
--- a/spec/graphql/mutations/ci/runner/delete_spec.rb
+++ b/spec/graphql/mutations/ci/runner/delete_spec.rb
@@ -37,7 +37,9 @@ RSpec.describe Mutations::Ci::Runner::Delete do
it 'raises an error' do
mutation_params[:id] = two_projects_runner.to_global_id
- expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ResourceNotAvailable) do
+ subject
+ end
end
end
end
@@ -115,7 +117,10 @@ RSpec.describe Mutations::Ci::Runner::Delete do
allow_next_instance_of(::Ci::Runners::UnregisterRunnerService) do |service|
expect(service).not_to receive(:execute)
end
- expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+
+ expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ResourceNotAvailable) do
+ subject
+ end
end
end
end
diff --git a/spec/graphql/mutations/environments/canary_ingress/update_spec.rb b/spec/graphql/mutations/environments/canary_ingress/update_spec.rb
index 48e55828a6b..fdf9cbaf25b 100644
--- a/spec/graphql/mutations/environments/canary_ingress/update_spec.rb
+++ b/spec/graphql/mutations/environments/canary_ingress/update_spec.rb
@@ -36,6 +36,20 @@ RSpec.describe Mutations::Environments::CanaryIngress::Update do
it 'returns no errors' do
expect(subject[:errors]).to be_empty
end
+
+ context 'with certificate_based_clusters disabled' do
+ before do
+ stub_feature_flags(certificate_based_clusters: false)
+ end
+
+ it 'returns notice about feature removal' do
+ expect(subject[:errors]).to match_array([
+ 'This endpoint was deactivated as part of the certificate-based' \
+ 'kubernetes integration removal. See Epic:' \
+ 'https://gitlab.com/groups/gitlab-org/configure/-/epics/8'
+ ])
+ end
+ end
end
context 'when service encounters a problem' do
diff --git a/spec/graphql/mutations/saved_replies/destroy_spec.rb b/spec/graphql/mutations/saved_replies/destroy_spec.rb
new file mode 100644
index 00000000000..6cff28ec0b2
--- /dev/null
+++ b/spec/graphql/mutations/saved_replies/destroy_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::SavedReplies::Destroy do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:saved_reply) { create(:saved_reply, user: current_user) }
+
+ let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) }
+
+ describe '#resolve' do
+ subject(:resolve) do
+ mutation.resolve(id: saved_reply.to_global_id)
+ end
+
+ context 'when feature is disabled' do
+ before do
+ stub_feature_flags(saved_replies: false)
+ end
+
+ it 'raises Gitlab::Graphql::Errors::ResourceNotAvailable' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature disabled')
+ end
+ end
+
+ context 'when feature is enabled for current user' do
+ before do
+ stub_feature_flags(saved_replies: current_user)
+ end
+
+ context 'when service fails to delete a new saved reply' do
+ before do
+ saved_reply.destroy!
+ end
+
+ it 'raises Gitlab::Graphql::Errors::ResourceNotAvailable' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when service successfully deletes the saved reply' do
+ it { expect(subject[:errors]).to be_empty }
+ end
+ end
+ end
+end
diff --git a/spec/graphql/resolvers/blobs_resolver_spec.rb b/spec/graphql/resolvers/blobs_resolver_spec.rb
index 4b75351147c..a666ed2a9fc 100644
--- a/spec/graphql/resolvers/blobs_resolver_spec.rb
+++ b/spec/graphql/resolvers/blobs_resolver_spec.rb
@@ -75,10 +75,9 @@ RSpec.describe Resolvers::BlobsResolver do
let(:ref) { 'ma:in' }
it 'raises an ArgumentError' do
- expect { resolve_blobs }.to raise_error(
- Gitlab::Graphql::Errors::ArgumentError,
- 'Ref is not valid'
- )
+ expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'Ref is not valid') do
+ resolve_blobs
+ end
end
end
@@ -86,10 +85,9 @@ RSpec.describe Resolvers::BlobsResolver do
let(:ref) { '' }
it 'raises an ArgumentError' do
- expect { resolve_blobs }.to raise_error(
- Gitlab::Graphql::Errors::ArgumentError,
- 'Ref is not valid'
- )
+ expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'Ref is not valid') do
+ resolve_blobs
+ end
end
end
end
diff --git a/spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb b/spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb
index fcf67120b0e..8d0b8f9398d 100644
--- a/spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb
+++ b/spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb
@@ -35,7 +35,9 @@ RSpec.describe Resolvers::GroupMembers::NotificationEmailResolver do
let(:current_user) { create(:user) }
it 'raises ResourceNotAvailable error' do
- expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ResourceNotAvailable) do
+ subject
+ end
end
end
end
diff --git a/spec/graphql/resolvers/issues_resolver_spec.rb b/spec/graphql/resolvers/issues_resolver_spec.rb
index 5e9a3d0a68b..81aeee0a3d2 100644
--- a/spec/graphql/resolvers/issues_resolver_spec.rb
+++ b/spec/graphql/resolvers/issues_resolver_spec.rb
@@ -522,11 +522,53 @@ RSpec.describe Resolvers::IssuesResolver do
end
end
+ context 'when sorting by escalation status' do
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:triggered_incident) { create(:incident, :with_escalation_status, project: project) }
+ let_it_be(:issue_no_status) { create(:issue, project: project) }
+ let_it_be(:resolved_incident) do
+ create(:incident, :with_escalation_status, project: project)
+ .tap { |issue| issue.escalation_status.resolve }
+ end
+
+ it 'sorts issues ascending' do
+ issues = resolve_issues(sort: :escalation_status_asc).to_a
+ expect(issues).to eq([triggered_incident, resolved_incident, issue_no_status])
+ end
+
+ it 'sorts issues descending' do
+ issues = resolve_issues(sort: :escalation_status_desc).to_a
+ expect(issues).to eq([resolved_incident, triggered_incident, issue_no_status])
+ end
+
+ it 'sorts issues created_at' do
+ issues = resolve_issues(sort: :created_desc).to_a
+ expect(issues).to eq([resolved_incident, issue_no_status, triggered_incident])
+ end
+
+ context 'when incident_escalations feature flag is disabled' do
+ before do
+ stub_feature_flags(incident_escalations: false)
+ end
+
+ it 'defaults ascending status sort to created_desc' do
+ issues = resolve_issues(sort: :escalation_status_asc).to_a
+ expect(issues).to eq([resolved_incident, issue_no_status, triggered_incident])
+ end
+
+ it 'defaults descending status sort to created_desc' do
+ issues = resolve_issues(sort: :escalation_status_desc).to_a
+ expect(issues).to eq([resolved_incident, issue_no_status, triggered_incident])
+ end
+ end
+ end
+
context 'when sorting with non-stable cursors' do
%i[priority_asc priority_desc
popularity_asc popularity_desc
label_priority_asc label_priority_desc
- milestone_due_asc milestone_due_desc].each do |sort_by|
+ milestone_due_asc milestone_due_desc
+ escalation_status_asc escalation_status_desc].each do |sort_by|
it "uses offset-pagination when sorting by #{sort_by}" do
resolved = resolve_issues(sort: sort_by)
diff --git a/spec/graphql/resolvers/project_jobs_resolver_spec.rb b/spec/graphql/resolvers/project_jobs_resolver_spec.rb
index 94df2999163..bb711a4c857 100644
--- a/spec/graphql/resolvers/project_jobs_resolver_spec.rb
+++ b/spec/graphql/resolvers/project_jobs_resolver_spec.rb
@@ -9,9 +9,10 @@ RSpec.describe Resolvers::ProjectJobsResolver do
let_it_be(:irrelevant_project) { create(:project, :repository) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
let_it_be(:irrelevant_pipeline) { create(:ci_pipeline, project: irrelevant_project) }
- let_it_be(:build_one) { create(:ci_build, :success, name: 'Build One', pipeline: pipeline) }
- let_it_be(:build_two) { create(:ci_build, :success, name: 'Build Two', pipeline: pipeline) }
- let_it_be(:build_three) { create(:ci_build, :failed, name: 'Build Three', pipeline: pipeline) }
+ let_it_be(:successful_build) { create(:ci_build, :success, name: 'Build One', pipeline: pipeline) }
+ let_it_be(:successful_build_two) { create(:ci_build, :success, name: 'Build Two', pipeline: pipeline) }
+ let_it_be(:failed_build) { create(:ci_build, :failed, name: 'Build Three', pipeline: pipeline) }
+ let_it_be(:pending_build) { create(:ci_build, :pending, name: 'Build Three', pipeline: pipeline) }
let(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline)}
let(:args) { {} }
@@ -28,11 +29,17 @@ RSpec.describe Resolvers::ProjectJobsResolver do
context 'with statuses argument' do
let(:args) { { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('SUCCESS')] } }
- it { is_expected.to contain_exactly(build_one, build_two) }
+ it { is_expected.to contain_exactly(successful_build, successful_build_two) }
+ end
+
+ context 'with multiple statuses' do
+ let(:args) { { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('SUCCESS'), Types::Ci::JobStatusEnum.coerce_isolated_input('FAILED')] } }
+
+ it { is_expected.to contain_exactly(successful_build, successful_build_two, failed_build) }
end
context 'without statuses argument' do
- it { is_expected.to contain_exactly(build_one, build_two, build_three) }
+ it { is_expected.to contain_exactly(successful_build, successful_build_two, failed_build, pending_build) }
end
end
diff --git a/spec/graphql/resolvers/users_resolver_spec.rb b/spec/graphql/resolvers/users_resolver_spec.rb
index b01cc0d43e3..1ba296912a3 100644
--- a/spec/graphql/resolvers/users_resolver_spec.rb
+++ b/spec/graphql/resolvers/users_resolver_spec.rb
@@ -74,7 +74,9 @@ RSpec.describe Resolvers::UsersResolver do
let_it_be(:current_user) { nil }
it 'prohibits search without usernames passed' do
- expect { resolve_users }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ResourceNotAvailable) do
+ resolve_users
+ end
end
it 'allows to search by username' do
diff --git a/spec/graphql/resolvers/work_item_resolver_spec.rb b/spec/graphql/resolvers/work_item_resolver_spec.rb
index c7e2beecb51..bfa0cf1d8a2 100644
--- a/spec/graphql/resolvers/work_item_resolver_spec.rb
+++ b/spec/graphql/resolvers/work_item_resolver_spec.rb
@@ -22,7 +22,9 @@ RSpec.describe Resolvers::WorkItemResolver do
let(:current_user) { create(:user) }
it 'raises a resource not available error' do
- expect { resolved_work_item }.to raise_error(::Gitlab::Graphql::Errors::ResourceNotAvailable)
+ expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ResourceNotAvailable) do
+ resolved_work_item
+ end
end
end
diff --git a/spec/graphql/resolvers/work_items/types_resolver_spec.rb b/spec/graphql/resolvers/work_items/types_resolver_spec.rb
index f7aeed30fd3..868f4566ad6 100644
--- a/spec/graphql/resolvers/work_items/types_resolver_spec.rb
+++ b/spec/graphql/resolvers/work_items/types_resolver_spec.rb
@@ -53,5 +53,15 @@ RSpec.describe Resolvers::WorkItems::TypesResolver do
it_behaves_like 'a work item type resolver'
end
+
+ context 'when parent is not a group or project' do
+ let(:object) { 'not a project/group' }
+
+ it 'returns nil because of feature flag check' do
+ result = resolve(described_class, obj: object, args: {})
+
+ expect(result).to be_nil
+ end
+ end
end
end
diff --git a/spec/graphql/types/base_object_spec.rb b/spec/graphql/types/base_object_spec.rb
index d8f2ef58ea5..45dc885ecba 100644
--- a/spec/graphql/types/base_object_spec.rb
+++ b/spec/graphql/types/base_object_spec.rb
@@ -428,5 +428,25 @@ RSpec.describe Types::BaseObject do
expect(result.dig('data', 'users', 'nodes'))
.to contain_exactly({ 'name' => active_users.first.name })
end
+
+ describe '.authorize' do
+ let_it_be(:read_only_type) do
+ Class.new(described_class) do
+ authorize :read_only
+ end
+ end
+
+ let_it_be(:inherited_read_only_type) { Class.new(read_only_type) }
+
+ it 'keeps track of the specified value' do
+ expect(described_class.authorize).to be_nil
+ expect(read_only_type.authorize).to match_array [:read_only]
+ expect(inherited_read_only_type.authorize).to match_array [:read_only]
+ end
+
+ it 'can not redefine the authorize value' do
+ expect { read_only_type.authorize(:write_only) }.to raise_error('Cannot redefine authorize')
+ end
+ end
end
end
diff --git a/spec/graphql/types/ci/job_kind_enum_spec.rb b/spec/graphql/types/ci/job_kind_enum_spec.rb
new file mode 100644
index 00000000000..b48d20b71e2
--- /dev/null
+++ b/spec/graphql/types/ci/job_kind_enum_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['CiJobKind'] do
+ it 'exposes some job type values' do
+ expect(described_class.values.keys).to match_array(
+ (%w[BRIDGE BUILD])
+ )
+ end
+end
diff --git a/spec/graphql/types/ci/job_type_spec.rb b/spec/graphql/types/ci/job_type_spec.rb
index 47d697ab8b8..655c3636883 100644
--- a/spec/graphql/types/ci/job_type_spec.rb
+++ b/spec/graphql/types/ci/job_type_spec.rb
@@ -21,6 +21,7 @@ RSpec.describe Types::Ci::JobType do
downstreamPipeline
finished_at
id
+ kind
manual_job
name
needs
diff --git a/spec/graphql/types/container_repository_details_type_spec.rb b/spec/graphql/types/container_repository_details_type_spec.rb
index aa770284f89..d94516c6fce 100644
--- a/spec/graphql/types/container_repository_details_type_spec.rb
+++ b/spec/graphql/types/container_repository_details_type_spec.rb
@@ -3,7 +3,9 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['ContainerRepositoryDetails'] do
- fields = %i[id name path location created_at updated_at expiration_policy_started_at status tags_count can_delete expiration_policy_cleanup_status tags size project]
+ fields = %i[id name path location created_at updated_at expiration_policy_started_at
+ status tags_count can_delete expiration_policy_cleanup_status tags size
+ project migration_state]
it { expect(described_class.graphql_name).to eq('ContainerRepositoryDetails') }
diff --git a/spec/graphql/types/container_repository_type_spec.rb b/spec/graphql/types/container_repository_type_spec.rb
index 87e1c11ce19..9815449dd68 100644
--- a/spec/graphql/types/container_repository_type_spec.rb
+++ b/spec/graphql/types/container_repository_type_spec.rb
@@ -3,7 +3,9 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['ContainerRepository'] do
- fields = %i[id name path location created_at updated_at expiration_policy_started_at status tags_count can_delete expiration_policy_cleanup_status project]
+ fields = %i[id name path location created_at updated_at expiration_policy_started_at
+ status tags_count can_delete expiration_policy_cleanup_status project
+ migration_state]
it { expect(described_class.graphql_name).to eq('ContainerRepository') }
diff --git a/spec/graphql/types/dependency_proxy/manifest_type_spec.rb b/spec/graphql/types/dependency_proxy/manifest_type_spec.rb
index b251ca63c4f..f688b085b10 100644
--- a/spec/graphql/types/dependency_proxy/manifest_type_spec.rb
+++ b/spec/graphql/types/dependency_proxy/manifest_type_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['DependencyProxyManifest'] do
it 'includes dependency proxy manifest fields' do
expected_fields = %w[
- id file_name image_name size created_at updated_at digest
+ id file_name image_name size created_at updated_at digest status
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/issue_sort_enum_spec.rb b/spec/graphql/types/issue_sort_enum_spec.rb
index 4433709d193..95184477e75 100644
--- a/spec/graphql/types/issue_sort_enum_spec.rb
+++ b/spec/graphql/types/issue_sort_enum_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe GitlabSchema.types['IssueSort'] do
it 'exposes all the existing issue sort values' do
expect(described_class.values.keys).to include(
- *%w[DUE_DATE_ASC DUE_DATE_DESC RELATIVE_POSITION_ASC SEVERITY_ASC SEVERITY_DESC]
+ *%w[DUE_DATE_ASC DUE_DATE_DESC RELATIVE_POSITION_ASC SEVERITY_ASC SEVERITY_DESC ESCALATION_STATUS_ASC ESCALATION_STATUS_DESC]
)
end
end
diff --git a/spec/graphql/types/range_input_type_spec.rb b/spec/graphql/types/range_input_type_spec.rb
index fc9126247fa..dbfcf4a41c7 100644
--- a/spec/graphql/types/range_input_type_spec.rb
+++ b/spec/graphql/types/range_input_type_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe ::Types::RangeInputType do
it 'follows expected subtyping relationships for instances' do
context = GraphQL::Query::Context.new(
- query: double('query', schema: nil),
+ query: GraphQL::Query.new(GitlabSchema),
values: {},
object: nil
)
diff --git a/spec/graphql/types/repository/blob_type_spec.rb b/spec/graphql/types/repository/blob_type_spec.rb
index a813ef85e6e..787b5f4a311 100644
--- a/spec/graphql/types/repository/blob_type_spec.rb
+++ b/spec/graphql/types/repository/blob_type_spec.rb
@@ -34,7 +34,6 @@ RSpec.describe Types::Repository::BlobType do
:environment_external_url_for_route_map,
:code_navigation_path,
:project_blob_path_root,
- :code_owners,
:simple_viewer,
:rich_viewer,
:plain_data,
@@ -47,6 +46,6 @@ RSpec.describe Types::Repository::BlobType do
:ide_fork_and_edit_path,
:fork_and_view_path,
:language
- )
+ ).at_least
end
end
diff --git a/spec/graphql/types/subscription_type_spec.rb b/spec/graphql/types/subscription_type_spec.rb
index 593795de004..1a2629ed422 100644
--- a/spec/graphql/types/subscription_type_spec.rb
+++ b/spec/graphql/types/subscription_type_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe GitlabSchema.types['Subscription'] do
issuable_assignees_updated
issue_crm_contacts_updated
issuable_title_updated
+ issuable_labels_updated
]
expect(described_class).to have_graphql_fields(*expected_fields).only
diff --git a/spec/haml_lint/linter/documentation_links_spec.rb b/spec/haml_lint/linter/documentation_links_spec.rb
index 75002097d69..f2aab4304c1 100644
--- a/spec/haml_lint/linter/documentation_links_spec.rb
+++ b/spec/haml_lint/linter/documentation_links_spec.rb
@@ -43,6 +43,12 @@ RSpec.describe HamlLint::Linter::DocumentationLinks do
let(:haml) { "= link_to 'Description', #{link_pattern}('wrong.md'), target: '_blank'" }
it { is_expected.to report_lint }
+
+ context 'when haml ends with block definition' do
+ let(:haml) { "= link_to 'Description', #{link_pattern}('wrong.md') do" }
+
+ it { is_expected.to report_lint }
+ end
end
context 'when link with wrong file path is assigned to a variable' do
diff --git a/spec/helpers/admin/background_migrations_helper_spec.rb b/spec/helpers/admin/background_migrations_helper_spec.rb
index 9c1bb0b9c55..e3639ef778e 100644
--- a/spec/helpers/admin/background_migrations_helper_spec.rb
+++ b/spec/helpers/admin/background_migrations_helper_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Admin::BackgroundMigrationsHelper do
describe '#batched_migration_status_badge_variant' do
using RSpec::Parameterized::TableSyntax
- where(:status, :variant) do
+ where(:status_name, :variant) do
:active | :info
:paused | :warning
:failed | :danger
@@ -16,7 +16,7 @@ RSpec.describe Admin::BackgroundMigrationsHelper do
subject { helper.batched_migration_status_badge_variant(migration) }
with_them do
- let(:migration) { build(:batched_background_migration, status: status) }
+ let(:migration) { build(:batched_background_migration, status_name) }
it { is_expected.to eq(variant) }
end
@@ -25,7 +25,7 @@ RSpec.describe Admin::BackgroundMigrationsHelper do
describe '#batched_migration_progress' do
subject { helper.batched_migration_progress(migration, completed_rows) }
- let(:migration) { build(:batched_background_migration, status: :active, total_tuple_count: 100) }
+ let(:migration) { build(:batched_background_migration, :active, total_tuple_count: 100) }
let(:completed_rows) { 25 }
it 'returns completion percentage' do
@@ -33,7 +33,7 @@ RSpec.describe Admin::BackgroundMigrationsHelper do
end
context 'when migration is finished' do
- let(:migration) { build(:batched_background_migration, status: :finished, total_tuple_count: nil) }
+ let(:migration) { build(:batched_background_migration, :finished, total_tuple_count: nil) }
it 'returns 100 percent' do
expect(subject).to eq(100)
@@ -41,7 +41,7 @@ RSpec.describe Admin::BackgroundMigrationsHelper do
end
context 'when total_tuple_count is nil' do
- let(:migration) { build(:batched_background_migration, status: :active, total_tuple_count: nil) }
+ let(:migration) { build(:batched_background_migration, :active, total_tuple_count: nil) }
it 'returns nil' do
expect(subject).to eq(nil)
diff --git a/spec/helpers/application_settings_helper_spec.rb b/spec/helpers/application_settings_helper_spec.rb
index 26d48bef24e..c93762416f5 100644
--- a/spec/helpers/application_settings_helper_spec.rb
+++ b/spec/helpers/application_settings_helper_spec.rb
@@ -149,7 +149,7 @@ RSpec.describe ApplicationSettingsHelper do
end
end
- describe '.storage_weights' do
+ describe '#storage_weights' do
let(:application_setting) { build(:application_setting) }
before do
@@ -158,12 +158,13 @@ RSpec.describe ApplicationSettingsHelper do
stub_application_setting(repository_storages_weighted: { 'default' => 100, 'storage_1' => 50, 'storage_2' => nil })
end
- it 'returns storages correctly' do
- expect(helper.storage_weights).to eq(OpenStruct.new(
- default: 100,
- storage_1: 50,
- storage_2: 0
- ))
+ it 'returns storage objects with assigned weights' do
+ expect(helper.storage_weights)
+ .to have_attributes(
+ default: 100,
+ storage_1: 50,
+ storage_2: 0
+ )
end
end
diff --git a/spec/helpers/boards_helper_spec.rb b/spec/helpers/boards_helper_spec.rb
index ec949fde30e..8d5dc3fb4be 100644
--- a/spec/helpers/boards_helper_spec.rb
+++ b/spec/helpers/boards_helper_spec.rb
@@ -102,6 +102,7 @@ RSpec.describe BoardsHelper do
allow(helper).to receive(:can?).with(user, :create_non_backlog_issues, project_board).and_return(true)
allow(helper).to receive(:can?).with(user, :admin_issue, project_board).and_return(true)
allow(helper).to receive(:can?).with(user, :admin_issue_board_list, project).and_return(false)
+ allow(helper).to receive(:can?).with(user, :admin_issue_board, project).and_return(false)
end
it 'returns a board_lists_path as lists_endpoint' do
@@ -129,12 +130,23 @@ RSpec.describe BoardsHelper do
it 'returns can_admin_list as false by default' do
expect(helper.board_data[:can_admin_list]).to eq('false')
end
- it 'returns can_admin_list as true when user can admin the board' do
+ it 'returns can_admin_list as true when user can admin the board lists' do
allow(helper).to receive(:can?).with(user, :admin_issue_board_list, project).and_return(true)
expect(helper.board_data[:can_admin_list]).to eq('true')
end
end
+
+ context 'can_admin_board' do
+ it 'returns can_admin_board as false by default' do
+ expect(helper.board_data[:can_admin_board]).to eq('false')
+ end
+ it 'returns can_admin_board as true when user can admin the board' do
+ allow(helper).to receive(:can?).with(user, :admin_issue_board, project).and_return(true)
+
+ expect(helper.board_data[:can_admin_board]).to eq('true')
+ end
+ end
end
context 'group board' do
@@ -146,6 +158,7 @@ RSpec.describe BoardsHelper do
allow(helper).to receive(:can?).with(user, :create_non_backlog_issues, group_board).and_return(true)
allow(helper).to receive(:can?).with(user, :admin_issue, group_board).and_return(true)
allow(helper).to receive(:can?).with(user, :admin_issue_board_list, base_group).and_return(false)
+ allow(helper).to receive(:can?).with(user, :admin_issue_board, base_group).and_return(false)
end
it 'returns correct path for base group' do
@@ -165,7 +178,7 @@ RSpec.describe BoardsHelper do
it 'returns can_admin_list as false by default' do
expect(helper.board_data[:can_admin_list]).to eq('false')
end
- it 'returns can_admin_list as true when user can admin the board' do
+ it 'returns can_admin_list as true when user can admin the board lists' do
allow(helper).to receive(:can?).with(user, :admin_issue_board_list, base_group).and_return(true)
expect(helper.board_data[:can_admin_list]).to eq('true')
diff --git a/spec/helpers/broadcast_messages_helper_spec.rb b/spec/helpers/broadcast_messages_helper_spec.rb
index e721a3fdc95..d4021a2eb59 100644
--- a/spec/helpers/broadcast_messages_helper_spec.rb
+++ b/spec/helpers/broadcast_messages_helper_spec.rb
@@ -115,37 +115,8 @@ RSpec.describe BroadcastMessagesHelper do
end
it 'includes the current message' do
- allow(helper).to receive(:broadcast_message_style).and_return(nil)
-
expect(helper.broadcast_message(current_broadcast_message)).to include 'Current Message'
end
-
- it 'includes custom style' do
- allow(helper).to receive(:broadcast_message_style).and_return('foo')
-
- expect(helper.broadcast_message(current_broadcast_message)).to include 'style="foo"'
- end
- end
-
- describe 'broadcast_message_style' do
- it 'defaults to no style' do
- broadcast_message = spy
-
- expect(helper.broadcast_message_style(broadcast_message)).to eq ''
- end
-
- it 'allows custom style for banner messages' do
- broadcast_message = BroadcastMessage.new(color: '#f2dede', font: '#b94a48', broadcast_type: "banner")
-
- expect(helper.broadcast_message_style(broadcast_message))
- .to match('background-color: #f2dede; color: #b94a48')
- end
-
- it 'does not add style for notification messages' do
- broadcast_message = BroadcastMessage.new(color: '#f2dede', broadcast_type: "notification")
-
- expect(helper.broadcast_message_style(broadcast_message)).to eq ''
- end
end
describe 'broadcast_message_status' do
diff --git a/spec/helpers/button_helper_spec.rb b/spec/helpers/button_helper_spec.rb
index 851e13d908f..a7f65aa3134 100644
--- a/spec/helpers/button_helper_spec.rb
+++ b/spec/helpers/button_helper_spec.rb
@@ -164,7 +164,7 @@ RSpec.describe ButtonHelper do
context 'with default options' do
context 'when no `text` attribute is not provided' do
it 'shows copy to clipboard button with default configuration and no text set to copy' do
- expect(element.attr('class')).to eq('btn btn-clipboard btn-transparent')
+ expect(element.attr('class')).to eq('btn btn-clipboard gl-button btn-default-tertiary btn-icon btn-sm')
expect(element.attr('type')).to eq('button')
expect(element.attr('aria-label')).to eq('Copy')
expect(element.attr('aria-live')).to eq('polite')
diff --git a/spec/helpers/ci/pipeline_editor_helper_spec.rb b/spec/helpers/ci/pipeline_editor_helper_spec.rb
index b844cc2e22b..12456deb538 100644
--- a/spec/helpers/ci/pipeline_editor_helper_spec.rb
+++ b/spec/helpers/ci/pipeline_editor_helper_spec.rb
@@ -45,8 +45,8 @@ RSpec.describe Ci::PipelineEditorHelper do
"default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => 'foo',
"initial-branch-name" => nil,
- "lint-help-page-path" => help_page_path('ci/lint', anchor: 'validate-basic-logic-and-syntax'),
- "lint-unavailable-help-page-path" => help_page_path('ci/pipeline_editor/index', anchor: 'configuration-validation-currently-not-available'),
+ "lint-help-page-path" => help_page_path('ci/lint', anchor: 'check-cicd-syntax'),
+ "lint-unavailable-help-page-path" => help_page_path('ci/pipeline_editor/index', anchor: 'configuration-validation-currently-not-available-message'),
"needs-help-page-path" => help_page_path('ci/yaml/index', anchor: 'needs'),
"new-merge-request-path" => '/mock/project/-/merge_requests/new',
"pipeline_etag" => graphql_etag_pipeline_sha_path(project.commit.sha),
@@ -72,8 +72,8 @@ RSpec.describe Ci::PipelineEditorHelper do
"default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => 'foo',
"initial-branch-name" => nil,
- "lint-help-page-path" => help_page_path('ci/lint', anchor: 'validate-basic-logic-and-syntax'),
- "lint-unavailable-help-page-path" => help_page_path('ci/pipeline_editor/index', anchor: 'configuration-validation-currently-not-available'),
+ "lint-help-page-path" => help_page_path('ci/lint', anchor: 'check-cicd-syntax'),
+ "lint-unavailable-help-page-path" => help_page_path('ci/pipeline_editor/index', anchor: 'configuration-validation-currently-not-available-message'),
"needs-help-page-path" => help_page_path('ci/yaml/index', anchor: 'needs'),
"new-merge-request-path" => '/mock/project/-/merge_requests/new',
"pipeline_etag" => '',
diff --git a/spec/helpers/ci/pipelines_helper_spec.rb b/spec/helpers/ci/pipelines_helper_spec.rb
index 2b76eaa87bc..c473e1e4ab6 100644
--- a/spec/helpers/ci/pipelines_helper_spec.rb
+++ b/spec/helpers/ci/pipelines_helper_spec.rb
@@ -151,5 +151,46 @@ RSpec.describe Ci::PipelinesHelper do
end
end
end
+
+ describe 'the `registration_token` attribute' do
+ subject { data[:registration_token] }
+
+ describe 'when the project is eligible for the `ios_specific_templates` experiment' do
+ let_it_be(:project) { create(:project, :auto_devops_disabled) }
+ let_it_be(:user) { create(:user) }
+
+ before do
+ allow(helper).to receive(:current_user).and_return(user)
+ project.add_developer(user)
+ create(:project_setting, project: project, target_platforms: %w(ios))
+ end
+
+ context 'when the `ios_specific_templates` experiment variant is control' do
+ before do
+ stub_experiments(ios_specific_templates: :control)
+ end
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when the `ios_specific_templates` experiment variant is candidate' do
+ before do
+ stub_experiments(ios_specific_templates: :candidate)
+ end
+
+ context 'when the user cannot register project runners' do
+ before do
+ allow(helper).to receive(:can?).with(user, :register_project_runners, project).and_return(false)
+ end
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when the user can register project runners' do
+ it { is_expected.to eq(project.runners_token) }
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/helpers/ci/runners_helper_spec.rb b/spec/helpers/ci/runners_helper_spec.rb
index 832b4da0e20..0046d481282 100644
--- a/spec/helpers/ci/runners_helper_spec.rb
+++ b/spec/helpers/ci/runners_helper_spec.rb
@@ -10,24 +10,31 @@ RSpec.describe Ci::RunnersHelper do
end
describe '#runner_status_icon', :clean_gitlab_redis_cache do
- it "returns - not contacted yet" do
+ it "returns online text" do
+ runner = create(:ci_runner, contacted_at: 1.second.ago)
+ expect(helper.runner_status_icon(runner)).to include("is online")
+ end
+
+ it "returns never contacted" do
runner = create(:ci_runner)
- expect(helper.runner_status_icon(runner)).to include("not contacted yet")
+ expect(helper.runner_status_icon(runner)).to include("never contacted")
end
it "returns offline text" do
- runner = create(:ci_runner, contacted_at: 1.day.ago, active: true)
- expect(helper.runner_status_icon(runner)).to include("Runner is offline")
+ runner = create(:ci_runner, contacted_at: 1.day.ago)
+ expect(helper.runner_status_icon(runner)).to include("is offline")
end
- it "returns online text" do
- runner = create(:ci_runner, contacted_at: 1.second.ago, active: true)
- expect(helper.runner_status_icon(runner)).to include("Runner is online")
+ it "returns stale text" do
+ runner = create(:ci_runner, created_at: 4.months.ago, contacted_at: 4.months.ago)
+ expect(helper.runner_status_icon(runner)).to include("is stale")
+ expect(helper.runner_status_icon(runner)).to include("last contact was")
end
- it "returns paused text" do
- runner = create(:ci_runner, contacted_at: 1.second.ago, active: false)
- expect(helper.runner_status_icon(runner)).to include("Runner is paused")
+ it "returns stale text, when runner never contacted" do
+ runner = create(:ci_runner, created_at: 4.months.ago)
+ expect(helper.runner_status_icon(runner)).to include("is stale")
+ expect(helper.runner_status_icon(runner)).to include("never contacted")
end
end
@@ -79,7 +86,9 @@ RSpec.describe Ci::RunnersHelper do
it 'returns the data in format' do
expect(helper.admin_runners_data_attributes).to eq({
runner_install_help_page: 'https://docs.gitlab.com/runner/install/',
- registration_token: Gitlab::CurrentSettings.runners_registration_token
+ registration_token: Gitlab::CurrentSettings.runners_registration_token,
+ online_contact_timeout_secs: 7200,
+ stale_timeout_secs: 7889238
})
end
end
@@ -121,12 +130,14 @@ RSpec.describe Ci::RunnersHelper do
let(:group) { create(:group) }
it 'returns group data to render a runner list' do
- data = helper.group_runners_data_attributes(group)
-
- expect(data[:registration_token]).to eq(group.runners_token)
- expect(data[:group_id]).to eq(group.id)
- expect(data[:group_full_path]).to eq(group.full_path)
- expect(data[:runner_install_help_page]).to eq('https://docs.gitlab.com/runner/install/')
+ expect(helper.group_runners_data_attributes(group)).to eq({
+ registration_token: group.runners_token,
+ group_id: group.id,
+ group_full_path: group.full_path,
+ runner_install_help_page: 'https://docs.gitlab.com/runner/install/',
+ online_contact_timeout_secs: 7200,
+ stale_timeout_secs: 7889238
+ })
end
end
diff --git a/spec/helpers/clusters_helper_spec.rb b/spec/helpers/clusters_helper_spec.rb
index 53d33f2875f..4feb9d1a2cd 100644
--- a/spec/helpers/clusters_helper_spec.rb
+++ b/spec/helpers/clusters_helper_spec.rb
@@ -74,6 +74,10 @@ RSpec.describe ClustersHelper do
expect(subject[:add_cluster_path]).to eq("#{project_path(project)}/-/clusters/connect")
end
+ it 'displays create cluster path' do
+ expect(subject[:new_cluster_docs_path]).to eq("#{project_path(project)}/-/clusters/new_cluster_docs")
+ end
+
it 'displays project default branch' do
expect(subject[:default_branch_name]).to eq(project.default_branch)
end
diff --git a/spec/helpers/colors_helper_spec.rb b/spec/helpers/colors_helper_spec.rb
new file mode 100644
index 00000000000..ca5cafb7ebe
--- /dev/null
+++ b/spec/helpers/colors_helper_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ColorsHelper do
+ using RSpec::Parameterized::TableSyntax
+
+ describe '#hex_color_to_rgb_array' do
+ context 'valid hex color' do
+ where(:hex_color, :rgb_array) do
+ '#000000' | [0, 0, 0]
+ '#aaaaaa' | [170, 170, 170]
+ '#cCcCcC' | [204, 204, 204]
+ '#FFFFFF' | [255, 255, 255]
+ '#000abc' | [0, 10, 188]
+ '#123456' | [18, 52, 86]
+ '#a1b2c3' | [161, 178, 195]
+ '#000' | [0, 0, 0]
+ '#abc' | [170, 187, 204]
+ '#321' | [51, 34, 17]
+ '#7E2' | [119, 238, 34]
+ '#fFf' | [255, 255, 255]
+ end
+
+ with_them do
+ it 'returns correct RGB array' do
+ expect(helper.hex_color_to_rgb_array(hex_color)).to eq(rgb_array)
+ end
+ end
+ end
+
+ context 'invalid hex color' do
+ where(:hex_color) { ['', '0', '#00', '#ffff', '#1234567', 'invalid', [], 1, nil] }
+
+ with_them do
+ it 'raise ArgumentError' do
+ expect { helper.hex_color_to_rgb_array(hex_color) }.to raise_error(ArgumentError)
+ end
+ end
+ end
+ end
+
+ describe '#rgb_array_to_hex_color' do
+ context 'valid RGB array' do
+ where(:rgb_array, :hex_color) do
+ [0, 0, 0] | '#000000'
+ [0, 0, 255] | '#0000ff'
+ [0, 255, 0] | '#00ff00'
+ [255, 0, 0] | '#ff0000'
+ [12, 34, 56] | '#0c2238'
+ [222, 111, 88] | '#de6f58'
+ [255, 255, 255] | '#ffffff'
+ end
+
+ with_them do
+ it 'returns correct hex color' do
+ expect(helper.rgb_array_to_hex_color(rgb_array)).to eq(hex_color)
+ end
+ end
+ end
+
+ context 'invalid RGB array' do
+ where(:rgb_array) do
+ [
+ '',
+ '#000000',
+ 0,
+ nil,
+ [],
+ [0],
+ [0, 0],
+ [0, 0, 0, 0],
+ [-1, 0, 0],
+ [0, -1, 0],
+ [0, 0, -1],
+ [256, 0, 0],
+ [0, 256, 0],
+ [0, 0, 256]
+ ]
+ end
+
+ with_them do
+ it 'raise ArgumentError' do
+ expect { helper.rgb_array_to_hex_color(rgb_array) }.to raise_error(ArgumentError)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb
index 98db185c180..961e7688202 100644
--- a/spec/helpers/commits_helper_spec.rb
+++ b/spec/helpers/commits_helper_spec.rb
@@ -163,13 +163,7 @@ RSpec.describe CommitsHelper do
end
end
- let(:params) do
- {
- page: page
- }
- end
-
- subject { helper.conditionally_paginate_diff_files(diffs_collection, paginate: paginate, per: Projects::CommitController::COMMIT_DIFFS_PER_PAGE) }
+ subject { helper.conditionally_paginate_diff_files(diffs_collection, paginate: paginate, page: page, per: Projects::CommitController::COMMIT_DIFFS_PER_PAGE) }
before do
allow(helper).to receive(:params).and_return(params)
@@ -183,7 +177,7 @@ RSpec.describe CommitsHelper do
end
it "can change the number of items per page" do
- commits = helper.conditionally_paginate_diff_files(diffs_collection, paginate: paginate, per: 10)
+ commits = helper.conditionally_paginate_diff_files(diffs_collection, page: page, paginate: paginate, per: 10)
expect(commits).to be_an(Array)
expect(commits.size).to eq(10)
diff --git a/spec/helpers/diff_helper_spec.rb b/spec/helpers/diff_helper_spec.rb
index 29708f10de4..84e702cd6a9 100644
--- a/spec/helpers/diff_helper_spec.rb
+++ b/spec/helpers/diff_helper_spec.rb
@@ -290,6 +290,53 @@ RSpec.describe DiffHelper do
end
end
+ describe "#diff_nomappinginraw_line" do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:line) { double("line") }
+ let(:line_type) { 'line_type' }
+
+ before do
+ allow(line).to receive(:rich_text).and_return('line_text')
+ allow(line).to receive(:type).and_return(line_type)
+ end
+
+ it 'generates only single line num' do
+ output = diff_nomappinginraw_line(line, ['line_num_1'], nil, ['line_content'])
+
+ expect(output).to be_html_safe
+ expect(output).to have_css 'td:nth-child(1).line_num_1'
+ expect(output).to have_css 'td:nth-child(2).line_content', text: 'line_text'
+ expect(output).not_to have_css 'td:nth-child(3)'
+ end
+
+ it 'generates only both line nums' do
+ output = diff_nomappinginraw_line(line, ['line_num_1'], ['line_num_2'], ['line_content'])
+
+ expect(output).to be_html_safe
+ expect(output).to have_css 'td:nth-child(1).line_num_1'
+ expect(output).to have_css 'td:nth-child(2).line_num_2'
+ expect(output).to have_css 'td:nth-child(3).line_content', text: 'line_text'
+ end
+
+ where(:line_type, :added_class) do
+ 'old-nomappinginraw' | '.old'
+ 'new-nomappinginraw' | '.new'
+ 'unchanged-nomappinginraw' | ''
+ end
+
+ with_them do
+ it "appends the correct class" do
+ output = diff_nomappinginraw_line(line, ['line_num_1'], ['line_num_2'], ['line_content'])
+
+ expect(output).to be_html_safe
+ expect(output).to have_css 'td:nth-child(1).line_num_1' + added_class
+ expect(output).to have_css 'td:nth-child(2).line_num_2' + added_class
+ expect(output).to have_css 'td:nth-child(3).line_content' + added_class, text: 'line_text'
+ end
+ end
+ end
+
describe '#render_overflow_warning?' do
using RSpec::Parameterized::TableSyntax
@@ -378,16 +425,6 @@ RSpec.describe DiffHelper do
end
end
- describe '#diff_file_path_text' do
- it 'returns full path by default' do
- expect(diff_file_path_text(diff_file)).to eq(diff_file.new_path)
- end
-
- it 'returns truncated path' do
- expect(diff_file_path_text(diff_file, max: 10)).to eq("...open.rb")
- end
- end
-
describe "#collapsed_diff_url" do
let(:params) do
{
diff --git a/spec/helpers/environment_helper_spec.rb b/spec/helpers/environment_helper_spec.rb
index 8e5f38cd95a..1fcbcd8c4f9 100644
--- a/spec/helpers/environment_helper_spec.rb
+++ b/spec/helpers/environment_helper_spec.rb
@@ -55,7 +55,7 @@ RSpec.describe EnvironmentHelper do
can_destroy_environment: true,
can_stop_environment: true,
can_admin_environment: true,
- environment_metrics_path: environment_metrics_path(environment),
+ environment_metrics_path: project_metrics_dashboard_path(project, environment: environment),
environments_fetch_path: project_environments_path(project, format: :json),
environment_edit_path: edit_project_environment_path(project, environment),
environment_stop_path: stop_project_environment_path(project, environment),
diff --git a/spec/helpers/environments_helper_spec.rb b/spec/helpers/environments_helper_spec.rb
index 38f06b19b94..52f02fba4ec 100644
--- a/spec/helpers/environments_helper_spec.rb
+++ b/spec/helpers/environments_helper_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe EnvironmentsHelper do
expect(metrics_data).to include(
'settings_path' => edit_project_integration_path(project, 'prometheus'),
'clusters_path' => project_clusters_path(project),
- 'metrics_dashboard_base_path' => environment_metrics_path(environment),
+ 'metrics_dashboard_base_path' => project_metrics_dashboard_path(project, environment: environment),
'current_environment_name' => environment.name,
'documentation_path' => help_page_path('administration/monitoring/prometheus/index.md'),
'add_dashboard_documentation_path' => help_page_path('operations/metrics/dashboards/index.md', anchor: 'add-a-new-dashboard-to-your-project'),
diff --git a/spec/helpers/groups/group_members_helper_spec.rb b/spec/helpers/groups/group_members_helper_spec.rb
index f5bc587bce3..ab11bc1f5fd 100644
--- a/spec/helpers/groups/group_members_helper_spec.rb
+++ b/spec/helpers/groups/group_members_helper_spec.rb
@@ -38,7 +38,9 @@ RSpec.describe Groups::GroupMembersHelper do
shared_group,
members: present_members(members_collection),
invited: present_members(invited),
- access_requests: present_members(access_requests)
+ access_requests: present_members(access_requests),
+ include_relations: [:inherited, :direct],
+ search: nil
)
end
@@ -96,6 +98,64 @@ RSpec.describe Groups::GroupMembersHelper do
it 'sets `member_path` property' do
expect(subject[:group][:member_path]).to eq('/groups/foo-bar/-/group_links/:id')
end
+
+ context 'inherited' do
+ let_it_be(:sub_shared_group) { create(:group, parent: shared_group) }
+ let_it_be(:sub_shared_with_group) { create(:group) }
+ let_it_be(:sub_group_group_link) { create(:group_group_link, shared_group: sub_shared_group, shared_with_group: sub_shared_with_group) }
+
+ let_it_be(:subject_group) { sub_shared_group }
+
+ before do
+ allow(helper).to receive(:group_group_member_path).with(sub_shared_group, ':id').and_return('/groups/foo-bar/-/group_members/:id')
+ allow(helper).to receive(:group_group_link_path).with(sub_shared_group, ':id').and_return('/groups/foo-bar/-/group_links/:id')
+ allow(helper).to receive(:can?).with(current_user, :admin_group_member, sub_shared_group).and_return(true)
+ allow(helper).to receive(:can?).with(current_user, :export_group_memberships, sub_shared_group).and_return(true)
+ end
+
+ subject do
+ helper.group_members_app_data(
+ sub_shared_group,
+ members: present_members(members_collection),
+ invited: present_members(invited),
+ access_requests: present_members(access_requests),
+ include_relations: include_relations,
+ search: nil
+ )
+ end
+
+ using RSpec::Parameterized::TableSyntax
+
+ where(:include_relations, :result) do
+ [:inherited, :direct] | lazy { [group_group_link, sub_group_group_link].map(&:id) }
+ [:inherited] | lazy { [group_group_link].map(&:id) }
+ [:direct] | lazy { [sub_group_group_link].map(&:id) }
+ end
+
+ with_them do
+ it 'returns correct group links' do
+ expect(subject[:group][:members].map { |link| link[:id] }).to match_array(result)
+ end
+ end
+
+ context 'when group_member_inherited_group disabled' do
+ before do
+ stub_feature_flags(group_member_inherited_group: false)
+ end
+
+ where(:include_relations, :result) do
+ [:inherited, :direct] | lazy { [sub_group_group_link.id] }
+ [:inherited] | lazy { [sub_group_group_link.id] }
+ [:direct] | lazy { [sub_group_group_link.id] }
+ end
+
+ with_them do
+ it 'always returns direct member links' do
+ expect(subject[:group][:members].map { |link| link[:id] }).to match_array(result)
+ end
+ end
+ end
+ end
end
context 'when pagination is not available' do
diff --git a/spec/helpers/invite_members_helper_spec.rb b/spec/helpers/invite_members_helper_spec.rb
index 796d68e290e..859d145eb53 100644
--- a/spec/helpers/invite_members_helper_spec.rb
+++ b/spec/helpers/invite_members_helper_spec.rb
@@ -19,6 +19,7 @@ RSpec.describe InviteMembersHelper do
it 'has expected common attributes' do
attributes = {
id: project.id,
+ root_id: project.root_ancestor.id,
name: project.name,
default_access_level: Gitlab::Access::GUEST,
invalid_groups: project.related_group_ids,
@@ -35,6 +36,7 @@ RSpec.describe InviteMembersHelper do
it 'has expected common attributes' do
attributes = {
id: project.id,
+ root_id: project.root_ancestor.id,
name: project.name,
default_access_level: Gitlab::Access::GUEST
}
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index ed50a4daae8..ee5b0145d13 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -288,7 +288,7 @@ RSpec.describe IssuablesHelper do
canUpdate: true,
canDestroy: true,
issuableRef: "##{issue.iid}",
- markdownPreviewPath: "/#{@project.full_path}/preview_markdown",
+ markdownPreviewPath: "/#{@project.full_path}/preview_markdown?target_id=#{issue.iid}&target_type=Issue",
markdownDocsPath: '/help/user/markdown',
lockVersion: issue.lock_version,
projectPath: @project.path,
diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb
index a85b1bd0a48..0f653fdd282 100644
--- a/spec/helpers/issues_helper_spec.rb
+++ b/spec/helpers/issues_helper_spec.rb
@@ -74,8 +74,8 @@ RSpec.describe IssuesHelper do
expect(helper.award_state_class(awardable, AwardEmoji.all, build(:user))).to eq('disabled')
end
- it 'returns active string for author' do
- expect(helper.award_state_class(awardable, AwardEmoji.all, upvote.user)).to eq('active')
+ it 'returns selected class for author' do
+ expect(helper.award_state_class(awardable, AwardEmoji.all, upvote.user)).to eq('selected')
end
it 'is blank for a user that has access to the awardable' do
@@ -368,6 +368,16 @@ RSpec.describe IssuesHelper do
end
end
+ describe '#issues_form_data' do
+ it 'returns expected result' do
+ expected = {
+ new_issue_path: new_project_issue_path(project)
+ }
+
+ expect(helper.issues_form_data(project)).to include(expected)
+ end
+ end
+
describe '#issue_manual_ordering_class' do
context 'when sorting by relative position' do
before do
diff --git a/spec/helpers/namespaces_helper_spec.rb b/spec/helpers/namespaces_helper_spec.rb
index 00aa0fd1cba..52c1130e818 100644
--- a/spec/helpers/namespaces_helper_spec.rb
+++ b/spec/helpers/namespaces_helper_spec.rb
@@ -268,4 +268,15 @@ RSpec.describe NamespacesHelper do
end
end
end
+
+ describe '#pipeline_usage_quota_app_data' do
+ it 'returns a hash with necessary data for the frontend' do
+ expect(helper.pipeline_usage_quota_app_data(user_group)).to eql({
+ namespace_actual_plan_name: user_group.actual_plan_name,
+ namespace_path: user_group.full_path,
+ namespace_id: user_group.id,
+ page_size: Kaminari.config.default_per_page
+ })
+ end
+ end
end
diff --git a/spec/helpers/packages_helper_spec.rb b/spec/helpers/packages_helper_spec.rb
index d7be4194e67..fc69aee4e04 100644
--- a/spec/helpers/packages_helper_spec.rb
+++ b/spec/helpers/packages_helper_spec.rb
@@ -65,11 +65,11 @@ RSpec.describe PackagesHelper do
end
end
- describe '#show_cleanup_policy_on_alert' do
+ describe '#show_cleanup_policy_link' do
let_it_be(:user) { create(:user) }
let_it_be_with_reload(:container_repository) { create(:container_repository) }
- subject { helper.show_cleanup_policy_on_alert(project.reload) }
+ subject { helper.show_cleanup_policy_link(project.reload) }
where(:com, :config_registry, :project_registry, :nil_policy, :container_repositories_exist, :expected_result) do
false | false | false | false | false | false
diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb
index 8c13afc2b45..01235c7bb51 100644
--- a/spec/helpers/preferences_helper_spec.rb
+++ b/spec/helpers/preferences_helper_spec.rb
@@ -145,6 +145,67 @@ RSpec.describe PreferencesHelper do
end
end
+ describe '#user_diffs_colors' do
+ context 'with a user' do
+ it "returns user's diffs colors" do
+ stub_user(diffs_addition_color: '#123456', diffs_deletion_color: '#abcdef')
+
+ expect(helper.user_diffs_colors).to eq({ addition: '#123456', deletion: '#abcdef' })
+ end
+
+ it 'omits property if nil' do
+ stub_user(diffs_addition_color: '#123456', diffs_deletion_color: nil)
+
+ expect(helper.user_diffs_colors).to eq({ addition: '#123456' })
+ end
+
+ it 'omits property if blank' do
+ stub_user(diffs_addition_color: '', diffs_deletion_color: '#abcdef')
+
+ expect(helper.user_diffs_colors).to eq({ deletion: '#abcdef' })
+ end
+ end
+
+ context 'without a user' do
+ it 'returns no properties' do
+ stub_user
+
+ expect(helper.user_diffs_colors).to eq({})
+ end
+ end
+ end
+
+ describe '#custom_diff_color_classes' do
+ context 'with a user' do
+ it 'returns color classes' do
+ stub_user(diffs_addition_color: '#123456', diffs_deletion_color: '#abcdef')
+
+ expect(helper.custom_diff_color_classes)
+ .to match_array(%w[diff-custom-addition-color diff-custom-deletion-color])
+ end
+
+ it 'omits property if nil' do
+ stub_user(diffs_addition_color: '#123456', diffs_deletion_color: nil)
+
+ expect(helper.custom_diff_color_classes).to match_array(['diff-custom-addition-color'])
+ end
+
+ it 'omits property if blank' do
+ stub_user(diffs_addition_color: '', diffs_deletion_color: '#abcdef')
+
+ expect(helper.custom_diff_color_classes).to match_array(['diff-custom-deletion-color'])
+ end
+ end
+
+ context 'without a user' do
+ it 'returns no classes' do
+ stub_user
+
+ expect(helper.custom_diff_color_classes).to match_array([])
+ end
+ end
+ end
+
describe '#language_choices' do
include StubLanguagesTranslationPercentage
diff --git a/spec/helpers/projects/alert_management_helper_spec.rb b/spec/helpers/projects/alert_management_helper_spec.rb
index 0a5c4bedaa6..a78a8add336 100644
--- a/spec/helpers/projects/alert_management_helper_spec.rb
+++ b/spec/helpers/projects/alert_management_helper_spec.rb
@@ -110,15 +110,34 @@ RSpec.describe Projects::AlertManagementHelper do
describe '#alert_management_detail_data' do
let(:alert_id) { 1 }
let(:issues_path) { project_issues_path(project) }
+ let(:can_update_alert) { true }
+
+ before do
+ allow(helper)
+ .to receive(:can?)
+ .with(current_user, :update_alert_management_alert, project)
+ .and_return(can_update_alert)
+ end
it 'returns detail page configuration' do
- expect(helper.alert_management_detail_data(project, alert_id)).to eq(
+ expect(helper.alert_management_detail_data(current_user, project, alert_id)).to eq(
'alert-id' => alert_id,
'project-path' => project_path,
'project-id' => project_id,
'project-issues-path' => issues_path,
- 'page' => 'OPERATIONS'
+ 'page' => 'OPERATIONS',
+ 'can-update' => 'true'
)
end
+
+ context 'when user cannot update alert' do
+ let(:can_update_alert) { false }
+
+ it 'shows error tracking enablement as disabled' do
+ expect(helper.alert_management_detail_data(current_user, project, alert_id)).to include(
+ 'can-update' => 'false'
+ )
+ end
+ end
end
end
diff --git a/spec/helpers/projects/pipeline_helper_spec.rb b/spec/helpers/projects/pipeline_helper_spec.rb
new file mode 100644
index 00000000000..67405ee3b21
--- /dev/null
+++ b/spec/helpers/projects/pipeline_helper_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::PipelineHelper do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:raw_pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
+ let_it_be(:pipeline) { Ci::PipelinePresenter.new(raw_pipeline, current_user: user)}
+
+ describe '#js_pipeline_tabs_data' do
+ subject(:pipeline_tabs_data) { helper.js_pipeline_tabs_data(project, pipeline) }
+
+ it 'returns pipeline tabs data' do
+ expect(pipeline_tabs_data).to include({
+ can_generate_codequality_reports: pipeline.can_generate_codequality_reports?.to_json,
+ graphql_resource_etag: graphql_etag_pipeline_path(pipeline),
+ metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: project.namespace, project_id: project, format: :json),
+ pipeline_project_path: project.full_path
+ })
+ end
+ end
+end
diff --git a/spec/helpers/projects/security/configuration_helper_spec.rb b/spec/helpers/projects/security/configuration_helper_spec.rb
index 4c30ba87897..034bfd27844 100644
--- a/spec/helpers/projects/security/configuration_helper_spec.rb
+++ b/spec/helpers/projects/security/configuration_helper_spec.rb
@@ -10,4 +10,10 @@ RSpec.describe Projects::Security::ConfigurationHelper do
it { is_expected.to eq("https://#{ApplicationHelper.promo_host}/pricing/") }
end
+
+ describe 'vulnerability_training_docs_path' do
+ subject { helper.vulnerability_training_docs_path }
+
+ it { is_expected.to eq(help_page_path('user/application_security/vulnerabilities/index', anchor: 'enable-security-training-for-vulnerabilities')) }
+ end
end
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index 24d908a5dd3..1cf36fd69cf 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -1000,6 +1000,54 @@ RSpec.describe ProjectsHelper do
end
end
+ context 'fork security helpers' do
+ using RSpec::Parameterized::TableSyntax
+
+ describe "#able_to_see_merge_requests?" do
+ subject { helper.able_to_see_merge_requests?(project, user) }
+
+ where(:can_read_merge_request, :merge_requests_enabled, :expected) do
+ false | false | false
+ true | false | false
+ false | true | false
+ true | true | true
+ end
+
+ with_them do
+ before do
+ allow(project).to receive(:merge_requests_enabled?).and_return(merge_requests_enabled)
+ allow(helper).to receive(:can?).with(user, :read_merge_request, project).and_return(can_read_merge_request)
+ end
+
+ it 'returns the correct response' do
+ expect(subject).to eq(expected)
+ end
+ end
+ end
+
+ describe "#able_to_see_issues?" do
+ subject { helper.able_to_see_issues?(project, user) }
+
+ where(:can_read_issues, :issues_enabled, :expected) do
+ false | false | false
+ true | false | false
+ false | true | false
+ true | true | true
+ end
+
+ with_them do
+ before do
+ allow(project).to receive(:issues_enabled?).and_return(issues_enabled)
+ allow(helper).to receive(:can?).with(user, :read_issue, project).and_return(can_read_issues)
+ end
+
+ it 'returns the correct response' do
+ expect(subject).to eq(expected)
+ end
+ end
+ end
+ end
+
describe '#fork_button_disabled_tooltip' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/helpers/routing/pseudonymization_helper_spec.rb b/spec/helpers/routing/pseudonymization_helper_spec.rb
index 1221917e6b7..cf716931fe2 100644
--- a/spec/helpers/routing/pseudonymization_helper_spec.rb
+++ b/spec/helpers/routing/pseudonymization_helper_spec.rb
@@ -180,7 +180,7 @@ RSpec.describe ::Routing::PseudonymizationHelper do
end
context 'when some query params are not required to be masked' do
- let(:masked_url) { "http://localhost/dashboard/issues?author_username=masked_author_username&scope=all&state=masked_state" }
+ let(:masked_url) { "http://localhost/dashboard/issues?author_username=masked_author_username&scope=all&state=masked_state&tab=2" }
let(:request) do
double(:Request,
path_parameters: {
@@ -189,11 +189,11 @@ RSpec.describe ::Routing::PseudonymizationHelper do
},
protocol: 'http',
host: 'localhost',
- query_string: 'author_username=root&scope=all&state=opened')
+ query_string: 'author_username=root&scope=all&state=opened&tab=2')
end
before do
- stub_const('Routing::PseudonymizationHelper::MaskHelper::QUERY_PARAMS_TO_NOT_MASK', %w[scope].freeze)
+ stub_const('Routing::PseudonymizationHelper::MaskHelper::QUERY_PARAMS_TO_NOT_MASK', %w[scope tab].freeze)
allow(helper).to receive(:request).and_return(request)
end
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index 78cc1dcee01..d1be451a759 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe SearchHelper do
create(:group).add_owner(user)
result = search_autocomplete_opts("gro").first
- expect(result.keys).to match_array(%i[category id label url avatar_url])
+ expect(result.keys).to match_array(%i[category id value label url avatar_url])
end
it 'includes the users recently viewed issues', :aggregate_failures do
@@ -467,6 +467,12 @@ RSpec.describe SearchHelper do
describe '#show_user_search_tab?' do
subject { show_user_search_tab? }
+ let(:current_user) { build(:user) }
+
+ before do
+ allow(self).to receive(:current_user).and_return(current_user)
+ end
+
context 'when project search' do
before do
@project = :some_project
@@ -481,20 +487,48 @@ RSpec.describe SearchHelper do
end
end
- context 'when not project search' do
+ context 'when group search' do
+ before do
+ @group = :some_group
+ end
+
+ context 'when current_user can read_users_list' do
+ before do
+ allow(self).to receive(:can?).with(current_user, :read_users_list).and_return(true)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when current_user cannot read_users_list' do
+ before do
+ allow(self).to receive(:can?).with(current_user, :read_users_list).and_return(false)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ context 'when global search' do
context 'when current_user can read_users_list' do
before do
- allow(self).to receive(:current_user).and_return(:the_current_user)
- allow(self).to receive(:can?).with(:the_current_user, :read_users_list).and_return(true)
+ allow(self).to receive(:can?).with(current_user, :read_users_list).and_return(true)
end
it { is_expected.to eq(true) }
+
+ context 'when global_search_user_tab feature flag is disabled' do
+ before do
+ stub_feature_flags(global_search_users_tab: false)
+ end
+
+ it { is_expected.to eq(false) }
+ end
end
context 'when current_user cannot read_users_list' do
before do
- allow(self).to receive(:current_user).and_return(:the_current_user)
- allow(self).to receive(:can?).with(:the_current_user, :read_users_list).and_return(false)
+ allow(self).to receive(:can?).with(current_user, :read_users_list).and_return(false)
end
it { is_expected.to eq(false) }
diff --git a/spec/helpers/timeboxes_helper_spec.rb b/spec/helpers/timeboxes_helper_spec.rb
index 1b9442c0a09..e31f2df7372 100644
--- a/spec/helpers/timeboxes_helper_spec.rb
+++ b/spec/helpers/timeboxes_helper_spec.rb
@@ -24,34 +24,6 @@ RSpec.describe TimeboxesHelper do
end
end
- describe '#milestone_counts' do
- let(:project) { create(:project) }
- let(:counts) { helper.milestone_counts(project.milestones) }
-
- context 'when there are milestones' do
- it 'returns the correct counts' do
- create_list(:active_milestone, 2, project: project)
- create(:closed_milestone, project: project)
-
- expect(counts).to eq(opened: 2, closed: 1, all: 3)
- end
- end
-
- context 'when there are only milestones of one type' do
- it 'returns the correct counts' do
- create_list(:active_milestone, 2, project: project)
-
- expect(counts).to eq(opened: 2, closed: 0, all: 2)
- end
- end
-
- context 'when there are no milestones' do
- it 'returns the correct counts' do
- expect(counts).to eq(opened: 0, closed: 0, all: 0)
- end
- end
- end
-
describe "#group_milestone_route" do
let(:group) { build_stubbed(:group) }
let(:subgroup) { build_stubbed(:group, parent: group, name: "Test Subgrp") }
diff --git a/spec/helpers/wiki_helper_spec.rb b/spec/helpers/wiki_helper_spec.rb
index 0d04ca2b876..5adcbe3334d 100644
--- a/spec/helpers/wiki_helper_spec.rb
+++ b/spec/helpers/wiki_helper_spec.rb
@@ -145,4 +145,8 @@ RSpec.describe WikiHelper do
expect(subject).to include('wiki-directory-nest-level' => 0)
end
end
+
+ it_behaves_like 'wiki endpoint helpers' do
+ let_it_be(:page) { create(:wiki_page) }
+ end
end
diff --git a/spec/initializers/mail_encoding_patch_spec.rb b/spec/initializers/mail_encoding_patch_spec.rb
index 52a0d041f48..12539c9ca52 100644
--- a/spec/initializers/mail_encoding_patch_spec.rb
+++ b/spec/initializers/mail_encoding_patch_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
+# rubocop:disable RSpec/VariableDefinition, RSpec/VariableName
require 'fast_spec_helper'
-
require 'mail'
require_relative '../../config/initializers/mail_encoding_patch'
@@ -205,3 +205,4 @@ RSpec.describe 'Mail quoted-printable transfer encoding patch and Unicode charac
end
end
end
+# rubocop:enable RSpec/VariableDefinition, RSpec/VariableName
diff --git a/spec/initializers/omniauth_spec.rb b/spec/initializers/omniauth_spec.rb
new file mode 100644
index 00000000000..928eac8c533
--- /dev/null
+++ b/spec/initializers/omniauth_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'OmniAuth initializer for GitLab' do
+ let(:load_omniauth_initializer) do
+ load Rails.root.join('config/initializers/omniauth.rb')
+ end
+
+ describe '#full_host' do
+ subject { OmniAuth.config.full_host }
+
+ let(:base_url) { 'http://localhost/test' }
+
+ before do
+ allow(Settings).to receive(:gitlab).and_return({ 'base_url' => base_url })
+ allow(Gitlab::OmniauthInitializer).to receive(:full_host).and_return('proc')
+ end
+
+ context 'with feature flags not available' do
+ before do
+ expect(Feature).to receive(:feature_flags_available?).and_return(false)
+ load_omniauth_initializer
+ end
+
+ it { is_expected.to eq(base_url) }
+ end
+
+ context 'with the omniauth_initializer_fullhost_proc FF disabled' do
+ before do
+ stub_feature_flags(omniauth_initializer_fullhost_proc: false)
+ load_omniauth_initializer
+ end
+
+ it { is_expected.to eq(base_url) }
+ end
+
+ context 'with the omniauth_initializer_fullhost_proc FF disabled' do
+ before do
+ load_omniauth_initializer
+ end
+
+ it { is_expected.to eq('proc') }
+ end
+ end
+end
diff --git a/spec/lib/api/entities/application_setting_spec.rb b/spec/lib/api/entities/application_setting_spec.rb
new file mode 100644
index 00000000000..5adb825672c
--- /dev/null
+++ b/spec/lib/api/entities/application_setting_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::ApplicationSetting do
+ let_it_be(:application_setting, reload: true) { create(:application_setting) }
+
+ subject(:output) { described_class.new(application_setting).as_json }
+
+ context 'housekeeping_bitmaps_enabled usage is deprecated and always enabled' do
+ before do
+ application_setting.housekeeping_bitmaps_enabled = housekeeping_bitmaps_enabled
+ end
+
+ context 'when housekeeping_bitmaps_enabled db column is false' do
+ let(:housekeeping_bitmaps_enabled) { false }
+
+ it 'returns true' do
+ expect(subject[:housekeeping_bitmaps_enabled]).to eq(true)
+ end
+ end
+
+ context 'when housekeeping_bitmaps_enabled db column is true' do
+ let(:housekeeping_bitmaps_enabled) { false }
+
+ it 'returns true' do
+ expect(subject[:housekeeping_bitmaps_enabled]).to eq(true)
+ end
+ end
+ end
+end
diff --git a/spec/lib/api/validations/validators/limit_spec.rb b/spec/lib/api/validations/validators/limit_spec.rb
index d71dde470cc..0c10e2f74d2 100644
--- a/spec/lib/api/validations/validators/limit_spec.rb
+++ b/spec/lib/api/validations/validators/limit_spec.rb
@@ -22,4 +22,10 @@ RSpec.describe API::Validations::Validators::Limit do
expect_validation_error('test' => "#{'a' * 256}")
end
end
+
+ context 'value is nil' do
+ it 'does not raise a validation error' do
+ expect_no_validation_error('test' => nil)
+ end
+ end
end
diff --git a/spec/lib/backup/artifacts_spec.rb b/spec/lib/backup/artifacts_spec.rb
deleted file mode 100644
index d830692d96b..00000000000
--- a/spec/lib/backup/artifacts_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Backup::Artifacts do
- let(:progress) { StringIO.new }
-
- subject(:backup) { described_class.new(progress) }
-
- describe '#dump' do
- before do
- allow(File).to receive(:realpath).with('/var/gitlab-artifacts').and_return('/var/gitlab-artifacts')
- allow(File).to receive(:realpath).with('/var/gitlab-artifacts/..').and_return('/var')
- allow(JobArtifactUploader).to receive(:root) { '/var/gitlab-artifacts' }
- end
-
- it 'excludes tmp from backup tar' do
- expect(backup).to receive(:tar).and_return('blabla-tar')
- expect(backup).to receive(:run_pipeline!).with([%w(blabla-tar --exclude=lost+found --exclude=./tmp -C /var/gitlab-artifacts -cf - .), 'gzip -c -1'], any_args).and_return([[true, true], ''])
- expect(backup).to receive(:pipeline_succeeded?).and_return(true)
- backup.dump('artifacts.tar.gz')
- end
- end
-end
diff --git a/spec/lib/backup/files_spec.rb b/spec/lib/backup/files_spec.rb
index bbc465a26c9..f98b5e1414f 100644
--- a/spec/lib/backup/files_spec.rb
+++ b/spec/lib/backup/files_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe Backup::Files do
end
describe '#restore' do
- subject { described_class.new(progress, 'registry', '/var/gitlab-registry') }
+ subject { described_class.new(progress, '/var/gitlab-registry') }
let(:timestamp) { Time.utc(2017, 3, 22) }
@@ -110,7 +110,7 @@ RSpec.describe Backup::Files do
end
describe '#dump' do
- subject { described_class.new(progress, 'pages', '/var/gitlab-pages', excludes: ['@pages.tmp']) }
+ subject { described_class.new(progress, '/var/gitlab-pages', excludes: ['@pages.tmp']) }
before do
allow(subject).to receive(:run_pipeline!).and_return([[true, true], ''])
@@ -118,14 +118,14 @@ RSpec.describe Backup::Files do
end
it 'raises no errors' do
- expect { subject.dump('registry.tar.gz') }.not_to raise_error
+ expect { subject.dump('registry.tar.gz', 'backup_id') }.not_to raise_error
end
it 'excludes tmp dirs from archive' do
expect(subject).to receive(:tar).and_return('blabla-tar')
expect(subject).to receive(:run_pipeline!).with([%w(blabla-tar --exclude=lost+found --exclude=./@pages.tmp -C /var/gitlab-pages -cf - .), 'gzip -c -1'], any_args)
- subject.dump('registry.tar.gz')
+ subject.dump('registry.tar.gz', 'backup_id')
end
it 'raises an error on failure' do
@@ -133,7 +133,7 @@ RSpec.describe Backup::Files do
expect(subject).to receive(:pipeline_succeeded?).and_return(false)
expect do
- subject.dump('registry.tar.gz')
+ subject.dump('registry.tar.gz', 'backup_id')
end.to raise_error(/Failed to create compressed file/)
end
@@ -149,7 +149,7 @@ RSpec.describe Backup::Files do
.with(%w(rsync -a --delete --exclude=lost+found --exclude=/gitlab-pages/@pages.tmp /var/gitlab-pages /var/gitlab-backup))
.and_return(['', 0])
- subject.dump('registry.tar.gz')
+ subject.dump('registry.tar.gz', 'backup_id')
end
it 'retries if rsync fails due to vanishing files' do
@@ -158,7 +158,7 @@ RSpec.describe Backup::Files do
.and_return(['rsync failed', 24], ['', 0])
expect do
- subject.dump('registry.tar.gz')
+ subject.dump('registry.tar.gz', 'backup_id')
end.to output(/files vanished during rsync, retrying/).to_stdout
end
@@ -168,7 +168,7 @@ RSpec.describe Backup::Files do
.and_return(['rsync failed', 1])
expect do
- subject.dump('registry.tar.gz')
+ subject.dump('registry.tar.gz', 'backup_id')
end.to output(/rsync failed/).to_stdout
.and raise_error(/Failed to create compressed file/)
end
@@ -176,7 +176,7 @@ RSpec.describe Backup::Files do
end
describe '#exclude_dirs' do
- subject { described_class.new(progress, 'pages', '/var/gitlab-pages', excludes: ['@pages.tmp']) }
+ subject { described_class.new(progress, '/var/gitlab-pages', excludes: ['@pages.tmp']) }
it 'prepends a leading dot slash to tar excludes' do
expect(subject.exclude_dirs(:tar)).to eq(['--exclude=lost+found', '--exclude=./@pages.tmp'])
@@ -188,7 +188,7 @@ RSpec.describe Backup::Files do
end
describe '#run_pipeline!' do
- subject { described_class.new(progress, 'registry', '/var/gitlab-registry') }
+ subject { described_class.new(progress, '/var/gitlab-registry') }
it 'executes an Open3.pipeline for cmd_list' do
expect(Open3).to receive(:pipeline).with(%w[whew command], %w[another cmd], any_args)
@@ -222,7 +222,7 @@ RSpec.describe Backup::Files do
end
describe '#pipeline_succeeded?' do
- subject { described_class.new(progress, 'registry', '/var/gitlab-registry') }
+ subject { described_class.new(progress, '/var/gitlab-registry') }
it 'returns true if both tar and gzip succeeeded' do
expect(
@@ -262,7 +262,7 @@ RSpec.describe Backup::Files do
end
describe '#tar_ignore_non_success?' do
- subject { described_class.new(progress, 'registry', '/var/gitlab-registry') }
+ subject { described_class.new(progress, '/var/gitlab-registry') }
context 'if `tar` command exits with 1 exitstatus' do
it 'returns true' do
@@ -310,7 +310,7 @@ RSpec.describe Backup::Files do
end
describe '#noncritical_warning?' do
- subject { described_class.new(progress, 'registry', '/var/gitlab-registry') }
+ subject { described_class.new(progress, '/var/gitlab-registry') }
it 'returns true if given text matches noncritical warnings list' do
expect(
diff --git a/spec/lib/backup/gitaly_backup_spec.rb b/spec/lib/backup/gitaly_backup_spec.rb
index f5295c2b04c..399e4ffa72b 100644
--- a/spec/lib/backup/gitaly_backup_spec.rb
+++ b/spec/lib/backup/gitaly_backup_spec.rb
@@ -25,11 +25,11 @@ RSpec.describe Backup::GitalyBackup do
progress.close
end
- subject { described_class.new(progress, max_parallelism: max_parallelism, storage_parallelism: storage_parallelism, backup_id: backup_id) }
+ subject { described_class.new(progress, max_parallelism: max_parallelism, storage_parallelism: storage_parallelism) }
context 'unknown' do
it 'fails to start unknown' do
- expect { subject.start(:unknown, destination) }.to raise_error(::Backup::Error, 'unknown backup type: unknown')
+ expect { subject.start(:unknown, destination, backup_id: backup_id) }.to raise_error(::Backup::Error, 'unknown backup type: unknown')
end
end
@@ -44,7 +44,7 @@ RSpec.describe Backup::GitalyBackup do
expect(Open3).to receive(:popen2).with(expected_env, anything, 'create', '-path', anything, '-layout', 'pointer', '-id', backup_id).and_call_original
- subject.start(:create, destination)
+ subject.start(:create, destination, backup_id: backup_id)
subject.enqueue(project, Gitlab::GlRepository::PROJECT)
subject.enqueue(project, Gitlab::GlRepository::WIKI)
subject.enqueue(project, Gitlab::GlRepository::DESIGN)
@@ -65,7 +65,7 @@ RSpec.describe Backup::GitalyBackup do
it 'passes parallel option through' do
expect(Open3).to receive(:popen2).with(expected_env, anything, 'create', '-path', anything, '-parallel', '3', '-layout', 'pointer', '-id', backup_id).and_call_original
- subject.start(:create, destination)
+ subject.start(:create, destination, backup_id: backup_id)
subject.finish!
end
end
@@ -76,7 +76,7 @@ RSpec.describe Backup::GitalyBackup do
it 'passes parallel option through' do
expect(Open3).to receive(:popen2).with(expected_env, anything, 'create', '-path', anything, '-parallel-storage', '3', '-layout', 'pointer', '-id', backup_id).and_call_original
- subject.start(:create, destination)
+ subject.start(:create, destination, backup_id: backup_id)
subject.finish!
end
end
@@ -84,10 +84,16 @@ RSpec.describe Backup::GitalyBackup do
it 'raises when the exit code not zero' do
expect(subject).to receive(:bin_path).and_return(Gitlab::Utils.which('false'))
- subject.start(:create, destination)
+ subject.start(:create, destination, backup_id: backup_id)
expect { subject.finish! }.to raise_error(::Backup::Error, 'gitaly-backup exit status 1')
end
+ it 'raises when gitaly_backup_path is not set' do
+ stub_backup_setting(gitaly_backup_path: nil)
+
+ expect { subject.start(:create, destination, backup_id: backup_id) }.to raise_error(::Backup::Error, 'gitaly-backup binary not found and gitaly_backup_path is not configured')
+ end
+
context 'feature flag incremental_repository_backup disabled' do
before do
stub_feature_flags(incremental_repository_backup: false)
@@ -102,7 +108,7 @@ RSpec.describe Backup::GitalyBackup do
expect(Open3).to receive(:popen2).with(expected_env, anything, 'create', '-path', anything).and_call_original
- subject.start(:create, destination)
+ subject.start(:create, destination, backup_id: backup_id)
subject.enqueue(project, Gitlab::GlRepository::PROJECT)
subject.enqueue(project, Gitlab::GlRepository::WIKI)
subject.enqueue(project, Gitlab::GlRepository::DESIGN)
@@ -146,7 +152,7 @@ RSpec.describe Backup::GitalyBackup do
it 'passes through SSL envs' do
expect(Open3).to receive(:popen2).with(ssl_env, anything, 'create', '-path', anything, '-layout', 'pointer', '-id', backup_id).and_call_original
- subject.start(:create, destination)
+ subject.start(:create, destination, backup_id: backup_id)
subject.finish!
end
end
@@ -171,7 +177,7 @@ RSpec.describe Backup::GitalyBackup do
expect(Open3).to receive(:popen2).with(expected_env, anything, 'restore', '-path', anything, '-layout', 'pointer').and_call_original
- subject.start(:restore, destination)
+ subject.start(:restore, destination, backup_id: backup_id)
subject.enqueue(project, Gitlab::GlRepository::PROJECT)
subject.enqueue(project, Gitlab::GlRepository::WIKI)
subject.enqueue(project, Gitlab::GlRepository::DESIGN)
@@ -194,7 +200,7 @@ RSpec.describe Backup::GitalyBackup do
it 'passes parallel option through' do
expect(Open3).to receive(:popen2).with(expected_env, anything, 'restore', '-path', anything, '-parallel', '3', '-layout', 'pointer').and_call_original
- subject.start(:restore, destination)
+ subject.start(:restore, destination, backup_id: backup_id)
subject.finish!
end
end
@@ -205,7 +211,7 @@ RSpec.describe Backup::GitalyBackup do
it 'passes parallel option through' do
expect(Open3).to receive(:popen2).with(expected_env, anything, 'restore', '-path', anything, '-parallel-storage', '3', '-layout', 'pointer').and_call_original
- subject.start(:restore, destination)
+ subject.start(:restore, destination, backup_id: backup_id)
subject.finish!
end
end
@@ -224,7 +230,7 @@ RSpec.describe Backup::GitalyBackup do
expect(Open3).to receive(:popen2).with(expected_env, anything, 'restore', '-path', anything).and_call_original
- subject.start(:restore, destination)
+ subject.start(:restore, destination, backup_id: backup_id)
subject.enqueue(project, Gitlab::GlRepository::PROJECT)
subject.enqueue(project, Gitlab::GlRepository::WIKI)
subject.enqueue(project, Gitlab::GlRepository::DESIGN)
@@ -245,8 +251,14 @@ RSpec.describe Backup::GitalyBackup do
it 'raises when the exit code not zero' do
expect(subject).to receive(:bin_path).and_return(Gitlab::Utils.which('false'))
- subject.start(:restore, destination)
+ subject.start(:restore, destination, backup_id: backup_id)
expect { subject.finish! }.to raise_error(::Backup::Error, 'gitaly-backup exit status 1')
end
+
+ it 'raises when gitaly_backup_path is not set' do
+ stub_backup_setting(gitaly_backup_path: nil)
+
+ expect { subject.start(:restore, destination, backup_id: backup_id) }.to raise_error(::Backup::Error, 'gitaly-backup binary not found and gitaly_backup_path is not configured')
+ end
end
end
diff --git a/spec/lib/backup/gitaly_rpc_backup_spec.rb b/spec/lib/backup/gitaly_rpc_backup_spec.rb
deleted file mode 100644
index 6cba8c5c9b1..00000000000
--- a/spec/lib/backup/gitaly_rpc_backup_spec.rb
+++ /dev/null
@@ -1,154 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Backup::GitalyRpcBackup do
- let(:progress) { spy(:stdout) }
- let(:destination) { File.join(Gitlab.config.backup.path, 'repositories') }
-
- subject { described_class.new(progress) }
-
- after do
- # make sure we do not leave behind any backup files
- FileUtils.rm_rf(File.join(Gitlab.config.backup.path, 'repositories'))
- end
-
- context 'unknown' do
- it 'fails to start unknown' do
- expect { subject.start(:unknown, destination) }.to raise_error(::Backup::Error, 'unknown backup type: unknown')
- end
- end
-
- context 'create' do
- RSpec.shared_examples 'creates a repository backup' do
- it 'creates repository bundles', :aggregate_failures do
- # Add data to the wiki, design repositories, and snippets, so they will be included in the dump.
- create(:wiki_page, container: project)
- create(:design, :with_file, issue: create(:issue, project: project))
- project_snippet = create(:project_snippet, :repository, project: project)
- personal_snippet = create(:personal_snippet, :repository, author: project.first_owner)
-
- subject.start(:create, destination)
- subject.enqueue(project, Gitlab::GlRepository::PROJECT)
- subject.enqueue(project, Gitlab::GlRepository::WIKI)
- subject.enqueue(project, Gitlab::GlRepository::DESIGN)
- subject.enqueue(personal_snippet, Gitlab::GlRepository::SNIPPET)
- subject.enqueue(project_snippet, Gitlab::GlRepository::SNIPPET)
- subject.finish!
-
- expect(File).to exist(File.join(destination, project.disk_path + '.bundle'))
- expect(File).to exist(File.join(destination, project.disk_path + '.wiki.bundle'))
- expect(File).to exist(File.join(destination, project.disk_path + '.design.bundle'))
- expect(File).to exist(File.join(destination, personal_snippet.disk_path + '.bundle'))
- expect(File).to exist(File.join(destination, project_snippet.disk_path + '.bundle'))
- end
-
- context 'failure' do
- before do
- allow_next_instance_of(Repository) do |repository|
- allow(repository).to receive(:bundle_to_disk) { raise 'Fail in tests' }
- end
- end
-
- it 'logs an appropriate message', :aggregate_failures do
- subject.start(:create, destination)
- subject.enqueue(project, Gitlab::GlRepository::PROJECT)
- subject.finish!
-
- expect(progress).to have_received(:puts).with("[Failed] backing up #{project.full_path} (#{project.disk_path})")
- expect(progress).to have_received(:puts).with("Error Fail in tests")
- end
- end
- end
-
- context 'hashed storage' do
- let_it_be(:project) { create(:project, :repository) }
-
- it_behaves_like 'creates a repository backup'
- end
-
- context 'legacy storage' do
- let_it_be(:project) { create(:project, :repository, :legacy_storage) }
-
- it_behaves_like 'creates a repository backup'
- end
- end
-
- context 'restore' do
- let_it_be(:project) { create(:project, :repository) }
- let_it_be(:personal_snippet) { create(:personal_snippet, author: project.first_owner) }
- let_it_be(:project_snippet) { create(:project_snippet, project: project, author: project.first_owner) }
-
- def copy_bundle_to_backup_path(bundle_name, destination)
- FileUtils.mkdir_p(File.join(Gitlab.config.backup.path, 'repositories', File.dirname(destination)))
- FileUtils.cp(Rails.root.join('spec/fixtures/lib/backup', bundle_name), File.join(Gitlab.config.backup.path, 'repositories', destination))
- end
-
- it 'restores from repository bundles', :aggregate_failures do
- copy_bundle_to_backup_path('project_repo.bundle', project.disk_path + '.bundle')
- copy_bundle_to_backup_path('wiki_repo.bundle', project.disk_path + '.wiki.bundle')
- copy_bundle_to_backup_path('design_repo.bundle', project.disk_path + '.design.bundle')
- 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')
-
- subject.start(:restore, destination)
- subject.enqueue(project, Gitlab::GlRepository::PROJECT)
- subject.enqueue(project, Gitlab::GlRepository::WIKI)
- subject.enqueue(project, Gitlab::GlRepository::DESIGN)
- subject.enqueue(personal_snippet, Gitlab::GlRepository::SNIPPET)
- subject.enqueue(project_snippet, Gitlab::GlRepository::SNIPPET)
- subject.finish!
-
- collect_commit_shas = -> (repo) { repo.commits('master', limit: 10).map(&:sha) }
-
- expect(collect_commit_shas.call(project.repository)).to eq(['393a7d860a5a4c3cc736d7eb00604e3472bb95ec'])
- expect(collect_commit_shas.call(project.wiki.repository)).to eq(['c74b9948d0088d703ee1fafeddd9ed9add2901ea'])
- expect(collect_commit_shas.call(project.design_repository)).to eq(['c3cd4d7bd73a51a0f22045c3a4c871c435dc959d'])
- expect(collect_commit_shas.call(personal_snippet.repository)).to eq(['3b3c067a3bc1d1b695b51e2be30c0f8cf698a06e'])
- expect(collect_commit_shas.call(project_snippet.repository)).to eq(['6e44ba56a4748be361a841e759c20e421a1651a1'])
- end
-
- it 'cleans existing repositories', :aggregate_failures do
- expect_next_instance_of(DesignManagement::Repository) do |repository|
- expect(repository).to receive(:remove)
- end
-
- # 4 times = project repo + wiki repo + project_snippet repo + personal_snippet repo
- expect(Repository).to receive(:new).exactly(4).times.and_wrap_original do |method, *original_args|
- full_path, container, kwargs = original_args
-
- repository = method.call(full_path, container, **kwargs)
-
- expect(repository).to receive(:remove)
-
- repository
- end
-
- subject.start(:restore, destination)
- subject.enqueue(project, Gitlab::GlRepository::PROJECT)
- subject.enqueue(project, Gitlab::GlRepository::WIKI)
- subject.enqueue(project, Gitlab::GlRepository::DESIGN)
- subject.enqueue(personal_snippet, Gitlab::GlRepository::SNIPPET)
- subject.enqueue(project_snippet, Gitlab::GlRepository::SNIPPET)
- subject.finish!
- end
-
- context 'failure' do
- before do
- allow_next_instance_of(Repository) do |repository|
- allow(repository).to receive(:create_repository) { raise 'Fail in tests' }
- allow(repository).to receive(:create_from_bundle) { raise 'Fail in tests' }
- end
- end
-
- it 'logs an appropriate message', :aggregate_failures do
- subject.start(:restore, destination)
- subject.enqueue(project, Gitlab::GlRepository::PROJECT)
- subject.finish!
-
- expect(progress).to have_received(:puts).with("[Failed] restoring #{project.full_path} (#{project.disk_path})")
- expect(progress).to have_received(:puts).with("Error Fail in tests")
- end
- end
- end
-end
diff --git a/spec/lib/backup/lfs_spec.rb b/spec/lib/backup/lfs_spec.rb
deleted file mode 100644
index a27f60f20d0..00000000000
--- a/spec/lib/backup/lfs_spec.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Backup::Lfs do
- let(:progress) { StringIO.new }
-
- subject(:backup) { described_class.new(progress) }
-
- describe '#dump' do
- before do
- allow(File).to receive(:realpath).and_call_original
- allow(File).to receive(:realpath).with('/var/lfs-objects').and_return('/var/lfs-objects')
- allow(File).to receive(:realpath).with('/var/lfs-objects/..').and_return('/var')
- allow(Settings.lfs).to receive(:storage_path).and_return('/var/lfs-objects')
- end
-
- it 'uses the correct lfs dir in tar command', :aggregate_failures do
- expect(backup).to receive(:tar).and_return('blabla-tar')
- expect(backup).to receive(:run_pipeline!).with([%w(blabla-tar --exclude=lost+found -C /var/lfs-objects -cf - .), 'gzip -c -1'], any_args).and_return([[true, true], ''])
- expect(backup).to receive(:pipeline_succeeded?).and_return(true)
-
- backup.dump('lfs.tar.gz')
- end
- end
-end
diff --git a/spec/lib/backup/manager_spec.rb b/spec/lib/backup/manager_spec.rb
index 9cf78a11bc7..192739d05a7 100644
--- a/spec/lib/backup/manager_spec.rb
+++ b/spec/lib/backup/manager_spec.rb
@@ -22,13 +22,13 @@ RSpec.describe Backup::Manager do
describe '#run_create_task' do
let(:enabled) { true }
- let(:task) { instance_double(Backup::Task, human_name: 'my task', enabled: enabled) }
- let(:definitions) { { 'my_task' => Backup::Manager::TaskDefinition.new(task: task, destination_path: 'my_task.tar.gz') } }
+ let(:task) { instance_double(Backup::Task) }
+ let(:definitions) { { 'my_task' => Backup::Manager::TaskDefinition.new(task: task, enabled: enabled, destination_path: 'my_task.tar.gz', human_name: 'my task') } }
it 'calls the named task' do
expect(task).to receive(:dump)
expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Dumping my task ... ')
- expect(Gitlab::BackupLogger).to receive(:info).with(message: 'done')
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Dumping my task ... done')
subject.run_create_task('my_task')
end
@@ -37,8 +37,7 @@ RSpec.describe Backup::Manager do
let(:enabled) { false }
it 'informs the user' do
- expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Dumping my task ... ')
- expect(Gitlab::BackupLogger).to receive(:info).with(message: '[DISABLED]')
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Dumping my task ... [DISABLED]')
subject.run_create_task('my_task')
end
@@ -48,8 +47,7 @@ RSpec.describe Backup::Manager do
it 'informs the user' do
stub_env('SKIP', 'my_task')
- expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Dumping my task ... ')
- expect(Gitlab::BackupLogger).to receive(:info).with(message: '[SKIPPED]')
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Dumping my task ... [SKIPPED]')
subject.run_create_task('my_task')
end
@@ -60,12 +58,10 @@ RSpec.describe Backup::Manager do
let(:enabled) { true }
let(:pre_restore_warning) { nil }
let(:post_restore_warning) { nil }
- let(:definitions) { { 'my_task' => Backup::Manager::TaskDefinition.new(task: task, destination_path: 'my_task.tar.gz') } }
+ let(:definitions) { { 'my_task' => Backup::Manager::TaskDefinition.new(task: task, enabled: enabled, human_name: 'my task', destination_path: 'my_task.tar.gz') } }
let(:backup_information) { {} }
let(:task) do
instance_double(Backup::Task,
- human_name: 'my task',
- enabled: enabled,
pre_restore_warning: pre_restore_warning,
post_restore_warning: post_restore_warning)
end
@@ -78,7 +74,7 @@ RSpec.describe Backup::Manager do
it 'calls the named task' do
expect(task).to receive(:restore)
expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... ').ordered
- expect(Gitlab::BackupLogger).to receive(:info).with(message: 'done').ordered
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... done').ordered
subject.run_restore_task('my_task')
end
@@ -87,8 +83,7 @@ RSpec.describe Backup::Manager do
let(:enabled) { false }
it 'informs the user' do
- expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... ').ordered
- expect(Gitlab::BackupLogger).to receive(:info).with(message: '[DISABLED]').ordered
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... [DISABLED]').ordered
subject.run_restore_task('my_task')
end
@@ -100,7 +95,7 @@ RSpec.describe Backup::Manager do
it 'displays and waits for the user' do
expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... ').ordered
expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Watch out!').ordered
- expect(Gitlab::BackupLogger).to receive(:info).with(message: 'done').ordered
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... done').ordered
expect(Gitlab::TaskHelpers).to receive(:ask_to_continue)
expect(task).to receive(:restore)
@@ -124,7 +119,7 @@ RSpec.describe Backup::Manager do
it 'displays and waits for the user' do
expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... ').ordered
- expect(Gitlab::BackupLogger).to receive(:info).with(message: 'done').ordered
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... done').ordered
expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Watch out!').ordered
expect(Gitlab::TaskHelpers).to receive(:ask_to_continue)
expect(task).to receive(:restore)
@@ -134,7 +129,7 @@ RSpec.describe Backup::Manager do
it 'does not continue when the user quits' do
expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... ').ordered
- expect(Gitlab::BackupLogger).to receive(:info).with(message: 'done').ordered
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Restoring my task ... done').ordered
expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Watch out!').ordered
expect(Gitlab::BackupLogger).to receive(:info).with(message: 'Quitting...').ordered
expect(task).to receive(:restore)
@@ -148,8 +143,10 @@ RSpec.describe Backup::Manager do
end
describe '#create' do
+ let(:incremental_env) { 'false' }
let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz task2.tar.gz} }
- let(:tar_file) { '1546300800_2019_01_01_12.3_gitlab_backup.tar' }
+ let(:backup_id) { '1546300800_2019_01_01_12.3' }
+ let(:tar_file) { "#{backup_id}_gitlab_backup.tar" }
let(:tar_system_options) { { out: [tar_file, 'w', Gitlab.config.backup.archive_permissions] } }
let(:tar_cmdline) { ['tar', '-cf', '-', *expected_backup_contents, tar_system_options] }
let(:backup_information) do
@@ -159,24 +156,27 @@ RSpec.describe Backup::Manager do
}
end
- let(:task1) { instance_double(Backup::Task, human_name: 'task 1', enabled: true) }
- let(:task2) { instance_double(Backup::Task, human_name: 'task 2', enabled: true) }
+ let(:task1) { instance_double(Backup::Task) }
+ let(:task2) { instance_double(Backup::Task) }
let(:definitions) do
{
- 'task1' => Backup::Manager::TaskDefinition.new(task: task1, destination_path: 'task1.tar.gz'),
- 'task2' => Backup::Manager::TaskDefinition.new(task: task2, destination_path: 'task2.tar.gz')
+ 'task1' => Backup::Manager::TaskDefinition.new(task: task1, human_name: 'task 1', destination_path: 'task1.tar.gz'),
+ 'task2' => Backup::Manager::TaskDefinition.new(task: task2, human_name: 'task 2', destination_path: 'task2.tar.gz')
}
end
before do
+ stub_env('INCREMENTAL', incremental_env)
allow(ActiveRecord::Base.connection).to receive(:reconnect!)
+ allow(Gitlab::BackupLogger).to receive(:info)
allow(Kernel).to receive(:system).and_return(true)
+ allow(YAML).to receive(:load_file).and_call_original
allow(YAML).to receive(:load_file).with(File.join(Gitlab.config.backup.path, 'backup_information.yml'))
.and_return(backup_information)
allow(subject).to receive(:backup_information).and_return(backup_information)
- allow(task1).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task1.tar.gz'))
- allow(task2).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task2.tar.gz'))
+ allow(task1).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task1.tar.gz'), backup_id)
+ allow(task2).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task2.tar.gz'), backup_id)
end
it 'executes tar' do
@@ -185,8 +185,22 @@ RSpec.describe Backup::Manager do
expect(Kernel).to have_received(:system).with(*tar_cmdline)
end
+ context 'tar fails' do
+ before do
+ expect(Kernel).to receive(:system).with(*tar_cmdline).and_return(false)
+ end
+
+ it 'logs a failure' do
+ expect do
+ subject.create # rubocop:disable Rails/SaveBang
+ end.to raise_error(Backup::Error, 'Backup failed')
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: "Creating archive #{tar_file} failed")
+ end
+ end
+
context 'when BACKUP is set' do
- let(:tar_file) { 'custom_gitlab_backup.tar' }
+ let(:backup_id) { 'custom' }
it 'uses the given value as tar file name' do
stub_env('BACKUP', '/ignored/path/custom')
@@ -213,6 +227,20 @@ RSpec.describe Backup::Manager do
end
end
+ context 'when SKIP env is set' do
+ let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz} }
+
+ before do
+ stub_env('SKIP', 'task2')
+ end
+
+ it 'executes tar' do
+ subject.create # rubocop:disable Rails/SaveBang
+
+ expect(Kernel).to have_received(:system).with(*tar_cmdline)
+ end
+ end
+
context 'when the destination is optional' do
let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz} }
let(:definitions) do
@@ -248,6 +276,7 @@ RSpec.describe Backup::Manager do
end
before do
+ allow(Gitlab::BackupLogger).to receive(:info)
allow(Dir).to receive(:chdir).and_yield
allow(Dir).to receive(:glob).and_return(files)
allow(FileUtils).to receive(:rm)
@@ -266,7 +295,7 @@ RSpec.describe Backup::Manager do
end
it 'prints a skipped message' do
- expect(progress).to have_received(:puts).with('skipping')
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... [SKIPPED]')
end
end
@@ -290,7 +319,7 @@ RSpec.describe Backup::Manager do
end
it 'prints a done message' do
- expect(progress).to have_received(:puts).with('done. (0 removed)')
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (0 removed)')
end
end
@@ -307,7 +336,7 @@ RSpec.describe Backup::Manager do
end
it 'prints a done message' do
- expect(progress).to have_received(:puts).with('done. (0 removed)')
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (0 removed)')
end
end
@@ -348,7 +377,7 @@ RSpec.describe Backup::Manager do
end
it 'prints a done message' do
- expect(progress).to have_received(:puts).with('done. (8 removed)')
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (8 removed)')
end
end
@@ -372,11 +401,11 @@ RSpec.describe Backup::Manager do
end
it 'sets the correct removed count' do
- expect(progress).to have_received(:puts).with('done. (7 removed)')
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (7 removed)')
end
it 'prints the error from file that could not be removed' do
- expect(progress).to have_received(:puts).with(a_string_matching(message))
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: a_string_matching(message))
end
end
end
@@ -386,6 +415,7 @@ RSpec.describe Backup::Manager do
let(:backup_filename) { File.basename(backup_file.path) }
before do
+ allow(Gitlab::BackupLogger).to receive(:info)
allow(subject).to receive(:tar_file).and_return(backup_filename)
stub_backup_setting(
@@ -410,6 +440,23 @@ RSpec.describe Backup::Manager do
connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) # rubocop:disable Rails/SaveBang
end
+ context 'skipped upload' do
+ let(:backup_information) do
+ {
+ backup_created_at: Time.zone.parse('2019-01-01'),
+ gitlab_version: '12.3',
+ skipped: ['remote']
+ }
+ end
+
+ it 'informs the user' do
+ stub_env('SKIP', 'remote')
+ subject.create # rubocop:disable Rails/SaveBang
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... [SKIPPED]')
+ end
+ end
+
context 'target path' do
it 'uses the tar filename by default' do
expect_any_instance_of(Fog::Collection).to receive(:create)
@@ -462,7 +509,7 @@ RSpec.describe Backup::Manager do
it 'sets encryption attributes' do
subject.create # rubocop:disable Rails/SaveBang
- expect(progress).to have_received(:puts).with("done (encrypted with AES256)")
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... done (encrypted with AES256)')
end
end
@@ -473,7 +520,7 @@ RSpec.describe Backup::Manager do
it 'sets encryption attributes' do
subject.create # rubocop:disable Rails/SaveBang
- expect(progress).to have_received(:puts).with("done (encrypted with AES256)")
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... done (encrypted with AES256)')
end
end
@@ -488,7 +535,7 @@ RSpec.describe Backup::Manager do
it 'sets encryption attributes' do
subject.create # rubocop:disable Rails/SaveBang
- expect(progress).to have_received(:puts).with("done (encrypted with aws:kms)")
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... done (encrypted with aws:kms)')
end
end
end
@@ -546,15 +593,169 @@ RSpec.describe Backup::Manager do
end
end
end
+
+ context 'incremental' do
+ let(:incremental_env) { 'true' }
+ let(:gitlab_version) { Gitlab::VERSION }
+ let(:backup_id) { "1546300800_2019_01_01_#{gitlab_version}" }
+ let(:tar_file) { "#{backup_id}_gitlab_backup.tar" }
+ let(:backup_information) do
+ {
+ backup_created_at: Time.zone.parse('2019-01-01'),
+ gitlab_version: gitlab_version
+ }
+ end
+
+ context 'when there are no backup files in the directory' do
+ before do
+ allow(Dir).to receive(:glob).and_return([])
+ end
+
+ it 'fails the operation and prints an error' do
+ expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching('No backups found'))
+ end
+ end
+
+ context 'when there are two backup files in the directory and BACKUP variable is not set' do
+ before do
+ allow(Dir).to receive(:glob).and_return(
+ [
+ '1451606400_2016_01_01_1.2.3_gitlab_backup.tar',
+ '1451520000_2015_12_31_gitlab_backup.tar'
+ ]
+ )
+ end
+
+ it 'prints the list of available backups' do
+ expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching('1451606400_2016_01_01_1.2.3\n 1451520000_2015_12_31'))
+ end
+
+ it 'fails the operation and prints an error' do
+ expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching('Found more than one backup'))
+ end
+ end
+
+ context 'when BACKUP variable is set to a non-existing file' do
+ before do
+ allow(Dir).to receive(:glob).and_return(
+ [
+ '1451606400_2016_01_01_gitlab_backup.tar'
+ ]
+ )
+ allow(File).to receive(:exist?).and_return(false)
+
+ stub_env('BACKUP', 'wrong')
+ end
+
+ it 'fails the operation and prints an error' do
+ expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
+ expect(File).to have_received(:exist?).with('wrong_gitlab_backup.tar')
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching('The backup file wrong_gitlab_backup.tar does not exist'))
+ end
+ end
+
+ context 'when BACKUP variable is set to a correct file' do
+ let(:backup_id) { '1451606400_2016_01_01_1.2.3' }
+ let(:tar_cmdline) { %w{tar -xf 1451606400_2016_01_01_1.2.3_gitlab_backup.tar} }
+
+ before do
+ allow(Gitlab::BackupLogger).to receive(:info)
+ allow(Dir).to receive(:glob).and_return(
+ [
+ '1451606400_2016_01_01_1.2.3_gitlab_backup.tar'
+ ]
+ )
+ allow(File).to receive(:exist?).and_return(true)
+ allow(Kernel).to receive(:system).and_return(true)
+
+ stub_env('BACKUP', '/ignored/path/1451606400_2016_01_01_1.2.3')
+ end
+
+ it 'unpacks the file' do
+ subject.create # rubocop:disable Rails/SaveBang
+
+ expect(Kernel).to have_received(:system).with(*tar_cmdline)
+ end
+
+ context 'tar fails' do
+ before do
+ expect(Kernel).to receive(:system).with(*tar_cmdline).and_return(false)
+ end
+
+ it 'logs a failure' do
+ expect do
+ subject.create # rubocop:disable Rails/SaveBang
+ end.to raise_error(SystemExit)
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Unpacking backup failed')
+ end
+ end
+
+ context 'on version mismatch' do
+ let(:backup_information) do
+ {
+ backup_created_at: Time.zone.parse('2019-01-01'),
+ gitlab_version: "not #{gitlab_version}"
+ }
+ end
+
+ it 'stops the process' do
+ expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching('GitLab version mismatch'))
+ end
+ end
+ end
+
+ context 'when there is a non-tarred backup in the directory' do
+ before do
+ allow(Dir).to receive(:glob).and_return(
+ [
+ 'backup_information.yml'
+ ]
+ )
+ allow(File).to receive(:exist?).and_return(true)
+ end
+
+ it 'selects the non-tarred backup to restore from' do
+ subject.create # rubocop:disable Rails/SaveBang
+
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching('Non tarred backup found '))
+ end
+
+ context 'on version mismatch' do
+ let(:backup_information) do
+ {
+ backup_created_at: Time.zone.parse('2019-01-01'),
+ gitlab_version: "not #{gitlab_version}"
+ }
+ end
+
+ it 'stops the process' do
+ expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching('GitLab version mismatch'))
+ end
+ end
+ end
+ end
end
describe '#restore' do
- let(:task1) { instance_double(Backup::Task, human_name: 'task 1', enabled: true, pre_restore_warning: nil, post_restore_warning: nil) }
- let(:task2) { instance_double(Backup::Task, human_name: 'task 2', enabled: true, pre_restore_warning: nil, post_restore_warning: nil) }
+ let(:task1) { instance_double(Backup::Task, pre_restore_warning: nil, post_restore_warning: nil) }
+ let(:task2) { instance_double(Backup::Task, pre_restore_warning: nil, post_restore_warning: nil) }
let(:definitions) do
{
- 'task1' => Backup::Manager::TaskDefinition.new(task: task1, destination_path: 'task1.tar.gz'),
- 'task2' => Backup::Manager::TaskDefinition.new(task: task2, destination_path: 'task2.tar.gz')
+ 'task1' => Backup::Manager::TaskDefinition.new(task: task1, human_name: 'task 1', destination_path: 'task1.tar.gz'),
+ 'task2' => Backup::Manager::TaskDefinition.new(task: task2, human_name: 'task 2', destination_path: 'task2.tar.gz')
}
end
@@ -570,6 +771,7 @@ RSpec.describe Backup::Manager do
Rake.application.rake_require 'tasks/gitlab/shell'
Rake.application.rake_require 'tasks/cache'
+ allow(Gitlab::BackupLogger).to receive(:info)
allow(task1).to receive(:restore).with(File.join(Gitlab.config.backup.path, 'task1.tar.gz'))
allow(task2).to receive(:restore).with(File.join(Gitlab.config.backup.path, 'task2.tar.gz'))
allow(YAML).to receive(:load_file).with(File.join(Gitlab.config.backup.path, 'backup_information.yml'))
@@ -634,7 +836,10 @@ RSpec.describe Backup::Manager do
end
context 'when BACKUP variable is set to a correct file' do
+ let(:tar_cmdline) { %w{tar -xf 1451606400_2016_01_01_1.2.3_gitlab_backup.tar} }
+
before do
+ allow(Gitlab::BackupLogger).to receive(:info)
allow(Dir).to receive(:glob).and_return(
[
'1451606400_2016_01_01_1.2.3_gitlab_backup.tar'
@@ -649,8 +854,21 @@ RSpec.describe Backup::Manager do
it 'unpacks the file' do
subject.restore
- expect(Kernel).to have_received(:system)
- .with("tar", "-xf", "1451606400_2016_01_01_1.2.3_gitlab_backup.tar")
+ expect(Kernel).to have_received(:system).with(*tar_cmdline)
+ end
+
+ context 'tar fails' do
+ before do
+ expect(Kernel).to receive(:system).with(*tar_cmdline).and_return(false)
+ end
+
+ it 'logs a failure' do
+ expect do
+ subject.restore
+ end.to raise_error(SystemExit)
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Unpacking backup failed')
+ end
end
context 'on version mismatch' do
@@ -680,7 +898,7 @@ RSpec.describe Backup::Manager do
subject.restore
- expect(progress).to have_received(:print).with('Deleting backups/tmp ... ')
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting backups/tmp ... ')
end
end
end
@@ -731,7 +949,7 @@ RSpec.describe Backup::Manager do
subject.restore
- expect(progress).to have_received(:print).with('Deleting backups/tmp ... ')
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting backups/tmp ... ')
end
end
end
diff --git a/spec/lib/backup/object_backup_spec.rb b/spec/lib/backup/object_backup_spec.rb
deleted file mode 100644
index 85658173b0e..00000000000
--- a/spec/lib/backup/object_backup_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.shared_examples 'backup object' do |setting|
- let(:progress) { StringIO.new }
- let(:backup_path) { "/var/#{setting}" }
-
- subject(:backup) { described_class.new(progress) }
-
- describe '#dump' do
- before do
- allow(File).to receive(:realpath).and_call_original
- allow(File).to receive(:realpath).with(backup_path).and_return(backup_path)
- allow(File).to receive(:realpath).with("#{backup_path}/..").and_return('/var')
- allow(Settings.send(setting)).to receive(:storage_path).and_return(backup_path)
- end
-
- it 'uses the correct storage dir in tar command and excludes tmp', :aggregate_failures do
- expect(backup).to receive(:tar).and_return('blabla-tar')
- expect(backup).to receive(:run_pipeline!).with([%W(blabla-tar --exclude=lost+found --exclude=./tmp -C #{backup_path} -cf - .), 'gzip -c -1'], any_args).and_return([[true, true], ''])
- expect(backup).to receive(:pipeline_succeeded?).and_return(true)
-
- backup.dump('backup_object.tar.gz')
- end
- end
-end
-
-RSpec.describe Backup::Packages do
- it_behaves_like 'backup object', 'packages'
-end
-
-RSpec.describe Backup::TerraformState do
- it_behaves_like 'backup object', 'terraform_state'
-end
diff --git a/spec/lib/backup/pages_spec.rb b/spec/lib/backup/pages_spec.rb
deleted file mode 100644
index 095dda61cf4..00000000000
--- a/spec/lib/backup/pages_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Backup::Pages do
- let(:progress) { StringIO.new }
-
- subject { described_class.new(progress) }
-
- before do
- allow(File).to receive(:realpath).with("/var/gitlab-pages").and_return("/var/gitlab-pages")
- allow(File).to receive(:realpath).with("/var/gitlab-pages/..").and_return("/var")
- end
-
- describe '#dump' do
- it 'excludes tmp from backup tar' do
- allow(Gitlab.config.pages).to receive(:path) { '/var/gitlab-pages' }
-
- expect(subject).to receive(:tar).and_return('blabla-tar')
- expect(subject).to receive(:run_pipeline!).with([%w(blabla-tar --exclude=lost+found --exclude=./@pages.tmp -C /var/gitlab-pages -cf - .), 'gzip -c -1'], any_args).and_return([[true, true], ''])
- expect(subject).to receive(:pipeline_succeeded?).and_return(true)
- subject.dump('pages.tar.gz')
- end
- end
-end
diff --git a/spec/lib/backup/repositories_spec.rb b/spec/lib/backup/repositories_spec.rb
index db3e507596f..c6f611e727c 100644
--- a/spec/lib/backup/repositories_spec.rb
+++ b/spec/lib/backup/repositories_spec.rb
@@ -4,18 +4,14 @@ require 'spec_helper'
RSpec.describe Backup::Repositories do
let(:progress) { spy(:stdout) }
- let(:parallel_enqueue) { true }
- let(:strategy) { spy(:strategy, parallel_enqueue?: parallel_enqueue) }
- let(:max_concurrency) { 1 }
- let(:max_storage_concurrency) { 1 }
+ let(:strategy) { spy(:strategy) }
let(:destination) { 'repositories' }
+ let(:backup_id) { 'backup_id' }
subject do
described_class.new(
progress,
- strategy: strategy,
- max_concurrency: max_concurrency,
- max_storage_concurrency: max_storage_concurrency
+ strategy: strategy
)
end
@@ -27,9 +23,9 @@ RSpec.describe Backup::Repositories do
project_snippet = create(:project_snippet, :repository, project: project)
personal_snippet = create(:personal_snippet, :repository, author: project.first_owner)
- subject.dump(destination)
+ subject.dump(destination, backup_id)
- expect(strategy).to have_received(:start).with(:create, destination)
+ expect(strategy).to have_received(:start).with(:create, destination, backup_id: backup_id)
expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::PROJECT)
expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::WIKI)
expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::DESIGN)
@@ -51,139 +47,30 @@ RSpec.describe Backup::Repositories do
it_behaves_like 'creates repository bundles'
end
- context 'no concurrency' do
- it 'creates the expected number of threads' do
- expect(Thread).not_to receive(:new)
+ describe 'command failure' do
+ it 'enqueue_project raises an error' do
+ allow(strategy).to receive(:enqueue).with(anything, Gitlab::GlRepository::PROJECT).and_raise(IOError)
- expect(strategy).to receive(:start).with(:create, destination)
- projects.each do |project|
- expect(strategy).to receive(:enqueue).with(project, Gitlab::GlRepository::PROJECT)
- end
- expect(strategy).to receive(:finish!)
-
- subject.dump(destination)
- end
-
- describe 'command failure' do
- it 'enqueue_project raises an error' do
- allow(strategy).to receive(:enqueue).with(anything, Gitlab::GlRepository::PROJECT).and_raise(IOError)
-
- expect { subject.dump(destination) }.to raise_error(IOError)
- end
-
- it 'project query raises an error' do
- allow(Project).to receive_message_chain(:includes, :find_each).and_raise(ActiveRecord::StatementTimeout)
-
- expect { subject.dump(destination) }.to raise_error(ActiveRecord::StatementTimeout)
- end
+ expect { subject.dump(destination, backup_id) }.to raise_error(IOError)
end
- it 'avoids N+1 database queries' do
- control_count = ActiveRecord::QueryRecorder.new do
- subject.dump(destination)
- end.count
+ it 'project query raises an error' do
+ allow(Project).to receive_message_chain(:includes, :find_each).and_raise(ActiveRecord::StatementTimeout)
- create_list(:project, 2, :repository)
-
- expect do
- subject.dump(destination)
- end.not_to exceed_query_limit(control_count)
+ expect { subject.dump(destination, backup_id) }.to raise_error(ActiveRecord::StatementTimeout)
end
end
- context 'concurrency with a strategy without parallel enqueueing support' do
- let(:parallel_enqueue) { false }
- let(:max_concurrency) { 2 }
- let(:max_storage_concurrency) { 2 }
-
- it 'enqueues all projects sequentially' do
- expect(Thread).not_to receive(:new)
-
- expect(strategy).to receive(:start).with(:create, destination)
- projects.each do |project|
- expect(strategy).to receive(:enqueue).with(project, Gitlab::GlRepository::PROJECT)
- end
- expect(strategy).to receive(:finish!)
-
- subject.dump(destination)
- end
- end
-
- [4, 10].each do |max_storage_concurrency|
- context "max_storage_concurrency #{max_storage_concurrency}", quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/241701' do
- let(:storage_keys) { %w[default test_second_storage] }
- let(:max_storage_concurrency) { max_storage_concurrency }
-
- before do
- allow(Gitlab.config.repositories.storages).to receive(:keys).and_return(storage_keys)
- end
-
- it 'creates the expected number of threads' do
- expect(Thread).to receive(:new)
- .exactly(storage_keys.length * (max_storage_concurrency + 1)).times
- .and_call_original
+ it 'avoids N+1 database queries' do
+ control_count = ActiveRecord::QueryRecorder.new do
+ subject.dump(destination, backup_id)
+ end.count
- expect(strategy).to receive(:start).with(:create, destination)
- projects.each do |project|
- expect(strategy).to receive(:enqueue).with(project, Gitlab::GlRepository::PROJECT)
- end
- expect(strategy).to receive(:finish!)
+ create_list(:project, 2, :repository)
- subject.dump(destination)
- end
-
- context 'with extra max concurrency' do
- let(:max_concurrency) { 3 }
-
- it 'creates the expected number of threads' do
- expect(Thread).to receive(:new)
- .exactly(storage_keys.length * (max_storage_concurrency + 1)).times
- .and_call_original
-
- expect(strategy).to receive(:start).with(:create, destination)
- projects.each do |project|
- expect(strategy).to receive(:enqueue).with(project, Gitlab::GlRepository::PROJECT)
- end
- expect(strategy).to receive(:finish!)
-
- subject.dump(destination)
- end
- end
-
- describe 'command failure' do
- it 'enqueue_project raises an error' do
- allow(strategy).to receive(:enqueue).and_raise(IOError)
-
- expect { subject.dump(destination) }.to raise_error(IOError)
- end
-
- it 'project query raises an error' do
- allow(Project).to receive_message_chain(:for_repository_storage, :includes, :find_each).and_raise(ActiveRecord::StatementTimeout)
-
- expect { subject.dump(destination) }.to raise_error(ActiveRecord::StatementTimeout)
- end
-
- context 'misconfigured storages' do
- let(:storage_keys) { %w[test_second_storage] }
-
- it 'raises an error' do
- expect { subject.dump(destination) }.to raise_error(Backup::Error, 'repositories.storages in gitlab.yml is misconfigured')
- end
- end
- end
-
- it 'avoids N+1 database queries' do
- control_count = ActiveRecord::QueryRecorder.new do
- subject.dump(destination)
- end.count
-
- create_list(:project, 2, :repository)
-
- expect do
- subject.dump(destination)
- end.not_to exceed_query_limit(control_count)
- end
- end
+ expect do
+ subject.dump(destination, backup_id)
+ end.not_to exceed_query_limit(control_count)
end
end
diff --git a/spec/lib/backup/task_spec.rb b/spec/lib/backup/task_spec.rb
index b0eb885d3f4..80f1fe01b78 100644
--- a/spec/lib/backup/task_spec.rb
+++ b/spec/lib/backup/task_spec.rb
@@ -7,15 +7,9 @@ RSpec.describe Backup::Task do
subject { described_class.new(progress) }
- describe '#human_name' do
- it 'must be implemented by the subclass' do
- expect { subject.human_name }.to raise_error(NotImplementedError)
- end
- end
-
describe '#dump' do
it 'must be implemented by the subclass' do
- expect { subject.dump('some/path') }.to raise_error(NotImplementedError)
+ expect { subject.dump('some/path', 'backup_id') }.to raise_error(NotImplementedError)
end
end
diff --git a/spec/lib/backup/uploads_spec.rb b/spec/lib/backup/uploads_spec.rb
deleted file mode 100644
index 0cfc80a9cb9..00000000000
--- a/spec/lib/backup/uploads_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Backup::Uploads do
- let(:progress) { StringIO.new }
-
- subject(:backup) { described_class.new(progress) }
-
- describe '#dump' do
- before do
- allow(File).to receive(:realpath).and_call_original
- allow(File).to receive(:realpath).with('/var/uploads').and_return('/var/uploads')
- allow(File).to receive(:realpath).with('/var/uploads/..').and_return('/var')
- allow(Gitlab.config.uploads).to receive(:storage_path) { '/var' }
- end
-
- it 'excludes tmp from backup tar' do
- expect(backup).to receive(:tar).and_return('blabla-tar')
- expect(backup).to receive(:run_pipeline!).with([%w(blabla-tar --exclude=lost+found --exclude=./tmp -C /var/uploads -cf - .), 'gzip -c -1'], any_args).and_return([[true, true], ''])
- expect(backup).to receive(:pipeline_succeeded?).and_return(true)
- backup.dump('uploads.tar.gz')
- end
- end
-end
diff --git a/spec/lib/banzai/filter/custom_emoji_filter_spec.rb b/spec/lib/banzai/filter/custom_emoji_filter_spec.rb
index 94e77663d0f..6e29b910a6c 100644
--- a/spec/lib/banzai/filter/custom_emoji_filter_spec.rb
+++ b/spec/lib/banzai/filter/custom_emoji_filter_spec.rb
@@ -18,31 +18,30 @@ RSpec.describe Banzai::Filter::CustomEmojiFilter do
doc = filter('<p>:tanuki:</p>', project: project)
expect(doc.css('gl-emoji').first.attributes['title'].value).to eq('tanuki')
- expect(doc.css('gl-emoji img').size).to eq 1
end
it 'correctly uses the custom emoji URL' do
doc = filter('<p>:tanuki:</p>')
- expect(doc.css('img').first.attributes['src'].value).to eq(custom_emoji.file)
+ expect(doc.css('gl-emoji').first.attributes['data-fallback-src'].value).to eq(custom_emoji.file)
end
it 'matches multiple same custom emoji' do
doc = filter(':tanuki: :tanuki:')
- expect(doc.css('img').size).to eq 2
+ expect(doc.css('gl-emoji').size).to eq 2
end
it 'matches multiple custom emoji' do
doc = filter(':tanuki: (:happy_tanuki:)')
- expect(doc.css('img').size).to eq 2
+ expect(doc.css('gl-emoji').size).to eq 2
end
it 'does not match enclosed colons' do
doc = filter('tanuki:tanuki:')
- expect(doc.css('img').size).to be 0
+ expect(doc.css('gl-emoji').size).to be 0
end
it 'does not do N+1 query' do
diff --git a/spec/lib/banzai/filter/image_link_filter_spec.rb b/spec/lib/banzai/filter/image_link_filter_spec.rb
index 238c3cdb9c1..6326d894b08 100644
--- a/spec/lib/banzai/filter/image_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/image_link_filter_spec.rb
@@ -46,6 +46,16 @@ RSpec.describe Banzai::Filter::ImageLinkFilter do
expect(doc.at_css('img')['data-canonical-src']).to eq doc.at_css('a')['data-canonical-src']
end
+ it 'moves the data-diagram* attributes' do
+ doc = filter(%q(<img class="plantuml" src="http://localhost:8080/png/U9npoazIqBLJ24uiIbImKl18pSd91m0rkGMq" data-diagram="plantuml" data-diagram-src="data:text/plain;base64,Qm9iIC0+IFNhcmEgOiBIZWxsbw==">), context)
+
+ expect(doc.at_css('a')['data-diagram']).to eq "plantuml"
+ expect(doc.at_css('a')['data-diagram-src']).to eq "data:text/plain;base64,Qm9iIC0+IFNhcmEgOiBIZWxsbw=="
+
+ expect(doc.at_css('a img')['data-diagram']).to be_nil
+ expect(doc.at_css('a img')['data-diagram-src']).to be_nil
+ end
+
it 'adds no-attachment icon class to the link' do
doc = filter(image(path), context)
diff --git a/spec/lib/banzai/filter/kroki_filter_spec.rb b/spec/lib/banzai/filter/kroki_filter_spec.rb
index c9594ac702d..1fb61ad1991 100644
--- a/spec/lib/banzai/filter/kroki_filter_spec.rb
+++ b/spec/lib/banzai/filter/kroki_filter_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Banzai::Filter::KrokiFilter do
stub_application_setting(kroki_enabled: true, kroki_url: "http://localhost:8000")
doc = filter("<pre lang='nomnoml'><code>[Pirate|eyeCount: Int|raid();pillage()|\n [beard]--[parrot]\n [beard]-:>[foul mouth]\n]</code></pre>")
- expect(doc.to_s).to eq '<img class="js-render-kroki" src="http://localhost:8000/nomnoml/svg/eNqLDsgsSixJrUmtTHXOL80rsVLwzCupKUrMTNHQtC7IzMlJTE_V0KzhUlCITkpNLEqJ1dWNLkgsKsoviUUSs7KLTssvzVHIzS8tyYjligUAMhEd0g==">'
+ expect(doc.to_s).to eq '<img src="http://localhost:8000/nomnoml/svg/eNqLDsgsSixJrUmtTHXOL80rsVLwzCupKUrMTNHQtC7IzMlJTE_V0KzhUlCITkpNLEqJ1dWNLkgsKsoviUUSs7KLTssvzVHIzS8tyYjligUAMhEd0g==" class="js-render-kroki" data-diagram="nomnoml" data-diagram-src="data:text/plain;base64,W1BpcmF0ZXxleWVDb3VudDogSW50fHJhaWQoKTtwaWxsYWdlKCl8CiAgW2JlYXJkXS0tW3BhcnJvdF0KICBbYmVhcmRdLTo+W2ZvdWwgbW91dGhdCl0=">'
end
it 'replaces nomnoml pre tag with img tag if both kroki and plantuml are enabled' do
@@ -19,7 +19,7 @@ RSpec.describe Banzai::Filter::KrokiFilter do
plantuml_url: "http://localhost:8080")
doc = filter("<pre lang='nomnoml'><code>[Pirate|eyeCount: Int|raid();pillage()|\n [beard]--[parrot]\n [beard]-:>[foul mouth]\n]</code></pre>")
- expect(doc.to_s).to eq '<img class="js-render-kroki" src="http://localhost:8000/nomnoml/svg/eNqLDsgsSixJrUmtTHXOL80rsVLwzCupKUrMTNHQtC7IzMlJTE_V0KzhUlCITkpNLEqJ1dWNLkgsKsoviUUSs7KLTssvzVHIzS8tyYjligUAMhEd0g==">'
+ expect(doc.to_s).to eq '<img src="http://localhost:8000/nomnoml/svg/eNqLDsgsSixJrUmtTHXOL80rsVLwzCupKUrMTNHQtC7IzMlJTE_V0KzhUlCITkpNLEqJ1dWNLkgsKsoviUUSs7KLTssvzVHIzS8tyYjligUAMhEd0g==" class="js-render-kroki" data-diagram="nomnoml" data-diagram-src="data:text/plain;base64,W1BpcmF0ZXxleWVDb3VudDogSW50fHJhaWQoKTtwaWxsYWdlKCl8CiAgW2JlYXJkXS0tW3BhcnJvdF0KICBbYmVhcmRdLTo+W2ZvdWwgbW91dGhdCl0=">'
end
it 'does not replace nomnoml pre tag with img tag if kroki is disabled' do
@@ -44,6 +44,6 @@ RSpec.describe Banzai::Filter::KrokiFilter do
text = '[Pirate|eyeCount: Int|raid();pillage()|\n [beard]--[parrot]\n [beard]-:>[foul mouth]\n]' * 25
doc = filter("<pre lang='nomnoml'><code>#{text}</code></pre>")
- expect(doc.to_s).to eq '<img class="js-render-kroki" src="http://localhost:8000/nomnoml/svg/eNqLDsgsSixJrUmtTHXOL80rsVLwzCupKUrMTNHQtC7IzMlJTE_V0KyJyVNQiE5KTSxKidXVjS5ILCrKL4lFFrSyi07LL81RyM0vLckAysRGjxo8avCowaMGjxo8avCowaMGU8lgAE7mIdc=" hidden>'
+ expect(doc.to_s).to start_with '<img src="http://localhost:8000/nomnoml/svg/eNqLDsgsSixJrUmtTHXOL80rsVLwzCupKUrMTNHQtC7IzMlJTE_V0KyJyVNQiE5KTSxKidXVjS5ILCrKL4lFFrSyi07LL81RyM0vLckAysRGjxo8avCowaMGjxo8avCowaMGU8lgAE7mIdc=" hidden="" class="js-render-kroki" data-diagram="nomnoml" data-diagram-src="data:text/plain;base64,W1BpcmF0ZXxleWVDb3VudDog'
end
end
diff --git a/spec/lib/banzai/filter/plantuml_filter_spec.rb b/spec/lib/banzai/filter/plantuml_filter_spec.rb
index 2d1a01116e0..dcfeb2ce3ba 100644
--- a/spec/lib/banzai/filter/plantuml_filter_spec.rb
+++ b/spec/lib/banzai/filter/plantuml_filter_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Banzai::Filter::PlantumlFilter do
stub_application_setting(plantuml_enabled: true, plantuml_url: "http://localhost:8080")
input = '<pre lang="plantuml"><code>Bob -> Sara : Hello</code></pre>'
- output = '<div class="imageblock"><div class="content"><img class="plantuml" src="http://localhost:8080/png/U9npoazIqBLJ24uiIbImKl18pSd91m0rkGMq"></div></div>'
+ output = '<img class="plantuml" src="http://localhost:8080/png/U9npoazIqBLJ24uiIbImKl18pSd91m0rkGMq" data-diagram="plantuml" data-diagram-src="data:text/plain;base64,Qm9iIC0+IFNhcmEgOiBIZWxsbw==">'
doc = filter(input)
expect(doc.to_s).to eq output
@@ -29,7 +29,7 @@ RSpec.describe Banzai::Filter::PlantumlFilter do
stub_application_setting(plantuml_enabled: true, plantuml_url: "invalid")
input = '<pre lang="plantuml"><code>Bob -> Sara : Hello</code></pre>'
- output = '<div class="listingblock"><div class="content"><pre class="plantuml plantuml-error"> Error: cannot connect to PlantUML server at "invalid"</pre></div></div>'
+ output = '<pre lang="plantuml"><code>Bob -&gt; Sara : Hello</code></pre>'
doc = filter(input)
expect(doc.to_s).to eq output
diff --git a/spec/lib/bulk_imports/common/pipelines/entity_finisher_spec.rb b/spec/lib/bulk_imports/common/pipelines/entity_finisher_spec.rb
index c1a9ea7b7e2..f03a178b993 100644
--- a/spec/lib/bulk_imports/common/pipelines/entity_finisher_spec.rb
+++ b/spec/lib/bulk_imports/common/pipelines/entity_finisher_spec.rb
@@ -21,6 +21,8 @@ RSpec.describe BulkImports::Common::Pipelines::EntityFinisher do
)
end
+ expect(context.portable).to receive(:try).with(:after_import)
+
expect { subject.run }
.to change(entity, :status_name).to(:finished)
end
diff --git a/spec/lib/bulk_imports/groups/stage_spec.rb b/spec/lib/bulk_imports/groups/stage_spec.rb
index b6bb8a7d195..645dee4a6f1 100644
--- a/spec/lib/bulk_imports/groups/stage_spec.rb
+++ b/spec/lib/bulk_imports/groups/stage_spec.rb
@@ -3,7 +3,10 @@
require 'spec_helper'
RSpec.describe BulkImports::Groups::Stage do
+ let(:ancestor) { create(:group) }
+ let(:group) { create(:group, parent: ancestor) }
let(:bulk_import) { build(:bulk_import) }
+ let(:entity) { build(:bulk_import_entity, bulk_import: bulk_import, group: group, destination_namespace: ancestor.full_path) }
let(:pipelines) do
[
@@ -19,26 +22,46 @@ RSpec.describe BulkImports::Groups::Stage do
end
it 'raises error when initialized without a BulkImport' do
- expect { described_class.new({}) }.to raise_error(ArgumentError, 'Expected an argument of type ::BulkImport')
+ expect { described_class.new({}) }.to raise_error(ArgumentError, 'Expected an argument of type ::BulkImports::Entity')
end
describe '.pipelines' do
it 'list all the pipelines with their stage number, ordered by stage' do
- expect(described_class.new(bulk_import).pipelines & pipelines).to contain_exactly(*pipelines)
- expect(described_class.new(bulk_import).pipelines.last.last).to eq(BulkImports::Common::Pipelines::EntityFinisher)
+ expect(described_class.new(entity).pipelines & pipelines).to contain_exactly(*pipelines)
+ expect(described_class.new(entity).pipelines.last.last).to eq(BulkImports::Common::Pipelines::EntityFinisher)
end
- it 'includes project entities pipeline' do
- stub_feature_flags(bulk_import_projects: true)
+ context 'when bulk_import_projects feature flag is enabled' do
+ it 'includes project entities pipeline' do
+ stub_feature_flags(bulk_import_projects: true)
- expect(described_class.new(bulk_import).pipelines).to include([1, BulkImports::Groups::Pipelines::ProjectEntitiesPipeline])
+ expect(described_class.new(entity).pipelines).to include([1, BulkImports::Groups::Pipelines::ProjectEntitiesPipeline])
+ end
+
+ context 'when feature flag is enabled on root ancestor level' do
+ it 'includes project entities pipeline' do
+ stub_feature_flags(bulk_import_projects: ancestor)
+
+ expect(described_class.new(entity).pipelines).to include([1, BulkImports::Groups::Pipelines::ProjectEntitiesPipeline])
+ end
+ end
+
+ context 'when destination namespace is not present' do
+ it 'includes project entities pipeline' do
+ stub_feature_flags(bulk_import_projects: true)
+
+ entity = create(:bulk_import_entity, destination_namespace: '')
+
+ expect(described_class.new(entity).pipelines).to include([1, BulkImports::Groups::Pipelines::ProjectEntitiesPipeline])
+ end
+ end
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.new(bulk_import).pipelines.flatten).not_to include(BulkImports::Groups::Pipelines::ProjectEntitiesPipeline)
+ expect(described_class.new(entity).pipelines.flatten).not_to include(BulkImports::Groups::Pipelines::ProjectEntitiesPipeline)
end
end
end
diff --git a/spec/lib/bulk_imports/projects/stage_spec.rb b/spec/lib/bulk_imports/projects/stage_spec.rb
index ef98613dc25..9fce30f3a81 100644
--- a/spec/lib/bulk_imports/projects/stage_spec.rb
+++ b/spec/lib/bulk_imports/projects/stage_spec.rb
@@ -34,9 +34,9 @@ RSpec.describe BulkImports::Projects::Stage do
end
subject do
- bulk_import = build(:bulk_import)
+ entity = build(:bulk_import_entity, :project_entity)
- described_class.new(bulk_import)
+ described_class.new(entity)
end
describe '#pipelines' do
diff --git a/spec/lib/container_registry/gitlab_api_client_spec.rb b/spec/lib/container_registry/gitlab_api_client_spec.rb
index 4fe229024e5..16d2c42f332 100644
--- a/spec/lib/container_registry/gitlab_api_client_spec.rb
+++ b/spec/lib/container_registry/gitlab_api_client_spec.rb
@@ -62,6 +62,7 @@ RSpec.describe ContainerRegistry::GitlabApiClient do
where(:status_code, :expected_result) do
200 | :already_imported
202 | :ok
+ 400 | :bad_request
401 | :unauthorized
404 | :not_found
409 | :already_being_imported
@@ -86,6 +87,7 @@ RSpec.describe ContainerRegistry::GitlabApiClient do
where(:status_code, :expected_result) do
200 | :already_imported
202 | :ok
+ 400 | :bad_request
401 | :unauthorized
404 | :not_found
409 | :already_being_imported
@@ -104,54 +106,106 @@ RSpec.describe ContainerRegistry::GitlabApiClient do
end
end
- describe '#import_status' do
- subject { client.import_status(path) }
+ describe '#cancel_repository_import' do
+ let(:force) { false }
- before do
- stub_import_status(path, status)
+ subject { client.cancel_repository_import(path, force: force) }
+
+ where(:status_code, :expected_result) do
+ 200 | :already_imported
+ 202 | :ok
+ 400 | :bad_request
+ 401 | :unauthorized
+ 404 | :not_found
+ 409 | :already_being_imported
+ 418 | :error
+ 424 | :pre_import_failed
+ 425 | :already_being_imported
+ 429 | :too_many_imports
end
- context 'with a status' do
+ with_them do
+ before do
+ stub_import_cancel(path, status_code, force: force)
+ end
+
+ it { is_expected.to eq({ status: expected_result, migration_state: nil }) }
+ end
+
+ context 'bad request' do
let(:status) { 'this_is_a_test' }
- it { is_expected.to eq(status) }
+ before do
+ stub_import_cancel(path, 400, status: status, force: force)
+ end
+
+ it { is_expected.to eq({ status: :bad_request, migration_state: status }) }
end
- context 'with no status' do
- let(:status) { nil }
+ context 'force cancel' do
+ let(:force) { true }
- it { is_expected.to eq('error') }
+ before do
+ stub_import_cancel(path, 202, force: force)
+ end
+
+ it { is_expected.to eq({ status: :ok, migration_state: nil }) }
end
end
- describe '#repository_details' do
- let(:path) { 'namespace/path/to/repository' }
- let(:response) { { foo: :bar, this: :is_a_test } }
- let(:with_size) { true }
-
- subject { client.repository_details(path, with_size: with_size) }
+ describe '#import_status' do
+ subject { client.import_status(path) }
- context 'with size' do
+ context 'with successful response' do
before do
- stub_repository_details(path, with_size: with_size, respond_with: response)
+ stub_import_status(path, status)
end
- it { is_expected.to eq(response.stringify_keys.deep_transform_values(&:to_s)) }
- end
+ context 'with a status' do
+ let(:status) { 'this_is_a_test' }
+
+ it { is_expected.to eq(status) }
+ end
+
+ context 'with no status' do
+ let(:status) { nil }
- context 'without_size' do
- let(:with_size) { false }
+ it { is_expected.to eq('error') }
+ end
+ end
+ context 'with non successful response' do
before do
- stub_repository_details(path, with_size: with_size, respond_with: response)
+ stub_import_status(path, nil, status_code: 404)
end
- it { is_expected.to eq(response.stringify_keys.deep_transform_values(&:to_s)) }
+ it { is_expected.to eq('pre_import_failed') }
+ end
+ end
+
+ describe '#repository_details' do
+ let(:path) { 'namespace/path/to/repository' }
+ let(:response) { { foo: :bar, this: :is_a_test } }
+
+ subject { client.repository_details(path, sizing: sizing) }
+
+ [:self, :self_with_descendants, nil].each do |size_type|
+ context "with sizing #{size_type}" do
+ let(:sizing) { size_type }
+
+ before do
+ stub_repository_details(path, sizing: sizing, respond_with: response)
+ end
+
+ it { is_expected.to eq(response.stringify_keys.deep_transform_values(&:to_s)) }
+ end
end
context 'with non successful response' do
+ let(:sizing) { nil }
+
before do
- stub_repository_details(path, with_size: with_size, status_code: 404)
+ stub_repository_details(path, sizing: sizing, status_code: 404)
end
it { is_expected.to eq({}) }
@@ -216,6 +270,54 @@ RSpec.describe ContainerRegistry::GitlabApiClient do
end
end
+ describe '.deduplicated_size' do
+ let(:path) { 'foo/bar' }
+ let(:response) { { 'size_bytes': 555 } }
+ let(:registry_enabled) { true }
+
+ subject { described_class.deduplicated_size(path) }
+
+ before do
+ stub_container_registry_config(enabled: registry_enabled, api_url: registry_api_url, key: 'spec/fixtures/x509_certificate_pk.key')
+ end
+
+ context 'with successful response' do
+ before do
+ expect(Auth::ContainerRegistryAuthenticationService).to receive(:pull_nested_repositories_access_token).with(path).and_return(token)
+ stub_repository_details(path, sizing: :self_with_descendants, status_code: 200, respond_with: response)
+ end
+
+ it { is_expected.to eq(555) }
+ end
+
+ context 'with unsuccessful response' do
+ before do
+ expect(Auth::ContainerRegistryAuthenticationService).to receive(:pull_nested_repositories_access_token).with(path).and_return(token)
+ stub_repository_details(path, sizing: :self_with_descendants, status_code: 404, respond_with: response)
+ end
+
+ it { is_expected.to eq(nil) }
+ end
+
+ context 'with the registry disabled' do
+ let(:registry_enabled) { false }
+
+ it { is_expected.to eq(nil) }
+ end
+
+ context 'with a nil path' do
+ let(:path) { nil }
+ let(:token) { nil }
+
+ before do
+ expect(Auth::ContainerRegistryAuthenticationService).not_to receive(:pull_nested_repositories_access_token)
+ stub_repository_details(path, sizing: :self_with_descendants, status_code: 401, respond_with: response)
+ end
+
+ it { is_expected.to eq(nil) }
+ end
+ end
+
def stub_pre_import(path, status_code, pre:)
import_type = pre ? 'pre' : 'final'
stub_request(:put, "#{registry_api_url}/gitlab/v1/import/#{path}/?import_type=#{import_type}")
@@ -230,21 +332,50 @@ RSpec.describe ContainerRegistry::GitlabApiClient do
.to_return(status: status_code, body: '')
end
- def stub_import_status(path, status)
+ def stub_import_status(path, status, status_code: 200)
stub_request(:get, "#{registry_api_url}/gitlab/v1/import/#{path}/")
.with(headers: { 'Accept' => described_class::JSON_TYPE, 'Authorization' => "bearer #{import_token}" })
.to_return(
- status: 200,
+ status: status_code,
body: { status: status }.to_json,
headers: { content_type: 'application/json' }
)
end
- def stub_repository_details(path, with_size: true, status_code: 200, respond_with: {})
+ def stub_import_cancel(path, http_status, status: nil, force: false)
+ body = {}
+
+ if http_status == 400
+ body = { status: status }
+ end
+
+ headers = {
+ 'Accept' => described_class::JSON_TYPE,
+ 'Authorization' => "bearer #{import_token}",
+ 'User-Agent' => "GitLab/#{Gitlab::VERSION}",
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3'
+ }
+
+ params = force ? '?force=true' : ''
+
+ stub_request(:delete, "#{registry_api_url}/gitlab/v1/import/#{path}/#{params}")
+ .with(headers: headers)
+ .to_return(
+ status: http_status,
+ body: body.to_json,
+ headers: { content_type: 'application/json' }
+ )
+ end
+
+ def stub_repository_details(path, sizing: nil, status_code: 200, respond_with: {})
url = "#{registry_api_url}/gitlab/v1/repositories/#{path}/"
- url += "?size=self" if with_size
+ url += "?size=#{sizing}" if sizing
+
+ headers = { 'Accept' => described_class::JSON_TYPE }
+ headers['Authorization'] = "bearer #{token}" if token
+
stub_request(:get, url)
- .with(headers: { 'Accept' => described_class::JSON_TYPE, 'Authorization' => "bearer #{token}" })
+ .with(headers: headers)
.to_return(status: status_code, body: respond_with.to_json, headers: { 'Content-Type' => described_class::JSON_TYPE })
end
end
diff --git a/spec/lib/container_registry/migration_spec.rb b/spec/lib/container_registry/migration_spec.rb
index ffbbfb249e3..6c0fc94e27f 100644
--- a/spec/lib/container_registry/migration_spec.rb
+++ b/spec/lib/container_registry/migration_spec.rb
@@ -37,8 +37,8 @@ RSpec.describe ContainerRegistry::Migration do
subject { described_class.enqueue_waiting_time }
where(:slow_enabled, :fast_enabled, :expected_result) do
- false | false | 1.hour
- true | false | 6.hours
+ false | false | 45.minutes
+ true | false | 165.minutes
false | true | 0
true | true | 0
end
@@ -154,15 +154,35 @@ RSpec.describe ContainerRegistry::Migration do
end
end
- describe '.target_plan' do
- let_it_be(:plan) { create(:plan) }
+ describe '.target_plans' do
+ subject { described_class.target_plans }
- before do
- stub_application_setting(container_registry_import_target_plan: plan.name)
+ where(:target_plan, :result) do
+ 'free' | described_class::FREE_TIERS
+ 'premium' | described_class::PREMIUM_TIERS
+ 'ultimate' | described_class::ULTIMATE_TIERS
end
- it 'returns the matching application_setting' do
- expect(described_class.target_plan).to eq(plan)
+ with_them do
+ before do
+ stub_application_setting(container_registry_import_target_plan: target_plan)
+ end
+
+ it { is_expected.to eq(result) }
+ end
+ end
+
+ describe '.all_plans?' do
+ subject { described_class.all_plans? }
+
+ it { is_expected.to eq(true) }
+
+ context 'feature flag disabled' do
+ before do
+ stub_feature_flags(container_registry_migration_phase2_all_plans: false)
+ end
+
+ it { is_expected.to eq(false) }
end
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 82db0f70f2e..d7bb0ca5c9a 100644
--- a/spec/lib/error_tracking/sentry_client/issue_spec.rb
+++ b/spec/lib/error_tracking/sentry_client/issue_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
describe '#list_issues' do
shared_examples 'issues have correct return type' do |klass|
it "returns objects of type #{klass}" do
- expect(subject[:issues]).to all( be_a(klass) )
+ expect(subject[:issues]).to all(be_a(klass))
end
end
@@ -41,10 +41,18 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
let(:cursor) { nil }
let(:sort) { 'last_seen' }
let(:sentry_api_response) { issues_sample_response }
- let(:sentry_request_url) { sentry_url + '/issues/?limit=20&query=is:unresolved' }
+ let(:sentry_request_url) { "#{sentry_url}/issues/?limit=20&query=is:unresolved" }
let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response) }
- subject { client.list_issues(issue_status: issue_status, limit: limit, search_term: search_term, sort: sort, cursor: cursor) }
+ subject do
+ client.list_issues(
+ issue_status: issue_status,
+ limit: limit,
+ search_term: search_term,
+ sort: sort,
+ cursor: cursor
+ )
+ end
it_behaves_like 'calls sentry api'
@@ -52,7 +60,7 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
it_behaves_like 'issues have correct length', 3
shared_examples 'has correct external_url' do
- context 'external_url' do
+ describe '#external_url' do
it 'is constructed correctly' do
expect(subject[:issues][0].external_url).to eq('https://sentrytest.gitlab.com/sentry-org/sentry-project/issues/11')
end
@@ -62,7 +70,8 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
context 'when response has a pagination info' do
let(:headers) do
{
- link: '<https://sentrytest.gitlab.com>; rel="previous"; results="true"; cursor="1573556671000:0:1", <https://sentrytest.gitlab.com>; rel="next"; results="true"; cursor="1572959139000:0:0"'
+ link: '<https://sentrytest.gitlab.com>; rel="previous"; results="true"; cursor="1573556671000:0:1",' \
+ '<https://sentrytest.gitlab.com>; rel="next"; results="true"; cursor="1572959139000:0:0"'
}
end
@@ -76,7 +85,7 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
end
end
- context 'error object created from sentry response' do
+ context 'when error object created from sentry response' do
using RSpec::Parameterized::TableSyntax
where(:error_object, :sentry_response) do
@@ -104,13 +113,13 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
it_behaves_like 'has correct external_url'
end
- context 'redirects' do
- let(:sentry_api_url) { sentry_url + '/issues/?limit=20&query=is:unresolved' }
+ context 'with redirects' do
+ let(:sentry_api_url) { "#{sentry_url}/issues/?limit=20&query=is:unresolved" }
it_behaves_like 'no Sentry redirects'
end
- context 'requests with sort parameter in sentry api' do
+ context 'with sort parameter in sentry api' do
let(:sentry_request_url) do
'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/' \
'issues/?limit=20&query=is:unresolved&sort=freq'
@@ -140,7 +149,7 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
end
end
- context 'Older sentry versions where keys are not present' do
+ context 'with older sentry versions where keys are not present' do
let(:sentry_api_response) do
issues_sample_response[0...1].map do |issue|
issue[:project].delete(:id)
@@ -156,7 +165,7 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
it_behaves_like 'has correct external_url'
end
- context 'essential keys missing in API response' do
+ context 'when essential keys are missing in API response' do
let(:sentry_api_response) do
issues_sample_response[0...1].map do |issue|
issue.except(:id)
@@ -164,16 +173,18 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
end
it 'raises exception' do
- expect { subject }.to raise_error(ErrorTracking::SentryClient::MissingKeysError, 'Sentry API response is missing keys. key not found: "id"')
+ expect { subject }.to raise_error(ErrorTracking::SentryClient::MissingKeysError,
+ 'Sentry API response is missing keys. key not found: "id"')
end
end
- context 'sentry api response too large' do
+ context 'when sentry api response is too large' do
it 'raises exception' do
- deep_size = double('Gitlab::Utils::DeepSize', valid?: false)
+ deep_size = instance_double(Gitlab::Utils::DeepSize, valid?: false)
allow(Gitlab::Utils::DeepSize).to receive(:new).with(sentry_api_response).and_return(deep_size)
- expect { subject }.to raise_error(ErrorTracking::SentryClient::ResponseInvalidSizeError, 'Sentry API response is too big. Limit is 1 MB.')
+ expect { subject }.to raise_error(ErrorTracking::SentryClient::ResponseInvalidSizeError,
+ 'Sentry API response is too big. Limit is 1 MB.')
end
end
@@ -212,7 +223,7 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
subject { client.issue_details(issue_id: issue_id) }
- context 'error object created from sentry response' do
+ context 'with error object created from sentry response' do
using RSpec::Parameterized::TableSyntax
where(:error_object, :sentry_response) do
@@ -298,17 +309,16 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
describe '#update_issue' do
let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0' }
let(:sentry_request_url) { "#{sentry_url}/issues/#{issue_id}/" }
-
- before do
- stub_sentry_request(sentry_request_url, :put)
- end
-
let(:params) do
{
status: 'resolved'
}
end
+ before do
+ stub_sentry_request(sentry_request_url, :put)
+ end
+
subject { client.update_issue(issue_id: issue_id, params: params) }
it_behaves_like 'calls sentry api' do
@@ -319,7 +329,7 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
expect(subject).to be_truthy
end
- context 'error encountered' do
+ context 'when error is encountered' do
let(:error) { StandardError.new('error') }
before do
diff --git a/spec/lib/gitlab/application_context_spec.rb b/spec/lib/gitlab/application_context_spec.rb
index 55f5ae7d7dc..f9e18a65af4 100644
--- a/spec/lib/gitlab/application_context_spec.rb
+++ b/spec/lib/gitlab/application_context_spec.rb
@@ -146,7 +146,8 @@ RSpec.describe Gitlab::ApplicationContext do
where(:provided_options, :client) do
[:remote_ip] | :remote_ip
[:remote_ip, :runner] | :runner
- [:remote_ip, :runner, :user] | :user
+ [:remote_ip, :runner, :user] | :runner
+ [:remote_ip, :user] | :user
end
with_them do
@@ -195,6 +196,16 @@ RSpec.describe Gitlab::ApplicationContext do
expect(result(context)).to include(project: nil)
end
end
+
+ context 'when using job context' do
+ let_it_be(:job) { create(:ci_build, :pending, :queued, user: user, project: project) }
+
+ it 'sets expected values' do
+ context = described_class.new(job: job)
+
+ expect(result(context)).to include(job_id: job.id, project: project.full_path, pipeline_id: job.pipeline_id)
+ end
+ end
end
describe '#use' do
diff --git a/spec/lib/gitlab/auth/o_auth/user_spec.rb b/spec/lib/gitlab/auth/o_auth/user_spec.rb
index 1a9e2f02de6..6cb9085c3ad 100644
--- a/spec/lib/gitlab/auth/o_auth/user_spec.rb
+++ b/spec/lib/gitlab/auth/o_auth/user_spec.rb
@@ -6,11 +6,15 @@ RSpec.describe Gitlab::Auth::OAuth::User do
include LdapHelpers
let(:oauth_user) { described_class.new(auth_hash) }
+ let(:oauth_user_2) { described_class.new(auth_hash_2) }
let(:gl_user) { oauth_user.gl_user }
+ let(:gl_user_2) { oauth_user_2.gl_user }
let(:uid) { 'my-uid' }
+ let(:uid_2) { 'my-uid-2' }
let(:dn) { 'uid=user1,ou=people,dc=example' }
let(:provider) { 'my-provider' }
let(:auth_hash) { OmniAuth::AuthHash.new(uid: uid, provider: provider, info: info_hash) }
+ let(:auth_hash_2) { OmniAuth::AuthHash.new(uid: uid_2, provider: provider, info: info_hash) }
let(:info_hash) do
{
nickname: '-john+gitlab-ETC%.git@gmail.com',
@@ -24,6 +28,7 @@ RSpec.describe Gitlab::Auth::OAuth::User do
end
let(:ldap_user) { Gitlab::Auth::Ldap::Person.new(Net::LDAP::Entry.new, 'ldapmain') }
+ let(:ldap_user_2) { Gitlab::Auth::Ldap::Person.new(Net::LDAP::Entry.new, 'ldapmain') }
describe '.find_by_uid_and_provider' do
let(:dn) { 'CN=John Åström, CN=Users, DC=Example, DC=com' }
@@ -46,12 +51,12 @@ RSpec.describe Gitlab::Auth::OAuth::User do
let!(:existing_user) { create(:omniauth_user, extern_uid: 'my-uid', provider: 'my-provider') }
it "finds an existing user based on uid and provider (facebook)" do
- expect( oauth_user.persisted? ).to be_truthy
+ expect(oauth_user.persisted?).to be_truthy
end
it 'returns false if user is not found in database' do
allow(auth_hash).to receive(:uid).and_return('non-existing')
- expect( oauth_user.persisted? ).to be_falsey
+ expect(oauth_user.persisted?).to be_falsey
end
end
@@ -78,15 +83,27 @@ RSpec.describe Gitlab::Auth::OAuth::User do
context 'when signup is disabled' do
before do
stub_application_setting signup_enabled: false
+ stub_omniauth_config(allow_single_sign_on: [provider])
end
it 'creates the user' do
- stub_omniauth_config(allow_single_sign_on: [provider])
-
oauth_user.save # rubocop:disable Rails/SaveBang
expect(gl_user).to be_persisted
end
+
+ it 'does not repeat the default user password' do
+ oauth_user.save # rubocop:disable Rails/SaveBang
+ oauth_user_2.save # rubocop:disable Rails/SaveBang
+
+ expect(gl_user.password).not_to eq(gl_user_2.password)
+ end
+
+ it 'has the password length within specified range' do
+ oauth_user.save # rubocop:disable Rails/SaveBang
+
+ expect(gl_user.password.length).to be_between(Devise.password_length.min, Devise.password_length.max)
+ end
end
context 'when user confirmation email is enabled' do
@@ -330,6 +347,12 @@ RSpec.describe Gitlab::Auth::OAuth::User do
allow(ldap_user).to receive(:name) { 'John Doe' }
allow(ldap_user).to receive(:email) { ['johndoe@example.com', 'john2@example.com'] }
allow(ldap_user).to receive(:dn) { dn }
+
+ allow(ldap_user_2).to receive(:uid) { uid_2 }
+ allow(ldap_user_2).to receive(:username) { uid_2 }
+ allow(ldap_user_2).to receive(:name) { 'Beck Potter' }
+ allow(ldap_user_2).to receive(:email) { ['beckpotter@example.com', 'beck2@example.com'] }
+ allow(ldap_user_2).to receive(:dn) { dn }
end
context "and no account for the LDAP user" do
@@ -340,6 +363,14 @@ RSpec.describe Gitlab::Auth::OAuth::User do
oauth_user.save # rubocop:disable Rails/SaveBang
end
+ it 'does not repeat the default user password' do
+ allow(Gitlab::Auth::Ldap::Person).to receive(:find_by_uid).and_return(ldap_user_2)
+
+ oauth_user_2.save # rubocop:disable Rails/SaveBang
+
+ expect(gl_user.password).not_to eq(gl_user_2.password)
+ end
+
it "creates a user with dual LDAP and omniauth identities" do
expect(gl_user).to be_valid
expect(gl_user.username).to eql uid
@@ -609,6 +640,7 @@ RSpec.describe Gitlab::Auth::OAuth::User do
context 'signup with SAML' do
let(:provider) { 'saml' }
+ let(:block_auto_created_users) { false }
before do
stub_omniauth_config({
@@ -625,6 +657,13 @@ RSpec.describe Gitlab::Auth::OAuth::User do
it_behaves_like 'not being blocked on creation' do
let(:block_auto_created_users) { false }
end
+
+ it 'does not repeat the default user password' do
+ oauth_user.save # rubocop:disable Rails/SaveBang
+ oauth_user_2.save # rubocop:disable Rails/SaveBang
+
+ expect(gl_user.password).not_to eq(gl_user_2.password)
+ end
end
context 'signup with omniauth only' do
diff --git a/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb b/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb
index a7895623d6f..1158eedfe7c 100644
--- a/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::BackfillDraftStatusOnMergeRequests do
+RSpec.describe Gitlab::BackgroundMigration::BackfillDraftStatusOnMergeRequests, :migration, schema: 20220326161803 do
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
let(:merge_requests) { table(:merge_requests) }
@@ -50,5 +50,19 @@ RSpec.describe Gitlab::BackgroundMigration::BackfillDraftStatusOnMergeRequests d
subject.perform(mr_ids.first, mr_ids.last)
end
+
+ it_behaves_like 'marks background migration job records' do
+ let!(:non_eligible_mrs) do
+ Array.new(2) do
+ create_merge_request(
+ title: "Not a d-r-a-f-t 1",
+ draft: false,
+ state_id: 1
+ )
+ end
+ end
+
+ let(:arguments) { [non_eligible_mrs.first.id, non_eligible_mrs.last.id] }
+ end
end
end
diff --git a/spec/lib/gitlab/background_migration/backfill_group_features_spec.rb b/spec/lib/gitlab/background_migration/backfill_group_features_spec.rb
new file mode 100644
index 00000000000..4705f0d0ab9
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_group_features_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillGroupFeatures, :migration, schema: 20220302114046 do
+ let(:group_features) { table(:group_features) }
+ let(:namespaces) { table(:namespaces) }
+
+ subject { described_class.new(connection: ActiveRecord::Base.connection) }
+
+ describe '#perform' do
+ it 'creates settings for all group namespaces in range' do
+ namespaces.create!(id: 1, name: 'group1', path: 'group1', type: 'Group')
+ namespaces.create!(id: 2, name: 'user', path: 'user')
+ namespaces.create!(id: 3, name: 'group2', path: 'group2', type: 'Group')
+
+ # Checking that no error is raised if the group_feature for a group already exists
+ namespaces.create!(id: 4, name: 'group3', path: 'group3', type: 'Group')
+ group_features.create!(id: 1, group_id: 4)
+ expect(group_features.count).to eq 1
+
+ expect { subject.perform(1, 4, :namespaces, :id, 10, 0, 4) }.to change { group_features.count }.by(2)
+
+ expect(group_features.count).to eq 3
+ expect(group_features.all.pluck(:group_id)).to contain_exactly(1, 3, 4)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_incident_issue_escalation_statuses_spec.rb b/spec/lib/gitlab/background_migration/backfill_incident_issue_escalation_statuses_spec.rb
deleted file mode 100644
index 242da383453..00000000000
--- a/spec/lib/gitlab/background_migration/backfill_incident_issue_escalation_statuses_spec.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::BackfillIncidentIssueEscalationStatuses, schema: 20211214012507 do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:issues) { table(:issues) }
- let(:issuable_escalation_statuses) { table(:incident_management_issuable_escalation_statuses) }
-
- subject(:migration) { described_class.new }
-
- it 'correctly backfills issuable escalation status records' do
- namespace = namespaces.create!(name: 'foo', path: 'foo')
- project = projects.create!(namespace_id: namespace.id)
-
- issues.create!(project_id: project.id, title: 'issue 1', issue_type: 0) # non-incident issue
- issues.create!(project_id: project.id, title: 'incident 1', issue_type: 1)
- issues.create!(project_id: project.id, title: 'incident 2', issue_type: 1)
- incident_issue_existing_status = issues.create!(project_id: project.id, title: 'incident 3', issue_type: 1)
- issuable_escalation_statuses.create!(issue_id: incident_issue_existing_status.id)
-
- migration.perform(1, incident_issue_existing_status.id)
-
- expect(issuable_escalation_statuses.count).to eq(3)
- end
-end
diff --git a/spec/lib/gitlab/background_migration/backfill_issue_search_data_spec.rb b/spec/lib/gitlab/background_migration/backfill_issue_search_data_spec.rb
index b29d4c3583b..f98aea2dda7 100644
--- a/spec/lib/gitlab/background_migration/backfill_issue_search_data_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_issue_search_data_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::BackfillIssueSearchData do
+RSpec.describe Gitlab::BackgroundMigration::BackfillIssueSearchData, :migration, schema: 20220326161803 do
let(:namespaces_table) { table(:namespaces) }
let(:projects_table) { table(:projects) }
let(:issue_search_data_table) { table(:issue_search_data) }
diff --git a/spec/lib/gitlab/background_migration/backfill_namespace_id_for_project_route_spec.rb b/spec/lib/gitlab/background_migration/backfill_namespace_id_for_project_route_spec.rb
new file mode 100644
index 00000000000..2dcd4645c84
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_namespace_id_for_project_route_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillNamespaceIdForProjectRoute do
+ let(:migration) { described_class.new }
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:routes) { table(:routes) }
+
+ let(:namespace1) { namespaces.create!(name: 'batchtest1', type: 'Group', path: 'space1') }
+ let(:namespace2) { namespaces.create!(name: 'batchtest2', type: 'Group', parent_id: namespace1.id, path: 'space2') }
+ let(:namespace3) { namespaces.create!(name: 'batchtest3', type: 'Group', parent_id: namespace2.id, path: 'space3') }
+
+ let(:proj_namespace1) { namespaces.create!(name: 'proj1', path: 'proj1', type: 'Project', parent_id: namespace1.id) }
+ let(:proj_namespace2) { namespaces.create!(name: 'proj2', path: 'proj2', type: 'Project', parent_id: namespace2.id) }
+ let(:proj_namespace3) { namespaces.create!(name: 'proj3', path: 'proj3', type: 'Project', parent_id: namespace3.id) }
+ let(:proj_namespace4) { namespaces.create!(name: 'proj4', path: 'proj4', type: 'Project', parent_id: namespace3.id) }
+
+ # rubocop:disable Layout/LineLength
+ let(:proj1) { projects.create!(name: 'proj1', path: 'proj1', namespace_id: namespace1.id, project_namespace_id: proj_namespace1.id) }
+ let(:proj2) { projects.create!(name: 'proj2', path: 'proj2', namespace_id: namespace2.id, project_namespace_id: proj_namespace2.id) }
+ let(:proj3) { projects.create!(name: 'proj3', path: 'proj3', namespace_id: namespace3.id, project_namespace_id: proj_namespace3.id) }
+ let(:proj4) { projects.create!(name: 'proj4', path: 'proj4', namespace_id: namespace3.id, project_namespace_id: proj_namespace4.id) }
+ # rubocop:enable Layout/LineLength
+
+ let!(:namespace_route1) { routes.create!(path: 'space1', source_id: namespace1.id, source_type: 'Namespace') }
+ let!(:namespace_route2) { routes.create!(path: 'space1/space2', source_id: namespace2.id, source_type: 'Namespace') }
+ let!(:namespace_route3) { routes.create!(path: 'space1/space3', source_id: namespace3.id, source_type: 'Namespace') }
+
+ let!(:proj_route1) { routes.create!(path: 'space1/proj1', source_id: proj1.id, source_type: 'Project') }
+ let!(:proj_route2) { routes.create!(path: 'space1/space2/proj2', source_id: proj2.id, source_type: 'Project') }
+ let!(:proj_route3) { routes.create!(path: 'space1/space3/proj3', source_id: proj3.id, source_type: 'Project') }
+ let!(:proj_route4) { routes.create!(path: 'space1/space3/proj4', source_id: proj4.id, source_type: 'Project') }
+
+ subject(:perform_migration) { migration.perform(proj_route1.id, proj_route4.id, :routes, :id, 2, 0) }
+
+ it 'backfills namespace_id for the selected records', :aggregate_failures do
+ perform_migration
+
+ expected_namespaces = [proj_namespace1.id, proj_namespace2.id, proj_namespace3.id, proj_namespace4.id]
+
+ expected_projects = [proj_route1.id, proj_route2.id, proj_route3.id, proj_route4.id]
+ expect(routes.where.not(namespace_id: nil).pluck(:id)).to match_array(expected_projects)
+ expect(routes.where.not(namespace_id: nil).pluck(:namespace_id)).to match_array(expected_namespaces)
+ end
+
+ it 'tracks timings of queries' do
+ expect(migration.batch_metrics.timings).to be_empty
+
+ expect { perform_migration }.to change { migration.batch_metrics.timings }
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues_spec.rb b/spec/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues_spec.rb
new file mode 100644
index 00000000000..8d82c533d20
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillWorkItemTypeIdForIssues, :migration, schema: 20220326161803 do
+ subject(:migrate) { migration.perform(start_id, end_id, batch_table, batch_column, sub_batch_size, pause_ms, issue_type_enum[:issue], issue_type.id) }
+
+ let(:migration) { described_class.new }
+
+ let(:batch_table) { 'issues' }
+ let(:batch_column) { 'id' }
+ let(:sub_batch_size) { 2 }
+ let(:pause_ms) { 0 }
+
+ # let_it_be can't be used in migration specs because all tables but `work_item_types` are deleted after each spec
+ let(:issue_type_enum) { { issue: 0, incident: 1, test_case: 2, requirement: 3, task: 4 } }
+ let(:namespace) { table(:namespaces).create!(name: 'namespace', path: 'namespace') }
+ let(:project) { table(:projects).create!(namespace_id: namespace.id) }
+ let(:issues_table) { table(:issues) }
+ let(:issue_type) { table(:work_item_types).find_by!(namespace_id: nil, base_type: issue_type_enum[:issue]) }
+
+ let(:issue1) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:issue]) }
+ let(:issue2) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:issue]) }
+ let(:issue3) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:issue]) }
+ let(:incident1) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:incident]) }
+ # test_case and requirement are EE only, but enum values exist on the FOSS model
+ let(:test_case1) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:test_case]) }
+ let(:requirement1) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:requirement]) }
+
+ let(:start_id) { issue1.id }
+ let(:end_id) { requirement1.id }
+
+ let(:all_issues) { [issue1, issue2, issue3, incident1, test_case1, requirement1] }
+
+ it 'sets work_item_type_id only for the given type' do
+ expect(all_issues).to all(have_attributes(work_item_type_id: nil))
+
+ expect { migrate }.to make_queries_matching(/UPDATE \"issues\" SET "work_item_type_id"/, 2)
+ all_issues.each(&:reload)
+
+ expect([issue1, issue2, issue3]).to all(have_attributes(work_item_type_id: issue_type.id))
+ expect(all_issues - [issue1, issue2, issue3]).to all(have_attributes(work_item_type_id: nil))
+ end
+
+ it 'tracks timings of queries' do
+ expect(migration.batch_metrics.timings).to be_empty
+
+ expect { migrate }.to change { migration.batch_metrics.timings }
+ end
+
+ context 'when database timeouts' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(error_class: [ActiveRecord::StatementTimeout, ActiveRecord::QueryCanceled])
+
+ with_them do
+ it 'retries on timeout error' do
+ expect(migration).to receive(:update_batch).exactly(3).times.and_raise(error_class)
+ expect(migration).to receive(:sleep).with(30).twice
+
+ expect do
+ migrate
+ end.to raise_error(error_class)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy_spec.rb b/spec/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy_spec.rb
new file mode 100644
index 00000000000..3cba99bfe51
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy_spec.rb
@@ -0,0 +1,135 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::BackfillIssueWorkItemTypeBatchingStrategy, '#next_batch', schema: 20220326161803 do # rubocop:disable Layout/LineLength
+ # let! can't be used in migration specs because all tables but `work_item_types` are deleted after each spec
+ let!(:issue_type_enum) { { issue: 0, incident: 1, test_case: 2, requirement: 3, task: 4 } }
+ let!(:namespace) { table(:namespaces).create!(name: 'namespace', path: 'namespace') }
+ let!(:project) { table(:projects).create!(namespace_id: namespace.id) }
+ let!(:issues_table) { table(:issues) }
+ let!(:task_type) { table(:work_item_types).find_by!(namespace_id: nil, base_type: issue_type_enum[:task]) }
+
+ let!(:issue1) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:issue]) }
+ let!(:task1) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:task]) }
+ let!(:issue2) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:issue]) }
+ let!(:issue3) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:issue]) }
+ let!(:task2) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:task]) }
+ let!(:incident1) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:incident]) }
+ # test_case is EE only, but enum values exist on the FOSS model
+ let!(:test_case1) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:test_case]) }
+
+ let!(:task3) do
+ issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:task], work_item_type_id: task_type.id)
+ end
+
+ let!(:task4) { issues_table.create!(project_id: project.id, issue_type: issue_type_enum[:task]) }
+
+ let!(:batching_strategy) { described_class.new(connection: ActiveRecord::Base.connection) }
+
+ context 'when issue_type is issue' do
+ let(:job_arguments) { [issue_type_enum[:issue], 'irrelevant_work_item_id'] }
+
+ context 'when starting on the first batch' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = next_batch(issue1.id, 2)
+
+ expect(batch_bounds).to match_array([issue1.id, issue2.id])
+ end
+ end
+
+ context 'when additional batches remain' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = next_batch(issue2.id, 2)
+
+ expect(batch_bounds).to match_array([issue2.id, issue3.id])
+ end
+ end
+
+ context 'when on the final batch' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = next_batch(issue3.id, 2)
+
+ expect(batch_bounds).to match_array([issue3.id, issue3.id])
+ end
+ end
+
+ context 'when no additional batches remain' do
+ it 'returns nil' do
+ batch_bounds = next_batch(issue3.id + 1, 1)
+
+ expect(batch_bounds).to be_nil
+ end
+ end
+ end
+
+ context 'when issue_type is incident' do
+ let(:job_arguments) { [issue_type_enum[:incident], 'irrelevant_work_item_id'] }
+
+ context 'when starting on the first batch' do
+ it 'returns the bounds of the next batch with only one element' do
+ batch_bounds = next_batch(incident1.id, 2)
+
+ expect(batch_bounds).to match_array([incident1.id, incident1.id])
+ end
+ end
+ end
+
+ context 'when issue_type is requirement and there are no matching records' do
+ let(:job_arguments) { [issue_type_enum[:requirement], 'irrelevant_work_item_id'] }
+
+ context 'when starting on the first batch' do
+ it 'returns nil' do
+ batch_bounds = next_batch(1, 2)
+
+ expect(batch_bounds).to be_nil
+ end
+ end
+ end
+
+ context 'when issue_type is task' do
+ let(:job_arguments) { [issue_type_enum[:task], 'irrelevant_work_item_id'] }
+
+ context 'when starting on the first batch' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = next_batch(task1.id, 2)
+
+ expect(batch_bounds).to match_array([task1.id, task2.id])
+ end
+ end
+
+ context 'when additional batches remain' do
+ it 'returns the bounds of the next batch, does not skip records where FK is already set' do
+ batch_bounds = next_batch(task2.id, 2)
+
+ expect(batch_bounds).to match_array([task2.id, task3.id])
+ end
+ end
+
+ context 'when on the final batch' do
+ it 'returns the bounds of the next batch' do
+ batch_bounds = next_batch(task4.id, 2)
+
+ expect(batch_bounds).to match_array([task4.id, task4.id])
+ end
+ end
+
+ context 'when no additional batches remain' do
+ it 'returns nil' do
+ batch_bounds = next_batch(task4.id + 1, 1)
+
+ expect(batch_bounds).to be_nil
+ end
+ end
+ end
+
+ def next_batch(min_value, batch_size)
+ batching_strategy.next_batch(
+ :issues,
+ :id,
+ batch_min_value: min_value,
+ batch_size: batch_size,
+ job_arguments: job_arguments
+ )
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy_spec.rb b/spec/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy_spec.rb
index b01dd5b410e..dc0935efa94 100644
--- a/spec/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy_spec.rb
+++ b/spec/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::BackfillProjectNamespacePerGroupBatchingStrategy, '#next_batch' do
+RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::BackfillProjectNamespacePerGroupBatchingStrategy, '#next_batch', :migration, schema: 20220326161803 do
let!(:namespaces) { table(:namespaces) }
let!(:projects) { table(:projects) }
let!(:background_migrations) { table(:batched_background_migrations) }
diff --git a/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb b/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
index 4e0ebd4b692..521e2067744 100644
--- a/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
+++ b/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchi
context 'when starting on the first batch' do
it 'returns the bounds of the next batch' do
- batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace1.id, batch_size: 3, job_arguments: nil)
+ batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace1.id, batch_size: 3, job_arguments: [])
expect(batch_bounds).to eq([namespace1.id, namespace3.id])
end
@@ -23,7 +23,7 @@ RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchi
context 'when additional batches remain' do
it 'returns the bounds of the next batch' do
- batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace2.id, batch_size: 3, job_arguments: nil)
+ batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace2.id, batch_size: 3, job_arguments: [])
expect(batch_bounds).to eq([namespace2.id, namespace4.id])
end
@@ -31,7 +31,7 @@ RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchi
context 'when on the final batch' do
it 'returns the bounds of the next batch' do
- batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace4.id, batch_size: 3, job_arguments: nil)
+ batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace4.id, batch_size: 3, job_arguments: [])
expect(batch_bounds).to eq([namespace4.id, namespace4.id])
end
@@ -39,9 +39,30 @@ RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchi
context 'when no additional batches remain' do
it 'returns nil' do
- batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace4.id + 1, batch_size: 1, job_arguments: nil)
+ batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace4.id + 1, batch_size: 1, job_arguments: [])
expect(batch_bounds).to be_nil
end
end
+
+ context 'additional filters' do
+ let(:strategy_with_filters) do
+ Class.new(described_class) do
+ def apply_additional_filters(relation, job_arguments:)
+ min_id = job_arguments.first
+
+ relation.where.not(type: 'Project').where('id >= ?', min_id)
+ end
+ end
+ end
+
+ let(:batching_strategy) { strategy_with_filters.new(connection: ActiveRecord::Base.connection) }
+ let!(:namespace5) { namespaces.create!(name: 'batchtest5', path: 'batch-test5', type: 'Project') }
+
+ it 'applies additional filters' do
+ batch_bounds = batching_strategy.next_batch(:namespaces, :id, batch_min_value: namespace4.id, batch_size: 3, job_arguments: [1])
+
+ expect(batch_bounds).to eq([namespace4.id, namespace4.id])
+ end
+ end
end
diff --git a/spec/lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex_spec.rb b/spec/lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex_spec.rb
new file mode 100644
index 00000000000..d1ef7ca2188
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex_spec.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::CleanupDraftDataFromFaultyRegex, :migration, schema: 20220326161803 do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:merge_requests) { table(:merge_requests) }
+
+ let(:group) { namespaces.create!(name: 'gitlab', path: 'gitlab') }
+ let(:project) { projects.create!(namespace_id: group.id) }
+
+ let(:draft_prefixes) { ["[Draft]", "(Draft)", "Draft:", "Draft", "[WIP]", "WIP:", "WIP"] }
+
+ def create_merge_request(params)
+ common_params = {
+ target_project_id: project.id,
+ target_branch: 'feature1',
+ source_branch: 'master'
+ }
+
+ merge_requests.create!(common_params.merge(params))
+ end
+
+ context "mr.draft == true, and title matches the leaky regex and not the corrected regex" do
+ let(:mr_ids) { merge_requests.all.collect(&:id) }
+
+ before do
+ draft_prefixes.each do |prefix|
+ (1..4).each do |n|
+ create_merge_request(
+ title: "#{prefix} This is a title",
+ draft: true,
+ state_id: 1
+ )
+ end
+ end
+
+ create_merge_request(title: "This has draft in the title", draft: true, state_id: 1)
+ end
+
+ it "updates all open draft merge request's draft field to true" do
+ expect { subject.perform(mr_ids.first, mr_ids.last) }
+ .to change { MergeRequest.where(draft: true).count }
+ .by(-1)
+ end
+
+ it "marks successful slices as completed" do
+ expect(subject).to receive(:mark_job_as_succeeded).with(mr_ids.first, mr_ids.last)
+
+ subject.perform(mr_ids.first, mr_ids.last)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images_spec.rb b/spec/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images_spec.rb
index 04eb9ad475f..8a63673bf38 100644
--- a/spec/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images_spec.rb
+++ b/spec/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::DisableExpirationPoliciesLinkedToNoContainerImages do
+RSpec.describe Gitlab::BackgroundMigration::DisableExpirationPoliciesLinkedToNoContainerImages, :migration, schema: 20220326161803 do # rubocop:disable Layout/LineLength
let_it_be(:projects) { table(:projects) }
let_it_be(:container_expiration_policies) { table(:container_expiration_policies) }
let_it_be(:container_repositories) { table(:container_repositories) }
diff --git a/spec/lib/gitlab/background_migration/encrypt_static_object_token_spec.rb b/spec/lib/gitlab/background_migration/encrypt_static_object_token_spec.rb
index 94d9f4509a7..4e7b97d33f6 100644
--- a/spec/lib/gitlab/background_migration/encrypt_static_object_token_spec.rb
+++ b/spec/lib/gitlab/background_migration/encrypt_static_object_token_spec.rb
@@ -39,6 +39,14 @@ RSpec.describe Gitlab::BackgroundMigration::EncryptStaticObjectToken do
expect(new_state[user_with_encrypted_token.id]).to match_array([nil, 'encrypted'])
end
+ context 'when id range does not include existing user ids' do
+ let(:arguments) { [non_existing_record_id, non_existing_record_id.succ] }
+
+ it_behaves_like 'marks background migration job records' do
+ subject { described_class.new }
+ end
+ end
+
private
def create_user!(name:, token: nil, encrypted_token: nil)
diff --git a/spec/lib/gitlab/background_migration/fix_duplicate_project_name_and_path_spec.rb b/spec/lib/gitlab/background_migration/fix_duplicate_project_name_and_path_spec.rb
new file mode 100644
index 00000000000..65663d26f37
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/fix_duplicate_project_name_and_path_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::FixDuplicateProjectNameAndPath, :migration, schema: 20220325155953 do
+ let(:migration) { described_class.new }
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:routes) { table(:routes) }
+
+ let(:namespace1) { namespaces.create!(name: 'batchtest1', type: 'Group', path: 'batch-test1') }
+ let(:namespace2) { namespaces.create!(name: 'batchtest2', type: 'Group', parent_id: namespace1.id, path: 'batch-test2') }
+ let(:namespace3) { namespaces.create!(name: 'batchtest3', type: 'Group', parent_id: namespace2.id, path: 'batch-test3') }
+
+ let(:project_namespace2) { namespaces.create!(name: 'project2', path: 'project2', type: 'Project', parent_id: namespace2.id, visibility_level: 20) }
+ let(:project_namespace3) { namespaces.create!(name: 'project3', path: 'project3', type: 'Project', parent_id: namespace3.id, visibility_level: 20) }
+
+ let(:project1) { projects.create!(name: 'project1', path: 'project1', namespace_id: namespace1.id, visibility_level: 20) }
+ let(:project2) { projects.create!(name: 'project2', path: 'project2', namespace_id: namespace2.id, project_namespace_id: project_namespace2.id, visibility_level: 20) }
+ let(:project2_dup) { projects.create!(name: 'project2', path: 'project2', namespace_id: namespace2.id, visibility_level: 20) }
+ let(:project3) { projects.create!(name: 'project3', path: 'project3', namespace_id: namespace3.id, project_namespace_id: project_namespace3.id, visibility_level: 20) }
+ let(:project3_dup) { projects.create!(name: 'project3', path: 'project3', namespace_id: namespace3.id, visibility_level: 20) }
+
+ let!(:namespace_route1) { routes.create!(path: 'batch-test1', source_id: namespace1.id, source_type: 'Namespace') }
+ let!(:namespace_route2) { routes.create!(path: 'batch-test1/batch-test2', source_id: namespace2.id, source_type: 'Namespace') }
+ let!(:namespace_route3) { routes.create!(path: 'batch-test1/batch-test3', source_id: namespace3.id, source_type: 'Namespace') }
+
+ let!(:proj_route1) { routes.create!(path: 'batch-test1/project1', source_id: project1.id, source_type: 'Project') }
+ let!(:proj_route2) { routes.create!(path: 'batch-test1/batch-test2/project2', source_id: project2.id, source_type: 'Project') }
+ let!(:proj_route2_dup) { routes.create!(path: "batch-test1/batch-test2/project2-route-#{project2_dup.id}", source_id: project2_dup.id, source_type: 'Project') }
+ let!(:proj_route3) { routes.create!(path: 'batch-test1/batch-test3/project3', source_id: project3.id, source_type: 'Project') }
+ let!(:proj_route3_dup) { routes.create!(path: "batch-test1/batch-test3/project3-route-#{project3_dup.id}", source_id: project3_dup.id, source_type: 'Project') }
+
+ subject(:perform_migration) { migration.perform(projects.minimum(:id), projects.maximum(:id)) }
+
+ describe '#up' do
+ it 'backfills namespace_id for the selected records', :aggregate_failures do
+ expect(namespaces.where(type: 'Project').count).to eq(2)
+
+ perform_migration
+
+ expect(namespaces.where(type: 'Project').count).to eq(5)
+
+ expect(project1.reload.name).to eq("project1-#{project1.id}")
+ expect(project1.path).to eq('project1')
+
+ expect(project2.reload.name).to eq('project2')
+ expect(project2.path).to eq('project2')
+
+ expect(project2_dup.reload.name).to eq("project2-#{project2_dup.id}")
+ expect(project2_dup.path).to eq("project2-route-#{project2_dup.id}")
+
+ expect(project3.reload.name).to eq("project3")
+ expect(project3.path).to eq("project3")
+
+ expect(project3_dup.reload.name).to eq("project3-#{project3_dup.id}")
+ expect(project3_dup.path).to eq("project3-route-#{project3_dup.id}")
+
+ projects.all.each do |pr|
+ project_namespace = namespaces.find(pr.project_namespace_id)
+ expect(project_namespace).to be_in_sync_with_project(pr)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb b/spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb
new file mode 100644
index 00000000000..254b4fea698
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb
@@ -0,0 +1,135 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::MergeTopicsWithSameName, schema: 20220223124428 do
+ def set_avatar(topic_id, avatar)
+ topic = ::Projects::Topic.find(topic_id)
+ topic.avatar = avatar
+ topic.save!
+ topic.avatar.absolute_path
+ end
+
+ it 'merges project topics with same case insensitive name' 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, visibility_level: 20)
+ project_2 = projects.create!(namespace_id: group.id, visibility_level: 10)
+ project_3 = projects.create!(namespace_id: group.id, visibility_level: 0)
+ topic_1_keep = topics.create!(
+ name: 'topic1',
+ description: 'description 1 to keep',
+ total_projects_count: 2,
+ non_private_projects_count: 2
+ )
+ topic_1_remove = topics.create!(
+ name: 'TOPIC1',
+ description: 'description 1 to remove',
+ total_projects_count: 2,
+ non_private_projects_count: 1
+ )
+ topic_2_remove = topics.create!(
+ name: 'topic2',
+ total_projects_count: 0
+ )
+ topic_2_keep = topics.create!(
+ name: 'TOPIC2',
+ description: 'description 2 to keep',
+ total_projects_count: 1
+ )
+ topic_3_remove_1 = topics.create!(
+ name: 'topic3',
+ total_projects_count: 2,
+ non_private_projects_count: 1
+ )
+ topic_3_keep = topics.create!(
+ name: 'Topic3',
+ total_projects_count: 2,
+ non_private_projects_count: 2
+ )
+ topic_3_remove_2 = topics.create!(
+ name: 'TOPIC3',
+ description: 'description 3 to keep',
+ total_projects_count: 2,
+ non_private_projects_count: 1
+ )
+ topic_4_keep = topics.create!(
+ name: 'topic4'
+ )
+
+ project_topics_1 = []
+ project_topics_3 = []
+ project_topics_removed = []
+
+ project_topics_1 << project_topics.create!(topic_id: topic_1_keep.id, project_id: project_1.id)
+ project_topics_1 << project_topics.create!(topic_id: topic_1_keep.id, project_id: project_2.id)
+ project_topics_removed << project_topics.create!(topic_id: topic_1_remove.id, project_id: project_2.id)
+ project_topics_1 << project_topics.create!(topic_id: topic_1_remove.id, project_id: project_3.id)
+
+ project_topics_3 << project_topics.create!(topic_id: topic_3_keep.id, project_id: project_1.id)
+ project_topics_3 << project_topics.create!(topic_id: topic_3_keep.id, project_id: project_2.id)
+ project_topics_removed << project_topics.create!(topic_id: topic_3_remove_1.id, project_id: project_1.id)
+ project_topics_3 << project_topics.create!(topic_id: topic_3_remove_1.id, project_id: project_3.id)
+ project_topics_removed << project_topics.create!(topic_id: topic_3_remove_2.id, project_id: project_1.id)
+ project_topics_removed << project_topics.create!(topic_id: topic_3_remove_2.id, project_id: project_3.id)
+
+ avatar_paths = {
+ topic_1_keep: set_avatar(topic_1_keep.id, fixture_file_upload('spec/fixtures/avatars/avatar1.png')),
+ topic_1_remove: set_avatar(topic_1_remove.id, fixture_file_upload('spec/fixtures/avatars/avatar2.png')),
+ topic_2_remove: set_avatar(topic_2_remove.id, fixture_file_upload('spec/fixtures/avatars/avatar3.png')),
+ topic_3_remove_1: set_avatar(topic_3_remove_1.id, fixture_file_upload('spec/fixtures/avatars/avatar4.png')),
+ topic_3_remove_2: set_avatar(topic_3_remove_2.id, fixture_file_upload('spec/fixtures/avatars/avatar5.png'))
+ }
+
+ subject.perform(%w[topic1 topic2 topic3 topic4])
+
+ # Topics
+ [topic_1_keep, topic_2_keep, topic_3_keep, topic_4_keep].each(&:reload)
+ expect(topic_1_keep.name).to eq('topic1')
+ expect(topic_1_keep.description).to eq('description 1 to keep')
+ expect(topic_1_keep.total_projects_count).to eq(3)
+ expect(topic_1_keep.non_private_projects_count).to eq(2)
+ expect(topic_2_keep.name).to eq('TOPIC2')
+ expect(topic_2_keep.description).to eq('description 2 to keep')
+ expect(topic_2_keep.total_projects_count).to eq(0)
+ expect(topic_2_keep.non_private_projects_count).to eq(0)
+ expect(topic_3_keep.name).to eq('Topic3')
+ expect(topic_3_keep.description).to eq('description 3 to keep')
+ expect(topic_3_keep.total_projects_count).to eq(3)
+ expect(topic_3_keep.non_private_projects_count).to eq(2)
+ expect(topic_4_keep.reload.name).to eq('topic4')
+
+ [topic_1_remove, topic_2_remove, topic_3_remove_1, topic_3_remove_2].each do |topic|
+ expect { topic.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ # Topic avatars
+ expect(topic_1_keep.avatar).to eq('avatar1.png')
+ expect(File.exist?(::Projects::Topic.find(topic_1_keep.id).avatar.absolute_path)).to be_truthy
+ expect(topic_2_keep.avatar).to eq('avatar3.png')
+ expect(File.exist?(::Projects::Topic.find(topic_2_keep.id).avatar.absolute_path)).to be_truthy
+ expect(topic_3_keep.avatar).to eq('avatar4.png')
+ expect(File.exist?(::Projects::Topic.find(topic_3_keep.id).avatar.absolute_path)).to be_truthy
+
+ [:topic_1_remove, :topic_2_remove, :topic_3_remove_1, :topic_3_remove_2].each do |topic|
+ expect(File.exist?(avatar_paths[topic])).to be_falsey
+ end
+
+ # Project Topic assignments
+ project_topics_1.each do |project_topic|
+ expect(project_topic.reload.topic_id).to eq(topic_1_keep.id)
+ end
+
+ project_topics_3.each do |project_topic|
+ expect(project_topic.reload.topic_id).to eq(topic_3_keep.id)
+ end
+
+ project_topics_removed.each do |project_topic|
+ expect { project_topic.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category_spec.rb b/spec/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category_spec.rb
new file mode 100644
index 00000000000..8bc6bb8ae0a
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::MigrateShimoConfluenceIntegrationCategory, schema: 20220326161803 do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:integrations) { table(:integrations) }
+ let(:perform) { described_class.new.perform(1, 5) }
+
+ before do
+ namespace = namespaces.create!(name: 'test', path: 'test')
+ projects.create!(id: 1, namespace_id: namespace.id, name: 'gitlab', path: 'gitlab')
+ integrations.create!(id: 1, active: true, type_new: "Integrations::SlackSlashCommands",
+ category: 'chat', project_id: 1)
+ integrations.create!(id: 3, active: true, type_new: "Integrations::Confluence", category: 'common', project_id: 1)
+ integrations.create!(id: 5, active: true, type_new: "Integrations::Shimo", category: 'common', project_id: 1)
+ end
+
+ describe '#up' do
+ it 'updates category to third_party_wiki for Shimo and Confluence' do
+ perform
+
+ expect(integrations.where(category: 'third_party_wiki').count).to eq(2)
+ expect(integrations.where(category: 'chat').count).to eq(1)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/populate_container_repository_migration_plan_spec.rb b/spec/lib/gitlab/background_migration/populate_container_repository_migration_plan_spec.rb
new file mode 100644
index 00000000000..0463f5a0c0d
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/populate_container_repository_migration_plan_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::PopulateContainerRepositoryMigrationPlan, schema: 20220316202640 do
+ let_it_be(:container_repositories) { table(:container_repositories) }
+ let_it_be(:projects) { table(:projects) }
+ let_it_be(:namespaces) { table(:namespaces) }
+ let_it_be(:gitlab_subscriptions) { table(:gitlab_subscriptions) }
+ let_it_be(:plans) { table(:plans) }
+ let_it_be(:namespace_statistics) { table(:namespace_statistics) }
+
+ let!(:namepace1) { namespaces.create!(id: 1, type: 'Group', name: 'group1', path: 'group1', traversal_ids: [1]) }
+ let!(:namepace2) { namespaces.create!(id: 2, type: 'Group', name: 'group2', path: 'group2', traversal_ids: [2]) }
+ let!(:namepace3) { namespaces.create!(id: 3, type: 'Group', name: 'group3', path: 'group3', traversal_ids: [3]) }
+ let!(:sub_namespace) { namespaces.create!(id: 4, type: 'Group', name: 'group3', path: 'group3', parent_id: 1, traversal_ids: [1, 4]) }
+ let!(:plan1) { plans.create!(id: 1, name: 'plan1') }
+ let!(:plan2) { plans.create!(id: 2, name: 'plan2') }
+ let!(:gitlab_subscription1) { gitlab_subscriptions.create!(id: 1, namespace_id: 1, hosted_plan_id: 1) }
+ let!(:gitlab_subscription2) { gitlab_subscriptions.create!(id: 2, namespace_id: 2, hosted_plan_id: 2) }
+ let!(:project1) { projects.create!(id: 1, name: 'project1', path: 'project1', namespace_id: 4) }
+ let!(:project2) { projects.create!(id: 2, name: 'project2', path: 'project2', namespace_id: 2) }
+ let!(:project3) { projects.create!(id: 3, name: 'project3', path: 'project3', namespace_id: 3) }
+ let!(:container_repository1) { container_repositories.create!(id: 1, name: 'cr1', project_id: 1) }
+ let!(:container_repository2) { container_repositories.create!(id: 2, name: 'cr2', project_id: 2) }
+ let!(:container_repository3) { container_repositories.create!(id: 3, name: 'cr3', project_id: 3) }
+
+ let(:migration) { described_class.new }
+
+ subject do
+ migration.perform(1, 4)
+ end
+
+ it 'updates the migration_plan to match the actual plan', :aggregate_failures do
+ expect(Gitlab::Database::BackgroundMigrationJob).to receive(:mark_all_as_succeeded)
+ .with('PopulateContainerRepositoryMigrationPlan', [1, 4]).and_return(true)
+
+ subject
+
+ expect(container_repository1.reload.migration_plan).to eq('plan1')
+ expect(container_repository2.reload.migration_plan).to eq('plan2')
+ expect(container_repository3.reload.migration_plan).to eq(nil)
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/populate_namespace_statistics_spec.rb b/spec/lib/gitlab/background_migration/populate_namespace_statistics_spec.rb
new file mode 100644
index 00000000000..98b2bc437f3
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/populate_namespace_statistics_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::PopulateNamespaceStatistics do
+ let_it_be(:namespaces) { table(:namespaces) }
+ let_it_be(:namespace_statistics) { table(:namespace_statistics) }
+ let_it_be(:dependency_proxy_manifests) { table(:dependency_proxy_manifests) }
+ let_it_be(:dependency_proxy_blobs) { table(:dependency_proxy_blobs) }
+
+ let!(:group1) { namespaces.create!(id: 10, type: 'Group', name: 'group1', path: 'group1') }
+ let!(:group2) { namespaces.create!(id: 20, type: 'Group', name: 'group2', path: 'group2') }
+
+ let!(:group1_manifest) do
+ dependency_proxy_manifests.create!(group_id: 10, size: 20, file_name: 'test-file', file: 'test', digest: 'abc123')
+ end
+
+ let!(:group2_manifest) do
+ dependency_proxy_manifests.create!(group_id: 20, size: 20, file_name: 'test-file', file: 'test', digest: 'abc123')
+ end
+
+ let!(:group1_stats) { namespace_statistics.create!(id: 10, namespace_id: 10) }
+
+ let(:ids) { namespaces.pluck(:id) }
+ let(:statistics) { [] }
+
+ subject(:perform) { described_class.new.perform(ids, statistics) }
+
+ it 'creates/updates all namespace_statistics and updates root storage statistics', :aggregate_failures do
+ expect(Namespaces::ScheduleAggregationWorker).to receive(:perform_async).with(group1.id)
+ expect(Namespaces::ScheduleAggregationWorker).to receive(:perform_async).with(group2.id)
+
+ expect { perform }.to change(namespace_statistics, :count).from(1).to(2)
+
+ namespace_statistics.all.each do |stat|
+ expect(stat.dependency_proxy_size).to eq 20
+ expect(stat.storage_size).to eq 20
+ end
+ end
+
+ context 'when just a stat is passed' do
+ let(:statistics) { [:dependency_proxy_size] }
+
+ it 'calls the statistics update service with just that stat' do
+ expect(Groups::UpdateStatisticsService)
+ .to receive(:new)
+ .with(anything, statistics: [:dependency_proxy_size])
+ .twice.and_call_original
+
+ perform
+ end
+ end
+
+ context 'when a statistics update fails' do
+ before do
+ error_response = instance_double(ServiceResponse, message: 'an error', error?: true)
+
+ allow_next_instance_of(Groups::UpdateStatisticsService) do |instance|
+ allow(instance).to receive(:execute).and_return(error_response)
+ end
+ end
+
+ it 'logs an error' do
+ expect_next_instance_of(Gitlab::BackgroundMigration::Logger) do |instance|
+ expect(instance).to receive(:error).twice
+ end
+
+ perform
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/populate_vulnerability_reads_spec.rb b/spec/lib/gitlab/background_migration/populate_vulnerability_reads_spec.rb
index a265fa95b23..3de84a4e880 100644
--- a/spec/lib/gitlab/background_migration/populate_vulnerability_reads_spec.rb
+++ b/spec/lib/gitlab/background_migration/populate_vulnerability_reads_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::PopulateVulnerabilityReads do
+RSpec.describe Gitlab::BackgroundMigration::PopulateVulnerabilityReads, :migration, schema: 20220326161803 do
let(:vulnerabilities) { table(:vulnerabilities) }
let(:vulnerability_reads) { table(:vulnerability_reads) }
let(:vulnerabilities_findings) { table(:vulnerability_occurrences) }
diff --git a/spec/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces_spec.rb b/spec/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces_spec.rb
index 2c5de448fbc..2ad561ead87 100644
--- a/spec/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces_spec.rb
+++ b/spec/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::ProjectNamespaces::BackfillProjectNamespaces, :migration do
+RSpec.describe Gitlab::BackgroundMigration::ProjectNamespaces::BackfillProjectNamespaces, :migration, schema: 20220326161803 do
include MigrationsHelpers
context 'when migrating data', :aggregate_failures do
diff --git a/spec/lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings_spec.rb b/spec/lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings_spec.rb
index f6f4a3f6115..8003159f59e 100644
--- a/spec/lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings_spec.rb
+++ b/spec/lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::RemoveDuplicateVulnerabilitiesFindings do
+RSpec.describe Gitlab::BackgroundMigration::RemoveDuplicateVulnerabilitiesFindings, :migration, schema: 20220326161803 do
let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
let(:users) { table(:users) }
let(:user) { create_user! }
diff --git a/spec/lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb b/spec/lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb
index 28aa9efde4f..07cff32304e 100644
--- a/spec/lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb
+++ b/spec/lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::RemoveOccurrencePipelinesAndDuplicateVulnerabilitiesFindings do
+RSpec.describe Gitlab::BackgroundMigration::RemoveOccurrencePipelinesAndDuplicateVulnerabilitiesFindings, :migration, schema: 20220326161803 do
let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
let(:users) { table(:users) }
let(:user) { create_user! }
diff --git a/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb b/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb
index 6aea549b136..d02f7245c15 100644
--- a/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb
+++ b/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::ResetDuplicateCiRunnersTokenEncryptedValuesOnProjects do
+RSpec.describe Gitlab::BackgroundMigration::ResetDuplicateCiRunnersTokenEncryptedValuesOnProjects, :migration, schema: 20220326161803 do # rubocop:disable Layout/LineLength
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
diff --git a/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb b/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb
index cbe762c2680..fd61047d851 100644
--- a/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb
+++ b/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::ResetDuplicateCiRunnersTokenValuesOnProjects do
+RSpec.describe Gitlab::BackgroundMigration::ResetDuplicateCiRunnersTokenValuesOnProjects, :migration, schema: 20220326161803 do # rubocop:disable Layout/LineLength
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
diff --git a/spec/lib/gitlab/blame_spec.rb b/spec/lib/gitlab/blame_spec.rb
index e22399723ac..f636ce283ae 100644
--- a/spec/lib/gitlab/blame_spec.rb
+++ b/spec/lib/gitlab/blame_spec.rb
@@ -3,13 +3,31 @@
require 'spec_helper'
RSpec.describe Gitlab::Blame do
- let(:project) { create(:project, :repository) }
+ let_it_be(:project) { create(:project, :repository) }
+
let(:path) { 'files/ruby/popen.rb' }
let(:commit) { project.commit('master') }
let(:blob) { project.repository.blob_at(commit.id, path) }
+ let(:range) { nil }
+
+ subject(:blame) { described_class.new(blob, commit, range: range) }
+
+ describe '#first_line' do
+ subject { blame.first_line }
+
+ it { is_expected.to eq(1) }
+
+ context 'with a range' do
+ let(:range) { 2..3 }
+
+ it { is_expected.to eq(range.first) }
+ end
+ end
describe "#groups" do
- let(:subject) { described_class.new(blob, commit).groups(highlight: false) }
+ let(:highlighted) { false }
+
+ subject(:groups) { blame.groups(highlight: highlighted) }
it 'groups lines properly' do
expect(subject.count).to eq(18)
@@ -22,5 +40,62 @@ RSpec.describe Gitlab::Blame do
expect(subject[-1][:commit].sha).to eq('913c66a37b4a45b9769037c55c2d238bd0942d2e')
expect(subject[-1][:lines]).to eq([" end", "end"])
end
+
+ context 'with a range 1..5' do
+ let(:range) { 1..5 }
+
+ it 'returns the correct lines' do
+ expect(groups.count).to eq(2)
+ expect(groups[0][:lines]).to eq(["require 'fileutils'", "require 'open3'", ""])
+ expect(groups[1][:lines]).to eq(['module Popen', ' extend self'])
+ end
+
+ context 'with highlighted lines' do
+ let(:highlighted) { true }
+
+ it 'returns the correct lines' do
+ expect(groups.count).to eq(2)
+ expect(groups[0][:lines][0]).to match(/LC1.*fileutils/)
+ expect(groups[0][:lines][1]).to match(/LC2.*open3/)
+ expect(groups[0][:lines][2]).to eq("<span id=\"LC3\" class=\"line\" lang=\"ruby\"></span>\n")
+ expect(groups[1][:lines][0]).to match(/LC4.*Popen/)
+ expect(groups[1][:lines][1]).to match(/LC5.*extend/)
+ end
+ end
+ end
+
+ context 'with a range 2..4' do
+ let(:range) { 2..4 }
+
+ it 'returns the correct lines' do
+ expect(groups.count).to eq(2)
+ expect(groups[0][:lines]).to eq(["require 'open3'", ""])
+ expect(groups[1][:lines]).to eq(['module Popen'])
+ end
+
+ context 'with highlighted lines' do
+ let(:highlighted) { true }
+
+ it 'returns the correct lines' do
+ expect(groups.count).to eq(2)
+ expect(groups[0][:lines][0]).to match(/LC2.*open3/)
+ expect(groups[0][:lines][1]).to eq("<span id=\"LC3\" class=\"line\" lang=\"ruby\"></span>\n")
+ expect(groups[1][:lines][0]).to match(/LC4.*Popen/)
+ end
+ end
+ end
+
+ context 'renamed file' do
+ let(:path) { 'files/plain_text/renamed' }
+ let(:commit) { project.commit('blame-on-renamed') }
+
+ it 'adds previous path' do
+ expect(subject[0][:previous_path]).to be nil
+ expect(subject[0][:lines]).to match_array(['Initial commit', 'Initial commit'])
+
+ expect(subject[1][:previous_path]).to eq('files/plain_text/initial-commit')
+ expect(subject[1][:lines]).to match_array(['Renamed as "filename"'])
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/build/image_spec.rb b/spec/lib/gitlab/ci/build/image_spec.rb
index 71cd57d317c..630dfcd06bb 100644
--- a/spec/lib/gitlab/ci/build/image_spec.rb
+++ b/spec/lib/gitlab/ci/build/image_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Gitlab::Ci::Build::Image do
subject { described_class.from_image(job) }
context 'when image is defined in job' do
- let(:image_name) { 'ruby:2.7' }
+ let(:image_name) { 'image:1.0' }
let(:job) { create(:ci_build, options: { image: image_name } ) }
context 'when image is defined as string' do
diff --git a/spec/lib/gitlab/ci/config/entry/image_spec.rb b/spec/lib/gitlab/ci/config/entry/image_spec.rb
index e810d65d560..e16a9a7a74a 100644
--- a/spec/lib/gitlab/ci/config/entry/image_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/image_spec.rb
@@ -6,11 +6,11 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
let(:entry) { described_class.new(config) }
context 'when configuration is a string' do
- let(:config) { 'ruby:2.7' }
+ let(:config) { 'image:1.0' }
describe '#value' do
it 'returns image hash' do
- expect(entry.value).to eq({ name: 'ruby:2.7' })
+ expect(entry.value).to eq({ name: 'image:1.0' })
end
end
@@ -28,7 +28,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
describe '#image' do
it "returns image's name" do
- expect(entry.name).to eq 'ruby:2.7'
+ expect(entry.name).to eq 'image:1.0'
end
end
@@ -46,7 +46,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
end
context 'when configuration is a hash' do
- let(:config) { { name: 'ruby:2.7', entrypoint: %w(/bin/sh run) } }
+ let(:config) { { name: 'image:1.0', entrypoint: %w(/bin/sh run) } }
describe '#value' do
it 'returns image hash' do
@@ -68,7 +68,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
describe '#image' do
it "returns image's name" do
- expect(entry.name).to eq 'ruby:2.7'
+ expect(entry.name).to eq 'image:1.0'
end
end
@@ -80,7 +80,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
context 'when configuration has ports' do
let(:ports) { [{ number: 80, protocol: 'http', name: 'foobar' }] }
- let(:config) { { name: 'ruby:2.7', entrypoint: %w(/bin/sh run), ports: ports } }
+ let(:config) { { name: 'image:1.0', entrypoint: %w(/bin/sh run), ports: ports } }
let(:entry) { described_class.new(config, with_image_ports: image_ports) }
let(:image_ports) { false }
@@ -112,7 +112,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
end
context 'when entry value is not correct' do
- let(:config) { ['ruby:2.7'] }
+ let(:config) { ['image:1.0'] }
describe '#errors' do
it 'saves errors' do
@@ -129,7 +129,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Image do
end
context 'when unexpected key is specified' do
- let(:config) { { name: 'ruby:2.7', non_existing: 'test' } }
+ let(:config) { { name: 'image:1.0', non_existing: 'test' } }
describe '#errors' do
it 'saves errors' do
diff --git a/spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb b/spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb
index 588f53150ff..0fd9a83a4fa 100644
--- a/spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/reports/coverage_report_spec.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-require 'fast_spec_helper'
+require 'spec_helper'
RSpec.describe Gitlab::Ci::Config::Entry::Reports::CoverageReport do
let(:entry) { described_class.new(config) }
diff --git a/spec/lib/gitlab/ci/config/entry/root_spec.rb b/spec/lib/gitlab/ci/config/entry/root_spec.rb
index daf58aff116..b9c32bc51be 100644
--- a/spec/lib/gitlab/ci/config/entry/root_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/root_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
let(:hash) do
{
before_script: %w(ls pwd),
- image: 'ruby:2.7',
+ image: 'image:1.0',
default: {},
services: ['postgres:9.1', 'mysql:5.5'],
variables: { VAR: 'root', VAR2: { value: 'val 2', description: 'this is var 2' } },
@@ -154,7 +154,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
{ name: :rspec,
script: %w[rspec ls],
before_script: %w(ls pwd),
- image: { name: 'ruby:2.7' },
+ image: { name: 'image:1.0' },
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
stage: 'test',
cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
@@ -169,7 +169,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
{ name: :spinach,
before_script: [],
script: %w[spinach],
- image: { name: 'ruby:2.7' },
+ image: { name: 'image:1.0' },
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
stage: 'test',
cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
@@ -186,7 +186,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
before_script: [],
script: ["make changelog | tee release_changelog.txt"],
release: { name: "Release $CI_TAG_NAME", tag_name: 'v0.06', description: "./release_changelog.txt" },
- image: { name: "ruby:2.7" },
+ image: { name: "image:1.0" },
services: [{ name: "postgres:9.1" }, { name: "mysql:5.5" }],
cache: [{ key: "k", untracked: true, paths: ["public/"], policy: "pull-push", when: 'on_success' }],
only: { refs: %w(branches tags) },
@@ -206,7 +206,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
{ before_script: %w(ls pwd),
after_script: ['make clean'],
default: {
- image: 'ruby:2.7',
+ image: 'image:1.0',
services: ['postgres:9.1', 'mysql:5.5']
},
variables: { VAR: 'root' },
@@ -233,7 +233,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
rspec: { name: :rspec,
script: %w[rspec ls],
before_script: %w(ls pwd),
- image: { name: 'ruby:2.7' },
+ image: { name: 'image:1.0' },
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
stage: 'test',
cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
@@ -246,7 +246,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
spinach: { name: :spinach,
before_script: [],
script: %w[spinach],
- image: { name: 'ruby:2.7' },
+ image: { name: 'image:1.0' },
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
stage: 'test',
cache: [{ key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push', when: 'on_success' }],
diff --git a/spec/lib/gitlab/ci/config/external/file/artifact_spec.rb b/spec/lib/gitlab/ci/config/external/file/artifact_spec.rb
index b59fc95a8cc..9da8d106862 100644
--- a/spec/lib/gitlab/ci/config/external/file/artifact_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/artifact_spec.rb
@@ -4,8 +4,9 @@ require 'spec_helper'
RSpec.describe Gitlab::Ci::Config::External::File::Artifact do
let(:parent_pipeline) { create(:ci_pipeline) }
+ let(:variables) {}
let(:context) do
- Gitlab::Ci::Config::External::Context.new(parent_pipeline: parent_pipeline)
+ Gitlab::Ci::Config::External::Context.new(variables: variables, parent_pipeline: parent_pipeline)
end
let(:external_file) { described_class.new(params, context) }
@@ -29,14 +30,15 @@ RSpec.describe Gitlab::Ci::Config::External::File::Artifact do
end
describe '#valid?' do
- shared_examples 'is invalid' do
- it 'is not valid' do
- expect(external_file).not_to be_valid
- end
+ subject(:valid?) do
+ external_file.validate!
+ external_file.valid?
+ end
+ shared_examples 'is invalid' do
it 'sets the expected error' do
- expect(external_file.errors)
- .to contain_exactly(expected_error)
+ expect(valid?).to be_falsy
+ expect(external_file.errors).to contain_exactly(expected_error)
end
end
@@ -148,7 +150,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Artifact do
context 'when file is not empty' do
it 'is valid' do
- expect(external_file).to be_valid
+ expect(valid?).to be_truthy
expect(external_file.content).to be_present
end
@@ -160,6 +162,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Artifact do
user: anything
}
expect(context).to receive(:mutate).with(expected_attrs).and_call_original
+ external_file.validate!
external_file.content
end
end
@@ -168,6 +171,58 @@ RSpec.describe Gitlab::Ci::Config::External::File::Artifact do
end
end
end
+
+ context 'when job is provided as a variable' do
+ let(:variables) do
+ Gitlab::Ci::Variables::Collection.new([
+ { key: 'VAR1', value: 'a_secret_variable_value', masked: true }
+ ])
+ end
+
+ let(:params) { { artifact: 'generated.yml', job: 'a_secret_variable_value' } }
+
+ context 'when job does not exist in the parent pipeline' do
+ let(:expected_error) do
+ 'Job `xxxxxxxxxxxxxxxxxxxxxxx` not found in parent pipeline or does not have artifacts!'
+ end
+
+ it_behaves_like 'is invalid'
+ end
+ end
+ end
+ end
+
+ describe '#metadata' do
+ let(:params) { { artifact: 'generated.yml' } }
+
+ subject(:metadata) { external_file.metadata }
+
+ it {
+ is_expected.to eq(
+ context_project: nil,
+ context_sha: nil,
+ type: :artifact,
+ location: 'generated.yml',
+ extra: { job_name: nil }
+ )
+ }
+
+ context 'when job name includes a masked variable' do
+ let(:variables) do
+ Gitlab::Ci::Variables::Collection.new([{ key: 'VAR1', value: 'a_secret_variable_value', masked: true }])
+ end
+
+ let(:params) { { artifact: 'generated.yml', job: 'a_secret_variable_value' } }
+
+ it {
+ is_expected.to eq(
+ context_project: nil,
+ context_sha: nil,
+ type: :artifact,
+ location: 'generated.yml',
+ extra: { job_name: 'xxxxxxxxxxxxxxxxxxxxxxx' }
+ )
+ }
end
end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/base_spec.rb b/spec/lib/gitlab/ci/config/external/file/base_spec.rb
index 536f48ecba6..280bebe1a7c 100644
--- a/spec/lib/gitlab/ci/config/external/file/base_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/base_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Base do
end
end
- subject { test_class.new(location, context) }
+ subject(:file) { test_class.new(location, context) }
before do
allow_any_instance_of(test_class)
@@ -32,7 +32,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Base do
let(:location) { 'some-location' }
it 'returns true' do
- expect(subject).to be_matching
+ expect(file).to be_matching
end
end
@@ -40,40 +40,45 @@ RSpec.describe Gitlab::Ci::Config::External::File::Base do
let(:location) { nil }
it 'returns false' do
- expect(subject).not_to be_matching
+ expect(file).not_to be_matching
end
end
end
describe '#valid?' do
+ subject(:valid?) do
+ file.validate!
+ file.valid?
+ end
+
context 'when location is not a string' do
let(:location) { %w(some/file.txt other/file.txt) }
- it { is_expected.not_to be_valid }
+ it { is_expected.to be_falsy }
end
context 'when location is not a YAML file' do
let(:location) { 'some/file.txt' }
- it { is_expected.not_to be_valid }
+ it { is_expected.to be_falsy }
end
context 'when location has not a valid naming scheme' do
let(:location) { 'some/file/.yml' }
- it { is_expected.not_to be_valid }
+ it { is_expected.to be_falsy }
end
context 'when location is a valid .yml extension' do
let(:location) { 'some/file/config.yml' }
- it { is_expected.to be_valid }
+ it { is_expected.to be_truthy }
end
context 'when location is a valid .yaml extension' do
let(:location) { 'some/file/config.yaml' }
- it { is_expected.to be_valid }
+ it { is_expected.to be_truthy }
end
context 'when there are YAML syntax errors' do
@@ -86,8 +91,8 @@ RSpec.describe Gitlab::Ci::Config::External::File::Base do
end
it 'is not a valid file' do
- expect(subject).not_to be_valid
- expect(subject.error_message).to eq('Included file `some/file/xxxxxxxxxxxxxxxx.yml` does not have valid YAML syntax!')
+ expect(valid?).to be_falsy
+ expect(file.error_message).to eq('Included file `some/file/xxxxxxxxxxxxxxxx.yml` does not have valid YAML syntax!')
end
end
end
@@ -103,8 +108,56 @@ RSpec.describe Gitlab::Ci::Config::External::File::Base do
end
it 'does expand hash to include the template' do
- expect(subject.to_hash).to include(:before_script)
+ expect(file.to_hash).to include(:before_script)
end
end
end
+
+ describe '#metadata' do
+ let(:location) { 'some/file/config.yml' }
+
+ subject(:metadata) { file.metadata }
+
+ it {
+ is_expected.to eq(
+ context_project: nil,
+ context_sha: 'HEAD'
+ )
+ }
+ end
+
+ describe '#eql?' do
+ let(:location) { 'some/file/config.yml' }
+
+ subject(:eql) { file.eql?(other_file) }
+
+ context 'when the other file has the same params' do
+ let(:other_file) { test_class.new(location, context) }
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when the other file has not the same params' do
+ let(:other_file) { test_class.new('some/other/file', context) }
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ describe '#hash' do
+ let(:location) { 'some/file/config.yml' }
+
+ subject(:filehash) { file.hash }
+
+ context 'with a project' do
+ let(:project) { create(:project) }
+ let(:context_params) { { project: project, sha: 'HEAD', variables: variables } }
+
+ it { is_expected.to eq([location, project.full_path, 'HEAD'].hash) }
+ end
+
+ context 'without a project' do
+ it { is_expected.to eq([location, nil, 'HEAD'].hash) }
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/local_spec.rb b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
index b9314dfc44e..c0a0b0009ce 100644
--- a/spec/lib/gitlab/ci/config/external/file/local_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
@@ -55,6 +55,11 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
end
describe '#valid?' do
+ subject(:valid?) do
+ local_file.validate!
+ local_file.valid?
+ end
+
context 'when is a valid local path' do
let(:location) { '/lib/gitlab/ci/templates/existent-file.yml' }
@@ -62,25 +67,19 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
allow_any_instance_of(described_class).to receive(:fetch_local_content).and_return("image: 'ruby2:2'")
end
- it 'returns true' do
- expect(local_file.valid?).to be_truthy
- end
+ it { is_expected.to be_truthy }
end
context 'when it is not a valid local path' do
let(:location) { '/lib/gitlab/ci/templates/non-existent-file.yml' }
- it 'returns false' do
- expect(local_file.valid?).to be_falsy
- end
+ it { is_expected.to be_falsy }
end
context 'when it is not a yaml file' do
let(:location) { '/config/application.rb' }
- it 'returns false' do
- expect(local_file.valid?).to be_falsy
- end
+ it { is_expected.to be_falsy }
end
context 'when it is an empty file' do
@@ -89,6 +88,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
it 'returns false and adds an error message about an empty file' do
allow_any_instance_of(described_class).to receive(:fetch_local_content).and_return("")
+ local_file.validate!
expect(local_file.errors).to include("Local file `/lib/gitlab/ci/templates/xxxxxx/existent-file.yml` is empty!")
end
end
@@ -98,7 +98,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
let(:sha) { ':' }
it 'returns false and adds an error message stating that included file does not exist' do
- expect(local_file).not_to be_valid
+ expect(valid?).to be_falsy
expect(local_file.errors).to include("Sha #{sha} is not valid!")
end
end
@@ -140,6 +140,10 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
let(:location) { '/lib/gitlab/ci/templates/secret_file.yml' }
let(:variables) { Gitlab::Ci::Variables::Collection.new([{ 'key' => 'GITLAB_TOKEN', 'value' => 'secret_file', 'masked' => true }]) }
+ before do
+ local_file.validate!
+ end
+
it 'returns an error message' do
expect(local_file.error_message).to eq("Local file `/lib/gitlab/ci/templates/xxxxxxxxxxx.yml` does not exist!")
end
@@ -174,6 +178,8 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
allow(project.repository).to receive(:blob_data_at).with(sha, another_location)
.and_return(another_content)
+
+ local_file.validate!
end
it 'does expand hash to include the template' do
@@ -181,4 +187,20 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
end
end
end
+
+ describe '#metadata' do
+ let(:location) { '/lib/gitlab/ci/templates/existent-file.yml' }
+
+ subject(:metadata) { local_file.metadata }
+
+ it {
+ is_expected.to eq(
+ context_project: project.full_path,
+ context_sha: '12345',
+ type: :local,
+ location: location,
+ extra: {}
+ )
+ }
+ end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/project_spec.rb b/spec/lib/gitlab/ci/config/external/file/project_spec.rb
index 74720c0a3ca..5d3412a148b 100644
--- a/spec/lib/gitlab/ci/config/external/file/project_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/project_spec.rb
@@ -66,6 +66,11 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
end
describe '#valid?' do
+ subject(:valid?) do
+ project_file.validate!
+ project_file.valid?
+ end
+
context 'when a valid path is used' do
let(:params) do
{ project: project.full_path, file: '/file.yml' }
@@ -74,18 +79,16 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
let(:root_ref_sha) { project.repository.root_ref_sha }
before do
- stub_project_blob(root_ref_sha, '/file.yml') { 'image: ruby:2.7' }
+ stub_project_blob(root_ref_sha, '/file.yml') { 'image: image:1.0' }
end
- it 'returns true' do
- expect(project_file).to be_valid
- end
+ it { is_expected.to be_truthy }
context 'when user does not have permission to access file' do
let(:context_user) { create(:user) }
it 'returns false' do
- expect(project_file).not_to be_valid
+ expect(valid?).to be_falsy
expect(project_file.error_message).to include("Project `#{project.full_path}` not found or access denied!")
end
end
@@ -99,12 +102,10 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
let(:ref_sha) { project.commit('master').sha }
before do
- stub_project_blob(ref_sha, '/file.yml') { 'image: ruby:2.7' }
+ stub_project_blob(ref_sha, '/file.yml') { 'image: image:1.0' }
end
- it 'returns true' do
- expect(project_file).to be_valid
- end
+ it { is_expected.to be_truthy }
end
context 'when an empty file is used' do
@@ -120,7 +121,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
end
it 'returns false' do
- expect(project_file).not_to be_valid
+ expect(valid?).to be_falsy
expect(project_file.error_message).to include("Project `#{project.full_path}` file `/xxxxxxxxxxx.yml` is empty!")
end
end
@@ -131,7 +132,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
end
it 'returns false' do
- expect(project_file).not_to be_valid
+ expect(valid?).to be_falsy
expect(project_file.error_message).to include("Project `#{project.full_path}` reference `I-Do-Not-Exist` does not exist!")
end
end
@@ -144,7 +145,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
end
it 'returns false' do
- expect(project_file).not_to be_valid
+ expect(valid?).to be_falsy
expect(project_file.error_message).to include("Project `#{project.full_path}` file `/xxxxxxxxxxxxxxxxxxx.yml` does not exist!")
end
end
@@ -155,10 +156,27 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
end
it 'returns false' do
- expect(project_file).not_to be_valid
+ expect(valid?).to be_falsy
expect(project_file.error_message).to include('Included file `/invalid-file` does not have YAML extension!')
end
end
+
+ context 'when non-existing project is used with a masked variable' do
+ let(:variables) do
+ Gitlab::Ci::Variables::Collection.new([
+ { key: 'VAR1', value: 'a_secret_variable_value', masked: true }
+ ])
+ end
+
+ let(:params) do
+ { project: 'a_secret_variable_value', file: '/file.yml' }
+ end
+
+ it 'returns false with masked project name' do
+ expect(valid?).to be_falsy
+ expect(project_file.error_message).to include("Project `xxxxxxxxxxxxxxxxxxxxxxx` not found or access denied!")
+ end
+ end
end
describe '#expand_context' do
@@ -176,6 +194,45 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
end
end
+ describe '#metadata' do
+ let(:params) do
+ { project: project.full_path, file: '/file.yml' }
+ end
+
+ subject(:metadata) { project_file.metadata }
+
+ it {
+ is_expected.to eq(
+ context_project: context_project.full_path,
+ context_sha: '12345',
+ type: :file,
+ location: '/file.yml',
+ extra: { project: project.full_path, ref: 'HEAD' }
+ )
+ }
+
+ context 'when project name and ref include masked variables' do
+ let(:variables) do
+ Gitlab::Ci::Variables::Collection.new([
+ { key: 'VAR1', value: 'a_secret_variable_value1', masked: true },
+ { key: 'VAR2', value: 'a_secret_variable_value2', masked: true }
+ ])
+ end
+
+ let(:params) { { project: 'a_secret_variable_value1', ref: 'a_secret_variable_value2', file: '/file.yml' } }
+
+ it {
+ is_expected.to eq(
+ context_project: context_project.full_path,
+ context_sha: '12345',
+ type: :file,
+ location: '/file.yml',
+ extra: { project: 'xxxxxxxxxxxxxxxxxxxxxxxx', ref: 'xxxxxxxxxxxxxxxxxxxxxxxx' }
+ )
+ }
+ end
+ end
+
private
def stub_project_blob(ref, path)
diff --git a/spec/lib/gitlab/ci/config/external/file/remote_spec.rb b/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
index 2613bfbfdcf..5c07c87fd5a 100644
--- a/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
@@ -54,22 +54,23 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote do
end
describe "#valid?" do
+ subject(:valid?) do
+ remote_file.validate!
+ remote_file.valid?
+ end
+
context 'when is a valid remote url' do
before do
stub_full_request(location).to_return(body: remote_file_content)
end
- it 'returns true' do
- expect(remote_file.valid?).to be_truthy
- end
+ it { is_expected.to be_truthy }
end
context 'with an irregular url' do
let(:location) { 'not-valid://gitlab.com/gitlab-org/gitlab-foss/blob/1234/.gitlab-ci-1.yml' }
- it 'returns false' do
- expect(remote_file.valid?).to be_falsy
- end
+ it { is_expected.to be_falsy }
end
context 'with a timeout' do
@@ -77,25 +78,19 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote do
allow(Gitlab::HTTP).to receive(:get).and_raise(Timeout::Error)
end
- it 'is falsy' do
- expect(remote_file.valid?).to be_falsy
- end
+ it { is_expected.to be_falsy }
end
context 'when is not a yaml file' do
let(:location) { 'https://asdasdasdaj48ggerexample.com' }
- it 'is falsy' do
- expect(remote_file.valid?).to be_falsy
- end
+ it { is_expected.to be_falsy }
end
context 'with an internal url' do
let(:location) { 'http://localhost:8080' }
- it 'is falsy' do
- expect(remote_file.valid?).to be_falsy
- end
+ it { is_expected.to be_falsy }
end
end
@@ -142,7 +137,10 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote do
end
describe "#error_message" do
- subject { remote_file.error_message }
+ subject(:error_message) do
+ remote_file.validate!
+ remote_file.error_message
+ end
context 'when remote file location is not valid' do
let(:location) { 'not-valid://gitlab.com/gitlab-org/gitlab-foss/blob/1234/?secret_file.yml' }
@@ -201,4 +199,22 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote do
is_expected.to be_empty
end
end
+
+ describe '#metadata' do
+ before do
+ stub_full_request(location).to_return(body: remote_file_content)
+ end
+
+ subject(:metadata) { remote_file.metadata }
+
+ it {
+ is_expected.to eq(
+ context_project: nil,
+ context_sha: '12345',
+ type: :remote,
+ location: 'https://gitlab.com/gitlab-org/gitlab-foss/blob/1234/.xxxxxxxxxxx.yml',
+ extra: {}
+ )
+ }
+ end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/template_spec.rb b/spec/lib/gitlab/ci/config/external/file/template_spec.rb
index 66a06de3d28..4da9a933a9f 100644
--- a/spec/lib/gitlab/ci/config/external/file/template_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/template_spec.rb
@@ -45,12 +45,15 @@ RSpec.describe Gitlab::Ci::Config::External::File::Template do
end
describe "#valid?" do
+ subject(:valid?) do
+ template_file.validate!
+ template_file.valid?
+ end
+
context 'when is a valid template name' do
let(:template) { 'Auto-DevOps.gitlab-ci.yml' }
- it 'returns true' do
- expect(template_file).to be_valid
- end
+ it { is_expected.to be_truthy }
end
context 'with invalid template name' do
@@ -59,7 +62,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Template do
let(:context_params) { { project: project, sha: '12345', user: user, variables: variables } }
it 'returns false' do
- expect(template_file).not_to be_valid
+ expect(valid?).to be_falsy
expect(template_file.error_message).to include('`xxxxxxxxxxxxxx.yml` is not a valid location!')
end
end
@@ -68,7 +71,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Template do
let(:template) { 'I-Do-Not-Have-This-Template.gitlab-ci.yml' }
it 'returns false' do
- expect(template_file).not_to be_valid
+ expect(valid?).to be_falsy
expect(template_file.error_message).to include('Included file `I-Do-Not-Have-This-Template.gitlab-ci.yml` is empty or does not exist!')
end
end
@@ -111,4 +114,18 @@ RSpec.describe Gitlab::Ci::Config::External::File::Template do
is_expected.to be_empty
end
end
+
+ describe '#metadata' do
+ subject(:metadata) { template_file.metadata }
+
+ it {
+ is_expected.to eq(
+ context_project: project.full_path,
+ context_sha: '12345',
+ type: :template,
+ location: template,
+ extra: {}
+ )
+ }
+ end
end
diff --git a/spec/lib/gitlab/ci/config/external/mapper_spec.rb b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
index f69feba5e59..2d2adf09a42 100644
--- a/spec/lib/gitlab/ci/config/external/mapper_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
@@ -17,10 +17,12 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
let(:file_content) do
<<~HEREDOC
- image: 'ruby:2.7'
+ image: 'image:1.0'
HEREDOC
end
+ subject(:mapper) { described_class.new(values, context) }
+
before do
stub_full_request(remote_url).to_return(body: file_content)
@@ -30,13 +32,13 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
end
describe '#process' do
- subject { described_class.new(values, context).process }
+ subject(:process) { mapper.process }
context "when single 'include' keyword is defined" do
context 'when the string is a local file' do
let(:values) do
{ include: local_file,
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns File instances' do
@@ -48,7 +50,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'when the key is a local file hash' do
let(:values) do
{ include: { 'local' => local_file },
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns File instances' do
@@ -59,7 +61,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'when the string is a remote file' do
let(:values) do
- { include: remote_url, image: 'ruby:2.7' }
+ { include: remote_url, image: 'image:1.0' }
end
it 'returns File instances' do
@@ -71,7 +73,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'when the key is a remote file hash' do
let(:values) do
{ include: { 'remote' => remote_url },
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns File instances' do
@@ -83,7 +85,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'when the key is a template file hash' do
let(:values) do
{ include: { 'template' => template_file },
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns File instances' do
@@ -98,7 +100,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
let(:remote_url) { 'https://gitlab.com/secret-file.yml' }
let(:values) do
{ include: { 'local' => local_file, 'remote' => remote_url },
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns ambigious specification error' do
@@ -109,7 +111,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context "when the key is a project's file" do
let(:values) do
{ include: { project: project.full_path, file: local_file },
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns File instances' do
@@ -121,7 +123,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context "when the key is project's files" do
let(:values) do
{ include: { project: project.full_path, file: [local_file, 'another_file_path.yml'] },
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns two File instances' do
@@ -135,7 +137,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context "when 'include' is defined as an array" do
let(:values) do
{ include: [remote_url, local_file],
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns Files instances' do
@@ -147,7 +149,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context "when 'include' is defined as an array of hashes" do
let(:values) do
{ include: [{ remote: remote_url }, { local: local_file }],
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns Files instances' do
@@ -158,7 +160,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'when it has ambigious match' do
let(:values) do
{ include: [{ remote: remote_url, local: local_file }],
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'returns ambigious specification error' do
@@ -170,7 +172,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context "when 'include' is not defined" do
let(:values) do
{
- image: 'ruby:2.7'
+ image: 'image:1.0'
}
end
@@ -185,11 +187,16 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
{ 'local' => local_file },
{ 'local' => local_file }
],
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'does not raise an exception' do
- expect { subject }.not_to raise_error
+ expect { process }.not_to raise_error
+ end
+
+ it 'has expanset with one' do
+ process
+ expect(mapper.expandset.size).to eq(1)
end
end
@@ -199,7 +206,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
{ 'local' => local_file },
{ 'remote' => remote_url }
],
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
before do
@@ -217,7 +224,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
{ 'local' => local_file },
{ 'remote' => remote_url }
],
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
before do
@@ -269,7 +276,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'defined as an array' do
let(:values) do
{ include: [full_local_file_path, remote_url],
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'expands the variable' do
@@ -281,7 +288,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'defined as an array of hashes' do
let(:values) do
{ include: [{ local: full_local_file_path }, { remote: remote_url }],
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'expands the variable' do
@@ -303,7 +310,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'project name' do
let(:values) do
{ include: { project: '$CI_PROJECT_PATH', file: local_file },
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'expands the variable', :aggregate_failures do
@@ -315,7 +322,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'with multiple files' do
let(:values) do
{ include: { project: project.full_path, file: [full_local_file_path, 'another_file_path.yml'] },
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'expands the variable' do
@@ -327,7 +334,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
context 'when include variable has an unsupported type for variable expansion' do
let(:values) do
{ include: { project: project.id, file: local_file },
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
it 'does not invoke expansion for the variable', :aggregate_failures do
@@ -365,7 +372,7 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
let(:values) do
{ include: [{ remote: remote_url },
{ local: local_file, rules: [{ if: "$CI_PROJECT_ID == '#{project_id}'" }] }],
- image: 'ruby:2.7' }
+ image: 'image:1.0' }
end
context 'when the rules matches' do
@@ -385,5 +392,27 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
end
end
end
+
+ context "when locations are same after masking variables" do
+ let(:variables) do
+ Gitlab::Ci::Variables::Collection.new([
+ { 'key' => 'GITLAB_TOKEN', 'value' => 'secret-file1', 'masked' => true },
+ { 'key' => 'GITLAB_TOKEN', 'value' => 'secret-file2', 'masked' => true }
+ ])
+ end
+
+ let(:values) do
+ { include: [
+ { 'local' => 'hello/secret-file1.yml' },
+ { 'local' => 'hello/secret-file2.yml' }
+ ],
+ image: 'ruby:2.7' }
+ end
+
+ it 'has expanset with two' do
+ process
+ expect(mapper.expandset.size).to eq(2)
+ 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 97bd74721f2..56cd006717e 100644
--- a/spec/lib/gitlab/ci/config/external/processor_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/processor_spec.rb
@@ -22,10 +22,10 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
end
describe "#perform" do
- subject { processor.perform }
+ subject(:perform) { processor.perform }
context 'when no external files defined' do
- let(:values) { { image: 'ruby:2.7' } }
+ let(:values) { { image: 'image:1.0' } }
it 'returns the same values' do
expect(processor.perform).to eq(values)
@@ -33,7 +33,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
end
context 'when an invalid local file is defined' do
- let(:values) { { include: '/lib/gitlab/ci/templates/non-existent-file.yml', image: 'ruby:2.7' } }
+ let(:values) { { include: '/lib/gitlab/ci/templates/non-existent-file.yml', image: 'image:1.0' } }
it 'raises an error' do
expect { processor.perform }.to raise_error(
@@ -45,7 +45,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
context 'when an invalid remote file is defined' do
let(:remote_file) { 'http://doesntexist.com/.gitlab-ci-1.yml' }
- let(:values) { { include: remote_file, image: 'ruby:2.7' } }
+ let(:values) { { include: remote_file, image: 'image:1.0' } }
before do
stub_full_request(remote_file).and_raise(SocketError.new('Some HTTP error'))
@@ -61,7 +61,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
context 'with a valid remote external file is defined' do
let(:remote_file) { 'https://gitlab.com/gitlab-org/gitlab-foss/blob/1234/.gitlab-ci-1.yml' }
- let(:values) { { include: remote_file, image: 'ruby:2.7' } }
+ let(:values) { { include: remote_file, image: 'image:1.0' } }
let(:external_file_content) do
<<-HEREDOC
before_script:
@@ -95,7 +95,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
end
context 'with a valid local external file is defined' do
- let(:values) { { include: '/lib/gitlab/ci/templates/template.yml', image: 'ruby:2.7' } }
+ let(:values) { { include: '/lib/gitlab/ci/templates/template.yml', image: 'image:1.0' } }
let(:local_file_content) do
<<-HEREDOC
before_script:
@@ -133,7 +133,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
let(:values) do
{
include: external_files,
- image: 'ruby:2.7'
+ image: 'image:1.0'
}
end
@@ -165,7 +165,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
end
context 'when external files are defined but not valid' do
- let(:values) { { include: '/lib/gitlab/ci/templates/template.yml', image: 'ruby:2.7' } }
+ let(:values) { { include: '/lib/gitlab/ci/templates/template.yml', image: 'image:1.0' } }
let(:local_file_content) { 'invalid content file ////' }
@@ -187,7 +187,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
let(:values) do
{
include: remote_file,
- image: 'ruby:2.7'
+ image: 'image:1.0'
}
end
@@ -200,7 +200,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
it 'takes precedence' do
stub_full_request(remote_file).to_return(body: remote_file_content)
- expect(processor.perform[:image]).to eq('ruby:2.7')
+ expect(processor.perform[:image]).to eq('image:1.0')
end
end
@@ -210,7 +210,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
include: [
{ local: '/local/file.yml' }
],
- image: 'ruby:2.7'
+ image: 'image:1.0'
}
end
@@ -262,6 +262,18 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
expect(process_obs_count).to eq(3)
end
+
+ it 'stores includes' do
+ perform
+
+ expect(context.includes).to contain_exactly(
+ { type: :local, location: '/local/file.yml', extra: {}, context_project: project.full_path, context_sha: '12345' },
+ { type: :template, location: 'Ruby.gitlab-ci.yml', extra: {}, context_project: project.full_path, context_sha: '12345' },
+ { type: :remote, location: 'http://my.domain.com/config.yml', extra: {}, context_project: project.full_path, context_sha: '12345' },
+ { type: :file, location: '/templates/my-workflow.yml', extra: { project: another_project.full_path, ref: 'HEAD' }, context_project: project.full_path, context_sha: '12345' },
+ { type: :local, location: '/templates/my-build.yml', extra: {}, context_project: another_project.full_path, context_sha: another_project.commit.sha }
+ )
+ end
end
context 'when user is reporter of another project' do
@@ -294,7 +306,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
context 'when config includes an external configuration file via SSL web request' do
before do
stub_full_request('https://sha256.badssl.com/fake.yml', ip_address: '8.8.8.8')
- .to_return(body: 'image: ruby:2.6', status: 200)
+ .to_return(body: 'image: image:1.0', status: 200)
stub_full_request('https://self-signed.badssl.com/fake.yml', ip_address: '8.8.8.9')
.to_raise(OpenSSL::SSL::SSLError.new('SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate)'))
@@ -303,7 +315,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
context 'with an acceptable certificate' do
let(:values) { { include: 'https://sha256.badssl.com/fake.yml' } }
- it { is_expected.to include(image: 'ruby:2.6') }
+ it { is_expected.to include(image: 'image:1.0') }
end
context 'with a self-signed certificate' do
@@ -319,7 +331,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
let(:values) do
{
include: { project: another_project.full_path, file: '/templates/my-build.yml' },
- image: 'ruby:2.7'
+ image: 'image:1.0'
}
end
@@ -349,7 +361,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
project: another_project.full_path,
file: ['/templates/my-build.yml', '/templates/my-test.yml']
},
- image: 'ruby:2.7'
+ image: 'image:1.0'
}
end
@@ -377,13 +389,22 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
output = processor.perform
expect(output.keys).to match_array([:image, :my_build, :my_test])
end
+
+ it 'stores includes' do
+ perform
+
+ expect(context.includes).to contain_exactly(
+ { type: :file, location: '/templates/my-build.yml', extra: { project: another_project.full_path, ref: 'HEAD' }, context_project: project.full_path, context_sha: '12345' },
+ { type: :file, location: '/templates/my-test.yml', extra: { project: another_project.full_path, ref: 'HEAD' }, context_project: project.full_path, context_sha: '12345' }
+ )
+ end
end
context 'when local file path has wildcard' do
- let_it_be(:project) { create(:project, :repository) }
+ let(:project) { create(:project, :repository) }
let(:values) do
- { include: 'myfolder/*.yml', image: 'ruby:2.7' }
+ { include: 'myfolder/*.yml', image: 'image:1.0' }
end
before do
@@ -412,6 +433,15 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
output = processor.perform
expect(output.keys).to match_array([:image, :my_build, :my_test])
end
+
+ it 'stores includes' do
+ perform
+
+ expect(context.includes).to contain_exactly(
+ { type: :local, location: 'myfolder/file1.yml', extra: {}, context_project: project.full_path, context_sha: '12345' },
+ { type: :local, location: 'myfolder/file2.yml', extra: {}, context_project: project.full_path, context_sha: '12345' }
+ )
+ end
end
context 'when rules defined' do
diff --git a/spec/lib/gitlab/ci/config_spec.rb b/spec/lib/gitlab/ci/config_spec.rb
index 05ff1f3618b..3ba6a9059c6 100644
--- a/spec/lib/gitlab/ci/config_spec.rb
+++ b/spec/lib/gitlab/ci/config_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Gitlab::Ci::Config do
context 'when config is valid' do
let(:yml) do
<<-EOS
- image: ruby:2.7
+ image: image:1.0
rspec:
script:
@@ -32,7 +32,7 @@ RSpec.describe Gitlab::Ci::Config do
describe '#to_hash' do
it 'returns hash created from string' do
hash = {
- image: 'ruby:2.7',
+ image: 'image:1.0',
rspec: {
script: ['gem install rspec',
'rspec']
@@ -104,12 +104,32 @@ RSpec.describe Gitlab::Ci::Config do
end
it { is_expected.to contain_exactly('Jobs/Deploy.gitlab-ci.yml', 'Jobs/Build.gitlab-ci.yml') }
+
+ it 'stores includes' do
+ expect(config.metadata[:includes]).to contain_exactly(
+ { type: :template,
+ location: 'Jobs/Deploy.gitlab-ci.yml',
+ extra: {},
+ context_project: nil,
+ context_sha: nil },
+ { type: :template,
+ location: 'Jobs/Build.gitlab-ci.yml',
+ extra: {},
+ context_project: nil,
+ context_sha: nil },
+ { type: :remote,
+ location: 'https://example.com/gitlab-ci.yml',
+ extra: {},
+ context_project: nil,
+ context_sha: nil }
+ )
+ end
end
context 'when using extendable hash' do
let(:yml) do
<<-EOS
- image: ruby:2.7
+ image: image:1.0
rspec:
script: rspec
@@ -122,7 +142,7 @@ RSpec.describe Gitlab::Ci::Config do
it 'correctly extends the hash' do
hash = {
- image: 'ruby:2.7',
+ image: 'image:1.0',
rspec: { script: 'rspec' },
test: {
extends: 'rspec',
@@ -212,7 +232,7 @@ RSpec.describe Gitlab::Ci::Config do
let(:yml) do
<<-EOS
image:
- name: ruby:2.7
+ name: image:1.0
ports:
- 80
EOS
@@ -226,12 +246,12 @@ RSpec.describe Gitlab::Ci::Config do
context 'in the job image' do
let(:yml) do
<<-EOS
- image: ruby:2.7
+ image: image:1.0
test:
script: rspec
image:
- name: ruby:2.7
+ name: image:1.0
ports:
- 80
EOS
@@ -245,11 +265,11 @@ RSpec.describe Gitlab::Ci::Config do
context 'in the services' do
let(:yml) do
<<-EOS
- image: ruby:2.7
+ image: image:1.0
test:
script: rspec
- image: ruby:2.7
+ image: image:1.0
services:
- name: test
alias: test
@@ -325,7 +345,7 @@ RSpec.describe Gitlab::Ci::Config do
- project: '$MAIN_PROJECT'
ref: '$REF'
file: '$FILENAME'
- image: ruby:2.7
+ image: image:1.0
HEREDOC
end
@@ -364,7 +384,7 @@ RSpec.describe Gitlab::Ci::Config do
it 'returns a composed hash' do
composed_hash = {
before_script: local_location_hash[:before_script],
- image: "ruby:2.7",
+ image: "image:1.0",
rspec: { script: ["bundle exec rspec"] },
variables: remote_file_hash[:variables]
}
@@ -403,6 +423,26 @@ RSpec.describe Gitlab::Ci::Config do
end
end
end
+
+ it 'stores includes' do
+ expect(config.metadata[:includes]).to contain_exactly(
+ { type: :local,
+ location: local_location,
+ extra: {},
+ context_project: project.full_path,
+ context_sha: '12345' },
+ { type: :remote,
+ location: remote_location,
+ extra: {},
+ context_project: project.full_path,
+ context_sha: '12345' },
+ { type: :file,
+ location: '.gitlab-ci.yml',
+ extra: { project: main_project.full_path, ref: 'HEAD' },
+ context_project: project.full_path,
+ context_sha: '12345' }
+ )
+ end
end
context "when gitlab_ci.yml has invalid 'include' defined" do
@@ -481,7 +521,7 @@ RSpec.describe Gitlab::Ci::Config do
include:
- #{remote_location}
- image: ruby:2.7
+ image: image:1.0
HEREDOC
end
@@ -492,7 +532,7 @@ RSpec.describe Gitlab::Ci::Config do
end
it 'takes precedence' do
- expect(config.to_hash).to eq({ image: 'ruby:2.7' })
+ expect(config.to_hash).to eq({ image: 'image:1.0' })
end
end
@@ -699,7 +739,7 @@ RSpec.describe Gitlab::Ci::Config do
- #{local_location}
- #{other_file_location}
- image: ruby:2.7
+ image: image:1.0
HEREDOC
end
@@ -718,7 +758,7 @@ RSpec.describe Gitlab::Ci::Config do
it 'returns a composed hash' do
composed_hash = {
before_script: local_location_hash[:before_script],
- image: "ruby:2.7",
+ image: "image:1.0",
build: { stage: "build", script: "echo hello" },
rspec: { stage: "test", script: "bundle exec rspec" }
}
@@ -735,7 +775,7 @@ RSpec.describe Gitlab::Ci::Config do
- local: #{local_location}
rules:
- if: $CI_PROJECT_ID == "#{project_id}"
- image: ruby:2.7
+ image: image:1.0
HEREDOC
end
@@ -763,7 +803,7 @@ RSpec.describe Gitlab::Ci::Config do
- local: #{local_location}
rules:
- exists: "#{filename}"
- image: ruby:2.7
+ image: image:1.0
HEREDOC
end
diff --git a/spec/lib/gitlab/ci/parsers/security/common_spec.rb b/spec/lib/gitlab/ci/parsers/security/common_spec.rb
index 1e96c717a4f..dfc5dec1481 100644
--- a/spec/lib/gitlab/ci/parsers/security/common_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/security/common_spec.rb
@@ -4,6 +4,18 @@ require 'spec_helper'
RSpec.describe Gitlab::Ci::Parsers::Security::Common do
describe '#parse!' do
+ let_it_be(:scanner_data) do
+ {
+ scan: {
+ scanner: {
+ id: "gemnasium",
+ name: "Gemnasium",
+ version: "2.1.0"
+ }
+ }
+ }
+ end
+
where(vulnerability_finding_signatures_enabled: [true, false])
with_them do
let_it_be(:pipeline) { create(:ci_pipeline) }
@@ -30,7 +42,9 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Common do
describe 'schema validation' do
let(:validator_class) { Gitlab::Ci::Parsers::Security::Validators::SchemaValidator }
- let(:parser) { described_class.new('{}', report, vulnerability_finding_signatures_enabled, validate: validate) }
+ let(:data) { {}.merge(scanner_data) }
+ let(:json_data) { data.to_json }
+ let(:parser) { described_class.new(json_data, report, vulnerability_finding_signatures_enabled, validate: validate) }
subject(:parse_report) { parser.parse! }
@@ -38,172 +52,138 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Common do
allow(validator_class).to receive(:new).and_call_original
end
- context 'when show_report_validation_warnings is enabled' do
- before do
- stub_feature_flags(show_report_validation_warnings: true)
- end
-
- context 'when the validate flag is set to `false`' do
- let(:validate) { false }
- let(:valid?) { false }
- let(:errors) { ['foo'] }
-
- before do
- allow_next_instance_of(validator_class) do |instance|
- allow(instance).to receive(:valid?).and_return(valid?)
- allow(instance).to receive(:errors).and_return(errors)
- end
-
- allow(parser).to receive_messages(create_scanner: true, create_scan: true)
- end
-
- it 'instantiates the validator with correct params' do
- parse_report
-
- expect(validator_class).to have_received(:new).with(report.type, {}, report.version)
- end
-
- context 'when the report data is not valid according to the schema' do
- it 'adds warnings to the report' do
- expect { parse_report }.to change { report.warnings }.from([]).to([{ message: 'foo', type: 'Schema' }])
- end
-
- it 'keeps the execution flow as normal' do
- parse_report
+ context 'when the validate flag is set to `false`' do
+ let(:validate) { false }
+ let(:valid?) { false }
+ let(:errors) { ['foo'] }
+ let(:warnings) { ['bar'] }
- expect(parser).to have_received(:create_scanner)
- expect(parser).to have_received(:create_scan)
- end
+ before do
+ allow_next_instance_of(validator_class) do |instance|
+ allow(instance).to receive(:valid?).and_return(valid?)
+ allow(instance).to receive(:errors).and_return(errors)
+ allow(instance).to receive(:warnings).and_return(warnings)
end
- context 'when the report data is valid according to the schema' do
- let(:valid?) { true }
- let(:errors) { [] }
-
- it 'does not add warnings to the report' do
- expect { parse_report }.not_to change { report.errors }
- end
-
- it 'keeps the execution flow as normal' do
- parse_report
-
- expect(parser).to have_received(:create_scanner)
- expect(parser).to have_received(:create_scan)
- end
- end
+ allow(parser).to receive_messages(create_scanner: true, create_scan: true)
end
- context 'when the validate flag is set to `true`' do
- let(:validate) { true }
- let(:valid?) { false }
- let(:errors) { ['foo'] }
+ it 'instantiates the validator with correct params' do
+ parse_report
- before do
- allow_next_instance_of(validator_class) do |instance|
- allow(instance).to receive(:valid?).and_return(valid?)
- allow(instance).to receive(:errors).and_return(errors)
- end
+ expect(validator_class).to have_received(:new).with(
+ report.type,
+ data.deep_stringify_keys,
+ report.version,
+ project: pipeline.project,
+ scanner: data.dig(:scan, :scanner).deep_stringify_keys
+ )
+ end
- allow(parser).to receive_messages(create_scanner: true, create_scan: true)
+ context 'when the report data is not valid according to the schema' do
+ it 'adds warnings to the report' do
+ expect { parse_report }.to change { report.warnings }.from([]).to(
+ [
+ { message: 'foo', type: 'Schema' },
+ { message: 'bar', type: 'Schema' }
+ ]
+ )
end
- it 'instantiates the validator with correct params' do
+ it 'keeps the execution flow as normal' do
parse_report
- expect(validator_class).to have_received(:new).with(report.type, {}, report.version)
+ expect(parser).to have_received(:create_scanner)
+ expect(parser).to have_received(:create_scan)
end
+ end
- context 'when the report data is not valid according to the schema' do
- it 'adds errors to the report' do
- expect { parse_report }.to change { report.errors }.from([]).to([{ message: 'foo', type: 'Schema' }])
- end
-
- it 'does not try to create report entities' do
- parse_report
+ context 'when the report data is valid according to the schema' do
+ let(:valid?) { true }
+ let(:errors) { [] }
+ let(:warnings) { [] }
- expect(parser).not_to have_received(:create_scanner)
- expect(parser).not_to have_received(:create_scan)
- end
+ it 'does not add errors to the report' do
+ expect { parse_report }.not_to change { report.errors }
end
- context 'when the report data is valid according to the schema' do
- let(:valid?) { true }
- let(:errors) { [] }
-
- it 'does not add errors to the report' do
- expect { parse_report }.not_to change { report.errors }.from([])
- end
+ it 'does not add warnings to the report' do
+ expect { parse_report }.not_to change { report.warnings }
+ end
- it 'keeps the execution flow as normal' do
- parse_report
+ it 'keeps the execution flow as normal' do
+ parse_report
- expect(parser).to have_received(:create_scanner)
- expect(parser).to have_received(:create_scan)
- end
+ expect(parser).to have_received(:create_scanner)
+ expect(parser).to have_received(:create_scan)
end
end
end
- context 'when show_report_validation_warnings is disabled' do
- before do
- stub_feature_flags(show_report_validation_warnings: false)
- end
-
- context 'when the validate flag is set as `false`' do
- let(:validate) { false }
+ context 'when the validate flag is set to `true`' do
+ let(:validate) { true }
+ let(:valid?) { false }
+ let(:errors) { ['foo'] }
+ let(:warnings) { ['bar'] }
- it 'does not run the validation logic' do
- parse_report
-
- expect(validator_class).not_to have_received(:new)
+ before do
+ allow_next_instance_of(validator_class) do |instance|
+ allow(instance).to receive(:valid?).and_return(valid?)
+ allow(instance).to receive(:errors).and_return(errors)
+ allow(instance).to receive(:warnings).and_return(warnings)
end
+
+ allow(parser).to receive_messages(create_scanner: true, create_scan: true)
end
- context 'when the validate flag is set as `true`' do
- let(:validate) { true }
- let(:valid?) { false }
+ it 'instantiates the validator with correct params' do
+ parse_report
- before do
- allow_next_instance_of(validator_class) do |instance|
- allow(instance).to receive(:valid?).and_return(valid?)
- allow(instance).to receive(:errors).and_return(['foo'])
- end
+ expect(validator_class).to have_received(:new).with(
+ report.type,
+ data.deep_stringify_keys,
+ report.version,
+ project: pipeline.project,
+ scanner: data.dig(:scan, :scanner).deep_stringify_keys
+ )
+ end
- allow(parser).to receive_messages(create_scanner: true, create_scan: true)
+ context 'when the report data is not valid according to the schema' do
+ it 'adds errors to the report' do
+ expect { parse_report }.to change { report.errors }.from([]).to(
+ [
+ { message: 'foo', type: 'Schema' },
+ { message: 'bar', type: 'Schema' }
+ ]
+ )
end
- it 'instantiates the validator with correct params' do
+ it 'does not try to create report entities' do
parse_report
- expect(validator_class).to have_received(:new).with(report.type, {}, report.version)
+ expect(parser).not_to have_received(:create_scanner)
+ expect(parser).not_to have_received(:create_scan)
end
+ end
- context 'when the report data is not valid according to the schema' do
- it 'adds errors to the report' do
- expect { parse_report }.to change { report.errors }.from([]).to([{ message: 'foo', type: 'Schema' }])
- end
-
- it 'does not try to create report entities' do
- parse_report
+ context 'when the report data is valid according to the schema' do
+ let(:valid?) { true }
+ let(:errors) { [] }
+ let(:warnings) { [] }
- expect(parser).not_to have_received(:create_scanner)
- expect(parser).not_to have_received(:create_scan)
- end
+ it 'does not add errors to the report' do
+ expect { parse_report }.not_to change { report.errors }.from([])
end
- context 'when the report data is valid according to the schema' do
- let(:valid?) { true }
-
- it 'does not add errors to the report' do
- expect { parse_report }.not_to change { report.errors }.from([])
- end
+ it 'does not add warnings to the report' do
+ expect { parse_report }.not_to change { report.warnings }.from([])
+ end
- it 'keeps the execution flow as normal' do
- parse_report
+ it 'keeps the execution flow as normal' do
+ parse_report
- expect(parser).to have_received(:create_scanner)
- expect(parser).to have_received(:create_scan)
- end
+ expect(parser).to have_received(:create_scanner)
+ expect(parser).to have_received(:create_scan)
end
end
end
diff --git a/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb b/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
index c83427b68ef..f6409c8b01f 100644
--- a/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
@@ -3,6 +3,18 @@
require 'spec_helper'
RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
+ let_it_be(:project) { create(:project) }
+
+ let(:scanner) do
+ {
+ 'id' => 'gemnasium',
+ 'name' => 'Gemnasium',
+ 'version' => '2.1.0'
+ }
+ end
+
+ let(:validator) { described_class.new(report_type, report_data, report_version, project: project, scanner: scanner) }
+
describe 'SUPPORTED_VERSIONS' do
schema_path = Rails.root.join("lib", "gitlab", "ci", "parsers", "security", "validators", "schemas")
@@ -47,48 +59,652 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
end
end
- using RSpec::Parameterized::TableSyntax
+ describe '#valid?' do
+ subject { validator.valid? }
- where(:report_type, :report_version, :expected_errors, :valid_data) do
- 'sast' | '10.0.0' | ['root is missing required keys: vulnerabilities'] | { 'version' => '10.0.0', 'vulnerabilities' => [] }
- :sast | '10.0.0' | ['root is missing required keys: vulnerabilities'] | { 'version' => '10.0.0', 'vulnerabilities' => [] }
- :secret_detection | '10.0.0' | ['root is missing required keys: vulnerabilities'] | { 'version' => '10.0.0', 'vulnerabilities' => [] }
- end
+ context 'when given a supported schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { described_class::SUPPORTED_VERSIONS[report_type].last }
- with_them do
- let(:validator) { described_class.new(report_type, report_data, report_version) }
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
- describe '#valid?' do
- subject { validator.valid? }
+ it { is_expected.to be_truthy }
+ end
- context 'when given data is invalid according to the schema' do
- let(:report_data) { {} }
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
it { is_expected.to be_falsey }
+
+ it 'logs related information' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ message: "security report schema validation problem",
+ security_report_type: report_type,
+ security_report_version: report_version,
+ project_id: project.id,
+ security_report_failure: 'schema_validation_fails',
+ security_report_scanner_id: 'gemnasium',
+ security_report_scanner_version: '2.1.0'
+ )
+
+ subject
+ end
end
+ end
+
+ context 'when given a deprecated schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { described_class::DEPRECATED_VERSIONS[report_type].last }
- context 'when given data is valid according to the schema' do
- let(:report_data) { valid_data }
+ context 'and the report passes schema validation' do
+ let(:report_data) do
+ {
+ 'version' => '10.0.0',
+ 'vulnerabilities' => []
+ }
+ end
it { is_expected.to be_truthy }
+
+ it 'logs related information' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ message: "security report schema validation problem",
+ security_report_type: report_type,
+ security_report_version: report_version,
+ project_id: project.id,
+ security_report_failure: 'using_deprecated_schema_version',
+ security_report_scanner_id: 'gemnasium',
+ security_report_scanner_version: '2.1.0'
+ )
+
+ subject
+ end
end
- context 'when no report_version is provided' do
- let(:report_version) { nil }
- let(:report_data) { valid_data }
+ context 'and the report does not pass schema validation' do
+ context 'and enforce_security_report_validation is enabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: true)
+ end
+
+ let(:report_data) do
+ {
+ 'version' => 'V2.7.0'
+ }
+ end
- it 'does not fail' do
- expect { subject }.not_to raise_error
+ it { is_expected.to be_falsey }
+ end
+
+ context 'and enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ let(:report_data) do
+ {
+ 'version' => 'V2.7.0'
+ }
+ end
+
+ it { is_expected.to be_truthy }
end
end
end
- describe '#errors' do
- let(:report_data) { { 'version' => '10.0.0' } }
+ context 'when given an unsupported schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { "12.37.0" }
+
+ context 'if enforce_security_report_validation is enabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: true)
+ end
+
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ it { is_expected.to be_falsey }
+
+ it 'logs related information' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ message: "security report schema validation problem",
+ security_report_type: report_type,
+ security_report_version: report_version,
+ project_id: project.id,
+ security_report_failure: 'using_unsupported_schema_version',
+ security_report_scanner_id: 'gemnasium',
+ security_report_scanner_version: '2.1.0'
+ )
+
+ subject
+ end
+ end
+
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
+
+ context 'and scanner information is empty' do
+ let(:scanner) { {} }
+
+ it 'logs related information' do
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ message: "security report schema validation problem",
+ security_report_type: report_type,
+ security_report_version: report_version,
+ project_id: project.id,
+ security_report_failure: 'schema_validation_fails',
+ security_report_scanner_id: nil,
+ security_report_scanner_version: nil
+ )
+
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ message: "security report schema validation problem",
+ security_report_type: report_type,
+ security_report_version: report_version,
+ project_id: project.id,
+ security_report_failure: 'using_unsupported_schema_version',
+ security_report_scanner_id: nil,
+ security_report_scanner_version: nil
+ )
+
+ subject
+ end
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ context 'if enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+ end
+ end
- subject { validator.errors }
+ describe '#errors' do
+ subject { validator.errors }
- it { is_expected.to eq(expected_errors) }
+ context 'when given a supported schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { described_class::SUPPORTED_VERSIONS[report_type].last }
+
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ let(:expected_errors) { [] }
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
+
+ context 'if enforce_security_report_validation is enabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: project)
+ end
+
+ let(:expected_errors) do
+ [
+ 'root is missing required keys: vulnerabilities'
+ ]
+ end
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+
+ context 'if enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ let(:expected_errors) { [] }
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+ end
+ end
+
+ context 'when given a deprecated schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { described_class::DEPRECATED_VERSIONS[report_type].last }
+
+ context 'and the report passes schema validation' do
+ let(:report_data) do
+ {
+ 'version' => '10.0.0',
+ 'vulnerabilities' => []
+ }
+ end
+
+ let(:expected_errors) { [] }
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+
+ context 'and the report does not pass schema validation' do
+ context 'and enforce_security_report_validation is enabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: true)
+ end
+
+ let(:report_data) do
+ {
+ 'version' => 'V2.7.0'
+ }
+ end
+
+ let(:expected_errors) do
+ [
+ "property '/version' does not match pattern: ^[0-9]+\\.[0-9]+\\.[0-9]+$",
+ "root is missing required keys: vulnerabilities"
+ ]
+ end
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+
+ context 'and enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ let(:report_data) do
+ {
+ 'version' => 'V2.7.0'
+ }
+ end
+
+ let(:expected_errors) { [] }
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+ end
+ end
+
+ context 'when given an unsupported schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { "12.37.0" }
+
+ context 'if enforce_security_report_validation is enabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: true)
+ end
+
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ let(:expected_errors) do
+ [
+ "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1"
+ ]
+ end
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
+
+ let(:expected_errors) do
+ [
+ "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1",
+ "root is missing required keys: vulnerabilities"
+ ]
+ end
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+ end
+
+ context 'if enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ let(:expected_errors) { [] }
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
+
+ let(:expected_errors) { [] }
+
+ it { is_expected.to match_array(expected_errors) }
+ end
+ end
+ end
+ end
+
+ describe '#deprecation_warnings' do
+ subject { validator.deprecation_warnings }
+
+ context 'when given a supported schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { described_class::SUPPORTED_VERSIONS[report_type].last }
+
+ let(:expected_deprecation_warnings) { [] }
+
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ it { is_expected.to match_array(expected_deprecation_warnings) }
+ end
+
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
+
+ it { is_expected.to match_array(expected_deprecation_warnings) }
+ end
+ end
+
+ context 'when given a deprecated schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { described_class::DEPRECATED_VERSIONS[report_type].last }
+ let(:expected_deprecation_warnings) do
+ [
+ "Version V2.7.0 for report type dast has been deprecated, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1"
+ ]
+ end
+
+ context 'and the report passes schema validation' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ it { is_expected.to match_array(expected_deprecation_warnings) }
+ end
+
+ context 'and the report does not pass schema validation' do
+ let(:report_data) do
+ {
+ 'version' => 'V2.7.0'
+ }
+ end
+
+ it { is_expected.to match_array(expected_deprecation_warnings) }
+ end
+ end
+
+ context 'when given an unsupported schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { "21.37.0" }
+ let(:expected_deprecation_warnings) { [] }
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ it { is_expected.to match_array(expected_deprecation_warnings) }
+ end
+ end
+
+ describe '#warnings' do
+ subject { validator.warnings }
+
+ context 'when given a supported schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { described_class::SUPPORTED_VERSIONS[report_type].last }
+
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ let(:expected_warnings) { [] }
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
+
+ context 'if enforce_security_report_validation is enabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: project)
+ end
+
+ let(:expected_warnings) { [] }
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+
+ context 'if enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ let(:expected_warnings) do
+ [
+ 'root is missing required keys: vulnerabilities'
+ ]
+ end
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+ end
+ end
+
+ context 'when given a deprecated schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { described_class::DEPRECATED_VERSIONS[report_type].last }
+
+ context 'and the report passes schema validation' do
+ let(:report_data) do
+ {
+ 'vulnerabilities' => []
+ }
+ end
+
+ let(:expected_warnings) { [] }
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+
+ context 'and the report does not pass schema validation' do
+ let(:report_data) do
+ {
+ 'version' => 'V2.7.0'
+ }
+ end
+
+ context 'and enforce_security_report_validation is enabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: true)
+ end
+
+ let(:expected_warnings) { [] }
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+
+ context 'and enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ let(:expected_warnings) do
+ [
+ "property '/version' does not match pattern: ^[0-9]+\\.[0-9]+\\.[0-9]+$",
+ "root is missing required keys: vulnerabilities"
+ ]
+ end
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+ end
+ end
+
+ context 'when given an unsupported schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { "12.37.0" }
+
+ context 'if enforce_security_report_validation is enabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: true)
+ end
+
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ let(:expected_warnings) { [] }
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
+
+ let(:expected_warnings) { [] }
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+ end
+
+ context 'if enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ context 'and the report is valid' do
+ let(:report_data) do
+ {
+ 'version' => report_version,
+ 'vulnerabilities' => []
+ }
+ end
+
+ let(:expected_warnings) do
+ [
+ "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1"
+ ]
+ end
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+
+ context 'and the report is invalid' do
+ let(:report_data) do
+ {
+ 'version' => report_version
+ }
+ end
+
+ let(:expected_warnings) do
+ [
+ "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1",
+ "root is missing required keys: vulnerabilities"
+ ]
+ end
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb
new file mode 100644
index 00000000000..aa8aec2af4a
--- /dev/null
+++ b/spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb
@@ -0,0 +1,179 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Gitlab::Ci::Pipeline::Chain::Limit::RateLimit, :freeze_time, :clean_gitlab_redis_rate_limiting do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:project, reload: true) { create(:project, namespace: namespace) }
+
+ let(:save_incompleted) { false }
+ let(:throttle_message) do
+ 'Too many pipelines created in the last minute. Try again later.'
+ end
+
+ let(:command) do
+ Gitlab::Ci::Pipeline::Chain::Command.new(
+ project: project,
+ current_user: user,
+ save_incompleted: save_incompleted
+ )
+ end
+
+ let(:pipeline) { build(:ci_pipeline, project: project, source: source) }
+ let(:source) { 'push' }
+ let(:step) { described_class.new(pipeline, command) }
+
+ def perform(count: 2)
+ count.times { step.perform! }
+ end
+
+ context 'when the limit is exceeded' do
+ before do
+ allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits)
+ .and_return(pipelines_create: { threshold: 1, interval: 1.minute })
+
+ stub_feature_flags(ci_throttle_pipelines_creation_dry_run: false)
+ end
+
+ it 'does not persist the pipeline' do
+ perform
+
+ expect(pipeline).not_to be_persisted
+ expect(pipeline.errors.added?(:base, throttle_message)).to be_truthy
+ end
+
+ it 'breaks the chain' do
+ perform
+
+ expect(step.break?).to be_truthy
+ end
+
+ it 'creates a log entry' do
+ expect(Gitlab::AppJsonLogger).to receive(:info).with(
+ a_hash_including(
+ class: described_class.name,
+ project_id: project.id,
+ subscription_plan: project.actual_plan_name,
+ commit_sha: command.sha
+ )
+ )
+
+ perform
+ end
+
+ context 'with child pipelines' do
+ let(:source) { 'parent_pipeline' }
+
+ it 'does not break the chain' do
+ perform
+
+ expect(step.break?).to be_falsey
+ end
+
+ it 'does not invalidate the pipeline' do
+ perform
+
+ expect(pipeline.errors).to be_empty
+ end
+
+ it 'does not log anything' do
+ expect(Gitlab::AppJsonLogger).not_to receive(:info)
+
+ perform
+ end
+ end
+
+ context 'when saving incompleted pipelines' do
+ let(:save_incompleted) { true }
+
+ it 'does not persist the pipeline' do
+ perform
+
+ expect(pipeline).not_to be_persisted
+ expect(pipeline.errors.added?(:base, throttle_message)).to be_truthy
+ end
+
+ it 'breaks the chain' do
+ perform
+
+ expect(step.break?).to be_truthy
+ end
+ end
+
+ context 'when ci_throttle_pipelines_creation is disabled' do
+ before do
+ stub_feature_flags(ci_throttle_pipelines_creation: false)
+ end
+
+ it 'does not break the chain' do
+ perform
+
+ expect(step.break?).to be_falsey
+ end
+
+ it 'does not invalidate the pipeline' do
+ perform
+
+ expect(pipeline.errors).to be_empty
+ end
+
+ it 'does not log anything' do
+ expect(Gitlab::AppJsonLogger).not_to receive(:info)
+
+ perform
+ end
+ end
+
+ context 'when ci_throttle_pipelines_creation_dry_run is enabled' do
+ before do
+ stub_feature_flags(ci_throttle_pipelines_creation_dry_run: true)
+ end
+
+ it 'does not break the chain' do
+ perform
+
+ expect(step.break?).to be_falsey
+ end
+
+ it 'does not invalidate the pipeline' do
+ perform
+
+ expect(pipeline.errors).to be_empty
+ end
+
+ it 'creates a log entry' do
+ expect(Gitlab::AppJsonLogger).to receive(:info).with(
+ a_hash_including(
+ class: described_class.name,
+ project_id: project.id,
+ subscription_plan: project.actual_plan_name,
+ commit_sha: command.sha
+ )
+ )
+
+ perform
+ end
+ end
+ end
+
+ context 'when the limit is not exceeded' do
+ it 'does not break the chain' do
+ perform
+
+ expect(step.break?).to be_falsey
+ end
+
+ it 'does not invalidate the pipeline' do
+ perform
+
+ expect(pipeline.errors).to be_empty
+ end
+
+ it 'does not log anything' do
+ expect(Gitlab::AppJsonLogger).not_to receive(:info)
+
+ perform
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb
index 8e0b032e68c..ddd0de69d79 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::TemplateUsage do
%w(Template-1 Template-2).each do |expected_template|
expect(Gitlab::UsageDataCounters::CiTemplateUniqueCounter).to(
receive(:track_unique_project_event)
- .with(project_id: project.id, template: expected_template, config_source: pipeline.config_source)
+ .with(project: project, template: expected_template, config_source: pipeline.config_source, user: user)
)
end
diff --git a/spec/lib/gitlab/ci/reports/security/report_spec.rb b/spec/lib/gitlab/ci/reports/security/report_spec.rb
index 4dc1eca3859..ab0efb90901 100644
--- a/spec/lib/gitlab/ci/reports/security/report_spec.rb
+++ b/spec/lib/gitlab/ci/reports/security/report_spec.rb
@@ -184,6 +184,22 @@ RSpec.describe Gitlab::Ci::Reports::Security::Report do
end
end
+ describe 'warnings?' do
+ subject { report.warnings? }
+
+ context 'when the report does not have any errors' do
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when the report has warnings' do
+ before do
+ report.add_warning('foo', 'bar')
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+
describe '#primary_scanner_order_to' do
let(:scanner_1) { build(:ci_reports_security_scanner) }
let(:scanner_2) { build(:ci_reports_security_scanner) }
diff --git a/spec/lib/gitlab/ci/reports/security/scanner_spec.rb b/spec/lib/gitlab/ci/reports/security/scanner_spec.rb
index 99f5d4723d3..eb406e01b24 100644
--- a/spec/lib/gitlab/ci/reports/security/scanner_spec.rb
+++ b/spec/lib/gitlab/ci/reports/security/scanner_spec.rb
@@ -109,6 +109,7 @@ RSpec.describe Gitlab::Ci::Reports::Security::Scanner do
{ external_id: 'gemnasium-maven', name: 'foo', vendor: 'bar' } | { external_id: 'gemnasium-python', name: 'foo', vendor: 'bar' } | -1
{ external_id: 'gemnasium-python', name: 'foo', vendor: 'bar' } | { external_id: 'bandit', name: 'foo', vendor: 'bar' } | 1
{ external_id: 'bandit', name: 'foo', vendor: 'bar' } | { external_id: 'semgrep', name: 'foo', vendor: 'bar' } | -1
+ { external_id: 'spotbugs', name: 'foo', vendor: 'bar' } | { external_id: 'semgrep', name: 'foo', vendor: 'bar' } | -1
{ external_id: 'semgrep', name: 'foo', vendor: 'bar' } | { external_id: 'unknown', name: 'foo', vendor: 'bar' } | -1
{ external_id: 'gemnasium', name: 'foo', vendor: 'bar' } | { external_id: 'gemnasium', name: 'foo', vendor: nil } | 1
end
diff --git a/spec/lib/gitlab/ci/runner_releases_spec.rb b/spec/lib/gitlab/ci/runner_releases_spec.rb
new file mode 100644
index 00000000000..9e4a8739c0f
--- /dev/null
+++ b/spec/lib/gitlab/ci/runner_releases_spec.rb
@@ -0,0 +1,114 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::RunnerReleases do
+ subject { described_class.instance }
+
+ describe '#releases' do
+ before do
+ subject.reset!
+
+ stub_application_setting(public_runner_releases_url: 'the release API URL')
+ allow(Gitlab::HTTP).to receive(:try_get).with('the release API URL').once { mock_http_response(response) }
+ end
+
+ def releases
+ subject.releases
+ end
+
+ shared_examples 'requests that follow cache status' do |validity_period|
+ context "almost #{validity_period.inspect} later" do
+ let(:followup_request_interval) { validity_period - 0.001.seconds }
+
+ it 'returns cached releases' do
+ releases
+
+ travel followup_request_interval do
+ expect(Gitlab::HTTP).not_to receive(:try_get)
+
+ expect(releases).to eq(expected_result)
+ end
+ end
+ end
+
+ context "after #{validity_period.inspect}" do
+ let(:followup_request_interval) { validity_period + 1.second }
+ let(:followup_response) { (response || []) + [{ 'name' => 'v14.9.2' }] }
+
+ it 'checks new releases' do
+ releases
+
+ travel followup_request_interval do
+ expect(Gitlab::HTTP).to receive(:try_get).with('the release API URL').once { mock_http_response(followup_response) }
+
+ expect(releases).to eq((expected_result || []) + [Gitlab::VersionInfo.new(14, 9, 2)])
+ end
+ end
+ end
+ end
+
+ context 'when response is nil' do
+ let(:response) { nil }
+ let(:expected_result) { nil }
+
+ it 'returns nil' do
+ expect(releases).to be_nil
+ end
+
+ it_behaves_like 'requests that follow cache status', 5.seconds
+
+ it 'performs exponential backoff on requests', :aggregate_failures do
+ start_time = Time.now.utc.change(usec: 0)
+
+ http_call_timestamp_offsets = []
+ allow(Gitlab::HTTP).to receive(:try_get).with('the release API URL') do
+ http_call_timestamp_offsets << Time.now.utc - start_time
+ mock_http_response(response)
+ end
+
+ # An initial HTTP request fails
+ travel_to(start_time)
+ subject.reset!
+ expect(releases).to be_nil
+
+ # Successive failed requests result in HTTP requests only after specific backoff periods
+ backoff_periods = [5, 10, 20, 40, 80, 160, 320, 640, 1280, 2560, 3600].map(&:seconds)
+ backoff_periods.each do |period|
+ travel(period - 1.second)
+ expect(releases).to be_nil
+
+ travel 1.second
+ expect(releases).to be_nil
+ end
+
+ expect(http_call_timestamp_offsets).to eq([0, 5, 15, 35, 75, 155, 315, 635, 1275, 2555, 5115, 8715])
+
+ # Finally a successful HTTP request results in releases being returned
+ allow(Gitlab::HTTP).to receive(:try_get).with('the release API URL').once { mock_http_response([{ 'name' => 'v14.9.1' }]) }
+ travel 1.hour
+ expect(releases).not_to be_nil
+ end
+ end
+
+ context 'when response is not nil' do
+ let(:response) { [{ 'name' => 'v14.9.1' }, { 'name' => 'v14.9.0' }] }
+ let(:expected_result) { [Gitlab::VersionInfo.new(14, 9, 0), Gitlab::VersionInfo.new(14, 9, 1)] }
+
+ it 'returns parsed and sorted Gitlab::VersionInfo objects' do
+ expect(releases).to eq(expected_result)
+ end
+
+ it_behaves_like 'requests that follow cache status', 1.day
+ end
+
+ def mock_http_response(response)
+ http_response = instance_double(HTTParty::Response)
+
+ allow(http_response).to receive(:success?).and_return(response.present?)
+ allow(http_response).to receive(:parsed_response).and_return(response)
+
+ http_response
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb b/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb
new file mode 100644
index 00000000000..b430da376dd
--- /dev/null
+++ b/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::RunnerUpgradeCheck do
+ include StubVersion
+ using RSpec::Parameterized::TableSyntax
+
+ describe '#check_runner_upgrade_status' do
+ subject(:result) { described_class.instance.check_runner_upgrade_status(runner_version) }
+
+ before do
+ runner_releases_double = instance_double(Gitlab::Ci::RunnerReleases)
+
+ allow(Gitlab::Ci::RunnerReleases).to receive(:instance).and_return(runner_releases_double)
+ allow(runner_releases_double).to receive(:releases).and_return(available_runner_releases.map { |v| ::Gitlab::VersionInfo.parse(v) })
+ end
+
+ context 'with available_runner_releases configured up to 14.1.1' do
+ let(:available_runner_releases) { %w[13.9.0 13.9.1 13.9.2 13.10.0 13.10.1 14.0.0 14.0.1 14.0.2 14.1.0 14.1.1 14.1.1-rc3] }
+
+ context 'with nil runner_version' do
+ let(:runner_version) { nil }
+
+ it 'raises :unknown' do
+ is_expected.to eq(:unknown)
+ end
+ end
+
+ context 'with invalid runner_version' do
+ let(:runner_version) { 'junk' }
+
+ it 'raises ArgumentError' do
+ expect { subject }.to raise_error(ArgumentError)
+ end
+ end
+
+ context 'with Gitlab::VERSION set to 14.1.123' do
+ before do
+ stub_version('14.1.123', 'deadbeef')
+
+ described_class.instance.reset!
+ end
+
+ context 'with a runner_version that is too recent' do
+ let(:runner_version) { 'v14.2.0' }
+
+ it 'returns :not_available' do
+ is_expected.to eq(:not_available)
+ end
+ end
+ end
+
+ context 'with Gitlab::VERSION set to 14.0.123' do
+ before do
+ stub_version('14.0.123', 'deadbeef')
+
+ described_class.instance.reset!
+ end
+
+ context 'with valid params' do
+ where(:runner_version, :expected_result) do
+ 'v14.1.0-rc3' | :not_available # not available since the GitLab instance is still on 14.0.x
+ 'v14.1.0~beta.1574.gf6ea9389' | :not_available # suffixes are correctly handled
+ 'v14.1.0/1.1.0' | :not_available # suffixes are correctly handled
+ 'v14.1.0' | :not_available # not available since the GitLab instance is still on 14.0.x
+ 'v14.0.1' | :recommended # recommended upgrade since 14.0.2 is available
+ 'v14.0.2' | :not_available # not available since 14.0.2 is the latest 14.0.x release available
+ 'v13.10.1' | :available # available upgrade: 14.1.1
+ 'v13.10.1~beta.1574.gf6ea9389' | :available # suffixes are correctly handled
+ 'v13.10.1/1.1.0' | :available # suffixes are correctly handled
+ 'v13.10.0' | :recommended # recommended upgrade since 13.10.1 is available
+ 'v13.9.2' | :recommended # recommended upgrade since backports are no longer released for this version
+ 'v13.9.0' | :recommended # recommended upgrade since backports are no longer released for this version
+ 'v13.8.1' | :recommended # recommended upgrade since build is too old (missing in records)
+ 'v11.4.1' | :recommended # recommended upgrade since build is too old (missing in records)
+ end
+
+ with_them do
+ it 'returns symbol representing expected upgrade status' do
+ is_expected.to be_a(Symbol)
+ is_expected.to eq(expected_result)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/status/build/manual_spec.rb b/spec/lib/gitlab/ci/status/build/manual_spec.rb
index 78193055139..150705c1e36 100644
--- a/spec/lib/gitlab/ci/status/build/manual_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/manual_spec.rb
@@ -3,15 +3,27 @@
require 'spec_helper'
RSpec.describe Gitlab::Ci::Status::Build::Manual do
- let(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:job) { create(:ci_build, :manual) }
subject do
- build = create(:ci_build, :manual)
- described_class.new(Gitlab::Ci::Status::Core.new(build, user))
+ described_class.new(Gitlab::Ci::Status::Core.new(job, user))
end
describe '#illustration' do
it { expect(subject.illustration).to include(:image, :size, :title, :content) }
+
+ context 'when the user can trigger the job' do
+ before do
+ job.project.add_maintainer(user)
+ end
+
+ it { expect(subject.illustration[:content]).to match /This job requires manual intervention to start/ }
+ end
+
+ context 'when the user can not trigger the job' do
+ it { expect(subject.illustration[:content]).to match /This job does not run automatically and must be started manually/ }
+ end
end
describe '.matches?' do
diff --git a/spec/lib/gitlab/ci/templates/MATLAB_spec.rb b/spec/lib/gitlab/ci/templates/MATLAB_spec.rb
new file mode 100644
index 00000000000..a12d69b67a6
--- /dev/null
+++ b/spec/lib/gitlab/ci/templates/MATLAB_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'MATLAB.gitlab-ci.yml' do
+ subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('MATLAB') }
+
+ describe 'the created pipeline' do
+ let_it_be(:project) { create(:project, :auto_devops, :custom_repo, files: { 'README.md' => '' }) }
+
+ let(:user) { project.first_owner }
+ let(:default_branch) { 'master' }
+ let(:pipeline_branch) { default_branch }
+ let(:service) { Ci::CreatePipelineService.new(project, user, ref: pipeline_branch ) }
+ let(:pipeline) { service.execute!(:push).payload }
+ let(:build_names) { pipeline.builds.pluck(:name) }
+
+ before do
+ stub_ci_pipeline_yaml_file(template.content)
+ end
+
+ it 'creates all jobs' do
+ expect(build_names).to include('command', 'test', 'test_artifacts_job')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/templates/templates_spec.rb b/spec/lib/gitlab/ci/templates/templates_spec.rb
index cdda7e953d0..ca096fcecc4 100644
--- a/spec/lib/gitlab/ci/templates/templates_spec.rb
+++ b/spec/lib/gitlab/ci/templates/templates_spec.rb
@@ -23,7 +23,8 @@ RSpec.describe 'CI YML Templates' do
exceptions = [
'Security/DAST.gitlab-ci.yml', # DAST stage is defined inside AutoDevops yml
'Security/DAST-API.gitlab-ci.yml', # no auto-devops
- 'Security/API-Fuzzing.gitlab-ci.yml' # no auto-devops
+ 'Security/API-Fuzzing.gitlab-ci.yml', # no auto-devops
+ 'ThemeKit.gitlab-ci.yml'
]
context 'when including available templates in a CI YAML configuration' do
diff --git a/spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb
new file mode 100644
index 00000000000..4708108f404
--- /dev/null
+++ b/spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'ThemeKit.gitlab-ci.yml' do
+ before do
+ allow(Gitlab::Template::GitlabCiYmlTemplate).to receive(:excluded_patterns).and_return([])
+ end
+
+ subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('ThemeKit') }
+
+ describe 'the created pipeline' do
+ let(:pipeline_ref) { project.default_branch_or_main }
+ let(:project) { create(:project, :custom_repo, files: { 'README.md' => '' }) }
+ let(:user) { project.first_owner }
+ let(:service) { Ci::CreatePipelineService.new(project, user, ref: pipeline_ref) }
+ let(:pipeline) { service.execute!(:push).payload }
+ let(:build_names) { pipeline.builds.pluck(:name) }
+
+ before do
+ stub_ci_pipeline_yaml_file(template.content)
+ end
+
+ context 'on the default branch' do
+ it 'only creates staging deploy', :aggregate_failures do
+ expect(pipeline.errors).to be_empty
+ expect(build_names).to include('staging')
+ expect(build_names).not_to include('production')
+ end
+ end
+
+ context 'on a tag' do
+ let(:pipeline_ref) { '1.0' }
+
+ before do
+ project.repository.add_tag(user, pipeline_ref, project.default_branch_or_main)
+ end
+
+ it 'only creates a production deploy', :aggregate_failures do
+ expect(pipeline.errors).to be_empty
+ expect(build_names).to include('production')
+ expect(build_names).not_to include('staging')
+ end
+ end
+
+ context 'outside of the default branch' do
+ let(:pipeline_ref) { 'patch-1' }
+
+ before do
+ project.repository.create_branch(pipeline_ref, project.default_branch_or_main)
+ end
+
+ it 'has no jobs' do
+ expect { pipeline }.to raise_error(
+ Ci::CreatePipelineService::CreateError, 'No stages / jobs for this pipeline.'
+ )
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/variables/builder_spec.rb b/spec/lib/gitlab/ci/variables/builder_spec.rb
index 8552a06eab3..b9aa5f7c431 100644
--- a/spec/lib/gitlab/ci/variables/builder_spec.rb
+++ b/spec/lib/gitlab/ci/variables/builder_spec.rb
@@ -199,6 +199,20 @@ RSpec.describe Gitlab::Ci::Variables::Builder do
'O' => '15', 'P' => '15')
end
end
+
+ context 'with schedule variables' do
+ let_it_be(:schedule) { create(:ci_pipeline_schedule, project: project) }
+ let_it_be(:schedule_variable) { create(:ci_pipeline_schedule_variable, pipeline_schedule: schedule) }
+
+ before do
+ pipeline.update!(pipeline_schedule_id: schedule.id)
+ end
+
+ it 'includes schedule variables' do
+ expect(subject.to_runner_variables)
+ .to include(a_hash_including(key: schedule_variable.key, value: schedule_variable.value))
+ end
+ end
end
describe '#user_variables' do
@@ -278,6 +292,14 @@ RSpec.describe Gitlab::Ci::Variables::Builder do
end
shared_examples "secret CI variables" do
+ let(:protected_variable_item) do
+ Gitlab::Ci::Variables::Collection::Item.fabricate(protected_variable)
+ end
+
+ let(:unprotected_variable_item) do
+ Gitlab::Ci::Variables::Collection::Item.fabricate(unprotected_variable)
+ end
+
context 'when ref is branch' do
context 'when ref is protected' do
before do
@@ -338,189 +360,255 @@ RSpec.describe Gitlab::Ci::Variables::Builder do
let_it_be(:protected_variable) { create(:ci_instance_variable, protected: true) }
let_it_be(:unprotected_variable) { create(:ci_instance_variable, protected: false) }
- let(:protected_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(protected_variable) }
- let(:unprotected_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(unprotected_variable) }
-
include_examples "secret CI variables"
end
describe '#secret_group_variables' do
- subject { builder.secret_group_variables(ref: job.git_ref, environment: job.expanded_environment_name) }
+ subject { builder.secret_group_variables(environment: job.expanded_environment_name) }
let_it_be(:protected_variable) { create(:ci_group_variable, protected: true, group: group) }
let_it_be(:unprotected_variable) { create(:ci_group_variable, protected: false, group: group) }
- context 'with ci_variables_builder_memoize_secret_variables disabled' do
- before do
- stub_feature_flags(ci_variables_builder_memoize_secret_variables: false)
+ include_examples "secret CI variables"
+
+ context 'variables memoization' do
+ let_it_be(:scoped_variable) { create(:ci_group_variable, group: group, environment_scope: 'scoped') }
+
+ let(:environment) { job.expanded_environment_name }
+ let(:scoped_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(scoped_variable) }
+
+ context 'with protected environments' do
+ it 'memoizes the result by environment' do
+ expect(pipeline.project)
+ .to receive(:protected_for?)
+ .with(pipeline.jobs_git_ref)
+ .once.and_return(true)
+
+ expect_next_instance_of(described_class::Group) do |group_variables_builder|
+ expect(group_variables_builder)
+ .to receive(:secret_variables)
+ .with(environment: 'production', protected_ref: true)
+ .once
+ .and_call_original
+ end
+
+ 2.times do
+ expect(builder.secret_group_variables(environment: 'production'))
+ .to contain_exactly(unprotected_variable_item, protected_variable_item)
+ end
+ end
end
- let(:protected_variable_item) { protected_variable }
- let(:unprotected_variable_item) { unprotected_variable }
+ context 'with unprotected environments' do
+ it 'memoizes the result by environment' do
+ expect(pipeline.project)
+ .to receive(:protected_for?)
+ .with(pipeline.jobs_git_ref)
+ .once.and_return(false)
+
+ expect_next_instance_of(described_class::Group) do |group_variables_builder|
+ expect(group_variables_builder)
+ .to receive(:secret_variables)
+ .with(environment: nil, protected_ref: false)
+ .once
+ .and_call_original
+
+ expect(group_variables_builder)
+ .to receive(:secret_variables)
+ .with(environment: 'scoped', protected_ref: false)
+ .once
+ .and_call_original
+ end
+
+ 2.times do
+ expect(builder.secret_group_variables(environment: nil))
+ .to contain_exactly(unprotected_variable_item)
- include_examples "secret CI variables"
+ expect(builder.secret_group_variables(environment: 'scoped'))
+ .to contain_exactly(unprotected_variable_item, scoped_variable_item)
+ end
+ end
+ end
end
+ end
- context 'with ci_variables_builder_memoize_secret_variables enabled' do
- before do
- stub_feature_flags(ci_variables_builder_memoize_secret_variables: true)
- end
+ describe '#secret_project_variables' do
+ let_it_be(:protected_variable) { create(:ci_variable, protected: true, project: project) }
+ let_it_be(:unprotected_variable) { create(:ci_variable, protected: false, project: project) }
- let(:protected_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(protected_variable) }
- let(:unprotected_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(unprotected_variable) }
+ let(:environment) { job.expanded_environment_name }
- include_examples "secret CI variables"
+ subject { builder.secret_project_variables(environment: environment) }
- context 'variables memoization' do
- let_it_be(:scoped_variable) { create(:ci_group_variable, group: group, environment_scope: 'scoped') }
+ include_examples "secret CI variables"
- let(:ref) { job.git_ref }
- let(:environment) { job.expanded_environment_name }
- let(:scoped_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(scoped_variable) }
+ context 'variables memoization' do
+ let_it_be(:scoped_variable) { create(:ci_variable, project: project, environment_scope: 'scoped') }
- context 'with protected environments' do
- it 'memoizes the result by environment' do
- expect(pipeline.project)
- .to receive(:protected_for?)
- .with(pipeline.jobs_git_ref)
- .once.and_return(true)
+ let(:scoped_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(scoped_variable) }
- expect_next_instance_of(described_class::Group) do |group_variables_builder|
- expect(group_variables_builder)
- .to receive(:secret_variables)
- .with(environment: 'production', protected_ref: true)
- .once
- .and_call_original
- end
+ context 'with protected environments' do
+ it 'memoizes the result by environment' do
+ expect(pipeline.project)
+ .to receive(:protected_for?)
+ .with(pipeline.jobs_git_ref)
+ .once.and_return(true)
- 2.times do
- expect(builder.secret_group_variables(ref: ref, environment: 'production'))
- .to contain_exactly(unprotected_variable_item, protected_variable_item)
- end
+ expect_next_instance_of(described_class::Project) do |project_variables_builder|
+ expect(project_variables_builder)
+ .to receive(:secret_variables)
+ .with(environment: 'production', protected_ref: true)
+ .once
+ .and_call_original
+ end
+
+ 2.times do
+ expect(builder.secret_project_variables(environment: 'production'))
+ .to contain_exactly(unprotected_variable_item, protected_variable_item)
end
end
+ end
- context 'with unprotected environments' do
- it 'memoizes the result by environment' do
- expect(pipeline.project)
- .to receive(:protected_for?)
- .with(pipeline.jobs_git_ref)
- .once.and_return(false)
-
- expect_next_instance_of(described_class::Group) do |group_variables_builder|
- expect(group_variables_builder)
- .to receive(:secret_variables)
- .with(environment: nil, protected_ref: false)
- .once
- .and_call_original
-
- expect(group_variables_builder)
- .to receive(:secret_variables)
- .with(environment: 'scoped', protected_ref: false)
- .once
- .and_call_original
- end
-
- 2.times do
- expect(builder.secret_group_variables(ref: 'other', environment: nil))
- .to contain_exactly(unprotected_variable_item)
-
- expect(builder.secret_group_variables(ref: 'other', environment: 'scoped'))
- .to contain_exactly(unprotected_variable_item, scoped_variable_item)
- end
+ context 'with unprotected environments' do
+ it 'memoizes the result by environment' do
+ expect(pipeline.project)
+ .to receive(:protected_for?)
+ .with(pipeline.jobs_git_ref)
+ .once.and_return(false)
+
+ expect_next_instance_of(described_class::Project) do |project_variables_builder|
+ expect(project_variables_builder)
+ .to receive(:secret_variables)
+ .with(environment: nil, protected_ref: false)
+ .once
+ .and_call_original
+
+ expect(project_variables_builder)
+ .to receive(:secret_variables)
+ .with(environment: 'scoped', protected_ref: false)
+ .once
+ .and_call_original
+ end
+
+ 2.times do
+ expect(builder.secret_project_variables(environment: nil))
+ .to contain_exactly(unprotected_variable_item)
+
+ expect(builder.secret_project_variables(environment: 'scoped'))
+ .to contain_exactly(unprotected_variable_item, scoped_variable_item)
end
end
end
end
end
- describe '#secret_project_variables' do
- let_it_be(:protected_variable) { create(:ci_variable, protected: true, project: project) }
- let_it_be(:unprotected_variable) { create(:ci_variable, protected: false, project: project) }
+ describe '#config_variables' do
+ subject(:config_variables) { builder.config_variables }
- let(:ref) { job.git_ref }
- let(:environment) { job.expanded_environment_name }
+ context 'without project' do
+ before do
+ pipeline.update!(project_id: nil)
+ end
+
+ it { expect(config_variables.size).to eq(0) }
+ end
- subject { builder.secret_project_variables(ref: ref, environment: environment) }
+ context 'without repository' do
+ let(:project) { create(:project) }
+ let(:pipeline) { build(:ci_pipeline, ref: nil, sha: nil, project: project) }
- context 'with ci_variables_builder_memoize_secret_variables disabled' do
- before do
- stub_feature_flags(ci_variables_builder_memoize_secret_variables: false)
+ it { expect(config_variables['CI_COMMIT_SHA']).to be_nil }
+ end
+
+ context 'with protected variables' do
+ let_it_be(:instance_variable) do
+ create(:ci_instance_variable, :protected, key: 'instance_variable')
+ end
+
+ let_it_be(:group_variable) do
+ create(:ci_group_variable, :protected, group: group, key: 'group_variable')
end
- let(:protected_variable_item) { protected_variable }
- let(:unprotected_variable_item) { unprotected_variable }
+ let_it_be(:project_variable) do
+ create(:ci_variable, :protected, project: project, key: 'project_variable')
+ end
- include_examples "secret CI variables"
+ it 'does not include protected variables' do
+ expect(config_variables[instance_variable.key]).to be_nil
+ expect(config_variables[group_variable.key]).to be_nil
+ expect(config_variables[project_variable.key]).to be_nil
+ end
end
- context 'with ci_variables_builder_memoize_secret_variables enabled' do
- before do
- stub_feature_flags(ci_variables_builder_memoize_secret_variables: true)
+ context 'with scoped variables' do
+ let_it_be(:scoped_group_variable) do
+ create(:ci_group_variable,
+ group: group,
+ key: 'group_variable',
+ value: 'scoped',
+ environment_scope: 'scoped')
end
- let(:protected_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(protected_variable) }
- let(:unprotected_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(unprotected_variable) }
+ let_it_be(:group_variable) do
+ create(:ci_group_variable,
+ group: group,
+ key: 'group_variable',
+ value: 'unscoped')
+ end
- include_examples "secret CI variables"
+ let_it_be(:scoped_project_variable) do
+ create(:ci_variable,
+ project: project,
+ key: 'project_variable',
+ value: 'scoped',
+ environment_scope: 'scoped')
+ end
- context 'variables memoization' do
- let_it_be(:scoped_variable) { create(:ci_variable, project: project, environment_scope: 'scoped') }
+ let_it_be(:project_variable) do
+ create(:ci_variable,
+ project: project,
+ key: 'project_variable',
+ value: 'unscoped')
+ end
- let(:scoped_variable_item) { Gitlab::Ci::Variables::Collection::Item.fabricate(scoped_variable) }
+ it 'does not include scoped variables' do
+ expect(config_variables.to_hash[group_variable.key]).to eq('unscoped')
+ expect(config_variables.to_hash[project_variable.key]).to eq('unscoped')
+ end
+ end
- context 'with protected environments' do
- it 'memoizes the result by environment' do
- expect(pipeline.project)
- .to receive(:protected_for?)
- .with(pipeline.jobs_git_ref)
- .once.and_return(true)
+ context 'variables ordering' do
+ def var(name, value)
+ { key: name, value: value.to_s, public: true, masked: false }
+ end
- expect_next_instance_of(described_class::Project) do |project_variables_builder|
- expect(project_variables_builder)
- .to receive(:secret_variables)
- .with(environment: 'production', protected_ref: true)
- .once
- .and_call_original
- end
+ before do
+ allow(pipeline.project).to receive(:predefined_variables) { [var('A', 1), var('B', 1)] }
+ allow(pipeline).to receive(:predefined_variables) { [var('B', 2), var('C', 2)] }
+ allow(builder).to receive(:secret_instance_variables) { [var('C', 3), var('D', 3)] }
+ allow(builder).to receive(:secret_group_variables) { [var('D', 4), var('E', 4)] }
+ allow(builder).to receive(:secret_project_variables) { [var('E', 5), var('F', 5)] }
+ allow(pipeline).to receive(:variables) { [var('F', 6), var('G', 6)] }
+ allow(pipeline).to receive(:pipeline_schedule) { double(job_variables: [var('G', 7), var('H', 7)]) }
+ end
- 2.times do
- expect(builder.secret_project_variables(ref: ref, environment: 'production'))
- .to contain_exactly(unprotected_variable_item, protected_variable_item)
- end
- end
- end
+ it 'returns variables in order depending on resource hierarchy' do
+ expect(config_variables.to_runner_variables).to eq(
+ [var('A', 1), var('B', 1),
+ var('B', 2), var('C', 2),
+ var('C', 3), var('D', 3),
+ var('D', 4), var('E', 4),
+ var('E', 5), var('F', 5),
+ var('F', 6), var('G', 6),
+ var('G', 7), var('H', 7)])
+ end
- context 'with unprotected environments' do
- it 'memoizes the result by environment' do
- expect(pipeline.project)
- .to receive(:protected_for?)
- .with(pipeline.jobs_git_ref)
- .once.and_return(false)
-
- expect_next_instance_of(described_class::Project) do |project_variables_builder|
- expect(project_variables_builder)
- .to receive(:secret_variables)
- .with(environment: nil, protected_ref: false)
- .once
- .and_call_original
-
- expect(project_variables_builder)
- .to receive(:secret_variables)
- .with(environment: 'scoped', protected_ref: false)
- .once
- .and_call_original
- end
-
- 2.times do
- expect(builder.secret_project_variables(ref: 'other', environment: nil))
- .to contain_exactly(unprotected_variable_item)
-
- expect(builder.secret_project_variables(ref: 'other', environment: 'scoped'))
- .to contain_exactly(unprotected_variable_item, scoped_variable_item)
- end
- end
- end
+ it 'overrides duplicate keys depending on resource hierarchy' do
+ expect(config_variables.to_hash).to match(
+ 'A' => '1', 'B' => '2',
+ 'C' => '3', 'D' => '4',
+ 'E' => '5', 'F' => '6',
+ 'G' => '7', 'H' => '7')
end
end
end
diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb
index ebb5c91ebad..9b68ee2d6a2 100644
--- a/spec/lib/gitlab/ci/yaml_processor_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb
@@ -842,7 +842,7 @@ module Gitlab
describe "Image and service handling" do
context "when extended docker configuration is used" do
it "returns image and service when defined" do
- config = YAML.dump({ image: { name: "ruby:2.7", entrypoint: ["/usr/local/bin/init", "run"] },
+ config = YAML.dump({ image: { name: "image:1.0", entrypoint: ["/usr/local/bin/init", "run"] },
services: ["mysql", { name: "docker:dind", alias: "docker",
entrypoint: ["/usr/local/bin/init", "run"],
command: ["/usr/local/bin/init", "run"] }],
@@ -860,7 +860,7 @@ module Gitlab
options: {
before_script: ["pwd"],
script: ["rspec"],
- image: { name: "ruby:2.7", entrypoint: ["/usr/local/bin/init", "run"] },
+ image: { name: "image:1.0", entrypoint: ["/usr/local/bin/init", "run"] },
services: [{ name: "mysql" },
{ name: "docker:dind", alias: "docker", entrypoint: ["/usr/local/bin/init", "run"],
command: ["/usr/local/bin/init", "run"] }]
@@ -874,10 +874,10 @@ module Gitlab
end
it "returns image and service when overridden for job" do
- config = YAML.dump({ image: "ruby:2.7",
+ config = YAML.dump({ image: "image:1.0",
services: ["mysql"],
before_script: ["pwd"],
- rspec: { image: { name: "ruby:3.0", entrypoint: ["/usr/local/bin/init", "run"] },
+ rspec: { image: { name: "image:1.0", entrypoint: ["/usr/local/bin/init", "run"] },
services: [{ name: "postgresql", alias: "db-pg",
entrypoint: ["/usr/local/bin/init", "run"],
command: ["/usr/local/bin/init", "run"] }, "docker:dind"],
@@ -894,7 +894,7 @@ module Gitlab
options: {
before_script: ["pwd"],
script: ["rspec"],
- image: { name: "ruby:3.0", entrypoint: ["/usr/local/bin/init", "run"] },
+ image: { name: "image:1.0", entrypoint: ["/usr/local/bin/init", "run"] },
services: [{ name: "postgresql", alias: "db-pg", entrypoint: ["/usr/local/bin/init", "run"],
command: ["/usr/local/bin/init", "run"] },
{ name: "docker:dind" }]
@@ -910,7 +910,7 @@ module Gitlab
context "when etended docker configuration is not used" do
it "returns image and service when defined" do
- config = YAML.dump({ image: "ruby:2.7",
+ config = YAML.dump({ image: "image:1.0",
services: ["mysql", "docker:dind"],
before_script: ["pwd"],
rspec: { script: "rspec" } })
@@ -926,7 +926,7 @@ module Gitlab
options: {
before_script: ["pwd"],
script: ["rspec"],
- image: { name: "ruby:2.7" },
+ image: { name: "image:1.0" },
services: [{ name: "mysql" }, { name: "docker:dind" }]
},
allow_failure: false,
@@ -938,10 +938,10 @@ module Gitlab
end
it "returns image and service when overridden for job" do
- config = YAML.dump({ image: "ruby:2.7",
+ config = YAML.dump({ image: "image:1.0",
services: ["mysql"],
before_script: ["pwd"],
- rspec: { image: "ruby:3.0", services: ["postgresql", "docker:dind"], script: "rspec" } })
+ rspec: { image: "image:1.0", services: ["postgresql", "docker:dind"], script: "rspec" } })
config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
@@ -954,7 +954,7 @@ module Gitlab
options: {
before_script: ["pwd"],
script: ["rspec"],
- image: { name: "ruby:3.0" },
+ image: { name: "image:1.0" },
services: [{ name: "postgresql" }, { name: "docker:dind" }]
},
allow_failure: false,
@@ -1557,7 +1557,7 @@ module Gitlab
describe "Artifacts" do
it "returns artifacts when defined" do
config = YAML.dump({
- image: "ruby:2.7",
+ image: "image:1.0",
services: ["mysql"],
before_script: ["pwd"],
rspec: {
@@ -1583,7 +1583,7 @@ module Gitlab
options: {
before_script: ["pwd"],
script: ["rspec"],
- image: { name: "ruby:2.7" },
+ image: { name: "image:1.0" },
services: [{ name: "mysql" }],
artifacts: {
name: "custom_name",
@@ -2327,7 +2327,7 @@ module Gitlab
context 'when hidden job have a script definition' do
let(:config) do
YAML.dump({
- '.hidden_job' => { image: 'ruby:2.7', script: 'test' },
+ '.hidden_job' => { image: 'image:1.0', script: 'test' },
'normal_job' => { script: 'test' }
})
end
@@ -2338,7 +2338,7 @@ module Gitlab
context "when hidden job doesn't have a script definition" do
let(:config) do
YAML.dump({
- '.hidden_job' => { image: 'ruby:2.7' },
+ '.hidden_job' => { image: 'image:1.0' },
'normal_job' => { script: 'test' }
})
end
diff --git a/spec/lib/gitlab/config/loader/yaml_spec.rb b/spec/lib/gitlab/config/loader/yaml_spec.rb
index be568a8e5f9..66ea931a42c 100644
--- a/spec/lib/gitlab/config/loader/yaml_spec.rb
+++ b/spec/lib/gitlab/config/loader/yaml_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Config::Loader::Yaml do
let(:yml) do
<<~YAML
- image: 'ruby:2.7'
+ image: 'image:1.0'
texts:
nested_key: 'value1'
more_text:
@@ -34,7 +34,7 @@ RSpec.describe Gitlab::Config::Loader::Yaml do
end
context 'when yaml syntax is correct' do
- let(:yml) { 'image: ruby:2.7' }
+ let(:yml) { 'image: image:1.0' }
describe '#valid?' do
it 'returns true' do
@@ -44,7 +44,7 @@ RSpec.describe Gitlab::Config::Loader::Yaml do
describe '#load!' do
it 'returns a valid hash' do
- expect(loader.load!).to eq(image: 'ruby:2.7')
+ expect(loader.load!).to eq(image: 'image:1.0')
end
end
end
@@ -164,7 +164,7 @@ RSpec.describe Gitlab::Config::Loader::Yaml do
describe '#load_raw!' do
it 'loads keys as strings' do
expect(loader.load_raw!).to eq(
- 'image' => 'ruby:2.7',
+ 'image' => 'image:1.0',
'texts' => {
'nested_key' => 'value1',
'more_text' => {
@@ -178,7 +178,7 @@ RSpec.describe Gitlab::Config::Loader::Yaml do
describe '#load!' do
it 'symbolizes keys' do
expect(loader.load!).to eq(
- image: 'ruby:2.7',
+ image: 'image:1.0',
texts: {
nested_key: 'value1',
more_text: {
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 08d29f7842c..44e2cb21677 100644
--- a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
+++ b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
@@ -107,24 +107,8 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
stub_env('CUSTOMER_PORTAL_URL', customer_portal_url)
end
- context 'when in production' do
- before do
- allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new('production'))
- end
-
- it 'does not add CUSTOMER_PORTAL_URL to CSP' do
- expect(directives['frame_src']).to eq(::Gitlab::ContentSecurityPolicy::Directives.frame_src + " http://localhost/admin/ http://localhost/assets/ http://localhost/-/speedscope/index.html http://localhost/-/sandbox/mermaid")
- end
- end
-
- context 'when in development' do
- before do
- allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new('development'))
- end
-
- it 'adds CUSTOMER_PORTAL_URL to CSP' do
- expect(directives['frame_src']).to eq(::Gitlab::ContentSecurityPolicy::Directives.frame_src + " http://localhost/rails/letter_opener/ https://customers.example.com http://localhost/admin/ http://localhost/assets/ http://localhost/-/speedscope/index.html http://localhost/-/sandbox/mermaid")
- end
+ it 'adds CUSTOMER_PORTAL_URL to CSP' do
+ expect(directives['frame_src']).to eq(::Gitlab::ContentSecurityPolicy::Directives.frame_src + " http://localhost/admin/ http://localhost/assets/ http://localhost/-/speedscope/index.html http://localhost/-/sandbox/mermaid #{customer_portal_url}")
end
end
diff --git a/spec/lib/gitlab/data_builder/deployment_spec.rb b/spec/lib/gitlab/data_builder/deployment_spec.rb
index ab8c8a51694..e8fe80f75cb 100644
--- a/spec/lib/gitlab/data_builder/deployment_spec.rb
+++ b/spec/lib/gitlab/data_builder/deployment_spec.rb
@@ -46,5 +46,42 @@ RSpec.describe Gitlab::DataBuilder::Deployment do
expect(data[:deployable_url]).to be_nil
end
+
+ context 'when commit does not exist in the repository' do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:deployment) { create(:deployment, project: project) }
+
+ subject(:data) { described_class.build(deployment, Time.current) }
+
+ before(:all) do
+ project.repository.remove
+ end
+
+ it 'returns nil for commit_url' do
+ expect(data[:commit_url]).to be_nil
+ end
+
+ it 'returns nil for commit_title' do
+ expect(data[:commit_title]).to be_nil
+ end
+ end
+
+ context 'when deployed_by is nil' do
+ let_it_be(:deployment) { create(:deployment, user: nil, deployable: nil) }
+
+ subject(:data) { described_class.build(deployment, Time.current) }
+
+ before(:all) do
+ deployment.user = nil
+ end
+
+ it 'returns nil for user' do
+ expect(data[:user]).to be_nil
+ end
+
+ it 'returns nil for user_url' do
+ expect(data[:user_url]).to be_nil
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/data_builder/note_spec.rb b/spec/lib/gitlab/data_builder/note_spec.rb
index 90ca5430526..3fa535dd800 100644
--- a/spec/lib/gitlab/data_builder/note_spec.rb
+++ b/spec/lib/gitlab/data_builder/note_spec.rb
@@ -8,18 +8,22 @@ RSpec.describe Gitlab::DataBuilder::Note do
let(:data) { described_class.build(note, user) }
let(:fixed_time) { Time.at(1425600000) } # Avoid time precision errors
- before do
- expect(data).to have_key(:object_attributes)
- expect(data[:object_attributes]).to have_key(:url)
- expect(data[:object_attributes][:url])
- .to eq(Gitlab::UrlBuilder.build(note))
- expect(data[:object_kind]).to eq('note')
- expect(data[:user]).to eq(user.hook_attrs)
+ shared_examples 'includes general data' do
+ specify do
+ expect(data).to have_key(:object_attributes)
+ expect(data[:object_attributes]).to have_key(:url)
+ expect(data[:object_attributes][:url])
+ .to eq(Gitlab::UrlBuilder.build(note))
+ expect(data[:object_kind]).to eq('note')
+ expect(data[:user]).to eq(user.hook_attrs)
+ end
end
describe 'When asking for a note on commit' do
let(:note) { create(:note_on_commit, project: project) }
+ it_behaves_like 'includes general data'
+
it 'returns the note and commit-specific data' do
expect(data).to have_key(:commit)
end
@@ -31,6 +35,8 @@ RSpec.describe Gitlab::DataBuilder::Note do
describe 'When asking for a note on commit diff' do
let(:note) { create(:diff_note_on_commit, project: project) }
+ it_behaves_like 'includes general data'
+
it 'returns the note and commit-specific data' do
expect(data).to have_key(:commit)
end
@@ -51,22 +57,21 @@ RSpec.describe Gitlab::DataBuilder::Note do
create(:note_on_issue, noteable: issue, project: project)
end
+ it_behaves_like 'includes general data'
+
it 'returns the note and issue-specific data' do
- without_timestamps = lambda { |label| label.except('created_at', 'updated_at') }
- hook_attrs = issue.reload.hook_attrs
+ expect_next_instance_of(Gitlab::HookData::IssueBuilder) do |issue_data_builder|
+ expect(issue_data_builder).to receive(:build).and_return('Issue data')
+ end
- expect(data).to have_key(:issue)
- expect(data[:issue].except('updated_at', 'labels'))
- .to eq(hook_attrs.except('updated_at', 'labels'))
- expect(data[:issue]['updated_at'])
- .to be >= hook_attrs['updated_at']
- expect(data[:issue]['labels'].map(&without_timestamps))
- .to eq(hook_attrs['labels'].map(&without_timestamps))
+ expect(data[:issue]).to eq('Issue data')
end
context 'with confidential issue' do
let(:issue) { create(:issue, project: project, confidential: true) }
+ it_behaves_like 'includes general data'
+
it 'sets event_type to confidential_note' do
expect(data[:event_type]).to eq('confidential_note')
end
@@ -77,10 +82,12 @@ RSpec.describe Gitlab::DataBuilder::Note do
end
describe 'When asking for a note on merge request' do
+ let(:label) { create(:label, project: project) }
let(:merge_request) do
- create(:merge_request, created_at: fixed_time,
+ create(:labeled_merge_request, created_at: fixed_time,
updated_at: fixed_time,
- source_project: project)
+ source_project: project,
+ labels: [label])
end
let(:note) do
@@ -88,12 +95,14 @@ RSpec.describe Gitlab::DataBuilder::Note do
project: project)
end
- it 'returns the note and merge request data' do
- expect(data).to have_key(:merge_request)
- expect(data[:merge_request].except('updated_at'))
- .to eq(merge_request.reload.hook_attrs.except('updated_at'))
- expect(data[:merge_request]['updated_at'])
- .to be >= merge_request.hook_attrs['updated_at']
+ it_behaves_like 'includes general data'
+
+ it 'returns the merge request data' do
+ expect_next_instance_of(Gitlab::HookData::MergeRequestBuilder) do |mr_data_builder|
+ expect(mr_data_builder).to receive(:build).and_return('MR data')
+ end
+
+ expect(data[:merge_request]).to eq('MR data')
end
include_examples 'project hook data'
@@ -101,9 +110,11 @@ RSpec.describe Gitlab::DataBuilder::Note do
end
describe 'When asking for a note on merge request diff' do
+ let(:label) { create(:label, project: project) }
let(:merge_request) do
- create(:merge_request, created_at: fixed_time, updated_at: fixed_time,
- source_project: project)
+ create(:labeled_merge_request, created_at: fixed_time, updated_at: fixed_time,
+ source_project: project,
+ labels: [label])
end
let(:note) do
@@ -111,12 +122,14 @@ RSpec.describe Gitlab::DataBuilder::Note do
project: project)
end
- it 'returns the note and merge request diff data' do
- expect(data).to have_key(:merge_request)
- expect(data[:merge_request].except('updated_at'))
- .to eq(merge_request.reload.hook_attrs.except('updated_at'))
- expect(data[:merge_request]['updated_at'])
- .to be >= merge_request.hook_attrs['updated_at']
+ it_behaves_like 'includes general data'
+
+ it 'returns the merge request data' do
+ expect_next_instance_of(Gitlab::HookData::MergeRequestBuilder) do |mr_data_builder|
+ expect(mr_data_builder).to receive(:build).and_return('MR data')
+ end
+
+ expect(data[:merge_request]).to eq('MR data')
end
include_examples 'project hook data'
@@ -134,6 +147,8 @@ RSpec.describe Gitlab::DataBuilder::Note do
project: project)
end
+ it_behaves_like 'includes general data'
+
it 'returns the note and project snippet data' do
expect(data).to have_key(:snippet)
expect(data[:snippet].except('updated_at'))
diff --git a/spec/lib/gitlab/database/background_migration/batch_metrics_spec.rb b/spec/lib/gitlab/database/background_migration/batch_metrics_spec.rb
index 66983733411..6db3081ca7e 100644
--- a/spec/lib/gitlab/database/background_migration/batch_metrics_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batch_metrics_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchMetrics do
expect(batch_metrics.timings).to be_empty
expect(Gitlab::Metrics::System).to receive(:monotonic_time)
- .exactly(6).times
.and_return(0.0, 111.0, 200.0, 290.0, 300.0, 410.0)
batch_metrics.time_operation(:my_label) do
@@ -28,4 +27,33 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchMetrics do
expect(batch_metrics.timings).to eq(my_label: [111.0, 110.0], my_other_label: [90.0])
end
end
+
+ describe '#instrument_operation' do
+ it 'tracks duration and affected rows' do
+ expect(batch_metrics.timings).to be_empty
+ expect(batch_metrics.affected_rows).to be_empty
+
+ expect(Gitlab::Metrics::System).to receive(:monotonic_time)
+ .and_return(0.0, 111.0, 200.0, 290.0, 300.0, 410.0, 420.0, 450.0)
+
+ batch_metrics.instrument_operation(:my_label) do
+ 3
+ end
+
+ batch_metrics.instrument_operation(:my_other_label) do
+ 42
+ end
+
+ batch_metrics.instrument_operation(:my_label) do
+ 2
+ end
+
+ batch_metrics.instrument_operation(:my_other_label) do
+ :not_an_integer
+ end
+
+ expect(batch_metrics.timings).to eq(my_label: [111.0, 110.0], my_other_label: [90.0, 30.0])
+ expect(batch_metrics.affected_rows).to eq(my_label: [3, 2], my_other_label: [42])
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/background_migration/batched_job_spec.rb b/spec/lib/gitlab/database/background_migration/batched_job_spec.rb
index 8c663ff9f8a..c39f6a78e93 100644
--- a/spec/lib/gitlab/database/background_migration/batched_job_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_job_spec.rb
@@ -21,7 +21,19 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model d
context 'when a job is running' do
it 'logs the transition' do
- expect(Gitlab::AppLogger).to receive(:info).with( { batched_job_id: job.id, message: 'BatchedJob transition', new_state: :running, previous_state: :failed } )
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ {
+ batched_job_id: job.id,
+ batched_migration_id: job.batched_background_migration_id,
+ exception_class: nil,
+ exception_message: nil,
+ job_arguments: job.batched_migration.job_arguments,
+ job_class_name: job.batched_migration.job_class_name,
+ message: 'BatchedJob transition',
+ new_state: :running,
+ previous_state: :failed
+ }
+ )
expect { job.run! }.to change(job, :started_at)
end
@@ -31,7 +43,19 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model d
let(:job) { create(:batched_background_migration_job, :running) }
it 'logs the transition' do
- expect(Gitlab::AppLogger).to receive(:info).with( { batched_job_id: job.id, message: 'BatchedJob transition', new_state: :succeeded, previous_state: :running } )
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ {
+ batched_job_id: job.id,
+ batched_migration_id: job.batched_background_migration_id,
+ exception_class: nil,
+ exception_message: nil,
+ job_arguments: job.batched_migration.job_arguments,
+ job_class_name: job.batched_migration.job_class_name,
+ message: 'BatchedJob transition',
+ new_state: :succeeded,
+ previous_state: :running
+ }
+ )
job.succeed!
end
@@ -89,7 +113,15 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model d
end
it 'logs the error' do
- expect(Gitlab::AppLogger).to receive(:error).with( { message: error_message, batched_job_id: job.id } )
+ expect(Gitlab::AppLogger).to receive(:error).with(
+ {
+ batched_job_id: job.id,
+ batched_migration_id: job.batched_background_migration_id,
+ job_arguments: job.batched_migration.job_arguments,
+ job_class_name: job.batched_migration.job_class_name,
+ message: error_message
+ }
+ )
job.failure!(error: exception)
end
@@ -100,13 +132,32 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model d
let(:job) { create(:batched_background_migration_job, :running) }
it 'logs the transition' do
- expect(Gitlab::AppLogger).to receive(:info).with( { batched_job_id: job.id, message: 'BatchedJob transition', new_state: :failed, previous_state: :running } )
+ expect(Gitlab::AppLogger).to receive(:info).with(
+ {
+ batched_job_id: job.id,
+ batched_migration_id: job.batched_background_migration_id,
+ exception_class: RuntimeError,
+ exception_message: 'error',
+ job_arguments: job.batched_migration.job_arguments,
+ job_class_name: job.batched_migration.job_class_name,
+ message: 'BatchedJob transition',
+ new_state: :failed,
+ previous_state: :running
+ }
+ )
- job.failure!
+ job.failure!(error: RuntimeError.new('error'))
end
it 'tracks the exception' do
- expect(Gitlab::ErrorTracking).to receive(:track_exception).with(RuntimeError, { batched_job_id: job.id } )
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(
+ RuntimeError,
+ {
+ batched_job_id: job.id,
+ job_arguments: job.batched_migration.job_arguments,
+ job_class_name: job.batched_migration.job_class_name
+ }
+ )
job.failure!(error: RuntimeError.new)
end
@@ -130,13 +181,11 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model d
describe 'scopes' do
let_it_be(:fixed_time) { Time.new(2021, 04, 27, 10, 00, 00, 00) }
- let_it_be(:pending_job) { create(:batched_background_migration_job, :pending, updated_at: fixed_time) }
- let_it_be(:running_job) { create(:batched_background_migration_job, :running, updated_at: fixed_time) }
- let_it_be(:stuck_job) { create(:batched_background_migration_job, :pending, updated_at: fixed_time - described_class::STUCK_JOBS_TIMEOUT) }
- let_it_be(:failed_job) { create(:batched_background_migration_job, :failed, attempts: 1) }
-
- let!(:max_attempts_failed_job) { create(:batched_background_migration_job, :failed, attempts: described_class::MAX_ATTEMPTS) }
- let!(:succeeded_job) { create(:batched_background_migration_job, :succeeded) }
+ let_it_be(:pending_job) { create(:batched_background_migration_job, :pending, created_at: fixed_time - 2.days, updated_at: fixed_time) }
+ let_it_be(:running_job) { create(:batched_background_migration_job, :running, created_at: fixed_time - 2.days, updated_at: fixed_time) }
+ let_it_be(:stuck_job) { create(:batched_background_migration_job, :pending, created_at: fixed_time, updated_at: fixed_time - described_class::STUCK_JOBS_TIMEOUT) }
+ let_it_be(:failed_job) { create(:batched_background_migration_job, :failed, created_at: fixed_time, attempts: 1) }
+ let_it_be(:max_attempts_failed_job) { create(:batched_background_migration_job, :failed, created_at: fixed_time, attempts: described_class::MAX_ATTEMPTS) }
before do
travel_to fixed_time
@@ -165,6 +214,12 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model d
expect(described_class.retriable).to contain_exactly(failed_job, stuck_job)
end
end
+
+ describe '.created_since' do
+ it 'returns jobs since a given time' do
+ expect(described_class.created_since(fixed_time)).to contain_exactly(stuck_job, failed_job, max_attempts_failed_job)
+ end
+ end
end
describe 'delegated batched_migration attributes' do
@@ -194,6 +249,12 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model d
expect(batched_job.migration_job_arguments).to eq(batched_migration.job_arguments)
end
end
+
+ describe '#migration_job_class_name' do
+ it 'returns the migration job_class_name' do
+ expect(batched_job.migration_job_class_name).to eq(batched_migration.job_class_name)
+ end
+ end
end
describe '#can_split?' do
diff --git a/spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb b/spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb
index 124d204cb62..f147e8204e6 100644
--- a/spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb
@@ -3,8 +3,16 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
+ let(:connection) { Gitlab::Database.database_base_models[:main].connection }
let(:migration_wrapper) { double('test wrapper') }
- let(:runner) { described_class.new(migration_wrapper) }
+
+ let(:runner) { described_class.new(connection: connection, migration_wrapper: migration_wrapper) }
+
+ around do |example|
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ example.run
+ end
+ end
describe '#run_migration_job' do
shared_examples_for 'it has completed the migration' do
@@ -86,6 +94,19 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
end
end
+ context 'when the migration should stop' do
+ let(:migration) { create(:batched_background_migration, :active) }
+
+ let!(:job) { create(:batched_background_migration_job, :failed, batched_migration: migration) }
+
+ it 'changes the status to failure' do
+ expect(migration).to receive(:should_stop?).and_return(true)
+ expect(migration_wrapper).to receive(:perform).and_return(job)
+
+ expect { runner.run_migration_job(migration) }.to change { migration.status_name }.from(:active).to(:failed)
+ end
+ end
+
context 'when the migration has previous jobs' do
let!(:event1) { create(:event) }
let!(:event2) { create(:event) }
@@ -282,7 +303,9 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
end
describe '#finalize' do
- let(:migration_wrapper) { Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper.new }
+ let(:migration_wrapper) do
+ Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper.new(connection: connection)
+ end
let(:migration_helpers) { ActiveRecord::Migration.new }
let(:table_name) { :_test_batched_migrations_test_table }
@@ -293,8 +316,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
let!(:batched_migration) do
create(
- :batched_background_migration,
- status: migration_status,
+ :batched_background_migration, migration_status,
max_value: 8,
batch_size: 2,
sub_batch_size: 1,
@@ -339,7 +361,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
.with('CopyColumnUsingBackgroundMigrationJob', table_name, column_name, job_arguments)
.and_return(batched_migration)
- expect(batched_migration).to receive(:finalizing!).and_call_original
+ expect(batched_migration).to receive(:finalize!).and_call_original
expect do
runner.finalize(
@@ -348,7 +370,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
column_name,
job_arguments
)
- end.to change { batched_migration.reload.status }.from('active').to('finished')
+ end.to change { batched_migration.reload.status_name }.from(:active).to(:finished)
expect(batched_migration.batched_jobs).to all(be_succeeded)
@@ -390,7 +412,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
expect(Gitlab::AppLogger).to receive(:warn)
.with("Batched background migration for the given configuration is already finished: #{configuration}")
- expect(batched_migration).not_to receive(:finalizing!)
+ expect(batched_migration).not_to receive(:finalize!)
runner.finalize(
batched_migration.job_class_name,
@@ -417,7 +439,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
expect(Gitlab::AppLogger).to receive(:warn)
.with("Could not find batched background migration for the given configuration: #{configuration}")
- expect(batched_migration).not_to receive(:finalizing!)
+ expect(batched_migration).not_to receive(:finalize!)
runner.finalize(
batched_migration.job_class_name,
@@ -431,8 +453,6 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
describe '.finalize' do
context 'when the connection is passed' do
- let(:connection) { double('connection') }
-
let(:table_name) { :_test_batched_migrations_test_table }
let(:column_name) { :some_id }
let(:job_arguments) { [:some, :other, :arguments] }
diff --git a/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb b/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
index 803123e8e34..7a433be0e2f 100644
--- a/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
@@ -27,28 +27,46 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
it { is_expected.to validate_uniqueness_of(:job_arguments).scoped_to(:job_class_name, :table_name, :column_name) }
context 'when there are failed jobs' do
- let(:batched_migration) { create(:batched_background_migration, status: :active, total_tuple_count: 100) }
+ let(:batched_migration) { create(:batched_background_migration, :active, total_tuple_count: 100) }
let!(:batched_job) { create(:batched_background_migration_job, :failed, batched_migration: batched_migration) }
it 'raises an exception' do
- expect { batched_migration.finished! }.to raise_error(ActiveRecord::RecordInvalid)
+ expect { batched_migration.finish! }.to raise_error(StateMachines::InvalidTransition)
- expect(batched_migration.reload.status).to eql 'active'
+ expect(batched_migration.reload.status_name).to be :active
end
end
context 'when the jobs are completed' do
- let(:batched_migration) { create(:batched_background_migration, status: :active, total_tuple_count: 100) }
+ let(:batched_migration) { create(:batched_background_migration, :active, total_tuple_count: 100) }
let!(:batched_job) { create(:batched_background_migration_job, :succeeded, batched_migration: batched_migration) }
it 'finishes the migration' do
- batched_migration.finished!
+ batched_migration.finish!
- expect(batched_migration.status).to eql 'finished'
+ expect(batched_migration.status_name).to be :finished
end
end
end
+ describe 'state machine' do
+ context 'when a migration is executed' do
+ let!(:batched_migration) { create(:batched_background_migration) }
+
+ it 'updates the started_at' do
+ expect { batched_migration.execute! }.to change(batched_migration, :started_at).from(nil).to(Time)
+ end
+ end
+ end
+
+ describe '.valid_status' do
+ valid_status = [:paused, :active, :finished, :failed, :finalizing]
+
+ it 'returns valid status' do
+ expect(described_class.valid_status).to eq(valid_status)
+ end
+ end
+
describe '.queue_order' do
let!(:migration1) { create(:batched_background_migration) }
let!(:migration2) { create(:batched_background_migration) }
@@ -61,12 +79,23 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
describe '.active_migration' do
let!(:migration1) { create(:batched_background_migration, :finished) }
- let!(:migration2) { create(:batched_background_migration, :active) }
- let!(:migration3) { create(:batched_background_migration, :active) }
- it 'returns the first active migration according to queue order' do
- expect(described_class.active_migration).to eq(migration2)
- create(:batched_background_migration_job, :succeeded, batched_migration: migration1, batch_size: 1000)
+ context 'without migrations on hold' do
+ let!(:migration2) { create(:batched_background_migration, :active) }
+ let!(:migration3) { create(:batched_background_migration, :active) }
+
+ it 'returns the first active migration according to queue order' do
+ expect(described_class.active_migration).to eq(migration2)
+ end
+ end
+
+ context 'with migrations are on hold' do
+ let!(:migration2) { create(:batched_background_migration, :active, on_hold_until: 10.minutes.from_now) }
+ let!(:migration3) { create(:batched_background_migration, :active, on_hold_until: 2.minutes.ago) }
+
+ it 'returns the first active migration that is not on hold according to queue order' do
+ expect(described_class.active_migration).to eq(migration3)
+ end
end
end
@@ -287,7 +316,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
it 'moves the status of the migration to active' do
retry_failed_jobs
- expect(batched_migration.status).to eql 'active'
+ expect(batched_migration.status_name).to be :active
end
it 'changes the number of attempts to 0' do
@@ -301,8 +330,59 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
it 'moves the status of the migration to active' do
retry_failed_jobs
- expect(batched_migration.status).to eql 'active'
+ expect(batched_migration.status_name).to be :active
+ end
+ end
+ end
+
+ describe '#should_stop?' do
+ subject(:should_stop?) { batched_migration.should_stop? }
+
+ let(:batched_migration) { create(:batched_background_migration, started_at: started_at) }
+
+ before do
+ stub_const('Gitlab::Database::BackgroundMigration::BatchedMigration::MINIMUM_JOBS', 1)
+ end
+
+ context 'when the started_at is nil' do
+ let(:started_at) { nil }
+
+ it { expect(should_stop?).to be_falsey }
+ end
+
+ context 'when the number of jobs is lesser than the MINIMUM_JOBS' do
+ let(:started_at) { Time.zone.now - 6.days }
+
+ before do
+ stub_const('Gitlab::Database::BackgroundMigration::BatchedMigration::MINIMUM_JOBS', 10)
+ stub_const('Gitlab::Database::BackgroundMigration::BatchedMigration::MAXIMUM_FAILED_RATIO', 0.70)
+ create_list(:batched_background_migration_job, 1, :succeeded, batched_migration: batched_migration)
+ create_list(:batched_background_migration_job, 3, :failed, batched_migration: batched_migration)
+ end
+
+ it { expect(should_stop?).to be_falsey }
+ end
+
+ context 'when the calculated value is greater than the threshold' do
+ let(:started_at) { Time.zone.now - 6.days }
+
+ before do
+ stub_const('Gitlab::Database::BackgroundMigration::BatchedMigration::MAXIMUM_FAILED_RATIO', 0.70)
+ create_list(:batched_background_migration_job, 1, :succeeded, batched_migration: batched_migration)
+ create_list(:batched_background_migration_job, 3, :failed, batched_migration: batched_migration)
+ end
+
+ it { expect(should_stop?).to be_truthy }
+ end
+
+ context 'when the calculated value is lesser than the threshold' do
+ let(:started_at) { Time.zone.now - 6.days }
+
+ before do
+ create_list(:batched_background_migration_job, 2, :succeeded, batched_migration: batched_migration)
end
+
+ it { expect(should_stop?).to be_falsey }
end
end
@@ -449,6 +529,20 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
end
end
+ describe '#hold!', :freeze_time do
+ subject { create(:batched_background_migration) }
+
+ let(:time) { 5.minutes.from_now }
+
+ it 'updates on_hold_until property' do
+ expect { subject.hold!(until_time: time) }.to change { subject.on_hold_until }.from(nil).to(time)
+ end
+
+ it 'defaults to 10 minutes' do
+ expect { subject.hold! }.to change { subject.on_hold_until }.from(nil).to(10.minutes.from_now)
+ end
+ end
+
describe '.for_configuration' do
let!(:migration) do
create(
diff --git a/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb b/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
index d6c984c7adb..6a4ac317cad 100644
--- a/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
@@ -3,8 +3,10 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '#perform' do
- subject { described_class.new.perform(job_record) }
+ subject { described_class.new(connection: connection, metrics: metrics_tracker).perform(job_record) }
+ let(:connection) { Gitlab::Database.database_base_models[:main].connection }
+ let(:metrics_tracker) { instance_double('::Gitlab::Database::BackgroundMigration::PrometheusMetrics', track: nil) }
let(:job_class) { Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob }
let_it_be(:pause_ms) { 250 }
@@ -19,6 +21,12 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
let(:job_instance) { double('job instance', batch_metrics: {}) }
+ around do |example|
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ example.run
+ end
+ end
+
before do
allow(job_class).to receive(:new).and_return(job_instance)
end
@@ -78,86 +86,6 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
end
end
- context 'reporting prometheus metrics' do
- let(:labels) { job_record.batched_migration.prometheus_labels }
-
- before do
- allow(job_instance).to receive(:perform)
- end
-
- it 'reports batch_size' do
- expect(described_class.metrics[:gauge_batch_size]).to receive(:set).with(labels, job_record.batch_size)
-
- subject
- end
-
- it 'reports sub_batch_size' do
- expect(described_class.metrics[:gauge_sub_batch_size]).to receive(:set).with(labels, job_record.sub_batch_size)
-
- subject
- end
-
- it 'reports interval' do
- expect(described_class.metrics[:gauge_interval]).to receive(:set).with(labels, job_record.batched_migration.interval)
-
- subject
- end
-
- it 'reports updated tuples (currently based on batch_size)' do
- expect(described_class.metrics[:counter_updated_tuples]).to receive(:increment).with(labels, job_record.batch_size)
-
- subject
- end
-
- it 'reports migrated tuples' do
- count = double
- expect(job_record.batched_migration).to receive(:migrated_tuple_count).and_return(count)
- expect(described_class.metrics[:gauge_migrated_tuples]).to receive(:set).with(labels, count)
-
- subject
- end
-
- it 'reports summary of query timings' do
- metrics = { 'timings' => { 'update_all' => [1, 2, 3, 4, 5] } }
-
- expect(job_instance).to receive(:batch_metrics).and_return(metrics)
-
- metrics['timings'].each do |key, timings|
- summary_labels = labels.merge(operation: key)
- timings.each do |timing|
- expect(described_class.metrics[:histogram_timings]).to receive(:observe).with(summary_labels, timing)
- end
- end
-
- subject
- end
-
- it 'reports job duration' do
- freeze_time do
- expect(Time).to receive(:current).and_return(Time.zone.now - 5.seconds).ordered
- allow(Time).to receive(:current).and_call_original
-
- expect(described_class.metrics[:gauge_job_duration]).to receive(:set).with(labels, 5.seconds)
-
- subject
- end
- end
-
- it 'reports the total tuple count for the migration' do
- expect(described_class.metrics[:gauge_total_tuple_count]).to receive(:set).with(labels, job_record.batched_migration.total_tuple_count)
-
- subject
- end
-
- it 'reports last updated at timestamp' do
- freeze_time do
- expect(described_class.metrics[:gauge_last_update_time]).to receive(:set).with(labels, Time.current.to_i)
-
- subject
- end
- end
- end
-
context 'when the migration job does not raise an error' do
it 'marks the tracking record as succeeded' do
expect(job_instance).to receive(:perform).with(1, 10, 'events', 'id', 1, pause_ms, 'id', 'other_id')
@@ -171,6 +99,13 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
expect(reloaded_job_record.finished_at).to eq(Time.current)
end
end
+
+ it 'tracks metrics of the execution' do
+ expect(job_instance).to receive(:perform)
+ expect(metrics_tracker).to receive(:track).with(job_record)
+
+ subject
+ end
end
context 'when the migration job raises an error' do
@@ -189,6 +124,13 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
expect(reloaded_job_record.finished_at).to eq(Time.current)
end
end
+
+ it 'tracks metrics of the execution' do
+ expect(job_instance).to receive(:perform).and_raise(error_class)
+ expect(metrics_tracker).to receive(:track).with(job_record)
+
+ expect { subject }.to raise_error(error_class)
+ end
end
it_behaves_like 'an error is raised', RuntimeError.new('Something broke!')
@@ -203,7 +145,6 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
stub_const('Gitlab::BackgroundMigration::Foo', migration_class)
end
- let(:connection) { double(:connection) }
let(:active_migration) { create(:batched_background_migration, :active, job_class_name: 'Foo') }
let!(:job_record) { create(:batched_background_migration_job, batched_migration: active_migration) }
@@ -212,12 +153,11 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
expect(job_instance).to receive(:perform)
- described_class.new(connection: connection).perform(job_record)
+ subject
end
end
context 'when the batched background migration inherits from BaseJob' do
- let(:connection) { double(:connection) }
let(:active_migration) { create(:batched_background_migration, :active, job_class_name: 'Foo') }
let!(:job_record) { create(:batched_background_migration_job, batched_migration: active_migration) }
@@ -232,7 +172,7 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
expect(job_instance).to receive(:perform)
- described_class.new(connection: connection).perform(job_record)
+ subject
end
end
end
diff --git a/spec/lib/gitlab/database/background_migration/prometheus_metrics_spec.rb b/spec/lib/gitlab/database/background_migration/prometheus_metrics_spec.rb
new file mode 100644
index 00000000000..1f256de35ec
--- /dev/null
+++ b/spec/lib/gitlab/database/background_migration/prometheus_metrics_spec.rb
@@ -0,0 +1,118 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::BackgroundMigration::PrometheusMetrics, :prometheus do
+ describe '#track' do
+ let(:job_record) do
+ build(:batched_background_migration_job, :succeeded,
+ started_at: Time.current - 2.minutes,
+ finished_at: Time.current - 1.minute,
+ updated_at: Time.current,
+ metrics: { 'timings' => { 'update_all' => [0.05, 0.2, 0.4, 0.9, 4] } })
+ end
+
+ let(:labels) { job_record.batched_migration.prometheus_labels }
+
+ subject(:track_job_record_metrics) { described_class.new.track(job_record) }
+
+ it 'reports batch_size' do
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:gauge_batch_size)).to eq(job_record.batch_size)
+ end
+
+ it 'reports sub_batch_size' do
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:gauge_sub_batch_size)).to eq(job_record.sub_batch_size)
+ end
+
+ it 'reports interval' do
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:gauge_interval)).to eq(job_record.batched_migration.interval)
+ end
+
+ it 'reports job duration' do
+ freeze_time do
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:gauge_job_duration)).to eq(1.minute)
+ end
+ end
+
+ it 'increments updated tuples (currently based on batch_size)' do
+ expect(described_class.metrics[:counter_updated_tuples]).to receive(:increment)
+ .with(labels, job_record.batch_size)
+ .twice
+ .and_call_original
+
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:counter_updated_tuples)).to eq(job_record.batch_size)
+
+ described_class.new.track(job_record)
+
+ expect(metric_for_job_by_name(:counter_updated_tuples)).to eq(job_record.batch_size * 2)
+ end
+
+ it 'reports migrated tuples' do
+ expect(job_record.batched_migration).to receive(:migrated_tuple_count).and_return(20)
+
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:gauge_migrated_tuples)).to eq(20)
+ end
+
+ it 'reports the total tuple count for the migration' do
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:gauge_total_tuple_count)).to eq(job_record.batched_migration.total_tuple_count)
+ end
+
+ it 'reports last updated at timestamp' do
+ freeze_time do
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:gauge_last_update_time)).to eq(Time.current.to_i)
+ end
+ end
+
+ it 'reports summary of query timings' do
+ summary_labels = labels.merge(operation: 'update_all')
+
+ job_record.metrics['timings']['update_all'].each do |timing|
+ expect(described_class.metrics[:histogram_timings]).to receive(:observe)
+ .with(summary_labels, timing)
+ .and_call_original
+ end
+
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:histogram_timings, job_labels: summary_labels))
+ .to eq({ 0.1 => 1.0, 0.25 => 2.0, 0.5 => 3.0, 1 => 4.0, 5 => 5.0 })
+ end
+
+ context 'when the tracking record does not having timing metrics' do
+ before do
+ job_record.metrics = {}
+ end
+
+ it 'does not attempt to report query timings' do
+ summary_labels = labels.merge(operation: 'update_all')
+
+ expect(described_class.metrics[:histogram_timings]).not_to receive(:observe)
+
+ track_job_record_metrics
+
+ expect(metric_for_job_by_name(:histogram_timings, job_labels: summary_labels))
+ .to eq({ 0.1 => 0.0, 0.25 => 0.0, 0.5 => 0.0, 1 => 0.0, 5 => 0.0 })
+ end
+ end
+
+ def metric_for_job_by_name(name, job_labels: labels)
+ described_class.metrics[name].values[job_labels].get
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/consistency_checker_spec.rb b/spec/lib/gitlab/database/consistency_checker_spec.rb
new file mode 100644
index 00000000000..2ff79d20786
--- /dev/null
+++ b/spec/lib/gitlab/database/consistency_checker_spec.rb
@@ -0,0 +1,189 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::ConsistencyChecker do
+ let(:batch_size) { 10 }
+ let(:max_batches) { 4 }
+ let(:max_runtime) { described_class::MAX_RUNTIME }
+ let(:metrics_counter) { Gitlab::Metrics.registry.get(:consistency_checks) }
+
+ subject(:consistency_checker) do
+ described_class.new(
+ source_model: Namespace,
+ target_model: Ci::NamespaceMirror,
+ source_columns: %w[id traversal_ids],
+ target_columns: %w[namespace_id traversal_ids]
+ )
+ end
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", batch_size)
+ stub_const("#{described_class.name}::MAX_BATCHES", max_batches)
+ redis_shared_state_cleanup! # For Prometheus Counters
+ end
+
+ after do
+ Gitlab::Metrics.reset_registry!
+ end
+
+ describe '#over_time_limit?' do
+ before do
+ allow(consistency_checker).to receive(:start_time).and_return(0)
+ end
+
+ it 'returns true only if the running time has exceeded MAX_RUNTIME' do
+ allow(consistency_checker).to receive(:monotonic_time).and_return(0, max_runtime - 1, max_runtime + 1)
+ expect(consistency_checker.monotonic_time).to eq(0)
+ expect(consistency_checker.send(:over_time_limit?)).to eq(false)
+ expect(consistency_checker.send(:over_time_limit?)).to eq(true)
+ end
+ end
+
+ describe '#execute' do
+ context 'when empty tables' do
+ it 'returns an empty response' do
+ expected_result = { matches: 0, mismatches: 0, batches: 0, mismatches_details: [], next_start_id: nil }
+ expect(consistency_checker.execute(start_id: 1)).to eq(expected_result)
+ end
+ end
+
+ context 'when the tables contain matching items' do
+ before do
+ create_list(:namespace, 50) # This will also create Ci::NameSpaceMirror objects
+ end
+
+ it 'does not process more than MAX_BATCHES' do
+ max_batches = 3
+ stub_const("#{described_class.name}::MAX_BATCHES", max_batches)
+ result = consistency_checker.execute(start_id: Namespace.minimum(:id))
+ expect(result[:batches]).to eq(max_batches)
+ expect(result[:matches]).to eq(max_batches * batch_size)
+ end
+
+ it 'doesn not exceed the MAX_RUNTIME' do
+ allow(consistency_checker).to receive(:monotonic_time).and_return(0, max_runtime - 1, max_runtime + 1)
+ result = consistency_checker.execute(start_id: Namespace.minimum(:id))
+ expect(result[:batches]).to eq(1)
+ expect(result[:matches]).to eq(1 * batch_size)
+ end
+
+ it 'returns the correct number of matches and batches checked' do
+ expected_result = {
+ next_start_id: Namespace.minimum(:id) + described_class::MAX_BATCHES * described_class::BATCH_SIZE,
+ batches: max_batches,
+ matches: max_batches * batch_size,
+ mismatches: 0,
+ mismatches_details: []
+ }
+ expect(consistency_checker.execute(start_id: Namespace.minimum(:id))).to eq(expected_result)
+ end
+
+ it 'returns the min_id as the next_start_id if the check reaches the last element' do
+ expect(Gitlab::Metrics).to receive(:counter).at_most(:once)
+ .with(:consistency_checks, "Consistency Check Results")
+ .and_call_original
+
+ # Starting from the 5th last element
+ start_id = Namespace.all.order(id: :desc).limit(5).pluck(:id).last
+ expected_result = {
+ next_start_id: Namespace.first.id,
+ batches: 1,
+ matches: 5,
+ mismatches: 0,
+ mismatches_details: []
+ }
+ expect(consistency_checker.execute(start_id: start_id)).to eq(expected_result)
+
+ expect(metrics_counter.get(source_table: "namespaces", result: "mismatch")).to eq(0)
+ expect(metrics_counter.get(source_table: "namespaces", result: "match")).to eq(5)
+ end
+ end
+
+ context 'when some items are missing from the first table' do
+ let(:missing_namespace) { Namespace.all.order(:id).limit(2).last }
+
+ before do
+ create_list(:namespace, 50) # This will also create Ci::NameSpaceMirror objects
+ missing_namespace.delete
+ end
+
+ it 'reports the missing elements' do
+ expected_result = {
+ next_start_id: Namespace.first.id + described_class::MAX_BATCHES * described_class::BATCH_SIZE,
+ batches: max_batches,
+ matches: 39,
+ mismatches: 1,
+ mismatches_details: [{
+ id: missing_namespace.id,
+ source_table: nil,
+ target_table: [missing_namespace.traversal_ids]
+ }]
+ }
+ expect(consistency_checker.execute(start_id: Namespace.first.id)).to eq(expected_result)
+
+ expect(metrics_counter.get(source_table: "namespaces", result: "mismatch")).to eq(1)
+ expect(metrics_counter.get(source_table: "namespaces", result: "match")).to eq(39)
+ end
+ end
+
+ context 'when some items are missing from the second table' do
+ let(:missing_ci_namespace_mirror) { Ci::NamespaceMirror.all.order(:id).limit(2).last }
+
+ before do
+ create_list(:namespace, 50) # This will also create Ci::NameSpaceMirror objects
+ missing_ci_namespace_mirror.delete
+ end
+
+ it 'reports the missing elements' do
+ expected_result = {
+ next_start_id: Namespace.first.id + described_class::MAX_BATCHES * described_class::BATCH_SIZE,
+ batches: 4,
+ matches: 39,
+ mismatches: 1,
+ mismatches_details: [{
+ id: missing_ci_namespace_mirror.namespace_id,
+ source_table: [missing_ci_namespace_mirror.traversal_ids],
+ target_table: nil
+ }]
+ }
+ expect(consistency_checker.execute(start_id: Namespace.first.id)).to eq(expected_result)
+
+ expect(metrics_counter.get(source_table: "namespaces", result: "mismatch")).to eq(1)
+ expect(metrics_counter.get(source_table: "namespaces", result: "match")).to eq(39)
+ end
+ end
+
+ context 'when elements are different between the two tables' do
+ let(:different_namespaces) { Namespace.order(:id).limit(max_batches * batch_size).sample(3).sort_by(&:id) }
+
+ before do
+ create_list(:namespace, 50) # This will also create Ci::NameSpaceMirror objects
+
+ different_namespaces.each do |namespace|
+ namespace.update_attribute(:traversal_ids, [])
+ end
+ end
+
+ it 'reports the difference between the two tables' do
+ expected_result = {
+ next_start_id: Namespace.first.id + described_class::MAX_BATCHES * described_class::BATCH_SIZE,
+ batches: 4,
+ matches: 37,
+ mismatches: 3,
+ mismatches_details: different_namespaces.map do |namespace|
+ {
+ id: namespace.id,
+ source_table: [[]],
+ target_table: [[namespace.id]] # old traversal_ids of the namespace
+ }
+ end
+ }
+ expect(consistency_checker.execute(start_id: Namespace.first.id)).to eq(expected_result)
+
+ expect(metrics_counter.get(source_table: "namespaces", result: "mismatch")).to eq(3)
+ expect(metrics_counter.get(source_table: "namespaces", result: "match")).to eq(37)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/each_database_spec.rb b/spec/lib/gitlab/database/each_database_spec.rb
index d46c1ca8681..191f7017b4c 100644
--- a/spec/lib/gitlab/database/each_database_spec.rb
+++ b/spec/lib/gitlab/database/each_database_spec.rb
@@ -58,6 +58,15 @@ RSpec.describe Gitlab::Database::EachDatabase do
end
end
end
+
+ context 'when shared connections are not included' do
+ it 'only yields the unshared connections' do
+ expect(Gitlab::Database).to receive(:db_config_share_with).twice.and_return(nil, 'main')
+
+ expect { |b| described_class.each_database_connection(include_shared: false, &b) }
+ .to yield_successive_args([ActiveRecord::Base.connection, 'main'])
+ end
+ end
end
describe '.each_model_connection' do
diff --git a/spec/lib/gitlab/database/load_balancing/setup_spec.rb b/spec/lib/gitlab/database/load_balancing/setup_spec.rb
index 4d565ce137a..c44637b8d06 100644
--- a/spec/lib/gitlab/database/load_balancing/setup_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/setup_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe Gitlab::Database::LoadBalancing::Setup do
expect(setup).to receive(:configure_connection)
expect(setup).to receive(:setup_connection_proxy)
expect(setup).to receive(:setup_service_discovery)
- expect(setup).to receive(:setup_feature_flag_to_model_load_balancing)
setup.setup
end
@@ -120,120 +119,46 @@ RSpec.describe Gitlab::Database::LoadBalancing::Setup do
end
end
- describe '#setup_feature_flag_to_model_load_balancing', :reestablished_active_record_base do
+ context 'uses correct base models', :reestablished_active_record_base do
using RSpec::Parameterized::TableSyntax
where do
{
- "with model LB enabled it picks a dedicated CI connection" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: 'true',
+ "it picks a dedicated CI connection" => {
env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: nil,
request_store_active: false,
- ff_use_model_load_balancing: nil,
ff_force_no_sharing_primary_model: false,
expectations: {
main: { read: 'main_replica', write: 'main' },
ci: { read: 'ci_replica', write: 'ci' }
}
},
- "with model LB enabled and re-use of primary connection it uses CI connection for reads" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: 'true',
+ "with re-use of primary connection it uses CI connection for reads" => {
env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: 'main',
request_store_active: false,
- ff_use_model_load_balancing: nil,
ff_force_no_sharing_primary_model: false,
expectations: {
main: { read: 'main_replica', write: 'main' },
ci: { read: 'ci_replica', write: 'main' }
}
},
- "with model LB disabled it fallbacks to use main" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: 'false',
- env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: nil,
- request_store_active: false,
- ff_use_model_load_balancing: nil,
- ff_force_no_sharing_primary_model: false,
- expectations: {
- main: { read: 'main_replica', write: 'main' },
- ci: { read: 'main_replica', write: 'main' }
- }
- },
- "with model LB disabled, but re-use configured it fallbacks to use main" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: 'false',
+ "with re-use and FF force_no_sharing_primary_model enabled with RequestStore it sticks FF and uses CI connection for reads and writes" => {
env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: 'main',
- request_store_active: false,
- ff_use_model_load_balancing: nil,
- ff_force_no_sharing_primary_model: false,
- expectations: {
- main: { read: 'main_replica', write: 'main' },
- ci: { read: 'main_replica', write: 'main' }
- }
- },
- "with FF use_model_load_balancing disabled without RequestStore it uses main" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: nil,
- env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: nil,
- request_store_active: false,
- ff_use_model_load_balancing: false,
- ff_force_no_sharing_primary_model: false,
- expectations: {
- main: { read: 'main_replica', write: 'main' },
- ci: { read: 'main_replica', write: 'main' }
- }
- },
- "with FF use_model_load_balancing enabled without RequestStore sticking of FF does not work, so it fallbacks to use main" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: nil,
- env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: nil,
- request_store_active: false,
- ff_use_model_load_balancing: true,
- ff_force_no_sharing_primary_model: false,
- expectations: {
- main: { read: 'main_replica', write: 'main' },
- ci: { read: 'main_replica', write: 'main' }
- }
- },
- "with FF use_model_load_balancing disabled with RequestStore it uses main" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: nil,
- env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: nil,
- request_store_active: true,
- ff_use_model_load_balancing: false,
- ff_force_no_sharing_primary_model: false,
- expectations: {
- main: { read: 'main_replica', write: 'main' },
- ci: { read: 'main_replica', write: 'main' }
- }
- },
- "with FF use_model_load_balancing enabled with RequestStore it sticks FF and uses CI connection" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: nil,
- env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: nil,
request_store_active: true,
- ff_use_model_load_balancing: true,
- ff_force_no_sharing_primary_model: false,
+ ff_force_no_sharing_primary_model: true,
expectations: {
main: { read: 'main_replica', write: 'main' },
ci: { read: 'ci_replica', write: 'ci' }
}
},
- "with re-use and ff_use_model_load_balancing enabled and FF force_no_sharing_primary_model disabled with RequestStore it sticks FF and uses CI connection for reads" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: nil,
+ "with re-use and FF force_no_sharing_primary_model enabled without RequestStore it doesn't use FF and uses CI connection for reads only" => {
env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: 'main',
request_store_active: true,
- ff_use_model_load_balancing: true,
ff_force_no_sharing_primary_model: false,
expectations: {
main: { read: 'main_replica', write: 'main' },
ci: { read: 'ci_replica', write: 'main' }
}
- },
- "with re-use and ff_use_model_load_balancing enabled and FF force_no_sharing_primary_model enabled with RequestStore it sticks FF and uses CI connection for reads" => {
- env_GITLAB_USE_MODEL_LOAD_BALANCING: nil,
- env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: 'main',
- request_store_active: true,
- ff_use_model_load_balancing: true,
- ff_force_no_sharing_primary_model: true,
- expectations: {
- main: { read: 'main_replica', write: 'main' },
- ci: { read: 'ci_replica', write: 'ci' }
- }
}
}
end
@@ -285,9 +210,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::Setup do
end
end
- stub_env('GITLAB_USE_MODEL_LOAD_BALANCING', env_GITLAB_USE_MODEL_LOAD_BALANCING)
stub_env('GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci', env_GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci)
- stub_feature_flags(use_model_load_balancing: ff_use_model_load_balancing)
# Make load balancer to force init with a dedicated replicas connections
models.each do |_, model|
diff --git a/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb b/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb
index ad9a3a6e257..e7b5bad8626 100644
--- a/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb
@@ -240,7 +240,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
end
def software_license_class
- Class.new(ActiveRecord::Base) do
+ Class.new(Gitlab::Database::Migration[2.0]::MigrationRecord) do
self.table_name = 'software_licenses'
end
end
@@ -272,7 +272,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
end
def ci_instance_variables_class
- Class.new(ActiveRecord::Base) do
+ Class.new(Gitlab::Database::Migration[2.0]::MigrationRecord) do
self.table_name = 'ci_instance_variables'
end
end
@@ -303,7 +303,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
end
def detached_partitions_class
- Class.new(ActiveRecord::Base) do
+ Class.new(Gitlab::Database::Migration[2.0]::MigrationRecord) do
self.table_name = 'detached_partitions'
end
end
@@ -496,11 +496,16 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
Gitlab::Database.database_base_models.each do |db_config_name, model|
context "for db_config_name=#{db_config_name}" do
around do |example|
+ verbose_was = ActiveRecord::Migration.verbose
+ ActiveRecord::Migration.verbose = false
+
with_reestablished_active_record_base do
reconfigure_db_connection(model: ActiveRecord::Base, config_model: model)
example.run
end
+ ensure
+ ActiveRecord::Migration.verbose = verbose_was
end
before do
@@ -543,8 +548,15 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
expect { ignore_error(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas::DDLNotAllowedError) { migration_class.migrate(:down) } }.not_to raise_error
when :skipped
- expect { migration_class.migrate(:up) }.to raise_error(Gitlab::Database::MigrationHelpers::RestrictGitlabSchema::MigrationSkippedError)
- expect { migration_class.migrate(:down) }.to raise_error(Gitlab::Database::MigrationHelpers::RestrictGitlabSchema::MigrationSkippedError)
+ expect_next_instance_of(migration_class) do |migration_object|
+ expect(migration_object).to receive(:migration_skipped).and_call_original
+ expect(migration_object).not_to receive(:up)
+ expect(migration_object).not_to receive(:down)
+ expect(migration_object).not_to receive(:change)
+ end
+
+ migration_class.migrate(:up)
+ migration_class.migrate(:down)
end
end
end
diff --git a/spec/lib/gitlab/database/migration_helpers/v2_spec.rb b/spec/lib/gitlab/database/migration_helpers/v2_spec.rb
index acf775b3538..5c054795697 100644
--- a/spec/lib/gitlab/database/migration_helpers/v2_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers/v2_spec.rb
@@ -96,6 +96,12 @@ RSpec.describe Gitlab::Database::MigrationHelpers::V2 do
expect(new_record_1.reload).to have_attributes(status: 1, original: 'updated', renamed: 'updated')
expect(new_record_2.reload).to have_attributes(status: 1, original: nil, renamed: nil)
end
+
+ it 'requires the helper to run in ddl mode' do
+ expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_ddl_mode!)
+
+ migration.public_send(operation, :_test_table, :original, :renamed)
+ end
end
describe '#rename_column_concurrently' do
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index 9505da8fd12..798eee0de3e 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -1390,6 +1390,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
end
it 'reverses the operations of cleanup_concurrent_column_type_change' do
+ expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_ddl_mode!)
+
expect(model).to receive(:check_trigger_permissions!).with(:users)
expect(model).to receive(:create_column_from).with(
@@ -1415,6 +1417,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
end
it 'passes the type_cast_function, batch_column_name and limit' do
+ expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_ddl_mode!)
+
expect(model).to receive(:column_exists?).with(:users, :other_batch_column).and_return(true)
expect(model).to receive(:check_trigger_permissions!).with(:users)
@@ -2096,7 +2100,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
end
end
- let(:migration_relation) { Gitlab::Database::BackgroundMigration::BatchedMigration.active }
+ let(:migration_relation) { Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:active) }
before do
model.initialize_conversion_of_integer_to_bigint(table, columns)
@@ -2218,7 +2222,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
subject(:ensure_batched_background_migration_is_finished) { model.ensure_batched_background_migration_is_finished(**configuration) }
it 'raises an error when migration exists and is not marked as finished' do
- create(:batched_background_migration, configuration.merge(status: :active))
+ create(:batched_background_migration, :active, configuration)
expect { ensure_batched_background_migration_is_finished }
.to raise_error "Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':" \
@@ -2234,7 +2238,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
end
it 'does not raise error when migration exists and is marked as finished' do
- create(:batched_background_migration, configuration.merge(status: :finished))
+ create(:batched_background_migration, :finished, configuration)
expect { ensure_batched_background_migration_is_finished }
.not_to raise_error
@@ -2422,7 +2426,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
def setup
namespace = namespaces.create!(name: 'foo', path: 'foo', type: Namespaces::UserNamespace.sti_name)
- projects.create!(namespace_id: namespace.id)
+ project_namespace = namespaces.create!(name: 'project-foo', path: 'project-foo', type: 'Project', parent_id: namespace.id, visibility_level: 20)
+ projects.create!(namespace_id: namespace.id, project_namespace_id: project_namespace.id)
end
it 'generates iids properly for models created after the migration' do
diff --git a/spec/lib/gitlab/database/migration_spec.rb b/spec/lib/gitlab/database/migration_spec.rb
index 287e738c24e..18bbc6c1dd3 100644
--- a/spec/lib/gitlab/database/migration_spec.rb
+++ b/spec/lib/gitlab/database/migration_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe Gitlab::Database::Migration do
# This breaks upon Rails upgrade. In that case, we'll add a new version in Gitlab::Database::Migration::MIGRATION_CLASSES,
# bump .current_version and leave existing migrations and already defined versions of Gitlab::Database::Migration
# untouched.
- expect(described_class[described_class.current_version].superclass).to eq(ActiveRecord::Migration::Current)
+ expect(described_class[described_class.current_version]).to be < ActiveRecord::Migration::Current
end
end
diff --git a/spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb b/spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb
index 37efff165c7..f9347a174c4 100644
--- a/spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb
@@ -75,7 +75,7 @@ RSpec.describe Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers d
max_batch_size: 10000,
sub_batch_size: 10,
job_arguments: %w[],
- status: 'active',
+ status_name: :active,
total_tuple_count: pgclass_info.cardinality_estimate)
end
diff --git a/spec/lib/gitlab/database/migrations/instrumentation_spec.rb b/spec/lib/gitlab/database/migrations/instrumentation_spec.rb
index fd8303c379c..c31244060ec 100644
--- a/spec/lib/gitlab/database/migrations/instrumentation_spec.rb
+++ b/spec/lib/gitlab/database/migrations/instrumentation_spec.rb
@@ -11,6 +11,10 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
describe '#observe' do
subject { described_class.new(result_dir: result_dir) }
+ def load_observation(result_dir, migration_name)
+ Gitlab::Json.parse(File.read(File.join(result_dir, migration_name, described_class::STATS_FILENAME)))
+ end
+
let(:migration_name) { 'test' }
let(:migration_version) { '12345' }
@@ -87,7 +91,7 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
end
context 'retrieving observations' do
- subject { instance.observations.first }
+ subject { load_observation(result_dir, migration_name) }
before do
observe
@@ -98,10 +102,10 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
end
it 'records a valid observation', :aggregate_failures do
- expect(subject.walltime).not_to be_nil
- expect(subject.success).to be_falsey
- expect(subject.version).to eq(migration_version)
- expect(subject.name).to eq(migration_name)
+ expect(subject['walltime']).not_to be_nil
+ expect(subject['success']).to be_falsey
+ expect(subject['version']).to eq(migration_version)
+ expect(subject['name']).to eq(migration_name)
end
end
end
@@ -113,11 +117,18 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
let(:migration1) { double('migration1', call: nil) }
let(:migration2) { double('migration2', call: nil) }
+ let(:migration_name_2) { 'other_migration' }
+ let(:migration_version_2) { '98765' }
+
it 'records observations for all migrations' do
subject.observe(version: migration_version, name: migration_name, connection: connection) {}
- subject.observe(version: migration_version, name: migration_name, connection: connection) { raise 'something went wrong' } rescue nil
+ subject.observe(version: migration_version_2, name: migration_name_2, connection: connection) { raise 'something went wrong' } rescue nil
+
+ expect { load_observation(result_dir, migration_name) }.not_to raise_error
+ expect { load_observation(result_dir, migration_name_2) }.not_to raise_error
- expect(subject.observations.size).to eq(2)
+ # Each observation is a subdirectory of the result_dir, so here we check that we didn't record an extra one
+ expect(Pathname(result_dir).children.map { |d| d.basename.to_s }).to contain_exactly(migration_name, migration_name_2)
end
end
end
diff --git a/spec/lib/gitlab/database/migrations/runner_spec.rb b/spec/lib/gitlab/database/migrations/runner_spec.rb
index 84482e6b450..8b1ccf05eb1 100644
--- a/spec/lib/gitlab/database/migrations/runner_spec.rb
+++ b/spec/lib/gitlab/database/migrations/runner_spec.rb
@@ -124,4 +124,16 @@ RSpec.describe Gitlab::Database::Migrations::Runner do
expect(metadata).to match('version' => described_class::SCHEMA_VERSION)
end
end
+
+ describe '.background_migrations' do
+ it 'is a TestBackgroundRunner' do
+ expect(described_class.background_migrations).to be_a(Gitlab::Database::Migrations::TestBackgroundRunner)
+ end
+
+ it 'is configured with a result dir of /background_migrations' do
+ runner = described_class.background_migrations
+
+ expect(runner.result_dir).to eq(described_class::BASE_RESULT_DIR.join( 'background_migrations'))
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/migrations/test_background_runner_spec.rb b/spec/lib/gitlab/database/migrations/test_background_runner_spec.rb
index c6fe88a7c2d..9407efad91f 100644
--- a/spec/lib/gitlab/database/migrations/test_background_runner_spec.rb
+++ b/spec/lib/gitlab/database/migrations/test_background_runner_spec.rb
@@ -11,11 +11,17 @@ RSpec.describe Gitlab::Database::Migrations::TestBackgroundRunner, :redis do
Sidekiq::Testing.disable! { ex.run }
end
+ let(:result_dir) { Dir.mktmpdir }
+
+ after do
+ FileUtils.rm_rf(result_dir)
+ end
+
context 'without jobs to run' do
it 'returns immediately' do
- runner = described_class.new
+ runner = described_class.new(result_dir: result_dir)
expect(runner).not_to receive(:run_job)
- described_class.new.run_jobs(for_duration: 1.second)
+ described_class.new(result_dir: result_dir).run_jobs(for_duration: 1.second)
end
end
@@ -30,7 +36,7 @@ RSpec.describe Gitlab::Database::Migrations::TestBackgroundRunner, :redis do
context 'finding pending background jobs' do
it 'finds all the migrations' do
- expect(described_class.new.traditional_background_migrations.to_a.size).to eq(5)
+ expect(described_class.new(result_dir: result_dir).traditional_background_migrations.to_a.size).to eq(5)
end
end
@@ -53,12 +59,28 @@ RSpec.describe Gitlab::Database::Migrations::TestBackgroundRunner, :redis do
end
end
+ def expect_recorded_migration_runs(migrations_to_runs)
+ migrations_to_runs.each do |migration, runs|
+ path = File.join(result_dir, migration.name.demodulize)
+ num_subdirs = Pathname(path).children.count(&:directory?)
+ expect(num_subdirs).to eq(runs)
+ end
+ end
+
+ def expect_migration_runs(migrations_to_run_counts)
+ expect_migration_call_counts(migrations_to_run_counts)
+
+ yield
+
+ expect_recorded_migration_runs(migrations_to_run_counts)
+ end
+
it 'runs the migration class correctly' do
calls = []
define_background_migration(migration_name) do |i|
calls << i
end
- described_class.new.run_jobs(for_duration: 1.second) # Any time would work here as we do not advance time
+ described_class.new(result_dir: result_dir).run_jobs(for_duration: 1.second) # Any time would work here as we do not advance time
expect(calls).to contain_exactly(1, 2, 3, 4, 5)
end
@@ -67,9 +89,9 @@ RSpec.describe Gitlab::Database::Migrations::TestBackgroundRunner, :redis do
travel(1.minute)
end
- expect_migration_call_counts(migration => 3)
-
- described_class.new.run_jobs(for_duration: 3.minutes)
+ expect_migration_runs(migration => 3) do
+ described_class.new(result_dir: result_dir).run_jobs(for_duration: 3.minutes)
+ end
end
context 'with multiple migrations to run' do
@@ -90,12 +112,12 @@ RSpec.describe Gitlab::Database::Migrations::TestBackgroundRunner, :redis do
travel(2.minutes)
end
- expect_migration_call_counts(
+ expect_migration_runs(
migration => 2, # 1 minute jobs for 90 seconds, can finish the first and start the second
other_migration => 1 # 2 minute jobs for 90 seconds, past deadline after a single job
- )
-
- described_class.new.run_jobs(for_duration: 3.minutes)
+ ) do
+ described_class.new(result_dir: result_dir).run_jobs(for_duration: 3.minutes)
+ end
end
it 'does not give leftover time to extra migrations' do
@@ -107,12 +129,13 @@ RSpec.describe Gitlab::Database::Migrations::TestBackgroundRunner, :redis do
other_migration = define_background_migration(other_migration_name) do
travel(1.minute)
end
- expect_migration_call_counts(
+
+ expect_migration_runs(
migration => 5,
other_migration => 2
- )
-
- described_class.new.run_jobs(for_duration: 3.minutes)
+ ) do
+ described_class.new(result_dir: result_dir).run_jobs(for_duration: 3.minutes)
+ end
end
end
end
diff --git a/spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb b/spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb
index 4f1d6302331..1026b4370a5 100644
--- a/spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb
+++ b/spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb
@@ -125,6 +125,17 @@ RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::TableManagementHe
expect_table_partitioned_by(partitioned_table, [partition_column])
end
+ it 'requires the migration helper to be run in DDL mode' do
+ expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_ddl_mode!)
+
+ migration.partition_table_by_date source_table, partition_column, min_date: min_date, max_date: max_date
+
+ expect(connection.table_exists?(partitioned_table)).to be(true)
+ expect(connection.primary_key(partitioned_table)).to eq(new_primary_key)
+
+ expect_table_partitioned_by(partitioned_table, [partition_column])
+ end
+
it 'changes the primary key datatype to bigint' do
migration.partition_table_by_date source_table, partition_column, min_date: min_date, max_date: max_date
@@ -191,6 +202,8 @@ RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::TableManagementHe
end
it 'creates a partition spanning over each month from the first record' do
+ expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:with_suppressed).and_yield
+
migration.partition_table_by_date source_table, partition_column, max_date: max_date
expect_range_partitions_for(partitioned_table, {
@@ -206,6 +219,8 @@ RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::TableManagementHe
context 'without data' do
it 'creates the catchall partition plus two actual partition' do
+ expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:with_suppressed).and_yield
+
migration.partition_table_by_date source_table, partition_column, max_date: max_date
expect_range_partitions_for(partitioned_table, {
@@ -536,6 +551,16 @@ RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::TableManagementHe
migration.finalize_backfilling_partitioned_table source_table
end
+
+ it 'requires the migration helper to execute in DML mode' do
+ expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_dml_mode!)
+
+ expect(Gitlab::BackgroundMigration).to receive(:steal)
+ .with(described_class::MIGRATION_CLASS_NAME)
+ .and_yield(background_job)
+
+ migration.finalize_backfilling_partitioned_table source_table
+ end
end
context 'when there is missed data' do
@@ -627,6 +652,7 @@ RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::TableManagementHe
allow(backfill).to receive(:perform).and_return(1)
end
+ expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:with_suppressed).and_yield
expect(migration).to receive(:disable_statement_timeout).and_call_original
expect(migration).to receive(:execute).with("VACUUM FREEZE ANALYZE #{partitioned_table}")
diff --git a/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb
index 86e74cf5177..b8c1ecd9089 100644
--- a/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb
+++ b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasMetrics, query_ana
process_sql(ActiveRecord::Base, "SELECT 1 FROM projects")
end
- context 'properly observes all queries', :add_ci_connection do
+ context 'properly observes all queries', :add_ci_connection, :request_store do
using RSpec::Parameterized::TableSyntax
where do
@@ -28,7 +28,8 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasMetrics, query_ana
expectations: {
gitlab_schemas: "gitlab_main",
db_config_name: "main"
- }
+ },
+ setup: nil
},
"for query accessing gitlab_ci and gitlab_main" => {
model: ApplicationRecord,
@@ -36,7 +37,8 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasMetrics, query_ana
expectations: {
gitlab_schemas: "gitlab_ci,gitlab_main",
db_config_name: "main"
- }
+ },
+ setup: nil
},
"for query accessing gitlab_ci and gitlab_main the gitlab_schemas is always ordered" => {
model: ApplicationRecord,
@@ -44,7 +46,8 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasMetrics, query_ana
expectations: {
gitlab_schemas: "gitlab_ci,gitlab_main",
db_config_name: "main"
- }
+ },
+ setup: nil
},
"for query accessing CI database" => {
model: Ci::ApplicationRecord,
@@ -53,6 +56,62 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasMetrics, query_ana
gitlab_schemas: "gitlab_ci",
db_config_name: "ci"
}
+ },
+ "for query accessing CI database with re-use and disabled sharing" => {
+ model: Ci::ApplicationRecord,
+ sql: "SELECT 1 FROM ci_builds",
+ expectations: {
+ gitlab_schemas: "gitlab_ci",
+ db_config_name: "ci",
+ ci_dedicated_primary_connection: true
+ },
+ setup: ->(_) do
+ skip_if_multiple_databases_not_setup
+ stub_env('GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci', 'main')
+ stub_feature_flags(force_no_sharing_primary_model: true)
+ end
+ },
+ "for query accessing CI database with re-use and enabled sharing" => {
+ model: Ci::ApplicationRecord,
+ sql: "SELECT 1 FROM ci_builds",
+ expectations: {
+ gitlab_schemas: "gitlab_ci",
+ db_config_name: "ci",
+ ci_dedicated_primary_connection: false
+ },
+ setup: ->(_) do
+ skip_if_multiple_databases_not_setup
+ stub_env('GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci', 'main')
+ stub_feature_flags(force_no_sharing_primary_model: false)
+ end
+ },
+ "for query accessing CI database without re-use and disabled sharing" => {
+ model: Ci::ApplicationRecord,
+ sql: "SELECT 1 FROM ci_builds",
+ expectations: {
+ gitlab_schemas: "gitlab_ci",
+ db_config_name: "ci",
+ ci_dedicated_primary_connection: true
+ },
+ setup: ->(_) do
+ skip_if_multiple_databases_not_setup
+ stub_env('GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci', nil)
+ stub_feature_flags(force_no_sharing_primary_model: true)
+ end
+ },
+ "for query accessing CI database without re-use and enabled sharing" => {
+ model: Ci::ApplicationRecord,
+ sql: "SELECT 1 FROM ci_builds",
+ expectations: {
+ gitlab_schemas: "gitlab_ci",
+ db_config_name: "ci",
+ ci_dedicated_primary_connection: true
+ },
+ setup: ->(_) do
+ skip_if_multiple_databases_not_setup
+ stub_env('GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci', nil)
+ stub_feature_flags(force_no_sharing_primary_model: false)
+ end
}
}
end
@@ -63,8 +122,15 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasMetrics, query_ana
end
it do
+ stub_env('GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci', nil)
+
+ instance_eval(&setup) if setup
+
+ allow(::Ci::ApplicationRecord.load_balancer).to receive(:configuration)
+ .and_return(Gitlab::Database::LoadBalancing::Configuration.for_model(::Ci::ApplicationRecord))
+
expect(described_class.schemas_metrics).to receive(:increment)
- .with(expectations).and_call_original
+ .with({ ci_dedicated_primary_connection: anything }.merge(expectations)).and_call_original
process_sql(model, sql)
end
diff --git a/spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb b/spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb
index e76718fe48a..34670696787 100644
--- a/spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb
+++ b/spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb
@@ -74,8 +74,28 @@ RSpec.describe Gitlab::Database::Reindexing::GrafanaNotifier do
end
describe '#notify_start' do
- context 'additional tag is nil' do
- subject { described_class.new(api_key, api_url, nil).notify_start(action) }
+ context 'when Grafana is configured using application settings' do
+ subject { described_class.new.notify_start(action) }
+
+ let(:payload) do
+ {
+ time: (action.action_start.utc.to_f * 1000).to_i,
+ tags: ['reindex', additional_tag, action.index.tablename, action.index.name],
+ text: "Started reindexing of #{action.index.name} on #{action.index.tablename}"
+ }
+ end
+
+ before do
+ stub_application_setting(database_grafana_api_key: api_key)
+ stub_application_setting(database_grafana_api_url: api_url)
+ stub_application_setting(database_grafana_tag: additional_tag)
+ end
+
+ it_behaves_like 'interacting with Grafana annotations API'
+ end
+
+ context 'when there is no additional tag' do
+ subject { described_class.new(api_key: api_key, api_url: api_url, additional_tag: '').notify_start(action) }
let(:payload) do
{
@@ -88,8 +108,8 @@ RSpec.describe Gitlab::Database::Reindexing::GrafanaNotifier do
it_behaves_like 'interacting with Grafana annotations API'
end
- context 'additional tag is not nil' do
- subject { described_class.new(api_key, api_url, additional_tag).notify_start(action) }
+ context 'additional tag is provided' do
+ subject { described_class.new(api_key: api_key, api_url: api_url, additional_tag: additional_tag).notify_start(action) }
let(:payload) do
{
@@ -104,8 +124,30 @@ RSpec.describe Gitlab::Database::Reindexing::GrafanaNotifier do
end
describe '#notify_end' do
- context 'additional tag is nil' do
- subject { described_class.new(api_key, api_url, nil).notify_end(action) }
+ context 'when Grafana is configured using application settings' do
+ subject { described_class.new.notify_end(action) }
+
+ let(:payload) do
+ {
+ time: (action.action_start.utc.to_f * 1000).to_i,
+ tags: ['reindex', additional_tag, action.index.tablename, action.index.name],
+ text: "Finished reindexing of #{action.index.name} on #{action.index.tablename} (#{action.state})",
+ timeEnd: (action.action_end.utc.to_f * 1000).to_i,
+ isRegion: true
+ }
+ end
+
+ before do
+ stub_application_setting(database_grafana_api_key: api_key)
+ stub_application_setting(database_grafana_api_url: api_url)
+ stub_application_setting(database_grafana_tag: additional_tag)
+ end
+
+ it_behaves_like 'interacting with Grafana annotations API'
+ end
+
+ context 'when there is no additional tag' do
+ subject { described_class.new(api_key: api_key, api_url: api_url, additional_tag: '').notify_end(action) }
let(:payload) do
{
@@ -120,8 +162,8 @@ RSpec.describe Gitlab::Database::Reindexing::GrafanaNotifier do
it_behaves_like 'interacting with Grafana annotations API'
end
- context 'additional tag is not nil' do
- subject { described_class.new(api_key, api_url, additional_tag).notify_end(action) }
+ context 'additional tag is provided' do
+ subject { described_class.new(api_key: api_key, api_url: api_url, additional_tag: additional_tag).notify_end(action) }
let(:payload) do
{
diff --git a/spec/lib/gitlab/database/schema_cache_with_renamed_table_spec.rb b/spec/lib/gitlab/database/schema_cache_with_renamed_table_spec.rb
index 7caee414719..0bea348e6b4 100644
--- a/spec/lib/gitlab/database/schema_cache_with_renamed_table_spec.rb
+++ b/spec/lib/gitlab/database/schema_cache_with_renamed_table_spec.rb
@@ -68,8 +68,8 @@ RSpec.describe Gitlab::Database::SchemaCacheWithRenamedTable do
describe 'when the table behind a model is actually a view' do
let(:group) { create(:group) }
- let(:project_attributes) { attributes_for(:project, namespace_id: group.id).except(:creator) }
- let(:record) { old_model.create!(project_attributes) }
+ let(:attrs) { attributes_for(:project, namespace_id: group.id, project_namespace_id: group.id).except(:creator) }
+ let(:record) { old_model.create!(attrs) }
it 'can persist records' do
expect(record.reload.attributes).to eq(new_model.find(record.id).attributes)
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index c58dba213ee..ac8616f84a7 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -185,16 +185,6 @@ RSpec.describe Gitlab::Database do
end
end
- describe '.nulls_last_order' do
- it { expect(described_class.nulls_last_order('column', 'ASC')).to eq 'column ASC NULLS LAST'}
- it { expect(described_class.nulls_last_order('column', 'DESC')).to eq 'column DESC NULLS LAST'}
- end
-
- describe '.nulls_first_order' do
- it { expect(described_class.nulls_first_order('column', 'ASC')).to eq 'column ASC NULLS FIRST'}
- it { expect(described_class.nulls_first_order('column', 'DESC')).to eq 'column DESC NULLS FIRST'}
- end
-
describe '.db_config_for_connection' do
context 'when the regular connection is used' do
it 'returns db_config' do
@@ -245,15 +235,32 @@ RSpec.describe Gitlab::Database do
end
end
+ describe '.db_config_names' do
+ let(:expected) { %w[foo bar] }
+
+ it 'includes only main by default' do
+ allow(::ActiveRecord::Base).to receive(:configurations).and_return(
+ double(configs_for: %w[foo bar].map { |x| double(name: x) })
+ )
+
+ expect(described_class.db_config_names).to eq(expected)
+ end
+
+ it 'excludes geo when that is included' do
+ allow(::ActiveRecord::Base).to receive(:configurations).and_return(
+ double(configs_for: %w[foo bar geo].map { |x| double(name: x) })
+ )
+
+ expect(described_class.db_config_names).to eq(expected)
+ end
+ end
+
describe '.gitlab_schemas_for_connection' do
it 'does raise exception for invalid connection' do
expect { described_class.gitlab_schemas_for_connection(:invalid) }.to raise_error /key not found: "unknown"/
end
it 'does return a valid schema depending on a base model used', :request_store do
- # This is currently required as otherwise the `Ci::Build.connection` == `Project.connection`
- # ENV due to lib/gitlab/database/load_balancing/setup.rb:93
- stub_env('GITLAB_USE_MODEL_LOAD_BALANCING', '1')
# FF due to lib/gitlab/database/load_balancing/configuration.rb:92
stub_feature_flags(force_no_sharing_primary_model: true)
@@ -268,6 +275,47 @@ RSpec.describe Gitlab::Database do
expect(described_class.gitlab_schemas_for_connection(ActiveRecord::Base.connection)).to include(:gitlab_ci, :gitlab_shared)
end
end
+
+ context "when there's CI connection", :request_store do
+ before do
+ skip_if_multiple_databases_not_setup
+
+ # FF due to lib/gitlab/database/load_balancing/configuration.rb:92
+ # Requires usage of `:request_store`
+ stub_feature_flags(force_no_sharing_primary_model: true)
+ end
+
+ context 'when CI uses database_tasks: false does indicate that ci: is subset of main:' do
+ before do
+ allow(Ci::ApplicationRecord.connection_db_config).to receive(:database_tasks?).and_return(false)
+ end
+
+ it 'does return gitlab_ci when accessing via main: connection' do
+ expect(described_class.gitlab_schemas_for_connection(Project.connection)).to include(:gitlab_ci, :gitlab_main, :gitlab_shared)
+ end
+
+ it 'does not return gitlab_main when accessing via ci: connection' do
+ expect(described_class.gitlab_schemas_for_connection(Ci::Build.connection)).to include(:gitlab_ci, :gitlab_shared)
+ expect(described_class.gitlab_schemas_for_connection(Ci::Build.connection)).not_to include(:gitlab_main)
+ end
+ end
+
+ context 'when CI uses database_tasks: true does indicate that ci: has own database' do
+ before do
+ allow(Ci::ApplicationRecord.connection_db_config).to receive(:database_tasks?).and_return(true)
+ end
+
+ it 'does not return gitlab_ci when accessing via main: connection' do
+ expect(described_class.gitlab_schemas_for_connection(Project.connection)).to include(:gitlab_main, :gitlab_shared)
+ expect(described_class.gitlab_schemas_for_connection(Project.connection)).not_to include(:gitlab_ci)
+ end
+
+ it 'does not return gitlab_main when accessing via ci: connection' do
+ expect(described_class.gitlab_schemas_for_connection(Ci::Build.connection)).to include(:gitlab_ci, :gitlab_shared)
+ expect(described_class.gitlab_schemas_for_connection(Ci::Build.connection)).not_to include(:gitlab_main)
+ end
+ end
+ end
end
describe '#true_value' do
diff --git a/spec/lib/gitlab/diff/custom_diff_spec.rb b/spec/lib/gitlab/diff/custom_diff_spec.rb
index 246508d2e1e..77d2a6cbcd6 100644
--- a/spec/lib/gitlab/diff/custom_diff_spec.rb
+++ b/spec/lib/gitlab/diff/custom_diff_spec.rb
@@ -34,6 +34,59 @@ RSpec.describe Gitlab::Diff::CustomDiff do
expect(described_class.transformed_for_diff?(blob)).to be_falsey
end
end
+
+ context 'timeout' do
+ subject { described_class.preprocess_before_diff(ipynb_blob.path, nil, ipynb_blob) }
+
+ it 'falls back to nil on timeout' do
+ allow(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+ expect(Timeout).to receive(:timeout).and_raise(Timeout::Error)
+
+ expect(subject).to be_nil
+ end
+
+ context 'when in foreground' do
+ it 'utilizes timeout for web' do
+ expect(Timeout).to receive(:timeout).with(described_class::RENDERED_TIMEOUT_FOREGROUND).and_call_original
+
+ expect(subject).not_to include('cells')
+ end
+
+ it 'increments metrics' do
+ counter = Gitlab::Metrics.counter(:ipynb_semantic_diff_timeouts_total, 'desc')
+
+ expect(Timeout).to receive(:timeout).and_raise(Timeout::Error)
+ expect { subject }.to change { counter.get(source: described_class::FOREGROUND_EXECUTION) }.by(1)
+ end
+ end
+
+ context 'when in background' do
+ before do
+ allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
+ end
+
+ it 'utilizes longer timeout for sidekiq' do
+ expect(Timeout).to receive(:timeout).with(described_class::RENDERED_TIMEOUT_BACKGROUND).and_call_original
+
+ expect(subject).not_to include('cells')
+ end
+
+ it 'increments metrics' do
+ counter = Gitlab::Metrics.counter(:ipynb_semantic_diff_timeouts_total, 'desc')
+
+ expect(Timeout).to receive(:timeout).and_raise(Timeout::Error)
+ expect { subject }.to change { counter.get(source: described_class::BACKGROUND_EXECUTION) }.by(1)
+ end
+ end
+ end
+
+ context 'when invalid ipynb' do
+ it 'returns nil' do
+ expect(ipynb_blob).to receive(:data).and_return('invalid ipynb')
+
+ expect(described_class.preprocess_before_diff(ipynb_blob.path, nil, ipynb_blob)).to be_nil
+ end
+ end
end
describe '#transformed_blob_data' do
diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb
index f2212ec9b09..0d7a183bb11 100644
--- a/spec/lib/gitlab/diff/file_spec.rb
+++ b/spec/lib/gitlab/diff/file_spec.rb
@@ -51,6 +51,54 @@ RSpec.describe Gitlab::Diff::File do
project.commit(branch_name).diffs.diff_files.first
end
+ describe '#initialize' do
+ let(:commit) { project.commit("532c837") }
+
+ context 'when file is ipynb' do
+ let(:ipynb_semantic_diff) { false }
+ let(:rendered_diffs_viewer) { false }
+
+ before do
+ stub_feature_flags(ipynb_semantic_diff: ipynb_semantic_diff, rendered_diffs_viewer: rendered_diffs_viewer)
+ end
+
+ context 'when ipynb_semantic_diff is off, and rendered_viewer is off' do
+ it 'does not generate notebook diffs' do
+ expect(Gitlab::Diff::CustomDiff).not_to receive(:preprocess_before_diff)
+ expect(diff_file.rendered).to be_nil
+ end
+ end
+
+ context 'when ipynb_semantic_diff is off, and rendered_viewer is on' do
+ let(:rendered_diffs_viewer) { true }
+
+ it 'does not generate rendered diff' do
+ expect(Gitlab::Diff::CustomDiff).not_to receive(:preprocess_before_diff)
+ expect(diff_file.rendered).to be_nil
+ end
+ end
+
+ context 'when ipynb_semantic_diff is on, and rendered_viewer is off' do
+ let(:ipynb_semantic_diff) { true }
+
+ it 'transforms using custom diff CustomDiff' do
+ expect(Gitlab::Diff::CustomDiff).to receive(:preprocess_before_diff).and_call_original
+ expect(diff_file.rendered).to be_nil
+ end
+ end
+
+ context 'when ipynb_semantic_diff is on, and rendered_viewer is on' do
+ let(:ipynb_semantic_diff) { true }
+ let(:rendered_diffs_viewer) { true }
+
+ it 'transforms diff using NotebookDiffFile' do
+ expect(Gitlab::Diff::CustomDiff).not_to receive(:preprocess_before_diff)
+ expect(diff_file.rendered).not_to be_nil
+ end
+ end
+ end
+ end
+
describe '#has_renderable?' do
context 'file is ipynb' do
let(:commit) { project.commit("532c837") }
@@ -66,14 +114,58 @@ RSpec.describe Gitlab::Diff::File do
it 'does not have renderable viewer' do
expect(diff_file.has_renderable?).to be_falsey
end
+
+ it 'does not create a Notebook DiffFile' do
+ expect(diff_file.rendered).to be_nil
+
+ expect(::Gitlab::Diff::Rendered::Notebook::DiffFile).not_to receive(:new)
+ end
end
end
describe '#rendered' do
- let(:commit) { project.commit("532c837") }
+ context 'when not ipynb' do
+ it 'is nil' do
+ expect(diff_file.rendered).to be_nil
+ end
+ end
+
+ context 'when ipynb' do
+ let(:commit) { project.commit("532c837") }
+
+ it 'creates a NotebookDiffFile for rendering' do
+ expect(diff_file.rendered).to be_kind_of(Gitlab::Diff::Rendered::Notebook::DiffFile)
+ end
+
+ context 'when too large' do
+ it 'is nil' do
+ expect(diff).to receive(:too_large?).and_return(true)
+
+ expect(diff_file.rendered).to be_nil
+ end
+ end
+
+ context 'when not modified' do
+ it 'is nil' do
+ expect(diff_file).to receive(:modified_file?).and_return(false)
+
+ expect(diff_file.rendered).to be_nil
+ end
+ end
+
+ context 'when semantic ipynb is off' do
+ before do
+ stub_feature_flags(ipynb_semantic_diff: false)
+ end
+
+ it 'returns nil' do
+ expect(diff_file).not_to receive(:modified_file?)
+ expect(diff_file).not_to receive(:ipynb?)
+ expect(diff).not_to receive(:too_large?)
- it 'creates a NotebookDiffFile for rendering' do
- expect(diff_file.rendered).to be_kind_of(Gitlab::Diff::Rendered::Notebook::DiffFile)
+ expect(diff_file.rendered).to be_nil
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb b/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
index 15edbc22460..89b284feee0 100644
--- a/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
+++ b/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
@@ -63,6 +63,28 @@ RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFile do
expect(nb_file.diff).to be_nil
end
end
+
+ context 'timeout' do
+ it 'utilizes timeout for web' do
+ expect(Timeout).to receive(:timeout).with(described_class::RENDERED_TIMEOUT_FOREGROUND).and_call_original
+
+ nb_file.diff
+ end
+
+ it 'falls back to nil on timeout' do
+ allow(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+ expect(Timeout).to receive(:timeout).and_raise(Timeout::Error)
+
+ expect(nb_file.diff).to be_nil
+ end
+
+ it 'utilizes longer timeout for sidekiq' do
+ allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
+ expect(Timeout).to receive(:timeout).with(described_class::RENDERED_TIMEOUT_BACKGROUND).and_call_original
+
+ nb_file.diff
+ end
+ end
end
describe '#has_renderable?' do
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 913e197708f..8d008986464 100644
--- a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
@@ -477,20 +477,6 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
end
end
- context 'when there is a reply-to address and a from address' do
- let(:email_raw) { email_fixture('emails/service_desk_reply_to_and_from.eml') }
-
- it 'shows both from and reply-to addresses in the issue header' do
- setup_attachment
-
- expect { receiver.execute }.to change { Issue.count }.by(1)
-
- new_issue = Issue.last
-
- expect(new_issue.external_author).to eq('finn@adventuretime.ooo (reply to: marceline@adventuretime.ooo)')
- end
- end
-
context 'when service desk is not enabled for project' do
before do
allow(Gitlab::ServiceDesk).to receive(:enabled?).and_return(false)
diff --git a/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb
index 0521123f1ef..8bd873cf008 100644
--- a/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb
+++ b/spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb
@@ -100,7 +100,6 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing::Base do
:trial | true
:team | true
:experience | true
- :invite_team | false
end
with_them do
diff --git a/spec/lib/gitlab/email/message/in_product_marketing/invite_team_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/invite_team_spec.rb
deleted file mode 100644
index 8319560f594..00000000000
--- a/spec/lib/gitlab/email/message/in_product_marketing/invite_team_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Email::Message::InProductMarketing::InviteTeam do
- let_it_be(:group) { build(:group) }
- let_it_be(:user) { build(:user) }
-
- let(:series) { 0 }
-
- subject(:message) { described_class.new(group: group, user: user, series: series) }
-
- describe 'initialize' do
- context 'when series is valid' do
- it 'does not raise error' do
- expect { subject }.not_to raise_error(ArgumentError)
- end
- end
-
- context 'when series is invalid' do
- let(:series) { 1 }
-
- it 'raises error' do
- expect { subject }.to raise_error(ArgumentError)
- end
- end
- end
-
- it 'contains the correct message', :aggregate_failures do
- expect(message.subject_line).to eq 'Invite your teammates to GitLab'
- expect(message.tagline).to be_empty
- expect(message.title).to eq 'GitLab is better with teammates to help out!'
- expect(message.subtitle).to be_empty
- expect(message.body_line1).to eq 'Invite your teammates today and build better code together. You can even assign tasks to new teammates such as setting up CI/CD, to help get projects up and running.'
- expect(message.body_line2).to be_empty
- expect(message.cta_text).to eq 'Invite your teammates to help'
- expect(message.logo_path).to eq 'mailers/in_product_marketing/team-0.png'
- end
-end
diff --git a/spec/lib/gitlab/email/message/in_product_marketing_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing_spec.rb
index 594df7440bb..40351bef8b9 100644
--- a/spec/lib/gitlab/email/message/in_product_marketing_spec.rb
+++ b/spec/lib/gitlab/email/message/in_product_marketing_spec.rb
@@ -18,7 +18,6 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing do
:trial | described_class::Trial
:team | described_class::Team
:experience | described_class::Experience
- :invite_team | described_class::InviteTeam
end
with_them do
diff --git a/spec/lib/gitlab/encoding_helper_spec.rb b/spec/lib/gitlab/encoding_helper_spec.rb
index 98170ef437c..4c1fbb93c13 100644
--- a/spec/lib/gitlab/encoding_helper_spec.rb
+++ b/spec/lib/gitlab/encoding_helper_spec.rb
@@ -265,4 +265,14 @@ RSpec.describe Gitlab::EncodingHelper do
end
end
end
+
+ describe '#unquote_path' do
+ it do
+ expect(described_class.unquote_path('unquoted')).to eq('unquoted')
+ expect(described_class.unquote_path('"quoted"')).to eq('quoted')
+ expect(described_class.unquote_path('"\\311\\240\\304\\253\\305\\247\\305\\200\\310\\247\\306\\200"')).to eq('ɠīŧŀȧƀ')
+ expect(described_class.unquote_path('"\\\\303\\\\251"')).to eq('\303\251')
+ expect(described_class.unquote_path('"\a\b\e\f\n\r\t\v\""')).to eq("\a\b\e\f\n\r\t\v\"")
+ end
+ end
end
diff --git a/spec/lib/gitlab/gfm/uploads_rewriter_spec.rb b/spec/lib/gitlab/gfm/uploads_rewriter_spec.rb
index 5b78acc3b1d..f878f02f410 100644
--- a/spec/lib/gitlab/gfm/uploads_rewriter_spec.rb
+++ b/spec/lib/gitlab/gfm/uploads_rewriter_spec.rb
@@ -67,7 +67,7 @@ RSpec.describe Gitlab::Gfm::UploadsRewriter do
it 'does not rewrite plain links as embedded' do
embedded_link = image_uploader.markdown_link
- plain_image_link = embedded_link.sub(/\A!/, "")
+ plain_image_link = embedded_link.delete_prefix('!')
text = "#{plain_image_link} and #{embedded_link}"
moved_text = described_class.new(text, old_project, user).rewrite(new_project)
diff --git a/spec/lib/gitlab/git/blame_spec.rb b/spec/lib/gitlab/git/blame_spec.rb
index 495cb16ebab..7dd7460b142 100644
--- a/spec/lib/gitlab/git/blame_spec.rb
+++ b/spec/lib/gitlab/git/blame_spec.rb
@@ -4,71 +4,81 @@ require "spec_helper"
RSpec.describe Gitlab::Git::Blame, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '', 'group/project') }
- let(:blame) do
- Gitlab::Git::Blame.new(repository, SeedRepo::Commit::ID, "CONTRIBUTING.md")
+
+ let(:sha) { SeedRepo::Commit::ID }
+ let(:path) { 'CONTRIBUTING.md' }
+ let(:range) { nil }
+
+ subject(:blame) { Gitlab::Git::Blame.new(repository, sha, path, range: range) }
+
+ let(:result) do
+ [].tap do |data|
+ blame.each do |commit, line, previous_path|
+ data << { commit: commit, line: line, previous_path: previous_path }
+ end
+ end
end
describe 'blaming a file' do
- context "each count" do
- it do
- data = []
- blame.each do |commit, line|
- data << {
- commit: commit,
- line: line
- }
- end
+ it 'has the right number of lines' do
+ expect(result.size).to eq(95)
+ expect(result.first[:commit]).to be_kind_of(Gitlab::Git::Commit)
+ expect(result.first[:line]).to eq("# Contribute to GitLab")
+ expect(result.first[:line]).to be_utf8
+ end
- expect(data.size).to eq(95)
- expect(data.first[:commit]).to be_kind_of(Gitlab::Git::Commit)
- expect(data.first[:line]).to eq("# Contribute to GitLab")
- expect(data.first[:line]).to be_utf8
+ context 'blaming a range' do
+ let(:range) { 2..4 }
+
+ it 'only returns the range' do
+ expect(result.size).to eq(range.size)
+ expect(result.map {|r| r[:line] }).to eq(['', 'This guide details how contribute to GitLab.', ''])
end
end
context "ISO-8859 encoding" do
- let(:blame) do
- Gitlab::Git::Blame.new(repository, SeedRepo::EncodingCommit::ID, "encoding/iso8859.txt")
- end
+ let(:sha) { SeedRepo::EncodingCommit::ID }
+ let(:path) { 'encoding/iso8859.txt' }
it 'converts to UTF-8' do
- data = []
- blame.each do |commit, line|
- data << {
- commit: commit,
- line: line
- }
- end
-
- expect(data.size).to eq(1)
- expect(data.first[:commit]).to be_kind_of(Gitlab::Git::Commit)
- expect(data.first[:line]).to eq("Ä ü")
- expect(data.first[:line]).to be_utf8
+ expect(result.size).to eq(1)
+ expect(result.first[:commit]).to be_kind_of(Gitlab::Git::Commit)
+ expect(result.first[:line]).to eq("Ä ü")
+ expect(result.first[:line]).to be_utf8
end
end
context "unknown encoding" do
- let(:blame) do
- Gitlab::Git::Blame.new(repository, SeedRepo::EncodingCommit::ID, "encoding/iso8859.txt")
- end
+ let(:sha) { SeedRepo::EncodingCommit::ID }
+ let(:path) { 'encoding/iso8859.txt' }
it 'converts to UTF-8' do
expect_next_instance_of(CharlockHolmes::EncodingDetector) do |detector|
expect(detector).to receive(:detect).and_return(nil)
end
- data = []
- blame.each do |commit, line|
- data << {
- commit: commit,
- line: line
- }
- end
+ expect(result.size).to eq(1)
+ expect(result.first[:commit]).to be_kind_of(Gitlab::Git::Commit)
+ expect(result.first[:line]).to eq(" ")
+ expect(result.first[:line]).to be_utf8
+ end
+ end
+
+ context "renamed file" do
+ let(:project) { create(:project, :repository) }
+ let(:repository) { project.repository.raw_repository }
+ let(:commit) { project.commit('blame-on-renamed') }
+ let(:sha) { commit.id }
+ let(:path) { 'files/plain_text/renamed' }
+
+ it 'includes the previous path' do
+ expect(result.size).to eq(5)
- expect(data.size).to eq(1)
- expect(data.first[:commit]).to be_kind_of(Gitlab::Git::Commit)
- expect(data.first[:line]).to eq(" ")
- expect(data.first[:line]).to be_utf8
+ expect(result[0]).to include(line: 'Initial commit', previous_path: nil)
+ expect(result[1]).to include(line: 'Initial commit', previous_path: nil)
+ expect(result[2]).to include(line: 'Renamed as "filename"', previous_path: 'files/plain_text/initial-commit')
+ expect(result[3]).to include(line: 'Renamed as renamed', previous_path: 'files/plain_text/"filename"')
+ expect(result[4]).to include(line: 'Last edit, no rename', previous_path: path)
end
end
end
diff --git a/spec/lib/gitlab/git/diff_spec.rb b/spec/lib/gitlab/git/diff_spec.rb
index 17bb83d0f2f..46f544797bb 100644
--- a/spec/lib/gitlab/git/diff_spec.rb
+++ b/spec/lib/gitlab/git/diff_spec.rb
@@ -161,6 +161,52 @@ EOT
expect(diff).not_to have_binary_notice
end
end
+
+ context 'when diff contains invalid characters' do
+ let(:bad_string) { [0xae].pack("C*") }
+ let(:bad_string_two) { [0x89].pack("C*") }
+
+ let(:diff) { described_class.new(@raw_diff_hash.merge({ diff: bad_string })) }
+ let(:diff_two) { described_class.new(@raw_diff_hash.merge({ diff: bad_string_two })) }
+
+ context 'when replace_invalid_utf8_chars is true' do
+ it 'will convert invalid characters and not cause an encoding error' do
+ expect(diff.diff).to include(Gitlab::EncodingHelper::UNICODE_REPLACEMENT_CHARACTER)
+ expect(diff_two.diff).to include(Gitlab::EncodingHelper::UNICODE_REPLACEMENT_CHARACTER)
+
+ expect { Oj.dump(diff) }.not_to raise_error(EncodingError)
+ expect { Oj.dump(diff_two) }.not_to raise_error(EncodingError)
+ end
+
+ context 'when the diff is binary' do
+ let(:project) { create(:project, :repository) }
+
+ it 'will not try to replace characters' do
+ expect(Gitlab::EncodingHelper).not_to receive(:encode_utf8_with_replacement_character?)
+ expect(binary_diff(project).diff).not_to be_empty
+ end
+ end
+
+ context 'when convert_diff_to_utf8_with_replacement_symbol feature flag is disabled' do
+ before do
+ stub_feature_flags(convert_diff_to_utf8_with_replacement_symbol: false)
+ end
+
+ it 'will not try to convert invalid characters' do
+ expect(Gitlab::EncodingHelper).not_to receive(:encode_utf8_with_replacement_character?)
+ end
+ end
+ end
+
+ context 'when replace_invalid_utf8_chars is false' do
+ let(:not_replaced_diff) { described_class.new(@raw_diff_hash.merge({ diff: bad_string, replace_invalid_utf8_chars: false }) ) }
+ let(:not_replaced_diff_two) { described_class.new(@raw_diff_hash.merge({ diff: bad_string_two, replace_invalid_utf8_chars: false }) ) }
+
+ it 'will not try to convert invalid characters' do
+ expect(Gitlab::EncodingHelper).not_to receive(:encode_utf8_with_replacement_character?)
+ end
+ end
+ end
end
describe 'straight diffs' do
@@ -255,12 +301,11 @@ EOT
let(:project) { create(:project, :repository) }
it 'fake binary message when it detects binary' do
- # Rugged will not detect this as binary, but we can fake it
diff_message = "Binary files files/images/icn-time-tracking.pdf and files/images/icn-time-tracking.pdf differ\n"
- binary_diff = described_class.between(project.repository, 'add-pdf-text-binary', 'add-pdf-text-binary^').first
- expect(binary_diff.diff).not_to be_empty
- expect(binary_diff.json_safe_diff).to eq(diff_message)
+ diff = binary_diff(project)
+ expect(diff.diff).not_to be_empty
+ expect(diff.json_safe_diff).to eq(diff_message)
end
it 'leave non-binary diffs as-is' do
@@ -374,4 +419,9 @@ EOT
expect(diff.line_count).to eq(0)
end
end
+
+ def binary_diff(project)
+ # rugged will not detect this as binary, but we can fake it
+ described_class.between(project.repository, 'add-pdf-text-binary', 'add-pdf-text-binary^').first
+ end
end
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index ae6ca728573..47688c4b3e6 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -2448,7 +2448,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
it 'delegates to Gitaly' do
expect_next_instance_of(Gitlab::GitalyClient::RepositoryService) do |svc|
- expect(svc).to receive(:import_repository).with(url).and_return(nil)
+ expect(svc).to receive(:import_repository).with(url, http_authorization_header: '', mirror: false).and_return(nil)
end
repository.import_repository(url)
diff --git a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
index 8d9ab5db886..50a0f20e775 100644
--- a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
@@ -563,4 +563,39 @@ RSpec.describe Gitlab::GitalyClient::CommitService do
expect(response).not_to have_key 'nonexistent'
end
end
+
+ describe '#raw_blame' do
+ let(:project) { create(:project, :test_repo) }
+ let(:revision) { 'blame-on-renamed' }
+ let(:path) { 'files/plain_text/renamed' }
+
+ let(:blame_headers) do
+ [
+ '405a45736a75e439bb059e638afaa9a3c2eeda79 1 1 2',
+ '405a45736a75e439bb059e638afaa9a3c2eeda79 2 2',
+ 'bed1d1610ebab382830ee888288bf939c43873bb 3 3 1',
+ '3685515c40444faf92774e72835e1f9c0e809672 4 4 1',
+ '32c33da59f8a1a9f90bdeda570337888b00b244d 5 5 1'
+ ]
+ end
+
+ subject(:blame) { client.raw_blame(revision, path, range: range).split("\n") }
+
+ context 'without a range' do
+ let(:range) { nil }
+
+ it 'blames a whole file' do
+ is_expected.to include(*blame_headers)
+ end
+ end
+
+ context 'with a range' do
+ let(:range) { '3,4' }
+
+ it 'blames part of a file' do
+ is_expected.to include(blame_headers[2], blame_headers[3])
+ is_expected.not_to include(blame_headers[0], blame_headers[1], blame_headers[4])
+ end
+ end
+ end
end
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 1c7b35ed928..6eb92cdeab9 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
@@ -98,9 +98,9 @@ RSpec.describe Gitlab::GithubImport::Importer::DiffNotesImporter do
.to receive(:each_object_to_import)
.and_yield(github_comment)
- expect(Gitlab::GithubImport::ImportDiffNoteWorker)
- .to receive(:perform_async)
- .with(project.id, an_instance_of(Hash), an_instance_of(String))
+ expect(Gitlab::GithubImport::ImportDiffNoteWorker).to receive(:bulk_perform_in).with(1.second, [
+ [project.id, an_instance_of(Hash), an_instance_of(String)]
+ ], batch_size: 1000, batch_delay: 1.minute)
waiter = importer.parallel_import
diff --git a/spec/lib/gitlab/github_import/importer/issues_importer_spec.rb b/spec/lib/gitlab/github_import/importer/issues_importer_spec.rb
index 2c2b6a2aff0..6b807bdf098 100644
--- a/spec/lib/gitlab/github_import/importer/issues_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/issues_importer_spec.rb
@@ -91,9 +91,9 @@ RSpec.describe Gitlab::GithubImport::Importer::IssuesImporter do
.to receive(:each_object_to_import)
.and_yield(github_issue)
- expect(Gitlab::GithubImport::ImportIssueWorker)
- .to receive(:perform_async)
- .with(project.id, an_instance_of(Hash), an_instance_of(String))
+ expect(Gitlab::GithubImport::ImportIssueWorker).to receive(:bulk_perform_in).with(1.second, [
+ [project.id, an_instance_of(Hash), an_instance_of(String)]
+ ], batch_size: 1000, batch_delay: 1.minute)
waiter = importer.parallel_import
diff --git a/spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb b/spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb
index a2c7d51214a..6dfd4424342 100644
--- a/spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb
@@ -118,9 +118,9 @@ RSpec.describe Gitlab::GithubImport::Importer::LfsObjectsImporter do
expect(service).to receive(:execute).and_return([lfs_download_object])
end
- expect(Gitlab::GithubImport::ImportLfsObjectWorker)
- .to receive(:perform_async)
- .with(project.id, an_instance_of(Hash), an_instance_of(String))
+ expect(Gitlab::GithubImport::ImportLfsObjectWorker).to receive(:bulk_perform_in).with(1.second, [
+ [project.id, an_instance_of(Hash), an_instance_of(String)]
+ ], batch_size: 1000, batch_delay: 1.minute)
waiter = importer.parallel_import
diff --git a/spec/lib/gitlab/github_import/importer/notes_importer_spec.rb b/spec/lib/gitlab/github_import/importer/notes_importer_spec.rb
index 3782dab5ee3..3b4fe652da8 100644
--- a/spec/lib/gitlab/github_import/importer/notes_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/notes_importer_spec.rb
@@ -84,9 +84,9 @@ RSpec.describe Gitlab::GithubImport::Importer::NotesImporter do
.to receive(:each_object_to_import)
.and_yield(github_comment)
- expect(Gitlab::GithubImport::ImportNoteWorker)
- .to receive(:perform_async)
- .with(project.id, an_instance_of(Hash), an_instance_of(String))
+ expect(Gitlab::GithubImport::ImportNoteWorker).to receive(:bulk_perform_in).with(1.second, [
+ [project.id, an_instance_of(Hash), an_instance_of(String)]
+ ], batch_size: 1000, batch_delay: 1.minute)
waiter = importer.parallel_import
diff --git a/spec/lib/gitlab/github_import/object_counter_spec.rb b/spec/lib/gitlab/github_import/object_counter_spec.rb
index c9e4ac67061..e522f74416c 100644
--- a/spec/lib/gitlab/github_import/object_counter_spec.rb
+++ b/spec/lib/gitlab/github_import/object_counter_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::GithubImport::ObjectCounter, :clean_gitlab_redis_cache do
- let_it_be(:project) { create(:project) }
+ let_it_be(:project) { create(:project, :import_started, import_type: 'github') }
it 'validates the operation being incremented' do
expect { described_class.increment(project, :issue, :unknown) }
@@ -49,4 +49,12 @@ RSpec.describe Gitlab::GithubImport::ObjectCounter, :clean_gitlab_redis_cache do
'imported' => {}
})
end
+
+ it 'expires etag cache of relevant realtime change endpoints on increment' do
+ expect_next_instance_of(Gitlab::EtagCaching::Store) do |instance|
+ expect(instance).to receive(:touch).with(Gitlab::Routing.url_helpers.realtime_changes_import_github_path(format: :json))
+ end
+
+ described_class.increment(project, :issue, :fetched)
+ end
end
diff --git a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
index 6a19afbc60d..200898f8f03 100644
--- a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
+++ b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
@@ -22,10 +22,6 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
def collection_method
:issues
end
-
- def parallel_import_batch
- { size: 10, delay: 1.minute }
- end
end
end
@@ -261,7 +257,7 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
let(:repr_class) { double(:representation) }
let(:worker_class) { double(:worker) }
let(:object) { double(:object) }
- let(:batch_size) { 200 }
+ let(:batch_size) { 1000 }
let(:batch_delay) { 1.minute }
before do
@@ -281,7 +277,6 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
context 'with multiple objects' do
before do
- allow(importer).to receive(:parallel_import_batch) { { size: batch_size, delay: batch_delay } }
expect(importer).to receive(:each_object_to_import).and_yield(object).and_yield(object).and_yield(object)
end
@@ -296,9 +291,9 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
end
end
- context 'when FF is disabled' do
+ context 'when distribute_github_parallel_import feature flag is disabled' do
before do
- stub_feature_flags(spread_parallel_import: false)
+ stub_feature_flags(distribute_github_parallel_import: false)
end
it 'imports data in parallel' do
diff --git a/spec/lib/gitlab/gon_helper_spec.rb b/spec/lib/gitlab/gon_helper_spec.rb
index 047873d8237..28cb9125af1 100644
--- a/spec/lib/gitlab/gon_helper_spec.rb
+++ b/spec/lib/gitlab/gon_helper_spec.rb
@@ -64,6 +64,34 @@ RSpec.describe Gitlab::GonHelper do
end
end
+ describe '#push_force_frontend_feature_flag' do
+ let(:gon) { class_double('Gon') }
+
+ before do
+ skip_feature_flags_yaml_validation
+
+ allow(helper)
+ .to receive(:gon)
+ .and_return(gon)
+ end
+
+ it 'pushes a feature flag to the frontend with the provided value' do
+ expect(gon)
+ .to receive(:push)
+ .with({ features: { 'myFeatureFlag' => true } }, true)
+
+ helper.push_force_frontend_feature_flag(:my_feature_flag, true)
+ end
+
+ it 'pushes a disabled feature flag if provided value is nil' do
+ expect(gon)
+ .to receive(:push)
+ .with({ features: { 'myFeatureFlag' => false } }, true)
+
+ helper.push_force_frontend_feature_flag(:my_feature_flag, nil)
+ end
+ end
+
describe '#default_avatar_url' do
it 'returns an absolute URL' do
url = helper.default_avatar_url
diff --git a/spec/lib/gitlab/graphql/known_operations_spec.rb b/spec/lib/gitlab/graphql/known_operations_spec.rb
index 411c0876f82..3ebfefbb43c 100644
--- a/spec/lib/gitlab/graphql/known_operations_spec.rb
+++ b/spec/lib/gitlab/graphql/known_operations_spec.rb
@@ -19,7 +19,7 @@ RSpec.describe Gitlab::Graphql::KnownOperations do
describe "#from_query" do
where(:query_string, :expected) do
- "query { helloWorld }" | described_class::ANONYMOUS
+ "query { helloWorld }" | described_class::UNKNOWN
"query fuzzyyy { helloWorld }" | described_class::UNKNOWN
"query foo { helloWorld }" | described_class::Operation.new("foo")
end
@@ -35,13 +35,13 @@ RSpec.describe Gitlab::Graphql::KnownOperations do
describe "#operations" do
it "returns array of known operations" do
- expect(subject.operations.map(&:name)).to match_array(%w(anonymous unknown foo bar))
+ expect(subject.operations.map(&:name)).to match_array(%w(unknown foo bar))
end
end
describe "Operation#to_caller_id" do
where(:query_string, :expected) do
- "query { helloWorld }" | "graphql:#{described_class::ANONYMOUS.name}"
+ "query { helloWorld }" | "graphql:#{described_class::UNKNOWN.name}"
"query foo { helloWorld }" | "graphql:foo"
end
diff --git a/spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb b/spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb
new file mode 100644
index 00000000000..320c6b52308
--- /dev/null
+++ b/spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb
@@ -0,0 +1,135 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Graphql::Pagination::ActiveRecordArrayConnection do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:items) { create_list(:package_build_info, 3) }
+
+ let_it_be(:context) do
+ GraphQL::Query::Context.new(
+ query: GraphQL::Query.new(GitlabSchema, document: nil, context: {}, variables: {}),
+ values: {},
+ object: nil
+ )
+ end
+
+ let(:first) { nil }
+ let(:last) { nil }
+ let(:after) { nil }
+ let(:before) { nil }
+ let(:max_page_size) { nil }
+
+ let(:connection) do
+ described_class.new(
+ items,
+ context: context,
+ first: first,
+ last: last,
+ after: after,
+ before: before,
+ max_page_size: max_page_size
+ )
+ end
+
+ it_behaves_like 'a connection with collection methods'
+
+ it_behaves_like 'a redactable connection' do
+ let(:unwanted) { items[1] }
+ end
+
+ describe '#nodes' do
+ subject { connection.nodes }
+
+ it { is_expected.to match_array(items) }
+
+ context 'with first set' do
+ let(:first) { 2 }
+
+ it { is_expected.to match_array([items[0], items[1]]) }
+ end
+
+ context 'with last set' do
+ let(:last) { 2 }
+
+ it { is_expected.to match_array([items[1], items[2]]) }
+ end
+ end
+
+ describe '#next_page?' do
+ subject { connection.next_page? }
+
+ where(:before, :first, :max_page_size, :result) do
+ nil | nil | nil | false
+ 1 | nil | nil | true
+ nil | 1 | nil | true
+ nil | 10 | nil | false
+ nil | 1 | 1 | true
+ nil | 1 | 10 | true
+ nil | 10 | 10 | false
+ end
+
+ with_them do
+ it { is_expected.to eq(result) }
+ end
+ end
+
+ describe '#previous_page?' do
+ subject { connection.previous_page? }
+
+ where(:after, :last, :max_page_size, :result) do
+ nil | nil | nil | false
+ 1 | nil | nil | true
+ nil | 1 | nil | true
+ nil | 10 | nil | false
+ nil | 1 | 1 | true
+ nil | 1 | 10 | true
+ nil | 10 | 10 | false
+ end
+
+ with_them do
+ it { is_expected.to eq(result) }
+ end
+ end
+
+ describe '#cursor_for' do
+ let(:item) { items[0] }
+ let(:expected_result) do
+ GitlabSchema.cursor_encoder.encode(
+ Gitlab::Json.dump(id: item.id.to_s),
+ nonce: true
+ )
+ end
+
+ subject { connection.cursor_for(item) }
+
+ it { is_expected.to eq(expected_result) }
+
+ context 'with a BatchLoader::GraphQL item' do
+ let_it_be(:user) { create(:user) }
+
+ let(:item) { ::Gitlab::Graphql::Loaders::BatchModelLoader.new(::User, user.id).find }
+ let(:expected_result) do
+ GitlabSchema.cursor_encoder.encode(
+ Gitlab::Json.dump(id: user.id.to_s),
+ nonce: true
+ )
+ end
+
+ it { is_expected.to eq(expected_result) }
+ end
+ end
+
+ describe '#dup' do
+ subject { connection.dup }
+
+ it 'properly handles items duplication' do
+ connection2 = subject
+
+ connection2 << create(:package_build_info)
+
+ expect(connection.items).not_to eq(connection2.items)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb
index 0741088c915..86e7d4e344c 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb
@@ -19,8 +19,8 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'last_repository_check_at',
column_expression: Project.arel_table[:last_repository_check_at],
- order_expression: Gitlab::Database.nulls_last_order('last_repository_check_at', :asc),
- reversed_order_expression: Gitlab::Database.nulls_last_order('last_repository_check_at', :desc),
+ order_expression: Project.arel_table[:last_repository_check_at].asc.nulls_last,
+ reversed_order_expression: Project.arel_table[:last_repository_check_at].desc.nulls_last,
order_direction: :asc,
nullable: :nulls_last,
distinct: false)
@@ -30,8 +30,8 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'last_repository_check_at',
column_expression: Project.arel_table[:last_repository_check_at],
- order_expression: Gitlab::Database.nulls_last_order('last_repository_check_at', :desc),
- reversed_order_expression: Gitlab::Database.nulls_last_order('last_repository_check_at', :asc),
+ order_expression: Project.arel_table[:last_repository_check_at].desc.nulls_last,
+ reversed_order_expression: Project.arel_table[:last_repository_check_at].asc.nulls_last,
order_direction: :desc,
nullable: :nulls_last,
distinct: false)
@@ -256,11 +256,6 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
end
end
- # rubocop: disable RSpec/EmptyExampleGroup
- context 'when ordering uses LOWER' do
- end
- # rubocop: enable RSpec/EmptyExampleGroup
-
context 'when ordering by similarity' do
let_it_be(:project1) { create(:project, name: 'test') }
let_it_be(:project2) { create(:project, name: 'testing') }
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
index b511a294f97..f31ec6c09fd 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
@@ -77,6 +77,17 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
expect(decoded_cursor(cursor)).to eq('id' => project.id.to_s)
end
+ context 'when SimpleOrderBuilder cannot build keyset paginated query' do
+ it 'increments the `old_keyset_pagination_usage` counter', :prometheus do
+ expect(Gitlab::Pagination::Keyset::SimpleOrderBuilder).to receive(:build).and_return([false, nil])
+
+ decoded_cursor(cursor)
+
+ counter = Gitlab::Metrics.registry.get(:old_keyset_pagination_usage)
+ expect(counter.get(model: 'Project')).to eq(1)
+ end
+ end
+
context 'when an order is specified' do
let(:nodes) { Project.order(:updated_at) }
@@ -222,91 +233,97 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
end
end
- context 'when multiple orders with nil values are defined' do
- let!(:project1) { create(:project, last_repository_check_at: 10.days.ago) } # Asc: project5 Desc: project3
- let!(:project2) { create(:project, last_repository_check_at: nil) } # Asc: project1 Desc: project1
- let!(:project3) { create(:project, last_repository_check_at: 5.days.ago) } # Asc: project3 Desc: project5
- let!(:project4) { create(:project, last_repository_check_at: nil) } # Asc: project2 Desc: project2
- let!(:project5) { create(:project, last_repository_check_at: 20.days.ago) } # Asc: project4 Desc: project4
+ context 'when ordering uses LOWER' do
+ let!(:project1) { create(:project, name: 'A') } # Asc: project1 Desc: project4
+ let!(:project2) { create(:project, name: 'c') } # Asc: project5 Desc: project2
+ let!(:project3) { create(:project, name: 'b') } # Asc: project3 Desc: project3
+ let!(:project4) { create(:project, name: 'd') } # Asc: project2 Desc: project5
+ let!(:project5) { create(:project, name: 'a') } # Asc: project4 Desc: project1
context 'when ascending' do
let(:nodes) do
- Project.order(Arel.sql('projects.last_repository_check_at IS NULL')).order(last_repository_check_at: :asc).order(id: :asc)
+ Project.order(Arel::Table.new(:projects)['name'].lower.asc).order(id: :asc)
end
- let(:ascending_nodes) { [project5, project1, project3, project2, project4] }
+ let(:ascending_nodes) { [project1, project5, project3, project2, project4] }
it_behaves_like 'nodes are in ascending order'
-
- context 'when before cursor value is NULL' do
- let(:arguments) { { before: encoded_cursor(project4) } }
-
- it 'returns all projects before the cursor' do
- expect(subject.sliced_nodes).to eq([project5, project1, project3, project2])
- end
- end
-
- context 'when after cursor value is NULL' do
- let(:arguments) { { after: encoded_cursor(project2) } }
-
- it 'returns all projects after the cursor' do
- expect(subject.sliced_nodes).to eq([project4])
- end
- end
end
context 'when descending' do
let(:nodes) do
- Project.order(Arel.sql('projects.last_repository_check_at IS NULL')).order(last_repository_check_at: :desc).order(id: :asc)
+ Project.order(Arel::Table.new(:projects)['name'].lower.desc).order(id: :desc)
end
- let(:descending_nodes) { [project3, project1, project5, project2, project4] }
+ let(:descending_nodes) { [project4, project2, project3, project5, project1] }
it_behaves_like 'nodes are in descending order'
+ end
+ end
- context 'when before cursor value is NULL' do
- let(:arguments) { { before: encoded_cursor(project4) } }
+ context 'NULLS order' do
+ using RSpec::Parameterized::TableSyntax
- it 'returns all projects before the cursor' do
- expect(subject.sliced_nodes).to eq([project3, project1, project5, project2])
- end
- end
+ let_it_be(:issue1) { create(:issue, relative_position: nil) }
+ let_it_be(:issue2) { create(:issue, relative_position: 100) }
+ let_it_be(:issue3) { create(:issue, relative_position: 200) }
+ let_it_be(:issue4) { create(:issue, relative_position: nil) }
+ let_it_be(:issue5) { create(:issue, relative_position: 300) }
+
+ context 'when ascending NULLS LAST (ties broken by id DESC implicitly)' do
+ let(:ascending_nodes) { [issue2, issue3, issue5, issue4, issue1] }
- context 'when after cursor value is NULL' do
- let(:arguments) { { after: encoded_cursor(project2) } }
+ where(:nodes) do
+ [
+ lazy { Issue.order(Issue.arel_table[:relative_position].asc.nulls_last) }
+ ]
+ end
- it 'returns all projects after the cursor' do
- expect(subject.sliced_nodes).to eq([project4])
- end
+ with_them do
+ it_behaves_like 'nodes are in ascending order'
end
end
- end
- context 'when ordering uses LOWER' do
- let!(:project1) { create(:project, name: 'A') } # Asc: project1 Desc: project4
- let!(:project2) { create(:project, name: 'c') } # Asc: project5 Desc: project2
- let!(:project3) { create(:project, name: 'b') } # Asc: project3 Desc: project3
- let!(:project4) { create(:project, name: 'd') } # Asc: project2 Desc: project5
- let!(:project5) { create(:project, name: 'a') } # Asc: project4 Desc: project1
+ context 'when descending NULLS LAST (ties broken by id DESC implicitly)' do
+ let(:descending_nodes) { [issue5, issue3, issue2, issue4, issue1] }
- context 'when ascending' do
- let(:nodes) do
- Project.order(Arel::Table.new(:projects)['name'].lower.asc).order(id: :asc)
+ where(:nodes) do
+ [
+ lazy { Issue.order(Issue.arel_table[:relative_position].desc.nulls_last) }
+]
end
- let(:ascending_nodes) { [project1, project5, project3, project2, project4] }
-
- it_behaves_like 'nodes are in ascending order'
+ with_them do
+ it_behaves_like 'nodes are in descending order'
+ end
end
- context 'when descending' do
- let(:nodes) do
- Project.order(Arel::Table.new(:projects)['name'].lower.desc).order(id: :desc)
+ context 'when ascending NULLS FIRST with a tie breaker' do
+ let(:ascending_nodes) { [issue1, issue4, issue2, issue3, issue5] }
+
+ where(:nodes) do
+ [
+ lazy { Issue.order(Issue.arel_table[:relative_position].asc.nulls_first).order(id: :asc) }
+]
end
- let(:descending_nodes) { [project4, project2, project3, project5, project1] }
+ with_them do
+ it_behaves_like 'nodes are in ascending order'
+ end
+ end
- it_behaves_like 'nodes are in descending order'
+ context 'when descending NULLS FIRST with a tie breaker' do
+ let(:descending_nodes) { [issue1, issue4, issue5, issue3, issue2] }
+
+ where(:nodes) do
+ [
+ lazy { Issue.order(Issue.arel_table[:relative_position].desc.nulls_first).order(id: :asc) }
+]
+ end
+
+ with_them do
+ it_behaves_like 'nodes are in descending order'
+ end
end
end
diff --git a/spec/lib/gitlab/hook_data/issuable_builder_spec.rb b/spec/lib/gitlab/hook_data/issuable_builder_spec.rb
index f5ee8eba8bc..676396697fb 100644
--- a/spec/lib/gitlab/hook_data/issuable_builder_spec.rb
+++ b/spec/lib/gitlab/hook_data/issuable_builder_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Gitlab::HookData::IssuableBuilder do
let_it_be(:user) { create(:user) }
# This shared example requires a `builder` and `user` variable
- shared_examples 'issuable hook data' do |kind|
+ shared_examples 'issuable hook data' do |kind, hook_data_issuable_builder_class|
let(:data) { builder.build(user: user) }
include_examples 'project hook data' do
@@ -20,7 +20,7 @@ RSpec.describe Gitlab::HookData::IssuableBuilder do
expect(data[:object_kind]).to eq(kind)
expect(data[:user]).to eq(user.hook_attrs)
expect(data[:project]).to eq(builder.issuable.project.hook_attrs)
- expect(data[:object_attributes]).to eq(builder.issuable.hook_attrs)
+ expect(data[:object_attributes]).to eq(hook_data_issuable_builder_class.new(issuable).build)
expect(data[:changes]).to eq({})
expect(data[:repository]).to eq(builder.issuable.project.hook_attrs.slice(:name, :url, :description, :homepage))
end
@@ -95,12 +95,12 @@ RSpec.describe Gitlab::HookData::IssuableBuilder do
end
describe '#build' do
- it_behaves_like 'issuable hook data', 'issue' do
+ it_behaves_like 'issuable hook data', 'issue', Gitlab::HookData::IssueBuilder do
let(:issuable) { create(:issue, description: 'A description') }
let(:builder) { described_class.new(issuable) }
end
- it_behaves_like 'issuable hook data', 'merge_request' do
+ it_behaves_like 'issuable hook data', 'merge_request', Gitlab::HookData::MergeRequestBuilder do
let(:issuable) { create(:merge_request, description: 'A description') }
let(:builder) { described_class.new(issuable) }
end
diff --git a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
index ddd681f75f0..771fc0218e2 100644
--- a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
+++ b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
@@ -62,6 +62,7 @@ RSpec.describe Gitlab::HookData::MergeRequestBuilder do
expect(data).to include(:human_time_estimate)
expect(data).to include(:human_total_time_spent)
expect(data).to include(:human_time_change)
+ expect(data).to include(:labels)
end
context 'when the MR has an image in the description' do
diff --git a/spec/lib/gitlab/http_connection_adapter_spec.rb b/spec/lib/gitlab/http_connection_adapter_spec.rb
index e9e517f1fe6..cde8376febd 100644
--- a/spec/lib/gitlab/http_connection_adapter_spec.rb
+++ b/spec/lib/gitlab/http_connection_adapter_spec.rb
@@ -27,16 +27,6 @@ RSpec.describe Gitlab::HTTPConnectionAdapter do
end
end
- context 'with header_read_timeout_buffered_io feature disabled' do
- before do
- stub_feature_flags(header_read_timeout_buffered_io: false)
- end
-
- it 'uses the regular Net::HTTP class' do
- expect(connection).to be_a(Net::HTTP)
- end
- end
-
context 'when local requests are allowed' do
let(:options) { { allow_local_requests: true } }
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index 29a19e4cafd..730f9035293 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -665,6 +665,7 @@ protected_environments:
- project
- group
- deploy_access_levels
+- approval_rules
deploy_access_levels:
- protected_environment
- user
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 59d97357045..f47f1ab58a8 100644
--- a/spec/lib/gitlab/import_export/command_line_util_spec.rb
+++ b/spec/lib/gitlab/import_export/command_line_util_spec.rb
@@ -114,7 +114,7 @@ RSpec.describe Gitlab::ImportExport::CommandLineUtil do
end
end
- %w[MOVED_PERMANENTLY FOUND TEMPORARY_REDIRECT].each do |code|
+ %w[MOVED_PERMANENTLY FOUND SEE_OTHER TEMPORARY_REDIRECT].each do |code|
context "with a redirect status code #{code}" do
let(:status) { HTTP::Status.const_get(code, false) }
diff --git a/spec/lib/gitlab/import_export/duration_measuring_spec.rb b/spec/lib/gitlab/import_export/duration_measuring_spec.rb
new file mode 100644
index 00000000000..cf8b6060741
--- /dev/null
+++ b/spec/lib/gitlab/import_export/duration_measuring_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::ImportExport::DurationMeasuring do
+ subject do
+ Class.new do
+ include Gitlab::ImportExport::DurationMeasuring
+
+ def test
+ with_duration_measuring do
+ 'test'
+ end
+ end
+ end.new
+ end
+
+ it 'measures method execution duration' do
+ subject.test
+
+ expect(subject.duration_s).not_to be_nil
+ end
+
+ describe '#with_duration_measuring' do
+ it 'yields control' do
+ expect { |block| subject.with_duration_measuring(&block) }.to yield_control
+ end
+
+ it 'returns result of the yielded block' do
+ return_value = 'return_value'
+
+ expect(subject.with_duration_measuring { return_value }).to eq(return_value)
+ 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 ba1cccf87ce..03f522ae490 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.reorder(::Gitlab::Database.nulls_first_order('relative_position', 'DESC')).order(id: :desc).map(&:to_json)
+ expected_issues = exportable.issues.reorder(Issue.arel_table[:relative_position].desc.nulls_first).order(id: :desc).map(&:to_json)
expect(json_writer).to receive(:write_relation_array).with(exportable_path, :issues, expected_issues)
diff --git a/spec/lib/gitlab/import_export/version_checker_spec.rb b/spec/lib/gitlab/import_export/version_checker_spec.rb
index 8b39330656f..9e69e04b17c 100644
--- a/spec/lib/gitlab/import_export/version_checker_spec.rb
+++ b/spec/lib/gitlab/import_export/version_checker_spec.rb
@@ -1,9 +1,10 @@
# frozen_string_literal: true
require 'spec_helper'
-include ImportExport::CommonUtil
RSpec.describe Gitlab::ImportExport::VersionChecker do
+ include ImportExport::CommonUtil
+
let!(:shared) { Gitlab::ImportExport::Shared.new(nil) }
describe 'bundle a project Git repo' do
diff --git a/spec/lib/gitlab/insecure_key_fingerprint_spec.rb b/spec/lib/gitlab/insecure_key_fingerprint_spec.rb
index 2f3489edcd8..3a281574563 100644
--- a/spec/lib/gitlab/insecure_key_fingerprint_spec.rb
+++ b/spec/lib/gitlab/insecure_key_fingerprint_spec.rb
@@ -10,16 +10,9 @@ RSpec.describe Gitlab::InsecureKeyFingerprint do
'Jw0='
end
- let(:fingerprint) { "3f:a2:ee:de:b5:de:53:c3:aa:2f:9c:45:24:4c:47:7b" }
let(:fingerprint_sha256) { "MQHWhS9nhzUezUdD42ytxubZoBKrZLbyBZzxCkmnxXc" }
- describe "#fingerprint" do
- it "generates the key's fingerprint" do
- expect(described_class.new(key.split[1]).fingerprint_md5).to eq(fingerprint)
- end
- end
-
- describe "#fingerprint" do
+ describe '#fingerprint_sha256' do
it "generates the key's fingerprint" do
expect(described_class.new(key.split[1]).fingerprint_sha256).to eq(fingerprint_sha256)
end
diff --git a/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb b/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb
index 02cc2eba4da..68f1c214cef 100644
--- a/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb
+++ b/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::LegacyGithubImport::ProjectCreator do
let(:namespace) { create(:group) }
let(:repo) do
- OpenStruct.new(
+ ActiveSupport::InheritableOptions.new(
login: 'vim',
name: 'vim',
full_name: 'asd/vim',
@@ -21,7 +21,7 @@ RSpec.describe Gitlab::LegacyGithubImport::ProjectCreator do
namespace.add_owner(user)
expect_next_instance_of(Project) do |project|
- expect(project).to receive(:add_import_job)
+ allow(project).to receive(:add_import_job)
end
end
diff --git a/spec/lib/gitlab/metrics/rails_slis_spec.rb b/spec/lib/gitlab/metrics/rails_slis_spec.rb
index 0c77dc9f582..2ba06316507 100644
--- a/spec/lib/gitlab/metrics/rails_slis_spec.rb
+++ b/spec/lib/gitlab/metrics/rails_slis_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Gitlab::Metrics::RailsSlis do
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']])
+ allow(Gitlab::RequestEndpoints).to receive(:all_controller_actions).and_return([[ProjectsController, 'index']])
allow(Gitlab::Graphql::KnownOperations).to receive(:default).and_return(Gitlab::Graphql::KnownOperations.new(%w(foo bar)))
end
@@ -22,13 +22,13 @@ RSpec.describe Gitlab::Metrics::RailsSlis do
request_urgency: :default
},
{
- endpoint_id: "ProjectsController#show",
+ endpoint_id: "ProjectsController#index",
feature_category: :projects,
request_urgency: :default
}
]
- possible_graphql_labels = ['graphql:foo', 'graphql:bar', 'graphql:unknown', 'graphql:anonymous'].map do |endpoint_id|
+ possible_graphql_labels = ['graphql:foo', 'graphql:bar', 'graphql:unknown'].map do |endpoint_id|
{
endpoint_id: endpoint_id,
feature_category: nil,
diff --git a/spec/lib/gitlab/omniauth_initializer_spec.rb b/spec/lib/gitlab/omniauth_initializer_spec.rb
index 8b959cf787f..c91b14a33ba 100644
--- a/spec/lib/gitlab/omniauth_initializer_spec.rb
+++ b/spec/lib/gitlab/omniauth_initializer_spec.rb
@@ -309,4 +309,16 @@ RSpec.describe Gitlab::OmniauthInitializer do
subject.execute([conf])
end
end
+
+ describe '.full_host' do
+ subject { described_class.full_host.call({}) }
+
+ let(:base_url) { 'http://localhost/test' }
+
+ before do
+ allow(Settings).to receive(:gitlab).and_return({ 'base_url' => base_url })
+ end
+
+ it { is_expected.to eq(base_url) }
+ end
end
diff --git a/spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb b/spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb
index 69384e0c501..778244677ef 100644
--- a/spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb
@@ -140,8 +140,8 @@ RSpec.describe Gitlab::Pagination::Keyset::ColumnOrderDefinition do
described_class.new(
attribute_name: :name,
column_expression: Project.arel_table[:name],
- order_expression: Gitlab::Database.nulls_last_order('merge_request_metrics.merged_at', :desc),
- reversed_order_expression: Gitlab::Database.nulls_first_order('merge_request_metrics.merged_at', :asc),
+ order_expression: MergeRequest::Metrics.arel_table[:merged_at].desc.nulls_last,
+ reversed_order_expression: MergeRequest::Metrics.arel_table[:merged_at].asc.nulls_first,
order_direction: :desc,
nullable: :nulls_last, # null values are always last
distinct: false
@@ -161,8 +161,8 @@ RSpec.describe Gitlab::Pagination::Keyset::ColumnOrderDefinition do
described_class.new(
attribute_name: :name,
column_expression: Project.arel_table[:name],
- order_expression: Gitlab::Database.nulls_last_order('merge_request_metrics.merged_at', :desc),
- reversed_order_expression: Gitlab::Database.nulls_first_order('merge_request_metrics.merged_at', :asc),
+ order_expression: MergeRequest::Metrics.arel_table[:merged_at].desc.nulls_last,
+ reversed_order_expression: MergeRequest::Metrics.arel_table[:merged_at].asc.nulls_first,
order_direction: :desc,
nullable: true,
distinct: false
@@ -175,8 +175,8 @@ RSpec.describe Gitlab::Pagination::Keyset::ColumnOrderDefinition do
described_class.new(
attribute_name: :name,
column_expression: Project.arel_table[:name],
- order_expression: Gitlab::Database.nulls_last_order('merge_request_metrics.merged_at', :desc),
- reversed_order_expression: Gitlab::Database.nulls_first_order('merge_request_metrics.merged_at', :asc),
+ order_expression: MergeRequest::Metrics.arel_table[:merged_at].desc.nulls_last,
+ reversed_order_expression: MergeRequest::Metrics.arel_table[:merged_at].asc.nulls_first,
order_direction: :desc,
nullable: :nulls_last,
distinct: true
@@ -191,8 +191,8 @@ RSpec.describe Gitlab::Pagination::Keyset::ColumnOrderDefinition do
described_class.new(
attribute_name: :name,
column_expression: Project.arel_table[:name],
- order_expression: Gitlab::Database.nulls_last_order('merge_request_metrics.merged_at', :desc),
- reversed_order_expression: Gitlab::Database.nulls_first_order('merge_request_metrics.merged_at', :asc),
+ order_expression: MergeRequest::Metrics.arel_table[:merged_at].desc.nulls_last,
+ reversed_order_expression: MergeRequest::Metrics.arel_table[:merged_at].asc.nulls_first,
order_direction: :desc,
nullable: :nulls_last, # null values are always last
distinct: false
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 58db22e5a9c..9f2ac9a953d 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
@@ -24,12 +24,12 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
let_it_be(:issues) do
[
create(:issue, project: project_1, created_at: three_weeks_ago, relative_position: 5),
- create(:issue, project: project_1, created_at: two_weeks_ago),
+ create(:issue, project: project_1, created_at: two_weeks_ago, relative_position: nil),
create(:issue, project: project_2, created_at: two_weeks_ago, relative_position: 15),
- create(:issue, project: project_2, created_at: two_weeks_ago),
- create(:issue, project: project_3, created_at: four_weeks_ago),
+ create(:issue, project: project_2, created_at: two_weeks_ago, relative_position: nil),
+ create(:issue, project: project_3, created_at: four_weeks_ago, relative_position: nil),
create(:issue, project: project_4, created_at: five_weeks_ago, relative_position: 10),
- create(:issue, project: project_5, created_at: four_weeks_ago)
+ create(:issue, project: project_5, created_at: four_weeks_ago, relative_position: nil)
]
end
@@ -121,8 +121,8 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: :relative_position,
column_expression: Issue.arel_table[:relative_position],
- order_expression: Gitlab::Database.nulls_last_order('relative_position', :desc),
- reversed_order_expression: Gitlab::Database.nulls_first_order('relative_position', :asc),
+ order_expression: Issue.arel_table[:relative_position].desc.nulls_last,
+ reversed_order_expression: Issue.arel_table[:relative_position].asc.nulls_first,
order_direction: :desc,
nullable: :nulls_last,
distinct: false
@@ -155,6 +155,31 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
it_behaves_like 'correct ordering examples'
end
+
+ context 'with condition "relative_position IS NULL"' do
+ let(:base_scope) { Issue.where(relative_position: nil) }
+ let(:scope) { base_scope.order(order) }
+
+ let(:in_operator_optimization_options) do
+ {
+ array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id),
+ array_mapping_scope: -> (id_expression) { Issue.merge(base_scope.dup).where(Issue.arel_table[:project_id].eq(id_expression)) },
+ finder_query: -> (_relative_position_expression, id_expression) { Issue.where(Issue.arel_table[:id].eq(id_expression)) }
+ }
+ end
+
+ context 'when iterating records one by one' do
+ let(:batch_size) { 1 }
+
+ it_behaves_like 'correct ordering examples'
+ end
+
+ context 'when iterating records with LIMIT 3' do
+ let(:batch_size) { 3 }
+
+ it_behaves_like 'correct ordering examples'
+ end
+ end
end
context 'when ordering by issues.created_at DESC, issues.id ASC' do
@@ -239,7 +264,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
end
it 'raises error when unsupported scope is passed' do
- scope = Issue.order(Issue.arel_table[:id].lower.desc)
+ scope = Issue.order(Arel::Nodes::NamedFunction.new('UPPER', [Issue.arel_table[:id]]))
options = {
scope: scope,
diff --git a/spec/lib/gitlab/pagination/keyset/iterator_spec.rb b/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
index 09cbca2c1cb..d62d20d2d2c 100644
--- a/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
@@ -19,8 +19,8 @@ RSpec.describe Gitlab::Pagination::Keyset::Iterator do
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: column,
column_expression: klass.arel_table[column],
- order_expression: ::Gitlab::Database.nulls_order(column, direction, nulls_position),
- reversed_order_expression: ::Gitlab::Database.nulls_order(column, reverse_direction, reverse_nulls_position),
+ order_expression: klass.arel_table[column].public_send(direction).public_send(nulls_position), # rubocop:disable GitlabSecurity/PublicSend
+ reversed_order_expression: klass.arel_table[column].public_send(reverse_direction).public_send(reverse_nulls_position), # rubocop:disable GitlabSecurity/PublicSend
order_direction: direction,
nullable: nulls_position,
distinct: false
@@ -99,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.reorder(::Gitlab::Database.nulls_last_order('relative_position', 'ASC')).order(id: :asc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.reorder(Issue.arel_table[:relative_position].asc.nulls_last).order(id: :asc).pluck(:relative_position, :id))
end
end
@@ -111,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.reorder(::Gitlab::Database.nulls_first_order('relative_position', 'DESC')).order(id: :desc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.reorder(Issue.arel_table[:relative_position].desc.nulls_first).order(id: :desc).pluck(:relative_position, :id))
end
end
@@ -123,7 +123,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.reorder(::Gitlab::Database.nulls_first_order('relative_position', 'ASC')).order(id: :asc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.reorder(Issue.arel_table[:relative_position].asc.nulls_first).order(id: :asc).pluck(:relative_position, :id))
end
end
@@ -136,7 +136,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.reorder(::Gitlab::Database.nulls_last_order('relative_position', 'DESC')).order(id: :desc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.reorder(Issue.arel_table[:relative_position].desc.nulls_last).order(id: :desc).pluck(:relative_position, :id))
end
end
diff --git a/spec/lib/gitlab/pagination/keyset/order_spec.rb b/spec/lib/gitlab/pagination/keyset/order_spec.rb
index 1bed8e542a2..abbb3a21cd4 100644
--- a/spec/lib/gitlab/pagination/keyset/order_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/order_spec.rb
@@ -262,8 +262,8 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'year',
column_expression: table['year'],
- order_expression: Gitlab::Database.nulls_last_order('year', :asc),
- reversed_order_expression: Gitlab::Database.nulls_first_order('year', :desc),
+ order_expression: table[:year].asc.nulls_last,
+ reversed_order_expression: table[:year].desc.nulls_first,
order_direction: :asc,
nullable: :nulls_last,
distinct: false
@@ -271,8 +271,8 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'month',
column_expression: table['month'],
- order_expression: Gitlab::Database.nulls_last_order('month', :asc),
- reversed_order_expression: Gitlab::Database.nulls_first_order('month', :desc),
+ order_expression: table[:month].asc.nulls_last,
+ reversed_order_expression: table[:month].desc.nulls_first,
order_direction: :asc,
nullable: :nulls_last,
distinct: false
@@ -328,8 +328,8 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'year',
column_expression: table['year'],
- order_expression: Gitlab::Database.nulls_first_order('year', :asc),
- reversed_order_expression: Gitlab::Database.nulls_last_order('year', :desc),
+ order_expression: table[:year].asc.nulls_first,
+ reversed_order_expression: table[:year].desc.nulls_last,
order_direction: :asc,
nullable: :nulls_first,
distinct: false
@@ -337,9 +337,9 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'month',
column_expression: table['month'],
- order_expression: Gitlab::Database.nulls_first_order('month', :asc),
+ order_expression: table[:month].asc.nulls_first,
order_direction: :asc,
- reversed_order_expression: Gitlab::Database.nulls_last_order('month', :desc),
+ reversed_order_expression: table[:month].desc.nulls_last,
nullable: :nulls_first,
distinct: false
),
@@ -441,6 +441,47 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
end
end
+ context 'when ordering by the named function LOWER' do
+ let(:order) do
+ Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'title',
+ column_expression: Arel::Nodes::NamedFunction.new("LOWER", [table['title'].desc]),
+ order_expression: table['title'].lower.desc,
+ nullable: :not_nullable,
+ distinct: false
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ column_expression: table['id'],
+ order_expression: table['id'].desc,
+ nullable: :not_nullable,
+ distinct: true
+ )
+ ])
+ end
+
+ let(:table_data) do
+ <<-SQL
+ VALUES (1, 'A')
+ SQL
+ end
+
+ let(:query) do
+ <<-SQL
+ SELECT id, title
+ FROM (#{table_data}) my_table (id, title)
+ ORDER BY #{order};
+ SQL
+ end
+
+ subject { run_query(query) }
+
+ it "uses downcased value for encoding and decoding a cursor" do
+ expect(order.cursor_attributes_for_node(subject.first)['title']).to eq("a")
+ end
+ end
+
context 'when the passed cursor values do not match with the order definition' do
let(:order) do
Gitlab::Pagination::Keyset::Order.build([
diff --git a/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb b/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb
index 5af86cb2dc0..4f1d380ab0a 100644
--- a/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Pagination::Keyset::SimpleOrderBuilder do
let(:ordered_scope) { described_class.build(scope).first }
let(:order_object) { Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(ordered_scope) }
+ let(:column_definition) { order_object.column_definitions.first }
subject(:sql_with_order) { ordered_scope.to_sql }
@@ -16,11 +17,25 @@ RSpec.describe Gitlab::Pagination::Keyset::SimpleOrderBuilder do
end
it 'sets the column definition distinct and not nullable' do
- column_definition = order_object.column_definitions.first
-
expect(column_definition).to be_not_nullable
expect(column_definition).to be_distinct
end
+
+ context "when the order scope's model uses default_scope" do
+ let(:scope) do
+ model = Class.new(ApplicationRecord) do
+ self.table_name = 'events'
+
+ default_scope { reorder(nil) } # rubocop:disable Cop/DefaultScope
+ end
+
+ model.reorder(nil)
+ end
+
+ it 'orders by primary key' do
+ expect(sql_with_order).to end_with('ORDER BY "events"."id" DESC')
+ end
+ end
end
context 'when primary key order present' do
@@ -39,8 +54,6 @@ RSpec.describe Gitlab::Pagination::Keyset::SimpleOrderBuilder do
end
it 'sets the column definition for created_at non-distinct and nullable' do
- column_definition = order_object.column_definitions.first
-
expect(column_definition.attribute_name).to eq('created_at')
expect(column_definition.nullable?).to eq(true) # be_nullable calls non_null? method for some reason
expect(column_definition).not_to be_distinct
@@ -59,14 +72,80 @@ RSpec.describe Gitlab::Pagination::Keyset::SimpleOrderBuilder do
let(:scope) { Project.where(id: [1, 2, 3]).order(namespace_id: :asc, id: :asc) }
it 'sets the column definition for namespace_id non-distinct and non-nullable' do
- column_definition = order_object.column_definitions.first
-
expect(column_definition.attribute_name).to eq('namespace_id')
expect(column_definition).to be_not_nullable
expect(column_definition).not_to be_distinct
end
end
+ context 'when ordering by a column with the lower named function' do
+ let(:scope) { Project.where(id: [1, 2, 3]).order(Project.arel_table[:name].lower.desc) }
+
+ it 'sets the column definition for name' do
+ expect(column_definition.attribute_name).to eq('name')
+ expect(column_definition.column_expression.expressions.first.name).to eq('name')
+ expect(column_definition.column_expression.name).to eq('LOWER')
+ end
+
+ it 'adds extra primary key order as tie-breaker' do
+ expect(sql_with_order).to end_with('ORDER BY LOWER("projects"."name") DESC, "projects"."id" DESC')
+ end
+ end
+
+ context "NULLS order given as as an Arel literal" do
+ context 'when NULLS LAST order is given without a tie-breaker' do
+ let(:scope) { Project.order(Project.arel_table[:created_at].asc.nulls_last) }
+
+ it 'sets the column definition for created_at appropriately' do
+ expect(column_definition.attribute_name).to eq('created_at')
+ end
+
+ it 'orders by primary key' do
+ expect(sql_with_order)
+ .to end_with('ORDER BY "projects"."created_at" ASC NULLS LAST, "projects"."id" DESC')
+ end
+ end
+
+ context 'when NULLS FIRST order is given with a tie-breaker' do
+ let(:scope) { Issue.order(Issue.arel_table[:relative_position].desc.nulls_first).order(id: :asc) }
+
+ it 'sets the column definition for created_at appropriately' do
+ expect(column_definition.attribute_name).to eq('relative_position')
+ end
+
+ it 'orders by the given primary key' do
+ expect(sql_with_order)
+ .to end_with('ORDER BY "issues"."relative_position" DESC NULLS FIRST, "issues"."id" ASC')
+ end
+ end
+ end
+
+ context "NULLS order given as as an Arel node" do
+ context 'when NULLS LAST order is given without a tie-breaker' do
+ let(:scope) { Project.order(Project.arel_table[:created_at].asc.nulls_last) }
+
+ it 'sets the column definition for created_at appropriately' do
+ expect(column_definition.attribute_name).to eq('created_at')
+ end
+
+ it 'orders by primary key' do
+ expect(sql_with_order).to end_with('ORDER BY "projects"."created_at" ASC NULLS LAST, "projects"."id" DESC')
+ end
+ end
+
+ context 'when NULLS FIRST order is given with a tie-breaker' do
+ let(:scope) { Issue.order(Issue.arel_table[:relative_position].desc.nulls_first).order(id: :asc) }
+
+ it 'sets the column definition for created_at appropriately' do
+ expect(column_definition.attribute_name).to eq('relative_position')
+ end
+
+ it 'orders by the given primary key' do
+ expect(sql_with_order).to end_with('ORDER BY "issues"."relative_position" DESC NULLS FIRST, "issues"."id" ASC')
+ end
+ end
+ end
+
context 'return :unable_to_order symbol when order cannot be built' do
subject(:success) { described_class.build(scope).last }
@@ -76,10 +155,20 @@ RSpec.describe Gitlab::Pagination::Keyset::SimpleOrderBuilder do
it { is_expected.to eq(false) }
end
- context 'when NULLS LAST order is given' do
- let(:scope) { Project.order(::Gitlab::Database.nulls_last_order('created_at', 'ASC')) }
+ context 'when an invalid NULLS order is given' do
+ using RSpec::Parameterized::TableSyntax
- it { is_expected.to eq(false) }
+ where(:scope) do
+ [
+ lazy { Project.order(Arel.sql('projects.updated_at created_at Asc Nulls Last')) },
+ lazy { Project.order(Arel.sql('projects.created_at ZZZ NULLS FIRST')) },
+ lazy { Project.order(Arel.sql('projects.relative_position ASC NULLS LAST')) }
+ ]
+ end
+
+ with_them do
+ it { is_expected.to eq(false) }
+ end
end
context 'when more than 2 columns are given for the order' do
diff --git a/spec/lib/gitlab/pagination/offset_pagination_spec.rb b/spec/lib/gitlab/pagination/offset_pagination_spec.rb
index f8d50fbc517..ebbd207cc11 100644
--- a/spec/lib/gitlab/pagination/offset_pagination_spec.rb
+++ b/spec/lib/gitlab/pagination/offset_pagination_spec.rb
@@ -66,70 +66,50 @@ RSpec.describe Gitlab::Pagination::OffsetPagination do
let(:query) { base_query.merge(page: 1, per_page: 2) }
- context 'when the api_kaminari_count_with_limit feature flag is unset' do
- it_behaves_like 'paginated response'
- it_behaves_like 'response with pagination headers'
- end
-
- context 'when the api_kaminari_count_with_limit feature flag is disabled' do
+ context 'when resources count is less than MAX_COUNT_LIMIT' do
before do
- stub_feature_flags(api_kaminari_count_with_limit: false)
+ stub_const("::Kaminari::ActiveRecordRelationMethods::MAX_COUNT_LIMIT", 4)
end
it_behaves_like 'paginated response'
it_behaves_like 'response with pagination headers'
end
- context 'when the api_kaminari_count_with_limit feature flag is enabled' do
+ context 'when resources count is more than MAX_COUNT_LIMIT' do
before do
- stub_feature_flags(api_kaminari_count_with_limit: true)
- end
-
- context 'when resources count is less than MAX_COUNT_LIMIT' do
- before do
- stub_const("::Kaminari::ActiveRecordRelationMethods::MAX_COUNT_LIMIT", 4)
- end
-
- it_behaves_like 'paginated response'
- it_behaves_like 'response with pagination headers'
+ stub_const("::Kaminari::ActiveRecordRelationMethods::MAX_COUNT_LIMIT", 2)
end
- context 'when resources count is more than MAX_COUNT_LIMIT' do
- before do
- stub_const("::Kaminari::ActiveRecordRelationMethods::MAX_COUNT_LIMIT", 2)
- end
-
- it_behaves_like 'paginated response'
-
- it 'does not return the X-Total and X-Total-Pages headers' do
- expect_no_header('X-Total')
- expect_no_header('X-Total-Pages')
- expect_header('X-Per-Page', '2')
- expect_header('X-Page', '1')
- expect_header('X-Next-Page', '2')
- expect_header('X-Prev-Page', '')
-
- expect_header('Link', anything) do |_key, val|
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="next"))
- expect(val).not_to include('rel="last"')
- expect(val).not_to include('rel="prev"')
- end
-
- subject.paginate(resource)
- end
- end
+ it_behaves_like 'paginated response'
- it 'does not return the total headers when excluding them' do
+ it 'does not return the X-Total and X-Total-Pages headers' do
expect_no_header('X-Total')
expect_no_header('X-Total-Pages')
expect_header('X-Per-Page', '2')
expect_header('X-Page', '1')
+ expect_header('X-Next-Page', '2')
+ expect_header('X-Prev-Page', '')
- paginator.paginate(resource, exclude_total_headers: true)
+ expect_header('Link', anything) do |_key, val|
+ expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
+ expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="next"))
+ expect(val).not_to include('rel="last"')
+ expect(val).not_to include('rel="prev"')
+ end
+
+ subject.paginate(resource)
end
end
+ it 'does not return the total headers when excluding them' do
+ expect_no_header('X-Total')
+ expect_no_header('X-Total-Pages')
+ expect_header('X-Per-Page', '2')
+ expect_header('X-Page', '1')
+
+ paginator.paginate(resource, exclude_total_headers: true)
+ end
+
context 'when resource already paginated' do
let(:resource) { Project.all.page(1).per(1) }
diff --git a/spec/lib/gitlab/patch/database_config_spec.rb b/spec/lib/gitlab/patch/database_config_spec.rb
new file mode 100644
index 00000000000..d6f36ab86d5
--- /dev/null
+++ b/spec/lib/gitlab/patch/database_config_spec.rb
@@ -0,0 +1,126 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Patch::DatabaseConfig do
+ it 'module is included' do
+ expect(Rails::Application::Configuration).to include(described_class)
+ end
+
+ describe 'config/database.yml' do
+ let(:configuration) { Rails::Application::Configuration.new(Rails.root) }
+
+ before do
+ allow(File).to receive(:exist?).and_call_original
+ allow(File).to receive(:exist?).with(Rails.root.join("config/database_geo.yml")).and_return(false)
+
+ # The `AS::ConfigurationFile` calls `read` in `def initialize`
+ # thus we cannot use `expect_next_instance_of`
+ # rubocop:disable RSpec/AnyInstanceOf
+ expect_any_instance_of(ActiveSupport::ConfigurationFile)
+ .to receive(:read).with(Rails.root.join('config/database.yml')).and_return(database_yml)
+ # rubocop:enable RSpec/AnyInstanceOf
+ end
+
+ shared_examples 'hash containing main: connection name' do
+ it 'returns a hash containing only main:' do
+ database_configuration = configuration.database_configuration
+
+ expect(database_configuration).to match(
+ "production" => { "main" => a_hash_including("adapter") },
+ "development" => { "main" => a_hash_including("adapter" => "postgresql") },
+ "test" => { "main" => a_hash_including("adapter" => "postgresql") }
+ )
+ end
+ end
+
+ context 'when a new syntax is used' do
+ let(:database_yml) do
+ <<-EOS
+ production:
+ main:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_production
+ username: git
+ password: "secure password"
+ host: localhost
+
+ development:
+ main:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_development
+ username: postgres
+ password: "secure password"
+ host: localhost
+ variables:
+ statement_timeout: 15s
+
+ test: &test
+ main:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_test
+ username: postgres
+ password:
+ host: localhost
+ prepared_statements: false
+ variables:
+ statement_timeout: 15s
+ EOS
+ end
+
+ include_examples 'hash containing main: connection name'
+
+ it 'configuration is not legacy one' do
+ configuration.database_configuration
+
+ expect(configuration.uses_legacy_database_config).to eq(false)
+ end
+ end
+
+ context 'when a legacy syntax is used' do
+ let(:database_yml) do
+ <<-EOS
+ production:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_production
+ username: git
+ password: "secure password"
+ host: localhost
+
+ development:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_development
+ username: postgres
+ password: "secure password"
+ host: localhost
+ variables:
+ statement_timeout: 15s
+
+ test: &test
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_test
+ username: postgres
+ password:
+ host: localhost
+ prepared_statements: false
+ variables:
+ statement_timeout: 15s
+ EOS
+ end
+
+ include_examples 'hash containing main: connection name'
+
+ it 'configuration is legacy' do
+ configuration.database_configuration
+
+ expect(configuration.uses_legacy_database_config).to eq(true)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/patch/legacy_database_config_spec.rb b/spec/lib/gitlab/patch/legacy_database_config_spec.rb
deleted file mode 100644
index b87e16f31ae..00000000000
--- a/spec/lib/gitlab/patch/legacy_database_config_spec.rb
+++ /dev/null
@@ -1,126 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Patch::LegacyDatabaseConfig do
- it 'module is included' do
- expect(Rails::Application::Configuration).to include(described_class)
- end
-
- describe 'config/database.yml' do
- let(:configuration) { Rails::Application::Configuration.new(Rails.root) }
-
- before do
- allow(File).to receive(:exist?).and_call_original
- allow(File).to receive(:exist?).with(Rails.root.join("config/database_geo.yml")).and_return(false)
-
- # The `AS::ConfigurationFile` calls `read` in `def initialize`
- # thus we cannot use `expect_next_instance_of`
- # rubocop:disable RSpec/AnyInstanceOf
- expect_any_instance_of(ActiveSupport::ConfigurationFile)
- .to receive(:read).with(Rails.root.join('config/database.yml')).and_return(database_yml)
- # rubocop:enable RSpec/AnyInstanceOf
- end
-
- shared_examples 'hash containing main: connection name' do
- it 'returns a hash containing only main:' do
- database_configuration = configuration.database_configuration
-
- expect(database_configuration).to match(
- "production" => { "main" => a_hash_including("adapter") },
- "development" => { "main" => a_hash_including("adapter" => "postgresql") },
- "test" => { "main" => a_hash_including("adapter" => "postgresql") }
- )
- end
- end
-
- context 'when a new syntax is used' do
- let(:database_yml) do
- <<-EOS
- production:
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_production
- username: git
- password: "secure password"
- host: localhost
-
- development:
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_development
- username: postgres
- password: "secure password"
- host: localhost
- variables:
- statement_timeout: 15s
-
- test: &test
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_test
- username: postgres
- password:
- host: localhost
- prepared_statements: false
- variables:
- statement_timeout: 15s
- EOS
- end
-
- include_examples 'hash containing main: connection name'
-
- it 'configuration is not legacy one' do
- configuration.database_configuration
-
- expect(configuration.uses_legacy_database_config).to eq(false)
- end
- end
-
- context 'when a legacy syntax is used' do
- let(:database_yml) do
- <<-EOS
- production:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_production
- username: git
- password: "secure password"
- host: localhost
-
- development:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_development
- username: postgres
- password: "secure password"
- host: localhost
- variables:
- statement_timeout: 15s
-
- test: &test
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_test
- username: postgres
- password:
- host: localhost
- prepared_statements: false
- variables:
- statement_timeout: 15s
- EOS
- end
-
- include_examples 'hash containing main: connection name'
-
- it 'configuration is legacy' do
- configuration.database_configuration
-
- expect(configuration.uses_legacy_database_config).to eq(true)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/path_regex_spec.rb b/spec/lib/gitlab/path_regex_spec.rb
index 9876387512b..e5fa7538515 100644
--- a/spec/lib/gitlab/path_regex_spec.rb
+++ b/spec/lib/gitlab/path_regex_spec.rb
@@ -557,7 +557,7 @@ RSpec.describe Gitlab::PathRegex do
end
it 'does not match other non-word characters' do
- expect(subject.match('ruby:2.7.0')[0]).to eq('ruby')
+ expect(subject.match('image:1.0.0')[0]).to eq('image')
end
end
diff --git a/spec/lib/gitlab/project_template_spec.rb b/spec/lib/gitlab/project_template_spec.rb
index 05417e721c7..0ef52b63bc6 100644
--- a/spec/lib/gitlab/project_template_spec.rb
+++ b/spec/lib/gitlab/project_template_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Gitlab::ProjectTemplate do
expected = %w[
rails spring express iosswift dotnetcore android
gomicro gatsby hugo jekyll plainhtml gitbook
- hexo sse_middleman gitpod_spring_petclinic nfhugo
+ hexo middleman gitpod_spring_petclinic nfhugo
nfjekyll nfplainhtml nfgitbook nfhexo salesforcedx
serverless_framework tencent_serverless_framework
jsonnet cluster_management kotlin_native_linux
diff --git a/spec/lib/gitlab/quick_actions/command_definition_spec.rb b/spec/lib/gitlab/quick_actions/command_definition_spec.rb
index 73629ce3da2..8362c07baca 100644
--- a/spec/lib/gitlab/quick_actions/command_definition_spec.rb
+++ b/spec/lib/gitlab/quick_actions/command_definition_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe Gitlab::QuickActions::CommandDefinition do
describe "#noop?" do
context "when the command has an action block" do
before do
- subject.action_block = proc { }
+ subject.action_block = proc {}
end
it "returns false" do
@@ -42,7 +42,7 @@ RSpec.describe Gitlab::QuickActions::CommandDefinition do
end
describe "#available?" do
- let(:opts) { OpenStruct.new(go: false) }
+ let(:opts) { ActiveSupport::InheritableOptions.new(go: false) }
context "when the command has a condition block" do
before do
@@ -104,7 +104,8 @@ RSpec.describe Gitlab::QuickActions::CommandDefinition do
end
describe "#execute" do
- let(:context) { OpenStruct.new(run: false, commands_executed_count: nil) }
+ let(:fake_context) { Struct.new(:run, :commands_executed_count, :received_arg) }
+ let(:context) { fake_context.new(false, nil, nil) }
context "when the command is a noop" do
it "doesn't execute the command" do
diff --git a/spec/lib/gitlab/search_context/builder_spec.rb b/spec/lib/gitlab/search_context/builder_spec.rb
index 079477115bb..a09115f3f21 100644
--- a/spec/lib/gitlab/search_context/builder_spec.rb
+++ b/spec/lib/gitlab/search_context/builder_spec.rb
@@ -43,7 +43,6 @@ RSpec.describe Gitlab::SearchContext::Builder, type: :controller do
def be_search_context(project: nil, group: nil, snippets: [], ref: nil)
group = project ? project.group : group
snippets.compact!
- ref = ref
have_attributes(
project: project,
diff --git a/spec/lib/gitlab/security/scan_configuration_spec.rb b/spec/lib/gitlab/security/scan_configuration_spec.rb
index 2e8a11dfda3..1760796c5a0 100644
--- a/spec/lib/gitlab/security/scan_configuration_spec.rb
+++ b/spec/lib/gitlab/security/scan_configuration_spec.rb
@@ -47,6 +47,16 @@ RSpec.describe ::Gitlab::Security::ScanConfiguration do
it { is_expected.to be_nil }
end
+ describe '#meta_info_path' do
+ subject { scan.meta_info_path }
+
+ let(:configured) { true }
+ let(:available) { true }
+ let(:type) { :dast }
+
+ it { is_expected.to be_nil }
+ end
+
describe '#can_enable_by_merge_request?' do
subject { scan.can_enable_by_merge_request? }
diff --git a/spec/lib/gitlab/seeder_spec.rb b/spec/lib/gitlab/seeder_spec.rb
index 71d0a41ef98..a22d47cbfb3 100644
--- a/spec/lib/gitlab/seeder_spec.rb
+++ b/spec/lib/gitlab/seeder_spec.rb
@@ -3,6 +3,24 @@
require 'spec_helper'
RSpec.describe Gitlab::Seeder do
+ describe Namespace do
+ subject { described_class }
+
+ it 'has not_mass_generated scope' do
+ expect { Namespace.not_mass_generated }.to raise_error(NoMethodError)
+
+ Gitlab::Seeder.quiet do
+ expect { Namespace.not_mass_generated }.not_to raise_error
+ end
+ end
+
+ it 'includes NamespaceSeed module' do
+ Gitlab::Seeder.quiet do
+ is_expected.to include_module(Gitlab::Seeder::NamespaceSeed)
+ end
+ end
+ end
+
describe '.quiet' do
let(:database_base_models) do
{
@@ -50,4 +68,13 @@ RSpec.describe Gitlab::Seeder do
notification_service.new_note(note)
end
end
+
+ describe '.log_message' do
+ it 'prepends timestamp to the logged message' do
+ freeze_time do
+ message = "some message."
+ expect { described_class.log_message(message) }.to output(/#{Time.current}: #{message}/).to_stdout
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
index 3fbd207c2e1..ffa92126cc9 100644
--- a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
@@ -292,7 +292,7 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
if category
feature_category category
else
- feature_category_not_owned!
+ feature_category :not_owned
end
def perform
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 b9a13fd697e..3baa0c6f967 100644
--- a/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Client do
'TestNotOwnedWithContextWorker'
end
- feature_category_not_owned!
+ feature_category :not_owned
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 377ff6fd166..05b328e55d3 100644
--- a/spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Server do
"NotOwnedWorker"
end
- feature_category_not_owned!
+ feature_category :not_owned
end
end
diff --git a/spec/lib/gitlab/ssh_public_key_spec.rb b/spec/lib/gitlab/ssh_public_key_spec.rb
index cf5d2c3b455..422b6f925a1 100644
--- a/spec/lib/gitlab/ssh_public_key_spec.rb
+++ b/spec/lib/gitlab/ssh_public_key_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::SSHPublicKey, lib: true do
+RSpec.describe Gitlab::SSHPublicKey, lib: true, fips_mode: false do
let(:key) { attributes_for(:rsa_key_2048)[:key] }
let(:public_key) { described_class.new(key) }
@@ -19,6 +19,17 @@ RSpec.describe Gitlab::SSHPublicKey, lib: true do
it { expect(described_class.technology(name).name).to eq(name) }
it { expect(described_class.technology(name.to_s).name).to eq(name) }
end
+
+ context 'FIPS mode', :fips_mode do
+ where(:name) do
+ [:rsa, :ecdsa, :ed25519, :ecdsa_sk, :ed25519_sk]
+ end
+
+ with_them do
+ it { expect(described_class.technology(name).name).to eq(name) }
+ it { expect(described_class.technology(name.to_s).name).to eq(name) }
+ end
+ end
end
describe '.supported_types' do
@@ -27,6 +38,14 @@ RSpec.describe Gitlab::SSHPublicKey, lib: true do
[:rsa, :dsa, :ecdsa, :ed25519, :ecdsa_sk, :ed25519_sk]
)
end
+
+ context 'FIPS mode', :fips_mode do
+ it 'returns array with the names of supported technologies' do
+ expect(described_class.supported_types).to eq(
+ [:rsa, :dsa, :ecdsa, :ed25519, :ecdsa_sk, :ed25519_sk]
+ )
+ end
+ end
end
describe '.supported_sizes(name)' do
@@ -45,6 +64,24 @@ RSpec.describe Gitlab::SSHPublicKey, lib: true do
it { expect(described_class.supported_sizes(name)).to eq(sizes) }
it { expect(described_class.supported_sizes(name.to_s)).to eq(sizes) }
end
+
+ context 'FIPS mode', :fips_mode do
+ where(:name, :sizes) do
+ [
+ [:rsa, [3072, 4096]],
+ [:dsa, []],
+ [:ecdsa, [256, 384, 521]],
+ [:ed25519, [256]],
+ [:ecdsa_sk, [256]],
+ [:ed25519_sk, [256]]
+ ]
+ end
+
+ with_them do
+ it { expect(described_class.supported_sizes(name)).to eq(sizes) }
+ it { expect(described_class.supported_sizes(name.to_s)).to eq(sizes) }
+ end
+ end
end
describe '.supported_algorithms' do
@@ -60,6 +97,21 @@ RSpec.describe Gitlab::SSHPublicKey, lib: true do
)
)
end
+
+ context 'FIPS mode', :fips_mode do
+ it 'returns all supported algorithms' do
+ expect(described_class.supported_algorithms).to eq(
+ %w(
+ ssh-rsa
+ ssh-dss
+ ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521
+ ssh-ed25519
+ sk-ecdsa-sha2-nistp256@openssh.com
+ sk-ssh-ed25519@openssh.com
+ )
+ )
+ end
+ end
end
describe '.supported_algorithms_for_name' do
@@ -80,6 +132,26 @@ RSpec.describe Gitlab::SSHPublicKey, lib: true do
expect(described_class.supported_algorithms_for_name(name.to_s)).to eq(algorithms)
end
end
+
+ context 'FIPS mode', :fips_mode do
+ where(:name, :algorithms) do
+ [
+ [:rsa, %w(ssh-rsa)],
+ [:dsa, %w(ssh-dss)],
+ [:ecdsa, %w(ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521)],
+ [:ed25519, %w(ssh-ed25519)],
+ [:ecdsa_sk, %w(sk-ecdsa-sha2-nistp256@openssh.com)],
+ [:ed25519_sk, %w(sk-ssh-ed25519@openssh.com)]
+ ]
+ end
+
+ with_them do
+ it "returns all supported algorithms for #{params[:name]}" do
+ expect(described_class.supported_algorithms_for_name(name)).to eq(algorithms)
+ expect(described_class.supported_algorithms_for_name(name.to_s)).to eq(algorithms)
+ end
+ end
+ end
end
describe '.sanitize(key_content)' do
diff --git a/spec/lib/gitlab/suggestions/commit_message_spec.rb b/spec/lib/gitlab/suggestions/commit_message_spec.rb
index 965960f0c3e..dcadc206715 100644
--- a/spec/lib/gitlab/suggestions/commit_message_spec.rb
+++ b/spec/lib/gitlab/suggestions/commit_message_spec.rb
@@ -3,7 +3,10 @@
require 'spec_helper'
RSpec.describe Gitlab::Suggestions::CommitMessage do
- def create_suggestion(file_path, new_line, to_content)
+ include ProjectForksHelper
+ using RSpec::Parameterized::TableSyntax
+
+ def create_suggestion(merge_request, file_path, new_line, to_content)
position = Gitlab::Diff::Position.new(old_path: file_path,
new_path: file_path,
old_line: nil,
@@ -29,69 +32,111 @@ RSpec.describe Gitlab::Suggestions::CommitMessage do
create(:project, :repository, path: 'project-1', name: 'Project_1')
end
- let_it_be(:merge_request) do
+ let_it_be(:forked_project) { fork_project(project, nil, repository: true) }
+
+ let_it_be(:merge_request_same_project) do
create(:merge_request, source_project: project, target_project: project)
end
- let_it_be(:suggestion_set) do
- suggestion1 = create_suggestion('files/ruby/popen.rb', 9, '*** SUGGESTION 1 ***')
- suggestion2 = create_suggestion('files/ruby/popen.rb', 13, '*** SUGGESTION 2 ***')
- suggestion3 = create_suggestion('files/ruby/regex.rb', 22, '*** SUGGESTION 3 ***')
+ let_it_be(:merge_request_from_fork) do
+ create(:merge_request, source_project: forked_project, target_project: project)
+ end
+
+ let_it_be(:suggestion_set_same_project) do
+ suggestion1 = create_suggestion(merge_request_same_project, 'files/ruby/popen.rb', 9, '*** SUGGESTION 1 ***')
+ suggestion2 = create_suggestion(merge_request_same_project, 'files/ruby/popen.rb', 13, '*** SUGGESTION 2 ***')
+ suggestion3 = create_suggestion(merge_request_same_project, 'files/ruby/regex.rb', 22, '*** SUGGESTION 3 ***')
+
+ Gitlab::Suggestions::SuggestionSet.new([suggestion1, suggestion2, suggestion3])
+ end
+
+ let_it_be(:suggestion_set_forked_project) do
+ suggestion1 = create_suggestion(merge_request_from_fork, 'files/ruby/popen.rb', 9, '*** SUGGESTION 1 ***')
+ suggestion2 = create_suggestion(merge_request_from_fork, 'files/ruby/popen.rb', 13, '*** SUGGESTION 2 ***')
+ suggestion3 = create_suggestion(merge_request_from_fork, 'files/ruby/regex.rb', 22, '*** SUGGESTION 3 ***')
Gitlab::Suggestions::SuggestionSet.new([suggestion1, suggestion2, suggestion3])
end
describe '#message' do
- before do
- # Updating the suggestion_commit_message on a project shared across specs
- # avoids recreating the repository for each spec.
- project.update!(suggestion_commit_message: message)
- end
+ where(:suggestion_set) { [ref(:suggestion_set_same_project), ref(:suggestion_set_forked_project)] }
+
+ with_them do
+ before do
+ # Updating the suggestion_commit_message on a project shared across specs
+ # avoids recreating the repository for each spec.
+ project.update!(suggestion_commit_message: message)
+ forked_project.update!(suggestion_commit_message: fork_message)
+ end
+
+ let(:fork_message) { nil }
- context 'when a custom commit message is not specified' do
- let(:expected_message) { 'Apply 3 suggestion(s) to 2 file(s)' }
+ context 'when a custom commit message is not specified' do
+ let(:expected_message) { 'Apply 3 suggestion(s) to 2 file(s)' }
- context 'and is nil' do
- let(:message) { nil }
+ context 'and is nil' do
+ let(:message) { nil }
- it 'uses the default commit message' do
- expect(described_class
- .new(user, suggestion_set)
- .message).to eq(expected_message)
+ it 'uses the default commit message' do
+ expect(described_class
+ .new(user, suggestion_set)
+ .message).to eq(expected_message)
+ end
end
- end
- context 'and is an empty string' do
- let(:message) { '' }
+ context 'and is an empty string' do
+ let(:message) { '' }
- it 'uses the default commit message' do
- expect(described_class
- .new(user, suggestion_set)
- .message).to eq(expected_message)
+ it 'uses the default commit message' do
+ expect(described_class
+ .new(user, suggestion_set)
+ .message).to eq(expected_message)
+ end
end
- end
- end
- context 'when a custom commit message is specified' do
- let(:message) { "i'm a project message. a user's custom message takes precedence over me :(" }
- let(:custom_message) { "hello there! i'm a cool custom commit message." }
+ context 'when a custom commit message is specified for forked project' do
+ let(:message) { nil }
+ let(:fork_message) { "I'm a sad message that will not be used :(" }
- it 'shows the custom commit message' do
- expect(Gitlab::Suggestions::CommitMessage
- .new(user, suggestion_set, custom_message)
- .message).to eq(custom_message)
+ it 'uses the default commit message' do
+ expect(described_class
+ .new(user, suggestion_set)
+ .message).to eq(expected_message)
+ end
+ end
end
- end
- context 'is specified and includes all placeholders' do
- let(:message) do
- '*** %{branch_name} %{files_count} %{file_paths} %{project_name} %{project_path} %{user_full_name} %{username} %{suggestions_count} ***'
+ context 'when a custom commit message is specified' do
+ let(:message) { "i'm a project message. a user's custom message takes precedence over me :(" }
+ let(:custom_message) { "hello there! i'm a cool custom commit message." }
+
+ it 'shows the custom commit message' do
+ expect(Gitlab::Suggestions::CommitMessage
+ .new(user, suggestion_set, custom_message)
+ .message).to eq(custom_message)
+ end
end
- it 'generates a custom commit message' do
- expect(Gitlab::Suggestions::CommitMessage
- .new(user, suggestion_set)
- .message).to eq('*** master 2 files/ruby/popen.rb, files/ruby/regex.rb Project_1 project-1 Test User test.user 3 ***')
+ context 'is specified and includes all placeholders' do
+ let(:message) do
+ '*** %{branch_name} %{files_count} %{file_paths} %{project_name} %{project_path} %{user_full_name} %{username} %{suggestions_count} ***'
+ end
+
+ it 'generates a custom commit message' do
+ expect(Gitlab::Suggestions::CommitMessage
+ .new(user, suggestion_set)
+ .message).to eq('*** master 2 files/ruby/popen.rb, files/ruby/regex.rb Project_1 project-1 Test User test.user 3 ***')
+ end
+
+ context 'when a custom commit message is specified for forked project' do
+ let(:fork_message) { "I'm a sad message that will not be used :(" }
+
+ it 'uses the target project commit message' do
+ expect(Gitlab::Suggestions::CommitMessage
+ .new(user, suggestion_set)
+ .message).to eq('*** master 2 files/ruby/popen.rb, files/ruby/regex.rb Project_1 project-1 Test User test.user 3 ***')
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/suggestions/suggestion_set_spec.rb b/spec/lib/gitlab/suggestions/suggestion_set_spec.rb
index 54d79a9d4ba..469646986e1 100644
--- a/spec/lib/gitlab/suggestions/suggestion_set_spec.rb
+++ b/spec/lib/gitlab/suggestions/suggestion_set_spec.rb
@@ -3,6 +3,9 @@
require 'spec_helper'
RSpec.describe Gitlab::Suggestions::SuggestionSet do
+ include ProjectForksHelper
+ using RSpec::Parameterized::TableSyntax
+
def create_suggestion(file_path, new_line, to_content)
position = Gitlab::Diff::Position.new(old_path: file_path,
new_path: file_path,
@@ -24,86 +27,99 @@ RSpec.describe Gitlab::Suggestions::SuggestionSet do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:forked_project) { fork_project(project, nil, repository: true) }
- let_it_be(:merge_request) do
+ let_it_be(:merge_request_same_project) do
create(:merge_request, source_project: project, target_project: project)
end
- let_it_be(:suggestion) { create(:suggestion)}
-
- let_it_be(:suggestion2) do
- create_suggestion('files/ruby/popen.rb', 13, "*** SUGGESTION 2 ***")
- end
-
- let_it_be(:suggestion3) do
- create_suggestion('files/ruby/regex.rb', 22, "*** SUGGESTION 3 ***")
+ let_it_be(:merge_request_from_fork) do
+ create(:merge_request, source_project: forked_project, target_project: project)
end
- let_it_be(:unappliable_suggestion) { create(:suggestion, :unappliable) }
+ where(:merge_request) { [ref(:merge_request_same_project), ref(:merge_request_from_fork)] }
+ with_them do
+ let(:note) { create(:diff_note_on_merge_request, project: project, noteable: merge_request) }
+ let(:suggestion) { create(:suggestion, note: note) }
- let(:suggestion_set) { described_class.new([suggestion]) }
-
- describe '#project' do
- it 'returns the project associated with the suggestions' do
- expected_project = suggestion.project
+ let(:suggestion2) do
+ create_suggestion('files/ruby/popen.rb', 13, "*** SUGGESTION 2 ***")
+ end
- expect(suggestion_set.project).to be(expected_project)
+ let(:suggestion3) do
+ create_suggestion('files/ruby/regex.rb', 22, "*** SUGGESTION 3 ***")
end
- end
- describe '#branch' do
- it 'returns the branch associated with the suggestions' do
- expected_branch = suggestion.branch
+ let(:unappliable_suggestion) { create(:suggestion, :unappliable) }
+
+ let(:suggestion_set) { described_class.new([suggestion]) }
- expect(suggestion_set.branch).to be(expected_branch)
+ describe '#source_project' do
+ it 'returns the source project associated with the suggestions' do
+ expect(suggestion_set.source_project).to be(merge_request.source_project)
+ end
end
- end
- describe '#valid?' do
- it 'returns true if no errors are found' do
- expect(suggestion_set.valid?).to be(true)
+ describe '#target_project' do
+ it 'returns the target project associated with the suggestions' do
+ expect(suggestion_set.target_project).to be(project)
+ end
end
- it 'returns false if an error is found' do
- suggestion_set = described_class.new([unappliable_suggestion])
+ describe '#branch' do
+ it 'returns the branch associated with the suggestions' do
+ expected_branch = suggestion.branch
- expect(suggestion_set.valid?).to be(false)
+ expect(suggestion_set.branch).to be(expected_branch)
+ end
end
- end
- describe '#error_message' do
- it 'returns an error message if an error is found' do
- suggestion_set = described_class.new([unappliable_suggestion])
+ describe '#valid?' do
+ it 'returns true if no errors are found' do
+ expect(suggestion_set.valid?).to be(true)
+ end
- expect(suggestion_set.error_message).to be_a(String)
+ it 'returns false if an error is found' do
+ suggestion_set = described_class.new([unappliable_suggestion])
+
+ expect(suggestion_set.valid?).to be(false)
+ end
end
- it 'returns nil if no errors are found' do
- expect(suggestion_set.error_message).to be(nil)
+ describe '#error_message' do
+ it 'returns an error message if an error is found' do
+ suggestion_set = described_class.new([unappliable_suggestion])
+
+ expect(suggestion_set.error_message).to be_a(String)
+ end
+
+ it 'returns nil if no errors are found' do
+ expect(suggestion_set.error_message).to be(nil)
+ end
end
- end
- describe '#actions' do
- it 'returns an array of hashes with proper key/value pairs' do
- first_action = suggestion_set.actions.first
+ describe '#actions' do
+ it 'returns an array of hashes with proper key/value pairs' do
+ first_action = suggestion_set.actions.first
- file_suggestion = suggestion_set.send(:suggestions_per_file).first
+ file_suggestion = suggestion_set.send(:suggestions_per_file).first
- expect(first_action[:action]).to be('update')
- expect(first_action[:file_path]).to eq(file_suggestion.file_path)
- expect(first_action[:content]).to eq(file_suggestion.new_content)
+ expect(first_action[:action]).to be('update')
+ expect(first_action[:file_path]).to eq(file_suggestion.file_path)
+ expect(first_action[:content]).to eq(file_suggestion.new_content)
+ end
end
- end
- describe '#file_paths' do
- it 'returns an array of unique file paths associated with the suggestions' do
- suggestion_set = described_class.new([suggestion, suggestion2, suggestion3])
+ describe '#file_paths' do
+ it 'returns an array of unique file paths associated with the suggestions' do
+ suggestion_set = described_class.new([suggestion, suggestion2, suggestion3])
- expected_paths = %w(files/ruby/popen.rb files/ruby/regex.rb)
+ expected_paths = %w(files/ruby/popen.rb files/ruby/regex.rb)
- actual_paths = suggestion_set.file_paths
+ actual_paths = suggestion_set.file_paths
- expect(actual_paths.sort).to eq(expected_paths)
+ expect(actual_paths.sort).to eq(expected_paths)
+ end
end
end
end
diff --git a/spec/lib/gitlab/tracking_spec.rb b/spec/lib/gitlab/tracking_spec.rb
index cd83971aef9..cc973be8be9 100644
--- a/spec/lib/gitlab/tracking_spec.rb
+++ b/spec/lib/gitlab/tracking_spec.rb
@@ -149,4 +149,42 @@ RSpec.describe Gitlab::Tracking do
described_class.event(nil, 'some_action')
end
end
+
+ describe '.definition' do
+ let(:namespace) { create(:namespace) }
+
+ let_it_be(:definition_action) { 'definition_action' }
+ let_it_be(:definition_category) { 'definition_category' }
+ let_it_be(:label_description) { 'definition label description' }
+ let_it_be(:test_definition) {{ 'category': definition_category, 'action': definition_action }}
+
+ before do
+ allow_next_instance_of(described_class) do |instance|
+ allow(instance).to receive(:event)
+ end
+ allow_next_instance_of(Gitlab::Tracking::Destinations::Snowplow) do |instance|
+ allow(instance).to receive(:event)
+ end
+ allow(YAML).to receive(:load_file).with(Rails.root.join('config/events/filename.yml')).and_return(test_definition)
+ end
+
+ it 'dispatchs the data to .event' do
+ project = build_stubbed(:project)
+ user = build_stubbed(:user)
+
+ expect(described_class).to receive(:event) do |category, action, args|
+ expect(category).to eq(definition_category)
+ expect(action).to eq(definition_action)
+ expect(args[:label]).to eq('label')
+ expect(args[:property]).to eq('...')
+ expect(args[:project]).to eq(project)
+ expect(args[:user]).to eq(user)
+ expect(args[:namespace]).to eq(namespace)
+ expect(args[:extra_key_1]).to eq('extra value 1')
+ end
+
+ described_class.definition('filename', category: nil, action: nil, label: 'label', property: '...',
+ project: project, user: user, namespace: namespace, extra_key_1: 'extra value 1')
+ end
+ end
end
diff --git a/spec/lib/gitlab/url_sanitizer_spec.rb b/spec/lib/gitlab/url_sanitizer_spec.rb
index aba4ca109a9..0ffbf5f81e7 100644
--- a/spec/lib/gitlab/url_sanitizer_spec.rb
+++ b/spec/lib/gitlab/url_sanitizer_spec.rb
@@ -139,6 +139,23 @@ RSpec.describe Gitlab::UrlSanitizer do
it { is_expected.to eq(credentials) }
end
end
+
+ context 'with mixed credentials' do
+ where(:url, :credentials, :result) do
+ 'http://a@example.com' | { password: 'd' } | { user: 'a', password: 'd' }
+ 'http://a:b@example.com' | { password: 'd' } | { user: 'a', password: 'd' }
+ 'http://:b@example.com' | { password: 'd' } | { user: nil, password: 'd' }
+ 'http://a@example.com' | { user: 'c' } | { user: 'c', password: nil }
+ 'http://a:b@example.com' | { user: 'c' } | { user: 'c', password: 'b' }
+ 'http://a:b@example.com' | { user: '' } | { user: 'a', password: 'b' }
+ end
+
+ with_them do
+ subject { described_class.new(url, credentials: credentials).credentials }
+
+ it { is_expected.to eq(result) }
+ end
+ end
end
describe '#user' do
diff --git a/spec/lib/gitlab/usage/service_ping_report_spec.rb b/spec/lib/gitlab/usage/service_ping_report_spec.rb
index 1f62ddd0bbb..b6119ab52ec 100644
--- a/spec/lib/gitlab/usage/service_ping_report_spec.rb
+++ b/spec/lib/gitlab/usage/service_ping_report_spec.rb
@@ -7,119 +7,86 @@ RSpec.describe Gitlab::Usage::ServicePingReport, :use_clean_rails_memory_store_c
let(:usage_data) { { uuid: "1111", counts: { issue: 0 } } }
- context 'when feature merge_service_ping_instrumented_metrics enabled' do
- before do
- stub_feature_flags(merge_service_ping_instrumented_metrics: true)
+ before do
+ allow_next_instance_of(Gitlab::Usage::ServicePing::PayloadKeysProcessor) do |instance|
+ allow(instance).to receive(:missing_key_paths).and_return([])
+ end
- allow_next_instance_of(Gitlab::Usage::ServicePing::PayloadKeysProcessor) do |instance|
- allow(instance).to receive(:missing_key_paths).and_return([])
- end
+ allow_next_instance_of(Gitlab::Usage::ServicePing::InstrumentedPayload) do |instance|
+ allow(instance).to receive(:build).and_return({})
+ end
+ end
- allow_next_instance_of(Gitlab::Usage::ServicePing::InstrumentedPayload) do |instance|
- allow(instance).to receive(:build).and_return({})
- end
+ context 'all_metrics_values' do
+ it 'generates the service ping when there are no missing values' do
+ expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
+ expect(described_class.for(output: :all_metrics_values)).to eq({ uuid: "1111", counts: { issue: 0 } })
end
- context 'all_metrics_values' do
- it 'generates the service ping when there are no missing values' do
- expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
- expect(described_class.for(output: :all_metrics_values)).to eq({ uuid: "1111", counts: { issue: 0 } })
+ it 'generates the service ping with the missing values' do
+ expect_next_instance_of(Gitlab::Usage::ServicePing::PayloadKeysProcessor, usage_data) do |instance|
+ expect(instance).to receive(:missing_instrumented_metrics_key_paths).and_return(['counts.boards'])
end
- it 'generates the service ping with the missing values' do
- expect_next_instance_of(Gitlab::Usage::ServicePing::PayloadKeysProcessor, usage_data) do |instance|
- expect(instance).to receive(:missing_instrumented_metrics_key_paths).and_return(['counts.boards'])
- end
-
- expect_next_instance_of(Gitlab::Usage::ServicePing::InstrumentedPayload, ['counts.boards'], :with_value) do |instance|
- expect(instance).to receive(:build).and_return({ counts: { boards: 1 } })
- end
-
- expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
- expect(described_class.for(output: :all_metrics_values)).to eq({ uuid: "1111", counts: { issue: 0, boards: 1 } })
+ expect_next_instance_of(Gitlab::Usage::ServicePing::InstrumentedPayload, ['counts.boards'], :with_value) do |instance|
+ expect(instance).to receive(:build).and_return({ counts: { boards: 1 } })
end
- end
-
- context 'for output: :metrics_queries' do
- it 'generates the service ping' do
- expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
- described_class.for(output: :metrics_queries)
- end
+ expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
+ expect(described_class.for(output: :all_metrics_values)).to eq({ uuid: "1111", counts: { issue: 0, boards: 1 } })
end
+ end
- context 'for output: :non_sql_metrics_values' do
- it 'generates the service ping' do
- expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
+ context 'for output: :metrics_queries' do
+ it 'generates the service ping' do
+ expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
- described_class.for(output: :non_sql_metrics_values)
- end
+ described_class.for(output: :metrics_queries)
end
+ end
- context 'when using cached' do
- context 'for cached: true' do
- let(:new_usage_data) { { uuid: "1112" } }
-
- it 'caches the values' do
- allow(Gitlab::UsageData).to receive(:data).and_return(usage_data, new_usage_data)
+ context 'for output: :non_sql_metrics_values' do
+ it 'generates the service ping' do
+ expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
- expect(described_class.for(output: :all_metrics_values)).to eq(usage_data)
- expect(described_class.for(output: :all_metrics_values, cached: true)).to eq(usage_data)
+ described_class.for(output: :non_sql_metrics_values)
+ end
+ end
- expect(Rails.cache.fetch('usage_data')).to eq(usage_data)
- end
+ context 'when using cached' do
+ context 'for cached: true' do
+ let(:new_usage_data) { { uuid: "1112" } }
- it 'writes to cache and returns fresh data' do
- allow(Gitlab::UsageData).to receive(:data).and_return(usage_data, new_usage_data)
+ it 'caches the values' do
+ allow(Gitlab::UsageData).to receive(:data).and_return(usage_data, new_usage_data)
- expect(described_class.for(output: :all_metrics_values)).to eq(usage_data)
- expect(described_class.for(output: :all_metrics_values)).to eq(new_usage_data)
- expect(described_class.for(output: :all_metrics_values, cached: true)).to eq(new_usage_data)
+ expect(described_class.for(output: :all_metrics_values)).to eq(usage_data)
+ expect(described_class.for(output: :all_metrics_values, cached: true)).to eq(usage_data)
- expect(Rails.cache.fetch('usage_data')).to eq(new_usage_data)
- end
+ expect(Rails.cache.fetch('usage_data')).to eq(usage_data)
end
- context 'when no caching' do
- let(:new_usage_data) { { uuid: "1112" } }
-
- it 'returns fresh data' do
- allow(Gitlab::UsageData).to receive(:data).and_return(usage_data, new_usage_data)
-
- expect(described_class.for(output: :all_metrics_values)).to eq(usage_data)
- expect(described_class.for(output: :all_metrics_values)).to eq(new_usage_data)
-
- expect(Rails.cache.fetch('usage_data')).to eq(new_usage_data)
- end
- end
- end
- end
+ it 'writes to cache and returns fresh data' do
+ allow(Gitlab::UsageData).to receive(:data).and_return(usage_data, new_usage_data)
- context 'when feature merge_service_ping_instrumented_metrics disabled' do
- before do
- stub_feature_flags(merge_service_ping_instrumented_metrics: false)
- end
+ expect(described_class.for(output: :all_metrics_values)).to eq(usage_data)
+ expect(described_class.for(output: :all_metrics_values)).to eq(new_usage_data)
+ expect(described_class.for(output: :all_metrics_values, cached: true)).to eq(new_usage_data)
- context 'all_metrics_values' do
- it 'generates the service ping when there are no missing values' do
- expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
- expect(described_class.for(output: :all_metrics_values)).to eq({ uuid: "1111", counts: { issue: 0 } })
+ expect(Rails.cache.fetch('usage_data')).to eq(new_usage_data)
end
end
- context 'for output: :metrics_queries' do
- it 'generates the service ping' do
- expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
+ context 'when no caching' do
+ let(:new_usage_data) { { uuid: "1112" } }
- described_class.for(output: :metrics_queries)
- end
- end
+ it 'returns fresh data' do
+ allow(Gitlab::UsageData).to receive(:data).and_return(usage_data, new_usage_data)
- context 'for output: :non_sql_metrics_values' do
- it 'generates the service ping' do
- expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
+ expect(described_class.for(output: :all_metrics_values)).to eq(usage_data)
+ expect(described_class.for(output: :all_metrics_values)).to eq(new_usage_data)
- described_class.for(output: :non_sql_metrics_values)
+ expect(Rails.cache.fetch('usage_data')).to eq(new_usage_data)
end
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 222198a58ac..6a37bfd106d 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
@@ -5,30 +5,52 @@ require 'spec_helper'
RSpec.describe Gitlab::UsageDataCounters::CiTemplateUniqueCounter do
describe '.track_unique_project_event' do
using RSpec::Parameterized::TableSyntax
+ include SnowplowHelpers
- let(:project_id) { 1 }
+ let(:project) { build(:project) }
+ let(:user) { build(:user) }
shared_examples 'tracks template' do
+ let(:subject) { described_class.track_unique_project_event(project: project, template: template_path, config_source: config_source, user: user) }
+
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
- )
+ subject
end.not_to raise_error
end
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)
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).to(receive(:track_event)).with(expected_template_event_name, values: project.id)
+
+ subject
+ end
+
+ context 'Snowplow' do
+ it 'event is not tracked if FF is disabled' do
+ stub_feature_flags(route_hll_to_snowplow: false)
+
+ subject
- described_class.track_unique_project_event(project_id: project_id, template: template_path, config_source: config_source)
+ expect_no_snowplow_event
+ end
+
+ it 'tracks event' do
+ subject
+
+ expect_snowplow_event(
+ category: described_class.to_s,
+ action: 'ci_templates_unique',
+ namespace: project.namespace,
+ user: user,
+ project: project
+ )
+ end
end
end
- context 'with explicit includes' do
+ context 'with explicit includes', :snowplow do
let(:config_source) { :repository_source }
(described_class.ci_templates - ['Verify/Browser-Performance.latest.gitlab-ci.yml', 'Verify/Browser-Performance.gitlab-ci.yml']).each do |template|
@@ -40,7 +62,7 @@ RSpec.describe Gitlab::UsageDataCounters::CiTemplateUniqueCounter do
end
end
- context 'with implicit includes' do
+ context 'with implicit includes', :snowplow do
let(:config_source) { :auto_devops_source }
[
@@ -60,7 +82,7 @@ RSpec.describe Gitlab::UsageDataCounters::CiTemplateUniqueCounter do
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)
+ described_class.track_unique_project_event(project: project, template: 'Dependency-Scanning.gitlab-ci.yml', config_source: :repository_source, user: user)
end.not_to raise_error
end
end
diff --git a/spec/lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter_spec.rb
new file mode 100644
index 00000000000..d6eb67e5c35
--- /dev/null
+++ b/spec/lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::UsageDataCounters::GitLabCliActivityUniqueCounter, :clean_gitlab_redis_shared_state do # rubocop:disable RSpec/FilePath
+ let(:user1) { build(:user, id: 1) }
+ let(:user2) { build(:user, id: 2) }
+ let(:time) { Time.current }
+ let(:action) { described_class::GITLAB_CLI_API_REQUEST_ACTION }
+ let(:user_agent) { { user_agent: 'GLab - GitLab CLI' } }
+
+ context 'when tracking a gitlab cli request' do
+ it_behaves_like 'a request from an extension'
+ end
+end
diff --git a/spec/lib/gitlab/usage_data_queries_spec.rb b/spec/lib/gitlab/usage_data_queries_spec.rb
index c3ac9d7db90..88322e1b971 100644
--- a/spec/lib/gitlab/usage_data_queries_spec.rb
+++ b/spec/lib/gitlab/usage_data_queries_spec.rb
@@ -34,14 +34,14 @@ RSpec.describe Gitlab::UsageDataQueries do
describe '.redis_usage_data' do
subject(:redis_usage_data) { described_class.redis_usage_data { 42 } }
- it 'returns a class for redis_usage_data with a counter call' do
+ it 'returns a stringified class for redis_usage_data with a counter call' do
expect(described_class.redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter))
- .to eq(redis_usage_data_counter: Gitlab::UsageDataCounters::WikiPageCounter)
+ .to eq(redis_usage_data_counter: "Gitlab::UsageDataCounters::WikiPageCounter")
end
- it 'returns a stringified block for redis_usage_data with a block' do
+ it 'returns a placeholder string for redis_usage_data with a block' do
is_expected.to include(:redis_usage_data_block)
- expect(redis_usage_data[:redis_usage_data_block]).to start_with('#<Proc:')
+ expect(redis_usage_data[:redis_usage_data_block]).to eq('non-SQL usage data block')
end
end
@@ -53,8 +53,8 @@ RSpec.describe Gitlab::UsageDataQueries do
.to eq(alt_usage_data_value: 1)
end
- it 'returns a stringified block for alt_usage_data with a block' do
- expect(alt_usage_data[:alt_usage_data_block]).to start_with('#<Proc:')
+ it 'returns a placeholder string for alt_usage_data with a block' do
+ expect(alt_usage_data[:alt_usage_data_block]).to eq('non-SQL usage data block')
end
end
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index 958df7baf72..8a919a0a72e 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -166,7 +166,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(described_class.usage_activity_by_stage_create({})).to include(
deploy_keys: 2,
keys: 2,
- merge_requests: 2,
projects_with_disable_overriding_approvers_per_merge_request: 2,
projects_without_disable_overriding_approvers_per_merge_request: 6,
remote_mirrors: 2,
@@ -175,7 +174,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(described_class.usage_activity_by_stage_create(described_class.monthly_time_range_db_params)).to include(
deploy_keys: 1,
keys: 1,
- merge_requests: 1,
projects_with_disable_overriding_approvers_per_merge_request: 1,
projects_without_disable_overriding_approvers_per_merge_request: 3,
remote_mirrors: 1,
@@ -507,10 +505,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
end
it 'gathers usage counts', :aggregate_failures do
- stub_feature_flags(merge_service_ping_instrumented_metrics: false)
-
count_data = subject[:counts]
- expect(count_data[:boards]).to eq(1)
expect(count_data[:projects]).to eq(4)
expect(count_data.keys).to include(*UsageDataHelpers::COUNTS_KEYS)
expect(UsageDataHelpers::COUNTS_KEYS - count_data.keys).to be_empty
diff --git a/spec/lib/gitlab/utils/delegator_override/validator_spec.rb b/spec/lib/gitlab/utils/delegator_override/validator_spec.rb
index 4cd1b18de82..a58bc65c708 100644
--- a/spec/lib/gitlab/utils/delegator_override/validator_spec.rb
+++ b/spec/lib/gitlab/utils/delegator_override/validator_spec.rb
@@ -47,6 +47,15 @@ RSpec.describe Gitlab::Utils::DelegatorOverride::Validator do
expect(validator.target_classes).to contain_exactly(target_class)
end
+
+ it 'adds all descendants of the target' do
+ child_class1 = Class.new(target_class)
+ child_class2 = Class.new(target_class)
+ grandchild_class = Class.new(child_class2)
+ validator.add_target(target_class)
+
+ expect(validator.target_classes).to contain_exactly(target_class, child_class1, child_class2, grandchild_class)
+ end
end
describe '#expand_on_ancestors' do
diff --git a/spec/lib/gitlab/view/presenter/base_spec.rb b/spec/lib/gitlab/view/presenter/base_spec.rb
index a7083bd2722..afb44c0d298 100644
--- a/spec/lib/gitlab/view/presenter/base_spec.rb
+++ b/spec/lib/gitlab/view/presenter/base_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::View::Presenter::Base do
let(:project) { double(:project) }
let(:presenter_class) do
- Struct.new(:subject).include(described_class)
+ Struct.new(:__subject__).include(described_class)
end
describe '.presenter?' do
@@ -17,17 +17,24 @@ RSpec.describe Gitlab::View::Presenter::Base do
end
describe '.presents' do
- it 'exposes #subject with the given keyword' do
- 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 specifies a custom keyword' do
+ subject(:presenter) { presenter_class.new(project) }
+
+ before do
+ presenter_class.class_eval do
+ presents Object, as: :foo
+ end
+ end
+
+ it 'exposes the subject with the given keyword' do
+ expect(presenter.foo).to be(project)
+ end
+ end
+
context 'when the presenter class inherits Presenter::Delegated' do
let(:presenter_class) do
Class.new(::Gitlab::View::Presenter::Delegated) do
@@ -50,13 +57,22 @@ RSpec.describe Gitlab::View::Presenter::Base do
end
it 'does not set the delegator target' do
- expect(presenter_class).not_to receive(:delegator_target).with(Object)
+ expect(presenter_class).not_to receive(:delegator_target)
presenter_class.presents(Object, as: :foo)
end
end
end
+ describe '#__subject__' do
+ it 'returns the subject' do
+ subject = double
+ presenter = presenter_class.new(subject)
+
+ expect(presenter.__subject__).to be(subject)
+ end
+ end
+
describe '#can?' do
context 'user is not allowed' do
it 'returns false' do
diff --git a/spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb b/spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb
index f8c4a28ed45..7d96adf95e8 100644
--- a/spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb
+++ b/spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb
@@ -132,7 +132,7 @@ RSpec.describe Gitlab::WebIde::Config::Entry::Terminal do
{ before_script: %w[ls pwd],
script: 'sleep 100',
tags: ['webide'],
- image: 'ruby:3.0',
+ image: 'image:1.0',
services: ['mysql'],
variables: { KEY: 'value' } }
end
@@ -143,7 +143,7 @@ RSpec.describe Gitlab::WebIde::Config::Entry::Terminal do
tag_list: ['webide'],
job_variables: [{ key: 'KEY', value: 'value', public: true }],
options: {
- image: { name: "ruby:3.0" },
+ image: { name: "image:1.0" },
services: [{ name: "mysql" }],
before_script: %w[ls pwd],
script: ['sleep 100']
diff --git a/spec/lib/gitlab/web_ide/config_spec.rb b/spec/lib/gitlab/web_ide/config_spec.rb
index 7ee9d40410c..11ea6150719 100644
--- a/spec/lib/gitlab/web_ide/config_spec.rb
+++ b/spec/lib/gitlab/web_ide/config_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Gitlab::WebIde::Config do
let(:yml) do
<<-EOS
terminal:
- image: ruby:2.7
+ image: image:1.0
before_script:
- gem install rspec
EOS
@@ -21,7 +21,7 @@ RSpec.describe Gitlab::WebIde::Config do
it 'returns hash created from string' do
hash = {
terminal: {
- image: 'ruby:2.7',
+ image: 'image:1.0',
before_script: ['gem install rspec']
}
}
diff --git a/spec/lib/gitlab/workhorse_spec.rb b/spec/lib/gitlab/workhorse_spec.rb
index 3bab9aec454..91ab0a53c6c 100644
--- a/spec/lib/gitlab/workhorse_spec.rb
+++ b/spec/lib/gitlab/workhorse_spec.rb
@@ -448,6 +448,14 @@ RSpec.describe Gitlab::Workhorse do
end
end
+ describe '.detect_content_type' do
+ subject { described_class.detect_content_type }
+
+ it 'returns array setting detect content type in workhorse' do
+ expect(subject).to eq(%w[Gitlab-Workhorse-Detect-Content-Type true])
+ end
+ end
+
describe '.send_git_blob' do
include FakeBlobHelpers
diff --git a/spec/lib/mattermost/session_spec.rb b/spec/lib/mattermost/session_spec.rb
index e2e1b4c28c7..2158076e4b5 100644
--- a/spec/lib/mattermost/session_spec.rb
+++ b/spec/lib/mattermost/session_spec.rb
@@ -35,6 +35,12 @@ RSpec.describe Mattermost::Session, type: :request do
it 'makes a request to the oauth uri' do
expect { subject.with_session }.to raise_error(::Mattermost::NoSessionError)
end
+
+ it 'returns nill on calling a non exisitng method on request' do
+ return_value = subject.request.method_missing("non_existing_method", "something") do
+ end
+ expect(return_value).to be(nil)
+ end
end
context 'with oauth_uri' do
diff --git a/spec/lib/prometheus/cleanup_multiproc_dir_service_spec.rb b/spec/lib/prometheus/cleanup_multiproc_dir_service_spec.rb
index db77a5d42d8..bdf9673a53f 100644
--- a/spec/lib/prometheus/cleanup_multiproc_dir_service_spec.rb
+++ b/spec/lib/prometheus/cleanup_multiproc_dir_service_spec.rb
@@ -1,32 +1,27 @@
# frozen_string_literal: true
-require 'spec_helper'
+require 'fast_spec_helper'
RSpec.describe Prometheus::CleanupMultiprocDirService do
- describe '.call' do
- subject { described_class.new.execute }
-
+ describe '#execute' do
let(:metrics_multiproc_dir) { Dir.mktmpdir }
let(:metrics_file_path) { File.join(metrics_multiproc_dir, 'counter_puma_master-0.db') }
+ subject(:service) { described_class.new(metrics_dir_arg).execute }
+
before do
FileUtils.touch(metrics_file_path)
end
after do
- FileUtils.rm_r(metrics_multiproc_dir)
+ FileUtils.rm_rf(metrics_multiproc_dir)
end
context 'when `multiprocess_files_dir` is defined' do
- before do
- expect(Prometheus::Client.configuration)
- .to receive(:multiprocess_files_dir)
- .and_return(metrics_multiproc_dir)
- .at_least(:once)
- end
+ let(:metrics_dir_arg) { metrics_multiproc_dir }
it 'removes old metrics' do
- expect { subject }
+ expect { service }
.to change { File.exist?(metrics_file_path) }
.from(true)
.to(false)
@@ -34,15 +29,10 @@ RSpec.describe Prometheus::CleanupMultiprocDirService do
end
context 'when `multiprocess_files_dir` is not defined' do
- before do
- expect(Prometheus::Client.configuration)
- .to receive(:multiprocess_files_dir)
- .and_return(nil)
- .at_least(:once)
- end
+ let(:metrics_dir_arg) { nil }
it 'does not remove any files' do
- expect { subject }
+ expect { service }
.not_to change { File.exist?(metrics_file_path) }
.from(true)
end
diff --git a/spec/lib/sidebars/groups/menus/group_information_menu_spec.rb b/spec/lib/sidebars/groups/menus/group_information_menu_spec.rb
index b68af6fb8ab..5f67ee11970 100644
--- a/spec/lib/sidebars/groups/menus/group_information_menu_spec.rb
+++ b/spec/lib/sidebars/groups/menus/group_information_menu_spec.rb
@@ -28,6 +28,20 @@ RSpec.describe Sidebars::Groups::Menus::GroupInformationMenu do
end
end
+ describe '#sprite_icon' do
+ subject { described_class.new(context).sprite_icon }
+
+ context 'when group is a root group' do
+ specify { is_expected.to eq 'group'}
+ end
+
+ context 'when group is a child group' do
+ let(:group) { build(:group, parent: root_group) }
+
+ specify { is_expected.to eq 'subgroup'}
+ end
+ end
+
describe 'Menu Items' do
subject { described_class.new(context).renderable_items.index { |e| e.item_id == item_id } }
diff --git a/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb b/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb
index 8a6b0e4e95d..81114f5a0b3 100644
--- a/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb
@@ -112,6 +112,38 @@ RSpec.describe Sidebars::Projects::Menus::InfrastructureMenu do
let(:item_id) { :google_cloud }
it_behaves_like 'access rights checks'
+
+ context 'when feature flag is turned off globally' do
+ before do
+ stub_feature_flags(incubation_5mp_google_cloud: false)
+ end
+
+ it { is_expected.to be_nil }
+
+ context 'when feature flag is enabled for specific project' do
+ before do
+ stub_feature_flags(incubation_5mp_google_cloud: project)
+ end
+
+ it_behaves_like 'access rights checks'
+ end
+
+ context 'when feature flag is enabled for specific group' do
+ before do
+ stub_feature_flags(incubation_5mp_google_cloud: project.group)
+ end
+
+ it_behaves_like 'access rights checks'
+ end
+
+ context 'when feature flag is enabled for specific project' do
+ before do
+ stub_feature_flags(incubation_5mp_google_cloud: user)
+ end
+
+ it_behaves_like 'access rights checks'
+ end
+ end
end
end
end
diff --git a/spec/lib/sidebars/projects/panel_spec.rb b/spec/lib/sidebars/projects/panel_spec.rb
index 7e69a2dfe52..ff253eedd08 100644
--- a/spec/lib/sidebars/projects/panel_spec.rb
+++ b/spec/lib/sidebars/projects/panel_spec.rb
@@ -17,16 +17,40 @@ RSpec.describe Sidebars::Projects::Panel do
subject { described_class.new(context).instance_variable_get(:@menus) }
context 'when integration is present and active' do
- let_it_be(:confluence) { create(:confluence_integration, active: true) }
+ context 'confluence only' do
+ let_it_be(:confluence) { create(:confluence_integration, active: true) }
- let(:project) { confluence.project }
+ let(:project) { confluence.project }
- it 'contains Confluence menu item' do
- expect(subject.index { |i| i.is_a?(Sidebars::Projects::Menus::ConfluenceMenu) }).not_to be_nil
+ it 'contains Confluence menu item' do
+ expect(subject.index { |i| i.is_a?(Sidebars::Projects::Menus::ConfluenceMenu) }).not_to be_nil
+ end
+
+ it 'does not contain Wiki menu item' do
+ expect(subject.index { |i| i.is_a?(Sidebars::Projects::Menus::WikiMenu) }).to be_nil
+ end
end
- it 'does not contain Wiki menu item' do
- expect(subject.index { |i| i.is_a?(Sidebars::Projects::Menus::WikiMenu) }).to be_nil
+ context 'shimo only' do
+ let_it_be(:shimo) { create(:shimo_integration, active: true) }
+
+ let(:project) { shimo.project }
+
+ it 'contains Shimo menu item' do
+ expect(subject.index { |i| i.is_a?(Sidebars::Projects::Menus::ShimoMenu) }).not_to be_nil
+ end
+ end
+
+ context 'confluence & shimo' do
+ let_it_be(:confluence) { create(:confluence_integration, active: true) }
+ let_it_be(:shimo) { create(:shimo_integration, active: true) }
+
+ let(:project) { confluence.project }
+
+ it 'contains Confluence menu item, not Shimo' do
+ expect(subject.index { |i| i.is_a?(Sidebars::Projects::Menus::ConfluenceMenu) }).not_to be_nil
+ expect(subject.index { |i| i.is_a?(Sidebars::Projects::Menus::ShimoMenu) }).to be_nil
+ end
end
end
diff --git a/spec/lib/system_check/app/git_user_default_ssh_config_check_spec.rb b/spec/lib/system_check/app/git_user_default_ssh_config_check_spec.rb
index 2c996635c36..7c9fbe152cc 100644
--- a/spec/lib/system_check/app/git_user_default_ssh_config_check_spec.rb
+++ b/spec/lib/system_check/app/git_user_default_ssh_config_check_spec.rb
@@ -71,7 +71,31 @@ RSpec.describe SystemCheck::App::GitUserDefaultSSHConfigCheck do
end
end
+ describe '#show_error' do
+ subject(:show_error) { described_class.new.show_error }
+
+ before do
+ stub_user
+ stub_home_dir
+ stub_ssh_file(forbidden_file)
+ end
+
+ it 'outputs error information' do
+ expected = %r{
+ Try\ fixing\ it:\s+
+ mkdir\ ~/gitlab-check-backup-(.+)\s+
+ sudo\ mv\ (.+)\s+
+ For\ more\ information\ see:\s+
+ doc/user/ssh\.md\#overriding-ssh-settings-on-the-gitlab-server\s+
+ Please\ fix\ the\ error\ above\ and\ rerun\ the\ checks
+ }x
+
+ expect { show_error }.to output(expected).to_stdout
+ end
+ end
+
def stub_user
+ allow(File).to receive(:expand_path).and_call_original
allow(File).to receive(:expand_path).with("~#{username}").and_return(home_dir)
end
diff --git a/spec/mailers/emails/in_product_marketing_spec.rb b/spec/mailers/emails/in_product_marketing_spec.rb
index 720e6f101a8..e62719f4283 100644
--- a/spec/mailers/emails/in_product_marketing_spec.rb
+++ b/spec/mailers/emails/in_product_marketing_spec.rb
@@ -69,7 +69,6 @@ RSpec.describe Emails::InProductMarketing do
:team_short | 0
:trial_short | 0
:admin_verify | 0
- :invite_team | 0
end
with_them do
@@ -99,11 +98,7 @@ RSpec.describe Emails::InProductMarketing do
is_expected.not_to have_body_text(CGI.unescapeHTML(message.invite_link))
end
- if track == :invite_team
- is_expected.not_to have_body_text(/This is email \d of \d/)
- else
- is_expected.to have_body_text(message.progress)
- end
+ is_expected.to have_body_text(message.progress)
end
end
end
diff --git a/spec/mailers/emails/profile_spec.rb b/spec/mailers/emails/profile_spec.rb
index 87776457473..f4483f7e8f5 100644
--- a/spec/mailers/emails/profile_spec.rb
+++ b/spec/mailers/emails/profile_spec.rb
@@ -416,4 +416,27 @@ RSpec.describe Emails::Profile do
is_expected.to have_body_text /#{profile_two_factor_auth_path}/
end
end
+
+ describe 'added a new email address' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:email) { create(:email, user: user) }
+
+ subject { Notify.new_email_address_added_email(user, email) }
+
+ it_behaves_like 'an email sent from GitLab'
+ it_behaves_like 'it should not have Gmail Actions links'
+ it_behaves_like 'a user cannot unsubscribe through footer link'
+
+ it 'is sent to the user' do
+ is_expected.to deliver_to user.email
+ end
+
+ it 'has the correct subject' do
+ is_expected.to have_subject /^New email address added$/i
+ end
+
+ it 'includes a link to the email address page' do
+ is_expected.to have_body_text /#{profile_emails_path}/
+ end
+ end
end
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index 978118ed1b1..b6ad66f41b5 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -317,6 +317,9 @@ RSpec.describe Notify do
end
context 'for merge requests' do
+ let(:push_user) { create(:user) }
+ let(:commit_limit) { NotificationService::NEW_COMMIT_EMAIL_DISPLAY_LIMIT }
+
describe 'that are new' do
subject { described_class.new_merge_request_email(merge_request.assignee_ids.first, merge_request.id) }
@@ -457,12 +460,6 @@ RSpec.describe Notify do
end
shared_examples 'a push to an existing merge request' do
- let(:push_user) { create(:user) }
-
- subject do
- described_class.push_to_merge_request_email(recipient.id, merge_request.id, push_user.id, new_commits: merge_request.commits, existing_commits: existing_commits)
- end
-
it_behaves_like 'a multiple recipients email'
it_behaves_like 'an answer to an existing thread with reply-by-email enabled' do
let(:model) { merge_request }
@@ -487,16 +484,136 @@ RSpec.describe Notify do
end
end
- describe 'that have new commits' do
- let(:existing_commits) { [] }
+ shared_examples 'shows the compare url between first and last commits' do |count|
+ it 'shows the compare url between first and last commits' do
+ commit_id_1 = existing_commits.first[:short_id]
+ commit_id_2 = existing_commits.last[:short_id]
+
+ is_expected.to have_link("#{commit_id_1}...#{commit_id_2}", href: project_compare_url(project, from: commit_id_1, to: commit_id_2))
+ is_expected.to have_body_text("#{count} commits from branch `#{merge_request.target_branch}`")
+ end
+ end
+
+ shared_examples 'shows new commit urls' do |count|
+ it 'shows new commit urls' do
+ displayed_new_commits.each do |commit|
+ is_expected.to have_link(commit[:short_id], href: project_commit_url(project, commit[:short_id]))
+ is_expected.to have_body_text(commit[:title])
+ end
+ end
+
+ it 'does not show hidden new commit urls' do
+ hidden_new_commits.each do |commit|
+ is_expected.not_to have_link(commit[:short_id], href: project_commit_url(project, commit[:short_id]))
+ is_expected.not_to have_body_text(commit[:title])
+ end
+ end
+ end
+
+ describe 'that have no new commits' do
+ subject do
+ described_class.push_to_merge_request_email(recipient.id, merge_request.id, push_user.id, new_commits: [], total_new_commits_count: 0, existing_commits: [], total_existing_commits_count: 0)
+ end
it_behaves_like 'a push to an existing merge request'
end
+ describe 'that have fewer than the commit truncation limit' do
+ let(:new_commits) { merge_request.commits }
+ let(:displayed_new_commits) { new_commits }
+ let(:hidden_new_commits) { [] }
+
+ subject do
+ described_class.push_to_merge_request_email(
+ recipient.id, merge_request.id, push_user.id,
+ new_commits: new_commits, total_new_commits_count: new_commits.length,
+ existing_commits: [], total_existing_commits_count: 0
+ )
+ end
+
+ it_behaves_like 'a push to an existing merge request'
+ it_behaves_like 'shows new commit urls'
+ end
+
+ describe 'that have more than the commit truncation limit' do
+ let(:new_commits) do
+ Array.new(commit_limit + 10) do |i|
+ {
+ short_id: SecureRandom.hex(4),
+ title: "This is commit #{i}"
+ }
+ end
+ end
+
+ let(:displayed_new_commits) { new_commits.first(commit_limit) }
+ let(:hidden_new_commits) { new_commits.last(10) }
+
+ subject do
+ described_class.push_to_merge_request_email(
+ recipient.id, merge_request.id, push_user.id,
+ new_commits: displayed_new_commits, total_new_commits_count: commit_limit + 10,
+ existing_commits: [], total_existing_commits_count: 0
+ )
+ end
+
+ it_behaves_like 'a push to an existing merge request'
+ it_behaves_like 'shows new commit urls'
+
+ it 'shows "and more" message' do
+ is_expected.to have_body_text("And 10 more")
+ end
+ end
+
describe 'that have new commits on top of an existing one' do
let(:existing_commits) { [merge_request.commits.first] }
+ subject do
+ described_class.push_to_merge_request_email(
+ recipient.id, merge_request.id, push_user.id,
+ new_commits: merge_request.commits, total_new_commits_count: merge_request.commits.length,
+ existing_commits: existing_commits, total_existing_commits_count: existing_commits.length
+ )
+ end
+
+ it_behaves_like 'a push to an existing merge request'
+
+ it 'shows the existing commit' do
+ commit_id = existing_commits.first.short_id
+ is_expected.to have_link(commit_id, href: project_commit_url(project, commit_id))
+ is_expected.to have_body_text("1 commit from branch `#{merge_request.target_branch}`")
+ end
+ end
+
+ describe 'that have new commits on top of two existing ones' do
+ let(:existing_commits) { [merge_request.commits.first, merge_request.commits.second] }
+
+ subject do
+ described_class.push_to_merge_request_email(
+ recipient.id, merge_request.id, push_user.id,
+ new_commits: merge_request.commits, total_new_commits_count: merge_request.commits.length,
+ existing_commits: existing_commits, total_existing_commits_count: existing_commits.length
+ )
+ end
+
+ it_behaves_like 'a push to an existing merge request'
+ it_behaves_like 'shows the compare url between first and last commits', 2
+ end
+
+ describe 'that have new commits on top of more than two existing ones' do
+ let(:existing_commits) do
+ [merge_request.commits.first] + [double(:commit)] * 3 + [merge_request.commits.second]
+ end
+
+ subject do
+ described_class.push_to_merge_request_email(
+ recipient.id, merge_request.id, push_user.id,
+ new_commits: merge_request.commits, total_new_commits_count: merge_request.commits.length,
+ existing_commits: existing_commits, total_existing_commits_count: existing_commits.length
+ )
+ end
+
it_behaves_like 'a push to an existing merge request'
+ it_behaves_like 'shows the compare url between first and last commits', 5
end
end
@@ -2064,14 +2181,46 @@ RSpec.describe Notify do
context 'when diff note' do
let!(:notes) { create_list(:diff_note_on_merge_request, 3, review: review, project: project, author: review.author, noteable: merge_request) }
- it 'links to notes' do
+ it 'links to notes and discussions', :aggregate_failures do
+ reply_note = create(:diff_note_on_merge_request, review: review, project: project, author: review.author, noteable: merge_request, in_reply_to: notes.first)
+
review.notes.each do |note|
# Text part
expect(subject.text_part.body.raw_source).to include(
project_merge_request_url(project, merge_request, anchor: "note_#{note.id}")
)
+
+ if note == reply_note
+ expect(subject.text_part.body.raw_source).to include("commented on a discussion on #{note.discussion.file_path}")
+ else
+ expect(subject.text_part.body.raw_source).to include("started a new discussion on #{note.discussion.file_path}")
+ end
end
end
+
+ it 'includes only one link to the highlighted_diff_email' do
+ expect(subject.html_part.body.raw_source).to include('assets/mailers/highlighted_diff_email').once
+ end
+
+ it 'avoids N+1 cached queries when rendering html', :use_sql_query_cache, :request_store do
+ control_count = ActiveRecord::QueryRecorder.new(query_recorder_debug: true, skip_cached: false) do
+ subject.html_part
+ end
+
+ create_list(:diff_note_on_merge_request, 3, review: review, project: project, author: review.author, noteable: merge_request)
+
+ expect { described_class.new_review_email(recipient.id, review.id).html_part }.not_to exceed_all_query_limit(control_count)
+ end
+
+ it 'avoids N+1 cached queries when rendering text', :use_sql_query_cache, :request_store do
+ control_count = ActiveRecord::QueryRecorder.new(query_recorder_debug: true, skip_cached: false) do
+ subject.text_part
+ end
+
+ create_list(:diff_note_on_merge_request, 3, review: review, project: project, author: review.author, noteable: merge_request)
+
+ expect { described_class.new_review_email(recipient.id, review.id).text_part }.not_to exceed_all_query_limit(control_count)
+ end
end
it 'contains review author name' do
diff --git a/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb b/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb
index 598da495195..ed18820ec8d 100644
--- a/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb
+++ b/spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb
@@ -36,7 +36,6 @@ RSpec.describe CopyAdoptionSnapshotNamespace, :migration, schema: 20210430124630
runner_configured: true,
pipeline_succeeded: true,
deploy_succeeded: true,
- security_scan_succeeded: true,
end_time: Time.zone.now.end_of_month
}
diff --git a/spec/migrations/20211214012507_backfill_incident_issue_escalation_statuses_spec.rb b/spec/migrations/20211214012507_backfill_incident_issue_escalation_statuses_spec.rb
index a17fee6bab2..791c0595f0e 100644
--- a/spec/migrations/20211214012507_backfill_incident_issue_escalation_statuses_spec.rb
+++ b/spec/migrations/20211214012507_backfill_incident_issue_escalation_statuses_spec.rb
@@ -10,27 +10,10 @@ RSpec.describe BackfillIncidentIssueEscalationStatuses do
let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') }
let(:project) { projects.create!(namespace_id: namespace.id) }
- before do
- stub_const("#{described_class.name}::BATCH_SIZE", 1)
- end
-
- it 'schedules jobs for incident issues' do
- issue_1 = issues.create!(project_id: project.id) # non-incident issue
- incident_1 = issues.create!(project_id: project.id, issue_type: 1)
- incident_2 = issues.create!(project_id: project.id, issue_type: 1)
-
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
+ # Backfill removed - see db/migrate/20220321234317_remove_all_issuable_escalation_statuses.rb.
+ it 'does nothing' do
+ issues.create!(project_id: project.id, issue_type: 1)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(
- 2.minutes, issue_1.id, issue_1.id)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(
- 4.minutes, incident_1.id, incident_1.id)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(
- 6.minutes, incident_2.id, incident_2.id)
- expect(BackgroundMigrationWorker.jobs.size).to eq(3)
- end
- end
+ expect { migrate! }.not_to change { BackgroundMigrationWorker.jobs.size }
end
end
diff --git a/spec/migrations/20220204095121_backfill_namespace_statistics_with_dependency_proxy_size_spec.rb b/spec/migrations/20220204095121_backfill_namespace_statistics_with_dependency_proxy_size_spec.rb
new file mode 100644
index 00000000000..39398fa058d
--- /dev/null
+++ b/spec/migrations/20220204095121_backfill_namespace_statistics_with_dependency_proxy_size_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe BackfillNamespaceStatisticsWithDependencyProxySize do
+ let_it_be(:groups) { table(:namespaces) }
+ let_it_be(:group1) { groups.create!(id: 10, name: 'test1', path: 'test1', type: 'Group') }
+ let_it_be(:group2) { groups.create!(id: 20, name: 'test2', path: 'test2', type: 'Group') }
+ let_it_be(:group3) { groups.create!(id: 30, name: 'test3', path: 'test3', type: 'Group') }
+ let_it_be(:group4) { groups.create!(id: 40, name: 'test4', path: 'test4', type: 'Group') }
+
+ let_it_be(:dependency_proxy_blobs) { table(:dependency_proxy_blobs) }
+ let_it_be(:dependency_proxy_manifests) { table(:dependency_proxy_manifests) }
+
+ let_it_be(:group1_manifest) { create_manifest(10, 10) }
+ let_it_be(:group2_manifest) { create_manifest(20, 20) }
+ let_it_be(:group3_manifest) { create_manifest(30, 30) }
+
+ let_it_be(:group1_blob) { create_blob(10, 10) }
+ let_it_be(:group2_blob) { create_blob(20, 20) }
+ let_it_be(:group3_blob) { create_blob(30, 30) }
+
+ describe '#up' do
+ it 'correctly schedules background migrations' do
+ stub_const("#{described_class}::BATCH_SIZE", 2)
+
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ aggregate_failures do
+ expect(described_class::MIGRATION)
+ .to be_scheduled_migration([10, 30], ['dependency_proxy_size'])
+
+ expect(described_class::MIGRATION)
+ .to be_scheduled_delayed_migration(2.minutes, [20], ['dependency_proxy_size'])
+
+ expect(BackgroundMigrationWorker.jobs.size).to eq(2)
+ end
+ end
+ end
+ end
+ end
+
+ def create_manifest(group_id, size)
+ dependency_proxy_manifests.create!(
+ group_id: group_id,
+ size: size,
+ file_name: 'test-file',
+ file: 'test',
+ digest: 'abc123'
+ )
+ end
+
+ def create_blob(group_id, size)
+ dependency_proxy_blobs.create!(
+ group_id: group_id,
+ size: size,
+ file_name: 'test-file',
+ file: 'test'
+ )
+ end
+end
diff --git a/spec/migrations/20220223124428_schedule_merge_topics_with_same_name_spec.rb b/spec/migrations/20220223124428_schedule_merge_topics_with_same_name_spec.rb
new file mode 100644
index 00000000000..d9f6729475c
--- /dev/null
+++ b/spec/migrations/20220223124428_schedule_merge_topics_with_same_name_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ScheduleMergeTopicsWithSameName do
+ let(:topics) { table(:topics) }
+
+ describe '#up' do
+ before do
+ stub_const("#{described_class}::BATCH_SIZE", 2)
+
+ topics.create!(name: 'topic1')
+ topics.create!(name: 'Topic2')
+ topics.create!(name: 'Topic3')
+ topics.create!(name: 'Topic4')
+ topics.create!(name: 'topic2')
+ topics.create!(name: 'topic3')
+ topics.create!(name: 'topic4')
+ topics.create!(name: 'TOPIC2')
+ topics.create!(name: 'topic5')
+ end
+
+ it 'schedules MergeTopicsWithSameName background jobs', :aggregate_failures do
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, %w[topic2 topic3])
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, %w[topic4])
+ expect(BackgroundMigrationWorker.jobs.size).to eq(2)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20220315171129_cleanup_draft_data_from_faulty_regex_spec.rb b/spec/migrations/20220315171129_cleanup_draft_data_from_faulty_regex_spec.rb
new file mode 100644
index 00000000000..925f1e573be
--- /dev/null
+++ b/spec/migrations/20220315171129_cleanup_draft_data_from_faulty_regex_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe CleanupDraftDataFromFaultyRegex do
+ let(:merge_requests) { table(:merge_requests) }
+
+ let!(:namespace) { table(:namespaces).create!(name: 'namespace', path: 'namespace') }
+ let!(:project) { table(:projects).create!(namespace_id: namespace.id) }
+
+ let(:default_mr_values) do
+ {
+ target_project_id: project.id,
+ draft: true,
+ source_branch: 'master',
+ target_branch: 'feature'
+ }
+ end
+
+ let!(:known_good_1) { merge_requests.create!(default_mr_values.merge(title: "Draft: Test Title")) }
+ let!(:known_good_2) { merge_requests.create!(default_mr_values.merge(title: "WIP: Test Title")) }
+ let!(:known_bad_1) { merge_requests.create!(default_mr_values.merge(title: "Known bad title drafts")) }
+ let!(:known_bad_2) { merge_requests.create!(default_mr_values.merge(title: "Known bad title wip")) }
+
+ describe '#up' do
+ it 'schedules CleanupDraftDataFromFaultyRegex background jobs filtering for eligble MRs' do
+ stub_const("#{described_class}::BATCH_SIZE", 2)
+ allow(Gitlab).to receive(:com?).and_return(true)
+
+ freeze_time do
+ migrate!
+
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(5.minutes, known_bad_1.id, known_bad_2.id)
+
+ expect(BackgroundMigrationWorker.jobs.size).to eq(1)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20220316202640_populate_container_repositories_migration_plan_spec.rb b/spec/migrations/20220316202640_populate_container_repositories_migration_plan_spec.rb
new file mode 100644
index 00000000000..7b5c8254163
--- /dev/null
+++ b/spec/migrations/20220316202640_populate_container_repositories_migration_plan_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe PopulateContainerRepositoriesMigrationPlan, :aggregate_failures do
+ let_it_be(:namespaces) { table(:namespaces) }
+ let_it_be(:projects) { table(:projects) }
+ let_it_be(:container_repositories) { table(:container_repositories) }
+
+ let!(:namespace) { namespaces.create!(id: 1, name: 'namespace', path: 'namespace') }
+ let!(:project) { projects.create!(id: 1, name: 'project', path: 'project', namespace_id: 1) }
+ let!(:container_repository1) { container_repositories.create!(name: 'container_repository1', project_id: 1) }
+ let!(:container_repository2) { container_repositories.create!(name: 'container_repository2', project_id: 1) }
+ let!(:container_repository3) { container_repositories.create!(name: 'container_repository3', project_id: 1) }
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+ end
+
+ it 'schedules jobs for container_repositories to populate migration_state' do
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(
+ 2.minutes, container_repository1.id, container_repository2.id)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(
+ 4.minutes, container_repository3.id, container_repository3.id)
+ expect(BackgroundMigrationWorker.jobs.size).to eq(2)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20220321234317_remove_all_issuable_escalation_statuses_spec.rb b/spec/migrations/20220321234317_remove_all_issuable_escalation_statuses_spec.rb
new file mode 100644
index 00000000000..44e20df1130
--- /dev/null
+++ b/spec/migrations/20220321234317_remove_all_issuable_escalation_statuses_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe RemoveAllIssuableEscalationStatuses do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:issues) { table(:issues) }
+ let(:statuses) { table(:incident_management_issuable_escalation_statuses) }
+ let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') }
+ let(:project) { projects.create!(namespace_id: namespace.id) }
+
+ it 'removes all escalation status records' do
+ issue = issues.create!(project_id: project.id, issue_type: 1)
+ statuses.create!(issue_id: issue.id)
+
+ expect { migrate! }.to change(statuses, :count).from(1).to(0)
+ end
+end
diff --git a/spec/migrations/20220322132242_update_pages_onboarding_state_spec.rb b/spec/migrations/20220322132242_update_pages_onboarding_state_spec.rb
new file mode 100644
index 00000000000..fbd5fe546fa
--- /dev/null
+++ b/spec/migrations/20220322132242_update_pages_onboarding_state_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+require 'spec_helper'
+require_migration!
+
+RSpec.describe UpdatePagesOnboardingState do
+ let(:migration) { described_class.new }
+ let!(:namespaces) { table(:namespaces) }
+ let!(:projects) { table(:projects) }
+ let!(:project_pages_metadata) { table(:project_pages_metadata) }
+
+ let!(:namespace1) { namespaces.create!(name: 'foo', path: 'foo') }
+ let!(:namespace2) { namespaces.create!(name: 'bar', path: 'bar') }
+ let!(:project1) { projects.create!(namespace_id: namespace1.id) }
+ let!(:project2) { projects.create!(namespace_id: namespace2.id) }
+ let!(:pages_metadata1) do
+ project_pages_metadata.create!(
+ project_id: project1.id,
+ deployed: true,
+ onboarding_complete: false
+ )
+ end
+
+ let!(:pages_metadata2) do
+ project_pages_metadata.create!(
+ project_id: project2.id,
+ deployed: false,
+ onboarding_complete: false
+ )
+ end
+
+ describe '#up' do
+ before do
+ migration.up
+ end
+
+ it 'sets the onboarding_complete attribute to the value of deployed' do
+ expect(pages_metadata1.reload.onboarding_complete).to eq(true)
+ expect(pages_metadata2.reload.onboarding_complete).to eq(false)
+ end
+ end
+
+ describe '#down' do
+ before do
+ migration.up
+ migration.down
+ end
+
+ it 'sets all onboarding_complete attributes to false' do
+ expect(pages_metadata1.reload.onboarding_complete).to eq(false)
+ expect(pages_metadata2.reload.onboarding_complete).to eq(false)
+ end
+ end
+end
diff --git a/spec/migrations/20220324032250_migrate_shimo_confluence_service_category_spec.rb b/spec/migrations/20220324032250_migrate_shimo_confluence_service_category_spec.rb
new file mode 100644
index 00000000000..38db6d51e7e
--- /dev/null
+++ b/spec/migrations/20220324032250_migrate_shimo_confluence_service_category_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe MigrateShimoConfluenceServiceCategory, :migration do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:integrations) { table(:integrations) }
+
+ before do
+ namespace = namespaces.create!(name: 'test', path: 'test')
+ projects.create!(id: 1, namespace_id: namespace.id, name: 'gitlab', path: 'gitlab')
+ integrations.create!(id: 1, active: true, type_new: "Integrations::SlackSlashCommands",
+ category: 'chat', project_id: 1)
+ integrations.create!(id: 3, active: true, type_new: "Integrations::Confluence", category: 'common', project_id: 1)
+ integrations.create!(id: 5, active: true, type_new: "Integrations::Shimo", category: 'common', project_id: 1)
+ end
+
+ describe '#up' do
+ it 'correctly schedules background migrations', :aggregate_failures do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ expect(described_class::MIGRATION).to be_scheduled_migration(3, 5)
+ expect(BackgroundMigrationWorker.jobs.size).to eq(1)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20220329175119_remove_leftover_ci_job_artifact_deletions_spec.rb b/spec/migrations/20220329175119_remove_leftover_ci_job_artifact_deletions_spec.rb
new file mode 100644
index 00000000000..13884007af2
--- /dev/null
+++ b/spec/migrations/20220329175119_remove_leftover_ci_job_artifact_deletions_spec.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe RemoveLeftoverCiJobArtifactDeletions do
+ let(:deleted_records) { table(:loose_foreign_keys_deleted_records) }
+
+ target_table_name = Ci::JobArtifact.table_name
+
+ let(:pending_record1) do
+ deleted_records.create!(
+ id: 1,
+ fully_qualified_table_name: "public.#{target_table_name}",
+ primary_key_value: 1,
+ status: 1
+ )
+ end
+
+ let(:pending_record2) do
+ deleted_records.create!(
+ id: 2,
+ fully_qualified_table_name: "public.#{target_table_name}",
+ primary_key_value: 2,
+ status: 1
+ )
+ end
+
+ let(:other_pending_record1) do
+ deleted_records.create!(
+ id: 3,
+ fully_qualified_table_name: 'public.projects',
+ primary_key_value: 1,
+ status: 1
+ )
+ end
+
+ let(:other_pending_record2) do
+ deleted_records.create!(
+ id: 4,
+ fully_qualified_table_name: 'public.ci_builds',
+ primary_key_value: 1,
+ status: 1
+ )
+ end
+
+ let(:processed_record1) do
+ deleted_records.create!(
+ id: 5,
+ fully_qualified_table_name: 'public.external_pull_requests',
+ primary_key_value: 3,
+ status: 2
+ )
+ end
+
+ let(:other_processed_record1) do
+ deleted_records.create!(
+ id: 6,
+ fully_qualified_table_name: 'public.ci_builds',
+ primary_key_value: 2,
+ status: 2
+ )
+ end
+
+ let!(:persisted_ids_before) do
+ [
+ pending_record1,
+ pending_record2,
+ other_pending_record1,
+ other_pending_record2,
+ processed_record1,
+ other_processed_record1
+ ].map(&:id).sort
+ end
+
+ let!(:persisted_ids_after) do
+ [
+ other_pending_record1,
+ other_pending_record2,
+ processed_record1,
+ other_processed_record1
+ ].map(&:id).sort
+ end
+
+ def all_ids
+ deleted_records.all.map(&:id).sort
+ end
+
+ it 'deletes pending external_pull_requests records' do
+ expect { migrate! }.to change { all_ids }.from(persisted_ids_before).to(persisted_ids_after)
+ end
+end
diff --git a/spec/migrations/20220412143552_consume_remaining_encrypt_integration_property_jobs_spec.rb b/spec/migrations/20220412143552_consume_remaining_encrypt_integration_property_jobs_spec.rb
new file mode 100644
index 00000000000..4a1b68a5a85
--- /dev/null
+++ b/spec/migrations/20220412143552_consume_remaining_encrypt_integration_property_jobs_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe ConsumeRemainingEncryptIntegrationPropertyJobs, :migration do
+ subject(:migration) { described_class.new }
+
+ let(:integrations) { table(:integrations) }
+ let(:bg_migration_class) { ::Gitlab::BackgroundMigration::EncryptIntegrationProperties }
+ let(:bg_migration) { instance_double(bg_migration_class) }
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+ end
+
+ it 'performs remaining background migrations', :aggregate_failures do
+ # Already migrated
+ integrations.create!(properties: some_props, encrypted_properties: 'abc')
+ integrations.create!(properties: some_props, encrypted_properties: 'def')
+ integrations.create!(properties: some_props, encrypted_properties: 'xyz')
+ # update required
+ record1 = integrations.create!(properties: some_props)
+ record2 = integrations.create!(properties: some_props)
+ record3 = integrations.create!(properties: some_props)
+ # No update required
+ integrations.create!(properties: nil)
+ integrations.create!(properties: nil)
+
+ expect(Gitlab::BackgroundMigration).to receive(:steal).with(bg_migration_class.name.demodulize)
+ expect(bg_migration_class).to receive(:new).twice.and_return(bg_migration)
+ expect(bg_migration).to receive(:perform).with(record1.id, record2.id)
+ expect(bg_migration).to receive(:perform).with(record3.id, record3.id)
+
+ migrate!
+ end
+
+ def some_props
+ { iid: generate(:iid), url: generate(:url), username: generate(:username) }.to_json
+ end
+end
diff --git a/spec/migrations/add_epics_relative_position_spec.rb b/spec/migrations/add_epics_relative_position_spec.rb
new file mode 100644
index 00000000000..f3b7dd1727b
--- /dev/null
+++ b/spec/migrations/add_epics_relative_position_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe AddEpicsRelativePosition, :migration do
+ let(:groups) { table(:namespaces) }
+ let(:epics) { table(:epics) }
+ let(:users) { table(:users) }
+ let(:user) { users.create!(name: 'user', email: 'email@example.org', projects_limit: 100) }
+ let(:group) { groups.create!(name: 'gitlab', path: 'gitlab-org', type: 'Group') }
+
+ let!(:epic1) { epics.create!(title: 'epic 1', title_html: 'epic 1', author_id: user.id, group_id: group.id, iid: 1) }
+ let!(:epic2) { epics.create!(title: 'epic 2', title_html: 'epic 2', author_id: user.id, group_id: group.id, iid: 2) }
+ let!(:epic3) { epics.create!(title: 'epic 3', title_html: 'epic 3', author_id: user.id, group_id: group.id, iid: 3) }
+
+ it 'does nothing if epics table contains relative_position' do
+ expect { migrate! }.not_to change { epics.pluck(:relative_position) }
+ end
+
+ it 'adds relative_position if missing and backfills it with ID value', :aggregate_failures do
+ ActiveRecord::Base.connection.execute('ALTER TABLE epics DROP relative_position')
+
+ migrate!
+
+ expect(epics.pluck(:relative_position)).to match_array([epic1.id * 500, epic2.id * 500, epic3.id * 500])
+ end
+end
diff --git a/spec/migrations/backfill_group_features_spec.rb b/spec/migrations/backfill_group_features_spec.rb
new file mode 100644
index 00000000000..922d54f43be
--- /dev/null
+++ b/spec/migrations/backfill_group_features_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe BackfillGroupFeatures, :migration do
+ let(:migration) { described_class::MIGRATION }
+
+ describe '#up' do
+ it 'schedules background jobs for each batch of namespaces' do
+ migrate!
+
+ expect(migration).to have_scheduled_batched_migration(
+ table_name: :namespaces,
+ column_name: :id,
+ job_arguments: [described_class::BATCH_SIZE],
+ interval: described_class::INTERVAL,
+ batch_size: described_class::BATCH_SIZE
+ )
+ end
+ end
+
+ describe '#down' do
+ it 'deletes all batched migration records' do
+ migrate!
+ schema_migrate_down!
+
+ expect(migration).not_to have_scheduled_batched_migration
+ end
+ end
+end
diff --git a/spec/migrations/backfill_namespace_id_for_project_routes_spec.rb b/spec/migrations/backfill_namespace_id_for_project_routes_spec.rb
new file mode 100644
index 00000000000..28edd17731f
--- /dev/null
+++ b/spec/migrations/backfill_namespace_id_for_project_routes_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe BackfillNamespaceIdForProjectRoutes, :migration do
+ let(:migration) { described_class::MIGRATION }
+
+ describe '#up' do
+ it 'schedules background jobs for each batch of group members' do
+ migrate!
+
+ expect(migration).to have_scheduled_batched_migration(
+ table_name: :routes,
+ column_name: :id,
+ interval: described_class::INTERVAL
+ )
+ end
+ end
+
+ describe '#down' do
+ it 'deletes all batched migration records' do
+ migrate!
+ schema_migrate_down!
+
+ expect(migration).not_to have_scheduled_batched_migration
+ end
+ end
+end
diff --git a/spec/migrations/backfill_work_item_type_id_on_issues_spec.rb b/spec/migrations/backfill_work_item_type_id_on_issues_spec.rb
new file mode 100644
index 00000000000..6798b0cc7e8
--- /dev/null
+++ b/spec/migrations/backfill_work_item_type_id_on_issues_spec.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe BackfillWorkItemTypeIdOnIssues, :migration do
+ let_it_be(:migration) { described_class::MIGRATION }
+ let_it_be(:interval) { 2.minutes }
+ let_it_be(:issue_type_enum) { { issue: 0, incident: 1, test_case: 2, requirement: 3, task: 4 } }
+ let_it_be(:base_work_item_type_ids) do
+ table(:work_item_types).where(namespace_id: nil).order(:base_type).each_with_object({}) do |type, hash|
+ hash[type.base_type] = type.id
+ end
+ end
+
+ describe '#up' do
+ it 'correctly schedules background migrations' do
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ scheduled_migrations = Gitlab::Database::BackgroundMigration::BatchedMigration.where(job_class_name: migration)
+ work_item_types = table(:work_item_types).where(namespace_id: nil)
+
+ expect(scheduled_migrations.count).to eq(work_item_types.count)
+
+ [:issue, :incident, :test_case, :requirement, :task].each do |issue_type|
+ expect(migration).to have_scheduled_batched_migration(
+ table_name: :issues,
+ column_name: :id,
+ job_arguments: [issue_type_enum[issue_type], base_work_item_type_ids[issue_type_enum[issue_type]]],
+ interval: interval,
+ batch_size: described_class::BATCH_SIZE,
+ max_batch_size: described_class::MAX_BATCH_SIZE,
+ sub_batch_size: described_class::SUB_BATCH_SIZE,
+ batch_class_name: described_class::BATCH_CLASS_NAME
+ )
+ end
+ end
+ end
+ end
+ end
+
+ describe '#down' do
+ it 'deletes all batched migration records' do
+ migrate!
+ schema_migrate_down!
+
+ expect(migration).not_to have_scheduled_batched_migration
+ end
+ end
+end
diff --git a/spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb b/spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb
new file mode 100644
index 00000000000..eda57545c7a
--- /dev/null
+++ b/spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe CleanupAfterFixingIssueWhenAdminChangedPrimaryEmail, :sidekiq do
+ let(:migration) { described_class.new }
+ let(:users) { table(:users) }
+ let(:emails) { table(:emails) }
+
+ let!(:user_1) { users.create!(name: 'confirmed-user-1', email: 'confirmed-1@example.com', confirmed_at: 3.days.ago, projects_limit: 100) }
+ let!(:user_2) { users.create!(name: 'confirmed-user-2', email: 'confirmed-2@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
+ let!(:user_3) { users.create!(name: 'confirmed-user-3', email: 'confirmed-3@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
+ let!(:user_4) { users.create!(name: 'unconfirmed-user', email: 'unconfirmed@example.com', confirmed_at: nil, projects_limit: 100) }
+
+ let!(:email_1) { emails.create!(email: 'confirmed-1@example.com', user_id: user_1.id, confirmed_at: 1.day.ago) }
+ let!(:email_2) { emails.create!(email: 'other_2@example.com', user_id: user_2.id, confirmed_at: 1.day.ago) }
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+ end
+
+ it 'adds the primary email to emails for leftover confirmed users that do not have their primary email in the emails table', :aggregate_failures do
+ original_email_1_confirmed_at = email_1.reload.confirmed_at
+
+ expect { migration.up }.to change { emails.count }.by(2)
+
+ expect(emails.find_by(user_id: user_2.id, email: 'confirmed-2@example.com').confirmed_at).to eq(user_2.reload.confirmed_at)
+ expect(emails.find_by(user_id: user_3.id, email: 'confirmed-3@example.com').confirmed_at).to eq(user_3.reload.confirmed_at)
+ expect(email_1.reload.confirmed_at).to eq(original_email_1_confirmed_at)
+
+ expect(emails.exists?(user_id: user_4.id)).to be(false)
+ end
+
+ it 'continues in case of errors with one email' do
+ allow(Email).to receive(:create) { raise 'boom!' }
+
+ expect { migration.up }.not_to raise_error
+ end
+end
diff --git a/spec/migrations/finalize_project_namespaces_backfill_spec.rb b/spec/migrations/finalize_project_namespaces_backfill_spec.rb
new file mode 100644
index 00000000000..3d0b0ec13fe
--- /dev/null
+++ b/spec/migrations/finalize_project_namespaces_backfill_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe FinalizeProjectNamespacesBackfill, :migration do
+ let(:batched_migrations) { table(:batched_background_migrations) }
+
+ let_it_be(:migration) { described_class::MIGRATION }
+
+ describe '#up' do
+ shared_examples 'raises migration not finished exception' do
+ it 'raises exception' do
+ expect { migrate! }.to raise_error(/Expected batched background migration for the given configuration to be marked as 'finished'/)
+ end
+ end
+
+ context 'when project namespace backfilling migration is missing' do
+ it 'warns migration not found' do
+ expect(Gitlab::AppLogger)
+ .to receive(:warn).with(/Could not find batched background migration for the given configuration:/)
+
+ migrate!
+ end
+ end
+
+ context 'with backfilling migration present' do
+ let!(:project_namespace_backfill) do
+ batched_migrations.create!(
+ job_class_name: 'ProjectNamespaces::BackfillProjectNamespaces',
+ table_name: :projects,
+ column_name: :id,
+ job_arguments: [nil, 'up'],
+ interval: 2.minutes,
+ min_value: 1,
+ max_value: 2,
+ batch_size: 1000,
+ sub_batch_size: 200,
+ status: 3 # finished
+ )
+ end
+
+ context 'when project namespace backfilling migration finished successfully' do
+ it 'does not raise exception' do
+ expect { migrate! }.not_to raise_error(/Expected batched background migration for the given configuration to be marked as 'finished'/)
+ end
+ end
+
+ context 'when project namespace backfilling migration is paused' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:status, :description) do
+ 0 | 'paused'
+ 1 | 'active'
+ 4 | 'failed'
+ 5 | 'finalizing'
+ end
+
+ with_them do
+ before do
+ project_namespace_backfill.update!(status: status)
+ end
+
+ it_behaves_like 'raises migration not finished exception'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/finalize_traversal_ids_background_migrations_spec.rb b/spec/migrations/finalize_traversal_ids_background_migrations_spec.rb
new file mode 100644
index 00000000000..74d6447e6a7
--- /dev/null
+++ b/spec/migrations/finalize_traversal_ids_background_migrations_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('finalize_traversal_ids_background_migrations')
+
+RSpec.describe FinalizeTraversalIdsBackgroundMigrations, :migration do
+ shared_context 'incomplete background migration' do
+ before do
+ # Jobs enqueued in Sidekiq.
+ Sidekiq::Testing.disable! do
+ BackgroundMigrationWorker.perform_in(10, job_class_name, [1, 2, 100])
+ BackgroundMigrationWorker.perform_in(20, job_class_name, [3, 4, 100])
+ end
+
+ # Jobs tracked in the database.
+ # table(:background_migration_jobs).create!(
+ Gitlab::Database::BackgroundMigrationJob.create!(
+ class_name: job_class_name,
+ arguments: [5, 6, 100],
+ status: Gitlab::Database::BackgroundMigrationJob.statuses['pending']
+ )
+ # table(:background_migration_jobs).create!(
+ Gitlab::Database::BackgroundMigrationJob.create!(
+ class_name: job_class_name,
+ arguments: [7, 8, 100],
+ status: Gitlab::Database::BackgroundMigrationJob.statuses['succeeded']
+ )
+ end
+ end
+
+ context 'BackfillNamespaceTraversalIdsRoots background migration' do
+ let(:job_class_name) { 'BackfillNamespaceTraversalIdsRoots' }
+
+ include_context 'incomplete background migration'
+
+ before do
+ migrate!
+ end
+
+ it_behaves_like(
+ 'finalized tracked background migration',
+ Gitlab::BackgroundMigration::BackfillNamespaceTraversalIdsRoots
+ )
+ end
+
+ context 'BackfillNamespaceTraversalIdsChildren background migration' do
+ let(:job_class_name) { 'BackfillNamespaceTraversalIdsChildren' }
+
+ include_context 'incomplete background migration'
+
+ before do
+ migrate!
+ end
+
+ it_behaves_like(
+ 'finalized tracked background migration',
+ Gitlab::BackgroundMigration::BackfillNamespaceTraversalIdsChildren
+ )
+ end
+end
diff --git a/spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb b/spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb
new file mode 100644
index 00000000000..44a2220b2ad
--- /dev/null
+++ b/spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe FixAndBackfillProjectNamespacesForProjectsWithDuplicateName, :migration do
+ let(:projects) { table(:projects) }
+ let(:namespaces) { table(:namespaces) }
+
+ let!(:group) { namespaces.create!(name: 'group1', path: 'group1', type: 'Group') }
+ let!(:project_namespace) { namespaces.create!(name: 'project2', path: 'project2', type: 'Project') }
+ let!(:project1) { projects.create!(name: 'project1', path: 'project1', project_namespace_id: nil, namespace_id: group.id, visibility_level: 20) }
+ let!(:project2) { projects.create!(name: 'project2', path: 'project2', project_namespace_id: project_namespace.id, namespace_id: group.id, visibility_level: 20) }
+ let!(:project3) { projects.create!(name: 'project3', path: 'project3', project_namespace_id: nil, namespace_id: group.id, visibility_level: 20) }
+ let!(:project4) { projects.create!(name: 'project4', path: 'project4', project_namespace_id: nil, namespace_id: group.id, visibility_level: 20) }
+
+ describe '#up' do
+ it 'schedules background migrations' do
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ described_class.new.up
+
+ migration = described_class::MIGRATION
+
+ expect(migration).to be_scheduled_delayed_migration(2.minutes, project1.id, project4.id)
+ expect(BackgroundMigrationWorker.jobs.size).to eq 1
+ end
+ end
+ end
+
+ context 'in batches' do
+ before do
+ stub_const('FixAndBackfillProjectNamespacesForProjectsWithDuplicateName::BATCH_SIZE', 2)
+ end
+
+ it 'schedules background migrations' do
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ described_class.new.up
+
+ migration = described_class::MIGRATION
+
+ expect(migration).to be_scheduled_delayed_migration(2.minutes, project1.id, project3.id)
+ expect(migration).to be_scheduled_delayed_migration(4.minutes, project4.id, project4.id)
+ expect(BackgroundMigrationWorker.jobs.size).to eq 2
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/remove_wiki_notes_spec.rb b/spec/migrations/remove_wiki_notes_spec.rb
new file mode 100644
index 00000000000..2ffebdee106
--- /dev/null
+++ b/spec/migrations/remove_wiki_notes_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe RemoveWikiNotes, :migration do
+ let(:notes) { table(:notes) }
+
+ it 'removes all wiki notes' do
+ notes.create!(id: 97, note: 'Wiki note', noteable_type: 'Wiki')
+ notes.create!(id: 98, note: 'Commit note', noteable_type: 'Commit')
+ notes.create!(id: 110, note: 'Issue note', noteable_type: 'Issue')
+ notes.create!(id: 242, note: 'MergeRequest note', noteable_type: 'MergeRequest')
+
+ expect(notes.where(noteable_type: 'Wiki').size).to eq(1)
+
+ expect { migrate! }.to change { notes.count }.by(-1)
+
+ expect(notes.where(noteable_type: 'Wiki').size).to eq(0)
+ end
+
+ context 'when not staging nor com' do
+ it 'does not remove notes' do
+ allow(::Gitlab).to receive(:com?).and_return(false)
+ allow(::Gitlab).to receive(:dev_or_test_env?).and_return(false)
+ allow(::Gitlab).to receive(:staging?).and_return(false)
+
+ notes.create!(id: 97, note: 'Wiki note', noteable_type: 'Wiki')
+
+ expect { migrate! }.not_to change { notes.count }
+ end
+ end
+end
diff --git a/spec/migrations/replace_work_item_type_backfill_next_batch_strategy_spec.rb b/spec/migrations/replace_work_item_type_backfill_next_batch_strategy_spec.rb
new file mode 100644
index 00000000000..5e22fc06973
--- /dev/null
+++ b/spec/migrations/replace_work_item_type_backfill_next_batch_strategy_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ReplaceWorkItemTypeBackfillNextBatchStrategy, :migration do
+ describe '#up' do
+ it 'sets the new strategy for existing migrations' do
+ migrations = create_migrations(described_class::OLD_STRATEGY_CLASS, 2)
+
+ expect do
+ migrate!
+
+ migrations.each(&:reload)
+ end.to change { migrations.pluck(:batch_class_name).uniq }.from([described_class::OLD_STRATEGY_CLASS])
+ .to([described_class::NEW_STRATEGY_CLASS])
+ end
+ end
+
+ describe '#down' do
+ it 'sets the old strategy for existing migrations' do
+ migrations = create_migrations(described_class::NEW_STRATEGY_CLASS, 2)
+
+ expect do
+ migrate!
+ schema_migrate_down!
+
+ migrations.each(&:reload)
+ end.to change { migrations.pluck(:batch_class_name).uniq }.from([described_class::NEW_STRATEGY_CLASS])
+ .to([described_class::OLD_STRATEGY_CLASS])
+ end
+ end
+
+ def create_migrations(batch_class_name, count)
+ Array.new(2) { |index| create_background_migration(batch_class_name, [index]) }
+ end
+
+ def create_background_migration(batch_class_name, job_arguments)
+ migrations_table = table(:batched_background_migrations)
+
+ migrations_table.create!(
+ batch_class_name: batch_class_name,
+ job_class_name: described_class::JOB_CLASS_NAME,
+ max_value: 10,
+ batch_size: 5,
+ sub_batch_size: 1,
+ interval: 2.minutes,
+ table_name: :issues,
+ column_name: :id,
+ total_tuple_count: 10_000,
+ pause_ms: 100,
+ job_arguments: job_arguments
+ )
+ end
+end
diff --git a/spec/models/alert_management/metric_image_spec.rb b/spec/models/alert_management/metric_image_spec.rb
new file mode 100644
index 00000000000..dedbd6e501e
--- /dev/null
+++ b/spec/models/alert_management/metric_image_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe AlertManagement::MetricImage do
+ subject { build(:alert_metric_image) }
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:alert) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to be_valid }
+ it { is_expected.to validate_presence_of(:file) }
+ it { is_expected.to validate_length_of(:url).is_at_most(255) }
+ it { is_expected.to validate_length_of(:url_text).is_at_most(128) }
+ end
+
+ describe '.available_for?' do
+ subject { described_class.available_for?(issue.project) }
+
+ let_it_be_with_refind(:issue) { create(:issue) }
+
+ it { is_expected.to eq(true) }
+ end
+end
diff --git a/spec/models/analytics/cycle_analytics/aggregation_spec.rb b/spec/models/analytics/cycle_analytics/aggregation_spec.rb
index 4bf737df56a..6071e4b3d21 100644
--- a/spec/models/analytics/cycle_analytics/aggregation_spec.rb
+++ b/spec/models/analytics/cycle_analytics/aggregation_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Analytics::CycleAnalytics::Aggregation, type: :model do
it { is_expected.not_to validate_presence_of(:group) }
it { is_expected.not_to validate_presence_of(:enabled) }
- %i[incremental_runtimes_in_seconds incremental_processed_records last_full_run_runtimes_in_seconds last_full_run_processed_records].each do |column|
+ %i[incremental_runtimes_in_seconds incremental_processed_records full_runtimes_in_seconds full_processed_records].each do |column|
it "validates the array length of #{column}" do
record = described_class.new(column => [1] * 11)
@@ -20,6 +20,81 @@ RSpec.describe Analytics::CycleAnalytics::Aggregation, type: :model do
end
end
+ describe 'attribute updater methods' do
+ subject(:aggregation) { build(:cycle_analytics_aggregation) }
+
+ describe '#cursor_for' do
+ it 'returns empty cursors' do
+ aggregation.last_full_issues_id = nil
+ aggregation.last_full_issues_updated_at = nil
+
+ expect(aggregation.cursor_for(:full, Issue)).to eq({})
+ end
+
+ context 'when cursor is not empty' do
+ it 'returns the cursor values' do
+ current_time = Time.current
+
+ aggregation.last_full_issues_id = 1111
+ aggregation.last_full_issues_updated_at = current_time
+
+ expect(aggregation.cursor_for(:full, Issue)).to eq({ id: 1111, updated_at: current_time })
+ end
+ end
+ end
+
+ describe '#refresh_last_run' do
+ it 'updates the run_at column' do
+ freeze_time do
+ aggregation.refresh_last_run(:incremental)
+
+ expect(aggregation.last_incremental_run_at).to eq(Time.current)
+ end
+ end
+ end
+
+ describe '#reset_full_run_cursors' do
+ it 'resets all full run cursors to nil' do
+ aggregation.last_full_issues_id = 111
+ aggregation.last_full_issues_updated_at = Time.current
+ aggregation.last_full_merge_requests_id = 111
+ aggregation.last_full_merge_requests_updated_at = Time.current
+
+ aggregation.reset_full_run_cursors
+
+ expect(aggregation).to have_attributes(
+ last_full_issues_id: nil,
+ last_full_issues_updated_at: nil,
+ last_full_merge_requests_id: nil,
+ last_full_merge_requests_updated_at: nil
+ )
+ end
+ end
+
+ describe '#set_cursor' do
+ it 'sets the cursor values for the given mode' do
+ aggregation.set_cursor(:full, Issue, { id: 2222, updated_at: nil })
+
+ expect(aggregation).to have_attributes(
+ last_full_issues_id: 2222,
+ last_full_issues_updated_at: nil
+ )
+ end
+ end
+
+ describe '#set_stats' do
+ it 'appends stats to the runtime and processed_records attributes' do
+ aggregation.set_stats(:full, 10, 20)
+ aggregation.set_stats(:full, 20, 30)
+
+ expect(aggregation).to have_attributes(
+ full_runtimes_in_seconds: [10, 20],
+ full_processed_records: [20, 30]
+ )
+ end
+ end
+ end
+
describe '#safe_create_for_group' do
let_it_be(:group) { create(:group) }
let_it_be(:subgroup) { create(:group, parent: group) }
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index 70331e8d78a..541fa1ac77a 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -512,12 +512,8 @@ RSpec.describe ApplicationSetting do
end
context 'key restrictions' do
- it 'supports all key types' do
- expect(described_class::SUPPORTED_KEY_TYPES).to eq(Gitlab::SSHPublicKey.supported_types)
- end
-
it 'does not allow all key types to be disabled' do
- described_class::SUPPORTED_KEY_TYPES.each do |type|
+ Gitlab::SSHPublicKey.supported_types.each do |type|
setting["#{type}_key_restriction"] = described_class::FORBIDDEN_KEY_VALUE
end
@@ -526,15 +522,23 @@ RSpec.describe ApplicationSetting do
end
where(:type) do
- described_class::SUPPORTED_KEY_TYPES
+ Gitlab::SSHPublicKey.supported_types
end
with_them do
let(:field) { :"#{type}_key_restriction" }
- it { is_expected.to validate_presence_of(field) }
- it { is_expected.to allow_value(*KeyRestrictionValidator.supported_key_restrictions(type)).for(field) }
- it { is_expected.not_to allow_value(128).for(field) }
+ shared_examples 'key validations' do
+ it { is_expected.to validate_presence_of(field) }
+ it { is_expected.to allow_value(*KeyRestrictionValidator.supported_key_restrictions(type)).for(field) }
+ it { is_expected.not_to allow_value(128).for(field) }
+ end
+
+ it_behaves_like 'key validations'
+
+ context 'FIPS mode', :fips_mode do
+ it_behaves_like 'key validations'
+ end
end
end
@@ -1306,4 +1310,31 @@ RSpec.describe ApplicationSetting do
end
end
end
+
+ describe '#database_grafana_api_key' do
+ it 'is encrypted' do
+ subject.database_grafana_api_key = 'somesecret'
+
+ aggregate_failures do
+ expect(subject.encrypted_database_grafana_api_key).to be_present
+ expect(subject.encrypted_database_grafana_api_key_iv).to be_present
+ expect(subject.encrypted_database_grafana_api_key).not_to eq(subject.database_grafana_api_key)
+ end
+ end
+ end
+
+ context "inactive project deletion" do
+ it "validates that inactive_projects_send_warning_email_after_months is less than inactive_projects_delete_after_months" do
+ subject[:inactive_projects_delete_after_months] = 3
+ subject[:inactive_projects_send_warning_email_after_months] = 6
+
+ expect(subject).to be_invalid
+ end
+
+ it { is_expected.to validate_numericality_of(:inactive_projects_send_warning_email_after_months).is_greater_than(0) }
+
+ it { is_expected.to validate_numericality_of(:inactive_projects_delete_after_months).is_greater_than(0) }
+
+ it { is_expected.to validate_numericality_of(:inactive_projects_min_size_mb).is_greater_than_or_equal_to(0) }
+ end
end
diff --git a/spec/models/award_emoji_spec.rb b/spec/models/award_emoji_spec.rb
index ebd1441f901..4da19267b1c 100644
--- a/spec/models/award_emoji_spec.rb
+++ b/spec/models/award_emoji_spec.rb
@@ -58,6 +58,43 @@ RSpec.describe AwardEmoji do
end
end
end
+
+ context 'custom emoji' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:emoji) { create(:custom_emoji, name: 'partyparrot', namespace: group) }
+
+ before do
+ group.add_maintainer(user)
+ end
+
+ %i[issue merge_request note_on_issue snippet].each do |awardable_type|
+ let_it_be(:project) { create(:project, namespace: group) }
+ let(:awardable) { create(awardable_type, project: project) }
+
+ it "is accepted on #{awardable_type}" do
+ new_award = build(:award_emoji, user: user, awardable: awardable, name: emoji.name)
+
+ expect(new_award).to be_valid
+ end
+ end
+
+ it 'is accepted on subgroup issue' do
+ subgroup = create(:group, parent: group)
+ project = create(:project, namespace: subgroup)
+ issue = create(:issue, project: project)
+ new_award = build(:award_emoji, user: user, awardable: issue, name: emoji.name)
+
+ expect(new_award).to be_valid
+ end
+
+ it 'is not supported on personal snippet (yet)' do
+ snippet = create(:personal_snippet)
+ new_award = build(:award_emoji, user: snippet.author, awardable: snippet, name: 'null')
+
+ expect(new_award).not_to be_valid
+ end
+ end
end
describe 'scopes' do
@@ -210,4 +247,47 @@ RSpec.describe AwardEmoji do
end
end
end
+
+ describe '#url' do
+ let_it_be(:custom_emoji) { create(:custom_emoji) }
+ let_it_be(:project) { create(:project, namespace: custom_emoji.group) }
+ let_it_be(:issue) { create(:issue, project: project) }
+
+ def build_award(name)
+ build(:award_emoji, awardable: issue, name: name)
+ end
+
+ it 'is nil for built-in emoji' do
+ new_award = build_award('tada')
+
+ count = ActiveRecord::QueryRecorder.new do
+ expect(new_award.url).to be_nil
+ end.count
+ expect(count).to be_zero
+ end
+
+ it 'is nil for unrecognized emoji' do
+ new_award = build_award('null')
+
+ expect(new_award.url).to be_nil
+ end
+
+ it 'is set for custom emoji' do
+ new_award = build_award(custom_emoji.name)
+
+ expect(new_award.url).to eq(custom_emoji.url)
+ end
+
+ context 'feature flag disabled' do
+ before do
+ stub_feature_flags(custom_emoji: false)
+ end
+
+ it 'does not query' do
+ new_award = build_award(custom_emoji.name)
+
+ expect(ActiveRecord::QueryRecorder.new { new_award.url }.count).to be_zero
+ end
+ end
+ end
end
diff --git a/spec/models/blob_spec.rb b/spec/models/blob_spec.rb
index 6eba9ca63b0..9c153f36d8b 100644
--- a/spec/models/blob_spec.rb
+++ b/spec/models/blob_spec.rb
@@ -229,6 +229,20 @@ RSpec.describe Blob do
end
end
+ describe '#executable?' do
+ it 'is true for executables' do
+ executable_blob = fake_blob(path: 'file', mode: '100755')
+
+ expect(executable_blob.executable?).to eq true
+ end
+
+ it 'is false for non-executables' do
+ non_executable_blob = fake_blob(path: 'file', mode: '100655')
+
+ expect(non_executable_blob.executable?).to eq false
+ end
+ end
+
describe '#extension' do
it 'returns the extension' do
blob = fake_blob(path: 'file.md')
diff --git a/spec/models/board_spec.rb b/spec/models/board_spec.rb
index 90a06b80f9c..775cccd2aec 100644
--- a/spec/models/board_spec.rb
+++ b/spec/models/board_spec.rb
@@ -21,10 +21,12 @@ RSpec.describe Board do
end
describe '#order_by_name_asc' do
+ # rubocop:disable RSpec/VariableName
let!(:board_B) { create(:board, project: project, name: 'B') }
let!(:board_C) { create(:board, project: project, name: 'C') }
let!(:board_a) { create(:board, project: project, name: 'a') }
let!(:board_A) { create(:board, project: project, name: 'A') }
+ # rubocop:enable RSpec/VariableName
it 'returns in case-insensitive alphabetical order and then by ascending id' do
expect(project.boards.order_by_name_asc).to eq [board_a, board_A, board_B, board_C]
@@ -32,10 +34,12 @@ RSpec.describe Board do
end
describe '#first_board' do
+ # rubocop:disable RSpec/VariableName
let!(:board_B) { create(:board, project: project, name: 'B') }
let!(:board_C) { create(:board, project: project, name: 'C') }
let!(:board_a) { create(:board, project: project, name: 'a') }
let!(:board_A) { create(:board, project: project, name: 'A') }
+ # rubocop:enable RSpec/VariableName
it 'return the first case-insensitive alphabetical board as a relation' do
expect(project.boards.first_board).to eq [board_a]
diff --git a/spec/models/bulk_import_spec.rb b/spec/models/bulk_import_spec.rb
index ea002a7b174..3430da43f62 100644
--- a/spec/models/bulk_import_spec.rb
+++ b/spec/models/bulk_import_spec.rb
@@ -3,6 +3,13 @@
require 'spec_helper'
RSpec.describe BulkImport, type: :model do
+ let_it_be(:created_bulk_import) { create(:bulk_import, :created) }
+ let_it_be(:started_bulk_import) { create(:bulk_import, :started) }
+ let_it_be(:finished_bulk_import) { create(:bulk_import, :finished) }
+ let_it_be(:failed_bulk_import) { create(:bulk_import, :failed) }
+ let_it_be(:stale_created_bulk_import) { create(:bulk_import, :created, created_at: 3.days.ago) }
+ let_it_be(:stale_started_bulk_import) { create(:bulk_import, :started, created_at: 3.days.ago) }
+
describe 'associations' do
it { is_expected.to belong_to(:user).required }
it { is_expected.to have_one(:configuration) }
@@ -16,9 +23,15 @@ RSpec.describe BulkImport, type: :model do
it { is_expected.to define_enum_for(:source_type).with_values(%i[gitlab]) }
end
+ describe '.stale scope' do
+ subject { described_class.stale }
+
+ it { is_expected.to contain_exactly(stale_created_bulk_import, stale_started_bulk_import) }
+ end
+
describe '.all_human_statuses' do
it 'returns all human readable entity statuses' do
- expect(described_class.all_human_statuses).to contain_exactly('created', 'started', 'finished', 'failed')
+ expect(described_class.all_human_statuses).to contain_exactly('created', 'started', 'finished', 'failed', 'timeout')
end
end
diff --git a/spec/models/bulk_imports/entity_spec.rb b/spec/models/bulk_imports/entity_spec.rb
index e5bbac62dcc..6f6a7c9bcd8 100644
--- a/spec/models/bulk_imports/entity_spec.rb
+++ b/spec/models/bulk_imports/entity_spec.rb
@@ -151,7 +151,7 @@ RSpec.describe BulkImports::Entity, type: :model do
describe '.all_human_statuses' do
it 'returns all human readable entity statuses' do
- expect(described_class.all_human_statuses).to contain_exactly('created', 'started', 'finished', 'failed')
+ expect(described_class.all_human_statuses).to contain_exactly('created', 'started', 'finished', 'failed', 'timeout')
end
end
@@ -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.new(entity.bulk_import).pipelines.count)
+ expect(entity.trackers.count).to eq(BulkImports::Groups::Stage.new(entity).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.new(entity.bulk_import).pipelines.count)
+ expect(entity.trackers.count).to eq(BulkImports::Projects::Stage.new(entity).pipelines.count)
expect(entity.trackers.map(&:pipeline_name)).to include(BulkImports::Projects::Pipelines::ProjectPipeline.to_s)
end
end
diff --git a/spec/models/bulk_imports/export_status_spec.rb b/spec/models/bulk_imports/export_status_spec.rb
index f945ad12244..79ed6b39358 100644
--- a/spec/models/bulk_imports/export_status_spec.rb
+++ b/spec/models/bulk_imports/export_status_spec.rb
@@ -13,6 +13,10 @@ RSpec.describe BulkImports::ExportStatus do
double(parsed_response: [{ 'relation' => 'labels', 'status' => status, 'error' => 'error!' }])
end
+ let(:invalid_response_double) do
+ double(parsed_response: [{ 'relation' => 'not_a_real_relation', 'status' => status, 'error' => 'error!' }])
+ end
+
subject { described_class.new(tracker, relation) }
before do
@@ -36,6 +40,18 @@ RSpec.describe BulkImports::ExportStatus do
it 'returns false' do
expect(subject.started?).to eq(false)
end
+
+ context 'when returned relation is invalid' do
+ before do
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |client|
+ allow(client).to receive(:get).and_return(invalid_response_double)
+ end
+ end
+
+ it 'returns false' do
+ expect(subject.started?).to eq(false)
+ end
+ end
end
end
@@ -63,7 +79,7 @@ RSpec.describe BulkImports::ExportStatus do
it 'returns true' do
expect(subject.failed?).to eq(true)
- expect(subject.error).to eq('Empty export status response')
+ expect(subject.error).to eq('Empty relation export status')
end
end
end
diff --git a/spec/models/bulk_imports/tracker_spec.rb b/spec/models/bulk_imports/tracker_spec.rb
index a72b628e329..0b6f692a477 100644
--- a/spec/models/bulk_imports/tracker_spec.rb
+++ b/spec/models/bulk_imports/tracker_spec.rb
@@ -66,8 +66,8 @@ RSpec.describe BulkImports::Tracker, type: :model do
describe '#pipeline_class' do
it 'returns the pipeline class' do
- bulk_import = create(:bulk_import)
- pipeline_class = BulkImports::Groups::Stage.new(bulk_import).pipelines.first[1]
+ entity = create(:bulk_import_entity)
+ pipeline_class = BulkImports::Groups::Stage.new(entity).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 7c3c02a5ab7..5ee560c4925 100644
--- a/spec/models/ci/bridge_spec.rb
+++ b/spec/models/ci/bridge_spec.rb
@@ -30,6 +30,12 @@ RSpec.describe Ci::Bridge do
expect(bridge).to have_one(:downstream_pipeline)
end
+ describe '#retryable?' do
+ it 'returns false' do
+ expect(bridge.retryable?).to eq(false)
+ end
+ end
+
describe '#tags' do
it 'only has a bridge tag' do
expect(bridge.tags).to eq [:bridge]
@@ -282,6 +288,26 @@ RSpec.describe Ci::Bridge do
)
end
end
+
+ context 'when the pipeline runs from a pipeline schedule' do
+ let(:pipeline_schedule) { create(:ci_pipeline_schedule, :nightly, project: project ) }
+ let(:pipeline) { create(:ci_pipeline, pipeline_schedule: pipeline_schedule) }
+
+ let(:options) do
+ { trigger: { project: 'my/project', forward: { pipeline_variables: true } } }
+ end
+
+ before do
+ pipeline_schedule.variables.create!(key: 'schedule_var_key', value: 'schedule var value')
+ end
+
+ it 'adds the schedule variable' do
+ expect(bridge.downstream_variables).to contain_exactly(
+ { key: 'BRIDGE', value: 'cross' },
+ { key: 'schedule_var_key', value: 'schedule var value' }
+ )
+ end
+ end
end
end
diff --git a/spec/models/ci/build_dependencies_spec.rb b/spec/models/ci/build_dependencies_spec.rb
index cd330324840..91048cae064 100644
--- a/spec/models/ci/build_dependencies_spec.rb
+++ b/spec/models/ci/build_dependencies_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Ci::BuildDependencies do
end
let!(:build) { create(:ci_build, pipeline: pipeline, name: 'build', stage_idx: 0, stage: 'build') }
- let!(:rspec_test) { create(:ci_build, pipeline: pipeline, name: 'rspec', stage_idx: 1, stage: 'test') }
+ let!(:rspec_test) { create(:ci_build, :success, pipeline: pipeline, name: 'rspec', stage_idx: 1, stage: 'test') }
let!(:rubocop_test) { create(:ci_build, pipeline: pipeline, name: 'rubocop', stage_idx: 1, stage: 'test') }
let!(:staging) { create(:ci_build, pipeline: pipeline, name: 'staging', stage_idx: 2, stage: 'deploy') }
@@ -48,7 +48,7 @@ RSpec.describe Ci::BuildDependencies do
project.add_developer(user)
end
- let!(:retried_job) { Ci::Build.retry(rspec_test, user) }
+ let!(:retried_job) { Ci::RetryJobService.new(rspec_test.project, user).execute(rspec_test)[:job] }
it 'contains the retried job instead of the original one' do
is_expected.to contain_exactly(build, retried_job, rubocop_test)
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 240b932638a..fd87a388442 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -1585,6 +1585,31 @@ RSpec.describe Ci::Build do
it { is_expected.to eq('review/x') }
end
+
+ context 'when environment name uses a nested variable' do
+ let(:yaml_variables) do
+ [
+ { key: 'ENVIRONMENT_NAME', value: '${CI_COMMIT_REF_NAME}' }
+ ]
+ end
+
+ let(:build) do
+ create(:ci_build,
+ ref: 'master',
+ yaml_variables: yaml_variables,
+ environment: 'review/$ENVIRONMENT_NAME')
+ end
+
+ it { is_expected.to eq('review/master') }
+
+ context 'when the FF ci_expand_environment_name_and_url is disabled' do
+ before do
+ stub_feature_flags(ci_expand_environment_name_and_url: false)
+ end
+
+ it { is_expected.to eq('review/${CI_COMMIT_REF_NAME}') }
+ end
+ end
end
describe '#expanded_kubernetes_namespace' do
@@ -1951,90 +1976,6 @@ RSpec.describe Ci::Build do
end
end
- describe '#retryable?' do
- subject { build }
-
- context 'when build is retryable' do
- context 'when build is successful' do
- before do
- build.success!
- end
-
- it { is_expected.to be_retryable }
- end
-
- context 'when build is failed' do
- before do
- build.drop!
- end
-
- it { is_expected.to be_retryable }
- end
-
- context 'when build is canceled' do
- before do
- build.cancel!
- end
-
- it { is_expected.to be_retryable }
- end
- end
-
- context 'when build is not retryable' do
- context 'when build is running' do
- before do
- build.run!
- end
-
- it { is_expected.not_to be_retryable }
- end
-
- context 'when build is skipped' do
- before do
- build.skip!
- end
-
- it { is_expected.not_to be_retryable }
- end
-
- context 'when build is degenerated' do
- before do
- build.degenerate!
- end
-
- it { is_expected.not_to be_retryable }
- end
-
- context 'when a canceled build has been retried already' do
- before do
- project.add_developer(user)
- build.cancel!
- described_class.retry(build, user)
- end
-
- it { is_expected.not_to be_retryable }
- end
-
- context 'when deployment is rejected' do
- before do
- build.drop!(:deployment_rejected)
- end
-
- it { is_expected.not_to be_retryable }
- end
-
- context 'when build is waiting for deployment approval' do
- subject { build_stubbed(:ci_build, :manual, environment: 'production') }
-
- before do
- create(:deployment, :blocked, deployable: subject)
- end
-
- it { is_expected.not_to be_retryable }
- end
- end
- end
-
describe '#action?' do
before do
build.update!(when: value)
@@ -2308,7 +2249,7 @@ RSpec.describe Ci::Build do
describe '#options' do
let(:options) do
{
- image: "ruby:2.7",
+ image: "image:1.0",
services: ["postgres"],
script: ["ls -a"]
}
@@ -2319,7 +2260,7 @@ RSpec.describe Ci::Build do
end
it 'allows to access with symbolized keys' do
- expect(build.options[:image]).to eq('ruby:2.7')
+ expect(build.options[:image]).to eq('image:1.0')
end
it 'rejects access with string keys' do
@@ -2358,24 +2299,12 @@ RSpec.describe Ci::Build do
end
context 'when build is retried' do
- let!(:new_build) { described_class.retry(build, user) }
+ let!(:new_build) { Ci::RetryJobService.new(project, user).execute(build)[:job] }
it 'does not return any of them' do
is_expected.not_to include(build, new_build)
end
end
-
- context 'when other build is retried' do
- let!(:retried_build) { described_class.retry(other_build, user) }
-
- before do
- retried_build.success
- end
-
- it 'returns a retried build' do
- is_expected.to contain_exactly(retried_build)
- end
- end
end
describe '#other_scheduled_actions' do
@@ -3962,8 +3891,9 @@ RSpec.describe Ci::Build do
subject { create(:ci_build, :running, options: { script: ["ls -al"], retry: 3 }, project: project, user: user) }
it 'retries build and assigns the same user to it' do
- expect(described_class).to receive(:retry)
- .with(subject, user)
+ expect_next_instance_of(::Ci::RetryJobService) do |service|
+ expect(service).to receive(:execute).with(subject)
+ end
subject.drop!
end
@@ -3977,10 +3907,10 @@ RSpec.describe Ci::Build do
end
context 'when retry service raises Gitlab::Access::AccessDeniedError exception' do
- let(:retry_service) { Ci::RetryBuildService.new(subject.project, subject.user) }
+ let(:retry_service) { Ci::RetryJobService.new(subject.project, subject.user) }
before do
- allow_any_instance_of(Ci::RetryBuildService)
+ allow_any_instance_of(Ci::RetryJobService)
.to receive(:execute)
.with(subject)
.and_raise(Gitlab::Access::AccessDeniedError)
diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb
index bd0397e0396..24c318d0218 100644
--- a/spec/models/ci/job_artifact_spec.rb
+++ b/spec/models/ci/job_artifact_spec.rb
@@ -279,6 +279,15 @@ RSpec.describe Ci::JobArtifact do
end
end
+ describe '.order_expired_asc' do
+ let_it_be(:first_artifact) { create(:ci_job_artifact, expire_at: 2.days.ago) }
+ let_it_be(:second_artifact) { create(:ci_job_artifact, expire_at: 1.day.ago) }
+
+ it 'returns ordered artifacts' do
+ expect(described_class.order_expired_asc).to eq([first_artifact, second_artifact])
+ end
+ end
+
describe '.for_project' do
it 'returns artifacts only for given project(s)', :aggregate_failures do
artifact1 = create(:ci_job_artifact)
@@ -700,10 +709,6 @@ RSpec.describe Ci::JobArtifact do
MSG
end
- it_behaves_like 'it has loose foreign keys' do
- let(:factory_name) { :ci_job_artifact }
- end
-
context 'loose foreign key on ci_job_artifacts.project_id' do
it_behaves_like 'cleanup by a loose foreign key' do
let!(:parent) { create(:project) }
diff --git a/spec/models/ci/namespace_mirror_spec.rb b/spec/models/ci/namespace_mirror_spec.rb
index 38471f15849..9b4e86916b8 100644
--- a/spec/models/ci/namespace_mirror_spec.rb
+++ b/spec/models/ci/namespace_mirror_spec.rb
@@ -44,6 +44,53 @@ RSpec.describe Ci::NamespaceMirror do
end
end
+ describe '.contains_traversal_ids' do
+ let!(:other_group1) { create(:group) }
+ let!(:other_group2) { create(:group, parent: other_group1) }
+ let!(:other_group3) { create(:group, parent: other_group2) }
+ let!(:other_group4) { create(:group) }
+
+ subject(:result) { described_class.contains_traversal_ids(all_traversal_ids) }
+
+ context 'when passing a top-level group' do
+ let(:all_traversal_ids) do
+ [
+ [other_group1.id]
+ ]
+ end
+
+ it 'returns only itself and children of that group' do
+ expect(result.map(&:namespace)).to contain_exactly(other_group1, other_group2, other_group3)
+ end
+ end
+
+ context 'when passing many levels of groups' do
+ let(:all_traversal_ids) do
+ [
+ [other_group2.parent_id, other_group2.id],
+ [other_group3.parent_id, other_group3.id],
+ [other_group4.id]
+ ]
+ end
+
+ it 'returns only the asked group' do
+ expect(result.map(&:namespace)).to contain_exactly(other_group2, other_group3, other_group4)
+ end
+ end
+
+ context 'when passing invalid data ' do
+ let(:all_traversal_ids) do
+ [
+ ["; UPDATE"]
+ ]
+ end
+
+ it 'data is properly sanitised' do
+ expect(result.to_sql).to include "((traversal_ids[1])) IN (('; UPDATE'))"
+ end
+ end
+ end
+
describe '.by_namespace_id' do
subject(:result) { described_class.by_namespace_id(group2.id) }
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 294ec07ee3e..45b51d5bf44 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -1146,6 +1146,50 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
end
+
+ describe 'variable CI_GITLAB_FIPS_MODE' do
+ context 'when FIPS flag is enabled' do
+ before do
+ allow(Gitlab::FIPS).to receive(:enabled?).and_return(true)
+ end
+
+ it "is included with value 'true'" do
+ expect(subject.to_hash).to include('CI_GITLAB_FIPS_MODE' => 'true')
+ end
+ end
+
+ context 'when FIPS flag is disabled' do
+ before do
+ allow(Gitlab::FIPS).to receive(:enabled?).and_return(false)
+ end
+
+ it 'is not included' do
+ expect(subject.to_hash).not_to have_key('CI_GITLAB_FIPS_MODE')
+ end
+ end
+ end
+
+ context 'without a commit' do
+ let(:pipeline) { build(:ci_empty_pipeline, :created, sha: nil) }
+
+ it 'does not expose commit variables' do
+ expect(subject.to_hash.keys)
+ .not_to include(
+ 'CI_COMMIT_SHA',
+ 'CI_COMMIT_SHORT_SHA',
+ 'CI_COMMIT_BEFORE_SHA',
+ 'CI_COMMIT_REF_NAME',
+ 'CI_COMMIT_REF_SLUG',
+ 'CI_COMMIT_BRANCH',
+ 'CI_COMMIT_TAG',
+ 'CI_COMMIT_MESSAGE',
+ 'CI_COMMIT_TITLE',
+ 'CI_COMMIT_DESCRIPTION',
+ 'CI_COMMIT_REF_PROTECTED',
+ 'CI_COMMIT_TIMESTAMP',
+ 'CI_COMMIT_AUTHOR')
+ end
+ end
end
describe '#protected_ref?' do
@@ -1663,7 +1707,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
expect(upstream_pipeline.reload).to be_failed
Sidekiq::Testing.inline! do
- new_job = Ci::Build.retry(job, project.users.first)
+ new_job = Ci::RetryJobService.new(project, project.users.first).execute(job)[:job]
expect(downstream_pipeline.reload).to be_running
expect(upstream_pipeline.reload).to be_running
@@ -1684,7 +1728,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
expect(upstream_pipeline.reload).to be_success
Sidekiq::Testing.inline! do
- new_job = Ci::Build.retry(job, project.users.first)
+ new_job = Ci::RetryJobService.new(project, project.users.first).execute(job)[:job]
expect(downstream_pipeline.reload).to be_running
expect(upstream_pipeline.reload).to be_running
@@ -1715,7 +1759,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
expect(upstream_of_upstream_pipeline.reload).to be_failed
Sidekiq::Testing.inline! do
- new_job = Ci::Build.retry(job, project.users.first)
+ new_job = Ci::RetryJobService.new(project, project.users.first).execute(job)[:job]
expect(downstream_pipeline.reload).to be_running
expect(upstream_pipeline.reload).to be_running
@@ -2583,8 +2627,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
build.drop
project.add_developer(user)
-
- Ci::Build.retry(build, user)
+ ::Ci::RetryJobService.new(project, user).execute(build)[:job]
end
# We are changing a state: created > failed > running
@@ -4688,7 +4731,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
project.add_developer(user)
retried_build.cancel!
- ::Ci::Build.retry(retried_build, user)
+ Ci::RetryJobService.new(project, user).execute(retried_build)[:job]
end
it 'does not include retried builds' do
@@ -4714,6 +4757,24 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
+ describe '#has_expired_test_reports?' do
+ subject { pipeline_with_test_report.has_expired_test_reports? }
+
+ let(:pipeline_with_test_report) { create(:ci_pipeline, :with_test_reports) }
+
+ context 'when artifacts are not expired' do
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when artifacts are expired' do
+ before do
+ pipeline_with_test_report.job_artifacts.first.update!(expire_at: Date.yesterday)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+
it_behaves_like 'it has loose foreign keys' do
let(:factory_name) { :ci_pipeline }
end
diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb
index ac1a8247aaa..71fef3c1b5b 100644
--- a/spec/models/ci/processable_spec.rb
+++ b/spec/models/ci/processable_spec.rb
@@ -14,6 +14,100 @@ RSpec.describe Ci::Processable do
it { is_expected.to delegate_method(:legacy_detached_merge_request_pipeline?).to(:pipeline) }
end
+ describe '#retryable' do
+ shared_examples_for 'retryable processable' do
+ context 'when processable is successful' do
+ before do
+ processable.success!
+ end
+
+ it { is_expected.to be_retryable }
+ end
+
+ context 'when processable is failed' do
+ before do
+ processable.drop!
+ end
+
+ it { is_expected.to be_retryable }
+ end
+
+ context 'when processable is canceled' do
+ before do
+ processable.cancel!
+ end
+
+ it { is_expected.to be_retryable }
+ end
+ end
+
+ shared_examples_for 'non-retryable processable' do
+ context 'when processable is skipped' do
+ before do
+ processable.skip!
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+
+ context 'when processable is degenerated' do
+ before do
+ processable.degenerate!
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+
+ context 'when a canceled processable has been retried already' do
+ before do
+ project.add_developer(create(:user))
+ processable.cancel!
+ processable.update!(retried: true)
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+ end
+
+ context 'when the processable is a build' do
+ subject(:processable) { create(:ci_build, pipeline: pipeline) }
+
+ context 'when the processable is retryable' do
+ it_behaves_like 'retryable processable'
+
+ context 'when deployment is rejected' do
+ before do
+ processable.drop!(:deployment_rejected)
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+
+ context 'when build is waiting for deployment approval' do
+ subject { build_stubbed(:ci_build, :manual, environment: 'production') }
+
+ before do
+ create(:deployment, :blocked, deployable: subject)
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+ end
+
+ context 'when the processable is non-retryable' do
+ it_behaves_like 'non-retryable processable'
+
+ context 'when processable is running' do
+ before do
+ processable.run!
+ end
+
+ it { is_expected.not_to be_retryable }
+ end
+ end
+ end
+ end
+
describe '#aggregated_needs_names' do
let(:with_aggregated_needs) { pipeline.processables.select_with_aggregated_needs(project) }
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 42187c3ef99..05b7bc39a74 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -134,28 +134,28 @@ RSpec.describe Ci::Runner do
end
context 'cost factors validations' do
- it 'dissalows :private_projects_minutes_cost_factor being nil' do
+ it 'disallows :private_projects_minutes_cost_factor being nil' do
runner = build(:ci_runner, private_projects_minutes_cost_factor: nil)
expect(runner).to be_invalid
expect(runner.errors.full_messages).to include('Private projects minutes cost factor needs to be non-negative')
end
- it 'dissalows :public_projects_minutes_cost_factor being nil' do
+ it 'disallows :public_projects_minutes_cost_factor being nil' do
runner = build(:ci_runner, public_projects_minutes_cost_factor: nil)
expect(runner).to be_invalid
expect(runner.errors.full_messages).to include('Public projects minutes cost factor needs to be non-negative')
end
- it 'dissalows :private_projects_minutes_cost_factor being negative' do
+ it 'disallows :private_projects_minutes_cost_factor being negative' do
runner = build(:ci_runner, private_projects_minutes_cost_factor: -1.1)
expect(runner).to be_invalid
expect(runner.errors.full_messages).to include('Private projects minutes cost factor needs to be non-negative')
end
- it 'dissalows :public_projects_minutes_cost_factor being negative' do
+ it 'disallows :public_projects_minutes_cost_factor being negative' do
runner = build(:ci_runner, public_projects_minutes_cost_factor: -2.2)
expect(runner).to be_invalid
diff --git a/spec/models/ci/secure_file_spec.rb b/spec/models/ci/secure_file_spec.rb
index 4382385aaf5..f92db3fe8db 100644
--- a/spec/models/ci/secure_file_spec.rb
+++ b/spec/models/ci/secure_file_spec.rb
@@ -3,14 +3,14 @@
require 'spec_helper'
RSpec.describe Ci::SecureFile do
- let(:sample_file) { fixture_file('ci_secure_files/upload-keystore.jks') }
-
- subject { create(:ci_secure_file) }
-
before do
stub_ci_secure_file_object_storage
end
+ let(:sample_file) { fixture_file('ci_secure_files/upload-keystore.jks') }
+
+ subject { create(:ci_secure_file, file: CarrierWaveStringFile.new(sample_file)) }
+
it { is_expected.to be_a FileStoreMounter }
it { is_expected.to belong_to(:project).required }
@@ -27,6 +27,26 @@ RSpec.describe Ci::SecureFile do
it { is_expected.to validate_presence_of(:name) }
it { is_expected.to validate_presence_of(:permissions) }
it { is_expected.to validate_presence_of(:project_id) }
+ context 'unique filename' do
+ let_it_be(:project1) { create(:project) }
+
+ it 'ensures the file name is unique within a given project' do
+ file1 = create(:ci_secure_file, project: project1, name: 'file1')
+ expect do
+ create(:ci_secure_file, project: project1, name: 'file1')
+ end.to raise_error(ActiveRecord::RecordInvalid, 'Validation failed: Name has already been taken')
+
+ expect(project1.secure_files.where(name: 'file1').count).to be 1
+ expect(project1.secure_files.find_by(name: 'file1').id).to eq(file1.id)
+ end
+
+ it 'allows duplicate file names in different projects' do
+ create(:ci_secure_file, project: project1)
+ expect do
+ create(:ci_secure_file, project: create(:project))
+ end.not_to raise_error
+ end
+ end
end
describe '#permissions' do
@@ -37,8 +57,6 @@ RSpec.describe Ci::SecureFile do
describe '#checksum' do
it 'computes SHA256 checksum on the file before encrypted' do
- subject.file = CarrierWaveStringFile.new(sample_file)
- subject.save!
expect(subject.checksum).to eq(Digest::SHA256.hexdigest(sample_file))
end
end
@@ -51,8 +69,6 @@ RSpec.describe Ci::SecureFile do
describe '#file' do
it 'returns the saved file' do
- subject.file = CarrierWaveStringFile.new(sample_file)
- subject.save!
expect(Base64.encode64(subject.file.read)).to eq(Base64.encode64(sample_file))
end
end
diff --git a/spec/models/clusters/agent_spec.rb b/spec/models/clusters/agent_spec.rb
index f279e779de5..f10e0cc8fa7 100644
--- a/spec/models/clusters/agent_spec.rb
+++ b/spec/models/clusters/agent_spec.rb
@@ -117,6 +117,23 @@ RSpec.describe Clusters::Agent do
end
end
+ describe '#last_used_agent_tokens' do
+ let_it_be(:agent) { create(:cluster_agent) }
+
+ subject { agent.last_used_agent_tokens }
+
+ context 'agent has no tokens' do
+ it { is_expected.to be_empty }
+ end
+
+ context 'agent has active and inactive tokens' do
+ let!(:active_token) { create(:cluster_agent_token, agent: agent, last_used_at: 1.minute.ago) }
+ let!(:inactive_token) { create(:cluster_agent_token, agent: agent, last_used_at: 2.hours.ago) }
+
+ it { is_expected.to contain_exactly(active_token, inactive_token) }
+ end
+ end
+
describe '#activity_event_deletion_cutoff' do
let_it_be(:agent) { create(:cluster_agent) }
let_it_be(:event1) { create(:agent_activity_event, agent: agent, recorded_at: 1.hour.ago) }
diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb
index 86ee159b97e..155e0fbb0e9 100644
--- a/spec/models/commit_status_spec.rb
+++ b/spec/models/commit_status_spec.rb
@@ -994,4 +994,11 @@ RSpec.describe CommitStatus do
let!(:model) { create(:ci_build, project: parent) }
end
end
+
+ context 'loose foreign key on ci_builds.runner_id' do
+ it_behaves_like 'cleanup by a loose foreign key' do
+ let!(:parent) { create(:ci_runner) }
+ let!(:model) { create(:ci_build, runner: parent) }
+ end
+ end
end
diff --git a/spec/models/concerns/approvable_base_spec.rb b/spec/models/concerns/approvable_base_spec.rb
index 79053e98db7..2bf6a98a64d 100644
--- a/spec/models/concerns/approvable_base_spec.rb
+++ b/spec/models/concerns/approvable_base_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe ApprovableBase do
subject { merge_request.can_be_approved_by?(user) }
before do
- merge_request.project.add_developer(user)
+ merge_request.project.add_developer(user) if user
end
it 'returns true' do
@@ -64,7 +64,7 @@ RSpec.describe ApprovableBase do
subject { merge_request.can_be_unapproved_by?(user) }
before do
- merge_request.project.add_developer(user)
+ merge_request.project.add_developer(user) if user
end
it 'returns false' do
diff --git a/spec/models/concerns/batch_nullify_dependent_associations_spec.rb b/spec/models/concerns/batch_nullify_dependent_associations_spec.rb
new file mode 100644
index 00000000000..933464f301a
--- /dev/null
+++ b/spec/models/concerns/batch_nullify_dependent_associations_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BatchNullifyDependentAssociations do
+ before do
+ test_user = Class.new(ActiveRecord::Base) do
+ self.table_name = 'users'
+
+ has_many :closed_issues, foreign_key: :closed_by_id, class_name: 'Issue', dependent: :nullify
+ has_many :issues, foreign_key: :author_id, class_name: 'Issue', dependent: :nullify
+ has_many :updated_issues, foreign_key: :updated_by_id, class_name: 'Issue'
+
+ include BatchNullifyDependentAssociations
+ end
+
+ stub_const('TestUser', test_user)
+ end
+
+ describe '.dependent_associations_to_nullify' do
+ it 'returns only associations with `dependent: :nullify` associations' do
+ expect(TestUser.dependent_associations_to_nullify.map(&:name)).to match_array([:closed_issues, :issues])
+ end
+ end
+
+ describe '#nullify_dependent_associations_in_batches' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:updated_by_issue) { create(:issue, updated_by: user) }
+
+ before do
+ create(:issue, closed_by: user)
+ create(:issue, closed_by: user)
+ end
+
+ it 'nullifies multiple settings' do
+ expect do
+ test_user = TestUser.find(user.id)
+ test_user.nullify_dependent_associations_in_batches
+ end.to change { Issue.where(closed_by_id: user.id).count }.by(-2)
+ end
+
+ it 'excludes associations' do
+ expect do
+ test_user = TestUser.find(user.id)
+ test_user.nullify_dependent_associations_in_batches(exclude: [:closed_issues])
+ end.not_to change { Issue.where(closed_by_id: user.id).count }
+ end
+ end
+end
diff --git a/spec/models/concerns/featurable_spec.rb b/spec/models/concerns/featurable_spec.rb
index 453b6f7f29a..bf104fe1b30 100644
--- a/spec/models/concerns/featurable_spec.rb
+++ b/spec/models/concerns/featurable_spec.rb
@@ -3,171 +3,101 @@
require 'spec_helper'
RSpec.describe Featurable do
- let_it_be(:user) { create(:user) }
+ let!(:klass) do
+ Class.new(ApplicationRecord) do
+ include Featurable
- let(:project) { create(:project) }
- let(:feature_class) { subject.class }
- let(:features) { feature_class::FEATURES }
+ self.table_name = 'project_features'
- subject { project.project_feature }
+ set_available_features %i(feature1 feature2 feature3)
- describe '.quoted_access_level_column' do
- it 'returns the table name and quoted column name for a feature' do
- expected = '"project_features"."issues_access_level"'
-
- expect(feature_class.quoted_access_level_column(:issues)).to eq(expected)
- end
- end
+ def feature1_access_level
+ Featurable::DISABLED
+ end
- describe '.access_level_attribute' do
- it { expect(feature_class.access_level_attribute(:wiki)).to eq :wiki_access_level }
+ def feature2_access_level
+ Featurable::ENABLED
+ end
- it 'raises error for unspecified feature' do
- expect { feature_class.access_level_attribute(:unknown) }
- .to raise_error(ArgumentError, /invalid feature: unknown/)
+ def feature3_access_level
+ Featurable::PRIVATE
+ end
end
end
- describe '.set_available_features' do
- let!(:klass) do
- Class.new(ApplicationRecord) do
- include Featurable
+ subject { klass.new }
- self.table_name = 'project_features'
-
- set_available_features %i(feature1 feature2)
+ describe '.set_available_features' do
+ it { expect(klass.available_features).to match_array [:feature1, :feature2, :feature3] }
+ end
- def feature1_access_level
- Featurable::DISABLED
- end
+ describe '#*_enabled?' do
+ it { expect(subject.feature1_enabled?).to be_falsey }
+ it { expect(subject.feature2_enabled?).to be_truthy }
+ end
- def feature2_access_level
- Featurable::ENABLED
- end
- end
+ describe '.quoted_access_level_column' do
+ it 'returns the table name and quoted column name for a feature' do
+ expect(klass.quoted_access_level_column(:feature1)).to eq('"project_features"."feature1_access_level"')
end
-
- let!(:instance) { klass.new }
-
- it { expect(klass.available_features).to eq [:feature1, :feature2] }
- it { expect(instance.feature1_enabled?).to be_falsey }
- it { expect(instance.feature2_enabled?).to be_truthy }
end
- describe '.available_features' do
- it { expect(feature_class.available_features).to include(*features) }
+ describe '.access_level_attribute' do
+ it { expect(klass.access_level_attribute(:feature1)).to eq :feature1_access_level }
+
+ it 'raises error for unspecified feature' do
+ expect { klass.access_level_attribute(:unknown) }
+ .to raise_error(ArgumentError, /invalid feature: unknown/)
+ end
end
describe '#access_level' do
it 'returns access level' do
- expect(subject.access_level(:wiki)).to eq(subject.wiki_access_level)
+ expect(subject.access_level(:feature1)).to eq(subject.feature1_access_level)
end
end
describe '#feature_available?' do
- let(:features) { %w(issues wiki builds merge_requests snippets repository pages metrics_dashboard) }
-
context 'when features are disabled' do
- it "returns false" do
- update_all_project_features(project, features, ProjectFeature::DISABLED)
-
- features.each do |feature|
- expect(project.feature_available?(feature.to_sym, user)).to eq(false), "#{feature} failed"
- end
+ it 'returns false' do
+ expect(subject.feature_available?(:feature1)).to eq(false)
end
end
context 'when features are enabled only for team members' do
- it "returns false when user is not a team member" do
- update_all_project_features(project, features, ProjectFeature::PRIVATE)
+ let_it_be(:user) { create(:user) }
- features.each do |feature|
- expect(project.feature_available?(feature.to_sym, user)).to eq(false), "#{feature} failed"
- end
+ before do
+ expect(subject).to receive(:member?).and_call_original
end
- it "returns true when user is a team member" do
- project.add_developer(user)
-
- update_all_project_features(project, features, ProjectFeature::PRIVATE)
-
- features.each do |feature|
- expect(project.feature_available?(feature.to_sym, user)).to eq(true), "#{feature} failed"
+ context 'when user is not present' do
+ it 'returns false' do
+ expect(subject.feature_available?(:feature3)).to eq(false)
end
end
- it "returns true when user is a member of project group" do
- group = create(:group)
- project = create(:project, namespace: group)
- group.add_developer(user)
+ context 'when user can read all resources' do
+ it 'returns true' do
+ allow(user).to receive(:can_read_all_resources?).and_return(true)
- update_all_project_features(project, features, ProjectFeature::PRIVATE)
-
- features.each do |feature|
- expect(project.feature_available?(feature.to_sym, user)).to eq(true), "#{feature} failed"
+ expect(subject.feature_available?(:feature3, user)).to eq(true)
end
end
- context 'when admin mode is enabled', :enable_admin_mode do
- it "returns true if user is an admin" do
- user.update_attribute(:admin, true)
-
- update_all_project_features(project, features, ProjectFeature::PRIVATE)
+ context 'when user cannot read all resources' do
+ it 'raises NotImplementedError exception' do
+ expect(subject).to receive(:resource_member?).and_call_original
- features.each do |feature|
- expect(project.feature_available?(feature.to_sym, user)).to eq(true), "#{feature} failed"
- end
- end
- end
-
- context 'when admin mode is disabled' do
- it "returns false when user is an admin" do
- user.update_attribute(:admin, true)
-
- update_all_project_features(project, features, ProjectFeature::PRIVATE)
-
- features.each do |feature|
- expect(project.feature_available?(feature.to_sym, user)).to eq(false), "#{feature} failed"
- end
+ expect { subject.feature_available?(:feature3, user) }.to raise_error(NotImplementedError)
end
end
end
context 'when feature is enabled for everyone' do
- it "returns true" do
- expect(project.feature_available?(:issues, user)).to eq(true)
+ it 'returns true' do
+ expect(subject.feature_available?(:feature2)).to eq(true)
end
end
end
-
- describe '#*_enabled?' do
- let(:features) { %w(wiki builds merge_requests) }
-
- it "returns false when feature is disabled" do
- update_all_project_features(project, features, ProjectFeature::DISABLED)
-
- features.each do |feature|
- expect(project.public_send("#{feature}_enabled?")).to eq(false), "#{feature} failed"
- end
- end
-
- it "returns true when feature is enabled only for team members" do
- update_all_project_features(project, features, ProjectFeature::PRIVATE)
-
- features.each do |feature|
- expect(project.public_send("#{feature}_enabled?")).to eq(true), "#{feature} failed"
- end
- end
-
- it "returns true when feature is enabled for everyone" do
- features.each do |feature|
- expect(project.public_send("#{feature}_enabled?")).to eq(true), "#{feature} failed"
- end
- end
- end
-
- def update_all_project_features(project, features, value)
- project_feature_attributes = features.to_h { |f| ["#{f}_access_level", value] }
- project.project_feature.update!(project_feature_attributes)
- end
end
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index e3c0e3a7a2b..b38135fc0b2 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -625,6 +625,16 @@ RSpec.describe Issuable do
end
end
+ describe "#labels_hook_attrs" do
+ let(:project) { create(:project) }
+ let(:label) { create(:label) }
+ let(:issue) { create(:labeled_issue, project: project, labels: [label]) }
+
+ it "returns a list of label hook attributes" do
+ expect(issue.labels_hook_attrs).to match_array([label.hook_attrs])
+ end
+ end
+
describe '.labels_hash' do
let(:feature_label) { create(:label, title: 'Feature') }
let(:second_label) { create(:label, title: 'Second Label') }
diff --git a/spec/models/concerns/sensitive_serializable_hash_spec.rb b/spec/models/concerns/sensitive_serializable_hash_spec.rb
index 923f9e80c1f..c864ecb4eec 100644
--- a/spec/models/concerns/sensitive_serializable_hash_spec.rb
+++ b/spec/models/concerns/sensitive_serializable_hash_spec.rb
@@ -30,16 +30,6 @@ RSpec.describe SensitiveSerializableHash do
expect(model.serializable_hash(unsafe_serialization_hash: true)).to include('super_secret')
end
end
-
- context 'when prevent_sensitive_fields_from_serializable_hash feature flag is disabled' do
- before do
- stub_feature_flags(prevent_sensitive_fields_from_serializable_hash: false)
- end
-
- it 'includes the field in serializable_hash' do
- expect(model.serializable_hash).to include('super_secret')
- end
- end
end
describe '#serializable_hash' do
diff --git a/spec/models/concerns/taskable_spec.rb b/spec/models/concerns/taskable_spec.rb
index 6b41174a046..140f6cda51c 100644
--- a/spec/models/concerns/taskable_spec.rb
+++ b/spec/models/concerns/taskable_spec.rb
@@ -13,6 +13,10 @@ RSpec.describe Taskable do
- [x] Second item
* [x] First item
* [ ] Second item
+ + [ ] No-break space (U+00A0)
+ + [ ] Figure space (U+2007)
+ + [ ] Narrow no-break space (U+202F)
+ + [ ] Thin space (U+2009)
MARKDOWN
end
@@ -21,7 +25,11 @@ RSpec.describe Taskable do
TaskList::Item.new('- [ ]', 'First item'),
TaskList::Item.new('- [x]', 'Second item'),
TaskList::Item.new('* [x]', 'First item'),
- TaskList::Item.new('* [ ]', 'Second item')
+ TaskList::Item.new('* [ ]', 'Second item'),
+ TaskList::Item.new('+ [ ]', 'No-break space (U+00A0)'),
+ TaskList::Item.new('+ [ ]', 'Figure space (U+2007)'),
+ TaskList::Item.new('+ [ ]', 'Narrow no-break space (U+202F)'),
+ TaskList::Item.new('+ [ ]', 'Thin space (U+2009)')
]
end
diff --git a/spec/models/container_repository_spec.rb b/spec/models/container_repository_spec.rb
index c8d86edc55f..2ea042fb767 100644
--- a/spec/models/container_repository_spec.rb
+++ b/spec/models/container_repository_spec.rb
@@ -122,6 +122,27 @@ RSpec.describe ContainerRepository, :aggregate_failures do
expect(repository).to be_import_aborted
end
end
+
+ context 'already imported' do
+ it 'finishes the import' do
+ expect(repository).to receive(:migration_pre_import).and_return(:already_imported)
+
+ expect { subject }
+ .to change { repository.reload.migration_state }.to('import_done')
+ .and change { repository.reload.migration_skipped_reason }.to('native_import')
+ end
+ end
+
+ context 'non-existing repository' do
+ it 'finishes the import' do
+ expect(repository).to receive(:migration_pre_import).and_return(:not_found)
+
+ expect { subject }
+ .to change { repository.reload.migration_state }.to('import_done')
+ .and change { repository.migration_skipped_reason }.to('not_found')
+ .and change { repository.migration_import_done_at }.from(nil)
+ end
+ end
end
shared_examples 'transitioning to importing', skip_import_success: true do
@@ -151,6 +172,16 @@ RSpec.describe ContainerRepository, :aggregate_failures do
expect(repository).to be_import_aborted
end
end
+
+ context 'already imported' do
+ it 'finishes the import' do
+ expect(repository).to receive(:migration_import).and_return(:already_imported)
+
+ expect { subject }
+ .to change { repository.reload.migration_state }.to('import_done')
+ .and change { repository.reload.migration_skipped_reason }.to('native_import')
+ end
+ end
end
shared_examples 'transitioning out of import_aborted' do
@@ -193,7 +224,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
- it_behaves_like 'transitioning from allowed states', %w[default]
+ it_behaves_like 'transitioning from allowed states', %w[default pre_importing importing import_aborted]
it_behaves_like 'transitioning to pre_importing'
end
@@ -208,7 +239,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
- it_behaves_like 'transitioning from allowed states', %w[import_aborted]
+ it_behaves_like 'transitioning from allowed states', %w[pre_importing importing import_aborted]
it_behaves_like 'transitioning to pre_importing'
it_behaves_like 'transitioning out of import_aborted'
end
@@ -218,7 +249,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
subject { repository.finish_pre_import }
- it_behaves_like 'transitioning from allowed states', %w[pre_importing import_aborted]
+ it_behaves_like 'transitioning from allowed states', %w[pre_importing importing import_aborted]
it 'sets migration_pre_import_done_at' do
expect { subject }.to change { repository.reload.migration_pre_import_done_at }
@@ -238,7 +269,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
- it_behaves_like 'transitioning from allowed states', %w[pre_import_done]
+ it_behaves_like 'transitioning from allowed states', %w[pre_import_done pre_importing importing import_aborted]
it_behaves_like 'transitioning to importing'
end
@@ -253,7 +284,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
- it_behaves_like 'transitioning from allowed states', %w[import_aborted]
+ it_behaves_like 'transitioning from allowed states', %w[pre_importing importing import_aborted]
it_behaves_like 'transitioning to importing'
it_behaves_like 'no action when feature flag is disabled'
end
@@ -263,7 +294,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
subject { repository.finish_import }
- it_behaves_like 'transitioning from allowed states', %w[importing import_aborted]
+ it_behaves_like 'transitioning from allowed states', %w[default pre_importing importing import_aborted]
it_behaves_like 'queueing the next import'
it 'sets migration_import_done_at and queues the next import' do
@@ -302,6 +333,19 @@ RSpec.describe ContainerRepository, :aggregate_failures do
expect(repository.migration_aborted_in_state).to eq('importing')
expect(repository).to be_import_aborted
end
+
+ context 'above the max retry limit' do
+ before do
+ stub_application_setting(container_registry_import_max_retries: 1)
+ end
+
+ it 'skips the migration' do
+ expect { subject }.to change { repository.migration_skipped_at }
+
+ expect(repository.reload).to be_import_skipped
+ expect(repository.migration_skipped_reason).to eq('too_many_retries')
+ end
+ end
end
describe '#skip_import' do
@@ -309,7 +353,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
subject { repository.skip_import(reason: :too_many_retries) }
- it_behaves_like 'transitioning from allowed states', ContainerRepository::ABORTABLE_MIGRATION_STATES
+ it_behaves_like 'transitioning from allowed states', ContainerRepository::SKIPPABLE_MIGRATION_STATES
it 'sets migration_skipped_at and migration_skipped_reason' do
expect { subject }.to change { repository.reload.migration_skipped_at }
@@ -334,7 +378,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
- it_behaves_like 'transitioning from allowed states', %w[pre_importing import_aborted]
+ it_behaves_like 'transitioning from allowed states', %w[pre_importing importing import_aborted]
it_behaves_like 'transitioning to importing'
end
end
@@ -391,7 +435,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
describe '#retry_aborted_migration' do
subject { repository.retry_aborted_migration }
- shared_examples 'no action' do
+ context 'when migration_state is not aborted' do
it 'does nothing' do
expect { subject }.not_to change { repository.reload.migration_state }
@@ -399,104 +443,45 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
- shared_examples 'retrying the pre_import' do
- it 'retries the pre_import' do
- expect(repository).to receive(:migration_pre_import).and_return(:ok)
-
- expect { subject }.to change { repository.reload.migration_state }.to('pre_importing')
- end
- end
-
- shared_examples 'retrying the import' do
- it 'retries the import' do
- expect(repository).to receive(:migration_import).and_return(:ok)
-
- expect { subject }.to change { repository.reload.migration_state }.to('importing')
- end
- end
-
- context 'when migration_state is not aborted' do
- it_behaves_like 'no action'
- end
-
context 'when migration_state is aborted' do
before do
repository.abort_import
allow(repository.gitlab_api_client)
- .to receive(:import_status).with(repository.path).and_return(client_response)
+ .to receive(:import_status).with(repository.path).and_return(status)
end
- context 'native response' do
- let(:client_response) { 'native' }
-
- it 'raises an error' do
- expect { subject }.to raise_error(described_class::NativeImportError)
- end
- end
+ it_behaves_like 'reconciling migration_state' do
+ context 'error response' do
+ let(:status) { 'error' }
- context 'import_in_progress response' do
- let(:client_response) { 'import_in_progress' }
-
- it_behaves_like 'no action'
- end
-
- context 'import_complete response' do
- let(:client_response) { 'import_complete' }
-
- it 'finishes the import' do
- expect { subject }.to change { repository.reload.migration_state }.to('import_done')
- end
- end
-
- context 'import_failed response' do
- let(:client_response) { 'import_failed' }
-
- it_behaves_like 'retrying the import'
- end
-
- context 'pre_import_in_progress response' do
- let(:client_response) { 'pre_import_in_progress' }
-
- it_behaves_like 'no action'
- end
+ context 'migration_pre_import_done_at is NULL' do
+ it_behaves_like 'retrying the pre_import'
+ end
- context 'pre_import_complete response' do
- let(:client_response) { 'pre_import_complete' }
+ context 'migration_pre_import_done_at is not NULL' do
+ before do
+ repository.update_columns(
+ migration_pre_import_started_at: 5.minutes.ago,
+ migration_pre_import_done_at: Time.zone.now
+ )
+ end
- it 'finishes the pre_import and starts the import' do
- expect(repository).to receive(:finish_pre_import).and_call_original
- expect(repository).to receive(:migration_import).and_return(:ok)
-
- expect { subject }.to change { repository.reload.migration_state }.to('importing')
+ it_behaves_like 'retrying the import'
+ end
end
end
+ end
+ end
- context 'pre_import_failed response' do
- let(:client_response) { 'pre_import_failed' }
-
- it_behaves_like 'retrying the pre_import'
- end
-
- context 'error response' do
- let(:client_response) { 'error' }
-
- context 'migration_pre_import_done_at is NULL' do
- it_behaves_like 'retrying the pre_import'
- end
-
- context 'migration_pre_import_done_at is not NULL' do
- before do
- repository.update_columns(
- migration_pre_import_started_at: 5.minutes.ago,
- migration_pre_import_done_at: Time.zone.now
- )
- end
+ describe '#reconcile_import_status' do
+ subject { repository.reconcile_import_status(status) }
- it_behaves_like 'retrying the import'
- end
- end
+ before do
+ repository.abort_import
end
+
+ it_behaves_like 'reconciling migration_state'
end
describe '#tag' do
@@ -667,7 +652,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
context 'supports gitlab api on .com with a recent repository' do
before do
expect(repository.gitlab_api_client).to receive(:supports_gitlab_api?).and_return(true)
- expect(repository.gitlab_api_client).to receive(:repository_details).with(repository.path, with_size: true).and_return(response)
+ expect(repository.gitlab_api_client).to receive(:repository_details).with(repository.path, sizing: :self).and_return(response)
end
context 'with a size_bytes field' do
@@ -722,12 +707,12 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
context 'registry migration' do
- shared_examples 'handling the migration step' do |step|
- let(:client_response) { :foobar }
+ before do
+ allow(repository.gitlab_api_client).to receive(:supports_gitlab_api?).and_return(true)
+ end
- before do
- allow(repository.gitlab_api_client).to receive(:supports_gitlab_api?).and_return(true)
- end
+ shared_examples 'gitlab migration client request' do |step|
+ let(:client_response) { :foobar }
it 'returns the same response as the client' do
expect(repository.gitlab_api_client)
@@ -746,6 +731,10 @@ RSpec.describe ContainerRepository, :aggregate_failures do
expect(subject).to eq(:error)
end
end
+ end
+
+ shared_examples 'handling the migration step' do |step|
+ it_behaves_like 'gitlab migration client request', step
context 'too many imports' do
it 'raises an error when it receives too_many_imports as a response' do
@@ -767,6 +756,67 @@ RSpec.describe ContainerRepository, :aggregate_failures do
it_behaves_like 'handling the migration step', :import_repository
end
+
+ describe '#migration_cancel' do
+ subject { repository.migration_cancel }
+
+ it_behaves_like 'gitlab migration client request', :cancel_repository_import
+ end
+
+ describe '#force_migration_cancel' do
+ subject { repository.force_migration_cancel }
+
+ shared_examples 'returning the same response as the client' do
+ it 'returns the same response' do
+ expect(repository.gitlab_api_client)
+ .to receive(:cancel_repository_import).with(repository.path, force: true).and_return(client_response)
+
+ expect(subject).to eq(client_response)
+ end
+ end
+
+ context 'successful cancellation' do
+ let(:client_response) { { status: :ok } }
+
+ it_behaves_like 'returning the same response as the client'
+
+ it 'skips the migration' do
+ expect(repository.gitlab_api_client)
+ .to receive(:cancel_repository_import).with(repository.path, force: true).and_return(client_response)
+
+ expect { subject }.to change { repository.reload.migration_state }.to('import_skipped')
+ .and change { repository.migration_skipped_reason }.to('migration_forced_canceled')
+ .and change { repository.migration_skipped_at }
+ end
+ end
+
+ context 'failed cancellation' do
+ let(:client_response) { { status: :error } }
+
+ it_behaves_like 'returning the same response as the client'
+
+ it 'does not skip the migration' do
+ expect(repository.gitlab_api_client)
+ .to receive(:cancel_repository_import).with(repository.path, force: true).and_return(client_response)
+
+ expect { subject }.to not_change { repository.reload.migration_state }
+ .and not_change { repository.migration_skipped_reason }
+ .and not_change { repository.migration_skipped_at }
+ end
+ end
+
+ context 'when the gitlab_api feature is not supported' do
+ before do
+ allow(repository.gitlab_api_client).to receive(:supports_gitlab_api?).and_return(false)
+ end
+
+ it 'returns :error' do
+ expect(repository.gitlab_api_client).not_to receive(:cancel_repository_import)
+
+ expect(subject).to eq(:error)
+ end
+ end
+ end
end
describe '.build_from_path' do
@@ -1081,6 +1131,43 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
+ describe '.all_migrated?' do
+ let_it_be(:project) { create(:project) }
+
+ subject { project.container_repositories.all_migrated? }
+
+ context 'with no repositories' do
+ it { is_expected.to be_truthy }
+ end
+
+ context 'with only recent repositories' do
+ let_it_be(:container_repository1) { create(:container_repository, project: project) }
+ let_it_be_with_reload(:container_repository2) { create(:container_repository, project: project) }
+
+ it { is_expected.to be_truthy }
+
+ context 'with one old non migrated repository' do
+ before do
+ container_repository2.update!(created_at: described_class::MIGRATION_PHASE_1_ENDED_AT - 3.months)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'with one old migrated repository' do
+ before do
+ container_repository2.update!(
+ created_at: described_class::MIGRATION_PHASE_1_ENDED_AT - 3.months,
+ migration_state: 'import_done',
+ migration_import_done_at: Time.zone.now
+ )
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+ end
+
describe '.with_enabled_policy' do
let_it_be(:repository) { create(:container_repository) }
let_it_be(:repository2) { create(:container_repository) }
@@ -1168,6 +1255,17 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
+ context 'not found response' do
+ let(:response) { :not_found }
+
+ it 'completes the migration' do
+ expect(subject).to eq(false)
+
+ expect(container_repository).to be_import_done
+ expect(container_repository.reload.migration_skipped_reason).to eq('not_found')
+ end
+ end
+
context 'other response' do
let(:response) { :error }
@@ -1185,6 +1283,30 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
+ describe '#retried_too_many_times?' do
+ subject { repository.retried_too_many_times? }
+
+ before do
+ stub_application_setting(container_registry_import_max_retries: 3)
+ end
+
+ context 'migration_retries_count is equal or greater than max_retries' do
+ before do
+ repository.update_column(:migration_retries_count, 3)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'migration_retries_count is lower than max_retries' do
+ before do
+ repository.update_column(:migration_retries_count, 2)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
context 'with repositories' do
let_it_be_with_reload(:repository) { create(:container_repository, :cleanup_unscheduled) }
let_it_be(:other_repository) { create(:container_repository, :cleanup_unscheduled) }
@@ -1241,11 +1363,12 @@ RSpec.describe ContainerRepository, :aggregate_failures do
let_it_be(:import_done_repository) { create(:container_repository, :import_done, migration_pre_import_done_at: 3.days.ago, migration_import_done_at: 2.days.ago) }
let_it_be(:import_aborted_repository) { create(:container_repository, :import_aborted, migration_pre_import_done_at: 5.days.ago, migration_aborted_at: 1.day.ago) }
let_it_be(:pre_import_done_repository) { create(:container_repository, :pre_import_done, migration_pre_import_done_at: 1.hour.ago) }
+ let_it_be(:import_skipped_repository) { create(:container_repository, :import_skipped, migration_skipped_at: 90.minutes.ago) }
subject { described_class.recently_done_migration_step }
it 'returns completed imports by done_at date' do
- expect(subject.to_a).to eq([pre_import_done_repository, import_aborted_repository, import_done_repository])
+ expect(subject.to_a).to eq([pre_import_done_repository, import_skipped_repository, import_aborted_repository, import_done_repository])
end
end
@@ -1255,7 +1378,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
subject { described_class.ready_for_import }
before do
- stub_application_setting(container_registry_import_target_plan: root_group.actual_plan_name)
+ stub_application_setting(container_registry_import_target_plan: valid_container_repository.migration_plan)
end
it 'works' do
@@ -1266,13 +1389,15 @@ RSpec.describe ContainerRepository, :aggregate_failures do
describe '#last_import_step_done_at' do
let_it_be(:aborted_at) { Time.zone.now - 1.hour }
let_it_be(:pre_import_done_at) { Time.zone.now - 2.hours }
+ let_it_be(:skipped_at) { Time.zone.now - 3.hours }
subject { repository.last_import_step_done_at }
before do
repository.update_columns(
migration_pre_import_done_at: pre_import_done_at,
- migration_aborted_at: aborted_at
+ migration_aborted_at: aborted_at,
+ migration_skipped_at: skipped_at
)
end
diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb
index 01252a58681..15655d08556 100644
--- a/spec/models/custom_emoji_spec.rb
+++ b/spec/models/custom_emoji_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe CustomEmoji do
new_emoji = build(:custom_emoji, name: old_emoji.name, namespace: old_emoji.namespace, group: group)
expect(new_emoji).not_to be_valid
- expect(new_emoji.errors.messages).to eq(creator: ["can't be blank"], name: ["has already been taken"])
+ expect(new_emoji.errors.messages).to eq(name: ["has already been taken"])
end
it 'disallows non http and https file value' do
diff --git a/spec/models/customer_relations/contact_spec.rb b/spec/models/customer_relations/contact_spec.rb
index 18896962261..86f868b269e 100644
--- a/spec/models/customer_relations/contact_spec.rb
+++ b/spec/models/customer_relations/contact_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe CustomerRelations::Contact, type: :model do
it { is_expected.to validate_length_of(:email).is_at_most(255) }
it { is_expected.to validate_length_of(:description).is_at_most(1024) }
- it { is_expected.to validate_uniqueness_of(:email).scoped_to(:group_id) }
+ it { is_expected.to validate_uniqueness_of(:email).case_insensitive.scoped_to(:group_id) }
it_behaves_like 'an object with RFC3696 compliant email-formatted attributes', :email
end
@@ -87,6 +87,15 @@ RSpec.describe CustomerRelations::Contact, type: :model do
too_many_emails = described_class::MAX_PLUCK + 1
expect { described_class.find_ids_by_emails(group, Array(0..too_many_emails)) }.to raise_error(ArgumentError)
end
+
+ it 'finds contacts regardless of email casing' do
+ new_contact = create(:contact, group: group, email: "UPPERCASE@example.com")
+ emails = [group_contacts[0].email.downcase, group_contacts[1].email.upcase, new_contact.email]
+
+ contact_ids = described_class.find_ids_by_emails(group, emails)
+
+ expect(contact_ids).to contain_exactly(group_contacts[0].id, group_contacts[1].id, new_contact.id)
+ end
end
describe '#self.exists_for_group?' do
@@ -104,4 +113,33 @@ RSpec.describe CustomerRelations::Contact, type: :model do
end
end
end
+
+ describe '#self.move_to_root_group' do
+ let!(:old_root_group) { create(:group) }
+ let!(:contacts) { create_list(:contact, 4, group: old_root_group) }
+ let!(:project) { create(:project, group: old_root_group) }
+ let!(:issue) { create(:issue, project: project) }
+ let!(:issue_contact1) { create(:issue_customer_relations_contact, issue: issue, contact: contacts[0]) }
+ let!(:issue_contact2) { create(:issue_customer_relations_contact, issue: issue, contact: contacts[1]) }
+ let!(:new_root_group) { create(:group) }
+ let!(:dupe_contact1) { create(:contact, group: new_root_group, email: contacts[1].email) }
+ let!(:dupe_contact2) { create(:contact, group: new_root_group, email: contacts[3].email.upcase) }
+
+ before do
+ old_root_group.update!(parent: new_root_group)
+ CustomerRelations::Contact.move_to_root_group(old_root_group)
+ end
+
+ it 'moves contacts with unique emails and deletes the rest' do
+ expect(contacts[0].reload.group_id).to eq(new_root_group.id)
+ expect(contacts[2].reload.group_id).to eq(new_root_group.id)
+ expect { contacts[1].reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { contacts[3].reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'updates issue_contact.contact_id for dupes and leaves the rest untouched' do
+ expect(issue_contact1.reload.contact_id).to eq(contacts[0].id)
+ expect(issue_contact2.reload.contact_id).to eq(dupe_contact1.id)
+ end
+ end
end
diff --git a/spec/models/customer_relations/issue_contact_spec.rb b/spec/models/customer_relations/issue_contact_spec.rb
index f1fb574f86f..221378d26b2 100644
--- a/spec/models/customer_relations/issue_contact_spec.rb
+++ b/spec/models/customer_relations/issue_contact_spec.rb
@@ -92,4 +92,16 @@ RSpec.describe CustomerRelations::IssueContact do
expect { described_class.delete_for_project(project.id) }.to change { described_class.count }.by(-3)
end
end
+
+ describe '.delete_for_group' do
+ let(:project_for_root_group) { create(:project, group: group) }
+
+ it 'destroys all issue_contacts for projects in group and subgroups' do
+ create_list(:issue_customer_relations_contact, 2, :for_issue, issue: create(:issue, project: project))
+ create_list(:issue_customer_relations_contact, 2, :for_issue, issue: create(:issue, project: project_for_root_group))
+ create(:issue_customer_relations_contact)
+
+ expect { described_class.delete_for_group(group) }.to change { described_class.count }.by(-4)
+ end
+ end
end
diff --git a/spec/models/customer_relations/organization_spec.rb b/spec/models/customer_relations/organization_spec.rb
index 9fe754b7605..06ba9c5b7ad 100644
--- a/spec/models/customer_relations/organization_spec.rb
+++ b/spec/models/customer_relations/organization_spec.rb
@@ -50,4 +50,32 @@ RSpec.describe CustomerRelations::Organization, type: :model do
expect(described_class.find_by_name(group.id, 'TEST')).to eq([organiztion1])
end
end
+
+ describe '#self.move_to_root_group' do
+ let!(:old_root_group) { create(:group) }
+ let!(:organizations) { create_list(:organization, 4, group: old_root_group) }
+ let!(:new_root_group) { create(:group) }
+ let!(:contact1) { create(:contact, group: new_root_group, organization: organizations[0]) }
+ let!(:contact2) { create(:contact, group: new_root_group, organization: organizations[1]) }
+
+ let!(:dupe_organization1) { create(:organization, group: new_root_group, name: organizations[1].name) }
+ let!(:dupe_organization2) { create(:organization, group: new_root_group, name: organizations[3].name.upcase) }
+
+ before do
+ old_root_group.update!(parent: new_root_group)
+ CustomerRelations::Organization.move_to_root_group(old_root_group)
+ end
+
+ it 'moves organizations with unique names and deletes the rest' do
+ expect(organizations[0].reload.group_id).to eq(new_root_group.id)
+ expect(organizations[2].reload.group_id).to eq(new_root_group.id)
+ expect { organizations[1].reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { organizations[3].reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it 'updates contact.organization_id for dupes and leaves the rest untouched' do
+ expect(contact1.reload.organization_id).to eq(organizations[0].id)
+ expect(contact2.reload.organization_id).to eq(dupe_organization1.id)
+ end
+ end
end
diff --git a/spec/models/deploy_token_spec.rb b/spec/models/deploy_token_spec.rb
index 88451307efb..c48f1fab3c6 100644
--- a/spec/models/deploy_token_spec.rb
+++ b/spec/models/deploy_token_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe DeployToken do
it { is_expected.to have_many(:projects).through(:project_deploy_tokens) }
it { is_expected.to have_many :group_deploy_tokens }
it { is_expected.to have_many(:groups).through(:group_deploy_tokens) }
+ it { is_expected.to belong_to(:user).with_foreign_key('creator_id') }
it_behaves_like 'having unique enum values'
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index 47c246d12cc..705b9b4cc65 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -524,6 +524,16 @@ RSpec.describe Deployment do
is_expected.to contain_exactly(deployment1, deployment2, deployment3, deployment4, deployment5)
end
+
+ it 'has a corresponding database index' do
+ index = ApplicationRecord.connection.indexes('deployments').find do |i|
+ i.name == 'index_deployments_for_visible_scope'
+ end
+
+ scope_values = described_class::VISIBLE_STATUSES.map { |s| described_class.statuses[s] }.to_s
+
+ expect(index.where).to include(scope_values)
+ end
end
describe 'upcoming' do
@@ -1055,6 +1065,40 @@ RSpec.describe Deployment do
end
end
+ describe '#tier_in_yaml' do
+ context 'when deployable is nil' do
+ before do
+ subject.deployable = nil
+ end
+
+ it 'returns nil' do
+ expect(subject.tier_in_yaml).to be_nil
+ end
+ end
+
+ context 'when deployable is present' do
+ context 'when tier is specified' do
+ let(:deployable) { create(:ci_build, :success, :environment_with_deployment_tier) }
+
+ before do
+ subject.deployable = deployable
+ end
+
+ it 'returns the tier' do
+ expect(subject.tier_in_yaml).to eq('testing')
+ end
+
+ context 'when tier is not specified' do
+ let(:deployable) { create(:ci_build, :success) }
+
+ it 'returns nil' do
+ expect(subject.tier_in_yaml).to be_nil
+ end
+ end
+ end
+ end
+ end
+
describe '.fast_destroy_all' do
it 'cleans path_refs for destroyed environments' do
project = create(:project, :repository)
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index 6144593395c..b42e73e6d93 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -23,7 +23,6 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
it { is_expected.to have_one(:upcoming_deployment) }
it { is_expected.to have_one(:latest_opened_most_severe_alert) }
- it { is_expected.to delegate_method(:stop_action).to(:last_deployment) }
it { is_expected.to delegate_method(:manual_actions).to(:last_deployment) }
it { is_expected.to validate_presence_of(:name) }
@@ -349,15 +348,28 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
end
describe '.with_deployment' do
- subject { described_class.with_deployment(sha) }
+ subject { described_class.with_deployment(sha, status: status) }
let(:environment) { create(:environment, project: project) }
let(:sha) { 'b83d6e391c22777fca1ed3012fce84f633d7fed0' }
+ let(:status) { nil }
context 'when deployment has the specified sha' do
let!(:deployment) { create(:deployment, environment: environment, sha: sha) }
it { is_expected.to eq([environment]) }
+
+ context 'with success status filter' do
+ let(:status) { :success }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'with created status filter' do
+ let(:status) { :created }
+
+ it { is_expected.to contain_exactly(environment) }
+ end
end
context 'when deployment does not have the specified sha' do
@@ -459,8 +471,8 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
end
end
- describe '#stop_action_available?' do
- subject { environment.stop_action_available? }
+ describe '#stop_actions_available?' do
+ subject { environment.stop_actions_available? }
context 'when no other actions' do
it { is_expected.to be_falsey }
@@ -499,10 +511,10 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
end
end
- describe '#stop_with_action!' do
+ describe '#stop_with_actions!' do
let(:user) { create(:user) }
- subject { environment.stop_with_action!(user) }
+ subject { environment.stop_with_actions!(user) }
before do
expect(environment).to receive(:available?).and_call_original
@@ -515,9 +527,10 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
end
it do
- subject
+ actions = subject
expect(environment).to be_stopped
+ expect(actions).to match_array([])
end
end
@@ -536,18 +549,18 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
context 'when matching action is defined' do
let(:pipeline) { create(:ci_pipeline, project: project) }
- let(:build) { create(:ci_build, pipeline: pipeline) }
+ let(:build_a) { create(:ci_build, pipeline: pipeline) }
- let!(:deployment) do
+ before do
create(:deployment, :success,
- environment: environment,
- deployable: build,
- on_stop: 'close_app')
+ environment: environment,
+ deployable: build_a,
+ on_stop: 'close_app_a')
end
context 'when user is not allowed to stop environment' do
let!(:close_action) do
- create(:ci_build, :manual, pipeline: pipeline, name: 'close_app')
+ create(:ci_build, :manual, pipeline: pipeline, name: 'close_app_a')
end
it 'raises an exception' do
@@ -565,31 +578,200 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
context 'when action did not yet finish' do
let!(:close_action) do
- create(:ci_build, :manual, pipeline: pipeline, name: 'close_app')
+ create(:ci_build, :manual, pipeline: pipeline, name: 'close_app_a')
end
it 'returns the same action' do
- expect(subject).to eq(close_action)
- expect(subject.user).to eq(user)
+ action = subject.first
+ expect(action).to eq(close_action)
+ expect(action.user).to eq(user)
end
end
context 'if action did finish' do
let!(:close_action) do
create(:ci_build, :manual, :success,
- pipeline: pipeline, name: 'close_app')
+ pipeline: pipeline, name: 'close_app_a')
end
it 'returns a new action of the same type' do
- expect(subject).to be_persisted
- expect(subject.name).to eq(close_action.name)
- expect(subject.user).to eq(user)
+ action = subject.first
+
+ expect(action).to be_persisted
+ expect(action.name).to eq(close_action.name)
+ expect(action.user).to eq(user)
+ end
+ end
+
+ context 'close action does not raise ActiveRecord::StaleObjectError' do
+ let!(:close_action) do
+ create(:ci_build, :manual, pipeline: pipeline, name: 'close_app_a')
+ end
+
+ before do
+ # preload the build
+ environment.stop_actions
+
+ # Update record as the other process. This makes `environment.stop_action` stale.
+ close_action.drop!
end
+
+ it 'successfully plays the build even if the build was a stale object' do
+ # Since build is droped.
+ expect(close_action.processed).to be_falsey
+
+ # it encounters the StaleObjectError at first, but reloads the object and runs `build.play`
+ expect { subject }.not_to raise_error(ActiveRecord::StaleObjectError)
+
+ # Now the build should be processed.
+ expect(close_action.reload.processed).to be_truthy
+ end
+ end
+ end
+ end
+
+ context 'when there are more then one stop action for the environment' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:build_a) { create(:ci_build, pipeline: pipeline) }
+ let(:build_b) { create(:ci_build, pipeline: pipeline) }
+
+ let!(:close_actions) do
+ [
+ create(:ci_build, :manual, pipeline: pipeline, name: 'close_app_a'),
+ create(:ci_build, :manual, pipeline: pipeline, name: 'close_app_b')
+ ]
+ end
+
+ before do
+ project.add_developer(user)
+
+ create(:deployment, :success,
+ environment: environment,
+ deployable: build_a,
+ finished_at: 5.minutes.ago,
+ on_stop: 'close_app_a')
+
+ create(:deployment, :success,
+ environment: environment,
+ deployable: build_b,
+ finished_at: 1.second.ago,
+ on_stop: 'close_app_b')
+ end
+
+ it 'returns the same actions' do
+ actions = subject
+
+ expect(actions.count).to eq(close_actions.count)
+ expect(actions.pluck(:id)).to match_array(close_actions.pluck(:id))
+ expect(actions.pluck(:user)).to match_array(close_actions.pluck(:user))
+ end
+
+ context 'when there are failed deployment jobs' do
+ before do
+ create(:ci_build, pipeline: pipeline, name: 'close_app_c')
+
+ create(:deployment, :failed,
+ environment: environment,
+ deployable: create(:ci_build, pipeline: pipeline),
+ on_stop: 'close_app_c')
+ end
+
+ it 'returns only stop actions from successful deployment jobs' do
+ actions = subject
+
+ expect(actions).to match_array(close_actions)
+ expect(actions.count).to eq(environment.successful_deployments.count)
+ end
+ end
+
+ context 'when the feature is disabled' do
+ before do
+ stub_feature_flags(environment_multiple_stop_actions: false)
+ end
+
+ it 'returns the last deployment job stop action' do
+ stop_actions = subject
+
+ expect(stop_actions.first).to eq(close_actions[1])
+ expect(stop_actions.count).to eq(1)
end
end
end
end
+ describe '#stop_actions' do
+ subject { environment.stop_actions }
+
+ context 'when there are no deployments and builds' do
+ it 'returns empty array' do
+ is_expected.to match_array([])
+ end
+ end
+
+ context 'when there are multiple deployments with actions' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:ci_build_a) { create(:ci_build, project: project, pipeline: pipeline) }
+ let(:ci_build_b) { create(:ci_build, project: project, pipeline: pipeline) }
+ let!(:ci_build_c) { create(:ci_build, :manual, project: project, pipeline: pipeline, name: 'close_app_a') }
+ let!(:ci_build_d) { create(:ci_build, :manual, project: project, pipeline: pipeline, name: 'close_app_b') }
+
+ let!(:deployment_a) do
+ create(:deployment,
+ :success, project: project, environment: environment, deployable: ci_build_a, on_stop: 'close_app_a')
+ end
+
+ let!(:deployment_b) do
+ create(:deployment,
+ :success, project: project, environment: environment, deployable: ci_build_b, on_stop: 'close_app_b')
+ end
+
+ before do
+ # Create failed deployment without stop_action.
+ build = create(:ci_build, project: project, pipeline: pipeline)
+ create(:deployment, :failed, project: project, environment: environment, deployable: build)
+ end
+
+ it 'returns only the stop actions' do
+ expect(subject.pluck(:id)).to contain_exactly(ci_build_c.id, ci_build_d.id)
+ end
+ end
+ end
+
+ describe '#last_deployment_group' do
+ subject { environment.last_deployment_group }
+
+ context 'when there are no deployments and builds' do
+ it do
+ is_expected.to eq(Deployment.none)
+ end
+ end
+
+ context 'when there are deployments for multiple pipelines' do
+ let(:pipeline_a) { create(:ci_pipeline, project: project) }
+ let(:pipeline_b) { create(:ci_pipeline, project: project) }
+ let(:ci_build_a) { create(:ci_build, project: project, pipeline: pipeline_a) }
+ let(:ci_build_b) { create(:ci_build, project: project, pipeline: pipeline_b) }
+ let(:ci_build_c) { create(:ci_build, project: project, pipeline: pipeline_a) }
+ let(:ci_build_d) { create(:ci_build, project: project, pipeline: pipeline_a) }
+
+ # Successful deployments for pipeline_a
+ let!(:deployment_a) { create(:deployment, :success, project: project, environment: environment, deployable: ci_build_a) }
+ let!(:deployment_b) { create(:deployment, :success, project: project, environment: environment, deployable: ci_build_c) }
+
+ before do
+ # Failed deployment for pipeline_a
+ create(:deployment, :failed, project: project, environment: environment, deployable: ci_build_d)
+
+ # Failed deployment for pipeline_b
+ create(:deployment, :failed, project: project, environment: environment, deployable: ci_build_b)
+ end
+
+ it 'returns the successful deployment jobs for the last deployment pipeline' do
+ expect(subject.pluck(:id)).to contain_exactly(deployment_a.id, deployment_b.id)
+ end
+ end
+ end
+
describe 'recently_updated_on_branch?' do
subject { environment.recently_updated_on_branch?('feature') }
@@ -698,10 +880,29 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
context 'when there is a deployment record with success status' do
let!(:deployment) { create(:deployment, :success, environment: environment) }
+ let!(:old_deployment) { create(:deployment, :success, environment: environment, finished_at: 2.days.ago) }
it 'returns the latest successful deployment' do
is_expected.to eq(deployment)
end
+
+ context 'env_last_deployment_by_finished_at feature flag' do
+ it 'when enabled it returns the deployment with the latest finished_at' do
+ stub_feature_flags(env_last_deployment_by_finished_at: true)
+
+ expect(old_deployment.finished_at < deployment.finished_at).to be_truthy
+
+ is_expected.to eq(deployment)
+ end
+
+ it 'when disabled it returns the deployment with the highest id' do
+ stub_feature_flags(env_last_deployment_by_finished_at: false)
+
+ expect(old_deployment.finished_at < deployment.finished_at).to be_truthy
+
+ is_expected.to eq(old_deployment)
+ end
+ end
end
end
end
@@ -728,6 +929,26 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
end
end
+ describe '#last_deployment_pipeline' do
+ subject { environment.last_deployment_pipeline }
+
+ let(:pipeline_a) { create(:ci_pipeline, project: project) }
+ let(:pipeline_b) { create(:ci_pipeline, project: project) }
+ let(:ci_build_a) { create(:ci_build, project: project, pipeline: pipeline_a) }
+ let(:ci_build_b) { create(:ci_build, project: project, pipeline: pipeline_b) }
+
+ before do
+ create(:deployment, :success, project: project, environment: environment, deployable: ci_build_a)
+ create(:deployment, :failed, project: project, environment: environment, deployable: ci_build_b)
+ end
+
+ it 'does not join across databases' do
+ with_cross_joins_prevented do
+ expect(subject.id).to eq(pipeline_a.id)
+ end
+ end
+ end
+
describe '#last_visible_deployment' do
subject { environment.last_visible_deployment }
diff --git a/spec/models/environment_status_spec.rb b/spec/models/environment_status_spec.rb
index 1db1171401c..a9aa5698ebb 100644
--- a/spec/models/environment_status_spec.rb
+++ b/spec/models/environment_status_spec.rb
@@ -34,6 +34,13 @@ RSpec.describe EnvironmentStatus do
subject { environment_status.deployment }
it { is_expected.to eq(deployment) }
+
+ context 'multiple deployments' do
+ it {
+ new_deployment = create(:deployment, :succeed, environment: deployment.environment, sha: deployment.sha )
+ is_expected.to eq(new_deployment)
+ }
+ end
end
# $ git diff --stat pages-deploy-target...pages-deploy
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 d700eb5eaf7..2939a40a84f 100644
--- a/spec/models/error_tracking/project_error_tracking_setting_spec.rb
+++ b/spec/models/error_tracking/project_error_tracking_setting_spec.rb
@@ -8,6 +8,8 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
let_it_be(:project) { create(:project) }
+ let(:sentry_client) { instance_double(ErrorTracking::SentryClient) }
+
subject(:setting) { build(:project_error_tracking_setting, project: project) }
describe 'Associations' do
@@ -48,7 +50,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
expect(subject.errors.messages[:project]).to include('is a required field')
end
- context 'presence validations' do
+ describe 'presence validations' do
using RSpec::Parameterized::TableSyntax
valid_api_url = 'http://example.com/api/0/projects/org-slug/proj-slug/'
@@ -83,12 +85,12 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
describe 'after_save :create_client_key!' do
subject { build(:project_error_tracking_setting, :integrated, project: project) }
- context 'no client key yet' do
+ context 'without client key' do
it 'creates a new client key' do
expect { subject.save! }.to change { ErrorTracking::ClientKey.count }.by(1)
end
- context 'sentry backend' do
+ context 'with sentry backend' do
before do
subject.integrated = false
end
@@ -98,7 +100,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
end
- context 'feature disabled' do
+ context 'when feature disabled' do
before do
subject.enabled = false
end
@@ -109,7 +111,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
end
- context 'client key already exists' do
+ context 'when client key already exists' do
let!(:client_key) { create(:error_tracking_client_key, project: project) }
it 'does not create a new client key' do
@@ -122,13 +124,13 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
describe '.extract_sentry_external_url' do
subject { described_class.extract_sentry_external_url(sentry_url) }
- describe 'when passing a URL' do
+ context 'when passing a URL' do
let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project' }
it { is_expected.to eq('https://sentrytest.gitlab.com/sentry-org/sentry-project') }
end
- describe 'when passing nil' do
+ context 'when passing nil' do
let(:sentry_url) { nil }
it { is_expected.to be_nil }
@@ -159,23 +161,15 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
describe '#list_sentry_issues' do
let(:issues) { [:list, :of, :issues] }
-
- let(:opts) do
- { issue_status: 'unresolved', limit: 10 }
- end
-
- let(:result) do
- subject.list_sentry_issues(**opts)
- end
+ let(:result) { subject.list_sentry_issues(**opts) }
+ let(:opts) { { issue_status: 'unresolved', limit: 10 } }
context 'when cached' do
- let(:sentry_client) { spy(:sentry_client) }
-
before do
stub_reactive_cache(subject, issues, opts)
synchronous_reactive_cache(subject)
- expect(subject).to receive(:sentry_client).and_return(sentry_client)
+ allow(subject).to receive(:sentry_client).and_return(sentry_client)
end
it 'returns cached issues' do
@@ -195,8 +189,6 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
context 'when sentry client raises ErrorTracking::SentryClient::Error' do
- let(:sentry_client) { spy(:sentry_client) }
-
before do
synchronous_reactive_cache(subject)
@@ -214,14 +206,13 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
context 'when sentry client raises ErrorTracking::SentryClient::MissingKeysError' do
- let(:sentry_client) { spy(:sentry_client) }
-
before do
synchronous_reactive_cache(subject)
allow(subject).to receive(:sentry_client).and_return(sentry_client)
allow(sentry_client).to receive(:list_issues).with(opts)
- .and_raise(ErrorTracking::SentryClient::MissingKeysError, 'Sentry API response is missing keys. key not found: "id"')
+ .and_raise(ErrorTracking::SentryClient::MissingKeysError,
+ 'Sentry API response is missing keys. key not found: "id"')
end
it 'returns error' do
@@ -233,8 +224,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
context 'when sentry client raises ErrorTracking::SentryClient::ResponseInvalidSizeError' do
- let(:sentry_client) { spy(:sentry_client) }
- let(:error_msg) {"Sentry API response is too big. Limit is #{Gitlab::Utils::DeepSize.human_default_max_size}."}
+ let(:error_msg) { "Sentry API response is too big. Limit is #{Gitlab::Utils::DeepSize.human_default_max_size}." }
before do
synchronous_reactive_cache(subject)
@@ -253,8 +243,6 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
context 'when sentry client raises StandardError' do
- let(:sentry_client) { spy(:sentry_client) }
-
before do
synchronous_reactive_cache(subject)
@@ -270,7 +258,6 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
describe '#list_sentry_projects' do
let(:projects) { [:list, :of, :projects] }
- let(:sentry_client) { spy(:sentry_client) }
it 'calls sentry client' do
expect(subject).to receive(:sentry_client).and_return(sentry_client)
@@ -284,19 +271,17 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
describe '#issue_details' do
let(:issue) { build(:error_tracking_sentry_detailed_error) }
- let(:sentry_client) { double('sentry_client', issue_details: issue) }
let(:commit_id) { issue.first_release_version }
-
- let(:result) do
- subject.issue_details
- end
+ let(:result) { subject.issue_details(opts) }
+ let(:opts) { { issue_id: 1 } }
context 'when cached' do
before do
stub_reactive_cache(subject, issue, {})
synchronous_reactive_cache(subject)
- expect(subject).to receive(:sentry_client).and_return(sentry_client)
+ allow(subject).to receive(:sentry_client).and_return(sentry_client)
+ allow(sentry_client).to receive(:issue_details).with(opts).and_return(issue)
end
it { expect(result).to eq(issue: issue) }
@@ -314,15 +299,15 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
context 'when repo commit matches first relase version' do
- let(:commit) { double('commit', id: commit_id) }
- let(:repository) { double('repository', commit: commit) }
+ let(:commit) { instance_double(Commit, id: commit_id) }
+ let(:repository) { instance_double(Repository, commit: commit) }
before do
- expect(project).to receive(:repository).and_return(repository)
+ allow(project).to receive(:repository).and_return(repository)
end
it { expect(result[:issue].gitlab_commit).to eq(commit_id) }
- it { expect(result[:issue].gitlab_commit_path).to eq("/#{project.namespace.path}/#{project.path}/-/commit/#{commit_id}") }
+ it { expect(result[:issue].gitlab_commit_path).to eq(project_commit_path(project, commit_id)) }
end
end
@@ -333,19 +318,15 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
describe '#update_issue' do
- let(:opts) do
- { status: 'resolved' }
- end
+ let(:result) { subject.update_issue(**opts) }
+ let(:opts) { { issue_id: 1, params: {} } }
- let(:result) do
- subject.update_issue(**opts)
+ before do
+ allow(subject).to receive(:sentry_client).and_return(sentry_client)
end
- let(:sentry_client) { spy(:sentry_client) }
-
- context 'successful call to sentry' do
+ context 'when sentry response is successful' do
before do
- allow(subject).to receive(:sentry_client).and_return(sentry_client)
allow(sentry_client).to receive(:update_issue).with(opts).and_return(true)
end
@@ -354,9 +335,8 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
end
- context 'sentry raises an error' do
+ context 'when sentry raises an error' do
before do
- allow(subject).to receive(:sentry_client).and_return(sentry_client)
allow(sentry_client).to receive(:update_issue).with(opts).and_raise(StandardError)
end
@@ -366,7 +346,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
end
- context 'slugs' do
+ describe 'slugs' do
shared_examples_for 'slug from api_url' do |method, slug|
context 'when api_url is correct' do
before do
@@ -393,9 +373,9 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
it_behaves_like 'slug from api_url', :organization_slug, 'org-slug'
end
- context 'names from api_url' do
+ describe 'names from api_url' do
shared_examples_for 'name from api_url' do |name, titleized_slug|
- context 'name is present in DB' do
+ context 'when name is present in DB' do
it 'returns name from DB' do
subject[name] = 'Sentry name'
subject.api_url = 'http://gitlab.com/api/0/projects/org-slug/project-slug'
@@ -404,7 +384,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
end
- context 'name is null in DB' do
+ context 'when name is null in DB' do
it 'titleizes and returns slug from api_url' do
subject[name] = nil
subject.api_url = 'http://gitlab.com/api/0/projects/org-slug/project-slug'
diff --git a/spec/models/group_group_link_spec.rb b/spec/models/group_group_link_spec.rb
index 034a5c1dfc6..72c700e7981 100644
--- a/spec/models/group_group_link_spec.rb
+++ b/spec/models/group_group_link_spec.rb
@@ -29,6 +29,49 @@ RSpec.describe GroupGroupLink do
])
end
end
+
+ describe '.distinct_on_shared_with_group_id_with_group_access' do
+ let_it_be(:sub_shared_group) { create(:group, parent: shared_group) }
+ let_it_be(:other_group) { create(:group) }
+
+ let_it_be(:group_group_link_2) do
+ create(
+ :group_group_link,
+ shared_group: shared_group,
+ shared_with_group: other_group,
+ group_access: Gitlab::Access::GUEST
+ )
+ end
+
+ let_it_be(:group_group_link_3) do
+ create(
+ :group_group_link,
+ shared_group: sub_shared_group,
+ shared_with_group: group,
+ group_access: Gitlab::Access::GUEST
+ )
+ end
+
+ let_it_be(:group_group_link_4) do
+ create(
+ :group_group_link,
+ shared_group: sub_shared_group,
+ shared_with_group: other_group,
+ group_access: Gitlab::Access::DEVELOPER
+ )
+ end
+
+ it 'returns only one group link per group (with max group access)' do
+ distinct_group_group_links = described_class.distinct_on_shared_with_group_id_with_group_access
+
+ expect(described_class.all.count).to eq(4)
+ expect(distinct_group_group_links.count).to eq(2)
+ expect(distinct_group_group_links).to include(group_group_link)
+ expect(distinct_group_group_links).not_to include(group_group_link_2)
+ expect(distinct_group_group_links).not_to include(group_group_link_3)
+ expect(distinct_group_group_links).to include(group_group_link_4)
+ end
+ end
end
describe 'validation' do
@@ -57,4 +100,9 @@ RSpec.describe GroupGroupLink do
group_group_link.human_access
end
end
+
+ describe 'search by group name' do
+ it { expect(described_class.search(group.name)).to eq([group_group_link]) }
+ it { expect(described_class.search('not-a-group-name')).to be_empty }
+ end
end
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index 45a2c134077..0ca1fe1c8a6 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -41,6 +41,7 @@ RSpec.describe Group do
it { is_expected.to have_many(:contacts).class_name('CustomerRelations::Contact') }
it { is_expected.to have_many(:organizations).class_name('CustomerRelations::Organization') }
it { is_expected.to have_one(:crm_settings) }
+ it { is_expected.to have_one(:group_feature) }
describe '#members & #requesters' do
let(:requester) { create(:user) }
@@ -293,6 +294,23 @@ RSpec.describe Group do
end
end
+ it_behaves_like 'a BulkUsersByEmailLoad model'
+
+ context 'after initialized' do
+ it 'has a group_feature' do
+ expect(described_class.new.group_feature).to be_present
+ end
+ end
+
+ context 'when creating a new project' do
+ let_it_be(:group) { create(:group) }
+
+ it 'automatically creates the groups feature for the group' do
+ expect(group.group_feature).to be_an_instance_of(Groups::FeatureSetting)
+ expect(group.group_feature).to be_persisted
+ end
+ end
+
context 'traversal_ids on create' do
context 'default traversal_ids' do
let(:group) { build(:group) }
@@ -533,6 +551,10 @@ RSpec.describe Group do
describe '#ancestors_upto' do
it { expect(group.ancestors_upto.to_sql).not_to include "WITH ORDINALITY" }
end
+
+ describe '.shortest_traversal_ids_prefixes' do
+ it { expect { described_class.shortest_traversal_ids_prefixes }.to raise_error /Feature not supported since the `:use_traversal_ids` is disabled/ }
+ end
end
context 'linear' do
@@ -574,6 +596,90 @@ RSpec.describe Group do
it { expect(group.ancestors_upto.to_sql).to include "WITH ORDINALITY" }
end
+ describe '.shortest_traversal_ids_prefixes' do
+ subject { filter.shortest_traversal_ids_prefixes }
+
+ context 'for many top-level namespaces' do
+ let!(:top_level_groups) { create_list(:group, 4) }
+
+ context 'when querying all groups' do
+ let(:filter) { described_class.id_in(top_level_groups) }
+
+ it "returns all traversal_ids" do
+ is_expected.to contain_exactly(
+ *top_level_groups.map { |group| [group.id] }
+ )
+ end
+ end
+
+ context 'when querying selected groups' do
+ let(:filter) { described_class.id_in(top_level_groups.first) }
+
+ it "returns only a selected traversal_ids" do
+ is_expected.to contain_exactly([top_level_groups.first.id])
+ end
+ end
+ end
+
+ context 'for namespace hierarchy' do
+ let!(:group_a) { create(:group) }
+ let!(:group_a_sub_1) { create(:group, parent: group_a) }
+ let!(:group_a_sub_2) { create(:group, parent: group_a) }
+ let!(:group_b) { create(:group) }
+ let!(:group_b_sub_1) { create(:group, parent: group_b) }
+ let!(:group_c) { create(:group) }
+
+ context 'when querying all groups' do
+ let(:filter) { described_class.id_in([group_a, group_a_sub_1, group_a_sub_2, group_b, group_b_sub_1, group_c]) }
+
+ it 'returns only shortest prefixes of top-level groups' do
+ is_expected.to contain_exactly(
+ [group_a.id],
+ [group_b.id],
+ [group_c.id]
+ )
+ end
+ end
+
+ context 'when sub-group is reparented' do
+ let(:filter) { described_class.id_in([group_b_sub_1, group_c]) }
+
+ before do
+ group_b_sub_1.update!(parent: group_c)
+ end
+
+ it 'returns a proper shortest prefix of a new group' do
+ is_expected.to contain_exactly(
+ [group_c.id]
+ )
+ end
+ end
+
+ context 'when querying sub-groups' do
+ let(:filter) { described_class.id_in([group_a_sub_1, group_b_sub_1, group_c]) }
+
+ it 'returns sub-groups as they are shortest prefixes' do
+ is_expected.to contain_exactly(
+ [group_a.id, group_a_sub_1.id],
+ [group_b.id, group_b_sub_1.id],
+ [group_c.id]
+ )
+ end
+ end
+
+ context 'when querying group and sub-group of this group' do
+ let(:filter) { described_class.id_in([group_a, group_a_sub_1, group_c]) }
+
+ it 'returns parent groups as this contains all sub-groups' do
+ is_expected.to contain_exactly(
+ [group_a.id],
+ [group_c.id]
+ )
+ end
+ end
+ end
+ end
+
context 'when project namespace exists in the group' do
let!(:project) { create(:project, group: group) }
let!(:project_namespace) { project.project_namespace }
@@ -737,11 +843,23 @@ RSpec.describe Group do
describe '#add_user' do
let(:user) { create(:user) }
- before do
+ it 'adds the user with a blocking refresh by default' do
+ expect_next_instance_of(GroupMember) do |member|
+ expect(member).to receive(:refresh_member_authorized_projects).with(blocking: true)
+ end
+
group.add_user(user, GroupMember::MAINTAINER)
+
+ expect(group.group_members.maintainers.map(&:user)).to include(user)
end
- it { expect(group.group_members.maintainers.map(&:user)).to include(user) }
+ it 'passes the blocking refresh value to member' do
+ expect_next_instance_of(GroupMember) do |member|
+ expect(member).to receive(:refresh_member_authorized_projects).with(blocking: false)
+ end
+
+ group.add_user(user, GroupMember::MAINTAINER, blocking_refresh: false)
+ end
end
describe '#add_users' do
@@ -3246,4 +3364,57 @@ RSpec.describe Group do
it_behaves_like 'no effective expiration interval'
end
end
+
+ describe '#work_items_feature_flag_enabled?' do
+ it_behaves_like 'checks self and root ancestor feature flag' do
+ let(:feature_flag) { :work_items }
+ let(:feature_flag_method) { :work_items_feature_flag_enabled? }
+ end
+ end
+
+ describe 'group shares' do
+ let!(:sub_group) { create(:group, parent: group) }
+ let!(:sub_sub_group) { create(:group, parent: sub_group) }
+ let!(:shared_group_1) { create(:group) }
+ let!(:shared_group_2) { create(:group) }
+ let!(:shared_group_3) { create(:group) }
+
+ before do
+ group.shared_with_groups << shared_group_1
+ sub_group.shared_with_groups << shared_group_2
+ sub_sub_group.shared_with_groups << shared_group_3
+ end
+
+ describe '#shared_with_group_links.of_ancestors' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:subject_group, :result) do
+ ref(:group) | []
+ ref(:sub_group) | lazy { [shared_group_1].map(&:id) }
+ ref(:sub_sub_group) | lazy { [shared_group_1, shared_group_2].map(&:id) }
+ end
+
+ with_them do
+ it 'returns correct group shares' do
+ expect(subject_group.shared_with_group_links.of_ancestors.map(&:shared_with_group_id)).to match_array(result)
+ end
+ end
+ end
+
+ describe '#shared_with_group_links.of_ancestors_and_self' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:subject_group, :result) do
+ ref(:group) | lazy { [shared_group_1].map(&:id) }
+ ref(:sub_group) | lazy { [shared_group_1, shared_group_2].map(&:id) }
+ ref(:sub_sub_group) | lazy { [shared_group_1, shared_group_2, shared_group_3].map(&:id) }
+ end
+
+ with_them do
+ it 'returns correct group shares' do
+ expect(subject_group.shared_with_group_links.of_ancestors_and_self.map(&:shared_with_group_id)).to match_array(result)
+ end
+ end
+ end
+ end
end
diff --git a/spec/models/groups/feature_setting_spec.rb b/spec/models/groups/feature_setting_spec.rb
new file mode 100644
index 00000000000..f1e66744b90
--- /dev/null
+++ b/spec/models/groups/feature_setting_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Groups::FeatureSetting do
+ describe 'associations' do
+ it { is_expected.to belong_to(:group) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:group) }
+ end
+end
diff --git a/spec/models/integration_spec.rb b/spec/models/integration_spec.rb
index 48d8ba975b6..0f596d3908d 100644
--- a/spec/models/integration_spec.rb
+++ b/spec/models/integration_spec.rb
@@ -60,6 +60,17 @@ RSpec.describe Integration do
end
describe 'Scopes' do
+ describe '.third_party_wikis' do
+ let!(:integration1) { create(:jira_integration) }
+ let!(:integration2) { create(:redmine_integration) }
+ let!(:integration3) { create(:confluence_integration) }
+ let!(:integration4) { create(:shimo_integration) }
+
+ it 'returns the right group integration' do
+ expect(described_class.third_party_wikis).to contain_exactly(integration3, integration4)
+ end
+ end
+
describe '.with_default_settings' do
it 'returns the correct integrations' do
instance_integration = create(:integration, :instance)
@@ -265,6 +276,20 @@ RSpec.describe Integration do
end
end
+ describe '#inheritable?' do
+ it 'is true for an instance integration' do
+ expect(create(:integration, :instance)).to be_inheritable
+ end
+
+ it 'is true for a group integration' do
+ expect(create(:integration, :group)).to be_inheritable
+ end
+
+ it 'is false for a project integration' do
+ expect(create(:integration)).not_to be_inheritable
+ end
+ end
+
describe '.build_from_integration' do
context 'when integration is invalid' do
let(:invalid_integration) do
@@ -462,6 +487,18 @@ RSpec.describe Integration do
expect(project.reload.integrations.first.inherit_from_id).to eq(group_integration.id)
end
+ context 'there are multiple inheritable integrations, and a duplicate' do
+ let!(:group_integration_2) { create(:jenkins_integration, :group, group: group) }
+ let!(:group_integration_3) { create(:datadog_integration, :instance) }
+ let!(:duplicate) { create(:jenkins_integration, project: project) }
+
+ it 'returns the number of successfully created integrations' do
+ expect(described_class.create_from_active_default_integrations(project, :project_id)).to eq 2
+
+ expect(project.reload.integrations.size).to eq(3)
+ end
+ end
+
context 'passing a group' do
let!(:subgroup) { create(:group, parent: group) }
@@ -621,6 +658,33 @@ RSpec.describe Integration do
end
end
+ describe '#properties=' do
+ let(:integration_type) do
+ Class.new(described_class) do
+ field :foo
+ field :bar
+ end
+ end
+
+ it 'supports indifferent access' do
+ integration = integration_type.new
+
+ integration.properties = { foo: 1, 'bar' => 2 }
+
+ expect(integration).to have_attributes(foo: 1, bar: 2)
+ end
+ end
+
+ describe '#properties' do
+ it 'is not mutable' do
+ integration = described_class.new
+
+ integration.properties = { foo: 1, bar: 2 }
+
+ expect { integration.properties[:foo] = 3 }.to raise_error
+ end
+ end
+
describe "{property}_touched?" do
let(:integration) do
Integrations::Bamboo.create!(
@@ -720,7 +784,7 @@ RSpec.describe Integration do
describe '#api_field_names' do
shared_examples 'api field names' do
- it 'filters out sensitive fields' do
+ it 'filters out secret fields' do
safe_fields = %w[some_safe_field safe_field url trojan_gift]
expect(fake_integration.new).to have_attributes(
@@ -857,7 +921,7 @@ RSpec.describe Integration do
end
end
- describe '#password_fields' do
+ describe '#secret_fields' do
it 'returns all fields with type `password`' do
allow(subject).to receive(:fields).and_return([
{ name: 'password', type: 'password' },
@@ -865,53 +929,34 @@ RSpec.describe Integration do
{ name: 'public', type: 'text' }
])
- expect(subject.password_fields).to match_array(%w[password secret])
+ expect(subject.secret_fields).to match_array(%w[password secret])
end
- it 'returns an empty array if no password fields exist' do
- expect(subject.password_fields).to eq([])
+ it 'returns an empty array if no secret fields exist' do
+ expect(subject.secret_fields).to eq([])
end
end
- describe 'encrypted_properties' do
+ describe '#to_integration_hash' do
let(:properties) { { foo: 1, bar: true } }
let(:db_props) { properties.stringify_keys }
let(:record) { create(:integration, :instance, properties: properties) }
- it 'contains the same data as properties' do
- expect(record).to have_attributes(
- properties: db_props,
- encrypted_properties_tmp: db_props
- )
- end
-
- it 'is persisted' do
- encrypted_properties = described_class.id_in(record.id)
-
- expect(encrypted_properties).to contain_exactly have_attributes(encrypted_properties_tmp: db_props)
- end
-
- it 'is updated when using prop_accessors' do
- some_integration = Class.new(described_class) do
- prop_accessor :foo
- end
-
- record = some_integration.new
-
- record.foo = 'the foo'
+ it 'does not include the properties key' do
+ hash = record.to_integration_hash
- expect(record.encrypted_properties_tmp).to eq({ 'foo' => 'the foo' })
+ expect(hash).not_to have_key('properties')
end
it 'saves correctly using insert_all' do
hash = record.to_integration_hash
- hash[:project_id] = project
+ hash[:project_id] = project.id
expect do
described_class.insert_all([hash])
end.to change(described_class, :count).by(1)
- expect(described_class.last).to have_attributes(encrypted_properties_tmp: db_props)
+ expect(described_class.last).to have_attributes(properties: db_props)
end
it 'is part of the to_integration_hash' do
@@ -921,7 +966,7 @@ RSpec.describe Integration do
expect(hash['encrypted_properties']).not_to eq(record.encrypted_properties)
expect(hash['encrypted_properties_iv']).not_to eq(record.encrypted_properties_iv)
- decrypted = described_class.decrypt(:encrypted_properties_tmp,
+ decrypted = described_class.decrypt(:properties,
hash['encrypted_properties'],
{ iv: hash['encrypted_properties_iv'] })
@@ -946,7 +991,7 @@ RSpec.describe Integration do
end.to change(described_class, :count).by(1)
expect(described_class.last).not_to eq record
- expect(described_class.last).to have_attributes(encrypted_properties_tmp: db_props)
+ expect(described_class.last).to have_attributes(properties: db_props)
end
end
end
@@ -1021,4 +1066,97 @@ RSpec.describe Integration do
)
end
end
+
+ describe 'boolean_accessor' do
+ let(:klass) do
+ Class.new(Integration) do
+ boolean_accessor :test_value
+ end
+ end
+
+ let(:integration) { klass.new(properties: { test_value: input }) }
+
+ where(:input, :method_result, :predicate_method_result) do
+ true | true | true
+ false | false | false
+ 1 | true | true
+ 0 | false | false
+ '1' | true | true
+ '0' | false | false
+ 'true' | true | true
+ 'false' | false | false
+ 'foobar' | nil | false
+ '' | nil | false
+ nil | nil | false
+ 'on' | true | true
+ 'off' | false | false
+ 'yes' | true | true
+ 'no' | false | false
+ 'n' | false | false
+ 'y' | true | true
+ 't' | true | true
+ 'f' | false | false
+ end
+
+ with_them do
+ it 'has the correct value' do
+ expect(integration).to have_attributes(
+ test_value: be(method_result),
+ test_value?: be(predicate_method_result)
+ )
+ end
+ end
+
+ it 'returns values when initialized without input' do
+ integration = klass.new
+
+ expect(integration).to have_attributes(
+ test_value: be(nil),
+ test_value?: be(false)
+ )
+ end
+ end
+
+ describe '#attributes' do
+ it 'does not include properties' do
+ expect(create(:integration).attributes).not_to have_key('properties')
+ end
+
+ it 'can be used in assign_attributes without nullifying properties' do
+ record = create(:integration, :instance, properties: { url: generate(:url) })
+
+ attrs = record.attributes
+
+ expect { record.assign_attributes(attrs) }.not_to change(record, :properties)
+ end
+ end
+
+ describe '#dup' do
+ let(:original) { create(:integration, properties: { one: 1, two: 2, three: 3 }) }
+
+ it 'results in distinct ciphertexts, but identical properties' do
+ copy = original.dup
+
+ expect(copy).to have_attributes(properties: eq(original.properties))
+
+ expect(copy).not_to have_attributes(
+ encrypted_properties: eq(original.encrypted_properties)
+ )
+ end
+
+ context 'when the model supports data-fields' do
+ let(:original) { create(:jira_integration, username: generate(:username), url: generate(:url)) }
+
+ it 'creates distinct but identical data-fields' do
+ copy = original.dup
+
+ expect(copy).to have_attributes(
+ username: original.username,
+ url: original.url
+ )
+
+ expect(copy.data_fields).not_to eq(original.data_fields)
+ end
+ end
+ end
end
diff --git a/spec/models/integrations/base_third_party_wiki_spec.rb b/spec/models/integrations/base_third_party_wiki_spec.rb
new file mode 100644
index 00000000000..11e044c2a18
--- /dev/null
+++ b/spec/models/integrations/base_third_party_wiki_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::BaseThirdPartyWiki do
+ describe 'Validations' do
+ let_it_be_with_reload(:project) { create(:project) }
+
+ describe 'only one third party wiki per project' do
+ subject(:integration) { create(:shimo_integration, project: project, active: true) }
+
+ before_all do
+ create(:confluence_integration, project: project, active: true)
+ end
+
+ context 'when integration is changed manually by user' do
+ it 'executes the validation' do
+ valid = integration.valid?(:manual_change)
+
+ expect(valid).to be_falsey
+ error_message = 'Another third-party wiki is already in use. '\
+ 'Only one third-party wiki integration can be active at a time'
+ expect(integration.errors[:base]).to include _(error_message)
+ end
+ end
+
+ context 'when integration is changed internally' do
+ it 'does not execute the validation' do
+ expect(integration.valid?).to be_truthy
+ end
+ end
+
+ context 'when integration is not on the project level' do
+ subject(:integration) { create(:shimo_integration, :instance, active: true) }
+
+ it 'executes the validation' do
+ expect(integration.valid?(:manual_change)).to be_truthy
+ end
+ end
+ end
+ end
+end
diff --git a/spec/models/integrations/emails_on_push_spec.rb b/spec/models/integrations/emails_on_push_spec.rb
index bdca267f6cb..15aa105e379 100644
--- a/spec/models/integrations/emails_on_push_spec.rb
+++ b/spec/models/integrations/emails_on_push_spec.rb
@@ -78,9 +78,10 @@ RSpec.describe Integrations::EmailsOnPush do
end
describe '.valid_recipients' do
- let(:recipients) { '<invalid> foobar Valid@recipient.com Dup@lica.te dup@lica.te Dup@Lica.te' }
+ let(:recipients) { '<invalid> foobar valid@dup@asd Valid@recipient.com Dup@lica.te dup@lica.te Dup@Lica.te' }
it 'removes invalid email addresses and removes duplicates by keeping the original capitalization' do
+ expect(described_class.valid_recipients(recipients)).not_to contain_exactly('valid@dup@asd')
expect(described_class.valid_recipients(recipients)).to contain_exactly('Valid@recipient.com', 'Dup@lica.te')
end
end
diff --git a/spec/models/integrations/external_wiki_spec.rb b/spec/models/integrations/external_wiki_spec.rb
index e4d6a1c7c84..1621605d39f 100644
--- a/spec/models/integrations/external_wiki_spec.rb
+++ b/spec/models/integrations/external_wiki_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe Integrations::ExternalWiki do
describe 'test' do
before do
- subject.properties['external_wiki_url'] = url
+ subject.external_wiki_url = url
end
let(:url) { 'http://foo' }
diff --git a/spec/models/integrations/field_spec.rb b/spec/models/integrations/field_spec.rb
index 0d660c4a3ab..c8caf831191 100644
--- a/spec/models/integrations/field_spec.rb
+++ b/spec/models/integrations/field_spec.rb
@@ -84,17 +84,17 @@ RSpec.describe ::Integrations::Field do
end
end
- describe '#sensitive' do
+ describe '#secret?' do
context 'when empty' do
- it { is_expected.not_to be_sensitive }
+ it { is_expected.not_to be_secret }
end
- context 'when a password field' do
+ context 'when a secret field' do
before do
attrs[:type] = 'password'
end
- it { is_expected.to be_sensitive }
+ it { is_expected.to be_secret }
end
%w[token api_token api_key secret_key secret_sauce password passphrase].each do |name|
@@ -103,7 +103,7 @@ RSpec.describe ::Integrations::Field do
attrs[:name] = name
end
- it { is_expected.to be_sensitive }
+ it { is_expected.to be_secret }
end
end
@@ -112,7 +112,7 @@ RSpec.describe ::Integrations::Field do
attrs[:name] = :url
end
- it { is_expected.not_to be_sensitive }
+ it { is_expected.not_to be_secret }
end
end
end
diff --git a/spec/models/integrations/jira_spec.rb b/spec/models/integrations/jira_spec.rb
index 08656bfe543..d244b1d33d5 100644
--- a/spec/models/integrations/jira_spec.rb
+++ b/spec/models/integrations/jira_spec.rb
@@ -187,7 +187,7 @@ RSpec.describe Integrations::Jira do
subject(:integration) { described_class.create!(params) }
it 'does not store data into properties' do
- expect(integration.properties).to be_nil
+ expect(integration.properties).to be_empty
end
it 'stores data in data_fields correctly' do
diff --git a/spec/models/integrations/slack_spec.rb b/spec/models/integrations/slack_spec.rb
index 9f69f4f51f8..3997d69f947 100644
--- a/spec/models/integrations/slack_spec.rb
+++ b/spec/models/integrations/slack_spec.rb
@@ -6,12 +6,12 @@ RSpec.describe Integrations::Slack do
it_behaves_like Integrations::SlackMattermostNotifier, "Slack"
describe '#execute' do
+ let_it_be(:slack_integration) { create(:integrations_slack, branches_to_be_notified: 'all') }
+
before do
stub_request(:post, slack_integration.webhook)
end
- let_it_be(:slack_integration) { create(:integrations_slack, branches_to_be_notified: 'all') }
-
it 'uses only known events', :aggregate_failures do
described_class::SUPPORTED_EVENTS_FOR_USAGE_LOG.each do |action|
expect(Gitlab::UsageDataCounters::HLLRedisCounter.known_event?("i_ecosystem_slack_service_#{action}_notification")).to be true
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index 29305ba435c..fe09dadd0db 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -238,6 +238,24 @@ RSpec.describe Issue do
end
end
+ context 'order by escalation status' do
+ let_it_be(:triggered_incident) { create(:incident_management_issuable_escalation_status, :triggered).issue }
+ let_it_be(:resolved_incident) { create(:incident_management_issuable_escalation_status, :resolved).issue }
+ let_it_be(:issue_no_status) { create(:issue) }
+
+ describe '.order_escalation_status_asc' do
+ subject { described_class.order_escalation_status_asc }
+
+ it { is_expected.to eq([triggered_incident, resolved_incident, issue_no_status]) }
+ end
+
+ describe '.order_escalation_status_desc' do
+ subject { described_class.order_escalation_status_desc }
+
+ it { is_expected.to eq([resolved_incident, triggered_incident, issue_no_status]) }
+ end
+ end
+
# TODO: Remove when NOT NULL constraint is added to the relationship
describe '#work_item_type' do
let(:issue) { create(:issue, :incident, project: reusable_project, work_item_type: nil) }
@@ -1154,18 +1172,6 @@ RSpec.describe Issue do
end
end
- describe '#hook_attrs' do
- it 'delegates to Gitlab::HookData::IssueBuilder#build' do
- builder = double
-
- expect(Gitlab::HookData::IssueBuilder)
- .to receive(:new).with(subject).and_return(builder)
- expect(builder).to receive(:build)
-
- subject.hook_attrs
- end
- end
-
describe '#check_for_spam?' do
let_it_be(:support_bot) { ::User.support_bot }
@@ -1314,15 +1320,6 @@ RSpec.describe Issue do
subject { create(:issue, updated_at: 1.hour.ago) }
end
- describe "#labels_hook_attrs" do
- let(:label) { create(:label) }
- let(:issue) { create(:labeled_issue, project: reusable_project, labels: [label]) }
-
- it "returns a list of label hook attributes" do
- expect(issue.labels_hook_attrs).to eq([label.hook_attrs])
- end
- end
-
context "relative positioning" do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, group: group) }
diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb
index 6cf73de6cef..e1135aa440b 100644
--- a/spec/models/key_spec.rb
+++ b/spec/models/key_spec.rb
@@ -123,25 +123,55 @@ RSpec.describe Key, :mailer do
end
end
- context "validation of uniqueness (based on fingerprint uniqueness)" do
+ context 'validation of uniqueness (based on fingerprint uniqueness)' do
let(:user) { create(:user) }
- it "accepts the key once" do
- expect(build(:key, user: user)).to be_valid
+ shared_examples 'fingerprint uniqueness' do
+ it 'accepts the key once' do
+ expect(build(:rsa_key_4096, user: user)).to be_valid
+ end
+
+ it 'does not accept the exact same key twice' do
+ first_key = create(:rsa_key_4096, user: user)
+
+ expect(build(:key, user: user, key: first_key.key)).not_to be_valid
+ end
+
+ it 'does not accept a duplicate key with a different comment' do
+ first_key = create(:rsa_key_4096, user: user)
+ duplicate = build(:key, user: user, key: first_key.key)
+ duplicate.key << ' extra comment'
+
+ expect(duplicate).not_to be_valid
+ end
end
- it "does not accept the exact same key twice" do
- first_key = create(:key, user: user)
+ context 'with FIPS mode off' do
+ it_behaves_like 'fingerprint uniqueness'
+ end
- expect(build(:key, user: user, key: first_key.key)).not_to be_valid
+ context 'with FIPS mode', :fips_mode do
+ it_behaves_like 'fingerprint uniqueness'
end
+ end
- it "does not accept a duplicate key with a different comment" do
- first_key = create(:key, user: user)
- duplicate = build(:key, user: user, key: first_key.key)
- duplicate.key << ' extra comment'
+ context 'fingerprint generation' do
+ it 'generates both md5 and sha256 fingerprints' do
+ key = build(:rsa_key_4096)
+
+ expect(key).to be_valid
+ expect(key.fingerprint).to be_kind_of(String)
+ expect(key.fingerprint_sha256).to be_kind_of(String)
+ end
- expect(duplicate).not_to be_valid
+ context 'with FIPS mode', :fips_mode do
+ it 'generates only sha256 fingerprint' do
+ key = build(:rsa_key_4096)
+
+ expect(key).to be_valid
+ expect(key.fingerprint).to be_nil
+ expect(key.fingerprint_sha256).to be_kind_of(String)
+ end
end
end
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index 79491edba94..4ab17ee1e6d 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -682,14 +682,46 @@ RSpec.describe Member do
member.accept_invite!(user)
end
- it "refreshes user's authorized projects", :delete do
- project = member.source
+ context 'authorized projects' do
+ let(:project) { member.source }
- expect(user.authorized_projects).not_to include(project)
+ before do
+ expect(user.authorized_projects).not_to include(project)
+ end
- member.accept_invite!(user)
+ it 'successfully completes a blocking refresh', :delete do
+ expect(member).to receive(:refresh_member_authorized_projects).with(blocking: true).and_call_original
+
+ member.accept_invite!(user)
+
+ expect(user.authorized_projects.reload).to include(project)
+ end
+
+ it 'successfully completes a non-blocking refresh', :delete, :sidekiq_inline do
+ member.blocking_refresh = false
+
+ expect(member).to receive(:refresh_member_authorized_projects).with(blocking: false).and_call_original
+
+ member.accept_invite!(user)
+
+ expect(user.authorized_projects.reload).to include(project)
+ end
- expect(user.authorized_projects.reload).to include(project)
+ context 'when the feature flag is disabled' do
+ before do
+ stub_feature_flags(allow_non_blocking_member_refresh: false)
+ end
+
+ it 'successfully completes a blocking refresh', :delete, :sidekiq_inline do
+ member.blocking_refresh = false
+
+ expect(member).to receive(:refresh_member_authorized_projects).with(blocking: true).and_call_original
+
+ member.accept_invite!(user)
+
+ expect(user.authorized_projects.reload).to include(project)
+ end
+ end
end
it 'does not accept the invite if saving a new user fails' do
@@ -926,4 +958,64 @@ RSpec.describe Member do
end
end
end
+
+ describe '.sort_by_attribute' do
+ let_it_be(:user1) { create(:user, created_at: Date.today, last_sign_in_at: Date.today, last_activity_on: Date.today, name: 'Alpha') }
+ let_it_be(:user2) { create(:user, created_at: Date.today - 1, last_sign_in_at: Date.today - 1, last_activity_on: Date.today - 1, name: 'Omega') }
+ let_it_be(:user3) { create(:user, created_at: Date.today - 2, name: 'Beta') }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:member1) { create(:group_member, :reporter, group: group, user: user1) }
+ let_it_be(:member2) { create(:group_member, :developer, group: group, user: user2) }
+ let_it_be(:member3) { create(:group_member, :maintainer, group: group, user: user3) }
+
+ it 'sort users in ascending order by access-level' do
+ expect(described_class.sort_by_attribute('access_level_asc')).to eq([member1, member2, member3])
+ end
+
+ it 'sort users in descending order by access-level' do
+ expect(described_class.sort_by_attribute('access_level_desc')).to eq([member3, member2, member1])
+ end
+
+ context 'when sort by recent_sign_in' do
+ subject { described_class.sort_by_attribute('recent_sign_in') }
+
+ it 'sorts users by recent sign-in time' do
+ expect(subject.first).to eq(member1)
+ expect(subject.second).to eq(member2)
+ end
+
+ it 'pushes users who never signed in to the end' do
+ expect(subject.third).to eq(member3)
+ end
+ end
+
+ context 'when sort by oldest_sign_in' do
+ subject { described_class.sort_by_attribute('oldest_sign_in') }
+
+ it 'sorts users by the oldest sign-in time' do
+ expect(subject.first).to eq(member2)
+ expect(subject.second).to eq(member1)
+ end
+
+ it 'pushes users who never signed in to the end' do
+ expect(subject.third).to eq(member3)
+ end
+ end
+
+ it 'sorts users in descending order by their creation time' do
+ expect(described_class.sort_by_attribute('recent_created_user')).to eq([member1, member2, member3])
+ end
+
+ it 'sorts users in ascending order by their creation time' do
+ expect(described_class.sort_by_attribute('oldest_created_user')).to eq([member3, member2, member1])
+ end
+
+ it 'sort users by recent last activity' do
+ expect(described_class.sort_by_attribute('recent_last_activity')).to eq([member1, member2, member3])
+ end
+
+ it 'sort users by oldest last activity' do
+ expect(described_class.sort_by_attribute('oldest_last_activity')).to eq([member3, member2, member1])
+ end
+ end
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 0d15851e583..8545c7bc6c7 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -1757,18 +1757,6 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
- describe '#hook_attrs' do
- it 'delegates to Gitlab::HookData::MergeRequestBuilder#build' do
- builder = double
-
- expect(Gitlab::HookData::MergeRequestBuilder)
- .to receive(:new).with(subject).and_return(builder)
- expect(builder).to receive(:build)
-
- subject.hook_attrs
- end
- end
-
describe '#diverged_commits_count' do
let(:project) { create(:project, :repository) }
let(:forked_project) { fork_project(project, nil, repository: true) }
@@ -3550,8 +3538,8 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
- describe "#environments" do
- subject { merge_request.environments }
+ describe "#legacy_environments" do
+ subject { merge_request.legacy_environments }
let(:merge_request) { create(:merge_request, source_branch: 'feature', target_branch: 'master') }
let(:project) { merge_request.project }
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index ebd153f6f10..09ac15429a5 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -2230,4 +2230,10 @@ RSpec.describe Namespace do
expect(namespace.storage_enforcement_date).to be(nil)
end
end
+
+ describe 'serialization' do
+ let(:object) { build(:namespace) }
+
+ it_behaves_like 'blocks unsafe serialization'
+ end
end
diff --git a/spec/models/namespaces/project_namespace_spec.rb b/spec/models/namespaces/project_namespace_spec.rb
index 47cf866c143..c995571c3c9 100644
--- a/spec/models/namespaces/project_namespace_spec.rb
+++ b/spec/models/namespaces/project_namespace_spec.rb
@@ -17,11 +17,11 @@ RSpec.describe Namespaces::ProjectNamespace, type: :model do
let_it_be(:project) { create(:project) }
let_it_be(:project_namespace) { project.project_namespace }
- it 'keeps the associated project' do
+ it 'also deletes associated project' do
project_namespace.delete
expect { project_namespace.reload }.to raise_error(ActiveRecord::RecordNotFound)
- expect(project.reload.project_namespace).to be_nil
+ expect { project.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
end
end
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index cbfedf54ffa..4b262c1f3a9 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -105,6 +105,104 @@ RSpec.describe Note do
it { is_expected.to be_valid }
end
end
+
+ describe 'confidentiality' do
+ context 'for existing public note' do
+ let_it_be(:existing_note) { create(:note) }
+
+ it 'is not possible to change the note to confidential' do
+ existing_note.confidential = true
+
+ expect(existing_note).not_to be_valid
+ expect(existing_note.errors[:confidential]).to include('can not be changed for existing notes')
+ end
+
+ it 'is possible to change confidentiality from nil to false' do
+ existing_note.confidential = false
+
+ expect(existing_note).to be_valid
+ end
+ end
+
+ context 'for existing confidential note' do
+ let_it_be(:existing_note) { create(:note, confidential: true) }
+
+ it 'is not possible to change the note to public' do
+ existing_note.confidential = false
+
+ expect(existing_note).not_to be_valid
+ expect(existing_note.errors[:confidential]).to include('can not be changed for existing notes')
+ end
+ end
+
+ context 'for a new note' do
+ let_it_be(:noteable) { create(:issue) }
+
+ let(:note_params) { { confidential: true, noteable: noteable, project: noteable.project } }
+
+ subject { build(:note, **note_params) }
+
+ it 'allows to create a confidential note for an issue' do
+ expect(subject).to be_valid
+ end
+
+ context 'when noteable is not allowed to have confidential notes' do
+ let_it_be(:noteable) { create(:merge_request) }
+
+ it 'can not be set confidential' do
+ expect(subject).not_to be_valid
+ expect(subject.errors[:confidential]).to include('can not be set for this resource')
+ end
+ end
+
+ context 'when note type is not allowed to be confidential' do
+ let(:note_params) { { type: 'DiffNote', confidential: true, noteable: noteable, project: noteable.project } }
+
+ it 'can not be set confidential' do
+ expect(subject).not_to be_valid
+ expect(subject.errors[:confidential]).to include('can not be set for this type of note')
+ end
+ end
+
+ context 'when the note is a discussion note' do
+ let(:note_params) { { type: 'DiscussionNote', confidential: true, noteable: noteable, project: noteable.project } }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when replying to a note' do
+ let(:note_params) { { confidential: true, noteable: noteable, project: noteable.project } }
+
+ subject { build(:discussion_note, discussion_id: original_note.discussion_id, **note_params) }
+
+ context 'when the note is reply to a confidential note' do
+ let_it_be(:original_note) { create(:note, confidential: true, noteable: noteable, project: noteable.project) }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when the note is reply to a public note' do
+ let_it_be(:original_note) { create(:note, noteable: noteable, project: noteable.project) }
+
+ it 'can not be set confidential' do
+ expect(subject).not_to be_valid
+ expect(subject.errors[:confidential]).to include('reply should have same confidentiality as top-level note')
+ end
+ end
+
+ context 'when reply note is public but discussion is confidential' do
+ let_it_be(:original_note) { create(:note, confidential: true, noteable: noteable, project: noteable.project) }
+
+ let(:note_params) { { noteable: noteable, project: noteable.project } }
+
+ it 'can not be set confidential' do
+ expect(subject).not_to be_valid
+ expect(subject.errors[:confidential]).to include('reply should have same confidentiality as top-level note')
+ end
+ end
+ end
+ end
+ end
end
describe 'callbacks' do
@@ -1169,8 +1267,8 @@ RSpec.describe Note do
end
describe "#discussion" do
- let!(:note1) { create(:discussion_note_on_merge_request) }
- let!(:note2) { create(:diff_note_on_merge_request, project: note1.project, noteable: note1.noteable) }
+ let_it_be(:note1) { create(:discussion_note_on_merge_request) }
+ let_it_be(:note2) { create(:diff_note_on_merge_request, project: note1.project, noteable: note1.noteable) }
context 'when the note is part of a discussion' do
subject { create(:discussion_note_on_merge_request, project: note1.project, noteable: note1.noteable, in_reply_to: note1) }
@@ -1655,4 +1753,27 @@ RSpec.describe Note do
expect(note.commands_changes.keys).to contain_exactly(:emoji_award, :time_estimate, :spend_time)
end
end
+
+ describe '#bump_updated_at', :freeze_time do
+ it 'sets updated_at to the current timestamp' do
+ note = create(:note, updated_at: 1.day.ago)
+
+ note.bump_updated_at
+ note.reload
+
+ expect(note.updated_at).to be_like_time(Time.current)
+ end
+
+ context 'with legacy edited note' do
+ it 'copies updated_at to last_edited_at before bumping the timestamp' do
+ note = create(:note, updated_at: 1.day.ago, updated_by: create(:user), last_edited_at: nil)
+
+ note.bump_updated_at
+ note.reload
+
+ expect(note.last_edited_at).to be_like_time(1.day.ago)
+ expect(note.updated_at).to be_like_time(Time.current)
+ end
+ end
+ end
end
diff --git a/spec/models/packages/package_file_spec.rb b/spec/models/packages/package_file_spec.rb
index fd453d8e5a9..f6af8f6a951 100644
--- a/spec/models/packages/package_file_spec.rb
+++ b/spec/models/packages/package_file_spec.rb
@@ -23,6 +23,28 @@ RSpec.describe Packages::PackageFile, type: :model do
describe 'validations' do
it { is_expected.to validate_presence_of(:package) }
+
+ context 'with pypi package' do
+ let_it_be(:package) { create(:pypi_package) }
+
+ let(:package_file) { package.package_files.first }
+ let(:status) { :default }
+ let(:file) { fixture_file_upload('spec/fixtures/dk.png') }
+
+ subject { package.package_files.create!(file: file, file_name: package_file.file_name, status: status) }
+
+ it 'can not save a duplicated file' do
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid, "Validation failed: File name has already been taken")
+ end
+
+ context 'with a pending destruction package duplicated file' do
+ let(:status) { :pending_destruction }
+
+ it 'can save it' do
+ expect { subject }.to change { package.package_files.count }.from(1).to(2)
+ end
+ end
+ end
end
context 'with package filenames' do
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index 52ed52de193..6c86db1197f 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -1021,13 +1021,13 @@ RSpec.describe Packages::Package, type: :model do
context 'ascending direction' do
let(:direction) { :asc }
- it { is_expected.to eq('projects.name asc NULLS LAST, "packages_packages"."id" ASC') }
+ it { is_expected.to eq('"projects"."name" ASC NULLS LAST, "packages_packages"."id" ASC') }
end
context 'descending direction' do
let(:direction) { :desc }
- it { is_expected.to eq('projects.name desc NULLS FIRST, "packages_packages"."id" DESC') }
+ it { is_expected.to eq('"projects"."name" DESC NULLS FIRST, "packages_packages"."id" DESC') }
end
end
end
diff --git a/spec/models/plan_limits_spec.rb b/spec/models/plan_limits_spec.rb
index 72fda2280e5..381e42978f4 100644
--- a/spec/models/plan_limits_spec.rb
+++ b/spec/models/plan_limits_spec.rb
@@ -214,6 +214,7 @@ RSpec.describe PlanLimits do
daily_invites
web_hook_calls
ci_daily_pipeline_schedule_triggers
+ repository_size
] + disabled_max_artifact_size_columns
end
diff --git a/spec/models/preloaders/environments/deployment_preloader_spec.rb b/spec/models/preloaders/environments/deployment_preloader_spec.rb
index 3f2f28a069e..4c05d9632de 100644
--- a/spec/models/preloaders/environments/deployment_preloader_spec.rb
+++ b/spec/models/preloaders/environments/deployment_preloader_spec.rb
@@ -6,14 +6,14 @@ RSpec.describe Preloaders::Environments::DeploymentPreloader do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project, :repository) }
- let_it_be(:pipeline) { create(:ci_pipeline, user: user, project: project, sha: project.commit.sha) }
- let_it_be(:ci_build_a) { create(:ci_build, user: user, project: project, pipeline: pipeline) }
- let_it_be(:ci_build_b) { create(:ci_build, user: user, project: project, pipeline: pipeline) }
- let_it_be(:ci_build_c) { create(:ci_build, user: user, project: project, pipeline: pipeline) }
-
let_it_be(:environment_a) { create(:environment, project: project, state: :available) }
let_it_be(:environment_b) { create(:environment, project: project, state: :available) }
+ let_it_be(:pipeline) { create(:ci_pipeline, user: user, project: project, sha: project.commit.sha) }
+ let_it_be(:ci_build_a) { create(:ci_build, user: user, project: project, pipeline: pipeline, environment: environment_a.name) }
+ let_it_be(:ci_build_b) { create(:ci_build, user: user, project: project, pipeline: pipeline, environment: environment_a.name) }
+ let_it_be(:ci_build_c) { create(:ci_build, user: user, project: project, pipeline: pipeline, environment: environment_b.name) }
+
before do
create(:deployment, :success, project: project, environment: environment_a, deployable: ci_build_a)
create(:deployment, :success, project: project, environment: environment_a, deployable: ci_build_b)
diff --git a/spec/models/preloaders/group_root_ancestor_preloader_spec.rb b/spec/models/preloaders/group_root_ancestor_preloader_spec.rb
new file mode 100644
index 00000000000..0d622e84ef1
--- /dev/null
+++ b/spec/models/preloaders/group_root_ancestor_preloader_spec.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Preloaders::GroupRootAncestorPreloader do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:root_parent1) { create(:group, :private, name: 'root-1', path: 'root-1') }
+ let_it_be(:root_parent2) { create(:group, :private, name: 'root-2', path: 'root-2') }
+ let_it_be(:guest_group) { create(:group, name: 'public guest', path: 'public-guest') }
+ let_it_be(:private_maintainer_group) { create(:group, :private, name: 'b private maintainer', path: 'b-private-maintainer', parent: root_parent1) }
+ let_it_be(:private_developer_group) { create(:group, :private, project_creation_level: nil, name: 'c public developer', path: 'c-public-developer') }
+ let_it_be(:public_maintainer_group) { create(:group, :private, name: 'a public maintainer', path: 'a-public-maintainer', parent: root_parent2) }
+
+ let(:root_query_regex) { /\ASELECT.+FROM "namespaces" WHERE "namespaces"."id" = \d+/ }
+ let(:additional_preloads) { [] }
+ let(:groups) { [guest_group, private_maintainer_group, private_developer_group, public_maintainer_group] }
+ let(:pristine_groups) { Group.where(id: groups) }
+
+ shared_examples 'executes N matching DB queries' do |expected_query_count, query_method = nil|
+ it 'executes the specified root_ancestor queries' do
+ expect do
+ pristine_groups.each do |group|
+ root_ancestor = group.root_ancestor
+
+ root_ancestor.public_send(query_method) if query_method.present?
+ end
+ end.to make_queries_matching(root_query_regex, expected_query_count)
+ end
+
+ it 'strong_memoizes the correct root_ancestor' do
+ pristine_groups.each do |group|
+ expected_parent_id = group.root_ancestor.id == group.id ? nil : group.root_ancestor.id
+
+ expect(group.parent_id).to eq(expected_parent_id)
+ end
+ end
+ end
+
+ context 'when the preloader is used' do
+ before do
+ preload_ancestors
+ end
+
+ context 'when no additional preloads are provided' do
+ it_behaves_like 'executes N matching DB queries', 0
+ end
+
+ context 'when additional preloads are provided' do
+ let(:additional_preloads) { [:route] }
+ let(:root_query_regex) { /\ASELECT.+FROM "routes" WHERE "routes"."source_id" = \d+/ }
+
+ it_behaves_like 'executes N matching DB queries', 0, :full_path
+ end
+ end
+
+ context 'when the preloader is not used' do
+ it_behaves_like 'executes N matching DB queries', 2
+ end
+
+ def preload_ancestors
+ described_class.new(pristine_groups, additional_preloads).execute
+ end
+end
diff --git a/spec/models/programming_language_spec.rb b/spec/models/programming_language_spec.rb
index f2201eabd1c..b202c10e30b 100644
--- a/spec/models/programming_language_spec.rb
+++ b/spec/models/programming_language_spec.rb
@@ -10,4 +10,22 @@ RSpec.describe ProgrammingLanguage do
it { is_expected.to allow_value("#000000").for(:color) }
it { is_expected.not_to allow_value("000000").for(:color) }
it { is_expected.not_to allow_value("#0z0000").for(:color) }
+
+ describe '.with_name_case_insensitive scope' do
+ let_it_be(:ruby) { create(:programming_language, name: 'Ruby') }
+ let_it_be(:python) { create(:programming_language, name: 'Python') }
+ let_it_be(:swift) { create(:programming_language, name: 'Swift') }
+
+ it 'accepts a single name parameter' do
+ expect(described_class.with_name_case_insensitive('swift')).to(
+ contain_exactly(swift)
+ )
+ end
+
+ it 'accepts multiple names' do
+ expect(described_class.with_name_case_insensitive('ruby', 'python')).to(
+ contain_exactly(ruby, python)
+ )
+ end
+ end
end
diff --git a/spec/models/project_feature_spec.rb b/spec/models/project_feature_spec.rb
index 75e43ed9a67..941f6c0a49d 100644
--- a/spec/models/project_feature_spec.rb
+++ b/spec/models/project_feature_spec.rb
@@ -5,8 +5,8 @@ require 'spec_helper'
RSpec.describe ProjectFeature do
using RSpec::Parameterized::TableSyntax
- let(:project) { create(:project) }
- let(:user) { create(:user) }
+ let_it_be_with_reload(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
it { is_expected.to belong_to(:project) }
@@ -242,4 +242,95 @@ RSpec.describe ProjectFeature do
end
end
end
+
+ # rubocop:disable Gitlab/FeatureAvailableUsage
+ describe '#feature_available?' do
+ let(:features) { ProjectFeature::FEATURES }
+
+ context 'when features are disabled' do
+ it 'returns false' do
+ update_all_project_features(project, features, ProjectFeature::DISABLED)
+
+ features.each do |feature|
+ expect(project.feature_available?(feature.to_sym, user)).to eq(false), "#{feature} failed"
+ end
+ end
+ end
+
+ context 'when features are enabled only for team members' do
+ it 'returns false when user is not a team member' do
+ update_all_project_features(project, features, ProjectFeature::PRIVATE)
+
+ features.each do |feature|
+ expect(project.feature_available?(feature.to_sym, user)).to eq(false), "#{feature} failed"
+ end
+ end
+
+ it 'returns true when user is a team member' do
+ project.add_developer(user)
+
+ update_all_project_features(project, features, ProjectFeature::PRIVATE)
+
+ features.each do |feature|
+ expect(project.feature_available?(feature.to_sym, user)).to eq(true)
+ end
+ end
+
+ it 'returns true when user is a member of project group' do
+ group = create(:group)
+ project = create(:project, namespace: group)
+ group.add_developer(user)
+
+ update_all_project_features(project, features, ProjectFeature::PRIVATE)
+
+ features.each do |feature|
+ expect(project.feature_available?(feature.to_sym, user)).to eq(true)
+ end
+ end
+
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'returns true if user is an admin' do
+ user.update_attribute(:admin, true)
+
+ update_all_project_features(project, features, ProjectFeature::PRIVATE)
+
+ features.each do |feature|
+ expect(project.feature_available?(feature.to_sym, user)).to eq(true)
+ end
+ end
+ end
+
+ context 'when admin mode is disabled' do
+ it 'returns false when user is an admin' do
+ user.update_attribute(:admin, true)
+
+ update_all_project_features(project, features, ProjectFeature::PRIVATE)
+
+ features.each do |feature|
+ expect(project.feature_available?(feature.to_sym, user)).to eq(false), "#{feature} failed"
+ end
+ end
+ end
+ end
+
+ context 'when feature is enabled for everyone' do
+ it 'returns true' do
+ expect(project.feature_available?(:issues, user)).to eq(true)
+ end
+ end
+
+ context 'when feature has any other value' do
+ it 'returns true' do
+ project.project_feature.update_attribute(:issues_access_level, 200)
+
+ expect(project.feature_available?(:issues)).to eq(true)
+ end
+ end
+
+ def update_all_project_features(project, features, value)
+ project_feature_attributes = features.to_h { |f| ["#{f}_access_level", value] }
+ project.project_feature.update!(project_feature_attributes)
+ end
+ end
+ # rubocop:enable Gitlab/FeatureAvailableUsage
end
diff --git a/spec/models/project_import_state_spec.rb b/spec/models/project_import_state_spec.rb
index 4ad2446f8d0..42ca8130734 100644
--- a/spec/models/project_import_state_spec.rb
+++ b/spec/models/project_import_state_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe ProjectImportState, type: :model do
before do
allow_any_instance_of(Gitlab::GitalyClient::RepositoryService).to receive(:import_repository)
- .with(project.import_url).and_return(true)
+ .with(project.import_url, http_authorization_header: '', mirror: false).and_return(true)
# Works around https://github.com/rspec/rspec-mocks/issues/910
allow(Project).to receive(:find).with(project.id).and_return(project)
@@ -89,19 +89,6 @@ RSpec.describe ProjectImportState, type: :model do
import_state.mark_as_failed(error_message)
end.to change { project.reload.import_data }.from(import_data).to(nil)
end
-
- context 'when remove_import_data_on_failure feature flag is disabled' do
- it 'removes project import data' do
- stub_feature_flags(remove_import_data_on_failure: false)
-
- project = create(:project, import_data: ProjectImportData.new(data: { 'test' => 'some data' }))
- import_state = create(:import_state, :started, project: project)
-
- expect do
- import_state.mark_as_failed(error_message)
- end.not_to change { project.reload.import_data }
- end
- end
end
describe '#human_status_name' do
@@ -114,6 +101,34 @@ RSpec.describe ProjectImportState, type: :model do
end
end
+ describe '#expire_etag_cache' do
+ context 'when project import type has realtime changes endpoint' do
+ before do
+ import_state.project.import_type = 'github'
+ end
+
+ it 'expires revelant etag cache' do
+ expect_next_instance_of(Gitlab::EtagCaching::Store) do |instance|
+ expect(instance).to receive(:touch).with(Gitlab::Routing.url_helpers.realtime_changes_import_github_path(format: :json))
+ end
+
+ subject.expire_etag_cache
+ end
+ end
+
+ context 'when project import type does not have realtime changes endpoint' do
+ before do
+ import_state.project.import_type = 'jira'
+ end
+
+ it 'does not touch etag caches' do
+ expect(Gitlab::EtagCaching::Store).not_to receive(:new)
+
+ subject.expire_etag_cache
+ end
+ end
+ end
+
describe 'import state transitions' do
context 'state transition: [:started] => [:finished]' do
let(:after_import_service) { spy(:after_import_service) }
@@ -191,4 +206,20 @@ RSpec.describe ProjectImportState, type: :model do
end
end
end
+
+ describe 'callbacks' do
+ context 'after_commit :expire_etag_cache' do
+ before do
+ import_state.project.import_type = 'github'
+ end
+
+ it 'expires etag cache' do
+ expect_next_instance_of(Gitlab::EtagCaching::Store) do |instance|
+ expect(instance).to receive(:touch).with(Gitlab::Routing.url_helpers.realtime_changes_import_github_path(format: :json))
+ end
+
+ subject.save!
+ end
+ end
+ end
end
diff --git a/spec/models/project_setting_spec.rb b/spec/models/project_setting_spec.rb
index 5572304d666..d03eb3c8bfe 100644
--- a/spec/models/project_setting_spec.rb
+++ b/spec/models/project_setting_spec.rb
@@ -4,4 +4,34 @@ require 'spec_helper'
RSpec.describe ProjectSetting, type: :model do
it { is_expected.to belong_to(:project) }
+
+ describe 'validations' do
+ it { is_expected.not_to allow_value(nil).for(:target_platforms) }
+ it { is_expected.to allow_value([]).for(:target_platforms) }
+
+ it 'allows any combination of the allowed target platforms' do
+ valid_target_platform_combinations.each do |target_platforms|
+ expect(subject).to allow_value(target_platforms).for(:target_platforms)
+ end
+ end
+
+ [nil, 'not_allowed', :invalid].each do |invalid_value|
+ it { is_expected.not_to allow_value([invalid_value]).for(:target_platforms) }
+ end
+ end
+
+ describe 'target_platforms=' do
+ it 'stringifies and sorts' do
+ project_setting = build(:project_setting, target_platforms: [:watchos, :ios])
+ expect(project_setting.target_platforms).to eq %w(ios watchos)
+ end
+ end
+
+ def valid_target_platform_combinations
+ target_platforms = described_class::ALLOWED_TARGET_PLATFORMS
+
+ 0.upto(target_platforms.size).flat_map do |n|
+ target_platforms.permutation(n).to_a
+ end
+ end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index fc7ac35ed41..0bb584845c2 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -536,7 +536,7 @@ RSpec.describe Project, factory_default: :keep do
project = build(:project)
aggregate_failures do
- urls_with_CRLF.each do |url|
+ urls_with_crlf.each do |url|
project.import_url = url
expect(project).not_to be_valid
@@ -549,7 +549,7 @@ RSpec.describe Project, factory_default: :keep do
project = build(:project)
aggregate_failures do
- valid_urls_with_CRLF.each do |url|
+ valid_urls_with_crlf.each do |url|
project.import_url = url
expect(project).to be_valid
@@ -635,6 +635,8 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ it_behaves_like 'a BulkUsersByEmailLoad model'
+
describe '#all_pipelines' do
let_it_be(:project) { create(:project) }
@@ -724,6 +726,33 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ describe '#personal_namespace_holder?' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:namespace_user) { create(:user) }
+ let_it_be(:admin_user) { create(:user, :admin) }
+ let_it_be(:personal_project) { create(:project, namespace: namespace_user.namespace) }
+ let_it_be(:group_project) { create(:project, group: group) }
+ let_it_be(:another_user) { create(:user) }
+ let_it_be(:group_owner_user) { create(:user).tap { |user| group.add_owner(user) } }
+
+ where(:project, :user, :result) do
+ ref(:personal_project) | ref(:namespace_user) | true
+ ref(:personal_project) | ref(:admin_user) | false
+ ref(:personal_project) | ref(:another_user) | false
+ ref(:personal_project) | nil | false
+ ref(:group_project) | ref(:namespace_user) | false
+ ref(:group_project) | ref(:group_owner_user) | false
+ ref(:group_project) | ref(:another_user) | false
+ ref(:group_project) | nil | false
+ ref(:group_project) | nil | false
+ ref(:group_project) | ref(:admin_user) | false
+ end
+
+ with_them do
+ it { expect(project.personal_namespace_holder?(user)).to eq(result) }
+ end
+ end
+
describe '#default_pipeline_lock' do
let(:project) { build_stubbed(:project) }
@@ -1189,29 +1218,8 @@ RSpec.describe Project, factory_default: :keep do
end
describe 'last_activity_date' do
- it 'returns the creation date of the project\'s last event if present' do
- new_event = create(:event, :closed, project: project, created_at: Time.current)
-
- project.reload
- expect(project.last_activity_at.to_i).to eq(new_event.created_at.to_i)
- end
-
- it 'returns the project\'s last update date if it has no events' do
- expect(project.last_activity_date).to eq(project.updated_at)
- end
-
- it 'returns the most recent timestamp' do
- project.update!(updated_at: nil,
- last_activity_at: timestamp,
- last_repository_updated_at: timestamp - 1.hour)
-
- expect(project.last_activity_date).to be_like_time(timestamp)
-
- project.update!(updated_at: timestamp,
- last_activity_at: timestamp - 1.hour,
- last_repository_updated_at: nil)
-
- expect(project.last_activity_date).to be_like_time(timestamp)
+ it 'returns the project\'s last update date' do
+ expect(project.last_activity_date).to be_like_time(project.updated_at)
end
end
end
@@ -1688,15 +1696,27 @@ RSpec.describe Project, factory_default: :keep do
end
describe '.sort_by_attribute' do
- it 'reorders the input relation by start count desc' do
- project1 = create(:project, star_count: 2)
- project2 = create(:project, star_count: 1)
- project3 = create(:project)
+ let_it_be(:project1) { create(:project, star_count: 2, updated_at: 1.minute.ago) }
+ let_it_be(:project2) { create(:project, star_count: 1) }
+ let_it_be(:project3) { create(:project, updated_at: 2.minutes.ago) }
+ it 'reorders the input relation by start count desc' do
projects = described_class.sort_by_attribute(:stars_desc)
expect(projects).to eq([project1, project2, project3])
end
+
+ it 'reorders the input relation by last activity desc' do
+ projects = described_class.sort_by_attribute(:latest_activity_desc)
+
+ expect(projects).to eq([project2, project1, project3])
+ end
+
+ it 'reorders the input relation by last activity asc' do
+ projects = described_class.sort_by_attribute(:latest_activity_asc)
+
+ expect(projects).to eq([project3, project1, project2])
+ end
end
describe '.with_shared_runners' do
@@ -2273,6 +2293,44 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ describe '#pages_show_onboarding?' do
+ let(:project) { create(:project) }
+
+ subject { project.pages_show_onboarding? }
+
+ context "if there is no metadata" do
+ it { is_expected.to be_truthy }
+ end
+
+ context 'if onboarding is complete' do
+ before do
+ project.pages_metadatum.update_column(:onboarding_complete, true)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'if there is metadata, but onboarding is not complete' do
+ before do
+ project.pages_metadatum.update_column(:onboarding_complete, false)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ # During migration, the onboarding_complete property can still be false,
+ # but will be updated later. To account for that case, pages_show_onboarding?
+ # should return false if `deployed` is true.
+ context "will return false if pages is deployed even if onboarding_complete is false" do
+ before do
+ project.pages_metadatum.update_column(:onboarding_complete, false)
+ project.pages_metadatum.update_column(:deployed, true)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
describe '#pages_deployed?' do
let(:project) { create(:project) }
@@ -2695,6 +2753,39 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ describe '#container_repositories_size' do
+ let(:project) { build(:project) }
+
+ subject { project.container_repositories_size }
+
+ context 'on gitlab.com' do
+ where(:no_container_repositories, :all_migrated, :gitlab_api_supported, :returned_size, :expected_result) do
+ true | nil | nil | nil | 0
+ false | false | nil | nil | nil
+ false | true | false | nil | nil
+ false | true | true | 555 | 555
+ false | true | true | nil | nil
+ end
+
+ with_them do
+ before do
+ stub_container_registry_config(enabled: true, api_url: 'http://container-registry', key: 'spec/fixtures/x509_certificate_pk.key')
+ allow(Gitlab).to receive(:com?).and_return(true)
+ allow(project.container_repositories).to receive(:empty?).and_return(no_container_repositories)
+ allow(project.container_repositories).to receive(:all_migrated?).and_return(all_migrated)
+ allow(ContainerRegistry::GitlabApiClient).to receive(:supports_gitlab_api?).and_return(gitlab_api_supported)
+ allow(ContainerRegistry::GitlabApiClient).to receive(:deduplicated_size).with(project.full_path).and_return(returned_size)
+ end
+
+ it { is_expected.to eq(expected_result) }
+ end
+ end
+
+ context 'not on gitlab.com' do
+ it { is_expected.to eq(nil) }
+ end
+ end
+
describe '#container_registry_enabled=' do
let_it_be_with_reload(:project) { create(:project) }
@@ -5602,6 +5693,18 @@ RSpec.describe Project, factory_default: :keep do
expect(project.protected_branches.first.merge_access_levels.map(&:access_level)).to eq([Gitlab::Access::MAINTAINER])
end
end
+
+ describe 'project target platforms detection' do
+ before do
+ create(:import_state, :started, project: project)
+ end
+
+ it 'calls enqueue_record_project_target_platforms' do
+ expect(project).to receive(:enqueue_record_project_target_platforms)
+
+ project.after_import
+ end
+ end
end
describe '#update_project_counter_caches' do
@@ -6256,6 +6359,10 @@ RSpec.describe Project, factory_default: :keep do
expect(subject.find_or_initialize_integration('prometheus')).to be_nil
end
+ it 'returns nil if integration does not exist' do
+ expect(subject.find_or_initialize_integration('non-existing')).to be_nil
+ end
+
context 'with an existing integration' do
subject { create(:project) }
@@ -6557,6 +6664,25 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ describe '#mark_pages_onboarding_complete' do
+ let(:project) { create(:project) }
+
+ it "creates new record and sets onboarding_complete to true if none exists yet" do
+ project.mark_pages_onboarding_complete
+
+ expect(project.pages_metadatum.reload.onboarding_complete).to eq(true)
+ end
+
+ it "overrides an existing setting" do
+ pages_metadatum = project.pages_metadatum
+ pages_metadatum.update!(onboarding_complete: false)
+
+ expect do
+ project.mark_pages_onboarding_complete
+ end.to change { pages_metadatum.reload.onboarding_complete }.from(false).to(true)
+ end
+ end
+
describe '#mark_pages_as_deployed' do
let(:project) { create(:project) }
@@ -8009,12 +8135,112 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ describe '#work_items_feature_flag_enabled?' do
+ shared_examples 'project checking work_items feature flag' do
+ context 'when work_items FF is disabled globally' do
+ before do
+ stub_feature_flags(work_items: false)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when work_items FF is enabled for the project' do
+ before do
+ stub_feature_flags(work_items: project)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when work_items FF is enabled globally' do
+ it { is_expected.to be_truthy }
+ end
+ end
+
+ subject { project.work_items_feature_flag_enabled? }
+
+ context 'when a project does not belong to a group' do
+ let_it_be(:project) { create(:project, namespace: namespace) }
+
+ it_behaves_like 'project checking work_items feature flag'
+ end
+
+ context 'when project belongs to a group' do
+ let_it_be(:root_group) { create(:group) }
+ let_it_be(:group) { create(:group, parent: root_group) }
+ let_it_be(:project) { create(:project, group: group) }
+
+ it_behaves_like 'project checking work_items feature flag'
+
+ context 'when work_items FF is enabled for the root group' do
+ before do
+ stub_feature_flags(work_items: root_group)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when work_items FF is enabled for the group' do
+ before do
+ stub_feature_flags(work_items: group)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
+ end
+
describe 'serialization' do
let(:object) { build(:project) }
it_behaves_like 'blocks unsafe serialization'
end
+ describe '#enqueue_record_project_target_platforms' do
+ let_it_be(:project) { create(:project) }
+
+ let(:com) { true }
+
+ before do
+ allow(Gitlab).to receive(:com?).and_return(com)
+ end
+
+ it 'enqueues a Projects::RecordTargetPlatformsWorker' do
+ expect(Projects::RecordTargetPlatformsWorker).to receive(:perform_async).with(project.id)
+
+ project.enqueue_record_project_target_platforms
+ end
+
+ shared_examples 'does not enqueue a Projects::RecordTargetPlatformsWorker' do
+ it 'does not enqueue a Projects::RecordTargetPlatformsWorker' do
+ expect(Projects::RecordTargetPlatformsWorker).not_to receive(:perform_async)
+
+ project.enqueue_record_project_target_platforms
+ end
+ end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(record_projects_target_platforms: false)
+ end
+
+ it_behaves_like 'does not enqueue a Projects::RecordTargetPlatformsWorker'
+ end
+
+ context 'when not in gitlab.com' do
+ let(:com) { false }
+
+ it_behaves_like 'does not enqueue a Projects::RecordTargetPlatformsWorker'
+ end
+ end
+
+ describe '#inactive?' do
+ let_it_be_with_reload(:project) { create(:project, name: 'test-project') }
+
+ it_behaves_like 'returns true if project is inactive'
+ end
+
private
def finish_job(export_job)
diff --git a/spec/models/project_statistics_spec.rb b/spec/models/project_statistics_spec.rb
index 5fbf1a9c502..20fc14113ef 100644
--- a/spec/models/project_statistics_spec.rb
+++ b/spec/models/project_statistics_spec.rb
@@ -35,7 +35,8 @@ RSpec.describe ProjectStatistics do
build_artifacts_size: 1.exabyte,
snippets_size: 1.exabyte,
pipeline_artifacts_size: 512.petabytes - 1,
- uploads_size: 512.petabytes
+ uploads_size: 512.petabytes,
+ container_registry_size: 8.exabytes - 1
)
statistics.reload
@@ -49,6 +50,7 @@ RSpec.describe ProjectStatistics do
expect(statistics.snippets_size).to eq(1.exabyte)
expect(statistics.pipeline_artifacts_size).to eq(512.petabytes - 1)
expect(statistics.uploads_size).to eq(512.petabytes)
+ expect(statistics.container_registry_size).to eq(8.exabytes - 1)
end
end
diff --git a/spec/models/projects/build_artifacts_size_refresh_spec.rb b/spec/models/projects/build_artifacts_size_refresh_spec.rb
index 22c27c986f8..a55e4b31d21 100644
--- a/spec/models/projects/build_artifacts_size_refresh_spec.rb
+++ b/spec/models/projects/build_artifacts_size_refresh_spec.rb
@@ -14,13 +14,13 @@ RSpec.describe Projects::BuildArtifactsSizeRefresh, type: :model do
end
describe 'scopes' do
- let_it_be(:refresh_1) { create(:project_build_artifacts_size_refresh, :running, updated_at: 4.days.ago) }
- let_it_be(:refresh_2) { create(:project_build_artifacts_size_refresh, :running, updated_at: 2.days.ago) }
+ let_it_be(:refresh_1) { create(:project_build_artifacts_size_refresh, :running, updated_at: (described_class::STALE_WINDOW + 1.second).ago) }
+ let_it_be(:refresh_2) { create(:project_build_artifacts_size_refresh, :running, updated_at: 1.hour.ago) }
let_it_be(:refresh_3) { create(:project_build_artifacts_size_refresh, :pending) }
let_it_be(:refresh_4) { create(:project_build_artifacts_size_refresh, :created) }
describe 'stale' do
- it 'returns records in running state and has not been updated for more than 3 days' do
+ it 'returns records in running state and has not been updated for more than 2 hours' do
expect(described_class.stale).to eq([refresh_1])
end
end
diff --git a/spec/models/projects/topic_spec.rb b/spec/models/projects/topic_spec.rb
index aa3230da1e6..8fc4d11f0d9 100644
--- a/spec/models/projects/topic_spec.rb
+++ b/spec/models/projects/topic_spec.rb
@@ -56,6 +56,14 @@ RSpec.describe Projects::Topic do
end
end
+ describe '#find_by_name_case_insensitive' do
+ it 'returns topic with case insensitive name' do
+ %w(topic TOPIC Topic).each do |name|
+ expect(described_class.find_by_name_case_insensitive(name)).to eq(topic)
+ end
+ end
+ end
+
describe '#search' do
it 'returns topics with a matching name' do
expect(described_class.search(topic.name)).to eq([topic])
diff --git a/spec/models/user_preference_spec.rb b/spec/models/user_preference_spec.rb
index d4491aacd9f..2492521c634 100644
--- a/spec/models/user_preference_spec.rb
+++ b/spec/models/user_preference_spec.rb
@@ -5,6 +5,48 @@ require 'spec_helper'
RSpec.describe UserPreference do
let(:user_preference) { create(:user_preference) }
+ describe 'validations' do
+ describe 'diffs_deletion_color and diffs_addition_color' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(color: [
+ '#000000',
+ '#123456',
+ '#abcdef',
+ '#AbCdEf',
+ '#ffffff',
+ '#fFfFfF',
+ '#000',
+ '#123',
+ '#abc',
+ '#AbC',
+ '#fff',
+ '#fFf',
+ ''
+ ])
+
+ with_them do
+ it { is_expected.to allow_value(color).for(:diffs_deletion_color) }
+ it { is_expected.to allow_value(color).for(:diffs_addition_color) }
+ end
+
+ where(color: [
+ '#1',
+ '#12',
+ '#1234',
+ '#12345',
+ '#1234567',
+ '123456',
+ '#12345x'
+ ])
+
+ with_them do
+ it { is_expected.not_to allow_value(color).for(:diffs_deletion_color) }
+ it { is_expected.not_to allow_value(color).for(:diffs_addition_color) }
+ end
+ end
+ end
+
describe 'notes filters global keys' do
it 'contains expected values' do
expect(UserPreference::NOTES_FILTERS.keys).to match_array([:all_notes, :only_comments, :only_activity])
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 6ee38048025..bc425b15c6e 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -69,6 +69,12 @@ RSpec.describe User do
it { is_expected.to delegate_method(:markdown_surround_selection).to(:user_preference) }
it { is_expected.to delegate_method(:markdown_surround_selection=).to(:user_preference).with_arguments(:args) }
+ it { is_expected.to delegate_method(:diffs_deletion_color).to(:user_preference) }
+ it { is_expected.to delegate_method(:diffs_deletion_color=).to(:user_preference).with_arguments(:args) }
+
+ it { is_expected.to delegate_method(:diffs_addition_color).to(:user_preference) }
+ it { is_expected.to delegate_method(:diffs_addition_color=).to(:user_preference).with_arguments(:args) }
+
it { is_expected.to delegate_method(:job_title).to(:user_detail).allow_nil }
it { is_expected.to delegate_method(:job_title=).to(:user_detail).with_arguments(:args).allow_nil }
@@ -1554,7 +1560,7 @@ RSpec.describe User do
end
it 'adds the confirmed primary email to emails' do
- expect(user.emails.confirmed.map(&:email)).not_to include(user.email)
+ expect(user.emails.confirmed.map(&:email)).not_to include(user.unconfirmed_email)
user.confirm
@@ -1613,14 +1619,23 @@ RSpec.describe User do
context 'when the email is changed but not confirmed' do
let(:user) { create(:user, email: 'primary@example.com') }
- it 'does not add the new email to emails yet' do
+ before do
user.update!(email: 'new_primary@example.com')
+ end
+ it 'does not add the new email to emails yet' do
expect(user.unconfirmed_email).to eq('new_primary@example.com')
expect(user.email).to eq('primary@example.com')
expect(user).to be_confirmed
expect(user.emails.pluck(:email)).not_to include('new_primary@example.com')
end
+
+ it 'adds the new email to emails upon confirmation' do
+ user.confirm
+ expect(user.email).to eq('new_primary@example.com')
+ expect(user).to be_confirmed
+ expect(user.emails.pluck(:email)).to include('new_primary@example.com')
+ end
end
context 'when the user is created as not confirmed' do
@@ -1630,6 +1645,11 @@ RSpec.describe User do
expect(user).not_to be_confirmed
expect(user.emails.pluck(:email)).not_to include('primary@example.com')
end
+
+ it 'adds the email to emails upon confirmation' do
+ user.confirm
+ expect(user.emails.pluck(:email)).to include('primary@example.com')
+ end
end
context 'when the user is created as confirmed' do
@@ -2083,6 +2103,74 @@ RSpec.describe User do
end
end
+ describe 'needs_new_otp_secret?', :freeze_time do
+ let(:user) { create(:user) }
+
+ context 'when two-factor is not enabled' do
+ it 'returns true if otp_secret_expires_at is nil' do
+ expect(user.needs_new_otp_secret?).to eq(true)
+ end
+
+ it 'returns true if the otp_secret_expires_at has passed' do
+ user.update!(otp_secret_expires_at: 10.minutes.ago)
+
+ expect(user.reload.needs_new_otp_secret?).to eq(true)
+ end
+
+ it 'returns false if the otp_secret_expires_at has not passed' do
+ user.update!(otp_secret_expires_at: 10.minutes.from_now)
+
+ expect(user.reload.needs_new_otp_secret?).to eq(false)
+ end
+ end
+
+ context 'when two-factor is enabled' do
+ let(:user) { create(:user, :two_factor) }
+
+ it 'returns false even if ttl is expired' do
+ user.otp_secret_expires_at = 10.minutes.ago
+
+ expect(user.needs_new_otp_secret?).to eq(false)
+ end
+ end
+ end
+
+ describe 'otp_secret_expired?', :freeze_time do
+ let(:user) { create(:user) }
+
+ it 'returns true if otp_secret_expires_at is nil' do
+ expect(user.otp_secret_expired?).to eq(true)
+ end
+
+ it 'returns true if the otp_secret_expires_at has passed' do
+ user.otp_secret_expires_at = 10.minutes.ago
+
+ expect(user.otp_secret_expired?).to eq(true)
+ end
+
+ it 'returns false if the otp_secret_expires_at has not passed' do
+ user.otp_secret_expires_at = 20.minutes.from_now
+
+ expect(user.otp_secret_expired?).to eq(false)
+ end
+ end
+
+ describe 'update_otp_secret!', :freeze_time do
+ let(:user) { create(:user) }
+
+ before do
+ user.update_otp_secret!
+ end
+
+ it 'sets the otp_secret' do
+ expect(user.otp_secret).to have_attributes(length: described_class::OTP_SECRET_LENGTH)
+ end
+
+ it 'updates the otp_secret_expires_at' do
+ expect(user.otp_secret_expires_at).to eq(Time.current + described_class::OTP_SECRET_TTL)
+ end
+ end
+
describe 'projects' do
before do
@user = create(:user)
@@ -2653,6 +2741,19 @@ RSpec.describe User do
let_it_be(:user3) { create(:user, name: 'us', username: 'se', email: 'foo@example.com') }
let_it_be(:email) { create(:email, user: user, email: 'alias@example.com') }
+ describe 'name user and email relative ordering' do
+ let_it_be(:named_alexander) { create(:user, name: 'Alexander Person', username: 'abcd', email: 'abcd@example.com') }
+ let_it_be(:username_alexand) { create(:user, name: 'Joao Alexander', username: 'Alexand', email: 'joao@example.com') }
+
+ it 'prioritizes exact matches' do
+ expect(described_class.search('Alexand')).to eq([username_alexand, named_alexander])
+ end
+
+ it 'falls back to ordering by name' do
+ expect(described_class.search('Alexander')).to eq([named_alexander, username_alexand])
+ end
+ end
+
describe 'name matching' do
it 'returns users with a matching name with exact match first' do
expect(described_class.search(user.name)).to eq([user, user2])
@@ -4251,16 +4352,34 @@ RSpec.describe User do
end
end
- it_behaves_like '#ci_owned_runners'
+ describe '#ci_owned_runners' do
+ it_behaves_like '#ci_owned_runners'
- context 'when FF ci_owned_runners_cross_joins_fix is disabled' do
- before do
- skip_if_multiple_databases_are_setup
+ context 'when FF use_traversal_ids is disabled fallbacks to inefficient implementation' do
+ before do
+ stub_feature_flags(use_traversal_ids: false)
+ end
- stub_feature_flags(ci_owned_runners_cross_joins_fix: false)
+ it_behaves_like '#ci_owned_runners'
end
- it_behaves_like '#ci_owned_runners'
+ context 'when FF ci_owned_runners_cross_joins_fix is disabled' do
+ before do
+ skip_if_multiple_databases_are_setup
+
+ stub_feature_flags(ci_owned_runners_cross_joins_fix: false)
+ end
+
+ it_behaves_like '#ci_owned_runners'
+ end
+
+ context 'when FF ci_owned_runners_unnest_index is disabled uses GIN index' do
+ before do
+ stub_feature_flags(ci_owned_runners_unnest_index: false)
+ end
+
+ it_behaves_like '#ci_owned_runners'
+ end
end
describe '#projects_with_reporter_access_limited_to' do
@@ -4882,17 +5001,36 @@ RSpec.describe User do
end
describe '#attention_requested_open_merge_requests_count' do
- it 'returns number of open merge requests from non-archived projects' do
- user = create(:user)
- project = create(:project, :public)
- archived_project = create(:project, :public, :archived)
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :public) }
+ let(:archived_project) { create(:project, :public, :archived) }
+ before do
create(:merge_request, source_project: project, author: user, reviewers: [user])
create(:merge_request, :closed, source_project: project, author: user, reviewers: [user])
create(:merge_request, source_project: archived_project, author: user, reviewers: [user])
+ end
+ it 'returns number of open merge requests from non-archived projects' do
+ expect(Rails.cache).not_to receive(:fetch)
expect(user.attention_requested_open_merge_requests_count(force: true)).to eq 1
end
+
+ context 'when uncached_mr_attention_requests_count is disabled' do
+ before do
+ stub_feature_flags(uncached_mr_attention_requests_count: false)
+ end
+
+ it 'fetches from cache' do
+ expect(Rails.cache).to receive(:fetch).with(
+ user.attention_request_cache_key,
+ force: false,
+ expires_in: described_class::COUNT_CACHE_VALIDITY_PERIOD
+ ).and_call_original
+
+ expect(user.attention_requested_open_merge_requests_count).to eq 1
+ end
+ end
end
describe '#assigned_open_issues_count' do
@@ -6632,6 +6770,23 @@ RSpec.describe User do
end
end
+ describe '.without_forbidden_states' do
+ let_it_be(:normal_user) { create(:user, username: 'johndoe') }
+ let_it_be(:admin_user) { create(:user, :admin, username: 'iamadmin') }
+ let_it_be(:blocked_user) { create(:user, :blocked, username: 'notsorandom') }
+ let_it_be(:banned_user) { create(:user, :banned, username: 'iambanned') }
+ let_it_be(:external_user) { create(:user, :external) }
+ let_it_be(:unconfirmed_user) { create(:user, confirmed_at: nil) }
+ let_it_be(:omniauth_user) { create(:omniauth_user, provider: 'twitter', extern_uid: '123456') }
+ let_it_be(:internal_user) { User.alert_bot.tap { |u| u.confirm } }
+
+ it 'does not return blocked or banned users' do
+ expect(described_class.without_forbidden_states).to match_array([
+ normal_user, admin_user, external_user, unconfirmed_user, omniauth_user, internal_user
+ ])
+ end
+ end
+
describe 'user_project' do
it 'returns users project matched by username and public visibility' do
user = create(:user)
diff --git a/spec/models/users/in_product_marketing_email_spec.rb b/spec/models/users/in_product_marketing_email_spec.rb
index cf08cf7ceed..ca03c3e645d 100644
--- a/spec/models/users/in_product_marketing_email_spec.rb
+++ b/spec/models/users/in_product_marketing_email_spec.rb
@@ -19,13 +19,6 @@ RSpec.describe Users::InProductMarketingEmail, type: :model do
it { is_expected.to validate_uniqueness_of(:user_id).scoped_to([:track, :series]).with_message('has already been sent') }
end
- describe '.tracks' do
- it 'has an entry for every track' do
- tracks = [Namespaces::InviteTeamEmailService::TRACK, Namespaces::InProductMarketingEmailsService::TRACKS.keys].flatten
- expect(tracks).to match_array(described_class.tracks.keys.map(&:to_sym))
- end
- end
-
describe '.without_track_and_series' do
let_it_be(:user) { create(:user) }
@@ -135,4 +128,15 @@ RSpec.describe Users::InProductMarketingEmail, type: :model do
end
end
end
+
+ describe '.ACTIVE_TRACKS' do
+ it 'has an entry for every track' do
+ tracks = Namespaces::InProductMarketingEmailsService::TRACKS.keys
+ expect(tracks).to match_array(described_class::ACTIVE_TRACKS.keys.map(&:to_sym))
+ end
+
+ it 'does not include INACTIVE_TRACK_NAMES' do
+ expect(described_class::ACTIVE_TRACKS.keys).not_to include(*described_class::INACTIVE_TRACK_NAMES)
+ end
+ end
end
diff --git a/spec/models/web_ide_terminal_spec.rb b/spec/models/web_ide_terminal_spec.rb
index 149fce33f43..fc30bc18f68 100644
--- a/spec/models/web_ide_terminal_spec.rb
+++ b/spec/models/web_ide_terminal_spec.rb
@@ -41,7 +41,7 @@ RSpec.describe WebIdeTerminal do
context 'when image does not have an alias' do
let(:config) do
- { image: 'ruby:2.7' }.merge(services_with_aliases)
+ { image: 'image:1.0' }.merge(services_with_aliases)
end
it 'returns services aliases' do
@@ -51,7 +51,7 @@ RSpec.describe WebIdeTerminal do
context 'when both image and services have aliases' do
let(:config) do
- { image: { name: 'ruby:2.7', alias: 'ruby' } }.merge(services_with_aliases)
+ { image: { name: 'image:1.0', alias: 'ruby' } }.merge(services_with_aliases)
end
it 'returns all aliases' do
@@ -61,7 +61,7 @@ RSpec.describe WebIdeTerminal do
context 'when image and services does not have any alias' do
let(:config) do
- { image: 'ruby:2.7', services: ['postgres'] }
+ { image: 'image:1.0', services: ['postgres'] }
end
it 'returns an empty array' do
diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb
index 0016d2f517b..51970064c54 100644
--- a/spec/models/wiki_page_spec.rb
+++ b/spec/models/wiki_page_spec.rb
@@ -473,6 +473,21 @@ RSpec.describe WikiPage do
end
end
+ describe 'in subdir' do
+ it 'keeps the page in the same dir when the content is updated' do
+ title = 'foo/Existing Page'
+ page = create_wiki_page(title: title)
+
+ expect(page.slug).to eq 'foo/Existing-Page'
+ expect(page.update(title: title, content: 'new_content')).to be_truthy
+
+ page = wiki.find_page(title)
+
+ expect(page.slug).to eq 'foo/Existing-Page'
+ expect(page.content).to eq 'new_content'
+ end
+ end
+
context 'when renaming a page' do
it 'raises an error if the page already exists' do
existing_page = create_wiki_page
diff --git a/spec/policies/alert_management/alert_policy_spec.rb b/spec/policies/alert_management/alert_policy_spec.rb
index 3e08d8b4ccc..2027c205c7b 100644
--- a/spec/policies/alert_management/alert_policy_spec.rb
+++ b/spec/policies/alert_management/alert_policy_spec.rb
@@ -3,9 +3,10 @@
require 'spec_helper'
RSpec.describe AlertManagement::AlertPolicy, :models do
- let(:alert) { create(:alert_management_alert) }
- let(:project) { alert.project }
- let(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:alert) { create(:alert_management_alert, project: project, issue: incident) }
+ let_it_be(:incident) { nil }
subject(:policy) { described_class.new(user, alert) }
@@ -21,5 +22,50 @@ RSpec.describe AlertManagement::AlertPolicy, :models do
it { is_expected.to be_allowed :read_alert_management_alert }
it { is_expected.to be_allowed :update_alert_management_alert }
end
+
+ shared_examples 'does not allow metric image reads' do
+ it { expect(policy).to be_disallowed(:read_alert_management_metric_image) }
+ end
+
+ shared_examples 'does not allow metric image updates' do
+ specify do
+ expect(policy).to be_disallowed(:upload_alert_management_metric_image)
+ expect(policy).to be_disallowed(:destroy_alert_management_metric_image)
+ end
+ end
+
+ shared_examples 'allows metric image reads' do
+ it { expect(policy).to be_allowed(:read_alert_management_metric_image) }
+ end
+
+ shared_examples 'allows metric image updates' do
+ specify do
+ expect(policy).to be_allowed(:upload_alert_management_metric_image)
+ expect(policy).to be_allowed(:destroy_alert_management_metric_image)
+ end
+ end
+
+ context 'when user is not a member' do
+ include_examples 'does not allow metric image reads'
+ include_examples 'does not allow metric image updates'
+ end
+
+ context 'when user is a guest' do
+ before do
+ project.add_guest(user)
+ end
+
+ include_examples 'does not allow metric image reads'
+ include_examples 'does not allow metric image updates'
+ end
+
+ context 'when user is a developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ include_examples 'allows metric image reads'
+ include_examples 'allows metric image updates'
+ end
end
end
diff --git a/spec/policies/note_policy_spec.rb b/spec/policies/note_policy_spec.rb
index f6cd84f29ae..eeaa77a4589 100644
--- a/spec/policies/note_policy_spec.rb
+++ b/spec/policies/note_policy_spec.rb
@@ -359,39 +359,6 @@ RSpec.describe NotePolicy do
expect(permissions(assignee, confidential_note)).to be_disallowed(:admin_note, :reposition_note, :resolve_note)
end
end
-
- context 'for merge requests' do
- let(:merge_request) { create(:merge_request, source_project: project, author: author, assignees: [assignee]) }
- let(:confidential_note) { create(:note, :confidential, project: project, noteable: merge_request) }
-
- it_behaves_like 'confidential notes permissions'
-
- it 'allows noteable assignees to read all notes' do
- expect(permissions(assignee, confidential_note)).to be_allowed(:read_note, :award_emoji)
- expect(permissions(assignee, confidential_note)).to be_disallowed(:admin_note, :reposition_note, :resolve_note)
- end
- end
-
- context 'for project snippets' do
- let(:project_snippet) { create(:project_snippet, project: project, author: author) }
- let(:confidential_note) { create(:note, :confidential, project: project, noteable: project_snippet) }
-
- it_behaves_like 'confidential notes permissions'
- end
-
- context 'for personal snippets' do
- let(:personal_snippet) { create(:personal_snippet, author: author) }
- let(:confidential_note) { create(:note, :confidential, project: nil, noteable: personal_snippet) }
-
- it 'allows snippet author to read and resolve all notes' do
- expect(permissions(author, confidential_note)).to be_allowed(:read_note, :resolve_note, :award_emoji)
- expect(permissions(author, confidential_note)).to be_disallowed(:admin_note, :reposition_note)
- end
-
- it 'does not allow maintainers to read confidential notes and replies' do
- expect(permissions(maintainer, confidential_note)).to be_disallowed(:read_note, :admin_note, :reposition_note, :resolve_note, :award_emoji)
- end
- end
end
end
end
diff --git a/spec/policies/project_member_policy_spec.rb b/spec/policies/project_member_policy_spec.rb
index 12b3e60fdb2..b19ab71fcb5 100644
--- a/spec/policies/project_member_policy_spec.rb
+++ b/spec/policies/project_member_policy_spec.rb
@@ -23,9 +23,9 @@ RSpec.describe ProjectMemberPolicy do
it { is_expected.not_to be_allowed(:destroy_project_bot_member) }
end
- context 'when user is project owner' do
- let(:member_user) { project.first_owner }
- let(:member) { project.members.find_by!(user: member_user) }
+ context 'when user is the holder of personal namespace in which the project resides' do
+ let(:namespace_holder) { project.namespace.owner }
+ let(:member) { project.members.find_by!(user: namespace_holder) }
it { is_expected.to be_allowed(:read_project) }
it { is_expected.to be_disallowed(:update_project_member) }
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index fb1c5874335..bde83d647db 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -346,6 +346,36 @@ RSpec.describe ProjectPolicy do
end
end
+ context 'reading usage quotas' do
+ %w(maintainer owner).each do |role|
+ context "with #{role}" do
+ let(:current_user) { send(role) }
+
+ it { is_expected.to be_allowed(:read_usage_quotas) }
+ end
+ end
+
+ %w(guest reporter developer anonymous).each do |role|
+ context "with #{role}" do
+ let(:current_user) { send(role) }
+
+ it { is_expected.to be_disallowed(:read_usage_quotas) }
+ end
+ end
+
+ context 'with an admin' do
+ let(:current_user) { admin }
+
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { expect_allowed(:read_usage_quotas) }
+ end
+
+ context 'when admin mode is disabled' do
+ it { expect_disallowed(:read_usage_quotas) }
+ end
+ end
+ end
+
it_behaves_like 'clusterable policies' do
let_it_be(:clusterable) { create(:project, :repository) }
let_it_be(:cluster) do
diff --git a/spec/presenters/ci/bridge_presenter_spec.rb b/spec/presenters/ci/bridge_presenter_spec.rb
index 6291c3426e2..bd6c4777d0c 100644
--- a/spec/presenters/ci/bridge_presenter_spec.rb
+++ b/spec/presenters/ci/bridge_presenter_spec.rb
@@ -3,9 +3,10 @@
require 'spec_helper'
RSpec.describe Ci::BridgePresenter do
+ let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
- let_it_be(:bridge) { create(:ci_bridge, pipeline: pipeline, status: :failed) }
+ let_it_be(:bridge) { create(:ci_bridge, pipeline: pipeline, status: :failed, user: user) }
subject(:presenter) do
described_class.new(bridge)
@@ -14,4 +15,10 @@ RSpec.describe Ci::BridgePresenter do
it 'presents information about recoverable state' do
expect(presenter).to be_recoverable
end
+
+ it 'presents the detailed status for the user' do
+ expect(bridge).to receive(:detailed_status).with(user)
+
+ presenter.detailed_status
+ end
end
diff --git a/spec/presenters/ci/build_runner_presenter_spec.rb b/spec/presenters/ci/build_runner_presenter_spec.rb
index d25102532a7..ace65307321 100644
--- a/spec/presenters/ci/build_runner_presenter_spec.rb
+++ b/spec/presenters/ci/build_runner_presenter_spec.rb
@@ -78,16 +78,72 @@ RSpec.describe Ci::BuildRunnerPresenter do
artifact_format: Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.fetch(file_type),
paths: [filename],
when: 'always'
- }
+ }.compact
end
it 'presents correct hash' do
- expect(presenter.artifacts.first).to include(report_expectation)
+ expect(presenter.artifacts).to contain_exactly(report_expectation)
end
end
end
end
+ context 'when a specific coverage_report type is given' do
+ let(:coverage_format) { :cobertura }
+ let(:filename) { 'cobertura-coverage.xml' }
+ let(:coverage_report) { { path: filename, coverage_format: coverage_format } }
+ let(:report) { { coverage_report: coverage_report } }
+ let(:build) { create(:ci_build, options: { artifacts: { reports: report } }) }
+
+ let(:expected_coverage_report) do
+ {
+ name: filename,
+ artifact_type: coverage_format,
+ artifact_format: Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.fetch(coverage_format),
+ paths: [filename],
+ when: 'always'
+ }
+ end
+
+ it 'presents the coverage report hash with the coverage format' do
+ expect(presenter.artifacts).to contain_exactly(expected_coverage_report)
+ end
+ end
+
+ context 'when a specific coverage_report type is given with another report type' do
+ let(:coverage_format) { :cobertura }
+ let(:coverage_filename) { 'cobertura-coverage.xml' }
+ let(:coverage_report) { { path: coverage_filename, coverage_format: coverage_format } }
+ let(:ds_filename) { 'gl-dependency-scanning-report.json' }
+
+ let(:report) { { coverage_report: coverage_report, dependency_scanning: [ds_filename] } }
+ let(:build) { create(:ci_build, options: { artifacts: { reports: report } }) }
+
+ let(:expected_coverage_report) do
+ {
+ name: coverage_filename,
+ artifact_type: coverage_format,
+ artifact_format: Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.fetch(coverage_format),
+ paths: [coverage_filename],
+ when: 'always'
+ }
+ end
+
+ let(:expected_ds_report) do
+ {
+ name: ds_filename,
+ artifact_type: :dependency_scanning,
+ artifact_format: Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.fetch(:dependency_scanning),
+ paths: [ds_filename],
+ when: 'always'
+ }
+ end
+
+ it 'presents both reports' do
+ expect(presenter.artifacts).to contain_exactly(expected_coverage_report, expected_ds_report)
+ end
+ end
+
context "when option has both archive and reports specification" do
let(:report) { { junit: ['junit.xml'] } }
let(:build) { create(:ci_build, options: { script: 'echo', artifacts: { **archive, reports: report } }) }
diff --git a/spec/presenters/gitlab/blame_presenter_spec.rb b/spec/presenters/gitlab/blame_presenter_spec.rb
index b163926154b..ff128416692 100644
--- a/spec/presenters/gitlab/blame_presenter_spec.rb
+++ b/spec/presenters/gitlab/blame_presenter_spec.rb
@@ -27,6 +27,14 @@ RSpec.describe Gitlab::BlamePresenter do
end
end
+ describe '#first_line' do
+ it 'delegates #first_line call to the blame' do
+ expect(blame).to receive(:first_line).at_least(:once).and_call_original
+
+ subject.first_line
+ end
+ end
+
describe '#commit_data' do
it 'has the data necessary to render the view' do
commit = blame.groups.first[:commit]
@@ -37,9 +45,28 @@ RSpec.describe Gitlab::BlamePresenter do
expect(data.age_map_class).to include('blame-commit-age-')
expect(data.commit_link.to_s).to include '913c66a37b4a45b9769037c55c2d238bd0942d2e">Files, encoding and much more</a>'
expect(data.commit_author_link.to_s).to include('<a class="commit-author-link" href=')
- expect(data.project_blame_link.to_s).to include('<a title="View blame prior to this change"')
expect(data.time_ago_tooltip.to_s).to include('data-container="body">Feb 27, 2014</time>')
end
end
+
+ context 'renamed file' do
+ let(:path) { 'files/plain_text/renamed' }
+ let(:commit) { project.commit('blame-on-renamed') }
+
+ it 'does not generate link to previous blame on initial commit' do
+ commit = blame.groups[0][:commit]
+ data = subject.commit_data(commit)
+
+ expect(data.project_blame_link.to_s).to eq('')
+ end
+
+ it 'generates link link to previous blame' do
+ commit = blame.groups[1][:commit]
+ data = subject.commit_data(commit)
+
+ expect(data.project_blame_link.to_s).to include('<a title="View blame prior to this change"')
+ expect(data.project_blame_link.to_s).to include('/blame/405a45736a75e439bb059e638afaa9a3c2eeda79/files/plain_text/initial-commit')
+ end
+ end
end
end
diff --git a/spec/presenters/issue_presenter_spec.rb b/spec/presenters/issue_presenter_spec.rb
index 55a6b50ffa7..e17ae218cd3 100644
--- a/spec/presenters/issue_presenter_spec.rb
+++ b/spec/presenters/issue_presenter_spec.rb
@@ -5,19 +5,42 @@ require 'spec_helper'
RSpec.describe IssuePresenter do
include Gitlab::Routing.url_helpers
- let(:user) { create(:user) }
- let(:group) { create(:group) }
- let(:project) { create(:project, group: group) }
- let(:issue) { create(:issue, project: project) }
- let(:presenter) { described_class.new(issue, current_user: user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:task) { create(:issue, :task, project: project) }
- before do
+ let(:presented_issue) { issue }
+ let(:presenter) { described_class.new(presented_issue, current_user: user) }
+
+ before_all do
group.add_developer(user)
end
describe '#web_url' do
it 'returns correct path' do
- expect(presenter.web_url).to eq("http://localhost/#{group.name}/#{project.name}/-/issues/#{issue.iid}")
+ expect(presenter.web_url).to eq("http://localhost/#{group.name}/#{project.name}/-/issues/#{presented_issue.iid}")
+ end
+
+ context 'when issue type is task' do
+ let(:presented_issue) { task }
+
+ context 'when work_items feature flag is enabled' do
+ it 'returns a work item url for the task' do
+ expect(presenter.web_url).to eq(project_work_items_url(project, work_items_path: presented_issue.id))
+ end
+ end
+
+ context 'when work_items feature flag is disabled' do
+ before do
+ stub_feature_flags(work_items: false)
+ end
+
+ it 'returns an issue url for the task' do
+ expect(presenter.web_url).to eq("http://localhost/#{group.name}/#{project.name}/-/issues/#{presented_issue.iid}")
+ end
+ end
end
end
@@ -29,7 +52,7 @@ RSpec.describe IssuePresenter do
end
it 'returns subscribed' do
- create(:subscription, user: user, project: project, subscribable: issue, subscribed: true)
+ create(:subscription, user: user, project: project, subscribable: presented_issue, subscribed: true)
is_expected.to be(true)
end
@@ -37,7 +60,27 @@ RSpec.describe IssuePresenter do
describe '#issue_path' do
it 'returns correct path' do
- expect(presenter.issue_path).to eq("/#{group.name}/#{project.name}/-/issues/#{issue.iid}")
+ expect(presenter.issue_path).to eq("/#{group.name}/#{project.name}/-/issues/#{presented_issue.iid}")
+ end
+
+ context 'when issue type is task' do
+ let(:presented_issue) { task }
+
+ context 'when work_items feature flag is enabled' do
+ it 'returns a work item path for the task' do
+ expect(presenter.issue_path).to eq(project_work_items_path(project, work_items_path: presented_issue.id))
+ end
+ end
+
+ context 'when work_items feature flag is disabled' do
+ before do
+ stub_feature_flags(work_items: false)
+ end
+
+ it 'returns an issue path for the task' do
+ expect(presenter.issue_path).to eq("/#{group.name}/#{project.name}/-/issues/#{presented_issue.iid}")
+ end
+ end
end
end
diff --git a/spec/presenters/project_clusterable_presenter_spec.rb b/spec/presenters/project_clusterable_presenter_spec.rb
index 900630bb6e2..bd4319c9411 100644
--- a/spec/presenters/project_clusterable_presenter_spec.rb
+++ b/spec/presenters/project_clusterable_presenter_spec.rb
@@ -49,6 +49,12 @@ RSpec.describe ProjectClusterablePresenter do
it { is_expected.to eq(connect_project_clusters_path(project)) }
end
+ describe '#new_cluster_docs_path' do
+ subject { presenter.new_cluster_docs_path }
+
+ it { is_expected.to eq(new_cluster_docs_project_clusters_path(project)) }
+ end
+
describe '#authorize_aws_role_path' do
subject { presenter.authorize_aws_role_path }
diff --git a/spec/presenters/projects/security/configuration_presenter_spec.rb b/spec/presenters/projects/security/configuration_presenter_spec.rb
index 47ef0cf1192..779d6b88fd5 100644
--- a/spec/presenters/projects/security/configuration_presenter_spec.rb
+++ b/spec/presenters/projects/security/configuration_presenter_spec.rb
@@ -87,6 +87,7 @@ RSpec.describe Projects::Security::ConfigurationPresenter do
expect(feature['configuration_path']).to be_nil
expect(feature['available']).to eq(true)
expect(feature['can_enable_by_merge_request']).to eq(true)
+ expect(feature['meta_info_path']).to be_nil
end
context 'when checking features configured status' do
diff --git a/spec/requests/admin/background_migrations_controller_spec.rb b/spec/requests/admin/background_migrations_controller_spec.rb
index 55971a00e55..9933008502f 100644
--- a/spec/requests/admin/background_migrations_controller_spec.rb
+++ b/spec/requests/admin/background_migrations_controller_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Admin::BackgroundMigrationsController, :enable_admin_mode do
end
describe 'POST #retry' do
- let(:migration) { create(:batched_background_migration, status: 'failed') }
+ let(:migration) { create(:batched_background_migration, :failed) }
before do
create(:batched_background_migration_job, :failed, batched_migration: migration, batch_size: 10, min_value: 6, max_value: 15, attempts: 3)
@@ -37,11 +37,11 @@ RSpec.describe Admin::BackgroundMigrationsController, :enable_admin_mode do
it 'retries the migration' do
retry_migration
- expect(migration.reload.status).to eql 'active'
+ expect(migration.reload.status_name).to be :active
end
context 'when the migration is not failed' do
- let(:migration) { create(:batched_background_migration, status: 'paused') }
+ let(:migration) { create(:batched_background_migration, :paused) }
it 'keeps the same migration status' do
expect { retry_migration }.not_to change { migration.reload.status }
diff --git a/spec/requests/api/alert_management_alerts_spec.rb b/spec/requests/api/alert_management_alerts_spec.rb
new file mode 100644
index 00000000000..99293e5ae95
--- /dev/null
+++ b/spec/requests/api/alert_management_alerts_spec.rb
@@ -0,0 +1,411 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::AlertManagementAlerts do
+ let_it_be(:creator) { create(:user) }
+ let_it_be(:project) do
+ create(:project, :public, creator_id: creator.id, namespace: creator.namespace)
+ end
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:alert) { create(:alert_management_alert, project: project) }
+
+ describe 'PUT /projects/:id/alert_management_alerts/:alert_iid/metric_images/authorize' do
+ include_context 'workhorse headers'
+
+ before do
+ project.add_developer(user)
+ end
+
+ subject do
+ post api("/projects/#{project.id}/alert_management_alerts/#{alert.iid}/metric_images/authorize", user),
+ headers: workhorse_headers
+ end
+
+ it 'authorizes uploading with workhorse header' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response.media_type.to_s).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE)
+ end
+
+ it 'rejects requests that bypassed gitlab-workhorse' do
+ workhorse_headers.delete(Gitlab::Workhorse::INTERNAL_API_REQUEST_HEADER)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+
+ context 'when using remote storage' do
+ context 'when direct upload is enabled' do
+ before do
+ stub_uploads_object_storage(MetricImageUploader, enabled: true, direct_upload: true)
+ end
+
+ it 'responds with status 200, location of file remote store and object details' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response.media_type.to_s).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE)
+ expect(json_response).not_to have_key('TempPath')
+ expect(json_response['RemoteObject']).to have_key('ID')
+ expect(json_response['RemoteObject']).to have_key('GetURL')
+ expect(json_response['RemoteObject']).to have_key('StoreURL')
+ expect(json_response['RemoteObject']).to have_key('DeleteURL')
+ expect(json_response['RemoteObject']).to have_key('MultipartUpload')
+ end
+ end
+
+ context 'when direct upload is disabled' do
+ before do
+ stub_uploads_object_storage(MetricImageUploader, enabled: true, direct_upload: false)
+ end
+
+ it 'handles as a local file' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response.media_type.to_s).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE)
+ expect(json_response['TempPath']).to eq(MetricImageUploader.workhorse_local_upload_path)
+ expect(json_response['RemoteObject']).to be_nil
+ end
+ end
+ end
+ end
+
+ describe 'POST /projects/:id/alert_management_alerts/:alert_iid/metric_images' do
+ include WorkhorseHelpers
+ using RSpec::Parameterized::TableSyntax
+
+ include_context 'workhorse headers'
+
+ let(:file) { fixture_file_upload('spec/fixtures/rails_sample.jpg', 'image/jpg') }
+ let(:file_name) { 'rails_sample.jpg' }
+ let(:url) { 'http://gitlab.com' }
+ let(:url_text) { 'GitLab' }
+
+ let(:params) { { url: url, url_text: url_text } }
+
+ subject do
+ workhorse_finalize(
+ api("/projects/#{project.id}/alert_management_alerts/#{alert.iid}/metric_images", user),
+ method: :post,
+ file_key: :file,
+ params: params.merge(file: file),
+ headers: workhorse_headers,
+ send_rewritten_field: true
+ )
+ end
+
+ shared_examples 'can_upload_metric_image' do
+ it 'creates a new metric image' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response['filename']).to eq(file_name)
+ expect(json_response['url']).to eq(url)
+ expect(json_response['url_text']).to eq(url_text)
+ expect(json_response['created_at']).not_to be_nil
+ expect(json_response['id']).not_to be_nil
+ file_path_regex = %r{/uploads/-/system/alert_management_metric_image/file/\d+/#{file_name}}
+ expect(json_response['file_path']).to match(file_path_regex)
+ end
+ end
+
+ shared_examples 'unauthorized_upload' do
+ it 'disallows the upload' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect(json_response['message']).to eq('403 Forbidden')
+ end
+ end
+
+ where(:user_role, :expected_status) do
+ :guest | :unauthorized_upload
+ :reporter | :unauthorized_upload
+ :developer | :can_upload_metric_image
+ end
+
+ with_them do
+ before do
+ # Local storage
+ stub_uploads_object_storage(MetricImageUploader, enabled: false)
+ allow_next_instance_of(MetricImageUploader) do |uploader|
+ allow(uploader).to receive(:file_storage?).and_return(true)
+ end
+
+ project.send("add_#{user_role}", user)
+ end
+
+ it_behaves_like "#{params[:expected_status]}"
+ end
+
+ context 'file size too large' do
+ before do
+ allow_next_instance_of(UploadedFile) do |upload_file|
+ allow(upload_file).to receive(:size).and_return(AlertManagement::MetricImage::MAX_FILE_SIZE + 1)
+ end
+ end
+
+ it 'returns an error' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(response.body).to match(/File is too large/)
+ end
+ end
+
+ context 'error when saving' do
+ before do
+ project.add_developer(user)
+
+ allow_next_instance_of(::AlertManagement::MetricImages::UploadService) do |service|
+ error = instance_double(ServiceResponse, success?: false, message: 'some error', http_status: :bad_request)
+ allow(service).to receive(:execute).and_return(error)
+ end
+ end
+
+ it 'returns an error' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(response.body).to match(/some error/)
+ end
+ end
+
+ context 'object storage enabled' do
+ before do
+ # Object storage
+ stub_uploads_object_storage(MetricImageUploader)
+
+ allow_next_instance_of(MetricImageUploader) do |uploader|
+ allow(uploader).to receive(:file_storage?).and_return(true)
+ end
+ project.add_developer(user)
+ end
+
+ it_behaves_like 'can_upload_metric_image'
+
+ it 'uploads to remote storage' do
+ subject
+
+ last_upload = AlertManagement::MetricImage.last.uploads.last
+ expect(last_upload.store).to eq(::ObjectStorage::Store::REMOTE)
+ end
+ end
+ end
+
+ describe 'GET /projects/:id/alert_management_alerts/:alert_iid/metric_images' do
+ using RSpec::Parameterized::TableSyntax
+
+ let!(:image) { create(:alert_metric_image, alert: alert) }
+
+ subject { get api("/projects/#{project.id}/alert_management_alerts/#{alert.iid}/metric_images", user) }
+
+ shared_examples 'can_read_metric_image' do
+ it 'can read the metric images' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.first).to match(
+ {
+ id: image.id,
+ created_at: image.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'),
+ filename: image.filename,
+ file_path: image.file_path,
+ url: image.url,
+ url_text: nil
+ }.with_indifferent_access
+ )
+ end
+ end
+
+ shared_examples 'unauthorized_read' do
+ it 'cannot read the metric images' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ where(:user_role, :public_project, :expected_status) do
+ :not_member | false | :unauthorized_read
+ :not_member | true | :unauthorized_read
+ :guest | false | :unauthorized_read
+ :reporter | false | :unauthorized_read
+ :developer | false | :can_read_metric_image
+ end
+
+ with_them do
+ before do
+ project.send("add_#{user_role}", user) unless user_role == :not_member
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) unless public_project
+ end
+
+ it_behaves_like "#{params[:expected_status]}"
+ end
+ end
+
+ describe 'PUT /projects/:id/alert_management_alerts/:alert_iid/metric_images/:metric_image_id' do
+ using RSpec::Parameterized::TableSyntax
+
+ let!(:image) { create(:alert_metric_image, alert: alert) }
+ let(:params) { { url: 'http://test.example.com', url_text: 'Example website 123' } }
+
+ subject do
+ put api("/projects/#{project.id}/alert_management_alerts/#{alert.iid}/metric_images/#{image.id}", user),
+ params: params
+ end
+
+ shared_examples 'can_update_metric_image' do
+ it 'can update the metric images' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(json_response['url']).to eq(params[:url])
+ expect(json_response['url_text']).to eq(params[:url_text])
+ end
+ end
+
+ shared_examples 'unauthorized_update' do
+ it 'cannot update the metric image' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect(image.reload).to eq(image)
+ end
+ end
+
+ where(:user_role, :public_project, :expected_status) do
+ :not_member | false | :unauthorized_update
+ :not_member | true | :unauthorized_update
+ :guest | false | :unauthorized_update
+ :reporter | false | :unauthorized_update
+ :developer | false | :can_update_metric_image
+ end
+
+ with_them do
+ before do
+ project.send("add_#{user_role}", user) unless user_role == :not_member
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) unless public_project
+ end
+
+ it_behaves_like "#{params[:expected_status]}"
+ end
+
+ context 'when user has access' do
+ before do
+ project.add_developer(user)
+ end
+
+ context 'and metric image not found' do
+ subject do
+ put api("/projects/#{project.id}/alert_management_alerts/#{alert.iid}/metric_images/#{non_existing_record_id}", user) # rubocop: disable Layout/LineLength
+ end
+
+ it 'returns an error' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('Metric image not found')
+ end
+ end
+
+ context 'metric image cannot be updated' do
+ let(:params) { { url_text: 'something_long' * 100 } }
+
+ it 'returns an error' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response['message']).to eq('Metric image could not be updated')
+ end
+ end
+ end
+ end
+
+ describe 'DELETE /projects/:id/alert_management_alerts/:alert_iid/metric_images/:metric_image_id' do
+ using RSpec::Parameterized::TableSyntax
+
+ let!(:image) { create(:alert_metric_image, alert: alert) }
+
+ subject do
+ delete api("/projects/#{project.id}/alert_management_alerts/#{alert.iid}/metric_images/#{image.id}", user)
+ end
+
+ shared_examples 'can delete metric image successfully' do
+ it 'can delete the metric images' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ expect { image.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ shared_examples 'unauthorized delete' do
+ it 'cannot delete the metric image' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ expect(image.reload).to eq(image)
+ end
+ end
+
+ where(:user_role, :public_project, :expected_status) do
+ :not_member | false | 'unauthorized delete'
+ :not_member | true | 'unauthorized delete'
+ :guest | false | 'unauthorized delete'
+ :reporter | false | 'unauthorized delete'
+ :developer | false | 'can delete metric image successfully'
+ end
+
+ with_them do
+ before do
+ project.send("add_#{user_role}", user) unless user_role == :not_member
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) unless public_project
+ end
+
+ it_behaves_like "#{params[:expected_status]}"
+ end
+
+ context 'when user has access' do
+ before do
+ project.add_developer(user)
+ end
+
+ context 'when metric image not found' do
+ subject do
+ delete api("/projects/#{project.id}/alert_management_alerts/#{alert.iid}/metric_images/#{non_existing_record_id}", user) # rubocop: disable Layout/LineLength
+ end
+
+ it 'returns an error' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('Metric image not found')
+ end
+ end
+
+ context 'when error when deleting' do
+ before do
+ allow_next_instance_of(AlertManagement::AlertsFinder) do |finder|
+ allow(finder).to receive(:execute).and_return([alert])
+ end
+
+ allow(alert).to receive_message_chain('metric_images.find_by_id') { image }
+ allow(image).to receive(:destroy).and_return(false)
+ end
+
+ it 'returns an error' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response['message']).to eq('Metric image could not be deleted')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/award_emoji_spec.rb b/spec/requests/api/award_emoji_spec.rb
index 07a9f7dfd74..782e14593f7 100644
--- a/spec/requests/api/award_emoji_spec.rb
+++ b/spec/requests/api/award_emoji_spec.rb
@@ -26,6 +26,23 @@ RSpec.describe API::AwardEmoji do
expect(json_response.first['name']).to eq(award_emoji.name)
end
+ it "includes custom emoji attributes" do
+ group = create(:group)
+ group.add_maintainer(user)
+
+ project = create(:project, namespace: group)
+ custom_emoji = create(:custom_emoji, name: 'partyparrot', namespace: group)
+ issue = create(:issue, project: project)
+ create(:award_emoji, awardable: issue, user: user, name: custom_emoji.name)
+
+ get api("/projects/#{project.id}/issues/#{issue.iid}/award_emoji", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_an Array
+ expect(json_response.first['name']).to eq(custom_emoji.name)
+ expect(json_response.first['url']).to eq(custom_emoji.file)
+ end
+
it "returns a 404 error when issue id not found" do
get api("/projects/#{project.id}/issues/#{non_existing_record_iid}/award_emoji", user)
diff --git a/spec/requests/api/bulk_imports_spec.rb b/spec/requests/api/bulk_imports_spec.rb
index 1602819a02e..3b8136f265b 100644
--- a/spec/requests/api/bulk_imports_spec.rb
+++ b/spec/requests/api/bulk_imports_spec.rb
@@ -18,6 +18,29 @@ RSpec.describe API::BulkImports do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('id')).to contain_exactly(import_1.id, import_2.id)
end
+
+ context 'sort parameter' do
+ it 'sorts by created_at descending by default' do
+ get api('/bulk_imports', user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to eq([import_2.id, import_1.id])
+ end
+
+ it 'sorts by created_at descending when explicitly specified' do
+ get api('/bulk_imports', user), params: { sort: 'desc' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to eq([import_2.id, import_1.id])
+ end
+
+ it 'sorts by created_at ascending when explicitly specified' do
+ get api('/bulk_imports', user), params: { sort: 'asc' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to eq([import_1.id, import_2.id])
+ end
+ end
end
describe 'POST /bulk_imports' do
diff --git a/spec/requests/api/ci/job_artifacts_spec.rb b/spec/requests/api/ci/job_artifacts_spec.rb
index 0db6acbc7b8..5abff85af9c 100644
--- a/spec/requests/api/ci/job_artifacts_spec.rb
+++ b/spec/requests/api/ci/job_artifacts_spec.rb
@@ -82,18 +82,6 @@ RSpec.describe API::Ci::JobArtifacts do
end
describe 'DELETE /projects/:id/artifacts' do
- context 'when feature flag is disabled' do
- before do
- stub_feature_flags(bulk_expire_project_artifacts: false)
- end
-
- it 'returns 404' do
- delete api("/projects/#{project.id}/artifacts", api_user)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
context 'when user is anonymous' do
let(:api_user) { nil }
@@ -236,6 +224,8 @@ RSpec.describe API::Ci::JobArtifacts do
expect(response.headers.to_h)
.to include('Content-Type' => 'application/json',
'Gitlab-Workhorse-Send-Data' => /artifacts-entry/)
+ expect(response.headers.to_h)
+ .not_to include('Gitlab-Workhorse-Detect-Content-Type' => 'true')
expect(response.parsed_body).to be_empty
end
@@ -568,7 +558,8 @@ RSpec.describe API::Ci::JobArtifacts do
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers.to_h)
.to include('Content-Type' => 'application/json',
- 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/)
+ 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/,
+ 'Gitlab-Workhorse-Detect-Content-Type' => 'true')
end
end
@@ -638,7 +629,8 @@ RSpec.describe API::Ci::JobArtifacts do
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers.to_h)
.to include('Content-Type' => 'application/json',
- 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/)
+ 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/,
+ 'Gitlab-Workhorse-Detect-Content-Type' => 'true')
expect(response.parsed_body).to be_empty
end
end
@@ -656,7 +648,8 @@ RSpec.describe API::Ci::JobArtifacts do
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers.to_h)
.to include('Content-Type' => 'application/json',
- 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/)
+ 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/,
+ 'Gitlab-Workhorse-Detect-Content-Type' => 'true')
end
end
diff --git a/spec/requests/api/ci/jobs_spec.rb b/spec/requests/api/ci/jobs_spec.rb
index f6dae7e8e23..d3820e4948e 100644
--- a/spec/requests/api/ci/jobs_spec.rb
+++ b/spec/requests/api/ci/jobs_spec.rb
@@ -623,6 +623,15 @@ RSpec.describe API::Ci::Jobs do
end
end
+ context 'when a build is not retryable' do
+ let(:job) { create(:ci_build, :created, pipeline: pipeline) }
+
+ it 'responds with unprocessable entity' do
+ expect(json_response['message']).to eq('403 Forbidden - Job is not retryable')
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
context 'user without :update_build permission' do
let(:api_user) { reporter }
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 d317386dc73..9e6bac41d59 100644
--- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
@@ -216,7 +216,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(json_response['token']).to eq(job.token)
expect(json_response['job_info']).to eq(expected_job_info)
expect(json_response['git_info']).to eq(expected_git_info)
- expect(json_response['image']).to eq({ 'name' => 'ruby:2.7', 'entrypoint' => '/bin/sh', 'ports' => [] })
+ expect(json_response['image']).to eq({ 'name' => 'image:1.0', 'entrypoint' => '/bin/sh', 'ports' => [] })
expect(json_response['services']).to eq([{ 'name' => 'postgres', 'entrypoint' => nil,
'alias' => nil, 'command' => nil, 'ports' => [], 'variables' => nil },
{ 'name' => 'docker:stable-dind', 'entrypoint' => '/bin/sh',
@@ -611,6 +611,40 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
end
+ context 'when job has code coverage report' do
+ let(:job) do
+ create(:ci_build, :pending, :queued, :coverage_report_cobertura,
+ pipeline: pipeline, name: 'spinach', stage: 'test', stage_idx: 0)
+ end
+
+ let(:expected_artifacts) do
+ [
+ {
+ 'name' => 'cobertura-coverage.xml',
+ 'paths' => ['cobertura.xml'],
+ 'when' => 'always',
+ 'expire_in' => '7d',
+ "artifact_type" => "cobertura",
+ "artifact_format" => "gzip"
+ }
+ ]
+ end
+
+ it 'returns job with the correct artifact specification', :aggregate_failures do
+ request_job info: { platform: :darwin, features: { upload_multiple_artifacts: true } }
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(response.headers['Content-Type']).to eq('application/json')
+ expect(response.headers).not_to have_key('X-GitLab-Last-Update')
+ expect(runner.reload.platform).to eq('darwin')
+ expect(json_response['id']).to eq(job.id)
+ expect(json_response['token']).to eq(job.token)
+ expect(json_response['job_info']).to eq(expected_job_info)
+ expect(json_response['git_info']).to eq(expected_git_info)
+ expect(json_response['artifacts']).to eq(expected_artifacts)
+ end
+ end
+
context 'when triggered job is available' do
let(:expected_variables) do
[{ 'key' => 'CI_JOB_NAME', 'value' => 'spinach', 'public' => true, 'masked' => false },
@@ -819,11 +853,11 @@ 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 for the API' do
- let(:expected_params) { { user: user.username, project: project.full_path, client_id: "user/#{user.id}" } }
+ let(:expected_params) { { user: user.username, project: project.full_path, client_id: "runner/#{runner.id}", job_id: job.id, pipeline_id: job.pipeline_id } }
end
- it_behaves_like 'not executing any extra queries for the application context', 3 do
- # Extra queries: User, Project, Route
+ it_behaves_like 'not executing any extra queries for the application context', 4 do
+ # Extra queries: User, Project, Route, Runner
let(:subject_proc) { proc { request_job(id: job.id) } }
end
end
diff --git a/spec/requests/api/ci/secure_files_spec.rb b/spec/requests/api/ci/secure_files_spec.rb
index aa479cb8713..6de6d1ef222 100644
--- a/spec/requests/api/ci/secure_files_spec.rb
+++ b/spec/requests/api/ci/secure_files_spec.rb
@@ -6,15 +6,24 @@ RSpec.describe API::Ci::SecureFiles do
before do
stub_ci_secure_file_object_storage
stub_feature_flags(ci_secure_files: true)
+ stub_feature_flags(ci_secure_files_read_only: false)
end
let_it_be(:maintainer) { create(:user) }
let_it_be(:developer) { create(:user) }
let_it_be(:guest) { create(:user) }
let_it_be(:anonymous) { create(:user) }
+ let_it_be(:unconfirmed) { create(:user, :unconfirmed) }
let_it_be(:project) { create(:project, creator_id: maintainer.id) }
let_it_be(:secure_file) { create(:ci_secure_file, project: project) }
+ let(:file_params) do
+ {
+ file: fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks'),
+ name: 'upload-keystore.jks'
+ }
+ end
+
before_all do
project.add_maintainer(maintainer)
project.add_developer(developer)
@@ -39,6 +48,43 @@ RSpec.describe API::Ci::SecureFiles do
end
end
+ context 'ci_secure_files_read_only feature flag' do
+ context 'when the flag is enabled' do
+ before do
+ stub_feature_flags(ci_secure_files_read_only: true)
+ end
+
+ it 'returns a 503 when attempting to upload a file' do
+ stub_feature_flags(ci_secure_files_read_only: true)
+
+ expect do
+ post api("/projects/#{project.id}/secure_files", maintainer), params: file_params
+ end.not_to change {project.secure_files.count}
+
+ expect(response).to have_gitlab_http_status(:service_unavailable)
+ end
+
+ it 'returns a 200 when downloading a file' do
+ stub_feature_flags(ci_secure_files_read_only: true)
+
+ get api("/projects/#{project.id}/secure_files", developer)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_a(Array)
+ end
+ end
+
+ context 'when the flag is disabled' do
+ it 'returns a 201 when uploading a file when the ci_secure_files_read_only feature flag is disabled' do
+ expect do
+ post api("/projects/#{project.id}/secure_files", maintainer), params: file_params
+ end.to change {project.secure_files.count}.by(1)
+
+ expect(response).to have_gitlab_http_status(:created)
+ end
+ end
+ end
+
context 'authenticated user with admin permissions' do
it 'returns project secure files' do
get api("/projects/#{project.id}/secure_files", maintainer)
@@ -73,6 +119,14 @@ RSpec.describe API::Ci::SecureFiles do
end
end
+ context 'unconfirmed user' do
+ it 'does not return project secure files' do
+ get api("/projects/#{project.id}/secure_files", unconfirmed)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
context 'unauthenticated user' do
it 'does not return project secure files' do
get api("/projects/#{project.id}/secure_files")
@@ -117,6 +171,14 @@ RSpec.describe API::Ci::SecureFiles do
end
end
+ context 'unconfirmed user' do
+ it 'does not return project secure file details' do
+ get api("/projects/#{project.id}/secure_files/#{secure_file.id}", unconfirmed)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
context 'unauthenticated user' do
it 'does not return project secure file details' do
get api("/projects/#{project.id}/secure_files/#{secure_file.id}")
@@ -167,6 +229,14 @@ RSpec.describe API::Ci::SecureFiles do
end
end
+ context 'unconfirmed user' do
+ it 'does not return project secure file details' do
+ get api("/projects/#{project.id}/secure_files/#{secure_file.id}/download", unconfirmed)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
context 'unauthenticated user' do
it 'does not return project secure file details' do
get api("/projects/#{project.id}/secure_files/#{secure_file.id}/download")
@@ -179,14 +249,8 @@ RSpec.describe API::Ci::SecureFiles do
describe 'POST /projects/:id/secure_files' do
context 'authenticated user with admin permissions' do
it 'creates a secure file' do
- params = {
- file: fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks'),
- name: 'upload-keystore.jks',
- permissions: 'execute'
- }
-
expect do
- post api("/projects/#{project.id}/secure_files", maintainer), params: params
+ post api("/projects/#{project.id}/secure_files", maintainer), params: file_params.merge(permissions: 'execute')
end.to change {project.secure_files.count}.by(1)
expect(response).to have_gitlab_http_status(:created)
@@ -204,26 +268,15 @@ RSpec.describe API::Ci::SecureFiles do
end
it 'creates a secure file with read_only permissions by default' do
- params = {
- file: fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks'),
- name: 'upload-keystore.jks'
- }
-
expect do
- post api("/projects/#{project.id}/secure_files", maintainer), params: params
+ post api("/projects/#{project.id}/secure_files", maintainer), params: file_params
end.to change {project.secure_files.count}.by(1)
expect(json_response['permissions']).to eq('read_only')
end
it 'uploads and downloads a secure file' do
- post_params = {
- file: fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks'),
- name: 'upload-keystore.jks',
- permissions: 'read_write'
- }
-
- post api("/projects/#{project.id}/secure_files", maintainer), params: post_params
+ post api("/projects/#{project.id}/secure_files", maintainer), params: file_params
secure_file_id = json_response['id']
@@ -243,12 +296,8 @@ RSpec.describe API::Ci::SecureFiles do
end
it 'returns an error when no file is uploaded' do
- post_params = {
- name: 'upload-keystore.jks'
- }
-
expect do
- post api("/projects/#{project.id}/secure_files", maintainer), params: post_params
+ post api("/projects/#{project.id}/secure_files", maintainer), params: { name: 'upload-keystore.jks' }
end.not_to change { project.secure_files.count }
expect(response).to have_gitlab_http_status(:bad_request)
@@ -256,7 +305,17 @@ RSpec.describe API::Ci::SecureFiles do
end
it 'returns an error when the file name is missing' do
+ expect do
+ post api("/projects/#{project.id}/secure_files", maintainer), params: { file: fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks') }
+ end.not_to change { project.secure_files.count }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('name is missing')
+ end
+
+ it 'returns an error when the file name has already been used' do
post_params = {
+ name: secure_file.name,
file: fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks')
}
@@ -265,18 +324,12 @@ RSpec.describe API::Ci::SecureFiles do
end.not_to change { project.secure_files.count }
expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to eq('name is missing')
+ expect(json_response['message']['name']).to include('has already been taken')
end
it 'returns an error when an unexpected permission is supplied' do
- post_params = {
- file: fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks'),
- name: 'upload-keystore.jks',
- permissions: 'foo'
- }
-
expect do
- post api("/projects/#{project.id}/secure_files", maintainer), params: post_params
+ post api("/projects/#{project.id}/secure_files", maintainer), params: file_params.merge(permissions: 'foo')
end.not_to change { project.secure_files.count }
expect(response).to have_gitlab_http_status(:bad_request)
@@ -290,13 +343,8 @@ RSpec.describe API::Ci::SecureFiles do
allow(instance).to receive_message_chain(:errors, :messages).and_return(['Error 1', 'Error 2'])
end
- post_params = {
- file: fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks'),
- name: 'upload-keystore.jks'
- }
-
expect do
- post api("/projects/#{project.id}/secure_files", maintainer), params: post_params
+ post api("/projects/#{project.id}/secure_files", maintainer), params: file_params
end.not_to change { project.secure_files.count }
expect(response).to have_gitlab_http_status(:bad_request)
@@ -307,13 +355,8 @@ RSpec.describe API::Ci::SecureFiles do
allow(instance).to receive_message_chain(:file, :size).and_return(6.megabytes.to_i)
end
- post_params = {
- file: fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks'),
- name: 'upload-keystore.jks'
- }
-
expect do
- post api("/projects/#{project.id}/secure_files", maintainer), params: post_params
+ post api("/projects/#{project.id}/secure_files", maintainer), params: file_params
end.not_to change { project.secure_files.count }
expect(response).to have_gitlab_http_status(:payload_too_large)
@@ -340,6 +383,16 @@ RSpec.describe API::Ci::SecureFiles do
end
end
+ context 'unconfirmed user' do
+ it 'does not create a secure file' do
+ expect do
+ post api("/projects/#{project.id}/secure_files", unconfirmed)
+ end.not_to change { project.secure_files.count }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
context 'unauthenticated user' do
it 'does not create a secure file' do
expect do
@@ -390,6 +443,16 @@ RSpec.describe API::Ci::SecureFiles do
end
end
+ context 'unconfirmed user' do
+ it 'does not delete the secure_file' do
+ expect do
+ delete api("/projects/#{project.id}/secure_files#{secure_file.id}", unconfirmed)
+ end.not_to change { project.secure_files.count }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
context 'unauthenticated user' do
it 'does not delete the secure_file' do
expect do
diff --git a/spec/requests/api/clusters/agents_spec.rb b/spec/requests/api/clusters/agents_spec.rb
new file mode 100644
index 00000000000..e29be255289
--- /dev/null
+++ b/spec/requests/api/clusters/agents_spec.rb
@@ -0,0 +1,153 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Clusters::Agents do
+ let_it_be(:agent) { create(:cluster_agent) }
+
+ let(:user) { agent.created_by_user }
+ let(:unauthorized_user) { create(:user) }
+ let!(:project) { agent.project }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ describe 'GET /projects/:id/cluster_agents' do
+ context 'authorized user' do
+ it 'returns project agents' do
+ get api("/projects/#{project.id}/cluster_agents", user)
+
+ aggregate_failures "testing response" do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(response).to match_response_schema('public_api/v4/agents')
+ expect(json_response.count).to eq(1)
+ expect(json_response.first['name']).to eq(agent.name)
+ end
+ end
+ end
+
+ context 'unauthorized user' do
+ it 'unable to access agents' do
+ get api("/projects/#{project.id}/cluster_agents", unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ it 'avoids N+1 queries', :request_store do
+ # Establish baseline
+ get api("/projects/#{project.id}/cluster_agents", user)
+
+ control = ActiveRecord::QueryRecorder.new do
+ get api("/projects/#{project.id}/cluster_agents", user)
+ end
+
+ # Now create a second record and ensure that the API does not execute
+ # any more queries than before
+ create(:cluster_agent, project: project)
+
+ expect do
+ get api("/projects/#{project.id}/cluster_agents", user)
+ end.not_to exceed_query_limit(control)
+ end
+ end
+
+ describe 'GET /projects/:id/cluster_agents/:agent_id' do
+ context 'authorized user' do
+ it 'returns a project agent' do
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}", user)
+
+ aggregate_failures "testing response" do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('public_api/v4/agent')
+ expect(json_response['name']).to eq(agent.name)
+ end
+ end
+
+ it 'returns a 404 error if agent id is not available' do
+ get api("/projects/#{project.id}/cluster_agents/#{non_existing_record_id}", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'unauthorized user' do
+ it 'unable to access an existing agent' do
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}", unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'POST /projects/:id/cluster_agents' do
+ it 'adds agent to project' do
+ expect do
+ post(api("/projects/#{project.id}/cluster_agents", user),
+ params: { name: 'some-agent' })
+ end.to change {project.cluster_agents.count}.by(1)
+
+ aggregate_failures "testing response" do
+ expect(response).to have_gitlab_http_status(:created)
+ expect(response).to match_response_schema('public_api/v4/agent')
+ expect(json_response['name']).to eq('some-agent')
+ end
+ end
+
+ it 'returns a 400 error if name not given' do
+ post api("/projects/#{project.id}/cluster_agents", user)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+
+ it 'returns a 400 error if name is invalid' do
+ post api("/projects/#{project.id}/cluster_agents", user), params: { name: '#4^x' }
+
+ aggregate_failures "testing response" do
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message'])
+ .to include("Name can contain only lowercase letters, digits, and '-', but cannot start or end with '-'")
+ end
+ end
+
+ it 'returns 404 error if project does not exist' do
+ post api("/projects/#{non_existing_record_id}/cluster_agents", user), params: { name: 'some-agent' }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ describe 'DELETE /projects/:id/cluster_agents/:agent_id' do
+ it 'deletes agent from project' do
+ expect do
+ delete api("/projects/#{project.id}/cluster_agents/#{agent.id}", user)
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end.to change {project.cluster_agents.count}.by(-1)
+ end
+
+ it 'returns a 404 error when deleting non existent agent' do
+ delete api("/projects/#{project.id}/cluster_agents/#{non_existing_record_id}", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it 'returns a 404 error if agent id not given' do
+ delete api("/projects/#{project.id}/cluster_agents", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it 'returns a 404 if the user is unauthorized to delete' do
+ delete api("/projects/#{project.id}/cluster_agents/#{agent.id}", unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it_behaves_like '412 response' do
+ let(:request) { api("/projects/#{project.id}/cluster_agents/#{agent.id}", user) }
+ end
+ end
+end
diff --git a/spec/requests/api/composer_packages_spec.rb b/spec/requests/api/composer_packages_spec.rb
index bc30fc3b230..53f3ef10743 100644
--- a/spec/requests/api/composer_packages_spec.rb
+++ b/spec/requests/api/composer_packages_spec.rb
@@ -430,11 +430,23 @@ RSpec.describe API::ComposerPackages do
context 'with valid project' do
let!(:package) { create(:composer_package, :with_metadatum, name: package_name, project: project) }
+ let(:headers) { basic_auth_header(user.username, personal_access_token.token) }
+
+ before do
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
+ end
context 'when the sha does not match the package name' do
let(:sha) { '123' }
+ let(:headers) { basic_auth_header(user.username, personal_access_token.token) }
- it_behaves_like 'process Composer api request', :anonymous, :not_found
+ context 'anonymous' do
+ let(:headers) { {} }
+
+ it_behaves_like 'process Composer api request', :anonymous, :unauthorized
+ end
+
+ it_behaves_like 'process Composer api request', :developer, :not_found
end
context 'when the package name does not match the sha' do
@@ -442,7 +454,13 @@ RSpec.describe API::ComposerPackages do
let(:sha) { branch.target }
let(:url) { "/projects/#{project.id}/packages/composer/archives/unexisting-package-name.zip" }
- it_behaves_like 'process Composer api request', :anonymous, :not_found
+ context 'anonymous' do
+ let(:headers) { {} }
+
+ it_behaves_like 'process Composer api request', :anonymous, :unauthorized
+ end
+
+ it_behaves_like 'process Composer api request', :developer, :not_found
end
context 'with a match package name and sha' do
@@ -460,14 +478,14 @@ RSpec.describe API::ComposerPackages do
'PUBLIC' | :guest | false | false | :success
'PUBLIC' | :anonymous | false | true | :success
'PRIVATE' | :developer | true | true | :success
- 'PRIVATE' | :developer | true | false | :success
- 'PRIVATE' | :developer | false | true | :success
- 'PRIVATE' | :developer | false | false | :success
- 'PRIVATE' | :guest | true | true | :success
- 'PRIVATE' | :guest | true | false | :success
- 'PRIVATE' | :guest | false | true | :success
- 'PRIVATE' | :guest | false | false | :success
- 'PRIVATE' | :anonymous | false | true | :success
+ 'PRIVATE' | :developer | true | false | :unauthorized
+ 'PRIVATE' | :developer | false | true | :not_found
+ 'PRIVATE' | :developer | false | false | :unauthorized
+ 'PRIVATE' | :guest | true | true | :forbidden
+ 'PRIVATE' | :guest | true | false | :unauthorized
+ 'PRIVATE' | :guest | false | true | :not_found
+ 'PRIVATE' | :guest | false | false | :unauthorized
+ 'PRIVATE' | :anonymous | false | true | :unauthorized
end
with_them do
@@ -480,8 +498,17 @@ RSpec.describe API::ComposerPackages do
end
it_behaves_like 'process Composer api request', params[:user_role], params[:expected_status], params[:member]
- it_behaves_like 'a package tracking event', described_class.name, 'pull_package'
+
+ include_context 'Composer user type', params[:user_role], params[:member] do
+ if params[:expected_status] == :success
+ it_behaves_like 'a package tracking event', described_class.name, 'pull_package'
+ else
+ it_behaves_like 'not a package tracking event'
+ end
+ end
end
+
+ it_behaves_like 'Composer publish with deploy tokens'
end
end
diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb
index 6aa12b6ff48..cb0b5f6bfc3 100644
--- a/spec/requests/api/files_spec.rb
+++ b/spec/requests/api/files_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe API::Files do
let!(:project) { create(:project, :repository, namespace: user.namespace ) }
let(:guest) { create(:user) { |u| project.add_guest(u) } }
let(:file_path) { "files%2Fruby%2Fpopen%2Erb" }
+ let(:executable_file_path) { "files%2Fexecutables%2Fls" }
let(:rouge_file_path) { "%2e%2e%2f" }
let(:absolute_path) { "%2Fetc%2Fpasswd.rb" }
let(:invalid_file_message) { 'file_path should be a valid file path' }
@@ -18,6 +19,12 @@ RSpec.describe API::Files do
}
end
+ let(:executable_ref_params) do
+ {
+ ref: 'with-executables'
+ }
+ end
+
let(:author_email) { 'user@example.org' }
let(:author_name) { 'John Doe' }
@@ -219,9 +226,26 @@ RSpec.describe API::Files do
expect(json_response['file_name']).to eq('popen.rb')
expect(json_response['last_commit_id']).to eq('570e7b2abdd848b95f2f578043fc23bd6f6fd24d')
expect(json_response['content_sha256']).to eq('c440cd09bae50c4632cc58638ad33c6aa375b6109d811e76a9cc3a613c1e8887')
+ expect(json_response['execute_filemode']).to eq(false)
expect(Base64.decode64(json_response['content']).lines.first).to eq("require 'fileutils'\n")
end
+ context 'for executable file' do
+ it 'returns file attributes as json' do
+ get api(route(executable_file_path), api_user, **options), params: executable_ref_params
+
+ aggregate_failures 'testing response' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['file_path']).to eq(CGI.unescape(executable_file_path))
+ expect(json_response['file_name']).to eq('ls')
+ expect(json_response['last_commit_id']).to eq('6b8dc4a827797aa025ff6b8f425e583858a10d4f')
+ expect(json_response['content_sha256']).to eq('2c74b1181ef780dfb692c030d3a0df6e0b624135c38a9344e56b9f80007b6191')
+ expect(json_response['execute_filemode']).to eq(true)
+ expect(Base64.decode64(json_response['content']).lines.first).to eq("#!/bin/sh\n")
+ end
+ end
+ end
+
it 'returns json when file has txt extension' do
file_path = "bar%2Fbranch-test.txt"
@@ -386,6 +410,23 @@ RSpec.describe API::Files do
expect(response.headers['X-Gitlab-Last-Commit-Id']).to eq('570e7b2abdd848b95f2f578043fc23bd6f6fd24d')
expect(response.headers['X-Gitlab-Content-Sha256'])
.to eq('c440cd09bae50c4632cc58638ad33c6aa375b6109d811e76a9cc3a613c1e8887')
+ expect(response.headers['X-Gitlab-Execute-Filemode']).to eq("false")
+ end
+
+ context 'for executable file' do
+ it 'returns file attributes in headers' do
+ head api(route(executable_file_path) + '/blame', current_user), params: executable_ref_params
+
+ aggregate_failures 'testing response' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response.headers['X-Gitlab-File-Path']).to eq(CGI.unescape(executable_file_path))
+ expect(response.headers['X-Gitlab-File-Name']).to eq('ls')
+ expect(response.headers['X-Gitlab-Last-Commit-Id']).to eq('6b8dc4a827797aa025ff6b8f425e583858a10d4f')
+ expect(response.headers['X-Gitlab-Content-Sha256'])
+ .to eq('2c74b1181ef780dfb692c030d3a0df6e0b624135c38a9344e56b9f80007b6191')
+ expect(response.headers['X-Gitlab-Execute-Filemode']).to eq("true")
+ end
+ end
end
it 'returns 400 when file path is invalid' do
@@ -642,6 +683,15 @@ RSpec.describe API::Files do
}
end
+ let(:executable_params) do
+ {
+ branch: "master",
+ content: "puts 8",
+ commit_message: "Added newfile",
+ execute_filemode: true
+ }
+ end
+
it 'returns 400 when file path is invalid' do
post api(route(rouge_file_path), user), params: params
@@ -661,6 +711,18 @@ RSpec.describe API::Files do
last_commit = project.repository.commit.raw
expect(last_commit.author_email).to eq(user.email)
expect(last_commit.author_name).to eq(user.name)
+ expect(project.repository.blob_at_branch(params[:branch], CGI.unescape(file_path)).executable?).to eq(false)
+ end
+
+ it "creates a new executable file in project repo" do
+ post api(route(file_path), user), params: executable_params
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response["file_path"]).to eq(CGI.unescape(file_path))
+ last_commit = project.repository.commit.raw
+ expect(last_commit.author_email).to eq(user.email)
+ expect(last_commit.author_name).to eq(user.name)
+ expect(project.repository.blob_at_branch(params[:branch], CGI.unescape(file_path)).executable?).to eq(true)
end
it "returns a 400 bad request if no mandatory params given" do
@@ -820,6 +882,44 @@ RSpec.describe API::Files do
expect(last_commit.author_name).to eq(author_name)
end
end
+
+ context 'when specifying the execute_filemode' do
+ let(:executable_params) do
+ {
+ branch: 'master',
+ content: 'puts 8',
+ commit_message: 'Changed file',
+ execute_filemode: true
+ }
+ end
+
+ let(:non_executable_params) do
+ {
+ branch: 'with-executables',
+ content: 'puts 8',
+ commit_message: 'Changed file',
+ execute_filemode: false
+ }
+ end
+
+ it 'updates to executable file mode' do
+ put api(route(file_path), user), params: executable_params
+
+ aggregate_failures 'testing response' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(project.repository.blob_at_branch(executable_params[:branch], CGI.unescape(file_path)).executable?).to eq(true)
+ end
+ end
+
+ it 'updates to non-executable file mode' do
+ put api(route(executable_file_path), user), params: non_executable_params
+
+ aggregate_failures 'testing response' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(project.repository.blob_at_branch(non_executable_params[:branch], CGI.unescape(executable_file_path)).executable?).to eq(false)
+ end
+ end
+ end
end
describe "DELETE /projects/:id/repository/files" do
diff --git a/spec/requests/api/graphql/ci/job_spec.rb b/spec/requests/api/graphql/ci/job_spec.rb
index b0514a0a963..ddb2664d353 100644
--- a/spec/requests/api/graphql/ci/job_spec.rb
+++ b/spec/requests/api/graphql/ci/job_spec.rb
@@ -52,6 +52,7 @@ RSpec.describe 'Query.project(fullPath).pipelines.job(id)' do
'name' => job_2.name,
'allowFailure' => job_2.allow_failure,
'duration' => 25,
+ 'kind' => 'BUILD',
'queuedDuration' => 2.0,
'status' => job_2.status.upcase
)
diff --git a/spec/requests/api/graphql/ci/jobs_spec.rb b/spec/requests/api/graphql/ci/jobs_spec.rb
index b191b585d06..2d1bb45390b 100644
--- a/spec/requests/api/graphql/ci/jobs_spec.rb
+++ b/spec/requests/api/graphql/ci/jobs_spec.rb
@@ -155,6 +155,56 @@ RSpec.describe 'Query.project.pipeline' do
end
end
+ describe '.jobs.kind' do
+ let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
+
+ let(:query) do
+ %(
+ query {
+ project(fullPath: "#{project.full_path}") {
+ pipeline(iid: "#{pipeline.iid}") {
+ stages {
+ nodes {
+ groups{
+ nodes {
+ jobs {
+ nodes {
+ kind
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ )
+ end
+
+ context 'when the job is a build' do
+ it 'returns BUILD' do
+ create(:ci_build, pipeline: pipeline)
+
+ post_graphql(query, current_user: user)
+
+ job_data = graphql_data_at(:project, :pipeline, :stages, :nodes, :groups, :nodes, :jobs, :nodes).first
+ expect(job_data['kind']).to eq 'BUILD'
+ end
+ end
+
+ context 'when the job is a bridge' do
+ it 'returns BRIDGE' do
+ create(:ci_bridge, pipeline: pipeline)
+
+ post_graphql(query, current_user: user)
+
+ job_data = graphql_data_at(:project, :pipeline, :stages, :nodes, :groups, :nodes, :jobs, :nodes).first
+ expect(job_data['kind']).to eq 'BRIDGE'
+ end
+ end
+ end
+
describe '.jobs.artifacts' do
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb
index b99a3d14fb9..39f0f696b08 100644
--- a/spec/requests/api/graphql/ci/runner_spec.rb
+++ b/spec/requests/api/graphql/ci/runner_spec.rb
@@ -27,27 +27,18 @@ RSpec.describe 'Query.runner(id)' do
let_it_be(:active_project_runner) { create(:ci_runner, :project) }
- 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
- when :active_project_runner
- active_project_runner
- end
+ before do
+ allow(Gitlab::Ci::RunnerUpgradeCheck.instance).to receive(:check_runner_upgrade_status)
end
- shared_examples 'runner details fetch' do |runner_id|
+ shared_examples 'runner details fetch' do
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 }]
+ [:runner, { id: runner.to_global_id.to_s }]
]
end
@@ -57,7 +48,6 @@ RSpec.describe 'Query.runner(id)' do
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' => runner.to_global_id.to_s,
'description' => runner.description,
@@ -90,14 +80,14 @@ RSpec.describe 'Query.runner(id)' do
end
end
- shared_examples 'retrieval with no admin url' do |runner_id|
+ shared_examples 'retrieval with no admin url' do
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 }]
+ [:runner, { id: runner.to_global_id.to_s }]
]
end
@@ -107,7 +97,6 @@ RSpec.describe 'Query.runner(id)' do
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' => runner.to_global_id.to_s,
'adminUrl' => nil
@@ -116,14 +105,14 @@ RSpec.describe 'Query.runner(id)' do
end
end
- shared_examples 'retrieval by unauthorized user' do |runner_id|
+ shared_examples 'retrieval by unauthorized user' do
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 }]
+ [:runner, { id: runner.to_global_id.to_s }]
]
end
@@ -135,7 +124,9 @@ RSpec.describe 'Query.runner(id)' do
end
describe 'for active runner' do
- it_behaves_like 'runner details fetch', :active_instance_runner
+ let(:runner) { active_instance_runner }
+
+ it_behaves_like 'runner details fetch'
context 'when tagList is not requested' do
let(:query) do
@@ -144,7 +135,7 @@ RSpec.describe 'Query.runner(id)' do
let(:query_path) do
[
- [:runner, { id: active_instance_runner.to_global_id.to_s }]
+ [:runner, { id: runner.to_global_id.to_s }]
]
end
@@ -193,7 +184,9 @@ RSpec.describe 'Query.runner(id)' do
end
describe 'for inactive runner' do
- it_behaves_like 'runner details fetch', :inactive_instance_runner
+ let(:runner) { inactive_instance_runner }
+
+ it_behaves_like 'runner details fetch'
end
describe 'for group runner request' do
@@ -369,15 +362,21 @@ RSpec.describe 'Query.runner(id)' do
let(:user) { create(:user) }
context 'on instance runner' do
- it_behaves_like 'retrieval by unauthorized user', :active_instance_runner
+ let(:runner) { active_instance_runner }
+
+ it_behaves_like 'retrieval by unauthorized user'
end
context 'on group runner' do
- it_behaves_like 'retrieval by unauthorized user', :active_group_runner
+ let(:runner) { active_group_runner }
+
+ it_behaves_like 'retrieval by unauthorized user'
end
context 'on project runner' do
- it_behaves_like 'retrieval by unauthorized user', :active_project_runner
+ let(:runner) { active_project_runner }
+
+ it_behaves_like 'retrieval by unauthorized user'
end
end
@@ -388,13 +387,17 @@ RSpec.describe 'Query.runner(id)' do
group.add_user(user, Gitlab::Access::OWNER)
end
- it_behaves_like 'retrieval with no admin url', :active_group_runner
+ it_behaves_like 'retrieval with no admin url' do
+ let(:runner) { active_group_runner }
+ end
end
describe 'by unauthenticated user' do
let(:user) { nil }
- it_behaves_like 'retrieval by unauthorized user', :active_instance_runner
+ it_behaves_like 'retrieval by unauthorized user' do
+ let(:runner) { active_instance_runner }
+ end
end
describe 'Query limits' do
diff --git a/spec/requests/api/graphql/ci/runners_spec.rb b/spec/requests/api/graphql/ci/runners_spec.rb
index 267dd1b5e6f..6b88c82b025 100644
--- a/spec/requests/api/graphql/ci/runners_spec.rb
+++ b/spec/requests/api/graphql/ci/runners_spec.rb
@@ -34,6 +34,8 @@ RSpec.describe 'Query.runners' do
end
before do
+ allow(Gitlab::Ci::RunnerUpgradeCheck.instance).to receive(:check_runner_upgrade_status)
+
post_graphql(query, current_user: current_user)
end
diff --git a/spec/requests/api/graphql/mutations/boards/create_spec.rb b/spec/requests/api/graphql/mutations/boards/create_spec.rb
index 22d05f36f0f..ca848c0c92f 100644
--- a/spec/requests/api/graphql/mutations/boards/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/boards/create_spec.rb
@@ -4,6 +4,16 @@ require 'spec_helper'
RSpec.describe Mutations::Boards::Create do
let_it_be(:parent) { create(:project) }
+ let_it_be(:current_user, reload: true) { create(:user) }
+
+ let(:name) { 'board name' }
+ let(:mutation) { graphql_mutation(:create_board, params) }
+
+ subject { post_graphql_mutation(mutation, current_user: current_user) }
+
+ def mutation_response
+ graphql_mutation_response(:create_board)
+ end
let(:project_path) { parent.full_path }
let(:params) do
diff --git a/spec/requests/api/graphql/mutations/ci/job_retry_spec.rb b/spec/requests/api/graphql/mutations/ci/job_retry_spec.rb
index a14935379dc..ef640183bd8 100644
--- a/spec/requests/api/graphql/mutations/ci/job_retry_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/job_retry_spec.rb
@@ -8,7 +8,8 @@ RSpec.describe 'JobRetry' do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project, user: user) }
- let_it_be(:job) { create(:ci_build, :success, pipeline: pipeline, name: 'build') }
+
+ let(:job) { create(:ci_build, :success, pipeline: pipeline, name: 'build') }
let(:mutation) do
variables = {
@@ -37,10 +38,23 @@ RSpec.describe 'JobRetry' do
end
it 'retries a job' do
- job_id = ::Gitlab::GlobalId.build(job, id: job.id).to_s
post_graphql_mutation(mutation, current_user: user)
expect(response).to have_gitlab_http_status(:success)
- expect(mutation_response['job']['id']).to eq(job_id)
+ new_job_id = GitlabSchema.object_from_id(mutation_response['job']['id']).sync.id
+
+ new_job = ::Ci::Build.find(new_job_id)
+ expect(new_job).not_to be_retried
+ end
+
+ context 'when the job is not retryable' do
+ let(:job) { create(:ci_build, :retried, pipeline: pipeline) }
+
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(mutation_response['job']).to be(nil)
+ expect(mutation_response['errors']).to match_array(['Job cannot be retried'])
+ end
end
end
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_cancel_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_cancel_spec.rb
index a20ac823550..d9106aa42c4 100644
--- a/spec/requests/api/graphql/mutations/ci/pipeline_cancel_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/pipeline_cancel_spec.rb
@@ -47,5 +47,6 @@ RSpec.describe 'PipelineCancel' do
expect(response).to have_gitlab_http_status(:success)
expect(build.reload).to be_canceled
+ expect(pipeline.reload).to be_canceled
end
end
diff --git a/spec/requests/api/graphql/mutations/issues/update_spec.rb b/spec/requests/api/graphql/mutations/issues/update_spec.rb
index 0f2eeb90894..f38deb426b1 100644
--- a/spec/requests/api/graphql/mutations/issues/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/issues/update_spec.rb
@@ -8,8 +8,8 @@ RSpec.describe 'Update of an existing issue' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
- let_it_be(:label1) { create(:label, project: project) }
- let_it_be(:label2) { create(:label, project: project) }
+ let_it_be(:label1) { create(:label, title: "a", project: project) }
+ let_it_be(:label2) { create(:label, title: "b", project: project) }
let(:input) do
{
@@ -124,7 +124,7 @@ RSpec.describe 'Update of an existing issue' do
context 'add and remove labels' do
let(:input_params) { input.merge(extra_params).merge({ addLabelIds: [label1.id], removeLabelIds: [label2.id] }) }
- it 'returns error for mutually exclusive arguments' do
+ it 'returns correct labels' do
post_graphql_mutation(mutation, current_user: current_user)
expect(response).to have_gitlab_http_status(:success)
@@ -132,6 +132,22 @@ RSpec.describe 'Update of an existing issue' do
expect(mutation_response['issue']['labels']).to include({ "nodes" => [{ "id" => label1.to_global_id.to_s }] })
end
end
+
+ context 'add labels' do
+ let(:input_params) { input.merge(extra_params).merge({ addLabelIds: [label1.id] }) }
+
+ before do
+ issue.update!({ labels: [label2] })
+ end
+
+ it 'adds labels and keeps the title ordering' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(json_response['errors']).to be_nil
+ expect(mutation_response['issue']['labels']['nodes']).to eq([{ "id" => label1.to_global_id.to_s }, { "id" => label2.to_global_id.to_s }])
+ end
+ end
end
end
end
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_labels_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_labels_spec.rb
index 0d0cc66c52a..e40a3cf7ce9 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/set_labels_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_labels_spec.rb
@@ -8,8 +8,8 @@ RSpec.describe 'Setting labels of a merge request' do
let(:current_user) { create(:user) }
let(:merge_request) { create(:merge_request) }
let(:project) { merge_request.project }
- let(:label) { create(:label, project: project) }
- let(:label2) { create(:label, project: project) }
+ let(:label) { create(:label, title: "a", project: project) }
+ let(:label2) { create(:label, title: "b", project: project) }
let(:input) { { label_ids: [GitlabSchema.id_from_object(label).to_s] } }
let(:mutation) do
@@ -81,12 +81,12 @@ RSpec.describe 'Setting labels of a merge request' do
merge_request.update!(labels: [label2])
end
- it 'sets the labels, without removing others' do
+ it 'sets the labels and resets labels to keep the title ordering, without removing others' do
post_graphql_mutation(mutation, current_user: current_user)
expect(response).to have_gitlab_http_status(:success)
expect(mutation_label_nodes.count).to eq(2)
- expect(mutation_label_nodes).to contain_exactly({ 'id' => label.to_global_id.to_s }, { 'id' => label2.to_global_id.to_s })
+ expect(mutation_label_nodes).to eq([{ 'id' => label.to_global_id.to_s }, { 'id' => label2.to_global_id.to_s }])
end
end
diff --git a/spec/requests/api/graphql/mutations/notes/create/note_spec.rb b/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
index 2bc671e4ca5..63b94dccca0 100644
--- a/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
@@ -17,8 +17,7 @@ RSpec.describe 'Adding a Note' do
noteable_id: GitlabSchema.id_from_object(noteable).to_s,
discussion_id: (GitlabSchema.id_from_object(discussion).to_s if discussion),
merge_request_diff_head_sha: head_sha.presence,
- body: body,
- confidential: true
+ body: body
}
graphql_mutation(:create_note, variables)
@@ -49,7 +48,6 @@ RSpec.describe 'Adding a Note' do
post_graphql_mutation(mutation, current_user: current_user)
expect(mutation_response['note']['body']).to eq('Body text')
- expect(mutation_response['note']['confidential']).to eq(true)
end
describe 'creating Notes in reply to a discussion' do
@@ -79,6 +77,25 @@ RSpec.describe 'Adding a Note' do
end
end
+ context 'for an issue' do
+ let(:noteable) { create(:issue, project: project) }
+ let(:mutation) do
+ variables = {
+ noteable_id: GitlabSchema.id_from_object(noteable).to_s,
+ body: body,
+ confidential: true
+ }
+
+ graphql_mutation(:create_note, variables)
+ end
+
+ before do
+ project.add_developer(current_user)
+ end
+
+ it_behaves_like 'a Note mutation with confidential notes'
+ end
+
context 'when body only contains quick actions' do
let(:head_sha) { noteable.diff_head_sha }
let(:body) { '/merge' }
diff --git a/spec/requests/api/graphql/mutations/notes/update/note_spec.rb b/spec/requests/api/graphql/mutations/notes/update/note_spec.rb
index 5a92ffe61b8..bae5c58abff 100644
--- a/spec/requests/api/graphql/mutations/notes/update/note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/update/note_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe 'Updating a Note' do
let!(:note) { create(:note, note: original_body) }
let(:original_body) { 'Initial body text' }
let(:updated_body) { 'Updated body text' }
- let(:params) { { body: updated_body, confidential: true } }
+ let(:params) { { body: updated_body } }
let(:mutation) do
variables = params.merge(id: GitlabSchema.id_from_object(note).to_s)
@@ -28,7 +28,6 @@ RSpec.describe 'Updating a Note' do
post_graphql_mutation(mutation, current_user: current_user)
expect(note.reload.note).to eq(original_body)
- expect(note.confidential).to be_falsey
end
end
@@ -41,46 +40,19 @@ RSpec.describe 'Updating a Note' do
post_graphql_mutation(mutation, current_user: current_user)
expect(note.reload.note).to eq(updated_body)
- expect(note.confidential).to be_truthy
end
it 'returns the updated Note' do
post_graphql_mutation(mutation, current_user: current_user)
expect(mutation_response['note']['body']).to eq(updated_body)
- expect(mutation_response['note']['confidential']).to be_truthy
- end
-
- context 'when only confidential param is present' do
- let(:params) { { confidential: true } }
-
- it 'updates only the note confidentiality' do
- post_graphql_mutation(mutation, current_user: current_user)
-
- expect(note.reload.note).to eq(original_body)
- expect(note.confidential).to be_truthy
- end
- end
-
- context 'when only body param is present' do
- let(:params) { { body: updated_body } }
-
- before do
- note.update_column(:confidential, true)
- end
-
- it 'updates only the note body' do
- post_graphql_mutation(mutation, current_user: current_user)
-
- expect(note.reload.note).to eq(updated_body)
- expect(note.confidential).to be_truthy
- end
end
context 'when there are ActiveRecord validation errors' do
- let(:updated_body) { '' }
+ let(:params) { { body: '', confidential: true } }
- it_behaves_like 'a mutation that returns errors in the response', errors: ["Note can't be blank"]
+ it_behaves_like 'a mutation that returns errors in the response',
+ errors: ["Note can't be blank", 'Confidential can not be changed for existing notes']
it 'does not update the Note' do
post_graphql_mutation(mutation, current_user: current_user)
diff --git a/spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb b/spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb
index 9ac98db91e2..c5c34e16717 100644
--- a/spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb
+++ b/spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb
@@ -50,6 +50,37 @@ RSpec.describe 'Marking all todos done' do
expect(updated_todo_ids).to contain_exactly(global_id_of(todo1), global_id_of(todo3))
end
+ context 'when target_id is given', :aggregate_failures do
+ let_it_be(:target) { create(:issue, project: project) }
+ let_it_be(:target_todo1) { create(:todo, user: current_user, author: author, state: :pending, target: target) }
+ let_it_be(:target_todo2) { create(:todo, user: current_user, author: author, state: :pending, target: target) }
+
+ let(:input) { { 'targetId' => target.to_global_id.to_s } }
+
+ it 'marks all pending todos for the target as done' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(target_todo1.reload.state).to eq('done')
+ expect(target_todo2.reload.state).to eq('done')
+
+ expect(todo1.reload.state).to eq('pending')
+ expect(todo3.reload.state).to eq('pending')
+
+ updated_todo_ids = mutation_response['todos'].map { |todo| todo['id'] }
+ expect(updated_todo_ids).to contain_exactly(global_id_of(target_todo1), global_id_of(target_todo2))
+ end
+
+ context 'when target does not exist' do
+ let(:input) { { 'targetId' => "gid://gitlab/Issue/#{non_existing_record_id}" } }
+
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(graphql_errors).to include(a_hash_including('message' => include('Resource not available')))
+ end
+ end
+ end
+
it 'behaves as expected if there are no todos for the requesting user' do
post_graphql_mutation(mutation, current_user: other_user2)
diff --git a/spec/requests/api/graphql/mutations/user_preferences/update_spec.rb b/spec/requests/api/graphql/mutations/user_preferences/update_spec.rb
index e1c7fd9d60d..85194e6eb20 100644
--- a/spec/requests/api/graphql/mutations/user_preferences/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/user_preferences/update_spec.rb
@@ -28,6 +28,17 @@ RSpec.describe Mutations::UserPreferences::Update do
expect(current_user.user_preference.persisted?).to eq(true)
expect(current_user.user_preference.issues_sort).to eq(Types::IssueSortEnum.values[sort_value].value.to_s)
end
+
+ context 'when incident_escalations feature flag is disabled' do
+ let(:sort_value) { 'ESCALATION_STATUS_ASC' }
+
+ before do
+ stub_feature_flags(incident_escalations: false)
+ end
+
+ it_behaves_like 'a mutation that returns top-level errors',
+ errors: ['Feature flag `incident_escalations` must be enabled to use this sort order.']
+ end
end
context 'when user has existing preference' do
@@ -45,5 +56,16 @@ RSpec.describe Mutations::UserPreferences::Update do
expect(current_user.user_preference.issues_sort).to eq(Types::IssueSortEnum.values[sort_value].value.to_s)
end
+
+ context 'when incident_escalations feature flag is disabled' do
+ let(:sort_value) { 'ESCALATION_STATUS_DESC' }
+
+ before do
+ stub_feature_flags(incident_escalations: false)
+ end
+
+ it_behaves_like 'a mutation that returns top-level errors',
+ errors: ['Feature flag `incident_escalations` must be enabled to use this sort order.']
+ end
end
end
diff --git a/spec/requests/api/graphql_spec.rb b/spec/requests/api/graphql_spec.rb
index da0c87fcefe..3bd59450d49 100644
--- a/spec/requests/api/graphql_spec.rb
+++ b/spec/requests/api/graphql_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'GraphQL' do
let(:expected_execute_query_log) do
{
"correlation_id" => kind_of(String),
- "meta.caller_id" => "graphql:anonymous",
+ "meta.caller_id" => "graphql:unknown",
"meta.client_id" => kind_of(String),
"meta.feature_category" => "not_owned",
"meta.remote_ip" => kind_of(String),
diff --git a/spec/requests/api/group_export_spec.rb b/spec/requests/api/group_export_spec.rb
index 31eef21654a..ffa313d4464 100644
--- a/spec/requests/api/group_export_spec.rb
+++ b/spec/requests/api/group_export_spec.rb
@@ -30,76 +30,62 @@ RSpec.describe API::GroupExport do
group.add_owner(user)
end
- context 'group_import_export feature flag enabled' do
+ context 'when export file exists' do
before do
- stub_feature_flags(group_import_export: true)
-
allow(Gitlab::ApplicationRateLimiter)
.to receive(:increment)
.and_return(0)
- end
-
- context 'when export file exists' do
- before do
- upload.export_file = fixture_file_upload('spec/fixtures/group_export.tar.gz', "`/tar.gz")
- upload.save!
- end
- it 'downloads exported group archive' do
- get api(download_path, user)
-
- expect(response).to have_gitlab_http_status(:ok)
- end
+ upload.export_file = fixture_file_upload('spec/fixtures/group_export.tar.gz', "`/tar.gz")
+ upload.save!
+ end
- context 'when export_file.file does not exist' do
- before do
- expect_next_instance_of(ImportExportUploader) do |uploader|
- expect(uploader).to receive(:file).and_return(nil)
- end
- end
+ it 'downloads exported group archive' do
+ get api(download_path, user)
- it 'returns 404' do
- get api(download_path, user)
+ expect(response).to have_gitlab_http_status(:ok)
+ end
- expect(response).to have_gitlab_http_status(:not_found)
+ context 'when export_file.file does not exist' do
+ before do
+ expect_next_instance_of(ImportExportUploader) do |uploader|
+ expect(uploader).to receive(:file).and_return(nil)
end
end
- context 'when object is not present' do
- let(:other_group) { create(:group, :with_export) }
- let(:other_download_path) { "/groups/#{other_group.id}/export/download" }
+ it 'returns 404' do
+ get api(download_path, user)
- before do
- other_group.add_owner(user)
- other_group.export_file.file.delete
- end
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
- it 'returns 404' do
- get api(other_download_path, user)
+ context 'when object is not present' do
+ let(:other_group) { create(:group, :with_export) }
+ let(:other_download_path) { "/groups/#{other_group.id}/export/download" }
- expect(response).to have_gitlab_http_status(:not_found)
- expect(json_response['message']).to eq('The group export file is not available yet')
- end
+ before do
+ other_group.add_owner(user)
+ other_group.export_file.file.delete
end
- end
- context 'when export file does not exist' do
it 'returns 404' do
- get api(download_path, user)
+ get api(other_download_path, user)
expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('The group export file is not available yet')
end
end
end
- context 'group_import_export feature flag disabled' do
- before do
- stub_feature_flags(group_import_export: false)
- end
-
- it 'responds with 404 Not Found' do
+ context 'when export file does not exist' do
+ it 'returns 404' do
get api(download_path, user)
+ allow(Gitlab::ApplicationRateLimiter)
+ .to receive(:increment)
+ .and_return(0)
+
expect(response).to have_gitlab_http_status(:not_found)
end
end
@@ -122,58 +108,40 @@ RSpec.describe API::GroupExport do
end
describe 'POST /groups/:group_id/export' do
- context 'group_import_export feature flag enabled' do
+ context 'when user is a group owner' do
before do
- stub_feature_flags(group_import_export: true)
+ group.add_owner(user)
end
- context 'when user is a group owner' do
- before do
- group.add_owner(user)
- end
-
- it 'accepts download' do
- post api(path, user)
+ it 'accepts download' do
+ post api(path, user)
- expect(response).to have_gitlab_http_status(:accepted)
- end
+ expect(response).to have_gitlab_http_status(:accepted)
end
+ end
- context 'when the export cannot be started' do
- before do
- group.add_owner(user)
- allow(GroupExportWorker).to receive(:perform_async).and_return(nil)
- end
-
- it 'returns an error' do
- post api(path, user)
-
- expect(response).to have_gitlab_http_status(:error)
- end
+ context 'when the export cannot be started' do
+ before do
+ group.add_owner(user)
+ allow(GroupExportWorker).to receive(:perform_async).and_return(nil)
end
- context 'when user is not a group owner' do
- before do
- group.add_developer(user)
- end
-
- it 'forbids the request' do
- post api(path, user)
+ it 'returns an error' do
+ post api(path, user)
- expect(response).to have_gitlab_http_status(:forbidden)
- end
+ expect(response).to have_gitlab_http_status(:error)
end
end
- context 'group_import_export feature flag disabled' do
+ context 'when user is not a group owner' do
before do
- stub_feature_flags(group_import_export: false)
+ group.add_developer(user)
end
- it 'responds with 404 Not Found' do
+ it 'forbids the request' do
post api(path, user)
- expect(response).to have_gitlab_http_status(:not_found)
+ expect(response).to have_gitlab_http_status(:forbidden)
end
end
@@ -202,7 +170,6 @@ RSpec.describe API::GroupExport do
let(:status_path) { "/groups/#{group.id}/export_relations/status" }
before do
- stub_feature_flags(group_import_export: true)
group.add_owner(user)
end
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 7de3567dcdd..ffc5d353958 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -1164,17 +1164,47 @@ RSpec.describe API::Groups do
end
context 'when include_subgroups is true' do
- it "returns projects including those in subgroups" do
+ before do
subgroup = create(:group, parent: group1)
+ subgroup2 = create(:group, parent: subgroup)
+
create(:project, group: subgroup)
create(:project, group: subgroup)
+ create(:project, group: subgroup2)
+
+ group1.reload
+ end
+
+ it "only looks up root ancestor once and returns projects including those in subgroups" do
+ expect(Namespace).to receive(:find_by).with(id: group1.id.to_s).once.and_call_original # For the group sent in the API call
+ expect(Namespace).to receive(:find_by).with(id: group1.traversal_ids.first).once.and_call_original # root_ancestor direct lookup
+ expect(Namespace).to receive(:joins).with(start_with('INNER JOIN (SELECT id, traversal_ids[1]')).once.and_call_original # All-in-one root_ancestor query
get api("/groups/#{group1.id}/projects", user1), params: { include_subgroups: true }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(json_response).to be_an(Array)
- expect(json_response.length).to eq(5)
+ expect(json_response.length).to eq(6)
+ end
+
+ context 'when group_projects_api_preload_groups feature is disabled' do
+ before do
+ stub_feature_flags(group_projects_api_preload_groups: false)
+ end
+
+ it 'looks up the root ancestor multiple times' do
+ expect(Namespace).to receive(:find_by).with(id: group1.id.to_s).once.and_call_original
+ expect(Namespace).to receive(:find_by).with(id: group1.traversal_ids.first).at_least(:twice).and_call_original
+ expect(Namespace).not_to receive(:joins).with(start_with('INNER JOIN (SELECT id, traversal_ids[1]'))
+
+ get api("/groups/#{group1.id}/projects", user1), params: { include_subgroups: true }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an(Array)
+ expect(json_response.length).to eq(6)
+ end
end
end
diff --git a/spec/requests/api/integrations_spec.rb b/spec/requests/api/integrations_spec.rb
index 220c58afbe9..96cc101e73a 100644
--- a/spec/requests/api/integrations_spec.rb
+++ b/spec/requests/api/integrations_spec.rb
@@ -55,7 +55,7 @@ RSpec.describe API::Integrations do
describe "PUT /projects/:id/#{endpoint}/#{integration.dasherize}" do
include_context integration
- it "updates #{integration} settings" do
+ it "updates #{integration} settings and returns the correct fields" do
put api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}", user), params: integration_attrs
expect(response).to have_gitlab_http_status(:ok)
@@ -80,6 +80,8 @@ RSpec.describe API::Integrations do
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
+
+ assert_correct_response_fields(json_response['properties'].keys, current_integration)
end
it "returns if required fields missing" do
@@ -142,22 +144,24 @@ RSpec.describe API::Integrations do
expect(response).to have_gitlab_http_status(:unauthorized)
end
- it "returns all properties of active integration #{integration}" do
+ it "returns all properties of active integration #{integration}, except password fields" 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)
+
+ assert_correct_response_fields(json_response['properties'].keys, integration_instance)
end
- it "returns all properties of inactive integration #{integration}" do
+ it "returns all properties of inactive integration #{integration}, except password fields" 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)
+
+ assert_correct_response_fields(json_response['properties'].keys, integration_instance)
end
it "returns not found if integration does not exist" do
@@ -369,5 +373,20 @@ RSpec.describe API::Integrations do
end
end
end
+
+ private
+
+ def assert_correct_response_fields(response_keys, integration)
+ assert_fields_match_integration(response_keys, integration)
+ assert_secret_fields_filtered(response_keys, integration)
+ end
+
+ def assert_fields_match_integration(response_keys, integration)
+ expect(response_keys).to match_array(integration.api_field_names)
+ end
+
+ def assert_secret_fields_filtered(response_keys, integration)
+ expect(response_keys).not_to include(*integration.secret_fields)
+ end
end
end
diff --git a/spec/requests/api/internal/container_registry/migration_spec.rb b/spec/requests/api/internal/container_registry/migration_spec.rb
index 27e99a21c65..35113c66f11 100644
--- a/spec/requests/api/internal/container_registry/migration_spec.rb
+++ b/spec/requests/api/internal/container_registry/migration_spec.rb
@@ -67,12 +67,17 @@ RSpec.describe API::Internal::ContainerRegistry::Migration do
it_behaves_like 'returning an error', with_message: "Couldn't transition from pre_importing to importing"
end
- end
- context 'with repository in importing migration state' do
- let(:repository) { create(:container_repository, :importing) }
+ context 'with repository in importing migration state' do
+ let(:repository) { create(:container_repository, :importing) }
+
+ it 'returns ok and does not update the migration state' do
+ expect { subject }
+ .not_to change { repository.reload.migration_state }
- it_behaves_like 'returning an error', with_message: "Couldn't transition from pre_importing to importing"
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
end
end
@@ -101,7 +106,7 @@ RSpec.describe API::Internal::ContainerRegistry::Migration do
context 'with repository in pre_importing migration state' do
let(:repository) { create(:container_repository, :pre_importing) }
- it_behaves_like 'returning an error', with_message: "Couldn't transition from importing to import_done"
+ it_behaves_like 'updating the repository migration status', from: 'pre_importing', to: 'import_done'
end
end
diff --git a/spec/requests/api/invitations_spec.rb b/spec/requests/api/invitations_spec.rb
index 741cf793a77..d093894720e 100644
--- a/spec/requests/api/invitations_spec.rb
+++ b/spec/requests/api/invitations_spec.rb
@@ -69,7 +69,7 @@ RSpec.describe API::Invitations do
end
end
- it 'invites a new member' do
+ it 'adds a new member by email' do
expect do
post invitations_url(source, maintainer),
params: { email: email, access_level: Member::DEVELOPER }
@@ -78,6 +78,24 @@ RSpec.describe API::Invitations do
end.to change { source.members.invite.count }.by(1)
end
+ it 'adds a new member by user_id' do
+ expect do
+ post invitations_url(source, maintainer),
+ params: { user_id: stranger.id, access_level: Member::DEVELOPER }
+
+ expect(response).to have_gitlab_http_status(:created)
+ end.to change { source.members.non_invite.count }.by(1)
+ end
+
+ it 'adds new members with email and user_id' do
+ expect do
+ post invitations_url(source, maintainer),
+ params: { email: email, user_id: stranger.id, access_level: Member::DEVELOPER }
+
+ expect(response).to have_gitlab_http_status(:created)
+ end.to change { source.members.invite.count }.by(1).and change { source.members.non_invite.count }.by(1)
+ end
+
it 'invites a list of new email addresses' do
expect do
email_list = [email, email2].join(',')
@@ -88,6 +106,19 @@ RSpec.describe API::Invitations do
expect(response).to have_gitlab_http_status(:created)
end.to change { source.members.invite.count }.by(2)
end
+
+ it 'invites a list of new email addresses and user ids' do
+ expect do
+ stranger2 = create(:user)
+ email_list = [email, email2].join(',')
+ user_id_list = "#{stranger.id},#{stranger2.id}"
+
+ post invitations_url(source, maintainer),
+ params: { email: email_list, user_id: user_id_list, access_level: Member::DEVELOPER }
+
+ expect(response).to have_gitlab_http_status(:created)
+ end.to change { source.members.invite.count }.by(2).and change { source.members.non_invite.count }.by(2)
+ end
end
context 'access levels' do
@@ -235,27 +266,36 @@ RSpec.describe API::Invitations do
expect(json_response['message'][developer.email]).to eq("User already exists in source")
end
- it 'returns 404 when the email is not valid' do
+ it 'returns 400 when the invite params of email and user_id are not sent' do
+ post invitations_url(source, maintainer),
+ params: { access_level: Member::MAINTAINER }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('400 Bad request - Must provide either email or user_id as a parameter')
+ end
+
+ it 'returns 400 when the email is blank' do
post invitations_url(source, maintainer),
params: { email: '', access_level: Member::MAINTAINER }
- expect(response).to have_gitlab_http_status(:created)
- expect(json_response['message']).to eq('Emails cannot be blank')
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('400 Bad request - Must provide either email or user_id as a parameter')
end
- it 'returns 404 when the email list is not a valid format' do
+ it 'returns 400 when the user_id is blank' do
post invitations_url(source, maintainer),
- params: { email: 'email1@example.com,not-an-email', access_level: Member::MAINTAINER }
+ params: { user_id: '', access_level: Member::MAINTAINER }
expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to eq('email contains an invalid email address')
+ expect(json_response['message']).to eq('400 Bad request - Must provide either email or user_id as a parameter')
end
- it 'returns 400 when email is not given' do
+ it 'returns 400 when the email list is not a valid format' do
post invitations_url(source, maintainer),
- params: { access_level: Member::MAINTAINER }
+ params: { email: 'email1@example.com,not-an-email', access_level: Member::MAINTAINER }
expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('email contains an invalid email address')
end
it 'returns 400 when access_level is not given' do
@@ -278,12 +318,90 @@ RSpec.describe API::Invitations do
it_behaves_like 'POST /:source_type/:id/invitations', 'project' do
let(:source) { project }
end
+
+ it 'records queries', :request_store, :use_sql_query_cache do
+ post invitations_url(project, maintainer), params: { email: email, access_level: Member::DEVELOPER }
+
+ control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ post invitations_url(project, maintainer), params: { email: email2, access_level: Member::DEVELOPER }
+ end
+
+ emails = 'email3@example.com,email4@example.com,email5@example.com,email6@example.com,email7@example.com'
+
+ unresolved_n_plus_ones = 44 # old 48 with 12 per new email, currently there are 11 queries added per email
+
+ expect do
+ post invitations_url(project, maintainer), params: { email: emails, access_level: Member::DEVELOPER }
+ end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones)
+ end
+
+ it 'records queries with secondary emails', :request_store, :use_sql_query_cache do
+ create(:email, email: email, user: create(:user))
+
+ post invitations_url(project, maintainer), params: { email: email, access_level: Member::DEVELOPER }
+
+ create(:email, email: email2, user: create(:user))
+
+ control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ post invitations_url(project, maintainer), params: { email: email2, access_level: Member::DEVELOPER }
+ end
+
+ create(:email, email: 'email4@example.com', user: create(:user))
+ create(:email, email: 'email6@example.com', user: create(:user))
+
+ emails = 'email3@example.com,email4@example.com,email5@example.com,email6@example.com,email7@example.com'
+
+ unresolved_n_plus_ones = 67 # currently there are 11 queries added per email
+
+ expect do
+ post invitations_url(project, maintainer), params: { email: emails, access_level: Member::DEVELOPER }
+ end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones)
+ end
end
describe 'POST /groups/:id/invitations' do
it_behaves_like 'POST /:source_type/:id/invitations', 'group' do
let(:source) { group }
end
+
+ it 'records queries', :request_store, :use_sql_query_cache do
+ post invitations_url(group, maintainer), params: { email: email, access_level: Member::DEVELOPER }
+
+ control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ post invitations_url(group, maintainer), params: { email: email2, access_level: Member::DEVELOPER }
+ end
+
+ emails = 'email3@example.com,email4@example.com,email5@example.com,email6@example.com,email7@example.com'
+
+ unresolved_n_plus_ones = 36 # old 40 with 10 per new email, currently there are 9 queries added per email
+
+ expect do
+ post invitations_url(group, maintainer), params: { email: emails, access_level: Member::DEVELOPER }
+ end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones)
+ end
+
+ it 'records queries with secondary emails', :request_store, :use_sql_query_cache do
+ create(:email, email: email, user: create(:user))
+
+ post invitations_url(group, maintainer), params: { email: email, access_level: Member::DEVELOPER }
+
+ create(:email, email: email2, user: create(:user))
+
+ control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ post invitations_url(group, maintainer), params: { email: email2, access_level: Member::DEVELOPER }
+ end
+
+ create(:email, email: 'email4@example.com', user: create(:user))
+ create(:email, email: 'email6@example.com', user: create(:user))
+
+ emails = 'email3@example.com,email4@example.com,email5@example.com,email6@example.com,email7@example.com'
+
+ unresolved_n_plus_ones = 62 # currently there are 9 queries added per email
+
+ expect do
+ post invitations_url(group, maintainer), params: { email: emails, access_level: Member::DEVELOPER }
+ end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones)
+ end
end
shared_examples 'GET /:source_type/:id/invitations' do |source_type|
@@ -315,23 +433,6 @@ RSpec.describe API::Invitations do
end
end
- it 'avoids N+1 queries' do
- invite_member_by_email(source, source_type, email, maintainer)
-
- # Establish baseline
- get invitations_url(source, maintainer)
-
- control = ActiveRecord::QueryRecorder.new do
- get invitations_url(source, maintainer)
- end
-
- invite_member_by_email(source, source_type, email2, maintainer)
-
- expect do
- get invitations_url(source, maintainer)
- end.not_to exceed_query_limit(control)
- end
-
it 'does not find confirmed members' do
get invitations_url(source, maintainer)
diff --git a/spec/requests/api/issue_links_spec.rb b/spec/requests/api/issue_links_spec.rb
index 45583f5c7dc..81dd4c3dfa0 100644
--- a/spec/requests/api/issue_links_spec.rb
+++ b/spec/requests/api/issue_links_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe API::IssueLinks do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Array
expect(json_response.length).to eq(2)
- expect(response).to match_response_schema('public_api/v4/issue_links')
+ expect(response).to match_response_schema('public_api/v4/related_issues')
end
it 'returns multiple links without N + 1' do
@@ -205,16 +205,30 @@ RSpec.describe API::IssueLinks do
end
context 'when user has ability to delete the issue link' do
+ let_it_be(:target_issue) { create(:issue, project: project) }
+
+ before do
+ project.add_reporter(user)
+ end
+
it 'returns 200' do
- target_issue = create(:issue, project: project)
issue_link = create(:issue_link, source: issue, target: target_issue)
- project.add_reporter(user)
delete api("/projects/#{project.id}/issues/#{issue.iid}/links/#{issue_link.id}", user)
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('public_api/v4/issue_link')
end
+
+ it 'returns 404 when the issue link does not belong to the specified issue' do
+ other_issue = create(:issue, project: project)
+ issue_link = create(:issue_link, source: other_issue, target: target_issue)
+
+ delete api("/projects/#{project.id}/issues/#{issue.iid}/links/#{issue_link.id}", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Not found')
+ end
end
end
end
diff --git a/spec/requests/api/issues/get_project_issues_spec.rb b/spec/requests/api/issues/get_project_issues_spec.rb
index 9948e13e9ae..346f8975835 100644
--- a/spec/requests/api/issues/get_project_issues_spec.rb
+++ b/spec/requests/api/issues/get_project_issues_spec.rb
@@ -877,5 +877,35 @@ RSpec.describe API::Issues do
expect(response).to have_gitlab_http_status(:not_found)
end
+
+ context 'with a confidential note' do
+ let!(:note) do
+ create(
+ :note,
+ :confidential,
+ project: project,
+ noteable: issue,
+ author: create(:user)
+ )
+ end
+
+ it 'returns a full list of participants' do
+ get api("/projects/#{project.id}/issues/#{issue.iid}/participants", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ participant_ids = json_response.map { |el| el['id'] }
+ expect(participant_ids).to match_array([issue.author_id, note.author_id])
+ end
+
+ context 'when user cannot see a confidential note' do
+ it 'returns a limited list of participants' do
+ get api("/projects/#{project.id}/issues/#{issue.iid}/participants", create(:user))
+
+ expect(response).to have_gitlab_http_status(:ok)
+ participant_ids = json_response.map { |el| el['id'] }
+ expect(participant_ids).to match_array([issue.author_id])
+ end
+ end
+ end
end
end
diff --git a/spec/requests/api/issues/issues_spec.rb b/spec/requests/api/issues/issues_spec.rb
index c5e57b5b18b..1419d39981a 100644
--- a/spec/requests/api/issues/issues_spec.rb
+++ b/spec/requests/api/issues/issues_spec.rb
@@ -554,6 +554,27 @@ RSpec.describe API::Issues do
end
end
+ context 'with incident issues' do
+ let_it_be(:incident) { create(:incident, project: project) }
+
+ it 'avoids N+1 queries' do
+ get api('/issues', user) # warm up
+
+ control = ActiveRecord::QueryRecorder.new do
+ get api('/issues', user)
+ end
+
+ create(:incident, project: project)
+ create(:incident, project: project)
+
+ expect do
+ get api('/issues', user)
+ end.not_to exceed_query_limit(control)
+ # 2 pre-existed issues + 3 incidents
+ expect(json_response.count).to eq(5)
+ end
+ end
+
context 'filter by labels or label_name param' do
context 'N+1' do
let(:label_b) { create(:label, title: 'foo', project: project) }
diff --git a/spec/requests/api/keys_spec.rb b/spec/requests/api/keys_spec.rb
index 49b8f4a8520..67c3de324dc 100644
--- a/spec/requests/api/keys_spec.rb
+++ b/spec/requests/api/keys_spec.rb
@@ -3,10 +3,11 @@
require 'spec_helper'
RSpec.describe API::Keys do
- let(:user) { create(:user) }
- let(:admin) { create(:admin) }
- let(:key) { create(:key, user: user, expires_at: 1.day.from_now) }
- let(:email) { create(:email, user: user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:email) { create(:email, user: user) }
+ let_it_be(:key) { create(:rsa_key_4096, user: user, expires_at: 1.day.from_now) }
+ let_it_be(:fingerprint_md5) { 'df:73:db:29:3c:a5:32:cf:09:17:7e:8e:9d:de:d7:f7' }
describe 'GET /keys/:uid' do
context 'when unauthenticated' do
@@ -24,7 +25,6 @@ RSpec.describe API::Keys do
end
it 'returns single ssh key with user information' do
- user.keys << key
get api("/keys/#{key.id}", admin)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['title']).to eq(key.title)
@@ -43,23 +43,50 @@ RSpec.describe API::Keys do
describe 'GET /keys?fingerprint=' do
it 'returns authentication error' do
- get api("/keys?fingerprint=#{key.fingerprint}")
+ get api("/keys?fingerprint=#{fingerprint_md5}")
expect(response).to have_gitlab_http_status(:unauthorized)
end
it 'returns authentication error when authenticated as user' do
- get api("/keys?fingerprint=#{key.fingerprint}", user)
+ get api("/keys?fingerprint=#{fingerprint_md5}", user)
expect(response).to have_gitlab_http_status(:forbidden)
end
context 'when authenticated as admin' do
- it 'returns 404 for non-existing SSH md5 fingerprint' do
- get api("/keys?fingerprint=11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11", admin)
+ context 'MD5 fingerprint' do
+ it 'returns 404 for non-existing SSH md5 fingerprint' do
+ get api("/keys?fingerprint=11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11", admin)
- expect(response).to have_gitlab_http_status(:not_found)
- expect(json_response['message']).to eq('404 Key Not Found')
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Key Not Found')
+ end
+
+ it 'returns user if SSH md5 fingerprint found' do
+ get api("/keys?fingerprint=#{fingerprint_md5}", admin)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['title']).to eq(key.title)
+ expect(json_response['user']['id']).to eq(user.id)
+ expect(json_response['user']['username']).to eq(user.username)
+ end
+
+ context 'with FIPS mode', :fips_mode do
+ it 'returns 404 for non-existing SSH md5 fingerprint' do
+ get api("/keys?fingerprint=11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11", admin)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('Failed to return the key')
+ end
+
+ it 'returns 404 for existing SSH md5 fingerprint' do
+ get api("/keys?fingerprint=#{fingerprint_md5}", admin)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('Failed to return the key')
+ end
+ end
end
it 'returns 404 for non-existing SSH sha256 fingerprint' do
@@ -69,20 +96,7 @@ RSpec.describe API::Keys do
expect(json_response['message']).to eq('404 Key Not Found')
end
- it 'returns user if SSH md5 fingerprint found' do
- user.keys << key
-
- get api("/keys?fingerprint=#{key.fingerprint}", admin)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['title']).to eq(key.title)
- expect(json_response['user']['id']).to eq(user.id)
- expect(json_response['user']['username']).to eq(user.username)
- end
-
it 'returns user if SSH sha256 fingerprint found' do
- user.keys << key
-
get api("/keys?fingerprint=#{URI.encode_www_form_component("SHA256:" + key.fingerprint_sha256)}", admin)
expect(response).to have_gitlab_http_status(:ok)
@@ -92,8 +106,6 @@ RSpec.describe API::Keys do
end
it 'returns user if SSH sha256 fingerprint found' do
- user.keys << key
-
get api("/keys?fingerprint=#{URI.encode_www_form_component("sha256:" + key.fingerprint_sha256)}", admin)
expect(response).to have_gitlab_http_status(:ok)
@@ -103,7 +115,7 @@ RSpec.describe API::Keys do
end
it "does not include the user's `is_admin` flag" do
- get api("/keys?fingerprint=#{key.fingerprint}", admin)
+ get api("/keys?fingerprint=#{URI.encode_www_form_component("sha256:" + key.fingerprint_sha256)}", admin)
expect(json_response['user']['is_admin']).to be_nil
end
diff --git a/spec/requests/api/lint_spec.rb b/spec/requests/api/lint_spec.rb
index 73bc4a5d1f3..ef7f5ee87dc 100644
--- a/spec/requests/api/lint_spec.rb
+++ b/spec/requests/api/lint_spec.rb
@@ -195,7 +195,7 @@ RSpec.describe API::Lint do
end
context 'with invalid configuration' do
- let(:yaml_content) { '{ image: "ruby:2.7", services: ["postgres"] }' }
+ let(:yaml_content) { '{ image: "image:1.0", services: ["postgres"] }' }
it 'responds with errors about invalid configuration' do
post api('/ci/lint', api_user), params: { content: yaml_content }
@@ -465,7 +465,7 @@ RSpec.describe API::Lint do
context 'with invalid .gitlab-ci.yml content' do
let(:yaml_content) do
- { image: 'ruby:2.7', services: ['postgres'] }.deep_stringify_keys.to_yaml
+ { image: 'image:1.0', services: ['postgres'] }.deep_stringify_keys.to_yaml
end
before do
@@ -712,7 +712,7 @@ RSpec.describe API::Lint do
context 'with invalid .gitlab-ci.yml content' do
let(:yaml_content) do
- { image: 'ruby:2.7', services: ['postgres'] }.deep_stringify_keys.to_yaml
+ { image: 'image:1.0', services: ['postgres'] }.deep_stringify_keys.to_yaml
end
context 'when running as dry run' do
diff --git a/spec/requests/api/members_spec.rb b/spec/requests/api/members_spec.rb
index 561d81f9860..6bacb3a59b2 100644
--- a/spec/requests/api/members_spec.rb
+++ b/spec/requests/api/members_spec.rb
@@ -11,16 +11,16 @@ RSpec.describe API::Members do
let(:project) do
create(:project, :public, creator_id: maintainer.id, namespace: maintainer.namespace) do |project|
- project.add_developer(developer)
project.add_maintainer(maintainer)
+ project.add_developer(developer, current_user: maintainer)
project.request_access(access_requester)
end
end
let!(:group) do
create(:group, :public) do |group|
- group.add_developer(developer)
group.add_owner(maintainer)
+ group.add_developer(developer, maintainer)
create(:group_member, :minimal_access, source: group, user: user_with_minimal_access)
group.request_access(access_requester)
end
@@ -50,6 +50,10 @@ RSpec.describe API::Members do
expect(json_response).to be_an Array
expect(json_response.size).to eq(2)
expect(json_response.map { |u| u['id'] }).to match_array [maintainer.id, developer.id]
+ expect(json_response).to contain_exactly(
+ a_hash_including('created_by' => a_hash_including('id' => maintainer.id)),
+ hash_not_including('created_by')
+ )
end
end
end
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 9e6fea9e5b4..b1183bb10fa 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -1605,11 +1605,7 @@ RSpec.describe API::MergeRequests do
expect(json_response['overflow']).to be_falsy
end
- context 'when using DB-backed diffs via feature flag' do
- before do
- stub_feature_flags(mrc_api_use_raw_diffs_from_gitaly: false)
- end
-
+ context 'when using DB-backed diffs' do
it_behaves_like 'find an existing merge request'
it 'accesses diffs via DB-backed diffs.diffs' do
diff --git a/spec/requests/api/notes_spec.rb b/spec/requests/api/notes_spec.rb
index 455400072bf..f6a65274ca2 100644
--- a/spec/requests/api/notes_spec.rb
+++ b/spec/requests/api/notes_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe API::Notes do
let!(:issue) { create(:issue, project: project, author: user) }
let!(:issue_note) { create(:note, noteable: issue, project: project, author: user) }
- it_behaves_like "noteable API", 'projects', 'issues', 'iid' do
+ it_behaves_like "noteable API with confidential notes", 'projects', 'issues', 'iid' do
let(:parent) { project }
let(:noteable) { issue }
let(:note) { issue_note }
diff --git a/spec/requests/api/project_attributes.yml b/spec/requests/api/project_attributes.yml
index 02d377efd95..fbcaa404edb 100644
--- a/spec/requests/api/project_attributes.yml
+++ b/spec/requests/api/project_attributes.yml
@@ -11,8 +11,6 @@ itself: # project
- has_external_wiki
- hidden
- import_source
- - import_type
- - import_url
- jobs_cache_index
- last_repository_check_at
- last_repository_check_failed
@@ -63,6 +61,8 @@ itself: # project
- empty_repo
- forks_count
- http_url_to_repo
+ - import_status
+ - import_url
- name_with_namespace
- open_issues_count
- owner
@@ -148,6 +148,7 @@ project_setting:
- updated_at
- cve_id_request_enabled
- mr_default_target_self
+ - target_platforms
build_service_desk_setting: # service_desk_setting
unexposed_attributes:
diff --git a/spec/requests/api/project_export_spec.rb b/spec/requests/api/project_export_spec.rb
index 2bc31153f2c..07efd56fef4 100644
--- a/spec/requests/api/project_export_spec.rb
+++ b/spec/requests/api/project_export_spec.rb
@@ -260,6 +260,29 @@ RSpec.describe API::ProjectExport, :clean_gitlab_redis_cache do
expect(json_response['message']['error']).to eq('This endpoint has been requested too many times. Try again later.')
end
end
+
+ context 'applies correct scope when throttling' do
+ before do
+ stub_application_setting(project_download_export_limit: 1)
+ end
+
+ it 'throttles downloads within same namespaces' do
+ # simulate prior request to the same namespace, which increments the rate limit counter for that scope
+ Gitlab::ApplicationRateLimiter.throttled?(:project_download_export, scope: [user, project_finished.namespace])
+
+ get api(download_path_finished, user)
+ expect(response).to have_gitlab_http_status(:too_many_requests)
+ end
+
+ it 'allows downloads from different namespaces' do
+ # simulate prior request to a different namespace, which increments the rate limit counter for that scope
+ Gitlab::ApplicationRateLimiter.throttled?(:project_download_export,
+ scope: [user, create(:project, :with_export).namespace])
+
+ get api(download_path_finished, user)
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
end
context 'when user is a maintainer' do
diff --git a/spec/requests/api/project_import_spec.rb b/spec/requests/api/project_import_spec.rb
index a0f6d3d0081..7e6d80c047c 100644
--- a/spec/requests/api/project_import_spec.rb
+++ b/spec/requests/api/project_import_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe API::ProjectImport, :aggregate_failures do
let(:namespace) { create(:group) }
before do
- namespace.add_owner(user)
+ namespace.add_owner(user) if user
end
shared_examples 'requires authentication' do
@@ -47,7 +47,7 @@ RSpec.describe API::ProjectImport, :aggregate_failures do
it 'executes a limited number of queries' do
control_count = ActiveRecord::QueryRecorder.new { subject }.count
- expect(control_count).to be <= 105
+ expect(control_count).to be <= 108
end
it 'schedules an import using a namespace' do
@@ -306,63 +306,49 @@ RSpec.describe API::ProjectImport, :aggregate_failures do
it_behaves_like 'requires authentication'
- it 'returns NOT FOUND when the feature is disabled' do
- stub_feature_flags(import_project_from_remote_file: false)
-
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- context 'when the feature flag is enabled' do
- before do
- stub_feature_flags(import_project_from_remote_file: true)
- end
-
- context 'when the response is successful' do
- it 'schedules the import successfully' do
- project = create(
- :project,
- namespace: user.namespace,
- name: 'test-import',
- path: 'test-import'
- )
+ context 'when the response is successful' do
+ it 'schedules the import successfully' do
+ project = create(
+ :project,
+ namespace: user.namespace,
+ name: 'test-import',
+ path: 'test-import'
+ )
- service_response = ServiceResponse.success(payload: project)
- expect_next(::Import::GitlabProjects::CreateProjectService)
- .to receive(:execute)
- .and_return(service_response)
+ service_response = ServiceResponse.success(payload: project)
+ expect_next(::Import::GitlabProjects::CreateProjectService)
+ .to receive(:execute)
+ .and_return(service_response)
- subject
+ subject
- expect(response).to have_gitlab_http_status(:created)
- expect(json_response).to include({
- 'id' => project.id,
- 'name' => 'test-import',
- 'name_with_namespace' => "#{user.namespace.name} / test-import",
- 'path' => 'test-import',
- 'path_with_namespace' => "#{user.namespace.path}/test-import"
- })
- end
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response).to include({
+ 'id' => project.id,
+ 'name' => 'test-import',
+ 'name_with_namespace' => "#{user.namespace.name} / test-import",
+ 'path' => 'test-import',
+ 'path_with_namespace' => "#{user.namespace.path}/test-import"
+ })
end
+ end
- context 'when the service returns an error' do
- it 'fails to schedule the import' do
- service_response = ServiceResponse.error(
- message: 'Failed to import',
- http_status: :bad_request
- )
- expect_next(::Import::GitlabProjects::CreateProjectService)
- .to receive(:execute)
- .and_return(service_response)
+ context 'when the service returns an error' do
+ it 'fails to schedule the import' do
+ service_response = ServiceResponse.error(
+ message: 'Failed to import',
+ http_status: :bad_request
+ )
+ expect_next(::Import::GitlabProjects::CreateProjectService)
+ .to receive(:execute)
+ .and_return(service_response)
- subject
+ subject
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response).to eq({
- 'message' => 'Failed to import'
- })
- end
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response).to eq({
+ 'message' => 'Failed to import'
+ })
end
end
end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index fc1d815a64e..011300a038f 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -683,6 +683,33 @@ RSpec.describe API::Projects do
end
end
+ context 'and imported=true' do
+ before do
+ other_user = create(:user)
+ # imported project by other user
+ create(:project, creator: other_user, import_type: 'github', import_url: 'http://foo.com')
+ # project created by current user directly instead of importing
+ create(:project)
+ project.update_attribute(:import_url, 'http://user:password@host/path')
+ project.update_attribute(:import_type, 'github')
+ end
+
+ it 'returns only imported projects owned by current user' do
+ get api('/projects?imported=true', user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.map { |p| p['id'] }).to eq [project.id]
+ end
+
+ it 'does not expose import credentials' do
+ get api('/projects?imported=true', user)
+
+ expect(json_response.first['import_url']).to eq 'http://host/path'
+ end
+ end
+
context 'when authenticated as a different user' do
it_behaves_like 'projects response' do
let(:filter) { {} }
@@ -777,7 +804,7 @@ RSpec.describe API::Projects do
subject { get api('/projects', current_user), params: params }
before do
- group_with_projects.add_owner(current_user)
+ group_with_projects.add_owner(current_user) if current_user
end
it 'returns non-public items based ordered by similarity' do
@@ -3116,6 +3143,29 @@ RSpec.describe API::Projects do
project2.add_developer(project2_user)
end
+ it 'records the query', :request_store, :use_sql_query_cache do
+ post api("/projects/#{project.id}/import_project_members/#{project2.id}", user)
+
+ control_project = create(:project)
+ control_project.add_maintainer(user)
+ control_project.add_developer(create(:user))
+
+ control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ post api("/projects/#{project.id}/import_project_members/#{control_project.id}", user)
+ end
+
+ measure_project = create(:project)
+ measure_project.add_maintainer(user)
+ measure_project.add_developer(create(:user))
+ measure_project.add_developer(create(:user)) # make this 2nd one to find any n+1
+
+ unresolved_n_plus_ones = 21 # 21 queries added per member
+
+ expect do
+ post api("/projects/#{project.id}/import_project_members/#{measure_project.id}", user)
+ end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones)
+ end
+
it 'returns 200 when it successfully imports members from another project' do
expect do
post api("/projects/#{project.id}/import_project_members/#{project2.id}", user)
diff --git a/spec/requests/api/releases_spec.rb b/spec/requests/api/releases_spec.rb
index 6038682de1e..c6bf72176a8 100644
--- a/spec/requests/api/releases_spec.rb
+++ b/spec/requests/api/releases_spec.rb
@@ -1358,4 +1358,95 @@ RSpec.describe API::Releases do
release_cli: release_cli
)
end
+
+ describe 'GET /groups/:id/releases' do
+ let_it_be(:user1) { create(:user, can_create_group: false) }
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:group1) { create(:group) }
+ let_it_be(:group2) { create(:group, :private) }
+ let_it_be(:project1) { create(:project, namespace: group1) }
+ let_it_be(:project2) { create(:project, namespace: group2) }
+ let_it_be(:project3) { create(:project, namespace: group1, path: 'test', visibility_level: Gitlab::VisibilityLevel::PRIVATE) }
+ let_it_be(:release1) { create(:release, project: project1) }
+ let_it_be(:release2) { create(:release, project: project2) }
+ let_it_be(:release3) { create(:release, project: project3) }
+
+ context 'when authenticated as owner' do
+ it 'gets releases from all projects in the group' do
+ get api("/groups/#{group1.id}/releases", admin)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.length).to eq(2)
+ expect(json_response.pluck('name')).to match_array([release1.name, release3.name])
+ end
+
+ it 'respects order by parameters' do
+ create(:release, project: project1, released_at: DateTime.now + 1.day)
+ get api("/groups/#{group1.id}/releases", admin), params: { sort: 'desc' }
+
+ expect(DateTime.parse(json_response[0]["released_at"]))
+ .to be > (DateTime.parse(json_response[1]["released_at"]))
+ end
+
+ it 'respects the simple parameter' do
+ get api("/groups/#{group1.id}/releases", admin), params: { simple: true }
+
+ expect(json_response[0].keys).not_to include("assets")
+ end
+
+ it 'denies access to private groups' do
+ get api("/groups/#{group2.id}/releases", user1), params: { simple: true }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it 'returns not found unless :group_releases_finder_inoperator feature flag enabled' do
+ stub_feature_flags(group_releases_finder_inoperator: false)
+
+ get api("/groups/#{group1.id}/releases", admin)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when authenticated as guest' do
+ before do
+ group1.add_guest(guest)
+ end
+
+ it "does not expose tag, commit, source code or helper paths" do
+ get api("/groups/#{group1.id}/releases", guest)
+
+ expect(response).to match_response_schema('public_api/v4/release/releases_for_guest')
+ expect(json_response[0]['assets']['count']).to eq(release1.links.count)
+ expect(json_response[0]['commit_path']).to be_nil
+ expect(json_response[0]['tag_path']).to be_nil
+ end
+ end
+
+ context 'performance testing' do
+ shared_examples 'avoids N+1 queries' do |query_params = {}|
+ context 'with subgroups' do
+ let(:group) { create(:group) }
+
+ it 'include_subgroups avoids N+1 queries' do
+ control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ get api("/groups/#{group.id}/releases", admin), params: query_params.merge({ include_subgroups: true })
+ end.count
+
+ subgroups = create_list(:group, 10, parent: group1)
+ projects = create_list(:project, 10, namespace: subgroups[0])
+ create_list(:release, 10, project: projects[0], author: admin)
+
+ expect do
+ get api("/groups/#{group.id}/releases", admin), params: query_params.merge({ include_subgroups: true })
+ end.not_to exceed_all_query_limit(control_count)
+ end
+ end
+ end
+
+ it_behaves_like 'avoids N+1 queries'
+ it_behaves_like 'avoids N+1 queries', { simple: true }
+ end
+ end
end
diff --git a/spec/requests/api/remote_mirrors_spec.rb b/spec/requests/api/remote_mirrors_spec.rb
index 436efb708fd..338647224e0 100644
--- a/spec/requests/api/remote_mirrors_spec.rb
+++ b/spec/requests/api/remote_mirrors_spec.rb
@@ -26,6 +26,26 @@ RSpec.describe API::RemoteMirrors do
end
end
+ describe 'GET /projects/:id/remote_mirrors/:mirror_id' do
+ let(:route) { "/projects/#{project.id}/remote_mirrors/#{mirror.id}" }
+ let(:mirror) { project.remote_mirrors.first }
+
+ it 'requires `admin_remote_mirror` permission' do
+ get api(route, developer)
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
+ it 'returns at remote mirror' do
+ project.add_maintainer(user)
+
+ get api(route, user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(response).to match_response_schema('remote_mirror')
+ end
+ end
+
describe 'POST /projects/:id/remote_mirrors' do
let(:route) { "/projects/#{project.id}/remote_mirrors" }
@@ -75,11 +95,11 @@ RSpec.describe API::RemoteMirrors do
end
describe 'PUT /projects/:id/remote_mirrors/:mirror_id' do
- let(:route) { ->(id) { "/projects/#{project.id}/remote_mirrors/#{id}" } }
+ let(:route) { "/projects/#{project.id}/remote_mirrors/#{mirror.id}" }
let(:mirror) { project.remote_mirrors.first }
it 'requires `admin_remote_mirror` permission' do
- put api(route[mirror.id], developer)
+ put api(route, developer)
expect(response).to have_gitlab_http_status(:unauthorized)
end
@@ -87,7 +107,7 @@ RSpec.describe API::RemoteMirrors do
it 'updates a remote mirror' do
project.add_maintainer(user)
- put api(route[mirror.id], user), params: {
+ put api(route, user), params: {
enabled: '0',
only_protected_branches: 'true',
keep_divergent_refs: 'true'
@@ -99,4 +119,44 @@ RSpec.describe API::RemoteMirrors do
expect(json_response['keep_divergent_refs']).to eq(true)
end
end
+
+ describe 'DELETE /projects/:id/remote_mirrors/:mirror_id' do
+ let(:route) { ->(id) { "/projects/#{project.id}/remote_mirrors/#{id}" } }
+ let(:mirror) { project.remote_mirrors.first }
+
+ it 'requires `admin_remote_mirror` permission' do
+ expect { delete api(route[mirror.id], developer) }.not_to change { project.remote_mirrors.count }
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
+ context 'when the user is a maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'returns 404 for non existing id' do
+ delete api(route[non_existing_record_id], user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it 'returns bad request if the update service fails' do
+ expect_next_instance_of(Projects::UpdateService) do |service|
+ expect(service).to receive(:execute).and_return(status: :error, message: 'message')
+ end
+
+ expect { delete api(route[mirror.id], user) }.not_to change { project.remote_mirrors.count }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response).to eq({ 'message' => 'message' })
+ end
+
+ it 'deletes a remote mirror' do
+ expect { delete api(route[mirror.id], user) }.to change { project.remote_mirrors.count }.from(1).to(0)
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+ end
+ end
end
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index 1d199a72d1d..d6d2bd5baf2 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -452,7 +452,7 @@ RSpec.describe API::Repositories do
it "compare commits between different projects" do
group = create(:group)
- group.add_owner(current_user)
+ group.add_owner(current_user) if current_user
forked_project = fork_project(project, current_user, repository: true, namespace: group)
forked_project.repository.create_ref('refs/heads/improve/awesome', 'refs/heads/improve/more-awesome')
diff --git a/spec/requests/api/resource_access_tokens_spec.rb b/spec/requests/api/resource_access_tokens_spec.rb
index 7e3e682767f..369a8c1b0ab 100644
--- a/spec/requests/api/resource_access_tokens_spec.rb
+++ b/spec/requests/api/resource_access_tokens_spec.rb
@@ -29,6 +29,8 @@ RSpec.describe API::ResourceAccessTokens do
token_ids = json_response.map { |token| token['id'] }
expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(response).to match_response_schema('public_api/v4/resource_access_tokens')
expect(token_ids).to match_array(access_tokens.pluck(:id))
end
@@ -131,6 +133,103 @@ RSpec.describe API::ResourceAccessTokens do
end
end
+ context "GET #{source_type}s/:id/access_tokens/:token_id" do
+ subject(:get_token) { get api("/#{source_type}s/#{resource_id}/access_tokens/#{token_id}", user) }
+
+ let_it_be(:project_bot) { create(:user, :project_bot) }
+ let_it_be(:token) { create(:personal_access_token, user: project_bot) }
+ let_it_be(:resource_id) { resource.id }
+ let_it_be(:token_id) { token.id }
+
+ before do
+ if source_type == 'project'
+ resource.add_maintainer(project_bot)
+ else
+ resource.add_owner(project_bot)
+ end
+ end
+
+ context "when the user has valid permissions" do
+ it "gets the #{source_type} access token from the #{source_type}" do
+ get_token
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('public_api/v4/resource_access_token')
+
+ expect(json_response["name"]).to eq(token.name)
+ expect(json_response["scopes"]).to eq(token.scopes)
+
+ if source_type == 'project'
+ expect(json_response["access_level"]).to eq(resource.team.max_member_access(token.user.id))
+ else
+ expect(json_response["access_level"]).to eq(resource.max_member_access_for_user(token.user))
+ end
+
+ expect(json_response["expires_at"]).to eq(token.expires_at.to_date.iso8601)
+ end
+
+ context "when using #{source_type} access token to GET other #{source_type} access token" do
+ let_it_be(:other_project_bot) { create(:user, :project_bot) }
+ let_it_be(:other_token) { create(:personal_access_token, user: other_project_bot) }
+ let_it_be(:token_id) { other_token.id }
+
+ before do
+ resource.add_maintainer(other_project_bot)
+ end
+
+ it "gets the #{source_type} access token from the #{source_type}" do
+ get_token
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('public_api/v4/resource_access_token')
+
+ expect(json_response["name"]).to eq(other_token.name)
+ expect(json_response["scopes"]).to eq(other_token.scopes)
+
+ if source_type == 'project'
+ expect(json_response["access_level"]).to eq(resource.team.max_member_access(other_token.user.id))
+ else
+ expect(json_response["access_level"]).to eq(resource.max_member_access_for_user(other_token.user))
+ end
+
+ expect(json_response["expires_at"]).to eq(other_token.expires_at.to_date.iso8601)
+ end
+ end
+
+ context "when attempting to get a non-existent #{source_type} access token" do
+ let_it_be(:token_id) { non_existing_record_id }
+
+ it "does not get the token, and returns 404" do
+ get_token
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(response.body).to include("Could not find #{source_type} access token with token_id: #{token_id}")
+ end
+ end
+
+ context "when attempting to get a token that does not belong to the specified #{source_type}" do
+ let_it_be(:resource_id) { other_resource.id }
+
+ it "does not get the token, and returns 404" do
+ get_token
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(response.body).to include("Could not find #{source_type} access token with token_id: #{token_id}")
+ end
+ end
+ end
+
+ context "when the user does not have valid permissions" do
+ let_it_be(:user) { user_non_priviledged }
+
+ it "returns 401" do
+ get_token
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+ end
+
context "DELETE #{source_type}s/:id/access_tokens/:token_id", :sidekiq_inline do
subject(:delete_token) { delete api("/#{source_type}s/#{resource_id}/access_tokens/#{token_id}", user) }
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index f7048a1ca6b..c724c69045e 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -91,7 +91,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
end
end
- it "updates application settings" do
+ it "updates application settings", fips_mode: false do
put api("/application/settings", admin),
params: {
default_ci_config_path: 'debian/salsa-ci.yml',
@@ -286,6 +286,55 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
expect(json_response['hashed_storage_enabled']).to eq(true)
end
+ context 'SSH key restriction settings', :fips_mode do
+ let(:settings) do
+ {
+ dsa_key_restriction: -1,
+ ecdsa_key_restriction: 256,
+ ecdsa_sk_key_restriction: 256,
+ ed25519_key_restriction: 256,
+ ed25519_sk_key_restriction: 256,
+ rsa_key_restriction: 3072
+ }
+ end
+
+ it 'allows updating the settings' do
+ put api("/application/settings", admin), params: settings
+
+ expect(response).to have_gitlab_http_status(:ok)
+ settings.each do |attribute, value|
+ expect(ApplicationSetting.current.public_send(attribute)).to eq(value)
+ end
+ end
+
+ it 'does not allow DSA keys' do
+ put api("/application/settings", admin), params: { dsa_key_restriction: 1024 }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+
+ it 'does not allow short RSA key values' do
+ put api("/application/settings", admin), params: { rsa_key_restriction: 2048 }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+
+ it 'does not allow unrestricted key lengths' do
+ types = %w(dsa_key_restriction
+ ecdsa_key_restriction
+ ecdsa_sk_key_restriction
+ ed25519_key_restriction
+ ed25519_sk_key_restriction
+ rsa_key_restriction)
+
+ types.each do |type|
+ put api("/application/settings", admin), params: { type => 0 }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+ end
+ end
+
context 'external policy classification settings' do
let(:settings) do
{
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index eadceeba03b..c554463df76 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -83,19 +83,21 @@ RSpec.describe API::Users do
describe 'GET /users/' do
context 'when unauthenticated' do
- it "does not contain the note of users" do
+ it "does not contain certain fields" do
get api("/users"), params: { username: user.username }
expect(json_response.first).not_to have_key('note')
+ expect(json_response.first).not_to have_key('namespace_id')
end
end
context 'when authenticated' do
context 'as a regular user' do
- it 'does not contain the note of users' do
+ it 'does not contain certain fields' do
get api("/users", user), params: { username: user.username }
expect(json_response.first).not_to have_key('note')
+ expect(json_response.first).not_to have_key('namespace_id')
end
end
@@ -154,6 +156,7 @@ RSpec.describe API::Users do
get api("/user", user)
expect(json_response).not_to have_key('note')
+ expect(json_response).not_to have_key('namespace_id')
end
end
end
@@ -335,12 +338,14 @@ RSpec.describe API::Users do
expect(response).to match_response_schema('public_api/v4/user/basics')
expect(json_response.first.keys).not_to include 'is_admin'
end
+ end
+ context "when admin" do
context 'exclude_internal param' do
let_it_be(:internal_user) { User.alert_bot }
it 'returns all users when it is not set' do
- get api("/users?exclude_internal=false", user)
+ get api("/users?exclude_internal=false", admin)
expect(response).to match_response_schema('public_api/v4/user/basics')
expect(response).to include_pagination_headers
@@ -356,6 +361,26 @@ RSpec.describe API::Users do
end
end
+ context 'without_project_bots param' do
+ let_it_be(:project_bot) { create(:user, :project_bot) }
+
+ it 'returns all users when it is not set' do
+ get api("/users?without_project_bots=false", user)
+
+ expect(response).to match_response_schema('public_api/v4/user/basics')
+ expect(response).to include_pagination_headers
+ expect(json_response.map { |u| u['id'] }).to include(project_bot.id)
+ end
+
+ it 'returns all non project_bot users when it is set' do
+ get api("/users?without_project_bots=true", user)
+
+ expect(response).to match_response_schema('public_api/v4/user/basics')
+ expect(response).to include_pagination_headers
+ expect(json_response.map { |u| u['id'] }).not_to include(project_bot.id)
+ end
+ end
+
context 'admins param' do
it 'returns all users' do
get api("/users?admins=true", user)
@@ -384,6 +409,15 @@ RSpec.describe API::Users do
expect(response).to include_pagination_headers
end
+ it "users contain the `namespace_id` field" do
+ get api("/users", admin)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(response).to match_response_schema('public_api/v4/user/admins')
+ expect(json_response.size).to eq(2)
+ expect(json_response.map { |u| u['namespace_id'] }).to include(user.namespace_id, admin.namespace_id)
+ end
+
it "returns an array of external users" do
create(:user, external: true)
@@ -697,6 +731,14 @@ RSpec.describe API::Users do
expect(json_response['highest_role']).to be(0)
end
+ it 'includes the `namespace_id` field' do
+ get api("/users/#{user.id}", admin)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(response).to match_response_schema('public_api/v4/user/admin')
+ expect(json_response['namespace_id']).to eq(user.namespace_id)
+ end
+
if Gitlab.ee?
it 'does not include values for plan or trial' do
get api("/users/#{user.id}", admin)
@@ -1934,7 +1976,7 @@ RSpec.describe API::Users do
end
end
- describe "POST /users/:id/emails" do
+ describe "POST /users/:id/emails", :mailer do
it "does not create invalid email" do
post api("/users/#{user.id}/emails", admin), params: {}
@@ -1944,11 +1986,15 @@ RSpec.describe API::Users do
it "creates unverified email" do
email_attrs = attributes_for :email
- expect do
- post api("/users/#{user.id}/emails", admin), params: email_attrs
- end.to change { user.emails.count }.by(1)
+
+ perform_enqueued_jobs do
+ expect do
+ post api("/users/#{user.id}/emails", admin), params: email_attrs
+ end.to change { user.emails.count }.by(1)
+ end
expect(json_response['confirmed_at']).to be_nil
+ should_email(user)
end
it "returns a 400 for invalid ID" do
diff --git a/spec/requests/api/v3/github_spec.rb b/spec/requests/api/v3/github_spec.rb
index 838948132dd..5bfea15f0ca 100644
--- a/spec/requests/api/v3/github_spec.rb
+++ b/spec/requests/api/v3/github_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe API::V3::Github do
let_it_be_with_reload(:project) { create(:project, :repository, creator: user) }
before do
- project.add_maintainer(user)
+ project.add_maintainer(user) if user
end
describe 'GET /orgs/:namespace/repos' do
diff --git a/spec/requests/groups/crm/contacts_controller_spec.rb b/spec/requests/groups/crm/contacts_controller_spec.rb
index 4d8ca0fcd60..0ee72233418 100644
--- a/spec/requests/groups/crm/contacts_controller_spec.rb
+++ b/spec/requests/groups/crm/contacts_controller_spec.rb
@@ -85,28 +85,19 @@ RSpec.describe Groups::Crm::ContactsController do
end
describe 'GET #index' do
- subject do
- get group_crm_contacts_path(group)
- response
- end
+ subject { get group_crm_contacts_path(group) }
it_behaves_like 'ok response with index template if authorized'
end
describe 'GET #new' do
- subject do
- get new_group_crm_contact_path(group)
- response
- end
+ subject { get new_group_crm_contact_path(group) }
it_behaves_like 'ok response with index template if authorized'
end
describe 'GET #edit' do
- subject do
- get edit_group_crm_contact_path(group, id: 1)
- response
- end
+ subject { get edit_group_crm_contact_path(group, id: 1) }
it_behaves_like 'ok response with index template if authorized'
end
diff --git a/spec/requests/groups/crm/organizations_controller_spec.rb b/spec/requests/groups/crm/organizations_controller_spec.rb
index 37ffac71772..410fc979262 100644
--- a/spec/requests/groups/crm/organizations_controller_spec.rb
+++ b/spec/requests/groups/crm/organizations_controller_spec.rb
@@ -85,18 +85,19 @@ RSpec.describe Groups::Crm::OrganizationsController do
end
describe 'GET #index' do
- subject do
- get group_crm_organizations_path(group)
- response
- end
+ subject { get group_crm_organizations_path(group) }
it_behaves_like 'ok response with index template if authorized'
end
describe 'GET #new' do
- subject do
- get new_group_crm_organization_path(group)
- end
+ subject { get new_group_crm_organization_path(group) }
+
+ it_behaves_like 'ok response with index template if authorized'
+ end
+
+ describe 'GET #edit' do
+ subject { get edit_group_crm_organization_path(group, id: 1) }
it_behaves_like 'ok response with index template if authorized'
end
diff --git a/spec/requests/groups/email_campaigns_controller_spec.rb b/spec/requests/groups/email_campaigns_controller_spec.rb
index 9ed828d1a9a..4d630ef6710 100644
--- a/spec/requests/groups/email_campaigns_controller_spec.rb
+++ b/spec/requests/groups/email_campaigns_controller_spec.rb
@@ -94,7 +94,7 @@ RSpec.describe Groups::EmailCampaignsController do
describe 'track parameter' do
context 'when valid' do
- where(track: [Namespaces::InProductMarketingEmailsService::TRACKS.keys.without(:experience), Namespaces::InviteTeamEmailService::TRACK].flatten)
+ where(track: Namespaces::InProductMarketingEmailsService::TRACKS.keys.without(:experience))
with_them do
it_behaves_like 'track and redirect'
@@ -117,10 +117,6 @@ RSpec.describe Groups::EmailCampaignsController do
with_them do
it_behaves_like 'track and redirect'
end
-
- it_behaves_like 'track and redirect' do
- let(:track) { Namespaces::InviteTeamEmailService::TRACK.to_s }
- end
end
context 'when invalid' do
@@ -128,10 +124,6 @@ RSpec.describe Groups::EmailCampaignsController do
with_them do
it_behaves_like 'no track and 404'
-
- it_behaves_like 'no track and 404' do
- let(:track) { Namespaces::InviteTeamEmailService::TRACK.to_s }
- end
end
end
end
diff --git a/spec/requests/import/gitlab_groups_controller_spec.rb b/spec/requests/import/gitlab_groups_controller_spec.rb
index 4abf99cf994..8d5c1e3ebab 100644
--- a/spec/requests/import/gitlab_groups_controller_spec.rb
+++ b/spec/requests/import/gitlab_groups_controller_spec.rb
@@ -155,20 +155,6 @@ RSpec.describe Import::GitlabGroupsController do
end
end
- context 'when group import FF is disabled' do
- let(:request_params) { { path: 'test-group-import', name: 'test-group-import' } }
-
- before do
- stub_feature_flags(group_import_export: false)
- end
-
- it 'returns an error' do
- expect { import_request }.not_to change { Group.count }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
context 'when the parent group is invalid' do
let(:request_params) { { path: 'test-group-import', name: 'test-group-import', parent_id: -1 } }
diff --git a/spec/requests/jira_authorizations_spec.rb b/spec/requests/jira_authorizations_spec.rb
index 24c6001814c..b43d36e94f4 100644
--- a/spec/requests/jira_authorizations_spec.rb
+++ b/spec/requests/jira_authorizations_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe 'Jira authorization requests' do
let(:user) { create :user }
let(:application) { create :oauth_application, scopes: 'api' }
- let(:redirect_uri) { oauth_jira_callback_url(host: "http://www.example.com") }
+ let(:redirect_uri) { oauth_jira_dvcs_callback_url(host: "http://www.example.com") }
def generate_access_grant
create :oauth_access_grant, application: application, resource_owner_id: user.id, redirect_uri: redirect_uri
diff --git a/spec/requests/projects/work_items_spec.rb b/spec/requests/projects/work_items_spec.rb
new file mode 100644
index 00000000000..e6365a3824a
--- /dev/null
+++ b/spec/requests/projects/work_items_spec.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Work Items' do
+ let_it_be(:work_item) { create(:work_item) }
+ let_it_be(:developer) { create(:user) }
+
+ before_all do
+ work_item.project.add_developer(developer)
+ end
+
+ describe 'GET /:namespace/:project/work_items/:id' do
+ before do
+ sign_in(developer)
+ end
+
+ context 'when the work_items feature flag is enabled' do
+ it 'renders index' do
+ get project_work_items_url(work_item.project, work_items_path: work_item.id)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when the work_items feature flag is disabled' do
+ before do
+ stub_feature_flags(work_items: false)
+ end
+
+ it 'returns 404' do
+ get project_work_items_url(work_item.project, work_items_path: work_item.id)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+end
diff --git a/spec/routing/admin_routing_spec.rb b/spec/routing/admin_routing_spec.rb
index 8c36d7d4668..f48b4de23a2 100644
--- a/spec/routing/admin_routing_spec.rb
+++ b/spec/routing/admin_routing_spec.rb
@@ -134,10 +134,17 @@ RSpec.describe Admin::HealthCheckController, "routing" do
end
end
-# admin_dev_ops_report GET /admin/dev_ops_report(.:format) admin/dev_ops_report#show
+# admin_dev_ops_reports GET /admin/dev_ops_reports(.:format) admin/dev_ops_report#show
RSpec.describe Admin::DevOpsReportController, "routing" do
it "to #show" do
- expect(get("/admin/dev_ops_report")).to route_to('admin/dev_ops_report#show')
+ expect(get("/admin/dev_ops_reports")).to route_to('admin/dev_ops_report#show')
+ end
+
+ describe 'admin devops reports' do
+ include RSpec::Rails::RequestExampleGroup
+ it 'redirects from /admin/dev_ops_report to /admin/dev_ops_reports' do
+ expect(get("/admin/dev_ops_report")).to redirect_to(admin_dev_ops_reports_path)
+ end
end
end
diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb
index 65772895826..21012399edf 100644
--- a/spec/routing/project_routing_spec.rb
+++ b/spec/routing/project_routing_spec.rb
@@ -905,6 +905,13 @@ RSpec.describe 'project routing' do
)
end
+ it 'routes to 404 without format for invalid page' do
+ expect(get: "/gitlab/gitlabhq/-/metrics/invalid_page.md").to route_to(
+ 'application#route_not_found',
+ unmatched_route: 'gitlab/gitlabhq/-/metrics/invalid_page.md'
+ )
+ end
+
it 'routes to 404 with invalid dashboard_path' do
expect(get: "/gitlab/gitlabhq/-/metrics/invalid_dashboard").to route_to(
'application#route_not_found',
diff --git a/spec/routing/uploads_routing_spec.rb b/spec/routing/uploads_routing_spec.rb
index d1ddf8a6d6a..41646d1b515 100644
--- a/spec/routing/uploads_routing_spec.rb
+++ b/spec/routing/uploads_routing_spec.rb
@@ -21,6 +21,17 @@ RSpec.describe 'Uploads', 'routing' do
)
end
+ it 'allows fetching alert metric metric images' do
+ expect(get('/uploads/-/system/alert_management_metric_image/file/1/test.jpg')).to route_to(
+ controller: 'uploads',
+ action: 'show',
+ model: 'alert_management_metric_image',
+ id: '1',
+ filename: 'test.jpg',
+ mounted_as: 'file'
+ )
+ end
+
it 'does not allow creating uploads for other models' do
unroutable_models = UploadsController::MODEL_CLASSES.keys.compact - %w(personal_snippet user)
diff --git a/spec/rubocop/cop/database/disable_referential_integrity_spec.rb b/spec/rubocop/cop/database/disable_referential_integrity_spec.rb
new file mode 100644
index 00000000000..9ac67363cb6
--- /dev/null
+++ b/spec/rubocop/cop/database/disable_referential_integrity_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/database/disable_referential_integrity'
+
+RSpec.describe RuboCop::Cop::Database::DisableReferentialIntegrity do
+ subject(:cop) { described_class.new }
+
+ it 'does not flag the use of disable_referential_integrity with a send receiver' do
+ expect_offense(<<~SOURCE)
+ foo.disable_referential_integrity
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use `disable_referential_integrity`, [...]
+ SOURCE
+ end
+
+ it 'flags the use of disable_referential_integrity with a full definition' do
+ expect_offense(<<~SOURCE)
+ ActiveRecord::Base.connection.disable_referential_integrity
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use `disable_referential_integrity`, [...]
+ SOURCE
+ end
+
+ it 'flags the use of disable_referential_integrity with a nil receiver' do
+ expect_offense(<<~SOURCE)
+ class Foo ; disable_referential_integrity ; end
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use `disable_referential_integrity`, [...]
+ SOURCE
+ end
+
+ it 'flags the use of disable_referential_integrity when passing a block' do
+ expect_offense(<<~SOURCE)
+ class Foo ; disable_referential_integrity { :foo } ; end
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use `disable_referential_integrity`, [...]
+ SOURCE
+ end
+end
diff --git a/spec/rubocop/cop/gitlab/avoid_feature_category_not_owned_spec.rb b/spec/rubocop/cop/gitlab/avoid_feature_category_not_owned_spec.rb
new file mode 100644
index 00000000000..f6c6955f6bb
--- /dev/null
+++ b/spec/rubocop/cop/gitlab/avoid_feature_category_not_owned_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/gitlab/avoid_feature_category_not_owned'
+
+RSpec.describe RuboCop::Cop::Gitlab::AvoidFeatureCategoryNotOwned do
+ subject(:cop) { described_class.new }
+
+ shared_examples 'defining feature category on a class' do
+ it 'flags a method call on a class' do
+ expect_offense(<<~SOURCE)
+ feature_category :not_owned
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid adding new endpoints with `feature_category :not_owned`. See https://docs.gitlab.com/ee/development/feature_categorization
+ SOURCE
+ end
+
+ it 'flags a method call on a class with an array passed' do
+ expect_offense(<<~SOURCE)
+ feature_category :not_owned, [:index, :edit]
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid adding new endpoints with `feature_category :not_owned`. See https://docs.gitlab.com/ee/development/feature_categorization
+ SOURCE
+ end
+
+ it 'flags a method call on a class with an array passed' do
+ expect_offense(<<~SOURCE)
+ worker.feature_category :not_owned, [:index, :edit]
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid adding new endpoints with `feature_category :not_owned`. See https://docs.gitlab.com/ee/development/feature_categorization
+ SOURCE
+ end
+ end
+
+ context 'in controllers' do
+ before do
+ allow(subject).to receive(:in_controller?).and_return(true)
+ end
+
+ it_behaves_like 'defining feature category on a class'
+ end
+
+ context 'in workers' do
+ before do
+ allow(subject).to receive(:in_worker?).and_return(true)
+ end
+
+ it_behaves_like 'defining feature category on a class'
+ end
+
+ context 'for grape endpoints' do
+ before do
+ allow(subject).to receive(:in_api?).and_return(true)
+ end
+
+ it_behaves_like 'defining feature category on a class'
+
+ it 'flags when passed as a hash for a Grape endpoint as keyword args' do
+ expect_offense(<<~SOURCE)
+ get :hello, feature_category: :not_owned
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid adding new endpoints with `feature_category :not_owned`. See https://docs.gitlab.com/ee/development/feature_categorization
+ SOURCE
+ end
+
+ it 'flags when passed as a hash for a Grape endpoint in a hash' do
+ expect_offense(<<~SOURCE)
+ get :hello, { feature_category: :not_owned, urgency: :low}
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid adding new endpoints with `feature_category :not_owned`. See https://docs.gitlab.com/ee/development/feature_categorization
+ SOURCE
+ end
+ end
+end
diff --git a/spec/rubocop/cop/qa/duplicate_testcase_link_spec.rb b/spec/rubocop/cop/qa/duplicate_testcase_link_spec.rb
deleted file mode 100644
index fb424da90e8..00000000000
--- a/spec/rubocop/cop/qa/duplicate_testcase_link_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'fast_spec_helper'
-
-require_relative '../../../../rubocop/cop/qa/duplicate_testcase_link'
-
-RSpec.describe RuboCop::Cop::QA::DuplicateTestcaseLink do
- let(:source_file) { 'qa/page.rb' }
-
- subject(:cop) { described_class.new }
-
- context 'in a QA file' do
- before do
- allow(cop).to receive(:in_qa_file?).and_return(true)
- end
-
- it "registers an offense for a duplicate testcase link" do
- expect_offense(<<-RUBY)
- it 'some test', testcase: '/quality/test_cases/1892' do
- end
- it 'another test', testcase: '/quality/test_cases/1892' do
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't reuse the same testcase link in different tests. Replace one of `/quality/test_cases/1892`.
- end
- RUBY
- end
-
- it "doesnt offend if testcase link is unique" do
- expect_no_offenses(<<-RUBY)
- it 'some test', testcase: '/quality/test_cases/1893' do
- end
- it 'another test', testcase: '/quality/test_cases/1894' do
- end
- RUBY
- end
- end
-end
diff --git a/spec/rubocop/cop/qa/testcase_link_format_spec.rb b/spec/rubocop/cop/qa/testcase_link_format_spec.rb
deleted file mode 100644
index f9b43f2a293..00000000000
--- a/spec/rubocop/cop/qa/testcase_link_format_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-require 'fast_spec_helper'
-
-require_relative '../../../../rubocop/cop/qa/testcase_link_format'
-
-RSpec.describe RuboCop::Cop::QA::TestcaseLinkFormat do
- let(:source_file) { 'qa/page.rb' }
- let(:msg) { 'Testcase link format incorrect. Please link a test case from the GitLab project. See: https://docs.gitlab.com/ee/development/testing_guide/end_to_end/best_practices.html#link-a-test-to-its-test-case.' }
-
- subject(:cop) { described_class.new }
-
- context 'in a QA file' do
- before do
- allow(cop).to receive(:in_qa_file?).and_return(true)
- end
-
- it "registers an offense for a testcase link for an issue" do
- node = "it 'another test', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/issues/557' do"
-
- expect_offense(<<-RUBY, node: node, msg: msg)
- %{node}
- ^{node} %{msg}
- end
- RUBY
- end
-
- it "registers an offense for a testcase link for the wrong project" do
- node = "it 'another test', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/2455' do"
-
- expect_offense(<<-RUBY, node: node, msg: msg)
- %{node}
- ^{node} %{msg}
- end
- RUBY
- end
-
- it "doesnt offend if testcase link is correct" do
- expect_no_offenses(<<-RUBY)
- it 'some test', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348312' do
- end
- RUBY
- end
- end
-end
diff --git a/spec/serializers/commit_entity_spec.rb b/spec/serializers/commit_entity_spec.rb
index 6b4346faf5b..ba2d7e17d1a 100644
--- a/spec/serializers/commit_entity_spec.rb
+++ b/spec/serializers/commit_entity_spec.rb
@@ -3,8 +3,6 @@
require 'spec_helper'
RSpec.describe CommitEntity do
- let(:signature_html) { 'TEST' }
-
let(:entity) do
described_class.new(commit, request: request)
end
@@ -16,11 +14,7 @@ RSpec.describe CommitEntity do
subject { entity.as_json }
before do
- render = double('render')
- allow(render).to receive(:call).and_return(signature_html)
-
allow(request).to receive(:project).and_return(project)
- allow(request).to receive(:render).and_return(render)
end
context 'when commit author is a user' do
@@ -83,8 +77,7 @@ RSpec.describe CommitEntity do
let(:commit) { project.commit(TestEnv::BRANCH_SHA['signed-commits']) }
it 'exposes "signature_html"' do
- expect(request.render).to receive(:call)
- expect(subject.fetch(:signature_html)).to be signature_html
+ expect(subject.fetch(:signature_html)).not_to be_nil
end
end
diff --git a/spec/serializers/deployment_entity_spec.rb b/spec/serializers/deployment_entity_spec.rb
index 1dacc9513ee..500d5718bf1 100644
--- a/spec/serializers/deployment_entity_spec.rb
+++ b/spec/serializers/deployment_entity_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe DeploymentEntity do
let(:project) { create(:project, :repository) }
let(:request) { double('request') }
let(:deployment) { create(:deployment, deployable: build, project: project) }
- let(:build) { create(:ci_build, :manual, pipeline: pipeline) }
+ let(:build) { create(:ci_build, :manual, :environment_with_deployment_tier, pipeline: pipeline) }
let(:pipeline) { create(:ci_pipeline, project: project, user: user) }
let(:entity) { described_class.new(deployment, request: request) }
@@ -46,6 +46,10 @@ RSpec.describe DeploymentEntity do
expect(subject).to include(:is_last)
end
+ it 'exposes deployment tier in yaml' do
+ expect(subject).to include(:tier_in_yaml)
+ end
+
context 'when deployable is nil' do
let(:entity) { described_class.new(deployment, request: request, deployment_details: false) }
let(:deployment) { create(:deployment, deployable: nil, project: project) }
diff --git a/spec/serializers/environment_serializer_spec.rb b/spec/serializers/environment_serializer_spec.rb
index ec0dd735755..fe6278084f9 100644
--- a/spec/serializers/environment_serializer_spec.rb
+++ b/spec/serializers/environment_serializer_spec.rb
@@ -50,7 +50,7 @@ RSpec.describe EnvironmentSerializer do
context 'when there is a single environment' do
before do
- create(:environment, name: 'staging')
+ create(:environment, project: project, name: 'staging')
end
it 'represents one standalone environment' do
@@ -63,8 +63,8 @@ RSpec.describe EnvironmentSerializer do
context 'when there are multiple environments in folder' do
before do
- create(:environment, name: 'staging/my-review-1')
- create(:environment, name: 'staging/my-review-2')
+ create(:environment, project: project, name: 'staging/my-review-1')
+ create(:environment, project: project, name: 'staging/my-review-2')
end
it 'represents one item that is a folder' do
@@ -78,10 +78,10 @@ RSpec.describe EnvironmentSerializer do
context 'when there are multiple folders and standalone environments' do
before do
- create(:environment, name: 'staging/my-review-1')
- create(:environment, name: 'staging/my-review-2')
- create(:environment, name: 'production/my-review-3')
- create(:environment, name: 'testing')
+ create(:environment, project: project, name: 'staging/my-review-1')
+ create(:environment, project: project, name: 'staging/my-review-2')
+ create(:environment, project: project, name: 'production/my-review-3')
+ create(:environment, project: project, name: 'testing')
end
it 'represents multiple items grouped within folders' do
@@ -124,7 +124,7 @@ RSpec.describe EnvironmentSerializer do
context 'when resource is paginatable relation' do
context 'when there is a single environment object in relation' do
before do
- create(:environment)
+ create(:environment, project: project)
end
it 'serializes environments' do
@@ -134,7 +134,7 @@ RSpec.describe EnvironmentSerializer do
context 'when multiple environment objects are serialized' do
before do
- create_list(:environment, 3)
+ create_list(:environment, 3, project: project)
end
it 'serializes appropriate number of objects' do
@@ -159,10 +159,10 @@ RSpec.describe EnvironmentSerializer do
end
before do
- create(:environment, name: 'staging/review-1')
- create(:environment, name: 'staging/review-2')
- create(:environment, name: 'production/deploy-3')
- create(:environment, name: 'testing')
+ create(:environment, project: project, name: 'staging/review-1')
+ create(:environment, project: project, name: 'staging/review-2')
+ create(:environment, project: project, name: 'production/deploy-3')
+ create(:environment, project: project, name: 'testing')
end
it 'paginates grouped items including ordering' do
@@ -189,7 +189,7 @@ RSpec.describe EnvironmentSerializer do
let(:resource) { Environment.all }
before do
- create(:environment, name: 'staging/review-1')
+ create(:environment, project: project, name: 'staging/review-1')
create_environment_with_associations(project)
end
diff --git a/spec/serializers/group_link/group_group_link_entity_spec.rb b/spec/serializers/group_link/group_group_link_entity_spec.rb
index 2821c433784..502cdc5c048 100644
--- a/spec/serializers/group_link/group_group_link_entity_spec.rb
+++ b/spec/serializers/group_link/group_group_link_entity_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe GroupLink::GroupGroupLinkEntity do
let_it_be(:current_user) { create(:user) }
- let(:entity) { described_class.new(group_group_link) }
+ let(:entity) { described_class.new(group_group_link, { current_user: current_user, source: shared_group }) }
before do
allow(entity).to receive(:current_user).and_return(current_user)
@@ -17,16 +17,56 @@ RSpec.describe GroupLink::GroupGroupLinkEntity do
expect(entity.to_json).to match_schema('group_link/group_group_link')
end
+ context 'source' do
+ it 'exposes `source`' do
+ expect(entity.as_json[:source]).to include(
+ id: shared_group.id,
+ full_name: shared_group.full_name,
+ web_url: shared_group.web_url
+ )
+ end
+ end
+
+ context 'is_direct_member' do
+ it 'exposes `is_direct_member` as true for corresponding group' do
+ expect(entity.as_json[:is_direct_member]).to be true
+ end
+
+ it 'exposes `is_direct_member` as false for other source' do
+ entity = described_class.new(group_group_link, { current_user: current_user, source: shared_with_group })
+ expect(entity.as_json[:is_direct_member]).to be false
+ end
+ end
+
context 'when current user has `:admin_group_member` permissions' do
before do
allow(entity).to receive(:can?).with(current_user, :admin_group_member, shared_group).and_return(true)
end
- it 'exposes `can_update` and `can_remove` as `true`' do
- json = entity.as_json
+ context 'when direct_member? is true' do
+ before do
+ allow(entity).to receive(:direct_member?).and_return(true)
+ end
+
+ it 'exposes `can_update` and `can_remove` as `true`' do
+ json = entity.as_json
+
+ expect(json[:can_update]).to be true
+ expect(json[:can_remove]).to be true
+ end
+ end
+
+ context 'when direct_member? is false' do
+ before do
+ allow(entity).to receive(:direct_member?).and_return(false)
+ end
+
+ it 'exposes `can_update` and `can_remove` as `true`' do
+ json = entity.as_json
- expect(json[:can_update]).to be true
- expect(json[:can_remove]).to be true
+ expect(json[:can_update]).to be false
+ expect(json[:can_remove]).to be false
+ end
end
end
end
diff --git a/spec/serializers/group_link/project_group_link_entity_spec.rb b/spec/serializers/group_link/project_group_link_entity_spec.rb
index e7e42d79b5e..f2a9f3a107a 100644
--- a/spec/serializers/group_link/project_group_link_entity_spec.rb
+++ b/spec/serializers/group_link/project_group_link_entity_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe GroupLink::ProjectGroupLinkEntity do
let_it_be(:current_user) { create(:user) }
let_it_be(:project_group_link) { create(:project_group_link) }
- let(:entity) { described_class.new(project_group_link) }
+ let(:entity) { described_class.new(project_group_link, { current_user: current_user, source: project_group_link.project }) }
before do
allow(entity).to receive(:current_user).and_return(current_user)
diff --git a/spec/serializers/member_user_entity_spec.rb b/spec/serializers/member_user_entity_spec.rb
index b505571cbf2..0e6d4bcc3fb 100644
--- a/spec/serializers/member_user_entity_spec.rb
+++ b/spec/serializers/member_user_entity_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe MemberUserEntity do
- let_it_be(:user) { create(:user) }
+ let_it_be(:user) { create(:user, last_activity_on: Date.today) }
let_it_be(:emoji) { 'slight_smile' }
let_it_be(:user_status) { create(:user_status, user: user, emoji: emoji) }
@@ -36,4 +36,12 @@ RSpec.describe MemberUserEntity do
it 'correctly exposes `status.emoji`' do
expect(entity_hash[:status][:emoji]).to match(emoji)
end
+
+ it 'correctly exposes `created_at`' do
+ expect(entity_hash[:created_at]).to be(user.created_at)
+ end
+
+ it 'correctly exposes `last_activity_on`' do
+ expect(entity_hash[:last_activity_on]).to be(user.last_activity_on)
+ end
end
diff --git a/spec/services/alert_management/metric_images/upload_service_spec.rb b/spec/services/alert_management/metric_images/upload_service_spec.rb
new file mode 100644
index 00000000000..527d9db0fd9
--- /dev/null
+++ b/spec/services/alert_management/metric_images/upload_service_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe AlertManagement::MetricImages::UploadService do
+ subject(:service) { described_class.new(alert, current_user, params) }
+
+ let_it_be_with_refind(:project) { create(:project) }
+ let_it_be_with_refind(:alert) { create(:alert_management_alert, project: project) }
+ let_it_be_with_refind(:current_user) { create(:user) }
+
+ let(:params) do
+ {
+ file: fixture_file_upload('spec/fixtures/rails_sample.jpg', 'image/jpg'),
+ url: 'https://www.gitlab.com'
+ }
+ end
+
+ describe '#execute' do
+ subject { service.execute }
+
+ shared_examples 'uploads the metric' do
+ it 'uploads the metric and returns a success' do
+ expect { subject }.to change(AlertManagement::MetricImage, :count).by(1)
+ expect(subject.success?).to eq(true)
+ expect(subject.payload).to match({ metric: instance_of(AlertManagement::MetricImage), alert: alert })
+ end
+ end
+
+ shared_examples 'no metric saved, an error given' do |message|
+ it 'returns an error and does not upload', :aggregate_failures do
+ expect(subject.success?).to eq(false)
+ expect(subject.message).to match(a_string_matching(message))
+ expect(AlertManagement::MetricImage.count).to eq(0)
+ end
+ end
+
+ context 'user does not have permissions' do
+ it_behaves_like 'no metric saved, an error given', 'You are not authorized to upload metric images'
+ end
+
+ context 'user has permissions' do
+ before_all do
+ project.add_developer(current_user)
+ end
+
+ it_behaves_like 'uploads the metric'
+
+ context 'no url given' do
+ let(:params) do
+ {
+ file: fixture_file_upload('spec/fixtures/rails_sample.jpg', 'image/jpg')
+ }
+ end
+
+ it_behaves_like 'uploads the metric'
+ end
+
+ context 'record invalid' do
+ let(:params) do
+ {
+ file: fixture_file_upload('spec/fixtures/doc_sample.txt', 'text/plain'),
+ url: 'https://www.gitlab.com'
+ }
+ end
+
+ it_behaves_like 'no metric saved, an error given', /File does not have a supported extension. Only png, jpg, jpeg, gif, bmp, tiff, ico, and webp are supported/ # rubocop: disable Layout/LineLength
+ end
+
+ context 'user is guest' do
+ before_all do
+ project.add_guest(current_user)
+ end
+
+ it_behaves_like 'no metric saved, an error given', 'You are not authorized to upload metric images'
+ end
+ end
+ end
+end
diff --git a/spec/services/audit_event_service_spec.rb b/spec/services/audit_event_service_spec.rb
index 0379fd3f05c..6963515ba5c 100644
--- a/spec/services/audit_event_service_spec.rb
+++ b/spec/services/audit_event_service_spec.rb
@@ -17,7 +17,8 @@ RSpec.describe AuditEventService do
author_name: user.name,
entity_id: project.id,
entity_type: "Project",
- action: :destroy)
+ action: :destroy,
+ created_at: anything)
expect { service.security_event }.to change(AuditEvent, :count).by(1)
end
@@ -39,7 +40,8 @@ RSpec.describe AuditEventService do
from: 'true',
to: 'false',
action: :create,
- target_id: 1)
+ target_id: 1,
+ created_at: anything)
expect { service.security_event }.to change(AuditEvent, :count).by(1)
@@ -50,6 +52,25 @@ RSpec.describe AuditEventService do
expect(details[:target_id]).to eq(1)
end
+ context 'when defining created_at manually' do
+ let(:service) { described_class.new(user, project, { action: :destroy }, :database, 3.weeks.ago) }
+
+ it 'is overridden successfully' do
+ freeze_time do
+ expect(service).to receive(:file_logger).and_return(logger)
+ expect(logger).to receive(:info).with(author_id: user.id,
+ author_name: user.name,
+ entity_id: project.id,
+ entity_type: "Project",
+ action: :destroy,
+ created_at: 3.weeks.ago)
+
+ expect { service.security_event }.to change(AuditEvent, :count).by(1)
+ expect(AuditEvent.last.created_at).to eq(3.weeks.ago)
+ end
+ end
+ end
+
context 'authentication event' do
let(:audit_service) { described_class.new(user, user, with: 'standard') }
@@ -110,7 +131,8 @@ RSpec.describe AuditEventService do
author_name: user.name,
entity_type: 'Project',
entity_id: project.id,
- action: :destroy)
+ action: :destroy,
+ created_at: anything)
service.log_security_event_to_file
end
diff --git a/spec/services/bulk_imports/relation_export_service_spec.rb b/spec/services/bulk_imports/relation_export_service_spec.rb
index 27a6ca60515..f0f85217d2e 100644
--- a/spec/services/bulk_imports/relation_export_service_spec.rb
+++ b/spec/services/bulk_imports/relation_export_service_spec.rb
@@ -88,6 +88,18 @@ RSpec.describe BulkImports::RelationExportService do
subject.execute
end
+
+ context 'when export is recently finished' do
+ it 'returns recently finished export instead of re-exporting' do
+ updated_at = 5.seconds.ago
+ export.update!(status: 1, updated_at: updated_at)
+
+ expect { subject.execute }.not_to change { export.updated_at }
+
+ expect(export.status).to eq(1)
+ expect(export.updated_at).to eq(updated_at)
+ end
+ end
end
context 'when exception occurs during export' do
diff --git a/spec/services/bulk_update_integration_service_spec.rb b/spec/services/bulk_update_integration_service_spec.rb
index 5e521b98482..dcc8d2df36d 100644
--- a/spec/services/bulk_update_integration_service_spec.rb
+++ b/spec/services/bulk_update_integration_service_spec.rb
@@ -9,7 +9,13 @@ RSpec.describe BulkUpdateIntegrationService do
stub_jira_integration_test
end
- let(:excluded_attributes) { %w[id project_id group_id inherit_from_id instance template created_at updated_at] }
+ let(:excluded_attributes) do
+ %w[
+ id project_id group_id inherit_from_id instance template
+ created_at updated_at encrypted_properties encrypted_properties_iv
+ ]
+ end
+
let(:batch) do
Integration.inherited_descendants_from_self_or_ancestors_from(subgroup_integration).where(id: group_integration.id..integration.id)
end
@@ -50,7 +56,9 @@ RSpec.describe BulkUpdateIntegrationService do
end
context 'with integration with data fields' do
- let(:excluded_attributes) { %w[id service_id created_at updated_at] }
+ let(:excluded_attributes) do
+ %w[id service_id created_at updated_at encrypted_properties encrypted_properties_iv]
+ end
it 'updates the data fields from the integration', :aggregate_failures do
described_class.new(subgroup_integration, batch).execute
diff --git a/spec/services/ci/after_requeue_job_service_spec.rb b/spec/services/ci/after_requeue_job_service_spec.rb
index 2f2baa15945..c9bd44f78e2 100644
--- a/spec/services/ci/after_requeue_job_service_spec.rb
+++ b/spec/services/ci/after_requeue_job_service_spec.rb
@@ -85,7 +85,7 @@ RSpec.describe Ci::AfterRequeueJobService, :sidekiq_inline do
c2: 'skipped'
)
- new_a1 = Ci::RetryBuildService.new(project, user).clone!(a1)
+ new_a1 = Ci::RetryJobService.new(project, user).clone!(a1)
new_a1.enqueue!
check_jobs_statuses(
a1: 'pending',
@@ -172,7 +172,7 @@ RSpec.describe Ci::AfterRequeueJobService, :sidekiq_inline do
c2: 'skipped'
)
- new_a1 = Ci::RetryBuildService.new(project, user).clone!(a1)
+ new_a1 = Ci::RetryJobService.new(project, user).clone!(a1)
new_a1.enqueue!
check_jobs_statuses(
a1: 'pending',
@@ -196,25 +196,6 @@ RSpec.describe Ci::AfterRequeueJobService, :sidekiq_inline do
c2: 'created'
)
end
-
- context 'when the FF ci_fix_order_of_subsequent_jobs is disabled' do
- before do
- stub_feature_flags(ci_fix_order_of_subsequent_jobs: false)
- end
-
- it 'does not mark b1 as processable' do
- execute_after_requeue_service(a1)
-
- check_jobs_statuses(
- a1: 'pending',
- a2: 'created',
- b1: 'skipped',
- b2: 'created',
- c1: 'created',
- c2: 'created'
- )
- end
- end
end
private
diff --git a/spec/services/ci/create_pipeline_service/rate_limit_spec.rb b/spec/services/ci/create_pipeline_service/rate_limit_spec.rb
new file mode 100644
index 00000000000..caea165cc6c
--- /dev/null
+++ b/spec/services/ci/create_pipeline_service/rate_limit_spec.rb
@@ -0,0 +1,91 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Ci::CreatePipelineService, :freeze_time, :clean_gitlab_redis_rate_limiting do
+ describe 'rate limiting' do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { project.first_owner }
+
+ let(:ref) { 'refs/heads/master' }
+
+ before do
+ stub_ci_pipeline_yaml_file(gitlab_ci_yaml)
+ stub_feature_flags(ci_throttle_pipelines_creation_dry_run: false)
+
+ allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits)
+ .and_return(pipelines_create: { threshold: 1, interval: 1.minute })
+ end
+
+ context 'when user is under the limit' do
+ let(:pipeline) { create_pipelines(count: 1) }
+
+ it 'allows pipeline creation' do
+ expect(pipeline).to be_created_successfully
+ expect(pipeline.statuses).not_to be_empty
+ end
+ end
+
+ context 'when user is over the limit' do
+ let(:pipeline) { create_pipelines }
+
+ it 'blocks pipeline creation' do
+ throttle_message = 'Too many pipelines created in the last minute. Try again later.'
+
+ expect(pipeline).not_to be_persisted
+ expect(pipeline.statuses).to be_empty
+ expect(pipeline.errors.added?(:base, throttle_message)).to be_truthy
+ end
+ end
+
+ context 'with different users' do
+ let(:other_user) { create(:user) }
+
+ before do
+ project.add_maintainer(other_user)
+ end
+
+ it 'allows other members to create pipelines' do
+ blocked_pipeline = create_pipelines(user: user)
+ allowed_pipeline = create_pipelines(count: 1, user: other_user)
+
+ expect(blocked_pipeline).not_to be_persisted
+ expect(allowed_pipeline).to be_created_successfully
+ end
+ end
+
+ context 'with different commits' do
+ it 'allows user to create pipeline' do
+ blocked_pipeline = create_pipelines(ref: ref)
+ allowed_pipeline = create_pipelines(count: 1, ref: 'refs/heads/feature')
+
+ expect(blocked_pipeline).not_to be_persisted
+ expect(allowed_pipeline).to be_created_successfully
+ end
+ end
+
+ context 'with different projects' do
+ let_it_be(:other_project) { create(:project, :repository) }
+
+ before do
+ other_project.add_maintainer(user)
+ end
+
+ it 'allows user to create pipeline' do
+ blocked_pipeline = create_pipelines(project: project)
+ allowed_pipeline = create_pipelines(count: 1, project: other_project)
+
+ expect(blocked_pipeline).not_to be_persisted
+ expect(allowed_pipeline).to be_created_successfully
+ end
+ end
+ end
+
+ def create_pipelines(attrs = {})
+ attrs.reverse_merge!(user: user, ref: ref, project: project, count: 2)
+
+ service = described_class.new(attrs[:project], attrs[:user], { ref: attrs[:ref] })
+
+ attrs[:count].pred.times { service.execute(:push) }
+ service.execute(:push).payload
+ end
+end
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index a7026f5062e..943d70ba142 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -12,6 +12,10 @@ RSpec.describe Ci::CreatePipelineService do
before do
stub_ci_pipeline_to_return_yaml_file
+
+ # Disable rate limiting for pipeline creation
+ allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits)
+ .and_return(pipelines_create: { threshold: 0, interval: 1.minute })
end
describe '#execute' do
@@ -526,7 +530,7 @@ RSpec.describe Ci::CreatePipelineService do
let(:ci_yaml) do
<<-EOS
image:
- name: ruby:2.7
+ name: image:1.0
ports:
- 80
EOS
@@ -538,12 +542,12 @@ RSpec.describe Ci::CreatePipelineService do
context 'in the job image' do
let(:ci_yaml) do
<<-EOS
- image: ruby:2.7
+ image: image:1.0
test:
script: rspec
image:
- name: ruby:2.7
+ name: image:1.0
ports:
- 80
EOS
@@ -555,11 +559,11 @@ RSpec.describe Ci::CreatePipelineService do
context 'in the service' do
let(:ci_yaml) do
<<-EOS
- image: ruby:2.7
+ image: image:1.0
test:
script: rspec
- image: ruby:2.7
+ image: image:1.0
services:
- name: test
ports:
diff --git a/spec/services/ci/create_web_ide_terminal_service_spec.rb b/spec/services/ci/create_web_ide_terminal_service_spec.rb
index 0804773442d..3462b48cfe7 100644
--- a/spec/services/ci/create_web_ide_terminal_service_spec.rb
+++ b/spec/services/ci/create_web_ide_terminal_service_spec.rb
@@ -60,7 +60,7 @@ RSpec.describe Ci::CreateWebIdeTerminalService do
<<-EOS
terminal:
image:
- name: ruby:2.7
+ name: image:1.0
ports:
- 80
script: rspec
diff --git a/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb b/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb
index e95a449d615..1c6963e4a31 100644
--- a/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb
+++ b/spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb
@@ -19,8 +19,23 @@ RSpec.describe Ci::JobArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_s
let!(:artifact) { create(:ci_job_artifact, :expired, job: job, locked: job.pipeline.locked) }
context 'with preloaded relationships' do
+ let(:second_artifact) { create(:ci_job_artifact, :expired, :junit, job: job) }
+
+ let(:more_artifacts) do
+ [
+ create(:ci_job_artifact, :expired, :sast, job: job),
+ create(:ci_job_artifact, :expired, :metadata, job: job),
+ create(:ci_job_artifact, :expired, :codequality, job: job),
+ create(:ci_job_artifact, :expired, :accessibility, job: job)
+ ]
+ end
+
before do
- stub_const("#{described_class}::LARGE_LOOP_LIMIT", 1)
+ stub_const("#{described_class}::LOOP_LIMIT", 1)
+
+ # This artifact-with-file is created before the control execution to ensure
+ # that the DeletedObject operations are accounted for in the query count.
+ second_artifact
end
context 'with ci_destroy_unlocked_job_artifacts feature flag disabled' do
@@ -28,19 +43,12 @@ RSpec.describe Ci::JobArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_s
stub_feature_flags(ci_destroy_unlocked_job_artifacts: false)
end
- it 'performs the smallest number of queries for job_artifacts' do
- log = ActiveRecord::QueryRecorder.new { subject }
+ it 'performs a consistent number of queries' do
+ control = ActiveRecord::QueryRecorder.new { service.execute }
- # SELECT expired ci_job_artifacts - 3 queries from each_batch
- # PRELOAD projects, routes, project_statistics
- # BEGIN
- # INSERT into ci_deleted_objects
- # DELETE loaded ci_job_artifacts
- # DELETE security_findings -- for EE
- # COMMIT
- # SELECT next expired ci_job_artifacts
+ more_artifacts
- expect(log.count).to be_within(1).of(10)
+ expect { subject }.not_to exceed_query_limit(control.count)
end
end
@@ -49,9 +57,12 @@ RSpec.describe Ci::JobArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_s
stub_feature_flags(ci_destroy_unlocked_job_artifacts: true)
end
- it 'performs the smallest number of queries for job_artifacts' do
- log = ActiveRecord::QueryRecorder.new { subject }
- expect(log.count).to be_within(1).of(8)
+ it 'performs a consistent number of queries' do
+ control = ActiveRecord::QueryRecorder.new { service.execute }
+
+ more_artifacts
+
+ expect { subject }.not_to exceed_query_limit(control.count)
end
end
end
@@ -119,7 +130,7 @@ RSpec.describe Ci::JobArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_s
let!(:artifact) { create(:ci_job_artifact, :expired, job: job, locked: job.pipeline.locked) }
before do
- stub_const("#{described_class}::LARGE_LOOP_LIMIT", 10)
+ stub_const("#{described_class}::LOOP_LIMIT", 10)
end
context 'when the import fails' do
@@ -189,8 +200,7 @@ RSpec.describe Ci::JobArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_s
context 'when loop reached loop limit' do
before do
- stub_feature_flags(ci_artifact_fast_removal_large_loop_limit: false)
- stub_const("#{described_class}::SMALL_LOOP_LIMIT", 1)
+ stub_const("#{described_class}::LOOP_LIMIT", 1)
end
it 'destroys one artifact' do
diff --git a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
index 67d664a617b..5e77041a632 100644
--- a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
+++ b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Ci::JobArtifacts::DestroyBatchService do
- let(:artifacts) { Ci::JobArtifact.where(id: [artifact_with_file.id, artifact_without_file.id]) }
+ let(:artifacts) { Ci::JobArtifact.where(id: [artifact_with_file.id, artifact_without_file.id, trace_artifact.id]) }
let(:service) { described_class.new(artifacts, pick_up_at: Time.current) }
let_it_be(:artifact_with_file, refind: true) do
@@ -18,6 +18,10 @@ RSpec.describe Ci::JobArtifacts::DestroyBatchService do
create(:ci_job_artifact)
end
+ let_it_be(:trace_artifact, refind: true) do
+ create(:ci_job_artifact, :trace, :expired)
+ end
+
describe '.execute' do
subject(:execute) { service.execute }
@@ -42,6 +46,12 @@ RSpec.describe Ci::JobArtifacts::DestroyBatchService do
execute
end
+ it 'preserves trace artifacts and removes any timestamp' do
+ expect { subject }
+ .to change { trace_artifact.reload.expire_at }.from(trace_artifact.expire_at).to(nil)
+ .and not_change { Ci::JobArtifact.exists?(trace_artifact.id) }
+ end
+
context 'ProjectStatistics' do
it 'resets project statistics' do
expect(ProjectStatistics).to receive(:increment_statistic).once
diff --git a/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb b/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb
new file mode 100644
index 00000000000..67412e41fb8
--- /dev/null
+++ b/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb
@@ -0,0 +1,145 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::JobArtifacts::UpdateUnknownLockedStatusService, :clean_gitlab_redis_shared_state do
+ include ExclusiveLeaseHelpers
+
+ let(:service) { described_class.new }
+
+ describe '.execute' do
+ subject { service.execute }
+
+ let_it_be(:locked_pipeline) { create(:ci_pipeline, :artifacts_locked) }
+ let_it_be(:pipeline) { create(:ci_pipeline, :unlocked) }
+ let_it_be(:locked_job) { create(:ci_build, :success, pipeline: locked_pipeline) }
+ let_it_be(:job) { create(:ci_build, :success, pipeline: pipeline) }
+
+ let!(:unknown_unlocked_artifact) do
+ create(:ci_job_artifact, :junit, expire_at: 1.hour.ago, job: job, locked: Ci::JobArtifact.lockeds[:unknown])
+ end
+
+ let!(:unknown_locked_artifact) do
+ create(:ci_job_artifact, :lsif,
+ expire_at: 1.day.ago,
+ job: locked_job,
+ locked: Ci::JobArtifact.lockeds[:unknown]
+ )
+ end
+
+ let!(:unlocked_artifact) do
+ create(:ci_job_artifact, :archive, expire_at: 1.hour.ago, job: job, locked: Ci::JobArtifact.lockeds[:unlocked])
+ end
+
+ let!(:locked_artifact) do
+ create(:ci_job_artifact, :sast, :raw,
+ expire_at: 1.day.ago,
+ job: locked_job,
+ locked: Ci::JobArtifact.lockeds[:artifacts_locked]
+ )
+ end
+
+ context 'when artifacts are expired' do
+ it 'sets artifact_locked when the pipeline is locked' do
+ expect { service.execute }
+ .to change { unknown_locked_artifact.reload.locked }.from('unknown').to('artifacts_locked')
+ .and not_change { Ci::JobArtifact.exists?(locked_artifact.id) }
+ end
+
+ it 'destroys the artifact when the pipeline is unlocked' do
+ expect { subject }.to change { Ci::JobArtifact.exists?(unknown_unlocked_artifact.id) }.from(true).to(false)
+ end
+
+ it 'does not update ci_job_artifact rows with known locked values' do
+ expect { service.execute }
+ .to not_change(locked_artifact, :attributes)
+ .and not_change { Ci::JobArtifact.exists?(locked_artifact.id) }
+ .and not_change(unlocked_artifact, :attributes)
+ .and not_change { Ci::JobArtifact.exists?(unlocked_artifact.id) }
+ end
+
+ it 'logs the counts of affected artifacts' do
+ expect(subject).to eq({ removed: 1, locked: 1 })
+ end
+ end
+
+ context 'in a single iteration' do
+ before do
+ stub_const("#{described_class}::BATCH_SIZE", 1)
+ end
+
+ context 'due to the LOOP_TIMEOUT' do
+ before do
+ stub_const("#{described_class}::LOOP_TIMEOUT", 0.seconds)
+ end
+
+ it 'affects the earliest expired artifact first' do
+ subject
+
+ expect(unknown_locked_artifact.reload.locked).to eq('artifacts_locked')
+ expect(unknown_unlocked_artifact.reload.locked).to eq('unknown')
+ end
+
+ it 'reports the number of destroyed artifacts' do
+ is_expected.to eq({ removed: 0, locked: 1 })
+ end
+ end
+
+ context 'due to @loop_limit' do
+ before do
+ stub_const("#{described_class}::LARGE_LOOP_LIMIT", 1)
+ end
+
+ it 'affects the most recently expired artifact first' do
+ subject
+
+ expect(unknown_locked_artifact.reload.locked).to eq('artifacts_locked')
+ expect(unknown_unlocked_artifact.reload.locked).to eq('unknown')
+ end
+
+ it 'reports the number of destroyed artifacts' do
+ is_expected.to eq({ removed: 0, locked: 1 })
+ end
+ end
+ end
+
+ context 'when artifact is not expired' do
+ let!(:unknown_unlocked_artifact) do
+ create(:ci_job_artifact, :junit,
+ expire_at: 1.year.from_now,
+ job: job,
+ locked: Ci::JobArtifact.lockeds[:unknown]
+ )
+ end
+
+ it 'does not change the locked status' do
+ expect { service.execute }.not_to change { unknown_unlocked_artifact.locked }
+ expect(Ci::JobArtifact.exists?(unknown_unlocked_artifact.id)).to eq(true)
+ end
+ end
+
+ context 'when exclusive lease has already been taken by the other instance' do
+ before do
+ stub_exclusive_lease_taken(described_class::EXCLUSIVE_LOCK_KEY, timeout: described_class::LOCK_TIMEOUT)
+ end
+
+ it 'raises an error and' do
+ expect { subject }.to raise_error(Gitlab::ExclusiveLeaseHelpers::FailedToObtainLockError)
+ end
+ end
+
+ context 'when there are no unknown status artifacts' do
+ before do
+ Ci::JobArtifact.update_all(locked: :unlocked)
+ end
+
+ it 'does not raise error' do
+ expect { subject }.not_to raise_error
+ end
+
+ it 'reports the number of destroyed artifacts' do
+ is_expected.to eq({ removed: 0, locked: 0 })
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb b/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb
index 7365ad162d2..5bc508447c1 100644
--- a/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb
+++ b/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb
@@ -725,7 +725,7 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService do
expect(builds_names).to eq ['build:1', 'build:2', 'test:1', 'test:2']
- Ci::Build.retry(pipeline.builds.find_by(name: 'test:2'), user).reset.success!
+ Ci::RetryJobService.new(pipeline.project, user).execute(pipeline.builds.find_by(name: 'test:2'))[:job].reset.success!
expect(builds_names).to eq ['build:1', 'build:2', 'test:1', 'test:2',
'test:2', 'deploy:1', 'deploy:2']
@@ -1111,11 +1111,11 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService do
end
def enqueue_scheduled(name)
- builds.scheduled.find_by(name: name).enqueue_scheduled
+ builds.scheduled.find_by(name: name).enqueue!
end
def retry_build(name)
- Ci::Build.retry(builds.find_by(name: name), user)
+ Ci::RetryJobService.new(project, user).execute(builds.find_by(name: name))
end
def manual_actions
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index 245118e71fa..74adbc4efc8 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -103,6 +103,20 @@ module Ci
pending_job.create_queuing_entry!
end
+ context 'when build owner has been blocked' do
+ let(:user) { create(:user, :blocked) }
+
+ before do
+ pending_job.update!(user: user)
+ end
+
+ it 'does not pick the build and drops the build' do
+ expect(execute(shared_runner)).to be_falsey
+
+ expect(pending_job.reload).to be_user_blocked
+ end
+ end
+
context 'for multiple builds' do
let!(:project2) { create :project, shared_runners_enabled: true }
let!(:pipeline2) { create :ci_pipeline, project: project2 }
diff --git a/spec/services/ci/retry_build_service_spec.rb b/spec/services/ci/retry_build_service_spec.rb
deleted file mode 100644
index 2421fd56c47..00000000000
--- a/spec/services/ci/retry_build_service_spec.rb
+++ /dev/null
@@ -1,397 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Ci::RetryBuildService do
- let_it_be(:reporter) { create(:user) }
- let_it_be(:developer) { create(:user) }
- let_it_be(:project) { create(:project, :repository) }
- let_it_be(:pipeline) do
- create(:ci_pipeline, project: project,
- sha: 'b83d6e391c22777fca1ed3012fce84f633d7fed0')
- end
-
- let_it_be(:stage) do
- create(:ci_stage_entity, project: project,
- pipeline: pipeline,
- name: 'test')
- end
-
- let_it_be_with_refind(:build) { create(:ci_build, pipeline: pipeline, stage_id: stage.id) }
-
- let(:user) { developer }
-
- let(:service) do
- described_class.new(project, user)
- end
-
- before_all do
- project.add_developer(developer)
- project.add_reporter(reporter)
- end
-
- clone_accessors = described_class.clone_accessors.without(described_class.extra_accessors)
-
- reject_accessors =
- %i[id status user token token_encrypted coverage trace runner
- artifacts_expire_at
- created_at updated_at started_at finished_at queued_at erased_by
- erased_at auto_canceled_by job_artifacts job_artifacts_archive
- job_artifacts_metadata job_artifacts_trace job_artifacts_junit
- job_artifacts_sast job_artifacts_secret_detection job_artifacts_dependency_scanning
- job_artifacts_container_scanning job_artifacts_cluster_image_scanning job_artifacts_dast
- job_artifacts_license_scanning
- job_artifacts_performance job_artifacts_browser_performance job_artifacts_load_performance
- job_artifacts_lsif job_artifacts_terraform job_artifacts_cluster_applications
- job_artifacts_codequality job_artifacts_metrics scheduled_at
- job_variables waiting_for_resource_at job_artifacts_metrics_referee
- job_artifacts_network_referee job_artifacts_dotenv
- job_artifacts_cobertura needs job_artifacts_accessibility
- job_artifacts_requirements job_artifacts_coverage_fuzzing
- job_artifacts_api_fuzzing terraform_state_versions].freeze
-
- ignore_accessors =
- %i[type lock_version target_url base_tags trace_sections
- commit_id deployment erased_by_id project_id
- runner_id tag_taggings taggings tags trigger_request_id
- user_id auto_canceled_by_id retried failure_reason
- sourced_pipelines artifacts_file_store artifacts_metadata_store
- metadata runner_session trace_chunks upstream_pipeline_id
- artifacts_file artifacts_metadata artifacts_size commands
- resource resource_group_id processed security_scans author
- pipeline_id report_results pending_state pages_deployments
- queuing_entry runtime_metadata trace_metadata
- dast_site_profile dast_scanner_profile].freeze
-
- shared_examples 'build duplication' do
- let_it_be(:another_pipeline) { create(:ci_empty_pipeline, project: project) }
-
- let_it_be(:build) do
- create(:ci_build, :failed, :picked, :expired, :erased, :queued, :coverage, :tags,
- :allowed_to_fail, :on_tag, :triggered, :teardown_environment, :resource_group,
- description: 'my-job', stage: 'test', stage_id: stage.id,
- pipeline: pipeline, auto_canceled_by: another_pipeline,
- scheduled_at: 10.seconds.since)
- end
-
- let_it_be(:internal_job_variable) { create(:ci_job_variable, job: build) }
-
- before_all do
- # Make sure that build has both `stage_id` and `stage` because FactoryBot
- # can reset one of the fields when assigning another. We plan to deprecate
- # and remove legacy `stage` column in the future.
- build.update!(stage: 'test', stage_id: stage.id)
-
- # Make sure we have one instance for every possible job_artifact_X
- # associations to check they are correctly rejected on build duplication.
- Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.each do |file_type, file_format|
- create(:ci_job_artifact, file_format,
- file_type: file_type, job: build, expire_at: build.artifacts_expire_at)
- end
-
- create(:ci_job_variable, :dotenv_source, job: build)
- create(:ci_build_need, build: build)
- create(:terraform_state_version, build: build)
- end
-
- describe 'clone accessors' do
- let(:forbidden_associations) do
- Ci::Build.reflect_on_all_associations.each_with_object(Set.new) do |assoc, memo|
- memo << assoc.name unless assoc.macro == :belongs_to
- end
- end
-
- clone_accessors.each do |attribute|
- it "clones #{attribute} build attribute", :aggregate_failures do
- expect(attribute).not_to be_in(forbidden_associations), "association #{attribute} must be `belongs_to`"
- expect(build.send(attribute)).not_to be_nil
- expect(new_build.send(attribute)).not_to be_nil
- expect(new_build.send(attribute)).to eq build.send(attribute)
- end
- end
-
- context 'when job has nullified protected' do
- before do
- build.update_attribute(:protected, nil)
- end
-
- it "clones protected build attribute" do
- expect(new_build.protected).to be_nil
- expect(new_build.protected).to eq build.protected
- end
- end
-
- it 'clones only the needs attributes' do
- expect(new_build.needs.exists?).to be_truthy
- expect(build.needs.exists?).to be_truthy
-
- expect(new_build.needs_attributes).to match(build.needs_attributes)
- expect(new_build.needs).not_to match(build.needs)
- end
-
- it 'clones only internal job variables' do
- expect(new_build.job_variables.count).to eq(1)
- expect(new_build.job_variables).to contain_exactly(having_attributes(key: internal_job_variable.key, value: internal_job_variable.value))
- end
- end
-
- describe 'reject accessors' do
- reject_accessors.each do |attribute|
- it "does not clone #{attribute} build attribute" do
- expect(new_build.send(attribute)).not_to eq build.send(attribute)
- end
- end
- end
-
- it 'has correct number of known attributes', :aggregate_failures do
- processed_accessors = clone_accessors + reject_accessors
- known_accessors = processed_accessors + ignore_accessors
-
- # :tag_list is a special case, this accessor does not exist
- # in reflected associations, comes from `act_as_taggable` and
- # we use it to copy tags, instead of reusing tags.
- #
- current_accessors =
- Ci::Build.attribute_names.map(&:to_sym) +
- Ci::Build.attribute_aliases.keys.map(&:to_sym) +
- Ci::Build.reflect_on_all_associations.map(&:name) +
- [:tag_list, :needs_attributes, :job_variables_attributes] -
- # ee-specific accessors should be tested in ee/spec/services/ci/retry_build_service_spec.rb instead
- described_class.extra_accessors -
- [:dast_site_profiles_build, :dast_scanner_profiles_build] # join tables
-
- current_accessors.uniq!
-
- expect(current_accessors).to include(*processed_accessors)
- expect(known_accessors).to include(*current_accessors)
- end
- end
-
- describe '#execute' do
- let(:new_build) do
- travel_to(1.second.from_now) do
- service.execute(build)
- end
- end
-
- context 'when user has ability to execute build' do
- before do
- stub_not_protect_default_branch
- end
-
- it_behaves_like 'build duplication'
-
- it 'creates a new build that represents the old one' do
- expect(new_build.name).to eq build.name
- end
-
- it 'enqueues the new build' do
- expect(new_build).to be_pending
- end
-
- context 'when there are subsequent processables that are skipped' do
- let!(:subsequent_build) do
- create(:ci_build, :skipped, stage_idx: 2,
- pipeline: pipeline,
- stage: 'deploy')
- end
-
- let!(:subsequent_bridge) do
- create(:ci_bridge, :skipped, stage_idx: 2,
- pipeline: pipeline,
- stage: 'deploy')
- end
-
- it 'resumes pipeline processing in the subsequent stage' do
- service.execute(build)
-
- expect(subsequent_build.reload).to be_created
- expect(subsequent_bridge.reload).to be_created
- end
-
- it 'updates ownership for subsequent builds' do
- expect { service.execute(build) }.to change { subsequent_build.reload.user }.to(user)
- end
-
- it 'updates ownership for subsequent bridges' do
- expect { service.execute(build) }.to change { subsequent_bridge.reload.user }.to(user)
- end
-
- it 'does not cause n+1 when updaing build ownership' do
- control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { service.execute(build) }.count
-
- create_list(:ci_build, 2, :skipped, stage_idx: build.stage_idx + 1, pipeline: pipeline, stage: 'deploy')
-
- expect { service.execute(build) }.not_to exceed_all_query_limit(control_count)
- end
- end
-
- context 'when pipeline has other builds' do
- let!(:stage2) { create(:ci_stage_entity, project: project, pipeline: pipeline, name: 'deploy') }
- let!(:build2) { create(:ci_build, pipeline: pipeline, stage_id: stage.id ) }
- let!(:deploy) { create(:ci_build, pipeline: pipeline, stage_id: stage2.id) }
- let!(:deploy_needs_build2) { create(:ci_build_need, build: deploy, name: build2.name) }
-
- context 'when build has nil scheduling_type' do
- before do
- build.pipeline.processables.update_all(scheduling_type: nil)
- build.reload
- end
-
- it 'populates scheduling_type of processables' do
- expect(new_build.scheduling_type).to eq('stage')
- expect(build.reload.scheduling_type).to eq('stage')
- expect(build2.reload.scheduling_type).to eq('stage')
- expect(deploy.reload.scheduling_type).to eq('dag')
- end
- end
-
- context 'when build has scheduling_type' do
- it 'does not call populate_scheduling_type!' do
- expect_any_instance_of(Ci::Pipeline).not_to receive(:ensure_scheduling_type!)
-
- expect(new_build.scheduling_type).to eq('stage')
- end
- end
- end
-
- context 'when the pipeline is a child pipeline and the bridge is depended' do
- let!(:parent_pipeline) { create(:ci_pipeline, project: project) }
- let!(:bridge) { create(:ci_bridge, :strategy_depend, pipeline: parent_pipeline, status: 'success') }
- let!(:source_pipeline) { create(:ci_sources_pipeline, pipeline: pipeline, source_job: bridge) }
-
- it 'marks source bridge as pending' do
- service.execute(build)
-
- expect(bridge.reload).to be_pending
- end
- end
-
- context 'when there is a failed job todo for the MR' do
- let!(:merge_request) { create(:merge_request, source_project: project, author: user, head_pipeline: pipeline) }
- let!(:todo) { create(:todo, :build_failed, user: user, project: project, author: user, target: merge_request) }
-
- it 'resolves the todo for the old failed build' do
- expect do
- service.execute(build)
- end.to change { todo.reload.state }.from('pending').to('done')
- end
- end
- end
-
- context 'when user does not have ability to execute build' do
- let(:user) { reporter }
-
- it 'raises an error' do
- expect { service.execute(build) }
- .to raise_error Gitlab::Access::AccessDeniedError
- end
- end
- end
-
- describe '#clone!' do
- let(:new_build) do
- travel_to(1.second.from_now) do
- 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
- end
-
- it_behaves_like 'build duplication'
-
- it 'creates a new build that represents the old one' do
- expect(new_build.name).to eq build.name
- end
-
- it 'does not enqueue the new build' do
- expect(new_build).to be_created
- expect(new_build).not_to be_processed
- end
-
- it 'does mark old build as retried' do
- expect(new_build).to be_latest
- expect(build).to be_retried
- expect(build).to be_processed
- end
-
- shared_examples_for 'when build with deployment is retried' do
- let!(:build) do
- create(:ci_build, :with_deployment, :deploy_to_production,
- pipeline: pipeline, stage_id: stage.id, project: project)
- end
-
- it 'creates a new deployment' do
- expect { new_build }.to change { Deployment.count }.by(1)
- end
-
- it 'persists expanded environment name' do
- expect(new_build.metadata.expanded_environment_name).to eq('production')
- end
-
- it 'does not create a new environment' do
- expect { new_build }.not_to change { Environment.count }
- end
- end
-
- shared_examples_for 'when build with dynamic environment is retried' do
- let_it_be(:other_developer) { create(:user).tap { |u| project.add_developer(other_developer) } }
-
- let(:environment_name) { 'review/$CI_COMMIT_REF_SLUG-$GITLAB_USER_ID' }
-
- let!(:build) do
- create(:ci_build, :with_deployment, environment: environment_name,
- options: { environment: { name: environment_name } },
- pipeline: pipeline, stage_id: stage.id, project: project,
- user: other_developer)
- end
-
- it 're-uses the previous persisted environment' do
- expect(build.persisted_environment.name).to eq("review/#{build.ref}-#{other_developer.id}")
-
- expect(new_build.persisted_environment.name).to eq("review/#{build.ref}-#{other_developer.id}")
- end
-
- it 'creates a new deployment' do
- expect { new_build }.to change { Deployment.count }.by(1)
- end
-
- it 'does not create a new environment' do
- expect { new_build }.not_to change { Environment.count }
- end
- end
-
- it_behaves_like 'when build with deployment is retried'
- it_behaves_like 'when build with dynamic environment is retried'
-
- context 'when build has needs' do
- before do
- create(:ci_build_need, build: build, name: 'build1')
- create(:ci_build_need, build: build, name: 'build2')
- end
-
- it 'bulk inserts all needs' do
- expect(Ci::BuildNeed).to receive(:bulk_insert!).and_call_original
-
- new_build
- end
- end
- end
-
- context 'when user does not have ability to execute build' do
- let(:user) { reporter }
-
- it 'raises an error' do
- expect { service.clone!(build) }
- .to raise_error Gitlab::Access::AccessDeniedError
- end
- end
- end
-end
diff --git a/spec/services/ci/retry_job_service_spec.rb b/spec/services/ci/retry_job_service_spec.rb
new file mode 100644
index 00000000000..25aab73ab01
--- /dev/null
+++ b/spec/services/ci/retry_job_service_spec.rb
@@ -0,0 +1,413 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::RetryJobService do
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:pipeline) do
+ create(:ci_pipeline, project: project,
+ sha: 'b83d6e391c22777fca1ed3012fce84f633d7fed0')
+ end
+
+ let_it_be(:stage) do
+ create(:ci_stage_entity, project: project,
+ pipeline: pipeline,
+ name: 'test')
+ end
+
+ let_it_be_with_refind(:build) { create(:ci_build, :success, pipeline: pipeline, stage_id: stage.id) }
+
+ let(:user) { developer }
+
+ let(:service) do
+ described_class.new(project, user)
+ end
+
+ before_all do
+ project.add_developer(developer)
+ project.add_reporter(reporter)
+ end
+
+ clone_accessors = ::Ci::Build.clone_accessors.without(::Ci::Build.extra_accessors)
+
+ reject_accessors =
+ %i[id status user token token_encrypted coverage trace runner
+ artifacts_expire_at
+ created_at updated_at started_at finished_at queued_at erased_by
+ erased_at auto_canceled_by job_artifacts job_artifacts_archive
+ job_artifacts_metadata job_artifacts_trace job_artifacts_junit
+ job_artifacts_sast job_artifacts_secret_detection job_artifacts_dependency_scanning
+ job_artifacts_container_scanning job_artifacts_cluster_image_scanning job_artifacts_dast
+ job_artifacts_license_scanning
+ job_artifacts_performance job_artifacts_browser_performance job_artifacts_load_performance
+ job_artifacts_lsif job_artifacts_terraform job_artifacts_cluster_applications
+ job_artifacts_codequality job_artifacts_metrics scheduled_at
+ job_variables waiting_for_resource_at job_artifacts_metrics_referee
+ job_artifacts_network_referee job_artifacts_dotenv
+ job_artifacts_cobertura needs job_artifacts_accessibility
+ job_artifacts_requirements job_artifacts_coverage_fuzzing
+ job_artifacts_api_fuzzing terraform_state_versions].freeze
+
+ ignore_accessors =
+ %i[type lock_version target_url base_tags trace_sections
+ commit_id deployment erased_by_id project_id
+ runner_id tag_taggings taggings tags trigger_request_id
+ user_id auto_canceled_by_id retried failure_reason
+ sourced_pipelines artifacts_file_store artifacts_metadata_store
+ metadata runner_session trace_chunks upstream_pipeline_id
+ artifacts_file artifacts_metadata artifacts_size commands
+ resource resource_group_id processed security_scans author
+ pipeline_id report_results pending_state pages_deployments
+ queuing_entry runtime_metadata trace_metadata
+ dast_site_profile dast_scanner_profile].freeze
+
+ shared_examples 'build duplication' do
+ let_it_be(:another_pipeline) { create(:ci_empty_pipeline, project: project) }
+
+ let_it_be(:build) do
+ create(:ci_build, :failed, :picked, :expired, :erased, :queued, :coverage, :tags,
+ :allowed_to_fail, :on_tag, :triggered, :teardown_environment, :resource_group,
+ description: 'my-job', stage: 'test', stage_id: stage.id,
+ pipeline: pipeline, auto_canceled_by: another_pipeline,
+ scheduled_at: 10.seconds.since)
+ end
+
+ let_it_be(:internal_job_variable) { create(:ci_job_variable, job: build) }
+
+ before_all do
+ # Make sure that build has both `stage_id` and `stage` because FactoryBot
+ # can reset one of the fields when assigning another. We plan to deprecate
+ # and remove legacy `stage` column in the future.
+ build.update!(stage: 'test', stage_id: stage.id)
+
+ # Make sure we have one instance for every possible job_artifact_X
+ # associations to check they are correctly rejected on build duplication.
+ Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.each do |file_type, file_format|
+ create(:ci_job_artifact, file_format,
+ file_type: file_type, job: build, expire_at: build.artifacts_expire_at)
+ end
+
+ create(:ci_job_variable, :dotenv_source, job: build)
+ create(:ci_build_need, build: build)
+ create(:terraform_state_version, build: build)
+ end
+
+ before do
+ build.update!(retried: false, status: :success)
+ end
+
+ describe 'clone accessors' do
+ let(:forbidden_associations) do
+ Ci::Build.reflect_on_all_associations.each_with_object(Set.new) do |assoc, memo|
+ memo << assoc.name unless assoc.macro == :belongs_to
+ end
+ end
+
+ clone_accessors.each do |attribute|
+ it "clones #{attribute} build attribute", :aggregate_failures do
+ expect(attribute).not_to be_in(forbidden_associations), "association #{attribute} must be `belongs_to`"
+ expect(build.send(attribute)).not_to be_nil
+ expect(new_build.send(attribute)).not_to be_nil
+ expect(new_build.send(attribute)).to eq build.send(attribute)
+ end
+ end
+
+ context 'when job has nullified protected' do
+ before do
+ build.update_attribute(:protected, nil)
+ end
+
+ it "clones protected build attribute" do
+ expect(new_build.protected).to be_nil
+ expect(new_build.protected).to eq build.protected
+ end
+ end
+
+ it 'clones only the needs attributes' do
+ expect(new_build.needs.exists?).to be_truthy
+ expect(build.needs.exists?).to be_truthy
+
+ expect(new_build.needs_attributes).to match(build.needs_attributes)
+ expect(new_build.needs).not_to match(build.needs)
+ end
+
+ it 'clones only internal job variables' do
+ expect(new_build.job_variables.count).to eq(1)
+ expect(new_build.job_variables).to contain_exactly(having_attributes(key: internal_job_variable.key, value: internal_job_variable.value))
+ end
+ end
+
+ describe 'reject accessors' do
+ reject_accessors.each do |attribute|
+ it "does not clone #{attribute} build attribute" do
+ expect(new_build.send(attribute)).not_to eq build.send(attribute)
+ end
+ end
+ end
+
+ it 'has correct number of known attributes', :aggregate_failures do
+ processed_accessors = clone_accessors + reject_accessors
+ known_accessors = processed_accessors + ignore_accessors
+
+ # :tag_list is a special case, this accessor does not exist
+ # in reflected associations, comes from `act_as_taggable` and
+ # we use it to copy tags, instead of reusing tags.
+ #
+ current_accessors =
+ Ci::Build.attribute_names.map(&:to_sym) +
+ Ci::Build.attribute_aliases.keys.map(&:to_sym) +
+ Ci::Build.reflect_on_all_associations.map(&:name) +
+ [:tag_list, :needs_attributes, :job_variables_attributes] -
+ # ee-specific accessors should be tested in ee/spec/services/ci/retry_job_service_spec.rb instead
+ Ci::Build.extra_accessors -
+ [:dast_site_profiles_build, :dast_scanner_profiles_build] # join tables
+
+ current_accessors.uniq!
+
+ expect(current_accessors).to include(*processed_accessors)
+ expect(known_accessors).to include(*current_accessors)
+ end
+ end
+
+ describe '#execute' do
+ let(:new_build) do
+ travel_to(1.second.from_now) do
+ service.execute(build)[:job]
+ end
+ end
+
+ context 'when user has ability to execute build' do
+ before do
+ stub_not_protect_default_branch
+ end
+
+ it_behaves_like 'build duplication'
+
+ it 'creates a new build that represents the old one' do
+ expect(new_build.name).to eq build.name
+ end
+
+ it 'enqueues the new build' do
+ expect(new_build).to be_pending
+ end
+
+ context 'when there are subsequent processables that are skipped' do
+ let!(:subsequent_build) do
+ create(:ci_build, :skipped, stage_idx: 2,
+ pipeline: pipeline,
+ stage: 'deploy')
+ end
+
+ let!(:subsequent_bridge) do
+ create(:ci_bridge, :skipped, stage_idx: 2,
+ pipeline: pipeline,
+ stage: 'deploy')
+ end
+
+ it 'resumes pipeline processing in the subsequent stage' do
+ service.execute(build)
+
+ expect(subsequent_build.reload).to be_created
+ expect(subsequent_bridge.reload).to be_created
+ end
+
+ it 'updates ownership for subsequent builds' do
+ expect { service.execute(build) }.to change { subsequent_build.reload.user }.to(user)
+ end
+
+ it 'updates ownership for subsequent bridges' do
+ expect { service.execute(build) }.to change { subsequent_bridge.reload.user }.to(user)
+ end
+
+ it 'does not cause n+1 when updaing build ownership' do
+ control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { service.execute(build) }.count
+
+ create_list(:ci_build, 2, :skipped, stage_idx: build.stage_idx + 1, pipeline: pipeline, stage: 'deploy')
+
+ expect { service.execute(build) }.not_to exceed_all_query_limit(control_count)
+ end
+ end
+
+ context 'when pipeline has other builds' do
+ let!(:stage2) { create(:ci_stage_entity, project: project, pipeline: pipeline, name: 'deploy') }
+ let!(:build2) { create(:ci_build, pipeline: pipeline, stage_id: stage.id ) }
+ let!(:deploy) { create(:ci_build, pipeline: pipeline, stage_id: stage2.id) }
+ let!(:deploy_needs_build2) { create(:ci_build_need, build: deploy, name: build2.name) }
+
+ context 'when build has nil scheduling_type' do
+ before do
+ build.pipeline.processables.update_all(scheduling_type: nil)
+ build.reload
+ end
+
+ it 'populates scheduling_type of processables' do
+ expect(new_build.scheduling_type).to eq('stage')
+ expect(build.reload.scheduling_type).to eq('stage')
+ expect(build2.reload.scheduling_type).to eq('stage')
+ expect(deploy.reload.scheduling_type).to eq('dag')
+ end
+ end
+
+ context 'when build has scheduling_type' do
+ it 'does not call populate_scheduling_type!' do
+ expect_any_instance_of(Ci::Pipeline).not_to receive(:ensure_scheduling_type!) # rubocop: disable RSpec/AnyInstanceOf
+
+ expect(new_build.scheduling_type).to eq('stage')
+ end
+ end
+ end
+
+ context 'when the pipeline is a child pipeline and the bridge is depended' do
+ let!(:parent_pipeline) { create(:ci_pipeline, project: project) }
+ let!(:bridge) { create(:ci_bridge, :strategy_depend, pipeline: parent_pipeline, status: 'success') }
+ let!(:source_pipeline) { create(:ci_sources_pipeline, pipeline: pipeline, source_job: bridge) }
+
+ it 'marks source bridge as pending' do
+ service.execute(build)
+
+ expect(bridge.reload).to be_pending
+ end
+ end
+
+ context 'when there is a failed job todo for the MR' do
+ let!(:merge_request) { create(:merge_request, source_project: project, author: user, head_pipeline: pipeline) }
+ let!(:todo) { create(:todo, :build_failed, user: user, project: project, author: user, target: merge_request) }
+
+ it 'resolves the todo for the old failed build' do
+ expect do
+ service.execute(build)
+ end.to change { todo.reload.state }.from('pending').to('done')
+ end
+ end
+ end
+
+ context 'when user does not have ability to execute build' do
+ let(:user) { reporter }
+
+ it 'raises an error' do
+ expect { service.execute(build) }
+ .to raise_error Gitlab::Access::AccessDeniedError
+ end
+
+ context 'when the job is not retryable' do
+ let(:build) { create(:ci_build, :created, pipeline: pipeline) }
+
+ it 'returns a ServiceResponse error' do
+ response = service.execute(build)
+
+ expect(response).to be_a(ServiceResponse)
+ expect(response).to be_error
+ expect(response.message).to eq("Job cannot be retried")
+ end
+ end
+ end
+ end
+
+ describe '#clone!' do
+ let(:new_build) do
+ travel_to(1.second.from_now) do
+ 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
+ end
+
+ it_behaves_like 'build duplication'
+
+ it 'creates a new build that represents the old one' do
+ expect(new_build.name).to eq build.name
+ end
+
+ it 'does not enqueue the new build' do
+ expect(new_build).to be_created
+ expect(new_build).not_to be_processed
+ end
+
+ it 'does mark old build as retried' do
+ expect(new_build).to be_latest
+ expect(build).to be_retried
+ expect(build).to be_processed
+ end
+
+ shared_examples_for 'when build with deployment is retried' do
+ let!(:build) do
+ create(:ci_build, :with_deployment, :deploy_to_production,
+ pipeline: pipeline, stage_id: stage.id, project: project)
+ end
+
+ it 'creates a new deployment' do
+ expect { new_build }.to change { Deployment.count }.by(1)
+ end
+
+ it 'persists expanded environment name' do
+ expect(new_build.metadata.expanded_environment_name).to eq('production')
+ end
+
+ it 'does not create a new environment' do
+ expect { new_build }.not_to change { Environment.count }
+ end
+ end
+
+ shared_examples_for 'when build with dynamic environment is retried' do
+ let_it_be(:other_developer) { create(:user).tap { |u| project.add_developer(u) } }
+
+ let(:environment_name) { 'review/$CI_COMMIT_REF_SLUG-$GITLAB_USER_ID' }
+
+ let!(:build) do
+ create(:ci_build, :with_deployment, environment: environment_name,
+ options: { environment: { name: environment_name } },
+ pipeline: pipeline, stage_id: stage.id, project: project,
+ user: other_developer)
+ end
+
+ it 're-uses the previous persisted environment' do
+ expect(build.persisted_environment.name).to eq("review/#{build.ref}-#{other_developer.id}")
+
+ expect(new_build.persisted_environment.name).to eq("review/#{build.ref}-#{other_developer.id}")
+ end
+
+ it 'creates a new deployment' do
+ expect { new_build }.to change { Deployment.count }.by(1)
+ end
+
+ it 'does not create a new environment' do
+ expect { new_build }.not_to change { Environment.count }
+ end
+ end
+
+ it_behaves_like 'when build with deployment is retried'
+ it_behaves_like 'when build with dynamic environment is retried'
+
+ context 'when build has needs' do
+ before do
+ create(:ci_build_need, build: build, name: 'build1')
+ create(:ci_build_need, build: build, name: 'build2')
+ end
+
+ it 'bulk inserts all needs' do
+ expect(Ci::BuildNeed).to receive(:bulk_insert!).and_call_original
+
+ new_build
+ end
+ end
+ end
+
+ context 'when user does not have ability to execute build' do
+ let(:user) { reporter }
+
+ it 'raises an error' do
+ expect { service.clone!(build) }
+ .to raise_error Gitlab::Access::AccessDeniedError
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/retry_pipeline_service_spec.rb b/spec/services/ci/retry_pipeline_service_spec.rb
index df1e159b5c0..24272801480 100644
--- a/spec/services/ci/retry_pipeline_service_spec.rb
+++ b/spec/services/ci/retry_pipeline_service_spec.rb
@@ -340,7 +340,7 @@ RSpec.describe Ci::RetryPipelineService, '#execute' do
context 'when user is not allowed to retry build' do
before do
build = create(:ci_build, pipeline: pipeline, status: :failed)
- allow_next_instance_of(Ci::RetryBuildService) do |service|
+ allow_next_instance_of(Ci::RetryJobService) do |service|
allow(service).to receive(:can?).with(user, :update_build, build).and_return(false)
end
end
diff --git a/spec/services/database/consistency_check_service_spec.rb b/spec/services/database/consistency_check_service_spec.rb
new file mode 100644
index 00000000000..2e642451432
--- /dev/null
+++ b/spec/services/database/consistency_check_service_spec.rb
@@ -0,0 +1,154 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Database::ConsistencyCheckService do
+ let(:batch_size) { 5 }
+ let(:max_batches) { 2 }
+
+ before do
+ stub_const("Gitlab::Database::ConsistencyChecker::BATCH_SIZE", batch_size)
+ stub_const("Gitlab::Database::ConsistencyChecker::MAX_BATCHES", max_batches)
+ end
+
+ after do
+ redis_shared_state_cleanup!
+ end
+
+ subject(:consistency_check_service) do
+ described_class.new(
+ source_model: Namespace,
+ target_model: Ci::NamespaceMirror,
+ source_columns: %w[id traversal_ids],
+ target_columns: %w[namespace_id traversal_ids]
+ )
+ end
+
+ describe '#random_start_id' do
+ let(:batch_size) { 5 }
+
+ before do
+ create_list(:namespace, 50) # This will also create Ci::NameSpaceMirror objects
+ end
+
+ it 'generates a random start_id within the records ids' do
+ 10.times do
+ start_id = subject.send(:random_start_id)
+ expect(start_id).to be_between(Namespace.first.id, Namespace.last.id).inclusive
+ end
+ end
+ end
+
+ describe '#execute' do
+ let(:empty_results) do
+ { batches: 0, matches: 0, mismatches: 0, mismatches_details: [] }
+ end
+
+ context 'when empty tables' do
+ it 'returns results with zero counters' do
+ result = consistency_check_service.execute
+
+ expect(result).to eq(empty_results)
+ end
+
+ it 'does not call the ConsistencyCheckService' do
+ expect(Gitlab::Database::ConsistencyChecker).not_to receive(:new)
+ consistency_check_service.execute
+ end
+ end
+
+ context 'no cursor has been saved before' do
+ let(:selected_start_id) { Namespace.order(:id).limit(5).pluck(:id).last }
+ let(:expected_next_start_id) { selected_start_id + batch_size * max_batches }
+
+ before do
+ create_list(:namespace, 50) # This will also create Ci::NameSpaceMirror objects
+ expect(consistency_check_service).to receive(:random_start_id).and_return(selected_start_id)
+ end
+
+ it 'picks a random start_id' do
+ expected_result = {
+ batches: 2,
+ matches: 10,
+ mismatches: 0,
+ mismatches_details: [],
+ start_id: selected_start_id,
+ next_start_id: expected_next_start_id
+ }
+ expect(consistency_check_service.execute).to eq(expected_result)
+ end
+
+ it 'calls the ConsistencyCheckService with the expected parameters' do
+ allow_next_instance_of(Gitlab::Database::ConsistencyChecker) do |instance|
+ expect(instance).to receive(:execute).with(start_id: selected_start_id).and_return({
+ batches: 2,
+ next_start_id: expected_next_start_id,
+ matches: 10,
+ mismatches: 0,
+ mismatches_details: []
+ })
+ end
+
+ expect(Gitlab::Database::ConsistencyChecker).to receive(:new).with(
+ source_model: Namespace,
+ target_model: Ci::NamespaceMirror,
+ source_columns: %w[id traversal_ids],
+ target_columns: %w[namespace_id traversal_ids]
+ ).and_call_original
+
+ expected_result = {
+ batches: 2,
+ start_id: selected_start_id,
+ next_start_id: expected_next_start_id,
+ matches: 10,
+ mismatches: 0,
+ mismatches_details: []
+ }
+ expect(consistency_check_service.execute).to eq(expected_result)
+ end
+
+ it 'saves the next_start_id in Redis for he next iteration' do
+ expect(consistency_check_service).to receive(:save_next_start_id).with(expected_next_start_id).and_call_original
+ consistency_check_service.execute
+ end
+ end
+
+ context 'cursor saved in Redis and moving' do
+ let(:first_namespace_id) { Namespace.order(:id).first.id }
+ let(:second_namespace_id) { Namespace.order(:id).second.id }
+
+ before do
+ create_list(:namespace, 30) # This will also create Ci::NameSpaceMirror objects
+ end
+
+ it "keeps moving the cursor with each call to the service" do
+ expect(consistency_check_service).to receive(:random_start_id).at_most(:once).and_return(first_namespace_id)
+
+ allow_next_instance_of(Gitlab::Database::ConsistencyChecker) do |instance|
+ expect(instance).to receive(:execute).ordered.with(start_id: first_namespace_id).and_call_original
+ expect(instance).to receive(:execute).ordered.with(start_id: first_namespace_id + 10).and_call_original
+ expect(instance).to receive(:execute).ordered.with(start_id: first_namespace_id + 20).and_call_original
+ # Gets back to the start of the table
+ expect(instance).to receive(:execute).ordered.with(start_id: first_namespace_id).and_call_original
+ end
+
+ 4.times do
+ consistency_check_service.execute
+ end
+ end
+
+ it "keeps moving the cursor from any start point" do
+ expect(consistency_check_service).to receive(:random_start_id).at_most(:once).and_return(second_namespace_id)
+
+ allow_next_instance_of(Gitlab::Database::ConsistencyChecker) do |instance|
+ expect(instance).to receive(:execute).ordered.with(start_id: second_namespace_id).and_call_original
+ expect(instance).to receive(:execute).ordered.with(start_id: second_namespace_id + 10).and_call_original
+ end
+
+ 2.times do
+ consistency_check_service.execute
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/deployments/update_environment_service_spec.rb b/spec/services/deployments/update_environment_service_spec.rb
index 6996563fdb8..0859aa2c9d1 100644
--- a/spec/services/deployments/update_environment_service_spec.rb
+++ b/spec/services/deployments/update_environment_service_spec.rb
@@ -286,6 +286,37 @@ RSpec.describe Deployments::UpdateEnvironmentService do
end
end
+ context 'when environment url uses a nested variable' do
+ let(:yaml_variables) do
+ [
+ { key: 'MAIN_DOMAIN', value: '${STACK_NAME}.example.com' },
+ { key: 'STACK_NAME', value: 'appname-${ENVIRONMENT_NAME}' },
+ { key: 'ENVIRONMENT_NAME', value: '${CI_COMMIT_REF_SLUG}' }
+ ]
+ end
+
+ let(:job) do
+ create(:ci_build,
+ :with_deployment,
+ pipeline: pipeline,
+ ref: 'master',
+ environment: 'production',
+ project: project,
+ yaml_variables: yaml_variables,
+ options: { environment: { name: 'production', url: 'http://$MAIN_DOMAIN' } })
+ end
+
+ it { is_expected.to eq('http://appname-master.example.com') }
+
+ context 'when the FF ci_expand_environment_name_and_url is disabled' do
+ before do
+ stub_feature_flags(ci_expand_environment_name_and_url: false)
+ end
+
+ it { is_expected.to eq('http://${STACK_NAME}.example.com') }
+ end
+ end
+
context 'when yaml environment does not have url' do
let(:job) { create(:ci_build, :with_deployment, pipeline: pipeline, environment: 'staging', project: project) }
diff --git a/spec/services/emails/create_service_spec.rb b/spec/services/emails/create_service_spec.rb
index 2fabf4ae66a..b13197f21b8 100644
--- a/spec/services/emails/create_service_spec.rb
+++ b/spec/services/emails/create_service_spec.rb
@@ -25,5 +25,34 @@ RSpec.describe Emails::CreateService do
expect(user.emails).to include(Email.find_by(opts))
end
+
+ it 'sends a notification to the user' do
+ expect_next_instance_of(NotificationService) do |notification_service|
+ expect(notification_service).to receive(:new_email_address_added)
+ end
+
+ service.execute
+ end
+
+ it 'does not send a notification when the email is not persisted' do
+ allow_next_instance_of(NotificationService) do |notification_service|
+ expect(notification_service).not_to receive(:new_email_address_added)
+ end
+
+ service.execute(email: 'invalid@@example.com')
+ end
+
+ it 'does not send a notification email when the email is the primary, because we are creating the user' do
+ allow_next_instance_of(NotificationService) do |notification_service|
+ expect(notification_service).not_to receive(:new_email_address_added)
+ end
+
+ # This is here to ensure that the service is actually called.
+ allow_next_instance_of(described_class) do |create_service|
+ expect(create_service).to receive(:execute).and_call_original
+ end
+
+ create(:user)
+ end
end
end
diff --git a/spec/services/environments/stop_service_spec.rb b/spec/services/environments/stop_service_spec.rb
index 362071c1c26..9e9ef127c67 100644
--- a/spec/services/environments/stop_service_spec.rb
+++ b/spec/services/environments/stop_service_spec.rb
@@ -198,6 +198,31 @@ RSpec.describe Environments::StopService do
expect(pipeline.environments_in_self_and_descendants.first).to be_stopped
end
+
+ context 'with environment related jobs ' do
+ let!(:environment) { create(:environment, :available, name: 'staging', project: project) }
+ let!(:prepare_staging_job) { create(:ci_build, :prepare_staging, pipeline: pipeline, project: project) }
+ let!(:start_staging_job) { create(:ci_build, :start_staging, :with_deployment, :manual, pipeline: pipeline, project: project) }
+ let!(:stop_staging_job) { create(:ci_build, :stop_staging, :manual, pipeline: pipeline, project: project) }
+
+ it 'does not stop environments that was not started by the merge request' do
+ subject
+
+ expect(prepare_staging_job.persisted_environment.state).to eq('available')
+ end
+
+ context 'when fix_related_environments_for_merge_requests feature flag is disabled' do
+ before do
+ stub_feature_flags(fix_related_environments_for_merge_requests: false)
+ end
+
+ it 'stops unrelated environments too' do
+ subject
+
+ expect(prepare_staging_job.persisted_environment.state).to eq('stopped')
+ end
+ end
+ end
end
context 'when user is a reporter' do
diff --git a/spec/services/event_create_service_spec.rb b/spec/services/event_create_service_spec.rb
index 611e821f3e5..c22099fe410 100644
--- a/spec/services/event_create_service_spec.rb
+++ b/spec/services/event_create_service_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redis_shared_state do
+ include SnowplowHelpers
+
let(:service) { described_class.new }
let_it_be(:user, reload: true) { create :user }
@@ -18,6 +20,28 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi
end
end
+ shared_examples 'Snowplow event' do
+ it 'is not emitted if FF is disabled' do
+ stub_feature_flags(route_hll_to_snowplow: false)
+
+ subject
+
+ expect_no_snowplow_event
+ end
+
+ it 'is emitted' do
+ subject
+
+ expect_snowplow_event(
+ category: described_class.to_s,
+ action: 'action_active_users_project_repo',
+ namespace: project.namespace,
+ user: user,
+ project: project
+ )
+ end
+ end
+
describe 'Issues' do
describe '#open_issue' do
let(:issue) { create(:issue) }
@@ -247,7 +271,7 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi
end
end
- describe '#push' do
+ describe '#push', :snowplow do
let(:push_data) do
{
commits: [
@@ -270,9 +294,11 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi
it_behaves_like "it records the event in the event counter" do
let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::PUSH_ACTION }
end
+
+ it_behaves_like 'Snowplow event'
end
- describe '#bulk_push' do
+ describe '#bulk_push', :snowplow do
let(:push_data) do
{
action: :created,
@@ -288,6 +314,8 @@ RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redi
it_behaves_like "it records the event in the event counter" do
let(:event_action) { Gitlab::UsageDataCounters::TrackUniqueEvents::PUSH_ACTION }
end
+
+ it_behaves_like 'Snowplow event'
end
describe 'Project' do
diff --git a/spec/services/git/branch_push_service_spec.rb b/spec/services/git/branch_push_service_spec.rb
index 5a637b0956b..57c130f76a4 100644
--- a/spec/services/git/branch_push_service_spec.rb
+++ b/spec/services/git/branch_push_service_spec.rb
@@ -721,4 +721,14 @@ RSpec.describe Git::BranchPushService, services: true do
it_behaves_like 'does not enqueue Jira sync worker'
end
end
+
+ describe 'project target platforms detection' do
+ subject(:execute) { execute_service(project, user, oldrev: blankrev, newrev: newrev, ref: ref) }
+
+ it 'calls enqueue_record_project_target_platforms on the project' do
+ expect(project).to receive(:enqueue_record_project_target_platforms)
+
+ execute
+ end
+ end
end
diff --git a/spec/services/groups/create_service_spec.rb b/spec/services/groups/create_service_spec.rb
index 819569d6e67..6e074f451c4 100644
--- a/spec/services/groups/create_service_spec.rb
+++ b/spec/services/groups/create_service_spec.rb
@@ -263,43 +263,6 @@ RSpec.describe Groups::CreateService, '#execute' do
end
end
- describe 'invite team email' do
- let(:service) { described_class.new(user, group_params) }
-
- before do
- allow(Namespaces::InviteTeamEmailWorker).to receive(:perform_in)
- end
-
- it 'is sent' do
- group = service.execute
- delay = Namespaces::InviteTeamEmailService::DELIVERY_DELAY_IN_MINUTES
- expect(Namespaces::InviteTeamEmailWorker).to have_received(:perform_in).with(delay, group.id, user.id)
- end
-
- context 'when group has not been persisted' do
- let(:service) { described_class.new(user, group_params.merge(name: '<script>alert("Attack!")</script>')) }
-
- it 'not sent' do
- expect(Namespaces::InviteTeamEmailWorker).not_to receive(:perform_in)
- service.execute
- end
- end
-
- context 'when group is not root' do
- let(:parent_group) { create :group }
- let(:service) { described_class.new(user, group_params.merge(parent_id: parent_group.id)) }
-
- before do
- parent_group.add_owner(user)
- end
-
- it 'not sent' do
- expect(Namespaces::InviteTeamEmailWorker).not_to receive(:perform_in)
- service.execute
- end
- end
- end
-
describe 'logged_out_marketing_header experiment', :experiment do
let(:service) { described_class.new(user, group_params) }
diff --git a/spec/services/groups/transfer_service_spec.rb b/spec/services/groups/transfer_service_spec.rb
index 3a696228382..1c4b7aac87e 100644
--- a/spec/services/groups/transfer_service_spec.rb
+++ b/spec/services/groups/transfer_service_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
end
let_it_be(:user) { create(:user) }
- let_it_be(:new_parent_group) { create(:group, :public) }
+ let_it_be(:new_parent_group) { create(:group, :public, :crm_enabled) }
let!(:group_member) { create(:group_member, :owner, group: group, user: user) }
let(:transfer_service) { described_class.new(group, user) }
@@ -252,23 +252,6 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
expect(transfer_service.execute(new_parent_group)).to be_falsy
expect(transfer_service.error).to eq('Transfer failed: The parent group already has a subgroup or a project with the same path.')
end
-
- # currently when a project is created it gets a corresponding project namespace
- # so we test the case where a project without a project namespace is transferred
- # for backward compatibility
- context 'without project namespace' do
- before do
- project_namespace = project.project_namespace
- project.update_column(:project_namespace_id, nil)
- project_namespace.delete
- end
-
- it 'adds an error on group' do
- expect(project.reload.project_namespace).to be_nil
- expect(transfer_service.execute(new_parent_group)).to be_falsy
- expect(transfer_service.error).to eq('Transfer failed: Validation failed: Group URL has already been taken')
- end
- end
end
context 'when projects have project namespaces' do
@@ -876,5 +859,108 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
end
end
end
+
+ context 'crm' do
+ let(:root_group) { create(:group, :public) }
+ let(:subgroup) { create(:group, :public, parent: root_group) }
+ let(:another_subgroup) { create(:group, :public, parent: root_group) }
+ let(:subsubgroup) { create(:group, :public, parent: subgroup) }
+
+ let(:root_project) { create(:project, group: root_group) }
+ let(:sub_project) { create(:project, group: subgroup) }
+ let(:another_project) { create(:project, group: another_subgroup) }
+ let(:subsub_project) { create(:project, group: subsubgroup) }
+
+ let!(:contacts) { create_list(:contact, 4, group: root_group) }
+ let!(:organizations) { create_list(:organization, 2, group: root_group) }
+
+ before do
+ create(:issue_customer_relations_contact, contact: contacts[0], issue: create(:issue, project: root_project))
+ create(:issue_customer_relations_contact, contact: contacts[1], issue: create(:issue, project: sub_project))
+ create(:issue_customer_relations_contact, contact: contacts[2], issue: create(:issue, project: another_project))
+ create(:issue_customer_relations_contact, contact: contacts[3], issue: create(:issue, project: subsub_project))
+ root_group.add_owner(user)
+ end
+
+ context 'moving up' do
+ let(:group) { subsubgroup }
+
+ it 'retains issue contacts' do
+ expect { transfer_service.execute(root_group) }
+ .not_to change { CustomerRelations::IssueContact.count }
+ end
+ end
+
+ context 'moving down' do
+ let(:group) { subgroup }
+
+ it 'retains issue contacts' do
+ expect { transfer_service.execute(another_subgroup) }
+ .not_to change { CustomerRelations::IssueContact.count }
+ end
+ end
+
+ context 'moving sideways' do
+ let(:group) { subsubgroup }
+
+ it 'retains issue contacts' do
+ expect { transfer_service.execute(another_subgroup) }
+ .not_to change { CustomerRelations::IssueContact.count }
+ end
+ end
+
+ context 'moving to new root group' do
+ let(:group) { root_group }
+
+ before do
+ new_parent_group.add_owner(user)
+ end
+
+ it 'moves all crm objects' do
+ expect { transfer_service.execute(new_parent_group) }
+ .to change { root_group.contacts.count }.by(-4)
+ .and change { root_group.organizations.count }.by(-2)
+ end
+
+ it 'retains issue contacts' do
+ expect { transfer_service.execute(new_parent_group) }
+ .not_to change { CustomerRelations::IssueContact.count }
+ end
+ end
+
+ context 'moving to a subgroup within a new root group' do
+ let(:group) { root_group }
+ let(:subgroup_in_new_parent_group) { create(:group, parent: new_parent_group) }
+
+ context 'with permission on the root group' do
+ before do
+ new_parent_group.add_owner(user)
+ end
+
+ it 'moves all crm objects' do
+ expect { transfer_service.execute(subgroup_in_new_parent_group) }
+ .to change { root_group.contacts.count }.by(-4)
+ .and change { root_group.organizations.count }.by(-2)
+ end
+
+ it 'retains issue contacts' do
+ expect { transfer_service.execute(subgroup_in_new_parent_group) }
+ .not_to change { CustomerRelations::IssueContact.count }
+ end
+ end
+
+ context 'with permission on the subgroup' do
+ before do
+ subgroup_in_new_parent_group.add_owner(user)
+ end
+
+ it 'raises error' do
+ transfer_service.execute(subgroup_in_new_parent_group)
+
+ expect(transfer_service.error).to eq("Transfer failed: Group contains contacts/organizations and you don't have enough permissions to move them to the new root group.")
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/services/import/github_service_spec.rb b/spec/services/import/github_service_spec.rb
index 04a94d96f67..58afae1e647 100644
--- a/spec/services/import/github_service_spec.rb
+++ b/spec/services/import/github_service_spec.rb
@@ -34,11 +34,11 @@ RSpec.describe Import::GithubService do
subject.execute(access_params, :github)
end
- it 'returns an error' do
+ it 'returns an error with message and code' do
result = subject.execute(access_params, :github)
expect(result).to include(
- message: 'Import failed due to a GitHub error: Not Found',
+ message: 'Import failed due to a GitHub error: Not Found (HTTP 404)',
status: :error,
http_status: :unprocessable_entity
)
diff --git a/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb
new file mode 100644
index 00000000000..c20a0688ac2
--- /dev/null
+++ b/spec/services/incident_management/issuable_escalation_statuses/build_service_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IncidentManagement::IssuableEscalationStatuses::BuildService do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident, reload: true) { create(:incident, project: project) }
+
+ let(:service) { described_class.new(incident) }
+
+ subject(:execute) { service.execute }
+
+ it_behaves_like 'initializes new escalation status with expected attributes'
+
+ context 'with associated alert' do
+ let_it_be(:alert) { create(:alert_management_alert, :acknowledged, project: project, issue: incident) }
+
+ it_behaves_like 'initializes new escalation status with expected attributes', { status_event: :acknowledge }
+ end
+end
diff --git a/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb
index 8fbab361ec4..2c7d330766c 100644
--- a/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb
+++ b/spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb
@@ -8,12 +8,12 @@ RSpec.describe IncidentManagement::IssuableEscalationStatuses::CreateService do
let(:incident) { create(:incident, project: project) }
let(:service) { described_class.new(incident) }
- subject(:execute) { service.execute}
+ subject(:execute) { service.execute }
it 'creates an escalation status for the incident with no policy set' do
- expect { execute }.to change { incident.reload.incident_management_issuable_escalation_status }.from(nil)
+ expect { execute }.to change { incident.reload.escalation_status }.from(nil)
- status = incident.incident_management_issuable_escalation_status
+ status = incident.escalation_status
expect(status.policy_id).to eq(nil)
expect(status.escalations_started_at).to eq(nil)
@@ -24,7 +24,22 @@ RSpec.describe IncidentManagement::IssuableEscalationStatuses::CreateService do
let!(:existing_status) { create(:incident_management_issuable_escalation_status, issue: incident) }
it 'exits without changing anything' do
- expect { execute }.not_to change { incident.reload.incident_management_issuable_escalation_status }
+ expect { execute }.not_to change { incident.reload.escalation_status }
+ end
+ end
+
+ context 'with associated alert' do
+ before do
+ create(:alert_management_alert, :acknowledged, project: project, issue: incident)
+ end
+
+ it 'creates an escalation status matching the alert attributes' do
+ expect { execute }.to change { incident.reload.escalation_status }.from(nil)
+ expect(incident.escalation_status).to have_attributes(
+ status_name: :acknowledged,
+ policy_id: nil,
+ escalations_started_at: nil
+ )
end
end
end
diff --git a/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb
index b30b3a69ae6..25164df40ca 100644
--- a/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb
+++ b/spec/services/incident_management/issuable_escalation_statuses/prepare_update_service_spec.rb
@@ -71,7 +71,12 @@ RSpec.describe IncidentManagement::IssuableEscalationStatuses::PrepareUpdateServ
context 'when an IssuableEscalationStatus record for the issue does not exist' do
let(:issue) { create(:incident) }
- it_behaves_like 'availability error response'
+ it_behaves_like 'successful response', { status_event: :acknowledge }
+
+ it 'initializes an issuable escalation status record' do
+ expect { result }.not_to change(::IncidentManagement::IssuableEscalationStatus, :count)
+ expect(issue.escalation_status).to be_present
+ end
end
context 'when called without params' do
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index 6d3c3dd4e39..d496857bb25 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -9,8 +9,8 @@ RSpec.describe Issues::UpdateService, :mailer do
let_it_be(:guest) { create(:user) }
let_it_be(:group) { create(:group, :public, :crm_enabled) }
let_it_be(:project, reload: true) { create(:project, :repository, group: group) }
- let_it_be(:label) { create(:label, project: project) }
- let_it_be(:label2) { create(:label, project: project) }
+ let_it_be(:label) { create(:label, title: 'a', project: project) }
+ let_it_be(:label2) { create(:label, title: 'b', project: project) }
let_it_be(:milestone) { create(:milestone, project: project) }
let(:issue) do
@@ -1224,6 +1224,18 @@ RSpec.describe Issues::UpdateService, :mailer do
end
context 'without an escalation status record' do
+ it 'creates a new record' do
+ expect { update_issue(opts) }.to change(::IncidentManagement::IssuableEscalationStatus, :count).by(1)
+ end
+
+ it_behaves_like 'updates the escalation status record', :acknowledged
+ end
+
+ context 'with :incident_escalations feature flag disabled' do
+ before do
+ stub_feature_flags(incident_escalations: false)
+ end
+
it_behaves_like 'does not change the status record'
end
end
@@ -1349,6 +1361,19 @@ RSpec.describe Issues::UpdateService, :mailer do
end
end
+ context 'labels are updated' do
+ let(:label_a) { label }
+ let(:label_b) { label2 }
+ let(:issuable) { issue }
+
+ it_behaves_like 'keeps issuable labels sorted after update'
+ it_behaves_like 'broadcasting issuable labels updates'
+
+ def update_issuable(update_params)
+ update_issue(update_params)
+ end
+ end
+
it_behaves_like 'issuable record that supports quick actions' do
let(:existing_issue) { create(:issue, project: project) }
let(:issuable) { described_class.new(project: project, current_user: user, params: params).execute(existing_issue) }
diff --git a/spec/services/members/create_service_spec.rb b/spec/services/members/create_service_spec.rb
index 4396a0d3ec3..25437be1e78 100644
--- a/spec/services/members/create_service_spec.rb
+++ b/spec/services/members/create_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
let_it_be(:source, reload: true) { create(:project) }
let_it_be(:user) { create(:user) }
let_it_be(:member) { create(:user) }
+ let_it_be(:user_invited_by_id) { create(:user) }
let_it_be(:user_ids) { member.id.to_s }
let_it_be(:access_level) { Gitlab::Access::GUEST }
@@ -49,6 +50,36 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(true)
end
+ context 'when user_id is passed as an integer' do
+ let(:user_ids) { member.id }
+
+ it 'successfully creates member' do
+ expect(execute_service[:status]).to eq(:success)
+ expect(source.users).to include member
+ expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(true)
+ end
+ end
+
+ context 'with user_ids as an array of integers' do
+ let(:user_ids) { [member.id, user_invited_by_id.id] }
+
+ it 'successfully creates members' do
+ expect(execute_service[:status]).to eq(:success)
+ expect(source.users).to include(member, user_invited_by_id)
+ expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(true)
+ end
+ end
+
+ context 'with user_ids as an array of strings' do
+ let(:user_ids) { [member.id.to_s, user_invited_by_id.id.to_s] }
+
+ it 'successfully creates members' do
+ expect(execute_service[:status]).to eq(:success)
+ expect(source.users).to include(member, user_invited_by_id)
+ expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(true)
+ end
+ end
+
context 'when executing on a group' do
let_it_be(:source) { create(:group) }
@@ -112,6 +143,32 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
end
+ context 'when adding a project_bot' do
+ let_it_be(:project_bot) { create(:user, :project_bot) }
+
+ let(:user_ids) { project_bot.id }
+
+ context 'when project_bot is already a member' do
+ before do
+ source.add_developer(project_bot)
+ end
+
+ it 'does not update the member' do
+ expect(execute_service[:status]).to eq(:error)
+ expect(execute_service[:message]).to eq("#{project_bot.username}: not authorized to update member")
+ expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(false)
+ end
+ end
+
+ context 'when project_bot is not already a member' do
+ it 'adds the member' do
+ expect(execute_service[:status]).to eq(:success)
+ expect(source.users).to include project_bot
+ expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(true)
+ end
+ end
+ end
+
context 'when tracking the invite source', :snowplow do
context 'when invite_source is not passed' do
let(:additional_params) { {} }
@@ -191,6 +248,15 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
)
end
+ context 'when it is an invite by email passed to user_ids' do
+ let(:user_ids) { 'email@example.org' }
+
+ it 'does not create task issues' do
+ expect(TasksToBeDone::CreateWorker).not_to receive(:perform_async)
+ execute_service
+ end
+ end
+
context 'when passing many user ids' do
before do
stub_licensed_features(multiple_issue_assignees: false)
diff --git a/spec/services/members/creator_service_spec.rb b/spec/services/members/creator_service_spec.rb
new file mode 100644
index 00000000000..ff5bf705b6c
--- /dev/null
+++ b/spec/services/members/creator_service_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Members::CreatorService do
+ let_it_be(:source, reload: true) { create(:group, :public) }
+ let_it_be(:member_type) { GroupMember }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:current_user) { create(:user) }
+
+ describe '#execute' do
+ it 'raises error for new member on authorization check implementation' do
+ expect do
+ described_class.new(source, user, :maintainer, current_user: current_user).execute
+ end.to raise_error(NotImplementedError)
+ end
+
+ it 'raises error for an existing member on authorization check implementation' do
+ source.add_developer(user)
+
+ expect do
+ described_class.new(source, user, :maintainer, current_user: current_user).execute
+ end.to raise_error(NotImplementedError)
+ end
+ end
+end
diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb
index 8ceb9979f33..ab740138a8b 100644
--- a/spec/services/members/invite_service_spec.rb
+++ b/spec/services/members/invite_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
let_it_be(:project, reload: true) { create(:project) }
let_it_be(:user) { project.first_owner }
let_it_be(:project_user) { create(:user) }
+ let_it_be(:user_invited_by_id) { create(:user) }
let_it_be(:namespace) { project.namespace }
let(:params) { {} }
@@ -41,148 +42,422 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'when email is not a valid email' do
- let(:params) { { email: '_bogus_' } }
+ context 'when invites are passed as array' do
+ context 'with emails' do
+ let(:params) { { email: %w[email@example.org email2@example.org] } }
- it 'returns an error' do
- expect_not_to_create_members
- expect(result[:message]['_bogus_']).to eq("Invite email is invalid")
+ it 'successfully creates members' do
+ expect_to_create_members(count: 2)
+ expect(result[:status]).to eq(:success)
+ end
+ end
+
+ context 'with user_ids as integers' do
+ let(:params) { { user_ids: [project_user.id, user_invited_by_id.id] } }
+
+ it 'successfully creates members' do
+ expect_to_create_members(count: 2)
+ expect(result[:status]).to eq(:success)
+ end
end
- it_behaves_like 'does not record an onboarding progress action'
+ context 'with user_ids as strings' do
+ let(:params) { { user_ids: [project_user.id.to_s, user_invited_by_id.id.to_s] } }
+
+ it 'successfully creates members' do
+ expect_to_create_members(count: 2)
+ expect(result[:status]).to eq(:success)
+ end
+ end
+
+ context 'with a mixture of emails and user_ids' do
+ let(:params) do
+ { user_ids: [project_user.id, user_invited_by_id.id], email: %w[email@example.org email2@example.org] }
+ end
+
+ it 'successfully creates members' do
+ expect_to_create_members(count: 4)
+ expect(result[:status]).to eq(:success)
+ end
+ end
end
- context 'when emails are passed as an array' do
- let(:params) { { email: %w[email@example.org email2@example.org] } }
+ context 'with multiple invites passed as strings' do
+ context 'with emails' do
+ let(:params) { { email: 'email@example.org,email2@example.org' } }
- it 'successfully creates members' do
- expect_to_create_members(count: 2)
- expect(result[:status]).to eq(:success)
+ it 'successfully creates members' do
+ expect_to_create_members(count: 2)
+ expect(result[:status]).to eq(:success)
+ end
+ end
+
+ context 'with user_ids' do
+ let(:params) { { user_ids: "#{project_user.id},#{user_invited_by_id.id}" } }
+
+ it 'successfully creates members' do
+ expect_to_create_members(count: 2)
+ expect(result[:status]).to eq(:success)
+ end
+ end
+
+ context 'with a mixture of emails and user_ids' do
+ let(:params) do
+ { user_ids: "#{project_user.id},#{user_invited_by_id.id}", email: 'email@example.org,email2@example.org' }
+ end
+
+ it 'successfully creates members' do
+ expect_to_create_members(count: 4)
+ expect(result[:status]).to eq(:success)
+ end
end
end
- context 'when emails are passed as an empty string' do
- let(:params) { { email: '' } }
+ context 'when invites formats are mixed' do
+ context 'when user_ids is an array and emails is a string' do
+ let(:params) do
+ { user_ids: [project_user.id, user_invited_by_id.id], email: 'email@example.org,email2@example.org' }
+ end
+
+ it 'successfully creates members' do
+ expect_to_create_members(count: 4)
+ expect(result[:status]).to eq(:success)
+ end
+ end
+
+ context 'when user_ids is a string and emails is an array' do
+ let(:params) do
+ { user_ids: "#{project_user.id},#{user_invited_by_id.id}", email: %w[email@example.org email2@example.org] }
+ end
- it 'returns an error' do
- expect_not_to_create_members
- expect(result[:message]).to eq('Emails cannot be blank')
+ it 'successfully creates members' do
+ expect_to_create_members(count: 4)
+ expect(result[:status]).to eq(:success)
+ end
end
end
- context 'when email param is not included' do
- it 'returns an error' do
- expect_not_to_create_members
- expect(result[:message]).to eq('Emails cannot be blank')
+ context 'when invites are passed in different formats' do
+ context 'when emails are passed as an empty string' do
+ let(:params) { { email: '' } }
+
+ it 'returns an error' do
+ expect_not_to_create_members
+ expect(result[:message]).to eq('Invites cannot be blank')
+ end
+ end
+
+ context 'when user_ids are passed as an empty string' do
+ let(:params) { { user_ids: '' } }
+
+ it 'returns an error' do
+ expect_not_to_create_members
+ expect(result[:message]).to eq('Invites cannot be blank')
+ end
+ end
+
+ context 'when user_ids and emails are both passed as empty strings' do
+ let(:params) { { user_ids: '', email: '' } }
+
+ it 'returns an error' do
+ expect_not_to_create_members
+ expect(result[:message]).to eq('Invites cannot be blank')
+ end
+ end
+
+ context 'when user_id is passed as an integer' do
+ let(:params) { { user_ids: project_user.id } }
+
+ it 'successfully creates member' do
+ expect_to_create_members(count: 1)
+ expect(result[:status]).to eq(:success)
+ end
+ end
+
+ context 'when invite params are not included' do
+ it 'returns an error' do
+ expect_not_to_create_members
+ expect(result[:message]).to eq('Invites cannot be blank')
+ end
end
end
context 'when email is not a valid email format' do
- let(:params) { { email: '_bogus_' } }
+ context 'with singular email' do
+ let(:params) { { email: '_bogus_' } }
- it 'returns an error' do
- expect { result }.not_to change(ProjectMember, :count)
- expect(result[:status]).to eq(:error)
- expect(result[:message][params[:email]]).to eq("Invite email is invalid")
+ it 'returns an error' do
+ expect_not_to_create_members
+ expect(result[:status]).to eq(:error)
+ expect(result[:message][params[:email]]).to eq("Invite email is invalid")
+ end
+
+ it_behaves_like 'does not record an onboarding progress action'
+ end
+
+ context 'with user_id and singular invalid email' do
+ let(:params) { { user_ids: project_user.id, email: '_bogus_' } }
+
+ it 'has partial success' do
+ expect_to_create_members(count: 1)
+ expect(project.users).to include project_user
+
+ expect(result[:status]).to eq(:error)
+ expect(result[:message][params[:email]]).to eq("Invite email is invalid")
+ end
end
end
- context 'when duplicate email addresses are passed' do
- let(:params) { { email: 'email@example.org,email@example.org' } }
+ context 'with duplicate invites' do
+ context 'with duplicate emails' do
+ let(:params) { { email: 'email@example.org,email@example.org' } }
- it 'only creates one member per unique address' do
- expect_to_create_members(count: 1)
- expect(result[:status]).to eq(:success)
+ it 'only creates one member per unique invite' do
+ expect_to_create_members(count: 1)
+ expect(result[:status]).to eq(:success)
+ end
+ end
+
+ context 'with duplicate user ids' do
+ let(:params) { { user_ids: "#{project_user.id},#{project_user.id}" } }
+
+ it 'only creates one member per unique invite' do
+ expect_to_create_members(count: 1)
+ expect(result[:status]).to eq(:success)
+ end
+ end
+
+ context 'with duplicate member by adding as user id and email' do
+ let(:params) { { user_ids: project_user.id, email: project_user.email } }
+
+ it 'only creates one member per unique invite' do
+ expect_to_create_members(count: 1)
+ expect(result[:status]).to eq(:success)
+ end
end
end
- context 'when observing email limits' do
- let_it_be(:emails) { Array(1..101).map { |n| "email#{n}@example.com" } }
+ context 'when observing invite limits' do
+ context 'with emails and in general' do
+ let_it_be(:emails) { Array(1..101).map { |n| "email#{n}@example.com" } }
- context 'when over the allowed default limit of emails' do
- let(:params) { { email: emails } }
+ context 'when over the allowed default limit of emails' do
+ let(:params) { { email: emails } }
- it 'limits the number of emails to 100' do
- expect_not_to_create_members
- expect(result[:message]).to eq('Too many users specified (limit is 100)')
+ it 'limits the number of emails to 100' do
+ expect_not_to_create_members
+ expect(result[:message]).to eq('Too many users specified (limit is 100)')
+ end
+ end
+
+ context 'when over the allowed custom limit of emails' do
+ let(:params) { { email: 'email@example.org,email2@example.org', limit: 1 } }
+
+ it 'limits the number of emails to the limit supplied' do
+ expect_not_to_create_members
+ expect(result[:message]).to eq('Too many users specified (limit is 1)')
+ end
+ end
+
+ context 'when limit allowed is disabled via limit param' do
+ let(:params) { { email: emails, limit: -1 } }
+
+ it 'does not limit number of emails' do
+ expect_to_create_members(count: 101)
+ expect(result[:status]).to eq(:success)
+ end
end
end
- context 'when over the allowed custom limit of emails' do
- let(:params) { { email: 'email@example.org,email2@example.org', limit: 1 } }
+ context 'with user_ids' do
+ let(:user_ids) { 1.upto(101).to_a.join(',') }
+ let(:params) { { user_ids: user_ids } }
- it 'limits the number of emails to the limit supplied' do
+ it 'limits the number of users to 100' do
expect_not_to_create_members
- expect(result[:message]).to eq('Too many users specified (limit is 1)')
+ expect(result[:message]).to eq('Too many users specified (limit is 100)')
end
end
+ end
- context 'when limit allowed is disabled via limit param' do
- let(:params) { { email: emails, limit: -1 } }
+ context 'with an existing user' do
+ context 'with email' do
+ let(:params) { { email: project_user.email } }
- it 'does not limit number of emails' do
- expect_to_create_members(count: 101)
+ it 'adds an existing user to members' do
+ expect_to_create_members(count: 1)
expect(result[:status]).to eq(:success)
+ expect(project.users).to include project_user
end
end
- end
- context 'when email belongs to an existing user' do
- let(:params) { { email: project_user.email } }
+ context 'with user_id' do
+ let(:params) { { user_ids: project_user.id } }
- it 'adds an existing user to members' do
- expect_to_create_members(count: 1)
- expect(result[:status]).to eq(:success)
- expect(project.users).to include project_user
+ it_behaves_like 'records an onboarding progress action', :user_added
+
+ it 'adds an existing user to members' do
+ expect_to_create_members(count: 1)
+ expect(result[:status]).to eq(:success)
+ expect(project.users).to include project_user
+ end
+
+ context 'when assigning tasks to be done' do
+ let(:params) do
+ { user_ids: project_user.id, tasks_to_be_done: %w(ci code), tasks_project_id: project.id }
+ end
+
+ it 'creates 2 task issues', :aggregate_failures do
+ expect(TasksToBeDone::CreateWorker)
+ .to receive(:perform_async)
+ .with(anything, user.id, [project_user.id])
+ .once
+ .and_call_original
+ expect { result }.to change { project.issues.count }.by(2)
+
+ expect(project.issues).to all have_attributes(project: project, author: user)
+ end
+ end
end
end
context 'when access level is not valid' do
- let(:params) { { email: project_user.email, access_level: -1 } }
+ context 'with email' do
+ let(:params) { { email: project_user.email, access_level: -1 } }
- it 'returns an error' do
- expect_not_to_create_members
- expect(result[:message][project_user.email])
- .to eq("Access level is not included in the list")
+ it 'returns an error' do
+ expect_not_to_create_members
+ expect(result[:message][project_user.email]).to eq("Access level is not included in the list")
+ end
end
- end
- context 'when invite already exists for an included email' do
- let!(:invited_member) { create(:project_member, :invited, project: project) }
- let(:params) { { email: "#{invited_member.invite_email},#{project_user.email}" } }
+ context 'with user_id' do
+ let(:params) { { user_ids: user_invited_by_id.id, access_level: -1 } }
- it 'adds new email and returns an error for the already invited email' do
- expect_to_create_members(count: 1)
- expect(result[:status]).to eq(:error)
- expect(result[:message][invited_member.invite_email])
- .to eq("The member's email address has already been taken")
- expect(project.users).to include project_user
+ it 'returns an error' do
+ expect_not_to_create_members
+ expect(result[:message][user_invited_by_id.username]).to eq("Access level is not included in the list")
+ end
end
- end
- context 'when access request already exists for an included email' do
- let!(:requested_member) { create(:project_member, :access_request, project: project) }
- let(:params) { { email: "#{requested_member.user.email},#{project_user.email}" } }
+ context 'with a mix of user_id and email' do
+ let(:params) { { user_ids: user_invited_by_id.id, email: project_user.email, access_level: -1 } }
- it 'adds new email and returns an error for the already invited email' do
- expect_to_create_members(count: 1)
- expect(result[:status]).to eq(:error)
- expect(result[:message][requested_member.user.email])
- .to eq("User already exists in source")
- expect(project.users).to include project_user
+ it 'returns errors' do
+ expect_not_to_create_members
+ expect(result[:message][project_user.email]).to eq("Access level is not included in the list")
+ expect(result[:message][user_invited_by_id.username]).to eq("Access level is not included in the list")
+ end
end
end
- context 'when email is already a member on the project' do
- let!(:existing_member) { create(:project_member, :guest, project: project) }
- let(:params) { { email: "#{existing_member.user.email},#{project_user.email}" } }
+ context 'when member already exists' do
+ context 'with email' do
+ let!(:invited_member) { create(:project_member, :invited, project: project) }
+ let(:params) { { email: "#{invited_member.invite_email},#{project_user.email}" } }
+
+ it 'adds new email and returns an error for the already invited email' do
+ expect_to_create_members(count: 1)
+ expect(result[:status]).to eq(:error)
+ expect(result[:message][invited_member.invite_email])
+ .to eq("The member's email address has already been taken")
+ expect(project.users).to include project_user
+ end
+ end
- it 'adds new email and returns an error for the already invited email' do
- expect_to_create_members(count: 1)
- expect(result[:status]).to eq(:error)
- expect(result[:message][existing_member.user.email])
- .to eq("User already exists in source")
- expect(project.users).to include project_user
+ context 'when email is already a member with a user on the project' do
+ let!(:existing_member) { create(:project_member, :guest, project: project) }
+ let(:params) { { email: "#{existing_member.user.email}" } }
+
+ it 'returns an error for the already invited email' do
+ expect_not_to_create_members
+ expect(result[:message][existing_member.user.email]).to eq("User already exists in source")
+ end
+
+ context 'when email belongs to an existing user as a secondary email' do
+ let(:secondary_email) { create(:email, email: 'secondary@example.com', user: existing_member.user) }
+ let(:params) { { email: "#{secondary_email.email}" } }
+
+ it 'returns an error for the already invited email' do
+ expect_not_to_create_members
+ expect(result[:message][secondary_email.email]).to eq("User already exists in source")
+ end
+ end
+ end
+
+ context 'with user_id that already exists' do
+ let!(:existing_member) { create(:project_member, project: project, user: project_user) }
+ let(:params) { { user_ids: existing_member.user_id } }
+
+ it 'does not add the member again and is successful' do
+ expect_to_create_members(count: 0)
+ expect(project.users).to include project_user
+ end
+ end
+
+ context 'with user_id that already exists with a lower access_level' do
+ let!(:existing_member) { create(:project_member, :developer, project: project, user: project_user) }
+ let(:params) { { user_ids: existing_member.user_id, access_level: ProjectMember::MAINTAINER } }
+
+ it 'does not add the member again and updates the access_level' do
+ expect_to_create_members(count: 0)
+ expect(project.users).to include project_user
+ expect(existing_member.reset.access_level).to eq ProjectMember::MAINTAINER
+ end
+ end
+
+ context 'with user_id that already exists with a higher access_level' do
+ let!(:existing_member) { create(:project_member, :developer, project: project, user: project_user) }
+ let(:params) { { user_ids: existing_member.user_id, access_level: ProjectMember::GUEST } }
+
+ it 'does not add the member again and updates the access_level' do
+ expect_to_create_members(count: 0)
+ expect(project.users).to include project_user
+ expect(existing_member.reset.access_level).to eq ProjectMember::GUEST
+ end
+ end
+
+ context 'with user_id that already exists in a parent group' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:group_member) { create(:group_member, :developer, source: group, user: project_user) }
+ let_it_be(:project, reload: true) { create(:project, group: group) }
+ let_it_be(:user) { project.creator }
+
+ before_all do
+ project.add_maintainer(user)
+ end
+
+ context 'when access_level is lower than inheriting member' do
+ let(:params) { { user_ids: group_member.user_id, access_level: ProjectMember::GUEST }}
+
+ it 'does not add the member and returns an error' do
+ msg = "Access level should be greater than or equal " \
+ "to Developer inherited membership from group #{group.name}"
+
+ expect_not_to_create_members
+ expect(result[:message][project_user.username]).to eq msg
+ end
+ end
+
+ context 'when access_level is the same as the inheriting member' do
+ let(:params) { { user_ids: group_member.user_id, access_level: ProjectMember::DEVELOPER }}
+
+ it 'adds the member with correct access_level' do
+ expect_to_create_members(count: 1)
+ expect(project.users).to include project_user
+ expect(project.project_members.last.access_level).to eq ProjectMember::DEVELOPER
+ end
+ end
+
+ context 'when access_level is greater than the inheriting member' do
+ let(:params) { { user_ids: group_member.user_id, access_level: ProjectMember::MAINTAINER }}
+
+ it 'adds the member with correct access_level' do
+ expect_to_create_members(count: 1)
+ expect(project.users).to include project_user
+ expect(project.project_members.last.access_level).to eq ProjectMember::MAINTAINER
+ end
+ end
end
end
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index eb587797201..30095ebeb50 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
let(:user) { create(:user) }
let(:user2) { create(:user) }
let(:user3) { create(:user) }
- let(:label) { create(:label, project: project) }
+ let(:label) { create(:label, title: 'a', project: project) }
let(:label2) { create(:label) }
let(:milestone) { create(:milestone, project: project) }
@@ -1192,5 +1192,18 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
let(:existing_merge_request) { create(:merge_request, source_project: project) }
let(:issuable) { described_class.new(project: project, current_user: user, params: params).execute(existing_merge_request) }
end
+
+ context 'labels are updated' do
+ let(:label_a) { label }
+ let(:label_b) { create(:label, title: 'b', project: project) }
+ let(:issuable) { merge_request }
+
+ it_behaves_like 'keeps issuable labels sorted after update'
+ it_behaves_like 'broadcasting issuable labels updates'
+
+ def update_issuable(update_params)
+ update_merge_request(update_params)
+ end
+ end
end
end
diff --git a/spec/services/metrics/dashboard/custom_dashboard_service_spec.rb b/spec/services/metrics/dashboard/custom_dashboard_service_spec.rb
index 5dc30c156ac..afeb1646005 100644
--- a/spec/services/metrics/dashboard/custom_dashboard_service_spec.rb
+++ b/spec/services/metrics/dashboard/custom_dashboard_service_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Metrics::Dashboard::CustomDashboardService, :use_clean_rails_memo
subject { described_class.new(*service_params) }
before do
- project.add_maintainer(user)
+ project.add_maintainer(user) if user
end
describe '#raw_dashboard' do
diff --git a/spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb b/spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb
index 82321dbc822..127cec6275c 100644
--- a/spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb
+++ b/spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Metrics::Dashboard::CustomMetricEmbedService do
let_it_be(:environment) { create(:environment, project: project) }
before do
- project.add_maintainer(user)
+ project.add_maintainer(user) if user
end
let(:dashboard_path) { system_dashboard_path }
diff --git a/spec/services/metrics/dashboard/default_embed_service_spec.rb b/spec/services/metrics/dashboard/default_embed_service_spec.rb
index 2ce10eac026..647778eadc1 100644
--- a/spec/services/metrics/dashboard/default_embed_service_spec.rb
+++ b/spec/services/metrics/dashboard/default_embed_service_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Metrics::Dashboard::DefaultEmbedService, :use_clean_rails_memory_
let_it_be(:environment) { create(:environment, project: project) }
before do
- project.add_maintainer(user)
+ project.add_maintainer(user) if user
end
describe '.valid_params?' do
diff --git a/spec/services/metrics/dashboard/dynamic_embed_service_spec.rb b/spec/services/metrics/dashboard/dynamic_embed_service_spec.rb
index 3c533b0c464..5eb8f24266c 100644
--- a/spec/services/metrics/dashboard/dynamic_embed_service_spec.rb
+++ b/spec/services/metrics/dashboard/dynamic_embed_service_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Metrics::Dashboard::DynamicEmbedService, :use_clean_rails_memory_
let_it_be(:environment) { create(:environment, project: project) }
before do
- project.add_maintainer(user)
+ project.add_maintainer(user) if user
end
let(:dashboard_path) { '.gitlab/dashboards/test.yml' }
diff --git a/spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb b/spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb
index 33b7e3c85cd..d0cefdbeb30 100644
--- a/spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb
+++ b/spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Metrics::Dashboard::SelfMonitoringDashboardService, :use_clean_ra
let(:service_params) { [project, user, { environment: environment }] }
before do
- project.add_maintainer(user)
+ project.add_maintainer(user) if user
stub_application_setting(self_monitoring_project_id: project.id)
end
diff --git a/spec/services/metrics/dashboard/system_dashboard_service_spec.rb b/spec/services/metrics/dashboard/system_dashboard_service_spec.rb
index ced7c29b507..e1c6aaeec66 100644
--- a/spec/services/metrics/dashboard/system_dashboard_service_spec.rb
+++ b/spec/services/metrics/dashboard/system_dashboard_service_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Metrics::Dashboard::SystemDashboardService, :use_clean_rails_memo
subject { described_class.new(*service_params) }
before do
- project.add_maintainer(user)
+ project.add_maintainer(user) if user
end
describe '#raw_dashboard' do
diff --git a/spec/services/metrics/dashboard/transient_embed_service_spec.rb b/spec/services/metrics/dashboard/transient_embed_service_spec.rb
index 3fd0c97d909..53ea83c33d6 100644
--- a/spec/services/metrics/dashboard/transient_embed_service_spec.rb
+++ b/spec/services/metrics/dashboard/transient_embed_service_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Metrics::Dashboard::TransientEmbedService, :use_clean_rails_memor
let_it_be(:environment) { create(:environment, project: project) }
before do
- project.add_maintainer(user)
+ project.add_maintainer(user) if user
end
describe '.valid_params?' do
diff --git a/spec/services/namespaces/in_product_marketing_email_records_spec.rb b/spec/services/namespaces/in_product_marketing_email_records_spec.rb
index e5f1b275f9c..d80e20135d5 100644
--- a/spec/services/namespaces/in_product_marketing_email_records_spec.rb
+++ b/spec/services/namespaces/in_product_marketing_email_records_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Namespaces::InProductMarketingEmailRecords do
before do
allow(Users::InProductMarketingEmail).to receive(:bulk_insert!)
- records.add(user, :invite_team, 0)
+ records.add(user, :team_short, 0)
records.add(user, :create, 1)
end
@@ -33,13 +33,13 @@ RSpec.describe Namespaces::InProductMarketingEmailRecords do
describe '#add' do
it 'adds a Users::InProductMarketingEmail record to its records' do
freeze_time do
- records.add(user, :invite_team, 0)
+ records.add(user, :team_short, 0)
records.add(user, :create, 1)
first, second = records.records
expect(first).to be_a Users::InProductMarketingEmail
- expect(first.track.to_sym).to eq :invite_team
+ expect(first.track.to_sym).to eq :team_short
expect(first.series).to eq 0
expect(first.created_at).to eq Time.zone.now
expect(first.updated_at).to eq Time.zone.now
diff --git a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
index 58ba577b7e7..de84666ca1d 100644
--- a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
+++ b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
@@ -183,7 +183,7 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
expect(
Users::InProductMarketingEmail.where(
user: user,
- track: Users::InProductMarketingEmail.tracks[:create],
+ track: Users::InProductMarketingEmail::ACTIVE_TRACKS[:create],
series: 0
)
).to exist
diff --git a/spec/services/namespaces/invite_team_email_service_spec.rb b/spec/services/namespaces/invite_team_email_service_spec.rb
deleted file mode 100644
index 60ba91f433d..00000000000
--- a/spec/services/namespaces/invite_team_email_service_spec.rb
+++ /dev/null
@@ -1,128 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Namespaces::InviteTeamEmailService do
- let_it_be(:user) { create(:user, email_opted_in: true) }
-
- let(:track) { described_class::TRACK }
- let(:series) { 0 }
-
- let(:setup_for_company) { true }
- let(:parent_group) { nil }
- let(:group) { create(:group, parent: parent_group) }
-
- subject(:action) { described_class.send_email(user, group) }
-
- before do
- group.add_owner(user)
- allow(group).to receive(:setup_for_company).and_return(setup_for_company)
- allow(Notify).to receive(:in_product_marketing_email).and_return(double(deliver_later: nil))
- end
-
- RSpec::Matchers.define :send_invite_team_email do |*args|
- match do
- expect(Notify).to have_received(:in_product_marketing_email).with(*args).once
- end
-
- match_when_negated do
- expect(Notify).not_to have_received(:in_product_marketing_email)
- end
- end
-
- shared_examples 'unexperimented' do
- it { is_expected.not_to send_invite_team_email }
-
- it 'does not record sent email' do
- expect { subject }.not_to change { Users::InProductMarketingEmail.count }
- end
- end
-
- shared_examples 'candidate' do
- it { is_expected.to send_invite_team_email(user.id, group.id, track, 0) }
-
- it 'records sent email' do
- expect { subject }.to change { Users::InProductMarketingEmail.count }.by(1)
-
- expect(
- Users::InProductMarketingEmail.where(
- user: user,
- track: track,
- series: 0
- )
- ).to exist
- end
-
- it_behaves_like 'tracks assignment and records the subject', :invite_team_email, :group do
- subject { group }
- end
- end
-
- context 'when group is in control path' do
- before do
- stub_experiments(invite_team_email: :control)
- end
-
- it { is_expected.not_to send_invite_team_email }
-
- it 'does not record sent email' do
- expect { subject }.not_to change { Users::InProductMarketingEmail.count }
- end
-
- it_behaves_like 'tracks assignment and records the subject', :invite_team_email, :group do
- subject { group }
- end
- end
-
- context 'when group is in candidate path' do
- before do
- stub_experiments(invite_team_email: :candidate)
- end
-
- it_behaves_like 'candidate'
-
- context 'when the user has not opted into marketing emails' do
- let(:user) { create(:user, email_opted_in: false ) }
-
- it_behaves_like 'unexperimented'
- end
-
- context 'when group is not top level' do
- it_behaves_like 'unexperimented' do
- let(:parent_group) do
- create(:group).tap { |g| g.add_owner(user) }
- end
- end
- end
-
- context 'when group is not set up for a company' do
- it_behaves_like 'unexperimented' do
- let(:setup_for_company) { nil }
- end
- end
-
- context 'when other users have already been added to the group' do
- before do
- group.add_developer(create(:user))
- end
-
- it_behaves_like 'unexperimented'
- end
-
- context 'when other users have already been invited to the group' do
- before do
- group.add_developer('not_a_user_yet@example.com')
- end
-
- it_behaves_like 'unexperimented'
- end
-
- context 'when the user already got sent the email' do
- before do
- create(:in_product_marketing_email, user: user, track: track, series: 0)
- end
-
- it_behaves_like 'unexperimented'
- end
- end
-end
diff --git a/spec/services/notes/build_service_spec.rb b/spec/services/notes/build_service_spec.rb
index b7b08390dcd..0e2bbcc8c66 100644
--- a/spec/services/notes/build_service_spec.rb
+++ b/spec/services/notes/build_service_spec.rb
@@ -5,12 +5,14 @@ require 'spec_helper'
RSpec.describe Notes::BuildService do
include AdminModeHelper
- let(:note) { create(:discussion_note_on_issue) }
- let(:project) { note.project }
- let(:author) { note.author }
- let(:user) { author }
- let(:merge_request) { create(:merge_request, source_project: project) }
- let(:mr_note) { create(:discussion_note_on_merge_request, noteable: merge_request, project: project, author: note.author) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:note) { create(:discussion_note_on_issue, project: project) }
+ let_it_be(:author) { note.author }
+ let_it_be(:user) { author }
+ let_it_be(:noteable_author) { create(:user) }
+ let_it_be(:other_user) { create(:user) }
+ let_it_be(:external) { create(:user, :external) }
+
let(:base_params) { { note: 'Test' } }
let(:params) { {} }
@@ -28,11 +30,10 @@ RSpec.describe Notes::BuildService do
end
context 'when discussion is resolved' do
- let(:params) { { in_reply_to_discussion_id: mr_note.discussion_id } }
+ let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+ let_it_be(:mr_note) { create(:discussion_note_on_merge_request, :resolved, noteable: merge_request, project: project, author: author) }
- before do
- mr_note.resolve!(author)
- end
+ let(:params) { { in_reply_to_discussion_id: mr_note.discussion_id } }
it 'resolves the note' do
expect(new_note).to be_valid
@@ -57,7 +58,7 @@ RSpec.describe Notes::BuildService do
end
context 'when user has no access to discussion' do
- let(:user) { create(:user) }
+ let(:user) { other_user }
it 'sets an error' do
expect(new_note.errors[:base]).to include('Discussion to reply to cannot be found')
@@ -65,16 +66,14 @@ RSpec.describe Notes::BuildService do
end
context 'personal snippet note' do
- def reply(note, user = nil)
- user ||= create(:user)
-
+ def reply(note, user = other_user)
described_class.new(nil,
user,
note: 'Test',
in_reply_to_discussion_id: note.discussion_id).execute
end
- let(:snippet_author) { create(:user) }
+ let_it_be(:snippet_author) { noteable_author }
context 'when a snippet is public' do
it 'creates a reply note' do
@@ -89,8 +88,8 @@ RSpec.describe Notes::BuildService do
end
context 'when a snippet is private' do
- let(:snippet) { create(:personal_snippet, :private, author: snippet_author) }
- let(:note) { create(:discussion_note_on_personal_snippet, noteable: snippet) }
+ let_it_be(:snippet) { create(:personal_snippet, :private, author: snippet_author) }
+ let_it_be(:note) { create(:discussion_note_on_personal_snippet, noteable: snippet) }
it 'creates a reply note when the author replies' do
new_note = reply(note, snippet_author)
@@ -107,8 +106,8 @@ RSpec.describe Notes::BuildService do
end
context 'when a snippet is internal' do
- let(:snippet) { create(:personal_snippet, :internal, author: snippet_author) }
- let(:note) { create(:discussion_note_on_personal_snippet, noteable: snippet) }
+ let_it_be(:snippet) { create(:personal_snippet, :internal, author: snippet_author) }
+ let_it_be(:note) { create(:discussion_note_on_personal_snippet, noteable: snippet) }
it 'creates a reply note when the author replies' do
new_note = reply(note, snippet_author)
@@ -125,7 +124,7 @@ RSpec.describe Notes::BuildService do
end
it 'sets an error when an external user replies' do
- new_note = reply(note, create(:user, :external))
+ new_note = reply(note, external)
expect(new_note.errors[:base]).to include('Discussion to reply to cannot be found')
end
@@ -134,7 +133,8 @@ RSpec.describe Notes::BuildService do
end
context 'when replying to individual note' do
- let(:note) { create(:note_on_issue) }
+ let_it_be(:note) { create(:note_on_issue, project: project) }
+
let(:params) { { in_reply_to_discussion_id: note.discussion_id } }
it 'sets the note up to be in reply to that note' do
@@ -144,7 +144,7 @@ RSpec.describe Notes::BuildService do
end
context 'when noteable does not support replies' do
- let(:note) { create(:note_on_commit) }
+ let_it_be(:note) { create(:note_on_commit, project: project) }
it 'builds another individual note' do
expect(new_note).to be_valid
@@ -155,87 +155,137 @@ RSpec.describe Notes::BuildService do
end
context 'confidential comments' do
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:issuable_assignee) { other_user }
+ let_it_be(:issue) do
+ create(:issue, project: project, author: noteable_author, assignees: [issuable_assignee])
+ end
+
before do
- project.add_reporter(author)
+ project.add_guest(guest)
+ project.add_reporter(reporter)
end
- context 'when replying to a confidential comment' do
- let(:note) { create(:note_on_issue, confidential: true) }
- let(:params) { { in_reply_to_discussion_id: note.discussion_id, confidential: false } }
+ context 'when creating a new confidential comment' do
+ let(:params) { { confidential: true, noteable: issue } }
- context 'when the user can read confidential comments' do
- it '`confidential` param is ignored and set to `true`' do
- expect(new_note.confidential).to be_truthy
- end
+ shared_examples 'user allowed to set comment as confidential' do
+ it { expect(new_note.confidential).to be_truthy }
end
- context 'when the user cannot read confidential comments' do
- let(:user) { create(:user) }
+ shared_examples 'user not allowed to set comment as confidential' do
+ it { expect(new_note.confidential).to be_falsey }
+ end
- it 'returns `Discussion to reply to cannot be found` error' do
- expect(new_note.errors.added?(:base, "Discussion to reply to cannot be found")).to be true
+ context 'reporter' do
+ let(:user) { reporter }
+
+ it_behaves_like 'user allowed to set comment as confidential'
+ end
+
+ context 'issuable author' do
+ let(:user) { noteable_author }
+
+ it_behaves_like 'user allowed to set comment as confidential'
+ end
+
+ context 'issuable assignee' do
+ let(:user) { issuable_assignee }
+
+ it_behaves_like 'user allowed to set comment as confidential'
+ end
+
+ context 'admin' do
+ before do
+ enable_admin_mode!(admin)
end
+
+ let(:user) { admin }
+
+ it_behaves_like 'user allowed to set comment as confidential'
end
- end
- context 'when replying to a public comment' do
- let(:note) { create(:note_on_issue, confidential: false) }
- let(:params) { { in_reply_to_discussion_id: note.discussion_id, confidential: true } }
+ context 'external' do
+ let(:user) { external }
- it '`confidential` param is ignored and set to `false`' do
- expect(new_note.confidential).to be_falsey
+ it_behaves_like 'user not allowed to set comment as confidential'
+ end
+
+ context 'guest' do
+ let(:user) { guest }
+
+ it_behaves_like 'user not allowed to set comment as confidential'
end
end
- context 'when creating a new comment' do
- context 'when the `confidential` note flag is set to `true`' do
- context 'when the user is allowed (reporter)' do
- let(:params) { { confidential: true, noteable: merge_request } }
+ context 'when replying to a confidential comment' do
+ let_it_be(:note) { create(:note_on_issue, confidential: true, noteable: issue, project: project) }
- it 'note `confidential` flag is set to `true`' do
- expect(new_note.confidential).to be_truthy
- end
- end
+ let(:params) { { in_reply_to_discussion_id: note.discussion_id, confidential: false } }
- context 'when the user is allowed (issuable author)' do
- let(:user) { create(:user) }
- let(:issue) { create(:issue, author: user) }
- let(:params) { { confidential: true, noteable: issue } }
+ shared_examples 'returns `Discussion to reply to cannot be found` error' do
+ it do
+ expect(new_note.errors.added?(:base, "Discussion to reply to cannot be found")).to be true
+ end
+ end
- it 'note `confidential` flag is set to `true`' do
- expect(new_note.confidential).to be_truthy
- end
+ shared_examples 'confidential set to `true`' do
+ it '`confidential` param is ignored to match the parent note confidentiality' do
+ expect(new_note.confidential).to be_truthy
end
+ end
- context 'when the user is allowed (admin)' do
- before do
- enable_admin_mode!(admin)
- end
+ context 'with reporter access' do
+ let(:user) { reporter }
+
+ it_behaves_like 'confidential set to `true`'
+ end
- let(:admin) { create(:admin) }
- let(:params) { { confidential: true, noteable: merge_request } }
+ context 'with admin access' do
+ let(:user) { admin }
- it 'note `confidential` flag is set to `true`' do
- expect(new_note.confidential).to be_truthy
- end
+ before do
+ enable_admin_mode!(admin)
end
- context 'when the user is not allowed' do
- let(:user) { create(:user) }
- let(:params) { { confidential: true, noteable: merge_request } }
+ it_behaves_like 'confidential set to `true`'
+ end
+
+ context 'with noteable author' do
+ let(:user) { note.noteable.author }
- it 'note `confidential` flag is set to `false`' do
- expect(new_note.confidential).to be_falsey
- end
- end
+ it_behaves_like 'confidential set to `true`'
end
- context 'when the `confidential` note flag is set to `false`' do
- let(:params) { { confidential: false, noteable: merge_request } }
+ context 'with noteable assignee' do
+ let(:user) { issuable_assignee }
- it 'note `confidential` flag is set to `false`' do
- expect(new_note.confidential).to be_falsey
- end
+ it_behaves_like 'confidential set to `true`'
+ end
+
+ context 'with guest access' do
+ let(:user) { guest }
+
+ it_behaves_like 'returns `Discussion to reply to cannot be found` error'
+ end
+
+ context 'with external user' do
+ let(:user) { external }
+
+ it_behaves_like 'returns `Discussion to reply to cannot be found` error'
+ end
+ end
+
+ context 'when replying to a public comment' do
+ let_it_be(:note) { create(:note_on_issue, confidential: false, noteable: issue, project: project) }
+
+ let(:params) { { in_reply_to_discussion_id: note.discussion_id, confidential: true } }
+
+ it '`confidential` param is ignored and set to `false`' do
+ expect(new_note.confidential).to be_falsey
end
end
end
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index babbd44a9f1..b0410123630 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -106,7 +106,8 @@ RSpec.describe Notes::CreateService do
type: 'DiffNote',
noteable_type: 'MergeRequest',
noteable_id: merge_request.id,
- position: position.to_h)
+ position: position.to_h,
+ confidential: false)
end
before do
@@ -141,7 +142,8 @@ RSpec.describe Notes::CreateService do
type: 'DiffNote',
noteable_type: 'MergeRequest',
noteable_id: merge_request.id,
- position: position.to_h)
+ position: position.to_h,
+ confidential: false)
expect(merge_request).not_to receive(:diffs)
@@ -173,7 +175,8 @@ RSpec.describe Notes::CreateService do
type: 'DiffNote',
noteable_type: 'MergeRequest',
noteable_id: merge_request.id,
- position: position.to_h)
+ position: position.to_h,
+ confidential: false)
end
it 'note is associated with a note diff file' do
@@ -201,7 +204,8 @@ RSpec.describe Notes::CreateService do
type: 'DiffNote',
noteable_type: 'MergeRequest',
noteable_id: merge_request.id,
- position: position.to_h)
+ position: position.to_h,
+ confidential: false)
end
it 'note is not associated with a note diff file' do
@@ -230,7 +234,8 @@ RSpec.describe Notes::CreateService do
type: 'DiffNote',
noteable_type: 'MergeRequest',
noteable_id: merge_request.id,
- position: image_position.to_h)
+ position: image_position.to_h,
+ confidential: false)
end
it 'note is not associated with a note diff file' do
@@ -306,7 +311,7 @@ RSpec.describe Notes::CreateService do
let_it_be(:merge_request) { create(:merge_request, source_project: project, labels: [bug_label]) }
let(:issuable) { merge_request }
- let(:note_params) { opts.merge(noteable_type: 'MergeRequest', noteable_id: merge_request.id) }
+ let(:note_params) { opts.merge(noteable_type: 'MergeRequest', noteable_id: merge_request.id, confidential: false) }
let(:merge_request_quick_actions) do
[
QuickAction.new(
diff --git a/spec/services/notes/update_service_spec.rb b/spec/services/notes/update_service_spec.rb
index 71ac1641ca5..ae7bea30944 100644
--- a/spec/services/notes/update_service_spec.rb
+++ b/spec/services/notes/update_service_spec.rb
@@ -138,45 +138,6 @@ RSpec.describe Notes::UpdateService do
end
end
- context 'setting confidentiality' do
- let(:opts) { { confidential: true } }
-
- context 'simple note' do
- it 'updates the confidentiality' do
- expect { update_note(opts) }.to change { note.reload.confidential }.from(nil).to(true)
- end
- end
-
- context 'discussion notes' do
- let(:note) { create(:discussion_note, project: project, noteable: issue, author: user, note: "Old note #{user2.to_reference}") }
- let!(:response_note_1) { create(:discussion_note, project: project, noteable: issue, in_reply_to: note) }
- let!(:response_note_2) { create(:discussion_note, project: project, noteable: issue, in_reply_to: note, confidential: false) }
- let!(:other_note) { create(:note, project: project, noteable: issue) }
-
- context 'when updating the root note' do
- it 'updates the confidentiality of the root note and all the responses' do
- update_note(opts)
-
- expect(note.reload.confidential).to be_truthy
- expect(response_note_1.reload.confidential).to be_truthy
- expect(response_note_2.reload.confidential).to be_truthy
- expect(other_note.reload.confidential).to be_falsey
- end
- end
-
- context 'when updating one of the response notes' do
- it 'updates only the confidentiality of the note that is being updated' do
- Notes::UpdateService.new(project, user, opts).execute(response_note_1)
-
- expect(note.reload.confidential).to be_falsey
- expect(response_note_1.reload.confidential).to be_truthy
- expect(response_note_2.reload.confidential).to be_falsey
- expect(other_note.reload.confidential).to be_falsey
- end
- end
- end
- end
-
context 'todos' do
shared_examples 'does not update todos' do
it 'keep todos' do
diff --git a/spec/services/notification_recipients/builder/default_spec.rb b/spec/services/notification_recipients/builder/default_spec.rb
index c142cc11384..4d0ddc7c4f7 100644
--- a/spec/services/notification_recipients/builder/default_spec.rb
+++ b/spec/services/notification_recipients/builder/default_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe NotificationRecipients::Builder::Default do
describe '#build!' do
let_it_be(:group) { create(:group, :public) }
- let_it_be(:project) { create(:project, :public, group: group).tap { |p| p.add_developer(project_watcher) } }
+ let_it_be(:project) { create(:project, :public, group: group).tap { |p| p.add_developer(project_watcher) if project_watcher } }
let_it_be(:target) { create(:issue, project: project) }
let_it_be(:current_user) { create(:user) }
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 399b2b4be2d..d2d55c5ab79 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -376,6 +376,17 @@ RSpec.describe NotificationService, :mailer do
end
end
+ describe '#new_email_address_added' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:email) { create(:email, user: user) }
+
+ subject { notification.new_email_address_added(user, email) }
+
+ it 'sends email to the user' do
+ expect { subject }.to have_enqueued_email(user, email, mail: 'new_email_address_added_email')
+ end
+ end
+
describe 'Notes' do
context 'issue note' do
let_it_be(:project) { create(:project, :private) }
@@ -2090,6 +2101,70 @@ RSpec.describe NotificationService, :mailer do
should_not_email(@u_lazy_participant)
end
+ describe 'triggers push_to_merge_request_email with corresponding email' do
+ let_it_be(:merge_request) { create(:merge_request, author: author, source_project: project) }
+
+ def mock_commits(length)
+ Array.new(length) { |i| double(:commit, short_id: SecureRandom.hex(4), title: "This is commit #{i}") }
+ end
+
+ def commit_to_hash(commit)
+ { short_id: commit.short_id, title: commit.title }
+ end
+
+ let(:existing_commits) { mock_commits(50) }
+ let(:expected_existing_commits) { [commit_to_hash(existing_commits.first), commit_to_hash(existing_commits.last)] }
+
+ before do
+ allow(::Notify).to receive(:push_to_merge_request_email).and_call_original
+ end
+
+ where(:number_of_new_commits, :number_of_new_commits_displayed) do
+ limit = described_class::NEW_COMMIT_EMAIL_DISPLAY_LIMIT
+ [
+ [0, 0],
+ [limit - 2, limit - 2],
+ [limit - 1, limit - 1],
+ [limit, limit],
+ [limit + 1, limit],
+ [limit + 2, limit]
+ ]
+ end
+
+ with_them do
+ let(:new_commits) { mock_commits(number_of_new_commits) }
+ let(:expected_new_commits) { new_commits.first(number_of_new_commits_displayed).map(&method(:commit_to_hash)) }
+
+ it 'triggers the corresponding mailer method with list of stripped commits' do
+ notification.push_to_merge_request(
+ merge_request, merge_request.author,
+ new_commits: new_commits, existing_commits: existing_commits
+ )
+
+ expect(Notify).to have_received(:push_to_merge_request_email).at_least(:once).with(
+ @subscriber.id, merge_request.id, merge_request.author.id, "subscribed",
+ new_commits: expected_new_commits, total_new_commits_count: number_of_new_commits,
+ existing_commits: expected_existing_commits, total_existing_commits_count: 50
+ )
+ end
+ end
+
+ context 'there is only one existing commit' do
+ let(:new_commits) { mock_commits(10) }
+ let(:expected_new_commits) { new_commits.map(&method(:commit_to_hash)) }
+
+ it 'triggers corresponding mailer method with only one existing commit' do
+ notification.push_to_merge_request(merge_request, merge_request.author, new_commits: new_commits, existing_commits: existing_commits.first(1))
+
+ expect(Notify).to have_received(:push_to_merge_request_email).at_least(:once).with(
+ @subscriber.id, merge_request.id, merge_request.author.id, "subscribed",
+ new_commits: expected_new_commits, total_new_commits_count: 10,
+ existing_commits: expected_existing_commits.first(1), total_existing_commits_count: 1
+ )
+ end
+ end
+ end
+
it_behaves_like 'participating notifications' do
let(:participant) { create(:user, username: 'user-participant') }
let(:issuable) { merge_request }
diff --git a/spec/services/packages/rubygems/metadata_extraction_service_spec.rb b/spec/services/packages/rubygems/metadata_extraction_service_spec.rb
index b308daad8f5..bbd5b6f3d59 100644
--- a/spec/services/packages/rubygems/metadata_extraction_service_spec.rb
+++ b/spec/services/packages/rubygems/metadata_extraction_service_spec.rb
@@ -46,5 +46,13 @@ RSpec.describe Packages::Rubygems::MetadataExtractionService do
expect(metadata.requirements).to eq(gemspec.requirements.to_json)
expect(metadata.rubygems_version).to eq(gemspec.rubygems_version)
end
+
+ context 'with an existing metadatum' do
+ let_it_be(:metadatum) { create(:rubygems_metadatum, package: package) }
+
+ it 'updates it' do
+ expect { subject }.not_to change { Packages::Rubygems::Metadatum.count }
+ end
+ end
end
end
diff --git a/spec/services/projects/apple_target_platform_detector_service_spec.rb b/spec/services/projects/apple_target_platform_detector_service_spec.rb
new file mode 100644
index 00000000000..6391161824c
--- /dev/null
+++ b/spec/services/projects/apple_target_platform_detector_service_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::AppleTargetPlatformDetectorService do
+ let_it_be(:project) { build(:project) }
+
+ subject { described_class.new(project).execute }
+
+ context 'when project is not an xcode project' do
+ before do
+ allow(Gitlab::FileFinder).to receive(:new) { instance_double(Gitlab::FileFinder, find: []) }
+ end
+
+ it 'returns an empty array' do
+ is_expected.to match_array []
+ end
+ end
+
+ context 'when project is an xcode project' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:finder) { instance_double(Gitlab::FileFinder) }
+
+ before do
+ allow(Gitlab::FileFinder).to receive(:new) { finder }
+ end
+
+ def search_query(sdk, filename)
+ "SDKROOT = #{sdk} filename:#{filename}"
+ end
+
+ context 'when setting string is found' do
+ where(:sdk, :filename, :result) do
+ 'iphoneos' | 'project.pbxproj' | [:ios]
+ 'iphoneos' | '*.xcconfig' | [:ios]
+ end
+
+ with_them do
+ before do
+ allow(finder).to receive(:find).with(anything) { [] }
+ allow(finder).to receive(:find).with(search_query(sdk, filename)) { [instance_double(Gitlab::Search::FoundBlob)] }
+ end
+
+ it 'returns an array of unique detected targets' do
+ is_expected.to match_array result
+ end
+ end
+ end
+
+ context 'when setting string is not found' do
+ before do
+ allow(finder).to receive(:find).with(anything) { [] }
+ end
+
+ it 'returns an empty array' do
+ is_expected.to match_array []
+ end
+ end
+ end
+end
diff --git a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb
index 38a3e00c8e7..86c0ba4222c 100644
--- a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb
+++ b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Projects::ContainerRepository::CleanupTagsService, :clean_gitlab_
let(:tags) { %w[latest A Ba Bb C D E] }
before do
- project.add_maintainer(user)
+ project.add_maintainer(user) if user
stub_container_registry_config(enabled: true)
diff --git a/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb b/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb
index 7fc963949eb..22cada7816b 100644
--- a/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb
+++ b/spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb
@@ -58,7 +58,19 @@ RSpec.describe Projects::ContainerRepository::ThirdParty::DeleteTagsService do
stub_put_manifest_request('Ba', 500, {})
end
- it { is_expected.to eq(status: :error, message: 'could not delete tags') }
+ it { is_expected.to eq(status: :error, message: "could not delete tags: #{tags.join(', ')}")}
+
+ context 'when a large list of tag updates fails' do
+ let(:tags) { Array.new(1000) { |i| "tag_#{i}" } }
+
+ before do
+ expect(service).to receive(:replace_tag_manifests).and_return({})
+ end
+
+ it 'truncates the log message' do
+ expect(subject).to eq(status: :error, message: "could not delete tags: #{tags.join(', ')}".truncate(1000))
+ end
+ end
end
context 'a single tag update fails' do
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index 96a50b26871..c5c5af3cb01 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -135,10 +135,22 @@ RSpec.describe Projects::CreateService, '#execute' do
create_project(user, opts)
end
- it 'builds associated project settings' do
+ it 'creates associated project settings' do
project = create_project(user, opts)
- expect(project.project_setting).to be_new_record
+ expect(project.project_setting).to be_persisted
+ end
+
+ context 'create_project_settings feature flag is disabled' do
+ before do
+ stub_feature_flags(create_project_settings: false)
+ end
+
+ it 'builds associated project settings' do
+ project = create_project(user, opts)
+
+ expect(project.project_setting).to be_new_record
+ end
end
it_behaves_like 'storing arguments in the application context' do
@@ -376,6 +388,18 @@ RSpec.describe Projects::CreateService, '#execute' do
imported_project
end
+
+ describe 'import scheduling' do
+ context 'when project import type is gitlab project migration' do
+ it 'does not schedule project import' do
+ opts[:import_type] = 'gitlab_project_migration'
+
+ project = create_project(user, opts)
+
+ expect(project.import_state.status).to eq('none')
+ end
+ end
+ end
end
context 'builds_enabled global setting' do
diff --git a/spec/services/projects/operations/update_service_spec.rb b/spec/services/projects/operations/update_service_spec.rb
index b64f2d1e7d6..3ee867ba6f2 100644
--- a/spec/services/projects/operations/update_service_spec.rb
+++ b/spec/services/projects/operations/update_service_spec.rb
@@ -407,10 +407,11 @@ RSpec.describe Projects::Operations::UpdateService do
context 'prometheus integration' do
context 'prometheus params were passed into service' do
- let(:prometheus_integration) do
- build_stubbed(:prometheus_integration, project: project, properties: {
+ let!(:prometheus_integration) do
+ create(:prometheus_integration, :instance, properties: {
api_url: "http://example.prometheus.com",
- manual_configuration: "0"
+ manual_configuration: "0",
+ google_iap_audience_client_id: 123
})
end
@@ -424,21 +425,23 @@ RSpec.describe Projects::Operations::UpdateService do
end
it 'uses Project#find_or_initialize_integration to include instance defined defaults and pass them to Projects::UpdateService', :aggregate_failures do
- project_update_service = double(Projects::UpdateService)
-
- expect(project)
- .to receive(:find_or_initialize_integration)
- .with('prometheus')
- .and_return(prometheus_integration)
expect(Projects::UpdateService).to receive(:new) do |project_arg, user_arg, update_params_hash|
+ prometheus_attrs = update_params_hash[:prometheus_integration_attributes]
+
expect(project_arg).to eq project
expect(user_arg).to eq user
- expect(update_params_hash[:prometheus_integration_attributes]).to include('properties' => { 'api_url' => 'http://new.prometheus.com', 'manual_configuration' => '1' })
- expect(update_params_hash[:prometheus_integration_attributes]).not_to include(*%w(id project_id created_at updated_at))
- end.and_return(project_update_service)
- expect(project_update_service).to receive(:execute)
+ expect(prometheus_attrs).to have_key('encrypted_properties')
+ expect(prometheus_attrs.keys).not_to include(*%w(id project_id created_at updated_at properties))
+ expect(prometheus_attrs['encrypted_properties']).not_to eq(prometheus_integration.encrypted_properties)
+ end.and_call_original
- subject.execute
+ expect { subject.execute }.to change(Integrations::Prometheus, :count).by(1)
+
+ expect(Integrations::Prometheus.last).to have_attributes(
+ api_url: 'http://new.prometheus.com',
+ manual_configuration: true,
+ google_iap_audience_client_id: 123
+ )
end
end
diff --git a/spec/services/projects/record_target_platforms_service_spec.rb b/spec/services/projects/record_target_platforms_service_spec.rb
new file mode 100644
index 00000000000..85311f36428
--- /dev/null
+++ b/spec/services/projects/record_target_platforms_service_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::RecordTargetPlatformsService, '#execute' do
+ let_it_be(:project) { create(:project) }
+
+ subject(:execute) { described_class.new(project).execute }
+
+ context 'when project is an XCode project' do
+ before do
+ double = instance_double(Projects::AppleTargetPlatformDetectorService, execute: [:ios, :osx])
+ allow(Projects::AppleTargetPlatformDetectorService).to receive(:new) { double }
+ end
+
+ it 'creates a new setting record for the project', :aggregate_failures do
+ expect { execute }.to change { ProjectSetting.count }.from(0).to(1)
+ expect(ProjectSetting.last.target_platforms).to match_array(%w(ios osx))
+ end
+
+ it 'returns array of detected target platforms' do
+ expect(execute).to match_array %w(ios osx)
+ end
+
+ context 'when a project has an existing setting record' do
+ before do
+ create(:project_setting, project: project, target_platforms: saved_target_platforms)
+ end
+
+ def project_setting
+ ProjectSetting.find_by_project_id(project.id)
+ end
+
+ context 'when target platforms changed' do
+ let(:saved_target_platforms) { %w(tvos) }
+
+ it 'updates' do
+ expect { execute }.to change { project_setting.target_platforms }.from(%w(tvos)).to(%w(ios osx))
+ end
+
+ it { is_expected.to match_array %w(ios osx) }
+ end
+
+ context 'when target platforms are the same' do
+ let(:saved_target_platforms) { %w(osx ios) }
+
+ it 'does not update' do
+ expect { execute }.not_to change { project_setting.updated_at }
+ end
+ end
+ end
+ end
+
+ context 'when project is not an XCode project' do
+ before do
+ double = instance_double(Projects::AppleTargetPlatformDetectorService, execute: [])
+ allow(Projects::AppleTargetPlatformDetectorService).to receive(:new).with(project) { double }
+ end
+
+ it 'does nothing' do
+ expect { execute }.not_to change { ProjectSetting.count }
+ end
+
+ it { is_expected.to be_nil }
+ end
+end
diff --git a/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb b/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb
index 41de8c6bdbb..41487e9ea48 100644
--- a/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb
+++ b/spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb
@@ -10,7 +10,8 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
let_it_be(:artifact_1) { create(:ci_job_artifact, project: project, size: 1, created_at: 14.days.ago) }
let_it_be(:artifact_2) { create(:ci_job_artifact, project: project, size: 2, created_at: 13.days.ago) }
- let_it_be(:artifact_3) { create(:ci_job_artifact, project: project, size: 5, created_at: 12.days.ago) }
+ let_it_be(:artifact_3) { create(:ci_job_artifact, project: project, size: nil, created_at: 13.days.ago) }
+ let_it_be(:artifact_4) { create(:ci_job_artifact, project: project, size: 5, created_at: 12.days.ago) }
# This should not be included in the recalculation as it is created later than the refresh start time
let_it_be(:future_artifact) { create(:ci_job_artifact, project: project, size: 8, created_at: 2.days.from_now) }
@@ -33,7 +34,7 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
end
before do
- stub_const("#{described_class}::BATCH_SIZE", 2)
+ stub_const("#{described_class}::BATCH_SIZE", 3)
stats = create(:project_statistics, project: project, build_artifacts_size: 120)
stats.increment_counter(:build_artifacts_size, 30)
@@ -48,7 +49,7 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
end
it 'updates the last_job_artifact_id to the ID of the last artifact from the batch' do
- expect { service.execute }.to change { refresh.reload.last_job_artifact_id.to_i }.to(artifact_2.id)
+ expect { service.execute }.to change { refresh.reload.last_job_artifact_id.to_i }.to(artifact_3.id)
end
it 'requeues the refresh job' do
@@ -62,7 +63,7 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
:project_build_artifacts_size_refresh,
:pending,
project: project,
- last_job_artifact_id: artifact_2.id
+ last_job_artifact_id: artifact_3.id
)
end
@@ -73,7 +74,7 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
end
it 'keeps the last_job_artifact_id unchanged' do
- expect(refresh.reload.last_job_artifact_id).to eq(artifact_2.id)
+ expect(refresh.reload.last_job_artifact_id).to eq(artifact_3.id)
end
it 'keeps the state of the refresh record at running' do
@@ -89,7 +90,7 @@ RSpec.describe Projects::RefreshBuildArtifactsSizeStatisticsService, :clean_gitl
project: project,
updated_at: 2.days.ago,
refresh_started_at: now,
- last_job_artifact_id: artifact_3.id
+ last_job_artifact_id: artifact_4.id
)
end
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
index fb94e94fd18..e547ace1d9f 100644
--- a/spec/services/projects/transfer_service_spec.rb
+++ b/spec/services/projects/transfer_service_spec.rb
@@ -11,8 +11,9 @@ RSpec.describe Projects::TransferService do
let(:project) { create(:project, :repository, :legacy_storage, namespace: user.namespace) }
let(:target) { group }
+ let(:executor) { user }
- subject(:execute_transfer) { described_class.new(project, user).execute(target).tap { project.reload } }
+ subject(:execute_transfer) { described_class.new(project, executor).execute(target).tap { project.reload } }
context 'with npm packages' do
before do
@@ -92,6 +93,55 @@ RSpec.describe Projects::TransferService do
end
end
+ context 'project in a group -> a personal namespace', :enable_admin_mode do
+ let(:project) { create(:project, :repository, :legacy_storage, group: group) }
+ let(:target) { user.namespace }
+ # We need to use an admin user as the executor because
+ # only an admin user has required permissions to transfer projects
+ # under _all_ the different circumstances specified below.
+ let(:executor) { create(:user, :admin) }
+
+ it 'executes the transfer to personal namespace successfully' do
+ execute_transfer
+
+ expect(project.namespace).to eq(user.namespace)
+ end
+
+ context 'the owner of the namespace does not have a direct membership in the project residing in the group' do
+ it 'creates a project membership record for the owner of the namespace, with OWNER access level, after the transfer' do
+ execute_transfer
+
+ expect(project.members.owners.find_by(user_id: user.id)).to be_present
+ end
+ end
+
+ context 'the owner of the namespace has a direct membership in the project residing in the group' do
+ context 'that membership has an access level of OWNER' do
+ before do
+ project.add_owner(user)
+ end
+
+ it 'retains the project membership record for the owner of the namespace, with OWNER access level, after the transfer' do
+ execute_transfer
+
+ expect(project.members.owners.find_by(user_id: user.id)).to be_present
+ end
+ end
+
+ context 'that membership has an access level that is not OWNER' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'updates the project membership record for the owner of the namespace, to OWNER access level, after the transfer' do
+ execute_transfer
+
+ expect(project.members.owners.find_by(user_id: user.id)).to be_present
+ end
+ end
+ end
+ end
+
context 'when transfer succeeds' do
before do
group.add_owner(user)
@@ -148,23 +198,23 @@ RSpec.describe Projects::TransferService do
context 'with a project integration' do
let_it_be_with_reload(:project) { create(:project, namespace: user.namespace) }
- let_it_be(:instance_integration) { create(:integrations_slack, :instance, webhook: 'http://project.slack.com') }
+ let_it_be(:instance_integration) { create(:integrations_slack, :instance) }
+ let_it_be(:project_integration) { create(:integrations_slack, project: project) }
- context 'with an inherited integration' do
- let_it_be(:project_integration) { create(:integrations_slack, project: project, webhook: 'http://project.slack.com', inherit_from_id: instance_integration.id) }
+ context 'when it inherits from instance_integration' do
+ before do
+ project_integration.update!(inherit_from_id: instance_integration.id, webhook: instance_integration.webhook)
+ end
it 'replaces inherited integrations', :aggregate_failures do
- execute_transfer
-
- expect(project.slack_integration.webhook).to eq(group_integration.webhook)
- expect(Integration.count).to eq(3)
+ expect { execute_transfer }
+ .to change(Integration, :count).by(0)
+ .and change { project.slack_integration.webhook }.to eq(group_integration.webhook)
end
end
context 'with a custom integration' do
- let_it_be(:project_integration) { create(:integrations_slack, project: project, webhook: 'http://project.slack.com') }
-
- it 'does not updates the integrations' do
+ it 'does not update the integrations' do
expect { execute_transfer }.not_to change { project.slack_integration.webhook }
end
end
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index 94e0e8a9ea1..85dbc39edcf 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -671,6 +671,19 @@ RSpec.describe QuickActions::InterpretService do
end
shared_examples 'assign command' do
+ it 'assigns to users with escaped underscores' do
+ user = create(:user)
+ base = user.username
+ user.update!(username: "#{base}_")
+ issuable.project.add_developer(user)
+
+ cmd = "/assign @#{base}\\_"
+
+ _, updates, _ = service.execute(cmd, issuable)
+
+ expect(updates).to eq(assignee_ids: [user.id])
+ end
+
it 'assigns to a single user' do
_, updates, _ = service.execute(content, issuable)
@@ -726,6 +739,17 @@ RSpec.describe QuickActions::InterpretService do
expect(reviewer).to be_attention_requested
end
+
+ it 'supports attn alias' do
+ attn_cmd = content.gsub(/attention/, 'attn')
+ _, _, message = service.execute(attn_cmd, issuable)
+
+ expect(message).to eq("Requested attention from #{developer.to_reference}.")
+
+ reviewer.reload
+
+ expect(reviewer).to be_attention_requested
+ end
end
shared_examples 'remove attention command' do
@@ -800,7 +824,7 @@ RSpec.describe QuickActions::InterpretService do
let(:project) { repository_project }
let(:service) { described_class.new(project, developer, {}) }
- it_behaves_like 'failed command', 'Merge request diff sha parameter is required for the merge quick action.' do
+ it_behaves_like 'failed command', 'The `/merge` quick action requires the SHA of the head of the branch.' do
let(:content) { "/merge" }
let(:issuable) { merge_request }
end
diff --git a/spec/services/service_ping/build_payload_service_spec.rb b/spec/services/service_ping/build_payload_service_spec.rb
index b90e5e66518..cd2685069c9 100644
--- a/spec/services/service_ping/build_payload_service_spec.rb
+++ b/spec/services/service_ping/build_payload_service_spec.rb
@@ -4,10 +4,6 @@ require 'spec_helper'
RSpec.describe ServicePing::BuildPayloadService do
describe '#execute', :without_license do
- before do
- stub_feature_flags(merge_service_ping_instrumented_metrics: false)
- end
-
subject(:service_ping_payload) { described_class.new.execute }
include_context 'stubbed service ping metrics definitions' do
diff --git a/spec/services/task_list_toggle_service_spec.rb b/spec/services/task_list_toggle_service_spec.rb
index 81f80ee926a..f889f298213 100644
--- a/spec/services/task_list_toggle_service_spec.rb
+++ b/spec/services/task_list_toggle_service_spec.rb
@@ -16,6 +16,8 @@ RSpec.describe TaskListToggleService do
- [ ] loose list
with an embedded paragraph
+
+ + [ ] No-break space (U+00A0)
EOT
end
@@ -40,12 +42,17 @@ RSpec.describe TaskListToggleService do
</ul>
</li>
</ol>
- <ul data-sourcepos="9:1-11:28" class="task-list" dir="auto">
- <li data-sourcepos="9:1-11:28" class="task-list-item">
+ <ul data-sourcepos="9:1-12:0" class="task-list" dir="auto">
+ <li data-sourcepos="9:1-12:0" class="task-list-item">
<p data-sourcepos="9:3-9:16"><input type="checkbox" class="task-list-item-checkbox" disabled=""> loose list</p>
<p data-sourcepos="11:3-11:28">with an embedded paragraph</p>
</li>
</ul>
+ <ul data-sourcepos="13:1-13:21" class="task-list" dir="auto">
+ <li data-sourcepos="13:1-13:21" class="task-list-item">
+ <input type="checkbox" class="task-list-item-checkbox" disabled=""> No-break space (U+00A0)
+ </li>
+ </ul>
EOT
end
@@ -79,6 +86,16 @@ RSpec.describe TaskListToggleService do
expect(toggler.updated_markdown_html).to include('disabled checked> loose list')
end
+ it 'checks task with no-break space' do
+ toggler = described_class.new(markdown, markdown_html,
+ toggle_as_checked: true,
+ line_source: '+ [ ] No-break space (U+00A0)', line_number: 13)
+
+ expect(toggler.execute).to be_truthy
+ expect(toggler.updated_markdown.lines[12]).to eq "+ [x] No-break space (U+00A0)"
+ expect(toggler.updated_markdown_html).to include('disabled checked> No-break space (U+00A0)')
+ end
+
it 'returns false if line_source does not match the text' do
toggler = described_class.new(markdown, markdown_html,
toggle_as_checked: false,
diff --git a/spec/services/users/destroy_service_spec.rb b/spec/services/users/destroy_service_spec.rb
index 602db66dba1..80a506bb1d6 100644
--- a/spec/services/users/destroy_service_spec.rb
+++ b/spec/services/users/destroy_service_spec.rb
@@ -332,4 +332,39 @@ RSpec.describe Users::DestroyService do
expect(User.exists?(other_user.id)).to be(false)
end
end
+
+ context 'batched nullify' do
+ let(:other_user) { create(:user) }
+
+ context 'when :nullify_in_batches_on_user_deletion feature flag is enabled' do
+ it 'nullifies related associations in batches' do
+ expect(other_user).to receive(:nullify_dependent_associations_in_batches).and_call_original
+
+ described_class.new(user).execute(other_user, skip_authorization: true)
+ end
+
+ it 'nullifies last_updated_issues and closed_issues' do
+ issue = create(:issue, closed_by: other_user, updated_by: other_user)
+
+ described_class.new(user).execute(other_user, skip_authorization: true)
+
+ issue.reload
+
+ expect(issue.closed_by).to be_nil
+ expect(issue.updated_by).to be_nil
+ end
+ end
+
+ context 'when :nullify_in_batches_on_user_deletion feature flag is disabled' do
+ before do
+ stub_feature_flags(nullify_in_batches_on_user_deletion: false)
+ end
+
+ it 'does not use batching' do
+ expect(other_user).not_to receive(:nullify_dependent_associations_in_batches)
+
+ described_class.new(user).execute(other_user, skip_authorization: true)
+ end
+ end
+ end
end
diff --git a/spec/services/users/saved_replies/destroy_service_spec.rb b/spec/services/users/saved_replies/destroy_service_spec.rb
new file mode 100644
index 00000000000..cb97fac7b7c
--- /dev/null
+++ b/spec/services/users/saved_replies/destroy_service_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::SavedReplies::DestroyService do
+ describe '#execute' do
+ let!(:saved_reply) { create(:saved_reply) }
+
+ subject { described_class.new(saved_reply: saved_reply).execute }
+
+ context 'when destroy fails' do
+ before do
+ allow(saved_reply).to receive(:destroy).and_return(false)
+ end
+
+ it 'does not remove Saved Reply from database' do
+ expect { subject }.not_to change(::Users::SavedReply, :count)
+ end
+
+ it { is_expected.not_to be_success }
+ end
+
+ context 'when destroy succeeds' do
+ it { is_expected.to be_success }
+
+ it 'removes Saved Reply from database' do
+ expect { subject }.to change(::Users::SavedReply, :count).by(-1)
+ end
+
+ it 'returns saved reply' do
+ expect(subject[:saved_reply]).to eq(saved_reply)
+ end
+ end
+ end
+end
diff --git a/spec/services/users/saved_replies/update_service_spec.rb b/spec/services/users/saved_replies/update_service_spec.rb
index b67d09977c6..bdb54d7c8f7 100644
--- a/spec/services/users/saved_replies/update_service_spec.rb
+++ b/spec/services/users/saved_replies/update_service_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Users::SavedReplies::UpdateService do
let_it_be(:other_saved_reply) { create(:saved_reply, user: current_user) }
let_it_be(:saved_reply_from_other_user) { create(:saved_reply) }
- subject { described_class.new(current_user: current_user, saved_reply: saved_reply, name: name, content: content).execute }
+ subject { described_class.new(saved_reply: saved_reply, name: name, content: content).execute }
context 'when update fails' do
let(:name) { other_saved_reply.name }
diff --git a/spec/services/web_hook_service_spec.rb b/spec/services/web_hook_service_spec.rb
index c938ad9ee39..b99bc860523 100644
--- a/spec/services/web_hook_service_spec.rb
+++ b/spec/services/web_hook_service_spec.rb
@@ -107,6 +107,21 @@ RSpec.describe WebHookService, :request_store, :clean_gitlab_redis_shared_state
).once
end
+ context 'when the data is a Gitlab::DataBuilder::Pipeline' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:data) { ::Gitlab::DataBuilder::Pipeline.new(pipeline) }
+
+ it 'can log the request payload' do
+ stub_full_request(project_hook.url, method: :post)
+
+ # we call this with force to ensure that the logs are written inline,
+ # which tests that we can serialize the data to the DB correctly.
+ service = described_class.new(project_hook, data, :push_hooks, force: true)
+
+ expect { service.execute }.to change(::WebHookLog, :count).by(1)
+ end
+ end
+
context 'when auth credentials are present' do
let_it_be(:url) {'https://example.org'}
let_it_be(:project_hook) { create(:project_hook, url: 'https://demo:demo@example.org/') }
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index a72c8d2c4e8..88f10cc2a01 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,10 +1,9 @@
# frozen_string_literal: true
-# $" is $LOADED_FEATURES, but RuboCop didn't like it
if $".include?(File.expand_path('fast_spec_helper.rb', __dir__))
warn 'Detected fast_spec_helper is loaded first than spec_helper.'
warn 'If running test files using both spec_helper and fast_spec_helper,'
- warn 'make sure test file with spec_helper is loaded first.'
+ warn 'make sure spec_helper is loaded first, or run rspec with `-r spec_helper`.'
abort 'Aborting...'
end
@@ -192,6 +191,7 @@ RSpec.configure do |config|
config.include MigrationsHelpers, :migration
config.include RedisHelpers
config.include Rails.application.routes.url_helpers, type: :routing
+ config.include Rails.application.routes.url_helpers, type: :component
config.include PolicyHelpers, type: :policy
config.include ExpectRequestWithStatus, type: :request
config.include IdempotentWorkerHelper, type: :worker
@@ -238,6 +238,7 @@ RSpec.configure do |config|
# Enable all features by default for testing
# Reset any changes in after hook.
stub_all_feature_flags
+ stub_feature_flags(main_branch_over_master: false)
TestEnv.seed_db
end
@@ -329,10 +330,9 @@ RSpec.configure do |config|
stub_feature_flags(disable_anonymous_search: false)
stub_feature_flags(disable_anonymous_project_search: false)
- # Disable the refactored top nav search until there is functionality
- # Can be removed once all existing functionality has been replicated
- # For more information check https://gitlab.com/gitlab-org/gitlab/-/issues/339348
- stub_feature_flags(new_header_search: false)
+ # Specs should not get a CAPTCHA challenge by default, this makes the sign-in flow simpler in
+ # most cases. We do test the CAPTCHA flow in the appropriate specs.
+ stub_feature_flags(arkose_labs_login_challenge: false)
allow(Gitlab::GitalyClient).to receive(:can_use_disk?).and_return(enable_rugged)
else
diff --git a/spec/support/database_cleaner.rb b/spec/support/database_cleaner.rb
index 8f706fdebc9..f8ddf3e66a5 100644
--- a/spec/support/database_cleaner.rb
+++ b/spec/support/database_cleaner.rb
@@ -20,6 +20,9 @@ RSpec.configure do |config|
# We drop and recreate the database if any table has more than 1200 columns, just to be safe.
if any_connection_class_with_more_than_allowed_columns?
recreate_all_databases!
+
+ # Seed required data as recreating DBs will delete it
+ TestEnv.seed_db
end
end
diff --git a/spec/support/fips.rb b/spec/support/fips.rb
new file mode 100644
index 00000000000..1d278dcdf60
--- /dev/null
+++ b/spec/support/fips.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+# rubocop: disable RSpec/EnvAssignment
+
+RSpec.configure do |config|
+ config.around(:each, :fips_mode) do |example|
+ set_fips_mode(true) do
+ example.run
+ end
+ end
+
+ config.around(:each, fips_mode: false) do |example|
+ set_fips_mode(false) do
+ example.run
+ end
+ end
+
+ def set_fips_mode(value)
+ prior_value = ENV["FIPS_MODE"]
+ ENV["FIPS_MODE"] = value.to_s
+
+ yield
+
+ ENV["FIPS_MODE"] = prior_value
+ end
+end
+
+# rubocop: enable RSpec/EnvAssignment
diff --git a/spec/support/gitlab_stubs/gitlab_ci.yml b/spec/support/gitlab_stubs/gitlab_ci.yml
index 52ae36229a6..b1533879e32 100644
--- a/spec/support/gitlab_stubs/gitlab_ci.yml
+++ b/spec/support/gitlab_stubs/gitlab_ci.yml
@@ -1,4 +1,4 @@
-image: ruby:2.6
+image: image:1.0
services:
- postgres
diff --git a/spec/support/helpers/cycle_analytics_helpers.rb b/spec/support/helpers/cycle_analytics_helpers.rb
index 70b794f7d82..044ec56b1cc 100644
--- a/spec/support/helpers/cycle_analytics_helpers.rb
+++ b/spec/support/helpers/cycle_analytics_helpers.rb
@@ -86,6 +86,25 @@ module CycleAnalyticsHelpers
wait_for_stages_to_load(ready_selector)
end
+ def select_value_stream(value_stream_name)
+ toggle_value_stream_dropdown
+
+ page.find('[data-testid="dropdown-value-streams"]').all('li button').find { |item| item.text == value_stream_name.to_s }.click
+ wait_for_requests
+ end
+
+ def create_value_stream_group_aggregation(group)
+ aggregation = Analytics::CycleAnalytics::Aggregation.safe_create_for_group(group)
+ Analytics::CycleAnalytics::AggregatorService.new(aggregation: aggregation).execute
+ end
+
+ def select_group_and_custom_value_stream(group, custom_value_stream_name)
+ create_value_stream_group_aggregation(group)
+
+ select_group(group)
+ select_value_stream(custom_value_stream_name)
+ end
+
def toggle_dropdown(field)
page.within("[data-testid*='#{field}']") do
find('.dropdown-toggle').click
diff --git a/spec/support/helpers/features/invite_members_modal_helper.rb b/spec/support/helpers/features/invite_members_modal_helper.rb
index 2a4f78ca57f..7ed64615020 100644
--- a/spec/support/helpers/features/invite_members_modal_helper.rb
+++ b/spec/support/helpers/features/invite_members_modal_helper.rb
@@ -5,19 +5,22 @@ module Spec
module Helpers
module Features
module InviteMembersModalHelper
- def invite_member(name, role: 'Guest', expires_at: nil)
+ def invite_member(names, role: 'Guest', expires_at: nil, refresh: true)
click_on 'Invite members'
- page.within '[data-testid="invite-modal"]' do
- find('[data-testid="members-token-select-input"]').set(name)
+ page.within invite_modal_selector do
+ Array.wrap(names).each do |name|
+ find(member_dropdown_selector).set(name)
+
+ wait_for_requests
+ click_button name
+ end
- wait_for_requests
- click_button name
choose_options(role, expires_at)
click_button 'Invite'
- page.refresh
+ page.refresh if refresh
end
end
@@ -43,6 +46,31 @@ module Spec
fill_in 'YYYY-MM-DD', with: expires_at.strftime('%Y-%m-%d') if expires_at
end
+
+ def click_groups_tab
+ expect(page).to have_link 'Groups'
+ click_link "Groups"
+ end
+
+ def group_dropdown_selector
+ '[data-testid="group-select-dropdown"]'
+ end
+
+ def member_dropdown_selector
+ '[data-testid="members-token-select-input"]'
+ end
+
+ def invite_modal_selector
+ '[data-testid="invite-modal"]'
+ end
+
+ def expect_to_have_group(group)
+ expect(page).to have_selector("[entity-id='#{group.id}']")
+ end
+
+ def expect_not_to_have_group(group)
+ expect(page).not_to have_selector("[entity-id='#{group.id}']")
+ end
end
end
end
diff --git a/spec/support/helpers/features/runner_helpers.rb b/spec/support/helpers/features/runner_helpers.rb
new file mode 100644
index 00000000000..63fc628358c
--- /dev/null
+++ b/spec/support/helpers/features/runner_helpers.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+module Spec
+ module Support
+ module Helpers
+ module Features
+ module RunnersHelpers
+ def within_runner_row(runner_id)
+ within "[data-testid='runner-row-#{runner_id}']" do
+ yield
+ end
+ end
+
+ def search_bar_selector
+ '[data-testid="runners-filtered-search"]'
+ end
+
+ # The filters must be clicked first to be able to receive events
+ # See: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1493
+ def focus_filtered_search
+ page.within(search_bar_selector) do
+ page.find('.gl-filtered-search-term-token').click
+ end
+ end
+
+ def input_filtered_search_keys(search_term)
+ focus_filtered_search
+
+ page.within(search_bar_selector) do
+ page.find('input').send_keys(search_term)
+ click_on 'Search'
+ end
+
+ wait_for_requests
+ end
+
+ def open_filtered_search_suggestions(filter)
+ focus_filtered_search
+
+ page.within(search_bar_selector) do
+ click_on filter
+ end
+
+ wait_for_requests
+ end
+
+ def input_filtered_search_filter_is_only(filter, value)
+ focus_filtered_search
+
+ page.within(search_bar_selector) do
+ click_on filter
+
+ # For OPERATOR_IS_ONLY, clicking the filter
+ # immediately preselects "=" operator
+
+ page.find('input').send_keys(value)
+ page.find('input').send_keys(:enter)
+
+ click_on 'Search'
+ end
+
+ wait_for_requests
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/helpers/gitaly_setup.rb b/spec/support/helpers/gitaly_setup.rb
index a4ee618457d..0ad83bdeeb2 100644
--- a/spec/support/helpers/gitaly_setup.rb
+++ b/spec/support/helpers/gitaly_setup.rb
@@ -267,7 +267,7 @@ module GitalySetup
{ 'default' => repos_path },
force: true,
options: {
- internal_socket_dir: File.join(gitaly_dir, "internal_gitaly2"),
+ runtime_dir: File.join(gitaly_dir, "run2"),
gitaly_socket: "gitaly2.socket",
config_filename: "gitaly2.config.toml"
}
diff --git a/spec/support/helpers/login_helpers.rb b/spec/support/helpers/login_helpers.rb
index 7666d71f13c..29b1bb260f2 100644
--- a/spec/support/helpers/login_helpers.rb
+++ b/spec/support/helpers/login_helpers.rb
@@ -99,7 +99,7 @@ module LoginHelpers
fill_in "user_password", with: (password || "12345678")
check 'user_remember_me' if remember
- click_button "Sign in"
+ find('[data-testid="sign-in-button"]:enabled').click
if two_factor_auth
fill_in "user_otp_attempt", with: user.reload.current_otp
diff --git a/spec/support/helpers/navbar_structure_helper.rb b/spec/support/helpers/navbar_structure_helper.rb
index fb06ebfdae2..315303401cc 100644
--- a/spec/support/helpers/navbar_structure_helper.rb
+++ b/spec/support/helpers/navbar_structure_helper.rb
@@ -92,4 +92,16 @@ module NavbarStructureHelper
new_sub_nav_item_name: _('Google Cloud')
)
end
+
+ def analytics_sub_nav_item
+ [
+ _('Value stream'),
+ _('CI/CD'),
+ (_('Code review') if Gitlab.ee?),
+ (_('Merge request') if Gitlab.ee?),
+ _('Repository')
+ ]
+ end
end
+
+NavbarStructureHelper.prepend_mod
diff --git a/spec/support/helpers/search_helpers.rb b/spec/support/helpers/search_helpers.rb
index f5a1a97a1d0..581ef07752e 100644
--- a/spec/support/helpers/search_helpers.rb
+++ b/spec/support/helpers/search_helpers.rb
@@ -2,9 +2,12 @@
module SearchHelpers
def fill_in_search(text)
- page.within('.search-input-wrap') do
+ # Once the `new_header_search` feature flag has been removed
+ # We can remove the `.search-input-wrap` selector
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/339348
+ page.within('.header-search-new') do
find('#search').click
- fill_in('search', with: text)
+ fill_in 'search', with: text
end
wait_for_all_requests
diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb
index 587d4e22828..d81d0d436a1 100644
--- a/spec/support/helpers/test_env.rb
+++ b/spec/support/helpers/test_env.rb
@@ -41,7 +41,6 @@ module TestEnv
'pages-deploy-target' => '7975be0',
'audio' => 'c3c21fd',
'video' => '8879059',
- 'add-balsamiq-file' => 'b89b56d',
'crlf-diff' => '5938907',
'conflict-start' => '824be60',
'conflict-resolvable' => '1450cd6',
@@ -81,7 +80,9 @@ module TestEnv
'compare-with-merge-head-source' => 'f20a03d',
'compare-with-merge-head-target' => '2f1e176',
'trailers' => 'f0a5ed6',
- 'add_commit_with_5mb_subject' => '8cf8e80'
+ 'add_commit_with_5mb_subject' => '8cf8e80',
+ 'blame-on-renamed' => '32c33da',
+ 'with-executables' => '6b8dc4a'
}.freeze
# gitlab-test-fork is a fork of gitlab-fork, but we don't necessarily
diff --git a/spec/support/helpers/usage_data_helpers.rb b/spec/support/helpers/usage_data_helpers.rb
index b9f90b11a69..50d1b14cf56 100644
--- a/spec/support/helpers/usage_data_helpers.rb
+++ b/spec/support/helpers/usage_data_helpers.rb
@@ -26,7 +26,6 @@ module UsageDataHelpers
COUNTS_KEYS = %i(
assignee_lists
- boards
ci_builds
ci_internal_pipelines
ci_external_pipelines
diff --git a/spec/support/matchers/graphql_matchers.rb b/spec/support/matchers/graphql_matchers.rb
index dcaec176687..3ba88c3ae71 100644
--- a/spec/support/matchers/graphql_matchers.rb
+++ b/spec/support/matchers/graphql_matchers.rb
@@ -7,14 +7,14 @@ RSpec::Matchers.define :require_graphql_authorizations do |*expected|
if klass.respond_to?(:required_permissions)
klass.required_permissions
else
- [klass.to_graphql.metadata[:authorize]]
+ Array.wrap(klass.authorize)
end
end
match do |klass|
actual = permissions_for(klass)
- expect(actual).to match_array(expected)
+ expect(actual).to match_array(expected.compact)
end
failure_message do |klass|
@@ -213,16 +213,16 @@ RSpec::Matchers.define :have_graphql_resolver do |expected|
match do |field|
case expected
when Method
- expect(field.to_graphql.metadata[:type_class].resolve_proc).to eq(expected)
+ expect(field.type_class.resolve_proc).to eq(expected)
else
- expect(field.to_graphql.metadata[:type_class].resolver).to eq(expected)
+ expect(field.type_class.resolver).to eq(expected)
end
end
end
RSpec::Matchers.define :have_graphql_extension do |expected|
match do |field|
- expect(field.to_graphql.metadata[:type_class].extensions).to include(expected)
+ expect(field.type_class.extensions).to include(expected)
end
end
diff --git a/spec/support/matchers/markdown_matchers.rb b/spec/support/matchers/markdown_matchers.rb
index f01c4075eeb..1932f78506f 100644
--- a/spec/support/matchers/markdown_matchers.rb
+++ b/spec/support/matchers/markdown_matchers.rb
@@ -270,7 +270,7 @@ module MarkdownMatchers
set_default_markdown_messages
match do |actual|
- expect(actual).to have_link(href: 'http://localhost:8000/nomnoml/svg/eNqLDsgsSixJrUmtTHXOL80rsVLwzCupKUrMTNHQtC7IzMlJTE_V0KzhUlCITkpNLEqJ1dWNLkgsKsoviUUSs7KLTssvzVHIzS8tyYjligUAMhEd0g==')
+ expect(actual).to have_link(href: 'http://localhost:8000/nomnoml/svg/eNqLDsgsSixJrUmtTHXOL80rsVLwzCupKUrMTNHQtC7IzMlJTE_V0KzhUlCITkpNLEqJ1dWNLkgsKsoviUUSs7KLTssvzVHIzS8tyYjliuUCAE_tHdw=')
end
end
end
diff --git a/spec/support/matchers/project_namespace_matcher.rb b/spec/support/matchers/project_namespace_matcher.rb
index 95aa5429679..8666a605276 100644
--- a/spec/support/matchers/project_namespace_matcher.rb
+++ b/spec/support/matchers/project_namespace_matcher.rb
@@ -10,7 +10,7 @@ RSpec::Matchers.define :be_in_sync_with_project do |project|
project_namespace.present? &&
project.name == project_namespace.name &&
project.path == project_namespace.path &&
- project.namespace == project_namespace.parent &&
+ project.namespace_id == project_namespace.parent_id &&
project.visibility_level == project_namespace.visibility_level &&
project.shared_runners_enabled == project_namespace.shared_runners_enabled
end
diff --git a/spec/support/services/deploy_token_shared_examples.rb b/spec/support/services/deploy_token_shared_examples.rb
index adc5ea0fcdc..d322b3fc81d 100644
--- a/spec/support/services/deploy_token_shared_examples.rb
+++ b/spec/support/services/deploy_token_shared_examples.rb
@@ -19,6 +19,10 @@ RSpec.shared_examples 'a deploy token creation service' do
it 'returns a DeployToken' do
expect(subject[:deploy_token]).to be_an_instance_of DeployToken
end
+
+ it 'sets the creator_id as the id of the current_user' do
+ expect(subject[:deploy_token].read_attribute(:creator_id)).to eq(user.id)
+ end
end
context 'when expires at date is not passed' do
diff --git a/spec/support/services/issuable_update_service_shared_examples.rb b/spec/support/services/issuable_update_service_shared_examples.rb
index 4d2843af1c4..c168df7a7d2 100644
--- a/spec/support/services/issuable_update_service_shared_examples.rb
+++ b/spec/support/services/issuable_update_service_shared_examples.rb
@@ -23,3 +23,47 @@ RSpec.shared_examples 'issuable update service' do
end
end
end
+
+RSpec.shared_examples 'keeps issuable labels sorted after update' do
+ before do
+ update_issuable(label_ids: [label_b.id])
+ end
+
+ context 'when label is changed' do
+ it 'keeps the labels sorted by title ASC' do
+ update_issuable({ add_label_ids: [label_a.id] })
+
+ expect(issuable.labels).to eq([label_a, label_b])
+ end
+ end
+end
+
+RSpec.shared_examples 'broadcasting issuable labels updates' do
+ before do
+ update_issuable(label_ids: [label_a.id])
+ end
+
+ context 'when label is added' do
+ it 'triggers the GraphQL subscription' do
+ expect(GraphqlTriggers).to receive(:issuable_labels_updated).with(issuable)
+
+ update_issuable({ add_label_ids: [label_b.id] })
+ end
+ end
+
+ context 'when label is removed' do
+ it 'triggers the GraphQL subscription' do
+ expect(GraphqlTriggers).to receive(:issuable_labels_updated).with(issuable)
+
+ update_issuable({ remove_label_ids: [label_a.id] })
+ end
+ end
+
+ context 'when label is unchanged' do
+ it 'does not trigger the GraphQL subscription' do
+ expect(GraphqlTriggers).not_to receive(:issuable_labels_updated).with(issuable)
+
+ update_issuable({ label_ids: [label_a.id] })
+ end
+ end
+end
diff --git a/spec/support/shared_contexts/container_repositories_shared_context.rb b/spec/support/shared_contexts/container_repositories_shared_context.rb
index 9a9f80a3cbd..a74b09d38bd 100644
--- a/spec/support/shared_contexts/container_repositories_shared_context.rb
+++ b/spec/support/shared_contexts/container_repositories_shared_context.rb
@@ -1,13 +1,10 @@
# frozen_string_literal: true
RSpec.shared_context 'importable repositories' do
- let_it_be(:root_group) { create(:group) }
- let_it_be(:group) { create(:group, parent_id: root_group.id) }
- let_it_be(:project) { create(:project, namespace: group) }
- let_it_be(:valid_container_repository) { create(:container_repository, project: project, created_at: 2.days.ago) }
- let_it_be(:valid_container_repository2) { create(:container_repository, project: project, created_at: 1.year.ago) }
- let_it_be(:importing_container_repository) { create(:container_repository, :importing, project: project, created_at: 2.days.ago) }
- let_it_be(:new_container_repository) { create(:container_repository, project: project) }
+ let_it_be(:valid_container_repository) { create(:container_repository, created_at: 2.days.ago, migration_plan: 'free') }
+ let_it_be(:valid_container_repository2) { create(:container_repository, created_at: 1.year.ago, migration_plan: 'free') }
+ let_it_be(:importing_container_repository) { create(:container_repository, :importing, created_at: 2.days.ago, migration_plan: 'free') }
+ let_it_be(:new_container_repository) { create(:container_repository, migration_plan: 'free') }
let_it_be(:denied_root_group) { create(:group) }
let_it_be(:denied_group) { create(:group, parent_id: denied_root_group.id) }
@@ -18,7 +15,8 @@ RSpec.shared_context 'importable repositories' do
stub_application_setting(container_registry_import_created_before: 1.day.ago)
stub_feature_flags(
container_registry_phase_2_deny_list: false,
- container_registry_migration_limit_gitlab_org: false
+ container_registry_migration_limit_gitlab_org: false,
+ container_registry_migration_phase2_all_plans: false
)
Feature::FlipperGate.create!(
diff --git a/spec/support/shared_contexts/finders/users_finder_shared_contexts.rb b/spec/support/shared_contexts/finders/users_finder_shared_contexts.rb
index 6a09497a497..ef1c01f72f9 100644
--- a/spec/support/shared_contexts/finders/users_finder_shared_contexts.rb
+++ b/spec/support/shared_contexts/finders/users_finder_shared_contexts.rb
@@ -3,8 +3,10 @@
RSpec.shared_context 'UsersFinder#execute filter by project context' do
let_it_be(:normal_user) { create(:user, username: 'johndoe') }
let_it_be(:admin_user) { create(:user, :admin, username: 'iamadmin') }
+ let_it_be(:banned_user) { create(:user, :banned, username: 'iambanned') }
let_it_be(:blocked_user) { create(:user, :blocked, username: 'notsorandom') }
let_it_be(:external_user) { create(:user, :external) }
+ let_it_be(:unconfirmed_user) { create(:user, confirmed_at: nil) }
let_it_be(:omniauth_user) { create(:omniauth_user, provider: 'twitter', extern_uid: '123456') }
- let_it_be(:internal_user) { User.alert_bot }
+ let_it_be(:internal_user) { User.alert_bot.tap { |u| u.confirm } }
end
diff --git a/spec/support/shared_contexts/lib/container_registry/client_stubs_shared_context.rb b/spec/support/shared_contexts/lib/container_registry/client_stubs_shared_context.rb
index d857e683aa2..196173d4a63 100644
--- a/spec/support/shared_contexts/lib/container_registry/client_stubs_shared_context.rb
+++ b/spec/support/shared_contexts/lib/container_registry/client_stubs_shared_context.rb
@@ -8,8 +8,8 @@ RSpec.shared_context 'container registry client stubs' do
end
end
- def stub_container_registry_gitlab_api_repository_details(client, path:, size_bytes:)
- allow(client).to receive(:repository_details).with(path, with_size: true).and_return('size_bytes' => size_bytes)
+ def stub_container_registry_gitlab_api_repository_details(client, path:, size_bytes:, sizing: :self)
+ allow(client).to receive(:repository_details).with(path, sizing: sizing).and_return('size_bytes' => size_bytes)
end
def stub_container_registry_gitlab_api_network_error(client_method: :supports_gitlab_api?)
diff --git a/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb b/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb
index d0915bbf158..dea03af2248 100644
--- a/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb
+++ b/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb
@@ -64,6 +64,9 @@ RSpec.shared_context 'API::Markdown Golden Master shared context' do |markdown_y
let(:substitutions) { markdown_example.fetch(:substitutions, {}) }
it "verifies conversion of GFM to HTML", :unlimited_max_formatted_output_length do
+ stub_application_setting(plantuml_enabled: true, plantuml_url: 'http://localhost:8080')
+ stub_application_setting(kroki_enabled: true, kroki_url: 'http://localhost:8000')
+
pending pending_reason if pending_reason
normalized_example_html = normalize_html(example_html, substitutions)
diff --git a/spec/support/shared_contexts/navbar_structure_context.rb b/spec/support/shared_contexts/navbar_structure_context.rb
index b4a71f52092..65c7f63cf6e 100644
--- a/spec/support/shared_contexts/navbar_structure_context.rb
+++ b/spec/support/shared_contexts/navbar_structure_context.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
RSpec.shared_context 'project navbar structure' do
+ include NavbarStructureHelper
+
let(:security_and_compliance_nav_item) do
{
nav_item: _('Security & Compliance'),
@@ -93,13 +95,7 @@ RSpec.shared_context 'project navbar structure' do
},
{
nav_item: _('Analytics'),
- nav_sub_items: [
- _('Value stream'),
- _('CI/CD'),
- (_('Code review') if Gitlab.ee?),
- (_('Merge request') if Gitlab.ee?),
- _('Repository')
- ]
+ nav_sub_items: analytics_sub_nav_item
},
{
nav_item: _('Wiki'),
diff --git a/spec/support/shared_contexts/serializers/group_group_link_shared_context.rb b/spec/support/shared_contexts/serializers/group_group_link_shared_context.rb
index fce78957eba..efd5d344a28 100644
--- a/spec/support/shared_contexts/serializers/group_group_link_shared_context.rb
+++ b/spec/support/shared_contexts/serializers/group_group_link_shared_context.rb
@@ -1,10 +1,10 @@
# frozen_string_literal: true
RSpec.shared_context 'group_group_link' do
- let(:shared_with_group) { create(:group) }
- let(:shared_group) { create(:group) }
+ let_it_be(:shared_with_group) { create(:group) }
+ let_it_be(:shared_group) { create(:group) }
- let!(:group_group_link) do
+ let_it_be(:group_group_link) do
create(
:group_group_link,
{
diff --git a/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb b/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
index e1d864213b5..37d410a35bf 100644
--- a/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
+++ b/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
@@ -21,7 +21,7 @@ RSpec.shared_context 'stubbed service ping metrics definitions' do
let(:optional_metrics) do
[
- metric_attributes('counts.boards', 'optional', 'number'),
+ metric_attributes('counts.boards', 'optional', 'number', 'CountBoardsMetric'),
metric_attributes('gitaly.filesystems', '').except('data_category'),
metric_attributes('usage_activity_by_stage.monitor.projects_with_enabled_alert_integrations_histogram', 'optional', 'object'),
metric_attributes('topology', 'optional', 'object')
@@ -43,11 +43,14 @@ RSpec.shared_context 'stubbed service ping metrics definitions' do
Gitlab::Usage::MetricDefinition.instance_variable_set(:@all, nil)
end
- def metric_attributes(key_path, category, value_type = 'string')
+ def metric_attributes(key_path, category, value_type = 'string', instrumentation_class = '')
{
'key_path' => key_path,
'data_category' => category,
- 'value_type' => value_type
+ 'value_type' => value_type,
+ 'status' => 'active',
+ 'instrumentation_class' => instrumentation_class,
+ 'time_frame' => 'all'
}
end
end
diff --git a/spec/support/shared_contexts/url_shared_context.rb b/spec/support/shared_contexts/url_shared_context.rb
index da1d6e0049c..0e1534bf6c7 100644
--- a/spec/support/shared_contexts/url_shared_context.rb
+++ b/spec/support/shared_contexts/url_shared_context.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
RSpec.shared_context 'valid urls with CRLF' do
- let(:valid_urls_with_CRLF) do
+ let(:valid_urls_with_crlf) do
[
"http://example.com/pa%0dth",
"http://example.com/pa%0ath",
@@ -16,7 +16,7 @@ RSpec.shared_context 'valid urls with CRLF' do
end
RSpec.shared_context 'invalid urls' do
- let(:urls_with_CRLF) do
+ let(:urls_with_crlf) do
[
"git://example.com/pa%0dth",
"git://example.com/pa%0ath",
diff --git a/spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb b/spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb
index 1e303197990..15590fd10dc 100644
--- a/spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb
+++ b/spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb
@@ -138,7 +138,7 @@ RSpec.shared_examples 'multiple issue boards' do
wait_for_requests
- dropdown_selector = '.js-boards-selector .dropdown-menu'
+ dropdown_selector = '[data-testid="boards-selector"] .dropdown-menu'
page.within(dropdown_selector) do
yield
end
diff --git a/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb b/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb
index 46fc2cbdc9b..2ea98002de1 100644
--- a/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb
@@ -184,6 +184,41 @@ RSpec.shared_examples 'a GitHub-ish import controller: GET status' do
expect(json_response.dig("provider_repos").count).to eq(1)
end
end
+
+ context 'when namespace_id query param is provided' do
+ let_it_be(:current_user) { create(:user) }
+
+ let(:namespace) { create(:namespace) }
+
+ before do
+ allow(controller).to receive(:current_user).and_return(current_user)
+ end
+
+ context 'when user is allowed to create projects in this namespace' do
+ before do
+ allow(current_user).to receive(:can?).and_return(true)
+ end
+
+ it 'provides namespace to the template' do
+ get :status, params: { namespace_id: namespace.id }, format: :html
+
+ expect(response).to have_gitlab_http_status :ok
+ expect(assigns(:namespace)).to eq(namespace)
+ end
+ end
+
+ context 'when user is not allowed to create projects in this namespace' do
+ before do
+ allow(current_user).to receive(:can?).and_return(false)
+ end
+
+ it 'renders 404' do
+ get :status, params: { namespace_id: namespace.id }, format: :html
+
+ expect(response).to have_gitlab_http_status :not_found
+ end
+ end
+ end
end
end
@@ -515,7 +550,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: GET realtime_changes' do
get :realtime_changes
- expect(json_response).to eq([{ "id" => project.id, "import_status" => project.import_status }])
+ expect(json_response).to match([a_hash_including({ "id" => project.id, "import_status" => project.import_status })])
expect(Integer(response.headers['Poll-Interval'])).to be > -1
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 bf26922d9c5..885c0229038 100644
--- a/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb
@@ -150,6 +150,7 @@ RSpec.shared_examples 'wiki controller actions' do
expect(response).to render_template('shared/wikis/diff')
expect(assigns(:diffs)).to be_a(Gitlab::Diff::FileCollection::Base)
expect(assigns(:diff_notes_disabled)).to be(true)
+ expect(assigns(:page).content).to be_empty
end
end
@@ -475,9 +476,13 @@ RSpec.shared_examples 'wiki controller actions' do
context 'when page exists' do
shared_examples 'deletes the page' do
specify do
- expect do
- request
- end.to change { wiki.list_pages.size }.by(-1)
+ aggregate_failures do
+ expect do
+ request
+ end.to change { wiki.list_pages.size }.by(-1)
+
+ expect(assigns(:page).content).to be_empty
+ end
end
end
diff --git a/spec/support/shared_examples/features/access_tokens_shared_examples.rb b/spec/support/shared_examples/features/access_tokens_shared_examples.rb
index ae246a87bb6..215d9d3e5a8 100644
--- a/spec/support/shared_examples/features/access_tokens_shared_examples.rb
+++ b/spec/support/shared_examples/features/access_tokens_shared_examples.rb
@@ -29,15 +29,15 @@ RSpec.shared_examples 'resource access tokens creation' do |resource_type|
click_on '1'
# Scopes
- check 'api'
check 'read_api'
+ check 'read_repository'
click_on "Create #{resource_type} access token"
expect(active_resource_access_tokens).to have_text(name)
expect(active_resource_access_tokens).to have_text('in')
- expect(active_resource_access_tokens).to have_text('api')
expect(active_resource_access_tokens).to have_text('read_api')
+ expect(active_resource_access_tokens).to have_text('read_repository')
expect(active_resource_access_tokens).to have_text('Maintainer')
expect(created_resource_access_token).not_to be_empty
end
diff --git a/spec/support/shared_examples/features/content_editor_shared_examples.rb b/spec/support/shared_examples/features/content_editor_shared_examples.rb
index 2332285540a..5c44cb7f04b 100644
--- a/spec/support/shared_examples/features/content_editor_shared_examples.rb
+++ b/spec/support/shared_examples/features/content_editor_shared_examples.rb
@@ -1,14 +1,48 @@
# frozen_string_literal: true
RSpec.shared_examples 'edits content using the content editor' do
- it 'formats text as bold using bubble menu' do
- content_editor_testid = '[data-testid="content-editor"] [contenteditable]'
+ content_editor_testid = '[data-testid="content-editor"] [contenteditable].ProseMirror'
- expect(page).to have_css(content_editor_testid)
+ describe 'formatting bubble menu' do
+ it 'shows a formatting bubble menu for a regular paragraph' do
+ expect(page).to have_css(content_editor_testid)
- find(content_editor_testid).send_keys 'Typing text in the content editor'
- find(content_editor_testid).send_keys [:shift, :left]
+ find(content_editor_testid).send_keys 'Typing text in the content editor'
+ find(content_editor_testid).send_keys [:shift, :left]
- expect(page).to have_css('[data-testid="formatting-bubble-menu"]')
+ expect(page).to have_css('[data-testid="formatting-bubble-menu"]')
+ end
+
+ it 'does not show a formatting bubble menu for code' do
+ find(content_editor_testid).send_keys 'This is a `code`'
+ find(content_editor_testid).send_keys [:shift, :left]
+
+ expect(page).not_to have_css('[data-testid="formatting-bubble-menu"]')
+ end
+ end
+
+ describe 'code block bubble menu' do
+ it 'shows a code block bubble menu for a code block' do
+ find(content_editor_testid).send_keys '```js ' # trigger input rule
+ find(content_editor_testid).send_keys 'var a = 0'
+ find(content_editor_testid).send_keys [:shift, :left]
+
+ expect(page).not_to have_css('[data-testid="formatting-bubble-menu"]')
+ expect(page).to have_css('[data-testid="code-block-bubble-menu"]')
+ end
+
+ it 'sets code block type to "javascript" for `js`' do
+ find(content_editor_testid).send_keys '```js '
+ find(content_editor_testid).send_keys 'var a = 0'
+
+ expect(find('[data-testid="code-block-bubble-menu"]')).to have_text('Javascript')
+ end
+
+ it 'sets code block type to "Custom (nomnoml)" for `nomnoml`' do
+ find(content_editor_testid).send_keys '```nomnoml '
+ find(content_editor_testid).send_keys 'test'
+
+ expect(find('[data-testid="code-block-bubble-menu"]')).to have_text('Custom (nomnoml)')
+ end
end
end
diff --git a/spec/support/shared_examples/features/inviting_members_shared_examples.rb b/spec/support/shared_examples/features/inviting_members_shared_examples.rb
new file mode 100644
index 00000000000..58357b262f5
--- /dev/null
+++ b/spec/support/shared_examples/features/inviting_members_shared_examples.rb
@@ -0,0 +1,175 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'inviting members' do |snowplow_invite_label|
+ before_all do
+ group.add_owner(user1)
+ end
+
+ it 'adds user as member', :js, :snowplow, :aggregate_failures do
+ visit members_page_path
+
+ invite_member(user2.name, role: 'Reporter')
+
+ page.within find_member_row(user2) do
+ expect(page).to have_button('Reporter')
+ end
+
+ expect_snowplow_event(
+ category: 'Members::InviteService',
+ action: 'create_member',
+ label: snowplow_invite_label,
+ property: 'existing_user',
+ user: user1
+ )
+ end
+
+ it 'invites user by email', :js, :snowplow, :aggregate_failures do
+ visit members_page_path
+
+ invite_member('test@example.com', role: 'Reporter')
+
+ click_link 'Invited'
+
+ page.within find_invited_member_row('test@example.com') do
+ expect(page).to have_button('Reporter')
+ end
+
+ expect_snowplow_event(
+ category: 'Members::InviteService',
+ action: 'create_member',
+ label: snowplow_invite_label,
+ property: 'net_new_user',
+ user: user1
+ )
+ end
+
+ it 'invites user by username and invites user by email', :js, :aggregate_failures do
+ visit members_page_path
+
+ invite_member([user2.name, 'test@example.com'], role: 'Reporter')
+
+ page.within find_member_row(user2) do
+ expect(page).to have_button('Reporter')
+ end
+
+ click_link 'Invited'
+
+ page.within find_invited_member_row('test@example.com') do
+ expect(page).to have_button('Reporter')
+ end
+ end
+
+ context 'when member is already a member by username' do
+ it 'updates the member for that user', :js do
+ visit members_page_path
+
+ invite_member(user2.name, role: 'Developer')
+
+ invite_member(user2.name, role: 'Reporter', refresh: false)
+
+ expect(page).not_to have_selector(invite_modal_selector)
+
+ page.refresh
+
+ page.within find_invited_member_row(user2.name) do
+ expect(page).to have_button('Reporter')
+ end
+ end
+ end
+
+ context 'when member is already a member by email' do
+ it 'fails with an error', :js do
+ visit members_page_path
+
+ invite_member('test@example.com', role: 'Developer')
+
+ invite_member('test@example.com', role: 'Reporter', refresh: false)
+
+ expect(page).to have_selector(invite_modal_selector)
+ expect(page).to have_content("The member's email address has already been taken")
+
+ page.refresh
+
+ click_link 'Invited'
+
+ page.within find_invited_member_row('test@example.com') do
+ expect(page).to have_button('Developer')
+ end
+ end
+ end
+
+ context 'when inviting a parent group member to the sub-entity' do
+ before_all do
+ group.add_owner(user1)
+ group.add_developer(user2)
+ end
+
+ context 'when role is higher than parent group membership' do
+ let(:role) { 'Maintainer' }
+
+ it 'adds the user as a member on sub-entity with higher access level', :js do
+ visit subentity_members_page_path
+
+ invite_member(user2.name, role: role, refresh: false)
+
+ expect(page).not_to have_selector(invite_modal_selector)
+
+ page.refresh
+
+ page.within find_invited_member_row(user2.name) do
+ expect(page).to have_button(role)
+ end
+ end
+ end
+
+ context 'when role is lower than parent group membership' do
+ let(:role) { 'Reporter' }
+
+ it 'fails with an error', :js do
+ visit subentity_members_page_path
+
+ invite_member(user2.name, role: role, refresh: false)
+
+ expect(page).to have_selector(invite_modal_selector)
+ expect(page).to have_content "Access level should be greater than or equal to Developer inherited membership " \
+ "from group #{group.name}"
+
+ page.refresh
+
+ page.within find_invited_member_row(user2.name) do
+ expect(page).to have_content('Developer')
+ expect(page).not_to have_button('Developer')
+ end
+ end
+
+ context 'when there are multiple users invited with errors' do
+ let_it_be(:user3) { create(:user) }
+
+ before do
+ group.add_maintainer(user3)
+ end
+
+ it 'only shows the first user error', :js do
+ visit subentity_members_page_path
+
+ invite_member([user2.name, user3.name], role: role, refresh: false)
+
+ expect(page).to have_selector(invite_modal_selector)
+ expect(page).to have_text("Access level should be greater than or equal to", count: 1)
+
+ page.refresh
+
+ page.within find_invited_member_row(user2.name) do
+ expect(page).to have_content('Developer')
+ expect(page).not_to have_button('Developer')
+ end
+
+ page.within find_invited_member_row(user3.name) do
+ expect(page).to have_content('Maintainer')
+ expect(page).not_to have_button('Maintainer')
+ end
+ end
+ end
+ 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 066c3e17a09..0a5ad5a59c0 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
@@ -62,7 +62,7 @@ RSpec.shared_examples 'it uploads and commits a new image file' do |drop: false|
visit(project_blob_path(project, 'upload_image/logo_sample.svg'))
- expect(page).to have_css('.file-content img')
+ expect(page).to have_css('.file-holder img')
end
end
diff --git a/spec/support/shared_examples/features/runners_shared_examples.rb b/spec/support/shared_examples/features/runners_shared_examples.rb
new file mode 100644
index 00000000000..d9460c7b8f1
--- /dev/null
+++ b/spec/support/shared_examples/features/runners_shared_examples.rb
@@ -0,0 +1,141 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'shows and resets runner registration token' do
+ include Spec::Support::Helpers::ModalHelpers
+ include Spec::Support::Helpers::Features::RunnersHelpers
+
+ before do
+ click_on dropdown_text
+ end
+
+ describe 'shows registration instructions' do
+ before do
+ click_on 'Show runner installation and registration instructions'
+
+ wait_for_requests
+ end
+
+ it 'opens runner installation modal', :aggregate_failures do
+ within_modal do
+ expect(page).to have_text "Install a runner"
+ expect(page).to have_text "Environment"
+ expect(page).to have_text "Architecture"
+ expect(page).to have_text "Download and install binary"
+ end
+ end
+
+ it 'dismisses runner installation modal' do
+ within_modal do
+ click_button('Close', match: :first)
+ end
+
+ expect(page).not_to have_text "Install a runner"
+ end
+ end
+
+ it 'has a registration token' do
+ click_on 'Click to reveal'
+ expect(page.find('[data-testid="token-value"] input').value).to have_content(registration_token)
+ end
+
+ describe 'reset registration token' do
+ let!(:old_registration_token) { find('[data-testid="token-value"] input').value }
+
+ before do
+ click_on 'Reset registration token'
+
+ within_modal do
+ click_button('Reset token', match: :first)
+ end
+
+ wait_for_requests
+ end
+
+ it 'changes registration token' do
+ expect(find('.gl-toast')).to have_content('New registration token generated!')
+
+ click_on dropdown_text
+ click_on 'Click to reveal'
+
+ expect(old_registration_token).not_to eq registration_token
+ end
+ end
+end
+
+RSpec.shared_examples 'shows no runners' do
+ it 'shows counts with 0' do
+ expect(page).to have_text "Online runners 0"
+ expect(page).to have_text "Offline runners 0"
+ expect(page).to have_text "Stale runners 0"
+ end
+
+ it 'shows "no runners" message' do
+ expect(page).to have_text 'No runners found'
+ end
+end
+
+RSpec.shared_examples 'shows runner in list' do
+ it 'does not show empty state' do
+ expect(page).not_to have_content 'No runners found'
+ end
+
+ it 'shows runner row' do
+ within_runner_row(runner.id) do
+ expect(page).to have_text "##{runner.id}"
+ expect(page).to have_text runner.short_sha
+ expect(page).to have_text runner.description
+ end
+ end
+end
+
+RSpec.shared_examples 'pauses, resumes and deletes a runner' do
+ include Spec::Support::Helpers::ModalHelpers
+
+ it 'pauses and resumes runner' do
+ within_runner_row(runner.id) do
+ click_button "Pause"
+
+ expect(page).to have_text 'paused'
+ expect(page).to have_button 'Resume'
+ expect(page).not_to have_button 'Pause'
+
+ click_button "Resume"
+
+ expect(page).not_to have_text 'paused'
+ expect(page).not_to have_button 'Resume'
+ expect(page).to have_button 'Pause'
+ end
+ end
+
+ describe 'deletes runner' do
+ before do
+ within_runner_row(runner.id) do
+ click_on 'Delete runner'
+ end
+ end
+
+ it 'shows a confirmation modal' do
+ expect(page).to have_text "Delete runner ##{runner.id} (#{runner.short_sha})?"
+ expect(page).to have_text "Are you sure you want to continue?"
+ end
+
+ it 'deletes a runner' do
+ within_modal do
+ click_on 'Delete runner'
+ end
+
+ expect(page.find('.gl-toast')).to have_text(/Runner .+ deleted/)
+ expect(page).not_to have_content runner.description
+ end
+
+ it 'cancels runner deletion' do
+ within_modal do
+ click_on 'Cancel'
+ end
+
+ wait_for_requests
+
+ expect(page).to have_content runner.description
+ end
+ end
+end
diff --git a/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb b/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb
index bb5460e2a6f..095c48cade8 100644
--- a/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb
+++ b/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb
@@ -11,6 +11,7 @@ RSpec.shared_examples 'search timeouts' do |scope|
end
it 'renders timeout information' do
+ # expect(page).to have_content('This endpoint has been requested too many times.')
expect(page).to have_content('Your search timed out')
end
diff --git a/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb
index f676b6aa60d..41b1964cff0 100644
--- a/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb
@@ -20,6 +20,12 @@ RSpec.shared_examples 'User creates wiki page' do
click_link "Create your first page"
end
+ it 'shows all available formats in the dropdown' do
+ Wiki::VALID_USER_MARKUPS.each do |key, markup|
+ expect(page).to have_css("#wiki_format option[value=#{key}]", text: markup[:name])
+ end
+ end
+
it "disables the submit button", :js do
page.within(".wiki-form") do
fill_in(:wiki_content, with: "")
diff --git a/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb
index 85490bffc0e..12a4c6d7583 100644
--- a/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb
@@ -145,19 +145,6 @@ RSpec.shared_examples 'User updates wiki page' do
it_behaves_like 'edits content using the content editor'
end
-
- context 'with feature flag off' do
- before do
- stub_feature_flags(wiki_switch_between_content_editor_raw_markdown: false)
- visit(wiki_path(wiki))
-
- click_link('Edit')
-
- click_button 'Use the new editor'
- end
-
- it_behaves_like 'edits content using the content editor'
- end
end
end
diff --git a/spec/support/shared_examples/graphql/mutations/boards_create_shared_examples.rb b/spec/support/shared_examples/graphql/mutations/boards_create_shared_examples.rb
index 2e3a3ce6b41..04bb2fb69bb 100644
--- a/spec/support/shared_examples/graphql/mutations/boards_create_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/mutations/boards_create_shared_examples.rb
@@ -3,16 +3,6 @@
RSpec.shared_examples 'boards create mutation' do
include GraphqlHelpers
- let_it_be(:current_user, reload: true) { create(:user) }
- let(:name) { 'board name' }
- let(:mutation) { graphql_mutation(:create_board, params) }
-
- subject { post_graphql_mutation(mutation, current_user: current_user) }
-
- def mutation_response
- graphql_mutation_response(:create_board)
- end
-
context 'when the user does not have permission' do
it_behaves_like 'a mutation that returns a top-level access error'
diff --git a/spec/support/shared_examples/graphql/notes_creation_shared_examples.rb b/spec/support/shared_examples/graphql/notes_creation_shared_examples.rb
index 56b6dc682eb..2c6118779e6 100644
--- a/spec/support/shared_examples/graphql/notes_creation_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/notes_creation_shared_examples.rb
@@ -85,3 +85,14 @@ RSpec.shared_examples 'a Note mutation when there are rate limit validation erro
end
end
end
+
+RSpec.shared_examples 'a Note mutation with confidential notes' do
+ it_behaves_like 'a Note mutation that creates a Note'
+
+ it 'returns a Note with confidentiality enabled' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response).to have_key('note')
+ expect(mutation_response['note']['confidential']).to eq(true)
+ end
+end
diff --git a/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb b/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb
index efb2c466f70..3caf153c2fa 100644
--- a/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb
@@ -62,9 +62,9 @@ RSpec.shared_examples 'Gitlab-style deprecations' do
expect(deprecable.deprecation_reason).to include 'This was renamed.'
end
- it 'supports named reasons: discouraged' do
- deprecable = subject(deprecated: { milestone: '1.10', reason: :discouraged })
+ it 'supports named reasons: alpha' do
+ deprecable = subject(deprecated: { milestone: '1.10', reason: :alpha })
- expect(deprecable.deprecation_reason).to include 'Use of this is not recommended.'
+ expect(deprecable.deprecation_reason).to include 'This feature is in Alpha'
end
end
diff --git a/spec/support/shared_examples/helpers/wiki_helpers_shared_examples.rb b/spec/support/shared_examples/helpers/wiki_helpers_shared_examples.rb
new file mode 100644
index 00000000000..c2c27fb65ca
--- /dev/null
+++ b/spec/support/shared_examples/helpers/wiki_helpers_shared_examples.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'wiki endpoint helpers' do
+ let(:resource_path) { page.wiki.container.class.to_s.pluralize.downcase }
+ let(:url) { "/api/v4/#{resource_path}/#{page.wiki.container.id}/wikis/#{page.slug}?version=#{page.version.id}"}
+
+ it 'returns the full endpoint url' do
+ expect(helper.wiki_page_render_api_endpoint(page)).to end_with(url)
+ end
+
+ context 'when relative url is set' do
+ let(:relative_url) { "/gitlab#{url}" }
+
+ it 'returns the full endpoint url with the relative path' do
+ stub_config_setting(relative_url_root: '/gitlab')
+
+ expect(helper.wiki_page_render_api_endpoint(page)).to end_with(relative_url)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/incident_management/issuable_escalation_statuses/build_examples.rb b/spec/support/shared_examples/incident_management/issuable_escalation_statuses/build_examples.rb
new file mode 100644
index 00000000000..050fdc3fff7
--- /dev/null
+++ b/spec/support/shared_examples/incident_management/issuable_escalation_statuses/build_examples.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'initializes new escalation status with expected attributes' do |attributes = {}|
+ let(:expected_attributes) { attributes }
+
+ specify do
+ expect { execute }.to change { incident.escalation_status }
+ .from(nil)
+ .to(instance_of(::IncidentManagement::IssuableEscalationStatus))
+
+ expect(incident.escalation_status).to have_attributes(
+ id: nil,
+ issue_id: incident.id,
+ policy_id: nil,
+ escalations_started_at: nil,
+ status_event: nil,
+ **expected_attributes
+ )
+ end
+end
diff --git a/spec/support/shared_examples/lib/gitlab/event_store_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/event_store_shared_examples.rb
new file mode 100644
index 00000000000..4fc15cacab4
--- /dev/null
+++ b/spec/support/shared_examples/lib/gitlab/event_store_shared_examples.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'subscribes to event' do
+ include AfterNextHelpers
+
+ it 'consumes the published event', :sidekiq_inline do
+ expect_next(described_class)
+ .to receive(:handle_event)
+ .with(instance_of(event.class))
+ .and_call_original
+
+ ::Gitlab::EventStore.publish(event)
+ end
+end
+
+def consume_event(subscriber:, event:)
+ subscriber.new.perform(event.class.name, event.data)
+end
diff --git a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
index 4b956c2b566..b5d93aec1bf 100644
--- a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
@@ -5,7 +5,7 @@ RSpec.shared_examples 'a daily tracked issuable event' do
stub_application_setting(usage_ping_enabled: true)
end
- def count_unique(date_from:, date_to:)
+ def count_unique(date_from: 1.minute.ago, date_to: 1.minute.from_now)
Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: action, start_date: date_from, end_date: date_to)
end
@@ -14,6 +14,7 @@ RSpec.shared_examples 'a daily tracked issuable event' do
expect(track_action(author: user1)).to be_truthy
expect(track_action(author: user1)).to be_truthy
expect(track_action(author: user2)).to be_truthy
+ expect(count_unique).to eq(2)
end
end
diff --git a/spec/support/shared_examples/lib/sidebars/projects/menus/zentao_menu_shared_examples.rb b/spec/support/shared_examples/lib/sidebars/projects/menus/zentao_menu_shared_examples.rb
index b4c438771ce..d816754f328 100644
--- a/spec/support/shared_examples/lib/sidebars/projects/menus/zentao_menu_shared_examples.rb
+++ b/spec/support/shared_examples/lib/sidebars/projects/menus/zentao_menu_shared_examples.rb
@@ -34,8 +34,16 @@ RSpec.shared_examples 'ZenTao menu with CE version' do
expect(subject.link).to eq zentao_integration.url
end
- it 'contains only open ZenTao item' do
- expect(subject.renderable_items.map(&:item_id)).to match_array [:open_zentao]
+ it 'renders external-link icon' do
+ expect(subject.sprite_icon).to eq 'external-link'
+ end
+
+ it 'renders ZenTao menu' do
+ expect(subject.title).to eq s_('ZentaoIntegration|ZenTao')
+ end
+
+ it 'does not contain items' do
+ expect(subject.renderable_items.count).to eq 0
end
end
end
diff --git a/spec/support/shared_examples/lib/wikis_api_examples.rb b/spec/support/shared_examples/lib/wikis_api_examples.rb
index f068a7676ad..c57ac328a60 100644
--- a/spec/support/shared_examples/lib/wikis_api_examples.rb
+++ b/spec/support/shared_examples/lib/wikis_api_examples.rb
@@ -80,6 +80,8 @@ RSpec.shared_examples_for 'wikis API returns wiki page' do
context 'when wiki page has versions' do
let(:new_content) { 'New content' }
+ let(:old_content) { page.content }
+ let(:old_version_id) { page.version.id }
before do
wiki.update_page(page.page, content: new_content, message: 'updated page')
@@ -96,10 +98,10 @@ RSpec.shared_examples_for 'wikis API returns wiki page' do
end
context 'when version param is set' do
- let(:params) { { version: page.version.id } }
+ let(:params) { { version: old_version_id } }
it 'retrieves the specific page version' do
- expect(json_response['content']).to eq(page.content)
+ expect(json_response['content']).to eq(old_content)
end
context 'when version param is not valid or inexistent' do
diff --git a/spec/support/shared_examples/models/application_setting_shared_examples.rb b/spec/support/shared_examples/models/application_setting_shared_examples.rb
index 38f5c7be393..74ec6474e80 100644
--- a/spec/support/shared_examples/models/application_setting_shared_examples.rb
+++ b/spec/support/shared_examples/models/application_setting_shared_examples.rb
@@ -239,7 +239,7 @@ RSpec.shared_examples 'application settings examples' do
describe '#allowed_key_types' do
it 'includes all key types by default' do
- expect(setting.allowed_key_types).to contain_exactly(*described_class::SUPPORTED_KEY_TYPES)
+ expect(setting.allowed_key_types).to contain_exactly(*Gitlab::SSHPublicKey.supported_types)
end
it 'excludes disabled key types' do
diff --git a/spec/support/shared_examples/models/concerns/bulk_users_by_email_load_shared_examples.rb b/spec/support/shared_examples/models/concerns/bulk_users_by_email_load_shared_examples.rb
new file mode 100644
index 00000000000..c3e9ff5c91a
--- /dev/null
+++ b/spec/support/shared_examples/models/concerns/bulk_users_by_email_load_shared_examples.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'a BulkUsersByEmailLoad model' do
+ describe '#users_by_emails' do
+ let_it_be(:user1) { create(:user, emails: [create(:email, email: 'user1@example.com')]) }
+ let_it_be(:user2) { create(:user, emails: [create(:email, email: 'user2@example.com')]) }
+
+ subject(:model) { described_class.new(id: non_existing_record_id) }
+
+ context 'when nothing is loaded' do
+ let(:passed_emails) { [user1.emails.first.email, user2.email] }
+
+ it 'preforms the yielded query and supplies the data with only emails desired' do
+ expect(model.users_by_emails(passed_emails).keys).to contain_exactly(*passed_emails)
+ end
+ end
+
+ context 'when store is preloaded', :request_store do
+ let(:passed_emails) { [user1.emails.first.email, user2.email, user1.email] }
+ let(:resource_data) do
+ {
+ user1.emails.first.email => instance_double('User'),
+ user2.email => instance_double('User')
+ }
+ end
+
+ before do
+ Gitlab::SafeRequestStore["user_by_email_for_users:#{model.class.name}:#{model.id}"] = resource_data
+ end
+
+ it 'passes back loaded data and does not update the items that already exist' do
+ users_by_emails = model.users_by_emails(passed_emails)
+
+ expect(users_by_emails.keys).to contain_exactly(*passed_emails)
+ expect(users_by_emails).to include(resource_data.merge(user1.email => user1))
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/concerns/from_set_operator_shared_examples.rb b/spec/support/shared_examples/models/concerns/from_set_operator_shared_examples.rb
index 6b208c0024d..e625ba785d2 100644
--- a/spec/support/shared_examples/models/concerns/from_set_operator_shared_examples.rb
+++ b/spec/support/shared_examples/models/concerns/from_set_operator_shared_examples.rb
@@ -20,6 +20,12 @@ RSpec.shared_examples 'from set operator' do |sql_klass|
expect(query.to_sql).to match(/FROM \(\(SELECT.+\)\n#{operator_keyword}\n\(SELECT.+\)\) users/m)
end
+ it "returns empty set when passing empty array" do
+ query = model.public_send(operator_method, [])
+
+ expect(query.to_sql).to match(/WHERE \(1=0\)/m)
+ end
+
it 'supports the use of a custom alias for the sub query' do
query = model.public_send(operator_method,
[model.where(id: 1), model.where(id: 2)],
diff --git a/spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb b/spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb
index d6415e98289..da5c35c970a 100644
--- a/spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb
+++ b/spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb
@@ -227,9 +227,7 @@ RSpec.shared_examples Integrations::SlackMattermostNotifier do |integration_name
end
context 'for confidential notes' do
- before_all do
- issue_note.update!(confidential: true)
- end
+ let_it_be(:issue_note) { create(:note_on_issue, project: project, note: "issue note", confidential: true) }
it 'falls back to note channel' do
expect(::Slack::Messenger).to execute_with_options(channel: ['random'])
diff --git a/spec/support/shared_examples/models/group_shared_examples.rb b/spec/support/shared_examples/models/group_shared_examples.rb
new file mode 100644
index 00000000000..9f3359ba4ab
--- /dev/null
+++ b/spec/support/shared_examples/models/group_shared_examples.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'checks self and root ancestor feature flag' do
+ let_it_be(:root_group) { create(:group) }
+ let_it_be(:group) { create(:group, parent: root_group) }
+ let_it_be(:project) { create(:project, group: group) }
+
+ subject { group.public_send(feature_flag_method) }
+
+ context 'when FF is enabled for the root group' do
+ before do
+ stub_feature_flags(feature_flag => root_group)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when FF is enabled for the group' do
+ before do
+ stub_feature_flags(feature_flag => group)
+ end
+
+ it { is_expected.to be_truthy }
+
+ context 'when root_group is the actor' do
+ it 'is not enabled if the FF is enabled for a child' do
+ expect(root_group.public_send(feature_flag_method)).to be_falsey
+ end
+ end
+ end
+
+ context 'when FF is disabled globally' do
+ before do
+ stub_feature_flags(feature_flag => false)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when FF is enabled globally' do
+ it { is_expected.to be_truthy }
+ end
+end
diff --git a/spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb b/spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb
deleted file mode 100644
index 13ffc1b7f87..00000000000
--- a/spec/support/shared_examples/models/issuable_hook_data_shared_examples.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-# frozen_string_literal: true
-
-# This shared example requires a `builder` and `user` variable
-RSpec.shared_examples 'issuable hook data' do |kind|
- let(:data) { builder.build(user: user) }
-
- include_examples 'project hook data' do
- let(:project) { builder.issuable.project }
- end
-
- include_examples 'deprecated repository hook data'
-
- context "with a #{kind}" do
- it 'contains issuable data' do
- expect(data[:object_kind]).to eq(kind)
- expect(data[:user]).to eq(user.hook_attrs)
- expect(data[:project]).to eq(builder.issuable.project.hook_attrs)
- expect(data[:object_attributes]).to eq(builder.issuable.hook_attrs)
- expect(data[:changes]).to eq({})
- expect(data[:repository]).to eq(builder.issuable.project.hook_attrs.slice(:name, :url, :description, :homepage))
- end
-
- it 'does not contain certain keys' do
- expect(data).not_to have_key(:assignees)
- expect(data).not_to have_key(:assignee)
- end
-
- describe 'changes are given' do
- let(:changes) do
- {
- cached_markdown_version: %w[foo bar],
- description: ['A description', 'A cool description'],
- description_html: %w[foo bar],
- in_progress_merge_commit_sha: %w[foo bar],
- lock_version: %w[foo bar],
- merge_jid: %w[foo bar],
- title: ['A title', 'Hello World'],
- title_html: %w[foo bar]
- }
- end
-
- let(:data) { builder.build(user: user, changes: changes) }
-
- it 'populates the :changes hash' do
- expect(data[:changes]).to match(hash_including({
- title: { previous: 'A title', current: 'Hello World' },
- description: { previous: 'A description', current: 'A cool description' }
- }))
- end
-
- it 'does not contain certain keys' do
- expect(data[:changes]).not_to have_key('cached_markdown_version')
- expect(data[:changes]).not_to have_key('description_html')
- expect(data[:changes]).not_to have_key('lock_version')
- expect(data[:changes]).not_to have_key('title_html')
- expect(data[:changes]).not_to have_key('in_progress_merge_commit_sha')
- expect(data[:changes]).not_to have_key('merge_jid')
- end
- end
- end
-end
diff --git a/spec/support/shared_examples/models/issuable_link_shared_examples.rb b/spec/support/shared_examples/models/issuable_link_shared_examples.rb
index ca98c2597a2..9892e66b582 100644
--- a/spec/support/shared_examples/models/issuable_link_shared_examples.rb
+++ b/spec/support/shared_examples/models/issuable_link_shared_examples.rb
@@ -55,6 +55,19 @@ RSpec.shared_examples 'issuable link' do
end
end
+ describe 'scopes' do
+ describe '.for_source_or_target' do
+ it 'returns only links where id is either source or target id' do
+ link1 = create(issuable_link_factory, source: issuable_link.source)
+ link2 = create(issuable_link_factory, target: issuable_link.source)
+ # unrelated link, should not be included in result list
+ create(issuable_link_factory) # rubocop: disable Rails/SaveBang
+
+ expect(described_class.for_source_or_target(issuable_link.source_id)).to match_array([issuable_link, link1, link2])
+ end
+ end
+ end
+
describe '.link_type' do
it { is_expected.to define_enum_for(:link_type).with_values(relates_to: 0, blocks: 1) }
diff --git a/spec/support/shared_examples/models/member_shared_examples.rb b/spec/support/shared_examples/models/member_shared_examples.rb
index 17026f085bb..a329a6dca91 100644
--- a/spec/support/shared_examples/models/member_shared_examples.rb
+++ b/spec/support/shared_examples/models/member_shared_examples.rb
@@ -88,19 +88,55 @@ RSpec.shared_examples_for "member creation" do
expect(member).to be_persisted
end
- context 'when admin mode is enabled', :enable_admin_mode do
+ context 'when adding a project_bot' do
+ let_it_be(:project_bot) { create(:user, :project_bot) }
+
+ before_all do
+ source.add_owner(user)
+ end
+
+ context 'when project_bot is already a member' do
+ before do
+ source.add_developer(project_bot)
+ end
+
+ it 'does not update the member' do
+ member = described_class.new(source, project_bot, :maintainer, current_user: user).execute
+
+ expect(source.users.reload).to include(project_bot)
+ expect(member).to be_persisted
+ expect(member.access_level).to eq(Gitlab::Access::DEVELOPER)
+ expect(member.errors.full_messages).to include(/not authorized to update member/)
+ end
+ end
+
+ context 'when project_bot is not already a member' do
+ it 'adds the member' do
+ member = described_class.new(source, project_bot, :maintainer, current_user: user).execute
+
+ expect(source.users.reload).to include(project_bot)
+ expect(member).to be_persisted
+ end
+ end
+ end
+
+ context 'when admin mode is enabled', :enable_admin_mode, :aggregate_failures do
it 'sets members.created_by to the given admin current_user' do
member = described_class.new(source, user, :maintainer, current_user: admin).execute
+ expect(member).to be_persisted
+ expect(source.users.reload).to include(user)
expect(member.created_by).to eq(admin)
end
end
context 'when admin mode is disabled' do
- it 'rejects setting members.created_by to the given admin current_user' do
+ it 'rejects setting members.created_by to the given admin current_user', :aggregate_failures do
member = described_class.new(source, user, :maintainer, current_user: admin).execute
- expect(member.created_by).to be_nil
+ expect(member).not_to be_persisted
+ expect(source.users.reload).not_to include(user)
+ expect(member.errors.full_messages).to include(/not authorized to create member/)
end
end
@@ -142,7 +178,7 @@ RSpec.shared_examples_for "member creation" do
end
context 'when called with an unknown user id' do
- it 'adds the user as a member' do
+ it 'does not add the user as a member' do
expect(source.users).not_to include(user)
described_class.new(source, non_existing_record_id, :maintainer).execute
@@ -410,6 +446,22 @@ RSpec.shared_examples_for "bulk member creation" do
end
end
+ it 'with the same user sent more than once by user and by email' do
+ members = described_class.add_users(source, [user1, user1.email], :maintainer)
+
+ expect(members.map(&:user)).to contain_exactly(user1)
+ expect(members).to all(be_a(member_type))
+ expect(members).to all(be_persisted)
+ end
+
+ it 'with the same user sent more than once by user id and by email' do
+ members = described_class.add_users(source, [user1.id, user1.email], :maintainer)
+
+ expect(members.map(&:user)).to contain_exactly(user1)
+ expect(members).to all(be_a(member_type))
+ expect(members).to all(be_persisted)
+ end
+
context 'when a member already exists' do
before do
source.add_user(user1, :developer)
diff --git a/spec/support/shared_examples/models/project_shared_examples.rb b/spec/support/shared_examples/models/project_shared_examples.rb
new file mode 100644
index 00000000000..475ac1da04b
--- /dev/null
+++ b/spec/support/shared_examples/models/project_shared_examples.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'returns true if project is inactive' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:storage_size, :last_activity_at, :expected_result) do
+ 1.megabyte | 1.month.ago | false
+ 1.megabyte | 3.years.ago | false
+ 8.megabytes | 1.month.ago | false
+ 8.megabytes | 3.years.ago | true
+ end
+
+ with_them do
+ before do
+ stub_application_setting(inactive_projects_min_size_mb: 5)
+ stub_application_setting(inactive_projects_send_warning_email_after_months: 24)
+
+ project.statistics.storage_size = storage_size
+ project.last_activity_at = last_activity_at
+ project.save!
+ end
+
+ it 'returns expected result' do
+ expect(project.inactive?).to eq(expected_result)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/wiki_shared_examples.rb b/spec/support/shared_examples/models/wiki_shared_examples.rb
index b3f79d9fe6e..03e9dd65e33 100644
--- a/spec/support/shared_examples/models/wiki_shared_examples.rb
+++ b/spec/support/shared_examples/models/wiki_shared_examples.rb
@@ -11,6 +11,10 @@ RSpec.shared_examples 'wiki model' do
subject { wiki }
+ it 'VALID_USER_MARKUPS contains all valid markups' do
+ expect(described_class::VALID_USER_MARKUPS.keys).to match_array(%i(markdown rdoc asciidoc org))
+ end
+
it 'container class includes HasWiki' do
# NOTE: This is not enforced at runtime, since we also need to support Geo::DeletedProject
expect(wiki_container).to be_kind_of(HasWiki)
@@ -427,45 +431,131 @@ RSpec.shared_examples 'wiki model' do
end
describe '#update_page' do
- let(:page) { create(:wiki_page, wiki: subject, title: 'update-page') }
+ shared_examples 'update_page tests' do
+ with_them do
+ let!(:page) { create(:wiki_page, wiki: subject, title: original_title, format: original_format, content: 'original content') }
+
+ let(:message) { 'updated page' }
+ let(:updated_content) { 'updated content' }
+
+ def update_page
+ subject.update_page(
+ page.page,
+ content: updated_content,
+ title: updated_title,
+ format: updated_format,
+ message: message
+ )
+ end
+
+ specify :aggregate_failures do
+ expect(subject).to receive(:after_wiki_activity)
+ expect(update_page).to eq true
+
+ page = subject.find_page(updated_title.presence || original_title)
- def update_page
- subject.update_page(
- page.page,
- content: 'some other content',
- format: :markdown,
- message: 'updated page'
- )
+ expect(page.raw_content).to eq(updated_content)
+ expect(page.path).to eq(expected_path)
+ expect(page.version.message).to eq(message)
+ expect(user.commit_email).not_to eq(user.email)
+ expect(commit.author_email).to eq(user.commit_email)
+ expect(commit.committer_email).to eq(user.commit_email)
+ end
+ end
end
- it 'updates the content of the page' do
- update_page
- page = subject.find_page('update-page')
+ shared_context 'common examples' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:original_title, :original_format, :updated_title, :updated_format, :expected_path) do
+ 'test page' | :markdown | 'new test page' | :markdown | 'new-test-page.md'
+ 'test page' | :markdown | 'test page' | :markdown | 'test-page.md'
+ 'test page' | :markdown | 'test page' | :asciidoc | 'test-page.asciidoc'
+
+ 'test page' | :markdown | 'new dir/new test page' | :markdown | 'new-dir/new-test-page.md'
+ 'test page' | :markdown | 'new dir/test page' | :markdown | 'new-dir/test-page.md'
- expect(page.raw_content).to eq('some other content')
+ 'test dir/test page' | :markdown | 'new dir/new test page' | :markdown | 'new-dir/new-test-page.md'
+ 'test dir/test page' | :markdown | 'test dir/test page' | :markdown | 'test-dir/test-page.md'
+ 'test dir/test page' | :markdown | 'test dir/test page' | :asciidoc | 'test-dir/test-page.asciidoc'
+
+ 'test dir/test page' | :markdown | 'new test page' | :markdown | 'new-test-page.md'
+ 'test dir/test page' | :markdown | 'test page' | :markdown | 'test-page.md'
+
+ 'test page' | :markdown | nil | :markdown | 'test-page.md'
+ 'test.page' | :markdown | nil | :markdown | 'test.page.md'
+ end
end
- it 'sets the correct commit message' do
- update_page
- page = subject.find_page('update-page')
+ # There are two bugs in Gollum. THe first one is when the title and the format are updated
+ # at the same time https://gitlab.com/gitlab-org/gitlab/-/issues/243519.
+ # The second one is when the wiki page is within a dir and the `title` argument
+ # we pass to the update method is `nil`. Gollum will remove the dir and move the page.
+ #
+ # We can include this context into the former once it is fixed
+ # or when Gollum is removed since the Gitaly approach already fixes it.
+ shared_context 'extended examples' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:original_title, :original_format, :updated_title, :updated_format, :expected_path) do
+ 'test page' | :markdown | 'new test page' | :asciidoc | 'new-test-page.asciidoc'
+ 'test page' | :markdown | 'new dir/new test page' | :asciidoc | 'new-dir/new-test-page.asciidoc'
+ 'test dir/test page' | :markdown | 'new dir/new test page' | :asciidoc | 'new-dir/new-test-page.asciidoc'
+ 'test dir/test page' | :markdown | 'new test page' | :asciidoc | 'new-test-page.asciidoc'
+ 'test page' | :markdown | nil | :asciidoc | 'test-page.asciidoc'
+ 'test dir/test page' | :markdown | nil | :asciidoc | 'test-dir/test-page.asciidoc'
+ 'test dir/test page' | :markdown | nil | :markdown | 'test-dir/test-page.md'
+ 'test page' | :markdown | '' | :markdown | 'test-page.md'
+ 'test.page' | :markdown | '' | :markdown | 'test.page.md'
+ end
+ end
- expect(page.version.message).to eq('updated page')
+ it_behaves_like 'update_page tests' do
+ include_context 'common examples'
+ include_context 'extended examples'
end
- it 'sets the correct commit email' do
- update_page
+ context 'when format is invalid' do
+ let!(:page) { create(:wiki_page, wiki: subject, title: 'test page') }
- expect(user.commit_email).not_to eq(user.email)
- expect(commit.author_email).to eq(user.commit_email)
- expect(commit.committer_email).to eq(user.commit_email)
+ it 'returns false and sets error message' do
+ expect(subject.update_page(page.page, content: 'new content', format: :foobar)).to eq false
+ expect(subject.error_message).to match(/Invalid format selected/)
+ end
end
- it 'runs after_wiki_activity callbacks' do
- page
+ context 'when format is not allowed' do
+ let!(:page) { create(:wiki_page, wiki: subject, title: 'test page') }
- expect(subject).to receive(:after_wiki_activity)
+ it 'returns false and sets error message' do
+ expect(subject.update_page(page.page, content: 'new content', format: :creole)).to eq false
+ expect(subject.error_message).to match(/Invalid format selected/)
+ end
+ end
+
+ context 'when page path does not have a default extension' do
+ let!(:page) { create(:wiki_page, wiki: subject, title: 'test page') }
+
+ context 'when format is not different' do
+ it 'does not change the default extension' do
+ path = 'test-page.markdown'
+ page.page.instance_variable_set(:@path, path)
- update_page
+ expect(subject.repository).to receive(:update_file).with(user, path, anything, anything)
+
+ subject.update_page(page.page, content: 'new content', format: :markdown)
+ end
+ end
+ end
+
+ context 'when feature flag :gitaly_replace_wiki_update_page is disabled' do
+ before do
+ stub_feature_flags(gitaly_replace_wiki_update_page: false)
+ end
+
+ it_behaves_like 'update_page tests' do
+ include_context 'common examples'
+ end
end
end
diff --git a/spec/support/shared_examples/policies/wiki_policies_shared_examples.rb b/spec/support/shared_examples/policies/wiki_policies_shared_examples.rb
index 58822f4309b..991d6289373 100644
--- a/spec/support/shared_examples/policies/wiki_policies_shared_examples.rb
+++ b/spec/support/shared_examples/policies/wiki_policies_shared_examples.rb
@@ -107,10 +107,4 @@ RSpec.shared_examples 'model with wiki policies' do
expect_disallowed(*disallowed_permissions)
end
end
-
- # TODO: Remove this helper once we implement group features
- # https://gitlab.com/gitlab-org/gitlab/-/issues/208412
- def set_access_level(access_level)
- raise NotImplementedError
- end
end
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 9f4fdcf7ba1..dc2c4f890b1 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
@@ -163,11 +163,11 @@ RSpec.shared_examples 'rejects Composer access with unknown project id' do
let(:project) { double(id: non_existing_record_id) }
context 'as anonymous' do
- it_behaves_like 'process Composer api request', :anonymous, :not_found
+ it_behaves_like 'process Composer api request', :anonymous, :unauthorized
end
context 'as authenticated user' do
- subject { get api(url), headers: basic_auth_header(user.username, personal_access_token.token) }
+ subject { get api(url), params: params, headers: basic_auth_header(user.username, personal_access_token.token) }
it_behaves_like 'process Composer api request', :anonymous, :not_found
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 e1e75be2494..c1eccafa987 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
@@ -116,3 +116,93 @@ RSpec.shared_examples 'not hitting graphql network errors with the container reg
expect_graphql_errors_to_be_empty
end
end
+
+RSpec.shared_examples 'reconciling migration_state' do
+ shared_examples 'enforcing states coherence to' do |expected_migration_state|
+ it 'leaves the repository in the expected migration_state' do
+ expect(repository.gitlab_api_client).not_to receive(:pre_import_repository)
+ expect(repository.gitlab_api_client).not_to receive(:import_repository)
+
+ subject
+
+ expect(repository.reload.migration_state).to eq(expected_migration_state)
+ end
+ end
+
+ shared_examples 'retrying the pre_import' do
+ it 'retries the pre_import' do
+ expect(repository).to receive(:migration_pre_import).and_return(:ok)
+
+ expect { subject }.to change { repository.reload.migration_state }.to('pre_importing')
+ end
+ end
+
+ shared_examples 'retrying the import' do
+ it 'retries the import' do
+ expect(repository).to receive(:migration_import).and_return(:ok)
+
+ expect { subject }.to change { repository.reload.migration_state }.to('importing')
+ end
+ end
+
+ context 'native response' do
+ let(:status) { 'native' }
+
+ it 'finishes the import' do
+ expect { subject }
+ .to change { repository.reload.migration_state }.to('import_done')
+ .and change { repository.reload.migration_skipped_reason }.to('native_import')
+ end
+ end
+
+ context 'import_in_progress response' do
+ let(:status) { 'import_in_progress' }
+
+ it_behaves_like 'enforcing states coherence to', 'importing'
+ end
+
+ context 'import_complete response' do
+ let(:status) { 'import_complete' }
+
+ it 'finishes the import' do
+ expect { subject }.to change { repository.reload.migration_state }.to('import_done')
+ end
+ end
+
+ context 'import_failed response' do
+ let(:status) { 'import_failed' }
+
+ it_behaves_like 'retrying the import'
+ end
+
+ context 'pre_import_in_progress response' do
+ let(:status) { 'pre_import_in_progress' }
+
+ it_behaves_like 'enforcing states coherence to', 'pre_importing'
+ end
+
+ context 'pre_import_complete response' do
+ let(:status) { 'pre_import_complete' }
+
+ it 'finishes the pre_import and starts the import' do
+ expect(repository).to receive(:finish_pre_import).and_call_original
+ expect(repository).to receive(:migration_import).and_return(:ok)
+
+ expect { subject }.to change { repository.reload.migration_state }.to('importing')
+ end
+ end
+
+ context 'pre_import_failed response' do
+ let(:status) { 'pre_import_failed' }
+
+ it_behaves_like 'retrying the pre_import'
+ end
+
+ %w[pre_import_canceled import_canceled].each do |canceled_status|
+ context "#{canceled_status} response" do
+ let(:status) { canceled_status }
+
+ it_behaves_like 'enforcing states coherence to', 'import_skipped'
+ end
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb
index 01ed6c26576..da9d254039b 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
@@ -54,11 +54,13 @@ RSpec.shared_examples 'group and project boards query' do
end
context 'when using default sorting' do
+ # rubocop:disable RSpec/VariableName
let!(:board_B) { create(:board, resource_parent: board_parent, name: 'B') }
let!(:board_C) { create(:board, resource_parent: board_parent, name: 'C') }
let!(:board_a) { create(:board, resource_parent: board_parent, name: 'a') }
let!(:board_A) { create(:board, resource_parent: board_parent, name: 'A') }
let(:boards) { [board_a, board_A, board_B, board_C] }
+ # rubocop:enable RSpec/VariableName
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
diff --git a/spec/support/shared_examples/requests/api/issuable_participants_examples.rb b/spec/support/shared_examples/requests/api/issuable_participants_examples.rb
index c5e5803c0a7..673d7741017 100644
--- a/spec/support/shared_examples/requests/api/issuable_participants_examples.rb
+++ b/spec/support/shared_examples/requests/api/issuable_participants_examples.rb
@@ -28,34 +28,4 @@ RSpec.shared_examples 'issuable participants endpoint' do
expect(response).to have_gitlab_http_status(:not_found)
end
-
- context 'with a confidential note' do
- let!(:note) do
- create(
- :note,
- :confidential,
- project: project,
- noteable: entity,
- author: create(:user)
- )
- end
-
- it 'returns a full list of participants' do
- get api("/projects/#{project.id}/#{area}/#{entity.iid}/participants", user)
-
- expect(response).to have_gitlab_http_status(:ok)
- participant_ids = json_response.map { |el| el['id'] }
- expect(participant_ids).to match_array([entity.author_id, note.author_id])
- end
-
- context 'when user cannot see a confidential note' do
- it 'returns a limited list of participants' do
- get api("/projects/#{project.id}/#{area}/#{entity.iid}/participants", create(:user))
-
- expect(response).to have_gitlab_http_status(:ok)
- participant_ids = json_response.map { |el| el['id'] }
- expect(participant_ids).to match_array([entity.author_id])
- end
- end
- end
end
diff --git a/spec/support/shared_examples/requests/api/notes_shared_examples.rb b/spec/support/shared_examples/requests/api/notes_shared_examples.rb
index 2a157f6e855..e7e30665b08 100644
--- a/spec/support/shared_examples/requests/api/notes_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/notes_shared_examples.rb
@@ -142,15 +142,6 @@ RSpec.shared_examples 'noteable API' do |parent_type, noteable_type, id_name|
expect(json_response['author']['username']).to eq(user.username)
end
- it "creates a confidential note if confidential is set to true" do
- post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user), params: { body: 'hi!', confidential: true }
-
- expect(response).to have_gitlab_http_status(:created)
- expect(json_response['body']).to eq('hi!')
- expect(json_response['confidential']).to be_truthy
- expect(json_response['author']['username']).to eq(user.username)
- end
-
it "returns a 400 bad request error if body not given" do
post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user)
@@ -306,52 +297,31 @@ RSpec.shared_examples 'noteable API' do |parent_type, noteable_type, id_name|
end
describe "PUT /#{parent_type}/:id/#{noteable_type}/:noteable_id/notes/:note_id" do
- let(:params) { { body: 'Hello!', confidential: false } }
+ let(:params) { { body: 'Hello!' } }
subject do
put api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes/#{note.id}", user), params: params
end
- context 'when eveything is ok' do
- before do
- note.update!(confidential: true)
- end
+ context 'when only body param is present' do
+ let(:params) { { body: 'Hello!' } }
- context 'with multiple params present' do
- before do
- subject
- end
-
- it 'returns modified note' do
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['body']).to eq('Hello!')
- expect(json_response['confidential']).to be_falsey
- end
-
- it 'updates the note' do
- expect(note.reload.note).to eq('Hello!')
- expect(note.confidential).to be_falsey
- end
- end
-
- context 'when only body param is present' do
- let(:params) { { body: 'Hello!' } }
-
- it 'updates only the note text' do
- expect { subject }.not_to change { note.reload.confidential }
+ it 'updates the note text' do
+ subject
- expect(note.note).to eq('Hello!')
- end
+ expect(note.reload.note).to eq('Hello!')
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['body']).to eq('Hello!')
end
+ end
- context 'when only confidential param is present' do
- let(:params) { { confidential: false } }
+ context 'when confidential param is present' do
+ let(:params) { { confidential: true } }
- it 'updates only the note text' do
- expect { subject }.not_to change { note.reload.note }
+ it 'does not allow to change confidentiality' do
+ expect { subject }.not_to change { note.reload.note }
- expect(note.confidential).to be_falsey
- end
+ expect(response).to have_gitlab_http_status(:bad_request)
end
end
@@ -393,3 +363,24 @@ RSpec.shared_examples 'noteable API' do |parent_type, noteable_type, id_name|
end
end
end
+
+RSpec.shared_examples 'noteable API with confidential notes' do |parent_type, noteable_type, id_name|
+ it_behaves_like 'noteable API', parent_type, noteable_type, id_name
+
+ describe "POST /#{parent_type}/:id/#{noteable_type}/:noteable_id/notes" do
+ let(:params) { { body: 'hi!' } }
+
+ subject do
+ post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user), params: params
+ end
+
+ it "creates a confidential note if confidential is set to true" do
+ post api("/#{parent_type}/#{parent.id}/#{noteable_type}/#{noteable[id_name]}/notes", user), params: params.merge(confidential: true)
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response['body']).to eq('hi!')
+ expect(json_response['confidential']).to be_truthy
+ expect(json_response['author']['username']).to eq(user.username)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb b/spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb
index 87a33060435..fcd52cdf7fa 100644
--- a/spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb
+++ b/spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb
@@ -1,8 +1,5 @@
# frozen_string_literal: true
RSpec.shared_examples 'avoid N+1 on environments serialization' do |ee: false|
- # Investigating in https://gitlab.com/gitlab-org/gitlab/-/issues/353209
- let(:query_threshold) { 1 + (ee ? 4 : 0) }
-
it 'avoids N+1 database queries with grouping', :request_store do
create_environment_with_associations(project)
@@ -11,9 +8,11 @@ RSpec.shared_examples 'avoid N+1 on environments serialization' do |ee: false|
create_environment_with_associations(project)
create_environment_with_associations(project)
- expect { serialize(grouping: true) }
- .not_to exceed_query_limit(control.count)
- .with_threshold(query_threshold)
+ # Fix N+1 queries introduced by multi stop_actions for environment.
+ # Tracked in https://gitlab.com/gitlab-org/gitlab/-/issues/358780
+ relax_count = 14
+
+ expect { serialize(grouping: true) }.not_to exceed_query_limit(control.count + relax_count)
end
it 'avoids N+1 database queries without grouping', :request_store do
@@ -24,9 +23,11 @@ RSpec.shared_examples 'avoid N+1 on environments serialization' do |ee: false|
create_environment_with_associations(project)
create_environment_with_associations(project)
- expect { serialize(grouping: false) }
- .not_to exceed_query_limit(control.count)
- .with_threshold(query_threshold)
+ # Fix N+1 queries introduced by multi stop_actions for environment.
+ # Tracked in https://gitlab.com/gitlab-org/gitlab/-/issues/358780
+ relax_count = 14
+
+ expect { serialize(grouping: false) }.not_to exceed_query_limit(control.count + relax_count)
end
it 'does not preload for environments that does not exist in the page', :request_store do
diff --git a/spec/support/shared_examples/services/boards/boards_list_service_shared_examples.rb b/spec/support/shared_examples/services/boards/boards_list_service_shared_examples.rb
index 0e2bddc19ab..fd832d4484d 100644
--- a/spec/support/shared_examples/services/boards/boards_list_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/boards/boards_list_service_shared_examples.rb
@@ -13,10 +13,12 @@ RSpec.shared_examples 'boards list service' do
end
RSpec.shared_examples 'multiple boards list service' do
+ # rubocop:disable RSpec/VariableName
let(:service) { described_class.new(parent, double) }
let!(:board_B) { create(:board, resource_parent: parent, name: 'B-board') }
let!(:board_c) { create(:board, resource_parent: parent, name: 'c-board') }
let!(:board_a) { create(:board, resource_parent: parent, name: 'a-board') }
+ # rubocop:enable RSpec/VariableName
describe '#execute' do
it 'returns all issue boards' do
diff --git a/spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb b/spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb
index a780952d51b..7677e5d8cb2 100644
--- a/spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb
@@ -154,6 +154,30 @@ RSpec.shared_examples 'logs an auth warning' do |requested_actions|
end
end
+RSpec.shared_examples 'allowed to delete container repository images' do
+ let(:authentication_abilities) do
+ [:admin_container_image]
+ end
+
+ it_behaves_like 'a valid token'
+
+ context 'allow to delete images' do
+ let(:current_params) do
+ { scopes: ["repository:#{project.full_path}:*"] }
+ end
+
+ it_behaves_like 'a deletable'
+ end
+
+ context 'allow to delete images since registry 2.7' do
+ let(:current_params) do
+ { scopes: ["repository:#{project.full_path}:delete"] }
+ end
+
+ it_behaves_like 'a deletable since registry 2.7'
+ end
+end
+
RSpec.shared_examples 'a container registry auth service' do
include_context 'container registry auth service context'
@@ -204,6 +228,46 @@ RSpec.shared_examples 'a container registry auth service' do
it_behaves_like 'not a container repository factory'
end
+ describe '.pull_nested_repositories_access_token' do
+ let_it_be(:project) { create(:project) }
+
+ let(:token) { described_class.pull_nested_repositories_access_token(project.full_path) }
+ let(:access) do
+ [
+ {
+ 'type' => 'repository',
+ 'name' => project.full_path,
+ 'actions' => ['pull']
+ },
+ {
+ 'type' => 'repository',
+ 'name' => "#{project.full_path}/*",
+ 'actions' => ['pull']
+ }
+ ]
+ end
+
+ subject { { token: token } }
+
+ it 'has the correct scope' do
+ expect(payload).to include('access' => access)
+ end
+
+ it_behaves_like 'a valid token'
+ it_behaves_like 'not a container repository factory'
+
+ context 'with path ending with a slash' do
+ let(:token) { described_class.pull_nested_repositories_access_token("#{project.full_path}/") }
+
+ it 'has the correct scope' do
+ expect(payload).to include('access' => access)
+ end
+
+ it_behaves_like 'a valid token'
+ it_behaves_like 'not a container repository factory'
+ end
+ end
+
context 'user authorization' do
let_it_be(:current_user) { create(:user) }
@@ -504,38 +568,14 @@ RSpec.shared_examples 'a container registry auth service' do
end
context 'delete authorized as maintainer' do
- let_it_be(:current_project) { create(:project) }
+ let_it_be(:project) { create(:project) }
let_it_be(:current_user) { create(:user) }
- let(:authentication_abilities) do
- [:admin_container_image]
- end
-
before_all do
- current_project.add_maintainer(current_user)
- end
-
- it_behaves_like 'a valid token'
-
- context 'allow to delete images' do
- let(:current_params) do
- { scopes: ["repository:#{current_project.full_path}:*"] }
- end
-
- it_behaves_like 'a deletable' do
- let(:project) { current_project }
- end
+ project.add_maintainer(current_user)
end
- context 'allow to delete images since registry 2.7' do
- let(:current_params) do
- { scopes: ["repository:#{current_project.full_path}:delete"] }
- end
-
- it_behaves_like 'a deletable since registry 2.7' do
- let(:project) { current_project }
- end
- end
+ it_behaves_like 'allowed to delete container repository images'
end
context 'build authorized as user' do
diff --git a/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb b/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb
index 6146aae6b9b..9610cdd18a3 100644
--- a/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb
+++ b/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb
@@ -70,8 +70,10 @@ shared_examples 'issuable link creation' do
expect(issuable_link_class.find_by!(target: issuable3)).to have_attributes(source: issuable, link_type: 'relates_to')
end
- it 'returns success status' do
- is_expected.to eq(status: :success)
+ it 'returns success status and created links', :aggregate_failures do
+ expect(subject.keys).to match_array([:status, :created_references])
+ expect(subject[:status]).to eq(:success)
+ expect(subject[:created_references].map(&:target_id)).to match_array([issuable2.id, issuable3.id])
end
it 'creates notes' do
diff --git a/spec/support/shared_examples/views/milestone_shared_examples.rb b/spec/support/shared_examples/views/milestone_shared_examples.rb
new file mode 100644
index 00000000000..b6f4d0db0e9
--- /dev/null
+++ b/spec/support/shared_examples/views/milestone_shared_examples.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'milestone empty states' do
+ include Devise::Test::ControllerHelpers
+
+ let_it_be(:user) { build(:user) }
+ let(:empty_state) { 'Use milestones to track issues and merge requests over a fixed period of time' }
+
+ before do
+ assign(:projects, [])
+ allow(view).to receive(:current_user).and_return(user)
+ end
+
+ context 'with no milestones' do
+ before do
+ assign(:milestones, [])
+ assign(:milestone_states, { opened: 0, closed: 0, all: 0 })
+ render
+ end
+
+ it 'shows empty state' do
+ expect(rendered).to have_content(empty_state)
+ end
+
+ it 'does not show tabs or searchbar' do
+ expect(rendered).not_to have_link('Open')
+ expect(rendered).not_to have_link('Closed')
+ expect(rendered).not_to have_link('All')
+ end
+ end
+
+ context 'with no open milestones' do
+ before do
+ allow(view).to receive(:milestone_path).and_return("/milestones/1")
+ assign(:milestones, [])
+ assign(:milestone_states, { opened: 0, closed: 1, all: 1 })
+ end
+
+ it 'shows tabs and searchbar', :aggregate_failures do
+ render
+
+ expect(rendered).not_to have_content(empty_state)
+ expect(rendered).to have_link('Open')
+ expect(rendered).to have_link('Closed')
+ expect(rendered).to have_link('All')
+ end
+
+ it 'shows empty state' do
+ render
+
+ expect(rendered).to have_content('There are no open milestones')
+ end
+ end
+
+ context 'with no closed milestones' do
+ before do
+ allow(view).to receive(:milestone_path).and_return("/milestones/1")
+ allow(view).to receive(:params).and_return(state: 'closed')
+ assign(:milestones, [])
+ assign(:milestone_states, { opened: 1, closed: 0, all: 1 })
+ end
+
+ it 'shows tabs and searchbar', :aggregate_failures do
+ render
+
+ expect(rendered).not_to have_content(empty_state)
+ expect(rendered).to have_link('Open')
+ expect(rendered).to have_link('Closed')
+ expect(rendered).to have_link('All')
+ end
+
+ it 'shows empty state on closed milestones' do
+ render
+
+ expect(rendered).to have_content('There are no closed milestones')
+ end
+ end
+end
diff --git a/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb b/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb
index d202c4e00f0..26731f34ed6 100644
--- a/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb
+++ b/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_database|
+RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_database, feature_flag:|
include ExclusiveLeaseHelpers
describe 'defining the job attributes' do
@@ -39,6 +39,16 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d
end
end
+ describe '.enabled?' do
+ it 'does not raise an error' do
+ expect { described_class.enabled? }.not_to raise_error
+ end
+
+ it 'returns true' do
+ expect(described_class.enabled?).to be_truthy
+ end
+ end
+
describe '#perform' do
subject(:worker) { described_class.new }
@@ -76,7 +86,7 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d
context 'when the feature flag is disabled' do
before do
- stub_feature_flags(execute_batched_migrations_on_schedule: false)
+ stub_feature_flags(feature_flag => false)
end
it 'does nothing' do
@@ -89,7 +99,7 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d
context 'when the feature flag is enabled' do
before do
- stub_feature_flags(execute_batched_migrations_on_schedule: true)
+ stub_feature_flags(feature_flag => true)
allow(Gitlab::Database::BackgroundMigration::BatchedMigration).to receive(:active_migration).and_return(nil)
end
diff --git a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb
index 202606c6aa6..4751d91efde 100644
--- a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb
+++ b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb
@@ -230,76 +230,6 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true|
stub_feature_flags(optimized_housekeeping: false)
end
- it 'incremental repack adds a new packfile' do
- create_objects(resource)
- before_packs = packs(resource)
-
- expect(before_packs.count).to be >= 1
-
- subject.perform(resource.id, 'incremental_repack', lease_key, lease_uuid)
- after_packs = packs(resource)
-
- # Exactly one new pack should have been created
- expect(after_packs.count).to eq(before_packs.count + 1)
-
- # Previously existing packs are still around
- expect(before_packs & after_packs).to eq(before_packs)
- end
-
- it 'full repack consolidates into 1 packfile' do
- create_objects(resource)
- subject.perform(resource.id, 'incremental_repack', lease_key, lease_uuid)
- before_packs = packs(resource)
-
- expect(before_packs.count).to be >= 2
-
- subject.perform(resource.id, 'full_repack', lease_key, lease_uuid)
- after_packs = packs(resource)
-
- expect(after_packs.count).to eq(1)
-
- # Previously existing packs should be gone now
- expect(after_packs - before_packs).to eq(after_packs)
-
- expect(File.exist?(bitmap_path(after_packs.first))).to eq(bitmaps_enabled)
- end
-
- it 'gc consolidates into 1 packfile and updates packed-refs' do
- create_objects(resource)
- before_packs = packs(resource)
- before_packed_refs = packed_refs(resource)
-
- expect(before_packs.count).to be >= 1
-
- # It's quite difficult to use `expect_next_instance_of` in this place
- # because the RepositoryService is instantiated several times to do
- # some repository calls like `exists?`, `create_repository`, ... .
- # Therefore, since we're instantiating the object several times,
- # RSpec has troubles figuring out which instance is the next and which
- # one we want to mock.
- # Besides, at this point, we actually want to perform the call to Gitaly,
- # otherwise we would just use `instance_double` like in other parts of the
- # spec file.
- expect_any_instance_of(Gitlab::GitalyClient::RepositoryService) # rubocop:disable RSpec/AnyInstanceOf
- .to receive(:garbage_collect)
- .with(bitmaps_enabled, prune: false)
- .and_call_original
-
- subject.perform(resource.id, 'gc', lease_key, lease_uuid)
- after_packed_refs = packed_refs(resource)
- after_packs = packs(resource)
-
- expect(after_packs.count).to eq(1)
-
- # Previously existing packs should be gone now
- expect(after_packs - before_packs).to eq(after_packs)
-
- # The packed-refs file should have been updated during 'git gc'
- expect(before_packed_refs).not_to eq(after_packed_refs)
-
- expect(File.exist?(bitmap_path(after_packs.first))).to eq(bitmaps_enabled)
- end
-
it 'cleans up repository after finishing' do
expect(resource).to receive(:cleanup).and_call_original
diff --git a/spec/tasks/dev_rake_spec.rb b/spec/tasks/dev_rake_spec.rb
index 7bc27d2732c..73b1604aa10 100644
--- a/spec/tasks/dev_rake_spec.rb
+++ b/spec/tasks/dev_rake_spec.rb
@@ -7,9 +7,20 @@ RSpec.describe 'dev rake tasks' do
Rake.application.rake_require 'tasks/gitlab/setup'
Rake.application.rake_require 'tasks/gitlab/shell'
Rake.application.rake_require 'tasks/dev'
+ Rake.application.rake_require 'active_record/railties/databases'
+ Rake.application.rake_require 'tasks/gitlab/db'
end
describe 'setup' do
+ around do |example|
+ old_force_value = ENV['force']
+
+ # setup rake task sets the force env var, so reset it
+ example.run
+
+ ENV['force'] = old_force_value # rubocop:disable RSpec/EnvAssignment
+ end
+
subject(:setup_task) { run_rake_task('dev:setup') }
let(:connections) { Gitlab::Database.database_base_models.values.map(&:connection) }
@@ -17,7 +28,9 @@ RSpec.describe 'dev rake tasks' do
it 'sets up the development environment', :aggregate_failures do
expect(Rake::Task['gitlab:setup']).to receive(:invoke)
+ expect(connections).to all(receive(:execute).with('SET statement_timeout TO 0'))
expect(connections).to all(receive(:execute).with('ANALYZE'))
+ expect(connections).to all(receive(:execute).with('RESET statement_timeout'))
expect(Rake::Task['gitlab:shell:setup']).to receive(:invoke)
@@ -35,4 +48,103 @@ RSpec.describe 'dev rake tasks' do
load_task
end
end
+
+ describe 'terminate_all_connections' do
+ let(:connections) do
+ Gitlab::Database.database_base_models.values.filter_map do |model|
+ model.connection if Gitlab::Database.db_config_share_with(model.connection_db_config).nil?
+ end
+ end
+
+ def expect_connections_to_be_terminated
+ expect(Gitlab::Database::EachDatabase).to receive(:each_database_connection)
+ .with(include_shared: false)
+ .and_call_original
+
+ expect(connections).to all(receive(:execute).with(/SELECT pg_terminate_backend/))
+ end
+
+ def expect_connections_not_to_be_terminated
+ connections.each do |connection|
+ expect(connection).not_to receive(:execute)
+ end
+ end
+
+ subject(:terminate_task) { run_rake_task('dev:terminate_all_connections') }
+
+ it 'terminates all connections' do
+ expect_connections_to_be_terminated
+
+ terminate_task
+ end
+
+ context 'when in the production environment' do
+ it 'does not terminate connections' do
+ expect(Rails.env).to receive(:production?).and_return(true)
+ expect_connections_not_to_be_terminated
+
+ terminate_task
+ end
+ end
+
+ context 'when a database is not found' do
+ before do
+ skip_if_multiple_databases_not_setup
+ end
+
+ it 'continues to next connection' do
+ expect(connections.first).to receive(:execute).and_raise(ActiveRecord::NoDatabaseError)
+ expect(connections.second).to receive(:execute).with(/SELECT pg_terminate_backend/)
+
+ terminate_task
+ end
+ end
+ end
+
+ context 'multiple databases' do
+ before do
+ skip_if_multiple_databases_not_setup
+ end
+
+ context 'with a valid database' do
+ describe 'copy_db:ci' do
+ before do
+ allow(Rake::Task['dev:terminate_all_connections']).to receive(:invoke)
+
+ configurations = instance_double(ActiveRecord::DatabaseConfigurations)
+ allow(ActiveRecord::Base).to receive(:configurations).and_return(configurations)
+ allow(configurations).to receive(:configs_for).with(env_name: Rails.env, name: 'ci').and_return(ci_configuration)
+ end
+
+ subject(:load_task) { run_rake_task('dev:setup_ci_db') }
+
+ let(:ci_configuration) { instance_double(ActiveRecord::DatabaseConfigurations::HashConfig, name: 'ci', database: '__test_db_ci') }
+
+ it 'creates the database from main' do
+ expect(ApplicationRecord.connection).to receive(:create_database).with(
+ ci_configuration.database,
+ template: ApplicationRecord.connection_db_config.database
+ )
+
+ expect(Rake::Task['dev:terminate_all_connections']).to receive(:invoke)
+
+ run_rake_task('dev:copy_db:ci')
+ end
+
+ context 'when the database already exists' do
+ it 'prints out a warning' do
+ expect(ApplicationRecord.connection).to receive(:create_database).and_raise(ActiveRecord::DatabaseAlreadyExists)
+
+ expect { run_rake_task('dev:copy_db:ci') }.to output(/Database '#{ci_configuration.database}' already exists/).to_stderr
+ end
+ end
+ end
+ end
+
+ context 'with an invalid database' do
+ it 'raises an error' do
+ expect { run_rake_task('dev:copy_db:foo') }.to raise_error(RuntimeError, /Don't know how to build task/)
+ end
+ end
+ end
end
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index df9f2a0d3bb..6080948403d 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -199,18 +199,25 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
end
it 'logs the progress to log file' do
- expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping database ... ")
- expect(Gitlab::BackupLogger).to receive(:info).with(message: "[SKIPPED]")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping database ... [SKIPPED]")
expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping repositories ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping repositories ... done")
expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping uploads ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping uploads ... done")
expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping builds ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping builds ... done")
expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping artifacts ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping artifacts ... done")
expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping pages ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping pages ... done")
expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping lfs objects ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping lfs objects ... done")
expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping terraform states ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping terraform states ... done")
expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping container registry images ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping container registry images ... done")
expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping packages ... ")
- expect(Gitlab::BackupLogger).to receive(:info).with(message: "done").exactly(9).times
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping packages ... done")
backup_tasks.each do |task|
run_rake_task("gitlab:backup:#{task}:create")
@@ -228,19 +235,19 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
db_backup_error = Backup::DatabaseBackupError.new(config, db_file_name)
where(:backup_class, :rake_task, :error) do
- Backup::Database | 'gitlab:backup:db:create' | db_backup_error
- Backup::Builds | 'gitlab:backup:builds:create' | file_backup_error
- Backup::Uploads | 'gitlab:backup:uploads:create' | file_backup_error
- Backup::Artifacts | 'gitlab:backup:artifacts:create' | file_backup_error
- Backup::Pages | 'gitlab:backup:pages:create' | file_backup_error
- Backup::Lfs | 'gitlab:backup:lfs:create' | file_backup_error
- Backup::Registry | 'gitlab:backup:registry:create' | file_backup_error
+ Backup::Database | 'gitlab:backup:db:create' | db_backup_error
+ Backup::Files | 'gitlab:backup:builds:create' | file_backup_error
+ Backup::Files | 'gitlab:backup:uploads:create' | file_backup_error
+ Backup::Files | 'gitlab:backup:artifacts:create' | file_backup_error
+ Backup::Files | 'gitlab:backup:pages:create' | file_backup_error
+ Backup::Files | 'gitlab:backup:lfs:create' | file_backup_error
+ Backup::Files | 'gitlab:backup:registry:create' | file_backup_error
end
with_them do
before do
- expect_next_instance_of(backup_class) do |instance|
- expect(instance).to receive(:dump).and_raise(error)
+ allow_next_instance_of(backup_class) do |instance|
+ allow(instance).to receive(:dump).and_raise(error)
end
end
@@ -408,25 +415,12 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
create(:project, :repository)
end
- it 'has defaults' do
- expect(::Backup::Repositories).to receive(:new)
- .with(anything, strategy: anything, max_concurrency: 1, max_storage_concurrency: 1)
- .and_call_original
-
- expect { run_rake_task('gitlab:backup:create') }.to output.to_stdout_from_any_process
- end
-
it 'passes through concurrency environment variables' do
- # The way concurrency is handled will change with the `gitaly_backup`
- # feature flag. For now we need to check that both ways continue to
- # work. This will be cleaned up in the rollout issue.
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/333034
-
stub_env('GITLAB_BACKUP_MAX_CONCURRENCY', 5)
stub_env('GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY', 2)
expect(::Backup::Repositories).to receive(:new)
- .with(anything, strategy: anything, max_concurrency: 5, max_storage_concurrency: 2)
+ .with(anything, strategy: anything)
.and_call_original
expect(::Backup::GitalyBackup).to receive(:new).with(anything, max_parallelism: 5, storage_parallelism: 2, incremental: false).and_call_original
diff --git a/spec/tasks/gitlab/db/validate_config_rake_spec.rb b/spec/tasks/gitlab/db/validate_config_rake_spec.rb
new file mode 100644
index 00000000000..0b2c844a91f
--- /dev/null
+++ b/spec/tasks/gitlab/db/validate_config_rake_spec.rb
@@ -0,0 +1,205 @@
+# frozen_string_literal: true
+
+require 'rake_helper'
+
+RSpec.describe 'gitlab:db:validate_config', :silence_stdout do
+ before :all do
+ Rake.application.rake_require 'active_record/railties/databases'
+ Rake.application.rake_require 'tasks/seed_fu'
+ Rake.application.rake_require 'tasks/gitlab/db/validate_config'
+
+ # empty task as env is already loaded
+ Rake::Task.define_task :environment
+ end
+
+ context "when validating config" do
+ let(:main_database_config) do
+ Rails.application.config.load_database_yaml
+ .dig('test', 'main')
+ .slice('adapter', 'encoding', 'database', 'username', 'password', 'host')
+ .symbolize_keys
+ end
+
+ let(:additional_database_config) do
+ # Use built-in postgres database
+ main_database_config.merge(database: 'postgres')
+ end
+
+ around do |example|
+ with_reestablished_active_record_base(reconnect: true) do
+ with_db_configs(test: test_config) do
+ example.run
+ end
+ end
+ end
+
+ shared_examples 'validates successfully' do
+ it 'by default' do
+ expect { run_rake_task('gitlab:db:validate_config') }.not_to output(/Database config validation failure/).to_stderr
+ expect { run_rake_task('gitlab:db:validate_config') }.not_to raise_error
+ end
+
+ it 'for production' do
+ allow(Gitlab).to receive(:dev_or_test_env?).and_return(false)
+
+ expect { run_rake_task('gitlab:db:validate_config') }.not_to output(/Database config validation failure/).to_stderr
+ expect { run_rake_task('gitlab:db:validate_config') }.not_to raise_error
+ end
+
+ it 'always re-establishes ActiveRecord::Base connection to main config' do
+ run_rake_task('gitlab:db:validate_config')
+
+ expect(ActiveRecord::Base.connection_db_config.configuration_hash).to include(main_database_config) # rubocop: disable Database/MultipleDatabases
+ end
+
+ it 'if GITLAB_VALIDATE_DATABASE_CONFIG is set' do
+ stub_env('GITLAB_VALIDATE_DATABASE_CONFIG', '1')
+ allow(Gitlab).to receive(:dev_or_test_env?).and_return(false)
+
+ expect { run_rake_task('gitlab:db:validate_config') }.not_to output(/Database config validation failure/).to_stderr
+ expect { run_rake_task('gitlab:db:validate_config') }.not_to raise_error
+ end
+
+ context 'when finding the initializer fails' do
+ where(:raised_error) { [ActiveRecord::NoDatabaseError, ActiveRecord::ConnectionNotEstablished, PG::ConnectionBad] }
+ with_them do
+ it "does not raise an error for #{params[:raised_error]}" do
+ allow(ActiveRecord::Base.connection).to receive(:select_one).and_raise(raised_error) # rubocop: disable Database/MultipleDatabases
+
+ expect { run_rake_task('gitlab:db:validate_config') }.not_to output(/Database config validation failure/).to_stderr
+ expect { run_rake_task('gitlab:db:validate_config') }.not_to raise_error
+ end
+ end
+ end
+ end
+
+ shared_examples 'raises an error' do |match|
+ it 'by default' do
+ expect { run_rake_task('gitlab:db:validate_config') }.to raise_error(match)
+ end
+
+ it 'for production' do
+ allow(Gitlab).to receive(:dev_or_test_env?).and_return(false)
+
+ expect { run_rake_task('gitlab:db:validate_config') }.to raise_error(match)
+ end
+
+ it 'always re-establishes ActiveRecord::Base connection to main config' do
+ expect { run_rake_task('gitlab:db:validate_config') }.to raise_error(match)
+
+ expect(ActiveRecord::Base.connection_db_config.configuration_hash).to include(main_database_config) # rubocop: disable Database/MultipleDatabases
+ end
+
+ it 'if GITLAB_VALIDATE_DATABASE_CONFIG=1' do
+ stub_env('GITLAB_VALIDATE_DATABASE_CONFIG', '1')
+
+ expect { run_rake_task('gitlab:db:validate_config') }.to raise_error(match)
+ end
+
+ it 'to stderr if GITLAB_VALIDATE_DATABASE_CONFIG=0' do
+ stub_env('GITLAB_VALIDATE_DATABASE_CONFIG', '0')
+
+ expect { run_rake_task('gitlab:db:validate_config') }.to output(match).to_stderr
+ end
+ end
+
+ context 'when only main: is specified' do
+ let(:test_config) do
+ {
+ main: main_database_config
+ }
+ end
+
+ it_behaves_like 'validates successfully'
+ end
+
+ context 'when main: uses database_tasks=false' do
+ let(:test_config) do
+ {
+ main: main_database_config.merge(database_tasks: false)
+ }
+ end
+
+ it_behaves_like 'raises an error', /The 'main' is required to use 'database_tasks: true'/
+ end
+
+ context 'when many configurations share the same database' do
+ context 'when no database_tasks is specified, assumes true' do
+ let(:test_config) do
+ {
+ main: main_database_config,
+ ci: main_database_config
+ }
+ end
+
+ it_behaves_like 'raises an error', /Many configurations \(main, ci\) share the same database/
+ end
+
+ context 'when database_tasks is specified' do
+ let(:test_config) do
+ {
+ main: main_database_config.merge(database_tasks: true),
+ ci: main_database_config.merge(database_tasks: true)
+ }
+ end
+
+ it_behaves_like 'raises an error', /Many configurations \(main, ci\) share the same database/
+ end
+
+ context "when there's no main: but something different, as currently we only can share with main:" do
+ let(:test_config) do
+ {
+ archive: main_database_config,
+ ci: main_database_config.merge(database_tasks: false)
+ }
+ end
+
+ it_behaves_like 'raises an error', /The 'ci' is expecting to share configuration with 'main', but no such is to be found/
+ end
+ end
+
+ context 'when ci: uses different database' do
+ context 'and does not specify database_tasks which indicates using dedicated database' do
+ let(:test_config) do
+ {
+ main: main_database_config,
+ ci: additional_database_config
+ }
+ end
+
+ it_behaves_like 'validates successfully'
+ end
+
+ context 'and does specify database_tasks=false which indicates sharing with main:' do
+ let(:test_config) do
+ {
+ main: main_database_config,
+ ci: additional_database_config.merge(database_tasks: false)
+ }
+ end
+
+ it_behaves_like 'raises an error', /The 'ci' since it is using 'database_tasks: false' should share database with 'main:'/
+ end
+ end
+ end
+
+ %w[db:migrate db:schema:load db:schema:dump].each do |task|
+ context "when running #{task}" do
+ it "does run gitlab:db:validate_config before" do
+ expect(Rake::Task['gitlab:db:validate_config']).to receive(:execute).and_return(true)
+ expect(Rake::Task[task]).to receive(:execute).and_return(true)
+
+ Rake::Task['gitlab:db:validate_config'].reenable
+ run_rake_task(task)
+ end
+ end
+ end
+
+ def with_db_configs(test: test_config)
+ current_configurations = ActiveRecord::Base.configurations # rubocop:disable Database/MultipleDatabases
+ ActiveRecord::Base.configurations = { test: test_config }
+ yield
+ ensure
+ ActiveRecord::Base.configurations = current_configurations
+ end
+end
diff --git a/spec/tasks/gitlab/db_rake_spec.rb b/spec/tasks/gitlab/db_rake_spec.rb
index 8d3ec7b1ee2..73f3b55e12e 100644
--- a/spec/tasks/gitlab/db_rake_spec.rb
+++ b/spec/tasks/gitlab/db_rake_spec.rb
@@ -20,14 +20,6 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
allow(Rake::Task['db:seed_fu']).to receive(:invoke).and_return(true)
end
- describe 'clear_all_connections' do
- it 'calls clear_all_connections!' do
- expect(ActiveRecord::Base).to receive(:clear_all_connections!)
-
- run_rake_task('gitlab:db:clear_all_connections')
- end
- end
-
describe 'mark_migration_complete' do
context 'with a single database' do
let(:main_model) { ActiveRecord::Base }
@@ -51,7 +43,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
let(:base_models) { { 'main' => main_model, 'ci' => ci_model } }
before do
- skip_if_multiple_databases_not_setup
+ skip_unless_ci_uses_database_tasks
allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
end
@@ -80,6 +72,17 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
run_rake_task('gitlab:db:mark_migration_complete:main', '[123]')
end
end
+
+ context 'with geo configured' do
+ before do
+ skip_unless_geo_configured
+ end
+
+ it 'does not create a task for the geo database' do
+ expect { run_rake_task('gitlab:db:mark_migration_complete:geo') }
+ .to raise_error(/Don't know how to build task 'gitlab:db:mark_migration_complete:geo'/)
+ end
+ end
end
context 'when the migration is already marked complete' do
@@ -122,79 +125,228 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
end
describe 'configure' do
- it 'invokes db:migrate when schema has already been loaded' do
- allow(ActiveRecord::Base.connection).to receive(:tables).and_return(%w[table1 table2])
- expect(Rake::Task['db:migrate']).to receive(:invoke)
- expect(Rake::Task['db:structure:load']).not_to receive(:invoke)
- expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
- expect { run_rake_task('gitlab:db:configure') }.not_to raise_error
- end
+ context 'with a single database' do
+ let(:connection) { Gitlab::Database.database_base_models[:main].connection }
+ let(:main_config) { double(:config, name: 'main') }
- it 'invokes db:shema:load and db:seed_fu when schema is not loaded' do
- allow(ActiveRecord::Base.connection).to receive(:tables).and_return([])
- expect(Rake::Task['db:structure:load']).to receive(:invoke)
- expect(Rake::Task['db:seed_fu']).to receive(:invoke)
- expect(Rake::Task['db:migrate']).not_to receive(:invoke)
- expect { run_rake_task('gitlab:db:configure') }.not_to raise_error
- end
+ before do
+ skip_if_multiple_databases_are_setup
+ end
- it 'invokes db:shema:load and db:seed_fu when there is only a single table present' do
- allow(ActiveRecord::Base.connection).to receive(:tables).and_return(['default'])
- expect(Rake::Task['db:structure:load']).to receive(:invoke)
- expect(Rake::Task['db:seed_fu']).to receive(:invoke)
- expect(Rake::Task['db:migrate']).not_to receive(:invoke)
- expect { run_rake_task('gitlab:db:configure') }.not_to raise_error
- end
+ context 'when geo is not configured' do
+ before do
+ allow(ActiveRecord::Base).to receive_message_chain('configurations.configs_for').and_return([main_config])
+ end
- it 'does not invoke any other rake tasks during an error' do
- allow(ActiveRecord::Base).to receive(:connection).and_raise(RuntimeError, 'error')
- expect(Rake::Task['db:migrate']).not_to receive(:invoke)
- expect(Rake::Task['db:structure:load']).not_to receive(:invoke)
- expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
- expect { run_rake_task('gitlab:db:configure') }.to raise_error(RuntimeError, 'error')
- # unstub connection so that the database cleaner still works
- allow(ActiveRecord::Base).to receive(:connection).and_call_original
- end
+ context 'when the schema is already loaded' do
+ it 'migrates the database' do
+ allow(connection).to receive(:tables).and_return(%w[table1 table2])
+
+ expect(Rake::Task['db:migrate']).to receive(:invoke)
+ expect(Rake::Task['db:schema:load']).not_to receive(:invoke)
+ expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
+
+ run_rake_task('gitlab:db:configure')
+ end
+ end
+
+ context 'when the schema is not loaded' do
+ it 'loads the schema and seeds the database' do
+ allow(connection).to receive(:tables).and_return([])
+
+ expect(Rake::Task['db:schema:load']).to receive(:invoke)
+ expect(Rake::Task['db:seed_fu']).to receive(:invoke)
+ expect(Rake::Task['db:migrate']).not_to receive(:invoke)
+
+ run_rake_task('gitlab:db:configure')
+ end
+ end
+
+ context 'when only a single table is present' do
+ it 'loads the schema and seeds the database' do
+ allow(connection).to receive(:tables).and_return(['default'])
+
+ expect(Rake::Task['db:schema:load']).to receive(:invoke)
+ expect(Rake::Task['db:seed_fu']).to receive(:invoke)
+ expect(Rake::Task['db:migrate']).not_to receive(:invoke)
+
+ run_rake_task('gitlab:db:configure')
+ end
+ end
+
+ context 'when loading the schema fails' do
+ it 'does not seed the database' do
+ allow(connection).to receive(:tables).and_return([])
+
+ expect(Rake::Task['db:schema:load']).to receive(:invoke).and_raise('error')
+ expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
+ expect(Rake::Task['db:migrate']).not_to receive(:invoke)
+
+ expect { run_rake_task('gitlab:db:configure') }.to raise_error(RuntimeError, 'error')
+ end
+ end
+
+ context 'SKIP_POST_DEPLOYMENT_MIGRATIONS environment variable set' do
+ let(:rails_paths) { { 'db' => ['db'], 'db/migrate' => ['db/migrate'] } }
+
+ before do
+ stub_env('SKIP_POST_DEPLOYMENT_MIGRATIONS', true)
+
+ # Our environment has already been loaded, so we need to pretend like post_migrations were not
+ allow(Rails.application.config).to receive(:paths).and_return(rails_paths)
+ allow(ActiveRecord::Migrator).to receive(:migrations_paths).and_return(rails_paths['db/migrate'].dup)
+ end
+
+ context 'when the schema is not loaded' do
+ it 'adds the post deployment migration path before schema load' do
+ allow(connection).to receive(:tables).and_return([])
+
+ expect(Gitlab::Database).to receive(:add_post_migrate_path_to_rails).and_call_original
+ expect(Rake::Task['db:schema:load']).to receive(:invoke)
+ expect(Rake::Task['db:seed_fu']).to receive(:invoke)
+ expect(Rake::Task['db:migrate']).not_to receive(:invoke)
+
+ run_rake_task('gitlab:db:configure')
+
+ expect(rails_paths['db/migrate'].include?(File.join(Rails.root, 'db', 'post_migrate'))).to be(true)
+ end
+ end
+
+ context 'when the schema is loaded' do
+ it 'ignores post deployment migrations' do
+ allow(connection).to receive(:tables).and_return(%w[table1 table2])
+
+ expect(Rake::Task['db:migrate']).to receive(:invoke)
+ expect(Gitlab::Database).not_to receive(:add_post_migrate_path_to_rails)
+ expect(Rake::Task['db:schema:load']).not_to receive(:invoke)
+ expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
- it 'does not invoke seed after a failed schema_load' do
- allow(ActiveRecord::Base.connection).to receive(:tables).and_return([])
- allow(Rake::Task['db:structure:load']).to receive(:invoke).and_raise(RuntimeError, 'error')
- expect(Rake::Task['db:structure:load']).to receive(:invoke)
- expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
- expect(Rake::Task['db:migrate']).not_to receive(:invoke)
- expect { run_rake_task('gitlab:db:configure') }.to raise_error(RuntimeError, 'error')
+ run_rake_task('gitlab:db:configure')
+
+ expect(rails_paths['db/migrate'].include?(File.join(Rails.root, 'db', 'post_migrate'))).to be(false)
+ end
+ end
+ end
+ end
+
+ context 'when geo is configured' do
+ context 'when the main database is also configured' do
+ before do
+ skip_unless_geo_configured
+ end
+
+ it 'only configures the main database' do
+ allow(connection).to receive(:tables).and_return(%w[table1 table2])
+
+ expect(Rake::Task['db:migrate:main']).to receive(:invoke)
+
+ expect(Rake::Task['db:migrate:geo']).not_to receive(:invoke)
+ expect(Rake::Task['db:schema:load:geo']).not_to receive(:invoke)
+
+ run_rake_task('gitlab:db:configure')
+ end
+ end
+ end
end
- context 'SKIP_POST_DEPLOYMENT_MIGRATIONS environment variable set' do
- let(:rails_paths) { { 'db' => ['db'], 'db/migrate' => ['db/migrate'] } }
+ context 'with multiple databases' do
+ let(:main_model) { double(:model, connection: double(:connection)) }
+ let(:ci_model) { double(:model, connection: double(:connection)) }
+ let(:base_models) { { 'main' => main_model, 'ci' => ci_model }.with_indifferent_access }
+
+ let(:main_config) { double(:config, name: 'main') }
+ let(:ci_config) { double(:config, name: 'ci') }
before do
- allow(ENV).to receive(:[]).and_call_original
- allow(ENV).to receive(:[]).with('SKIP_POST_DEPLOYMENT_MIGRATIONS').and_return true
+ skip_unless_ci_uses_database_tasks
- # Our environment has already been loaded, so we need to pretend like post_migrations were not
- allow(Rails.application.config).to receive(:paths).and_return(rails_paths)
- allow(ActiveRecord::Migrator).to receive(:migrations_paths).and_return(rails_paths['db/migrate'].dup)
+ allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
end
- it 'adds post deployment migrations before schema load if the schema is not already loaded' do
- allow(ActiveRecord::Base.connection).to receive(:tables).and_return([])
- expect(Gitlab::Database).to receive(:add_post_migrate_path_to_rails).and_call_original
- expect(Rake::Task['db:structure:load']).to receive(:invoke)
- expect(Rake::Task['db:seed_fu']).to receive(:invoke)
- expect(Rake::Task['db:migrate']).not_to receive(:invoke)
- expect { run_rake_task('gitlab:db:configure') }.not_to raise_error
- expect(rails_paths['db/migrate'].include?(File.join(Rails.root, 'db', 'post_migrate'))).to be(true)
+ context 'when geo is not configured' do
+ before do
+ allow(ActiveRecord::Base).to receive_message_chain('configurations.configs_for')
+ .and_return([main_config, ci_config])
+ end
+
+ context 'when no database has the schema loaded' do
+ before do
+ allow(main_model.connection).to receive(:tables).and_return(%w[schema_migrations])
+ allow(ci_model.connection).to receive(:tables).and_return([])
+ end
+
+ it 'loads the schema and seeds all the databases' do
+ expect(Rake::Task['db:schema:load:main']).to receive(:invoke)
+ expect(Rake::Task['db:schema:load:ci']).to receive(:invoke)
+
+ expect(Rake::Task['db:migrate:main']).not_to receive(:invoke)
+ expect(Rake::Task['db:migrate:ci']).not_to receive(:invoke)
+
+ expect(Rake::Task['db:seed_fu']).to receive(:invoke)
+
+ run_rake_task('gitlab:db:configure')
+ end
+ end
+
+ context 'when both databases have the schema loaded' do
+ before do
+ allow(main_model.connection).to receive(:tables).and_return(%w[table1 table2])
+ allow(ci_model.connection).to receive(:tables).and_return(%w[table1 table2])
+ end
+
+ it 'migrates the databases without seeding them' do
+ expect(Rake::Task['db:migrate:main']).to receive(:invoke)
+ expect(Rake::Task['db:migrate:ci']).to receive(:invoke)
+
+ expect(Rake::Task['db:schema:load:main']).not_to receive(:invoke)
+ expect(Rake::Task['db:schema:load:ci']).not_to receive(:invoke)
+
+ expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
+
+ run_rake_task('gitlab:db:configure')
+ end
+ end
+
+ context 'when only one database has the schema loaded' do
+ before do
+ allow(main_model.connection).to receive(:tables).and_return(%w[table1 table2])
+ allow(ci_model.connection).to receive(:tables).and_return([])
+ end
+
+ it 'migrates and loads the schema correctly, without seeding the databases' do
+ expect(Rake::Task['db:migrate:main']).to receive(:invoke)
+ expect(Rake::Task['db:schema:load:main']).not_to receive(:invoke)
+
+ expect(Rake::Task['db:schema:load:ci']).to receive(:invoke)
+ expect(Rake::Task['db:migrate:ci']).not_to receive(:invoke)
+
+ expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
+
+ run_rake_task('gitlab:db:configure')
+ end
+ end
end
- it 'ignores post deployment migrations when schema has already been loaded' do
- allow(ActiveRecord::Base.connection).to receive(:tables).and_return(%w[table1 table2])
- expect(Rake::Task['db:migrate']).to receive(:invoke)
- expect(Gitlab::Database).not_to receive(:add_post_migrate_path_to_rails)
- expect(Rake::Task['db:structure:load']).not_to receive(:invoke)
- expect(Rake::Task['db:seed_fu']).not_to receive(:invoke)
- expect { run_rake_task('gitlab:db:configure') }.not_to raise_error
- expect(rails_paths['db/migrate'].include?(File.join(Rails.root, 'db', 'post_migrate'))).to be(false)
+ context 'when geo is configured' do
+ let(:geo_config) { double(:config, name: 'geo') }
+
+ before do
+ skip_unless_geo_configured
+
+ allow(main_model.connection).to receive(:tables).and_return(%w[schema_migrations])
+ allow(ci_model.connection).to receive(:tables).and_return(%w[schema_migrations])
+ end
+
+ it 'does not run tasks against geo' do
+ expect(Rake::Task['db:schema:load:main']).to receive(:invoke)
+ expect(Rake::Task['db:schema:load:ci']).to receive(:invoke)
+ expect(Rake::Task['db:seed_fu']).to receive(:invoke)
+
+ expect(Rake::Task['db:migrate:geo']).not_to receive(:invoke)
+ expect(Rake::Task['db:schema:load:geo']).not_to receive(:invoke)
+
+ run_rake_task('gitlab:db:configure')
+ end
end
end
end
@@ -290,7 +442,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
let(:base_models) { { 'main' => main_model, 'ci' => ci_model } }
before do
- skip_if_multiple_databases_not_setup
+ skip_unless_ci_uses_database_tasks
allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
@@ -319,6 +471,17 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
run_rake_task('gitlab:db:drop_tables:main')
end
end
+
+ context 'with geo configured' do
+ before do
+ skip_unless_geo_configured
+ end
+
+ it 'does not create a task for the geo database' do
+ expect { run_rake_task('gitlab:db:drop_tables:geo') }
+ .to raise_error(/Don't know how to build task 'gitlab:db:drop_tables:geo'/)
+ end
+ end
end
def expect_objects_to_be_dropped(connection)
@@ -336,38 +499,119 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
end
end
- describe 'reindex' do
- it 'delegates to Gitlab::Database::Reindexing' do
- expect(Gitlab::Database::Reindexing).to receive(:invoke)
+ describe 'create_dynamic_partitions' do
+ context 'with a single database' do
+ before do
+ skip_if_multiple_databases_are_setup
+ end
+
+ it 'delegates syncing of partitions without limiting databases' do
+ expect(Gitlab::Database::Partitioning).to receive(:sync_partitions)
+
+ run_rake_task('gitlab:db:create_dynamic_partitions')
+ end
+ end
+
+ context 'with multiple databases' do
+ before do
+ skip_unless_ci_uses_database_tasks
+ end
+
+ context 'when running the multi-database variant' do
+ it 'delegates syncing of partitions without limiting databases' do
+ expect(Gitlab::Database::Partitioning).to receive(:sync_partitions)
- run_rake_task('gitlab:db:reindex')
+ run_rake_task('gitlab:db:create_dynamic_partitions')
+ end
+ end
+
+ context 'when running a single-database variant' do
+ it 'delegates syncing of partitions for the chosen database' do
+ expect(Gitlab::Database::Partitioning).to receive(:sync_partitions).with(only_on: 'main')
+
+ run_rake_task('gitlab:db:create_dynamic_partitions:main')
+ end
+ end
end
- context 'when reindexing is not enabled' do
- it 'is a no-op' do
- expect(Gitlab::Database::Reindexing).to receive(:enabled?).and_return(false)
- expect(Gitlab::Database::Reindexing).not_to receive(:invoke)
+ context 'with geo configured' do
+ before do
+ skip_unless_geo_configured
+ end
- expect { run_rake_task('gitlab:db:reindex') }.to raise_error(SystemExit)
+ it 'does not create a task for the geo database' do
+ expect { run_rake_task('gitlab:db:create_dynamic_partitions:geo') }
+ .to raise_error(/Don't know how to build task 'gitlab:db:create_dynamic_partitions:geo'/)
end
end
end
- databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
- ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |database_name|
- describe "reindex:#{database_name}" do
+ describe 'reindex' do
+ context 'with a single database' do
+ before do
+ skip_if_multiple_databases_are_setup
+ end
+
it 'delegates to Gitlab::Database::Reindexing' do
- expect(Gitlab::Database::Reindexing).to receive(:invoke).with(database_name)
+ expect(Gitlab::Database::Reindexing).to receive(:invoke).with(no_args)
- run_rake_task("gitlab:db:reindex:#{database_name}")
+ run_rake_task('gitlab:db:reindex')
end
context 'when reindexing is not enabled' do
it 'is a no-op' do
expect(Gitlab::Database::Reindexing).to receive(:enabled?).and_return(false)
- expect(Gitlab::Database::Reindexing).not_to receive(:invoke).with(database_name)
+ expect(Gitlab::Database::Reindexing).not_to receive(:invoke)
- expect { run_rake_task("gitlab:db:reindex:#{database_name}") }.to raise_error(SystemExit)
+ expect { run_rake_task('gitlab:db:reindex') }.to raise_error(SystemExit)
+ end
+ end
+ end
+
+ context 'with multiple databases' do
+ let(:base_models) { { 'main' => double(:model), 'ci' => double(:model) } }
+
+ before do
+ skip_if_multiple_databases_not_setup
+
+ allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
+ end
+
+ it 'delegates to Gitlab::Database::Reindexing without a specific database' do
+ expect(Gitlab::Database::Reindexing).to receive(:invoke).with(no_args)
+
+ run_rake_task('gitlab:db:reindex')
+ end
+
+ context 'when the single database task is used' do
+ before do
+ skip_unless_ci_uses_database_tasks
+ end
+
+ it 'delegates to Gitlab::Database::Reindexing with a specific database' do
+ expect(Gitlab::Database::Reindexing).to receive(:invoke).with('ci')
+
+ run_rake_task('gitlab:db:reindex:ci')
+ end
+
+ context 'when reindexing is not enabled' do
+ it 'is a no-op' do
+ expect(Gitlab::Database::Reindexing).to receive(:enabled?).and_return(false)
+ expect(Gitlab::Database::Reindexing).not_to receive(:invoke)
+
+ expect { run_rake_task('gitlab:db:reindex:ci') }.to raise_error(SystemExit)
+ end
+ end
+ end
+
+ context 'with geo configured' do
+ before do
+ skip_unless_geo_configured
+ end
+
+ it 'does not create a task for the geo database' do
+ expect { run_rake_task('gitlab:db:reindex:geo') }
+ .to raise_error(/Don't know how to build task 'gitlab:db:reindex:geo'/)
end
end
end
@@ -439,34 +683,77 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
subject
end
end
+
+ describe '#sample_background_migrations' do
+ it 'delegates to the migration runner with a default sample duration' do
+ expect(::Gitlab::Database::Migrations::Runner).to receive_message_chain(:background_migrations, :run_jobs).with(for_duration: 30.minutes)
+
+ run_rake_task('gitlab:db:migration_testing:sample_background_migrations')
+ end
+
+ it 'delegates to the migration runner with a configured sample duration' do
+ expect(::Gitlab::Database::Migrations::Runner).to receive_message_chain(:background_migrations, :run_jobs).with(for_duration: 100.seconds)
+
+ run_rake_task('gitlab:db:migration_testing:sample_background_migrations', '[100]')
+ end
+ end
end
describe '#execute_batched_migrations' do
- subject { run_rake_task('gitlab:db:execute_batched_migrations') }
+ subject(:execute_batched_migrations) { run_rake_task('gitlab:db:execute_batched_migrations') }
- let(:migrations) { create_list(:batched_background_migration, 2) }
- let(:runner) { instance_double('Gitlab::Database::BackgroundMigration::BatchedMigrationRunner') }
+ let(:connections) do
+ {
+ main: instance_double(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter),
+ ci: instance_double(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
+ }
+ end
+
+ let(:runners) do
+ {
+ main: instance_double('Gitlab::Database::BackgroundMigration::BatchedMigrationRunner'),
+ ci: instance_double('Gitlab::Database::BackgroundMigration::BatchedMigrationRunner')
+ }
+ end
+
+ let(:migrations) do
+ {
+ main: build_list(:batched_background_migration, 1),
+ ci: build_list(:batched_background_migration, 1)
+ }
+ end
before do
- allow(Gitlab::Database::BackgroundMigration::BatchedMigration).to receive_message_chain(:active, :queue_order).and_return(migrations)
- allow(Gitlab::Database::BackgroundMigration::BatchedMigrationRunner).to receive(:new).and_return(runner)
+ each_database = class_double('Gitlab::Database::EachDatabase').as_stubbed_const
+
+ allow(each_database).to receive(:each_database_connection)
+ .and_yield(connections[:main], 'main')
+ .and_yield(connections[:ci], 'ci')
+
+ keys = migrations.keys
+ allow(Gitlab::Database::BackgroundMigration::BatchedMigration)
+ .to receive_message_chain(:with_status, :queue_order) { migrations[keys.shift] }
end
it 'executes all migrations' do
- migrations.each do |migration|
- expect(runner).to receive(:run_entire_migration).with(migration)
+ [:main, :ci].each do |name|
+ expect(Gitlab::Database::BackgroundMigration::BatchedMigrationRunner).to receive(:new)
+ .with(connection: connections[name])
+ .and_return(runners[name])
+
+ expect(runners[name]).to receive(:run_entire_migration).with(migrations[name].first)
end
- subject
+ execute_batched_migrations
end
end
context 'with multiple databases', :reestablished_active_record_base do
before do
- skip_if_multiple_databases_not_setup
+ skip_unless_ci_uses_database_tasks
end
- describe 'db:structure:dump' do
+ describe 'db:structure:dump against a single database' do
it 'invokes gitlab:db:clean_structure_sql' do
expect(Rake::Task['gitlab:db:clean_structure_sql']).to receive(:invoke).twice.and_return(true)
@@ -474,7 +761,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
end
end
- describe 'db:schema:dump' do
+ describe 'db:schema:dump against a single database' do
it 'invokes gitlab:db:clean_structure_sql' do
expect(Rake::Task['gitlab:db:clean_structure_sql']).to receive(:invoke).once.and_return(true)
@@ -482,26 +769,24 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
end
end
- describe 'db:migrate' do
- it 'invokes gitlab:db:create_dynamic_partitions' do
- expect(Rake::Task['gitlab:db:create_dynamic_partitions']).to receive(:invoke).once.and_return(true)
+ describe 'db:migrate against a single database' do
+ it 'invokes gitlab:db:create_dynamic_partitions for the same database' do
+ expect(Rake::Task['gitlab:db:create_dynamic_partitions:main']).to receive(:invoke).once.and_return(true)
expect { run_rake_task('db:migrate:main') }.not_to raise_error
end
end
describe 'db:migrate:geo' do
- it 'does not invoke gitlab:db:create_dynamic_partitions' do
- skip 'Skipping because geo database is not setup' unless geo_configured?
+ before do
+ skip_unless_geo_configured
+ end
+ it 'does not invoke gitlab:db:create_dynamic_partitions' do
expect(Rake::Task['gitlab:db:create_dynamic_partitions']).not_to receive(:invoke)
expect { run_rake_task('db:migrate:geo') }.not_to raise_error
end
-
- def geo_configured?
- !!ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: 'geo')
- end
end
end
@@ -559,4 +844,20 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
run_rake_task(test_task_name)
end
+
+ def skip_unless_ci_uses_database_tasks
+ skip "Skipping because database tasks won't run against the ci database" unless ci_database_tasks?
+ end
+
+ def ci_database_tasks?
+ !!ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: 'ci')&.database_tasks?
+ end
+
+ def skip_unless_geo_configured
+ skip 'Skipping because the geo database is not configured' unless geo_configured?
+ end
+
+ def geo_configured?
+ !!ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: 'geo')
+ end
end
diff --git a/spec/tasks/gitlab/refresh_project_statistics_build_artifacts_size_rake_spec.rb b/spec/tasks/gitlab/refresh_project_statistics_build_artifacts_size_rake_spec.rb
index e57704d0ebe..3495b535cff 100644
--- a/spec/tasks/gitlab/refresh_project_statistics_build_artifacts_size_rake_spec.rb
+++ b/spec/tasks/gitlab/refresh_project_statistics_build_artifacts_size_rake_spec.rb
@@ -11,37 +11,53 @@ RSpec.describe 'gitlab:refresh_project_statistics_build_artifacts_size rake task
let_it_be(:project_3) { create(:project) }
let(:string_of_ids) { "#{project_1.id} #{project_2.id} #{project_3.id} 999999" }
+ let(:csv_url) { 'https://www.example.com/foo.csv' }
+ let(:csv_body) do
+ <<~BODY
+ PROJECT_ID
+ #{project_1.id}
+ #{project_2.id}
+ #{project_3.id}
+ BODY
+ end
before do
Rake.application.rake_require('tasks/gitlab/refresh_project_statistics_build_artifacts_size')
stub_const("BUILD_ARTIFACTS_SIZE_REFRESH_ENQUEUE_BATCH_SIZE", 2)
- end
- context 'when given a list of space-separated IDs through STDIN' do
- before do
- allow($stdin).to receive(:tty?).and_return(false)
- allow($stdin).to receive(:read).and_return(string_of_ids)
- end
+ stub_request(:get, csv_url).to_return(status: 200, body: csv_body)
+ allow(Kernel).to receive(:sleep).with(1)
+ end
+ context 'when given a list of space-separated IDs through rake argument' do
it 'enqueues the projects for refresh' do
- expect { run_rake_task(rake_task) }.to output(/Done/).to_stdout
+ expect { run_rake_task(rake_task, csv_url) }.to output(/Done/).to_stdout
expect(Projects::BuildArtifactsSizeRefresh.all.map(&:project)).to match_array([project_1, project_2, project_3])
end
- end
- context 'when given a list of space-separated IDs through rake argument' do
- it 'enqueues the projects for refresh' do
- expect { run_rake_task(rake_task, string_of_ids) }.to output(/Done/).to_stdout
+ it 'inserts refreshes in batches with a sleep' do
+ expect(Projects::BuildArtifactsSizeRefresh).to receive(:enqueue_refresh).with([project_1, project_2]).ordered
+ expect(Kernel).to receive(:sleep).with(1)
+ expect(Projects::BuildArtifactsSizeRefresh).to receive(:enqueue_refresh).with([project_3]).ordered
- expect(Projects::BuildArtifactsSizeRefresh.all.map(&:project)).to match_array([project_1, project_2, project_3])
+ run_rake_task(rake_task, csv_url)
end
end
- context 'when not given any IDs' do
+ context 'when CSV has invalid header' do
+ let(:csv_body) do
+ <<~BODY
+ projectid
+ #{project_1.id}
+ #{project_2.id}
+ #{project_3.id}
+ BODY
+ end
+
it 'returns an error message' do
- expect { run_rake_task(rake_task) }.to output(/Please provide a string of space-separated project IDs/).to_stdout
+ expect { run_rake_task(rake_task, csv_url) }.to output(/Project IDs must be listed in the CSV under the header PROJECT_ID/).to_stdout
end
end
end
diff --git a/spec/tasks/gitlab/setup_rake_spec.rb b/spec/tasks/gitlab/setup_rake_spec.rb
index 6e4d5087517..c31546fc259 100644
--- a/spec/tasks/gitlab/setup_rake_spec.rb
+++ b/spec/tasks/gitlab/setup_rake_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'gitlab:setup namespace rake tasks', :silence_stdout do
before do
Rake.application.rake_require 'active_record/railties/databases'
Rake.application.rake_require 'tasks/seed_fu'
+ Rake.application.rake_require 'tasks/dev'
Rake.application.rake_require 'tasks/gitlab/setup'
end
@@ -22,8 +23,6 @@ RSpec.describe 'gitlab:setup namespace rake tasks', :silence_stdout do
let(:server_service1) { double(:server_service) }
let(:server_service2) { double(:server_service) }
- let(:connections) { Gitlab::Database.database_base_models.values.map(&:connection) }
-
before do
allow(Gitlab).to receive_message_chain('config.repositories.storages').and_return(storages)
@@ -98,18 +97,6 @@ RSpec.describe 'gitlab:setup namespace rake tasks', :silence_stdout do
end
end
- context 'when the database is not found when terminating connections' do
- it 'continues setting up the database', :aggregate_failures do
- expect_gitaly_connections_to_be_checked
-
- expect(connections).to all(receive(:execute).and_raise(ActiveRecord::NoDatabaseError))
-
- expect_database_to_be_setup
-
- setup_task
- end
- end
-
def expect_gitaly_connections_to_be_checked
expect(Gitlab::GitalyClient::ServerService).to receive(:new).with('name1').and_return(server_service1)
expect(server_service1).to receive(:info)
@@ -119,13 +106,11 @@ RSpec.describe 'gitlab:setup namespace rake tasks', :silence_stdout do
end
def expect_connections_to_be_terminated
- expect(connections).to all(receive(:execute).with(/SELECT pg_terminate_backend/))
+ expect(Rake::Task['dev:terminate_all_connections']).to receive(:invoke)
end
def expect_connections_not_to_be_terminated
- connections.each do |connection|
- expect(connection).not_to receive(:execute)
- end
+ expect(Rake::Task['dev:terminate_all_connections']).not_to receive(:invoke)
end
def expect_database_to_be_setup
diff --git a/spec/tooling/danger/product_intelligence_spec.rb b/spec/tooling/danger/product_intelligence_spec.rb
index d0d4b8d4df4..ea08e3bc6db 100644
--- a/spec/tooling/danger/product_intelligence_spec.rb
+++ b/spec/tooling/danger/product_intelligence_spec.rb
@@ -20,70 +20,105 @@ RSpec.describe Tooling::Danger::ProductIntelligence do
allow(fake_helper).to receive(:changed_lines).and_return(changed_lines)
end
- describe '#missing_labels' do
- subject { product_intelligence.missing_labels }
+ describe '#check!' do
+ subject { product_intelligence.check! }
+ let(:markdown_formatted_list) { 'markdown formatted list' }
+ let(:review_pending_label) { 'product intelligence::review pending' }
+ let(:approved_label) { 'product intelligence::approved' }
let(:ci_env) { true }
+ let(:previous_label_to_add) { 'label_to_add' }
+ let(:labels_to_add) { [previous_label_to_add] }
+ let(:has_product_intelligence_label) { true }
before do
- allow(fake_helper).to receive(:mr_has_labels?).and_return(false)
+ allow(fake_helper).to receive(:changes_by_category).and_return(product_intelligence: changed_files, database: ['other_files.yml'])
allow(fake_helper).to receive(:ci?).and_return(ci_env)
+ allow(fake_helper).to receive(:mr_has_labels?).with('product intelligence').and_return(has_product_intelligence_label)
+ allow(fake_helper).to receive(:markdown_list).with(changed_files).and_return(markdown_formatted_list)
+ allow(fake_helper).to receive(:labels_to_add).and_return(labels_to_add)
end
- context 'with ci? false' do
- let(:ci_env) { false }
+ shared_examples "doesn't add new labels" do
+ it "doesn't add new labels" do
+ subject
- it { is_expected.to be_empty }
+ expect(labels_to_add).to match_array [previous_label_to_add]
+ end
end
- context 'with ci? true' do
- let(:expected_labels) { ['product intelligence', 'product intelligence::review pending'] }
+ shared_examples "doesn't add new warnings" do
+ it "doesn't add new warnings" do
+ expect(product_intelligence).not_to receive(:warn)
- it { is_expected.to match_array(expected_labels) }
+ subject
+ end
end
- context 'with product intelligence label' do
- let(:expected_labels) { ['product intelligence::review pending'] }
- let(:mr_labels) { [] }
+ shared_examples 'adds new labels' do
+ it 'adds new labels' do
+ subject
+
+ expect(labels_to_add).to match_array [previous_label_to_add, review_pending_label]
+ end
+ end
+ context 'with growth experiment label' do
before do
- allow(fake_helper).to receive(:mr_has_labels?).with('product intelligence').and_return(true)
- allow(fake_helper).to receive(:mr_labels).and_return(mr_labels)
+ allow(fake_helper).to receive(:mr_has_labels?).with('growth experiment').and_return(true)
end
- it { is_expected.to match_array(expected_labels) }
+ include_examples "doesn't add new labels"
+ include_examples "doesn't add new warnings"
+ end
+
+ context 'without growth experiment label' do
+ before do
+ allow(fake_helper).to receive(:mr_has_labels?).with('growth experiment').and_return(false)
+ end
- context 'with product intelligence::review pending' do
- let(:mr_labels) { ['product intelligence::review pending'] }
+ context 'with approved label' do
+ let(:mr_labels) { [approved_label] }
- it { is_expected.to be_empty }
+ include_examples "doesn't add new labels"
+ include_examples "doesn't add new warnings"
end
- context 'with product intelligence::approved' do
- let(:mr_labels) { ['product intelligence::approved'] }
+ context 'without approved label' do
+ include_examples 'adds new labels'
+
+ it 'warns with proper message' do
+ expect(product_intelligence).to receive(:warn).with(%r{#{markdown_formatted_list}})
- it { is_expected.to be_empty }
+ subject
+ end
end
- end
- end
- describe '#skip_review' do
- subject { product_intelligence.skip_review? }
+ context 'with product intelligence::review pending label' do
+ let(:mr_labels) { ['product intelligence::review pending'] }
- context 'with growth experiment label' do
- before do
- allow(fake_helper).to receive(:mr_has_labels?).with('growth experiment').and_return(true)
+ include_examples "doesn't add new labels"
end
- it { is_expected.to be true }
- end
+ context 'with product intelligence::approved label' do
+ let(:mr_labels) { ['product intelligence::approved'] }
- context 'without growth experiment label' do
- before do
- allow(fake_helper).to receive(:mr_has_labels?).with('growth experiment').and_return(false)
+ include_examples "doesn't add new labels"
end
- it { is_expected.to be false }
+ context 'with the product intelligence label' do
+ let(:has_product_intelligence_label) { true }
+
+ context 'with ci? false' do
+ let(:ci_env) { false }
+
+ include_examples "doesn't add new labels"
+ end
+
+ context 'with ci? true' do
+ include_examples 'adds new labels'
+ end
+ end
end
end
end
diff --git a/spec/tooling/danger/project_helper_spec.rb b/spec/tooling/danger/project_helper_spec.rb
index 902e01e2cbd..b3fb592c2e3 100644
--- a/spec/tooling/danger/project_helper_spec.rb
+++ b/spec/tooling/danger/project_helper_spec.rb
@@ -276,40 +276,6 @@ RSpec.describe Tooling::Danger::ProjectHelper do
end
end
- describe '.local_warning_message' do
- it 'returns an informational message with rules that can run' do
- expect(described_class.local_warning_message).to eq('==> Only the following Danger rules can be run locally: ci_config, database, documentation, duplicate_yarn_dependencies, eslint, gitaly, pajamas, pipeline, prettier, product_intelligence, utility_css, vue_shared_documentation, datateam')
- end
- end
-
- describe '.success_message' do
- it 'returns an informational success message' do
- expect(described_class.success_message).to eq('==> No Danger rule violations!')
- end
- end
-
- describe '#rule_names' do
- context 'when running locally' do
- before do
- expect(fake_helper).to receive(:ci?).and_return(false)
- end
-
- it 'returns local only rules' do
- expect(project_helper.rule_names).to match_array(described_class::LOCAL_RULES)
- end
- end
-
- context 'when running under CI' do
- before do
- expect(fake_helper).to receive(:ci?).and_return(true)
- end
-
- it 'returns all rules' do
- expect(project_helper.rule_names).to eq(described_class::LOCAL_RULES | described_class::CI_ONLY_RULES)
- end
- end
- end
-
describe '#file_lines' do
let(:filename) { 'spec/foo_spec.rb' }
let(:file_spy) { spy }
diff --git a/spec/uploaders/ci/secure_file_uploader_spec.rb b/spec/uploaders/ci/secure_file_uploader_spec.rb
index 3be4f742a24..4bac591704b 100644
--- a/spec/uploaders/ci/secure_file_uploader_spec.rb
+++ b/spec/uploaders/ci/secure_file_uploader_spec.rb
@@ -15,9 +15,9 @@ RSpec.describe Ci::SecureFileUploader do
describe '#key' do
it 'creates a digest with a secret key and the project id' do
- expect(OpenSSL::HMAC)
+ expect(Digest::SHA256)
.to receive(:digest)
- .with('SHA256', Gitlab::Application.secrets.db_key_base, ci_secure_file.project_id.to_s)
+ .with(ci_secure_file.key_data)
.and_return('digest')
expect(subject.key).to eq('digest')
diff --git a/spec/validators/addressable_url_validator_spec.rb b/spec/validators/addressable_url_validator_spec.rb
index 7e2cc2afa8a..b3a4459db30 100644
--- a/spec/validators/addressable_url_validator_spec.rb
+++ b/spec/validators/addressable_url_validator_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe AddressableUrlValidator do
it 'allows urls with encoded CR or LF characters' do
aggregate_failures do
- valid_urls_with_CRLF.each do |url|
+ valid_urls_with_crlf.each do |url|
validator.validate_each(badge, :link_url, url)
expect(badge.errors).to be_empty
@@ -40,7 +40,7 @@ RSpec.describe AddressableUrlValidator do
it 'does not allow urls with CR or LF characters' do
aggregate_failures do
- urls_with_CRLF.each do |url|
+ urls_with_crlf.each do |url|
badge = build(:badge, link_url: 'http://www.example.com')
validator.validate_each(badge, :link_url, url)
diff --git a/spec/views/admin/application_settings/_ci_cd.html.haml_spec.rb b/spec/views/admin/application_settings/_ci_cd.html.haml_spec.rb
new file mode 100644
index 00000000000..12593b88009
--- /dev/null
+++ b/spec/views/admin/application_settings/_ci_cd.html.haml_spec.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'admin/application_settings/_ci_cd' do
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:application_setting) { build(:application_setting) }
+
+ let_it_be(:limits_attributes) do
+ {
+ ci_pipeline_size: 10,
+ ci_active_jobs: 20,
+ ci_project_subscriptions: 30,
+ ci_pipeline_schedules: 40,
+ ci_needs_size_limit: 50,
+ ci_registered_group_runners: 60,
+ ci_registered_project_runners: 70
+ }
+ end
+
+ let_it_be(:default_plan_limits) { create(:plan_limits, :default_plan, **limits_attributes) }
+
+ let(:page) { Capybara::Node::Simple.new(rendered) }
+
+ before do
+ assign(:application_setting, application_setting)
+ allow(view).to receive(:current_user) { admin }
+ allow(view).to receive(:expanded) { true }
+ end
+
+ subject { render partial: 'admin/application_settings/ci_cd' }
+
+ context 'limits' do
+ before do
+ assign(:plans, [default_plan_limits.plan])
+ end
+
+ it 'has fields for CI/CD limits', :aggregate_failures do
+ subject
+
+ expect(rendered).to have_field('Maximum number of jobs in a single pipeline', type: 'number')
+ expect(page.find_field('Maximum number of jobs in a single pipeline').value).to eq('10')
+
+ expect(rendered).to have_field('Total number of jobs in currently active pipelines', type: 'number')
+ expect(page.find_field('Total number of jobs in currently active pipelines').value).to eq('20')
+
+ expect(rendered).to have_field('Maximum number of pipeline subscriptions to and from a project', type: 'number')
+ expect(page.find_field('Maximum number of pipeline subscriptions to and from a project').value).to eq('30')
+
+ expect(rendered).to have_field('Maximum number of pipeline schedules', type: 'number')
+ expect(page.find_field('Maximum number of pipeline schedules').value).to eq('40')
+
+ expect(rendered).to have_field('Maximum number of DAG dependencies that a job can have', type: 'number')
+ expect(page.find_field('Maximum number of DAG dependencies that a job can have').value).to eq('50')
+
+ expect(rendered).to have_field('Maximum number of runners registered per group', type: 'number')
+ expect(page.find_field('Maximum number of runners registered per group').value).to eq('60')
+
+ expect(rendered).to have_field('Maximum number of runners registered per project', type: 'number')
+ expect(page.find_field('Maximum number of runners registered per project').value).to eq('70')
+ end
+
+ it 'does not display the plan name when there is only one plan' do
+ subject
+
+ expect(page).not_to have_selector('a[data-action="plan0"]')
+ end
+ end
+
+ context 'with multiple plans' do
+ let_it_be(:plan) { create(:plan, name: 'Ultimate') }
+ let_it_be(:ultimate_plan_limits) { create(:plan_limits, plan: plan, **limits_attributes) }
+
+ before do
+ assign(:plans, [default_plan_limits.plan, ultimate_plan_limits.plan])
+ end
+
+ it 'displays the plan name when there is more than one plan' do
+ subject
+
+ expect(page).to have_content('Default')
+ expect(page).to have_content('Ultimate')
+ expect(page).to have_selector('a[data-action="plan0"]')
+ expect(page).to have_selector('a[data-action="plan1"]')
+ end
+ end
+end
diff --git a/spec/views/admin/application_settings/_repository_storage.html.haml_spec.rb b/spec/views/admin/application_settings/_repository_storage.html.haml_spec.rb
index dc8f259eb56..244157a3b14 100644
--- a/spec/views/admin/application_settings/_repository_storage.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/_repository_storage.html.haml_spec.rb
@@ -10,42 +10,32 @@ RSpec.describe 'admin/application_settings/_repository_storage.html.haml' do
assign(:application_setting, app_settings)
end
- context 'additional storage config' do
+ context 'with storage weights configured' do
let(:repository_storages_weighted) do
{
'default' => 100,
- 'mepmep' => 50
+ 'mepmep' => 50,
+ 'something_old' => 100
}
end
- it 'lists them all' do
+ it 'lists storages with weight', :aggregate_failures do
render
- Gitlab.config.repositories.storages.keys.each do |storage_name|
- expect(rendered).to have_content(storage_name)
- end
-
- expect(rendered).to have_content('foobar')
+ expect(rendered).to have_field('default', with: 100)
+ expect(rendered).to have_field('mepmep', with: 50)
end
- end
- context 'fewer storage configs' do
- let(:repository_storages_weighted) do
- {
- 'default' => 100,
- 'mepmep' => 50,
- 'something_old' => 100
- }
+ it 'lists storages without weight' do
+ render
+
+ expect(rendered).to have_field('foobar', with: 0)
end
it 'lists only configured storages' do
render
- Gitlab.config.repositories.storages.keys.each do |storage_name|
- expect(rendered).to have_content(storage_name)
- end
-
- expect(rendered).not_to have_content('something_old')
+ expect(rendered).not_to have_field('something_old')
end
end
end
diff --git a/spec/views/dashboard/milestones/index.html.haml_spec.rb b/spec/views/dashboard/milestones/index.html.haml_spec.rb
new file mode 100644
index 00000000000..738d31bfa3f
--- /dev/null
+++ b/spec/views/dashboard/milestones/index.html.haml_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'dashboard/milestones/index.html.haml' do
+ it_behaves_like 'milestone empty states'
+end
diff --git a/spec/views/groups/milestones/index.html.haml_spec.rb b/spec/views/groups/milestones/index.html.haml_spec.rb
new file mode 100644
index 00000000000..40f175ebdc3
--- /dev/null
+++ b/spec/views/groups/milestones/index.html.haml_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'groups/milestones/index.html.haml' do
+ it_behaves_like 'milestone empty states'
+end
diff --git a/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb b/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb
index 4b5027a5a56..5438fea85ee 100644
--- a/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb
+++ b/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb
@@ -4,27 +4,22 @@ require 'spec_helper'
RSpec.describe 'groups/runners/sort_dropdown.html.haml' do
describe 'render' do
- let_it_be(:sort_options_hash) { { by_title: 'Title' } }
- let_it_be(:sort_title_created_date) { 'Created date' }
-
- before do
- allow(view).to receive(:sort).and_return('by_title')
- end
-
describe 'when a sort option is not selected' do
it 'renders a default sort option' do
- render 'groups/runners/sort_dropdown', sort_options_hash: sort_options_hash, sort_title_created_date: sort_title_created_date
+ render 'groups/runners/sort_dropdown'
- expect(rendered).to have_content 'Created date'
+ expect(rendered).to have_content _('Created date')
end
end
describe 'when a sort option is selected' do
- it 'renders the selected sort option' do
- @sort = :by_title
- render 'groups/runners/sort_dropdown', sort_options_hash: sort_options_hash, sort_title_created_date: sort_title_created_date
+ before do
+ assign(:sort, 'contacted_asc')
+ render 'groups/runners/sort_dropdown'
+ end
- expect(rendered).to have_content 'Title'
+ it 'renders the selected sort option' do
+ expect(rendered).to have_content _('Last Contact')
end
end
end
diff --git a/spec/views/groups/show.html.haml_spec.rb b/spec/views/groups/show.html.haml_spec.rb
deleted file mode 100644
index 43e11d31611..00000000000
--- a/spec/views/groups/show.html.haml_spec.rb
+++ /dev/null
@@ -1,118 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'groups/edit.html.haml' do
- include Devise::Test::ControllerHelpers
-
- describe '"Share with group lock" setting' do
- let(:root_owner) { create(:user) }
- let(:root_group) { create(:group) }
-
- before do
- root_group.add_owner(root_owner)
- end
-
- shared_examples_for '"Share with group lock" setting' do |checkbox_options|
- it 'has the correct label, help text, and checkbox options' do
- assign(:group, test_group)
- allow(view).to receive(:can?).with(test_user, :admin_group, test_group).and_return(true)
- allow(view).to receive(:can_change_group_visibility_level?).and_return(false)
- allow(view).to receive(:current_user).and_return(test_user)
- expect(view).to receive(:can_change_share_with_group_lock?).and_return(!checkbox_options[:disabled])
- expect(view).to receive(:share_with_group_lock_help_text).and_return('help text here')
-
- render
-
- expect(rendered).to have_content("Prevent sharing a project within #{test_group.name} with other groups")
- expect(rendered).to have_content('help text here')
- expect(rendered).to have_field('group_share_with_group_lock', **checkbox_options)
- end
- end
-
- context 'for a root group' do
- let(:test_group) { root_group }
- let(:test_user) { root_owner }
-
- it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
- end
-
- context 'for a subgroup' do
- let!(:subgroup) { create(:group, parent: root_group) }
- let(:sub_owner) { create(:user) }
- let(:test_group) { subgroup }
-
- context 'when the root_group has "Share with group lock" disabled' do
- context 'when the subgroup has "Share with group lock" disabled' do
- context 'as the root_owner' do
- let(:test_user) { root_owner }
-
- it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
- end
-
- context 'as the sub_owner' do
- let(:test_user) { sub_owner }
-
- it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
- end
- end
-
- context 'when the subgroup has "Share with group lock" enabled' do
- before do
- subgroup.update_column(:share_with_group_lock, true)
- end
-
- context 'as the root_owner' do
- let(:test_user) { root_owner }
-
- it_behaves_like '"Share with group lock" setting', { disabled: false, checked: true }
- end
-
- context 'as the sub_owner' do
- let(:test_user) { sub_owner }
-
- it_behaves_like '"Share with group lock" setting', { disabled: false, checked: true }
- end
- end
- end
-
- context 'when the root_group has "Share with group lock" enabled' do
- before do
- root_group.update_column(:share_with_group_lock, true)
- end
-
- context 'when the subgroup has "Share with group lock" disabled (parent overridden)' do
- context 'as the root_owner' do
- let(:test_user) { root_owner }
-
- it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
- end
-
- context 'as the sub_owner' do
- let(:test_user) { sub_owner }
-
- it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
- end
- end
-
- context 'when the subgroup has "Share with group lock" enabled (same as parent)' do
- before do
- subgroup.update_column(:share_with_group_lock, true)
- end
-
- context 'as the root_owner' do
- let(:test_user) { root_owner }
-
- it_behaves_like '"Share with group lock" setting', { disabled: false, checked: true }
- end
-
- context 'as the sub_owner' do
- let(:test_user) { sub_owner }
-
- it_behaves_like '"Share with group lock" setting', { disabled: true, checked: true }
- end
- end
- end
- end
- end
-end
diff --git a/spec/views/profiles/keys/_form.html.haml_spec.rb b/spec/views/profiles/keys/_form.html.haml_spec.rb
index 624d7492aea..ba8394178d9 100644
--- a/spec/views/profiles/keys/_form.html.haml_spec.rb
+++ b/spec/views/profiles/keys/_form.html.haml_spec.rb
@@ -30,8 +30,8 @@ RSpec.describe 'profiles/keys/_form.html.haml' do
end
it 'has the title field', :aggregate_failures do
- expect(rendered).to have_field('Title', type: 'text', placeholder: 'e.g. My MacBook key')
- expect(rendered).to have_text('Give your individual key a title. This will be publicly visible.')
+ expect(rendered).to have_field('Title', type: 'text', placeholder: 'Example: MacBook key')
+ expect(rendered).to have_text('Key titles are publicly visible.')
end
it 'has the expires at field', :aggregate_failures do
diff --git a/spec/views/projects/commit/show.html.haml_spec.rb b/spec/views/projects/commit/show.html.haml_spec.rb
index e23ffe300c5..59182f6e757 100644
--- a/spec/views/projects/commit/show.html.haml_spec.rb
+++ b/spec/views/projects/commit/show.html.haml_spec.rb
@@ -25,6 +25,7 @@ RSpec.describe 'projects/commit/show.html.haml' do
allow(view).to receive(:can_collaborate_with_project?).and_return(false)
allow(view).to receive(:current_ref).and_return(project.repository.root_ref)
allow(view).to receive(:diff_btn).and_return('')
+ allow(view).to receive(:pagination_params).and_return({})
end
context 'inline diff view' do
diff --git a/spec/views/projects/milestones/index.html.haml_spec.rb b/spec/views/projects/milestones/index.html.haml_spec.rb
new file mode 100644
index 00000000000..f8117a71310
--- /dev/null
+++ b/spec/views/projects/milestones/index.html.haml_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'projects/milestones/index.html.haml' do
+ it_behaves_like 'milestone empty states'
+end
diff --git a/spec/views/projects/pipelines/show.html.haml_spec.rb b/spec/views/projects/pipelines/show.html.haml_spec.rb
index fcae587f8c8..7e300fb1e6e 100644
--- a/spec/views/projects/pipelines/show.html.haml_spec.rb
+++ b/spec/views/projects/pipelines/show.html.haml_spec.rb
@@ -13,6 +13,7 @@ RSpec.describe 'projects/pipelines/show' do
before do
assign(:project, project)
assign(:pipeline, presented_pipeline)
+ stub_feature_flags(pipeline_tabs_vue: false)
end
context 'when pipeline has errors' do
diff --git a/spec/views/shared/_global_alert.html.haml_spec.rb b/spec/views/shared/_global_alert.html.haml_spec.rb
deleted file mode 100644
index a400d5b39b0..00000000000
--- a/spec/views/shared/_global_alert.html.haml_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-require 'spec_helper'
-
-RSpec.describe 'shared/_global_alert.html.haml' do
- before do
- allow(view).to receive(:sprite_icon).and_return('<span class="icon"></span>'.html_safe)
- end
-
- it 'renders the title' do
- title = "The alert's title"
- render partial: 'shared/global_alert', locals: { title: title }
-
- expect(rendered).to have_text(title)
- end
-
- context 'variants' do
- it 'renders an info alert by default' do
- render
-
- expect(rendered).to have_selector(".gl-alert-info")
- end
-
- %w[warning success danger tip].each do |variant|
- it "renders a #{variant} variant" do
- allow(view).to receive(:variant).and_return(variant)
- render partial: 'shared/global_alert', locals: { variant: variant }
-
- expect(rendered).to have_selector(".gl-alert-#{variant}")
- end
- end
- end
-
- context 'dismissible option' do
- it 'shows the dismiss button by default' do
- render
-
- expect(rendered).to have_selector('.gl-dismiss-btn')
- end
-
- it 'does not show the dismiss button when dismissible is false' do
- render partial: 'shared/global_alert', locals: { dismissible: false }
-
- expect(rendered).not_to have_selector('.gl-dismiss-btn')
- end
- end
-end
diff --git a/spec/views/shared/_milestones_sort_dropdown.html.haml_spec.rb b/spec/views/shared/_milestones_sort_dropdown.html.haml_spec.rb
new file mode 100644
index 00000000000..2fc286d607a
--- /dev/null
+++ b/spec/views/shared/_milestones_sort_dropdown.html.haml_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'shared/_milestones_sort_dropdown.html.haml' do
+ describe 'render' do
+ describe 'when a sort option is not selected' do
+ it 'renders a default sort option' do
+ render 'shared/milestones_sort_dropdown'
+
+ expect(rendered).to have_content 'Due soon'
+ end
+ end
+
+ describe 'when a sort option is selected' do
+ before do
+ assign(:sort, 'due_date_desc')
+
+ render 'shared/milestones_sort_dropdown'
+ end
+
+ it 'renders the selected sort option' do
+ expect(rendered).to have_content 'Due later'
+ end
+ end
+ end
+end
diff --git a/spec/views/shared/groups/_dropdown.html.haml_spec.rb b/spec/views/shared/groups/_dropdown.html.haml_spec.rb
new file mode 100644
index 00000000000..71fa3a30711
--- /dev/null
+++ b/spec/views/shared/groups/_dropdown.html.haml_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'shared/groups/_dropdown.html.haml' do
+ describe 'render' do
+ describe 'when a sort option is not selected' do
+ it 'renders a default sort option' do
+ render 'shared/groups/dropdown'
+
+ expect(rendered).to have_content 'Last created'
+ end
+ end
+
+ describe 'when a sort option is selected' do
+ before do
+ assign(:sort, 'name_desc')
+
+ render 'shared/groups/dropdown'
+ end
+
+ it 'renders the selected sort option' do
+ expect(rendered).to have_content 'Name, descending'
+ end
+ end
+ end
+end
diff --git a/spec/views/shared/projects/_list.html.haml_spec.rb b/spec/views/shared/projects/_list.html.haml_spec.rb
index 037f988257b..5c38bb79ea1 100644
--- a/spec/views/shared/projects/_list.html.haml_spec.rb
+++ b/spec/views/shared/projects/_list.html.haml_spec.rb
@@ -20,6 +20,18 @@ RSpec.describe 'shared/projects/_list' do
expect(rendered).to have_content(project.name)
end
end
+
+ it "will not show elements a user shouldn't be able to see" do
+ allow(view).to receive(:can_show_last_commit_in_list?).and_return(false)
+ allow(view).to receive(:able_to_see_merge_requests?).and_return(false)
+ allow(view).to receive(:able_to_see_issues?).and_return(false)
+
+ render
+
+ expect(rendered).not_to have_css('a.commit-row-message')
+ expect(rendered).not_to have_css('a.issues')
+ expect(rendered).not_to have_css('a.merge-requests')
+ end
end
context 'without projects' do
diff --git a/spec/workers/bulk_import_worker_spec.rb b/spec/workers/bulk_import_worker_spec.rb
index 12e29573156..7e301efe708 100644
--- a/spec/workers/bulk_import_worker_spec.rb
+++ b/spec/workers/bulk_import_worker_spec.rb
@@ -56,17 +56,6 @@ RSpec.describe BulkImportWorker do
end
end
- context 'when maximum allowed number of import entities in progress' do
- it 'reenqueues itself' do
- bulk_import = create(:bulk_import, :started)
- (described_class::DEFAULT_BATCH_SIZE + 1).times { |_| create(:bulk_import_entity, :started, bulk_import: bulk_import) }
-
- expect(described_class).to receive(:perform_in).with(described_class::PERFORM_DELAY, bulk_import.id)
-
- subject.perform(bulk_import.id)
- end
- end
-
context 'when bulk import is created' do
it 'marks bulk import as started' do
bulk_import = create(:bulk_import, :created)
@@ -84,7 +73,7 @@ RSpec.describe BulkImportWorker do
expect { subject.perform(bulk_import.id) }
.to change(BulkImports::Tracker, :count)
- .by(BulkImports::Groups::Stage.new(bulk_import).pipelines.size * 2)
+ .by(BulkImports::Groups::Stage.new(entity_1).pipelines.size * 2)
expect(entity_1.trackers).not_to be_empty
expect(entity_2.trackers).not_to be_empty
@@ -93,21 +82,17 @@ RSpec.describe BulkImportWorker do
context 'when there are created entities to process' do
let_it_be(:bulk_import) { create(:bulk_import, :created) }
- before do
- stub_const("#{described_class}::DEFAULT_BATCH_SIZE", 1)
- end
-
- it 'marks a batch of entities as started, enqueues EntityWorker, ExportRequestWorker and reenqueues' do
+ it 'marks all entities as started, enqueues EntityWorker, ExportRequestWorker and reenqueues' do
create(:bulk_import_entity, :created, bulk_import: bulk_import)
create(:bulk_import_entity, :created, bulk_import: bulk_import)
expect(described_class).to receive(:perform_in).with(described_class::PERFORM_DELAY, bulk_import.id)
- expect(BulkImports::EntityWorker).to receive(:perform_async)
- expect(BulkImports::ExportRequestWorker).to receive(:perform_async)
+ expect(BulkImports::EntityWorker).to receive(:perform_async).twice
+ expect(BulkImports::ExportRequestWorker).to receive(:perform_async).twice
subject.perform(bulk_import.id)
- expect(bulk_import.entities.map(&:status_name)).to contain_exactly(:created, :started)
+ expect(bulk_import.entities.map(&:status_name)).to contain_exactly(:started, :started)
end
context 'when there are project entities to process' do
diff --git a/spec/workers/bulk_imports/entity_worker_spec.rb b/spec/workers/bulk_imports/entity_worker_spec.rb
index ce45299c7f7..ab85b587975 100644
--- a/spec/workers/bulk_imports/entity_worker_spec.rb
+++ b/spec/workers/bulk_imports/entity_worker_spec.rb
@@ -36,9 +36,11 @@ RSpec.describe BulkImports::EntityWorker do
expect(logger)
.to receive(:info).twice
.with(
- worker: described_class.name,
- entity_id: entity.id,
- current_stage: nil
+ hash_including(
+ 'entity_id' => entity.id,
+ 'current_stage' => nil,
+ 'message' => 'Stage starting'
+ )
)
end
@@ -58,24 +60,26 @@ RSpec.describe BulkImports::EntityWorker do
expect(BulkImports::PipelineWorker)
.to receive(:perform_async)
- .and_raise(exception)
+ .and_raise(exception)
expect_next_instance_of(Gitlab::Import::Logger) do |logger|
expect(logger)
.to receive(:info).twice
.with(
- worker: described_class.name,
- entity_id: entity.id,
- current_stage: nil
+ hash_including(
+ 'entity_id' => entity.id,
+ 'current_stage' => nil
+ )
)
expect(logger)
.to receive(:error)
.with(
- worker: described_class.name,
- entity_id: entity.id,
- current_stage: nil,
- error_message: 'Error!'
+ hash_including(
+ 'entity_id' => entity.id,
+ 'current_stage' => nil,
+ 'message' => 'Error!'
+ )
)
end
@@ -90,6 +94,18 @@ RSpec.describe BulkImports::EntityWorker do
let(:job_args) { [entity.id, 0] }
it 'do not enqueue a new pipeline job if the current stage still running' do
+ expect_next_instance_of(Gitlab::Import::Logger) do |logger|
+ expect(logger)
+ .to receive(:info).twice
+ .with(
+ hash_including(
+ 'entity_id' => entity.id,
+ 'current_stage' => 0,
+ 'message' => 'Stage running'
+ )
+ )
+ end
+
expect(BulkImports::PipelineWorker)
.not_to receive(:perform_async)
@@ -110,9 +126,10 @@ RSpec.describe BulkImports::EntityWorker do
expect(logger)
.to receive(:info).twice
.with(
- worker: described_class.name,
- entity_id: entity.id,
- current_stage: 0
+ hash_including(
+ 'entity_id' => entity.id,
+ 'current_stage' => 0
+ )
)
end
diff --git a/spec/workers/bulk_imports/export_request_worker_spec.rb b/spec/workers/bulk_imports/export_request_worker_spec.rb
index 4f452e3dd60..846df63a4d7 100644
--- a/spec/workers/bulk_imports/export_request_worker_spec.rb
+++ b/spec/workers/bulk_imports/export_request_worker_spec.rb
@@ -35,14 +35,16 @@ RSpec.describe BulkImports::ExportRequestWorker do
expect(client).to receive(:post).and_raise(BulkImports::NetworkError, 'Export error').twice
end
- expect(Gitlab::Import::Logger).to receive(:warn).with(
- bulk_import_entity_id: entity.id,
- pipeline_class: 'ExportRequestWorker',
- exception_class: 'BulkImports::NetworkError',
- exception_message: 'Export error',
- correlation_id_value: anything,
- bulk_import_id: bulk_import.id,
- bulk_import_entity_type: entity.source_type
+ expect(Gitlab::Import::Logger).to receive(:error).with(
+ hash_including(
+ 'bulk_import_entity_id' => entity.id,
+ 'pipeline_class' => 'ExportRequestWorker',
+ 'exception_class' => 'BulkImports::NetworkError',
+ 'exception_message' => 'Export error',
+ 'correlation_id_value' => anything,
+ 'bulk_import_id' => bulk_import.id,
+ 'bulk_import_entity_type' => entity.source_type
+ )
).twice
perform_multiple(job_args)
diff --git a/spec/workers/bulk_imports/pipeline_worker_spec.rb b/spec/workers/bulk_imports/pipeline_worker_spec.rb
index cb7e70a6749..3578fec5bc0 100644
--- a/spec/workers/bulk_imports/pipeline_worker_spec.rb
+++ b/spec/workers/bulk_imports/pipeline_worker_spec.rb
@@ -34,9 +34,10 @@ RSpec.describe BulkImports::PipelineWorker do
expect(logger)
.to receive(:info)
.with(
- worker: described_class.name,
- pipeline_name: 'FakePipeline',
- entity_id: entity.id
+ hash_including(
+ 'pipeline_name' => 'FakePipeline',
+ 'entity_id' => entity.id
+ )
)
end
@@ -44,7 +45,7 @@ RSpec.describe BulkImports::PipelineWorker do
.to receive(:perform_async)
.with(entity.id, pipeline_tracker.stage)
- expect(subject).to receive(:jid).and_return('jid')
+ allow(subject).to receive(:jid).and_return('jid')
subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
@@ -79,10 +80,11 @@ RSpec.describe BulkImports::PipelineWorker do
expect(logger)
.to receive(:error)
.with(
- worker: described_class.name,
- pipeline_tracker_id: pipeline_tracker.id,
- entity_id: entity.id,
- message: 'Unstarted pipeline not found'
+ hash_including(
+ 'pipeline_tracker_id' => pipeline_tracker.id,
+ 'entity_id' => entity.id,
+ 'message' => 'Unstarted pipeline not found'
+ )
)
end
@@ -107,10 +109,11 @@ RSpec.describe BulkImports::PipelineWorker do
expect(logger)
.to receive(:error)
.with(
- worker: described_class.name,
- pipeline_name: 'InexistentPipeline',
- entity_id: entity.id,
- message: "'InexistentPipeline' is not a valid BulkImport Pipeline"
+ hash_including(
+ 'pipeline_name' => 'InexistentPipeline',
+ 'entity_id' => entity.id,
+ 'message' => "'InexistentPipeline' is not a valid BulkImport Pipeline"
+ )
)
end
@@ -126,7 +129,7 @@ RSpec.describe BulkImports::PipelineWorker do
.to receive(:perform_async)
.with(entity.id, pipeline_tracker.stage)
- expect(subject).to receive(:jid).and_return('jid')
+ allow(subject).to receive(:jid).and_return('jid')
subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
@@ -151,10 +154,11 @@ RSpec.describe BulkImports::PipelineWorker do
expect(logger)
.to receive(:error)
.with(
- worker: described_class.name,
- pipeline_name: 'Pipeline',
- entity_id: entity.id,
- message: 'Failed entity status'
+ hash_including(
+ 'pipeline_name' => 'Pipeline',
+ 'entity_id' => entity.id,
+ 'message' => 'Failed entity status'
+ )
)
end
@@ -183,7 +187,7 @@ RSpec.describe BulkImports::PipelineWorker do
.and_raise(exception)
end
- expect(subject).to receive(:jid).and_return('jid').twice
+ allow(subject).to receive(:jid).and_return('jid')
expect_any_instance_of(BulkImports::Tracker) do |tracker|
expect(tracker).to receive(:retry).and_call_original
@@ -193,9 +197,10 @@ RSpec.describe BulkImports::PipelineWorker do
expect(logger)
.to receive(:info)
.with(
- worker: described_class.name,
- pipeline_name: 'FakePipeline',
- entity_id: entity.id
+ hash_including(
+ 'pipeline_name' => 'FakePipeline',
+ 'entity_id' => entity.id
+ )
)
end
@@ -292,10 +297,11 @@ RSpec.describe BulkImports::PipelineWorker do
expect(logger)
.to receive(:error)
.with(
- worker: described_class.name,
- pipeline_name: 'NdjsonPipeline',
- entity_id: entity.id,
- message: 'Pipeline timeout'
+ hash_including(
+ 'pipeline_name' => 'NdjsonPipeline',
+ 'entity_id' => entity.id,
+ 'message' => 'Pipeline timeout'
+ )
)
end
@@ -318,10 +324,11 @@ RSpec.describe BulkImports::PipelineWorker do
expect(logger)
.to receive(:error)
.with(
- worker: described_class.name,
- pipeline_name: 'NdjsonPipeline',
- entity_id: entity.id,
- message: 'Error!'
+ hash_including(
+ 'pipeline_name' => 'NdjsonPipeline',
+ 'entity_id' => entity.id,
+ 'message' => 'Error!'
+ )
)
end
diff --git a/spec/workers/bulk_imports/stuck_import_worker_spec.rb b/spec/workers/bulk_imports/stuck_import_worker_spec.rb
new file mode 100644
index 00000000000..7dfb6532c07
--- /dev/null
+++ b/spec/workers/bulk_imports/stuck_import_worker_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::StuckImportWorker do
+ let_it_be(:created_bulk_import) { create(:bulk_import, :created) }
+ let_it_be(:started_bulk_import) { create(:bulk_import, :started) }
+ let_it_be(:stale_created_bulk_import) { create(:bulk_import, :created, created_at: 3.days.ago) }
+ let_it_be(:stale_started_bulk_import) { create(:bulk_import, :started, created_at: 3.days.ago) }
+ let_it_be(:stale_created_bulk_import_entity) { create(:bulk_import_entity, :created, created_at: 3.days.ago) }
+ let_it_be(:stale_started_bulk_import_entity) { create(:bulk_import_entity, :started, created_at: 3.days.ago) }
+ let_it_be(:started_bulk_import_tracker) { create(:bulk_import_tracker, :started, entity: stale_started_bulk_import_entity) }
+
+ subject { described_class.new.perform }
+
+ describe 'perform' do
+ it 'updates the status of bulk imports to timeout' do
+ expect { subject }.to change { stale_created_bulk_import.reload.status_name }.from(:created).to(:timeout)
+ .and change { stale_started_bulk_import.reload.status_name }.from(:started).to(:timeout)
+ end
+
+ it 'updates the status of bulk import entities to timeout' do
+ expect { subject }.to change { stale_created_bulk_import_entity.reload.status_name }.from(:created).to(:timeout)
+ .and change { stale_started_bulk_import_entity.reload.status_name }.from(:started).to(:timeout)
+ end
+
+ it 'updates the status of stale entities trackers to timeout' do
+ expect { subject }.to change { started_bulk_import_tracker.reload.status_name }.from(:started).to(:timeout)
+ end
+
+ it 'does not update the status of non-stale records' do
+ expect { subject }.to not_change { created_bulk_import.reload.status }
+ .and not_change { started_bulk_import.reload.status }
+ end
+ end
+end
diff --git a/spec/workers/ci/update_locked_unknown_artifacts_worker_spec.rb b/spec/workers/ci/update_locked_unknown_artifacts_worker_spec.rb
new file mode 100644
index 00000000000..b42d135b1b6
--- /dev/null
+++ b/spec/workers/ci/update_locked_unknown_artifacts_worker_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::UpdateLockedUnknownArtifactsWorker do
+ let(:worker) { described_class.new }
+
+ describe '#perform' do
+ it 'executes an instance of Ci::JobArtifacts::UpdateUnknownLockedStatusService' do
+ expect_next_instance_of(Ci::JobArtifacts::UpdateUnknownLockedStatusService) do |instance|
+ expect(instance).to receive(:execute).and_call_original
+ end
+
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:removed_count, 0)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:locked_count, 0)
+
+ worker.perform
+ end
+
+ context 'with the ci_job_artifacts_backlog_work flag shut off' do
+ before do
+ stub_feature_flags(ci_job_artifacts_backlog_work: false)
+ end
+
+ it 'does not instantiate a new Ci::JobArtifacts::UpdateUnknownLockedStatusService' do
+ expect(Ci::JobArtifacts::UpdateUnknownLockedStatusService).not_to receive(:new)
+
+ worker.perform
+ end
+
+ it 'does not log any artifact counts' do
+ expect(worker).not_to receive(:log_extra_metadata_on_done)
+
+ worker.perform
+ end
+
+ it 'does not query the database' do
+ query_count = ActiveRecord::QueryRecorder.new { worker.perform }.count
+
+ expect(query_count).to eq(0)
+ end
+ end
+ end
+end
diff --git a/spec/workers/concerns/application_worker_spec.rb b/spec/workers/concerns/application_worker_spec.rb
index 95d9b982fc4..707fa0c9c78 100644
--- a/spec/workers/concerns/application_worker_spec.rb
+++ b/spec/workers/concerns/application_worker_spec.rb
@@ -49,7 +49,7 @@ RSpec.describe ApplicationWorker do
worker.feature_category :pages
expect(worker.sidekiq_options['queue']).to eq('queue_2')
- worker.feature_category_not_owned!
+ worker.feature_category :not_owned
expect(worker.sidekiq_options['queue']).to eq('queue_3')
worker.urgency :high
diff --git a/spec/workers/container_registry/migration/enqueuer_worker_spec.rb b/spec/workers/container_registry/migration/enqueuer_worker_spec.rb
index 12c14c35365..81fa28dc603 100644
--- a/spec/workers/container_registry/migration/enqueuer_worker_spec.rb
+++ b/spec/workers/container_registry/migration/enqueuer_worker_spec.rb
@@ -2,8 +2,13 @@
require 'spec_helper'
-RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures do
+RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures, :clean_gitlab_redis_shared_state do
+ using RSpec::Parameterized::TableSyntax
+ include ExclusiveLeaseHelpers
+
let_it_be_with_reload(:container_repository) { create(:container_repository, created_at: 2.days.ago) }
+ let_it_be(:importing_repository) { create(:container_repository, :importing) }
+ let_it_be(:pre_importing_repository) { create(:container_repository, :pre_importing) }
let(:worker) { described_class.new }
@@ -24,14 +29,14 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
end
end
- shared_examples 're-enqueuing based on capacity' do
+ shared_examples 're-enqueuing based on capacity' do |capacity_limit: 4|
context 'below capacity' do
before do
- allow(ContainerRegistry::Migration).to receive(:capacity).and_return(9999)
+ allow(ContainerRegistry::Migration).to receive(:capacity).and_return(capacity_limit)
end
it 're-enqueues the worker' do
- expect(ContainerRegistry::Migration::EnqueuerWorker).to receive(:perform_async)
+ expect(described_class).to receive(:perform_async)
subject
end
@@ -43,7 +48,7 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
end
it 'does not re-enqueue the worker' do
- expect(ContainerRegistry::Migration::EnqueuerWorker).not_to receive(:perform_async)
+ expect(described_class).not_to receive(:perform_async)
subject
end
@@ -51,24 +56,46 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
end
context 'with qualified repository' do
- it 'starts the pre-import for the next qualified repository' do
+ before do
method = worker.method(:next_repository)
allow(worker).to receive(:next_repository) do
next_qualified_repository = method.call
allow(next_qualified_repository).to receive(:migration_pre_import).and_return(:ok)
next_qualified_repository
end
+ end
- expect(worker).to receive(:log_extra_metadata_on_done)
- .with(:container_repository_id, container_repository.id)
- expect(worker).to receive(:log_extra_metadata_on_done)
- .with(:import_type, 'next')
+ it 'starts the pre-import for the next qualified repository' do
+ expect_log_extra_metadata(
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'pre_importing'
+ )
subject
expect(container_repository.reload).to be_pre_importing
end
+ context 'when the new pre-import maxes out the capacity' do
+ before do
+ # set capacity to 10
+ stub_feature_flags(
+ container_registry_migration_phase2_capacity_25: false
+ )
+
+ # Plus 2 created above gives 9 importing repositories
+ create_list(:container_repository, 7, :importing)
+ end
+
+ it 'does not re-enqueue the worker' do
+ expect(described_class).not_to receive(:perform_async)
+
+ subject
+ end
+ end
+
it_behaves_like 're-enqueuing based on capacity'
end
@@ -77,7 +104,11 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
allow(ContainerRegistry::Migration).to receive(:enabled?).and_return(false)
end
- it_behaves_like 'no action'
+ it_behaves_like 'no action' do
+ before do
+ expect_log_extra_metadata(migration_enabled: false)
+ end
+ end
end
context 'above capacity' do
@@ -87,7 +118,11 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
allow(ContainerRegistry::Migration).to receive(:capacity).and_return(1)
end
- it_behaves_like 'no action'
+ it_behaves_like 'no action' do
+ before do
+ expect_log_extra_metadata(below_capacity: false, max_capacity_setting: 1)
+ end
+ end
it 'does not re-enqueue the worker' do
expect(ContainerRegistry::Migration::EnqueuerWorker).not_to receive(:perform_async)
@@ -97,38 +132,91 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
end
context 'too soon before previous completed import step' do
- before do
- create(:container_repository, :import_done, migration_import_done_at: 1.minute.ago)
- allow(ContainerRegistry::Migration).to receive(:enqueue_waiting_time).and_return(1.hour)
+ where(:state, :timestamp) do
+ :import_done | :migration_import_done_at
+ :pre_import_done | :migration_pre_import_done_at
+ :import_aborted | :migration_aborted_at
+ :import_skipped | :migration_skipped_at
+ end
+
+ with_them do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:enqueue_waiting_time).and_return(45.minutes)
+ create(:container_repository, state, timestamp => 1.minute.ago)
+ end
+
+ it_behaves_like 'no action' do
+ before do
+ expect_log_extra_metadata(waiting_time_passed: false, current_waiting_time_setting: 45.minutes)
+ end
+ end
end
- it_behaves_like 'no action'
+ context 'when last completed repository has nil timestamps' do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:enqueue_waiting_time).and_return(45.minutes)
+ create(:container_repository, migration_state: 'import_done')
+ end
+
+ it 'continues to try the next import' do
+ expect { subject }.to change { container_repository.reload.migration_state }
+ end
+ end
end
context 'when an aborted import is available' do
let_it_be(:aborted_repository) { create(:container_repository, :import_aborted) }
- it 'retries the import for the aborted repository' do
- method = worker.method(:next_aborted_repository)
- allow(worker).to receive(:next_aborted_repository) do
- next_aborted_repository = method.call
- allow(next_aborted_repository).to receive(:migration_import).and_return(:ok)
- allow(next_aborted_repository.gitlab_api_client).to receive(:import_status).and_return('import_failed')
- next_aborted_repository
+ context 'with a successful registry request' do
+ before do
+ method = worker.method(:next_aborted_repository)
+ allow(worker).to receive(:next_aborted_repository) do
+ next_aborted_repository = method.call
+ allow(next_aborted_repository).to receive(:migration_import).and_return(:ok)
+ allow(next_aborted_repository.gitlab_api_client).to receive(:import_status).and_return('import_failed')
+ next_aborted_repository
+ end
end
- expect(worker).to receive(:log_extra_metadata_on_done)
- .with(:container_repository_id, aborted_repository.id)
- expect(worker).to receive(:log_extra_metadata_on_done)
- .with(:import_type, 'retry')
+ it 'retries the import for the aborted repository' do
+ expect_log_extra_metadata(
+ import_type: 'retry',
+ container_repository_id: aborted_repository.id,
+ container_repository_path: aborted_repository.path,
+ container_repository_migration_state: 'importing'
+ )
- subject
+ subject
- expect(aborted_repository.reload).to be_importing
- expect(container_repository.reload).to be_default
+ expect(aborted_repository.reload).to be_importing
+ expect(container_repository.reload).to be_default
+ end
+
+ it_behaves_like 're-enqueuing based on capacity'
end
- it_behaves_like 're-enqueuing based on capacity'
+ context 'when an error occurs' do
+ it 'does not abort that migration' do
+ method = worker.method(:next_aborted_repository)
+ allow(worker).to receive(:next_aborted_repository) do
+ next_aborted_repository = method.call
+ allow(next_aborted_repository).to receive(:retry_aborted_migration).and_raise(StandardError)
+ next_aborted_repository
+ end
+
+ expect_log_extra_metadata(
+ import_type: 'retry',
+ container_repository_id: aborted_repository.id,
+ container_repository_path: aborted_repository.path,
+ container_repository_migration_state: 'import_aborted'
+ )
+
+ subject
+
+ expect(aborted_repository.reload).to be_import_aborted
+ expect(container_repository.reload).to be_default
+ end
+ end
end
context 'when no repository qualifies' do
@@ -147,6 +235,15 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
end
it 'skips the repository' do
+ expect_log_extra_metadata(
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'import_skipped',
+ tags_count_too_high: true,
+ max_tags_count_setting: 2
+ )
+
subject
expect(container_repository.reload).to be_import_skipped
@@ -154,7 +251,7 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
expect(container_repository.migration_skipped_at).not_to be_nil
end
- it_behaves_like 're-enqueuing based on capacity'
+ it_behaves_like 're-enqueuing based on capacity', capacity_limit: 3
end
context 'when an error occurs' do
@@ -163,10 +260,16 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
end
it 'aborts the import' do
+ expect_log_extra_metadata(
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'import_aborted'
+ )
+
expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
instance_of(StandardError),
- next_repository_id: container_repository.id,
- next_aborted_repository_id: nil
+ next_repository_id: container_repository.id
)
subject
@@ -174,5 +277,26 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
expect(container_repository.reload).to be_import_aborted
end
end
+
+ context 'with the exclusive lease taken' do
+ let(:lease_key) { worker.send(:lease_key) }
+
+ before do
+ stub_exclusive_lease_taken(lease_key, timeout: 30.minutes)
+ end
+
+ it 'does not perform' do
+ expect(worker).not_to receive(:runnable?)
+ expect(worker).not_to receive(:re_enqueue_if_capacity)
+
+ subject
+ end
+ end
+
+ def expect_log_extra_metadata(metadata)
+ metadata.each do |key, value|
+ expect(worker).to receive(:log_extra_metadata_on_done).with(key, value)
+ end
+ end
end
end
diff --git a/spec/workers/container_registry/migration/guard_worker_spec.rb b/spec/workers/container_registry/migration/guard_worker_spec.rb
index 7d1df320d4e..299d1204af3 100644
--- a/spec/workers/container_registry/migration/guard_worker_spec.rb
+++ b/spec/workers/container_registry/migration/guard_worker_spec.rb
@@ -3,8 +3,6 @@
require 'spec_helper'
RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
- include_context 'container registry client'
-
let(:worker) { described_class.new }
describe '#perform' do
@@ -13,11 +11,12 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
let(:importing_migrations) { ::ContainerRepository.with_migration_states(:importing) }
let(:import_aborted_migrations) { ::ContainerRepository.with_migration_states(:import_aborted) }
let(:import_done_migrations) { ::ContainerRepository.with_migration_states(:import_done) }
+ let(:import_skipped_migrations) { ::ContainerRepository.with_migration_states(:import_skipped) }
subject { worker.perform }
before do
- stub_container_registry_config(enabled: true, api_url: registry_api_url, key: 'spec/fixtures/x509_certificate_pk.key')
+ stub_container_registry_config(enabled: true, api_url: 'http://container-registry', key: 'spec/fixtures/x509_certificate_pk.key')
allow(::ContainerRegistry::Migration).to receive(:max_step_duration).and_return(5.minutes)
end
@@ -26,20 +25,57 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
allow(::Gitlab).to receive(:com?).and_return(true)
end
- shared_examples 'not aborting any migration' do
- it 'will not abort the migration' do
- expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
- expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 0)
- expect(worker).to receive(:log_extra_metadata_on_done).with(:long_running_stale_migration_container_repository_ids, [stale_migration.id])
+ shared_examples 'handling long running migrations' do
+ before do
+ allow_next_found_instance_of(ContainerRepository) do |repository|
+ allow(repository).to receive(:migration_cancel).and_return(migration_cancel_response)
+ end
+ end
- expect { subject }
- .to not_change(pre_importing_migrations, :count)
- .and not_change(pre_import_done_migrations, :count)
- .and not_change(importing_migrations, :count)
- .and not_change(import_done_migrations, :count)
- .and not_change(import_aborted_migrations, :count)
- .and not_change { stale_migration.reload.migration_state }
- .and not_change { ongoing_migration.migration_state }
+ context 'migration is canceled' do
+ let(:migration_cancel_response) { { status: :ok } }
+
+ it 'will not abort the migration' do
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_ids, [stale_migration.id])
+
+ expect { subject }
+ .to change(import_skipped_migrations, :count)
+
+ expect(stale_migration.reload.migration_state).to eq('import_skipped')
+ expect(stale_migration.reload.migration_skipped_reason).to eq('migration_canceled')
+ end
+ end
+
+ context 'migration cancelation fails with an error' do
+ let(:migration_cancel_response) { { status: :error } }
+
+ it 'will abort the migration' do
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_ids, [stale_migration.id])
+
+ expect { subject }
+ .to change(import_aborted_migrations, :count).by(1)
+ .and change { stale_migration.reload.migration_state }.to('import_aborted')
+ .and not_change { ongoing_migration.migration_state }
+ end
+ end
+
+ context 'migration receives bad request with a new status' do
+ let(:migration_cancel_response) { { status: :bad_request, migration_state: :import_done } }
+
+ it 'will abort the migration' do
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_ids, [stale_migration.id])
+
+ expect { subject }
+ .to change(import_aborted_migrations, :count).by(1)
+ .and change { stale_migration.reload.migration_state }.to('import_aborted')
+ .and not_change { ongoing_migration.migration_state }
+ end
end
end
@@ -86,7 +122,7 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
context 'the client returns pre_import_in_progress' do
let(:import_status) { 'pre_import_in_progress' }
- it_behaves_like 'not aborting any migration'
+ it_behaves_like 'handling long running migrations'
end
end
@@ -141,7 +177,7 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
context 'the client returns import_in_progress' do
let(:import_status) { 'import_in_progress' }
- it_behaves_like 'not aborting any migration'
+ it_behaves_like 'handling long running migrations'
end
end
end
diff --git a/spec/workers/database/batched_background_migration/ci_database_worker_spec.rb b/spec/workers/database/batched_background_migration/ci_database_worker_spec.rb
index 2663c650986..f3cf5450048 100644
--- a/spec/workers/database/batched_background_migration/ci_database_worker_spec.rb
+++ b/spec/workers/database/batched_background_migration/ci_database_worker_spec.rb
@@ -3,5 +3,5 @@
require 'spec_helper'
RSpec.describe Database::BatchedBackgroundMigration::CiDatabaseWorker, :clean_gitlab_redis_shared_state do
- it_behaves_like 'it runs batched background migration jobs', 'ci'
+ it_behaves_like 'it runs batched background migration jobs', 'ci', feature_flag: :execute_batched_migrations_on_schedule_ci_database
end
diff --git a/spec/workers/database/batched_background_migration_worker_spec.rb b/spec/workers/database/batched_background_migration_worker_spec.rb
index a6c7db60abe..7f0883def3c 100644
--- a/spec/workers/database/batched_background_migration_worker_spec.rb
+++ b/spec/workers/database/batched_background_migration_worker_spec.rb
@@ -3,5 +3,5 @@
require 'spec_helper'
RSpec.describe Database::BatchedBackgroundMigrationWorker do
- it_behaves_like 'it runs batched background migration jobs', :main
+ it_behaves_like 'it runs batched background migration jobs', :main, feature_flag: :execute_batched_migrations_on_schedule
end
diff --git a/spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb b/spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb
new file mode 100644
index 00000000000..116026ea8f7
--- /dev/null
+++ b/spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Database::CiNamespaceMirrorsConsistencyCheckWorker do
+ let(:worker) { described_class.new }
+
+ describe '#perform' do
+ context 'feature flag is disabled' do
+ before do
+ stub_feature_flags(ci_namespace_mirrors_consistency_check: false)
+ end
+
+ it 'does not perform the consistency check on namespaces' do
+ expect(Database::ConsistencyCheckService).not_to receive(:new)
+ expect(worker).not_to receive(:log_extra_metadata_on_done)
+ worker.perform
+ end
+ end
+
+ context 'feature flag is enabled' do
+ before do
+ stub_feature_flags(ci_namespace_mirrors_consistency_check: true)
+ end
+
+ it 'executes the consistency check on namespaces' do
+ expect(Database::ConsistencyCheckService).to receive(:new).and_call_original
+ expected_result = { batches: 0, matches: 0, mismatches: 0, mismatches_details: [] }
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:results, expected_result)
+ worker.perform
+ end
+ end
+
+ context 'logs should contain the detailed mismatches' do
+ let(:first_namespace) { Namespace.all.order(:id).limit(1).first }
+ let(:missing_namespace) { Namespace.all.order(:id).limit(2).last }
+
+ before do
+ redis_shared_state_cleanup!
+ stub_feature_flags(ci_namespace_mirrors_consistency_check: true)
+ create_list(:namespace, 10) # This will also create Ci::NameSpaceMirror objects
+ missing_namespace.delete
+
+ allow_next_instance_of(Database::ConsistencyCheckService) do |instance|
+ allow(instance).to receive(:random_start_id).and_return(Namespace.first.id)
+ end
+ end
+
+ it 'reports the differences to the logs' do
+ expected_result = {
+ batches: 1,
+ matches: 9,
+ mismatches: 1,
+ mismatches_details: [{
+ id: missing_namespace.id,
+ source_table: nil,
+ target_table: [missing_namespace.traversal_ids]
+ }],
+ start_id: first_namespace.id,
+ next_start_id: first_namespace.id # The batch size > number of namespaces
+ }
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:results, expected_result)
+ worker.perform
+ end
+ end
+ end
+end
diff --git a/spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb b/spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb
new file mode 100644
index 00000000000..b6bd825ffcd
--- /dev/null
+++ b/spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Database::CiProjectMirrorsConsistencyCheckWorker do
+ let(:worker) { described_class.new }
+
+ describe '#perform' do
+ context 'feature flag is disabled' do
+ before do
+ stub_feature_flags(ci_project_mirrors_consistency_check: false)
+ end
+
+ it 'does not perform the consistency check on projects' do
+ expect(Database::ConsistencyCheckService).not_to receive(:new)
+ expect(worker).not_to receive(:log_extra_metadata_on_done)
+ worker.perform
+ end
+ end
+
+ context 'feature flag is enabled' do
+ before do
+ stub_feature_flags(ci_project_mirrors_consistency_check: true)
+ end
+
+ it 'executes the consistency check on projects' do
+ expect(Database::ConsistencyCheckService).to receive(:new).and_call_original
+ expected_result = { batches: 0, matches: 0, mismatches: 0, mismatches_details: [] }
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:results, expected_result)
+ worker.perform
+ end
+ end
+
+ context 'logs should contain the detailed mismatches' do
+ let(:first_project) { Project.all.order(:id).limit(1).first }
+ let(:missing_project) { Project.all.order(:id).limit(2).last }
+
+ before do
+ redis_shared_state_cleanup!
+ stub_feature_flags(ci_project_mirrors_consistency_check: true)
+ create_list(:project, 10) # This will also create Ci::NameSpaceMirror objects
+ missing_project.delete
+
+ allow_next_instance_of(Database::ConsistencyCheckService) do |instance|
+ allow(instance).to receive(:random_start_id).and_return(Project.first.id)
+ end
+ end
+
+ it 'reports the differences to the logs' do
+ expected_result = {
+ batches: 1,
+ matches: 9,
+ mismatches: 1,
+ mismatches_details: [{
+ id: missing_project.id,
+ source_table: nil,
+ target_table: [missing_project.namespace_id]
+ }],
+ start_id: first_project.id,
+ next_start_id: first_project.id # The batch size > number of projects
+ }
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:results, expected_result)
+ worker.perform
+ end
+ end
+ end
+end
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index 47205943f70..0351b500747 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -54,7 +54,7 @@ RSpec.describe 'Every Sidekiq worker' do
# All Sidekiq worker classes should declare a valid `feature_category`
# or explicitly be excluded with the `feature_category_not_owned!` annotation.
# Please see doc/development/sidekiq_style_guide.md#feature-categorization for more details.
- it 'has a feature_category or feature_category_not_owned! attribute', :aggregate_failures do
+ it 'has a feature_category attribute', :aggregate_failures do
workers_without_defaults.each do |worker|
expect(worker.get_feature_category).to be_a(Symbol), "expected #{worker.inspect} to declare a feature_category or feature_category_not_owned!"
end
diff --git a/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb b/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb
index 34073d0ea39..af15f465107 100644
--- a/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::GithubImport::ImportDiffNoteWorker do
describe '#import' do
it 'imports a diff note' do
- project = double(:project, full_path: 'foo/bar', id: 1)
+ project = double(:project, full_path: 'foo/bar', id: 1, import_state: nil)
client = double(:client)
importer = double(:importer)
hash = {
diff --git a/spec/workers/gitlab/github_import/import_issue_worker_spec.rb b/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
index dc0338eccad..29f21c1d184 100644
--- a/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::GithubImport::ImportIssueWorker do
describe '#import' do
it 'imports an issue' do
- project = double(:project, full_path: 'foo/bar', id: 1)
+ project = double(:project, full_path: 'foo/bar', id: 1, import_state: nil)
client = double(:client)
importer = double(:importer)
hash = {
diff --git a/spec/workers/gitlab/github_import/import_note_worker_spec.rb b/spec/workers/gitlab/github_import/import_note_worker_spec.rb
index bc254e6246d..f4598340938 100644
--- a/spec/workers/gitlab/github_import/import_note_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_note_worker_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::GithubImport::ImportNoteWorker do
describe '#import' do
it 'imports a note' do
- project = double(:project, full_path: 'foo/bar', id: 1)
+ project = double(:project, full_path: 'foo/bar', id: 1, import_state: nil)
client = double(:client)
importer = double(:importer)
hash = {
diff --git a/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb b/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb
index 6fe9741075f..faed2f8f340 100644
--- a/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::GithubImport::ImportPullRequestWorker do
describe '#import' do
it 'imports a pull request' do
- project = double(:project, full_path: 'foo/bar', id: 1)
+ project = double(:project, full_path: 'foo/bar', id: 1, import_state: nil)
client = double(:client)
importer = double(:importer)
hash = {
diff --git a/spec/workers/merge_requests/update_head_pipeline_worker_spec.rb b/spec/workers/merge_requests/update_head_pipeline_worker_spec.rb
index f3ea14ad539..5e0b07067df 100644
--- a/spec/workers/merge_requests/update_head_pipeline_worker_spec.rb
+++ b/spec/workers/merge_requests/update_head_pipeline_worker_spec.rb
@@ -11,11 +11,9 @@ RSpec.describe MergeRequests::UpdateHeadPipelineWorker do
let(:pipeline) { create(:ci_pipeline, project: project, ref: ref) }
let(:event) { Ci::PipelineCreatedEvent.new(data: { pipeline_id: pipeline.id }) }
- subject { consume_event(event) }
+ subject { consume_event(subscriber: described_class, event: event) }
- def consume_event(event)
- described_class.new.perform(event.class.name, event.data)
- end
+ it_behaves_like 'subscribes to event'
context 'when merge requests already exist for this source branch', :sidekiq_inline do
let(:merge_request_1) do
diff --git a/spec/workers/namespaces/invite_team_email_worker_spec.rb b/spec/workers/namespaces/invite_team_email_worker_spec.rb
deleted file mode 100644
index 47fdff9a8ef..00000000000
--- a/spec/workers/namespaces/invite_team_email_worker_spec.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Namespaces::InviteTeamEmailWorker do
- let_it_be(:user) { create(:user) }
- let_it_be(:group) { create(:group) }
-
- it 'sends the email' do
- expect(Namespaces::InviteTeamEmailService).to receive(:send_email).with(user, group).once
- subject.perform(group.id, user.id)
- end
-
- context 'when user id is non-existent' do
- it 'does not send the email' do
- expect(Namespaces::InviteTeamEmailService).not_to receive(:send_email)
- subject.perform(group.id, non_existing_record_id)
- end
- end
-
- context 'when group id is non-existent' do
- it 'does not send the email' do
- expect(Namespaces::InviteTeamEmailService).not_to receive(:send_email)
- subject.perform(non_existing_record_id, user.id)
- end
- end
-end
diff --git a/spec/workers/namespaces/root_statistics_worker_spec.rb b/spec/workers/namespaces/root_statistics_worker_spec.rb
index a97a850bbcf..7b774da0bdc 100644
--- a/spec/workers/namespaces/root_statistics_worker_spec.rb
+++ b/spec/workers/namespaces/root_statistics_worker_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Namespaces::RootStatisticsWorker, '#perform' do
context 'with a namespace' do
it 'executes refresher service' do
expect_any_instance_of(Namespaces::StatisticsRefresherService)
- .to receive(:execute)
+ .to receive(:execute).and_call_original
worker.perform(group.id)
end
diff --git a/spec/workers/namespaces/update_root_statistics_worker_spec.rb b/spec/workers/namespaces/update_root_statistics_worker_spec.rb
index a525904b757..f2f633a39ca 100644
--- a/spec/workers/namespaces/update_root_statistics_worker_spec.rb
+++ b/spec/workers/namespaces/update_root_statistics_worker_spec.rb
@@ -9,11 +9,9 @@ RSpec.describe Namespaces::UpdateRootStatisticsWorker do
Projects::ProjectDeletedEvent.new(data: { project_id: 1, namespace_id: namespace_id })
end
- subject { consume_event(event) }
+ subject { consume_event(subscriber: described_class, event: event) }
- def consume_event(event)
- described_class.new.perform(event.class.name, event.data)
- end
+ it_behaves_like 'subscribes to event'
it 'enqueues ScheduleAggregationWorker' do
expect(Namespaces::ScheduleAggregationWorker).to receive(:perform_async).with(namespace_id)
diff --git a/spec/workers/packages/cleanup_package_file_worker_spec.rb b/spec/workers/packages/cleanup_package_file_worker_spec.rb
index 33f89826312..380e8916d13 100644
--- a/spec/workers/packages/cleanup_package_file_worker_spec.rb
+++ b/spec/workers/packages/cleanup_package_file_worker_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Packages::CleanupPackageFileWorker do
- let_it_be(:package) { create(:package) }
+ let_it_be_with_reload(:package) { create(:package) }
let(:worker) { described_class.new }
@@ -23,24 +23,60 @@ RSpec.describe Packages::CleanupPackageFileWorker do
expect(worker).to receive(:log_extra_metadata_on_done).twice
expect { subject }.to change { Packages::PackageFile.count }.by(-1)
- .and not_change { Packages::Package.count }
+ .and not_change { Packages::Package.count }
+ expect { package_file2.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ context 'with a duplicated PyPI package file' do
+ let_it_be_with_reload(:duplicated_package_file) { create(:package_file, package: package) }
+
+ before do
+ package.update!(package_type: :pypi, version: '1.2.3')
+ duplicated_package_file.update_column(:file_name, package_file2.file_name)
+ end
+
+ it 'deletes one of the duplicates' do
+ expect { subject }.to change { Packages::PackageFile.count }.by(-1)
+ .and not_change { Packages::Package.count }
+ expect { package_file2.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
end
end
- context 'with an error during the destroy' do
+ context 'with a package file to destroy' do
let_it_be(:package_file) { create(:package_file, :pending_destruction) }
- before do
- expect(worker).to receive(:log_metadata).and_raise('Error!')
+ context 'with an error during the destroy' do
+ before do
+ allow(worker).to receive(:log_metadata).and_raise('Error!')
+ end
+
+ it 'handles the error' do
+ expect { subject }.to change { Packages::PackageFile.error.count }.from(0).to(1)
+ expect(package_file.reload).to be_error
+ end
end
- it 'handles the error' do
- expect { subject }.to change { Packages::PackageFile.error.count }.from(0).to(1)
- expect(package_file.reload).to be_error
+ context 'when trying to destroy a destroyed record' do
+ before do
+ allow_next_found_instance_of(Packages::PackageFile) do |package_file|
+ destroy_method = package_file.method(:destroy!)
+
+ allow(package_file).to receive(:destroy!) do
+ destroy_method.call
+
+ raise 'Error!'
+ end
+ end
+ end
+
+ it 'handles the error' do
+ expect { subject }.to change { Packages::PackageFile.count }.by(-1)
+ end
end
end
- context 'removing the last package file' do
+ describe 'removing the last package file' do
let_it_be(:package_file) { create(:package_file, :pending_destruction, package: package) }
it 'deletes the package file and the package' do
@@ -65,12 +101,12 @@ RSpec.describe Packages::CleanupPackageFileWorker do
end
describe '#remaining_work_count' do
- before(:context) do
- create_list(:package_file, 3, :pending_destruction, package: package)
+ before_all do
+ create_list(:package_file, 2, :pending_destruction, package: package)
end
subject { worker.remaining_work_count }
- it { is_expected.to eq(3) }
+ it { is_expected.to eq(2) }
end
end
diff --git a/spec/workers/project_export_worker_spec.rb b/spec/workers/project_export_worker_spec.rb
index 9923d8bde7f..dd0a921059d 100644
--- a/spec/workers/project_export_worker_spec.rb
+++ b/spec/workers/project_export_worker_spec.rb
@@ -4,4 +4,30 @@ require 'spec_helper'
RSpec.describe ProjectExportWorker do
it_behaves_like 'export worker'
+
+ context 'exporters duration measuring' do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+ let(:worker) { described_class.new }
+
+ subject { worker.perform(user.id, project.id) }
+
+ before do
+ project.add_owner(user)
+ end
+
+ it 'logs exporters execution duration' do
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:version_saver_duration_s, anything)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:avatar_saver_duration_s, anything)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:tree_saver_duration_s, anything)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:uploads_saver_duration_s, anything)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:repo_saver_duration_s, anything)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:wiki_repo_saver_duration_s, anything)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:lfs_saver_duration_s, anything)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:snippets_repo_saver_duration_s, anything)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:design_repo_saver_duration_s, anything)
+
+ subject
+ end
+ end
end
diff --git a/spec/workers/projects/post_creation_worker_spec.rb b/spec/workers/projects/post_creation_worker_spec.rb
index 06acf601666..3158ac9fa27 100644
--- a/spec/workers/projects/post_creation_worker_spec.rb
+++ b/spec/workers/projects/post_creation_worker_spec.rb
@@ -63,7 +63,7 @@ RSpec.describe Projects::PostCreationWorker do
end
it 'cleans invalid record and logs warning', :aggregate_failures do
- invalid_integration_record = build(:prometheus_integration, properties: { api_url: nil, manual_configuration: true }.to_json)
+ invalid_integration_record = build(:prometheus_integration, properties: { api_url: nil, manual_configuration: true })
allow(::Integrations::Prometheus).to receive(:new).and_return(invalid_integration_record)
expect(Gitlab::ErrorTracking).to receive(:track_exception).with(an_instance_of(ActiveRecord::RecordInvalid), include(extra: { project_id: a_kind_of(Integer) })).twice
diff --git a/spec/workers/projects/record_target_platforms_worker_spec.rb b/spec/workers/projects/record_target_platforms_worker_spec.rb
new file mode 100644
index 00000000000..eb53e3f8608
--- /dev/null
+++ b/spec/workers/projects/record_target_platforms_worker_spec.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::RecordTargetPlatformsWorker do
+ include ExclusiveLeaseHelpers
+
+ let_it_be(:swift) { create(:programming_language, name: 'Swift') }
+ let_it_be(:objective_c) { create(:programming_language, name: 'Objective-C') }
+ let_it_be(:project) { create(:project, :repository, detected_repository_languages: true) }
+
+ let(:worker) { described_class.new }
+ let(:service_result) { %w(ios osx watchos) }
+ let(:service_double) { instance_double(Projects::RecordTargetPlatformsService, execute: service_result) }
+ let(:lease_key) { "#{described_class.name.underscore}:#{project.id}" }
+ let(:lease_timeout) { described_class::LEASE_TIMEOUT }
+
+ subject(:perform) { worker.perform(project.id) }
+
+ before do
+ stub_exclusive_lease(lease_key, timeout: lease_timeout)
+ end
+
+ shared_examples 'performs detection' do
+ it 'creates and executes a Projects::RecordTargetPlatformService instance for the project', :aggregate_failures do
+ expect(Projects::RecordTargetPlatformsService).to receive(:new).with(project) { service_double }
+ expect(service_double).to receive(:execute)
+
+ perform
+ end
+
+ it 'logs extra metadata on done', :aggregate_failures do
+ expect(Projects::RecordTargetPlatformsService).to receive(:new).with(project) { service_double }
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:target_platforms, service_result)
+
+ perform
+ end
+ end
+
+ shared_examples 'does nothing' do
+ it 'does nothing' do
+ expect(Projects::RecordTargetPlatformsService).not_to receive(:new)
+
+ perform
+ end
+ end
+
+ context 'when project uses Swift programming language' do
+ let!(:repository_language) { create(:repository_language, project: project, programming_language: swift) }
+
+ include_examples 'performs detection'
+ end
+
+ context 'when project uses Objective-C programming language' do
+ let!(:repository_language) { create(:repository_language, project: project, programming_language: objective_c) }
+
+ include_examples 'performs detection'
+ end
+
+ context 'when the project does not contain programming languages for Apple platforms' do
+ it_behaves_like 'does nothing'
+ end
+
+ context 'when project is not found' do
+ it 'does nothing' do
+ expect(Projects::RecordTargetPlatformsService).not_to receive(:new)
+
+ worker.perform(non_existing_record_id)
+ end
+ end
+
+ context 'when exclusive lease cannot be obtained' do
+ before do
+ stub_exclusive_lease_taken(lease_key)
+ end
+
+ it_behaves_like 'does nothing'
+ end
+
+ it 'has the `until_executed` deduplicate strategy' do
+ expect(described_class.get_deduplicate_strategy).to eq(:until_executed)
+ end
+
+ it 'overrides #lease_release? to return false' do
+ expect(worker.send(:lease_release?)).to eq false
+ end
+end
diff --git a/spec/workers/quality/test_data_cleanup_worker_spec.rb b/spec/workers/quality/test_data_cleanup_worker_spec.rb
deleted file mode 100644
index a17e6e0cb1a..00000000000
--- a/spec/workers/quality/test_data_cleanup_worker_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Quality::TestDataCleanupWorker do
- subject { described_class.new }
-
- shared_examples 'successful deletion' do
- before do
- allow(Gitlab).to receive(:staging?).and_return(true)
- end
-
- it 'removes test groups' do
- expect { subject.perform }.to change(Group, :count).by(-test_group_count)
- end
- end
-
- describe "#perform" do
- context 'with multiple test groups to remove' do
- let(:test_group_count) { 5 }
- let!(:groups_to_remove) { create_list(:group, test_group_count, :test_group) }
- let!(:group_to_keep) { create(:group, path: 'test-group-fulfillment-keep', created_at: 1.day.ago) }
- let!(:non_test_group) { create(:group) }
- let(:non_test_owner_group) { create(:group, path: 'test-group-fulfillment1234', created_at: 4.days.ago) }
-
- before do
- non_test_owner_group.add_owner(create(:user))
- end
-
- it_behaves_like 'successful deletion'
- end
-
- context 'with paid groups' do
- let(:test_group_count) { 1 }
- let!(:paid_group) { create(:group, :test_group) }
-
- before do
- allow(paid_group).to receive(:paid?).and_return(true)
- end
-
- it_behaves_like 'successful deletion'
- end
- end
-end
diff --git a/tooling/bin/find_app_sec_approval b/tooling/bin/find_app_sec_approval
new file mode 100755
index 00000000000..ea85617eb43
--- /dev/null
+++ b/tooling/bin/find_app_sec_approval
@@ -0,0 +1,33 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require 'gitlab'
+
+# This script is used to confirm that AppSec has approved upstream JiHu contributions
+#
+# It will error if the approval is missing from the MR when it is run.
+
+gitlab_token = ENV.fetch('PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE')
+gitlab_endpoint = ENV.fetch('CI_API_V4_URL')
+mr_project_path = ENV['CI_MERGE_REQUEST_PROJECT_PATH']
+mr_iid = ENV['CI_MERGE_REQUEST_IID']
+approval_label = "sec-planning::complete"
+
+warn "WARNING: CI_MERGE_REQUEST_PROJECT_PATH is missing." if mr_project_path.to_s.empty?
+warn "WARNING: CI_MERGE_REQUEST_IID is missing." if mr_iid.to_s.empty?
+
+unless mr_project_path && mr_iid
+ warn "ERROR: Exiting as this does not appear to be a merge request pipeline."
+ exit
+end
+
+Gitlab.configure do |config|
+ config.endpoint = gitlab_endpoint
+ config.private_token = gitlab_token
+end
+
+if Gitlab.merge_request(mr_project_path, mr_iid).labels.include?(approval_label)
+ puts 'INFO: No action required.'
+else
+ abort('ERROR: This merge request has not been approved by application security and is required prior to merge.')
+end
diff --git a/tooling/danger/product_intelligence.rb b/tooling/danger/product_intelligence.rb
index 6185b2f0d08..0f007e970b4 100644
--- a/tooling/danger/product_intelligence.rb
+++ b/tooling/danger/product_intelligence.rb
@@ -6,12 +6,35 @@ module Tooling
module ProductIntelligence
APPROVED_LABEL = 'product intelligence::approved'
REVIEW_LABEL = 'product intelligence::review pending'
+ 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" [Service Ping guide](https://docs.gitlab.com/ee/development/service_ping/) or the [Snowplow guide](https://docs.gitlab.com/ee/development/snowplow/).
+
+ For MR review guidelines, see the [Service Ping review guidelines](https://docs.gitlab.com/ee/development/service_ping/review_guidelines.html) or the [Snowplow review guidelines](https://docs.gitlab.com/ee/development/snowplow/review_guidelines.html).
+
+ %<changed_files>s
+
+ MSG
WORKFLOW_LABELS = [
APPROVED_LABEL,
REVIEW_LABEL
].freeze
+ def check!
+ # exit if not matching files or if no product intelligence labels
+ product_intelligence_paths_to_review = helper.changes_by_category[:product_intelligence]
+ labels_to_add = missing_labels
+
+ return if product_intelligence_paths_to_review.empty? || skip_review?
+
+ warn format(CHANGED_FILES_MESSAGE, changed_files: helper.markdown_list(product_intelligence_paths_to_review)) unless has_approved_label?
+
+ helper.labels_to_add.concat(labels_to_add) unless labels_to_add.empty?
+ end
+
+ private
+
def missing_labels
return [] unless helper.ci?
@@ -30,8 +53,6 @@ module Tooling
helper.mr_has_labels?('growth experiment')
end
- private
-
def has_workflow_labels?
(WORKFLOW_LABELS & helper.mr_labels).any?
end
diff --git a/tooling/danger/project_helper.rb b/tooling/danger/project_helper.rb
index 02002e1d1b2..fc87498f5d0 100644
--- a/tooling/danger/project_helper.rb
+++ b/tooling/danger/project_helper.rb
@@ -3,22 +3,6 @@
module Tooling
module Danger
module ProjectHelper
- LOCAL_RULES ||= %w[
- ci_config
- database
- documentation
- duplicate_yarn_dependencies
- eslint
- gitaly
- pajamas
- pipeline
- prettier
- product_intelligence
- utility_css
- vue_shared_documentation
- datateam
- ].freeze
-
CI_ONLY_RULES ||= %w[
ce_ee_vue_templates
ci_templates
@@ -31,8 +15,6 @@ module Tooling
z_metadata
].freeze
- MESSAGE_PREFIX = '==>'
-
# First-match win, so be sure to put more specific regex at the top...
CATEGORIES = {
[%r{usage_data\.rb}, %r{^(\+|-).*\s+(count|distinct_count|estimate_batch_distinct_count)\(.*\)(.*)$}] => [:database, :backend, :product_intelligence],
@@ -181,20 +163,6 @@ module Tooling
%r{\.js\z} => :frontend
}.freeze
- def local_warning_message
- "#{MESSAGE_PREFIX} Only the following Danger rules can be run locally: #{LOCAL_RULES.join(', ')}"
- end
- module_function :local_warning_message # rubocop:disable Style/AccessModifierDeclarations
-
- def success_message
- "#{MESSAGE_PREFIX} No Danger rule violations!"
- end
- module_function :success_message # rubocop:disable Style/AccessModifierDeclarations
-
- def rule_names
- helper.ci? ? LOCAL_RULES | CI_ONLY_RULES : LOCAL_RULES
- end
-
def file_lines(filename)
read_file(filename).lines(chomp: true)
end
diff --git a/vendor/project_templates/middleman.tar.gz b/vendor/project_templates/middleman.tar.gz
new file mode 100644
index 00000000000..41496d448b1
--- /dev/null
+++ b/vendor/project_templates/middleman.tar.gz
Binary files differ
diff --git a/vendor/project_templates/sse_middleman.tar.gz b/vendor/project_templates/sse_middleman.tar.gz
deleted file mode 100644
index 30d38fbb43d..00000000000
--- a/vendor/project_templates/sse_middleman.tar.gz
+++ /dev/null
Binary files differ
diff --git a/workhorse/README.md b/workhorse/README.md
index c7617645b34..c57f90b4a49 100644
--- a/workhorse/README.md
+++ b/workhorse/README.md
@@ -1,35 +1,14 @@
-# GitLab Workhorse
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
-GitLab Workhorse is a smart reverse proxy for GitLab. It handles
-"large" HTTP requests such as file downloads, file uploads, Git
-push/pull and Git archive downloads.
+# Workhorse documentation
-Workhorse itself is not a feature, but there are [several features in
-GitLab](doc/architecture/gitlab_features.md) that would not work efficiently without Workhorse.
-
-## Canonical source
-
-The canonical source for Workhorse is
-[gitlab-org/gitlab/workhorse](https://gitlab.com/gitlab-org/gitlab/tree/master/workhorse).
-Prior to https://gitlab.com/groups/gitlab-org/-/epics/4826, it was
-[gitlab-org/gitlab-workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse/tree/master),
-but that repository is no longer used for development.
-
-## Documentation
-
-Workhorse documentation is available in the [`doc` folder of this repository](doc/).
-
-* Architectural overview
- * [GitLab features that rely on Workhorse](doc/architecture/gitlab_features.md)
- * [Websocket channel support](doc/architecture/channel.md)
-* Operating Workhorse
- * [Source installation](doc/operations/install.md)
- * [Workhorse configuration](doc/operations/configuration.md)
-* [Contributing](CONTRIBUTING.md)
- * [Adding new features](doc/development/new_features.md)
- * [Testing your code](doc/development/tests.md)
-
-## License
-
-This code is distributed under the MIT license, see the [LICENSE](LICENSE) file.
+This document was moved to [another location](../doc/development/workhorse/index.md).
+<!-- This redirect file can be deleted after <2022-07-01>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/workhorse/doc/architecture/channel.md b/workhorse/doc/architecture/channel.md
index f7a72d0fd45..04bb0e7652f 100644
--- a/workhorse/doc/architecture/channel.md
+++ b/workhorse/doc/architecture/channel.md
@@ -1,194 +1,16 @@
-# Websocket channel support
-
-In some cases, GitLab can provide in-browser terminal access to an
-environment (which is a running server or container, onto which a
-project has been deployed), or even access to services running in CI
-through a WebSocket. Workhorse manages the WebSocket upgrade and
-long-lived connection to the websocket connection, which frees
-up GitLab to process other requests.
-
-This document outlines the architecture of these connections.
-
-## Introduction to WebSockets
-
-A websocket is an "upgraded" HTTP/1.1 request. Their purpose is to
-permit bidirectional communication between a client and a server.
-**Websockets are not HTTP**. Clients can send messages (known as
-frames) to the server at any time, and vice-versa. Client messages
-are not necessarily requests, and server messages are not necessarily
-responses. WebSocket URLs have schemes like `ws://` (unencrypted) or
-`wss://` (TLS-secured).
-
-When requesting an upgrade to WebSocket, the browser sends a HTTP/1.1
-request that looks like this:
-
-```
-GET /path.ws HTTP/1.1
-Connection: upgrade
-Upgrade: websocket
-Sec-WebSocket-Protocol: terminal.gitlab.com
-# More headers, including security measures
-```
-
-At this point, the connection is still HTTP, so this is a request and
-the server can send a normal HTTP response, including `404 Not Found`,
-`500 Internal Server Error`, etc.
-
-If the server decides to permit the upgrade, it will send a HTTP
-`101 Switching Protocols` response. From this point, the connection
-is no longer HTTP. It is a WebSocket and frames, not HTTP requests,
-will flow over it. The connection will persist until the client or
-server closes the connection.
-
-In addition to the subprotocol, individual websocket frames may
-also specify a message type - examples include `BinaryMessage`,
-`TextMessage`, `Ping`, `Pong` or `Close`. Only binary frames can
-contain arbitrary data - other frames are expected to be valid
-UTF-8 strings, in addition to any subprotocol expectations.
-
-## Browser to Workhorse
-
-Using the terminal as an example, GitLab serves a JavaScript terminal
-emulator to the browser on a URL like
-`https://gitlab.com/group/project/-/environments/1/terminal`.
-This opens a websocket connection to, e.g.,
-`wss://gitlab.com/group/project/-/environments/1/terminal.ws`,
-This endpoint doesn't exist in GitLab - only in Workhorse.
-
-When receiving the connection, Workhorse first checks that the
-client is authorized to access the requested terminal. It does
-this by performing a "preauthentication" request to GitLab.
-
-If the client has the appropriate permissions and the terminal
-exists, GitLab responds with a successful response that includes
-details of the terminal that the client should be connected to.
-Otherwise, it returns an appropriate HTTP error response.
-
-Errors are passed back to the client as HTTP responses, but if
-GitLab returns valid terminal details to Workhorse, it will
-connect to the specified terminal, upgrade the browser to a
-WebSocket, and proxy between the two connections for as long
-as the browser's credentials are valid. Workhorse will also
-send regular `PingMessage` control frames to the browser, to
-keep intervening proxies from terminating the connection
-while the browser is present.
-
-The browser must request an upgrade with a specific subprotocol:
-
-### `terminal.gitlab.com`
-
-This subprotocol considers `TextMessage` frames to be invalid.
-Control frames, such as `PingMessage` or `CloseMessage`, have
-their usual meanings.
-
-`BinaryMessage` frames sent from the browser to the server are
-arbitrary text input.
-
-`BinaryMessage` frames sent from the server to the browser are
-arbitrary text output.
-
-These frames are expected to contain ANSI text control codes
-and may be in any encoding.
-
-### `base64.terminal.gitlab.com`
+---
+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
+redirect_to: '../../../doc/development/backend/create_source_code_be/workhorse/channel.md'
+remove_date: '2022-07-01'
+---
-This subprotocol considers `BinaryMessage` frames to be invalid.
-Control frames, such as `PingMessage` or `CloseMessage`, have
-their usual meanings.
-
-`TextMessage` frames sent from the browser to the server are
-base64-encoded arbitrary text input (so the server must
-base64-decode them before inputting them).
-
-`TextMessage` frames sent from the server to the browser are
-base64-encoded arbitrary text output (so the browser must
-base64-decode them before outputting them).
-
-In their base64-encoded form, these frames are expected to
-contain ANSI terminal control codes, and may be in any encoding.
-
-## Workhorse to GitLab
-
-Using again the terminal as an example, before upgrading the browser,
-Workhorse sends a normal HTTP request to GitLab on a URL like
-`https://gitlab.com/group/project/environments/1/terminal.ws/authorize`.
-This returns a JSON response containing details of where the
-terminal can be found, and how to connect it. In particular,
-the following details are returned in case of success:
-
-* WebSocket URL to **connect** to, e.g.: `wss://example.com/terminals/1.ws?tty=1`
-* WebSocket subprotocols to support, e.g.: `["channel.k8s.io"]`
-* Headers to send, e.g.: `Authorization: Token xxyyz..`
-* Certificate authority to verify `wss` connections with (optional)
-
-Workhorse periodically re-checks this endpoint, and if it gets an
-error response, or the details of the terminal change, it will
-terminate the websocket session.
-
-## Workhorse to the WebSocket server
-
-In GitLab, environments or CI jobs may have a deployment service (e.g.,
-`KubernetesService`) associated with them. This service knows
-where the terminals or the service for an environment may be found, and these
-details are returned to Workhorse by GitLab.
-
-These URLs are *also* WebSocket URLs, and GitLab tells Workhorse
-which subprotocols to speak over the connection, along with any
-authentication details required by the remote end.
-
-Before upgrading the browser's connection to a websocket,
-Workhorse opens a HTTP client connection, according to the
-details given to it by Workhorse, and attempts to upgrade
-that connection to a websocket. If it fails, an error
-response is sent to the browser; otherwise, the browser is
-also upgraded.
-
-Workhorse now has two websocket connections, albeit with
-differing subprotocols. It decodes incoming frames from the
-browser, re-encodes them to the channel's subprotocol, and
-sends them to the channel. Similarly, it decodes incoming
-frames from the channel, re-encodes them to the browser's
-subprotocol, and sends them to the browser.
-
-When either connection closes or enters an error state,
-Workhorse detects the error and closes the other connection,
-terminating the channel session. If the browser is the
-connection that has disconnected, Workhorse will send an ANSI
-`End of Transmission` control code (the `0x04` byte) to the
-channel, encoded according to the appropriate subprotocol.
-Workhorse will automatically reply to any websocket ping frame
-sent by the channel, to avoid being disconnected.
-
-Currently, Workhorse only supports the following subprotocols.
-Supporting new deployment services will require new subprotocols
-to be supported:
-
-### `channel.k8s.io`
-
-Used by Kubernetes, this subprotocol defines a simple multiplexed
-channel.
-
-Control frames have their usual meanings. `TextMessage` frames are
-invalid. `BinaryMessage` frames represent I/O to a specific file
-descriptor.
-
-The first byte of each `BinaryMessage` frame represents the file
-descriptor (fd) number, as a `uint8` (so the value `0x00` corresponds
-to fd 0, `STDIN`, while `0x01` corresponds to fd 1, `STDOUT`).
-
-The remaining bytes represent arbitrary data. For frames received
-from the server, they are bytes that have been received from that
-fd. For frames sent to the server, they are bytes that should be
-written to that fd.
-
-### `base64.channel.k8s.io`
-
-Also used by Kubernetes, this subprotocol defines a similar multiplexed
-channel to `channel.k8s.io`. The main differences are:
+# Websocket channel support
-* `TextMessage` frames are valid, rather than `BinaryMessage` frames.
-* The first byte of each `TextMessage` frame represents the file
- descriptor as a numeric UTF-8 character, so the character `U+0030`,
- or "0", is fd 0, STDIN).
-* The remaining bytes represent base64-encoded arbitrary data.
+This document was moved to [another location](../../../doc/development/workhorse/channel.md).
+<!-- This redirect file can be deleted after <2022-07-01>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/workhorse/doc/architecture/gitlab_features.md b/workhorse/doc/architecture/gitlab_features.md
index 2d3ca78f5e8..42dd919690d 100644
--- a/workhorse/doc/architecture/gitlab_features.md
+++ b/workhorse/doc/architecture/gitlab_features.md
@@ -1,69 +1,14 @@
-# Features that rely on Workhorse
-
-Workhorse itself is not a feature, but there are several features in
-GitLab that would not work efficiently without Workhorse.
-
-To put the efficiency benefit in context, consider that in 2020Q3 on
-GitLab.com [we see][thanos] Rails application threads using on average
-about 200MB of RSS vs about 200KB for Workhorse goroutines.
-
-Examples of features that rely on Workhorse:
-
-## 1. `git clone` and `git push` over HTTP
-
-Git clone, pull and push are slow because they transfer large amounts
-of data and because each is CPU intensive on the GitLab side. Without
-Workhorse, HTTP access to Git repositories would compete with regular
-web access to the application, requiring us to run way more Rails
-application servers.
-
-## 2. CI runner long polling
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
-GitLab CI runners fetch new CI jobs by polling the GitLab server.
-Workhorse acts as a kind of "waiting room" where CI runners can sit
-and wait for new CI jobs. Because of Go's efficiency we can fit a lot
-of runners in the waiting room at little cost. Without this waiting
-room mechanism we would have to add a lot more Rails server capacity.
-
-## 3. File uploads and downloads
-
-File uploads and downloads may be slow either because the file is
-large or because the user's connection is slow. Workhorse can handle
-the slow part for Rails. This improves the efficiency of features such
-as CI artifacts, package repositories, LFS objects, etc.
-
-## 4. Websocket proxying
-
-Features such as the web terminal require a long lived connection
-between the user's web browser and a container inside GitLab that is
-not directly accessible from the internet. Dedicating a Rails
-application thread to proxying such a connection would cost much more
-memory than it costs to have Workhorse look after it.
-
-## Quick facts (how does Workhorse work)
-
-- Workhorse can handle some requests without involving Rails at all:
- for example, JavaScript files and CSS files are served straight
- from disk.
-- Workhorse can modify responses sent by Rails: for example if you use
- `send_file` in Rails then GitLab Workhorse will open the file on
- disk and send its contents as the response body to the client.
-- Workhorse can take over requests after asking permission from Rails.
- Example: handling `git clone`.
-- Workhorse can modify requests before passing them to Rails. Example:
- when handling a Git LFS upload Workhorse first asks permission from
- Rails, then it stores the request body in a tempfile, then it sends
- a modified request containing the tempfile path to Rails.
-- Workhorse can manage long-lived WebSocket connections for Rails.
- Example: handling the terminal websocket for environments.
-- Workhorse does not connect to PostgreSQL, only to Rails and (optionally) Redis.
-- We assume that all requests that reach Workhorse pass through an
- upstream proxy such as NGINX or Apache first.
-- Workhorse does not accept HTTPS connections.
-- Workhorse does not clean up idle client connections.
-- We assume that all requests to Rails pass through Workhorse.
+# Features that rely on Workhorse
-For more information see ['A brief history of GitLab Workhorse'][brief-history-blog].
+This document was moved to [another location](../../../doc/development/workhorse/gitlab_features.md).
-[thanos]: https://thanos-query.ops.gitlab.net/graph?g0.range_input=1h&g0.max_source_resolution=0s&g0.expr=sum(ruby_process_resident_memory_bytes%7Bapp%3D%22webservice%22%2Cenv%3D%22gprd%22%2Crelease%3D%22gitlab%22%7D)%20%2F%20sum(puma_max_threads%7Bapp%3D%22webservice%22%2Cenv%3D%22gprd%22%2Crelease%3D%22gitlab%22%7D)&g0.tab=1&g1.range_input=1h&g1.max_source_resolution=0s&g1.expr=sum(go_memstats_sys_bytes%7Bapp%3D%22webservice%22%2Cenv%3D%22gprd%22%2Crelease%3D%22gitlab%22%7D)%2Fsum(go_goroutines%7Bapp%3D%22webservice%22%2Cenv%3D%22gprd%22%2Crelease%3D%22gitlab%22%7D)&g1.tab=1
-[brief-history-blog]: https://about.gitlab.com/2016/04/12/a-brief-history-of-gitlab-workhorse/
+<!-- This redirect file can be deleted after <2022-07-01>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/workhorse/doc/channel.md b/workhorse/doc/channel.md
index 68553170775..86078321dff 100644
--- a/workhorse/doc/channel.md
+++ b/workhorse/doc/channel.md
@@ -1 +1,14 @@
-This file was moved to [`architecture/channel.md`](doc/architecture/channel.md).
+---
+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
+---
+
+# Websocket channel support
+
+This document was moved to [another location](../../doc/development/workhorse/channel.md).
+
+<!-- This redirect file can be deleted after <2022-07-01>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/workhorse/doc/development/new_features.md b/workhorse/doc/development/new_features.md
index e8bbd345a40..60f0ad75539 100644
--- a/workhorse/doc/development/new_features.md
+++ b/workhorse/doc/development/new_features.md
@@ -1,41 +1,14 @@
-## Adding new features to Workhorse
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
-GitLab Workhorse is a smart reverse proxy for GitLab. It handles
-"long" HTTP requests such as file downloads, file uploads, Git
-push/pull and Git archive downloads.
+# Adding new features to Workhorse
-Workhorse itself is not a feature, but there are [several features in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/workhorse/doc/architecture/gitlab_features.md) that would not work efficiently without Workhorse.
-
-At a first glance, it may look like Workhorse is just a pipeline for processing HTTP streams so that you can reduce the amount of logic in your Ruby on Rails controller, but there are good reasons to avoid treating it like that.
-
-Engineers embarking on the quest of offloading a feature to Workhorse often find that the endeavor is much higher than what originally anticipated. In part because of the new programming language (only a few engineers at GitLab are Go developers), in part because of the demanding requirements for Workhorse. Workhorse is stateless, memory and disk usage must be kept under tight control, and the request should not be slowed down in the process.
-
-## Can I add a new feature to Workhorse?
-
-We suggest to follow this route only if absolutely necessary and no other options are available.
-
-Splitting a feature between the Rails code-base and Workhorse is deliberately choosing to introduce technical debt. It adds complexity to the system and coupling between the two components.
-
-* Building features using Workhorse has a considerable complexity cost, so you should prefer designs based on Rails requests and Sidekiq jobs.
-* Even when using Rails+Sidekiq is "more work" than using Rails+Workhorse, Rails+Sidekiq is easier to maintain in the long term because Workhorse is unique to GitLab while Rails+Sidekiq is an industry standard.
-* For "global" behaviors around web requests consider using a Rack middleware instead of Workhorse.
-* Generally speaking, we should only use Rails+Workhorse if the HTTP client expects behavior that is not reasonable to implement in Rails, like "long" requests.
-
-## What is a "long" request?
-
-There is one order of magnitude between Workhorse and puma RAM usage. Having connection open for a period longer than milliseconds is a problem because of the amount of RAM it monopolizes once it reaches the Ruby on Rails controller.
-
-So far we identified two classes of "long" requests: data transfers and HTTP long polling.
-
-`git push`, `git pull`, uploading or downloading an artifact, the CI runner waiting for a new job are all good examples of long requests.
-
-With the rise of cloud-native installations, Workhorse's feature-set was extended to add object storage direct-upload, to get rid of the shared Network File System (NFS) drives.
-
-In 2020 @nolith presented at FOSDEM a talk titled [_Speed up the monolith. Building a smart reverse proxy in Go_](https://archive.fosdem.org/2020/schedule/event/speedupmonolith/).
-You can watch the recording for more details on the history of Workhorse and the NFS removal.
-
-[Uploads development documentation]( https://docs.gitlab.com/ee/development/uploads.html)
-contains the most common use-cases for adding a new type of upload and may answer all of your questions.
-
-If you still think we should add a new feature to Workhorse, please open an issue explaining **what you want to implement** and **why it can't be implemented in our ruby code-base**. Workhorse maintainers will be happy to help you assessing the situation.
+This document was moved to [another location](../../../doc/development/workhorse/new_features.md).
+<!-- This redirect file can be deleted after <2022-07-01>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/workhorse/doc/development/tests.md b/workhorse/doc/development/tests.md
index 82f74e8656b..a5eb7571cc0 100644
--- a/workhorse/doc/development/tests.md
+++ b/workhorse/doc/development/tests.md
@@ -1,17 +1,14 @@
-# Testing your code
-
-Run the tests with:
+---
+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
+---
-```
-make clean test
-```
-
-## Coverage / what to test
+# Testing your code
-Each feature in GitLab Workhorse should have an integration test that
-verifies that the feature 'kicks in' on the right requests and leaves
-other requests unaffected. It is better to also have package-level tests
-for specific behavior but the high-level integration tests should have
-the first priority during development.
+This document was moved to [another location](../../../doc/development/workhorse/index.md).
-It is OK if a feature is only covered by integration tests.
+<!-- This redirect file can be deleted after <2022-07-01>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/workhorse/doc/operations/configuration.md b/workhorse/doc/operations/configuration.md
index 8694cf1bd82..62dc8369dfb 100644
--- a/workhorse/doc/operations/configuration.md
+++ b/workhorse/doc/operations/configuration.md
@@ -1,213 +1,14 @@
-# Workhorse configuration
-
-For historical reasons Workhorse uses both command line flags, a configuration file and environment variables.
-
-All new configuration options that get added to Workhorse should go into the configuration file.
-
-## CLI options
-
-```
- gitlab-workhorse [OPTIONS]
-
-Options:
- -apiCiLongPollingDuration duration
- Long polling duration for job requesting for runners (default 50ns)
- -apiLimit uint
- Number of API requests allowed at single time
- -apiQueueDuration duration
- Maximum queueing duration of requests (default 30s)
- -apiQueueLimit uint
- Number of API requests allowed to be queued
- -authBackend string
- Authentication/authorization backend (default "http://localhost:8080")
- -authSocket string
- Optional: Unix domain socket to dial authBackend at
- -cableBackend string
- Optional: ActionCable backend (default authBackend)
- -cableSocket string
- Optional: Unix domain socket to dial cableBackend at (default authSocket)
- -config string
- TOML file to load config from
- -developmentMode
- Allow the assets to be served from Rails app
- -documentRoot string
- Path to static files content (default "public")
- -listenAddr string
- Listen address for HTTP server (default "localhost:8181")
- -listenNetwork string
- Listen 'network' (tcp, tcp4, tcp6, unix) (default "tcp")
- -listenUmask int
- Umask for Unix socket
- -logFile string
- Log file location
- -logFormat string
- Log format to use defaults to text (text, json, structured, none) (default "text")
- -pprofListenAddr string
- pprof listening address, e.g. 'localhost:6060'
- -prometheusListenAddr string
- Prometheus listening address, e.g. 'localhost:9229'
- -proxyHeadersTimeout duration
- How long to wait for response headers when proxying the request (default 5m0s)
- -secretPath string
- File with secret key to authenticate with authBackend (default "./.gitlab_workhorse_secret")
- -version
- Print version and exit
-```
-
-The 'auth backend' refers to the GitLab Rails application. The name is
-a holdover from when GitLab Workhorse only handled Git push/pull over
-HTTP.
-
-GitLab Workhorse can listen on either a TCP or a Unix domain socket. It
-can also open a second listening TCP listening socket with the Go
-[net/http/pprof profiler server](http://golang.org/pkg/net/http/pprof/).
-
-GitLab Workhorse can listen on redis events (currently only builds/register
-for runners). This requires you to pass a valid TOML config file via
-`-config` flag.
-For regular setups it only requires the following (replacing the string
-with the actual socket)
-
-## Redis
-
-GitLab Workhorse integrates with Redis to do long polling for CI build
-requests. This is configured via two things:
-
-- Redis settings in the TOML config file
-- The `-apiCiLongPollingDuration` command line flag to control polling
- behavior for CI build requests
-
-It is OK to enable Redis in the config file but to leave CI polling
-disabled; this just results in an idle Redis pubsub connection. The
-opposite is not possible: CI long polling requires a correct Redis
-configuration.
-
-Below we discuss the options for the `[redis]` section in the config
-file.
-
-```
-[redis]
-URL = "unix:///var/run/gitlab/redis.sock"
-Password = "my_awesome_password"
-Sentinel = [ "tcp://sentinel1:23456", "tcp://sentinel2:23456" ]
-SentinelMaster = "mymaster"
-```
-
-- `URL` takes a string in the format `unix://path/to/redis.sock` or
-`tcp://host:port`.
-- `Password` is only required if your redis instance is password-protected
-- `Sentinel` is used if you are using Sentinel.
- *NOTE* that if both `Sentinel` and `URL` are given, only `Sentinel` will be used
-
-Optional fields are as follows:
-```
-[redis]
-DB = 0
-MaxIdle = 1
-MaxActive = 1
-```
-
-- `DB` is the Database to connect to. Defaults to `0`
-- `MaxIdle` is how many idle connections can be in the redis-pool at once. Defaults to 1
-- `MaxActive` is how many connections the pool can keep. Defaults to 1
-
-## Relative URL support
-
-If you are mounting GitLab at a relative URL, e.g.
-`example.com/gitlab`, then you should also use this relative URL in
-the `authBackend` setting:
-
-```
-gitlab-workhorse -authBackend http://localhost:8080/gitlab
-```
-
-## Interaction of authBackend and authSocket
-
-The interaction between `authBackend` and `authSocket` can be a bit
-confusing. It comes down to: if `authSocket` is set it overrides the
-_host_ part of `authBackend` but not the relative path.
-
-In table form:
+---
+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
+---
-|authBackend|authSocket|Workhorse connects to?|Rails relative URL|
-|---|---|---|---|
-|unset|unset|`localhost:8080`|`/`|
-|`http://localhost:3000`|unset|`localhost:3000`|`/`|
-|`http://localhost:3000/gitlab`|unset|`localhost:3000`|`/gitlab`|
-|unset|`/path/to/socket`|`/path/to/socket`|`/`|
-|`http://localhost:3000`|`/path/to/socket`|`/path/to/socket`|`/`|
-|`http://localhost:3000/gitlab`|`/path/to/socket`|`/path/to/socket`|`/gitlab`|
-
-The same applies to `cableBackend` and `cableSocket`.
-
-## Error tracking
-
-GitLab-Workhorse supports remote error tracking with
-[Sentry](https://sentry.io). To enable this feature set the
-`GITLAB_WORKHORSE_SENTRY_DSN` environment variable.
-You can also set the `GITLAB_WORKHORSE_SENTRY_ENVIRONMENT` environment variable to
-use the Sentry environment functionality to separate staging, production and
-development.
-
-Omnibus (`/etc/gitlab/gitlab.rb`):
-
-```
-gitlab_workhorse['env'] = {
- 'GITLAB_WORKHORSE_SENTRY_DSN' => 'https://foobar'
- 'GITLAB_WORKHORSE_SENTRY_ENVIRONMENT' => 'production'
-}
-```
-
-Source installations (`/etc/default/gitlab`):
-
-```
-export GITLAB_WORKHORSE_SENTRY_DSN='https://foobar'
-export GITLAB_WORKHORSE_SENTRY_ENVIRONMENT='production'
-```
-
-## Distributed Tracing
-
-Workhorse supports distributed tracing through [LabKit][] using [OpenTracing APIs](https://opentracing.io).
-
-By default, no tracing implementation is linked into the binary, but different OpenTracing providers can be linked in using [build tags][build-tags]/[build constraints][build-tags]. This can be done by setting the `BUILD_TAGS` make variable.
-
-For more details of the supported providers, see LabKit, but as an example, for Jaeger tracing support, include the tags: `BUILD_TAGS="tracer_static tracer_static_jaeger"`.
-
-```shell
-make BUILD_TAGS="tracer_static tracer_static_jaeger"
-```
-
-Once Workhorse is compiled with an opentracing provider, the tracing configuration is configured via the `GITLAB_TRACING` environment variable.
-
-For example:
-
-```shell
-GITLAB_TRACING=opentracing://jaeger ./gitlab-workhorse
-```
-
-## Continuous Profiling
-
-Workhorse supports continuous profiling through [LabKit][] using [Stackdriver Profiler](https://cloud.google.com/profiler).
-
-By default, the Stackdriver Profiler implementation is linked in the binary using [build tags][build-tags], though it's not
-required and can be skipped.
-
-For example:
-
-```shell
-make BUILD_TAGS=""
-```
-
-Once Workhorse is compiled with Continuous Profiling, the profiler configuration can be set via `GITLAB_CONTINUOUS_PROFILING`
-environment variable.
-
-For example:
-
-```shell
-GITLAB_CONTINUOUS_PROFILING="stackdriver?service=workhorse&service_version=1.0.1&project_id=test-123 ./gitlab-workhorse"
-```
+# Workhorse configuration
-More information about see the [LabKit monitoring docs](https://gitlab.com/gitlab-org/labkit/-/blob/master/monitoring/doc.go).
+This document was moved to [another location](../../../doc/development/workhorse/configuration.md).
-[LabKit]: https://gitlab.com/gitlab-org/labkit/
-[build-tags]: https://golang.org/pkg/go/build/#hdr-Build_Constraints
+<!-- This redirect file can be deleted after <2022-07-01>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/workhorse/doc/operations/install.md b/workhorse/doc/operations/install.md
index 3bee13e2683..9f0a8212783 100644
--- a/workhorse/doc/operations/install.md
+++ b/workhorse/doc/operations/install.md
@@ -1,44 +1,14 @@
-# Installation
-
-To install GitLab Workhorse you need [Go 1.15 or
-newer](https://golang.org/dl) and [GNU
-Make](https://www.gnu.org/software/make/).
-
-To install into `/usr/local/bin` run `make install`.
-
-```
-make install
-```
-
-To install into `/foo/bin` set the PREFIX variable.
-
-```
-make install PREFIX=/foo
-```
+---
+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
+---
-On some operating systems, such as FreeBSD, you may have to use
-`gmake` instead of `make`.
-
-*NOTE*: Some features depends on build tags, make sure to check
-[Workhorse configuration](doc/operations/configuration.md) to enable them.
-
-## Run time dependencies
-
-### Exiftool
-
-Workhorse uses [exiftool](https://www.sno.phy.queensu.ca/~phil/exiftool/) for
-removing EXIF data (which may contain sensitive information) from uploaded
-images. If you installed GitLab:
-
-- Using the Omnibus package, you're all set.
- *NOTE* that if you are using CentOS Minimal, you may need to install `perl`
- package: `yum install perl`
-- From source, make sure `exiftool` is installed:
+# Installation
- ```sh
- # Debian/Ubuntu
- sudo apt-get install libimage-exiftool-perl
+This document was moved to [another location](../../../doc/development/workhorse/index.md).
- # RHEL/CentOS
- sudo yum install perl-Image-ExifTool
- ```
+<!-- This redirect file can be deleted after <2022-07-01>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/workhorse/go.mod b/workhorse/go.mod
index 3a264d41dac..83bdcd0b5bb 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -28,7 +28,7 @@ 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.9.0-rc1
+ gitlab.com/gitlab-org/gitaly/v14 v14.9.0-rc5.0.20220329111719-51da8bc17059
gitlab.com/gitlab-org/golang-archive-zip v0.1.1
gitlab.com/gitlab-org/labkit v1.6.0
gocloud.dev v0.23.0
diff --git a/workhorse/go.sum b/workhorse/go.sum
index a565e93bfcc..1cb7418d3c1 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -606,7 +606,7 @@ github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.2/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/libgit2/git2go/v33 v33.0.6/go.mod h1:KdpqkU+6+++4oHna/MIOgx4GCQ92IPCdpVRMRI80J+4=
+github.com/libgit2/git2go/v33 v33.0.9/go.mod h1:KdpqkU+6+++4oHna/MIOgx4GCQ92IPCdpVRMRI80J+4=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20200305213919-a88bf8de3718/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20210210170715-a8dfcb80d3a7 h1:YjW+hUb8Fh2S58z4av4t/0cBMK/Q0aP48RocCFsC8yI=
@@ -886,8 +886,8 @@ github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wK
gitlab.com/gitlab-org/gitaly v1.68.0 h1:VlcJs1+PrhW7lqJUU7Fh1q8FMJujmbbivdfde/cwB98=
gitlab.com/gitlab-org/gitaly v1.68.0/go.mod h1:/pCsB918Zu5wFchZ9hLYin9WkJ2yQqdVNz0zlv5HbXg=
gitlab.com/gitlab-org/gitaly/v14 v14.0.0-rc1/go.mod h1:4Cz8tOAyueSZX5o6gYum1F/unupaOclxqETPcg4ODvQ=
-gitlab.com/gitlab-org/gitaly/v14 v14.9.0-rc1 h1:9vStRdXxcBQ8dHlVnpV28fwLOgyDkSFIpGnPqwzdTvw=
-gitlab.com/gitlab-org/gitaly/v14 v14.9.0-rc1/go.mod h1:Xk5pn6IWsejg3z2X6BRczC5QaI97PRF3GU5OrJ5Amkg=
+gitlab.com/gitlab-org/gitaly/v14 v14.9.0-rc5.0.20220329111719-51da8bc17059 h1:X7+3GQIxUpScXpIMCU5+sfpYvZyBIQ3GMlEosP7Jssw=
+gitlab.com/gitlab-org/gitaly/v14 v14.9.0-rc5.0.20220329111719-51da8bc17059/go.mod h1:uX1qhFKBDuPqATlpMcFL2dKDiX8D/tbUg7CYWx7OXt4=
gitlab.com/gitlab-org/gitlab-shell v1.9.8-0.20201117050822-3f9890ef73dc/go.mod h1:5QSTbpAHY2v0iIH5uHh2KA9w7sPUqPmnLjDApI/sv1U=
gitlab.com/gitlab-org/gitlab-shell v1.9.8-0.20210720163109-50da611814d2/go.mod h1:QWDYBwuy24qGMandtCngLRPzFgnGPg6LSNoJWPKmJMc=
gitlab.com/gitlab-org/golang-archive-zip v0.1.1 h1:35k9giivbxwF03+8A05Cm8YoxoakU8FBCj5gysjCTCE=
diff --git a/workhorse/internal/api/api.go b/workhorse/internal/api/api.go
index 7f696f70c7a..896f59a322a 100644
--- a/workhorse/internal/api/api.go
+++ b/workhorse/internal/api/api.go
@@ -64,7 +64,13 @@ func NewAPI(myURL *url.URL, version string, roundTripper http.RoundTripper) *API
}
type GeoProxyEndpointResponse struct {
- GeoProxyURL string `json:"geo_proxy_url"`
+ GeoProxyURL string `json:"geo_proxy_url"`
+ GeoProxyExtraData string `json:"geo_proxy_extra_data"`
+}
+
+type GeoProxyData struct {
+ GeoProxyURL *url.URL
+ GeoProxyExtraData string
}
type HandleFunc func(http.ResponseWriter, *http.Request, *Response)
@@ -394,7 +400,7 @@ func validResponseContentType(resp *http.Response) bool {
return helper.IsContentType(ResponseContentType, resp.Header.Get("Content-Type"))
}
-func (api *API) GetGeoProxyURL() (*url.URL, error) {
+func (api *API) GetGeoProxyData() (*GeoProxyData, error) {
geoProxyApiUrl := *api.URL
geoProxyApiUrl.Path, geoProxyApiUrl.RawPath = joinURLPath(api.URL, geoProxyEndpointPath)
geoProxyApiReq := &http.Request{
@@ -405,23 +411,26 @@ func (api *API) GetGeoProxyURL() (*url.URL, error) {
httpResponse, err := api.doRequestWithoutRedirects(geoProxyApiReq)
if err != nil {
- return nil, fmt.Errorf("GetGeoProxyURL: do request: %v", err)
+ return nil, fmt.Errorf("GetGeoProxyData: do request: %v", err)
}
defer httpResponse.Body.Close()
if httpResponse.StatusCode != http.StatusOK {
- return nil, fmt.Errorf("GetGeoProxyURL: Received HTTP status code: %v", httpResponse.StatusCode)
+ return nil, fmt.Errorf("GetGeoProxyData: Received HTTP status code: %v", httpResponse.StatusCode)
}
response := &GeoProxyEndpointResponse{}
if err := json.NewDecoder(httpResponse.Body).Decode(response); err != nil {
- return nil, fmt.Errorf("GetGeoProxyURL: decode response: %v", err)
+ return nil, fmt.Errorf("GetGeoProxyData: decode response: %v", err)
}
geoProxyURL, err := url.Parse(response.GeoProxyURL)
if err != nil {
- return nil, fmt.Errorf("GetGeoProxyURL: Could not parse Geo proxy URL: %v, err: %v", response.GeoProxyURL, err)
+ return nil, fmt.Errorf("GetGeoProxyData: Could not parse Geo proxy URL: %v, err: %v", response.GeoProxyURL, err)
}
- return geoProxyURL, nil
+ return &GeoProxyData{
+ GeoProxyURL: geoProxyURL,
+ GeoProxyExtraData: response.GeoProxyExtraData,
+ }, nil
}
diff --git a/workhorse/internal/api/api_test.go b/workhorse/internal/api/api_test.go
index b82bb55fb85..346f32b4a36 100644
--- a/workhorse/internal/api/api_test.go
+++ b/workhorse/internal/api/api_test.go
@@ -4,7 +4,6 @@ import (
"fmt"
"net/http"
"net/http/httptest"
- "net/url"
"regexp"
"testing"
@@ -18,21 +17,37 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upstream/roundtripper"
)
-func TestGetGeoProxyURLWhenGeoSecondary(t *testing.T) {
- geoProxyURL, err := getGeoProxyURLGivenResponse(t, `{"geo_proxy_url":"http://primary"}`)
-
- require.NoError(t, err)
- require.Equal(t, "http://primary", geoProxyURL.String())
-}
-
-func TestGetGeoProxyURLWhenGeoPrimaryOrNonGeo(t *testing.T) {
- geoProxyURL, err := getGeoProxyURLGivenResponse(t, "{}")
-
- require.NoError(t, err)
- require.Equal(t, "", geoProxyURL.String())
+func TestGetGeoProxyDataForResponses(t *testing.T) {
+ testCases := []struct {
+ desc string
+ json string
+ expectedError bool
+ expectedURL string
+ expectedExtraData string
+ }{
+ {"when Geo secondary", `{"geo_proxy_url":"http://primary","geo_proxy_extra_data":"geo-data"}`, false, "http://primary", "geo-data"},
+ {"when Geo secondary with explicit null data", `{"geo_proxy_url":"http://primary","geo_proxy_extra_data":null}`, false, "http://primary", ""},
+ {"when Geo secondary without extra data", `{"geo_proxy_url":"http://primary"}`, false, "http://primary", ""},
+ {"when Geo primary or no node", `{}`, false, "", ""},
+ {"for malformed request", `non-json`, true, "", ""},
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ geoProxyData, err := getGeoProxyDataGivenResponse(t, tc.json)
+
+ if tc.expectedError {
+ require.Error(t, err)
+ } else {
+ require.NoError(t, err)
+ require.Equal(t, tc.expectedURL, geoProxyData.GeoProxyURL.String())
+ require.Equal(t, tc.expectedExtraData, geoProxyData.GeoProxyExtraData)
+ }
+ })
+ }
}
-func getGeoProxyURLGivenResponse(t *testing.T, givenInternalApiResponse string) (*url.URL, error) {
+func getGeoProxyDataGivenResponse(t *testing.T, givenInternalApiResponse string) (*GeoProxyData, error) {
t.Helper()
ts := testRailsServer(regexp.MustCompile(`/api/v4/geo/proxy`), 200, givenInternalApiResponse)
defer ts.Close()
@@ -43,9 +58,9 @@ func getGeoProxyURLGivenResponse(t *testing.T, givenInternalApiResponse string)
apiClient := NewAPI(backend, version, rt)
- geoProxyURL, err := apiClient.GetGeoProxyURL()
+ geoProxyData, err := apiClient.GetGeoProxyData()
- return geoProxyURL, err
+ return geoProxyData, err
}
func testRailsServer(url *regexp.Regexp, code int, body string) *httptest.Server {
diff --git a/workhorse/internal/git/info-refs.go b/workhorse/internal/git/info-refs.go
index 8390143b99b..b7f825839f8 100644
--- a/workhorse/internal/git/info-refs.go
+++ b/workhorse/internal/git/info-refs.go
@@ -6,6 +6,7 @@ import (
"fmt"
"io"
"net/http"
+ "sync"
"github.com/golang/gddo/httputil"
grpccodes "google.golang.org/grpc/codes"
@@ -64,21 +65,43 @@ func handleGetInfoRefsWithGitaly(ctx context.Context, responseWriter *HttpRespon
return err
}
- var w io.Writer
-
+ var w io.WriteCloser = nopCloser{responseWriter}
if encoding == "gzip" {
- gzWriter := gzip.NewWriter(responseWriter)
- w = gzWriter
- defer gzWriter.Close()
+ gzWriter := getGzWriter(responseWriter)
+ defer putGzWriter(gzWriter)
+ w = gzWriter
responseWriter.Header().Set("Content-Encoding", "gzip")
- } else {
- w = responseWriter
}
if _, err = io.Copy(w, infoRefsResponseReader); err != nil {
return err
}
+ if err := w.Close(); err != nil {
+ return err
+ }
+
return nil
}
+
+var gzipPool = &sync.Pool{New: func() interface{} {
+ // Invariant: the inner writer is io.Discard. We do not want to retain
+ // response writers of past requests in the pool.
+ return gzip.NewWriter(io.Discard)
+}}
+
+func getGzWriter(w io.Writer) *gzip.Writer {
+ gzWriter := gzipPool.Get().(*gzip.Writer)
+ gzWriter.Reset(w)
+ return gzWriter
+}
+
+func putGzWriter(w *gzip.Writer) {
+ w.Reset(io.Discard) // Maintain pool invariant
+ gzipPool.Put(w)
+}
+
+type nopCloser struct{ io.Writer }
+
+func (nc nopCloser) Close() error { return nil }
diff --git a/workhorse/internal/headers/content_headers.go b/workhorse/internal/headers/content_headers.go
index 9c33ddb8c8a..8cca3d97e82 100644
--- a/workhorse/internal/headers/content_headers.go
+++ b/workhorse/internal/headers/content_headers.go
@@ -8,28 +8,37 @@ import (
)
var (
- ImageTypeRegex = regexp.MustCompile(`^image/*`)
- SvgMimeTypeRegex = regexp.MustCompile(`^image/svg\+xml$`)
+ javaScriptTypeRegex = regexp.MustCompile(`^(text|application)\/javascript$`)
- TextTypeRegex = regexp.MustCompile(`^text/*`)
+ imageTypeRegex = regexp.MustCompile(`^image/*`)
+ svgMimeTypeRegex = regexp.MustCompile(`^image/svg\+xml$`)
- VideoTypeRegex = regexp.MustCompile(`^video/*`)
+ textTypeRegex = regexp.MustCompile(`^text/*`)
- PdfTypeRegex = regexp.MustCompile(`application\/pdf`)
+ videoTypeRegex = regexp.MustCompile(`^video/*`)
- AttachmentRegex = regexp.MustCompile(`^attachment`)
- InlineRegex = regexp.MustCompile(`^inline`)
+ pdfTypeRegex = regexp.MustCompile(`application\/pdf`)
+
+ attachmentRegex = regexp.MustCompile(`^attachment`)
+ inlineRegex = regexp.MustCompile(`^inline`)
)
// Mime types that can't be inlined. Usually subtypes of main types
-var forbiddenInlineTypes = []*regexp.Regexp{SvgMimeTypeRegex}
+var forbiddenInlineTypes = []*regexp.Regexp{svgMimeTypeRegex}
// Mime types that can be inlined. We can add global types like "image/" or
// specific types like "text/plain". If there is a specific type inside a global
// allowed type that can't be inlined we must add it to the forbiddenInlineTypes var.
// One example of this is the mime type "image". We allow all images to be
// inlined except for SVGs.
-var allowedInlineTypes = []*regexp.Regexp{ImageTypeRegex, TextTypeRegex, VideoTypeRegex, PdfTypeRegex}
+var allowedInlineTypes = []*regexp.Regexp{imageTypeRegex, textTypeRegex, videoTypeRegex, pdfTypeRegex}
+
+const (
+ svgContentType = "image/svg+xml"
+ textPlainContentType = "text/plain; charset=utf-8"
+ attachmentDispositionText = "attachment"
+ inlineDispositionText = "inline"
+)
func SafeContentHeaders(data []byte, contentDisposition string) (string, string) {
contentType := safeContentType(data)
@@ -40,16 +49,24 @@ func SafeContentHeaders(data []byte, contentDisposition string) (string, string)
func safeContentType(data []byte) string {
// Special case for svg because DetectContentType detects it as text
if svg.Is(data) {
- return "image/svg+xml"
+ return svgContentType
}
// Override any existing Content-Type header from other ResponseWriters
contentType := http.DetectContentType(data)
+ // http.DetectContentType does not support JavaScript and would only
+ // return text/plain. But for cautionary measures, just in case they start supporting
+ // it down the road and start returning application/javascript, we want to handle it now
+ // to avoid regressions.
+ if isType(contentType, javaScriptTypeRegex) {
+ return textPlainContentType
+ }
+
// If the content is text type, we set to plain, because we don't
// want to render it inline if they're html or javascript
- if isType(contentType, TextTypeRegex) {
- return "text/plain; charset=utf-8"
+ if isType(contentType, textTypeRegex) {
+ return textPlainContentType
}
return contentType
@@ -58,7 +75,7 @@ func safeContentType(data []byte) string {
func safeContentDisposition(contentType string, contentDisposition string) string {
// If the existing disposition is attachment we return that. This allow us
// to force a download from GitLab (ie: RawController)
- if AttachmentRegex.MatchString(contentDisposition) {
+ if attachmentRegex.MatchString(contentDisposition) {
return contentDisposition
}
@@ -82,11 +99,11 @@ func safeContentDisposition(contentType string, contentDisposition string) strin
func attachmentDisposition(contentDisposition string) string {
if contentDisposition == "" {
- return "attachment"
+ return attachmentDispositionText
}
- if InlineRegex.MatchString(contentDisposition) {
- return InlineRegex.ReplaceAllString(contentDisposition, "attachment")
+ if inlineRegex.MatchString(contentDisposition) {
+ return inlineRegex.ReplaceAllString(contentDisposition, attachmentDispositionText)
}
return contentDisposition
@@ -94,11 +111,11 @@ func attachmentDisposition(contentDisposition string) string {
func inlineDisposition(contentDisposition string) string {
if contentDisposition == "" {
- return "inline"
+ return inlineDispositionText
}
- if AttachmentRegex.MatchString(contentDisposition) {
- return AttachmentRegex.ReplaceAllString(contentDisposition, "inline")
+ if attachmentRegex.MatchString(contentDisposition) {
+ return attachmentRegex.ReplaceAllString(contentDisposition, inlineDispositionText)
}
return contentDisposition
diff --git a/workhorse/internal/lsif_transformer/parser/errors.go b/workhorse/internal/lsif_transformer/parser/errors.go
deleted file mode 100644
index 1040a789413..00000000000
--- a/workhorse/internal/lsif_transformer/parser/errors.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package parser
-
-import (
- "errors"
- "strings"
-)
-
-func combineErrors(errsOrNil ...error) error {
- var errs []error
- for _, err := range errsOrNil {
- if err != nil {
- errs = append(errs, err)
- }
- }
-
- if len(errs) == 0 {
- return nil
- }
-
- if len(errs) == 1 {
- return errs[0]
- }
-
- var msgs []string
- for _, err := range errs {
- msgs = append(msgs, err.Error())
- }
-
- return errors.New(strings.Join(msgs, "\n"))
-}
diff --git a/workhorse/internal/lsif_transformer/parser/errors_test.go b/workhorse/internal/lsif_transformer/parser/errors_test.go
deleted file mode 100644
index 31a7130d05e..00000000000
--- a/workhorse/internal/lsif_transformer/parser/errors_test.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package parser
-
-import (
- "errors"
- "testing"
-
- "github.com/stretchr/testify/require"
-)
-
-type customErr struct {
- err string
-}
-
-func (e customErr) Error() string {
- return e.err
-}
-
-func TestCombineErrors(t *testing.T) {
- err := combineErrors(nil, errors.New("first"), nil, customErr{"second"})
- require.EqualError(t, err, "first\nsecond")
-
- err = customErr{"custom error"}
- require.Equal(t, err, combineErrors(nil, err, nil))
-
- require.Nil(t, combineErrors(nil, nil, nil))
-}
diff --git a/workhorse/internal/lsif_transformer/parser/hovers.go b/workhorse/internal/lsif_transformer/parser/hovers.go
index 5889d595ade..a13c7e4c5c2 100644
--- a/workhorse/internal/lsif_transformer/parser/hovers.go
+++ b/workhorse/internal/lsif_transformer/parser/hovers.go
@@ -95,10 +95,15 @@ func (h *Hovers) For(refId Id) json.RawMessage {
}
func (h *Hovers) Close() error {
- return combineErrors(
+ for _, err := range []error{
h.File.Close(),
h.Offsets.Close(),
- )
+ } {
+ if err != nil {
+ return err
+ }
+ }
+ return nil
}
func (h *Hovers) addData(line []byte) error {
diff --git a/workhorse/internal/lsif_transformer/parser/ranges.go b/workhorse/internal/lsif_transformer/parser/ranges.go
index a11a66d70ca..3786e15186e 100644
--- a/workhorse/internal/lsif_transformer/parser/ranges.go
+++ b/workhorse/internal/lsif_transformer/parser/ranges.go
@@ -130,11 +130,16 @@ func (r *Ranges) Serialize(f io.Writer, rangeIds []Id, docs map[Id]string) error
}
func (r *Ranges) Close() error {
- return combineErrors(
+ for _, err := range []error{
r.Cache.Close(),
r.References.Close(),
r.Hovers.Close(),
- )
+ } {
+ if err != nil {
+ return err
+ }
+ }
+ return nil
}
func (r *Ranges) definitionPathFor(docs map[Id]string, refId Id) string {
diff --git a/workhorse/internal/lsif_transformer/parser/references.go b/workhorse/internal/lsif_transformer/parser/references.go
index 58ff9a61c02..39c34105fd1 100644
--- a/workhorse/internal/lsif_transformer/parser/references.go
+++ b/workhorse/internal/lsif_transformer/parser/references.go
@@ -86,10 +86,15 @@ func (r *References) For(docs map[Id]string, refId Id) []SerializedReference {
}
func (r *References) Close() error {
- return combineErrors(
+ for _, err := range []error{
r.Items.Close(),
r.Offsets.Close(),
- )
+ } {
+ if err != nil {
+ return err
+ }
+ }
+ return nil
}
func (r *References) getItems(refId Id) []Item {
diff --git a/workhorse/internal/proxy/proxy.go b/workhorse/internal/proxy/proxy.go
index be161c833a9..06e2c65a6a8 100644
--- a/workhorse/internal/proxy/proxy.go
+++ b/workhorse/internal/proxy/proxy.go
@@ -19,6 +19,7 @@ type Proxy struct {
reverseProxy *httputil.ReverseProxy
AllowResponseBuffering bool
customHeaders map[string]string
+ forceTargetHostHeader bool
}
func WithCustomHeaders(customHeaders map[string]string) func(*Proxy) {
@@ -27,6 +28,12 @@ func WithCustomHeaders(customHeaders map[string]string) func(*Proxy) {
}
}
+func WithForcedTargetHostHeader() func(*Proxy) {
+ return func(proxy *Proxy) {
+ proxy.forceTargetHostHeader = true
+ }
+}
+
func NewProxy(myURL *url.URL, version string, roundTripper http.RoundTripper, options ...func(*Proxy)) *Proxy {
p := Proxy{Version: version, AllowResponseBuffering: true, customHeaders: make(map[string]string)}
@@ -43,6 +50,25 @@ func NewProxy(myURL *url.URL, version string, roundTripper http.RoundTripper, op
option(&p)
}
+ if p.forceTargetHostHeader {
+ // because of https://github.com/golang/go/issues/28168, the
+ // upstream won't receive the expected Host header unless this
+ // is forced in the Director func here
+ previousDirector := p.reverseProxy.Director
+ p.reverseProxy.Director = func(request *http.Request) {
+ previousDirector(request)
+
+ // send original host along for the upstream
+ // to know it's being proxied under a different Host
+ // (for redirects and other stuff that depends on this)
+ request.Header.Set("X-Forwarded-Host", request.Host)
+ request.Header.Set("Forwarded", fmt.Sprintf("host=%s", request.Host))
+
+ // override the Host with the target
+ request.Host = request.URL.Host
+ }
+ }
+
return &p
}
diff --git a/workhorse/internal/senddata/contentprocessor/contentprocessor_test.go b/workhorse/internal/senddata/contentprocessor/contentprocessor_test.go
index 2396bb0f952..b009cda1a24 100644
--- a/workhorse/internal/senddata/contentprocessor/contentprocessor_test.go
+++ b/workhorse/internal/senddata/contentprocessor/contentprocessor_test.go
@@ -56,12 +56,18 @@ func TestSetProperContentTypeAndDisposition(t *testing.T) {
body: "<html><body>Hello world!</body></html>",
},
{
- desc: "Javascript type",
+ desc: "Javascript within HTML type",
contentType: "text/plain; charset=utf-8",
contentDisposition: "inline",
body: "<script>alert(\"foo\")</script>",
},
{
+ desc: "Javascript type",
+ contentType: "text/plain; charset=utf-8",
+ contentDisposition: "inline",
+ body: "alert(\"foo\")",
+ },
+ {
desc: "Image type",
contentType: "image/png",
contentDisposition: "inline",
@@ -170,25 +176,41 @@ func TestSetProperContentTypeAndDisposition(t *testing.T) {
}
func TestFailOverrideContentType(t *testing.T) {
- testCase := struct {
- contentType string
- body string
+ testCases := []struct {
+ desc string
+ overrideFromUpstream string
+ responseContentType string
+ body string
}{
- contentType: "text/plain; charset=utf-8",
- body: "<html><body>Hello world!</body></html>",
+ {
+ desc: "Force text/html into text/plain",
+ responseContentType: "text/plain; charset=utf-8",
+ overrideFromUpstream: "text/html; charset=utf-8",
+ body: "<html><body>Hello world!</body></html>",
+ },
+ {
+ desc: "Force application/javascript into text/plain",
+ responseContentType: "text/plain; charset=utf-8",
+ overrideFromUpstream: "application/javascript; charset=utf-8",
+ body: "alert(1);",
+ },
}
- h := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
- // We are pretending to be upstream or an inner layer of the ResponseWriter chain
- w.Header().Set(headers.GitlabWorkhorseDetectContentTypeHeader, "true")
- w.Header().Set(headers.ContentTypeHeader, "text/html; charset=utf-8")
- _, err := io.WriteString(w, testCase.body)
- require.NoError(t, err)
- })
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ h := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
+ // We are pretending to be upstream or an inner layer of the ResponseWriter chain
+ w.Header().Set(headers.GitlabWorkhorseDetectContentTypeHeader, "true")
+ w.Header().Set(headers.ContentTypeHeader, tc.overrideFromUpstream)
+ _, err := io.WriteString(w, tc.body)
+ require.NoError(t, err)
+ })
- resp := makeRequest(t, h, testCase.body, "")
+ resp := makeRequest(t, h, tc.body, "")
- require.Equal(t, testCase.contentType, resp.Header.Get(headers.ContentTypeHeader))
+ require.Equal(t, tc.responseContentType, resp.Header.Get(headers.ContentTypeHeader))
+ })
+ }
}
func TestSuccessOverrideContentDispositionFromInlineToAttachment(t *testing.T) {
diff --git a/workhorse/internal/upload/artifacts_upload_test.go b/workhorse/internal/upload/artifacts_upload_test.go
index 0a9e4ef3869..96eb3810673 100644
--- a/workhorse/internal/upload/artifacts_upload_test.go
+++ b/workhorse/internal/upload/artifacts_upload_test.go
@@ -66,7 +66,7 @@ func testArtifactsUploadServer(t *testing.T, authResponse *api.Response, bodyPro
if r.Method != "POST" {
t.Fatal("Expected POST request")
}
- if opts.IsLocal() {
+ if opts.IsLocalTempFile() {
if r.FormValue("file.path") == "" {
t.Fatal("Expected file to be present")
return
diff --git a/workhorse/internal/upload/destination/destination.go b/workhorse/internal/upload/destination/destination.go
index 7a030e59a64..b18b6e22a99 100644
--- a/workhorse/internal/upload/destination/destination.go
+++ b/workhorse/internal/upload/destination/destination.go
@@ -128,9 +128,14 @@ func Upload(ctx context.Context, reader io.Reader, size int64, opts *UploadOpts)
var uploadDestination consumer
var err error
switch {
- case opts.IsLocal():
- clientMode = "local"
+ // This case means Workhorse is acting as an upload proxy for Rails and buffers files
+ // to disk in a temporary location, see:
+ // https://docs.gitlab.com/ee/development/uploads/background.html#moving-disk-buffering-to-workhorse
+ case opts.IsLocalTempFile():
+ clientMode = "local_tempfile"
uploadDestination, err = fh.newLocalFile(ctx, opts)
+ // All cases below mean we are doing a direct upload to remote i.e. object storage, see:
+ // https://docs.gitlab.com/ee/development/uploads/background.html#moving-to-object-storage-and-direct-uploads
case opts.UseWorkhorseClientEnabled() && opts.ObjectStorageConfig.IsGoCloud():
clientMode = fmt.Sprintf("go_cloud:%s", opts.ObjectStorageConfig.Provider)
p := &objectstore.GoCloudObjectParams{
@@ -141,14 +146,14 @@ func Upload(ctx context.Context, reader io.Reader, size int64, opts *UploadOpts)
}
uploadDestination, err = objectstore.NewGoCloudObject(p)
case opts.UseWorkhorseClientEnabled() && opts.ObjectStorageConfig.IsAWS() && opts.ObjectStorageConfig.IsValid():
- clientMode = "s3"
+ clientMode = "s3_client"
uploadDestination, err = objectstore.NewS3Object(
opts.RemoteTempObjectID,
opts.ObjectStorageConfig.S3Credentials,
opts.ObjectStorageConfig.S3Config,
)
case opts.IsMultipart():
- clientMode = "multipart"
+ clientMode = "s3_multipart"
uploadDestination, err = objectstore.NewMultipart(
opts.PresignedParts,
opts.PresignedCompleteMultipart,
@@ -158,7 +163,7 @@ func Upload(ctx context.Context, reader io.Reader, size int64, opts *UploadOpts)
opts.PartSize,
)
default:
- clientMode = "http"
+ clientMode = "presigned_put"
uploadDestination, err = objectstore.NewObject(
opts.PresignedPut,
opts.PresignedDelete,
@@ -195,15 +200,15 @@ func Upload(ctx context.Context, reader io.Reader, size int64, opts *UploadOpts)
logger := log.WithContextFields(ctx, log.Fields{
"copied_bytes": fh.Size,
- "is_local": opts.IsLocal(),
+ "is_local": opts.IsLocalTempFile(),
"is_multipart": opts.IsMultipart(),
- "is_remote": !opts.IsLocal(),
+ "is_remote": !opts.IsLocalTempFile(),
"remote_id": opts.RemoteID,
"temp_file_prefix": opts.TempFilePrefix,
"client_mode": clientMode,
})
- if opts.IsLocal() {
+ if opts.IsLocalTempFile() {
logger = logger.WithField("local_temp_path", opts.LocalTempPath)
} else {
logger = logger.WithField("remote_temp_object", opts.RemoteTempObjectID)
diff --git a/workhorse/internal/upload/destination/objectstore/s3_session.go b/workhorse/internal/upload/destination/objectstore/s3_session.go
index a0c1f099145..aa38f18ed7a 100644
--- a/workhorse/internal/upload/destination/objectstore/s3_session.go
+++ b/workhorse/internal/upload/destination/objectstore/s3_session.go
@@ -6,6 +6,7 @@ import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
+ "github.com/aws/aws-sdk-go/aws/endpoints"
"github.com/aws/aws-sdk-go/aws/session"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
@@ -70,7 +71,23 @@ func setupS3Session(s3Credentials config.S3Credentials, s3Config config.S3Config
}
if s3Config.Endpoint != "" {
- cfg.Endpoint = aws.String(s3Config.Endpoint)
+ // The administrator has configured an S3 endpoint override,
+ // e.g. to make use of S3 IPv6 support or S3 FIPS mode. We
+ // need to configure a custom resolver to make sure that
+ // the custom endpoint is only used for S3 API calls, and not
+ // for STS API calls.
+ s3CustomResolver := func(service, region string, optFns ...func(*endpoints.Options)) (endpoints.ResolvedEndpoint, error) {
+ if service == endpoints.S3ServiceID {
+ return endpoints.ResolvedEndpoint{
+ URL: s3Config.Endpoint,
+ SigningRegion: region,
+ }, nil
+ }
+
+ return endpoints.DefaultResolver().EndpointFor(service, region, optFns...)
+ }
+
+ cfg.EndpointResolver = endpoints.ResolverFunc(s3CustomResolver)
}
sess, err := session.NewSession(cfg)
diff --git a/workhorse/internal/upload/destination/objectstore/s3_session_test.go b/workhorse/internal/upload/destination/objectstore/s3_session_test.go
index 5d57b4f9af8..4bbe38f90ec 100644
--- a/workhorse/internal/upload/destination/objectstore/s3_session_test.go
+++ b/workhorse/internal/upload/destination/objectstore/s3_session_test.go
@@ -5,6 +5,7 @@ import (
"time"
"github.com/aws/aws-sdk-go/aws"
+ "github.com/aws/aws-sdk-go/aws/endpoints"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
@@ -17,7 +18,9 @@ func TestS3SessionSetup(t *testing.T) {
sess, err := setupS3Session(credentials, cfg)
require.NoError(t, err)
- require.Equal(t, aws.StringValue(sess.Config.Region), "us-west-1")
+ s3Config := sess.ClientConfig(endpoints.S3ServiceID)
+ require.Equal(t, "https://s3.us-west-1.amazonaws.com", s3Config.Endpoint)
+ require.Equal(t, "us-west-1", s3Config.SigningRegion)
require.True(t, aws.BoolValue(sess.Config.S3ForcePathStyle))
require.Equal(t, len(sessionCache.sessions), 1)
@@ -29,6 +32,26 @@ func TestS3SessionSetup(t *testing.T) {
ResetS3Session(cfg)
}
+func TestS3SessionEndpointSetup(t *testing.T) {
+ credentials := config.S3Credentials{}
+ const customS3Endpoint = "https://example.com"
+ const region = "us-west-2"
+ cfg := config.S3Config{Region: region, PathStyle: true, Endpoint: customS3Endpoint}
+
+ sess, err := setupS3Session(credentials, cfg)
+ require.NoError(t, err)
+
+ // ClientConfig is what is ultimately used by an S3 client
+ s3Config := sess.ClientConfig(endpoints.S3ServiceID)
+ require.Equal(t, customS3Endpoint, s3Config.Endpoint)
+ require.Equal(t, region, s3Config.SigningRegion)
+
+ stsConfig := sess.ClientConfig(endpoints.StsServiceID)
+ require.Equal(t, "https://sts.amazonaws.com", stsConfig.Endpoint, "STS should use default endpoint")
+
+ ResetS3Session(cfg)
+}
+
func TestS3SessionExpiry(t *testing.T) {
credentials := config.S3Credentials{}
cfg := config.S3Config{Region: "us-west-1", PathStyle: true}
diff --git a/workhorse/internal/upload/destination/upload_opts.go b/workhorse/internal/upload/destination/upload_opts.go
index 750a79d7bc2..77a8927d34f 100644
--- a/workhorse/internal/upload/destination/upload_opts.go
+++ b/workhorse/internal/upload/destination/upload_opts.go
@@ -70,8 +70,8 @@ func (s *UploadOpts) UseWorkhorseClientEnabled() bool {
return s.UseWorkhorseClient && s.ObjectStorageConfig.IsValid() && s.RemoteTempObjectID != ""
}
-// IsLocal checks if the options require the writing of the file on disk
-func (s *UploadOpts) IsLocal() bool {
+// IsLocalTempFile checks if the options require the writing of a temporary file on disk
+func (s *UploadOpts) IsLocalTempFile() bool {
return s.LocalTempPath != ""
}
diff --git a/workhorse/internal/upload/destination/upload_opts_test.go b/workhorse/internal/upload/destination/upload_opts_test.go
index fde726c985d..24a372495c6 100644
--- a/workhorse/internal/upload/destination/upload_opts_test.go
+++ b/workhorse/internal/upload/destination/upload_opts_test.go
@@ -49,7 +49,7 @@ func TestUploadOptsLocalAndRemote(t *testing.T) {
PartSize: test.partSize,
}
- require.Equal(t, test.isLocal, opts.IsLocal(), "IsLocal() mismatch")
+ require.Equal(t, test.isLocal, opts.IsLocalTempFile(), "IsLocalTempFile() mismatch")
require.Equal(t, test.isMultipart, opts.IsMultipart(), "IsMultipart() mismatch")
})
}
@@ -336,7 +336,7 @@ func TestGoCloudConfig(t *testing.T) {
require.Equal(t, apiResponse.RemoteObject.ObjectStorage.GoCloudConfig, opts.ObjectStorageConfig.GoCloudConfig)
require.True(t, opts.UseWorkhorseClientEnabled())
require.Equal(t, test.valid, opts.ObjectStorageConfig.IsValid())
- require.False(t, opts.IsLocal())
+ require.False(t, opts.IsLocalTempFile())
})
}
}
diff --git a/workhorse/internal/upstream/upstream.go b/workhorse/internal/upstream/upstream.go
index c0678b1cb3e..6d107fc28cd 100644
--- a/workhorse/internal/upstream/upstream.go
+++ b/workhorse/internal/upstream/upstream.go
@@ -37,7 +37,6 @@ var (
upload.RewrittenFieldsHeader,
}
geoProxyApiPollingInterval = 10 * time.Second
- geoProxyWorkhorseHeaders = map[string]string{"Gitlab-Workhorse-Geo-Proxy": "1"}
)
type upstream struct {
@@ -48,6 +47,7 @@ type upstream struct {
CableRoundTripper http.RoundTripper
APIClient *apipkg.API
geoProxyBackend *url.URL
+ geoProxyExtraData string
geoLocalRoutes []routeEntry
geoProxyCableRoute routeEntry
geoProxyRoute routeEntry
@@ -215,34 +215,51 @@ func (u *upstream) pollGeoProxyAPI() {
// Calls /api/v4/geo/proxy and sets up routes
func (u *upstream) callGeoProxyAPI() {
- geoProxyURL, err := u.APIClient.GetGeoProxyURL()
+ geoProxyData, err := u.APIClient.GetGeoProxyData()
if err != nil {
log.WithError(err).WithFields(log.Fields{"geoProxyBackend": u.geoProxyBackend}).Error("Geo Proxy: Unable to determine Geo Proxy URL. Fallback on cached value.")
return
}
- if u.geoProxyBackend.String() != geoProxyURL.String() {
- log.WithFields(log.Fields{"oldGeoProxyURL": u.geoProxyBackend, "newGeoProxyURL": geoProxyURL}).Info("Geo Proxy: URL changed")
- u.updateGeoProxyFields(geoProxyURL)
+ hasProxyDataChanged := false
+ if u.geoProxyBackend.String() != geoProxyData.GeoProxyURL.String() {
+ log.WithFields(log.Fields{"oldGeoProxyURL": u.geoProxyBackend, "newGeoProxyURL": geoProxyData.GeoProxyURL}).Info("Geo Proxy: URL changed")
+ hasProxyDataChanged = true
+ }
+
+ if u.geoProxyExtraData != geoProxyData.GeoProxyExtraData {
+ // extra data is usually a JWT, thus not explicitly logging it
+ log.Info("Geo Proxy: signed data changed")
+ hasProxyDataChanged = true
+ }
+
+ if hasProxyDataChanged {
+ u.updateGeoProxyFieldsFromData(geoProxyData)
}
}
-func (u *upstream) updateGeoProxyFields(geoProxyURL *url.URL) {
+func (u *upstream) updateGeoProxyFieldsFromData(geoProxyData *apipkg.GeoProxyData) {
u.mu.Lock()
defer u.mu.Unlock()
- u.geoProxyBackend = geoProxyURL
+ u.geoProxyBackend = geoProxyData.GeoProxyURL
+ u.geoProxyExtraData = geoProxyData.GeoProxyExtraData
if u.geoProxyBackend.String() == "" {
return
}
+ geoProxyWorkhorseHeaders := map[string]string{
+ "Gitlab-Workhorse-Geo-Proxy": "1",
+ "Gitlab-Workhorse-Geo-Proxy-Extra-Data": u.geoProxyExtraData,
+ }
geoProxyRoundTripper := roundtripper.NewBackendRoundTripper(u.geoProxyBackend, "", u.ProxyHeadersTimeout, u.DevelopmentMode)
geoProxyUpstream := proxypkg.NewProxy(
u.geoProxyBackend,
u.Version,
geoProxyRoundTripper,
proxypkg.WithCustomHeaders(geoProxyWorkhorseHeaders),
+ proxypkg.WithForcedTargetHostHeader(),
)
u.geoProxyCableRoute = u.wsRoute(`^/-/cable\z`, geoProxyUpstream)
u.geoProxyRoute = u.route("", "", geoProxyUpstream, withGeoProxy())
diff --git a/workhorse/internal/upstream/upstream_test.go b/workhorse/internal/upstream/upstream_test.go
index 80e59202b69..8f054f5ccef 100644
--- a/workhorse/internal/upstream/upstream_test.go
+++ b/workhorse/internal/upstream/upstream_test.go
@@ -209,21 +209,74 @@ func TestGeoProxyFeatureEnablingAndDisabling(t *testing.T) {
runTestCases(t, ws, testCasesProxied)
}
-func TestGeoProxySetsCustomHeader(t *testing.T) {
+func TestGeoProxyUpdatesExtraDataWhenChanged(t *testing.T) {
+ var expectedGeoProxyExtraData string
+
remoteServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "1", r.Header.Get("Gitlab-Workhorse-Geo-Proxy"), "custom proxy header")
+ require.Equal(t, expectedGeoProxyExtraData, r.Header.Get("Gitlab-Workhorse-Geo-Proxy-Extra-Data"), "custom extra data header")
w.WriteHeader(http.StatusOK)
}))
defer remoteServer.Close()
- geoProxyEndpointResponseBody := fmt.Sprintf(`{"geo_proxy_url":"%v"}`, remoteServer.URL)
+ geoProxyEndpointExtraData1 := fmt.Sprintf(`{"geo_proxy_url":"%v","geo_proxy_extra_data":"data1"}`, remoteServer.URL)
+ geoProxyEndpointExtraData2 := fmt.Sprintf(`{"geo_proxy_url":"%v","geo_proxy_extra_data":"data2"}`, remoteServer.URL)
+ geoProxyEndpointExtraData3 := fmt.Sprintf(`{"geo_proxy_url":"%v"}`, remoteServer.URL)
+ geoProxyEndpointResponseBody := geoProxyEndpointExtraData1
+ expectedGeoProxyExtraData = "data1"
+
railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
- ws, wsDeferredClose, _ := startWorkhorseServer(railsServer.URL, true)
+ ws, wsDeferredClose, waitForNextApiPoll := startWorkhorseServer(railsServer.URL, true)
defer wsDeferredClose()
http.Get(ws.URL)
+
+ // Verify that the expected header changes after next updated poll.
+ geoProxyEndpointResponseBody = geoProxyEndpointExtraData2
+ expectedGeoProxyExtraData = "data2"
+ waitForNextApiPoll()
+
+ http.Get(ws.URL)
+
+ // Validate that non-existing extra data results in empty header
+ geoProxyEndpointResponseBody = geoProxyEndpointExtraData3
+ expectedGeoProxyExtraData = ""
+ waitForNextApiPoll()
+
+ http.Get(ws.URL)
+}
+
+func TestGeoProxySetsCustomHeader(t *testing.T) {
+ testCases := []struct {
+ desc string
+ json string
+ extraData string
+ }{
+ {"no extra data", `{"geo_proxy_url":"%v"}`, ""},
+ {"with extra data", `{"geo_proxy_url":"%v","geo_proxy_extra_data":"extra-geo-data"}`, "extra-geo-data"},
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ remoteServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ require.Equal(t, "1", r.Header.Get("Gitlab-Workhorse-Geo-Proxy"), "custom proxy header")
+ require.Equal(t, tc.extraData, r.Header.Get("Gitlab-Workhorse-Geo-Proxy-Extra-Data"), "custom proxy extra data header")
+ w.WriteHeader(http.StatusOK)
+ }))
+ defer remoteServer.Close()
+
+ geoProxyEndpointResponseBody := fmt.Sprintf(tc.json, remoteServer.URL)
+ railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
+ defer deferredClose()
+
+ ws, wsDeferredClose, _ := startWorkhorseServer(railsServer.URL, true)
+ defer wsDeferredClose()
+
+ http.Get(ws.URL)
+ })
+ }
}
func runTestCases(t *testing.T, ws *httptest.Server, testCases []testCase) {
diff --git a/workhorse/proxy_test.go b/workhorse/proxy_test.go
index 754deea0032..02148c07522 100644
--- a/workhorse/proxy_test.go
+++ b/workhorse/proxy_test.go
@@ -7,6 +7,7 @@ import (
"net"
"net/http"
"net/http/httptest"
+ "net/url"
"regexp"
"testing"
"time"
@@ -31,10 +32,17 @@ func newProxy(url string, rt http.RoundTripper, opts ...func(*proxy.Proxy)) *pro
}
func TestProxyRequest(t *testing.T) {
- ts := testhelper.TestServerWithHandler(regexp.MustCompile(`/url/path\z`), func(w http.ResponseWriter, r *http.Request) {
+ inboundURL, err := url.Parse("https://explicitly.set.host/url/path")
+ require.NoError(t, err, "parse inbound url")
+
+ urlRegexp := regexp.MustCompile(fmt.Sprintf(`%s\z`, inboundURL.Path))
+ ts := testhelper.TestServerWithHandler(urlRegexp, func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "POST", r.Method, "method")
require.Equal(t, "test", r.Header.Get("Custom-Header"), "custom header")
require.Equal(t, testVersion, r.Header.Get("Gitlab-Workhorse"), "version header")
+ require.Equal(t, inboundURL.Host, r.Host, "sent host header")
+ require.Empty(t, r.Header.Get("X-Forwarded-Host"), "X-Forwarded-Host header")
+ require.Empty(t, r.Header.Get("Forwarded"), "Forwarded header")
require.Regexp(
t,
@@ -52,7 +60,7 @@ func TestProxyRequest(t *testing.T) {
fmt.Fprint(w, "RESPONSE")
})
- httpRequest, err := http.NewRequest("POST", ts.URL+"/url/path", bytes.NewBufferString("REQUEST"))
+ httpRequest, err := http.NewRequest("POST", inboundURL.String(), bytes.NewBufferString("REQUEST"))
require.NoError(t, err)
httpRequest.Header.Set("Custom-Header", "test")
@@ -64,6 +72,32 @@ func TestProxyRequest(t *testing.T) {
require.Equal(t, "test", w.Header().Get("Custom-Response-Header"), "custom response header")
}
+func TestProxyWithForcedTargetHostHeader(t *testing.T) {
+ var tsUrl *url.URL
+ inboundURL, err := url.Parse("https://explicitly.set.host/url/path")
+ require.NoError(t, err, "parse upstream url")
+
+ urlRegexp := regexp.MustCompile(fmt.Sprintf(`%s\z`, inboundURL.Path))
+ ts := testhelper.TestServerWithHandler(urlRegexp, func(w http.ResponseWriter, r *http.Request) {
+ require.Equal(t, tsUrl.Host, r.Host, "upstream host header")
+ require.Equal(t, inboundURL.Host, r.Header.Get("X-Forwarded-Host"), "X-Forwarded-Host header")
+ require.Equal(t, fmt.Sprintf("host=%s", inboundURL.Host), r.Header.Get("Forwarded"), "Forwarded header")
+
+ _, err := w.Write([]byte(`ok`))
+ require.NoError(t, err, "write ok response")
+ })
+ tsUrl, err = url.Parse(ts.URL)
+ require.NoError(t, err, "parse testserver URL")
+
+ httpRequest, err := http.NewRequest("POST", inboundURL.String(), nil)
+ require.NoError(t, err)
+
+ w := httptest.NewRecorder()
+ testProxy := newProxy(ts.URL, nil, proxy.WithForcedTargetHostHeader())
+ testProxy.ServeHTTP(w, httpRequest)
+ testhelper.RequireResponseBody(t, w, "ok")
+}
+
func TestProxyWithCustomHeaders(t *testing.T) {
ts := testhelper.TestServerWithHandler(regexp.MustCompile(`/url/path\z`), func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, "value", r.Header.Get("Custom-Header"), "custom proxy header")
diff --git a/workhorse/tools.go b/workhorse/tools.go
index 9df59be349e..94b487844e1 100644
--- a/workhorse/tools.go
+++ b/workhorse/tools.go
@@ -1,4 +1,5 @@
-//+build tools
+//go:build tools
+// +build tools
package main
diff --git a/yarn.lock b/yarn.lock
index 49a51bf704d..5b20e7536e9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,24 +2,30 @@
# yarn lockfile v1
-"@apollo/client@^3.2.5", "@apollo/client@^3.3.11":
- version "3.3.11"
- resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.11.tgz#125051405e83dc899d471d43b79fd6045d92a802"
- integrity sha512-54+D5FB6RJlQ+g37f432gaexnyvDsG5X6L9VO5kqN54HJlbF8hCf/8CXtAQEHCWodAwZhy6kOLp2RM96829q3A==
+"@ampproject/remapping@^2.1.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34"
+ integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.0"
+
+"@apollo/client@^3.5.10":
+ version "3.5.10"
+ resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.5.10.tgz#43463108a6e07ae602cca0afc420805a19339a71"
+ integrity sha512-tL3iSpFe9Oldq7gYikZK1dcYxp1c01nlSwtsMz75382HcI6fvQXyFXUCJTTK3wgO2/ckaBvRGw7VqjFREdVoRw==
dependencies:
"@graphql-typed-document-node/core" "^3.0.0"
- "@types/zen-observable" "^0.8.0"
- "@wry/context" "^0.5.2"
- "@wry/equality" "^0.3.0"
- fast-json-stable-stringify "^2.0.0"
- graphql-tag "^2.12.0"
+ "@wry/context" "^0.6.0"
+ "@wry/equality" "^0.5.0"
+ "@wry/trie" "^0.3.0"
+ graphql-tag "^2.12.3"
hoist-non-react-statics "^3.3.2"
- optimism "^0.14.0"
+ optimism "^0.16.1"
prop-types "^15.7.2"
- symbol-observable "^2.0.0"
- ts-invariant "^0.6.0"
- tslib "^1.10.0"
- zen-observable "^0.8.14"
+ symbol-observable "^4.0.0"
+ ts-invariant "^0.9.4"
+ tslib "^2.3.0"
+ zen-observable-ts "^1.2.0"
"@babel/code-frame@7.12.11":
version "7.12.11"
@@ -42,38 +48,54 @@
dependencies:
"@babel/highlight" "^7.16.7"
-"@babel/compat-data@^7.10.1", "@babel/compat-data@^7.16.4":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60"
- integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==
+"@babel/compat-data@^7.10.1", "@babel/compat-data@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2"
+ integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==
-"@babel/core@^7.1.0", "@babel/core@^7.10.1", "@babel/core@^7.7.5":
- version "7.16.12"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784"
- integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==
+"@babel/core@^7.1.0", "@babel/core@^7.10.1", "@babel/core@^7.17.0", "@babel/core@^7.7.5":
+ version "7.17.8"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a"
+ integrity sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==
dependencies:
+ "@ampproject/remapping" "^2.1.0"
"@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.16.8"
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helpers" "^7.16.7"
- "@babel/parser" "^7.16.12"
+ "@babel/generator" "^7.17.7"
+ "@babel/helper-compilation-targets" "^7.17.7"
+ "@babel/helper-module-transforms" "^7.17.7"
+ "@babel/helpers" "^7.17.8"
+ "@babel/parser" "^7.17.8"
"@babel/template" "^7.16.7"
- "@babel/traverse" "^7.16.10"
- "@babel/types" "^7.16.8"
+ "@babel/traverse" "^7.17.3"
+ "@babel/types" "^7.17.0"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
json5 "^2.1.2"
semver "^6.3.0"
- source-map "^0.5.0"
-"@babel/generator@^7.15.4", "@babel/generator@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe"
- integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==
+"@babel/eslint-parser@^7.17.0":
+ version "7.17.0"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz#eabb24ad9f0afa80e5849f8240d0e5facc2d90d6"
+ integrity sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==
+ dependencies:
+ eslint-scope "^5.1.1"
+ eslint-visitor-keys "^2.1.0"
+ semver "^6.3.0"
+
+"@babel/eslint-plugin@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.17.7.tgz#4ee1d5b29b79130f3bb5a933358376bcbee172b8"
+ integrity sha512-JATUoJJXSgwI0T8juxWYtK1JSgoLpIGUsCHIv+NMXcUDA2vIe6nvAHR9vnuJgs/P1hOFw7vPwibixzfqBBLIVw==
+ dependencies:
+ eslint-rule-composer "^0.3.0"
+
+"@babel/generator@^7.15.4", "@babel/generator@^7.17.3", "@babel/generator@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad"
+ integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==
dependencies:
- "@babel/types" "^7.16.8"
+ "@babel/types" "^7.17.0"
jsesc "^2.5.1"
source-map "^0.5.0"
@@ -92,12 +114,12 @@
"@babel/helper-explode-assignable-expression" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helper-compilation-targets@^7.10.2", "@babel/helper-compilation-targets@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b"
- integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==
+"@babel/helper-compilation-targets@^7.10.2", "@babel/helper-compilation-targets@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46"
+ integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==
dependencies:
- "@babel/compat-data" "^7.16.4"
+ "@babel/compat-data" "^7.17.7"
"@babel/helper-validator-option" "^7.16.7"
browserslist "^4.17.5"
semver "^6.3.0"
@@ -184,19 +206,19 @@
dependencies:
"@babel/types" "^7.16.7"
-"@babel/helper-module-transforms@^7.10.1", "@babel/helper-module-transforms@^7.15.0", "@babel/helper-module-transforms@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41"
- integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==
+"@babel/helper-module-transforms@^7.10.1", "@babel/helper-module-transforms@^7.15.0", "@babel/helper-module-transforms@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd"
+ integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==
dependencies:
"@babel/helper-environment-visitor" "^7.16.7"
"@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-simple-access" "^7.16.7"
+ "@babel/helper-simple-access" "^7.17.7"
"@babel/helper-split-export-declaration" "^7.16.7"
"@babel/helper-validator-identifier" "^7.16.7"
"@babel/template" "^7.16.7"
- "@babel/traverse" "^7.16.7"
- "@babel/types" "^7.16.7"
+ "@babel/traverse" "^7.17.3"
+ "@babel/types" "^7.17.0"
"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.15.4":
version "7.15.4"
@@ -238,12 +260,12 @@
"@babel/traverse" "^7.15.4"
"@babel/types" "^7.15.4"
-"@babel/helper-simple-access@^7.14.8", "@babel/helper-simple-access@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7"
- integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==
+"@babel/helper-simple-access@^7.14.8", "@babel/helper-simple-access@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367"
+ integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==
dependencies:
- "@babel/types" "^7.16.7"
+ "@babel/types" "^7.17.0"
"@babel/helper-skip-transparent-expression-wrappers@^7.14.5":
version "7.15.4"
@@ -259,7 +281,7 @@
dependencies:
"@babel/types" "^7.16.7"
-"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.16.7":
+"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7", "@babel/helper-validator-identifier@^7.16.7":
version "7.16.7"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
@@ -279,14 +301,14 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helpers@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc"
- integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==
+"@babel/helpers@^7.17.8":
+ version "7.17.8"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.8.tgz#288450be8c6ac7e4e44df37bcc53d345e07bc106"
+ integrity sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==
dependencies:
"@babel/template" "^7.16.7"
- "@babel/traverse" "^7.16.7"
- "@babel/types" "^7.16.7"
+ "@babel/traverse" "^7.17.3"
+ "@babel/types" "^7.17.0"
"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.0", "@babel/highlight@^7.16.7":
version "7.16.10"
@@ -302,10 +324,10 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016"
integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7":
- version "7.16.12"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6"
- integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==
+"@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.8":
+ version "7.17.8"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240"
+ integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==
"@babel/plugin-proposal-async-generator-functions@^7.10.1":
version "7.10.1"
@@ -829,7 +851,7 @@
core-js-pure "^3.0.0"
regenerator-runtime "^0.13.4"
-"@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.8.4":
+"@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.13.10", "@babel/runtime@^7.8.4":
version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6"
integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==
@@ -865,19 +887,19 @@
debug "^4.1.0"
globals "^11.1.0"
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.15.4", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7":
- version "7.16.10"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f"
- integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.15.4", "@babel/traverse@^7.17.3":
+ version "7.17.3"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57"
+ integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==
dependencies:
"@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.16.8"
+ "@babel/generator" "^7.17.3"
"@babel/helper-environment-visitor" "^7.16.7"
"@babel/helper-function-name" "^7.16.7"
"@babel/helper-hoist-variables" "^7.16.7"
"@babel/helper-split-export-declaration" "^7.16.7"
- "@babel/parser" "^7.16.10"
- "@babel/types" "^7.16.8"
+ "@babel/parser" "^7.17.3"
+ "@babel/types" "^7.17.0"
debug "^4.1.0"
globals "^11.1.0"
@@ -889,10 +911,10 @@
"@babel/helper-validator-identifier" "^7.14.9"
to-fast-properties "^2.0.0"
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.15.4", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1"
- integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.15.4", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.17.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
+ integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
dependencies:
"@babel/helper-validator-identifier" "^7.16.7"
to-fast-properties "^2.0.0"
@@ -950,19 +972,21 @@
resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e"
integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg==
-"@gitlab/eslint-plugin@11.0.0":
- version "11.0.0"
- resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-11.0.0.tgz#90d71bc0c5f54ac066faba8c6f909b0df761d0bb"
- integrity sha512-5t1eTu/+myitEP68ceKQRRE0S5R1QStlRVykivZFZDxGloCyAq1zE96ZwqsMzDtpfK5fmf1+7yxGw9CPdLUB/A==
+"@gitlab/eslint-plugin@12.0.1":
+ version "12.0.1"
+ resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-12.0.1.tgz#307486721e51cef223cf03dd2bae6d67d3286237"
+ integrity sha512-YVa6Pegiklu22V7jN/cj77E10L2M0aEN3A4UTzbCH57yQOVwyJC+bG33/eqzq175YFYWwnbkCOB22lBMLDizYQ==
dependencies:
- babel-eslint "^10.0.3"
+ "@babel/core" "^7.17.0"
+ "@babel/eslint-parser" "^7.17.0"
+ "@babel/eslint-plugin" "^7.17.7"
eslint-config-airbnb-base "^14.2.1"
eslint-config-prettier "^6.10.0"
eslint-plugin-babel "^5.3.0"
- eslint-plugin-filenames "^1.3.2"
eslint-plugin-import "^2.22.1"
eslint-plugin-jest "^23.8.2"
eslint-plugin-promise "^4.2.1"
+ eslint-plugin-unicorn "^40.1.0"
eslint-plugin-vue "^7.5.0"
lodash "^4.17.21"
vue-eslint-parser "^7.0.0"
@@ -981,15 +1005,15 @@
stylelint-declaration-strict-value "1.8.0"
stylelint-scss "4.1.0"
-"@gitlab/svgs@2.6.0":
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.6.0.tgz#49f020b0a732f5df01138bd21b610a0a940badd6"
- integrity sha512-jI8CHlrriePtUsognRkpZQWVsZe7ZjytmKakeYyU1aKvsnJ4fAeySlVkCAiqKbbZm3T/eeH/6b3jxHn24U0k0Q==
+"@gitlab/svgs@2.8.0":
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.8.0.tgz#b32f3672d9cffa2d59f5edb6828ae931a36d220f"
+ integrity sha512-N1D6q5xKze3HwPMjLnsXMZOPQGX4CT+jEQgZYkB8akVx/rqT/YSZ9pZaxWoRdq1Tiwi9B2ArctopRgNiN8fqdw==
-"@gitlab/ui@37.3.0":
- version "37.3.0"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-37.3.0.tgz#7362ed42964abd049959455101540b8b78b42f5f"
- integrity sha512-eCwXK9d+QdprgIftm/5OAZ/VjG+OdG23xpRlMeXllFigqEcELgnc742nmG7C3JG8Vlm84is7bliBbAQEWBTgbw==
+"@gitlab/ui@38.8.1":
+ version "38.8.1"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-38.8.1.tgz#f4892ffd51c4cacf30cb94ffca31487afdac2b0c"
+ integrity sha512-eTGt+LODmox1GZRkLfFH9/zl4dG9/6ewpYzXvIo1B4uzHz27lhEgVSM57nZRPXmk4o05LQMnm6eelHoBdMX13g==
dependencies:
"@babel/standalone" "^7.0.0"
bootstrap-vue "2.20.1"
@@ -1368,10 +1392,10 @@
source-map "^0.6.1"
write-file-atomic "^3.0.0"
-"@jest/types@^26.5.2":
- version "26.5.2"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.5.2.tgz#44c24f30c8ee6c7f492ead9ec3f3c62a5289756d"
- integrity sha512-QDs5d0gYiyetI8q+2xWdkixVQMklReZr4ltw7GFDtb4fuJIBCE6mzj2LnitGqCuAlLap6wPyb8fpoHgwZz5fdg==
+"@jest/types@^26.5.2", "@jest/types@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e"
+ integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==
dependencies:
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/istanbul-reports" "^3.0.0"
@@ -1379,6 +1403,29 @@
"@types/yargs" "^15.0.0"
chalk "^4.0.0"
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c"
+ integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.11"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec"
+ integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==
+
+"@jridgewell/trace-mapping@^0.3.0":
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3"
+ integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@leichtgewicht/ip-codec@^2.0.1":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz#0300943770e04231041a51bd39f0439b5c7ab4f0"
+ integrity sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==
+
"@miragejs/pretender-node-polyfill@^0.1.0":
version "0.1.2"
resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2"
@@ -1436,15 +1483,15 @@
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590"
integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==
-"@rails/actioncable@6.1.4-6":
- version "6.1.4-6"
- resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.1.4-6.tgz#22dd0f60e634f237f2a19d031f4e7afa26a924b4"
- integrity sha512-cGwo5AWlEg6Q5JeUl2r8cmgaSlJtgR9BOOGF7Yb1PyKOinuWod6PW6UeQLgXf+n2MNiWz+yqldb1m3+Aun/2lg==
+"@rails/actioncable@6.1.4-7":
+ version "6.1.4-7"
+ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.1.4-7.tgz#da60f6c8b3ec8ec5118db877dd2e416d40e0bce6"
+ integrity sha512-ml1ykETFb716oDb/vivA9FNO/+nQe9s46H5Gb+24dIxhLjhYEfMAjFlTG0ASRNpZzGbIi5XMPfNZkdxM3ftK8w==
-"@rails/ujs@6.1.4-6":
- version "6.1.4-6"
- resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.4-6.tgz#244520a1580b5791cebc81471978bc6b3c8966c0"
- integrity sha512-j2ejw0ShVHiDWtq1Yv1PGX/GFCDiXX+5YiUY2Z17eeMJhQkxXeg3maQZkkT5OT/YBOI+jiWqtp03GM1Hdp/arA==
+"@rails/ujs@6.1.4-7":
+ version "6.1.4-7"
+ resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.4-7.tgz#ef0b83ef40f64bc6704e13ae6624236a4a91fa6f"
+ integrity sha512-842WcLh0BErNgGE8rdqNh31VnqGQcklPQ7RXzQfA0ilQNZcU7AO+t576g1m//18Lk8m7cXZ8fIKA1YB41LKWAQ==
"@sentry/browser@5.30.0":
version "5.30.0"
@@ -1851,6 +1898,13 @@
dependencies:
"@types/node" "*"
+"@types/debug@^4.0.0":
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
+ integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==
+ dependencies:
+ "@types/ms" "*"
+
"@types/estree@*":
version "0.0.44"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21"
@@ -1929,6 +1983,14 @@
dependencies:
"@types/istanbul-lib-report" "*"
+"@types/jest@^26.0.24":
+ version "26.0.24"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a"
+ integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==
+ dependencies:
+ jest-diff "^26.0.0"
+ pretty-format "^26.0.0"
+
"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.9"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
@@ -1944,6 +2006,18 @@
resolved "https://registry.yarnpkg.com/@types/lowlight/-/lowlight-0.0.3.tgz#433b03dd63894dde17860063f4c90a688431194b"
integrity sha512-R83q/yPX2nIlo9D3WtSjyUDd57t8s+GVLaL8YIv3k7zMMWpYpOXqjJgrWp80qXUJB/a1t76nTyBpxrv0JNYaEg==
+"@types/mdast@^3.0.0":
+ version "3.0.10"
+ resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af"
+ integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==
+ dependencies:
+ "@types/unist" "*"
+
+"@types/mdurl@^1.0.0":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9"
+ integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==
+
"@types/mime@^1":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
@@ -1959,6 +2033,11 @@
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
+"@types/ms@*":
+ version "0.7.31"
+ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
+ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
+
"@types/node@*", "@types/node@14.17.5":
version "14.17.5"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.5.tgz#b59daf6a7ffa461b5648456ca59050ba8e40ed54"
@@ -1984,6 +2063,11 @@
resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.0.tgz#9ae2106efc443d7c1e26570aa8247828c9c80f11"
integrity sha512-J5D3z703XTDIGQFYXsnU9uRCW9e9mMEFO0Kpe6kykyiboqziru/RlZ0hM2P+PKTG4NHG1SjLrqae/NrV2iJApQ==
+"@types/parse5@^6.0.0":
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb"
+ integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==
+
"@types/prettier@^2.0.0":
version "2.0.2"
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.2.tgz#5bb52ee68d0f8efa9cc0099920e56be6cc4e37f3"
@@ -2121,12 +2205,7 @@
dependencies:
"@types/estree" "*"
-"@types/ungap__global-this@^0.3.1":
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/@types/ungap__global-this/-/ungap__global-this-0.3.1.tgz#18ce9f657da556037a29d50604335614ce703f4c"
- integrity sha512-+/DsiV4CxXl6ZWefwHZDXSe1Slitz21tom38qPCaG0DYCS1NnDPIQDTKcmQ/tvK/edJUKkmuIDBJbmKDiB0r/g==
-
-"@types/unist@*":
+"@types/unist@*", "@types/unist@^2.0.0":
version "2.0.6"
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==
@@ -2138,10 +2217,10 @@
dependencies:
"@types/node" "*"
-"@types/ws@^8.0.0", "@types/ws@^8.2.2":
- version "8.2.2"
- resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21"
- integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==
+"@types/ws@^8.0.0", "@types/ws@^8.5.1":
+ version "8.5.3"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d"
+ integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==
dependencies:
"@types/node" "*"
@@ -2157,11 +2236,6 @@
dependencies:
"@types/yargs-parser" "*"
-"@types/zen-observable@^0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
- integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==
-
"@typescript-eslint/experimental-utils@^2.5.0":
version "2.30.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz#9845e868c01f3aed66472c561d4b6bac44809dd0"
@@ -2185,11 +2259,6 @@
semver "^6.3.0"
tsutils "^3.17.1"
-"@ungap/global-this@^0.4.2":
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/@ungap/global-this/-/global-this-0.4.4.tgz#8a1b2cfcd3e26e079a847daba879308c924dd695"
- integrity sha512-mHkm6FvepJECMNthFuIgpAEFmPOk71UyXuIxYfjytvFTnSDBIz7jmViO+LfHI/AjrazWije0PnSP3+/NlwzqtA==
-
"@vue/component-compiler-utils@^3.1.0":
version "3.1.1"
resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.1.tgz#d4ef8f80292674044ad6211e336a302e4d2a6575"
@@ -2376,26 +2445,26 @@
resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe"
integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==
-"@wry/context@^0.5.2":
- version "0.5.4"
- resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.5.4.tgz#b6c28038872e0a0e1ff14eb40b5bf4cab2ab4e06"
- integrity sha512-/pktJKHUXDr4D6TJqWgudOPJW2Z+Nb+bqk40jufA3uTkLbnCRKdJPiYDIa/c7mfcPH8Hr6O8zjCERpg5Sq04Zg==
+"@wry/context@^0.6.0":
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2"
+ integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw==
dependencies:
- tslib "^1.14.1"
+ tslib "^2.3.0"
-"@wry/equality@^0.3.0":
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.3.3.tgz#1ec8f9af01d40a2eb00d055d9a3173315126c648"
- integrity sha512-pMrKHIgDAWxLDTGsbaVag+USmwZ2+gGrSBrtyGUxp2pxRg1Cad70lI/hd0NTPtJ4zJxN16EQ679U1Rts83AF5g==
+"@wry/equality@^0.5.0":
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.2.tgz#72c8a7a7d884dff30b612f4f8464eba26c080e73"
+ integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA==
dependencies:
- tslib "^1.14.1"
+ tslib "^2.3.0"
-"@wry/trie@^0.2.1":
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.2.2.tgz#99f20f0fcbbcda17006069b155c826cbabfc402f"
- integrity sha512-OxqBB39x6MfHaa2HpMiRMfhuUnQTddD32Ko020eBeJXq87ivX6xnSSnzKHVbA21p7iqBASz8n/07b6W5wW1BVQ==
+"@wry/trie@^0.3.0":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.1.tgz#2279b790f15032f8bcea7fc944d27988e5b3b139"
+ integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw==
dependencies:
- tslib "^1.14.1"
+ tslib "^2.3.0"
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
@@ -2429,13 +2498,13 @@ abort-controller@^3.0.0:
dependencies:
event-target-shim "^5.0.0"
-accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
- integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
dependencies:
- mime-types "~2.1.24"
- negotiator "0.6.2"
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
acorn-globals@^6.0.0:
version "6.0.0"
@@ -2524,10 +2593,10 @@ 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.0, ajv@^8.0.1, ajv@^8.8.0:
- version "8.9.0"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18"
- integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==
+ajv@^8.0.0, ajv@^8.0.1, ajv@^8.10.0, ajv@^8.8.0:
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d"
+ integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==
dependencies:
fast-deep-equal "^3.1.1"
json-schema-traverse "^1.0.0"
@@ -2568,11 +2637,6 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
-ansi-regex@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
- integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
-
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -2600,22 +2664,20 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
-anymatch@^3.0.3, anymatch@~3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
- integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
+anymatch@^3.0.3, anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
-apollo-upload-client@^14.1.3:
- version "14.1.3"
- resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-14.1.3.tgz#91f39011897bd08e99c0de0164e77ad2f3402247"
- integrity sha512-X2T+7pHk5lcaaWnvP9h2tuAAMCzOW6/9juedQ0ZuGp3Ufl81BpDISlCs0o6u29wBV0RRT/QpMU2gbP+3FCfVpQ==
+apollo-upload-client@15.0.0:
+ version "15.0.0"
+ resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-15.0.0.tgz#02ad5a156c146c13f3a93b9658196e5d73a73fca"
+ integrity sha512-7kyBwflLTqRhfsNIIBc94z1Row3WVWOgLm77izAuG3YJEzUbpy8k4775G40j3xlToSey5c7CR/9NOdoDcQw/xg==
dependencies:
- "@apollo/client" "^3.2.5"
- "@babel/runtime" "^7.12.5"
- extract-files "^9.0.0"
+ extract-files "^10.0.0"
aproba@^1.1.1:
version "1.2.0"
@@ -2672,10 +2734,10 @@ array-flatten@1.1.1:
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
-array-flatten@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296"
- integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=
+array-flatten@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
+ integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
array-includes@^3.1.1:
version "3.1.2"
@@ -2811,18 +2873,6 @@ axios@^0.24.0:
dependencies:
follow-redirects "^1.14.4"
-babel-eslint@^10.0.3:
- version "10.0.3"
- resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a"
- integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- "@babel/parser" "^7.0.0"
- "@babel/traverse" "^7.0.0"
- "@babel/types" "^7.0.0"
- eslint-visitor-keys "^1.0.0"
- resolve "^1.12.0"
-
babel-jest@^26.5.2:
version "26.5.2"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.5.2.tgz#164f367a35946c6cf54eaccde8762dec50422250"
@@ -2837,13 +2887,13 @@ babel-jest@^26.5.2:
graceful-fs "^4.2.4"
slash "^3.0.0"
-babel-loader@^8.2.2:
- version "8.2.2"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
- integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==
+babel-loader@^8.2.4:
+ version "8.2.4"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.4.tgz#95f5023c791b2e9e2ca6f67b0984f39c82ff384b"
+ integrity sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==
dependencies:
find-cache-dir "^3.3.1"
- loader-utils "^1.4.0"
+ loader-utils "^2.0.0"
make-dir "^3.1.0"
schema-utils "^2.6.5"
@@ -2921,6 +2971,11 @@ backo2@^1.0.2:
resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
+bail@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d"
+ integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==
+
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -2986,33 +3041,31 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==
-body-parser@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
- integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+body-parser@1.19.2:
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e"
+ integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==
dependencies:
- bytes "3.1.0"
+ bytes "3.1.2"
content-type "~1.0.4"
debug "2.6.9"
depd "~1.1.2"
- http-errors "1.7.2"
+ http-errors "1.8.1"
iconv-lite "0.4.24"
on-finished "~2.3.0"
- qs "6.7.0"
- raw-body "2.4.0"
- type-is "~1.6.17"
+ qs "6.9.7"
+ raw-body "2.4.3"
+ type-is "~1.6.18"
-bonjour@^3.5.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
- integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU=
+bonjour-service@^1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.11.tgz#5418e5c1ac91c89a406f853a942e7892829c0d89"
+ integrity sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==
dependencies:
- array-flatten "^2.1.0"
- deep-equal "^1.0.1"
+ array-flatten "^2.1.2"
dns-equal "^1.0.0"
- dns-txt "^2.0.2"
- multicast-dns "^6.0.1"
- multicast-dns-service-types "^1.1.0"
+ fast-deep-equal "^3.1.3"
+ multicast-dns "^7.2.4"
boolbase@^1.0.0:
version "1.0.0"
@@ -3171,11 +3224,6 @@ buffer-from@^1.0.0:
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"
- resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.0.tgz#f54f647c4f4e25228baa656a2e57e43d5f270982"
- integrity sha1-9U9kfE9OJSKLqmVqLlfkPV8nCYI=
-
buffer-json@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23"
@@ -3203,6 +3251,11 @@ buffer@^5.7.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
+builtin-modules@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887"
+ integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==
+
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"
@@ -3213,10 +3266,10 @@ bytes@3.0.0:
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
-bytes@3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
- integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
cacache@^12.0.2:
version "12.0.3"
@@ -3393,6 +3446,11 @@ char-regex@^1.0.2:
resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+character-entities@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.1.tgz#98724833e1e27990dee0bd0f2b8a859c3476aac7"
+ integrity sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ==
+
charenc@~0.0.1:
version "0.0.2"
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
@@ -3422,20 +3480,20 @@ cheerio@^1.0.0-rc.9:
parse5-htmlparser2-tree-adapter "^6.0.1"
tslib "^2.2.0"
-"chokidar@>=3.0.0 <4.0.0", chokidar@^2.1.8, chokidar@^3.2.2, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.5.3:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8"
- integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==
+"chokidar@>=3.0.0 <4.0.0", chokidar@^2.1.8, chokidar@^3.2.2, chokidar@^3.4.1, chokidar@^3.5.3:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
dependencies:
- anymatch "~3.1.1"
+ anymatch "~3.1.2"
braces "~3.0.2"
- glob-parent "~5.1.0"
+ glob-parent "~5.1.2"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
- readdirp "~3.4.0"
+ readdirp "~3.6.0"
optionalDependencies:
- fsevents "~2.1.2"
+ fsevents "~2.3.2"
chownr@^1.1.1:
version "1.1.3"
@@ -3459,6 +3517,11 @@ ci-info@^2.0.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+ci-info@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2"
+ integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==
+
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
@@ -3477,6 +3540,13 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
+clean-regexp@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7"
+ integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
@@ -3616,22 +3686,27 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
+comma-separated-tokens@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz#d4c25abb679b7751c880be623c1179780fe1dd98"
+ integrity sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==
+
commander@2, commander@^2.19.0, commander@^2.20.0, commander@^2.20.3:
version "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, commander@^7.0.0:
+commander@7, commander@^7.0.0, commander@^7.2.0:
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.0.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
-commander@~9.0.0:
+commander@^9.0.0, commander@~9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-9.0.0.tgz#86d58f24ee98126568936bd1d3574e0308a99a40"
integrity sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==
@@ -3760,12 +3835,12 @@ contains-path@^0.1.0:
resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
-content-disposition@0.5.3:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
- integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
dependencies:
- safe-buffer "5.1.2"
+ safe-buffer "5.2.1"
content-type@~1.0.4:
version "1.0.4"
@@ -3784,10 +3859,10 @@ cookie-signature@1.0.6:
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
-cookie@0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
- integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+cookie@0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
+ integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
copy-concurrently@^1.0.0:
version "1.0.5"
@@ -3843,10 +3918,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.21.1:
- version "3.21.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94"
- integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==
+core-js@^3.22.0:
+ version "3.22.0"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.0.tgz#b52007870c5e091517352e833b77f0b2d2b259f3"
+ integrity sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==
core-js@~2.3.0:
version "2.3.0"
@@ -4664,10 +4739,10 @@ debug@^3.1.0, debug@^3.1.1, debug@^3.2.6, debug@^3.2.7:
dependencies:
ms "^2.1.1"
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
- integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
@@ -4694,6 +4769,13 @@ deckar01-task_list@^2.3.1:
resolved "https://registry.yarnpkg.com/deckar01-task_list/-/deckar01-task_list-2.3.1.tgz#f3ffd5319d7b9e27c596dc8d823b13f617ed7db7"
integrity sha512-046BmNx8e1Yia07SlSsyWb1h7wlGibcesRaw6Szw2qVppoe/EPtckFDRTY9P/laWiW3xjsfNLE1nOBOTAMKEWQ==
+decode-named-character-reference@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.1.tgz#57b2bd9112659cacbc449d3577d7dadb8e1f3d1b"
+ integrity sha512-YV/0HQHreRwKb7uBopyIkLG17jG6Sv2qUchk9qSoVJ2f+flwRsPNBO0hAnjt6mTNYUT+vw9Gy2ihXg4sUWPi2w==
+ dependencies:
+ character-entities "^2.0.0"
+
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -4772,20 +4854,6 @@ define-property@^2.0.2:
is-descriptor "^1.0.2"
isobject "^3.0.1"
-del@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952"
- integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==
- dependencies:
- globby "^11.0.1"
- graceful-fs "^4.2.4"
- is-glob "^4.0.1"
- is-path-cwd "^2.2.0"
- is-path-inside "^3.0.2"
- p-map "^4.0.0"
- rimraf "^3.0.2"
- slash "^3.0.0"
-
delaunator@5:
version "5.0.0"
resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b"
@@ -4813,6 +4881,11 @@ depd@~1.1.2:
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+dequal@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d"
+ integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==
+
des.js@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
@@ -4836,10 +4909,10 @@ detect-node@^2.0.4:
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
-diff-sequences@^26.5.0:
- version "26.5.0"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.5.0.tgz#ef766cf09d43ed40406611f11c6d8d9dd8b2fefd"
- integrity sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==
+diff-sequences@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
+ integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
diff-sequences@^27.4.0:
version "27.4.0"
@@ -4856,6 +4929,11 @@ diff@^4.0.1:
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+diff@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+ integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
diffie-hellman@^5.0.0:
version "5.0.2"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
@@ -4877,20 +4955,12 @@ dns-equal@^1.0.0:
resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
-dns-packet@^1.0.1:
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f"
- integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==
- dependencies:
- ip "^1.1.0"
- safe-buffer "^5.0.1"
-
-dns-txt@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
- integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=
+dns-packet@^5.2.2:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d"
+ integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==
dependencies:
- buffer-indexof "^1.0.0"
+ "@leichtgewicht/ip-codec" "^2.0.1"
docdash@^1.0.2:
version "1.0.2"
@@ -5313,16 +5383,6 @@ eslint-plugin-babel@^5.3.0:
dependencies:
eslint-rule-composer "^0.3.0"
-eslint-plugin-filenames@^1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz#7094f00d7aefdd6999e3ac19f72cea058e590cf7"
- integrity sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==
- dependencies:
- lodash.camelcase "4.3.0"
- lodash.kebabcase "4.1.1"
- lodash.snakecase "4.1.1"
- lodash.upperfirst "4.3.1"
-
eslint-plugin-import@^2.22.1:
version "2.22.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702"
@@ -5359,6 +5419,26 @@ eslint-plugin-promise@^4.2.1:
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a"
integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==
+eslint-plugin-unicorn@^40.1.0:
+ version "40.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-40.1.0.tgz#48975360e39d23df726e4b33e8dd5d650e184832"
+ integrity sha512-y5doK2DF9Sr5AqKEHbHxjFllJ167nKDRU01HDcWyv4Tnmaoe9iNxMrBnaybZvWZUaE3OC5Unu0lNIevYamloig==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.15.7"
+ ci-info "^3.3.0"
+ clean-regexp "^1.0.0"
+ eslint-utils "^3.0.0"
+ esquery "^1.4.0"
+ indent-string "^4.0.0"
+ is-builtin-module "^3.1.0"
+ lodash "^4.17.21"
+ pluralize "^8.0.0"
+ read-pkg-up "^7.0.1"
+ regexp-tree "^0.1.24"
+ safe-regex "^2.1.1"
+ semver "^7.3.5"
+ strip-indent "^3.0.0"
+
eslint-plugin-vue@^7.5.0:
version "7.5.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.5.0.tgz#cc6d983eb22781fa2440a7573cf39af439bb5725"
@@ -5397,15 +5477,22 @@ eslint-utils@^2.0.0, eslint-utils@^2.1.0:
dependencies:
eslint-visitor-keys "^1.1.0"
-eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
-eslint-visitor-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
- integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
+eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
eslint@7.32.0:
version "7.32.0"
@@ -5633,17 +5720,17 @@ expect@^26.5.2:
jest-message-util "^26.5.2"
jest-regex-util "^26.0.0"
-express@^4.17.1:
- version "4.17.1"
- resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
- integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+express@^4.17.3:
+ version "4.17.3"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1"
+ integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==
dependencies:
- accepts "~1.3.7"
+ accepts "~1.3.8"
array-flatten "1.1.1"
- body-parser "1.19.0"
- content-disposition "0.5.3"
+ body-parser "1.19.2"
+ content-disposition "0.5.4"
content-type "~1.0.4"
- cookie "0.4.0"
+ cookie "0.4.2"
cookie-signature "1.0.6"
debug "2.6.9"
depd "~1.1.2"
@@ -5657,13 +5744,13 @@ express@^4.17.1:
on-finished "~2.3.0"
parseurl "~1.3.3"
path-to-regexp "0.1.7"
- proxy-addr "~2.0.5"
- qs "6.7.0"
+ proxy-addr "~2.0.7"
+ qs "6.9.7"
range-parser "~1.2.1"
- safe-buffer "5.1.2"
- send "0.17.1"
- serve-static "1.14.1"
- setprototypeof "1.1.1"
+ safe-buffer "5.2.1"
+ send "0.17.2"
+ serve-static "1.14.2"
+ setprototypeof "1.2.0"
statuses "~1.5.0"
type-is "~1.6.18"
utils-merge "1.0.1"
@@ -5684,7 +5771,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
-extend@~3.0.2:
+extend@^3.0.0, extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
@@ -5708,10 +5795,10 @@ extract-files@11.0.0:
resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a"
integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==
-extract-files@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a"
- integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==
+extract-files@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-10.0.0.tgz#228b1da1d910971cf8d7f1ed259653c6001ba5ad"
+ integrity sha512-4KXYOSf8SlMlQCj94Ygy89xIZU2GTs0HU2Nz9mG2/F5TKsHyq/3sDWGjHgHmfw9RhXF3hO+pBKyC6JfIHD52bw==
extract-from-css@^0.4.4:
version "0.4.4"
@@ -5955,10 +6042,10 @@ format@^0.2.0:
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
-forwarded@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
- integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
fragment-cache@^0.2.1:
version "0.2.1"
@@ -6007,10 +6094,10 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-fsevents@^2.1.2, fsevents@~2.1.2:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
- integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+fsevents@^2.1.2, fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
function-bind@^1.1.1:
version "1.1.1"
@@ -6117,7 +6204,7 @@ gettext-extractor@^3.5.3:
pofile "1.0.x"
typescript "2 - 4"
-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.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -6261,17 +6348,17 @@ graphql-sse@^1.0.1:
resolved "https://registry.yarnpkg.com/graphql-sse/-/graphql-sse-1.0.4.tgz#051598b0e06c225327aac659f19fcc18bcaa0191"
integrity sha512-oB43ifRcEdElgep9jTP9qsj5cJ7Ny/1tAFyIl1W3A0hXRRg/P71tUHzMFBrRkEsJ9IA7MTp+RKSJfh52QR6PBQ==
-graphql-tag@^2.11.0, graphql-tag@^2.12.0:
- version "2.12.1"
- resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.1.tgz#b065ef885e4800e4afd0842811b718a205f4aa58"
- integrity sha512-LPewEE1vzGkHnCO8zdOGogKsHHBdtpGyihow1UuMwp6RnZa0lAS7NcbvltLOuo4pi5diQCPASAXZkQq44ffixA==
+graphql-tag@^2.11.0, graphql-tag@^2.12.3:
+ version "2.12.6"
+ resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1"
+ integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==
dependencies:
- tslib "^1.14.1"
+ tslib "^2.1.0"
graphql-ws@^5.4.1:
- version "5.5.3"
- resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.5.3.tgz#1495c1c1ad7dcd3cf76a46db629810a55d3b2d18"
- integrity sha512-Okp3gE3vq9OoeqsYVbmzKvPcvlinKNXrfVajH7D3ul1UdCg2+K2zVYbWKmqxehkAZ+GKVfngK5fzyXSsfpe+pA==
+ version "5.6.3"
+ resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.6.3.tgz#32321594a7b744755df992f24afccc84143b4b7d"
+ integrity sha512-ZolWOi6bzI35ovGROCZROB9nDbwZiJdIsaPdzW/jkICCGNb3qL/33IONY/yQiBa+Je2uA11HfY4Uxse4+/ePYA==
graphql@^15.7.2:
version "15.7.2"
@@ -6406,6 +6493,80 @@ hash.js@^1.0.0, hash.js@^1.0.3:
inherits "^2.0.3"
minimalistic-assert "^1.0.0"
+hast-to-hyperscript@^10.0.0:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-10.0.1.tgz#3decd7cb4654bca8883f6fcbd4fb3695628c4296"
+ integrity sha512-dhIVGoKCQVewFi+vz3Vt567E4ejMppS1haBRL6TEmeLeJVB1i/FJIIg/e6s1Bwn0g5qtYojHEKvyGA+OZuyifw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ comma-separated-tokens "^2.0.0"
+ property-information "^6.0.0"
+ space-separated-tokens "^2.0.0"
+ style-to-object "^0.3.0"
+ unist-util-is "^5.0.0"
+ web-namespaces "^2.0.0"
+
+hast-util-from-parse5@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz#c129dd3a24dd8a867ab8a029ca47e27aa54864b7"
+ integrity sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/parse5" "^6.0.0"
+ "@types/unist" "^2.0.0"
+ hastscript "^7.0.0"
+ property-information "^6.0.0"
+ vfile "^5.0.0"
+ vfile-location "^4.0.0"
+ web-namespaces "^2.0.0"
+
+hast-util-parse-selector@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz#a519e27e8b61bd5a98fad494ed06131ce68d9c3f"
+ integrity sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==
+ dependencies:
+ "@types/hast" "^2.0.0"
+
+hast-util-raw@^7.2.0:
+ version "7.2.1"
+ resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.1.tgz#6e964cee098dbdd93d1b77cf180b5827d48048ab"
+ integrity sha512-wgtppqXVdXzkDXDFclLLdAyVUJSKMYYi6LWIAbA8oFqEdwksYIcPGM3RkKV1Dfn5GElvxhaOCs0jmCOMayxd3A==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/parse5" "^6.0.0"
+ hast-util-from-parse5 "^7.0.0"
+ hast-util-to-parse5 "^7.0.0"
+ html-void-elements "^2.0.0"
+ parse5 "^6.0.0"
+ unist-util-position "^4.0.0"
+ unist-util-visit "^4.0.0"
+ vfile "^5.0.0"
+ web-namespaces "^2.0.0"
+ zwitch "^2.0.0"
+
+hast-util-to-parse5@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.0.0.tgz#a39808e69005d10afeed1866029a1fb137df3f7c"
+ integrity sha512-YHiS6aTaZ3N0Q3nxaY/Tj98D6kM8QX5Q8xqgg8G45zR7PvWnPGPP0vcKCgb/moIydEJ/QWczVrX0JODCVeoV7A==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/parse5" "^6.0.0"
+ hast-to-hyperscript "^10.0.0"
+ property-information "^6.0.0"
+ web-namespaces "^2.0.0"
+ zwitch "^2.0.0"
+
+hastscript@^7.0.0:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.0.2.tgz#d811fc040817d91923448a28156463b2e40d590a"
+ integrity sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ comma-separated-tokens "^2.0.0"
+ hast-util-parse-selector "^3.0.0"
+ property-information "^6.0.0"
+ space-separated-tokens "^2.0.0"
+
he@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
@@ -6481,6 +6642,11 @@ html-tags@^3.1.0:
resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
+html-void-elements@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f"
+ integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
+
htmlparser2@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
@@ -6501,16 +6667,16 @@ http-deceiver@^1.2.7:
resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=
-http-errors@1.7.2, http-errors@~1.7.2:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
- integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+http-errors@1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
+ integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==
dependencies:
depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.1"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
statuses ">= 1.5.0 < 2"
- toidentifier "1.0.0"
+ toidentifier "1.0.1"
http-errors@~1.6.2:
version "1.6.2"
@@ -6535,10 +6701,10 @@ http-proxy-agent@^2.1.0:
agent-base "4"
debug "3.1.0"
-http-proxy-middleware@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz#94d7593790aad6b3de48164f13792262f656c332"
- integrity sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==
+http-proxy-middleware@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a"
+ integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==
dependencies:
"@types/http-proxy" "^1.17.8"
http-proxy "^1.18.1"
@@ -6707,7 +6873,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -6732,6 +6898,11 @@ ini@~2.0.0:
resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
+inline-style-parser@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1"
+ integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==
+
"internmap@1 - 2":
version "2.0.3"
resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
@@ -6759,17 +6930,7 @@ ip-regex@^2.1.0:
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
-ip@^1.1.0:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
- integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
-
-ipaddr.js@1.9.0:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65"
- integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
-
-ipaddr.js@^1.9.1:
+ipaddr.js@1.9.1, ipaddr.js@^1.9.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
@@ -6810,6 +6971,18 @@ is-buffer@^1.1.5, is-buffer@~1.1.1:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+is-buffer@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-builtin-module@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.1.0.tgz#6fdb24313b1c03b75f8b9711c0feb8c30b903b00"
+ integrity sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==
+ dependencies:
+ builtin-modules "^3.0.0"
+
is-callable@^1.1.4, is-callable@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
@@ -6945,12 +7118,7 @@ is-obj@^2.0.0:
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
-is-path-cwd@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
- integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
-
-is-path-inside@^3.0.1, is-path-inside@^3.0.2:
+is-path-inside@^3.0.1:
version "3.0.3"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
@@ -6965,6 +7133,11 @@ is-plain-obj@^3.0.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7"
integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==
+is-plain-obj@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22"
+ integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==
+
is-plain-object@^2.0.3, is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
@@ -7201,15 +7374,15 @@ jest-config@^26.5.2:
micromatch "^4.0.2"
pretty-format "^26.5.2"
-jest-diff@^26.5.2:
- version "26.5.2"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.5.2.tgz#8e26cb32dc598e8b8a1b9deff55316f8313c8053"
- integrity sha512-HCSWDUGwsov5oTlGzrRM+UPJI/Dpqi9jzeV0fdRNi3Ch5bnoXhnyJMmVg2juv9081zLIy3HGPI5mcuGgXM2xRA==
+jest-diff@^26.0.0, jest-diff@^26.5.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394"
+ integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==
dependencies:
chalk "^4.0.0"
- diff-sequences "^26.5.0"
+ diff-sequences "^26.6.2"
jest-get-type "^26.3.0"
- pretty-format "^26.5.2"
+ pretty-format "^26.6.2"
jest-diff@^27.4.6:
version "27.4.6"
@@ -7828,6 +8001,11 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+kleur@^4.0.3:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d"
+ integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==
+
known-css-properties@^0.24.0:
version "0.24.0"
resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.24.0.tgz#19aefd85003ae5698a5560d2b55135bf5432155c"
@@ -7907,7 +8085,7 @@ loader-runner@^2.4.0:
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
-loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
+loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
@@ -7953,7 +8131,7 @@ lodash.assign@^4.2.0:
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
-lodash.camelcase@4.3.0, lodash.camelcase@^4.3.0:
+lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
@@ -8023,11 +8201,6 @@ lodash.isplainobject@^4.0.6:
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
-lodash.kebabcase@4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
- integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
-
lodash.lowercase@4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.lowercase/-/lodash.lowercase-4.3.0.tgz#46515aced4acb0b7093133333af068e4c3b14e9d"
@@ -8058,7 +8231,7 @@ lodash.pick@^4.4.0:
resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=
-lodash.snakecase@4.1.1, lodash.snakecase@^4.1.1:
+lodash.snakecase@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d"
integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=
@@ -8083,11 +8256,6 @@ lodash.uniqby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302"
integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=
-lodash.upperfirst@4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce"
- integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=
-
lodash.values@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347"
@@ -8279,7 +8447,55 @@ md5@^2.2.1:
crypt "~0.0.1"
is-buffer "~1.1.1"
-mdurl@^1.0.1:
+mdast-util-definitions@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz#b6d10ef00a3c4cf191e8d9a5fa58d7f4a366f817"
+ integrity sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.0.0"
+ unist-util-visit "^3.0.0"
+
+mdast-util-from-markdown@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz#84df2924ccc6c995dec1e2368b2b208ad0a76268"
+ integrity sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.0.0"
+ decode-named-character-reference "^1.0.0"
+ mdast-util-to-string "^3.1.0"
+ micromark "^3.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-decode-string "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ unist-util-stringify-position "^3.0.0"
+ uvu "^0.5.0"
+
+mdast-util-to-hast@^12.1.0:
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.1.1.tgz#89a2bb405eaf3b05eb8bf45157678f35eef5dbca"
+ integrity sha512-qE09zD6ylVP14jV4mjLIhDBOrpFdShHZcEsYvvKGABlr9mGbV7mTlRWdoFxL/EYSTNDiC9GZXy7y8Shgb9Dtzw==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/mdast" "^3.0.0"
+ "@types/mdurl" "^1.0.0"
+ mdast-util-definitions "^5.0.0"
+ mdurl "^1.0.0"
+ micromark-util-sanitize-uri "^1.0.0"
+ unist-builder "^3.0.0"
+ unist-util-generated "^2.0.0"
+ unist-util-position "^4.0.0"
+ unist-util-visit "^4.0.0"
+
+mdast-util-to-string@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9"
+ integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==
+
+mdurl@^1.0.0, mdurl@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
@@ -8382,6 +8598,201 @@ methods@~1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+micromark-core-commonmark@^1.0.1:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad"
+ integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==
+ dependencies:
+ decode-named-character-reference "^1.0.0"
+ micromark-factory-destination "^1.0.0"
+ micromark-factory-label "^1.0.0"
+ micromark-factory-space "^1.0.0"
+ micromark-factory-title "^1.0.0"
+ micromark-factory-whitespace "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-chunked "^1.0.0"
+ micromark-util-classify-character "^1.0.0"
+ micromark-util-html-tag-name "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-resolve-all "^1.0.0"
+ micromark-util-subtokenize "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.1"
+ uvu "^0.5.0"
+
+micromark-factory-destination@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e"
+ integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-factory-label@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137"
+ integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ uvu "^0.5.0"
+
+micromark-factory-space@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633"
+ integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-factory-title@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f"
+ integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==
+ dependencies:
+ micromark-factory-space "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ uvu "^0.5.0"
+
+micromark-factory-whitespace@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c"
+ integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==
+ dependencies:
+ micromark-factory-space "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-character@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86"
+ integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-chunked@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06"
+ integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-classify-character@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20"
+ integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-combine-extensions@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5"
+ integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==
+ dependencies:
+ micromark-util-chunked "^1.0.0"
+ micromark-util-types "^1.0.0"
+
+micromark-util-decode-numeric-character-reference@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946"
+ integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-decode-string@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02"
+ integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==
+ dependencies:
+ decode-named-character-reference "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-encode@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383"
+ integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==
+
+micromark-util-html-tag-name@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz#75737e92fef50af0c6212bd309bc5cb8dbd489ed"
+ integrity sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==
+
+micromark-util-normalize-identifier@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828"
+ integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==
+ dependencies:
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-resolve-all@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88"
+ integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==
+ dependencies:
+ micromark-util-types "^1.0.0"
+
+micromark-util-sanitize-uri@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz#27dc875397cd15102274c6c6da5585d34d4f12b2"
+ integrity sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==
+ dependencies:
+ micromark-util-character "^1.0.0"
+ micromark-util-encode "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+
+micromark-util-subtokenize@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105"
+ integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==
+ dependencies:
+ micromark-util-chunked "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.0"
+ uvu "^0.5.0"
+
+micromark-util-symbol@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e"
+ integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==
+
+micromark-util-types@^1.0.0, micromark-util-types@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20"
+ integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==
+
+micromark@^3.0.0:
+ version "3.0.10"
+ resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.0.10.tgz#1eac156f0399d42736458a14b0ca2d86190b457c"
+ integrity sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==
+ dependencies:
+ "@types/debug" "^4.0.0"
+ debug "^4.0.0"
+ decode-named-character-reference "^1.0.0"
+ micromark-core-commonmark "^1.0.1"
+ micromark-factory-space "^1.0.0"
+ micromark-util-character "^1.0.0"
+ micromark-util-chunked "^1.0.0"
+ micromark-util-combine-extensions "^1.0.0"
+ micromark-util-decode-numeric-character-reference "^1.0.0"
+ micromark-util-encode "^1.0.0"
+ micromark-util-normalize-identifier "^1.0.0"
+ micromark-util-resolve-all "^1.0.0"
+ micromark-util-sanitize-uri "^1.0.0"
+ micromark-util-subtokenize "^1.0.0"
+ micromark-util-symbol "^1.0.0"
+ micromark-util-types "^1.0.1"
+ uvu "^0.5.0"
+
micromatch@^3.1.10, micromatch@^3.1.4:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -8417,17 +8828,17 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
-mime-db@1.51.0, "mime-db@>= 1.40.0 < 2":
- version "1.51.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
- integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+mime-db@1.52.0, "mime-db@>= 1.40.0 < 2":
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
- version "2.1.34"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
- integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
- mime-db "1.51.0"
+ mime-db "1.52.0"
mime@1.6.0:
version "1.6.0"
@@ -8642,33 +9053,33 @@ move-concurrently@^1.0.1:
rimraf "^2.5.4"
run-queue "^1.0.3"
+mri@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
+ integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
+
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-ms@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
- integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
-
-ms@2.1.2, ms@^2.1.1:
+ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-multicast-dns-service-types@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
- integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=
+ms@2.1.3, ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-multicast-dns@^6.0.1:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde"
- integrity sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=
+multicast-dns@^7.2.4:
+ version "7.2.4"
+ resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.4.tgz#cf0b115c31e922aeb20b64e6556cbeb34cf0dd19"
+ integrity sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==
dependencies:
- dns-packet "^1.0.1"
- thunky "^0.1.0"
+ dns-packet "^5.2.2"
+ thunky "^1.0.2"
nanoid@^3.1.30:
version "3.2.0"
@@ -8697,10 +9108,10 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-negotiator@0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
- integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
neo-async@^2.5.0, neo-async@^2.6.1:
version "2.6.2"
@@ -8724,10 +9135,10 @@ node-fetch@^2.6.1, node-fetch@^2.6.5:
dependencies:
whatwg-url "^5.0.0"
-node-forge@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c"
- integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==
+node-forge@^1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
+ integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
node-int64@^0.4.0:
version "0.4.0"
@@ -9002,13 +9413,13 @@ opener@^1.5.2:
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
-optimism@^0.14.0:
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.14.0.tgz#256fb079a3428585b40a3a8462f907e0abd2fc49"
- integrity sha512-ygbNt8n4DOCVpkwiLF+IrKKeNHOjtr9aXLWGP9HNJGoblSGsnVbJLstcH6/nE9Xy5ZQtlkSioFQNnthmENW6FQ==
+optimism@^0.16.1:
+ version "0.16.1"
+ resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d"
+ integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg==
dependencies:
- "@wry/context" "^0.5.2"
- "@wry/trie" "^0.2.1"
+ "@wry/context" "^0.6.0"
+ "@wry/trie" "^0.3.0"
optionator@^0.8.1:
version "0.8.3"
@@ -9376,6 +9787,11 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
+pluralize@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
+
pofile@1.0.x:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pofile/-/pofile-1.0.11.tgz#35aff58c17491d127a07336d5522ebc9df57c954"
@@ -9530,15 +9946,15 @@ prettier@^1.18.2:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
-pretty-format@^26.4.2, pretty-format@^26.5.2:
- version "26.5.2"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.5.2.tgz#5d896acfdaa09210683d34b6dc0e6e21423cd3e1"
- integrity sha512-VizyV669eqESlkOikKJI8Ryxl/kPpbdLwNdPs2GrbQs18MpySB5S0Yo0N7zkg2xTRiFq4CFw8ct5Vg4a0xP0og==
+pretty-format@^26.0.0, pretty-format@^26.4.2, pretty-format@^26.5.2, pretty-format@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
+ integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==
dependencies:
- "@jest/types" "^26.5.2"
+ "@jest/types" "^26.6.2"
ansi-regex "^5.0.0"
ansi-styles "^4.0.0"
- react-is "^16.12.0"
+ react-is "^17.0.1"
pretty-format@^27.4.6:
version "27.4.6"
@@ -9612,6 +10028,11 @@ prop-types@^15.7.2:
object-assign "^4.1.1"
react-is "^16.8.1"
+property-information@^6.0.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.1.tgz#5ca85510a3019726cb9afed4197b7b8ac5926a22"
+ integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==
+
prosemirror-commands@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.2.1.tgz#eae0cb714df695260659b78ff5d201d3a037e50d"
@@ -9657,10 +10078,10 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.1.5:
prosemirror-state "^1.0.0"
w3c-keyname "^2.2.0"
-prosemirror-markdown@1.7.1:
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.7.1.tgz#811a4846da1b3bb661ceb4b37efb89cc4f0cd4b8"
- integrity sha512-d1lNRPlbwuncErkR/fv2n3ZEhAoS+0udByM2mZkyDHeY3ux3bUnj7J/ep1XS0FiXUjffixTKI0IAax3H82JbEg==
+prosemirror-markdown@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.8.0.tgz#4ae430470f9e433d6fb9d1e981842d7e4f664f69"
+ integrity sha512-RxGyM8dqdmlkYpM3PY/C5JBputv2xeKLNRqFpN04TtFlR9McN9Tmpf8DaP6HblfaZ8RofdUtQW+ghdArjANLvQ==
dependencies:
markdown-it "^12.0.0"
prosemirror-model "^1.0.0"
@@ -9722,10 +10143,10 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor
dependencies:
prosemirror-model "^1.0.0"
-prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.23.6, prosemirror-view@^1.23.7:
- version "1.23.7"
- resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.23.7.tgz#f003af94445ef456e397c18cf4bb995e7072097f"
- integrity sha512-ugY+g/4UI2Ree1zzdvbyQWF2KpbFa7kxKMLHaEJcxiPaErnZiD5wZFqIgFinc7fY2v/QM3DLnJ++2I45ULRdrg==
+prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.23.10, prosemirror-view@^1.23.6:
+ version "1.23.10"
+ resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.23.10.tgz#a3fb6a7c780c8cd84488fdd451c23becab9dbefb"
+ integrity sha512-/p8Orb1VeJEbf7Z/BltU9GMWADZRqKlna6TlQGK1snJ6fTdLRC4f4yF2MgNK4OMQjmAwJISUtEp5+Vu5CSbR1w==
dependencies:
prosemirror-model "^1.16.0"
prosemirror-state "^1.0.0"
@@ -9736,13 +10157,13 @@ proto-list@~1.2.1:
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
-proxy-addr@~2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
- integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
dependencies:
- forwarded "~0.1.2"
- ipaddr.js "1.9.0"
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
prr@~1.0.1:
version "1.0.1"
@@ -9835,10 +10256,10 @@ purgecss@^4.0.3:
postcss "^8.2.1"
postcss-selector-parser "^6.0.2"
-qs@6.7.0:
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
- integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+qs@6.9.7:
+ version "6.9.7"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe"
+ integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==
qs@~6.5.2:
version "6.5.2"
@@ -9892,13 +10313,13 @@ raphael@^2.2.7:
dependencies:
eve-raphael "0.5.0"
-raw-body@2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
- integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+raw-body@2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c"
+ integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==
dependencies:
- bytes "3.1.0"
- http-errors "1.7.2"
+ bytes "3.1.2"
+ http-errors "1.8.1"
iconv-lite "0.4.24"
unpipe "1.0.0"
@@ -9920,7 +10341,7 @@ rc@^1.2.8:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1:
+react-is@^16.7.0, react-is@^16.8.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -10000,10 +10421,10 @@ readable-stream@~2.0.6:
string_decoder "~0.10.x"
util-deprecate "~1.0.1"
-readdirp@~3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
- integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
dependencies:
picomatch "^2.2.1"
@@ -10055,6 +10476,11 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
+regexp-tree@^0.1.24, regexp-tree@~0.1.1:
+ version "0.1.24"
+ resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d"
+ integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==
+
regexpp@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
@@ -10098,6 +10524,34 @@ regjsparser@^0.6.4:
dependencies:
jsesc "~0.5.0"
+rehype-raw@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-6.1.1.tgz#81bbef3793bd7abacc6bf8335879d1b6c868c9d4"
+ integrity sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ hast-util-raw "^7.2.0"
+ unified "^10.0.0"
+
+remark-parse@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775"
+ integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ mdast-util-from-markdown "^1.0.0"
+ unified "^10.0.0"
+
+remark-rehype@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279"
+ integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/mdast" "^3.0.0"
+ mdast-util-to-hast "^12.1.0"
+ unified "^10.0.0"
+
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -10320,11 +10774,23 @@ rw@1:
resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=
+sade@^1.7.3:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701"
+ integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==
+ dependencies:
+ mri "^1.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"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+safe-buffer@5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -10332,6 +10798,13 @@ safe-regex@^1.1.0:
dependencies:
ret "~0.1.10"
+safe-regex@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2"
+ integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==
+ dependencies:
+ regexp-tree "~0.1.1"
+
"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"
@@ -10436,12 +10909,12 @@ select@^1.1.2:
resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
-selfsigned@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.0.tgz#e927cd5377cbb0a1075302cff8df1042cc2bce5b"
- integrity sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==
+selfsigned@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56"
+ integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==
dependencies:
- node-forge "^1.2.0"
+ node-forge "^1"
semver-diff@^3.1.1:
version "3.1.1"
@@ -10465,17 +10938,17 @@ 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, semver@^7.3.4, semver@^7.3.5:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
dependencies:
lru-cache "^6.0.0"
-send@0.17.1:
- version "0.17.1"
- resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
- integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+send@0.17.2:
+ version "0.17.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820"
+ integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==
dependencies:
debug "2.6.9"
depd "~1.1.2"
@@ -10484,9 +10957,9 @@ send@0.17.1:
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
- http-errors "~1.7.2"
+ http-errors "1.8.1"
mime "1.6.0"
- ms "2.1.1"
+ ms "2.1.3"
on-finished "~2.3.0"
range-parser "~1.2.1"
statuses "~1.5.0"
@@ -10523,15 +10996,15 @@ serve-index@^1.9.1:
mime-types "~2.1.17"
parseurl "~1.3.2"
-serve-static@1.14.1:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
- integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+serve-static@1.14.2:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa"
+ integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==
dependencies:
encodeurl "~1.0.2"
escape-html "~1.0.3"
parseurl "~1.3.3"
- send "0.17.1"
+ send "0.17.2"
set-blocking@^2.0.0:
version "2.0.0"
@@ -10558,10 +11031,10 @@ setprototypeof@1.0.3:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=
-setprototypeof@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
- integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
sha.js@^2.4.0, sha.js@^2.4.8:
version "2.4.10"
@@ -10754,6 +11227,11 @@ source-map@^0.7.3:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+space-separated-tokens@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz#43193cec4fb858a2ce934b7f98b7f2c18107098b"
+ integrity sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==
+
spdx-correct@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
@@ -10820,11 +11298,6 @@ sprintf-js@~1.0.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-sql.js@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/sql.js/-/sql.js-0.4.0.tgz#23be9635520eb0ff43a741e7e830397266e88445"
- integrity sha1-I76WNVIOsP9Dp0Hn6DA5cmbohEU=
-
sshpk@^1.7.0:
version "1.16.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
@@ -10989,13 +11462,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
dependencies:
ansi-regex "^5.0.1"
-strip-ansi@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
- integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
- dependencies:
- ansi-regex "^6.0.1"
-
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -11046,6 +11512,13 @@ style-search@^0.1.0:
resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
+style-to-object@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46"
+ integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==
+ dependencies:
+ inline-style-parser "0.1.1"
+
stylelint-declaration-strict-value@1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.8.0.tgz#d14f368d5974085896d6573cab7c82ad4f415f57"
@@ -11116,7 +11589,7 @@ stylis@^4.0.10:
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240"
integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==
-subscriptions-transport-ws@0.11.0, subscriptions-transport-ws@^0.11.0:
+subscriptions-transport-ws@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.0.tgz#baf88f050cba51d52afe781de5e81b3c31f89883"
integrity sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ==
@@ -11169,10 +11642,10 @@ symbol-observable@^1.0.4:
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
-symbol-observable@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a"
- integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==
+symbol-observable@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205"
+ integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==
symbol-tree@^3.2.4:
version "3.2.4"
@@ -11314,10 +11787,10 @@ through2@^2.0.0:
readable-stream "~2.3.6"
xtend "~4.0.1"
-thunky@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e"
- integrity sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=
+thunky@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
+ integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
timeago.js@^4.0.2:
version "4.0.2"
@@ -11405,10 +11878,10 @@ toggle-selection@^1.0.6:
resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI=
-toidentifier@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
- integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
totalist@^1.0.0:
version "1.1.0"
@@ -11456,14 +11929,17 @@ trim-newlines@^3.0.0:
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
-ts-invariant@^0.6.0:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.6.1.tgz#eb4c52b45daaca8367abbfd6cff998ea871d592d"
- integrity sha512-QQgN33g8E8yrdDuH29HASveLtbzMnRRgWh0i/JNTW4+zcLsdIOnfsgEDi/NKx4UckQyuMFt9Ujm6TWLWQ58Kvg==
+trough@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876"
+ integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==
+
+ts-invariant@^0.9.4:
+ version "0.9.4"
+ resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.4.tgz#42ac6c791aade267dd9dc65276549df5c5d71cac"
+ integrity sha512-63jtX/ZSwnUNi/WhXjnK8kz4cHHpYS60AnmA6ixz17l7E12a5puCWFlNpkne5Rl0J8TBPVHpGjsj4fxs8ObVLQ==
dependencies:
- "@types/ungap__global-this" "^0.3.1"
- "@ungap/global-this" "^0.4.2"
- tslib "^1.9.3"
+ tslib "^2.1.0"
ts-node@^9:
version "9.1.1"
@@ -11487,12 +11963,12 @@ tsconfig-paths@^3.9.0:
minimist "^1.2.0"
strip-bom "^3.0.0"
-tslib@2.3.0, tslib@^2, tslib@^2.2.0, tslib@~2.3.0:
+tslib@2.3.0, tslib@^2, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
-tslib@^1.10.0, tslib@^1.14.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
+tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
@@ -11565,7 +12041,7 @@ type-fest@^0.8.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-type-is@~1.6.17, type-is@~1.6.18:
+type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
@@ -11652,6 +12128,19 @@ unicode-property-aliases-ecmascript@^1.0.4:
resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0"
integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==
+unified@^10.0.0, unified@^10.1.2:
+ version "10.1.2"
+ resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df"
+ integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ bail "^2.0.0"
+ extend "^3.0.0"
+ is-buffer "^2.0.0"
+ is-plain-obj "^4.0.0"
+ trough "^2.0.0"
+ vfile "^5.0.0"
+
union-value@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
@@ -11683,6 +12172,71 @@ unique-string@^2.0.0:
dependencies:
crypto-random-string "^2.0.0"
+unist-builder@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.0.tgz#728baca4767c0e784e1e64bb44b5a5a753021a04"
+ integrity sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==
+ dependencies:
+ "@types/unist" "^2.0.0"
+
+unist-util-generated@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.0.tgz#86fafb77eb6ce9bfa6b663c3f5ad4f8e56a60113"
+ integrity sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==
+
+unist-util-is@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236"
+ integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==
+
+unist-util-position@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.3.tgz#5290547b014f6222dff95c48d5c3c13a88fadd07"
+ integrity sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==
+ dependencies:
+ "@types/unist" "^2.0.0"
+
+unist-util-stringify-position@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz#5c6aa07c90b1deffd9153be170dce628a869a447"
+ integrity sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==
+ dependencies:
+ "@types/unist" "^2.0.0"
+
+unist-util-visit-parents@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz#e83559a4ad7e6048a46b1bdb22614f2f3f4724f2"
+ integrity sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^5.0.0"
+
+unist-util-visit-parents@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521"
+ integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^5.0.0"
+
+unist-util-visit@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b"
+ integrity sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^5.0.0"
+ unist-util-visit-parents "^4.0.0"
+
+unist-util-visit@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5"
+ integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^5.0.0"
+ unist-util-visit-parents "^5.0.0"
+
unixify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090"
@@ -11820,6 +12374,16 @@ uuid@^8.3.0:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31"
integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==
+uvu@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.3.tgz#3d83c5bc1230f153451877bfc7f4aea2392219ae"
+ integrity sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==
+ dependencies:
+ dequal "^2.0.0"
+ diff "^5.0.0"
+ kleur "^4.0.3"
+ sade "^1.7.3"
+
v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
@@ -11866,6 +12430,32 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
+vfile-location@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.0.1.tgz#06f2b9244a3565bef91f099359486a08b10d3a95"
+ integrity sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ vfile "^5.0.0"
+
+vfile-message@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.2.tgz#a2908f64d9e557315ec9d7ea3a910f658ac05f7d"
+ integrity sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-stringify-position "^3.0.0"
+
+vfile@^5.0.0:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.2.tgz#b499fbc50197ea50ad3749e9b60beb16ca5b7c54"
+ integrity sha512-w0PLIugRY3Crkgw89TeMvHCzqCs/zpreR31hl4D92y6SOE07+bfJe+dK5Q2akwS+i/c801kzjoOr9gMcTe6IAA==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ is-buffer "^2.0.0"
+ unist-util-stringify-position "^3.0.0"
+ vfile-message "^3.0.0"
+
visibilityjs@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/visibilityjs/-/visibilityjs-1.2.4.tgz#bff8663da62c8c10ad4ee5ae6a1ae6fac4259d63"
@@ -12117,6 +12707,11 @@ wbuf@^1.1.0, wbuf@^1.7.3:
dependencies:
minimalistic-assert "^1.0.0"
+web-namespaces@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692"
+ integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==
+
web-vitals@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511"
@@ -12137,15 +12732,15 @@ webidl-conversions@^6.1.0:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
-webpack-bundle-analyzer@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz#39898cf6200178240910d629705f0f3493f7d666"
- integrity sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==
+webpack-bundle-analyzer@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5"
+ integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==
dependencies:
acorn "^8.0.4"
acorn-walk "^8.0.0"
chalk "^4.1.0"
- commander "^6.2.0"
+ commander "^7.2.0"
gzip-size "^6.0.0"
lodash "^4.17.20"
opener "^1.5.2"
@@ -12181,39 +12776,38 @@ webpack-dev-middleware@^5.3.1:
range-parser "^1.2.1"
schema-utils "^4.0.0"
-webpack-dev-server@4.7.4:
- version "4.7.4"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz#d0ef7da78224578384e795ac228d8efb63d5f945"
- integrity sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==
+webpack-dev-server@4.8.1:
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz#58f9d797710d6e25fa17d6afab8708f958c11a29"
+ integrity sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==
dependencies:
"@types/bonjour" "^3.5.9"
"@types/connect-history-api-fallback" "^1.3.5"
"@types/express" "^4.17.13"
"@types/serve-index" "^1.9.1"
"@types/sockjs" "^0.3.33"
- "@types/ws" "^8.2.2"
+ "@types/ws" "^8.5.1"
ansi-html-community "^0.0.8"
- bonjour "^3.5.0"
+ bonjour-service "^1.0.11"
chokidar "^3.5.3"
colorette "^2.0.10"
compression "^1.7.4"
connect-history-api-fallback "^1.6.0"
default-gateway "^6.0.3"
- del "^6.0.0"
- express "^4.17.1"
+ express "^4.17.3"
graceful-fs "^4.2.6"
html-entities "^2.3.2"
- http-proxy-middleware "^2.0.0"
+ http-proxy-middleware "^2.0.3"
ipaddr.js "^2.0.1"
open "^8.0.9"
p-retry "^4.5.0"
portfinder "^1.0.28"
+ rimraf "^3.0.2"
schema-utils "^4.0.0"
- selfsigned "^2.0.0"
+ selfsigned "^2.0.1"
serve-index "^1.9.1"
sockjs "^0.3.21"
spdy "^4.0.2"
- strip-ansi "^7.0.0"
webpack-dev-middleware "^5.3.1"
ws "^8.4.2"
@@ -12555,13 +13149,13 @@ yarn-check-webpack-plugin@^1.2.0:
dependencies:
chalk "^2.4.2"
-yarn-deduplicate@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-3.1.0.tgz#3018d93e95f855f236a215b591fe8bc4bcabba3e"
- integrity sha512-q2VZ6ThNzQpGfNpkPrkmV7x5HT9MOhCUsTxVTzyyZB0eSXz1NTodHn+r29DlLb+peKk8iXxzdUVhQG9pI7moFw==
+yarn-deduplicate@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-4.0.0.tgz#0fcd11a83c2629ee41bc38a97d78fbd810c5825f"
+ integrity sha512-1sI617aM8WNplWA7O58peEq3gC14Ah/Ld55CF1aB2v4pTaxDpOgb+mTaWhIKzOCqJjwnaSqmYVrfgABUlc9bNA==
dependencies:
"@yarnpkg/lockfile" "^1.1.0"
- commander "^6.1.0"
+ commander "^9.0.0"
semver "^7.3.2"
yn@3.1.1:
@@ -12574,7 +13168,14 @@ yocto-queue@^0.1.0:
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
-zen-observable@^0.8.14:
+zen-observable-ts@^1.2.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.3.tgz#c2f5ccebe812faf0cfcde547e6004f65b1a6d769"
+ integrity sha512-hc/TGiPkAWpByykMwDcem3SdUgA4We+0Qb36bItSuJC9xD0XVBZoFHYoadAomDSNf64CG8Ydj0Qb8Od8BUWz5g==
+ dependencies:
+ zen-observable "0.8.15"
+
+zen-observable@0.8.15:
version "0.8.15"
resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
@@ -12585,3 +13186,8 @@ zrender@5.2.1:
integrity sha512-M3bPGZuyLTNBC6LiNKXJwSCtglMp8XUEqEBG+2MdICDI3d1s500Y4P0CzldQGsqpRVB7fkvf3BKQQRxsEaTlsw==
dependencies:
tslib "2.3.0"
+
+zwitch@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.2.tgz#91f8d0e901ffa3d66599756dde7f57b17c95dce1"
+ integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==